• Wen Congyang's avatar
    memory-hotplug, mm/sparse.c: clear the memory to store struct page · 3ac19f8e
    Wen Congyang authored
    If sparse memory vmemmap is enabled, we can't free the memory to store
    struct page when a memory device is hotremoved, because we may store
    struct page in the memory to manage the memory which doesn't belong to
    this memory device.  When we hotadded this memory device again, we will
    reuse this memory to store struct page, and struct page may contain some
    obsolete information, and we will get bad-page state:
    
      init_memory_mapping: [mem 0x80000000-0x9fffffff]
      Built 2 zonelists in Node order, mobility grouping on.  Total pages: 547617
      Policy zone: Normal
      BUG: Bad page state in process bash  pfn:9b6dc
      page:ffffea0002200020 count:0 mapcount:0 mapping:          (null) index:0xfdfdfdfdfdfdfdfd
      page flags: 0x2fdfdfdfd5df9fd(locked|referenced|uptodate|dirty|lru|active|slab|owner_priv_1|private|private_2|writeback|head|tail|swapcache|reclaim|swapbacked|unevictable|uncached|compound_lock)
      Modules linked in: netconsole acpiphp pci_hotplug acpi_memhotplug loop kvm_amd kvm microcode tpm_tis tpm tpm_bios evdev psmouse serio_raw i2c_piix4 i2c_core parport_pc parport processor button thermal_sys ext3 jbd mbcache sg sr_mod cdrom ata_generic virtio_net ata_piix virtio_blk libata virtio_pci virtio_ring virtio scsi_mod
      Pid: 988, comm: bash Not tainted 3.6.0-rc7-guest #12
      Call Trace:
       [<ffffffff810e9b30>] ? bad_page+0xb0/0x100
       [<ffffffff810ea4c3>] ? free_pages_prepare+0xb3/0x100
       [<ffffffff810ea668>] ? free_hot_cold_page+0x48/0x1a0
       [<ffffffff8112cc08>] ? online_pages_range+0x68/0xa0
       [<ffffffff8112cba0>] ? __online_page_increment_counters+0x10/0x10
       [<ffffffff81045561>] ? walk_system_ram_range+0x101/0x110
       [<ffffffff814c4f95>] ? online_pages+0x1a5/0x2b0
       [<ffffffff8135663d>] ? __memory_block_change_state+0x20d/0x270
       [<ffffffff81356756>] ? store_mem_state+0xb6/0xf0
       [<ffffffff8119e482>] ? sysfs_write_file+0xd2/0x160
       [<ffffffff8113769a>] ? vfs_write+0xaa/0x160
       [<ffffffff81137977>] ? sys_write+0x47/0x90
       [<ffffffff814e2f25>] ? async_page_fault+0x25/0x30
       [<ffffffff814ea239>] ? system_call_fastpath+0x16/0x1b
      Disabling lock debugging due to kernel taint
    
    This patch clears the memory to store struct page to avoid unexpected error.
    Signed-off-by: default avatarWen Congyang <wency@cn.fujitsu.com>
    Cc: David Rientjes <rientjes@google.com>
    Cc: Jiang Liu <liuj97@gmail.com>
    Cc: Minchan Kim <minchan.kim@gmail.com>
    Acked-by: default avatarKOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
    Cc: Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com>
    Reported-by: default avatarVasilis Liaskovitis <vasilis.liaskovitis@profitbricks.com>
    Cc: Dave Hansen <dave@linux.vnet.ibm.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    3ac19f8e
sparse.c 20.7 KB