Let's make sure we know what we are doing and check to ensure all pages
are migrated upon eviction.

Signed-off-by: Matthew Brost <matthew.br...@intel.com>
---
 drivers/gpu/drm/xe/drm_gpusvm.c | 39 +++++++++++++++++++++++++++++++++
 1 file changed, 39 insertions(+)

diff --git a/drivers/gpu/drm/xe/drm_gpusvm.c b/drivers/gpu/drm/xe/drm_gpusvm.c
index fc1e44e6ae72..6df3580cf4ca 100644
--- a/drivers/gpu/drm/xe/drm_gpusvm.c
+++ b/drivers/gpu/drm/xe/drm_gpusvm.c
@@ -1830,6 +1830,40 @@ static int drm_gpusvm_migrate_populate_sram_pfn(struct 
vm_area_struct *vas,
        return 0;
 }
 
+#define DRM_GPUSVM_DEBUG       /* TODO: Connect to Kconfig */
+
+#ifdef DRM_GPUSVM_DEBUG
+/**
+ * drm_gpusvm_pages_migrated - count the number of pages migrated
+ * @src_pfns: source migration pfns
+ * @npages the total number of pages in src_pfns
+ *
+ * Examine the MIGRATE_PFN_MIGRATE bit of each sfn_pfn to get a count of the
+ * number of pages migrated.
+ *
+ * Returns:
+ * Number of pages migrated
+ */
+static unsigned long
+drm_gpusvm_pages_migrated(unsigned long *src_pfns, unsigned long npages)
+{
+       int pages_migrated = 0;
+       unsigned long i;
+
+       for (i = 0; i < npages; ++i)
+               if (src_pfns[i] && src_pfns[i] & MIGRATE_PFN_MIGRATE)
+                       ++pages_migrated;
+
+       return pages_migrated;
+}
+#else
+static unsigned long
+drm_gpusvm_pages_migrated(unsigned long *src_pfns, unsigned long npages)
+{
+       return npages;
+}
+#endif
+
 /**
  * drm_gpusvm_evict_to_sram - Evict GPU SVM range to SRAM
  * @gpusvm: Pointer to the GPU SVM structure
@@ -1896,6 +1930,8 @@ static int drm_gpusvm_evict_to_sram(struct drm_gpusvm 
*gpusvm,
        if (err)
                drm_gpusvm_migration_put_pages(npages, dst);
        migrate_device_pages(src, dst, npages);
+       if (!err)
+               WARN_ON(npages > drm_gpusvm_pages_migrated(src, npages));
        migrate_device_finalize(src, dst, npages);
        drm_gpusvm_migrate_unmap_pages(gpusvm->drm->dev, dma_addr, npages,
                                       DMA_BIDIRECTIONAL);
@@ -1994,6 +2030,9 @@ static int __drm_gpusvm_migrate_to_sram(struct drm_gpusvm 
*gpusvm,
        if (err)
                drm_gpusvm_migration_put_pages(npages, migrate.dst);
        migrate_vma_pages(&migrate);
+       if (!err && !page)      /* Only check on eviction */
+               WARN_ON(migrate.cpages >
+                       drm_gpusvm_pages_migrated(migrate.src, npages));
        migrate_vma_finalize(&migrate);
        drm_gpusvm_migrate_unmap_pages(gpusvm->drm->dev, dma_addr, npages,
                                       DMA_BIDIRECTIONAL);
-- 
2.34.1

Reply via email to