mm: clean up and kernelify shrinker registration
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. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au> Cc: David Chinner <dgc@sgi.com> Cc: Trond Myklebust <trond.myklebust@fys.uio.no> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
committed by
Linus Torvalds
parent
5ad333eb66
commit
8e1f936b73
42
mm/vmscan.c
42
mm/vmscan.c
@@ -70,17 +70,6 @@ struct scan_control {
|
||||
int order;
|
||||
};
|
||||
|
||||
/*
|
||||
* The list of shrinker callbacks used by to apply pressure to
|
||||
* ageable caches.
|
||||
*/
|
||||
struct shrinker {
|
||||
shrinker_t shrinker;
|
||||
struct list_head list;
|
||||
int seeks; /* seeks to recreate an obj */
|
||||
long nr; /* objs pending delete */
|
||||
};
|
||||
|
||||
#define lru_to_page(_head) (list_entry((_head)->prev, struct page, lru))
|
||||
|
||||
#ifdef ARCH_HAS_PREFETCH
|
||||
@@ -123,34 +112,25 @@ static DECLARE_RWSEM(shrinker_rwsem);
|
||||
/*
|
||||
* Add a shrinker callback to be called from the vm
|
||||
*/
|
||||
struct shrinker *set_shrinker(int seeks, shrinker_t theshrinker)
|
||||
void register_shrinker(struct shrinker *shrinker)
|
||||
{
|
||||
struct shrinker *shrinker;
|
||||
|
||||
shrinker = kmalloc(sizeof(*shrinker), GFP_KERNEL);
|
||||
if (shrinker) {
|
||||
shrinker->shrinker = theshrinker;
|
||||
shrinker->seeks = seeks;
|
||||
shrinker->nr = 0;
|
||||
down_write(&shrinker_rwsem);
|
||||
list_add_tail(&shrinker->list, &shrinker_list);
|
||||
up_write(&shrinker_rwsem);
|
||||
}
|
||||
return shrinker;
|
||||
shrinker->nr = 0;
|
||||
down_write(&shrinker_rwsem);
|
||||
list_add_tail(&shrinker->list, &shrinker_list);
|
||||
up_write(&shrinker_rwsem);
|
||||
}
|
||||
EXPORT_SYMBOL(set_shrinker);
|
||||
EXPORT_SYMBOL(register_shrinker);
|
||||
|
||||
/*
|
||||
* Remove one
|
||||
*/
|
||||
void remove_shrinker(struct shrinker *shrinker)
|
||||
void unregister_shrinker(struct shrinker *shrinker)
|
||||
{
|
||||
down_write(&shrinker_rwsem);
|
||||
list_del(&shrinker->list);
|
||||
up_write(&shrinker_rwsem);
|
||||
kfree(shrinker);
|
||||
}
|
||||
EXPORT_SYMBOL(remove_shrinker);
|
||||
EXPORT_SYMBOL(unregister_shrinker);
|
||||
|
||||
#define SHRINK_BATCH 128
|
||||
/*
|
||||
@@ -187,7 +167,7 @@ unsigned long shrink_slab(unsigned long scanned, gfp_t gfp_mask,
|
||||
list_for_each_entry(shrinker, &shrinker_list, list) {
|
||||
unsigned long long delta;
|
||||
unsigned long total_scan;
|
||||
unsigned long max_pass = (*shrinker->shrinker)(0, gfp_mask);
|
||||
unsigned long max_pass = (*shrinker->shrink)(0, gfp_mask);
|
||||
|
||||
delta = (4 * scanned) / shrinker->seeks;
|
||||
delta *= max_pass;
|
||||
@@ -215,8 +195,8 @@ unsigned long shrink_slab(unsigned long scanned, gfp_t gfp_mask,
|
||||
int shrink_ret;
|
||||
int nr_before;
|
||||
|
||||
nr_before = (*shrinker->shrinker)(0, gfp_mask);
|
||||
shrink_ret = (*shrinker->shrinker)(this_scan, gfp_mask);
|
||||
nr_before = (*shrinker->shrink)(0, gfp_mask);
|
||||
shrink_ret = (*shrinker->shrink)(this_scan, gfp_mask);
|
||||
if (shrink_ret == -1)
|
||||
break;
|
||||
if (shrink_ret < nr_before)
|
||||
|
Reference in New Issue
Block a user