mm/page_alloc: dedupe some memcg uncharging logic
authorBrendan Jackman <jackmanb@google.com>
Wed, 8 Nov 2023 16:49:20 +0000 (16:49 +0000)
committerAndrew Morton <akpm@linux-foundation.org>
Mon, 11 Dec 2023 00:51:39 +0000 (16:51 -0800)
The duplication makes it seem like some work is required before uncharging
in the !PageHWPoison case.  But it isn't, so we can simplify the code a
little.

Note the PageMemcgKmem check is redundant, but I've left it in as it
avoids an unnecessary function call.

Link: https://lkml.kernel.org/r/20231108164920.3401565-1-jackmanb@google.com
Signed-off-by: Brendan Jackman <jackmanb@google.com>
Reviewed-by: Yosry Ahmed <yosryahmed@google.com>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: Michal Hocko <mhocko@kernel.org>
Cc: Muchun Song <muchun.song@linux.dev>
Cc: Roman Gushchin <roman.gushchin@linux.dev>
Cc: Shakeel Butt <shakeelb@google.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
mm/page_alloc.c

index 733732e7e0ba73822f079a257fdad9eddd579652..dd5e8a759d27e7961b46568ffe7b80b8eb097a90 100644 (file)
@@ -1086,13 +1086,11 @@ static __always_inline bool free_pages_prepare(struct page *page,
        trace_mm_page_free(page, order);
        kmsan_free_page(page, order);
 
+       if (memcg_kmem_online() && PageMemcgKmem(page))
+               __memcg_kmem_uncharge_page(page, order);
+
        if (unlikely(PageHWPoison(page)) && !order) {
-               /*
-                * Do not let hwpoison pages hit pcplists/buddy
-                * Untie memcg state and reset page's owner
-                */
-               if (memcg_kmem_online() && PageMemcgKmem(page))
-                       __memcg_kmem_uncharge_page(page, order);
+               /* Do not let hwpoison pages hit pcplists/buddy */
                reset_page_owner(page, order);
                page_table_check_free(page, order);
                return false;
@@ -1123,8 +1121,6 @@ static __always_inline bool free_pages_prepare(struct page *page,
        }
        if (PageMappingFlags(page))
                page->mapping = NULL;
-       if (memcg_kmem_online() && PageMemcgKmem(page))
-               __memcg_kmem_uncharge_page(page, order);
        if (is_check_pages_enabled()) {
                if (free_page_is_bad(page))
                        bad++;