• Rokudo Yan's avatar
    zsmalloc: account the number of compacted pages correctly · 23959281
    Rokudo Yan authored
    There exists multiple path may do zram compaction concurrently.
    1. auto-compaction triggered during memory reclaim
    2. userspace utils write zram<id>/compaction node
    
    So, multiple threads may call zs_shrinker_scan/zs_compact concurrently.
    But pages_compacted is a per zsmalloc pool variable and modification
    of the variable is not serialized(through under class->lock).
    There are two issues here:
    1. the pages_compacted may not equal to total number of pages
    freed(due to concurrently add).
    2. zs_shrinker_scan may not return the correct number of pages
    freed(issued by current shrinker).
    
    The fix is simple:
    1. account the number of pages freed in zs_compact locally.
    2. use actomic variable pages_compacted to accumulate total number.
    
    Link: https://lkml.kernel.org/r/20210202122235.26885-1-wu-yan@tcl.com
    Fixes: 860c707d ("zsmalloc: account the number of compacted pages")
    Signed-off-by: default avatarRokudo Yan <wu-yan@tcl.com>
    Cc: Minchan Kim <minchan@kernel.org>
    Cc: Sergey Senozhatsky <sergey.senozhatsky@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>
    23959281
zsmalloc.c 61.1 KB