From: Michael Neuling <mikey@neuling.org>
To: michael@ellerman.id.au
Cc: linuxppc-dev@ozlabs.org, RAISCH@de.ibm.com,
Paul Mackerras <paulus@samba.org>,
THEMANN@de.ibm.com
Subject: Re: [PATCH 2/2] kdump shutdown hook support
Date: Thu, 13 Dec 2007 11:04:02 +1100 [thread overview]
Message-ID: <31645.1197504242@neuling.org> (raw)
In-Reply-To: <1197500839.7695.19.camel@concordia>
In message <1197500839.7695.19.camel@concordia> you wrote:
>
> --=-Kza0KCx0MG8nsjfq7kOz
> Content-Type: text/plain
> Content-Transfer-Encoding: quoted-printable
>
> On Wed, 2007-12-12 at 16:45 +1100, Michael Neuling wrote:
> > This adds hooks into the default_machine_crash_shutdown so drivers can
> > register a function to be run in the first kernel before we hand off
> > to the second kernel. This should only be used in exceptional
> > circumstances, like where the device can't be reset in the second
> > kernel alone (as is the case with eHEA). To emphasize this, the
> > number of handles allowed to be registered is currently #def to 1.
> >=20
> > This uses the setjmp/longjmp code to call out to the registered hooks,
> > so any bogus exceptions we encounter will hopefully be recoverable. =20
> >=20
> > I've tested with bogus data and instruction exceptions.
> >=20
> > Signed-off-by: Michael Neuling <mikey@neuling.org>
> > ---
> >=20
> > arch/powerpc/kernel/crash.c | 90 +++++++++++++++++++++++++++++++++++++=
> ++++---
> > include/asm-powerpc/kexec.h | 3 +
> > 2 files changed, 88 insertions(+), 5 deletions(-)
> >=20
> > Index: linux-2.6-ozlabs/arch/powerpc/kernel/crash.c
> > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> > --- linux-2.6-ozlabs.orig/arch/powerpc/kernel/crash.c
> > +++ linux-2.6-ozlabs/arch/powerpc/kernel/crash.c
> > @@ -32,6 +32,8 @@
> > #include <asm/lmb.h>
> > #include <asm/firmware.h>
> > #include <asm/smp.h>
> > +#include <asm/system.h>
> > +#include <asm/setjmp.h>
> > =20
> > #ifdef DEBUG
> > #include <asm/udbg.h>
> > @@ -45,6 +47,11 @@ int crashing_cpu =3D -1;
> > static cpumask_t cpus_in_crash =3D CPU_MASK_NONE;
> > cpumask_t cpus_in_sr =3D CPU_MASK_NONE;
> > =20
> > +#define CRASH_SHUTDOWN_HANDLES_NUM 1
>
> CRASH_HANDLER_MAX ?
yep, MAX is probably a more representative name
>
> > +/* NULL terminated list of shutdown handles */
> > +static crash_shutdown_t crash_shutdown_handles[CRASH_SHUTDOWN_HANDLES_NU=
> M+1];
> > +static DEFINE_SPINLOCK(crash_handles_lock);
> > +
> > #ifdef CONFIG_SMP
> > static atomic_t enter_on_soft_reset =3D ATOMIC_INIT(0);
> > =20
> > @@ -285,9 +292,69 @@ static inline void crash_kexec_stop_spus
> > }
> > #endif /* CONFIG_SPU_BASE */
> > =20
> > +/*=20
> > + * Register a function to be called on shutdown. Only use this if you
> > + * can't reset your device in the second kernel.
> > + */
> > +int crash_shutdown_register(crash_shutdown_t handler)
> > +{
> > + unsigned int i, rc;
> > +
> > + spin_lock(&crash_handles_lock);
>
> > + for(i =3D 0 ; i <=3D CRASH_SHUTDOWN_HANDLES_NUM; i++) {
> > + if (!crash_shutdown_handles[i]) {
> > + /* Insert handle at end */
> > + crash_shutdown_handles[i] =3D handler;
> > + rc =3D 0;
> > + break;
> > + }
> > + }
> >=20
> > + if (i =3D=3D CRASH_SHUTDOWN_HANDLES_NUM){
> > + printk(KERN_ERR "Crash shutdown handles full, "
> > + "not registered.\n");
> > + rc =3D 1;
> > + }
> > +
> > + spin_unlock(&crash_handles_lock);
>
> Perhaps?
Yep, looks nicer. I'll fix the one below too.
>
> > + return rc;
> > +}
> > +EXPORT_SYMBOL(crash_shutdown_register);
> > +
> > +int crash_shutdown_unregister(crash_shutdown_t handler)
> > +{
> > + unsigned int i;
> > +
> > + spin_lock(&crash_handles_lock);
> > + for(i =3D 0 ; i <=3D CRASH_SHUTDOWN_HANDLES_NUM; i++)
> > + if (crash_shutdown_handles[i] =3D=3D handler)
> > + break;
> > +
> > + if (i =3D=3D CRASH_SHUTDOWN_HANDLES_NUM){
> > + printk(KERN_ERR "Crash shutdown handle not found\n");
> > + spin_unlock(&crash_handles_lock);
> > + return 1;
> > + }
> > +
> > + /* Shift handles down */
> > + while(crash_shutdown_handles[i]) {
> > + crash_shutdown_handles[i] =3D crash_shutdown_handles[i+1];
> > + i++;
> > + }
> > + spin_unlock(&crash_handles_lock);
> > + return 0;
> > +}
> > +EXPORT_SYMBOL(crash_shutdown_unregister);
> > +
> > +static long crash_shutdown_buf[SETJMP_BUF_LEN];
>
> unsigned long?
yep
>
> > +
> > +static int handle_fault(struct pt_regs *regs)
> > +{
> > + longjmp(crash_shutdown_buf, 1);
> > + return 0;
> > +}
> > +
> > void default_machine_crash_shutdown(struct pt_regs *regs)
> > {
> > - unsigned int irq;
> > + unsigned int i;
> > =20
> > /*
> > * This function is only called after the system
> > @@ -301,14 +368,27 @@ void default_machine_crash_shutdown(stru
> > */
> > hard_irq_disable();
> > =20
> > - for_each_irq(irq) {
> > - struct irq_desc *desc =3D irq_desc + irq;
> > + for_each_irq(i) {
> > + struct irq_desc *desc =3D irq_desc + i;
> > =20
> > if (desc->status & IRQ_INPROGRESS)
> > - desc->chip->eoi(irq);
> > + desc->chip->eoi(i);
> > =20
> > if (!(desc->status & IRQ_DISABLED))
> > - desc->chip->disable(irq);
> > + desc->chip->disable(i);
> > + }
> > +
> > + /* Call registered shutdown routines */
> > + __debugger_fault_handler =3D handle_fault;
> > + i =3D 0;
> > + while(crash_shutdown_handles[i]){
> > + if (setjmp(crash_shutdown_buf) =3D=3D 0) {
> > + asm volatile("sync; isync");
> > + crash_shutdown_handles[i]();
> > + asm volatile("sync; isync");
> > + __delay(200);
> > + }
> > + i++;
> > }
>
> You should probably reset __debugger_fault_handler, just to be safe.
Agreed.
Mikey
next prev parent reply other threads:[~2007-12-13 0:04 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-12-12 5:45 [PATCH 2/2] kdump shutdown hook support Michael Neuling
2007-12-12 7:01 ` Olof Johansson
2007-12-13 0:53 ` Michael Neuling
2007-12-12 23:07 ` Michael Ellerman
2007-12-13 0:04 ` Michael Neuling [this message]
2007-12-13 3:16 ` [PATCH 0/2] Add crashdump shutdown hooks Michael Neuling
2007-12-13 3:16 ` [PATCH 1/2] Make setjmp/longjmp code generic Michael Neuling
2007-12-13 3:16 ` [PATCH 2/2] kdump shutdown hook support Michael Neuling
2007-12-13 5:12 ` Olof Johansson
2007-12-13 5:13 ` Olof Johansson
2007-12-13 9:59 ` [PATCH 0/2] Add crashdump shutdown hooks Michael Neuling
2007-12-13 9:59 ` [PATCH 1/2] Make setjmp/longjmp code generic Michael Neuling
2007-12-13 9:59 ` [PATCH 2/2] kdump shutdown hook support Michael Neuling
2008-01-17 4:45 ` [PATCH 0/2] Add crashdump shutdown hooks Michael Neuling
2008-01-17 4:45 ` [PATCH 1/2] Make setjmp/longjmp code generic Michael Neuling
2008-01-17 5:38 ` Olof Johansson
2008-01-17 5:36 ` Michael Neuling
2008-01-17 6:36 ` Stephen Rothwell
2008-01-17 12:45 ` Josh Boyer
2008-01-17 21:49 ` Michael Ellerman
2008-01-17 22:16 ` [PATCH] Add crashdump shutdown hooks Michael Neuling
2008-01-17 22:16 ` [PATCH] Make setjmp/longjmp code generic Michael Neuling
2008-01-18 4:50 ` [PATCH 0/2] Add crashdump shutdown hooks Michael Neuling
2008-01-18 4:50 ` [PATCH 1/2] Make setjmp/longjmp code generic Michael Neuling
2008-01-18 4:50 ` [PATCH 2/2] kdump shutdown hook support Michael Neuling
2008-01-17 6:39 ` [PATCH 1/2] Make setjmp/longjmp code generic Stephen Rothwell
2008-01-17 4:45 ` [PATCH 2/2] kdump shutdown hook support Michael Neuling
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=31645.1197504242@neuling.org \
--to=mikey@neuling.org \
--cc=RAISCH@de.ibm.com \
--cc=THEMANN@de.ibm.com \
--cc=linuxppc-dev@ozlabs.org \
--cc=michael@ellerman.id.au \
--cc=paulus@samba.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.