[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20210405203711.1095940-2-rick.p.edgecombe@intel.com>
Date: Mon, 5 Apr 2021 13:37:09 -0700
From: Rick Edgecombe <rick.p.edgecombe@...el.com>
To: akpm@...ux-foundation.org, linux-mm@...ck.org, bpf@...r.kernel.org,
dave.hansen@...ux.intel.com, peterz@...radead.org, luto@...nel.org,
jeyu@...nel.org
Cc: linux-kernel@...r.kernel.org, ast@...nel.org, daniel@...earbox.net,
andrii@...nel.org, hch@...radead.org, x86@...nel.org,
Rick Edgecombe <rick.p.edgecombe@...el.com>
Subject: [RFC 1/3] list: Support getting most recent element in list_lru
In future patches, some functionality will use list_lru that also needs
to keep track of the most recently used element on a node. Since this
information is already contained within list_lru, add a function to get
it so that an additional list is not needed in the caller.
Do not support memcg aware list_lru's since it is not needed by the
intended caller.
Signed-off-by: Rick Edgecombe <rick.p.edgecombe@...el.com>
---
include/linux/list_lru.h | 13 +++++++++++++
mm/list_lru.c | 28 ++++++++++++++++++++++++++++
2 files changed, 41 insertions(+)
diff --git a/include/linux/list_lru.h b/include/linux/list_lru.h
index 9dcaa3e582c9..4bde44a5024b 100644
--- a/include/linux/list_lru.h
+++ b/include/linux/list_lru.h
@@ -103,6 +103,19 @@ 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_get_mru: gets and removes the tail from one of the node lists
+ * @list_lru: the lru pointer
+ * @nid: the node id
+ *
+ * This function removes the most recently added item from one of the node
+ * id specified. This function should not be used if the list_lru is memcg
+ * aware.
+ *
+ * Return value: The element removed
+ */
+struct list_head *list_lru_get_mru(struct list_lru *lru, int nid);
+
/**
* list_lru_count_one: return the number of objects currently held by @lru
* @lru: the lru pointer.
diff --git a/mm/list_lru.c b/mm/list_lru.c
index fe230081690b..a18d9ed8abd5 100644
--- a/mm/list_lru.c
+++ b/mm/list_lru.c
@@ -156,6 +156,34 @@ bool list_lru_del(struct list_lru *lru, struct list_head *item)
}
EXPORT_SYMBOL_GPL(list_lru_del);
+struct list_head *list_lru_get_mru(struct list_lru *lru, int nid)
+{
+ struct list_lru_node *nlru = &lru->node[nid];
+ struct list_lru_one *l = &nlru->lru;
+ struct list_head *ret;
+
+ /* This function does not attempt to search through the memcg lists */
+ if (list_lru_memcg_aware(lru)) {
+ WARN_ONCE(1, "list_lru: %s not supported on memcg aware list_lrus", __func__);
+ return NULL;
+ }
+
+ spin_lock(&nlru->lock);
+ if (list_empty(&l->list)) {
+ ret = NULL;
+ } else {
+ /* Get tail */
+ ret = l->list.prev;
+ list_del_init(ret);
+
+ l->nr_items--;
+ nlru->nr_items--;
+ }
+ spin_unlock(&nlru->lock);
+
+ return ret;
+}
+
void list_lru_isolate(struct list_lru_one *list, struct list_head *item)
{
list_del_init(item);
--
2.29.2
Powered by blists - more mailing lists