Skip to content
  • Waiman Long's avatar
    mm, slab: fix sign conversion problem in memcg_uncharge_slab() · d7670879
    Waiman Long authored
    It was found that running the LTP test on a PowerPC system could produce
    erroneous values in /proc/meminfo, like:
    
      MemTotal:       531915072 kB
      MemFree:        507962176 kB
      MemAvailable:   1100020596352 kB
    
    Using bisection, the problem is tracked down to commit 9c315e4d ("mm:
    memcg/slab: cache page number in memcg_(un)charge_slab()").
    
    In memcg_uncharge_slab() with a "int order" argument:
    
      unsigned int nr_pages = 1 << order;
        :
      mod_lruvec_state(lruvec, cache_vmstat_idx(s), -nr_pages);
    
    The mod_lruvec_state() function will eventually call the
    __mod_zone_page_state() which accepts a long argument.  Depending on the
    compiler and how inlining is done, "-nr_pages" may be treated as a
    negative number or a very large positive number.  Apparently, it was
    treated as a large positive number in that PowerPC system leading to
    incorrect stat counts.  This problem hasn't been seen in x86-64 yet,
    perhaps the gcc compiler there has some slight difference in behavior.
    
    It is fixed by making nr_pages a signed value.  For consistency, a similar
    change is applied to memcg_charge_slab() as well.
    
    Link: http://lkml.kernel.org/r/20200620184719.10994-1-longman@redhat.com
    Fixes: 9c315e4d
    
     ("mm: memcg/slab: cache page number in memcg_(un)charge_slab()").
    Signed-off-by: default avatarWaiman Long <longman@redhat.com>
    Acked-by: default avatarRoman Gushchin <guro@fb.com>
    Cc: Christoph Lameter <cl@linux.com>
    Cc: Pekka Enberg <penberg@kernel.org>
    Cc: David Rientjes <rientjes@google.com>
    Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com>
    Cc: Shakeel Butt <shakeelb@google.com>
    Cc: Johannes Weiner <hannes@cmpxchg.org>
    Cc: Michal Hocko <mhocko@kernel.org>
    Cc: Vladimir Davydov <vdavydov.dev@gmail.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    d7670879