diff options
188 files changed, 1394 insertions, 918 deletions
diff --git a/Documentation/feature-removal-schedule.txt b/Documentation/feature-removal-schedule.txt index c3b1430cf603..0bc8b0b2e103 100644 --- a/Documentation/feature-removal-schedule.txt +++ b/Documentation/feature-removal-schedule.txt | |||
| @@ -316,3 +316,11 @@ Why: The option/code is | |||
| 316 | Who: Johannes Berg <johannes@sipsolutions.net> | 316 | Who: Johannes Berg <johannes@sipsolutions.net> |
| 317 | 317 | ||
| 318 | --------------------------- | 318 | --------------------------- |
| 319 | |||
| 320 | What: i8xx_tco watchdog driver | ||
| 321 | When: in 2.6.22 | ||
| 322 | Why: the i8xx_tco watchdog driver has been replaced by the iTCO_wdt | ||
| 323 | watchdog driver. | ||
| 324 | Who: Wim Van Sebroeck <wim@iguana.be> | ||
| 325 | |||
| 326 | --------------------------- | ||
diff --git a/Documentation/gpio.txt b/Documentation/gpio.txt index 576ce463cf44..989f1130f4f3 100644 --- a/Documentation/gpio.txt +++ b/Documentation/gpio.txt | |||
| @@ -105,12 +105,15 @@ setting up a platform_device using the GPIO, is mark its direction: | |||
| 105 | 105 | ||
| 106 | /* set as input or output, returning 0 or negative errno */ | 106 | /* set as input or output, returning 0 or negative errno */ |
| 107 | int gpio_direction_input(unsigned gpio); | 107 | int gpio_direction_input(unsigned gpio); |
| 108 | int gpio_direction_output(unsigned gpio); | 108 | int gpio_direction_output(unsigned gpio, int value); |
| 109 | 109 | ||
| 110 | The return value is zero for success, else a negative errno. It should | 110 | The return value is zero for success, else a negative errno. It should |
| 111 | be checked, since the get/set calls don't have error returns and since | 111 | be checked, since the get/set calls don't have error returns and since |
| 112 | misconfiguration is possible. (These calls could sleep.) | 112 | misconfiguration is possible. (These calls could sleep.) |
| 113 | 113 | ||
| 114 | For output GPIOs, the value provided becomes the initial output value. | ||
| 115 | This helps avoid signal glitching during system startup. | ||
| 116 | |||
| 114 | Setting the direction can fail if the GPIO number is invalid, or when | 117 | Setting the direction can fail if the GPIO number is invalid, or when |
| 115 | that particular GPIO can't be used in that mode. It's generally a bad | 118 | that particular GPIO can't be used in that mode. It's generally a bad |
| 116 | idea to rely on boot firmware to have set the direction correctly, since | 119 | idea to rely on boot firmware to have set the direction correctly, since |
diff --git a/MAINTAINERS b/MAINTAINERS index 17555bba20af..6d8d5b917d1f 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -3103,6 +3103,9 @@ TPM DEVICE DRIVER | |||
| 3103 | P: Kylene Hall | 3103 | P: Kylene Hall |
| 3104 | M: kjhall@us.ibm.com | 3104 | M: kjhall@us.ibm.com |
| 3105 | W: http://tpmdd.sourceforge.net | 3105 | W: http://tpmdd.sourceforge.net |
| 3106 | P: Marcel Selhorst | ||
| 3107 | M: tpm@selhorst.net | ||
| 3108 | W: http://www.prosec.rub.de/tpm/ | ||
| 3106 | L: tpmdd-devel@lists.sourceforge.net | 3109 | L: tpmdd-devel@lists.sourceforge.net |
| 3107 | S: Maintained | 3110 | S: Maintained |
| 3108 | 3111 | ||
| @@ -1,8 +1,8 @@ | |||
| 1 | VERSION = 2 | 1 | VERSION = 2 |
| 2 | PATCHLEVEL = 6 | 2 | PATCHLEVEL = 6 |
| 3 | SUBLEVEL = 21 | 3 | SUBLEVEL = 21 |
| 4 | EXTRAVERSION = -rc3 | 4 | EXTRAVERSION = -rc4 |
| 5 | NAME = Homicidal Dwarf Hamster | 5 | NAME = Nocturnal Monster Puppy |
| 6 | 6 | ||
| 7 | # *DOCUMENTATION* | 7 | # *DOCUMENTATION* |
| 8 | # To see a list of typical targets execute "make help" | 8 | # To see a list of typical targets execute "make help" |
diff --git a/arch/arm/mach-at91/gpio.c b/arch/arm/mach-at91/gpio.c index 44211a0af19a..ba4a1bb3ee40 100644 --- a/arch/arm/mach-at91/gpio.c +++ b/arch/arm/mach-at91/gpio.c | |||
| @@ -215,13 +215,14 @@ int gpio_direction_input(unsigned pin) | |||
| 215 | } | 215 | } |
| 216 | EXPORT_SYMBOL(gpio_direction_input); | 216 | EXPORT_SYMBOL(gpio_direction_input); |
| 217 | 217 | ||
| 218 | int gpio_direction_output(unsigned pin) | 218 | int gpio_direction_output(unsigned pin, int value) |
| 219 | { | 219 | { |
| 220 | void __iomem *pio = pin_to_controller(pin); | 220 | void __iomem *pio = pin_to_controller(pin); |
| 221 | unsigned mask = pin_to_mask(pin); | 221 | unsigned mask = pin_to_mask(pin); |
| 222 | 222 | ||
| 223 | if (!pio || !(__raw_readl(pio + PIO_PSR) & mask)) | 223 | if (!pio || !(__raw_readl(pio + PIO_PSR) & mask)) |
| 224 | return -EINVAL; | 224 | return -EINVAL; |
| 225 | __raw_writel(mask, pio + (value ? PIO_SODR : PIO_CODR)); | ||
| 225 | __raw_writel(mask, pio + PIO_OER); | 226 | __raw_writel(mask, pio + PIO_OER); |
| 226 | return 0; | 227 | return 0; |
| 227 | } | 228 | } |
diff --git a/arch/arm/mach-sa1100/generic.c b/arch/arm/mach-sa1100/generic.c index 192a5a26cf2b..edc349e5fcf7 100644 --- a/arch/arm/mach-sa1100/generic.c +++ b/arch/arm/mach-sa1100/generic.c | |||
| @@ -153,7 +153,7 @@ int gpio_direction_input(unsigned gpio) | |||
| 153 | 153 | ||
| 154 | EXPORT_SYMBOL(gpio_direction_input); | 154 | EXPORT_SYMBOL(gpio_direction_input); |
| 155 | 155 | ||
| 156 | int gpio_direction_output(unsigned gpio) | 156 | int gpio_direction_output(unsigned gpio, int value) |
| 157 | { | 157 | { |
| 158 | unsigned long flags; | 158 | unsigned long flags; |
| 159 | 159 | ||
| @@ -161,6 +161,7 @@ int gpio_direction_output(unsigned gpio) | |||
| 161 | return -EINVAL; | 161 | return -EINVAL; |
| 162 | 162 | ||
| 163 | local_irq_save(flags); | 163 | local_irq_save(flags); |
| 164 | gpio_set_value(gpio, value); | ||
| 164 | GPDR |= GPIO_GPIO(gpio); | 165 | GPDR |= GPIO_GPIO(gpio); |
| 165 | local_irq_restore(flags); | 166 | local_irq_restore(flags); |
| 166 | return 0; | 167 | return 0; |
diff --git a/arch/avr32/mach-at32ap/pio.c b/arch/avr32/mach-at32ap/pio.c index 9ba5654cde11..1eb99b814f5b 100644 --- a/arch/avr32/mach-at32ap/pio.c +++ b/arch/avr32/mach-at32ap/pio.c | |||
| @@ -214,7 +214,7 @@ int gpio_direction_input(unsigned int gpio) | |||
| 214 | } | 214 | } |
| 215 | EXPORT_SYMBOL(gpio_direction_input); | 215 | EXPORT_SYMBOL(gpio_direction_input); |
| 216 | 216 | ||
| 217 | int gpio_direction_output(unsigned int gpio) | 217 | int gpio_direction_output(unsigned int gpio, int value) |
| 218 | { | 218 | { |
| 219 | struct pio_device *pio; | 219 | struct pio_device *pio; |
| 220 | unsigned int pin; | 220 | unsigned int pin; |
| @@ -223,6 +223,8 @@ int gpio_direction_output(unsigned int gpio) | |||
| 223 | if (!pio) | 223 | if (!pio) |
| 224 | return -ENODEV; | 224 | return -ENODEV; |
| 225 | 225 | ||
| 226 | gpio_set_value(gpio, value); | ||
| 227 | |||
| 226 | pin = gpio & 0x1f; | 228 | pin = gpio & 0x1f; |
| 227 | pio_writel(pio, OER, 1 << pin); | 229 | pio_writel(pio, OER, 1 << pin); |
| 228 | 230 | ||
diff --git a/arch/i386/defconfig b/arch/i386/defconfig index 5ae1e0bc8fd7..f4efd66e1ee5 100644 --- a/arch/i386/defconfig +++ b/arch/i386/defconfig | |||
| @@ -1,10 +1,13 @@ | |||
| 1 | # | 1 | # |
| 2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
| 3 | # Linux kernel version: 2.6.20-git8 | 3 | # Linux kernel version: 2.6.21-rc3 |
| 4 | # Tue Feb 13 11:25:18 2007 | 4 | # Wed Mar 7 15:29:47 2007 |
| 5 | # | 5 | # |
| 6 | CONFIG_X86_32=y | 6 | CONFIG_X86_32=y |
| 7 | CONFIG_GENERIC_TIME=y | 7 | CONFIG_GENERIC_TIME=y |
| 8 | CONFIG_CLOCKSOURCE_WATCHDOG=y | ||
| 9 | CONFIG_GENERIC_CLOCKEVENTS=y | ||
| 10 | CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y | ||
| 8 | CONFIG_LOCKDEP_SUPPORT=y | 11 | CONFIG_LOCKDEP_SUPPORT=y |
| 9 | CONFIG_STACKTRACE_SUPPORT=y | 12 | CONFIG_STACKTRACE_SUPPORT=y |
| 10 | CONFIG_SEMAPHORE_SLEEPERS=y | 13 | CONFIG_SEMAPHORE_SLEEPERS=y |
| @@ -34,6 +37,7 @@ CONFIG_LOCALVERSION_AUTO=y | |||
| 34 | CONFIG_SWAP=y | 37 | CONFIG_SWAP=y |
| 35 | CONFIG_SYSVIPC=y | 38 | CONFIG_SYSVIPC=y |
| 36 | # CONFIG_IPC_NS is not set | 39 | # CONFIG_IPC_NS is not set |
| 40 | CONFIG_SYSVIPC_SYSCTL=y | ||
| 37 | CONFIG_POSIX_MQUEUE=y | 41 | CONFIG_POSIX_MQUEUE=y |
| 38 | # CONFIG_BSD_PROCESS_ACCT is not set | 42 | # CONFIG_BSD_PROCESS_ACCT is not set |
| 39 | # CONFIG_TASKSTATS is not set | 43 | # CONFIG_TASKSTATS is not set |
| @@ -44,6 +48,7 @@ CONFIG_IKCONFIG_PROC=y | |||
| 44 | # CONFIG_CPUSETS is not set | 48 | # CONFIG_CPUSETS is not set |
| 45 | CONFIG_SYSFS_DEPRECATED=y | 49 | CONFIG_SYSFS_DEPRECATED=y |
| 46 | # CONFIG_RELAY is not set | 50 | # CONFIG_RELAY is not set |
| 51 | CONFIG_BLK_DEV_INITRD=y | ||
| 47 | CONFIG_INITRAMFS_SOURCE="" | 52 | CONFIG_INITRAMFS_SOURCE="" |
| 48 | CONFIG_CC_OPTIMIZE_FOR_SIZE=y | 53 | CONFIG_CC_OPTIMIZE_FOR_SIZE=y |
| 49 | CONFIG_SYSCTL=y | 54 | CONFIG_SYSCTL=y |
| @@ -103,6 +108,9 @@ CONFIG_DEFAULT_IOSCHED="anticipatory" | |||
| 103 | # | 108 | # |
| 104 | # Processor type and features | 109 | # Processor type and features |
| 105 | # | 110 | # |
| 111 | # CONFIG_TICK_ONESHOT is not set | ||
| 112 | # CONFIG_NO_HZ is not set | ||
| 113 | # CONFIG_HIGH_RES_TIMERS is not set | ||
| 106 | CONFIG_SMP=y | 114 | CONFIG_SMP=y |
| 107 | # CONFIG_X86_PC is not set | 115 | # CONFIG_X86_PC is not set |
| 108 | # CONFIG_X86_ELAN is not set | 116 | # CONFIG_X86_ELAN is not set |
| @@ -235,10 +243,8 @@ CONFIG_ACPI_PROCFS=y | |||
| 235 | CONFIG_ACPI_AC=y | 243 | CONFIG_ACPI_AC=y |
| 236 | CONFIG_ACPI_BATTERY=y | 244 | CONFIG_ACPI_BATTERY=y |
| 237 | CONFIG_ACPI_BUTTON=y | 245 | CONFIG_ACPI_BUTTON=y |
| 238 | # CONFIG_ACPI_HOTKEY is not set | ||
| 239 | CONFIG_ACPI_FAN=y | 246 | CONFIG_ACPI_FAN=y |
| 240 | # CONFIG_ACPI_DOCK is not set | 247 | # CONFIG_ACPI_DOCK is not set |
| 241 | # CONFIG_ACPI_BAY is not set | ||
| 242 | CONFIG_ACPI_PROCESSOR=y | 248 | CONFIG_ACPI_PROCESSOR=y |
| 243 | CONFIG_ACPI_THERMAL=y | 249 | CONFIG_ACPI_THERMAL=y |
| 244 | # CONFIG_ACPI_ASUS is not set | 250 | # CONFIG_ACPI_ASUS is not set |
| @@ -289,6 +295,7 @@ CONFIG_X86_POWERNOW_K8_ACPI=y | |||
| 289 | # CONFIG_X86_CPUFREQ_NFORCE2 is not set | 295 | # CONFIG_X86_CPUFREQ_NFORCE2 is not set |
| 290 | # CONFIG_X86_LONGRUN is not set | 296 | # CONFIG_X86_LONGRUN is not set |
| 291 | # CONFIG_X86_LONGHAUL is not set | 297 | # CONFIG_X86_LONGHAUL is not set |
| 298 | # CONFIG_X86_E_POWERSAVER is not set | ||
| 292 | 299 | ||
| 293 | # | 300 | # |
| 294 | # shared options | 301 | # shared options |
| @@ -368,7 +375,7 @@ CONFIG_IP_PNP_DHCP=y | |||
| 368 | # CONFIG_INET_ESP is not set | 375 | # CONFIG_INET_ESP is not set |
| 369 | # CONFIG_INET_IPCOMP is not set | 376 | # CONFIG_INET_IPCOMP is not set |
| 370 | # CONFIG_INET_XFRM_TUNNEL is not set | 377 | # CONFIG_INET_XFRM_TUNNEL is not set |
| 371 | # CONFIG_INET_TUNNEL is not set | 378 | CONFIG_INET_TUNNEL=y |
| 372 | CONFIG_INET_XFRM_MODE_TRANSPORT=y | 379 | CONFIG_INET_XFRM_MODE_TRANSPORT=y |
| 373 | CONFIG_INET_XFRM_MODE_TUNNEL=y | 380 | CONFIG_INET_XFRM_MODE_TUNNEL=y |
| 374 | # CONFIG_INET_XFRM_MODE_BEET is not set | 381 | # CONFIG_INET_XFRM_MODE_BEET is not set |
| @@ -470,7 +477,13 @@ CONFIG_FW_LOADER=y | |||
| 470 | # | 477 | # |
| 471 | # Plug and Play support | 478 | # Plug and Play support |
| 472 | # | 479 | # |
| 473 | # CONFIG_PNP is not set | 480 | CONFIG_PNP=y |
| 481 | # CONFIG_PNP_DEBUG is not set | ||
| 482 | |||
| 483 | # | ||
| 484 | # Protocols | ||
| 485 | # | ||
| 486 | CONFIG_PNPACPI=y | ||
| 474 | 487 | ||
| 475 | # | 488 | # |
| 476 | # Block devices | 489 | # Block devices |
| @@ -490,7 +503,6 @@ CONFIG_BLK_DEV_RAM=y | |||
| 490 | CONFIG_BLK_DEV_RAM_COUNT=16 | 503 | CONFIG_BLK_DEV_RAM_COUNT=16 |
| 491 | CONFIG_BLK_DEV_RAM_SIZE=4096 | 504 | CONFIG_BLK_DEV_RAM_SIZE=4096 |
| 492 | CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024 | 505 | CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024 |
| 493 | CONFIG_BLK_DEV_INITRD=y | ||
| 494 | # CONFIG_CDROM_PKTCDVD is not set | 506 | # CONFIG_CDROM_PKTCDVD is not set |
| 495 | # CONFIG_ATA_OVER_ETH is not set | 507 | # CONFIG_ATA_OVER_ETH is not set |
| 496 | 508 | ||
| @@ -500,6 +512,7 @@ CONFIG_BLK_DEV_INITRD=y | |||
| 500 | # CONFIG_IBM_ASM is not set | 512 | # CONFIG_IBM_ASM is not set |
| 501 | # CONFIG_SGI_IOC4 is not set | 513 | # CONFIG_SGI_IOC4 is not set |
| 502 | # CONFIG_TIFM_CORE is not set | 514 | # CONFIG_TIFM_CORE is not set |
| 515 | # CONFIG_SONY_LAPTOP is not set | ||
| 503 | 516 | ||
| 504 | # | 517 | # |
| 505 | # ATA/ATAPI/MFM/RLL support | 518 | # ATA/ATAPI/MFM/RLL support |
| @@ -526,6 +539,7 @@ CONFIG_BLK_DEV_IDEACPI=y | |||
| 526 | # | 539 | # |
| 527 | CONFIG_IDE_GENERIC=y | 540 | CONFIG_IDE_GENERIC=y |
| 528 | # CONFIG_BLK_DEV_CMD640 is not set | 541 | # CONFIG_BLK_DEV_CMD640 is not set |
| 542 | # CONFIG_BLK_DEV_IDEPNP is not set | ||
| 529 | CONFIG_BLK_DEV_IDEPCI=y | 543 | CONFIG_BLK_DEV_IDEPCI=y |
| 530 | # CONFIG_IDEPCI_SHARE_IRQ is not set | 544 | # CONFIG_IDEPCI_SHARE_IRQ is not set |
| 531 | # CONFIG_BLK_DEV_OFFBOARD is not set | 545 | # CONFIG_BLK_DEV_OFFBOARD is not set |
| @@ -679,6 +693,7 @@ CONFIG_SATA_VIA=y | |||
| 679 | # CONFIG_SATA_VITESSE is not set | 693 | # CONFIG_SATA_VITESSE is not set |
| 680 | # CONFIG_SATA_INIC162X is not set | 694 | # CONFIG_SATA_INIC162X is not set |
| 681 | CONFIG_SATA_INTEL_COMBINED=y | 695 | CONFIG_SATA_INTEL_COMBINED=y |
| 696 | CONFIG_SATA_ACPI=y | ||
| 682 | # CONFIG_PATA_ALI is not set | 697 | # CONFIG_PATA_ALI is not set |
| 683 | # CONFIG_PATA_AMD is not set | 698 | # CONFIG_PATA_AMD is not set |
| 684 | # CONFIG_PATA_ARTOP is not set | 699 | # CONFIG_PATA_ARTOP is not set |
| @@ -786,6 +801,7 @@ CONFIG_NETDEVICES=y | |||
| 786 | # CONFIG_BONDING is not set | 801 | # CONFIG_BONDING is not set |
| 787 | # CONFIG_EQUALIZER is not set | 802 | # CONFIG_EQUALIZER is not set |
| 788 | # CONFIG_TUN is not set | 803 | # CONFIG_TUN is not set |
| 804 | # CONFIG_NET_SB1000 is not set | ||
| 789 | 805 | ||
| 790 | # | 806 | # |
| 791 | # ARCnet devices | 807 | # ARCnet devices |
| @@ -979,6 +995,7 @@ CONFIG_HW_CONSOLE=y | |||
| 979 | CONFIG_SERIAL_8250=y | 995 | CONFIG_SERIAL_8250=y |
| 980 | CONFIG_SERIAL_8250_CONSOLE=y | 996 | CONFIG_SERIAL_8250_CONSOLE=y |
| 981 | CONFIG_SERIAL_8250_PCI=y | 997 | CONFIG_SERIAL_8250_PCI=y |
| 998 | CONFIG_SERIAL_8250_PNP=y | ||
| 982 | CONFIG_SERIAL_8250_NR_UARTS=4 | 999 | CONFIG_SERIAL_8250_NR_UARTS=4 |
| 983 | CONFIG_SERIAL_8250_RUNTIME_UARTS=4 | 1000 | CONFIG_SERIAL_8250_RUNTIME_UARTS=4 |
| 984 | # CONFIG_SERIAL_8250_EXTENDED is not set | 1001 | # CONFIG_SERIAL_8250_EXTENDED is not set |
| @@ -1065,6 +1082,11 @@ CONFIG_HANGCHECK_TIMER=y | |||
| 1065 | # CONFIG_HWMON_VID is not set | 1082 | # CONFIG_HWMON_VID is not set |
| 1066 | 1083 | ||
| 1067 | # | 1084 | # |
| 1085 | # Multifunction device drivers | ||
| 1086 | # | ||
| 1087 | # CONFIG_MFD_SM501 is not set | ||
| 1088 | |||
| 1089 | # | ||
| 1068 | # Multimedia devices | 1090 | # Multimedia devices |
| 1069 | # | 1091 | # |
| 1070 | # CONFIG_VIDEO_DEV is not set | 1092 | # CONFIG_VIDEO_DEV is not set |
| @@ -1078,7 +1100,7 @@ CONFIG_HANGCHECK_TIMER=y | |||
| 1078 | # | 1100 | # |
| 1079 | # Graphics support | 1101 | # Graphics support |
| 1080 | # | 1102 | # |
| 1081 | CONFIG_FIRMWARE_EDID=y | 1103 | # CONFIG_BACKLIGHT_LCD_SUPPORT is not set |
| 1082 | # CONFIG_FB is not set | 1104 | # CONFIG_FB is not set |
| 1083 | 1105 | ||
| 1084 | # | 1106 | # |
| @@ -1089,7 +1111,6 @@ CONFIG_VGACON_SOFT_SCROLLBACK=y | |||
| 1089 | CONFIG_VGACON_SOFT_SCROLLBACK_SIZE=128 | 1111 | CONFIG_VGACON_SOFT_SCROLLBACK_SIZE=128 |
| 1090 | CONFIG_VIDEO_SELECT=y | 1112 | CONFIG_VIDEO_SELECT=y |
| 1091 | CONFIG_DUMMY_CONSOLE=y | 1113 | CONFIG_DUMMY_CONSOLE=y |
| 1092 | # CONFIG_BACKLIGHT_LCD_SUPPORT is not set | ||
| 1093 | 1114 | ||
| 1094 | # | 1115 | # |
| 1095 | # Sound | 1116 | # Sound |
| @@ -1238,6 +1259,7 @@ CONFIG_USB_MON=y | |||
| 1238 | # CONFIG_USB_RIO500 is not set | 1259 | # CONFIG_USB_RIO500 is not set |
| 1239 | # CONFIG_USB_LEGOTOWER is not set | 1260 | # CONFIG_USB_LEGOTOWER is not set |
| 1240 | # CONFIG_USB_LCD is not set | 1261 | # CONFIG_USB_LCD is not set |
| 1262 | # CONFIG_USB_BERRY_CHARGE is not set | ||
| 1241 | # CONFIG_USB_LED is not set | 1263 | # CONFIG_USB_LED is not set |
| 1242 | # CONFIG_USB_CYPRESS_CY7C63 is not set | 1264 | # CONFIG_USB_CYPRESS_CY7C63 is not set |
| 1243 | # CONFIG_USB_CYTHERM is not set | 1265 | # CONFIG_USB_CYTHERM is not set |
| @@ -1248,6 +1270,7 @@ CONFIG_USB_MON=y | |||
| 1248 | # CONFIG_USB_SISUSBVGA is not set | 1270 | # CONFIG_USB_SISUSBVGA is not set |
| 1249 | # CONFIG_USB_LD is not set | 1271 | # CONFIG_USB_LD is not set |
| 1250 | # CONFIG_USB_TRANCEVIBRATOR is not set | 1272 | # CONFIG_USB_TRANCEVIBRATOR is not set |
| 1273 | # CONFIG_USB_IOWARRIOR is not set | ||
| 1251 | # CONFIG_USB_TEST is not set | 1274 | # CONFIG_USB_TEST is not set |
| 1252 | 1275 | ||
| 1253 | # | 1276 | # |
| @@ -1506,6 +1529,7 @@ CONFIG_DEBUG_KERNEL=y | |||
| 1506 | CONFIG_LOG_BUF_SHIFT=18 | 1529 | CONFIG_LOG_BUF_SHIFT=18 |
| 1507 | CONFIG_DETECT_SOFTLOCKUP=y | 1530 | CONFIG_DETECT_SOFTLOCKUP=y |
| 1508 | # CONFIG_SCHEDSTATS is not set | 1531 | # CONFIG_SCHEDSTATS is not set |
| 1532 | # CONFIG_TIMER_STATS is not set | ||
| 1509 | # CONFIG_DEBUG_SLAB is not set | 1533 | # CONFIG_DEBUG_SLAB is not set |
| 1510 | # CONFIG_DEBUG_RT_MUTEXES is not set | 1534 | # CONFIG_DEBUG_RT_MUTEXES is not set |
| 1511 | # CONFIG_RT_MUTEX_TESTER is not set | 1535 | # CONFIG_RT_MUTEX_TESTER is not set |
| @@ -1525,6 +1549,7 @@ CONFIG_DEBUG_BUGVERBOSE=y | |||
| 1525 | # CONFIG_FORCED_INLINING is not set | 1549 | # CONFIG_FORCED_INLINING is not set |
| 1526 | # CONFIG_RCU_TORTURE_TEST is not set | 1550 | # CONFIG_RCU_TORTURE_TEST is not set |
| 1527 | # CONFIG_LKDTM is not set | 1551 | # CONFIG_LKDTM is not set |
| 1552 | # CONFIG_FAULT_INJECTION is not set | ||
| 1528 | CONFIG_EARLY_PRINTK=y | 1553 | CONFIG_EARLY_PRINTK=y |
| 1529 | CONFIG_DEBUG_STACKOVERFLOW=y | 1554 | CONFIG_DEBUG_STACKOVERFLOW=y |
| 1530 | # CONFIG_DEBUG_STACK_USAGE is not set | 1555 | # CONFIG_DEBUG_STACK_USAGE is not set |
diff --git a/arch/i386/kernel/i386_ksyms.c b/arch/i386/kernel/i386_ksyms.c index e3d4b73bfdb0..4afe26e86260 100644 --- a/arch/i386/kernel/i386_ksyms.c +++ b/arch/i386/kernel/i386_ksyms.c | |||
| @@ -28,3 +28,5 @@ EXPORT_SYMBOL(__read_lock_failed); | |||
| 28 | #endif | 28 | #endif |
| 29 | 29 | ||
| 30 | EXPORT_SYMBOL(csum_partial); | 30 | EXPORT_SYMBOL(csum_partial); |
| 31 | |||
| 32 | EXPORT_SYMBOL(_proxy_pda); | ||
diff --git a/arch/i386/kernel/nmi.c b/arch/i386/kernel/nmi.c index 821df34d2b3a..14702427b104 100644 --- a/arch/i386/kernel/nmi.c +++ b/arch/i386/kernel/nmi.c | |||
| @@ -245,14 +245,6 @@ static int __init check_nmi_watchdog(void) | |||
| 245 | unsigned int *prev_nmi_count; | 245 | unsigned int *prev_nmi_count; |
| 246 | int cpu; | 246 | int cpu; |
| 247 | 247 | ||
| 248 | /* Enable NMI watchdog for newer systems. | ||
| 249 | Probably safe on most older systems too, but let's be careful. | ||
| 250 | IBM ThinkPads use INT10 inside SMM and that allows early NMI inside SMM | ||
| 251 | which hangs the system. Disable watchdog for all thinkpads */ | ||
| 252 | if (nmi_watchdog == NMI_DEFAULT && dmi_get_year(DMI_BIOS_DATE) >= 2004 && | ||
| 253 | !dmi_name_in_vendors("ThinkPad")) | ||
| 254 | nmi_watchdog = NMI_LOCAL_APIC; | ||
| 255 | |||
| 256 | if ((nmi_watchdog == NMI_NONE) || (nmi_watchdog == NMI_DEFAULT)) | 248 | if ((nmi_watchdog == NMI_NONE) || (nmi_watchdog == NMI_DEFAULT)) |
| 257 | return 0; | 249 | return 0; |
| 258 | 250 | ||
diff --git a/arch/i386/kernel/tsc.c b/arch/i386/kernel/tsc.c index 602660df455c..0e65f7ab63a2 100644 --- a/arch/i386/kernel/tsc.c +++ b/arch/i386/kernel/tsc.c | |||
| @@ -105,7 +105,7 @@ unsigned long long sched_clock(void) | |||
| 105 | /* | 105 | /* |
| 106 | * Fall back to jiffies if there's no TSC available: | 106 | * Fall back to jiffies if there's no TSC available: |
| 107 | */ | 107 | */ |
| 108 | if (unlikely(tsc_disable)) | 108 | if (tsc_unstable || unlikely(tsc_disable)) |
| 109 | /* No locking but a rare wrong value is not a big deal: */ | 109 | /* No locking but a rare wrong value is not a big deal: */ |
| 110 | return (jiffies_64 - INITIAL_JIFFIES) * (1000000000 / HZ); | 110 | return (jiffies_64 - INITIAL_JIFFIES) * (1000000000 / HZ); |
| 111 | 111 | ||
diff --git a/arch/i386/kernel/vmi.c b/arch/i386/kernel/vmi.c index fbf45fa08320..fb07a1aad225 100644 --- a/arch/i386/kernel/vmi.c +++ b/arch/i386/kernel/vmi.c | |||
| @@ -23,7 +23,6 @@ | |||
| 23 | */ | 23 | */ |
| 24 | 24 | ||
| 25 | #include <linux/module.h> | 25 | #include <linux/module.h> |
| 26 | #include <linux/license.h> | ||
| 27 | #include <linux/cpu.h> | 26 | #include <linux/cpu.h> |
| 28 | #include <linux/bootmem.h> | 27 | #include <linux/bootmem.h> |
| 29 | #include <linux/mm.h> | 28 | #include <linux/mm.h> |
| @@ -48,7 +47,6 @@ typedef u64 __attribute__((regparm(2))) (VROMLONGFUNC)(int); | |||
| 48 | (((VROMLONGFUNC *)(rom->func)) (arg)) | 47 | (((VROMLONGFUNC *)(rom->func)) (arg)) |
| 49 | 48 | ||
| 50 | static struct vrom_header *vmi_rom; | 49 | static struct vrom_header *vmi_rom; |
| 51 | static int license_gplok; | ||
| 52 | static int disable_pge; | 50 | static int disable_pge; |
| 53 | static int disable_pse; | 51 | static int disable_pse; |
| 54 | static int disable_sep; | 52 | static int disable_sep; |
| @@ -629,13 +627,14 @@ static inline int __init check_vmi_rom(struct vrom_header *rom) | |||
| 629 | rom->api_version_maj, rom->api_version_min, | 627 | rom->api_version_maj, rom->api_version_min, |
| 630 | pci->rom_version_maj, pci->rom_version_min); | 628 | pci->rom_version_maj, pci->rom_version_min); |
| 631 | 629 | ||
| 632 | license_gplok = license_is_gpl_compatible(license); | 630 | /* Don't allow BSD/MIT here for now because we don't want to end up |
| 633 | if (!license_gplok) { | 631 | with any binary only shim layers */ |
| 634 | printk(KERN_WARNING "VMI: ROM license '%s' taints kernel... " | 632 | if (strcmp(license, "GPL") && strcmp(license, "GPL v2")) { |
| 635 | "inlining disabled\n", | 633 | printk(KERN_WARNING "VMI: Non GPL license `%s' found for ROM. Not used.\n", |
| 636 | license); | 634 | license); |
| 637 | add_taint(TAINT_PROPRIETARY_MODULE); | 635 | return 0; |
| 638 | } | 636 | } |
| 637 | |||
| 639 | return 1; | 638 | return 1; |
| 640 | } | 639 | } |
| 641 | 640 | ||
diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index 2b9c65c3b5d1..5f29018a6533 100644 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig | |||
| @@ -250,7 +250,7 @@ config LASAT | |||
| 250 | select R5000_CPU_SCACHE | 250 | select R5000_CPU_SCACHE |
| 251 | select SYS_HAS_CPU_R5000 | 251 | select SYS_HAS_CPU_R5000 |
| 252 | select SYS_SUPPORTS_32BIT_KERNEL | 252 | select SYS_SUPPORTS_32BIT_KERNEL |
| 253 | select SYS_SUPPORTS_64BIT_KERNEL if EXPERIMENTAL | 253 | select SYS_SUPPORTS_64BIT_KERNEL if BROKEN |
| 254 | select SYS_SUPPORTS_LITTLE_ENDIAN | 254 | select SYS_SUPPORTS_LITTLE_ENDIAN |
| 255 | select GENERIC_HARDIRQS_NO__DO_IRQ | 255 | select GENERIC_HARDIRQS_NO__DO_IRQ |
| 256 | 256 | ||
| @@ -1559,6 +1559,7 @@ config MIPS_MT_SMP | |||
| 1559 | select CPU_MIPSR2_IRQ_VI | 1559 | select CPU_MIPSR2_IRQ_VI |
| 1560 | select CPU_MIPSR2_SRS | 1560 | select CPU_MIPSR2_SRS |
| 1561 | select MIPS_MT | 1561 | select MIPS_MT |
| 1562 | select NR_CPUS_DEFAULT_2 | ||
| 1562 | select SMP | 1563 | select SMP |
| 1563 | select SYS_SUPPORTS_SMP | 1564 | select SYS_SUPPORTS_SMP |
| 1564 | help | 1565 | help |
| @@ -1573,7 +1574,6 @@ config MIPS_MT_SMTC | |||
| 1573 | select CPU_MIPSR2_IRQ_VI | 1574 | select CPU_MIPSR2_IRQ_VI |
| 1574 | select CPU_MIPSR2_SRS | 1575 | select CPU_MIPSR2_SRS |
| 1575 | select MIPS_MT | 1576 | select MIPS_MT |
| 1576 | select NR_CPUS_DEFAULT_2 | ||
| 1577 | select NR_CPUS_DEFAULT_8 | 1577 | select NR_CPUS_DEFAULT_8 |
| 1578 | select SMP | 1578 | select SMP |
| 1579 | select SYS_SUPPORTS_SMP | 1579 | select SYS_SUPPORTS_SMP |
diff --git a/arch/mips/kernel/kspd.c b/arch/mips/kernel/kspd.c index 241ee7a2906e..29eadd404fa5 100644 --- a/arch/mips/kernel/kspd.c +++ b/arch/mips/kernel/kspd.c | |||
| @@ -191,6 +191,8 @@ void sp_work_handle_request(void) | |||
| 191 | struct mtsp_syscall_generic generic; | 191 | struct mtsp_syscall_generic generic; |
| 192 | struct mtsp_syscall_ret ret; | 192 | struct mtsp_syscall_ret ret; |
| 193 | struct kspd_notifications *n; | 193 | struct kspd_notifications *n; |
| 194 | unsigned long written; | ||
| 195 | mm_segment_t old_fs; | ||
| 194 | struct timeval tv; | 196 | struct timeval tv; |
| 195 | struct timezone tz; | 197 | struct timezone tz; |
| 196 | int cmd; | 198 | int cmd; |
| @@ -201,7 +203,11 @@ void sp_work_handle_request(void) | |||
| 201 | 203 | ||
| 202 | ret.retval = -1; | 204 | ret.retval = -1; |
| 203 | 205 | ||
| 204 | if (!rtlx_read(RTLX_CHANNEL_SYSIO, &sc, sizeof(struct mtsp_syscall), 0)) { | 206 | old_fs = get_fs(); |
| 207 | set_fs(KERNEL_DS); | ||
| 208 | |||
| 209 | if (!rtlx_read(RTLX_CHANNEL_SYSIO, &sc, sizeof(struct mtsp_syscall))) { | ||
| 210 | set_fs(old_fs); | ||
| 205 | printk(KERN_ERR "Expected request but nothing to read\n"); | 211 | printk(KERN_ERR "Expected request but nothing to read\n"); |
| 206 | return; | 212 | return; |
| 207 | } | 213 | } |
| @@ -209,7 +215,8 @@ void sp_work_handle_request(void) | |||
| 209 | size = sc.size; | 215 | size = sc.size; |
| 210 | 216 | ||
| 211 | if (size) { | 217 | if (size) { |
| 212 | if (!rtlx_read(RTLX_CHANNEL_SYSIO, &generic, size, 0)) { | 218 | if (!rtlx_read(RTLX_CHANNEL_SYSIO, &generic, size)) { |
| 219 | set_fs(old_fs); | ||
| 213 | printk(KERN_ERR "Expected request but nothing to read\n"); | 220 | printk(KERN_ERR "Expected request but nothing to read\n"); |
| 214 | return; | 221 | return; |
| 215 | } | 222 | } |
| @@ -282,8 +289,11 @@ void sp_work_handle_request(void) | |||
| 282 | if (vpe_getuid(SP_VPE)) | 289 | if (vpe_getuid(SP_VPE)) |
| 283 | sp_setfsuidgid( 0, 0); | 290 | sp_setfsuidgid( 0, 0); |
| 284 | 291 | ||
| 285 | if ((rtlx_write(RTLX_CHANNEL_SYSIO, &ret, sizeof(struct mtsp_syscall_ret), 0)) | 292 | old_fs = get_fs(); |
| 286 | < sizeof(struct mtsp_syscall_ret)) | 293 | set_fs(KERNEL_DS); |
| 294 | written = rtlx_write(RTLX_CHANNEL_SYSIO, &ret, sizeof(ret)); | ||
| 295 | set_fs(old_fs); | ||
| 296 | if (written < sizeof(ret)) | ||
| 287 | printk("KSPD: sp_work_handle_request failed to send to SP\n"); | 297 | printk("KSPD: sp_work_handle_request failed to send to SP\n"); |
| 288 | } | 298 | } |
| 289 | 299 | ||
diff --git a/arch/mips/kernel/linux32.c b/arch/mips/kernel/linux32.c index 1df544c1f966..37849edd0645 100644 --- a/arch/mips/kernel/linux32.c +++ b/arch/mips/kernel/linux32.c | |||
| @@ -311,6 +311,8 @@ asmlinkage int sys32_sched_rr_get_interval(compat_pid_t pid, | |||
| 311 | return ret; | 311 | return ret; |
| 312 | } | 312 | } |
| 313 | 313 | ||
| 314 | #ifdef CONFIG_SYSVIPC | ||
| 315 | |||
| 314 | asmlinkage long | 316 | asmlinkage long |
| 315 | sys32_ipc (u32 call, int first, int second, int third, u32 ptr, u32 fifth) | 317 | sys32_ipc (u32 call, int first, int second, int third, u32 ptr, u32 fifth) |
| 316 | { | 318 | { |
| @@ -368,6 +370,16 @@ sys32_ipc (u32 call, int first, int second, int third, u32 ptr, u32 fifth) | |||
| 368 | return err; | 370 | return err; |
| 369 | } | 371 | } |
| 370 | 372 | ||
| 373 | #else | ||
| 374 | |||
| 375 | asmlinkage long | ||
| 376 | sys32_ipc (u32 call, int first, int second, int third, u32 ptr, u32 fifth) | ||
| 377 | { | ||
| 378 | return -ENOSYS; | ||
| 379 | } | ||
| 380 | |||
| 381 | #endif /* CONFIG_SYSVIPC */ | ||
| 382 | |||
| 371 | #ifdef CONFIG_MIPS32_N32 | 383 | #ifdef CONFIG_MIPS32_N32 |
| 372 | asmlinkage long sysn32_semctl(int semid, int semnum, int cmd, u32 arg) | 384 | asmlinkage long sysn32_semctl(int semid, int semnum, int cmd, u32 arg) |
| 373 | { | 385 | { |
diff --git a/arch/mips/kernel/r2300_switch.S b/arch/mips/kernel/r2300_switch.S index 656bde2e11b1..28c2e2e6af73 100644 --- a/arch/mips/kernel/r2300_switch.S +++ b/arch/mips/kernel/r2300_switch.S | |||
| @@ -49,8 +49,7 @@ LEAF(resume) | |||
| 49 | #ifndef CONFIG_CPU_HAS_LLSC | 49 | #ifndef CONFIG_CPU_HAS_LLSC |
| 50 | sw zero, ll_bit | 50 | sw zero, ll_bit |
| 51 | #endif | 51 | #endif |
| 52 | mfc0 t1, CP0_STATUS | 52 | mfc0 t2, CP0_STATUS |
| 53 | sw t1, THREAD_STATUS(a0) | ||
| 54 | cpu_save_nonscratch a0 | 53 | cpu_save_nonscratch a0 |
| 55 | sw ra, THREAD_REG31(a0) | 54 | sw ra, THREAD_REG31(a0) |
| 56 | 55 | ||
| @@ -60,8 +59,8 @@ LEAF(resume) | |||
| 60 | lw t3, TASK_THREAD_INFO(a0) | 59 | lw t3, TASK_THREAD_INFO(a0) |
| 61 | lw t0, TI_FLAGS(t3) | 60 | lw t0, TI_FLAGS(t3) |
| 62 | li t1, _TIF_USEDFPU | 61 | li t1, _TIF_USEDFPU |
| 63 | and t2, t0, t1 | 62 | and t1, t0 |
| 64 | beqz t2, 1f | 63 | beqz t1, 1f |
| 65 | nor t1, zero, t1 | 64 | nor t1, zero, t1 |
| 66 | 65 | ||
| 67 | and t0, t0, t1 | 66 | and t0, t0, t1 |
| @@ -74,10 +73,13 @@ LEAF(resume) | |||
| 74 | li t1, ~ST0_CU1 | 73 | li t1, ~ST0_CU1 |
| 75 | and t0, t0, t1 | 74 | and t0, t0, t1 |
| 76 | sw t0, ST_OFF(t3) | 75 | sw t0, ST_OFF(t3) |
| 76 | /* clear thread_struct CU1 bit */ | ||
| 77 | and t2, t1 | ||
| 77 | 78 | ||
| 78 | fpu_save_single a0, t0 # clobbers t0 | 79 | fpu_save_single a0, t0 # clobbers t0 |
| 79 | 80 | ||
| 80 | 1: | 81 | 1: |
| 82 | sw t2, THREAD_STATUS(a0) | ||
| 81 | /* | 83 | /* |
| 82 | * The order of restoring the registers takes care of the race | 84 | * The order of restoring the registers takes care of the race |
| 83 | * updating $28, $29 and kernelsp without disabling ints. | 85 | * updating $28, $29 and kernelsp without disabling ints. |
diff --git a/arch/mips/kernel/r4k_fpu.S b/arch/mips/kernel/r4k_fpu.S index 59c1577ecbb3..dbd42adc52ed 100644 --- a/arch/mips/kernel/r4k_fpu.S +++ b/arch/mips/kernel/r4k_fpu.S | |||
| @@ -114,14 +114,6 @@ LEAF(_save_fp_context32) | |||
| 114 | */ | 114 | */ |
| 115 | LEAF(_restore_fp_context) | 115 | LEAF(_restore_fp_context) |
| 116 | EX lw t0, SC_FPC_CSR(a0) | 116 | EX lw t0, SC_FPC_CSR(a0) |
| 117 | |||
| 118 | /* Fail if the CSR has exceptions pending */ | ||
| 119 | srl t1, t0, 5 | ||
| 120 | and t1, t0 | ||
| 121 | andi t1, 0x1f << 7 | ||
| 122 | bnez t1, fault | ||
| 123 | nop | ||
| 124 | |||
| 125 | #ifdef CONFIG_64BIT | 117 | #ifdef CONFIG_64BIT |
| 126 | EX ldc1 $f1, SC_FPREGS+8(a0) | 118 | EX ldc1 $f1, SC_FPREGS+8(a0) |
| 127 | EX ldc1 $f3, SC_FPREGS+24(a0) | 119 | EX ldc1 $f3, SC_FPREGS+24(a0) |
| @@ -165,14 +157,6 @@ LEAF(_restore_fp_context) | |||
| 165 | LEAF(_restore_fp_context32) | 157 | LEAF(_restore_fp_context32) |
| 166 | /* Restore an o32 sigcontext. */ | 158 | /* Restore an o32 sigcontext. */ |
| 167 | EX lw t0, SC32_FPC_CSR(a0) | 159 | EX lw t0, SC32_FPC_CSR(a0) |
| 168 | |||
| 169 | /* Fail if the CSR has exceptions pending */ | ||
| 170 | srl t1, t0, 5 | ||
| 171 | and t1, t0 | ||
| 172 | andi t1, 0x1f << 7 | ||
| 173 | bnez t1, fault | ||
| 174 | nop | ||
| 175 | |||
| 176 | EX ldc1 $f0, SC32_FPREGS+0(a0) | 160 | EX ldc1 $f0, SC32_FPREGS+0(a0) |
| 177 | EX ldc1 $f2, SC32_FPREGS+16(a0) | 161 | EX ldc1 $f2, SC32_FPREGS+16(a0) |
| 178 | EX ldc1 $f4, SC32_FPREGS+32(a0) | 162 | EX ldc1 $f4, SC32_FPREGS+32(a0) |
diff --git a/arch/mips/kernel/r4k_switch.S b/arch/mips/kernel/r4k_switch.S index cc566cf12246..c7698fd9955c 100644 --- a/arch/mips/kernel/r4k_switch.S +++ b/arch/mips/kernel/r4k_switch.S | |||
| @@ -48,8 +48,7 @@ | |||
| 48 | #ifndef CONFIG_CPU_HAS_LLSC | 48 | #ifndef CONFIG_CPU_HAS_LLSC |
| 49 | sw zero, ll_bit | 49 | sw zero, ll_bit |
| 50 | #endif | 50 | #endif |
| 51 | mfc0 t1, CP0_STATUS | 51 | mfc0 t2, CP0_STATUS |
| 52 | LONG_S t1, THREAD_STATUS(a0) | ||
| 53 | cpu_save_nonscratch a0 | 52 | cpu_save_nonscratch a0 |
| 54 | LONG_S ra, THREAD_REG31(a0) | 53 | LONG_S ra, THREAD_REG31(a0) |
| 55 | 54 | ||
| @@ -59,8 +58,8 @@ | |||
| 59 | PTR_L t3, TASK_THREAD_INFO(a0) | 58 | PTR_L t3, TASK_THREAD_INFO(a0) |
| 60 | LONG_L t0, TI_FLAGS(t3) | 59 | LONG_L t0, TI_FLAGS(t3) |
| 61 | li t1, _TIF_USEDFPU | 60 | li t1, _TIF_USEDFPU |
| 62 | and t2, t0, t1 | 61 | and t1, t0 |
| 63 | beqz t2, 1f | 62 | beqz t1, 1f |
| 64 | nor t1, zero, t1 | 63 | nor t1, zero, t1 |
| 65 | 64 | ||
| 66 | and t0, t0, t1 | 65 | and t0, t0, t1 |
| @@ -73,10 +72,13 @@ | |||
| 73 | li t1, ~ST0_CU1 | 72 | li t1, ~ST0_CU1 |
| 74 | and t0, t0, t1 | 73 | and t0, t0, t1 |
| 75 | LONG_S t0, ST_OFF(t3) | 74 | LONG_S t0, ST_OFF(t3) |
| 75 | /* clear thread_struct CU1 bit */ | ||
| 76 | and t2, t1 | ||
| 76 | 77 | ||
| 77 | fpu_save_double a0 t0 t1 # c0_status passed in t0 | 78 | fpu_save_double a0 t0 t1 # c0_status passed in t0 |
| 78 | # clobbers t1 | 79 | # clobbers t1 |
| 79 | 1: | 80 | 1: |
| 81 | LONG_S t2, THREAD_STATUS(a0) | ||
| 80 | 82 | ||
| 81 | /* | 83 | /* |
| 82 | * The order of restoring the registers takes care of the race | 84 | * The order of restoring the registers takes care of the race |
diff --git a/arch/mips/kernel/rtlx.c b/arch/mips/kernel/rtlx.c index e14ae09eda2b..e6e3047151a6 100644 --- a/arch/mips/kernel/rtlx.c +++ b/arch/mips/kernel/rtlx.c | |||
| @@ -54,6 +54,7 @@ static struct chan_waitqueues { | |||
| 54 | wait_queue_head_t rt_queue; | 54 | wait_queue_head_t rt_queue; |
| 55 | wait_queue_head_t lx_queue; | 55 | wait_queue_head_t lx_queue; |
| 56 | atomic_t in_open; | 56 | atomic_t in_open; |
| 57 | struct mutex mutex; | ||
| 57 | } channel_wqs[RTLX_CHANNELS]; | 58 | } channel_wqs[RTLX_CHANNELS]; |
| 58 | 59 | ||
| 59 | static struct irqaction irq; | 60 | static struct irqaction irq; |
| @@ -146,7 +147,7 @@ static void stopping(int vpe) | |||
| 146 | 147 | ||
| 147 | int rtlx_open(int index, int can_sleep) | 148 | int rtlx_open(int index, int can_sleep) |
| 148 | { | 149 | { |
| 149 | volatile struct rtlx_info **p; | 150 | struct rtlx_info **p; |
| 150 | struct rtlx_channel *chan; | 151 | struct rtlx_channel *chan; |
| 151 | enum rtlx_state state; | 152 | enum rtlx_state state; |
| 152 | int ret = 0; | 153 | int ret = 0; |
| @@ -179,13 +180,24 @@ int rtlx_open(int index, int can_sleep) | |||
| 179 | } | 180 | } |
| 180 | } | 181 | } |
| 181 | 182 | ||
| 183 | smp_rmb(); | ||
| 182 | if (*p == NULL) { | 184 | if (*p == NULL) { |
| 183 | if (can_sleep) { | 185 | if (can_sleep) { |
| 184 | __wait_event_interruptible(channel_wqs[index].lx_queue, | 186 | DEFINE_WAIT(wait); |
| 185 | *p != NULL, | 187 | |
| 186 | ret); | 188 | for (;;) { |
| 187 | if (ret) | 189 | prepare_to_wait(&channel_wqs[index].lx_queue, &wait, TASK_INTERRUPTIBLE); |
| 190 | smp_rmb(); | ||
| 191 | if (*p != NULL) | ||
| 192 | break; | ||
| 193 | if (!signal_pending(current)) { | ||
| 194 | schedule(); | ||
| 195 | continue; | ||
| 196 | } | ||
| 197 | ret = -ERESTARTSYS; | ||
| 188 | goto out_fail; | 198 | goto out_fail; |
| 199 | } | ||
| 200 | finish_wait(&channel_wqs[index].lx_queue, &wait); | ||
| 189 | } else { | 201 | } else { |
| 190 | printk(" *vpe_get_shared is NULL. " | 202 | printk(" *vpe_get_shared is NULL. " |
| 191 | "Has an SP program been loaded?\n"); | 203 | "Has an SP program been loaded?\n"); |
| @@ -277,56 +289,52 @@ unsigned int rtlx_write_poll(int index) | |||
| 277 | return write_spacefree(chan->rt_read, chan->rt_write, chan->buffer_size); | 289 | return write_spacefree(chan->rt_read, chan->rt_write, chan->buffer_size); |
| 278 | } | 290 | } |
| 279 | 291 | ||
| 280 | static inline void copy_to(void *dst, void *src, size_t count, int user) | 292 | ssize_t rtlx_read(int index, void __user *buff, size_t count, int user) |
| 281 | { | ||
| 282 | if (user) | ||
| 283 | copy_to_user(dst, src, count); | ||
| 284 | else | ||
| 285 | memcpy(dst, src, count); | ||
| 286 | } | ||
| 287 | |||
| 288 | static inline void copy_from(void *dst, void *src, size_t count, int user) | ||
| 289 | { | 293 | { |
| 290 | if (user) | 294 | size_t lx_write, fl = 0L; |
| 291 | copy_from_user(dst, src, count); | ||
| 292 | else | ||
| 293 | memcpy(dst, src, count); | ||
| 294 | } | ||
| 295 | |||
| 296 | ssize_t rtlx_read(int index, void *buff, size_t count, int user) | ||
| 297 | { | ||
| 298 | size_t fl = 0L; | ||
| 299 | struct rtlx_channel *lx; | 295 | struct rtlx_channel *lx; |
| 296 | unsigned long failed; | ||
| 300 | 297 | ||
| 301 | if (rtlx == NULL) | 298 | if (rtlx == NULL) |
| 302 | return -ENOSYS; | 299 | return -ENOSYS; |
| 303 | 300 | ||
| 304 | lx = &rtlx->channel[index]; | 301 | lx = &rtlx->channel[index]; |
| 305 | 302 | ||
| 303 | mutex_lock(&channel_wqs[index].mutex); | ||
| 304 | smp_rmb(); | ||
| 305 | lx_write = lx->lx_write; | ||
| 306 | |||
| 306 | /* find out how much in total */ | 307 | /* find out how much in total */ |
| 307 | count = min(count, | 308 | count = min(count, |
| 308 | (size_t)(lx->lx_write + lx->buffer_size - lx->lx_read) | 309 | (size_t)(lx_write + lx->buffer_size - lx->lx_read) |
| 309 | % lx->buffer_size); | 310 | % lx->buffer_size); |
| 310 | 311 | ||
| 311 | /* then how much from the read pointer onwards */ | 312 | /* then how much from the read pointer onwards */ |
| 312 | fl = min( count, (size_t)lx->buffer_size - lx->lx_read); | 313 | fl = min(count, (size_t)lx->buffer_size - lx->lx_read); |
| 313 | 314 | ||
| 314 | copy_to(buff, &lx->lx_buffer[lx->lx_read], fl, user); | 315 | failed = copy_to_user(buff, lx->lx_buffer + lx->lx_read, fl); |
| 316 | if (failed) | ||
| 317 | goto out; | ||
| 315 | 318 | ||
| 316 | /* and if there is anything left at the beginning of the buffer */ | 319 | /* and if there is anything left at the beginning of the buffer */ |
| 317 | if ( count - fl ) | 320 | if (count - fl) |
| 318 | copy_to (buff + fl, lx->lx_buffer, count - fl, user); | 321 | failed = copy_to_user(buff + fl, lx->lx_buffer, count - fl); |
| 319 | 322 | ||
| 320 | /* update the index */ | 323 | out: |
| 321 | lx->lx_read += count; | 324 | count -= failed; |
| 322 | lx->lx_read %= lx->buffer_size; | 325 | |
| 326 | smp_wmb(); | ||
| 327 | lx->lx_read = (lx->lx_read + count) % lx->buffer_size; | ||
| 328 | smp_wmb(); | ||
| 329 | mutex_unlock(&channel_wqs[index].mutex); | ||
| 323 | 330 | ||
| 324 | return count; | 331 | return count; |
| 325 | } | 332 | } |
| 326 | 333 | ||
| 327 | ssize_t rtlx_write(int index, void *buffer, size_t count, int user) | 334 | ssize_t rtlx_write(int index, const void __user *buffer, size_t count, int user) |
| 328 | { | 335 | { |
| 329 | struct rtlx_channel *rt; | 336 | struct rtlx_channel *rt; |
| 337 | size_t rt_read; | ||
| 330 | size_t fl; | 338 | size_t fl; |
| 331 | 339 | ||
| 332 | if (rtlx == NULL) | 340 | if (rtlx == NULL) |
| @@ -334,24 +342,35 @@ ssize_t rtlx_write(int index, void *buffer, size_t count, int user) | |||
| 334 | 342 | ||
| 335 | rt = &rtlx->channel[index]; | 343 | rt = &rtlx->channel[index]; |
| 336 | 344 | ||
| 345 | mutex_lock(&channel_wqs[index].mutex); | ||
| 346 | smp_rmb(); | ||
| 347 | rt_read = rt->rt_read; | ||
| 348 | |||
| 337 | /* total number of bytes to copy */ | 349 | /* total number of bytes to copy */ |
| 338 | count = min(count, | 350 | count = min(count, |
| 339 | (size_t)write_spacefree(rt->rt_read, rt->rt_write, | 351 | (size_t)write_spacefree(rt_read, rt->rt_write, rt->buffer_size)); |
| 340 | rt->buffer_size)); | ||
| 341 | 352 | ||
| 342 | /* first bit from write pointer to the end of the buffer, or count */ | 353 | /* first bit from write pointer to the end of the buffer, or count */ |
| 343 | fl = min(count, (size_t) rt->buffer_size - rt->rt_write); | 354 | fl = min(count, (size_t) rt->buffer_size - rt->rt_write); |
| 344 | 355 | ||
| 345 | copy_from (&rt->rt_buffer[rt->rt_write], buffer, fl, user); | 356 | failed = copy_from_user(rt->rt_buffer + rt->rt_write, buffer, fl); |
| 357 | if (failed) | ||
| 358 | goto out; | ||
| 346 | 359 | ||
| 347 | /* if there's any left copy to the beginning of the buffer */ | 360 | /* if there's any left copy to the beginning of the buffer */ |
| 348 | if( count - fl ) | 361 | if (count - fl) { |
| 349 | copy_from (rt->rt_buffer, buffer + fl, count - fl, user); | 362 | failed = copy_from_user(rt->rt_buffer, buffer + fl, count - fl); |
| 363 | } | ||
| 364 | |||
| 365 | out: | ||
| 366 | count -= cailed; | ||
| 350 | 367 | ||
| 351 | rt->rt_write += count; | 368 | smp_wmb(); |
| 352 | rt->rt_write %= rt->buffer_size; | 369 | rt->rt_write = (rt->rt_write + count) % rt->buffer_size; |
| 370 | smp_wmb(); | ||
| 371 | mutex_unlock(&channel_wqs[index].mutex); | ||
| 353 | 372 | ||
| 354 | return(count); | 373 | return count; |
| 355 | } | 374 | } |
| 356 | 375 | ||
| 357 | 376 | ||
| @@ -403,7 +422,7 @@ static ssize_t file_read(struct file *file, char __user * buffer, size_t count, | |||
| 403 | return 0; // -EAGAIN makes cat whinge | 422 | return 0; // -EAGAIN makes cat whinge |
| 404 | } | 423 | } |
| 405 | 424 | ||
| 406 | return rtlx_read(minor, buffer, count, 1); | 425 | return rtlx_read(minor, buffer, count); |
| 407 | } | 426 | } |
| 408 | 427 | ||
| 409 | static ssize_t file_write(struct file *file, const char __user * buffer, | 428 | static ssize_t file_write(struct file *file, const char __user * buffer, |
| @@ -429,7 +448,7 @@ static ssize_t file_write(struct file *file, const char __user * buffer, | |||
| 429 | return ret; | 448 | return ret; |
| 430 | } | 449 | } |
| 431 | 450 | ||
| 432 | return rtlx_write(minor, (void *)buffer, count, 1); | 451 | return rtlx_write(minor, buffer, count); |
| 433 | } | 452 | } |
| 434 | 453 | ||
| 435 | static const struct file_operations rtlx_fops = { | 454 | static const struct file_operations rtlx_fops = { |
| @@ -468,6 +487,7 @@ static int rtlx_module_init(void) | |||
| 468 | init_waitqueue_head(&channel_wqs[i].rt_queue); | 487 | init_waitqueue_head(&channel_wqs[i].rt_queue); |
| 469 | init_waitqueue_head(&channel_wqs[i].lx_queue); | 488 | init_waitqueue_head(&channel_wqs[i].lx_queue); |
| 470 | atomic_set(&channel_wqs[i].in_open, 0); | 489 | atomic_set(&channel_wqs[i].in_open, 0); |
| 490 | mutex_init(&channel_wqs[i].mutex); | ||
| 471 | 491 | ||
| 472 | dev = device_create(mt_class, NULL, MKDEV(major, i), | 492 | dev = device_create(mt_class, NULL, MKDEV(major, i), |
| 473 | "%s%d", module_name, i); | 493 | "%s%d", module_name, i); |
diff --git a/arch/mips/kernel/signal-common.h b/arch/mips/kernel/signal-common.h index fdbdbdc65b54..297dfcb97524 100644 --- a/arch/mips/kernel/signal-common.h +++ b/arch/mips/kernel/signal-common.h | |||
| @@ -31,4 +31,7 @@ extern void __user *get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, | |||
| 31 | */ | 31 | */ |
| 32 | extern int install_sigtramp(unsigned int __user *tramp, unsigned int syscall); | 32 | extern int install_sigtramp(unsigned int __user *tramp, unsigned int syscall); |
| 33 | 33 | ||
| 34 | /* Check and clear pending FPU exceptions in saved CSR */ | ||
| 35 | extern int fpcsr_pending(unsigned int __user *fpcsr); | ||
| 36 | |||
| 34 | #endif /* __SIGNAL_COMMON_H */ | 37 | #endif /* __SIGNAL_COMMON_H */ |
diff --git a/arch/mips/kernel/signal.c b/arch/mips/kernel/signal.c index f091786187a6..8c3c5a5789b0 100644 --- a/arch/mips/kernel/signal.c +++ b/arch/mips/kernel/signal.c | |||
| @@ -82,6 +82,7 @@ int setup_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc) | |||
| 82 | { | 82 | { |
| 83 | int err = 0; | 83 | int err = 0; |
| 84 | int i; | 84 | int i; |
| 85 | unsigned int used_math; | ||
| 85 | 86 | ||
| 86 | err |= __put_user(regs->cp0_epc, &sc->sc_pc); | 87 | err |= __put_user(regs->cp0_epc, &sc->sc_pc); |
| 87 | 88 | ||
| @@ -104,26 +105,53 @@ int setup_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc) | |||
| 104 | err |= __put_user(rddsp(DSP_MASK), &sc->sc_dsp); | 105 | err |= __put_user(rddsp(DSP_MASK), &sc->sc_dsp); |
| 105 | } | 106 | } |
| 106 | 107 | ||
| 107 | err |= __put_user(!!used_math(), &sc->sc_used_math); | 108 | used_math = !!used_math(); |
| 109 | err |= __put_user(used_math, &sc->sc_used_math); | ||
| 108 | 110 | ||
| 109 | if (used_math()) { | 111 | if (used_math) { |
| 110 | /* | 112 | /* |
| 111 | * Save FPU state to signal context. Signal handler | 113 | * Save FPU state to signal context. Signal handler |
| 112 | * will "inherit" current FPU state. | 114 | * will "inherit" current FPU state. |
| 113 | */ | 115 | */ |
| 114 | preempt_disable(); | 116 | own_fpu(1); |
| 115 | 117 | enable_fp_in_kernel(); | |
| 116 | if (!is_fpu_owner()) { | ||
| 117 | own_fpu(); | ||
| 118 | restore_fp(current); | ||
| 119 | } | ||
| 120 | err |= save_fp_context(sc); | 118 | err |= save_fp_context(sc); |
| 121 | 119 | disable_fp_in_kernel(); | |
| 122 | preempt_enable(); | ||
| 123 | } | 120 | } |
| 124 | return err; | 121 | return err; |
| 125 | } | 122 | } |
| 126 | 123 | ||
| 124 | int fpcsr_pending(unsigned int __user *fpcsr) | ||
| 125 | { | ||
| 126 | int err, sig = 0; | ||
| 127 | unsigned int csr, enabled; | ||
| 128 | |||
| 129 | err = __get_user(csr, fpcsr); | ||
| 130 | enabled = FPU_CSR_UNI_X | ((csr & FPU_CSR_ALL_E) << 5); | ||
| 131 | /* | ||
| 132 | * If the signal handler set some FPU exceptions, clear it and | ||
| 133 | * send SIGFPE. | ||
| 134 | */ | ||
| 135 | if (csr & enabled) { | ||
| 136 | csr &= ~enabled; | ||
| 137 | err |= __put_user(csr, fpcsr); | ||
| 138 | sig = SIGFPE; | ||
| 139 | } | ||
| 140 | return err ?: sig; | ||
| 141 | } | ||
| 142 | |||
| 143 | static int | ||
| 144 | check_and_restore_fp_context(struct sigcontext __user *sc) | ||
| 145 | { | ||
| 146 | int err, sig; | ||
| 147 | |||
| 148 | err = sig = fpcsr_pending(&sc->sc_fpc_csr); | ||
| 149 | if (err > 0) | ||
| 150 | err = 0; | ||
| 151 | err |= restore_fp_context(sc); | ||
| 152 | return err ?: sig; | ||
| 153 | } | ||
| 154 | |||
| 127 | int restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc) | 155 | int restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc) |
| 128 | { | 156 | { |
| 129 | unsigned int used_math; | 157 | unsigned int used_math; |
| @@ -157,19 +185,18 @@ int restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc) | |||
| 157 | err |= __get_user(used_math, &sc->sc_used_math); | 185 | err |= __get_user(used_math, &sc->sc_used_math); |
| 158 | conditional_used_math(used_math); | 186 | conditional_used_math(used_math); |
| 159 | 187 | ||
| 160 | preempt_disable(); | 188 | if (used_math) { |
| 161 | |||
| 162 | if (used_math()) { | ||
| 163 | /* restore fpu context if we have used it before */ | 189 | /* restore fpu context if we have used it before */ |
| 164 | own_fpu(); | 190 | own_fpu(0); |
| 165 | err |= restore_fp_context(sc); | 191 | enable_fp_in_kernel(); |
| 192 | if (!err) | ||
| 193 | err = check_and_restore_fp_context(sc); | ||
| 194 | disable_fp_in_kernel(); | ||
| 166 | } else { | 195 | } else { |
| 167 | /* signal handler may have used FPU. Give it up. */ | 196 | /* signal handler may have used FPU. Give it up. */ |
| 168 | lose_fpu(); | 197 | lose_fpu(0); |
| 169 | } | 198 | } |
| 170 | 199 | ||
| 171 | preempt_enable(); | ||
| 172 | |||
| 173 | return err; | 200 | return err; |
| 174 | } | 201 | } |
| 175 | 202 | ||
| @@ -332,6 +359,7 @@ asmlinkage void sys_sigreturn(nabi_no_regargs struct pt_regs regs) | |||
| 332 | { | 359 | { |
| 333 | struct sigframe __user *frame; | 360 | struct sigframe __user *frame; |
| 334 | sigset_t blocked; | 361 | sigset_t blocked; |
| 362 | int sig; | ||
| 335 | 363 | ||
| 336 | frame = (struct sigframe __user *) regs.regs[29]; | 364 | frame = (struct sigframe __user *) regs.regs[29]; |
| 337 | if (!access_ok(VERIFY_READ, frame, sizeof(*frame))) | 365 | if (!access_ok(VERIFY_READ, frame, sizeof(*frame))) |
| @@ -345,8 +373,11 @@ asmlinkage void sys_sigreturn(nabi_no_regargs struct pt_regs regs) | |||
| 345 | recalc_sigpending(); | 373 | recalc_sigpending(); |
| 346 | spin_unlock_irq(¤t->sighand->siglock); | 374 | spin_unlock_irq(¤t->sighand->siglock); |
| 347 | 375 | ||
| 348 | if (restore_sigcontext(®s, &frame->sf_sc)) | 376 | sig = restore_sigcontext(®s, &frame->sf_sc); |
| 377 | if (sig < 0) | ||
| 349 | goto badframe; | 378 | goto badframe; |
| 379 | else if (sig) | ||
| 380 | force_sig(sig, current); | ||
| 350 | 381 | ||
| 351 | /* | 382 | /* |
| 352 | * Don't let your children do this ... | 383 | * Don't let your children do this ... |
| @@ -368,6 +399,7 @@ asmlinkage void sys_rt_sigreturn(nabi_no_regargs struct pt_regs regs) | |||
| 368 | struct rt_sigframe __user *frame; | 399 | struct rt_sigframe __user *frame; |
| 369 | sigset_t set; | 400 | sigset_t set; |
| 370 | stack_t st; | 401 | stack_t st; |
| 402 | int sig; | ||
| 371 | 403 | ||
| 372 | frame = (struct rt_sigframe __user *) regs.regs[29]; | 404 | frame = (struct rt_sigframe __user *) regs.regs[29]; |
| 373 | if (!access_ok(VERIFY_READ, frame, sizeof(*frame))) | 405 | if (!access_ok(VERIFY_READ, frame, sizeof(*frame))) |
| @@ -381,8 +413,11 @@ asmlinkage void sys_rt_sigreturn(nabi_no_regargs struct pt_regs regs) | |||
| 381 | recalc_sigpending(); | 413 | recalc_sigpending(); |
| 382 | spin_unlock_irq(¤t->sighand->siglock); | 414 | spin_unlock_irq(¤t->sighand->siglock); |
| 383 | 415 | ||
| 384 | if (restore_sigcontext(®s, &frame->rs_uc.uc_mcontext)) | 416 | sig = restore_sigcontext(®s, &frame->rs_uc.uc_mcontext); |
| 417 | if (sig < 0) | ||
| 385 | goto badframe; | 418 | goto badframe; |
| 419 | else if (sig) | ||
| 420 | force_sig(sig, current); | ||
| 386 | 421 | ||
| 387 | if (__copy_from_user(&st, &frame->rs_uc.uc_stack, sizeof(st))) | 422 | if (__copy_from_user(&st, &frame->rs_uc.uc_stack, sizeof(st))) |
| 388 | goto badframe; | 423 | goto badframe; |
diff --git a/arch/mips/kernel/signal32.c b/arch/mips/kernel/signal32.c index 19bbef001959..151fd2f0893a 100644 --- a/arch/mips/kernel/signal32.c +++ b/arch/mips/kernel/signal32.c | |||
| @@ -181,6 +181,7 @@ static int setup_sigcontext32(struct pt_regs *regs, | |||
| 181 | { | 181 | { |
| 182 | int err = 0; | 182 | int err = 0; |
| 183 | int i; | 183 | int i; |
| 184 | u32 used_math; | ||
| 184 | 185 | ||
| 185 | err |= __put_user(regs->cp0_epc, &sc->sc_pc); | 186 | err |= __put_user(regs->cp0_epc, &sc->sc_pc); |
| 186 | 187 | ||
| @@ -200,26 +201,34 @@ static int setup_sigcontext32(struct pt_regs *regs, | |||
| 200 | err |= __put_user(mflo3(), &sc->sc_lo3); | 201 | err |= __put_user(mflo3(), &sc->sc_lo3); |
| 201 | } | 202 | } |
| 202 | 203 | ||
| 203 | err |= __put_user(!!used_math(), &sc->sc_used_math); | 204 | used_math = !!used_math(); |
| 205 | err |= __put_user(used_math, &sc->sc_used_math); | ||
| 204 | 206 | ||
| 205 | if (used_math()) { | 207 | if (used_math) { |
| 206 | /* | 208 | /* |
| 207 | * Save FPU state to signal context. Signal handler | 209 | * Save FPU state to signal context. Signal handler |
| 208 | * will "inherit" current FPU state. | 210 | * will "inherit" current FPU state. |
| 209 | */ | 211 | */ |
| 210 | preempt_disable(); | 212 | own_fpu(1); |
| 211 | 213 | enable_fp_in_kernel(); | |
| 212 | if (!is_fpu_owner()) { | ||
| 213 | own_fpu(); | ||
| 214 | restore_fp(current); | ||
| 215 | } | ||
| 216 | err |= save_fp_context32(sc); | 214 | err |= save_fp_context32(sc); |
| 217 | 215 | disable_fp_in_kernel(); | |
| 218 | preempt_enable(); | ||
| 219 | } | 216 | } |
| 220 | return err; | 217 | return err; |
| 221 | } | 218 | } |
| 222 | 219 | ||
| 220 | static int | ||
| 221 | check_and_restore_fp_context32(struct sigcontext32 __user *sc) | ||
| 222 | { | ||
| 223 | int err, sig; | ||
| 224 | |||
| 225 | err = sig = fpcsr_pending(&sc->sc_fpc_csr); | ||
| 226 | if (err > 0) | ||
| 227 | err = 0; | ||
| 228 | err |= restore_fp_context32(sc); | ||
| 229 | return err ?: sig; | ||
| 230 | } | ||
| 231 | |||
| 223 | static int restore_sigcontext32(struct pt_regs *regs, | 232 | static int restore_sigcontext32(struct pt_regs *regs, |
| 224 | struct sigcontext32 __user *sc) | 233 | struct sigcontext32 __user *sc) |
| 225 | { | 234 | { |
| @@ -250,19 +259,18 @@ static int restore_sigcontext32(struct pt_regs *regs, | |||
| 250 | err |= __get_user(used_math, &sc->sc_used_math); | 259 | err |= __get_user(used_math, &sc->sc_used_math); |
| 251 | conditional_used_math(used_math); | 260 | conditional_used_math(used_math); |
| 252 | 261 | ||
| 253 | preempt_disable(); | 262 | if (used_math) { |
| 254 | |||
| 255 | if (used_math()) { | ||
| 256 | /* restore fpu context if we have used it before */ | 263 | /* restore fpu context if we have used it before */ |
| 257 | own_fpu(); | 264 | own_fpu(0); |
| 258 | err |= restore_fp_context32(sc); | 265 | enable_fp_in_kernel(); |
| 266 | if (!err) | ||
| 267 | err = check_and_restore_fp_context32(sc); | ||
| 268 | disable_fp_in_kernel(); | ||
| 259 | } else { | 269 | } else { |
| 260 | /* signal handler may have used FPU. Give it up. */ | 270 | /* signal handler may have used FPU. Give it up. */ |
| 261 | lose_fpu(); | 271 | lose_fpu(0); |
| 262 | } | 272 | } |
| 263 | 273 | ||
| 264 | preempt_enable(); | ||
| 265 | |||
| 266 | return err; | 274 | return err; |
| 267 | } | 275 | } |
| 268 | 276 | ||
| @@ -508,6 +516,7 @@ asmlinkage void sys32_sigreturn(nabi_no_regargs struct pt_regs regs) | |||
| 508 | { | 516 | { |
| 509 | struct sigframe32 __user *frame; | 517 | struct sigframe32 __user *frame; |
| 510 | sigset_t blocked; | 518 | sigset_t blocked; |
| 519 | int sig; | ||
| 511 | 520 | ||
| 512 | frame = (struct sigframe32 __user *) regs.regs[29]; | 521 | frame = (struct sigframe32 __user *) regs.regs[29]; |
| 513 | if (!access_ok(VERIFY_READ, frame, sizeof(*frame))) | 522 | if (!access_ok(VERIFY_READ, frame, sizeof(*frame))) |
| @@ -521,8 +530,11 @@ asmlinkage void sys32_sigreturn(nabi_no_regargs struct pt_regs regs) | |||
| 521 | recalc_sigpending(); | 530 | recalc_sigpending(); |
| 522 | spin_unlock_irq(¤t->sighand->siglock); | 531 | spin_unlock_irq(¤t->sighand->siglock); |
| 523 | 532 | ||
| 524 | if (restore_sigcontext32(®s, &frame->sf_sc)) | 533 | sig = restore_sigcontext32(®s, &frame->sf_sc); |
| 534 | if (sig < 0) | ||
| 525 | goto badframe; | 535 | goto badframe; |
| 536 | else if (sig) | ||
| 537 | force_sig(sig, current); | ||
| 526 | 538 | ||
| 527 | /* | 539 | /* |
| 528 | * Don't let your children do this ... | 540 | * Don't let your children do this ... |
| @@ -545,6 +557,7 @@ asmlinkage void sys32_rt_sigreturn(nabi_no_regargs struct pt_regs regs) | |||
| 545 | sigset_t set; | 557 | sigset_t set; |
| 546 | stack_t st; | 558 | stack_t st; |
| 547 | s32 sp; | 559 | s32 sp; |
| 560 | int sig; | ||
| 548 | 561 | ||
| 549 | frame = (struct rt_sigframe32 __user *) regs.regs[29]; | 562 | frame = (struct rt_sigframe32 __user *) regs.regs[29]; |
| 550 | if (!access_ok(VERIFY_READ, frame, sizeof(*frame))) | 563 | if (!access_ok(VERIFY_READ, frame, sizeof(*frame))) |
| @@ -558,8 +571,11 @@ asmlinkage void sys32_rt_sigreturn(nabi_no_regargs struct pt_regs regs) | |||
| 558 | recalc_sigpending(); | 571 | recalc_sigpending(); |
| 559 | spin_unlock_irq(¤t->sighand->siglock); | 572 | spin_unlock_irq(¤t->sighand->siglock); |
| 560 | 573 | ||
| 561 | if (restore_sigcontext32(®s, &frame->rs_uc.uc_mcontext)) | 574 | sig = restore_sigcontext32(®s, &frame->rs_uc.uc_mcontext); |
| 575 | if (sig < 0) | ||
| 562 | goto badframe; | 576 | goto badframe; |
| 577 | else if (sig) | ||
| 578 | force_sig(sig, current); | ||
| 563 | 579 | ||
| 564 | /* The ucontext contains a stack32_t, so we must convert! */ | 580 | /* The ucontext contains a stack32_t, so we must convert! */ |
| 565 | if (__get_user(sp, &frame->rs_uc.uc_stack.ss_sp)) | 581 | if (__get_user(sp, &frame->rs_uc.uc_stack.ss_sp)) |
diff --git a/arch/mips/kernel/signal_n32.c b/arch/mips/kernel/signal_n32.c index ecf1f7ecaad9..a9202fa95987 100644 --- a/arch/mips/kernel/signal_n32.c +++ b/arch/mips/kernel/signal_n32.c | |||
| @@ -127,6 +127,7 @@ asmlinkage void sysn32_rt_sigreturn(nabi_no_regargs struct pt_regs regs) | |||
| 127 | sigset_t set; | 127 | sigset_t set; |
| 128 | stack_t st; | 128 | stack_t st; |
| 129 | s32 sp; | 129 | s32 sp; |
| 130 | int sig; | ||
| 130 | 131 | ||
| 131 | frame = (struct rt_sigframe_n32 __user *) regs.regs[29]; | 132 | frame = (struct rt_sigframe_n32 __user *) regs.regs[29]; |
| 132 | if (!access_ok(VERIFY_READ, frame, sizeof(*frame))) | 133 | if (!access_ok(VERIFY_READ, frame, sizeof(*frame))) |
| @@ -140,8 +141,11 @@ asmlinkage void sysn32_rt_sigreturn(nabi_no_regargs struct pt_regs regs) | |||
| 140 | recalc_sigpending(); | 141 | recalc_sigpending(); |
| 141 | spin_unlock_irq(¤t->sighand->siglock); | 142 | spin_unlock_irq(¤t->sighand->siglock); |
| 142 | 143 | ||
| 143 | if (restore_sigcontext(®s, &frame->rs_uc.uc_mcontext)) | 144 | sig = restore_sigcontext(®s, &frame->rs_uc.uc_mcontext); |
| 145 | if (sig < 0) | ||
| 144 | goto badframe; | 146 | goto badframe; |
| 147 | else if (sig) | ||
| 148 | force_sig(sig, current); | ||
| 145 | 149 | ||
| 146 | /* The ucontext contains a stack32_t, so we must convert! */ | 150 | /* The ucontext contains a stack32_t, so we must convert! */ |
| 147 | if (__get_user(sp, &frame->rs_uc.uc_stack.ss_sp)) | 151 | if (__get_user(sp, &frame->rs_uc.uc_stack.ss_sp)) |
diff --git a/arch/mips/kernel/traps.c b/arch/mips/kernel/traps.c index 18f56a9dbcfa..7d76a85422b2 100644 --- a/arch/mips/kernel/traps.c +++ b/arch/mips/kernel/traps.c | |||
| @@ -610,16 +610,6 @@ asmlinkage void do_fpe(struct pt_regs *regs, unsigned long fcr31) | |||
| 610 | if (fcr31 & FPU_CSR_UNI_X) { | 610 | if (fcr31 & FPU_CSR_UNI_X) { |
| 611 | int sig; | 611 | int sig; |
| 612 | 612 | ||
| 613 | preempt_disable(); | ||
| 614 | |||
| 615 | #ifdef CONFIG_PREEMPT | ||
| 616 | if (!is_fpu_owner()) { | ||
| 617 | /* We might lose fpu before disabling preempt... */ | ||
| 618 | own_fpu(); | ||
| 619 | BUG_ON(!used_math()); | ||
| 620 | restore_fp(current); | ||
| 621 | } | ||
| 622 | #endif | ||
| 623 | /* | 613 | /* |
| 624 | * Unimplemented operation exception. If we've got the full | 614 | * Unimplemented operation exception. If we've got the full |
| 625 | * software emulator on-board, let's use it... | 615 | * software emulator on-board, let's use it... |
| @@ -630,18 +620,12 @@ asmlinkage void do_fpe(struct pt_regs *regs, unsigned long fcr31) | |||
| 630 | * register operands before invoking the emulator, which seems | 620 | * register operands before invoking the emulator, which seems |
| 631 | * a bit extreme for what should be an infrequent event. | 621 | * a bit extreme for what should be an infrequent event. |
| 632 | */ | 622 | */ |
| 633 | save_fp(current); | ||
| 634 | /* Ensure 'resume' not overwrite saved fp context again. */ | 623 | /* Ensure 'resume' not overwrite saved fp context again. */ |
| 635 | lose_fpu(); | 624 | lose_fpu(1); |
| 636 | |||
| 637 | preempt_enable(); | ||
| 638 | 625 | ||
| 639 | /* Run the emulator */ | 626 | /* Run the emulator */ |
| 640 | sig = fpu_emulator_cop1Handler (regs, ¤t->thread.fpu, 1); | 627 | sig = fpu_emulator_cop1Handler (regs, ¤t->thread.fpu, 1); |
| 641 | 628 | ||
| 642 | preempt_disable(); | ||
| 643 | |||
| 644 | own_fpu(); /* Using the FPU again. */ | ||
| 645 | /* | 629 | /* |
| 646 | * We can't allow the emulated instruction to leave any of | 630 | * We can't allow the emulated instruction to leave any of |
| 647 | * the cause bit set in $fcr31. | 631 | * the cause bit set in $fcr31. |
| @@ -649,9 +633,7 @@ asmlinkage void do_fpe(struct pt_regs *regs, unsigned long fcr31) | |||
| 649 | current->thread.fpu.fcr31 &= ~FPU_CSR_ALL_X; | 633 | current->thread.fpu.fcr31 &= ~FPU_CSR_ALL_X; |
| 650 | 634 | ||
| 651 | /* Restore the hardware register state */ | 635 | /* Restore the hardware register state */ |
| 652 | restore_fp(current); | 636 | own_fpu(1); /* Using the FPU again. */ |
| 653 | |||
| 654 | preempt_enable(); | ||
| 655 | 637 | ||
| 656 | /* If something went wrong, signal */ | 638 | /* If something went wrong, signal */ |
| 657 | if (sig) | 639 | if (sig) |
| @@ -775,12 +757,11 @@ asmlinkage void do_cpu(struct pt_regs *regs) | |||
| 775 | { | 757 | { |
| 776 | unsigned int cpid; | 758 | unsigned int cpid; |
| 777 | 759 | ||
| 778 | die_if_kernel("do_cpu invoked from kernel context!", regs); | ||
| 779 | |||
| 780 | cpid = (regs->cp0_cause >> CAUSEB_CE) & 3; | 760 | cpid = (regs->cp0_cause >> CAUSEB_CE) & 3; |
| 781 | 761 | ||
| 782 | switch (cpid) { | 762 | switch (cpid) { |
| 783 | case 0: | 763 | case 0: |
| 764 | die_if_kernel("do_cpu invoked from kernel context!", regs); | ||
| 784 | if (!cpu_has_llsc) | 765 | if (!cpu_has_llsc) |
| 785 | if (!simulate_llsc(regs)) | 766 | if (!simulate_llsc(regs)) |
| 786 | return; | 767 | return; |
| @@ -791,21 +772,30 @@ asmlinkage void do_cpu(struct pt_regs *regs) | |||
| 791 | break; | 772 | break; |
| 792 | 773 | ||
| 793 | case 1: | 774 | case 1: |
| 794 | preempt_disable(); | 775 | if (!test_thread_flag(TIF_ALLOW_FP_IN_KERNEL)) |
| 795 | 776 | die_if_kernel("do_cpu invoked from kernel context!", | |
| 796 | own_fpu(); | 777 | regs); |
| 797 | if (used_math()) { /* Using the FPU again. */ | 778 | if (used_math()) /* Using the FPU again. */ |
| 798 | restore_fp(current); | 779 | own_fpu(1); |
| 799 | } else { /* First time FPU user. */ | 780 | else { /* First time FPU user. */ |
| 800 | init_fpu(); | 781 | init_fpu(); |
| 801 | set_used_math(); | 782 | set_used_math(); |
| 802 | } | 783 | } |
| 803 | 784 | ||
| 804 | if (cpu_has_fpu) { | 785 | if (raw_cpu_has_fpu) { |
| 805 | preempt_enable(); | 786 | if (test_thread_flag(TIF_ALLOW_FP_IN_KERNEL)) { |
| 787 | local_irq_disable(); | ||
| 788 | if (cpu_has_fpu) | ||
| 789 | regs->cp0_status |= ST0_CU1; | ||
| 790 | /* | ||
| 791 | * We must return without enabling | ||
| 792 | * interrupts to ensure keep FPU | ||
| 793 | * ownership until resume. | ||
| 794 | */ | ||
| 795 | return; | ||
| 796 | } | ||
| 806 | } else { | 797 | } else { |
| 807 | int sig; | 798 | int sig; |
| 808 | preempt_enable(); | ||
| 809 | sig = fpu_emulator_cop1Handler(regs, | 799 | sig = fpu_emulator_cop1Handler(regs, |
| 810 | ¤t->thread.fpu, 0); | 800 | ¤t->thread.fpu, 0); |
| 811 | if (sig) | 801 | if (sig) |
| @@ -1259,26 +1249,26 @@ static inline void mips_srs_init(void) | |||
| 1259 | /* | 1249 | /* |
| 1260 | * This is used by native signal handling | 1250 | * This is used by native signal handling |
| 1261 | */ | 1251 | */ |
| 1262 | asmlinkage int (*save_fp_context)(struct sigcontext *sc); | 1252 | asmlinkage int (*save_fp_context)(struct sigcontext __user *sc); |
| 1263 | asmlinkage int (*restore_fp_context)(struct sigcontext *sc); | 1253 | asmlinkage int (*restore_fp_context)(struct sigcontext __user *sc); |
| 1264 | 1254 | ||
| 1265 | extern asmlinkage int _save_fp_context(struct sigcontext *sc); | 1255 | extern asmlinkage int _save_fp_context(struct sigcontext __user *sc); |
| 1266 | extern asmlinkage int _restore_fp_context(struct sigcontext *sc); | 1256 | extern asmlinkage int _restore_fp_context(struct sigcontext __user *sc); |
| 1267 | 1257 | ||
| 1268 | extern asmlinkage int fpu_emulator_save_context(struct sigcontext *sc); | 1258 | extern asmlinkage int fpu_emulator_save_context(struct sigcontext __user *sc); |
| 1269 | extern asmlinkage int fpu_emulator_restore_context(struct sigcontext *sc); | 1259 | extern asmlinkage int fpu_emulator_restore_context(struct sigcontext __user *sc); |
| 1270 | 1260 | ||
| 1271 | #ifdef CONFIG_SMP | 1261 | #ifdef CONFIG_SMP |
| 1272 | static int smp_save_fp_context(struct sigcontext *sc) | 1262 | static int smp_save_fp_context(struct sigcontext __user *sc) |
| 1273 | { | 1263 | { |
| 1274 | return cpu_has_fpu | 1264 | return raw_cpu_has_fpu |
| 1275 | ? _save_fp_context(sc) | 1265 | ? _save_fp_context(sc) |
| 1276 | : fpu_emulator_save_context(sc); | 1266 | : fpu_emulator_save_context(sc); |
| 1277 | } | 1267 | } |
| 1278 | 1268 | ||
| 1279 | static int smp_restore_fp_context(struct sigcontext *sc) | 1269 | static int smp_restore_fp_context(struct sigcontext __user *sc) |
| 1280 | { | 1270 | { |
| 1281 | return cpu_has_fpu | 1271 | return raw_cpu_has_fpu |
| 1282 | ? _restore_fp_context(sc) | 1272 | ? _restore_fp_context(sc) |
| 1283 | : fpu_emulator_restore_context(sc); | 1273 | : fpu_emulator_restore_context(sc); |
| 1284 | } | 1274 | } |
| @@ -1306,14 +1296,14 @@ static inline void signal_init(void) | |||
| 1306 | /* | 1296 | /* |
| 1307 | * This is used by 32-bit signal stuff on the 64-bit kernel | 1297 | * This is used by 32-bit signal stuff on the 64-bit kernel |
| 1308 | */ | 1298 | */ |
| 1309 | asmlinkage int (*save_fp_context32)(struct sigcontext32 *sc); | 1299 | asmlinkage int (*save_fp_context32)(struct sigcontext32 __user *sc); |
| 1310 | asmlinkage int (*restore_fp_context32)(struct sigcontext32 *sc); | 1300 | asmlinkage int (*restore_fp_context32)(struct sigcontext32 __user *sc); |
| 1311 | 1301 | ||
| 1312 | extern asmlinkage int _save_fp_context32(struct sigcontext32 *sc); | 1302 | extern asmlinkage int _save_fp_context32(struct sigcontext32 __user *sc); |
| 1313 | extern asmlinkage int _restore_fp_context32(struct sigcontext32 *sc); | 1303 | extern asmlinkage int _restore_fp_context32(struct sigcontext32 __user *sc); |
| 1314 | 1304 | ||
| 1315 | extern asmlinkage int fpu_emulator_save_context32(struct sigcontext32 *sc); | 1305 | extern asmlinkage int fpu_emulator_save_context32(struct sigcontext32 __user *sc); |
| 1316 | extern asmlinkage int fpu_emulator_restore_context32(struct sigcontext32 *sc); | 1306 | extern asmlinkage int fpu_emulator_restore_context32(struct sigcontext32 __user *sc); |
| 1317 | 1307 | ||
| 1318 | static inline void signal32_init(void) | 1308 | static inline void signal32_init(void) |
| 1319 | { | 1309 | { |
diff --git a/arch/mips/math-emu/kernel_linkage.c b/arch/mips/math-emu/kernel_linkage.c index 5b3390f64917..ed49ef01ac53 100644 --- a/arch/mips/math-emu/kernel_linkage.c +++ b/arch/mips/math-emu/kernel_linkage.c | |||
| @@ -51,7 +51,7 @@ void fpu_emulator_init_fpu(void) | |||
| 51 | * with appropriate macros from uaccess.h | 51 | * with appropriate macros from uaccess.h |
| 52 | */ | 52 | */ |
| 53 | 53 | ||
| 54 | int fpu_emulator_save_context(struct sigcontext *sc) | 54 | int fpu_emulator_save_context(struct sigcontext __user *sc) |
| 55 | { | 55 | { |
| 56 | int i; | 56 | int i; |
| 57 | int err = 0; | 57 | int err = 0; |
| @@ -65,7 +65,7 @@ int fpu_emulator_save_context(struct sigcontext *sc) | |||
| 65 | return err; | 65 | return err; |
| 66 | } | 66 | } |
| 67 | 67 | ||
| 68 | int fpu_emulator_restore_context(struct sigcontext *sc) | 68 | int fpu_emulator_restore_context(struct sigcontext __user *sc) |
| 69 | { | 69 | { |
| 70 | int i; | 70 | int i; |
| 71 | int err = 0; | 71 | int err = 0; |
| @@ -84,7 +84,7 @@ int fpu_emulator_restore_context(struct sigcontext *sc) | |||
| 84 | * This is the o32 version | 84 | * This is the o32 version |
| 85 | */ | 85 | */ |
| 86 | 86 | ||
| 87 | int fpu_emulator_save_context32(struct sigcontext32 *sc) | 87 | int fpu_emulator_save_context32(struct sigcontext32 __user *sc) |
| 88 | { | 88 | { |
| 89 | int i; | 89 | int i; |
| 90 | int err = 0; | 90 | int err = 0; |
| @@ -98,7 +98,7 @@ int fpu_emulator_save_context32(struct sigcontext32 *sc) | |||
| 98 | return err; | 98 | return err; |
| 99 | } | 99 | } |
| 100 | 100 | ||
| 101 | int fpu_emulator_restore_context32(struct sigcontext32 *sc) | 101 | int fpu_emulator_restore_context32(struct sigcontext32 __user *sc) |
| 102 | { | 102 | { |
| 103 | int i; | 103 | int i; |
| 104 | int err = 0; | 104 | int err = 0; |
diff --git a/arch/powerpc/kernel/udbg_16550.c b/arch/powerpc/kernel/udbg_16550.c index e738f93b42fe..a963f657222b 100644 --- a/arch/powerpc/kernel/udbg_16550.c +++ b/arch/powerpc/kernel/udbg_16550.c | |||
| @@ -184,7 +184,7 @@ void udbg_pas_real_putc(char c) | |||
| 184 | 184 | ||
| 185 | void udbg_init_pas_realmode(void) | 185 | void udbg_init_pas_realmode(void) |
| 186 | { | 186 | { |
| 187 | udbg_comport = (volatile struct NS16550 __iomem *)0xfcff03f8; | 187 | udbg_comport = (volatile struct NS16550 __iomem *)0xfcff03f8UL; |
| 188 | 188 | ||
| 189 | udbg_putc = udbg_pas_real_putc; | 189 | udbg_putc = udbg_pas_real_putc; |
| 190 | udbg_getc = NULL; | 190 | udbg_getc = NULL; |
diff --git a/arch/powerpc/platforms/pasemi/iommu.c b/arch/powerpc/platforms/pasemi/iommu.c index 459a53b7d24d..71dbf1a56e13 100644 --- a/arch/powerpc/platforms/pasemi/iommu.c +++ b/arch/powerpc/platforms/pasemi/iommu.c | |||
| @@ -77,7 +77,7 @@ | |||
| 77 | #define IOBMAP_L2E_V 0x80000000 | 77 | #define IOBMAP_L2E_V 0x80000000 |
| 78 | #define IOBMAP_L2E_V_CACHED 0xc0000000 | 78 | #define IOBMAP_L2E_V_CACHED 0xc0000000 |
| 79 | 79 | ||
| 80 | static u32 *iob; | 80 | static u32 __iomem *iob; |
| 81 | static u32 iob_l1_emptyval; | 81 | static u32 iob_l1_emptyval; |
| 82 | static u32 iob_l2_emptyval; | 82 | static u32 iob_l2_emptyval; |
| 83 | static u32 *iob_l2_base; | 83 | static u32 *iob_l2_base; |
diff --git a/arch/s390/appldata/appldata_mem.c b/arch/s390/appldata/appldata_mem.c index 4ca615788702..697eb30a68a3 100644 --- a/arch/s390/appldata/appldata_mem.c +++ b/arch/s390/appldata/appldata_mem.c | |||
| @@ -117,7 +117,10 @@ static void appldata_get_mem_data(void *data) | |||
| 117 | mem_data->pgpgout = ev[PGPGOUT] >> 1; | 117 | mem_data->pgpgout = ev[PGPGOUT] >> 1; |
| 118 | mem_data->pswpin = ev[PSWPIN]; | 118 | mem_data->pswpin = ev[PSWPIN]; |
| 119 | mem_data->pswpout = ev[PSWPOUT]; | 119 | mem_data->pswpout = ev[PSWPOUT]; |
| 120 | mem_data->pgalloc = ev[PGALLOC_NORMAL] + ev[PGALLOC_DMA]; | 120 | mem_data->pgalloc = ev[PGALLOC_NORMAL]; |
| 121 | #ifdef CONFIG_ZONE_DMA | ||
| 122 | mem_data->pgalloc += ev[PGALLOC_DMA]; | ||
| 123 | #endif | ||
| 121 | mem_data->pgfault = ev[PGFAULT]; | 124 | mem_data->pgfault = ev[PGFAULT]; |
| 122 | mem_data->pgmajfault = ev[PGMAJFAULT]; | 125 | mem_data->pgmajfault = ev[PGMAJFAULT]; |
| 123 | 126 | ||
diff --git a/arch/sparc/mm/init.c b/arch/sparc/mm/init.c index c85ddf312747..a532922e2e35 100644 --- a/arch/sparc/mm/init.c +++ b/arch/sparc/mm/init.c | |||
| @@ -75,7 +75,7 @@ void show_mem(void) | |||
| 75 | printk("Free swap: %6ldkB\n", | 75 | printk("Free swap: %6ldkB\n", |
| 76 | nr_swap_pages << (PAGE_SHIFT-10)); | 76 | nr_swap_pages << (PAGE_SHIFT-10)); |
| 77 | printk("%ld pages of RAM\n", totalram_pages); | 77 | printk("%ld pages of RAM\n", totalram_pages); |
| 78 | printk("%d free pages\n", nr_free_pages()); | 78 | printk("%ld free pages\n", nr_free_pages()); |
| 79 | #if 0 /* undefined pgtable_cache_size, pgd_cache_size */ | 79 | #if 0 /* undefined pgtable_cache_size, pgd_cache_size */ |
| 80 | printk("%ld pages in page table cache\n",pgtable_cache_size); | 80 | printk("%ld pages in page table cache\n",pgtable_cache_size); |
| 81 | #ifndef CONFIG_SMP | 81 | #ifndef CONFIG_SMP |
diff --git a/arch/sparc64/Kconfig b/arch/sparc64/Kconfig index f75a686ba644..1a6348b565fb 100644 --- a/arch/sparc64/Kconfig +++ b/arch/sparc64/Kconfig | |||
| @@ -136,18 +136,6 @@ config SMP | |||
| 136 | 136 | ||
| 137 | If you don't know what to do here, say N. | 137 | If you don't know what to do here, say N. |
| 138 | 138 | ||
| 139 | config PREEMPT | ||
| 140 | bool "Preemptible Kernel" | ||
| 141 | help | ||
| 142 | This option reduces the latency of the kernel when reacting to | ||
| 143 | real-time or interactive events by allowing a low priority process to | ||
| 144 | be preempted even if it is in kernel mode executing a system call. | ||
| 145 | This allows applications to run more reliably even when the system is | ||
| 146 | under load. | ||
| 147 | |||
| 148 | Say Y here if you are building a kernel for a desktop, embedded | ||
| 149 | or real-time system. Say N if you are unsure. | ||
| 150 | |||
| 151 | config NR_CPUS | 139 | config NR_CPUS |
| 152 | int "Maximum number of CPUs (2-64)" | 140 | int "Maximum number of CPUs (2-64)" |
| 153 | range 2 64 | 141 | range 2 64 |
| @@ -399,6 +387,8 @@ config SCHED_SMT | |||
| 399 | when dealing with UltraSPARC cpus at a cost of slightly increased | 387 | when dealing with UltraSPARC cpus at a cost of slightly increased |
| 400 | overhead in some places. If unsure say N here. | 388 | overhead in some places. If unsure say N here. |
| 401 | 389 | ||
| 390 | source "kernel/Kconfig.preempt" | ||
| 391 | |||
| 402 | config CMDLINE_BOOL | 392 | config CMDLINE_BOOL |
| 403 | bool "Default bootloader kernel arguments" | 393 | bool "Default bootloader kernel arguments" |
| 404 | 394 | ||
diff --git a/arch/sparc64/defconfig b/arch/sparc64/defconfig index 860b8b60526c..120c9c33b7a6 100644 --- a/arch/sparc64/defconfig +++ b/arch/sparc64/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.21-rc2 | 3 | # Linux kernel version: 2.6.21-rc4 |
| 4 | # Wed Feb 28 09:50:51 2007 | 4 | # Sat Mar 17 14:18:44 2007 |
| 5 | # | 5 | # |
| 6 | CONFIG_SPARC=y | 6 | CONFIG_SPARC=y |
| 7 | CONFIG_SPARC64=y | 7 | CONFIG_SPARC64=y |
| @@ -50,6 +50,7 @@ CONFIG_POSIX_MQUEUE=y | |||
| 50 | # CONFIG_IKCONFIG is not set | 50 | # CONFIG_IKCONFIG is not set |
| 51 | CONFIG_SYSFS_DEPRECATED=y | 51 | CONFIG_SYSFS_DEPRECATED=y |
| 52 | CONFIG_RELAY=y | 52 | CONFIG_RELAY=y |
| 53 | # CONFIG_BLK_DEV_INITRD is not set | ||
| 53 | CONFIG_CC_OPTIMIZE_FOR_SIZE=y | 54 | CONFIG_CC_OPTIMIZE_FOR_SIZE=y |
| 54 | CONFIG_SYSCTL=y | 55 | CONFIG_SYSCTL=y |
| 55 | # CONFIG_EMBEDDED is not set | 56 | # CONFIG_EMBEDDED is not set |
| @@ -108,7 +109,6 @@ CONFIG_GENERIC_HARDIRQS=y | |||
| 108 | # General machine setup | 109 | # General machine setup |
| 109 | # | 110 | # |
| 110 | # CONFIG_SMP is not set | 111 | # CONFIG_SMP is not set |
| 111 | # CONFIG_PREEMPT is not set | ||
| 112 | CONFIG_CPU_FREQ=y | 112 | CONFIG_CPU_FREQ=y |
| 113 | CONFIG_CPU_FREQ_TABLE=m | 113 | CONFIG_CPU_FREQ_TABLE=m |
| 114 | # CONFIG_CPU_FREQ_DEBUG is not set | 114 | # CONFIG_CPU_FREQ_DEBUG is not set |
| @@ -165,6 +165,9 @@ CONFIG_BINFMT_ELF32=y | |||
| 165 | CONFIG_BINFMT_ELF=y | 165 | CONFIG_BINFMT_ELF=y |
| 166 | CONFIG_BINFMT_MISC=m | 166 | CONFIG_BINFMT_MISC=m |
| 167 | CONFIG_SOLARIS_EMUL=y | 167 | CONFIG_SOLARIS_EMUL=y |
| 168 | # CONFIG_PREEMPT_NONE is not set | ||
| 169 | CONFIG_PREEMPT_VOLUNTARY=y | ||
| 170 | # CONFIG_PREEMPT is not set | ||
| 168 | # CONFIG_CMDLINE_BOOL is not set | 171 | # CONFIG_CMDLINE_BOOL is not set |
| 169 | 172 | ||
| 170 | # | 173 | # |
| @@ -340,7 +343,6 @@ CONFIG_BLK_DEV_NBD=m | |||
| 340 | # CONFIG_BLK_DEV_SX8 is not set | 343 | # CONFIG_BLK_DEV_SX8 is not set |
| 341 | # CONFIG_BLK_DEV_UB is not set | 344 | # CONFIG_BLK_DEV_UB is not set |
| 342 | # CONFIG_BLK_DEV_RAM is not set | 345 | # CONFIG_BLK_DEV_RAM is not set |
| 343 | # CONFIG_BLK_DEV_INITRD is not set | ||
| 344 | CONFIG_CDROM_PKTCDVD=m | 346 | CONFIG_CDROM_PKTCDVD=m |
| 345 | CONFIG_CDROM_PKTCDVD_BUFFERS=8 | 347 | CONFIG_CDROM_PKTCDVD_BUFFERS=8 |
| 346 | CONFIG_CDROM_PKTCDVD_WCACHE=y | 348 | CONFIG_CDROM_PKTCDVD_WCACHE=y |
diff --git a/arch/sparc64/kernel/ktlb.S b/arch/sparc64/kernel/ktlb.S index e492db845ea3..d4024ac0d619 100644 --- a/arch/sparc64/kernel/ktlb.S +++ b/arch/sparc64/kernel/ktlb.S | |||
| @@ -138,9 +138,15 @@ kvmap_dtlb_4v: | |||
| 138 | brgez,pn %g4, kvmap_dtlb_nonlinear | 138 | brgez,pn %g4, kvmap_dtlb_nonlinear |
| 139 | nop | 139 | nop |
| 140 | 140 | ||
| 141 | #ifdef CONFIG_DEBUG_PAGEALLOC | ||
| 142 | /* Index through the base page size TSB even for linear | ||
| 143 | * mappings when using page allocation debugging. | ||
| 144 | */ | ||
| 145 | KERN_TSB_LOOKUP_TL1(%g4, %g6, %g5, %g1, %g2, %g3, kvmap_dtlb_load) | ||
| 146 | #else | ||
| 141 | /* Correct TAG_TARGET is already in %g6, check 4mb TSB. */ | 147 | /* Correct TAG_TARGET is already in %g6, check 4mb TSB. */ |
| 142 | KERN_TSB4M_LOOKUP_TL1(%g6, %g5, %g1, %g2, %g3, kvmap_dtlb_load) | 148 | KERN_TSB4M_LOOKUP_TL1(%g6, %g5, %g1, %g2, %g3, kvmap_dtlb_load) |
| 143 | 149 | #endif | |
| 144 | /* TSB entry address left in %g1, lookup linear PTE. | 150 | /* TSB entry address left in %g1, lookup linear PTE. |
| 145 | * Must preserve %g1 and %g6 (TAG). | 151 | * Must preserve %g1 and %g6 (TAG). |
| 146 | */ | 152 | */ |
diff --git a/arch/sparc64/mm/init.c b/arch/sparc64/mm/init.c index b1a1ee0cc6bd..f146071a4b2a 100644 --- a/arch/sparc64/mm/init.c +++ b/arch/sparc64/mm/init.c | |||
| @@ -59,8 +59,10 @@ unsigned long kern_linear_pte_xor[2] __read_mostly; | |||
| 59 | */ | 59 | */ |
| 60 | unsigned long kpte_linear_bitmap[KPTE_BITMAP_BYTES / sizeof(unsigned long)]; | 60 | unsigned long kpte_linear_bitmap[KPTE_BITMAP_BYTES / sizeof(unsigned long)]; |
| 61 | 61 | ||
| 62 | #ifndef CONFIG_DEBUG_PAGEALLOC | ||
| 62 | /* A special kernel TSB for 4MB and 256MB linear mappings. */ | 63 | /* A special kernel TSB for 4MB and 256MB linear mappings. */ |
| 63 | struct tsb swapper_4m_tsb[KERNEL_TSB4M_NENTRIES]; | 64 | struct tsb swapper_4m_tsb[KERNEL_TSB4M_NENTRIES]; |
| 65 | #endif | ||
| 64 | 66 | ||
| 65 | #define MAX_BANKS 32 | 67 | #define MAX_BANKS 32 |
| 66 | 68 | ||
| @@ -1301,7 +1303,12 @@ static void __init tsb_phys_patch(void) | |||
| 1301 | } | 1303 | } |
| 1302 | 1304 | ||
| 1303 | /* Don't mark as init, we give this to the Hypervisor. */ | 1305 | /* Don't mark as init, we give this to the Hypervisor. */ |
| 1304 | static struct hv_tsb_descr ktsb_descr[2]; | 1306 | #ifndef CONFIG_DEBUG_PAGEALLOC |
| 1307 | #define NUM_KTSB_DESCR 2 | ||
| 1308 | #else | ||
| 1309 | #define NUM_KTSB_DESCR 1 | ||
| 1310 | #endif | ||
| 1311 | static struct hv_tsb_descr ktsb_descr[NUM_KTSB_DESCR]; | ||
| 1305 | extern struct tsb swapper_tsb[KERNEL_TSB_NENTRIES]; | 1312 | extern struct tsb swapper_tsb[KERNEL_TSB_NENTRIES]; |
| 1306 | 1313 | ||
| 1307 | static void __init sun4v_ktsb_init(void) | 1314 | static void __init sun4v_ktsb_init(void) |
| @@ -1340,6 +1347,7 @@ static void __init sun4v_ktsb_init(void) | |||
| 1340 | ktsb_descr[0].tsb_base = ktsb_pa; | 1347 | ktsb_descr[0].tsb_base = ktsb_pa; |
| 1341 | ktsb_descr[0].resv = 0; | 1348 | ktsb_descr[0].resv = 0; |
| 1342 | 1349 | ||
| 1350 | #ifndef CONFIG_DEBUG_PAGEALLOC | ||
| 1343 | /* Second KTSB for 4MB/256MB mappings. */ | 1351 | /* Second KTSB for 4MB/256MB mappings. */ |
| 1344 | ktsb_pa = (kern_base + | 1352 | ktsb_pa = (kern_base + |
| 1345 | ((unsigned long)&swapper_4m_tsb[0] - KERNBASE)); | 1353 | ((unsigned long)&swapper_4m_tsb[0] - KERNBASE)); |
| @@ -1352,6 +1360,7 @@ static void __init sun4v_ktsb_init(void) | |||
| 1352 | ktsb_descr[1].ctx_idx = 0; | 1360 | ktsb_descr[1].ctx_idx = 0; |
| 1353 | ktsb_descr[1].tsb_base = ktsb_pa; | 1361 | ktsb_descr[1].tsb_base = ktsb_pa; |
| 1354 | ktsb_descr[1].resv = 0; | 1362 | ktsb_descr[1].resv = 0; |
| 1363 | #endif | ||
| 1355 | } | 1364 | } |
| 1356 | 1365 | ||
| 1357 | void __cpuinit sun4v_ktsb_register(void) | 1366 | void __cpuinit sun4v_ktsb_register(void) |
| @@ -1364,7 +1373,7 @@ void __cpuinit sun4v_ktsb_register(void) | |||
| 1364 | pa = kern_base + ((unsigned long)&ktsb_descr[0] - KERNBASE); | 1373 | pa = kern_base + ((unsigned long)&ktsb_descr[0] - KERNBASE); |
| 1365 | 1374 | ||
| 1366 | func = HV_FAST_MMU_TSB_CTX0; | 1375 | func = HV_FAST_MMU_TSB_CTX0; |
| 1367 | arg0 = 2; | 1376 | arg0 = NUM_KTSB_DESCR; |
| 1368 | arg1 = pa; | 1377 | arg1 = pa; |
| 1369 | __asm__ __volatile__("ta %6" | 1378 | __asm__ __volatile__("ta %6" |
| 1370 | : "=&r" (func), "=&r" (arg0), "=&r" (arg1) | 1379 | : "=&r" (func), "=&r" (arg0), "=&r" (arg1) |
| @@ -1393,7 +1402,9 @@ void __init paging_init(void) | |||
| 1393 | 1402 | ||
| 1394 | /* Invalidate both kernel TSBs. */ | 1403 | /* Invalidate both kernel TSBs. */ |
| 1395 | memset(swapper_tsb, 0x40, sizeof(swapper_tsb)); | 1404 | memset(swapper_tsb, 0x40, sizeof(swapper_tsb)); |
| 1405 | #ifndef CONFIG_DEBUG_PAGEALLOC | ||
| 1396 | memset(swapper_4m_tsb, 0x40, sizeof(swapper_4m_tsb)); | 1406 | memset(swapper_4m_tsb, 0x40, sizeof(swapper_4m_tsb)); |
| 1407 | #endif | ||
| 1397 | 1408 | ||
| 1398 | if (tlb_type == hypervisor) | 1409 | if (tlb_type == hypervisor) |
| 1399 | sun4v_pgprot_init(); | 1410 | sun4v_pgprot_init(); |
| @@ -1725,8 +1736,13 @@ static void __init sun4u_pgprot_init(void) | |||
| 1725 | pg_iobits = (_PAGE_VALID | _PAGE_PRESENT_4U | __DIRTY_BITS_4U | | 1736 | pg_iobits = (_PAGE_VALID | _PAGE_PRESENT_4U | __DIRTY_BITS_4U | |
| 1726 | __ACCESS_BITS_4U | _PAGE_E_4U); | 1737 | __ACCESS_BITS_4U | _PAGE_E_4U); |
| 1727 | 1738 | ||
| 1739 | #ifdef CONFIG_DEBUG_PAGEALLOC | ||
| 1740 | kern_linear_pte_xor[0] = (_PAGE_VALID | _PAGE_SZBITS_4U) ^ | ||
| 1741 | 0xfffff80000000000; | ||
| 1742 | #else | ||
| 1728 | kern_linear_pte_xor[0] = (_PAGE_VALID | _PAGE_SZ4MB_4U) ^ | 1743 | kern_linear_pte_xor[0] = (_PAGE_VALID | _PAGE_SZ4MB_4U) ^ |
| 1729 | 0xfffff80000000000; | 1744 | 0xfffff80000000000; |
| 1745 | #endif | ||
| 1730 | kern_linear_pte_xor[0] |= (_PAGE_CP_4U | _PAGE_CV_4U | | 1746 | kern_linear_pte_xor[0] |= (_PAGE_CP_4U | _PAGE_CV_4U | |
| 1731 | _PAGE_P_4U | _PAGE_W_4U); | 1747 | _PAGE_P_4U | _PAGE_W_4U); |
| 1732 | 1748 | ||
| @@ -1769,13 +1785,23 @@ static void __init sun4v_pgprot_init(void) | |||
| 1769 | _PAGE_E = _PAGE_E_4V; | 1785 | _PAGE_E = _PAGE_E_4V; |
| 1770 | _PAGE_CACHE = _PAGE_CACHE_4V; | 1786 | _PAGE_CACHE = _PAGE_CACHE_4V; |
| 1771 | 1787 | ||
| 1788 | #ifdef CONFIG_DEBUG_PAGEALLOC | ||
| 1789 | kern_linear_pte_xor[0] = (_PAGE_VALID | _PAGE_SZBITS_4V) ^ | ||
| 1790 | 0xfffff80000000000; | ||
| 1791 | #else | ||
| 1772 | kern_linear_pte_xor[0] = (_PAGE_VALID | _PAGE_SZ4MB_4V) ^ | 1792 | kern_linear_pte_xor[0] = (_PAGE_VALID | _PAGE_SZ4MB_4V) ^ |
| 1773 | 0xfffff80000000000; | 1793 | 0xfffff80000000000; |
| 1794 | #endif | ||
| 1774 | kern_linear_pte_xor[0] |= (_PAGE_CP_4V | _PAGE_CV_4V | | 1795 | kern_linear_pte_xor[0] |= (_PAGE_CP_4V | _PAGE_CV_4V | |
| 1775 | _PAGE_P_4V | _PAGE_W_4V); | 1796 | _PAGE_P_4V | _PAGE_W_4V); |
| 1776 | 1797 | ||
| 1798 | #ifdef CONFIG_DEBUG_PAGEALLOC | ||
| 1799 | kern_linear_pte_xor[1] = (_PAGE_VALID | _PAGE_SZBITS_4V) ^ | ||
| 1800 | 0xfffff80000000000; | ||
| 1801 | #else | ||
| 1777 | kern_linear_pte_xor[1] = (_PAGE_VALID | _PAGE_SZ256MB_4V) ^ | 1802 | kern_linear_pte_xor[1] = (_PAGE_VALID | _PAGE_SZ256MB_4V) ^ |
| 1778 | 0xfffff80000000000; | 1803 | 0xfffff80000000000; |
| 1804 | #endif | ||
| 1779 | kern_linear_pte_xor[1] |= (_PAGE_CP_4V | _PAGE_CV_4V | | 1805 | kern_linear_pte_xor[1] |= (_PAGE_CP_4V | _PAGE_CV_4V | |
| 1780 | _PAGE_P_4V | _PAGE_W_4V); | 1806 | _PAGE_P_4V | _PAGE_W_4V); |
| 1781 | 1807 | ||
diff --git a/arch/um/Kconfig b/arch/um/Kconfig index b3a21ba77cd2..354cc6b70530 100644 --- a/arch/um/Kconfig +++ b/arch/um/Kconfig | |||
| @@ -44,7 +44,7 @@ config LOCKDEP_SUPPORT | |||
| 44 | 44 | ||
| 45 | config STACKTRACE_SUPPORT | 45 | config STACKTRACE_SUPPORT |
| 46 | bool | 46 | bool |
| 47 | default y | 47 | default n |
| 48 | 48 | ||
| 49 | config GENERIC_CALIBRATE_DELAY | 49 | config GENERIC_CALIBRATE_DELAY |
| 50 | bool | 50 | bool |
diff --git a/arch/um/scripts/Makefile.rules b/arch/um/scripts/Makefile.rules index 813077fb1e5b..a9a4b85ca516 100644 --- a/arch/um/scripts/Makefile.rules +++ b/arch/um/scripts/Makefile.rules | |||
| @@ -10,7 +10,7 @@ USER_OBJS := $(foreach file,$(USER_OBJS),$(obj)/$(file)) | |||
| 10 | $(USER_OBJS:.o=.%): \ | 10 | $(USER_OBJS:.o=.%): \ |
| 11 | c_flags = -Wp,-MD,$(depfile) $(USER_CFLAGS) $(CFLAGS_$(basetarget).o) | 11 | c_flags = -Wp,-MD,$(depfile) $(USER_CFLAGS) $(CFLAGS_$(basetarget).o) |
| 12 | $(USER_OBJS) : CHECKFLAGS := -D__linux__ -Dlinux -D__STDC__ \ | 12 | $(USER_OBJS) : CHECKFLAGS := -D__linux__ -Dlinux -D__STDC__ \ |
| 13 | -Dunix -D__unix__ -D__$(SUBARCH)__ | 13 | -Dunix -D__unix__ -D__$(SUBARCH)__ $(CF) |
| 14 | 14 | ||
| 15 | # These are like USER_OBJS but filter USER_CFLAGS through unprofile instead of | 15 | # These are like USER_OBJS but filter USER_CFLAGS through unprofile instead of |
| 16 | # using it directly. | 16 | # using it directly. |
| @@ -19,7 +19,7 @@ UNPROFILE_OBJS := $(foreach file,$(UNPROFILE_OBJS),$(obj)/$(file)) | |||
| 19 | $(UNPROFILE_OBJS:.o=.%): \ | 19 | $(UNPROFILE_OBJS:.o=.%): \ |
| 20 | c_flags = -Wp,-MD,$(depfile) $(call unprofile,$(USER_CFLAGS)) $(CFLAGS_$(basetarget).o) | 20 | c_flags = -Wp,-MD,$(depfile) $(call unprofile,$(USER_CFLAGS)) $(CFLAGS_$(basetarget).o) |
| 21 | $(UNPROFILE_OBJS) : CHECKFLAGS := -D__linux__ -Dlinux -D__STDC__ \ | 21 | $(UNPROFILE_OBJS) : CHECKFLAGS := -D__linux__ -Dlinux -D__STDC__ \ |
| 22 | -Dunix -D__unix__ -D__$(SUBARCH)__ | 22 | -Dunix -D__unix__ -D__$(SUBARCH)__ $(CF) |
| 23 | 23 | ||
| 24 | # The stubs and unmap.o can't try to call mcount or update basic block data | 24 | # The stubs and unmap.o can't try to call mcount or update basic block data |
| 25 | define unprofile | 25 | define unprofile |
diff --git a/arch/x86_64/defconfig b/arch/x86_64/defconfig index 293a4a4c609e..7a1e251e333d 100644 --- a/arch/x86_64/defconfig +++ b/arch/x86_64/defconfig | |||
| @@ -1,11 +1,13 @@ | |||
| 1 | # | 1 | # |
| 2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
| 3 | # Linux kernel version: 2.6.20-git8 | 3 | # Linux kernel version: 2.6.21-rc3 |
| 4 | # Tue Feb 13 11:25:16 2007 | 4 | # Wed Mar 7 15:29:47 2007 |
| 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_GENERIC_TIME=y | ||
| 10 | CONFIG_GENERIC_TIME_VSYSCALL=y | ||
| 9 | CONFIG_ZONE_DMA32=y | 11 | CONFIG_ZONE_DMA32=y |
| 10 | CONFIG_LOCKDEP_SUPPORT=y | 12 | CONFIG_LOCKDEP_SUPPORT=y |
| 11 | CONFIG_STACKTRACE_SUPPORT=y | 13 | CONFIG_STACKTRACE_SUPPORT=y |
| @@ -43,6 +45,7 @@ CONFIG_LOCALVERSION_AUTO=y | |||
| 43 | CONFIG_SWAP=y | 45 | CONFIG_SWAP=y |
| 44 | CONFIG_SYSVIPC=y | 46 | CONFIG_SYSVIPC=y |
| 45 | # CONFIG_IPC_NS is not set | 47 | # CONFIG_IPC_NS is not set |
| 48 | CONFIG_SYSVIPC_SYSCTL=y | ||
| 46 | CONFIG_POSIX_MQUEUE=y | 49 | CONFIG_POSIX_MQUEUE=y |
| 47 | # CONFIG_BSD_PROCESS_ACCT is not set | 50 | # CONFIG_BSD_PROCESS_ACCT is not set |
| 48 | # CONFIG_TASKSTATS is not set | 51 | # CONFIG_TASKSTATS is not set |
| @@ -53,6 +56,7 @@ CONFIG_IKCONFIG_PROC=y | |||
| 53 | # CONFIG_CPUSETS is not set | 56 | # CONFIG_CPUSETS is not set |
| 54 | CONFIG_SYSFS_DEPRECATED=y | 57 | CONFIG_SYSFS_DEPRECATED=y |
| 55 | # CONFIG_RELAY is not set | 58 | # CONFIG_RELAY is not set |
| 59 | CONFIG_BLK_DEV_INITRD=y | ||
| 56 | CONFIG_INITRAMFS_SOURCE="" | 60 | CONFIG_INITRAMFS_SOURCE="" |
| 57 | CONFIG_CC_OPTIMIZE_FOR_SIZE=y | 61 | CONFIG_CC_OPTIMIZE_FOR_SIZE=y |
| 58 | CONFIG_SYSCTL=y | 62 | CONFIG_SYSCTL=y |
| @@ -114,11 +118,11 @@ CONFIG_X86_PC=y | |||
| 114 | # CONFIG_X86_VSMP is not set | 118 | # CONFIG_X86_VSMP is not set |
| 115 | # CONFIG_MK8 is not set | 119 | # CONFIG_MK8 is not set |
| 116 | # CONFIG_MPSC is not set | 120 | # CONFIG_MPSC is not set |
| 117 | CONFIG_MCORE2=y | 121 | # CONFIG_MCORE2 is not set |
| 118 | # CONFIG_GENERIC_CPU is not set | 122 | CONFIG_GENERIC_CPU=y |
| 119 | CONFIG_X86_L1_CACHE_BYTES=64 | 123 | CONFIG_X86_L1_CACHE_BYTES=128 |
| 120 | CONFIG_X86_L1_CACHE_SHIFT=6 | 124 | CONFIG_X86_L1_CACHE_SHIFT=7 |
| 121 | CONFIG_X86_INTERNODE_CACHE_BYTES=64 | 125 | CONFIG_X86_INTERNODE_CACHE_BYTES=128 |
| 122 | CONFIG_X86_TSC=y | 126 | CONFIG_X86_TSC=y |
| 123 | CONFIG_X86_GOOD_APIC=y | 127 | CONFIG_X86_GOOD_APIC=y |
| 124 | # CONFIG_MICROCODE is not set | 128 | # CONFIG_MICROCODE is not set |
| @@ -207,10 +211,8 @@ CONFIG_ACPI_PROCFS=y | |||
| 207 | CONFIG_ACPI_AC=y | 211 | CONFIG_ACPI_AC=y |
| 208 | CONFIG_ACPI_BATTERY=y | 212 | CONFIG_ACPI_BATTERY=y |
| 209 | CONFIG_ACPI_BUTTON=y | 213 | CONFIG_ACPI_BUTTON=y |
| 210 | # CONFIG_ACPI_HOTKEY is not set | ||
| 211 | CONFIG_ACPI_FAN=y | 214 | CONFIG_ACPI_FAN=y |
| 212 | # CONFIG_ACPI_DOCK is not set | 215 | # CONFIG_ACPI_DOCK is not set |
| 213 | # CONFIG_ACPI_BAY is not set | ||
| 214 | CONFIG_ACPI_PROCESSOR=y | 216 | CONFIG_ACPI_PROCESSOR=y |
| 215 | CONFIG_ACPI_HOTPLUG_CPU=y | 217 | CONFIG_ACPI_HOTPLUG_CPU=y |
| 216 | CONFIG_ACPI_THERMAL=y | 218 | CONFIG_ACPI_THERMAL=y |
| @@ -319,7 +321,7 @@ CONFIG_IP_PNP_DHCP=y | |||
| 319 | # CONFIG_INET_ESP is not set | 321 | # CONFIG_INET_ESP is not set |
| 320 | # CONFIG_INET_IPCOMP is not set | 322 | # CONFIG_INET_IPCOMP is not set |
| 321 | # CONFIG_INET_XFRM_TUNNEL is not set | 323 | # CONFIG_INET_XFRM_TUNNEL is not set |
| 322 | # CONFIG_INET_TUNNEL is not set | 324 | CONFIG_INET_TUNNEL=y |
| 323 | # CONFIG_INET_XFRM_MODE_TRANSPORT is not set | 325 | # CONFIG_INET_XFRM_MODE_TRANSPORT is not set |
| 324 | # CONFIG_INET_XFRM_MODE_TUNNEL is not set | 326 | # CONFIG_INET_XFRM_MODE_TUNNEL is not set |
| 325 | # CONFIG_INET_XFRM_MODE_BEET is not set | 327 | # CONFIG_INET_XFRM_MODE_BEET is not set |
| @@ -421,7 +423,13 @@ CONFIG_FW_LOADER=y | |||
| 421 | # | 423 | # |
| 422 | # Plug and Play support | 424 | # Plug and Play support |
| 423 | # | 425 | # |
| 424 | # CONFIG_PNP is not set | 426 | CONFIG_PNP=y |
| 427 | # CONFIG_PNP_DEBUG is not set | ||
| 428 | |||
| 429 | # | ||
| 430 | # Protocols | ||
| 431 | # | ||
| 432 | CONFIG_PNPACPI=y | ||
| 425 | 433 | ||
| 426 | # | 434 | # |
| 427 | # Block devices | 435 | # Block devices |
| @@ -441,7 +449,6 @@ CONFIG_BLK_DEV_RAM=y | |||
| 441 | CONFIG_BLK_DEV_RAM_COUNT=16 | 449 | CONFIG_BLK_DEV_RAM_COUNT=16 |
| 442 | CONFIG_BLK_DEV_RAM_SIZE=4096 | 450 | CONFIG_BLK_DEV_RAM_SIZE=4096 |
| 443 | CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024 | 451 | CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024 |
| 444 | CONFIG_BLK_DEV_INITRD=y | ||
| 445 | # CONFIG_CDROM_PKTCDVD is not set | 452 | # CONFIG_CDROM_PKTCDVD is not set |
| 446 | # CONFIG_ATA_OVER_ETH is not set | 453 | # CONFIG_ATA_OVER_ETH is not set |
| 447 | 454 | ||
| @@ -451,6 +458,7 @@ CONFIG_BLK_DEV_INITRD=y | |||
| 451 | # CONFIG_IBM_ASM is not set | 458 | # CONFIG_IBM_ASM is not set |
| 452 | # CONFIG_SGI_IOC4 is not set | 459 | # CONFIG_SGI_IOC4 is not set |
| 453 | # CONFIG_TIFM_CORE is not set | 460 | # CONFIG_TIFM_CORE is not set |
| 461 | # CONFIG_SONY_LAPTOP is not set | ||
| 454 | 462 | ||
| 455 | # | 463 | # |
| 456 | # ATA/ATAPI/MFM/RLL support | 464 | # ATA/ATAPI/MFM/RLL support |
| @@ -477,6 +485,7 @@ CONFIG_BLK_DEV_IDEACPI=y | |||
| 477 | # | 485 | # |
| 478 | CONFIG_IDE_GENERIC=y | 486 | CONFIG_IDE_GENERIC=y |
| 479 | # CONFIG_BLK_DEV_CMD640 is not set | 487 | # CONFIG_BLK_DEV_CMD640 is not set |
| 488 | # CONFIG_BLK_DEV_IDEPNP is not set | ||
| 480 | CONFIG_BLK_DEV_IDEPCI=y | 489 | CONFIG_BLK_DEV_IDEPCI=y |
| 481 | # CONFIG_IDEPCI_SHARE_IRQ is not set | 490 | # CONFIG_IDEPCI_SHARE_IRQ is not set |
| 482 | # CONFIG_BLK_DEV_OFFBOARD is not set | 491 | # CONFIG_BLK_DEV_OFFBOARD is not set |
| @@ -623,6 +632,7 @@ CONFIG_SATA_VIA=y | |||
| 623 | # CONFIG_SATA_VITESSE is not set | 632 | # CONFIG_SATA_VITESSE is not set |
| 624 | # CONFIG_SATA_INIC162X is not set | 633 | # CONFIG_SATA_INIC162X is not set |
| 625 | CONFIG_SATA_INTEL_COMBINED=y | 634 | CONFIG_SATA_INTEL_COMBINED=y |
| 635 | CONFIG_SATA_ACPI=y | ||
| 626 | # CONFIG_PATA_ALI is not set | 636 | # CONFIG_PATA_ALI is not set |
| 627 | # CONFIG_PATA_AMD is not set | 637 | # CONFIG_PATA_AMD is not set |
| 628 | # CONFIG_PATA_ARTOP is not set | 638 | # CONFIG_PATA_ARTOP is not set |
| @@ -726,6 +736,7 @@ CONFIG_NETDEVICES=y | |||
| 726 | # CONFIG_BONDING is not set | 736 | # CONFIG_BONDING is not set |
| 727 | # CONFIG_EQUALIZER is not set | 737 | # CONFIG_EQUALIZER is not set |
| 728 | CONFIG_TUN=y | 738 | CONFIG_TUN=y |
| 739 | # CONFIG_NET_SB1000 is not set | ||
| 729 | 740 | ||
| 730 | # | 741 | # |
| 731 | # ARCnet devices | 742 | # ARCnet devices |
| @@ -920,6 +931,7 @@ CONFIG_HW_CONSOLE=y | |||
| 920 | CONFIG_SERIAL_8250=y | 931 | CONFIG_SERIAL_8250=y |
| 921 | CONFIG_SERIAL_8250_CONSOLE=y | 932 | CONFIG_SERIAL_8250_CONSOLE=y |
| 922 | CONFIG_SERIAL_8250_PCI=y | 933 | CONFIG_SERIAL_8250_PCI=y |
| 934 | CONFIG_SERIAL_8250_PNP=y | ||
| 923 | CONFIG_SERIAL_8250_NR_UARTS=4 | 935 | CONFIG_SERIAL_8250_NR_UARTS=4 |
| 924 | CONFIG_SERIAL_8250_RUNTIME_UARTS=4 | 936 | CONFIG_SERIAL_8250_RUNTIME_UARTS=4 |
| 925 | # CONFIG_SERIAL_8250_EXTENDED is not set | 937 | # CONFIG_SERIAL_8250_EXTENDED is not set |
| @@ -1001,6 +1013,7 @@ CONFIG_I2C_ISA=m | |||
| 1001 | # CONFIG_I2C_NFORCE2 is not set | 1013 | # CONFIG_I2C_NFORCE2 is not set |
| 1002 | # CONFIG_I2C_OCORES is not set | 1014 | # CONFIG_I2C_OCORES is not set |
| 1003 | # CONFIG_I2C_PARPORT_LIGHT is not set | 1015 | # CONFIG_I2C_PARPORT_LIGHT is not set |
| 1016 | # CONFIG_I2C_PASEMI is not set | ||
| 1004 | # CONFIG_I2C_PROSAVAGE is not set | 1017 | # CONFIG_I2C_PROSAVAGE is not set |
| 1005 | # CONFIG_I2C_SAVAGE4 is not set | 1018 | # CONFIG_I2C_SAVAGE4 is not set |
| 1006 | # CONFIG_I2C_SIS5595 is not set | 1019 | # CONFIG_I2C_SIS5595 is not set |
| @@ -1047,6 +1060,7 @@ CONFIG_HWMON=y | |||
| 1047 | # CONFIG_SENSORS_ADM1021 is not set | 1060 | # CONFIG_SENSORS_ADM1021 is not set |
| 1048 | # CONFIG_SENSORS_ADM1025 is not set | 1061 | # CONFIG_SENSORS_ADM1025 is not set |
| 1049 | # CONFIG_SENSORS_ADM1026 is not set | 1062 | # CONFIG_SENSORS_ADM1026 is not set |
| 1063 | # CONFIG_SENSORS_ADM1029 is not set | ||
| 1050 | # CONFIG_SENSORS_ADM1031 is not set | 1064 | # CONFIG_SENSORS_ADM1031 is not set |
| 1051 | # CONFIG_SENSORS_ADM9240 is not set | 1065 | # CONFIG_SENSORS_ADM9240 is not set |
| 1052 | # CONFIG_SENSORS_K8TEMP is not set | 1066 | # CONFIG_SENSORS_K8TEMP is not set |
| @@ -1090,6 +1104,11 @@ CONFIG_SENSORS_SMSC47B397=m | |||
| 1090 | # CONFIG_HWMON_DEBUG_CHIP is not set | 1104 | # CONFIG_HWMON_DEBUG_CHIP is not set |
| 1091 | 1105 | ||
| 1092 | # | 1106 | # |
| 1107 | # Multifunction device drivers | ||
| 1108 | # | ||
| 1109 | # CONFIG_MFD_SM501 is not set | ||
| 1110 | |||
| 1111 | # | ||
| 1093 | # Multimedia devices | 1112 | # Multimedia devices |
| 1094 | # | 1113 | # |
| 1095 | # CONFIG_VIDEO_DEV is not set | 1114 | # CONFIG_VIDEO_DEV is not set |
| @@ -1103,7 +1122,7 @@ CONFIG_SENSORS_SMSC47B397=m | |||
| 1103 | # | 1122 | # |
| 1104 | # Graphics support | 1123 | # Graphics support |
| 1105 | # | 1124 | # |
| 1106 | # CONFIG_FIRMWARE_EDID is not set | 1125 | # CONFIG_BACKLIGHT_LCD_SUPPORT is not set |
| 1107 | # CONFIG_FB is not set | 1126 | # CONFIG_FB is not set |
| 1108 | 1127 | ||
| 1109 | # | 1128 | # |
| @@ -1114,7 +1133,6 @@ CONFIG_VGACON_SOFT_SCROLLBACK=y | |||
| 1114 | CONFIG_VGACON_SOFT_SCROLLBACK_SIZE=256 | 1133 | CONFIG_VGACON_SOFT_SCROLLBACK_SIZE=256 |
| 1115 | CONFIG_VIDEO_SELECT=y | 1134 | CONFIG_VIDEO_SELECT=y |
| 1116 | CONFIG_DUMMY_CONSOLE=y | 1135 | CONFIG_DUMMY_CONSOLE=y |
| 1117 | # CONFIG_BACKLIGHT_LCD_SUPPORT is not set | ||
| 1118 | 1136 | ||
| 1119 | # | 1137 | # |
| 1120 | # Sound | 1138 | # Sound |
| @@ -1130,9 +1148,8 @@ CONFIG_SOUND=y | |||
| 1130 | # Open Sound System | 1148 | # Open Sound System |
| 1131 | # | 1149 | # |
| 1132 | CONFIG_SOUND_PRIME=y | 1150 | CONFIG_SOUND_PRIME=y |
| 1133 | CONFIG_OBSOLETE_OSS=y | 1151 | # CONFIG_OBSOLETE_OSS is not set |
| 1134 | # CONFIG_SOUND_BT878 is not set | 1152 | # CONFIG_SOUND_BT878 is not set |
| 1135 | # CONFIG_SOUND_ES1371 is not set | ||
| 1136 | CONFIG_SOUND_ICH=y | 1153 | CONFIG_SOUND_ICH=y |
| 1137 | # CONFIG_SOUND_TRIDENT is not set | 1154 | # CONFIG_SOUND_TRIDENT is not set |
| 1138 | # CONFIG_SOUND_MSNDCLAS is not set | 1155 | # CONFIG_SOUND_MSNDCLAS is not set |
| @@ -1263,6 +1280,7 @@ CONFIG_USB_MON=y | |||
| 1263 | # CONFIG_USB_RIO500 is not set | 1280 | # CONFIG_USB_RIO500 is not set |
| 1264 | # CONFIG_USB_LEGOTOWER is not set | 1281 | # CONFIG_USB_LEGOTOWER is not set |
| 1265 | # CONFIG_USB_LCD is not set | 1282 | # CONFIG_USB_LCD is not set |
| 1283 | # CONFIG_USB_BERRY_CHARGE is not set | ||
| 1266 | # CONFIG_USB_LED is not set | 1284 | # CONFIG_USB_LED is not set |
| 1267 | # CONFIG_USB_CYPRESS_CY7C63 is not set | 1285 | # CONFIG_USB_CYPRESS_CY7C63 is not set |
| 1268 | # CONFIG_USB_CYTHERM is not set | 1286 | # CONFIG_USB_CYTHERM is not set |
| @@ -1273,6 +1291,7 @@ CONFIG_USB_MON=y | |||
| 1273 | # CONFIG_USB_SISUSBVGA is not set | 1291 | # CONFIG_USB_SISUSBVGA is not set |
| 1274 | # CONFIG_USB_LD is not set | 1292 | # CONFIG_USB_LD is not set |
| 1275 | # CONFIG_USB_TRANCEVIBRATOR is not set | 1293 | # CONFIG_USB_TRANCEVIBRATOR is not set |
| 1294 | # CONFIG_USB_IOWARRIOR is not set | ||
| 1276 | # CONFIG_USB_TEST is not set | 1295 | # CONFIG_USB_TEST is not set |
| 1277 | 1296 | ||
| 1278 | # | 1297 | # |
| @@ -1538,6 +1557,7 @@ CONFIG_DEBUG_KERNEL=y | |||
| 1538 | CONFIG_LOG_BUF_SHIFT=18 | 1557 | CONFIG_LOG_BUF_SHIFT=18 |
| 1539 | CONFIG_DETECT_SOFTLOCKUP=y | 1558 | CONFIG_DETECT_SOFTLOCKUP=y |
| 1540 | # CONFIG_SCHEDSTATS is not set | 1559 | # CONFIG_SCHEDSTATS is not set |
| 1560 | # CONFIG_TIMER_STATS is not set | ||
| 1541 | # CONFIG_DEBUG_SLAB is not set | 1561 | # CONFIG_DEBUG_SLAB is not set |
| 1542 | # CONFIG_DEBUG_RT_MUTEXES is not set | 1562 | # CONFIG_DEBUG_RT_MUTEXES is not set |
| 1543 | # CONFIG_RT_MUTEX_TESTER is not set | 1563 | # CONFIG_RT_MUTEX_TESTER is not set |
| @@ -1556,6 +1576,7 @@ CONFIG_DEBUG_BUGVERBOSE=y | |||
| 1556 | # CONFIG_FORCED_INLINING is not set | 1576 | # CONFIG_FORCED_INLINING is not set |
| 1557 | # CONFIG_RCU_TORTURE_TEST is not set | 1577 | # CONFIG_RCU_TORTURE_TEST is not set |
| 1558 | # CONFIG_LKDTM is not set | 1578 | # CONFIG_LKDTM is not set |
| 1579 | # CONFIG_FAULT_INJECTION is not set | ||
| 1559 | # CONFIG_DEBUG_RODATA is not set | 1580 | # CONFIG_DEBUG_RODATA is not set |
| 1560 | # CONFIG_IOMMU_DEBUG is not set | 1581 | # CONFIG_IOMMU_DEBUG is not set |
| 1561 | CONFIG_DEBUG_STACKOVERFLOW=y | 1582 | CONFIG_DEBUG_STACKOVERFLOW=y |
diff --git a/arch/x86_64/ia32/ia32entry.S b/arch/x86_64/ia32/ia32entry.S index eda7a0d4dc15..796df6992f62 100644 --- a/arch/x86_64/ia32/ia32entry.S +++ b/arch/x86_64/ia32/ia32entry.S | |||
| @@ -560,7 +560,7 @@ ia32_sys_call_table: | |||
| 560 | .quad sys_sched_yield | 560 | .quad sys_sched_yield |
| 561 | .quad sys_sched_get_priority_max | 561 | .quad sys_sched_get_priority_max |
| 562 | .quad sys_sched_get_priority_min /* 160 */ | 562 | .quad sys_sched_get_priority_min /* 160 */ |
| 563 | .quad sys_sched_rr_get_interval | 563 | .quad sys32_sched_rr_get_interval |
| 564 | .quad compat_sys_nanosleep | 564 | .quad compat_sys_nanosleep |
| 565 | .quad sys_mremap | 565 | .quad sys_mremap |
| 566 | .quad sys_setresuid16 | 566 | .quad sys_setresuid16 |
diff --git a/arch/x86_64/kernel/e820.c b/arch/x86_64/kernel/e820.c index 4651fd22b213..a490fabfcf47 100644 --- a/arch/x86_64/kernel/e820.c +++ b/arch/x86_64/kernel/e820.c | |||
| @@ -662,7 +662,7 @@ static int __init parse_memmap_opt(char *p) | |||
| 662 | } | 662 | } |
| 663 | early_param("memmap", parse_memmap_opt); | 663 | early_param("memmap", parse_memmap_opt); |
| 664 | 664 | ||
| 665 | void finish_e820_parsing(void) | 665 | void __init finish_e820_parsing(void) |
| 666 | { | 666 | { |
| 667 | if (userdef) { | 667 | if (userdef) { |
| 668 | printk(KERN_INFO "user-defined physical RAM map:\n"); | 668 | printk(KERN_INFO "user-defined physical RAM map:\n"); |
diff --git a/arch/x86_64/kernel/early-quirks.c b/arch/x86_64/kernel/early-quirks.c index dec587b293bf..148c6bcf5bb4 100644 --- a/arch/x86_64/kernel/early-quirks.c +++ b/arch/x86_64/kernel/early-quirks.c | |||
| @@ -16,7 +16,7 @@ | |||
| 16 | #include <asm/proto.h> | 16 | #include <asm/proto.h> |
| 17 | #include <asm/dma.h> | 17 | #include <asm/dma.h> |
| 18 | 18 | ||
| 19 | static void via_bugs(void) | 19 | static void __init via_bugs(void) |
| 20 | { | 20 | { |
| 21 | #ifdef CONFIG_IOMMU | 21 | #ifdef CONFIG_IOMMU |
| 22 | if ((end_pfn > MAX_DMA32_PFN || force_iommu) && | 22 | if ((end_pfn > MAX_DMA32_PFN || force_iommu) && |
| @@ -36,7 +36,7 @@ static int __init nvidia_hpet_check(struct acpi_table_header *header) | |||
| 36 | } | 36 | } |
| 37 | #endif | 37 | #endif |
| 38 | 38 | ||
| 39 | static void nvidia_bugs(void) | 39 | static void __init nvidia_bugs(void) |
| 40 | { | 40 | { |
| 41 | #ifdef CONFIG_ACPI | 41 | #ifdef CONFIG_ACPI |
| 42 | /* | 42 | /* |
| @@ -62,7 +62,7 @@ static void nvidia_bugs(void) | |||
| 62 | 62 | ||
| 63 | } | 63 | } |
| 64 | 64 | ||
| 65 | static void ati_bugs(void) | 65 | static void __init ati_bugs(void) |
| 66 | { | 66 | { |
| 67 | if (timer_over_8254 == 1) { | 67 | if (timer_over_8254 == 1) { |
| 68 | timer_over_8254 = 0; | 68 | timer_over_8254 = 0; |
| @@ -88,7 +88,7 @@ struct chipset { | |||
| 88 | void (*f)(void); | 88 | void (*f)(void); |
| 89 | }; | 89 | }; |
| 90 | 90 | ||
| 91 | static struct chipset early_qrk[] = { | 91 | static struct __initdata chipset early_qrk[] = { |
| 92 | { PCI_VENDOR_ID_NVIDIA, nvidia_bugs }, | 92 | { PCI_VENDOR_ID_NVIDIA, nvidia_bugs }, |
| 93 | { PCI_VENDOR_ID_VIA, via_bugs }, | 93 | { PCI_VENDOR_ID_VIA, via_bugs }, |
| 94 | { PCI_VENDOR_ID_ATI, ati_bugs }, | 94 | { PCI_VENDOR_ID_ATI, ati_bugs }, |
diff --git a/arch/x86_64/kernel/mpparse.c b/arch/x86_64/kernel/mpparse.c index 50dd8bef850e..455aa0b932f0 100644 --- a/arch/x86_64/kernel/mpparse.c +++ b/arch/x86_64/kernel/mpparse.c | |||
| @@ -60,9 +60,9 @@ unsigned long mp_lapic_addr = 0; | |||
| 60 | /* Processor that is doing the boot up */ | 60 | /* Processor that is doing the boot up */ |
| 61 | unsigned int boot_cpu_id = -1U; | 61 | unsigned int boot_cpu_id = -1U; |
| 62 | /* Internal processor count */ | 62 | /* Internal processor count */ |
| 63 | unsigned int num_processors __initdata = 0; | 63 | unsigned int num_processors __cpuinitdata = 0; |
| 64 | 64 | ||
| 65 | unsigned disabled_cpus __initdata; | 65 | unsigned disabled_cpus __cpuinitdata; |
| 66 | 66 | ||
| 67 | /* Bitmask of physically existing CPUs */ | 67 | /* Bitmask of physically existing CPUs */ |
| 68 | physid_mask_t phys_cpu_present_map = PHYSID_MASK_NONE; | 68 | physid_mask_t phys_cpu_present_map = PHYSID_MASK_NONE; |
diff --git a/arch/x86_64/kernel/nmi.c b/arch/x86_64/kernel/nmi.c index 486f4c61a948..82d9d85d5270 100644 --- a/arch/x86_64/kernel/nmi.c +++ b/arch/x86_64/kernel/nmi.c | |||
| @@ -187,10 +187,7 @@ void nmi_watchdog_default(void) | |||
| 187 | { | 187 | { |
| 188 | if (nmi_watchdog != NMI_DEFAULT) | 188 | if (nmi_watchdog != NMI_DEFAULT) |
| 189 | return; | 189 | return; |
| 190 | if (nmi_known_cpu()) | 190 | nmi_watchdog = NMI_NONE; |
| 191 | nmi_watchdog = NMI_LOCAL_APIC; | ||
| 192 | else | ||
| 193 | nmi_watchdog = NMI_IO_APIC; | ||
| 194 | } | 191 | } |
| 195 | 192 | ||
| 196 | static int endflag __initdata = 0; | 193 | static int endflag __initdata = 0; |
diff --git a/arch/x86_64/kernel/pci-gart.c b/arch/x86_64/kernel/pci-gart.c index 030eb3753358..2bac8c60ad61 100644 --- a/arch/x86_64/kernel/pci-gart.c +++ b/arch/x86_64/kernel/pci-gart.c | |||
| @@ -675,7 +675,7 @@ void __init gart_iommu_init(void) | |||
| 675 | dma_ops = &gart_dma_ops; | 675 | dma_ops = &gart_dma_ops; |
| 676 | } | 676 | } |
| 677 | 677 | ||
| 678 | void gart_parse_options(char *p) | 678 | void __init gart_parse_options(char *p) |
| 679 | { | 679 | { |
| 680 | int arg; | 680 | int arg; |
| 681 | 681 | ||
diff --git a/arch/x86_64/kernel/vsyscall.c b/arch/x86_64/kernel/vsyscall.c index 180ff919eaf9..b43c698cf7d3 100644 --- a/arch/x86_64/kernel/vsyscall.c +++ b/arch/x86_64/kernel/vsyscall.c | |||
| @@ -112,7 +112,7 @@ static __always_inline void do_vgettimeofday(struct timeval * tv) | |||
| 112 | 112 | ||
| 113 | vread = __vsyscall_gtod_data.clock.vread; | 113 | vread = __vsyscall_gtod_data.clock.vread; |
| 114 | if (unlikely(!__vsyscall_gtod_data.sysctl_enabled || !vread)) { | 114 | if (unlikely(!__vsyscall_gtod_data.sysctl_enabled || !vread)) { |
| 115 | gettimeofday(tv,0); | 115 | gettimeofday(tv,NULL); |
| 116 | return; | 116 | return; |
| 117 | } | 117 | } |
| 118 | now = vread(); | 118 | now = vread(); |
diff --git a/arch/x86_64/kernel/x8664_ksyms.c b/arch/x86_64/kernel/x8664_ksyms.c index 0dffae69f4ad..77c25b307635 100644 --- a/arch/x86_64/kernel/x8664_ksyms.c +++ b/arch/x86_64/kernel/x8664_ksyms.c | |||
| @@ -59,3 +59,4 @@ EXPORT_SYMBOL(empty_zero_page); | |||
| 59 | EXPORT_SYMBOL(init_level4_pgt); | 59 | EXPORT_SYMBOL(init_level4_pgt); |
| 60 | EXPORT_SYMBOL(load_gs_index); | 60 | EXPORT_SYMBOL(load_gs_index); |
| 61 | 61 | ||
| 62 | EXPORT_SYMBOL(_proxy_pda); | ||
diff --git a/drivers/acpi/events/evmisc.c b/drivers/acpi/events/evmisc.c index 8dcade63b04b..3a799b9b5df5 100644 --- a/drivers/acpi/events/evmisc.c +++ b/drivers/acpi/events/evmisc.c | |||
| @@ -549,7 +549,7 @@ acpi_status acpi_ev_release_global_lock(void) | |||
| 549 | acpi_gbl_global_lock_acquired = FALSE; | 549 | acpi_gbl_global_lock_acquired = FALSE; |
| 550 | 550 | ||
| 551 | /* Release the local GL mutex */ | 551 | /* Release the local GL mutex */ |
| 552 | acpi_ev_global_lock_thread_id = 0; | 552 | acpi_ev_global_lock_thread_id = NULL; |
| 553 | acpi_ev_global_lock_acquired = 0; | 553 | acpi_ev_global_lock_acquired = 0; |
| 554 | acpi_os_release_mutex(acpi_gbl_global_lock_mutex); | 554 | acpi_os_release_mutex(acpi_gbl_global_lock_mutex); |
| 555 | return_ACPI_STATUS(status); | 555 | return_ACPI_STATUS(status); |
diff --git a/drivers/ata/pata_cs5520.c b/drivers/ata/pata_cs5520.c index 7ef834250a43..55cc293e7487 100644 --- a/drivers/ata/pata_cs5520.c +++ b/drivers/ata/pata_cs5520.c | |||
| @@ -208,7 +208,7 @@ static struct ata_port_operations cs5520_port_ops = { | |||
| 208 | static int __devinit cs5520_init_one(struct pci_dev *dev, const struct pci_device_id *id) | 208 | static int __devinit cs5520_init_one(struct pci_dev *dev, const struct pci_device_id *id) |
| 209 | { | 209 | { |
| 210 | u8 pcicfg; | 210 | u8 pcicfg; |
| 211 | void *iomap[5]; | 211 | void __iomem *iomap[5]; |
| 212 | static struct ata_probe_ent probe[2]; | 212 | static struct ata_probe_ent probe[2]; |
| 213 | int ports = 0; | 213 | int ports = 0; |
| 214 | 214 | ||
diff --git a/drivers/ata/pata_mpc52xx.c b/drivers/ata/pata_mpc52xx.c index f5d88729ca79..882c36eaf293 100644 --- a/drivers/ata/pata_mpc52xx.c +++ b/drivers/ata/pata_mpc52xx.c | |||
| @@ -329,7 +329,7 @@ mpc52xx_ata_init_one(struct device *dev, struct mpc52xx_ata_priv *priv) | |||
| 329 | ae->dev = dev; | 329 | ae->dev = dev; |
| 330 | ae->irq = priv->ata_irq; | 330 | ae->irq = priv->ata_irq; |
| 331 | 331 | ||
| 332 | aio->cmd_addr = 0; /* Don't have a classic reg block */ | 332 | aio->cmd_addr = NULL; /* Don't have a classic reg block */ |
| 333 | aio->altstatus_addr = &priv->ata_regs->tf_control; | 333 | aio->altstatus_addr = &priv->ata_regs->tf_control; |
| 334 | aio->ctl_addr = &priv->ata_regs->tf_control; | 334 | aio->ctl_addr = &priv->ata_regs->tf_control; |
| 335 | aio->data_addr = &priv->ata_regs->tf_data; | 335 | aio->data_addr = &priv->ata_regs->tf_data; |
diff --git a/drivers/ata/sata_sis.c b/drivers/ata/sata_sis.c index 1879e0cd56aa..a787f0d4a5ba 100644 --- a/drivers/ata/sata_sis.c +++ b/drivers/ata/sata_sis.c | |||
| @@ -354,7 +354,7 @@ static int sis_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 354 | return -ENOMEM; | 354 | return -ENOMEM; |
| 355 | 355 | ||
| 356 | if (!(probe_ent->port_flags & SIS_FLAG_CFGSCR)) { | 356 | if (!(probe_ent->port_flags & SIS_FLAG_CFGSCR)) { |
| 357 | void *mmio; | 357 | void __iomem *mmio; |
| 358 | 358 | ||
| 359 | mmio = pcim_iomap(pdev, SIS_SCR_PCI_BAR, 0); | 359 | mmio = pcim_iomap(pdev, SIS_SCR_PCI_BAR, 0); |
| 360 | if (!mmio) | 360 | if (!mmio) |
diff --git a/drivers/atm/zatm.c b/drivers/atm/zatm.c index 0d7091e2077f..2ad2527cf5b3 100644 --- a/drivers/atm/zatm.c +++ b/drivers/atm/zatm.c | |||
| @@ -1177,7 +1177,7 @@ static void __devinit eprom_get_esi(struct atm_dev *dev) | |||
| 1177 | /*--------------------------------- entries ---------------------------------*/ | 1177 | /*--------------------------------- entries ---------------------------------*/ |
| 1178 | 1178 | ||
| 1179 | 1179 | ||
| 1180 | static int __init zatm_init(struct atm_dev *dev) | 1180 | static int __devinit zatm_init(struct atm_dev *dev) |
| 1181 | { | 1181 | { |
| 1182 | struct zatm_dev *zatm_dev; | 1182 | struct zatm_dev *zatm_dev; |
| 1183 | struct pci_dev *pci_dev; | 1183 | struct pci_dev *pci_dev; |
| @@ -1256,7 +1256,7 @@ static int __init zatm_init(struct atm_dev *dev) | |||
| 1256 | } | 1256 | } |
| 1257 | 1257 | ||
| 1258 | 1258 | ||
| 1259 | static int __init zatm_start(struct atm_dev *dev) | 1259 | static int __devinit zatm_start(struct atm_dev *dev) |
| 1260 | { | 1260 | { |
| 1261 | struct zatm_dev *zatm_dev = ZATM_DEV(dev); | 1261 | struct zatm_dev *zatm_dev = ZATM_DEV(dev); |
| 1262 | struct pci_dev *pdev = zatm_dev->pci_dev; | 1262 | struct pci_dev *pdev = zatm_dev->pci_dev; |
diff --git a/drivers/base/core.c b/drivers/base/core.c index f191afe62b4d..ad0f4a2f25c4 100644 --- a/drivers/base/core.c +++ b/drivers/base/core.c | |||
| @@ -407,6 +407,35 @@ void device_remove_bin_file(struct device *dev, struct bin_attribute *attr) | |||
| 407 | } | 407 | } |
| 408 | EXPORT_SYMBOL_GPL(device_remove_bin_file); | 408 | EXPORT_SYMBOL_GPL(device_remove_bin_file); |
| 409 | 409 | ||
| 410 | /** | ||
| 411 | * device_schedule_callback - helper to schedule a callback for a device | ||
| 412 | * @dev: device. | ||
| 413 | * @func: callback function to invoke later. | ||
| 414 | * | ||
| 415 | * Attribute methods must not unregister themselves or their parent device | ||
| 416 | * (which would amount to the same thing). Attempts to do so will deadlock, | ||
| 417 | * since unregistration is mutually exclusive with driver callbacks. | ||
| 418 | * | ||
| 419 | * Instead methods can call this routine, which will attempt to allocate | ||
| 420 | * and schedule a workqueue request to call back @func with @dev as its | ||
| 421 | * argument in the workqueue's process context. @dev will be pinned until | ||
| 422 | * @func returns. | ||
| 423 | * | ||
| 424 | * Returns 0 if the request was submitted, -ENOMEM if storage could not | ||
| 425 | * be allocated. | ||
| 426 | * | ||
| 427 | * NOTE: This routine won't work if CONFIG_SYSFS isn't set! It uses an | ||
| 428 | * underlying sysfs routine (since it is intended for use by attribute | ||
| 429 | * methods), and if sysfs isn't available you'll get nothing but -ENOSYS. | ||
| 430 | */ | ||
| 431 | int device_schedule_callback(struct device *dev, | ||
| 432 | void (*func)(struct device *)) | ||
| 433 | { | ||
| 434 | return sysfs_schedule_callback(&dev->kobj, | ||
| 435 | (void (*)(void *)) func, dev); | ||
| 436 | } | ||
| 437 | EXPORT_SYMBOL_GPL(device_schedule_callback); | ||
| 438 | |||
| 410 | static void klist_children_get(struct klist_node *n) | 439 | static void klist_children_get(struct klist_node *n) |
| 411 | { | 440 | { |
| 412 | struct device *dev = container_of(n, struct device, knode_parent); | 441 | struct device *dev = container_of(n, struct device, knode_parent); |
diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c index 0c716ee905d7..072e18e6d76d 100644 --- a/drivers/block/cciss.c +++ b/drivers/block/cciss.c | |||
| @@ -1439,7 +1439,7 @@ static int rebuild_lun_table(ctlr_info_t *h, struct gendisk *del_disk) | |||
| 1439 | 1439 | ||
| 1440 | if (return_code == IO_OK) { | 1440 | if (return_code == IO_OK) { |
| 1441 | listlength = | 1441 | listlength = |
| 1442 | be32_to_cpu(*(__u32 *) ld_buff->LUNListLength); | 1442 | be32_to_cpu(*(__be32 *) ld_buff->LUNListLength); |
| 1443 | } else { /* reading number of logical volumes failed */ | 1443 | } else { /* reading number of logical volumes failed */ |
| 1444 | printk(KERN_WARNING "cciss: report logical volume" | 1444 | printk(KERN_WARNING "cciss: report logical volume" |
| 1445 | " command failed\n"); | 1445 | " command failed\n"); |
| @@ -1961,8 +1961,8 @@ cciss_read_capacity(int ctlr, int logvol, int withirq, sector_t *total_size, | |||
| 1961 | ctlr, buf, sizeof(ReadCapdata_struct), | 1961 | ctlr, buf, sizeof(ReadCapdata_struct), |
| 1962 | 1, logvol, 0, NULL, TYPE_CMD); | 1962 | 1, logvol, 0, NULL, TYPE_CMD); |
| 1963 | if (return_code == IO_OK) { | 1963 | if (return_code == IO_OK) { |
| 1964 | *total_size = be32_to_cpu(*(__u32 *) buf->total_size); | 1964 | *total_size = be32_to_cpu(*(__be32 *) buf->total_size); |
| 1965 | *block_size = be32_to_cpu(*(__u32 *) buf->block_size); | 1965 | *block_size = be32_to_cpu(*(__be32 *) buf->block_size); |
| 1966 | } else { /* read capacity command failed */ | 1966 | } else { /* read capacity command failed */ |
| 1967 | printk(KERN_WARNING "cciss: read capacity failed\n"); | 1967 | printk(KERN_WARNING "cciss: read capacity failed\n"); |
| 1968 | *total_size = 0; | 1968 | *total_size = 0; |
| @@ -1997,8 +1997,8 @@ cciss_read_capacity_16(int ctlr, int logvol, int withirq, sector_t *total_size, | |||
| 1997 | 1, logvol, 0, NULL, TYPE_CMD); | 1997 | 1, logvol, 0, NULL, TYPE_CMD); |
| 1998 | } | 1998 | } |
| 1999 | if (return_code == IO_OK) { | 1999 | if (return_code == IO_OK) { |
| 2000 | *total_size = be64_to_cpu(*(__u64 *) buf->total_size); | 2000 | *total_size = be64_to_cpu(*(__be64 *) buf->total_size); |
| 2001 | *block_size = be32_to_cpu(*(__u32 *) buf->block_size); | 2001 | *block_size = be32_to_cpu(*(__be32 *) buf->block_size); |
| 2002 | } else { /* read capacity command failed */ | 2002 | } else { /* read capacity command failed */ |
| 2003 | printk(KERN_WARNING "cciss: read capacity failed\n"); | 2003 | printk(KERN_WARNING "cciss: read capacity failed\n"); |
| 2004 | *total_size = 0; | 2004 | *total_size = 0; |
diff --git a/drivers/block/paride/pd.c b/drivers/block/paride/pd.c index 99e2c8ce1cc4..31e01488eb51 100644 --- a/drivers/block/paride/pd.c +++ b/drivers/block/paride/pd.c | |||
| @@ -663,11 +663,11 @@ static enum action pd_identify(struct pd_unit *disk) | |||
| 663 | return Fail; | 663 | return Fail; |
| 664 | pi_read_block(disk->pi, pd_scratch, 512); | 664 | pi_read_block(disk->pi, pd_scratch, 512); |
| 665 | disk->can_lba = pd_scratch[99] & 2; | 665 | disk->can_lba = pd_scratch[99] & 2; |
| 666 | disk->sectors = le16_to_cpu(*(u16 *) (pd_scratch + 12)); | 666 | disk->sectors = le16_to_cpu(*(__le16 *) (pd_scratch + 12)); |
| 667 | disk->heads = le16_to_cpu(*(u16 *) (pd_scratch + 6)); | 667 | disk->heads = le16_to_cpu(*(__le16 *) (pd_scratch + 6)); |
| 668 | disk->cylinders = le16_to_cpu(*(u16 *) (pd_scratch + 2)); | 668 | disk->cylinders = le16_to_cpu(*(__le16 *) (pd_scratch + 2)); |
| 669 | if (disk->can_lba) | 669 | if (disk->can_lba) |
| 670 | disk->capacity = le32_to_cpu(*(u32 *) (pd_scratch + 120)); | 670 | disk->capacity = le32_to_cpu(*(__le32 *) (pd_scratch + 120)); |
| 671 | else | 671 | else |
| 672 | disk->capacity = disk->sectors * disk->heads * disk->cylinders; | 672 | disk->capacity = disk->sectors * disk->heads * disk->cylinders; |
| 673 | 673 | ||
diff --git a/drivers/char/lcd.c b/drivers/char/lcd.c index 5f4fdcf7c96e..1f0962616ee5 100644 --- a/drivers/char/lcd.c +++ b/drivers/char/lcd.c | |||
| @@ -11,9 +11,6 @@ | |||
| 11 | * March 2001: Ported from 2.0.34 by Liam Davies | 11 | * March 2001: Ported from 2.0.34 by Liam Davies |
| 12 | * | 12 | * |
| 13 | */ | 13 | */ |
| 14 | |||
| 15 | #define RTC_IO_EXTENT 0x10 /*Only really two ports, but... */ | ||
| 16 | |||
| 17 | #include <linux/types.h> | 14 | #include <linux/types.h> |
| 18 | #include <linux/errno.h> | 15 | #include <linux/errno.h> |
| 19 | #include <linux/miscdevice.h> | 16 | #include <linux/miscdevice.h> |
| @@ -32,8 +29,6 @@ | |||
| 32 | 29 | ||
| 33 | #include "lcd.h" | 30 | #include "lcd.h" |
| 34 | 31 | ||
| 35 | static DEFINE_SPINLOCK(lcd_lock); | ||
| 36 | |||
| 37 | static int lcd_ioctl(struct inode *inode, struct file *file, | 32 | static int lcd_ioctl(struct inode *inode, struct file *file, |
| 38 | unsigned int cmd, unsigned long arg); | 33 | unsigned int cmd, unsigned long arg); |
| 39 | 34 | ||
diff --git a/drivers/char/vt.c b/drivers/char/vt.c index c3f8e383933b..1bbb45b937fd 100644 --- a/drivers/char/vt.c +++ b/drivers/char/vt.c | |||
| @@ -724,6 +724,7 @@ int vc_allocate(unsigned int currcons) /* return 0 on success */ | |||
| 724 | return -ENOMEM; | 724 | return -ENOMEM; |
| 725 | memset(vc, 0, sizeof(*vc)); | 725 | memset(vc, 0, sizeof(*vc)); |
| 726 | vc_cons[currcons].d = vc; | 726 | vc_cons[currcons].d = vc; |
| 727 | INIT_WORK(&vc_cons[currcons].SAK_work, vc_SAK); | ||
| 727 | visual_init(vc, currcons, 1); | 728 | visual_init(vc, currcons, 1); |
| 728 | if (!*vc->vc_uni_pagedir_loc) | 729 | if (!*vc->vc_uni_pagedir_loc) |
| 729 | con_set_default_unimap(vc); | 730 | con_set_default_unimap(vc); |
| @@ -2185,10 +2186,28 @@ static void console_callback(struct work_struct *ignored) | |||
| 2185 | release_console_sem(); | 2186 | release_console_sem(); |
| 2186 | } | 2187 | } |
| 2187 | 2188 | ||
| 2188 | void set_console(int nr) | 2189 | int set_console(int nr) |
| 2189 | { | 2190 | { |
| 2191 | struct vc_data *vc = vc_cons[fg_console].d; | ||
| 2192 | |||
| 2193 | if (!vc_cons_allocated(nr) || vt_dont_switch || | ||
| 2194 | (vc->vt_mode.mode == VT_AUTO && vc->vc_mode == KD_GRAPHICS)) { | ||
| 2195 | |||
| 2196 | /* | ||
| 2197 | * Console switch will fail in console_callback() or | ||
| 2198 | * change_console() so there is no point scheduling | ||
| 2199 | * the callback | ||
| 2200 | * | ||
| 2201 | * Existing set_console() users don't check the return | ||
| 2202 | * value so this shouldn't break anything | ||
| 2203 | */ | ||
| 2204 | return -EINVAL; | ||
| 2205 | } | ||
| 2206 | |||
| 2190 | want_console = nr; | 2207 | want_console = nr; |
| 2191 | schedule_console_callback(); | 2208 | schedule_console_callback(); |
| 2209 | |||
| 2210 | return 0; | ||
| 2192 | } | 2211 | } |
| 2193 | 2212 | ||
| 2194 | struct tty_driver *console_driver; | 2213 | struct tty_driver *console_driver; |
diff --git a/drivers/char/vt_ioctl.c b/drivers/char/vt_ioctl.c index 3a5d301e783b..1fa2da8f4fbe 100644 --- a/drivers/char/vt_ioctl.c +++ b/drivers/char/vt_ioctl.c | |||
| @@ -34,7 +34,7 @@ | |||
| 34 | #include <linux/kbd_diacr.h> | 34 | #include <linux/kbd_diacr.h> |
| 35 | #include <linux/selection.h> | 35 | #include <linux/selection.h> |
| 36 | 36 | ||
| 37 | static char vt_dont_switch; | 37 | char vt_dont_switch; |
| 38 | extern struct tty_driver *console_driver; | 38 | extern struct tty_driver *console_driver; |
| 39 | 39 | ||
| 40 | #define VT_IS_IN_USE(i) (console_driver->ttys[i] && console_driver->ttys[i]->count) | 40 | #define VT_IS_IN_USE(i) (console_driver->ttys[i] && console_driver->ttys[i]->count) |
diff --git a/drivers/char/watchdog/Kconfig b/drivers/char/watchdog/Kconfig index ea09d0c974ea..e812aa129e28 100644 --- a/drivers/char/watchdog/Kconfig +++ b/drivers/char/watchdog/Kconfig | |||
| @@ -301,6 +301,7 @@ config I6300ESB_WDT | |||
| 301 | config I8XX_TCO | 301 | config I8XX_TCO |
| 302 | tristate "Intel i8xx TCO Timer/Watchdog" | 302 | tristate "Intel i8xx TCO Timer/Watchdog" |
| 303 | depends on WATCHDOG && (X86 || IA64) && PCI | 303 | depends on WATCHDOG && (X86 || IA64) && PCI |
| 304 | default n | ||
| 304 | ---help--- | 305 | ---help--- |
| 305 | Hardware driver for the TCO timer built into the Intel 82801 | 306 | Hardware driver for the TCO timer built into the Intel 82801 |
| 306 | I/O Controller Hub family. The TCO (Total Cost of Ownership) | 307 | I/O Controller Hub family. The TCO (Total Cost of Ownership) |
diff --git a/drivers/char/watchdog/machzwd.c b/drivers/char/watchdog/machzwd.c index 4a328ba0d262..81fb3dec180f 100644 --- a/drivers/char/watchdog/machzwd.c +++ b/drivers/char/watchdog/machzwd.c | |||
| @@ -324,7 +324,7 @@ static int zf_ioctl(struct inode *inode, struct file *file, unsigned int cmd, | |||
| 324 | return put_user(0, p); | 324 | return put_user(0, p); |
| 325 | 325 | ||
| 326 | case WDIOC_KEEPALIVE: | 326 | case WDIOC_KEEPALIVE: |
| 327 | zf_ping(0); | 327 | zf_ping(NULL); |
| 328 | break; | 328 | break; |
| 329 | 329 | ||
| 330 | default: | 330 | default: |
diff --git a/drivers/dma/dmaengine.c b/drivers/dma/dmaengine.c index 15278044295c..322ee2984e3d 100644 --- a/drivers/dma/dmaengine.c +++ b/drivers/dma/dmaengine.c | |||
| @@ -176,6 +176,7 @@ void dma_chan_cleanup(struct kref *kref) | |||
| 176 | chan->client = NULL; | 176 | chan->client = NULL; |
| 177 | kref_put(&chan->device->refcount, dma_async_device_cleanup); | 177 | kref_put(&chan->device->refcount, dma_async_device_cleanup); |
| 178 | } | 178 | } |
| 179 | EXPORT_SYMBOL(dma_chan_cleanup); | ||
| 179 | 180 | ||
| 180 | static void dma_chan_free_rcu(struct rcu_head *rcu) | 181 | static void dma_chan_free_rcu(struct rcu_head *rcu) |
| 181 | { | 182 | { |
| @@ -261,6 +262,7 @@ struct dma_client *dma_async_client_register(dma_event_callback event_callback) | |||
| 261 | 262 | ||
| 262 | return client; | 263 | return client; |
| 263 | } | 264 | } |
| 265 | EXPORT_SYMBOL(dma_async_client_register); | ||
| 264 | 266 | ||
| 265 | /** | 267 | /** |
| 266 | * dma_async_client_unregister - unregister a client and free the &dma_client | 268 | * dma_async_client_unregister - unregister a client and free the &dma_client |
| @@ -287,6 +289,7 @@ void dma_async_client_unregister(struct dma_client *client) | |||
| 287 | kfree(client); | 289 | kfree(client); |
| 288 | dma_chans_rebalance(); | 290 | dma_chans_rebalance(); |
| 289 | } | 291 | } |
| 292 | EXPORT_SYMBOL(dma_async_client_unregister); | ||
| 290 | 293 | ||
| 291 | /** | 294 | /** |
| 292 | * dma_async_client_chan_request - request DMA channels | 295 | * dma_async_client_chan_request - request DMA channels |
| @@ -304,6 +307,7 @@ void dma_async_client_chan_request(struct dma_client *client, | |||
| 304 | client->chans_desired = number; | 307 | client->chans_desired = number; |
| 305 | dma_chans_rebalance(); | 308 | dma_chans_rebalance(); |
| 306 | } | 309 | } |
| 310 | EXPORT_SYMBOL(dma_async_client_chan_request); | ||
| 307 | 311 | ||
| 308 | /** | 312 | /** |
| 309 | * dma_async_device_register - registers DMA devices found | 313 | * dma_async_device_register - registers DMA devices found |
| @@ -346,6 +350,7 @@ int dma_async_device_register(struct dma_device *device) | |||
| 346 | 350 | ||
| 347 | return 0; | 351 | return 0; |
| 348 | } | 352 | } |
| 353 | EXPORT_SYMBOL(dma_async_device_register); | ||
| 349 | 354 | ||
| 350 | /** | 355 | /** |
| 351 | * dma_async_device_cleanup - function called when all references are released | 356 | * dma_async_device_cleanup - function called when all references are released |
| @@ -390,23 +395,12 @@ void dma_async_device_unregister(struct dma_device *device) | |||
| 390 | kref_put(&device->refcount, dma_async_device_cleanup); | 395 | kref_put(&device->refcount, dma_async_device_cleanup); |
| 391 | wait_for_completion(&device->done); | 396 | wait_for_completion(&device->done); |
| 392 | } | 397 | } |
| 398 | EXPORT_SYMBOL(dma_async_device_unregister); | ||
| 393 | 399 | ||
| 394 | static int __init dma_bus_init(void) | 400 | static int __init dma_bus_init(void) |
| 395 | { | 401 | { |
| 396 | mutex_init(&dma_list_mutex); | 402 | mutex_init(&dma_list_mutex); |
| 397 | return class_register(&dma_devclass); | 403 | return class_register(&dma_devclass); |
| 398 | } | 404 | } |
| 399 | |||
| 400 | subsys_initcall(dma_bus_init); | 405 | subsys_initcall(dma_bus_init); |
| 401 | 406 | ||
| 402 | EXPORT_SYMBOL(dma_async_client_register); | ||
| 403 | EXPORT_SYMBOL(dma_async_client_unregister); | ||
| 404 | EXPORT_SYMBOL(dma_async_client_chan_request); | ||
| 405 | EXPORT_SYMBOL(dma_async_memcpy_buf_to_buf); | ||
| 406 | EXPORT_SYMBOL(dma_async_memcpy_buf_to_pg); | ||
| 407 | EXPORT_SYMBOL(dma_async_memcpy_pg_to_pg); | ||
| 408 | EXPORT_SYMBOL(dma_async_memcpy_complete); | ||
| 409 | EXPORT_SYMBOL(dma_async_memcpy_issue_pending); | ||
| 410 | EXPORT_SYMBOL(dma_async_device_register); | ||
| 411 | EXPORT_SYMBOL(dma_async_device_unregister); | ||
| 412 | EXPORT_SYMBOL(dma_chan_cleanup); | ||
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c index f4ee1afe488f..67f3347afcf3 100644 --- a/drivers/hid/hid-core.c +++ b/drivers/hid/hid-core.c | |||
| @@ -26,6 +26,7 @@ | |||
| 26 | #include <asm/byteorder.h> | 26 | #include <asm/byteorder.h> |
| 27 | #include <linux/input.h> | 27 | #include <linux/input.h> |
| 28 | #include <linux/wait.h> | 28 | #include <linux/wait.h> |
| 29 | #include <linux/vmalloc.h> | ||
| 29 | 30 | ||
| 30 | #include <linux/hid.h> | 31 | #include <linux/hid.h> |
| 31 | #include <linux/hiddev.h> | 32 | #include <linux/hiddev.h> |
| @@ -654,12 +655,13 @@ struct hid_device *hid_parse_report(__u8 *start, unsigned size) | |||
| 654 | memcpy(device->rdesc, start, size); | 655 | memcpy(device->rdesc, start, size); |
| 655 | device->rsize = size; | 656 | device->rsize = size; |
| 656 | 657 | ||
| 657 | if (!(parser = kzalloc(sizeof(struct hid_parser), GFP_KERNEL))) { | 658 | if (!(parser = vmalloc(sizeof(struct hid_parser)))) { |
| 658 | kfree(device->rdesc); | 659 | kfree(device->rdesc); |
| 659 | kfree(device->collection); | 660 | kfree(device->collection); |
| 660 | kfree(device); | 661 | kfree(device); |
| 661 | return NULL; | 662 | return NULL; |
| 662 | } | 663 | } |
| 664 | memset(parser, 0, sizeof(struct hid_parser)); | ||
| 663 | parser->device = device; | 665 | parser->device = device; |
| 664 | 666 | ||
| 665 | end = start + size; | 667 | end = start + size; |
| @@ -668,7 +670,7 @@ struct hid_device *hid_parse_report(__u8 *start, unsigned size) | |||
| 668 | if (item.format != HID_ITEM_FORMAT_SHORT) { | 670 | if (item.format != HID_ITEM_FORMAT_SHORT) { |
| 669 | dbg("unexpected long global item"); | 671 | dbg("unexpected long global item"); |
| 670 | hid_free_device(device); | 672 | hid_free_device(device); |
| 671 | kfree(parser); | 673 | vfree(parser); |
| 672 | return NULL; | 674 | return NULL; |
| 673 | } | 675 | } |
| 674 | 676 | ||
| @@ -676,7 +678,7 @@ struct hid_device *hid_parse_report(__u8 *start, unsigned size) | |||
| 676 | dbg("item %u %u %u %u parsing failed\n", | 678 | dbg("item %u %u %u %u parsing failed\n", |
| 677 | item.format, (unsigned)item.size, (unsigned)item.type, (unsigned)item.tag); | 679 | item.format, (unsigned)item.size, (unsigned)item.type, (unsigned)item.tag); |
| 678 | hid_free_device(device); | 680 | hid_free_device(device); |
| 679 | kfree(parser); | 681 | vfree(parser); |
| 680 | return NULL; | 682 | return NULL; |
| 681 | } | 683 | } |
| 682 | 684 | ||
| @@ -684,23 +686,23 @@ struct hid_device *hid_parse_report(__u8 *start, unsigned size) | |||
| 684 | if (parser->collection_stack_ptr) { | 686 | if (parser->collection_stack_ptr) { |
| 685 | dbg("unbalanced collection at end of report description"); | 687 | dbg("unbalanced collection at end of report description"); |
| 686 | hid_free_device(device); | 688 | hid_free_device(device); |
| 687 | kfree(parser); | 689 | vfree(parser); |
| 688 | return NULL; | 690 | return NULL; |
| 689 | } | 691 | } |
| 690 | if (parser->local.delimiter_depth) { | 692 | if (parser->local.delimiter_depth) { |
| 691 | dbg("unbalanced delimiter at end of report description"); | 693 | dbg("unbalanced delimiter at end of report description"); |
| 692 | hid_free_device(device); | 694 | hid_free_device(device); |
| 693 | kfree(parser); | 695 | vfree(parser); |
| 694 | return NULL; | 696 | return NULL; |
| 695 | } | 697 | } |
| 696 | kfree(parser); | 698 | vfree(parser); |
| 697 | return device; | 699 | return device; |
| 698 | } | 700 | } |
| 699 | } | 701 | } |
| 700 | 702 | ||
| 701 | dbg("item fetching failed at offset %d\n", (int)(end - start)); | 703 | dbg("item fetching failed at offset %d\n", (int)(end - start)); |
| 702 | hid_free_device(device); | 704 | hid_free_device(device); |
| 703 | kfree(parser); | 705 | vfree(parser); |
| 704 | return NULL; | 706 | return NULL; |
| 705 | } | 707 | } |
| 706 | EXPORT_SYMBOL_GPL(hid_parse_report); | 708 | EXPORT_SYMBOL_GPL(hid_parse_report); |
| @@ -753,8 +755,7 @@ static __inline__ __u32 extract(__u8 *report, unsigned offset, unsigned n) | |||
| 753 | 755 | ||
| 754 | report += offset >> 3; /* adjust byte index */ | 756 | report += offset >> 3; /* adjust byte index */ |
| 755 | offset &= 7; /* now only need bit offset into one byte */ | 757 | offset &= 7; /* now only need bit offset into one byte */ |
| 756 | x = get_unaligned((u64 *) report); | 758 | x = le64_to_cpu(get_unaligned((__le64 *) report)); |
| 757 | x = le64_to_cpu(x); | ||
| 758 | x = (x >> offset) & ((1ULL << n) - 1); /* extract bit field */ | 759 | x = (x >> offset) & ((1ULL << n) - 1); /* extract bit field */ |
| 759 | return (u32) x; | 760 | return (u32) x; |
| 760 | } | 761 | } |
| @@ -769,7 +770,7 @@ static __inline__ __u32 extract(__u8 *report, unsigned offset, unsigned n) | |||
| 769 | */ | 770 | */ |
| 770 | static __inline__ void implement(__u8 *report, unsigned offset, unsigned n, __u32 value) | 771 | static __inline__ void implement(__u8 *report, unsigned offset, unsigned n, __u32 value) |
| 771 | { | 772 | { |
| 772 | u64 x; | 773 | __le64 x; |
| 773 | u64 m = (1ULL << n) - 1; | 774 | u64 m = (1ULL << n) - 1; |
| 774 | 775 | ||
| 775 | WARN_ON(n > 32); | 776 | WARN_ON(n > 32); |
| @@ -780,10 +781,10 @@ static __inline__ void implement(__u8 *report, unsigned offset, unsigned n, __u3 | |||
| 780 | report += offset >> 3; | 781 | report += offset >> 3; |
| 781 | offset &= 7; | 782 | offset &= 7; |
| 782 | 783 | ||
| 783 | x = get_unaligned((u64 *)report); | 784 | x = get_unaligned((__le64 *)report); |
| 784 | x &= cpu_to_le64(~(m << offset)); | 785 | x &= cpu_to_le64(~(m << offset)); |
| 785 | x |= cpu_to_le64(((u64) value) << offset); | 786 | x |= cpu_to_le64(((u64) value) << offset); |
| 786 | put_unaligned(x, (u64 *) report); | 787 | put_unaligned(x, (__le64 *) report); |
| 787 | } | 788 | } |
| 788 | 789 | ||
| 789 | /* | 790 | /* |
| @@ -873,10 +874,6 @@ static void hid_output_field(struct hid_field *field, __u8 *data) | |||
| 873 | unsigned size = field->report_size; | 874 | unsigned size = field->report_size; |
| 874 | unsigned n; | 875 | unsigned n; |
| 875 | 876 | ||
| 876 | /* make sure the unused bits in the last byte are zeros */ | ||
| 877 | if (count > 0 && size > 0) | ||
| 878 | data[(offset+count*size-1)/8] = 0; | ||
| 879 | |||
| 880 | for (n = 0; n < count; n++) { | 877 | for (n = 0; n < count; n++) { |
| 881 | if (field->logical_minimum < 0) /* signed values */ | 878 | if (field->logical_minimum < 0) /* signed values */ |
| 882 | implement(data, offset + n * size, size, s32ton(field->value[n], size)); | 879 | implement(data, offset + n * size, size, s32ton(field->value[n], size)); |
diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig index c3d4856fb618..6d105a1d41b1 100644 --- a/drivers/hwmon/Kconfig +++ b/drivers/hwmon/Kconfig | |||
| @@ -527,6 +527,7 @@ config SENSORS_W83792D | |||
| 527 | config SENSORS_W83793 | 527 | config SENSORS_W83793 |
| 528 | tristate "Winbond W83793" | 528 | tristate "Winbond W83793" |
| 529 | depends on HWMON && I2C && EXPERIMENTAL | 529 | depends on HWMON && I2C && EXPERIMENTAL |
| 530 | select HWMON_VID | ||
| 530 | help | 531 | help |
| 531 | If you say yes here you get support for the Winbond W83793 | 532 | If you say yes here you get support for the Winbond W83793 |
| 532 | hardware monitoring chip. | 533 | hardware monitoring chip. |
diff --git a/drivers/ide/Kconfig b/drivers/ide/Kconfig index 5d134bb75ba1..8f1fd017679b 100644 --- a/drivers/ide/Kconfig +++ b/drivers/ide/Kconfig | |||
| @@ -434,24 +434,8 @@ config BLK_DEV_IDEDMA_FORCED | |||
| 434 | 434 | ||
| 435 | Generally say N here. | 435 | Generally say N here. |
| 436 | 436 | ||
| 437 | config IDEDMA_PCI_AUTO | ||
| 438 | bool "Use PCI DMA by default when available" | ||
| 439 | ---help--- | ||
| 440 | Prior to kernel version 2.1.112, Linux used to automatically use | ||
| 441 | DMA for IDE drives and chipsets which support it. Due to concerns | ||
| 442 | about a couple of cases where buggy hardware may have caused damage, | ||
| 443 | the default is now to NOT use DMA automatically. To revert to the | ||
| 444 | previous behaviour, say Y to this question. | ||
| 445 | |||
| 446 | If you suspect your hardware is at all flakey, say N here. | ||
| 447 | Do NOT email the IDE kernel people regarding this issue! | ||
| 448 | |||
| 449 | It is normally safe to answer Y to this question unless your | ||
| 450 | motherboard uses a VIA VP2 chipset, in which case you should say N. | ||
| 451 | |||
| 452 | config IDEDMA_ONLYDISK | 437 | config IDEDMA_ONLYDISK |
| 453 | bool "Enable DMA only for disks " | 438 | bool "Enable DMA only for disks " |
| 454 | depends on IDEDMA_PCI_AUTO | ||
| 455 | help | 439 | help |
| 456 | This is used if you know your ATAPI Devices are going to fail DMA | 440 | This is used if you know your ATAPI Devices are going to fail DMA |
| 457 | Transfers. | 441 | Transfers. |
| @@ -769,6 +753,14 @@ config BLK_DEV_TC86C001 | |||
| 769 | help | 753 | help |
| 770 | This driver adds support for Toshiba TC86C001 GOKU-S chip. | 754 | This driver adds support for Toshiba TC86C001 GOKU-S chip. |
| 771 | 755 | ||
| 756 | config BLK_DEV_CELLEB | ||
| 757 | tristate "Toshiba's Cell Reference Set IDE support" | ||
| 758 | depends on PPC_CELLEB | ||
| 759 | help | ||
| 760 | This driver provides support for the built-in IDE controller on | ||
| 761 | Toshiba Cell Reference Board. | ||
| 762 | If unsure, say Y. | ||
| 763 | |||
| 772 | endif | 764 | endif |
| 773 | 765 | ||
| 774 | config BLK_DEV_IDE_PMAC | 766 | config BLK_DEV_IDE_PMAC |
| @@ -800,14 +792,6 @@ config BLK_DEV_IDEDMA_PMAC | |||
| 800 | to transfer data to and from memory. Saying Y is safe and improves | 792 | to transfer data to and from memory. Saying Y is safe and improves |
| 801 | performance. | 793 | performance. |
| 802 | 794 | ||
| 803 | config BLK_DEV_IDE_CELLEB | ||
| 804 | bool "Toshiba's Cell Reference Set IDE support" | ||
| 805 | depends on PPC_CELLEB | ||
| 806 | help | ||
| 807 | This driver provides support for the built-in IDE controller on | ||
| 808 | Toshiba Cell Reference Board. | ||
| 809 | If unsure, say Y. | ||
| 810 | |||
| 811 | config BLK_DEV_IDE_SWARM | 795 | config BLK_DEV_IDE_SWARM |
| 812 | tristate "IDE for Sibyte evaluation boards" | 796 | tristate "IDE for Sibyte evaluation boards" |
| 813 | depends on SIBYTE_SB1xxx_SOC | 797 | depends on SIBYTE_SB1xxx_SOC |
| @@ -851,19 +835,6 @@ config BLK_DEV_IDEDMA_ICS | |||
| 851 | Say Y here if you want to add DMA (Direct Memory Access) support to | 835 | Say Y here if you want to add DMA (Direct Memory Access) support to |
| 852 | the ICS IDE driver. | 836 | the ICS IDE driver. |
| 853 | 837 | ||
| 854 | config IDEDMA_ICS_AUTO | ||
| 855 | bool "Use ICS DMA by default" | ||
| 856 | depends on BLK_DEV_IDEDMA_ICS | ||
| 857 | help | ||
| 858 | Prior to kernel version 2.1.112, Linux used to automatically use | ||
| 859 | DMA for IDE drives and chipsets which support it. Due to concerns | ||
| 860 | about a couple of cases where buggy hardware may have caused damage, | ||
| 861 | the default is now to NOT use DMA automatically. To revert to the | ||
| 862 | previous behaviour, say Y to this question. | ||
| 863 | |||
| 864 | If you suspect your hardware is at all flakey, say N here. | ||
| 865 | Do NOT email the IDE kernel people regarding this issue! | ||
| 866 | |||
| 867 | config BLK_DEV_IDE_RAPIDE | 838 | config BLK_DEV_IDE_RAPIDE |
| 868 | tristate "RapIDE interface support" | 839 | tristate "RapIDE interface support" |
| 869 | depends on ARM && ARCH_ACORN | 840 | depends on ARM && ARCH_ACORN |
| @@ -1086,9 +1057,6 @@ config IDEDMA_IVB | |||
| 1086 | 1057 | ||
| 1087 | It is normally safe to answer Y; however, the default is N. | 1058 | It is normally safe to answer Y; however, the default is N. |
| 1088 | 1059 | ||
| 1089 | config IDEDMA_AUTO | ||
| 1090 | def_bool IDEDMA_PCI_AUTO || IDEDMA_ICS_AUTO | ||
| 1091 | |||
| 1092 | endif | 1060 | endif |
| 1093 | 1061 | ||
| 1094 | config BLK_DEV_HD_ONLY | 1062 | config BLK_DEV_HD_ONLY |
diff --git a/drivers/ide/Makefile b/drivers/ide/Makefile index 28feedfbd21d..d9f029e8ff74 100644 --- a/drivers/ide/Makefile +++ b/drivers/ide/Makefile | |||
| @@ -37,7 +37,6 @@ ide-core-$(CONFIG_BLK_DEV_Q40IDE) += legacy/q40ide.o | |||
| 37 | # built-in only drivers from ppc/ | 37 | # built-in only drivers from ppc/ |
| 38 | ide-core-$(CONFIG_BLK_DEV_MPC8xx_IDE) += ppc/mpc8xx.o | 38 | ide-core-$(CONFIG_BLK_DEV_MPC8xx_IDE) += ppc/mpc8xx.o |
| 39 | ide-core-$(CONFIG_BLK_DEV_IDE_PMAC) += ppc/pmac.o | 39 | ide-core-$(CONFIG_BLK_DEV_IDE_PMAC) += ppc/pmac.o |
| 40 | ide-core-$(CONFIG_BLK_DEV_IDE_CELLEB) += ppc/scc_pata.o | ||
| 41 | 40 | ||
| 42 | # built-in only drivers from h8300/ | 41 | # built-in only drivers from h8300/ |
| 43 | ide-core-$(CONFIG_H8300) += h8300/ide-h8300.o | 42 | ide-core-$(CONFIG_H8300) += h8300/ide-h8300.o |
diff --git a/drivers/ide/arm/icside.c b/drivers/ide/arm/icside.c index 40e5c66b81ce..e2953fc1fafb 100644 --- a/drivers/ide/arm/icside.c +++ b/drivers/ide/arm/icside.c | |||
| @@ -196,11 +196,6 @@ static void icside_maskproc(ide_drive_t *drive, int mask) | |||
| 196 | } | 196 | } |
| 197 | 197 | ||
| 198 | #ifdef CONFIG_BLK_DEV_IDEDMA_ICS | 198 | #ifdef CONFIG_BLK_DEV_IDEDMA_ICS |
| 199 | |||
| 200 | #ifndef CONFIG_IDEDMA_ICS_AUTO | ||
| 201 | #warning CONFIG_IDEDMA_ICS_AUTO=n support is obsolete, and will be removed soon. | ||
| 202 | #endif | ||
| 203 | |||
| 204 | /* | 199 | /* |
| 205 | * SG-DMA support. | 200 | * SG-DMA support. |
| 206 | * | 201 | * |
| @@ -474,12 +469,6 @@ static int icside_dma_lostirq(ide_drive_t *drive) | |||
| 474 | 469 | ||
| 475 | static void icside_dma_init(ide_hwif_t *hwif) | 470 | static void icside_dma_init(ide_hwif_t *hwif) |
| 476 | { | 471 | { |
| 477 | int autodma = 0; | ||
| 478 | |||
| 479 | #ifdef CONFIG_IDEDMA_ICS_AUTO | ||
| 480 | autodma = 1; | ||
| 481 | #endif | ||
| 482 | |||
| 483 | printk(" %s: SG-DMA", hwif->name); | 472 | printk(" %s: SG-DMA", hwif->name); |
| 484 | 473 | ||
| 485 | hwif->atapi_dma = 1; | 474 | hwif->atapi_dma = 1; |
| @@ -489,7 +478,7 @@ static void icside_dma_init(ide_hwif_t *hwif) | |||
| 489 | hwif->dmatable_cpu = NULL; | 478 | hwif->dmatable_cpu = NULL; |
| 490 | hwif->dmatable_dma = 0; | 479 | hwif->dmatable_dma = 0; |
| 491 | hwif->speedproc = icside_set_speed; | 480 | hwif->speedproc = icside_set_speed; |
| 492 | hwif->autodma = autodma; | 481 | hwif->autodma = 1; |
| 493 | 482 | ||
| 494 | hwif->ide_dma_check = icside_dma_check; | 483 | hwif->ide_dma_check = icside_dma_check; |
| 495 | hwif->dma_host_off = icside_dma_host_off; | 484 | hwif->dma_host_off = icside_dma_host_off; |
diff --git a/drivers/ide/ide-dma.c b/drivers/ide/ide-dma.c index 08e7cd043bcc..fd213088b06b 100644 --- a/drivers/ide/ide-dma.c +++ b/drivers/ide/ide-dma.c | |||
| @@ -767,7 +767,7 @@ int ide_set_dma(ide_drive_t *drive) | |||
| 767 | switch(rc) { | 767 | switch(rc) { |
| 768 | case -1: /* DMA needs to be disabled */ | 768 | case -1: /* DMA needs to be disabled */ |
| 769 | hwif->dma_off_quietly(drive); | 769 | hwif->dma_off_quietly(drive); |
| 770 | return 0; | 770 | return -1; |
| 771 | case 0: /* DMA needs to be enabled */ | 771 | case 0: /* DMA needs to be enabled */ |
| 772 | return hwif->ide_dma_on(drive); | 772 | return hwif->ide_dma_on(drive); |
| 773 | case 1: /* DMA setting cannot be changed */ | 773 | case 1: /* DMA setting cannot be changed */ |
diff --git a/drivers/ide/ide.c b/drivers/ide/ide.c index dfbd74458522..695610f0e3e4 100644 --- a/drivers/ide/ide.c +++ b/drivers/ide/ide.c | |||
| @@ -177,11 +177,7 @@ DECLARE_MUTEX(ide_cfg_sem); | |||
| 177 | static int ide_scan_direction; /* THIS was formerly 2.2.x pci=reverse */ | 177 | static int ide_scan_direction; /* THIS was formerly 2.2.x pci=reverse */ |
| 178 | #endif | 178 | #endif |
| 179 | 179 | ||
| 180 | #ifdef CONFIG_IDEDMA_AUTO | ||
| 181 | int noautodma = 0; | 180 | int noautodma = 0; |
| 182 | #else | ||
| 183 | int noautodma = 1; | ||
| 184 | #endif | ||
| 185 | 181 | ||
| 186 | EXPORT_SYMBOL(noautodma); | 182 | EXPORT_SYMBOL(noautodma); |
| 187 | 183 | ||
diff --git a/drivers/ide/mips/au1xxx-ide.c b/drivers/ide/mips/au1xxx-ide.c index b2dc028dc8ca..d54d9fe92a7d 100644 --- a/drivers/ide/mips/au1xxx-ide.c +++ b/drivers/ide/mips/au1xxx-ide.c | |||
| @@ -639,6 +639,7 @@ static int au_ide_probe(struct device *dev) | |||
| 639 | _auide_hwif *ahwif = &auide_hwif; | 639 | _auide_hwif *ahwif = &auide_hwif; |
| 640 | ide_hwif_t *hwif; | 640 | ide_hwif_t *hwif; |
| 641 | struct resource *res; | 641 | struct resource *res; |
| 642 | hw_regs_t *hw; | ||
| 642 | int ret = 0; | 643 | int ret = 0; |
| 643 | 644 | ||
| 644 | #if defined(CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA) | 645 | #if defined(CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA) |
| @@ -681,7 +682,7 @@ static int au_ide_probe(struct device *dev) | |||
| 681 | /* FIXME: This might possibly break PCMCIA IDE devices */ | 682 | /* FIXME: This might possibly break PCMCIA IDE devices */ |
| 682 | 683 | ||
| 683 | hwif = &ide_hwifs[pdev->id]; | 684 | hwif = &ide_hwifs[pdev->id]; |
| 684 | hw_regs_t *hw = &hwif->hw; | 685 | hw = &hwif->hw; |
| 685 | hwif->irq = hw->irq = ahwif->irq; | 686 | hwif->irq = hw->irq = ahwif->irq; |
| 686 | hwif->chipset = ide_au1xxx; | 687 | hwif->chipset = ide_au1xxx; |
| 687 | 688 | ||
diff --git a/drivers/ide/pci/Makefile b/drivers/ide/pci/Makefile index 6591ff4753cb..95d1ea8f1f14 100644 --- a/drivers/ide/pci/Makefile +++ b/drivers/ide/pci/Makefile | |||
| @@ -3,6 +3,7 @@ obj-$(CONFIG_BLK_DEV_AEC62XX) += aec62xx.o | |||
| 3 | obj-$(CONFIG_BLK_DEV_ALI15X3) += alim15x3.o | 3 | obj-$(CONFIG_BLK_DEV_ALI15X3) += alim15x3.o |
| 4 | obj-$(CONFIG_BLK_DEV_AMD74XX) += amd74xx.o | 4 | obj-$(CONFIG_BLK_DEV_AMD74XX) += amd74xx.o |
| 5 | obj-$(CONFIG_BLK_DEV_ATIIXP) += atiixp.o | 5 | obj-$(CONFIG_BLK_DEV_ATIIXP) += atiixp.o |
| 6 | obj-$(CONFIG_BLK_DEV_CELLEB) += scc_pata.o | ||
| 6 | obj-$(CONFIG_BLK_DEV_CMD64X) += cmd64x.o | 7 | obj-$(CONFIG_BLK_DEV_CMD64X) += cmd64x.o |
| 7 | obj-$(CONFIG_BLK_DEV_CS5520) += cs5520.o | 8 | obj-$(CONFIG_BLK_DEV_CS5520) += cs5520.o |
| 8 | obj-$(CONFIG_BLK_DEV_CS5530) += cs5530.o | 9 | obj-$(CONFIG_BLK_DEV_CS5530) += cs5530.o |
diff --git a/drivers/ide/pci/cmd64x.c b/drivers/ide/pci/cmd64x.c index b0d4825c56a9..561197f7b5bb 100644 --- a/drivers/ide/pci/cmd64x.c +++ b/drivers/ide/pci/cmd64x.c | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | /* $Id: cmd64x.c,v 1.21 2000/01/30 23:23:16 | 1 | /* $Id: cmd64x.c,v 1.21 2000/01/30 23:23:16 |
| 2 | * | 2 | * |
| 3 | * linux/drivers/ide/pci/cmd64x.c Version 1.41 Feb 3, 2007 | 3 | * linux/drivers/ide/pci/cmd64x.c Version 1.42 Feb 8, 2007 |
| 4 | * | 4 | * |
| 5 | * cmd64x.c: Enable interrupts at initialization time on Ultra/PCI machines. | 5 | * cmd64x.c: Enable interrupts at initialization time on Ultra/PCI machines. |
| 6 | * Note, this driver is not used at all on other systems because | 6 | * Note, this driver is not used at all on other systems because |
| @@ -189,6 +189,11 @@ static int cmd64x_get_info (char *buffer, char **addr, off_t offset, int count) | |||
| 189 | 189 | ||
| 190 | #endif /* defined(DISPLAY_CMD64X_TIMINGS) && defined(CONFIG_PROC_FS) */ | 190 | #endif /* defined(DISPLAY_CMD64X_TIMINGS) && defined(CONFIG_PROC_FS) */ |
| 191 | 191 | ||
| 192 | static u8 quantize_timing(int timing, int quant) | ||
| 193 | { | ||
| 194 | return (timing + quant - 1) / quant; | ||
| 195 | } | ||
| 196 | |||
| 192 | /* | 197 | /* |
| 193 | * This routine writes the prepared setup/active/recovery counts | 198 | * This routine writes the prepared setup/active/recovery counts |
| 194 | * for a drive into the cmd646 chipset registers to active them. | 199 | * for a drive into the cmd646 chipset registers to active them. |
| @@ -268,47 +273,37 @@ static void program_drive_counts (ide_drive_t *drive, int setup_count, int activ | |||
| 268 | */ | 273 | */ |
| 269 | static u8 cmd64x_tune_pio (ide_drive_t *drive, u8 mode_wanted) | 274 | static u8 cmd64x_tune_pio (ide_drive_t *drive, u8 mode_wanted) |
| 270 | { | 275 | { |
| 271 | int setup_time, active_time, recovery_time; | 276 | int setup_time, active_time, cycle_time; |
| 272 | int clock_time, pio_mode, cycle_time; | 277 | u8 cycle_count, setup_count, active_count, recovery_count; |
| 273 | u8 recovery_count2, cycle_count; | 278 | u8 pio_mode; |
| 274 | int setup_count, active_count, recovery_count; | 279 | int clock_time = 1000 / system_bus_clock(); |
| 275 | int bus_speed = system_bus_clock(); | 280 | ide_pio_data_t pio; |
| 276 | ide_pio_data_t d; | ||
| 277 | 281 | ||
| 278 | pio_mode = ide_get_best_pio_mode(drive, mode_wanted, 5, &d); | 282 | pio_mode = ide_get_best_pio_mode(drive, mode_wanted, 5, &pio); |
| 279 | cycle_time = d.cycle_time; | 283 | cycle_time = pio.cycle_time; |
| 280 | 284 | ||
| 281 | /* | ||
| 282 | * I copied all this complicated stuff from cmd640.c and made a few | ||
| 283 | * minor changes. For now I am just going to pray that it is correct. | ||
| 284 | */ | ||
| 285 | setup_time = ide_pio_timings[pio_mode].setup_time; | 285 | setup_time = ide_pio_timings[pio_mode].setup_time; |
| 286 | active_time = ide_pio_timings[pio_mode].active_time; | 286 | active_time = ide_pio_timings[pio_mode].active_time; |
| 287 | recovery_time = cycle_time - (setup_time + active_time); | ||
| 288 | clock_time = 1000 / bus_speed; | ||
| 289 | cycle_count = (cycle_time + clock_time - 1) / clock_time; | ||
| 290 | |||
| 291 | setup_count = (setup_time + clock_time - 1) / clock_time; | ||
| 292 | 287 | ||
| 293 | active_count = (active_time + clock_time - 1) / clock_time; | 288 | setup_count = quantize_timing( setup_time, clock_time); |
| 289 | cycle_count = quantize_timing( cycle_time, clock_time); | ||
| 290 | active_count = quantize_timing(active_time, clock_time); | ||
| 294 | 291 | ||
| 295 | recovery_count = (recovery_time + clock_time - 1) / clock_time; | 292 | recovery_count = cycle_count - active_count; |
| 296 | recovery_count2 = cycle_count - (setup_count + active_count); | 293 | /* program_drive_counts() takes care of zero recovery cycles */ |
| 297 | if (recovery_count2 > recovery_count) | ||
| 298 | recovery_count = recovery_count2; | ||
| 299 | if (recovery_count > 16) { | 294 | if (recovery_count > 16) { |
| 300 | active_count += recovery_count - 16; | 295 | active_count += recovery_count - 16; |
| 301 | recovery_count = 16; | 296 | recovery_count = 16; |
| 302 | } | 297 | } |
| 303 | if (active_count > 16) | 298 | if (active_count > 16) |
| 304 | active_count = 16; /* maximum allowed by cmd646 */ | 299 | active_count = 16; /* maximum allowed by cmd64x */ |
| 305 | 300 | ||
| 306 | program_drive_counts (drive, setup_count, active_count, recovery_count); | 301 | program_drive_counts (drive, setup_count, active_count, recovery_count); |
| 307 | 302 | ||
| 308 | cmdprintk("%s: PIO mode wanted %d, selected %d (%dns)%s, " | 303 | cmdprintk("%s: PIO mode wanted %d, selected %d (%dns)%s, " |
| 309 | "clocks=%d/%d/%d\n", | 304 | "clocks=%d/%d/%d\n", |
| 310 | drive->name, mode_wanted, pio_mode, cycle_time, | 305 | drive->name, mode_wanted, pio_mode, cycle_time, |
| 311 | d.overridden ? " (overriding vendor mode)" : "", | 306 | pio.overridden ? " (overriding vendor mode)" : "", |
| 312 | setup_count, active_count, recovery_count); | 307 | setup_count, active_count, recovery_count); |
| 313 | 308 | ||
| 314 | return pio_mode; | 309 | return pio_mode; |
diff --git a/drivers/ide/pci/jmicron.c b/drivers/ide/pci/jmicron.c index 53f25500c22b..be4fc96c29e0 100644 --- a/drivers/ide/pci/jmicron.c +++ b/drivers/ide/pci/jmicron.c | |||
| @@ -240,12 +240,31 @@ static int __devinit jmicron_init_one(struct pci_dev *dev, const struct pci_devi | |||
| 240 | return 0; | 240 | return 0; |
| 241 | } | 241 | } |
| 242 | 242 | ||
| 243 | /* If libata is configured, jmicron PCI quirk will configure it such | ||
| 244 | * that the SATA ports are in AHCI function while the PATA ports are | ||
| 245 | * in a separate IDE function. In such cases, match device class and | ||
| 246 | * attach only to IDE. If libata isn't configured, keep the old | ||
| 247 | * behavior for backward compatibility. | ||
| 248 | */ | ||
| 249 | #if defined(CONFIG_ATA) || defined(CONFIG_ATA_MODULE) | ||
| 250 | #define JMB_CLASS PCI_CLASS_STORAGE_IDE << 8 | ||
| 251 | #define JMB_CLASS_MASK 0xffff00 | ||
| 252 | #else | ||
| 253 | #define JMB_CLASS 0 | ||
| 254 | #define JMB_CLASS_MASK 0 | ||
| 255 | #endif | ||
| 256 | |||
| 243 | static struct pci_device_id jmicron_pci_tbl[] = { | 257 | static struct pci_device_id jmicron_pci_tbl[] = { |
| 244 | { PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB361, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, | 258 | { PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB361, |
| 245 | { PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB363, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 1}, | 259 | PCI_ANY_ID, PCI_ANY_ID, JMB_CLASS, JMB_CLASS_MASK, 0}, |
| 246 | { PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB365, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 2}, | 260 | { PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB363, |
| 247 | { PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB366, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 3}, | 261 | PCI_ANY_ID, PCI_ANY_ID, JMB_CLASS, JMB_CLASS_MASK, 1}, |
| 248 | { PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB368, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 4}, | 262 | { PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB365, |
| 263 | PCI_ANY_ID, PCI_ANY_ID, JMB_CLASS, JMB_CLASS_MASK, 2}, | ||
| 264 | { PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB366, | ||
| 265 | PCI_ANY_ID, PCI_ANY_ID, JMB_CLASS, JMB_CLASS_MASK, 3}, | ||
| 266 | { PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB368, | ||
| 267 | PCI_ANY_ID, PCI_ANY_ID, JMB_CLASS, JMB_CLASS_MASK, 4}, | ||
| 249 | { 0, }, | 268 | { 0, }, |
| 250 | }; | 269 | }; |
| 251 | 270 | ||
diff --git a/drivers/ide/ppc/scc_pata.c b/drivers/ide/pci/scc_pata.c index f84bf791f72e..f84bf791f72e 100644 --- a/drivers/ide/ppc/scc_pata.c +++ b/drivers/ide/pci/scc_pata.c | |||
diff --git a/drivers/ide/setup-pci.c b/drivers/ide/setup-pci.c index a52c80fe7d3e..118fb3205ca8 100644 --- a/drivers/ide/setup-pci.c +++ b/drivers/ide/setup-pci.c | |||
| @@ -505,11 +505,6 @@ static void ide_hwif_setup_dma(struct pci_dev *dev, ide_pci_device_t *d, ide_hwi | |||
| 505 | } | 505 | } |
| 506 | } | 506 | } |
| 507 | } | 507 | } |
| 508 | |||
| 509 | #ifndef CONFIG_IDEDMA_PCI_AUTO | ||
| 510 | #warning CONFIG_IDEDMA_PCI_AUTO=n support is obsolete, and will be removed soon. | ||
| 511 | #endif | ||
| 512 | |||
| 513 | #endif /* CONFIG_BLK_DEV_IDEDMA_PCI*/ | 508 | #endif /* CONFIG_BLK_DEV_IDEDMA_PCI*/ |
| 514 | 509 | ||
| 515 | /** | 510 | /** |
diff --git a/drivers/infiniband/hw/ipath/ipath_dma.c b/drivers/infiniband/hw/ipath/ipath_dma.c index f6f949040825..f87f003e3ef8 100644 --- a/drivers/infiniband/hw/ipath/ipath_dma.c +++ b/drivers/infiniband/hw/ipath/ipath_dma.c | |||
| @@ -167,7 +167,7 @@ static void *ipath_dma_alloc_coherent(struct ib_device *dev, size_t size, | |||
| 167 | } | 167 | } |
| 168 | 168 | ||
| 169 | static void ipath_dma_free_coherent(struct ib_device *dev, size_t size, | 169 | static void ipath_dma_free_coherent(struct ib_device *dev, size_t size, |
| 170 | void *cpu_addr, dma_addr_t dma_handle) | 170 | void *cpu_addr, u64 dma_handle) |
| 171 | { | 171 | { |
| 172 | free_pages((unsigned long) cpu_addr, get_order(size)); | 172 | free_pages((unsigned long) cpu_addr, get_order(size)); |
| 173 | } | 173 | } |
diff --git a/drivers/md/linear.c b/drivers/md/linear.c index c625ddb8833d..d5ecd2d53046 100644 --- a/drivers/md/linear.c +++ b/drivers/md/linear.c | |||
| @@ -188,7 +188,7 @@ static linear_conf_t *linear_conf(mddev_t *mddev, int raid_disks) | |||
| 188 | for (i=0; i < cnt-1 ; i++) { | 188 | for (i=0; i < cnt-1 ; i++) { |
| 189 | sector_t sz = 0; | 189 | sector_t sz = 0; |
| 190 | int j; | 190 | int j; |
| 191 | for (j=i; i<cnt-1 && sz < min_spacing ; j++) | 191 | for (j = i; j < cnt - 1 && sz < min_spacing; j++) |
| 192 | sz += conf->disks[j].size; | 192 | sz += conf->disks[j].size; |
| 193 | if (sz >= min_spacing && sz < conf->hash_spacing) | 193 | if (sz >= min_spacing && sz < conf->hash_spacing) |
| 194 | conf->hash_spacing = sz; | 194 | conf->hash_spacing = sz; |
diff --git a/drivers/media/video/pvrusb2/pvrusb2-hdw.c b/drivers/media/video/pvrusb2/pvrusb2-hdw.c index 1ff5138e4bb6..9916cf32494d 100644 --- a/drivers/media/video/pvrusb2/pvrusb2-hdw.c +++ b/drivers/media/video/pvrusb2/pvrusb2-hdw.c | |||
| @@ -1248,10 +1248,10 @@ int pvr2_upload_firmware2(struct pvr2_hdw *hdw) | |||
| 1248 | ret |= pvr2_write_register(hdw, 0xaa18, 0x00840000); /*unknown*/ | 1248 | ret |= pvr2_write_register(hdw, 0xaa18, 0x00840000); /*unknown*/ |
| 1249 | LOCK_TAKE(hdw->ctl_lock); do { | 1249 | LOCK_TAKE(hdw->ctl_lock); do { |
| 1250 | hdw->cmd_buffer[0] = FX2CMD_FWPOST1; | 1250 | hdw->cmd_buffer[0] = FX2CMD_FWPOST1; |
| 1251 | ret |= pvr2_send_request(hdw,hdw->cmd_buffer,1,0,0); | 1251 | ret |= pvr2_send_request(hdw,hdw->cmd_buffer,1,NULL,0); |
| 1252 | hdw->cmd_buffer[0] = FX2CMD_MEMSEL; | 1252 | hdw->cmd_buffer[0] = FX2CMD_MEMSEL; |
| 1253 | hdw->cmd_buffer[1] = 0; | 1253 | hdw->cmd_buffer[1] = 0; |
| 1254 | ret |= pvr2_send_request(hdw,hdw->cmd_buffer,2,0,0); | 1254 | ret |= pvr2_send_request(hdw,hdw->cmd_buffer,2,NULL,0); |
| 1255 | } while (0); LOCK_GIVE(hdw->ctl_lock); | 1255 | } while (0); LOCK_GIVE(hdw->ctl_lock); |
| 1256 | 1256 | ||
| 1257 | if (ret) { | 1257 | if (ret) { |
| @@ -1320,7 +1320,7 @@ int pvr2_upload_firmware2(struct pvr2_hdw *hdw) | |||
| 1320 | LOCK_TAKE(hdw->ctl_lock); do { | 1320 | LOCK_TAKE(hdw->ctl_lock); do { |
| 1321 | hdw->cmd_buffer[0] = FX2CMD_MEMSEL; | 1321 | hdw->cmd_buffer[0] = FX2CMD_MEMSEL; |
| 1322 | hdw->cmd_buffer[1] = 0; | 1322 | hdw->cmd_buffer[1] = 0; |
| 1323 | ret |= pvr2_send_request(hdw,hdw->cmd_buffer,2,0,0); | 1323 | ret |= pvr2_send_request(hdw,hdw->cmd_buffer,2,NULL,0); |
| 1324 | } while (0); LOCK_GIVE(hdw->ctl_lock); | 1324 | } while (0); LOCK_GIVE(hdw->ctl_lock); |
| 1325 | 1325 | ||
| 1326 | if (ret) { | 1326 | if (ret) { |
diff --git a/drivers/media/video/pvrusb2/pvrusb2-v4l2.c b/drivers/media/video/pvrusb2/pvrusb2-v4l2.c index 5313d342666e..25d3830b482a 100644 --- a/drivers/media/video/pvrusb2/pvrusb2-v4l2.c +++ b/drivers/media/video/pvrusb2/pvrusb2-v4l2.c | |||
| @@ -808,11 +808,11 @@ static void pvr2_v4l2_destroy_no_lock(struct pvr2_v4l2 *vp) | |||
| 808 | { | 808 | { |
| 809 | if (vp->dev_video) { | 809 | if (vp->dev_video) { |
| 810 | pvr2_v4l2_dev_destroy(vp->dev_video); | 810 | pvr2_v4l2_dev_destroy(vp->dev_video); |
| 811 | vp->dev_video = 0; | 811 | vp->dev_video = NULL; |
| 812 | } | 812 | } |
| 813 | if (vp->dev_radio) { | 813 | if (vp->dev_radio) { |
| 814 | pvr2_v4l2_dev_destroy(vp->dev_radio); | 814 | pvr2_v4l2_dev_destroy(vp->dev_radio); |
| 815 | vp->dev_radio = 0; | 815 | vp->dev_radio = NULL; |
| 816 | } | 816 | } |
| 817 | 817 | ||
| 818 | pvr2_trace(PVR2_TRACE_STRUCT,"Destroying pvr2_v4l2 id=%p",vp); | 818 | pvr2_trace(PVR2_TRACE_STRUCT,"Destroying pvr2_v4l2 id=%p",vp); |
| @@ -1138,7 +1138,7 @@ static void pvr2_v4l2_dev_init(struct pvr2_v4l2_dev *dip, | |||
| 1138 | { | 1138 | { |
| 1139 | int mindevnum; | 1139 | int mindevnum; |
| 1140 | int unit_number; | 1140 | int unit_number; |
| 1141 | int *nr_ptr = 0; | 1141 | int *nr_ptr = NULL; |
| 1142 | dip->v4lp = vp; | 1142 | dip->v4lp = vp; |
| 1143 | 1143 | ||
| 1144 | 1144 | ||
diff --git a/drivers/net/atl1/atl1_main.c b/drivers/net/atl1/atl1_main.c index 88d4f70035bb..dee3638ad744 100644 --- a/drivers/net/atl1/atl1_main.c +++ b/drivers/net/atl1/atl1_main.c | |||
| @@ -1328,7 +1328,7 @@ static int atl1_tx_csum(struct atl1_adapter *adapter, struct sk_buff *skb, | |||
| 1328 | 1328 | ||
| 1329 | if (likely(skb->ip_summed == CHECKSUM_PARTIAL)) { | 1329 | if (likely(skb->ip_summed == CHECKSUM_PARTIAL)) { |
| 1330 | cso = skb->h.raw - skb->data; | 1330 | cso = skb->h.raw - skb->data; |
| 1331 | css = (skb->h.raw + skb->csum) - skb->data; | 1331 | css = (skb->h.raw + skb->csum_offset) - skb->data; |
| 1332 | if (unlikely(cso & 0x1)) { | 1332 | if (unlikely(cso & 0x1)) { |
| 1333 | printk(KERN_DEBUG "%s: payload offset != even number\n", | 1333 | printk(KERN_DEBUG "%s: payload offset != even number\n", |
| 1334 | atl1_driver_name); | 1334 | atl1_driver_name); |
| @@ -1562,7 +1562,7 @@ static int atl1_xmit_frame(struct sk_buff *skb, struct net_device *netdev) | |||
| 1562 | /* mss will be nonzero if we're doing segment offload (TSO/GSO) */ | 1562 | /* mss will be nonzero if we're doing segment offload (TSO/GSO) */ |
| 1563 | mss = skb_shinfo(skb)->gso_size; | 1563 | mss = skb_shinfo(skb)->gso_size; |
| 1564 | if (mss) { | 1564 | if (mss) { |
| 1565 | if (skb->protocol == ntohs(ETH_P_IP)) { | 1565 | if (skb->protocol == htons(ETH_P_IP)) { |
| 1566 | proto_hdr_len = ((skb->h.raw - skb->data) + | 1566 | proto_hdr_len = ((skb->h.raw - skb->data) + |
| 1567 | (skb->h.th->doff << 2)); | 1567 | (skb->h.th->doff << 2)); |
| 1568 | if (unlikely(proto_hdr_len > len)) { | 1568 | if (unlikely(proto_hdr_len > len)) { |
diff --git a/drivers/net/natsemi.c b/drivers/net/natsemi.c index c6172a77a6d7..349b96a3ec4c 100644 --- a/drivers/net/natsemi.c +++ b/drivers/net/natsemi.c | |||
| @@ -1712,7 +1712,7 @@ static void init_registers(struct net_device *dev) | |||
| 1712 | 1712 | ||
| 1713 | /* Enable interrupts by setting the interrupt mask. */ | 1713 | /* Enable interrupts by setting the interrupt mask. */ |
| 1714 | writel(DEFAULT_INTR, ioaddr + IntrMask); | 1714 | writel(DEFAULT_INTR, ioaddr + IntrMask); |
| 1715 | writel(1, ioaddr + IntrEnable); | 1715 | natsemi_irq_enable(dev); |
| 1716 | 1716 | ||
| 1717 | writel(RxOn | TxOn, ioaddr + ChipCmd); | 1717 | writel(RxOn | TxOn, ioaddr + ChipCmd); |
| 1718 | writel(StatsClear, ioaddr + StatsCtrl); /* Clear Stats */ | 1718 | writel(StatsClear, ioaddr + StatsCtrl); /* Clear Stats */ |
| @@ -2119,28 +2119,35 @@ static irqreturn_t intr_handler(int irq, void *dev_instance) | |||
| 2119 | struct netdev_private *np = netdev_priv(dev); | 2119 | struct netdev_private *np = netdev_priv(dev); |
| 2120 | void __iomem * ioaddr = ns_ioaddr(dev); | 2120 | void __iomem * ioaddr = ns_ioaddr(dev); |
| 2121 | 2121 | ||
| 2122 | if (np->hands_off) | 2122 | /* Reading IntrStatus automatically acknowledges so don't do |
| 2123 | * that while interrupts are disabled, (for example, while a | ||
| 2124 | * poll is scheduled). */ | ||
| 2125 | if (np->hands_off || !readl(ioaddr + IntrEnable)) | ||
| 2123 | return IRQ_NONE; | 2126 | return IRQ_NONE; |
| 2124 | 2127 | ||
| 2125 | /* Reading automatically acknowledges. */ | ||
| 2126 | np->intr_status = readl(ioaddr + IntrStatus); | 2128 | np->intr_status = readl(ioaddr + IntrStatus); |
| 2127 | 2129 | ||
| 2130 | if (!np->intr_status) | ||
| 2131 | return IRQ_NONE; | ||
| 2132 | |||
| 2128 | if (netif_msg_intr(np)) | 2133 | if (netif_msg_intr(np)) |
| 2129 | printk(KERN_DEBUG | 2134 | printk(KERN_DEBUG |
| 2130 | "%s: Interrupt, status %#08x, mask %#08x.\n", | 2135 | "%s: Interrupt, status %#08x, mask %#08x.\n", |
| 2131 | dev->name, np->intr_status, | 2136 | dev->name, np->intr_status, |
| 2132 | readl(ioaddr + IntrMask)); | 2137 | readl(ioaddr + IntrMask)); |
| 2133 | 2138 | ||
| 2134 | if (!np->intr_status) | ||
| 2135 | return IRQ_NONE; | ||
| 2136 | |||
| 2137 | prefetch(&np->rx_skbuff[np->cur_rx % RX_RING_SIZE]); | 2139 | prefetch(&np->rx_skbuff[np->cur_rx % RX_RING_SIZE]); |
| 2138 | 2140 | ||
| 2139 | if (netif_rx_schedule_prep(dev)) { | 2141 | if (netif_rx_schedule_prep(dev)) { |
| 2140 | /* Disable interrupts and register for poll */ | 2142 | /* Disable interrupts and register for poll */ |
| 2141 | natsemi_irq_disable(dev); | 2143 | natsemi_irq_disable(dev); |
| 2142 | __netif_rx_schedule(dev); | 2144 | __netif_rx_schedule(dev); |
| 2143 | } | 2145 | } else |
| 2146 | printk(KERN_WARNING | ||
| 2147 | "%s: Ignoring interrupt, status %#08x, mask %#08x.\n", | ||
| 2148 | dev->name, np->intr_status, | ||
| 2149 | readl(ioaddr + IntrMask)); | ||
| 2150 | |||
| 2144 | return IRQ_HANDLED; | 2151 | return IRQ_HANDLED; |
| 2145 | } | 2152 | } |
| 2146 | 2153 | ||
| @@ -2156,6 +2163,20 @@ static int natsemi_poll(struct net_device *dev, int *budget) | |||
| 2156 | int work_done = 0; | 2163 | int work_done = 0; |
| 2157 | 2164 | ||
| 2158 | do { | 2165 | do { |
| 2166 | if (netif_msg_intr(np)) | ||
| 2167 | printk(KERN_DEBUG | ||
| 2168 | "%s: Poll, status %#08x, mask %#08x.\n", | ||
| 2169 | dev->name, np->intr_status, | ||
| 2170 | readl(ioaddr + IntrMask)); | ||
| 2171 | |||
| 2172 | /* netdev_rx() may read IntrStatus again if the RX state | ||
| 2173 | * machine falls over so do it first. */ | ||
| 2174 | if (np->intr_status & | ||
| 2175 | (IntrRxDone | IntrRxIntr | RxStatusFIFOOver | | ||
| 2176 | IntrRxErr | IntrRxOverrun)) { | ||
| 2177 | netdev_rx(dev, &work_done, work_to_do); | ||
| 2178 | } | ||
| 2179 | |||
| 2159 | if (np->intr_status & | 2180 | if (np->intr_status & |
| 2160 | (IntrTxDone | IntrTxIntr | IntrTxIdle | IntrTxErr)) { | 2181 | (IntrTxDone | IntrTxIntr | IntrTxIdle | IntrTxErr)) { |
| 2161 | spin_lock(&np->lock); | 2182 | spin_lock(&np->lock); |
| @@ -2167,12 +2188,6 @@ static int natsemi_poll(struct net_device *dev, int *budget) | |||
| 2167 | if (np->intr_status & IntrAbnormalSummary) | 2188 | if (np->intr_status & IntrAbnormalSummary) |
| 2168 | netdev_error(dev, np->intr_status); | 2189 | netdev_error(dev, np->intr_status); |
| 2169 | 2190 | ||
| 2170 | if (np->intr_status & | ||
| 2171 | (IntrRxDone | IntrRxIntr | RxStatusFIFOOver | | ||
| 2172 | IntrRxErr | IntrRxOverrun)) { | ||
| 2173 | netdev_rx(dev, &work_done, work_to_do); | ||
| 2174 | } | ||
| 2175 | |||
| 2176 | *budget -= work_done; | 2191 | *budget -= work_done; |
| 2177 | dev->quota -= work_done; | 2192 | dev->quota -= work_done; |
| 2178 | 2193 | ||
| @@ -2399,19 +2414,8 @@ static struct net_device_stats *get_stats(struct net_device *dev) | |||
| 2399 | #ifdef CONFIG_NET_POLL_CONTROLLER | 2414 | #ifdef CONFIG_NET_POLL_CONTROLLER |
| 2400 | static void natsemi_poll_controller(struct net_device *dev) | 2415 | static void natsemi_poll_controller(struct net_device *dev) |
| 2401 | { | 2416 | { |
| 2402 | struct netdev_private *np = netdev_priv(dev); | ||
| 2403 | |||
| 2404 | disable_irq(dev->irq); | 2417 | disable_irq(dev->irq); |
| 2405 | 2418 | intr_handler(dev->irq, dev); | |
| 2406 | /* | ||
| 2407 | * A real interrupt might have already reached us at this point | ||
| 2408 | * but NAPI might still haven't called us back. As the interrupt | ||
| 2409 | * status register is cleared by reading, we should prevent an | ||
| 2410 | * interrupt loss in this case... | ||
| 2411 | */ | ||
| 2412 | if (!np->intr_status) | ||
| 2413 | intr_handler(dev->irq, dev); | ||
| 2414 | |||
| 2415 | enable_irq(dev->irq); | 2419 | enable_irq(dev->irq); |
| 2416 | } | 2420 | } |
| 2417 | #endif | 2421 | #endif |
| @@ -3071,7 +3075,7 @@ static void enable_wol_mode(struct net_device *dev, int enable_intr) | |||
| 3071 | * Could be used to send a netlink message. | 3075 | * Could be used to send a netlink message. |
| 3072 | */ | 3076 | */ |
| 3073 | writel(WOLPkt | LinkChange, ioaddr + IntrMask); | 3077 | writel(WOLPkt | LinkChange, ioaddr + IntrMask); |
| 3074 | writel(1, ioaddr + IntrEnable); | 3078 | natsemi_irq_enable(dev); |
| 3075 | } | 3079 | } |
| 3076 | } | 3080 | } |
| 3077 | 3081 | ||
| @@ -3202,7 +3206,7 @@ static int natsemi_suspend (struct pci_dev *pdev, pm_message_t state) | |||
| 3202 | disable_irq(dev->irq); | 3206 | disable_irq(dev->irq); |
| 3203 | spin_lock_irq(&np->lock); | 3207 | spin_lock_irq(&np->lock); |
| 3204 | 3208 | ||
| 3205 | writel(0, ioaddr + IntrEnable); | 3209 | natsemi_irq_disable(dev); |
| 3206 | np->hands_off = 1; | 3210 | np->hands_off = 1; |
| 3207 | natsemi_stop_rxtx(dev); | 3211 | natsemi_stop_rxtx(dev); |
| 3208 | netif_stop_queue(dev); | 3212 | netif_stop_queue(dev); |
diff --git a/drivers/net/netxen/netxen_nic.h b/drivers/net/netxen/netxen_nic.h index 81742e4e5610..dd8ce35332fe 100644 --- a/drivers/net/netxen/netxen_nic.h +++ b/drivers/net/netxen/netxen_nic.h | |||
| @@ -232,6 +232,7 @@ enum { | |||
| 232 | #define MPORT_SINGLE_FUNCTION_MODE 0x1111 | 232 | #define MPORT_SINGLE_FUNCTION_MODE 0x1111 |
| 233 | 233 | ||
| 234 | extern unsigned long long netxen_dma_mask; | 234 | extern unsigned long long netxen_dma_mask; |
| 235 | extern unsigned long last_schedule_time; | ||
| 235 | 236 | ||
| 236 | /* | 237 | /* |
| 237 | * NetXen host-peg signal message structure | 238 | * NetXen host-peg signal message structure |
diff --git a/drivers/net/netxen/netxen_nic_ethtool.c b/drivers/net/netxen/netxen_nic_ethtool.c index 986ef98db229..ee1b5a24cbe7 100644 --- a/drivers/net/netxen/netxen_nic_ethtool.c +++ b/drivers/net/netxen/netxen_nic_ethtool.c | |||
| @@ -462,6 +462,7 @@ netxen_nic_set_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom, | |||
| 462 | } | 462 | } |
| 463 | printk(KERN_INFO "%s: flash unlocked. \n", | 463 | printk(KERN_INFO "%s: flash unlocked. \n", |
| 464 | netxen_nic_driver_name); | 464 | netxen_nic_driver_name); |
| 465 | last_schedule_time = jiffies; | ||
| 465 | ret = netxen_flash_erase_secondary(adapter); | 466 | ret = netxen_flash_erase_secondary(adapter); |
| 466 | if (ret != FLASH_SUCCESS) { | 467 | if (ret != FLASH_SUCCESS) { |
| 467 | printk(KERN_ERR "%s: Flash erase failed.\n", | 468 | printk(KERN_ERR "%s: Flash erase failed.\n", |
diff --git a/drivers/net/netxen/netxen_nic_hw.c b/drivers/net/netxen/netxen_nic_hw.c index 1be55702557d..6537574a9cda 100644 --- a/drivers/net/netxen/netxen_nic_hw.c +++ b/drivers/net/netxen/netxen_nic_hw.c | |||
| @@ -822,7 +822,10 @@ int netxen_nic_set_mtu_xgb(struct netxen_port *port, int new_mtu) | |||
| 822 | { | 822 | { |
| 823 | struct netxen_adapter *adapter = port->adapter; | 823 | struct netxen_adapter *adapter = port->adapter; |
| 824 | new_mtu += NETXEN_NIU_HDRSIZE + NETXEN_NIU_TLRSIZE; | 824 | new_mtu += NETXEN_NIU_HDRSIZE + NETXEN_NIU_TLRSIZE; |
| 825 | netxen_nic_write_w0(adapter, NETXEN_NIU_XGE_MAX_FRAME_SIZE, new_mtu); | 825 | if (port->portnum == 0) |
| 826 | netxen_nic_write_w0(adapter, NETXEN_NIU_XGE_MAX_FRAME_SIZE, new_mtu); | ||
| 827 | else if (port->portnum == 1) | ||
| 828 | netxen_nic_write_w0(adapter, NETXEN_NIU_XG1_MAX_FRAME_SIZE, new_mtu); | ||
| 826 | return 0; | 829 | return 0; |
| 827 | } | 830 | } |
| 828 | 831 | ||
diff --git a/drivers/net/netxen/netxen_nic_init.c b/drivers/net/netxen/netxen_nic_init.c index 586d32b676af..229aa1c4fb79 100644 --- a/drivers/net/netxen/netxen_nic_init.c +++ b/drivers/net/netxen/netxen_nic_init.c | |||
| @@ -42,6 +42,8 @@ struct crb_addr_pair { | |||
| 42 | u32 data; | 42 | u32 data; |
| 43 | }; | 43 | }; |
| 44 | 44 | ||
| 45 | unsigned long last_schedule_time; | ||
| 46 | |||
| 45 | #define NETXEN_MAX_CRB_XFORM 60 | 47 | #define NETXEN_MAX_CRB_XFORM 60 |
| 46 | static unsigned int crb_addr_xform[NETXEN_MAX_CRB_XFORM]; | 48 | static unsigned int crb_addr_xform[NETXEN_MAX_CRB_XFORM]; |
| 47 | #define NETXEN_ADDR_ERROR (0xffffffff) | 49 | #define NETXEN_ADDR_ERROR (0xffffffff) |
| @@ -404,9 +406,14 @@ static inline int do_rom_fast_write(struct netxen_adapter *adapter, int addr, | |||
| 404 | static inline int | 406 | static inline int |
| 405 | do_rom_fast_read(struct netxen_adapter *adapter, int addr, int *valp) | 407 | do_rom_fast_read(struct netxen_adapter *adapter, int addr, int *valp) |
| 406 | { | 408 | { |
| 409 | if (jiffies > (last_schedule_time + (8 * HZ))) { | ||
| 410 | last_schedule_time = jiffies; | ||
| 411 | schedule(); | ||
| 412 | } | ||
| 413 | |||
| 407 | netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_ADDRESS, addr); | 414 | netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_ADDRESS, addr); |
| 408 | netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_ABYTE_CNT, 3); | 415 | netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_ABYTE_CNT, 3); |
| 409 | udelay(70); /* prevent bursting on CRB */ | 416 | udelay(100); /* prevent bursting on CRB */ |
| 410 | netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_DUMMY_BYTE_CNT, 0); | 417 | netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_DUMMY_BYTE_CNT, 0); |
| 411 | netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_INSTR_OPCODE, 0xb); | 418 | netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_INSTR_OPCODE, 0xb); |
| 412 | if (netxen_wait_rom_done(adapter)) { | 419 | if (netxen_wait_rom_done(adapter)) { |
| @@ -415,7 +422,7 @@ do_rom_fast_read(struct netxen_adapter *adapter, int addr, int *valp) | |||
| 415 | } | 422 | } |
| 416 | /* reset abyte_cnt and dummy_byte_cnt */ | 423 | /* reset abyte_cnt and dummy_byte_cnt */ |
| 417 | netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_ABYTE_CNT, 0); | 424 | netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_ABYTE_CNT, 0); |
| 418 | udelay(70); /* prevent bursting on CRB */ | 425 | udelay(100); /* prevent bursting on CRB */ |
| 419 | netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_DUMMY_BYTE_CNT, 0); | 426 | netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_DUMMY_BYTE_CNT, 0); |
| 420 | 427 | ||
| 421 | *valp = netxen_nic_reg_read(adapter, NETXEN_ROMUSB_ROM_RDATA); | 428 | *valp = netxen_nic_reg_read(adapter, NETXEN_ROMUSB_ROM_RDATA); |
diff --git a/drivers/net/pcmcia/ibmtr_cs.c b/drivers/net/pcmcia/ibmtr_cs.c index a956a51d284f..1060154ae750 100644 --- a/drivers/net/pcmcia/ibmtr_cs.c +++ b/drivers/net/pcmcia/ibmtr_cs.c | |||
| @@ -138,7 +138,7 @@ static const struct ethtool_ops netdev_ethtool_ops = { | |||
| 138 | 138 | ||
| 139 | ======================================================================*/ | 139 | ======================================================================*/ |
| 140 | 140 | ||
| 141 | static int ibmtr_attach(struct pcmcia_device *link) | 141 | static int __devinit ibmtr_attach(struct pcmcia_device *link) |
| 142 | { | 142 | { |
| 143 | ibmtr_dev_t *info; | 143 | ibmtr_dev_t *info; |
| 144 | struct net_device *dev; | 144 | struct net_device *dev; |
| @@ -217,7 +217,7 @@ static void ibmtr_detach(struct pcmcia_device *link) | |||
| 217 | #define CS_CHECK(fn, ret) \ | 217 | #define CS_CHECK(fn, ret) \ |
| 218 | do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0) | 218 | do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0) |
| 219 | 219 | ||
| 220 | static int ibmtr_config(struct pcmcia_device *link) | 220 | static int __devinit ibmtr_config(struct pcmcia_device *link) |
| 221 | { | 221 | { |
| 222 | ibmtr_dev_t *info = link->priv; | 222 | ibmtr_dev_t *info = link->priv; |
| 223 | struct net_device *dev = info->dev; | 223 | struct net_device *dev = info->dev; |
diff --git a/drivers/net/skge.c b/drivers/net/skge.c index eea75a401b0c..8fecf1b817f7 100644 --- a/drivers/net/skge.c +++ b/drivers/net/skge.c | |||
| @@ -3275,24 +3275,30 @@ static int skge_set_mac_address(struct net_device *dev, void *p) | |||
| 3275 | struct skge_hw *hw = skge->hw; | 3275 | struct skge_hw *hw = skge->hw; |
| 3276 | unsigned port = skge->port; | 3276 | unsigned port = skge->port; |
| 3277 | const struct sockaddr *addr = p; | 3277 | const struct sockaddr *addr = p; |
| 3278 | u16 ctrl; | ||
| 3278 | 3279 | ||
| 3279 | if (!is_valid_ether_addr(addr->sa_data)) | 3280 | if (!is_valid_ether_addr(addr->sa_data)) |
| 3280 | return -EADDRNOTAVAIL; | 3281 | return -EADDRNOTAVAIL; |
| 3281 | 3282 | ||
| 3282 | mutex_lock(&hw->phy_mutex); | ||
| 3283 | memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN); | 3283 | memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN); |
| 3284 | memcpy_toio(hw->regs + B2_MAC_1 + port*8, | ||
| 3285 | dev->dev_addr, ETH_ALEN); | ||
| 3286 | memcpy_toio(hw->regs + B2_MAC_2 + port*8, | ||
| 3287 | dev->dev_addr, ETH_ALEN); | ||
| 3288 | 3284 | ||
| 3289 | if (hw->chip_id == CHIP_ID_GENESIS) | 3285 | /* disable Rx */ |
| 3290 | xm_outaddr(hw, port, XM_SA, dev->dev_addr); | 3286 | ctrl = gma_read16(hw, port, GM_GP_CTRL); |
| 3291 | else { | 3287 | gma_write16(hw, port, GM_GP_CTRL, ctrl & ~GM_GPCR_RX_ENA); |
| 3292 | gma_set_addr(hw, port, GM_SRC_ADDR_1L, dev->dev_addr); | 3288 | |
| 3293 | gma_set_addr(hw, port, GM_SRC_ADDR_2L, dev->dev_addr); | 3289 | memcpy_toio(hw->regs + B2_MAC_1 + port*8, dev->dev_addr, ETH_ALEN); |
| 3290 | memcpy_toio(hw->regs + B2_MAC_2 + port*8, dev->dev_addr, ETH_ALEN); | ||
| 3291 | |||
| 3292 | if (netif_running(dev)) { | ||
| 3293 | if (hw->chip_id == CHIP_ID_GENESIS) | ||
| 3294 | xm_outaddr(hw, port, XM_SA, dev->dev_addr); | ||
| 3295 | else { | ||
| 3296 | gma_set_addr(hw, port, GM_SRC_ADDR_1L, dev->dev_addr); | ||
| 3297 | gma_set_addr(hw, port, GM_SRC_ADDR_2L, dev->dev_addr); | ||
| 3298 | } | ||
| 3294 | } | 3299 | } |
| 3295 | mutex_unlock(&hw->phy_mutex); | 3300 | |
| 3301 | gma_write16(hw, port, GM_GP_CTRL, ctrl); | ||
| 3296 | 3302 | ||
| 3297 | return 0; | 3303 | return 0; |
| 3298 | } | 3304 | } |
diff --git a/drivers/net/tokenring/ibmtr.c b/drivers/net/tokenring/ibmtr.c index 36202e94ee91..01d55315ee8c 100644 --- a/drivers/net/tokenring/ibmtr.c +++ b/drivers/net/tokenring/ibmtr.c | |||
| @@ -346,7 +346,7 @@ static void ibmtr_cleanup_card(struct net_device *dev) | |||
| 346 | * which references it. | 346 | * which references it. |
| 347 | ****************************************************************************/ | 347 | ****************************************************************************/ |
| 348 | 348 | ||
| 349 | static int __init ibmtr_probe(struct net_device *dev) | 349 | static int __devinit ibmtr_probe(struct net_device *dev) |
| 350 | { | 350 | { |
| 351 | int i; | 351 | int i; |
| 352 | int base_addr = dev->base_addr; | 352 | int base_addr = dev->base_addr; |
| @@ -366,7 +366,7 @@ static int __init ibmtr_probe(struct net_device *dev) | |||
| 366 | return -ENODEV; | 366 | return -ENODEV; |
| 367 | } | 367 | } |
| 368 | 368 | ||
| 369 | int __init ibmtr_probe_card(struct net_device *dev) | 369 | int __devinit ibmtr_probe_card(struct net_device *dev) |
| 370 | { | 370 | { |
| 371 | int err = ibmtr_probe(dev); | 371 | int err = ibmtr_probe(dev); |
| 372 | if (!err) { | 372 | if (!err) { |
diff --git a/drivers/net/tulip/dmfe.c b/drivers/net/tulip/dmfe.c index 24a29c99ba94..9aeac76184f3 100644 --- a/drivers/net/tulip/dmfe.c +++ b/drivers/net/tulip/dmfe.c | |||
| @@ -190,13 +190,13 @@ | |||
| 190 | 190 | ||
| 191 | /* Structure/enum declaration ------------------------------- */ | 191 | /* Structure/enum declaration ------------------------------- */ |
| 192 | struct tx_desc { | 192 | struct tx_desc { |
| 193 | u32 tdes0, tdes1, tdes2, tdes3; /* Data for the card */ | 193 | __le32 tdes0, tdes1, tdes2, tdes3; /* Data for the card */ |
| 194 | char *tx_buf_ptr; /* Data for us */ | 194 | char *tx_buf_ptr; /* Data for us */ |
| 195 | struct tx_desc *next_tx_desc; | 195 | struct tx_desc *next_tx_desc; |
| 196 | } __attribute__(( aligned(32) )); | 196 | } __attribute__(( aligned(32) )); |
| 197 | 197 | ||
| 198 | struct rx_desc { | 198 | struct rx_desc { |
| 199 | u32 rdes0, rdes1, rdes2, rdes3; /* Data for the card */ | 199 | __le32 rdes0, rdes1, rdes2, rdes3; /* Data for the card */ |
| 200 | struct sk_buff *rx_skb_ptr; /* Data for us */ | 200 | struct sk_buff *rx_skb_ptr; /* Data for us */ |
| 201 | struct rx_desc *next_rx_desc; | 201 | struct rx_desc *next_rx_desc; |
| 202 | } __attribute__(( aligned(32) )); | 202 | } __attribute__(( aligned(32) )); |
| @@ -458,7 +458,7 @@ static int __devinit dmfe_init_one (struct pci_dev *pdev, | |||
| 458 | 458 | ||
| 459 | /* read 64 word srom data */ | 459 | /* read 64 word srom data */ |
| 460 | for (i = 0; i < 64; i++) | 460 | for (i = 0; i < 64; i++) |
| 461 | ((u16 *) db->srom)[i] = | 461 | ((__le16 *) db->srom)[i] = |
| 462 | cpu_to_le16(read_srom_word(db->ioaddr, i)); | 462 | cpu_to_le16(read_srom_word(db->ioaddr, i)); |
| 463 | 463 | ||
| 464 | /* Set Node address */ | 464 | /* Set Node address */ |
diff --git a/drivers/pnp/manager.c b/drivers/pnp/manager.c index 5026b345cb30..57e6ab1004d0 100644 --- a/drivers/pnp/manager.c +++ b/drivers/pnp/manager.c | |||
| @@ -451,7 +451,7 @@ int pnp_auto_config_dev(struct pnp_dev *dev) | |||
| 451 | return -EINVAL; | 451 | return -EINVAL; |
| 452 | 452 | ||
| 453 | if(!pnp_can_configure(dev)) { | 453 | if(!pnp_can_configure(dev)) { |
| 454 | pnp_info("Device %s does not support resource configuration.", dev->dev.bus_id); | 454 | pnp_dbg("Device %s does not support resource configuration.", dev->dev.bus_id); |
| 455 | return -ENODEV; | 455 | return -ENODEV; |
| 456 | } | 456 | } |
| 457 | 457 | ||
| @@ -482,7 +482,7 @@ int pnp_auto_config_dev(struct pnp_dev *dev) | |||
| 482 | int pnp_start_dev(struct pnp_dev *dev) | 482 | int pnp_start_dev(struct pnp_dev *dev) |
| 483 | { | 483 | { |
| 484 | if (!pnp_can_write(dev)) { | 484 | if (!pnp_can_write(dev)) { |
| 485 | pnp_info("Device %s does not support activation.", dev->dev.bus_id); | 485 | pnp_dbg("Device %s does not support activation.", dev->dev.bus_id); |
| 486 | return -EINVAL; | 486 | return -EINVAL; |
| 487 | } | 487 | } |
| 488 | 488 | ||
| @@ -506,7 +506,7 @@ int pnp_start_dev(struct pnp_dev *dev) | |||
| 506 | int pnp_stop_dev(struct pnp_dev *dev) | 506 | int pnp_stop_dev(struct pnp_dev *dev) |
| 507 | { | 507 | { |
| 508 | if (!pnp_can_disable(dev)) { | 508 | if (!pnp_can_disable(dev)) { |
| 509 | pnp_info("Device %s does not support disabling.", dev->dev.bus_id); | 509 | pnp_dbg("Device %s does not support disabling.", dev->dev.bus_id); |
| 510 | return -EINVAL; | 510 | return -EINVAL; |
| 511 | } | 511 | } |
| 512 | if (dev->protocol->disable(dev)<0) { | 512 | if (dev->protocol->disable(dev)<0) { |
diff --git a/drivers/ps3/ps3av_cmd.c b/drivers/ps3/ps3av_cmd.c index 21c97c80aa2e..bc70e81f8cb0 100644 --- a/drivers/ps3/ps3av_cmd.c +++ b/drivers/ps3/ps3av_cmd.c | |||
| @@ -485,12 +485,12 @@ static u8 ps3av_cnv_mclk(u32 fs) | |||
| 485 | 485 | ||
| 486 | static const u32 ps3av_ns_table[][5] = { | 486 | static const u32 ps3av_ns_table[][5] = { |
| 487 | /* D1, D2, D3, D4, D5 */ | 487 | /* D1, D2, D3, D4, D5 */ |
| 488 | [PS3AV_CMD_AUDIO_FS_44K-BASE] { 6272, 6272, 17836, 17836, 8918 }, | 488 | [PS3AV_CMD_AUDIO_FS_44K-BASE] = { 6272, 6272, 17836, 17836, 8918 }, |
| 489 | [PS3AV_CMD_AUDIO_FS_48K-BASE] { 6144, 6144, 11648, 11648, 5824 }, | 489 | [PS3AV_CMD_AUDIO_FS_48K-BASE] = { 6144, 6144, 11648, 11648, 5824 }, |
| 490 | [PS3AV_CMD_AUDIO_FS_88K-BASE] { 12544, 12544, 35672, 35672, 17836 }, | 490 | [PS3AV_CMD_AUDIO_FS_88K-BASE] = { 12544, 12544, 35672, 35672, 17836 }, |
| 491 | [PS3AV_CMD_AUDIO_FS_96K-BASE] { 12288, 12288, 23296, 23296, 11648 }, | 491 | [PS3AV_CMD_AUDIO_FS_96K-BASE] = { 12288, 12288, 23296, 23296, 11648 }, |
| 492 | [PS3AV_CMD_AUDIO_FS_176K-BASE] { 25088, 25088, 71344, 71344, 35672 }, | 492 | [PS3AV_CMD_AUDIO_FS_176K-BASE] = { 25088, 25088, 71344, 71344, 35672 }, |
| 493 | [PS3AV_CMD_AUDIO_FS_192K-BASE] { 24576, 24576, 46592, 46592, 23296 } | 493 | [PS3AV_CMD_AUDIO_FS_192K-BASE] = { 24576, 24576, 46592, 46592, 23296 } |
| 494 | }; | 494 | }; |
| 495 | 495 | ||
| 496 | static void ps3av_cnv_ns(u8 *ns, u32 fs, u32 video_vid) | 496 | static void ps3av_cnv_ns(u8 *ns, u32 fs, u32 video_vid) |
| @@ -543,9 +543,10 @@ static void ps3av_cnv_ns(u8 *ns, u32 fs, u32 video_vid) | |||
| 543 | 543 | ||
| 544 | #undef BASE | 544 | #undef BASE |
| 545 | 545 | ||
| 546 | static u8 ps3av_cnv_enable(u32 source, u8 *enable) | 546 | static u8 ps3av_cnv_enable(u32 source, const u8 *enable) |
| 547 | { | 547 | { |
| 548 | u8 *p, ret = 0; | 548 | const u8 *p; |
| 549 | u8 ret = 0; | ||
| 549 | 550 | ||
| 550 | if (source == PS3AV_CMD_AUDIO_SOURCE_SPDIF) { | 551 | if (source == PS3AV_CMD_AUDIO_SOURCE_SPDIF) { |
| 551 | ret = 0x03; | 552 | ret = 0x03; |
| @@ -559,9 +560,10 @@ static u8 ps3av_cnv_enable(u32 source, u8 *enable) | |||
| 559 | return ret; | 560 | return ret; |
| 560 | } | 561 | } |
| 561 | 562 | ||
| 562 | static u8 ps3av_cnv_fifomap(u8 *map) | 563 | static u8 ps3av_cnv_fifomap(const u8 *map) |
| 563 | { | 564 | { |
| 564 | u8 *p, ret = 0; | 565 | const u8 *p; |
| 566 | u8 ret = 0; | ||
| 565 | 567 | ||
| 566 | p = map; | 568 | p = map; |
| 567 | ret = p[0] + (p[1] << 2) + (p[2] << 4) + (p[3] << 6); | 569 | ret = p[0] + (p[1] << 2) + (p[2] << 4) + (p[3] << 6); |
| @@ -615,7 +617,7 @@ static void ps3av_cnv_info(struct ps3av_audio_info_frame *info, | |||
| 615 | info->pb5.lsv = mode->audio_downmix_level; | 617 | info->pb5.lsv = mode->audio_downmix_level; |
| 616 | } | 618 | } |
| 617 | 619 | ||
| 618 | static void ps3av_cnv_chstat(u8 *chstat, u8 *cs_info) | 620 | static void ps3av_cnv_chstat(u8 *chstat, const u8 *cs_info) |
| 619 | { | 621 | { |
| 620 | memcpy(chstat, cs_info, 5); | 622 | memcpy(chstat, cs_info, 5); |
| 621 | } | 623 | } |
diff --git a/drivers/ps3/vuart.c b/drivers/ps3/vuart.c index 1adf186bfaf5..6c12744eeb9d 100644 --- a/drivers/ps3/vuart.c +++ b/drivers/ps3/vuart.c | |||
| @@ -952,7 +952,7 @@ fail_alloc_irq: | |||
| 952 | kfree(dev->priv); | 952 | kfree(dev->priv); |
| 953 | dev->priv = NULL; | 953 | dev->priv = NULL; |
| 954 | fail_alloc: | 954 | fail_alloc: |
| 955 | vuart_bus_priv.devices[port_number] = 0; | 955 | vuart_bus_priv.devices[port_number] = NULL; |
| 956 | fail_match: | 956 | fail_match: |
| 957 | up(&vuart_bus_priv.probe_mutex); | 957 | up(&vuart_bus_priv.probe_mutex); |
| 958 | dev_dbg(&dev->core, "%s:%d failed\n", __func__, __LINE__); | 958 | dev_dbg(&dev->core, "%s:%d failed\n", __func__, __LINE__); |
| @@ -978,7 +978,7 @@ static int ps3_vuart_remove(struct device *_dev) | |||
| 978 | dev_dbg(&dev->core, "%s:%d: %s no remove method\n", __func__, | 978 | dev_dbg(&dev->core, "%s:%d: %s no remove method\n", __func__, |
| 979 | __LINE__, dev->core.bus_id); | 979 | __LINE__, dev->core.bus_id); |
| 980 | 980 | ||
| 981 | vuart_bus_priv.devices[dev->priv->port_number] = 0; | 981 | vuart_bus_priv.devices[dev->priv->port_number] = NULL; |
| 982 | 982 | ||
| 983 | if (--vuart_bus_priv.use_count == 0) { | 983 | if (--vuart_bus_priv.use_count == 0) { |
| 984 | BUG(); | 984 | BUG(); |
diff --git a/drivers/s390/cio/ccwgroup.c b/drivers/s390/cio/ccwgroup.c index d48e3ca4752c..5aeb68e732b0 100644 --- a/drivers/s390/cio/ccwgroup.c +++ b/drivers/s390/cio/ccwgroup.c | |||
| @@ -71,19 +71,31 @@ __ccwgroup_remove_symlinks(struct ccwgroup_device *gdev) | |||
| 71 | * Provide an 'ungroup' attribute so the user can remove group devices no | 71 | * Provide an 'ungroup' attribute so the user can remove group devices no |
| 72 | * longer needed or accidentially created. Saves memory :) | 72 | * longer needed or accidentially created. Saves memory :) |
| 73 | */ | 73 | */ |
| 74 | static void ccwgroup_ungroup_callback(struct device *dev) | ||
| 75 | { | ||
| 76 | struct ccwgroup_device *gdev = to_ccwgroupdev(dev); | ||
| 77 | |||
| 78 | __ccwgroup_remove_symlinks(gdev); | ||
| 79 | device_unregister(dev); | ||
| 80 | } | ||
| 81 | |||
| 74 | static ssize_t | 82 | static ssize_t |
| 75 | ccwgroup_ungroup_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) | 83 | ccwgroup_ungroup_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) |
| 76 | { | 84 | { |
| 77 | struct ccwgroup_device *gdev; | 85 | struct ccwgroup_device *gdev; |
| 86 | int rc; | ||
| 78 | 87 | ||
| 79 | gdev = to_ccwgroupdev(dev); | 88 | gdev = to_ccwgroupdev(dev); |
| 80 | 89 | ||
| 81 | if (gdev->state != CCWGROUP_OFFLINE) | 90 | if (gdev->state != CCWGROUP_OFFLINE) |
| 82 | return -EINVAL; | 91 | return -EINVAL; |
| 83 | 92 | ||
| 84 | __ccwgroup_remove_symlinks(gdev); | 93 | /* Note that we cannot unregister the device from one of its |
| 85 | device_unregister(dev); | 94 | * attribute methods, so we have to use this roundabout approach. |
| 86 | 95 | */ | |
| 96 | rc = device_schedule_callback(dev, ccwgroup_ungroup_callback); | ||
| 97 | if (rc) | ||
| 98 | count = rc; | ||
| 87 | return count; | 99 | return count; |
| 88 | } | 100 | } |
| 89 | 101 | ||
diff --git a/drivers/s390/net/qeth.h b/drivers/s390/net/qeth.h index e95c281f1e36..84b108d7c7fd 100644 --- a/drivers/s390/net/qeth.h +++ b/drivers/s390/net/qeth.h | |||
| @@ -873,7 +873,7 @@ qeth_realloc_headroom(struct qeth_card *card, struct sk_buff *skb, int size) | |||
| 873 | } | 873 | } |
| 874 | 874 | ||
| 875 | static inline struct sk_buff * | 875 | static inline struct sk_buff * |
| 876 | qeth_pskb_unshare(struct sk_buff *skb, int pri) | 876 | qeth_pskb_unshare(struct sk_buff *skb, gfp_t pri) |
| 877 | { | 877 | { |
| 878 | struct sk_buff *nskb; | 878 | struct sk_buff *nskb; |
| 879 | if (!skb_cloned(skb)) | 879 | if (!skb_cloned(skb)) |
diff --git a/drivers/scsi/scsi_sysfs.c b/drivers/scsi/scsi_sysfs.c index c275dcac3f18..939de0de18bc 100644 --- a/drivers/scsi/scsi_sysfs.c +++ b/drivers/scsi/scsi_sysfs.c | |||
| @@ -452,10 +452,22 @@ store_rescan_field (struct device *dev, struct device_attribute *attr, const cha | |||
| 452 | } | 452 | } |
| 453 | static DEVICE_ATTR(rescan, S_IWUSR, NULL, store_rescan_field); | 453 | static DEVICE_ATTR(rescan, S_IWUSR, NULL, store_rescan_field); |
| 454 | 454 | ||
| 455 | static void sdev_store_delete_callback(struct device *dev) | ||
| 456 | { | ||
| 457 | scsi_remove_device(to_scsi_device(dev)); | ||
| 458 | } | ||
| 459 | |||
| 455 | static ssize_t sdev_store_delete(struct device *dev, struct device_attribute *attr, const char *buf, | 460 | static ssize_t sdev_store_delete(struct device *dev, struct device_attribute *attr, const char *buf, |
| 456 | size_t count) | 461 | size_t count) |
| 457 | { | 462 | { |
| 458 | scsi_remove_device(to_scsi_device(dev)); | 463 | int rc; |
| 464 | |||
| 465 | /* An attribute cannot be unregistered by one of its own methods, | ||
| 466 | * so we have to use this roundabout approach. | ||
| 467 | */ | ||
| 468 | rc = device_schedule_callback(dev, sdev_store_delete_callback); | ||
| 469 | if (rc) | ||
| 470 | count = rc; | ||
| 459 | return count; | 471 | return count; |
| 460 | }; | 472 | }; |
| 461 | static DEVICE_ATTR(delete, S_IWUSR, NULL, sdev_store_delete); | 473 | static DEVICE_ATTR(delete, S_IWUSR, NULL, sdev_store_delete); |
diff --git a/drivers/spi/at25.c b/drivers/spi/at25.c index 48e4f48e779f..8efa07e8b8c2 100644 --- a/drivers/spi/at25.c +++ b/drivers/spi/at25.c | |||
| @@ -291,7 +291,7 @@ static int at25_probe(struct spi_device *spi) | |||
| 291 | */ | 291 | */ |
| 292 | sr = spi_w8r8(spi, AT25_RDSR); | 292 | sr = spi_w8r8(spi, AT25_RDSR); |
| 293 | if (sr < 0 || sr & AT25_SR_nRDY) { | 293 | if (sr < 0 || sr & AT25_SR_nRDY) { |
| 294 | dev_dbg(&at25->spi->dev, "rdsr --> %d (%02x)\n", sr, sr); | 294 | dev_dbg(&spi->dev, "rdsr --> %d (%02x)\n", sr, sr); |
| 295 | err = -ENXIO; | 295 | err = -ENXIO; |
| 296 | goto fail; | 296 | goto fail; |
| 297 | } | 297 | } |
diff --git a/drivers/spi/atmel_spi.c b/drivers/spi/atmel_spi.c index 6fa260d1a9be..66e7bc985797 100644 --- a/drivers/spi/atmel_spi.c +++ b/drivers/spi/atmel_spi.c | |||
| @@ -425,7 +425,7 @@ static int atmel_spi_setup(struct spi_device *spi) | |||
| 425 | if (ret) | 425 | if (ret) |
| 426 | return ret; | 426 | return ret; |
| 427 | spi->controller_state = (void *)npcs_pin; | 427 | spi->controller_state = (void *)npcs_pin; |
| 428 | gpio_direction_output(npcs_pin); | 428 | gpio_direction_output(npcs_pin, !(spi->mode & SPI_CS_HIGH)); |
| 429 | } | 429 | } |
| 430 | 430 | ||
| 431 | dev_dbg(&spi->dev, | 431 | dev_dbg(&spi->dev, |
diff --git a/drivers/spi/spi_bitbang.c b/drivers/spi/spi_bitbang.c index 24a330d82395..88425e1af4d3 100644 --- a/drivers/spi/spi_bitbang.c +++ b/drivers/spi/spi_bitbang.c | |||
| @@ -302,10 +302,6 @@ static void bitbang_work(struct work_struct *work) | |||
| 302 | setup_transfer = NULL; | 302 | setup_transfer = NULL; |
| 303 | 303 | ||
| 304 | list_for_each_entry (t, &m->transfers, transfer_list) { | 304 | list_for_each_entry (t, &m->transfers, transfer_list) { |
| 305 | if (bitbang->shutdown) { | ||
| 306 | status = -ESHUTDOWN; | ||
| 307 | break; | ||
| 308 | } | ||
| 309 | 305 | ||
| 310 | /* override or restore speed and wordsize */ | 306 | /* override or restore speed and wordsize */ |
| 311 | if (t->speed_hz || t->bits_per_word) { | 307 | if (t->speed_hz || t->bits_per_word) { |
| @@ -410,8 +406,6 @@ int spi_bitbang_transfer(struct spi_device *spi, struct spi_message *m) | |||
| 410 | m->status = -EINPROGRESS; | 406 | m->status = -EINPROGRESS; |
| 411 | 407 | ||
| 412 | bitbang = spi_master_get_devdata(spi->master); | 408 | bitbang = spi_master_get_devdata(spi->master); |
| 413 | if (bitbang->shutdown) | ||
| 414 | return -ESHUTDOWN; | ||
| 415 | 409 | ||
| 416 | spin_lock_irqsave(&bitbang->lock, flags); | 410 | spin_lock_irqsave(&bitbang->lock, flags); |
| 417 | if (!spi->max_speed_hz) | 411 | if (!spi->max_speed_hz) |
| @@ -507,28 +501,12 @@ EXPORT_SYMBOL_GPL(spi_bitbang_start); | |||
| 507 | */ | 501 | */ |
| 508 | int spi_bitbang_stop(struct spi_bitbang *bitbang) | 502 | int spi_bitbang_stop(struct spi_bitbang *bitbang) |
| 509 | { | 503 | { |
| 510 | unsigned limit = 500; | 504 | spi_unregister_master(bitbang->master); |
| 511 | |||
| 512 | spin_lock_irq(&bitbang->lock); | ||
| 513 | bitbang->shutdown = 0; | ||
| 514 | while (!list_empty(&bitbang->queue) && limit--) { | ||
| 515 | spin_unlock_irq(&bitbang->lock); | ||
| 516 | 505 | ||
| 517 | dev_dbg(bitbang->master->cdev.dev, "wait for queue\n"); | 506 | WARN_ON(!list_empty(&bitbang->queue)); |
| 518 | msleep(10); | ||
| 519 | |||
| 520 | spin_lock_irq(&bitbang->lock); | ||
| 521 | } | ||
| 522 | spin_unlock_irq(&bitbang->lock); | ||
| 523 | if (!list_empty(&bitbang->queue)) { | ||
| 524 | dev_err(bitbang->master->cdev.dev, "queue didn't empty\n"); | ||
| 525 | return -EBUSY; | ||
| 526 | } | ||
| 527 | 507 | ||
| 528 | destroy_workqueue(bitbang->workqueue); | 508 | destroy_workqueue(bitbang->workqueue); |
| 529 | 509 | ||
| 530 | spi_unregister_master(bitbang->master); | ||
| 531 | |||
| 532 | return 0; | 510 | return 0; |
| 533 | } | 511 | } |
| 534 | EXPORT_SYMBOL_GPL(spi_bitbang_stop); | 512 | EXPORT_SYMBOL_GPL(spi_bitbang_stop); |
diff --git a/drivers/spi/spi_s3c24xx.c b/drivers/spi/spi_s3c24xx.c index 651379c51ae6..220abce63e4a 100644 --- a/drivers/spi/spi_s3c24xx.c +++ b/drivers/spi/spi_s3c24xx.c | |||
| @@ -41,7 +41,7 @@ struct s3c24xx_spi { | |||
| 41 | int len; | 41 | int len; |
| 42 | int count; | 42 | int count; |
| 43 | 43 | ||
| 44 | int (*set_cs)(struct s3c2410_spi_info *spi, | 44 | void (*set_cs)(struct s3c2410_spi_info *spi, |
| 45 | int cs, int pol); | 45 | int cs, int pol); |
| 46 | 46 | ||
| 47 | /* data buffers */ | 47 | /* data buffers */ |
diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig index 7f5a59836818..e4f0dd00ae85 100644 --- a/drivers/video/Kconfig +++ b/drivers/video/Kconfig | |||
| @@ -1320,7 +1320,7 @@ config FB_AU1100 | |||
| 1320 | 1320 | ||
| 1321 | config FB_AU1200 | 1321 | config FB_AU1200 |
| 1322 | bool "Au1200 LCD Driver" | 1322 | bool "Au1200 LCD Driver" |
| 1323 | depends on FB && MIPS && SOC_AU1200 | 1323 | depends on (FB = y) && MIPS && SOC_AU1200 |
| 1324 | select FB_CFB_FILLRECT | 1324 | select FB_CFB_FILLRECT |
| 1325 | select FB_CFB_COPYAREA | 1325 | select FB_CFB_COPYAREA |
| 1326 | select FB_CFB_IMAGEBLIT | 1326 | select FB_CFB_IMAGEBLIT |
| @@ -1470,7 +1470,7 @@ config FB_G364 | |||
| 1470 | 1470 | ||
| 1471 | config FB_68328 | 1471 | config FB_68328 |
| 1472 | bool "Motorola 68328 native frame buffer support" | 1472 | bool "Motorola 68328 native frame buffer support" |
| 1473 | depends on FB && (M68328 || M68EZ328 || M68VZ328) | 1473 | depends on (FB = y) && (M68328 || M68EZ328 || M68VZ328) |
| 1474 | select FB_CFB_FILLRECT | 1474 | select FB_CFB_FILLRECT |
| 1475 | select FB_CFB_COPYAREA | 1475 | select FB_CFB_COPYAREA |
| 1476 | select FB_CFB_IMAGEBLIT | 1476 | select FB_CFB_IMAGEBLIT |
| @@ -1616,7 +1616,7 @@ config FB_IBM_GXT4500 | |||
| 1616 | 1616 | ||
| 1617 | config FB_PS3 | 1617 | config FB_PS3 |
| 1618 | bool "PS3 GPU framebuffer driver" | 1618 | bool "PS3 GPU framebuffer driver" |
| 1619 | depends on FB && PS3_PS3AV | 1619 | depends on (FB = y) && PS3_PS3AV |
| 1620 | select FB_CFB_FILLRECT | 1620 | select FB_CFB_FILLRECT |
| 1621 | select FB_CFB_COPYAREA | 1621 | select FB_CFB_COPYAREA |
| 1622 | select FB_CFB_IMAGEBLIT | 1622 | select FB_CFB_IMAGEBLIT |
diff --git a/drivers/video/backlight/progear_bl.c b/drivers/video/backlight/progear_bl.c index 702269357861..836ab4df0ef2 100644 --- a/drivers/video/backlight/progear_bl.c +++ b/drivers/video/backlight/progear_bl.c | |||
| @@ -65,13 +65,13 @@ static int progearbl_probe(struct platform_device *pdev) | |||
| 65 | u8 temp; | 65 | u8 temp; |
| 66 | struct backlight_device *progear_backlight_device; | 66 | struct backlight_device *progear_backlight_device; |
| 67 | 67 | ||
| 68 | pmu_dev = pci_get_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M7101, 0); | 68 | pmu_dev = pci_get_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M7101, NULL); |
| 69 | if (!pmu_dev) { | 69 | if (!pmu_dev) { |
| 70 | printk("ALI M7101 PMU not found.\n"); | 70 | printk("ALI M7101 PMU not found.\n"); |
| 71 | return -ENODEV; | 71 | return -ENODEV; |
| 72 | } | 72 | } |
| 73 | 73 | ||
| 74 | sb_dev = pci_get_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M1533, 0); | 74 | sb_dev = pci_get_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M1533, NULL); |
| 75 | if (!sb_dev) { | 75 | if (!sb_dev) { |
| 76 | printk("ALI 1533 SB not found.\n"); | 76 | printk("ALI 1533 SB not found.\n"); |
| 77 | pci_dev_put(pmu_dev); | 77 | pci_dev_put(pmu_dev); |
diff --git a/drivers/video/savage/savagefb_driver.c b/drivers/video/savage/savagefb_driver.c index 4afa30522fdb..0166ec2ccf32 100644 --- a/drivers/video/savage/savagefb_driver.c +++ b/drivers/video/savage/savagefb_driver.c | |||
| @@ -384,6 +384,19 @@ SavageSetup2DEngine(struct savagefb_par *par) | |||
| 384 | BCI_SEND(0); | 384 | BCI_SEND(0); |
| 385 | BCI_SEND(BCI_CMD_SETREG | (1 << 16) | BCI_GBD2); | 385 | BCI_SEND(BCI_CMD_SETREG | (1 << 16) | BCI_GBD2); |
| 386 | BCI_SEND(GlobalBitmapDescriptor); | 386 | BCI_SEND(GlobalBitmapDescriptor); |
| 387 | |||
| 388 | /* | ||
| 389 | * I don't know why, sending this twice fixes the intial black screen, | ||
| 390 | * prevents X from crashing at least in Toshiba laptops with SavageIX. | ||
| 391 | * --Tony | ||
| 392 | */ | ||
| 393 | par->bci_ptr = 0; | ||
| 394 | par->SavageWaitFifo(par, 4); | ||
| 395 | |||
| 396 | BCI_SEND(BCI_CMD_SETREG | (1 << 16) | BCI_GBD1); | ||
| 397 | BCI_SEND(0); | ||
| 398 | BCI_SEND(BCI_CMD_SETREG | (1 << 16) | BCI_GBD2); | ||
| 399 | BCI_SEND(GlobalBitmapDescriptor); | ||
| 387 | } | 400 | } |
| 388 | 401 | ||
| 389 | static void savagefb_set_clip(struct fb_info *info) | 402 | static void savagefb_set_clip(struct fb_info *info) |
| @@ -496,7 +509,7 @@ static int common_calc_clock(long freq, int min_m, int min_n1, int max_n1, | |||
| 496 | #ifdef SAVAGEFB_DEBUG | 509 | #ifdef SAVAGEFB_DEBUG |
| 497 | /* This function is used to debug, it prints out the contents of s3 regs */ | 510 | /* This function is used to debug, it prints out the contents of s3 regs */ |
| 498 | 511 | ||
| 499 | static void SavagePrintRegs(void) | 512 | static void SavagePrintRegs(struct savagefb_par *par) |
| 500 | { | 513 | { |
| 501 | unsigned char i; | 514 | unsigned char i; |
| 502 | int vgaCRIndex = 0x3d4; | 515 | int vgaCRIndex = 0x3d4; |
| @@ -1525,7 +1538,7 @@ static int savagefb_set_par(struct fb_info *info) | |||
| 1525 | savagefb_set_fix(info); | 1538 | savagefb_set_fix(info); |
| 1526 | savagefb_set_clip(info); | 1539 | savagefb_set_clip(info); |
| 1527 | 1540 | ||
| 1528 | SavagePrintRegs(); | 1541 | SavagePrintRegs(par); |
| 1529 | return 0; | 1542 | return 0; |
| 1530 | } | 1543 | } |
| 1531 | 1544 | ||
| @@ -2155,7 +2168,6 @@ static int __devinit savagefb_probe(struct pci_dev* dev, | |||
| 2155 | int video_len; | 2168 | int video_len; |
| 2156 | 2169 | ||
| 2157 | DBG("savagefb_probe"); | 2170 | DBG("savagefb_probe"); |
| 2158 | SavagePrintRegs(); | ||
| 2159 | 2171 | ||
| 2160 | info = framebuffer_alloc(sizeof(struct savagefb_par), &dev->dev); | 2172 | info = framebuffer_alloc(sizeof(struct savagefb_par), &dev->dev); |
| 2161 | if (!info) | 2173 | if (!info) |
diff --git a/drivers/video/sstfb.c b/drivers/video/sstfb.c index 59cd1e750f30..62fa5500361d 100644 --- a/drivers/video/sstfb.c +++ b/drivers/video/sstfb.c | |||
| @@ -257,6 +257,7 @@ static void __sst_dac_write(u8 __iomem *vbase, u8 reg, u8 val) | |||
| 257 | r_dprintk("sst_dac_write(%#x, %#x)\n", reg, val); | 257 | r_dprintk("sst_dac_write(%#x, %#x)\n", reg, val); |
| 258 | reg &= 0x07; | 258 | reg &= 0x07; |
| 259 | __sst_write(vbase, DAC_DATA,(((u32)reg << 8)) | (u32)val); | 259 | __sst_write(vbase, DAC_DATA,(((u32)reg << 8)) | (u32)val); |
| 260 | __sst_wait_idle(vbase); | ||
| 260 | } | 261 | } |
| 261 | 262 | ||
| 262 | /* indexed access to ti/att dacs */ | 263 | /* indexed access to ti/att dacs */ |
diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c index 51db1182b27e..a2fceba7ef8e 100644 --- a/fs/binfmt_elf.c +++ b/fs/binfmt_elf.c | |||
| @@ -507,7 +507,7 @@ out: | |||
| 507 | #define INTERPRETER_ELF 2 | 507 | #define INTERPRETER_ELF 2 |
| 508 | 508 | ||
| 509 | #ifndef STACK_RND_MASK | 509 | #ifndef STACK_RND_MASK |
| 510 | #define STACK_RND_MASK 0x7ff /* with 4K pages 8MB of VA */ | 510 | #define STACK_RND_MASK (0x7ff >> (PAGE_SHIFT - 12)) /* 8MB of VA */ |
| 511 | #endif | 511 | #endif |
| 512 | 512 | ||
| 513 | static unsigned long randomize_stack_top(unsigned long stack_top) | 513 | static unsigned long randomize_stack_top(unsigned long stack_top) |
diff --git a/fs/cifs/cifspdu.h b/fs/cifs/cifspdu.h index 0efdf35aab2c..3af76249dc8b 100644 --- a/fs/cifs/cifspdu.h +++ b/fs/cifs/cifspdu.h | |||
| @@ -220,7 +220,7 @@ | |||
| 220 | */ | 220 | */ |
| 221 | #define CIFS_NO_HANDLE 0xFFFF | 221 | #define CIFS_NO_HANDLE 0xFFFF |
| 222 | 222 | ||
| 223 | #define NO_CHANGE_64 0xFFFFFFFFFFFFFFFFULL | 223 | #define NO_CHANGE_64 cpu_to_le64(0xFFFFFFFFFFFFFFFFULL) |
| 224 | #define NO_CHANGE_32 0xFFFFFFFFUL | 224 | #define NO_CHANGE_32 0xFFFFFFFFUL |
| 225 | 225 | ||
| 226 | /* IPC$ in ASCII */ | 226 | /* IPC$ in ASCII */ |
diff --git a/fs/configfs/dir.c b/fs/configfs/dir.c index 34750d5e4ff2..5e6e37e58f36 100644 --- a/fs/configfs/dir.c +++ b/fs/configfs/dir.c | |||
| @@ -1141,25 +1141,22 @@ int configfs_register_subsystem(struct configfs_subsystem *subsys) | |||
| 1141 | 1141 | ||
| 1142 | err = -ENOMEM; | 1142 | err = -ENOMEM; |
| 1143 | dentry = d_alloc(configfs_sb->s_root, &name); | 1143 | dentry = d_alloc(configfs_sb->s_root, &name); |
| 1144 | if (!dentry) | 1144 | if (dentry) { |
| 1145 | goto out_release; | 1145 | d_add(dentry, NULL); |
| 1146 | |||
| 1147 | d_add(dentry, NULL); | ||
| 1148 | 1146 | ||
| 1149 | err = configfs_attach_group(sd->s_element, &group->cg_item, | 1147 | err = configfs_attach_group(sd->s_element, &group->cg_item, |
| 1150 | dentry); | 1148 | dentry); |
| 1151 | if (!err) | 1149 | if (err) { |
| 1152 | dentry = NULL; | 1150 | d_delete(dentry); |
| 1153 | else | 1151 | dput(dentry); |
| 1154 | d_delete(dentry); | 1152 | } |
| 1153 | } | ||
| 1155 | 1154 | ||
| 1156 | mutex_unlock(&configfs_sb->s_root->d_inode->i_mutex); | 1155 | mutex_unlock(&configfs_sb->s_root->d_inode->i_mutex); |
| 1157 | 1156 | ||
| 1158 | if (dentry) { | 1157 | if (err) { |
| 1159 | dput(dentry); | 1158 | unlink_group(group); |
| 1160 | out_release: | 1159 | configfs_release_fs(); |
| 1161 | unlink_group(group); | ||
| 1162 | configfs_release_fs(); | ||
| 1163 | } | 1160 | } |
| 1164 | 1161 | ||
| 1165 | return err; | 1162 | return err; |
diff --git a/fs/ecryptfs/dentry.c b/fs/ecryptfs/dentry.c index 329efcd3d8c9..cb20b964419f 100644 --- a/fs/ecryptfs/dentry.c +++ b/fs/ecryptfs/dentry.c | |||
| @@ -78,18 +78,13 @@ struct kmem_cache *ecryptfs_dentry_info_cache; | |||
| 78 | */ | 78 | */ |
| 79 | static void ecryptfs_d_release(struct dentry *dentry) | 79 | static void ecryptfs_d_release(struct dentry *dentry) |
| 80 | { | 80 | { |
| 81 | struct dentry *lower_dentry; | 81 | if (ecryptfs_dentry_to_private(dentry)) { |
| 82 | 82 | if (ecryptfs_dentry_to_lower(dentry)) { | |
| 83 | lower_dentry = ecryptfs_dentry_to_lower(dentry); | 83 | mntput(ecryptfs_dentry_to_lower_mnt(dentry)); |
| 84 | if (ecryptfs_dentry_to_private(dentry)) | 84 | dput(ecryptfs_dentry_to_lower(dentry)); |
| 85 | } | ||
| 85 | kmem_cache_free(ecryptfs_dentry_info_cache, | 86 | kmem_cache_free(ecryptfs_dentry_info_cache, |
| 86 | ecryptfs_dentry_to_private(dentry)); | 87 | ecryptfs_dentry_to_private(dentry)); |
| 87 | if (lower_dentry) { | ||
| 88 | struct vfsmount *lower_mnt = | ||
| 89 | ecryptfs_dentry_to_lower_mnt(dentry); | ||
| 90 | |||
| 91 | mntput(lower_mnt); | ||
| 92 | dput(lower_dentry); | ||
| 93 | } | 88 | } |
| 94 | return; | 89 | return; |
| 95 | } | 90 | } |
diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c index af53c02f473b..93d046c85f52 100644 --- a/fs/nfs/inode.c +++ b/fs/nfs/inode.c | |||
| @@ -429,7 +429,8 @@ int nfs_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat) | |||
| 429 | int err; | 429 | int err; |
| 430 | 430 | ||
| 431 | /* Flush out writes to the server in order to update c/mtime */ | 431 | /* Flush out writes to the server in order to update c/mtime */ |
| 432 | nfs_sync_mapping_range(inode->i_mapping, 0, 0, FLUSH_NOCOMMIT); | 432 | if (S_ISREG(inode->i_mode)) |
| 433 | nfs_sync_mapping_range(inode->i_mapping, 0, 0, FLUSH_NOCOMMIT); | ||
| 433 | 434 | ||
| 434 | /* | 435 | /* |
| 435 | * We may force a getattr if the user cares about atime. | 436 | * We may force a getattr if the user cares about atime. |
diff --git a/fs/nfs/super.c b/fs/nfs/super.c index bb516a2cfbaf..f1eae44b9a1a 100644 --- a/fs/nfs/super.c +++ b/fs/nfs/super.c | |||
| @@ -151,10 +151,10 @@ int __init register_nfs_fs(void) | |||
| 151 | if (ret < 0) | 151 | if (ret < 0) |
| 152 | goto error_0; | 152 | goto error_0; |
| 153 | 153 | ||
| 154 | #ifdef CONFIG_NFS_V4 | ||
| 155 | ret = nfs_register_sysctl(); | 154 | ret = nfs_register_sysctl(); |
| 156 | if (ret < 0) | 155 | if (ret < 0) |
| 157 | goto error_1; | 156 | goto error_1; |
| 157 | #ifdef CONFIG_NFS_V4 | ||
| 158 | ret = register_filesystem(&nfs4_fs_type); | 158 | ret = register_filesystem(&nfs4_fs_type); |
| 159 | if (ret < 0) | 159 | if (ret < 0) |
| 160 | goto error_2; | 160 | goto error_2; |
| @@ -165,9 +165,9 @@ int __init register_nfs_fs(void) | |||
| 165 | #ifdef CONFIG_NFS_V4 | 165 | #ifdef CONFIG_NFS_V4 |
| 166 | error_2: | 166 | error_2: |
| 167 | nfs_unregister_sysctl(); | 167 | nfs_unregister_sysctl(); |
| 168 | #endif | ||
| 168 | error_1: | 169 | error_1: |
| 169 | unregister_filesystem(&nfs_fs_type); | 170 | unregister_filesystem(&nfs_fs_type); |
| 170 | #endif | ||
| 171 | error_0: | 171 | error_0: |
| 172 | return ret; | 172 | return ret; |
| 173 | } | 173 | } |
diff --git a/fs/nfs/sysctl.c b/fs/nfs/sysctl.c index fcdcafbb3293..b62481dabae9 100644 --- a/fs/nfs/sysctl.c +++ b/fs/nfs/sysctl.c | |||
| @@ -50,6 +50,14 @@ static ctl_table nfs_cb_sysctls[] = { | |||
| 50 | .proc_handler = &proc_dointvec_jiffies, | 50 | .proc_handler = &proc_dointvec_jiffies, |
| 51 | .strategy = &sysctl_jiffies, | 51 | .strategy = &sysctl_jiffies, |
| 52 | }, | 52 | }, |
| 53 | { | ||
| 54 | .ctl_name = CTL_UNNUMBERED, | ||
| 55 | .procname = "nfs_congestion_kb", | ||
| 56 | .data = &nfs_congestion_kb, | ||
| 57 | .maxlen = sizeof(nfs_congestion_kb), | ||
| 58 | .mode = 0644, | ||
| 59 | .proc_handler = &proc_dointvec, | ||
| 60 | }, | ||
| 53 | { .ctl_name = 0 } | 61 | { .ctl_name = 0 } |
| 54 | }; | 62 | }; |
| 55 | 63 | ||
diff --git a/fs/nfs/write.c b/fs/nfs/write.c index febdade91670..2867e6b7096f 100644 --- a/fs/nfs/write.c +++ b/fs/nfs/write.c | |||
| @@ -12,6 +12,7 @@ | |||
| 12 | #include <linux/pagemap.h> | 12 | #include <linux/pagemap.h> |
| 13 | #include <linux/file.h> | 13 | #include <linux/file.h> |
| 14 | #include <linux/writeback.h> | 14 | #include <linux/writeback.h> |
| 15 | #include <linux/swap.h> | ||
| 15 | 16 | ||
| 16 | #include <linux/sunrpc/clnt.h> | 17 | #include <linux/sunrpc/clnt.h> |
| 17 | #include <linux/nfs_fs.h> | 18 | #include <linux/nfs_fs.h> |
| @@ -38,7 +39,6 @@ static struct nfs_page * nfs_update_request(struct nfs_open_context*, | |||
| 38 | struct page *, | 39 | struct page *, |
| 39 | unsigned int, unsigned int); | 40 | unsigned int, unsigned int); |
| 40 | static void nfs_mark_request_dirty(struct nfs_page *req); | 41 | static void nfs_mark_request_dirty(struct nfs_page *req); |
| 41 | static int nfs_wait_on_write_congestion(struct address_space *, int); | ||
| 42 | static long nfs_flush_mapping(struct address_space *mapping, struct writeback_control *wbc, int how); | 42 | static long nfs_flush_mapping(struct address_space *mapping, struct writeback_control *wbc, int how); |
| 43 | static const struct rpc_call_ops nfs_write_partial_ops; | 43 | static const struct rpc_call_ops nfs_write_partial_ops; |
| 44 | static const struct rpc_call_ops nfs_write_full_ops; | 44 | static const struct rpc_call_ops nfs_write_full_ops; |
| @@ -48,8 +48,6 @@ static struct kmem_cache *nfs_wdata_cachep; | |||
| 48 | static mempool_t *nfs_wdata_mempool; | 48 | static mempool_t *nfs_wdata_mempool; |
| 49 | static mempool_t *nfs_commit_mempool; | 49 | static mempool_t *nfs_commit_mempool; |
| 50 | 50 | ||
| 51 | static DECLARE_WAIT_QUEUE_HEAD(nfs_write_congestion); | ||
| 52 | |||
| 53 | struct nfs_write_data *nfs_commit_alloc(void) | 51 | struct nfs_write_data *nfs_commit_alloc(void) |
| 54 | { | 52 | { |
| 55 | struct nfs_write_data *p = mempool_alloc(nfs_commit_mempool, GFP_NOFS); | 53 | struct nfs_write_data *p = mempool_alloc(nfs_commit_mempool, GFP_NOFS); |
| @@ -211,6 +209,40 @@ static int wb_priority(struct writeback_control *wbc) | |||
| 211 | } | 209 | } |
| 212 | 210 | ||
| 213 | /* | 211 | /* |
| 212 | * NFS congestion control | ||
| 213 | */ | ||
| 214 | |||
| 215 | int nfs_congestion_kb; | ||
| 216 | |||
| 217 | #define NFS_CONGESTION_ON_THRESH (nfs_congestion_kb >> (PAGE_SHIFT-10)) | ||
| 218 | #define NFS_CONGESTION_OFF_THRESH \ | ||
| 219 | (NFS_CONGESTION_ON_THRESH - (NFS_CONGESTION_ON_THRESH >> 2)) | ||
| 220 | |||
| 221 | static void nfs_set_page_writeback(struct page *page) | ||
| 222 | { | ||
| 223 | if (!test_set_page_writeback(page)) { | ||
| 224 | struct inode *inode = page->mapping->host; | ||
| 225 | struct nfs_server *nfss = NFS_SERVER(inode); | ||
| 226 | |||
| 227 | if (atomic_inc_return(&nfss->writeback) > | ||
| 228 | NFS_CONGESTION_ON_THRESH) | ||
| 229 | set_bdi_congested(&nfss->backing_dev_info, WRITE); | ||
| 230 | } | ||
| 231 | } | ||
| 232 | |||
| 233 | static void nfs_end_page_writeback(struct page *page) | ||
| 234 | { | ||
| 235 | struct inode *inode = page->mapping->host; | ||
| 236 | struct nfs_server *nfss = NFS_SERVER(inode); | ||
| 237 | |||
| 238 | end_page_writeback(page); | ||
| 239 | if (atomic_dec_return(&nfss->writeback) < NFS_CONGESTION_OFF_THRESH) { | ||
| 240 | clear_bdi_congested(&nfss->backing_dev_info, WRITE); | ||
| 241 | congestion_end(WRITE); | ||
| 242 | } | ||
| 243 | } | ||
| 244 | |||
| 245 | /* | ||
| 214 | * Find an associated nfs write request, and prepare to flush it out | 246 | * Find an associated nfs write request, and prepare to flush it out |
| 215 | * Returns 1 if there was no write request, or if the request was | 247 | * Returns 1 if there was no write request, or if the request was |
| 216 | * already tagged by nfs_set_page_dirty.Returns 0 if the request | 248 | * already tagged by nfs_set_page_dirty.Returns 0 if the request |
| @@ -247,7 +279,7 @@ static int nfs_page_mark_flush(struct page *page) | |||
| 247 | spin_unlock(req_lock); | 279 | spin_unlock(req_lock); |
| 248 | if (test_and_set_bit(PG_FLUSHING, &req->wb_flags) == 0) { | 280 | if (test_and_set_bit(PG_FLUSHING, &req->wb_flags) == 0) { |
| 249 | nfs_mark_request_dirty(req); | 281 | nfs_mark_request_dirty(req); |
| 250 | set_page_writeback(page); | 282 | nfs_set_page_writeback(page); |
| 251 | } | 283 | } |
| 252 | ret = test_bit(PG_NEED_FLUSH, &req->wb_flags); | 284 | ret = test_bit(PG_NEED_FLUSH, &req->wb_flags); |
| 253 | nfs_unlock_request(req); | 285 | nfs_unlock_request(req); |
| @@ -302,13 +334,8 @@ int nfs_writepage(struct page *page, struct writeback_control *wbc) | |||
| 302 | return err; | 334 | return err; |
| 303 | } | 335 | } |
| 304 | 336 | ||
| 305 | /* | ||
| 306 | * Note: causes nfs_update_request() to block on the assumption | ||
| 307 | * that the writeback is generated due to memory pressure. | ||
| 308 | */ | ||
| 309 | int nfs_writepages(struct address_space *mapping, struct writeback_control *wbc) | 337 | int nfs_writepages(struct address_space *mapping, struct writeback_control *wbc) |
| 310 | { | 338 | { |
| 311 | struct backing_dev_info *bdi = mapping->backing_dev_info; | ||
| 312 | struct inode *inode = mapping->host; | 339 | struct inode *inode = mapping->host; |
| 313 | int err; | 340 | int err; |
| 314 | 341 | ||
| @@ -317,20 +344,12 @@ int nfs_writepages(struct address_space *mapping, struct writeback_control *wbc) | |||
| 317 | err = generic_writepages(mapping, wbc); | 344 | err = generic_writepages(mapping, wbc); |
| 318 | if (err) | 345 | if (err) |
| 319 | return err; | 346 | return err; |
| 320 | while (test_and_set_bit(BDI_write_congested, &bdi->state) != 0) { | ||
| 321 | if (wbc->nonblocking) | ||
| 322 | return 0; | ||
| 323 | nfs_wait_on_write_congestion(mapping, 0); | ||
| 324 | } | ||
| 325 | err = nfs_flush_mapping(mapping, wbc, wb_priority(wbc)); | 347 | err = nfs_flush_mapping(mapping, wbc, wb_priority(wbc)); |
| 326 | if (err < 0) | 348 | if (err < 0) |
| 327 | goto out; | 349 | goto out; |
| 328 | nfs_add_stats(inode, NFSIOS_WRITEPAGES, err); | 350 | nfs_add_stats(inode, NFSIOS_WRITEPAGES, err); |
| 329 | err = 0; | 351 | err = 0; |
| 330 | out: | 352 | out: |
| 331 | clear_bit(BDI_write_congested, &bdi->state); | ||
| 332 | wake_up_all(&nfs_write_congestion); | ||
| 333 | congestion_end(WRITE); | ||
| 334 | return err; | 353 | return err; |
| 335 | } | 354 | } |
| 336 | 355 | ||
| @@ -360,7 +379,7 @@ static int nfs_inode_add_request(struct inode *inode, struct nfs_page *req) | |||
| 360 | } | 379 | } |
| 361 | 380 | ||
| 362 | /* | 381 | /* |
| 363 | * Insert a write request into an inode | 382 | * Remove a write request from an inode |
| 364 | */ | 383 | */ |
| 365 | static void nfs_inode_remove_request(struct nfs_page *req) | 384 | static void nfs_inode_remove_request(struct nfs_page *req) |
| 366 | { | 385 | { |
| @@ -531,10 +550,10 @@ static inline int nfs_scan_commit(struct inode *inode, struct list_head *dst, un | |||
| 531 | } | 550 | } |
| 532 | #endif | 551 | #endif |
| 533 | 552 | ||
| 534 | static int nfs_wait_on_write_congestion(struct address_space *mapping, int intr) | 553 | static int nfs_wait_on_write_congestion(struct address_space *mapping) |
| 535 | { | 554 | { |
| 555 | struct inode *inode = mapping->host; | ||
| 536 | struct backing_dev_info *bdi = mapping->backing_dev_info; | 556 | struct backing_dev_info *bdi = mapping->backing_dev_info; |
| 537 | DEFINE_WAIT(wait); | ||
| 538 | int ret = 0; | 557 | int ret = 0; |
| 539 | 558 | ||
| 540 | might_sleep(); | 559 | might_sleep(); |
| @@ -542,31 +561,23 @@ static int nfs_wait_on_write_congestion(struct address_space *mapping, int intr) | |||
| 542 | if (!bdi_write_congested(bdi)) | 561 | if (!bdi_write_congested(bdi)) |
| 543 | return 0; | 562 | return 0; |
| 544 | 563 | ||
| 545 | nfs_inc_stats(mapping->host, NFSIOS_CONGESTIONWAIT); | 564 | nfs_inc_stats(inode, NFSIOS_CONGESTIONWAIT); |
| 546 | 565 | ||
| 547 | if (intr) { | 566 | do { |
| 548 | struct rpc_clnt *clnt = NFS_CLIENT(mapping->host); | 567 | struct rpc_clnt *clnt = NFS_CLIENT(inode); |
| 549 | sigset_t oldset; | 568 | sigset_t oldset; |
| 550 | 569 | ||
| 551 | rpc_clnt_sigmask(clnt, &oldset); | 570 | rpc_clnt_sigmask(clnt, &oldset); |
| 552 | prepare_to_wait(&nfs_write_congestion, &wait, TASK_INTERRUPTIBLE); | 571 | ret = congestion_wait_interruptible(WRITE, HZ/10); |
| 553 | if (bdi_write_congested(bdi)) { | ||
| 554 | if (signalled()) | ||
| 555 | ret = -ERESTARTSYS; | ||
| 556 | else | ||
| 557 | schedule(); | ||
| 558 | } | ||
| 559 | rpc_clnt_sigunmask(clnt, &oldset); | 572 | rpc_clnt_sigunmask(clnt, &oldset); |
| 560 | } else { | 573 | if (ret == -ERESTARTSYS) |
| 561 | prepare_to_wait(&nfs_write_congestion, &wait, TASK_UNINTERRUPTIBLE); | 574 | break; |
| 562 | if (bdi_write_congested(bdi)) | 575 | ret = 0; |
| 563 | schedule(); | 576 | } while (bdi_write_congested(bdi)); |
| 564 | } | 577 | |
| 565 | finish_wait(&nfs_write_congestion, &wait); | ||
| 566 | return ret; | 578 | return ret; |
| 567 | } | 579 | } |
| 568 | 580 | ||
| 569 | |||
| 570 | /* | 581 | /* |
| 571 | * Try to update any existing write request, or create one if there is none. | 582 | * Try to update any existing write request, or create one if there is none. |
| 572 | * In order to match, the request's credentials must match those of | 583 | * In order to match, the request's credentials must match those of |
| @@ -577,14 +588,15 @@ static int nfs_wait_on_write_congestion(struct address_space *mapping, int intr) | |||
| 577 | static struct nfs_page * nfs_update_request(struct nfs_open_context* ctx, | 588 | static struct nfs_page * nfs_update_request(struct nfs_open_context* ctx, |
| 578 | struct page *page, unsigned int offset, unsigned int bytes) | 589 | struct page *page, unsigned int offset, unsigned int bytes) |
| 579 | { | 590 | { |
| 580 | struct inode *inode = page->mapping->host; | 591 | struct address_space *mapping = page->mapping; |
| 592 | struct inode *inode = mapping->host; | ||
| 581 | struct nfs_inode *nfsi = NFS_I(inode); | 593 | struct nfs_inode *nfsi = NFS_I(inode); |
| 582 | struct nfs_page *req, *new = NULL; | 594 | struct nfs_page *req, *new = NULL; |
| 583 | unsigned long rqend, end; | 595 | unsigned long rqend, end; |
| 584 | 596 | ||
| 585 | end = offset + bytes; | 597 | end = offset + bytes; |
| 586 | 598 | ||
| 587 | if (nfs_wait_on_write_congestion(page->mapping, NFS_SERVER(inode)->flags & NFS_MOUNT_INTR)) | 599 | if (nfs_wait_on_write_congestion(mapping)) |
| 588 | return ERR_PTR(-ERESTARTSYS); | 600 | return ERR_PTR(-ERESTARTSYS); |
| 589 | for (;;) { | 601 | for (;;) { |
| 590 | /* Loop over all inode entries and see if we find | 602 | /* Loop over all inode entries and see if we find |
| @@ -727,7 +739,7 @@ int nfs_updatepage(struct file *file, struct page *page, | |||
| 727 | 739 | ||
| 728 | static void nfs_writepage_release(struct nfs_page *req) | 740 | static void nfs_writepage_release(struct nfs_page *req) |
| 729 | { | 741 | { |
| 730 | end_page_writeback(req->wb_page); | 742 | nfs_end_page_writeback(req->wb_page); |
| 731 | 743 | ||
| 732 | #if defined(CONFIG_NFS_V3) || defined(CONFIG_NFS_V4) | 744 | #if defined(CONFIG_NFS_V3) || defined(CONFIG_NFS_V4) |
| 733 | if (!PageError(req->wb_page)) { | 745 | if (!PageError(req->wb_page)) { |
| @@ -1042,12 +1054,12 @@ static void nfs_writeback_done_full(struct rpc_task *task, void *calldata) | |||
| 1042 | if (task->tk_status < 0) { | 1054 | if (task->tk_status < 0) { |
| 1043 | nfs_set_pageerror(page); | 1055 | nfs_set_pageerror(page); |
| 1044 | req->wb_context->error = task->tk_status; | 1056 | req->wb_context->error = task->tk_status; |
| 1045 | end_page_writeback(page); | 1057 | nfs_end_page_writeback(page); |
| 1046 | nfs_inode_remove_request(req); | 1058 | nfs_inode_remove_request(req); |
| 1047 | dprintk(", error = %d\n", task->tk_status); | 1059 | dprintk(", error = %d\n", task->tk_status); |
| 1048 | goto next; | 1060 | goto next; |
| 1049 | } | 1061 | } |
| 1050 | end_page_writeback(page); | 1062 | nfs_end_page_writeback(page); |
| 1051 | 1063 | ||
| 1052 | #if defined(CONFIG_NFS_V3) || defined(CONFIG_NFS_V4) | 1064 | #if defined(CONFIG_NFS_V3) || defined(CONFIG_NFS_V4) |
| 1053 | if (data->args.stable != NFS_UNSTABLE || data->verf.committed == NFS_FILE_SYNC) { | 1065 | if (data->args.stable != NFS_UNSTABLE || data->verf.committed == NFS_FILE_SYNC) { |
| @@ -1514,6 +1526,26 @@ int __init nfs_init_writepagecache(void) | |||
| 1514 | if (nfs_commit_mempool == NULL) | 1526 | if (nfs_commit_mempool == NULL) |
| 1515 | return -ENOMEM; | 1527 | return -ENOMEM; |
| 1516 | 1528 | ||
| 1529 | /* | ||
| 1530 | * NFS congestion size, scale with available memory. | ||
| 1531 | * | ||
| 1532 | * 64MB: 8192k | ||
| 1533 | * 128MB: 11585k | ||
| 1534 | * 256MB: 16384k | ||
| 1535 | * 512MB: 23170k | ||
| 1536 | * 1GB: 32768k | ||
| 1537 | * 2GB: 46340k | ||
| 1538 | * 4GB: 65536k | ||
| 1539 | * 8GB: 92681k | ||
| 1540 | * 16GB: 131072k | ||
| 1541 | * | ||
| 1542 | * This allows larger machines to have larger/more transfers. | ||
| 1543 | * Limit the default to 256M | ||
| 1544 | */ | ||
| 1545 | nfs_congestion_kb = (16*int_sqrt(totalram_pages)) << (PAGE_SHIFT-10); | ||
| 1546 | if (nfs_congestion_kb > 256*1024) | ||
| 1547 | nfs_congestion_kb = 256*1024; | ||
| 1548 | |||
| 1517 | return 0; | 1549 | return 0; |
| 1518 | } | 1550 | } |
| 1519 | 1551 | ||
diff --git a/fs/nfsd/nfsfh.c b/fs/nfsd/nfsfh.c index c2660cbfcd96..8d995bcef806 100644 --- a/fs/nfsd/nfsfh.c +++ b/fs/nfsd/nfsfh.c | |||
| @@ -17,7 +17,6 @@ | |||
| 17 | #include <linux/stat.h> | 17 | #include <linux/stat.h> |
| 18 | #include <linux/dcache.h> | 18 | #include <linux/dcache.h> |
| 19 | #include <linux/mount.h> | 19 | #include <linux/mount.h> |
| 20 | #include <asm/pgtable.h> | ||
| 21 | 20 | ||
| 22 | #include <linux/sunrpc/clnt.h> | 21 | #include <linux/sunrpc/clnt.h> |
| 23 | #include <linux/sunrpc/svc.h> | 22 | #include <linux/sunrpc/svc.h> |
diff --git a/fs/ocfs2/aops.c b/fs/ocfs2/aops.c index 93628b02ef5d..875c11443817 100644 --- a/fs/ocfs2/aops.c +++ b/fs/ocfs2/aops.c | |||
| @@ -614,6 +614,27 @@ static void ocfs2_dio_end_io(struct kiocb *iocb, | |||
| 614 | ocfs2_rw_unlock(inode, 0); | 614 | ocfs2_rw_unlock(inode, 0); |
| 615 | } | 615 | } |
| 616 | 616 | ||
| 617 | /* | ||
| 618 | * ocfs2_invalidatepage() and ocfs2_releasepage() are shamelessly stolen | ||
| 619 | * from ext3. PageChecked() bits have been removed as OCFS2 does not | ||
| 620 | * do journalled data. | ||
| 621 | */ | ||
| 622 | static void ocfs2_invalidatepage(struct page *page, unsigned long offset) | ||
| 623 | { | ||
| 624 | journal_t *journal = OCFS2_SB(page->mapping->host->i_sb)->journal->j_journal; | ||
| 625 | |||
| 626 | journal_invalidatepage(journal, page, offset); | ||
| 627 | } | ||
| 628 | |||
| 629 | static int ocfs2_releasepage(struct page *page, gfp_t wait) | ||
| 630 | { | ||
| 631 | journal_t *journal = OCFS2_SB(page->mapping->host->i_sb)->journal->j_journal; | ||
| 632 | |||
| 633 | if (!page_has_buffers(page)) | ||
| 634 | return 0; | ||
| 635 | return journal_try_to_free_buffers(journal, page, wait); | ||
| 636 | } | ||
| 637 | |||
| 617 | static ssize_t ocfs2_direct_IO(int rw, | 638 | static ssize_t ocfs2_direct_IO(int rw, |
| 618 | struct kiocb *iocb, | 639 | struct kiocb *iocb, |
| 619 | const struct iovec *iov, | 640 | const struct iovec *iov, |
| @@ -661,5 +682,8 @@ const struct address_space_operations ocfs2_aops = { | |||
| 661 | .commit_write = ocfs2_commit_write, | 682 | .commit_write = ocfs2_commit_write, |
| 662 | .bmap = ocfs2_bmap, | 683 | .bmap = ocfs2_bmap, |
| 663 | .sync_page = block_sync_page, | 684 | .sync_page = block_sync_page, |
| 664 | .direct_IO = ocfs2_direct_IO | 685 | .direct_IO = ocfs2_direct_IO, |
| 686 | .invalidatepage = ocfs2_invalidatepage, | ||
| 687 | .releasepage = ocfs2_releasepage, | ||
| 688 | .migratepage = buffer_migrate_page, | ||
| 665 | }; | 689 | }; |
diff --git a/fs/ocfs2/cluster/heartbeat.c b/fs/ocfs2/cluster/heartbeat.c index 5a9779bb9236..eba282da500e 100644 --- a/fs/ocfs2/cluster/heartbeat.c +++ b/fs/ocfs2/cluster/heartbeat.c | |||
| @@ -1234,6 +1234,7 @@ static ssize_t o2hb_region_dev_write(struct o2hb_region *reg, | |||
| 1234 | const char *page, | 1234 | const char *page, |
| 1235 | size_t count) | 1235 | size_t count) |
| 1236 | { | 1236 | { |
| 1237 | struct task_struct *hb_task; | ||
| 1237 | long fd; | 1238 | long fd; |
| 1238 | int sectsize; | 1239 | int sectsize; |
| 1239 | char *p = (char *)page; | 1240 | char *p = (char *)page; |
| @@ -1319,20 +1320,28 @@ static ssize_t o2hb_region_dev_write(struct o2hb_region *reg, | |||
| 1319 | */ | 1320 | */ |
| 1320 | atomic_set(®->hr_steady_iterations, O2HB_LIVE_THRESHOLD + 1); | 1321 | atomic_set(®->hr_steady_iterations, O2HB_LIVE_THRESHOLD + 1); |
| 1321 | 1322 | ||
| 1322 | reg->hr_task = kthread_run(o2hb_thread, reg, "o2hb-%s", | 1323 | hb_task = kthread_run(o2hb_thread, reg, "o2hb-%s", |
| 1323 | reg->hr_item.ci_name); | 1324 | reg->hr_item.ci_name); |
| 1324 | if (IS_ERR(reg->hr_task)) { | 1325 | if (IS_ERR(hb_task)) { |
| 1325 | ret = PTR_ERR(reg->hr_task); | 1326 | ret = PTR_ERR(hb_task); |
| 1326 | mlog_errno(ret); | 1327 | mlog_errno(ret); |
| 1327 | reg->hr_task = NULL; | ||
| 1328 | goto out; | 1328 | goto out; |
| 1329 | } | 1329 | } |
| 1330 | 1330 | ||
| 1331 | spin_lock(&o2hb_live_lock); | ||
| 1332 | reg->hr_task = hb_task; | ||
| 1333 | spin_unlock(&o2hb_live_lock); | ||
| 1334 | |||
| 1331 | ret = wait_event_interruptible(o2hb_steady_queue, | 1335 | ret = wait_event_interruptible(o2hb_steady_queue, |
| 1332 | atomic_read(®->hr_steady_iterations) == 0); | 1336 | atomic_read(®->hr_steady_iterations) == 0); |
| 1333 | if (ret) { | 1337 | if (ret) { |
| 1334 | kthread_stop(reg->hr_task); | 1338 | spin_lock(&o2hb_live_lock); |
| 1339 | hb_task = reg->hr_task; | ||
| 1335 | reg->hr_task = NULL; | 1340 | reg->hr_task = NULL; |
| 1341 | spin_unlock(&o2hb_live_lock); | ||
| 1342 | |||
| 1343 | if (hb_task) | ||
| 1344 | kthread_stop(hb_task); | ||
| 1336 | goto out; | 1345 | goto out; |
| 1337 | } | 1346 | } |
| 1338 | 1347 | ||
| @@ -1354,10 +1363,17 @@ out: | |||
| 1354 | static ssize_t o2hb_region_pid_read(struct o2hb_region *reg, | 1363 | static ssize_t o2hb_region_pid_read(struct o2hb_region *reg, |
| 1355 | char *page) | 1364 | char *page) |
| 1356 | { | 1365 | { |
| 1357 | if (!reg->hr_task) | 1366 | pid_t pid = 0; |
| 1367 | |||
| 1368 | spin_lock(&o2hb_live_lock); | ||
| 1369 | if (reg->hr_task) | ||
| 1370 | pid = reg->hr_task->pid; | ||
| 1371 | spin_unlock(&o2hb_live_lock); | ||
| 1372 | |||
| 1373 | if (!pid) | ||
| 1358 | return 0; | 1374 | return 0; |
| 1359 | 1375 | ||
| 1360 | return sprintf(page, "%u\n", reg->hr_task->pid); | 1376 | return sprintf(page, "%u\n", pid); |
| 1361 | } | 1377 | } |
| 1362 | 1378 | ||
| 1363 | struct o2hb_region_attribute { | 1379 | struct o2hb_region_attribute { |
| @@ -1495,13 +1511,17 @@ out: | |||
| 1495 | static void o2hb_heartbeat_group_drop_item(struct config_group *group, | 1511 | static void o2hb_heartbeat_group_drop_item(struct config_group *group, |
| 1496 | struct config_item *item) | 1512 | struct config_item *item) |
| 1497 | { | 1513 | { |
| 1514 | struct task_struct *hb_task; | ||
| 1498 | struct o2hb_region *reg = to_o2hb_region(item); | 1515 | struct o2hb_region *reg = to_o2hb_region(item); |
| 1499 | 1516 | ||
| 1500 | /* stop the thread when the user removes the region dir */ | 1517 | /* stop the thread when the user removes the region dir */ |
| 1501 | if (reg->hr_task) { | 1518 | spin_lock(&o2hb_live_lock); |
| 1502 | kthread_stop(reg->hr_task); | 1519 | hb_task = reg->hr_task; |
| 1503 | reg->hr_task = NULL; | 1520 | reg->hr_task = NULL; |
| 1504 | } | 1521 | spin_unlock(&o2hb_live_lock); |
| 1522 | |||
| 1523 | if (hb_task) | ||
| 1524 | kthread_stop(hb_task); | ||
| 1505 | 1525 | ||
| 1506 | config_item_put(item); | 1526 | config_item_put(item); |
| 1507 | } | 1527 | } |
| @@ -1682,7 +1702,7 @@ out: | |||
| 1682 | } | 1702 | } |
| 1683 | EXPORT_SYMBOL_GPL(o2hb_register_callback); | 1703 | EXPORT_SYMBOL_GPL(o2hb_register_callback); |
| 1684 | 1704 | ||
| 1685 | int o2hb_unregister_callback(struct o2hb_callback_func *hc) | 1705 | void o2hb_unregister_callback(struct o2hb_callback_func *hc) |
| 1686 | { | 1706 | { |
| 1687 | BUG_ON(hc->hc_magic != O2HB_CB_MAGIC); | 1707 | BUG_ON(hc->hc_magic != O2HB_CB_MAGIC); |
| 1688 | 1708 | ||
| @@ -1690,15 +1710,13 @@ int o2hb_unregister_callback(struct o2hb_callback_func *hc) | |||
| 1690 | __builtin_return_address(0), hc); | 1710 | __builtin_return_address(0), hc); |
| 1691 | 1711 | ||
| 1692 | if (list_empty(&hc->hc_item)) | 1712 | if (list_empty(&hc->hc_item)) |
| 1693 | return 0; | 1713 | return; |
| 1694 | 1714 | ||
| 1695 | down_write(&o2hb_callback_sem); | 1715 | down_write(&o2hb_callback_sem); |
| 1696 | 1716 | ||
| 1697 | list_del_init(&hc->hc_item); | 1717 | list_del_init(&hc->hc_item); |
| 1698 | 1718 | ||
| 1699 | up_write(&o2hb_callback_sem); | 1719 | up_write(&o2hb_callback_sem); |
| 1700 | |||
| 1701 | return 0; | ||
| 1702 | } | 1720 | } |
| 1703 | EXPORT_SYMBOL_GPL(o2hb_unregister_callback); | 1721 | EXPORT_SYMBOL_GPL(o2hb_unregister_callback); |
| 1704 | 1722 | ||
diff --git a/fs/ocfs2/cluster/heartbeat.h b/fs/ocfs2/cluster/heartbeat.h index cac6223206a9..cc6d40b39771 100644 --- a/fs/ocfs2/cluster/heartbeat.h +++ b/fs/ocfs2/cluster/heartbeat.h | |||
| @@ -70,7 +70,7 @@ void o2hb_setup_callback(struct o2hb_callback_func *hc, | |||
| 70 | void *data, | 70 | void *data, |
| 71 | int priority); | 71 | int priority); |
| 72 | int o2hb_register_callback(struct o2hb_callback_func *hc); | 72 | int o2hb_register_callback(struct o2hb_callback_func *hc); |
| 73 | int o2hb_unregister_callback(struct o2hb_callback_func *hc); | 73 | void o2hb_unregister_callback(struct o2hb_callback_func *hc); |
| 74 | void o2hb_fill_node_map(unsigned long *map, | 74 | void o2hb_fill_node_map(unsigned long *map, |
| 75 | unsigned bytes); | 75 | unsigned bytes); |
| 76 | void o2hb_init(void); | 76 | void o2hb_init(void); |
diff --git a/fs/ocfs2/cluster/tcp.c b/fs/ocfs2/cluster/tcp.c index 1718215fc018..69caf3e12fea 100644 --- a/fs/ocfs2/cluster/tcp.c +++ b/fs/ocfs2/cluster/tcp.c | |||
| @@ -1638,17 +1638,8 @@ static void o2net_hb_node_up_cb(struct o2nm_node *node, int node_num, | |||
| 1638 | 1638 | ||
| 1639 | void o2net_unregister_hb_callbacks(void) | 1639 | void o2net_unregister_hb_callbacks(void) |
| 1640 | { | 1640 | { |
| 1641 | int ret; | 1641 | o2hb_unregister_callback(&o2net_hb_up); |
| 1642 | 1642 | o2hb_unregister_callback(&o2net_hb_down); | |
| 1643 | ret = o2hb_unregister_callback(&o2net_hb_up); | ||
| 1644 | if (ret < 0) | ||
| 1645 | mlog(ML_ERROR, "Status return %d unregistering heartbeat up " | ||
| 1646 | "callback!\n", ret); | ||
| 1647 | |||
| 1648 | ret = o2hb_unregister_callback(&o2net_hb_down); | ||
| 1649 | if (ret < 0) | ||
| 1650 | mlog(ML_ERROR, "Status return %d unregistering heartbeat down " | ||
| 1651 | "callback!\n", ret); | ||
| 1652 | } | 1643 | } |
| 1653 | 1644 | ||
| 1654 | int o2net_register_hb_callbacks(void) | 1645 | int o2net_register_hb_callbacks(void) |
diff --git a/fs/ocfs2/dlm/dlmmaster.c b/fs/ocfs2/dlm/dlmmaster.c index 77e4e6169a0d..9229e04362f6 100644 --- a/fs/ocfs2/dlm/dlmmaster.c +++ b/fs/ocfs2/dlm/dlmmaster.c | |||
| @@ -2730,14 +2730,17 @@ int dlm_empty_lockres(struct dlm_ctxt *dlm, struct dlm_lock_resource *res) | |||
| 2730 | int ret; | 2730 | int ret; |
| 2731 | int lock_dropped = 0; | 2731 | int lock_dropped = 0; |
| 2732 | 2732 | ||
| 2733 | spin_lock(&res->spinlock); | ||
| 2733 | if (res->owner != dlm->node_num) { | 2734 | if (res->owner != dlm->node_num) { |
| 2734 | if (!__dlm_lockres_unused(res)) { | 2735 | if (!__dlm_lockres_unused(res)) { |
| 2735 | mlog(ML_ERROR, "%s:%.*s: this node is not master, " | 2736 | mlog(ML_ERROR, "%s:%.*s: this node is not master, " |
| 2736 | "trying to free this but locks remain\n", | 2737 | "trying to free this but locks remain\n", |
| 2737 | dlm->name, res->lockname.len, res->lockname.name); | 2738 | dlm->name, res->lockname.len, res->lockname.name); |
| 2738 | } | 2739 | } |
| 2740 | spin_unlock(&res->spinlock); | ||
| 2739 | goto leave; | 2741 | goto leave; |
| 2740 | } | 2742 | } |
| 2743 | spin_unlock(&res->spinlock); | ||
| 2741 | 2744 | ||
| 2742 | /* Wheee! Migrate lockres here! Will sleep so drop spinlock. */ | 2745 | /* Wheee! Migrate lockres here! Will sleep so drop spinlock. */ |
| 2743 | spin_unlock(&dlm->spinlock); | 2746 | spin_unlock(&dlm->spinlock); |
diff --git a/fs/ocfs2/dlm/dlmthread.c b/fs/ocfs2/dlm/dlmthread.c index 8ffa0916eb86..6421a8fae1de 100644 --- a/fs/ocfs2/dlm/dlmthread.c +++ b/fs/ocfs2/dlm/dlmthread.c | |||
| @@ -265,8 +265,10 @@ static void dlm_run_purge_list(struct dlm_ctxt *dlm, | |||
| 265 | /* This may drop and reacquire the dlm spinlock if it | 265 | /* This may drop and reacquire the dlm spinlock if it |
| 266 | * has to do migration. */ | 266 | * has to do migration. */ |
| 267 | mlog(0, "calling dlm_purge_lockres!\n"); | 267 | mlog(0, "calling dlm_purge_lockres!\n"); |
| 268 | dlm_lockres_get(lockres); | ||
| 268 | if (dlm_purge_lockres(dlm, lockres)) | 269 | if (dlm_purge_lockres(dlm, lockres)) |
| 269 | BUG(); | 270 | BUG(); |
| 271 | dlm_lockres_put(lockres); | ||
| 270 | mlog(0, "DONE calling dlm_purge_lockres!\n"); | 272 | mlog(0, "DONE calling dlm_purge_lockres!\n"); |
| 271 | 273 | ||
| 272 | /* Avoid adding any scheduling latencies */ | 274 | /* Avoid adding any scheduling latencies */ |
diff --git a/fs/ocfs2/heartbeat.c b/fs/ocfs2/heartbeat.c index 8fc52d6d0ce7..b25ef63781ba 100644 --- a/fs/ocfs2/heartbeat.c +++ b/fs/ocfs2/heartbeat.c | |||
| @@ -164,8 +164,10 @@ int ocfs2_register_hb_callbacks(struct ocfs2_super *osb) | |||
| 164 | } | 164 | } |
| 165 | 165 | ||
| 166 | status = o2hb_register_callback(&osb->osb_hb_up); | 166 | status = o2hb_register_callback(&osb->osb_hb_up); |
| 167 | if (status < 0) | 167 | if (status < 0) { |
| 168 | mlog_errno(status); | 168 | mlog_errno(status); |
| 169 | o2hb_unregister_callback(&osb->osb_hb_down); | ||
| 170 | } | ||
| 169 | 171 | ||
| 170 | bail: | 172 | bail: |
| 171 | return status; | 173 | return status; |
| @@ -173,18 +175,11 @@ bail: | |||
| 173 | 175 | ||
| 174 | void ocfs2_clear_hb_callbacks(struct ocfs2_super *osb) | 176 | void ocfs2_clear_hb_callbacks(struct ocfs2_super *osb) |
| 175 | { | 177 | { |
| 176 | int status; | ||
| 177 | |||
| 178 | if (ocfs2_mount_local(osb)) | 178 | if (ocfs2_mount_local(osb)) |
| 179 | return; | 179 | return; |
| 180 | 180 | ||
| 181 | status = o2hb_unregister_callback(&osb->osb_hb_down); | 181 | o2hb_unregister_callback(&osb->osb_hb_down); |
| 182 | if (status < 0) | 182 | o2hb_unregister_callback(&osb->osb_hb_up); |
| 183 | mlog_errno(status); | ||
| 184 | |||
| 185 | status = o2hb_unregister_callback(&osb->osb_hb_up); | ||
| 186 | if (status < 0) | ||
| 187 | mlog_errno(status); | ||
| 188 | } | 183 | } |
| 189 | 184 | ||
| 190 | void ocfs2_stop_heartbeat(struct ocfs2_super *osb) | 185 | void ocfs2_stop_heartbeat(struct ocfs2_super *osb) |
diff --git a/fs/partitions/Kconfig b/fs/partitions/Kconfig index 74552c60b671..6e8bb66fe619 100644 --- a/fs/partitions/Kconfig +++ b/fs/partitions/Kconfig | |||
| @@ -235,5 +235,4 @@ config EFI_PARTITION | |||
| 235 | select CRC32 | 235 | select CRC32 |
| 236 | help | 236 | help |
| 237 | Say Y here if you would like to use hard disks under Linux which | 237 | Say Y here if you would like to use hard disks under Linux which |
| 238 | were partitioned using EFI GPT. Presently only useful on the | 238 | were partitioned using EFI GPT. |
| 239 | IA-64 platform. | ||
diff --git a/fs/partitions/check.c b/fs/partitions/check.c index e46d237b10f9..8a7d0035ad7a 100644 --- a/fs/partitions/check.c +++ b/fs/partitions/check.c | |||
| @@ -541,7 +541,7 @@ int rescan_partitions(struct gendisk *disk, struct block_device *bdev) | |||
| 541 | if (!get_capacity(disk) || !(state = check_partition(disk, bdev))) | 541 | if (!get_capacity(disk) || !(state = check_partition(disk, bdev))) |
| 542 | return 0; | 542 | return 0; |
| 543 | if (IS_ERR(state)) /* I/O error reading the partition table */ | 543 | if (IS_ERR(state)) /* I/O error reading the partition table */ |
| 544 | return PTR_ERR(state); | 544 | return -EIO; |
| 545 | for (p = 1; p < state->limit; p++) { | 545 | for (p = 1; p < state->limit; p++) { |
| 546 | sector_t size = state->parts[p].size; | 546 | sector_t size = state->parts[p].size; |
| 547 | sector_t from = state->parts[p].from; | 547 | sector_t from = state->parts[p].from; |
diff --git a/fs/proc/base.c b/fs/proc/base.c index 01f7769da8e6..989af5e55d1b 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c | |||
| @@ -1558,29 +1558,20 @@ static ssize_t proc_pid_attr_read(struct file * file, char __user * buf, | |||
| 1558 | size_t count, loff_t *ppos) | 1558 | size_t count, loff_t *ppos) |
| 1559 | { | 1559 | { |
| 1560 | struct inode * inode = file->f_path.dentry->d_inode; | 1560 | struct inode * inode = file->f_path.dentry->d_inode; |
| 1561 | unsigned long page; | 1561 | char *p = NULL; |
| 1562 | ssize_t length; | 1562 | ssize_t length; |
| 1563 | struct task_struct *task = get_proc_task(inode); | 1563 | struct task_struct *task = get_proc_task(inode); |
| 1564 | 1564 | ||
| 1565 | length = -ESRCH; | ||
| 1566 | if (!task) | 1565 | if (!task) |
| 1567 | goto out_no_task; | 1566 | return -ESRCH; |
| 1568 | |||
| 1569 | if (count > PAGE_SIZE) | ||
| 1570 | count = PAGE_SIZE; | ||
| 1571 | length = -ENOMEM; | ||
| 1572 | if (!(page = __get_free_page(GFP_KERNEL))) | ||
| 1573 | goto out; | ||
| 1574 | 1567 | ||
| 1575 | length = security_getprocattr(task, | 1568 | length = security_getprocattr(task, |
| 1576 | (char*)file->f_path.dentry->d_name.name, | 1569 | (char*)file->f_path.dentry->d_name.name, |
| 1577 | (void*)page, count); | 1570 | &p); |
| 1578 | if (length >= 0) | ||
| 1579 | length = simple_read_from_buffer(buf, count, ppos, (char *)page, length); | ||
| 1580 | free_page(page); | ||
| 1581 | out: | ||
| 1582 | put_task_struct(task); | 1571 | put_task_struct(task); |
| 1583 | out_no_task: | 1572 | if (length > 0) |
| 1573 | length = simple_read_from_buffer(buf, count, ppos, p, length); | ||
| 1574 | kfree(p); | ||
| 1584 | return length; | 1575 | return length; |
| 1585 | } | 1576 | } |
| 1586 | 1577 | ||
diff --git a/fs/smbfs/request.c b/fs/smbfs/request.c index 42261dbdf60f..723f7c667661 100644 --- a/fs/smbfs/request.c +++ b/fs/smbfs/request.c | |||
| @@ -181,6 +181,7 @@ static int smb_setup_request(struct smb_request *req) | |||
| 181 | req->rq_errno = 0; | 181 | req->rq_errno = 0; |
| 182 | req->rq_fragment = 0; | 182 | req->rq_fragment = 0; |
| 183 | kfree(req->rq_trans2buffer); | 183 | kfree(req->rq_trans2buffer); |
| 184 | req->rq_trans2buffer = NULL; | ||
| 184 | 185 | ||
| 185 | return 0; | 186 | return 0; |
| 186 | } | 187 | } |
diff --git a/fs/sysfs/file.c b/fs/sysfs/file.c index 8d4d839a9d88..fc4633378dc0 100644 --- a/fs/sysfs/file.c +++ b/fs/sysfs/file.c | |||
| @@ -168,12 +168,12 @@ sysfs_read_file(struct file *file, char __user *buf, size_t count, loff_t *ppos) | |||
| 168 | ssize_t retval = 0; | 168 | ssize_t retval = 0; |
| 169 | 169 | ||
| 170 | down(&buffer->sem); | 170 | down(&buffer->sem); |
| 171 | if (buffer->orphaned) { | ||
| 172 | retval = -ENODEV; | ||
| 173 | goto out; | ||
| 174 | } | ||
| 175 | if (buffer->needs_read_fill) { | 171 | if (buffer->needs_read_fill) { |
| 176 | if ((retval = fill_read_buffer(file->f_path.dentry,buffer))) | 172 | if (buffer->orphaned) |
| 173 | retval = -ENODEV; | ||
| 174 | else | ||
| 175 | retval = fill_read_buffer(file->f_path.dentry,buffer); | ||
| 176 | if (retval) | ||
| 177 | goto out; | 177 | goto out; |
| 178 | } | 178 | } |
| 179 | pr_debug("%s: count = %zd, ppos = %lld, buf = %s\n", | 179 | pr_debug("%s: count = %zd, ppos = %lld, buf = %s\n", |
| @@ -629,6 +629,60 @@ void sysfs_remove_file_from_group(struct kobject *kobj, | |||
| 629 | } | 629 | } |
| 630 | EXPORT_SYMBOL_GPL(sysfs_remove_file_from_group); | 630 | EXPORT_SYMBOL_GPL(sysfs_remove_file_from_group); |
| 631 | 631 | ||
| 632 | struct sysfs_schedule_callback_struct { | ||
| 633 | struct kobject *kobj; | ||
| 634 | void (*func)(void *); | ||
| 635 | void *data; | ||
| 636 | struct work_struct work; | ||
| 637 | }; | ||
| 638 | |||
| 639 | static void sysfs_schedule_callback_work(struct work_struct *work) | ||
| 640 | { | ||
| 641 | struct sysfs_schedule_callback_struct *ss = container_of(work, | ||
| 642 | struct sysfs_schedule_callback_struct, work); | ||
| 643 | |||
| 644 | (ss->func)(ss->data); | ||
| 645 | kobject_put(ss->kobj); | ||
| 646 | kfree(ss); | ||
| 647 | } | ||
| 648 | |||
| 649 | /** | ||
| 650 | * sysfs_schedule_callback - helper to schedule a callback for a kobject | ||
| 651 | * @kobj: object we're acting for. | ||
| 652 | * @func: callback function to invoke later. | ||
| 653 | * @data: argument to pass to @func. | ||
| 654 | * | ||
| 655 | * sysfs attribute methods must not unregister themselves or their parent | ||
| 656 | * kobject (which would amount to the same thing). Attempts to do so will | ||
| 657 | * deadlock, since unregistration is mutually exclusive with driver | ||
| 658 | * callbacks. | ||
| 659 | * | ||
| 660 | * Instead methods can call this routine, which will attempt to allocate | ||
| 661 | * and schedule a workqueue request to call back @func with @data as its | ||
| 662 | * argument in the workqueue's process context. @kobj will be pinned | ||
| 663 | * until @func returns. | ||
| 664 | * | ||
| 665 | * Returns 0 if the request was submitted, -ENOMEM if storage could not | ||
| 666 | * be allocated. | ||
| 667 | */ | ||
| 668 | int sysfs_schedule_callback(struct kobject *kobj, void (*func)(void *), | ||
| 669 | void *data) | ||
| 670 | { | ||
| 671 | struct sysfs_schedule_callback_struct *ss; | ||
| 672 | |||
| 673 | ss = kmalloc(sizeof(*ss), GFP_KERNEL); | ||
| 674 | if (!ss) | ||
| 675 | return -ENOMEM; | ||
| 676 | kobject_get(kobj); | ||
| 677 | ss->kobj = kobj; | ||
| 678 | ss->func = func; | ||
| 679 | ss->data = data; | ||
| 680 | INIT_WORK(&ss->work, sysfs_schedule_callback_work); | ||
| 681 | schedule_work(&ss->work); | ||
| 682 | return 0; | ||
| 683 | } | ||
| 684 | EXPORT_SYMBOL_GPL(sysfs_schedule_callback); | ||
| 685 | |||
| 632 | 686 | ||
| 633 | EXPORT_SYMBOL_GPL(sysfs_create_file); | 687 | EXPORT_SYMBOL_GPL(sysfs_create_file); |
| 634 | EXPORT_SYMBOL_GPL(sysfs_remove_file); | 688 | EXPORT_SYMBOL_GPL(sysfs_remove_file); |
diff --git a/fs/sysfs/inode.c b/fs/sysfs/inode.c index ccb7d722c558..4de5c6b89918 100644 --- a/fs/sysfs/inode.c +++ b/fs/sysfs/inode.c | |||
| @@ -222,13 +222,17 @@ const unsigned char * sysfs_get_name(struct sysfs_dirent *sd) | |||
| 222 | 222 | ||
| 223 | static inline void orphan_all_buffers(struct inode *node) | 223 | static inline void orphan_all_buffers(struct inode *node) |
| 224 | { | 224 | { |
| 225 | struct sysfs_buffer_collection *set = node->i_private; | 225 | struct sysfs_buffer_collection *set; |
| 226 | struct sysfs_buffer *buf; | 226 | struct sysfs_buffer *buf; |
| 227 | 227 | ||
| 228 | mutex_lock_nested(&node->i_mutex, I_MUTEX_CHILD); | 228 | mutex_lock_nested(&node->i_mutex, I_MUTEX_CHILD); |
| 229 | if (node->i_private) { | 229 | set = node->i_private; |
| 230 | list_for_each_entry(buf, &set->associates, associates) | 230 | if (set) { |
| 231 | list_for_each_entry(buf, &set->associates, associates) { | ||
| 232 | down(&buf->sem); | ||
| 231 | buf->orphaned = 1; | 233 | buf->orphaned = 1; |
| 234 | up(&buf->sem); | ||
| 235 | } | ||
| 232 | } | 236 | } |
| 233 | mutex_unlock(&node->i_mutex); | 237 | mutex_unlock(&node->i_mutex); |
| 234 | } | 238 | } |
diff --git a/fs/ufs/balloc.c b/fs/ufs/balloc.c index bcc44084e004..841ac25fd950 100644 --- a/fs/ufs/balloc.c +++ b/fs/ufs/balloc.c | |||
| @@ -244,62 +244,87 @@ failed: | |||
| 244 | * We can come here from ufs_writepage or ufs_prepare_write, | 244 | * We can come here from ufs_writepage or ufs_prepare_write, |
| 245 | * locked_page is argument of these functions, so we already lock it. | 245 | * locked_page is argument of these functions, so we already lock it. |
| 246 | */ | 246 | */ |
| 247 | static void ufs_change_blocknr(struct inode *inode, unsigned int beg, | 247 | static void ufs_change_blocknr(struct inode *inode, sector_t beg, |
| 248 | unsigned int count, unsigned int oldb, | 248 | unsigned int count, sector_t oldb, |
| 249 | unsigned int newb, struct page *locked_page) | 249 | sector_t newb, struct page *locked_page) |
| 250 | { | 250 | { |
| 251 | const unsigned mask = (1 << (PAGE_CACHE_SHIFT - inode->i_blkbits)) - 1; | 251 | const unsigned blks_per_page = |
| 252 | 1 << (PAGE_CACHE_SHIFT - inode->i_blkbits); | ||
| 253 | const unsigned mask = blks_per_page - 1; | ||
| 252 | struct address_space * const mapping = inode->i_mapping; | 254 | struct address_space * const mapping = inode->i_mapping; |
| 253 | pgoff_t index, cur_index; | 255 | pgoff_t index, cur_index, last_index; |
| 254 | unsigned end, pos, j; | 256 | unsigned pos, j, lblock; |
| 257 | sector_t end, i; | ||
| 255 | struct page *page; | 258 | struct page *page; |
| 256 | struct buffer_head *head, *bh; | 259 | struct buffer_head *head, *bh; |
| 257 | 260 | ||
| 258 | UFSD("ENTER, ino %lu, count %u, oldb %u, newb %u\n", | 261 | UFSD("ENTER, ino %lu, count %u, oldb %llu, newb %llu\n", |
| 259 | inode->i_ino, count, oldb, newb); | 262 | inode->i_ino, count, |
| 263 | (unsigned long long)oldb, (unsigned long long)newb); | ||
| 260 | 264 | ||
| 261 | BUG_ON(!locked_page); | 265 | BUG_ON(!locked_page); |
| 262 | BUG_ON(!PageLocked(locked_page)); | 266 | BUG_ON(!PageLocked(locked_page)); |
| 263 | 267 | ||
| 264 | cur_index = locked_page->index; | 268 | cur_index = locked_page->index; |
| 265 | 269 | end = count + beg; | |
| 266 | for (end = count + beg; beg < end; beg = (beg | mask) + 1) { | 270 | last_index = end >> (PAGE_CACHE_SHIFT - inode->i_blkbits); |
| 267 | index = beg >> (PAGE_CACHE_SHIFT - inode->i_blkbits); | 271 | for (i = beg; i < end; i = (i | mask) + 1) { |
| 272 | index = i >> (PAGE_CACHE_SHIFT - inode->i_blkbits); | ||
| 268 | 273 | ||
| 269 | if (likely(cur_index != index)) { | 274 | if (likely(cur_index != index)) { |
| 270 | page = ufs_get_locked_page(mapping, index); | 275 | page = ufs_get_locked_page(mapping, index); |
| 271 | if (!page || IS_ERR(page)) /* it was truncated or EIO */ | 276 | if (!page)/* it was truncated */ |
| 277 | continue; | ||
| 278 | if (IS_ERR(page)) {/* or EIO */ | ||
| 279 | ufs_error(inode->i_sb, __FUNCTION__, | ||
| 280 | "read of page %llu failed\n", | ||
| 281 | (unsigned long long)index); | ||
| 272 | continue; | 282 | continue; |
| 283 | } | ||
| 273 | } else | 284 | } else |
| 274 | page = locked_page; | 285 | page = locked_page; |
| 275 | 286 | ||
| 276 | head = page_buffers(page); | 287 | head = page_buffers(page); |
| 277 | bh = head; | 288 | bh = head; |
| 278 | pos = beg & mask; | 289 | pos = i & mask; |
| 279 | for (j = 0; j < pos; ++j) | 290 | for (j = 0; j < pos; ++j) |
| 280 | bh = bh->b_this_page; | 291 | bh = bh->b_this_page; |
| 281 | j = 0; | 292 | |
| 293 | |||
| 294 | if (unlikely(index == last_index)) | ||
| 295 | lblock = end & mask; | ||
| 296 | else | ||
| 297 | lblock = blks_per_page; | ||
| 298 | |||
| 282 | do { | 299 | do { |
| 283 | if (buffer_mapped(bh)) { | 300 | if (j >= lblock) |
| 284 | pos = bh->b_blocknr - oldb; | 301 | break; |
| 285 | if (pos < count) { | 302 | pos = (i - beg) + j; |
| 286 | UFSD(" change from %llu to %llu\n", | 303 | |
| 287 | (unsigned long long)pos + oldb, | 304 | if (!buffer_mapped(bh)) |
| 288 | (unsigned long long)pos + newb); | 305 | map_bh(bh, inode->i_sb, oldb + pos); |
| 289 | bh->b_blocknr = newb + pos; | 306 | if (!buffer_uptodate(bh)) { |
| 290 | unmap_underlying_metadata(bh->b_bdev, | 307 | ll_rw_block(READ, 1, &bh); |
| 291 | bh->b_blocknr); | 308 | wait_on_buffer(bh); |
| 292 | mark_buffer_dirty(bh); | 309 | if (!buffer_uptodate(bh)) { |
| 293 | ++j; | 310 | ufs_error(inode->i_sb, __FUNCTION__, |
| 311 | "read of block failed\n"); | ||
| 312 | break; | ||
| 294 | } | 313 | } |
| 295 | } | 314 | } |
| 296 | 315 | ||
| 316 | UFSD(" change from %llu to %llu, pos %u\n", | ||
| 317 | (unsigned long long)pos + oldb, | ||
| 318 | (unsigned long long)pos + newb, pos); | ||
| 319 | |||
| 320 | bh->b_blocknr = newb + pos; | ||
| 321 | unmap_underlying_metadata(bh->b_bdev, | ||
| 322 | bh->b_blocknr); | ||
| 323 | mark_buffer_dirty(bh); | ||
| 324 | ++j; | ||
| 297 | bh = bh->b_this_page; | 325 | bh = bh->b_this_page; |
| 298 | } while (bh != head); | 326 | } while (bh != head); |
| 299 | 327 | ||
| 300 | if (j) | ||
| 301 | set_page_dirty(page); | ||
| 302 | |||
| 303 | if (likely(cur_index != index)) | 328 | if (likely(cur_index != index)) |
| 304 | ufs_put_locked_page(page); | 329 | ufs_put_locked_page(page); |
| 305 | } | 330 | } |
| @@ -457,8 +482,9 @@ u64 ufs_new_fragments(struct inode *inode, void *p, u64 fragment, | |||
| 457 | if (result) { | 482 | if (result) { |
| 458 | ufs_clear_frags(inode, result + oldcount, newcount - oldcount, | 483 | ufs_clear_frags(inode, result + oldcount, newcount - oldcount, |
| 459 | locked_page != NULL); | 484 | locked_page != NULL); |
| 460 | ufs_change_blocknr(inode, fragment - oldcount, oldcount, tmp, | 485 | ufs_change_blocknr(inode, fragment - oldcount, oldcount, |
| 461 | result, locked_page); | 486 | uspi->s_sbbase + tmp, |
| 487 | uspi->s_sbbase + result, locked_page); | ||
| 462 | ufs_cpu_to_data_ptr(sb, p, result); | 488 | ufs_cpu_to_data_ptr(sb, p, result); |
| 463 | *err = 0; | 489 | *err = 0; |
| 464 | UFS_I(inode)->i_lastfrag = max_t(u32, UFS_I(inode)->i_lastfrag, fragment + count); | 490 | UFS_I(inode)->i_lastfrag = max_t(u32, UFS_I(inode)->i_lastfrag, fragment + count); |
diff --git a/fs/ufs/ialloc.c b/fs/ufs/ialloc.c index b868878009b6..c28a8b6f2feb 100644 --- a/fs/ufs/ialloc.c +++ b/fs/ufs/ialloc.c | |||
| @@ -343,9 +343,8 @@ cg_found: | |||
| 343 | lock_buffer(bh); | 343 | lock_buffer(bh); |
| 344 | ufs2_inode = (struct ufs2_inode *)bh->b_data; | 344 | ufs2_inode = (struct ufs2_inode *)bh->b_data; |
| 345 | ufs2_inode += ufs_inotofsbo(inode->i_ino); | 345 | ufs2_inode += ufs_inotofsbo(inode->i_ino); |
| 346 | ufs2_inode->ui_birthtime.tv_sec = | 346 | ufs2_inode->ui_birthtime = cpu_to_fs64(sb, CURRENT_TIME.tv_sec); |
| 347 | cpu_to_fs32(sb, CURRENT_TIME_SEC.tv_sec); | 347 | ufs2_inode->ui_birthnsec = cpu_to_fs32(sb, CURRENT_TIME.tv_nsec); |
| 348 | ufs2_inode->ui_birthtime.tv_usec = 0; | ||
| 349 | mark_buffer_dirty(bh); | 348 | mark_buffer_dirty(bh); |
| 350 | unlock_buffer(bh); | 349 | unlock_buffer(bh); |
| 351 | if (sb->s_flags & MS_SYNCHRONOUS) | 350 | if (sb->s_flags & MS_SYNCHRONOUS) |
diff --git a/fs/ufs/inode.c b/fs/ufs/inode.c index fb34ad03e224..013d7afe7cde 100644 --- a/fs/ufs/inode.c +++ b/fs/ufs/inode.c | |||
| @@ -212,7 +212,7 @@ repeat: | |||
| 212 | brelse (result); | 212 | brelse (result); |
| 213 | goto repeat; | 213 | goto repeat; |
| 214 | } else { | 214 | } else { |
| 215 | *phys = tmp + blockoff; | 215 | *phys = uspi->s_sbbase + tmp + blockoff; |
| 216 | return NULL; | 216 | return NULL; |
| 217 | } | 217 | } |
| 218 | } | 218 | } |
| @@ -282,9 +282,9 @@ repeat: | |||
| 282 | } | 282 | } |
| 283 | 283 | ||
| 284 | if (!phys) { | 284 | if (!phys) { |
| 285 | result = sb_getblk(sb, tmp + blockoff); | 285 | result = sb_getblk(sb, uspi->s_sbbase + tmp + blockoff); |
| 286 | } else { | 286 | } else { |
| 287 | *phys = tmp + blockoff; | 287 | *phys = uspi->s_sbbase + tmp + blockoff; |
| 288 | result = NULL; | 288 | result = NULL; |
| 289 | *err = 0; | 289 | *err = 0; |
| 290 | *new = 1; | 290 | *new = 1; |
| @@ -368,7 +368,7 @@ repeat: | |||
| 368 | brelse (result); | 368 | brelse (result); |
| 369 | goto repeat; | 369 | goto repeat; |
| 370 | } else { | 370 | } else { |
| 371 | *phys = tmp + blockoff; | 371 | *phys = uspi->s_sbbase + tmp + blockoff; |
| 372 | goto out; | 372 | goto out; |
| 373 | } | 373 | } |
| 374 | } | 374 | } |
| @@ -389,9 +389,9 @@ repeat: | |||
| 389 | 389 | ||
| 390 | 390 | ||
| 391 | if (!phys) { | 391 | if (!phys) { |
| 392 | result = sb_getblk(sb, tmp + blockoff); | 392 | result = sb_getblk(sb, uspi->s_sbbase + tmp + blockoff); |
| 393 | } else { | 393 | } else { |
| 394 | *phys = tmp + blockoff; | 394 | *phys = uspi->s_sbbase + tmp + blockoff; |
| 395 | *new = 1; | 395 | *new = 1; |
| 396 | } | 396 | } |
| 397 | 397 | ||
| @@ -668,12 +668,12 @@ static void ufs2_read_inode(struct inode *inode, struct ufs2_inode *ufs2_inode) | |||
| 668 | inode->i_gid = fs32_to_cpu(sb, ufs2_inode->ui_gid); | 668 | inode->i_gid = fs32_to_cpu(sb, ufs2_inode->ui_gid); |
| 669 | 669 | ||
| 670 | inode->i_size = fs64_to_cpu(sb, ufs2_inode->ui_size); | 670 | inode->i_size = fs64_to_cpu(sb, ufs2_inode->ui_size); |
| 671 | inode->i_atime.tv_sec = fs32_to_cpu(sb, ufs2_inode->ui_atime.tv_sec); | 671 | inode->i_atime.tv_sec = fs64_to_cpu(sb, ufs2_inode->ui_atime); |
| 672 | inode->i_ctime.tv_sec = fs32_to_cpu(sb, ufs2_inode->ui_ctime.tv_sec); | 672 | inode->i_ctime.tv_sec = fs64_to_cpu(sb, ufs2_inode->ui_ctime); |
| 673 | inode->i_mtime.tv_sec = fs32_to_cpu(sb, ufs2_inode->ui_mtime.tv_sec); | 673 | inode->i_mtime.tv_sec = fs64_to_cpu(sb, ufs2_inode->ui_mtime); |
| 674 | inode->i_mtime.tv_nsec = 0; | 674 | inode->i_atime.tv_nsec = fs32_to_cpu(sb, ufs2_inode->ui_atimensec); |
| 675 | inode->i_atime.tv_nsec = 0; | 675 | inode->i_ctime.tv_nsec = fs32_to_cpu(sb, ufs2_inode->ui_ctimensec); |
| 676 | inode->i_ctime.tv_nsec = 0; | 676 | inode->i_mtime.tv_nsec = fs32_to_cpu(sb, ufs2_inode->ui_mtimensec); |
| 677 | inode->i_blocks = fs64_to_cpu(sb, ufs2_inode->ui_blocks); | 677 | inode->i_blocks = fs64_to_cpu(sb, ufs2_inode->ui_blocks); |
| 678 | inode->i_generation = fs32_to_cpu(sb, ufs2_inode->ui_gen); | 678 | inode->i_generation = fs32_to_cpu(sb, ufs2_inode->ui_gen); |
| 679 | ufsi->i_flags = fs32_to_cpu(sb, ufs2_inode->ui_flags); | 679 | ufsi->i_flags = fs32_to_cpu(sb, ufs2_inode->ui_flags); |
| @@ -803,12 +803,12 @@ static void ufs2_update_inode(struct inode *inode, struct ufs2_inode *ufs_inode) | |||
| 803 | ufs_inode->ui_gid = cpu_to_fs32(sb, inode->i_gid); | 803 | ufs_inode->ui_gid = cpu_to_fs32(sb, inode->i_gid); |
| 804 | 804 | ||
| 805 | ufs_inode->ui_size = cpu_to_fs64(sb, inode->i_size); | 805 | ufs_inode->ui_size = cpu_to_fs64(sb, inode->i_size); |
| 806 | ufs_inode->ui_atime.tv_sec = cpu_to_fs32(sb, inode->i_atime.tv_sec); | 806 | ufs_inode->ui_atime = cpu_to_fs64(sb, inode->i_atime.tv_sec); |
| 807 | ufs_inode->ui_atime.tv_usec = 0; | 807 | ufs_inode->ui_atimensec = cpu_to_fs32(sb, inode->i_atime.tv_nsec); |
| 808 | ufs_inode->ui_ctime.tv_sec = cpu_to_fs32(sb, inode->i_ctime.tv_sec); | 808 | ufs_inode->ui_ctime = cpu_to_fs64(sb, inode->i_ctime.tv_sec); |
| 809 | ufs_inode->ui_ctime.tv_usec = 0; | 809 | ufs_inode->ui_ctimensec = cpu_to_fs32(sb, inode->i_ctime.tv_nsec); |
| 810 | ufs_inode->ui_mtime.tv_sec = cpu_to_fs32(sb, inode->i_mtime.tv_sec); | 810 | ufs_inode->ui_mtime = cpu_to_fs64(sb, inode->i_mtime.tv_sec); |
| 811 | ufs_inode->ui_mtime.tv_usec = 0; | 811 | ufs_inode->ui_mtimensec = cpu_to_fs32(sb, inode->i_mtime.tv_nsec); |
| 812 | 812 | ||
| 813 | ufs_inode->ui_blocks = cpu_to_fs64(sb, inode->i_blocks); | 813 | ufs_inode->ui_blocks = cpu_to_fs64(sb, inode->i_blocks); |
| 814 | ufs_inode->ui_flags = cpu_to_fs32(sb, ufsi->i_flags); | 814 | ufs_inode->ui_flags = cpu_to_fs32(sb, ufsi->i_flags); |
diff --git a/fs/ufs/truncate.c b/fs/ufs/truncate.c index 749581fa7729..79c54c85fb58 100644 --- a/fs/ufs/truncate.c +++ b/fs/ufs/truncate.c | |||
| @@ -74,7 +74,7 @@ static int ufs_trunc_direct(struct inode *inode) | |||
| 74 | unsigned i, tmp; | 74 | unsigned i, tmp; |
| 75 | int retry; | 75 | int retry; |
| 76 | 76 | ||
| 77 | UFSD("ENTER\n"); | 77 | UFSD("ENTER: ino %lu\n", inode->i_ino); |
| 78 | 78 | ||
| 79 | sb = inode->i_sb; | 79 | sb = inode->i_sb; |
| 80 | uspi = UFS_SB(sb)->s_uspi; | 80 | uspi = UFS_SB(sb)->s_uspi; |
| @@ -96,8 +96,8 @@ static int ufs_trunc_direct(struct inode *inode) | |||
| 96 | block2 = ufs_fragstoblks (frag3); | 96 | block2 = ufs_fragstoblks (frag3); |
| 97 | } | 97 | } |
| 98 | 98 | ||
| 99 | UFSD("frag1 %llu, frag2 %llu, block1 %llu, block2 %llu, frag3 %llu," | 99 | UFSD("ino %lu, frag1 %llu, frag2 %llu, block1 %llu, block2 %llu," |
| 100 | " frag4 %llu\n", | 100 | " frag3 %llu, frag4 %llu\n", inode->i_ino, |
| 101 | (unsigned long long)frag1, (unsigned long long)frag2, | 101 | (unsigned long long)frag1, (unsigned long long)frag2, |
| 102 | (unsigned long long)block1, (unsigned long long)block2, | 102 | (unsigned long long)block1, (unsigned long long)block2, |
| 103 | (unsigned long long)frag3, (unsigned long long)frag4); | 103 | (unsigned long long)frag3, (unsigned long long)frag4); |
| @@ -163,7 +163,7 @@ next1: | |||
| 163 | mark_inode_dirty(inode); | 163 | mark_inode_dirty(inode); |
| 164 | next3: | 164 | next3: |
| 165 | 165 | ||
| 166 | UFSD("EXIT\n"); | 166 | UFSD("EXIT: ino %lu\n", inode->i_ino); |
| 167 | return retry; | 167 | return retry; |
| 168 | } | 168 | } |
| 169 | 169 | ||
| @@ -248,7 +248,7 @@ static int ufs_trunc_indirect(struct inode *inode, u64 offset, void *p) | |||
| 248 | } | 248 | } |
| 249 | ubh_brelse (ind_ubh); | 249 | ubh_brelse (ind_ubh); |
| 250 | 250 | ||
| 251 | UFSD("EXIT\n"); | 251 | UFSD("EXIT: ino %lu\n", inode->i_ino); |
| 252 | 252 | ||
| 253 | return retry; | 253 | return retry; |
| 254 | } | 254 | } |
| @@ -262,7 +262,7 @@ static int ufs_trunc_dindirect(struct inode *inode, u64 offset, void *p) | |||
| 262 | void *dind; | 262 | void *dind; |
| 263 | int retry = 0; | 263 | int retry = 0; |
| 264 | 264 | ||
| 265 | UFSD("ENTER\n"); | 265 | UFSD("ENTER: ino %lu\n", inode->i_ino); |
| 266 | 266 | ||
| 267 | sb = inode->i_sb; | 267 | sb = inode->i_sb; |
| 268 | uspi = UFS_SB(sb)->s_uspi; | 268 | uspi = UFS_SB(sb)->s_uspi; |
| @@ -312,7 +312,7 @@ static int ufs_trunc_dindirect(struct inode *inode, u64 offset, void *p) | |||
| 312 | } | 312 | } |
| 313 | ubh_brelse (dind_bh); | 313 | ubh_brelse (dind_bh); |
| 314 | 314 | ||
| 315 | UFSD("EXIT\n"); | 315 | UFSD("EXIT: ino %lu\n", inode->i_ino); |
| 316 | 316 | ||
| 317 | return retry; | 317 | return retry; |
| 318 | } | 318 | } |
| @@ -327,7 +327,7 @@ static int ufs_trunc_tindirect(struct inode *inode) | |||
| 327 | void *tind, *p; | 327 | void *tind, *p; |
| 328 | int retry; | 328 | int retry; |
| 329 | 329 | ||
| 330 | UFSD("ENTER\n"); | 330 | UFSD("ENTER: ino %lu\n", inode->i_ino); |
| 331 | 331 | ||
| 332 | retry = 0; | 332 | retry = 0; |
| 333 | 333 | ||
| @@ -348,7 +348,7 @@ static int ufs_trunc_tindirect(struct inode *inode) | |||
| 348 | } | 348 | } |
| 349 | 349 | ||
| 350 | for (i = tindirect_block ; i < uspi->s_apb ; i++) { | 350 | for (i = tindirect_block ; i < uspi->s_apb ; i++) { |
| 351 | tind = ubh_get_addr32 (tind_bh, i); | 351 | tind = ubh_get_data_ptr(uspi, tind_bh, i); |
| 352 | retry |= ufs_trunc_dindirect(inode, UFS_NDADDR + | 352 | retry |= ufs_trunc_dindirect(inode, UFS_NDADDR + |
| 353 | uspi->s_apb + ((i + 1) << uspi->s_2apbshift), tind); | 353 | uspi->s_apb + ((i + 1) << uspi->s_2apbshift), tind); |
| 354 | ubh_mark_buffer_dirty(tind_bh); | 354 | ubh_mark_buffer_dirty(tind_bh); |
| @@ -372,19 +372,21 @@ static int ufs_trunc_tindirect(struct inode *inode) | |||
| 372 | } | 372 | } |
| 373 | ubh_brelse (tind_bh); | 373 | ubh_brelse (tind_bh); |
| 374 | 374 | ||
| 375 | UFSD("EXIT\n"); | 375 | UFSD("EXIT: ino %lu\n", inode->i_ino); |
| 376 | return retry; | 376 | return retry; |
| 377 | } | 377 | } |
| 378 | 378 | ||
| 379 | static int ufs_alloc_lastblock(struct inode *inode) | 379 | static int ufs_alloc_lastblock(struct inode *inode) |
| 380 | { | 380 | { |
| 381 | int err = 0; | 381 | int err = 0; |
| 382 | struct super_block *sb = inode->i_sb; | ||
| 382 | struct address_space *mapping = inode->i_mapping; | 383 | struct address_space *mapping = inode->i_mapping; |
| 383 | struct ufs_sb_private_info *uspi = UFS_SB(inode->i_sb)->s_uspi; | 384 | struct ufs_sb_private_info *uspi = UFS_SB(sb)->s_uspi; |
| 384 | unsigned i, end; | 385 | unsigned i, end; |
| 385 | sector_t lastfrag; | 386 | sector_t lastfrag; |
| 386 | struct page *lastpage; | 387 | struct page *lastpage; |
| 387 | struct buffer_head *bh; | 388 | struct buffer_head *bh; |
| 389 | u64 phys64; | ||
| 388 | 390 | ||
| 389 | lastfrag = (i_size_read(inode) + uspi->s_fsize - 1) >> uspi->s_fshift; | 391 | lastfrag = (i_size_read(inode) + uspi->s_fsize - 1) >> uspi->s_fshift; |
| 390 | 392 | ||
| @@ -424,6 +426,20 @@ static int ufs_alloc_lastblock(struct inode *inode) | |||
| 424 | set_page_dirty(lastpage); | 426 | set_page_dirty(lastpage); |
| 425 | } | 427 | } |
| 426 | 428 | ||
| 429 | if (lastfrag >= UFS_IND_FRAGMENT) { | ||
| 430 | end = uspi->s_fpb - ufs_fragnum(lastfrag) - 1; | ||
| 431 | phys64 = bh->b_blocknr + 1; | ||
| 432 | for (i = 0; i < end; ++i) { | ||
| 433 | bh = sb_getblk(sb, i + phys64); | ||
| 434 | lock_buffer(bh); | ||
| 435 | memset(bh->b_data, 0, sb->s_blocksize); | ||
| 436 | set_buffer_uptodate(bh); | ||
| 437 | mark_buffer_dirty(bh); | ||
| 438 | unlock_buffer(bh); | ||
| 439 | sync_dirty_buffer(bh); | ||
| 440 | brelse(bh); | ||
| 441 | } | ||
| 442 | } | ||
| 427 | out_unlock: | 443 | out_unlock: |
| 428 | ufs_put_locked_page(lastpage); | 444 | ufs_put_locked_page(lastpage); |
| 429 | out: | 445 | out: |
diff --git a/include/asm-arm/arch-at91/gpio.h b/include/asm-arm/arch-at91/gpio.h index 98ad2114f43a..0a241e2fb672 100644 --- a/include/asm-arm/arch-at91/gpio.h +++ b/include/asm-arm/arch-at91/gpio.h | |||
| @@ -223,7 +223,7 @@ static inline void gpio_free(unsigned gpio) | |||
| 223 | } | 223 | } |
| 224 | 224 | ||
| 225 | extern int gpio_direction_input(unsigned gpio); | 225 | extern int gpio_direction_input(unsigned gpio); |
| 226 | extern int gpio_direction_output(unsigned gpio); | 226 | extern int gpio_direction_output(unsigned gpio, int value); |
| 227 | 227 | ||
| 228 | static inline int gpio_get_value(unsigned gpio) | 228 | static inline int gpio_get_value(unsigned gpio) |
| 229 | { | 229 | { |
diff --git a/include/asm-arm/arch-omap/gpio.h b/include/asm-arm/arch-omap/gpio.h index 3762a6ae6a7f..590917efc94a 100644 --- a/include/asm-arm/arch-omap/gpio.h +++ b/include/asm-arm/arch-omap/gpio.h | |||
| @@ -113,8 +113,9 @@ static inline int gpio_direction_input(unsigned gpio) | |||
| 113 | return __gpio_set_direction(gpio, 1); | 113 | return __gpio_set_direction(gpio, 1); |
| 114 | } | 114 | } |
| 115 | 115 | ||
| 116 | static inline int gpio_direction_output(unsigned gpio) | 116 | static inline int gpio_direction_output(unsigned gpio, int value) |
| 117 | { | 117 | { |
| 118 | omap_set_gpio_dataout(gpio, value); | ||
| 118 | return __gpio_set_direction(gpio, 0); | 119 | return __gpio_set_direction(gpio, 0); |
| 119 | } | 120 | } |
| 120 | 121 | ||
diff --git a/include/asm-arm/arch-pxa/gpio.h b/include/asm-arm/arch-pxa/gpio.h index 3d348a351157..aeba24347f8e 100644 --- a/include/asm-arm/arch-pxa/gpio.h +++ b/include/asm-arm/arch-pxa/gpio.h | |||
| @@ -43,9 +43,9 @@ static inline int gpio_direction_input(unsigned gpio) | |||
| 43 | return pxa_gpio_mode(gpio | GPIO_IN); | 43 | return pxa_gpio_mode(gpio | GPIO_IN); |
| 44 | } | 44 | } |
| 45 | 45 | ||
| 46 | static inline int gpio_direction_output(unsigned gpio) | 46 | static inline int gpio_direction_output(unsigned gpio, int value) |
| 47 | { | 47 | { |
| 48 | return pxa_gpio_mode(gpio | GPIO_OUT); | 48 | return pxa_gpio_mode(gpio | GPIO_OUT | (value ? 0 : GPIO_DFLT_LOW)); |
| 49 | } | 49 | } |
| 50 | 50 | ||
| 51 | static inline int __gpio_get_value(unsigned gpio) | 51 | static inline int __gpio_get_value(unsigned gpio) |
diff --git a/include/asm-arm/arch-s3c2410/gpio.h b/include/asm-arm/arch-s3c2410/gpio.h index d47ae453f8ca..7583895fd336 100644 --- a/include/asm-arm/arch-s3c2410/gpio.h +++ b/include/asm-arm/arch-s3c2410/gpio.h | |||
| @@ -44,9 +44,11 @@ static inline int gpio_direction_input(unsigned gpio) | |||
| 44 | return 0; | 44 | return 0; |
| 45 | } | 45 | } |
| 46 | 46 | ||
| 47 | static inline int gpio_direction_output(unsigned gpio) | 47 | static inline int gpio_direction_output(unsigned gpio, int value) |
| 48 | { | 48 | { |
| 49 | s3c2410_gpio_cfgpin(gpio, S3C2410_GPIO_OUTPUT); | 49 | s3c2410_gpio_cfgpin(gpio, S3C2410_GPIO_OUTPUT); |
| 50 | /* REVISIT can we write the value first, to avoid glitching? */ | ||
| 51 | s3c2410_gpio_setpin(gpio, value); | ||
| 50 | return 0; | 52 | return 0; |
| 51 | } | 53 | } |
| 52 | 54 | ||
diff --git a/include/asm-arm/arch-sa1100/gpio.h b/include/asm-arm/arch-sa1100/gpio.h index da7575b0e5d0..e7a9d26e22a8 100644 --- a/include/asm-arm/arch-sa1100/gpio.h +++ b/include/asm-arm/arch-sa1100/gpio.h | |||
| @@ -38,7 +38,7 @@ static inline void gpio_free(unsigned gpio) | |||
| 38 | } | 38 | } |
| 39 | 39 | ||
| 40 | extern int gpio_direction_input(unsigned gpio); | 40 | extern int gpio_direction_input(unsigned gpio); |
| 41 | extern int gpio_direction_output(unsigned gpio); | 41 | extern int gpio_direction_output(unsigned gpio, int value); |
| 42 | 42 | ||
| 43 | 43 | ||
| 44 | static inline int gpio_get_value(unsigned gpio) | 44 | static inline int gpio_get_value(unsigned gpio) |
diff --git a/include/asm-avr32/arch-at32ap/gpio.h b/include/asm-avr32/arch-at32ap/gpio.h index fcb756bdaa8e..80a21aa9ae77 100644 --- a/include/asm-avr32/arch-at32ap/gpio.h +++ b/include/asm-avr32/arch-at32ap/gpio.h | |||
| @@ -10,7 +10,7 @@ int __must_check gpio_request(unsigned int gpio, const char *label); | |||
| 10 | void gpio_free(unsigned int gpio); | 10 | void gpio_free(unsigned int gpio); |
| 11 | 11 | ||
| 12 | int gpio_direction_input(unsigned int gpio); | 12 | int gpio_direction_input(unsigned int gpio); |
| 13 | int gpio_direction_output(unsigned int gpio); | 13 | int gpio_direction_output(unsigned int gpio, int value); |
| 14 | int gpio_get_value(unsigned int gpio); | 14 | int gpio_get_value(unsigned int gpio); |
| 15 | void gpio_set_value(unsigned int gpio, int value); | 15 | void gpio_set_value(unsigned int gpio, int value); |
| 16 | 16 | ||
diff --git a/include/asm-i386/nmi.h b/include/asm-i386/nmi.h index 64544cb85d6a..b04333ea6f31 100644 --- a/include/asm-i386/nmi.h +++ b/include/asm-i386/nmi.h | |||
| @@ -33,7 +33,7 @@ extern int nmi_watchdog_tick (struct pt_regs * regs, unsigned reason); | |||
| 33 | 33 | ||
| 34 | extern atomic_t nmi_active; | 34 | extern atomic_t nmi_active; |
| 35 | extern unsigned int nmi_watchdog; | 35 | extern unsigned int nmi_watchdog; |
| 36 | #define NMI_DEFAULT 0 | 36 | #define NMI_DEFAULT -1 |
| 37 | #define NMI_NONE 0 | 37 | #define NMI_NONE 0 |
| 38 | #define NMI_IO_APIC 1 | 38 | #define NMI_IO_APIC 1 |
| 39 | #define NMI_LOCAL_APIC 2 | 39 | #define NMI_LOCAL_APIC 2 |
diff --git a/include/asm-i386/paravirt.h b/include/asm-i386/paravirt.h index f8319cae2ac5..46dc34ca887a 100644 --- a/include/asm-i386/paravirt.h +++ b/include/asm-i386/paravirt.h | |||
| @@ -130,7 +130,7 @@ struct paravirt_ops | |||
| 130 | void (*flush_tlb_kernel)(void); | 130 | void (*flush_tlb_kernel)(void); |
| 131 | void (*flush_tlb_single)(u32 addr); | 131 | void (*flush_tlb_single)(u32 addr); |
| 132 | 132 | ||
| 133 | void (fastcall *map_pt_hook)(int type, pte_t *va, u32 pfn); | 133 | void (*map_pt_hook)(int type, pte_t *va, u32 pfn); |
| 134 | 134 | ||
| 135 | void (*alloc_pt)(u32 pfn); | 135 | void (*alloc_pt)(u32 pfn); |
| 136 | void (*alloc_pd)(u32 pfn); | 136 | void (*alloc_pd)(u32 pfn); |
diff --git a/include/asm-i386/sync_bitops.h b/include/asm-i386/sync_bitops.h index c94d51c993ee..7d72351bea75 100644 --- a/include/asm-i386/sync_bitops.h +++ b/include/asm-i386/sync_bitops.h | |||
| @@ -130,7 +130,7 @@ static inline int sync_test_and_change_bit(int nr, volatile unsigned long* addr) | |||
| 130 | return oldbit; | 130 | return oldbit; |
| 131 | } | 131 | } |
| 132 | 132 | ||
| 133 | static __always_inline int sync_const_test_bit(int nr, const volatile unsigned long *addr) | 133 | static __always_inline int sync_constant_test_bit(int nr, const volatile unsigned long *addr) |
| 134 | { | 134 | { |
| 135 | return ((1UL << (nr & 31)) & | 135 | return ((1UL << (nr & 31)) & |
| 136 | (((const volatile unsigned int *)addr)[nr >> 5])) != 0; | 136 | (((const volatile unsigned int *)addr)[nr >> 5])) != 0; |
diff --git a/include/asm-m32r/dma-mapping.h b/include/asm-m32r/dma-mapping.h index a7fa0302bda7..f9b58ebba361 100644 --- a/include/asm-m32r/dma-mapping.h +++ b/include/asm-m32r/dma-mapping.h | |||
| @@ -1,23 +1,6 @@ | |||
| 1 | #ifndef _ASM_M32R_DMA_MAPPING_H | 1 | #ifndef _ASM_M32R_DMA_MAPPING_H |
| 2 | #define _ASM_M32R_DMA_MAPPING_H | 2 | #define _ASM_M32R_DMA_MAPPING_H |
| 3 | 3 | ||
| 4 | /* | 4 | #include <asm-generic/dma-mapping-broken.h> |
| 5 | * NOTE: Do not include <asm-generic/dma-mapping.h> | ||
| 6 | * Because it requires PCI stuffs, but current M32R don't provide these. | ||
| 7 | */ | ||
| 8 | |||
| 9 | static inline void * | ||
| 10 | dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle, | ||
| 11 | gfp_t flag) | ||
| 12 | { | ||
| 13 | return (void *)NULL; | ||
| 14 | } | ||
| 15 | |||
| 16 | static inline void | ||
| 17 | dma_free_coherent(struct device *dev, size_t size, void *cpu_addr, | ||
| 18 | dma_addr_t dma_handle) | ||
| 19 | { | ||
| 20 | return; | ||
| 21 | } | ||
| 22 | 5 | ||
| 23 | #endif /* _ASM_M32R_DMA_MAPPING_H */ | 6 | #endif /* _ASM_M32R_DMA_MAPPING_H */ |
diff --git a/include/asm-m68k/dma-mapping.h b/include/asm-m68k/dma-mapping.h index 00259ed6fc95..a26cdeb46a57 100644 --- a/include/asm-m68k/dma-mapping.h +++ b/include/asm-m68k/dma-mapping.h | |||
| @@ -32,7 +32,7 @@ extern void dma_free_coherent(struct device *, size_t, | |||
| 32 | void *, dma_addr_t); | 32 | void *, dma_addr_t); |
| 33 | 33 | ||
| 34 | static inline void *dma_alloc_noncoherent(struct device *dev, size_t size, | 34 | static inline void *dma_alloc_noncoherent(struct device *dev, size_t size, |
| 35 | dma_addr_t *handle, int flag) | 35 | dma_addr_t *handle, gfp_t flag) |
| 36 | { | 36 | { |
| 37 | return dma_alloc_coherent(dev, size, handle, flag); | 37 | return dma_alloc_coherent(dev, size, handle, flag); |
| 38 | } | 38 | } |
diff --git a/include/asm-m68k/mc146818rtc.h b/include/asm-m68k/mc146818rtc.h index 11fe12ddb913..9f70a01f73dc 100644 --- a/include/asm-m68k/mc146818rtc.h +++ b/include/asm-m68k/mc146818rtc.h | |||
| @@ -11,6 +11,7 @@ | |||
| 11 | #include <asm/atarihw.h> | 11 | #include <asm/atarihw.h> |
| 12 | 12 | ||
| 13 | #define RTC_PORT(x) (TT_RTC_BAS + 2*(x)) | 13 | #define RTC_PORT(x) (TT_RTC_BAS + 2*(x)) |
| 14 | #define RTC_ALWAYS_BCD 0 | ||
| 14 | 15 | ||
| 15 | #define CMOS_READ(addr) ({ \ | 16 | #define CMOS_READ(addr) ({ \ |
| 16 | atari_outb_p((addr),RTC_PORT(0)); \ | 17 | atari_outb_p((addr),RTC_PORT(0)); \ |
diff --git a/include/asm-mips/atomic.h b/include/asm-mips/atomic.h index 8578869a8bcf..1ac50b6c47ad 100644 --- a/include/asm-mips/atomic.h +++ b/include/asm-mips/atomic.h | |||
| @@ -79,9 +79,9 @@ static __inline__ void atomic_add(int i, atomic_t * v) | |||
| 79 | } else { | 79 | } else { |
| 80 | unsigned long flags; | 80 | unsigned long flags; |
| 81 | 81 | ||
| 82 | local_irq_save(flags); | 82 | raw_local_irq_save(flags); |
| 83 | v->counter += i; | 83 | v->counter += i; |
| 84 | local_irq_restore(flags); | 84 | raw_local_irq_restore(flags); |
| 85 | } | 85 | } |
| 86 | } | 86 | } |
| 87 | 87 | ||
| @@ -124,9 +124,9 @@ static __inline__ void atomic_sub(int i, atomic_t * v) | |||
| 124 | } else { | 124 | } else { |
| 125 | unsigned long flags; | 125 | unsigned long flags; |
| 126 | 126 | ||
| 127 | local_irq_save(flags); | 127 | raw_local_irq_save(flags); |
| 128 | v->counter -= i; | 128 | v->counter -= i; |
| 129 | local_irq_restore(flags); | 129 | raw_local_irq_restore(flags); |
| 130 | } | 130 | } |
| 131 | } | 131 | } |
| 132 | 132 | ||
| @@ -173,11 +173,11 @@ static __inline__ int atomic_add_return(int i, atomic_t * v) | |||
| 173 | } else { | 173 | } else { |
| 174 | unsigned long flags; | 174 | unsigned long flags; |
| 175 | 175 | ||
| 176 | local_irq_save(flags); | 176 | raw_local_irq_save(flags); |
| 177 | result = v->counter; | 177 | result = v->counter; |
| 178 | result += i; | 178 | result += i; |
| 179 | v->counter = result; | 179 | v->counter = result; |
| 180 | local_irq_restore(flags); | 180 | raw_local_irq_restore(flags); |
| 181 | } | 181 | } |
| 182 | 182 | ||
| 183 | smp_mb(); | 183 | smp_mb(); |
| @@ -225,11 +225,11 @@ static __inline__ int atomic_sub_return(int i, atomic_t * v) | |||
| 225 | } else { | 225 | } else { |
| 226 | unsigned long flags; | 226 | unsigned long flags; |
| 227 | 227 | ||
| 228 | local_irq_save(flags); | 228 | raw_local_irq_save(flags); |
| 229 | result = v->counter; | 229 | result = v->counter; |
| 230 | result -= i; | 230 | result -= i; |
| 231 | v->counter = result; | 231 | v->counter = result; |
| 232 | local_irq_restore(flags); | 232 | raw_local_irq_restore(flags); |
| 233 | } | 233 | } |
| 234 | 234 | ||
| 235 | smp_mb(); | 235 | smp_mb(); |
| @@ -293,12 +293,12 @@ static __inline__ int atomic_sub_if_positive(int i, atomic_t * v) | |||
| 293 | } else { | 293 | } else { |
| 294 | unsigned long flags; | 294 | unsigned long flags; |
| 295 | 295 | ||
| 296 | local_irq_save(flags); | 296 | raw_local_irq_save(flags); |
| 297 | result = v->counter; | 297 | result = v->counter; |
| 298 | result -= i; | 298 | result -= i; |
| 299 | if (result >= 0) | 299 | if (result >= 0) |
| 300 | v->counter = result; | 300 | v->counter = result; |
| 301 | local_irq_restore(flags); | 301 | raw_local_irq_restore(flags); |
| 302 | } | 302 | } |
| 303 | 303 | ||
| 304 | smp_mb(); | 304 | smp_mb(); |
| @@ -454,9 +454,9 @@ static __inline__ void atomic64_add(long i, atomic64_t * v) | |||
| 454 | } else { | 454 | } else { |
| 455 | unsigned long flags; | 455 | unsigned long flags; |
| 456 | 456 | ||
| 457 | local_irq_save(flags); | 457 | raw_local_irq_save(flags); |
| 458 | v->counter += i; | 458 | v->counter += i; |
| 459 | local_irq_restore(flags); | 459 | raw_local_irq_restore(flags); |
| 460 | } | 460 | } |
| 461 | } | 461 | } |
| 462 | 462 | ||
| @@ -499,9 +499,9 @@ static __inline__ void atomic64_sub(long i, atomic64_t * v) | |||
| 499 | } else { | 499 | } else { |
| 500 | unsigned long flags; | 500 | unsigned long flags; |
| 501 | 501 | ||
| 502 | local_irq_save(flags); | 502 | raw_local_irq_save(flags); |
| 503 | v->counter -= i; | 503 | v->counter -= i; |
| 504 | local_irq_restore(flags); | 504 | raw_local_irq_restore(flags); |
| 505 | } | 505 | } |
| 506 | } | 506 | } |
| 507 | 507 | ||
| @@ -548,11 +548,11 @@ static __inline__ long atomic64_add_return(long i, atomic64_t * v) | |||
| 548 | } else { | 548 | } else { |
| 549 | unsigned long flags; | 549 | unsigned long flags; |
| 550 | 550 | ||
| 551 | local_irq_save(flags); | 551 | raw_local_irq_save(flags); |
| 552 | result = v->counter; | 552 | result = v->counter; |
| 553 | result += i; | 553 | result += i; |
| 554 | v->counter = result; | 554 | v->counter = result; |
| 555 | local_irq_restore(flags); | 555 | raw_local_irq_restore(flags); |
| 556 | } | 556 | } |
| 557 | 557 | ||
| 558 | smp_mb(); | 558 | smp_mb(); |
| @@ -600,11 +600,11 @@ static __inline__ long atomic64_sub_return(long i, atomic64_t * v) | |||
| 600 | } else { | 600 | } else { |
| 601 | unsigned long flags; | 601 | unsigned long flags; |
| 602 | 602 | ||
| 603 | local_irq_save(flags); | 603 | raw_local_irq_save(flags); |
| 604 | result = v->counter; | 604 | result = v->counter; |
| 605 | result -= i; | 605 | result -= i; |
| 606 | v->counter = result; | 606 | v->counter = result; |
| 607 | local_irq_restore(flags); | 607 | raw_local_irq_restore(flags); |
| 608 | } | 608 | } |
| 609 | 609 | ||
| 610 | smp_mb(); | 610 | smp_mb(); |
| @@ -668,12 +668,12 @@ static __inline__ long atomic64_sub_if_positive(long i, atomic64_t * v) | |||
| 668 | } else { | 668 | } else { |
| 669 | unsigned long flags; | 669 | unsigned long flags; |
| 670 | 670 | ||
| 671 | local_irq_save(flags); | 671 | raw_local_irq_save(flags); |
| 672 | result = v->counter; | 672 | result = v->counter; |
| 673 | result -= i; | 673 | result -= i; |
| 674 | if (result >= 0) | 674 | if (result >= 0) |
| 675 | v->counter = result; | 675 | v->counter = result; |
| 676 | local_irq_restore(flags); | 676 | raw_local_irq_restore(flags); |
| 677 | } | 677 | } |
| 678 | 678 | ||
| 679 | smp_mb(); | 679 | smp_mb(); |
diff --git a/include/asm-mips/bitops.h b/include/asm-mips/bitops.h index 8959da245cfb..d995413e11fd 100644 --- a/include/asm-mips/bitops.h +++ b/include/asm-mips/bitops.h | |||
| @@ -100,9 +100,9 @@ static inline void set_bit(unsigned long nr, volatile unsigned long *addr) | |||
| 100 | 100 | ||
| 101 | a += nr >> SZLONG_LOG; | 101 | a += nr >> SZLONG_LOG; |
| 102 | mask = 1UL << bit; | 102 | mask = 1UL << bit; |
| 103 | local_irq_save(flags); | 103 | raw_local_irq_save(flags); |
| 104 | *a |= mask; | 104 | *a |= mask; |
| 105 | local_irq_restore(flags); | 105 | raw_local_irq_restore(flags); |
| 106 | } | 106 | } |
| 107 | } | 107 | } |
| 108 | 108 | ||
| @@ -165,9 +165,9 @@ static inline void clear_bit(unsigned long nr, volatile unsigned long *addr) | |||
| 165 | 165 | ||
| 166 | a += nr >> SZLONG_LOG; | 166 | a += nr >> SZLONG_LOG; |
| 167 | mask = 1UL << bit; | 167 | mask = 1UL << bit; |
| 168 | local_irq_save(flags); | 168 | raw_local_irq_save(flags); |
| 169 | *a &= ~mask; | 169 | *a &= ~mask; |
| 170 | local_irq_restore(flags); | 170 | raw_local_irq_restore(flags); |
| 171 | } | 171 | } |
| 172 | } | 172 | } |
| 173 | 173 | ||
| @@ -220,9 +220,9 @@ static inline void change_bit(unsigned long nr, volatile unsigned long *addr) | |||
| 220 | 220 | ||
| 221 | a += nr >> SZLONG_LOG; | 221 | a += nr >> SZLONG_LOG; |
| 222 | mask = 1UL << bit; | 222 | mask = 1UL << bit; |
| 223 | local_irq_save(flags); | 223 | raw_local_irq_save(flags); |
| 224 | *a ^= mask; | 224 | *a ^= mask; |
| 225 | local_irq_restore(flags); | 225 | raw_local_irq_restore(flags); |
| 226 | } | 226 | } |
| 227 | } | 227 | } |
| 228 | 228 | ||
| @@ -287,10 +287,10 @@ static inline int test_and_set_bit(unsigned long nr, | |||
| 287 | 287 | ||
| 288 | a += nr >> SZLONG_LOG; | 288 | a += nr >> SZLONG_LOG; |
| 289 | mask = 1UL << bit; | 289 | mask = 1UL << bit; |
| 290 | local_irq_save(flags); | 290 | raw_local_irq_save(flags); |
| 291 | retval = (mask & *a) != 0; | 291 | retval = (mask & *a) != 0; |
| 292 | *a |= mask; | 292 | *a |= mask; |
| 293 | local_irq_restore(flags); | 293 | raw_local_irq_restore(flags); |
| 294 | 294 | ||
| 295 | return retval; | 295 | return retval; |
| 296 | } | 296 | } |
| @@ -381,10 +381,10 @@ static inline int test_and_clear_bit(unsigned long nr, | |||
| 381 | 381 | ||
| 382 | a += nr >> SZLONG_LOG; | 382 | a += nr >> SZLONG_LOG; |
| 383 | mask = 1UL << bit; | 383 | mask = 1UL << bit; |
| 384 | local_irq_save(flags); | 384 | raw_local_irq_save(flags); |
| 385 | retval = (mask & *a) != 0; | 385 | retval = (mask & *a) != 0; |
| 386 | *a &= ~mask; | 386 | *a &= ~mask; |
| 387 | local_irq_restore(flags); | 387 | raw_local_irq_restore(flags); |
| 388 | 388 | ||
| 389 | return retval; | 389 | return retval; |
| 390 | } | 390 | } |
| @@ -452,10 +452,10 @@ static inline int test_and_change_bit(unsigned long nr, | |||
| 452 | 452 | ||
| 453 | a += nr >> SZLONG_LOG; | 453 | a += nr >> SZLONG_LOG; |
| 454 | mask = 1UL << bit; | 454 | mask = 1UL << bit; |
| 455 | local_irq_save(flags); | 455 | raw_local_irq_save(flags); |
| 456 | retval = (mask & *a) != 0; | 456 | retval = (mask & *a) != 0; |
| 457 | *a ^= mask; | 457 | *a ^= mask; |
| 458 | local_irq_restore(flags); | 458 | raw_local_irq_restore(flags); |
| 459 | 459 | ||
| 460 | return retval; | 460 | return retval; |
| 461 | } | 461 | } |
diff --git a/include/asm-mips/cpu-features.h b/include/asm-mips/cpu-features.h index eadca266f159..5e4bed123b48 100644 --- a/include/asm-mips/cpu-features.h +++ b/include/asm-mips/cpu-features.h | |||
| @@ -40,6 +40,9 @@ | |||
| 40 | #endif | 40 | #endif |
| 41 | #ifndef cpu_has_fpu | 41 | #ifndef cpu_has_fpu |
| 42 | #define cpu_has_fpu (current_cpu_data.options & MIPS_CPU_FPU) | 42 | #define cpu_has_fpu (current_cpu_data.options & MIPS_CPU_FPU) |
| 43 | #define raw_cpu_has_fpu (raw_current_cpu_data.options & MIPS_CPU_FPU) | ||
| 44 | #else | ||
| 45 | #define raw_cpu_has_fpu cpu_has_fpu | ||
| 43 | #endif | 46 | #endif |
| 44 | #ifndef cpu_has_32fpr | 47 | #ifndef cpu_has_32fpr |
| 45 | #define cpu_has_32fpr (cpu_data[0].options & MIPS_CPU_32FPR) | 48 | #define cpu_has_32fpr (cpu_data[0].options & MIPS_CPU_32FPR) |
diff --git a/include/asm-mips/cpu-info.h b/include/asm-mips/cpu-info.h index 610d0cdeaa9e..22fe8453fcc7 100644 --- a/include/asm-mips/cpu-info.h +++ b/include/asm-mips/cpu-info.h | |||
| @@ -87,6 +87,7 @@ struct cpuinfo_mips { | |||
| 87 | 87 | ||
| 88 | extern struct cpuinfo_mips cpu_data[]; | 88 | extern struct cpuinfo_mips cpu_data[]; |
| 89 | #define current_cpu_data cpu_data[smp_processor_id()] | 89 | #define current_cpu_data cpu_data[smp_processor_id()] |
| 90 | #define raw_current_cpu_data cpu_data[raw_smp_processor_id()] | ||
| 90 | 91 | ||
| 91 | extern void cpu_probe(void); | 92 | extern void cpu_probe(void); |
| 92 | extern void cpu_report(void); | 93 | extern void cpu_report(void); |
diff --git a/include/asm-mips/fpu.h b/include/asm-mips/fpu.h index efef843b93f0..4e12d1f9534f 100644 --- a/include/asm-mips/fpu.h +++ b/include/asm-mips/fpu.h | |||
| @@ -27,11 +27,11 @@ | |||
| 27 | struct sigcontext; | 27 | struct sigcontext; |
| 28 | struct sigcontext32; | 28 | struct sigcontext32; |
| 29 | 29 | ||
| 30 | extern asmlinkage int (*save_fp_context)(struct sigcontext *sc); | 30 | extern asmlinkage int (*save_fp_context)(struct sigcontext __user *sc); |
| 31 | extern asmlinkage int (*restore_fp_context)(struct sigcontext *sc); | 31 | extern asmlinkage int (*restore_fp_context)(struct sigcontext __user *sc); |
| 32 | 32 | ||
| 33 | extern asmlinkage int (*save_fp_context32)(struct sigcontext32 *sc); | 33 | extern asmlinkage int (*save_fp_context32)(struct sigcontext32 __user *sc); |
| 34 | extern asmlinkage int (*restore_fp_context32)(struct sigcontext32 *sc); | 34 | extern asmlinkage int (*restore_fp_context32)(struct sigcontext32 __user *sc); |
| 35 | 35 | ||
| 36 | extern void fpu_emulator_init_fpu(void); | 36 | extern void fpu_emulator_init_fpu(void); |
| 37 | extern void _init_fpu(void); | 37 | extern void _init_fpu(void); |
| @@ -68,6 +68,8 @@ do { \ | |||
| 68 | /* We don't care about the c0 hazard here */ \ | 68 | /* We don't care about the c0 hazard here */ \ |
| 69 | } while (0) | 69 | } while (0) |
| 70 | 70 | ||
| 71 | #define __fpu_enabled() (read_c0_status() & ST0_CU1) | ||
| 72 | |||
| 71 | #define enable_fpu() \ | 73 | #define enable_fpu() \ |
| 72 | do { \ | 74 | do { \ |
| 73 | if (cpu_has_fpu) \ | 75 | if (cpu_has_fpu) \ |
| @@ -93,31 +95,47 @@ static inline int is_fpu_owner(void) | |||
| 93 | return cpu_has_fpu && __is_fpu_owner(); | 95 | return cpu_has_fpu && __is_fpu_owner(); |
| 94 | } | 96 | } |
| 95 | 97 | ||
| 96 | static inline void own_fpu(void) | 98 | static inline void __own_fpu(void) |
| 97 | { | 99 | { |
| 98 | if (cpu_has_fpu) { | 100 | __enable_fpu(); |
| 99 | __enable_fpu(); | 101 | KSTK_STATUS(current) |= ST0_CU1; |
| 100 | KSTK_STATUS(current) |= ST0_CU1; | 102 | set_thread_flag(TIF_USEDFPU); |
| 101 | set_thread_flag(TIF_USEDFPU); | 103 | } |
| 104 | |||
| 105 | static inline void own_fpu(int restore) | ||
| 106 | { | ||
| 107 | preempt_disable(); | ||
| 108 | if (cpu_has_fpu && !__is_fpu_owner()) { | ||
| 109 | __own_fpu(); | ||
| 110 | if (restore) | ||
| 111 | _restore_fp(current); | ||
| 102 | } | 112 | } |
| 113 | preempt_enable(); | ||
| 103 | } | 114 | } |
| 104 | 115 | ||
| 105 | static inline void lose_fpu(void) | 116 | static inline void lose_fpu(int save) |
| 106 | { | 117 | { |
| 107 | if (cpu_has_fpu) { | 118 | preempt_disable(); |
| 119 | if (is_fpu_owner()) { | ||
| 120 | if (save) | ||
| 121 | _save_fp(current); | ||
| 108 | KSTK_STATUS(current) &= ~ST0_CU1; | 122 | KSTK_STATUS(current) &= ~ST0_CU1; |
| 109 | clear_thread_flag(TIF_USEDFPU); | 123 | clear_thread_flag(TIF_USEDFPU); |
| 110 | __disable_fpu(); | 124 | __disable_fpu(); |
| 111 | } | 125 | } |
| 126 | preempt_enable(); | ||
| 112 | } | 127 | } |
| 113 | 128 | ||
| 114 | static inline void init_fpu(void) | 129 | static inline void init_fpu(void) |
| 115 | { | 130 | { |
| 131 | preempt_disable(); | ||
| 116 | if (cpu_has_fpu) { | 132 | if (cpu_has_fpu) { |
| 133 | __own_fpu(); | ||
| 117 | _init_fpu(); | 134 | _init_fpu(); |
| 118 | } else { | 135 | } else { |
| 119 | fpu_emulator_init_fpu(); | 136 | fpu_emulator_init_fpu(); |
| 120 | } | 137 | } |
| 138 | preempt_enable(); | ||
| 121 | } | 139 | } |
| 122 | 140 | ||
| 123 | static inline void save_fp(struct task_struct *tsk) | 141 | static inline void save_fp(struct task_struct *tsk) |
| @@ -144,4 +162,18 @@ static inline fpureg_t *get_fpu_regs(struct task_struct *tsk) | |||
| 144 | return tsk->thread.fpu.fpr; | 162 | return tsk->thread.fpu.fpr; |
| 145 | } | 163 | } |
| 146 | 164 | ||
| 165 | static inline void enable_fp_in_kernel(void) | ||
| 166 | { | ||
| 167 | set_thread_flag(TIF_ALLOW_FP_IN_KERNEL); | ||
| 168 | /* make sure CU1 and FPU ownership are consistent */ | ||
| 169 | if (!__is_fpu_owner() && __fpu_enabled()) | ||
| 170 | __disable_fpu(); | ||
| 171 | } | ||
| 172 | |||
| 173 | static inline void disable_fp_in_kernel(void) | ||
| 174 | { | ||
| 175 | BUG_ON(!__is_fpu_owner() && __fpu_enabled()); | ||
| 176 | clear_thread_flag(TIF_ALLOW_FP_IN_KERNEL); | ||
| 177 | } | ||
| 178 | |||
| 147 | #endif /* _ASM_FPU_H */ | 179 | #endif /* _ASM_FPU_H */ |
diff --git a/include/asm-mips/mach-au1x00/au1xxx_ide.h b/include/asm-mips/mach-au1x00/au1xxx_ide.h index e9fa252f8a3f..8fcae21adbd5 100644 --- a/include/asm-mips/mach-au1x00/au1xxx_ide.h +++ b/include/asm-mips/mach-au1x00/au1xxx_ide.h | |||
| @@ -141,40 +141,6 @@ static int auide_ddma_init( _auide_hwif *auide ); | |||
| 141 | static void auide_setup_ports(hw_regs_t *hw, _auide_hwif *ahwif); | 141 | static void auide_setup_ports(hw_regs_t *hw, _auide_hwif *ahwif); |
| 142 | int __init auide_probe(void); | 142 | int __init auide_probe(void); |
| 143 | 143 | ||
| 144 | #ifdef CONFIG_PM | ||
| 145 | int au1200ide_pm_callback( au1xxx_power_dev_t *dev, | ||
| 146 | au1xxx_request_t request, void *data); | ||
| 147 | static int au1xxxide_pm_standby( au1xxx_power_dev_t *dev ); | ||
| 148 | static int au1xxxide_pm_sleep( au1xxx_power_dev_t *dev ); | ||
| 149 | static int au1xxxide_pm_resume( au1xxx_power_dev_t *dev ); | ||
| 150 | static int au1xxxide_pm_getstatus( au1xxx_power_dev_t *dev ); | ||
| 151 | static int au1xxxide_pm_access( au1xxx_power_dev_t *dev ); | ||
| 152 | static int au1xxxide_pm_idle( au1xxx_power_dev_t *dev ); | ||
| 153 | static int au1xxxide_pm_cleanup( au1xxx_power_dev_t *dev ); | ||
| 154 | #endif | ||
| 155 | |||
| 156 | |||
| 157 | /* | ||
| 158 | * Multi-Word DMA + DbDMA functions | ||
| 159 | */ | ||
| 160 | #ifdef CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA | ||
| 161 | static int auide_build_sglist(ide_drive_t *drive, struct request *rq); | ||
| 162 | static int auide_build_dmatable(ide_drive_t *drive); | ||
| 163 | static int auide_dma_end(ide_drive_t *drive); | ||
| 164 | ide_startstop_t auide_dma_intr (ide_drive_t *drive); | ||
| 165 | static void auide_dma_exec_cmd(ide_drive_t *drive, u8 command); | ||
| 166 | static int auide_dma_setup(ide_drive_t *drive); | ||
| 167 | static int auide_dma_check(ide_drive_t *drive); | ||
| 168 | static int auide_dma_test_irq(ide_drive_t *drive); | ||
| 169 | static int auide_dma_host_off(ide_drive_t *drive); | ||
| 170 | static int auide_dma_host_on(ide_drive_t *drive); | ||
| 171 | static int auide_dma_lostirq(ide_drive_t *drive); | ||
| 172 | static int auide_dma_on(ide_drive_t *drive); | ||
| 173 | static void auide_ddma_tx_callback(int irq, void *param); | ||
| 174 | static void auide_ddma_rx_callback(int irq, void *param); | ||
| 175 | static int auide_dma_off_quietly(ide_drive_t *drive); | ||
| 176 | #endif /* end CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA */ | ||
| 177 | |||
| 178 | /******************************************************************************* | 144 | /******************************************************************************* |
| 179 | * PIO Mode timing calculation : * | 145 | * PIO Mode timing calculation : * |
| 180 | * * | 146 | * * |
diff --git a/include/asm-mips/mach-ip27/dma-coherence.h b/include/asm-mips/mach-ip27/dma-coherence.h index 659816e200d4..3fdbbf68e952 100644 --- a/include/asm-mips/mach-ip27/dma-coherence.h +++ b/include/asm-mips/mach-ip27/dma-coherence.h | |||
| @@ -18,7 +18,8 @@ | |||
| 18 | 18 | ||
| 19 | struct device; | 19 | struct device; |
| 20 | 20 | ||
| 21 | static dma_addr_t plat_map_dma_mem(struct device *dev, void *addr, size_t size) | 21 | static inline dma_addr_t plat_map_dma_mem(struct device *dev, void *addr, |
| 22 | size_t size) | ||
| 22 | { | 23 | { |
| 23 | dma_addr_t pa = dev_to_baddr(dev, virt_to_phys(addr)); | 24 | dma_addr_t pa = dev_to_baddr(dev, virt_to_phys(addr)); |
| 24 | 25 | ||
| @@ -37,7 +38,7 @@ static unsigned long plat_dma_addr_to_phys(dma_addr_t dma_addr) | |||
| 37 | return dma_addr & (0xffUL << 56); | 38 | return dma_addr & (0xffUL << 56); |
| 38 | } | 39 | } |
| 39 | 40 | ||
| 40 | static void plat_unmap_dma_mem(dma_addr_t dma_addr) | 41 | static inline void plat_unmap_dma_mem(dma_addr_t dma_addr) |
| 41 | { | 42 | { |
| 42 | } | 43 | } |
| 43 | 44 | ||
diff --git a/include/asm-mips/mach-ip32/dma-coherence.h b/include/asm-mips/mach-ip32/dma-coherence.h index 950be17bbb86..c3f9a6a20eb0 100644 --- a/include/asm-mips/mach-ip32/dma-coherence.h +++ b/include/asm-mips/mach-ip32/dma-coherence.h | |||
| @@ -26,7 +26,8 @@ struct device; | |||
| 26 | 26 | ||
| 27 | #define RAM_OFFSET_MASK 0x3fffffffUL | 27 | #define RAM_OFFSET_MASK 0x3fffffffUL |
| 28 | 28 | ||
| 29 | static dma_addr_t plat_map_dma_mem(struct device *dev, void *addr, size_t size) | 29 | static inline dma_addr_t plat_map_dma_mem(struct device *dev, void *addr, |
| 30 | size_t size) | ||
| 30 | { | 31 | { |
| 31 | dma_addr_t pa = virt_to_phys(addr) & RAM_OFFSET_MASK; | 32 | dma_addr_t pa = virt_to_phys(addr) & RAM_OFFSET_MASK; |
| 32 | 33 | ||
| @@ -59,7 +60,7 @@ static unsigned long plat_dma_addr_to_phys(dma_addr_t dma_addr) | |||
| 59 | return addr; | 60 | return addr; |
| 60 | } | 61 | } |
| 61 | 62 | ||
| 62 | static void plat_unmap_dma_mem(dma_addr_t dma_addr) | 63 | static inline void plat_unmap_dma_mem(dma_addr_t dma_addr) |
| 63 | { | 64 | { |
| 64 | } | 65 | } |
| 65 | 66 | ||
diff --git a/include/asm-mips/rtlx.h b/include/asm-mips/rtlx.h index 59162f74a798..65778c890a62 100644 --- a/include/asm-mips/rtlx.h +++ b/include/asm-mips/rtlx.h | |||
| @@ -23,8 +23,8 @@ | |||
| 23 | 23 | ||
| 24 | extern int rtlx_open(int index, int can_sleep); | 24 | extern int rtlx_open(int index, int can_sleep); |
| 25 | extern int rtlx_release(int index); | 25 | extern int rtlx_release(int index); |
| 26 | extern ssize_t rtlx_read(int index, void *buff, size_t count, int user); | 26 | extern ssize_t rtlx_read(int index, void __user *buff, size_t count); |
| 27 | extern ssize_t rtlx_write(int index, void *buffer, size_t count, int user); | 27 | extern ssize_t rtlx_write(int index, const void __user *buffer, size_t count); |
| 28 | extern unsigned int rtlx_read_poll(int index, int can_sleep); | 28 | extern unsigned int rtlx_read_poll(int index, int can_sleep); |
| 29 | extern unsigned int rtlx_write_poll(int index); | 29 | extern unsigned int rtlx_write_poll(int index); |
| 30 | 30 | ||
diff --git a/include/asm-mips/system.h b/include/asm-mips/system.h index 597a3743f6a1..290887077e44 100644 --- a/include/asm-mips/system.h +++ b/include/asm-mips/system.h | |||
| @@ -121,10 +121,10 @@ static inline unsigned long __xchg_u32(volatile int * m, unsigned int val) | |||
| 121 | } else { | 121 | } else { |
| 122 | unsigned long flags; | 122 | unsigned long flags; |
| 123 | 123 | ||
| 124 | local_irq_save(flags); | 124 | raw_local_irq_save(flags); |
| 125 | retval = *m; | 125 | retval = *m; |
| 126 | *m = val; | 126 | *m = val; |
| 127 | local_irq_restore(flags); /* implies memory barrier */ | 127 | raw_local_irq_restore(flags); /* implies memory barrier */ |
| 128 | } | 128 | } |
| 129 | 129 | ||
| 130 | smp_mb(); | 130 | smp_mb(); |
| @@ -169,10 +169,10 @@ static inline __u64 __xchg_u64(volatile __u64 * m, __u64 val) | |||
| 169 | } else { | 169 | } else { |
| 170 | unsigned long flags; | 170 | unsigned long flags; |
| 171 | 171 | ||
| 172 | local_irq_save(flags); | 172 | raw_local_irq_save(flags); |
| 173 | retval = *m; | 173 | retval = *m; |
| 174 | *m = val; | 174 | *m = val; |
| 175 | local_irq_restore(flags); /* implies memory barrier */ | 175 | raw_local_irq_restore(flags); /* implies memory barrier */ |
| 176 | } | 176 | } |
| 177 | 177 | ||
| 178 | smp_mb(); | 178 | smp_mb(); |
| @@ -250,11 +250,11 @@ static inline unsigned long __cmpxchg_u32(volatile int * m, unsigned long old, | |||
| 250 | } else { | 250 | } else { |
| 251 | unsigned long flags; | 251 | unsigned long flags; |
| 252 | 252 | ||
| 253 | local_irq_save(flags); | 253 | raw_local_irq_save(flags); |
| 254 | retval = *m; | 254 | retval = *m; |
| 255 | if (retval == old) | 255 | if (retval == old) |
| 256 | *m = new; | 256 | *m = new; |
| 257 | local_irq_restore(flags); /* implies memory barrier */ | 257 | raw_local_irq_restore(flags); /* implies memory barrier */ |
| 258 | } | 258 | } |
| 259 | 259 | ||
| 260 | smp_mb(); | 260 | smp_mb(); |
| @@ -304,11 +304,11 @@ static inline unsigned long __cmpxchg_u64(volatile int * m, unsigned long old, | |||
| 304 | } else { | 304 | } else { |
| 305 | unsigned long flags; | 305 | unsigned long flags; |
| 306 | 306 | ||
| 307 | local_irq_save(flags); | 307 | raw_local_irq_save(flags); |
| 308 | retval = *m; | 308 | retval = *m; |
| 309 | if (retval == old) | 309 | if (retval == old) |
| 310 | *m = new; | 310 | *m = new; |
| 311 | local_irq_restore(flags); /* implies memory barrier */ | 311 | raw_local_irq_restore(flags); /* implies memory barrier */ |
| 312 | } | 312 | } |
| 313 | 313 | ||
| 314 | smp_mb(); | 314 | smp_mb(); |
diff --git a/include/asm-mips/thread_info.h b/include/asm-mips/thread_info.h index fbcda8204473..6cf05f4a4e7e 100644 --- a/include/asm-mips/thread_info.h +++ b/include/asm-mips/thread_info.h | |||
| @@ -119,6 +119,7 @@ register struct thread_info *__current_thread_info __asm__("$28"); | |||
| 119 | #define TIF_POLLING_NRFLAG 17 /* true if poll_idle() is polling TIF_NEED_RESCHED */ | 119 | #define TIF_POLLING_NRFLAG 17 /* true if poll_idle() is polling TIF_NEED_RESCHED */ |
| 120 | #define TIF_MEMDIE 18 | 120 | #define TIF_MEMDIE 18 |
| 121 | #define TIF_FREEZE 19 | 121 | #define TIF_FREEZE 19 |
| 122 | #define TIF_ALLOW_FP_IN_KERNEL 20 | ||
| 122 | #define TIF_SYSCALL_TRACE 31 /* syscall trace active */ | 123 | #define TIF_SYSCALL_TRACE 31 /* syscall trace active */ |
| 123 | 124 | ||
| 124 | #define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE) | 125 | #define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE) |
diff --git a/include/asm-powerpc/floppy.h b/include/asm-powerpc/floppy.h index a0f14eea1da5..afa700ded877 100644 --- a/include/asm-powerpc/floppy.h +++ b/include/asm-powerpc/floppy.h | |||
| @@ -178,7 +178,7 @@ static struct fd_dma_ops virt_dma_ops = | |||
| 178 | ._dma_setup = vdma_dma_setup | 178 | ._dma_setup = vdma_dma_setup |
| 179 | }; | 179 | }; |
| 180 | 180 | ||
| 181 | static int fd_request_dma() | 181 | static int fd_request_dma(void) |
| 182 | { | 182 | { |
| 183 | if (can_use_virtual_dma & 1) { | 183 | if (can_use_virtual_dma & 1) { |
| 184 | fd_ops = &virt_dma_ops; | 184 | fd_ops = &virt_dma_ops; |
diff --git a/include/asm-sparc/dma-mapping.h b/include/asm-sparc/dma-mapping.h index 6db83dc93cb7..f3a641e6b2c8 100644 --- a/include/asm-sparc/dma-mapping.h +++ b/include/asm-sparc/dma-mapping.h | |||
| @@ -5,20 +5,7 @@ | |||
| 5 | #ifdef CONFIG_PCI | 5 | #ifdef CONFIG_PCI |
| 6 | #include <asm-generic/dma-mapping.h> | 6 | #include <asm-generic/dma-mapping.h> |
| 7 | #else | 7 | #else |
| 8 | 8 | #include <asm-generic/dma-mapping-broken.h> | |
| 9 | static inline void *dma_alloc_coherent(struct device *dev, size_t size, | ||
| 10 | dma_addr_t *dma_handle, gfp_t flag) | ||
| 11 | { | ||
| 12 | BUG(); | ||
| 13 | return NULL; | ||
| 14 | } | ||
| 15 | |||
| 16 | static inline void dma_free_coherent(struct device *dev, size_t size, | ||
| 17 | void *vaddr, dma_addr_t dma_handle) | ||
| 18 | { | ||
| 19 | BUG(); | ||
| 20 | } | ||
| 21 | |||
| 22 | #endif /* PCI */ | 9 | #endif /* PCI */ |
| 23 | 10 | ||
| 24 | #endif /* _ASM_SPARC_DMA_MAPPING_H */ | 11 | #endif /* _ASM_SPARC_DMA_MAPPING_H */ |
diff --git a/include/asm-sparc64/tsb.h b/include/asm-sparc64/tsb.h index e82612cd9f33..ab55ffcb7bf4 100644 --- a/include/asm-sparc64/tsb.h +++ b/include/asm-sparc64/tsb.h | |||
| @@ -264,6 +264,7 @@ extern struct tsb_phys_patch_entry __tsb_phys_patch, __tsb_phys_patch_end; | |||
| 264 | be,a,pt %xcc, OK_LABEL; \ | 264 | be,a,pt %xcc, OK_LABEL; \ |
| 265 | mov REG4, REG1; | 265 | mov REG4, REG1; |
| 266 | 266 | ||
| 267 | #ifndef CONFIG_DEBUG_PAGEALLOC | ||
| 267 | /* This version uses a trick, the TAG is already (VADDR >> 22) so | 268 | /* This version uses a trick, the TAG is already (VADDR >> 22) so |
| 268 | * we can make use of that for the index computation. | 269 | * we can make use of that for the index computation. |
| 269 | */ | 270 | */ |
| @@ -277,5 +278,6 @@ extern struct tsb_phys_patch_entry __tsb_phys_patch, __tsb_phys_patch_end; | |||
| 277 | cmp REG3, TAG; \ | 278 | cmp REG3, TAG; \ |
| 278 | be,a,pt %xcc, OK_LABEL; \ | 279 | be,a,pt %xcc, OK_LABEL; \ |
| 279 | mov REG4, REG1; | 280 | mov REG4, REG1; |
| 281 | #endif | ||
| 280 | 282 | ||
| 281 | #endif /* !(_SPARC64_TSB_H) */ | 283 | #endif /* !(_SPARC64_TSB_H) */ |
diff --git a/include/asm-x86_64/nmi.h b/include/asm-x86_64/nmi.h index ceb3d8dac33d..72375e7d32a8 100644 --- a/include/asm-x86_64/nmi.h +++ b/include/asm-x86_64/nmi.h | |||
| @@ -64,7 +64,7 @@ extern int setup_nmi_watchdog(char *); | |||
| 64 | 64 | ||
| 65 | extern atomic_t nmi_active; | 65 | extern atomic_t nmi_active; |
| 66 | extern unsigned int nmi_watchdog; | 66 | extern unsigned int nmi_watchdog; |
| 67 | #define NMI_DEFAULT 0 | 67 | #define NMI_DEFAULT -1 |
| 68 | #define NMI_NONE 0 | 68 | #define NMI_NONE 0 |
| 69 | #define NMI_IO_APIC 1 | 69 | #define NMI_IO_APIC 1 |
| 70 | #define NMI_LOCAL_APIC 2 | 70 | #define NMI_LOCAL_APIC 2 |
diff --git a/include/asm-x86_64/proto.h b/include/asm-x86_64/proto.h index f54f3abf93ce..b6e65a699f2a 100644 --- a/include/asm-x86_64/proto.h +++ b/include/asm-x86_64/proto.h | |||
| @@ -99,7 +99,7 @@ extern int force_iommu, no_iommu; | |||
| 99 | extern int iommu_detected; | 99 | extern int iommu_detected; |
| 100 | #ifdef CONFIG_IOMMU | 100 | #ifdef CONFIG_IOMMU |
| 101 | extern void gart_iommu_init(void); | 101 | extern void gart_iommu_init(void); |
| 102 | extern void gart_parse_options(char *); | 102 | extern void __init gart_parse_options(char *); |
| 103 | extern void iommu_hole_init(void); | 103 | extern void iommu_hole_init(void); |
| 104 | extern int fallback_aper_order; | 104 | extern int fallback_aper_order; |
| 105 | extern int fallback_aper_force; | 105 | extern int fallback_aper_force; |
diff --git a/include/asm-x86_64/smp.h b/include/asm-x86_64/smp.h index e17b9ec42e98..de592a408c07 100644 --- a/include/asm-x86_64/smp.h +++ b/include/asm-x86_64/smp.h | |||
| @@ -7,6 +7,7 @@ | |||
| 7 | #include <linux/threads.h> | 7 | #include <linux/threads.h> |
| 8 | #include <linux/cpumask.h> | 8 | #include <linux/cpumask.h> |
| 9 | #include <linux/bitops.h> | 9 | #include <linux/bitops.h> |
| 10 | #include <linux/init.h> | ||
| 10 | extern int disable_apic; | 11 | extern int disable_apic; |
| 11 | 12 | ||
| 12 | #include <asm/fixmap.h> | 13 | #include <asm/fixmap.h> |
| @@ -68,7 +69,7 @@ extern int __cpu_disable(void); | |||
| 68 | extern void __cpu_die(unsigned int cpu); | 69 | extern void __cpu_die(unsigned int cpu); |
| 69 | extern void prefill_possible_map(void); | 70 | extern void prefill_possible_map(void); |
| 70 | extern unsigned num_processors; | 71 | extern unsigned num_processors; |
| 71 | extern unsigned disabled_cpus; | 72 | extern unsigned __cpuinitdata disabled_cpus; |
| 72 | 73 | ||
| 73 | #define NO_PROC_ID 0xFF /* No processor magic marker */ | 74 | #define NO_PROC_ID 0xFF /* No processor magic marker */ |
| 74 | 75 | ||
diff --git a/include/asm-x86_64/uaccess.h b/include/asm-x86_64/uaccess.h index 1981f70fcad1..9df30b939c4e 100644 --- a/include/asm-x86_64/uaccess.h +++ b/include/asm-x86_64/uaccess.h | |||
| @@ -373,12 +373,12 @@ extern long __copy_user_nocache(void *dst, const void __user *src, unsigned size | |||
| 373 | static inline int __copy_from_user_nocache(void *dst, const void __user *src, unsigned size) | 373 | static inline int __copy_from_user_nocache(void *dst, const void __user *src, unsigned size) |
| 374 | { | 374 | { |
| 375 | might_sleep(); | 375 | might_sleep(); |
| 376 | return __copy_user_nocache(dst, (__force void *)src, size, 1); | 376 | return __copy_user_nocache(dst, src, size, 1); |
| 377 | } | 377 | } |
| 378 | 378 | ||
| 379 | static inline int __copy_from_user_inatomic_nocache(void *dst, const void __user *src, unsigned size) | 379 | static inline int __copy_from_user_inatomic_nocache(void *dst, const void __user *src, unsigned size) |
| 380 | { | 380 | { |
| 381 | return __copy_user_nocache(dst, (__force void *)src, size, 0); | 381 | return __copy_user_nocache(dst, src, size, 0); |
| 382 | } | 382 | } |
| 383 | 383 | ||
| 384 | #endif /* __X86_64_UACCESS_H */ | 384 | #endif /* __X86_64_UACCESS_H */ |
diff --git a/include/linux/backing-dev.h b/include/linux/backing-dev.h index 7011d6255593..f2542c24b328 100644 --- a/include/linux/backing-dev.h +++ b/include/linux/backing-dev.h | |||
| @@ -93,6 +93,7 @@ static inline int bdi_rw_congested(struct backing_dev_info *bdi) | |||
| 93 | void clear_bdi_congested(struct backing_dev_info *bdi, int rw); | 93 | void clear_bdi_congested(struct backing_dev_info *bdi, int rw); |
| 94 | void set_bdi_congested(struct backing_dev_info *bdi, int rw); | 94 | void set_bdi_congested(struct backing_dev_info *bdi, int rw); |
| 95 | long congestion_wait(int rw, long timeout); | 95 | long congestion_wait(int rw, long timeout); |
| 96 | long congestion_wait_interruptible(int rw, long timeout); | ||
| 96 | void congestion_end(int rw); | 97 | void congestion_end(int rw); |
| 97 | 98 | ||
| 98 | #define bdi_cap_writeback_dirty(bdi) \ | 99 | #define bdi_cap_writeback_dirty(bdi) \ |
diff --git a/include/linux/device.h b/include/linux/device.h index 39a3199a826d..caad9bba9652 100644 --- a/include/linux/device.h +++ b/include/linux/device.h | |||
| @@ -353,6 +353,8 @@ extern int __must_check device_create_bin_file(struct device *dev, | |||
| 353 | struct bin_attribute *attr); | 353 | struct bin_attribute *attr); |
| 354 | extern void device_remove_bin_file(struct device *dev, | 354 | extern void device_remove_bin_file(struct device *dev, |
| 355 | struct bin_attribute *attr); | 355 | struct bin_attribute *attr); |
| 356 | extern int device_schedule_callback(struct device *dev, | ||
| 357 | void (*func)(struct device *)); | ||
| 356 | 358 | ||
| 357 | /* device resource management */ | 359 | /* device resource management */ |
| 358 | typedef void (*dr_release_t)(struct device *dev, void *res); | 360 | typedef void (*dr_release_t)(struct device *dev, void *res); |
diff --git a/include/linux/kbd_kern.h b/include/linux/kbd_kern.h index 06c58c423fe1..506ad20c18f8 100644 --- a/include/linux/kbd_kern.h +++ b/include/linux/kbd_kern.h | |||
| @@ -75,7 +75,7 @@ extern int do_poke_blanked_console; | |||
| 75 | 75 | ||
| 76 | extern void (*kbd_ledfunc)(unsigned int led); | 76 | extern void (*kbd_ledfunc)(unsigned int led); |
| 77 | 77 | ||
| 78 | extern void set_console(int nr); | 78 | extern int set_console(int nr); |
| 79 | extern void schedule_console_callback(void); | 79 | extern void schedule_console_callback(void); |
| 80 | 80 | ||
| 81 | static inline void set_leds(void) | 81 | static inline void set_leds(void) |
diff --git a/include/linux/ktime.h b/include/linux/ktime.h index c68c7ac6b232..248305bb9a18 100644 --- a/include/linux/ktime.h +++ b/include/linux/ktime.h | |||
| @@ -57,7 +57,11 @@ typedef union { | |||
| 57 | } ktime_t; | 57 | } ktime_t; |
| 58 | 58 | ||
| 59 | #define KTIME_MAX ((s64)~((u64)1 << 63)) | 59 | #define KTIME_MAX ((s64)~((u64)1 << 63)) |
| 60 | #define KTIME_SEC_MAX (KTIME_MAX / NSEC_PER_SEC) | 60 | #if (BITS_PER_LONG == 64) |
| 61 | # define KTIME_SEC_MAX (KTIME_MAX / NSEC_PER_SEC) | ||
| 62 | #else | ||
| 63 | # define KTIME_SEC_MAX LONG_MAX | ||
| 64 | #endif | ||
| 61 | 65 | ||
| 62 | /* | 66 | /* |
| 63 | * ktime_t definitions when using the 64-bit scalar representation: | 67 | * ktime_t definitions when using the 64-bit scalar representation: |
diff --git a/include/linux/nfs_fs.h b/include/linux/nfs_fs.h index 47aaa2c66738..e9ae0c6e2c62 100644 --- a/include/linux/nfs_fs.h +++ b/include/linux/nfs_fs.h | |||
| @@ -415,6 +415,7 @@ extern void nfs_complete_unlink(struct dentry *); | |||
| 415 | /* | 415 | /* |
| 416 | * linux/fs/nfs/write.c | 416 | * linux/fs/nfs/write.c |
| 417 | */ | 417 | */ |
| 418 | extern int nfs_congestion_kb; | ||
| 418 | extern int nfs_writepage(struct page *page, struct writeback_control *wbc); | 419 | extern int nfs_writepage(struct page *page, struct writeback_control *wbc); |
| 419 | extern int nfs_writepages(struct address_space *, struct writeback_control *); | 420 | extern int nfs_writepages(struct address_space *, struct writeback_control *); |
| 420 | extern int nfs_flush_incompatible(struct file *file, struct page *page); | 421 | extern int nfs_flush_incompatible(struct file *file, struct page *page); |
diff --git a/include/linux/nfs_fs_sb.h b/include/linux/nfs_fs_sb.h index 95796e6924f1..c95d5e642548 100644 --- a/include/linux/nfs_fs_sb.h +++ b/include/linux/nfs_fs_sb.h | |||
| @@ -82,6 +82,7 @@ struct nfs_server { | |||
| 82 | struct rpc_clnt * client_acl; /* ACL RPC client handle */ | 82 | struct rpc_clnt * client_acl; /* ACL RPC client handle */ |
| 83 | struct nfs_iostats * io_stats; /* I/O statistics */ | 83 | struct nfs_iostats * io_stats; /* I/O statistics */ |
| 84 | struct backing_dev_info backing_dev_info; | 84 | struct backing_dev_info backing_dev_info; |
| 85 | atomic_t writeback; /* number of writeback pages */ | ||
| 85 | int flags; /* various flags */ | 86 | int flags; /* various flags */ |
| 86 | unsigned int caps; /* server capabilities */ | 87 | unsigned int caps; /* server capabilities */ |
| 87 | unsigned int rsize; /* read size */ | 88 | unsigned int rsize; /* read size */ |
diff --git a/include/linux/security.h b/include/linux/security.h index 7f88d97575fd..47e82c120f9a 100644 --- a/include/linux/security.h +++ b/include/linux/security.h | |||
| @@ -1324,7 +1324,7 @@ struct security_operations { | |||
| 1324 | 1324 | ||
| 1325 | void (*d_instantiate) (struct dentry *dentry, struct inode *inode); | 1325 | void (*d_instantiate) (struct dentry *dentry, struct inode *inode); |
| 1326 | 1326 | ||
| 1327 | int (*getprocattr)(struct task_struct *p, char *name, void *value, size_t size); | 1327 | int (*getprocattr)(struct task_struct *p, char *name, char **value); |
| 1328 | int (*setprocattr)(struct task_struct *p, char *name, void *value, size_t size); | 1328 | int (*setprocattr)(struct task_struct *p, char *name, void *value, size_t size); |
| 1329 | int (*secid_to_secctx)(u32 secid, char **secdata, u32 *seclen); | 1329 | int (*secid_to_secctx)(u32 secid, char **secdata, u32 *seclen); |
| 1330 | void (*release_secctx)(char *secdata, u32 seclen); | 1330 | void (*release_secctx)(char *secdata, u32 seclen); |
| @@ -2092,9 +2092,9 @@ static inline void security_d_instantiate (struct dentry *dentry, struct inode * | |||
| 2092 | security_ops->d_instantiate (dentry, inode); | 2092 | security_ops->d_instantiate (dentry, inode); |
| 2093 | } | 2093 | } |
| 2094 | 2094 | ||
| 2095 | static inline int security_getprocattr(struct task_struct *p, char *name, void *value, size_t size) | 2095 | static inline int security_getprocattr(struct task_struct *p, char *name, char **value) |
| 2096 | { | 2096 | { |
| 2097 | return security_ops->getprocattr(p, name, value, size); | 2097 | return security_ops->getprocattr(p, name, value); |
| 2098 | } | 2098 | } |
| 2099 | 2099 | ||
| 2100 | static inline int security_setprocattr(struct task_struct *p, char *name, void *value, size_t size) | 2100 | static inline int security_setprocattr(struct task_struct *p, char *name, void *value, size_t size) |
| @@ -2749,7 +2749,7 @@ static inline int security_sem_semop (struct sem_array * sma, | |||
| 2749 | static inline void security_d_instantiate (struct dentry *dentry, struct inode *inode) | 2749 | static inline void security_d_instantiate (struct dentry *dentry, struct inode *inode) |
| 2750 | { } | 2750 | { } |
| 2751 | 2751 | ||
| 2752 | static inline int security_getprocattr(struct task_struct *p, char *name, void *value, size_t size) | 2752 | static inline int security_getprocattr(struct task_struct *p, char *name, char **value) |
| 2753 | { | 2753 | { |
| 2754 | return -EINVAL; | 2754 | return -EINVAL; |
| 2755 | } | 2755 | } |
diff --git a/include/linux/spi/spi_bitbang.h b/include/linux/spi/spi_bitbang.h index 2e8c048b9b80..9dbca629dcfb 100644 --- a/include/linux/spi/spi_bitbang.h +++ b/include/linux/spi/spi_bitbang.h | |||
| @@ -25,7 +25,6 @@ struct spi_bitbang { | |||
| 25 | spinlock_t lock; | 25 | spinlock_t lock; |
| 26 | struct list_head queue; | 26 | struct list_head queue; |
| 27 | u8 busy; | 27 | u8 busy; |
| 28 | u8 shutdown; | ||
| 29 | u8 use_dma; | 28 | u8 use_dma; |
| 30 | 29 | ||
| 31 | struct spi_master *master; | 30 | struct spi_master *master; |
diff --git a/include/linux/sysfs.h b/include/linux/sysfs.h index 523405e1e1f6..0544edda7168 100644 --- a/include/linux/sysfs.h +++ b/include/linux/sysfs.h | |||
| @@ -78,6 +78,9 @@ struct sysfs_ops { | |||
| 78 | 78 | ||
| 79 | #ifdef CONFIG_SYSFS | 79 | #ifdef CONFIG_SYSFS |
| 80 | 80 | ||
| 81 | extern int sysfs_schedule_callback(struct kobject *kobj, | ||
| 82 | void (*func)(void *), void *data); | ||
| 83 | |||
| 81 | extern int __must_check | 84 | extern int __must_check |
| 82 | sysfs_create_dir(struct kobject *, struct dentry *); | 85 | sysfs_create_dir(struct kobject *, struct dentry *); |
| 83 | 86 | ||
| @@ -132,6 +135,12 @@ extern int __must_check sysfs_init(void); | |||
| 132 | 135 | ||
| 133 | #else /* CONFIG_SYSFS */ | 136 | #else /* CONFIG_SYSFS */ |
| 134 | 137 | ||
| 138 | static inline int sysfs_schedule_callback(struct kobject *kobj, | ||
| 139 | void (*func)(void *), void *data) | ||
| 140 | { | ||
| 141 | return -ENOSYS; | ||
| 142 | } | ||
| 143 | |||
| 135 | static inline int sysfs_create_dir(struct kobject * k, struct dentry *shadow) | 144 | static inline int sysfs_create_dir(struct kobject * k, struct dentry *shadow) |
| 136 | { | 145 | { |
| 137 | return 0; | 146 | return 0; |
diff --git a/include/linux/ufs_fs.h b/include/linux/ufs_fs.h index dc2e9fe69418..daeba22b7656 100644 --- a/include/linux/ufs_fs.h +++ b/include/linux/ufs_fs.h | |||
| @@ -649,10 +649,10 @@ struct ufs2_inode { | |||
| 649 | __fs32 ui_blksize; /* 12: Inode blocksize. */ | 649 | __fs32 ui_blksize; /* 12: Inode blocksize. */ |
| 650 | __fs64 ui_size; /* 16: File byte count. */ | 650 | __fs64 ui_size; /* 16: File byte count. */ |
| 651 | __fs64 ui_blocks; /* 24: Bytes actually held. */ | 651 | __fs64 ui_blocks; /* 24: Bytes actually held. */ |
| 652 | struct ufs_timeval ui_atime; /* 32: Last access time. */ | 652 | __fs64 ui_atime; /* 32: Last access time. */ |
| 653 | struct ufs_timeval ui_mtime; /* 40: Last modified time. */ | 653 | __fs64 ui_mtime; /* 40: Last modified time. */ |
| 654 | struct ufs_timeval ui_ctime; /* 48: Last inode change time. */ | 654 | __fs64 ui_ctime; /* 48: Last inode change time. */ |
| 655 | struct ufs_timeval ui_birthtime; /* 56: Inode creation time. */ | 655 | __fs64 ui_birthtime; /* 56: Inode creation time. */ |
| 656 | __fs32 ui_mtimensec; /* 64: Last modified time. */ | 656 | __fs32 ui_mtimensec; /* 64: Last modified time. */ |
| 657 | __fs32 ui_atimensec; /* 68: Last access time. */ | 657 | __fs32 ui_atimensec; /* 68: Last access time. */ |
| 658 | __fs32 ui_ctimensec; /* 72: Last inode change time. */ | 658 | __fs32 ui_ctimensec; /* 72: Last inode change time. */ |
diff --git a/include/linux/vt_kern.h b/include/linux/vt_kern.h index 37a1a41f5b65..e0db669998f3 100644 --- a/include/linux/vt_kern.h +++ b/include/linux/vt_kern.h | |||
| @@ -83,6 +83,7 @@ void reset_vc(struct vc_data *vc); | |||
| 83 | #define CON_BUF_SIZE (CONFIG_BASE_SMALL ? 256 : PAGE_SIZE) | 83 | #define CON_BUF_SIZE (CONFIG_BASE_SMALL ? 256 : PAGE_SIZE) |
| 84 | extern char con_buf[CON_BUF_SIZE]; | 84 | extern char con_buf[CON_BUF_SIZE]; |
| 85 | extern struct semaphore con_buf_sem; | 85 | extern struct semaphore con_buf_sem; |
| 86 | extern char vt_dont_switch; | ||
| 86 | 87 | ||
| 87 | struct vt_spawn_console { | 88 | struct vt_spawn_console { |
| 88 | spinlock_t lock; | 89 | spinlock_t lock; |
diff --git a/kernel/auditsc.c b/kernel/auditsc.c index 359955800dd2..628c7ac590a0 100644 --- a/kernel/auditsc.c +++ b/kernel/auditsc.c | |||
| @@ -739,28 +739,26 @@ static inline void audit_free_context(struct audit_context *context) | |||
| 739 | void audit_log_task_context(struct audit_buffer *ab) | 739 | void audit_log_task_context(struct audit_buffer *ab) |
| 740 | { | 740 | { |
| 741 | char *ctx = NULL; | 741 | char *ctx = NULL; |
| 742 | ssize_t len = 0; | 742 | unsigned len; |
| 743 | int error; | ||
| 744 | u32 sid; | ||
| 745 | |||
| 746 | selinux_get_task_sid(current, &sid); | ||
| 747 | if (!sid) | ||
| 748 | return; | ||
| 743 | 749 | ||
| 744 | len = security_getprocattr(current, "current", NULL, 0); | 750 | error = selinux_sid_to_string(sid, &ctx, &len); |
| 745 | if (len < 0) { | 751 | if (error) { |
| 746 | if (len != -EINVAL) | 752 | if (error != -EINVAL) |
| 747 | goto error_path; | 753 | goto error_path; |
| 748 | return; | 754 | return; |
| 749 | } | 755 | } |
| 750 | 756 | ||
| 751 | ctx = kmalloc(len, GFP_KERNEL); | ||
| 752 | if (!ctx) | ||
| 753 | goto error_path; | ||
| 754 | |||
| 755 | len = security_getprocattr(current, "current", ctx, len); | ||
| 756 | if (len < 0 ) | ||
| 757 | goto error_path; | ||
| 758 | |||
| 759 | audit_log_format(ab, " subj=%s", ctx); | 757 | audit_log_format(ab, " subj=%s", ctx); |
| 758 | kfree(ctx); | ||
| 760 | return; | 759 | return; |
| 761 | 760 | ||
| 762 | error_path: | 761 | error_path: |
| 763 | kfree(ctx); | ||
| 764 | audit_panic("error in audit_log_task_context"); | 762 | audit_panic("error in audit_log_task_context"); |
| 765 | return; | 763 | return; |
| 766 | } | 764 | } |
diff --git a/kernel/fork.c b/kernel/fork.c index d154cc786489..6af959c034d8 100644 --- a/kernel/fork.c +++ b/kernel/fork.c | |||
| @@ -933,8 +933,8 @@ asmlinkage long sys_set_tid_address(int __user *tidptr) | |||
| 933 | 933 | ||
| 934 | static inline void rt_mutex_init_task(struct task_struct *p) | 934 | static inline void rt_mutex_init_task(struct task_struct *p) |
| 935 | { | 935 | { |
| 936 | #ifdef CONFIG_RT_MUTEXES | ||
| 937 | spin_lock_init(&p->pi_lock); | 936 | spin_lock_init(&p->pi_lock); |
| 937 | #ifdef CONFIG_RT_MUTEXES | ||
| 938 | plist_head_init(&p->pi_waiters, &p->pi_lock); | 938 | plist_head_init(&p->pi_waiters, &p->pi_lock); |
| 939 | p->pi_blocked_on = NULL; | 939 | p->pi_blocked_on = NULL; |
| 940 | #endif | 940 | #endif |
diff --git a/kernel/futex.c b/kernel/futex.c index e749e7df14b1..5a270b5e3f95 100644 --- a/kernel/futex.c +++ b/kernel/futex.c | |||
| @@ -565,6 +565,7 @@ static int wake_futex_pi(u32 __user *uaddr, u32 uval, struct futex_q *this) | |||
| 565 | if (!pi_state) | 565 | if (!pi_state) |
| 566 | return -EINVAL; | 566 | return -EINVAL; |
| 567 | 567 | ||
| 568 | spin_lock(&pi_state->pi_mutex.wait_lock); | ||
| 568 | new_owner = rt_mutex_next_owner(&pi_state->pi_mutex); | 569 | new_owner = rt_mutex_next_owner(&pi_state->pi_mutex); |
| 569 | 570 | ||
| 570 | /* | 571 | /* |
| @@ -604,6 +605,7 @@ static int wake_futex_pi(u32 __user *uaddr, u32 uval, struct futex_q *this) | |||
| 604 | pi_state->owner = new_owner; | 605 | pi_state->owner = new_owner; |
| 605 | spin_unlock_irq(&new_owner->pi_lock); | 606 | spin_unlock_irq(&new_owner->pi_lock); |
| 606 | 607 | ||
| 608 | spin_unlock(&pi_state->pi_mutex.wait_lock); | ||
| 607 | rt_mutex_unlock(&pi_state->pi_mutex); | 609 | rt_mutex_unlock(&pi_state->pi_mutex); |
| 608 | 610 | ||
| 609 | return 0; | 611 | return 0; |
diff --git a/kernel/hrtimer.c b/kernel/hrtimer.c index ec4cb9f3e3b7..6a7938a0d513 100644 --- a/kernel/hrtimer.c +++ b/kernel/hrtimer.c | |||
| @@ -135,7 +135,7 @@ EXPORT_SYMBOL_GPL(ktime_get_ts); | |||
| 135 | static void hrtimer_get_softirq_time(struct hrtimer_cpu_base *base) | 135 | static void hrtimer_get_softirq_time(struct hrtimer_cpu_base *base) |
| 136 | { | 136 | { |
| 137 | ktime_t xtim, tomono; | 137 | ktime_t xtim, tomono; |
| 138 | struct timespec xts; | 138 | struct timespec xts, tom; |
| 139 | unsigned long seq; | 139 | unsigned long seq; |
| 140 | 140 | ||
| 141 | do { | 141 | do { |
| @@ -145,10 +145,11 @@ static void hrtimer_get_softirq_time(struct hrtimer_cpu_base *base) | |||
| 145 | #else | 145 | #else |
| 146 | xts = xtime; | 146 | xts = xtime; |
| 147 | #endif | 147 | #endif |
| 148 | tom = wall_to_monotonic; | ||
| 148 | } while (read_seqretry(&xtime_lock, seq)); | 149 | } while (read_seqretry(&xtime_lock, seq)); |
| 149 | 150 | ||
| 150 | xtim = timespec_to_ktime(xts); | 151 | xtim = timespec_to_ktime(xts); |
| 151 | tomono = timespec_to_ktime(wall_to_monotonic); | 152 | tomono = timespec_to_ktime(tom); |
| 152 | base->clock_base[CLOCK_REALTIME].softirq_time = xtim; | 153 | base->clock_base[CLOCK_REALTIME].softirq_time = xtim; |
| 153 | base->clock_base[CLOCK_MONOTONIC].softirq_time = | 154 | base->clock_base[CLOCK_MONOTONIC].softirq_time = |
| 154 | ktime_add(xtim, tomono); | 155 | ktime_add(xtim, tomono); |
| @@ -644,6 +645,12 @@ hrtimer_forward(struct hrtimer *timer, ktime_t now, ktime_t interval) | |||
| 644 | orun++; | 645 | orun++; |
| 645 | } | 646 | } |
| 646 | timer->expires = ktime_add(timer->expires, interval); | 647 | timer->expires = ktime_add(timer->expires, interval); |
| 648 | /* | ||
| 649 | * Make sure, that the result did not wrap with a very large | ||
| 650 | * interval. | ||
| 651 | */ | ||
| 652 | if (timer->expires.tv64 < 0) | ||
| 653 | timer->expires = ktime_set(KTIME_SEC_MAX, 0); | ||
| 647 | 654 | ||
| 648 | return orun; | 655 | return orun; |
| 649 | } | 656 | } |
diff --git a/kernel/power/console.c b/kernel/power/console.c index 623786d44159..89bcf4973ee5 100644 --- a/kernel/power/console.c +++ b/kernel/power/console.c | |||
| @@ -27,7 +27,15 @@ int pm_prepare_console(void) | |||
| 27 | return 1; | 27 | return 1; |
| 28 | } | 28 | } |
| 29 | 29 | ||
| 30 | set_console(SUSPEND_CONSOLE); | 30 | if (set_console(SUSPEND_CONSOLE)) { |
| 31 | /* | ||
| 32 | * We're unable to switch to the SUSPEND_CONSOLE. | ||
| 33 | * Let the calling function know so it can decide | ||
| 34 | * what to do. | ||
| 35 | */ | ||
| 36 | release_console_sem(); | ||
| 37 | return 1; | ||
| 38 | } | ||
| 31 | release_console_sem(); | 39 | release_console_sem(); |
| 32 | 40 | ||
| 33 | if (vt_waitactive(SUSPEND_CONSOLE)) { | 41 | if (vt_waitactive(SUSPEND_CONSOLE)) { |
diff --git a/kernel/power/disk.c b/kernel/power/disk.c index 406b20adb27a..873cdf8ea5a4 100644 --- a/kernel/power/disk.c +++ b/kernel/power/disk.c | |||
| @@ -58,6 +58,7 @@ static inline int platform_prepare(void) | |||
| 58 | 58 | ||
| 59 | static void power_down(suspend_disk_method_t mode) | 59 | static void power_down(suspend_disk_method_t mode) |
| 60 | { | 60 | { |
| 61 | disable_nonboot_cpus(); | ||
| 61 | switch(mode) { | 62 | switch(mode) { |
| 62 | case PM_DISK_PLATFORM: | 63 | case PM_DISK_PLATFORM: |
| 63 | if (pm_ops && pm_ops->enter) { | 64 | if (pm_ops && pm_ops->enter) { |
| @@ -251,6 +252,7 @@ static int software_resume(void) | |||
| 251 | error = swsusp_read(); | 252 | error = swsusp_read(); |
| 252 | if (error) { | 253 | if (error) { |
| 253 | swsusp_free(); | 254 | swsusp_free(); |
| 255 | platform_finish(); | ||
| 254 | goto Thaw; | 256 | goto Thaw; |
| 255 | } | 257 | } |
| 256 | 258 | ||
diff --git a/kernel/power/user.c b/kernel/power/user.c index dd09efe7df54..d6a8dcc26ae5 100644 --- a/kernel/power/user.c +++ b/kernel/power/user.c | |||
| @@ -398,9 +398,10 @@ static int snapshot_ioctl(struct inode *inode, struct file *filp, | |||
| 398 | 398 | ||
| 399 | case PMOPS_ENTER: | 399 | case PMOPS_ENTER: |
| 400 | if (data->platform_suspend) { | 400 | if (data->platform_suspend) { |
| 401 | disable_nonboot_cpus(); | ||
| 401 | kernel_shutdown_prepare(SYSTEM_SUSPEND_DISK); | 402 | kernel_shutdown_prepare(SYSTEM_SUSPEND_DISK); |
| 402 | error = pm_ops->enter(PM_SUSPEND_DISK); | 403 | error = pm_ops->enter(PM_SUSPEND_DISK); |
| 403 | error = 0; | 404 | enable_nonboot_cpus(); |
| 404 | } | 405 | } |
| 405 | break; | 406 | break; |
| 406 | 407 | ||
diff --git a/kernel/time/tick-broadcast.c b/kernel/time/tick-broadcast.c index 5567745470f7..eadfce2fff74 100644 --- a/kernel/time/tick-broadcast.c +++ b/kernel/time/tick-broadcast.c | |||
| @@ -307,12 +307,19 @@ int tick_resume_broadcast(void) | |||
| 307 | spin_lock_irqsave(&tick_broadcast_lock, flags); | 307 | spin_lock_irqsave(&tick_broadcast_lock, flags); |
| 308 | 308 | ||
| 309 | bc = tick_broadcast_device.evtdev; | 309 | bc = tick_broadcast_device.evtdev; |
| 310 | if (bc) { | ||
| 311 | if (tick_broadcast_device.mode == TICKDEV_MODE_PERIODIC && | ||
| 312 | !cpus_empty(tick_broadcast_mask)) | ||
| 313 | tick_broadcast_start_periodic(bc); | ||
| 314 | 310 | ||
| 315 | broadcast = cpu_isset(smp_processor_id(), tick_broadcast_mask); | 311 | if (bc) { |
| 312 | switch (tick_broadcast_device.mode) { | ||
| 313 | case TICKDEV_MODE_PERIODIC: | ||
| 314 | if(!cpus_empty(tick_broadcast_mask)) | ||
| 315 | tick_broadcast_start_periodic(bc); | ||
| 316 | broadcast = cpu_isset(smp_processor_id(), | ||
| 317 | tick_broadcast_mask); | ||
| 318 | break; | ||
| 319 | case TICKDEV_MODE_ONESHOT: | ||
| 320 | broadcast = tick_resume_broadcast_oneshot(bc); | ||
| 321 | break; | ||
| 322 | } | ||
| 316 | } | 323 | } |
| 317 | spin_unlock_irqrestore(&tick_broadcast_lock, flags); | 324 | spin_unlock_irqrestore(&tick_broadcast_lock, flags); |
| 318 | 325 | ||
| @@ -347,6 +354,16 @@ static int tick_broadcast_set_event(ktime_t expires, int force) | |||
| 347 | } | 354 | } |
| 348 | } | 355 | } |
| 349 | 356 | ||
| 357 | int tick_resume_broadcast_oneshot(struct clock_event_device *bc) | ||
| 358 | { | ||
| 359 | clockevents_set_mode(bc, CLOCK_EVT_MODE_ONESHOT); | ||
| 360 | |||
| 361 | if(!cpus_empty(tick_broadcast_oneshot_mask)) | ||
| 362 | tick_broadcast_set_event(ktime_get(), 1); | ||
| 363 | |||
| 364 | return cpu_isset(smp_processor_id(), tick_broadcast_oneshot_mask); | ||
| 365 | } | ||
| 366 | |||
| 350 | /* | 367 | /* |
| 351 | * Reprogram the broadcast device: | 368 | * Reprogram the broadcast device: |
| 352 | * | 369 | * |
diff --git a/kernel/time/tick-common.c b/kernel/time/tick-common.c index 43ba1bdec14c..bfda3f7f0716 100644 --- a/kernel/time/tick-common.c +++ b/kernel/time/tick-common.c | |||
| @@ -298,18 +298,17 @@ static void tick_shutdown(unsigned int *cpup) | |||
| 298 | spin_unlock_irqrestore(&tick_device_lock, flags); | 298 | spin_unlock_irqrestore(&tick_device_lock, flags); |
| 299 | } | 299 | } |
| 300 | 300 | ||
| 301 | static void tick_suspend_periodic(void) | 301 | static void tick_suspend(void) |
| 302 | { | 302 | { |
| 303 | struct tick_device *td = &__get_cpu_var(tick_cpu_device); | 303 | struct tick_device *td = &__get_cpu_var(tick_cpu_device); |
| 304 | unsigned long flags; | 304 | unsigned long flags; |
| 305 | 305 | ||
| 306 | spin_lock_irqsave(&tick_device_lock, flags); | 306 | spin_lock_irqsave(&tick_device_lock, flags); |
| 307 | if (td->mode == TICKDEV_MODE_PERIODIC) | 307 | clockevents_set_mode(td->evtdev, CLOCK_EVT_MODE_SHUTDOWN); |
| 308 | clockevents_set_mode(td->evtdev, CLOCK_EVT_MODE_SHUTDOWN); | ||
| 309 | spin_unlock_irqrestore(&tick_device_lock, flags); | 308 | spin_unlock_irqrestore(&tick_device_lock, flags); |
| 310 | } | 309 | } |
| 311 | 310 | ||
| 312 | static void tick_resume_periodic(void) | 311 | static void tick_resume(void) |
| 313 | { | 312 | { |
| 314 | struct tick_device *td = &__get_cpu_var(tick_cpu_device); | 313 | struct tick_device *td = &__get_cpu_var(tick_cpu_device); |
| 315 | unsigned long flags; | 314 | unsigned long flags; |
| @@ -317,6 +316,8 @@ static void tick_resume_periodic(void) | |||
| 317 | spin_lock_irqsave(&tick_device_lock, flags); | 316 | spin_lock_irqsave(&tick_device_lock, flags); |
| 318 | if (td->mode == TICKDEV_MODE_PERIODIC) | 317 | if (td->mode == TICKDEV_MODE_PERIODIC) |
| 319 | tick_setup_periodic(td->evtdev, 0); | 318 | tick_setup_periodic(td->evtdev, 0); |
| 319 | else | ||
| 320 | tick_resume_oneshot(); | ||
| 320 | spin_unlock_irqrestore(&tick_device_lock, flags); | 321 | spin_unlock_irqrestore(&tick_device_lock, flags); |
| 321 | } | 322 | } |
| 322 | 323 | ||
| @@ -348,13 +349,13 @@ static int tick_notify(struct notifier_block *nb, unsigned long reason, | |||
| 348 | break; | 349 | break; |
| 349 | 350 | ||
| 350 | case CLOCK_EVT_NOTIFY_SUSPEND: | 351 | case CLOCK_EVT_NOTIFY_SUSPEND: |
| 351 | tick_suspend_periodic(); | 352 | tick_suspend(); |
| 352 | tick_suspend_broadcast(); | 353 | tick_suspend_broadcast(); |
| 353 | break; | 354 | break; |
| 354 | 355 | ||
| 355 | case CLOCK_EVT_NOTIFY_RESUME: | 356 | case CLOCK_EVT_NOTIFY_RESUME: |
| 356 | if (!tick_resume_broadcast()) | 357 | if (!tick_resume_broadcast()) |
| 357 | tick_resume_periodic(); | 358 | tick_resume(); |
| 358 | break; | 359 | break; |
| 359 | 360 | ||
| 360 | default: | 361 | default: |
diff --git a/kernel/time/tick-internal.h b/kernel/time/tick-internal.h index 75890efd24ff..c9d203bde518 100644 --- a/kernel/time/tick-internal.h +++ b/kernel/time/tick-internal.h | |||
| @@ -19,12 +19,13 @@ extern void tick_setup_oneshot(struct clock_event_device *newdev, | |||
| 19 | extern int tick_program_event(ktime_t expires, int force); | 19 | extern int tick_program_event(ktime_t expires, int force); |
| 20 | extern void tick_oneshot_notify(void); | 20 | extern void tick_oneshot_notify(void); |
| 21 | extern int tick_switch_to_oneshot(void (*handler)(struct clock_event_device *)); | 21 | extern int tick_switch_to_oneshot(void (*handler)(struct clock_event_device *)); |
| 22 | 22 | extern void tick_resume_oneshot(void); | |
| 23 | # ifdef CONFIG_GENERIC_CLOCKEVENTS_BROADCAST | 23 | # ifdef CONFIG_GENERIC_CLOCKEVENTS_BROADCAST |
| 24 | extern void tick_broadcast_setup_oneshot(struct clock_event_device *bc); | 24 | extern void tick_broadcast_setup_oneshot(struct clock_event_device *bc); |
| 25 | extern void tick_broadcast_oneshot_control(unsigned long reason); | 25 | extern void tick_broadcast_oneshot_control(unsigned long reason); |
| 26 | extern void tick_broadcast_switch_to_oneshot(void); | 26 | extern void tick_broadcast_switch_to_oneshot(void); |
| 27 | extern void tick_shutdown_broadcast_oneshot(unsigned int *cpup); | 27 | extern void tick_shutdown_broadcast_oneshot(unsigned int *cpup); |
| 28 | extern int tick_resume_broadcast_oneshot(struct clock_event_device *bc); | ||
| 28 | # else /* BROADCAST */ | 29 | # else /* BROADCAST */ |
| 29 | static inline void tick_broadcast_setup_oneshot(struct clock_event_device *bc) | 30 | static inline void tick_broadcast_setup_oneshot(struct clock_event_device *bc) |
| 30 | { | 31 | { |
| @@ -43,6 +44,10 @@ void tick_setup_oneshot(struct clock_event_device *newdev, | |||
| 43 | { | 44 | { |
| 44 | BUG(); | 45 | BUG(); |
| 45 | } | 46 | } |
| 47 | static inline void tick_resume_oneshot(void) | ||
| 48 | { | ||
| 49 | BUG(); | ||
| 50 | } | ||
| 46 | static inline int tick_program_event(ktime_t expires, int force) | 51 | static inline int tick_program_event(ktime_t expires, int force) |
| 47 | { | 52 | { |
| 48 | return 0; | 53 | return 0; |
| @@ -54,6 +59,10 @@ static inline void tick_broadcast_setup_oneshot(struct clock_event_device *bc) | |||
| 54 | } | 59 | } |
| 55 | static inline void tick_broadcast_oneshot_control(unsigned long reason) { } | 60 | static inline void tick_broadcast_oneshot_control(unsigned long reason) { } |
| 56 | static inline void tick_shutdown_broadcast_oneshot(unsigned int *cpup) { } | 61 | static inline void tick_shutdown_broadcast_oneshot(unsigned int *cpup) { } |
| 62 | static inline int tick_resume_broadcast_oneshot(struct clock_event_device *bc) | ||
| 63 | { | ||
| 64 | return 0; | ||
| 65 | } | ||
| 57 | #endif /* !TICK_ONESHOT */ | 66 | #endif /* !TICK_ONESHOT */ |
| 58 | 67 | ||
| 59 | /* | 68 | /* |
diff --git a/kernel/time/tick-oneshot.c b/kernel/time/tick-oneshot.c index 2e8b7ff863cc..f6997ab0c3c9 100644 --- a/kernel/time/tick-oneshot.c +++ b/kernel/time/tick-oneshot.c | |||
| @@ -41,6 +41,18 @@ int tick_program_event(ktime_t expires, int force) | |||
| 41 | } | 41 | } |
| 42 | 42 | ||
| 43 | /** | 43 | /** |
| 44 | * tick_resume_onshot - resume oneshot mode | ||
| 45 | */ | ||
| 46 | void tick_resume_oneshot(void) | ||
| 47 | { | ||
| 48 | struct tick_device *td = &__get_cpu_var(tick_cpu_device); | ||
| 49 | struct clock_event_device *dev = td->evtdev; | ||
| 50 | |||
| 51 | clockevents_set_mode(dev, CLOCK_EVT_MODE_ONESHOT); | ||
| 52 | tick_program_event(ktime_get(), 1); | ||
| 53 | } | ||
| 54 | |||
| 55 | /** | ||
| 44 | * tick_setup_oneshot - setup the event device for oneshot mode (hres or nohz) | 56 | * tick_setup_oneshot - setup the event device for oneshot mode (hres or nohz) |
| 45 | */ | 57 | */ |
| 46 | void tick_setup_oneshot(struct clock_event_device *newdev, | 58 | void tick_setup_oneshot(struct clock_event_device *newdev, |
diff --git a/mm/backing-dev.c b/mm/backing-dev.c index f50a2811f9dc..e5de3781d3fe 100644 --- a/mm/backing-dev.c +++ b/mm/backing-dev.c | |||
| @@ -55,6 +55,22 @@ long congestion_wait(int rw, long timeout) | |||
| 55 | } | 55 | } |
| 56 | EXPORT_SYMBOL(congestion_wait); | 56 | EXPORT_SYMBOL(congestion_wait); |
| 57 | 57 | ||
| 58 | long congestion_wait_interruptible(int rw, long timeout) | ||
| 59 | { | ||
| 60 | long ret; | ||
| 61 | DEFINE_WAIT(wait); | ||
| 62 | wait_queue_head_t *wqh = &congestion_wqh[rw]; | ||
| 63 | |||
| 64 | prepare_to_wait(wqh, &wait, TASK_INTERRUPTIBLE); | ||
| 65 | if (signal_pending(current)) | ||
| 66 | ret = -ERESTARTSYS; | ||
| 67 | else | ||
| 68 | ret = io_schedule_timeout(timeout); | ||
| 69 | finish_wait(wqh, &wait); | ||
| 70 | return ret; | ||
| 71 | } | ||
| 72 | EXPORT_SYMBOL(congestion_wait_interruptible); | ||
| 73 | |||
| 58 | /** | 74 | /** |
| 59 | * congestion_end - wake up sleepers on a congested backing_dev_info | 75 | * congestion_end - wake up sleepers on a congested backing_dev_info |
| 60 | * @rw: READ or WRITE | 76 | * @rw: READ or WRITE |
diff --git a/mm/filemap.c b/mm/filemap.c index d1060b8d3cd6..5dfc093ceb3d 100644 --- a/mm/filemap.c +++ b/mm/filemap.c | |||
| @@ -2379,7 +2379,8 @@ generic_file_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov, | |||
| 2379 | struct file *file = iocb->ki_filp; | 2379 | struct file *file = iocb->ki_filp; |
| 2380 | struct address_space *mapping = file->f_mapping; | 2380 | struct address_space *mapping = file->f_mapping; |
| 2381 | ssize_t retval; | 2381 | ssize_t retval; |
| 2382 | size_t write_len = 0; | 2382 | size_t write_len; |
| 2383 | pgoff_t end = 0; /* silence gcc */ | ||
| 2383 | 2384 | ||
| 2384 | /* | 2385 | /* |
| 2385 | * If it's a write, unmap all mmappings of the file up-front. This | 2386 | * If it's a write, unmap all mmappings of the file up-front. This |
| @@ -2388,23 +2389,46 @@ generic_file_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov, | |||
| 2388 | */ | 2389 | */ |
| 2389 | if (rw == WRITE) { | 2390 | if (rw == WRITE) { |
| 2390 | write_len = iov_length(iov, nr_segs); | 2391 | write_len = iov_length(iov, nr_segs); |
| 2392 | end = (offset + write_len - 1) >> PAGE_CACHE_SHIFT; | ||
| 2391 | if (mapping_mapped(mapping)) | 2393 | if (mapping_mapped(mapping)) |
| 2392 | unmap_mapping_range(mapping, offset, write_len, 0); | 2394 | unmap_mapping_range(mapping, offset, write_len, 0); |
| 2393 | } | 2395 | } |
| 2394 | 2396 | ||
| 2395 | retval = filemap_write_and_wait(mapping); | 2397 | retval = filemap_write_and_wait(mapping); |
| 2396 | if (retval == 0) { | 2398 | if (retval) |
| 2397 | retval = mapping->a_ops->direct_IO(rw, iocb, iov, | 2399 | goto out; |
| 2398 | offset, nr_segs); | 2400 | |
| 2399 | if (rw == WRITE && mapping->nrpages) { | 2401 | /* |
| 2400 | pgoff_t end = (offset + write_len - 1) | 2402 | * After a write we want buffered reads to be sure to go to disk to get |
| 2401 | >> PAGE_CACHE_SHIFT; | 2403 | * the new data. We invalidate clean cached page from the region we're |
| 2402 | int err = invalidate_inode_pages2_range(mapping, | 2404 | * about to write. We do this *before* the write so that we can return |
| 2405 | * -EIO without clobbering -EIOCBQUEUED from ->direct_IO(). | ||
| 2406 | */ | ||
| 2407 | if (rw == WRITE && mapping->nrpages) { | ||
| 2408 | retval = invalidate_inode_pages2_range(mapping, | ||
| 2403 | offset >> PAGE_CACHE_SHIFT, end); | 2409 | offset >> PAGE_CACHE_SHIFT, end); |
| 2404 | if (err) | 2410 | if (retval) |
| 2405 | retval = err; | 2411 | goto out; |
| 2406 | } | ||
| 2407 | } | 2412 | } |
| 2413 | |||
| 2414 | retval = mapping->a_ops->direct_IO(rw, iocb, iov, offset, nr_segs); | ||
| 2415 | if (retval) | ||
| 2416 | goto out; | ||
| 2417 | |||
| 2418 | /* | ||
| 2419 | * Finally, try again to invalidate clean pages which might have been | ||
| 2420 | * faulted in by get_user_pages() if the source of the write was an | ||
| 2421 | * mmap()ed region of the file we're writing. That's a pretty crazy | ||
| 2422 | * thing to do, so we don't support it 100%. If this invalidation | ||
| 2423 | * fails and we have -EIOCBQUEUED we ignore the failure. | ||
| 2424 | */ | ||
| 2425 | if (rw == WRITE && mapping->nrpages) { | ||
| 2426 | int err = invalidate_inode_pages2_range(mapping, | ||
| 2427 | offset >> PAGE_CACHE_SHIFT, end); | ||
| 2428 | if (err && retval >= 0) | ||
| 2429 | retval = err; | ||
| 2430 | } | ||
| 2431 | out: | ||
| 2408 | return retval; | 2432 | return retval; |
| 2409 | } | 2433 | } |
| 2410 | 2434 | ||
diff --git a/mm/madvise.c b/mm/madvise.c index 4e196155a0c3..77916e9fc52b 100644 --- a/mm/madvise.c +++ b/mm/madvise.c | |||
| @@ -155,11 +155,14 @@ static long madvise_dontneed(struct vm_area_struct * vma, | |||
| 155 | * Other filesystems return -ENOSYS. | 155 | * Other filesystems return -ENOSYS. |
| 156 | */ | 156 | */ |
| 157 | static long madvise_remove(struct vm_area_struct *vma, | 157 | static long madvise_remove(struct vm_area_struct *vma, |
| 158 | struct vm_area_struct **prev, | ||
| 158 | unsigned long start, unsigned long end) | 159 | unsigned long start, unsigned long end) |
| 159 | { | 160 | { |
| 160 | struct address_space *mapping; | 161 | struct address_space *mapping; |
| 161 | loff_t offset, endoff; | 162 | loff_t offset, endoff; |
| 162 | 163 | ||
| 164 | *prev = vma; | ||
| 165 | |||
| 163 | if (vma->vm_flags & (VM_LOCKED|VM_NONLINEAR|VM_HUGETLB)) | 166 | if (vma->vm_flags & (VM_LOCKED|VM_NONLINEAR|VM_HUGETLB)) |
| 164 | return -EINVAL; | 167 | return -EINVAL; |
| 165 | 168 | ||
| @@ -199,7 +202,7 @@ madvise_vma(struct vm_area_struct *vma, struct vm_area_struct **prev, | |||
| 199 | error = madvise_behavior(vma, prev, start, end, behavior); | 202 | error = madvise_behavior(vma, prev, start, end, behavior); |
| 200 | break; | 203 | break; |
| 201 | case MADV_REMOVE: | 204 | case MADV_REMOVE: |
| 202 | error = madvise_remove(vma, start, end); | 205 | error = madvise_remove(vma, prev, start, end); |
| 203 | break; | 206 | break; |
| 204 | 207 | ||
| 205 | case MADV_WILLNEED: | 208 | case MADV_WILLNEED: |
diff --git a/mm/oom_kill.c b/mm/oom_kill.c index b278b8d60eee..2f3916986abf 100644 --- a/mm/oom_kill.c +++ b/mm/oom_kill.c | |||
| @@ -320,7 +320,7 @@ static int oom_kill_task(struct task_struct *p) | |||
| 320 | * Don't kill the process if any threads are set to OOM_DISABLE | 320 | * Don't kill the process if any threads are set to OOM_DISABLE |
| 321 | */ | 321 | */ |
| 322 | do_each_thread(g, q) { | 322 | do_each_thread(g, q) { |
| 323 | if (q->mm == mm && p->oomkilladj == OOM_DISABLE) | 323 | if (q->mm == mm && q->oomkilladj == OOM_DISABLE) |
| 324 | return 1; | 324 | return 1; |
| 325 | } while_each_thread(g, q); | 325 | } while_each_thread(g, q); |
| 326 | 326 | ||
diff --git a/net/core/skbuff.c b/net/core/skbuff.c index 820761f9eeef..702fa8f08747 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c | |||
| @@ -463,6 +463,7 @@ struct sk_buff *skb_clone(struct sk_buff *skb, gfp_t gfp_mask) | |||
| 463 | memcpy(n->cb, skb->cb, sizeof(skb->cb)); | 463 | memcpy(n->cb, skb->cb, sizeof(skb->cb)); |
| 464 | C(len); | 464 | C(len); |
| 465 | C(data_len); | 465 | C(data_len); |
| 466 | C(mac_len); | ||
| 466 | C(csum); | 467 | C(csum); |
| 467 | C(local_df); | 468 | C(local_df); |
| 468 | n->cloned = 1; | 469 | n->cloned = 1; |
diff --git a/net/ipv4/fib_trie.c b/net/ipv4/fib_trie.c index 72b3036bbc09..ada9b3db507d 100644 --- a/net/ipv4/fib_trie.c +++ b/net/ipv4/fib_trie.c | |||
| @@ -1527,7 +1527,6 @@ static int trie_leaf_remove(struct trie *t, t_key key) | |||
| 1527 | t->revision++; | 1527 | t->revision++; |
| 1528 | t->size--; | 1528 | t->size--; |
| 1529 | 1529 | ||
| 1530 | preempt_disable(); | ||
| 1531 | tp = NODE_PARENT(n); | 1530 | tp = NODE_PARENT(n); |
| 1532 | tnode_free((struct tnode *) n); | 1531 | tnode_free((struct tnode *) n); |
| 1533 | 1532 | ||
| @@ -1537,7 +1536,6 @@ static int trie_leaf_remove(struct trie *t, t_key key) | |||
| 1537 | rcu_assign_pointer(t->trie, trie_rebalance(t, tp)); | 1536 | rcu_assign_pointer(t->trie, trie_rebalance(t, tp)); |
| 1538 | } else | 1537 | } else |
| 1539 | rcu_assign_pointer(t->trie, NULL); | 1538 | rcu_assign_pointer(t->trie, NULL); |
| 1540 | preempt_enable(); | ||
| 1541 | 1539 | ||
| 1542 | return 1; | 1540 | return 1; |
| 1543 | } | 1541 | } |
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 74c4d103ebc2..3834b10b5115 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c | |||
| @@ -2458,11 +2458,18 @@ void __init tcp_init(void) | |||
| 2458 | sysctl_max_syn_backlog = 128; | 2458 | sysctl_max_syn_backlog = 128; |
| 2459 | } | 2459 | } |
| 2460 | 2460 | ||
| 2461 | /* Allow no more than 3/4 kernel memory (usually less) allocated to TCP */ | 2461 | /* Set the pressure threshold to be a fraction of global memory that |
| 2462 | sysctl_tcp_mem[0] = (1536 / sizeof (struct inet_bind_hashbucket)) << order; | 2462 | * is up to 1/2 at 256 MB, decreasing toward zero with the amount of |
| 2463 | sysctl_tcp_mem[1] = sysctl_tcp_mem[0] * 4 / 3; | 2463 | * memory, with a floor of 128 pages. |
| 2464 | */ | ||
| 2465 | limit = min(nr_all_pages, 1UL<<(28-PAGE_SHIFT)) >> (20-PAGE_SHIFT); | ||
| 2466 | limit = (limit * (nr_all_pages >> (20-PAGE_SHIFT))) >> (PAGE_SHIFT-11); | ||
| 2467 | limit = max(limit, 128UL); | ||
| 2468 | sysctl_tcp_mem[0] = limit / 4 * 3; | ||
| 2469 | sysctl_tcp_mem[1] = limit; | ||
| 2464 | sysctl_tcp_mem[2] = sysctl_tcp_mem[0] * 2; | 2470 | sysctl_tcp_mem[2] = sysctl_tcp_mem[0] * 2; |
| 2465 | 2471 | ||
| 2472 | /* Set per-socket limits to no more than 1/128 the pressure threshold */ | ||
| 2466 | limit = ((unsigned long)sysctl_tcp_mem[1]) << (PAGE_SHIFT - 7); | 2473 | limit = ((unsigned long)sysctl_tcp_mem[1]) << (PAGE_SHIFT - 7); |
| 2467 | max_share = min(4UL*1024*1024, limit); | 2474 | max_share = min(4UL*1024*1024, limit); |
| 2468 | 2475 | ||
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c index f57a9baa6b27..92f99927d12d 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c | |||
| @@ -1453,6 +1453,7 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb, | |||
| 1453 | First: no IPv4 options. | 1453 | First: no IPv4 options. |
| 1454 | */ | 1454 | */ |
| 1455 | newinet->opt = NULL; | 1455 | newinet->opt = NULL; |
| 1456 | newnp->ipv6_fl_list = NULL; | ||
| 1456 | 1457 | ||
| 1457 | /* Clone RX bits */ | 1458 | /* Clone RX bits */ |
| 1458 | newnp->rxopt.all = np->rxopt.all; | 1459 | newnp->rxopt.all = np->rxopt.all; |
diff --git a/security/dummy.c b/security/dummy.c index 558795b237d6..8ffd76405b5b 100644 --- a/security/dummy.c +++ b/security/dummy.c | |||
| @@ -907,7 +907,7 @@ static void dummy_d_instantiate (struct dentry *dentry, struct inode *inode) | |||
| 907 | return; | 907 | return; |
| 908 | } | 908 | } |
| 909 | 909 | ||
| 910 | static int dummy_getprocattr(struct task_struct *p, char *name, void *value, size_t size) | 910 | static int dummy_getprocattr(struct task_struct *p, char *name, char **value) |
| 911 | { | 911 | { |
| 912 | return -EINVAL; | 912 | return -EINVAL; |
| 913 | } | 913 | } |
diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c index 19a385e9968e..d41e24d6ae41 100644 --- a/security/selinux/hooks.c +++ b/security/selinux/hooks.c | |||
| @@ -4468,11 +4468,12 @@ static void selinux_d_instantiate (struct dentry *dentry, struct inode *inode) | |||
| 4468 | } | 4468 | } |
| 4469 | 4469 | ||
| 4470 | static int selinux_getprocattr(struct task_struct *p, | 4470 | static int selinux_getprocattr(struct task_struct *p, |
| 4471 | char *name, void *value, size_t size) | 4471 | char *name, char **value) |
| 4472 | { | 4472 | { |
| 4473 | struct task_security_struct *tsec; | 4473 | struct task_security_struct *tsec; |
| 4474 | u32 sid; | 4474 | u32 sid; |
| 4475 | int error; | 4475 | int error; |
| 4476 | unsigned len; | ||
| 4476 | 4477 | ||
| 4477 | if (current != p) { | 4478 | if (current != p) { |
| 4478 | error = task_has_perm(current, p, PROCESS__GETATTR); | 4479 | error = task_has_perm(current, p, PROCESS__GETATTR); |
| @@ -4500,7 +4501,10 @@ static int selinux_getprocattr(struct task_struct *p, | |||
| 4500 | if (!sid) | 4501 | if (!sid) |
| 4501 | return 0; | 4502 | return 0; |
| 4502 | 4503 | ||
| 4503 | return selinux_getsecurity(sid, value, size); | 4504 | error = security_sid_to_context(sid, value, &len); |
| 4505 | if (error) | ||
| 4506 | return error; | ||
| 4507 | return len; | ||
| 4504 | } | 4508 | } |
| 4505 | 4509 | ||
| 4506 | static int selinux_setprocattr(struct task_struct *p, | 4510 | static int selinux_setprocattr(struct task_struct *p, |
diff --git a/sound/oss/dmasound/dmasound_core.c b/sound/oss/dmasound/dmasound_core.c index a0ec886f2aa3..f4056a9c371b 100644 --- a/sound/oss/dmasound/dmasound_core.c +++ b/sound/oss/dmasound/dmasound_core.c | |||
| @@ -1346,22 +1346,34 @@ static const struct file_operations sq_fops = | |||
| 1346 | .ioctl = sq_ioctl, | 1346 | .ioctl = sq_ioctl, |
| 1347 | .open = sq_open, | 1347 | .open = sq_open, |
| 1348 | .release = sq_release, | 1348 | .release = sq_release, |
| 1349 | }; | ||
| 1350 | |||
| 1349 | #ifdef HAS_RECORD | 1351 | #ifdef HAS_RECORD |
| 1350 | .read = NULL /* default to no read for compat mode */ | 1352 | static const struct file_operations sq_fops_record = |
| 1351 | #endif | 1353 | { |
| 1354 | .owner = THIS_MODULE, | ||
| 1355 | .llseek = no_llseek, | ||
| 1356 | .write = sq_write, | ||
| 1357 | .poll = sq_poll, | ||
| 1358 | .ioctl = sq_ioctl, | ||
| 1359 | .open = sq_open, | ||
| 1360 | .release = sq_release, | ||
| 1361 | .read = sq_read, | ||
| 1352 | }; | 1362 | }; |
| 1363 | #endif | ||
| 1353 | 1364 | ||
| 1354 | static int sq_init(void) | 1365 | static int sq_init(void) |
| 1355 | { | 1366 | { |
| 1367 | const struct file_operations *fops = &sq_fops; | ||
| 1356 | #ifndef MODULE | 1368 | #ifndef MODULE |
| 1357 | int sq_unit; | 1369 | int sq_unit; |
| 1358 | #endif | 1370 | #endif |
| 1359 | 1371 | ||
| 1360 | #ifdef HAS_RECORD | 1372 | #ifdef HAS_RECORD |
| 1361 | if (dmasound.mach.record) | 1373 | if (dmasound.mach.record) |
| 1362 | sq_fops.read = sq_read ; | 1374 | fops = &sq_fops_record; |
| 1363 | #endif | 1375 | #endif |
| 1364 | sq_unit = register_sound_dsp(&sq_fops, -1); | 1376 | sq_unit = register_sound_dsp(fops, -1); |
| 1365 | if (sq_unit < 0) { | 1377 | if (sq_unit < 0) { |
| 1366 | printk(KERN_ERR "dmasound_core: couldn't register fops\n") ; | 1378 | printk(KERN_ERR "dmasound_core: couldn't register fops\n") ; |
| 1367 | return sq_unit ; | 1379 | return sq_unit ; |
