Hi all, this small patch series fixes few Xen on ARM problems I found with more testing: - in order to work in dom0, we need to delay the initilization of the pm functions after arch_init; - VCPUOP_register_vcpu_info needs to be executed by each online cpu separately; - VCPUOP_register_vcpu_info is not actually supposed to fail. Stefano Stabellini (3): xen/arm: initialize pm functions later xen/arm: do not handle VCPUOP_register_vcpu_info failures xen: rename xen_secondary_init and run it on every online cpu arch/arm/xen/enlighten.c | 34 +++++++++++++++------------------- 1 files changed, 15 insertions(+), 19 deletions(-)
Stefano Stabellini
2013-May-08 12:11 UTC
[PATCH 1/3] xen/arm: initialize pm functions later
If we are running in dom0, we have to wait for the arch specific code to complete the initialization in order for us to successfully reset the power_off and pm_restart functions. Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> --- arch/arm/xen/enlighten.c | 8 +++++++- 1 files changed, 7 insertions(+), 1 deletions(-) diff --git a/arch/arm/xen/enlighten.c b/arch/arm/xen/enlighten.c index d30042e..83d13b0 100644 --- a/arch/arm/xen/enlighten.c +++ b/arch/arm/xen/enlighten.c @@ -272,12 +272,18 @@ static int __init xen_guest_init(void) if (!xen_initial_domain()) xenbus_probe(NULL); + return 0; +} +core_initcall(xen_guest_init); + +static int __init xen_pm_init(void) +{ pm_power_off = xen_power_off; arm_pm_restart = xen_restart; return 0; } -core_initcall(xen_guest_init); +subsys_initcall(xen_pm_init); static irqreturn_t xen_arm_callback(int irq, void *arg) { -- 1.7.2.5
Stefano Stabellini
2013-May-08 12:11 UTC
[PATCH 2/3] xen/arm: do not handle VCPUOP_register_vcpu_info failures
We expect VCPUOP_register_vcpu_info to succeed, do not try to handle failures. Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> --- arch/arm/xen/enlighten.c | 11 ++++------- 1 files changed, 4 insertions(+), 7 deletions(-) diff --git a/arch/arm/xen/enlighten.c b/arch/arm/xen/enlighten.c index 83d13b0..519acf9 100644 --- a/arch/arm/xen/enlighten.c +++ b/arch/arm/xen/enlighten.c @@ -165,13 +165,10 @@ static int __init xen_secondary_init(unsigned int cpu) 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; - } + if (err) + BUG(); + per_cpu(xen_vcpu, cpu) = vcpup; + return 0; } -- 1.7.2.5
Stefano Stabellini
2013-May-08 12:11 UTC
[PATCH 3/3] xen: rename xen_secondary_init and run it on every online cpu
Rename xen_secondary_init to xen_percpu_init. Run xen_percpu_init on the each online cpu, reuse the current on_each_cpu call. Merge xen_percpu_enable_events into xen_percpu_init. Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> --- arch/arm/xen/enlighten.c | 15 ++++----------- 1 files changed, 4 insertions(+), 11 deletions(-) diff --git a/arch/arm/xen/enlighten.c b/arch/arm/xen/enlighten.c index 519acf9..ee86bfa 100644 --- a/arch/arm/xen/enlighten.c +++ b/arch/arm/xen/enlighten.c @@ -152,11 +152,12 @@ 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) +static void __init xen_percpu_init(void *unused) { struct vcpu_register_vcpu_info info; struct vcpu_info *vcpup; int err; + int cpu = get_cpu(); pr_info("Xen: initializing cpu%d\n", cpu); vcpup = per_cpu_ptr(xen_vcpu_info, cpu); @@ -169,7 +170,7 @@ static int __init xen_secondary_init(unsigned int cpu) BUG(); per_cpu(xen_vcpu, cpu) = vcpup; - return 0; + enable_percpu_irq(xen_events_irq, 0); } static void xen_restart(char str, const char *cmd) @@ -205,7 +206,6 @@ 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) { @@ -262,8 +262,6 @@ static int __init xen_guest_init(void) sizeof(struct vcpu_info)); if (xen_vcpu_info == NULL) return -ENOMEM; - for_each_online_cpu(i) - xen_secondary_init(i); gnttab_init(); if (!xen_initial_domain()) @@ -288,11 +286,6 @@ 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) { if (!xen_domain() || xen_events_irq < 0) @@ -306,7 +299,7 @@ static int __init xen_init_events(void) return -EINVAL; } - on_each_cpu(xen_percpu_enable_events, NULL, 0); + on_each_cpu(xen_percpu_init, NULL, 0); return 0; } -- 1.7.2.5
Ian Campbell
2013-May-08 12:17 UTC
Re: [PATCH 2/3] xen/arm: do not handle VCPUOP_register_vcpu_info failures
On Wed, 2013-05-08 at 13:11 +0100, Stefano Stabellini wrote:> We expect VCPUOP_register_vcpu_info to succeed, do not try to handle > failures. > > Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> > --- > arch/arm/xen/enlighten.c | 11 ++++------- > 1 files changed, 4 insertions(+), 7 deletions(-) > > diff --git a/arch/arm/xen/enlighten.c b/arch/arm/xen/enlighten.c > index 83d13b0..519acf9 100644 > --- a/arch/arm/xen/enlighten.c > +++ b/arch/arm/xen/enlighten.c > @@ -165,13 +165,10 @@ static int __init xen_secondary_init(unsigned int cpu) > 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; > - } > + if (err) > + BUG();AKA BUG_ON(err); Acked-by: Ian Campbell <ian.campbell@citrix.com>> + per_cpu(xen_vcpu, cpu) = vcpup; > + > return 0; > } >