|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v2 1/2] xen/x86: cleanup unused NMI/MCE code
pv_raise_interrupt() is only called for NMIs these days, so the MCE
specific part can be removed. Rename pv_raise_interrupt() to
pv_raise_nmi() and NMI_MCE_SOFTIRQ to NMI_SOFTIRQ.
Additionally there is no need to pin the vcpu the NMI is delivered
to, that is a leftover of (already removed) MCE handling. So remove
the pinning, too.
Signed-off-by: Juergen Gross <jgross@xxxxxxxx>
---
xen/arch/x86/pv/traps.c | 88 ++++++++----------------------------------
xen/arch/x86/traps.c | 10 +----
xen/common/domain.c | 3 --
xen/include/asm-x86/pv/traps.h | 8 ++--
xen/include/asm-x86/softirq.h | 2 +-
xen/include/xen/sched.h | 2 -
6 files changed, 23 insertions(+), 90 deletions(-)
diff --git a/xen/arch/x86/pv/traps.c b/xen/arch/x86/pv/traps.c
index 1740784ff2..9436c80047 100644
--- a/xen/arch/x86/pv/traps.c
+++ b/xen/arch/x86/pv/traps.c
@@ -136,47 +136,21 @@ bool set_guest_nmi_trapbounce(void)
return !null_trap_bounce(curr, tb);
}
-struct softirq_trap {
- struct domain *domain; /* domain to inject trap */
- struct vcpu *vcpu; /* vcpu to inject trap */
- unsigned int processor; /* physical cpu to inject trap */
-};
+static DEFINE_PER_CPU(struct vcpu *, softirq_nmi_vcpu);
-static DEFINE_PER_CPU(struct softirq_trap, softirq_trap);
-
-static void nmi_mce_softirq(void)
+static void nmi_softirq(void)
{
unsigned int cpu = smp_processor_id();
- struct softirq_trap *st = &per_cpu(softirq_trap, cpu);
-
- BUG_ON(st->vcpu == NULL);
-
- /*
- * Set the tmp value unconditionally, so that the check in the iret
- * hypercall works.
- */
- cpumask_copy(st->vcpu->cpu_hard_affinity_tmp,
- st->vcpu->cpu_hard_affinity);
+ struct vcpu **v_ptr = &per_cpu(softirq_nmi_vcpu, cpu);
- if ( (cpu != st->processor) ||
- (st->processor != st->vcpu->processor) )
- {
-
- /*
- * We are on a different physical cpu. Make sure to wakeup the vcpu on
- * the specified processor.
- */
- vcpu_set_hard_affinity(st->vcpu, cpumask_of(st->processor));
-
- /* Affinity is restored in the iret hypercall. */
- }
+ BUG_ON(*v_ptr == NULL);
/*
- * Only used to defer wakeup of domain/vcpu to a safe (non-NMI/MCE)
+ * Only used to defer wakeup of domain/vcpu to a safe (non-NMI)
* context.
*/
- vcpu_kick(st->vcpu);
- st->vcpu = NULL;
+ vcpu_kick(*v_ptr);
+ *v_ptr = NULL;
}
void __init pv_trap_init(void)
@@ -189,50 +163,22 @@ void __init pv_trap_init(void)
_set_gate(idt_table + LEGACY_SYSCALL_VECTOR, SYS_DESC_trap_gate, 3,
&int80_direct_trap);
- open_softirq(NMI_MCE_SOFTIRQ, nmi_mce_softirq);
+ open_softirq(NMI_SOFTIRQ, nmi_softirq);
}
-int pv_raise_interrupt(struct vcpu *v, uint8_t vector)
+int pv_raise_nmi(struct vcpu *v)
{
- struct softirq_trap *st = &per_cpu(softirq_trap, smp_processor_id());
+ struct vcpu **v_ptr = &per_cpu(softirq_nmi_vcpu, smp_processor_id());
- switch ( vector )
+ if ( cmpxchgptr(v_ptr, NULL, v) )
+ return -EBUSY;
+ if ( !test_and_set_bool(v->nmi_pending) )
{
- case TRAP_nmi:
- if ( cmpxchgptr(&st->vcpu, NULL, v) )
- return -EBUSY;
- if ( !test_and_set_bool(v->nmi_pending) )
- {
- st->domain = v->domain;
- st->processor = v->processor;
-
- /* Not safe to wake up a vcpu here */
- raise_softirq(NMI_MCE_SOFTIRQ);
- return 0;
- }
- st->vcpu = NULL;
- break;
-
- case TRAP_machine_check:
- if ( cmpxchgptr(&st->vcpu, NULL, v) )
- return -EBUSY;
-
- /*
- * We are called by the machine check (exception or polling) handlers
- * on the physical CPU that reported a machine check error.
- */
- if ( !test_and_set_bool(v->mce_pending) )
- {
- st->domain = v->domain;
- st->processor = v->processor;
-
- /* not safe to wake up a vcpu here */
- raise_softirq(NMI_MCE_SOFTIRQ);
- return 0;
- }
- st->vcpu = NULL;
- break;
+ /* Not safe to wake up a vcpu here */
+ raise_softirq(NMI_SOFTIRQ);
+ return 0;
}
+ *v_ptr = NULL;
/* Delivery failed */
return -EIO;
diff --git a/xen/arch/x86/traps.c b/xen/arch/x86/traps.c
index 25b4b47e5e..08d7edc568 100644
--- a/xen/arch/x86/traps.c
+++ b/xen/arch/x86/traps.c
@@ -1600,14 +1600,6 @@ void async_exception_cleanup(struct vcpu *curr)
if ( !curr->async_exception_mask )
return;
- /* Restore affinity. */
- if ( !cpumask_empty(curr->cpu_hard_affinity_tmp) &&
- !cpumask_equal(curr->cpu_hard_affinity_tmp, curr->cpu_hard_affinity) )
- {
- vcpu_set_hard_affinity(curr, curr->cpu_hard_affinity_tmp);
- cpumask_clear(curr->cpu_hard_affinity_tmp);
- }
-
if ( !(curr->async_exception_mask & (curr->async_exception_mask - 1)) )
trap = __scanbit(curr->async_exception_mask, VCPU_TRAP_NONE);
else
@@ -1634,7 +1626,7 @@ static void nmi_hwdom_report(unsigned int reason_idx)
set_bit(reason_idx, nmi_reason(d));
- pv_raise_interrupt(d->vcpu[0], TRAP_nmi);
+ pv_raise_nmi(d->vcpu[0]);
}
static void pci_serr_error(const struct cpu_user_regs *regs)
diff --git a/xen/common/domain.c b/xen/common/domain.c
index 55aa759b75..bc56a51815 100644
--- a/xen/common/domain.c
+++ b/xen/common/domain.c
@@ -133,7 +133,6 @@ static void vcpu_info_reset(struct vcpu *v)
static void vcpu_destroy(struct vcpu *v)
{
free_cpumask_var(v->cpu_hard_affinity);
- free_cpumask_var(v->cpu_hard_affinity_tmp);
free_cpumask_var(v->cpu_hard_affinity_saved);
free_cpumask_var(v->cpu_soft_affinity);
@@ -161,7 +160,6 @@ struct vcpu *vcpu_create(
grant_table_init_vcpu(v);
if ( !zalloc_cpumask_var(&v->cpu_hard_affinity) ||
- !zalloc_cpumask_var(&v->cpu_hard_affinity_tmp) ||
!zalloc_cpumask_var(&v->cpu_hard_affinity_saved) ||
!zalloc_cpumask_var(&v->cpu_soft_affinity) )
goto fail;
@@ -1269,7 +1267,6 @@ int vcpu_reset(struct vcpu *v)
v->async_exception_mask = 0;
memset(v->async_exception_state, 0, sizeof(v->async_exception_state));
#endif
- cpumask_clear(v->cpu_hard_affinity_tmp);
clear_bit(_VPF_blocked, &v->pause_flags);
clear_bit(_VPF_in_reset, &v->pause_flags);
diff --git a/xen/include/asm-x86/pv/traps.h b/xen/include/asm-x86/pv/traps.h
index fcc75f5e9a..47d6cf5fc4 100644
--- a/xen/include/asm-x86/pv/traps.h
+++ b/xen/include/asm-x86/pv/traps.h
@@ -27,8 +27,8 @@
void pv_trap_init(void);
-/* Deliver interrupt to PV guest. Return 0 on success. */
-int pv_raise_interrupt(struct vcpu *v, uint8_t vector);
+/* Deliver NMI to PV guest. Return 0 on success. */
+int pv_raise_nmi(struct vcpu *v);
int pv_emulate_privileged_op(struct cpu_user_regs *regs);
void pv_emulate_gate_op(struct cpu_user_regs *regs);
@@ -46,8 +46,8 @@ static inline bool pv_trap_callback_registered(const struct
vcpu *v,
static inline void pv_trap_init(void) {}
-/* Deliver interrupt to PV guest. Return 0 on success. */
-static inline int pv_raise_interrupt(struct vcpu *v, uint8_t vector) { return
-EOPNOTSUPP; }
+/* Deliver NMI to PV guest. Return 0 on success. */
+static inline int pv_raise_nmi(struct vcpu *v) { return -EOPNOTSUPP; }
static inline int pv_emulate_privileged_op(struct cpu_user_regs *regs) {
return 0; }
static inline void pv_emulate_gate_op(struct cpu_user_regs *regs) {}
diff --git a/xen/include/asm-x86/softirq.h b/xen/include/asm-x86/softirq.h
index 5c1a7db566..0b7a77f11f 100644
--- a/xen/include/asm-x86/softirq.h
+++ b/xen/include/asm-x86/softirq.h
@@ -1,7 +1,7 @@
#ifndef __ASM_SOFTIRQ_H__
#define __ASM_SOFTIRQ_H__
-#define NMI_MCE_SOFTIRQ (NR_COMMON_SOFTIRQS + 0)
+#define NMI_SOFTIRQ (NR_COMMON_SOFTIRQS + 0)
#define TIME_CALIBRATE_SOFTIRQ (NR_COMMON_SOFTIRQS + 1)
#define VCPU_KICK_SOFTIRQ (NR_COMMON_SOFTIRQS + 2)
diff --git a/xen/include/xen/sched.h b/xen/include/xen/sched.h
index b40c8fd138..c197e93d73 100644
--- a/xen/include/xen/sched.h
+++ b/xen/include/xen/sched.h
@@ -245,8 +245,6 @@ struct vcpu
/* Bitmask of CPUs on which this VCPU may run. */
cpumask_var_t cpu_hard_affinity;
- /* Used to change affinity temporarily. */
- cpumask_var_t cpu_hard_affinity_tmp;
/* Used to restore affinity across S3. */
cpumask_var_t cpu_hard_affinity_saved;
--
2.16.4
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |