Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 5 Oct 2013 23:11:02 +0000 (UTC)
From:      "Justin T. Gibbs" <gibbs@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r256073 - in head/sys: amd64/include dev/xen/timer i386/include i386/xen x86/acpica x86/xen
Message-ID:  <201310052311.r95NB2TL009041@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: gibbs
Date: Sat Oct  5 23:11:01 2013
New Revision: 256073
URL: http://svnweb.freebsd.org/changeset/base/256073

Log:
  Formalize the concept of virtual CPU ids by adding a per-cpu vcpu_id
  field.  Perform vcpu enumeration for Xen PV and HVM environments
  and convert all Xen drivers to use vcpu_id instead of a hard coded
  assumption of the mapping algorithm (acpi or apic ID) in use.
  
  Submitted by:	Roger Pau Monné
  Sponsored by:	Citrix Systems R&D
  Reviewed by:	gibbs
  Approved by:	re (blanket Xen)
  
  amd64/include/pcpu.h:
  i386/include/pcpu.h:
  	Add vcpu_id to the amd64 and i386 pcpu structures.
  
  dev/xen/timer/timer.c
  x86/xen/xen_intr.c
  	Use new vcpu_id instead of assuming acpi_id == vcpu_id.
  
  i386/xen/mp_machdep.c:
  i386/xen/mptable.c
  x86/xen/hvm.c:
  	Perform Xen HVM and Xen full PV vcpu_id mapping.
  
  x86/xen/hvm.c:
  x86/acpica/madt.c
  	Change SYSINIT ordering of acpi CPU enumeration so that it
  	is guaranteed to be available at the time of Xen HVM vcpu
  	id mapping.

Modified:
  head/sys/amd64/include/pcpu.h
  head/sys/dev/xen/timer/timer.c
  head/sys/i386/include/pcpu.h
  head/sys/i386/xen/mp_machdep.c
  head/sys/i386/xen/mptable.c
  head/sys/x86/acpica/madt.c
  head/sys/x86/xen/hvm.c
  head/sys/x86/xen/xen_intr.c

Modified: head/sys/amd64/include/pcpu.h
==============================================================================
--- head/sys/amd64/include/pcpu.h	Sat Oct  5 21:22:35 2013	(r256072)
+++ head/sys/amd64/include/pcpu.h	Sat Oct  5 23:11:01 2013	(r256073)
@@ -62,7 +62,8 @@
 	u_int	pc_cmci_mask;		/* MCx banks for CMCI */	\
 	uint64_t pc_dbreg[16];		/* ddb debugging regs */	\
 	int pc_dbreg_cmd;		/* ddb debugging reg cmd */	\
-	char	__pad[161]		/* be divisor of PAGE_SIZE	\
+	u_int	pc_vcpu_id;		/* Xen vCPU ID */		\
+	char	__pad[157]		/* be divisor of PAGE_SIZE	\
 					   after cache alignment */
 
 #define	PC_DBREG_CMD_NONE	0

Modified: head/sys/dev/xen/timer/timer.c
==============================================================================
--- head/sys/dev/xen/timer/timer.c	Sat Oct  5 21:22:35 2013	(r256072)
+++ head/sys/dev/xen/timer/timer.c	Sat Oct  5 23:11:01 2013	(r256073)
@@ -396,7 +396,7 @@ xentimer_et_start(struct eventtimer *et,
 {
 	int error = 0, i = 0;
 	struct xentimer_softc *sc = et->et_priv;
-	int cpu = PCPU_GET(acpi_id);
+	int cpu = PCPU_GET(vcpu_id);
 	struct xentimer_pcpu_data *pcpu = DPCPU_PTR(xentimer_pcpu);
 	uint64_t first_in_ns, next_time;
 
@@ -433,7 +433,7 @@ xentimer_et_start(struct eventtimer *et,
 static int
 xentimer_et_stop(struct eventtimer *et)
 {
-	int cpu = PCPU_GET(acpi_id);
+	int cpu = PCPU_GET(vcpu_id);
 	struct xentimer_pcpu_data *pcpu = DPCPU_PTR(xentimer_pcpu);
 
 	pcpu->timer = 0;

Modified: head/sys/i386/include/pcpu.h
==============================================================================
--- head/sys/i386/include/pcpu.h	Sat Oct  5 21:22:35 2013	(r256072)
+++ head/sys/i386/include/pcpu.h	Sat Oct  5 23:11:01 2013	(r256073)
@@ -62,13 +62,13 @@ struct shadow_time_info {
 	vm_paddr_t *pc_pdir_shadow;					\
 	uint64_t pc_processed_system_time;				\
 	struct shadow_time_info pc_shadow_time;				\
-	char	__pad[189]
+	char	__pad[185]
 
 #else /* !XEN */
 
 #define PCPU_XEN_FIELDS							\
 	;								\
-	char	__pad[237]
+	char	__pad[233]
 
 #endif
 
@@ -84,7 +84,8 @@ struct shadow_time_info {
 	u_int   pc_acpi_id;		/* ACPI CPU id */		\
 	u_int	pc_apic_id;						\
 	int	pc_private_tss;		/* Flag indicating private tss*/\
-	u_int	pc_cmci_mask		/* MCx banks for CMCI */	\
+	u_int	pc_cmci_mask;		/* MCx banks for CMCI */	\
+	u_int	pc_vcpu_id		/* Xen vCPU ID */		\
 	PCPU_XEN_FIELDS
 
 #ifdef _KERNEL

Modified: head/sys/i386/xen/mp_machdep.c
==============================================================================
--- head/sys/i386/xen/mp_machdep.c	Sat Oct  5 21:22:35 2013	(r256072)
+++ head/sys/i386/xen/mp_machdep.c	Sat Oct  5 23:11:01 2013	(r256073)
@@ -783,13 +783,7 @@ start_all_aps(void)
 		dpcpu_init((void *)kmem_malloc(kernel_arena, DPCPU_SIZE,
 		    M_WAITOK | M_ZERO), bootAP);
 		pc->pc_apic_id = cpu_apic_ids[bootAP];
-		/*
-		 * The i386 PV port uses the apic_id as vCPU id, but the
-		 * PVHVM port needs to use the acpi_id, so set it for PV
-		 * also in order to work with shared devices between PV
-		 * and PVHVM.
-		 */
-		pc->pc_acpi_id = cpu_apic_ids[bootAP];
+		pc->pc_vcpu_id = cpu_apic_ids[bootAP];
 		pc->pc_prvspace = pc;
 		pc->pc_curthread = 0;
 

Modified: head/sys/i386/xen/mptable.c
==============================================================================
--- head/sys/i386/xen/mptable.c	Sat Oct  5 21:22:35 2013	(r256072)
+++ head/sys/i386/xen/mptable.c	Sat Oct  5 23:11:01 2013	(r256073)
@@ -88,7 +88,7 @@ mptable_setup_local(void)
 {
 
 	PCPU_SET(apic_id, 0);
-	PCPU_SET(acpi_id, 0);
+	PCPU_SET(vcpu_id, 0);
 	return (0);
 }
 

Modified: head/sys/x86/acpica/madt.c
==============================================================================
--- head/sys/x86/acpica/madt.c	Sat Oct  5 21:22:35 2013	(r256072)
+++ head/sys/x86/acpica/madt.c	Sat Oct  5 23:11:01 2013	(r256073)
@@ -575,4 +575,4 @@ madt_set_ids(void *dummy)
 			    la->la_acpi_id);
 	}
 }
-SYSINIT(madt_set_ids, SI_SUB_CPU, SI_ORDER_ANY, madt_set_ids, NULL);
+SYSINIT(madt_set_ids, SI_SUB_CPU, SI_ORDER_MIDDLE, madt_set_ids, NULL);

Modified: head/sys/x86/xen/hvm.c
==============================================================================
--- head/sys/x86/xen/hvm.c	Sat Oct  5 21:22:35 2013	(r256072)
+++ head/sys/x86/xen/hvm.c	Sat Oct  5 23:11:01 2013	(r256073)
@@ -744,6 +744,22 @@ xen_hvm_sysinit(void *arg __unused)
 }
 
 static void
+xen_set_vcpu_id(void)
+{
+	struct pcpu *pc;
+	int i;
+
+	/* Set vcpu_id to acpi_id */
+	CPU_FOREACH(i) {
+		pc = pcpu_find(i);
+		pc->pc_vcpu_id = pc->pc_acpi_id;
+		if (bootverbose)
+			printf("XEN: CPU %u has VCPU ID %u\n",
+			       i, pc->pc_vcpu_id);
+	}
+}
+
+static void
 xen_hvm_cpu_init(void)
 {
 	struct vcpu_register_vcpu_info info;
@@ -763,7 +779,7 @@ xen_hvm_cpu_init(void)
 	}
 
 	vcpu_info = DPCPU_PTR(vcpu_local_info);
-	cpu = PCPU_GET(acpi_id);
+	cpu = PCPU_GET(vcpu_id);
 	info.mfn = vtophys(vcpu_info) >> PAGE_SHIFT;
 	info.offset = vtophys(vcpu_info) - trunc_page(vtophys(vcpu_info));
 
@@ -779,3 +795,4 @@ SYSINIT(xen_hvm_init, SI_SUB_HYPERVISOR,
 SYSINIT(xen_setup_cpus, SI_SUB_SMP, SI_ORDER_FIRST, xen_setup_cpus, NULL);
 #endif
 SYSINIT(xen_hvm_cpu_init, SI_SUB_INTR, SI_ORDER_FIRST, xen_hvm_cpu_init, NULL);
+SYSINIT(xen_set_vcpu_id, SI_SUB_CPU, SI_ORDER_ANY, xen_set_vcpu_id, NULL);

Modified: head/sys/x86/xen/xen_intr.c
==============================================================================
--- head/sys/x86/xen/xen_intr.c	Sat Oct  5 21:22:35 2013	(r256072)
+++ head/sys/x86/xen/xen_intr.c	Sat Oct  5 23:11:01 2013	(r256073)
@@ -611,9 +611,9 @@ xen_rebind_ipi(struct xenisrc *isrc)
 {
 #ifdef SMP
 	int cpu = isrc->xi_cpu;
-	int acpi_id = pcpu_find(cpu)->pc_acpi_id;
+	int vcpu_id = pcpu_find(cpu)->pc_vcpu_id;
 	int error;
-	struct evtchn_bind_ipi bind_ipi = { .vcpu = acpi_id };
+	struct evtchn_bind_ipi bind_ipi = { .vcpu = vcpu_id };
 
 	error = HYPERVISOR_event_channel_op(EVTCHNOP_bind_ipi,
 	                                    &bind_ipi);
@@ -640,10 +640,10 @@ static void
 xen_rebind_virq(struct xenisrc *isrc)
 {
 	int cpu = isrc->xi_cpu;
-	int acpi_id = pcpu_find(cpu)->pc_acpi_id;
+	int vcpu_id = pcpu_find(cpu)->pc_vcpu_id;
 	int error;
 	struct evtchn_bind_virq bind_virq = { .virq = isrc->xi_virq,
-	                                      .vcpu = acpi_id };
+	                                      .vcpu = vcpu_id };
 
 	error = HYPERVISOR_event_channel_op(EVTCHNOP_bind_virq,
 	                                    &bind_virq);
@@ -796,7 +796,7 @@ xen_intr_assign_cpu(struct intsrc *base_
 #ifdef SMP
 	struct evtchn_bind_vcpu bind_vcpu;
 	struct xenisrc *isrc;
-	u_int to_cpu, acpi_id;
+	u_int to_cpu, vcpu_id;
 	int error;
 
 #ifdef XENHVM
@@ -805,7 +805,7 @@ xen_intr_assign_cpu(struct intsrc *base_
 #endif
 
 	to_cpu = apic_cpuid(apic_id);
-	acpi_id = pcpu_find(to_cpu)->pc_acpi_id;
+	vcpu_id = pcpu_find(to_cpu)->pc_vcpu_id;
 	xen_intr_intrcnt_add(to_cpu);
 
 	mtx_lock(&xen_intr_isrc_lock);
@@ -830,7 +830,7 @@ xen_intr_assign_cpu(struct intsrc *base_
 	}
 
 	bind_vcpu.port = isrc->xi_port;
-	bind_vcpu.vcpu = acpi_id;
+	bind_vcpu.vcpu = vcpu_id;
 
 	/*
 	 * Allow interrupts to be fielded on the new VCPU before
@@ -1063,9 +1063,9 @@ xen_intr_bind_virq(device_t dev, u_int v
     driver_filter_t filter, driver_intr_t handler, void *arg,
     enum intr_type flags, xen_intr_handle_t *port_handlep)
 {
-	int acpi_id = pcpu_find(cpu)->pc_acpi_id;
+	int vcpu_id = pcpu_find(cpu)->pc_vcpu_id;
 	struct xenisrc *isrc;
-	struct evtchn_bind_virq bind_virq = { .virq = virq, .vcpu = acpi_id };
+	struct evtchn_bind_virq bind_virq = { .virq = virq, .vcpu = vcpu_id };
 	int error;
 
 	/* Ensure the target CPU is ready to handle evtchn interrupts. */
@@ -1126,9 +1126,9 @@ xen_intr_alloc_and_bind_ipi(device_t dev
     xen_intr_handle_t *port_handlep)
 {
 #ifdef SMP
-	int acpi_id = pcpu_find(cpu)->pc_acpi_id;
+	int vcpu_id = pcpu_find(cpu)->pc_vcpu_id;
 	struct xenisrc *isrc;
-	struct evtchn_bind_ipi bind_ipi = { .vcpu = acpi_id };
+	struct evtchn_bind_ipi bind_ipi = { .vcpu = vcpu_id };
 	int error;
 
 	/* Ensure the target CPU is ready to handle evtchn interrupts. */



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201310052311.r95NB2TL009041>