From: Rusty Russell I can never remember what the function to register to receive VM pressure is called. I have to trace down from __alloc_pages() to find it. It's called "set_shrinker()", and it needs Your Help. 1) Don't hide struct shrinker. It contains no magic. 2) Don't allocate "struct shrinker". It's not helpful. 3) Call them "register_shrinker" and "unregister_shrinker". 4) Call the function "shrink" not "shrinker". 5) Reduce the 17 lines of waffly comments to 13, but document it properly. The comment in reiser4 makes me a little queasy. Signed-off-by: Rusty Russell Cc: Vladimir Saveliev Cc: Edward Shishkin Signed-off-by: Andrew Morton --- fs/reiser4/fsdata.c | 32 ++++++++++++++------------------ 1 file changed, 14 insertions(+), 18 deletions(-) diff -puN fs/reiser4/fsdata.c~mm-clean-up-and-kernelify-shrinker-registration-reiser4 fs/reiser4/fsdata.c --- a/fs/reiser4/fsdata.c~mm-clean-up-and-kernelify-shrinker-registration-reiser4 +++ a/fs/reiser4/fsdata.c @@ -7,7 +7,6 @@ /* cache or dir_cursors */ static struct kmem_cache *d_cursor_cache; -static struct shrinker *d_cursor_shrinker; /* list of unused cursors */ static LIST_HEAD(cursor_cache); @@ -53,6 +52,18 @@ static int d_cursor_shrink(int nr, gfp_t return d_cursor_unused; } +/* + * actually, d_cursors are "priceless", because there is no way to + * recover information stored in them. On the other hand, we don't + * want to consume all kernel memory by them. As a compromise, just + * assign higher "seeks" value to d_cursor cache, so that it will be + * shrunk only if system is really tight on memory. + */ +static struct shrinker d_cursor_shrinker = { + .shrink = d_cursor_shrink, + .seeks = DEFAULT_SEEKS << 3, +}; + /** * reiser4_init_d_cursor - create d_cursor cache * @@ -66,20 +77,7 @@ int reiser4_init_d_cursor(void) if (d_cursor_cache == NULL) return RETERR(-ENOMEM); - /* - * actually, d_cursors are "priceless", because there is no way to - * recover information stored in them. On the other hand, we don't - * want to consume all kernel memory by them. As a compromise, just - * assign higher "seeks" value to d_cursor cache, so that it will be - * shrunk only if system is really tight on memory. - */ - d_cursor_shrinker = set_shrinker(DEFAULT_SEEKS << 3, - d_cursor_shrink); - if (d_cursor_shrinker == NULL) { - destroy_reiser4_cache(&d_cursor_cache); - d_cursor_cache = NULL; - return RETERR(-ENOMEM); - } + register_shrinker(&d_cursor_shrinker); return 0; } @@ -90,9 +88,7 @@ int reiser4_init_d_cursor(void) */ void reiser4_done_d_cursor(void) { - BUG_ON(d_cursor_shrinker == NULL); - remove_shrinker(d_cursor_shrinker); - d_cursor_shrinker = NULL; + unregister_shrinker(&d_cursor_shrinker); destroy_reiser4_cache(&d_cursor_cache); } _