* [PATCH 0/5] drm/tests: Fix tests for GEM SHMEM
@ 2025-12-12 16:00 Thomas Zimmermann
2025-12-12 16:00 ` [PATCH 1/5] drm/tests: shmem: Swap names of export tests Thomas Zimmermann
` (4 more replies)
0 siblings, 5 replies; 11+ messages in thread
From: Thomas Zimmermann @ 2025-12-12 16:00 UTC (permalink / raw)
To: boris.brezillon, dmitry.osipenko, maarten.lankhorst, mripard,
airlied, simona
Cc: dri-devel, Thomas Zimmermann
As a result some refactoring of the GEM SHMEM code, most of the
tests for GEM SHMEM currently fail. Fix all of that.
Also fix the names of some of the test functions to match what
they test.
Thomas Zimmermann (5):
drm/tests: shmem: Swap names of export tests
drm/tests: shmem: Add clean-up action to unpin pages
drm/tests: shmem: Hold reservation lock around vmap/vunmap
drm/tests: shmem: Hold reservation lock around madvise
drm/tests: shmem: Hold reservation lock around purge
drivers/gpu/drm/drm_gem_shmem_helper.c | 63 ++++++++++++++++++++++
drivers/gpu/drm/tests/drm_gem_shmem_test.c | 30 +++++++----
include/drm/drm_gem_shmem_helper.h | 11 ++++
3 files changed, 94 insertions(+), 10 deletions(-)
--
2.52.0
^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH 1/5] drm/tests: shmem: Swap names of export tests
2025-12-12 16:00 [PATCH 0/5] drm/tests: Fix tests for GEM SHMEM Thomas Zimmermann
@ 2025-12-12 16:00 ` Thomas Zimmermann
2025-12-19 13:03 ` Boris Brezillon
2025-12-12 16:00 ` [PATCH 2/5] drm/tests: shmem: Add clean-up action to unpin pages Thomas Zimmermann
` (3 subsequent siblings)
4 siblings, 1 reply; 11+ messages in thread
From: Thomas Zimmermann @ 2025-12-12 16:00 UTC (permalink / raw)
To: boris.brezillon, dmitry.osipenko, maarten.lankhorst, mripard,
airlied, simona
Cc: dri-devel, Thomas Zimmermann, stable
GEM SHMEM has 2 helpers for exporting S/G tables. Swap the names of
the rsp. tests, so that each matches the helper it tests.
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Fixes: 93032ae634d4 ("drm/test: add a test suite for GEM objects backed by shmem")
Cc: dri-devel@lists.freedesktop.org
Cc: <stable@vger.kernel.org> # v6.8+
---
drivers/gpu/drm/tests/drm_gem_shmem_test.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/drivers/gpu/drm/tests/drm_gem_shmem_test.c b/drivers/gpu/drm/tests/drm_gem_shmem_test.c
index 68f2c3162354..872881ec9c30 100644
--- a/drivers/gpu/drm/tests/drm_gem_shmem_test.c
+++ b/drivers/gpu/drm/tests/drm_gem_shmem_test.c
@@ -194,7 +194,7 @@ static void drm_gem_shmem_test_vmap(struct kunit *test)
* scatter/gather table large enough to accommodate the backing memory
* is successfully exported.
*/
-static void drm_gem_shmem_test_get_pages_sgt(struct kunit *test)
+static void drm_gem_shmem_test_get_sg_table(struct kunit *test)
{
struct drm_device *drm_dev = test->priv;
struct drm_gem_shmem_object *shmem;
@@ -236,7 +236,7 @@ static void drm_gem_shmem_test_get_pages_sgt(struct kunit *test)
* backing pages are pinned and a scatter/gather table large enough to
* accommodate the backing memory is successfully exported.
*/
-static void drm_gem_shmem_test_get_sg_table(struct kunit *test)
+static void drm_gem_shmem_test_get_pages_sgt(struct kunit *test)
{
struct drm_device *drm_dev = test->priv;
struct drm_gem_shmem_object *shmem;
@@ -366,8 +366,8 @@ static struct kunit_case drm_gem_shmem_test_cases[] = {
KUNIT_CASE(drm_gem_shmem_test_obj_create_private),
KUNIT_CASE(drm_gem_shmem_test_pin_pages),
KUNIT_CASE(drm_gem_shmem_test_vmap),
- KUNIT_CASE(drm_gem_shmem_test_get_pages_sgt),
KUNIT_CASE(drm_gem_shmem_test_get_sg_table),
+ KUNIT_CASE(drm_gem_shmem_test_get_pages_sgt),
KUNIT_CASE(drm_gem_shmem_test_madvise),
KUNIT_CASE(drm_gem_shmem_test_purge),
{}
--
2.52.0
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 2/5] drm/tests: shmem: Add clean-up action to unpin pages
2025-12-12 16:00 [PATCH 0/5] drm/tests: Fix tests for GEM SHMEM Thomas Zimmermann
2025-12-12 16:00 ` [PATCH 1/5] drm/tests: shmem: Swap names of export tests Thomas Zimmermann
@ 2025-12-12 16:00 ` Thomas Zimmermann
2025-12-19 13:04 ` Boris Brezillon
2025-12-12 16:00 ` [PATCH 3/5] drm/tests: shmem: Hold reservation lock around vmap/vunmap Thomas Zimmermann
` (2 subsequent siblings)
4 siblings, 1 reply; 11+ messages in thread
From: Thomas Zimmermann @ 2025-12-12 16:00 UTC (permalink / raw)
To: boris.brezillon, dmitry.osipenko, maarten.lankhorst, mripard,
airlied, simona
Cc: dri-devel, Thomas Zimmermann, stable
Automatically unpin pages on cleanup. The test currently fails with
the error
[ 58.246263] drm-kunit-mock-device drm_gem_shmem_test_get_sg_table.drm-kunit-mock-device: [drm] drm_WARN_ON(refcount_read(&shmem->pages_pin_count))
while cleaning up the GEM object. The pin count has to be zero at this
point.
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Fixes: d586b535f144 ("drm/shmem-helper: Add and use pages_pin_count")
Cc: dri-devel@lists.freedesktop.org
Cc: <stable@vger.kernel.org> # v6.16+
---
drivers/gpu/drm/tests/drm_gem_shmem_test.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/drivers/gpu/drm/tests/drm_gem_shmem_test.c b/drivers/gpu/drm/tests/drm_gem_shmem_test.c
index 872881ec9c30..1d50bab51ef3 100644
--- a/drivers/gpu/drm/tests/drm_gem_shmem_test.c
+++ b/drivers/gpu/drm/tests/drm_gem_shmem_test.c
@@ -34,6 +34,9 @@ KUNIT_DEFINE_ACTION_WRAPPER(sg_free_table_wrapper, sg_free_table,
KUNIT_DEFINE_ACTION_WRAPPER(drm_gem_shmem_free_wrapper, drm_gem_shmem_free,
struct drm_gem_shmem_object *);
+KUNIT_DEFINE_ACTION_WRAPPER(drm_gem_shmem_unpin_wrapper, drm_gem_shmem_unpin,
+ struct drm_gem_shmem_object *);
+
/*
* Test creating a shmem GEM object backed by shmem buffer. The test
* case succeeds if the GEM object is successfully allocated with the
@@ -212,6 +215,9 @@ static void drm_gem_shmem_test_get_sg_table(struct kunit *test)
ret = drm_gem_shmem_pin(shmem);
KUNIT_ASSERT_EQ(test, ret, 0);
+ ret = kunit_add_action_or_reset(test, drm_gem_shmem_unpin_wrapper, shmem);
+ KUNIT_ASSERT_EQ(test, ret, 0);
+
sgt = drm_gem_shmem_get_sg_table(shmem);
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, sgt);
KUNIT_EXPECT_NULL(test, shmem->sgt);
--
2.52.0
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 3/5] drm/tests: shmem: Hold reservation lock around vmap/vunmap
2025-12-12 16:00 [PATCH 0/5] drm/tests: Fix tests for GEM SHMEM Thomas Zimmermann
2025-12-12 16:00 ` [PATCH 1/5] drm/tests: shmem: Swap names of export tests Thomas Zimmermann
2025-12-12 16:00 ` [PATCH 2/5] drm/tests: shmem: Add clean-up action to unpin pages Thomas Zimmermann
@ 2025-12-12 16:00 ` Thomas Zimmermann
2025-12-19 13:05 ` Boris Brezillon
2025-12-12 16:00 ` [PATCH 4/5] drm/tests: shmem: Hold reservation lock around madvise Thomas Zimmermann
2025-12-12 16:00 ` [PATCH 5/5] drm/tests: shmem: Hold reservation lock around purge Thomas Zimmermann
4 siblings, 1 reply; 11+ messages in thread
From: Thomas Zimmermann @ 2025-12-12 16:00 UTC (permalink / raw)
To: boris.brezillon, dmitry.osipenko, maarten.lankhorst, mripard,
airlied, simona
Cc: dri-devel, Thomas Zimmermann, stable
Acquire and release the GEM object's reservation lock around vmap and
vunmap operations. The tests use vmap_locked, which led to errors such
as show below.
[ 122.292030] WARNING: CPU: 3 PID: 1413 at drivers/gpu/drm/drm_gem_shmem_helper.c:390 drm_gem_shmem_vmap_locked+0x3a3/0x6f0
[ 122.468066] WARNING: CPU: 3 PID: 1413 at drivers/gpu/drm/drm_gem_shmem_helper.c:293 drm_gem_shmem_pin_locked+0x1fe/0x350
[ 122.563504] WARNING: CPU: 3 PID: 1413 at drivers/gpu/drm/drm_gem_shmem_helper.c:234 drm_gem_shmem_get_pages_locked+0x23c/0x370
[ 122.662248] WARNING: CPU: 2 PID: 1413 at drivers/gpu/drm/drm_gem_shmem_helper.c:452 drm_gem_shmem_vunmap_locked+0x101/0x330
Only export the new vmap/vunmap helpers for Kunit tests. These are
not interfaces for regular drivers.
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Fixes: 954907f7147d ("drm/shmem-helper: Refactor locked/unlocked functions")
Cc: dri-devel@lists.freedesktop.org
Cc: <stable@vger.kernel.org> # v6.16+
---
drivers/gpu/drm/drm_gem_shmem_helper.c | 33 ++++++++++++++++++++++
drivers/gpu/drm/tests/drm_gem_shmem_test.c | 6 ++--
include/drm/drm_gem_shmem_helper.h | 9 ++++++
3 files changed, 46 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/drm_gem_shmem_helper.c b/drivers/gpu/drm/drm_gem_shmem_helper.c
index dc94a27710e5..06ef4e5adb7d 100644
--- a/drivers/gpu/drm/drm_gem_shmem_helper.c
+++ b/drivers/gpu/drm/drm_gem_shmem_helper.c
@@ -15,6 +15,8 @@
#include <asm/set_memory.h>
#endif
+#include <kunit/visibility.h>
+
#include <drm/drm.h>
#include <drm/drm_device.h>
#include <drm/drm_drv.h>
@@ -893,6 +895,37 @@ struct drm_gem_object *drm_gem_shmem_prime_import_no_map(struct drm_device *dev,
}
EXPORT_SYMBOL_GPL(drm_gem_shmem_prime_import_no_map);
+/*
+ * Kunit helpers
+ */
+
+#if IS_ENABLED(CONFIG_KUNIT)
+int drm_gem_shmem_vmap(struct drm_gem_shmem_object *shmem, struct iosys_map *map)
+{
+ struct drm_gem_object *obj = &shmem->base;
+ int ret;
+
+ ret = dma_resv_lock_interruptible(obj->resv, NULL);
+ if (ret)
+ return ret;
+ ret = drm_gem_shmem_vmap_locked(shmem, map);
+ dma_resv_unlock(obj->resv);
+
+ return ret;
+}
+EXPORT_SYMBOL_IF_KUNIT(drm_gem_shmem_vmap);
+
+void drm_gem_shmem_vunmap(struct drm_gem_shmem_object *shmem, struct iosys_map *map)
+{
+ struct drm_gem_object *obj = &shmem->base;
+
+ dma_resv_lock_interruptible(obj->resv, NULL);
+ drm_gem_shmem_vunmap_locked(shmem, map);
+ dma_resv_unlock(obj->resv);
+}
+EXPORT_SYMBOL_IF_KUNIT(drm_gem_shmem_vunmap);
+#endif
+
MODULE_DESCRIPTION("DRM SHMEM memory-management helpers");
MODULE_IMPORT_NS("DMA_BUF");
MODULE_LICENSE("GPL v2");
diff --git a/drivers/gpu/drm/tests/drm_gem_shmem_test.c b/drivers/gpu/drm/tests/drm_gem_shmem_test.c
index 1d50bab51ef3..3e7c6f20fbcc 100644
--- a/drivers/gpu/drm/tests/drm_gem_shmem_test.c
+++ b/drivers/gpu/drm/tests/drm_gem_shmem_test.c
@@ -19,6 +19,8 @@
#include <drm/drm_gem_shmem_helper.h>
#include <drm/drm_kunit_helpers.h>
+MODULE_IMPORT_NS("EXPORTED_FOR_KUNIT_TESTING");
+
#define TEST_SIZE SZ_1M
#define TEST_BYTE 0xae
@@ -176,7 +178,7 @@ static void drm_gem_shmem_test_vmap(struct kunit *test)
ret = kunit_add_action_or_reset(test, drm_gem_shmem_free_wrapper, shmem);
KUNIT_ASSERT_EQ(test, ret, 0);
- ret = drm_gem_shmem_vmap_locked(shmem, &map);
+ ret = drm_gem_shmem_vmap(shmem, &map);
KUNIT_ASSERT_EQ(test, ret, 0);
KUNIT_ASSERT_NOT_NULL(test, shmem->vaddr);
KUNIT_ASSERT_FALSE(test, iosys_map_is_null(&map));
@@ -186,7 +188,7 @@ static void drm_gem_shmem_test_vmap(struct kunit *test)
for (i = 0; i < TEST_SIZE; i++)
KUNIT_EXPECT_EQ(test, iosys_map_rd(&map, i, u8), TEST_BYTE);
- drm_gem_shmem_vunmap_locked(shmem, &map);
+ drm_gem_shmem_vunmap(shmem, &map);
KUNIT_EXPECT_NULL(test, shmem->vaddr);
KUNIT_EXPECT_EQ(test, refcount_read(&shmem->vmap_use_count), 0);
}
diff --git a/include/drm/drm_gem_shmem_helper.h b/include/drm/drm_gem_shmem_helper.h
index 589f7bfe7506..6924ee226655 100644
--- a/include/drm/drm_gem_shmem_helper.h
+++ b/include/drm/drm_gem_shmem_helper.h
@@ -303,4 +303,13 @@ struct drm_gem_object *drm_gem_shmem_prime_import_no_map(struct drm_device *dev,
.gem_prime_import = drm_gem_shmem_prime_import_no_map, \
.dumb_create = drm_gem_shmem_dumb_create
+/*
+ * Kunit helpers
+ */
+
+#if IS_ENABLED(CONFIG_KUNIT)
+int drm_gem_shmem_vmap(struct drm_gem_shmem_object *shmem, struct iosys_map *map);
+void drm_gem_shmem_vunmap(struct drm_gem_shmem_object *shmem, struct iosys_map *map);
+#endif
+
#endif /* __DRM_GEM_SHMEM_HELPER_H__ */
--
2.52.0
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 4/5] drm/tests: shmem: Hold reservation lock around madvise
2025-12-12 16:00 [PATCH 0/5] drm/tests: Fix tests for GEM SHMEM Thomas Zimmermann
` (2 preceding siblings ...)
2025-12-12 16:00 ` [PATCH 3/5] drm/tests: shmem: Hold reservation lock around vmap/vunmap Thomas Zimmermann
@ 2025-12-12 16:00 ` Thomas Zimmermann
2025-12-19 13:06 ` Boris Brezillon
2025-12-12 16:00 ` [PATCH 5/5] drm/tests: shmem: Hold reservation lock around purge Thomas Zimmermann
4 siblings, 1 reply; 11+ messages in thread
From: Thomas Zimmermann @ 2025-12-12 16:00 UTC (permalink / raw)
To: boris.brezillon, dmitry.osipenko, maarten.lankhorst, mripard,
airlied, simona
Cc: dri-devel, Thomas Zimmermann, stable
Acquire and release the GEM object's reservation lock around calls
to the object's madvide operation. The tests use
drm_gem_shmem_madvise_locked(), which led to errors such as show below.
[ 58.339389] WARNING: CPU: 1 PID: 1352 at drivers/gpu/drm/drm_gem_shmem_helper.c:499 drm_gem_shmem_madvise_locked+0xde/0x140
Only export the new helper drm_gem_shmem_madvise() for Kunit tests.
This is not an interface for regular drivers.
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Fixes: 954907f7147d ("drm/shmem-helper: Refactor locked/unlocked functions")
Cc: dri-devel@lists.freedesktop.org
Cc: <stable@vger.kernel.org> # v6.16+
---
drivers/gpu/drm/drm_gem_shmem_helper.c | 15 +++++++++++++++
drivers/gpu/drm/tests/drm_gem_shmem_test.c | 8 ++++----
include/drm/drm_gem_shmem_helper.h | 1 +
3 files changed, 20 insertions(+), 4 deletions(-)
diff --git a/drivers/gpu/drm/drm_gem_shmem_helper.c b/drivers/gpu/drm/drm_gem_shmem_helper.c
index 06ef4e5adb7d..4ffcf6ed46f5 100644
--- a/drivers/gpu/drm/drm_gem_shmem_helper.c
+++ b/drivers/gpu/drm/drm_gem_shmem_helper.c
@@ -924,6 +924,21 @@ void drm_gem_shmem_vunmap(struct drm_gem_shmem_object *shmem, struct iosys_map *
dma_resv_unlock(obj->resv);
}
EXPORT_SYMBOL_IF_KUNIT(drm_gem_shmem_vunmap);
+
+int drm_gem_shmem_madvise(struct drm_gem_shmem_object *shmem, int madv)
+{
+ struct drm_gem_object *obj = &shmem->base;
+ int ret;
+
+ ret = dma_resv_lock_interruptible(obj->resv, NULL);
+ if (ret)
+ return ret;
+ ret = drm_gem_shmem_madvise_locked(shmem, madv);
+ dma_resv_unlock(obj->resv);
+
+ return ret;
+}
+EXPORT_SYMBOL_IF_KUNIT(drm_gem_shmem_madvise);
#endif
MODULE_DESCRIPTION("DRM SHMEM memory-management helpers");
diff --git a/drivers/gpu/drm/tests/drm_gem_shmem_test.c b/drivers/gpu/drm/tests/drm_gem_shmem_test.c
index 3e7c6f20fbcc..d639848e3c8e 100644
--- a/drivers/gpu/drm/tests/drm_gem_shmem_test.c
+++ b/drivers/gpu/drm/tests/drm_gem_shmem_test.c
@@ -292,17 +292,17 @@ static void drm_gem_shmem_test_madvise(struct kunit *test)
ret = kunit_add_action_or_reset(test, drm_gem_shmem_free_wrapper, shmem);
KUNIT_ASSERT_EQ(test, ret, 0);
- ret = drm_gem_shmem_madvise_locked(shmem, 1);
+ ret = drm_gem_shmem_madvise(shmem, 1);
KUNIT_EXPECT_TRUE(test, ret);
KUNIT_ASSERT_EQ(test, shmem->madv, 1);
/* Set madv to a negative value */
- ret = drm_gem_shmem_madvise_locked(shmem, -1);
+ ret = drm_gem_shmem_madvise(shmem, -1);
KUNIT_EXPECT_FALSE(test, ret);
KUNIT_ASSERT_EQ(test, shmem->madv, -1);
/* Check that madv cannot be set back to a positive value */
- ret = drm_gem_shmem_madvise_locked(shmem, 0);
+ ret = drm_gem_shmem_madvise(shmem, 0);
KUNIT_EXPECT_FALSE(test, ret);
KUNIT_ASSERT_EQ(test, shmem->madv, -1);
}
@@ -330,7 +330,7 @@ static void drm_gem_shmem_test_purge(struct kunit *test)
ret = drm_gem_shmem_is_purgeable(shmem);
KUNIT_EXPECT_FALSE(test, ret);
- ret = drm_gem_shmem_madvise_locked(shmem, 1);
+ ret = drm_gem_shmem_madvise(shmem, 1);
KUNIT_EXPECT_TRUE(test, ret);
/* The scatter/gather table will be freed by drm_gem_shmem_free */
diff --git a/include/drm/drm_gem_shmem_helper.h b/include/drm/drm_gem_shmem_helper.h
index 6924ee226655..3dd93e2df709 100644
--- a/include/drm/drm_gem_shmem_helper.h
+++ b/include/drm/drm_gem_shmem_helper.h
@@ -310,6 +310,7 @@ struct drm_gem_object *drm_gem_shmem_prime_import_no_map(struct drm_device *dev,
#if IS_ENABLED(CONFIG_KUNIT)
int drm_gem_shmem_vmap(struct drm_gem_shmem_object *shmem, struct iosys_map *map);
void drm_gem_shmem_vunmap(struct drm_gem_shmem_object *shmem, struct iosys_map *map);
+int drm_gem_shmem_madvise(struct drm_gem_shmem_object *shmem, int madv);
#endif
#endif /* __DRM_GEM_SHMEM_HELPER_H__ */
--
2.52.0
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 5/5] drm/tests: shmem: Hold reservation lock around purge
2025-12-12 16:00 [PATCH 0/5] drm/tests: Fix tests for GEM SHMEM Thomas Zimmermann
` (3 preceding siblings ...)
2025-12-12 16:00 ` [PATCH 4/5] drm/tests: shmem: Hold reservation lock around madvise Thomas Zimmermann
@ 2025-12-12 16:00 ` Thomas Zimmermann
2025-12-19 13:06 ` Boris Brezillon
4 siblings, 1 reply; 11+ messages in thread
From: Thomas Zimmermann @ 2025-12-12 16:00 UTC (permalink / raw)
To: boris.brezillon, dmitry.osipenko, maarten.lankhorst, mripard,
airlied, simona
Cc: dri-devel, Thomas Zimmermann, stable
Acquire and release the GEM object's reservation lock around calls
to the object's purge operation. The tests use
drm_gem_shmem_purge_locked(), which led to errors such as show below.
[ 58.709128] WARNING: CPU: 1 PID: 1354 at drivers/gpu/drm/drm_gem_shmem_helper.c:515 drm_gem_shmem_purge_locked+0x51c/0x740
Only export the new helper drm_gem_shmem_purge() for Kunit tests.
This is not an interface for regular drivers.
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Fixes: 954907f7147d ("drm/shmem-helper: Refactor locked/unlocked functions")
Cc: dri-devel@lists.freedesktop.org
Cc: <stable@vger.kernel.org> # v6.16+
---
drivers/gpu/drm/drm_gem_shmem_helper.c | 15 +++++++++++++++
drivers/gpu/drm/tests/drm_gem_shmem_test.c | 4 +++-
include/drm/drm_gem_shmem_helper.h | 1 +
3 files changed, 19 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/drm_gem_shmem_helper.c b/drivers/gpu/drm/drm_gem_shmem_helper.c
index 4ffcf6ed46f5..dfc24392cb61 100644
--- a/drivers/gpu/drm/drm_gem_shmem_helper.c
+++ b/drivers/gpu/drm/drm_gem_shmem_helper.c
@@ -939,6 +939,21 @@ int drm_gem_shmem_madvise(struct drm_gem_shmem_object *shmem, int madv)
return ret;
}
EXPORT_SYMBOL_IF_KUNIT(drm_gem_shmem_madvise);
+
+int drm_gem_shmem_purge(struct drm_gem_shmem_object *shmem)
+{
+ struct drm_gem_object *obj = &shmem->base;
+ int ret;
+
+ ret = dma_resv_lock_interruptible(obj->resv, NULL);
+ if (ret)
+ return ret;
+ drm_gem_shmem_purge_locked(shmem);
+ dma_resv_unlock(obj->resv);
+
+ return 0;
+}
+EXPORT_SYMBOL_IF_KUNIT(drm_gem_shmem_purge);
#endif
MODULE_DESCRIPTION("DRM SHMEM memory-management helpers");
diff --git a/drivers/gpu/drm/tests/drm_gem_shmem_test.c b/drivers/gpu/drm/tests/drm_gem_shmem_test.c
index d639848e3c8e..4b459f21acfd 100644
--- a/drivers/gpu/drm/tests/drm_gem_shmem_test.c
+++ b/drivers/gpu/drm/tests/drm_gem_shmem_test.c
@@ -340,7 +340,9 @@ static void drm_gem_shmem_test_purge(struct kunit *test)
ret = drm_gem_shmem_is_purgeable(shmem);
KUNIT_EXPECT_TRUE(test, ret);
- drm_gem_shmem_purge_locked(shmem);
+ ret = drm_gem_shmem_purge(shmem);
+ KUNIT_ASSERT_EQ(test, ret, 0);
+
KUNIT_EXPECT_NULL(test, shmem->pages);
KUNIT_EXPECT_NULL(test, shmem->sgt);
KUNIT_EXPECT_EQ(test, shmem->madv, -1);
diff --git a/include/drm/drm_gem_shmem_helper.h b/include/drm/drm_gem_shmem_helper.h
index 3dd93e2df709..8d56970d7eed 100644
--- a/include/drm/drm_gem_shmem_helper.h
+++ b/include/drm/drm_gem_shmem_helper.h
@@ -311,6 +311,7 @@ struct drm_gem_object *drm_gem_shmem_prime_import_no_map(struct drm_device *dev,
int drm_gem_shmem_vmap(struct drm_gem_shmem_object *shmem, struct iosys_map *map);
void drm_gem_shmem_vunmap(struct drm_gem_shmem_object *shmem, struct iosys_map *map);
int drm_gem_shmem_madvise(struct drm_gem_shmem_object *shmem, int madv);
+int drm_gem_shmem_purge(struct drm_gem_shmem_object *shmem);
#endif
#endif /* __DRM_GEM_SHMEM_HELPER_H__ */
--
2.52.0
^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH 1/5] drm/tests: shmem: Swap names of export tests
2025-12-12 16:00 ` [PATCH 1/5] drm/tests: shmem: Swap names of export tests Thomas Zimmermann
@ 2025-12-19 13:03 ` Boris Brezillon
0 siblings, 0 replies; 11+ messages in thread
From: Boris Brezillon @ 2025-12-19 13:03 UTC (permalink / raw)
To: Thomas Zimmermann
Cc: dmitry.osipenko, maarten.lankhorst, mripard, airlied, simona,
dri-devel, stable
On Fri, 12 Dec 2025 17:00:32 +0100
Thomas Zimmermann <tzimmermann@suse.de> wrote:
> GEM SHMEM has 2 helpers for exporting S/G tables. Swap the names of
> the rsp. tests, so that each matches the helper it tests.
>
> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
> Fixes: 93032ae634d4 ("drm/test: add a test suite for GEM objects backed by shmem")
> Cc: dri-devel@lists.freedesktop.org
> Cc: <stable@vger.kernel.org> # v6.8+
Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com>
> ---
> drivers/gpu/drm/tests/drm_gem_shmem_test.c | 6 +++---
> 1 file changed, 3 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/gpu/drm/tests/drm_gem_shmem_test.c b/drivers/gpu/drm/tests/drm_gem_shmem_test.c
> index 68f2c3162354..872881ec9c30 100644
> --- a/drivers/gpu/drm/tests/drm_gem_shmem_test.c
> +++ b/drivers/gpu/drm/tests/drm_gem_shmem_test.c
> @@ -194,7 +194,7 @@ static void drm_gem_shmem_test_vmap(struct kunit *test)
> * scatter/gather table large enough to accommodate the backing memory
> * is successfully exported.
> */
> -static void drm_gem_shmem_test_get_pages_sgt(struct kunit *test)
> +static void drm_gem_shmem_test_get_sg_table(struct kunit *test)
> {
> struct drm_device *drm_dev = test->priv;
> struct drm_gem_shmem_object *shmem;
> @@ -236,7 +236,7 @@ static void drm_gem_shmem_test_get_pages_sgt(struct kunit *test)
> * backing pages are pinned and a scatter/gather table large enough to
> * accommodate the backing memory is successfully exported.
> */
> -static void drm_gem_shmem_test_get_sg_table(struct kunit *test)
> +static void drm_gem_shmem_test_get_pages_sgt(struct kunit *test)
> {
> struct drm_device *drm_dev = test->priv;
> struct drm_gem_shmem_object *shmem;
> @@ -366,8 +366,8 @@ static struct kunit_case drm_gem_shmem_test_cases[] = {
> KUNIT_CASE(drm_gem_shmem_test_obj_create_private),
> KUNIT_CASE(drm_gem_shmem_test_pin_pages),
> KUNIT_CASE(drm_gem_shmem_test_vmap),
> - KUNIT_CASE(drm_gem_shmem_test_get_pages_sgt),
> KUNIT_CASE(drm_gem_shmem_test_get_sg_table),
> + KUNIT_CASE(drm_gem_shmem_test_get_pages_sgt),
> KUNIT_CASE(drm_gem_shmem_test_madvise),
> KUNIT_CASE(drm_gem_shmem_test_purge),
> {}
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 2/5] drm/tests: shmem: Add clean-up action to unpin pages
2025-12-12 16:00 ` [PATCH 2/5] drm/tests: shmem: Add clean-up action to unpin pages Thomas Zimmermann
@ 2025-12-19 13:04 ` Boris Brezillon
0 siblings, 0 replies; 11+ messages in thread
From: Boris Brezillon @ 2025-12-19 13:04 UTC (permalink / raw)
To: Thomas Zimmermann
Cc: dmitry.osipenko, maarten.lankhorst, mripard, airlied, simona,
dri-devel, stable
On Fri, 12 Dec 2025 17:00:33 +0100
Thomas Zimmermann <tzimmermann@suse.de> wrote:
> Automatically unpin pages on cleanup. The test currently fails with
> the error
>
> [ 58.246263] drm-kunit-mock-device drm_gem_shmem_test_get_sg_table.drm-kunit-mock-device: [drm] drm_WARN_ON(refcount_read(&shmem->pages_pin_count))
>
> while cleaning up the GEM object. The pin count has to be zero at this
> point.
>
> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
> Fixes: d586b535f144 ("drm/shmem-helper: Add and use pages_pin_count")
> Cc: dri-devel@lists.freedesktop.org
> Cc: <stable@vger.kernel.org> # v6.16+
Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com>
> ---
> drivers/gpu/drm/tests/drm_gem_shmem_test.c | 6 ++++++
> 1 file changed, 6 insertions(+)
>
> diff --git a/drivers/gpu/drm/tests/drm_gem_shmem_test.c b/drivers/gpu/drm/tests/drm_gem_shmem_test.c
> index 872881ec9c30..1d50bab51ef3 100644
> --- a/drivers/gpu/drm/tests/drm_gem_shmem_test.c
> +++ b/drivers/gpu/drm/tests/drm_gem_shmem_test.c
> @@ -34,6 +34,9 @@ KUNIT_DEFINE_ACTION_WRAPPER(sg_free_table_wrapper, sg_free_table,
> KUNIT_DEFINE_ACTION_WRAPPER(drm_gem_shmem_free_wrapper, drm_gem_shmem_free,
> struct drm_gem_shmem_object *);
>
> +KUNIT_DEFINE_ACTION_WRAPPER(drm_gem_shmem_unpin_wrapper, drm_gem_shmem_unpin,
> + struct drm_gem_shmem_object *);
> +
> /*
> * Test creating a shmem GEM object backed by shmem buffer. The test
> * case succeeds if the GEM object is successfully allocated with the
> @@ -212,6 +215,9 @@ static void drm_gem_shmem_test_get_sg_table(struct kunit *test)
> ret = drm_gem_shmem_pin(shmem);
> KUNIT_ASSERT_EQ(test, ret, 0);
>
> + ret = kunit_add_action_or_reset(test, drm_gem_shmem_unpin_wrapper, shmem);
> + KUNIT_ASSERT_EQ(test, ret, 0);
> +
> sgt = drm_gem_shmem_get_sg_table(shmem);
> KUNIT_ASSERT_NOT_ERR_OR_NULL(test, sgt);
> KUNIT_EXPECT_NULL(test, shmem->sgt);
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 3/5] drm/tests: shmem: Hold reservation lock around vmap/vunmap
2025-12-12 16:00 ` [PATCH 3/5] drm/tests: shmem: Hold reservation lock around vmap/vunmap Thomas Zimmermann
@ 2025-12-19 13:05 ` Boris Brezillon
0 siblings, 0 replies; 11+ messages in thread
From: Boris Brezillon @ 2025-12-19 13:05 UTC (permalink / raw)
To: Thomas Zimmermann
Cc: dmitry.osipenko, maarten.lankhorst, mripard, airlied, simona,
dri-devel, stable
On Fri, 12 Dec 2025 17:00:34 +0100
Thomas Zimmermann <tzimmermann@suse.de> wrote:
> Acquire and release the GEM object's reservation lock around vmap and
> vunmap operations. The tests use vmap_locked, which led to errors such
> as show below.
>
> [ 122.292030] WARNING: CPU: 3 PID: 1413 at drivers/gpu/drm/drm_gem_shmem_helper.c:390 drm_gem_shmem_vmap_locked+0x3a3/0x6f0
>
> [ 122.468066] WARNING: CPU: 3 PID: 1413 at drivers/gpu/drm/drm_gem_shmem_helper.c:293 drm_gem_shmem_pin_locked+0x1fe/0x350
>
> [ 122.563504] WARNING: CPU: 3 PID: 1413 at drivers/gpu/drm/drm_gem_shmem_helper.c:234 drm_gem_shmem_get_pages_locked+0x23c/0x370
>
> [ 122.662248] WARNING: CPU: 2 PID: 1413 at drivers/gpu/drm/drm_gem_shmem_helper.c:452 drm_gem_shmem_vunmap_locked+0x101/0x330
>
> Only export the new vmap/vunmap helpers for Kunit tests. These are
> not interfaces for regular drivers.
>
> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
> Fixes: 954907f7147d ("drm/shmem-helper: Refactor locked/unlocked functions")
> Cc: dri-devel@lists.freedesktop.org
> Cc: <stable@vger.kernel.org> # v6.16+
Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com>
> ---
> drivers/gpu/drm/drm_gem_shmem_helper.c | 33 ++++++++++++++++++++++
> drivers/gpu/drm/tests/drm_gem_shmem_test.c | 6 ++--
> include/drm/drm_gem_shmem_helper.h | 9 ++++++
> 3 files changed, 46 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_gem_shmem_helper.c b/drivers/gpu/drm/drm_gem_shmem_helper.c
> index dc94a27710e5..06ef4e5adb7d 100644
> --- a/drivers/gpu/drm/drm_gem_shmem_helper.c
> +++ b/drivers/gpu/drm/drm_gem_shmem_helper.c
> @@ -15,6 +15,8 @@
> #include <asm/set_memory.h>
> #endif
>
> +#include <kunit/visibility.h>
> +
> #include <drm/drm.h>
> #include <drm/drm_device.h>
> #include <drm/drm_drv.h>
> @@ -893,6 +895,37 @@ struct drm_gem_object *drm_gem_shmem_prime_import_no_map(struct drm_device *dev,
> }
> EXPORT_SYMBOL_GPL(drm_gem_shmem_prime_import_no_map);
>
> +/*
> + * Kunit helpers
> + */
> +
> +#if IS_ENABLED(CONFIG_KUNIT)
> +int drm_gem_shmem_vmap(struct drm_gem_shmem_object *shmem, struct iosys_map *map)
> +{
> + struct drm_gem_object *obj = &shmem->base;
> + int ret;
> +
> + ret = dma_resv_lock_interruptible(obj->resv, NULL);
> + if (ret)
> + return ret;
> + ret = drm_gem_shmem_vmap_locked(shmem, map);
> + dma_resv_unlock(obj->resv);
> +
> + return ret;
> +}
> +EXPORT_SYMBOL_IF_KUNIT(drm_gem_shmem_vmap);
> +
> +void drm_gem_shmem_vunmap(struct drm_gem_shmem_object *shmem, struct iosys_map *map)
> +{
> + struct drm_gem_object *obj = &shmem->base;
> +
> + dma_resv_lock_interruptible(obj->resv, NULL);
> + drm_gem_shmem_vunmap_locked(shmem, map);
> + dma_resv_unlock(obj->resv);
> +}
> +EXPORT_SYMBOL_IF_KUNIT(drm_gem_shmem_vunmap);
> +#endif
> +
> MODULE_DESCRIPTION("DRM SHMEM memory-management helpers");
> MODULE_IMPORT_NS("DMA_BUF");
> MODULE_LICENSE("GPL v2");
> diff --git a/drivers/gpu/drm/tests/drm_gem_shmem_test.c b/drivers/gpu/drm/tests/drm_gem_shmem_test.c
> index 1d50bab51ef3..3e7c6f20fbcc 100644
> --- a/drivers/gpu/drm/tests/drm_gem_shmem_test.c
> +++ b/drivers/gpu/drm/tests/drm_gem_shmem_test.c
> @@ -19,6 +19,8 @@
> #include <drm/drm_gem_shmem_helper.h>
> #include <drm/drm_kunit_helpers.h>
>
> +MODULE_IMPORT_NS("EXPORTED_FOR_KUNIT_TESTING");
> +
> #define TEST_SIZE SZ_1M
> #define TEST_BYTE 0xae
>
> @@ -176,7 +178,7 @@ static void drm_gem_shmem_test_vmap(struct kunit *test)
> ret = kunit_add_action_or_reset(test, drm_gem_shmem_free_wrapper, shmem);
> KUNIT_ASSERT_EQ(test, ret, 0);
>
> - ret = drm_gem_shmem_vmap_locked(shmem, &map);
> + ret = drm_gem_shmem_vmap(shmem, &map);
> KUNIT_ASSERT_EQ(test, ret, 0);
> KUNIT_ASSERT_NOT_NULL(test, shmem->vaddr);
> KUNIT_ASSERT_FALSE(test, iosys_map_is_null(&map));
> @@ -186,7 +188,7 @@ static void drm_gem_shmem_test_vmap(struct kunit *test)
> for (i = 0; i < TEST_SIZE; i++)
> KUNIT_EXPECT_EQ(test, iosys_map_rd(&map, i, u8), TEST_BYTE);
>
> - drm_gem_shmem_vunmap_locked(shmem, &map);
> + drm_gem_shmem_vunmap(shmem, &map);
> KUNIT_EXPECT_NULL(test, shmem->vaddr);
> KUNIT_EXPECT_EQ(test, refcount_read(&shmem->vmap_use_count), 0);
> }
> diff --git a/include/drm/drm_gem_shmem_helper.h b/include/drm/drm_gem_shmem_helper.h
> index 589f7bfe7506..6924ee226655 100644
> --- a/include/drm/drm_gem_shmem_helper.h
> +++ b/include/drm/drm_gem_shmem_helper.h
> @@ -303,4 +303,13 @@ struct drm_gem_object *drm_gem_shmem_prime_import_no_map(struct drm_device *dev,
> .gem_prime_import = drm_gem_shmem_prime_import_no_map, \
> .dumb_create = drm_gem_shmem_dumb_create
>
> +/*
> + * Kunit helpers
> + */
> +
> +#if IS_ENABLED(CONFIG_KUNIT)
> +int drm_gem_shmem_vmap(struct drm_gem_shmem_object *shmem, struct iosys_map *map);
> +void drm_gem_shmem_vunmap(struct drm_gem_shmem_object *shmem, struct iosys_map *map);
> +#endif
> +
> #endif /* __DRM_GEM_SHMEM_HELPER_H__ */
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 4/5] drm/tests: shmem: Hold reservation lock around madvise
2025-12-12 16:00 ` [PATCH 4/5] drm/tests: shmem: Hold reservation lock around madvise Thomas Zimmermann
@ 2025-12-19 13:06 ` Boris Brezillon
0 siblings, 0 replies; 11+ messages in thread
From: Boris Brezillon @ 2025-12-19 13:06 UTC (permalink / raw)
To: Thomas Zimmermann
Cc: dmitry.osipenko, maarten.lankhorst, mripard, airlied, simona,
dri-devel, stable
On Fri, 12 Dec 2025 17:00:35 +0100
Thomas Zimmermann <tzimmermann@suse.de> wrote:
> Acquire and release the GEM object's reservation lock around calls
> to the object's madvide operation. The tests use
> drm_gem_shmem_madvise_locked(), which led to errors such as show below.
>
> [ 58.339389] WARNING: CPU: 1 PID: 1352 at drivers/gpu/drm/drm_gem_shmem_helper.c:499 drm_gem_shmem_madvise_locked+0xde/0x140
>
> Only export the new helper drm_gem_shmem_madvise() for Kunit tests.
> This is not an interface for regular drivers.
>
> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
> Fixes: 954907f7147d ("drm/shmem-helper: Refactor locked/unlocked functions")
> Cc: dri-devel@lists.freedesktop.org
> Cc: <stable@vger.kernel.org> # v6.16+
Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com>
> ---
> drivers/gpu/drm/drm_gem_shmem_helper.c | 15 +++++++++++++++
> drivers/gpu/drm/tests/drm_gem_shmem_test.c | 8 ++++----
> include/drm/drm_gem_shmem_helper.h | 1 +
> 3 files changed, 20 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_gem_shmem_helper.c b/drivers/gpu/drm/drm_gem_shmem_helper.c
> index 06ef4e5adb7d..4ffcf6ed46f5 100644
> --- a/drivers/gpu/drm/drm_gem_shmem_helper.c
> +++ b/drivers/gpu/drm/drm_gem_shmem_helper.c
> @@ -924,6 +924,21 @@ void drm_gem_shmem_vunmap(struct drm_gem_shmem_object *shmem, struct iosys_map *
> dma_resv_unlock(obj->resv);
> }
> EXPORT_SYMBOL_IF_KUNIT(drm_gem_shmem_vunmap);
> +
> +int drm_gem_shmem_madvise(struct drm_gem_shmem_object *shmem, int madv)
> +{
> + struct drm_gem_object *obj = &shmem->base;
> + int ret;
> +
> + ret = dma_resv_lock_interruptible(obj->resv, NULL);
> + if (ret)
> + return ret;
> + ret = drm_gem_shmem_madvise_locked(shmem, madv);
> + dma_resv_unlock(obj->resv);
> +
> + return ret;
> +}
> +EXPORT_SYMBOL_IF_KUNIT(drm_gem_shmem_madvise);
> #endif
>
> MODULE_DESCRIPTION("DRM SHMEM memory-management helpers");
> diff --git a/drivers/gpu/drm/tests/drm_gem_shmem_test.c b/drivers/gpu/drm/tests/drm_gem_shmem_test.c
> index 3e7c6f20fbcc..d639848e3c8e 100644
> --- a/drivers/gpu/drm/tests/drm_gem_shmem_test.c
> +++ b/drivers/gpu/drm/tests/drm_gem_shmem_test.c
> @@ -292,17 +292,17 @@ static void drm_gem_shmem_test_madvise(struct kunit *test)
> ret = kunit_add_action_or_reset(test, drm_gem_shmem_free_wrapper, shmem);
> KUNIT_ASSERT_EQ(test, ret, 0);
>
> - ret = drm_gem_shmem_madvise_locked(shmem, 1);
> + ret = drm_gem_shmem_madvise(shmem, 1);
> KUNIT_EXPECT_TRUE(test, ret);
> KUNIT_ASSERT_EQ(test, shmem->madv, 1);
>
> /* Set madv to a negative value */
> - ret = drm_gem_shmem_madvise_locked(shmem, -1);
> + ret = drm_gem_shmem_madvise(shmem, -1);
> KUNIT_EXPECT_FALSE(test, ret);
> KUNIT_ASSERT_EQ(test, shmem->madv, -1);
>
> /* Check that madv cannot be set back to a positive value */
> - ret = drm_gem_shmem_madvise_locked(shmem, 0);
> + ret = drm_gem_shmem_madvise(shmem, 0);
> KUNIT_EXPECT_FALSE(test, ret);
> KUNIT_ASSERT_EQ(test, shmem->madv, -1);
> }
> @@ -330,7 +330,7 @@ static void drm_gem_shmem_test_purge(struct kunit *test)
> ret = drm_gem_shmem_is_purgeable(shmem);
> KUNIT_EXPECT_FALSE(test, ret);
>
> - ret = drm_gem_shmem_madvise_locked(shmem, 1);
> + ret = drm_gem_shmem_madvise(shmem, 1);
> KUNIT_EXPECT_TRUE(test, ret);
>
> /* The scatter/gather table will be freed by drm_gem_shmem_free */
> diff --git a/include/drm/drm_gem_shmem_helper.h b/include/drm/drm_gem_shmem_helper.h
> index 6924ee226655..3dd93e2df709 100644
> --- a/include/drm/drm_gem_shmem_helper.h
> +++ b/include/drm/drm_gem_shmem_helper.h
> @@ -310,6 +310,7 @@ struct drm_gem_object *drm_gem_shmem_prime_import_no_map(struct drm_device *dev,
> #if IS_ENABLED(CONFIG_KUNIT)
> int drm_gem_shmem_vmap(struct drm_gem_shmem_object *shmem, struct iosys_map *map);
> void drm_gem_shmem_vunmap(struct drm_gem_shmem_object *shmem, struct iosys_map *map);
> +int drm_gem_shmem_madvise(struct drm_gem_shmem_object *shmem, int madv);
> #endif
>
> #endif /* __DRM_GEM_SHMEM_HELPER_H__ */
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 5/5] drm/tests: shmem: Hold reservation lock around purge
2025-12-12 16:00 ` [PATCH 5/5] drm/tests: shmem: Hold reservation lock around purge Thomas Zimmermann
@ 2025-12-19 13:06 ` Boris Brezillon
0 siblings, 0 replies; 11+ messages in thread
From: Boris Brezillon @ 2025-12-19 13:06 UTC (permalink / raw)
To: Thomas Zimmermann
Cc: dmitry.osipenko, maarten.lankhorst, mripard, airlied, simona,
dri-devel, stable
On Fri, 12 Dec 2025 17:00:36 +0100
Thomas Zimmermann <tzimmermann@suse.de> wrote:
> Acquire and release the GEM object's reservation lock around calls
> to the object's purge operation. The tests use
> drm_gem_shmem_purge_locked(), which led to errors such as show below.
>
> [ 58.709128] WARNING: CPU: 1 PID: 1354 at drivers/gpu/drm/drm_gem_shmem_helper.c:515 drm_gem_shmem_purge_locked+0x51c/0x740
>
> Only export the new helper drm_gem_shmem_purge() for Kunit tests.
> This is not an interface for regular drivers.
>
> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
> Fixes: 954907f7147d ("drm/shmem-helper: Refactor locked/unlocked functions")
> Cc: dri-devel@lists.freedesktop.org
> Cc: <stable@vger.kernel.org> # v6.16+
Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com>
> ---
> drivers/gpu/drm/drm_gem_shmem_helper.c | 15 +++++++++++++++
> drivers/gpu/drm/tests/drm_gem_shmem_test.c | 4 +++-
> include/drm/drm_gem_shmem_helper.h | 1 +
> 3 files changed, 19 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/drm_gem_shmem_helper.c b/drivers/gpu/drm/drm_gem_shmem_helper.c
> index 4ffcf6ed46f5..dfc24392cb61 100644
> --- a/drivers/gpu/drm/drm_gem_shmem_helper.c
> +++ b/drivers/gpu/drm/drm_gem_shmem_helper.c
> @@ -939,6 +939,21 @@ int drm_gem_shmem_madvise(struct drm_gem_shmem_object *shmem, int madv)
> return ret;
> }
> EXPORT_SYMBOL_IF_KUNIT(drm_gem_shmem_madvise);
> +
> +int drm_gem_shmem_purge(struct drm_gem_shmem_object *shmem)
> +{
> + struct drm_gem_object *obj = &shmem->base;
> + int ret;
> +
> + ret = dma_resv_lock_interruptible(obj->resv, NULL);
> + if (ret)
> + return ret;
> + drm_gem_shmem_purge_locked(shmem);
> + dma_resv_unlock(obj->resv);
> +
> + return 0;
> +}
> +EXPORT_SYMBOL_IF_KUNIT(drm_gem_shmem_purge);
> #endif
>
> MODULE_DESCRIPTION("DRM SHMEM memory-management helpers");
> diff --git a/drivers/gpu/drm/tests/drm_gem_shmem_test.c b/drivers/gpu/drm/tests/drm_gem_shmem_test.c
> index d639848e3c8e..4b459f21acfd 100644
> --- a/drivers/gpu/drm/tests/drm_gem_shmem_test.c
> +++ b/drivers/gpu/drm/tests/drm_gem_shmem_test.c
> @@ -340,7 +340,9 @@ static void drm_gem_shmem_test_purge(struct kunit *test)
> ret = drm_gem_shmem_is_purgeable(shmem);
> KUNIT_EXPECT_TRUE(test, ret);
>
> - drm_gem_shmem_purge_locked(shmem);
> + ret = drm_gem_shmem_purge(shmem);
> + KUNIT_ASSERT_EQ(test, ret, 0);
> +
> KUNIT_EXPECT_NULL(test, shmem->pages);
> KUNIT_EXPECT_NULL(test, shmem->sgt);
> KUNIT_EXPECT_EQ(test, shmem->madv, -1);
> diff --git a/include/drm/drm_gem_shmem_helper.h b/include/drm/drm_gem_shmem_helper.h
> index 3dd93e2df709..8d56970d7eed 100644
> --- a/include/drm/drm_gem_shmem_helper.h
> +++ b/include/drm/drm_gem_shmem_helper.h
> @@ -311,6 +311,7 @@ struct drm_gem_object *drm_gem_shmem_prime_import_no_map(struct drm_device *dev,
> int drm_gem_shmem_vmap(struct drm_gem_shmem_object *shmem, struct iosys_map *map);
> void drm_gem_shmem_vunmap(struct drm_gem_shmem_object *shmem, struct iosys_map *map);
> int drm_gem_shmem_madvise(struct drm_gem_shmem_object *shmem, int madv);
> +int drm_gem_shmem_purge(struct drm_gem_shmem_object *shmem);
> #endif
>
> #endif /* __DRM_GEM_SHMEM_HELPER_H__ */
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2025-12-19 13:06 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-12-12 16:00 [PATCH 0/5] drm/tests: Fix tests for GEM SHMEM Thomas Zimmermann
2025-12-12 16:00 ` [PATCH 1/5] drm/tests: shmem: Swap names of export tests Thomas Zimmermann
2025-12-19 13:03 ` Boris Brezillon
2025-12-12 16:00 ` [PATCH 2/5] drm/tests: shmem: Add clean-up action to unpin pages Thomas Zimmermann
2025-12-19 13:04 ` Boris Brezillon
2025-12-12 16:00 ` [PATCH 3/5] drm/tests: shmem: Hold reservation lock around vmap/vunmap Thomas Zimmermann
2025-12-19 13:05 ` Boris Brezillon
2025-12-12 16:00 ` [PATCH 4/5] drm/tests: shmem: Hold reservation lock around madvise Thomas Zimmermann
2025-12-19 13:06 ` Boris Brezillon
2025-12-12 16:00 ` [PATCH 5/5] drm/tests: shmem: Hold reservation lock around purge Thomas Zimmermann
2025-12-19 13:06 ` Boris Brezillon
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.