diff options
-rw-r--r-- | include/linux/mm_compat.h | 46 | ||||
-rw-r--r-- | module/spl/spl-kmem.c | 50 |
2 files changed, 55 insertions, 41 deletions
diff --git a/include/linux/mm_compat.h b/include/linux/mm_compat.h index 5c5198b90..7e2f6b8a5 100644 --- a/include/linux/mm_compat.h +++ b/include/linux/mm_compat.h @@ -56,4 +56,50 @@ extern invalidate_inodes_t invalidate_inodes_fn; #define invalidate_inodes(sb) invalidate_inodes_fn(sb) #endif /* HAVE_INVALIDATE_INODES */ +#ifdef HAVE_SET_SHRINKER +typedef struct spl_shrinker { + struct shrinker *shrinker; + shrinker_t fn; + int seeks; +} spl_shrinker_t; + +static inline void +spl_register_shrinker(spl_shrinker_t *ss) +{ + ss->shrinker = set_shrinker(ss->seeks, ss->fn); +} + +static inline void +spl_unregister_shrinker(spl_shrinker_t *ss) +{ + remove_shrinker(ss->shrinker); +} + +# define SPL_SHRINKER_DECLARE(s, x, y) \ + static spl_shrinker_t s = { .shrinker = NULL, .fn = x, .seeks = y } +# define SPL_SHRINKER_CALLBACK_PROTO(fn, x, y, z) \ + static int fn(int y, unsigned int z) +# define spl_exec_shrinker(ss, nr, gfp) \ + ((spl_shrinker_t *)ss)->fn(nr, gfp) + +#else /* HAVE_SET_SHRINKER */ + +# define spl_register_shrinker(x) register_shrinker(x) +# define spl_unregister_shrinker(x) unregister_shrinker(x) +# define SPL_SHRINKER_DECLARE(s, x, y) \ + static struct shrinker s = { .shrink = x, .seeks = y } + +# ifdef HAVE_3ARGS_SHRINKER_CALLBACK +# define SPL_SHRINKER_CALLBACK_PROTO(fn, x, y, z) \ + static int fn(struct shrinker *x, int y, unsigned int z) +# define spl_exec_shrinker(ss, nr, gfp) \ + ((struct shrinker *)ss)->shrink(NULL, nr, gfp) +# else /* HAVE_3ARGS_SHRINKER_CALLBACK */ +# define SPL_SHRINKER_CALLBACK_PROTO(fn, x, y, z) \ + static int fn(int y, unsigned int z) +# define spl_exec_shrinker(ss, nr, gfp) \ + ((struct shrinker *)ss)->shrink(nr, gfp) +# endif /* HAVE_3ARGS_SHRINKER_CALLBACK */ +#endif /* HAVE_SET_SHRINKER */ + #endif /* SPL_MM_COMPAT_H */ diff --git a/module/spl/spl-kmem.c b/module/spl/spl-kmem.c index 2f533bdf6..87594bde9 100644 --- a/module/spl/spl-kmem.c +++ b/module/spl/spl-kmem.c @@ -819,21 +819,10 @@ struct rw_semaphore spl_kmem_cache_sem; /* Cache list lock */ static int spl_cache_flush(spl_kmem_cache_t *skc, spl_kmem_magazine_t *skm, int flush); -#ifdef HAVE_SET_SHRINKER -static struct shrinker *spl_kmem_cache_shrinker; -#else -# ifdef HAVE_3ARGS_SHRINKER_CALLBACK -static int spl_kmem_cache_generic_shrinker(struct shrinker *shrinker_cb, - int nr_to_scan, unsigned int gfp_mask); -# else -static int spl_kmem_cache_generic_shrinker( - int nr_to_scan, unsigned int gfp_mask); -# endif /* HAVE_3ARGS_SHRINKER_CALLBACK */ -static struct shrinker spl_kmem_cache_shrinker = { - .shrink = spl_kmem_cache_generic_shrinker, - .seeks = KMC_DEFAULT_SEEKS, -}; -#endif /* HAVE_SET_SHRINKER */ +SPL_SHRINKER_CALLBACK_PROTO(spl_kmem_cache_generic_shrinker, + shrinker_cb, nr_to_scan, gfp_mask); +SPL_SHRINKER_DECLARE(spl_kmem_cache_shrinker, + spl_kmem_cache_generic_shrinker, KMC_DEFAULT_SEEKS); static void * kv_alloc(spl_kmem_cache_t *skc, int size, int flags) @@ -1859,14 +1848,8 @@ EXPORT_SYMBOL(spl_kmem_cache_free); * objects should be freed, because Solaris semantics are to free * all available objects we may free more objects than requested. */ -#ifdef HAVE_3ARGS_SHRINKER_CALLBACK -static int -spl_kmem_cache_generic_shrinker(struct shrinker *shrinker_cb, - int nr_to_scan, unsigned int gfp_mask) -#else -static int -spl_kmem_cache_generic_shrinker(int nr_to_scan, unsigned int gfp_mask) -#endif /* HAVE_3ARGS_SHRINKER_CALLBACK */ +SPL_SHRINKER_CALLBACK_PROTO(spl_kmem_cache_generic_shrinker, + shrinker_cb, nr_to_scan, gfp_mask) { spl_kmem_cache_t *skc; int unused = 0; @@ -1930,11 +1913,7 @@ EXPORT_SYMBOL(spl_kmem_cache_reap_now); void spl_kmem_reap(void) { -#ifdef HAVE_3ARGS_SHRINKER_CALLBACK - spl_kmem_cache_generic_shrinker(NULL, KMC_REAP_CHUNK, GFP_KERNEL); -#else - spl_kmem_cache_generic_shrinker(KMC_REAP_CHUNK, GFP_KERNEL); -#endif /* HAVE_3ARGS_SHRINKER_CALLBACK */ + spl_exec_shrinker(&spl_kmem_cache_shrinker, KMC_REAP_CHUNK, GFP_KERNEL); } EXPORT_SYMBOL(spl_kmem_reap); @@ -2135,14 +2114,7 @@ spl_kmem_init(void) init_rwsem(&spl_kmem_cache_sem); INIT_LIST_HEAD(&spl_kmem_cache_list); -#ifdef HAVE_SET_SHRINKER - spl_kmem_cache_shrinker = set_shrinker(KMC_DEFAULT_SEEKS, - spl_kmem_cache_generic_shrinker); - if (spl_kmem_cache_shrinker == NULL) - SRETURN(rc = -ENOMEM); -#else - register_shrinker(&spl_kmem_cache_shrinker); -#endif + spl_register_shrinker(&spl_kmem_cache_shrinker); #ifdef DEBUG_KMEM kmem_alloc_used_set(0); @@ -2178,11 +2150,7 @@ spl_kmem_fini(void) #endif /* DEBUG_KMEM */ SENTRY; -#ifdef HAVE_SET_SHRINKER - remove_shrinker(spl_kmem_cache_shrinker); -#else - unregister_shrinker(&spl_kmem_cache_shrinker); -#endif + spl_unregister_shrinker(&spl_kmem_cache_shrinker); SEXIT; } |