diff options
| author | Sidhartha Kumar <sidhartha.kumar@oracle.com> | 2024-08-12 15:05:43 -0400 | 
|---|---|---|
| committer | Andrew Morton <akpm@linux-foundation.org> | 2024-09-01 20:26:11 -0700 | 
| commit | 617f8e4d76b81361884db852005f519012ddd244 (patch) | |
| tree | 009ff217bf01d80a76fe89f8cf3bb24d9bcaa469 /tools/testing/shared/linux.c | |
| parent | e1b8b883bb838339eec728de5d02e2f252a7d3d9 (diff) | |
maple_tree: add test to replicate low memory race conditions
Add new callback fields to the userspace implementation of struct
kmem_cache.  This allows for executing callback functions in order to
further test low memory scenarios where node allocation is retried.
This callback can help test race conditions by calling a function when a
low memory event is tested.
Link: https://lkml.kernel.org/r/20240812190543.71967-2-sidhartha.kumar@oracle.com
Signed-off-by: Sidhartha Kumar <sidhartha.kumar@oracle.com>
Reviewed-by: Liam R. Howlett <Liam.Howlett@oracle.com>
Cc: Matthew Wilcox <willy@infradead.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Diffstat (limited to 'tools/testing/shared/linux.c')
| -rw-r--r-- | tools/testing/shared/linux.c | 26 | 
1 files changed, 25 insertions, 1 deletions
| diff --git a/tools/testing/shared/linux.c b/tools/testing/shared/linux.c index 4eb442206d01..17263696b5d8 100644 --- a/tools/testing/shared/linux.c +++ b/tools/testing/shared/linux.c @@ -26,8 +26,21 @@ struct kmem_cache {  	unsigned int non_kernel;  	unsigned long nr_allocated;  	unsigned long nr_tallocated; +	bool exec_callback; +	void (*callback)(void *); +	void *private;  }; +void kmem_cache_set_callback(struct kmem_cache *cachep, void (*callback)(void *)) +{ +	cachep->callback = callback; +} + +void kmem_cache_set_private(struct kmem_cache *cachep, void *private) +{ +	cachep->private = private; +} +  void kmem_cache_set_non_kernel(struct kmem_cache *cachep, unsigned int val)  {  	cachep->non_kernel = val; @@ -58,9 +71,17 @@ void *kmem_cache_alloc_lru(struct kmem_cache *cachep, struct list_lru *lru,  {  	void *p; +	if (cachep->exec_callback) { +		if (cachep->callback) +			cachep->callback(cachep->private); +		cachep->exec_callback = false; +	} +  	if (!(gfp & __GFP_DIRECT_RECLAIM)) { -		if (!cachep->non_kernel) +		if (!cachep->non_kernel) { +			cachep->exec_callback = true;  			return NULL; +		}  		cachep->non_kernel--;  	} @@ -223,6 +244,9 @@ kmem_cache_create(const char *name, unsigned int size, unsigned int align,  	ret->objs = NULL;  	ret->ctor = ctor;  	ret->non_kernel = 0; +	ret->exec_callback = false; +	ret->callback = NULL; +	ret->private = NULL;  	return ret;  } | 
