* [PATCH 1/1] ARM: only call smp_send_stop() on SMP
@ 2012-06-24 4:21 Javier Martinez Canillas
2012-06-24 8:59 ` Russell King - ARM Linux
0 siblings, 1 reply; 5+ messages in thread
From: Javier Martinez Canillas @ 2012-06-24 4:21 UTC (permalink / raw)
To: linux-arm-kernel
On reboot or poweroff (machine_shutdown()) a call to smp_send_stop() is
made (to stop the others CPU's) when CONFIG_SMP=y.
arch/arm/kernel/process.c:
void machine_shutdown(void)
{
#ifdef CONFIG_SMP
smp_send_stop();
#endif
}
smp_send_stop() calls the function pointer smp_cross_call(), which is set
on the smp_init_cpus() function for OMAP processors.
arch/arm/mach-omap2/omap-smp.c:
void __init smp_init_cpus(void)
{
...
set_smp_cross_call(gic_raise_softirq);
...
}
But the ARM setup_arch() function only calls smp_init_cpus()
if CONFIG_SMP=y && is_smp().
arm/kernel/setup.c:
void __init setup_arch(char **cmdline_p)
{
...
#ifdef CONFIG_SMP
if (is_smp())
smp_init_cpus();
#endif
...
}
Newer OMAP CPU's are SMP machines so omap2plus_defconfig sets
CONFIG_SMP=y. Unfortunately on an OMAP UP machine is_smp()
returns false and smp_init_cpus() is never called and the
smp_cross_call() function remains NULL.
If the machine is rebooted or powered off, smp_send_stop() will
be called (since CONFIG_SMP=y) leading to the following error:
[ 42.815551] Restarting system.
[ 42.819030] Unable to handle kernel NULL pointer dereference at virtual address 00000000
[ 42.827667] pgd = d7a74000
[ 42.830566] [00000000] *pgd=96ce7831, *pte=00000000, *ppte=00000000
[ 42.837249] Internal error: Oops: 80000007 [#1] SMP ARM
[ 42.842773] Modules linked in:
[ 42.846008] CPU: 0 Not tainted (3.5.0-rc3-next-20120622-00002-g62e87ba-dirty #44)
[ 42.854278] PC is at 0x0
[ 42.856994] LR is at smp_send_stop+0x4c/0xe4
[ 42.861511] pc : [<00000000>] lr : [<c00183a4>] psr: 60000013
[ 42.861511] sp : d6c85e70 ip : 00000000 fp : 00000000
[ 42.873626] r10: 00000000 r9 : d6c84000 r8 : 00000002
[ 42.879150] r7 : c07235a0 r6 : c06dd2d0 r5 : 000f4241 r4 : d6c85e74
[ 42.886047] r3 : 00000000 r2 : 00000000 r1 : 00000006 r0 : d6c85e74
[ 42.892944] Flags: nZCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment user
[ 42.900482] Control: 10c5387d Table: 97a74019 DAC: 00000015
[ 42.906555] Process reboot (pid: 1166, stack limit = 0xd6c842f8)
[ 42.912902] Stack: (0xd6c85e70 to 0xd6c86000)
[ 42.917510] 5e60: c07235a0 00000000 00000000 d6c84000
[ 42.926177] 5e80: 01234567 c00143d0 4321fedc c00511bc d6c85ebc 00000168 00000460 00000000
[ 42.934814] 5ea0: c1017950 a0000013 c1017900 d8014390 d7ec3858 c0498e48 c1017950 00000000
[ 42.943481] 5ec0: d6ddde10 d6c85f78 00000003 00000000 d6ddde10 d6c84000 00000000 00000000
[ 42.952117] 5ee0: 00000002 00000000 00000000 c0088c88 00000002 00000000 00000000 c00f4b90
[ 42.960784] 5f00: 00000000 d6c85ebc d8014390 d7e311c8 60000013 00000103 00000002 d6c84000
[ 42.969421] 5f20: c00f3274 d6e00a00 00000001 60000013 d6c84000 00000000 00000000 c00895d4
[ 42.978057] 5f40: 00000002 d8007c80 d781f000 c00f6150 d8010cc0 c00f3274 d781f000 d6c84000
[ 42.986694] 5f60: c0013020 d6e00a00 00000001 20000010 0001257c ef000000 00000000 c00895d4
[ 42.995361] 5f80: 00000002 00000001 00000003 00000000 00000001 00000003 00000000 00000058
[ 43.003997] 5fa0: c00130c8 c0012f00 00000001 00000003 fee1dead 28121969 01234567 00000002
[ 43.012634] 5fc0: 00000001 00000003 00000000 00000058 00012584 0001257c 00000001 00000000
[ 43.021270] 5fe0: 000124bc bec5cc6c 00008f9c 4a2f7c40 20000010 fee1dead 00000000 00000000
[ 43.029968] [<c00183a4>] (smp_send_stop+0x4c/0xe4) from [<c00143d0>] (machine_restart+0xc/0x4c)
[ 43.039154] [<c00143d0>] (machine_restart+0xc/0x4c) from [<c00511bc>] (sys_reboot+0x144/0x1f0)
[ 43.048278] [<c00511bc>] (sys_reboot+0x144/0x1f0) from [<c0012f00>] (ret_fast_syscall+0x0/0x3c)
[ 43.057464] Code: bad PC value
[ 43.060760] ---[ end trace c3988d1dd0b8f0fb ]---
An is_smp() check is also necessary besides shilding the smp_send_stop()
call around CONFIG_SMP.
Signed-off-by: Javier Martinez Canillas <javier@dowhile0.org>
---
arch/arm/kernel/process.c | 4 +++-
1 files changed, 3 insertions(+), 1 deletions(-)
diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c
index 864580a..a9043b8 100644
--- a/arch/arm/kernel/process.c
+++ b/arch/arm/kernel/process.c
@@ -38,6 +38,7 @@
#include <asm/thread_notify.h>
#include <asm/stacktrace.h>
#include <asm/mach/time.h>
+#include <asm/smp_plat.h>
#ifdef CONFIG_CC_STACKPROTECTOR
#include <linux/stackprotector.h>
@@ -240,7 +241,8 @@ __setup("reboot=", reboot_setup);
void machine_shutdown(void)
{
#ifdef CONFIG_SMP
- smp_send_stop();
+ if (is_smp())
+ smp_send_stop();
#endif
}
--
1.7.7.6
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 1/1] ARM: only call smp_send_stop() on SMP
2012-06-24 4:21 [PATCH 1/1] ARM: only call smp_send_stop() on SMP Javier Martinez Canillas
@ 2012-06-24 8:59 ` Russell King - ARM Linux
2012-06-24 10:21 ` Javier Martinez Canillas
2012-06-28 7:06 ` Pantelis Antoniou
0 siblings, 2 replies; 5+ messages in thread
From: Russell King - ARM Linux @ 2012-06-24 8:59 UTC (permalink / raw)
To: linux-arm-kernel
See this thread:
http://lists.arm.linux.org.uk/lurker/thread/20120523.200015.2fdfd505.en.html
There are times when I wonder why I bother replying to email on mailing
lists. No patch ever came from my responses on this subject. Not going
to repeat it again. Fed up.
On Sun, Jun 24, 2012 at 06:21:07AM +0200, Javier Martinez Canillas wrote:
> On reboot or poweroff (machine_shutdown()) a call to smp_send_stop() is
> made (to stop the others CPU's) when CONFIG_SMP=y.
>
> arch/arm/kernel/process.c:
>
> void machine_shutdown(void)
> {
> #ifdef CONFIG_SMP
> smp_send_stop();
> #endif
> }
>
> smp_send_stop() calls the function pointer smp_cross_call(), which is set
> on the smp_init_cpus() function for OMAP processors.
>
> arch/arm/mach-omap2/omap-smp.c:
>
> void __init smp_init_cpus(void)
> {
> ...
> set_smp_cross_call(gic_raise_softirq);
> ...
> }
>
> But the ARM setup_arch() function only calls smp_init_cpus()
> if CONFIG_SMP=y && is_smp().
>
> arm/kernel/setup.c:
>
> void __init setup_arch(char **cmdline_p)
> {
> ...
> #ifdef CONFIG_SMP
> if (is_smp())
> smp_init_cpus();
> #endif
> ...
> }
>
> Newer OMAP CPU's are SMP machines so omap2plus_defconfig sets
> CONFIG_SMP=y. Unfortunately on an OMAP UP machine is_smp()
> returns false and smp_init_cpus() is never called and the
> smp_cross_call() function remains NULL.
>
> If the machine is rebooted or powered off, smp_send_stop() will
> be called (since CONFIG_SMP=y) leading to the following error:
>
> [ 42.815551] Restarting system.
> [ 42.819030] Unable to handle kernel NULL pointer dereference at virtual address 00000000
> [ 42.827667] pgd = d7a74000
> [ 42.830566] [00000000] *pgd=96ce7831, *pte=00000000, *ppte=00000000
> [ 42.837249] Internal error: Oops: 80000007 [#1] SMP ARM
> [ 42.842773] Modules linked in:
> [ 42.846008] CPU: 0 Not tainted (3.5.0-rc3-next-20120622-00002-g62e87ba-dirty #44)
> [ 42.854278] PC is at 0x0
> [ 42.856994] LR is at smp_send_stop+0x4c/0xe4
> [ 42.861511] pc : [<00000000>] lr : [<c00183a4>] psr: 60000013
> [ 42.861511] sp : d6c85e70 ip : 00000000 fp : 00000000
> [ 42.873626] r10: 00000000 r9 : d6c84000 r8 : 00000002
> [ 42.879150] r7 : c07235a0 r6 : c06dd2d0 r5 : 000f4241 r4 : d6c85e74
> [ 42.886047] r3 : 00000000 r2 : 00000000 r1 : 00000006 r0 : d6c85e74
> [ 42.892944] Flags: nZCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment user
> [ 42.900482] Control: 10c5387d Table: 97a74019 DAC: 00000015
> [ 42.906555] Process reboot (pid: 1166, stack limit = 0xd6c842f8)
> [ 42.912902] Stack: (0xd6c85e70 to 0xd6c86000)
> [ 42.917510] 5e60: c07235a0 00000000 00000000 d6c84000
> [ 42.926177] 5e80: 01234567 c00143d0 4321fedc c00511bc d6c85ebc 00000168 00000460 00000000
> [ 42.934814] 5ea0: c1017950 a0000013 c1017900 d8014390 d7ec3858 c0498e48 c1017950 00000000
> [ 42.943481] 5ec0: d6ddde10 d6c85f78 00000003 00000000 d6ddde10 d6c84000 00000000 00000000
> [ 42.952117] 5ee0: 00000002 00000000 00000000 c0088c88 00000002 00000000 00000000 c00f4b90
> [ 42.960784] 5f00: 00000000 d6c85ebc d8014390 d7e311c8 60000013 00000103 00000002 d6c84000
> [ 42.969421] 5f20: c00f3274 d6e00a00 00000001 60000013 d6c84000 00000000 00000000 c00895d4
> [ 42.978057] 5f40: 00000002 d8007c80 d781f000 c00f6150 d8010cc0 c00f3274 d781f000 d6c84000
> [ 42.986694] 5f60: c0013020 d6e00a00 00000001 20000010 0001257c ef000000 00000000 c00895d4
> [ 42.995361] 5f80: 00000002 00000001 00000003 00000000 00000001 00000003 00000000 00000058
> [ 43.003997] 5fa0: c00130c8 c0012f00 00000001 00000003 fee1dead 28121969 01234567 00000002
> [ 43.012634] 5fc0: 00000001 00000003 00000000 00000058 00012584 0001257c 00000001 00000000
> [ 43.021270] 5fe0: 000124bc bec5cc6c 00008f9c 4a2f7c40 20000010 fee1dead 00000000 00000000
> [ 43.029968] [<c00183a4>] (smp_send_stop+0x4c/0xe4) from [<c00143d0>] (machine_restart+0xc/0x4c)
> [ 43.039154] [<c00143d0>] (machine_restart+0xc/0x4c) from [<c00511bc>] (sys_reboot+0x144/0x1f0)
> [ 43.048278] [<c00511bc>] (sys_reboot+0x144/0x1f0) from [<c0012f00>] (ret_fast_syscall+0x0/0x3c)
> [ 43.057464] Code: bad PC value
> [ 43.060760] ---[ end trace c3988d1dd0b8f0fb ]---
>
> An is_smp() check is also necessary besides shilding the smp_send_stop()
> call around CONFIG_SMP.
>
> Signed-off-by: Javier Martinez Canillas <javier@dowhile0.org>
> ---
> arch/arm/kernel/process.c | 4 +++-
> 1 files changed, 3 insertions(+), 1 deletions(-)
>
> diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c
> index 864580a..a9043b8 100644
> --- a/arch/arm/kernel/process.c
> +++ b/arch/arm/kernel/process.c
> @@ -38,6 +38,7 @@
> #include <asm/thread_notify.h>
> #include <asm/stacktrace.h>
> #include <asm/mach/time.h>
> +#include <asm/smp_plat.h>
>
> #ifdef CONFIG_CC_STACKPROTECTOR
> #include <linux/stackprotector.h>
> @@ -240,7 +241,8 @@ __setup("reboot=", reboot_setup);
> void machine_shutdown(void)
> {
> #ifdef CONFIG_SMP
> - smp_send_stop();
> + if (is_smp())
> + smp_send_stop();
> #endif
> }
>
> --
> 1.7.7.6
>
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH 1/1] ARM: only call smp_send_stop() on SMP
2012-06-24 8:59 ` Russell King - ARM Linux
@ 2012-06-24 10:21 ` Javier Martinez Canillas
2012-06-28 7:06 ` Pantelis Antoniou
1 sibling, 0 replies; 5+ messages in thread
From: Javier Martinez Canillas @ 2012-06-24 10:21 UTC (permalink / raw)
To: linux-arm-kernel
On Sun, Jun 24, 2012 at 10:59 AM, Russell King - ARM Linux
<linux@arm.linux.org.uk> wrote:
> See this thread:
>
> http://lists.arm.linux.org.uk/lurker/thread/20120523.200015.2fdfd505.en.html
>
> There are times when I wonder why I bother replying to email on mailing
> lists. ?No patch ever came from my responses on this subject. ?Not going
> to repeat it again. ?Fed up.
>
> On Sun, Jun 24, 2012 at 06:21:07AM +0200, Javier Martinez Canillas wrote:
Hi Russell,
I didn't know that this was discussed before sorry.
I'll send a v2 of the patch that uses your suggested approach.
Best regards,
Javier
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH 1/1] ARM: only call smp_send_stop() on SMP
2012-06-24 8:59 ` Russell King - ARM Linux
2012-06-24 10:21 ` Javier Martinez Canillas
@ 2012-06-28 7:06 ` Pantelis Antoniou
2012-06-28 11:03 ` Russell King - ARM Linux
1 sibling, 1 reply; 5+ messages in thread
From: Pantelis Antoniou @ 2012-06-28 7:06 UTC (permalink / raw)
To: linux-arm-kernel
Err,
There was a patch been sent in response that did exactly as you asked.
http://lkml.indiana.edu/hypermail/linux/kernel/1205.3/00433.html
Regards
-- Pantelis
On Jun 24, 2012, at 11:59 AM, Russell King - ARM Linux wrote:
> See this thread:
>
> http://lists.arm.linux.org.uk/lurker/thread/20120523.200015.2fdfd505.en.html
>
> There are times when I wonder why I bother replying to email on mailing
> lists. No patch ever came from my responses on this subject. Not going
> to repeat it again. Fed up.
>
> On Sun, Jun 24, 2012 at 06:21:07AM +0200, Javier Martinez Canillas wrote:
>> On reboot or poweroff (machine_shutdown()) a call to smp_send_stop() is
>> made (to stop the others CPU's) when CONFIG_SMP=y.
>>
>> arch/arm/kernel/process.c:
>>
>> void machine_shutdown(void)
>> {
>> #ifdef CONFIG_SMP
>> smp_send_stop();
>> #endif
>> }
>>
>> smp_send_stop() calls the function pointer smp_cross_call(), which is set
>> on the smp_init_cpus() function for OMAP processors.
>>
>> arch/arm/mach-omap2/omap-smp.c:
>>
>> void __init smp_init_cpus(void)
>> {
>> ...
>> set_smp_cross_call(gic_raise_softirq);
>> ...
>> }
>>
>> But the ARM setup_arch() function only calls smp_init_cpus()
>> if CONFIG_SMP=y && is_smp().
>>
>> arm/kernel/setup.c:
>>
>> void __init setup_arch(char **cmdline_p)
>> {
>> ...
>> #ifdef CONFIG_SMP
>> if (is_smp())
>> smp_init_cpus();
>> #endif
>> ...
>> }
>>
>> Newer OMAP CPU's are SMP machines so omap2plus_defconfig sets
>> CONFIG_SMP=y. Unfortunately on an OMAP UP machine is_smp()
>> returns false and smp_init_cpus() is never called and the
>> smp_cross_call() function remains NULL.
>>
>> If the machine is rebooted or powered off, smp_send_stop() will
>> be called (since CONFIG_SMP=y) leading to the following error:
>>
>> [ 42.815551] Restarting system.
>> [ 42.819030] Unable to handle kernel NULL pointer dereference at virtual address 00000000
>> [ 42.827667] pgd = d7a74000
>> [ 42.830566] [00000000] *pgd=96ce7831, *pte=00000000, *ppte=00000000
>> [ 42.837249] Internal error: Oops: 80000007 [#1] SMP ARM
>> [ 42.842773] Modules linked in:
>> [ 42.846008] CPU: 0 Not tainted (3.5.0-rc3-next-20120622-00002-g62e87ba-dirty #44)
>> [ 42.854278] PC is at 0x0
>> [ 42.856994] LR is at smp_send_stop+0x4c/0xe4
>> [ 42.861511] pc : [<00000000>] lr : [<c00183a4>] psr: 60000013
>> [ 42.861511] sp : d6c85e70 ip : 00000000 fp : 00000000
>> [ 42.873626] r10: 00000000 r9 : d6c84000 r8 : 00000002
>> [ 42.879150] r7 : c07235a0 r6 : c06dd2d0 r5 : 000f4241 r4 : d6c85e74
>> [ 42.886047] r3 : 00000000 r2 : 00000000 r1 : 00000006 r0 : d6c85e74
>> [ 42.892944] Flags: nZCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment user
>> [ 42.900482] Control: 10c5387d Table: 97a74019 DAC: 00000015
>> [ 42.906555] Process reboot (pid: 1166, stack limit = 0xd6c842f8)
>> [ 42.912902] Stack: (0xd6c85e70 to 0xd6c86000)
>> [ 42.917510] 5e60: c07235a0 00000000 00000000 d6c84000
>> [ 42.926177] 5e80: 01234567 c00143d0 4321fedc c00511bc d6c85ebc 00000168 00000460 00000000
>> [ 42.934814] 5ea0: c1017950 a0000013 c1017900 d8014390 d7ec3858 c0498e48 c1017950 00000000
>> [ 42.943481] 5ec0: d6ddde10 d6c85f78 00000003 00000000 d6ddde10 d6c84000 00000000 00000000
>> [ 42.952117] 5ee0: 00000002 00000000 00000000 c0088c88 00000002 00000000 00000000 c00f4b90
>> [ 42.960784] 5f00: 00000000 d6c85ebc d8014390 d7e311c8 60000013 00000103 00000002 d6c84000
>> [ 42.969421] 5f20: c00f3274 d6e00a00 00000001 60000013 d6c84000 00000000 00000000 c00895d4
>> [ 42.978057] 5f40: 00000002 d8007c80 d781f000 c00f6150 d8010cc0 c00f3274 d781f000 d6c84000
>> [ 42.986694] 5f60: c0013020 d6e00a00 00000001 20000010 0001257c ef000000 00000000 c00895d4
>> [ 42.995361] 5f80: 00000002 00000001 00000003 00000000 00000001 00000003 00000000 00000058
>> [ 43.003997] 5fa0: c00130c8 c0012f00 00000001 00000003 fee1dead 28121969 01234567 00000002
>> [ 43.012634] 5fc0: 00000001 00000003 00000000 00000058 00012584 0001257c 00000001 00000000
>> [ 43.021270] 5fe0: 000124bc bec5cc6c 00008f9c 4a2f7c40 20000010 fee1dead 00000000 00000000
>> [ 43.029968] [<c00183a4>] (smp_send_stop+0x4c/0xe4) from [<c00143d0>] (machine_restart+0xc/0x4c)
>> [ 43.039154] [<c00143d0>] (machine_restart+0xc/0x4c) from [<c00511bc>] (sys_reboot+0x144/0x1f0)
>> [ 43.048278] [<c00511bc>] (sys_reboot+0x144/0x1f0) from [<c0012f00>] (ret_fast_syscall+0x0/0x3c)
>> [ 43.057464] Code: bad PC value
>> [ 43.060760] ---[ end trace c3988d1dd0b8f0fb ]---
>>
>> An is_smp() check is also necessary besides shilding the smp_send_stop()
>> call around CONFIG_SMP.
>>
>> Signed-off-by: Javier Martinez Canillas <javier@dowhile0.org>
>> ---
>> arch/arm/kernel/process.c | 4 +++-
>> 1 files changed, 3 insertions(+), 1 deletions(-)
>>
>> diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c
>> index 864580a..a9043b8 100644
>> --- a/arch/arm/kernel/process.c
>> +++ b/arch/arm/kernel/process.c
>> @@ -38,6 +38,7 @@
>> #include <asm/thread_notify.h>
>> #include <asm/stacktrace.h>
>> #include <asm/mach/time.h>
>> +#include <asm/smp_plat.h>
>>
>> #ifdef CONFIG_CC_STACKPROTECTOR
>> #include <linux/stackprotector.h>
>> @@ -240,7 +241,8 @@ __setup("reboot=", reboot_setup);
>> void machine_shutdown(void)
>> {
>> #ifdef CONFIG_SMP
>> - smp_send_stop();
>> + if (is_smp())
>> + smp_send_stop();
>> #endif
>> }
>>
>> --
>> 1.7.7.6
>>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-omap" in
> the body of a message to majordomo at vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2012-06-28 11:03 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-06-24 4:21 [PATCH 1/1] ARM: only call smp_send_stop() on SMP Javier Martinez Canillas
2012-06-24 8:59 ` Russell King - ARM Linux
2012-06-24 10:21 ` Javier Martinez Canillas
2012-06-28 7:06 ` Pantelis Antoniou
2012-06-28 11:03 ` Russell King - ARM Linux
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).