Blame view

include/linux/shrinker.h 2.4 KB
b0d40c92a   Dave Chinner   superblock: intro...
1
2
3
4
5
6
  #ifndef _LINUX_SHRINKER_H
  #define _LINUX_SHRINKER_H
  
  /*
   * This struct is used to pass information from page reclaim to the shrinkers.
   * We consolidate the values for easier extention later.
24f7c6b98   Dave Chinner   mm: new shrinker API
7
8
9
   *
   * The 'gfpmask' refers to the allocation we are currently trying to
   * fulfil.
b0d40c92a   Dave Chinner   superblock: intro...
10
11
12
   */
  struct shrink_control {
  	gfp_t gfp_mask;
a0b02131c   Dave Chinner   shrinker: Kill ol...
13
14
15
16
17
  	/*
  	 * How many objects scan_objects should scan and try to reclaim.
  	 * This is reset before every call, so it is safe for callees
  	 * to modify.
  	 */
b0d40c92a   Dave Chinner   superblock: intro...
18
  	unsigned long nr_to_scan;
0ce3d7445   Dave Chinner   shrinker: add nod...
19

1d3d4437e   Glauber Costa   vmscan: per-node ...
20
21
  	/* current node being shrunk (for NUMA aware shrinkers) */
  	int nid;
cb731d6c6   Vladimir Davydov   vmscan: per memor...
22
23
24
  
  	/* current memcg being shrunk (for memcg aware shrinkers) */
  	struct mem_cgroup *memcg;
b0d40c92a   Dave Chinner   superblock: intro...
25
  };
24f7c6b98   Dave Chinner   mm: new shrinker API
26
  #define SHRINK_STOP (~0UL)
b0d40c92a   Dave Chinner   superblock: intro...
27
28
29
  /*
   * A callback you can register to apply pressure to ageable caches.
   *
24f7c6b98   Dave Chinner   mm: new shrinker API
30
31
32
33
34
35
   * @count_objects should return the number of freeable items in the cache. If
   * there are no objects to free or the number of freeable items cannot be
   * determined, it should return 0. No deadlock checks should be done during the
   * count callback - the shrinker relies on aggregating scan counts that couldn't
   * be executed due to potential deadlocks to be run at a later call when the
   * deadlock condition is no longer pending.
b0d40c92a   Dave Chinner   superblock: intro...
36
   *
24f7c6b98   Dave Chinner   mm: new shrinker API
37
38
39
40
41
42
43
   * @scan_objects will only be called if @count_objects returned a non-zero
   * value for the number of freeable objects. The callout should scan the cache
   * and attempt to free items from the cache. It should then return the number
   * of objects freed during the scan, or SHRINK_STOP if progress cannot be made
   * due to potential deadlocks. If SHRINK_STOP is returned, then no further
   * attempts to call the @scan_objects will be made from the current reclaim
   * context.
1d3d4437e   Glauber Costa   vmscan: per-node ...
44
45
   *
   * @flags determine the shrinker abilities, like numa awareness
b0d40c92a   Dave Chinner   superblock: intro...
46
47
   */
  struct shrinker {
24f7c6b98   Dave Chinner   mm: new shrinker API
48
49
50
51
  	unsigned long (*count_objects)(struct shrinker *,
  				       struct shrink_control *sc);
  	unsigned long (*scan_objects)(struct shrinker *,
  				      struct shrink_control *sc);
b0d40c92a   Dave Chinner   superblock: intro...
52
53
  	int seeks;	/* seeks to recreate an obj */
  	long batch;	/* reclaim batch size, 0 = default */
1d3d4437e   Glauber Costa   vmscan: per-node ...
54
  	unsigned long flags;
b0d40c92a   Dave Chinner   superblock: intro...
55
56
57
  
  	/* These are for internal use */
  	struct list_head list;
1d3d4437e   Glauber Costa   vmscan: per-node ...
58
59
  	/* objs pending delete, per node */
  	atomic_long_t *nr_deferred;
b0d40c92a   Dave Chinner   superblock: intro...
60
61
  };
  #define DEFAULT_SEEKS 2 /* A good number if you don't know better. */
1d3d4437e   Glauber Costa   vmscan: per-node ...
62
63
  
  /* Flags */
cb731d6c6   Vladimir Davydov   vmscan: per memor...
64
65
  #define SHRINKER_NUMA_AWARE	(1 << 0)
  #define SHRINKER_MEMCG_AWARE	(1 << 1)
1d3d4437e   Glauber Costa   vmscan: per-node ...
66
67
  
  extern int register_shrinker(struct shrinker *);
b0d40c92a   Dave Chinner   superblock: intro...
68
69
  extern void unregister_shrinker(struct shrinker *);
  #endif