Skip to content
  • Pavel Tatashin's avatar
    x86/mm/memory_hotplug: determine block size based on the end of boot memory · 078eb6aa
    Pavel Tatashin authored
    Memory sections are combined into "memory block" chunks.  These chunks
    are the units upon which memory can be added and removed.
    
    On x86, the new memory may be added after the end of the boot memory,
    therefore, if block size does not align with end of boot memory, memory
    hot-plugging/hot-removing can be broken.
    
    Memory sections are combined into "memory block" chunks.  These chunks
    are the units upon which memory can be added and removed.
    
    On x86 the new memory may be added after the end of the boot memory,
    therefore, if block size does not align with end of boot memory, memory
    hotplugging/hotremoving can be broken.
    
    Currently, whenever machine is booted with more than 64G the block size
    is unconditionally increased to 2G from the base 128M.  This is done in
    order to reduce number of memory device files in sysfs:
    
    	/sys/devices/system/memory/memoryXXX
    
    We must use the largest allowed block size that aligns to the next
    address to be able to hotplug the next block of memory.
    
    So, when memory is larger or equal to 64G, we check the end address and
    find the largest block size that is still power of two but smaller or
    equal to 2G.
    
    Before, the fix:
    Run qemu with:
    -m 64G,slots=2,maxmem=66G -object memory-backend-ram,id=mem1,size=2G
    
    (qemu) device_add pc-dimm,id=dimm1,memdev=mem1
    Block size [0x80000000] unaligned hotplug range: start 0x1040000000,
    							size 0x80000000
    acpi PNP0C80:00: add_memory failed
    acpi PNP0C80:00: acpi_memory_enable_device() error
    acpi PNP0C80:00: Enumeration failure
    
    With the fix memory is added successfully as the block size is set to
    1G, and therefore aligns with start address 0x1040000000.
    
    [pasha.tatashin@oracle.com: v4]
      Link: http://lkml.kernel.org/r/20180215165920.8570-3-pasha.tatashin@oracle.com
    Link: http://lkml.kernel.org/r/20180213193159.14606-3-pasha.tatashin@oracle.com
    
    
    Signed-off-by: default avatarPavel Tatashin <pasha.tatashin@oracle.com>
    Reviewed-by: default avatarIngo Molnar <mingo@kernel.org>
    Cc: "H. Peter Anvin" <hpa@zytor.com>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Steven Sistare <steven.sistare@oracle.com>
    Cc: Daniel Jordan <daniel.m.jordan@oracle.com>
    Cc: Mel Gorman <mgorman@techsingularity.net>
    Cc: Michal Hocko <mhocko@suse.com>
    Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Cc: Vlastimil Babka <vbabka@suse.cz>
    Cc: Bharata B Rao <bharata@linux.vnet.ibm.com>
    Cc: Dan Williams <dan.j.williams@intel.com>
    Cc: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
    Cc: Baoquan He <bhe@redhat.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    078eb6aa