From owner-svn-src-head@FreeBSD.ORG Sat Oct 5 23:11:03 2013 Return-Path: Delivered-To: svn-src-head@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id DAB59C92; Sat, 5 Oct 2013 23:11:03 +0000 (UTC) (envelope-from gibbs@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id C773A2A99; Sat, 5 Oct 2013 23:11:03 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id r95NB3Nc009054; Sat, 5 Oct 2013 23:11:03 GMT (envelope-from gibbs@svn.freebsd.org) Received: (from gibbs@localhost) by svn.freebsd.org (8.14.7/8.14.5/Submit) id r95NB2TL009041; Sat, 5 Oct 2013 23:11:02 GMT (envelope-from gibbs@svn.freebsd.org) Message-Id: <201310052311.r95NB2TL009041@svn.freebsd.org> From: "Justin T. Gibbs" Date: Sat, 5 Oct 2013 23:11:02 +0000 (UTC) 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 X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 05 Oct 2013 23:11:03 -0000 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. */