aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux
diff options
context:
space:
mode:
authorGlauber Costa <glommer@openvz.org>2013-08-27 20:18:02 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2013-09-10 18:56:30 -0400
commit6a4f496fd2fc74fa036732ae52c184952d6e3e37 (patch)
treef0d68cd73062f87b54f070756775fd022fdf865e /include/linux
parent5cedf721a7cdb54e9222133516c916210d836470 (diff)
list_lru: per-node API
This patch adapts the list_lru API to accept an optional node argument, to be used by NUMA aware shrinking functions. Code that does not care about the NUMA placement of objects can still call into the very same functions as before. They will simply iterate over all nodes. Signed-off-by: Glauber Costa <glommer@openvz.org> Cc: Dave Chinner <dchinner@redhat.com> Cc: Mel Gorman <mgorman@suse.de> Cc: "Theodore Ts'o" <tytso@mit.edu> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Al Viro <viro@zeniv.linux.org.uk> Cc: Artem Bityutskiy <artem.bityutskiy@linux.intel.com> Cc: Arve Hjønnevåg <arve@android.com> Cc: Carlos Maiolino <cmaiolino@redhat.com> Cc: Christoph Hellwig <hch@lst.de> Cc: Chuck Lever <chuck.lever@oracle.com> Cc: Daniel Vetter <daniel.vetter@ffwll.ch> Cc: David Rientjes <rientjes@google.com> Cc: Gleb Natapov <gleb@redhat.com> Cc: Greg Thelen <gthelen@google.com> Cc: J. Bruce Fields <bfields@redhat.com> Cc: Jan Kara <jack@suse.cz> Cc: Jerome Glisse <jglisse@redhat.com> Cc: John Stultz <john.stultz@linaro.org> Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> Cc: Kent Overstreet <koverstreet@google.com> Cc: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> Cc: Marcelo Tosatti <mtosatti@redhat.com> Cc: Mel Gorman <mgorman@suse.de> Cc: Steven Whitehouse <swhiteho@redhat.com> Cc: Thomas Hellstrom <thellstrom@vmware.com> Cc: Trond Myklebust <Trond.Myklebust@netapp.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'include/linux')
-rw-r--r--include/linux/list_lru.h39
1 files changed, 34 insertions, 5 deletions
diff --git a/include/linux/list_lru.h b/include/linux/list_lru.h
index f4d4cb608c02..2fe13e1a809a 100644
--- a/include/linux/list_lru.h
+++ b/include/linux/list_lru.h
@@ -75,20 +75,32 @@ bool list_lru_add(struct list_lru *lru, struct list_head *item);
75bool list_lru_del(struct list_lru *lru, struct list_head *item); 75bool list_lru_del(struct list_lru *lru, struct list_head *item);
76 76
77/** 77/**
78 * list_lru_count: return the number of objects currently held by @lru 78 * list_lru_count_node: return the number of objects currently held by @lru
79 * @lru: the lru pointer. 79 * @lru: the lru pointer.
80 * @nid: the node id to count from.
80 * 81 *
81 * Always return a non-negative number, 0 for empty lists. There is no 82 * Always return a non-negative number, 0 for empty lists. There is no
82 * guarantee that the list is not updated while the count is being computed. 83 * guarantee that the list is not updated while the count is being computed.
83 * Callers that want such a guarantee need to provide an outer lock. 84 * Callers that want such a guarantee need to provide an outer lock.
84 */ 85 */
85unsigned long list_lru_count(struct list_lru *lru); 86unsigned long list_lru_count_node(struct list_lru *lru, int nid);
87static inline unsigned long list_lru_count(struct list_lru *lru)
88{
89 long count = 0;
90 int nid;
91
92 for_each_node_mask(nid, lru->active_nodes)
93 count += list_lru_count_node(lru, nid);
94
95 return count;
96}
86 97
87typedef enum lru_status 98typedef enum lru_status
88(*list_lru_walk_cb)(struct list_head *item, spinlock_t *lock, void *cb_arg); 99(*list_lru_walk_cb)(struct list_head *item, spinlock_t *lock, void *cb_arg);
89/** 100/**
90 * list_lru_walk: walk a list_lru, isolating and disposing freeable items. 101 * list_lru_walk_node: walk a list_lru, isolating and disposing freeable items.
91 * @lru: the lru pointer. 102 * @lru: the lru pointer.
103 * @nid: the node id to scan from.
92 * @isolate: callback function that is resposible for deciding what to do with 104 * @isolate: callback function that is resposible for deciding what to do with
93 * the item currently being scanned 105 * the item currently being scanned
94 * @cb_arg: opaque type that will be passed to @isolate 106 * @cb_arg: opaque type that will be passed to @isolate
@@ -106,8 +118,25 @@ typedef enum lru_status
106 * 118 *
107 * Return value: the number of objects effectively removed from the LRU. 119 * Return value: the number of objects effectively removed from the LRU.
108 */ 120 */
109unsigned long list_lru_walk(struct list_lru *lru, list_lru_walk_cb isolate, 121unsigned long list_lru_walk_node(struct list_lru *lru, int nid,
110 void *cb_arg, unsigned long nr_to_walk); 122 list_lru_walk_cb isolate, void *cb_arg,
123 unsigned long *nr_to_walk);
124
125static inline unsigned long
126list_lru_walk(struct list_lru *lru, list_lru_walk_cb isolate,
127 void *cb_arg, unsigned long nr_to_walk)
128{
129 long isolated = 0;
130 int nid;
131
132 for_each_node_mask(nid, lru->active_nodes) {
133 isolated += list_lru_walk_node(lru, nid, isolate,
134 cb_arg, &nr_to_walk);
135 if (nr_to_walk <= 0)
136 break;
137 }
138 return isolated;
139}
111 140
112typedef void (*list_lru_dispose_cb)(struct list_head *dispose_list); 141typedef void (*list_lru_dispose_cb)(struct list_head *dispose_list);
113/** 142/**