Stefano Stabellini
2011-Feb-25 10:53 UTC
[Xen-devel] [PATCH] NMI: continue in case of PCI SERR erros
Memory parity error is only valid for IBM PC-AT, newer machines use bit 7 (0x80) of 0x61 port for PCI SERR. While memory errors are usually reported via MCE. Rename the memory parity error handler to pci serr handler and print a warning and continue instead of crashing. Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> --- diff -r 598d1fc295b6 xen/arch/x86/traps.c --- a/xen/arch/x86/traps.c Thu Feb 24 09:33:19 2011 +0000 +++ b/xen/arch/x86/traps.c Fri Feb 25 10:37:47 2011 +0000 @@ -3075,23 +3075,12 @@ static void nmi_dom0_report(unsigned int send_guest_trap(d, 0, TRAP_nmi); } -static void mem_parity_error(struct cpu_user_regs *regs) +static void pci_serr_error(struct cpu_user_regs *regs) { - switch ( opt_nmi[0] ) - { - case ''d'': /* ''dom0'' */ - nmi_dom0_report(_XEN_NMIREASON_parity_error); - case ''i'': /* ''ignore'' */ - break; - default: /* ''fatal'' */ - console_force_unlock(); - printk("\n\nNMI - MEMORY ERROR\n"); - fatal_trap(TRAP_nmi, regs); - } + console_force_unlock(); + printk("\n\nNMI - PCI system error (SERR)\n"); - outb((inb(0x61) & 0x0f) | 0x04, 0x61); /* clear-and-disable parity check */ - mdelay(1); - outb((inb(0x61) & 0x0b) | 0x00, 0x61); /* enable parity check */ + outb((inb(0x61) & 0x0f) | 0x04, 0x61); /* clear-and-disable the PCI SERR error line. */ } static void io_check_error(struct cpu_user_regs *regs) @@ -3154,7 +3143,7 @@ asmlinkage void do_nmi(struct cpu_user_r { reason = inb(0x61); if ( reason & 0x80 ) - mem_parity_error(regs); + pci_serr_error(regs); else if ( reason & 0x40 ) io_check_error(regs); else if ( !nmi_watchdog ) _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Jan Beulich
2011-Feb-25 11:17 UTC
Re: [Xen-devel] [PATCH] NMI: continue in case of PCI SERR erros
>>> On 25.02.11 at 11:53, Stefano Stabellini <stefano.stabellini@eu.citrix.com>wrote:> Memory parity error is only valid for IBM PC-AT, newer machines use > bit 7 (0x80) of 0x61 port for PCI SERR. While memory errors are > usually reported via MCE. > > Rename the memory parity error handler to pci serr handler and > print a warning and continue instead of crashing. > > Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> > > --- > > diff -r 598d1fc295b6 xen/arch/x86/traps.c > --- a/xen/arch/x86/traps.c Thu Feb 24 09:33:19 2011 +0000 > +++ b/xen/arch/x86/traps.c Fri Feb 25 10:37:47 2011 +0000 > @@ -3075,23 +3075,12 @@ static void nmi_dom0_report(unsigned int > send_guest_trap(d, 0, TRAP_nmi); > } > > -static void mem_parity_error(struct cpu_user_regs *regs) > +static void pci_serr_error(struct cpu_user_regs *regs) > { > - switch ( opt_nmi[0] ) > - { > - case ''d'': /* ''dom0'' */ > - nmi_dom0_report(_XEN_NMIREASON_parity_error); > - case ''i'': /* ''ignore'' */ > - break; > - default: /* ''fatal'' */ > - console_force_unlock(); > - printk("\n\nNMI - MEMORY ERROR\n"); > - fatal_trap(TRAP_nmi, regs); > - } > + console_force_unlock(); > + printk("\n\nNMI - PCI system error (SERR)\n");Why do you remove the reporting of the event to Dom0? I''d rather see this part stay and the public headers getting adjusted in a compatible way. Jan> > - outb((inb(0x61) & 0x0f) | 0x04, 0x61); /* clear-and-disable parity check */ > - mdelay(1); > - outb((inb(0x61) & 0x0b) | 0x00, 0x61); /* enable parity check */ > + outb((inb(0x61) & 0x0f) | 0x04, 0x61); /* clear-and-disable the PCI SERR > error line. */ > } > > static void io_check_error(struct cpu_user_regs *regs) > @@ -3154,7 +3143,7 @@ asmlinkage void do_nmi(struct cpu_user_r > { > reason = inb(0x61); > if ( reason & 0x80 ) > - mem_parity_error(regs); > + pci_serr_error(regs); > else if ( reason & 0x40 ) > io_check_error(regs); > else if ( !nmi_watchdog ) > > _______________________________________________ > Xen-devel mailing list > Xen-devel@lists.xensource.com > http://lists.xensource.com/xen-devel_______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Stefano Stabellini
2011-Feb-25 11:27 UTC
Re: [Xen-devel] [PATCH] NMI: continue in case of PCI SERR erros
On Fri, 25 Feb 2011, Jan Beulich wrote:> >>> On 25.02.11 at 11:53, Stefano Stabellini <stefano.stabellini@eu.citrix.com> > wrote: > > Memory parity error is only valid for IBM PC-AT, newer machines use > > bit 7 (0x80) of 0x61 port for PCI SERR. While memory errors are > > usually reported via MCE. > > > > Rename the memory parity error handler to pci serr handler and > > print a warning and continue instead of crashing. > > > > Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> > > > > --- > > > > diff -r 598d1fc295b6 xen/arch/x86/traps.c > > --- a/xen/arch/x86/traps.c Thu Feb 24 09:33:19 2011 +0000 > > +++ b/xen/arch/x86/traps.c Fri Feb 25 10:37:47 2011 +0000 > > @@ -3075,23 +3075,12 @@ static void nmi_dom0_report(unsigned int > > send_guest_trap(d, 0, TRAP_nmi); > > } > > > > -static void mem_parity_error(struct cpu_user_regs *regs) > > +static void pci_serr_error(struct cpu_user_regs *regs) > > { > > - switch ( opt_nmi[0] ) > > - { > > - case ''d'': /* ''dom0'' */ > > - nmi_dom0_report(_XEN_NMIREASON_parity_error); > > - case ''i'': /* ''ignore'' */ > > - break; > > - default: /* ''fatal'' */ > > - console_force_unlock(); > > - printk("\n\nNMI - MEMORY ERROR\n"); > > - fatal_trap(TRAP_nmi, regs); > > - } > > + console_force_unlock(); > > + printk("\n\nNMI - PCI system error (SERR)\n"); > > Why do you remove the reporting of the event to Dom0? I''d rather > see this part stay and the public headers getting adjusted in a > compatible way. >Because it might not have anything to do with dom0: I wrote this patch to fix http://bugzilla.xensource.com/bugzilla/show_bug.cgi?id=1744, that is due to Xen trying to mask an MSI-X of a device assigned to a guest on shutdown. The device seems to be in a state in which it refuses any interactions so it sends a PCI SERR that becomes an NMI and used to crash Xen. _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Jan Beulich
2011-Feb-25 12:12 UTC
Re: [Xen-devel] [PATCH] NMI: continue in case of PCI SERR erros
>>> On 25.02.11 at 12:27, Stefano Stabellini <stefano.stabellini@eu.citrix.com>wrote:> On Fri, 25 Feb 2011, Jan Beulich wrote: >> >>> On 25.02.11 at 11:53, Stefano Stabellini <stefano.stabellini@eu.citrix.com> >> wrote: >> > Memory parity error is only valid for IBM PC-AT, newer machines use >> > bit 7 (0x80) of 0x61 port for PCI SERR. While memory errors are >> > usually reported via MCE. >> > >> > Rename the memory parity error handler to pci serr handler and >> > print a warning and continue instead of crashing. >> > >> > Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> >> > >> > --- >> > >> > diff -r 598d1fc295b6 xen/arch/x86/traps.c >> > --- a/xen/arch/x86/traps.c Thu Feb 24 09:33:19 2011 +0000 >> > +++ b/xen/arch/x86/traps.c Fri Feb 25 10:37:47 2011 +0000 >> > @@ -3075,23 +3075,12 @@ static void nmi_dom0_report(unsigned int >> > send_guest_trap(d, 0, TRAP_nmi); >> > } >> > >> > -static void mem_parity_error(struct cpu_user_regs *regs) >> > +static void pci_serr_error(struct cpu_user_regs *regs) >> > { >> > - switch ( opt_nmi[0] ) >> > - { >> > - case ''d'': /* ''dom0'' */ >> > - nmi_dom0_report(_XEN_NMIREASON_parity_error); >> > - case ''i'': /* ''ignore'' */ >> > - break; >> > - default: /* ''fatal'' */ >> > - console_force_unlock(); >> > - printk("\n\nNMI - MEMORY ERROR\n"); >> > - fatal_trap(TRAP_nmi, regs); >> > - } >> > + console_force_unlock(); >> > + printk("\n\nNMI - PCI system error (SERR)\n"); >> >> Why do you remove the reporting of the event to Dom0? I''d rather >> see this part stay and the public headers getting adjusted in a >> compatible way. >> > > Because it might not have anything to do with dom0: I wrote this patchAs you say: might.> to fix http://bugzilla.xensource.com/bugzilla/show_bug.cgi?id=1744, that > is due to Xen trying to mask an MSI-X of a device assigned to a guest on > shutdown. The device seems to be in a state in which it refuses any > interactions so it sends a PCI SERR that becomes an NMI and used to > crash Xen.I''m certainly agreeing to the part that avoids the crash. Jan _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Stefano Stabellini
2011-Feb-25 14:08 UTC
Re: [Xen-devel] [PATCH] NMI: continue in case of PCI SERR erros
On Fri, 25 Feb 2011, Jan Beulich wrote:> > Because it might not have anything to do with dom0: I wrote this patch > > As you say: might. >Ok. --- Memory parity error is only valid for IBM PC-AT, newer machines use bit 7 (0x80) of 0x61 port for PCI SERR. While memory errors are usually reported via MCE. Rename the memory parity error handler to pci serr handler and print a warning and continue instead of crashing (it is common to receive PCI SERR errors for performing operations on a device in the wrong power state). Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> diff -r 598d1fc295b6 xen/arch/x86/traps.c --- a/xen/arch/x86/traps.c Thu Feb 24 09:33:19 2011 +0000 +++ b/xen/arch/x86/traps.c Fri Feb 25 14:04:08 2011 +0000 @@ -3075,23 +3075,13 @@ static void nmi_dom0_report(unsigned int send_guest_trap(d, 0, TRAP_nmi); } -static void mem_parity_error(struct cpu_user_regs *regs) +static void pci_serr_error(struct cpu_user_regs *regs) { - switch ( opt_nmi[0] ) - { - case ''d'': /* ''dom0'' */ - nmi_dom0_report(_XEN_NMIREASON_parity_error); - case ''i'': /* ''ignore'' */ - break; - default: /* ''fatal'' */ - console_force_unlock(); - printk("\n\nNMI - MEMORY ERROR\n"); - fatal_trap(TRAP_nmi, regs); - } + nmi_dom0_report(_XEN_NMIREASON_pci_serr_error); + console_force_unlock(); + printk("\n\nNMI - PCI system error (SERR)\n"); - outb((inb(0x61) & 0x0f) | 0x04, 0x61); /* clear-and-disable parity check */ - mdelay(1); - outb((inb(0x61) & 0x0b) | 0x00, 0x61); /* enable parity check */ + outb((inb(0x61) & 0x0f) | 0x04, 0x61); /* clear-and-disable the PCI SERR error line. */ } static void io_check_error(struct cpu_user_regs *regs) @@ -3154,7 +3144,7 @@ asmlinkage void do_nmi(struct cpu_user_r { reason = inb(0x61); if ( reason & 0x80 ) - mem_parity_error(regs); + pci_serr_error(regs); else if ( reason & 0x40 ) io_check_error(regs); else if ( !nmi_watchdog ) diff -r 598d1fc295b6 xen/include/public/nmi.h --- a/xen/include/public/nmi.h Thu Feb 24 09:33:19 2011 +0000 +++ b/xen/include/public/nmi.h Fri Feb 25 14:04:08 2011 +0000 @@ -39,6 +39,9 @@ /* Parity error reported via ISA port 0x61, bit 7. */ #define _XEN_NMIREASON_parity_error 1 #define XEN_NMIREASON_parity_error (1UL << _XEN_NMIREASON_parity_error) + /* PCI SERR error reported via ISA port 0x61, bit 7. */ +#define _XEN_NMIREASON_pci_serr_error 1 +#define XEN_NMIREASON_pci_serr_error (1UL << _XEN_NMIREASON_pci_serr_error) /* Unknown hardware-generated NMI. */ #define _XEN_NMIREASON_unknown 2 #define XEN_NMIREASON_unknown (1UL << _XEN_NMIREASON_unknown) _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Keir Fraser
2011-Feb-25 14:32 UTC
Re: [Xen-devel] [PATCH] NMI: continue in case of PCI SERR erros
On 25/02/2011 14:08, "Stefano Stabellini" <stefano.stabellini@eu.citrix.com> wrote:> On Fri, 25 Feb 2011, Jan Beulich wrote: >>> Because it might not have anything to do with dom0: I wrote this patch >> >> As you say: might. >> > > Ok.I already applied the original patch. -- Keir> --- > > Memory parity error is only valid for IBM PC-AT, newer machines use > bit 7 (0x80) of 0x61 port for PCI SERR. While memory errors are > usually reported via MCE. > > Rename the memory parity error handler to pci serr handler and > print a warning and continue instead of crashing (it is common to > receive PCI SERR errors for performing operations on a device in the > wrong power state). > > Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> > > > diff -r 598d1fc295b6 xen/arch/x86/traps.c > --- a/xen/arch/x86/traps.c Thu Feb 24 09:33:19 2011 +0000 > +++ b/xen/arch/x86/traps.c Fri Feb 25 14:04:08 2011 +0000 > @@ -3075,23 +3075,13 @@ static void nmi_dom0_report(unsigned int > send_guest_trap(d, 0, TRAP_nmi); > } > > -static void mem_parity_error(struct cpu_user_regs *regs) > +static void pci_serr_error(struct cpu_user_regs *regs) > { > - switch ( opt_nmi[0] ) > - { > - case ''d'': /* ''dom0'' */ > - nmi_dom0_report(_XEN_NMIREASON_parity_error); > - case ''i'': /* ''ignore'' */ > - break; > - default: /* ''fatal'' */ > - console_force_unlock(); > - printk("\n\nNMI - MEMORY ERROR\n"); > - fatal_trap(TRAP_nmi, regs); > - } > + nmi_dom0_report(_XEN_NMIREASON_pci_serr_error); > + console_force_unlock(); > + printk("\n\nNMI - PCI system error (SERR)\n"); > > - outb((inb(0x61) & 0x0f) | 0x04, 0x61); /* clear-and-disable parity check > */ > - mdelay(1); > - outb((inb(0x61) & 0x0b) | 0x00, 0x61); /* enable parity check */ > + outb((inb(0x61) & 0x0f) | 0x04, 0x61); /* clear-and-disable the PCI SERR > error line. */ > } > > static void io_check_error(struct cpu_user_regs *regs) > @@ -3154,7 +3144,7 @@ asmlinkage void do_nmi(struct cpu_user_r > { > reason = inb(0x61); > if ( reason & 0x80 ) > - mem_parity_error(regs); > + pci_serr_error(regs); > else if ( reason & 0x40 ) > io_check_error(regs); > else if ( !nmi_watchdog ) > diff -r 598d1fc295b6 xen/include/public/nmi.h > --- a/xen/include/public/nmi.h Thu Feb 24 09:33:19 2011 +0000 > +++ b/xen/include/public/nmi.h Fri Feb 25 14:04:08 2011 +0000 > @@ -39,6 +39,9 @@ > /* Parity error reported via ISA port 0x61, bit 7. */ > #define _XEN_NMIREASON_parity_error 1 > #define XEN_NMIREASON_parity_error (1UL << _XEN_NMIREASON_parity_error) > + /* PCI SERR error reported via ISA port 0x61, bit 7. */ > +#define _XEN_NMIREASON_pci_serr_error 1 > +#define XEN_NMIREASON_pci_serr_error (1UL << _XEN_NMIREASON_pci_serr_error) > /* Unknown hardware-generated NMI. */ > #define _XEN_NMIREASON_unknown 2 > #define XEN_NMIREASON_unknown (1UL << _XEN_NMIREASON_unknown) > > _______________________________________________ > Xen-devel mailing list > Xen-devel@lists.xensource.com > http://lists.xensource.com/xen-devel_______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel