From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Jiang, Yunhong" Subject: RE: [PATCH] Add cpu hotplug support for 2.6.32 branch Date: Fri, 20 Aug 2010 11:45:11 +0800 Message-ID: <789F9655DD1B8F43B48D77C5D306597329D95961@shsmsx501.ccr.corp.intel.com> References: <789F9655DD1B8F43B48D77C5D306597328C6827D@shsmsx501.ccr.corp.intel.com> <4C6C3752.8030700@goop.org> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Return-path: In-Reply-To: <4C6C3752.8030700@goop.org> Content-Language: en-US List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: Jeremy Fitzhardinge Cc: Xen-devel List-Id: xen-devel@lists.xenproject.org Jeremy, I think all this patch is purely for acpi changes, so not sure if i= t is ok to apply it on origin/xen/dom0/acpi-next? I have a talk with Ke, the xen/dom0/acpi-next has already covere all work f= or PM and CPU/Mem hotplug in a cleaner way and is based on 2.6.32 kernel, s= o maybe we can use that for the base tree. Thanks --jyh >-----Original Message----- >From: Jeremy Fitzhardinge [mailto:jeremy@goop.org] >Sent: Thursday, August 19, 2010 3:41 AM >To: Jiang, Yunhong >Cc: Xen-devel >Subject: 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 dom= 0. I don't >know if xen/next-2.6.32 branch is the right base. If it is not, can you pl= ease 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 =3D=3D -1. As the CPU hotplug logic does not depen= ds >> 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 >> >> >> 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 >> #include >> #include >> +#include >> >> #define PREFIX "ACPI: " >> >> @@ -82,6 +83,42 @@ struct acpi_driver xen_acpi_processor_driver =3D { >> }, >> }; >> >> +static int is_processor_present(acpi_handle handle) >> +{ >> + acpi_status status; >> + unsigned long long sta =3D 0; >> + >> + >> + status =3D 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 =3D=3D 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 =3D 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 =3D=3D -1) { >> + if (xen_pcpu_index(pr->acpi_id, 1) =3D=3D -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 *ma= x_id, >int *result) >> return pcpu; >> } >> >> +int xen_pcpu_index(uint32_t id, int is_acpiid) >> +{ >> + int cpu_num =3D 0, max_id =3D 0, ret; >> + xen_platform_op_t op =3D { >> + .cmd =3D XENPF_get_cpuinfo, >> + .interface_version =3D XENPF_INTERFACE_VERSION, >> + }; >> + struct xenpf_pcpuinfo *info =3D &op.u.pcpu_info; >> + >> + info->xen_cpuid =3D 0; >> + ret =3D HYPERVISOR_dom0_op(&op); >> + if (ret) >> + return -1; >> + max_id =3D op.u.pcpu_info.max_present; >> + >> + while ((cpu_num <=3D max_id)) { >> + info->xen_cpuid =3D cpu_num; >> + ret =3D HYPERVISOR_dom0_op(&op); >> + if (ret) >> + continue; >> + >> + if (op.u.pcpu_info.max_present > max_id) >> + max_id =3D op.u.pcpu_info.max_present; >> + if (id =3D=3D (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@lists.xensource.com >> http://lists.xensource.com/xen-devel