• Minchan Kim's avatar
    mm/zsmalloc.c: drop ZSMALLOC_PGTABLE_MAPPING · e91d8d78
    Minchan Kim authored
    While I was doing zram testing, I found sometimes decompression failed
    since the compression buffer was corrupted.  With investigation, I found
    below commit calls cond_resched unconditionally so it could make a
    problem in atomic context if the task is reschedule.
    
      BUG: sleeping function called from invalid context at mm/vmalloc.c:108
      in_atomic(): 1, irqs_disabled(): 0, non_block: 0, pid: 946, name: memhog
      3 locks held by memhog/946:
       #0: ffff9d01d4b193e8 (&mm->mmap_lock#2){++++}-{4:4}, at: __mm_populate+0x103/0x160
       #1: ffffffffa3d53de0 (fs_reclaim){+.+.}-{0:0}, at: __alloc_pages_slowpath.constprop.0+0xa98/0x1160
       #2: ffff9d01d56b8110 (&zspage->lock){.+.+}-{3:3}, at: zs_map_object+0x8e/0x1f0
      CPU: 0 PID: 946 Comm: memhog Not tainted 5.9.3-00011-gc5bfc0287345-dirty #316
      Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.13.0-1 04/01/2014
      Call Trace:
        unmap_kernel_range_noflush+0x2eb/0x350
        unmap_kernel_range+0x14/0x30
        zs_unmap_object+0xd5/0xe0
        zram_bvec_rw.isra.0+0x38c/0x8e0
        zram_rw_page+0x90/0x101
        bdev_write_page+0x92/0xe0
        __swap_writepage+0x94/0x4a0
        pageout+0xe3/0x3a0
        shrink_page_list+0xb94/0xd60
        shrink_inactive_list+0x158/0x460
    
    We can fix this by removing the ZSMALLOC_PGTABLE_MAPPING feature (which
    contains the offending calling code) from zsmalloc.
    
    Even though this option showed some amount improvement(e.g., 30%) in
    some arm32 platforms, it has been headache to maintain since it have
    abused APIs[1](e.g., unmap_kernel_range in atomic context).
    
    Since we are approaching to deprecate 32bit machines and already made
    the config option available for only builtin build since v5.8, lastly it
    has been not default option in zsmalloc, it's time to drop the option
    for better maintenance.
    
    [1] http://lore.kernel.org/linux-mm/20201105170249.387069-1-minchan@kernel.org
    
    Fixes: e47110e9 ("mm/vunmap: add cond_resched() in vunmap_pmd_range")
    Signed-off-by: default avatarMinchan Kim <minchan@kernel.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Reviewed-by: default avatarSergey Senozhatsky <sergey.senozhatsky@gmail.com>
    Cc: Tony Lindgren <tony@atomide.com>
    Cc: Christoph Hellwig <hch@infradead.org>
    Cc: Harish Sriram <harish@linux.ibm.com>
    Cc: Uladzislau Rezki <urezki@gmail.com>
    Cc: <stable@vger.kernel.org>
    Link: https://lkml.kernel.org/r/20201117202916.GA3856507@google.comSigned-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    e91d8d78
zsmalloc.c 61.1 KB