[RFC PATCH 28/28] drm/gpusvm: Ensure all pages migrated upon eviction
Matthew Brost
matthew.brost at intel.com
Wed Aug 28 02:49:01 UTC 2024
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.brost at 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
More information about the dri-devel
mailing list