• Minchan Kim's avatar
    zram: do not free pool->size_class · 3189c820
    Minchan Kim authored
    Mike reported kernel goes oops with ltp:zram03 testcase.
    
      zram: Added device: zram0
      zram0: detected capacity change from 0 to 107374182400
      BUG: unable to handle kernel paging request at 0000306d61727a77
      IP: zs_map_object+0xb9/0x260
      PGD 0
      P4D 0
      Oops: 0000 [#1] SMP
      Dumping ftrace buffer:
         (ftrace buffer empty)
      Modules linked in: zram(E) xfs(E) libcrc32c(E) btrfs(E) xor(E) raid6_pq(E) loop(E) ebtable_filter(E) ebtables(E) ip6table_filter(E) ip6_tables(E) iptable_filter(E) ip_tables(E) x_tables(E) af_packet(E) br_netfilter(E) bridge(E) stp(E) llc(E) iscsi_ibft(E) iscsi_boot_sysfs(E) nls_iso8859_1(E) nls_cp437(E) vfat(E) fat(E) intel_powerclamp(E) coretemp(E) cdc_ether(E) kvm_intel(E) usbnet(E) mii(E) kvm(E) irqbypass(E) crct10dif_pclmul(E) crc32_pclmul(E) crc32c_intel(E) iTCO_wdt(E) ghash_clmulni_intel(E) bnx2(E) iTCO_vendor_support(E) pcbc(E) ioatdma(E) ipmi_ssif(E) aesni_intel(E) i5500_temp(E) i2c_i801(E) aes_x86_64(E) lpc_ich(E) shpchp(E) mfd_core(E) crypto_simd(E) i7core_edac(E) dca(E) glue_helper(E) cryptd(E) ipmi_si(E) button(E) acpi_cpufreq(E) ipmi_devintf(E) pcspkr(E) ipmi_msghandler(E)
       nfsd(E) auth_rpcgss(E) nfs_acl(E) lockd(E) grace(E) sunrpc(E) ext4(E) crc16(E) mbcache(E) jbd2(E) sd_mod(E) ata_generic(E) i2c_algo_bit(E) ata_piix(E) drm_kms_helper(E) ahci(E) syscopyarea(E) sysfillrect(E) libahci(E) sysimgblt(E) fb_sys_fops(E) uhci_hcd(E) ehci_pci(E) ttm(E) ehci_hcd(E) libata(E) drm(E) megaraid_sas(E) usbcore(E) sg(E) dm_multipath(E) dm_mod(E) scsi_dh_rdac(E) scsi_dh_emc(E) scsi_dh_alua(E) scsi_mod(E) efivarfs(E) autofs4(E) [last unloaded: zram]
      CPU: 6 PID: 12356 Comm: swapon Tainted: G            E   4.13.0.g87b2c3fc-default #194
      Hardware name: IBM System x3550 M3 -[7944K3G]-/69Y5698     , BIOS -[D6E150AUS-1.10]- 12/15/2010
      task: ffff880158d2c4c0 task.stack: ffffc90001680000
      RIP: 0010:zs_map_object+0xb9/0x260
      Call Trace:
       zram_bvec_rw.isra.26+0xe8/0x780 [zram]
       zram_rw_page+0x6e/0xa0 [zram]
       bdev_read_page+0x81/0xb0
       do_mpage_readpage+0x51a/0x710
       mpage_readpages+0x122/0x1a0
       blkdev_readpages+0x1d/0x20
       __do_page_cache_readahead+0x1b2/0x270
       ondemand_readahead+0x180/0x2c0
       page_cache_sync_readahead+0x31/0x50
       generic_file_read_iter+0x7e7/0xaf0
       blkdev_read_iter+0x37/0x40
       __vfs_read+0xce/0x140
       vfs_read+0x9e/0x150
       SyS_read+0x46/0xa0
       entry_SYSCALL_64_fastpath+0x1a/0xa5
      Code: 81 e6 00 c0 3f 00 81 fe 00 00 16 00 0f 85 9f 01 00 00 0f b7 13 65 ff 05 5e 07 dc 7e 66 c1 ea 02 81 e2 ff 01 00 00 49 8b 54 d4 08 <8b> 4a 48 41 0f af ce 81 e1 ff 0f 00 00 41 89 c9 48 c7 c3 a0 70
      RIP: zs_map_object+0xb9/0x260 RSP: ffffc90001683988
      CR2: 0000306d61727a77
    
    He bisected the problem is [1].
    
    After commit cf8e0fed ("mm/zsmalloc: simplify zs_max_alloc_size
    handling"), zram doesn't use double pointer for pool->size_class any
    more in zs_create_pool so counter function zs_destroy_pool don't need to
    free it, either.
    
    Otherwise, it does kfree wrong address and then, kernel goes Oops.
    
    Link: http://lkml.kernel.org/r/20170725062650.GA12134@bbox
    Fixes: cf8e0fed ("mm/zsmalloc: simplify zs_max_alloc_size handling")
    Signed-off-by: default avatarMinchan Kim <minchan@kernel.org>
    Reported-by: default avatarMike Galbraith <efault@gmx.de>
    Tested-by: default avatarMike Galbraith <efault@gmx.de>
    Reviewed-by: default avatarSergey Senozhatsky <sergey.senozhatsky@gmail.com>
    Cc: Jerome Marchand <jmarchan@redhat.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    3189c820
zsmalloc.c 58.9 KB