Reuse drm_mm_insert_node() with a temporary node to exercise drm_mm_replace_node(). We use the previous test in order to exercise the various lists following replacement. Signed-off-by: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> --- drivers/gpu/drm/selftests/drm_mm_selftests.h | 1 + drivers/gpu/drm/selftests/test-drm_mm.c | 45 ++++++++++++++++++++++++---- 2 files changed, 41 insertions(+), 5 deletions(-) diff --git a/drivers/gpu/drm/selftests/drm_mm_selftests.h b/drivers/gpu/drm/selftests/drm_mm_selftests.h index 0927695c3fd4..12d91c77244a 100644 --- a/drivers/gpu/drm/selftests/drm_mm_selftests.h +++ b/drivers/gpu/drm/selftests/drm_mm_selftests.h @@ -5,6 +5,7 @@ * * Tests are executed in reverse order by igt/drm_mm */ +selftest(replace, igt_replace) selftest(insert, igt_insert) selftest(reserve, igt_reserve) selftest(debug, igt_debug) diff --git a/drivers/gpu/drm/selftests/test-drm_mm.c b/drivers/gpu/drm/selftests/test-drm_mm.c index cd57a1de7f89..2ea671f34883 100644 --- a/drivers/gpu/drm/selftests/test-drm_mm.c +++ b/drivers/gpu/drm/selftests/test-drm_mm.c @@ -237,7 +237,7 @@ static int igt_reserve(void *ignored) return 0; } -static int __igt_insert(int count, u64 size) +static int __igt_insert(int count, u64 size, bool replace) { u32 lcg_state = random_seed; struct drm_mm mm; @@ -264,9 +264,10 @@ static int __igt_insert(int count, u64 size) } for (n = 0; n < count; n++) { + struct drm_mm_node tmp, *node; int err; - node = &nodes[n]; + node = memset(replace ? &tmp : &nodes[n], 0, sizeof(*node)); err = drm_mm_insert_node(&mm, node, size, 0, DRM_MM_SEARCH_DEFAULT); if (err) { @@ -281,6 +282,20 @@ static int __igt_insert(int count, u64 size) n, node->start); goto out; } + + if (replace) { + drm_mm_replace_node(&tmp, &nodes[n]); + if (!drm_mm_node_allocated(&nodes[n])) { + pr_err("replaced new-node not allocated! step %d\n", + n); + goto out; + } + if (drm_mm_node_allocated(&tmp)) { + pr_err("replaced old-node still allocated! step %d\n", + n); + goto out; + } + } } /* Repeated use should then fail */ @@ -430,17 +445,37 @@ static int igt_insert(void *ignored) drm_for_each_prime(n, 54) { u64 size = BIT_ULL(n); - ret = __igt_insert(count, size - 1); + ret = __igt_insert(count, size - 1, false); if (ret) return ret; - ret = __igt_insert(count, size); + ret = __igt_insert(count, size, false); + if (ret) + return ret; + + ret = __igt_insert(count, size + 1, false); + } + + return 0; +} + +static int igt_replace(void *ignored) +{ + const unsigned int count = BIT(10); + int n, ret; + + drm_for_each_prime(n, 54) { + u64 size = BIT_ULL(n); + + ret = __igt_insert(count, size - 1, true); if (ret) return ret; - ret = __igt_insert(count, size + 1); + ret = __igt_insert(count, size, true); if (ret) return ret; + + ret = __igt_insert(count, size + 1, true); } return 0; -- 2.11.0 _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel