[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH] Add cpu hotplug support for 2.6.32 branch



 On 08/17/2010 08:04 PM, Jiang, Yunhong wrote:
> Hi, Jeremy, followed patch port pcpu hotplug support to 2.6.32 pvops dom0. I 
> don't know if xen/next-2.6.32 branch is the right base. If it is not, can you 
> please advice me which branch should I base on?

No, that's not really a good base.  Ideally you should base on plain
v2.6.32, but if that doesn't work, base it on whatever topic branch has
your pre-requisite changes.  If that's too complex (too many changes
from multiple branches), then base on xen/next.

The existing xen/dom0/pcpu-hotplug branch should a useful guide.

Alternatively, if you can provide me with a merge of
xen/dom0/pcpu-hotplug into xen/next (ie, with conflict resolution done),
then I could just use that. (Though it looks like certain parts may have
already been merged - I didn't look closely.)

Thanks,
    J

> Thanks
> --jyh
>
> Add cpu hotplug support for 2.6.32 branch
>
> Add physical CPU hotplug support to origin/xen/next-2.6.32 branch.
> Please notice that, even with this change, the acpi_processor->id is 
> still always -1. This is because several workaround in PM side depends
> on acpi_processor->id == -1. As the CPU hotplug logic does not depends
> on acpi_processor->id, I'd still keep it no changes.
>
> But we need change the acpi_processor->id in the future.
>
> Signed-off-by: Jiang, Yunhong <yunhong.jiang@xxxxxxxxx>
>
>
> diff --git a/drivers/acpi/processor_xen.c b/drivers/acpi/processor_xen.c
> index 2f37c9c..305398d 100644
> --- a/drivers/acpi/processor_xen.c
> +++ b/drivers/acpi/processor_xen.c
> @@ -39,6 +39,7 @@
>  #include <acpi/acpi_drivers.h>
>  #include <acpi/processor.h>
>  #include <xen/acpi.h>
> +#include <xen/pcpu.h>
>  
>  #define PREFIX "ACPI: "
>  
> @@ -82,6 +83,42 @@ struct acpi_driver xen_acpi_processor_driver = {
>               },
>  };
>  
> +static int is_processor_present(acpi_handle handle)
> +{
> +     acpi_status status;
> +     unsigned long long sta = 0;
> +
> +
> +     status = acpi_evaluate_integer(handle, "_STA", NULL, &sta);
> +
> +     if (ACPI_SUCCESS(status) && (sta & ACPI_STA_DEVICE_PRESENT))
> +             return 1;
> +
> +     /*
> +      * _STA is mandatory for a processor that supports hot plug
> +      */
> +     if (status == AE_NOT_FOUND)
> +             ACPI_DEBUG_PRINT((ACPI_DB_INFO,
> +                             "Processor does not support hot plug\n"));
> +     else
> +             ACPI_EXCEPTION((AE_INFO, status,
> +                             "Processor Device is not present"));
> +     return 0;
> +}
> +
> +static acpi_status
> +xen_acpi_processor_hotadd_init(struct acpi_processor *pr, int *p_cpu)
> +{
> +     if (!is_processor_present(pr->handle))
> +             return AE_ERROR;
> +
> +     if (processor_cntl_xen_notify(pr,
> +                             PROCESSOR_HOTPLUG, HOTPLUG_TYPE_ADD))
> +             return AE_ERROR;
> +
> +     return AE_OK;
> +}
> +
>  static int xen_acpi_processor_get_info(struct acpi_device *device)
>  {
>       acpi_status status = 0;
> @@ -164,14 +201,12 @@ static int xen_acpi_processor_get_info(struct 
> acpi_device *device)
>        *  They should be ignored _iff they are physically not present.
>        *
>        */
> -#if 0
> -     if (pr->id == -1) {
> +     if (xen_pcpu_index(pr->acpi_id, 1) == -1) {
>               if (ACPI_FAILURE
> -                 (acpi_processor_hotadd_init(pr->handle, &pr->id))) {
> +                 (xen_acpi_processor_hotadd_init(pr, &pr->id))) {
>                       return -ENODEV;
>               }
>       }
> -#endif
>  
>       /*
>        * On some boxes several processors use the same processor bus id.
> diff --git a/drivers/xen/pcpu.c b/drivers/xen/pcpu.c
> index 6450c17..6d1a770 100644
> --- a/drivers/xen/pcpu.c
> +++ b/drivers/xen/pcpu.c
> @@ -313,6 +313,38 @@ static struct pcpu *_sync_pcpu(int cpu_num, int *max_id, 
> int *result)
>       return pcpu;
>  }
>  
> +int xen_pcpu_index(uint32_t id, int is_acpiid)
> +{
> +     int cpu_num = 0, max_id = 0, ret;
> +     xen_platform_op_t op = {
> +             .cmd            = XENPF_get_cpuinfo,
> +             .interface_version  = XENPF_INTERFACE_VERSION,
> +     };
> +     struct xenpf_pcpuinfo *info = &op.u.pcpu_info;
> +
> +     info->xen_cpuid = 0;
> +     ret = HYPERVISOR_dom0_op(&op);
> +     if (ret)
> +             return -1;
> +     max_id = op.u.pcpu_info.max_present;
> +
> +     while ((cpu_num <= max_id)) {
> +             info->xen_cpuid = cpu_num;
> +             ret = HYPERVISOR_dom0_op(&op);
> +             if (ret)
> +                     continue;
> +
> +             if (op.u.pcpu_info.max_present > max_id)
> +                     max_id = op.u.pcpu_info.max_present;
> +             if (id == (is_acpiid ? info->acpi_id : info->apic_id))
> +                     return cpu_num;
> +             cpu_num++;
> +     }
> +
> +    return -1;
> +}
> +EXPORT_SYMBOL(xen_pcpu_index);
> +
>  /*
>   * Sync dom0's pcpu information with xen hypervisor's
>   */
> @@ -417,4 +449,4 @@ static int __init xen_pcpu_init(void)
>       return err;
>  }
>  
> -subsys_initcall(xen_pcpu_init);
> +arch_initcall(xen_pcpu_init);
> diff --git a/include/xen/pcpu.h b/include/xen/pcpu.h
> index fb2bf6b..7e8f9d1 100644
> --- a/include/xen/pcpu.h
> +++ b/include/xen/pcpu.h
> @@ -27,4 +27,6 @@ static inline int xen_pcpu_online(uint32_t flags)
>  extern int register_xen_pcpu_notifier(struct notifier_block *nb);
>  
>  extern void unregister_xen_pcpu_notifier(struct notifier_block *nb);
> +
> +extern int xen_pcpu_index(uint32_t acpi_id, int is_acpiid);
>  #endif
>
>
>
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxxxxxxxx
> http://lists.xensource.com/xen-devel


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.