1 #ifndef _LINUX_SHRINKER_H 2 #define _LINUX_SHRINKER_H 3 4 /* 5 * This struct is used to pass information from page reclaim to the shrinkers. 6 * We consolidate the values for easier extention later. 7 * 8 * The 'gfpmask' refers to the allocation we are currently trying to 9 * fulfil. 10 */ 11 struct shrink_control { 12 gfp_t gfp_mask; 13 14 /* 15 * How many objects scan_objects should scan and try to reclaim. 16 * This is reset before every call, so it is safe for callees 17 * to modify. 18 */ 19 unsigned long nr_to_scan; 20 21 /* shrink from these nodes */ 22 nodemask_t nodes_to_scan; 23 /* current node being shrunk (for NUMA aware shrinkers) */ 24 int nid; 25 }; 26 27 #define SHRINK_STOP (~0UL) 28 /* 29 * A callback you can register to apply pressure to ageable caches. 30 * 31 * @count_objects should return the number of freeable items in the cache. If 32 * there are no objects to free or the number of freeable items cannot be 33 * determined, it should return 0. No deadlock checks should be done during the 34 * count callback - the shrinker relies on aggregating scan counts that couldn't 35 * be executed due to potential deadlocks to be run at a later call when the 36 * deadlock condition is no longer pending. 37 * 38 * @scan_objects will only be called if @count_objects returned a non-zero 39 * value for the number of freeable objects. The callout should scan the cache 40 * and attempt to free items from the cache. It should then return the number 41 * of objects freed during the scan, or SHRINK_STOP if progress cannot be made 42 * due to potential deadlocks. If SHRINK_STOP is returned, then no further 43 * attempts to call the @scan_objects will be made from the current reclaim 44 * context. 45 * 46 * @flags determine the shrinker abilities, like numa awareness 47 */ 48 struct shrinker { 49 unsigned long (*count_objects)(struct shrinker *, 50 struct shrink_control *sc); 51 unsigned long (*scan_objects)(struct shrinker *, 52 struct shrink_control *sc); 53 54 int seeks; /* seeks to recreate an obj */ 55 long batch; /* reclaim batch size, 0 = default */ 56 unsigned long flags; 57 58 /* These are for internal use */ 59 struct list_head list; 60 /* objs pending delete, per node */ 61 atomic_long_t *nr_deferred; 62 }; 63 #define DEFAULT_SEEKS 2 /* A good number if you don't know better. */ 64 65 /* Flags */ 66 #define SHRINKER_NUMA_AWARE (1 << 0) 67 68 extern int register_shrinker(struct shrinker *); 69 extern void unregister_shrinker(struct shrinker *); 70 #endif 71