Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3089aa1b authored by KAMEZAWA Hiroyuki's avatar KAMEZAWA Hiroyuki Committed by Linus Torvalds
Browse files

kcore: use registerd physmem information



For /proc/kcore, each arch registers its memory range by kclist_add().
In usual,

	- range of physical memory
	- range of vmalloc area
	- text, etc...

are registered but "range of physical memory" has some troubles.  It
doesn't updated at memory hotplug and it tend to include unnecessary
memory holes.  Now, /proc/iomem (kernel/resource.c) includes required
physical memory range information and it's properly updated at memory
hotplug.  Then, it's good to avoid using its own code(duplicating
information) and to rebuild kclist for physical memory based on
/proc/iomem.

Signed-off-by: default avatarKAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Signed-off-by: default avatarJiri Slaby <jirislaby@gmail.com>
Cc: Ralf Baechle <ralf@linux-mips.org>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: WANG Cong <xiyou.wangcong@gmail.com>
Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 908eedc6
Loading
Loading
Loading
Loading
+0 −3
Original line number Diff line number Diff line
@@ -617,7 +617,6 @@ mem_init (void)
	long reserved_pages, codesize, datasize, initsize;
	pg_data_t *pgdat;
	int i;
	static struct kcore_list kcore_mem;

	BUG_ON(PTRS_PER_PGD * sizeof(pgd_t) != PAGE_SIZE);
	BUG_ON(PTRS_PER_PMD * sizeof(pmd_t) != PAGE_SIZE);
@@ -639,8 +638,6 @@ mem_init (void)

	high_memory = __va(max_low_pfn * PAGE_SIZE);

	kclist_add(&kcore_mem, __va(0), max_low_pfn * PAGE_SIZE, KCORE_RAM);

	for_each_online_pgdat(pgdat)
		if (pgdat->bdata->node_bootmem_map)
			totalram_pages += free_all_bootmem_node(pgdat);
+0 −2
Original line number Diff line number Diff line
@@ -352,7 +352,6 @@ void __init paging_init(void)
	free_area_init_nodes(max_zone_pfns);
}

static struct kcore_list kcore_mem;
#ifdef CONFIG_64BIT
static struct kcore_list kcore_kseg0;
#endif
@@ -412,7 +411,6 @@ void __init mem_init(void)
		kclist_add(&kcore_kseg0, (void *) CKSEG0,
				0x80000000 - 4, KCORE_TEXT);
#endif
	kclist_add(&kcore_mem, __va(0), max_low_pfn << PAGE_SHIFT, KCORE_RAM);

	printk(KERN_INFO "Memory: %luk/%luk available (%ldk kernel code, "
	       "%ldk reserved, %ldk data, %ldk init, %ldk highmem)\n",
+0 −32
Original line number Diff line number Diff line
@@ -242,35 +242,3 @@ void free_initrd_mem(unsigned long start, unsigned long end)
}
#endif
#ifdef CONFIG_PROC_KCORE

static int __init setup_kcore(void)
{
	int i;

	for (i = 0; i < lmb.memory.cnt; i++) {
		unsigned long base;
		unsigned long size;
		struct kcore_list *kcore_mem;

		base = lmb.memory.region[i].base;
		size = lmb.memory.region[i].size;

		kcore_mem = kmalloc(sizeof(struct kcore_list), GFP_ATOMIC);
		if (!kcore_mem)
			panic("%s: kmalloc failed\n", __func__);

		/* must stay under 32 bits */
		if ( 0xfffffffful - (unsigned long)__va(base) < size) {
			size = 0xfffffffful - (unsigned long)(__va(base));
			printk(KERN_DEBUG "setup_kcore: restrict size=%lx\n",
						size);
		}

		kclist_add(kcore_mem, __va(base), size, KCORE_RAM);
	}

	return 0;
}
module_init(setup_kcore);
#endif
+0 −26
Original line number Diff line number Diff line
@@ -109,32 +109,6 @@ void free_initrd_mem(unsigned long start, unsigned long end)
}
#endif

#ifdef CONFIG_PROC_KCORE

static int __init setup_kcore(void)
{
	int i;

	for (i=0; i < lmb.memory.cnt; i++) {
		unsigned long base, size;
		struct kcore_list *kcore_mem;

		base = lmb.memory.region[i].base;
		size = lmb.memory.region[i].size;

		/* GFP_ATOMIC to avoid might_sleep warnings during boot */
		kcore_mem = kmalloc(sizeof(struct kcore_list), GFP_ATOMIC);
		if (!kcore_mem)
			panic("%s: kmalloc failed\n", __func__);

		kclist_add(kcore_mem, __va(base), size, KCORE_RAM);
	}

	return 0;
}
module_init(setup_kcore);
#endif

static void pgd_ctor(void *addr)
{
	memset(addr, 0, PGD_TABLE_SIZE);
+0 −4
Original line number Diff line number Diff line
@@ -186,8 +186,6 @@ void __init paging_init(void)
	set_fixmap_nocache(FIX_UNCACHED, __pa(&__uncached_start));
}

static struct kcore_list kcore_mem;

void __init mem_init(void)
{
	int codesize, datasize, initsize;
@@ -226,8 +224,6 @@ void __init mem_init(void)
	datasize =  (unsigned long) &_edata - (unsigned long) &_etext;
	initsize =  (unsigned long) &__init_end - (unsigned long) &__init_begin;

	kclist_add(&kcore_mem, __va(0), max_low_pfn << PAGE_SHIFT, KCORE_RAM);

	printk(KERN_INFO "Memory: %luk/%luk available (%dk kernel code, "
	       "%dk data, %dk init)\n",
		nr_free_pages() << (PAGE_SHIFT-10),
Loading