|
@@ -75,20 +75,32 @@ bool list_lru_add(struct list_lru *lru, struct list_head *item);
|
|
|
bool list_lru_del(struct list_lru *lru, struct list_head *item);
|
|
|
|
|
|
/**
|
|
|
- * list_lru_count: return the number of objects currently held by @lru
|
|
|
+ * list_lru_count_node: return the number of objects currently held by @lru
|
|
|
* @lru: the lru pointer.
|
|
|
+ * @nid: the node id to count from.
|
|
|
*
|
|
|
* Always return a non-negative number, 0 for empty lists. There is no
|
|
|
* guarantee that the list is not updated while the count is being computed.
|
|
|
* Callers that want such a guarantee need to provide an outer lock.
|
|
|
*/
|
|
|
-unsigned long list_lru_count(struct list_lru *lru);
|
|
|
+unsigned long list_lru_count_node(struct list_lru *lru, int nid);
|
|
|
+static inline unsigned long list_lru_count(struct list_lru *lru)
|
|
|
+{
|
|
|
+ long count = 0;
|
|
|
+ int nid;
|
|
|
+
|
|
|
+ for_each_node_mask(nid, lru->active_nodes)
|
|
|
+ count += list_lru_count_node(lru, nid);
|
|
|
+
|
|
|
+ return count;
|
|
|
+}
|
|
|
|
|
|
typedef enum lru_status
|
|
|
(*list_lru_walk_cb)(struct list_head *item, spinlock_t *lock, void *cb_arg);
|
|
|
/**
|
|
|
- * list_lru_walk: walk a list_lru, isolating and disposing freeable items.
|
|
|
+ * list_lru_walk_node: walk a list_lru, isolating and disposing freeable items.
|
|
|
* @lru: the lru pointer.
|
|
|
+ * @nid: the node id to scan from.
|
|
|
* @isolate: callback function that is resposible for deciding what to do with
|
|
|
* the item currently being scanned
|
|
|
* @cb_arg: opaque type that will be passed to @isolate
|
|
@@ -106,8 +118,25 @@ typedef enum lru_status
|
|
|
*
|
|
|
* Return value: the number of objects effectively removed from the LRU.
|
|
|
*/
|
|
|
-unsigned long list_lru_walk(struct list_lru *lru, list_lru_walk_cb isolate,
|
|
|
- void *cb_arg, unsigned long nr_to_walk);
|
|
|
+unsigned long list_lru_walk_node(struct list_lru *lru, int nid,
|
|
|
+ list_lru_walk_cb isolate, void *cb_arg,
|
|
|
+ unsigned long *nr_to_walk);
|
|
|
+
|
|
|
+static inline unsigned long
|
|
|
+list_lru_walk(struct list_lru *lru, list_lru_walk_cb isolate,
|
|
|
+ void *cb_arg, unsigned long nr_to_walk)
|
|
|
+{
|
|
|
+ long isolated = 0;
|
|
|
+ int nid;
|
|
|
+
|
|
|
+ for_each_node_mask(nid, lru->active_nodes) {
|
|
|
+ isolated += list_lru_walk_node(lru, nid, isolate,
|
|
|
+ cb_arg, &nr_to_walk);
|
|
|
+ if (nr_to_walk <= 0)
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ return isolated;
|
|
|
+}
|
|
|
|
|
|
typedef void (*list_lru_dispose_cb)(struct list_head *dispose_list);
|
|
|
/**
|