- bnc#603583 - Fix migration of domUs using tapdisk devices
21317-xend-blkif-util-tap2.patch suse-disable-tap2-default.patch - Match upstreams cpu pools switch from domctl to sysctl - Upstream replacements for two of our custom patches (to ease applying further backports) - Fixed dump-exec-state.patch (could previously hang the system, as could - with lower probability - the un-patched implementation) - bnc#593536 - xen hypervisor takes very long to initialize Dom0 on 128 CPUs and 256Gb 21272-x86-dom0-alloc-performance.patch 21266-vmx-disabled-check.patch 21271-x86-cache-flush-global.patch - bnc#558815 - using multiple npiv luns with same wwpn/wwnn broken - bnc#601104 - Xen /etc/xen/scripts/block-npiv script fails when accessing multiple disks using NPIV block-npiv - bnc#595124 - VT-d can not be enabled on 32PAE Xen on Nehalem-EX platform 21234-x86-bad-srat-clear-pxm2node.patch bnc#585371 - kdump fails to load with xen: locate_hole failed 21235-crashkernel-advanced.patch - bnc#588918 - Attaching a U-disk to domain's failed by "xm usb-attach" init.xend OBS-URL: https://build.opensuse.org/package/show/Virtualization/xen?expand=0&rev=44
This commit is contained in:
committed by
Git OBS Bridge
parent
15e24c8338
commit
4b4fa7f68d
@@ -1,54 +1,79 @@
|
||||
Index: xen-4.0.0-testing/xen/arch/ia64/linux-xen/smp.c
|
||||
===================================================================
|
||||
--- xen-4.0.0-testing.orig/xen/arch/ia64/linux-xen/smp.c
|
||||
+++ xen-4.0.0-testing/xen/arch/ia64/linux-xen/smp.c
|
||||
@@ -189,7 +189,7 @@ handle_IPI (int irq, void *dev_id, struc
|
||||
* At this point the structure may be gone unless
|
||||
* wait is true.
|
||||
*/
|
||||
- (*func)(info);
|
||||
+ (*func)(info ?: regs);
|
||||
--- a/xen/arch/ia64/linux-xen/smp.c
|
||||
+++ b/xen/arch/ia64/linux-xen/smp.c
|
||||
@@ -94,6 +94,7 @@ static volatile struct call_data_struct
|
||||
|
||||
/* Notify the sending CPU that the task is done. */
|
||||
mb();
|
||||
Index: xen-4.0.0-testing/xen/arch/x86/smp.c
|
||||
===================================================================
|
||||
--- xen-4.0.0-testing.orig/xen/arch/x86/smp.c
|
||||
+++ xen-4.0.0-testing/xen/arch/x86/smp.c
|
||||
@@ -395,7 +395,7 @@ static void __smp_call_function_interrup
|
||||
#define IPI_CALL_FUNC 0
|
||||
#define IPI_CPU_STOP 1
|
||||
+#define IPI_STATE_DUMP 2
|
||||
|
||||
if ( call_data.wait )
|
||||
{
|
||||
- (*func)(info);
|
||||
+ (*func)(info ?: get_irq_regs());
|
||||
mb();
|
||||
atomic_inc(&call_data.finished);
|
||||
}
|
||||
@@ -403,7 +403,7 @@ static void __smp_call_function_interrup
|
||||
{
|
||||
mb();
|
||||
atomic_inc(&call_data.started);
|
||||
- (*func)(info);
|
||||
+ (*func)(info ?: get_irq_regs());
|
||||
}
|
||||
/* This needs to be cacheline aligned because it is written to by *other* CPUs. */
|
||||
static DEFINE_PER_CPU(u64, ipi_operation) ____cacheline_aligned;
|
||||
@@ -202,6 +203,10 @@ handle_IPI (int irq, void *dev_id, struc
|
||||
stop_this_cpu();
|
||||
break;
|
||||
|
||||
irq_exit();
|
||||
Index: xen-4.0.0-testing/xen/common/keyhandler.c
|
||||
===================================================================
|
||||
--- xen-4.0.0-testing.orig/xen/common/keyhandler.c
|
||||
+++ xen-4.0.0-testing/xen/common/keyhandler.c
|
||||
@@ -71,20 +71,45 @@ static struct keyhandler show_handlers_k
|
||||
+ case IPI_STATE_DUMP:
|
||||
+ dump_execstate(regs);
|
||||
+ break;
|
||||
+
|
||||
default:
|
||||
printk(KERN_CRIT "Unknown IPI on CPU %d: %lu\n", this_cpu, which);
|
||||
break;
|
||||
@@ -479,6 +484,12 @@ smp_send_stop (void)
|
||||
send_IPI_allbutself(IPI_CPU_STOP);
|
||||
}
|
||||
|
||||
+void
|
||||
+smp_send_state_dump (unsigned int cpu)
|
||||
+{
|
||||
+ send_IPI_single(cpu, IPI_STATE_DUMP);
|
||||
+}
|
||||
+
|
||||
int __init
|
||||
setup_profiling_timer (unsigned int multiplier)
|
||||
{
|
||||
--- a/xen/arch/x86/smp.c
|
||||
+++ b/xen/arch/x86/smp.c
|
||||
@@ -375,11 +375,24 @@ void smp_send_nmi_allbutself(void)
|
||||
send_IPI_mask(&cpu_online_map, APIC_DM_NMI);
|
||||
}
|
||||
|
||||
+void smp_send_state_dump(unsigned int cpu)
|
||||
+{
|
||||
+ state_dump_pending(cpu) = 1;
|
||||
+ smp_send_event_check_cpu(cpu);
|
||||
+}
|
||||
+
|
||||
fastcall void smp_event_check_interrupt(struct cpu_user_regs *regs)
|
||||
{
|
||||
struct cpu_user_regs *old_regs = set_irq_regs(regs);
|
||||
ack_APIC_irq();
|
||||
perfc_incr(ipis);
|
||||
+ if ( unlikely(state_dump_pending(smp_processor_id())) )
|
||||
+ {
|
||||
+ irq_enter();
|
||||
+ state_dump_pending(smp_processor_id()) = 0;
|
||||
+ dump_execstate(regs);
|
||||
+ irq_exit();
|
||||
+ }
|
||||
set_irq_regs(old_regs);
|
||||
}
|
||||
|
||||
--- a/xen/common/keyhandler.c
|
||||
+++ b/xen/common/keyhandler.c
|
||||
@@ -71,19 +71,52 @@ static struct keyhandler show_handlers_k
|
||||
.desc = "show this message"
|
||||
};
|
||||
|
||||
-static void __dump_execstate(void *unused)
|
||||
+#ifdef CONFIG_SMP
|
||||
+static cpumask_t dump_execstate_mask;
|
||||
+#endif
|
||||
+
|
||||
+static void __dump_execstate(void *_regs)
|
||||
+void dump_execstate(struct cpu_user_regs *regs)
|
||||
{
|
||||
- dump_execution_state();
|
||||
- printk("*** Dumping CPU%d guest state: ***\n", smp_processor_id());
|
||||
+ struct cpu_user_regs *regs = _regs;
|
||||
+ unsigned int cpu = smp_processor_id();
|
||||
+
|
||||
+ if ( !guest_mode(regs) )
|
||||
@@ -67,12 +92,14 @@ Index: xen-4.0.0-testing/xen/common/keyhandler.c
|
||||
show_execution_state(guest_cpu_user_regs());
|
||||
+ }
|
||||
+
|
||||
+#ifdef CONFIG_SMP
|
||||
+ cpu_clear(cpu, dump_execstate_mask);
|
||||
+ if ( !alt_key_handling )
|
||||
+ return;
|
||||
+
|
||||
+ cpu = cycle_cpu(cpu, dump_execstate_mask);
|
||||
+ if ( cpu < NR_CPUS )
|
||||
+ {
|
||||
+ cpu_clear(cpu, dump_execstate_mask);
|
||||
+ on_selected_cpus(cpumask_of(cpu), __dump_execstate, NULL, 0);
|
||||
+ }
|
||||
+ smp_send_state_dump(cpu);
|
||||
+ else
|
||||
+ {
|
||||
+ printk("\n");
|
||||
@@ -80,44 +107,52 @@ Index: xen-4.0.0-testing/xen/common/keyhandler.c
|
||||
+ console_end_sync();
|
||||
+ watchdog_enable();
|
||||
+ }
|
||||
+#endif
|
||||
}
|
||||
|
||||
static void dump_registers(unsigned char key, struct cpu_user_regs *regs)
|
||||
{
|
||||
- unsigned int cpu;
|
||||
-
|
||||
+#ifdef CONFIG_SMP
|
||||
unsigned int cpu;
|
||||
+#endif
|
||||
|
||||
/* We want to get everything out that we possibly can. */
|
||||
watchdog_disable();
|
||||
console_start_sync();
|
||||
@@ -92,21 +117,9 @@ static void dump_registers(unsigned char
|
||||
@@ -91,17 +124,28 @@ static void dump_registers(unsigned char
|
||||
|
||||
printk("'%c' pressed -> dumping registers\n", key);
|
||||
|
||||
+#ifdef CONFIG_SMP
|
||||
+ if ( alt_key_handling )
|
||||
+ dump_execstate_mask = cpu_online_map;
|
||||
+#endif
|
||||
+
|
||||
/* Get local execution state out immediately, in case we get stuck. */
|
||||
- printk("\n*** Dumping CPU%d host state: ***\n", smp_processor_id());
|
||||
- __dump_execstate(NULL);
|
||||
-
|
||||
- for_each_online_cpu ( cpu )
|
||||
- {
|
||||
- if ( cpu == smp_processor_id() )
|
||||
- continue;
|
||||
+ dump_execstate(regs);
|
||||
+
|
||||
+#ifdef CONFIG_SMP
|
||||
+ if ( alt_key_handling )
|
||||
+ return;
|
||||
|
||||
for_each_online_cpu ( cpu )
|
||||
{
|
||||
if ( cpu == smp_processor_id() )
|
||||
continue;
|
||||
- printk("\n*** Dumping CPU%d host state: ***\n", cpu);
|
||||
- on_selected_cpus(cpumask_of(cpu), __dump_execstate, NULL, 1);
|
||||
- }
|
||||
-
|
||||
- printk("\n");
|
||||
-
|
||||
- console_end_sync();
|
||||
- watchdog_enable();
|
||||
+ cpus_andnot(dump_execstate_mask, cpu_online_map,
|
||||
+ cpumask_of_cpu(smp_processor_id()));
|
||||
+ __dump_execstate(regs);
|
||||
}
|
||||
+ cpu_set(cpu, dump_execstate_mask);
|
||||
+ smp_send_state_dump(cpu);
|
||||
+ while ( cpu_isset(cpu, dump_execstate_mask) )
|
||||
+ cpu_relax();
|
||||
}
|
||||
+#endif
|
||||
|
||||
static struct keyhandler dump_registers_keyhandler = {
|
||||
Index: xen-4.0.0-testing/xen/include/asm-ia64/linux-xen/asm/ptrace.h
|
||||
===================================================================
|
||||
--- xen-4.0.0-testing.orig/xen/include/asm-ia64/linux-xen/asm/ptrace.h
|
||||
+++ xen-4.0.0-testing/xen/include/asm-ia64/linux-xen/asm/ptrace.h
|
||||
printk("\n");
|
||||
|
||||
--- a/xen/include/asm-ia64/linux-xen/asm/ptrace.h
|
||||
+++ b/xen/include/asm-ia64/linux-xen/asm/ptrace.h
|
||||
@@ -278,7 +278,7 @@ struct switch_stack {
|
||||
# define ia64_task_regs(t) (((struct pt_regs *) ((char *) (t) + IA64_STK_OFFSET)) - 1)
|
||||
# define ia64_psr(regs) ((struct ia64_psr *) &(regs)->cr_ipsr)
|
||||
@@ -127,3 +162,43 @@ Index: xen-4.0.0-testing/xen/include/asm-ia64/linux-xen/asm/ptrace.h
|
||||
# define guest_kernel_mode(regs) (ia64_psr(regs)->cpl == CONFIG_CPL0_EMUL)
|
||||
# define vmx_guest_kernel_mode(regs) (ia64_psr(regs)->cpl == 0)
|
||||
# define regs_increment_iip(regs) \
|
||||
--- a/xen/include/asm-x86/hardirq.h
|
||||
+++ b/xen/include/asm-x86/hardirq.h
|
||||
@@ -8,6 +8,7 @@ typedef struct {
|
||||
unsigned long __softirq_pending;
|
||||
unsigned int __local_irq_count;
|
||||
unsigned int __nmi_count;
|
||||
+ bool_t __state_dump_pending;
|
||||
} __cacheline_aligned irq_cpustat_t;
|
||||
|
||||
#include <xen/irq_cpustat.h> /* Standard mappings for irq_cpustat_t above */
|
||||
--- a/xen/include/xen/irq_cpustat.h
|
||||
+++ b/xen/include/xen/irq_cpustat.h
|
||||
@@ -26,5 +26,6 @@ extern irq_cpustat_t irq_stat[];
|
||||
#define softirq_pending(cpu) __IRQ_STAT((cpu), __softirq_pending)
|
||||
#define local_irq_count(cpu) __IRQ_STAT((cpu), __local_irq_count)
|
||||
#define nmi_count(cpu) __IRQ_STAT((cpu), __nmi_count)
|
||||
+#define state_dump_pending(cpu) __IRQ_STAT((cpu), __state_dump_pending)
|
||||
|
||||
#endif /* __irq_cpustat_h */
|
||||
--- a/xen/include/xen/lib.h
|
||||
+++ b/xen/include/xen/lib.h
|
||||
@@ -111,4 +111,7 @@ extern int tainted;
|
||||
extern char *print_tainted(char *str);
|
||||
extern void add_taint(unsigned);
|
||||
|
||||
+struct cpu_user_regs;
|
||||
+void dump_execstate(struct cpu_user_regs *);
|
||||
+
|
||||
#endif /* __LIB_H__ */
|
||||
--- a/xen/include/xen/smp.h
|
||||
+++ b/xen/include/xen/smp.h
|
||||
@@ -13,6 +13,8 @@ extern void smp_send_event_check_mask(co
|
||||
#define smp_send_event_check_cpu(cpu) \
|
||||
smp_send_event_check_mask(cpumask_of(cpu))
|
||||
|
||||
+extern void smp_send_state_dump(unsigned int cpu);
|
||||
+
|
||||
/*
|
||||
* Prepare machine for booting other CPUs.
|
||||
*/
|
||||
|
Reference in New Issue
Block a user