lkml.org 
[lkml]   [2021]   [Aug]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[RFC PATCH v2 01/19] list: Support getting most recent element in list_lru
    Date
    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@intel.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 1b5fceb565df..08e07c19fd13 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 cd58790d0fb3..c1bec58168e1 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.17.1
    \
     
     \ /
      Last update: 2021-08-31 02:01    [W:5.007 / U:0.020 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site