diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-11-19 21:51:56 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-11-19 21:51:56 -0500 |
| commit | 4f7dbc7ff4ec19b40ec083f7c54a87d3ece0089d (patch) | |
| tree | c37f34eee23ae96c78f72e445ad20f8fbcab010e | |
| parent | 9f92f4719764acf1c9185a5958200887a43e3483 (diff) | |
| parent | 73f56c0d35e6427081a4eabd620d8b8d8a35bd09 (diff) | |
Merge branch 'x86-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
* 'x86-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
x86: more general identifier for Phoenix BIOS
AMD IOMMU: check for next_bit also in unmapped area
AMD IOMMU: fix fullflush comparison length
AMD IOMMU: enable device isolation per default
AMD IOMMU: add parameter to disable device isolation
x86, PEBS/DS: fix code flow in ds_request()
x86: add rdtsc barrier to TSC sync check
xen: fix scrub_page()
x86: fix es7000 compiling
x86, bts: fix unlock problem in ds.c
x86, voyager: fix smp generic helper voyager breakage
x86: move iomap.h to the new include location
| -rw-r--r-- | Documentation/kernel-parameters.txt | 4 | ||||
| -rw-r--r-- | arch/x86/Kconfig | 5 | ||||
| -rw-r--r-- | arch/x86/include/asm/iomap.h (renamed from include/asm-x86/iomap.h) | 0 | ||||
| -rw-r--r-- | arch/x86/kernel/amd_iommu.c | 2 | ||||
| -rw-r--r-- | arch/x86/kernel/amd_iommu_init.c | 6 | ||||
| -rw-r--r-- | arch/x86/kernel/ds.c | 25 | ||||
| -rw-r--r-- | arch/x86/kernel/es7000_32.c | 9 | ||||
| -rw-r--r-- | arch/x86/kernel/setup.c | 2 | ||||
| -rw-r--r-- | arch/x86/kernel/tsc_sync.c | 4 | ||||
| -rw-r--r-- | arch/x86/mach-voyager/voyager_smp.c | 16 | ||||
| -rw-r--r-- | drivers/xen/balloon.c | 9 |
11 files changed, 54 insertions, 28 deletions
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt index 899650c20cc2..e0f346d201ed 100644 --- a/Documentation/kernel-parameters.txt +++ b/Documentation/kernel-parameters.txt | |||
| @@ -294,7 +294,9 @@ and is between 256 and 4096 characters. It is defined in the file | |||
| 294 | Possible values are: | 294 | Possible values are: |
| 295 | isolate - enable device isolation (each device, as far | 295 | isolate - enable device isolation (each device, as far |
| 296 | as possible, will get its own protection | 296 | as possible, will get its own protection |
| 297 | domain) | 297 | domain) [default] |
| 298 | share - put every device behind one IOMMU into the | ||
| 299 | same protection domain | ||
| 298 | fullflush - enable flushing of IO/TLB entries when | 300 | fullflush - enable flushing of IO/TLB entries when |
| 299 | they are unmapped. Otherwise they are | 301 | they are unmapped. Otherwise they are |
| 300 | flushed before they will be reused, which | 302 | flushed before they will be reused, which |
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 93224b569187..fd2de7019537 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig | |||
| @@ -167,9 +167,12 @@ config GENERIC_PENDING_IRQ | |||
| 167 | config X86_SMP | 167 | config X86_SMP |
| 168 | bool | 168 | bool |
| 169 | depends on SMP && ((X86_32 && !X86_VOYAGER) || X86_64) | 169 | depends on SMP && ((X86_32 && !X86_VOYAGER) || X86_64) |
| 170 | select USE_GENERIC_SMP_HELPERS | ||
| 171 | default y | 170 | default y |
| 172 | 171 | ||
| 172 | config USE_GENERIC_SMP_HELPERS | ||
| 173 | def_bool y | ||
| 174 | depends on SMP | ||
| 175 | |||
| 173 | config X86_32_SMP | 176 | config X86_32_SMP |
| 174 | def_bool y | 177 | def_bool y |
| 175 | depends on X86_32 && SMP | 178 | depends on X86_32 && SMP |
diff --git a/include/asm-x86/iomap.h b/arch/x86/include/asm/iomap.h index c1f06289b14b..c1f06289b14b 100644 --- a/include/asm-x86/iomap.h +++ b/arch/x86/include/asm/iomap.h | |||
diff --git a/arch/x86/kernel/amd_iommu.c b/arch/x86/kernel/amd_iommu.c index 331b318304eb..e4899e0e8787 100644 --- a/arch/x86/kernel/amd_iommu.c +++ b/arch/x86/kernel/amd_iommu.c | |||
| @@ -537,7 +537,7 @@ static void dma_ops_free_addresses(struct dma_ops_domain *dom, | |||
| 537 | address >>= PAGE_SHIFT; | 537 | address >>= PAGE_SHIFT; |
| 538 | iommu_area_free(dom->bitmap, address, pages); | 538 | iommu_area_free(dom->bitmap, address, pages); |
| 539 | 539 | ||
| 540 | if (address + pages >= dom->next_bit) | 540 | if (address >= dom->next_bit) |
| 541 | dom->need_flush = true; | 541 | dom->need_flush = true; |
| 542 | } | 542 | } |
| 543 | 543 | ||
diff --git a/arch/x86/kernel/amd_iommu_init.c b/arch/x86/kernel/amd_iommu_init.c index 0cdcda35a05f..30ae2701b3df 100644 --- a/arch/x86/kernel/amd_iommu_init.c +++ b/arch/x86/kernel/amd_iommu_init.c | |||
| @@ -121,7 +121,7 @@ u16 amd_iommu_last_bdf; /* largest PCI device id we have | |||
| 121 | LIST_HEAD(amd_iommu_unity_map); /* a list of required unity mappings | 121 | LIST_HEAD(amd_iommu_unity_map); /* a list of required unity mappings |
| 122 | we find in ACPI */ | 122 | we find in ACPI */ |
| 123 | unsigned amd_iommu_aperture_order = 26; /* size of aperture in power of 2 */ | 123 | unsigned amd_iommu_aperture_order = 26; /* size of aperture in power of 2 */ |
| 124 | int amd_iommu_isolate; /* if 1, device isolation is enabled */ | 124 | int amd_iommu_isolate = 1; /* if 1, device isolation is enabled */ |
| 125 | bool amd_iommu_unmap_flush; /* if true, flush on every unmap */ | 125 | bool amd_iommu_unmap_flush; /* if true, flush on every unmap */ |
| 126 | 126 | ||
| 127 | LIST_HEAD(amd_iommu_list); /* list of all AMD IOMMUs in the | 127 | LIST_HEAD(amd_iommu_list); /* list of all AMD IOMMUs in the |
| @@ -1213,7 +1213,9 @@ static int __init parse_amd_iommu_options(char *str) | |||
| 1213 | for (; *str; ++str) { | 1213 | for (; *str; ++str) { |
| 1214 | if (strncmp(str, "isolate", 7) == 0) | 1214 | if (strncmp(str, "isolate", 7) == 0) |
| 1215 | amd_iommu_isolate = 1; | 1215 | amd_iommu_isolate = 1; |
| 1216 | if (strncmp(str, "fullflush", 11) == 0) | 1216 | if (strncmp(str, "share", 5) == 0) |
| 1217 | amd_iommu_isolate = 0; | ||
| 1218 | if (strncmp(str, "fullflush", 9) == 0) | ||
| 1217 | amd_iommu_unmap_flush = true; | 1219 | amd_iommu_unmap_flush = true; |
| 1218 | } | 1220 | } |
| 1219 | 1221 | ||
diff --git a/arch/x86/kernel/ds.c b/arch/x86/kernel/ds.c index 2b69994fd3a8..d1a121443bde 100644 --- a/arch/x86/kernel/ds.c +++ b/arch/x86/kernel/ds.c | |||
| @@ -236,17 +236,33 @@ static inline struct ds_context *ds_alloc_context(struct task_struct *task) | |||
| 236 | struct ds_context *context = *p_context; | 236 | struct ds_context *context = *p_context; |
| 237 | 237 | ||
| 238 | if (!context) { | 238 | if (!context) { |
| 239 | spin_unlock(&ds_lock); | ||
| 240 | |||
| 239 | context = kzalloc(sizeof(*context), GFP_KERNEL); | 241 | context = kzalloc(sizeof(*context), GFP_KERNEL); |
| 240 | 242 | ||
| 241 | if (!context) | 243 | if (!context) { |
| 244 | spin_lock(&ds_lock); | ||
| 242 | return NULL; | 245 | return NULL; |
| 246 | } | ||
| 243 | 247 | ||
| 244 | context->ds = kzalloc(ds_cfg.sizeof_ds, GFP_KERNEL); | 248 | context->ds = kzalloc(ds_cfg.sizeof_ds, GFP_KERNEL); |
| 245 | if (!context->ds) { | 249 | if (!context->ds) { |
| 246 | kfree(context); | 250 | kfree(context); |
| 251 | spin_lock(&ds_lock); | ||
| 247 | return NULL; | 252 | return NULL; |
| 248 | } | 253 | } |
| 249 | 254 | ||
| 255 | spin_lock(&ds_lock); | ||
| 256 | /* | ||
| 257 | * Check for race - another CPU could have allocated | ||
| 258 | * it meanwhile: | ||
| 259 | */ | ||
| 260 | if (*p_context) { | ||
| 261 | kfree(context->ds); | ||
| 262 | kfree(context); | ||
| 263 | return *p_context; | ||
| 264 | } | ||
| 265 | |||
| 250 | *p_context = context; | 266 | *p_context = context; |
| 251 | 267 | ||
| 252 | context->this = p_context; | 268 | context->this = p_context; |
| @@ -384,14 +400,15 @@ static int ds_request(struct task_struct *task, void *base, size_t size, | |||
| 384 | 400 | ||
| 385 | spin_lock(&ds_lock); | 401 | spin_lock(&ds_lock); |
| 386 | 402 | ||
| 387 | if (!check_tracer(task)) | ||
| 388 | return -EPERM; | ||
| 389 | |||
| 390 | error = -ENOMEM; | 403 | error = -ENOMEM; |
| 391 | context = ds_alloc_context(task); | 404 | context = ds_alloc_context(task); |
| 392 | if (!context) | 405 | if (!context) |
| 393 | goto out_unlock; | 406 | goto out_unlock; |
| 394 | 407 | ||
| 408 | error = -EPERM; | ||
| 409 | if (!check_tracer(task)) | ||
| 410 | goto out_unlock; | ||
| 411 | |||
| 395 | error = -EALREADY; | 412 | error = -EALREADY; |
| 396 | if (context->owner[qual] == current) | 413 | if (context->owner[qual] == current) |
| 397 | goto out_unlock; | 414 | goto out_unlock; |
diff --git a/arch/x86/kernel/es7000_32.c b/arch/x86/kernel/es7000_32.c index f454c78fcef6..0aa2c443d600 100644 --- a/arch/x86/kernel/es7000_32.c +++ b/arch/x86/kernel/es7000_32.c | |||
| @@ -250,31 +250,24 @@ int __init find_unisys_acpi_oem_table(unsigned long *oem_addr) | |||
| 250 | { | 250 | { |
| 251 | struct acpi_table_header *header = NULL; | 251 | struct acpi_table_header *header = NULL; |
| 252 | int i = 0; | 252 | int i = 0; |
| 253 | acpi_size tbl_size; | ||
| 254 | 253 | ||
| 255 | while (ACPI_SUCCESS(acpi_get_table_with_size("OEM1", i++, &header, &tbl_size))) { | 254 | while (ACPI_SUCCESS(acpi_get_table("OEM1", i++, &header))) { |
| 256 | if (!memcmp((char *) &header->oem_id, "UNISYS", 6)) { | 255 | if (!memcmp((char *) &header->oem_id, "UNISYS", 6)) { |
| 257 | struct oem_table *t = (struct oem_table *)header; | 256 | struct oem_table *t = (struct oem_table *)header; |
| 258 | 257 | ||
| 259 | oem_addrX = t->OEMTableAddr; | 258 | oem_addrX = t->OEMTableAddr; |
| 260 | oem_size = t->OEMTableSize; | 259 | oem_size = t->OEMTableSize; |
| 261 | early_acpi_os_unmap_memory(header, tbl_size); | ||
| 262 | 260 | ||
| 263 | *oem_addr = (unsigned long)__acpi_map_table(oem_addrX, | 261 | *oem_addr = (unsigned long)__acpi_map_table(oem_addrX, |
| 264 | oem_size); | 262 | oem_size); |
| 265 | return 0; | 263 | return 0; |
| 266 | } | 264 | } |
| 267 | early_acpi_os_unmap_memory(header, tbl_size); | ||
| 268 | } | 265 | } |
| 269 | return -1; | 266 | return -1; |
| 270 | } | 267 | } |
| 271 | 268 | ||
| 272 | void __init unmap_unisys_acpi_oem_table(unsigned long oem_addr) | 269 | void __init unmap_unisys_acpi_oem_table(unsigned long oem_addr) |
| 273 | { | 270 | { |
| 274 | if (!oem_addr) | ||
| 275 | return; | ||
| 276 | |||
| 277 | __acpi_unmap_table((char *)oem_addr, oem_size); | ||
| 278 | } | 271 | } |
| 279 | #endif | 272 | #endif |
| 280 | 273 | ||
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c index 0fa6790c1dd3..9d5674f7b6cc 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c | |||
| @@ -764,7 +764,7 @@ static struct dmi_system_id __initdata bad_bios_dmi_table[] = { | |||
| 764 | .callback = dmi_low_memory_corruption, | 764 | .callback = dmi_low_memory_corruption, |
| 765 | .ident = "Phoenix BIOS", | 765 | .ident = "Phoenix BIOS", |
| 766 | .matches = { | 766 | .matches = { |
| 767 | DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies, LTD"), | 767 | DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies"), |
| 768 | }, | 768 | }, |
| 769 | }, | 769 | }, |
| 770 | #endif | 770 | #endif |
diff --git a/arch/x86/kernel/tsc_sync.c b/arch/x86/kernel/tsc_sync.c index 9ffb01c31c40..1c0dfbca87c1 100644 --- a/arch/x86/kernel/tsc_sync.c +++ b/arch/x86/kernel/tsc_sync.c | |||
| @@ -46,7 +46,9 @@ static __cpuinit void check_tsc_warp(void) | |||
| 46 | cycles_t start, now, prev, end; | 46 | cycles_t start, now, prev, end; |
| 47 | int i; | 47 | int i; |
| 48 | 48 | ||
| 49 | rdtsc_barrier(); | ||
| 49 | start = get_cycles(); | 50 | start = get_cycles(); |
| 51 | rdtsc_barrier(); | ||
| 50 | /* | 52 | /* |
| 51 | * The measurement runs for 20 msecs: | 53 | * The measurement runs for 20 msecs: |
| 52 | */ | 54 | */ |
| @@ -61,7 +63,9 @@ static __cpuinit void check_tsc_warp(void) | |||
| 61 | */ | 63 | */ |
| 62 | __raw_spin_lock(&sync_lock); | 64 | __raw_spin_lock(&sync_lock); |
| 63 | prev = last_tsc; | 65 | prev = last_tsc; |
| 66 | rdtsc_barrier(); | ||
| 64 | now = get_cycles(); | 67 | now = get_cycles(); |
| 68 | rdtsc_barrier(); | ||
| 65 | last_tsc = now; | 69 | last_tsc = now; |
| 66 | __raw_spin_unlock(&sync_lock); | 70 | __raw_spin_unlock(&sync_lock); |
| 67 | 71 | ||
diff --git a/arch/x86/mach-voyager/voyager_smp.c b/arch/x86/mach-voyager/voyager_smp.c index 0e331652681e..52145007bd7e 100644 --- a/arch/x86/mach-voyager/voyager_smp.c +++ b/arch/x86/mach-voyager/voyager_smp.c | |||
| @@ -7,6 +7,7 @@ | |||
| 7 | * This file provides all the same external entries as smp.c but uses | 7 | * This file provides all the same external entries as smp.c but uses |
| 8 | * the voyager hal to provide the functionality | 8 | * the voyager hal to provide the functionality |
| 9 | */ | 9 | */ |
| 10 | #include <linux/cpu.h> | ||
| 10 | #include <linux/module.h> | 11 | #include <linux/module.h> |
| 11 | #include <linux/mm.h> | 12 | #include <linux/mm.h> |
| 12 | #include <linux/kernel_stat.h> | 13 | #include <linux/kernel_stat.h> |
| @@ -1790,6 +1791,17 @@ void __init smp_setup_processor_id(void) | |||
| 1790 | x86_write_percpu(cpu_number, hard_smp_processor_id()); | 1791 | x86_write_percpu(cpu_number, hard_smp_processor_id()); |
| 1791 | } | 1792 | } |
| 1792 | 1793 | ||
| 1794 | static void voyager_send_call_func(cpumask_t callmask) | ||
| 1795 | { | ||
| 1796 | __u32 mask = cpus_addr(callmask)[0] & ~(1 << smp_processor_id()); | ||
| 1797 | send_CPI(mask, VIC_CALL_FUNCTION_CPI); | ||
| 1798 | } | ||
| 1799 | |||
| 1800 | static void voyager_send_call_func_single(int cpu) | ||
| 1801 | { | ||
| 1802 | send_CPI(1 << cpu, VIC_CALL_FUNCTION_SINGLE_CPI); | ||
| 1803 | } | ||
| 1804 | |||
| 1793 | struct smp_ops smp_ops = { | 1805 | struct smp_ops smp_ops = { |
| 1794 | .smp_prepare_boot_cpu = voyager_smp_prepare_boot_cpu, | 1806 | .smp_prepare_boot_cpu = voyager_smp_prepare_boot_cpu, |
| 1795 | .smp_prepare_cpus = voyager_smp_prepare_cpus, | 1807 | .smp_prepare_cpus = voyager_smp_prepare_cpus, |
| @@ -1799,6 +1811,6 @@ struct smp_ops smp_ops = { | |||
| 1799 | .smp_send_stop = voyager_smp_send_stop, | 1811 | .smp_send_stop = voyager_smp_send_stop, |
| 1800 | .smp_send_reschedule = voyager_smp_send_reschedule, | 1812 | .smp_send_reschedule = voyager_smp_send_reschedule, |
| 1801 | 1813 | ||
| 1802 | .send_call_func_ipi = native_send_call_func_ipi, | 1814 | .send_call_func_ipi = voyager_send_call_func, |
| 1803 | .send_call_func_single_ipi = native_send_call_func_single_ipi, | 1815 | .send_call_func_single_ipi = voyager_send_call_func_single, |
| 1804 | }; | 1816 | }; |
diff --git a/drivers/xen/balloon.c b/drivers/xen/balloon.c index a0fb5eac407c..526c191e84ea 100644 --- a/drivers/xen/balloon.c +++ b/drivers/xen/balloon.c | |||
| @@ -122,14 +122,7 @@ static struct timer_list balloon_timer; | |||
| 122 | static void scrub_page(struct page *page) | 122 | static void scrub_page(struct page *page) |
| 123 | { | 123 | { |
| 124 | #ifdef CONFIG_XEN_SCRUB_PAGES | 124 | #ifdef CONFIG_XEN_SCRUB_PAGES |
| 125 | if (PageHighMem(page)) { | 125 | clear_highpage(page); |
| 126 | void *v = kmap(page); | ||
| 127 | clear_page(v); | ||
| 128 | kunmap(v); | ||
| 129 | } else { | ||
| 130 | void *v = page_address(page); | ||
| 131 | clear_page(v); | ||
| 132 | } | ||
| 133 | #endif | 126 | #endif |
| 134 | } | 127 | } |
| 135 | 128 | ||
