aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/xen
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2012-03-24 15:20:25 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2012-03-24 15:20:25 -0400
commite22057c8599373e5caef0bc42bdb95d2a361ab0d (patch)
tree04e9f51835f4d5c08aada38597c30de1113c03d9 /drivers/xen
parent496b919b3bdd957d4b1727df79bfa3751bced1c1 (diff)
parentdf7a3ee29b775edd1c2d75cf0b128b174bd4091e (diff)
Merge tag 'stable/for-linus-3.4-tag-two' of git://git.kernel.org/pub/scm/linux/kernel/git/konrad/xen
Pull more xen updates from Konrad Rzeszutek Wilk: "One tiny feature that accidentally got lost in the initial git pull: * Add fast-EOI acking of interrupts (clear a bit instead of hypercall) And bug-fixes: * Fix CPU bring-up code missing a call to notify other subsystems. * Fix reading /sys/hypervisor even if PVonHVM drivers are not loaded. * In Xen ACPI processor driver: remove too verbose WARN messages, fix up the Kconfig dependency to be a module by default, and add dependency on CPU_FREQ. * Disable CPU frequency drivers from loading when booting under Xen (as we want the Xen ACPI processor to be used instead). * Cleanups in tmem code." * tag 'stable/for-linus-3.4-tag-two' of git://git.kernel.org/pub/scm/linux/kernel/git/konrad/xen: xen/acpi: Fix Kconfig dependency on CPU_FREQ xen: initialize platform-pci even if xen_emul_unplug=never xen/smp: Fix bringup bug in AP code. xen/acpi: Remove the WARN's as they just create noise. xen/tmem: cleanup xen: support pirq_eoi_map xen/acpi-processor: Do not depend on CPU frequency scaling drivers. xen/cpufreq: Disable the cpu frequency scaling drivers from loading. provide disable_cpufreq() function to disable the API.
Diffstat (limited to 'drivers/xen')
-rw-r--r--drivers/xen/Kconfig5
-rw-r--r--drivers/xen/events.c26
-rw-r--r--drivers/xen/platform-pci.c5
-rw-r--r--drivers/xen/tmem.c21
-rw-r--r--drivers/xen/xen-acpi-processor.c4
5 files changed, 35 insertions, 26 deletions
diff --git a/drivers/xen/Kconfig b/drivers/xen/Kconfig
index 648bcd4195c5..94243136f6bf 100644
--- a/drivers/xen/Kconfig
+++ b/drivers/xen/Kconfig
@@ -180,9 +180,8 @@ config XEN_PRIVCMD
180 180
181config XEN_ACPI_PROCESSOR 181config XEN_ACPI_PROCESSOR
182 tristate "Xen ACPI processor" 182 tristate "Xen ACPI processor"
183 depends on XEN && X86 && ACPI_PROCESSOR 183 depends on XEN && X86 && ACPI_PROCESSOR && CPU_FREQ
184 default y if (X86_ACPI_CPUFREQ = y || X86_POWERNOW_K8 = y) 184 default m
185 default m if (X86_ACPI_CPUFREQ = m || X86_POWERNOW_K8 = m)
186 help 185 help
187 This ACPI processor uploads Power Management information to the Xen hypervisor. 186 This ACPI processor uploads Power Management information to the Xen hypervisor.
188 187
diff --git a/drivers/xen/events.c b/drivers/xen/events.c
index e5e5812a1014..4b33acd8ed4e 100644
--- a/drivers/xen/events.c
+++ b/drivers/xen/events.c
@@ -37,6 +37,7 @@
37#include <asm/idle.h> 37#include <asm/idle.h>
38#include <asm/io_apic.h> 38#include <asm/io_apic.h>
39#include <asm/sync_bitops.h> 39#include <asm/sync_bitops.h>
40#include <asm/xen/page.h>
40#include <asm/xen/pci.h> 41#include <asm/xen/pci.h>
41#include <asm/xen/hypercall.h> 42#include <asm/xen/hypercall.h>
42#include <asm/xen/hypervisor.h> 43#include <asm/xen/hypervisor.h>
@@ -109,6 +110,8 @@ struct irq_info {
109#define PIRQ_SHAREABLE (1 << 1) 110#define PIRQ_SHAREABLE (1 << 1)
110 111
111static int *evtchn_to_irq; 112static int *evtchn_to_irq;
113static unsigned long *pirq_eoi_map;
114static bool (*pirq_needs_eoi)(unsigned irq);
112 115
113static DEFINE_PER_CPU(unsigned long [NR_EVENT_CHANNELS/BITS_PER_LONG], 116static DEFINE_PER_CPU(unsigned long [NR_EVENT_CHANNELS/BITS_PER_LONG],
114 cpu_evtchn_mask); 117 cpu_evtchn_mask);
@@ -269,10 +272,14 @@ static unsigned int cpu_from_evtchn(unsigned int evtchn)
269 return ret; 272 return ret;
270} 273}
271 274
272static bool pirq_needs_eoi(unsigned irq) 275static bool pirq_check_eoi_map(unsigned irq)
273{ 276{
274 struct irq_info *info = info_for_irq(irq); 277 return test_bit(irq, pirq_eoi_map);
278}
275 279
280static bool pirq_needs_eoi_flag(unsigned irq)
281{
282 struct irq_info *info = info_for_irq(irq);
276 BUG_ON(info->type != IRQT_PIRQ); 283 BUG_ON(info->type != IRQT_PIRQ);
277 284
278 return info->u.pirq.flags & PIRQ_NEEDS_EOI; 285 return info->u.pirq.flags & PIRQ_NEEDS_EOI;
@@ -1768,7 +1775,7 @@ void xen_callback_vector(void) {}
1768 1775
1769void __init xen_init_IRQ(void) 1776void __init xen_init_IRQ(void)
1770{ 1777{
1771 int i; 1778 int i, rc;
1772 1779
1773 evtchn_to_irq = kcalloc(NR_EVENT_CHANNELS, sizeof(*evtchn_to_irq), 1780 evtchn_to_irq = kcalloc(NR_EVENT_CHANNELS, sizeof(*evtchn_to_irq),
1774 GFP_KERNEL); 1781 GFP_KERNEL);
@@ -1782,6 +1789,8 @@ void __init xen_init_IRQ(void)
1782 for (i = 0; i < NR_EVENT_CHANNELS; i++) 1789 for (i = 0; i < NR_EVENT_CHANNELS; i++)
1783 mask_evtchn(i); 1790 mask_evtchn(i);
1784 1791
1792 pirq_needs_eoi = pirq_needs_eoi_flag;
1793
1785 if (xen_hvm_domain()) { 1794 if (xen_hvm_domain()) {
1786 xen_callback_vector(); 1795 xen_callback_vector();
1787 native_init_IRQ(); 1796 native_init_IRQ();
@@ -1789,8 +1798,19 @@ void __init xen_init_IRQ(void)
1789 * __acpi_register_gsi can point at the right function */ 1798 * __acpi_register_gsi can point at the right function */
1790 pci_xen_hvm_init(); 1799 pci_xen_hvm_init();
1791 } else { 1800 } else {
1801 struct physdev_pirq_eoi_gmfn eoi_gmfn;
1802
1792 irq_ctx_init(smp_processor_id()); 1803 irq_ctx_init(smp_processor_id());
1793 if (xen_initial_domain()) 1804 if (xen_initial_domain())
1794 pci_xen_initial_domain(); 1805 pci_xen_initial_domain();
1806
1807 pirq_eoi_map = (void *)__get_free_page(GFP_KERNEL|__GFP_ZERO);
1808 eoi_gmfn.gmfn = virt_to_mfn(pirq_eoi_map);
1809 rc = HYPERVISOR_physdev_op(PHYSDEVOP_pirq_eoi_gmfn_v2, &eoi_gmfn);
1810 if (rc != 0) {
1811 free_page((unsigned long) pirq_eoi_map);
1812 pirq_eoi_map = NULL;
1813 } else
1814 pirq_needs_eoi = pirq_check_eoi_map;
1795 } 1815 }
1796} 1816}
diff --git a/drivers/xen/platform-pci.c b/drivers/xen/platform-pci.c
index 319dd0a94d51..2389e581e23c 100644
--- a/drivers/xen/platform-pci.c
+++ b/drivers/xen/platform-pci.c
@@ -186,11 +186,6 @@ static struct pci_driver platform_driver = {
186 186
187static int __init platform_pci_module_init(void) 187static int __init platform_pci_module_init(void)
188{ 188{
189 /* no unplug has been done, IGNORE hasn't been specified: just
190 * return now */
191 if (!xen_platform_pci_unplug)
192 return -ENODEV;
193
194 return pci_register_driver(&platform_driver); 189 return pci_register_driver(&platform_driver);
195} 190}
196 191
diff --git a/drivers/xen/tmem.c b/drivers/xen/tmem.c
index 17d9e37beba4..dcb79521e6c8 100644
--- a/drivers/xen/tmem.c
+++ b/drivers/xen/tmem.c
@@ -9,7 +9,6 @@
9#include <linux/types.h> 9#include <linux/types.h>
10#include <linux/init.h> 10#include <linux/init.h>
11#include <linux/pagemap.h> 11#include <linux/pagemap.h>
12#include <linux/module.h>
13#include <linux/cleancache.h> 12#include <linux/cleancache.h>
14 13
15/* temporary ifdef until include/linux/frontswap.h is upstream */ 14/* temporary ifdef until include/linux/frontswap.h is upstream */
@@ -128,15 +127,13 @@ static int xen_tmem_flush_object(u32 pool_id, struct tmem_oid oid)
128 return xen_tmem_op(TMEM_FLUSH_OBJECT, pool_id, oid, 0, 0, 0, 0, 0); 127 return xen_tmem_op(TMEM_FLUSH_OBJECT, pool_id, oid, 0, 0, 0, 0, 0);
129} 128}
130 129
131int tmem_enabled __read_mostly; 130bool __read_mostly tmem_enabled = false;
132EXPORT_SYMBOL(tmem_enabled);
133 131
134static int __init enable_tmem(char *s) 132static int __init enable_tmem(char *s)
135{ 133{
136 tmem_enabled = 1; 134 tmem_enabled = true;
137 return 1; 135 return 1;
138} 136}
139
140__setup("tmem", enable_tmem); 137__setup("tmem", enable_tmem);
141 138
142#ifdef CONFIG_CLEANCACHE 139#ifdef CONFIG_CLEANCACHE
@@ -229,17 +226,16 @@ static int tmem_cleancache_init_shared_fs(char *uuid, size_t pagesize)
229 return xen_tmem_new_pool(shared_uuid, TMEM_POOL_SHARED, pagesize); 226 return xen_tmem_new_pool(shared_uuid, TMEM_POOL_SHARED, pagesize);
230} 227}
231 228
232static int use_cleancache = 1; 229static bool __initdata use_cleancache = true;
233 230
234static int __init no_cleancache(char *s) 231static int __init no_cleancache(char *s)
235{ 232{
236 use_cleancache = 0; 233 use_cleancache = false;
237 return 1; 234 return 1;
238} 235}
239
240__setup("nocleancache", no_cleancache); 236__setup("nocleancache", no_cleancache);
241 237
242static struct cleancache_ops tmem_cleancache_ops = { 238static struct cleancache_ops __initdata tmem_cleancache_ops = {
243 .put_page = tmem_cleancache_put_page, 239 .put_page = tmem_cleancache_put_page,
244 .get_page = tmem_cleancache_get_page, 240 .get_page = tmem_cleancache_get_page,
245 .invalidate_page = tmem_cleancache_flush_page, 241 .invalidate_page = tmem_cleancache_flush_page,
@@ -356,17 +352,16 @@ static void tmem_frontswap_init(unsigned ignored)
356 xen_tmem_new_pool(private, TMEM_POOL_PERSIST, PAGE_SIZE); 352 xen_tmem_new_pool(private, TMEM_POOL_PERSIST, PAGE_SIZE);
357} 353}
358 354
359static int __initdata use_frontswap = 1; 355static bool __initdata use_frontswap = true;
360 356
361static int __init no_frontswap(char *s) 357static int __init no_frontswap(char *s)
362{ 358{
363 use_frontswap = 0; 359 use_frontswap = false;
364 return 1; 360 return 1;
365} 361}
366
367__setup("nofrontswap", no_frontswap); 362__setup("nofrontswap", no_frontswap);
368 363
369static struct frontswap_ops tmem_frontswap_ops = { 364static struct frontswap_ops __initdata tmem_frontswap_ops = {
370 .put_page = tmem_frontswap_put_page, 365 .put_page = tmem_frontswap_put_page,
371 .get_page = tmem_frontswap_get_page, 366 .get_page = tmem_frontswap_get_page,
372 .invalidate_page = tmem_frontswap_flush_page, 367 .invalidate_page = tmem_frontswap_flush_page,
diff --git a/drivers/xen/xen-acpi-processor.c b/drivers/xen/xen-acpi-processor.c
index 5c2be963aa18..174b5653cd8a 100644
--- a/drivers/xen/xen-acpi-processor.c
+++ b/drivers/xen/xen-acpi-processor.c
@@ -501,11 +501,11 @@ static int __init xen_acpi_processor_init(void)
501 501
502 perf = per_cpu_ptr(acpi_perf_data, i); 502 perf = per_cpu_ptr(acpi_perf_data, i);
503 rc = acpi_processor_register_performance(perf, i); 503 rc = acpi_processor_register_performance(perf, i);
504 if (WARN_ON(rc)) 504 if (rc)
505 goto err_out; 505 goto err_out;
506 } 506 }
507 rc = acpi_processor_notify_smm(THIS_MODULE); 507 rc = acpi_processor_notify_smm(THIS_MODULE);
508 if (WARN_ON(rc)) 508 if (rc)
509 goto err_unregister; 509 goto err_unregister;
510 510
511 for_each_possible_cpu(i) { 511 for_each_possible_cpu(i) {