Hi all, this patch series, based on 3.9-rc3, moves xenvm to mach-virt and implements SMP support in Xen on ARM. Stefano Stabellini (4): xen/arm: implement HYPERVISOR_vcpu_op xen/arm: SMP support xen: move the xenvm machine to mach-virt xenvm: add a simple PSCI node and a second cpu arch/arm/boot/dts/xenvm-4.2.dts | 12 +++++++++ arch/arm/include/asm/xen/hypercall.h | 1 + arch/arm/mach-vexpress/v2m.c | 1 - arch/arm/mach-virt/virt.c | 1 + arch/arm/xen/enlighten.c | 43 ++++++++++++++++++++++++++++++++- arch/arm/xen/hypercall.S | 1 + 6 files changed, 56 insertions(+), 3 deletions(-) git://xenbits.xen.org/people/sstabellini/linux-pvhvm.git 3.9-rc3-smp Cheers, Stefano
Stefano Stabellini
2013-Mar-21 19:16 UTC
[PATCH 1/4] xen/arm: implement HYPERVISOR_vcpu_op
Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> --- arch/arm/include/asm/xen/hypercall.h | 1 + arch/arm/xen/enlighten.c | 1 + arch/arm/xen/hypercall.S | 1 + 3 files changed, 3 insertions(+), 0 deletions(-) diff --git a/arch/arm/include/asm/xen/hypercall.h b/arch/arm/include/asm/xen/hypercall.h index 8a82325..799f42e 100644 --- a/arch/arm/include/asm/xen/hypercall.h +++ b/arch/arm/include/asm/xen/hypercall.h @@ -46,6 +46,7 @@ int HYPERVISOR_event_channel_op(int cmd, void *arg); unsigned long HYPERVISOR_hvm_op(int op, void *arg); int HYPERVISOR_memory_op(unsigned int cmd, void *arg); int HYPERVISOR_physdev_op(int cmd, void *arg); +int HYPERVISOR_vcpu_op(int cmd, int vcpuid, void *extra_args); static inline void MULTI_update_va_mapping(struct multicall_entry *mcl, unsigned long va, diff --git a/arch/arm/xen/enlighten.c b/arch/arm/xen/enlighten.c index 8dc0605..18b0049 100644 --- a/arch/arm/xen/enlighten.c +++ b/arch/arm/xen/enlighten.c @@ -259,4 +259,5 @@ EXPORT_SYMBOL_GPL(HYPERVISOR_sched_op); EXPORT_SYMBOL_GPL(HYPERVISOR_hvm_op); EXPORT_SYMBOL_GPL(HYPERVISOR_memory_op); EXPORT_SYMBOL_GPL(HYPERVISOR_physdev_op); +EXPORT_SYMBOL_GPL(HYPERVISOR_vcpu_op); EXPORT_SYMBOL_GPL(privcmd_call); diff --git a/arch/arm/xen/hypercall.S b/arch/arm/xen/hypercall.S index 71f7239..199cb2d 100644 --- a/arch/arm/xen/hypercall.S +++ b/arch/arm/xen/hypercall.S @@ -87,6 +87,7 @@ HYPERCALL2(event_channel_op); HYPERCALL2(hvm_op); HYPERCALL2(memory_op); HYPERCALL2(physdev_op); +HYPERCALL3(vcpu_op); ENTRY(privcmd_call) stmdb sp!, {r4} -- 1.7.2.5
Map vcpu_info using VCPUOP_register_vcpu_info on secondary cpus. Call enable_percpu_irq on every cpu. Actually pass a percpu variable to request_percpu_irq. Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> --- arch/arm/xen/enlighten.c | 42 ++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 40 insertions(+), 2 deletions(-) diff --git a/arch/arm/xen/enlighten.c b/arch/arm/xen/enlighten.c index 18b0049..ffbedce 100644 --- a/arch/arm/xen/enlighten.c +++ b/arch/arm/xen/enlighten.c @@ -2,6 +2,7 @@ #include <xen/events.h> #include <xen/grant_table.h> #include <xen/hvm.h> +#include <xen/interface/vcpu.h> #include <xen/interface/xen.h> #include <xen/interface/memory.h> #include <xen/interface/hvm/params.h> @@ -32,6 +33,7 @@ struct shared_info xen_dummy_shared_info; struct shared_info *HYPERVISOR_shared_info = (void *)&xen_dummy_shared_info; DEFINE_PER_CPU(struct vcpu_info *, xen_vcpu); +DEFINE_PER_CPU(struct vcpu_info, xen_vcpu_info); /* These are unused until we support booting "pre-ballooned" */ unsigned long xen_released_pages; @@ -148,6 +150,32 @@ int xen_unmap_domain_mfn_range(struct vm_area_struct *vma, } EXPORT_SYMBOL_GPL(xen_unmap_domain_mfn_range); +static int __init xen_secondary_init(unsigned int cpu) +{ + struct vcpu_register_vcpu_info info; + struct vcpu_info *vcpup; + int err; + + if (cpu == 0) + return 0; + + pr_info("Xen: initializing cpu%d\n", cpu); + vcpup = &per_cpu(xen_vcpu_info, cpu); + + info.mfn = __pa(vcpup) >> PAGE_SHIFT; + info.offset = offset_in_page(vcpup); + + err = HYPERVISOR_vcpu_op(VCPUOP_register_vcpu_info, cpu, &info); + if (err) { + pr_debug("register_vcpu_info failed: err=%d\n", err); + } else { + /* This cpu is using the registered vcpu info, even if + later ones fail to. */ + per_cpu(xen_vcpu, cpu) = vcpup; + } + return 0; +} + /* * see Documentation/devicetree/bindings/arm/xen.txt for the * documentation of the Xen Device Tree format. @@ -163,6 +191,7 @@ static int __init xen_guest_init(void) const char *version = NULL; const char *xen_prefix = "xen,xen-"; struct resource res; + int i; node = of_find_compatible_node(NULL, NULL, "xen,xen"); if (!node) { @@ -216,6 +245,8 @@ static int __init xen_guest_init(void) * is required to use VCPUOP_register_vcpu_info to place vcpu info * for secondary CPUs as they are brought up. */ per_cpu(xen_vcpu, 0) = &HYPERVISOR_shared_info->vcpu_info[0]; + for_each_online_cpu(i) + xen_secondary_init(i); gnttab_init(); if (!xen_initial_domain()) @@ -231,20 +262,27 @@ static irqreturn_t xen_arm_callback(int irq, void *arg) return IRQ_HANDLED; } +static __init void xen_percpu_enable_events(void *unused) +{ + enable_percpu_irq(xen_events_irq, 0); +} + static int __init xen_init_events(void) { + int i; + if (!xen_domain() || xen_events_irq < 0) return -ENODEV; xen_init_IRQ(); if (request_percpu_irq(xen_events_irq, xen_arm_callback, - "events", xen_vcpu)) { + "events", &xen_vcpu)) { pr_err("Error requesting IRQ %d\n", xen_events_irq); return -EINVAL; } - enable_percpu_irq(xen_events_irq, 0); + on_each_cpu(xen_percpu_enable_events, NULL, 0); return 0; } -- 1.7.2.5
Stefano Stabellini
2013-Mar-21 19:16 UTC
[PATCH 3/4] xen: move the xenvm machine to mach-virt
xenvm is based on mach-vexpress, move it to mach-virt. Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> CC: marc.zyngier@arm.com CC: will.deacon@arm.com CC: arnd@arndb.de CC: rob.herring@calxeda.com --- arch/arm/mach-vexpress/v2m.c | 1 - arch/arm/mach-virt/virt.c | 1 + 2 files changed, 1 insertions(+), 1 deletions(-) diff --git a/arch/arm/mach-vexpress/v2m.c b/arch/arm/mach-vexpress/v2m.c index 915683c..c43ec78 100644 --- a/arch/arm/mach-vexpress/v2m.c +++ b/arch/arm/mach-vexpress/v2m.c @@ -469,7 +469,6 @@ static void __init v2m_dt_init(void) static const char * const v2m_dt_match[] __initconst = { "arm,vexpress", - "xen,xenvm", NULL, }; diff --git a/arch/arm/mach-virt/virt.c b/arch/arm/mach-virt/virt.c index 31666f6..528c05e 100644 --- a/arch/arm/mach-virt/virt.c +++ b/arch/arm/mach-virt/virt.c @@ -40,6 +40,7 @@ static void __init virt_timer_init(void) static const char *virt_dt_match[] = { "linux,dummy-virt", + "xen,xenvm", NULL }; -- 1.7.2.5
Stefano Stabellini
2013-Mar-21 19:16 UTC
[PATCH 4/4] xenvm: add a simple PSCI node and a second cpu
Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> CC: rob.herring@calxeda.com CC: will.deacon@arm.com CC: marc.zyngier@arm.com CC: arnd@arndb.de --- arch/arm/boot/dts/xenvm-4.2.dts | 12 ++++++++++++ 1 files changed, 12 insertions(+), 0 deletions(-) diff --git a/arch/arm/boot/dts/xenvm-4.2.dts b/arch/arm/boot/dts/xenvm-4.2.dts index 7a2cf30..66efd22 100644 --- a/arch/arm/boot/dts/xenvm-4.2.dts +++ b/arch/arm/boot/dts/xenvm-4.2.dts @@ -29,6 +29,18 @@ compatible = "arm,cortex-a15"; reg = <0>; }; + + cpu@1 { + device_type = "cpu"; + compatible = "arm,cortex-a15"; + reg = <1>; + }; + }; + + psci { + compatible = "arm,psci"; + method = "hvc"; + cpu_on = <2>; }; memory@80000000 { -- 1.7.2.5
Marc Zyngier
2013-Mar-22 12:23 UTC
Re: [PATCH 3/4] xen: move the xenvm machine to mach-virt
On 21/03/13 19:16, Stefano Stabellini wrote:> xenvm is based on mach-vexpress, move it to mach-virt. > > Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> > CC: marc.zyngier@arm.com > CC: will.deacon@arm.com > CC: arnd@arndb.de > CC: rob.herring@calxeda.comAwesome! Acked-by: Marc Zyngier <marc.zyngier@arm.com>> --- > arch/arm/mach-vexpress/v2m.c | 1 - > arch/arm/mach-virt/virt.c | 1 + > 2 files changed, 1 insertions(+), 1 deletions(-) > > diff --git a/arch/arm/mach-vexpress/v2m.c b/arch/arm/mach-vexpress/v2m.c > index 915683c..c43ec78 100644 > --- a/arch/arm/mach-vexpress/v2m.c > +++ b/arch/arm/mach-vexpress/v2m.c > @@ -469,7 +469,6 @@ static void __init v2m_dt_init(void) > > static const char * const v2m_dt_match[] __initconst = { > "arm,vexpress", > - "xen,xenvm", > NULL, > }; > > diff --git a/arch/arm/mach-virt/virt.c b/arch/arm/mach-virt/virt.c > index 31666f6..528c05e 100644 > --- a/arch/arm/mach-virt/virt.c > +++ b/arch/arm/mach-virt/virt.c > @@ -40,6 +40,7 @@ static void __init virt_timer_init(void) > > static const char *virt_dt_match[] = { > "linux,dummy-virt", > + "xen,xenvm", > NULL > }; > >-- Jazz is not dead. It just smells funny...