On Mon, Mar 25, 2013 at 08:49:47AM +0000, Liu, Jinsong wrote:
> Konrad Rzeszutek Wilk wrote:
> > With the Xen ACPI stub code (CONFIG_XEN_STUB=y) enabled, the power
> > C and P states are no longer uploaded to the hypervisor.
> > 
> > The reason is that the Xen CPU hotplug code: xen-acpi-cpuhotplug.c
> > and the xen-acpi-stub.c register themselves as the "processor" type
> > object. 
> > 
> > That means the generic processor (processor_driver.c) stops
> > working and it does not call (acpi_processor_add) which populates the
> > 
> >          per_cpu(processors, pr->id) = pr;
> > 
> > structure. The 'pr' is gathered from the acpi_processor_get_info
> > function which does the job of finding the C-states and figuring out
> > PBLK address. 
> > 
> > The 'processors->pr' is then later used by xen-acpi-processor.c (the
> > one that uploads C and P states to the hypervisor). Since it is NULL,
> > we end 
> > skip the gathering of _PSD, _PSS, _PCT, etc and never upload the power
> > management data.
> > 
> > The end result is that enabling the CONFIG_XEN_STUB in the build
> > means that xen-acpi-processor is not working anymore.
> > 
> > This temporary patch fixes it by marking the XEN_STUB driver as
> > BROKEN until this can be properly fixed.
> > 
> > CC: jinsong....@intel.com
> > Signed-off-by: Konrad Rzeszutek Wilk <konrad.w...@oracle.com>
> > ---
> >  drivers/xen/Kconfig | 2 +-
> >  1 file changed, 1 insertion(+), 1 deletion(-)
> > 
> > diff --git a/drivers/xen/Kconfig b/drivers/xen/Kconfig
> > index 5a32232..67af155 100644
> > --- a/drivers/xen/Kconfig
> > +++ b/drivers/xen/Kconfig
> > @@ -182,7 +182,7 @@ config XEN_PRIVCMD
> > 
> >  config XEN_STUB
> >     bool "Xen stub drivers"
> > -   depends on XEN && X86_64
> > +   depends on XEN && X86_64 && BROKEN
> >     default n
> >     help
> >       Allow kernel to install stub drivers, to reserve space for Xen
> > drivers, 
> 
> 
> Yes, exactly.
> 
> With xen-cpu-hotplug logic added, it's not proper to make xen Px/Cx rely on 
> native processor_driver anymore.

Ahhh.
> Reasonable solution is, hooking Px/Cx logic into xen hotplug path (say, 
> ops.add --> acpi_processor_add), like what native side does currently.

Right. That would require making acpi_processor_add an EXPORT symbol.

> 
> So at Xen dom0 side, there are 2 issues need to be solved:
> 1. currently xen dom0 defaultly set cpu_possible_map equal to 
> cpu_present_map, we need adjust it so that when cpu hotplug it can handle 
> 'pr' properly;

Kind of. The xen-acpi-processor dealt with that by copying the 'pr' for the 
present, but not-offline vCPUS
and figuring out which of them dom0 did not know about. Look in the 
'get_max_acpi_id' and 'pr_backup'
in the code.

So it has the logic to handle dom0_max_vcpus=X, where X is less than physically 
present CPUs.


> 2. hook Px/Cx parsing logic into cpu hotadd or cpu online logic, like what 
> native side did;
> 
> Attached is a patch to solve issue 1, basically it generates possible map 
> according to MADT entries, not trims according to hypervisor online cpus. 
> With it, dom0 cpu possible map reserves space for Xen cpu hotplug and 
> corresponding Px/Cx, and dom0 also get a unified possible map view just like 
> it runs under native platform.

Ah, didn't think of doing it that way! Thought look at 
cf405ae612b0f7e2358db7ff594c0e94846137aa
as the scheduler will now try to use those.
> 
> As for issue 2, it may be fixed later :-)
> (BTW, your patch to temporarily disable xen-stub is necessary even with my 
> patch, only would be reverted after issue 2 got solved)

Right.
> 
> Thanks,
> Jinsong
> 
> ========================
> >From bb49caa523de46551c37de91754c49919bee4687 Mon Sep 17 00:00:00 2001
> From: Liu Jinsong <jinsong....@intel.com>
> Date: Mon, 25 Mar 2013 21:31:36 +0800
> Subject: [PATCH] Xen/X86: adjust dom0 cpu possible map for sake of Xen Px/Cx
> 
> Currently dom0 cpu possible map defaultly equal to cpu
> present map. It works fine if not consider Xen cpu hotplug
> and corresponding Px/Cx. However, when cpu hotplug the
> possible map should reserve some space, considering it's
> static and per-cpu data-structures are allocated at init
> time, and do not expect to do this dynamically.
> 
> This patch adjusts Xen dom0 cpu possible map.
> Basically it generates possible map according to MADT entries,
> not trims according to hypervisor online cpus. With it, dom0
> cpu possible map reserves space for Xen cpu hotplug and
> corresponding Px/Cx, and dom0 also get a unified possible map
> view just like it runs under native platform.
> 
> Signed-off-by: Liu Jinsong <jinsong....@intel.com>
> ---
>  arch/x86/xen/enlighten.c |   13 +++++++++++--
>  arch/x86/xen/smp.c       |   30 +++++++-----------------------
>  2 files changed, 18 insertions(+), 25 deletions(-)
> 
> diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c
> index c8e1c7b..f630956 100644
> --- a/arch/x86/xen/enlighten.c
> +++ b/arch/x86/xen/enlighten.c
> @@ -1089,8 +1089,17 @@ void xen_setup_vcpu_info_placement(void)
>  {
>       int cpu;
>  
> -     for_each_possible_cpu(cpu)
> -             xen_vcpu_setup(cpu);
> +     /*
> +      * Dom0 reserved more possible bits than present ones for the sake of
> +      * Xen processor driver and hotplug logic. To avoid clamp_max_cpus,
> +      * setup dom0 vcpus for present ones.
> +      */
> +     if (xen_initial_domain())
> +             for_each_present_cpu(cpu)
> +                     xen_vcpu_setup(cpu);
> +     else
> +             for_each_possible_cpu(cpu)
> +                     xen_vcpu_setup(cpu);
>  
>       /* xen_vcpu_setup managed to place the vcpu_info within the
>          percpu area for all cpus, so make use of it */
> diff --git a/arch/x86/xen/smp.c b/arch/x86/xen/smp.c
> index 09ea61d..9b334b9 100644
> --- a/arch/x86/xen/smp.c
> +++ b/arch/x86/xen/smp.c
> @@ -192,37 +192,23 @@ static void __init xen_fill_possible_map(void)
>  static void __init xen_filter_cpu_maps(void)
>  {
>       int i, rc;
> -     unsigned int subtract = 0;
>  
>       if (!xen_initial_domain())
>               return;
>  
>       num_processors = 0;
>       disabled_cpus = 0;
> +
> +     /* all bits have been set possible at prefill_possible_map */
>       for (i = 0; i < nr_cpu_ids; i++) {
>               rc = HYPERVISOR_vcpu_op(VCPUOP_is_up, i, NULL);
> -             if (rc >= 0) {
> +             if (rc >= 0)
>                       num_processors++;
> -                     set_cpu_possible(i, true);
> -             } else {
> -                     set_cpu_possible(i, false);
> +             else {
> +                     disabled_cpus++;
>                       set_cpu_present(i, false);
> -                     subtract++;
>               }
>       }
> -#ifdef CONFIG_HOTPLUG_CPU
> -     /* This is akin to using 'nr_cpus' on the Linux command line.
> -      * Which is OK as when we use 'dom0_max_vcpus=X' we can only
> -      * have up to X, while nr_cpu_ids is greater than X. This
> -      * normally is not a problem, except when CPU hotplugging
> -      * is involved and then there might be more than X CPUs
> -      * in the guest - which will not work as there is no
> -      * hypercall to expand the max number of VCPUs an already
> -      * running guest has. So cap it up to X. */
> -     if (subtract)
> -             nr_cpu_ids = nr_cpu_ids - subtract;
> -#endif
> -

This was a fix for
commit cf405ae612b0f7e2358db7ff594c0e94846137aa
Author: Konrad Rzeszutek Wilk <konrad.w...@oracle.com>
Date:   Thu Apr 26 13:50:03 2012 -0400

    xen/smp: Fix crash when booting with ACPI hotplug CPUs.

which I think your patch would expose again?

>  }
>  
>  static void __init xen_smp_prepare_boot_cpu(void)
> @@ -272,15 +258,13 @@ static void __init xen_smp_prepare_cpus(unsigned int 
> max_cpus)
>  
>       cpumask_copy(xen_cpu_initialized_map, cpumask_of(0));
>  
> -     /* Restrict the possible_map according to max_cpus. */
> +     /* Restrict the possible/present_map according to max_cpus. */
>       while ((num_possible_cpus() > 1) && (num_possible_cpus() > max_cpus)) {
>               for (cpu = nr_cpu_ids - 1; !cpu_possible(cpu); cpu--)
>                       continue;
>               set_cpu_possible(cpu, false);
> +             set_cpu_present(cpu, false);
>       }
> -
> -     for_each_possible_cpu(cpu)
> -             set_cpu_present(cpu, true);
>  }
>  
>  static int __cpuinit
> -- 
> 1.7.1


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to