On Tue, Apr 19, 2011 at 10:51 AM, Ying Han wrote: > This patch consolidates existing parameters to shrink_slab() to > scan_control struct. This is needed later to pass the same struct > to shrinkers. > > Signed-off-by: Ying Han > --- > fs/drop_caches.c | 7 ++++++- > include/linux/mm.h | 4 ++-- > mm/vmscan.c | 12 ++++++------ > 3 files changed, 14 insertions(+), 9 deletions(-) > > diff --git a/fs/drop_caches.c b/fs/drop_caches.c > index 816f88e..0e5ef62 100644 > --- a/fs/drop_caches.c > +++ b/fs/drop_caches.c > @@ -8,6 +8,7 @@ > #include > #include > #include > +#include > > /* A global variable is a bit ugly, but it keeps the code simple */ > int sysctl_drop_caches; > @@ -36,9 +37,13 @@ static void drop_pagecache_sb(struct super_block *sb, > void *unused) > static void drop_slab(void) > { > int nr_objects; > + struct scan_control sc = { > + .gfp_mask = GFP_KERNEL, > + .nr_scanned = 1000, > + }; > > do { > - nr_objects = shrink_slab(1000, GFP_KERNEL, 1000); > + nr_objects = shrink_slab(&sc, 1000); > } while (nr_objects > 10); > } > > diff --git a/include/linux/mm.h b/include/linux/mm.h > index 0716517..42c2bf4 100644 > --- a/include/linux/mm.h > +++ b/include/linux/mm.h > @@ -21,6 +21,7 @@ struct anon_vma; > struct file_ra_state; > struct user_struct; > struct writeback_control; > +struct scan_control; > > #ifndef CONFIG_DISCONTIGMEM /* Don't use mapnrs, do it properly > */ > extern unsigned long max_mapnr; > @@ -1601,8 +1602,7 @@ int in_gate_area_no_task(unsigned long addr); > > int drop_caches_sysctl_handler(struct ctl_table *, int, > void __user *, size_t *, loff_t *); > -unsigned long shrink_slab(unsigned long scanned, gfp_t gfp_mask, > - unsigned long lru_pages); > +unsigned long shrink_slab(struct scan_control *sc, unsigned long > lru_pages); > > #ifndef CONFIG_MMU > #define randomize_va_space 0 > diff --git a/mm/vmscan.c b/mm/vmscan.c > index 08b1ab5..9662166 100644 > --- a/mm/vmscan.c > +++ b/mm/vmscan.c > @@ -159,11 +159,12 @@ EXPORT_SYMBOL(unregister_shrinker); > * > * Returns the number of slab objects which we shrunk. > */ > -unsigned long shrink_slab(unsigned long scanned, gfp_t gfp_mask, > - unsigned long lru_pages) > +unsigned long shrink_slab(struct scan_control *sc, unsigned long > lru_pages) > { > struct shrinker *shrinker; > unsigned long ret = 0; > + unsigned long scanned = sc->nr_scanned; > + gfp_t gfp_mask = sc->gfp_mask; > > if (scanned == 0) > scanned = SWAP_CLUSTER_MAX; > @@ -2005,7 +2006,7 @@ static unsigned long do_try_to_free_pages(struct > zonelist *zonelist, > lru_pages += zone_reclaimable_pages(zone); > } > > - shrink_slab(sc->nr_scanned, sc->gfp_mask, > lru_pages); > + shrink_slab(sc, lru_pages); > if (reclaim_state) { > sc->nr_reclaimed += > reclaim_state->reclaimed_slab; > reclaim_state->reclaimed_slab = 0; > @@ -2371,8 +2372,7 @@ loop_again: > end_zone, 0)) > shrink_zone(priority, zone, &sc); > reclaim_state->reclaimed_slab = 0; > - nr_slab = shrink_slab(sc.nr_scanned, GFP_KERNEL, > - lru_pages); > + nr_slab = shrink_slab(&sc, lru_pages); > sc.nr_reclaimed += reclaim_state->reclaimed_slab; > total_scanned += sc.nr_scanned; > > @@ -2949,7 +2949,7 @@ static int __zone_reclaim(struct zone *zone, gfp_t > gfp_mask, unsigned int order) > unsigned long lru_pages = > zone_reclaimable_pages(zone); > > /* No reclaimable slab or very low memory pressure > */ > - if (!shrink_slab(sc.nr_scanned, gfp_mask, > lru_pages)) > + if (!shrink_slab(&sc, lru_pages)) > break; > > /* Freed enough memory */ > -- > 1.7.3.1 > >