Skip to content

Commit 6a4f496

Browse files
Glauber CostaAl Viro
authored andcommitted
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>
1 parent 5cedf72 commit 6a4f496

File tree

2 files changed

+43
-33
lines changed

2 files changed

+43
-33
lines changed

include/linux/list_lru.h

Lines changed: 34 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -75,20 +75,32 @@ bool list_lru_add(struct list_lru *lru, struct list_head *item);
7575
bool list_lru_del(struct list_lru *lru, struct list_head *item);
7676

7777
/**
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
7979
* @lru: the lru pointer.
80+
* @nid: the node id to count from.
8081
*
8182
* Always return a non-negative number, 0 for empty lists. There is no
8283
* guarantee that the list is not updated while the count is being computed.
8384
* Callers that want such a guarantee need to provide an outer lock.
8485
*/
85-
unsigned long list_lru_count(struct list_lru *lru);
86+
unsigned long list_lru_count_node(struct list_lru *lru, int nid);
87+
static 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+
}
8697

8798
typedef enum lru_status
8899
(*list_lru_walk_cb)(struct list_head *item, spinlock_t *lock, void *cb_arg);
89100
/**
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.
91102
* @lru: the lru pointer.
103+
* @nid: the node id to scan from.
92104
* @isolate: callback function that is resposible for deciding what to do with
93105
* the item currently being scanned
94106
* @cb_arg: opaque type that will be passed to @isolate
@@ -106,8 +118,25 @@ typedef enum lru_status
106118
*
107119
* Return value: the number of objects effectively removed from the LRU.
108120
*/
109-
unsigned long list_lru_walk(struct list_lru *lru, list_lru_walk_cb isolate,
110-
void *cb_arg, unsigned long nr_to_walk);
121+
unsigned long list_lru_walk_node(struct list_lru *lru, int nid,
122+
list_lru_walk_cb isolate, void *cb_arg,
123+
unsigned long *nr_to_walk);
124+
125+
static inline unsigned long
126+
list_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+
}
111140

112141
typedef void (*list_lru_dispose_cb)(struct list_head *dispose_list);
113142
/**

mm/list_lru.c

Lines changed: 9 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -47,25 +47,22 @@ bool list_lru_del(struct list_lru *lru, struct list_head *item)
4747
}
4848
EXPORT_SYMBOL_GPL(list_lru_del);
4949

50-
unsigned long list_lru_count(struct list_lru *lru)
50+
unsigned long
51+
list_lru_count_node(struct list_lru *lru, int nid)
5152
{
5253
unsigned long count = 0;
53-
int nid;
54-
55-
for_each_node_mask(nid, lru->active_nodes) {
56-
struct list_lru_node *nlru = &lru->node[nid];
54+
struct list_lru_node *nlru = &lru->node[nid];
5755

58-
spin_lock(&nlru->lock);
59-
WARN_ON_ONCE(nlru->nr_items < 0);
60-
count += nlru->nr_items;
61-
spin_unlock(&nlru->lock);
62-
}
56+
spin_lock(&nlru->lock);
57+
WARN_ON_ONCE(nlru->nr_items < 0);
58+
count += nlru->nr_items;
59+
spin_unlock(&nlru->lock);
6360

6461
return count;
6562
}
66-
EXPORT_SYMBOL_GPL(list_lru_count);
63+
EXPORT_SYMBOL_GPL(list_lru_count_node);
6764

68-
static unsigned long
65+
unsigned long
6966
list_lru_walk_node(struct list_lru *lru, int nid, list_lru_walk_cb isolate,
7067
void *cb_arg, unsigned long *nr_to_walk)
7168
{
@@ -115,22 +112,6 @@ list_lru_walk_node(struct list_lru *lru, int nid, list_lru_walk_cb isolate,
115112
}
116113
EXPORT_SYMBOL_GPL(list_lru_walk_node);
117114

118-
unsigned long list_lru_walk(struct list_lru *lru, list_lru_walk_cb isolate,
119-
void *cb_arg, unsigned long nr_to_walk)
120-
{
121-
unsigned long isolated = 0;
122-
int nid;
123-
124-
for_each_node_mask(nid, lru->active_nodes) {
125-
isolated += list_lru_walk_node(lru, nid, isolate,
126-
cb_arg, &nr_to_walk);
127-
if (nr_to_walk <= 0)
128-
break;
129-
}
130-
return isolated;
131-
}
132-
EXPORT_SYMBOL_GPL(list_lru_walk);
133-
134115
static unsigned long list_lru_dispose_all_node(struct list_lru *lru, int nid,
135116
list_lru_dispose_cb dispose)
136117
{

0 commit comments

Comments
 (0)