| Message ID | - |
|---|---|
| State | Accepted |
| Delegated to: | Ralf Baechle |
| Headers | show |
Anything on this? -corey On 04/11/2016 09:10 AM, wrote: > From: Corey Minyard <> > > As part of handling a crash on an SMP system, an IPI is send to > all other CPUs to save their current registers and stop. It was > using task_pt_regs(current) to get the registers, but that will > only be accurate if the CPU was interrupted running in userland. > Instead allow the architecture to pass in the registers (all > pass NULL now, but allow for the future) and then use get_irq_regs() > which should be accurate as we are in an interrupt. Fall back to > task_pt_regs(current) if nothing else is available. > > Signed-off-by: Corey Minyard <> > --- > arch/mips/kernel/crash.c | 16 +++++++++++++--- > 1 file changed, 13 insertions(+), 3 deletions(-) > > diff --git a/arch/mips/kernel/crash.c b/arch/mips/kernel/crash.c > index d434d5d..610f0f3 100644 > --- a/arch/mips/kernel/crash.c > +++ b/arch/mips/kernel/crash.c > @@ -14,12 +14,22 @@ static int crashing_cpu = -1; > static cpumask_t cpus_in_crash = CPU_MASK_NONE; > > #ifdef CONFIG_SMP > -static void crash_shutdown_secondary(void *ignore) > +static void crash_shutdown_secondary(void *passed_regs) > { > - struct pt_regs *regs; > + struct pt_regs *regs = passed_regs; > int cpu = smp_processor_id(); > > - regs = task_pt_regs(current); > + /* > + * If we are passed registers, use those. Otherwise get the > + * regs from the last interrupt, which should be correct, as > + * we are in an interrupt. But if the regs are not there, > + * pull them from the top of the stack. They are probably > + * wrong, but we need something to keep from crashing again. > + */ > + if (!regs) > + regs = get_irq_regs(); > + if (!regs) > + regs = task_pt_regs(current); > > if (!cpu_online(cpu)) > return;
On Wed, Apr 20, 2016 at 08:24:54AM -0500, Corey Minyard wrote:
> Anything on this?
Applied a few days ago and waiting to be pulled by Linus.
Ralf
On 04/20/2016 08:33 AM, Ralf Baechle wrote: > On Wed, Apr 20, 2016 at 08:24:54AM -0500, Corey Minyard wrote: > >> Anything on this? > Applied a few days ago and waiting to be pulled by Linus. > > Ralf Thanks a bunch. -corey
diff --git a/arch/mips/kernel/crash.c b/arch/mips/kernel/crash.c index d434d5d..610f0f3 100644 --- a/arch/mips/kernel/crash.c +++ b/arch/mips/kernel/crash.c @@ -14,12 +14,22 @@ static int crashing_cpu = -1; static cpumask_t cpus_in_crash = CPU_MASK_NONE; #ifdef CONFIG_SMP -static void crash_shutdown_secondary(void *ignore) +static void crash_shutdown_secondary(void *passed_regs) { - struct pt_regs *regs; + struct pt_regs *regs = passed_regs; int cpu = smp_processor_id(); - regs = task_pt_regs(current); + /* + * If we are passed registers, use those. Otherwise get the + * regs from the last interrupt, which should be correct, as + * we are in an interrupt. But if the regs are not there, + * pull them from the top of the stack. They are probably + * wrong, but we need something to keep from crashing again. + */ + if (!regs) + regs = get_irq_regs(); + if (!regs) + regs = task_pt_regs(current); if (!cpu_online(cpu)) return;