[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] RE: [Xen-devel] Re: One question to IST stack for PV guest
On Sat, 2009-12-19 at 14:41 +0000, Jiang, Yunhong wrote: > Can SysRQ-L be used to check dead-locked CPU's state? As I understand it yes, it can be used to debug CPUs hung with interrupts disabled. > And if we have no NMI support, we may lost that part. I think so. It's still useful for other classes of hang (i.e. those where interrupts are enabled). Ian. > > --jyh > > >-----Original Message----- > >From: Ian Campbell [mailto:Ian.Campbell@xxxxxxxxxx] > >Sent: Saturday, December 19, 2009 5:25 PM > >To: Jeremy Fitzhardinge > >Cc: Jiang, Yunhong; Kleen, Andi; xen-devel@xxxxxxxxxxxxxxxxxxx; Keir Fraser; > >Jan > >Beulich > >Subject: Re: [Xen-devel] Re: One question to IST stack for PV guest > > > >On Fri, 2009-12-18 at 21:21 +0000, Jeremy Fitzhardinge wrote: > >> > >> > BTW, Jeremy, seems vNMI support is not included in pvops dom0, will > >> it be supported in future? > >> > > >> > >> There's been no call for it so far, so I hadn't worried about it much. > >> I was thinking it might be useful as a debug tool, but I don't know > >> what it gets used for normally. > > > >SysRQ-L (show all cpus) uses it via arch_trigger_all_cpu_backtrace() > >which is a bit of a problem even in a domU because it goes to > >apic->send_IPI_all(NMI_VECTOR) which ends up "BUG: unable to handle > >kernel paging request" in default_send_IPI_mask_logical. > > > >I started adding a new smp_op to handle allow this function to be > >overidden yesterday (WIP appended) but having some sort of NMI support > >would be useful so reduce the differences with native on the receiving > >end, instead of using smp_call_function. > > > >Ian. > > > > > >diff --git a/arch/x86/include/asm/smp.h b/arch/x86/include/asm/smp.h > >index 1e79678..00ef5f7 100644 > >--- a/arch/x86/include/asm/smp.h > >+++ b/arch/x86/include/asm/smp.h > >@@ -60,6 +60,8 @@ struct smp_ops { > > > > void (*send_call_func_ipi)(const struct cpumask *mask); > > void (*send_call_func_single_ipi)(int cpu); > >+ > >+ void (*send_nmi_ipi)(void); > > }; > > > > /* Globals due to paravirt */ > >@@ -126,6 +128,11 @@ static inline void > >arch_send_call_function_ipi_mask(const > >struct cpumask *mask) > > smp_ops.send_call_func_ipi(mask); > > } > > > >+static inline void smp_send_nmi_ipi(void) > >+{ > >+ smp_ops.send_nmi_ipi(); > >+} > >+ > > void cpu_disable_common(void); > > void native_smp_prepare_boot_cpu(void); > > void native_smp_prepare_cpus(unsigned int max_cpus); > >@@ -139,6 +146,8 @@ void play_dead_common(void); > > void native_send_call_func_ipi(const struct cpumask *mask); > > void native_send_call_func_single_ipi(int cpu); > > > >+void native_send_nmi_ipi(void); > >+ > > void smp_store_cpu_info(int id); > > #define cpu_physical_id(cpu) per_cpu(x86_cpu_to_apicid, cpu) > > > >diff --git a/arch/x86/kernel/apic/nmi.c b/arch/x86/kernel/apic/nmi.c > >index 7ff61d6..40c1414 100644 > >--- a/arch/x86/kernel/apic/nmi.c > >+++ b/arch/x86/kernel/apic/nmi.c > >@@ -561,7 +561,7 @@ void arch_trigger_all_cpu_backtrace(void) > > cpumask_copy(&backtrace_mask, cpu_online_mask); > > > > printk(KERN_INFO "sending NMI to all CPUs:\n"); > >- apic->send_IPI_all(NMI_VECTOR); > >+ smp_send_nmi_ipi(); > > > > /* Wait for up to 10 seconds for all CPUs to do the backtrace */ > > for (i = 0; i < 10 * 1000; i++) { > >diff --git a/arch/x86/kernel/smp.c b/arch/x86/kernel/smp.c > >index ec1de97..f53437f 100644 > >--- a/arch/x86/kernel/smp.c > >+++ b/arch/x86/kernel/smp.c > >@@ -146,6 +146,11 @@ void native_send_call_func_ipi(const struct cpumask > >*mask) > > free_cpumask_var(allbutself); > > } > > > >+void native_send_nmi_ipi(void) > >+{ > >+ apic->send_IPI_all(NMI_VECTOR); > >+} > >+ > > /* > > * this function calls the 'stop' function on all other CPUs in the system. > > */ > >@@ -236,5 +241,7 @@ struct smp_ops smp_ops = { > > > > .send_call_func_ipi = native_send_call_func_ipi, > > .send_call_func_single_ipi = native_send_call_func_single_ipi, > >+ > >+ .send_nmi_ipi = native_send_nmi_ipi, > > }; > > EXPORT_SYMBOL_GPL(smp_ops); > >diff --git a/arch/x86/xen/smp.c b/arch/x86/xen/smp.c > >index 360f8d8..986f372 100644 > >--- a/arch/x86/xen/smp.c > >+++ b/arch/x86/xen/smp.c > >@@ -20,6 +20,7 @@ > > #include <asm/desc.h> > > #include <asm/pgtable.h> > > #include <asm/cpu.h> > >+#include <asm/nmi.h> > > > > #include <xen/interface/xen.h> > > #include <xen/interface/vcpu.h> > >@@ -456,6 +457,16 @@ static irqreturn_t > >xen_call_function_single_interrupt(int > >irq, void *dev_id) > > return IRQ_HANDLED; > > } > > > >+static void xen_nmi_ipi_func(void *info) > >+{ > >+ nmi_watchdog_tick(task_pt_regs(current), 0/*reason*/); > >+} > >+ > >+static void xen_send_nmi_ipi(void) > >+{ > >+ smp_call_function(xen_nmi_ipi_func, NULL, 0); > >+} > >+ > > static const struct smp_ops xen_smp_ops __initdata = { > > .smp_prepare_boot_cpu = xen_smp_prepare_boot_cpu, > > .smp_prepare_cpus = xen_smp_prepare_cpus, > >@@ -471,6 +482,8 @@ static const struct smp_ops xen_smp_ops __initdata = { > > > > .send_call_func_ipi = xen_smp_send_call_function_ipi, > > .send_call_func_single_ipi = xen_smp_send_call_function_single_ipi, > >+ > >+ .send_nmi_ipi = xen_send_nmi_ipi, > > }; > > > > void __init xen_smp_init(void) > > > _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |