From: Waiman Long Date: Wed, 2 Jun 2021 03:52:13 +0000 (+1000) Subject: mm/memcontrol.c: fix potential uninitialized variable warning X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=4d3746755aafb98faf31c08e21ab7859fc830707;p=users%2Fjedix%2Flinux-maple.git mm/memcontrol.c: fix potential uninitialized variable warning If the -Wno-maybe-uninitialized gcc option is not specified, compilation of memcontrol.c may generate the following warnings: mm/memcontrol.c: In function `refill_obj_stock': ./arch/x86/include/asm/irqflags.h:127:17: warning: `flags' may be used uninitialized in this function [-Wmaybe-uninitialized] return !(flags & X86_EFLAGS_IF); ~~~~~~~^~~~~~~~~~~~~~~~ mm/memcontrol.c:3216:16: note: `flags' was declared here unsigned long flags; ^~~~~ In file included from mm/memcontrol.c:29: mm/memcontrol.c: In function `uncharge_page': ./include/linux/memcontrol.h:797:2: warning: `objcg' may be used uninitialized in this function [-Wmaybe-uninitialized] percpu_ref_put(&objcg->refcnt); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Fix that by properly initializing *pflags in get_obj_stock() and introducing a use_objcg bool variable in uncharge_page() to avoid potentially accessing the struct page data twice. Link: https://lkml.kernel.org/r/20210526193602.8742-1-longman@redhat.com Signed-off-by: Waiman Long Cc: Johannes Weiner Cc: Michal Hocko Cc: Vladimir Davydov Cc: Muchun Song Signed-off-by: Andrew Morton Signed-off-by: Stephen Rothwell --- diff --git a/mm/memcontrol.c b/mm/memcontrol.c index e40d75ee1acef..97f76ce04eaee 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -2115,6 +2115,7 @@ static inline struct obj_stock *get_obj_stock(unsigned long *pflags) struct memcg_stock_pcp *stock; if (likely(in_task())) { + *pflags = 0UL; preempt_disable(); stock = this_cpu_ptr(&memcg_stock); return &stock->task_obj; @@ -6832,6 +6833,7 @@ static void uncharge_page(struct page *page, struct uncharge_gather *ug) unsigned long nr_pages; struct mem_cgroup *memcg; struct obj_cgroup *objcg; + bool use_objcg = PageMemcgKmem(page); VM_BUG_ON_PAGE(PageLRU(page), page); @@ -6840,7 +6842,7 @@ static void uncharge_page(struct page *page, struct uncharge_gather *ug) * page memcg or objcg at this point, we have fully * exclusive access to the page. */ - if (PageMemcgKmem(page)) { + if (use_objcg) { objcg = __page_objcg(page); /* * This get matches the put at the end of the function and @@ -6868,7 +6870,7 @@ static void uncharge_page(struct page *page, struct uncharge_gather *ug) nr_pages = compound_nr(page); - if (PageMemcgKmem(page)) { + if (use_objcg) { ug->nr_memory += nr_pages; ug->nr_kmem += nr_pages;