Jeremy, I think all this patch is purely for acpi changes, so not sure if it 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 for
PM and CPU/Mem hotplug in a cleaner way and is based on 2.6.32 kernel, so maybe
we can use that for the base tree.
Thanks
--jyh
>-----Original Message-----
>From: Jeremy Fitzhardinge [mailto:jeremy@xxxxxxxx]
>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 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
|