diff options
| author | Linus Torvalds <torvalds@g5.osdl.org> | 2006-09-30 11:37:55 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-09-30 11:37:55 -0400 |
| commit | 369aa8395a5dcc89230f1de5459124c4b0db9fca (patch) | |
| tree | d95edf4c52e343e2080427ad153da051ea52eee6 | |
| parent | bf603625660b1742004bf86432ce3c210d14d4fd (diff) | |
| parent | c84ef5305930d19bdd6cd576b3a3a73786a82e57 (diff) | |
Merge branch 'for-linus' of git://one.firstfloor.org/home/andi/git/linux-2.6
* 'for-linus' of git://one.firstfloor.org/home/andi/git/linux-2.6:
[PATCH] Use early clobber in semaphores
[PATCH] Define vsyscall cache as blob to make clearer that user space shouldn't use it
[PATCH] Re-positioning the bss segment
[PATCH] Use ARRAY_SIZE in setup.c
[PATCH] i386: replace intermediate array-size definitions with ARRAY_SIZE()
[PATCH] x86: Clean up x86 NMI sysctls
[PATCH] Refactor some duplicated code in mpparse.c
[PATCH] Document iommu=panic
[PATCH] Fix broken indentation in iommu_setup
[PATCH] Allow disabling DAC using command line options
[PATCH] Add proper sparse __user casts to __copy_to_user_inatomic
[PATCH] i386: Update defconfig
[PATCH] Update defconfig
| -rw-r--r-- | Documentation/x86_64/boot-options.txt | 5 | ||||
| -rw-r--r-- | arch/i386/defconfig | 7 | ||||
| -rw-r--r-- | arch/i386/kernel/nmi.c | 3 | ||||
| -rw-r--r-- | arch/i386/kernel/setup.c | 10 | ||||
| -rw-r--r-- | arch/i386/kernel/traps.c | 2 | ||||
| -rw-r--r-- | arch/x86_64/defconfig | 8 | ||||
| -rw-r--r-- | arch/x86_64/kernel/mpparse.c | 37 | ||||
| -rw-r--r-- | arch/x86_64/kernel/nmi.c | 4 | ||||
| -rw-r--r-- | arch/x86_64/kernel/pci-dma.c | 93 | ||||
| -rw-r--r-- | arch/x86_64/kernel/setup.c | 11 | ||||
| -rw-r--r-- | arch/x86_64/kernel/vmlinux.lds.S | 14 | ||||
| -rw-r--r-- | arch/x86_64/kernel/vsyscall.c | 8 | ||||
| -rw-r--r-- | include/asm-i386/nmi.h | 6 | ||||
| -rw-r--r-- | include/asm-x86_64/nmi.h | 7 | ||||
| -rw-r--r-- | include/asm-x86_64/semaphore.h | 4 | ||||
| -rw-r--r-- | include/asm-x86_64/uaccess.h | 7 | ||||
| -rw-r--r-- | include/linux/getcpu.h | 12 | ||||
| -rw-r--r-- | kernel/panic.c | 1 | ||||
| -rw-r--r-- | kernel/sys.c | 8 | ||||
| -rw-r--r-- | kernel/sysctl.c | 11 |
20 files changed, 152 insertions, 106 deletions
diff --git a/Documentation/x86_64/boot-options.txt b/Documentation/x86_64/boot-options.txt index 4303e0c12476..74b77f9e91bc 100644 --- a/Documentation/x86_64/boot-options.txt +++ b/Documentation/x86_64/boot-options.txt | |||
| @@ -199,6 +199,11 @@ IOMMU | |||
| 199 | allowed overwrite iommu off workarounds for specific chipsets. | 199 | allowed overwrite iommu off workarounds for specific chipsets. |
| 200 | soft Use software bounce buffering (default for Intel machines) | 200 | soft Use software bounce buffering (default for Intel machines) |
| 201 | noaperture Don't touch the aperture for AGP. | 201 | noaperture Don't touch the aperture for AGP. |
| 202 | allowdac Allow DMA >4GB | ||
| 203 | When off all DMA over >4GB is forced through an IOMMU or bounce | ||
| 204 | buffering. | ||
| 205 | nodac Forbid DMA >4GB | ||
| 206 | panic Always panic when IOMMU overflows | ||
| 202 | 207 | ||
| 203 | swiotlb=pages[,force] | 208 | swiotlb=pages[,force] |
| 204 | 209 | ||
diff --git a/arch/i386/defconfig b/arch/i386/defconfig index 1a29bfa26d0c..ee2d79bd8af7 100644 --- a/arch/i386/defconfig +++ b/arch/i386/defconfig | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | # | 1 | # |
| 2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
| 3 | # Linux kernel version: 2.6.18-git5 | 3 | # Linux kernel version: 2.6.18-git7 |
| 4 | # Tue Sep 26 09:30:47 2006 | 4 | # Wed Sep 27 21:53:10 2006 |
| 5 | # | 5 | # |
| 6 | CONFIG_X86_32=y | 6 | CONFIG_X86_32=y |
| 7 | CONFIG_GENERIC_TIME=y | 7 | CONFIG_GENERIC_TIME=y |
| @@ -210,6 +210,7 @@ CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y | |||
| 210 | CONFIG_PM=y | 210 | CONFIG_PM=y |
| 211 | CONFIG_PM_LEGACY=y | 211 | CONFIG_PM_LEGACY=y |
| 212 | # CONFIG_PM_DEBUG is not set | 212 | # CONFIG_PM_DEBUG is not set |
| 213 | CONFIG_PM_SYSFS_DEPRECATED=y | ||
| 213 | 214 | ||
| 214 | # | 215 | # |
| 215 | # ACPI (Advanced Configuration and Power Interface) Support | 216 | # ACPI (Advanced Configuration and Power Interface) Support |
| @@ -292,6 +293,7 @@ CONFIG_PCI_DIRECT=y | |||
| 292 | CONFIG_PCI_MMCONFIG=y | 293 | CONFIG_PCI_MMCONFIG=y |
| 293 | # CONFIG_PCIEPORTBUS is not set | 294 | # CONFIG_PCIEPORTBUS is not set |
| 294 | CONFIG_PCI_MSI=y | 295 | CONFIG_PCI_MSI=y |
| 296 | # CONFIG_PCI_MULTITHREAD_PROBE is not set | ||
| 295 | # CONFIG_PCI_DEBUG is not set | 297 | # CONFIG_PCI_DEBUG is not set |
| 296 | CONFIG_ISA_DMA_API=y | 298 | CONFIG_ISA_DMA_API=y |
| 297 | # CONFIG_ISA is not set | 299 | # CONFIG_ISA is not set |
| @@ -1427,6 +1429,7 @@ CONFIG_KPROBES=y | |||
| 1427 | # | 1429 | # |
| 1428 | CONFIG_TRACE_IRQFLAGS_SUPPORT=y | 1430 | CONFIG_TRACE_IRQFLAGS_SUPPORT=y |
| 1429 | # CONFIG_PRINTK_TIME is not set | 1431 | # CONFIG_PRINTK_TIME is not set |
| 1432 | # CONFIG_ENABLE_MUST_CHECK is not set | ||
| 1430 | CONFIG_MAGIC_SYSRQ=y | 1433 | CONFIG_MAGIC_SYSRQ=y |
| 1431 | CONFIG_UNUSED_SYMBOLS=y | 1434 | CONFIG_UNUSED_SYMBOLS=y |
| 1432 | CONFIG_DEBUG_KERNEL=y | 1435 | CONFIG_DEBUG_KERNEL=y |
diff --git a/arch/i386/kernel/nmi.c b/arch/i386/kernel/nmi.c index dbda706fdd14..0fc4997fb143 100644 --- a/arch/i386/kernel/nmi.c +++ b/arch/i386/kernel/nmi.c | |||
| @@ -31,6 +31,9 @@ | |||
| 31 | 31 | ||
| 32 | #include "mach_traps.h" | 32 | #include "mach_traps.h" |
| 33 | 33 | ||
| 34 | int unknown_nmi_panic; | ||
| 35 | int nmi_watchdog_enabled; | ||
| 36 | |||
| 34 | /* perfctr_nmi_owner tracks the ownership of the perfctr registers: | 37 | /* perfctr_nmi_owner tracks the ownership of the perfctr registers: |
| 35 | * evtsel_nmi_owner tracks the ownership of the event selection | 38 | * evtsel_nmi_owner tracks the ownership of the event selection |
| 36 | * - different performance counters/ event selection may be reserved for | 39 | * - different performance counters/ event selection may be reserved for |
diff --git a/arch/i386/kernel/setup.c b/arch/i386/kernel/setup.c index 814cdebf7377..000cf03751fe 100644 --- a/arch/i386/kernel/setup.c +++ b/arch/i386/kernel/setup.c | |||
| @@ -209,9 +209,6 @@ static struct resource adapter_rom_resources[] = { { | |||
| 209 | .flags = IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM | 209 | .flags = IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM |
| 210 | } }; | 210 | } }; |
| 211 | 211 | ||
| 212 | #define ADAPTER_ROM_RESOURCES \ | ||
| 213 | (sizeof adapter_rom_resources / sizeof adapter_rom_resources[0]) | ||
| 214 | |||
| 215 | static struct resource video_rom_resource = { | 212 | static struct resource video_rom_resource = { |
| 216 | .name = "Video ROM", | 213 | .name = "Video ROM", |
| 217 | .start = 0xc0000, | 214 | .start = 0xc0000, |
| @@ -273,9 +270,6 @@ static struct resource standard_io_resources[] = { { | |||
| 273 | .flags = IORESOURCE_BUSY | IORESOURCE_IO | 270 | .flags = IORESOURCE_BUSY | IORESOURCE_IO |
| 274 | } }; | 271 | } }; |
| 275 | 272 | ||
| 276 | #define STANDARD_IO_RESOURCES \ | ||
| 277 | (sizeof standard_io_resources / sizeof standard_io_resources[0]) | ||
| 278 | |||
| 279 | #define romsignature(x) (*(unsigned short *)(x) == 0xaa55) | 273 | #define romsignature(x) (*(unsigned short *)(x) == 0xaa55) |
| 280 | 274 | ||
| 281 | static int __init romchecksum(unsigned char *rom, unsigned long length) | 275 | static int __init romchecksum(unsigned char *rom, unsigned long length) |
| @@ -332,7 +326,7 @@ static void __init probe_roms(void) | |||
| 332 | } | 326 | } |
| 333 | 327 | ||
| 334 | /* check for adapter roms on 2k boundaries */ | 328 | /* check for adapter roms on 2k boundaries */ |
| 335 | for (i = 0; i < ADAPTER_ROM_RESOURCES && start < upper; start += 2048) { | 329 | for (i = 0; i < ARRAY_SIZE(adapter_rom_resources) && start < upper; start += 2048) { |
| 336 | rom = isa_bus_to_virt(start); | 330 | rom = isa_bus_to_virt(start); |
| 337 | if (!romsignature(rom)) | 331 | if (!romsignature(rom)) |
| 338 | continue; | 332 | continue; |
| @@ -1272,7 +1266,7 @@ static int __init request_standard_resources(void) | |||
| 1272 | request_resource(&iomem_resource, &video_ram_resource); | 1266 | request_resource(&iomem_resource, &video_ram_resource); |
| 1273 | 1267 | ||
| 1274 | /* request I/O space for devices used on all i[345]86 PCs */ | 1268 | /* request I/O space for devices used on all i[345]86 PCs */ |
| 1275 | for (i = 0; i < STANDARD_IO_RESOURCES; i++) | 1269 | for (i = 0; i < ARRAY_SIZE(standard_io_resources); i++) |
| 1276 | request_resource(&ioport_resource, &standard_io_resources[i]); | 1270 | request_resource(&ioport_resource, &standard_io_resources[i]); |
| 1277 | return 0; | 1271 | return 0; |
| 1278 | } | 1272 | } |
diff --git a/arch/i386/kernel/traps.c b/arch/i386/kernel/traps.c index a13037fe0ee3..6820b8d643c7 100644 --- a/arch/i386/kernel/traps.c +++ b/arch/i386/kernel/traps.c | |||
| @@ -57,6 +57,8 @@ | |||
| 57 | 57 | ||
| 58 | #include "mach_traps.h" | 58 | #include "mach_traps.h" |
| 59 | 59 | ||
| 60 | int panic_on_unrecovered_nmi; | ||
| 61 | |||
| 60 | asmlinkage int system_call(void); | 62 | asmlinkage int system_call(void); |
| 61 | 63 | ||
| 62 | struct desc_struct default_ldt[] = { { 0, 0 }, { 0, 0 }, { 0, 0 }, | 64 | struct desc_struct default_ldt[] = { { 0, 0 }, { 0, 0 }, { 0, 0 }, |
diff --git a/arch/x86_64/defconfig b/arch/x86_64/defconfig index 647610ecb580..4844b543bed0 100644 --- a/arch/x86_64/defconfig +++ b/arch/x86_64/defconfig | |||
| @@ -1,11 +1,12 @@ | |||
| 1 | # | 1 | # |
| 2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
| 3 | # Linux kernel version: 2.6.18-git5 | 3 | # Linux kernel version: 2.6.18-git7 |
| 4 | # Tue Sep 26 09:30:47 2006 | 4 | # Wed Sep 27 21:53:10 2006 |
| 5 | # | 5 | # |
| 6 | CONFIG_X86_64=y | 6 | CONFIG_X86_64=y |
| 7 | CONFIG_64BIT=y | 7 | CONFIG_64BIT=y |
| 8 | CONFIG_X86=y | 8 | CONFIG_X86=y |
| 9 | CONFIG_ZONE_DMA32=y | ||
| 9 | CONFIG_LOCKDEP_SUPPORT=y | 10 | CONFIG_LOCKDEP_SUPPORT=y |
| 10 | CONFIG_STACKTRACE_SUPPORT=y | 11 | CONFIG_STACKTRACE_SUPPORT=y |
| 11 | CONFIG_SEMAPHORE_SLEEPERS=y | 12 | CONFIG_SEMAPHORE_SLEEPERS=y |
| @@ -179,6 +180,7 @@ CONFIG_GENERIC_PENDING_IRQ=y | |||
| 179 | CONFIG_PM=y | 180 | CONFIG_PM=y |
| 180 | # CONFIG_PM_LEGACY is not set | 181 | # CONFIG_PM_LEGACY is not set |
| 181 | # CONFIG_PM_DEBUG is not set | 182 | # CONFIG_PM_DEBUG is not set |
| 183 | # CONFIG_PM_SYSFS_DEPRECATED is not set | ||
| 182 | CONFIG_SOFTWARE_SUSPEND=y | 184 | CONFIG_SOFTWARE_SUSPEND=y |
| 183 | CONFIG_PM_STD_PARTITION="" | 185 | CONFIG_PM_STD_PARTITION="" |
| 184 | CONFIG_SUSPEND_SMP=y | 186 | CONFIG_SUSPEND_SMP=y |
| @@ -251,6 +253,7 @@ CONFIG_PCI_DIRECT=y | |||
| 251 | CONFIG_PCI_MMCONFIG=y | 253 | CONFIG_PCI_MMCONFIG=y |
| 252 | CONFIG_PCIEPORTBUS=y | 254 | CONFIG_PCIEPORTBUS=y |
| 253 | CONFIG_PCI_MSI=y | 255 | CONFIG_PCI_MSI=y |
| 256 | # CONFIG_PCI_MULTITHREAD_PROBE is not set | ||
| 254 | # CONFIG_PCI_DEBUG is not set | 257 | # CONFIG_PCI_DEBUG is not set |
| 255 | 258 | ||
| 256 | # | 259 | # |
| @@ -1458,6 +1461,7 @@ CONFIG_KPROBES=y | |||
| 1458 | # | 1461 | # |
| 1459 | CONFIG_TRACE_IRQFLAGS_SUPPORT=y | 1462 | CONFIG_TRACE_IRQFLAGS_SUPPORT=y |
| 1460 | # CONFIG_PRINTK_TIME is not set | 1463 | # CONFIG_PRINTK_TIME is not set |
| 1464 | # CONFIG_ENABLE_MUST_CHECK is not set | ||
| 1461 | CONFIG_MAGIC_SYSRQ=y | 1465 | CONFIG_MAGIC_SYSRQ=y |
| 1462 | CONFIG_UNUSED_SYMBOLS=y | 1466 | CONFIG_UNUSED_SYMBOLS=y |
| 1463 | CONFIG_DEBUG_KERNEL=y | 1467 | CONFIG_DEBUG_KERNEL=y |
diff --git a/arch/x86_64/kernel/mpparse.c b/arch/x86_64/kernel/mpparse.c index 20e88f4b564b..b8d53dfa9931 100644 --- a/arch/x86_64/kernel/mpparse.c +++ b/arch/x86_64/kernel/mpparse.c | |||
| @@ -152,6 +152,21 @@ static void __init MP_bus_info (struct mpc_config_bus *m) | |||
| 152 | } | 152 | } |
| 153 | } | 153 | } |
| 154 | 154 | ||
| 155 | static int bad_ioapic(unsigned long address) | ||
| 156 | { | ||
| 157 | if (nr_ioapics >= MAX_IO_APICS) { | ||
| 158 | printk(KERN_ERR "ERROR: Max # of I/O APICs (%d) exceeded " | ||
| 159 | "(found %d)\n", MAX_IO_APICS, nr_ioapics); | ||
| 160 | panic("Recompile kernel with bigger MAX_IO_APICS!\n"); | ||
| 161 | } | ||
| 162 | if (!address) { | ||
| 163 | printk(KERN_ERR "WARNING: Bogus (zero) I/O APIC address" | ||
| 164 | " found in table, skipping!\n"); | ||
| 165 | return 1; | ||
| 166 | } | ||
| 167 | return 0; | ||
| 168 | } | ||
| 169 | |||
| 155 | static void __init MP_ioapic_info (struct mpc_config_ioapic *m) | 170 | static void __init MP_ioapic_info (struct mpc_config_ioapic *m) |
| 156 | { | 171 | { |
| 157 | if (!(m->mpc_flags & MPC_APIC_USABLE)) | 172 | if (!(m->mpc_flags & MPC_APIC_USABLE)) |
| @@ -159,16 +174,10 @@ static void __init MP_ioapic_info (struct mpc_config_ioapic *m) | |||
| 159 | 174 | ||
| 160 | printk("I/O APIC #%d at 0x%X.\n", | 175 | printk("I/O APIC #%d at 0x%X.\n", |
| 161 | m->mpc_apicid, m->mpc_apicaddr); | 176 | m->mpc_apicid, m->mpc_apicaddr); |
| 162 | if (nr_ioapics >= MAX_IO_APICS) { | 177 | |
| 163 | printk(KERN_ERR "Max # of I/O APICs (%d) exceeded (found %d).\n", | 178 | if (bad_ioapic(m->mpc_apicaddr)) |
| 164 | MAX_IO_APICS, nr_ioapics); | ||
| 165 | panic("Recompile kernel with bigger MAX_IO_APICS!.\n"); | ||
| 166 | } | ||
| 167 | if (!m->mpc_apicaddr) { | ||
| 168 | printk(KERN_ERR "WARNING: bogus zero I/O APIC address" | ||
| 169 | " found in MP table, skipping!\n"); | ||
| 170 | return; | 179 | return; |
| 171 | } | 180 | |
| 172 | mp_ioapics[nr_ioapics] = *m; | 181 | mp_ioapics[nr_ioapics] = *m; |
| 173 | nr_ioapics++; | 182 | nr_ioapics++; |
| 174 | } | 183 | } |
| @@ -647,16 +656,8 @@ void __init mp_register_ioapic(u8 id, u32 address, u32 gsi_base) | |||
| 647 | { | 656 | { |
| 648 | int idx = 0; | 657 | int idx = 0; |
| 649 | 658 | ||
| 650 | if (nr_ioapics >= MAX_IO_APICS) { | 659 | if (bad_ioapic(address)) |
| 651 | printk(KERN_ERR "ERROR: Max # of I/O APICs (%d) exceeded " | ||
| 652 | "(found %d)\n", MAX_IO_APICS, nr_ioapics); | ||
| 653 | panic("Recompile kernel with bigger MAX_IO_APICS!\n"); | ||
| 654 | } | ||
| 655 | if (!address) { | ||
| 656 | printk(KERN_ERR "WARNING: Bogus (zero) I/O APIC address" | ||
| 657 | " found in MADT table, skipping!\n"); | ||
| 658 | return; | 660 | return; |
| 659 | } | ||
| 660 | 661 | ||
| 661 | idx = nr_ioapics++; | 662 | idx = nr_ioapics++; |
| 662 | 663 | ||
diff --git a/arch/x86_64/kernel/nmi.c b/arch/x86_64/kernel/nmi.c index 4d6fb047952e..7af9cb3e2d99 100644 --- a/arch/x86_64/kernel/nmi.c +++ b/arch/x86_64/kernel/nmi.c | |||
| @@ -28,6 +28,10 @@ | |||
| 28 | #include <asm/mce.h> | 28 | #include <asm/mce.h> |
| 29 | #include <asm/intel_arch_perfmon.h> | 29 | #include <asm/intel_arch_perfmon.h> |
| 30 | 30 | ||
| 31 | int unknown_nmi_panic; | ||
| 32 | int nmi_watchdog_enabled; | ||
| 33 | int panic_on_unrecovered_nmi; | ||
| 34 | |||
| 31 | /* perfctr_nmi_owner tracks the ownership of the perfctr registers: | 35 | /* perfctr_nmi_owner tracks the ownership of the perfctr registers: |
| 32 | * evtsel_nmi_owner tracks the ownership of the event selection | 36 | * evtsel_nmi_owner tracks the ownership of the event selection |
| 33 | * - different performance counters/ event selection may be reserved for | 37 | * - different performance counters/ event selection may be reserved for |
diff --git a/arch/x86_64/kernel/pci-dma.c b/arch/x86_64/kernel/pci-dma.c index 4dcb671bd19f..f8d857453f8a 100644 --- a/arch/x86_64/kernel/pci-dma.c +++ b/arch/x86_64/kernel/pci-dma.c | |||
| @@ -170,8 +170,20 @@ void dma_free_coherent(struct device *dev, size_t size, | |||
| 170 | } | 170 | } |
| 171 | EXPORT_SYMBOL(dma_free_coherent); | 171 | EXPORT_SYMBOL(dma_free_coherent); |
| 172 | 172 | ||
| 173 | static int forbid_dac __read_mostly; | ||
| 174 | |||
| 173 | int dma_supported(struct device *dev, u64 mask) | 175 | int dma_supported(struct device *dev, u64 mask) |
| 174 | { | 176 | { |
| 177 | #ifdef CONFIG_PCI | ||
| 178 | if (mask > 0xffffffff && forbid_dac > 0) { | ||
| 179 | |||
| 180 | |||
| 181 | |||
| 182 | printk(KERN_INFO "PCI: Disallowing DAC for device %s\n", dev->bus_id); | ||
| 183 | return 0; | ||
| 184 | } | ||
| 185 | #endif | ||
| 186 | |||
| 175 | if (dma_ops->dma_supported) | 187 | if (dma_ops->dma_supported) |
| 176 | return dma_ops->dma_supported(dev, mask); | 188 | return dma_ops->dma_supported(dev, mask); |
| 177 | 189 | ||
| @@ -231,57 +243,64 @@ EXPORT_SYMBOL(dma_set_mask); | |||
| 231 | allowed overwrite iommu off workarounds for specific chipsets. | 243 | allowed overwrite iommu off workarounds for specific chipsets. |
| 232 | soft Use software bounce buffering (default for Intel machines) | 244 | soft Use software bounce buffering (default for Intel machines) |
| 233 | noaperture Don't touch the aperture for AGP. | 245 | noaperture Don't touch the aperture for AGP. |
| 246 | allowdac Allow DMA >4GB | ||
| 247 | nodac Forbid DMA >4GB | ||
| 248 | panic Force panic when IOMMU overflows | ||
| 234 | */ | 249 | */ |
| 235 | __init int iommu_setup(char *p) | 250 | __init int iommu_setup(char *p) |
| 236 | { | 251 | { |
| 237 | iommu_merge = 1; | 252 | iommu_merge = 1; |
| 238 | 253 | ||
| 239 | if (!p) | 254 | if (!p) |
| 240 | return -EINVAL; | 255 | return -EINVAL; |
| 241 | 256 | ||
| 242 | while (*p) { | 257 | while (*p) { |
| 243 | if (!strncmp(p,"off",3)) | 258 | if (!strncmp(p,"off",3)) |
| 244 | no_iommu = 1; | 259 | no_iommu = 1; |
| 245 | /* gart_parse_options has more force support */ | 260 | /* gart_parse_options has more force support */ |
| 246 | if (!strncmp(p,"force",5)) | 261 | if (!strncmp(p,"force",5)) |
| 247 | force_iommu = 1; | 262 | force_iommu = 1; |
| 248 | if (!strncmp(p,"noforce",7)) { | 263 | if (!strncmp(p,"noforce",7)) { |
| 249 | iommu_merge = 0; | 264 | iommu_merge = 0; |
| 250 | force_iommu = 0; | 265 | force_iommu = 0; |
| 251 | } | 266 | } |
| 252 | 267 | ||
| 253 | if (!strncmp(p, "biomerge",8)) { | 268 | if (!strncmp(p, "biomerge",8)) { |
| 254 | iommu_bio_merge = 4096; | 269 | iommu_bio_merge = 4096; |
| 255 | iommu_merge = 1; | 270 | iommu_merge = 1; |
| 256 | force_iommu = 1; | 271 | force_iommu = 1; |
| 257 | } | 272 | } |
| 258 | if (!strncmp(p, "panic",5)) | 273 | if (!strncmp(p, "panic",5)) |
| 259 | panic_on_overflow = 1; | 274 | panic_on_overflow = 1; |
| 260 | if (!strncmp(p, "nopanic",7)) | 275 | if (!strncmp(p, "nopanic",7)) |
| 261 | panic_on_overflow = 0; | 276 | panic_on_overflow = 0; |
| 262 | if (!strncmp(p, "merge",5)) { | 277 | if (!strncmp(p, "merge",5)) { |
| 263 | iommu_merge = 1; | 278 | iommu_merge = 1; |
| 264 | force_iommu = 1; | 279 | force_iommu = 1; |
| 265 | } | 280 | } |
| 266 | if (!strncmp(p, "nomerge",7)) | 281 | if (!strncmp(p, "nomerge",7)) |
| 267 | iommu_merge = 0; | 282 | iommu_merge = 0; |
| 268 | if (!strncmp(p, "forcesac",8)) | 283 | if (!strncmp(p, "forcesac",8)) |
| 269 | iommu_sac_force = 1; | 284 | iommu_sac_force = 1; |
| 285 | if (!strncmp(p, "allowdac", 8)) | ||
| 286 | forbid_dac = 0; | ||
| 287 | if (!strncmp(p, "nodac", 5)) | ||
| 288 | forbid_dac = -1; | ||
| 270 | 289 | ||
| 271 | #ifdef CONFIG_SWIOTLB | 290 | #ifdef CONFIG_SWIOTLB |
| 272 | if (!strncmp(p, "soft",4)) | 291 | if (!strncmp(p, "soft",4)) |
| 273 | swiotlb = 1; | 292 | swiotlb = 1; |
| 274 | #endif | 293 | #endif |
| 275 | 294 | ||
| 276 | #ifdef CONFIG_IOMMU | 295 | #ifdef CONFIG_IOMMU |
| 277 | gart_parse_options(p); | 296 | gart_parse_options(p); |
| 278 | #endif | 297 | #endif |
| 279 | 298 | ||
| 280 | p += strcspn(p, ","); | 299 | p += strcspn(p, ","); |
| 281 | if (*p == ',') | 300 | if (*p == ',') |
| 282 | ++p; | 301 | ++p; |
| 283 | } | 302 | } |
| 284 | return 0; | 303 | return 0; |
| 285 | } | 304 | } |
| 286 | early_param("iommu", iommu_setup); | 305 | early_param("iommu", iommu_setup); |
| 287 | 306 | ||
diff --git a/arch/x86_64/kernel/setup.c b/arch/x86_64/kernel/setup.c index 0b00bb2ea576..fc944b5e8f4a 100644 --- a/arch/x86_64/kernel/setup.c +++ b/arch/x86_64/kernel/setup.c | |||
| @@ -123,9 +123,6 @@ struct resource standard_io_resources[] = { | |||
| 123 | .flags = IORESOURCE_BUSY | IORESOURCE_IO } | 123 | .flags = IORESOURCE_BUSY | IORESOURCE_IO } |
| 124 | }; | 124 | }; |
| 125 | 125 | ||
| 126 | #define STANDARD_IO_RESOURCES \ | ||
| 127 | (sizeof standard_io_resources / sizeof standard_io_resources[0]) | ||
| 128 | |||
| 129 | #define IORESOURCE_RAM (IORESOURCE_BUSY | IORESOURCE_MEM) | 126 | #define IORESOURCE_RAM (IORESOURCE_BUSY | IORESOURCE_MEM) |
| 130 | 127 | ||
| 131 | struct resource data_resource = { | 128 | struct resource data_resource = { |
| @@ -172,9 +169,6 @@ static struct resource adapter_rom_resources[] = { | |||
| 172 | .flags = IORESOURCE_ROM } | 169 | .flags = IORESOURCE_ROM } |
| 173 | }; | 170 | }; |
| 174 | 171 | ||
| 175 | #define ADAPTER_ROM_RESOURCES \ | ||
| 176 | (sizeof adapter_rom_resources / sizeof adapter_rom_resources[0]) | ||
| 177 | |||
| 178 | static struct resource video_rom_resource = { | 172 | static struct resource video_rom_resource = { |
| 179 | .name = "Video ROM", | 173 | .name = "Video ROM", |
| 180 | .start = 0xc0000, | 174 | .start = 0xc0000, |
| @@ -245,7 +239,8 @@ static void __init probe_roms(void) | |||
| 245 | } | 239 | } |
| 246 | 240 | ||
| 247 | /* check for adapter roms on 2k boundaries */ | 241 | /* check for adapter roms on 2k boundaries */ |
| 248 | for (i = 0; i < ADAPTER_ROM_RESOURCES && start < upper; start += 2048) { | 242 | for (i = 0; i < ARRAY_SIZE(adapter_rom_resources) && start < upper; |
| 243 | start += 2048) { | ||
| 249 | rom = isa_bus_to_virt(start); | 244 | rom = isa_bus_to_virt(start); |
| 250 | if (!romsignature(rom)) | 245 | if (!romsignature(rom)) |
| 251 | continue; | 246 | continue; |
| @@ -537,7 +532,7 @@ void __init setup_arch(char **cmdline_p) | |||
| 537 | { | 532 | { |
| 538 | unsigned i; | 533 | unsigned i; |
| 539 | /* request I/O space for devices used on all i[345]86 PCs */ | 534 | /* request I/O space for devices used on all i[345]86 PCs */ |
| 540 | for (i = 0; i < STANDARD_IO_RESOURCES; i++) | 535 | for (i = 0; i < ARRAY_SIZE(standard_io_resources); i++) |
| 541 | request_resource(&ioport_resource, &standard_io_resources[i]); | 536 | request_resource(&ioport_resource, &standard_io_resources[i]); |
| 542 | } | 537 | } |
| 543 | 538 | ||
diff --git a/arch/x86_64/kernel/vmlinux.lds.S b/arch/x86_64/kernel/vmlinux.lds.S index d0564f1bcb0b..f8aeccf105fa 100644 --- a/arch/x86_64/kernel/vmlinux.lds.S +++ b/arch/x86_64/kernel/vmlinux.lds.S | |||
| @@ -67,13 +67,6 @@ SECTIONS | |||
| 67 | 67 | ||
| 68 | _edata = .; /* End of data section */ | 68 | _edata = .; /* End of data section */ |
| 69 | 69 | ||
| 70 | __bss_start = .; /* BSS */ | ||
| 71 | .bss : AT(ADDR(.bss) - LOAD_OFFSET) { | ||
| 72 | *(.bss.page_aligned) | ||
| 73 | *(.bss) | ||
| 74 | } | ||
| 75 | __bss_stop = .; | ||
| 76 | |||
| 77 | . = ALIGN(PAGE_SIZE); | 70 | . = ALIGN(PAGE_SIZE); |
| 78 | . = ALIGN(CONFIG_X86_L1_CACHE_BYTES); | 71 | . = ALIGN(CONFIG_X86_L1_CACHE_BYTES); |
| 79 | .data.cacheline_aligned : AT(ADDR(.data.cacheline_aligned) - LOAD_OFFSET) { | 72 | .data.cacheline_aligned : AT(ADDR(.data.cacheline_aligned) - LOAD_OFFSET) { |
| @@ -229,6 +222,13 @@ SECTIONS | |||
| 229 | . = ALIGN(4096); | 222 | . = ALIGN(4096); |
| 230 | __nosave_end = .; | 223 | __nosave_end = .; |
| 231 | 224 | ||
| 225 | __bss_start = .; /* BSS */ | ||
| 226 | .bss : AT(ADDR(.bss) - LOAD_OFFSET) { | ||
| 227 | *(.bss.page_aligned) | ||
| 228 | *(.bss) | ||
| 229 | } | ||
| 230 | __bss_stop = .; | ||
| 231 | |||
| 232 | _end = . ; | 232 | _end = . ; |
| 233 | 233 | ||
| 234 | /* Sections to be discarded */ | 234 | /* Sections to be discarded */ |
diff --git a/arch/x86_64/kernel/vsyscall.c b/arch/x86_64/kernel/vsyscall.c index ac48c3857ddb..07c086382059 100644 --- a/arch/x86_64/kernel/vsyscall.c +++ b/arch/x86_64/kernel/vsyscall.c | |||
| @@ -155,8 +155,8 @@ vgetcpu(unsigned *cpu, unsigned *node, struct getcpu_cache *tcache) | |||
| 155 | We do this here because otherwise user space would do it on | 155 | We do this here because otherwise user space would do it on |
| 156 | its own in a likely inferior way (no access to jiffies). | 156 | its own in a likely inferior way (no access to jiffies). |
| 157 | If you don't like it pass NULL. */ | 157 | If you don't like it pass NULL. */ |
| 158 | if (tcache && tcache->t0 == (j = __jiffies)) { | 158 | if (tcache && tcache->blob[0] == (j = __jiffies)) { |
| 159 | p = tcache->t1; | 159 | p = tcache->blob[1]; |
| 160 | } else if (__vgetcpu_mode == VGETCPU_RDTSCP) { | 160 | } else if (__vgetcpu_mode == VGETCPU_RDTSCP) { |
| 161 | /* Load per CPU data from RDTSCP */ | 161 | /* Load per CPU data from RDTSCP */ |
| 162 | rdtscp(dummy, dummy, p); | 162 | rdtscp(dummy, dummy, p); |
| @@ -165,8 +165,8 @@ vgetcpu(unsigned *cpu, unsigned *node, struct getcpu_cache *tcache) | |||
| 165 | asm("lsl %1,%0" : "=r" (p) : "r" (__PER_CPU_SEG)); | 165 | asm("lsl %1,%0" : "=r" (p) : "r" (__PER_CPU_SEG)); |
| 166 | } | 166 | } |
| 167 | if (tcache) { | 167 | if (tcache) { |
| 168 | tcache->t0 = j; | 168 | tcache->blob[0] = j; |
| 169 | tcache->t1 = p; | 169 | tcache->blob[1] = p; |
| 170 | } | 170 | } |
| 171 | if (cpu) | 171 | if (cpu) |
| 172 | *cpu = p & 0xfff; | 172 | *cpu = p & 0xfff; |
diff --git a/include/asm-i386/nmi.h b/include/asm-i386/nmi.h index 303bcd4592bb..269d315719ca 100644 --- a/include/asm-i386/nmi.h +++ b/include/asm-i386/nmi.h | |||
| @@ -36,4 +36,10 @@ extern unsigned int nmi_watchdog; | |||
| 36 | #define NMI_LOCAL_APIC 2 | 36 | #define NMI_LOCAL_APIC 2 |
| 37 | #define NMI_INVALID 3 | 37 | #define NMI_INVALID 3 |
| 38 | 38 | ||
| 39 | struct ctl_table; | ||
| 40 | struct file; | ||
| 41 | extern int proc_nmi_enabled(struct ctl_table *, int , struct file *, | ||
| 42 | void __user *, size_t *, loff_t *); | ||
| 43 | extern int unknown_nmi_panic; | ||
| 44 | |||
| 39 | #endif /* ASM_NMI_H */ | 45 | #endif /* ASM_NMI_H */ |
diff --git a/include/asm-x86_64/nmi.h b/include/asm-x86_64/nmi.h index cbf2669bca71..f367d4014b42 100644 --- a/include/asm-x86_64/nmi.h +++ b/include/asm-x86_64/nmi.h | |||
| @@ -70,4 +70,11 @@ extern unsigned int nmi_watchdog; | |||
| 70 | #define NMI_LOCAL_APIC 2 | 70 | #define NMI_LOCAL_APIC 2 |
| 71 | #define NMI_INVALID 3 | 71 | #define NMI_INVALID 3 |
| 72 | 72 | ||
| 73 | struct ctl_table; | ||
| 74 | struct file; | ||
| 75 | extern int proc_nmi_enabled(struct ctl_table *, int , struct file *, | ||
| 76 | void __user *, size_t *, loff_t *); | ||
| 77 | |||
| 78 | extern int unknown_nmi_panic; | ||
| 79 | |||
| 73 | #endif /* ASM_NMI_H */ | 80 | #endif /* ASM_NMI_H */ |
diff --git a/include/asm-x86_64/semaphore.h b/include/asm-x86_64/semaphore.h index 107bd90429e8..1194888536b9 100644 --- a/include/asm-x86_64/semaphore.h +++ b/include/asm-x86_64/semaphore.h | |||
| @@ -132,7 +132,7 @@ static inline int down_interruptible(struct semaphore * sem) | |||
| 132 | "jns 2f\n\t" | 132 | "jns 2f\n\t" |
| 133 | "call __down_failed_interruptible\n" | 133 | "call __down_failed_interruptible\n" |
| 134 | "2:\n" | 134 | "2:\n" |
| 135 | :"=a" (result), "=m" (sem->count) | 135 | :"=&a" (result), "=m" (sem->count) |
| 136 | :"D" (sem) | 136 | :"D" (sem) |
| 137 | :"memory"); | 137 | :"memory"); |
| 138 | return result; | 138 | return result; |
| @@ -153,7 +153,7 @@ static inline int down_trylock(struct semaphore * sem) | |||
| 153 | "jns 2f\n\t" | 153 | "jns 2f\n\t" |
| 154 | "call __down_failed_trylock\n\t" | 154 | "call __down_failed_trylock\n\t" |
| 155 | "2:\n" | 155 | "2:\n" |
| 156 | :"=a" (result), "=m" (sem->count) | 156 | :"=&a" (result), "=m" (sem->count) |
| 157 | :"D" (sem) | 157 | :"D" (sem) |
| 158 | :"memory","cc"); | 158 | :"memory","cc"); |
| 159 | return result; | 159 | return result; |
diff --git a/include/asm-x86_64/uaccess.h b/include/asm-x86_64/uaccess.h index e856570c0689..19f99178fe83 100644 --- a/include/asm-x86_64/uaccess.h +++ b/include/asm-x86_64/uaccess.h | |||
| @@ -361,6 +361,11 @@ __must_check unsigned long clear_user(void __user *mem, unsigned long len); | |||
| 361 | __must_check unsigned long __clear_user(void __user *mem, unsigned long len); | 361 | __must_check unsigned long __clear_user(void __user *mem, unsigned long len); |
| 362 | 362 | ||
| 363 | __must_check long __copy_from_user_inatomic(void *dst, const void __user *src, unsigned size); | 363 | __must_check long __copy_from_user_inatomic(void *dst, const void __user *src, unsigned size); |
| 364 | #define __copy_to_user_inatomic copy_user_generic | 364 | |
| 365 | static __must_check __always_inline int | ||
| 366 | __copy_to_user_inatomic(void __user *dst, const void *src, unsigned size) | ||
| 367 | { | ||
| 368 | return copy_user_generic((__force void *)dst, src, size); | ||
| 369 | } | ||
| 365 | 370 | ||
| 366 | #endif /* __X86_64_UACCESS_H */ | 371 | #endif /* __X86_64_UACCESS_H */ |
diff --git a/include/linux/getcpu.h b/include/linux/getcpu.h index 031ed3780e45..c7372d7a97be 100644 --- a/include/linux/getcpu.h +++ b/include/linux/getcpu.h | |||
| @@ -1,16 +1,18 @@ | |||
| 1 | #ifndef _LINUX_GETCPU_H | 1 | #ifndef _LINUX_GETCPU_H |
| 2 | #define _LINUX_GETCPU_H 1 | 2 | #define _LINUX_GETCPU_H 1 |
| 3 | 3 | ||
| 4 | /* Cache for getcpu() to speed it up. Results might be upto a jiffie | 4 | /* Cache for getcpu() to speed it up. Results might be a short time |
| 5 | out of date, but will be faster. | 5 | out of date, but will be faster. |
| 6 | |||
| 6 | User programs should not refer to the contents of this structure. | 7 | User programs should not refer to the contents of this structure. |
| 7 | It is only a cache for vgetcpu(). It might change in future kernels. | 8 | I repeat they should not refer to it. If they do they will break |
| 9 | in future kernels. | ||
| 10 | |||
| 11 | It is only a private cache for vgetcpu(). It will change in future kernels. | ||
| 8 | The user program must store this information per thread (__thread) | 12 | The user program must store this information per thread (__thread) |
| 9 | If you want 100% accurate information pass NULL instead. */ | 13 | If you want 100% accurate information pass NULL instead. */ |
| 10 | struct getcpu_cache { | 14 | struct getcpu_cache { |
| 11 | unsigned long t0; | 15 | unsigned long blob[128 / sizeof(long)]; |
| 12 | unsigned long t1; | ||
| 13 | unsigned long res[4]; | ||
| 14 | }; | 16 | }; |
| 15 | 17 | ||
| 16 | #endif | 18 | #endif |
diff --git a/kernel/panic.c b/kernel/panic.c index 6ceb664fb52a..525e365f7239 100644 --- a/kernel/panic.c +++ b/kernel/panic.c | |||
| @@ -21,7 +21,6 @@ | |||
| 21 | #include <linux/debug_locks.h> | 21 | #include <linux/debug_locks.h> |
| 22 | 22 | ||
| 23 | int panic_on_oops; | 23 | int panic_on_oops; |
| 24 | int panic_on_unrecovered_nmi; | ||
| 25 | int tainted; | 24 | int tainted; |
| 26 | static int pause_on_oops; | 25 | static int pause_on_oops; |
| 27 | static int pause_on_oops_flag; | 26 | static int pause_on_oops_flag; |
diff --git a/kernel/sys.c b/kernel/sys.c index 8647061c084a..b88806c66244 100644 --- a/kernel/sys.c +++ b/kernel/sys.c | |||
| @@ -2083,12 +2083,12 @@ asmlinkage long sys_getcpu(unsigned __user *cpup, unsigned __user *nodep, | |||
| 2083 | * padding | 2083 | * padding |
| 2084 | */ | 2084 | */ |
| 2085 | unsigned long t0, t1; | 2085 | unsigned long t0, t1; |
| 2086 | get_user(t0, &cache->t0); | 2086 | get_user(t0, &cache->blob[0]); |
| 2087 | get_user(t1, &cache->t1); | 2087 | get_user(t1, &cache->blob[1]); |
| 2088 | t0++; | 2088 | t0++; |
| 2089 | t1++; | 2089 | t1++; |
| 2090 | put_user(t0, &cache->t0); | 2090 | put_user(t0, &cache->blob[0]); |
| 2091 | put_user(t1, &cache->t1); | 2091 | put_user(t1, &cache->blob[1]); |
| 2092 | } | 2092 | } |
| 2093 | return err ? -EFAULT : 0; | 2093 | return err ? -EFAULT : 0; |
| 2094 | } | 2094 | } |
diff --git a/kernel/sysctl.c b/kernel/sysctl.c index 9535a3839930..c57c4532e296 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c | |||
| @@ -52,6 +52,10 @@ | |||
| 52 | extern int proc_nr_files(ctl_table *table, int write, struct file *filp, | 52 | extern int proc_nr_files(ctl_table *table, int write, struct file *filp, |
| 53 | void __user *buffer, size_t *lenp, loff_t *ppos); | 53 | void __user *buffer, size_t *lenp, loff_t *ppos); |
| 54 | 54 | ||
| 55 | #ifdef CONFIG_X86 | ||
| 56 | #include <asm/nmi.h> | ||
| 57 | #endif | ||
| 58 | |||
| 55 | #if defined(CONFIG_SYSCTL) | 59 | #if defined(CONFIG_SYSCTL) |
| 56 | 60 | ||
| 57 | /* External variables not in a header file. */ | 61 | /* External variables not in a header file. */ |
| @@ -74,13 +78,6 @@ extern int sysctl_drop_caches; | |||
| 74 | extern int percpu_pagelist_fraction; | 78 | extern int percpu_pagelist_fraction; |
| 75 | extern int compat_log; | 79 | extern int compat_log; |
| 76 | 80 | ||
| 77 | #if defined(CONFIG_X86_LOCAL_APIC) && defined(CONFIG_X86) | ||
| 78 | int unknown_nmi_panic; | ||
| 79 | int nmi_watchdog_enabled; | ||
| 80 | extern int proc_nmi_enabled(struct ctl_table *, int , struct file *, | ||
| 81 | void __user *, size_t *, loff_t *); | ||
| 82 | #endif | ||
| 83 | |||
| 84 | /* this is needed for the proc_dointvec_minmax for [fs_]overflow UID and GID */ | 81 | /* this is needed for the proc_dointvec_minmax for [fs_]overflow UID and GID */ |
| 85 | static int maxolduid = 65535; | 82 | static int maxolduid = 65535; |
| 86 | static int minolduid; | 83 | static int minolduid; |
