1 /* SPDX-License-Identifier: GPL-2.0 */ 1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #ifndef _LINUX_SHRINKER_H 2 #ifndef _LINUX_SHRINKER_H 3 #define _LINUX_SHRINKER_H 3 #define _LINUX_SHRINKER_H 4 4 5 #include <linux/atomic.h> 5 #include <linux/atomic.h> 6 #include <linux/types.h> 6 #include <linux/types.h> 7 #include <linux/refcount.h> << 8 #include <linux/completion.h> << 9 << 10 #define SHRINKER_UNIT_BITS BITS_PER_LONG << 11 << 12 /* << 13 * Bitmap and deferred work of shrinker::id co << 14 * shrinkers, which have elements charged to t << 15 */ << 16 struct shrinker_info_unit { << 17 atomic_long_t nr_deferred[SHRINKER_UNI << 18 DECLARE_BITMAP(map, SHRINKER_UNIT_BITS << 19 }; << 20 << 21 struct shrinker_info { << 22 struct rcu_head rcu; << 23 int map_nr_max; << 24 struct shrinker_info_unit *unit[]; << 25 }; << 26 7 27 /* 8 /* 28 * This struct is used to pass information fro 9 * This struct is used to pass information from page reclaim to the shrinkers. 29 * We consolidate the values for easier extens 10 * We consolidate the values for easier extension later. 30 * 11 * 31 * The 'gfpmask' refers to the allocation we a 12 * The 'gfpmask' refers to the allocation we are currently trying to 32 * fulfil. 13 * fulfil. 33 */ 14 */ 34 struct shrink_control { 15 struct shrink_control { 35 gfp_t gfp_mask; 16 gfp_t gfp_mask; 36 17 37 /* current node being shrunk (for NUMA 18 /* current node being shrunk (for NUMA aware shrinkers) */ 38 int nid; 19 int nid; 39 20 40 /* 21 /* 41 * How many objects scan_objects shoul 22 * How many objects scan_objects should scan and try to reclaim. 42 * This is reset before every call, so 23 * This is reset before every call, so it is safe for callees 43 * to modify. 24 * to modify. 44 */ 25 */ 45 unsigned long nr_to_scan; 26 unsigned long nr_to_scan; 46 27 47 /* 28 /* 48 * How many objects did scan_objects p 29 * How many objects did scan_objects process? 49 * This defaults to nr_to_scan before 30 * This defaults to nr_to_scan before every call, but the callee 50 * should track its actual progress. 31 * should track its actual progress. 51 */ 32 */ 52 unsigned long nr_scanned; 33 unsigned long nr_scanned; 53 34 54 /* current memcg being shrunk (for mem 35 /* current memcg being shrunk (for memcg aware shrinkers) */ 55 struct mem_cgroup *memcg; 36 struct mem_cgroup *memcg; 56 }; 37 }; 57 38 58 #define SHRINK_STOP (~0UL) 39 #define SHRINK_STOP (~0UL) 59 #define SHRINK_EMPTY (~0UL - 1) 40 #define SHRINK_EMPTY (~0UL - 1) 60 /* 41 /* 61 * A callback you can register to apply pressu 42 * A callback you can register to apply pressure to ageable caches. 62 * 43 * 63 * @count_objects should return the number of 44 * @count_objects should return the number of freeable items in the cache. If 64 * there are no objects to free, it should ret 45 * there are no objects to free, it should return SHRINK_EMPTY, while 0 is 65 * returned in cases of the number of freeable 46 * returned in cases of the number of freeable items cannot be determined 66 * or shrinker should skip this cache for this 47 * or shrinker should skip this cache for this time (e.g., their number 67 * is below shrinkable limit). No deadlock che 48 * is below shrinkable limit). No deadlock checks should be done during the 68 * count callback - the shrinker relies on agg 49 * count callback - the shrinker relies on aggregating scan counts that couldn't 69 * be executed due to potential deadlocks to b 50 * be executed due to potential deadlocks to be run at a later call when the 70 * deadlock condition is no longer pending. 51 * deadlock condition is no longer pending. 71 * 52 * 72 * @scan_objects will only be called if @count 53 * @scan_objects will only be called if @count_objects returned a non-zero 73 * value for the number of freeable objects. T 54 * value for the number of freeable objects. The callout should scan the cache 74 * and attempt to free items from the cache. I 55 * and attempt to free items from the cache. It should then return the number 75 * of objects freed during the scan, or SHRINK 56 * of objects freed during the scan, or SHRINK_STOP if progress cannot be made 76 * due to potential deadlocks. If SHRINK_STOP 57 * due to potential deadlocks. If SHRINK_STOP is returned, then no further 77 * attempts to call the @scan_objects will be 58 * attempts to call the @scan_objects will be made from the current reclaim 78 * context. 59 * context. 79 * 60 * 80 * @flags determine the shrinker abilities, li 61 * @flags determine the shrinker abilities, like numa awareness 81 */ 62 */ 82 struct shrinker { 63 struct shrinker { 83 unsigned long (*count_objects)(struct 64 unsigned long (*count_objects)(struct shrinker *, 84 struct 65 struct shrink_control *sc); 85 unsigned long (*scan_objects)(struct s 66 unsigned long (*scan_objects)(struct shrinker *, 86 struct s 67 struct shrink_control *sc); 87 68 88 long batch; /* reclaim batch size, 69 long batch; /* reclaim batch size, 0 = default */ 89 int seeks; /* seeks to recreate a 70 int seeks; /* seeks to recreate an obj */ 90 unsigned flags; 71 unsigned flags; 91 72 92 /* << 93 * The reference count of this shrinke << 94 * initial refcount of 1, then the loo << 95 * to use it via shrinker_try_get(). L << 96 * the initial refcount will be discar << 97 * asynchronously via RCU after its re << 98 */ << 99 refcount_t refcount; << 100 struct completion done; /* use to wait << 101 struct rcu_head rcu; << 102 << 103 void *private_data; << 104 << 105 /* These are for internal use */ 73 /* These are for internal use */ 106 struct list_head list; 74 struct list_head list; 107 #ifdef CONFIG_MEMCG 75 #ifdef CONFIG_MEMCG 108 /* ID in shrinker_idr */ 76 /* ID in shrinker_idr */ 109 int id; 77 int id; 110 #endif 78 #endif 111 #ifdef CONFIG_SHRINKER_DEBUG 79 #ifdef CONFIG_SHRINKER_DEBUG 112 int debugfs_id; 80 int debugfs_id; 113 const char *name; 81 const char *name; 114 struct dentry *debugfs_entry; 82 struct dentry *debugfs_entry; 115 #endif 83 #endif 116 /* objs pending delete, per node */ 84 /* objs pending delete, per node */ 117 atomic_long_t *nr_deferred; 85 atomic_long_t *nr_deferred; 118 }; 86 }; 119 #define DEFAULT_SEEKS 2 /* A good number if yo 87 #define DEFAULT_SEEKS 2 /* A good number if you don't know better. */ 120 88 121 /* Internal flags */ !! 89 /* Flags */ 122 #define SHRINKER_REGISTERED BIT(0) !! 90 #define SHRINKER_REGISTERED (1 << 0) 123 #define SHRINKER_ALLOCATED BIT(1) !! 91 #define SHRINKER_NUMA_AWARE (1 << 1) 124 !! 92 #define SHRINKER_MEMCG_AWARE (1 << 2) 125 /* Flags for users to use */ << 126 #define SHRINKER_NUMA_AWARE BIT(2) << 127 #define SHRINKER_MEMCG_AWARE BIT(3) << 128 /* 93 /* 129 * It just makes sense when the shrinker is al 94 * It just makes sense when the shrinker is also MEMCG_AWARE for now, 130 * non-MEMCG_AWARE shrinker should not have th 95 * non-MEMCG_AWARE shrinker should not have this flag set. 131 */ 96 */ 132 #define SHRINKER_NONSLAB BIT(4) !! 97 #define SHRINKER_NONSLAB (1 << 3) 133 98 134 __printf(2, 3) !! 99 extern int __printf(2, 3) prealloc_shrinker(struct shrinker *shrinker, 135 struct shrinker *shrinker_alloc(unsigned int f !! 100 const char *fmt, ...); 136 void shrinker_register(struct shrinker *shrink !! 101 extern void register_shrinker_prepared(struct shrinker *shrinker); 137 void shrinker_free(struct shrinker *shrinker); !! 102 extern int __printf(2, 3) register_shrinker(struct shrinker *shrinker, 138 !! 103 const char *fmt, ...); 139 static inline bool shrinker_try_get(struct shr !! 104 extern void unregister_shrinker(struct shrinker *shrinker); 140 { !! 105 extern void free_prealloced_shrinker(struct shrinker *shrinker); 141 return refcount_inc_not_zero(&shrinker !! 106 extern void synchronize_shrinkers(void); 142 } << 143 << 144 static inline void shrinker_put(struct shrinke << 145 { << 146 if (refcount_dec_and_test(&shrinker->r << 147 complete(&shrinker->done); << 148 } << 149 107 150 #ifdef CONFIG_SHRINKER_DEBUG 108 #ifdef CONFIG_SHRINKER_DEBUG >> 109 extern int shrinker_debugfs_add(struct shrinker *shrinker); >> 110 extern struct dentry *shrinker_debugfs_remove(struct shrinker *shrinker); 151 extern int __printf(2, 3) shrinker_debugfs_ren 111 extern int __printf(2, 3) shrinker_debugfs_rename(struct shrinker *shrinker, 152 112 const char *fmt, ...); 153 #else /* CONFIG_SHRINKER_DEBUG */ 113 #else /* CONFIG_SHRINKER_DEBUG */ >> 114 static inline int shrinker_debugfs_add(struct shrinker *shrinker) >> 115 { >> 116 return 0; >> 117 } >> 118 static inline struct dentry *shrinker_debugfs_remove(struct shrinker *shrinker) >> 119 { >> 120 return NULL; >> 121 } 154 static inline __printf(2, 3) 122 static inline __printf(2, 3) 155 int shrinker_debugfs_rename(struct shrinker *s 123 int shrinker_debugfs_rename(struct shrinker *shrinker, const char *fmt, ...) 156 { 124 { 157 return 0; 125 return 0; 158 } 126 } 159 #endif /* CONFIG_SHRINKER_DEBUG */ 127 #endif /* CONFIG_SHRINKER_DEBUG */ 160 #endif /* _LINUX_SHRINKER_H */ 128 #endif /* _LINUX_SHRINKER_H */ 161 129
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.