All of lore.kernel.org
 help / color / mirror / Atom feed
* why commit 3189eddbcafc cause crisv32 panic
@ 2014-10-14 10:48 Real Name
  0 siblings, 0 replies; only message in thread
From: Real Name @ 2014-10-14 10:48 UTC (permalink / raw)
  To: linux; +Cc: tj, starvik, jesper.nilsson, linux-cris-kernel, linux-kernel

[-- Attachment #1: Type: text/plain, Size: 1376 bytes --]

hi, Guenter
 
http://www.gossamer-threads.com/lists/linux/kernel/2011061

>[PATCH] Revert "percpu: free percpu allocation info for uniprocessor system"
>
> The commit causes a hang with a crisv32 image. This may be an architecture
> problem, but at least for now the revert is necessary to be able to boot a
> crisv32 image. 

Yes, it is a crisv32 specific issue. The crisv32 was paniced on the BUG() macro
in function mark_bootmem. The call path is :

pcpu_free_alloc_info
	-> memblock_free_early
		-> free_bootmem
			-> mark_bootmem
				-> BUG()

The root source is that arch/cris/kernel/setup.c:setup_arch compute start_pfn
and max_pfn from *virtual* address.

|---------- arch/cris/kernel/setup.c:setup_arch -----------------------
|	start_pfn = PFN_UP(memory_start);  /* usually c0000000 + kernel + romfs */
|	max_pfn =   PFN_DOWN((unsigned long)high_memory); /* usually c0000000 + dram size */
|---------- arch/cris/kernel/setup.c:setup_arch -----------------------

So, when memblock_free_early pass the *physical* address of ai to mark_bootmem.
The first if statement of mark_bootmem become ture. And then hit the BUG() macro.

After applied the attached patch, pcpu_free_alloc_info works as expect. It had
been test with your toolchain and patches you provided to me.
http://server.roeck-us.net/qemu/crisv32/

cc'ed Mikael and Jesper, as they are Axis staff.

thanks

[-- Attachment #2: why_3189eddbcafc_cause_crisv32_panic.patch --]
[-- Type: text/x-diff, Size: 838 bytes --]

diff --git a/mm/percpu.c b/mm/percpu.c
index 2139e30..cbbc946 100644
--- a/mm/percpu.c
+++ b/mm/percpu.c
@@ -1097,7 +1097,12 @@ struct pcpu_alloc_info * __init pcpu_alloc_alloc_info(int nr_groups,
  */
 void __init pcpu_free_alloc_info(struct pcpu_alloc_info *ai)
 {
-	memblock_free_early(__pa(ai), ai->__ai_size);
+	/* This patch is unacceptable, as it broken other arch.
+	* It was created to explain why commit 3189eddbcafc ("percpu:
+	* free percpu allocation info for uniprocessor system") cause
+	* crisv32 panic. PLEASE DO NOT APPLY THIS PATCH.
+	*/
+	memblock_free_early((unsigned long)(ai), ai->__ai_size);
 }
 
 /**
@@ -1932,6 +1937,8 @@ void __init setup_per_cpu_areas(void)
 
 	if (pcpu_setup_first_chunk(ai, fc) < 0)
 		panic("Failed to initialize percpu areas.");
+
+	pcpu_free_alloc_info(ai);
 }
 
 #endif	/* CONFIG_SMP */

^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2014-10-14 10:49 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-10-14 10:48 why commit 3189eddbcafc cause crisv32 panic Real Name

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.