]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
mm/memcontrol.c: fix potential uninitialized variable warning
authorWaiman Long <longman@redhat.com>
Wed, 2 Jun 2021 03:52:13 +0000 (13:52 +1000)
committerStephen Rothwell <sfr@canb.auug.org.au>
Wed, 2 Jun 2021 03:52:13 +0000 (13:52 +1000)
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 <longman@redhat.com>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: Michal Hocko <mhocko@kernel.org>
Cc: Vladimir Davydov <vdavydov.dev@gmail.com>
Cc: Muchun Song <songmuchun@bytedance.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Stephen Rothwell <sfr@canb.auug.org.au>
mm/memcontrol.c

index e40d75ee1acef0c9471ed3a4d95c7e01aace6218..97f76ce04eaeece5f997b38e3a618947f48bf2ed 100644 (file)
@@ -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;