Commit 7122debb authored by Daniel Latypov's avatar Daniel Latypov Committed by Shuah Khan

kunit: introduce kunit_kmalloc_array/kunit_kcalloc() helpers

Add in:
* kunit_kmalloc_array() and wire up kunit_kmalloc() to be a special
case of it.
* kunit_kcalloc() for symmetry with kunit_kzalloc()

This should using KUnit more natural by making it more similar to the
existing *alloc() APIs.

And while we shouldn't necessarily be writing unit tests where overflow
should be a concern, it can't hurt to be safe.
Signed-off-by: default avatarDaniel Latypov <dlatypov@google.com>
Reviewed-by: default avatarDavid Gow <davidgow@google.com>
Reviewed-by: default avatarBrendan Higgins <brendanhiggins@google.com>
Signed-off-by: default avatarShuah Khan <skhan@linuxfoundation.org>
parent 8a5124c0
...@@ -577,16 +577,30 @@ static inline int kunit_destroy_named_resource(struct kunit *test, ...@@ -577,16 +577,30 @@ static inline int kunit_destroy_named_resource(struct kunit *test,
void kunit_remove_resource(struct kunit *test, struct kunit_resource *res); void kunit_remove_resource(struct kunit *test, struct kunit_resource *res);
/** /**
* kunit_kmalloc() - Like kmalloc() except the allocation is *test managed*. * kunit_kmalloc_array() - Like kmalloc_array() except the allocation is *test managed*.
* @test: The test context object. * @test: The test context object.
* @n: number of elements.
* @size: The size in bytes of the desired memory. * @size: The size in bytes of the desired memory.
* @gfp: flags passed to underlying kmalloc(). * @gfp: flags passed to underlying kmalloc().
* *
* Just like `kmalloc(...)`, except the allocation is managed by the test case * Just like `kmalloc_array(...)`, except the allocation is managed by the test case
* and is automatically cleaned up after the test case concludes. See &struct * and is automatically cleaned up after the test case concludes. See &struct
* kunit_resource for more information. * kunit_resource for more information.
*/ */
void *kunit_kmalloc(struct kunit *test, size_t size, gfp_t gfp); void *kunit_kmalloc_array(struct kunit *test, size_t n, size_t size, gfp_t flags);
/**
* kunit_kmalloc() - Like kmalloc() except the allocation is *test managed*.
* @test: The test context object.
* @size: The size in bytes of the desired memory.
* @gfp: flags passed to underlying kmalloc().
*
* See kmalloc() and kunit_kmalloc_array() for more information.
*/
static inline void *kunit_kmalloc(struct kunit *test, size_t size, gfp_t gfp)
{
return kunit_kmalloc_array(test, 1, size, gfp);
}
/** /**
* kunit_kfree() - Like kfree except for allocations managed by KUnit. * kunit_kfree() - Like kfree except for allocations managed by KUnit.
...@@ -601,13 +615,27 @@ void kunit_kfree(struct kunit *test, const void *ptr); ...@@ -601,13 +615,27 @@ void kunit_kfree(struct kunit *test, const void *ptr);
* @size: The size in bytes of the desired memory. * @size: The size in bytes of the desired memory.
* @gfp: flags passed to underlying kmalloc(). * @gfp: flags passed to underlying kmalloc().
* *
* See kzalloc() and kunit_kmalloc() for more information. * See kzalloc() and kunit_kmalloc_array() for more information.
*/ */
static inline void *kunit_kzalloc(struct kunit *test, size_t size, gfp_t gfp) static inline void *kunit_kzalloc(struct kunit *test, size_t size, gfp_t gfp)
{ {
return kunit_kmalloc(test, size, gfp | __GFP_ZERO); return kunit_kmalloc(test, size, gfp | __GFP_ZERO);
} }
/**
* kunit_kcalloc() - Just like kunit_kmalloc_array(), but zeroes the allocation.
* @test: The test context object.
* @n: number of elements.
* @size: The size in bytes of the desired memory.
* @gfp: flags passed to underlying kmalloc().
*
* See kcalloc() and kunit_kmalloc_array() for more information.
*/
static inline void *kunit_kcalloc(struct kunit *test, size_t n, size_t size, gfp_t flags)
{
return kunit_kmalloc_array(test, n, size, flags | __GFP_ZERO);
}
void kunit_cleanup(struct kunit *test); void kunit_cleanup(struct kunit *test);
void __printf(2, 3) kunit_log_append(char *log, const char *fmt, ...); void __printf(2, 3) kunit_log_append(char *log, const char *fmt, ...);
......
...@@ -572,41 +572,43 @@ int kunit_destroy_resource(struct kunit *test, kunit_resource_match_t match, ...@@ -572,41 +572,43 @@ int kunit_destroy_resource(struct kunit *test, kunit_resource_match_t match,
} }
EXPORT_SYMBOL_GPL(kunit_destroy_resource); EXPORT_SYMBOL_GPL(kunit_destroy_resource);
struct kunit_kmalloc_params { struct kunit_kmalloc_array_params {
size_t n;
size_t size; size_t size;
gfp_t gfp; gfp_t gfp;
}; };
static int kunit_kmalloc_init(struct kunit_resource *res, void *context) static int kunit_kmalloc_array_init(struct kunit_resource *res, void *context)
{ {
struct kunit_kmalloc_params *params = context; struct kunit_kmalloc_array_params *params = context;
res->data = kmalloc(params->size, params->gfp); res->data = kmalloc_array(params->n, params->size, params->gfp);
if (!res->data) if (!res->data)
return -ENOMEM; return -ENOMEM;
return 0; return 0;
} }
static void kunit_kmalloc_free(struct kunit_resource *res) static void kunit_kmalloc_array_free(struct kunit_resource *res)
{ {
kfree(res->data); kfree(res->data);
} }
void *kunit_kmalloc(struct kunit *test, size_t size, gfp_t gfp) void *kunit_kmalloc_array(struct kunit *test, size_t n, size_t size, gfp_t gfp)
{ {
struct kunit_kmalloc_params params = { struct kunit_kmalloc_array_params params = {
.size = size, .size = size,
.n = n,
.gfp = gfp .gfp = gfp
}; };
return kunit_alloc_resource(test, return kunit_alloc_resource(test,
kunit_kmalloc_init, kunit_kmalloc_array_init,
kunit_kmalloc_free, kunit_kmalloc_array_free,
gfp, gfp,
&params); &params);
} }
EXPORT_SYMBOL_GPL(kunit_kmalloc); EXPORT_SYMBOL_GPL(kunit_kmalloc_array);
void kunit_kfree(struct kunit *test, const void *ptr) void kunit_kfree(struct kunit *test, const void *ptr)
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment