mm/memblock: add physical memory list
authorPhilipp Hachtmann <phacht@linux.vnet.ibm.com>
Wed, 29 Jan 2014 17:16:01 +0000 (18:16 +0100)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Tue, 20 May 2014 06:58:39 +0000 (08:58 +0200)
Add the physmem list to the memblock structure. This list only exists
if HAVE_MEMBLOCK_PHYS_MAP is selected and contains the unmodified
list of physically available memory. It differs from the memblock
memory list as it always contains all memory ranges even if the
memory has been restricted, e.g. by use of the mem= kernel parameter.

Signed-off-by: Philipp Hachtmann <phacht@linux.vnet.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
include/linux/memblock.h
mm/Kconfig
mm/memblock.c

index f669016874b3986d17b5ce924958b48403ac1bd7..73dc382e72d8ebeccf6ac118f0f0cd643d1bb1fc 100644 (file)
@@ -18,6 +18,7 @@
 #include <linux/mm.h>
 
 #define INIT_MEMBLOCK_REGIONS  128
+#define INIT_PHYSMEM_REGIONS   4
 
 /* Definition of memblock flags. */
 #define MEMBLOCK_HOTPLUG       0x1     /* hotpluggable region */
@@ -43,6 +44,9 @@ struct memblock {
        phys_addr_t current_limit;
        struct memblock_type memory;
        struct memblock_type reserved;
+#ifdef CONFIG_HAVE_MEMBLOCK_PHYS_MAP
+       struct memblock_type physmem;
+#endif
 };
 
 extern struct memblock memblock;
index 1b5a95f0fa013ca428e877ae39d6f0148a49cd61..28cec518f4d41966c09ad26dfc42176a8cd6894b 100644 (file)
@@ -134,6 +134,9 @@ config HAVE_MEMBLOCK
 config HAVE_MEMBLOCK_NODE_MAP
        boolean
 
+config HAVE_MEMBLOCK_PHYS_MAP
+       boolean
+
 config ARCH_DISCARD_MEMBLOCK
        boolean
 
index 9edd0928daab7f6b006abab4681ddb873f953aec..a810ba923cdd5304e655fd93e69a6f796e80e417 100644 (file)
@@ -27,6 +27,9 @@
 
 static struct memblock_region memblock_memory_init_regions[INIT_MEMBLOCK_REGIONS] __initdata_memblock;
 static struct memblock_region memblock_reserved_init_regions[INIT_MEMBLOCK_REGIONS] __initdata_memblock;
+#ifdef CONFIG_HAVE_MEMBLOCK_PHYS_MAP
+static struct memblock_region memblock_physmem_init_regions[INIT_PHYSMEM_REGIONS] __initdata_memblock;
+#endif
 
 struct memblock memblock __initdata_memblock = {
        .memory.regions         = memblock_memory_init_regions,
@@ -37,6 +40,12 @@ struct memblock memblock __initdata_memblock = {
        .reserved.cnt           = 1,    /* empty dummy entry */
        .reserved.max           = INIT_MEMBLOCK_REGIONS,
 
+#ifdef CONFIG_HAVE_MEMBLOCK_PHYS_MAP
+       .physmem.regions        = memblock_physmem_init_regions,
+       .physmem.cnt            = 1,    /* empty dummy entry */
+       .physmem.max            = INIT_PHYSMEM_REGIONS,
+#endif
+
        .bottom_up              = false,
        .current_limit          = MEMBLOCK_ALLOC_ANYWHERE,
 };
@@ -1553,6 +1562,9 @@ static int __init memblock_init_debugfs(void)
                return -ENXIO;
        debugfs_create_file("memory", S_IRUGO, root, &memblock.memory, &memblock_debug_fops);
        debugfs_create_file("reserved", S_IRUGO, root, &memblock.reserved, &memblock_debug_fops);
+#ifdef CONFIG_HAVE_MEMBLOCK_PHYS_MAP
+       debugfs_create_file("physmem", S_IRUGO, root, &memblock.physmem, &memblock_debug_fops);
+#endif
 
        return 0;
 }