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

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


  • To: Jeremy Fitzhardinge <jeremy@xxxxxxxx>
  • From: "Jiang, Yunhong" <yunhong.jiang@xxxxxxxxx>
  • Date: Wed, 18 Aug 2010 11:04:35 +0800
  • Accept-language: en-US
  • Acceptlanguage: en-US
  • Cc: Xen-devel <xen-devel@xxxxxxxxxxxxxxxxxxx>
  • Delivery-date: Tue, 17 Aug 2010 20:06:09 -0700
  • List-id: Xen developer discussion <xen-devel.lists.xensource.com>
  • Thread-index: Acs+ghZJOhvGFXn7R8GqLHVXMxPfTA==
  • Thread-topic: [PATCH] Add cpu hotplug support for 2.6.32 branch

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?

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


Attachment: pcpu_hotplug_port.patch
Description: pcpu_hotplug_port.patch

_______________________________________________
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®.