[PATCH] i915/selftest/igt_mmap: let mmap tests run in kthread
Mikolaj Wasiak
mikolaj.wasiak at intel.com
Tue Feb 25 10:41:56 UTC 2025
When driver is loaded on system with numa nodes it might be run in kthread.
This makes it impossible to use current->mm in selftests which currently
creates null pointer exception.
This patch allows selftest to use current->mm by using active_mm.
Signed-off-by: Mikolaj Wasiak <mikolaj.wasiak at intel.com>
---
This patch is mostly damage control. By using active_mm we expose our
test to foreign memory mapping, which sometimes makes the test fail.
That is still better than just having null pointer exception in driver
code.
.../drm/i915/gem/selftests/i915_gem_mman.c | 61 ++++++++++++++-----
drivers/gpu/drm/i915/selftests/igt_mmap.c | 19 ++++++
drivers/gpu/drm/i915/selftests/igt_mmap.h | 3 +
3 files changed, 67 insertions(+), 16 deletions(-)
diff --git a/drivers/gpu/drm/i915/gem/selftests/i915_gem_mman.c b/drivers/gpu/drm/i915/gem/selftests/i915_gem_mman.c
index 804f74084bd4..34d22a99da65 100644
--- a/drivers/gpu/drm/i915/gem/selftests/i915_gem_mman.c
+++ b/drivers/gpu/drm/i915/gem/selftests/i915_gem_mman.c
@@ -974,6 +974,11 @@ static int igt_mmap(void *arg)
struct drm_i915_private *i915 = arg;
struct intel_memory_region *mr;
enum intel_region_id id;
+ int err;
+
+ err = igt_mmap_enable_current();
+ if (err)
+ return err;
for_each_memory_region(mr, i915, id) {
unsigned long sizes[] = {
@@ -988,7 +993,6 @@ static int igt_mmap(void *arg)
for (i = 0; i < ARRAY_SIZE(sizes); i++) {
struct drm_i915_gem_object *obj;
- int err;
obj = __i915_gem_object_create_user(i915, sizes[i], &mr, 1);
if (obj == ERR_PTR(-ENODEV))
@@ -1005,11 +1009,13 @@ static int igt_mmap(void *arg)
i915_gem_object_put(obj);
if (err)
- return err;
+ goto out_disable_current;
}
}
- return 0;
+out_disable_current:
+ igt_mmap_disable_current();
+ return err;
}
static void igt_close_objects(struct drm_i915_private *i915,
@@ -1310,13 +1316,17 @@ static int igt_mmap_migrate(void *arg)
struct intel_memory_region *system = i915->mm.regions[INTEL_REGION_SMEM];
struct intel_memory_region *mr;
enum intel_region_id id;
+ int err;
+
+ err = igt_mmap_enable_current();
+ if (err)
+ return err;
for_each_memory_region(mr, i915, id) {
struct intel_memory_region *mixed[] = { mr, system };
struct intel_memory_region *single[] = { mr };
struct ttm_resource_manager *man = mr->region_private;
struct resource saved_io;
- int err;
if (mr->private)
continue;
@@ -1400,10 +1410,12 @@ static int igt_mmap_migrate(void *arg)
i915_ttm_buddy_man_force_visible_size(man,
resource_size(&mr->io) >> PAGE_SHIFT);
if (err)
- return err;
+ goto out_disable_current;
}
- return 0;
+out_disable_current:
+ igt_mmap_disable_current();
+ return err;
}
static const char *repr_mmap_type(enum i915_mmap_type type)
@@ -1506,10 +1518,14 @@ static int igt_mmap_access(void *arg)
struct drm_i915_private *i915 = arg;
struct intel_memory_region *mr;
enum intel_region_id id;
+ int err;
+
+ err = igt_mmap_enable_current();
+ if (err)
+ return err;
for_each_memory_region(mr, i915, id) {
struct drm_i915_gem_object *obj;
- int err;
if (mr->private)
continue;
@@ -1533,10 +1549,12 @@ static int igt_mmap_access(void *arg)
i915_gem_object_put(obj);
if (err)
- return err;
+ goto out_disable_current;
}
- return 0;
+out_disable_current:
+ igt_mmap_disable_current();
+ return err;
}
static int __igt_mmap_gpu(struct drm_i915_private *i915,
@@ -1652,10 +1670,14 @@ static int igt_mmap_gpu(void *arg)
struct drm_i915_private *i915 = arg;
struct intel_memory_region *mr;
enum intel_region_id id;
+ int err;
+
+ err = igt_mmap_enable_current();
+ if (err)
+ return err;
for_each_memory_region(mr, i915, id) {
struct drm_i915_gem_object *obj;
- int err;
if (mr->private)
continue;
@@ -1675,10 +1697,12 @@ static int igt_mmap_gpu(void *arg)
i915_gem_object_put(obj);
if (err)
- return err;
+ goto out_disable_current;
}
- return 0;
+out_disable_current:
+ igt_mmap_disable_current();
+ return err;
}
static int check_present_pte(pte_t *pte, unsigned long addr, void *data)
@@ -1806,10 +1830,14 @@ static int igt_mmap_revoke(void *arg)
struct drm_i915_private *i915 = arg;
struct intel_memory_region *mr;
enum intel_region_id id;
+ int err;
+
+ err = igt_mmap_enable_current();
+ if (err)
+ return err;
for_each_memory_region(mr, i915, id) {
struct drm_i915_gem_object *obj;
- int err;
if (mr->private)
continue;
@@ -1829,10 +1857,12 @@ static int igt_mmap_revoke(void *arg)
i915_gem_object_put(obj);
if (err)
- return err;
+ goto out_disable_current;
}
- return 0;
+out_disable_current:
+ igt_mmap_disable_current();
+ return err;
}
int i915_gem_mman_live_selftests(struct drm_i915_private *i915)
@@ -1847,6 +1877,5 @@ int i915_gem_mman_live_selftests(struct drm_i915_private *i915)
SUBTEST(igt_mmap_revoke),
SUBTEST(igt_mmap_gpu),
};
-
return i915_live_subtests(tests, i915);
}
diff --git a/drivers/gpu/drm/i915/selftests/igt_mmap.c b/drivers/gpu/drm/i915/selftests/igt_mmap.c
index e920a461bd36..5c63622879a2 100644
--- a/drivers/gpu/drm/i915/selftests/igt_mmap.c
+++ b/drivers/gpu/drm/i915/selftests/igt_mmap.c
@@ -50,3 +50,22 @@ unsigned long igt_mmap_offset(struct drm_i915_private *i915,
fput(file);
return addr;
}
+
+
+int igt_mmap_enable_current(void)
+{
+ if (current->flags & PF_KTHREAD) {
+ if (!current->active_mm) {
+ pr_info("Couldn't get userspace mm in kthread\n");
+ return -ENODATA;
+ }
+ kthread_use_mm(current->active_mm);
+ }
+ return 0;
+}
+
+void igt_mmap_disable_current(void)
+{
+ if (current->flags & PF_KTHREAD)
+ kthread_unuse_mm(current->active_mm);
+}
diff --git a/drivers/gpu/drm/i915/selftests/igt_mmap.h b/drivers/gpu/drm/i915/selftests/igt_mmap.h
index acbe34d81a6d..58582396bdd7 100644
--- a/drivers/gpu/drm/i915/selftests/igt_mmap.h
+++ b/drivers/gpu/drm/i915/selftests/igt_mmap.h
@@ -18,4 +18,7 @@ unsigned long igt_mmap_offset(struct drm_i915_private *i915,
unsigned long prot,
unsigned long flags);
+int igt_mmap_enable_current(void);
+void igt_mmap_disable_current(void);
+
#endif /* IGT_MMAP_H */
--
2.48.1
More information about the Intel-gfx
mailing list