[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
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |