Thread (3 messages) 3 messages, 2 authors, 2021-02-04

Re: [External] Re: [PATCH] mm: memcontrol: replace the loop with a list_for_each_entry()

From: Muchun Song <hidden>
Date: 2021-02-04 15:58:24
Also in: cgroups, lkml

On Thu, Feb 4, 2021 at 11:14 PM Johannes Weiner [off-list ref] wrote:
On Thu, Feb 04, 2021 at 06:53:20PM +0800, Muchun Song wrote:
quoted
The rule of list walk has gone since:

 commit a9d5adeeb4b2 ("mm/memcontrol: allow to uncharge page without using page->lru field")

So remove the strange comment and replace the loop with a
list_for_each_entry().

Signed-off-by: Muchun Song <redacted>
---
 mm/memcontrol.c | 17 ++---------------
 1 file changed, 2 insertions(+), 15 deletions(-)
diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index 6c7f1ea3955e..43341bd7ea1c 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -6891,24 +6891,11 @@ static void uncharge_page(struct page *page, struct uncharge_gather *ug)
 static void uncharge_list(struct list_head *page_list)
 {
      struct uncharge_gather ug;
-     struct list_head *next;
+     struct page *page;

      uncharge_gather_clear(&ug);
-
-     /*
-      * Note that the list can be a single page->lru; hence the
-      * do-while loop instead of a simple list_for_each_entry().
-      */
-     next = page_list->next;
-     do {
-             struct page *page;
-
-             page = list_entry(next, struct page, lru);
-             next = page->lru.next;
-
+     list_for_each_entry(page, page_list, lru)
              uncharge_page(page, &ug);
-     } while (next != page_list);
-
      uncharge_batch(&ug);
Good catch, this makes things much simpler.

Looking at the surrounding code, there also seems to be no reason
anymore to have uncharge_list() as a separate function: there is only
one caller after the mentioned commit, and it's trivial after your
change. Would you mind folding it into mem_cgroup_uncharge_list()?
Will do. Thanks.
The list_empty() check in that one is also unnecessary now: the
do-while loop required at least one page to be on the list or it would
crash, but list_for_each() will be just fine on an empty list.
Right. It makes things more simple.
Thanks
  
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help