diff --git a/patches.xen/pvops-xen-Re-upload-processor-PM-data-to-hypervisor-after-.patch b/patches.xen/pvops-xen-Re-upload-processor-PM-data-to-hypervisor-after-.patch new file mode 100644 index 0000000..46d8393 --- /dev/null +++ b/patches.xen/pvops-xen-Re-upload-processor-PM-data-to-hypervisor-after-.patch @@ -0,0 +1,75 @@ +From 5d66288fa0a177817ca6473a53e27b32fbf37aa9 Mon Sep 17 00:00:00 2001 +From: Ben Guthro +Date: Tue, 2 Apr 2013 02:51:50 +0200 +Subject: [PATCH] xen: Re-upload processor PM data to hypervisor after S3 + +resume + +Upon resume, it was found that ACPI C-states were missing from non-boot CPUs. +This change registers a syscore_ops handler for this case, and performs a +subset of the xen_acpi_processor_init() functionality to achieve this case. + +Signed-Off-By: Ben Guthro +--- + drivers/xen/xen-acpi-processor.c | 24 ++++++++++++++++++++++++ + 1 file changed, 24 insertions(+) + +diff --git a/drivers/xen/xen-acpi-processor.c b/drivers/xen/xen-acpi-processor.c +index 316df65..92dabc8 100644 +--- a/drivers/xen/xen-acpi-processor.c ++++ b/drivers/xen/xen-acpi-processor.c +@@ -25,6 +25,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -467,6 +468,26 @@ static void free_acpi_perf_data(void) + free_percpu(acpi_perf_data); + } + ++static void xen_acpi_processor_resume(void) ++{ ++ int i; ++ printk(KERN_INFO "Resuming Xen processor info\n"); ++ ++ for_each_possible_cpu(i) { ++ struct acpi_processor *_pr; ++ _pr = per_cpu(processors, i /* APIC ID */); ++ if (!_pr) ++ continue; ++ ++ __clear_bit(_pr->acpi_id, acpi_ids_done); ++ (void)upload_pm_data(_pr); ++ } ++} ++ ++static struct syscore_ops xap_syscore_ops = { ++ .resume = xen_acpi_processor_resume, ++}; ++ + static int __init xen_acpi_processor_init(void) + { + struct acpi_processor *pr_backup = NULL; +@@ -532,6 +553,8 @@ static int __init xen_acpi_processor_init(void) + if (rc) + goto err_unregister; + ++ register_syscore_ops(&xap_syscore_ops); ++ + return 0; + err_unregister: + for_each_possible_cpu(i) { +@@ -550,6 +573,7 @@ static void __exit xen_acpi_processor_exit(void) + int i; + + kfree(acpi_ids_done); ++ unregister_syscore_ops(&xap_syscore_ops); + for_each_possible_cpu(i) { + struct acpi_processor_performance *perf; + perf = per_cpu_ptr(acpi_perf_data, i); +-- +1.8.1.4 + diff --git a/series-pvops.conf b/series-pvops.conf index 44ffdb9..ea80367 100644 --- a/series-pvops.conf +++ b/series-pvops.conf @@ -1,6 +1,7 @@ # ACPI S3 patches.xen/pvops-0001-x86-acpi-sleep-Provide-registration-for-acpi_suspend.patch patches.xen/pvops-0003-xen-acpi-sleep-Register-to-the-acpi_suspend_lowlevel.patch +patches.xen/pvops-xen-Re-upload-processor-PM-data-to-hypervisor-after-.patch # fix for GPU performance (revert workaround and apply proper fix), should go in 3.5 patches.xen/pvops-3.4-Revert-xen-pat-Disable-PAT-support-for-now.patch