diff options
142 files changed, 1244 insertions, 741 deletions
diff --git a/MAINTAINERS b/MAINTAINERS index 50b8148448fd..668682d1f5fa 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -1220,7 +1220,7 @@ F: drivers/auxdisplay/ | |||
| 1220 | F: include/linux/cfag12864b.h | 1220 | F: include/linux/cfag12864b.h |
| 1221 | 1221 | ||
| 1222 | AVR32 ARCHITECTURE | 1222 | AVR32 ARCHITECTURE |
| 1223 | M: Haavard Skinnemoen <hskinnemoen@atmel.com> | 1223 | M: Hans-Christian Egtvedt <hans-christian.egtvedt@atmel.com> |
| 1224 | W: http://www.atmel.com/products/AVR32/ | 1224 | W: http://www.atmel.com/products/AVR32/ |
| 1225 | W: http://avr32linux.org/ | 1225 | W: http://avr32linux.org/ |
| 1226 | W: http://avrfreaks.net/ | 1226 | W: http://avrfreaks.net/ |
| @@ -1228,7 +1228,7 @@ S: Supported | |||
| 1228 | F: arch/avr32/ | 1228 | F: arch/avr32/ |
| 1229 | 1229 | ||
| 1230 | AVR32/AT32AP MACHINE SUPPORT | 1230 | AVR32/AT32AP MACHINE SUPPORT |
| 1231 | M: Haavard Skinnemoen <hskinnemoen@atmel.com> | 1231 | M: Hans-Christian Egtvedt <hans-christian.egtvedt@atmel.com> |
| 1232 | S: Supported | 1232 | S: Supported |
| 1233 | F: arch/avr32/mach-at32ap/ | 1233 | F: arch/avr32/mach-at32ap/ |
| 1234 | 1234 | ||
| @@ -2199,6 +2199,12 @@ W: http://acpi4asus.sf.net | |||
| 2199 | S: Maintained | 2199 | S: Maintained |
| 2200 | F: drivers/platform/x86/eeepc-laptop.c | 2200 | F: drivers/platform/x86/eeepc-laptop.c |
| 2201 | 2201 | ||
| 2202 | EFIFB FRAMEBUFFER DRIVER | ||
| 2203 | L: linux-fbdev@vger.kernel.org | ||
| 2204 | M: Peter Jones <pjones@redhat.com> | ||
| 2205 | S: Maintained | ||
| 2206 | F: drivers/video/efifb.c | ||
| 2207 | |||
| 2202 | EFS FILESYSTEM | 2208 | EFS FILESYSTEM |
| 2203 | W: http://aeschi.ch.eu.org/efs/ | 2209 | W: http://aeschi.ch.eu.org/efs/ |
| 2204 | S: Orphan | 2210 | S: Orphan |
| @@ -2662,6 +2668,8 @@ M: Guenter Roeck <guenter.roeck@ericsson.com> | |||
| 2662 | L: lm-sensors@lm-sensors.org | 2668 | L: lm-sensors@lm-sensors.org |
| 2663 | W: http://www.lm-sensors.org/ | 2669 | W: http://www.lm-sensors.org/ |
| 2664 | T: quilt kernel.org/pub/linux/kernel/people/jdelvare/linux-2.6/jdelvare-hwmon/ | 2670 | T: quilt kernel.org/pub/linux/kernel/people/jdelvare/linux-2.6/jdelvare-hwmon/ |
| 2671 | T: quilt kernel.org/pub/linux/kernel/people/groeck/linux-staging/ | ||
| 2672 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging.git | ||
| 2665 | S: Maintained | 2673 | S: Maintained |
| 2666 | F: Documentation/hwmon/ | 2674 | F: Documentation/hwmon/ |
| 2667 | F: drivers/hwmon/ | 2675 | F: drivers/hwmon/ |
| @@ -3899,10 +3907,8 @@ F: Documentation/serial/moxa-smartio | |||
| 3899 | F: drivers/char/mxser.* | 3907 | F: drivers/char/mxser.* |
| 3900 | 3908 | ||
| 3901 | MSI LAPTOP SUPPORT | 3909 | MSI LAPTOP SUPPORT |
| 3902 | M: Lennart Poettering <mzxreary@0pointer.de> | 3910 | M: Lee, Chun-Yi <jlee@novell.com> |
| 3903 | L: platform-driver-x86@vger.kernel.org | 3911 | L: platform-driver-x86@vger.kernel.org |
| 3904 | W: https://tango.0pointer.de/mailman/listinfo/s270-linux | ||
| 3905 | W: http://0pointer.de/lennart/tchibo.html | ||
| 3906 | S: Maintained | 3912 | S: Maintained |
| 3907 | F: drivers/platform/x86/msi-laptop.c | 3913 | F: drivers/platform/x86/msi-laptop.c |
| 3908 | 3914 | ||
| @@ -3919,8 +3925,10 @@ S: Supported | |||
| 3919 | F: drivers/mfd/ | 3925 | F: drivers/mfd/ |
| 3920 | 3926 | ||
| 3921 | MULTIMEDIA CARD (MMC), SECURE DIGITAL (SD) AND SDIO SUBSYSTEM | 3927 | MULTIMEDIA CARD (MMC), SECURE DIGITAL (SD) AND SDIO SUBSYSTEM |
| 3922 | S: Orphan | 3928 | M: Chris Ball <cjb@laptop.org> |
| 3923 | L: linux-mmc@vger.kernel.org | 3929 | L: linux-mmc@vger.kernel.org |
| 3930 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/cjb/mmc.git | ||
| 3931 | S: Maintained | ||
| 3924 | F: drivers/mmc/ | 3932 | F: drivers/mmc/ |
| 3925 | F: include/linux/mmc/ | 3933 | F: include/linux/mmc/ |
| 3926 | 3934 | ||
| @@ -5091,8 +5099,10 @@ S: Maintained | |||
| 5091 | F: drivers/mmc/host/sdricoh_cs.c | 5099 | F: drivers/mmc/host/sdricoh_cs.c |
| 5092 | 5100 | ||
| 5093 | SECURE DIGITAL HOST CONTROLLER INTERFACE (SDHCI) DRIVER | 5101 | SECURE DIGITAL HOST CONTROLLER INTERFACE (SDHCI) DRIVER |
| 5094 | S: Orphan | 5102 | M: Chris Ball <cjb@laptop.org> |
| 5095 | L: linux-mmc@vger.kernel.org | 5103 | L: linux-mmc@vger.kernel.org |
| 5104 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/cjb/mmc.git | ||
| 5105 | S: Maintained | ||
| 5096 | F: drivers/mmc/host/sdhci.* | 5106 | F: drivers/mmc/host/sdhci.* |
| 5097 | 5107 | ||
| 5098 | SECURE DIGITAL HOST CONTROLLER INTERFACE, OPEN FIRMWARE BINDINGS (SDHCI-OF) | 5108 | SECURE DIGITAL HOST CONTROLLER INTERFACE, OPEN FIRMWARE BINDINGS (SDHCI-OF) |
diff --git a/arch/Kconfig b/arch/Kconfig index 4877a8c8ee16..fe48fc7a3eba 100644 --- a/arch/Kconfig +++ b/arch/Kconfig | |||
| @@ -32,8 +32,9 @@ config HAVE_OPROFILE | |||
| 32 | 32 | ||
| 33 | config KPROBES | 33 | config KPROBES |
| 34 | bool "Kprobes" | 34 | bool "Kprobes" |
| 35 | depends on KALLSYMS && MODULES | 35 | depends on MODULES |
| 36 | depends on HAVE_KPROBES | 36 | depends on HAVE_KPROBES |
| 37 | select KALLSYMS | ||
| 37 | help | 38 | help |
| 38 | Kprobes allows you to trap at almost any kernel address and | 39 | Kprobes allows you to trap at almost any kernel address and |
| 39 | execute a callback function. register_kprobe() establishes | 40 | execute a callback function. register_kprobe() establishes |
| @@ -45,7 +46,6 @@ config OPTPROBES | |||
| 45 | def_bool y | 46 | def_bool y |
| 46 | depends on KPROBES && HAVE_OPTPROBES | 47 | depends on KPROBES && HAVE_OPTPROBES |
| 47 | depends on !PREEMPT | 48 | depends on !PREEMPT |
| 48 | select KALLSYMS_ALL | ||
| 49 | 49 | ||
| 50 | config HAVE_EFFICIENT_UNALIGNED_ACCESS | 50 | config HAVE_EFFICIENT_UNALIGNED_ACCESS |
| 51 | bool | 51 | bool |
diff --git a/arch/alpha/kernel/entry.S b/arch/alpha/kernel/entry.S index ab1ee0ab082b..6d159cee5f2f 100644 --- a/arch/alpha/kernel/entry.S +++ b/arch/alpha/kernel/entry.S | |||
| @@ -73,8 +73,6 @@ | |||
| 73 | ldq $20, HAE_REG($19); \ | 73 | ldq $20, HAE_REG($19); \ |
| 74 | stq $21, HAE_CACHE($19); \ | 74 | stq $21, HAE_CACHE($19); \ |
| 75 | stq $21, 0($20); \ | 75 | stq $21, 0($20); \ |
| 76 | ldq $0, 0($sp); \ | ||
| 77 | ldq $1, 8($sp); \ | ||
| 78 | 99:; \ | 76 | 99:; \ |
| 79 | ldq $19, 72($sp); \ | 77 | ldq $19, 72($sp); \ |
| 80 | ldq $20, 80($sp); \ | 78 | ldq $20, 80($sp); \ |
| @@ -316,7 +314,7 @@ ret_from_sys_call: | |||
| 316 | cmovne $26, 0, $19 /* $19 = 0 => non-restartable */ | 314 | cmovne $26, 0, $19 /* $19 = 0 => non-restartable */ |
| 317 | ldq $0, SP_OFF($sp) | 315 | ldq $0, SP_OFF($sp) |
| 318 | and $0, 8, $0 | 316 | and $0, 8, $0 |
| 319 | beq $0, restore_all | 317 | beq $0, ret_to_kernel |
| 320 | ret_to_user: | 318 | ret_to_user: |
| 321 | /* Make sure need_resched and sigpending don't change between | 319 | /* Make sure need_resched and sigpending don't change between |
| 322 | sampling and the rti. */ | 320 | sampling and the rti. */ |
| @@ -329,6 +327,11 @@ restore_all: | |||
| 329 | RESTORE_ALL | 327 | RESTORE_ALL |
| 330 | call_pal PAL_rti | 328 | call_pal PAL_rti |
| 331 | 329 | ||
| 330 | ret_to_kernel: | ||
| 331 | lda $16, 7 | ||
| 332 | call_pal PAL_swpipl | ||
| 333 | br restore_all | ||
| 334 | |||
| 332 | .align 3 | 335 | .align 3 |
| 333 | $syscall_error: | 336 | $syscall_error: |
| 334 | /* | 337 | /* |
| @@ -657,7 +660,7 @@ kernel_thread: | |||
| 657 | /* We don't actually care for a3 success widgetry in the kernel. | 660 | /* We don't actually care for a3 success widgetry in the kernel. |
| 658 | Not for positive errno values. */ | 661 | Not for positive errno values. */ |
| 659 | stq $0, 0($sp) /* $0 */ | 662 | stq $0, 0($sp) /* $0 */ |
| 660 | br restore_all | 663 | br ret_to_kernel |
| 661 | .end kernel_thread | 664 | .end kernel_thread |
| 662 | 665 | ||
| 663 | /* | 666 | /* |
| @@ -912,15 +915,6 @@ sys_execve: | |||
| 912 | .end sys_execve | 915 | .end sys_execve |
| 913 | 916 | ||
| 914 | .align 4 | 917 | .align 4 |
| 915 | .globl osf_sigprocmask | ||
| 916 | .ent osf_sigprocmask | ||
| 917 | osf_sigprocmask: | ||
| 918 | .prologue 0 | ||
| 919 | mov $sp, $18 | ||
| 920 | jmp $31, sys_osf_sigprocmask | ||
| 921 | .end osf_sigprocmask | ||
| 922 | |||
| 923 | .align 4 | ||
| 924 | .globl alpha_ni_syscall | 918 | .globl alpha_ni_syscall |
| 925 | .ent alpha_ni_syscall | 919 | .ent alpha_ni_syscall |
| 926 | alpha_ni_syscall: | 920 | alpha_ni_syscall: |
diff --git a/arch/alpha/kernel/process.c b/arch/alpha/kernel/process.c index 842dba308eab..3ec35066f1dc 100644 --- a/arch/alpha/kernel/process.c +++ b/arch/alpha/kernel/process.c | |||
| @@ -356,7 +356,7 @@ dump_elf_thread(elf_greg_t *dest, struct pt_regs *pt, struct thread_info *ti) | |||
| 356 | dest[27] = pt->r27; | 356 | dest[27] = pt->r27; |
| 357 | dest[28] = pt->r28; | 357 | dest[28] = pt->r28; |
| 358 | dest[29] = pt->gp; | 358 | dest[29] = pt->gp; |
| 359 | dest[30] = rdusp(); | 359 | dest[30] = ti == current_thread_info() ? rdusp() : ti->pcb.usp; |
| 360 | dest[31] = pt->pc; | 360 | dest[31] = pt->pc; |
| 361 | 361 | ||
| 362 | /* Once upon a time this was the PS value. Which is stupid | 362 | /* Once upon a time this was the PS value. Which is stupid |
diff --git a/arch/alpha/kernel/signal.c b/arch/alpha/kernel/signal.c index 0f6b51ae865a..779780a332d3 100644 --- a/arch/alpha/kernel/signal.c +++ b/arch/alpha/kernel/signal.c | |||
| @@ -41,46 +41,20 @@ static void do_signal(struct pt_regs *, struct switch_stack *, | |||
| 41 | /* | 41 | /* |
| 42 | * The OSF/1 sigprocmask calling sequence is different from the | 42 | * The OSF/1 sigprocmask calling sequence is different from the |
| 43 | * C sigprocmask() sequence.. | 43 | * C sigprocmask() sequence.. |
| 44 | * | ||
| 45 | * how: | ||
| 46 | * 1 - SIG_BLOCK | ||
| 47 | * 2 - SIG_UNBLOCK | ||
| 48 | * 3 - SIG_SETMASK | ||
| 49 | * | ||
| 50 | * We change the range to -1 .. 1 in order to let gcc easily | ||
| 51 | * use the conditional move instructions. | ||
| 52 | * | ||
| 53 | * Note that we don't need to acquire the kernel lock for SMP | ||
| 54 | * operation, as all of this is local to this thread. | ||
| 55 | */ | 44 | */ |
| 56 | SYSCALL_DEFINE3(osf_sigprocmask, int, how, unsigned long, newmask, | 45 | SYSCALL_DEFINE2(osf_sigprocmask, int, how, unsigned long, newmask) |
| 57 | struct pt_regs *, regs) | ||
| 58 | { | 46 | { |
| 59 | unsigned long oldmask = -EINVAL; | 47 | sigset_t oldmask; |
| 60 | 48 | sigset_t mask; | |
| 61 | if ((unsigned long)how-1 <= 2) { | 49 | unsigned long res; |
| 62 | long sign = how-2; /* -1 .. 1 */ | 50 | |
| 63 | unsigned long block, unblock; | 51 | siginitset(&mask, newmask & ~_BLOCKABLE); |
| 64 | 52 | res = siprocmask(how, &mask, &oldmask); | |
| 65 | newmask &= _BLOCKABLE; | 53 | if (!res) { |
| 66 | spin_lock_irq(¤t->sighand->siglock); | 54 | force_successful_syscall_return(); |
| 67 | oldmask = current->blocked.sig[0]; | 55 | res = oldmask->sig[0]; |
| 68 | |||
| 69 | unblock = oldmask & ~newmask; | ||
| 70 | block = oldmask | newmask; | ||
| 71 | if (!sign) | ||
| 72 | block = unblock; | ||
| 73 | if (sign <= 0) | ||
| 74 | newmask = block; | ||
| 75 | if (_NSIG_WORDS > 1 && sign > 0) | ||
| 76 | sigemptyset(¤t->blocked); | ||
| 77 | current->blocked.sig[0] = newmask; | ||
| 78 | recalc_sigpending(); | ||
| 79 | spin_unlock_irq(¤t->sighand->siglock); | ||
| 80 | |||
| 81 | regs->r0 = 0; /* special no error return */ | ||
| 82 | } | 56 | } |
| 83 | return oldmask; | 57 | return res; |
| 84 | } | 58 | } |
| 85 | 59 | ||
| 86 | SYSCALL_DEFINE3(osf_sigaction, int, sig, | 60 | SYSCALL_DEFINE3(osf_sigaction, int, sig, |
| @@ -94,9 +68,9 @@ SYSCALL_DEFINE3(osf_sigaction, int, sig, | |||
| 94 | old_sigset_t mask; | 68 | old_sigset_t mask; |
| 95 | if (!access_ok(VERIFY_READ, act, sizeof(*act)) || | 69 | if (!access_ok(VERIFY_READ, act, sizeof(*act)) || |
| 96 | __get_user(new_ka.sa.sa_handler, &act->sa_handler) || | 70 | __get_user(new_ka.sa.sa_handler, &act->sa_handler) || |
| 97 | __get_user(new_ka.sa.sa_flags, &act->sa_flags)) | 71 | __get_user(new_ka.sa.sa_flags, &act->sa_flags) || |
| 72 | __get_user(mask, &act->sa_mask)) | ||
| 98 | return -EFAULT; | 73 | return -EFAULT; |
| 99 | __get_user(mask, &act->sa_mask); | ||
| 100 | siginitset(&new_ka.sa.sa_mask, mask); | 74 | siginitset(&new_ka.sa.sa_mask, mask); |
| 101 | new_ka.ka_restorer = NULL; | 75 | new_ka.ka_restorer = NULL; |
| 102 | } | 76 | } |
| @@ -106,9 +80,9 @@ SYSCALL_DEFINE3(osf_sigaction, int, sig, | |||
| 106 | if (!ret && oact) { | 80 | if (!ret && oact) { |
| 107 | if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) || | 81 | if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) || |
| 108 | __put_user(old_ka.sa.sa_handler, &oact->sa_handler) || | 82 | __put_user(old_ka.sa.sa_handler, &oact->sa_handler) || |
| 109 | __put_user(old_ka.sa.sa_flags, &oact->sa_flags)) | 83 | __put_user(old_ka.sa.sa_flags, &oact->sa_flags) || |
| 84 | __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask)) | ||
| 110 | return -EFAULT; | 85 | return -EFAULT; |
| 111 | __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask); | ||
| 112 | } | 86 | } |
| 113 | 87 | ||
| 114 | return ret; | 88 | return ret; |
diff --git a/arch/alpha/kernel/systbls.S b/arch/alpha/kernel/systbls.S index ce594ef533cc..a6a1de9db16f 100644 --- a/arch/alpha/kernel/systbls.S +++ b/arch/alpha/kernel/systbls.S | |||
| @@ -58,7 +58,7 @@ sys_call_table: | |||
| 58 | .quad sys_open /* 45 */ | 58 | .quad sys_open /* 45 */ |
| 59 | .quad alpha_ni_syscall | 59 | .quad alpha_ni_syscall |
| 60 | .quad sys_getxgid | 60 | .quad sys_getxgid |
| 61 | .quad osf_sigprocmask | 61 | .quad sys_osf_sigprocmask |
| 62 | .quad alpha_ni_syscall | 62 | .quad alpha_ni_syscall |
| 63 | .quad alpha_ni_syscall /* 50 */ | 63 | .quad alpha_ni_syscall /* 50 */ |
| 64 | .quad sys_acct | 64 | .quad sys_acct |
diff --git a/arch/arm/common/it8152.c b/arch/arm/common/it8152.c index 7974baacafce..1bec96e85196 100644 --- a/arch/arm/common/it8152.c +++ b/arch/arm/common/it8152.c | |||
| @@ -271,6 +271,14 @@ int dma_needs_bounce(struct device *dev, dma_addr_t dma_addr, size_t size) | |||
| 271 | ((dma_addr + size - PHYS_OFFSET) >= SZ_64M); | 271 | ((dma_addr + size - PHYS_OFFSET) >= SZ_64M); |
| 272 | } | 272 | } |
| 273 | 273 | ||
| 274 | int dma_set_coherent_mask(struct device *dev, u64 mask) | ||
| 275 | { | ||
| 276 | if (mask >= PHYS_OFFSET + SZ_64M - 1) | ||
| 277 | return 0; | ||
| 278 | |||
| 279 | return -EIO; | ||
| 280 | } | ||
| 281 | |||
| 274 | int __init it8152_pci_setup(int nr, struct pci_sys_data *sys) | 282 | int __init it8152_pci_setup(int nr, struct pci_sys_data *sys) |
| 275 | { | 283 | { |
| 276 | it8152_io.start = IT8152_IO_BASE + 0x12000; | 284 | it8152_io.start = IT8152_IO_BASE + 0x12000; |
diff --git a/arch/arm/mach-ixp4xx/common-pci.c b/arch/arm/mach-ixp4xx/common-pci.c index 61cd4d64b985..24498a932ba6 100644 --- a/arch/arm/mach-ixp4xx/common-pci.c +++ b/arch/arm/mach-ixp4xx/common-pci.c | |||
| @@ -503,6 +503,14 @@ struct pci_bus * __devinit ixp4xx_scan_bus(int nr, struct pci_sys_data *sys) | |||
| 503 | return pci_scan_bus(sys->busnr, &ixp4xx_ops, sys); | 503 | return pci_scan_bus(sys->busnr, &ixp4xx_ops, sys); |
| 504 | } | 504 | } |
| 505 | 505 | ||
| 506 | int dma_set_coherent_mask(struct device *dev, u64 mask) | ||
| 507 | { | ||
| 508 | if (mask >= SZ_64M - 1) | ||
| 509 | return 0; | ||
| 510 | |||
| 511 | return -EIO; | ||
| 512 | } | ||
| 513 | |||
| 506 | EXPORT_SYMBOL(ixp4xx_pci_read); | 514 | EXPORT_SYMBOL(ixp4xx_pci_read); |
| 507 | EXPORT_SYMBOL(ixp4xx_pci_write); | 515 | EXPORT_SYMBOL(ixp4xx_pci_write); |
| 508 | 516 | ||
diff --git a/arch/arm/mach-ixp4xx/include/mach/hardware.h b/arch/arm/mach-ixp4xx/include/mach/hardware.h index f91ca6d4fbe8..8138371c406e 100644 --- a/arch/arm/mach-ixp4xx/include/mach/hardware.h +++ b/arch/arm/mach-ixp4xx/include/mach/hardware.h | |||
| @@ -26,6 +26,8 @@ | |||
| 26 | #define PCIBIOS_MAX_MEM 0x4BFFFFFF | 26 | #define PCIBIOS_MAX_MEM 0x4BFFFFFF |
| 27 | #endif | 27 | #endif |
| 28 | 28 | ||
| 29 | #define ARCH_HAS_DMA_SET_COHERENT_MASK | ||
| 30 | |||
| 29 | #define pcibios_assign_all_busses() 1 | 31 | #define pcibios_assign_all_busses() 1 |
| 30 | 32 | ||
| 31 | /* Register locations and bits */ | 33 | /* Register locations and bits */ |
diff --git a/arch/arm/mach-pxa/include/mach/hardware.h b/arch/arm/mach-pxa/include/mach/hardware.h index 7f64d24cd564..428cc7bda9a4 100644 --- a/arch/arm/mach-pxa/include/mach/hardware.h +++ b/arch/arm/mach-pxa/include/mach/hardware.h | |||
| @@ -309,7 +309,7 @@ extern unsigned long get_clock_tick_rate(void); | |||
| 309 | #define PCIBIOS_MIN_IO 0 | 309 | #define PCIBIOS_MIN_IO 0 |
| 310 | #define PCIBIOS_MIN_MEM 0 | 310 | #define PCIBIOS_MIN_MEM 0 |
| 311 | #define pcibios_assign_all_busses() 1 | 311 | #define pcibios_assign_all_busses() 1 |
| 312 | #define ARCH_HAS_DMA_SET_COHERENT_MASK | ||
| 312 | #endif | 313 | #endif |
| 313 | 314 | ||
| 314 | |||
| 315 | #endif /* _ASM_ARCH_HARDWARE_H */ | 315 | #endif /* _ASM_ARCH_HARDWARE_H */ |
diff --git a/arch/arm/mach-pxa/include/mach/io.h b/arch/arm/mach-pxa/include/mach/io.h index 262691fb97d8..fdca3be47d9b 100644 --- a/arch/arm/mach-pxa/include/mach/io.h +++ b/arch/arm/mach-pxa/include/mach/io.h | |||
| @@ -6,6 +6,8 @@ | |||
| 6 | #ifndef __ASM_ARM_ARCH_IO_H | 6 | #ifndef __ASM_ARM_ARCH_IO_H |
| 7 | #define __ASM_ARM_ARCH_IO_H | 7 | #define __ASM_ARM_ARCH_IO_H |
| 8 | 8 | ||
| 9 | #include <mach/hardware.h> | ||
| 10 | |||
| 9 | #define IO_SPACE_LIMIT 0xffffffff | 11 | #define IO_SPACE_LIMIT 0xffffffff |
| 10 | 12 | ||
| 11 | /* | 13 | /* |
diff --git a/arch/m32r/include/asm/signal.h b/arch/m32r/include/asm/signal.h index 9c1acb2b1a92..b2eeb0de1c8d 100644 --- a/arch/m32r/include/asm/signal.h +++ b/arch/m32r/include/asm/signal.h | |||
| @@ -157,7 +157,6 @@ typedef struct sigaltstack { | |||
| 157 | #undef __HAVE_ARCH_SIG_BITOPS | 157 | #undef __HAVE_ARCH_SIG_BITOPS |
| 158 | 158 | ||
| 159 | struct pt_regs; | 159 | struct pt_regs; |
| 160 | extern int do_signal(struct pt_regs *regs, sigset_t *oldset); | ||
| 161 | 160 | ||
| 162 | #define ptrace_signal_deliver(regs, cookie) do { } while (0) | 161 | #define ptrace_signal_deliver(regs, cookie) do { } while (0) |
| 163 | 162 | ||
diff --git a/arch/m32r/include/asm/unistd.h b/arch/m32r/include/asm/unistd.h index 76125777483c..c70545689da8 100644 --- a/arch/m32r/include/asm/unistd.h +++ b/arch/m32r/include/asm/unistd.h | |||
| @@ -351,6 +351,7 @@ | |||
| 351 | #define __ARCH_WANT_SYS_OLD_GETRLIMIT /*will be unused*/ | 351 | #define __ARCH_WANT_SYS_OLD_GETRLIMIT /*will be unused*/ |
| 352 | #define __ARCH_WANT_SYS_OLDUMOUNT | 352 | #define __ARCH_WANT_SYS_OLDUMOUNT |
| 353 | #define __ARCH_WANT_SYS_RT_SIGACTION | 353 | #define __ARCH_WANT_SYS_RT_SIGACTION |
| 354 | #define __ARCH_WANT_SYS_RT_SIGSUSPEND | ||
| 354 | 355 | ||
| 355 | #define __IGNORE_lchown | 356 | #define __IGNORE_lchown |
| 356 | #define __IGNORE_setuid | 357 | #define __IGNORE_setuid |
diff --git a/arch/m32r/kernel/entry.S b/arch/m32r/kernel/entry.S index 403869833b98..225412bc227e 100644 --- a/arch/m32r/kernel/entry.S +++ b/arch/m32r/kernel/entry.S | |||
| @@ -235,10 +235,9 @@ work_resched: | |||
| 235 | work_notifysig: ; deal with pending signals and | 235 | work_notifysig: ; deal with pending signals and |
| 236 | ; notify-resume requests | 236 | ; notify-resume requests |
| 237 | mv r0, sp ; arg1 : struct pt_regs *regs | 237 | mv r0, sp ; arg1 : struct pt_regs *regs |
| 238 | ldi r1, #0 ; arg2 : sigset_t *oldset | 238 | mv r1, r9 ; arg2 : __u32 thread_info_flags |
| 239 | mv r2, r9 ; arg3 : __u32 thread_info_flags | ||
| 240 | bl do_notify_resume | 239 | bl do_notify_resume |
| 241 | bra restore_all | 240 | bra resume_userspace |
| 242 | 241 | ||
| 243 | ; perform syscall exit tracing | 242 | ; perform syscall exit tracing |
| 244 | ALIGN | 243 | ALIGN |
diff --git a/arch/m32r/kernel/ptrace.c b/arch/m32r/kernel/ptrace.c index e555091eb97c..0021ade4cba8 100644 --- a/arch/m32r/kernel/ptrace.c +++ b/arch/m32r/kernel/ptrace.c | |||
| @@ -592,16 +592,17 @@ void user_enable_single_step(struct task_struct *child) | |||
| 592 | 592 | ||
| 593 | if (access_process_vm(child, pc&~3, &insn, sizeof(insn), 0) | 593 | if (access_process_vm(child, pc&~3, &insn, sizeof(insn), 0) |
| 594 | != sizeof(insn)) | 594 | != sizeof(insn)) |
| 595 | break; | 595 | return -EIO; |
| 596 | 596 | ||
| 597 | compute_next_pc(insn, pc, &next_pc, child); | 597 | compute_next_pc(insn, pc, &next_pc, child); |
| 598 | if (next_pc & 0x80000000) | 598 | if (next_pc & 0x80000000) |
| 599 | break; | 599 | return -EIO; |
| 600 | 600 | ||
| 601 | if (embed_debug_trap(child, next_pc)) | 601 | if (embed_debug_trap(child, next_pc)) |
| 602 | break; | 602 | return -EIO; |
| 603 | 603 | ||
| 604 | invalidate_cache(); | 604 | invalidate_cache(); |
| 605 | return 0; | ||
| 605 | } | 606 | } |
| 606 | 607 | ||
| 607 | void user_disable_single_step(struct task_struct *child) | 608 | void user_disable_single_step(struct task_struct *child) |
diff --git a/arch/m32r/kernel/signal.c b/arch/m32r/kernel/signal.c index 144b0f124fc7..7bbe38645ed5 100644 --- a/arch/m32r/kernel/signal.c +++ b/arch/m32r/kernel/signal.c | |||
| @@ -28,37 +28,6 @@ | |||
| 28 | 28 | ||
| 29 | #define DEBUG_SIG 0 | 29 | #define DEBUG_SIG 0 |
| 30 | 30 | ||
| 31 | #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP))) | ||
| 32 | |||
| 33 | int do_signal(struct pt_regs *, sigset_t *); | ||
| 34 | |||
| 35 | asmlinkage int | ||
| 36 | sys_rt_sigsuspend(sigset_t __user *unewset, size_t sigsetsize, | ||
| 37 | unsigned long r2, unsigned long r3, unsigned long r4, | ||
| 38 | unsigned long r5, unsigned long r6, struct pt_regs *regs) | ||
| 39 | { | ||
| 40 | sigset_t newset; | ||
| 41 | |||
| 42 | /* XXX: Don't preclude handling different sized sigset_t's. */ | ||
| 43 | if (sigsetsize != sizeof(sigset_t)) | ||
| 44 | return -EINVAL; | ||
| 45 | |||
| 46 | if (copy_from_user(&newset, unewset, sizeof(newset))) | ||
| 47 | return -EFAULT; | ||
| 48 | sigdelsetmask(&newset, sigmask(SIGKILL)|sigmask(SIGSTOP)); | ||
| 49 | |||
| 50 | spin_lock_irq(¤t->sighand->siglock); | ||
| 51 | current->saved_sigmask = current->blocked; | ||
| 52 | current->blocked = newset; | ||
| 53 | recalc_sigpending(); | ||
| 54 | spin_unlock_irq(¤t->sighand->siglock); | ||
| 55 | |||
| 56 | current->state = TASK_INTERRUPTIBLE; | ||
| 57 | schedule(); | ||
| 58 | set_thread_flag(TIF_RESTORE_SIGMASK); | ||
| 59 | return -ERESTARTNOHAND; | ||
| 60 | } | ||
| 61 | |||
| 62 | asmlinkage int | 31 | asmlinkage int |
| 63 | sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss, | 32 | sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss, |
| 64 | unsigned long r2, unsigned long r3, unsigned long r4, | 33 | unsigned long r2, unsigned long r3, unsigned long r4, |
| @@ -218,7 +187,7 @@ get_sigframe(struct k_sigaction *ka, unsigned long sp, size_t frame_size) | |||
| 218 | return (void __user *)((sp - frame_size) & -8ul); | 187 | return (void __user *)((sp - frame_size) & -8ul); |
| 219 | } | 188 | } |
| 220 | 189 | ||
| 221 | static void setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | 190 | static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, |
| 222 | sigset_t *set, struct pt_regs *regs) | 191 | sigset_t *set, struct pt_regs *regs) |
| 223 | { | 192 | { |
| 224 | struct rt_sigframe __user *frame; | 193 | struct rt_sigframe __user *frame; |
| @@ -275,22 +244,34 @@ static void setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
| 275 | current->comm, current->pid, frame, regs->pc); | 244 | current->comm, current->pid, frame, regs->pc); |
| 276 | #endif | 245 | #endif |
| 277 | 246 | ||
| 278 | return; | 247 | return 0; |
| 279 | 248 | ||
| 280 | give_sigsegv: | 249 | give_sigsegv: |
| 281 | force_sigsegv(sig, current); | 250 | force_sigsegv(sig, current); |
| 251 | return -EFAULT; | ||
| 252 | } | ||
| 253 | |||
| 254 | static int prev_insn(struct pt_regs *regs) | ||
| 255 | { | ||
| 256 | u16 inst; | ||
| 257 | if (get_user(&inst, (u16 __user *)(regs->bpc - 2))) | ||
| 258 | return -EFAULT; | ||
| 259 | if ((inst & 0xfff0) == 0x10f0) /* trap ? */ | ||
| 260 | regs->bpc -= 2; | ||
| 261 | else | ||
| 262 | regs->bpc -= 4; | ||
| 263 | regs->syscall_nr = -1; | ||
| 264 | return 0; | ||
| 282 | } | 265 | } |
| 283 | 266 | ||
| 284 | /* | 267 | /* |
| 285 | * OK, we're invoking a handler | 268 | * OK, we're invoking a handler |
| 286 | */ | 269 | */ |
| 287 | 270 | ||
| 288 | static void | 271 | static int |
| 289 | handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info, | 272 | handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info, |
| 290 | sigset_t *oldset, struct pt_regs *regs) | 273 | sigset_t *oldset, struct pt_regs *regs) |
| 291 | { | 274 | { |
| 292 | unsigned short inst; | ||
| 293 | |||
| 294 | /* Are we from a system call? */ | 275 | /* Are we from a system call? */ |
| 295 | if (regs->syscall_nr >= 0) { | 276 | if (regs->syscall_nr >= 0) { |
| 296 | /* If so, check system call restarting.. */ | 277 | /* If so, check system call restarting.. */ |
| @@ -308,16 +289,14 @@ handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info, | |||
| 308 | /* fallthrough */ | 289 | /* fallthrough */ |
| 309 | case -ERESTARTNOINTR: | 290 | case -ERESTARTNOINTR: |
| 310 | regs->r0 = regs->orig_r0; | 291 | regs->r0 = regs->orig_r0; |
| 311 | inst = *(unsigned short *)(regs->bpc - 2); | 292 | if (prev_insn(regs) < 0) |
| 312 | if ((inst & 0xfff0) == 0x10f0) /* trap ? */ | 293 | return -EFAULT; |
| 313 | regs->bpc -= 2; | ||
| 314 | else | ||
| 315 | regs->bpc -= 4; | ||
| 316 | } | 294 | } |
| 317 | } | 295 | } |
| 318 | 296 | ||
| 319 | /* Set up the stack frame */ | 297 | /* Set up the stack frame */ |
| 320 | setup_rt_frame(sig, ka, info, oldset, regs); | 298 | if (setup_rt_frame(sig, ka, info, oldset, regs)) |
| 299 | return -EFAULT; | ||
| 321 | 300 | ||
| 322 | spin_lock_irq(¤t->sighand->siglock); | 301 | spin_lock_irq(¤t->sighand->siglock); |
| 323 | sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask); | 302 | sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask); |
| @@ -325,6 +304,7 @@ handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info, | |||
| 325 | sigaddset(¤t->blocked,sig); | 304 | sigaddset(¤t->blocked,sig); |
| 326 | recalc_sigpending(); | 305 | recalc_sigpending(); |
| 327 | spin_unlock_irq(¤t->sighand->siglock); | 306 | spin_unlock_irq(¤t->sighand->siglock); |
| 307 | return 0; | ||
| 328 | } | 308 | } |
| 329 | 309 | ||
| 330 | /* | 310 | /* |
| @@ -332,12 +312,12 @@ handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info, | |||
| 332 | * want to handle. Thus you cannot kill init even with a SIGKILL even by | 312 | * want to handle. Thus you cannot kill init even with a SIGKILL even by |
| 333 | * mistake. | 313 | * mistake. |
| 334 | */ | 314 | */ |
| 335 | int do_signal(struct pt_regs *regs, sigset_t *oldset) | 315 | static void do_signal(struct pt_regs *regs) |
| 336 | { | 316 | { |
| 337 | siginfo_t info; | 317 | siginfo_t info; |
| 338 | int signr; | 318 | int signr; |
| 339 | struct k_sigaction ka; | 319 | struct k_sigaction ka; |
| 340 | unsigned short inst; | 320 | sigset_t *oldset; |
| 341 | 321 | ||
| 342 | /* | 322 | /* |
| 343 | * We want the common case to go fast, which | 323 | * We want the common case to go fast, which |
| @@ -346,12 +326,14 @@ int do_signal(struct pt_regs *regs, sigset_t *oldset) | |||
| 346 | * if so. | 326 | * if so. |
| 347 | */ | 327 | */ |
| 348 | if (!user_mode(regs)) | 328 | if (!user_mode(regs)) |
| 349 | return 1; | 329 | return; |
| 350 | 330 | ||
| 351 | if (try_to_freeze()) | 331 | if (try_to_freeze()) |
| 352 | goto no_signal; | 332 | goto no_signal; |
| 353 | 333 | ||
| 354 | if (!oldset) | 334 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) |
| 335 | oldset = ¤t->saved_sigmask; | ||
| 336 | else | ||
| 355 | oldset = ¤t->blocked; | 337 | oldset = ¤t->blocked; |
| 356 | 338 | ||
| 357 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); | 339 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); |
| @@ -363,8 +345,10 @@ int do_signal(struct pt_regs *regs, sigset_t *oldset) | |||
| 363 | */ | 345 | */ |
| 364 | 346 | ||
| 365 | /* Whee! Actually deliver the signal. */ | 347 | /* Whee! Actually deliver the signal. */ |
| 366 | handle_signal(signr, &ka, &info, oldset, regs); | 348 | if (handle_signal(signr, &ka, &info, oldset, regs) == 0) |
| 367 | return 1; | 349 | clear_thread_flag(TIF_RESTORE_SIGMASK); |
| 350 | |||
| 351 | return; | ||
| 368 | } | 352 | } |
| 369 | 353 | ||
| 370 | no_signal: | 354 | no_signal: |
| @@ -375,31 +359,24 @@ int do_signal(struct pt_regs *regs, sigset_t *oldset) | |||
| 375 | regs->r0 == -ERESTARTSYS || | 359 | regs->r0 == -ERESTARTSYS || |
| 376 | regs->r0 == -ERESTARTNOINTR) { | 360 | regs->r0 == -ERESTARTNOINTR) { |
| 377 | regs->r0 = regs->orig_r0; | 361 | regs->r0 = regs->orig_r0; |
| 378 | inst = *(unsigned short *)(regs->bpc - 2); | 362 | prev_insn(regs); |
| 379 | if ((inst & 0xfff0) == 0x10f0) /* trap ? */ | 363 | } else if (regs->r0 == -ERESTART_RESTARTBLOCK){ |
| 380 | regs->bpc -= 2; | ||
| 381 | else | ||
| 382 | regs->bpc -= 4; | ||
| 383 | } | ||
| 384 | if (regs->r0 == -ERESTART_RESTARTBLOCK){ | ||
| 385 | regs->r0 = regs->orig_r0; | 364 | regs->r0 = regs->orig_r0; |
| 386 | regs->r7 = __NR_restart_syscall; | 365 | regs->r7 = __NR_restart_syscall; |
| 387 | inst = *(unsigned short *)(regs->bpc - 2); | 366 | prev_insn(regs); |
| 388 | if ((inst & 0xfff0) == 0x10f0) /* trap ? */ | ||
| 389 | regs->bpc -= 2; | ||
| 390 | else | ||
| 391 | regs->bpc -= 4; | ||
| 392 | } | 367 | } |
| 393 | } | 368 | } |
| 394 | return 0; | 369 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) { |
| 370 | clear_thread_flag(TIF_RESTORE_SIGMASK); | ||
| 371 | sigprocmask(SIG_SETMASK, ¤t->saved_sigmask, NULL); | ||
| 372 | } | ||
| 395 | } | 373 | } |
| 396 | 374 | ||
| 397 | /* | 375 | /* |
| 398 | * notification of userspace execution resumption | 376 | * notification of userspace execution resumption |
| 399 | * - triggered by current->work.notify_resume | 377 | * - triggered by current->work.notify_resume |
| 400 | */ | 378 | */ |
| 401 | void do_notify_resume(struct pt_regs *regs, sigset_t *oldset, | 379 | void do_notify_resume(struct pt_regs *regs, __u32 thread_info_flags) |
| 402 | __u32 thread_info_flags) | ||
| 403 | { | 380 | { |
| 404 | /* Pending single-step? */ | 381 | /* Pending single-step? */ |
| 405 | if (thread_info_flags & _TIF_SINGLESTEP) | 382 | if (thread_info_flags & _TIF_SINGLESTEP) |
| @@ -407,7 +384,7 @@ void do_notify_resume(struct pt_regs *regs, sigset_t *oldset, | |||
| 407 | 384 | ||
| 408 | /* deal with pending signal delivery */ | 385 | /* deal with pending signal delivery */ |
| 409 | if (thread_info_flags & _TIF_SIGPENDING) | 386 | if (thread_info_flags & _TIF_SIGPENDING) |
| 410 | do_signal(regs,oldset); | 387 | do_signal(regs); |
| 411 | 388 | ||
| 412 | if (thread_info_flags & _TIF_NOTIFY_RESUME) { | 389 | if (thread_info_flags & _TIF_NOTIFY_RESUME) { |
| 413 | clear_thread_flag(TIF_NOTIFY_RESUME); | 390 | clear_thread_flag(TIF_NOTIFY_RESUME); |
diff --git a/arch/mn10300/Kconfig b/arch/mn10300/Kconfig index 444b9f918fdf..7c2a2f7f8dc1 100644 --- a/arch/mn10300/Kconfig +++ b/arch/mn10300/Kconfig | |||
| @@ -8,7 +8,6 @@ mainmenu "Linux Kernel Configuration" | |||
| 8 | config MN10300 | 8 | config MN10300 |
| 9 | def_bool y | 9 | def_bool y |
| 10 | select HAVE_OPROFILE | 10 | select HAVE_OPROFILE |
| 11 | select HAVE_ARCH_TRACEHOOK | ||
| 12 | 11 | ||
| 13 | config AM33 | 12 | config AM33 |
| 14 | def_bool y | 13 | def_bool y |
diff --git a/arch/mn10300/include/asm/bitops.h b/arch/mn10300/include/asm/bitops.h index f49ac49e09ad..3f50e9661076 100644 --- a/arch/mn10300/include/asm/bitops.h +++ b/arch/mn10300/include/asm/bitops.h | |||
| @@ -229,9 +229,9 @@ int ffs(int x) | |||
| 229 | #include <asm-generic/bitops/hweight.h> | 229 | #include <asm-generic/bitops/hweight.h> |
| 230 | 230 | ||
| 231 | #define ext2_set_bit_atomic(lock, nr, addr) \ | 231 | #define ext2_set_bit_atomic(lock, nr, addr) \ |
| 232 | test_and_set_bit((nr) ^ 0x18, (addr)) | 232 | test_and_set_bit((nr), (addr)) |
| 233 | #define ext2_clear_bit_atomic(lock, nr, addr) \ | 233 | #define ext2_clear_bit_atomic(lock, nr, addr) \ |
| 234 | test_and_clear_bit((nr) ^ 0x18, (addr)) | 234 | test_and_clear_bit((nr), (addr)) |
| 235 | 235 | ||
| 236 | #include <asm-generic/bitops/ext2-non-atomic.h> | 236 | #include <asm-generic/bitops/ext2-non-atomic.h> |
| 237 | #include <asm-generic/bitops/minix-le.h> | 237 | #include <asm-generic/bitops/minix-le.h> |
diff --git a/arch/mn10300/include/asm/signal.h b/arch/mn10300/include/asm/signal.h index 7e891fce2370..1865d72a86ff 100644 --- a/arch/mn10300/include/asm/signal.h +++ b/arch/mn10300/include/asm/signal.h | |||
| @@ -78,7 +78,7 @@ typedef unsigned long sigset_t; | |||
| 78 | 78 | ||
| 79 | /* These should not be considered constants from userland. */ | 79 | /* These should not be considered constants from userland. */ |
| 80 | #define SIGRTMIN 32 | 80 | #define SIGRTMIN 32 |
| 81 | #define SIGRTMAX (_NSIG-1) | 81 | #define SIGRTMAX _NSIG |
| 82 | 82 | ||
| 83 | /* | 83 | /* |
| 84 | * SA_FLAGS values: | 84 | * SA_FLAGS values: |
diff --git a/arch/mn10300/kernel/signal.c b/arch/mn10300/kernel/signal.c index 717db14c2cc3..d4de05ab7864 100644 --- a/arch/mn10300/kernel/signal.c +++ b/arch/mn10300/kernel/signal.c | |||
| @@ -65,10 +65,10 @@ asmlinkage long sys_sigaction(int sig, | |||
| 65 | old_sigset_t mask; | 65 | old_sigset_t mask; |
| 66 | if (verify_area(VERIFY_READ, act, sizeof(*act)) || | 66 | if (verify_area(VERIFY_READ, act, sizeof(*act)) || |
| 67 | __get_user(new_ka.sa.sa_handler, &act->sa_handler) || | 67 | __get_user(new_ka.sa.sa_handler, &act->sa_handler) || |
| 68 | __get_user(new_ka.sa.sa_restorer, &act->sa_restorer)) | 68 | __get_user(new_ka.sa.sa_restorer, &act->sa_restorer) || |
| 69 | __get_user(new_ka.sa.sa_flags, &act->sa_flags) || | ||
| 70 | __get_user(mask, &act->sa_mask)) | ||
| 69 | return -EFAULT; | 71 | return -EFAULT; |
| 70 | __get_user(new_ka.sa.sa_flags, &act->sa_flags); | ||
| 71 | __get_user(mask, &act->sa_mask); | ||
| 72 | siginitset(&new_ka.sa.sa_mask, mask); | 72 | siginitset(&new_ka.sa.sa_mask, mask); |
| 73 | } | 73 | } |
| 74 | 74 | ||
| @@ -77,10 +77,10 @@ asmlinkage long sys_sigaction(int sig, | |||
| 77 | if (!ret && oact) { | 77 | if (!ret && oact) { |
| 78 | if (verify_area(VERIFY_WRITE, oact, sizeof(*oact)) || | 78 | if (verify_area(VERIFY_WRITE, oact, sizeof(*oact)) || |
| 79 | __put_user(old_ka.sa.sa_handler, &oact->sa_handler) || | 79 | __put_user(old_ka.sa.sa_handler, &oact->sa_handler) || |
| 80 | __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer)) | 80 | __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer) || |
| 81 | __put_user(old_ka.sa.sa_flags, &oact->sa_flags) || | ||
| 82 | __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask)) | ||
| 81 | return -EFAULT; | 83 | return -EFAULT; |
| 82 | __put_user(old_ka.sa.sa_flags, &oact->sa_flags); | ||
| 83 | __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask); | ||
| 84 | } | 84 | } |
| 85 | 85 | ||
| 86 | return ret; | 86 | return ret; |
| @@ -102,6 +102,9 @@ static int restore_sigcontext(struct pt_regs *regs, | |||
| 102 | { | 102 | { |
| 103 | unsigned int err = 0; | 103 | unsigned int err = 0; |
| 104 | 104 | ||
| 105 | /* Always make any pending restarted system calls return -EINTR */ | ||
| 106 | current_thread_info()->restart_block.fn = do_no_restart_syscall; | ||
| 107 | |||
| 105 | if (is_using_fpu(current)) | 108 | if (is_using_fpu(current)) |
| 106 | fpu_kill_state(current); | 109 | fpu_kill_state(current); |
| 107 | 110 | ||
| @@ -330,8 +333,6 @@ static int setup_frame(int sig, struct k_sigaction *ka, sigset_t *set, | |||
| 330 | regs->d0 = sig; | 333 | regs->d0 = sig; |
| 331 | regs->d1 = (unsigned long) &frame->sc; | 334 | regs->d1 = (unsigned long) &frame->sc; |
| 332 | 335 | ||
| 333 | set_fs(USER_DS); | ||
| 334 | |||
| 335 | /* the tracer may want to single-step inside the handler */ | 336 | /* the tracer may want to single-step inside the handler */ |
| 336 | if (test_thread_flag(TIF_SINGLESTEP)) | 337 | if (test_thread_flag(TIF_SINGLESTEP)) |
| 337 | ptrace_notify(SIGTRAP); | 338 | ptrace_notify(SIGTRAP); |
| @@ -345,7 +346,7 @@ static int setup_frame(int sig, struct k_sigaction *ka, sigset_t *set, | |||
| 345 | return 0; | 346 | return 0; |
| 346 | 347 | ||
| 347 | give_sigsegv: | 348 | give_sigsegv: |
| 348 | force_sig(SIGSEGV, current); | 349 | force_sigsegv(sig, current); |
| 349 | return -EFAULT; | 350 | return -EFAULT; |
| 350 | } | 351 | } |
| 351 | 352 | ||
| @@ -413,8 +414,6 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
| 413 | regs->d0 = sig; | 414 | regs->d0 = sig; |
| 414 | regs->d1 = (long) &frame->info; | 415 | regs->d1 = (long) &frame->info; |
| 415 | 416 | ||
| 416 | set_fs(USER_DS); | ||
| 417 | |||
| 418 | /* the tracer may want to single-step inside the handler */ | 417 | /* the tracer may want to single-step inside the handler */ |
| 419 | if (test_thread_flag(TIF_SINGLESTEP)) | 418 | if (test_thread_flag(TIF_SINGLESTEP)) |
| 420 | ptrace_notify(SIGTRAP); | 419 | ptrace_notify(SIGTRAP); |
| @@ -428,10 +427,16 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
| 428 | return 0; | 427 | return 0; |
| 429 | 428 | ||
| 430 | give_sigsegv: | 429 | give_sigsegv: |
| 431 | force_sig(SIGSEGV, current); | 430 | force_sigsegv(sig, current); |
| 432 | return -EFAULT; | 431 | return -EFAULT; |
| 433 | } | 432 | } |
| 434 | 433 | ||
| 434 | static inline void stepback(struct pt_regs *regs) | ||
| 435 | { | ||
| 436 | regs->pc -= 2; | ||
| 437 | regs->orig_d0 = -1; | ||
| 438 | } | ||
| 439 | |||
| 435 | /* | 440 | /* |
| 436 | * handle the actual delivery of a signal to userspace | 441 | * handle the actual delivery of a signal to userspace |
| 437 | */ | 442 | */ |
| @@ -459,7 +464,7 @@ static int handle_signal(int sig, | |||
| 459 | /* fallthrough */ | 464 | /* fallthrough */ |
| 460 | case -ERESTARTNOINTR: | 465 | case -ERESTARTNOINTR: |
| 461 | regs->d0 = regs->orig_d0; | 466 | regs->d0 = regs->orig_d0; |
| 462 | regs->pc -= 2; | 467 | stepback(regs); |
| 463 | } | 468 | } |
| 464 | } | 469 | } |
| 465 | 470 | ||
| @@ -527,12 +532,12 @@ static void do_signal(struct pt_regs *regs) | |||
| 527 | case -ERESTARTSYS: | 532 | case -ERESTARTSYS: |
| 528 | case -ERESTARTNOINTR: | 533 | case -ERESTARTNOINTR: |
| 529 | regs->d0 = regs->orig_d0; | 534 | regs->d0 = regs->orig_d0; |
| 530 | regs->pc -= 2; | 535 | stepback(regs); |
| 531 | break; | 536 | break; |
| 532 | 537 | ||
| 533 | case -ERESTART_RESTARTBLOCK: | 538 | case -ERESTART_RESTARTBLOCK: |
| 534 | regs->d0 = __NR_restart_syscall; | 539 | regs->d0 = __NR_restart_syscall; |
| 535 | regs->pc -= 2; | 540 | stepback(regs); |
| 536 | break; | 541 | break; |
| 537 | } | 542 | } |
| 538 | } | 543 | } |
diff --git a/arch/powerpc/kernel/signal.c b/arch/powerpc/kernel/signal.c index 7109f5b1baa8..2300426e531a 100644 --- a/arch/powerpc/kernel/signal.c +++ b/arch/powerpc/kernel/signal.c | |||
| @@ -138,6 +138,7 @@ static int do_signal_pending(sigset_t *oldset, struct pt_regs *regs) | |||
| 138 | ti->local_flags &= ~_TLF_RESTORE_SIGMASK; | 138 | ti->local_flags &= ~_TLF_RESTORE_SIGMASK; |
| 139 | sigprocmask(SIG_SETMASK, ¤t->saved_sigmask, NULL); | 139 | sigprocmask(SIG_SETMASK, ¤t->saved_sigmask, NULL); |
| 140 | } | 140 | } |
| 141 | regs->trap = 0; | ||
| 141 | return 0; /* no signals delivered */ | 142 | return 0; /* no signals delivered */ |
| 142 | } | 143 | } |
| 143 | 144 | ||
| @@ -164,6 +165,7 @@ static int do_signal_pending(sigset_t *oldset, struct pt_regs *regs) | |||
| 164 | ret = handle_rt_signal64(signr, &ka, &info, oldset, regs); | 165 | ret = handle_rt_signal64(signr, &ka, &info, oldset, regs); |
| 165 | } | 166 | } |
| 166 | 167 | ||
| 168 | regs->trap = 0; | ||
| 167 | if (ret) { | 169 | if (ret) { |
| 168 | spin_lock_irq(¤t->sighand->siglock); | 170 | spin_lock_irq(¤t->sighand->siglock); |
| 169 | sigorsets(¤t->blocked, ¤t->blocked, | 171 | sigorsets(¤t->blocked, ¤t->blocked, |
diff --git a/arch/powerpc/kernel/signal_32.c b/arch/powerpc/kernel/signal_32.c index 266610119f66..b96a3a010c26 100644 --- a/arch/powerpc/kernel/signal_32.c +++ b/arch/powerpc/kernel/signal_32.c | |||
| @@ -511,6 +511,7 @@ static long restore_user_regs(struct pt_regs *regs, | |||
| 511 | if (!sig) | 511 | if (!sig) |
| 512 | save_r2 = (unsigned int)regs->gpr[2]; | 512 | save_r2 = (unsigned int)regs->gpr[2]; |
| 513 | err = restore_general_regs(regs, sr); | 513 | err = restore_general_regs(regs, sr); |
| 514 | regs->trap = 0; | ||
| 514 | err |= __get_user(msr, &sr->mc_gregs[PT_MSR]); | 515 | err |= __get_user(msr, &sr->mc_gregs[PT_MSR]); |
| 515 | if (!sig) | 516 | if (!sig) |
| 516 | regs->gpr[2] = (unsigned long) save_r2; | 517 | regs->gpr[2] = (unsigned long) save_r2; |
| @@ -884,7 +885,6 @@ int handle_rt_signal32(unsigned long sig, struct k_sigaction *ka, | |||
| 884 | regs->nip = (unsigned long) ka->sa.sa_handler; | 885 | regs->nip = (unsigned long) ka->sa.sa_handler; |
| 885 | /* enter the signal handler in big-endian mode */ | 886 | /* enter the signal handler in big-endian mode */ |
| 886 | regs->msr &= ~MSR_LE; | 887 | regs->msr &= ~MSR_LE; |
| 887 | regs->trap = 0; | ||
| 888 | return 1; | 888 | return 1; |
| 889 | 889 | ||
| 890 | badframe: | 890 | badframe: |
| @@ -1228,7 +1228,6 @@ int handle_signal32(unsigned long sig, struct k_sigaction *ka, | |||
| 1228 | regs->nip = (unsigned long) ka->sa.sa_handler; | 1228 | regs->nip = (unsigned long) ka->sa.sa_handler; |
| 1229 | /* enter the signal handler in big-endian mode */ | 1229 | /* enter the signal handler in big-endian mode */ |
| 1230 | regs->msr &= ~MSR_LE; | 1230 | regs->msr &= ~MSR_LE; |
| 1231 | regs->trap = 0; | ||
| 1232 | 1231 | ||
| 1233 | return 1; | 1232 | return 1; |
| 1234 | 1233 | ||
diff --git a/arch/powerpc/kernel/signal_64.c b/arch/powerpc/kernel/signal_64.c index 2fe6fc64b614..27c4a4584f80 100644 --- a/arch/powerpc/kernel/signal_64.c +++ b/arch/powerpc/kernel/signal_64.c | |||
| @@ -178,7 +178,7 @@ static long restore_sigcontext(struct pt_regs *regs, sigset_t *set, int sig, | |||
| 178 | err |= __get_user(regs->xer, &sc->gp_regs[PT_XER]); | 178 | err |= __get_user(regs->xer, &sc->gp_regs[PT_XER]); |
| 179 | err |= __get_user(regs->ccr, &sc->gp_regs[PT_CCR]); | 179 | err |= __get_user(regs->ccr, &sc->gp_regs[PT_CCR]); |
| 180 | /* skip SOFTE */ | 180 | /* skip SOFTE */ |
| 181 | err |= __get_user(regs->trap, &sc->gp_regs[PT_TRAP]); | 181 | regs->trap = 0; |
| 182 | err |= __get_user(regs->dar, &sc->gp_regs[PT_DAR]); | 182 | err |= __get_user(regs->dar, &sc->gp_regs[PT_DAR]); |
| 183 | err |= __get_user(regs->dsisr, &sc->gp_regs[PT_DSISR]); | 183 | err |= __get_user(regs->dsisr, &sc->gp_regs[PT_DSISR]); |
| 184 | err |= __get_user(regs->result, &sc->gp_regs[PT_RESULT]); | 184 | err |= __get_user(regs->result, &sc->gp_regs[PT_RESULT]); |
diff --git a/arch/sparc/kernel/perf_event.c b/arch/sparc/kernel/perf_event.c index 357ced3c33ff..6318e622cfb0 100644 --- a/arch/sparc/kernel/perf_event.c +++ b/arch/sparc/kernel/perf_event.c | |||
| @@ -1038,6 +1038,7 @@ static int __hw_perf_event_init(struct perf_event *event) | |||
| 1038 | if (atomic_read(&nmi_active) < 0) | 1038 | if (atomic_read(&nmi_active) < 0) |
| 1039 | return -ENODEV; | 1039 | return -ENODEV; |
| 1040 | 1040 | ||
| 1041 | pmap = NULL; | ||
| 1041 | if (attr->type == PERF_TYPE_HARDWARE) { | 1042 | if (attr->type == PERF_TYPE_HARDWARE) { |
| 1042 | if (attr->config >= sparc_pmu->max_events) | 1043 | if (attr->config >= sparc_pmu->max_events) |
| 1043 | return -EINVAL; | 1044 | return -EINVAL; |
| @@ -1046,9 +1047,18 @@ static int __hw_perf_event_init(struct perf_event *event) | |||
| 1046 | pmap = sparc_map_cache_event(attr->config); | 1047 | pmap = sparc_map_cache_event(attr->config); |
| 1047 | if (IS_ERR(pmap)) | 1048 | if (IS_ERR(pmap)) |
| 1048 | return PTR_ERR(pmap); | 1049 | return PTR_ERR(pmap); |
| 1049 | } else | 1050 | } else if (attr->type != PERF_TYPE_RAW) |
| 1050 | return -EOPNOTSUPP; | 1051 | return -EOPNOTSUPP; |
| 1051 | 1052 | ||
| 1053 | if (pmap) { | ||
| 1054 | hwc->event_base = perf_event_encode(pmap); | ||
| 1055 | } else { | ||
| 1056 | /* User gives us "(encoding << 16) | pic_mask" for | ||
| 1057 | * PERF_TYPE_RAW events. | ||
| 1058 | */ | ||
| 1059 | hwc->event_base = attr->config; | ||
| 1060 | } | ||
| 1061 | |||
| 1052 | /* We save the enable bits in the config_base. */ | 1062 | /* We save the enable bits in the config_base. */ |
| 1053 | hwc->config_base = sparc_pmu->irq_bit; | 1063 | hwc->config_base = sparc_pmu->irq_bit; |
| 1054 | if (!attr->exclude_user) | 1064 | if (!attr->exclude_user) |
| @@ -1058,8 +1068,6 @@ static int __hw_perf_event_init(struct perf_event *event) | |||
| 1058 | if (!attr->exclude_hv) | 1068 | if (!attr->exclude_hv) |
| 1059 | hwc->config_base |= sparc_pmu->hv_bit; | 1069 | hwc->config_base |= sparc_pmu->hv_bit; |
| 1060 | 1070 | ||
| 1061 | hwc->event_base = perf_event_encode(pmap); | ||
| 1062 | |||
| 1063 | n = 0; | 1071 | n = 0; |
| 1064 | if (event->group_leader != event) { | 1072 | if (event->group_leader != event) { |
| 1065 | n = collect_events(event->group_leader, | 1073 | n = collect_events(event->group_leader, |
diff --git a/arch/sparc/kernel/signal32.c b/arch/sparc/kernel/signal32.c index ea22cd373c64..75fad425e249 100644 --- a/arch/sparc/kernel/signal32.c +++ b/arch/sparc/kernel/signal32.c | |||
| @@ -453,8 +453,66 @@ static int save_fpu_state32(struct pt_regs *regs, __siginfo_fpu_t __user *fpu) | |||
| 453 | return err; | 453 | return err; |
| 454 | } | 454 | } |
| 455 | 455 | ||
| 456 | static void setup_frame32(struct k_sigaction *ka, struct pt_regs *regs, | 456 | /* The I-cache flush instruction only works in the primary ASI, which |
| 457 | int signo, sigset_t *oldset) | 457 | * right now is the nucleus, aka. kernel space. |
| 458 | * | ||
| 459 | * Therefore we have to kick the instructions out using the kernel | ||
| 460 | * side linear mapping of the physical address backing the user | ||
| 461 | * instructions. | ||
| 462 | */ | ||
| 463 | static void flush_signal_insns(unsigned long address) | ||
| 464 | { | ||
| 465 | unsigned long pstate, paddr; | ||
| 466 | pte_t *ptep, pte; | ||
| 467 | pgd_t *pgdp; | ||
| 468 | pud_t *pudp; | ||
| 469 | pmd_t *pmdp; | ||
| 470 | |||
| 471 | /* Commit all stores of the instructions we are about to flush. */ | ||
| 472 | wmb(); | ||
| 473 | |||
| 474 | /* Disable cross-call reception. In this way even a very wide | ||
| 475 | * munmap() on another cpu can't tear down the page table | ||
| 476 | * hierarchy from underneath us, since that can't complete | ||
| 477 | * until the IPI tlb flush returns. | ||
| 478 | */ | ||
| 479 | |||
| 480 | __asm__ __volatile__("rdpr %%pstate, %0" : "=r" (pstate)); | ||
| 481 | __asm__ __volatile__("wrpr %0, %1, %%pstate" | ||
| 482 | : : "r" (pstate), "i" (PSTATE_IE)); | ||
| 483 | |||
| 484 | pgdp = pgd_offset(current->mm, address); | ||
| 485 | if (pgd_none(*pgdp)) | ||
| 486 | goto out_irqs_on; | ||
| 487 | pudp = pud_offset(pgdp, address); | ||
| 488 | if (pud_none(*pudp)) | ||
| 489 | goto out_irqs_on; | ||
| 490 | pmdp = pmd_offset(pudp, address); | ||
| 491 | if (pmd_none(*pmdp)) | ||
| 492 | goto out_irqs_on; | ||
| 493 | |||
| 494 | ptep = pte_offset_map(pmdp, address); | ||
| 495 | pte = *ptep; | ||
| 496 | if (!pte_present(pte)) | ||
| 497 | goto out_unmap; | ||
| 498 | |||
| 499 | paddr = (unsigned long) page_address(pte_page(pte)); | ||
| 500 | |||
| 501 | __asm__ __volatile__("flush %0 + %1" | ||
| 502 | : /* no outputs */ | ||
| 503 | : "r" (paddr), | ||
| 504 | "r" (address & (PAGE_SIZE - 1)) | ||
| 505 | : "memory"); | ||
| 506 | |||
| 507 | out_unmap: | ||
| 508 | pte_unmap(ptep); | ||
| 509 | out_irqs_on: | ||
| 510 | __asm__ __volatile__("wrpr %0, 0x0, %%pstate" : : "r" (pstate)); | ||
| 511 | |||
| 512 | } | ||
| 513 | |||
| 514 | static int setup_frame32(struct k_sigaction *ka, struct pt_regs *regs, | ||
| 515 | int signo, sigset_t *oldset) | ||
| 458 | { | 516 | { |
| 459 | struct signal_frame32 __user *sf; | 517 | struct signal_frame32 __user *sf; |
| 460 | int sigframe_size; | 518 | int sigframe_size; |
| @@ -547,13 +605,7 @@ static void setup_frame32(struct k_sigaction *ka, struct pt_regs *regs, | |||
| 547 | if (ka->ka_restorer) { | 605 | if (ka->ka_restorer) { |
| 548 | regs->u_regs[UREG_I7] = (unsigned long)ka->ka_restorer; | 606 | regs->u_regs[UREG_I7] = (unsigned long)ka->ka_restorer; |
| 549 | } else { | 607 | } else { |
| 550 | /* Flush instruction space. */ | ||
| 551 | unsigned long address = ((unsigned long)&(sf->insns[0])); | 608 | unsigned long address = ((unsigned long)&(sf->insns[0])); |
| 552 | pgd_t *pgdp = pgd_offset(current->mm, address); | ||
| 553 | pud_t *pudp = pud_offset(pgdp, address); | ||
| 554 | pmd_t *pmdp = pmd_offset(pudp, address); | ||
| 555 | pte_t *ptep; | ||
| 556 | pte_t pte; | ||
| 557 | 609 | ||
| 558 | regs->u_regs[UREG_I7] = (unsigned long) (&(sf->insns[0]) - 2); | 610 | regs->u_regs[UREG_I7] = (unsigned long) (&(sf->insns[0]) - 2); |
| 559 | 611 | ||
| @@ -562,34 +614,22 @@ static void setup_frame32(struct k_sigaction *ka, struct pt_regs *regs, | |||
| 562 | if (err) | 614 | if (err) |
| 563 | goto sigsegv; | 615 | goto sigsegv; |
| 564 | 616 | ||
| 565 | preempt_disable(); | 617 | flush_signal_insns(address); |
| 566 | ptep = pte_offset_map(pmdp, address); | ||
| 567 | pte = *ptep; | ||
| 568 | if (pte_present(pte)) { | ||
| 569 | unsigned long page = (unsigned long) | ||
| 570 | page_address(pte_page(pte)); | ||
| 571 | |||
| 572 | wmb(); | ||
| 573 | __asm__ __volatile__("flush %0 + %1" | ||
| 574 | : /* no outputs */ | ||
| 575 | : "r" (page), | ||
| 576 | "r" (address & (PAGE_SIZE - 1)) | ||
| 577 | : "memory"); | ||
| 578 | } | ||
| 579 | pte_unmap(ptep); | ||
| 580 | preempt_enable(); | ||
| 581 | } | 618 | } |
| 582 | return; | 619 | return 0; |
| 583 | 620 | ||
| 584 | sigill: | 621 | sigill: |
| 585 | do_exit(SIGILL); | 622 | do_exit(SIGILL); |
| 623 | return -EINVAL; | ||
| 624 | |||
| 586 | sigsegv: | 625 | sigsegv: |
| 587 | force_sigsegv(signo, current); | 626 | force_sigsegv(signo, current); |
| 627 | return -EFAULT; | ||
| 588 | } | 628 | } |
| 589 | 629 | ||
| 590 | static void setup_rt_frame32(struct k_sigaction *ka, struct pt_regs *regs, | 630 | static int setup_rt_frame32(struct k_sigaction *ka, struct pt_regs *regs, |
| 591 | unsigned long signr, sigset_t *oldset, | 631 | unsigned long signr, sigset_t *oldset, |
| 592 | siginfo_t *info) | 632 | siginfo_t *info) |
| 593 | { | 633 | { |
| 594 | struct rt_signal_frame32 __user *sf; | 634 | struct rt_signal_frame32 __user *sf; |
| 595 | int sigframe_size; | 635 | int sigframe_size; |
| @@ -687,12 +727,7 @@ static void setup_rt_frame32(struct k_sigaction *ka, struct pt_regs *regs, | |||
| 687 | if (ka->ka_restorer) | 727 | if (ka->ka_restorer) |
| 688 | regs->u_regs[UREG_I7] = (unsigned long)ka->ka_restorer; | 728 | regs->u_regs[UREG_I7] = (unsigned long)ka->ka_restorer; |
| 689 | else { | 729 | else { |
| 690 | /* Flush instruction space. */ | ||
| 691 | unsigned long address = ((unsigned long)&(sf->insns[0])); | 730 | unsigned long address = ((unsigned long)&(sf->insns[0])); |
| 692 | pgd_t *pgdp = pgd_offset(current->mm, address); | ||
| 693 | pud_t *pudp = pud_offset(pgdp, address); | ||
| 694 | pmd_t *pmdp = pmd_offset(pudp, address); | ||
| 695 | pte_t *ptep; | ||
| 696 | 731 | ||
| 697 | regs->u_regs[UREG_I7] = (unsigned long) (&(sf->insns[0]) - 2); | 732 | regs->u_regs[UREG_I7] = (unsigned long) (&(sf->insns[0]) - 2); |
| 698 | 733 | ||
| @@ -704,38 +739,32 @@ static void setup_rt_frame32(struct k_sigaction *ka, struct pt_regs *regs, | |||
| 704 | if (err) | 739 | if (err) |
| 705 | goto sigsegv; | 740 | goto sigsegv; |
| 706 | 741 | ||
| 707 | preempt_disable(); | 742 | flush_signal_insns(address); |
| 708 | ptep = pte_offset_map(pmdp, address); | ||
| 709 | if (pte_present(*ptep)) { | ||
| 710 | unsigned long page = (unsigned long) | ||
| 711 | page_address(pte_page(*ptep)); | ||
| 712 | |||
| 713 | wmb(); | ||
| 714 | __asm__ __volatile__("flush %0 + %1" | ||
| 715 | : /* no outputs */ | ||
| 716 | : "r" (page), | ||
| 717 | "r" (address & (PAGE_SIZE - 1)) | ||
| 718 | : "memory"); | ||
| 719 | } | ||
| 720 | pte_unmap(ptep); | ||
| 721 | preempt_enable(); | ||
| 722 | } | 743 | } |
| 723 | return; | 744 | return 0; |
| 724 | 745 | ||
| 725 | sigill: | 746 | sigill: |
| 726 | do_exit(SIGILL); | 747 | do_exit(SIGILL); |
| 748 | return -EINVAL; | ||
| 749 | |||
| 727 | sigsegv: | 750 | sigsegv: |
| 728 | force_sigsegv(signr, current); | 751 | force_sigsegv(signr, current); |
| 752 | return -EFAULT; | ||
| 729 | } | 753 | } |
| 730 | 754 | ||
| 731 | static inline void handle_signal32(unsigned long signr, struct k_sigaction *ka, | 755 | static inline int handle_signal32(unsigned long signr, struct k_sigaction *ka, |
| 732 | siginfo_t *info, | 756 | siginfo_t *info, |
| 733 | sigset_t *oldset, struct pt_regs *regs) | 757 | sigset_t *oldset, struct pt_regs *regs) |
| 734 | { | 758 | { |
| 759 | int err; | ||
| 760 | |||
| 735 | if (ka->sa.sa_flags & SA_SIGINFO) | 761 | if (ka->sa.sa_flags & SA_SIGINFO) |
| 736 | setup_rt_frame32(ka, regs, signr, oldset, info); | 762 | err = setup_rt_frame32(ka, regs, signr, oldset, info); |
| 737 | else | 763 | else |
| 738 | setup_frame32(ka, regs, signr, oldset); | 764 | err = setup_frame32(ka, regs, signr, oldset); |
| 765 | |||
| 766 | if (err) | ||
| 767 | return err; | ||
| 739 | 768 | ||
| 740 | spin_lock_irq(¤t->sighand->siglock); | 769 | spin_lock_irq(¤t->sighand->siglock); |
| 741 | sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask); | 770 | sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask); |
| @@ -743,6 +772,10 @@ static inline void handle_signal32(unsigned long signr, struct k_sigaction *ka, | |||
| 743 | sigaddset(¤t->blocked,signr); | 772 | sigaddset(¤t->blocked,signr); |
| 744 | recalc_sigpending(); | 773 | recalc_sigpending(); |
| 745 | spin_unlock_irq(¤t->sighand->siglock); | 774 | spin_unlock_irq(¤t->sighand->siglock); |
| 775 | |||
| 776 | tracehook_signal_handler(signr, info, ka, regs, 0); | ||
| 777 | |||
| 778 | return 0; | ||
| 746 | } | 779 | } |
| 747 | 780 | ||
| 748 | static inline void syscall_restart32(unsigned long orig_i0, struct pt_regs *regs, | 781 | static inline void syscall_restart32(unsigned long orig_i0, struct pt_regs *regs, |
| @@ -789,16 +822,14 @@ void do_signal32(sigset_t *oldset, struct pt_regs * regs, | |||
| 789 | if (signr > 0) { | 822 | if (signr > 0) { |
| 790 | if (restart_syscall) | 823 | if (restart_syscall) |
| 791 | syscall_restart32(orig_i0, regs, &ka.sa); | 824 | syscall_restart32(orig_i0, regs, &ka.sa); |
| 792 | handle_signal32(signr, &ka, &info, oldset, regs); | 825 | if (handle_signal32(signr, &ka, &info, oldset, regs) == 0) { |
| 793 | 826 | /* A signal was successfully delivered; the saved | |
| 794 | /* A signal was successfully delivered; the saved | 827 | * sigmask will have been stored in the signal frame, |
| 795 | * sigmask will have been stored in the signal frame, | 828 | * and will be restored by sigreturn, so we can simply |
| 796 | * and will be restored by sigreturn, so we can simply | 829 | * clear the TS_RESTORE_SIGMASK flag. |
| 797 | * clear the TS_RESTORE_SIGMASK flag. | 830 | */ |
| 798 | */ | 831 | current_thread_info()->status &= ~TS_RESTORE_SIGMASK; |
| 799 | current_thread_info()->status &= ~TS_RESTORE_SIGMASK; | 832 | } |
| 800 | |||
| 801 | tracehook_signal_handler(signr, &info, &ka, regs, 0); | ||
| 802 | return; | 833 | return; |
| 803 | } | 834 | } |
| 804 | if (restart_syscall && | 835 | if (restart_syscall && |
| @@ -809,12 +840,14 @@ void do_signal32(sigset_t *oldset, struct pt_regs * regs, | |||
| 809 | regs->u_regs[UREG_I0] = orig_i0; | 840 | regs->u_regs[UREG_I0] = orig_i0; |
| 810 | regs->tpc -= 4; | 841 | regs->tpc -= 4; |
| 811 | regs->tnpc -= 4; | 842 | regs->tnpc -= 4; |
| 843 | pt_regs_clear_syscall(regs); | ||
| 812 | } | 844 | } |
| 813 | if (restart_syscall && | 845 | if (restart_syscall && |
| 814 | regs->u_regs[UREG_I0] == ERESTART_RESTARTBLOCK) { | 846 | regs->u_regs[UREG_I0] == ERESTART_RESTARTBLOCK) { |
| 815 | regs->u_regs[UREG_G1] = __NR_restart_syscall; | 847 | regs->u_regs[UREG_G1] = __NR_restart_syscall; |
| 816 | regs->tpc -= 4; | 848 | regs->tpc -= 4; |
| 817 | regs->tnpc -= 4; | 849 | regs->tnpc -= 4; |
| 850 | pt_regs_clear_syscall(regs); | ||
| 818 | } | 851 | } |
| 819 | 852 | ||
| 820 | /* If there's no signal to deliver, we just put the saved sigmask | 853 | /* If there's no signal to deliver, we just put the saved sigmask |
diff --git a/arch/sparc/kernel/signal_32.c b/arch/sparc/kernel/signal_32.c index 9882df92ba0a..5e5c5fd03783 100644 --- a/arch/sparc/kernel/signal_32.c +++ b/arch/sparc/kernel/signal_32.c | |||
| @@ -315,8 +315,8 @@ save_fpu_state(struct pt_regs *regs, __siginfo_fpu_t __user *fpu) | |||
| 315 | return err; | 315 | return err; |
| 316 | } | 316 | } |
| 317 | 317 | ||
| 318 | static void setup_frame(struct k_sigaction *ka, struct pt_regs *regs, | 318 | static int setup_frame(struct k_sigaction *ka, struct pt_regs *regs, |
| 319 | int signo, sigset_t *oldset) | 319 | int signo, sigset_t *oldset) |
| 320 | { | 320 | { |
| 321 | struct signal_frame __user *sf; | 321 | struct signal_frame __user *sf; |
| 322 | int sigframe_size, err; | 322 | int sigframe_size, err; |
| @@ -384,16 +384,19 @@ static void setup_frame(struct k_sigaction *ka, struct pt_regs *regs, | |||
| 384 | /* Flush instruction space. */ | 384 | /* Flush instruction space. */ |
| 385 | flush_sig_insns(current->mm, (unsigned long) &(sf->insns[0])); | 385 | flush_sig_insns(current->mm, (unsigned long) &(sf->insns[0])); |
| 386 | } | 386 | } |
| 387 | return; | 387 | return 0; |
| 388 | 388 | ||
| 389 | sigill_and_return: | 389 | sigill_and_return: |
| 390 | do_exit(SIGILL); | 390 | do_exit(SIGILL); |
| 391 | return -EINVAL; | ||
| 392 | |||
| 391 | sigsegv: | 393 | sigsegv: |
| 392 | force_sigsegv(signo, current); | 394 | force_sigsegv(signo, current); |
| 395 | return -EFAULT; | ||
| 393 | } | 396 | } |
| 394 | 397 | ||
| 395 | static void setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs, | 398 | static int setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs, |
| 396 | int signo, sigset_t *oldset, siginfo_t *info) | 399 | int signo, sigset_t *oldset, siginfo_t *info) |
| 397 | { | 400 | { |
| 398 | struct rt_signal_frame __user *sf; | 401 | struct rt_signal_frame __user *sf; |
| 399 | int sigframe_size; | 402 | int sigframe_size; |
| @@ -466,22 +469,30 @@ static void setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs, | |||
| 466 | /* Flush instruction space. */ | 469 | /* Flush instruction space. */ |
| 467 | flush_sig_insns(current->mm, (unsigned long) &(sf->insns[0])); | 470 | flush_sig_insns(current->mm, (unsigned long) &(sf->insns[0])); |
| 468 | } | 471 | } |
| 469 | return; | 472 | return 0; |
| 470 | 473 | ||
| 471 | sigill: | 474 | sigill: |
| 472 | do_exit(SIGILL); | 475 | do_exit(SIGILL); |
| 476 | return -EINVAL; | ||
| 477 | |||
| 473 | sigsegv: | 478 | sigsegv: |
| 474 | force_sigsegv(signo, current); | 479 | force_sigsegv(signo, current); |
| 480 | return -EFAULT; | ||
| 475 | } | 481 | } |
| 476 | 482 | ||
| 477 | static inline void | 483 | static inline int |
| 478 | handle_signal(unsigned long signr, struct k_sigaction *ka, | 484 | handle_signal(unsigned long signr, struct k_sigaction *ka, |
| 479 | siginfo_t *info, sigset_t *oldset, struct pt_regs *regs) | 485 | siginfo_t *info, sigset_t *oldset, struct pt_regs *regs) |
| 480 | { | 486 | { |
| 487 | int err; | ||
| 488 | |||
| 481 | if (ka->sa.sa_flags & SA_SIGINFO) | 489 | if (ka->sa.sa_flags & SA_SIGINFO) |
| 482 | setup_rt_frame(ka, regs, signr, oldset, info); | 490 | err = setup_rt_frame(ka, regs, signr, oldset, info); |
| 483 | else | 491 | else |
| 484 | setup_frame(ka, regs, signr, oldset); | 492 | err = setup_frame(ka, regs, signr, oldset); |
| 493 | |||
| 494 | if (err) | ||
| 495 | return err; | ||
| 485 | 496 | ||
| 486 | spin_lock_irq(¤t->sighand->siglock); | 497 | spin_lock_irq(¤t->sighand->siglock); |
| 487 | sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask); | 498 | sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask); |
| @@ -489,6 +500,10 @@ handle_signal(unsigned long signr, struct k_sigaction *ka, | |||
| 489 | sigaddset(¤t->blocked, signr); | 500 | sigaddset(¤t->blocked, signr); |
| 490 | recalc_sigpending(); | 501 | recalc_sigpending(); |
| 491 | spin_unlock_irq(¤t->sighand->siglock); | 502 | spin_unlock_irq(¤t->sighand->siglock); |
| 503 | |||
| 504 | tracehook_signal_handler(signr, info, ka, regs, 0); | ||
| 505 | |||
| 506 | return 0; | ||
| 492 | } | 507 | } |
| 493 | 508 | ||
| 494 | static inline void syscall_restart(unsigned long orig_i0, struct pt_regs *regs, | 509 | static inline void syscall_restart(unsigned long orig_i0, struct pt_regs *regs, |
| @@ -546,17 +561,15 @@ static void do_signal(struct pt_regs *regs, unsigned long orig_i0) | |||
| 546 | if (signr > 0) { | 561 | if (signr > 0) { |
| 547 | if (restart_syscall) | 562 | if (restart_syscall) |
| 548 | syscall_restart(orig_i0, regs, &ka.sa); | 563 | syscall_restart(orig_i0, regs, &ka.sa); |
| 549 | handle_signal(signr, &ka, &info, oldset, regs); | 564 | if (handle_signal(signr, &ka, &info, oldset, regs) == 0) { |
| 550 | 565 | /* a signal was successfully delivered; the saved | |
| 551 | /* a signal was successfully delivered; the saved | 566 | * sigmask will have been stored in the signal frame, |
| 552 | * sigmask will have been stored in the signal frame, | 567 | * and will be restored by sigreturn, so we can simply |
| 553 | * and will be restored by sigreturn, so we can simply | 568 | * clear the TIF_RESTORE_SIGMASK flag. |
| 554 | * clear the TIF_RESTORE_SIGMASK flag. | 569 | */ |
| 555 | */ | 570 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) |
| 556 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) | 571 | clear_thread_flag(TIF_RESTORE_SIGMASK); |
| 557 | clear_thread_flag(TIF_RESTORE_SIGMASK); | 572 | } |
| 558 | |||
| 559 | tracehook_signal_handler(signr, &info, &ka, regs, 0); | ||
| 560 | return; | 573 | return; |
| 561 | } | 574 | } |
| 562 | if (restart_syscall && | 575 | if (restart_syscall && |
| @@ -567,12 +580,14 @@ static void do_signal(struct pt_regs *regs, unsigned long orig_i0) | |||
| 567 | regs->u_regs[UREG_I0] = orig_i0; | 580 | regs->u_regs[UREG_I0] = orig_i0; |
| 568 | regs->pc -= 4; | 581 | regs->pc -= 4; |
| 569 | regs->npc -= 4; | 582 | regs->npc -= 4; |
| 583 | pt_regs_clear_syscall(regs); | ||
| 570 | } | 584 | } |
| 571 | if (restart_syscall && | 585 | if (restart_syscall && |
| 572 | regs->u_regs[UREG_I0] == ERESTART_RESTARTBLOCK) { | 586 | regs->u_regs[UREG_I0] == ERESTART_RESTARTBLOCK) { |
| 573 | regs->u_regs[UREG_G1] = __NR_restart_syscall; | 587 | regs->u_regs[UREG_G1] = __NR_restart_syscall; |
| 574 | regs->pc -= 4; | 588 | regs->pc -= 4; |
| 575 | regs->npc -= 4; | 589 | regs->npc -= 4; |
| 590 | pt_regs_clear_syscall(regs); | ||
| 576 | } | 591 | } |
| 577 | 592 | ||
| 578 | /* if there's no signal to deliver, we just put the saved sigmask | 593 | /* if there's no signal to deliver, we just put the saved sigmask |
diff --git a/arch/sparc/kernel/signal_64.c b/arch/sparc/kernel/signal_64.c index 9fa48c30037e..006fe4515886 100644 --- a/arch/sparc/kernel/signal_64.c +++ b/arch/sparc/kernel/signal_64.c | |||
| @@ -409,7 +409,7 @@ static inline void __user *get_sigframe(struct k_sigaction *ka, struct pt_regs * | |||
| 409 | return (void __user *) sp; | 409 | return (void __user *) sp; |
| 410 | } | 410 | } |
| 411 | 411 | ||
| 412 | static inline void | 412 | static inline int |
| 413 | setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs, | 413 | setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs, |
| 414 | int signo, sigset_t *oldset, siginfo_t *info) | 414 | int signo, sigset_t *oldset, siginfo_t *info) |
| 415 | { | 415 | { |
| @@ -483,26 +483,37 @@ setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs, | |||
| 483 | } | 483 | } |
| 484 | /* 4. return to kernel instructions */ | 484 | /* 4. return to kernel instructions */ |
| 485 | regs->u_regs[UREG_I7] = (unsigned long)ka->ka_restorer; | 485 | regs->u_regs[UREG_I7] = (unsigned long)ka->ka_restorer; |
| 486 | return; | 486 | return 0; |
| 487 | 487 | ||
| 488 | sigill: | 488 | sigill: |
| 489 | do_exit(SIGILL); | 489 | do_exit(SIGILL); |
| 490 | return -EINVAL; | ||
| 491 | |||
| 490 | sigsegv: | 492 | sigsegv: |
| 491 | force_sigsegv(signo, current); | 493 | force_sigsegv(signo, current); |
| 494 | return -EFAULT; | ||
| 492 | } | 495 | } |
| 493 | 496 | ||
| 494 | static inline void handle_signal(unsigned long signr, struct k_sigaction *ka, | 497 | static inline int handle_signal(unsigned long signr, struct k_sigaction *ka, |
| 495 | siginfo_t *info, | 498 | siginfo_t *info, |
| 496 | sigset_t *oldset, struct pt_regs *regs) | 499 | sigset_t *oldset, struct pt_regs *regs) |
| 497 | { | 500 | { |
| 498 | setup_rt_frame(ka, regs, signr, oldset, | 501 | int err; |
| 499 | (ka->sa.sa_flags & SA_SIGINFO) ? info : NULL); | 502 | |
| 503 | err = setup_rt_frame(ka, regs, signr, oldset, | ||
| 504 | (ka->sa.sa_flags & SA_SIGINFO) ? info : NULL); | ||
| 505 | if (err) | ||
| 506 | return err; | ||
| 500 | spin_lock_irq(¤t->sighand->siglock); | 507 | spin_lock_irq(¤t->sighand->siglock); |
| 501 | sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask); | 508 | sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask); |
| 502 | if (!(ka->sa.sa_flags & SA_NOMASK)) | 509 | if (!(ka->sa.sa_flags & SA_NOMASK)) |
| 503 | sigaddset(¤t->blocked,signr); | 510 | sigaddset(¤t->blocked,signr); |
| 504 | recalc_sigpending(); | 511 | recalc_sigpending(); |
| 505 | spin_unlock_irq(¤t->sighand->siglock); | 512 | spin_unlock_irq(¤t->sighand->siglock); |
| 513 | |||
| 514 | tracehook_signal_handler(signr, info, ka, regs, 0); | ||
| 515 | |||
| 516 | return 0; | ||
| 506 | } | 517 | } |
| 507 | 518 | ||
| 508 | static inline void syscall_restart(unsigned long orig_i0, struct pt_regs *regs, | 519 | static inline void syscall_restart(unsigned long orig_i0, struct pt_regs *regs, |
| @@ -571,16 +582,14 @@ static void do_signal(struct pt_regs *regs, unsigned long orig_i0) | |||
| 571 | if (signr > 0) { | 582 | if (signr > 0) { |
| 572 | if (restart_syscall) | 583 | if (restart_syscall) |
| 573 | syscall_restart(orig_i0, regs, &ka.sa); | 584 | syscall_restart(orig_i0, regs, &ka.sa); |
| 574 | handle_signal(signr, &ka, &info, oldset, regs); | 585 | if (handle_signal(signr, &ka, &info, oldset, regs) == 0) { |
| 575 | 586 | /* A signal was successfully delivered; the saved | |
| 576 | /* A signal was successfully delivered; the saved | 587 | * sigmask will have been stored in the signal frame, |
| 577 | * sigmask will have been stored in the signal frame, | 588 | * and will be restored by sigreturn, so we can simply |
| 578 | * and will be restored by sigreturn, so we can simply | 589 | * clear the TS_RESTORE_SIGMASK flag. |
| 579 | * clear the TS_RESTORE_SIGMASK flag. | 590 | */ |
| 580 | */ | 591 | current_thread_info()->status &= ~TS_RESTORE_SIGMASK; |
| 581 | current_thread_info()->status &= ~TS_RESTORE_SIGMASK; | 592 | } |
| 582 | |||
| 583 | tracehook_signal_handler(signr, &info, &ka, regs, 0); | ||
| 584 | return; | 593 | return; |
| 585 | } | 594 | } |
| 586 | if (restart_syscall && | 595 | if (restart_syscall && |
| @@ -591,12 +600,14 @@ static void do_signal(struct pt_regs *regs, unsigned long orig_i0) | |||
| 591 | regs->u_regs[UREG_I0] = orig_i0; | 600 | regs->u_regs[UREG_I0] = orig_i0; |
| 592 | regs->tpc -= 4; | 601 | regs->tpc -= 4; |
| 593 | regs->tnpc -= 4; | 602 | regs->tnpc -= 4; |
| 603 | pt_regs_clear_syscall(regs); | ||
| 594 | } | 604 | } |
| 595 | if (restart_syscall && | 605 | if (restart_syscall && |
| 596 | regs->u_regs[UREG_I0] == ERESTART_RESTARTBLOCK) { | 606 | regs->u_regs[UREG_I0] == ERESTART_RESTARTBLOCK) { |
| 597 | regs->u_regs[UREG_G1] = __NR_restart_syscall; | 607 | regs->u_regs[UREG_G1] = __NR_restart_syscall; |
| 598 | regs->tpc -= 4; | 608 | regs->tpc -= 4; |
| 599 | regs->tnpc -= 4; | 609 | regs->tnpc -= 4; |
| 610 | pt_regs_clear_syscall(regs); | ||
| 600 | } | 611 | } |
| 601 | 612 | ||
| 602 | /* If there's no signal to deliver, we just put the saved sigmask | 613 | /* If there's no signal to deliver, we just put the saved sigmask |
diff --git a/arch/tile/kernel/intvec_32.S b/arch/tile/kernel/intvec_32.S index 84f296ca9e63..8f58bdff20d7 100644 --- a/arch/tile/kernel/intvec_32.S +++ b/arch/tile/kernel/intvec_32.S | |||
| @@ -1506,13 +1506,6 @@ handle_ill: | |||
| 1506 | } | 1506 | } |
| 1507 | STD_ENDPROC(handle_ill) | 1507 | STD_ENDPROC(handle_ill) |
| 1508 | 1508 | ||
| 1509 | .pushsection .rodata, "a" | ||
| 1510 | .align 8 | ||
| 1511 | bpt_code: | ||
| 1512 | bpt | ||
| 1513 | ENDPROC(bpt_code) | ||
| 1514 | .popsection | ||
| 1515 | |||
| 1516 | /* Various stub interrupt handlers and syscall handlers */ | 1509 | /* Various stub interrupt handlers and syscall handlers */ |
| 1517 | 1510 | ||
| 1518 | STD_ENTRY_LOCAL(_kernel_double_fault) | 1511 | STD_ENTRY_LOCAL(_kernel_double_fault) |
diff --git a/arch/um/kernel/exec.c b/arch/um/kernel/exec.c index cd145eda3579..49b5e1eb3262 100644 --- a/arch/um/kernel/exec.c +++ b/arch/um/kernel/exec.c | |||
| @@ -62,7 +62,7 @@ static long execve1(const char *file, | |||
| 62 | return error; | 62 | return error; |
| 63 | } | 63 | } |
| 64 | 64 | ||
| 65 | long um_execve(const char *file, char __user *__user *argv, char __user *__user *env) | 65 | long um_execve(const char *file, const char __user *const __user *argv, const char __user *const __user *env) |
| 66 | { | 66 | { |
| 67 | long err; | 67 | long err; |
| 68 | 68 | ||
| @@ -72,8 +72,8 @@ long um_execve(const char *file, char __user *__user *argv, char __user *__user | |||
| 72 | return err; | 72 | return err; |
| 73 | } | 73 | } |
| 74 | 74 | ||
| 75 | long sys_execve(const char __user *file, char __user *__user *argv, | 75 | long sys_execve(const char __user *file, const char __user *const __user *argv, |
| 76 | char __user *__user *env) | 76 | const char __user *const __user *env) |
| 77 | { | 77 | { |
| 78 | long error; | 78 | long error; |
| 79 | char *filename; | 79 | char *filename; |
diff --git a/arch/um/kernel/internal.h b/arch/um/kernel/internal.h index 1303a105fe91..5bf97db24a04 100644 --- a/arch/um/kernel/internal.h +++ b/arch/um/kernel/internal.h | |||
| @@ -1 +1 @@ | |||
| extern long um_execve(const char *file, char __user *__user *argv, char __user *__user *env); | extern long um_execve(const char *file, const char __user *const __user *argv, const char __user *const __user *env); | ||
diff --git a/arch/um/kernel/syscall.c b/arch/um/kernel/syscall.c index 5ddb246626db..f958cb876ee3 100644 --- a/arch/um/kernel/syscall.c +++ b/arch/um/kernel/syscall.c | |||
| @@ -60,8 +60,8 @@ int kernel_execve(const char *filename, | |||
| 60 | 60 | ||
| 61 | fs = get_fs(); | 61 | fs = get_fs(); |
| 62 | set_fs(KERNEL_DS); | 62 | set_fs(KERNEL_DS); |
| 63 | ret = um_execve(filename, (char __user *__user *)argv, | 63 | ret = um_execve(filename, (const char __user *const __user *)argv, |
| 64 | (char __user *__user *) envp); | 64 | (const char __user *const __user *) envp); |
| 65 | set_fs(fs); | 65 | set_fs(fs); |
| 66 | 66 | ||
| 67 | return ret; | 67 | return ret; |
diff --git a/arch/x86/boot/early_serial_console.c b/arch/x86/boot/early_serial_console.c index 030f4b93e255..5df2869c874b 100644 --- a/arch/x86/boot/early_serial_console.c +++ b/arch/x86/boot/early_serial_console.c | |||
| @@ -58,7 +58,19 @@ static void parse_earlyprintk(void) | |||
| 58 | if (arg[pos] == ',') | 58 | if (arg[pos] == ',') |
| 59 | pos++; | 59 | pos++; |
| 60 | 60 | ||
| 61 | if (!strncmp(arg, "ttyS", 4)) { | 61 | /* |
| 62 | * make sure we have | ||
| 63 | * "serial,0x3f8,115200" | ||
| 64 | * "serial,ttyS0,115200" | ||
| 65 | * "ttyS0,115200" | ||
| 66 | */ | ||
| 67 | if (pos == 7 && !strncmp(arg + pos, "0x", 2)) { | ||
| 68 | port = simple_strtoull(arg + pos, &e, 16); | ||
| 69 | if (port == 0 || arg + pos == e) | ||
| 70 | port = DEFAULT_SERIAL_PORT; | ||
| 71 | else | ||
| 72 | pos = e - arg; | ||
| 73 | } else if (!strncmp(arg + pos, "ttyS", 4)) { | ||
| 62 | static const int bases[] = { 0x3f8, 0x2f8 }; | 74 | static const int bases[] = { 0x3f8, 0x2f8 }; |
| 63 | int idx = 0; | 75 | int idx = 0; |
| 64 | 76 | ||
diff --git a/arch/x86/include/asm/amd_iommu_proto.h b/arch/x86/include/asm/amd_iommu_proto.h index d2544f1d705d..cb030374b90a 100644 --- a/arch/x86/include/asm/amd_iommu_proto.h +++ b/arch/x86/include/asm/amd_iommu_proto.h | |||
| @@ -38,4 +38,10 @@ static inline void amd_iommu_stats_init(void) { } | |||
| 38 | 38 | ||
| 39 | #endif /* !CONFIG_AMD_IOMMU_STATS */ | 39 | #endif /* !CONFIG_AMD_IOMMU_STATS */ |
| 40 | 40 | ||
| 41 | static inline bool is_rd890_iommu(struct pci_dev *pdev) | ||
| 42 | { | ||
| 43 | return (pdev->vendor == PCI_VENDOR_ID_ATI) && | ||
| 44 | (pdev->device == PCI_DEVICE_ID_RD890_IOMMU); | ||
| 45 | } | ||
| 46 | |||
| 41 | #endif /* _ASM_X86_AMD_IOMMU_PROTO_H */ | 47 | #endif /* _ASM_X86_AMD_IOMMU_PROTO_H */ |
diff --git a/arch/x86/include/asm/amd_iommu_types.h b/arch/x86/include/asm/amd_iommu_types.h index 7014e88bc779..08616180deaf 100644 --- a/arch/x86/include/asm/amd_iommu_types.h +++ b/arch/x86/include/asm/amd_iommu_types.h | |||
| @@ -368,6 +368,9 @@ struct amd_iommu { | |||
| 368 | /* capabilities of that IOMMU read from ACPI */ | 368 | /* capabilities of that IOMMU read from ACPI */ |
| 369 | u32 cap; | 369 | u32 cap; |
| 370 | 370 | ||
| 371 | /* flags read from acpi table */ | ||
| 372 | u8 acpi_flags; | ||
| 373 | |||
| 371 | /* | 374 | /* |
| 372 | * Capability pointer. There could be more than one IOMMU per PCI | 375 | * Capability pointer. There could be more than one IOMMU per PCI |
| 373 | * device function if there are more than one AMD IOMMU capability | 376 | * device function if there are more than one AMD IOMMU capability |
| @@ -411,6 +414,15 @@ struct amd_iommu { | |||
| 411 | 414 | ||
| 412 | /* default dma_ops domain for that IOMMU */ | 415 | /* default dma_ops domain for that IOMMU */ |
| 413 | struct dma_ops_domain *default_dom; | 416 | struct dma_ops_domain *default_dom; |
| 417 | |||
| 418 | /* | ||
| 419 | * This array is required to work around a potential BIOS bug. | ||
| 420 | * The BIOS may miss to restore parts of the PCI configuration | ||
| 421 | * space when the system resumes from S3. The result is that the | ||
| 422 | * IOMMU does not execute commands anymore which leads to system | ||
| 423 | * failure. | ||
| 424 | */ | ||
| 425 | u32 cache_cfg[4]; | ||
| 414 | }; | 426 | }; |
| 415 | 427 | ||
| 416 | /* | 428 | /* |
diff --git a/arch/x86/include/asm/cpufeature.h b/arch/x86/include/asm/cpufeature.h index c6fbb7b430d1..3f76523589af 100644 --- a/arch/x86/include/asm/cpufeature.h +++ b/arch/x86/include/asm/cpufeature.h | |||
| @@ -168,6 +168,7 @@ | |||
| 168 | #define X86_FEATURE_XSAVEOPT (7*32+ 4) /* Optimized Xsave */ | 168 | #define X86_FEATURE_XSAVEOPT (7*32+ 4) /* Optimized Xsave */ |
| 169 | #define X86_FEATURE_PLN (7*32+ 5) /* Intel Power Limit Notification */ | 169 | #define X86_FEATURE_PLN (7*32+ 5) /* Intel Power Limit Notification */ |
| 170 | #define X86_FEATURE_PTS (7*32+ 6) /* Intel Package Thermal Status */ | 170 | #define X86_FEATURE_PTS (7*32+ 6) /* Intel Package Thermal Status */ |
| 171 | #define X86_FEATURE_DTS (7*32+ 7) /* Digital Thermal Sensor */ | ||
| 171 | 172 | ||
| 172 | /* Virtualization flags: Linux defined, word 8 */ | 173 | /* Virtualization flags: Linux defined, word 8 */ |
| 173 | #define X86_FEATURE_TPR_SHADOW (8*32+ 0) /* Intel TPR Shadow */ | 174 | #define X86_FEATURE_TPR_SHADOW (8*32+ 0) /* Intel TPR Shadow */ |
diff --git a/arch/x86/include/asm/hw_breakpoint.h b/arch/x86/include/asm/hw_breakpoint.h index 528a11e8d3e3..824ca07860d0 100644 --- a/arch/x86/include/asm/hw_breakpoint.h +++ b/arch/x86/include/asm/hw_breakpoint.h | |||
| @@ -20,7 +20,7 @@ struct arch_hw_breakpoint { | |||
| 20 | #include <linux/list.h> | 20 | #include <linux/list.h> |
| 21 | 21 | ||
| 22 | /* Available HW breakpoint length encodings */ | 22 | /* Available HW breakpoint length encodings */ |
| 23 | #define X86_BREAKPOINT_LEN_X 0x00 | 23 | #define X86_BREAKPOINT_LEN_X 0x40 |
| 24 | #define X86_BREAKPOINT_LEN_1 0x40 | 24 | #define X86_BREAKPOINT_LEN_1 0x40 |
| 25 | #define X86_BREAKPOINT_LEN_2 0x44 | 25 | #define X86_BREAKPOINT_LEN_2 0x44 |
| 26 | #define X86_BREAKPOINT_LEN_4 0x4c | 26 | #define X86_BREAKPOINT_LEN_4 0x4c |
diff --git a/arch/x86/kernel/Makefile b/arch/x86/kernel/Makefile index 0925676266bd..fedf32a8c3ec 100644 --- a/arch/x86/kernel/Makefile +++ b/arch/x86/kernel/Makefile | |||
| @@ -11,6 +11,8 @@ ifdef CONFIG_FUNCTION_TRACER | |||
| 11 | CFLAGS_REMOVE_tsc.o = -pg | 11 | CFLAGS_REMOVE_tsc.o = -pg |
| 12 | CFLAGS_REMOVE_rtc.o = -pg | 12 | CFLAGS_REMOVE_rtc.o = -pg |
| 13 | CFLAGS_REMOVE_paravirt-spinlocks.o = -pg | 13 | CFLAGS_REMOVE_paravirt-spinlocks.o = -pg |
| 14 | CFLAGS_REMOVE_pvclock.o = -pg | ||
| 15 | CFLAGS_REMOVE_kvmclock.o = -pg | ||
| 14 | CFLAGS_REMOVE_ftrace.o = -pg | 16 | CFLAGS_REMOVE_ftrace.o = -pg |
| 15 | CFLAGS_REMOVE_early_printk.o = -pg | 17 | CFLAGS_REMOVE_early_printk.o = -pg |
| 16 | endif | 18 | endif |
diff --git a/arch/x86/kernel/amd_iommu.c b/arch/x86/kernel/amd_iommu.c index fa044e1e30a2..679b6450382b 100644 --- a/arch/x86/kernel/amd_iommu.c +++ b/arch/x86/kernel/amd_iommu.c | |||
| @@ -1953,6 +1953,7 @@ static void __unmap_single(struct dma_ops_domain *dma_dom, | |||
| 1953 | size_t size, | 1953 | size_t size, |
| 1954 | int dir) | 1954 | int dir) |
| 1955 | { | 1955 | { |
| 1956 | dma_addr_t flush_addr; | ||
| 1956 | dma_addr_t i, start; | 1957 | dma_addr_t i, start; |
| 1957 | unsigned int pages; | 1958 | unsigned int pages; |
| 1958 | 1959 | ||
| @@ -1960,6 +1961,7 @@ static void __unmap_single(struct dma_ops_domain *dma_dom, | |||
| 1960 | (dma_addr + size > dma_dom->aperture_size)) | 1961 | (dma_addr + size > dma_dom->aperture_size)) |
| 1961 | return; | 1962 | return; |
| 1962 | 1963 | ||
| 1964 | flush_addr = dma_addr; | ||
| 1963 | pages = iommu_num_pages(dma_addr, size, PAGE_SIZE); | 1965 | pages = iommu_num_pages(dma_addr, size, PAGE_SIZE); |
| 1964 | dma_addr &= PAGE_MASK; | 1966 | dma_addr &= PAGE_MASK; |
| 1965 | start = dma_addr; | 1967 | start = dma_addr; |
| @@ -1974,7 +1976,7 @@ static void __unmap_single(struct dma_ops_domain *dma_dom, | |||
| 1974 | dma_ops_free_addresses(dma_dom, dma_addr, pages); | 1976 | dma_ops_free_addresses(dma_dom, dma_addr, pages); |
| 1975 | 1977 | ||
| 1976 | if (amd_iommu_unmap_flush || dma_dom->need_flush) { | 1978 | if (amd_iommu_unmap_flush || dma_dom->need_flush) { |
| 1977 | iommu_flush_pages(&dma_dom->domain, dma_addr, size); | 1979 | iommu_flush_pages(&dma_dom->domain, flush_addr, size); |
| 1978 | dma_dom->need_flush = false; | 1980 | dma_dom->need_flush = false; |
| 1979 | } | 1981 | } |
| 1980 | } | 1982 | } |
diff --git a/arch/x86/kernel/amd_iommu_init.c b/arch/x86/kernel/amd_iommu_init.c index 3cc63e2b8dd4..5a170cbbbed8 100644 --- a/arch/x86/kernel/amd_iommu_init.c +++ b/arch/x86/kernel/amd_iommu_init.c | |||
| @@ -632,6 +632,13 @@ static void __init init_iommu_from_pci(struct amd_iommu *iommu) | |||
| 632 | iommu->last_device = calc_devid(MMIO_GET_BUS(range), | 632 | iommu->last_device = calc_devid(MMIO_GET_BUS(range), |
| 633 | MMIO_GET_LD(range)); | 633 | MMIO_GET_LD(range)); |
| 634 | iommu->evt_msi_num = MMIO_MSI_NUM(misc); | 634 | iommu->evt_msi_num = MMIO_MSI_NUM(misc); |
| 635 | |||
| 636 | if (is_rd890_iommu(iommu->dev)) { | ||
| 637 | pci_read_config_dword(iommu->dev, 0xf0, &iommu->cache_cfg[0]); | ||
| 638 | pci_read_config_dword(iommu->dev, 0xf4, &iommu->cache_cfg[1]); | ||
| 639 | pci_read_config_dword(iommu->dev, 0xf8, &iommu->cache_cfg[2]); | ||
| 640 | pci_read_config_dword(iommu->dev, 0xfc, &iommu->cache_cfg[3]); | ||
| 641 | } | ||
| 635 | } | 642 | } |
| 636 | 643 | ||
| 637 | /* | 644 | /* |
| @@ -649,29 +656,9 @@ static void __init init_iommu_from_acpi(struct amd_iommu *iommu, | |||
| 649 | struct ivhd_entry *e; | 656 | struct ivhd_entry *e; |
| 650 | 657 | ||
| 651 | /* | 658 | /* |
| 652 | * First set the recommended feature enable bits from ACPI | 659 | * First save the recommended feature enable bits from ACPI |
| 653 | * into the IOMMU control registers | ||
| 654 | */ | 660 | */ |
| 655 | h->flags & IVHD_FLAG_HT_TUN_EN_MASK ? | 661 | iommu->acpi_flags = h->flags; |
| 656 | iommu_feature_enable(iommu, CONTROL_HT_TUN_EN) : | ||
| 657 | iommu_feature_disable(iommu, CONTROL_HT_TUN_EN); | ||
| 658 | |||
| 659 | h->flags & IVHD_FLAG_PASSPW_EN_MASK ? | ||
| 660 | iommu_feature_enable(iommu, CONTROL_PASSPW_EN) : | ||
| 661 | iommu_feature_disable(iommu, CONTROL_PASSPW_EN); | ||
| 662 | |||
| 663 | h->flags & IVHD_FLAG_RESPASSPW_EN_MASK ? | ||
| 664 | iommu_feature_enable(iommu, CONTROL_RESPASSPW_EN) : | ||
| 665 | iommu_feature_disable(iommu, CONTROL_RESPASSPW_EN); | ||
| 666 | |||
| 667 | h->flags & IVHD_FLAG_ISOC_EN_MASK ? | ||
| 668 | iommu_feature_enable(iommu, CONTROL_ISOC_EN) : | ||
| 669 | iommu_feature_disable(iommu, CONTROL_ISOC_EN); | ||
| 670 | |||
| 671 | /* | ||
| 672 | * make IOMMU memory accesses cache coherent | ||
| 673 | */ | ||
| 674 | iommu_feature_enable(iommu, CONTROL_COHERENT_EN); | ||
| 675 | 662 | ||
| 676 | /* | 663 | /* |
| 677 | * Done. Now parse the device entries | 664 | * Done. Now parse the device entries |
| @@ -1116,6 +1103,40 @@ static void init_device_table(void) | |||
| 1116 | } | 1103 | } |
| 1117 | } | 1104 | } |
| 1118 | 1105 | ||
| 1106 | static void iommu_init_flags(struct amd_iommu *iommu) | ||
| 1107 | { | ||
| 1108 | iommu->acpi_flags & IVHD_FLAG_HT_TUN_EN_MASK ? | ||
| 1109 | iommu_feature_enable(iommu, CONTROL_HT_TUN_EN) : | ||
| 1110 | iommu_feature_disable(iommu, CONTROL_HT_TUN_EN); | ||
| 1111 | |||
| 1112 | iommu->acpi_flags & IVHD_FLAG_PASSPW_EN_MASK ? | ||
| 1113 | iommu_feature_enable(iommu, CONTROL_PASSPW_EN) : | ||
| 1114 | iommu_feature_disable(iommu, CONTROL_PASSPW_EN); | ||
| 1115 | |||
| 1116 | iommu->acpi_flags & IVHD_FLAG_RESPASSPW_EN_MASK ? | ||
| 1117 | iommu_feature_enable(iommu, CONTROL_RESPASSPW_EN) : | ||
| 1118 | iommu_feature_disable(iommu, CONTROL_RESPASSPW_EN); | ||
| 1119 | |||
| 1120 | iommu->acpi_flags & IVHD_FLAG_ISOC_EN_MASK ? | ||
| 1121 | iommu_feature_enable(iommu, CONTROL_ISOC_EN) : | ||
| 1122 | iommu_feature_disable(iommu, CONTROL_ISOC_EN); | ||
| 1123 | |||
| 1124 | /* | ||
| 1125 | * make IOMMU memory accesses cache coherent | ||
| 1126 | */ | ||
| 1127 | iommu_feature_enable(iommu, CONTROL_COHERENT_EN); | ||
| 1128 | } | ||
| 1129 | |||
| 1130 | static void iommu_apply_quirks(struct amd_iommu *iommu) | ||
| 1131 | { | ||
| 1132 | if (is_rd890_iommu(iommu->dev)) { | ||
| 1133 | pci_write_config_dword(iommu->dev, 0xf0, iommu->cache_cfg[0]); | ||
| 1134 | pci_write_config_dword(iommu->dev, 0xf4, iommu->cache_cfg[1]); | ||
| 1135 | pci_write_config_dword(iommu->dev, 0xf8, iommu->cache_cfg[2]); | ||
| 1136 | pci_write_config_dword(iommu->dev, 0xfc, iommu->cache_cfg[3]); | ||
| 1137 | } | ||
| 1138 | } | ||
| 1139 | |||
| 1119 | /* | 1140 | /* |
| 1120 | * This function finally enables all IOMMUs found in the system after | 1141 | * This function finally enables all IOMMUs found in the system after |
| 1121 | * they have been initialized | 1142 | * they have been initialized |
| @@ -1126,6 +1147,8 @@ static void enable_iommus(void) | |||
| 1126 | 1147 | ||
| 1127 | for_each_iommu(iommu) { | 1148 | for_each_iommu(iommu) { |
| 1128 | iommu_disable(iommu); | 1149 | iommu_disable(iommu); |
| 1150 | iommu_apply_quirks(iommu); | ||
| 1151 | iommu_init_flags(iommu); | ||
| 1129 | iommu_set_device_table(iommu); | 1152 | iommu_set_device_table(iommu); |
| 1130 | iommu_enable_command_buffer(iommu); | 1153 | iommu_enable_command_buffer(iommu); |
| 1131 | iommu_enable_event_buffer(iommu); | 1154 | iommu_enable_event_buffer(iommu); |
diff --git a/arch/x86/kernel/cpu/perf_event.c b/arch/x86/kernel/cpu/perf_event.c index 3efdf2870a35..03a5b0385ad6 100644 --- a/arch/x86/kernel/cpu/perf_event.c +++ b/arch/x86/kernel/cpu/perf_event.c | |||
| @@ -102,6 +102,7 @@ struct cpu_hw_events { | |||
| 102 | */ | 102 | */ |
| 103 | struct perf_event *events[X86_PMC_IDX_MAX]; /* in counter order */ | 103 | struct perf_event *events[X86_PMC_IDX_MAX]; /* in counter order */ |
| 104 | unsigned long active_mask[BITS_TO_LONGS(X86_PMC_IDX_MAX)]; | 104 | unsigned long active_mask[BITS_TO_LONGS(X86_PMC_IDX_MAX)]; |
| 105 | unsigned long running[BITS_TO_LONGS(X86_PMC_IDX_MAX)]; | ||
| 105 | int enabled; | 106 | int enabled; |
| 106 | 107 | ||
| 107 | int n_events; | 108 | int n_events; |
| @@ -1010,6 +1011,7 @@ static int x86_pmu_start(struct perf_event *event) | |||
| 1010 | x86_perf_event_set_period(event); | 1011 | x86_perf_event_set_period(event); |
| 1011 | cpuc->events[idx] = event; | 1012 | cpuc->events[idx] = event; |
| 1012 | __set_bit(idx, cpuc->active_mask); | 1013 | __set_bit(idx, cpuc->active_mask); |
| 1014 | __set_bit(idx, cpuc->running); | ||
| 1013 | x86_pmu.enable(event); | 1015 | x86_pmu.enable(event); |
| 1014 | perf_event_update_userpage(event); | 1016 | perf_event_update_userpage(event); |
| 1015 | 1017 | ||
| @@ -1141,8 +1143,16 @@ static int x86_pmu_handle_irq(struct pt_regs *regs) | |||
| 1141 | cpuc = &__get_cpu_var(cpu_hw_events); | 1143 | cpuc = &__get_cpu_var(cpu_hw_events); |
| 1142 | 1144 | ||
| 1143 | for (idx = 0; idx < x86_pmu.num_counters; idx++) { | 1145 | for (idx = 0; idx < x86_pmu.num_counters; idx++) { |
| 1144 | if (!test_bit(idx, cpuc->active_mask)) | 1146 | if (!test_bit(idx, cpuc->active_mask)) { |
| 1147 | /* | ||
| 1148 | * Though we deactivated the counter some cpus | ||
| 1149 | * might still deliver spurious interrupts still | ||
| 1150 | * in flight. Catch them: | ||
| 1151 | */ | ||
| 1152 | if (__test_and_clear_bit(idx, cpuc->running)) | ||
| 1153 | handled++; | ||
| 1145 | continue; | 1154 | continue; |
| 1155 | } | ||
| 1146 | 1156 | ||
| 1147 | event = cpuc->events[idx]; | 1157 | event = cpuc->events[idx]; |
| 1148 | hwc = &event->hw; | 1158 | hwc = &event->hw; |
diff --git a/arch/x86/kernel/cpu/scattered.c b/arch/x86/kernel/cpu/scattered.c index 34b4dad6f0b8..d49079515122 100644 --- a/arch/x86/kernel/cpu/scattered.c +++ b/arch/x86/kernel/cpu/scattered.c | |||
| @@ -31,6 +31,7 @@ void __cpuinit init_scattered_cpuid_features(struct cpuinfo_x86 *c) | |||
| 31 | const struct cpuid_bit *cb; | 31 | const struct cpuid_bit *cb; |
| 32 | 32 | ||
| 33 | static const struct cpuid_bit __cpuinitconst cpuid_bits[] = { | 33 | static const struct cpuid_bit __cpuinitconst cpuid_bits[] = { |
| 34 | { X86_FEATURE_DTS, CR_EAX, 0, 0x00000006, 0 }, | ||
| 34 | { X86_FEATURE_IDA, CR_EAX, 1, 0x00000006, 0 }, | 35 | { X86_FEATURE_IDA, CR_EAX, 1, 0x00000006, 0 }, |
| 35 | { X86_FEATURE_ARAT, CR_EAX, 2, 0x00000006, 0 }, | 36 | { X86_FEATURE_ARAT, CR_EAX, 2, 0x00000006, 0 }, |
| 36 | { X86_FEATURE_PLN, CR_EAX, 4, 0x00000006, 0 }, | 37 | { X86_FEATURE_PLN, CR_EAX, 4, 0x00000006, 0 }, |
diff --git a/arch/x86/kernel/hw_breakpoint.c b/arch/x86/kernel/hw_breakpoint.c index a474ec37c32f..ff15c9dcc25d 100644 --- a/arch/x86/kernel/hw_breakpoint.c +++ b/arch/x86/kernel/hw_breakpoint.c | |||
| @@ -206,11 +206,27 @@ int arch_check_bp_in_kernelspace(struct perf_event *bp) | |||
| 206 | int arch_bp_generic_fields(int x86_len, int x86_type, | 206 | int arch_bp_generic_fields(int x86_len, int x86_type, |
| 207 | int *gen_len, int *gen_type) | 207 | int *gen_len, int *gen_type) |
| 208 | { | 208 | { |
| 209 | /* Len */ | 209 | /* Type */ |
| 210 | switch (x86_len) { | 210 | switch (x86_type) { |
| 211 | case X86_BREAKPOINT_LEN_X: | 211 | case X86_BREAKPOINT_EXECUTE: |
| 212 | if (x86_len != X86_BREAKPOINT_LEN_X) | ||
| 213 | return -EINVAL; | ||
| 214 | |||
| 215 | *gen_type = HW_BREAKPOINT_X; | ||
| 212 | *gen_len = sizeof(long); | 216 | *gen_len = sizeof(long); |
| 217 | return 0; | ||
| 218 | case X86_BREAKPOINT_WRITE: | ||
| 219 | *gen_type = HW_BREAKPOINT_W; | ||
| 213 | break; | 220 | break; |
| 221 | case X86_BREAKPOINT_RW: | ||
| 222 | *gen_type = HW_BREAKPOINT_W | HW_BREAKPOINT_R; | ||
| 223 | break; | ||
| 224 | default: | ||
| 225 | return -EINVAL; | ||
| 226 | } | ||
| 227 | |||
| 228 | /* Len */ | ||
| 229 | switch (x86_len) { | ||
| 214 | case X86_BREAKPOINT_LEN_1: | 230 | case X86_BREAKPOINT_LEN_1: |
| 215 | *gen_len = HW_BREAKPOINT_LEN_1; | 231 | *gen_len = HW_BREAKPOINT_LEN_1; |
| 216 | break; | 232 | break; |
| @@ -229,21 +245,6 @@ int arch_bp_generic_fields(int x86_len, int x86_type, | |||
| 229 | return -EINVAL; | 245 | return -EINVAL; |
| 230 | } | 246 | } |
| 231 | 247 | ||
| 232 | /* Type */ | ||
| 233 | switch (x86_type) { | ||
| 234 | case X86_BREAKPOINT_EXECUTE: | ||
| 235 | *gen_type = HW_BREAKPOINT_X; | ||
| 236 | break; | ||
| 237 | case X86_BREAKPOINT_WRITE: | ||
| 238 | *gen_type = HW_BREAKPOINT_W; | ||
| 239 | break; | ||
| 240 | case X86_BREAKPOINT_RW: | ||
| 241 | *gen_type = HW_BREAKPOINT_W | HW_BREAKPOINT_R; | ||
| 242 | break; | ||
| 243 | default: | ||
| 244 | return -EINVAL; | ||
| 245 | } | ||
| 246 | |||
| 247 | return 0; | 248 | return 0; |
| 248 | } | 249 | } |
| 249 | 250 | ||
| @@ -316,9 +317,6 @@ int arch_validate_hwbkpt_settings(struct perf_event *bp) | |||
| 316 | ret = -EINVAL; | 317 | ret = -EINVAL; |
| 317 | 318 | ||
| 318 | switch (info->len) { | 319 | switch (info->len) { |
| 319 | case X86_BREAKPOINT_LEN_X: | ||
| 320 | align = sizeof(long) -1; | ||
| 321 | break; | ||
| 322 | case X86_BREAKPOINT_LEN_1: | 320 | case X86_BREAKPOINT_LEN_1: |
| 323 | align = 0; | 321 | align = 0; |
| 324 | break; | 322 | break; |
diff --git a/arch/x86/lguest/boot.c b/arch/x86/lguest/boot.c index 9257510b4836..9d5f55848455 100644 --- a/arch/x86/lguest/boot.c +++ b/arch/x86/lguest/boot.c | |||
| @@ -324,9 +324,8 @@ static void lguest_load_gdt(const struct desc_ptr *desc) | |||
| 324 | } | 324 | } |
| 325 | 325 | ||
| 326 | /* | 326 | /* |
| 327 | * For a single GDT entry which changes, we do the lazy thing: alter our GDT, | 327 | * For a single GDT entry which changes, we simply change our copy and |
| 328 | * then tell the Host to reload the entire thing. This operation is so rare | 328 | * then tell the host about it. |
| 329 | * that this naive implementation is reasonable. | ||
| 330 | */ | 329 | */ |
| 331 | static void lguest_write_gdt_entry(struct desc_struct *dt, int entrynum, | 330 | static void lguest_write_gdt_entry(struct desc_struct *dt, int entrynum, |
| 332 | const void *desc, int type) | 331 | const void *desc, int type) |
| @@ -338,9 +337,13 @@ static void lguest_write_gdt_entry(struct desc_struct *dt, int entrynum, | |||
| 338 | } | 337 | } |
| 339 | 338 | ||
| 340 | /* | 339 | /* |
| 341 | * OK, I lied. There are three "thread local storage" GDT entries which change | 340 | * There are three "thread local storage" GDT entries which change |
| 342 | * on every context switch (these three entries are how glibc implements | 341 | * on every context switch (these three entries are how glibc implements |
| 343 | * __thread variables). So we have a hypercall specifically for this case. | 342 | * __thread variables). As an optimization, we have a hypercall |
| 343 | * specifically for this case. | ||
| 344 | * | ||
| 345 | * Wouldn't it be nicer to have a general LOAD_GDT_ENTRIES hypercall | ||
| 346 | * which took a range of entries? | ||
| 344 | */ | 347 | */ |
| 345 | static void lguest_load_tls(struct thread_struct *t, unsigned int cpu) | 348 | static void lguest_load_tls(struct thread_struct *t, unsigned int cpu) |
| 346 | { | 349 | { |
diff --git a/arch/x86/oprofile/nmi_int.c b/arch/x86/oprofile/nmi_int.c index cfe4faabb0f6..009b819f48d0 100644 --- a/arch/x86/oprofile/nmi_int.c +++ b/arch/x86/oprofile/nmi_int.c | |||
| @@ -671,7 +671,9 @@ static int __init ppro_init(char **cpu_type) | |||
| 671 | case 14: | 671 | case 14: |
| 672 | *cpu_type = "i386/core"; | 672 | *cpu_type = "i386/core"; |
| 673 | break; | 673 | break; |
| 674 | case 15: case 23: | 674 | case 0x0f: |
| 675 | case 0x16: | ||
| 676 | case 0x17: | ||
| 675 | *cpu_type = "i386/core_2"; | 677 | *cpu_type = "i386/core_2"; |
| 676 | break; | 678 | break; |
| 677 | case 0x1a: | 679 | case 0x1a: |
diff --git a/block/blk-map.c b/block/blk-map.c index c65d7593f7f1..ade0a08c9099 100644 --- a/block/blk-map.c +++ b/block/blk-map.c | |||
| @@ -307,7 +307,7 @@ int blk_rq_map_kern(struct request_queue *q, struct request *rq, void *kbuf, | |||
| 307 | return PTR_ERR(bio); | 307 | return PTR_ERR(bio); |
| 308 | 308 | ||
| 309 | if (rq_data_dir(rq) == WRITE) | 309 | if (rq_data_dir(rq) == WRITE) |
| 310 | bio->bi_rw |= (1 << REQ_WRITE); | 310 | bio->bi_rw |= REQ_WRITE; |
| 311 | 311 | ||
| 312 | if (do_copy) | 312 | if (do_copy) |
| 313 | rq->cmd_flags |= REQ_COPY_USER; | 313 | rq->cmd_flags |= REQ_COPY_USER; |
diff --git a/block/blk-merge.c b/block/blk-merge.c index 3b0cd4249671..eafc94f68d79 100644 --- a/block/blk-merge.c +++ b/block/blk-merge.c | |||
| @@ -362,6 +362,18 @@ static int attempt_merge(struct request_queue *q, struct request *req, | |||
| 362 | return 0; | 362 | return 0; |
| 363 | 363 | ||
| 364 | /* | 364 | /* |
| 365 | * Don't merge file system requests and discard requests | ||
| 366 | */ | ||
| 367 | if ((req->cmd_flags & REQ_DISCARD) != (next->cmd_flags & REQ_DISCARD)) | ||
| 368 | return 0; | ||
| 369 | |||
| 370 | /* | ||
| 371 | * Don't merge discard requests and secure discard requests | ||
| 372 | */ | ||
| 373 | if ((req->cmd_flags & REQ_SECURE) != (next->cmd_flags & REQ_SECURE)) | ||
| 374 | return 0; | ||
| 375 | |||
| 376 | /* | ||
| 365 | * not contiguous | 377 | * not contiguous |
| 366 | */ | 378 | */ |
| 367 | if (blk_rq_pos(req) + blk_rq_sectors(req) != blk_rq_pos(next)) | 379 | if (blk_rq_pos(req) + blk_rq_sectors(req) != blk_rq_pos(next)) |
diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c index f65c6f01c475..9eba291eb6fd 100644 --- a/block/cfq-iosched.c +++ b/block/cfq-iosched.c | |||
| @@ -1019,10 +1019,20 @@ cfq_find_alloc_cfqg(struct cfq_data *cfqd, struct cgroup *cgroup, int create) | |||
| 1019 | */ | 1019 | */ |
| 1020 | atomic_set(&cfqg->ref, 1); | 1020 | atomic_set(&cfqg->ref, 1); |
| 1021 | 1021 | ||
| 1022 | /* Add group onto cgroup list */ | 1022 | /* |
| 1023 | sscanf(dev_name(bdi->dev), "%u:%u", &major, &minor); | 1023 | * Add group onto cgroup list. It might happen that bdi->dev is |
| 1024 | cfq_blkiocg_add_blkio_group(blkcg, &cfqg->blkg, (void *)cfqd, | 1024 | * not initiliazed yet. Initialize this new group without major |
| 1025 | * and minor info and this info will be filled in once a new thread | ||
| 1026 | * comes for IO. See code above. | ||
| 1027 | */ | ||
| 1028 | if (bdi->dev) { | ||
| 1029 | sscanf(dev_name(bdi->dev), "%u:%u", &major, &minor); | ||
| 1030 | cfq_blkiocg_add_blkio_group(blkcg, &cfqg->blkg, (void *)cfqd, | ||
| 1025 | MKDEV(major, minor)); | 1031 | MKDEV(major, minor)); |
| 1032 | } else | ||
| 1033 | cfq_blkiocg_add_blkio_group(blkcg, &cfqg->blkg, (void *)cfqd, | ||
| 1034 | 0); | ||
| 1035 | |||
| 1026 | cfqg->weight = blkcg_get_weight(blkcg, cfqg->blkg.dev); | 1036 | cfqg->weight = blkcg_get_weight(blkcg, cfqg->blkg.dev); |
| 1027 | 1037 | ||
| 1028 | /* Add group on cfqd list */ | 1038 | /* Add group on cfqd list */ |
diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c index 6124c2fd2d33..5e4fadcdece9 100644 --- a/drivers/block/cciss.c +++ b/drivers/block/cciss.c | |||
| @@ -4792,7 +4792,7 @@ static int __devinit cciss_init_one(struct pci_dev *pdev, | |||
| 4792 | clean4: | 4792 | clean4: |
| 4793 | kfree(h->cmd_pool_bits); | 4793 | kfree(h->cmd_pool_bits); |
| 4794 | /* Free up sg elements */ | 4794 | /* Free up sg elements */ |
| 4795 | for (k = 0; k < h->nr_cmds; k++) | 4795 | for (k-- ; k >= 0; k--) |
| 4796 | kfree(h->scatter_list[k]); | 4796 | kfree(h->scatter_list[k]); |
| 4797 | kfree(h->scatter_list); | 4797 | kfree(h->scatter_list); |
| 4798 | cciss_free_sg_chain_blocks(h->cmd_sg_list, h->nr_cmds); | 4798 | cciss_free_sg_chain_blocks(h->cmd_sg_list, h->nr_cmds); |
diff --git a/drivers/char/ipmi/ipmi_si_intf.c b/drivers/char/ipmi/ipmi_si_intf.c index 3822b4f49c84..7bd7c45b53ef 100644 --- a/drivers/char/ipmi/ipmi_si_intf.c +++ b/drivers/char/ipmi/ipmi_si_intf.c | |||
| @@ -305,6 +305,9 @@ static int num_force_kipmid; | |||
| 305 | #ifdef CONFIG_PCI | 305 | #ifdef CONFIG_PCI |
| 306 | static int pci_registered; | 306 | static int pci_registered; |
| 307 | #endif | 307 | #endif |
| 308 | #ifdef CONFIG_ACPI | ||
| 309 | static int pnp_registered; | ||
| 310 | #endif | ||
| 308 | #ifdef CONFIG_PPC_OF | 311 | #ifdef CONFIG_PPC_OF |
| 309 | static int of_registered; | 312 | static int of_registered; |
| 310 | #endif | 313 | #endif |
| @@ -2126,7 +2129,7 @@ static int __devinit ipmi_pnp_probe(struct pnp_dev *dev, | |||
| 2126 | { | 2129 | { |
| 2127 | struct acpi_device *acpi_dev; | 2130 | struct acpi_device *acpi_dev; |
| 2128 | struct smi_info *info; | 2131 | struct smi_info *info; |
| 2129 | struct resource *res; | 2132 | struct resource *res, *res_second; |
| 2130 | acpi_handle handle; | 2133 | acpi_handle handle; |
| 2131 | acpi_status status; | 2134 | acpi_status status; |
| 2132 | unsigned long long tmp; | 2135 | unsigned long long tmp; |
| @@ -2182,13 +2185,13 @@ static int __devinit ipmi_pnp_probe(struct pnp_dev *dev, | |||
| 2182 | info->io.addr_data = res->start; | 2185 | info->io.addr_data = res->start; |
| 2183 | 2186 | ||
| 2184 | info->io.regspacing = DEFAULT_REGSPACING; | 2187 | info->io.regspacing = DEFAULT_REGSPACING; |
| 2185 | res = pnp_get_resource(dev, | 2188 | res_second = pnp_get_resource(dev, |
| 2186 | (info->io.addr_type == IPMI_IO_ADDR_SPACE) ? | 2189 | (info->io.addr_type == IPMI_IO_ADDR_SPACE) ? |
| 2187 | IORESOURCE_IO : IORESOURCE_MEM, | 2190 | IORESOURCE_IO : IORESOURCE_MEM, |
| 2188 | 1); | 2191 | 1); |
| 2189 | if (res) { | 2192 | if (res_second) { |
| 2190 | if (res->start > info->io.addr_data) | 2193 | if (res_second->start > info->io.addr_data) |
| 2191 | info->io.regspacing = res->start - info->io.addr_data; | 2194 | info->io.regspacing = res_second->start - info->io.addr_data; |
| 2192 | } | 2195 | } |
| 2193 | info->io.regsize = DEFAULT_REGSPACING; | 2196 | info->io.regsize = DEFAULT_REGSPACING; |
| 2194 | info->io.regshift = 0; | 2197 | info->io.regshift = 0; |
| @@ -3359,6 +3362,7 @@ static __devinit int init_ipmi_si(void) | |||
| 3359 | 3362 | ||
| 3360 | #ifdef CONFIG_ACPI | 3363 | #ifdef CONFIG_ACPI |
| 3361 | pnp_register_driver(&ipmi_pnp_driver); | 3364 | pnp_register_driver(&ipmi_pnp_driver); |
| 3365 | pnp_registered = 1; | ||
| 3362 | #endif | 3366 | #endif |
| 3363 | 3367 | ||
| 3364 | #ifdef CONFIG_DMI | 3368 | #ifdef CONFIG_DMI |
| @@ -3526,7 +3530,8 @@ static __exit void cleanup_ipmi_si(void) | |||
| 3526 | pci_unregister_driver(&ipmi_pci_driver); | 3530 | pci_unregister_driver(&ipmi_pci_driver); |
| 3527 | #endif | 3531 | #endif |
| 3528 | #ifdef CONFIG_ACPI | 3532 | #ifdef CONFIG_ACPI |
| 3529 | pnp_unregister_driver(&ipmi_pnp_driver); | 3533 | if (pnp_registered) |
| 3534 | pnp_unregister_driver(&ipmi_pnp_driver); | ||
| 3530 | #endif | 3535 | #endif |
| 3531 | 3536 | ||
| 3532 | #ifdef CONFIG_PPC_OF | 3537 | #ifdef CONFIG_PPC_OF |
diff --git a/drivers/char/mem.c b/drivers/char/mem.c index a398ecdbd758..1f528fad3516 100644 --- a/drivers/char/mem.c +++ b/drivers/char/mem.c | |||
| @@ -788,10 +788,11 @@ static const struct file_operations zero_fops = { | |||
| 788 | /* | 788 | /* |
| 789 | * capabilities for /dev/zero | 789 | * capabilities for /dev/zero |
| 790 | * - permits private mappings, "copies" are taken of the source of zeros | 790 | * - permits private mappings, "copies" are taken of the source of zeros |
| 791 | * - no writeback happens | ||
| 791 | */ | 792 | */ |
| 792 | static struct backing_dev_info zero_bdi = { | 793 | static struct backing_dev_info zero_bdi = { |
| 793 | .name = "char/mem", | 794 | .name = "char/mem", |
| 794 | .capabilities = BDI_CAP_MAP_COPY, | 795 | .capabilities = BDI_CAP_MAP_COPY | BDI_CAP_NO_ACCT_AND_WRITEBACK, |
| 795 | }; | 796 | }; |
| 796 | 797 | ||
| 797 | static const struct file_operations full_fops = { | 798 | static const struct file_operations full_fops = { |
diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c index 942a9826bd23..c810481a5bc2 100644 --- a/drivers/char/virtio_console.c +++ b/drivers/char/virtio_console.c | |||
| @@ -596,6 +596,10 @@ static ssize_t port_fops_write(struct file *filp, const char __user *ubuf, | |||
| 596 | ssize_t ret; | 596 | ssize_t ret; |
| 597 | bool nonblock; | 597 | bool nonblock; |
| 598 | 598 | ||
| 599 | /* Userspace could be out to fool us */ | ||
| 600 | if (!count) | ||
| 601 | return 0; | ||
| 602 | |||
| 599 | port = filp->private_data; | 603 | port = filp->private_data; |
| 600 | 604 | ||
| 601 | nonblock = filp->f_flags & O_NONBLOCK; | 605 | nonblock = filp->f_flags & O_NONBLOCK; |
| @@ -642,7 +646,7 @@ static unsigned int port_fops_poll(struct file *filp, poll_table *wait) | |||
| 642 | poll_wait(filp, &port->waitqueue, wait); | 646 | poll_wait(filp, &port->waitqueue, wait); |
| 643 | 647 | ||
| 644 | ret = 0; | 648 | ret = 0; |
| 645 | if (port->inbuf) | 649 | if (!will_read_block(port)) |
| 646 | ret |= POLLIN | POLLRDNORM; | 650 | ret |= POLLIN | POLLRDNORM; |
| 647 | if (!will_write_block(port)) | 651 | if (!will_write_block(port)) |
| 648 | ret |= POLLOUT; | 652 | ret |= POLLOUT; |
diff --git a/drivers/gpu/drm/drm_buffer.c b/drivers/gpu/drm/drm_buffer.c index 55d03ed05000..529a0dbe9fc6 100644 --- a/drivers/gpu/drm/drm_buffer.c +++ b/drivers/gpu/drm/drm_buffer.c | |||
| @@ -98,8 +98,8 @@ EXPORT_SYMBOL(drm_buffer_alloc); | |||
| 98 | * user_data: A pointer the data that is copied to the buffer. | 98 | * user_data: A pointer the data that is copied to the buffer. |
| 99 | * size: The Number of bytes to copy. | 99 | * size: The Number of bytes to copy. |
| 100 | */ | 100 | */ |
| 101 | extern int drm_buffer_copy_from_user(struct drm_buffer *buf, | 101 | int drm_buffer_copy_from_user(struct drm_buffer *buf, |
| 102 | void __user *user_data, int size) | 102 | void __user *user_data, int size) |
| 103 | { | 103 | { |
| 104 | int nr_pages = size / PAGE_SIZE + 1; | 104 | int nr_pages = size / PAGE_SIZE + 1; |
| 105 | int idx; | 105 | int idx; |
| @@ -163,7 +163,7 @@ void *drm_buffer_read_object(struct drm_buffer *buf, | |||
| 163 | { | 163 | { |
| 164 | int idx = drm_buffer_index(buf); | 164 | int idx = drm_buffer_index(buf); |
| 165 | int page = drm_buffer_page(buf); | 165 | int page = drm_buffer_page(buf); |
| 166 | void *obj = 0; | 166 | void *obj = NULL; |
| 167 | 167 | ||
| 168 | if (idx + objsize <= PAGE_SIZE) { | 168 | if (idx + objsize <= PAGE_SIZE) { |
| 169 | obj = &buf->data[page][idx]; | 169 | obj = &buf->data[page][idx]; |
diff --git a/drivers/gpu/drm/nouveau/nouveau_connector.c b/drivers/gpu/drm/nouveau/nouveau_connector.c index 87186a4bbf03..fc737037f751 100644 --- a/drivers/gpu/drm/nouveau/nouveau_connector.c +++ b/drivers/gpu/drm/nouveau/nouveau_connector.c | |||
| @@ -558,8 +558,10 @@ nouveau_connector_get_modes(struct drm_connector *connector) | |||
| 558 | if (nv_encoder->dcb->type == OUTPUT_LVDS && | 558 | if (nv_encoder->dcb->type == OUTPUT_LVDS && |
| 559 | (nv_encoder->dcb->lvdsconf.use_straps_for_mode || | 559 | (nv_encoder->dcb->lvdsconf.use_straps_for_mode || |
| 560 | dev_priv->vbios.fp_no_ddc) && nouveau_bios_fp_mode(dev, NULL)) { | 560 | dev_priv->vbios.fp_no_ddc) && nouveau_bios_fp_mode(dev, NULL)) { |
| 561 | nv_connector->native_mode = drm_mode_create(dev); | 561 | struct drm_display_mode mode; |
| 562 | nouveau_bios_fp_mode(dev, nv_connector->native_mode); | 562 | |
| 563 | nouveau_bios_fp_mode(dev, &mode); | ||
| 564 | nv_connector->native_mode = drm_mode_duplicate(dev, &mode); | ||
| 563 | } | 565 | } |
| 564 | 566 | ||
| 565 | /* Find the native mode if this is a digital panel, if we didn't | 567 | /* Find the native mode if this is a digital panel, if we didn't |
diff --git a/drivers/gpu/drm/radeon/atombios.h b/drivers/gpu/drm/radeon/atombios.h index 1bc72c3190a9..fe359a239df3 100644 --- a/drivers/gpu/drm/radeon/atombios.h +++ b/drivers/gpu/drm/radeon/atombios.h | |||
| @@ -4999,7 +4999,7 @@ typedef struct _SW_I2C_IO_DATA_PARAMETERS | |||
| 4999 | #define SW_I2C_CNTL_WRITE1BIT 6 | 4999 | #define SW_I2C_CNTL_WRITE1BIT 6 |
| 5000 | 5000 | ||
| 5001 | //==============================VESA definition Portion=============================== | 5001 | //==============================VESA definition Portion=============================== |
| 5002 | #define VESA_OEM_PRODUCT_REV '01.00' | 5002 | #define VESA_OEM_PRODUCT_REV "01.00" |
| 5003 | #define VESA_MODE_ATTRIBUTE_MODE_SUPPORT 0xBB //refer to VBE spec p.32, no TTY support | 5003 | #define VESA_MODE_ATTRIBUTE_MODE_SUPPORT 0xBB //refer to VBE spec p.32, no TTY support |
| 5004 | #define VESA_MODE_WIN_ATTRIBUTE 7 | 5004 | #define VESA_MODE_WIN_ATTRIBUTE 7 |
| 5005 | #define VESA_WIN_SIZE 64 | 5005 | #define VESA_WIN_SIZE 64 |
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c index afc18d87fdca..ddc3adea1dda 100644 --- a/drivers/gpu/drm/radeon/r600.c +++ b/drivers/gpu/drm/radeon/r600.c | |||
| @@ -2729,7 +2729,7 @@ int r600_ib_test(struct radeon_device *rdev) | |||
| 2729 | if (i < rdev->usec_timeout) { | 2729 | if (i < rdev->usec_timeout) { |
| 2730 | DRM_INFO("ib test succeeded in %u usecs\n", i); | 2730 | DRM_INFO("ib test succeeded in %u usecs\n", i); |
| 2731 | } else { | 2731 | } else { |
| 2732 | DRM_ERROR("radeon: ib test failed (sracth(0x%04X)=0x%08X)\n", | 2732 | DRM_ERROR("radeon: ib test failed (scratch(0x%04X)=0x%08X)\n", |
| 2733 | scratch, tmp); | 2733 | scratch, tmp); |
| 2734 | r = -EINVAL; | 2734 | r = -EINVAL; |
| 2735 | } | 2735 | } |
diff --git a/drivers/gpu/drm/radeon/radeon_kms.c b/drivers/gpu/drm/radeon/radeon_kms.c index 5eee3c41d124..8fbbe1c6ebbd 100644 --- a/drivers/gpu/drm/radeon/radeon_kms.c +++ b/drivers/gpu/drm/radeon/radeon_kms.c | |||
| @@ -203,6 +203,10 @@ int radeon_info_ioctl(struct drm_device *dev, void *data, struct drm_file *filp) | |||
| 203 | */ | 203 | */ |
| 204 | int radeon_driver_firstopen_kms(struct drm_device *dev) | 204 | int radeon_driver_firstopen_kms(struct drm_device *dev) |
| 205 | { | 205 | { |
| 206 | struct radeon_device *rdev = dev->dev_private; | ||
| 207 | |||
| 208 | if (rdev->powered_down) | ||
| 209 | return -EINVAL; | ||
| 206 | return 0; | 210 | return 0; |
| 207 | } | 211 | } |
| 208 | 212 | ||
diff --git a/drivers/gpu/drm/ttm/ttm_bo_util.c b/drivers/gpu/drm/ttm/ttm_bo_util.c index 7cffb3e04232..3451a82adba7 100644 --- a/drivers/gpu/drm/ttm/ttm_bo_util.c +++ b/drivers/gpu/drm/ttm/ttm_bo_util.c | |||
| @@ -351,6 +351,7 @@ static int ttm_buffer_object_transfer(struct ttm_buffer_object *bo, | |||
| 351 | INIT_LIST_HEAD(&fbo->lru); | 351 | INIT_LIST_HEAD(&fbo->lru); |
| 352 | INIT_LIST_HEAD(&fbo->swap); | 352 | INIT_LIST_HEAD(&fbo->swap); |
| 353 | fbo->vm_node = NULL; | 353 | fbo->vm_node = NULL; |
| 354 | atomic_set(&fbo->cpu_writers, 0); | ||
| 354 | 355 | ||
| 355 | fbo->sync_obj = driver->sync_obj_ref(bo->sync_obj); | 356 | fbo->sync_obj = driver->sync_obj_ref(bo->sync_obj); |
| 356 | kref_init(&fbo->list_kref); | 357 | kref_init(&fbo->list_kref); |
diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc.c b/drivers/gpu/drm/ttm/ttm_page_alloc.c index ca904799f018..b1e02fffd3cc 100644 --- a/drivers/gpu/drm/ttm/ttm_page_alloc.c +++ b/drivers/gpu/drm/ttm/ttm_page_alloc.c | |||
| @@ -69,7 +69,7 @@ struct ttm_page_pool { | |||
| 69 | spinlock_t lock; | 69 | spinlock_t lock; |
| 70 | bool fill_lock; | 70 | bool fill_lock; |
| 71 | struct list_head list; | 71 | struct list_head list; |
| 72 | int gfp_flags; | 72 | gfp_t gfp_flags; |
| 73 | unsigned npages; | 73 | unsigned npages; |
| 74 | char *name; | 74 | char *name; |
| 75 | unsigned long nfrees; | 75 | unsigned long nfrees; |
| @@ -475,7 +475,7 @@ static void ttm_handle_caching_state_failure(struct list_head *pages, | |||
| 475 | * This function is reentrant if caller updates count depending on number of | 475 | * This function is reentrant if caller updates count depending on number of |
| 476 | * pages returned in pages array. | 476 | * pages returned in pages array. |
| 477 | */ | 477 | */ |
| 478 | static int ttm_alloc_new_pages(struct list_head *pages, int gfp_flags, | 478 | static int ttm_alloc_new_pages(struct list_head *pages, gfp_t gfp_flags, |
| 479 | int ttm_flags, enum ttm_caching_state cstate, unsigned count) | 479 | int ttm_flags, enum ttm_caching_state cstate, unsigned count) |
| 480 | { | 480 | { |
| 481 | struct page **caching_array; | 481 | struct page **caching_array; |
| @@ -666,7 +666,7 @@ int ttm_get_pages(struct list_head *pages, int flags, | |||
| 666 | { | 666 | { |
| 667 | struct ttm_page_pool *pool = ttm_get_pool(flags, cstate); | 667 | struct ttm_page_pool *pool = ttm_get_pool(flags, cstate); |
| 668 | struct page *p = NULL; | 668 | struct page *p = NULL; |
| 669 | int gfp_flags = GFP_USER; | 669 | gfp_t gfp_flags = GFP_USER; |
| 670 | int r; | 670 | int r; |
| 671 | 671 | ||
| 672 | /* set zero flag for page allocation if required */ | 672 | /* set zero flag for page allocation if required */ |
| @@ -818,7 +818,7 @@ int ttm_page_alloc_init(struct ttm_mem_global *glob, unsigned max_pages) | |||
| 818 | return 0; | 818 | return 0; |
| 819 | } | 819 | } |
| 820 | 820 | ||
| 821 | void ttm_page_alloc_fini() | 821 | void ttm_page_alloc_fini(void) |
| 822 | { | 822 | { |
| 823 | int i; | 823 | int i; |
| 824 | 824 | ||
diff --git a/drivers/gpu/vga/vgaarb.c b/drivers/gpu/vga/vgaarb.c index b87569e96b16..f366f968155a 100644 --- a/drivers/gpu/vga/vgaarb.c +++ b/drivers/gpu/vga/vgaarb.c | |||
| @@ -598,7 +598,7 @@ static inline void vga_update_device_decodes(struct vga_device *vgadev, | |||
| 598 | pr_debug("vgaarb: decoding count now is: %d\n", vga_decode_count); | 598 | pr_debug("vgaarb: decoding count now is: %d\n", vga_decode_count); |
| 599 | } | 599 | } |
| 600 | 600 | ||
| 601 | void __vga_set_legacy_decoding(struct pci_dev *pdev, unsigned int decodes, bool userspace) | 601 | static void __vga_set_legacy_decoding(struct pci_dev *pdev, unsigned int decodes, bool userspace) |
| 602 | { | 602 | { |
| 603 | struct vga_device *vgadev; | 603 | struct vga_device *vgadev; |
| 604 | unsigned long flags; | 604 | unsigned long flags; |
diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig index 4d4d09bdec0a..97499d00615a 100644 --- a/drivers/hwmon/Kconfig +++ b/drivers/hwmon/Kconfig | |||
| @@ -409,7 +409,7 @@ config SENSORS_CORETEMP | |||
| 409 | 409 | ||
| 410 | config SENSORS_PKGTEMP | 410 | config SENSORS_PKGTEMP |
| 411 | tristate "Intel processor package temperature sensor" | 411 | tristate "Intel processor package temperature sensor" |
| 412 | depends on X86 && PCI && EXPERIMENTAL | 412 | depends on X86 && EXPERIMENTAL |
| 413 | help | 413 | help |
| 414 | If you say yes here you get support for the package level temperature | 414 | If you say yes here you get support for the package level temperature |
| 415 | sensor inside your CPU. Check documentation/driver for details. | 415 | sensor inside your CPU. Check documentation/driver for details. |
diff --git a/drivers/hwmon/coretemp.c b/drivers/hwmon/coretemp.c index de8111114f46..baa842a80b4b 100644 --- a/drivers/hwmon/coretemp.c +++ b/drivers/hwmon/coretemp.c | |||
| @@ -423,9 +423,18 @@ static int __cpuinit coretemp_device_add(unsigned int cpu) | |||
| 423 | int err; | 423 | int err; |
| 424 | struct platform_device *pdev; | 424 | struct platform_device *pdev; |
| 425 | struct pdev_entry *pdev_entry; | 425 | struct pdev_entry *pdev_entry; |
| 426 | #ifdef CONFIG_SMP | ||
| 427 | struct cpuinfo_x86 *c = &cpu_data(cpu); | 426 | struct cpuinfo_x86 *c = &cpu_data(cpu); |
| 428 | #endif | 427 | |
| 428 | /* | ||
| 429 | * CPUID.06H.EAX[0] indicates whether the CPU has thermal | ||
| 430 | * sensors. We check this bit only, all the early CPUs | ||
| 431 | * without thermal sensors will be filtered out. | ||
| 432 | */ | ||
| 433 | if (!cpu_has(c, X86_FEATURE_DTS)) { | ||
| 434 | printk(KERN_INFO DRVNAME ": CPU (model=0x%x)" | ||
| 435 | " has no thermal sensor.\n", c->x86_model); | ||
| 436 | return 0; | ||
| 437 | } | ||
| 429 | 438 | ||
| 430 | mutex_lock(&pdev_list_mutex); | 439 | mutex_lock(&pdev_list_mutex); |
| 431 | 440 | ||
| @@ -482,14 +491,22 @@ exit: | |||
| 482 | 491 | ||
| 483 | static void coretemp_device_remove(unsigned int cpu) | 492 | static void coretemp_device_remove(unsigned int cpu) |
| 484 | { | 493 | { |
| 485 | struct pdev_entry *p, *n; | 494 | struct pdev_entry *p; |
| 495 | unsigned int i; | ||
| 496 | |||
| 486 | mutex_lock(&pdev_list_mutex); | 497 | mutex_lock(&pdev_list_mutex); |
| 487 | list_for_each_entry_safe(p, n, &pdev_list, list) { | 498 | list_for_each_entry(p, &pdev_list, list) { |
| 488 | if (p->cpu == cpu) { | 499 | if (p->cpu != cpu) |
| 489 | platform_device_unregister(p->pdev); | 500 | continue; |
| 490 | list_del(&p->list); | 501 | |
| 491 | kfree(p); | 502 | platform_device_unregister(p->pdev); |
| 492 | } | 503 | list_del(&p->list); |
| 504 | mutex_unlock(&pdev_list_mutex); | ||
| 505 | kfree(p); | ||
| 506 | for_each_cpu(i, cpu_sibling_mask(cpu)) | ||
| 507 | if (i != cpu && !coretemp_device_add(i)) | ||
| 508 | break; | ||
| 509 | return; | ||
| 493 | } | 510 | } |
| 494 | mutex_unlock(&pdev_list_mutex); | 511 | mutex_unlock(&pdev_list_mutex); |
| 495 | } | 512 | } |
| @@ -527,30 +544,21 @@ static int __init coretemp_init(void) | |||
| 527 | if (err) | 544 | if (err) |
| 528 | goto exit; | 545 | goto exit; |
| 529 | 546 | ||
| 530 | for_each_online_cpu(i) { | 547 | for_each_online_cpu(i) |
| 531 | struct cpuinfo_x86 *c = &cpu_data(i); | 548 | coretemp_device_add(i); |
| 532 | /* | 549 | |
| 533 | * CPUID.06H.EAX[0] indicates whether the CPU has thermal | 550 | #ifndef CONFIG_HOTPLUG_CPU |
| 534 | * sensors. We check this bit only, all the early CPUs | ||
| 535 | * without thermal sensors will be filtered out. | ||
| 536 | */ | ||
| 537 | if (c->cpuid_level >= 6 && (cpuid_eax(0x06) & 0x01)) | ||
| 538 | coretemp_device_add(i); | ||
| 539 | else { | ||
| 540 | printk(KERN_INFO DRVNAME ": CPU (model=0x%x)" | ||
| 541 | " has no thermal sensor.\n", c->x86_model); | ||
| 542 | } | ||
| 543 | } | ||
| 544 | if (list_empty(&pdev_list)) { | 551 | if (list_empty(&pdev_list)) { |
| 545 | err = -ENODEV; | 552 | err = -ENODEV; |
| 546 | goto exit_driver_unreg; | 553 | goto exit_driver_unreg; |
| 547 | } | 554 | } |
| 555 | #endif | ||
| 548 | 556 | ||
| 549 | register_hotcpu_notifier(&coretemp_cpu_notifier); | 557 | register_hotcpu_notifier(&coretemp_cpu_notifier); |
| 550 | return 0; | 558 | return 0; |
| 551 | 559 | ||
| 552 | exit_driver_unreg: | ||
| 553 | #ifndef CONFIG_HOTPLUG_CPU | 560 | #ifndef CONFIG_HOTPLUG_CPU |
| 561 | exit_driver_unreg: | ||
| 554 | platform_driver_unregister(&coretemp_driver); | 562 | platform_driver_unregister(&coretemp_driver); |
| 555 | #endif | 563 | #endif |
| 556 | exit: | 564 | exit: |
diff --git a/drivers/hwmon/lis3lv02d.c b/drivers/hwmon/lis3lv02d.c index 6138f036b159..fc591ae53107 100644 --- a/drivers/hwmon/lis3lv02d.c +++ b/drivers/hwmon/lis3lv02d.c | |||
| @@ -277,7 +277,7 @@ static irqreturn_t lis302dl_interrupt(int irq, void *dummy) | |||
| 277 | wake_up_interruptible(&lis3_dev.misc_wait); | 277 | wake_up_interruptible(&lis3_dev.misc_wait); |
| 278 | kill_fasync(&lis3_dev.async_queue, SIGIO, POLL_IN); | 278 | kill_fasync(&lis3_dev.async_queue, SIGIO, POLL_IN); |
| 279 | out: | 279 | out: |
| 280 | if (lis3_dev.whoami == WAI_8B && lis3_dev.idev && | 280 | if (lis3_dev.pdata && lis3_dev.whoami == WAI_8B && lis3_dev.idev && |
| 281 | lis3_dev.idev->input->users) | 281 | lis3_dev.idev->input->users) |
| 282 | return IRQ_WAKE_THREAD; | 282 | return IRQ_WAKE_THREAD; |
| 283 | return IRQ_HANDLED; | 283 | return IRQ_HANDLED; |
| @@ -718,7 +718,7 @@ int lis3lv02d_init_device(struct lis3lv02d *dev) | |||
| 718 | * io-apic is not configurable (and generates a warning) but I keep it | 718 | * io-apic is not configurable (and generates a warning) but I keep it |
| 719 | * in case of support for other hardware. | 719 | * in case of support for other hardware. |
| 720 | */ | 720 | */ |
| 721 | if (dev->whoami == WAI_8B) | 721 | if (dev->pdata && dev->whoami == WAI_8B) |
| 722 | thread_fn = lis302dl_interrupt_thread1_8b; | 722 | thread_fn = lis302dl_interrupt_thread1_8b; |
| 723 | else | 723 | else |
| 724 | thread_fn = NULL; | 724 | thread_fn = NULL; |
diff --git a/drivers/hwmon/pkgtemp.c b/drivers/hwmon/pkgtemp.c index 74157fcda6ed..f11903936c8b 100644 --- a/drivers/hwmon/pkgtemp.c +++ b/drivers/hwmon/pkgtemp.c | |||
| @@ -33,7 +33,6 @@ | |||
| 33 | #include <linux/list.h> | 33 | #include <linux/list.h> |
| 34 | #include <linux/platform_device.h> | 34 | #include <linux/platform_device.h> |
| 35 | #include <linux/cpu.h> | 35 | #include <linux/cpu.h> |
| 36 | #include <linux/pci.h> | ||
| 37 | #include <asm/msr.h> | 36 | #include <asm/msr.h> |
| 38 | #include <asm/processor.h> | 37 | #include <asm/processor.h> |
| 39 | 38 | ||
| @@ -224,7 +223,7 @@ static int __devinit pkgtemp_probe(struct platform_device *pdev) | |||
| 224 | 223 | ||
| 225 | err = sysfs_create_group(&pdev->dev.kobj, &pkgtemp_group); | 224 | err = sysfs_create_group(&pdev->dev.kobj, &pkgtemp_group); |
| 226 | if (err) | 225 | if (err) |
| 227 | goto exit_free; | 226 | goto exit_dev; |
| 228 | 227 | ||
| 229 | data->hwmon_dev = hwmon_device_register(&pdev->dev); | 228 | data->hwmon_dev = hwmon_device_register(&pdev->dev); |
| 230 | if (IS_ERR(data->hwmon_dev)) { | 229 | if (IS_ERR(data->hwmon_dev)) { |
| @@ -238,6 +237,8 @@ static int __devinit pkgtemp_probe(struct platform_device *pdev) | |||
| 238 | 237 | ||
| 239 | exit_class: | 238 | exit_class: |
| 240 | sysfs_remove_group(&pdev->dev.kobj, &pkgtemp_group); | 239 | sysfs_remove_group(&pdev->dev.kobj, &pkgtemp_group); |
| 240 | exit_dev: | ||
| 241 | device_remove_file(&pdev->dev, &sensor_dev_attr_temp1_max.dev_attr); | ||
| 241 | exit_free: | 242 | exit_free: |
| 242 | kfree(data); | 243 | kfree(data); |
| 243 | exit: | 244 | exit: |
| @@ -250,6 +251,7 @@ static int __devexit pkgtemp_remove(struct platform_device *pdev) | |||
| 250 | 251 | ||
| 251 | hwmon_device_unregister(data->hwmon_dev); | 252 | hwmon_device_unregister(data->hwmon_dev); |
| 252 | sysfs_remove_group(&pdev->dev.kobj, &pkgtemp_group); | 253 | sysfs_remove_group(&pdev->dev.kobj, &pkgtemp_group); |
| 254 | device_remove_file(&pdev->dev, &sensor_dev_attr_temp1_max.dev_attr); | ||
| 253 | platform_set_drvdata(pdev, NULL); | 255 | platform_set_drvdata(pdev, NULL); |
| 254 | kfree(data); | 256 | kfree(data); |
| 255 | return 0; | 257 | return 0; |
| @@ -281,9 +283,10 @@ static int __cpuinit pkgtemp_device_add(unsigned int cpu) | |||
| 281 | int err; | 283 | int err; |
| 282 | struct platform_device *pdev; | 284 | struct platform_device *pdev; |
| 283 | struct pdev_entry *pdev_entry; | 285 | struct pdev_entry *pdev_entry; |
| 284 | #ifdef CONFIG_SMP | ||
| 285 | struct cpuinfo_x86 *c = &cpu_data(cpu); | 286 | struct cpuinfo_x86 *c = &cpu_data(cpu); |
| 286 | #endif | 287 | |
| 288 | if (!cpu_has(c, X86_FEATURE_PTS)) | ||
| 289 | return 0; | ||
| 287 | 290 | ||
| 288 | mutex_lock(&pdev_list_mutex); | 291 | mutex_lock(&pdev_list_mutex); |
| 289 | 292 | ||
| @@ -339,17 +342,18 @@ exit: | |||
| 339 | #ifdef CONFIG_HOTPLUG_CPU | 342 | #ifdef CONFIG_HOTPLUG_CPU |
| 340 | static void pkgtemp_device_remove(unsigned int cpu) | 343 | static void pkgtemp_device_remove(unsigned int cpu) |
| 341 | { | 344 | { |
| 342 | struct pdev_entry *p, *n; | 345 | struct pdev_entry *p; |
| 343 | unsigned int i; | 346 | unsigned int i; |
| 344 | int err; | 347 | int err; |
| 345 | 348 | ||
| 346 | mutex_lock(&pdev_list_mutex); | 349 | mutex_lock(&pdev_list_mutex); |
| 347 | list_for_each_entry_safe(p, n, &pdev_list, list) { | 350 | list_for_each_entry(p, &pdev_list, list) { |
| 348 | if (p->cpu != cpu) | 351 | if (p->cpu != cpu) |
| 349 | continue; | 352 | continue; |
| 350 | 353 | ||
| 351 | platform_device_unregister(p->pdev); | 354 | platform_device_unregister(p->pdev); |
| 352 | list_del(&p->list); | 355 | list_del(&p->list); |
| 356 | mutex_unlock(&pdev_list_mutex); | ||
| 353 | kfree(p); | 357 | kfree(p); |
| 354 | for_each_cpu(i, cpu_core_mask(cpu)) { | 358 | for_each_cpu(i, cpu_core_mask(cpu)) { |
| 355 | if (i != cpu) { | 359 | if (i != cpu) { |
| @@ -358,7 +362,7 @@ static void pkgtemp_device_remove(unsigned int cpu) | |||
| 358 | break; | 362 | break; |
| 359 | } | 363 | } |
| 360 | } | 364 | } |
| 361 | break; | 365 | return; |
| 362 | } | 366 | } |
| 363 | mutex_unlock(&pdev_list_mutex); | 367 | mutex_unlock(&pdev_list_mutex); |
| 364 | } | 368 | } |
| @@ -399,11 +403,6 @@ static int __init pkgtemp_init(void) | |||
| 399 | goto exit; | 403 | goto exit; |
| 400 | 404 | ||
| 401 | for_each_online_cpu(i) { | 405 | for_each_online_cpu(i) { |
| 402 | struct cpuinfo_x86 *c = &cpu_data(i); | ||
| 403 | |||
| 404 | if (!cpu_has(c, X86_FEATURE_PTS)) | ||
| 405 | continue; | ||
| 406 | |||
| 407 | err = pkgtemp_device_add(i); | 406 | err = pkgtemp_device_add(i); |
| 408 | if (err) | 407 | if (err) |
| 409 | goto exit_devices_unreg; | 408 | goto exit_devices_unreg; |
diff --git a/drivers/i2c/busses/i2c-omap.c b/drivers/i2c/busses/i2c-omap.c index 7674efb55378..b33c78586bfc 100644 --- a/drivers/i2c/busses/i2c-omap.c +++ b/drivers/i2c/busses/i2c-omap.c | |||
| @@ -680,6 +680,8 @@ omap_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num) | |||
| 680 | 680 | ||
| 681 | if (r == 0) | 681 | if (r == 0) |
| 682 | r = num; | 682 | r = num; |
| 683 | |||
| 684 | omap_i2c_wait_for_bb(dev); | ||
| 683 | out: | 685 | out: |
| 684 | omap_i2c_idle(dev); | 686 | omap_i2c_idle(dev); |
| 685 | return r; | 687 | return r; |
diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig index 0b591b658243..b74331260744 100644 --- a/drivers/misc/Kconfig +++ b/drivers/misc/Kconfig | |||
| @@ -368,7 +368,7 @@ config VMWARE_BALLOON | |||
| 368 | If unsure, say N. | 368 | If unsure, say N. |
| 369 | 369 | ||
| 370 | To compile this driver as a module, choose M here: the | 370 | To compile this driver as a module, choose M here: the |
| 371 | module will be called vmware_balloon. | 371 | module will be called vmw_balloon. |
| 372 | 372 | ||
| 373 | config ARM_CHARLCD | 373 | config ARM_CHARLCD |
| 374 | bool "ARM Ltd. Character LCD Driver" | 374 | bool "ARM Ltd. Character LCD Driver" |
diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile index 255a80dc9d73..42eab95cde2a 100644 --- a/drivers/misc/Makefile +++ b/drivers/misc/Makefile | |||
| @@ -33,5 +33,5 @@ obj-$(CONFIG_IWMC3200TOP) += iwmc3200top/ | |||
| 33 | obj-$(CONFIG_HMC6352) += hmc6352.o | 33 | obj-$(CONFIG_HMC6352) += hmc6352.o |
| 34 | obj-y += eeprom/ | 34 | obj-y += eeprom/ |
| 35 | obj-y += cb710/ | 35 | obj-y += cb710/ |
| 36 | obj-$(CONFIG_VMWARE_BALLOON) += vmware_balloon.o | 36 | obj-$(CONFIG_VMWARE_BALLOON) += vmw_balloon.o |
| 37 | obj-$(CONFIG_ARM_CHARLCD) += arm-charlcd.o | 37 | obj-$(CONFIG_ARM_CHARLCD) += arm-charlcd.o |
diff --git a/drivers/misc/vmware_balloon.c b/drivers/misc/vmw_balloon.c index 2a1e804a71aa..2a1e804a71aa 100644 --- a/drivers/misc/vmware_balloon.c +++ b/drivers/misc/vmw_balloon.c | |||
diff --git a/drivers/mmc/host/sdhci-s3c.c b/drivers/mmc/host/sdhci-s3c.c index 71ad4163b95e..aacb862ecc8a 100644 --- a/drivers/mmc/host/sdhci-s3c.c +++ b/drivers/mmc/host/sdhci-s3c.c | |||
| @@ -241,8 +241,10 @@ static struct sdhci_ops sdhci_s3c_ops = { | |||
| 241 | static void sdhci_s3c_notify_change(struct platform_device *dev, int state) | 241 | static void sdhci_s3c_notify_change(struct platform_device *dev, int state) |
| 242 | { | 242 | { |
| 243 | struct sdhci_host *host = platform_get_drvdata(dev); | 243 | struct sdhci_host *host = platform_get_drvdata(dev); |
| 244 | unsigned long flags; | ||
| 245 | |||
| 244 | if (host) { | 246 | if (host) { |
| 245 | spin_lock(&host->lock); | 247 | spin_lock_irqsave(&host->lock, flags); |
| 246 | if (state) { | 248 | if (state) { |
| 247 | dev_dbg(&dev->dev, "card inserted.\n"); | 249 | dev_dbg(&dev->dev, "card inserted.\n"); |
| 248 | host->flags &= ~SDHCI_DEVICE_DEAD; | 250 | host->flags &= ~SDHCI_DEVICE_DEAD; |
| @@ -253,7 +255,7 @@ static void sdhci_s3c_notify_change(struct platform_device *dev, int state) | |||
| 253 | host->quirks &= ~SDHCI_QUIRK_BROKEN_CARD_DETECTION; | 255 | host->quirks &= ~SDHCI_QUIRK_BROKEN_CARD_DETECTION; |
| 254 | } | 256 | } |
| 255 | tasklet_schedule(&host->card_tasklet); | 257 | tasklet_schedule(&host->card_tasklet); |
| 256 | spin_unlock(&host->lock); | 258 | spin_unlock_irqrestore(&host->lock, flags); |
| 257 | } | 259 | } |
| 258 | } | 260 | } |
| 259 | 261 | ||
| @@ -481,8 +483,10 @@ static int __devexit sdhci_s3c_remove(struct platform_device *pdev) | |||
| 481 | sdhci_remove_host(host, 1); | 483 | sdhci_remove_host(host, 1); |
| 482 | 484 | ||
| 483 | for (ptr = 0; ptr < 3; ptr++) { | 485 | for (ptr = 0; ptr < 3; ptr++) { |
| 484 | clk_disable(sc->clk_bus[ptr]); | 486 | if (sc->clk_bus[ptr]) { |
| 485 | clk_put(sc->clk_bus[ptr]); | 487 | clk_disable(sc->clk_bus[ptr]); |
| 488 | clk_put(sc->clk_bus[ptr]); | ||
| 489 | } | ||
| 486 | } | 490 | } |
| 487 | clk_disable(sc->clk_io); | 491 | clk_disable(sc->clk_io); |
| 488 | clk_put(sc->clk_io); | 492 | clk_put(sc->clk_io); |
diff --git a/drivers/pci/intel-iommu.c b/drivers/pci/intel-iommu.c index c3ceebb5be84..4789f8e8bf7a 100644 --- a/drivers/pci/intel-iommu.c +++ b/drivers/pci/intel-iommu.c | |||
| @@ -71,6 +71,49 @@ | |||
| 71 | #define DMA_32BIT_PFN IOVA_PFN(DMA_BIT_MASK(32)) | 71 | #define DMA_32BIT_PFN IOVA_PFN(DMA_BIT_MASK(32)) |
| 72 | #define DMA_64BIT_PFN IOVA_PFN(DMA_BIT_MASK(64)) | 72 | #define DMA_64BIT_PFN IOVA_PFN(DMA_BIT_MASK(64)) |
| 73 | 73 | ||
| 74 | /* page table handling */ | ||
| 75 | #define LEVEL_STRIDE (9) | ||
| 76 | #define LEVEL_MASK (((u64)1 << LEVEL_STRIDE) - 1) | ||
| 77 | |||
| 78 | static inline int agaw_to_level(int agaw) | ||
| 79 | { | ||
| 80 | return agaw + 2; | ||
| 81 | } | ||
| 82 | |||
| 83 | static inline int agaw_to_width(int agaw) | ||
| 84 | { | ||
| 85 | return 30 + agaw * LEVEL_STRIDE; | ||
| 86 | } | ||
| 87 | |||
| 88 | static inline int width_to_agaw(int width) | ||
| 89 | { | ||
| 90 | return (width - 30) / LEVEL_STRIDE; | ||
| 91 | } | ||
| 92 | |||
| 93 | static inline unsigned int level_to_offset_bits(int level) | ||
| 94 | { | ||
| 95 | return (level - 1) * LEVEL_STRIDE; | ||
| 96 | } | ||
| 97 | |||
| 98 | static inline int pfn_level_offset(unsigned long pfn, int level) | ||
| 99 | { | ||
| 100 | return (pfn >> level_to_offset_bits(level)) & LEVEL_MASK; | ||
| 101 | } | ||
| 102 | |||
| 103 | static inline unsigned long level_mask(int level) | ||
| 104 | { | ||
| 105 | return -1UL << level_to_offset_bits(level); | ||
| 106 | } | ||
| 107 | |||
| 108 | static inline unsigned long level_size(int level) | ||
| 109 | { | ||
| 110 | return 1UL << level_to_offset_bits(level); | ||
| 111 | } | ||
| 112 | |||
| 113 | static inline unsigned long align_to_level(unsigned long pfn, int level) | ||
| 114 | { | ||
| 115 | return (pfn + level_size(level) - 1) & level_mask(level); | ||
| 116 | } | ||
| 74 | 117 | ||
| 75 | /* VT-d pages must always be _smaller_ than MM pages. Otherwise things | 118 | /* VT-d pages must always be _smaller_ than MM pages. Otherwise things |
| 76 | are never going to work. */ | 119 | are never going to work. */ |
| @@ -434,8 +477,6 @@ void free_iova_mem(struct iova *iova) | |||
| 434 | } | 477 | } |
| 435 | 478 | ||
| 436 | 479 | ||
| 437 | static inline int width_to_agaw(int width); | ||
| 438 | |||
| 439 | static int __iommu_calculate_agaw(struct intel_iommu *iommu, int max_gaw) | 480 | static int __iommu_calculate_agaw(struct intel_iommu *iommu, int max_gaw) |
| 440 | { | 481 | { |
| 441 | unsigned long sagaw; | 482 | unsigned long sagaw; |
| @@ -646,51 +687,6 @@ out: | |||
| 646 | spin_unlock_irqrestore(&iommu->lock, flags); | 687 | spin_unlock_irqrestore(&iommu->lock, flags); |
| 647 | } | 688 | } |
| 648 | 689 | ||
| 649 | /* page table handling */ | ||
| 650 | #define LEVEL_STRIDE (9) | ||
| 651 | #define LEVEL_MASK (((u64)1 << LEVEL_STRIDE) - 1) | ||
| 652 | |||
| 653 | static inline int agaw_to_level(int agaw) | ||
| 654 | { | ||
| 655 | return agaw + 2; | ||
| 656 | } | ||
| 657 | |||
| 658 | static inline int agaw_to_width(int agaw) | ||
| 659 | { | ||
| 660 | return 30 + agaw * LEVEL_STRIDE; | ||
| 661 | |||
| 662 | } | ||
| 663 | |||
| 664 | static inline int width_to_agaw(int width) | ||
| 665 | { | ||
| 666 | return (width - 30) / LEVEL_STRIDE; | ||
| 667 | } | ||
| 668 | |||
| 669 | static inline unsigned int level_to_offset_bits(int level) | ||
| 670 | { | ||
| 671 | return (level - 1) * LEVEL_STRIDE; | ||
| 672 | } | ||
| 673 | |||
| 674 | static inline int pfn_level_offset(unsigned long pfn, int level) | ||
| 675 | { | ||
| 676 | return (pfn >> level_to_offset_bits(level)) & LEVEL_MASK; | ||
| 677 | } | ||
| 678 | |||
| 679 | static inline unsigned long level_mask(int level) | ||
| 680 | { | ||
| 681 | return -1UL << level_to_offset_bits(level); | ||
| 682 | } | ||
| 683 | |||
| 684 | static inline unsigned long level_size(int level) | ||
| 685 | { | ||
| 686 | return 1UL << level_to_offset_bits(level); | ||
| 687 | } | ||
| 688 | |||
| 689 | static inline unsigned long align_to_level(unsigned long pfn, int level) | ||
| 690 | { | ||
| 691 | return (pfn + level_size(level) - 1) & level_mask(level); | ||
| 692 | } | ||
| 693 | |||
| 694 | static struct dma_pte *pfn_to_dma_pte(struct dmar_domain *domain, | 690 | static struct dma_pte *pfn_to_dma_pte(struct dmar_domain *domain, |
| 695 | unsigned long pfn) | 691 | unsigned long pfn) |
| 696 | { | 692 | { |
| @@ -3761,6 +3757,33 @@ static void __devinit quirk_iommu_rwbf(struct pci_dev *dev) | |||
| 3761 | 3757 | ||
| 3762 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2a40, quirk_iommu_rwbf); | 3758 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2a40, quirk_iommu_rwbf); |
| 3763 | 3759 | ||
| 3760 | #define GGC 0x52 | ||
| 3761 | #define GGC_MEMORY_SIZE_MASK (0xf << 8) | ||
| 3762 | #define GGC_MEMORY_SIZE_NONE (0x0 << 8) | ||
| 3763 | #define GGC_MEMORY_SIZE_1M (0x1 << 8) | ||
| 3764 | #define GGC_MEMORY_SIZE_2M (0x3 << 8) | ||
| 3765 | #define GGC_MEMORY_VT_ENABLED (0x8 << 8) | ||
| 3766 | #define GGC_MEMORY_SIZE_2M_VT (0x9 << 8) | ||
| 3767 | #define GGC_MEMORY_SIZE_3M_VT (0xa << 8) | ||
| 3768 | #define GGC_MEMORY_SIZE_4M_VT (0xb << 8) | ||
| 3769 | |||
| 3770 | static void __devinit quirk_calpella_no_shadow_gtt(struct pci_dev *dev) | ||
| 3771 | { | ||
| 3772 | unsigned short ggc; | ||
| 3773 | |||
| 3774 | if (pci_read_config_word(dev, GGC, &ggc)) | ||
| 3775 | return; | ||
| 3776 | |||
| 3777 | if (!(ggc & GGC_MEMORY_VT_ENABLED)) { | ||
| 3778 | printk(KERN_INFO "DMAR: BIOS has allocated no shadow GTT; disabling IOMMU for graphics\n"); | ||
| 3779 | dmar_map_gfx = 0; | ||
| 3780 | } | ||
| 3781 | } | ||
| 3782 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x0040, quirk_calpella_no_shadow_gtt); | ||
| 3783 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x0044, quirk_calpella_no_shadow_gtt); | ||
| 3784 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x0062, quirk_calpella_no_shadow_gtt); | ||
| 3785 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x006a, quirk_calpella_no_shadow_gtt); | ||
| 3786 | |||
| 3764 | /* On Tylersburg chipsets, some BIOSes have been known to enable the | 3787 | /* On Tylersburg chipsets, some BIOSes have been known to enable the |
| 3765 | ISOCH DMAR unit for the Azalia sound device, but not give it any | 3788 | ISOCH DMAR unit for the Azalia sound device, but not give it any |
| 3766 | TLB entries, which causes it to deadlock. Check for that. We do | 3789 | TLB entries, which causes it to deadlock. Check for that. We do |
diff --git a/drivers/pcmcia/pcmcia_resource.c b/drivers/pcmcia/pcmcia_resource.c index a5c176598d95..9ba4dade69a4 100644 --- a/drivers/pcmcia/pcmcia_resource.c +++ b/drivers/pcmcia/pcmcia_resource.c | |||
| @@ -595,7 +595,13 @@ int pcmcia_request_io(struct pcmcia_device *p_dev) | |||
| 595 | if (c->io[1].end) { | 595 | if (c->io[1].end) { |
| 596 | ret = alloc_io_space(s, &c->io[1], p_dev->io_lines); | 596 | ret = alloc_io_space(s, &c->io[1], p_dev->io_lines); |
| 597 | if (ret) { | 597 | if (ret) { |
| 598 | struct resource tmp = c->io[0]; | ||
| 599 | /* release the previously allocated resource */ | ||
| 598 | release_io_space(s, &c->io[0]); | 600 | release_io_space(s, &c->io[0]); |
| 601 | /* but preserve the settings, for they worked... */ | ||
| 602 | c->io[0].end = resource_size(&tmp); | ||
| 603 | c->io[0].start = tmp.start; | ||
| 604 | c->io[0].flags = tmp.flags; | ||
| 599 | goto out; | 605 | goto out; |
| 600 | } | 606 | } |
| 601 | } else | 607 | } else |
diff --git a/drivers/pcmcia/pd6729.c b/drivers/pcmcia/pd6729.c index b8a869af0f44..deef6656ab7b 100644 --- a/drivers/pcmcia/pd6729.c +++ b/drivers/pcmcia/pd6729.c | |||
| @@ -646,7 +646,7 @@ static int __devinit pd6729_pci_probe(struct pci_dev *dev, | |||
| 646 | if (!pci_resource_start(dev, 0)) { | 646 | if (!pci_resource_start(dev, 0)) { |
| 647 | dev_warn(&dev->dev, "refusing to load the driver as the " | 647 | dev_warn(&dev->dev, "refusing to load the driver as the " |
| 648 | "io_base is NULL.\n"); | 648 | "io_base is NULL.\n"); |
| 649 | goto err_out_free_mem; | 649 | goto err_out_disable; |
| 650 | } | 650 | } |
| 651 | 651 | ||
| 652 | dev_info(&dev->dev, "Cirrus PD6729 PCI to PCMCIA Bridge at 0x%llx " | 652 | dev_info(&dev->dev, "Cirrus PD6729 PCI to PCMCIA Bridge at 0x%llx " |
diff --git a/drivers/platform/x86/thinkpad_acpi.c b/drivers/platform/x86/thinkpad_acpi.c index e35ed128bdef..2d61186ad5a2 100644 --- a/drivers/platform/x86/thinkpad_acpi.c +++ b/drivers/platform/x86/thinkpad_acpi.c | |||
| @@ -3093,7 +3093,8 @@ static const struct tpacpi_quirk tpacpi_hotkey_qtable[] __initconst = { | |||
| 3093 | TPACPI_Q_IBM('1', 'D', TPACPI_HK_Q_INIMASK), /* X22, X23, X24 */ | 3093 | TPACPI_Q_IBM('1', 'D', TPACPI_HK_Q_INIMASK), /* X22, X23, X24 */ |
| 3094 | }; | 3094 | }; |
| 3095 | 3095 | ||
| 3096 | typedef u16 tpacpi_keymap_t[TPACPI_HOTKEY_MAP_LEN]; | 3096 | typedef u16 tpacpi_keymap_entry_t; |
| 3097 | typedef tpacpi_keymap_entry_t tpacpi_keymap_t[TPACPI_HOTKEY_MAP_LEN]; | ||
| 3097 | 3098 | ||
| 3098 | static int __init hotkey_init(struct ibm_init_struct *iibm) | 3099 | static int __init hotkey_init(struct ibm_init_struct *iibm) |
| 3099 | { | 3100 | { |
| @@ -3230,7 +3231,7 @@ static int __init hotkey_init(struct ibm_init_struct *iibm) | |||
| 3230 | }; | 3231 | }; |
| 3231 | 3232 | ||
| 3232 | #define TPACPI_HOTKEY_MAP_SIZE sizeof(tpacpi_keymap_t) | 3233 | #define TPACPI_HOTKEY_MAP_SIZE sizeof(tpacpi_keymap_t) |
| 3233 | #define TPACPI_HOTKEY_MAP_TYPESIZE sizeof(tpacpi_keymap_t[0]) | 3234 | #define TPACPI_HOTKEY_MAP_TYPESIZE sizeof(tpacpi_keymap_entry_t) |
| 3234 | 3235 | ||
| 3235 | int res, i; | 3236 | int res, i; |
| 3236 | int status; | 3237 | int status; |
diff --git a/drivers/rtc/rtc-ab3100.c b/drivers/rtc/rtc-ab3100.c index d26780ea254b..261a07e0fb24 100644 --- a/drivers/rtc/rtc-ab3100.c +++ b/drivers/rtc/rtc-ab3100.c | |||
| @@ -235,6 +235,7 @@ static int __init ab3100_rtc_probe(struct platform_device *pdev) | |||
| 235 | err = PTR_ERR(rtc); | 235 | err = PTR_ERR(rtc); |
| 236 | return err; | 236 | return err; |
| 237 | } | 237 | } |
| 238 | platform_set_drvdata(pdev, rtc); | ||
| 238 | 239 | ||
| 239 | return 0; | 240 | return 0; |
| 240 | } | 241 | } |
| @@ -244,6 +245,7 @@ static int __exit ab3100_rtc_remove(struct platform_device *pdev) | |||
| 244 | struct rtc_device *rtc = platform_get_drvdata(pdev); | 245 | struct rtc_device *rtc = platform_get_drvdata(pdev); |
| 245 | 246 | ||
| 246 | rtc_device_unregister(rtc); | 247 | rtc_device_unregister(rtc); |
| 248 | platform_set_drvdata(pdev, NULL); | ||
| 247 | return 0; | 249 | return 0; |
| 248 | } | 250 | } |
| 249 | 251 | ||
diff --git a/drivers/rtc/rtc-s3c.c b/drivers/rtc/rtc-s3c.c index a0d3ec89d412..f57a87f4ae96 100644 --- a/drivers/rtc/rtc-s3c.c +++ b/drivers/rtc/rtc-s3c.c | |||
| @@ -310,11 +310,6 @@ static int s3c_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm) | |||
| 310 | 310 | ||
| 311 | s3c_rtc_setaie(alrm->enabled); | 311 | s3c_rtc_setaie(alrm->enabled); |
| 312 | 312 | ||
| 313 | if (alrm->enabled) | ||
| 314 | enable_irq_wake(s3c_rtc_alarmno); | ||
| 315 | else | ||
| 316 | disable_irq_wake(s3c_rtc_alarmno); | ||
| 317 | |||
| 318 | return 0; | 313 | return 0; |
| 319 | } | 314 | } |
| 320 | 315 | ||
| @@ -587,6 +582,10 @@ static int s3c_rtc_suspend(struct platform_device *pdev, pm_message_t state) | |||
| 587 | ticnt_en_save &= S3C64XX_RTCCON_TICEN; | 582 | ticnt_en_save &= S3C64XX_RTCCON_TICEN; |
| 588 | } | 583 | } |
| 589 | s3c_rtc_enable(pdev, 0); | 584 | s3c_rtc_enable(pdev, 0); |
| 585 | |||
| 586 | if (device_may_wakeup(&pdev->dev)) | ||
| 587 | enable_irq_wake(s3c_rtc_alarmno); | ||
| 588 | |||
| 590 | return 0; | 589 | return 0; |
| 591 | } | 590 | } |
| 592 | 591 | ||
| @@ -600,6 +599,10 @@ static int s3c_rtc_resume(struct platform_device *pdev) | |||
| 600 | tmp = readb(s3c_rtc_base + S3C2410_RTCCON); | 599 | tmp = readb(s3c_rtc_base + S3C2410_RTCCON); |
| 601 | writeb(tmp | ticnt_en_save, s3c_rtc_base + S3C2410_RTCCON); | 600 | writeb(tmp | ticnt_en_save, s3c_rtc_base + S3C2410_RTCCON); |
| 602 | } | 601 | } |
| 602 | |||
| 603 | if (device_may_wakeup(&pdev->dev)) | ||
| 604 | disable_irq_wake(s3c_rtc_alarmno); | ||
| 605 | |||
| 603 | return 0; | 606 | return 0; |
| 604 | } | 607 | } |
| 605 | #else | 608 | #else |
diff --git a/drivers/staging/ti-st/st.h b/drivers/staging/ti-st/st.h index 9952579425b9..1b3060eb2921 100644 --- a/drivers/staging/ti-st/st.h +++ b/drivers/staging/ti-st/st.h | |||
| @@ -80,5 +80,4 @@ struct st_proto_s { | |||
| 80 | extern long st_register(struct st_proto_s *); | 80 | extern long st_register(struct st_proto_s *); |
| 81 | extern long st_unregister(enum proto_type); | 81 | extern long st_unregister(enum proto_type); |
| 82 | 82 | ||
| 83 | extern struct platform_device *st_get_plat_device(void); | ||
| 84 | #endif /* ST_H */ | 83 | #endif /* ST_H */ |
diff --git a/drivers/staging/ti-st/st_core.c b/drivers/staging/ti-st/st_core.c index 063c9b1db1ab..b85d8bfdf600 100644 --- a/drivers/staging/ti-st/st_core.c +++ b/drivers/staging/ti-st/st_core.c | |||
| @@ -38,7 +38,6 @@ | |||
| 38 | #include "st_ll.h" | 38 | #include "st_ll.h" |
| 39 | #include "st.h" | 39 | #include "st.h" |
| 40 | 40 | ||
| 41 | #define VERBOSE | ||
| 42 | /* strings to be used for rfkill entries and by | 41 | /* strings to be used for rfkill entries and by |
| 43 | * ST Core to be used for sysfs debug entry | 42 | * ST Core to be used for sysfs debug entry |
| 44 | */ | 43 | */ |
| @@ -581,7 +580,7 @@ long st_register(struct st_proto_s *new_proto) | |||
| 581 | long err = 0; | 580 | long err = 0; |
| 582 | unsigned long flags = 0; | 581 | unsigned long flags = 0; |
| 583 | 582 | ||
| 584 | st_kim_ref(&st_gdata); | 583 | st_kim_ref(&st_gdata, 0); |
| 585 | pr_info("%s(%d) ", __func__, new_proto->type); | 584 | pr_info("%s(%d) ", __func__, new_proto->type); |
| 586 | if (st_gdata == NULL || new_proto == NULL || new_proto->recv == NULL | 585 | if (st_gdata == NULL || new_proto == NULL || new_proto->recv == NULL |
| 587 | || new_proto->reg_complete_cb == NULL) { | 586 | || new_proto->reg_complete_cb == NULL) { |
| @@ -713,7 +712,7 @@ long st_unregister(enum proto_type type) | |||
| 713 | 712 | ||
| 714 | pr_debug("%s: %d ", __func__, type); | 713 | pr_debug("%s: %d ", __func__, type); |
| 715 | 714 | ||
| 716 | st_kim_ref(&st_gdata); | 715 | st_kim_ref(&st_gdata, 0); |
| 717 | if (type < ST_BT || type >= ST_MAX) { | 716 | if (type < ST_BT || type >= ST_MAX) { |
| 718 | pr_err(" protocol %d not supported", type); | 717 | pr_err(" protocol %d not supported", type); |
| 719 | return -EPROTONOSUPPORT; | 718 | return -EPROTONOSUPPORT; |
| @@ -767,7 +766,7 @@ long st_write(struct sk_buff *skb) | |||
| 767 | #endif | 766 | #endif |
| 768 | long len; | 767 | long len; |
| 769 | 768 | ||
| 770 | st_kim_ref(&st_gdata); | 769 | st_kim_ref(&st_gdata, 0); |
| 771 | if (unlikely(skb == NULL || st_gdata == NULL | 770 | if (unlikely(skb == NULL || st_gdata == NULL |
| 772 | || st_gdata->tty == NULL)) { | 771 | || st_gdata->tty == NULL)) { |
| 773 | pr_err("data/tty unavailable to perform write"); | 772 | pr_err("data/tty unavailable to perform write"); |
| @@ -818,7 +817,7 @@ static int st_tty_open(struct tty_struct *tty) | |||
| 818 | struct st_data_s *st_gdata; | 817 | struct st_data_s *st_gdata; |
| 819 | pr_info("%s ", __func__); | 818 | pr_info("%s ", __func__); |
| 820 | 819 | ||
| 821 | st_kim_ref(&st_gdata); | 820 | st_kim_ref(&st_gdata, 0); |
| 822 | st_gdata->tty = tty; | 821 | st_gdata->tty = tty; |
| 823 | tty->disc_data = st_gdata; | 822 | tty->disc_data = st_gdata; |
| 824 | 823 | ||
diff --git a/drivers/staging/ti-st/st_core.h b/drivers/staging/ti-st/st_core.h index e0c32d149f5f..8601320a679e 100644 --- a/drivers/staging/ti-st/st_core.h +++ b/drivers/staging/ti-st/st_core.h | |||
| @@ -117,7 +117,7 @@ int st_core_init(struct st_data_s **); | |||
| 117 | void st_core_exit(struct st_data_s *); | 117 | void st_core_exit(struct st_data_s *); |
| 118 | 118 | ||
| 119 | /* ask for reference from KIM */ | 119 | /* ask for reference from KIM */ |
| 120 | void st_kim_ref(struct st_data_s **); | 120 | void st_kim_ref(struct st_data_s **, int); |
| 121 | 121 | ||
| 122 | #define GPS_STUB_TEST | 122 | #define GPS_STUB_TEST |
| 123 | #ifdef GPS_STUB_TEST | 123 | #ifdef GPS_STUB_TEST |
diff --git a/drivers/staging/ti-st/st_kim.c b/drivers/staging/ti-st/st_kim.c index b4a6c7fdc4e6..9e99463f76e8 100644 --- a/drivers/staging/ti-st/st_kim.c +++ b/drivers/staging/ti-st/st_kim.c | |||
| @@ -72,11 +72,26 @@ const unsigned char *protocol_names[] = { | |||
| 72 | PROTO_ENTRY(ST_GPS, "GPS"), | 72 | PROTO_ENTRY(ST_GPS, "GPS"), |
| 73 | }; | 73 | }; |
| 74 | 74 | ||
| 75 | #define MAX_ST_DEVICES 3 /* Imagine 1 on each UART for now */ | ||
| 76 | struct platform_device *st_kim_devices[MAX_ST_DEVICES]; | ||
| 75 | 77 | ||
| 76 | /**********************************************************************/ | 78 | /**********************************************************************/ |
| 77 | /* internal functions */ | 79 | /* internal functions */ |
| 78 | 80 | ||
| 79 | /** | 81 | /** |
| 82 | * st_get_plat_device - | ||
| 83 | * function which returns the reference to the platform device | ||
| 84 | * requested by id. As of now only 1 such device exists (id=0) | ||
| 85 | * the context requesting for reference can get the id to be | ||
| 86 | * requested by a. The protocol driver which is registering or | ||
| 87 | * b. the tty device which is opened. | ||
| 88 | */ | ||
| 89 | static struct platform_device *st_get_plat_device(int id) | ||
| 90 | { | ||
| 91 | return st_kim_devices[id]; | ||
| 92 | } | ||
| 93 | |||
| 94 | /** | ||
| 80 | * validate_firmware_response - | 95 | * validate_firmware_response - |
| 81 | * function to return whether the firmware response was proper | 96 | * function to return whether the firmware response was proper |
| 82 | * in case of error don't complete so that waiting for proper | 97 | * in case of error don't complete so that waiting for proper |
| @@ -353,7 +368,7 @@ void st_kim_chip_toggle(enum proto_type type, enum kim_gpio_state state) | |||
| 353 | struct kim_data_s *kim_gdata; | 368 | struct kim_data_s *kim_gdata; |
| 354 | pr_info(" %s ", __func__); | 369 | pr_info(" %s ", __func__); |
| 355 | 370 | ||
| 356 | kim_pdev = st_get_plat_device(); | 371 | kim_pdev = st_get_plat_device(0); |
| 357 | kim_gdata = dev_get_drvdata(&kim_pdev->dev); | 372 | kim_gdata = dev_get_drvdata(&kim_pdev->dev); |
| 358 | 373 | ||
| 359 | if (kim_gdata->gpios[type] == -1) { | 374 | if (kim_gdata->gpios[type] == -1) { |
| @@ -574,12 +589,12 @@ static int kim_toggle_radio(void *data, bool blocked) | |||
| 574 | * This would enable multiple such platform devices to exist | 589 | * This would enable multiple such platform devices to exist |
| 575 | * on a given platform | 590 | * on a given platform |
| 576 | */ | 591 | */ |
| 577 | void st_kim_ref(struct st_data_s **core_data) | 592 | void st_kim_ref(struct st_data_s **core_data, int id) |
| 578 | { | 593 | { |
| 579 | struct platform_device *pdev; | 594 | struct platform_device *pdev; |
| 580 | struct kim_data_s *kim_gdata; | 595 | struct kim_data_s *kim_gdata; |
| 581 | /* get kim_gdata reference from platform device */ | 596 | /* get kim_gdata reference from platform device */ |
| 582 | pdev = st_get_plat_device(); | 597 | pdev = st_get_plat_device(id); |
| 583 | kim_gdata = dev_get_drvdata(&pdev->dev); | 598 | kim_gdata = dev_get_drvdata(&pdev->dev); |
| 584 | *core_data = kim_gdata->core_data; | 599 | *core_data = kim_gdata->core_data; |
| 585 | } | 600 | } |
| @@ -623,6 +638,7 @@ static int kim_probe(struct platform_device *pdev) | |||
| 623 | long *gpios = pdev->dev.platform_data; | 638 | long *gpios = pdev->dev.platform_data; |
| 624 | struct kim_data_s *kim_gdata; | 639 | struct kim_data_s *kim_gdata; |
| 625 | 640 | ||
| 641 | st_kim_devices[pdev->id] = pdev; | ||
| 626 | kim_gdata = kzalloc(sizeof(struct kim_data_s), GFP_ATOMIC); | 642 | kim_gdata = kzalloc(sizeof(struct kim_data_s), GFP_ATOMIC); |
| 627 | if (!kim_gdata) { | 643 | if (!kim_gdata) { |
| 628 | pr_err("no mem to allocate"); | 644 | pr_err("no mem to allocate"); |
diff --git a/drivers/usb/core/Kconfig b/drivers/usb/core/Kconfig index 7e594449600e..9eed5b52d9de 100644 --- a/drivers/usb/core/Kconfig +++ b/drivers/usb/core/Kconfig | |||
| @@ -91,12 +91,12 @@ config USB_DYNAMIC_MINORS | |||
| 91 | If you are unsure about this, say N here. | 91 | If you are unsure about this, say N here. |
| 92 | 92 | ||
| 93 | config USB_SUSPEND | 93 | config USB_SUSPEND |
| 94 | bool "USB runtime power management (suspend/resume and wakeup)" | 94 | bool "USB runtime power management (autosuspend) and wakeup" |
| 95 | depends on USB && PM_RUNTIME | 95 | depends on USB && PM_RUNTIME |
| 96 | help | 96 | help |
| 97 | If you say Y here, you can use driver calls or the sysfs | 97 | If you say Y here, you can use driver calls or the sysfs |
| 98 | "power/level" file to suspend or resume individual USB | 98 | "power/control" file to enable or disable autosuspend for |
| 99 | peripherals and to enable or disable autosuspend (see | 99 | individual USB peripherals (see |
| 100 | Documentation/usb/power-management.txt for more details). | 100 | Documentation/usb/power-management.txt for more details). |
| 101 | 101 | ||
| 102 | Also, USB "remote wakeup" signaling is supported, whereby some | 102 | Also, USB "remote wakeup" signaling is supported, whereby some |
diff --git a/drivers/usb/core/file.c b/drivers/usb/core/file.c index f06f5dbc8cdc..1e6ccef2cf0c 100644 --- a/drivers/usb/core/file.c +++ b/drivers/usb/core/file.c | |||
| @@ -159,9 +159,9 @@ void usb_major_cleanup(void) | |||
| 159 | int usb_register_dev(struct usb_interface *intf, | 159 | int usb_register_dev(struct usb_interface *intf, |
| 160 | struct usb_class_driver *class_driver) | 160 | struct usb_class_driver *class_driver) |
| 161 | { | 161 | { |
| 162 | int retval = -EINVAL; | 162 | int retval; |
| 163 | int minor_base = class_driver->minor_base; | 163 | int minor_base = class_driver->minor_base; |
| 164 | int minor = 0; | 164 | int minor; |
| 165 | char name[20]; | 165 | char name[20]; |
| 166 | char *temp; | 166 | char *temp; |
| 167 | 167 | ||
| @@ -173,12 +173,17 @@ int usb_register_dev(struct usb_interface *intf, | |||
| 173 | */ | 173 | */ |
| 174 | minor_base = 0; | 174 | minor_base = 0; |
| 175 | #endif | 175 | #endif |
| 176 | intf->minor = -1; | ||
| 177 | |||
| 178 | dbg ("looking for a minor, starting at %d", minor_base); | ||
| 179 | 176 | ||
| 180 | if (class_driver->fops == NULL) | 177 | if (class_driver->fops == NULL) |
| 181 | goto exit; | 178 | return -EINVAL; |
| 179 | if (intf->minor >= 0) | ||
| 180 | return -EADDRINUSE; | ||
| 181 | |||
| 182 | retval = init_usb_class(); | ||
| 183 | if (retval) | ||
| 184 | return retval; | ||
| 185 | |||
| 186 | dev_dbg(&intf->dev, "looking for a minor, starting at %d", minor_base); | ||
| 182 | 187 | ||
| 183 | down_write(&minor_rwsem); | 188 | down_write(&minor_rwsem); |
| 184 | for (minor = minor_base; minor < MAX_USB_MINORS; ++minor) { | 189 | for (minor = minor_base; minor < MAX_USB_MINORS; ++minor) { |
| @@ -186,20 +191,12 @@ int usb_register_dev(struct usb_interface *intf, | |||
| 186 | continue; | 191 | continue; |
| 187 | 192 | ||
| 188 | usb_minors[minor] = class_driver->fops; | 193 | usb_minors[minor] = class_driver->fops; |
| 189 | 194 | intf->minor = minor; | |
| 190 | retval = 0; | ||
| 191 | break; | 195 | break; |
| 192 | } | 196 | } |
| 193 | up_write(&minor_rwsem); | 197 | up_write(&minor_rwsem); |
| 194 | 198 | if (intf->minor < 0) | |
| 195 | if (retval) | 199 | return -EXFULL; |
| 196 | goto exit; | ||
| 197 | |||
| 198 | retval = init_usb_class(); | ||
| 199 | if (retval) | ||
| 200 | goto exit; | ||
| 201 | |||
| 202 | intf->minor = minor; | ||
| 203 | 200 | ||
| 204 | /* create a usb class device for this usb interface */ | 201 | /* create a usb class device for this usb interface */ |
| 205 | snprintf(name, sizeof(name), class_driver->name, minor - minor_base); | 202 | snprintf(name, sizeof(name), class_driver->name, minor - minor_base); |
| @@ -213,11 +210,11 @@ int usb_register_dev(struct usb_interface *intf, | |||
| 213 | "%s", temp); | 210 | "%s", temp); |
| 214 | if (IS_ERR(intf->usb_dev)) { | 211 | if (IS_ERR(intf->usb_dev)) { |
| 215 | down_write(&minor_rwsem); | 212 | down_write(&minor_rwsem); |
| 216 | usb_minors[intf->minor] = NULL; | 213 | usb_minors[minor] = NULL; |
| 214 | intf->minor = -1; | ||
| 217 | up_write(&minor_rwsem); | 215 | up_write(&minor_rwsem); |
| 218 | retval = PTR_ERR(intf->usb_dev); | 216 | retval = PTR_ERR(intf->usb_dev); |
| 219 | } | 217 | } |
| 220 | exit: | ||
| 221 | return retval; | 218 | return retval; |
| 222 | } | 219 | } |
| 223 | EXPORT_SYMBOL_GPL(usb_register_dev); | 220 | EXPORT_SYMBOL_GPL(usb_register_dev); |
diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c index 844683e50383..9f0ce7de0e36 100644 --- a/drivers/usb/core/message.c +++ b/drivers/usb/core/message.c | |||
| @@ -1802,6 +1802,7 @@ free_interfaces: | |||
| 1802 | intf->dev.groups = usb_interface_groups; | 1802 | intf->dev.groups = usb_interface_groups; |
| 1803 | intf->dev.dma_mask = dev->dev.dma_mask; | 1803 | intf->dev.dma_mask = dev->dev.dma_mask; |
| 1804 | INIT_WORK(&intf->reset_ws, __usb_queue_reset_device); | 1804 | INIT_WORK(&intf->reset_ws, __usb_queue_reset_device); |
| 1805 | intf->minor = -1; | ||
| 1805 | device_initialize(&intf->dev); | 1806 | device_initialize(&intf->dev); |
| 1806 | dev_set_name(&intf->dev, "%d-%s:%d.%d", | 1807 | dev_set_name(&intf->dev, "%d-%s:%d.%d", |
| 1807 | dev->bus->busnum, dev->devpath, | 1808 | dev->bus->busnum, dev->devpath, |
diff --git a/drivers/usb/musb/cppi_dma.c b/drivers/usb/musb/cppi_dma.c index 59dc3d351b60..5ab5bb89bae3 100644 --- a/drivers/usb/musb/cppi_dma.c +++ b/drivers/usb/musb/cppi_dma.c | |||
| @@ -322,6 +322,7 @@ cppi_channel_allocate(struct dma_controller *c, | |||
| 322 | index, transmit ? 'T' : 'R', cppi_ch); | 322 | index, transmit ? 'T' : 'R', cppi_ch); |
| 323 | cppi_ch->hw_ep = ep; | 323 | cppi_ch->hw_ep = ep; |
| 324 | cppi_ch->channel.status = MUSB_DMA_STATUS_FREE; | 324 | cppi_ch->channel.status = MUSB_DMA_STATUS_FREE; |
| 325 | cppi_ch->channel.max_len = 0x7fffffff; | ||
| 325 | 326 | ||
| 326 | DBG(4, "Allocate CPPI%d %cX\n", index, transmit ? 'T' : 'R'); | 327 | DBG(4, "Allocate CPPI%d %cX\n", index, transmit ? 'T' : 'R'); |
| 327 | return &cppi_ch->channel; | 328 | return &cppi_ch->channel; |
diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c index 6fca870e957e..d065e23f123e 100644 --- a/drivers/usb/musb/musb_gadget.c +++ b/drivers/usb/musb/musb_gadget.c | |||
| @@ -300,6 +300,11 @@ static void txstate(struct musb *musb, struct musb_request *req) | |||
| 300 | #ifndef CONFIG_MUSB_PIO_ONLY | 300 | #ifndef CONFIG_MUSB_PIO_ONLY |
| 301 | if (is_dma_capable() && musb_ep->dma) { | 301 | if (is_dma_capable() && musb_ep->dma) { |
| 302 | struct dma_controller *c = musb->dma_controller; | 302 | struct dma_controller *c = musb->dma_controller; |
| 303 | size_t request_size; | ||
| 304 | |||
| 305 | /* setup DMA, then program endpoint CSR */ | ||
| 306 | request_size = min_t(size_t, request->length - request->actual, | ||
| 307 | musb_ep->dma->max_len); | ||
| 303 | 308 | ||
| 304 | use_dma = (request->dma != DMA_ADDR_INVALID); | 309 | use_dma = (request->dma != DMA_ADDR_INVALID); |
| 305 | 310 | ||
| @@ -307,11 +312,6 @@ static void txstate(struct musb *musb, struct musb_request *req) | |||
| 307 | 312 | ||
| 308 | #ifdef CONFIG_USB_INVENTRA_DMA | 313 | #ifdef CONFIG_USB_INVENTRA_DMA |
| 309 | { | 314 | { |
| 310 | size_t request_size; | ||
| 311 | |||
| 312 | /* setup DMA, then program endpoint CSR */ | ||
| 313 | request_size = min_t(size_t, request->length, | ||
| 314 | musb_ep->dma->max_len); | ||
| 315 | if (request_size < musb_ep->packet_sz) | 315 | if (request_size < musb_ep->packet_sz) |
| 316 | musb_ep->dma->desired_mode = 0; | 316 | musb_ep->dma->desired_mode = 0; |
| 317 | else | 317 | else |
| @@ -373,8 +373,8 @@ static void txstate(struct musb *musb, struct musb_request *req) | |||
| 373 | use_dma = use_dma && c->channel_program( | 373 | use_dma = use_dma && c->channel_program( |
| 374 | musb_ep->dma, musb_ep->packet_sz, | 374 | musb_ep->dma, musb_ep->packet_sz, |
| 375 | 0, | 375 | 0, |
| 376 | request->dma, | 376 | request->dma + request->actual, |
| 377 | request->length); | 377 | request_size); |
| 378 | if (!use_dma) { | 378 | if (!use_dma) { |
| 379 | c->channel_release(musb_ep->dma); | 379 | c->channel_release(musb_ep->dma); |
| 380 | musb_ep->dma = NULL; | 380 | musb_ep->dma = NULL; |
| @@ -386,8 +386,8 @@ static void txstate(struct musb *musb, struct musb_request *req) | |||
| 386 | use_dma = use_dma && c->channel_program( | 386 | use_dma = use_dma && c->channel_program( |
| 387 | musb_ep->dma, musb_ep->packet_sz, | 387 | musb_ep->dma, musb_ep->packet_sz, |
| 388 | request->zero, | 388 | request->zero, |
| 389 | request->dma, | 389 | request->dma + request->actual, |
| 390 | request->length); | 390 | request_size); |
| 391 | #endif | 391 | #endif |
| 392 | } | 392 | } |
| 393 | #endif | 393 | #endif |
| @@ -501,26 +501,14 @@ void musb_g_tx(struct musb *musb, u8 epnum) | |||
| 501 | request->zero = 0; | 501 | request->zero = 0; |
| 502 | } | 502 | } |
| 503 | 503 | ||
| 504 | /* ... or if not, then complete it. */ | 504 | if (request->actual == request->length) { |
| 505 | musb_g_giveback(musb_ep, request, 0); | 505 | musb_g_giveback(musb_ep, request, 0); |
| 506 | 506 | request = musb_ep->desc ? next_request(musb_ep) : NULL; | |
| 507 | /* | 507 | if (!request) { |
| 508 | * Kickstart next transfer if appropriate; | 508 | DBG(4, "%s idle now\n", |
| 509 | * the packet that just completed might not | 509 | musb_ep->end_point.name); |
| 510 | * be transmitted for hours or days. | 510 | return; |
| 511 | * REVISIT for double buffering... | 511 | } |
| 512 | * FIXME revisit for stalls too... | ||
| 513 | */ | ||
| 514 | musb_ep_select(mbase, epnum); | ||
| 515 | csr = musb_readw(epio, MUSB_TXCSR); | ||
| 516 | if (csr & MUSB_TXCSR_FIFONOTEMPTY) | ||
| 517 | return; | ||
| 518 | |||
| 519 | request = musb_ep->desc ? next_request(musb_ep) : NULL; | ||
| 520 | if (!request) { | ||
| 521 | DBG(4, "%s idle now\n", | ||
| 522 | musb_ep->end_point.name); | ||
| 523 | return; | ||
| 524 | } | 512 | } |
| 525 | } | 513 | } |
| 526 | 514 | ||
| @@ -568,11 +556,19 @@ static void rxstate(struct musb *musb, struct musb_request *req) | |||
| 568 | { | 556 | { |
| 569 | const u8 epnum = req->epnum; | 557 | const u8 epnum = req->epnum; |
| 570 | struct usb_request *request = &req->request; | 558 | struct usb_request *request = &req->request; |
| 571 | struct musb_ep *musb_ep = &musb->endpoints[epnum].ep_out; | 559 | struct musb_ep *musb_ep; |
| 572 | void __iomem *epio = musb->endpoints[epnum].regs; | 560 | void __iomem *epio = musb->endpoints[epnum].regs; |
| 573 | unsigned fifo_count = 0; | 561 | unsigned fifo_count = 0; |
| 574 | u16 len = musb_ep->packet_sz; | 562 | u16 len; |
| 575 | u16 csr = musb_readw(epio, MUSB_RXCSR); | 563 | u16 csr = musb_readw(epio, MUSB_RXCSR); |
| 564 | struct musb_hw_ep *hw_ep = &musb->endpoints[epnum]; | ||
| 565 | |||
| 566 | if (hw_ep->is_shared_fifo) | ||
| 567 | musb_ep = &hw_ep->ep_in; | ||
| 568 | else | ||
| 569 | musb_ep = &hw_ep->ep_out; | ||
| 570 | |||
| 571 | len = musb_ep->packet_sz; | ||
| 576 | 572 | ||
| 577 | /* We shouldn't get here while DMA is active, but we do... */ | 573 | /* We shouldn't get here while DMA is active, but we do... */ |
| 578 | if (dma_channel_status(musb_ep->dma) == MUSB_DMA_STATUS_BUSY) { | 574 | if (dma_channel_status(musb_ep->dma) == MUSB_DMA_STATUS_BUSY) { |
| @@ -647,8 +643,8 @@ static void rxstate(struct musb *musb, struct musb_request *req) | |||
| 647 | */ | 643 | */ |
| 648 | 644 | ||
| 649 | csr |= MUSB_RXCSR_DMAENAB; | 645 | csr |= MUSB_RXCSR_DMAENAB; |
| 650 | #ifdef USE_MODE1 | ||
| 651 | csr |= MUSB_RXCSR_AUTOCLEAR; | 646 | csr |= MUSB_RXCSR_AUTOCLEAR; |
| 647 | #ifdef USE_MODE1 | ||
| 652 | /* csr |= MUSB_RXCSR_DMAMODE; */ | 648 | /* csr |= MUSB_RXCSR_DMAMODE; */ |
| 653 | 649 | ||
| 654 | /* this special sequence (enabling and then | 650 | /* this special sequence (enabling and then |
| @@ -663,10 +659,11 @@ static void rxstate(struct musb *musb, struct musb_request *req) | |||
| 663 | if (request->actual < request->length) { | 659 | if (request->actual < request->length) { |
| 664 | int transfer_size = 0; | 660 | int transfer_size = 0; |
| 665 | #ifdef USE_MODE1 | 661 | #ifdef USE_MODE1 |
| 666 | transfer_size = min(request->length, | 662 | transfer_size = min(request->length - request->actual, |
| 667 | channel->max_len); | 663 | channel->max_len); |
| 668 | #else | 664 | #else |
| 669 | transfer_size = len; | 665 | transfer_size = min(request->length - request->actual, |
| 666 | (unsigned)len); | ||
| 670 | #endif | 667 | #endif |
| 671 | if (transfer_size <= musb_ep->packet_sz) | 668 | if (transfer_size <= musb_ep->packet_sz) |
| 672 | musb_ep->dma->desired_mode = 0; | 669 | musb_ep->dma->desired_mode = 0; |
| @@ -740,9 +737,15 @@ void musb_g_rx(struct musb *musb, u8 epnum) | |||
| 740 | u16 csr; | 737 | u16 csr; |
| 741 | struct usb_request *request; | 738 | struct usb_request *request; |
| 742 | void __iomem *mbase = musb->mregs; | 739 | void __iomem *mbase = musb->mregs; |
| 743 | struct musb_ep *musb_ep = &musb->endpoints[epnum].ep_out; | 740 | struct musb_ep *musb_ep; |
| 744 | void __iomem *epio = musb->endpoints[epnum].regs; | 741 | void __iomem *epio = musb->endpoints[epnum].regs; |
| 745 | struct dma_channel *dma; | 742 | struct dma_channel *dma; |
| 743 | struct musb_hw_ep *hw_ep = &musb->endpoints[epnum]; | ||
| 744 | |||
| 745 | if (hw_ep->is_shared_fifo) | ||
| 746 | musb_ep = &hw_ep->ep_in; | ||
| 747 | else | ||
| 748 | musb_ep = &hw_ep->ep_out; | ||
| 746 | 749 | ||
| 747 | musb_ep_select(mbase, epnum); | 750 | musb_ep_select(mbase, epnum); |
| 748 | 751 | ||
| @@ -1081,7 +1084,7 @@ struct free_record { | |||
| 1081 | /* | 1084 | /* |
| 1082 | * Context: controller locked, IRQs blocked. | 1085 | * Context: controller locked, IRQs blocked. |
| 1083 | */ | 1086 | */ |
| 1084 | static void musb_ep_restart(struct musb *musb, struct musb_request *req) | 1087 | void musb_ep_restart(struct musb *musb, struct musb_request *req) |
| 1085 | { | 1088 | { |
| 1086 | DBG(3, "<== %s request %p len %u on hw_ep%d\n", | 1089 | DBG(3, "<== %s request %p len %u on hw_ep%d\n", |
| 1087 | req->tx ? "TX/IN" : "RX/OUT", | 1090 | req->tx ? "TX/IN" : "RX/OUT", |
diff --git a/drivers/usb/musb/musb_gadget.h b/drivers/usb/musb/musb_gadget.h index c8b140325d82..572b1da7f2dc 100644 --- a/drivers/usb/musb/musb_gadget.h +++ b/drivers/usb/musb/musb_gadget.h | |||
| @@ -105,4 +105,6 @@ extern void musb_gadget_cleanup(struct musb *); | |||
| 105 | 105 | ||
| 106 | extern void musb_g_giveback(struct musb_ep *, struct usb_request *, int); | 106 | extern void musb_g_giveback(struct musb_ep *, struct usb_request *, int); |
| 107 | 107 | ||
| 108 | extern void musb_ep_restart(struct musb *, struct musb_request *); | ||
| 109 | |||
| 108 | #endif /* __MUSB_GADGET_H */ | 110 | #endif /* __MUSB_GADGET_H */ |
diff --git a/drivers/usb/musb/musb_gadget_ep0.c b/drivers/usb/musb/musb_gadget_ep0.c index 59bef8f3a358..6dd03f4c5f49 100644 --- a/drivers/usb/musb/musb_gadget_ep0.c +++ b/drivers/usb/musb/musb_gadget_ep0.c | |||
| @@ -261,6 +261,7 @@ __acquires(musb->lock) | |||
| 261 | ctrlrequest->wIndex & 0x0f; | 261 | ctrlrequest->wIndex & 0x0f; |
| 262 | struct musb_ep *musb_ep; | 262 | struct musb_ep *musb_ep; |
| 263 | struct musb_hw_ep *ep; | 263 | struct musb_hw_ep *ep; |
| 264 | struct musb_request *request; | ||
| 264 | void __iomem *regs; | 265 | void __iomem *regs; |
| 265 | int is_in; | 266 | int is_in; |
| 266 | u16 csr; | 267 | u16 csr; |
| @@ -302,6 +303,14 @@ __acquires(musb->lock) | |||
| 302 | musb_writew(regs, MUSB_RXCSR, csr); | 303 | musb_writew(regs, MUSB_RXCSR, csr); |
| 303 | } | 304 | } |
| 304 | 305 | ||
| 306 | /* Maybe start the first request in the queue */ | ||
| 307 | request = to_musb_request( | ||
| 308 | next_request(musb_ep)); | ||
| 309 | if (!musb_ep->busy && request) { | ||
| 310 | DBG(3, "restarting the request\n"); | ||
| 311 | musb_ep_restart(musb, request); | ||
| 312 | } | ||
| 313 | |||
| 305 | /* select ep0 again */ | 314 | /* select ep0 again */ |
| 306 | musb_ep_select(mbase, 0); | 315 | musb_ep_select(mbase, 0); |
| 307 | } break; | 316 | } break; |
diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c index 877d20b1dff9..9e65c47cc98b 100644 --- a/drivers/usb/musb/musb_host.c +++ b/drivers/usb/musb/musb_host.c | |||
| @@ -660,6 +660,12 @@ static bool musb_tx_dma_program(struct dma_controller *dma, | |||
| 660 | 660 | ||
| 661 | qh->segsize = length; | 661 | qh->segsize = length; |
| 662 | 662 | ||
| 663 | /* | ||
| 664 | * Ensure the data reaches to main memory before starting | ||
| 665 | * DMA transfer | ||
| 666 | */ | ||
| 667 | wmb(); | ||
| 668 | |||
| 663 | if (!dma->channel_program(channel, pkt_size, mode, | 669 | if (!dma->channel_program(channel, pkt_size, mode, |
| 664 | urb->transfer_dma + offset, length)) { | 670 | urb->transfer_dma + offset, length)) { |
| 665 | dma->channel_release(channel); | 671 | dma->channel_release(channel); |
diff --git a/drivers/video/console/fbcon.c b/drivers/video/console/fbcon.c index 84f842331dfa..7ccc967831f0 100644 --- a/drivers/video/console/fbcon.c +++ b/drivers/video/console/fbcon.c | |||
| @@ -3508,7 +3508,7 @@ static void fbcon_exit(void) | |||
| 3508 | softback_buf = 0UL; | 3508 | softback_buf = 0UL; |
| 3509 | 3509 | ||
| 3510 | for (i = 0; i < FB_MAX; i++) { | 3510 | for (i = 0; i < FB_MAX; i++) { |
| 3511 | int pending; | 3511 | int pending = 0; |
| 3512 | 3512 | ||
| 3513 | mapped = 0; | 3513 | mapped = 0; |
| 3514 | info = registered_fb[i]; | 3514 | info = registered_fb[i]; |
| @@ -3516,7 +3516,8 @@ static void fbcon_exit(void) | |||
| 3516 | if (info == NULL) | 3516 | if (info == NULL) |
| 3517 | continue; | 3517 | continue; |
| 3518 | 3518 | ||
| 3519 | pending = cancel_work_sync(&info->queue); | 3519 | if (info->queue.func) |
| 3520 | pending = cancel_work_sync(&info->queue); | ||
| 3520 | DPRINTK("fbcon: %s pending work\n", (pending ? "canceled" : | 3521 | DPRINTK("fbcon: %s pending work\n", (pending ? "canceled" : |
| 3521 | "no")); | 3522 | "no")); |
| 3522 | 3523 | ||
diff --git a/drivers/video/efifb.c b/drivers/video/efifb.c index 815f84b07933..70477c2e4b61 100644 --- a/drivers/video/efifb.c +++ b/drivers/video/efifb.c | |||
| @@ -13,7 +13,7 @@ | |||
| 13 | #include <linux/platform_device.h> | 13 | #include <linux/platform_device.h> |
| 14 | #include <linux/screen_info.h> | 14 | #include <linux/screen_info.h> |
| 15 | #include <linux/dmi.h> | 15 | #include <linux/dmi.h> |
| 16 | 16 | #include <linux/pci.h> | |
| 17 | #include <video/vga.h> | 17 | #include <video/vga.h> |
| 18 | 18 | ||
| 19 | static struct fb_var_screeninfo efifb_defined __devinitdata = { | 19 | static struct fb_var_screeninfo efifb_defined __devinitdata = { |
| @@ -39,17 +39,31 @@ enum { | |||
| 39 | M_I20, /* 20-Inch iMac */ | 39 | M_I20, /* 20-Inch iMac */ |
| 40 | M_I20_SR, /* 20-Inch iMac (Santa Rosa) */ | 40 | M_I20_SR, /* 20-Inch iMac (Santa Rosa) */ |
| 41 | M_I24, /* 24-Inch iMac */ | 41 | M_I24, /* 24-Inch iMac */ |
| 42 | M_I24_8_1, /* 24-Inch iMac, 8,1th gen */ | ||
| 43 | M_I24_10_1, /* 24-Inch iMac, 10,1th gen */ | ||
| 44 | M_I27_11_1, /* 27-Inch iMac, 11,1th gen */ | ||
| 42 | M_MINI, /* Mac Mini */ | 45 | M_MINI, /* Mac Mini */ |
| 46 | M_MINI_3_1, /* Mac Mini, 3,1th gen */ | ||
| 47 | M_MINI_4_1, /* Mac Mini, 4,1th gen */ | ||
| 43 | M_MB, /* MacBook */ | 48 | M_MB, /* MacBook */ |
| 44 | M_MB_2, /* MacBook, 2nd rev. */ | 49 | M_MB_2, /* MacBook, 2nd rev. */ |
| 45 | M_MB_3, /* MacBook, 3rd rev. */ | 50 | M_MB_3, /* MacBook, 3rd rev. */ |
| 51 | M_MB_5_1, /* MacBook, 5th rev. */ | ||
| 52 | M_MB_6_1, /* MacBook, 6th rev. */ | ||
| 53 | M_MB_7_1, /* MacBook, 7th rev. */ | ||
| 46 | M_MB_SR, /* MacBook, 2nd gen, (Santa Rosa) */ | 54 | M_MB_SR, /* MacBook, 2nd gen, (Santa Rosa) */ |
| 47 | M_MBA, /* MacBook Air */ | 55 | M_MBA, /* MacBook Air */ |
| 48 | M_MBP, /* MacBook Pro */ | 56 | M_MBP, /* MacBook Pro */ |
| 49 | M_MBP_2, /* MacBook Pro 2nd gen */ | 57 | M_MBP_2, /* MacBook Pro 2nd gen */ |
| 58 | M_MBP_2_2, /* MacBook Pro 2,2nd gen */ | ||
| 50 | M_MBP_SR, /* MacBook Pro (Santa Rosa) */ | 59 | M_MBP_SR, /* MacBook Pro (Santa Rosa) */ |
| 51 | M_MBP_4, /* MacBook Pro, 4th gen */ | 60 | M_MBP_4, /* MacBook Pro, 4th gen */ |
| 52 | M_MBP_5_1, /* MacBook Pro, 5,1th gen */ | 61 | M_MBP_5_1, /* MacBook Pro, 5,1th gen */ |
| 62 | M_MBP_5_2, /* MacBook Pro, 5,2th gen */ | ||
| 63 | M_MBP_5_3, /* MacBook Pro, 5,3rd gen */ | ||
| 64 | M_MBP_6_1, /* MacBook Pro, 6,1th gen */ | ||
| 65 | M_MBP_6_2, /* MacBook Pro, 6,2th gen */ | ||
| 66 | M_MBP_7_1, /* MacBook Pro, 7,1th gen */ | ||
| 53 | M_UNKNOWN /* placeholder */ | 67 | M_UNKNOWN /* placeholder */ |
| 54 | }; | 68 | }; |
| 55 | 69 | ||
| @@ -64,14 +78,28 @@ static struct efifb_dmi_info { | |||
| 64 | [M_I20] = { "i20", 0x80010000, 1728 * 4, 1680, 1050 }, /* guess */ | 78 | [M_I20] = { "i20", 0x80010000, 1728 * 4, 1680, 1050 }, /* guess */ |
| 65 | [M_I20_SR] = { "imac7", 0x40010000, 1728 * 4, 1680, 1050 }, | 79 | [M_I20_SR] = { "imac7", 0x40010000, 1728 * 4, 1680, 1050 }, |
| 66 | [M_I24] = { "i24", 0x80010000, 2048 * 4, 1920, 1200 }, /* guess */ | 80 | [M_I24] = { "i24", 0x80010000, 2048 * 4, 1920, 1200 }, /* guess */ |
| 81 | [M_I24_8_1] = { "imac8", 0xc0060000, 2048 * 4, 1920, 1200 }, | ||
| 82 | [M_I24_10_1] = { "imac10", 0xc0010000, 2048 * 4, 1920, 1080 }, | ||
| 83 | [M_I27_11_1] = { "imac11", 0xc0010000, 2560 * 4, 2560, 1440 }, | ||
| 67 | [M_MINI]= { "mini", 0x80000000, 2048 * 4, 1024, 768 }, | 84 | [M_MINI]= { "mini", 0x80000000, 2048 * 4, 1024, 768 }, |
| 85 | [M_MINI_3_1] = { "mini31", 0x40010000, 1024 * 4, 1024, 768 }, | ||
| 86 | [M_MINI_4_1] = { "mini41", 0xc0010000, 2048 * 4, 1920, 1200 }, | ||
| 68 | [M_MB] = { "macbook", 0x80000000, 2048 * 4, 1280, 800 }, | 87 | [M_MB] = { "macbook", 0x80000000, 2048 * 4, 1280, 800 }, |
| 88 | [M_MB_5_1] = { "macbook51", 0x80010000, 2048 * 4, 1280, 800 }, | ||
| 89 | [M_MB_6_1] = { "macbook61", 0x80010000, 2048 * 4, 1280, 800 }, | ||
| 90 | [M_MB_7_1] = { "macbook71", 0x80010000, 2048 * 4, 1280, 800 }, | ||
| 69 | [M_MBA] = { "mba", 0x80000000, 2048 * 4, 1280, 800 }, | 91 | [M_MBA] = { "mba", 0x80000000, 2048 * 4, 1280, 800 }, |
| 70 | [M_MBP] = { "mbp", 0x80010000, 1472 * 4, 1440, 900 }, | 92 | [M_MBP] = { "mbp", 0x80010000, 1472 * 4, 1440, 900 }, |
| 71 | [M_MBP_2] = { "mbp2", 0, 0, 0, 0 }, /* placeholder */ | 93 | [M_MBP_2] = { "mbp2", 0, 0, 0, 0 }, /* placeholder */ |
| 94 | [M_MBP_2_2] = { "mbp22", 0x80010000, 1472 * 4, 1440, 900 }, | ||
| 72 | [M_MBP_SR] = { "mbp3", 0x80030000, 2048 * 4, 1440, 900 }, | 95 | [M_MBP_SR] = { "mbp3", 0x80030000, 2048 * 4, 1440, 900 }, |
| 73 | [M_MBP_4] = { "mbp4", 0xc0060000, 2048 * 4, 1920, 1200 }, | 96 | [M_MBP_4] = { "mbp4", 0xc0060000, 2048 * 4, 1920, 1200 }, |
| 74 | [M_MBP_5_1] = { "mbp51", 0xc0010000, 2048 * 4, 1440, 900 }, | 97 | [M_MBP_5_1] = { "mbp51", 0xc0010000, 2048 * 4, 1440, 900 }, |
| 98 | [M_MBP_5_2] = { "mbp52", 0xc0010000, 2048 * 4, 1920, 1200 }, | ||
| 99 | [M_MBP_5_3] = { "mbp53", 0xd0010000, 2048 * 4, 1440, 900 }, | ||
| 100 | [M_MBP_6_1] = { "mbp61", 0x90030000, 2048 * 4, 1920, 1200 }, | ||
| 101 | [M_MBP_6_2] = { "mbp62", 0x90030000, 2048 * 4, 1680, 1050 }, | ||
| 102 | [M_MBP_7_1] = { "mbp71", 0xc0010000, 2048 * 4, 1280, 800 }, | ||
| 75 | [M_UNKNOWN] = { NULL, 0, 0, 0, 0 } | 103 | [M_UNKNOWN] = { NULL, 0, 0, 0, 0 } |
| 76 | }; | 104 | }; |
| 77 | 105 | ||
| @@ -92,7 +120,12 @@ static const struct dmi_system_id dmi_system_table[] __initconst = { | |||
| 92 | EFIFB_DMI_SYSTEM_ID("Apple Computer, Inc.", "iMac6,1", M_I24), | 120 | EFIFB_DMI_SYSTEM_ID("Apple Computer, Inc.", "iMac6,1", M_I24), |
| 93 | EFIFB_DMI_SYSTEM_ID("Apple Inc.", "iMac6,1", M_I24), | 121 | EFIFB_DMI_SYSTEM_ID("Apple Inc.", "iMac6,1", M_I24), |
| 94 | EFIFB_DMI_SYSTEM_ID("Apple Inc.", "iMac7,1", M_I20_SR), | 122 | EFIFB_DMI_SYSTEM_ID("Apple Inc.", "iMac7,1", M_I20_SR), |
| 123 | EFIFB_DMI_SYSTEM_ID("Apple Inc.", "iMac8,1", M_I24_8_1), | ||
| 124 | EFIFB_DMI_SYSTEM_ID("Apple Inc.", "iMac10,1", M_I24_10_1), | ||
| 125 | EFIFB_DMI_SYSTEM_ID("Apple Inc.", "iMac11,1", M_I27_11_1), | ||
| 95 | EFIFB_DMI_SYSTEM_ID("Apple Computer, Inc.", "Macmini1,1", M_MINI), | 126 | EFIFB_DMI_SYSTEM_ID("Apple Computer, Inc.", "Macmini1,1", M_MINI), |
| 127 | EFIFB_DMI_SYSTEM_ID("Apple Inc.", "Macmini3,1", M_MINI_3_1), | ||
| 128 | EFIFB_DMI_SYSTEM_ID("Apple Inc.", "Macmini4,1", M_MINI_4_1), | ||
| 96 | EFIFB_DMI_SYSTEM_ID("Apple Computer, Inc.", "MacBook1,1", M_MB), | 129 | EFIFB_DMI_SYSTEM_ID("Apple Computer, Inc.", "MacBook1,1", M_MB), |
| 97 | /* At least one of these two will be right; maybe both? */ | 130 | /* At least one of these two will be right; maybe both? */ |
| 98 | EFIFB_DMI_SYSTEM_ID("Apple Computer, Inc.", "MacBook2,1", M_MB), | 131 | EFIFB_DMI_SYSTEM_ID("Apple Computer, Inc.", "MacBook2,1", M_MB), |
| @@ -101,14 +134,23 @@ static const struct dmi_system_id dmi_system_table[] __initconst = { | |||
| 101 | EFIFB_DMI_SYSTEM_ID("Apple Computer, Inc.", "MacBook3,1", M_MB), | 134 | EFIFB_DMI_SYSTEM_ID("Apple Computer, Inc.", "MacBook3,1", M_MB), |
| 102 | EFIFB_DMI_SYSTEM_ID("Apple Inc.", "MacBook3,1", M_MB), | 135 | EFIFB_DMI_SYSTEM_ID("Apple Inc.", "MacBook3,1", M_MB), |
| 103 | EFIFB_DMI_SYSTEM_ID("Apple Inc.", "MacBook4,1", M_MB), | 136 | EFIFB_DMI_SYSTEM_ID("Apple Inc.", "MacBook4,1", M_MB), |
| 137 | EFIFB_DMI_SYSTEM_ID("Apple Inc.", "MacBook5,1", M_MB_5_1), | ||
| 138 | EFIFB_DMI_SYSTEM_ID("Apple Inc.", "MacBook6,1", M_MB_6_1), | ||
| 139 | EFIFB_DMI_SYSTEM_ID("Apple Inc.", "MacBook7,1", M_MB_7_1), | ||
| 104 | EFIFB_DMI_SYSTEM_ID("Apple Inc.", "MacBookAir1,1", M_MBA), | 140 | EFIFB_DMI_SYSTEM_ID("Apple Inc.", "MacBookAir1,1", M_MBA), |
| 105 | EFIFB_DMI_SYSTEM_ID("Apple Computer, Inc.", "MacBookPro1,1", M_MBP), | 141 | EFIFB_DMI_SYSTEM_ID("Apple Computer, Inc.", "MacBookPro1,1", M_MBP), |
| 106 | EFIFB_DMI_SYSTEM_ID("Apple Computer, Inc.", "MacBookPro2,1", M_MBP_2), | 142 | EFIFB_DMI_SYSTEM_ID("Apple Computer, Inc.", "MacBookPro2,1", M_MBP_2), |
| 143 | EFIFB_DMI_SYSTEM_ID("Apple Computer, Inc.", "MacBookPro2,2", M_MBP_2_2), | ||
| 107 | EFIFB_DMI_SYSTEM_ID("Apple Inc.", "MacBookPro2,1", M_MBP_2), | 144 | EFIFB_DMI_SYSTEM_ID("Apple Inc.", "MacBookPro2,1", M_MBP_2), |
| 108 | EFIFB_DMI_SYSTEM_ID("Apple Computer, Inc.", "MacBookPro3,1", M_MBP_SR), | 145 | EFIFB_DMI_SYSTEM_ID("Apple Computer, Inc.", "MacBookPro3,1", M_MBP_SR), |
| 109 | EFIFB_DMI_SYSTEM_ID("Apple Inc.", "MacBookPro3,1", M_MBP_SR), | 146 | EFIFB_DMI_SYSTEM_ID("Apple Inc.", "MacBookPro3,1", M_MBP_SR), |
| 110 | EFIFB_DMI_SYSTEM_ID("Apple Inc.", "MacBookPro4,1", M_MBP_4), | 147 | EFIFB_DMI_SYSTEM_ID("Apple Inc.", "MacBookPro4,1", M_MBP_4), |
| 111 | EFIFB_DMI_SYSTEM_ID("Apple Inc.", "MacBookPro5,1", M_MBP_5_1), | 148 | EFIFB_DMI_SYSTEM_ID("Apple Inc.", "MacBookPro5,1", M_MBP_5_1), |
| 149 | EFIFB_DMI_SYSTEM_ID("Apple Inc.", "MacBookPro5,2", M_MBP_5_2), | ||
| 150 | EFIFB_DMI_SYSTEM_ID("Apple Inc.", "MacBookPro5,3", M_MBP_5_3), | ||
| 151 | EFIFB_DMI_SYSTEM_ID("Apple Inc.", "MacBookPro6,1", M_MBP_6_1), | ||
| 152 | EFIFB_DMI_SYSTEM_ID("Apple Inc.", "MacBookPro6,2", M_MBP_6_2), | ||
| 153 | EFIFB_DMI_SYSTEM_ID("Apple Inc.", "MacBookPro7,1", M_MBP_7_1), | ||
| 112 | {}, | 154 | {}, |
| 113 | }; | 155 | }; |
| 114 | 156 | ||
| @@ -116,7 +158,7 @@ static int set_system(const struct dmi_system_id *id) | |||
| 116 | { | 158 | { |
| 117 | struct efifb_dmi_info *info = id->driver_data; | 159 | struct efifb_dmi_info *info = id->driver_data; |
| 118 | if (info->base == 0) | 160 | if (info->base == 0) |
| 119 | return -ENODEV; | 161 | return 0; |
| 120 | 162 | ||
| 121 | printk(KERN_INFO "efifb: dmi detected %s - framebuffer at %p " | 163 | printk(KERN_INFO "efifb: dmi detected %s - framebuffer at %p " |
| 122 | "(%dx%d, stride %d)\n", id->ident, | 164 | "(%dx%d, stride %d)\n", id->ident, |
| @@ -124,18 +166,55 @@ static int set_system(const struct dmi_system_id *id) | |||
| 124 | info->stride); | 166 | info->stride); |
| 125 | 167 | ||
| 126 | /* Trust the bootloader over the DMI tables */ | 168 | /* Trust the bootloader over the DMI tables */ |
| 127 | if (screen_info.lfb_base == 0) | 169 | if (screen_info.lfb_base == 0) { |
| 170 | #if defined(CONFIG_PCI) | ||
| 171 | struct pci_dev *dev = NULL; | ||
| 172 | int found_bar = 0; | ||
| 173 | #endif | ||
| 128 | screen_info.lfb_base = info->base; | 174 | screen_info.lfb_base = info->base; |
| 129 | if (screen_info.lfb_linelength == 0) | ||
| 130 | screen_info.lfb_linelength = info->stride; | ||
| 131 | if (screen_info.lfb_width == 0) | ||
| 132 | screen_info.lfb_width = info->width; | ||
| 133 | if (screen_info.lfb_height == 0) | ||
| 134 | screen_info.lfb_height = info->height; | ||
| 135 | if (screen_info.orig_video_isVGA == 0) | ||
| 136 | screen_info.orig_video_isVGA = VIDEO_TYPE_EFI; | ||
| 137 | 175 | ||
| 138 | return 0; | 176 | #if defined(CONFIG_PCI) |
| 177 | /* make sure that the address in the table is actually on a | ||
| 178 | * VGA device's PCI BAR */ | ||
| 179 | |||
| 180 | for_each_pci_dev(dev) { | ||
| 181 | int i; | ||
| 182 | if ((dev->class >> 8) != PCI_CLASS_DISPLAY_VGA) | ||
| 183 | continue; | ||
| 184 | for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) { | ||
| 185 | resource_size_t start, end; | ||
| 186 | |||
| 187 | start = pci_resource_start(dev, i); | ||
| 188 | if (start == 0) | ||
| 189 | break; | ||
| 190 | end = pci_resource_end(dev, i); | ||
| 191 | if (screen_info.lfb_base >= start && | ||
| 192 | screen_info.lfb_base < end) { | ||
| 193 | found_bar = 1; | ||
| 194 | } | ||
| 195 | } | ||
| 196 | } | ||
| 197 | if (!found_bar) | ||
| 198 | screen_info.lfb_base = 0; | ||
| 199 | #endif | ||
| 200 | } | ||
| 201 | if (screen_info.lfb_base) { | ||
| 202 | if (screen_info.lfb_linelength == 0) | ||
| 203 | screen_info.lfb_linelength = info->stride; | ||
| 204 | if (screen_info.lfb_width == 0) | ||
| 205 | screen_info.lfb_width = info->width; | ||
| 206 | if (screen_info.lfb_height == 0) | ||
| 207 | screen_info.lfb_height = info->height; | ||
| 208 | if (screen_info.orig_video_isVGA == 0) | ||
| 209 | screen_info.orig_video_isVGA = VIDEO_TYPE_EFI; | ||
| 210 | } else { | ||
| 211 | screen_info.lfb_linelength = 0; | ||
| 212 | screen_info.lfb_width = 0; | ||
| 213 | screen_info.lfb_height = 0; | ||
| 214 | screen_info.orig_video_isVGA = 0; | ||
| 215 | return 0; | ||
| 216 | } | ||
| 217 | return 1; | ||
| 139 | } | 218 | } |
| 140 | 219 | ||
| 141 | static int efifb_setcolreg(unsigned regno, unsigned red, unsigned green, | 220 | static int efifb_setcolreg(unsigned regno, unsigned red, unsigned green, |
diff --git a/drivers/video/sis/sis_main.c b/drivers/video/sis/sis_main.c index 559bf1727a2b..b52f8e4ef1fd 100644 --- a/drivers/video/sis/sis_main.c +++ b/drivers/video/sis/sis_main.c | |||
| @@ -1701,6 +1701,9 @@ static int sisfb_ioctl(struct fb_info *info, unsigned int cmd, | |||
| 1701 | break; | 1701 | break; |
| 1702 | 1702 | ||
| 1703 | case FBIOGET_VBLANK: | 1703 | case FBIOGET_VBLANK: |
| 1704 | |||
| 1705 | memset(&sisvbblank, 0, sizeof(struct fb_vblank)); | ||
| 1706 | |||
| 1704 | sisvbblank.count = 0; | 1707 | sisvbblank.count = 0; |
| 1705 | sisvbblank.flags = sisfb_setupvbblankflags(ivideo, &sisvbblank.vcount, &sisvbblank.hcount); | 1708 | sisvbblank.flags = sisfb_setupvbblankflags(ivideo, &sisvbblank.vcount, &sisvbblank.hcount); |
| 1706 | 1709 | ||
| @@ -712,8 +712,16 @@ static ssize_t aio_run_iocb(struct kiocb *iocb) | |||
| 712 | */ | 712 | */ |
| 713 | ret = retry(iocb); | 713 | ret = retry(iocb); |
| 714 | 714 | ||
| 715 | if (ret != -EIOCBRETRY && ret != -EIOCBQUEUED) | 715 | if (ret != -EIOCBRETRY && ret != -EIOCBQUEUED) { |
| 716 | /* | ||
| 717 | * There's no easy way to restart the syscall since other AIO's | ||
| 718 | * may be already running. Just fail this IO with EINTR. | ||
| 719 | */ | ||
| 720 | if (unlikely(ret == -ERESTARTSYS || ret == -ERESTARTNOINTR || | ||
| 721 | ret == -ERESTARTNOHAND || ret == -ERESTART_RESTARTBLOCK)) | ||
| 722 | ret = -EINTR; | ||
| 716 | aio_complete(iocb, ret, 0); | 723 | aio_complete(iocb, ret, 0); |
| 724 | } | ||
| 717 | out: | 725 | out: |
| 718 | spin_lock_irq(&ctx->ctx_lock); | 726 | spin_lock_irq(&ctx->ctx_lock); |
| 719 | 727 | ||
diff --git a/fs/ceph/Kconfig b/fs/ceph/Kconfig index bc87b9c1d27e..0fcd2640c23f 100644 --- a/fs/ceph/Kconfig +++ b/fs/ceph/Kconfig | |||
| @@ -3,6 +3,7 @@ config CEPH_FS | |||
| 3 | depends on INET && EXPERIMENTAL | 3 | depends on INET && EXPERIMENTAL |
| 4 | select LIBCRC32C | 4 | select LIBCRC32C |
| 5 | select CRYPTO_AES | 5 | select CRYPTO_AES |
| 6 | select CRYPTO | ||
| 6 | help | 7 | help |
| 7 | Choose Y or M here to include support for mounting the | 8 | Choose Y or M here to include support for mounting the |
| 8 | experimental Ceph distributed file system. Ceph is an extremely | 9 | experimental Ceph distributed file system. Ceph is an extremely |
diff --git a/fs/ceph/addr.c b/fs/ceph/addr.c index 4cfce1ee31fa..efbc604001c8 100644 --- a/fs/ceph/addr.c +++ b/fs/ceph/addr.c | |||
| @@ -411,8 +411,8 @@ static int writepage_nounlock(struct page *page, struct writeback_control *wbc) | |||
| 411 | if (i_size < page_off + len) | 411 | if (i_size < page_off + len) |
| 412 | len = i_size - page_off; | 412 | len = i_size - page_off; |
| 413 | 413 | ||
| 414 | dout("writepage %p page %p index %lu on %llu~%u\n", | 414 | dout("writepage %p page %p index %lu on %llu~%u snapc %p\n", |
| 415 | inode, page, page->index, page_off, len); | 415 | inode, page, page->index, page_off, len, snapc); |
| 416 | 416 | ||
| 417 | writeback_stat = atomic_long_inc_return(&client->writeback_count); | 417 | writeback_stat = atomic_long_inc_return(&client->writeback_count); |
| 418 | if (writeback_stat > | 418 | if (writeback_stat > |
| @@ -766,7 +766,8 @@ get_more_pages: | |||
| 766 | /* ok */ | 766 | /* ok */ |
| 767 | if (locked_pages == 0) { | 767 | if (locked_pages == 0) { |
| 768 | /* prepare async write request */ | 768 | /* prepare async write request */ |
| 769 | offset = page->index << PAGE_CACHE_SHIFT; | 769 | offset = (unsigned long long)page->index |
| 770 | << PAGE_CACHE_SHIFT; | ||
| 770 | len = wsize; | 771 | len = wsize; |
| 771 | req = ceph_osdc_new_request(&client->osdc, | 772 | req = ceph_osdc_new_request(&client->osdc, |
| 772 | &ci->i_layout, | 773 | &ci->i_layout, |
diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c index a2069b6680ae..73c153092f72 100644 --- a/fs/ceph/caps.c +++ b/fs/ceph/caps.c | |||
| @@ -814,7 +814,7 @@ int __ceph_caps_used(struct ceph_inode_info *ci) | |||
| 814 | used |= CEPH_CAP_PIN; | 814 | used |= CEPH_CAP_PIN; |
| 815 | if (ci->i_rd_ref) | 815 | if (ci->i_rd_ref) |
| 816 | used |= CEPH_CAP_FILE_RD; | 816 | used |= CEPH_CAP_FILE_RD; |
| 817 | if (ci->i_rdcache_ref || ci->i_rdcache_gen) | 817 | if (ci->i_rdcache_ref || ci->vfs_inode.i_data.nrpages) |
| 818 | used |= CEPH_CAP_FILE_CACHE; | 818 | used |= CEPH_CAP_FILE_CACHE; |
| 819 | if (ci->i_wr_ref) | 819 | if (ci->i_wr_ref) |
| 820 | used |= CEPH_CAP_FILE_WR; | 820 | used |= CEPH_CAP_FILE_WR; |
| @@ -1195,10 +1195,14 @@ static int __send_cap(struct ceph_mds_client *mdsc, struct ceph_cap *cap, | |||
| 1195 | * asynchronously back to the MDS once sync writes complete and dirty | 1195 | * asynchronously back to the MDS once sync writes complete and dirty |
| 1196 | * data is written out. | 1196 | * data is written out. |
| 1197 | * | 1197 | * |
| 1198 | * Unless @again is true, skip cap_snaps that were already sent to | ||
| 1199 | * the MDS (i.e., during this session). | ||
| 1200 | * | ||
| 1198 | * Called under i_lock. Takes s_mutex as needed. | 1201 | * Called under i_lock. Takes s_mutex as needed. |
| 1199 | */ | 1202 | */ |
| 1200 | void __ceph_flush_snaps(struct ceph_inode_info *ci, | 1203 | void __ceph_flush_snaps(struct ceph_inode_info *ci, |
| 1201 | struct ceph_mds_session **psession) | 1204 | struct ceph_mds_session **psession, |
| 1205 | int again) | ||
| 1202 | __releases(ci->vfs_inode->i_lock) | 1206 | __releases(ci->vfs_inode->i_lock) |
| 1203 | __acquires(ci->vfs_inode->i_lock) | 1207 | __acquires(ci->vfs_inode->i_lock) |
| 1204 | { | 1208 | { |
| @@ -1227,7 +1231,7 @@ retry: | |||
| 1227 | * pages to be written out. | 1231 | * pages to be written out. |
| 1228 | */ | 1232 | */ |
| 1229 | if (capsnap->dirty_pages || capsnap->writing) | 1233 | if (capsnap->dirty_pages || capsnap->writing) |
| 1230 | continue; | 1234 | break; |
| 1231 | 1235 | ||
| 1232 | /* | 1236 | /* |
| 1233 | * if cap writeback already occurred, we should have dropped | 1237 | * if cap writeback already occurred, we should have dropped |
| @@ -1240,6 +1244,13 @@ retry: | |||
| 1240 | dout("no auth cap (migrating?), doing nothing\n"); | 1244 | dout("no auth cap (migrating?), doing nothing\n"); |
| 1241 | goto out; | 1245 | goto out; |
| 1242 | } | 1246 | } |
| 1247 | |||
| 1248 | /* only flush each capsnap once */ | ||
| 1249 | if (!again && !list_empty(&capsnap->flushing_item)) { | ||
| 1250 | dout("already flushed %p, skipping\n", capsnap); | ||
| 1251 | continue; | ||
| 1252 | } | ||
| 1253 | |||
| 1243 | mds = ci->i_auth_cap->session->s_mds; | 1254 | mds = ci->i_auth_cap->session->s_mds; |
| 1244 | mseq = ci->i_auth_cap->mseq; | 1255 | mseq = ci->i_auth_cap->mseq; |
| 1245 | 1256 | ||
| @@ -1276,8 +1287,8 @@ retry: | |||
| 1276 | &session->s_cap_snaps_flushing); | 1287 | &session->s_cap_snaps_flushing); |
| 1277 | spin_unlock(&inode->i_lock); | 1288 | spin_unlock(&inode->i_lock); |
| 1278 | 1289 | ||
| 1279 | dout("flush_snaps %p cap_snap %p follows %lld size %llu\n", | 1290 | dout("flush_snaps %p cap_snap %p follows %lld tid %llu\n", |
| 1280 | inode, capsnap, next_follows, capsnap->size); | 1291 | inode, capsnap, capsnap->follows, capsnap->flush_tid); |
| 1281 | send_cap_msg(session, ceph_vino(inode).ino, 0, | 1292 | send_cap_msg(session, ceph_vino(inode).ino, 0, |
| 1282 | CEPH_CAP_OP_FLUSHSNAP, capsnap->issued, 0, | 1293 | CEPH_CAP_OP_FLUSHSNAP, capsnap->issued, 0, |
| 1283 | capsnap->dirty, 0, capsnap->flush_tid, 0, mseq, | 1294 | capsnap->dirty, 0, capsnap->flush_tid, 0, mseq, |
| @@ -1314,7 +1325,7 @@ static void ceph_flush_snaps(struct ceph_inode_info *ci) | |||
| 1314 | struct inode *inode = &ci->vfs_inode; | 1325 | struct inode *inode = &ci->vfs_inode; |
| 1315 | 1326 | ||
| 1316 | spin_lock(&inode->i_lock); | 1327 | spin_lock(&inode->i_lock); |
| 1317 | __ceph_flush_snaps(ci, NULL); | 1328 | __ceph_flush_snaps(ci, NULL, 0); |
| 1318 | spin_unlock(&inode->i_lock); | 1329 | spin_unlock(&inode->i_lock); |
| 1319 | } | 1330 | } |
| 1320 | 1331 | ||
| @@ -1477,7 +1488,7 @@ void ceph_check_caps(struct ceph_inode_info *ci, int flags, | |||
| 1477 | 1488 | ||
| 1478 | /* flush snaps first time around only */ | 1489 | /* flush snaps first time around only */ |
| 1479 | if (!list_empty(&ci->i_cap_snaps)) | 1490 | if (!list_empty(&ci->i_cap_snaps)) |
| 1480 | __ceph_flush_snaps(ci, &session); | 1491 | __ceph_flush_snaps(ci, &session, 0); |
| 1481 | goto retry_locked; | 1492 | goto retry_locked; |
| 1482 | retry: | 1493 | retry: |
| 1483 | spin_lock(&inode->i_lock); | 1494 | spin_lock(&inode->i_lock); |
| @@ -1894,7 +1905,7 @@ static void kick_flushing_capsnaps(struct ceph_mds_client *mdsc, | |||
| 1894 | if (cap && cap->session == session) { | 1905 | if (cap && cap->session == session) { |
| 1895 | dout("kick_flushing_caps %p cap %p capsnap %p\n", inode, | 1906 | dout("kick_flushing_caps %p cap %p capsnap %p\n", inode, |
| 1896 | cap, capsnap); | 1907 | cap, capsnap); |
| 1897 | __ceph_flush_snaps(ci, &session); | 1908 | __ceph_flush_snaps(ci, &session, 1); |
| 1898 | } else { | 1909 | } else { |
| 1899 | pr_err("%p auth cap %p not mds%d ???\n", inode, | 1910 | pr_err("%p auth cap %p not mds%d ???\n", inode, |
| 1900 | cap, session->s_mds); | 1911 | cap, session->s_mds); |
diff --git a/fs/ceph/dir.c b/fs/ceph/dir.c index 6e4f43ff23ec..a1986eb52045 100644 --- a/fs/ceph/dir.c +++ b/fs/ceph/dir.c | |||
| @@ -1021,11 +1021,15 @@ out_touch: | |||
| 1021 | static void ceph_dentry_release(struct dentry *dentry) | 1021 | static void ceph_dentry_release(struct dentry *dentry) |
| 1022 | { | 1022 | { |
| 1023 | struct ceph_dentry_info *di = ceph_dentry(dentry); | 1023 | struct ceph_dentry_info *di = ceph_dentry(dentry); |
| 1024 | struct inode *parent_inode = dentry->d_parent->d_inode; | 1024 | struct inode *parent_inode = NULL; |
| 1025 | u64 snapid = ceph_snap(parent_inode); | 1025 | u64 snapid = CEPH_NOSNAP; |
| 1026 | 1026 | ||
| 1027 | if (!IS_ROOT(dentry)) { | ||
| 1028 | parent_inode = dentry->d_parent->d_inode; | ||
| 1029 | if (parent_inode) | ||
| 1030 | snapid = ceph_snap(parent_inode); | ||
| 1031 | } | ||
| 1027 | dout("dentry_release %p parent %p\n", dentry, parent_inode); | 1032 | dout("dentry_release %p parent %p\n", dentry, parent_inode); |
| 1028 | |||
| 1029 | if (parent_inode && snapid != CEPH_SNAPDIR) { | 1033 | if (parent_inode && snapid != CEPH_SNAPDIR) { |
| 1030 | struct ceph_inode_info *ci = ceph_inode(parent_inode); | 1034 | struct ceph_inode_info *ci = ceph_inode(parent_inode); |
| 1031 | 1035 | ||
diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c index e7cca414da03..62377ec37edf 100644 --- a/fs/ceph/inode.c +++ b/fs/ceph/inode.c | |||
| @@ -845,7 +845,7 @@ static void ceph_set_dentry_offset(struct dentry *dn) | |||
| 845 | * the caller) if we fail. | 845 | * the caller) if we fail. |
| 846 | */ | 846 | */ |
| 847 | static struct dentry *splice_dentry(struct dentry *dn, struct inode *in, | 847 | static struct dentry *splice_dentry(struct dentry *dn, struct inode *in, |
| 848 | bool *prehash) | 848 | bool *prehash, bool set_offset) |
| 849 | { | 849 | { |
| 850 | struct dentry *realdn; | 850 | struct dentry *realdn; |
| 851 | 851 | ||
| @@ -877,7 +877,8 @@ static struct dentry *splice_dentry(struct dentry *dn, struct inode *in, | |||
| 877 | } | 877 | } |
| 878 | if ((!prehash || *prehash) && d_unhashed(dn)) | 878 | if ((!prehash || *prehash) && d_unhashed(dn)) |
| 879 | d_rehash(dn); | 879 | d_rehash(dn); |
| 880 | ceph_set_dentry_offset(dn); | 880 | if (set_offset) |
| 881 | ceph_set_dentry_offset(dn); | ||
| 881 | out: | 882 | out: |
| 882 | return dn; | 883 | return dn; |
| 883 | } | 884 | } |
| @@ -1062,7 +1063,7 @@ int ceph_fill_trace(struct super_block *sb, struct ceph_mds_request *req, | |||
| 1062 | d_delete(dn); | 1063 | d_delete(dn); |
| 1063 | goto done; | 1064 | goto done; |
| 1064 | } | 1065 | } |
| 1065 | dn = splice_dentry(dn, in, &have_lease); | 1066 | dn = splice_dentry(dn, in, &have_lease, true); |
| 1066 | if (IS_ERR(dn)) { | 1067 | if (IS_ERR(dn)) { |
| 1067 | err = PTR_ERR(dn); | 1068 | err = PTR_ERR(dn); |
| 1068 | goto done; | 1069 | goto done; |
| @@ -1105,7 +1106,7 @@ int ceph_fill_trace(struct super_block *sb, struct ceph_mds_request *req, | |||
| 1105 | goto done; | 1106 | goto done; |
| 1106 | } | 1107 | } |
| 1107 | dout(" linking snapped dir %p to dn %p\n", in, dn); | 1108 | dout(" linking snapped dir %p to dn %p\n", in, dn); |
| 1108 | dn = splice_dentry(dn, in, NULL); | 1109 | dn = splice_dentry(dn, in, NULL, true); |
| 1109 | if (IS_ERR(dn)) { | 1110 | if (IS_ERR(dn)) { |
| 1110 | err = PTR_ERR(dn); | 1111 | err = PTR_ERR(dn); |
| 1111 | goto done; | 1112 | goto done; |
| @@ -1237,7 +1238,7 @@ retry_lookup: | |||
| 1237 | err = PTR_ERR(in); | 1238 | err = PTR_ERR(in); |
| 1238 | goto out; | 1239 | goto out; |
| 1239 | } | 1240 | } |
| 1240 | dn = splice_dentry(dn, in, NULL); | 1241 | dn = splice_dentry(dn, in, NULL, false); |
| 1241 | if (IS_ERR(dn)) | 1242 | if (IS_ERR(dn)) |
| 1242 | dn = NULL; | 1243 | dn = NULL; |
| 1243 | } | 1244 | } |
diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c index f091b1351786..fad95f8f2608 100644 --- a/fs/ceph/mds_client.c +++ b/fs/ceph/mds_client.c | |||
| @@ -2374,6 +2374,8 @@ static int encode_caps_cb(struct inode *inode, struct ceph_cap *cap, | |||
| 2374 | num_fcntl_locks, | 2374 | num_fcntl_locks, |
| 2375 | num_flock_locks); | 2375 | num_flock_locks); |
| 2376 | unlock_kernel(); | 2376 | unlock_kernel(); |
| 2377 | } else { | ||
| 2378 | err = ceph_pagelist_append(pagelist, &rec, reclen); | ||
| 2377 | } | 2379 | } |
| 2378 | 2380 | ||
| 2379 | out_free: | 2381 | out_free: |
diff --git a/fs/ceph/pagelist.c b/fs/ceph/pagelist.c index b6859f47d364..46a368b6dce5 100644 --- a/fs/ceph/pagelist.c +++ b/fs/ceph/pagelist.c | |||
| @@ -5,10 +5,18 @@ | |||
| 5 | 5 | ||
| 6 | #include "pagelist.h" | 6 | #include "pagelist.h" |
| 7 | 7 | ||
| 8 | static void ceph_pagelist_unmap_tail(struct ceph_pagelist *pl) | ||
| 9 | { | ||
| 10 | struct page *page = list_entry(pl->head.prev, struct page, | ||
| 11 | lru); | ||
| 12 | kunmap(page); | ||
| 13 | } | ||
| 14 | |||
| 8 | int ceph_pagelist_release(struct ceph_pagelist *pl) | 15 | int ceph_pagelist_release(struct ceph_pagelist *pl) |
| 9 | { | 16 | { |
| 10 | if (pl->mapped_tail) | 17 | if (pl->mapped_tail) |
| 11 | kunmap(pl->mapped_tail); | 18 | ceph_pagelist_unmap_tail(pl); |
| 19 | |||
| 12 | while (!list_empty(&pl->head)) { | 20 | while (!list_empty(&pl->head)) { |
| 13 | struct page *page = list_first_entry(&pl->head, struct page, | 21 | struct page *page = list_first_entry(&pl->head, struct page, |
| 14 | lru); | 22 | lru); |
| @@ -26,7 +34,7 @@ static int ceph_pagelist_addpage(struct ceph_pagelist *pl) | |||
| 26 | pl->room += PAGE_SIZE; | 34 | pl->room += PAGE_SIZE; |
| 27 | list_add_tail(&page->lru, &pl->head); | 35 | list_add_tail(&page->lru, &pl->head); |
| 28 | if (pl->mapped_tail) | 36 | if (pl->mapped_tail) |
| 29 | kunmap(pl->mapped_tail); | 37 | ceph_pagelist_unmap_tail(pl); |
| 30 | pl->mapped_tail = kmap(page); | 38 | pl->mapped_tail = kmap(page); |
| 31 | return 0; | 39 | return 0; |
| 32 | } | 40 | } |
diff --git a/fs/ceph/snap.c b/fs/ceph/snap.c index 4868b9dcac5a..190b6c4a6f2b 100644 --- a/fs/ceph/snap.c +++ b/fs/ceph/snap.c | |||
| @@ -119,6 +119,7 @@ static struct ceph_snap_realm *ceph_create_snap_realm( | |||
| 119 | INIT_LIST_HEAD(&realm->children); | 119 | INIT_LIST_HEAD(&realm->children); |
| 120 | INIT_LIST_HEAD(&realm->child_item); | 120 | INIT_LIST_HEAD(&realm->child_item); |
| 121 | INIT_LIST_HEAD(&realm->empty_item); | 121 | INIT_LIST_HEAD(&realm->empty_item); |
| 122 | INIT_LIST_HEAD(&realm->dirty_item); | ||
| 122 | INIT_LIST_HEAD(&realm->inodes_with_caps); | 123 | INIT_LIST_HEAD(&realm->inodes_with_caps); |
| 123 | spin_lock_init(&realm->inodes_with_caps_lock); | 124 | spin_lock_init(&realm->inodes_with_caps_lock); |
| 124 | __insert_snap_realm(&mdsc->snap_realms, realm); | 125 | __insert_snap_realm(&mdsc->snap_realms, realm); |
| @@ -467,7 +468,7 @@ void ceph_queue_cap_snap(struct ceph_inode_info *ci) | |||
| 467 | INIT_LIST_HEAD(&capsnap->ci_item); | 468 | INIT_LIST_HEAD(&capsnap->ci_item); |
| 468 | INIT_LIST_HEAD(&capsnap->flushing_item); | 469 | INIT_LIST_HEAD(&capsnap->flushing_item); |
| 469 | 470 | ||
| 470 | capsnap->follows = snapc->seq - 1; | 471 | capsnap->follows = snapc->seq; |
| 471 | capsnap->issued = __ceph_caps_issued(ci, NULL); | 472 | capsnap->issued = __ceph_caps_issued(ci, NULL); |
| 472 | capsnap->dirty = dirty; | 473 | capsnap->dirty = dirty; |
| 473 | 474 | ||
| @@ -604,6 +605,7 @@ int ceph_update_snap_trace(struct ceph_mds_client *mdsc, | |||
| 604 | struct ceph_snap_realm *realm; | 605 | struct ceph_snap_realm *realm; |
| 605 | int invalidate = 0; | 606 | int invalidate = 0; |
| 606 | int err = -ENOMEM; | 607 | int err = -ENOMEM; |
| 608 | LIST_HEAD(dirty_realms); | ||
| 607 | 609 | ||
| 608 | dout("update_snap_trace deletion=%d\n", deletion); | 610 | dout("update_snap_trace deletion=%d\n", deletion); |
| 609 | more: | 611 | more: |
| @@ -626,24 +628,6 @@ more: | |||
| 626 | } | 628 | } |
| 627 | } | 629 | } |
| 628 | 630 | ||
| 629 | if (le64_to_cpu(ri->seq) > realm->seq) { | ||
| 630 | dout("update_snap_trace updating %llx %p %lld -> %lld\n", | ||
| 631 | realm->ino, realm, realm->seq, le64_to_cpu(ri->seq)); | ||
| 632 | /* | ||
| 633 | * if the realm seq has changed, queue a cap_snap for every | ||
| 634 | * inode with open caps. we do this _before_ we update | ||
| 635 | * the realm info so that we prepare for writeback under the | ||
| 636 | * _previous_ snap context. | ||
| 637 | * | ||
| 638 | * ...unless it's a snap deletion! | ||
| 639 | */ | ||
| 640 | if (!deletion) | ||
| 641 | queue_realm_cap_snaps(realm); | ||
| 642 | } else { | ||
| 643 | dout("update_snap_trace %llx %p seq %lld unchanged\n", | ||
| 644 | realm->ino, realm, realm->seq); | ||
| 645 | } | ||
| 646 | |||
| 647 | /* ensure the parent is correct */ | 631 | /* ensure the parent is correct */ |
| 648 | err = adjust_snap_realm_parent(mdsc, realm, le64_to_cpu(ri->parent)); | 632 | err = adjust_snap_realm_parent(mdsc, realm, le64_to_cpu(ri->parent)); |
| 649 | if (err < 0) | 633 | if (err < 0) |
| @@ -651,6 +635,8 @@ more: | |||
| 651 | invalidate += err; | 635 | invalidate += err; |
| 652 | 636 | ||
| 653 | if (le64_to_cpu(ri->seq) > realm->seq) { | 637 | if (le64_to_cpu(ri->seq) > realm->seq) { |
| 638 | dout("update_snap_trace updating %llx %p %lld -> %lld\n", | ||
| 639 | realm->ino, realm, realm->seq, le64_to_cpu(ri->seq)); | ||
| 654 | /* update realm parameters, snap lists */ | 640 | /* update realm parameters, snap lists */ |
| 655 | realm->seq = le64_to_cpu(ri->seq); | 641 | realm->seq = le64_to_cpu(ri->seq); |
| 656 | realm->created = le64_to_cpu(ri->created); | 642 | realm->created = le64_to_cpu(ri->created); |
| @@ -668,9 +654,17 @@ more: | |||
| 668 | if (err < 0) | 654 | if (err < 0) |
| 669 | goto fail; | 655 | goto fail; |
| 670 | 656 | ||
| 657 | /* queue realm for cap_snap creation */ | ||
| 658 | list_add(&realm->dirty_item, &dirty_realms); | ||
| 659 | |||
| 671 | invalidate = 1; | 660 | invalidate = 1; |
| 672 | } else if (!realm->cached_context) { | 661 | } else if (!realm->cached_context) { |
| 662 | dout("update_snap_trace %llx %p seq %lld new\n", | ||
| 663 | realm->ino, realm, realm->seq); | ||
| 673 | invalidate = 1; | 664 | invalidate = 1; |
| 665 | } else { | ||
| 666 | dout("update_snap_trace %llx %p seq %lld unchanged\n", | ||
| 667 | realm->ino, realm, realm->seq); | ||
| 674 | } | 668 | } |
| 675 | 669 | ||
| 676 | dout("done with %llx %p, invalidated=%d, %p %p\n", realm->ino, | 670 | dout("done with %llx %p, invalidated=%d, %p %p\n", realm->ino, |
| @@ -683,6 +677,14 @@ more: | |||
| 683 | if (invalidate) | 677 | if (invalidate) |
| 684 | rebuild_snap_realms(realm); | 678 | rebuild_snap_realms(realm); |
| 685 | 679 | ||
| 680 | /* | ||
| 681 | * queue cap snaps _after_ we've built the new snap contexts, | ||
| 682 | * so that i_head_snapc can be set appropriately. | ||
| 683 | */ | ||
| 684 | list_for_each_entry(realm, &dirty_realms, dirty_item) { | ||
| 685 | queue_realm_cap_snaps(realm); | ||
| 686 | } | ||
| 687 | |||
| 686 | __cleanup_empty_realms(mdsc); | 688 | __cleanup_empty_realms(mdsc); |
| 687 | return 0; | 689 | return 0; |
| 688 | 690 | ||
| @@ -715,7 +717,7 @@ static void flush_snaps(struct ceph_mds_client *mdsc) | |||
| 715 | igrab(inode); | 717 | igrab(inode); |
| 716 | spin_unlock(&mdsc->snap_flush_lock); | 718 | spin_unlock(&mdsc->snap_flush_lock); |
| 717 | spin_lock(&inode->i_lock); | 719 | spin_lock(&inode->i_lock); |
| 718 | __ceph_flush_snaps(ci, &session); | 720 | __ceph_flush_snaps(ci, &session, 0); |
| 719 | spin_unlock(&inode->i_lock); | 721 | spin_unlock(&inode->i_lock); |
| 720 | iput(inode); | 722 | iput(inode); |
| 721 | spin_lock(&mdsc->snap_flush_lock); | 723 | spin_lock(&mdsc->snap_flush_lock); |
| @@ -816,6 +818,7 @@ void ceph_handle_snap(struct ceph_mds_client *mdsc, | |||
| 816 | }; | 818 | }; |
| 817 | struct inode *inode = ceph_find_inode(sb, vino); | 819 | struct inode *inode = ceph_find_inode(sb, vino); |
| 818 | struct ceph_inode_info *ci; | 820 | struct ceph_inode_info *ci; |
| 821 | struct ceph_snap_realm *oldrealm; | ||
| 819 | 822 | ||
| 820 | if (!inode) | 823 | if (!inode) |
| 821 | continue; | 824 | continue; |
| @@ -841,18 +844,19 @@ void ceph_handle_snap(struct ceph_mds_client *mdsc, | |||
| 841 | dout(" will move %p to split realm %llx %p\n", | 844 | dout(" will move %p to split realm %llx %p\n", |
| 842 | inode, realm->ino, realm); | 845 | inode, realm->ino, realm); |
| 843 | /* | 846 | /* |
| 844 | * Remove the inode from the realm's inode | 847 | * Move the inode to the new realm |
| 845 | * list, but don't add it to the new realm | ||
| 846 | * yet. We don't want the cap_snap to be | ||
| 847 | * queued (again) by ceph_update_snap_trace() | ||
| 848 | * below. Queue it _now_, under the old context. | ||
| 849 | */ | 848 | */ |
| 850 | spin_lock(&realm->inodes_with_caps_lock); | 849 | spin_lock(&realm->inodes_with_caps_lock); |
| 851 | list_del_init(&ci->i_snap_realm_item); | 850 | list_del_init(&ci->i_snap_realm_item); |
| 851 | list_add(&ci->i_snap_realm_item, | ||
| 852 | &realm->inodes_with_caps); | ||
| 853 | oldrealm = ci->i_snap_realm; | ||
| 854 | ci->i_snap_realm = realm; | ||
| 852 | spin_unlock(&realm->inodes_with_caps_lock); | 855 | spin_unlock(&realm->inodes_with_caps_lock); |
| 853 | spin_unlock(&inode->i_lock); | 856 | spin_unlock(&inode->i_lock); |
| 854 | 857 | ||
| 855 | ceph_queue_cap_snap(ci); | 858 | ceph_get_snap_realm(mdsc, realm); |
| 859 | ceph_put_snap_realm(mdsc, oldrealm); | ||
| 856 | 860 | ||
| 857 | iput(inode); | 861 | iput(inode); |
| 858 | continue; | 862 | continue; |
| @@ -880,43 +884,9 @@ skip_inode: | |||
| 880 | ceph_update_snap_trace(mdsc, p, e, | 884 | ceph_update_snap_trace(mdsc, p, e, |
| 881 | op == CEPH_SNAP_OP_DESTROY); | 885 | op == CEPH_SNAP_OP_DESTROY); |
| 882 | 886 | ||
| 883 | if (op == CEPH_SNAP_OP_SPLIT) { | 887 | if (op == CEPH_SNAP_OP_SPLIT) |
| 884 | /* | ||
| 885 | * ok, _now_ add the inodes into the new realm. | ||
| 886 | */ | ||
| 887 | for (i = 0; i < num_split_inos; i++) { | ||
| 888 | struct ceph_vino vino = { | ||
| 889 | .ino = le64_to_cpu(split_inos[i]), | ||
| 890 | .snap = CEPH_NOSNAP, | ||
| 891 | }; | ||
| 892 | struct inode *inode = ceph_find_inode(sb, vino); | ||
| 893 | struct ceph_inode_info *ci; | ||
| 894 | |||
| 895 | if (!inode) | ||
| 896 | continue; | ||
| 897 | ci = ceph_inode(inode); | ||
| 898 | spin_lock(&inode->i_lock); | ||
| 899 | if (list_empty(&ci->i_snap_realm_item)) { | ||
| 900 | struct ceph_snap_realm *oldrealm = | ||
| 901 | ci->i_snap_realm; | ||
| 902 | |||
| 903 | dout(" moving %p to split realm %llx %p\n", | ||
| 904 | inode, realm->ino, realm); | ||
| 905 | spin_lock(&realm->inodes_with_caps_lock); | ||
| 906 | list_add(&ci->i_snap_realm_item, | ||
| 907 | &realm->inodes_with_caps); | ||
| 908 | ci->i_snap_realm = realm; | ||
| 909 | spin_unlock(&realm->inodes_with_caps_lock); | ||
| 910 | ceph_get_snap_realm(mdsc, realm); | ||
| 911 | ceph_put_snap_realm(mdsc, oldrealm); | ||
| 912 | } | ||
| 913 | spin_unlock(&inode->i_lock); | ||
| 914 | iput(inode); | ||
| 915 | } | ||
| 916 | |||
| 917 | /* we took a reference when we created the realm, above */ | 888 | /* we took a reference when we created the realm, above */ |
| 918 | ceph_put_snap_realm(mdsc, realm); | 889 | ceph_put_snap_realm(mdsc, realm); |
| 919 | } | ||
| 920 | 890 | ||
| 921 | __cleanup_empty_realms(mdsc); | 891 | __cleanup_empty_realms(mdsc); |
| 922 | 892 | ||
diff --git a/fs/ceph/super.h b/fs/ceph/super.h index c33897ae5725..b87638e84c4b 100644 --- a/fs/ceph/super.h +++ b/fs/ceph/super.h | |||
| @@ -690,6 +690,8 @@ struct ceph_snap_realm { | |||
| 690 | 690 | ||
| 691 | struct list_head empty_item; /* if i have ref==0 */ | 691 | struct list_head empty_item; /* if i have ref==0 */ |
| 692 | 692 | ||
| 693 | struct list_head dirty_item; /* if realm needs new context */ | ||
| 694 | |||
| 693 | /* the current set of snaps for this realm */ | 695 | /* the current set of snaps for this realm */ |
| 694 | struct ceph_snap_context *cached_context; | 696 | struct ceph_snap_context *cached_context; |
| 695 | 697 | ||
| @@ -826,7 +828,8 @@ extern void ceph_put_cap_refs(struct ceph_inode_info *ci, int had); | |||
| 826 | extern void ceph_put_wrbuffer_cap_refs(struct ceph_inode_info *ci, int nr, | 828 | extern void ceph_put_wrbuffer_cap_refs(struct ceph_inode_info *ci, int nr, |
| 827 | struct ceph_snap_context *snapc); | 829 | struct ceph_snap_context *snapc); |
| 828 | extern void __ceph_flush_snaps(struct ceph_inode_info *ci, | 830 | extern void __ceph_flush_snaps(struct ceph_inode_info *ci, |
| 829 | struct ceph_mds_session **psession); | 831 | struct ceph_mds_session **psession, |
| 832 | int again); | ||
| 830 | extern void ceph_check_caps(struct ceph_inode_info *ci, int flags, | 833 | extern void ceph_check_caps(struct ceph_inode_info *ci, int flags, |
| 831 | struct ceph_mds_session *session); | 834 | struct ceph_mds_session *session); |
| 832 | extern void ceph_check_delayed_caps(struct ceph_mds_client *mdsc); | 835 | extern void ceph_check_delayed_caps(struct ceph_mds_client *mdsc); |
diff --git a/fs/char_dev.c b/fs/char_dev.c index f80a4f25123c..143d393881cb 100644 --- a/fs/char_dev.c +++ b/fs/char_dev.c | |||
| @@ -40,7 +40,9 @@ struct backing_dev_info directly_mappable_cdev_bdi = { | |||
| 40 | #endif | 40 | #endif |
| 41 | /* permit direct mmap, for read, write or exec */ | 41 | /* permit direct mmap, for read, write or exec */ |
| 42 | BDI_CAP_MAP_DIRECT | | 42 | BDI_CAP_MAP_DIRECT | |
| 43 | BDI_CAP_READ_MAP | BDI_CAP_WRITE_MAP | BDI_CAP_EXEC_MAP), | 43 | BDI_CAP_READ_MAP | BDI_CAP_WRITE_MAP | BDI_CAP_EXEC_MAP | |
| 44 | /* no writeback happens */ | ||
| 45 | BDI_CAP_NO_ACCT_AND_WRITEBACK), | ||
| 44 | }; | 46 | }; |
| 45 | 47 | ||
| 46 | static struct kobj_map *cdev_map; | 48 | static struct kobj_map *cdev_map; |
diff --git a/fs/compat.c b/fs/compat.c index 718c7062aec1..0644a154672b 100644 --- a/fs/compat.c +++ b/fs/compat.c | |||
| @@ -1153,7 +1153,7 @@ static ssize_t compat_do_readv_writev(int type, struct file *file, | |||
| 1153 | { | 1153 | { |
| 1154 | compat_ssize_t tot_len; | 1154 | compat_ssize_t tot_len; |
| 1155 | struct iovec iovstack[UIO_FASTIOV]; | 1155 | struct iovec iovstack[UIO_FASTIOV]; |
| 1156 | struct iovec *iov; | 1156 | struct iovec *iov = iovstack; |
| 1157 | ssize_t ret; | 1157 | ssize_t ret; |
| 1158 | io_fn_t fn; | 1158 | io_fn_t fn; |
| 1159 | iov_fn_t fnv; | 1159 | iov_fn_t fnv; |
diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c index 81e086d8aa57..5581122bd2c0 100644 --- a/fs/fs-writeback.c +++ b/fs/fs-writeback.c | |||
| @@ -52,8 +52,6 @@ struct wb_writeback_work { | |||
| 52 | #define CREATE_TRACE_POINTS | 52 | #define CREATE_TRACE_POINTS |
| 53 | #include <trace/events/writeback.h> | 53 | #include <trace/events/writeback.h> |
| 54 | 54 | ||
| 55 | #define inode_to_bdi(inode) ((inode)->i_mapping->backing_dev_info) | ||
| 56 | |||
| 57 | /* | 55 | /* |
| 58 | * We don't actually have pdflush, but this one is exported though /proc... | 56 | * We don't actually have pdflush, but this one is exported though /proc... |
| 59 | */ | 57 | */ |
| @@ -71,6 +69,27 @@ int writeback_in_progress(struct backing_dev_info *bdi) | |||
| 71 | return test_bit(BDI_writeback_running, &bdi->state); | 69 | return test_bit(BDI_writeback_running, &bdi->state); |
| 72 | } | 70 | } |
| 73 | 71 | ||
| 72 | static inline struct backing_dev_info *inode_to_bdi(struct inode *inode) | ||
| 73 | { | ||
| 74 | struct super_block *sb = inode->i_sb; | ||
| 75 | struct backing_dev_info *bdi = inode->i_mapping->backing_dev_info; | ||
| 76 | |||
| 77 | /* | ||
| 78 | * For inodes on standard filesystems, we use superblock's bdi. For | ||
| 79 | * inodes on virtual filesystems, we want to use inode mapping's bdi | ||
| 80 | * because they can possibly point to something useful (think about | ||
| 81 | * block_dev filesystem). | ||
| 82 | */ | ||
| 83 | if (sb->s_bdi && sb->s_bdi != &noop_backing_dev_info) { | ||
| 84 | /* Some device inodes could play dirty tricks. Catch them... */ | ||
| 85 | WARN(bdi != sb->s_bdi && bdi_cap_writeback_dirty(bdi), | ||
| 86 | "Dirtiable inode bdi %s != sb bdi %s\n", | ||
| 87 | bdi->name, sb->s_bdi->name); | ||
| 88 | return sb->s_bdi; | ||
| 89 | } | ||
| 90 | return bdi; | ||
| 91 | } | ||
| 92 | |||
| 74 | static void bdi_queue_work(struct backing_dev_info *bdi, | 93 | static void bdi_queue_work(struct backing_dev_info *bdi, |
| 75 | struct wb_writeback_work *work) | 94 | struct wb_writeback_work *work) |
| 76 | { | 95 | { |
diff --git a/fs/ocfs2/acl.c b/fs/ocfs2/acl.c index a76e0aa5cd3f..391915093fe1 100644 --- a/fs/ocfs2/acl.c +++ b/fs/ocfs2/acl.c | |||
| @@ -209,7 +209,10 @@ static int ocfs2_acl_set_mode(struct inode *inode, struct buffer_head *di_bh, | |||
| 209 | } | 209 | } |
| 210 | 210 | ||
| 211 | inode->i_mode = new_mode; | 211 | inode->i_mode = new_mode; |
| 212 | inode->i_ctime = CURRENT_TIME; | ||
| 212 | di->i_mode = cpu_to_le16(inode->i_mode); | 213 | di->i_mode = cpu_to_le16(inode->i_mode); |
| 214 | di->i_ctime = cpu_to_le64(inode->i_ctime.tv_sec); | ||
| 215 | di->i_ctime_nsec = cpu_to_le32(inode->i_ctime.tv_nsec); | ||
| 213 | 216 | ||
| 214 | ocfs2_journal_dirty(handle, di_bh); | 217 | ocfs2_journal_dirty(handle, di_bh); |
| 215 | 218 | ||
diff --git a/fs/ocfs2/cluster/tcp.c b/fs/ocfs2/cluster/tcp.c index 1361997cf205..cbe2f057cc28 100644 --- a/fs/ocfs2/cluster/tcp.c +++ b/fs/ocfs2/cluster/tcp.c | |||
| @@ -977,7 +977,7 @@ static int o2net_tx_can_proceed(struct o2net_node *nn, | |||
| 977 | int o2net_send_message_vec(u32 msg_type, u32 key, struct kvec *caller_vec, | 977 | int o2net_send_message_vec(u32 msg_type, u32 key, struct kvec *caller_vec, |
| 978 | size_t caller_veclen, u8 target_node, int *status) | 978 | size_t caller_veclen, u8 target_node, int *status) |
| 979 | { | 979 | { |
| 980 | int ret; | 980 | int ret = 0; |
| 981 | struct o2net_msg *msg = NULL; | 981 | struct o2net_msg *msg = NULL; |
| 982 | size_t veclen, caller_bytes = 0; | 982 | size_t veclen, caller_bytes = 0; |
| 983 | struct kvec *vec = NULL; | 983 | struct kvec *vec = NULL; |
diff --git a/fs/ocfs2/dir.c b/fs/ocfs2/dir.c index f04ebcfffc4a..c49f6de0e7ab 100644 --- a/fs/ocfs2/dir.c +++ b/fs/ocfs2/dir.c | |||
| @@ -3931,6 +3931,15 @@ static int ocfs2_dx_dir_rebalance(struct ocfs2_super *osb, struct inode *dir, | |||
| 3931 | goto out_commit; | 3931 | goto out_commit; |
| 3932 | } | 3932 | } |
| 3933 | 3933 | ||
| 3934 | cpos = split_hash; | ||
| 3935 | ret = ocfs2_dx_dir_new_cluster(dir, &et, cpos, handle, | ||
| 3936 | data_ac, meta_ac, new_dx_leaves, | ||
| 3937 | num_dx_leaves); | ||
| 3938 | if (ret) { | ||
| 3939 | mlog_errno(ret); | ||
| 3940 | goto out_commit; | ||
| 3941 | } | ||
| 3942 | |||
| 3934 | for (i = 0; i < num_dx_leaves; i++) { | 3943 | for (i = 0; i < num_dx_leaves; i++) { |
| 3935 | ret = ocfs2_journal_access_dl(handle, INODE_CACHE(dir), | 3944 | ret = ocfs2_journal_access_dl(handle, INODE_CACHE(dir), |
| 3936 | orig_dx_leaves[i], | 3945 | orig_dx_leaves[i], |
| @@ -3939,15 +3948,14 @@ static int ocfs2_dx_dir_rebalance(struct ocfs2_super *osb, struct inode *dir, | |||
| 3939 | mlog_errno(ret); | 3948 | mlog_errno(ret); |
| 3940 | goto out_commit; | 3949 | goto out_commit; |
| 3941 | } | 3950 | } |
| 3942 | } | ||
| 3943 | 3951 | ||
| 3944 | cpos = split_hash; | 3952 | ret = ocfs2_journal_access_dl(handle, INODE_CACHE(dir), |
| 3945 | ret = ocfs2_dx_dir_new_cluster(dir, &et, cpos, handle, | 3953 | new_dx_leaves[i], |
| 3946 | data_ac, meta_ac, new_dx_leaves, | 3954 | OCFS2_JOURNAL_ACCESS_WRITE); |
| 3947 | num_dx_leaves); | 3955 | if (ret) { |
| 3948 | if (ret) { | 3956 | mlog_errno(ret); |
| 3949 | mlog_errno(ret); | 3957 | goto out_commit; |
| 3950 | goto out_commit; | 3958 | } |
| 3951 | } | 3959 | } |
| 3952 | 3960 | ||
| 3953 | ocfs2_dx_dir_transfer_leaf(dir, split_hash, handle, tmp_dx_leaf, | 3961 | ocfs2_dx_dir_transfer_leaf(dir, split_hash, handle, tmp_dx_leaf, |
diff --git a/fs/ocfs2/dlm/dlmcommon.h b/fs/ocfs2/dlm/dlmcommon.h index 4b6ae2c13b47..765298908f1d 100644 --- a/fs/ocfs2/dlm/dlmcommon.h +++ b/fs/ocfs2/dlm/dlmcommon.h | |||
| @@ -1030,6 +1030,7 @@ int dlm_drop_lockres_ref(struct dlm_ctxt *dlm, | |||
| 1030 | struct dlm_lock_resource *res); | 1030 | struct dlm_lock_resource *res); |
| 1031 | void dlm_clean_master_list(struct dlm_ctxt *dlm, | 1031 | void dlm_clean_master_list(struct dlm_ctxt *dlm, |
| 1032 | u8 dead_node); | 1032 | u8 dead_node); |
| 1033 | void dlm_force_free_mles(struct dlm_ctxt *dlm); | ||
| 1033 | int dlm_lock_basts_flushed(struct dlm_ctxt *dlm, struct dlm_lock *lock); | 1034 | int dlm_lock_basts_flushed(struct dlm_ctxt *dlm, struct dlm_lock *lock); |
| 1034 | int __dlm_lockres_has_locks(struct dlm_lock_resource *res); | 1035 | int __dlm_lockres_has_locks(struct dlm_lock_resource *res); |
| 1035 | int __dlm_lockres_unused(struct dlm_lock_resource *res); | 1036 | int __dlm_lockres_unused(struct dlm_lock_resource *res); |
diff --git a/fs/ocfs2/dlm/dlmdebug.c b/fs/ocfs2/dlm/dlmdebug.c index 5efdd37dfe48..901ca52bf86b 100644 --- a/fs/ocfs2/dlm/dlmdebug.c +++ b/fs/ocfs2/dlm/dlmdebug.c | |||
| @@ -636,8 +636,14 @@ static void *lockres_seq_start(struct seq_file *m, loff_t *pos) | |||
| 636 | spin_lock(&dlm->track_lock); | 636 | spin_lock(&dlm->track_lock); |
| 637 | if (oldres) | 637 | if (oldres) |
| 638 | track_list = &oldres->tracking; | 638 | track_list = &oldres->tracking; |
| 639 | else | 639 | else { |
| 640 | track_list = &dlm->tracking_list; | 640 | track_list = &dlm->tracking_list; |
| 641 | if (list_empty(track_list)) { | ||
| 642 | dl = NULL; | ||
| 643 | spin_unlock(&dlm->track_lock); | ||
| 644 | goto bail; | ||
| 645 | } | ||
| 646 | } | ||
| 641 | 647 | ||
| 642 | list_for_each_entry(res, track_list, tracking) { | 648 | list_for_each_entry(res, track_list, tracking) { |
| 643 | if (&res->tracking == &dlm->tracking_list) | 649 | if (&res->tracking == &dlm->tracking_list) |
| @@ -660,6 +666,7 @@ static void *lockres_seq_start(struct seq_file *m, loff_t *pos) | |||
| 660 | } else | 666 | } else |
| 661 | dl = NULL; | 667 | dl = NULL; |
| 662 | 668 | ||
| 669 | bail: | ||
| 663 | /* passed to seq_show */ | 670 | /* passed to seq_show */ |
| 664 | return dl; | 671 | return dl; |
| 665 | } | 672 | } |
diff --git a/fs/ocfs2/dlm/dlmdomain.c b/fs/ocfs2/dlm/dlmdomain.c index 153abb5abef0..11a5c87fd7f7 100644 --- a/fs/ocfs2/dlm/dlmdomain.c +++ b/fs/ocfs2/dlm/dlmdomain.c | |||
| @@ -693,6 +693,7 @@ void dlm_unregister_domain(struct dlm_ctxt *dlm) | |||
| 693 | 693 | ||
| 694 | dlm_mark_domain_leaving(dlm); | 694 | dlm_mark_domain_leaving(dlm); |
| 695 | dlm_leave_domain(dlm); | 695 | dlm_leave_domain(dlm); |
| 696 | dlm_force_free_mles(dlm); | ||
| 696 | dlm_complete_dlm_shutdown(dlm); | 697 | dlm_complete_dlm_shutdown(dlm); |
| 697 | } | 698 | } |
| 698 | dlm_put(dlm); | 699 | dlm_put(dlm); |
diff --git a/fs/ocfs2/dlm/dlmmaster.c b/fs/ocfs2/dlm/dlmmaster.c index ffb4c68dafa4..f564b0e5f80d 100644 --- a/fs/ocfs2/dlm/dlmmaster.c +++ b/fs/ocfs2/dlm/dlmmaster.c | |||
| @@ -3433,3 +3433,43 @@ void dlm_lockres_release_ast(struct dlm_ctxt *dlm, | |||
| 3433 | wake_up(&res->wq); | 3433 | wake_up(&res->wq); |
| 3434 | wake_up(&dlm->migration_wq); | 3434 | wake_up(&dlm->migration_wq); |
| 3435 | } | 3435 | } |
| 3436 | |||
| 3437 | void dlm_force_free_mles(struct dlm_ctxt *dlm) | ||
| 3438 | { | ||
| 3439 | int i; | ||
| 3440 | struct hlist_head *bucket; | ||
| 3441 | struct dlm_master_list_entry *mle; | ||
| 3442 | struct hlist_node *tmp, *list; | ||
| 3443 | |||
| 3444 | /* | ||
| 3445 | * We notified all other nodes that we are exiting the domain and | ||
| 3446 | * marked the dlm state to DLM_CTXT_LEAVING. If any mles are still | ||
| 3447 | * around we force free them and wake any processes that are waiting | ||
| 3448 | * on the mles | ||
| 3449 | */ | ||
| 3450 | spin_lock(&dlm->spinlock); | ||
| 3451 | spin_lock(&dlm->master_lock); | ||
| 3452 | |||
| 3453 | BUG_ON(dlm->dlm_state != DLM_CTXT_LEAVING); | ||
| 3454 | BUG_ON((find_next_bit(dlm->domain_map, O2NM_MAX_NODES, 0) < O2NM_MAX_NODES)); | ||
| 3455 | |||
| 3456 | for (i = 0; i < DLM_HASH_BUCKETS; i++) { | ||
| 3457 | bucket = dlm_master_hash(dlm, i); | ||
| 3458 | hlist_for_each_safe(list, tmp, bucket) { | ||
| 3459 | mle = hlist_entry(list, struct dlm_master_list_entry, | ||
| 3460 | master_hash_node); | ||
| 3461 | if (mle->type != DLM_MLE_BLOCK) { | ||
| 3462 | mlog(ML_ERROR, "bad mle: %p\n", mle); | ||
| 3463 | dlm_print_one_mle(mle); | ||
| 3464 | } | ||
| 3465 | atomic_set(&mle->woken, 1); | ||
| 3466 | wake_up(&mle->wq); | ||
| 3467 | |||
| 3468 | __dlm_unlink_mle(dlm, mle); | ||
| 3469 | __dlm_mle_detach_hb_events(dlm, mle); | ||
| 3470 | __dlm_put_mle(mle); | ||
| 3471 | } | ||
| 3472 | } | ||
| 3473 | spin_unlock(&dlm->master_lock); | ||
| 3474 | spin_unlock(&dlm->spinlock); | ||
| 3475 | } | ||
diff --git a/fs/ocfs2/dlmglue.h b/fs/ocfs2/dlmglue.h index d1ce48e1b3d6..1d596d8c4a4a 100644 --- a/fs/ocfs2/dlmglue.h +++ b/fs/ocfs2/dlmglue.h | |||
| @@ -84,6 +84,7 @@ enum { | |||
| 84 | OI_LS_PARENT, | 84 | OI_LS_PARENT, |
| 85 | OI_LS_RENAME1, | 85 | OI_LS_RENAME1, |
| 86 | OI_LS_RENAME2, | 86 | OI_LS_RENAME2, |
| 87 | OI_LS_REFLINK_TARGET, | ||
| 87 | }; | 88 | }; |
| 88 | 89 | ||
| 89 | int ocfs2_dlm_init(struct ocfs2_super *osb); | 90 | int ocfs2_dlm_init(struct ocfs2_super *osb); |
diff --git a/fs/ocfs2/ocfs2_fs.h b/fs/ocfs2/ocfs2_fs.h index 33f1c9a8258d..fa31d05e41b7 100644 --- a/fs/ocfs2/ocfs2_fs.h +++ b/fs/ocfs2/ocfs2_fs.h | |||
| @@ -235,18 +235,31 @@ | |||
| 235 | #define OCFS2_HAS_REFCOUNT_FL (0x0010) | 235 | #define OCFS2_HAS_REFCOUNT_FL (0x0010) |
| 236 | 236 | ||
| 237 | /* Inode attributes, keep in sync with EXT2 */ | 237 | /* Inode attributes, keep in sync with EXT2 */ |
| 238 | #define OCFS2_SECRM_FL (0x00000001) /* Secure deletion */ | 238 | #define OCFS2_SECRM_FL FS_SECRM_FL /* Secure deletion */ |
| 239 | #define OCFS2_UNRM_FL (0x00000002) /* Undelete */ | 239 | #define OCFS2_UNRM_FL FS_UNRM_FL /* Undelete */ |
| 240 | #define OCFS2_COMPR_FL (0x00000004) /* Compress file */ | 240 | #define OCFS2_COMPR_FL FS_COMPR_FL /* Compress file */ |
| 241 | #define OCFS2_SYNC_FL (0x00000008) /* Synchronous updates */ | 241 | #define OCFS2_SYNC_FL FS_SYNC_FL /* Synchronous updates */ |
| 242 | #define OCFS2_IMMUTABLE_FL (0x00000010) /* Immutable file */ | 242 | #define OCFS2_IMMUTABLE_FL FS_IMMUTABLE_FL /* Immutable file */ |
| 243 | #define OCFS2_APPEND_FL (0x00000020) /* writes to file may only append */ | 243 | #define OCFS2_APPEND_FL FS_APPEND_FL /* writes to file may only append */ |
| 244 | #define OCFS2_NODUMP_FL (0x00000040) /* do not dump file */ | 244 | #define OCFS2_NODUMP_FL FS_NODUMP_FL /* do not dump file */ |
| 245 | #define OCFS2_NOATIME_FL (0x00000080) /* do not update atime */ | 245 | #define OCFS2_NOATIME_FL FS_NOATIME_FL /* do not update atime */ |
| 246 | #define OCFS2_DIRSYNC_FL (0x00010000) /* dirsync behaviour (directories only) */ | 246 | /* Reserved for compression usage... */ |
| 247 | 247 | #define OCFS2_DIRTY_FL FS_DIRTY_FL | |
| 248 | #define OCFS2_FL_VISIBLE (0x000100FF) /* User visible flags */ | 248 | #define OCFS2_COMPRBLK_FL FS_COMPRBLK_FL /* One or more compressed clusters */ |
| 249 | #define OCFS2_FL_MODIFIABLE (0x000100FF) /* User modifiable flags */ | 249 | #define OCFS2_NOCOMP_FL FS_NOCOMP_FL /* Don't compress */ |
| 250 | #define OCFS2_ECOMPR_FL FS_ECOMPR_FL /* Compression error */ | ||
| 251 | /* End compression flags --- maybe not all used */ | ||
| 252 | #define OCFS2_BTREE_FL FS_BTREE_FL /* btree format dir */ | ||
| 253 | #define OCFS2_INDEX_FL FS_INDEX_FL /* hash-indexed directory */ | ||
| 254 | #define OCFS2_IMAGIC_FL FS_IMAGIC_FL /* AFS directory */ | ||
| 255 | #define OCFS2_JOURNAL_DATA_FL FS_JOURNAL_DATA_FL /* Reserved for ext3 */ | ||
| 256 | #define OCFS2_NOTAIL_FL FS_NOTAIL_FL /* file tail should not be merged */ | ||
| 257 | #define OCFS2_DIRSYNC_FL FS_DIRSYNC_FL /* dirsync behaviour (directories only) */ | ||
| 258 | #define OCFS2_TOPDIR_FL FS_TOPDIR_FL /* Top of directory hierarchies*/ | ||
| 259 | #define OCFS2_RESERVED_FL FS_RESERVED_FL /* reserved for ext2 lib */ | ||
| 260 | |||
| 261 | #define OCFS2_FL_VISIBLE FS_FL_USER_VISIBLE /* User visible flags */ | ||
| 262 | #define OCFS2_FL_MODIFIABLE FS_FL_USER_MODIFIABLE /* User modifiable flags */ | ||
| 250 | 263 | ||
| 251 | /* | 264 | /* |
| 252 | * Extent record flags (e_node.leaf.flags) | 265 | * Extent record flags (e_node.leaf.flags) |
diff --git a/fs/ocfs2/ocfs2_ioctl.h b/fs/ocfs2/ocfs2_ioctl.h index 2d3420af1a83..5d241505690b 100644 --- a/fs/ocfs2/ocfs2_ioctl.h +++ b/fs/ocfs2/ocfs2_ioctl.h | |||
| @@ -23,10 +23,10 @@ | |||
| 23 | /* | 23 | /* |
| 24 | * ioctl commands | 24 | * ioctl commands |
| 25 | */ | 25 | */ |
| 26 | #define OCFS2_IOC_GETFLAGS _IOR('f', 1, long) | 26 | #define OCFS2_IOC_GETFLAGS FS_IOC_GETFLAGS |
| 27 | #define OCFS2_IOC_SETFLAGS _IOW('f', 2, long) | 27 | #define OCFS2_IOC_SETFLAGS FS_IOC_SETFLAGS |
| 28 | #define OCFS2_IOC32_GETFLAGS _IOR('f', 1, int) | 28 | #define OCFS2_IOC32_GETFLAGS FS_IOC32_GETFLAGS |
| 29 | #define OCFS2_IOC32_SETFLAGS _IOW('f', 2, int) | 29 | #define OCFS2_IOC32_SETFLAGS FS_IOC32_SETFLAGS |
| 30 | 30 | ||
| 31 | /* | 31 | /* |
| 32 | * Space reservation / allocation / free ioctls and argument structure | 32 | * Space reservation / allocation / free ioctls and argument structure |
diff --git a/fs/ocfs2/refcounttree.c b/fs/ocfs2/refcounttree.c index 0afeda83120f..efdd75607406 100644 --- a/fs/ocfs2/refcounttree.c +++ b/fs/ocfs2/refcounttree.c | |||
| @@ -4201,8 +4201,9 @@ static int __ocfs2_reflink(struct dentry *old_dentry, | |||
| 4201 | goto out; | 4201 | goto out; |
| 4202 | } | 4202 | } |
| 4203 | 4203 | ||
| 4204 | mutex_lock(&new_inode->i_mutex); | 4204 | mutex_lock_nested(&new_inode->i_mutex, I_MUTEX_CHILD); |
| 4205 | ret = ocfs2_inode_lock(new_inode, &new_bh, 1); | 4205 | ret = ocfs2_inode_lock_nested(new_inode, &new_bh, 1, |
| 4206 | OI_LS_REFLINK_TARGET); | ||
| 4206 | if (ret) { | 4207 | if (ret) { |
| 4207 | mlog_errno(ret); | 4208 | mlog_errno(ret); |
| 4208 | goto out_unlock; | 4209 | goto out_unlock; |
diff --git a/fs/ocfs2/reservations.c b/fs/ocfs2/reservations.c index d8b6e4259b80..3e78db361bc7 100644 --- a/fs/ocfs2/reservations.c +++ b/fs/ocfs2/reservations.c | |||
| @@ -732,25 +732,23 @@ int ocfs2_resmap_resv_bits(struct ocfs2_reservation_map *resmap, | |||
| 732 | struct ocfs2_alloc_reservation *resv, | 732 | struct ocfs2_alloc_reservation *resv, |
| 733 | int *cstart, int *clen) | 733 | int *cstart, int *clen) |
| 734 | { | 734 | { |
| 735 | unsigned int wanted = *clen; | ||
| 736 | |||
| 737 | if (resv == NULL || ocfs2_resmap_disabled(resmap)) | 735 | if (resv == NULL || ocfs2_resmap_disabled(resmap)) |
| 738 | return -ENOSPC; | 736 | return -ENOSPC; |
| 739 | 737 | ||
| 740 | spin_lock(&resv_lock); | 738 | spin_lock(&resv_lock); |
| 741 | 739 | ||
| 742 | /* | ||
| 743 | * We don't want to over-allocate for temporary | ||
| 744 | * windows. Otherwise, we run the risk of fragmenting the | ||
| 745 | * allocation space. | ||
| 746 | */ | ||
| 747 | wanted = ocfs2_resv_window_bits(resmap, resv); | ||
| 748 | if ((resv->r_flags & OCFS2_RESV_FLAG_TMP) || wanted < *clen) | ||
| 749 | wanted = *clen; | ||
| 750 | |||
| 751 | if (ocfs2_resv_empty(resv)) { | 740 | if (ocfs2_resv_empty(resv)) { |
| 752 | mlog(0, "empty reservation, find new window\n"); | 741 | /* |
| 742 | * We don't want to over-allocate for temporary | ||
| 743 | * windows. Otherwise, we run the risk of fragmenting the | ||
| 744 | * allocation space. | ||
| 745 | */ | ||
| 746 | unsigned int wanted = ocfs2_resv_window_bits(resmap, resv); | ||
| 753 | 747 | ||
| 748 | if ((resv->r_flags & OCFS2_RESV_FLAG_TMP) || wanted < *clen) | ||
| 749 | wanted = *clen; | ||
| 750 | |||
| 751 | mlog(0, "empty reservation, find new window\n"); | ||
| 754 | /* | 752 | /* |
| 755 | * Try to get a window here. If it works, we must fall | 753 | * Try to get a window here. If it works, we must fall |
| 756 | * through and test the bitmap . This avoids some | 754 | * through and test the bitmap . This avoids some |
diff --git a/fs/ocfs2/suballoc.c b/fs/ocfs2/suballoc.c index 8a286f54dca1..849c2f0e0a0e 100644 --- a/fs/ocfs2/suballoc.c +++ b/fs/ocfs2/suballoc.c | |||
| @@ -357,7 +357,7 @@ out: | |||
| 357 | static void ocfs2_bg_discontig_add_extent(struct ocfs2_super *osb, | 357 | static void ocfs2_bg_discontig_add_extent(struct ocfs2_super *osb, |
| 358 | struct ocfs2_group_desc *bg, | 358 | struct ocfs2_group_desc *bg, |
| 359 | struct ocfs2_chain_list *cl, | 359 | struct ocfs2_chain_list *cl, |
| 360 | u64 p_blkno, u32 clusters) | 360 | u64 p_blkno, unsigned int clusters) |
| 361 | { | 361 | { |
| 362 | struct ocfs2_extent_list *el = &bg->bg_list; | 362 | struct ocfs2_extent_list *el = &bg->bg_list; |
| 363 | struct ocfs2_extent_rec *rec; | 363 | struct ocfs2_extent_rec *rec; |
| @@ -369,7 +369,7 @@ static void ocfs2_bg_discontig_add_extent(struct ocfs2_super *osb, | |||
| 369 | rec->e_blkno = cpu_to_le64(p_blkno); | 369 | rec->e_blkno = cpu_to_le64(p_blkno); |
| 370 | rec->e_cpos = cpu_to_le32(le16_to_cpu(bg->bg_bits) / | 370 | rec->e_cpos = cpu_to_le32(le16_to_cpu(bg->bg_bits) / |
| 371 | le16_to_cpu(cl->cl_bpc)); | 371 | le16_to_cpu(cl->cl_bpc)); |
| 372 | rec->e_leaf_clusters = cpu_to_le32(clusters); | 372 | rec->e_leaf_clusters = cpu_to_le16(clusters); |
| 373 | le16_add_cpu(&bg->bg_bits, clusters * le16_to_cpu(cl->cl_bpc)); | 373 | le16_add_cpu(&bg->bg_bits, clusters * le16_to_cpu(cl->cl_bpc)); |
| 374 | le16_add_cpu(&bg->bg_free_bits_count, | 374 | le16_add_cpu(&bg->bg_free_bits_count, |
| 375 | clusters * le16_to_cpu(cl->cl_bpc)); | 375 | clusters * le16_to_cpu(cl->cl_bpc)); |
diff --git a/fs/ocfs2/xattr.c b/fs/ocfs2/xattr.c index d03469f61801..06fa5e77c40e 100644 --- a/fs/ocfs2/xattr.c +++ b/fs/ocfs2/xattr.c | |||
| @@ -1286,13 +1286,11 @@ int ocfs2_xattr_get_nolock(struct inode *inode, | |||
| 1286 | xis.inode_bh = xbs.inode_bh = di_bh; | 1286 | xis.inode_bh = xbs.inode_bh = di_bh; |
| 1287 | di = (struct ocfs2_dinode *)di_bh->b_data; | 1287 | di = (struct ocfs2_dinode *)di_bh->b_data; |
| 1288 | 1288 | ||
| 1289 | down_read(&oi->ip_xattr_sem); | ||
| 1290 | ret = ocfs2_xattr_ibody_get(inode, name_index, name, buffer, | 1289 | ret = ocfs2_xattr_ibody_get(inode, name_index, name, buffer, |
| 1291 | buffer_size, &xis); | 1290 | buffer_size, &xis); |
| 1292 | if (ret == -ENODATA && di->i_xattr_loc) | 1291 | if (ret == -ENODATA && di->i_xattr_loc) |
| 1293 | ret = ocfs2_xattr_block_get(inode, name_index, name, buffer, | 1292 | ret = ocfs2_xattr_block_get(inode, name_index, name, buffer, |
| 1294 | buffer_size, &xbs); | 1293 | buffer_size, &xbs); |
| 1295 | up_read(&oi->ip_xattr_sem); | ||
| 1296 | 1294 | ||
| 1297 | return ret; | 1295 | return ret; |
| 1298 | } | 1296 | } |
| @@ -1316,8 +1314,10 @@ static int ocfs2_xattr_get(struct inode *inode, | |||
| 1316 | mlog_errno(ret); | 1314 | mlog_errno(ret); |
| 1317 | return ret; | 1315 | return ret; |
| 1318 | } | 1316 | } |
| 1317 | down_read(&OCFS2_I(inode)->ip_xattr_sem); | ||
| 1319 | ret = ocfs2_xattr_get_nolock(inode, di_bh, name_index, | 1318 | ret = ocfs2_xattr_get_nolock(inode, di_bh, name_index, |
| 1320 | name, buffer, buffer_size); | 1319 | name, buffer, buffer_size); |
| 1320 | up_read(&OCFS2_I(inode)->ip_xattr_sem); | ||
| 1321 | 1321 | ||
| 1322 | ocfs2_inode_unlock(inode, 0); | 1322 | ocfs2_inode_unlock(inode, 0); |
| 1323 | 1323 | ||
diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c index 271afc48b9a5..1dbca4e8cc16 100644 --- a/fs/proc/task_mmu.c +++ b/fs/proc/task_mmu.c | |||
| @@ -363,13 +363,13 @@ static int smaps_pte_range(pmd_t *pmd, unsigned long addr, unsigned long end, | |||
| 363 | mss->referenced += PAGE_SIZE; | 363 | mss->referenced += PAGE_SIZE; |
| 364 | mapcount = page_mapcount(page); | 364 | mapcount = page_mapcount(page); |
| 365 | if (mapcount >= 2) { | 365 | if (mapcount >= 2) { |
| 366 | if (pte_dirty(ptent)) | 366 | if (pte_dirty(ptent) || PageDirty(page)) |
| 367 | mss->shared_dirty += PAGE_SIZE; | 367 | mss->shared_dirty += PAGE_SIZE; |
| 368 | else | 368 | else |
| 369 | mss->shared_clean += PAGE_SIZE; | 369 | mss->shared_clean += PAGE_SIZE; |
| 370 | mss->pss += (PAGE_SIZE << PSS_SHIFT) / mapcount; | 370 | mss->pss += (PAGE_SIZE << PSS_SHIFT) / mapcount; |
| 371 | } else { | 371 | } else { |
| 372 | if (pte_dirty(ptent)) | 372 | if (pte_dirty(ptent) || PageDirty(page)) |
| 373 | mss->private_dirty += PAGE_SIZE; | 373 | mss->private_dirty += PAGE_SIZE; |
| 374 | else | 374 | else |
| 375 | mss->private_clean += PAGE_SIZE; | 375 | mss->private_clean += PAGE_SIZE; |
diff --git a/fs/proc/vmcore.c b/fs/proc/vmcore.c index 91c817ff02c3..2367fb3f70bc 100644 --- a/fs/proc/vmcore.c +++ b/fs/proc/vmcore.c | |||
| @@ -163,7 +163,7 @@ static ssize_t read_vmcore(struct file *file, char __user *buffer, | |||
| 163 | 163 | ||
| 164 | static const struct file_operations proc_vmcore_operations = { | 164 | static const struct file_operations proc_vmcore_operations = { |
| 165 | .read = read_vmcore, | 165 | .read = read_vmcore, |
| 166 | .llseek = generic_file_llseek, | 166 | .llseek = default_llseek, |
| 167 | }; | 167 | }; |
| 168 | 168 | ||
| 169 | static struct vmcore* __init get_new_element(void) | 169 | static struct vmcore* __init get_new_element(void) |
diff --git a/include/linux/dma-mapping.h b/include/linux/dma-mapping.h index ce29b8151198..ba8319ae5fcc 100644 --- a/include/linux/dma-mapping.h +++ b/include/linux/dma-mapping.h | |||
| @@ -102,6 +102,9 @@ static inline u64 dma_get_mask(struct device *dev) | |||
| 102 | return DMA_BIT_MASK(32); | 102 | return DMA_BIT_MASK(32); |
| 103 | } | 103 | } |
| 104 | 104 | ||
| 105 | #ifdef ARCH_HAS_DMA_SET_COHERENT_MASK | ||
| 106 | int dma_set_coherent_mask(struct device *dev, u64 mask); | ||
| 107 | #else | ||
| 105 | static inline int dma_set_coherent_mask(struct device *dev, u64 mask) | 108 | static inline int dma_set_coherent_mask(struct device *dev, u64 mask) |
| 106 | { | 109 | { |
| 107 | if (!dma_supported(dev, mask)) | 110 | if (!dma_supported(dev, mask)) |
| @@ -109,6 +112,7 @@ static inline int dma_set_coherent_mask(struct device *dev, u64 mask) | |||
| 109 | dev->coherent_dma_mask = mask; | 112 | dev->coherent_dma_mask = mask; |
| 110 | return 0; | 113 | return 0; |
| 111 | } | 114 | } |
| 115 | #endif | ||
| 112 | 116 | ||
| 113 | extern u64 dma_get_required_mask(struct device *dev); | 117 | extern u64 dma_get_required_mask(struct device *dev); |
| 114 | 118 | ||
diff --git a/include/linux/fs.h b/include/linux/fs.h index 76041b614758..63d069bd80b7 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
| @@ -1093,6 +1093,10 @@ struct file_lock { | |||
| 1093 | 1093 | ||
| 1094 | #include <linux/fcntl.h> | 1094 | #include <linux/fcntl.h> |
| 1095 | 1095 | ||
| 1096 | /* temporary stubs for BKL removal */ | ||
| 1097 | #define lock_flocks() lock_kernel() | ||
| 1098 | #define unlock_flocks() unlock_kernel() | ||
| 1099 | |||
| 1096 | extern void send_sigio(struct fown_struct *fown, int fd, int band); | 1100 | extern void send_sigio(struct fown_struct *fown, int fd, int band); |
| 1097 | 1101 | ||
| 1098 | #ifdef CONFIG_FILE_LOCKING | 1102 | #ifdef CONFIG_FILE_LOCKING |
diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h index 10d33309e9a6..570fddeb0388 100644 --- a/include/linux/pci_ids.h +++ b/include/linux/pci_ids.h | |||
| @@ -393,6 +393,9 @@ | |||
| 393 | #define PCI_DEVICE_ID_VLSI_82C147 0x0105 | 393 | #define PCI_DEVICE_ID_VLSI_82C147 0x0105 |
| 394 | #define PCI_DEVICE_ID_VLSI_VAS96011 0x0702 | 394 | #define PCI_DEVICE_ID_VLSI_VAS96011 0x0702 |
| 395 | 395 | ||
| 396 | /* AMD RD890 Chipset */ | ||
| 397 | #define PCI_DEVICE_ID_RD890_IOMMU 0x5a23 | ||
| 398 | |||
| 396 | #define PCI_VENDOR_ID_ADL 0x1005 | 399 | #define PCI_VENDOR_ID_ADL 0x1005 |
| 397 | #define PCI_DEVICE_ID_ADL_2301 0x2301 | 400 | #define PCI_DEVICE_ID_ADL_2301 0x2301 |
| 398 | 401 | ||
diff --git a/kernel/fork.c b/kernel/fork.c index b7e9d60a675d..c445f8cc408d 100644 --- a/kernel/fork.c +++ b/kernel/fork.c | |||
| @@ -356,10 +356,10 @@ static int dup_mmap(struct mm_struct *mm, struct mm_struct *oldmm) | |||
| 356 | if (IS_ERR(pol)) | 356 | if (IS_ERR(pol)) |
| 357 | goto fail_nomem_policy; | 357 | goto fail_nomem_policy; |
| 358 | vma_set_policy(tmp, pol); | 358 | vma_set_policy(tmp, pol); |
| 359 | tmp->vm_mm = mm; | ||
| 359 | if (anon_vma_fork(tmp, mpnt)) | 360 | if (anon_vma_fork(tmp, mpnt)) |
| 360 | goto fail_nomem_anon_vma_fork; | 361 | goto fail_nomem_anon_vma_fork; |
| 361 | tmp->vm_flags &= ~VM_LOCKED; | 362 | tmp->vm_flags &= ~VM_LOCKED; |
| 362 | tmp->vm_mm = mm; | ||
| 363 | tmp->vm_next = tmp->vm_prev = NULL; | 363 | tmp->vm_next = tmp->vm_prev = NULL; |
| 364 | file = tmp->vm_file; | 364 | file = tmp->vm_file; |
| 365 | if (file) { | 365 | if (file) { |
diff --git a/kernel/hw_breakpoint.c b/kernel/hw_breakpoint.c index d71a987fd2bf..c7c2aed9e2dc 100644 --- a/kernel/hw_breakpoint.c +++ b/kernel/hw_breakpoint.c | |||
| @@ -433,7 +433,8 @@ register_user_hw_breakpoint(struct perf_event_attr *attr, | |||
| 433 | perf_overflow_handler_t triggered, | 433 | perf_overflow_handler_t triggered, |
| 434 | struct task_struct *tsk) | 434 | struct task_struct *tsk) |
| 435 | { | 435 | { |
| 436 | return perf_event_create_kernel_counter(attr, -1, tsk->pid, triggered); | 436 | return perf_event_create_kernel_counter(attr, -1, task_pid_vnr(tsk), |
| 437 | triggered); | ||
| 437 | } | 438 | } |
| 438 | EXPORT_SYMBOL_GPL(register_user_hw_breakpoint); | 439 | EXPORT_SYMBOL_GPL(register_user_hw_breakpoint); |
| 439 | 440 | ||
diff --git a/kernel/sched.c b/kernel/sched.c index ed09d4f2a69c..dc85ceb90832 100644 --- a/kernel/sched.c +++ b/kernel/sched.c | |||
| @@ -3513,9 +3513,9 @@ void task_times(struct task_struct *p, cputime_t *ut, cputime_t *st) | |||
| 3513 | rtime = nsecs_to_cputime(p->se.sum_exec_runtime); | 3513 | rtime = nsecs_to_cputime(p->se.sum_exec_runtime); |
| 3514 | 3514 | ||
| 3515 | if (total) { | 3515 | if (total) { |
| 3516 | u64 temp; | 3516 | u64 temp = rtime; |
| 3517 | 3517 | ||
| 3518 | temp = (u64)(rtime * utime); | 3518 | temp *= utime; |
| 3519 | do_div(temp, total); | 3519 | do_div(temp, total); |
| 3520 | utime = (cputime_t)temp; | 3520 | utime = (cputime_t)temp; |
| 3521 | } else | 3521 | } else |
| @@ -3546,9 +3546,9 @@ void thread_group_times(struct task_struct *p, cputime_t *ut, cputime_t *st) | |||
| 3546 | rtime = nsecs_to_cputime(cputime.sum_exec_runtime); | 3546 | rtime = nsecs_to_cputime(cputime.sum_exec_runtime); |
| 3547 | 3547 | ||
| 3548 | if (total) { | 3548 | if (total) { |
| 3549 | u64 temp; | 3549 | u64 temp = rtime; |
| 3550 | 3550 | ||
| 3551 | temp = (u64)(rtime * cputime.utime); | 3551 | temp *= cputime.utime; |
| 3552 | do_div(temp, total); | 3552 | do_div(temp, total); |
| 3553 | utime = (cputime_t)temp; | 3553 | utime = (cputime_t)temp; |
| 3554 | } else | 3554 | } else |
diff --git a/kernel/sched_fair.c b/kernel/sched_fair.c index a171138a9402..db3f674ca49d 100644 --- a/kernel/sched_fair.c +++ b/kernel/sched_fair.c | |||
| @@ -3630,7 +3630,7 @@ static inline int nohz_kick_needed(struct rq *rq, int cpu) | |||
| 3630 | if (time_before(now, nohz.next_balance)) | 3630 | if (time_before(now, nohz.next_balance)) |
| 3631 | return 0; | 3631 | return 0; |
| 3632 | 3632 | ||
| 3633 | if (!rq->nr_running) | 3633 | if (rq->idle_at_tick) |
| 3634 | return 0; | 3634 | return 0; |
| 3635 | 3635 | ||
| 3636 | first_pick_cpu = atomic_read(&nohz.first_pick_cpu); | 3636 | first_pick_cpu = atomic_read(&nohz.first_pick_cpu); |
diff --git a/mm/backing-dev.c b/mm/backing-dev.c index c2bf86f470ed..65d420499a61 100644 --- a/mm/backing-dev.c +++ b/mm/backing-dev.c | |||
| @@ -30,6 +30,7 @@ EXPORT_SYMBOL_GPL(default_backing_dev_info); | |||
| 30 | 30 | ||
| 31 | struct backing_dev_info noop_backing_dev_info = { | 31 | struct backing_dev_info noop_backing_dev_info = { |
| 32 | .name = "noop", | 32 | .name = "noop", |
| 33 | .capabilities = BDI_CAP_NO_ACCT_AND_WRITEBACK, | ||
| 33 | }; | 34 | }; |
| 34 | EXPORT_SYMBOL_GPL(noop_backing_dev_info); | 35 | EXPORT_SYMBOL_GPL(noop_backing_dev_info); |
| 35 | 36 | ||
| @@ -243,6 +244,7 @@ static int __init default_bdi_init(void) | |||
| 243 | err = bdi_init(&default_backing_dev_info); | 244 | err = bdi_init(&default_backing_dev_info); |
| 244 | if (!err) | 245 | if (!err) |
| 245 | bdi_register(&default_backing_dev_info, NULL, "default"); | 246 | bdi_register(&default_backing_dev_info, NULL, "default"); |
| 247 | err = bdi_init(&noop_backing_dev_info); | ||
| 246 | 248 | ||
| 247 | return err; | 249 | return err; |
| 248 | } | 250 | } |
diff --git a/mm/fremap.c b/mm/fremap.c index 46f5dacf90a2..ec520c7b28df 100644 --- a/mm/fremap.c +++ b/mm/fremap.c | |||
| @@ -125,7 +125,6 @@ SYSCALL_DEFINE5(remap_file_pages, unsigned long, start, unsigned long, size, | |||
| 125 | { | 125 | { |
| 126 | struct mm_struct *mm = current->mm; | 126 | struct mm_struct *mm = current->mm; |
| 127 | struct address_space *mapping; | 127 | struct address_space *mapping; |
| 128 | unsigned long end = start + size; | ||
| 129 | struct vm_area_struct *vma; | 128 | struct vm_area_struct *vma; |
| 130 | int err = -EINVAL; | 129 | int err = -EINVAL; |
| 131 | int has_write_lock = 0; | 130 | int has_write_lock = 0; |
| @@ -142,6 +141,10 @@ SYSCALL_DEFINE5(remap_file_pages, unsigned long, start, unsigned long, size, | |||
| 142 | if (start + size <= start) | 141 | if (start + size <= start) |
| 143 | return err; | 142 | return err; |
| 144 | 143 | ||
| 144 | /* Does pgoff wrap? */ | ||
| 145 | if (pgoff + (size >> PAGE_SHIFT) < pgoff) | ||
| 146 | return err; | ||
| 147 | |||
| 145 | /* Can we represent this offset inside this architecture's pte's? */ | 148 | /* Can we represent this offset inside this architecture's pte's? */ |
| 146 | #if PTE_FILE_MAX_BITS < BITS_PER_LONG | 149 | #if PTE_FILE_MAX_BITS < BITS_PER_LONG |
| 147 | if (pgoff + (size >> PAGE_SHIFT) >= (1UL << PTE_FILE_MAX_BITS)) | 150 | if (pgoff + (size >> PAGE_SHIFT) >= (1UL << PTE_FILE_MAX_BITS)) |
| @@ -168,7 +171,7 @@ SYSCALL_DEFINE5(remap_file_pages, unsigned long, start, unsigned long, size, | |||
| 168 | if (!(vma->vm_flags & VM_CAN_NONLINEAR)) | 171 | if (!(vma->vm_flags & VM_CAN_NONLINEAR)) |
| 169 | goto out; | 172 | goto out; |
| 170 | 173 | ||
| 171 | if (end <= start || start < vma->vm_start || end > vma->vm_end) | 174 | if (start < vma->vm_start || start + size > vma->vm_end) |
| 172 | goto out; | 175 | goto out; |
| 173 | 176 | ||
| 174 | /* Must set VM_NONLINEAR before any pages are populated. */ | 177 | /* Must set VM_NONLINEAR before any pages are populated. */ |
diff --git a/mm/hugetlb.c b/mm/hugetlb.c index cc5be788a39f..c03273807182 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c | |||
| @@ -2324,11 +2324,8 @@ retry_avoidcopy: | |||
| 2324 | * and just make the page writable */ | 2324 | * and just make the page writable */ |
| 2325 | avoidcopy = (page_mapcount(old_page) == 1); | 2325 | avoidcopy = (page_mapcount(old_page) == 1); |
| 2326 | if (avoidcopy) { | 2326 | if (avoidcopy) { |
| 2327 | if (!trylock_page(old_page)) { | 2327 | if (PageAnon(old_page)) |
| 2328 | if (PageAnon(old_page)) | 2328 | page_move_anon_rmap(old_page, vma, address); |
| 2329 | page_move_anon_rmap(old_page, vma, address); | ||
| 2330 | } else | ||
| 2331 | unlock_page(old_page); | ||
| 2332 | set_huge_ptep_writable(vma, address, ptep); | 2329 | set_huge_ptep_writable(vma, address, ptep); |
| 2333 | return 0; | 2330 | return 0; |
| 2334 | } | 2331 | } |
| @@ -2404,7 +2401,7 @@ retry_avoidcopy: | |||
| 2404 | set_huge_pte_at(mm, address, ptep, | 2401 | set_huge_pte_at(mm, address, ptep, |
| 2405 | make_huge_pte(vma, new_page, 1)); | 2402 | make_huge_pte(vma, new_page, 1)); |
| 2406 | page_remove_rmap(old_page); | 2403 | page_remove_rmap(old_page); |
| 2407 | hugepage_add_anon_rmap(new_page, vma, address); | 2404 | hugepage_add_new_anon_rmap(new_page, vma, address); |
| 2408 | /* Make the old page be freed below */ | 2405 | /* Make the old page be freed below */ |
| 2409 | new_page = old_page; | 2406 | new_page = old_page; |
| 2410 | mmu_notifier_invalidate_range_end(mm, | 2407 | mmu_notifier_invalidate_range_end(mm, |
| @@ -2631,10 +2628,16 @@ int hugetlb_fault(struct mm_struct *mm, struct vm_area_struct *vma, | |||
| 2631 | vma, address); | 2628 | vma, address); |
| 2632 | } | 2629 | } |
| 2633 | 2630 | ||
| 2634 | if (!pagecache_page) { | 2631 | /* |
| 2635 | page = pte_page(entry); | 2632 | * hugetlb_cow() requires page locks of pte_page(entry) and |
| 2633 | * pagecache_page, so here we need take the former one | ||
| 2634 | * when page != pagecache_page or !pagecache_page. | ||
| 2635 | * Note that locking order is always pagecache_page -> page, | ||
| 2636 | * so no worry about deadlock. | ||
| 2637 | */ | ||
| 2638 | page = pte_page(entry); | ||
| 2639 | if (page != pagecache_page) | ||
| 2636 | lock_page(page); | 2640 | lock_page(page); |
| 2637 | } | ||
| 2638 | 2641 | ||
| 2639 | spin_lock(&mm->page_table_lock); | 2642 | spin_lock(&mm->page_table_lock); |
| 2640 | /* Check for a racing update before calling hugetlb_cow */ | 2643 | /* Check for a racing update before calling hugetlb_cow */ |
| @@ -2661,9 +2664,8 @@ out_page_table_lock: | |||
| 2661 | if (pagecache_page) { | 2664 | if (pagecache_page) { |
| 2662 | unlock_page(pagecache_page); | 2665 | unlock_page(pagecache_page); |
| 2663 | put_page(pagecache_page); | 2666 | put_page(pagecache_page); |
| 2664 | } else { | ||
| 2665 | unlock_page(page); | ||
| 2666 | } | 2667 | } |
| 2668 | unlock_page(page); | ||
| 2667 | 2669 | ||
| 2668 | out_mutex: | 2670 | out_mutex: |
| 2669 | mutex_unlock(&hugetlb_instantiation_mutex); | 2671 | mutex_unlock(&hugetlb_instantiation_mutex); |
| @@ -2009,6 +2009,7 @@ static int __split_vma(struct mm_struct * mm, struct vm_area_struct * vma, | |||
| 2009 | removed_exe_file_vma(mm); | 2009 | removed_exe_file_vma(mm); |
| 2010 | fput(new->vm_file); | 2010 | fput(new->vm_file); |
| 2011 | } | 2011 | } |
| 2012 | unlink_anon_vmas(new); | ||
| 2012 | out_free_mpol: | 2013 | out_free_mpol: |
| 2013 | mpol_put(pol); | 2014 | mpol_put(pol); |
| 2014 | out_free_vma: | 2015 | out_free_vma: |
diff --git a/mm/oom_kill.c b/mm/oom_kill.c index fc81cb22869e..4029583a1024 100644 --- a/mm/oom_kill.c +++ b/mm/oom_kill.c | |||
| @@ -121,8 +121,8 @@ struct task_struct *find_lock_task_mm(struct task_struct *p) | |||
| 121 | } | 121 | } |
| 122 | 122 | ||
| 123 | /* return true if the task is not adequate as candidate victim task. */ | 123 | /* return true if the task is not adequate as candidate victim task. */ |
| 124 | static bool oom_unkillable_task(struct task_struct *p, struct mem_cgroup *mem, | 124 | static bool oom_unkillable_task(struct task_struct *p, |
| 125 | const nodemask_t *nodemask) | 125 | const struct mem_cgroup *mem, const nodemask_t *nodemask) |
| 126 | { | 126 | { |
| 127 | if (is_global_init(p)) | 127 | if (is_global_init(p)) |
| 128 | return true; | 128 | return true; |
| @@ -208,8 +208,13 @@ unsigned int oom_badness(struct task_struct *p, struct mem_cgroup *mem, | |||
| 208 | */ | 208 | */ |
| 209 | points += p->signal->oom_score_adj; | 209 | points += p->signal->oom_score_adj; |
| 210 | 210 | ||
| 211 | if (points < 0) | 211 | /* |
| 212 | return 0; | 212 | * Never return 0 for an eligible task that may be killed since it's |
| 213 | * possible that no single user task uses more than 0.1% of memory and | ||
| 214 | * no single admin tasks uses more than 3.0%. | ||
| 215 | */ | ||
| 216 | if (points <= 0) | ||
| 217 | return 1; | ||
| 213 | return (points < 1000) ? points : 1000; | 218 | return (points < 1000) ? points : 1000; |
| 214 | } | 219 | } |
| 215 | 220 | ||
| @@ -339,26 +344,24 @@ static struct task_struct *select_bad_process(unsigned int *ppoints, | |||
| 339 | /** | 344 | /** |
| 340 | * dump_tasks - dump current memory state of all system tasks | 345 | * dump_tasks - dump current memory state of all system tasks |
| 341 | * @mem: current's memory controller, if constrained | 346 | * @mem: current's memory controller, if constrained |
| 347 | * @nodemask: nodemask passed to page allocator for mempolicy ooms | ||
| 342 | * | 348 | * |
| 343 | * Dumps the current memory state of all system tasks, excluding kernel threads. | 349 | * Dumps the current memory state of all eligible tasks. Tasks not in the same |
| 350 | * memcg, not in the same cpuset, or bound to a disjoint set of mempolicy nodes | ||
| 351 | * are not shown. | ||
| 344 | * State information includes task's pid, uid, tgid, vm size, rss, cpu, oom_adj | 352 | * State information includes task's pid, uid, tgid, vm size, rss, cpu, oom_adj |
| 345 | * value, oom_score_adj value, and name. | 353 | * value, oom_score_adj value, and name. |
| 346 | * | 354 | * |
| 347 | * If the actual is non-NULL, only tasks that are a member of the mem_cgroup are | ||
| 348 | * shown. | ||
| 349 | * | ||
| 350 | * Call with tasklist_lock read-locked. | 355 | * Call with tasklist_lock read-locked. |
| 351 | */ | 356 | */ |
| 352 | static void dump_tasks(const struct mem_cgroup *mem) | 357 | static void dump_tasks(const struct mem_cgroup *mem, const nodemask_t *nodemask) |
| 353 | { | 358 | { |
| 354 | struct task_struct *p; | 359 | struct task_struct *p; |
| 355 | struct task_struct *task; | 360 | struct task_struct *task; |
| 356 | 361 | ||
| 357 | pr_info("[ pid ] uid tgid total_vm rss cpu oom_adj oom_score_adj name\n"); | 362 | pr_info("[ pid ] uid tgid total_vm rss cpu oom_adj oom_score_adj name\n"); |
| 358 | for_each_process(p) { | 363 | for_each_process(p) { |
| 359 | if (p->flags & PF_KTHREAD) | 364 | if (oom_unkillable_task(p, mem, nodemask)) |
| 360 | continue; | ||
| 361 | if (mem && !task_in_mem_cgroup(p, mem)) | ||
| 362 | continue; | 365 | continue; |
| 363 | 366 | ||
| 364 | task = find_lock_task_mm(p); | 367 | task = find_lock_task_mm(p); |
| @@ -381,7 +384,7 @@ static void dump_tasks(const struct mem_cgroup *mem) | |||
| 381 | } | 384 | } |
| 382 | 385 | ||
| 383 | static void dump_header(struct task_struct *p, gfp_t gfp_mask, int order, | 386 | static void dump_header(struct task_struct *p, gfp_t gfp_mask, int order, |
| 384 | struct mem_cgroup *mem) | 387 | struct mem_cgroup *mem, const nodemask_t *nodemask) |
| 385 | { | 388 | { |
| 386 | task_lock(current); | 389 | task_lock(current); |
| 387 | pr_warning("%s invoked oom-killer: gfp_mask=0x%x, order=%d, " | 390 | pr_warning("%s invoked oom-killer: gfp_mask=0x%x, order=%d, " |
| @@ -394,7 +397,7 @@ static void dump_header(struct task_struct *p, gfp_t gfp_mask, int order, | |||
| 394 | mem_cgroup_print_oom_info(mem, p); | 397 | mem_cgroup_print_oom_info(mem, p); |
| 395 | show_mem(); | 398 | show_mem(); |
| 396 | if (sysctl_oom_dump_tasks) | 399 | if (sysctl_oom_dump_tasks) |
| 397 | dump_tasks(mem); | 400 | dump_tasks(mem, nodemask); |
| 398 | } | 401 | } |
| 399 | 402 | ||
| 400 | #define K(x) ((x) << (PAGE_SHIFT-10)) | 403 | #define K(x) ((x) << (PAGE_SHIFT-10)) |
| @@ -436,7 +439,7 @@ static int oom_kill_process(struct task_struct *p, gfp_t gfp_mask, int order, | |||
| 436 | unsigned int victim_points = 0; | 439 | unsigned int victim_points = 0; |
| 437 | 440 | ||
| 438 | if (printk_ratelimit()) | 441 | if (printk_ratelimit()) |
| 439 | dump_header(p, gfp_mask, order, mem); | 442 | dump_header(p, gfp_mask, order, mem, nodemask); |
| 440 | 443 | ||
| 441 | /* | 444 | /* |
| 442 | * If the task is already exiting, don't alarm the sysadmin or kill | 445 | * If the task is already exiting, don't alarm the sysadmin or kill |
| @@ -482,7 +485,7 @@ static int oom_kill_process(struct task_struct *p, gfp_t gfp_mask, int order, | |||
| 482 | * Determines whether the kernel must panic because of the panic_on_oom sysctl. | 485 | * Determines whether the kernel must panic because of the panic_on_oom sysctl. |
| 483 | */ | 486 | */ |
| 484 | static void check_panic_on_oom(enum oom_constraint constraint, gfp_t gfp_mask, | 487 | static void check_panic_on_oom(enum oom_constraint constraint, gfp_t gfp_mask, |
| 485 | int order) | 488 | int order, const nodemask_t *nodemask) |
| 486 | { | 489 | { |
| 487 | if (likely(!sysctl_panic_on_oom)) | 490 | if (likely(!sysctl_panic_on_oom)) |
| 488 | return; | 491 | return; |
| @@ -496,7 +499,7 @@ static void check_panic_on_oom(enum oom_constraint constraint, gfp_t gfp_mask, | |||
| 496 | return; | 499 | return; |
| 497 | } | 500 | } |
| 498 | read_lock(&tasklist_lock); | 501 | read_lock(&tasklist_lock); |
| 499 | dump_header(NULL, gfp_mask, order, NULL); | 502 | dump_header(NULL, gfp_mask, order, NULL, nodemask); |
| 500 | read_unlock(&tasklist_lock); | 503 | read_unlock(&tasklist_lock); |
| 501 | panic("Out of memory: %s panic_on_oom is enabled\n", | 504 | panic("Out of memory: %s panic_on_oom is enabled\n", |
| 502 | sysctl_panic_on_oom == 2 ? "compulsory" : "system-wide"); | 505 | sysctl_panic_on_oom == 2 ? "compulsory" : "system-wide"); |
| @@ -509,7 +512,7 @@ void mem_cgroup_out_of_memory(struct mem_cgroup *mem, gfp_t gfp_mask) | |||
| 509 | unsigned int points = 0; | 512 | unsigned int points = 0; |
| 510 | struct task_struct *p; | 513 | struct task_struct *p; |
| 511 | 514 | ||
| 512 | check_panic_on_oom(CONSTRAINT_MEMCG, gfp_mask, 0); | 515 | check_panic_on_oom(CONSTRAINT_MEMCG, gfp_mask, 0, NULL); |
| 513 | limit = mem_cgroup_get_limit(mem) >> PAGE_SHIFT; | 516 | limit = mem_cgroup_get_limit(mem) >> PAGE_SHIFT; |
| 514 | read_lock(&tasklist_lock); | 517 | read_lock(&tasklist_lock); |
| 515 | retry: | 518 | retry: |
| @@ -641,6 +644,7 @@ static void clear_system_oom(void) | |||
| 641 | void out_of_memory(struct zonelist *zonelist, gfp_t gfp_mask, | 644 | void out_of_memory(struct zonelist *zonelist, gfp_t gfp_mask, |
| 642 | int order, nodemask_t *nodemask) | 645 | int order, nodemask_t *nodemask) |
| 643 | { | 646 | { |
| 647 | const nodemask_t *mpol_mask; | ||
| 644 | struct task_struct *p; | 648 | struct task_struct *p; |
| 645 | unsigned long totalpages; | 649 | unsigned long totalpages; |
| 646 | unsigned long freed = 0; | 650 | unsigned long freed = 0; |
| @@ -670,7 +674,8 @@ void out_of_memory(struct zonelist *zonelist, gfp_t gfp_mask, | |||
| 670 | */ | 674 | */ |
| 671 | constraint = constrained_alloc(zonelist, gfp_mask, nodemask, | 675 | constraint = constrained_alloc(zonelist, gfp_mask, nodemask, |
| 672 | &totalpages); | 676 | &totalpages); |
| 673 | check_panic_on_oom(constraint, gfp_mask, order); | 677 | mpol_mask = (constraint == CONSTRAINT_MEMORY_POLICY) ? nodemask : NULL; |
| 678 | check_panic_on_oom(constraint, gfp_mask, order, mpol_mask); | ||
| 674 | 679 | ||
| 675 | read_lock(&tasklist_lock); | 680 | read_lock(&tasklist_lock); |
| 676 | if (sysctl_oom_kill_allocating_task && | 681 | if (sysctl_oom_kill_allocating_task && |
| @@ -688,15 +693,13 @@ void out_of_memory(struct zonelist *zonelist, gfp_t gfp_mask, | |||
| 688 | } | 693 | } |
| 689 | 694 | ||
| 690 | retry: | 695 | retry: |
| 691 | p = select_bad_process(&points, totalpages, NULL, | 696 | p = select_bad_process(&points, totalpages, NULL, mpol_mask); |
| 692 | constraint == CONSTRAINT_MEMORY_POLICY ? nodemask : | ||
| 693 | NULL); | ||
| 694 | if (PTR_ERR(p) == -1UL) | 697 | if (PTR_ERR(p) == -1UL) |
| 695 | goto out; | 698 | goto out; |
| 696 | 699 | ||
| 697 | /* Found nothing?!?! Either we hang forever, or we panic. */ | 700 | /* Found nothing?!?! Either we hang forever, or we panic. */ |
| 698 | if (!p) { | 701 | if (!p) { |
| 699 | dump_header(NULL, gfp_mask, order, NULL); | 702 | dump_header(NULL, gfp_mask, order, NULL, mpol_mask); |
| 700 | read_unlock(&tasklist_lock); | 703 | read_unlock(&tasklist_lock); |
| 701 | panic("Out of memory and no killable processes...\n"); | 704 | panic("Out of memory and no killable processes...\n"); |
| 702 | } | 705 | } |
diff --git a/mm/percpu.c b/mm/percpu.c index 58c572b18b07..c76ef3891e0d 100644 --- a/mm/percpu.c +++ b/mm/percpu.c | |||
| @@ -1401,9 +1401,9 @@ int __init pcpu_setup_first_chunk(const struct pcpu_alloc_info *ai, | |||
| 1401 | 1401 | ||
| 1402 | if (pcpu_first_unit_cpu == NR_CPUS) | 1402 | if (pcpu_first_unit_cpu == NR_CPUS) |
| 1403 | pcpu_first_unit_cpu = cpu; | 1403 | pcpu_first_unit_cpu = cpu; |
| 1404 | pcpu_last_unit_cpu = cpu; | ||
| 1404 | } | 1405 | } |
| 1405 | } | 1406 | } |
| 1406 | pcpu_last_unit_cpu = cpu; | ||
| 1407 | pcpu_nr_units = unit; | 1407 | pcpu_nr_units = unit; |
| 1408 | 1408 | ||
| 1409 | for_each_possible_cpu(cpu) | 1409 | for_each_possible_cpu(cpu) |
| @@ -1564,13 +1564,14 @@ static void __hugepage_set_anon_rmap(struct page *page, | |||
| 1564 | struct vm_area_struct *vma, unsigned long address, int exclusive) | 1564 | struct vm_area_struct *vma, unsigned long address, int exclusive) |
| 1565 | { | 1565 | { |
| 1566 | struct anon_vma *anon_vma = vma->anon_vma; | 1566 | struct anon_vma *anon_vma = vma->anon_vma; |
| 1567 | |||
| 1567 | BUG_ON(!anon_vma); | 1568 | BUG_ON(!anon_vma); |
| 1568 | if (!exclusive) { | 1569 | |
| 1569 | struct anon_vma_chain *avc; | 1570 | if (PageAnon(page)) |
| 1570 | avc = list_entry(vma->anon_vma_chain.prev, | 1571 | return; |
| 1571 | struct anon_vma_chain, same_vma); | 1572 | if (!exclusive) |
| 1572 | anon_vma = avc->anon_vma; | 1573 | anon_vma = anon_vma->root; |
| 1573 | } | 1574 | |
| 1574 | anon_vma = (void *) anon_vma + PAGE_MAPPING_ANON; | 1575 | anon_vma = (void *) anon_vma + PAGE_MAPPING_ANON; |
| 1575 | page->mapping = (struct address_space *) anon_vma; | 1576 | page->mapping = (struct address_space *) anon_vma; |
| 1576 | page->index = linear_page_index(vma, address); | 1577 | page->index = linear_page_index(vma, address); |
| @@ -1581,6 +1582,8 @@ void hugepage_add_anon_rmap(struct page *page, | |||
| 1581 | { | 1582 | { |
| 1582 | struct anon_vma *anon_vma = vma->anon_vma; | 1583 | struct anon_vma *anon_vma = vma->anon_vma; |
| 1583 | int first; | 1584 | int first; |
| 1585 | |||
| 1586 | BUG_ON(!PageLocked(page)); | ||
| 1584 | BUG_ON(!anon_vma); | 1587 | BUG_ON(!anon_vma); |
| 1585 | BUG_ON(address < vma->vm_start || address >= vma->vm_end); | 1588 | BUG_ON(address < vma->vm_start || address >= vma->vm_end); |
| 1586 | first = atomic_inc_and_test(&page->_mapcount); | 1589 | first = atomic_inc_and_test(&page->_mapcount); |
diff --git a/mm/vmscan.c b/mm/vmscan.c index c391c320dbaf..c5dfabf25f11 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c | |||
| @@ -1804,12 +1804,11 @@ static void shrink_zone(int priority, struct zone *zone, | |||
| 1804 | * If a zone is deemed to be full of pinned pages then just give it a light | 1804 | * If a zone is deemed to be full of pinned pages then just give it a light |
| 1805 | * scan then give up on it. | 1805 | * scan then give up on it. |
| 1806 | */ | 1806 | */ |
| 1807 | static bool shrink_zones(int priority, struct zonelist *zonelist, | 1807 | static void shrink_zones(int priority, struct zonelist *zonelist, |
| 1808 | struct scan_control *sc) | 1808 | struct scan_control *sc) |
| 1809 | { | 1809 | { |
| 1810 | struct zoneref *z; | 1810 | struct zoneref *z; |
| 1811 | struct zone *zone; | 1811 | struct zone *zone; |
| 1812 | bool all_unreclaimable = true; | ||
| 1813 | 1812 | ||
| 1814 | for_each_zone_zonelist_nodemask(zone, z, zonelist, | 1813 | for_each_zone_zonelist_nodemask(zone, z, zonelist, |
| 1815 | gfp_zone(sc->gfp_mask), sc->nodemask) { | 1814 | gfp_zone(sc->gfp_mask), sc->nodemask) { |
| @@ -1827,8 +1826,38 @@ static bool shrink_zones(int priority, struct zonelist *zonelist, | |||
| 1827 | } | 1826 | } |
| 1828 | 1827 | ||
| 1829 | shrink_zone(priority, zone, sc); | 1828 | shrink_zone(priority, zone, sc); |
| 1830 | all_unreclaimable = false; | ||
| 1831 | } | 1829 | } |
| 1830 | } | ||
| 1831 | |||
| 1832 | static bool zone_reclaimable(struct zone *zone) | ||
| 1833 | { | ||
| 1834 | return zone->pages_scanned < zone_reclaimable_pages(zone) * 6; | ||
| 1835 | } | ||
| 1836 | |||
| 1837 | /* | ||
| 1838 | * As hibernation is going on, kswapd is freezed so that it can't mark | ||
| 1839 | * the zone into all_unreclaimable. It can't handle OOM during hibernation. | ||
| 1840 | * So let's check zone's unreclaimable in direct reclaim as well as kswapd. | ||
| 1841 | */ | ||
| 1842 | static bool all_unreclaimable(struct zonelist *zonelist, | ||
| 1843 | struct scan_control *sc) | ||
| 1844 | { | ||
| 1845 | struct zoneref *z; | ||
| 1846 | struct zone *zone; | ||
| 1847 | bool all_unreclaimable = true; | ||
| 1848 | |||
| 1849 | for_each_zone_zonelist_nodemask(zone, z, zonelist, | ||
| 1850 | gfp_zone(sc->gfp_mask), sc->nodemask) { | ||
| 1851 | if (!populated_zone(zone)) | ||
| 1852 | continue; | ||
| 1853 | if (!cpuset_zone_allowed_hardwall(zone, GFP_KERNEL)) | ||
| 1854 | continue; | ||
| 1855 | if (zone_reclaimable(zone)) { | ||
| 1856 | all_unreclaimable = false; | ||
| 1857 | break; | ||
| 1858 | } | ||
| 1859 | } | ||
| 1860 | |||
| 1832 | return all_unreclaimable; | 1861 | return all_unreclaimable; |
| 1833 | } | 1862 | } |
| 1834 | 1863 | ||
| @@ -1852,7 +1881,6 @@ static unsigned long do_try_to_free_pages(struct zonelist *zonelist, | |||
| 1852 | struct scan_control *sc) | 1881 | struct scan_control *sc) |
| 1853 | { | 1882 | { |
| 1854 | int priority; | 1883 | int priority; |
| 1855 | bool all_unreclaimable; | ||
| 1856 | unsigned long total_scanned = 0; | 1884 | unsigned long total_scanned = 0; |
| 1857 | struct reclaim_state *reclaim_state = current->reclaim_state; | 1885 | struct reclaim_state *reclaim_state = current->reclaim_state; |
| 1858 | struct zoneref *z; | 1886 | struct zoneref *z; |
| @@ -1869,7 +1897,7 @@ static unsigned long do_try_to_free_pages(struct zonelist *zonelist, | |||
| 1869 | sc->nr_scanned = 0; | 1897 | sc->nr_scanned = 0; |
| 1870 | if (!priority) | 1898 | if (!priority) |
| 1871 | disable_swap_token(); | 1899 | disable_swap_token(); |
| 1872 | all_unreclaimable = shrink_zones(priority, zonelist, sc); | 1900 | shrink_zones(priority, zonelist, sc); |
| 1873 | /* | 1901 | /* |
| 1874 | * Don't shrink slabs when reclaiming memory from | 1902 | * Don't shrink slabs when reclaiming memory from |
| 1875 | * over limit cgroups | 1903 | * over limit cgroups |
| @@ -1931,7 +1959,7 @@ out: | |||
| 1931 | return sc->nr_reclaimed; | 1959 | return sc->nr_reclaimed; |
| 1932 | 1960 | ||
| 1933 | /* top priority shrink_zones still had more to do? don't OOM, then */ | 1961 | /* top priority shrink_zones still had more to do? don't OOM, then */ |
| 1934 | if (scanning_global_lru(sc) && !all_unreclaimable) | 1962 | if (scanning_global_lru(sc) && !all_unreclaimable(zonelist, sc)) |
| 1935 | return 1; | 1963 | return 1; |
| 1936 | 1964 | ||
| 1937 | return 0; | 1965 | return 0; |
| @@ -2197,8 +2225,7 @@ loop_again: | |||
| 2197 | total_scanned += sc.nr_scanned; | 2225 | total_scanned += sc.nr_scanned; |
| 2198 | if (zone->all_unreclaimable) | 2226 | if (zone->all_unreclaimable) |
| 2199 | continue; | 2227 | continue; |
| 2200 | if (nr_slab == 0 && | 2228 | if (nr_slab == 0 && !zone_reclaimable(zone)) |
| 2201 | zone->pages_scanned >= (zone_reclaimable_pages(zone) * 6)) | ||
| 2202 | zone->all_unreclaimable = 1; | 2229 | zone->all_unreclaimable = 1; |
| 2203 | /* | 2230 | /* |
| 2204 | * If we've done a decent amount of scanning and | 2231 | * If we've done a decent amount of scanning and |
diff --git a/sound/pci/hda/patch_analog.c b/sound/pci/hda/patch_analog.c index b697fd2a6f8b..10bbbaf6ebc3 100644 --- a/sound/pci/hda/patch_analog.c +++ b/sound/pci/hda/patch_analog.c | |||
| @@ -3641,6 +3641,7 @@ static struct snd_pci_quirk ad1984_cfg_tbl[] = { | |||
| 3641 | /* Lenovo Thinkpad T61/X61 */ | 3641 | /* Lenovo Thinkpad T61/X61 */ |
| 3642 | SND_PCI_QUIRK_VENDOR(0x17aa, "Lenovo Thinkpad", AD1984_THINKPAD), | 3642 | SND_PCI_QUIRK_VENDOR(0x17aa, "Lenovo Thinkpad", AD1984_THINKPAD), |
| 3643 | SND_PCI_QUIRK(0x1028, 0x0214, "Dell T3400", AD1984_DELL_DESKTOP), | 3643 | SND_PCI_QUIRK(0x1028, 0x0214, "Dell T3400", AD1984_DELL_DESKTOP), |
| 3644 | SND_PCI_QUIRK(0x1028, 0x0233, "Dell Latitude E6400", AD1984_DELL_DESKTOP), | ||
| 3644 | {} | 3645 | {} |
| 3645 | }; | 3646 | }; |
| 3646 | 3647 | ||
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index a1312a6c8af2..a432e6efd19b 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
| @@ -1594,12 +1594,22 @@ static void alc_auto_parse_digital(struct hda_codec *codec) | |||
| 1594 | } | 1594 | } |
| 1595 | 1595 | ||
| 1596 | if (spec->autocfg.dig_in_pin) { | 1596 | if (spec->autocfg.dig_in_pin) { |
| 1597 | hda_nid_t dig_nid; | 1597 | dig_nid = codec->start_nid; |
| 1598 | err = snd_hda_get_connections(codec, | 1598 | for (i = 0; i < codec->num_nodes; i++, dig_nid++) { |
| 1599 | spec->autocfg.dig_in_pin, | 1599 | unsigned int wcaps = get_wcaps(codec, dig_nid); |
| 1600 | &dig_nid, 1); | 1600 | if (get_wcaps_type(wcaps) != AC_WID_AUD_IN) |
| 1601 | if (err > 0) | 1601 | continue; |
| 1602 | spec->dig_in_nid = dig_nid; | 1602 | if (!(wcaps & AC_WCAP_DIGITAL)) |
| 1603 | continue; | ||
| 1604 | if (!(wcaps & AC_WCAP_CONN_LIST)) | ||
| 1605 | continue; | ||
| 1606 | err = get_connection_index(codec, dig_nid, | ||
| 1607 | spec->autocfg.dig_in_pin); | ||
| 1608 | if (err >= 0) { | ||
| 1609 | spec->dig_in_nid = dig_nid; | ||
| 1610 | break; | ||
| 1611 | } | ||
| 1612 | } | ||
| 1603 | } | 1613 | } |
| 1604 | } | 1614 | } |
| 1605 | 1615 | ||
diff --git a/sound/pci/oxygen/oxygen.c b/sound/pci/oxygen/oxygen.c index 289cb4dacfc7..6c0a11adb2a8 100644 --- a/sound/pci/oxygen/oxygen.c +++ b/sound/pci/oxygen/oxygen.c | |||
| @@ -543,6 +543,10 @@ static int __devinit get_oxygen_model(struct oxygen *chip, | |||
| 543 | chip->model.suspend = claro_suspend; | 543 | chip->model.suspend = claro_suspend; |
| 544 | chip->model.resume = claro_resume; | 544 | chip->model.resume = claro_resume; |
| 545 | chip->model.set_adc_params = set_ak5385_params; | 545 | chip->model.set_adc_params = set_ak5385_params; |
| 546 | chip->model.device_config = PLAYBACK_0_TO_I2S | | ||
| 547 | PLAYBACK_1_TO_SPDIF | | ||
| 548 | CAPTURE_0_FROM_I2S_2 | | ||
| 549 | CAPTURE_1_FROM_SPDIF; | ||
| 546 | break; | 550 | break; |
| 547 | } | 551 | } |
| 548 | if (id->driver_data == MODEL_MERIDIAN || | 552 | if (id->driver_data == MODEL_MERIDIAN || |
diff --git a/sound/pci/rme9652/hdsp.c b/sound/pci/rme9652/hdsp.c index b92adef8e81e..d6fa7bfd9aa1 100644 --- a/sound/pci/rme9652/hdsp.c +++ b/sound/pci/rme9652/hdsp.c | |||
| @@ -4609,6 +4609,7 @@ static int snd_hdsp_hwdep_ioctl(struct snd_hwdep *hw, struct file *file, unsigne | |||
| 4609 | if (err < 0) | 4609 | if (err < 0) |
| 4610 | return err; | 4610 | return err; |
| 4611 | 4611 | ||
| 4612 | memset(&info, 0, sizeof(info)); | ||
| 4612 | spin_lock_irqsave(&hdsp->lock, flags); | 4613 | spin_lock_irqsave(&hdsp->lock, flags); |
| 4613 | info.pref_sync_ref = (unsigned char)hdsp_pref_sync_ref(hdsp); | 4614 | info.pref_sync_ref = (unsigned char)hdsp_pref_sync_ref(hdsp); |
| 4614 | info.wordclock_sync_check = (unsigned char)hdsp_wc_sync_check(hdsp); | 4615 | info.wordclock_sync_check = (unsigned char)hdsp_wc_sync_check(hdsp); |
diff --git a/sound/pci/rme9652/hdspm.c b/sound/pci/rme9652/hdspm.c index 547b713d7204..0c98ef9156d8 100644 --- a/sound/pci/rme9652/hdspm.c +++ b/sound/pci/rme9652/hdspm.c | |||
| @@ -4127,6 +4127,7 @@ static int snd_hdspm_hwdep_ioctl(struct snd_hwdep * hw, struct file *file, | |||
| 4127 | 4127 | ||
| 4128 | case SNDRV_HDSPM_IOCTL_GET_CONFIG_INFO: | 4128 | case SNDRV_HDSPM_IOCTL_GET_CONFIG_INFO: |
| 4129 | 4129 | ||
| 4130 | memset(&info, 0, sizeof(info)); | ||
| 4130 | spin_lock_irq(&hdspm->lock); | 4131 | spin_lock_irq(&hdspm->lock); |
| 4131 | info.pref_sync_ref = hdspm_pref_sync_ref(hdspm); | 4132 | info.pref_sync_ref = hdspm_pref_sync_ref(hdspm); |
| 4132 | info.wordclock_sync_check = hdspm_wc_sync_check(hdspm); | 4133 | info.wordclock_sync_check = hdspm_wc_sync_check(hdspm); |
diff --git a/sound/soc/sh/migor.c b/sound/soc/sh/migor.c index b823a5c9b9bc..87e2b7fcbf17 100644 --- a/sound/soc/sh/migor.c +++ b/sound/soc/sh/migor.c | |||
| @@ -12,6 +12,7 @@ | |||
| 12 | #include <linux/firmware.h> | 12 | #include <linux/firmware.h> |
| 13 | #include <linux/module.h> | 13 | #include <linux/module.h> |
| 14 | 14 | ||
| 15 | #include <asm/clkdev.h> | ||
| 15 | #include <asm/clock.h> | 16 | #include <asm/clock.h> |
| 16 | 17 | ||
| 17 | #include <cpu/sh7722.h> | 18 | #include <cpu/sh7722.h> |
| @@ -40,12 +41,12 @@ static struct clk_ops siumckb_clk_ops = { | |||
| 40 | }; | 41 | }; |
| 41 | 42 | ||
| 42 | static struct clk siumckb_clk = { | 43 | static struct clk siumckb_clk = { |
| 43 | .name = "siumckb_clk", | ||
| 44 | .id = -1, | ||
| 45 | .ops = &siumckb_clk_ops, | 44 | .ops = &siumckb_clk_ops, |
| 46 | .rate = 0, /* initialised at run-time */ | 45 | .rate = 0, /* initialised at run-time */ |
| 47 | }; | 46 | }; |
| 48 | 47 | ||
| 48 | static struct clk_lookup *siumckb_lookup; | ||
| 49 | |||
| 49 | static int migor_hw_params(struct snd_pcm_substream *substream, | 50 | static int migor_hw_params(struct snd_pcm_substream *substream, |
| 50 | struct snd_pcm_hw_params *params) | 51 | struct snd_pcm_hw_params *params) |
| 51 | { | 52 | { |
| @@ -180,6 +181,13 @@ static int __init migor_init(void) | |||
| 180 | if (ret < 0) | 181 | if (ret < 0) |
| 181 | return ret; | 182 | return ret; |
| 182 | 183 | ||
| 184 | siumckb_lookup = clkdev_alloc(&siumckb_clk, "siumckb_clk", NULL); | ||
| 185 | if (!siumckb_lookup) { | ||
| 186 | ret = -ENOMEM; | ||
| 187 | goto eclkdevalloc; | ||
| 188 | } | ||
| 189 | clkdev_add(siumckb_lookup); | ||
| 190 | |||
| 183 | /* Port number used on this machine: port B */ | 191 | /* Port number used on this machine: port B */ |
| 184 | migor_snd_device = platform_device_alloc("soc-audio", 1); | 192 | migor_snd_device = platform_device_alloc("soc-audio", 1); |
| 185 | if (!migor_snd_device) { | 193 | if (!migor_snd_device) { |
| @@ -200,12 +208,15 @@ static int __init migor_init(void) | |||
| 200 | epdevadd: | 208 | epdevadd: |
| 201 | platform_device_put(migor_snd_device); | 209 | platform_device_put(migor_snd_device); |
| 202 | epdevalloc: | 210 | epdevalloc: |
| 211 | clkdev_drop(siumckb_lookup); | ||
| 212 | eclkdevalloc: | ||
| 203 | clk_unregister(&siumckb_clk); | 213 | clk_unregister(&siumckb_clk); |
| 204 | return ret; | 214 | return ret; |
| 205 | } | 215 | } |
| 206 | 216 | ||
| 207 | static void __exit migor_exit(void) | 217 | static void __exit migor_exit(void) |
| 208 | { | 218 | { |
| 219 | clkdev_drop(siumckb_lookup); | ||
| 209 | clk_unregister(&siumckb_clk); | 220 | clk_unregister(&siumckb_clk); |
| 210 | platform_device_unregister(migor_snd_device); | 221 | platform_device_unregister(migor_snd_device); |
| 211 | } | 222 | } |
diff --git a/sound/soc/soc-cache.c b/sound/soc/soc-cache.c index adbc68ce9050..f6b0d2829ea9 100644 --- a/sound/soc/soc-cache.c +++ b/sound/soc/soc-cache.c | |||
| @@ -203,8 +203,9 @@ static int snd_soc_8_16_write(struct snd_soc_codec *codec, unsigned int reg, | |||
| 203 | data[1] = (value >> 8) & 0xff; | 203 | data[1] = (value >> 8) & 0xff; |
| 204 | data[2] = value & 0xff; | 204 | data[2] = value & 0xff; |
| 205 | 205 | ||
| 206 | if (!snd_soc_codec_volatile_register(codec, reg)) | 206 | if (!snd_soc_codec_volatile_register(codec, reg) |
| 207 | reg_cache[reg] = value; | 207 | && reg < codec->reg_cache_size) |
| 208 | reg_cache[reg] = value; | ||
| 208 | 209 | ||
| 209 | if (codec->cache_only) { | 210 | if (codec->cache_only) { |
| 210 | codec->cache_sync = 1; | 211 | codec->cache_sync = 1; |
diff --git a/virt/kvm/eventfd.c b/virt/kvm/eventfd.c index 66cf65b510b1..c1f1e3c62984 100644 --- a/virt/kvm/eventfd.c +++ b/virt/kvm/eventfd.c | |||
| @@ -218,7 +218,6 @@ kvm_irqfd_assign(struct kvm *kvm, int fd, int gsi) | |||
| 218 | events = file->f_op->poll(file, &irqfd->pt); | 218 | events = file->f_op->poll(file, &irqfd->pt); |
| 219 | 219 | ||
| 220 | list_add_tail(&irqfd->list, &kvm->irqfds.items); | 220 | list_add_tail(&irqfd->list, &kvm->irqfds.items); |
| 221 | spin_unlock_irq(&kvm->irqfds.lock); | ||
| 222 | 221 | ||
| 223 | /* | 222 | /* |
| 224 | * Check if there was an event already pending on the eventfd | 223 | * Check if there was an event already pending on the eventfd |
| @@ -227,6 +226,8 @@ kvm_irqfd_assign(struct kvm *kvm, int fd, int gsi) | |||
| 227 | if (events & POLLIN) | 226 | if (events & POLLIN) |
| 228 | schedule_work(&irqfd->inject); | 227 | schedule_work(&irqfd->inject); |
| 229 | 228 | ||
| 229 | spin_unlock_irq(&kvm->irqfds.lock); | ||
| 230 | |||
| 230 | /* | 231 | /* |
| 231 | * do not drop the file until the irqfd is fully initialized, otherwise | 232 | * do not drop the file until the irqfd is fully initialized, otherwise |
| 232 | * we might race against the POLLHUP | 233 | * we might race against the POLLHUP |
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index d4853a54771a..5186e728c53e 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c | |||
| @@ -1970,10 +1970,12 @@ static int kvm_cpu_hotplug(struct notifier_block *notifier, unsigned long val, | |||
| 1970 | 1970 | ||
| 1971 | asmlinkage void kvm_handle_fault_on_reboot(void) | 1971 | asmlinkage void kvm_handle_fault_on_reboot(void) |
| 1972 | { | 1972 | { |
| 1973 | if (kvm_rebooting) | 1973 | if (kvm_rebooting) { |
| 1974 | /* spin while reset goes on */ | 1974 | /* spin while reset goes on */ |
| 1975 | local_irq_enable(); | ||
| 1975 | while (true) | 1976 | while (true) |
| 1976 | ; | 1977 | ; |
| 1978 | } | ||
| 1977 | /* Fault while not rebooting. We want the trace. */ | 1979 | /* Fault while not rebooting. We want the trace. */ |
| 1978 | BUG(); | 1980 | BUG(); |
| 1979 | } | 1981 | } |
