• David Hildenbrand's avatar
    device-dax: add memory via add_memory_driver_managed() · 8a725e46
    David Hildenbrand authored
    Currently, when adding memory, we create entries in /sys/firmware/memmap/
    as "System RAM".  This will lead to kexec-tools to add that memory to the
    fixed-up initial memmap for a kexec kernel (loaded via kexec_load()).  The
    memory will be considered initial System RAM by the kexec'd kernel and can
    no longer be reconfigured.  This is not what happens during a real reboot.
    
    Let's add our memory via add_memory_driver_managed() now, so we won't
    create entries in /sys/firmware/memmap/ and indicate the memory as "System
    RAM (kmem)" in /proc/iomem.  This allows everybody (especially
    kexec-tools) to identify that this memory is special and has to be treated
    differently than ordinary (hotplugged) System RAM.
    
    Before configuring the namespace:
    	[root@localhost ~]# cat /proc/iomem
    	...
    	140000000-33fffffff : Persistent Memory
    	  140000000-33fffffff : namespace0.0
    	3280000000-32ffffffff : PCI Bus 0000:00
    
    After configuring the namespace:
    	[root@localhost ~]# cat /proc/iomem
    	...
    	140000000-33fffffff : Persistent Memory
    	  140000000-1481fffff : namespace0.0
    	  148200000-33fffffff : dax0.0
    	3280000000-32ffffffff : PCI Bus 0000:00
    
    After loading kmem before this change:
    	[root@localhost ~]# cat /proc/iomem
    	...
    	140000000-33fffffff : Persistent Memory
    	  140000000-1481fffff : namespace0.0
    	  150000000-33fffffff : dax0.0
    	    150000000-33fffffff : System RAM
    	3280000000-32ffffffff : PCI Bus 0000:00
    
    After loading kmem after this change:
    	[root@localhost ~]# cat /proc/iomem
    	...
    	140000000-33fffffff : Persistent Memory
    	  140000000-1481fffff : namespace0.0
    	  150000000-33fffffff : dax0.0
    	    150000000-33fffffff : System RAM (kmem)
    	3280000000-32ffffffff : PCI Bus 0000:00
    
    After a proper reboot:
    	[root@localhost ~]# cat /proc/iomem
    	...
    	140000000-33fffffff : Persistent Memory
    	  140000000-1481fffff : namespace0.0
    	  148200000-33fffffff : dax0.0
    	3280000000-32ffffffff : PCI Bus 0000:00
    
    Within the kexec kernel before this change:
    	[root@localhost ~]# cat /proc/iomem
    	...
    	140000000-33fffffff : Persistent Memory
    	  140000000-1481fffff : namespace0.0
    	  150000000-33fffffff : System RAM
    	3280000000-32ffffffff : PCI Bus 0000:00
    
    Within the kexec kernel after this change:
    	[root@localhost ~]# cat /proc/iomem
    	...
    	140000000-33fffffff : Persistent Memory
    	  140000000-1481fffff : namespace0.0
    	  148200000-33fffffff : dax0.0
    	3280000000-32ffffffff : PCI Bus 0000:00
    
    /sys/firmware/memmap/ before this change:
    	0000000000000000-000000000009fc00 (System RAM)
    	000000000009fc00-00000000000a0000 (Reserved)
    	00000000000f0000-0000000000100000 (Reserved)
    	0000000000100000-00000000bffdf000 (System RAM)
    	00000000bffdf000-00000000c0000000 (Reserved)
    	00000000feffc000-00000000ff000000 (Reserved)
    	00000000fffc0000-0000000100000000 (Reserved)
    	0000000100000000-0000000140000000 (System RAM)
    	0000000150000000-0000000340000000 (System RAM)
    
    /sys/firmware/memmap/ after a proper reboot:
    	0000000000000000-000000000009fc00 (System RAM)
    	000000000009fc00-00000000000a0000 (Reserved)
    	00000000000f0000-0000000000100000 (Reserved)
    	0000000000100000-00000000bffdf000 (System RAM)
    	00000000bffdf000-00000000c0000000 (Reserved)
    	00000000feffc000-00000000ff000000 (Reserved)
    	00000000fffc0000-0000000100000000 (Reserved)
    	0000000100000000-0000000140000000 (System RAM)
    
    /sys/firmware/memmap/ after this change:
    	0000000000000000-000000000009fc00 (System RAM)
    	000000000009fc00-00000000000a0000 (Reserved)
    	00000000000f0000-0000000000100000 (Reserved)
    	0000000000100000-00000000bffdf000 (System RAM)
    	00000000bffdf000-00000000c0000000 (Reserved)
    	00000000feffc000-00000000ff000000 (Reserved)
    	00000000fffc0000-0000000100000000 (Reserved)
    	0000000100000000-0000000140000000 (System RAM)
    
    kexec-tools already seem to basically ignore any System RAM that's not on
    top level when searching for areas to place kexec images - but also for
    determining crash areas to dump via kdump.  Changing the resource name
    won't have an impact.
    
    Handle unloading of the driver after memory hotremove failed properly, by
    duplicating the string if necessary.
    Signed-off-by: default avatarDavid Hildenbrand <david@redhat.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Acked-by: default avatarPankaj Gupta <pankaj.gupta.linux@gmail.com>
    Cc: Michal Hocko <mhocko@suse.com>
    Cc: Pankaj Gupta <pankaj.gupta.linux@gmail.com>
    Cc: Wei Yang <richard.weiyang@gmail.com>
    Cc: Baoquan He <bhe@redhat.com>
    Cc: Dave Hansen <dave.hansen@linux.intel.com>
    Cc: Eric Biederman <ebiederm@xmission.com>
    Cc: Pavel Tatashin <pasha.tatashin@soleen.com>
    Cc: Dan Williams <dan.j.williams@intel.com>
    Link: http://lkml.kernel.org/r/20200508084217.9160-5-david@redhat.comSigned-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    8a725e46
kmem.c 4.74 KB