2022-03-23 23:41:11

by Xiaoke Wang

[permalink] [raw]
Subject: [PATCH] lib/test_meminit: optimize do_kmem_cache_rcu_persistent() test

From: Xiaoke Wang <[email protected]>

To make the test more robust, there are the following changes:
1. add a check for the return value of kmem_cache_alloc().
2. properly release the object `buf` on several error paths.
3. release the objects of `used_objects` if we never hit `saved_ptr`.
4. destroy the created cache by default.

Signed-off-by: Xiaoke Wang <[email protected]>
---
lib/test_meminit.c | 12 ++++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/lib/test_meminit.c b/lib/test_meminit.c
index 2f4c4bc..8d77c3f 100644
--- a/lib/test_meminit.c
+++ b/lib/test_meminit.c
@@ -300,13 +300,18 @@ static int __init do_kmem_cache_rcu_persistent(int size, int *total_failures)
c = kmem_cache_create("test_cache", size, size, SLAB_TYPESAFE_BY_RCU,
NULL);
buf = kmem_cache_alloc(c, GFP_KERNEL);
+ if (!buf)
+ goto out;
saved_ptr = buf;
fill_with_garbage(buf, size);
buf_contents = kmalloc(size, GFP_KERNEL);
- if (!buf_contents)
+ if (!buf_contents) {
+ kmem_cache_free(c, buf);
goto out;
+ }
used_objects = kmalloc_array(maxiter, sizeof(void *), GFP_KERNEL);
if (!used_objects) {
+ kmem_cache_free(c, buf);
kfree(buf_contents);
goto out;
}
@@ -327,11 +332,14 @@ static int __init do_kmem_cache_rcu_persistent(int size, int *total_failures)
}
}

+ for (iter = 0; iter < maxiter; iter++)
+ kmem_cache_free(c, used_objects[iter]);
+
free_out:
- kmem_cache_destroy(c);
kfree(buf_contents);
kfree(used_objects);
out:
+ kmem_cache_destroy(c);
*total_failures += fail;
return 1;
}
--


2022-03-25 22:12:58

by Andrew Morton

[permalink] [raw]
Subject: Re: [PATCH] lib/test_meminit: optimize do_kmem_cache_rcu_persistent() test

On Wed, 23 Mar 2022 11:48:24 +0800 [email protected] wrote:

> From: Xiaoke Wang <[email protected]>
>
> To make the test more robust, there are the following changes:
> 1. add a check for the return value of kmem_cache_alloc().
> 2. properly release the object `buf` on several error paths.
> 3. release the objects of `used_objects` if we never hit `saved_ptr`.
> 4. destroy the created cache by default.
>
> ...
>
> --- a/lib/test_meminit.c
> +++ b/lib/test_meminit.c
> @@ -300,13 +300,18 @@ static int __init do_kmem_cache_rcu_persistent(int size, int *total_failures)
> c = kmem_cache_create("test_cache", size, size, SLAB_TYPESAFE_BY_RCU,
> NULL);
> buf = kmem_cache_alloc(c, GFP_KERNEL);
> + if (!buf)
> + goto out;

OK, Normally we don't bother checking allocation success in __init
code, but this test can run via modprobe, so I guess checking is the
right thing to do.