Page MenuHomeFreeBSD

D29404.id105934.diff
No OneTemporary

D29404.id105934.diff

Index: sys/dev/xen/bus/xen_intr.c
===================================================================
--- sys/dev/xen/bus/xen_intr.c
+++ sys/dev/xen/bus/xen_intr.c
@@ -136,7 +136,7 @@
static int xen_intr_source_pending(struct intsrc *isrc);
static int xen_intr_config_intr(struct intsrc *isrc,
enum intr_trigger trig, enum intr_polarity pol);
-static int xen_intr_assign_cpu(struct intsrc *isrc, u_int apic_id);
+static int xen_intr_assign_cpu(struct intsrc *isrc, u_int to_cpu);
/**
* PIC interface for all event channel port types except physical IRQs.
@@ -686,7 +686,7 @@
{
#ifdef SMP
int cpu = isrc->xi_cpu;
- int vcpu_id = pcpu_find(cpu)->pc_vcpu_id;
+ u_int vcpu_id = XEN_CPUID_TO_VCPUID(cpu);
int error;
struct evtchn_bind_ipi bind_ipi = { .vcpu = vcpu_id };
@@ -705,7 +705,7 @@
xen_rebind_virq(struct xenisrc *isrc)
{
int cpu = isrc->xi_cpu;
- int vcpu_id = pcpu_find(cpu)->pc_vcpu_id;
+ u_int vcpu_id = XEN_CPUID_TO_VCPUID(cpu);
int error;
struct evtchn_bind_virq bind_virq = { .virq = isrc->xi_virq,
.vcpu = vcpu_id };
@@ -743,8 +743,7 @@
#ifdef SMP
isrc->xi_cpu = 0;
- error = xen_intr_assign_cpu(&isrc->xi_intsrc,
- cpu_apic_ids[cpu]);
+ error = xen_intr_assign_cpu(&isrc->xi_intsrc, cpu);
if (error)
panic("%s(): unable to rebind Xen channel %u to vCPU%u: %d",
__func__, isrc->xi_port, cpu, error);
@@ -874,25 +873,22 @@
* Configure CPU affinity for interrupt source event delivery.
*
* \param isrc The interrupt source to configure.
- * \param apic_id The apic id of the CPU for handling future events.
+ * \param to_cpu The id of the CPU for handling future events.
*
* \returns 0 if successful, otherwise an errno.
*/
static int
-xen_intr_assign_cpu(struct intsrc *base_isrc, u_int apic_id)
+xen_intr_assign_cpu(struct intsrc *base_isrc, u_int to_cpu)
{
#ifdef SMP
struct evtchn_bind_vcpu bind_vcpu;
struct xenisrc *isrc;
- u_int to_cpu, vcpu_id;
+ u_int vcpu_id = XEN_CPUID_TO_VCPUID(to_cpu);
int error, masked;
if (!xen_has_percpu_evtchn())
return (EOPNOTSUPP);
- to_cpu = apic_cpuid(apic_id);
- vcpu_id = pcpu_find(to_cpu)->pc_vcpu_id;
-
mtx_lock(&xen_intr_isrc_lock);
isrc = (struct xenisrc *)base_isrc;
if (!is_valid_evtchn(isrc->xi_port)) {
@@ -1109,7 +1105,7 @@
driver_filter_t filter, driver_intr_t handler, void *arg,
enum intr_type flags, xen_intr_handle_t *port_handlep)
{
- int vcpu_id = pcpu_find(cpu)->pc_vcpu_id;
+ u_int vcpu_id = XEN_CPUID_TO_VCPUID(cpu);
struct xenisrc *isrc;
struct evtchn_bind_virq bind_virq = { .virq = virq, .vcpu = vcpu_id };
int error;
@@ -1150,7 +1146,7 @@
* masks manually so events can't fire on the wrong cpu
* during AP startup.
*/
- xen_intr_assign_cpu(&isrc->xi_intsrc, cpu_apic_ids[cpu]);
+ xen_intr_assign_cpu(&isrc->xi_intsrc, cpu);
}
#endif
@@ -1169,7 +1165,7 @@
enum intr_type flags, xen_intr_handle_t *port_handlep)
{
#ifdef SMP
- int vcpu_id = pcpu_find(cpu)->pc_vcpu_id;
+ u_int vcpu_id = XEN_CPUID_TO_VCPUID(cpu);
struct xenisrc *isrc;
struct evtchn_bind_ipi bind_ipi = { .vcpu = vcpu_id };
/* Same size as the one used by intr_handler->ih_name. */
@@ -1206,7 +1202,7 @@
* masks manually so events can't fire on the wrong cpu
* during AP startup.
*/
- xen_intr_assign_cpu(&isrc->xi_intsrc, cpu_apic_ids[cpu]);
+ xen_intr_assign_cpu(&isrc->xi_intsrc, cpu);
}
/*
Index: sys/dev/xen/debug/debug.c
===================================================================
--- sys/dev/xen/debug/debug.c
+++ sys/dev/xen/debug/debug.c
@@ -78,7 +78,7 @@
mtx_lock_spin(&lock);
sbuf_clear(buf);
- xc_printf("Printing stack trace vCPU%d\n", PCPU_GET(vcpu_id));
+ xc_printf("Printing stack trace vCPU%u\n", XEN_VCPUID());
stack_sbuf_print_ddb(buf, &st);
sbuf_finish(buf);
mtx_unlock_spin(&lock);
Index: sys/x86/include/xen/xen-os.h
===================================================================
--- sys/x86/include/xen/xen-os.h
+++ sys/x86/include/xen/xen-os.h
@@ -40,6 +40,8 @@
/* Everything below this point is not included by assembler (.S) files. */
#ifndef __ASSEMBLY__
+#include <sys/pcpu.h>
+
/* If non-zero, the hypervisor has been configured to use a direct vector */
extern int xen_vector_callback_enabled;
@@ -51,6 +53,13 @@
extern uint32_t xen_cpuid_base;
+static inline u_int
+XEN_CPUID_TO_VCPUID(u_int cpuid)
+{
+
+ return (pcpu_find(cpuid)->pc_vcpu_id);
+}
+
static inline bool
xen_has_percpu_evtchn(void)
{
Index: sys/xen/xen-os.h
===================================================================
--- sys/xen/xen-os.h
+++ sys/xen/xen-os.h
@@ -44,6 +44,8 @@
#include <xen/hvm.h>
#include <contrib/xen/event_channel.h>
+#define XEN_VCPUID() XEN_CPUID_TO_VCPUID(PCPU_GET(cpuid))
+
static inline vm_paddr_t
xen_get_xenstore_mfn(void)
{

File Metadata

Mime Type
text/plain
Expires
Tue, May 19, 7:02 AM (12 h, 5 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
33298590
Default Alt Text
D29404.id105934.diff (4 KB)

Event Timeline