[kernel] r16681 - in dists/sid/linux-2.6/debian: . patches/features/all/xen patches/series

Ian Campbell ijc-guest at alioth.debian.org
Tue Dec 7 15:58:20 UTC 2010


Author: ijc-guest
Date: Tue Dec  7 15:58:15 2010
New Revision: 16681

Log:
xen: Add cpu hotplug support to prevent crash while parsing ACPI processor tables (Closes: #602109)

Added:
   dists/sid/linux-2.6/debian/patches/features/all/xen/xen-acpi-Add-cpu-hotplug-support.patch
Modified:
   dists/sid/linux-2.6/debian/changelog
   dists/sid/linux-2.6/debian/patches/series/29-extra

Modified: dists/sid/linux-2.6/debian/changelog
==============================================================================
--- dists/sid/linux-2.6/debian/changelog	Tue Dec  7 13:42:34 2010	(r16680)
+++ dists/sid/linux-2.6/debian/changelog	Tue Dec  7 15:58:15 2010	(r16681)
@@ -30,6 +30,8 @@
     node (Closes: #603632)
   * xen: handle potential time discontinuity on resume (Closes: #602273)
   * xen: don't bother to stop other cpus on shutdown/reboot (Closes: #605448)
+  * xen: Add cpu hotplug support to prevent crash while parsing ACPI processor
+    tables (Closes: #602109)
 
   [ Martin Michlmayr ]
   * Kirkwood: Add support for 6282 based QNAP devices.

Added: dists/sid/linux-2.6/debian/patches/features/all/xen/xen-acpi-Add-cpu-hotplug-support.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/xen/xen-acpi-Add-cpu-hotplug-support.patch	Tue Dec  7 15:58:15 2010	(r16681)
@@ -0,0 +1,156 @@
+From 68320323a51c2378aca433c76157d9e66104ff1e Mon Sep 17 00:00:00 2001
+From: Jiang, Yunhong <yunhong.jiang at intel.com>
+Date: Tue, 14 Sep 2010 14:41:52 -0700
+Subject: [PATCH] xen/acpi: Add cpu hotplug support
+
+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 at intel.com>
+Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge at citrix.com>
+---
+ drivers/acpi/processor_xen.c |   43 ++++++++++++++++++++++++++++++++++++++---
+ drivers/xen/pcpu.c           |   34 ++++++++++++++++++++++++++++++++-
+ include/xen/pcpu.h           |    2 +
+ 3 files changed, 74 insertions(+), 5 deletions(-)
+
+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
+-- 
+1.7.2.3
+

Modified: dists/sid/linux-2.6/debian/patches/series/29-extra
==============================================================================
--- dists/sid/linux-2.6/debian/patches/series/29-extra	Tue Dec  7 13:42:34 2010	(r16680)
+++ dists/sid/linux-2.6/debian/patches/series/29-extra	Tue Dec  7 15:58:15 2010	(r16681)
@@ -11,3 +11,4 @@
 + features/all/xen/xen-netfront-unconditionally-initialize-smartpoll-hr.patch featureset=xen
 + features/all/xen/xen-allocate-irq-descs-on-any-NUMA-node.patch featureset=xen
 + features/all/xen/xen-disable-ACPI-NUMA-for-PV-guests.patch featureset=xen
++ features/all/xen/xen-acpi-Add-cpu-hotplug-support.patch featureset=xen



More information about the Kernel-svn-changes mailing list