diff options
232 files changed, 2344 insertions, 1586 deletions
diff --git a/Documentation/filesystems/9p.txt b/Documentation/filesystems/9p.txt index bf8080640eba..6208f55c44c3 100644 --- a/Documentation/filesystems/9p.txt +++ b/Documentation/filesystems/9p.txt | |||
| @@ -123,6 +123,9 @@ available from the same CVS repository. | |||
| 123 | There are user and developer mailing lists available through the v9fs project | 123 | There are user and developer mailing lists available through the v9fs project |
| 124 | on sourceforge (http://sourceforge.net/projects/v9fs). | 124 | on sourceforge (http://sourceforge.net/projects/v9fs). |
| 125 | 125 | ||
| 126 | A stand-alone version of the module (which should build for any 2.6 kernel) | ||
| 127 | is available via (http://github.com/ericvh/9p-sac/tree/master) | ||
| 128 | |||
| 126 | News and other information is maintained on SWiK (http://swik.net/v9fs). | 129 | News and other information is maintained on SWiK (http://swik.net/v9fs). |
| 127 | 130 | ||
| 128 | Bug reports may be issued through the kernel.org bugzilla | 131 | Bug reports may be issued through the kernel.org bugzilla |
diff --git a/MAINTAINERS b/MAINTAINERS index 60299a9a7adb..8dca9d89c6c1 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -2239,8 +2239,7 @@ S: Maintained | |||
| 2239 | F: drivers/media/video/gspca/pac207.c | 2239 | F: drivers/media/video/gspca/pac207.c |
| 2240 | 2240 | ||
| 2241 | GSPCA SN9C20X SUBDRIVER | 2241 | GSPCA SN9C20X SUBDRIVER |
| 2242 | P: Brian Johnson | 2242 | M: Brian Johnson <brijohn@gmail.com> |
| 2243 | M: brijohn@gmail.com | ||
| 2244 | L: linux-media@vger.kernel.org | 2243 | L: linux-media@vger.kernel.org |
| 2245 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git | 2244 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git |
| 2246 | S: Maintained | 2245 | S: Maintained |
| @@ -1,7 +1,7 @@ | |||
| 1 | VERSION = 2 | 1 | VERSION = 2 |
| 2 | PATCHLEVEL = 6 | 2 | PATCHLEVEL = 6 |
| 3 | SUBLEVEL = 31 | 3 | SUBLEVEL = 31 |
| 4 | EXTRAVERSION = -rc7 | 4 | EXTRAVERSION = -rc9 |
| 5 | NAME = Man-Eating Seals of Antiquity | 5 | NAME = Man-Eating Seals of Antiquity |
| 6 | 6 | ||
| 7 | # *DOCUMENTATION* | 7 | # *DOCUMENTATION* |
diff --git a/arch/arm/configs/kirkwood_defconfig b/arch/arm/configs/kirkwood_defconfig index 0a1abb978d7e..af74cc2de8b6 100644 --- a/arch/arm/configs/kirkwood_defconfig +++ b/arch/arm/configs/kirkwood_defconfig | |||
| @@ -629,7 +629,7 @@ CONFIG_SCSI_LOWLEVEL=y | |||
| 629 | CONFIG_ATA=y | 629 | CONFIG_ATA=y |
| 630 | # CONFIG_ATA_NONSTANDARD is not set | 630 | # CONFIG_ATA_NONSTANDARD is not set |
| 631 | CONFIG_SATA_PMP=y | 631 | CONFIG_SATA_PMP=y |
| 632 | # CONFIG_SATA_AHCI is not set | 632 | CONFIG_SATA_AHCI=y |
| 633 | # CONFIG_SATA_SIL24 is not set | 633 | # CONFIG_SATA_SIL24 is not set |
| 634 | CONFIG_ATA_SFF=y | 634 | CONFIG_ATA_SFF=y |
| 635 | # CONFIG_SATA_SVW is not set | 635 | # CONFIG_SATA_SVW is not set |
diff --git a/arch/arm/mach-kirkwood/ts219-setup.c b/arch/arm/mach-kirkwood/ts219-setup.c index 01aa213c0a6f..ec1a64f263d2 100644 --- a/arch/arm/mach-kirkwood/ts219-setup.c +++ b/arch/arm/mach-kirkwood/ts219-setup.c | |||
| @@ -206,6 +206,15 @@ static void __init qnap_ts219_init(void) | |||
| 206 | 206 | ||
| 207 | } | 207 | } |
| 208 | 208 | ||
| 209 | static int __init ts219_pci_init(void) | ||
| 210 | { | ||
| 211 | if (machine_is_ts219()) | ||
| 212 | kirkwood_pcie_init(); | ||
| 213 | |||
| 214 | return 0; | ||
| 215 | } | ||
| 216 | subsys_initcall(ts219_pci_init); | ||
| 217 | |||
| 209 | MACHINE_START(TS219, "QNAP TS-119/TS-219") | 218 | MACHINE_START(TS219, "QNAP TS-119/TS-219") |
| 210 | /* Maintainer: Martin Michlmayr <tbm@cyrius.com> */ | 219 | /* Maintainer: Martin Michlmayr <tbm@cyrius.com> */ |
| 211 | .phys_io = KIRKWOOD_REGS_PHYS_BASE, | 220 | .phys_io = KIRKWOOD_REGS_PHYS_BASE, |
diff --git a/arch/arm/plat-orion/include/plat/gpio.h b/arch/arm/plat-orion/include/plat/gpio.h index 9646a94ed3d0..07c430fdc9ef 100644 --- a/arch/arm/plat-orion/include/plat/gpio.h +++ b/arch/arm/plat-orion/include/plat/gpio.h | |||
| @@ -11,6 +11,8 @@ | |||
| 11 | #ifndef __PLAT_GPIO_H | 11 | #ifndef __PLAT_GPIO_H |
| 12 | #define __PLAT_GPIO_H | 12 | #define __PLAT_GPIO_H |
| 13 | 13 | ||
| 14 | #include <linux/init.h> | ||
| 15 | |||
| 14 | /* | 16 | /* |
| 15 | * GENERIC_GPIO primitives. | 17 | * GENERIC_GPIO primitives. |
| 16 | */ | 18 | */ |
diff --git a/arch/avr32/boards/favr-32/setup.c b/arch/avr32/boards/favr-32/setup.c index 46c9b0a224cf..75f19f47fb2f 100644 --- a/arch/avr32/boards/favr-32/setup.c +++ b/arch/avr32/boards/favr-32/setup.c | |||
| @@ -72,6 +72,10 @@ static struct ads7846_platform_data ads7843_data = { | |||
| 72 | .debounce_max = 20, | 72 | .debounce_max = 20, |
| 73 | .debounce_rep = 4, | 73 | .debounce_rep = 4, |
| 74 | .debounce_tol = 5, | 74 | .debounce_tol = 5, |
| 75 | |||
| 76 | .keep_vref_on = true, | ||
| 77 | .settle_delay_usecs = 500, | ||
| 78 | .penirq_recheck_delay_usecs = 100, | ||
| 75 | }; | 79 | }; |
| 76 | 80 | ||
| 77 | static struct spi_board_info __initdata spi1_board_info[] = { | 81 | static struct spi_board_info __initdata spi1_board_info[] = { |
diff --git a/arch/avr32/lib/memcpy.S b/arch/avr32/lib/memcpy.S index 0abb26142b64..c2ca49d705af 100644 --- a/arch/avr32/lib/memcpy.S +++ b/arch/avr32/lib/memcpy.S | |||
| @@ -24,8 +24,8 @@ memcpy: | |||
| 24 | brne 1f | 24 | brne 1f |
| 25 | 25 | ||
| 26 | /* At this point, "from" is word-aligned */ | 26 | /* At this point, "from" is word-aligned */ |
| 27 | 2: sub r10, 4 | 27 | 2: mov r9, r12 |
| 28 | mov r9, r12 | 28 | 5: sub r10, 4 |
| 29 | brlt 4f | 29 | brlt 4f |
| 30 | 30 | ||
| 31 | 3: ld.w r8, r11++ | 31 | 3: ld.w r8, r11++ |
| @@ -49,6 +49,7 @@ memcpy: | |||
| 49 | 49 | ||
| 50 | /* Handle unaligned "from" pointer */ | 50 | /* Handle unaligned "from" pointer */ |
| 51 | 1: sub r10, 4 | 51 | 1: sub r10, 4 |
| 52 | movlt r9, r12 | ||
| 52 | brlt 4b | 53 | brlt 4b |
| 53 | add r10, r9 | 54 | add r10, r9 |
| 54 | lsl r9, 2 | 55 | lsl r9, 2 |
| @@ -59,4 +60,13 @@ memcpy: | |||
| 59 | st.b r12++, r8 | 60 | st.b r12++, r8 |
| 60 | ld.ub r8, r11++ | 61 | ld.ub r8, r11++ |
| 61 | st.b r12++, r8 | 62 | st.b r12++, r8 |
| 62 | rjmp 2b | 63 | mov r8, r12 |
| 64 | add pc, pc, r9 | ||
| 65 | sub r8, 1 | ||
| 66 | nop | ||
| 67 | sub r8, 1 | ||
| 68 | nop | ||
| 69 | sub r8, 1 | ||
| 70 | nop | ||
| 71 | mov r9, r8 | ||
| 72 | rjmp 5b | ||
diff --git a/arch/ia64/kernel/dma-mapping.c b/arch/ia64/kernel/dma-mapping.c index 39a3cd0a4173..f2c1600da097 100644 --- a/arch/ia64/kernel/dma-mapping.c +++ b/arch/ia64/kernel/dma-mapping.c | |||
| @@ -10,7 +10,9 @@ EXPORT_SYMBOL(dma_ops); | |||
| 10 | 10 | ||
| 11 | static int __init dma_init(void) | 11 | static int __init dma_init(void) |
| 12 | { | 12 | { |
| 13 | dma_debug_init(PREALLOC_DMA_DEBUG_ENTRIES); | 13 | dma_debug_init(PREALLOC_DMA_DEBUG_ENTRIES); |
| 14 | |||
| 15 | return 0; | ||
| 14 | } | 16 | } |
| 15 | fs_initcall(dma_init); | 17 | fs_initcall(dma_init); |
| 16 | 18 | ||
diff --git a/arch/ia64/lib/ip_fast_csum.S b/arch/ia64/lib/ip_fast_csum.S index 1f86aeb2c948..620d9dc5220f 100644 --- a/arch/ia64/lib/ip_fast_csum.S +++ b/arch/ia64/lib/ip_fast_csum.S | |||
| @@ -96,20 +96,22 @@ END(ip_fast_csum) | |||
| 96 | GLOBAL_ENTRY(csum_ipv6_magic) | 96 | GLOBAL_ENTRY(csum_ipv6_magic) |
| 97 | ld4 r20=[in0],4 | 97 | ld4 r20=[in0],4 |
| 98 | ld4 r21=[in1],4 | 98 | ld4 r21=[in1],4 |
| 99 | dep r15=in3,in2,32,16 | 99 | zxt4 in2=in2 |
| 100 | ;; | 100 | ;; |
| 101 | ld4 r22=[in0],4 | 101 | ld4 r22=[in0],4 |
| 102 | ld4 r23=[in1],4 | 102 | ld4 r23=[in1],4 |
| 103 | mux1 r15=r15,@rev | 103 | dep r15=in3,in2,32,16 |
| 104 | ;; | 104 | ;; |
| 105 | ld4 r24=[in0],4 | 105 | ld4 r24=[in0],4 |
| 106 | ld4 r25=[in1],4 | 106 | ld4 r25=[in1],4 |
| 107 | shr.u r15=r15,16 | 107 | mux1 r15=r15,@rev |
| 108 | add r16=r20,r21 | 108 | add r16=r20,r21 |
| 109 | add r17=r22,r23 | 109 | add r17=r22,r23 |
| 110 | zxt4 in4=in4 | ||
| 110 | ;; | 111 | ;; |
| 111 | ld4 r26=[in0],4 | 112 | ld4 r26=[in0],4 |
| 112 | ld4 r27=[in1],4 | 113 | ld4 r27=[in1],4 |
| 114 | shr.u r15=r15,16 | ||
| 113 | add r18=r24,r25 | 115 | add r18=r24,r25 |
| 114 | add r8=r16,r17 | 116 | add r8=r16,r17 |
| 115 | ;; | 117 | ;; |
diff --git a/arch/m68k/amiga/config.c b/arch/m68k/amiga/config.c index 6e562751ad51..6c74751c7b82 100644 --- a/arch/m68k/amiga/config.c +++ b/arch/m68k/amiga/config.c | |||
| @@ -574,10 +574,11 @@ static int a2000_hwclk(int op, struct rtc_time *t) | |||
| 574 | 574 | ||
| 575 | tod_2000.cntrl1 = TOD2000_CNTRL1_HOLD; | 575 | tod_2000.cntrl1 = TOD2000_CNTRL1_HOLD; |
| 576 | 576 | ||
| 577 | while ((tod_2000.cntrl1 & TOD2000_CNTRL1_BUSY) && cnt--) { | 577 | while ((tod_2000.cntrl1 & TOD2000_CNTRL1_BUSY) && cnt) { |
| 578 | tod_2000.cntrl1 &= ~TOD2000_CNTRL1_HOLD; | 578 | tod_2000.cntrl1 &= ~TOD2000_CNTRL1_HOLD; |
| 579 | udelay(70); | 579 | udelay(70); |
| 580 | tod_2000.cntrl1 |= TOD2000_CNTRL1_HOLD; | 580 | tod_2000.cntrl1 |= TOD2000_CNTRL1_HOLD; |
| 581 | --cnt; | ||
| 581 | } | 582 | } |
| 582 | 583 | ||
| 583 | if (!cnt) | 584 | if (!cnt) |
| @@ -649,10 +650,11 @@ static int amiga_set_clock_mmss(unsigned long nowtime) | |||
| 649 | 650 | ||
| 650 | tod_2000.cntrl1 |= TOD2000_CNTRL1_HOLD; | 651 | tod_2000.cntrl1 |= TOD2000_CNTRL1_HOLD; |
| 651 | 652 | ||
| 652 | while ((tod_2000.cntrl1 & TOD2000_CNTRL1_BUSY) && cnt--) { | 653 | while ((tod_2000.cntrl1 & TOD2000_CNTRL1_BUSY) && cnt) { |
| 653 | tod_2000.cntrl1 &= ~TOD2000_CNTRL1_HOLD; | 654 | tod_2000.cntrl1 &= ~TOD2000_CNTRL1_HOLD; |
| 654 | udelay(70); | 655 | udelay(70); |
| 655 | tod_2000.cntrl1 |= TOD2000_CNTRL1_HOLD; | 656 | tod_2000.cntrl1 |= TOD2000_CNTRL1_HOLD; |
| 657 | --cnt; | ||
| 656 | } | 658 | } |
| 657 | 659 | ||
| 658 | if (!cnt) | 660 | if (!cnt) |
diff --git a/arch/m68k/include/asm/motorola_pgalloc.h b/arch/m68k/include/asm/motorola_pgalloc.h index 15ee4c74a9f0..2f02f264e694 100644 --- a/arch/m68k/include/asm/motorola_pgalloc.h +++ b/arch/m68k/include/asm/motorola_pgalloc.h | |||
| @@ -36,12 +36,10 @@ static inline pgtable_t pte_alloc_one(struct mm_struct *mm, unsigned long addres | |||
| 36 | return NULL; | 36 | return NULL; |
| 37 | 37 | ||
| 38 | pte = kmap(page); | 38 | pte = kmap(page); |
| 39 | if (pte) { | 39 | __flush_page_to_ram(pte); |
| 40 | __flush_page_to_ram(pte); | 40 | flush_tlb_kernel_page(pte); |
| 41 | flush_tlb_kernel_page(pte); | 41 | nocache_page(pte); |
| 42 | nocache_page(pte); | 42 | kunmap(page); |
| 43 | } | ||
| 44 | kunmap(pte); | ||
| 45 | pgtable_page_ctor(page); | 43 | pgtable_page_ctor(page); |
| 46 | return page; | 44 | return page; |
| 47 | } | 45 | } |
diff --git a/arch/m68k/include/asm/pgtable_mm.h b/arch/m68k/include/asm/pgtable_mm.h index 0b604f0f192d..fe60e1abaee8 100644 --- a/arch/m68k/include/asm/pgtable_mm.h +++ b/arch/m68k/include/asm/pgtable_mm.h | |||
| @@ -135,8 +135,6 @@ static inline void update_mmu_cache(struct vm_area_struct *vma, | |||
| 135 | #endif | 135 | #endif |
| 136 | 136 | ||
| 137 | #ifndef __ASSEMBLY__ | 137 | #ifndef __ASSEMBLY__ |
| 138 | #include <asm-generic/pgtable.h> | ||
| 139 | |||
| 140 | /* | 138 | /* |
| 141 | * Macro to mark a page protection value as "uncacheable". | 139 | * Macro to mark a page protection value as "uncacheable". |
| 142 | */ | 140 | */ |
| @@ -154,6 +152,7 @@ static inline void update_mmu_cache(struct vm_area_struct *vma, | |||
| 154 | ? (__pgprot((pgprot_val(prot) & _CACHEMASK040) | _PAGE_NOCACHE_S)) \ | 152 | ? (__pgprot((pgprot_val(prot) & _CACHEMASK040) | _PAGE_NOCACHE_S)) \ |
| 155 | : (prot))) | 153 | : (prot))) |
| 156 | 154 | ||
| 155 | #include <asm-generic/pgtable.h> | ||
| 157 | #endif /* !__ASSEMBLY__ */ | 156 | #endif /* !__ASSEMBLY__ */ |
| 158 | 157 | ||
| 159 | /* | 158 | /* |
diff --git a/arch/m68k/include/asm/unistd.h b/arch/m68k/include/asm/unistd.h index aa29a8640f74..946d8691f2b0 100644 --- a/arch/m68k/include/asm/unistd.h +++ b/arch/m68k/include/asm/unistd.h | |||
| @@ -334,10 +334,12 @@ | |||
| 334 | #define __NR_inotify_init1 328 | 334 | #define __NR_inotify_init1 328 |
| 335 | #define __NR_preadv 329 | 335 | #define __NR_preadv 329 |
| 336 | #define __NR_pwritev 330 | 336 | #define __NR_pwritev 330 |
| 337 | #define __NR_rt_tgsigqueueinfo 331 | ||
| 338 | #define __NR_perf_counter_open 332 | ||
| 337 | 339 | ||
| 338 | #ifdef __KERNEL__ | 340 | #ifdef __KERNEL__ |
| 339 | 341 | ||
| 340 | #define NR_syscalls 331 | 342 | #define NR_syscalls 333 |
| 341 | 343 | ||
| 342 | #define __ARCH_WANT_IPC_PARSE_VERSION | 344 | #define __ARCH_WANT_IPC_PARSE_VERSION |
| 343 | #define __ARCH_WANT_OLD_READDIR | 345 | #define __ARCH_WANT_OLD_READDIR |
diff --git a/arch/m68k/kernel/entry.S b/arch/m68k/kernel/entry.S index 8744f60c07a9..c3735cd6207e 100644 --- a/arch/m68k/kernel/entry.S +++ b/arch/m68k/kernel/entry.S | |||
| @@ -755,4 +755,6 @@ sys_call_table: | |||
| 755 | .long sys_inotify_init1 | 755 | .long sys_inotify_init1 |
| 756 | .long sys_preadv | 756 | .long sys_preadv |
| 757 | .long sys_pwritev /* 330 */ | 757 | .long sys_pwritev /* 330 */ |
| 758 | .long sys_rt_tgsigqueueinfo | ||
| 759 | .long sys_perf_counter_open | ||
| 758 | 760 | ||
diff --git a/arch/m68knommu/kernel/syscalltable.S b/arch/m68knommu/kernel/syscalltable.S index c0b8782832fd..0ae123e08985 100644 --- a/arch/m68knommu/kernel/syscalltable.S +++ b/arch/m68knommu/kernel/syscalltable.S | |||
| @@ -349,6 +349,8 @@ ENTRY(sys_call_table) | |||
| 349 | .long sys_inotify_init1 | 349 | .long sys_inotify_init1 |
| 350 | .long sys_preadv | 350 | .long sys_preadv |
| 351 | .long sys_pwritev /* 330 */ | 351 | .long sys_pwritev /* 330 */ |
| 352 | .long sys_rt_tgsigqueueinfo | ||
| 353 | .long sys_perf_counter_open | ||
| 352 | 354 | ||
| 353 | .rept NR_syscalls-(.-sys_call_table)/4 | 355 | .rept NR_syscalls-(.-sys_call_table)/4 |
| 354 | .long sys_ni_syscall | 356 | .long sys_ni_syscall |
diff --git a/arch/parisc/kernel/traps.c b/arch/parisc/kernel/traps.c index 528f0ff9b273..8b58bf0b7d5a 100644 --- a/arch/parisc/kernel/traps.c +++ b/arch/parisc/kernel/traps.c | |||
| @@ -532,7 +532,7 @@ void notrace handle_interruption(int code, struct pt_regs *regs) | |||
| 532 | /* Kill the user process later */ | 532 | /* Kill the user process later */ |
| 533 | regs->iaoq[0] = 0 | 3; | 533 | regs->iaoq[0] = 0 | 3; |
| 534 | regs->iaoq[1] = regs->iaoq[0] + 4; | 534 | regs->iaoq[1] = regs->iaoq[0] + 4; |
| 535 | regs->iasq[0] = regs->iasq[0] = regs->sr[7]; | 535 | regs->iasq[0] = regs->iasq[1] = regs->sr[7]; |
| 536 | regs->gr[0] &= ~PSW_B; | 536 | regs->gr[0] &= ~PSW_B; |
| 537 | return; | 537 | return; |
| 538 | } | 538 | } |
diff --git a/arch/powerpc/configs/ps3_defconfig b/arch/powerpc/configs/ps3_defconfig index e28e65e7a0e1..7de127e4ceef 100644 --- a/arch/powerpc/configs/ps3_defconfig +++ b/arch/powerpc/configs/ps3_defconfig | |||
| @@ -1,13 +1,14 @@ | |||
| 1 | # | 1 | # |
| 2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
| 3 | # Linux kernel version: 2.6.30-rc5 | 3 | # Linux kernel version: 2.6.31-rc7 |
| 4 | # Fri May 15 10:37:00 2009 | 4 | # Mon Aug 24 17:38:50 2009 |
| 5 | # | 5 | # |
| 6 | CONFIG_PPC64=y | 6 | CONFIG_PPC64=y |
| 7 | 7 | ||
| 8 | # | 8 | # |
| 9 | # Processor support | 9 | # Processor support |
| 10 | # | 10 | # |
| 11 | CONFIG_PPC_BOOK3S_64=y | ||
| 11 | CONFIG_PPC_BOOK3S=y | 12 | CONFIG_PPC_BOOK3S=y |
| 12 | # CONFIG_POWER4_ONLY is not set | 13 | # CONFIG_POWER4_ONLY is not set |
| 13 | CONFIG_POWER3=y | 14 | CONFIG_POWER3=y |
| @@ -20,6 +21,7 @@ CONFIG_PPC_STD_MMU=y | |||
| 20 | CONFIG_PPC_STD_MMU_64=y | 21 | CONFIG_PPC_STD_MMU_64=y |
| 21 | CONFIG_PPC_MM_SLICES=y | 22 | CONFIG_PPC_MM_SLICES=y |
| 22 | CONFIG_VIRT_CPU_ACCOUNTING=y | 23 | CONFIG_VIRT_CPU_ACCOUNTING=y |
| 24 | CONFIG_PPC_HAVE_PMU_SUPPORT=y | ||
| 23 | CONFIG_SMP=y | 25 | CONFIG_SMP=y |
| 24 | CONFIG_NR_CPUS=2 | 26 | CONFIG_NR_CPUS=2 |
| 25 | CONFIG_64BIT=y | 27 | CONFIG_64BIT=y |
| @@ -31,6 +33,7 @@ CONFIG_GENERIC_TIME=y | |||
| 31 | CONFIG_GENERIC_TIME_VSYSCALL=y | 33 | CONFIG_GENERIC_TIME_VSYSCALL=y |
| 32 | CONFIG_GENERIC_CLOCKEVENTS=y | 34 | CONFIG_GENERIC_CLOCKEVENTS=y |
| 33 | CONFIG_GENERIC_HARDIRQS=y | 35 | CONFIG_GENERIC_HARDIRQS=y |
| 36 | CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y | ||
| 34 | CONFIG_HAVE_SETUP_PER_CPU_AREA=y | 37 | CONFIG_HAVE_SETUP_PER_CPU_AREA=y |
| 35 | CONFIG_IRQ_PER_CPU=y | 38 | CONFIG_IRQ_PER_CPU=y |
| 36 | CONFIG_STACKTRACE_SUPPORT=y | 39 | CONFIG_STACKTRACE_SUPPORT=y |
| @@ -41,7 +44,6 @@ CONFIG_RWSEM_XCHGADD_ALGORITHM=y | |||
| 41 | CONFIG_ARCH_HAS_ILOG2_U32=y | 44 | CONFIG_ARCH_HAS_ILOG2_U32=y |
| 42 | CONFIG_ARCH_HAS_ILOG2_U64=y | 45 | CONFIG_ARCH_HAS_ILOG2_U64=y |
| 43 | CONFIG_GENERIC_HWEIGHT=y | 46 | CONFIG_GENERIC_HWEIGHT=y |
| 44 | CONFIG_GENERIC_CALIBRATE_DELAY=y | ||
| 45 | CONFIG_GENERIC_FIND_NEXT_BIT=y | 47 | CONFIG_GENERIC_FIND_NEXT_BIT=y |
| 46 | CONFIG_ARCH_NO_VIRT_TO_BUS=y | 48 | CONFIG_ARCH_NO_VIRT_TO_BUS=y |
| 47 | CONFIG_PPC=y | 49 | CONFIG_PPC=y |
| @@ -62,6 +64,7 @@ CONFIG_DTC=y | |||
| 62 | # CONFIG_PPC_DCR_MMIO is not set | 64 | # CONFIG_PPC_DCR_MMIO is not set |
| 63 | CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y | 65 | CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y |
| 64 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | 66 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" |
| 67 | CONFIG_CONSTRUCTORS=y | ||
| 65 | 68 | ||
| 66 | # | 69 | # |
| 67 | # General setup | 70 | # General setup |
| @@ -113,7 +116,6 @@ CONFIG_SYSCTL_SYSCALL=y | |||
| 113 | CONFIG_KALLSYMS=y | 116 | CONFIG_KALLSYMS=y |
| 114 | CONFIG_KALLSYMS_ALL=y | 117 | CONFIG_KALLSYMS_ALL=y |
| 115 | CONFIG_KALLSYMS_EXTRA_PASS=y | 118 | CONFIG_KALLSYMS_EXTRA_PASS=y |
| 116 | # CONFIG_STRIP_ASM_SYMS is not set | ||
| 117 | CONFIG_HOTPLUG=y | 119 | CONFIG_HOTPLUG=y |
| 118 | CONFIG_PRINTK=y | 120 | CONFIG_PRINTK=y |
| 119 | CONFIG_BUG=y | 121 | CONFIG_BUG=y |
| @@ -126,7 +128,14 @@ CONFIG_TIMERFD=y | |||
| 126 | CONFIG_EVENTFD=y | 128 | CONFIG_EVENTFD=y |
| 127 | CONFIG_SHMEM=y | 129 | CONFIG_SHMEM=y |
| 128 | CONFIG_AIO=y | 130 | CONFIG_AIO=y |
| 131 | CONFIG_HAVE_PERF_COUNTERS=y | ||
| 132 | |||
| 133 | # | ||
| 134 | # Performance Counters | ||
| 135 | # | ||
| 136 | # CONFIG_PERF_COUNTERS is not set | ||
| 129 | CONFIG_VM_EVENT_COUNTERS=y | 137 | CONFIG_VM_EVENT_COUNTERS=y |
| 138 | # CONFIG_STRIP_ASM_SYMS is not set | ||
| 130 | # CONFIG_COMPAT_BRK is not set | 139 | # CONFIG_COMPAT_BRK is not set |
| 131 | CONFIG_SLAB=y | 140 | CONFIG_SLAB=y |
| 132 | # CONFIG_SLUB is not set | 141 | # CONFIG_SLUB is not set |
| @@ -145,6 +154,11 @@ CONFIG_HAVE_KRETPROBES=y | |||
| 145 | CONFIG_HAVE_ARCH_TRACEHOOK=y | 154 | CONFIG_HAVE_ARCH_TRACEHOOK=y |
| 146 | CONFIG_HAVE_DMA_ATTRS=y | 155 | CONFIG_HAVE_DMA_ATTRS=y |
| 147 | CONFIG_USE_GENERIC_SMP_HELPERS=y | 156 | CONFIG_USE_GENERIC_SMP_HELPERS=y |
| 157 | |||
| 158 | # | ||
| 159 | # GCOV-based kernel profiling | ||
| 160 | # | ||
| 161 | # CONFIG_GCOV_KERNEL is not set | ||
| 148 | # CONFIG_SLOW_WORK is not set | 162 | # CONFIG_SLOW_WORK is not set |
| 149 | # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set | 163 | # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set |
| 150 | CONFIG_SLABINFO=y | 164 | CONFIG_SLABINFO=y |
| @@ -210,7 +224,7 @@ CONFIG_PPC_CELL=y | |||
| 210 | # | 224 | # |
| 211 | # Cell Broadband Engine options | 225 | # Cell Broadband Engine options |
| 212 | # | 226 | # |
| 213 | CONFIG_SPU_FS=y | 227 | CONFIG_SPU_FS=m |
| 214 | CONFIG_SPU_FS_64K_LS=y | 228 | CONFIG_SPU_FS_64K_LS=y |
| 215 | # CONFIG_SPU_TRACE is not set | 229 | # CONFIG_SPU_TRACE is not set |
| 216 | CONFIG_SPU_BASE=y | 230 | CONFIG_SPU_BASE=y |
| @@ -255,6 +269,7 @@ CONFIG_BINFMT_MISC=y | |||
| 255 | CONFIG_HUGETLB_PAGE_SIZE_VARIABLE=y | 269 | CONFIG_HUGETLB_PAGE_SIZE_VARIABLE=y |
| 256 | # CONFIG_IOMMU_VMERGE is not set | 270 | # CONFIG_IOMMU_VMERGE is not set |
| 257 | CONFIG_IOMMU_HELPER=y | 271 | CONFIG_IOMMU_HELPER=y |
| 272 | # CONFIG_SWIOTLB is not set | ||
| 258 | CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y | 273 | CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y |
| 259 | CONFIG_ARCH_HAS_WALK_MEMORY=y | 274 | CONFIG_ARCH_HAS_WALK_MEMORY=y |
| 260 | CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y | 275 | CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y |
| @@ -285,9 +300,9 @@ CONFIG_MIGRATION=y | |||
| 285 | CONFIG_PHYS_ADDR_T_64BIT=y | 300 | CONFIG_PHYS_ADDR_T_64BIT=y |
| 286 | CONFIG_ZONE_DMA_FLAG=1 | 301 | CONFIG_ZONE_DMA_FLAG=1 |
| 287 | CONFIG_BOUNCE=y | 302 | CONFIG_BOUNCE=y |
| 288 | CONFIG_UNEVICTABLE_LRU=y | ||
| 289 | CONFIG_HAVE_MLOCK=y | 303 | CONFIG_HAVE_MLOCK=y |
| 290 | CONFIG_HAVE_MLOCKED_PAGE_BIT=y | 304 | CONFIG_HAVE_MLOCKED_PAGE_BIT=y |
| 305 | CONFIG_DEFAULT_MMAP_MIN_ADDR=4096 | ||
| 291 | CONFIG_ARCH_MEMORY_PROBE=y | 306 | CONFIG_ARCH_MEMORY_PROBE=y |
| 292 | CONFIG_PPC_HAS_HASH_64K=y | 307 | CONFIG_PPC_HAS_HASH_64K=y |
| 293 | CONFIG_PPC_4K_PAGES=y | 308 | CONFIG_PPC_4K_PAGES=y |
| @@ -399,6 +414,7 @@ CONFIG_IPV6_NDISC_NODETYPE=y | |||
| 399 | # CONFIG_ECONET is not set | 414 | # CONFIG_ECONET is not set |
| 400 | # CONFIG_WAN_ROUTER is not set | 415 | # CONFIG_WAN_ROUTER is not set |
| 401 | # CONFIG_PHONET is not set | 416 | # CONFIG_PHONET is not set |
| 417 | # CONFIG_IEEE802154 is not set | ||
| 402 | # CONFIG_NET_SCHED is not set | 418 | # CONFIG_NET_SCHED is not set |
| 403 | # CONFIG_DCB is not set | 419 | # CONFIG_DCB is not set |
| 404 | 420 | ||
| @@ -433,11 +449,14 @@ CONFIG_BT_HCIBTUSB=m | |||
| 433 | CONFIG_WIRELESS=y | 449 | CONFIG_WIRELESS=y |
| 434 | CONFIG_CFG80211=m | 450 | CONFIG_CFG80211=m |
| 435 | # CONFIG_CFG80211_REG_DEBUG is not set | 451 | # CONFIG_CFG80211_REG_DEBUG is not set |
| 452 | # CONFIG_CFG80211_DEBUGFS is not set | ||
| 436 | # CONFIG_WIRELESS_OLD_REGULATORY is not set | 453 | # CONFIG_WIRELESS_OLD_REGULATORY is not set |
| 437 | CONFIG_WIRELESS_EXT=y | 454 | CONFIG_WIRELESS_EXT=y |
| 438 | # CONFIG_WIRELESS_EXT_SYSFS is not set | 455 | # CONFIG_WIRELESS_EXT_SYSFS is not set |
| 439 | # CONFIG_LIB80211 is not set | 456 | # CONFIG_LIB80211 is not set |
| 440 | CONFIG_MAC80211=m | 457 | CONFIG_MAC80211=m |
| 458 | CONFIG_MAC80211_DEFAULT_PS=y | ||
| 459 | CONFIG_MAC80211_DEFAULT_PS_VALUE=1 | ||
| 441 | 460 | ||
| 442 | # | 461 | # |
| 443 | # Rate control algorithm selection | 462 | # Rate control algorithm selection |
| @@ -447,7 +466,6 @@ CONFIG_MAC80211_RC_PID=y | |||
| 447 | CONFIG_MAC80211_RC_DEFAULT_PID=y | 466 | CONFIG_MAC80211_RC_DEFAULT_PID=y |
| 448 | # CONFIG_MAC80211_RC_DEFAULT_MINSTREL is not set | 467 | # CONFIG_MAC80211_RC_DEFAULT_MINSTREL is not set |
| 449 | CONFIG_MAC80211_RC_DEFAULT="pid" | 468 | CONFIG_MAC80211_RC_DEFAULT="pid" |
| 450 | # CONFIG_MAC80211_MESH is not set | ||
| 451 | # CONFIG_MAC80211_LEDS is not set | 469 | # CONFIG_MAC80211_LEDS is not set |
| 452 | # CONFIG_MAC80211_DEBUGFS is not set | 470 | # CONFIG_MAC80211_DEBUGFS is not set |
| 453 | # CONFIG_MAC80211_DEBUG_MENU is not set | 471 | # CONFIG_MAC80211_DEBUG_MENU is not set |
| @@ -472,77 +490,7 @@ CONFIG_EXTRA_FIRMWARE="" | |||
| 472 | # CONFIG_DEBUG_DEVRES is not set | 490 | # CONFIG_DEBUG_DEVRES is not set |
| 473 | # CONFIG_SYS_HYPERVISOR is not set | 491 | # CONFIG_SYS_HYPERVISOR is not set |
| 474 | # CONFIG_CONNECTOR is not set | 492 | # CONFIG_CONNECTOR is not set |
| 475 | CONFIG_MTD=y | 493 | # CONFIG_MTD is not set |
| 476 | CONFIG_MTD_DEBUG=y | ||
| 477 | CONFIG_MTD_DEBUG_VERBOSE=0 | ||
| 478 | # CONFIG_MTD_CONCAT is not set | ||
| 479 | # CONFIG_MTD_PARTITIONS is not set | ||
| 480 | # CONFIG_MTD_TESTS is not set | ||
| 481 | |||
| 482 | # | ||
| 483 | # User Modules And Translation Layers | ||
| 484 | # | ||
| 485 | # CONFIG_MTD_CHAR is not set | ||
| 486 | CONFIG_MTD_BLKDEVS=y | ||
| 487 | CONFIG_MTD_BLOCK=y | ||
| 488 | # CONFIG_FTL is not set | ||
| 489 | # CONFIG_NFTL is not set | ||
| 490 | # CONFIG_INFTL is not set | ||
| 491 | # CONFIG_RFD_FTL is not set | ||
| 492 | # CONFIG_SSFDC is not set | ||
| 493 | # CONFIG_MTD_OOPS is not set | ||
| 494 | |||
| 495 | # | ||
| 496 | # RAM/ROM/Flash chip drivers | ||
| 497 | # | ||
| 498 | # CONFIG_MTD_CFI is not set | ||
| 499 | # CONFIG_MTD_JEDECPROBE is not set | ||
| 500 | CONFIG_MTD_MAP_BANK_WIDTH_1=y | ||
| 501 | CONFIG_MTD_MAP_BANK_WIDTH_2=y | ||
| 502 | CONFIG_MTD_MAP_BANK_WIDTH_4=y | ||
| 503 | # CONFIG_MTD_MAP_BANK_WIDTH_8 is not set | ||
| 504 | # CONFIG_MTD_MAP_BANK_WIDTH_16 is not set | ||
| 505 | # CONFIG_MTD_MAP_BANK_WIDTH_32 is not set | ||
| 506 | CONFIG_MTD_CFI_I1=y | ||
| 507 | CONFIG_MTD_CFI_I2=y | ||
| 508 | # CONFIG_MTD_CFI_I4 is not set | ||
| 509 | # CONFIG_MTD_CFI_I8 is not set | ||
| 510 | # CONFIG_MTD_RAM is not set | ||
| 511 | # CONFIG_MTD_ROM is not set | ||
| 512 | # CONFIG_MTD_ABSENT is not set | ||
| 513 | |||
| 514 | # | ||
| 515 | # Mapping drivers for chip access | ||
| 516 | # | ||
| 517 | # CONFIG_MTD_COMPLEX_MAPPINGS is not set | ||
| 518 | # CONFIG_MTD_PLATRAM is not set | ||
| 519 | |||
| 520 | # | ||
| 521 | # Self-contained MTD device drivers | ||
| 522 | # | ||
| 523 | # CONFIG_MTD_SLRAM is not set | ||
| 524 | # CONFIG_MTD_PHRAM is not set | ||
| 525 | # CONFIG_MTD_MTDRAM is not set | ||
| 526 | # CONFIG_MTD_BLOCK2MTD is not set | ||
| 527 | |||
| 528 | # | ||
| 529 | # Disk-On-Chip Device Drivers | ||
| 530 | # | ||
| 531 | # CONFIG_MTD_DOC2000 is not set | ||
| 532 | # CONFIG_MTD_DOC2001 is not set | ||
| 533 | # CONFIG_MTD_DOC2001PLUS is not set | ||
| 534 | # CONFIG_MTD_NAND is not set | ||
| 535 | # CONFIG_MTD_ONENAND is not set | ||
| 536 | |||
| 537 | # | ||
| 538 | # LPDDR flash memory drivers | ||
| 539 | # | ||
| 540 | # CONFIG_MTD_LPDDR is not set | ||
| 541 | |||
| 542 | # | ||
| 543 | # UBI - Unsorted block images | ||
| 544 | # | ||
| 545 | # CONFIG_MTD_UBI is not set | ||
| 546 | CONFIG_OF_DEVICE=y | 494 | CONFIG_OF_DEVICE=y |
| 547 | # CONFIG_PARPORT is not set | 495 | # CONFIG_PARPORT is not set |
| 548 | CONFIG_BLK_DEV=y | 496 | CONFIG_BLK_DEV=y |
| @@ -590,10 +538,6 @@ CONFIG_BLK_DEV_SR=y | |||
| 590 | # CONFIG_BLK_DEV_SR_VENDOR is not set | 538 | # CONFIG_BLK_DEV_SR_VENDOR is not set |
| 591 | CONFIG_CHR_DEV_SG=m | 539 | CONFIG_CHR_DEV_SG=m |
| 592 | # CONFIG_CHR_DEV_SCH is not set | 540 | # CONFIG_CHR_DEV_SCH is not set |
| 593 | |||
| 594 | # | ||
| 595 | # Some SCSI devices (e.g. CD jukebox) support multiple LUNs | ||
| 596 | # | ||
| 597 | CONFIG_SCSI_MULTI_LUN=y | 541 | CONFIG_SCSI_MULTI_LUN=y |
| 598 | # CONFIG_SCSI_CONSTANTS is not set | 542 | # CONFIG_SCSI_CONSTANTS is not set |
| 599 | # CONFIG_SCSI_LOGGING is not set | 543 | # CONFIG_SCSI_LOGGING is not set |
| @@ -626,7 +570,6 @@ CONFIG_BLK_DEV_DM=m | |||
| 626 | # CONFIG_DM_UEVENT is not set | 570 | # CONFIG_DM_UEVENT is not set |
| 627 | # CONFIG_MACINTOSH_DRIVERS is not set | 571 | # CONFIG_MACINTOSH_DRIVERS is not set |
| 628 | CONFIG_NETDEVICES=y | 572 | CONFIG_NETDEVICES=y |
| 629 | CONFIG_COMPAT_NET_DEV_OPS=y | ||
| 630 | # CONFIG_DUMMY is not set | 573 | # CONFIG_DUMMY is not set |
| 631 | # CONFIG_BONDING is not set | 574 | # CONFIG_BONDING is not set |
| 632 | # CONFIG_MACVLAN is not set | 575 | # CONFIG_MACVLAN is not set |
| @@ -646,10 +589,11 @@ CONFIG_MII=m | |||
| 646 | # CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set | 589 | # CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set |
| 647 | # CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set | 590 | # CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set |
| 648 | # CONFIG_B44 is not set | 591 | # CONFIG_B44 is not set |
| 592 | # CONFIG_KS8842 is not set | ||
| 649 | CONFIG_NETDEV_1000=y | 593 | CONFIG_NETDEV_1000=y |
| 650 | CONFIG_GELIC_NET=y | 594 | CONFIG_GELIC_NET=y |
| 651 | CONFIG_GELIC_WIRELESS=y | 595 | CONFIG_GELIC_WIRELESS=y |
| 652 | CONFIG_GELIC_WIRELESS_OLD_PSK_INTERFACE=y | 596 | # CONFIG_GELIC_WIRELESS_OLD_PSK_INTERFACE is not set |
| 653 | # CONFIG_NETDEV_10000 is not set | 597 | # CONFIG_NETDEV_10000 is not set |
| 654 | 598 | ||
| 655 | # | 599 | # |
| @@ -669,8 +613,7 @@ CONFIG_WLAN_80211=y | |||
| 669 | # CONFIG_HOSTAP is not set | 613 | # CONFIG_HOSTAP is not set |
| 670 | # CONFIG_B43 is not set | 614 | # CONFIG_B43 is not set |
| 671 | # CONFIG_B43LEGACY is not set | 615 | # CONFIG_B43LEGACY is not set |
| 672 | CONFIG_ZD1211RW=m | 616 | # CONFIG_ZD1211RW is not set |
| 673 | # CONFIG_ZD1211RW_DEBUG is not set | ||
| 674 | # CONFIG_RT2X00 is not set | 617 | # CONFIG_RT2X00 is not set |
| 675 | 618 | ||
| 676 | # | 619 | # |
| @@ -682,7 +625,7 @@ CONFIG_ZD1211RW=m | |||
| 682 | # | 625 | # |
| 683 | # CONFIG_USB_CATC is not set | 626 | # CONFIG_USB_CATC is not set |
| 684 | # CONFIG_USB_KAWETH is not set | 627 | # CONFIG_USB_KAWETH is not set |
| 685 | CONFIG_USB_PEGASUS=m | 628 | # CONFIG_USB_PEGASUS is not set |
| 686 | # CONFIG_USB_RTL8150 is not set | 629 | # CONFIG_USB_RTL8150 is not set |
| 687 | CONFIG_USB_USBNET=m | 630 | CONFIG_USB_USBNET=m |
| 688 | CONFIG_USB_NET_AX8817X=m | 631 | CONFIG_USB_NET_AX8817X=m |
| @@ -693,10 +636,11 @@ CONFIG_USB_NET_AX8817X=m | |||
| 693 | # CONFIG_USB_NET_GL620A is not set | 636 | # CONFIG_USB_NET_GL620A is not set |
| 694 | # CONFIG_USB_NET_NET1080 is not set | 637 | # CONFIG_USB_NET_NET1080 is not set |
| 695 | # CONFIG_USB_NET_PLUSB is not set | 638 | # CONFIG_USB_NET_PLUSB is not set |
| 696 | CONFIG_USB_NET_MCS7830=m | 639 | # CONFIG_USB_NET_MCS7830 is not set |
| 697 | # CONFIG_USB_NET_RNDIS_HOST is not set | 640 | # CONFIG_USB_NET_RNDIS_HOST is not set |
| 698 | # CONFIG_USB_NET_CDC_SUBSET is not set | 641 | # CONFIG_USB_NET_CDC_SUBSET is not set |
| 699 | # CONFIG_USB_NET_ZAURUS is not set | 642 | # CONFIG_USB_NET_ZAURUS is not set |
| 643 | # CONFIG_USB_NET_INT51X1 is not set | ||
| 700 | # CONFIG_WAN is not set | 644 | # CONFIG_WAN is not set |
| 701 | CONFIG_PPP=m | 645 | CONFIG_PPP=m |
| 702 | CONFIG_PPP_MULTILINK=y | 646 | CONFIG_PPP_MULTILINK=y |
| @@ -771,8 +715,7 @@ CONFIG_DEVKMEM=y | |||
| 771 | # | 715 | # |
| 772 | CONFIG_UNIX98_PTYS=y | 716 | CONFIG_UNIX98_PTYS=y |
| 773 | # CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set | 717 | # CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set |
| 774 | CONFIG_LEGACY_PTYS=y | 718 | # CONFIG_LEGACY_PTYS is not set |
| 775 | CONFIG_LEGACY_PTY_COUNT=16 | ||
| 776 | # CONFIG_HVC_UDBG is not set | 719 | # CONFIG_HVC_UDBG is not set |
| 777 | # CONFIG_IPMI_HANDLER is not set | 720 | # CONFIG_IPMI_HANDLER is not set |
| 778 | # CONFIG_HW_RANDOM is not set | 721 | # CONFIG_HW_RANDOM is not set |
| @@ -782,6 +725,11 @@ CONFIG_LEGACY_PTY_COUNT=16 | |||
| 782 | # CONFIG_TCG_TPM is not set | 725 | # CONFIG_TCG_TPM is not set |
| 783 | # CONFIG_I2C is not set | 726 | # CONFIG_I2C is not set |
| 784 | # CONFIG_SPI is not set | 727 | # CONFIG_SPI is not set |
| 728 | |||
| 729 | # | ||
| 730 | # PPS support | ||
| 731 | # | ||
| 732 | # CONFIG_PPS is not set | ||
| 785 | CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y | 733 | CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y |
| 786 | # CONFIG_GPIOLIB is not set | 734 | # CONFIG_GPIOLIB is not set |
| 787 | # CONFIG_W1 is not set | 735 | # CONFIG_W1 is not set |
| @@ -805,22 +753,7 @@ CONFIG_SSB_POSSIBLE=y | |||
| 805 | # CONFIG_HTC_PASIC3 is not set | 753 | # CONFIG_HTC_PASIC3 is not set |
| 806 | # CONFIG_MFD_TMIO is not set | 754 | # CONFIG_MFD_TMIO is not set |
| 807 | # CONFIG_REGULATOR is not set | 755 | # CONFIG_REGULATOR is not set |
| 808 | 756 | # CONFIG_MEDIA_SUPPORT is not set | |
| 809 | # | ||
| 810 | # Multimedia devices | ||
| 811 | # | ||
| 812 | |||
| 813 | # | ||
| 814 | # Multimedia core support | ||
| 815 | # | ||
| 816 | # CONFIG_VIDEO_DEV is not set | ||
| 817 | # CONFIG_DVB_CORE is not set | ||
| 818 | # CONFIG_VIDEO_MEDIA is not set | ||
| 819 | |||
| 820 | # | ||
| 821 | # Multimedia drivers | ||
| 822 | # | ||
| 823 | # CONFIG_DAB is not set | ||
| 824 | 757 | ||
| 825 | # | 758 | # |
| 826 | # Graphics support | 759 | # Graphics support |
| @@ -898,6 +831,11 @@ CONFIG_SND_SUPPORT_OLD_API=y | |||
| 898 | CONFIG_SND_VERBOSE_PROCFS=y | 831 | CONFIG_SND_VERBOSE_PROCFS=y |
| 899 | # CONFIG_SND_VERBOSE_PRINTK is not set | 832 | # CONFIG_SND_VERBOSE_PRINTK is not set |
| 900 | # CONFIG_SND_DEBUG is not set | 833 | # CONFIG_SND_DEBUG is not set |
| 834 | # CONFIG_SND_RAWMIDI_SEQ is not set | ||
| 835 | # CONFIG_SND_OPL3_LIB_SEQ is not set | ||
| 836 | # CONFIG_SND_OPL4_LIB_SEQ is not set | ||
| 837 | # CONFIG_SND_SBAWE_SEQ is not set | ||
| 838 | # CONFIG_SND_EMU10K1_SEQ is not set | ||
| 901 | # CONFIG_SND_DRIVERS is not set | 839 | # CONFIG_SND_DRIVERS is not set |
| 902 | CONFIG_SND_PPC=y | 840 | CONFIG_SND_PPC=y |
| 903 | CONFIG_SND_PS3=m | 841 | CONFIG_SND_PS3=m |
| @@ -930,29 +868,34 @@ CONFIG_USB_HIDDEV=y | |||
| 930 | # Special HID drivers | 868 | # Special HID drivers |
| 931 | # | 869 | # |
| 932 | # CONFIG_HID_A4TECH is not set | 870 | # CONFIG_HID_A4TECH is not set |
| 933 | # CONFIG_HID_APPLE is not set | 871 | CONFIG_HID_APPLE=m |
| 934 | # CONFIG_HID_BELKIN is not set | 872 | CONFIG_HID_BELKIN=m |
| 935 | # CONFIG_HID_CHERRY is not set | 873 | CONFIG_HID_CHERRY=m |
| 936 | # CONFIG_HID_CHICONY is not set | 874 | # CONFIG_HID_CHICONY is not set |
| 937 | # CONFIG_HID_CYPRESS is not set | 875 | # CONFIG_HID_CYPRESS is not set |
| 938 | # CONFIG_DRAGONRISE_FF is not set | 876 | # CONFIG_HID_DRAGONRISE is not set |
| 939 | # CONFIG_HID_EZKEY is not set | 877 | CONFIG_HID_EZKEY=m |
| 940 | # CONFIG_HID_KYE is not set | 878 | # CONFIG_HID_KYE is not set |
| 941 | # CONFIG_HID_GYRATION is not set | 879 | # CONFIG_HID_GYRATION is not set |
| 942 | # CONFIG_HID_KENSINGTON is not set | 880 | # CONFIG_HID_KENSINGTON is not set |
| 943 | # CONFIG_HID_LOGITECH is not set | 881 | CONFIG_HID_LOGITECH=m |
| 944 | # CONFIG_HID_MICROSOFT is not set | 882 | # CONFIG_LOGITECH_FF is not set |
| 883 | # CONFIG_LOGIRUMBLEPAD2_FF is not set | ||
| 884 | CONFIG_HID_MICROSOFT=m | ||
| 945 | # CONFIG_HID_MONTEREY is not set | 885 | # CONFIG_HID_MONTEREY is not set |
| 946 | # CONFIG_HID_NTRIG is not set | 886 | # CONFIG_HID_NTRIG is not set |
| 947 | # CONFIG_HID_PANTHERLORD is not set | 887 | # CONFIG_HID_PANTHERLORD is not set |
| 948 | # CONFIG_HID_PETALYNX is not set | 888 | # CONFIG_HID_PETALYNX is not set |
| 949 | # CONFIG_HID_SAMSUNG is not set | 889 | # CONFIG_HID_SAMSUNG is not set |
| 950 | CONFIG_HID_SONY=m | 890 | CONFIG_HID_SONY=m |
| 951 | # CONFIG_HID_SUNPLUS is not set | 891 | CONFIG_HID_SUNPLUS=m |
| 952 | # CONFIG_GREENASIA_FF is not set | 892 | # CONFIG_HID_GREENASIA is not set |
| 893 | CONFIG_HID_SMARTJOYPLUS=m | ||
| 894 | # CONFIG_SMARTJOYPLUS_FF is not set | ||
| 953 | # CONFIG_HID_TOPSEED is not set | 895 | # CONFIG_HID_TOPSEED is not set |
| 954 | # CONFIG_THRUSTMASTER_FF is not set | 896 | # CONFIG_HID_THRUSTMASTER is not set |
| 955 | # CONFIG_ZEROPLUS_FF is not set | 897 | # CONFIG_HID_WACOM is not set |
| 898 | # CONFIG_HID_ZEROPLUS is not set | ||
| 956 | CONFIG_USB_SUPPORT=y | 899 | CONFIG_USB_SUPPORT=y |
| 957 | CONFIG_USB_ARCH_HAS_HCD=y | 900 | CONFIG_USB_ARCH_HAS_HCD=y |
| 958 | CONFIG_USB_ARCH_HAS_OHCI=y | 901 | CONFIG_USB_ARCH_HAS_OHCI=y |
| @@ -988,6 +931,8 @@ CONFIG_USB_EHCI_BIG_ENDIAN_MMIO=y | |||
| 988 | # CONFIG_USB_ISP116X_HCD is not set | 931 | # CONFIG_USB_ISP116X_HCD is not set |
| 989 | # CONFIG_USB_ISP1760_HCD is not set | 932 | # CONFIG_USB_ISP1760_HCD is not set |
| 990 | CONFIG_USB_OHCI_HCD=m | 933 | CONFIG_USB_OHCI_HCD=m |
| 934 | # CONFIG_USB_OHCI_HCD_PPC_OF_BE is not set | ||
| 935 | # CONFIG_USB_OHCI_HCD_PPC_OF_LE is not set | ||
| 991 | # CONFIG_USB_OHCI_HCD_PPC_OF is not set | 936 | # CONFIG_USB_OHCI_HCD_PPC_OF is not set |
| 992 | # CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set | 937 | # CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set |
| 993 | CONFIG_USB_OHCI_BIG_ENDIAN_MMIO=y | 938 | CONFIG_USB_OHCI_BIG_ENDIAN_MMIO=y |
| @@ -1115,6 +1060,10 @@ CONFIG_RTC_DRV_PS3=m | |||
| 1115 | # CONFIG_DMADEVICES is not set | 1060 | # CONFIG_DMADEVICES is not set |
| 1116 | # CONFIG_AUXDISPLAY is not set | 1061 | # CONFIG_AUXDISPLAY is not set |
| 1117 | # CONFIG_UIO is not set | 1062 | # CONFIG_UIO is not set |
| 1063 | |||
| 1064 | # | ||
| 1065 | # TI VLYNQ | ||
| 1066 | # | ||
| 1118 | # CONFIG_STAGING is not set | 1067 | # CONFIG_STAGING is not set |
| 1119 | 1068 | ||
| 1120 | # | 1069 | # |
| @@ -1141,11 +1090,12 @@ CONFIG_FS_MBCACHE=y | |||
| 1141 | # CONFIG_REISERFS_FS is not set | 1090 | # CONFIG_REISERFS_FS is not set |
| 1142 | # CONFIG_JFS_FS is not set | 1091 | # CONFIG_JFS_FS is not set |
| 1143 | # CONFIG_FS_POSIX_ACL is not set | 1092 | # CONFIG_FS_POSIX_ACL is not set |
| 1144 | CONFIG_FILE_LOCKING=y | ||
| 1145 | # CONFIG_XFS_FS is not set | 1093 | # CONFIG_XFS_FS is not set |
| 1146 | # CONFIG_GFS2_FS is not set | 1094 | # CONFIG_GFS2_FS is not set |
| 1147 | # CONFIG_OCFS2_FS is not set | 1095 | # CONFIG_OCFS2_FS is not set |
| 1148 | # CONFIG_BTRFS_FS is not set | 1096 | # CONFIG_BTRFS_FS is not set |
| 1097 | CONFIG_FILE_LOCKING=y | ||
| 1098 | CONFIG_FSNOTIFY=y | ||
| 1149 | CONFIG_DNOTIFY=y | 1099 | CONFIG_DNOTIFY=y |
| 1150 | CONFIG_INOTIFY=y | 1100 | CONFIG_INOTIFY=y |
| 1151 | CONFIG_INOTIFY_USER=y | 1101 | CONFIG_INOTIFY_USER=y |
| @@ -1205,7 +1155,6 @@ CONFIG_MISC_FILESYSTEMS=y | |||
| 1205 | # CONFIG_BEFS_FS is not set | 1155 | # CONFIG_BEFS_FS is not set |
| 1206 | # CONFIG_BFS_FS is not set | 1156 | # CONFIG_BFS_FS is not set |
| 1207 | # CONFIG_EFS_FS is not set | 1157 | # CONFIG_EFS_FS is not set |
| 1208 | # CONFIG_JFFS2_FS is not set | ||
| 1209 | # CONFIG_CRAMFS is not set | 1158 | # CONFIG_CRAMFS is not set |
| 1210 | # CONFIG_SQUASHFS is not set | 1159 | # CONFIG_SQUASHFS is not set |
| 1211 | # CONFIG_VXFS_FS is not set | 1160 | # CONFIG_VXFS_FS is not set |
| @@ -1222,6 +1171,7 @@ CONFIG_NFS_FS=y | |||
| 1222 | CONFIG_NFS_V3=y | 1171 | CONFIG_NFS_V3=y |
| 1223 | # CONFIG_NFS_V3_ACL is not set | 1172 | # CONFIG_NFS_V3_ACL is not set |
| 1224 | CONFIG_NFS_V4=y | 1173 | CONFIG_NFS_V4=y |
| 1174 | # CONFIG_NFS_V4_1 is not set | ||
| 1225 | CONFIG_ROOT_NFS=y | 1175 | CONFIG_ROOT_NFS=y |
| 1226 | # CONFIG_NFSD is not set | 1176 | # CONFIG_NFSD is not set |
| 1227 | CONFIG_LOCKD=y | 1177 | CONFIG_LOCKD=y |
| @@ -1359,7 +1309,6 @@ CONFIG_DEBUG_MEMORY_INIT=y | |||
| 1359 | CONFIG_DEBUG_LIST=y | 1309 | CONFIG_DEBUG_LIST=y |
| 1360 | # CONFIG_DEBUG_SG is not set | 1310 | # CONFIG_DEBUG_SG is not set |
| 1361 | # CONFIG_DEBUG_NOTIFIERS is not set | 1311 | # CONFIG_DEBUG_NOTIFIERS is not set |
| 1362 | # CONFIG_BOOT_PRINTK_DELAY is not set | ||
| 1363 | # CONFIG_RCU_TORTURE_TEST is not set | 1312 | # CONFIG_RCU_TORTURE_TEST is not set |
| 1364 | # CONFIG_RCU_CPU_STALL_DETECTOR is not set | 1313 | # CONFIG_RCU_CPU_STALL_DETECTOR is not set |
| 1365 | # CONFIG_BACKTRACE_SELF_TEST is not set | 1314 | # CONFIG_BACKTRACE_SELF_TEST is not set |
| @@ -1374,31 +1323,21 @@ CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y | |||
| 1374 | CONFIG_HAVE_DYNAMIC_FTRACE=y | 1323 | CONFIG_HAVE_DYNAMIC_FTRACE=y |
| 1375 | CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y | 1324 | CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y |
| 1376 | CONFIG_RING_BUFFER=y | 1325 | CONFIG_RING_BUFFER=y |
| 1326 | CONFIG_EVENT_TRACING=y | ||
| 1327 | CONFIG_CONTEXT_SWITCH_TRACER=y | ||
| 1377 | CONFIG_TRACING=y | 1328 | CONFIG_TRACING=y |
| 1378 | CONFIG_TRACING_SUPPORT=y | 1329 | CONFIG_TRACING_SUPPORT=y |
| 1379 | 1330 | # CONFIG_FTRACE is not set | |
| 1380 | # | ||
| 1381 | # Tracers | ||
| 1382 | # | ||
| 1383 | # CONFIG_FUNCTION_TRACER is not set | ||
| 1384 | # CONFIG_IRQSOFF_TRACER is not set | ||
| 1385 | # CONFIG_SCHED_TRACER is not set | ||
| 1386 | # CONFIG_CONTEXT_SWITCH_TRACER is not set | ||
| 1387 | # CONFIG_EVENT_TRACER is not set | ||
| 1388 | # CONFIG_BOOT_TRACER is not set | ||
| 1389 | # CONFIG_TRACE_BRANCH_PROFILING is not set | ||
| 1390 | # CONFIG_STACK_TRACER is not set | ||
| 1391 | # CONFIG_KMEMTRACE is not set | ||
| 1392 | # CONFIG_WORKQUEUE_TRACER is not set | ||
| 1393 | # CONFIG_BLK_DEV_IO_TRACE is not set | ||
| 1394 | # CONFIG_FTRACE_STARTUP_TEST is not set | ||
| 1395 | # CONFIG_DYNAMIC_DEBUG is not set | 1331 | # CONFIG_DYNAMIC_DEBUG is not set |
| 1396 | # CONFIG_SAMPLES is not set | 1332 | # CONFIG_SAMPLES is not set |
| 1397 | CONFIG_HAVE_ARCH_KGDB=y | 1333 | CONFIG_HAVE_ARCH_KGDB=y |
| 1398 | # CONFIG_KGDB is not set | 1334 | # CONFIG_KGDB is not set |
| 1335 | # CONFIG_PPC_DISABLE_WERROR is not set | ||
| 1336 | CONFIG_PPC_WERROR=y | ||
| 1399 | CONFIG_PRINT_STACK_DEPTH=64 | 1337 | CONFIG_PRINT_STACK_DEPTH=64 |
| 1400 | CONFIG_DEBUG_STACKOVERFLOW=y | 1338 | CONFIG_DEBUG_STACKOVERFLOW=y |
| 1401 | # CONFIG_DEBUG_STACK_USAGE is not set | 1339 | # CONFIG_DEBUG_STACK_USAGE is not set |
| 1340 | # CONFIG_PPC_EMULATED_STATS is not set | ||
| 1402 | # CONFIG_CODE_PATCHING_SELFTEST is not set | 1341 | # CONFIG_CODE_PATCHING_SELFTEST is not set |
| 1403 | # CONFIG_FTR_FIXUP_SELFTEST is not set | 1342 | # CONFIG_FTR_FIXUP_SELFTEST is not set |
| 1404 | # CONFIG_MSI_BITMAP_SELFTEST is not set | 1343 | # CONFIG_MSI_BITMAP_SELFTEST is not set |
diff --git a/arch/powerpc/kernel/power7-pmu.c b/arch/powerpc/kernel/power7-pmu.c index 388cf57ad827..018d094d92f9 100644 --- a/arch/powerpc/kernel/power7-pmu.c +++ b/arch/powerpc/kernel/power7-pmu.c | |||
| @@ -317,7 +317,7 @@ static int power7_generic_events[] = { | |||
| 317 | */ | 317 | */ |
| 318 | static int power7_cache_events[C(MAX)][C(OP_MAX)][C(RESULT_MAX)] = { | 318 | static int power7_cache_events[C(MAX)][C(OP_MAX)][C(RESULT_MAX)] = { |
| 319 | [C(L1D)] = { /* RESULT_ACCESS RESULT_MISS */ | 319 | [C(L1D)] = { /* RESULT_ACCESS RESULT_MISS */ |
| 320 | [C(OP_READ)] = { 0x400f0, 0xc880 }, | 320 | [C(OP_READ)] = { 0xc880, 0x400f0 }, |
| 321 | [C(OP_WRITE)] = { 0, 0x300f0 }, | 321 | [C(OP_WRITE)] = { 0, 0x300f0 }, |
| 322 | [C(OP_PREFETCH)] = { 0xd8b8, 0 }, | 322 | [C(OP_PREFETCH)] = { 0xd8b8, 0 }, |
| 323 | }, | 323 | }, |
| @@ -327,8 +327,8 @@ static int power7_cache_events[C(MAX)][C(OP_MAX)][C(RESULT_MAX)] = { | |||
| 327 | [C(OP_PREFETCH)] = { 0x408a, 0 }, | 327 | [C(OP_PREFETCH)] = { 0x408a, 0 }, |
| 328 | }, | 328 | }, |
| 329 | [C(LL)] = { /* RESULT_ACCESS RESULT_MISS */ | 329 | [C(LL)] = { /* RESULT_ACCESS RESULT_MISS */ |
| 330 | [C(OP_READ)] = { 0x6080, 0x6084 }, | 330 | [C(OP_READ)] = { 0x16080, 0x26080 }, |
| 331 | [C(OP_WRITE)] = { 0x6082, 0x6086 }, | 331 | [C(OP_WRITE)] = { 0x16082, 0x26082 }, |
| 332 | [C(OP_PREFETCH)] = { 0, 0 }, | 332 | [C(OP_PREFETCH)] = { 0, 0 }, |
| 333 | }, | 333 | }, |
| 334 | [C(DTLB)] = { /* RESULT_ACCESS RESULT_MISS */ | 334 | [C(DTLB)] = { /* RESULT_ACCESS RESULT_MISS */ |
diff --git a/arch/powerpc/platforms/ps3/time.c b/arch/powerpc/platforms/ps3/time.c index b178a1e66c91..40b5cb433005 100644 --- a/arch/powerpc/platforms/ps3/time.c +++ b/arch/powerpc/platforms/ps3/time.c | |||
| @@ -21,6 +21,7 @@ | |||
| 21 | #include <linux/kernel.h> | 21 | #include <linux/kernel.h> |
| 22 | #include <linux/platform_device.h> | 22 | #include <linux/platform_device.h> |
| 23 | 23 | ||
| 24 | #include <asm/firmware.h> | ||
| 24 | #include <asm/rtc.h> | 25 | #include <asm/rtc.h> |
| 25 | #include <asm/lv1call.h> | 26 | #include <asm/lv1call.h> |
| 26 | #include <asm/ps3.h> | 27 | #include <asm/ps3.h> |
| @@ -84,6 +85,9 @@ static int __init ps3_rtc_init(void) | |||
| 84 | { | 85 | { |
| 85 | struct platform_device *pdev; | 86 | struct platform_device *pdev; |
| 86 | 87 | ||
| 88 | if (!firmware_has_feature(FW_FEATURE_PS3_LV1)) | ||
| 89 | return -ENODEV; | ||
| 90 | |||
| 87 | pdev = platform_device_register_simple("rtc-ps3", -1, NULL, 0); | 91 | pdev = platform_device_register_simple("rtc-ps3", -1, NULL, 0); |
| 88 | if (IS_ERR(pdev)) | 92 | if (IS_ERR(pdev)) |
| 89 | return PTR_ERR(pdev); | 93 | return PTR_ERR(pdev); |
diff --git a/arch/powerpc/sysdev/xilinx_intc.c b/arch/powerpc/sysdev/xilinx_intc.c index 3ee1fd37bbfc..40edad520770 100644 --- a/arch/powerpc/sysdev/xilinx_intc.c +++ b/arch/powerpc/sysdev/xilinx_intc.c | |||
| @@ -234,7 +234,6 @@ static void xilinx_i8259_cascade(unsigned int irq, struct irq_desc *desc) | |||
| 234 | generic_handle_irq(cascade_irq); | 234 | generic_handle_irq(cascade_irq); |
| 235 | 235 | ||
| 236 | /* Let xilinx_intc end the interrupt */ | 236 | /* Let xilinx_intc end the interrupt */ |
| 237 | desc->chip->ack(irq); | ||
| 238 | desc->chip->unmask(irq); | 237 | desc->chip->unmask(irq); |
| 239 | } | 238 | } |
| 240 | 239 | ||
diff --git a/arch/s390/kernel/setup.c b/arch/s390/kernel/setup.c index 9717717c6fea..cbb897bc50bd 100644 --- a/arch/s390/kernel/setup.c +++ b/arch/s390/kernel/setup.c | |||
| @@ -154,6 +154,20 @@ static int __init condev_setup(char *str) | |||
| 154 | 154 | ||
| 155 | __setup("condev=", condev_setup); | 155 | __setup("condev=", condev_setup); |
| 156 | 156 | ||
| 157 | static void __init set_preferred_console(void) | ||
| 158 | { | ||
| 159 | if (MACHINE_IS_KVM) { | ||
| 160 | add_preferred_console("hvc", 0, NULL); | ||
| 161 | s390_virtio_console_init(); | ||
| 162 | return; | ||
| 163 | } | ||
| 164 | |||
| 165 | if (CONSOLE_IS_3215 || CONSOLE_IS_SCLP) | ||
| 166 | add_preferred_console("ttyS", 0, NULL); | ||
| 167 | if (CONSOLE_IS_3270) | ||
| 168 | add_preferred_console("tty3270", 0, NULL); | ||
| 169 | } | ||
| 170 | |||
| 157 | static int __init conmode_setup(char *str) | 171 | static int __init conmode_setup(char *str) |
| 158 | { | 172 | { |
| 159 | #if defined(CONFIG_SCLP_CONSOLE) || defined(CONFIG_SCLP_VT220_CONSOLE) | 173 | #if defined(CONFIG_SCLP_CONSOLE) || defined(CONFIG_SCLP_VT220_CONSOLE) |
| @@ -168,6 +182,7 @@ static int __init conmode_setup(char *str) | |||
| 168 | if (strncmp(str, "3270", 5) == 0) | 182 | if (strncmp(str, "3270", 5) == 0) |
| 169 | SET_CONSOLE_3270; | 183 | SET_CONSOLE_3270; |
| 170 | #endif | 184 | #endif |
| 185 | set_preferred_console(); | ||
| 171 | return 1; | 186 | return 1; |
| 172 | } | 187 | } |
| 173 | 188 | ||
| @@ -780,9 +795,6 @@ static void __init setup_hwcaps(void) | |||
| 780 | void __init | 795 | void __init |
| 781 | setup_arch(char **cmdline_p) | 796 | setup_arch(char **cmdline_p) |
| 782 | { | 797 | { |
| 783 | /* set up preferred console */ | ||
| 784 | add_preferred_console("ttyS", 0, NULL); | ||
| 785 | |||
| 786 | /* | 798 | /* |
| 787 | * print what head.S has found out about the machine | 799 | * print what head.S has found out about the machine |
| 788 | */ | 800 | */ |
| @@ -802,11 +814,9 @@ setup_arch(char **cmdline_p) | |||
| 802 | if (MACHINE_IS_VM) | 814 | if (MACHINE_IS_VM) |
| 803 | pr_info("Linux is running as a z/VM " | 815 | pr_info("Linux is running as a z/VM " |
| 804 | "guest operating system in 64-bit mode\n"); | 816 | "guest operating system in 64-bit mode\n"); |
| 805 | else if (MACHINE_IS_KVM) { | 817 | else if (MACHINE_IS_KVM) |
| 806 | pr_info("Linux is running under KVM in 64-bit mode\n"); | 818 | pr_info("Linux is running under KVM in 64-bit mode\n"); |
| 807 | add_preferred_console("hvc", 0, NULL); | 819 | else |
| 808 | s390_virtio_console_init(); | ||
| 809 | } else | ||
| 810 | pr_info("Linux is running natively in 64-bit mode\n"); | 820 | pr_info("Linux is running natively in 64-bit mode\n"); |
| 811 | #endif /* CONFIG_64BIT */ | 821 | #endif /* CONFIG_64BIT */ |
| 812 | 822 | ||
| @@ -851,6 +861,7 @@ setup_arch(char **cmdline_p) | |||
| 851 | 861 | ||
| 852 | /* Setup default console */ | 862 | /* Setup default console */ |
| 853 | conmode_default(); | 863 | conmode_default(); |
| 864 | set_preferred_console(); | ||
| 854 | 865 | ||
| 855 | /* Setup zfcpdump support */ | 866 | /* Setup zfcpdump support */ |
| 856 | setup_zfcpdump(console_devno); | 867 | setup_zfcpdump(console_devno); |
diff --git a/arch/sparc/configs/sparc32_defconfig b/arch/sparc/configs/sparc32_defconfig index 8bcd27af724b..a0f62a808edb 100644 --- a/arch/sparc/configs/sparc32_defconfig +++ b/arch/sparc/configs/sparc32_defconfig | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | # | 1 | # |
| 2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
| 3 | # Linux kernel version: 2.6.30-rc2 | 3 | # Linux kernel version: 2.6.31-rc1 |
| 4 | # Fri Apr 17 04:04:46 2009 | 4 | # Tue Aug 18 23:45:52 2009 |
| 5 | # | 5 | # |
| 6 | # CONFIG_64BIT is not set | 6 | # CONFIG_64BIT is not set |
| 7 | CONFIG_SPARC=y | 7 | CONFIG_SPARC=y |
| @@ -17,6 +17,7 @@ CONFIG_GENERIC_ISA_DMA=y | |||
| 17 | CONFIG_ARCH_NO_VIRT_TO_BUS=y | 17 | CONFIG_ARCH_NO_VIRT_TO_BUS=y |
| 18 | CONFIG_OF=y | 18 | CONFIG_OF=y |
| 19 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | 19 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" |
| 20 | CONFIG_CONSTRUCTORS=y | ||
| 20 | 21 | ||
| 21 | # | 22 | # |
| 22 | # General setup | 23 | # General setup |
| @@ -74,7 +75,6 @@ CONFIG_SYSCTL_SYSCALL=y | |||
| 74 | CONFIG_KALLSYMS=y | 75 | CONFIG_KALLSYMS=y |
| 75 | # CONFIG_KALLSYMS_ALL is not set | 76 | # CONFIG_KALLSYMS_ALL is not set |
| 76 | # CONFIG_KALLSYMS_EXTRA_PASS is not set | 77 | # CONFIG_KALLSYMS_EXTRA_PASS is not set |
| 77 | # CONFIG_STRIP_ASM_SYMS is not set | ||
| 78 | CONFIG_HOTPLUG=y | 78 | CONFIG_HOTPLUG=y |
| 79 | CONFIG_PRINTK=y | 79 | CONFIG_PRINTK=y |
| 80 | CONFIG_BUG=y | 80 | CONFIG_BUG=y |
| @@ -87,8 +87,13 @@ CONFIG_TIMERFD=y | |||
| 87 | CONFIG_EVENTFD=y | 87 | CONFIG_EVENTFD=y |
| 88 | CONFIG_SHMEM=y | 88 | CONFIG_SHMEM=y |
| 89 | CONFIG_AIO=y | 89 | CONFIG_AIO=y |
| 90 | |||
| 91 | # | ||
| 92 | # Performance Counters | ||
| 93 | # | ||
| 90 | CONFIG_VM_EVENT_COUNTERS=y | 94 | CONFIG_VM_EVENT_COUNTERS=y |
| 91 | CONFIG_PCI_QUIRKS=y | 95 | CONFIG_PCI_QUIRKS=y |
| 96 | # CONFIG_STRIP_ASM_SYMS is not set | ||
| 92 | CONFIG_COMPAT_BRK=y | 97 | CONFIG_COMPAT_BRK=y |
| 93 | CONFIG_SLAB=y | 98 | CONFIG_SLAB=y |
| 94 | # CONFIG_SLUB is not set | 99 | # CONFIG_SLUB is not set |
| @@ -97,6 +102,10 @@ CONFIG_SLAB=y | |||
| 97 | # CONFIG_MARKERS is not set | 102 | # CONFIG_MARKERS is not set |
| 98 | CONFIG_HAVE_OPROFILE=y | 103 | CONFIG_HAVE_OPROFILE=y |
| 99 | CONFIG_HAVE_ARCH_TRACEHOOK=y | 104 | CONFIG_HAVE_ARCH_TRACEHOOK=y |
| 105 | |||
| 106 | # | ||
| 107 | # GCOV-based kernel profiling | ||
| 108 | # | ||
| 100 | # CONFIG_SLOW_WORK is not set | 109 | # CONFIG_SLOW_WORK is not set |
| 101 | # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set | 110 | # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set |
| 102 | CONFIG_SLABINFO=y | 111 | CONFIG_SLABINFO=y |
| @@ -109,7 +118,7 @@ CONFIG_MODULE_UNLOAD=y | |||
| 109 | # CONFIG_MODVERSIONS is not set | 118 | # CONFIG_MODVERSIONS is not set |
| 110 | # CONFIG_MODULE_SRCVERSION_ALL is not set | 119 | # CONFIG_MODULE_SRCVERSION_ALL is not set |
| 111 | CONFIG_BLOCK=y | 120 | CONFIG_BLOCK=y |
| 112 | # CONFIG_LBD is not set | 121 | CONFIG_LBDAF=y |
| 113 | # CONFIG_BLK_DEV_BSG is not set | 122 | # CONFIG_BLK_DEV_BSG is not set |
| 114 | # CONFIG_BLK_DEV_INTEGRITY is not set | 123 | # CONFIG_BLK_DEV_INTEGRITY is not set |
| 115 | 124 | ||
| @@ -154,9 +163,9 @@ CONFIG_SPLIT_PTLOCK_CPUS=4 | |||
| 154 | # CONFIG_PHYS_ADDR_T_64BIT is not set | 163 | # CONFIG_PHYS_ADDR_T_64BIT is not set |
| 155 | CONFIG_ZONE_DMA_FLAG=1 | 164 | CONFIG_ZONE_DMA_FLAG=1 |
| 156 | CONFIG_BOUNCE=y | 165 | CONFIG_BOUNCE=y |
| 157 | CONFIG_UNEVICTABLE_LRU=y | ||
| 158 | CONFIG_HAVE_MLOCK=y | 166 | CONFIG_HAVE_MLOCK=y |
| 159 | CONFIG_HAVE_MLOCKED_PAGE_BIT=y | 167 | CONFIG_HAVE_MLOCKED_PAGE_BIT=y |
| 168 | CONFIG_DEFAULT_MMAP_MIN_ADDR=4096 | ||
| 160 | CONFIG_SUN_PM=y | 169 | CONFIG_SUN_PM=y |
| 161 | # CONFIG_SPARC_LED is not set | 170 | # CONFIG_SPARC_LED is not set |
| 162 | CONFIG_SERIAL_CONSOLE=y | 171 | CONFIG_SERIAL_CONSOLE=y |
| @@ -264,6 +273,7 @@ CONFIG_IPV6_TUNNEL=m | |||
| 264 | # CONFIG_ECONET is not set | 273 | # CONFIG_ECONET is not set |
| 265 | # CONFIG_WAN_ROUTER is not set | 274 | # CONFIG_WAN_ROUTER is not set |
| 266 | # CONFIG_PHONET is not set | 275 | # CONFIG_PHONET is not set |
| 276 | # CONFIG_IEEE802154 is not set | ||
| 267 | # CONFIG_NET_SCHED is not set | 277 | # CONFIG_NET_SCHED is not set |
| 268 | # CONFIG_DCB is not set | 278 | # CONFIG_DCB is not set |
| 269 | 279 | ||
| @@ -281,7 +291,11 @@ CONFIG_WIRELESS=y | |||
| 281 | CONFIG_WIRELESS_OLD_REGULATORY=y | 291 | CONFIG_WIRELESS_OLD_REGULATORY=y |
| 282 | # CONFIG_WIRELESS_EXT is not set | 292 | # CONFIG_WIRELESS_EXT is not set |
| 283 | # CONFIG_LIB80211 is not set | 293 | # CONFIG_LIB80211 is not set |
| 284 | # CONFIG_MAC80211 is not set | 294 | |
| 295 | # | ||
| 296 | # CFG80211 needs to be enabled for MAC80211 | ||
| 297 | # | ||
| 298 | CONFIG_MAC80211_DEFAULT_PS_VALUE=0 | ||
| 285 | # CONFIG_WIMAX is not set | 299 | # CONFIG_WIMAX is not set |
| 286 | # CONFIG_RFKILL is not set | 300 | # CONFIG_RFKILL is not set |
| 287 | # CONFIG_NET_9P is not set | 301 | # CONFIG_NET_9P is not set |
| @@ -335,6 +349,7 @@ CONFIG_MISC_DEVICES=y | |||
| 335 | # EEPROM support | 349 | # EEPROM support |
| 336 | # | 350 | # |
| 337 | # CONFIG_EEPROM_93CX6 is not set | 351 | # CONFIG_EEPROM_93CX6 is not set |
| 352 | # CONFIG_CB710_CORE is not set | ||
| 338 | CONFIG_HAVE_IDE=y | 353 | CONFIG_HAVE_IDE=y |
| 339 | # CONFIG_IDE is not set | 354 | # CONFIG_IDE is not set |
| 340 | 355 | ||
| @@ -358,10 +373,6 @@ CONFIG_BLK_DEV_SR=m | |||
| 358 | # CONFIG_BLK_DEV_SR_VENDOR is not set | 373 | # CONFIG_BLK_DEV_SR_VENDOR is not set |
| 359 | CONFIG_CHR_DEV_SG=m | 374 | CONFIG_CHR_DEV_SG=m |
| 360 | # CONFIG_CHR_DEV_SCH is not set | 375 | # CONFIG_CHR_DEV_SCH is not set |
| 361 | |||
| 362 | # | ||
| 363 | # Some SCSI devices (e.g. CD jukebox) support multiple LUNs | ||
| 364 | # | ||
| 365 | # CONFIG_SCSI_MULTI_LUN is not set | 376 | # CONFIG_SCSI_MULTI_LUN is not set |
| 366 | # CONFIG_SCSI_CONSTANTS is not set | 377 | # CONFIG_SCSI_CONSTANTS is not set |
| 367 | # CONFIG_SCSI_LOGGING is not set | 378 | # CONFIG_SCSI_LOGGING is not set |
| @@ -379,6 +390,7 @@ CONFIG_SCSI_SPI_ATTRS=y | |||
| 379 | CONFIG_SCSI_LOWLEVEL=y | 390 | CONFIG_SCSI_LOWLEVEL=y |
| 380 | # CONFIG_ISCSI_TCP is not set | 391 | # CONFIG_ISCSI_TCP is not set |
| 381 | # CONFIG_SCSI_CXGB3_ISCSI is not set | 392 | # CONFIG_SCSI_CXGB3_ISCSI is not set |
| 393 | # CONFIG_SCSI_BNX2_ISCSI is not set | ||
| 382 | # CONFIG_BLK_DEV_3W_XXXX_RAID is not set | 394 | # CONFIG_BLK_DEV_3W_XXXX_RAID is not set |
| 383 | # CONFIG_SCSI_3W_9XXX is not set | 395 | # CONFIG_SCSI_3W_9XXX is not set |
| 384 | # CONFIG_SCSI_ACARD is not set | 396 | # CONFIG_SCSI_ACARD is not set |
| @@ -387,6 +399,7 @@ CONFIG_SCSI_LOWLEVEL=y | |||
| 387 | # CONFIG_SCSI_AIC7XXX_OLD is not set | 399 | # CONFIG_SCSI_AIC7XXX_OLD is not set |
| 388 | # CONFIG_SCSI_AIC79XX is not set | 400 | # CONFIG_SCSI_AIC79XX is not set |
| 389 | # CONFIG_SCSI_AIC94XX is not set | 401 | # CONFIG_SCSI_AIC94XX is not set |
| 402 | # CONFIG_SCSI_MVSAS is not set | ||
| 390 | # CONFIG_SCSI_ARCMSR is not set | 403 | # CONFIG_SCSI_ARCMSR is not set |
| 391 | # CONFIG_MEGARAID_NEWGEN is not set | 404 | # CONFIG_MEGARAID_NEWGEN is not set |
| 392 | # CONFIG_MEGARAID_LEGACY is not set | 405 | # CONFIG_MEGARAID_LEGACY is not set |
| @@ -401,7 +414,6 @@ CONFIG_SCSI_LOWLEVEL=y | |||
| 401 | # CONFIG_SCSI_IPS is not set | 414 | # CONFIG_SCSI_IPS is not set |
| 402 | # CONFIG_SCSI_INITIO is not set | 415 | # CONFIG_SCSI_INITIO is not set |
| 403 | # CONFIG_SCSI_INIA100 is not set | 416 | # CONFIG_SCSI_INIA100 is not set |
| 404 | # CONFIG_SCSI_MVSAS is not set | ||
| 405 | # CONFIG_SCSI_STEX is not set | 417 | # CONFIG_SCSI_STEX is not set |
| 406 | # CONFIG_SCSI_SYM53C8XX_2 is not set | 418 | # CONFIG_SCSI_SYM53C8XX_2 is not set |
| 407 | # CONFIG_SCSI_QLOGIC_1280 is not set | 419 | # CONFIG_SCSI_QLOGIC_1280 is not set |
| @@ -426,13 +438,16 @@ CONFIG_SCSI_SUNESP=y | |||
| 426 | # | 438 | # |
| 427 | 439 | ||
| 428 | # | 440 | # |
| 429 | # Enable only one of the two stacks, unless you know what you are doing | 441 | # You can enable one or both FireWire driver stacks. |
| 442 | # | ||
| 443 | |||
| 444 | # | ||
| 445 | # See the help texts for more information. | ||
| 430 | # | 446 | # |
| 431 | # CONFIG_FIREWIRE is not set | 447 | # CONFIG_FIREWIRE is not set |
| 432 | # CONFIG_IEEE1394 is not set | 448 | # CONFIG_IEEE1394 is not set |
| 433 | # CONFIG_I2O is not set | 449 | # CONFIG_I2O is not set |
| 434 | CONFIG_NETDEVICES=y | 450 | CONFIG_NETDEVICES=y |
| 435 | CONFIG_COMPAT_NET_DEV_OPS=y | ||
| 436 | CONFIG_DUMMY=m | 451 | CONFIG_DUMMY=m |
| 437 | # CONFIG_BONDING is not set | 452 | # CONFIG_BONDING is not set |
| 438 | # CONFIG_MACVLAN is not set | 453 | # CONFIG_MACVLAN is not set |
| @@ -463,6 +478,7 @@ CONFIG_SUNQE=m | |||
| 463 | # CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set | 478 | # CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set |
| 464 | # CONFIG_NET_PCI is not set | 479 | # CONFIG_NET_PCI is not set |
| 465 | # CONFIG_B44 is not set | 480 | # CONFIG_B44 is not set |
| 481 | # CONFIG_KS8842 is not set | ||
| 466 | # CONFIG_ATL2 is not set | 482 | # CONFIG_ATL2 is not set |
| 467 | CONFIG_NETDEV_1000=y | 483 | CONFIG_NETDEV_1000=y |
| 468 | # CONFIG_ACENIC is not set | 484 | # CONFIG_ACENIC is not set |
| @@ -482,6 +498,7 @@ CONFIG_NETDEV_1000=y | |||
| 482 | # CONFIG_VIA_VELOCITY is not set | 498 | # CONFIG_VIA_VELOCITY is not set |
| 483 | # CONFIG_TIGON3 is not set | 499 | # CONFIG_TIGON3 is not set |
| 484 | # CONFIG_BNX2 is not set | 500 | # CONFIG_BNX2 is not set |
| 501 | # CONFIG_CNIC is not set | ||
| 485 | # CONFIG_QLA3XXX is not set | 502 | # CONFIG_QLA3XXX is not set |
| 486 | # CONFIG_ATL1 is not set | 503 | # CONFIG_ATL1 is not set |
| 487 | # CONFIG_ATL1E is not set | 504 | # CONFIG_ATL1E is not set |
| @@ -629,6 +646,11 @@ CONFIG_HW_RANDOM=m | |||
| 629 | CONFIG_DEVPORT=y | 646 | CONFIG_DEVPORT=y |
| 630 | # CONFIG_I2C is not set | 647 | # CONFIG_I2C is not set |
| 631 | # CONFIG_SPI is not set | 648 | # CONFIG_SPI is not set |
| 649 | |||
| 650 | # | ||
| 651 | # PPS support | ||
| 652 | # | ||
| 653 | # CONFIG_PPS is not set | ||
| 632 | CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y | 654 | CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y |
| 633 | # CONFIG_GPIOLIB is not set | 655 | # CONFIG_GPIOLIB is not set |
| 634 | # CONFIG_W1 is not set | 656 | # CONFIG_W1 is not set |
| @@ -668,22 +690,7 @@ CONFIG_SSB_POSSIBLE=y | |||
| 668 | # CONFIG_HTC_PASIC3 is not set | 690 | # CONFIG_HTC_PASIC3 is not set |
| 669 | # CONFIG_MFD_TMIO is not set | 691 | # CONFIG_MFD_TMIO is not set |
| 670 | # CONFIG_REGULATOR is not set | 692 | # CONFIG_REGULATOR is not set |
| 671 | 693 | # CONFIG_MEDIA_SUPPORT is not set | |
| 672 | # | ||
| 673 | # Multimedia devices | ||
| 674 | # | ||
| 675 | |||
| 676 | # | ||
| 677 | # Multimedia core support | ||
| 678 | # | ||
| 679 | # CONFIG_VIDEO_DEV is not set | ||
| 680 | # CONFIG_DVB_CORE is not set | ||
| 681 | # CONFIG_VIDEO_MEDIA is not set | ||
| 682 | |||
| 683 | # | ||
| 684 | # Multimedia drivers | ||
| 685 | # | ||
| 686 | # CONFIG_DAB is not set | ||
| 687 | 694 | ||
| 688 | # | 695 | # |
| 689 | # Graphics support | 696 | # Graphics support |
| @@ -776,6 +783,10 @@ CONFIG_RTC_DRV_M48T59=y | |||
| 776 | # CONFIG_DMADEVICES is not set | 783 | # CONFIG_DMADEVICES is not set |
| 777 | # CONFIG_AUXDISPLAY is not set | 784 | # CONFIG_AUXDISPLAY is not set |
| 778 | # CONFIG_UIO is not set | 785 | # CONFIG_UIO is not set |
| 786 | |||
| 787 | # | ||
| 788 | # TI VLYNQ | ||
| 789 | # | ||
| 779 | # CONFIG_STAGING is not set | 790 | # CONFIG_STAGING is not set |
| 780 | 791 | ||
| 781 | # | 792 | # |
| @@ -799,10 +810,12 @@ CONFIG_FS_MBCACHE=y | |||
| 799 | # CONFIG_REISERFS_FS is not set | 810 | # CONFIG_REISERFS_FS is not set |
| 800 | # CONFIG_JFS_FS is not set | 811 | # CONFIG_JFS_FS is not set |
| 801 | CONFIG_FS_POSIX_ACL=y | 812 | CONFIG_FS_POSIX_ACL=y |
| 802 | CONFIG_FILE_LOCKING=y | ||
| 803 | # CONFIG_XFS_FS is not set | 813 | # CONFIG_XFS_FS is not set |
| 814 | # CONFIG_GFS2_FS is not set | ||
| 804 | # CONFIG_OCFS2_FS is not set | 815 | # CONFIG_OCFS2_FS is not set |
| 805 | # CONFIG_BTRFS_FS is not set | 816 | # CONFIG_BTRFS_FS is not set |
| 817 | CONFIG_FILE_LOCKING=y | ||
| 818 | CONFIG_FSNOTIFY=y | ||
| 806 | CONFIG_DNOTIFY=y | 819 | CONFIG_DNOTIFY=y |
| 807 | CONFIG_INOTIFY=y | 820 | CONFIG_INOTIFY=y |
| 808 | CONFIG_INOTIFY_USER=y | 821 | CONFIG_INOTIFY_USER=y |
| @@ -985,6 +998,7 @@ CONFIG_KGDB=y | |||
| 985 | CONFIG_KGDB_SERIAL_CONSOLE=y | 998 | CONFIG_KGDB_SERIAL_CONSOLE=y |
| 986 | CONFIG_KGDB_TESTS=y | 999 | CONFIG_KGDB_TESTS=y |
| 987 | # CONFIG_KGDB_TESTS_ON_BOOT is not set | 1000 | # CONFIG_KGDB_TESTS_ON_BOOT is not set |
| 1001 | # CONFIG_KMEMCHECK is not set | ||
| 988 | # CONFIG_DEBUG_STACK_USAGE is not set | 1002 | # CONFIG_DEBUG_STACK_USAGE is not set |
| 989 | # CONFIG_STACK_DEBUG is not set | 1003 | # CONFIG_STACK_DEBUG is not set |
| 990 | 1004 | ||
diff --git a/arch/sparc/configs/sparc64_defconfig b/arch/sparc/configs/sparc64_defconfig index 0123a4c596ce..fdddf7a6f725 100644 --- a/arch/sparc/configs/sparc64_defconfig +++ b/arch/sparc/configs/sparc64_defconfig | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | # | 1 | # |
| 2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
| 3 | # Linux kernel version: 2.6.30 | 3 | # Linux kernel version: 2.6.31-rc1 |
| 4 | # Tue Jun 16 04:59:36 2009 | 4 | # Tue Aug 18 23:56:02 2009 |
| 5 | # | 5 | # |
| 6 | CONFIG_64BIT=y | 6 | CONFIG_64BIT=y |
| 7 | CONFIG_SPARC=y | 7 | CONFIG_SPARC=y |
| @@ -26,6 +26,7 @@ CONFIG_ARCH_NO_VIRT_TO_BUS=y | |||
| 26 | CONFIG_OF=y | 26 | CONFIG_OF=y |
| 27 | CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y | 27 | CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y |
| 28 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | 28 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" |
| 29 | CONFIG_CONSTRUCTORS=y | ||
| 29 | 30 | ||
| 30 | # | 31 | # |
| 31 | # General setup | 32 | # General setup |
| @@ -119,6 +120,11 @@ CONFIG_HAVE_KPROBES=y | |||
| 119 | CONFIG_HAVE_KRETPROBES=y | 120 | CONFIG_HAVE_KRETPROBES=y |
| 120 | CONFIG_HAVE_ARCH_TRACEHOOK=y | 121 | CONFIG_HAVE_ARCH_TRACEHOOK=y |
| 121 | CONFIG_USE_GENERIC_SMP_HELPERS=y | 122 | CONFIG_USE_GENERIC_SMP_HELPERS=y |
| 123 | |||
| 124 | # | ||
| 125 | # GCOV-based kernel profiling | ||
| 126 | # | ||
| 127 | # CONFIG_GCOV_KERNEL is not set | ||
| 122 | # CONFIG_SLOW_WORK is not set | 128 | # CONFIG_SLOW_WORK is not set |
| 123 | # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set | 129 | # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set |
| 124 | CONFIG_SLABINFO=y | 130 | CONFIG_SLABINFO=y |
| @@ -204,7 +210,6 @@ CONFIG_MIGRATION=y | |||
| 204 | CONFIG_PHYS_ADDR_T_64BIT=y | 210 | CONFIG_PHYS_ADDR_T_64BIT=y |
| 205 | CONFIG_ZONE_DMA_FLAG=0 | 211 | CONFIG_ZONE_DMA_FLAG=0 |
| 206 | CONFIG_NR_QUICK=1 | 212 | CONFIG_NR_QUICK=1 |
| 207 | CONFIG_UNEVICTABLE_LRU=y | ||
| 208 | CONFIG_HAVE_MLOCK=y | 213 | CONFIG_HAVE_MLOCK=y |
| 209 | CONFIG_HAVE_MLOCKED_PAGE_BIT=y | 214 | CONFIG_HAVE_MLOCKED_PAGE_BIT=y |
| 210 | CONFIG_DEFAULT_MMAP_MIN_ADDR=8192 | 215 | CONFIG_DEFAULT_MMAP_MIN_ADDR=8192 |
| @@ -410,6 +415,7 @@ CONFIG_MISC_DEVICES=y | |||
| 410 | # | 415 | # |
| 411 | # CONFIG_EEPROM_AT24 is not set | 416 | # CONFIG_EEPROM_AT24 is not set |
| 412 | # CONFIG_EEPROM_LEGACY is not set | 417 | # CONFIG_EEPROM_LEGACY is not set |
| 418 | # CONFIG_EEPROM_MAX6875 is not set | ||
| 413 | # CONFIG_EEPROM_93CX6 is not set | 419 | # CONFIG_EEPROM_93CX6 is not set |
| 414 | # CONFIG_CB710_CORE is not set | 420 | # CONFIG_CB710_CORE is not set |
| 415 | CONFIG_HAVE_IDE=y | 421 | CONFIG_HAVE_IDE=y |
| @@ -562,6 +568,7 @@ CONFIG_BLK_DEV_DM=m | |||
| 562 | CONFIG_DM_CRYPT=m | 568 | CONFIG_DM_CRYPT=m |
| 563 | CONFIG_DM_SNAPSHOT=m | 569 | CONFIG_DM_SNAPSHOT=m |
| 564 | CONFIG_DM_MIRROR=m | 570 | CONFIG_DM_MIRROR=m |
| 571 | # CONFIG_DM_LOG_USERSPACE is not set | ||
| 565 | CONFIG_DM_ZERO=m | 572 | CONFIG_DM_ZERO=m |
| 566 | # CONFIG_DM_MULTIPATH is not set | 573 | # CONFIG_DM_MULTIPATH is not set |
| 567 | # CONFIG_DM_DELAY is not set | 574 | # CONFIG_DM_DELAY is not set |
| @@ -573,7 +580,11 @@ CONFIG_DM_ZERO=m | |||
| 573 | # | 580 | # |
| 574 | 581 | ||
| 575 | # | 582 | # |
| 576 | # Enable only one of the two stacks, unless you know what you are doing | 583 | # You can enable one or both FireWire driver stacks. |
| 584 | # | ||
| 585 | |||
| 586 | # | ||
| 587 | # See the help texts for more information. | ||
| 577 | # | 588 | # |
| 578 | # CONFIG_FIREWIRE is not set | 589 | # CONFIG_FIREWIRE is not set |
| 579 | # CONFIG_IEEE1394 is not set | 590 | # CONFIG_IEEE1394 is not set |
| @@ -667,6 +678,7 @@ CONFIG_E1000E=m | |||
| 667 | # CONFIG_VIA_VELOCITY is not set | 678 | # CONFIG_VIA_VELOCITY is not set |
| 668 | CONFIG_TIGON3=m | 679 | CONFIG_TIGON3=m |
| 669 | CONFIG_BNX2=m | 680 | CONFIG_BNX2=m |
| 681 | # CONFIG_CNIC is not set | ||
| 670 | # CONFIG_QLA3XXX is not set | 682 | # CONFIG_QLA3XXX is not set |
| 671 | # CONFIG_ATL1 is not set | 683 | # CONFIG_ATL1 is not set |
| 672 | # CONFIG_ATL1E is not set | 684 | # CONFIG_ATL1E is not set |
| @@ -773,6 +785,7 @@ CONFIG_MOUSE_SERIAL=y | |||
| 773 | # CONFIG_MOUSE_APPLETOUCH is not set | 785 | # CONFIG_MOUSE_APPLETOUCH is not set |
| 774 | # CONFIG_MOUSE_BCM5974 is not set | 786 | # CONFIG_MOUSE_BCM5974 is not set |
| 775 | # CONFIG_MOUSE_VSXXXAA is not set | 787 | # CONFIG_MOUSE_VSXXXAA is not set |
| 788 | # CONFIG_MOUSE_SYNAPTICS_I2C is not set | ||
| 776 | # CONFIG_INPUT_JOYSTICK is not set | 789 | # CONFIG_INPUT_JOYSTICK is not set |
| 777 | # CONFIG_INPUT_TABLET is not set | 790 | # CONFIG_INPUT_TABLET is not set |
| 778 | # CONFIG_INPUT_TOUCHSCREEN is not set | 791 | # CONFIG_INPUT_TOUCHSCREEN is not set |
| @@ -870,6 +883,7 @@ CONFIG_I2C_ALGOBIT=y | |||
| 870 | # | 883 | # |
| 871 | # I2C system bus drivers (mostly embedded / system-on-chip) | 884 | # I2C system bus drivers (mostly embedded / system-on-chip) |
| 872 | # | 885 | # |
| 886 | # CONFIG_I2C_DESIGNWARE is not set | ||
| 873 | # CONFIG_I2C_OCORES is not set | 887 | # CONFIG_I2C_OCORES is not set |
| 874 | # CONFIG_I2C_SIMTEC is not set | 888 | # CONFIG_I2C_SIMTEC is not set |
| 875 | 889 | ||
| @@ -898,13 +912,17 @@ CONFIG_I2C_ALGOBIT=y | |||
| 898 | # CONFIG_SENSORS_PCF8574 is not set | 912 | # CONFIG_SENSORS_PCF8574 is not set |
| 899 | # CONFIG_PCF8575 is not set | 913 | # CONFIG_PCF8575 is not set |
| 900 | # CONFIG_SENSORS_PCA9539 is not set | 914 | # CONFIG_SENSORS_PCA9539 is not set |
| 901 | # CONFIG_SENSORS_MAX6875 is not set | ||
| 902 | # CONFIG_SENSORS_TSL2550 is not set | 915 | # CONFIG_SENSORS_TSL2550 is not set |
| 903 | # CONFIG_I2C_DEBUG_CORE is not set | 916 | # CONFIG_I2C_DEBUG_CORE is not set |
| 904 | # CONFIG_I2C_DEBUG_ALGO is not set | 917 | # CONFIG_I2C_DEBUG_ALGO is not set |
| 905 | # CONFIG_I2C_DEBUG_BUS is not set | 918 | # CONFIG_I2C_DEBUG_BUS is not set |
| 906 | # CONFIG_I2C_DEBUG_CHIP is not set | 919 | # CONFIG_I2C_DEBUG_CHIP is not set |
| 907 | # CONFIG_SPI is not set | 920 | # CONFIG_SPI is not set |
| 921 | |||
| 922 | # | ||
| 923 | # PPS support | ||
| 924 | # | ||
| 925 | # CONFIG_PPS is not set | ||
| 908 | CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y | 926 | CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y |
| 909 | # CONFIG_GPIOLIB is not set | 927 | # CONFIG_GPIOLIB is not set |
| 910 | # CONFIG_W1 is not set | 928 | # CONFIG_W1 is not set |
| @@ -959,6 +977,7 @@ CONFIG_HWMON=y | |||
| 959 | # CONFIG_SENSORS_SMSC47B397 is not set | 977 | # CONFIG_SENSORS_SMSC47B397 is not set |
| 960 | # CONFIG_SENSORS_ADS7828 is not set | 978 | # CONFIG_SENSORS_ADS7828 is not set |
| 961 | # CONFIG_SENSORS_THMC50 is not set | 979 | # CONFIG_SENSORS_THMC50 is not set |
| 980 | # CONFIG_SENSORS_TMP401 is not set | ||
| 962 | # CONFIG_SENSORS_VIA686A is not set | 981 | # CONFIG_SENSORS_VIA686A is not set |
| 963 | # CONFIG_SENSORS_VT1211 is not set | 982 | # CONFIG_SENSORS_VT1211 is not set |
| 964 | # CONFIG_SENSORS_VT8231 is not set | 983 | # CONFIG_SENSORS_VT8231 is not set |
| @@ -994,23 +1013,9 @@ CONFIG_SSB_POSSIBLE=y | |||
| 994 | # CONFIG_MFD_WM8400 is not set | 1013 | # CONFIG_MFD_WM8400 is not set |
| 995 | # CONFIG_MFD_WM8350_I2C is not set | 1014 | # CONFIG_MFD_WM8350_I2C is not set |
| 996 | # CONFIG_MFD_PCF50633 is not set | 1015 | # CONFIG_MFD_PCF50633 is not set |
| 1016 | # CONFIG_AB3100_CORE is not set | ||
| 997 | # CONFIG_REGULATOR is not set | 1017 | # CONFIG_REGULATOR is not set |
| 998 | 1018 | # CONFIG_MEDIA_SUPPORT is not set | |
| 999 | # | ||
| 1000 | # Multimedia devices | ||
| 1001 | # | ||
| 1002 | |||
| 1003 | # | ||
| 1004 | # Multimedia core support | ||
| 1005 | # | ||
| 1006 | # CONFIG_VIDEO_DEV is not set | ||
| 1007 | # CONFIG_DVB_CORE is not set | ||
| 1008 | # CONFIG_VIDEO_MEDIA is not set | ||
| 1009 | |||
| 1010 | # | ||
| 1011 | # Multimedia drivers | ||
| 1012 | # | ||
| 1013 | # CONFIG_DAB is not set | ||
| 1014 | 1019 | ||
| 1015 | # | 1020 | # |
| 1016 | # Graphics support | 1021 | # Graphics support |
| @@ -1284,7 +1289,6 @@ CONFIG_USB=y | |||
| 1284 | # | 1289 | # |
| 1285 | # Miscellaneous USB options | 1290 | # Miscellaneous USB options |
| 1286 | # | 1291 | # |
| 1287 | CONFIG_USB_DEVICEFS=y | ||
| 1288 | # CONFIG_USB_DEVICE_CLASS is not set | 1292 | # CONFIG_USB_DEVICE_CLASS is not set |
| 1289 | # CONFIG_USB_DYNAMIC_MINORS is not set | 1293 | # CONFIG_USB_DYNAMIC_MINORS is not set |
| 1290 | # CONFIG_USB_OTG is not set | 1294 | # CONFIG_USB_OTG is not set |
| @@ -1296,6 +1300,7 @@ CONFIG_USB_DEVICEFS=y | |||
| 1296 | # USB Host Controller Drivers | 1300 | # USB Host Controller Drivers |
| 1297 | # | 1301 | # |
| 1298 | # CONFIG_USB_C67X00_HCD is not set | 1302 | # CONFIG_USB_C67X00_HCD is not set |
| 1303 | # CONFIG_USB_XHCI_HCD is not set | ||
| 1299 | CONFIG_USB_EHCI_HCD=m | 1304 | CONFIG_USB_EHCI_HCD=m |
| 1300 | # CONFIG_USB_EHCI_ROOT_HUB_TT is not set | 1305 | # CONFIG_USB_EHCI_ROOT_HUB_TT is not set |
| 1301 | # CONFIG_USB_EHCI_TT_NEWSCHED is not set | 1306 | # CONFIG_USB_EHCI_TT_NEWSCHED is not set |
| @@ -1374,7 +1379,6 @@ CONFIG_USB_STORAGE=m | |||
| 1374 | # CONFIG_USB_LD is not set | 1379 | # CONFIG_USB_LD is not set |
| 1375 | # CONFIG_USB_TRANCEVIBRATOR is not set | 1380 | # CONFIG_USB_TRANCEVIBRATOR is not set |
| 1376 | # CONFIG_USB_IOWARRIOR is not set | 1381 | # CONFIG_USB_IOWARRIOR is not set |
| 1377 | # CONFIG_USB_TEST is not set | ||
| 1378 | # CONFIG_USB_ISIGHTFW is not set | 1382 | # CONFIG_USB_ISIGHTFW is not set |
| 1379 | # CONFIG_USB_VST is not set | 1383 | # CONFIG_USB_VST is not set |
| 1380 | # CONFIG_USB_GADGET is not set | 1384 | # CONFIG_USB_GADGET is not set |
| @@ -1420,6 +1424,7 @@ CONFIG_RTC_INTF_DEV=y | |||
| 1420 | # CONFIG_RTC_DRV_S35390A is not set | 1424 | # CONFIG_RTC_DRV_S35390A is not set |
| 1421 | # CONFIG_RTC_DRV_FM3130 is not set | 1425 | # CONFIG_RTC_DRV_FM3130 is not set |
| 1422 | # CONFIG_RTC_DRV_RX8581 is not set | 1426 | # CONFIG_RTC_DRV_RX8581 is not set |
| 1427 | # CONFIG_RTC_DRV_RX8025 is not set | ||
| 1423 | 1428 | ||
| 1424 | # | 1429 | # |
| 1425 | # SPI RTC drivers | 1430 | # SPI RTC drivers |
| @@ -1448,6 +1453,10 @@ CONFIG_RTC_DRV_STARFIRE=y | |||
| 1448 | # CONFIG_DMADEVICES is not set | 1453 | # CONFIG_DMADEVICES is not set |
| 1449 | # CONFIG_AUXDISPLAY is not set | 1454 | # CONFIG_AUXDISPLAY is not set |
| 1450 | # CONFIG_UIO is not set | 1455 | # CONFIG_UIO is not set |
| 1456 | |||
| 1457 | # | ||
| 1458 | # TI VLYNQ | ||
| 1459 | # | ||
| 1451 | # CONFIG_STAGING is not set | 1460 | # CONFIG_STAGING is not set |
| 1452 | 1461 | ||
| 1453 | # | 1462 | # |
| @@ -1480,11 +1489,11 @@ CONFIG_FS_MBCACHE=y | |||
| 1480 | # CONFIG_REISERFS_FS is not set | 1489 | # CONFIG_REISERFS_FS is not set |
| 1481 | # CONFIG_JFS_FS is not set | 1490 | # CONFIG_JFS_FS is not set |
| 1482 | CONFIG_FS_POSIX_ACL=y | 1491 | CONFIG_FS_POSIX_ACL=y |
| 1483 | CONFIG_FILE_LOCKING=y | ||
| 1484 | # CONFIG_XFS_FS is not set | 1492 | # CONFIG_XFS_FS is not set |
| 1485 | # CONFIG_GFS2_FS is not set | 1493 | # CONFIG_GFS2_FS is not set |
| 1486 | # CONFIG_OCFS2_FS is not set | 1494 | # CONFIG_OCFS2_FS is not set |
| 1487 | # CONFIG_BTRFS_FS is not set | 1495 | # CONFIG_BTRFS_FS is not set |
| 1496 | CONFIG_FILE_LOCKING=y | ||
| 1488 | CONFIG_FSNOTIFY=y | 1497 | CONFIG_FSNOTIFY=y |
| 1489 | CONFIG_DNOTIFY=y | 1498 | CONFIG_DNOTIFY=y |
| 1490 | CONFIG_INOTIFY=y | 1499 | CONFIG_INOTIFY=y |
| @@ -1560,7 +1569,7 @@ CONFIG_NETWORK_FILESYSTEMS=y | |||
| 1560 | # CONFIG_PARTITION_ADVANCED is not set | 1569 | # CONFIG_PARTITION_ADVANCED is not set |
| 1561 | CONFIG_MSDOS_PARTITION=y | 1570 | CONFIG_MSDOS_PARTITION=y |
| 1562 | CONFIG_SUN_PARTITION=y | 1571 | CONFIG_SUN_PARTITION=y |
| 1563 | CONFIG_NLS=m | 1572 | CONFIG_NLS=y |
| 1564 | CONFIG_NLS_DEFAULT="iso8859-1" | 1573 | CONFIG_NLS_DEFAULT="iso8859-1" |
| 1565 | # CONFIG_NLS_CODEPAGE_437 is not set | 1574 | # CONFIG_NLS_CODEPAGE_437 is not set |
| 1566 | # CONFIG_NLS_CODEPAGE_737 is not set | 1575 | # CONFIG_NLS_CODEPAGE_737 is not set |
diff --git a/arch/sparc/include/asm/pgtable_64.h b/arch/sparc/include/asm/pgtable_64.h index b049abf9902f..0ff92fa22064 100644 --- a/arch/sparc/include/asm/pgtable_64.h +++ b/arch/sparc/include/asm/pgtable_64.h | |||
| @@ -726,11 +726,17 @@ extern unsigned long pte_file(pte_t); | |||
| 726 | extern pte_t pgoff_to_pte(unsigned long); | 726 | extern pte_t pgoff_to_pte(unsigned long); |
| 727 | #define PTE_FILE_MAX_BITS (64UL - PAGE_SHIFT - 1UL) | 727 | #define PTE_FILE_MAX_BITS (64UL - PAGE_SHIFT - 1UL) |
| 728 | 728 | ||
| 729 | extern unsigned long *sparc64_valid_addr_bitmap; | 729 | extern unsigned long sparc64_valid_addr_bitmap[]; |
| 730 | 730 | ||
| 731 | /* Needs to be defined here and not in linux/mm.h, as it is arch dependent */ | 731 | /* Needs to be defined here and not in linux/mm.h, as it is arch dependent */ |
| 732 | #define kern_addr_valid(addr) \ | 732 | static inline bool kern_addr_valid(unsigned long addr) |
| 733 | (test_bit(__pa((unsigned long)(addr))>>22, sparc64_valid_addr_bitmap)) | 733 | { |
| 734 | unsigned long paddr = __pa(addr); | ||
| 735 | |||
| 736 | if ((paddr >> 41UL) != 0UL) | ||
| 737 | return false; | ||
| 738 | return test_bit(paddr >> 22, sparc64_valid_addr_bitmap); | ||
| 739 | } | ||
| 734 | 740 | ||
| 735 | extern int page_in_phys_avail(unsigned long paddr); | 741 | extern int page_in_phys_avail(unsigned long paddr); |
| 736 | 742 | ||
diff --git a/arch/sparc/kernel/irq_64.c b/arch/sparc/kernel/irq_64.c index f0ee79055409..8daab33fc17d 100644 --- a/arch/sparc/kernel/irq_64.c +++ b/arch/sparc/kernel/irq_64.c | |||
| @@ -886,7 +886,7 @@ void notrace init_irqwork_curcpu(void) | |||
| 886 | * Therefore you cannot make any OBP calls, not even prom_printf, | 886 | * Therefore you cannot make any OBP calls, not even prom_printf, |
| 887 | * from these two routines. | 887 | * from these two routines. |
| 888 | */ | 888 | */ |
| 889 | static void __cpuinit register_one_mondo(unsigned long paddr, unsigned long type, unsigned long qmask) | 889 | static void __cpuinit notrace register_one_mondo(unsigned long paddr, unsigned long type, unsigned long qmask) |
| 890 | { | 890 | { |
| 891 | unsigned long num_entries = (qmask + 1) / 64; | 891 | unsigned long num_entries = (qmask + 1) / 64; |
| 892 | unsigned long status; | 892 | unsigned long status; |
diff --git a/arch/sparc/kernel/ktlb.S b/arch/sparc/kernel/ktlb.S index cef8defcd7a9..3ea6e8cde8c5 100644 --- a/arch/sparc/kernel/ktlb.S +++ b/arch/sparc/kernel/ktlb.S | |||
| @@ -151,12 +151,46 @@ kvmap_dtlb_4v: | |||
| 151 | * Must preserve %g1 and %g6 (TAG). | 151 | * Must preserve %g1 and %g6 (TAG). |
| 152 | */ | 152 | */ |
| 153 | kvmap_dtlb_tsb4m_miss: | 153 | kvmap_dtlb_tsb4m_miss: |
| 154 | sethi %hi(kpte_linear_bitmap), %g2 | 154 | /* Clear the PAGE_OFFSET top virtual bits, shift |
| 155 | or %g2, %lo(kpte_linear_bitmap), %g2 | 155 | * down to get PFN, and make sure PFN is in range. |
| 156 | */ | ||
| 157 | sllx %g4, 21, %g5 | ||
| 156 | 158 | ||
| 157 | /* Clear the PAGE_OFFSET top virtual bits, then shift | 159 | /* Check to see if we know about valid memory at the 4MB |
| 158 | * down to get a 256MB physical address index. | 160 | * chunk this physical address will reside within. |
| 159 | */ | 161 | */ |
| 162 | srlx %g5, 21 + 41, %g2 | ||
| 163 | brnz,pn %g2, kvmap_dtlb_longpath | ||
| 164 | nop | ||
| 165 | |||
| 166 | /* This unconditional branch and delay-slot nop gets patched | ||
| 167 | * by the sethi sequence once the bitmap is properly setup. | ||
| 168 | */ | ||
| 169 | .globl valid_addr_bitmap_insn | ||
| 170 | valid_addr_bitmap_insn: | ||
| 171 | ba,pt %xcc, 2f | ||
| 172 | nop | ||
| 173 | .subsection 2 | ||
| 174 | .globl valid_addr_bitmap_patch | ||
| 175 | valid_addr_bitmap_patch: | ||
| 176 | sethi %hi(sparc64_valid_addr_bitmap), %g7 | ||
| 177 | or %g7, %lo(sparc64_valid_addr_bitmap), %g7 | ||
| 178 | .previous | ||
| 179 | |||
| 180 | srlx %g5, 21 + 22, %g2 | ||
| 181 | srlx %g2, 6, %g5 | ||
| 182 | and %g2, 63, %g2 | ||
| 183 | sllx %g5, 3, %g5 | ||
| 184 | ldx [%g7 + %g5], %g5 | ||
| 185 | mov 1, %g7 | ||
| 186 | sllx %g7, %g2, %g7 | ||
| 187 | andcc %g5, %g7, %g0 | ||
| 188 | be,pn %xcc, kvmap_dtlb_longpath | ||
| 189 | |||
| 190 | 2: sethi %hi(kpte_linear_bitmap), %g2 | ||
| 191 | or %g2, %lo(kpte_linear_bitmap), %g2 | ||
| 192 | |||
| 193 | /* Get the 256MB physical address index. */ | ||
| 160 | sllx %g4, 21, %g5 | 194 | sllx %g4, 21, %g5 |
| 161 | mov 1, %g7 | 195 | mov 1, %g7 |
| 162 | srlx %g5, 21 + 28, %g5 | 196 | srlx %g5, 21 + 28, %g5 |
diff --git a/arch/sparc/kernel/nmi.c b/arch/sparc/kernel/nmi.c index 2c0cc72d295b..b75bf502cd42 100644 --- a/arch/sparc/kernel/nmi.c +++ b/arch/sparc/kernel/nmi.c | |||
| @@ -103,7 +103,7 @@ notrace __kprobes void perfctr_irq(int irq, struct pt_regs *regs) | |||
| 103 | } | 103 | } |
| 104 | if (!touched && __get_cpu_var(last_irq_sum) == sum) { | 104 | if (!touched && __get_cpu_var(last_irq_sum) == sum) { |
| 105 | local_inc(&__get_cpu_var(alert_counter)); | 105 | local_inc(&__get_cpu_var(alert_counter)); |
| 106 | if (local_read(&__get_cpu_var(alert_counter)) == 5 * nmi_hz) | 106 | if (local_read(&__get_cpu_var(alert_counter)) == 30 * nmi_hz) |
| 107 | die_nmi("BUG: NMI Watchdog detected LOCKUP", | 107 | die_nmi("BUG: NMI Watchdog detected LOCKUP", |
| 108 | regs, panic_on_timeout); | 108 | regs, panic_on_timeout); |
| 109 | } else { | 109 | } else { |
diff --git a/arch/sparc/kernel/sun4d_smp.c b/arch/sparc/kernel/sun4d_smp.c index 54fb02468f0d..68791cad7b74 100644 --- a/arch/sparc/kernel/sun4d_smp.c +++ b/arch/sparc/kernel/sun4d_smp.c | |||
| @@ -162,9 +162,6 @@ extern void cpu_panic(void); | |||
| 162 | */ | 162 | */ |
| 163 | 163 | ||
| 164 | extern struct linux_prom_registers smp_penguin_ctable; | 164 | extern struct linux_prom_registers smp_penguin_ctable; |
| 165 | extern unsigned long trapbase_cpu1[]; | ||
| 166 | extern unsigned long trapbase_cpu2[]; | ||
| 167 | extern unsigned long trapbase_cpu3[]; | ||
| 168 | 165 | ||
| 169 | void __init smp4d_boot_cpus(void) | 166 | void __init smp4d_boot_cpus(void) |
| 170 | { | 167 | { |
| @@ -235,25 +232,6 @@ void __init smp4d_smp_done(void) | |||
| 235 | *prev = first; | 232 | *prev = first; |
| 236 | local_flush_cache_all(); | 233 | local_flush_cache_all(); |
| 237 | 234 | ||
| 238 | /* Free unneeded trap tables */ | ||
| 239 | ClearPageReserved(virt_to_page(trapbase_cpu1)); | ||
| 240 | init_page_count(virt_to_page(trapbase_cpu1)); | ||
| 241 | free_page((unsigned long)trapbase_cpu1); | ||
| 242 | totalram_pages++; | ||
| 243 | num_physpages++; | ||
| 244 | |||
| 245 | ClearPageReserved(virt_to_page(trapbase_cpu2)); | ||
| 246 | init_page_count(virt_to_page(trapbase_cpu2)); | ||
| 247 | free_page((unsigned long)trapbase_cpu2); | ||
| 248 | totalram_pages++; | ||
| 249 | num_physpages++; | ||
| 250 | |||
| 251 | ClearPageReserved(virt_to_page(trapbase_cpu3)); | ||
| 252 | init_page_count(virt_to_page(trapbase_cpu3)); | ||
| 253 | free_page((unsigned long)trapbase_cpu3); | ||
| 254 | totalram_pages++; | ||
| 255 | num_physpages++; | ||
| 256 | |||
| 257 | /* Ok, they are spinning and ready to go. */ | 235 | /* Ok, they are spinning and ready to go. */ |
| 258 | smp_processors_ready = 1; | 236 | smp_processors_ready = 1; |
| 259 | sun4d_distribute_irqs(); | 237 | sun4d_distribute_irqs(); |
diff --git a/arch/sparc/kernel/sun4m_smp.c b/arch/sparc/kernel/sun4m_smp.c index 960b113d0006..762d6eedd944 100644 --- a/arch/sparc/kernel/sun4m_smp.c +++ b/arch/sparc/kernel/sun4m_smp.c | |||
| @@ -121,9 +121,6 @@ void __cpuinit smp4m_callin(void) | |||
| 121 | */ | 121 | */ |
| 122 | 122 | ||
| 123 | extern struct linux_prom_registers smp_penguin_ctable; | 123 | extern struct linux_prom_registers smp_penguin_ctable; |
| 124 | extern unsigned long trapbase_cpu1[]; | ||
| 125 | extern unsigned long trapbase_cpu2[]; | ||
| 126 | extern unsigned long trapbase_cpu3[]; | ||
| 127 | 124 | ||
| 128 | void __init smp4m_boot_cpus(void) | 125 | void __init smp4m_boot_cpus(void) |
| 129 | { | 126 | { |
| @@ -193,29 +190,6 @@ void __init smp4m_smp_done(void) | |||
| 193 | *prev = first; | 190 | *prev = first; |
| 194 | local_flush_cache_all(); | 191 | local_flush_cache_all(); |
| 195 | 192 | ||
| 196 | /* Free unneeded trap tables */ | ||
| 197 | if (!cpu_isset(1, cpu_present_map)) { | ||
| 198 | ClearPageReserved(virt_to_page(trapbase_cpu1)); | ||
| 199 | init_page_count(virt_to_page(trapbase_cpu1)); | ||
| 200 | free_page((unsigned long)trapbase_cpu1); | ||
| 201 | totalram_pages++; | ||
| 202 | num_physpages++; | ||
| 203 | } | ||
| 204 | if (!cpu_isset(2, cpu_present_map)) { | ||
| 205 | ClearPageReserved(virt_to_page(trapbase_cpu2)); | ||
| 206 | init_page_count(virt_to_page(trapbase_cpu2)); | ||
| 207 | free_page((unsigned long)trapbase_cpu2); | ||
| 208 | totalram_pages++; | ||
| 209 | num_physpages++; | ||
| 210 | } | ||
| 211 | if (!cpu_isset(3, cpu_present_map)) { | ||
| 212 | ClearPageReserved(virt_to_page(trapbase_cpu3)); | ||
| 213 | init_page_count(virt_to_page(trapbase_cpu3)); | ||
| 214 | free_page((unsigned long)trapbase_cpu3); | ||
| 215 | totalram_pages++; | ||
| 216 | num_physpages++; | ||
| 217 | } | ||
| 218 | |||
| 219 | /* Ok, they are spinning and ready to go. */ | 193 | /* Ok, they are spinning and ready to go. */ |
| 220 | } | 194 | } |
| 221 | 195 | ||
diff --git a/arch/sparc/kernel/sys32.S b/arch/sparc/kernel/sys32.S index f061c4dda9ef..aed94869ad6a 100644 --- a/arch/sparc/kernel/sys32.S +++ b/arch/sparc/kernel/sys32.S | |||
| @@ -134,10 +134,12 @@ SIGN1(sys32_getpeername, sys_getpeername, %o0) | |||
| 134 | SIGN1(sys32_getsockname, sys_getsockname, %o0) | 134 | SIGN1(sys32_getsockname, sys_getsockname, %o0) |
| 135 | SIGN2(sys32_ioprio_get, sys_ioprio_get, %o0, %o1) | 135 | SIGN2(sys32_ioprio_get, sys_ioprio_get, %o0, %o1) |
| 136 | SIGN3(sys32_ioprio_set, sys_ioprio_set, %o0, %o1, %o2) | 136 | SIGN3(sys32_ioprio_set, sys_ioprio_set, %o0, %o1, %o2) |
| 137 | SIGN2(sys32_splice, sys_splice, %o0, %o1) | 137 | SIGN2(sys32_splice, sys_splice, %o0, %o2) |
| 138 | SIGN2(sys32_sync_file_range, compat_sync_file_range, %o0, %o5) | 138 | SIGN2(sys32_sync_file_range, compat_sync_file_range, %o0, %o5) |
| 139 | SIGN2(sys32_tee, sys_tee, %o0, %o1) | 139 | SIGN2(sys32_tee, sys_tee, %o0, %o1) |
| 140 | SIGN1(sys32_vmsplice, compat_sys_vmsplice, %o0) | 140 | SIGN1(sys32_vmsplice, compat_sys_vmsplice, %o0) |
| 141 | SIGN1(sys32_truncate, sys_truncate, %o1) | ||
| 142 | SIGN1(sys32_ftruncate, sys_ftruncate, %o1) | ||
| 141 | 143 | ||
| 142 | .globl sys32_mmap2 | 144 | .globl sys32_mmap2 |
| 143 | sys32_mmap2: | 145 | sys32_mmap2: |
diff --git a/arch/sparc/kernel/systbls_64.S b/arch/sparc/kernel/systbls_64.S index 6b3ee88e253c..2ee7250ba7ae 100644 --- a/arch/sparc/kernel/systbls_64.S +++ b/arch/sparc/kernel/systbls_64.S | |||
| @@ -43,8 +43,8 @@ sys_call_table32: | |||
| 43 | /*110*/ .word sys_setresgid, sys_getresgid, sys_setregid, sys_nis_syscall, sys_nis_syscall | 43 | /*110*/ .word sys_setresgid, sys_getresgid, sys_setregid, sys_nis_syscall, sys_nis_syscall |
| 44 | .word sys32_getgroups, compat_sys_gettimeofday, sys32_getrusage, sys_nis_syscall, sys_getcwd | 44 | .word sys32_getgroups, compat_sys_gettimeofday, sys32_getrusage, sys_nis_syscall, sys_getcwd |
| 45 | /*120*/ .word compat_sys_readv, compat_sys_writev, compat_sys_settimeofday, sys_fchown16, sys_fchmod | 45 | /*120*/ .word compat_sys_readv, compat_sys_writev, compat_sys_settimeofday, sys_fchown16, sys_fchmod |
| 46 | .word sys_nis_syscall, sys_setreuid16, sys_setregid16, sys_rename, sys_truncate | 46 | .word sys_nis_syscall, sys_setreuid16, sys_setregid16, sys_rename, sys32_truncate |
| 47 | /*130*/ .word sys_ftruncate, sys_flock, compat_sys_lstat64, sys_nis_syscall, sys_nis_syscall | 47 | /*130*/ .word sys32_ftruncate, sys_flock, compat_sys_lstat64, sys_nis_syscall, sys_nis_syscall |
| 48 | .word sys_nis_syscall, sys32_mkdir, sys_rmdir, compat_sys_utimes, compat_sys_stat64 | 48 | .word sys_nis_syscall, sys32_mkdir, sys_rmdir, compat_sys_utimes, compat_sys_stat64 |
| 49 | /*140*/ .word sys32_sendfile64, sys_nis_syscall, sys32_futex, sys_gettid, compat_sys_getrlimit | 49 | /*140*/ .word sys32_sendfile64, sys_nis_syscall, sys32_futex, sys_gettid, compat_sys_getrlimit |
| 50 | .word compat_sys_setrlimit, sys_pivot_root, sys32_prctl, sys_pciconfig_read, sys_pciconfig_write | 50 | .word compat_sys_setrlimit, sys_pivot_root, sys32_prctl, sys_pciconfig_read, sys_pciconfig_write |
diff --git a/arch/sparc/mm/fault_32.c b/arch/sparc/mm/fault_32.c index a5e30c642ee3..b99f81c4906f 100644 --- a/arch/sparc/mm/fault_32.c +++ b/arch/sparc/mm/fault_32.c | |||
| @@ -319,9 +319,10 @@ no_context: | |||
| 319 | */ | 319 | */ |
| 320 | out_of_memory: | 320 | out_of_memory: |
| 321 | up_read(&mm->mmap_sem); | 321 | up_read(&mm->mmap_sem); |
| 322 | printk("VM: killing process %s\n", tsk->comm); | 322 | if (from_user) { |
| 323 | if (from_user) | 323 | pagefault_out_of_memory(); |
| 324 | do_group_exit(SIGKILL); | 324 | return; |
| 325 | } | ||
| 325 | goto no_context; | 326 | goto no_context; |
| 326 | 327 | ||
| 327 | do_sigbus: | 328 | do_sigbus: |
diff --git a/arch/sparc/mm/fault_64.c b/arch/sparc/mm/fault_64.c index e5620b27c8bf..43b0da96a4fb 100644 --- a/arch/sparc/mm/fault_64.c +++ b/arch/sparc/mm/fault_64.c | |||
| @@ -447,9 +447,10 @@ handle_kernel_fault: | |||
| 447 | out_of_memory: | 447 | out_of_memory: |
| 448 | insn = get_fault_insn(regs, insn); | 448 | insn = get_fault_insn(regs, insn); |
| 449 | up_read(&mm->mmap_sem); | 449 | up_read(&mm->mmap_sem); |
| 450 | printk("VM: killing process %s\n", current->comm); | 450 | if (!(regs->tstate & TSTATE_PRIV)) { |
| 451 | if (!(regs->tstate & TSTATE_PRIV)) | 451 | pagefault_out_of_memory(); |
| 452 | do_group_exit(SIGKILL); | 452 | return; |
| 453 | } | ||
| 453 | goto handle_kernel_fault; | 454 | goto handle_kernel_fault; |
| 454 | 455 | ||
| 455 | intr_or_no_mm: | 456 | intr_or_no_mm: |
diff --git a/arch/sparc/mm/init_64.c b/arch/sparc/mm/init_64.c index ed6be6ba2f4e..a70a5e1904d9 100644 --- a/arch/sparc/mm/init_64.c +++ b/arch/sparc/mm/init_64.c | |||
| @@ -145,7 +145,8 @@ static void __init read_obp_memory(const char *property, | |||
| 145 | cmp_p64, NULL); | 145 | cmp_p64, NULL); |
| 146 | } | 146 | } |
| 147 | 147 | ||
| 148 | unsigned long *sparc64_valid_addr_bitmap __read_mostly; | 148 | unsigned long sparc64_valid_addr_bitmap[VALID_ADDR_BITMAP_BYTES / |
| 149 | sizeof(unsigned long)]; | ||
| 149 | EXPORT_SYMBOL(sparc64_valid_addr_bitmap); | 150 | EXPORT_SYMBOL(sparc64_valid_addr_bitmap); |
| 150 | 151 | ||
| 151 | /* Kernel physical address base and size in bytes. */ | 152 | /* Kernel physical address base and size in bytes. */ |
| @@ -1874,7 +1875,7 @@ static int pavail_rescan_ents __initdata; | |||
| 1874 | * memory list again, and make sure it provides at least as much | 1875 | * memory list again, and make sure it provides at least as much |
| 1875 | * memory as 'pavail' does. | 1876 | * memory as 'pavail' does. |
| 1876 | */ | 1877 | */ |
| 1877 | static void __init setup_valid_addr_bitmap_from_pavail(void) | 1878 | static void __init setup_valid_addr_bitmap_from_pavail(unsigned long *bitmap) |
| 1878 | { | 1879 | { |
| 1879 | int i; | 1880 | int i; |
| 1880 | 1881 | ||
| @@ -1897,8 +1898,7 @@ static void __init setup_valid_addr_bitmap_from_pavail(void) | |||
| 1897 | 1898 | ||
| 1898 | if (new_start <= old_start && | 1899 | if (new_start <= old_start && |
| 1899 | new_end >= (old_start + PAGE_SIZE)) { | 1900 | new_end >= (old_start + PAGE_SIZE)) { |
| 1900 | set_bit(old_start >> 22, | 1901 | set_bit(old_start >> 22, bitmap); |
| 1901 | sparc64_valid_addr_bitmap); | ||
| 1902 | goto do_next_page; | 1902 | goto do_next_page; |
| 1903 | } | 1903 | } |
| 1904 | } | 1904 | } |
| @@ -1919,20 +1919,21 @@ static void __init setup_valid_addr_bitmap_from_pavail(void) | |||
| 1919 | } | 1919 | } |
| 1920 | } | 1920 | } |
| 1921 | 1921 | ||
| 1922 | static void __init patch_tlb_miss_handler_bitmap(void) | ||
| 1923 | { | ||
| 1924 | extern unsigned int valid_addr_bitmap_insn[]; | ||
| 1925 | extern unsigned int valid_addr_bitmap_patch[]; | ||
| 1926 | |||
| 1927 | valid_addr_bitmap_insn[1] = valid_addr_bitmap_patch[1]; | ||
| 1928 | mb(); | ||
| 1929 | valid_addr_bitmap_insn[0] = valid_addr_bitmap_patch[0]; | ||
| 1930 | flushi(&valid_addr_bitmap_insn[0]); | ||
| 1931 | } | ||
| 1932 | |||
| 1922 | void __init mem_init(void) | 1933 | void __init mem_init(void) |
| 1923 | { | 1934 | { |
| 1924 | unsigned long codepages, datapages, initpages; | 1935 | unsigned long codepages, datapages, initpages; |
| 1925 | unsigned long addr, last; | 1936 | unsigned long addr, last; |
| 1926 | int i; | ||
| 1927 | |||
| 1928 | i = last_valid_pfn >> ((22 - PAGE_SHIFT) + 6); | ||
| 1929 | i += 1; | ||
| 1930 | sparc64_valid_addr_bitmap = (unsigned long *) alloc_bootmem(i << 3); | ||
| 1931 | if (sparc64_valid_addr_bitmap == NULL) { | ||
| 1932 | prom_printf("mem_init: Cannot alloc valid_addr_bitmap.\n"); | ||
| 1933 | prom_halt(); | ||
| 1934 | } | ||
| 1935 | memset(sparc64_valid_addr_bitmap, 0, i << 3); | ||
| 1936 | 1937 | ||
| 1937 | addr = PAGE_OFFSET + kern_base; | 1938 | addr = PAGE_OFFSET + kern_base; |
| 1938 | last = PAGE_ALIGN(kern_size) + addr; | 1939 | last = PAGE_ALIGN(kern_size) + addr; |
| @@ -1941,15 +1942,19 @@ void __init mem_init(void) | |||
| 1941 | addr += PAGE_SIZE; | 1942 | addr += PAGE_SIZE; |
| 1942 | } | 1943 | } |
| 1943 | 1944 | ||
| 1944 | setup_valid_addr_bitmap_from_pavail(); | 1945 | setup_valid_addr_bitmap_from_pavail(sparc64_valid_addr_bitmap); |
| 1946 | patch_tlb_miss_handler_bitmap(); | ||
| 1945 | 1947 | ||
| 1946 | high_memory = __va(last_valid_pfn << PAGE_SHIFT); | 1948 | high_memory = __va(last_valid_pfn << PAGE_SHIFT); |
| 1947 | 1949 | ||
| 1948 | #ifdef CONFIG_NEED_MULTIPLE_NODES | 1950 | #ifdef CONFIG_NEED_MULTIPLE_NODES |
| 1949 | for_each_online_node(i) { | 1951 | { |
| 1950 | if (NODE_DATA(i)->node_spanned_pages != 0) { | 1952 | int i; |
| 1951 | totalram_pages += | 1953 | for_each_online_node(i) { |
| 1952 | free_all_bootmem_node(NODE_DATA(i)); | 1954 | if (NODE_DATA(i)->node_spanned_pages != 0) { |
| 1955 | totalram_pages += | ||
| 1956 | free_all_bootmem_node(NODE_DATA(i)); | ||
| 1957 | } | ||
| 1953 | } | 1958 | } |
| 1954 | } | 1959 | } |
| 1955 | #else | 1960 | #else |
diff --git a/arch/sparc/mm/init_64.h b/arch/sparc/mm/init_64.h index 16063870a489..c2f772dbd556 100644 --- a/arch/sparc/mm/init_64.h +++ b/arch/sparc/mm/init_64.h | |||
| @@ -5,10 +5,13 @@ | |||
| 5 | * marked non-static so that assembler code can get at them. | 5 | * marked non-static so that assembler code can get at them. |
| 6 | */ | 6 | */ |
| 7 | 7 | ||
| 8 | #define MAX_PHYS_ADDRESS (1UL << 42UL) | 8 | #define MAX_PHYS_ADDRESS (1UL << 41UL) |
| 9 | #define KPTE_BITMAP_CHUNK_SZ (256UL * 1024UL * 1024UL) | 9 | #define KPTE_BITMAP_CHUNK_SZ (256UL * 1024UL * 1024UL) |
| 10 | #define KPTE_BITMAP_BYTES \ | 10 | #define KPTE_BITMAP_BYTES \ |
| 11 | ((MAX_PHYS_ADDRESS / KPTE_BITMAP_CHUNK_SZ) / 8) | 11 | ((MAX_PHYS_ADDRESS / KPTE_BITMAP_CHUNK_SZ) / 8) |
| 12 | #define VALID_ADDR_BITMAP_CHUNK_SZ (4UL * 1024UL * 1024UL) | ||
| 13 | #define VALID_ADDR_BITMAP_BYTES \ | ||
| 14 | ((MAX_PHYS_ADDRESS / VALID_ADDR_BITMAP_CHUNK_SZ) / 8) | ||
| 12 | 15 | ||
| 13 | extern unsigned long kern_linear_pte_xor[2]; | 16 | extern unsigned long kern_linear_pte_xor[2]; |
| 14 | extern unsigned long kpte_linear_bitmap[KPTE_BITMAP_BYTES / sizeof(unsigned long)]; | 17 | extern unsigned long kpte_linear_bitmap[KPTE_BITMAP_BYTES / sizeof(unsigned long)]; |
diff --git a/arch/sparc/prom/misc_64.c b/arch/sparc/prom/misc_64.c index eedffb4fec2d..39fc6af21b7c 100644 --- a/arch/sparc/prom/misc_64.c +++ b/arch/sparc/prom/misc_64.c | |||
| @@ -88,7 +88,7 @@ void prom_cmdline(void) | |||
| 88 | /* Drop into the prom, but completely terminate the program. | 88 | /* Drop into the prom, but completely terminate the program. |
| 89 | * No chance of continuing. | 89 | * No chance of continuing. |
| 90 | */ | 90 | */ |
| 91 | void prom_halt(void) | 91 | void notrace prom_halt(void) |
| 92 | { | 92 | { |
| 93 | #ifdef CONFIG_SUN_LDOMS | 93 | #ifdef CONFIG_SUN_LDOMS |
| 94 | if (ldom_domaining_enabled) | 94 | if (ldom_domaining_enabled) |
diff --git a/arch/sparc/prom/printf.c b/arch/sparc/prom/printf.c index 660943ee4c2a..ca869266b9f3 100644 --- a/arch/sparc/prom/printf.c +++ b/arch/sparc/prom/printf.c | |||
| @@ -14,14 +14,14 @@ | |||
| 14 | */ | 14 | */ |
| 15 | 15 | ||
| 16 | #include <linux/kernel.h> | 16 | #include <linux/kernel.h> |
| 17 | #include <linux/compiler.h> | ||
| 17 | 18 | ||
| 18 | #include <asm/openprom.h> | 19 | #include <asm/openprom.h> |
| 19 | #include <asm/oplib.h> | 20 | #include <asm/oplib.h> |
| 20 | 21 | ||
| 21 | static char ppbuf[1024]; | 22 | static char ppbuf[1024]; |
| 22 | 23 | ||
| 23 | void | 24 | void notrace prom_write(const char *buf, unsigned int n) |
| 24 | prom_write(const char *buf, unsigned int n) | ||
| 25 | { | 25 | { |
| 26 | char ch; | 26 | char ch; |
| 27 | 27 | ||
| @@ -33,8 +33,7 @@ prom_write(const char *buf, unsigned int n) | |||
| 33 | } | 33 | } |
| 34 | } | 34 | } |
| 35 | 35 | ||
| 36 | void | 36 | void notrace prom_printf(const char *fmt, ...) |
| 37 | prom_printf(const char *fmt, ...) | ||
| 38 | { | 37 | { |
| 39 | va_list args; | 38 | va_list args; |
| 40 | int i; | 39 | int i; |
diff --git a/arch/x86/boot/compressed/Makefile b/arch/x86/boot/compressed/Makefile index e2ff504b4ddc..f8ed0658404c 100644 --- a/arch/x86/boot/compressed/Makefile +++ b/arch/x86/boot/compressed/Makefile | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | # create a compressed vmlinux image from the original vmlinux | 4 | # create a compressed vmlinux image from the original vmlinux |
| 5 | # | 5 | # |
| 6 | 6 | ||
| 7 | targets := vmlinux vmlinux.bin vmlinux.bin.gz vmlinux.bin.bz2 vmlinux.bin.lzma head_$(BITS).o misc.o piggy.o | 7 | targets := vmlinux.lds vmlinux vmlinux.bin vmlinux.bin.gz vmlinux.bin.bz2 vmlinux.bin.lzma head_$(BITS).o misc.o piggy.o |
| 8 | 8 | ||
| 9 | KBUILD_CFLAGS := -m$(BITS) -D__KERNEL__ $(LINUX_INCLUDE) -O2 | 9 | KBUILD_CFLAGS := -m$(BITS) -D__KERNEL__ $(LINUX_INCLUDE) -O2 |
| 10 | KBUILD_CFLAGS += -fno-strict-aliasing -fPIC | 10 | KBUILD_CFLAGS += -fno-strict-aliasing -fPIC |
diff --git a/arch/x86/include/asm/pgtable.h b/arch/x86/include/asm/pgtable.h index 3cc06e3fceb8..16748077559a 100644 --- a/arch/x86/include/asm/pgtable.h +++ b/arch/x86/include/asm/pgtable.h | |||
| @@ -2,6 +2,7 @@ | |||
| 2 | #define _ASM_X86_PGTABLE_H | 2 | #define _ASM_X86_PGTABLE_H |
| 3 | 3 | ||
| 4 | #include <asm/page.h> | 4 | #include <asm/page.h> |
| 5 | #include <asm/e820.h> | ||
| 5 | 6 | ||
| 6 | #include <asm/pgtable_types.h> | 7 | #include <asm/pgtable_types.h> |
| 7 | 8 | ||
| @@ -269,10 +270,17 @@ static inline pgprot_t pgprot_modify(pgprot_t oldprot, pgprot_t newprot) | |||
| 269 | 270 | ||
| 270 | #define canon_pgprot(p) __pgprot(massage_pgprot(p)) | 271 | #define canon_pgprot(p) __pgprot(massage_pgprot(p)) |
| 271 | 272 | ||
| 272 | static inline int is_new_memtype_allowed(unsigned long flags, | 273 | static inline int is_new_memtype_allowed(u64 paddr, unsigned long size, |
| 273 | unsigned long new_flags) | 274 | unsigned long flags, |
| 275 | unsigned long new_flags) | ||
| 274 | { | 276 | { |
| 275 | /* | 277 | /* |
| 278 | * PAT type is always WB for ISA. So no need to check. | ||
| 279 | */ | ||
| 280 | if (is_ISA_range(paddr, paddr + size - 1)) | ||
| 281 | return 1; | ||
| 282 | |||
| 283 | /* | ||
| 276 | * Certain new memtypes are not allowed with certain | 284 | * Certain new memtypes are not allowed with certain |
| 277 | * requested memtype: | 285 | * requested memtype: |
| 278 | * - request is uncached, return cannot be write-back | 286 | * - request is uncached, return cannot be write-back |
diff --git a/arch/x86/kernel/apic/probe_64.c b/arch/x86/kernel/apic/probe_64.c index bc3e880f9b82..fcec2f1d34a1 100644 --- a/arch/x86/kernel/apic/probe_64.c +++ b/arch/x86/kernel/apic/probe_64.c | |||
| @@ -44,6 +44,11 @@ static struct apic *apic_probe[] __initdata = { | |||
| 44 | NULL, | 44 | NULL, |
| 45 | }; | 45 | }; |
| 46 | 46 | ||
| 47 | static int apicid_phys_pkg_id(int initial_apic_id, int index_msb) | ||
| 48 | { | ||
| 49 | return hard_smp_processor_id() >> index_msb; | ||
| 50 | } | ||
| 51 | |||
| 47 | /* | 52 | /* |
| 48 | * Check the APIC IDs in bios_cpu_apicid and choose the APIC mode. | 53 | * Check the APIC IDs in bios_cpu_apicid and choose the APIC mode. |
| 49 | */ | 54 | */ |
| @@ -69,6 +74,11 @@ void __init default_setup_apic_routing(void) | |||
| 69 | printk(KERN_INFO "Setting APIC routing to %s\n", apic->name); | 74 | printk(KERN_INFO "Setting APIC routing to %s\n", apic->name); |
| 70 | } | 75 | } |
| 71 | 76 | ||
| 77 | if (is_vsmp_box()) { | ||
| 78 | /* need to update phys_pkg_id */ | ||
| 79 | apic->phys_pkg_id = apicid_phys_pkg_id; | ||
| 80 | } | ||
| 81 | |||
| 72 | /* | 82 | /* |
| 73 | * Now that apic routing model is selected, configure the | 83 | * Now that apic routing model is selected, configure the |
| 74 | * fault handling for intr remapping. | 84 | * fault handling for intr remapping. |
diff --git a/arch/x86/kernel/cpu/Makefile b/arch/x86/kernel/cpu/Makefile index 3efcb2b96a15..c1f253dac155 100644 --- a/arch/x86/kernel/cpu/Makefile +++ b/arch/x86/kernel/cpu/Makefile | |||
| @@ -7,6 +7,10 @@ ifdef CONFIG_FUNCTION_TRACER | |||
| 7 | CFLAGS_REMOVE_common.o = -pg | 7 | CFLAGS_REMOVE_common.o = -pg |
| 8 | endif | 8 | endif |
| 9 | 9 | ||
| 10 | # Make sure load_percpu_segment has no stackprotector | ||
| 11 | nostackp := $(call cc-option, -fno-stack-protector) | ||
| 12 | CFLAGS_common.o := $(nostackp) | ||
| 13 | |||
| 10 | obj-y := intel_cacheinfo.o addon_cpuid_features.o | 14 | obj-y := intel_cacheinfo.o addon_cpuid_features.o |
| 11 | obj-y += proc.o capflags.o powerflags.o common.o | 15 | obj-y += proc.o capflags.o powerflags.o common.o |
| 12 | obj-y += vmware.o hypervisor.o | 16 | obj-y += vmware.o hypervisor.o |
diff --git a/arch/x86/kernel/head_32.S b/arch/x86/kernel/head_32.S index 0d98a01cbdb2..cc827ac9e8d3 100644 --- a/arch/x86/kernel/head_32.S +++ b/arch/x86/kernel/head_32.S | |||
| @@ -261,9 +261,7 @@ page_pde_offset = (__PAGE_OFFSET >> 20); | |||
| 261 | * which will be freed later | 261 | * which will be freed later |
| 262 | */ | 262 | */ |
| 263 | 263 | ||
| 264 | #ifndef CONFIG_HOTPLUG_CPU | 264 | __CPUINIT |
| 265 | .section .init.text,"ax",@progbits | ||
| 266 | #endif | ||
| 267 | 265 | ||
| 268 | #ifdef CONFIG_SMP | 266 | #ifdef CONFIG_SMP |
| 269 | ENTRY(startup_32_smp) | 267 | ENTRY(startup_32_smp) |
| @@ -602,11 +600,7 @@ ignore_int: | |||
| 602 | #endif | 600 | #endif |
| 603 | iret | 601 | iret |
| 604 | 602 | ||
| 605 | #ifndef CONFIG_HOTPLUG_CPU | ||
| 606 | __CPUINITDATA | ||
| 607 | #else | ||
| 608 | __REFDATA | 603 | __REFDATA |
| 609 | #endif | ||
| 610 | .align 4 | 604 | .align 4 |
| 611 | ENTRY(initial_code) | 605 | ENTRY(initial_code) |
| 612 | .long i386_start_kernel | 606 | .long i386_start_kernel |
diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c index 994dd6a4a2a0..071166a4ba83 100644 --- a/arch/x86/kernel/process.c +++ b/arch/x86/kernel/process.c | |||
| @@ -519,16 +519,12 @@ static void c1e_idle(void) | |||
| 519 | if (!cpumask_test_cpu(cpu, c1e_mask)) { | 519 | if (!cpumask_test_cpu(cpu, c1e_mask)) { |
| 520 | cpumask_set_cpu(cpu, c1e_mask); | 520 | cpumask_set_cpu(cpu, c1e_mask); |
| 521 | /* | 521 | /* |
| 522 | * Force broadcast so ACPI can not interfere. Needs | 522 | * Force broadcast so ACPI can not interfere. |
| 523 | * to run with interrupts enabled as it uses | ||
| 524 | * smp_function_call. | ||
| 525 | */ | 523 | */ |
| 526 | local_irq_enable(); | ||
| 527 | clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_FORCE, | 524 | clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_FORCE, |
| 528 | &cpu); | 525 | &cpu); |
| 529 | printk(KERN_INFO "Switch to broadcast mode on CPU%d\n", | 526 | printk(KERN_INFO "Switch to broadcast mode on CPU%d\n", |
| 530 | cpu); | 527 | cpu); |
| 531 | local_irq_disable(); | ||
| 532 | } | 528 | } |
| 533 | clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_ENTER, &cpu); | 529 | clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_ENTER, &cpu); |
| 534 | 530 | ||
diff --git a/arch/x86/kernel/vmlinux.lds.S b/arch/x86/kernel/vmlinux.lds.S index 78d185d797de..9fc178255c04 100644 --- a/arch/x86/kernel/vmlinux.lds.S +++ b/arch/x86/kernel/vmlinux.lds.S | |||
| @@ -46,11 +46,10 @@ PHDRS { | |||
| 46 | data PT_LOAD FLAGS(7); /* RWE */ | 46 | data PT_LOAD FLAGS(7); /* RWE */ |
| 47 | #ifdef CONFIG_X86_64 | 47 | #ifdef CONFIG_X86_64 |
| 48 | user PT_LOAD FLAGS(7); /* RWE */ | 48 | user PT_LOAD FLAGS(7); /* RWE */ |
| 49 | data.init PT_LOAD FLAGS(7); /* RWE */ | ||
| 50 | #ifdef CONFIG_SMP | 49 | #ifdef CONFIG_SMP |
| 51 | percpu PT_LOAD FLAGS(7); /* RWE */ | 50 | percpu PT_LOAD FLAGS(7); /* RWE */ |
| 52 | #endif | 51 | #endif |
| 53 | data.init2 PT_LOAD FLAGS(7); /* RWE */ | 52 | init PT_LOAD FLAGS(7); /* RWE */ |
| 54 | #endif | 53 | #endif |
| 55 | note PT_NOTE FLAGS(0); /* ___ */ | 54 | note PT_NOTE FLAGS(0); /* ___ */ |
| 56 | } | 55 | } |
| @@ -103,65 +102,43 @@ SECTIONS | |||
| 103 | __stop___ex_table = .; | 102 | __stop___ex_table = .; |
| 104 | } :text = 0x9090 | 103 | } :text = 0x9090 |
| 105 | 104 | ||
| 106 | RODATA | 105 | RO_DATA(PAGE_SIZE) |
| 107 | 106 | ||
| 108 | /* Data */ | 107 | /* Data */ |
| 109 | . = ALIGN(PAGE_SIZE); | ||
| 110 | .data : AT(ADDR(.data) - LOAD_OFFSET) { | 108 | .data : AT(ADDR(.data) - LOAD_OFFSET) { |
| 111 | /* Start of data section */ | 109 | /* Start of data section */ |
| 112 | _sdata = .; | 110 | _sdata = .; |
| 113 | DATA_DATA | 111 | |
| 114 | CONSTRUCTORS | 112 | /* init_task */ |
| 115 | } :data | 113 | INIT_TASK_DATA(THREAD_SIZE) |
| 116 | 114 | ||
| 117 | #ifdef CONFIG_X86_32 | 115 | #ifdef CONFIG_X86_32 |
| 118 | /* 32 bit has nosave before _edata */ | 116 | /* 32 bit has nosave before _edata */ |
| 119 | . = ALIGN(PAGE_SIZE); | 117 | NOSAVE_DATA |
| 120 | .data_nosave : AT(ADDR(.data_nosave) - LOAD_OFFSET) { | ||
| 121 | __nosave_begin = .; | ||
| 122 | *(.data.nosave) | ||
| 123 | . = ALIGN(PAGE_SIZE); | ||
| 124 | __nosave_end = .; | ||
| 125 | } | ||
| 126 | #endif | 118 | #endif |
| 127 | 119 | ||
| 128 | . = ALIGN(PAGE_SIZE); | 120 | PAGE_ALIGNED_DATA(PAGE_SIZE) |
| 129 | .data.page_aligned : AT(ADDR(.data.page_aligned) - LOAD_OFFSET) { | ||
| 130 | *(.data.page_aligned) | ||
| 131 | *(.data.idt) | 121 | *(.data.idt) |
| 132 | } | ||
| 133 | 122 | ||
| 134 | #ifdef CONFIG_X86_32 | 123 | CACHELINE_ALIGNED_DATA(CONFIG_X86_L1_CACHE_BYTES) |
| 135 | . = ALIGN(32); | ||
| 136 | #else | ||
| 137 | . = ALIGN(PAGE_SIZE); | ||
| 138 | . = ALIGN(CONFIG_X86_L1_CACHE_BYTES); | ||
| 139 | #endif | ||
| 140 | .data.cacheline_aligned : | ||
| 141 | AT(ADDR(.data.cacheline_aligned) - LOAD_OFFSET) { | ||
| 142 | *(.data.cacheline_aligned) | ||
| 143 | } | ||
| 144 | 124 | ||
| 145 | /* rarely changed data like cpu maps */ | 125 | DATA_DATA |
| 146 | #ifdef CONFIG_X86_32 | 126 | CONSTRUCTORS |
| 147 | . = ALIGN(32); | 127 | |
| 148 | #else | 128 | /* rarely changed data like cpu maps */ |
| 149 | . = ALIGN(CONFIG_X86_INTERNODE_CACHE_BYTES); | 129 | READ_MOSTLY_DATA(CONFIG_X86_INTERNODE_CACHE_BYTES) |
| 150 | #endif | ||
| 151 | .data.read_mostly : AT(ADDR(.data.read_mostly) - LOAD_OFFSET) { | ||
| 152 | *(.data.read_mostly) | ||
| 153 | 130 | ||
| 154 | /* End of data section */ | 131 | /* End of data section */ |
| 155 | _edata = .; | 132 | _edata = .; |
| 156 | } | 133 | } :data |
| 157 | 134 | ||
| 158 | #ifdef CONFIG_X86_64 | 135 | #ifdef CONFIG_X86_64 |
| 159 | 136 | ||
| 160 | #define VSYSCALL_ADDR (-10*1024*1024) | 137 | #define VSYSCALL_ADDR (-10*1024*1024) |
| 161 | #define VSYSCALL_PHYS_ADDR ((LOADADDR(.data.read_mostly) + \ | 138 | #define VSYSCALL_PHYS_ADDR ((LOADADDR(.data) + SIZEOF(.data) + \ |
| 162 | SIZEOF(.data.read_mostly) + 4095) & ~(4095)) | 139 | PAGE_SIZE - 1) & ~(PAGE_SIZE - 1)) |
| 163 | #define VSYSCALL_VIRT_ADDR ((ADDR(.data.read_mostly) + \ | 140 | #define VSYSCALL_VIRT_ADDR ((ADDR(.data) + SIZEOF(.data) + \ |
| 164 | SIZEOF(.data.read_mostly) + 4095) & ~(4095)) | 141 | PAGE_SIZE - 1) & ~(PAGE_SIZE - 1)) |
| 165 | 142 | ||
| 166 | #define VLOAD_OFFSET (VSYSCALL_ADDR - VSYSCALL_PHYS_ADDR) | 143 | #define VLOAD_OFFSET (VSYSCALL_ADDR - VSYSCALL_PHYS_ADDR) |
| 167 | #define VLOAD(x) (ADDR(x) - VLOAD_OFFSET) | 144 | #define VLOAD(x) (ADDR(x) - VLOAD_OFFSET) |
| @@ -227,35 +204,29 @@ SECTIONS | |||
| 227 | 204 | ||
| 228 | #endif /* CONFIG_X86_64 */ | 205 | #endif /* CONFIG_X86_64 */ |
| 229 | 206 | ||
| 230 | /* init_task */ | 207 | /* Init code and data - will be freed after init */ |
| 231 | . = ALIGN(THREAD_SIZE); | 208 | . = ALIGN(PAGE_SIZE); |
| 232 | .data.init_task : AT(ADDR(.data.init_task) - LOAD_OFFSET) { | 209 | .init.begin : AT(ADDR(.init.begin) - LOAD_OFFSET) { |
| 233 | *(.data.init_task) | 210 | __init_begin = .; /* paired with __init_end */ |
| 234 | } | 211 | } |
| 235 | #ifdef CONFIG_X86_64 | ||
| 236 | :data.init | ||
| 237 | #endif | ||
| 238 | 212 | ||
| 213 | #if defined(CONFIG_X86_64) && defined(CONFIG_SMP) | ||
| 239 | /* | 214 | /* |
| 240 | * smp_locks might be freed after init | 215 | * percpu offsets are zero-based on SMP. PERCPU_VADDR() changes the |
| 241 | * start/end must be page aligned | 216 | * output PHDR, so the next output section - .init.text - should |
| 217 | * start another segment - init. | ||
| 242 | */ | 218 | */ |
| 243 | . = ALIGN(PAGE_SIZE); | 219 | PERCPU_VADDR(0, :percpu) |
| 244 | .smp_locks : AT(ADDR(.smp_locks) - LOAD_OFFSET) { | 220 | #endif |
| 245 | __smp_locks = .; | ||
| 246 | *(.smp_locks) | ||
| 247 | __smp_locks_end = .; | ||
| 248 | . = ALIGN(PAGE_SIZE); | ||
| 249 | } | ||
| 250 | 221 | ||
| 251 | /* Init code and data - will be freed after init */ | ||
| 252 | . = ALIGN(PAGE_SIZE); | ||
| 253 | .init.text : AT(ADDR(.init.text) - LOAD_OFFSET) { | 222 | .init.text : AT(ADDR(.init.text) - LOAD_OFFSET) { |
| 254 | __init_begin = .; /* paired with __init_end */ | ||
| 255 | _sinittext = .; | 223 | _sinittext = .; |
| 256 | INIT_TEXT | 224 | INIT_TEXT |
| 257 | _einittext = .; | 225 | _einittext = .; |
| 258 | } | 226 | } |
| 227 | #ifdef CONFIG_X86_64 | ||
| 228 | :init | ||
| 229 | #endif | ||
| 259 | 230 | ||
| 260 | .init.data : AT(ADDR(.init.data) - LOAD_OFFSET) { | 231 | .init.data : AT(ADDR(.init.data) - LOAD_OFFSET) { |
| 261 | INIT_DATA | 232 | INIT_DATA |
| @@ -326,17 +297,7 @@ SECTIONS | |||
| 326 | } | 297 | } |
| 327 | #endif | 298 | #endif |
| 328 | 299 | ||
| 329 | #if defined(CONFIG_X86_64) && defined(CONFIG_SMP) | 300 | #if !defined(CONFIG_X86_64) || !defined(CONFIG_SMP) |
| 330 | /* | ||
| 331 | * percpu offsets are zero-based on SMP. PERCPU_VADDR() changes the | ||
| 332 | * output PHDR, so the next output section - __data_nosave - should | ||
| 333 | * start another section data.init2. Also, pda should be at the head of | ||
| 334 | * percpu area. Preallocate it and define the percpu offset symbol | ||
| 335 | * so that it can be accessed as a percpu variable. | ||
| 336 | */ | ||
| 337 | . = ALIGN(PAGE_SIZE); | ||
| 338 | PERCPU_VADDR(0, :percpu) | ||
| 339 | #else | ||
| 340 | PERCPU(PAGE_SIZE) | 301 | PERCPU(PAGE_SIZE) |
| 341 | #endif | 302 | #endif |
| 342 | 303 | ||
| @@ -347,15 +308,22 @@ SECTIONS | |||
| 347 | __init_end = .; | 308 | __init_end = .; |
| 348 | } | 309 | } |
| 349 | 310 | ||
| 311 | /* | ||
| 312 | * smp_locks might be freed after init | ||
| 313 | * start/end must be page aligned | ||
| 314 | */ | ||
| 315 | . = ALIGN(PAGE_SIZE); | ||
| 316 | .smp_locks : AT(ADDR(.smp_locks) - LOAD_OFFSET) { | ||
| 317 | __smp_locks = .; | ||
| 318 | *(.smp_locks) | ||
| 319 | __smp_locks_end = .; | ||
| 320 | . = ALIGN(PAGE_SIZE); | ||
| 321 | } | ||
| 322 | |||
| 350 | #ifdef CONFIG_X86_64 | 323 | #ifdef CONFIG_X86_64 |
| 351 | .data_nosave : AT(ADDR(.data_nosave) - LOAD_OFFSET) { | 324 | .data_nosave : AT(ADDR(.data_nosave) - LOAD_OFFSET) { |
| 352 | . = ALIGN(PAGE_SIZE); | 325 | NOSAVE_DATA |
| 353 | __nosave_begin = .; | 326 | } |
| 354 | *(.data.nosave) | ||
| 355 | . = ALIGN(PAGE_SIZE); | ||
| 356 | __nosave_end = .; | ||
| 357 | } :data.init2 | ||
| 358 | /* use another section data.init2, see PERCPU_VADDR() above */ | ||
| 359 | #endif | 327 | #endif |
| 360 | 328 | ||
| 361 | /* BSS */ | 329 | /* BSS */ |
diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c index 6176fe8f29e0..ea56b8cbb6a6 100644 --- a/arch/x86/mm/init_64.c +++ b/arch/x86/mm/init_64.c | |||
| @@ -796,7 +796,7 @@ int __init reserve_bootmem_generic(unsigned long phys, unsigned long len, | |||
| 796 | return ret; | 796 | return ret; |
| 797 | 797 | ||
| 798 | #else | 798 | #else |
| 799 | reserve_bootmem(phys, len, BOOTMEM_DEFAULT); | 799 | reserve_bootmem(phys, len, flags); |
| 800 | #endif | 800 | #endif |
| 801 | 801 | ||
| 802 | if (phys+len <= MAX_DMA_PFN*PAGE_SIZE) { | 802 | if (phys+len <= MAX_DMA_PFN*PAGE_SIZE) { |
diff --git a/arch/x86/mm/pat.c b/arch/x86/mm/pat.c index e6718bb28065..352aa9e927e2 100644 --- a/arch/x86/mm/pat.c +++ b/arch/x86/mm/pat.c | |||
| @@ -623,7 +623,8 @@ static int reserve_pfn_range(u64 paddr, unsigned long size, pgprot_t *vma_prot, | |||
| 623 | return ret; | 623 | return ret; |
| 624 | 624 | ||
| 625 | if (flags != want_flags) { | 625 | if (flags != want_flags) { |
| 626 | if (strict_prot || !is_new_memtype_allowed(want_flags, flags)) { | 626 | if (strict_prot || |
| 627 | !is_new_memtype_allowed(paddr, size, want_flags, flags)) { | ||
| 627 | free_memtype(paddr, paddr + size); | 628 | free_memtype(paddr, paddr + size); |
| 628 | printk(KERN_ERR "%s:%d map pfn expected mapping type %s" | 629 | printk(KERN_ERR "%s:%d map pfn expected mapping type %s" |
| 629 | " for %Lx-%Lx, got %s\n", | 630 | " for %Lx-%Lx, got %s\n", |
diff --git a/arch/x86/xen/Makefile b/arch/x86/xen/Makefile index 172438f86a02..7410640db173 100644 --- a/arch/x86/xen/Makefile +++ b/arch/x86/xen/Makefile | |||
| @@ -5,6 +5,10 @@ CFLAGS_REMOVE_time.o = -pg | |||
| 5 | CFLAGS_REMOVE_irq.o = -pg | 5 | CFLAGS_REMOVE_irq.o = -pg |
| 6 | endif | 6 | endif |
| 7 | 7 | ||
| 8 | # Make sure early boot has no stackprotector | ||
| 9 | nostackp := $(call cc-option, -fno-stack-protector) | ||
| 10 | CFLAGS_enlighten.o := $(nostackp) | ||
| 11 | |||
| 8 | obj-y := enlighten.o setup.o multicalls.o mmu.o irq.o \ | 12 | obj-y := enlighten.o setup.o multicalls.o mmu.o irq.o \ |
| 9 | time.o xen-asm.o xen-asm_$(BITS).o \ | 13 | time.o xen-asm.o xen-asm_$(BITS).o \ |
| 10 | grant-table.o suspend.o | 14 | grant-table.o suspend.o |
diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c index 0a1700a2be9c..eb33aaa8415d 100644 --- a/arch/x86/xen/enlighten.c +++ b/arch/x86/xen/enlighten.c | |||
| @@ -215,6 +215,7 @@ static __init void xen_init_cpuid_mask(void) | |||
| 215 | (1 << X86_FEATURE_ACPI)); /* disable ACPI */ | 215 | (1 << X86_FEATURE_ACPI)); /* disable ACPI */ |
| 216 | 216 | ||
| 217 | ax = 1; | 217 | ax = 1; |
| 218 | cx = 0; | ||
| 218 | xen_cpuid(&ax, &bx, &cx, &dx); | 219 | xen_cpuid(&ax, &bx, &cx, &dx); |
| 219 | 220 | ||
| 220 | /* cpuid claims we support xsave; try enabling it to see what happens */ | 221 | /* cpuid claims we support xsave; try enabling it to see what happens */ |
| @@ -974,10 +975,6 @@ asmlinkage void __init xen_start_kernel(void) | |||
| 974 | 975 | ||
| 975 | xen_domain_type = XEN_PV_DOMAIN; | 976 | xen_domain_type = XEN_PV_DOMAIN; |
| 976 | 977 | ||
| 977 | BUG_ON(memcmp(xen_start_info->magic, "xen-3", 5) != 0); | ||
| 978 | |||
| 979 | xen_setup_features(); | ||
| 980 | |||
| 981 | /* Install Xen paravirt ops */ | 978 | /* Install Xen paravirt ops */ |
| 982 | pv_info = xen_info; | 979 | pv_info = xen_info; |
| 983 | pv_init_ops = xen_init_ops; | 980 | pv_init_ops = xen_init_ops; |
| @@ -986,8 +983,15 @@ asmlinkage void __init xen_start_kernel(void) | |||
| 986 | pv_apic_ops = xen_apic_ops; | 983 | pv_apic_ops = xen_apic_ops; |
| 987 | pv_mmu_ops = xen_mmu_ops; | 984 | pv_mmu_ops = xen_mmu_ops; |
| 988 | 985 | ||
| 989 | xen_init_irq_ops(); | 986 | #ifdef CONFIG_X86_64 |
| 987 | /* | ||
| 988 | * Setup percpu state. We only need to do this for 64-bit | ||
| 989 | * because 32-bit already has %fs set properly. | ||
| 990 | */ | ||
| 991 | load_percpu_segment(0); | ||
| 992 | #endif | ||
| 990 | 993 | ||
| 994 | xen_init_irq_ops(); | ||
| 991 | xen_init_cpuid_mask(); | 995 | xen_init_cpuid_mask(); |
| 992 | 996 | ||
| 993 | #ifdef CONFIG_X86_LOCAL_APIC | 997 | #ifdef CONFIG_X86_LOCAL_APIC |
| @@ -997,6 +1001,8 @@ asmlinkage void __init xen_start_kernel(void) | |||
| 997 | set_xen_basic_apic_ops(); | 1001 | set_xen_basic_apic_ops(); |
| 998 | #endif | 1002 | #endif |
| 999 | 1003 | ||
| 1004 | xen_setup_features(); | ||
| 1005 | |||
| 1000 | if (xen_feature(XENFEAT_mmu_pt_update_preserve_ad)) { | 1006 | if (xen_feature(XENFEAT_mmu_pt_update_preserve_ad)) { |
| 1001 | pv_mmu_ops.ptep_modify_prot_start = xen_ptep_modify_prot_start; | 1007 | pv_mmu_ops.ptep_modify_prot_start = xen_ptep_modify_prot_start; |
| 1002 | pv_mmu_ops.ptep_modify_prot_commit = xen_ptep_modify_prot_commit; | 1008 | pv_mmu_ops.ptep_modify_prot_commit = xen_ptep_modify_prot_commit; |
| @@ -1004,13 +1010,6 @@ asmlinkage void __init xen_start_kernel(void) | |||
| 1004 | 1010 | ||
| 1005 | machine_ops = xen_machine_ops; | 1011 | machine_ops = xen_machine_ops; |
| 1006 | 1012 | ||
| 1007 | #ifdef CONFIG_X86_64 | ||
| 1008 | /* | ||
| 1009 | * Setup percpu state. We only need to do this for 64-bit | ||
| 1010 | * because 32-bit already has %fs set properly. | ||
| 1011 | */ | ||
| 1012 | load_percpu_segment(0); | ||
| 1013 | #endif | ||
| 1014 | /* | 1013 | /* |
| 1015 | * The only reliable way to retain the initial address of the | 1014 | * The only reliable way to retain the initial address of the |
| 1016 | * percpu gdt_page is to remember it here, so we can go and | 1015 | * percpu gdt_page is to remember it here, so we can go and |
| @@ -1061,6 +1060,7 @@ asmlinkage void __init xen_start_kernel(void) | |||
| 1061 | /* set up basic CPUID stuff */ | 1060 | /* set up basic CPUID stuff */ |
| 1062 | cpu_detect(&new_cpu_data); | 1061 | cpu_detect(&new_cpu_data); |
| 1063 | new_cpu_data.hard_math = 1; | 1062 | new_cpu_data.hard_math = 1; |
| 1063 | new_cpu_data.wp_works_ok = 1; | ||
| 1064 | new_cpu_data.x86_capability[0] = cpuid_edx(1); | 1064 | new_cpu_data.x86_capability[0] = cpuid_edx(1); |
| 1065 | #endif | 1065 | #endif |
| 1066 | 1066 | ||
diff --git a/block/blk-sysfs.c b/block/blk-sysfs.c index 418d63619680..d3aa2aadb3e0 100644 --- a/block/blk-sysfs.c +++ b/block/blk-sysfs.c | |||
| @@ -133,7 +133,7 @@ queue_max_sectors_store(struct request_queue *q, const char *page, size_t count) | |||
| 133 | return -EINVAL; | 133 | return -EINVAL; |
| 134 | 134 | ||
| 135 | spin_lock_irq(q->queue_lock); | 135 | spin_lock_irq(q->queue_lock); |
| 136 | blk_queue_max_sectors(q, max_sectors_kb << 1); | 136 | q->limits.max_sectors = max_sectors_kb << 1; |
| 137 | spin_unlock_irq(q->queue_lock); | 137 | spin_unlock_irq(q->queue_lock); |
| 138 | 138 | ||
| 139 | return ret; | 139 | return ret; |
diff --git a/crypto/algapi.c b/crypto/algapi.c index 56c62e2858d5..df0863d56995 100644 --- a/crypto/algapi.c +++ b/crypto/algapi.c | |||
| @@ -692,7 +692,7 @@ out: | |||
| 692 | } | 692 | } |
| 693 | EXPORT_SYMBOL_GPL(crypto_enqueue_request); | 693 | EXPORT_SYMBOL_GPL(crypto_enqueue_request); |
| 694 | 694 | ||
| 695 | struct crypto_async_request *crypto_dequeue_request(struct crypto_queue *queue) | 695 | void *__crypto_dequeue_request(struct crypto_queue *queue, unsigned int offset) |
| 696 | { | 696 | { |
| 697 | struct list_head *request; | 697 | struct list_head *request; |
| 698 | 698 | ||
| @@ -707,7 +707,14 @@ struct crypto_async_request *crypto_dequeue_request(struct crypto_queue *queue) | |||
| 707 | request = queue->list.next; | 707 | request = queue->list.next; |
| 708 | list_del(request); | 708 | list_del(request); |
| 709 | 709 | ||
| 710 | return list_entry(request, struct crypto_async_request, list); | 710 | return (char *)list_entry(request, struct crypto_async_request, list) - |
| 711 | offset; | ||
| 712 | } | ||
| 713 | EXPORT_SYMBOL_GPL(__crypto_dequeue_request); | ||
| 714 | |||
| 715 | struct crypto_async_request *crypto_dequeue_request(struct crypto_queue *queue) | ||
| 716 | { | ||
| 717 | return __crypto_dequeue_request(queue, 0); | ||
| 711 | } | 718 | } |
| 712 | EXPORT_SYMBOL_GPL(crypto_dequeue_request); | 719 | EXPORT_SYMBOL_GPL(crypto_dequeue_request); |
| 713 | 720 | ||
diff --git a/drivers/acpi/acpica/exstorob.c b/drivers/acpi/acpica/exstorob.c index 67340cc70142..257706e7734f 100644 --- a/drivers/acpi/acpica/exstorob.c +++ b/drivers/acpi/acpica/exstorob.c | |||
| @@ -70,6 +70,12 @@ acpi_ex_store_buffer_to_buffer(union acpi_operand_object *source_desc, | |||
| 70 | 70 | ||
| 71 | ACPI_FUNCTION_TRACE_PTR(ex_store_buffer_to_buffer, source_desc); | 71 | ACPI_FUNCTION_TRACE_PTR(ex_store_buffer_to_buffer, source_desc); |
| 72 | 72 | ||
| 73 | /* If Source and Target are the same, just return */ | ||
| 74 | |||
| 75 | if (source_desc == target_desc) { | ||
| 76 | return_ACPI_STATUS(AE_OK); | ||
| 77 | } | ||
| 78 | |||
| 73 | /* We know that source_desc is a buffer by now */ | 79 | /* We know that source_desc is a buffer by now */ |
| 74 | 80 | ||
| 75 | buffer = ACPI_CAST_PTR(u8, source_desc->buffer.pointer); | 81 | buffer = ACPI_CAST_PTR(u8, source_desc->buffer.pointer); |
| @@ -161,6 +167,12 @@ acpi_ex_store_string_to_string(union acpi_operand_object *source_desc, | |||
| 161 | 167 | ||
| 162 | ACPI_FUNCTION_TRACE_PTR(ex_store_string_to_string, source_desc); | 168 | ACPI_FUNCTION_TRACE_PTR(ex_store_string_to_string, source_desc); |
| 163 | 169 | ||
| 170 | /* If Source and Target are the same, just return */ | ||
| 171 | |||
| 172 | if (source_desc == target_desc) { | ||
| 173 | return_ACPI_STATUS(AE_OK); | ||
| 174 | } | ||
| 175 | |||
| 164 | /* We know that source_desc is a string by now */ | 176 | /* We know that source_desc is a string by now */ |
| 165 | 177 | ||
| 166 | buffer = ACPI_CAST_PTR(u8, source_desc->string.pointer); | 178 | buffer = ACPI_CAST_PTR(u8, source_desc->string.pointer); |
diff --git a/drivers/acpi/processor_core.c b/drivers/acpi/processor_core.c index 84e0f3c07442..2cc4b3033872 100644 --- a/drivers/acpi/processor_core.c +++ b/drivers/acpi/processor_core.c | |||
| @@ -1151,6 +1151,9 @@ static int __init acpi_processor_init(void) | |||
| 1151 | { | 1151 | { |
| 1152 | int result = 0; | 1152 | int result = 0; |
| 1153 | 1153 | ||
| 1154 | if (acpi_disabled) | ||
| 1155 | return 0; | ||
| 1156 | |||
| 1154 | memset(&errata, 0, sizeof(errata)); | 1157 | memset(&errata, 0, sizeof(errata)); |
| 1155 | 1158 | ||
| 1156 | #ifdef CONFIG_SMP | 1159 | #ifdef CONFIG_SMP |
| @@ -1197,6 +1200,9 @@ out_proc: | |||
| 1197 | 1200 | ||
| 1198 | static void __exit acpi_processor_exit(void) | 1201 | static void __exit acpi_processor_exit(void) |
| 1199 | { | 1202 | { |
| 1203 | if (acpi_disabled) | ||
| 1204 | return; | ||
| 1205 | |||
| 1200 | acpi_processor_ppc_exit(); | 1206 | acpi_processor_ppc_exit(); |
| 1201 | 1207 | ||
| 1202 | acpi_thermal_cpufreq_exit(); | 1208 | acpi_thermal_cpufreq_exit(); |
diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c index 0efa59e7e3af..66393d5c4c7c 100644 --- a/drivers/acpi/processor_idle.c +++ b/drivers/acpi/processor_idle.c | |||
| @@ -162,8 +162,9 @@ static void lapic_timer_check_state(int state, struct acpi_processor *pr, | |||
| 162 | pr->power.timer_broadcast_on_state = state; | 162 | pr->power.timer_broadcast_on_state = state; |
| 163 | } | 163 | } |
| 164 | 164 | ||
| 165 | static void lapic_timer_propagate_broadcast(struct acpi_processor *pr) | 165 | static void lapic_timer_propagate_broadcast(void *arg) |
| 166 | { | 166 | { |
| 167 | struct acpi_processor *pr = (struct acpi_processor *) arg; | ||
| 167 | unsigned long reason; | 168 | unsigned long reason; |
| 168 | 169 | ||
| 169 | reason = pr->power.timer_broadcast_on_state < INT_MAX ? | 170 | reason = pr->power.timer_broadcast_on_state < INT_MAX ? |
| @@ -635,7 +636,8 @@ static int acpi_processor_power_verify(struct acpi_processor *pr) | |||
| 635 | working++; | 636 | working++; |
| 636 | } | 637 | } |
| 637 | 638 | ||
| 638 | lapic_timer_propagate_broadcast(pr); | 639 | smp_call_function_single(pr->id, lapic_timer_propagate_broadcast, |
| 640 | pr, 1); | ||
| 639 | 641 | ||
| 640 | return (working); | 642 | return (working); |
| 641 | } | 643 | } |
diff --git a/drivers/acpi/processor_thermal.c b/drivers/acpi/processor_thermal.c index 39838c666032..31adda1099e0 100644 --- a/drivers/acpi/processor_thermal.c +++ b/drivers/acpi/processor_thermal.c | |||
| @@ -66,7 +66,7 @@ static int acpi_processor_apply_limit(struct acpi_processor *pr) | |||
| 66 | if (pr->limit.thermal.tx > tx) | 66 | if (pr->limit.thermal.tx > tx) |
| 67 | tx = pr->limit.thermal.tx; | 67 | tx = pr->limit.thermal.tx; |
| 68 | 68 | ||
| 69 | result = acpi_processor_set_throttling(pr, tx); | 69 | result = acpi_processor_set_throttling(pr, tx, false); |
| 70 | if (result) | 70 | if (result) |
| 71 | goto end; | 71 | goto end; |
| 72 | } | 72 | } |
| @@ -421,12 +421,12 @@ processor_set_cur_state(struct thermal_cooling_device *cdev, | |||
| 421 | 421 | ||
| 422 | if (state <= max_pstate) { | 422 | if (state <= max_pstate) { |
| 423 | if (pr->flags.throttling && pr->throttling.state) | 423 | if (pr->flags.throttling && pr->throttling.state) |
| 424 | result = acpi_processor_set_throttling(pr, 0); | 424 | result = acpi_processor_set_throttling(pr, 0, false); |
| 425 | cpufreq_set_cur_state(pr->id, state); | 425 | cpufreq_set_cur_state(pr->id, state); |
| 426 | } else { | 426 | } else { |
| 427 | cpufreq_set_cur_state(pr->id, max_pstate); | 427 | cpufreq_set_cur_state(pr->id, max_pstate); |
| 428 | result = acpi_processor_set_throttling(pr, | 428 | result = acpi_processor_set_throttling(pr, |
| 429 | state - max_pstate); | 429 | state - max_pstate, false); |
| 430 | } | 430 | } |
| 431 | return result; | 431 | return result; |
| 432 | } | 432 | } |
diff --git a/drivers/acpi/processor_throttling.c b/drivers/acpi/processor_throttling.c index 227543789ba9..ae39797aab55 100644 --- a/drivers/acpi/processor_throttling.c +++ b/drivers/acpi/processor_throttling.c | |||
| @@ -62,7 +62,8 @@ struct throttling_tstate { | |||
| 62 | #define THROTTLING_POSTCHANGE (2) | 62 | #define THROTTLING_POSTCHANGE (2) |
| 63 | 63 | ||
| 64 | static int acpi_processor_get_throttling(struct acpi_processor *pr); | 64 | static int acpi_processor_get_throttling(struct acpi_processor *pr); |
| 65 | int acpi_processor_set_throttling(struct acpi_processor *pr, int state); | 65 | int acpi_processor_set_throttling(struct acpi_processor *pr, |
| 66 | int state, bool force); | ||
| 66 | 67 | ||
| 67 | static int acpi_processor_update_tsd_coord(void) | 68 | static int acpi_processor_update_tsd_coord(void) |
| 68 | { | 69 | { |
| @@ -361,7 +362,7 @@ int acpi_processor_tstate_has_changed(struct acpi_processor *pr) | |||
| 361 | */ | 362 | */ |
| 362 | target_state = throttling_limit; | 363 | target_state = throttling_limit; |
| 363 | } | 364 | } |
| 364 | return acpi_processor_set_throttling(pr, target_state); | 365 | return acpi_processor_set_throttling(pr, target_state, false); |
| 365 | } | 366 | } |
| 366 | 367 | ||
| 367 | /* | 368 | /* |
| @@ -839,10 +840,10 @@ static int acpi_processor_get_throttling_ptc(struct acpi_processor *pr) | |||
| 839 | if (ret >= 0) { | 840 | if (ret >= 0) { |
| 840 | state = acpi_get_throttling_state(pr, value); | 841 | state = acpi_get_throttling_state(pr, value); |
| 841 | if (state == -1) { | 842 | if (state == -1) { |
| 842 | ACPI_WARNING((AE_INFO, | 843 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, |
| 843 | "Invalid throttling state, reset")); | 844 | "Invalid throttling state, reset\n")); |
| 844 | state = 0; | 845 | state = 0; |
| 845 | ret = acpi_processor_set_throttling(pr, state); | 846 | ret = acpi_processor_set_throttling(pr, state, true); |
| 846 | if (ret) | 847 | if (ret) |
| 847 | return ret; | 848 | return ret; |
| 848 | } | 849 | } |
| @@ -915,7 +916,7 @@ static int acpi_processor_get_fadt_info(struct acpi_processor *pr) | |||
| 915 | } | 916 | } |
| 916 | 917 | ||
| 917 | static int acpi_processor_set_throttling_fadt(struct acpi_processor *pr, | 918 | static int acpi_processor_set_throttling_fadt(struct acpi_processor *pr, |
| 918 | int state) | 919 | int state, bool force) |
| 919 | { | 920 | { |
| 920 | u32 value = 0; | 921 | u32 value = 0; |
| 921 | u32 duty_mask = 0; | 922 | u32 duty_mask = 0; |
| @@ -930,7 +931,7 @@ static int acpi_processor_set_throttling_fadt(struct acpi_processor *pr, | |||
| 930 | if (!pr->flags.throttling) | 931 | if (!pr->flags.throttling) |
| 931 | return -ENODEV; | 932 | return -ENODEV; |
| 932 | 933 | ||
| 933 | if (state == pr->throttling.state) | 934 | if (!force && (state == pr->throttling.state)) |
| 934 | return 0; | 935 | return 0; |
| 935 | 936 | ||
| 936 | if (state < pr->throttling_platform_limit) | 937 | if (state < pr->throttling_platform_limit) |
| @@ -988,7 +989,7 @@ static int acpi_processor_set_throttling_fadt(struct acpi_processor *pr, | |||
| 988 | } | 989 | } |
| 989 | 990 | ||
| 990 | static int acpi_processor_set_throttling_ptc(struct acpi_processor *pr, | 991 | static int acpi_processor_set_throttling_ptc(struct acpi_processor *pr, |
| 991 | int state) | 992 | int state, bool force) |
| 992 | { | 993 | { |
| 993 | int ret; | 994 | int ret; |
| 994 | acpi_integer value; | 995 | acpi_integer value; |
| @@ -1002,7 +1003,7 @@ static int acpi_processor_set_throttling_ptc(struct acpi_processor *pr, | |||
| 1002 | if (!pr->flags.throttling) | 1003 | if (!pr->flags.throttling) |
| 1003 | return -ENODEV; | 1004 | return -ENODEV; |
| 1004 | 1005 | ||
| 1005 | if (state == pr->throttling.state) | 1006 | if (!force && (state == pr->throttling.state)) |
| 1006 | return 0; | 1007 | return 0; |
| 1007 | 1008 | ||
| 1008 | if (state < pr->throttling_platform_limit) | 1009 | if (state < pr->throttling_platform_limit) |
| @@ -1018,7 +1019,8 @@ static int acpi_processor_set_throttling_ptc(struct acpi_processor *pr, | |||
| 1018 | return 0; | 1019 | return 0; |
| 1019 | } | 1020 | } |
| 1020 | 1021 | ||
| 1021 | int acpi_processor_set_throttling(struct acpi_processor *pr, int state) | 1022 | int acpi_processor_set_throttling(struct acpi_processor *pr, |
| 1023 | int state, bool force) | ||
| 1022 | { | 1024 | { |
| 1023 | cpumask_var_t saved_mask; | 1025 | cpumask_var_t saved_mask; |
| 1024 | int ret = 0; | 1026 | int ret = 0; |
| @@ -1070,7 +1072,7 @@ int acpi_processor_set_throttling(struct acpi_processor *pr, int state) | |||
| 1070 | /* FIXME: use work_on_cpu() */ | 1072 | /* FIXME: use work_on_cpu() */ |
| 1071 | set_cpus_allowed_ptr(current, cpumask_of(pr->id)); | 1073 | set_cpus_allowed_ptr(current, cpumask_of(pr->id)); |
| 1072 | ret = p_throttling->acpi_processor_set_throttling(pr, | 1074 | ret = p_throttling->acpi_processor_set_throttling(pr, |
| 1073 | t_state.target_state); | 1075 | t_state.target_state, force); |
| 1074 | } else { | 1076 | } else { |
| 1075 | /* | 1077 | /* |
| 1076 | * When the T-state coordination is SW_ALL or HW_ALL, | 1078 | * When the T-state coordination is SW_ALL or HW_ALL, |
| @@ -1103,7 +1105,7 @@ int acpi_processor_set_throttling(struct acpi_processor *pr, int state) | |||
| 1103 | set_cpus_allowed_ptr(current, cpumask_of(i)); | 1105 | set_cpus_allowed_ptr(current, cpumask_of(i)); |
| 1104 | ret = match_pr->throttling. | 1106 | ret = match_pr->throttling. |
| 1105 | acpi_processor_set_throttling( | 1107 | acpi_processor_set_throttling( |
| 1106 | match_pr, t_state.target_state); | 1108 | match_pr, t_state.target_state, force); |
| 1107 | } | 1109 | } |
| 1108 | } | 1110 | } |
| 1109 | /* | 1111 | /* |
| @@ -1201,7 +1203,7 @@ int acpi_processor_get_throttling_info(struct acpi_processor *pr) | |||
| 1201 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, | 1203 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, |
| 1202 | "Disabling throttling (was T%d)\n", | 1204 | "Disabling throttling (was T%d)\n", |
| 1203 | pr->throttling.state)); | 1205 | pr->throttling.state)); |
| 1204 | result = acpi_processor_set_throttling(pr, 0); | 1206 | result = acpi_processor_set_throttling(pr, 0, false); |
| 1205 | if (result) | 1207 | if (result) |
| 1206 | goto end; | 1208 | goto end; |
| 1207 | } | 1209 | } |
| @@ -1307,7 +1309,7 @@ static ssize_t acpi_processor_write_throttling(struct file *file, | |||
| 1307 | if (strcmp(tmpbuf, charp) != 0) | 1309 | if (strcmp(tmpbuf, charp) != 0) |
| 1308 | return -EINVAL; | 1310 | return -EINVAL; |
| 1309 | 1311 | ||
| 1310 | result = acpi_processor_set_throttling(pr, state_val); | 1312 | result = acpi_processor_set_throttling(pr, state_val, false); |
| 1311 | if (result) | 1313 | if (result) |
| 1312 | return result; | 1314 | return result; |
| 1313 | 1315 | ||
diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c index 8851315ce858..60ea984c84a0 100644 --- a/drivers/acpi/video.c +++ b/drivers/acpi/video.c | |||
| @@ -2004,8 +2004,11 @@ static int acpi_video_bus_put_one_device(struct acpi_video_device *device) | |||
| 2004 | status = acpi_remove_notify_handler(device->dev->handle, | 2004 | status = acpi_remove_notify_handler(device->dev->handle, |
| 2005 | ACPI_DEVICE_NOTIFY, | 2005 | ACPI_DEVICE_NOTIFY, |
| 2006 | acpi_video_device_notify); | 2006 | acpi_video_device_notify); |
| 2007 | sysfs_remove_link(&device->backlight->dev.kobj, "device"); | 2007 | if (device->backlight) { |
| 2008 | backlight_device_unregister(device->backlight); | 2008 | sysfs_remove_link(&device->backlight->dev.kobj, "device"); |
| 2009 | backlight_device_unregister(device->backlight); | ||
| 2010 | device->backlight = NULL; | ||
| 2011 | } | ||
| 2009 | if (device->cdev) { | 2012 | if (device->cdev) { |
| 2010 | sysfs_remove_link(&device->dev->dev.kobj, | 2013 | sysfs_remove_link(&device->dev->dev.kobj, |
| 2011 | "thermal_cooling"); | 2014 | "thermal_cooling"); |
diff --git a/drivers/ata/ata_piix.c b/drivers/ata/ata_piix.c index 56b8a3ff1286..9ac4e378992e 100644 --- a/drivers/ata/ata_piix.c +++ b/drivers/ata/ata_piix.c | |||
| @@ -664,6 +664,8 @@ static int piix_pata_prereset(struct ata_link *link, unsigned long deadline) | |||
| 664 | return ata_sff_prereset(link, deadline); | 664 | return ata_sff_prereset(link, deadline); |
| 665 | } | 665 | } |
| 666 | 666 | ||
| 667 | static DEFINE_SPINLOCK(piix_lock); | ||
| 668 | |||
| 667 | /** | 669 | /** |
| 668 | * piix_set_piomode - Initialize host controller PATA PIO timings | 670 | * piix_set_piomode - Initialize host controller PATA PIO timings |
| 669 | * @ap: Port whose timings we are configuring | 671 | * @ap: Port whose timings we are configuring |
| @@ -677,8 +679,9 @@ static int piix_pata_prereset(struct ata_link *link, unsigned long deadline) | |||
| 677 | 679 | ||
| 678 | static void piix_set_piomode(struct ata_port *ap, struct ata_device *adev) | 680 | static void piix_set_piomode(struct ata_port *ap, struct ata_device *adev) |
| 679 | { | 681 | { |
| 680 | unsigned int pio = adev->pio_mode - XFER_PIO_0; | ||
| 681 | struct pci_dev *dev = to_pci_dev(ap->host->dev); | 682 | struct pci_dev *dev = to_pci_dev(ap->host->dev); |
| 683 | unsigned long flags; | ||
| 684 | unsigned int pio = adev->pio_mode - XFER_PIO_0; | ||
| 682 | unsigned int is_slave = (adev->devno != 0); | 685 | unsigned int is_slave = (adev->devno != 0); |
| 683 | unsigned int master_port= ap->port_no ? 0x42 : 0x40; | 686 | unsigned int master_port= ap->port_no ? 0x42 : 0x40; |
| 684 | unsigned int slave_port = 0x44; | 687 | unsigned int slave_port = 0x44; |
| @@ -708,6 +711,8 @@ static void piix_set_piomode(struct ata_port *ap, struct ata_device *adev) | |||
| 708 | if (adev->class == ATA_DEV_ATA) | 711 | if (adev->class == ATA_DEV_ATA) |
| 709 | control |= 4; /* PPE enable */ | 712 | control |= 4; /* PPE enable */ |
| 710 | 713 | ||
| 714 | spin_lock_irqsave(&piix_lock, flags); | ||
| 715 | |||
| 711 | /* PIO configuration clears DTE unconditionally. It will be | 716 | /* PIO configuration clears DTE unconditionally. It will be |
| 712 | * programmed in set_dmamode which is guaranteed to be called | 717 | * programmed in set_dmamode which is guaranteed to be called |
| 713 | * after set_piomode if any DMA mode is available. | 718 | * after set_piomode if any DMA mode is available. |
| @@ -747,6 +752,8 @@ static void piix_set_piomode(struct ata_port *ap, struct ata_device *adev) | |||
| 747 | udma_enable &= ~(1 << (2 * ap->port_no + adev->devno)); | 752 | udma_enable &= ~(1 << (2 * ap->port_no + adev->devno)); |
| 748 | pci_write_config_byte(dev, 0x48, udma_enable); | 753 | pci_write_config_byte(dev, 0x48, udma_enable); |
| 749 | } | 754 | } |
| 755 | |||
| 756 | spin_unlock_irqrestore(&piix_lock, flags); | ||
| 750 | } | 757 | } |
| 751 | 758 | ||
| 752 | /** | 759 | /** |
| @@ -764,6 +771,7 @@ static void piix_set_piomode(struct ata_port *ap, struct ata_device *adev) | |||
| 764 | static void do_pata_set_dmamode(struct ata_port *ap, struct ata_device *adev, int isich) | 771 | static void do_pata_set_dmamode(struct ata_port *ap, struct ata_device *adev, int isich) |
| 765 | { | 772 | { |
| 766 | struct pci_dev *dev = to_pci_dev(ap->host->dev); | 773 | struct pci_dev *dev = to_pci_dev(ap->host->dev); |
| 774 | unsigned long flags; | ||
| 767 | u8 master_port = ap->port_no ? 0x42 : 0x40; | 775 | u8 master_port = ap->port_no ? 0x42 : 0x40; |
| 768 | u16 master_data; | 776 | u16 master_data; |
| 769 | u8 speed = adev->dma_mode; | 777 | u8 speed = adev->dma_mode; |
| @@ -777,6 +785,8 @@ static void do_pata_set_dmamode(struct ata_port *ap, struct ata_device *adev, in | |||
| 777 | { 2, 1 }, | 785 | { 2, 1 }, |
| 778 | { 2, 3 }, }; | 786 | { 2, 3 }, }; |
| 779 | 787 | ||
| 788 | spin_lock_irqsave(&piix_lock, flags); | ||
| 789 | |||
| 780 | pci_read_config_word(dev, master_port, &master_data); | 790 | pci_read_config_word(dev, master_port, &master_data); |
| 781 | if (ap->udma_mask) | 791 | if (ap->udma_mask) |
| 782 | pci_read_config_byte(dev, 0x48, &udma_enable); | 792 | pci_read_config_byte(dev, 0x48, &udma_enable); |
| @@ -867,6 +877,8 @@ static void do_pata_set_dmamode(struct ata_port *ap, struct ata_device *adev, in | |||
| 867 | /* Don't scribble on 0x48 if the controller does not support UDMA */ | 877 | /* Don't scribble on 0x48 if the controller does not support UDMA */ |
| 868 | if (ap->udma_mask) | 878 | if (ap->udma_mask) |
| 869 | pci_write_config_byte(dev, 0x48, udma_enable); | 879 | pci_write_config_byte(dev, 0x48, udma_enable); |
| 880 | |||
| 881 | spin_unlock_irqrestore(&piix_lock, flags); | ||
| 870 | } | 882 | } |
| 871 | 883 | ||
| 872 | /** | 884 | /** |
diff --git a/drivers/block/aoe/aoe.h b/drivers/block/aoe/aoe.h index 5e41e6dd657b..db195abad698 100644 --- a/drivers/block/aoe/aoe.h +++ b/drivers/block/aoe/aoe.h | |||
| @@ -155,7 +155,7 @@ struct aoedev { | |||
| 155 | u16 fw_ver; /* version of blade's firmware */ | 155 | u16 fw_ver; /* version of blade's firmware */ |
| 156 | struct work_struct work;/* disk create work struct */ | 156 | struct work_struct work;/* disk create work struct */ |
| 157 | struct gendisk *gd; | 157 | struct gendisk *gd; |
| 158 | struct request_queue blkq; | 158 | struct request_queue *blkq; |
| 159 | struct hd_geometry geo; | 159 | struct hd_geometry geo; |
| 160 | sector_t ssize; | 160 | sector_t ssize; |
| 161 | struct timer_list timer; | 161 | struct timer_list timer; |
diff --git a/drivers/block/aoe/aoeblk.c b/drivers/block/aoe/aoeblk.c index 2307a271bdc9..1e15889c4b98 100644 --- a/drivers/block/aoe/aoeblk.c +++ b/drivers/block/aoe/aoeblk.c | |||
| @@ -264,9 +264,12 @@ aoeblk_gdalloc(void *vp) | |||
| 264 | goto err_disk; | 264 | goto err_disk; |
| 265 | } | 265 | } |
| 266 | 266 | ||
| 267 | blk_queue_make_request(&d->blkq, aoeblk_make_request); | 267 | d->blkq = blk_alloc_queue(GFP_KERNEL); |
| 268 | if (bdi_init(&d->blkq.backing_dev_info)) | 268 | if (!d->blkq) |
| 269 | goto err_mempool; | 269 | goto err_mempool; |
| 270 | blk_queue_make_request(d->blkq, aoeblk_make_request); | ||
| 271 | if (bdi_init(&d->blkq->backing_dev_info)) | ||
| 272 | goto err_blkq; | ||
| 270 | spin_lock_irqsave(&d->lock, flags); | 273 | spin_lock_irqsave(&d->lock, flags); |
| 271 | gd->major = AOE_MAJOR; | 274 | gd->major = AOE_MAJOR; |
| 272 | gd->first_minor = d->sysminor * AOE_PARTITIONS; | 275 | gd->first_minor = d->sysminor * AOE_PARTITIONS; |
| @@ -276,7 +279,7 @@ aoeblk_gdalloc(void *vp) | |||
| 276 | snprintf(gd->disk_name, sizeof gd->disk_name, "etherd/e%ld.%d", | 279 | snprintf(gd->disk_name, sizeof gd->disk_name, "etherd/e%ld.%d", |
| 277 | d->aoemajor, d->aoeminor); | 280 | d->aoemajor, d->aoeminor); |
| 278 | 281 | ||
| 279 | gd->queue = &d->blkq; | 282 | gd->queue = d->blkq; |
| 280 | d->gd = gd; | 283 | d->gd = gd; |
| 281 | d->flags &= ~DEVFL_GDALLOC; | 284 | d->flags &= ~DEVFL_GDALLOC; |
| 282 | d->flags |= DEVFL_UP; | 285 | d->flags |= DEVFL_UP; |
| @@ -287,6 +290,9 @@ aoeblk_gdalloc(void *vp) | |||
| 287 | aoedisk_add_sysfs(d); | 290 | aoedisk_add_sysfs(d); |
| 288 | return; | 291 | return; |
| 289 | 292 | ||
| 293 | err_blkq: | ||
| 294 | blk_cleanup_queue(d->blkq); | ||
| 295 | d->blkq = NULL; | ||
| 290 | err_mempool: | 296 | err_mempool: |
| 291 | mempool_destroy(d->bufpool); | 297 | mempool_destroy(d->bufpool); |
| 292 | err_disk: | 298 | err_disk: |
diff --git a/drivers/block/aoe/aoedev.c b/drivers/block/aoe/aoedev.c index eeea477d9601..fa67027789aa 100644 --- a/drivers/block/aoe/aoedev.c +++ b/drivers/block/aoe/aoedev.c | |||
| @@ -113,6 +113,7 @@ aoedev_freedev(struct aoedev *d) | |||
| 113 | if (d->bufpool) | 113 | if (d->bufpool) |
| 114 | mempool_destroy(d->bufpool); | 114 | mempool_destroy(d->bufpool); |
| 115 | skbpoolfree(d); | 115 | skbpoolfree(d); |
| 116 | blk_cleanup_queue(d->blkq); | ||
| 116 | kfree(d); | 117 | kfree(d); |
| 117 | } | 118 | } |
| 118 | 119 | ||
diff --git a/drivers/char/agp/intel-agp.c b/drivers/char/agp/intel-agp.c index 8c9d50db5c3a..c58557790585 100644 --- a/drivers/char/agp/intel-agp.c +++ b/drivers/char/agp/intel-agp.c | |||
| @@ -49,6 +49,7 @@ | |||
| 49 | #define PCI_DEVICE_ID_INTEL_IGDNG_D_HB 0x0040 | 49 | #define PCI_DEVICE_ID_INTEL_IGDNG_D_HB 0x0040 |
| 50 | #define PCI_DEVICE_ID_INTEL_IGDNG_D_IG 0x0042 | 50 | #define PCI_DEVICE_ID_INTEL_IGDNG_D_IG 0x0042 |
| 51 | #define PCI_DEVICE_ID_INTEL_IGDNG_M_HB 0x0044 | 51 | #define PCI_DEVICE_ID_INTEL_IGDNG_M_HB 0x0044 |
| 52 | #define PCI_DEVICE_ID_INTEL_IGDNG_MA_HB 0x0062 | ||
| 52 | #define PCI_DEVICE_ID_INTEL_IGDNG_M_IG 0x0046 | 53 | #define PCI_DEVICE_ID_INTEL_IGDNG_M_IG 0x0046 |
| 53 | 54 | ||
| 54 | /* cover 915 and 945 variants */ | 55 | /* cover 915 and 945 variants */ |
| @@ -81,7 +82,8 @@ | |||
| 81 | agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_GM45_HB || \ | 82 | agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_GM45_HB || \ |
| 82 | agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_G41_HB || \ | 83 | agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_G41_HB || \ |
| 83 | agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_IGDNG_D_HB || \ | 84 | agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_IGDNG_D_HB || \ |
| 84 | agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_IGDNG_M_HB) | 85 | agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_IGDNG_M_HB || \ |
| 86 | agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_IGDNG_MA_HB) | ||
| 85 | 87 | ||
| 86 | extern int agp_memory_reserved; | 88 | extern int agp_memory_reserved; |
| 87 | 89 | ||
| @@ -1216,6 +1218,7 @@ static void intel_i965_get_gtt_range(int *gtt_offset, int *gtt_size) | |||
| 1216 | case PCI_DEVICE_ID_INTEL_G41_HB: | 1218 | case PCI_DEVICE_ID_INTEL_G41_HB: |
| 1217 | case PCI_DEVICE_ID_INTEL_IGDNG_D_HB: | 1219 | case PCI_DEVICE_ID_INTEL_IGDNG_D_HB: |
| 1218 | case PCI_DEVICE_ID_INTEL_IGDNG_M_HB: | 1220 | case PCI_DEVICE_ID_INTEL_IGDNG_M_HB: |
| 1221 | case PCI_DEVICE_ID_INTEL_IGDNG_MA_HB: | ||
| 1219 | *gtt_offset = *gtt_size = MB(2); | 1222 | *gtt_offset = *gtt_size = MB(2); |
| 1220 | break; | 1223 | break; |
| 1221 | default: | 1224 | default: |
| @@ -2195,6 +2198,8 @@ static const struct intel_driver_description { | |||
| 2195 | "IGDNG/D", NULL, &intel_i965_driver }, | 2198 | "IGDNG/D", NULL, &intel_i965_driver }, |
| 2196 | { PCI_DEVICE_ID_INTEL_IGDNG_M_HB, PCI_DEVICE_ID_INTEL_IGDNG_M_IG, 0, | 2199 | { PCI_DEVICE_ID_INTEL_IGDNG_M_HB, PCI_DEVICE_ID_INTEL_IGDNG_M_IG, 0, |
| 2197 | "IGDNG/M", NULL, &intel_i965_driver }, | 2200 | "IGDNG/M", NULL, &intel_i965_driver }, |
| 2201 | { PCI_DEVICE_ID_INTEL_IGDNG_MA_HB, PCI_DEVICE_ID_INTEL_IGDNG_M_IG, 0, | ||
| 2202 | "IGDNG/MA", NULL, &intel_i965_driver }, | ||
| 2198 | { 0, 0, 0, NULL, NULL, NULL } | 2203 | { 0, 0, 0, NULL, NULL, NULL } |
| 2199 | }; | 2204 | }; |
| 2200 | 2205 | ||
| @@ -2398,6 +2403,7 @@ static struct pci_device_id agp_intel_pci_table[] = { | |||
| 2398 | ID(PCI_DEVICE_ID_INTEL_G41_HB), | 2403 | ID(PCI_DEVICE_ID_INTEL_G41_HB), |
| 2399 | ID(PCI_DEVICE_ID_INTEL_IGDNG_D_HB), | 2404 | ID(PCI_DEVICE_ID_INTEL_IGDNG_D_HB), |
| 2400 | ID(PCI_DEVICE_ID_INTEL_IGDNG_M_HB), | 2405 | ID(PCI_DEVICE_ID_INTEL_IGDNG_M_HB), |
| 2406 | ID(PCI_DEVICE_ID_INTEL_IGDNG_MA_HB), | ||
| 2401 | { } | 2407 | { } |
| 2402 | }; | 2408 | }; |
| 2403 | 2409 | ||
diff --git a/drivers/char/n_tty.c b/drivers/char/n_tty.c index 973be2f44195..4e28b35024ec 100644 --- a/drivers/char/n_tty.c +++ b/drivers/char/n_tty.c | |||
| @@ -300,8 +300,7 @@ static int do_output_char(unsigned char c, struct tty_struct *tty, int space) | |||
| 300 | if (space < 2) | 300 | if (space < 2) |
| 301 | return -1; | 301 | return -1; |
| 302 | tty->canon_column = tty->column = 0; | 302 | tty->canon_column = tty->column = 0; |
| 303 | tty_put_char(tty, '\r'); | 303 | tty->ops->write(tty, "\r\n", 2); |
| 304 | tty_put_char(tty, c); | ||
| 305 | return 2; | 304 | return 2; |
| 306 | } | 305 | } |
| 307 | tty->canon_column = tty->column; | 306 | tty->canon_column = tty->column; |
diff --git a/drivers/char/pty.c b/drivers/char/pty.c index d083c73d784a..b33d6688e910 100644 --- a/drivers/char/pty.c +++ b/drivers/char/pty.c | |||
| @@ -109,21 +109,13 @@ static int pty_space(struct tty_struct *to) | |||
| 109 | * the other side of the pty/tty pair. | 109 | * the other side of the pty/tty pair. |
| 110 | */ | 110 | */ |
| 111 | 111 | ||
| 112 | static int pty_write(struct tty_struct *tty, const unsigned char *buf, | 112 | static int pty_write(struct tty_struct *tty, const unsigned char *buf, int c) |
| 113 | int count) | ||
| 114 | { | 113 | { |
| 115 | struct tty_struct *to = tty->link; | 114 | struct tty_struct *to = tty->link; |
| 116 | int c; | ||
| 117 | 115 | ||
| 118 | if (tty->stopped) | 116 | if (tty->stopped) |
| 119 | return 0; | 117 | return 0; |
| 120 | 118 | ||
| 121 | /* This isn't locked but our 8K is quite sloppy so no | ||
| 122 | big deal */ | ||
| 123 | |||
| 124 | c = pty_space(to); | ||
| 125 | if (c > count) | ||
| 126 | c = count; | ||
| 127 | if (c > 0) { | 119 | if (c > 0) { |
| 128 | /* Stuff the data into the input queue of the other end */ | 120 | /* Stuff the data into the input queue of the other end */ |
| 129 | c = tty_insert_flip_string(to, buf, c); | 121 | c = tty_insert_flip_string(to, buf, c); |
diff --git a/drivers/char/tty_ldisc.c b/drivers/char/tty_ldisc.c index 1733d3439ad2..e48af9f79219 100644 --- a/drivers/char/tty_ldisc.c +++ b/drivers/char/tty_ldisc.c | |||
| @@ -508,8 +508,9 @@ static void tty_ldisc_restore(struct tty_struct *tty, struct tty_ldisc *old) | |||
| 508 | * be obtained while the delayed work queue halt ensures that no more | 508 | * be obtained while the delayed work queue halt ensures that no more |
| 509 | * data is fed to the ldisc. | 509 | * data is fed to the ldisc. |
| 510 | * | 510 | * |
| 511 | * In order to wait for any existing references to complete see | 511 | * You need to do a 'flush_scheduled_work()' (outside the ldisc_mutex) |
| 512 | * tty_ldisc_wait_idle. | 512 | * in order to make sure any currently executing ldisc work is also |
| 513 | * flushed. | ||
| 513 | */ | 514 | */ |
| 514 | 515 | ||
| 515 | static int tty_ldisc_halt(struct tty_struct *tty) | 516 | static int tty_ldisc_halt(struct tty_struct *tty) |
| @@ -753,11 +754,14 @@ void tty_ldisc_hangup(struct tty_struct *tty) | |||
| 753 | * N_TTY. | 754 | * N_TTY. |
| 754 | */ | 755 | */ |
| 755 | if (tty->driver->flags & TTY_DRIVER_RESET_TERMIOS) { | 756 | if (tty->driver->flags & TTY_DRIVER_RESET_TERMIOS) { |
| 757 | /* Make sure the old ldisc is quiescent */ | ||
| 758 | tty_ldisc_halt(tty); | ||
| 759 | flush_scheduled_work(); | ||
| 760 | |||
| 756 | /* Avoid racing set_ldisc or tty_ldisc_release */ | 761 | /* Avoid racing set_ldisc or tty_ldisc_release */ |
| 757 | mutex_lock(&tty->ldisc_mutex); | 762 | mutex_lock(&tty->ldisc_mutex); |
| 758 | if (tty->ldisc) { /* Not yet closed */ | 763 | if (tty->ldisc) { /* Not yet closed */ |
| 759 | /* Switch back to N_TTY */ | 764 | /* Switch back to N_TTY */ |
| 760 | tty_ldisc_halt(tty); | ||
| 761 | tty_ldisc_reinit(tty); | 765 | tty_ldisc_reinit(tty); |
| 762 | /* At this point we have a closed ldisc and we want to | 766 | /* At this point we have a closed ldisc and we want to |
| 763 | reopen it. We could defer this to the next open but | 767 | reopen it. We could defer this to the next open but |
diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c index fd69086d08d5..2968ed6a9c49 100644 --- a/drivers/cpufreq/cpufreq.c +++ b/drivers/cpufreq/cpufreq.c | |||
| @@ -1250,20 +1250,11 @@ static int cpufreq_suspend(struct sys_device *sysdev, pm_message_t pmsg) | |||
| 1250 | { | 1250 | { |
| 1251 | int ret = 0; | 1251 | int ret = 0; |
| 1252 | 1252 | ||
| 1253 | #ifdef __powerpc__ | ||
| 1254 | int cpu = sysdev->id; | 1253 | int cpu = sysdev->id; |
| 1255 | unsigned int cur_freq = 0; | ||
| 1256 | struct cpufreq_policy *cpu_policy; | 1254 | struct cpufreq_policy *cpu_policy; |
| 1257 | 1255 | ||
| 1258 | dprintk("suspending cpu %u\n", cpu); | 1256 | dprintk("suspending cpu %u\n", cpu); |
| 1259 | 1257 | ||
| 1260 | /* | ||
| 1261 | * This whole bogosity is here because Powerbooks are made of fail. | ||
| 1262 | * No sane platform should need any of the code below to be run. | ||
| 1263 | * (it's entirely the wrong thing to do, as driver->get may | ||
| 1264 | * reenable interrupts on some architectures). | ||
| 1265 | */ | ||
| 1266 | |||
| 1267 | if (!cpu_online(cpu)) | 1258 | if (!cpu_online(cpu)) |
| 1268 | return 0; | 1259 | return 0; |
| 1269 | 1260 | ||
| @@ -1282,47 +1273,13 @@ static int cpufreq_suspend(struct sys_device *sysdev, pm_message_t pmsg) | |||
| 1282 | 1273 | ||
| 1283 | if (cpufreq_driver->suspend) { | 1274 | if (cpufreq_driver->suspend) { |
| 1284 | ret = cpufreq_driver->suspend(cpu_policy, pmsg); | 1275 | ret = cpufreq_driver->suspend(cpu_policy, pmsg); |
| 1285 | if (ret) { | 1276 | if (ret) |
| 1286 | printk(KERN_ERR "cpufreq: suspend failed in ->suspend " | 1277 | printk(KERN_ERR "cpufreq: suspend failed in ->suspend " |
| 1287 | "step on CPU %u\n", cpu_policy->cpu); | 1278 | "step on CPU %u\n", cpu_policy->cpu); |
| 1288 | goto out; | ||
| 1289 | } | ||
| 1290 | } | ||
| 1291 | |||
| 1292 | if (cpufreq_driver->flags & CPUFREQ_CONST_LOOPS) | ||
| 1293 | goto out; | ||
| 1294 | |||
| 1295 | if (cpufreq_driver->get) | ||
| 1296 | cur_freq = cpufreq_driver->get(cpu_policy->cpu); | ||
| 1297 | |||
| 1298 | if (!cur_freq || !cpu_policy->cur) { | ||
| 1299 | printk(KERN_ERR "cpufreq: suspend failed to assert current " | ||
| 1300 | "frequency is what timing core thinks it is.\n"); | ||
| 1301 | goto out; | ||
| 1302 | } | ||
| 1303 | |||
| 1304 | if (unlikely(cur_freq != cpu_policy->cur)) { | ||
| 1305 | struct cpufreq_freqs freqs; | ||
| 1306 | |||
| 1307 | if (!(cpufreq_driver->flags & CPUFREQ_PM_NO_WARN)) | ||
| 1308 | dprintk("Warning: CPU frequency is %u, " | ||
| 1309 | "cpufreq assumed %u kHz.\n", | ||
| 1310 | cur_freq, cpu_policy->cur); | ||
| 1311 | |||
| 1312 | freqs.cpu = cpu; | ||
| 1313 | freqs.old = cpu_policy->cur; | ||
| 1314 | freqs.new = cur_freq; | ||
| 1315 | |||
| 1316 | srcu_notifier_call_chain(&cpufreq_transition_notifier_list, | ||
| 1317 | CPUFREQ_SUSPENDCHANGE, &freqs); | ||
| 1318 | adjust_jiffies(CPUFREQ_SUSPENDCHANGE, &freqs); | ||
| 1319 | |||
| 1320 | cpu_policy->cur = cur_freq; | ||
| 1321 | } | 1279 | } |
| 1322 | 1280 | ||
| 1323 | out: | 1281 | out: |
| 1324 | cpufreq_cpu_put(cpu_policy); | 1282 | cpufreq_cpu_put(cpu_policy); |
| 1325 | #endif /* __powerpc__ */ | ||
| 1326 | return ret; | 1283 | return ret; |
| 1327 | } | 1284 | } |
| 1328 | 1285 | ||
| @@ -1330,24 +1287,21 @@ out: | |||
| 1330 | * cpufreq_resume - restore proper CPU frequency handling after resume | 1287 | * cpufreq_resume - restore proper CPU frequency handling after resume |
| 1331 | * | 1288 | * |
| 1332 | * 1.) resume CPUfreq hardware support (cpufreq_driver->resume()) | 1289 | * 1.) resume CPUfreq hardware support (cpufreq_driver->resume()) |
| 1333 | * 2.) if ->target and !CPUFREQ_CONST_LOOPS: verify we're in sync | 1290 | * 2.) schedule call cpufreq_update_policy() ASAP as interrupts are |
| 1334 | * 3.) schedule call cpufreq_update_policy() ASAP as interrupts are | 1291 | * restored. It will verify that the current freq is in sync with |
| 1335 | * restored. | 1292 | * what we believe it to be. This is a bit later than when it |
| 1293 | * should be, but nonethteless it's better than calling | ||
| 1294 | * cpufreq_driver->get() here which might re-enable interrupts... | ||
| 1336 | */ | 1295 | */ |
| 1337 | static int cpufreq_resume(struct sys_device *sysdev) | 1296 | static int cpufreq_resume(struct sys_device *sysdev) |
| 1338 | { | 1297 | { |
| 1339 | int ret = 0; | 1298 | int ret = 0; |
| 1340 | 1299 | ||
| 1341 | #ifdef __powerpc__ | ||
| 1342 | int cpu = sysdev->id; | 1300 | int cpu = sysdev->id; |
| 1343 | struct cpufreq_policy *cpu_policy; | 1301 | struct cpufreq_policy *cpu_policy; |
| 1344 | 1302 | ||
| 1345 | dprintk("resuming cpu %u\n", cpu); | 1303 | dprintk("resuming cpu %u\n", cpu); |
| 1346 | 1304 | ||
| 1347 | /* As with the ->suspend method, all the code below is | ||
| 1348 | * only necessary because Powerbooks suck. | ||
| 1349 | * See commit 42d4dc3f4e1e for jokes. */ | ||
| 1350 | |||
| 1351 | if (!cpu_online(cpu)) | 1305 | if (!cpu_online(cpu)) |
| 1352 | return 0; | 1306 | return 0; |
| 1353 | 1307 | ||
| @@ -1373,45 +1327,10 @@ static int cpufreq_resume(struct sys_device *sysdev) | |||
| 1373 | } | 1327 | } |
| 1374 | } | 1328 | } |
| 1375 | 1329 | ||
| 1376 | if (!(cpufreq_driver->flags & CPUFREQ_CONST_LOOPS)) { | ||
| 1377 | unsigned int cur_freq = 0; | ||
| 1378 | |||
| 1379 | if (cpufreq_driver->get) | ||
| 1380 | cur_freq = cpufreq_driver->get(cpu_policy->cpu); | ||
| 1381 | |||
| 1382 | if (!cur_freq || !cpu_policy->cur) { | ||
| 1383 | printk(KERN_ERR "cpufreq: resume failed to assert " | ||
| 1384 | "current frequency is what timing core " | ||
| 1385 | "thinks it is.\n"); | ||
| 1386 | goto out; | ||
| 1387 | } | ||
| 1388 | |||
| 1389 | if (unlikely(cur_freq != cpu_policy->cur)) { | ||
| 1390 | struct cpufreq_freqs freqs; | ||
| 1391 | |||
| 1392 | if (!(cpufreq_driver->flags & CPUFREQ_PM_NO_WARN)) | ||
| 1393 | dprintk("Warning: CPU frequency " | ||
| 1394 | "is %u, cpufreq assumed %u kHz.\n", | ||
| 1395 | cur_freq, cpu_policy->cur); | ||
| 1396 | |||
| 1397 | freqs.cpu = cpu; | ||
| 1398 | freqs.old = cpu_policy->cur; | ||
| 1399 | freqs.new = cur_freq; | ||
| 1400 | |||
| 1401 | srcu_notifier_call_chain( | ||
| 1402 | &cpufreq_transition_notifier_list, | ||
| 1403 | CPUFREQ_RESUMECHANGE, &freqs); | ||
| 1404 | adjust_jiffies(CPUFREQ_RESUMECHANGE, &freqs); | ||
| 1405 | |||
| 1406 | cpu_policy->cur = cur_freq; | ||
| 1407 | } | ||
| 1408 | } | ||
| 1409 | |||
| 1410 | out: | ||
| 1411 | schedule_work(&cpu_policy->update); | 1330 | schedule_work(&cpu_policy->update); |
| 1331 | |||
| 1412 | fail: | 1332 | fail: |
| 1413 | cpufreq_cpu_put(cpu_policy); | 1333 | cpufreq_cpu_put(cpu_policy); |
| 1414 | #endif /* __powerpc__ */ | ||
| 1415 | return ret; | 1334 | return ret; |
| 1416 | } | 1335 | } |
| 1417 | 1336 | ||
diff --git a/drivers/firewire/core-iso.c b/drivers/firewire/core-iso.c index 110e731f5574..1c0b504a42f3 100644 --- a/drivers/firewire/core-iso.c +++ b/drivers/firewire/core-iso.c | |||
| @@ -196,7 +196,7 @@ static int manage_bandwidth(struct fw_card *card, int irm_id, int generation, | |||
| 196 | switch (fw_run_transaction(card, TCODE_LOCK_COMPARE_SWAP, | 196 | switch (fw_run_transaction(card, TCODE_LOCK_COMPARE_SWAP, |
| 197 | irm_id, generation, SCODE_100, | 197 | irm_id, generation, SCODE_100, |
| 198 | CSR_REGISTER_BASE + CSR_BANDWIDTH_AVAILABLE, | 198 | CSR_REGISTER_BASE + CSR_BANDWIDTH_AVAILABLE, |
| 199 | data, sizeof(data))) { | 199 | data, 8)) { |
| 200 | case RCODE_GENERATION: | 200 | case RCODE_GENERATION: |
| 201 | /* A generation change frees all bandwidth. */ | 201 | /* A generation change frees all bandwidth. */ |
| 202 | return allocate ? -EAGAIN : bandwidth; | 202 | return allocate ? -EAGAIN : bandwidth; |
| @@ -233,7 +233,7 @@ static int manage_channel(struct fw_card *card, int irm_id, int generation, | |||
| 233 | data[1] = old ^ c; | 233 | data[1] = old ^ c; |
| 234 | switch (fw_run_transaction(card, TCODE_LOCK_COMPARE_SWAP, | 234 | switch (fw_run_transaction(card, TCODE_LOCK_COMPARE_SWAP, |
| 235 | irm_id, generation, SCODE_100, | 235 | irm_id, generation, SCODE_100, |
| 236 | offset, data, sizeof(data))) { | 236 | offset, data, 8)) { |
| 237 | case RCODE_GENERATION: | 237 | case RCODE_GENERATION: |
| 238 | /* A generation change frees all channels. */ | 238 | /* A generation change frees all channels. */ |
| 239 | return allocate ? -EAGAIN : i; | 239 | return allocate ? -EAGAIN : i; |
diff --git a/drivers/firewire/ohci.c b/drivers/firewire/ohci.c index ecddd11b797a..76b321bb73f9 100644 --- a/drivers/firewire/ohci.c +++ b/drivers/firewire/ohci.c | |||
| @@ -34,6 +34,7 @@ | |||
| 34 | #include <linux/module.h> | 34 | #include <linux/module.h> |
| 35 | #include <linux/moduleparam.h> | 35 | #include <linux/moduleparam.h> |
| 36 | #include <linux/pci.h> | 36 | #include <linux/pci.h> |
| 37 | #include <linux/pci_ids.h> | ||
| 37 | #include <linux/spinlock.h> | 38 | #include <linux/spinlock.h> |
| 38 | #include <linux/string.h> | 39 | #include <linux/string.h> |
| 39 | 40 | ||
| @@ -2372,6 +2373,9 @@ static void ohci_pmac_off(struct pci_dev *dev) | |||
| 2372 | #define ohci_pmac_off(dev) | 2373 | #define ohci_pmac_off(dev) |
| 2373 | #endif /* CONFIG_PPC_PMAC */ | 2374 | #endif /* CONFIG_PPC_PMAC */ |
| 2374 | 2375 | ||
| 2376 | #define PCI_VENDOR_ID_AGERE PCI_VENDOR_ID_ATT | ||
| 2377 | #define PCI_DEVICE_ID_AGERE_FW643 0x5901 | ||
| 2378 | |||
| 2375 | static int __devinit pci_probe(struct pci_dev *dev, | 2379 | static int __devinit pci_probe(struct pci_dev *dev, |
| 2376 | const struct pci_device_id *ent) | 2380 | const struct pci_device_id *ent) |
| 2377 | { | 2381 | { |
| @@ -2422,6 +2426,16 @@ static int __devinit pci_probe(struct pci_dev *dev, | |||
| 2422 | version = reg_read(ohci, OHCI1394_Version) & 0x00ff00ff; | 2426 | version = reg_read(ohci, OHCI1394_Version) & 0x00ff00ff; |
| 2423 | ohci->use_dualbuffer = version >= OHCI_VERSION_1_1; | 2427 | ohci->use_dualbuffer = version >= OHCI_VERSION_1_1; |
| 2424 | 2428 | ||
| 2429 | /* dual-buffer mode is broken if more than one IR context is active */ | ||
| 2430 | if (dev->vendor == PCI_VENDOR_ID_AGERE && | ||
| 2431 | dev->device == PCI_DEVICE_ID_AGERE_FW643) | ||
| 2432 | ohci->use_dualbuffer = false; | ||
| 2433 | |||
| 2434 | /* dual-buffer mode is broken */ | ||
| 2435 | if (dev->vendor == PCI_VENDOR_ID_RICOH && | ||
| 2436 | dev->device == PCI_DEVICE_ID_RICOH_R5C832) | ||
| 2437 | ohci->use_dualbuffer = false; | ||
| 2438 | |||
| 2425 | /* x86-32 currently doesn't use highmem for dma_alloc_coherent */ | 2439 | /* x86-32 currently doesn't use highmem for dma_alloc_coherent */ |
| 2426 | #if !defined(CONFIG_X86_32) | 2440 | #if !defined(CONFIG_X86_32) |
| 2427 | /* dual-buffer mode is broken with descriptor addresses above 2G */ | 2441 | /* dual-buffer mode is broken with descriptor addresses above 2G */ |
diff --git a/drivers/firewire/sbp2.c b/drivers/firewire/sbp2.c index 8d51568ee143..e5df822a8130 100644 --- a/drivers/firewire/sbp2.c +++ b/drivers/firewire/sbp2.c | |||
| @@ -456,12 +456,12 @@ static void sbp2_status_write(struct fw_card *card, struct fw_request *request, | |||
| 456 | } | 456 | } |
| 457 | spin_unlock_irqrestore(&card->lock, flags); | 457 | spin_unlock_irqrestore(&card->lock, flags); |
| 458 | 458 | ||
| 459 | if (&orb->link != &lu->orb_list) | 459 | if (&orb->link != &lu->orb_list) { |
| 460 | orb->callback(orb, &status); | 460 | orb->callback(orb, &status); |
| 461 | else | 461 | kref_put(&orb->kref, free_orb); |
| 462 | } else { | ||
| 462 | fw_error("status write for unknown orb\n"); | 463 | fw_error("status write for unknown orb\n"); |
| 463 | 464 | } | |
| 464 | kref_put(&orb->kref, free_orb); | ||
| 465 | 465 | ||
| 466 | fw_send_response(card, request, RCODE_COMPLETE); | 466 | fw_send_response(card, request, RCODE_COMPLETE); |
| 467 | } | 467 | } |
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 7537f57d8a87..5b4f87e55621 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h | |||
| @@ -222,6 +222,7 @@ typedef struct drm_i915_private { | |||
| 222 | unsigned int edp_support:1; | 222 | unsigned int edp_support:1; |
| 223 | int lvds_ssc_freq; | 223 | int lvds_ssc_freq; |
| 224 | 224 | ||
| 225 | int crt_ddc_bus; /* -1 = unknown, else GPIO to use for CRT DDC */ | ||
| 225 | struct drm_i915_fence_reg fence_regs[16]; /* assume 965 */ | 226 | struct drm_i915_fence_reg fence_regs[16]; /* assume 965 */ |
| 226 | int fence_reg_start; /* 4 if userland hasn't ioctl'd us yet */ | 227 | int fence_reg_start; /* 4 if userland hasn't ioctl'd us yet */ |
| 227 | int num_fence_regs; /* 8 on pre-965, 16 otherwise */ | 228 | int num_fence_regs; /* 8 on pre-965, 16 otherwise */ |
| @@ -384,6 +385,9 @@ typedef struct drm_i915_private { | |||
| 384 | */ | 385 | */ |
| 385 | struct list_head inactive_list; | 386 | struct list_head inactive_list; |
| 386 | 387 | ||
| 388 | /** LRU list of objects with fence regs on them. */ | ||
| 389 | struct list_head fence_list; | ||
| 390 | |||
| 387 | /** | 391 | /** |
| 388 | * List of breadcrumbs associated with GPU requests currently | 392 | * List of breadcrumbs associated with GPU requests currently |
| 389 | * outstanding. | 393 | * outstanding. |
| @@ -451,6 +455,9 @@ struct drm_i915_gem_object { | |||
| 451 | /** This object's place on the active/flushing/inactive lists */ | 455 | /** This object's place on the active/flushing/inactive lists */ |
| 452 | struct list_head list; | 456 | struct list_head list; |
| 453 | 457 | ||
| 458 | /** This object's place on the fenced object LRU */ | ||
| 459 | struct list_head fence_list; | ||
| 460 | |||
| 454 | /** | 461 | /** |
| 455 | * This is set if the object is on the active or flushing lists | 462 | * This is set if the object is on the active or flushing lists |
| 456 | * (has pending rendering), and is not set if it's on inactive (ready | 463 | * (has pending rendering), and is not set if it's on inactive (ready |
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 140bee142fc2..80e5ba490dc2 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
| @@ -978,6 +978,7 @@ int | |||
| 978 | i915_gem_set_domain_ioctl(struct drm_device *dev, void *data, | 978 | i915_gem_set_domain_ioctl(struct drm_device *dev, void *data, |
| 979 | struct drm_file *file_priv) | 979 | struct drm_file *file_priv) |
| 980 | { | 980 | { |
| 981 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
| 981 | struct drm_i915_gem_set_domain *args = data; | 982 | struct drm_i915_gem_set_domain *args = data; |
| 982 | struct drm_gem_object *obj; | 983 | struct drm_gem_object *obj; |
| 983 | uint32_t read_domains = args->read_domains; | 984 | uint32_t read_domains = args->read_domains; |
| @@ -1010,8 +1011,18 @@ i915_gem_set_domain_ioctl(struct drm_device *dev, void *data, | |||
| 1010 | obj, obj->size, read_domains, write_domain); | 1011 | obj, obj->size, read_domains, write_domain); |
| 1011 | #endif | 1012 | #endif |
| 1012 | if (read_domains & I915_GEM_DOMAIN_GTT) { | 1013 | if (read_domains & I915_GEM_DOMAIN_GTT) { |
| 1014 | struct drm_i915_gem_object *obj_priv = obj->driver_private; | ||
| 1015 | |||
| 1013 | ret = i915_gem_object_set_to_gtt_domain(obj, write_domain != 0); | 1016 | ret = i915_gem_object_set_to_gtt_domain(obj, write_domain != 0); |
| 1014 | 1017 | ||
| 1018 | /* Update the LRU on the fence for the CPU access that's | ||
| 1019 | * about to occur. | ||
| 1020 | */ | ||
| 1021 | if (obj_priv->fence_reg != I915_FENCE_REG_NONE) { | ||
| 1022 | list_move_tail(&obj_priv->fence_list, | ||
| 1023 | &dev_priv->mm.fence_list); | ||
| 1024 | } | ||
| 1025 | |||
| 1015 | /* Silently promote "you're not bound, there was nothing to do" | 1026 | /* Silently promote "you're not bound, there was nothing to do" |
| 1016 | * to success, since the client was just asking us to | 1027 | * to success, since the client was just asking us to |
| 1017 | * make sure everything was done. | 1028 | * make sure everything was done. |
| @@ -1155,8 +1166,7 @@ int i915_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf) | |||
| 1155 | } | 1166 | } |
| 1156 | 1167 | ||
| 1157 | /* Need a new fence register? */ | 1168 | /* Need a new fence register? */ |
| 1158 | if (obj_priv->fence_reg == I915_FENCE_REG_NONE && | 1169 | if (obj_priv->tiling_mode != I915_TILING_NONE) { |
| 1159 | obj_priv->tiling_mode != I915_TILING_NONE) { | ||
| 1160 | ret = i915_gem_object_get_fence_reg(obj); | 1170 | ret = i915_gem_object_get_fence_reg(obj); |
| 1161 | if (ret) { | 1171 | if (ret) { |
| 1162 | mutex_unlock(&dev->struct_mutex); | 1172 | mutex_unlock(&dev->struct_mutex); |
| @@ -2208,6 +2218,12 @@ i915_gem_object_get_fence_reg(struct drm_gem_object *obj) | |||
| 2208 | struct drm_i915_gem_object *old_obj_priv = NULL; | 2218 | struct drm_i915_gem_object *old_obj_priv = NULL; |
| 2209 | int i, ret, avail; | 2219 | int i, ret, avail; |
| 2210 | 2220 | ||
| 2221 | /* Just update our place in the LRU if our fence is getting used. */ | ||
| 2222 | if (obj_priv->fence_reg != I915_FENCE_REG_NONE) { | ||
| 2223 | list_move_tail(&obj_priv->fence_list, &dev_priv->mm.fence_list); | ||
| 2224 | return 0; | ||
| 2225 | } | ||
| 2226 | |||
| 2211 | switch (obj_priv->tiling_mode) { | 2227 | switch (obj_priv->tiling_mode) { |
| 2212 | case I915_TILING_NONE: | 2228 | case I915_TILING_NONE: |
| 2213 | WARN(1, "allocating a fence for non-tiled object?\n"); | 2229 | WARN(1, "allocating a fence for non-tiled object?\n"); |
| @@ -2229,7 +2245,6 @@ i915_gem_object_get_fence_reg(struct drm_gem_object *obj) | |||
| 2229 | } | 2245 | } |
| 2230 | 2246 | ||
| 2231 | /* First try to find a free reg */ | 2247 | /* First try to find a free reg */ |
| 2232 | try_again: | ||
| 2233 | avail = 0; | 2248 | avail = 0; |
| 2234 | for (i = dev_priv->fence_reg_start; i < dev_priv->num_fence_regs; i++) { | 2249 | for (i = dev_priv->fence_reg_start; i < dev_priv->num_fence_regs; i++) { |
| 2235 | reg = &dev_priv->fence_regs[i]; | 2250 | reg = &dev_priv->fence_regs[i]; |
| @@ -2243,63 +2258,62 @@ try_again: | |||
| 2243 | 2258 | ||
| 2244 | /* None available, try to steal one or wait for a user to finish */ | 2259 | /* None available, try to steal one or wait for a user to finish */ |
| 2245 | if (i == dev_priv->num_fence_regs) { | 2260 | if (i == dev_priv->num_fence_regs) { |
| 2246 | uint32_t seqno = dev_priv->mm.next_gem_seqno; | 2261 | struct drm_gem_object *old_obj = NULL; |
| 2247 | 2262 | ||
| 2248 | if (avail == 0) | 2263 | if (avail == 0) |
| 2249 | return -ENOSPC; | 2264 | return -ENOSPC; |
| 2250 | 2265 | ||
| 2251 | for (i = dev_priv->fence_reg_start; | 2266 | list_for_each_entry(old_obj_priv, &dev_priv->mm.fence_list, |
| 2252 | i < dev_priv->num_fence_regs; i++) { | 2267 | fence_list) { |
| 2253 | uint32_t this_seqno; | 2268 | old_obj = old_obj_priv->obj; |
| 2254 | |||
| 2255 | reg = &dev_priv->fence_regs[i]; | ||
| 2256 | old_obj_priv = reg->obj->driver_private; | ||
| 2257 | 2269 | ||
| 2258 | if (old_obj_priv->pin_count) | 2270 | if (old_obj_priv->pin_count) |
| 2259 | continue; | 2271 | continue; |
| 2260 | 2272 | ||
| 2273 | /* Take a reference, as otherwise the wait_rendering | ||
| 2274 | * below may cause the object to get freed out from | ||
| 2275 | * under us. | ||
| 2276 | */ | ||
| 2277 | drm_gem_object_reference(old_obj); | ||
| 2278 | |||
| 2261 | /* i915 uses fences for GPU access to tiled buffers */ | 2279 | /* i915 uses fences for GPU access to tiled buffers */ |
| 2262 | if (IS_I965G(dev) || !old_obj_priv->active) | 2280 | if (IS_I965G(dev) || !old_obj_priv->active) |
| 2263 | break; | 2281 | break; |
| 2264 | 2282 | ||
| 2265 | /* find the seqno of the first available fence */ | 2283 | /* This brings the object to the head of the LRU if it |
| 2266 | this_seqno = old_obj_priv->last_rendering_seqno; | 2284 | * had been written to. The only way this should |
| 2267 | if (this_seqno != 0 && | 2285 | * result in us waiting longer than the expected |
| 2268 | reg->obj->write_domain == 0 && | 2286 | * optimal amount of time is if there was a |
| 2269 | i915_seqno_passed(seqno, this_seqno)) | 2287 | * fence-using buffer later that was read-only. |
| 2270 | seqno = this_seqno; | 2288 | */ |
| 2271 | } | 2289 | i915_gem_object_flush_gpu_write_domain(old_obj); |
| 2272 | 2290 | ret = i915_gem_object_wait_rendering(old_obj); | |
| 2273 | /* | 2291 | if (ret != 0) { |
| 2274 | * Now things get ugly... we have to wait for one of the | 2292 | drm_gem_object_unreference(old_obj); |
| 2275 | * objects to finish before trying again. | 2293 | return ret; |
| 2276 | */ | ||
| 2277 | if (i == dev_priv->num_fence_regs) { | ||
| 2278 | if (seqno == dev_priv->mm.next_gem_seqno) { | ||
| 2279 | i915_gem_flush(dev, | ||
| 2280 | I915_GEM_GPU_DOMAINS, | ||
| 2281 | I915_GEM_GPU_DOMAINS); | ||
| 2282 | seqno = i915_add_request(dev, NULL, | ||
| 2283 | I915_GEM_GPU_DOMAINS); | ||
| 2284 | if (seqno == 0) | ||
| 2285 | return -ENOMEM; | ||
| 2286 | } | 2294 | } |
| 2287 | 2295 | ||
| 2288 | ret = i915_wait_request(dev, seqno); | 2296 | break; |
| 2289 | if (ret) | ||
| 2290 | return ret; | ||
| 2291 | goto try_again; | ||
| 2292 | } | 2297 | } |
| 2293 | 2298 | ||
| 2294 | /* | 2299 | /* |
| 2295 | * Zap this virtual mapping so we can set up a fence again | 2300 | * Zap this virtual mapping so we can set up a fence again |
| 2296 | * for this object next time we need it. | 2301 | * for this object next time we need it. |
| 2297 | */ | 2302 | */ |
| 2298 | i915_gem_release_mmap(reg->obj); | 2303 | i915_gem_release_mmap(old_obj); |
| 2304 | |||
| 2305 | i = old_obj_priv->fence_reg; | ||
| 2306 | reg = &dev_priv->fence_regs[i]; | ||
| 2307 | |||
| 2299 | old_obj_priv->fence_reg = I915_FENCE_REG_NONE; | 2308 | old_obj_priv->fence_reg = I915_FENCE_REG_NONE; |
| 2309 | list_del_init(&old_obj_priv->fence_list); | ||
| 2310 | |||
| 2311 | drm_gem_object_unreference(old_obj); | ||
| 2300 | } | 2312 | } |
| 2301 | 2313 | ||
| 2302 | obj_priv->fence_reg = i; | 2314 | obj_priv->fence_reg = i; |
| 2315 | list_add_tail(&obj_priv->fence_list, &dev_priv->mm.fence_list); | ||
| 2316 | |||
| 2303 | reg->obj = obj; | 2317 | reg->obj = obj; |
| 2304 | 2318 | ||
| 2305 | if (IS_I965G(dev)) | 2319 | if (IS_I965G(dev)) |
| @@ -2342,6 +2356,7 @@ i915_gem_clear_fence_reg(struct drm_gem_object *obj) | |||
| 2342 | 2356 | ||
| 2343 | dev_priv->fence_regs[obj_priv->fence_reg].obj = NULL; | 2357 | dev_priv->fence_regs[obj_priv->fence_reg].obj = NULL; |
| 2344 | obj_priv->fence_reg = I915_FENCE_REG_NONE; | 2358 | obj_priv->fence_reg = I915_FENCE_REG_NONE; |
| 2359 | list_del_init(&obj_priv->fence_list); | ||
| 2345 | } | 2360 | } |
| 2346 | 2361 | ||
| 2347 | /** | 2362 | /** |
| @@ -3595,9 +3610,7 @@ i915_gem_object_pin(struct drm_gem_object *obj, uint32_t alignment) | |||
| 3595 | * Pre-965 chips need a fence register set up in order to | 3610 | * Pre-965 chips need a fence register set up in order to |
| 3596 | * properly handle tiled surfaces. | 3611 | * properly handle tiled surfaces. |
| 3597 | */ | 3612 | */ |
| 3598 | if (!IS_I965G(dev) && | 3613 | if (!IS_I965G(dev) && obj_priv->tiling_mode != I915_TILING_NONE) { |
| 3599 | obj_priv->fence_reg == I915_FENCE_REG_NONE && | ||
| 3600 | obj_priv->tiling_mode != I915_TILING_NONE) { | ||
| 3601 | ret = i915_gem_object_get_fence_reg(obj); | 3614 | ret = i915_gem_object_get_fence_reg(obj); |
| 3602 | if (ret != 0) { | 3615 | if (ret != 0) { |
| 3603 | if (ret != -EBUSY && ret != -ERESTARTSYS) | 3616 | if (ret != -EBUSY && ret != -ERESTARTSYS) |
| @@ -3806,6 +3819,7 @@ int i915_gem_init_object(struct drm_gem_object *obj) | |||
| 3806 | obj_priv->obj = obj; | 3819 | obj_priv->obj = obj; |
| 3807 | obj_priv->fence_reg = I915_FENCE_REG_NONE; | 3820 | obj_priv->fence_reg = I915_FENCE_REG_NONE; |
| 3808 | INIT_LIST_HEAD(&obj_priv->list); | 3821 | INIT_LIST_HEAD(&obj_priv->list); |
| 3822 | INIT_LIST_HEAD(&obj_priv->fence_list); | ||
| 3809 | 3823 | ||
| 3810 | return 0; | 3824 | return 0; |
| 3811 | } | 3825 | } |
| @@ -4218,15 +4232,11 @@ int | |||
| 4218 | i915_gem_leavevt_ioctl(struct drm_device *dev, void *data, | 4232 | i915_gem_leavevt_ioctl(struct drm_device *dev, void *data, |
| 4219 | struct drm_file *file_priv) | 4233 | struct drm_file *file_priv) |
| 4220 | { | 4234 | { |
| 4221 | int ret; | ||
| 4222 | |||
| 4223 | if (drm_core_check_feature(dev, DRIVER_MODESET)) | 4235 | if (drm_core_check_feature(dev, DRIVER_MODESET)) |
| 4224 | return 0; | 4236 | return 0; |
| 4225 | 4237 | ||
| 4226 | ret = i915_gem_idle(dev); | ||
| 4227 | drm_irq_uninstall(dev); | 4238 | drm_irq_uninstall(dev); |
| 4228 | 4239 | return i915_gem_idle(dev); | |
| 4229 | return ret; | ||
| 4230 | } | 4240 | } |
| 4231 | 4241 | ||
| 4232 | void | 4242 | void |
| @@ -4253,6 +4263,7 @@ i915_gem_load(struct drm_device *dev) | |||
| 4253 | INIT_LIST_HEAD(&dev_priv->mm.flushing_list); | 4263 | INIT_LIST_HEAD(&dev_priv->mm.flushing_list); |
| 4254 | INIT_LIST_HEAD(&dev_priv->mm.inactive_list); | 4264 | INIT_LIST_HEAD(&dev_priv->mm.inactive_list); |
| 4255 | INIT_LIST_HEAD(&dev_priv->mm.request_list); | 4265 | INIT_LIST_HEAD(&dev_priv->mm.request_list); |
| 4266 | INIT_LIST_HEAD(&dev_priv->mm.fence_list); | ||
| 4256 | INIT_DELAYED_WORK(&dev_priv->mm.retire_work, | 4267 | INIT_DELAYED_WORK(&dev_priv->mm.retire_work, |
| 4257 | i915_gem_retire_work_handler); | 4268 | i915_gem_retire_work_handler); |
| 4258 | dev_priv->mm.next_gem_seqno = 1; | 4269 | dev_priv->mm.next_gem_seqno = 1; |
diff --git a/drivers/gpu/drm/i915/intel_bios.c b/drivers/gpu/drm/i915/intel_bios.c index 300aee3296c2..f806fcc54e09 100644 --- a/drivers/gpu/drm/i915/intel_bios.c +++ b/drivers/gpu/drm/i915/intel_bios.c | |||
| @@ -59,6 +59,16 @@ find_section(struct bdb_header *bdb, int section_id) | |||
| 59 | return NULL; | 59 | return NULL; |
| 60 | } | 60 | } |
| 61 | 61 | ||
| 62 | static u16 | ||
| 63 | get_blocksize(void *p) | ||
| 64 | { | ||
| 65 | u16 *block_ptr, block_size; | ||
| 66 | |||
| 67 | block_ptr = (u16 *)((char *)p - 2); | ||
| 68 | block_size = *block_ptr; | ||
| 69 | return block_size; | ||
| 70 | } | ||
| 71 | |||
| 62 | static void | 72 | static void |
| 63 | fill_detail_timing_data(struct drm_display_mode *panel_fixed_mode, | 73 | fill_detail_timing_data(struct drm_display_mode *panel_fixed_mode, |
| 64 | struct lvds_dvo_timing *dvo_timing) | 74 | struct lvds_dvo_timing *dvo_timing) |
| @@ -215,6 +225,41 @@ parse_general_features(struct drm_i915_private *dev_priv, | |||
| 215 | } | 225 | } |
| 216 | 226 | ||
| 217 | static void | 227 | static void |
| 228 | parse_general_definitions(struct drm_i915_private *dev_priv, | ||
| 229 | struct bdb_header *bdb) | ||
| 230 | { | ||
| 231 | struct bdb_general_definitions *general; | ||
| 232 | const int crt_bus_map_table[] = { | ||
| 233 | GPIOB, | ||
| 234 | GPIOA, | ||
| 235 | GPIOC, | ||
| 236 | GPIOD, | ||
| 237 | GPIOE, | ||
| 238 | GPIOF, | ||
| 239 | }; | ||
| 240 | |||
| 241 | /* Set sensible defaults in case we can't find the general block | ||
| 242 | or it is the wrong chipset */ | ||
| 243 | dev_priv->crt_ddc_bus = -1; | ||
| 244 | |||
| 245 | general = find_section(bdb, BDB_GENERAL_DEFINITIONS); | ||
| 246 | if (general) { | ||
| 247 | u16 block_size = get_blocksize(general); | ||
| 248 | if (block_size >= sizeof(*general)) { | ||
| 249 | int bus_pin = general->crt_ddc_gmbus_pin; | ||
| 250 | DRM_DEBUG("crt_ddc_bus_pin: %d\n", bus_pin); | ||
| 251 | if ((bus_pin >= 1) && (bus_pin <= 6)) { | ||
| 252 | dev_priv->crt_ddc_bus = | ||
| 253 | crt_bus_map_table[bus_pin-1]; | ||
| 254 | } | ||
| 255 | } else { | ||
| 256 | DRM_DEBUG("BDB_GD too small (%d). Invalid.\n", | ||
| 257 | block_size); | ||
| 258 | } | ||
| 259 | } | ||
| 260 | } | ||
| 261 | |||
| 262 | static void | ||
| 218 | parse_sdvo_device_mapping(struct drm_i915_private *dev_priv, | 263 | parse_sdvo_device_mapping(struct drm_i915_private *dev_priv, |
| 219 | struct bdb_header *bdb) | 264 | struct bdb_header *bdb) |
| 220 | { | 265 | { |
| @@ -222,7 +267,7 @@ parse_sdvo_device_mapping(struct drm_i915_private *dev_priv, | |||
| 222 | struct bdb_general_definitions *p_defs; | 267 | struct bdb_general_definitions *p_defs; |
| 223 | struct child_device_config *p_child; | 268 | struct child_device_config *p_child; |
| 224 | int i, child_device_num, count; | 269 | int i, child_device_num, count; |
| 225 | u16 block_size, *block_ptr; | 270 | u16 block_size; |
| 226 | 271 | ||
| 227 | p_defs = find_section(bdb, BDB_GENERAL_DEFINITIONS); | 272 | p_defs = find_section(bdb, BDB_GENERAL_DEFINITIONS); |
| 228 | if (!p_defs) { | 273 | if (!p_defs) { |
| @@ -240,8 +285,7 @@ parse_sdvo_device_mapping(struct drm_i915_private *dev_priv, | |||
| 240 | return; | 285 | return; |
| 241 | } | 286 | } |
| 242 | /* get the block size of general definitions */ | 287 | /* get the block size of general definitions */ |
| 243 | block_ptr = (u16 *)((char *)p_defs - 2); | 288 | block_size = get_blocksize(p_defs); |
| 244 | block_size = *block_ptr; | ||
| 245 | /* get the number of child device */ | 289 | /* get the number of child device */ |
| 246 | child_device_num = (block_size - sizeof(*p_defs)) / | 290 | child_device_num = (block_size - sizeof(*p_defs)) / |
| 247 | sizeof(*p_child); | 291 | sizeof(*p_child); |
| @@ -362,6 +406,7 @@ intel_init_bios(struct drm_device *dev) | |||
| 362 | 406 | ||
| 363 | /* Grab useful general definitions */ | 407 | /* Grab useful general definitions */ |
| 364 | parse_general_features(dev_priv, bdb); | 408 | parse_general_features(dev_priv, bdb); |
| 409 | parse_general_definitions(dev_priv, bdb); | ||
| 365 | parse_lfp_panel_data(dev_priv, bdb); | 410 | parse_lfp_panel_data(dev_priv, bdb); |
| 366 | parse_sdvo_panel_data(dev_priv, bdb); | 411 | parse_sdvo_panel_data(dev_priv, bdb); |
| 367 | parse_sdvo_device_mapping(dev_priv, bdb); | 412 | parse_sdvo_device_mapping(dev_priv, bdb); |
diff --git a/drivers/gpu/drm/i915/intel_crt.c b/drivers/gpu/drm/i915/intel_crt.c index 4cf8e2e88a40..590f81c8f594 100644 --- a/drivers/gpu/drm/i915/intel_crt.c +++ b/drivers/gpu/drm/i915/intel_crt.c | |||
| @@ -508,6 +508,7 @@ void intel_crt_init(struct drm_device *dev) | |||
| 508 | { | 508 | { |
| 509 | struct drm_connector *connector; | 509 | struct drm_connector *connector; |
| 510 | struct intel_output *intel_output; | 510 | struct intel_output *intel_output; |
| 511 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
| 511 | u32 i2c_reg; | 512 | u32 i2c_reg; |
| 512 | 513 | ||
| 513 | intel_output = kzalloc(sizeof(struct intel_output), GFP_KERNEL); | 514 | intel_output = kzalloc(sizeof(struct intel_output), GFP_KERNEL); |
| @@ -527,8 +528,12 @@ void intel_crt_init(struct drm_device *dev) | |||
| 527 | /* Set up the DDC bus. */ | 528 | /* Set up the DDC bus. */ |
| 528 | if (IS_IGDNG(dev)) | 529 | if (IS_IGDNG(dev)) |
| 529 | i2c_reg = PCH_GPIOA; | 530 | i2c_reg = PCH_GPIOA; |
| 530 | else | 531 | else { |
| 531 | i2c_reg = GPIOA; | 532 | i2c_reg = GPIOA; |
| 533 | /* Use VBT information for CRT DDC if available */ | ||
| 534 | if (dev_priv->crt_ddc_bus != -1) | ||
| 535 | i2c_reg = dev_priv->crt_ddc_bus; | ||
| 536 | } | ||
| 532 | intel_output->ddc_bus = intel_i2c_create(dev, i2c_reg, "CRTDDC_A"); | 537 | intel_output->ddc_bus = intel_i2c_create(dev, i2c_reg, "CRTDDC_A"); |
| 533 | if (!intel_output->ddc_bus) { | 538 | if (!intel_output->ddc_bus) { |
| 534 | dev_printk(KERN_ERR, &dev->pdev->dev, "DDC bus registration " | 539 | dev_printk(KERN_ERR, &dev->pdev->dev, "DDC bus registration " |
| @@ -537,6 +542,10 @@ void intel_crt_init(struct drm_device *dev) | |||
| 537 | } | 542 | } |
| 538 | 543 | ||
| 539 | intel_output->type = INTEL_OUTPUT_ANALOG; | 544 | intel_output->type = INTEL_OUTPUT_ANALOG; |
| 545 | intel_output->clone_mask = (1 << INTEL_SDVO_NON_TV_CLONE_BIT) | | ||
| 546 | (1 << INTEL_ANALOG_CLONE_BIT) | | ||
| 547 | (1 << INTEL_SDVO_LVDS_CLONE_BIT); | ||
| 548 | intel_output->crtc_mask = (1 << 0) | (1 << 1); | ||
| 540 | connector->interlace_allowed = 0; | 549 | connector->interlace_allowed = 0; |
| 541 | connector->doublescan_allowed = 0; | 550 | connector->doublescan_allowed = 0; |
| 542 | 551 | ||
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index d6fce2133413..748ed50c55ca 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
| @@ -666,7 +666,7 @@ intel_find_best_PLL(const intel_limit_t *limit, struct drm_crtc *crtc, | |||
| 666 | intel_clock_t clock; | 666 | intel_clock_t clock; |
| 667 | int err = target; | 667 | int err = target; |
| 668 | 668 | ||
| 669 | if (IS_I9XX(dev) && intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS) && | 669 | if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS) && |
| 670 | (I915_READ(LVDS)) != 0) { | 670 | (I915_READ(LVDS)) != 0) { |
| 671 | /* | 671 | /* |
| 672 | * For LVDS, if the panel is on, just rely on its current | 672 | * For LVDS, if the panel is on, just rely on its current |
| @@ -2005,7 +2005,21 @@ static void igd_enable_cxsr(struct drm_device *dev, unsigned long clock, | |||
| 2005 | return; | 2005 | return; |
| 2006 | } | 2006 | } |
| 2007 | 2007 | ||
| 2008 | const static int latency_ns = 3000; /* default for non-igd platforms */ | 2008 | /* |
| 2009 | * Latency for FIFO fetches is dependent on several factors: | ||
| 2010 | * - memory configuration (speed, channels) | ||
| 2011 | * - chipset | ||
| 2012 | * - current MCH state | ||
| 2013 | * It can be fairly high in some situations, so here we assume a fairly | ||
| 2014 | * pessimal value. It's a tradeoff between extra memory fetches (if we | ||
| 2015 | * set this value too high, the FIFO will fetch frequently to stay full) | ||
| 2016 | * and power consumption (set it too low to save power and we might see | ||
| 2017 | * FIFO underruns and display "flicker"). | ||
| 2018 | * | ||
| 2019 | * A value of 5us seems to be a good balance; safe for very low end | ||
| 2020 | * platforms but not overly aggressive on lower latency configs. | ||
| 2021 | */ | ||
| 2022 | const static int latency_ns = 5000; | ||
| 2009 | 2023 | ||
| 2010 | static int intel_get_fifo_size(struct drm_device *dev, int plane) | 2024 | static int intel_get_fifo_size(struct drm_device *dev, int plane) |
| 2011 | { | 2025 | { |
| @@ -2396,7 +2410,7 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc, | |||
| 2396 | if (is_sdvo) { | 2410 | if (is_sdvo) { |
| 2397 | dpll |= DPLL_DVO_HIGH_SPEED; | 2411 | dpll |= DPLL_DVO_HIGH_SPEED; |
| 2398 | sdvo_pixel_multiply = adjusted_mode->clock / mode->clock; | 2412 | sdvo_pixel_multiply = adjusted_mode->clock / mode->clock; |
| 2399 | if (IS_I945G(dev) || IS_I945GM(dev)) | 2413 | if (IS_I945G(dev) || IS_I945GM(dev) || IS_G33(dev)) |
| 2400 | dpll |= (sdvo_pixel_multiply - 1) << SDVO_MULTIPLIER_SHIFT_HIRES; | 2414 | dpll |= (sdvo_pixel_multiply - 1) << SDVO_MULTIPLIER_SHIFT_HIRES; |
| 2401 | else if (IS_IGDNG(dev)) | 2415 | else if (IS_IGDNG(dev)) |
| 2402 | dpll |= (sdvo_pixel_multiply - 1) << PLL_REF_SDVO_HDMI_MULTIPLIER_SHIFT; | 2416 | dpll |= (sdvo_pixel_multiply - 1) << PLL_REF_SDVO_HDMI_MULTIPLIER_SHIFT; |
| @@ -3170,7 +3184,7 @@ static int intel_connector_clones(struct drm_device *dev, int type_mask) | |||
| 3170 | 3184 | ||
| 3171 | list_for_each_entry(connector, &dev->mode_config.connector_list, head) { | 3185 | list_for_each_entry(connector, &dev->mode_config.connector_list, head) { |
| 3172 | struct intel_output *intel_output = to_intel_output(connector); | 3186 | struct intel_output *intel_output = to_intel_output(connector); |
| 3173 | if (type_mask & (1 << intel_output->type)) | 3187 | if (type_mask & intel_output->clone_mask) |
| 3174 | index_mask |= (1 << entry); | 3188 | index_mask |= (1 << entry); |
| 3175 | entry++; | 3189 | entry++; |
| 3176 | } | 3190 | } |
| @@ -3218,30 +3232,30 @@ static void intel_setup_outputs(struct drm_device *dev) | |||
| 3218 | intel_dp_init(dev, PCH_DP_D); | 3232 | intel_dp_init(dev, PCH_DP_D); |
| 3219 | 3233 | ||
| 3220 | } else if (IS_I9XX(dev)) { | 3234 | } else if (IS_I9XX(dev)) { |
| 3221 | int found; | 3235 | bool found = false; |
| 3222 | u32 reg; | ||
| 3223 | 3236 | ||
| 3224 | if (I915_READ(SDVOB) & SDVO_DETECTED) { | 3237 | if (I915_READ(SDVOB) & SDVO_DETECTED) { |
| 3225 | found = intel_sdvo_init(dev, SDVOB); | 3238 | found = intel_sdvo_init(dev, SDVOB); |
| 3226 | if (!found && SUPPORTS_INTEGRATED_HDMI(dev)) | 3239 | if (!found && SUPPORTS_INTEGRATED_HDMI(dev)) |
| 3227 | intel_hdmi_init(dev, SDVOB); | 3240 | intel_hdmi_init(dev, SDVOB); |
| 3241 | |||
| 3228 | if (!found && SUPPORTS_INTEGRATED_DP(dev)) | 3242 | if (!found && SUPPORTS_INTEGRATED_DP(dev)) |
| 3229 | intel_dp_init(dev, DP_B); | 3243 | intel_dp_init(dev, DP_B); |
| 3230 | } | 3244 | } |
| 3231 | 3245 | ||
| 3232 | /* Before G4X SDVOC doesn't have its own detect register */ | 3246 | /* Before G4X SDVOC doesn't have its own detect register */ |
| 3233 | if (IS_G4X(dev)) | ||
| 3234 | reg = SDVOC; | ||
| 3235 | else | ||
| 3236 | reg = SDVOB; | ||
| 3237 | 3247 | ||
| 3238 | if (I915_READ(reg) & SDVO_DETECTED) { | 3248 | if (I915_READ(SDVOB) & SDVO_DETECTED) |
| 3239 | found = intel_sdvo_init(dev, SDVOC); | 3249 | found = intel_sdvo_init(dev, SDVOC); |
| 3240 | if (!found && SUPPORTS_INTEGRATED_HDMI(dev)) | 3250 | |
| 3251 | if (!found && (I915_READ(SDVOC) & SDVO_DETECTED)) { | ||
| 3252 | |||
| 3253 | if (SUPPORTS_INTEGRATED_HDMI(dev)) | ||
| 3241 | intel_hdmi_init(dev, SDVOC); | 3254 | intel_hdmi_init(dev, SDVOC); |
| 3242 | if (!found && SUPPORTS_INTEGRATED_DP(dev)) | 3255 | if (SUPPORTS_INTEGRATED_DP(dev)) |
| 3243 | intel_dp_init(dev, DP_C); | 3256 | intel_dp_init(dev, DP_C); |
| 3244 | } | 3257 | } |
| 3258 | |||
| 3245 | if (SUPPORTS_INTEGRATED_DP(dev) && (I915_READ(DP_D) & DP_DETECTED)) | 3259 | if (SUPPORTS_INTEGRATED_DP(dev) && (I915_READ(DP_D) & DP_DETECTED)) |
| 3246 | intel_dp_init(dev, DP_D); | 3260 | intel_dp_init(dev, DP_D); |
| 3247 | } else | 3261 | } else |
| @@ -3253,51 +3267,10 @@ static void intel_setup_outputs(struct drm_device *dev) | |||
| 3253 | list_for_each_entry(connector, &dev->mode_config.connector_list, head) { | 3267 | list_for_each_entry(connector, &dev->mode_config.connector_list, head) { |
| 3254 | struct intel_output *intel_output = to_intel_output(connector); | 3268 | struct intel_output *intel_output = to_intel_output(connector); |
| 3255 | struct drm_encoder *encoder = &intel_output->enc; | 3269 | struct drm_encoder *encoder = &intel_output->enc; |
| 3256 | int crtc_mask = 0, clone_mask = 0; | ||
| 3257 | 3270 | ||
| 3258 | /* valid crtcs */ | 3271 | encoder->possible_crtcs = intel_output->crtc_mask; |
| 3259 | switch(intel_output->type) { | 3272 | encoder->possible_clones = intel_connector_clones(dev, |
| 3260 | case INTEL_OUTPUT_HDMI: | 3273 | intel_output->clone_mask); |
| 3261 | crtc_mask = ((1 << 0)| | ||
| 3262 | (1 << 1)); | ||
| 3263 | clone_mask = ((1 << INTEL_OUTPUT_HDMI)); | ||
| 3264 | break; | ||
| 3265 | case INTEL_OUTPUT_DVO: | ||
| 3266 | case INTEL_OUTPUT_SDVO: | ||
| 3267 | crtc_mask = ((1 << 0)| | ||
| 3268 | (1 << 1)); | ||
| 3269 | clone_mask = ((1 << INTEL_OUTPUT_ANALOG) | | ||
| 3270 | (1 << INTEL_OUTPUT_DVO) | | ||
| 3271 | (1 << INTEL_OUTPUT_SDVO)); | ||
| 3272 | break; | ||
| 3273 | case INTEL_OUTPUT_ANALOG: | ||
| 3274 | crtc_mask = ((1 << 0)| | ||
| 3275 | (1 << 1)); | ||
| 3276 | clone_mask = ((1 << INTEL_OUTPUT_ANALOG) | | ||
| 3277 | (1 << INTEL_OUTPUT_DVO) | | ||
| 3278 | (1 << INTEL_OUTPUT_SDVO)); | ||
| 3279 | break; | ||
| 3280 | case INTEL_OUTPUT_LVDS: | ||
| 3281 | crtc_mask = (1 << 1); | ||
| 3282 | clone_mask = (1 << INTEL_OUTPUT_LVDS); | ||
| 3283 | break; | ||
| 3284 | case INTEL_OUTPUT_TVOUT: | ||
| 3285 | crtc_mask = ((1 << 0) | | ||
| 3286 | (1 << 1)); | ||
| 3287 | clone_mask = (1 << INTEL_OUTPUT_TVOUT); | ||
| 3288 | break; | ||
| 3289 | case INTEL_OUTPUT_DISPLAYPORT: | ||
| 3290 | crtc_mask = ((1 << 0) | | ||
| 3291 | (1 << 1)); | ||
| 3292 | clone_mask = (1 << INTEL_OUTPUT_DISPLAYPORT); | ||
| 3293 | break; | ||
| 3294 | case INTEL_OUTPUT_EDP: | ||
| 3295 | crtc_mask = (1 << 1); | ||
| 3296 | clone_mask = (1 << INTEL_OUTPUT_EDP); | ||
| 3297 | break; | ||
| 3298 | } | ||
| 3299 | encoder->possible_crtcs = crtc_mask; | ||
| 3300 | encoder->possible_clones = intel_connector_clones(dev, clone_mask); | ||
| 3301 | } | 3274 | } |
| 3302 | } | 3275 | } |
| 3303 | 3276 | ||
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index a6ff15ac548a..2b914d732076 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c | |||
| @@ -1254,6 +1254,18 @@ intel_dp_init(struct drm_device *dev, int output_reg) | |||
| 1254 | else | 1254 | else |
| 1255 | intel_output->type = INTEL_OUTPUT_DISPLAYPORT; | 1255 | intel_output->type = INTEL_OUTPUT_DISPLAYPORT; |
| 1256 | 1256 | ||
| 1257 | if (output_reg == DP_B) | ||
| 1258 | intel_output->clone_mask = (1 << INTEL_DP_B_CLONE_BIT); | ||
| 1259 | else if (output_reg == DP_C) | ||
| 1260 | intel_output->clone_mask = (1 << INTEL_DP_C_CLONE_BIT); | ||
| 1261 | else if (output_reg == DP_D) | ||
| 1262 | intel_output->clone_mask = (1 << INTEL_DP_D_CLONE_BIT); | ||
| 1263 | |||
| 1264 | if (IS_eDP(intel_output)) { | ||
| 1265 | intel_output->crtc_mask = (1 << 1); | ||
| 1266 | intel_output->clone_mask = (1 << INTEL_EDP_CLONE_BIT); | ||
| 1267 | } else | ||
| 1268 | intel_output->crtc_mask = (1 << 0) | (1 << 1); | ||
| 1257 | connector->interlace_allowed = true; | 1269 | connector->interlace_allowed = true; |
| 1258 | connector->doublescan_allowed = 0; | 1270 | connector->doublescan_allowed = 0; |
| 1259 | 1271 | ||
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h index d6f92ea1b553..26a6227c15fe 100644 --- a/drivers/gpu/drm/i915/intel_drv.h +++ b/drivers/gpu/drm/i915/intel_drv.h | |||
| @@ -57,6 +57,25 @@ | |||
| 57 | #define INTEL_OUTPUT_DISPLAYPORT 7 | 57 | #define INTEL_OUTPUT_DISPLAYPORT 7 |
| 58 | #define INTEL_OUTPUT_EDP 8 | 58 | #define INTEL_OUTPUT_EDP 8 |
| 59 | 59 | ||
| 60 | /* Intel Pipe Clone Bit */ | ||
| 61 | #define INTEL_HDMIB_CLONE_BIT 1 | ||
| 62 | #define INTEL_HDMIC_CLONE_BIT 2 | ||
| 63 | #define INTEL_HDMID_CLONE_BIT 3 | ||
| 64 | #define INTEL_HDMIE_CLONE_BIT 4 | ||
| 65 | #define INTEL_HDMIF_CLONE_BIT 5 | ||
| 66 | #define INTEL_SDVO_NON_TV_CLONE_BIT 6 | ||
| 67 | #define INTEL_SDVO_TV_CLONE_BIT 7 | ||
| 68 | #define INTEL_SDVO_LVDS_CLONE_BIT 8 | ||
| 69 | #define INTEL_ANALOG_CLONE_BIT 9 | ||
| 70 | #define INTEL_TV_CLONE_BIT 10 | ||
| 71 | #define INTEL_DP_B_CLONE_BIT 11 | ||
| 72 | #define INTEL_DP_C_CLONE_BIT 12 | ||
| 73 | #define INTEL_DP_D_CLONE_BIT 13 | ||
| 74 | #define INTEL_LVDS_CLONE_BIT 14 | ||
| 75 | #define INTEL_DVO_TMDS_CLONE_BIT 15 | ||
| 76 | #define INTEL_DVO_LVDS_CLONE_BIT 16 | ||
| 77 | #define INTEL_EDP_CLONE_BIT 17 | ||
| 78 | |||
| 60 | #define INTEL_DVO_CHIP_NONE 0 | 79 | #define INTEL_DVO_CHIP_NONE 0 |
| 61 | #define INTEL_DVO_CHIP_LVDS 1 | 80 | #define INTEL_DVO_CHIP_LVDS 1 |
| 62 | #define INTEL_DVO_CHIP_TMDS 2 | 81 | #define INTEL_DVO_CHIP_TMDS 2 |
| @@ -86,6 +105,8 @@ struct intel_output { | |||
| 86 | bool needs_tv_clock; | 105 | bool needs_tv_clock; |
| 87 | void *dev_priv; | 106 | void *dev_priv; |
| 88 | void (*hot_plug)(struct intel_output *); | 107 | void (*hot_plug)(struct intel_output *); |
| 108 | int crtc_mask; | ||
| 109 | int clone_mask; | ||
| 89 | }; | 110 | }; |
| 90 | 111 | ||
| 91 | struct intel_crtc { | 112 | struct intel_crtc { |
diff --git a/drivers/gpu/drm/i915/intel_dvo.c b/drivers/gpu/drm/i915/intel_dvo.c index 13bff20930e8..a4d2606de778 100644 --- a/drivers/gpu/drm/i915/intel_dvo.c +++ b/drivers/gpu/drm/i915/intel_dvo.c | |||
| @@ -435,14 +435,20 @@ void intel_dvo_init(struct drm_device *dev) | |||
| 435 | continue; | 435 | continue; |
| 436 | 436 | ||
| 437 | intel_output->type = INTEL_OUTPUT_DVO; | 437 | intel_output->type = INTEL_OUTPUT_DVO; |
| 438 | intel_output->crtc_mask = (1 << 0) | (1 << 1); | ||
| 438 | switch (dvo->type) { | 439 | switch (dvo->type) { |
| 439 | case INTEL_DVO_CHIP_TMDS: | 440 | case INTEL_DVO_CHIP_TMDS: |
| 441 | intel_output->clone_mask = | ||
| 442 | (1 << INTEL_DVO_TMDS_CLONE_BIT) | | ||
| 443 | (1 << INTEL_ANALOG_CLONE_BIT); | ||
| 440 | drm_connector_init(dev, connector, | 444 | drm_connector_init(dev, connector, |
| 441 | &intel_dvo_connector_funcs, | 445 | &intel_dvo_connector_funcs, |
| 442 | DRM_MODE_CONNECTOR_DVII); | 446 | DRM_MODE_CONNECTOR_DVII); |
| 443 | encoder_type = DRM_MODE_ENCODER_TMDS; | 447 | encoder_type = DRM_MODE_ENCODER_TMDS; |
| 444 | break; | 448 | break; |
| 445 | case INTEL_DVO_CHIP_LVDS: | 449 | case INTEL_DVO_CHIP_LVDS: |
| 450 | intel_output->clone_mask = | ||
| 451 | (1 << INTEL_DVO_LVDS_CLONE_BIT); | ||
| 446 | drm_connector_init(dev, connector, | 452 | drm_connector_init(dev, connector, |
| 447 | &intel_dvo_connector_funcs, | 453 | &intel_dvo_connector_funcs, |
| 448 | DRM_MODE_CONNECTOR_LVDS); | 454 | DRM_MODE_CONNECTOR_LVDS); |
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c index 1842290cded3..fa304e136010 100644 --- a/drivers/gpu/drm/i915/intel_hdmi.c +++ b/drivers/gpu/drm/i915/intel_hdmi.c | |||
| @@ -230,22 +230,28 @@ void intel_hdmi_init(struct drm_device *dev, int sdvox_reg) | |||
| 230 | 230 | ||
| 231 | connector->interlace_allowed = 0; | 231 | connector->interlace_allowed = 0; |
| 232 | connector->doublescan_allowed = 0; | 232 | connector->doublescan_allowed = 0; |
| 233 | intel_output->crtc_mask = (1 << 0) | (1 << 1); | ||
| 233 | 234 | ||
| 234 | /* Set up the DDC bus. */ | 235 | /* Set up the DDC bus. */ |
| 235 | if (sdvox_reg == SDVOB) | 236 | if (sdvox_reg == SDVOB) { |
| 237 | intel_output->clone_mask = (1 << INTEL_HDMIB_CLONE_BIT); | ||
| 236 | intel_output->ddc_bus = intel_i2c_create(dev, GPIOE, "HDMIB"); | 238 | intel_output->ddc_bus = intel_i2c_create(dev, GPIOE, "HDMIB"); |
| 237 | else if (sdvox_reg == SDVOC) | 239 | } else if (sdvox_reg == SDVOC) { |
| 240 | intel_output->clone_mask = (1 << INTEL_HDMIC_CLONE_BIT); | ||
| 238 | intel_output->ddc_bus = intel_i2c_create(dev, GPIOD, "HDMIC"); | 241 | intel_output->ddc_bus = intel_i2c_create(dev, GPIOD, "HDMIC"); |
| 239 | else if (sdvox_reg == HDMIB) | 242 | } else if (sdvox_reg == HDMIB) { |
| 243 | intel_output->clone_mask = (1 << INTEL_HDMID_CLONE_BIT); | ||
| 240 | intel_output->ddc_bus = intel_i2c_create(dev, PCH_GPIOE, | 244 | intel_output->ddc_bus = intel_i2c_create(dev, PCH_GPIOE, |
| 241 | "HDMIB"); | 245 | "HDMIB"); |
| 242 | else if (sdvox_reg == HDMIC) | 246 | } else if (sdvox_reg == HDMIC) { |
| 247 | intel_output->clone_mask = (1 << INTEL_HDMIE_CLONE_BIT); | ||
| 243 | intel_output->ddc_bus = intel_i2c_create(dev, PCH_GPIOD, | 248 | intel_output->ddc_bus = intel_i2c_create(dev, PCH_GPIOD, |
| 244 | "HDMIC"); | 249 | "HDMIC"); |
| 245 | else if (sdvox_reg == HDMID) | 250 | } else if (sdvox_reg == HDMID) { |
| 251 | intel_output->clone_mask = (1 << INTEL_HDMIF_CLONE_BIT); | ||
| 246 | intel_output->ddc_bus = intel_i2c_create(dev, PCH_GPIOF, | 252 | intel_output->ddc_bus = intel_i2c_create(dev, PCH_GPIOF, |
| 247 | "HDMID"); | 253 | "HDMID"); |
| 248 | 254 | } | |
| 249 | if (!intel_output->ddc_bus) | 255 | if (!intel_output->ddc_bus) |
| 250 | goto err_connector; | 256 | goto err_connector; |
| 251 | 257 | ||
diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c index 3f445a80c552..8df02ef89261 100644 --- a/drivers/gpu/drm/i915/intel_lvds.c +++ b/drivers/gpu/drm/i915/intel_lvds.c | |||
| @@ -916,6 +916,8 @@ void intel_lvds_init(struct drm_device *dev) | |||
| 916 | drm_mode_connector_attach_encoder(&intel_output->base, &intel_output->enc); | 916 | drm_mode_connector_attach_encoder(&intel_output->base, &intel_output->enc); |
| 917 | intel_output->type = INTEL_OUTPUT_LVDS; | 917 | intel_output->type = INTEL_OUTPUT_LVDS; |
| 918 | 918 | ||
| 919 | intel_output->clone_mask = (1 << INTEL_LVDS_CLONE_BIT); | ||
| 920 | intel_output->crtc_mask = (1 << 1); | ||
| 919 | drm_encoder_helper_add(encoder, &intel_lvds_helper_funcs); | 921 | drm_encoder_helper_add(encoder, &intel_lvds_helper_funcs); |
| 920 | drm_connector_helper_add(connector, &intel_lvds_connector_helper_funcs); | 922 | drm_connector_helper_add(connector, &intel_lvds_connector_helper_funcs); |
| 921 | connector->display_info.subpixel_order = SubPixelHorizontalRGB; | 923 | connector->display_info.subpixel_order = SubPixelHorizontalRGB; |
diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c index 5371d9332554..d3b74ba62b4a 100644 --- a/drivers/gpu/drm/i915/intel_sdvo.c +++ b/drivers/gpu/drm/i915/intel_sdvo.c | |||
| @@ -1458,7 +1458,7 @@ intel_sdvo_multifunc_encoder(struct intel_output *intel_output) | |||
| 1458 | (SDVO_OUTPUT_RGB0 | SDVO_OUTPUT_RGB1)) | 1458 | (SDVO_OUTPUT_RGB0 | SDVO_OUTPUT_RGB1)) |
| 1459 | caps++; | 1459 | caps++; |
| 1460 | if (sdvo_priv->caps.output_flags & | 1460 | if (sdvo_priv->caps.output_flags & |
| 1461 | (SDVO_OUTPUT_SVID0 | SDVO_OUTPUT_SVID0)) | 1461 | (SDVO_OUTPUT_SVID0 | SDVO_OUTPUT_SVID1)) |
| 1462 | caps++; | 1462 | caps++; |
| 1463 | if (sdvo_priv->caps.output_flags & | 1463 | if (sdvo_priv->caps.output_flags & |
| 1464 | (SDVO_OUTPUT_CVBS0 | SDVO_OUTPUT_CVBS1)) | 1464 | (SDVO_OUTPUT_CVBS0 | SDVO_OUTPUT_CVBS1)) |
| @@ -1967,6 +1967,9 @@ intel_sdvo_output_setup(struct intel_output *intel_output, uint16_t flags) | |||
| 1967 | intel_sdvo_set_colorimetry(intel_output, | 1967 | intel_sdvo_set_colorimetry(intel_output, |
| 1968 | SDVO_COLORIMETRY_RGB256); | 1968 | SDVO_COLORIMETRY_RGB256); |
| 1969 | connector->connector_type = DRM_MODE_CONNECTOR_HDMIA; | 1969 | connector->connector_type = DRM_MODE_CONNECTOR_HDMIA; |
| 1970 | intel_output->clone_mask = | ||
| 1971 | (1 << INTEL_SDVO_NON_TV_CLONE_BIT) | | ||
| 1972 | (1 << INTEL_ANALOG_CLONE_BIT); | ||
| 1970 | } | 1973 | } |
| 1971 | } else if (flags & SDVO_OUTPUT_SVID0) { | 1974 | } else if (flags & SDVO_OUTPUT_SVID0) { |
| 1972 | 1975 | ||
| @@ -1975,11 +1978,14 @@ intel_sdvo_output_setup(struct intel_output *intel_output, uint16_t flags) | |||
| 1975 | connector->connector_type = DRM_MODE_CONNECTOR_SVIDEO; | 1978 | connector->connector_type = DRM_MODE_CONNECTOR_SVIDEO; |
| 1976 | sdvo_priv->is_tv = true; | 1979 | sdvo_priv->is_tv = true; |
| 1977 | intel_output->needs_tv_clock = true; | 1980 | intel_output->needs_tv_clock = true; |
| 1981 | intel_output->clone_mask = 1 << INTEL_SDVO_TV_CLONE_BIT; | ||
| 1978 | } else if (flags & SDVO_OUTPUT_RGB0) { | 1982 | } else if (flags & SDVO_OUTPUT_RGB0) { |
| 1979 | 1983 | ||
| 1980 | sdvo_priv->controlled_output = SDVO_OUTPUT_RGB0; | 1984 | sdvo_priv->controlled_output = SDVO_OUTPUT_RGB0; |
| 1981 | encoder->encoder_type = DRM_MODE_ENCODER_DAC; | 1985 | encoder->encoder_type = DRM_MODE_ENCODER_DAC; |
| 1982 | connector->connector_type = DRM_MODE_CONNECTOR_VGA; | 1986 | connector->connector_type = DRM_MODE_CONNECTOR_VGA; |
| 1987 | intel_output->clone_mask = (1 << INTEL_SDVO_NON_TV_CLONE_BIT) | | ||
| 1988 | (1 << INTEL_ANALOG_CLONE_BIT); | ||
| 1983 | } else if (flags & SDVO_OUTPUT_RGB1) { | 1989 | } else if (flags & SDVO_OUTPUT_RGB1) { |
| 1984 | 1990 | ||
| 1985 | sdvo_priv->controlled_output = SDVO_OUTPUT_RGB1; | 1991 | sdvo_priv->controlled_output = SDVO_OUTPUT_RGB1; |
| @@ -1991,12 +1997,16 @@ intel_sdvo_output_setup(struct intel_output *intel_output, uint16_t flags) | |||
| 1991 | encoder->encoder_type = DRM_MODE_ENCODER_LVDS; | 1997 | encoder->encoder_type = DRM_MODE_ENCODER_LVDS; |
| 1992 | connector->connector_type = DRM_MODE_CONNECTOR_LVDS; | 1998 | connector->connector_type = DRM_MODE_CONNECTOR_LVDS; |
| 1993 | sdvo_priv->is_lvds = true; | 1999 | sdvo_priv->is_lvds = true; |
| 2000 | intel_output->clone_mask = (1 << INTEL_ANALOG_CLONE_BIT) | | ||
| 2001 | (1 << INTEL_SDVO_LVDS_CLONE_BIT); | ||
| 1994 | } else if (flags & SDVO_OUTPUT_LVDS1) { | 2002 | } else if (flags & SDVO_OUTPUT_LVDS1) { |
| 1995 | 2003 | ||
| 1996 | sdvo_priv->controlled_output = SDVO_OUTPUT_LVDS1; | 2004 | sdvo_priv->controlled_output = SDVO_OUTPUT_LVDS1; |
| 1997 | encoder->encoder_type = DRM_MODE_ENCODER_LVDS; | 2005 | encoder->encoder_type = DRM_MODE_ENCODER_LVDS; |
| 1998 | connector->connector_type = DRM_MODE_CONNECTOR_LVDS; | 2006 | connector->connector_type = DRM_MODE_CONNECTOR_LVDS; |
| 1999 | sdvo_priv->is_lvds = true; | 2007 | sdvo_priv->is_lvds = true; |
| 2008 | intel_output->clone_mask = (1 << INTEL_ANALOG_CLONE_BIT) | | ||
| 2009 | (1 << INTEL_SDVO_LVDS_CLONE_BIT); | ||
| 2000 | } else { | 2010 | } else { |
| 2001 | 2011 | ||
| 2002 | unsigned char bytes[2]; | 2012 | unsigned char bytes[2]; |
| @@ -2009,6 +2019,7 @@ intel_sdvo_output_setup(struct intel_output *intel_output, uint16_t flags) | |||
| 2009 | bytes[0], bytes[1]); | 2019 | bytes[0], bytes[1]); |
| 2010 | ret = false; | 2020 | ret = false; |
| 2011 | } | 2021 | } |
| 2022 | intel_output->crtc_mask = (1 << 0) | (1 << 1); | ||
| 2012 | 2023 | ||
| 2013 | if (ret && registered) | 2024 | if (ret && registered) |
| 2014 | ret = drm_sysfs_connector_add(connector) == 0 ? true : false; | 2025 | ret = drm_sysfs_connector_add(connector) == 0 ? true : false; |
diff --git a/drivers/gpu/drm/i915/intel_tv.c b/drivers/gpu/drm/i915/intel_tv.c index da4ab4dc1630..5b1c9e9fdba0 100644 --- a/drivers/gpu/drm/i915/intel_tv.c +++ b/drivers/gpu/drm/i915/intel_tv.c | |||
| @@ -1718,6 +1718,7 @@ intel_tv_init(struct drm_device *dev) | |||
| 1718 | if (!intel_output) { | 1718 | if (!intel_output) { |
| 1719 | return; | 1719 | return; |
| 1720 | } | 1720 | } |
| 1721 | |||
| 1721 | connector = &intel_output->base; | 1722 | connector = &intel_output->base; |
| 1722 | 1723 | ||
| 1723 | drm_connector_init(dev, connector, &intel_tv_connector_funcs, | 1724 | drm_connector_init(dev, connector, &intel_tv_connector_funcs, |
| @@ -1729,6 +1730,8 @@ intel_tv_init(struct drm_device *dev) | |||
| 1729 | drm_mode_connector_attach_encoder(&intel_output->base, &intel_output->enc); | 1730 | drm_mode_connector_attach_encoder(&intel_output->base, &intel_output->enc); |
| 1730 | tv_priv = (struct intel_tv_priv *)(intel_output + 1); | 1731 | tv_priv = (struct intel_tv_priv *)(intel_output + 1); |
| 1731 | intel_output->type = INTEL_OUTPUT_TVOUT; | 1732 | intel_output->type = INTEL_OUTPUT_TVOUT; |
| 1733 | intel_output->crtc_mask = (1 << 0) | (1 << 1); | ||
| 1734 | intel_output->clone_mask = (1 << INTEL_TV_CLONE_BIT); | ||
| 1732 | intel_output->enc.possible_crtcs = ((1 << 0) | (1 << 1)); | 1735 | intel_output->enc.possible_crtcs = ((1 << 0) | (1 << 1)); |
| 1733 | intel_output->enc.possible_clones = (1 << INTEL_OUTPUT_TVOUT); | 1736 | intel_output->enc.possible_clones = (1 << INTEL_OUTPUT_TVOUT); |
| 1734 | intel_output->dev_priv = tv_priv; | 1737 | intel_output->dev_priv = tv_priv; |
diff --git a/drivers/gpu/drm/radeon/r300.c b/drivers/gpu/drm/radeon/r300.c index 053f4ec397f7..051bca6e3a4f 100644 --- a/drivers/gpu/drm/radeon/r300.c +++ b/drivers/gpu/drm/radeon/r300.c | |||
| @@ -995,7 +995,7 @@ static const unsigned r300_reg_safe_bm[159] = { | |||
| 995 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 995 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 996 | 0x00000000, 0xFFFF0000, 0xFFFFFFFF, 0xFF80FFFF, | 996 | 0x00000000, 0xFFFF0000, 0xFFFFFFFF, 0xFF80FFFF, |
| 997 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 997 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 998 | 0x0003FC01, 0xFFFFFFF8, 0xFE800B19, | 998 | 0x0003FC01, 0xFFFFFCF8, 0xFF800B19, |
| 999 | }; | 999 | }; |
| 1000 | 1000 | ||
| 1001 | static int r300_packet0_check(struct radeon_cs_parser *p, | 1001 | static int r300_packet0_check(struct radeon_cs_parser *p, |
diff --git a/drivers/gpu/drm/radeon/radeon_asic.h b/drivers/gpu/drm/radeon/radeon_asic.h index 7ca6c13569b5..93d8f8889302 100644 --- a/drivers/gpu/drm/radeon/radeon_asic.h +++ b/drivers/gpu/drm/radeon/radeon_asic.h | |||
| @@ -266,6 +266,7 @@ static struct radeon_asic rs400_asic = { | |||
| 266 | /* | 266 | /* |
| 267 | * rs600. | 267 | * rs600. |
| 268 | */ | 268 | */ |
| 269 | int rs600_init(struct radeon_device *dev); | ||
| 269 | void rs600_errata(struct radeon_device *rdev); | 270 | void rs600_errata(struct radeon_device *rdev); |
| 270 | void rs600_vram_info(struct radeon_device *rdev); | 271 | void rs600_vram_info(struct radeon_device *rdev); |
| 271 | int rs600_mc_init(struct radeon_device *rdev); | 272 | int rs600_mc_init(struct radeon_device *rdev); |
| @@ -281,7 +282,7 @@ uint32_t rs600_mc_rreg(struct radeon_device *rdev, uint32_t reg); | |||
| 281 | void rs600_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v); | 282 | void rs600_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v); |
| 282 | void rs600_bandwidth_update(struct radeon_device *rdev); | 283 | void rs600_bandwidth_update(struct radeon_device *rdev); |
| 283 | static struct radeon_asic rs600_asic = { | 284 | static struct radeon_asic rs600_asic = { |
| 284 | .init = &r300_init, | 285 | .init = &rs600_init, |
| 285 | .errata = &rs600_errata, | 286 | .errata = &rs600_errata, |
| 286 | .vram_info = &rs600_vram_info, | 287 | .vram_info = &rs600_vram_info, |
| 287 | .gpu_reset = &r300_gpu_reset, | 288 | .gpu_reset = &r300_gpu_reset, |
| @@ -316,7 +317,6 @@ static struct radeon_asic rs600_asic = { | |||
| 316 | /* | 317 | /* |
| 317 | * rs690,rs740 | 318 | * rs690,rs740 |
| 318 | */ | 319 | */ |
| 319 | int rs690_init(struct radeon_device *rdev); | ||
| 320 | void rs690_errata(struct radeon_device *rdev); | 320 | void rs690_errata(struct radeon_device *rdev); |
| 321 | void rs690_vram_info(struct radeon_device *rdev); | 321 | void rs690_vram_info(struct radeon_device *rdev); |
| 322 | int rs690_mc_init(struct radeon_device *rdev); | 322 | int rs690_mc_init(struct radeon_device *rdev); |
| @@ -325,7 +325,7 @@ uint32_t rs690_mc_rreg(struct radeon_device *rdev, uint32_t reg); | |||
| 325 | void rs690_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v); | 325 | void rs690_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v); |
| 326 | void rs690_bandwidth_update(struct radeon_device *rdev); | 326 | void rs690_bandwidth_update(struct radeon_device *rdev); |
| 327 | static struct radeon_asic rs690_asic = { | 327 | static struct radeon_asic rs690_asic = { |
| 328 | .init = &rs690_init, | 328 | .init = &rs600_init, |
| 329 | .errata = &rs690_errata, | 329 | .errata = &rs690_errata, |
| 330 | .vram_info = &rs690_vram_info, | 330 | .vram_info = &rs690_vram_info, |
| 331 | .gpu_reset = &r300_gpu_reset, | 331 | .gpu_reset = &r300_gpu_reset, |
diff --git a/drivers/gpu/drm/radeon/radeon_gem.c b/drivers/gpu/drm/radeon/radeon_gem.c index 14c199802920..d880edf254db 100644 --- a/drivers/gpu/drm/radeon/radeon_gem.c +++ b/drivers/gpu/drm/radeon/radeon_gem.c | |||
| @@ -274,12 +274,18 @@ int radeon_gem_busy_ioctl(struct drm_device *dev, void *data, | |||
| 274 | } | 274 | } |
| 275 | robj = gobj->driver_private; | 275 | robj = gobj->driver_private; |
| 276 | r = radeon_object_busy_domain(robj, &cur_placement); | 276 | r = radeon_object_busy_domain(robj, &cur_placement); |
| 277 | if (cur_placement == TTM_PL_VRAM) | 277 | switch (cur_placement) { |
| 278 | case TTM_PL_VRAM: | ||
| 278 | args->domain = RADEON_GEM_DOMAIN_VRAM; | 279 | args->domain = RADEON_GEM_DOMAIN_VRAM; |
| 279 | if (cur_placement == TTM_PL_FLAG_TT) | 280 | break; |
| 281 | case TTM_PL_TT: | ||
| 280 | args->domain = RADEON_GEM_DOMAIN_GTT; | 282 | args->domain = RADEON_GEM_DOMAIN_GTT; |
| 281 | if (cur_placement == TTM_PL_FLAG_SYSTEM) | 283 | break; |
| 284 | case TTM_PL_SYSTEM: | ||
| 282 | args->domain = RADEON_GEM_DOMAIN_CPU; | 285 | args->domain = RADEON_GEM_DOMAIN_CPU; |
| 286 | default: | ||
| 287 | break; | ||
| 288 | } | ||
| 283 | mutex_lock(&dev->struct_mutex); | 289 | mutex_lock(&dev->struct_mutex); |
| 284 | drm_gem_object_unreference(gobj); | 290 | drm_gem_object_unreference(gobj); |
| 285 | mutex_unlock(&dev->struct_mutex); | 291 | mutex_unlock(&dev->struct_mutex); |
diff --git a/drivers/gpu/drm/radeon/rs600.c b/drivers/gpu/drm/radeon/rs600.c index 7e8ce983a908..02fd11aad6a2 100644 --- a/drivers/gpu/drm/radeon/rs600.c +++ b/drivers/gpu/drm/radeon/rs600.c | |||
| @@ -409,3 +409,68 @@ void rs600_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v) | |||
| 409 | ((reg) & RS600_MC_ADDR_MASK)); | 409 | ((reg) & RS600_MC_ADDR_MASK)); |
| 410 | WREG32(RS600_MC_DATA, v); | 410 | WREG32(RS600_MC_DATA, v); |
| 411 | } | 411 | } |
| 412 | |||
| 413 | static const unsigned rs600_reg_safe_bm[219] = { | ||
| 414 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 415 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 416 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 417 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 418 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 419 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 420 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 421 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 422 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 423 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 424 | 0x17FF1FFF, 0xFFFFFFFC, 0xFFFFFFFF, 0xFF30FFBF, | ||
| 425 | 0xFFFFFFF8, 0xC3E6FFFF, 0xFFFFF6DF, 0xFFFFFFFF, | ||
| 426 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 427 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 428 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFF03F, | ||
| 429 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 430 | 0xFFFFFFFF, 0xFFFFEFCE, 0xF00EBFFF, 0x007C0000, | ||
| 431 | 0xF0000078, 0xFF000009, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 432 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 433 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 434 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 435 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 436 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 437 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 438 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 439 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 440 | 0xFFFFF7FF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 441 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 442 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 443 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 444 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 445 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 446 | 0xFFFFFC78, 0xFFFFFFFF, 0xFFFFFFFE, 0xFFFFFFFF, | ||
| 447 | 0x38FF8F50, 0xFFF88082, 0xF000000C, 0xFAE009FF, | ||
| 448 | 0x0000FFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, | ||
| 449 | 0x00000000, 0x0000C100, 0x00000000, 0x00000000, | ||
| 450 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | ||
| 451 | 0x00000000, 0xFFFF0000, 0xFFFFFFFF, 0xFF80FFFF, | ||
| 452 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | ||
| 453 | 0x0003FC01, 0xFFFFFCF8, 0xFF800B19, 0xFFFFFFFF, | ||
| 454 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 455 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 456 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 457 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 458 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 459 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 460 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 461 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 462 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 463 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 464 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 465 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 466 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 467 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 468 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | ||
| 469 | }; | ||
| 470 | |||
| 471 | int rs600_init(struct radeon_device *rdev) | ||
| 472 | { | ||
| 473 | rdev->config.r300.reg_safe_bm = rs600_reg_safe_bm; | ||
| 474 | rdev->config.r300.reg_safe_bm_size = ARRAY_SIZE(rs600_reg_safe_bm); | ||
| 475 | return 0; | ||
| 476 | } | ||
diff --git a/drivers/gpu/drm/radeon/rs690.c b/drivers/gpu/drm/radeon/rs690.c index bc6b7c5339bc..879882533e45 100644 --- a/drivers/gpu/drm/radeon/rs690.c +++ b/drivers/gpu/drm/radeon/rs690.c | |||
| @@ -653,67 +653,3 @@ void rs690_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v) | |||
| 653 | WREG32(RS690_MC_INDEX, RS690_MC_INDEX_WR_ACK); | 653 | WREG32(RS690_MC_INDEX, RS690_MC_INDEX_WR_ACK); |
| 654 | } | 654 | } |
| 655 | 655 | ||
| 656 | static const unsigned rs690_reg_safe_bm[219] = { | ||
| 657 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 658 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 659 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 660 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 661 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 662 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 663 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 664 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 665 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 666 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 667 | 0x17FF1FFF,0xFFFFFFFC,0xFFFFFFFF,0xFF30FFBF, | ||
| 668 | 0xFFFFFFF8,0xC3E6FFFF,0xFFFFF6DF,0xFFFFFFFF, | ||
| 669 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 670 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 671 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFF03F, | ||
| 672 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 673 | 0xFFFFFFFF,0xFFFFEFCE,0xF00EBFFF,0x007C0000, | ||
| 674 | 0xF0000078,0xFF000009,0xFFFFFFFF,0xFFFFFFFF, | ||
| 675 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 676 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 677 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 678 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 679 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 680 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 681 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 682 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 683 | 0xFFFFF7FF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 684 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 685 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 686 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 687 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 688 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 689 | 0xFFFFFC78,0xFFFFFFFF,0xFFFFFFFE,0xFFFFFFFF, | ||
| 690 | 0x38FF8F50,0xFFF88082,0xF000000C,0xFAE009FF, | ||
| 691 | 0x0000FFFF,0xFFFFFFFF,0xFFFFFFFF,0x00000000, | ||
| 692 | 0x00000000,0x0000C100,0x00000000,0x00000000, | ||
| 693 | 0x00000000,0x00000000,0x00000000,0x00000000, | ||
| 694 | 0x00000000,0xFFFF0000,0xFFFFFFFF,0xFF80FFFF, | ||
| 695 | 0x00000000,0x00000000,0x00000000,0x00000000, | ||
| 696 | 0x0003FC01,0xFFFFFFF8,0xFE800B19,0xFFFFFFFF, | ||
| 697 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 698 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 699 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 700 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 701 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 702 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 703 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 704 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 705 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 706 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 707 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 708 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 709 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 710 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 711 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 712 | }; | ||
| 713 | |||
| 714 | int rs690_init(struct radeon_device *rdev) | ||
| 715 | { | ||
| 716 | rdev->config.r300.reg_safe_bm = rs690_reg_safe_bm; | ||
| 717 | rdev->config.r300.reg_safe_bm_size = ARRAY_SIZE(rs690_reg_safe_bm); | ||
| 718 | return 0; | ||
| 719 | } | ||
diff --git a/drivers/gpu/drm/radeon/rv515.c b/drivers/gpu/drm/radeon/rv515.c index 31a7f668ae5a..0566fb67e460 100644 --- a/drivers/gpu/drm/radeon/rv515.c +++ b/drivers/gpu/drm/radeon/rv515.c | |||
| @@ -508,7 +508,7 @@ static const unsigned r500_reg_safe_bm[219] = { | |||
| 508 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | 508 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, |
| 509 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFF80FFFF, | 509 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFF80FFFF, |
| 510 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, | 510 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 511 | 0x0003FC01, 0x3FFFFCF8, 0xFE800B19, 0xFFFFFFFF, | 511 | 0x0003FC01, 0x3FFFFCF8, 0xFF800B19, 0xFFDFFFFF, |
| 512 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | 512 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, |
| 513 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | 513 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, |
| 514 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, | 514 | 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, |
diff --git a/drivers/ide/ide-cs.c b/drivers/ide/ide-cs.c index 527908ff298c..063b933d864a 100644 --- a/drivers/ide/ide-cs.c +++ b/drivers/ide/ide-cs.c | |||
| @@ -408,6 +408,7 @@ static struct pcmcia_device_id ide_ids[] = { | |||
| 408 | PCMCIA_DEVICE_PROD_ID123("PCMCIA", "IDE CARD", "F1", 0x281f1c5d, 0x1907960c, 0xf7fde8b9), | 408 | PCMCIA_DEVICE_PROD_ID123("PCMCIA", "IDE CARD", "F1", 0x281f1c5d, 0x1907960c, 0xf7fde8b9), |
| 409 | PCMCIA_DEVICE_PROD_ID12("ARGOSY", "CD-ROM", 0x78f308dc, 0x66536591), | 409 | PCMCIA_DEVICE_PROD_ID12("ARGOSY", "CD-ROM", 0x78f308dc, 0x66536591), |
| 410 | PCMCIA_DEVICE_PROD_ID12("ARGOSY", "PnPIDE", 0x78f308dc, 0x0c694728), | 410 | PCMCIA_DEVICE_PROD_ID12("ARGOSY", "PnPIDE", 0x78f308dc, 0x0c694728), |
| 411 | PCMCIA_DEVICE_PROD_ID12("CNF ", "CD-ROM", 0x46d7db81, 0x66536591), | ||
| 411 | PCMCIA_DEVICE_PROD_ID12("CNF CD-M", "CD-ROM", 0x7d93b852, 0x66536591), | 412 | PCMCIA_DEVICE_PROD_ID12("CNF CD-M", "CD-ROM", 0x7d93b852, 0x66536591), |
| 412 | PCMCIA_DEVICE_PROD_ID12("Creative Technology Ltd.", "PCMCIA CD-ROM Interface Card", 0xff8c8a45, 0xfe8020c4), | 413 | PCMCIA_DEVICE_PROD_ID12("Creative Technology Ltd.", "PCMCIA CD-ROM Interface Card", 0xff8c8a45, 0xfe8020c4), |
| 413 | PCMCIA_DEVICE_PROD_ID12("Digital Equipment Corporation.", "Digital Mobile Media CD-ROM", 0x17692a66, 0xef1dcbde), | 414 | PCMCIA_DEVICE_PROD_ID12("Digital Equipment Corporation.", "Digital Mobile Media CD-ROM", 0x17692a66, 0xef1dcbde), |
diff --git a/drivers/input/joydev.c b/drivers/input/joydev.c index 4cfd084fa897..9a1d55b74d7a 100644 --- a/drivers/input/joydev.c +++ b/drivers/input/joydev.c | |||
| @@ -456,8 +456,11 @@ static int joydev_ioctl_common(struct joydev *joydev, | |||
| 456 | unsigned int cmd, void __user *argp) | 456 | unsigned int cmd, void __user *argp) |
| 457 | { | 457 | { |
| 458 | struct input_dev *dev = joydev->handle.dev; | 458 | struct input_dev *dev = joydev->handle.dev; |
| 459 | size_t len; | ||
| 459 | int i, j; | 460 | int i, j; |
| 461 | const char *name; | ||
| 460 | 462 | ||
| 463 | /* Process fixed-sized commands. */ | ||
| 461 | switch (cmd) { | 464 | switch (cmd) { |
| 462 | 465 | ||
| 463 | case JS_SET_CAL: | 466 | case JS_SET_CAL: |
| @@ -499,9 +502,22 @@ static int joydev_ioctl_common(struct joydev *joydev, | |||
| 499 | return copy_to_user(argp, joydev->corr, | 502 | return copy_to_user(argp, joydev->corr, |
| 500 | sizeof(joydev->corr[0]) * joydev->nabs) ? -EFAULT : 0; | 503 | sizeof(joydev->corr[0]) * joydev->nabs) ? -EFAULT : 0; |
| 501 | 504 | ||
| 502 | case JSIOCSAXMAP: | 505 | } |
| 503 | if (copy_from_user(joydev->abspam, argp, | 506 | |
| 504 | sizeof(__u8) * (ABS_MAX + 1))) | 507 | /* |
| 508 | * Process variable-sized commands (the axis and button map commands | ||
| 509 | * are considered variable-sized to decouple them from the values of | ||
| 510 | * ABS_MAX and KEY_MAX). | ||
| 511 | */ | ||
| 512 | switch (cmd & ~IOCSIZE_MASK) { | ||
| 513 | |||
| 514 | case (JSIOCSAXMAP & ~IOCSIZE_MASK): | ||
| 515 | len = min_t(size_t, _IOC_SIZE(cmd), sizeof(joydev->abspam)); | ||
| 516 | /* | ||
| 517 | * FIXME: we should not copy into our axis map before | ||
| 518 | * validating the data. | ||
| 519 | */ | ||
| 520 | if (copy_from_user(joydev->abspam, argp, len)) | ||
| 505 | return -EFAULT; | 521 | return -EFAULT; |
| 506 | 522 | ||
| 507 | for (i = 0; i < joydev->nabs; i++) { | 523 | for (i = 0; i < joydev->nabs; i++) { |
| @@ -511,13 +527,17 @@ static int joydev_ioctl_common(struct joydev *joydev, | |||
| 511 | } | 527 | } |
| 512 | return 0; | 528 | return 0; |
| 513 | 529 | ||
| 514 | case JSIOCGAXMAP: | 530 | case (JSIOCGAXMAP & ~IOCSIZE_MASK): |
| 515 | return copy_to_user(argp, joydev->abspam, | 531 | len = min_t(size_t, _IOC_SIZE(cmd), sizeof(joydev->abspam)); |
| 516 | sizeof(__u8) * (ABS_MAX + 1)) ? -EFAULT : 0; | 532 | return copy_to_user(argp, joydev->abspam, len) ? -EFAULT : 0; |
| 517 | 533 | ||
| 518 | case JSIOCSBTNMAP: | 534 | case (JSIOCSBTNMAP & ~IOCSIZE_MASK): |
| 519 | if (copy_from_user(joydev->keypam, argp, | 535 | len = min_t(size_t, _IOC_SIZE(cmd), sizeof(joydev->keypam)); |
| 520 | sizeof(__u16) * (KEY_MAX - BTN_MISC + 1))) | 536 | /* |
| 537 | * FIXME: we should not copy into our keymap before | ||
| 538 | * validating the data. | ||
| 539 | */ | ||
| 540 | if (copy_from_user(joydev->keypam, argp, len)) | ||
| 521 | return -EFAULT; | 541 | return -EFAULT; |
| 522 | 542 | ||
| 523 | for (i = 0; i < joydev->nkey; i++) { | 543 | for (i = 0; i < joydev->nkey; i++) { |
| @@ -529,25 +549,19 @@ static int joydev_ioctl_common(struct joydev *joydev, | |||
| 529 | 549 | ||
| 530 | return 0; | 550 | return 0; |
| 531 | 551 | ||
| 532 | case JSIOCGBTNMAP: | 552 | case (JSIOCGBTNMAP & ~IOCSIZE_MASK): |
| 533 | return copy_to_user(argp, joydev->keypam, | 553 | len = min_t(size_t, _IOC_SIZE(cmd), sizeof(joydev->keypam)); |
| 534 | sizeof(__u16) * (KEY_MAX - BTN_MISC + 1)) ? -EFAULT : 0; | 554 | return copy_to_user(argp, joydev->keypam, len) ? -EFAULT : 0; |
| 535 | 555 | ||
| 536 | default: | 556 | case JSIOCGNAME(0): |
| 537 | if ((cmd & ~IOCSIZE_MASK) == JSIOCGNAME(0)) { | 557 | name = dev->name; |
| 538 | int len; | 558 | if (!name) |
| 539 | const char *name = dev->name; | 559 | return 0; |
| 540 | 560 | ||
| 541 | if (!name) | 561 | len = min_t(size_t, _IOC_SIZE(cmd), strlen(name) + 1); |
| 542 | return 0; | 562 | return copy_to_user(argp, name, len) ? -EFAULT : len; |
| 543 | len = strlen(name) + 1; | ||
| 544 | if (len > _IOC_SIZE(cmd)) | ||
| 545 | len = _IOC_SIZE(cmd); | ||
| 546 | if (copy_to_user(argp, name, len)) | ||
| 547 | return -EFAULT; | ||
| 548 | return len; | ||
| 549 | } | ||
| 550 | } | 563 | } |
| 564 | |||
| 551 | return -EINVAL; | 565 | return -EINVAL; |
| 552 | } | 566 | } |
| 553 | 567 | ||
diff --git a/drivers/input/joystick/iforce/iforce-main.c b/drivers/input/joystick/iforce/iforce-main.c index baabf8302645..f6c688cae334 100644 --- a/drivers/input/joystick/iforce/iforce-main.c +++ b/drivers/input/joystick/iforce/iforce-main.c | |||
| @@ -74,6 +74,7 @@ static struct iforce_device iforce_device[] = { | |||
| 74 | { 0x05ef, 0x8884, "AVB Mag Turbo Force", btn_avb_wheel, abs_wheel, ff_iforce }, | 74 | { 0x05ef, 0x8884, "AVB Mag Turbo Force", btn_avb_wheel, abs_wheel, ff_iforce }, |
| 75 | { 0x05ef, 0x8888, "AVB Top Shot Force Feedback Racing Wheel", btn_avb_tw, abs_wheel, ff_iforce }, //? | 75 | { 0x05ef, 0x8888, "AVB Top Shot Force Feedback Racing Wheel", btn_avb_tw, abs_wheel, ff_iforce }, //? |
| 76 | { 0x061c, 0xc0a4, "ACT LABS Force RS", btn_wheel, abs_wheel, ff_iforce }, //? | 76 | { 0x061c, 0xc0a4, "ACT LABS Force RS", btn_wheel, abs_wheel, ff_iforce }, //? |
| 77 | { 0x061c, 0xc084, "ACT LABS Force RS", btn_wheel, abs_wheel, ff_iforce }, | ||
| 77 | { 0x06f8, 0x0001, "Guillemot Race Leader Force Feedback", btn_wheel, abs_wheel, ff_iforce }, //? | 78 | { 0x06f8, 0x0001, "Guillemot Race Leader Force Feedback", btn_wheel, abs_wheel, ff_iforce }, //? |
| 78 | { 0x06f8, 0x0004, "Guillemot Force Feedback Racing Wheel", btn_wheel, abs_wheel, ff_iforce }, //? | 79 | { 0x06f8, 0x0004, "Guillemot Force Feedback Racing Wheel", btn_wheel, abs_wheel, ff_iforce }, //? |
| 79 | { 0x06f8, 0x0004, "Gullemot Jet Leader 3D", btn_joystick, abs_joystick, ff_iforce }, //? | 80 | { 0x06f8, 0x0004, "Gullemot Jet Leader 3D", btn_joystick, abs_joystick, ff_iforce }, //? |
diff --git a/drivers/input/joystick/iforce/iforce-usb.c b/drivers/input/joystick/iforce/iforce-usb.c index f83185aeb511..9f289d8f52c6 100644 --- a/drivers/input/joystick/iforce/iforce-usb.c +++ b/drivers/input/joystick/iforce/iforce-usb.c | |||
| @@ -223,6 +223,7 @@ static struct usb_device_id iforce_usb_ids [] = { | |||
| 223 | { USB_DEVICE(0x05ef, 0x8884) }, /* AVB Mag Turbo Force */ | 223 | { USB_DEVICE(0x05ef, 0x8884) }, /* AVB Mag Turbo Force */ |
| 224 | { USB_DEVICE(0x05ef, 0x8888) }, /* AVB Top Shot FFB Racing Wheel */ | 224 | { USB_DEVICE(0x05ef, 0x8888) }, /* AVB Top Shot FFB Racing Wheel */ |
| 225 | { USB_DEVICE(0x061c, 0xc0a4) }, /* ACT LABS Force RS */ | 225 | { USB_DEVICE(0x061c, 0xc0a4) }, /* ACT LABS Force RS */ |
| 226 | { USB_DEVICE(0x061c, 0xc084) }, /* ACT LABS Force RS */ | ||
| 226 | { USB_DEVICE(0x06f8, 0x0001) }, /* Guillemot Race Leader Force Feedback */ | 227 | { USB_DEVICE(0x06f8, 0x0001) }, /* Guillemot Race Leader Force Feedback */ |
| 227 | { USB_DEVICE(0x06f8, 0x0004) }, /* Guillemot Force Feedback Racing Wheel */ | 228 | { USB_DEVICE(0x06f8, 0x0004) }, /* Guillemot Force Feedback Racing Wheel */ |
| 228 | { USB_DEVICE(0x06f8, 0xa302) }, /* Guillemot Jet Leader 3D */ | 229 | { USB_DEVICE(0x06f8, 0xa302) }, /* Guillemot Jet Leader 3D */ |
diff --git a/drivers/input/keyboard/atkbd.c b/drivers/input/keyboard/atkbd.c index 95fe0452dae4..6c6a09b1c0fe 100644 --- a/drivers/input/keyboard/atkbd.c +++ b/drivers/input/keyboard/atkbd.c | |||
| @@ -880,6 +880,14 @@ static unsigned int atkbd_hp_zv6100_forced_release_keys[] = { | |||
| 880 | }; | 880 | }; |
| 881 | 881 | ||
| 882 | /* | 882 | /* |
| 883 | * Perform fixup for HP (Compaq) Presario R4000 R4100 R4200 that don't generate | ||
| 884 | * release for their volume buttons | ||
| 885 | */ | ||
| 886 | static unsigned int atkbd_hp_r4000_forced_release_keys[] = { | ||
| 887 | 0xae, 0xb0, -1U | ||
| 888 | }; | ||
| 889 | |||
| 890 | /* | ||
| 883 | * Samsung NC10,NC20 with Fn+F? key release not working | 891 | * Samsung NC10,NC20 with Fn+F? key release not working |
| 884 | */ | 892 | */ |
| 885 | static unsigned int atkbd_samsung_forced_release_keys[] = { | 893 | static unsigned int atkbd_samsung_forced_release_keys[] = { |
| @@ -1537,6 +1545,33 @@ static struct dmi_system_id atkbd_dmi_quirk_table[] __initdata = { | |||
| 1537 | .driver_data = atkbd_hp_zv6100_forced_release_keys, | 1545 | .driver_data = atkbd_hp_zv6100_forced_release_keys, |
| 1538 | }, | 1546 | }, |
| 1539 | { | 1547 | { |
| 1548 | .ident = "HP Presario R4000", | ||
| 1549 | .matches = { | ||
| 1550 | DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), | ||
| 1551 | DMI_MATCH(DMI_PRODUCT_NAME, "Presario R4000"), | ||
| 1552 | }, | ||
| 1553 | .callback = atkbd_setup_forced_release, | ||
| 1554 | .driver_data = atkbd_hp_r4000_forced_release_keys, | ||
| 1555 | }, | ||
| 1556 | { | ||
| 1557 | .ident = "HP Presario R4100", | ||
| 1558 | .matches = { | ||
| 1559 | DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), | ||
| 1560 | DMI_MATCH(DMI_PRODUCT_NAME, "Presario R4100"), | ||
| 1561 | }, | ||
| 1562 | .callback = atkbd_setup_forced_release, | ||
| 1563 | .driver_data = atkbd_hp_r4000_forced_release_keys, | ||
| 1564 | }, | ||
| 1565 | { | ||
| 1566 | .ident = "HP Presario R4200", | ||
| 1567 | .matches = { | ||
| 1568 | DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), | ||
| 1569 | DMI_MATCH(DMI_PRODUCT_NAME, "Presario R4200"), | ||
| 1570 | }, | ||
| 1571 | .callback = atkbd_setup_forced_release, | ||
| 1572 | .driver_data = atkbd_hp_r4000_forced_release_keys, | ||
| 1573 | }, | ||
| 1574 | { | ||
| 1540 | .ident = "Inventec Symphony", | 1575 | .ident = "Inventec Symphony", |
| 1541 | .matches = { | 1576 | .matches = { |
| 1542 | DMI_MATCH(DMI_SYS_VENDOR, "INVENTEC"), | 1577 | DMI_MATCH(DMI_SYS_VENDOR, "INVENTEC"), |
diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h index ae04d8a494e5..ccbf23ece8e3 100644 --- a/drivers/input/serio/i8042-x86ia64io.h +++ b/drivers/input/serio/i8042-x86ia64io.h | |||
| @@ -382,6 +382,14 @@ static struct dmi_system_id __initdata i8042_dmi_nomux_table[] = { | |||
| 382 | DMI_MATCH(DMI_PRODUCT_NAME, "Vostro1510"), | 382 | DMI_MATCH(DMI_PRODUCT_NAME, "Vostro1510"), |
| 383 | }, | 383 | }, |
| 384 | }, | 384 | }, |
| 385 | { | ||
| 386 | .ident = "Acer Aspire 5536", | ||
| 387 | .matches = { | ||
| 388 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | ||
| 389 | DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5536"), | ||
| 390 | DMI_MATCH(DMI_PRODUCT_VERSION, "0100"), | ||
| 391 | }, | ||
| 392 | }, | ||
| 385 | { } | 393 | { } |
| 386 | }; | 394 | }; |
| 387 | 395 | ||
diff --git a/drivers/input/tablet/wacom_sys.c b/drivers/input/tablet/wacom_sys.c index a9d5031b855e..ea30c983a33e 100644 --- a/drivers/input/tablet/wacom_sys.c +++ b/drivers/input/tablet/wacom_sys.c | |||
| @@ -388,6 +388,32 @@ static int wacom_parse_hid(struct usb_interface *intf, struct hid_descriptor *hi | |||
| 388 | return result; | 388 | return result; |
| 389 | } | 389 | } |
| 390 | 390 | ||
| 391 | static int wacom_query_tablet_data(struct usb_interface *intf) | ||
| 392 | { | ||
| 393 | unsigned char *rep_data; | ||
| 394 | int limit = 0; | ||
| 395 | int error; | ||
| 396 | |||
| 397 | rep_data = kmalloc(2, GFP_KERNEL); | ||
| 398 | if (!rep_data) | ||
| 399 | return -ENOMEM; | ||
| 400 | |||
| 401 | do { | ||
| 402 | rep_data[0] = 2; | ||
| 403 | rep_data[1] = 2; | ||
| 404 | error = usb_set_report(intf, WAC_HID_FEATURE_REPORT, | ||
| 405 | 2, rep_data, 2); | ||
| 406 | if (error >= 0) | ||
| 407 | error = usb_get_report(intf, | ||
| 408 | WAC_HID_FEATURE_REPORT, 2, | ||
| 409 | rep_data, 2); | ||
| 410 | } while ((error < 0 || rep_data[1] != 2) && limit++ < 5); | ||
| 411 | |||
| 412 | kfree(rep_data); | ||
| 413 | |||
| 414 | return error < 0 ? error : 0; | ||
| 415 | } | ||
| 416 | |||
| 391 | static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *id) | 417 | static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *id) |
| 392 | { | 418 | { |
| 393 | struct usb_device *dev = interface_to_usbdev(intf); | 419 | struct usb_device *dev = interface_to_usbdev(intf); |
| @@ -398,7 +424,6 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i | |||
| 398 | struct wacom_features *features; | 424 | struct wacom_features *features; |
| 399 | struct input_dev *input_dev; | 425 | struct input_dev *input_dev; |
| 400 | int error = -ENOMEM; | 426 | int error = -ENOMEM; |
| 401 | char rep_data[2], limit = 0; | ||
| 402 | struct hid_descriptor *hid_desc; | 427 | struct hid_descriptor *hid_desc; |
| 403 | 428 | ||
| 404 | wacom = kzalloc(sizeof(struct wacom), GFP_KERNEL); | 429 | wacom = kzalloc(sizeof(struct wacom), GFP_KERNEL); |
| @@ -489,20 +514,10 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i | |||
| 489 | 514 | ||
| 490 | /* | 515 | /* |
| 491 | * Ask the tablet to report tablet data if it is not a Tablet PC. | 516 | * Ask the tablet to report tablet data if it is not a Tablet PC. |
| 492 | * Repeat until it succeeds | 517 | * Note that if query fails it is not a hard failure. |
| 493 | */ | 518 | */ |
| 494 | if (wacom_wac->features->type != TABLETPC) { | 519 | if (wacom_wac->features->type != TABLETPC) |
| 495 | do { | 520 | wacom_query_tablet_data(intf); |
| 496 | rep_data[0] = 2; | ||
| 497 | rep_data[1] = 2; | ||
| 498 | error = usb_set_report(intf, WAC_HID_FEATURE_REPORT, | ||
| 499 | 2, rep_data, 2); | ||
| 500 | if (error >= 0) | ||
| 501 | error = usb_get_report(intf, | ||
| 502 | WAC_HID_FEATURE_REPORT, 2, | ||
| 503 | rep_data, 2); | ||
| 504 | } while ((error < 0 || rep_data[1] != 2) && limit++ < 5); | ||
| 505 | } | ||
| 506 | 521 | ||
| 507 | usb_set_intfdata(intf, wacom); | 522 | usb_set_intfdata(intf, wacom); |
| 508 | return 0; | 523 | return 0; |
diff --git a/drivers/input/touchscreen/ucb1400_ts.c b/drivers/input/touchscreen/ucb1400_ts.c index 6954f5500108..3a7a58222f83 100644 --- a/drivers/input/touchscreen/ucb1400_ts.c +++ b/drivers/input/touchscreen/ucb1400_ts.c | |||
| @@ -170,11 +170,11 @@ static void ucb1400_handle_pending_irq(struct ucb1400_ts *ucb) | |||
| 170 | ucb1400_reg_write(ucb->ac97, UCB_IE_CLEAR, isr); | 170 | ucb1400_reg_write(ucb->ac97, UCB_IE_CLEAR, isr); |
| 171 | ucb1400_reg_write(ucb->ac97, UCB_IE_CLEAR, 0); | 171 | ucb1400_reg_write(ucb->ac97, UCB_IE_CLEAR, 0); |
| 172 | 172 | ||
| 173 | if (isr & UCB_IE_TSPX) { | 173 | if (isr & UCB_IE_TSPX) |
| 174 | ucb1400_ts_irq_disable(ucb->ac97); | 174 | ucb1400_ts_irq_disable(ucb->ac97); |
| 175 | enable_irq(ucb->irq); | 175 | else |
| 176 | } else | 176 | dev_dbg(&ucb->ts_idev->dev, "ucb1400: unexpected IE_STATUS = %#x\n", isr); |
| 177 | printk(KERN_ERR "ucb1400: unexpected IE_STATUS = %#x\n", isr); | 177 | enable_irq(ucb->irq); |
| 178 | } | 178 | } |
| 179 | 179 | ||
| 180 | static int ucb1400_ts_thread(void *_ucb) | 180 | static int ucb1400_ts_thread(void *_ucb) |
| @@ -345,6 +345,7 @@ static int ucb1400_ts_detect_irq(struct ucb1400_ts *ucb) | |||
| 345 | static int ucb1400_ts_probe(struct platform_device *dev) | 345 | static int ucb1400_ts_probe(struct platform_device *dev) |
| 346 | { | 346 | { |
| 347 | int error, x_res, y_res; | 347 | int error, x_res, y_res; |
| 348 | u16 fcsr; | ||
| 348 | struct ucb1400_ts *ucb = dev->dev.platform_data; | 349 | struct ucb1400_ts *ucb = dev->dev.platform_data; |
| 349 | 350 | ||
| 350 | ucb->ts_idev = input_allocate_device(); | 351 | ucb->ts_idev = input_allocate_device(); |
| @@ -382,6 +383,14 @@ static int ucb1400_ts_probe(struct platform_device *dev) | |||
| 382 | ucb->ts_idev->evbit[0] = BIT_MASK(EV_ABS) | BIT_MASK(EV_KEY); | 383 | ucb->ts_idev->evbit[0] = BIT_MASK(EV_ABS) | BIT_MASK(EV_KEY); |
| 383 | ucb->ts_idev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); | 384 | ucb->ts_idev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); |
| 384 | 385 | ||
| 386 | /* | ||
| 387 | * Enable ADC filter to prevent horrible jitter on Colibri. | ||
| 388 | * This also further reduces jitter on boards where ADCSYNC | ||
| 389 | * pin is connected. | ||
| 390 | */ | ||
| 391 | fcsr = ucb1400_reg_read(ucb->ac97, UCB_FCSR); | ||
| 392 | ucb1400_reg_write(ucb->ac97, UCB_FCSR, fcsr | UCB_FCSR_AVE); | ||
| 393 | |||
| 385 | ucb1400_adc_enable(ucb->ac97); | 394 | ucb1400_adc_enable(ucb->ac97); |
| 386 | x_res = ucb1400_ts_read_xres(ucb); | 395 | x_res = ucb1400_ts_read_xres(ucb); |
| 387 | y_res = ucb1400_ts_read_yres(ucb); | 396 | y_res = ucb1400_ts_read_yres(ucb); |
diff --git a/drivers/leds/ledtrig-gpio.c b/drivers/leds/ledtrig-gpio.c index a247ae63374f..1bc5db4ece0d 100644 --- a/drivers/leds/ledtrig-gpio.c +++ b/drivers/leds/ledtrig-gpio.c | |||
| @@ -117,6 +117,9 @@ static ssize_t gpio_trig_inverted_store(struct device *dev, | |||
| 117 | 117 | ||
| 118 | gpio_data->inverted = !!inverted; | 118 | gpio_data->inverted = !!inverted; |
| 119 | 119 | ||
| 120 | /* After inverting, we need to update the LED. */ | ||
| 121 | schedule_work(&gpio_data->work); | ||
| 122 | |||
| 120 | return n; | 123 | return n; |
| 121 | } | 124 | } |
| 122 | static DEVICE_ATTR(inverted, 0644, gpio_trig_inverted_show, | 125 | static DEVICE_ATTR(inverted, 0644, gpio_trig_inverted_show, |
| @@ -146,20 +149,26 @@ static ssize_t gpio_trig_gpio_store(struct device *dev, | |||
| 146 | return -EINVAL; | 149 | return -EINVAL; |
| 147 | } | 150 | } |
| 148 | 151 | ||
| 152 | if (gpio_data->gpio == gpio) | ||
| 153 | return n; | ||
| 154 | |||
| 149 | if (!gpio) { | 155 | if (!gpio) { |
| 150 | free_irq(gpio_to_irq(gpio_data->gpio), led); | 156 | if (gpio_data->gpio != 0) |
| 157 | free_irq(gpio_to_irq(gpio_data->gpio), led); | ||
| 158 | gpio_data->gpio = 0; | ||
| 151 | return n; | 159 | return n; |
| 152 | } | 160 | } |
| 153 | 161 | ||
| 154 | if (gpio_data->gpio > 0 && gpio_data->gpio != gpio) | ||
| 155 | free_irq(gpio_to_irq(gpio_data->gpio), led); | ||
| 156 | |||
| 157 | gpio_data->gpio = gpio; | ||
| 158 | ret = request_irq(gpio_to_irq(gpio), gpio_trig_irq, | 162 | ret = request_irq(gpio_to_irq(gpio), gpio_trig_irq, |
| 159 | IRQF_SHARED | IRQF_TRIGGER_RISING | 163 | IRQF_SHARED | IRQF_TRIGGER_RISING |
| 160 | | IRQF_TRIGGER_FALLING, "ledtrig-gpio", led); | 164 | | IRQF_TRIGGER_FALLING, "ledtrig-gpio", led); |
| 161 | if (ret) | 165 | if (ret) { |
| 162 | dev_err(dev, "request_irq failed with error %d\n", ret); | 166 | dev_err(dev, "request_irq failed with error %d\n", ret); |
| 167 | } else { | ||
| 168 | if (gpio_data->gpio != 0) | ||
| 169 | free_irq(gpio_to_irq(gpio_data->gpio), led); | ||
| 170 | gpio_data->gpio = gpio; | ||
| 171 | } | ||
| 163 | 172 | ||
| 164 | return ret ? ret : n; | 173 | return ret ? ret : n; |
| 165 | } | 174 | } |
| @@ -211,7 +220,8 @@ static void gpio_trig_deactivate(struct led_classdev *led) | |||
| 211 | device_remove_file(led->dev, &dev_attr_inverted); | 220 | device_remove_file(led->dev, &dev_attr_inverted); |
| 212 | device_remove_file(led->dev, &dev_attr_desired_brightness); | 221 | device_remove_file(led->dev, &dev_attr_desired_brightness); |
| 213 | flush_work(&gpio_data->work); | 222 | flush_work(&gpio_data->work); |
| 214 | free_irq(gpio_to_irq(gpio_data->gpio),led); | 223 | if (gpio_data->gpio != 0) |
| 224 | free_irq(gpio_to_irq(gpio_data->gpio), led); | ||
| 215 | kfree(gpio_data); | 225 | kfree(gpio_data); |
| 216 | } | 226 | } |
| 217 | } | 227 | } |
diff --git a/drivers/macintosh/via-maciisi.c b/drivers/macintosh/via-maciisi.c index 4d686c0bdea0..9ab5b0c34f0d 100644 --- a/drivers/macintosh/via-maciisi.c +++ b/drivers/macintosh/via-maciisi.c | |||
| @@ -288,7 +288,7 @@ static void maciisi_sync(struct adb_request *req) | |||
| 288 | } | 288 | } |
| 289 | /* This could be BAD... when the ADB controller doesn't respond | 289 | /* This could be BAD... when the ADB controller doesn't respond |
| 290 | * for this long, it's probably not coming back :-( */ | 290 | * for this long, it's probably not coming back :-( */ |
| 291 | if(count >= 50) /* Hopefully shouldn't happen */ | 291 | if (count > 50) /* Hopefully shouldn't happen */ |
| 292 | printk(KERN_ERR "maciisi_send_request: poll timed out!\n"); | 292 | printk(KERN_ERR "maciisi_send_request: poll timed out!\n"); |
| 293 | } | 293 | } |
| 294 | 294 | ||
diff --git a/drivers/md/dm-exception-store.c b/drivers/md/dm-exception-store.c index 3710ff88fc10..556acff3952f 100644 --- a/drivers/md/dm-exception-store.c +++ b/drivers/md/dm-exception-store.c | |||
| @@ -171,6 +171,14 @@ static int set_chunk_size(struct dm_exception_store *store, | |||
| 171 | */ | 171 | */ |
| 172 | chunk_size_ulong = round_up(chunk_size_ulong, PAGE_SIZE >> 9); | 172 | chunk_size_ulong = round_up(chunk_size_ulong, PAGE_SIZE >> 9); |
| 173 | 173 | ||
| 174 | return dm_exception_store_set_chunk_size(store, chunk_size_ulong, | ||
| 175 | error); | ||
| 176 | } | ||
| 177 | |||
| 178 | int dm_exception_store_set_chunk_size(struct dm_exception_store *store, | ||
| 179 | unsigned long chunk_size_ulong, | ||
| 180 | char **error) | ||
| 181 | { | ||
| 174 | /* Check chunk_size is a power of 2 */ | 182 | /* Check chunk_size is a power of 2 */ |
| 175 | if (!is_power_of_2(chunk_size_ulong)) { | 183 | if (!is_power_of_2(chunk_size_ulong)) { |
| 176 | *error = "Chunk size is not a power of 2"; | 184 | *error = "Chunk size is not a power of 2"; |
| @@ -183,6 +191,11 @@ static int set_chunk_size(struct dm_exception_store *store, | |||
| 183 | return -EINVAL; | 191 | return -EINVAL; |
| 184 | } | 192 | } |
| 185 | 193 | ||
| 194 | if (chunk_size_ulong > INT_MAX >> SECTOR_SHIFT) { | ||
| 195 | *error = "Chunk size is too high"; | ||
| 196 | return -EINVAL; | ||
| 197 | } | ||
| 198 | |||
| 186 | store->chunk_size = chunk_size_ulong; | 199 | store->chunk_size = chunk_size_ulong; |
| 187 | store->chunk_mask = chunk_size_ulong - 1; | 200 | store->chunk_mask = chunk_size_ulong - 1; |
| 188 | store->chunk_shift = ffs(chunk_size_ulong) - 1; | 201 | store->chunk_shift = ffs(chunk_size_ulong) - 1; |
diff --git a/drivers/md/dm-exception-store.h b/drivers/md/dm-exception-store.h index 2442c8c07898..812c71872ba0 100644 --- a/drivers/md/dm-exception-store.h +++ b/drivers/md/dm-exception-store.h | |||
| @@ -168,6 +168,10 @@ static inline chunk_t sector_to_chunk(struct dm_exception_store *store, | |||
| 168 | int dm_exception_store_type_register(struct dm_exception_store_type *type); | 168 | int dm_exception_store_type_register(struct dm_exception_store_type *type); |
| 169 | int dm_exception_store_type_unregister(struct dm_exception_store_type *type); | 169 | int dm_exception_store_type_unregister(struct dm_exception_store_type *type); |
| 170 | 170 | ||
| 171 | int dm_exception_store_set_chunk_size(struct dm_exception_store *store, | ||
| 172 | unsigned long chunk_size_ulong, | ||
| 173 | char **error); | ||
| 174 | |||
| 171 | int dm_exception_store_create(struct dm_target *ti, int argc, char **argv, | 175 | int dm_exception_store_create(struct dm_target *ti, int argc, char **argv, |
| 172 | unsigned *args_used, | 176 | unsigned *args_used, |
| 173 | struct dm_exception_store **store); | 177 | struct dm_exception_store **store); |
diff --git a/drivers/md/dm-log-userspace-base.c b/drivers/md/dm-log-userspace-base.c index e69b96560997..6e186b1a062d 100644 --- a/drivers/md/dm-log-userspace-base.c +++ b/drivers/md/dm-log-userspace-base.c | |||
| @@ -21,6 +21,7 @@ struct log_c { | |||
| 21 | struct dm_target *ti; | 21 | struct dm_target *ti; |
| 22 | uint32_t region_size; | 22 | uint32_t region_size; |
| 23 | region_t region_count; | 23 | region_t region_count; |
| 24 | uint64_t luid; | ||
| 24 | char uuid[DM_UUID_LEN]; | 25 | char uuid[DM_UUID_LEN]; |
| 25 | 26 | ||
| 26 | char *usr_argv_str; | 27 | char *usr_argv_str; |
| @@ -63,7 +64,7 @@ static int userspace_do_request(struct log_c *lc, const char *uuid, | |||
| 63 | * restored. | 64 | * restored. |
| 64 | */ | 65 | */ |
| 65 | retry: | 66 | retry: |
| 66 | r = dm_consult_userspace(uuid, request_type, data, | 67 | r = dm_consult_userspace(uuid, lc->luid, request_type, data, |
| 67 | data_size, rdata, rdata_size); | 68 | data_size, rdata, rdata_size); |
| 68 | 69 | ||
| 69 | if (r != -ESRCH) | 70 | if (r != -ESRCH) |
| @@ -74,14 +75,15 @@ retry: | |||
| 74 | set_current_state(TASK_INTERRUPTIBLE); | 75 | set_current_state(TASK_INTERRUPTIBLE); |
| 75 | schedule_timeout(2*HZ); | 76 | schedule_timeout(2*HZ); |
| 76 | DMWARN("Attempting to contact userspace log server..."); | 77 | DMWARN("Attempting to contact userspace log server..."); |
| 77 | r = dm_consult_userspace(uuid, DM_ULOG_CTR, lc->usr_argv_str, | 78 | r = dm_consult_userspace(uuid, lc->luid, DM_ULOG_CTR, |
| 79 | lc->usr_argv_str, | ||
| 78 | strlen(lc->usr_argv_str) + 1, | 80 | strlen(lc->usr_argv_str) + 1, |
| 79 | NULL, NULL); | 81 | NULL, NULL); |
| 80 | if (!r) | 82 | if (!r) |
| 81 | break; | 83 | break; |
| 82 | } | 84 | } |
| 83 | DMINFO("Reconnected to userspace log server... DM_ULOG_CTR complete"); | 85 | DMINFO("Reconnected to userspace log server... DM_ULOG_CTR complete"); |
| 84 | r = dm_consult_userspace(uuid, DM_ULOG_RESUME, NULL, | 86 | r = dm_consult_userspace(uuid, lc->luid, DM_ULOG_RESUME, NULL, |
| 85 | 0, NULL, NULL); | 87 | 0, NULL, NULL); |
| 86 | if (!r) | 88 | if (!r) |
| 87 | goto retry; | 89 | goto retry; |
| @@ -111,10 +113,9 @@ static int build_constructor_string(struct dm_target *ti, | |||
| 111 | return -ENOMEM; | 113 | return -ENOMEM; |
| 112 | } | 114 | } |
| 113 | 115 | ||
| 114 | for (i = 0, str_size = 0; i < argc; i++) | 116 | str_size = sprintf(str, "%llu", (unsigned long long)ti->len); |
| 115 | str_size += sprintf(str + str_size, "%s ", argv[i]); | 117 | for (i = 0; i < argc; i++) |
| 116 | str_size += sprintf(str + str_size, "%llu", | 118 | str_size += sprintf(str + str_size, " %s", argv[i]); |
| 117 | (unsigned long long)ti->len); | ||
| 118 | 119 | ||
| 119 | *ctr_str = str; | 120 | *ctr_str = str; |
| 120 | return str_size; | 121 | return str_size; |
| @@ -154,6 +155,9 @@ static int userspace_ctr(struct dm_dirty_log *log, struct dm_target *ti, | |||
| 154 | return -ENOMEM; | 155 | return -ENOMEM; |
| 155 | } | 156 | } |
| 156 | 157 | ||
| 158 | /* The ptr value is sufficient for local unique id */ | ||
| 159 | lc->luid = (uint64_t)lc; | ||
| 160 | |||
| 157 | lc->ti = ti; | 161 | lc->ti = ti; |
| 158 | 162 | ||
| 159 | if (strlen(argv[0]) > (DM_UUID_LEN - 1)) { | 163 | if (strlen(argv[0]) > (DM_UUID_LEN - 1)) { |
| @@ -173,7 +177,7 @@ static int userspace_ctr(struct dm_dirty_log *log, struct dm_target *ti, | |||
| 173 | } | 177 | } |
| 174 | 178 | ||
| 175 | /* Send table string */ | 179 | /* Send table string */ |
| 176 | r = dm_consult_userspace(lc->uuid, DM_ULOG_CTR, | 180 | r = dm_consult_userspace(lc->uuid, lc->luid, DM_ULOG_CTR, |
| 177 | ctr_str, str_size, NULL, NULL); | 181 | ctr_str, str_size, NULL, NULL); |
| 178 | 182 | ||
| 179 | if (r == -ESRCH) { | 183 | if (r == -ESRCH) { |
| @@ -183,7 +187,7 @@ static int userspace_ctr(struct dm_dirty_log *log, struct dm_target *ti, | |||
| 183 | 187 | ||
| 184 | /* Since the region size does not change, get it now */ | 188 | /* Since the region size does not change, get it now */ |
| 185 | rdata_size = sizeof(rdata); | 189 | rdata_size = sizeof(rdata); |
| 186 | r = dm_consult_userspace(lc->uuid, DM_ULOG_GET_REGION_SIZE, | 190 | r = dm_consult_userspace(lc->uuid, lc->luid, DM_ULOG_GET_REGION_SIZE, |
| 187 | NULL, 0, (char *)&rdata, &rdata_size); | 191 | NULL, 0, (char *)&rdata, &rdata_size); |
| 188 | 192 | ||
| 189 | if (r) { | 193 | if (r) { |
| @@ -212,7 +216,7 @@ static void userspace_dtr(struct dm_dirty_log *log) | |||
| 212 | int r; | 216 | int r; |
| 213 | struct log_c *lc = log->context; | 217 | struct log_c *lc = log->context; |
| 214 | 218 | ||
| 215 | r = dm_consult_userspace(lc->uuid, DM_ULOG_DTR, | 219 | r = dm_consult_userspace(lc->uuid, lc->luid, DM_ULOG_DTR, |
| 216 | NULL, 0, | 220 | NULL, 0, |
| 217 | NULL, NULL); | 221 | NULL, NULL); |
| 218 | 222 | ||
| @@ -227,7 +231,7 @@ static int userspace_presuspend(struct dm_dirty_log *log) | |||
| 227 | int r; | 231 | int r; |
| 228 | struct log_c *lc = log->context; | 232 | struct log_c *lc = log->context; |
| 229 | 233 | ||
| 230 | r = dm_consult_userspace(lc->uuid, DM_ULOG_PRESUSPEND, | 234 | r = dm_consult_userspace(lc->uuid, lc->luid, DM_ULOG_PRESUSPEND, |
| 231 | NULL, 0, | 235 | NULL, 0, |
| 232 | NULL, NULL); | 236 | NULL, NULL); |
| 233 | 237 | ||
| @@ -239,7 +243,7 @@ static int userspace_postsuspend(struct dm_dirty_log *log) | |||
| 239 | int r; | 243 | int r; |
| 240 | struct log_c *lc = log->context; | 244 | struct log_c *lc = log->context; |
| 241 | 245 | ||
| 242 | r = dm_consult_userspace(lc->uuid, DM_ULOG_POSTSUSPEND, | 246 | r = dm_consult_userspace(lc->uuid, lc->luid, DM_ULOG_POSTSUSPEND, |
| 243 | NULL, 0, | 247 | NULL, 0, |
| 244 | NULL, NULL); | 248 | NULL, NULL); |
| 245 | 249 | ||
| @@ -252,7 +256,7 @@ static int userspace_resume(struct dm_dirty_log *log) | |||
| 252 | struct log_c *lc = log->context; | 256 | struct log_c *lc = log->context; |
| 253 | 257 | ||
| 254 | lc->in_sync_hint = 0; | 258 | lc->in_sync_hint = 0; |
| 255 | r = dm_consult_userspace(lc->uuid, DM_ULOG_RESUME, | 259 | r = dm_consult_userspace(lc->uuid, lc->luid, DM_ULOG_RESUME, |
| 256 | NULL, 0, | 260 | NULL, 0, |
| 257 | NULL, NULL); | 261 | NULL, NULL); |
| 258 | 262 | ||
| @@ -561,6 +565,7 @@ static int userspace_status(struct dm_dirty_log *log, status_type_t status_type, | |||
| 561 | char *result, unsigned maxlen) | 565 | char *result, unsigned maxlen) |
| 562 | { | 566 | { |
| 563 | int r = 0; | 567 | int r = 0; |
| 568 | char *table_args; | ||
| 564 | size_t sz = (size_t)maxlen; | 569 | size_t sz = (size_t)maxlen; |
| 565 | struct log_c *lc = log->context; | 570 | struct log_c *lc = log->context; |
| 566 | 571 | ||
| @@ -577,8 +582,12 @@ static int userspace_status(struct dm_dirty_log *log, status_type_t status_type, | |||
| 577 | break; | 582 | break; |
| 578 | case STATUSTYPE_TABLE: | 583 | case STATUSTYPE_TABLE: |
| 579 | sz = 0; | 584 | sz = 0; |
| 580 | DMEMIT("%s %u %s %s", log->type->name, lc->usr_argc + 1, | 585 | table_args = strstr(lc->usr_argv_str, " "); |
| 581 | lc->uuid, lc->usr_argv_str); | 586 | BUG_ON(!table_args); /* There will always be a ' ' */ |
| 587 | table_args++; | ||
| 588 | |||
| 589 | DMEMIT("%s %u %s %s ", log->type->name, lc->usr_argc, | ||
| 590 | lc->uuid, table_args); | ||
| 582 | break; | 591 | break; |
| 583 | } | 592 | } |
| 584 | return (r) ? 0 : (int)sz; | 593 | return (r) ? 0 : (int)sz; |
diff --git a/drivers/md/dm-log-userspace-transfer.c b/drivers/md/dm-log-userspace-transfer.c index 8ce74d95ae4d..ba0edad2d048 100644 --- a/drivers/md/dm-log-userspace-transfer.c +++ b/drivers/md/dm-log-userspace-transfer.c | |||
| @@ -147,7 +147,8 @@ static void cn_ulog_callback(void *data) | |||
| 147 | 147 | ||
| 148 | /** | 148 | /** |
| 149 | * dm_consult_userspace | 149 | * dm_consult_userspace |
| 150 | * @uuid: log's uuid (must be DM_UUID_LEN in size) | 150 | * @uuid: log's universal unique identifier (must be DM_UUID_LEN in size) |
| 151 | * @luid: log's local unique identifier | ||
| 151 | * @request_type: found in include/linux/dm-log-userspace.h | 152 | * @request_type: found in include/linux/dm-log-userspace.h |
| 152 | * @data: data to tx to the server | 153 | * @data: data to tx to the server |
| 153 | * @data_size: size of data in bytes | 154 | * @data_size: size of data in bytes |
| @@ -163,7 +164,7 @@ static void cn_ulog_callback(void *data) | |||
| 163 | * | 164 | * |
| 164 | * Returns: 0 on success, -EXXX on failure | 165 | * Returns: 0 on success, -EXXX on failure |
| 165 | **/ | 166 | **/ |
| 166 | int dm_consult_userspace(const char *uuid, int request_type, | 167 | int dm_consult_userspace(const char *uuid, uint64_t luid, int request_type, |
| 167 | char *data, size_t data_size, | 168 | char *data, size_t data_size, |
| 168 | char *rdata, size_t *rdata_size) | 169 | char *rdata, size_t *rdata_size) |
| 169 | { | 170 | { |
| @@ -190,6 +191,7 @@ resend: | |||
| 190 | 191 | ||
| 191 | memset(tfr, 0, DM_ULOG_PREALLOCED_SIZE - overhead_size); | 192 | memset(tfr, 0, DM_ULOG_PREALLOCED_SIZE - overhead_size); |
| 192 | memcpy(tfr->uuid, uuid, DM_UUID_LEN); | 193 | memcpy(tfr->uuid, uuid, DM_UUID_LEN); |
| 194 | tfr->luid = luid; | ||
| 193 | tfr->seq = dm_ulog_seq++; | 195 | tfr->seq = dm_ulog_seq++; |
| 194 | 196 | ||
| 195 | /* | 197 | /* |
diff --git a/drivers/md/dm-log-userspace-transfer.h b/drivers/md/dm-log-userspace-transfer.h index c26d8e4e2710..04ee874f9153 100644 --- a/drivers/md/dm-log-userspace-transfer.h +++ b/drivers/md/dm-log-userspace-transfer.h | |||
| @@ -11,7 +11,7 @@ | |||
| 11 | 11 | ||
| 12 | int dm_ulog_tfr_init(void); | 12 | int dm_ulog_tfr_init(void); |
| 13 | void dm_ulog_tfr_exit(void); | 13 | void dm_ulog_tfr_exit(void); |
| 14 | int dm_consult_userspace(const char *uuid, int request_type, | 14 | int dm_consult_userspace(const char *uuid, uint64_t luid, int request_type, |
| 15 | char *data, size_t data_size, | 15 | char *data, size_t data_size, |
| 16 | char *rdata, size_t *rdata_size); | 16 | char *rdata, size_t *rdata_size); |
| 17 | 17 | ||
diff --git a/drivers/md/dm-raid1.c b/drivers/md/dm-raid1.c index 9726577cde49..33f179e66bf5 100644 --- a/drivers/md/dm-raid1.c +++ b/drivers/md/dm-raid1.c | |||
| @@ -648,7 +648,13 @@ static void do_writes(struct mirror_set *ms, struct bio_list *writes) | |||
| 648 | */ | 648 | */ |
| 649 | dm_rh_inc_pending(ms->rh, &sync); | 649 | dm_rh_inc_pending(ms->rh, &sync); |
| 650 | dm_rh_inc_pending(ms->rh, &nosync); | 650 | dm_rh_inc_pending(ms->rh, &nosync); |
| 651 | ms->log_failure = dm_rh_flush(ms->rh) ? 1 : 0; | 651 | |
| 652 | /* | ||
| 653 | * If the flush fails on a previous call and succeeds here, | ||
| 654 | * we must not reset the log_failure variable. We need | ||
| 655 | * userspace interaction to do that. | ||
| 656 | */ | ||
| 657 | ms->log_failure = dm_rh_flush(ms->rh) ? 1 : ms->log_failure; | ||
| 652 | 658 | ||
| 653 | /* | 659 | /* |
| 654 | * Dispatch io. | 660 | * Dispatch io. |
diff --git a/drivers/md/dm-snap-persistent.c b/drivers/md/dm-snap-persistent.c index 6e3fe4f14934..d5b2e08750d5 100644 --- a/drivers/md/dm-snap-persistent.c +++ b/drivers/md/dm-snap-persistent.c | |||
| @@ -106,6 +106,13 @@ struct pstore { | |||
| 106 | void *zero_area; | 106 | void *zero_area; |
| 107 | 107 | ||
| 108 | /* | 108 | /* |
| 109 | * An area used for header. The header can be written | ||
| 110 | * concurrently with metadata (when invalidating the snapshot), | ||
| 111 | * so it needs a separate buffer. | ||
| 112 | */ | ||
| 113 | void *header_area; | ||
| 114 | |||
| 115 | /* | ||
| 109 | * Used to keep track of which metadata area the data in | 116 | * Used to keep track of which metadata area the data in |
| 110 | * 'chunk' refers to. | 117 | * 'chunk' refers to. |
| 111 | */ | 118 | */ |
| @@ -148,16 +155,27 @@ static int alloc_area(struct pstore *ps) | |||
| 148 | */ | 155 | */ |
| 149 | ps->area = vmalloc(len); | 156 | ps->area = vmalloc(len); |
| 150 | if (!ps->area) | 157 | if (!ps->area) |
| 151 | return r; | 158 | goto err_area; |
| 152 | 159 | ||
| 153 | ps->zero_area = vmalloc(len); | 160 | ps->zero_area = vmalloc(len); |
| 154 | if (!ps->zero_area) { | 161 | if (!ps->zero_area) |
| 155 | vfree(ps->area); | 162 | goto err_zero_area; |
| 156 | return r; | ||
| 157 | } | ||
| 158 | memset(ps->zero_area, 0, len); | 163 | memset(ps->zero_area, 0, len); |
| 159 | 164 | ||
| 165 | ps->header_area = vmalloc(len); | ||
| 166 | if (!ps->header_area) | ||
| 167 | goto err_header_area; | ||
| 168 | |||
| 160 | return 0; | 169 | return 0; |
| 170 | |||
| 171 | err_header_area: | ||
| 172 | vfree(ps->zero_area); | ||
| 173 | |||
| 174 | err_zero_area: | ||
| 175 | vfree(ps->area); | ||
| 176 | |||
| 177 | err_area: | ||
| 178 | return r; | ||
| 161 | } | 179 | } |
| 162 | 180 | ||
| 163 | static void free_area(struct pstore *ps) | 181 | static void free_area(struct pstore *ps) |
| @@ -169,6 +187,10 @@ static void free_area(struct pstore *ps) | |||
| 169 | if (ps->zero_area) | 187 | if (ps->zero_area) |
| 170 | vfree(ps->zero_area); | 188 | vfree(ps->zero_area); |
| 171 | ps->zero_area = NULL; | 189 | ps->zero_area = NULL; |
| 190 | |||
| 191 | if (ps->header_area) | ||
| 192 | vfree(ps->header_area); | ||
| 193 | ps->header_area = NULL; | ||
| 172 | } | 194 | } |
| 173 | 195 | ||
| 174 | struct mdata_req { | 196 | struct mdata_req { |
| @@ -188,7 +210,8 @@ static void do_metadata(struct work_struct *work) | |||
| 188 | /* | 210 | /* |
| 189 | * Read or write a chunk aligned and sized block of data from a device. | 211 | * Read or write a chunk aligned and sized block of data from a device. |
| 190 | */ | 212 | */ |
| 191 | static int chunk_io(struct pstore *ps, chunk_t chunk, int rw, int metadata) | 213 | static int chunk_io(struct pstore *ps, void *area, chunk_t chunk, int rw, |
| 214 | int metadata) | ||
| 192 | { | 215 | { |
| 193 | struct dm_io_region where = { | 216 | struct dm_io_region where = { |
| 194 | .bdev = ps->store->cow->bdev, | 217 | .bdev = ps->store->cow->bdev, |
| @@ -198,7 +221,7 @@ static int chunk_io(struct pstore *ps, chunk_t chunk, int rw, int metadata) | |||
| 198 | struct dm_io_request io_req = { | 221 | struct dm_io_request io_req = { |
| 199 | .bi_rw = rw, | 222 | .bi_rw = rw, |
| 200 | .mem.type = DM_IO_VMA, | 223 | .mem.type = DM_IO_VMA, |
| 201 | .mem.ptr.vma = ps->area, | 224 | .mem.ptr.vma = area, |
| 202 | .client = ps->io_client, | 225 | .client = ps->io_client, |
| 203 | .notify.fn = NULL, | 226 | .notify.fn = NULL, |
| 204 | }; | 227 | }; |
| @@ -240,7 +263,7 @@ static int area_io(struct pstore *ps, int rw) | |||
| 240 | 263 | ||
| 241 | chunk = area_location(ps, ps->current_area); | 264 | chunk = area_location(ps, ps->current_area); |
| 242 | 265 | ||
| 243 | r = chunk_io(ps, chunk, rw, 0); | 266 | r = chunk_io(ps, ps->area, chunk, rw, 0); |
| 244 | if (r) | 267 | if (r) |
| 245 | return r; | 268 | return r; |
| 246 | 269 | ||
| @@ -254,20 +277,7 @@ static void zero_memory_area(struct pstore *ps) | |||
| 254 | 277 | ||
| 255 | static int zero_disk_area(struct pstore *ps, chunk_t area) | 278 | static int zero_disk_area(struct pstore *ps, chunk_t area) |
| 256 | { | 279 | { |
| 257 | struct dm_io_region where = { | 280 | return chunk_io(ps, ps->zero_area, area_location(ps, area), WRITE, 0); |
| 258 | .bdev = ps->store->cow->bdev, | ||
| 259 | .sector = ps->store->chunk_size * area_location(ps, area), | ||
| 260 | .count = ps->store->chunk_size, | ||
| 261 | }; | ||
| 262 | struct dm_io_request io_req = { | ||
| 263 | .bi_rw = WRITE, | ||
| 264 | .mem.type = DM_IO_VMA, | ||
| 265 | .mem.ptr.vma = ps->zero_area, | ||
| 266 | .client = ps->io_client, | ||
| 267 | .notify.fn = NULL, | ||
| 268 | }; | ||
| 269 | |||
| 270 | return dm_io(&io_req, 1, &where, NULL); | ||
| 271 | } | 281 | } |
| 272 | 282 | ||
| 273 | static int read_header(struct pstore *ps, int *new_snapshot) | 283 | static int read_header(struct pstore *ps, int *new_snapshot) |
| @@ -276,6 +286,7 @@ static int read_header(struct pstore *ps, int *new_snapshot) | |||
| 276 | struct disk_header *dh; | 286 | struct disk_header *dh; |
| 277 | chunk_t chunk_size; | 287 | chunk_t chunk_size; |
| 278 | int chunk_size_supplied = 1; | 288 | int chunk_size_supplied = 1; |
| 289 | char *chunk_err; | ||
| 279 | 290 | ||
| 280 | /* | 291 | /* |
| 281 | * Use default chunk size (or hardsect_size, if larger) if none supplied | 292 | * Use default chunk size (or hardsect_size, if larger) if none supplied |
| @@ -297,11 +308,11 @@ static int read_header(struct pstore *ps, int *new_snapshot) | |||
| 297 | if (r) | 308 | if (r) |
| 298 | return r; | 309 | return r; |
| 299 | 310 | ||
| 300 | r = chunk_io(ps, 0, READ, 1); | 311 | r = chunk_io(ps, ps->header_area, 0, READ, 1); |
| 301 | if (r) | 312 | if (r) |
| 302 | goto bad; | 313 | goto bad; |
| 303 | 314 | ||
| 304 | dh = (struct disk_header *) ps->area; | 315 | dh = ps->header_area; |
| 305 | 316 | ||
| 306 | if (le32_to_cpu(dh->magic) == 0) { | 317 | if (le32_to_cpu(dh->magic) == 0) { |
| 307 | *new_snapshot = 1; | 318 | *new_snapshot = 1; |
| @@ -319,20 +330,25 @@ static int read_header(struct pstore *ps, int *new_snapshot) | |||
| 319 | ps->version = le32_to_cpu(dh->version); | 330 | ps->version = le32_to_cpu(dh->version); |
| 320 | chunk_size = le32_to_cpu(dh->chunk_size); | 331 | chunk_size = le32_to_cpu(dh->chunk_size); |
| 321 | 332 | ||
| 322 | if (!chunk_size_supplied || ps->store->chunk_size == chunk_size) | 333 | if (ps->store->chunk_size == chunk_size) |
| 323 | return 0; | 334 | return 0; |
| 324 | 335 | ||
| 325 | DMWARN("chunk size %llu in device metadata overrides " | 336 | if (chunk_size_supplied) |
| 326 | "table chunk size of %llu.", | 337 | DMWARN("chunk size %llu in device metadata overrides " |
| 327 | (unsigned long long)chunk_size, | 338 | "table chunk size of %llu.", |
| 328 | (unsigned long long)ps->store->chunk_size); | 339 | (unsigned long long)chunk_size, |
| 340 | (unsigned long long)ps->store->chunk_size); | ||
| 329 | 341 | ||
| 330 | /* We had a bogus chunk_size. Fix stuff up. */ | 342 | /* We had a bogus chunk_size. Fix stuff up. */ |
| 331 | free_area(ps); | 343 | free_area(ps); |
| 332 | 344 | ||
| 333 | ps->store->chunk_size = chunk_size; | 345 | r = dm_exception_store_set_chunk_size(ps->store, chunk_size, |
| 334 | ps->store->chunk_mask = chunk_size - 1; | 346 | &chunk_err); |
| 335 | ps->store->chunk_shift = ffs(chunk_size) - 1; | 347 | if (r) { |
| 348 | DMERR("invalid on-disk chunk size %llu: %s.", | ||
| 349 | (unsigned long long)chunk_size, chunk_err); | ||
| 350 | return r; | ||
| 351 | } | ||
| 336 | 352 | ||
| 337 | r = dm_io_client_resize(sectors_to_pages(ps->store->chunk_size), | 353 | r = dm_io_client_resize(sectors_to_pages(ps->store->chunk_size), |
| 338 | ps->io_client); | 354 | ps->io_client); |
| @@ -351,15 +367,15 @@ static int write_header(struct pstore *ps) | |||
| 351 | { | 367 | { |
| 352 | struct disk_header *dh; | 368 | struct disk_header *dh; |
| 353 | 369 | ||
| 354 | memset(ps->area, 0, ps->store->chunk_size << SECTOR_SHIFT); | 370 | memset(ps->header_area, 0, ps->store->chunk_size << SECTOR_SHIFT); |
| 355 | 371 | ||
| 356 | dh = (struct disk_header *) ps->area; | 372 | dh = ps->header_area; |
| 357 | dh->magic = cpu_to_le32(SNAP_MAGIC); | 373 | dh->magic = cpu_to_le32(SNAP_MAGIC); |
| 358 | dh->valid = cpu_to_le32(ps->valid); | 374 | dh->valid = cpu_to_le32(ps->valid); |
| 359 | dh->version = cpu_to_le32(ps->version); | 375 | dh->version = cpu_to_le32(ps->version); |
| 360 | dh->chunk_size = cpu_to_le32(ps->store->chunk_size); | 376 | dh->chunk_size = cpu_to_le32(ps->store->chunk_size); |
| 361 | 377 | ||
| 362 | return chunk_io(ps, 0, WRITE, 1); | 378 | return chunk_io(ps, ps->header_area, 0, WRITE, 1); |
| 363 | } | 379 | } |
| 364 | 380 | ||
| 365 | /* | 381 | /* |
| @@ -679,6 +695,8 @@ static int persistent_ctr(struct dm_exception_store *store, | |||
| 679 | ps->valid = 1; | 695 | ps->valid = 1; |
| 680 | ps->version = SNAPSHOT_DISK_VERSION; | 696 | ps->version = SNAPSHOT_DISK_VERSION; |
| 681 | ps->area = NULL; | 697 | ps->area = NULL; |
| 698 | ps->zero_area = NULL; | ||
| 699 | ps->header_area = NULL; | ||
| 682 | ps->next_free = 2; /* skipping the header and first area */ | 700 | ps->next_free = 2; /* skipping the header and first area */ |
| 683 | ps->current_committed = 0; | 701 | ps->current_committed = 0; |
| 684 | 702 | ||
diff --git a/drivers/md/dm-snap.c b/drivers/md/dm-snap.c index d573165cd2b7..57f1bf7f3b7a 100644 --- a/drivers/md/dm-snap.c +++ b/drivers/md/dm-snap.c | |||
| @@ -1176,6 +1176,15 @@ static int snapshot_status(struct dm_target *ti, status_type_t type, | |||
| 1176 | return 0; | 1176 | return 0; |
| 1177 | } | 1177 | } |
| 1178 | 1178 | ||
| 1179 | static int snapshot_iterate_devices(struct dm_target *ti, | ||
| 1180 | iterate_devices_callout_fn fn, void *data) | ||
| 1181 | { | ||
| 1182 | struct dm_snapshot *snap = ti->private; | ||
| 1183 | |||
| 1184 | return fn(ti, snap->origin, 0, ti->len, data); | ||
| 1185 | } | ||
| 1186 | |||
| 1187 | |||
| 1179 | /*----------------------------------------------------------------- | 1188 | /*----------------------------------------------------------------- |
| 1180 | * Origin methods | 1189 | * Origin methods |
| 1181 | *---------------------------------------------------------------*/ | 1190 | *---------------------------------------------------------------*/ |
| @@ -1410,20 +1419,29 @@ static int origin_status(struct dm_target *ti, status_type_t type, char *result, | |||
| 1410 | return 0; | 1419 | return 0; |
| 1411 | } | 1420 | } |
| 1412 | 1421 | ||
| 1422 | static int origin_iterate_devices(struct dm_target *ti, | ||
| 1423 | iterate_devices_callout_fn fn, void *data) | ||
| 1424 | { | ||
| 1425 | struct dm_dev *dev = ti->private; | ||
| 1426 | |||
| 1427 | return fn(ti, dev, 0, ti->len, data); | ||
| 1428 | } | ||
| 1429 | |||
| 1413 | static struct target_type origin_target = { | 1430 | static struct target_type origin_target = { |
| 1414 | .name = "snapshot-origin", | 1431 | .name = "snapshot-origin", |
| 1415 | .version = {1, 6, 0}, | 1432 | .version = {1, 7, 0}, |
| 1416 | .module = THIS_MODULE, | 1433 | .module = THIS_MODULE, |
| 1417 | .ctr = origin_ctr, | 1434 | .ctr = origin_ctr, |
| 1418 | .dtr = origin_dtr, | 1435 | .dtr = origin_dtr, |
| 1419 | .map = origin_map, | 1436 | .map = origin_map, |
| 1420 | .resume = origin_resume, | 1437 | .resume = origin_resume, |
| 1421 | .status = origin_status, | 1438 | .status = origin_status, |
| 1439 | .iterate_devices = origin_iterate_devices, | ||
| 1422 | }; | 1440 | }; |
| 1423 | 1441 | ||
| 1424 | static struct target_type snapshot_target = { | 1442 | static struct target_type snapshot_target = { |
| 1425 | .name = "snapshot", | 1443 | .name = "snapshot", |
| 1426 | .version = {1, 6, 0}, | 1444 | .version = {1, 7, 0}, |
| 1427 | .module = THIS_MODULE, | 1445 | .module = THIS_MODULE, |
| 1428 | .ctr = snapshot_ctr, | 1446 | .ctr = snapshot_ctr, |
| 1429 | .dtr = snapshot_dtr, | 1447 | .dtr = snapshot_dtr, |
| @@ -1431,6 +1449,7 @@ static struct target_type snapshot_target = { | |||
| 1431 | .end_io = snapshot_end_io, | 1449 | .end_io = snapshot_end_io, |
| 1432 | .resume = snapshot_resume, | 1450 | .resume = snapshot_resume, |
| 1433 | .status = snapshot_status, | 1451 | .status = snapshot_status, |
| 1452 | .iterate_devices = snapshot_iterate_devices, | ||
| 1434 | }; | 1453 | }; |
| 1435 | 1454 | ||
| 1436 | static int __init dm_snapshot_init(void) | 1455 | static int __init dm_snapshot_init(void) |
diff --git a/drivers/md/dm-stripe.c b/drivers/md/dm-stripe.c index 4e0e5937e42a..3e563d251733 100644 --- a/drivers/md/dm-stripe.c +++ b/drivers/md/dm-stripe.c | |||
| @@ -329,9 +329,19 @@ static int stripe_iterate_devices(struct dm_target *ti, | |||
| 329 | return ret; | 329 | return ret; |
| 330 | } | 330 | } |
| 331 | 331 | ||
| 332 | static void stripe_io_hints(struct dm_target *ti, | ||
| 333 | struct queue_limits *limits) | ||
| 334 | { | ||
| 335 | struct stripe_c *sc = ti->private; | ||
| 336 | unsigned chunk_size = (sc->chunk_mask + 1) << 9; | ||
| 337 | |||
| 338 | blk_limits_io_min(limits, chunk_size); | ||
| 339 | limits->io_opt = chunk_size * sc->stripes; | ||
| 340 | } | ||
| 341 | |||
| 332 | static struct target_type stripe_target = { | 342 | static struct target_type stripe_target = { |
| 333 | .name = "striped", | 343 | .name = "striped", |
| 334 | .version = {1, 2, 0}, | 344 | .version = {1, 3, 0}, |
| 335 | .module = THIS_MODULE, | 345 | .module = THIS_MODULE, |
| 336 | .ctr = stripe_ctr, | 346 | .ctr = stripe_ctr, |
| 337 | .dtr = stripe_dtr, | 347 | .dtr = stripe_dtr, |
| @@ -339,6 +349,7 @@ static struct target_type stripe_target = { | |||
| 339 | .end_io = stripe_end_io, | 349 | .end_io = stripe_end_io, |
| 340 | .status = stripe_status, | 350 | .status = stripe_status, |
| 341 | .iterate_devices = stripe_iterate_devices, | 351 | .iterate_devices = stripe_iterate_devices, |
| 352 | .io_hints = stripe_io_hints, | ||
| 342 | }; | 353 | }; |
| 343 | 354 | ||
| 344 | int __init dm_stripe_init(void) | 355 | int __init dm_stripe_init(void) |
diff --git a/drivers/md/dm-table.c b/drivers/md/dm-table.c index d952b3441913..1a6cb3c7822e 100644 --- a/drivers/md/dm-table.c +++ b/drivers/md/dm-table.c | |||
| @@ -343,10 +343,10 @@ static void close_dev(struct dm_dev_internal *d, struct mapped_device *md) | |||
| 343 | } | 343 | } |
| 344 | 344 | ||
| 345 | /* | 345 | /* |
| 346 | * If possible, this checks an area of a destination device is valid. | 346 | * If possible, this checks an area of a destination device is invalid. |
| 347 | */ | 347 | */ |
| 348 | static int device_area_is_valid(struct dm_target *ti, struct dm_dev *dev, | 348 | static int device_area_is_invalid(struct dm_target *ti, struct dm_dev *dev, |
| 349 | sector_t start, sector_t len, void *data) | 349 | sector_t start, sector_t len, void *data) |
| 350 | { | 350 | { |
| 351 | struct queue_limits *limits = data; | 351 | struct queue_limits *limits = data; |
| 352 | struct block_device *bdev = dev->bdev; | 352 | struct block_device *bdev = dev->bdev; |
| @@ -357,36 +357,40 @@ static int device_area_is_valid(struct dm_target *ti, struct dm_dev *dev, | |||
| 357 | char b[BDEVNAME_SIZE]; | 357 | char b[BDEVNAME_SIZE]; |
| 358 | 358 | ||
| 359 | if (!dev_size) | 359 | if (!dev_size) |
| 360 | return 1; | 360 | return 0; |
| 361 | 361 | ||
| 362 | if ((start >= dev_size) || (start + len > dev_size)) { | 362 | if ((start >= dev_size) || (start + len > dev_size)) { |
| 363 | DMWARN("%s: %s too small for target", | 363 | DMWARN("%s: %s too small for target: " |
| 364 | dm_device_name(ti->table->md), bdevname(bdev, b)); | 364 | "start=%llu, len=%llu, dev_size=%llu", |
| 365 | return 0; | 365 | dm_device_name(ti->table->md), bdevname(bdev, b), |
| 366 | (unsigned long long)start, | ||
| 367 | (unsigned long long)len, | ||
| 368 | (unsigned long long)dev_size); | ||
| 369 | return 1; | ||
| 366 | } | 370 | } |
| 367 | 371 | ||
| 368 | if (logical_block_size_sectors <= 1) | 372 | if (logical_block_size_sectors <= 1) |
| 369 | return 1; | 373 | return 0; |
| 370 | 374 | ||
| 371 | if (start & (logical_block_size_sectors - 1)) { | 375 | if (start & (logical_block_size_sectors - 1)) { |
| 372 | DMWARN("%s: start=%llu not aligned to h/w " | 376 | DMWARN("%s: start=%llu not aligned to h/w " |
| 373 | "logical block size %hu of %s", | 377 | "logical block size %u of %s", |
| 374 | dm_device_name(ti->table->md), | 378 | dm_device_name(ti->table->md), |
| 375 | (unsigned long long)start, | 379 | (unsigned long long)start, |
| 376 | limits->logical_block_size, bdevname(bdev, b)); | 380 | limits->logical_block_size, bdevname(bdev, b)); |
| 377 | return 0; | 381 | return 1; |
| 378 | } | 382 | } |
| 379 | 383 | ||
| 380 | if (len & (logical_block_size_sectors - 1)) { | 384 | if (len & (logical_block_size_sectors - 1)) { |
| 381 | DMWARN("%s: len=%llu not aligned to h/w " | 385 | DMWARN("%s: len=%llu not aligned to h/w " |
| 382 | "logical block size %hu of %s", | 386 | "logical block size %u of %s", |
| 383 | dm_device_name(ti->table->md), | 387 | dm_device_name(ti->table->md), |
| 384 | (unsigned long long)len, | 388 | (unsigned long long)len, |
| 385 | limits->logical_block_size, bdevname(bdev, b)); | 389 | limits->logical_block_size, bdevname(bdev, b)); |
| 386 | return 0; | 390 | return 1; |
| 387 | } | 391 | } |
| 388 | 392 | ||
| 389 | return 1; | 393 | return 0; |
| 390 | } | 394 | } |
| 391 | 395 | ||
| 392 | /* | 396 | /* |
| @@ -496,8 +500,15 @@ int dm_set_device_limits(struct dm_target *ti, struct dm_dev *dev, | |||
| 496 | } | 500 | } |
| 497 | 501 | ||
| 498 | if (blk_stack_limits(limits, &q->limits, start << 9) < 0) | 502 | if (blk_stack_limits(limits, &q->limits, start << 9) < 0) |
| 499 | DMWARN("%s: target device %s is misaligned", | 503 | DMWARN("%s: target device %s is misaligned: " |
| 500 | dm_device_name(ti->table->md), bdevname(bdev, b)); | 504 | "physical_block_size=%u, logical_block_size=%u, " |
| 505 | "alignment_offset=%u, start=%llu", | ||
| 506 | dm_device_name(ti->table->md), bdevname(bdev, b), | ||
| 507 | q->limits.physical_block_size, | ||
| 508 | q->limits.logical_block_size, | ||
| 509 | q->limits.alignment_offset, | ||
| 510 | (unsigned long long) start << 9); | ||
| 511 | |||
| 501 | 512 | ||
| 502 | /* | 513 | /* |
| 503 | * Check if merge fn is supported. | 514 | * Check if merge fn is supported. |
| @@ -698,7 +709,7 @@ static int validate_hardware_logical_block_alignment(struct dm_table *table, | |||
| 698 | 709 | ||
| 699 | if (remaining) { | 710 | if (remaining) { |
| 700 | DMWARN("%s: table line %u (start sect %llu len %llu) " | 711 | DMWARN("%s: table line %u (start sect %llu len %llu) " |
| 701 | "not aligned to h/w logical block size %hu", | 712 | "not aligned to h/w logical block size %u", |
| 702 | dm_device_name(table->md), i, | 713 | dm_device_name(table->md), i, |
| 703 | (unsigned long long) ti->begin, | 714 | (unsigned long long) ti->begin, |
| 704 | (unsigned long long) ti->len, | 715 | (unsigned long long) ti->len, |
| @@ -996,12 +1007,16 @@ int dm_calculate_queue_limits(struct dm_table *table, | |||
| 996 | ti->type->iterate_devices(ti, dm_set_device_limits, | 1007 | ti->type->iterate_devices(ti, dm_set_device_limits, |
| 997 | &ti_limits); | 1008 | &ti_limits); |
| 998 | 1009 | ||
| 1010 | /* Set I/O hints portion of queue limits */ | ||
| 1011 | if (ti->type->io_hints) | ||
| 1012 | ti->type->io_hints(ti, &ti_limits); | ||
| 1013 | |||
| 999 | /* | 1014 | /* |
| 1000 | * Check each device area is consistent with the target's | 1015 | * Check each device area is consistent with the target's |
| 1001 | * overall queue limits. | 1016 | * overall queue limits. |
| 1002 | */ | 1017 | */ |
| 1003 | if (!ti->type->iterate_devices(ti, device_area_is_valid, | 1018 | if (ti->type->iterate_devices(ti, device_area_is_invalid, |
| 1004 | &ti_limits)) | 1019 | &ti_limits)) |
| 1005 | return -EINVAL; | 1020 | return -EINVAL; |
| 1006 | 1021 | ||
| 1007 | combine_limits: | 1022 | combine_limits: |
diff --git a/drivers/md/dm.c b/drivers/md/dm.c index 8a311ea0d441..b4845b14740d 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c | |||
| @@ -738,16 +738,22 @@ static void rq_completed(struct mapped_device *md, int run_queue) | |||
| 738 | dm_put(md); | 738 | dm_put(md); |
| 739 | } | 739 | } |
| 740 | 740 | ||
| 741 | static void free_rq_clone(struct request *clone) | ||
| 742 | { | ||
| 743 | struct dm_rq_target_io *tio = clone->end_io_data; | ||
| 744 | |||
| 745 | blk_rq_unprep_clone(clone); | ||
| 746 | free_rq_tio(tio); | ||
| 747 | } | ||
| 748 | |||
| 741 | static void dm_unprep_request(struct request *rq) | 749 | static void dm_unprep_request(struct request *rq) |
| 742 | { | 750 | { |
| 743 | struct request *clone = rq->special; | 751 | struct request *clone = rq->special; |
| 744 | struct dm_rq_target_io *tio = clone->end_io_data; | ||
| 745 | 752 | ||
| 746 | rq->special = NULL; | 753 | rq->special = NULL; |
| 747 | rq->cmd_flags &= ~REQ_DONTPREP; | 754 | rq->cmd_flags &= ~REQ_DONTPREP; |
| 748 | 755 | ||
| 749 | blk_rq_unprep_clone(clone); | 756 | free_rq_clone(clone); |
| 750 | free_rq_tio(tio); | ||
| 751 | } | 757 | } |
| 752 | 758 | ||
| 753 | /* | 759 | /* |
| @@ -825,8 +831,7 @@ static void dm_end_request(struct request *clone, int error) | |||
| 825 | rq->sense_len = clone->sense_len; | 831 | rq->sense_len = clone->sense_len; |
| 826 | } | 832 | } |
| 827 | 833 | ||
| 828 | BUG_ON(clone->bio); | 834 | free_rq_clone(clone); |
| 829 | free_rq_tio(tio); | ||
| 830 | 835 | ||
| 831 | blk_end_request_all(rq, error); | 836 | blk_end_request_all(rq, error); |
| 832 | 837 | ||
diff --git a/drivers/media/dvb/siano/Kconfig b/drivers/media/dvb/siano/Kconfig index 88847d1dcbb5..8c1aed77ea30 100644 --- a/drivers/media/dvb/siano/Kconfig +++ b/drivers/media/dvb/siano/Kconfig | |||
| @@ -2,25 +2,33 @@ | |||
| 2 | # Siano Mobile Silicon Digital TV device configuration | 2 | # Siano Mobile Silicon Digital TV device configuration |
| 3 | # | 3 | # |
| 4 | 4 | ||
| 5 | config DVB_SIANO_SMS1XXX | 5 | config SMS_SIANO_MDTV |
| 6 | tristate "Siano SMS1XXX USB dongle support" | 6 | tristate "Siano SMS1xxx based MDTV receiver" |
| 7 | depends on DVB_CORE && USB && INPUT | 7 | depends on DVB_CORE && INPUT |
| 8 | ---help--- | 8 | ---help--- |
| 9 | Choose Y here if you have a USB dongle with a SMS1XXX chipset. | 9 | Choose Y or M here if you have MDTV receiver with a Siano chipset. |
| 10 | 10 | ||
| 11 | To compile this driver as a module, choose M here: the | 11 | To compile this driver as a module, choose M here |
| 12 | module will be called sms1xxx. | 12 | (The module will be called smsmdtv). |
| 13 | 13 | ||
| 14 | config DVB_SIANO_SMS1XXX_SMS_IDS | 14 | Further documentation on this driver can be found on the WWW |
| 15 | bool "Enable support for Siano Mobile Silicon default USB IDs" | 15 | at http://www.siano-ms.com/ |
| 16 | depends on DVB_SIANO_SMS1XXX | 16 | |
| 17 | default y | 17 | if SMS_SIANO_MDTV |
| 18 | ---help--- | 18 | menu "Siano module components" |
| 19 | Choose Y here if you have a USB dongle with a SMS1XXX chipset | ||
| 20 | that uses Siano Mobile Silicon's default usb vid:pid. | ||
| 21 | 19 | ||
| 22 | Choose N here if you would prefer to use Siano's external driver. | 20 | # Hardware interfaces support |
| 23 | 21 | ||
| 24 | Further documentation on this driver can be found on the WWW at | 22 | config SMS_USB_DRV |
| 25 | <http://www.siano-ms.com/>. | 23 | tristate "USB interface support" |
| 24 | depends on DVB_CORE && USB | ||
| 25 | ---help--- | ||
| 26 | Choose if you would like to have Siano's support for USB interface | ||
| 26 | 27 | ||
| 28 | config SMS_SDIO_DRV | ||
| 29 | tristate "SDIO interface support" | ||
| 30 | depends on DVB_CORE && MMC | ||
| 31 | ---help--- | ||
| 32 | Choose if you would like to have Siano's support for SDIO interface | ||
| 33 | endmenu | ||
| 34 | endif # SMS_SIANO_MDTV | ||
diff --git a/drivers/media/dvb/siano/Makefile b/drivers/media/dvb/siano/Makefile index c6644d909433..c54140b5ab5a 100644 --- a/drivers/media/dvb/siano/Makefile +++ b/drivers/media/dvb/siano/Makefile | |||
| @@ -1,8 +1,9 @@ | |||
| 1 | sms1xxx-objs := smscoreapi.o sms-cards.o smsendian.o smsir.o | ||
| 2 | 1 | ||
| 3 | obj-$(CONFIG_DVB_SIANO_SMS1XXX) += sms1xxx.o | 2 | smsmdtv-objs := smscoreapi.o sms-cards.o smsendian.o smsir.o |
| 4 | obj-$(CONFIG_DVB_SIANO_SMS1XXX) += smsusb.o | 3 | |
| 5 | obj-$(CONFIG_DVB_SIANO_SMS1XXX) += smsdvb.o | 4 | obj-$(CONFIG_SMS_SIANO_MDTV) += smsmdtv.o smsdvb.o |
| 5 | obj-$(CONFIG_SMS_USB_DRV) += smsusb.o | ||
| 6 | obj-$(CONFIG_SMS_SDIO_DRV) += smssdio.o | ||
| 6 | 7 | ||
| 7 | EXTRA_CFLAGS += -Idrivers/media/dvb/dvb-core | 8 | EXTRA_CFLAGS += -Idrivers/media/dvb/dvb-core |
| 8 | 9 | ||
diff --git a/drivers/media/dvb/siano/smsdvb.c b/drivers/media/dvb/siano/smsdvb.c index 3ee1c3902c56..266033ae2784 100644 --- a/drivers/media/dvb/siano/smsdvb.c +++ b/drivers/media/dvb/siano/smsdvb.c | |||
| @@ -325,6 +325,16 @@ static int smsdvb_sendrequest_and_wait(struct smsdvb_client_t *client, | |||
| 325 | 0 : -ETIME; | 325 | 0 : -ETIME; |
| 326 | } | 326 | } |
| 327 | 327 | ||
| 328 | static inline int led_feedback(struct smsdvb_client_t *client) | ||
| 329 | { | ||
| 330 | if (client->fe_status & FE_HAS_LOCK) | ||
| 331 | return sms_board_led_feedback(client->coredev, | ||
| 332 | (client->sms_stat_dvb.ReceptionData.BER | ||
| 333 | == 0) ? SMS_LED_HI : SMS_LED_LO); | ||
| 334 | else | ||
| 335 | return sms_board_led_feedback(client->coredev, SMS_LED_OFF); | ||
| 336 | } | ||
| 337 | |||
| 328 | static int smsdvb_read_status(struct dvb_frontend *fe, fe_status_t *stat) | 338 | static int smsdvb_read_status(struct dvb_frontend *fe, fe_status_t *stat) |
| 329 | { | 339 | { |
| 330 | struct smsdvb_client_t *client; | 340 | struct smsdvb_client_t *client; |
| @@ -332,6 +342,8 @@ static int smsdvb_read_status(struct dvb_frontend *fe, fe_status_t *stat) | |||
| 332 | 342 | ||
| 333 | *stat = client->fe_status; | 343 | *stat = client->fe_status; |
| 334 | 344 | ||
| 345 | led_feedback(client); | ||
| 346 | |||
| 335 | return 0; | 347 | return 0; |
| 336 | } | 348 | } |
| 337 | 349 | ||
| @@ -342,6 +354,8 @@ static int smsdvb_read_ber(struct dvb_frontend *fe, u32 *ber) | |||
| 342 | 354 | ||
| 343 | *ber = client->sms_stat_dvb.ReceptionData.BER; | 355 | *ber = client->sms_stat_dvb.ReceptionData.BER; |
| 344 | 356 | ||
| 357 | led_feedback(client); | ||
| 358 | |||
| 345 | return 0; | 359 | return 0; |
| 346 | } | 360 | } |
| 347 | 361 | ||
| @@ -359,6 +373,8 @@ static int smsdvb_read_signal_strength(struct dvb_frontend *fe, u16 *strength) | |||
| 359 | (client->sms_stat_dvb.ReceptionData.InBandPwr | 373 | (client->sms_stat_dvb.ReceptionData.InBandPwr |
| 360 | + 95) * 3 / 2; | 374 | + 95) * 3 / 2; |
| 361 | 375 | ||
| 376 | led_feedback(client); | ||
| 377 | |||
| 362 | return 0; | 378 | return 0; |
| 363 | } | 379 | } |
| 364 | 380 | ||
| @@ -369,6 +385,8 @@ static int smsdvb_read_snr(struct dvb_frontend *fe, u16 *snr) | |||
| 369 | 385 | ||
| 370 | *snr = client->sms_stat_dvb.ReceptionData.SNR; | 386 | *snr = client->sms_stat_dvb.ReceptionData.SNR; |
| 371 | 387 | ||
| 388 | led_feedback(client); | ||
| 389 | |||
| 372 | return 0; | 390 | return 0; |
| 373 | } | 391 | } |
| 374 | 392 | ||
| @@ -379,6 +397,8 @@ static int smsdvb_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks) | |||
| 379 | 397 | ||
| 380 | *ucblocks = client->sms_stat_dvb.ReceptionData.ErrorTSPackets; | 398 | *ucblocks = client->sms_stat_dvb.ReceptionData.ErrorTSPackets; |
| 381 | 399 | ||
| 400 | led_feedback(client); | ||
| 401 | |||
| 382 | return 0; | 402 | return 0; |
| 383 | } | 403 | } |
| 384 | 404 | ||
| @@ -404,6 +424,8 @@ static int smsdvb_set_frontend(struct dvb_frontend *fe, | |||
| 404 | u32 Data[3]; | 424 | u32 Data[3]; |
| 405 | } Msg; | 425 | } Msg; |
| 406 | 426 | ||
| 427 | int ret; | ||
| 428 | |||
| 407 | client->fe_status = FE_HAS_SIGNAL; | 429 | client->fe_status = FE_HAS_SIGNAL; |
| 408 | client->event_fe_state = -1; | 430 | client->event_fe_state = -1; |
| 409 | client->event_unc_state = -1; | 431 | client->event_unc_state = -1; |
| @@ -426,6 +448,23 @@ static int smsdvb_set_frontend(struct dvb_frontend *fe, | |||
| 426 | case BANDWIDTH_AUTO: return -EOPNOTSUPP; | 448 | case BANDWIDTH_AUTO: return -EOPNOTSUPP; |
| 427 | default: return -EINVAL; | 449 | default: return -EINVAL; |
| 428 | } | 450 | } |
| 451 | /* Disable LNA, if any. An error is returned if no LNA is present */ | ||
| 452 | ret = sms_board_lna_control(client->coredev, 0); | ||
| 453 | if (ret == 0) { | ||
| 454 | fe_status_t status; | ||
| 455 | |||
| 456 | /* tune with LNA off at first */ | ||
| 457 | ret = smsdvb_sendrequest_and_wait(client, &Msg, sizeof(Msg), | ||
| 458 | &client->tune_done); | ||
| 459 | |||
| 460 | smsdvb_read_status(fe, &status); | ||
| 461 | |||
| 462 | if (status & FE_HAS_LOCK) | ||
| 463 | return ret; | ||
| 464 | |||
| 465 | /* previous tune didnt lock - enable LNA and tune again */ | ||
| 466 | sms_board_lna_control(client->coredev, 1); | ||
| 467 | } | ||
| 429 | 468 | ||
| 430 | return smsdvb_sendrequest_and_wait(client, &Msg, sizeof(Msg), | 469 | return smsdvb_sendrequest_and_wait(client, &Msg, sizeof(Msg), |
| 431 | &client->tune_done); | 470 | &client->tune_done); |
| @@ -451,6 +490,8 @@ static int smsdvb_init(struct dvb_frontend *fe) | |||
| 451 | struct smsdvb_client_t *client = | 490 | struct smsdvb_client_t *client = |
| 452 | container_of(fe, struct smsdvb_client_t, frontend); | 491 | container_of(fe, struct smsdvb_client_t, frontend); |
| 453 | 492 | ||
| 493 | sms_board_power(client->coredev, 1); | ||
| 494 | |||
| 454 | sms_board_dvb3_event(client, DVB3_EVENT_INIT); | 495 | sms_board_dvb3_event(client, DVB3_EVENT_INIT); |
| 455 | return 0; | 496 | return 0; |
| 456 | } | 497 | } |
| @@ -460,6 +501,9 @@ static int smsdvb_sleep(struct dvb_frontend *fe) | |||
| 460 | struct smsdvb_client_t *client = | 501 | struct smsdvb_client_t *client = |
| 461 | container_of(fe, struct smsdvb_client_t, frontend); | 502 | container_of(fe, struct smsdvb_client_t, frontend); |
| 462 | 503 | ||
| 504 | sms_board_led_feedback(client->coredev, SMS_LED_OFF); | ||
| 505 | sms_board_power(client->coredev, 0); | ||
| 506 | |||
| 463 | sms_board_dvb3_event(client, DVB3_EVENT_SLEEP); | 507 | sms_board_dvb3_event(client, DVB3_EVENT_SLEEP); |
| 464 | 508 | ||
| 465 | return 0; | 509 | return 0; |
diff --git a/drivers/media/dvb/siano/smssdio.c b/drivers/media/dvb/siano/smssdio.c index dfaa49a53f32..d1d652e7f890 100644 --- a/drivers/media/dvb/siano/smssdio.c +++ b/drivers/media/dvb/siano/smssdio.c | |||
| @@ -46,6 +46,7 @@ | |||
| 46 | 46 | ||
| 47 | #define SMSSDIO_DATA 0x00 | 47 | #define SMSSDIO_DATA 0x00 |
| 48 | #define SMSSDIO_INT 0x04 | 48 | #define SMSSDIO_INT 0x04 |
| 49 | #define SMSSDIO_BLOCK_SIZE 128 | ||
| 49 | 50 | ||
| 50 | static const struct sdio_device_id smssdio_ids[] = { | 51 | static const struct sdio_device_id smssdio_ids[] = { |
| 51 | {SDIO_DEVICE(SDIO_VENDOR_ID_SIANO, SDIO_DEVICE_ID_SIANO_STELLAR), | 52 | {SDIO_DEVICE(SDIO_VENDOR_ID_SIANO, SDIO_DEVICE_ID_SIANO_STELLAR), |
| @@ -85,7 +86,8 @@ static int smssdio_sendrequest(void *context, void *buffer, size_t size) | |||
| 85 | sdio_claim_host(smsdev->func); | 86 | sdio_claim_host(smsdev->func); |
| 86 | 87 | ||
| 87 | while (size >= smsdev->func->cur_blksize) { | 88 | while (size >= smsdev->func->cur_blksize) { |
| 88 | ret = sdio_write_blocks(smsdev->func, SMSSDIO_DATA, buffer, 1); | 89 | ret = sdio_memcpy_toio(smsdev->func, SMSSDIO_DATA, |
| 90 | buffer, smsdev->func->cur_blksize); | ||
| 89 | if (ret) | 91 | if (ret) |
| 90 | goto out; | 92 | goto out; |
| 91 | 93 | ||
| @@ -94,8 +96,8 @@ static int smssdio_sendrequest(void *context, void *buffer, size_t size) | |||
| 94 | } | 96 | } |
| 95 | 97 | ||
| 96 | if (size) { | 98 | if (size) { |
| 97 | ret = sdio_write_bytes(smsdev->func, SMSSDIO_DATA, | 99 | ret = sdio_memcpy_toio(smsdev->func, SMSSDIO_DATA, |
| 98 | buffer, size); | 100 | buffer, size); |
| 99 | } | 101 | } |
| 100 | 102 | ||
| 101 | out: | 103 | out: |
| @@ -125,23 +127,23 @@ static void smssdio_interrupt(struct sdio_func *func) | |||
| 125 | */ | 127 | */ |
| 126 | isr = sdio_readb(func, SMSSDIO_INT, &ret); | 128 | isr = sdio_readb(func, SMSSDIO_INT, &ret); |
| 127 | if (ret) { | 129 | if (ret) { |
| 128 | dev_err(&smsdev->func->dev, | 130 | sms_err("Unable to read interrupt register!\n"); |
| 129 | "Unable to read interrupt register!\n"); | ||
| 130 | return; | 131 | return; |
| 131 | } | 132 | } |
| 132 | 133 | ||
| 133 | if (smsdev->split_cb == NULL) { | 134 | if (smsdev->split_cb == NULL) { |
| 134 | cb = smscore_getbuffer(smsdev->coredev); | 135 | cb = smscore_getbuffer(smsdev->coredev); |
| 135 | if (!cb) { | 136 | if (!cb) { |
| 136 | dev_err(&smsdev->func->dev, | 137 | sms_err("Unable to allocate data buffer!\n"); |
| 137 | "Unable to allocate data buffer!\n"); | ||
| 138 | return; | 138 | return; |
| 139 | } | 139 | } |
| 140 | 140 | ||
| 141 | ret = sdio_read_blocks(smsdev->func, cb->p, SMSSDIO_DATA, 1); | 141 | ret = sdio_memcpy_fromio(smsdev->func, |
| 142 | cb->p, | ||
| 143 | SMSSDIO_DATA, | ||
| 144 | SMSSDIO_BLOCK_SIZE); | ||
| 142 | if (ret) { | 145 | if (ret) { |
| 143 | dev_err(&smsdev->func->dev, | 146 | sms_err("Error %d reading initial block!\n", ret); |
| 144 | "Error %d reading initial block!\n", ret); | ||
| 145 | return; | 147 | return; |
| 146 | } | 148 | } |
| 147 | 149 | ||
| @@ -152,7 +154,10 @@ static void smssdio_interrupt(struct sdio_func *func) | |||
| 152 | return; | 154 | return; |
| 153 | } | 155 | } |
| 154 | 156 | ||
| 155 | size = hdr->msgLength - smsdev->func->cur_blksize; | 157 | if (hdr->msgLength > smsdev->func->cur_blksize) |
| 158 | size = hdr->msgLength - smsdev->func->cur_blksize; | ||
| 159 | else | ||
| 160 | size = 0; | ||
| 156 | } else { | 161 | } else { |
| 157 | cb = smsdev->split_cb; | 162 | cb = smsdev->split_cb; |
| 158 | hdr = cb->p; | 163 | hdr = cb->p; |
| @@ -162,23 +167,24 @@ static void smssdio_interrupt(struct sdio_func *func) | |||
| 162 | smsdev->split_cb = NULL; | 167 | smsdev->split_cb = NULL; |
| 163 | } | 168 | } |
| 164 | 169 | ||
| 165 | if (hdr->msgLength > smsdev->func->cur_blksize) { | 170 | if (size) { |
| 166 | void *buffer; | 171 | void *buffer; |
| 167 | 172 | ||
| 168 | size = ALIGN(size, 128); | 173 | buffer = cb->p + (hdr->msgLength - size); |
| 169 | buffer = cb->p + hdr->msgLength; | 174 | size = ALIGN(size, SMSSDIO_BLOCK_SIZE); |
| 170 | 175 | ||
| 171 | BUG_ON(smsdev->func->cur_blksize != 128); | 176 | BUG_ON(smsdev->func->cur_blksize != SMSSDIO_BLOCK_SIZE); |
| 172 | 177 | ||
| 173 | /* | 178 | /* |
| 174 | * First attempt to transfer all of it in one go... | 179 | * First attempt to transfer all of it in one go... |
| 175 | */ | 180 | */ |
| 176 | ret = sdio_read_blocks(smsdev->func, buffer, | 181 | ret = sdio_memcpy_fromio(smsdev->func, |
| 177 | SMSSDIO_DATA, size / 128); | 182 | buffer, |
| 183 | SMSSDIO_DATA, | ||
| 184 | size); | ||
| 178 | if (ret && ret != -EINVAL) { | 185 | if (ret && ret != -EINVAL) { |
| 179 | smscore_putbuffer(smsdev->coredev, cb); | 186 | smscore_putbuffer(smsdev->coredev, cb); |
| 180 | dev_err(&smsdev->func->dev, | 187 | sms_err("Error %d reading data from card!\n", ret); |
| 181 | "Error %d reading data from card!\n", ret); | ||
| 182 | return; | 188 | return; |
| 183 | } | 189 | } |
| 184 | 190 | ||
| @@ -191,12 +197,12 @@ static void smssdio_interrupt(struct sdio_func *func) | |||
| 191 | */ | 197 | */ |
| 192 | if (ret == -EINVAL) { | 198 | if (ret == -EINVAL) { |
| 193 | while (size) { | 199 | while (size) { |
| 194 | ret = sdio_read_blocks(smsdev->func, | 200 | ret = sdio_memcpy_fromio(smsdev->func, |
| 195 | buffer, SMSSDIO_DATA, 1); | 201 | buffer, SMSSDIO_DATA, |
| 202 | smsdev->func->cur_blksize); | ||
| 196 | if (ret) { | 203 | if (ret) { |
| 197 | smscore_putbuffer(smsdev->coredev, cb); | 204 | smscore_putbuffer(smsdev->coredev, cb); |
| 198 | dev_err(&smsdev->func->dev, | 205 | sms_err("Error %d reading " |
| 199 | "Error %d reading " | ||
| 200 | "data from card!\n", ret); | 206 | "data from card!\n", ret); |
| 201 | return; | 207 | return; |
| 202 | } | 208 | } |
| @@ -269,7 +275,7 @@ static int smssdio_probe(struct sdio_func *func, | |||
| 269 | if (ret) | 275 | if (ret) |
| 270 | goto release; | 276 | goto release; |
| 271 | 277 | ||
| 272 | ret = sdio_set_block_size(func, 128); | 278 | ret = sdio_set_block_size(func, SMSSDIO_BLOCK_SIZE); |
| 273 | if (ret) | 279 | if (ret) |
| 274 | goto disable; | 280 | goto disable; |
| 275 | 281 | ||
diff --git a/drivers/media/video/em28xx/em28xx-cards.c b/drivers/media/video/em28xx/em28xx-cards.c index ed281f565945..1c2e544eda73 100644 --- a/drivers/media/video/em28xx/em28xx-cards.c +++ b/drivers/media/video/em28xx/em28xx-cards.c | |||
| @@ -1730,6 +1730,25 @@ static inline void em28xx_set_model(struct em28xx *dev) | |||
| 1730 | EM28XX_I2C_FREQ_100_KHZ; | 1730 | EM28XX_I2C_FREQ_100_KHZ; |
| 1731 | } | 1731 | } |
| 1732 | 1732 | ||
| 1733 | |||
| 1734 | /* FIXME: Should be replaced by a proper mt9m111 driver */ | ||
| 1735 | static int em28xx_initialize_mt9m111(struct em28xx *dev) | ||
| 1736 | { | ||
| 1737 | int i; | ||
| 1738 | unsigned char regs[][3] = { | ||
| 1739 | { 0x0d, 0x00, 0x01, }, /* reset and use defaults */ | ||
| 1740 | { 0x0d, 0x00, 0x00, }, | ||
| 1741 | { 0x0a, 0x00, 0x21, }, | ||
| 1742 | { 0x21, 0x04, 0x00, }, /* full readout speed, no row/col skipping */ | ||
| 1743 | }; | ||
| 1744 | |||
| 1745 | for (i = 0; i < ARRAY_SIZE(regs); i++) | ||
| 1746 | i2c_master_send(&dev->i2c_client, ®s[i][0], 3); | ||
| 1747 | |||
| 1748 | return 0; | ||
| 1749 | } | ||
| 1750 | |||
| 1751 | |||
| 1733 | /* FIXME: Should be replaced by a proper mt9m001 driver */ | 1752 | /* FIXME: Should be replaced by a proper mt9m001 driver */ |
| 1734 | static int em28xx_initialize_mt9m001(struct em28xx *dev) | 1753 | static int em28xx_initialize_mt9m001(struct em28xx *dev) |
| 1735 | { | 1754 | { |
| @@ -1758,7 +1777,7 @@ static int em28xx_initialize_mt9m001(struct em28xx *dev) | |||
| 1758 | 1777 | ||
| 1759 | /* HINT method: webcam I2C chips | 1778 | /* HINT method: webcam I2C chips |
| 1760 | * | 1779 | * |
| 1761 | * This method work for webcams with Micron sensors | 1780 | * This method works for webcams with Micron sensors |
| 1762 | */ | 1781 | */ |
| 1763 | static int em28xx_hint_sensor(struct em28xx *dev) | 1782 | static int em28xx_hint_sensor(struct em28xx *dev) |
| 1764 | { | 1783 | { |
| @@ -1804,6 +1823,23 @@ static int em28xx_hint_sensor(struct em28xx *dev) | |||
| 1804 | dev->vinctl = 0x00; | 1823 | dev->vinctl = 0x00; |
| 1805 | 1824 | ||
| 1806 | break; | 1825 | break; |
| 1826 | |||
| 1827 | case 0x143a: /* MT9M111 as found in the ECS G200 */ | ||
| 1828 | dev->model = EM2750_BOARD_UNKNOWN; | ||
| 1829 | em28xx_set_model(dev); | ||
| 1830 | |||
| 1831 | sensor_name = "mt9m111"; | ||
| 1832 | dev->board.xclk = EM28XX_XCLK_FREQUENCY_48MHZ; | ||
| 1833 | dev->em28xx_sensor = EM28XX_MT9M111; | ||
| 1834 | em28xx_initialize_mt9m111(dev); | ||
| 1835 | dev->sensor_xres = 640; | ||
| 1836 | dev->sensor_yres = 512; | ||
| 1837 | |||
| 1838 | dev->vinmode = 0x0a; | ||
| 1839 | dev->vinctl = 0x00; | ||
| 1840 | |||
| 1841 | break; | ||
| 1842 | |||
| 1807 | case 0x8431: | 1843 | case 0x8431: |
| 1808 | dev->model = EM2750_BOARD_UNKNOWN; | 1844 | dev->model = EM2750_BOARD_UNKNOWN; |
| 1809 | em28xx_set_model(dev); | 1845 | em28xx_set_model(dev); |
| @@ -1820,7 +1856,7 @@ static int em28xx_hint_sensor(struct em28xx *dev) | |||
| 1820 | 1856 | ||
| 1821 | break; | 1857 | break; |
| 1822 | default: | 1858 | default: |
| 1823 | printk("Unknown Micron Sensor 0x%04x\n", be16_to_cpu(version)); | 1859 | printk("Unknown Micron Sensor 0x%04x\n", version); |
| 1824 | return -EINVAL; | 1860 | return -EINVAL; |
| 1825 | } | 1861 | } |
| 1826 | 1862 | ||
| @@ -2346,7 +2382,9 @@ void em28xx_card_setup(struct em28xx *dev) | |||
| 2346 | } | 2382 | } |
| 2347 | 2383 | ||
| 2348 | em28xx_tuner_setup(dev); | 2384 | em28xx_tuner_setup(dev); |
| 2349 | em28xx_ir_init(dev); | 2385 | |
| 2386 | if(!disable_ir) | ||
| 2387 | em28xx_ir_init(dev); | ||
| 2350 | } | 2388 | } |
| 2351 | 2389 | ||
| 2352 | 2390 | ||
diff --git a/drivers/media/video/em28xx/em28xx.h b/drivers/media/video/em28xx/em28xx.h index 8c2dc38bca9f..a2add61f7d59 100644 --- a/drivers/media/video/em28xx/em28xx.h +++ b/drivers/media/video/em28xx/em28xx.h | |||
| @@ -367,6 +367,7 @@ enum em28xx_sensor { | |||
| 367 | EM28XX_NOSENSOR = 0, | 367 | EM28XX_NOSENSOR = 0, |
| 368 | EM28XX_MT9V011, | 368 | EM28XX_MT9V011, |
| 369 | EM28XX_MT9M001, | 369 | EM28XX_MT9M001, |
| 370 | EM28XX_MT9M111, | ||
| 370 | }; | 371 | }; |
| 371 | 372 | ||
| 372 | enum em28xx_adecoder { | 373 | enum em28xx_adecoder { |
diff --git a/drivers/media/video/gspca/Kconfig b/drivers/media/video/gspca/Kconfig index 34f46f2bc040..e994dcac43ff 100644 --- a/drivers/media/video/gspca/Kconfig +++ b/drivers/media/video/gspca/Kconfig | |||
| @@ -114,7 +114,7 @@ config USB_GSPCA_SN9C20X | |||
| 114 | 114 | ||
| 115 | config USB_GSPCA_SN9C20X_EVDEV | 115 | config USB_GSPCA_SN9C20X_EVDEV |
| 116 | bool "Enable evdev support" | 116 | bool "Enable evdev support" |
| 117 | depends on USB_GSPCA_SN9C20X | 117 | depends on USB_GSPCA_SN9C20X && INPUT |
| 118 | ---help--- | 118 | ---help--- |
| 119 | Say Y here in order to enable evdev support for sn9c20x webcam button. | 119 | Say Y here in order to enable evdev support for sn9c20x webcam button. |
| 120 | 120 | ||
diff --git a/drivers/media/video/zr364xx.c b/drivers/media/video/zr364xx.c index fc976f42f432..2622a6e63da1 100644 --- a/drivers/media/video/zr364xx.c +++ b/drivers/media/video/zr364xx.c | |||
| @@ -695,7 +695,7 @@ static int zr364xx_release(struct file *file) | |||
| 695 | for (i = 0; i < 2; i++) { | 695 | for (i = 0; i < 2; i++) { |
| 696 | err = | 696 | err = |
| 697 | send_control_msg(udev, 1, init[cam->method][i].value, | 697 | send_control_msg(udev, 1, init[cam->method][i].value, |
| 698 | 0, init[i][cam->method].bytes, | 698 | 0, init[cam->method][i].bytes, |
| 699 | init[cam->method][i].size); | 699 | init[cam->method][i].size); |
| 700 | if (err < 0) { | 700 | if (err < 0) { |
| 701 | dev_err(&udev->dev, "error during release sequence\n"); | 701 | dev_err(&udev->dev, "error during release sequence\n"); |
diff --git a/drivers/mtd/devices/m25p80.c b/drivers/mtd/devices/m25p80.c index ae5fe91867e1..10ed195c0c1c 100644 --- a/drivers/mtd/devices/m25p80.c +++ b/drivers/mtd/devices/m25p80.c | |||
| @@ -736,7 +736,7 @@ static int __devinit m25p_probe(struct spi_device *spi) | |||
| 736 | flash->partitioned = 1; | 736 | flash->partitioned = 1; |
| 737 | return add_mtd_partitions(&flash->mtd, parts, nr_parts); | 737 | return add_mtd_partitions(&flash->mtd, parts, nr_parts); |
| 738 | } | 738 | } |
| 739 | } else if (data->nr_parts) | 739 | } else if (data && data->nr_parts) |
| 740 | dev_warn(&spi->dev, "ignoring %d default partitions on %s\n", | 740 | dev_warn(&spi->dev, "ignoring %d default partitions on %s\n", |
| 741 | data->nr_parts, data->name); | 741 | data->nr_parts, data->name); |
| 742 | 742 | ||
diff --git a/drivers/mtd/nand/orion_nand.c b/drivers/mtd/nand/orion_nand.c index 7ad972229db4..0d9d4bc9c762 100644 --- a/drivers/mtd/nand/orion_nand.c +++ b/drivers/mtd/nand/orion_nand.c | |||
| @@ -61,7 +61,7 @@ static void orion_nand_read_buf(struct mtd_info *mtd, uint8_t *buf, int len) | |||
| 61 | buf64 = (uint64_t *)buf; | 61 | buf64 = (uint64_t *)buf; |
| 62 | while (i < len/8) { | 62 | while (i < len/8) { |
| 63 | uint64_t x; | 63 | uint64_t x; |
| 64 | asm ("ldrd\t%0, [%1]" : "=r" (x) : "r" (io_base)); | 64 | asm volatile ("ldrd\t%0, [%1]" : "=&r" (x) : "r" (io_base)); |
| 65 | buf64[i++] = x; | 65 | buf64[i++] = x; |
| 66 | } | 66 | } |
| 67 | i *= 8; | 67 | i *= 8; |
diff --git a/drivers/mtd/nftlcore.c b/drivers/mtd/nftlcore.c index fb86cacd5bdb..1002e1882996 100644 --- a/drivers/mtd/nftlcore.c +++ b/drivers/mtd/nftlcore.c | |||
| @@ -135,16 +135,17 @@ static void nftl_remove_dev(struct mtd_blktrans_dev *dev) | |||
| 135 | int nftl_read_oob(struct mtd_info *mtd, loff_t offs, size_t len, | 135 | int nftl_read_oob(struct mtd_info *mtd, loff_t offs, size_t len, |
| 136 | size_t *retlen, uint8_t *buf) | 136 | size_t *retlen, uint8_t *buf) |
| 137 | { | 137 | { |
| 138 | loff_t mask = mtd->writesize - 1; | ||
| 138 | struct mtd_oob_ops ops; | 139 | struct mtd_oob_ops ops; |
| 139 | int res; | 140 | int res; |
| 140 | 141 | ||
| 141 | ops.mode = MTD_OOB_PLACE; | 142 | ops.mode = MTD_OOB_PLACE; |
| 142 | ops.ooboffs = offs & (mtd->writesize - 1); | 143 | ops.ooboffs = offs & mask; |
| 143 | ops.ooblen = len; | 144 | ops.ooblen = len; |
| 144 | ops.oobbuf = buf; | 145 | ops.oobbuf = buf; |
| 145 | ops.datbuf = NULL; | 146 | ops.datbuf = NULL; |
| 146 | 147 | ||
| 147 | res = mtd->read_oob(mtd, offs & ~(mtd->writesize - 1), &ops); | 148 | res = mtd->read_oob(mtd, offs & ~mask, &ops); |
| 148 | *retlen = ops.oobretlen; | 149 | *retlen = ops.oobretlen; |
| 149 | return res; | 150 | return res; |
| 150 | } | 151 | } |
| @@ -155,16 +156,17 @@ int nftl_read_oob(struct mtd_info *mtd, loff_t offs, size_t len, | |||
| 155 | int nftl_write_oob(struct mtd_info *mtd, loff_t offs, size_t len, | 156 | int nftl_write_oob(struct mtd_info *mtd, loff_t offs, size_t len, |
| 156 | size_t *retlen, uint8_t *buf) | 157 | size_t *retlen, uint8_t *buf) |
| 157 | { | 158 | { |
| 159 | loff_t mask = mtd->writesize - 1; | ||
| 158 | struct mtd_oob_ops ops; | 160 | struct mtd_oob_ops ops; |
| 159 | int res; | 161 | int res; |
| 160 | 162 | ||
| 161 | ops.mode = MTD_OOB_PLACE; | 163 | ops.mode = MTD_OOB_PLACE; |
| 162 | ops.ooboffs = offs & (mtd->writesize - 1); | 164 | ops.ooboffs = offs & mask; |
| 163 | ops.ooblen = len; | 165 | ops.ooblen = len; |
| 164 | ops.oobbuf = buf; | 166 | ops.oobbuf = buf; |
| 165 | ops.datbuf = NULL; | 167 | ops.datbuf = NULL; |
| 166 | 168 | ||
| 167 | res = mtd->write_oob(mtd, offs & ~(mtd->writesize - 1), &ops); | 169 | res = mtd->write_oob(mtd, offs & ~mask, &ops); |
| 168 | *retlen = ops.oobretlen; | 170 | *retlen = ops.oobretlen; |
| 169 | return res; | 171 | return res; |
| 170 | } | 172 | } |
| @@ -177,17 +179,18 @@ int nftl_write_oob(struct mtd_info *mtd, loff_t offs, size_t len, | |||
| 177 | static int nftl_write(struct mtd_info *mtd, loff_t offs, size_t len, | 179 | static int nftl_write(struct mtd_info *mtd, loff_t offs, size_t len, |
| 178 | size_t *retlen, uint8_t *buf, uint8_t *oob) | 180 | size_t *retlen, uint8_t *buf, uint8_t *oob) |
| 179 | { | 181 | { |
| 182 | loff_t mask = mtd->writesize - 1; | ||
| 180 | struct mtd_oob_ops ops; | 183 | struct mtd_oob_ops ops; |
| 181 | int res; | 184 | int res; |
| 182 | 185 | ||
| 183 | ops.mode = MTD_OOB_PLACE; | 186 | ops.mode = MTD_OOB_PLACE; |
| 184 | ops.ooboffs = offs; | 187 | ops.ooboffs = offs & mask; |
| 185 | ops.ooblen = mtd->oobsize; | 188 | ops.ooblen = mtd->oobsize; |
| 186 | ops.oobbuf = oob; | 189 | ops.oobbuf = oob; |
| 187 | ops.datbuf = buf; | 190 | ops.datbuf = buf; |
| 188 | ops.len = len; | 191 | ops.len = len; |
| 189 | 192 | ||
| 190 | res = mtd->write_oob(mtd, offs & ~(mtd->writesize - 1), &ops); | 193 | res = mtd->write_oob(mtd, offs & ~mask, &ops); |
| 191 | *retlen = ops.retlen; | 194 | *retlen = ops.retlen; |
| 192 | return res; | 195 | return res; |
| 193 | } | 196 | } |
diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig index 5f6509a5f640..5ce7cbabd7a7 100644 --- a/drivers/net/Kconfig +++ b/drivers/net/Kconfig | |||
| @@ -1727,12 +1727,14 @@ config KS8842 | |||
| 1727 | tristate "Micrel KSZ8842" | 1727 | tristate "Micrel KSZ8842" |
| 1728 | depends on HAS_IOMEM | 1728 | depends on HAS_IOMEM |
| 1729 | help | 1729 | help |
| 1730 | This platform driver is for Micrel KSZ8842 chip. | 1730 | This platform driver is for Micrel KSZ8842 / KS8842 |
| 1731 | 2-port ethernet switch chip (managed, VLAN, QoS). | ||
| 1731 | 1732 | ||
| 1732 | config KS8851 | 1733 | config KS8851 |
| 1733 | tristate "Micrel KS8851 SPI" | 1734 | tristate "Micrel KS8851 SPI" |
| 1734 | depends on SPI | 1735 | depends on SPI |
| 1735 | select MII | 1736 | select MII |
| 1737 | select CRC32 | ||
| 1736 | help | 1738 | help |
| 1737 | SPI driver for Micrel KS8851 SPI attached network chip. | 1739 | SPI driver for Micrel KS8851 SPI attached network chip. |
| 1738 | 1740 | ||
diff --git a/drivers/net/arm/w90p910_ether.c b/drivers/net/arm/w90p910_ether.c index 616fb7985a34..ddd231cb54b7 100644 --- a/drivers/net/arm/w90p910_ether.c +++ b/drivers/net/arm/w90p910_ether.c | |||
| @@ -1080,7 +1080,7 @@ static struct platform_driver w90p910_ether_driver = { | |||
| 1080 | .probe = w90p910_ether_probe, | 1080 | .probe = w90p910_ether_probe, |
| 1081 | .remove = __devexit_p(w90p910_ether_remove), | 1081 | .remove = __devexit_p(w90p910_ether_remove), |
| 1082 | .driver = { | 1082 | .driver = { |
| 1083 | .name = "w90p910-emc", | 1083 | .name = "nuc900-emc", |
| 1084 | .owner = THIS_MODULE, | 1084 | .owner = THIS_MODULE, |
| 1085 | }, | 1085 | }, |
| 1086 | }; | 1086 | }; |
| @@ -1101,5 +1101,5 @@ module_exit(w90p910_ether_exit); | |||
| 1101 | MODULE_AUTHOR("Wan ZongShun <mcuos.com@gmail.com>"); | 1101 | MODULE_AUTHOR("Wan ZongShun <mcuos.com@gmail.com>"); |
| 1102 | MODULE_DESCRIPTION("w90p910 MAC driver!"); | 1102 | MODULE_DESCRIPTION("w90p910 MAC driver!"); |
| 1103 | MODULE_LICENSE("GPL"); | 1103 | MODULE_LICENSE("GPL"); |
| 1104 | MODULE_ALIAS("platform:w90p910-emc"); | 1104 | MODULE_ALIAS("platform:nuc900-emc"); |
| 1105 | 1105 | ||
diff --git a/drivers/net/e100.c b/drivers/net/e100.c index 41b648a67fec..3a6735dc9f6a 100644 --- a/drivers/net/e100.c +++ b/drivers/net/e100.c | |||
| @@ -1899,7 +1899,7 @@ static int e100_rx_indicate(struct nic *nic, struct rx *rx, | |||
| 1899 | nic->ru_running = RU_SUSPENDED; | 1899 | nic->ru_running = RU_SUSPENDED; |
| 1900 | pci_dma_sync_single_for_device(nic->pdev, rx->dma_addr, | 1900 | pci_dma_sync_single_for_device(nic->pdev, rx->dma_addr, |
| 1901 | sizeof(struct rfd), | 1901 | sizeof(struct rfd), |
| 1902 | PCI_DMA_BIDIRECTIONAL); | 1902 | PCI_DMA_FROMDEVICE); |
| 1903 | return -ENODATA; | 1903 | return -ENODATA; |
| 1904 | } | 1904 | } |
| 1905 | 1905 | ||
diff --git a/drivers/net/fec_mpc52xx.c b/drivers/net/fec_mpc52xx.c index cc786333d95c..c40113f58963 100644 --- a/drivers/net/fec_mpc52xx.c +++ b/drivers/net/fec_mpc52xx.c | |||
| @@ -309,6 +309,7 @@ static int mpc52xx_fec_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 309 | { | 309 | { |
| 310 | struct mpc52xx_fec_priv *priv = netdev_priv(dev); | 310 | struct mpc52xx_fec_priv *priv = netdev_priv(dev); |
| 311 | struct bcom_fec_bd *bd; | 311 | struct bcom_fec_bd *bd; |
| 312 | unsigned long flags; | ||
| 312 | 313 | ||
| 313 | if (bcom_queue_full(priv->tx_dmatsk)) { | 314 | if (bcom_queue_full(priv->tx_dmatsk)) { |
| 314 | if (net_ratelimit()) | 315 | if (net_ratelimit()) |
| @@ -316,7 +317,7 @@ static int mpc52xx_fec_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 316 | return NETDEV_TX_BUSY; | 317 | return NETDEV_TX_BUSY; |
| 317 | } | 318 | } |
| 318 | 319 | ||
| 319 | spin_lock_irq(&priv->lock); | 320 | spin_lock_irqsave(&priv->lock, flags); |
| 320 | dev->trans_start = jiffies; | 321 | dev->trans_start = jiffies; |
| 321 | 322 | ||
| 322 | bd = (struct bcom_fec_bd *) | 323 | bd = (struct bcom_fec_bd *) |
| @@ -332,7 +333,7 @@ static int mpc52xx_fec_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 332 | netif_stop_queue(dev); | 333 | netif_stop_queue(dev); |
| 333 | } | 334 | } |
| 334 | 335 | ||
| 335 | spin_unlock_irq(&priv->lock); | 336 | spin_unlock_irqrestore(&priv->lock, flags); |
| 336 | 337 | ||
| 337 | return NETDEV_TX_OK; | 338 | return NETDEV_TX_OK; |
| 338 | } | 339 | } |
diff --git a/drivers/net/gianfar.c b/drivers/net/gianfar.c index e212f2c5448b..a00ec639c380 100644 --- a/drivers/net/gianfar.c +++ b/drivers/net/gianfar.c | |||
| @@ -491,6 +491,7 @@ static int gfar_remove(struct of_device *ofdev) | |||
| 491 | 491 | ||
| 492 | dev_set_drvdata(&ofdev->dev, NULL); | 492 | dev_set_drvdata(&ofdev->dev, NULL); |
| 493 | 493 | ||
| 494 | unregister_netdev(priv->ndev); | ||
| 494 | iounmap(priv->regs); | 495 | iounmap(priv->regs); |
| 495 | free_netdev(priv->ndev); | 496 | free_netdev(priv->ndev); |
| 496 | 497 | ||
diff --git a/drivers/net/ibm_newemac/core.c b/drivers/net/ibm_newemac/core.c index beb84213b671..f0f890803710 100644 --- a/drivers/net/ibm_newemac/core.c +++ b/drivers/net/ibm_newemac/core.c | |||
| @@ -1305,6 +1305,8 @@ static int emac_close(struct net_device *ndev) | |||
| 1305 | 1305 | ||
| 1306 | free_irq(dev->emac_irq, dev); | 1306 | free_irq(dev->emac_irq, dev); |
| 1307 | 1307 | ||
| 1308 | netif_carrier_off(ndev); | ||
| 1309 | |||
| 1308 | return 0; | 1310 | return 0; |
| 1309 | } | 1311 | } |
| 1310 | 1312 | ||
diff --git a/drivers/net/irda/au1k_ir.c b/drivers/net/irda/au1k_ir.c index c4361d466597..ee1cff5c9b21 100644 --- a/drivers/net/irda/au1k_ir.c +++ b/drivers/net/irda/au1k_ir.c | |||
| @@ -23,7 +23,6 @@ | |||
| 23 | #include <linux/init.h> | 23 | #include <linux/init.h> |
| 24 | #include <linux/errno.h> | 24 | #include <linux/errno.h> |
| 25 | #include <linux/netdevice.h> | 25 | #include <linux/netdevice.h> |
| 26 | #include <linux/etherdevice.h> | ||
| 27 | #include <linux/slab.h> | 26 | #include <linux/slab.h> |
| 28 | #include <linux/rtnetlink.h> | 27 | #include <linux/rtnetlink.h> |
| 29 | #include <linux/interrupt.h> | 28 | #include <linux/interrupt.h> |
| @@ -205,9 +204,6 @@ static const struct net_device_ops au1k_irda_netdev_ops = { | |||
| 205 | .ndo_start_xmit = au1k_irda_hard_xmit, | 204 | .ndo_start_xmit = au1k_irda_hard_xmit, |
| 206 | .ndo_tx_timeout = au1k_tx_timeout, | 205 | .ndo_tx_timeout = au1k_tx_timeout, |
| 207 | .ndo_do_ioctl = au1k_irda_ioctl, | 206 | .ndo_do_ioctl = au1k_irda_ioctl, |
| 208 | .ndo_change_mtu = eth_change_mtu, | ||
| 209 | .ndo_validate_addr = eth_validate_addr, | ||
| 210 | .ndo_set_mac_address = eth_mac_addr, | ||
| 211 | }; | 207 | }; |
| 212 | 208 | ||
| 213 | static int au1k_irda_net_init(struct net_device *dev) | 209 | static int au1k_irda_net_init(struct net_device *dev) |
diff --git a/drivers/net/irda/pxaficp_ir.c b/drivers/net/irda/pxaficp_ir.c index 3376a4f39e0a..77d10edefd25 100644 --- a/drivers/net/irda/pxaficp_ir.c +++ b/drivers/net/irda/pxaficp_ir.c | |||
| @@ -803,9 +803,6 @@ static const struct net_device_ops pxa_irda_netdev_ops = { | |||
| 803 | .ndo_stop = pxa_irda_stop, | 803 | .ndo_stop = pxa_irda_stop, |
| 804 | .ndo_start_xmit = pxa_irda_hard_xmit, | 804 | .ndo_start_xmit = pxa_irda_hard_xmit, |
| 805 | .ndo_do_ioctl = pxa_irda_ioctl, | 805 | .ndo_do_ioctl = pxa_irda_ioctl, |
| 806 | .ndo_change_mtu = eth_change_mtu, | ||
| 807 | .ndo_validate_addr = eth_validate_addr, | ||
| 808 | .ndo_set_mac_address = eth_mac_addr, | ||
| 809 | }; | 806 | }; |
| 810 | 807 | ||
| 811 | static int pxa_irda_probe(struct platform_device *pdev) | 808 | static int pxa_irda_probe(struct platform_device *pdev) |
| @@ -830,6 +827,7 @@ static int pxa_irda_probe(struct platform_device *pdev) | |||
| 830 | if (!dev) | 827 | if (!dev) |
| 831 | goto err_mem_3; | 828 | goto err_mem_3; |
| 832 | 829 | ||
| 830 | SET_NETDEV_DEV(dev, &pdev->dev); | ||
| 833 | si = netdev_priv(dev); | 831 | si = netdev_priv(dev); |
| 834 | si->dev = &pdev->dev; | 832 | si->dev = &pdev->dev; |
| 835 | si->pdata = pdev->dev.platform_data; | 833 | si->pdata = pdev->dev.platform_data; |
diff --git a/drivers/net/irda/sa1100_ir.c b/drivers/net/irda/sa1100_ir.c index 2aeb2e6aec1b..b039cb081e94 100644 --- a/drivers/net/irda/sa1100_ir.c +++ b/drivers/net/irda/sa1100_ir.c | |||
| @@ -24,7 +24,6 @@ | |||
| 24 | #include <linux/init.h> | 24 | #include <linux/init.h> |
| 25 | #include <linux/errno.h> | 25 | #include <linux/errno.h> |
| 26 | #include <linux/netdevice.h> | 26 | #include <linux/netdevice.h> |
| 27 | #include <linux/etherdevice.h> | ||
| 28 | #include <linux/slab.h> | 27 | #include <linux/slab.h> |
| 29 | #include <linux/rtnetlink.h> | 28 | #include <linux/rtnetlink.h> |
| 30 | #include <linux/interrupt.h> | 29 | #include <linux/interrupt.h> |
| @@ -881,9 +880,6 @@ static const struct net_device_ops sa1100_irda_netdev_ops = { | |||
| 881 | .ndo_stop = sa1100_irda_stop, | 880 | .ndo_stop = sa1100_irda_stop, |
| 882 | .ndo_start_xmit = sa1100_irda_hard_xmit, | 881 | .ndo_start_xmit = sa1100_irda_hard_xmit, |
| 883 | .ndo_do_ioctl = sa1100_irda_ioctl, | 882 | .ndo_do_ioctl = sa1100_irda_ioctl, |
| 884 | .ndo_change_mtu = eth_change_mtu, | ||
| 885 | .ndo_validate_addr = eth_validate_addr, | ||
| 886 | .ndo_set_mac_address = eth_mac_addr, | ||
| 887 | }; | 883 | }; |
| 888 | 884 | ||
| 889 | static int sa1100_irda_probe(struct platform_device *pdev) | 885 | static int sa1100_irda_probe(struct platform_device *pdev) |
diff --git a/drivers/net/ixp2000/ixpdev.c b/drivers/net/ixp2000/ixpdev.c index 2a0174b62e96..92fb8235c766 100644 --- a/drivers/net/ixp2000/ixpdev.c +++ b/drivers/net/ixp2000/ixpdev.c | |||
| @@ -41,6 +41,7 @@ static int ixpdev_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 41 | struct ixpdev_priv *ip = netdev_priv(dev); | 41 | struct ixpdev_priv *ip = netdev_priv(dev); |
| 42 | struct ixpdev_tx_desc *desc; | 42 | struct ixpdev_tx_desc *desc; |
| 43 | int entry; | 43 | int entry; |
| 44 | unsigned long flags; | ||
| 44 | 45 | ||
| 45 | if (unlikely(skb->len > PAGE_SIZE)) { | 46 | if (unlikely(skb->len > PAGE_SIZE)) { |
| 46 | /* @@@ Count drops. */ | 47 | /* @@@ Count drops. */ |
| @@ -63,11 +64,11 @@ static int ixpdev_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 63 | 64 | ||
| 64 | dev->trans_start = jiffies; | 65 | dev->trans_start = jiffies; |
| 65 | 66 | ||
| 66 | local_irq_disable(); | 67 | local_irq_save(flags); |
| 67 | ip->tx_queue_entries++; | 68 | ip->tx_queue_entries++; |
| 68 | if (ip->tx_queue_entries == TX_BUF_COUNT_PER_CHAN) | 69 | if (ip->tx_queue_entries == TX_BUF_COUNT_PER_CHAN) |
| 69 | netif_stop_queue(dev); | 70 | netif_stop_queue(dev); |
| 70 | local_irq_enable(); | 71 | local_irq_restore(flags); |
| 71 | 72 | ||
| 72 | return 0; | 73 | return 0; |
| 73 | } | 74 | } |
diff --git a/drivers/net/macb.c b/drivers/net/macb.c index 5b5c25368d1e..e3601cf3f931 100644 --- a/drivers/net/macb.c +++ b/drivers/net/macb.c | |||
| @@ -620,6 +620,7 @@ static int macb_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 620 | dma_addr_t mapping; | 620 | dma_addr_t mapping; |
| 621 | unsigned int len, entry; | 621 | unsigned int len, entry; |
| 622 | u32 ctrl; | 622 | u32 ctrl; |
| 623 | unsigned long flags; | ||
| 623 | 624 | ||
| 624 | #ifdef DEBUG | 625 | #ifdef DEBUG |
| 625 | int i; | 626 | int i; |
| @@ -635,12 +636,12 @@ static int macb_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 635 | #endif | 636 | #endif |
| 636 | 637 | ||
| 637 | len = skb->len; | 638 | len = skb->len; |
| 638 | spin_lock_irq(&bp->lock); | 639 | spin_lock_irqsave(&bp->lock, flags); |
| 639 | 640 | ||
| 640 | /* This is a hard error, log it. */ | 641 | /* This is a hard error, log it. */ |
| 641 | if (TX_BUFFS_AVAIL(bp) < 1) { | 642 | if (TX_BUFFS_AVAIL(bp) < 1) { |
| 642 | netif_stop_queue(dev); | 643 | netif_stop_queue(dev); |
| 643 | spin_unlock_irq(&bp->lock); | 644 | spin_unlock_irqrestore(&bp->lock, flags); |
| 644 | dev_err(&bp->pdev->dev, | 645 | dev_err(&bp->pdev->dev, |
| 645 | "BUG! Tx Ring full when queue awake!\n"); | 646 | "BUG! Tx Ring full when queue awake!\n"); |
| 646 | dev_dbg(&bp->pdev->dev, "tx_head = %u, tx_tail = %u\n", | 647 | dev_dbg(&bp->pdev->dev, "tx_head = %u, tx_tail = %u\n", |
| @@ -674,7 +675,7 @@ static int macb_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 674 | if (TX_BUFFS_AVAIL(bp) < 1) | 675 | if (TX_BUFFS_AVAIL(bp) < 1) |
| 675 | netif_stop_queue(dev); | 676 | netif_stop_queue(dev); |
| 676 | 677 | ||
| 677 | spin_unlock_irq(&bp->lock); | 678 | spin_unlock_irqrestore(&bp->lock, flags); |
| 678 | 679 | ||
| 679 | dev->trans_start = jiffies; | 680 | dev->trans_start = jiffies; |
| 680 | 681 | ||
diff --git a/drivers/net/mlx4/en_tx.c b/drivers/net/mlx4/en_tx.c index 5a88b3f57693..62208401c4df 100644 --- a/drivers/net/mlx4/en_tx.c +++ b/drivers/net/mlx4/en_tx.c | |||
| @@ -437,6 +437,7 @@ static inline void mlx4_en_xmit_poll(struct mlx4_en_priv *priv, int tx_ind) | |||
| 437 | { | 437 | { |
| 438 | struct mlx4_en_cq *cq = &priv->tx_cq[tx_ind]; | 438 | struct mlx4_en_cq *cq = &priv->tx_cq[tx_ind]; |
| 439 | struct mlx4_en_tx_ring *ring = &priv->tx_ring[tx_ind]; | 439 | struct mlx4_en_tx_ring *ring = &priv->tx_ring[tx_ind]; |
| 440 | unsigned long flags; | ||
| 440 | 441 | ||
| 441 | /* If we don't have a pending timer, set one up to catch our recent | 442 | /* If we don't have a pending timer, set one up to catch our recent |
| 442 | post in case the interface becomes idle */ | 443 | post in case the interface becomes idle */ |
| @@ -445,9 +446,9 @@ static inline void mlx4_en_xmit_poll(struct mlx4_en_priv *priv, int tx_ind) | |||
| 445 | 446 | ||
| 446 | /* Poll the CQ every mlx4_en_TX_MODER_POLL packets */ | 447 | /* Poll the CQ every mlx4_en_TX_MODER_POLL packets */ |
| 447 | if ((++ring->poll_cnt & (MLX4_EN_TX_POLL_MODER - 1)) == 0) | 448 | if ((++ring->poll_cnt & (MLX4_EN_TX_POLL_MODER - 1)) == 0) |
| 448 | if (spin_trylock_irq(&ring->comp_lock)) { | 449 | if (spin_trylock_irqsave(&ring->comp_lock, flags)) { |
| 449 | mlx4_en_process_tx_cq(priv->dev, cq); | 450 | mlx4_en_process_tx_cq(priv->dev, cq); |
| 450 | spin_unlock_irq(&ring->comp_lock); | 451 | spin_unlock_irqrestore(&ring->comp_lock, flags); |
| 451 | } | 452 | } |
| 452 | } | 453 | } |
| 453 | 454 | ||
diff --git a/drivers/net/smc91x.c b/drivers/net/smc91x.c index 1c70e999cc50..7567f510eff5 100644 --- a/drivers/net/smc91x.c +++ b/drivers/net/smc91x.c | |||
| @@ -196,21 +196,23 @@ static void PRINT_PKT(u_char *buf, int length) | |||
| 196 | /* this enables an interrupt in the interrupt mask register */ | 196 | /* this enables an interrupt in the interrupt mask register */ |
| 197 | #define SMC_ENABLE_INT(lp, x) do { \ | 197 | #define SMC_ENABLE_INT(lp, x) do { \ |
| 198 | unsigned char mask; \ | 198 | unsigned char mask; \ |
| 199 | spin_lock_irq(&lp->lock); \ | 199 | unsigned long smc_enable_flags; \ |
| 200 | spin_lock_irqsave(&lp->lock, smc_enable_flags); \ | ||
| 200 | mask = SMC_GET_INT_MASK(lp); \ | 201 | mask = SMC_GET_INT_MASK(lp); \ |
| 201 | mask |= (x); \ | 202 | mask |= (x); \ |
| 202 | SMC_SET_INT_MASK(lp, mask); \ | 203 | SMC_SET_INT_MASK(lp, mask); \ |
| 203 | spin_unlock_irq(&lp->lock); \ | 204 | spin_unlock_irqrestore(&lp->lock, smc_enable_flags); \ |
| 204 | } while (0) | 205 | } while (0) |
| 205 | 206 | ||
| 206 | /* this disables an interrupt from the interrupt mask register */ | 207 | /* this disables an interrupt from the interrupt mask register */ |
| 207 | #define SMC_DISABLE_INT(lp, x) do { \ | 208 | #define SMC_DISABLE_INT(lp, x) do { \ |
| 208 | unsigned char mask; \ | 209 | unsigned char mask; \ |
| 209 | spin_lock_irq(&lp->lock); \ | 210 | unsigned long smc_disable_flags; \ |
| 211 | spin_lock_irqsave(&lp->lock, smc_disable_flags); \ | ||
| 210 | mask = SMC_GET_INT_MASK(lp); \ | 212 | mask = SMC_GET_INT_MASK(lp); \ |
| 211 | mask &= ~(x); \ | 213 | mask &= ~(x); \ |
| 212 | SMC_SET_INT_MASK(lp, mask); \ | 214 | SMC_SET_INT_MASK(lp, mask); \ |
| 213 | spin_unlock_irq(&lp->lock); \ | 215 | spin_unlock_irqrestore(&lp->lock, smc_disable_flags); \ |
| 214 | } while (0) | 216 | } while (0) |
| 215 | 217 | ||
| 216 | /* | 218 | /* |
| @@ -520,21 +522,21 @@ static inline void smc_rcv(struct net_device *dev) | |||
| 520 | * any other concurrent access and C would always interrupt B. But life | 522 | * any other concurrent access and C would always interrupt B. But life |
| 521 | * isn't that easy in a SMP world... | 523 | * isn't that easy in a SMP world... |
| 522 | */ | 524 | */ |
| 523 | #define smc_special_trylock(lock) \ | 525 | #define smc_special_trylock(lock, flags) \ |
| 524 | ({ \ | 526 | ({ \ |
| 525 | int __ret; \ | 527 | int __ret; \ |
| 526 | local_irq_disable(); \ | 528 | local_irq_save(flags); \ |
| 527 | __ret = spin_trylock(lock); \ | 529 | __ret = spin_trylock(lock); \ |
| 528 | if (!__ret) \ | 530 | if (!__ret) \ |
| 529 | local_irq_enable(); \ | 531 | local_irq_restore(flags); \ |
| 530 | __ret; \ | 532 | __ret; \ |
| 531 | }) | 533 | }) |
| 532 | #define smc_special_lock(lock) spin_lock_irq(lock) | 534 | #define smc_special_lock(lock, flags) spin_lock_irqsave(lock, flags) |
| 533 | #define smc_special_unlock(lock) spin_unlock_irq(lock) | 535 | #define smc_special_unlock(lock, flags) spin_unlock_irqrestore(lock, flags) |
| 534 | #else | 536 | #else |
| 535 | #define smc_special_trylock(lock) (1) | 537 | #define smc_special_trylock(lock, flags) (1) |
| 536 | #define smc_special_lock(lock) do { } while (0) | 538 | #define smc_special_lock(lock, flags) do { } while (0) |
| 537 | #define smc_special_unlock(lock) do { } while (0) | 539 | #define smc_special_unlock(lock, flags) do { } while (0) |
| 538 | #endif | 540 | #endif |
| 539 | 541 | ||
| 540 | /* | 542 | /* |
| @@ -548,10 +550,11 @@ static void smc_hardware_send_pkt(unsigned long data) | |||
| 548 | struct sk_buff *skb; | 550 | struct sk_buff *skb; |
| 549 | unsigned int packet_no, len; | 551 | unsigned int packet_no, len; |
| 550 | unsigned char *buf; | 552 | unsigned char *buf; |
| 553 | unsigned long flags; | ||
| 551 | 554 | ||
| 552 | DBG(3, "%s: %s\n", dev->name, __func__); | 555 | DBG(3, "%s: %s\n", dev->name, __func__); |
| 553 | 556 | ||
| 554 | if (!smc_special_trylock(&lp->lock)) { | 557 | if (!smc_special_trylock(&lp->lock, flags)) { |
| 555 | netif_stop_queue(dev); | 558 | netif_stop_queue(dev); |
| 556 | tasklet_schedule(&lp->tx_task); | 559 | tasklet_schedule(&lp->tx_task); |
| 557 | return; | 560 | return; |
| @@ -559,7 +562,7 @@ static void smc_hardware_send_pkt(unsigned long data) | |||
| 559 | 562 | ||
| 560 | skb = lp->pending_tx_skb; | 563 | skb = lp->pending_tx_skb; |
| 561 | if (unlikely(!skb)) { | 564 | if (unlikely(!skb)) { |
| 562 | smc_special_unlock(&lp->lock); | 565 | smc_special_unlock(&lp->lock, flags); |
| 563 | return; | 566 | return; |
| 564 | } | 567 | } |
| 565 | lp->pending_tx_skb = NULL; | 568 | lp->pending_tx_skb = NULL; |
| @@ -569,7 +572,7 @@ static void smc_hardware_send_pkt(unsigned long data) | |||
| 569 | printk("%s: Memory allocation failed.\n", dev->name); | 572 | printk("%s: Memory allocation failed.\n", dev->name); |
| 570 | dev->stats.tx_errors++; | 573 | dev->stats.tx_errors++; |
| 571 | dev->stats.tx_fifo_errors++; | 574 | dev->stats.tx_fifo_errors++; |
| 572 | smc_special_unlock(&lp->lock); | 575 | smc_special_unlock(&lp->lock, flags); |
| 573 | goto done; | 576 | goto done; |
| 574 | } | 577 | } |
| 575 | 578 | ||
| @@ -608,7 +611,7 @@ static void smc_hardware_send_pkt(unsigned long data) | |||
| 608 | 611 | ||
| 609 | /* queue the packet for TX */ | 612 | /* queue the packet for TX */ |
| 610 | SMC_SET_MMU_CMD(lp, MC_ENQUEUE); | 613 | SMC_SET_MMU_CMD(lp, MC_ENQUEUE); |
| 611 | smc_special_unlock(&lp->lock); | 614 | smc_special_unlock(&lp->lock, flags); |
| 612 | 615 | ||
| 613 | dev->trans_start = jiffies; | 616 | dev->trans_start = jiffies; |
| 614 | dev->stats.tx_packets++; | 617 | dev->stats.tx_packets++; |
| @@ -633,6 +636,7 @@ static int smc_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 633 | struct smc_local *lp = netdev_priv(dev); | 636 | struct smc_local *lp = netdev_priv(dev); |
| 634 | void __iomem *ioaddr = lp->base; | 637 | void __iomem *ioaddr = lp->base; |
| 635 | unsigned int numPages, poll_count, status; | 638 | unsigned int numPages, poll_count, status; |
| 639 | unsigned long flags; | ||
| 636 | 640 | ||
| 637 | DBG(3, "%s: %s\n", dev->name, __func__); | 641 | DBG(3, "%s: %s\n", dev->name, __func__); |
| 638 | 642 | ||
| @@ -658,7 +662,7 @@ static int smc_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 658 | return 0; | 662 | return 0; |
| 659 | } | 663 | } |
| 660 | 664 | ||
| 661 | smc_special_lock(&lp->lock); | 665 | smc_special_lock(&lp->lock, flags); |
| 662 | 666 | ||
| 663 | /* now, try to allocate the memory */ | 667 | /* now, try to allocate the memory */ |
| 664 | SMC_SET_MMU_CMD(lp, MC_ALLOC | numPages); | 668 | SMC_SET_MMU_CMD(lp, MC_ALLOC | numPages); |
| @@ -676,7 +680,7 @@ static int smc_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 676 | } | 680 | } |
| 677 | } while (--poll_count); | 681 | } while (--poll_count); |
| 678 | 682 | ||
| 679 | smc_special_unlock(&lp->lock); | 683 | smc_special_unlock(&lp->lock, flags); |
| 680 | 684 | ||
| 681 | lp->pending_tx_skb = skb; | 685 | lp->pending_tx_skb = skb; |
| 682 | if (!poll_count) { | 686 | if (!poll_count) { |
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index 2a6e81d5b579..bbedf03a2124 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c | |||
| @@ -70,6 +70,9 @@ struct virtnet_info | |||
| 70 | struct sk_buff_head recv; | 70 | struct sk_buff_head recv; |
| 71 | struct sk_buff_head send; | 71 | struct sk_buff_head send; |
| 72 | 72 | ||
| 73 | /* Work struct for refilling if we run low on memory. */ | ||
| 74 | struct delayed_work refill; | ||
| 75 | |||
| 73 | /* Chain pages by the private ptr. */ | 76 | /* Chain pages by the private ptr. */ |
| 74 | struct page *pages; | 77 | struct page *pages; |
| 75 | }; | 78 | }; |
| @@ -273,19 +276,22 @@ drop: | |||
| 273 | dev_kfree_skb(skb); | 276 | dev_kfree_skb(skb); |
| 274 | } | 277 | } |
| 275 | 278 | ||
| 276 | static void try_fill_recv_maxbufs(struct virtnet_info *vi) | 279 | static bool try_fill_recv_maxbufs(struct virtnet_info *vi, gfp_t gfp) |
| 277 | { | 280 | { |
| 278 | struct sk_buff *skb; | 281 | struct sk_buff *skb; |
| 279 | struct scatterlist sg[2+MAX_SKB_FRAGS]; | 282 | struct scatterlist sg[2+MAX_SKB_FRAGS]; |
| 280 | int num, err, i; | 283 | int num, err, i; |
| 284 | bool oom = false; | ||
| 281 | 285 | ||
| 282 | sg_init_table(sg, 2+MAX_SKB_FRAGS); | 286 | sg_init_table(sg, 2+MAX_SKB_FRAGS); |
| 283 | for (;;) { | 287 | for (;;) { |
| 284 | struct virtio_net_hdr *hdr; | 288 | struct virtio_net_hdr *hdr; |
| 285 | 289 | ||
| 286 | skb = netdev_alloc_skb(vi->dev, MAX_PACKET_LEN + NET_IP_ALIGN); | 290 | skb = netdev_alloc_skb(vi->dev, MAX_PACKET_LEN + NET_IP_ALIGN); |
| 287 | if (unlikely(!skb)) | 291 | if (unlikely(!skb)) { |
| 292 | oom = true; | ||
| 288 | break; | 293 | break; |
| 294 | } | ||
| 289 | 295 | ||
| 290 | skb_reserve(skb, NET_IP_ALIGN); | 296 | skb_reserve(skb, NET_IP_ALIGN); |
| 291 | skb_put(skb, MAX_PACKET_LEN); | 297 | skb_put(skb, MAX_PACKET_LEN); |
| @@ -296,7 +302,7 @@ static void try_fill_recv_maxbufs(struct virtnet_info *vi) | |||
| 296 | if (vi->big_packets) { | 302 | if (vi->big_packets) { |
| 297 | for (i = 0; i < MAX_SKB_FRAGS; i++) { | 303 | for (i = 0; i < MAX_SKB_FRAGS; i++) { |
| 298 | skb_frag_t *f = &skb_shinfo(skb)->frags[i]; | 304 | skb_frag_t *f = &skb_shinfo(skb)->frags[i]; |
| 299 | f->page = get_a_page(vi, GFP_ATOMIC); | 305 | f->page = get_a_page(vi, gfp); |
| 300 | if (!f->page) | 306 | if (!f->page) |
| 301 | break; | 307 | break; |
| 302 | 308 | ||
| @@ -325,31 +331,35 @@ static void try_fill_recv_maxbufs(struct virtnet_info *vi) | |||
| 325 | if (unlikely(vi->num > vi->max)) | 331 | if (unlikely(vi->num > vi->max)) |
| 326 | vi->max = vi->num; | 332 | vi->max = vi->num; |
| 327 | vi->rvq->vq_ops->kick(vi->rvq); | 333 | vi->rvq->vq_ops->kick(vi->rvq); |
| 334 | return !oom; | ||
| 328 | } | 335 | } |
| 329 | 336 | ||
| 330 | static void try_fill_recv(struct virtnet_info *vi) | 337 | /* Returns false if we couldn't fill entirely (OOM). */ |
| 338 | static bool try_fill_recv(struct virtnet_info *vi, gfp_t gfp) | ||
| 331 | { | 339 | { |
| 332 | struct sk_buff *skb; | 340 | struct sk_buff *skb; |
| 333 | struct scatterlist sg[1]; | 341 | struct scatterlist sg[1]; |
| 334 | int err; | 342 | int err; |
| 343 | bool oom = false; | ||
| 335 | 344 | ||
| 336 | if (!vi->mergeable_rx_bufs) { | 345 | if (!vi->mergeable_rx_bufs) |
| 337 | try_fill_recv_maxbufs(vi); | 346 | return try_fill_recv_maxbufs(vi, gfp); |
| 338 | return; | ||
| 339 | } | ||
| 340 | 347 | ||
| 341 | for (;;) { | 348 | for (;;) { |
| 342 | skb_frag_t *f; | 349 | skb_frag_t *f; |
| 343 | 350 | ||
| 344 | skb = netdev_alloc_skb(vi->dev, GOOD_COPY_LEN + NET_IP_ALIGN); | 351 | skb = netdev_alloc_skb(vi->dev, GOOD_COPY_LEN + NET_IP_ALIGN); |
| 345 | if (unlikely(!skb)) | 352 | if (unlikely(!skb)) { |
| 353 | oom = true; | ||
| 346 | break; | 354 | break; |
| 355 | } | ||
| 347 | 356 | ||
| 348 | skb_reserve(skb, NET_IP_ALIGN); | 357 | skb_reserve(skb, NET_IP_ALIGN); |
| 349 | 358 | ||
| 350 | f = &skb_shinfo(skb)->frags[0]; | 359 | f = &skb_shinfo(skb)->frags[0]; |
| 351 | f->page = get_a_page(vi, GFP_ATOMIC); | 360 | f->page = get_a_page(vi, gfp); |
| 352 | if (!f->page) { | 361 | if (!f->page) { |
| 362 | oom = true; | ||
| 353 | kfree_skb(skb); | 363 | kfree_skb(skb); |
| 354 | break; | 364 | break; |
| 355 | } | 365 | } |
| @@ -373,6 +383,7 @@ static void try_fill_recv(struct virtnet_info *vi) | |||
| 373 | if (unlikely(vi->num > vi->max)) | 383 | if (unlikely(vi->num > vi->max)) |
| 374 | vi->max = vi->num; | 384 | vi->max = vi->num; |
| 375 | vi->rvq->vq_ops->kick(vi->rvq); | 385 | vi->rvq->vq_ops->kick(vi->rvq); |
| 386 | return !oom; | ||
| 376 | } | 387 | } |
| 377 | 388 | ||
| 378 | static void skb_recv_done(struct virtqueue *rvq) | 389 | static void skb_recv_done(struct virtqueue *rvq) |
| @@ -385,6 +396,23 @@ static void skb_recv_done(struct virtqueue *rvq) | |||
| 385 | } | 396 | } |
| 386 | } | 397 | } |
| 387 | 398 | ||
| 399 | static void refill_work(struct work_struct *work) | ||
| 400 | { | ||
| 401 | struct virtnet_info *vi; | ||
| 402 | bool still_empty; | ||
| 403 | |||
| 404 | vi = container_of(work, struct virtnet_info, refill.work); | ||
| 405 | napi_disable(&vi->napi); | ||
| 406 | try_fill_recv(vi, GFP_KERNEL); | ||
| 407 | still_empty = (vi->num == 0); | ||
| 408 | napi_enable(&vi->napi); | ||
| 409 | |||
| 410 | /* In theory, this can happen: if we don't get any buffers in | ||
| 411 | * we will *never* try to fill again. */ | ||
| 412 | if (still_empty) | ||
| 413 | schedule_delayed_work(&vi->refill, HZ/2); | ||
| 414 | } | ||
| 415 | |||
| 388 | static int virtnet_poll(struct napi_struct *napi, int budget) | 416 | static int virtnet_poll(struct napi_struct *napi, int budget) |
| 389 | { | 417 | { |
| 390 | struct virtnet_info *vi = container_of(napi, struct virtnet_info, napi); | 418 | struct virtnet_info *vi = container_of(napi, struct virtnet_info, napi); |
| @@ -400,10 +428,10 @@ again: | |||
| 400 | received++; | 428 | received++; |
| 401 | } | 429 | } |
| 402 | 430 | ||
| 403 | /* FIXME: If we oom and completely run out of inbufs, we need | 431 | if (vi->num < vi->max / 2) { |
| 404 | * to start a timer trying to fill more. */ | 432 | if (!try_fill_recv(vi, GFP_ATOMIC)) |
| 405 | if (vi->num < vi->max / 2) | 433 | schedule_delayed_work(&vi->refill, 0); |
| 406 | try_fill_recv(vi); | 434 | } |
| 407 | 435 | ||
| 408 | /* Out of packets? */ | 436 | /* Out of packets? */ |
| 409 | if (received < budget) { | 437 | if (received < budget) { |
| @@ -893,6 +921,7 @@ static int virtnet_probe(struct virtio_device *vdev) | |||
| 893 | vi->vdev = vdev; | 921 | vi->vdev = vdev; |
| 894 | vdev->priv = vi; | 922 | vdev->priv = vi; |
| 895 | vi->pages = NULL; | 923 | vi->pages = NULL; |
| 924 | INIT_DELAYED_WORK(&vi->refill, refill_work); | ||
| 896 | 925 | ||
| 897 | /* If they give us a callback when all buffers are done, we don't need | 926 | /* If they give us a callback when all buffers are done, we don't need |
| 898 | * the timer. */ | 927 | * the timer. */ |
| @@ -941,7 +970,7 @@ static int virtnet_probe(struct virtio_device *vdev) | |||
| 941 | } | 970 | } |
| 942 | 971 | ||
| 943 | /* Last of all, set up some receive buffers. */ | 972 | /* Last of all, set up some receive buffers. */ |
| 944 | try_fill_recv(vi); | 973 | try_fill_recv(vi, GFP_KERNEL); |
| 945 | 974 | ||
| 946 | /* If we didn't even get one input buffer, we're useless. */ | 975 | /* If we didn't even get one input buffer, we're useless. */ |
| 947 | if (vi->num == 0) { | 976 | if (vi->num == 0) { |
| @@ -958,6 +987,7 @@ static int virtnet_probe(struct virtio_device *vdev) | |||
| 958 | 987 | ||
| 959 | unregister: | 988 | unregister: |
| 960 | unregister_netdev(dev); | 989 | unregister_netdev(dev); |
| 990 | cancel_delayed_work_sync(&vi->refill); | ||
| 961 | free_vqs: | 991 | free_vqs: |
| 962 | vdev->config->del_vqs(vdev); | 992 | vdev->config->del_vqs(vdev); |
| 963 | free: | 993 | free: |
| @@ -986,6 +1016,7 @@ static void virtnet_remove(struct virtio_device *vdev) | |||
| 986 | BUG_ON(vi->num != 0); | 1016 | BUG_ON(vi->num != 0); |
| 987 | 1017 | ||
| 988 | unregister_netdev(vi->dev); | 1018 | unregister_netdev(vi->dev); |
| 1019 | cancel_delayed_work_sync(&vi->refill); | ||
| 989 | 1020 | ||
| 990 | vdev->config->del_vqs(vi->vdev); | 1021 | vdev->config->del_vqs(vi->vdev); |
| 991 | 1022 | ||
diff --git a/drivers/net/wireless/ipw2x00/ipw2200.c b/drivers/net/wireless/ipw2x00/ipw2200.c index 6dcac73b4d29..f593fbbb4e52 100644 --- a/drivers/net/wireless/ipw2x00/ipw2200.c +++ b/drivers/net/wireless/ipw2x00/ipw2200.c | |||
| @@ -2874,45 +2874,27 @@ static int ipw_fw_dma_add_command_block(struct ipw_priv *priv, | |||
| 2874 | return 0; | 2874 | return 0; |
| 2875 | } | 2875 | } |
| 2876 | 2876 | ||
| 2877 | static int ipw_fw_dma_add_buffer(struct ipw_priv *priv, | 2877 | static int ipw_fw_dma_add_buffer(struct ipw_priv *priv, dma_addr_t *src_address, |
| 2878 | u32 src_phys, u32 dest_address, u32 length) | 2878 | int nr, u32 dest_address, u32 len) |
| 2879 | { | 2879 | { |
| 2880 | u32 bytes_left = length; | 2880 | int ret, i; |
| 2881 | u32 src_offset = 0; | 2881 | u32 size; |
| 2882 | u32 dest_offset = 0; | 2882 | |
| 2883 | int status = 0; | ||
| 2884 | IPW_DEBUG_FW(">> \n"); | 2883 | IPW_DEBUG_FW(">> \n"); |
| 2885 | IPW_DEBUG_FW_INFO("src_phys=0x%x dest_address=0x%x length=0x%x\n", | 2884 | IPW_DEBUG_FW_INFO("nr=%d dest_address=0x%x len=0x%x\n", |
| 2886 | src_phys, dest_address, length); | 2885 | nr, dest_address, len); |
| 2887 | while (bytes_left > CB_MAX_LENGTH) { | 2886 | |
| 2888 | status = ipw_fw_dma_add_command_block(priv, | 2887 | for (i = 0; i < nr; i++) { |
| 2889 | src_phys + src_offset, | 2888 | size = min_t(u32, len - i * CB_MAX_LENGTH, CB_MAX_LENGTH); |
| 2890 | dest_address + | 2889 | ret = ipw_fw_dma_add_command_block(priv, src_address[i], |
| 2891 | dest_offset, | 2890 | dest_address + |
| 2892 | CB_MAX_LENGTH, 0, 0); | 2891 | i * CB_MAX_LENGTH, size, |
| 2893 | if (status) { | 2892 | 0, 0); |
| 2893 | if (ret) { | ||
| 2894 | IPW_DEBUG_FW_INFO(": Failed\n"); | 2894 | IPW_DEBUG_FW_INFO(": Failed\n"); |
| 2895 | return -1; | 2895 | return -1; |
| 2896 | } else | 2896 | } else |
| 2897 | IPW_DEBUG_FW_INFO(": Added new cb\n"); | 2897 | IPW_DEBUG_FW_INFO(": Added new cb\n"); |
| 2898 | |||
| 2899 | src_offset += CB_MAX_LENGTH; | ||
| 2900 | dest_offset += CB_MAX_LENGTH; | ||
| 2901 | bytes_left -= CB_MAX_LENGTH; | ||
| 2902 | } | ||
| 2903 | |||
| 2904 | /* add the buffer tail */ | ||
| 2905 | if (bytes_left > 0) { | ||
| 2906 | status = | ||
| 2907 | ipw_fw_dma_add_command_block(priv, src_phys + src_offset, | ||
| 2908 | dest_address + dest_offset, | ||
| 2909 | bytes_left, 0, 0); | ||
| 2910 | if (status) { | ||
| 2911 | IPW_DEBUG_FW_INFO(": Failed on the buffer tail\n"); | ||
| 2912 | return -1; | ||
| 2913 | } else | ||
| 2914 | IPW_DEBUG_FW_INFO | ||
| 2915 | (": Adding new cb - the buffer tail\n"); | ||
| 2916 | } | 2898 | } |
| 2917 | 2899 | ||
| 2918 | IPW_DEBUG_FW("<< \n"); | 2900 | IPW_DEBUG_FW("<< \n"); |
| @@ -3160,59 +3142,91 @@ static int ipw_load_ucode(struct ipw_priv *priv, u8 * data, size_t len) | |||
| 3160 | 3142 | ||
| 3161 | static int ipw_load_firmware(struct ipw_priv *priv, u8 * data, size_t len) | 3143 | static int ipw_load_firmware(struct ipw_priv *priv, u8 * data, size_t len) |
| 3162 | { | 3144 | { |
| 3163 | int rc = -1; | 3145 | int ret = -1; |
| 3164 | int offset = 0; | 3146 | int offset = 0; |
| 3165 | struct fw_chunk *chunk; | 3147 | struct fw_chunk *chunk; |
| 3166 | dma_addr_t shared_phys; | 3148 | int total_nr = 0; |
| 3167 | u8 *shared_virt; | 3149 | int i; |
| 3150 | struct pci_pool *pool; | ||
| 3151 | u32 *virts[CB_NUMBER_OF_ELEMENTS_SMALL]; | ||
| 3152 | dma_addr_t phys[CB_NUMBER_OF_ELEMENTS_SMALL]; | ||
| 3168 | 3153 | ||
| 3169 | IPW_DEBUG_TRACE("<< : \n"); | 3154 | IPW_DEBUG_TRACE("<< : \n"); |
| 3170 | shared_virt = pci_alloc_consistent(priv->pci_dev, len, &shared_phys); | ||
| 3171 | 3155 | ||
| 3172 | if (!shared_virt) | 3156 | pool = pci_pool_create("ipw2200", priv->pci_dev, CB_MAX_LENGTH, 0, 0); |
| 3157 | if (!pool) { | ||
| 3158 | IPW_ERROR("pci_pool_create failed\n"); | ||
| 3173 | return -ENOMEM; | 3159 | return -ENOMEM; |
| 3174 | 3160 | } | |
| 3175 | memmove(shared_virt, data, len); | ||
| 3176 | 3161 | ||
| 3177 | /* Start the Dma */ | 3162 | /* Start the Dma */ |
| 3178 | rc = ipw_fw_dma_enable(priv); | 3163 | ret = ipw_fw_dma_enable(priv); |
| 3179 | 3164 | ||
| 3180 | /* the DMA is already ready this would be a bug. */ | 3165 | /* the DMA is already ready this would be a bug. */ |
| 3181 | BUG_ON(priv->sram_desc.last_cb_index > 0); | 3166 | BUG_ON(priv->sram_desc.last_cb_index > 0); |
| 3182 | 3167 | ||
| 3183 | do { | 3168 | do { |
| 3169 | u32 chunk_len; | ||
| 3170 | u8 *start; | ||
| 3171 | int size; | ||
| 3172 | int nr = 0; | ||
| 3173 | |||
| 3184 | chunk = (struct fw_chunk *)(data + offset); | 3174 | chunk = (struct fw_chunk *)(data + offset); |
| 3185 | offset += sizeof(struct fw_chunk); | 3175 | offset += sizeof(struct fw_chunk); |
| 3176 | chunk_len = le32_to_cpu(chunk->length); | ||
| 3177 | start = data + offset; | ||
| 3178 | |||
| 3179 | nr = (chunk_len + CB_MAX_LENGTH - 1) / CB_MAX_LENGTH; | ||
| 3180 | for (i = 0; i < nr; i++) { | ||
| 3181 | virts[total_nr] = pci_pool_alloc(pool, GFP_KERNEL, | ||
| 3182 | &phys[total_nr]); | ||
| 3183 | if (!virts[total_nr]) { | ||
| 3184 | ret = -ENOMEM; | ||
| 3185 | goto out; | ||
| 3186 | } | ||
| 3187 | size = min_t(u32, chunk_len - i * CB_MAX_LENGTH, | ||
| 3188 | CB_MAX_LENGTH); | ||
| 3189 | memcpy(virts[total_nr], start, size); | ||
| 3190 | start += size; | ||
| 3191 | total_nr++; | ||
| 3192 | /* We don't support fw chunk larger than 64*8K */ | ||
| 3193 | BUG_ON(total_nr > CB_NUMBER_OF_ELEMENTS_SMALL); | ||
| 3194 | } | ||
| 3195 | |||
| 3186 | /* build DMA packet and queue up for sending */ | 3196 | /* build DMA packet and queue up for sending */ |
| 3187 | /* dma to chunk->address, the chunk->length bytes from data + | 3197 | /* dma to chunk->address, the chunk->length bytes from data + |
| 3188 | * offeset*/ | 3198 | * offeset*/ |
| 3189 | /* Dma loading */ | 3199 | /* Dma loading */ |
| 3190 | rc = ipw_fw_dma_add_buffer(priv, shared_phys + offset, | 3200 | ret = ipw_fw_dma_add_buffer(priv, &phys[total_nr - nr], |
| 3191 | le32_to_cpu(chunk->address), | 3201 | nr, le32_to_cpu(chunk->address), |
| 3192 | le32_to_cpu(chunk->length)); | 3202 | chunk_len); |
| 3193 | if (rc) { | 3203 | if (ret) { |
| 3194 | IPW_DEBUG_INFO("dmaAddBuffer Failed\n"); | 3204 | IPW_DEBUG_INFO("dmaAddBuffer Failed\n"); |
| 3195 | goto out; | 3205 | goto out; |
| 3196 | } | 3206 | } |
| 3197 | 3207 | ||
| 3198 | offset += le32_to_cpu(chunk->length); | 3208 | offset += chunk_len; |
| 3199 | } while (offset < len); | 3209 | } while (offset < len); |
| 3200 | 3210 | ||
| 3201 | /* Run the DMA and wait for the answer */ | 3211 | /* Run the DMA and wait for the answer */ |
| 3202 | rc = ipw_fw_dma_kick(priv); | 3212 | ret = ipw_fw_dma_kick(priv); |
| 3203 | if (rc) { | 3213 | if (ret) { |
| 3204 | IPW_ERROR("dmaKick Failed\n"); | 3214 | IPW_ERROR("dmaKick Failed\n"); |
| 3205 | goto out; | 3215 | goto out; |
| 3206 | } | 3216 | } |
| 3207 | 3217 | ||
| 3208 | rc = ipw_fw_dma_wait(priv); | 3218 | ret = ipw_fw_dma_wait(priv); |
| 3209 | if (rc) { | 3219 | if (ret) { |
| 3210 | IPW_ERROR("dmaWaitSync Failed\n"); | 3220 | IPW_ERROR("dmaWaitSync Failed\n"); |
| 3211 | goto out; | 3221 | goto out; |
| 3212 | } | 3222 | } |
| 3213 | out: | 3223 | out: |
| 3214 | pci_free_consistent(priv->pci_dev, len, shared_virt, shared_phys); | 3224 | for (i = 0; i < total_nr; i++) |
| 3215 | return rc; | 3225 | pci_pool_free(pool, virts[i], phys[i]); |
| 3226 | |||
| 3227 | pci_pool_destroy(pool); | ||
| 3228 | |||
| 3229 | return ret; | ||
| 3216 | } | 3230 | } |
| 3217 | 3231 | ||
| 3218 | /* stop nic */ | 3232 | /* stop nic */ |
diff --git a/drivers/net/wireless/orinoco/hw.c b/drivers/net/wireless/orinoco/hw.c index 632fac86a308..b3946272c72e 100644 --- a/drivers/net/wireless/orinoco/hw.c +++ b/drivers/net/wireless/orinoco/hw.c | |||
| @@ -70,7 +70,7 @@ int orinoco_hw_get_tkip_iv(struct orinoco_private *priv, int key, u8 *tsc) | |||
| 70 | int err = 0; | 70 | int err = 0; |
| 71 | u8 tsc_arr[4][IW_ENCODE_SEQ_MAX_SIZE]; | 71 | u8 tsc_arr[4][IW_ENCODE_SEQ_MAX_SIZE]; |
| 72 | 72 | ||
| 73 | if ((key < 0) || (key > 4)) | 73 | if ((key < 0) || (key >= 4)) |
| 74 | return -EINVAL; | 74 | return -EINVAL; |
| 75 | 75 | ||
| 76 | err = hermes_read_ltv(hw, USER_BAP, HERMES_RID_CURRENT_TKIP_IV, | 76 | err = hermes_read_ltv(hw, USER_BAP, HERMES_RID_CURRENT_TKIP_IV, |
diff --git a/drivers/net/wireless/rtl818x/rtl8187_dev.c b/drivers/net/wireless/rtl818x/rtl8187_dev.c index 294250e294dd..87a95588a8e3 100644 --- a/drivers/net/wireless/rtl818x/rtl8187_dev.c +++ b/drivers/net/wireless/rtl818x/rtl8187_dev.c | |||
| @@ -869,6 +869,9 @@ static int rtl8187b_init_hw(struct ieee80211_hw *dev) | |||
| 869 | priv->aifsn[3] = 3; /* AIFSN[AC_BE] */ | 869 | priv->aifsn[3] = 3; /* AIFSN[AC_BE] */ |
| 870 | rtl818x_iowrite8(priv, &priv->map->ACM_CONTROL, 0); | 870 | rtl818x_iowrite8(priv, &priv->map->ACM_CONTROL, 0); |
| 871 | 871 | ||
| 872 | /* ENEDCA flag must always be set, transmit issues? */ | ||
| 873 | rtl818x_iowrite8(priv, &priv->map->MSR, RTL818X_MSR_ENEDCA); | ||
| 874 | |||
| 872 | return 0; | 875 | return 0; |
| 873 | } | 876 | } |
| 874 | 877 | ||
| @@ -1173,13 +1176,16 @@ static void rtl8187_bss_info_changed(struct ieee80211_hw *dev, | |||
| 1173 | rtl818x_iowrite8(priv, &priv->map->BSSID[i], | 1176 | rtl818x_iowrite8(priv, &priv->map->BSSID[i], |
| 1174 | info->bssid[i]); | 1177 | info->bssid[i]); |
| 1175 | 1178 | ||
| 1179 | if (priv->is_rtl8187b) | ||
| 1180 | reg = RTL818X_MSR_ENEDCA; | ||
| 1181 | else | ||
| 1182 | reg = 0; | ||
| 1183 | |||
| 1176 | if (is_valid_ether_addr(info->bssid)) { | 1184 | if (is_valid_ether_addr(info->bssid)) { |
| 1177 | reg = RTL818X_MSR_INFRA; | 1185 | reg |= RTL818X_MSR_INFRA; |
| 1178 | if (priv->is_rtl8187b) | ||
| 1179 | reg |= RTL818X_MSR_ENEDCA; | ||
| 1180 | rtl818x_iowrite8(priv, &priv->map->MSR, reg); | 1186 | rtl818x_iowrite8(priv, &priv->map->MSR, reg); |
| 1181 | } else { | 1187 | } else { |
| 1182 | reg = RTL818X_MSR_NO_LINK; | 1188 | reg |= RTL818X_MSR_NO_LINK; |
| 1183 | rtl818x_iowrite8(priv, &priv->map->MSR, reg); | 1189 | rtl818x_iowrite8(priv, &priv->map->MSR, reg); |
| 1184 | } | 1190 | } |
| 1185 | 1191 | ||
diff --git a/drivers/net/yellowfin.c b/drivers/net/yellowfin.c index a07580138e81..c2fd6187773f 100644 --- a/drivers/net/yellowfin.c +++ b/drivers/net/yellowfin.c | |||
| @@ -346,7 +346,7 @@ static int netdev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); | |||
| 346 | static int yellowfin_open(struct net_device *dev); | 346 | static int yellowfin_open(struct net_device *dev); |
| 347 | static void yellowfin_timer(unsigned long data); | 347 | static void yellowfin_timer(unsigned long data); |
| 348 | static void yellowfin_tx_timeout(struct net_device *dev); | 348 | static void yellowfin_tx_timeout(struct net_device *dev); |
| 349 | static void yellowfin_init_ring(struct net_device *dev); | 349 | static int yellowfin_init_ring(struct net_device *dev); |
| 350 | static int yellowfin_start_xmit(struct sk_buff *skb, struct net_device *dev); | 350 | static int yellowfin_start_xmit(struct sk_buff *skb, struct net_device *dev); |
| 351 | static irqreturn_t yellowfin_interrupt(int irq, void *dev_instance); | 351 | static irqreturn_t yellowfin_interrupt(int irq, void *dev_instance); |
| 352 | static int yellowfin_rx(struct net_device *dev); | 352 | static int yellowfin_rx(struct net_device *dev); |
| @@ -573,19 +573,24 @@ static int yellowfin_open(struct net_device *dev) | |||
| 573 | { | 573 | { |
| 574 | struct yellowfin_private *yp = netdev_priv(dev); | 574 | struct yellowfin_private *yp = netdev_priv(dev); |
| 575 | void __iomem *ioaddr = yp->base; | 575 | void __iomem *ioaddr = yp->base; |
| 576 | int i; | 576 | int i, ret; |
| 577 | 577 | ||
| 578 | /* Reset the chip. */ | 578 | /* Reset the chip. */ |
| 579 | iowrite32(0x80000000, ioaddr + DMACtrl); | 579 | iowrite32(0x80000000, ioaddr + DMACtrl); |
| 580 | 580 | ||
| 581 | i = request_irq(dev->irq, &yellowfin_interrupt, IRQF_SHARED, dev->name, dev); | 581 | ret = request_irq(dev->irq, &yellowfin_interrupt, IRQF_SHARED, dev->name, dev); |
| 582 | if (i) return i; | 582 | if (ret) |
| 583 | return ret; | ||
| 583 | 584 | ||
| 584 | if (yellowfin_debug > 1) | 585 | if (yellowfin_debug > 1) |
| 585 | printk(KERN_DEBUG "%s: yellowfin_open() irq %d.\n", | 586 | printk(KERN_DEBUG "%s: yellowfin_open() irq %d.\n", |
| 586 | dev->name, dev->irq); | 587 | dev->name, dev->irq); |
| 587 | 588 | ||
| 588 | yellowfin_init_ring(dev); | 589 | ret = yellowfin_init_ring(dev); |
| 590 | if (ret) { | ||
| 591 | free_irq(dev->irq, dev); | ||
| 592 | return ret; | ||
| 593 | } | ||
| 589 | 594 | ||
| 590 | iowrite32(yp->rx_ring_dma, ioaddr + RxPtr); | 595 | iowrite32(yp->rx_ring_dma, ioaddr + RxPtr); |
| 591 | iowrite32(yp->tx_ring_dma, ioaddr + TxPtr); | 596 | iowrite32(yp->tx_ring_dma, ioaddr + TxPtr); |
| @@ -725,10 +730,10 @@ static void yellowfin_tx_timeout(struct net_device *dev) | |||
| 725 | } | 730 | } |
| 726 | 731 | ||
| 727 | /* Initialize the Rx and Tx rings, along with various 'dev' bits. */ | 732 | /* Initialize the Rx and Tx rings, along with various 'dev' bits. */ |
| 728 | static void yellowfin_init_ring(struct net_device *dev) | 733 | static int yellowfin_init_ring(struct net_device *dev) |
| 729 | { | 734 | { |
| 730 | struct yellowfin_private *yp = netdev_priv(dev); | 735 | struct yellowfin_private *yp = netdev_priv(dev); |
| 731 | int i; | 736 | int i, j; |
| 732 | 737 | ||
| 733 | yp->tx_full = 0; | 738 | yp->tx_full = 0; |
| 734 | yp->cur_rx = yp->cur_tx = 0; | 739 | yp->cur_rx = yp->cur_tx = 0; |
| @@ -753,6 +758,11 @@ static void yellowfin_init_ring(struct net_device *dev) | |||
| 753 | yp->rx_ring[i].addr = cpu_to_le32(pci_map_single(yp->pci_dev, | 758 | yp->rx_ring[i].addr = cpu_to_le32(pci_map_single(yp->pci_dev, |
| 754 | skb->data, yp->rx_buf_sz, PCI_DMA_FROMDEVICE)); | 759 | skb->data, yp->rx_buf_sz, PCI_DMA_FROMDEVICE)); |
| 755 | } | 760 | } |
| 761 | if (i != RX_RING_SIZE) { | ||
| 762 | for (j = 0; j < i; j++) | ||
| 763 | dev_kfree_skb(yp->rx_skbuff[j]); | ||
| 764 | return -ENOMEM; | ||
| 765 | } | ||
| 756 | yp->rx_ring[i-1].dbdma_cmd = cpu_to_le32(CMD_STOP); | 766 | yp->rx_ring[i-1].dbdma_cmd = cpu_to_le32(CMD_STOP); |
| 757 | yp->dirty_rx = (unsigned int)(i - RX_RING_SIZE); | 767 | yp->dirty_rx = (unsigned int)(i - RX_RING_SIZE); |
| 758 | 768 | ||
| @@ -769,8 +779,6 @@ static void yellowfin_init_ring(struct net_device *dev) | |||
| 769 | yp->tx_ring[--i].dbdma_cmd = cpu_to_le32(CMD_STOP | BRANCH_ALWAYS); | 779 | yp->tx_ring[--i].dbdma_cmd = cpu_to_le32(CMD_STOP | BRANCH_ALWAYS); |
| 770 | #else | 780 | #else |
| 771 | { | 781 | { |
| 772 | int j; | ||
| 773 | |||
| 774 | /* Tx ring needs a pair of descriptors, the second for the status. */ | 782 | /* Tx ring needs a pair of descriptors, the second for the status. */ |
| 775 | for (i = 0; i < TX_RING_SIZE; i++) { | 783 | for (i = 0; i < TX_RING_SIZE; i++) { |
| 776 | j = 2*i; | 784 | j = 2*i; |
| @@ -805,7 +813,7 @@ static void yellowfin_init_ring(struct net_device *dev) | |||
| 805 | } | 813 | } |
| 806 | #endif | 814 | #endif |
| 807 | yp->tx_tail_desc = &yp->tx_status[0]; | 815 | yp->tx_tail_desc = &yp->tx_status[0]; |
| 808 | return; | 816 | return 0; |
| 809 | } | 817 | } |
| 810 | 818 | ||
| 811 | static int yellowfin_start_xmit(struct sk_buff *skb, struct net_device *dev) | 819 | static int yellowfin_start_xmit(struct sk_buff *skb, struct net_device *dev) |
diff --git a/drivers/pci/iov.c b/drivers/pci/iov.c index e3a87210e947..e03fe98f0619 100644 --- a/drivers/pci/iov.c +++ b/drivers/pci/iov.c | |||
| @@ -598,6 +598,29 @@ int pci_iov_resource_bar(struct pci_dev *dev, int resno, | |||
| 598 | } | 598 | } |
| 599 | 599 | ||
| 600 | /** | 600 | /** |
| 601 | * pci_sriov_resource_alignment - get resource alignment for VF BAR | ||
| 602 | * @dev: the PCI device | ||
| 603 | * @resno: the resource number | ||
| 604 | * | ||
| 605 | * Returns the alignment of the VF BAR found in the SR-IOV capability. | ||
| 606 | * This is not the same as the resource size which is defined as | ||
| 607 | * the VF BAR size multiplied by the number of VFs. The alignment | ||
| 608 | * is just the VF BAR size. | ||
| 609 | */ | ||
| 610 | int pci_sriov_resource_alignment(struct pci_dev *dev, int resno) | ||
| 611 | { | ||
| 612 | struct resource tmp; | ||
| 613 | enum pci_bar_type type; | ||
| 614 | int reg = pci_iov_resource_bar(dev, resno, &type); | ||
| 615 | |||
| 616 | if (!reg) | ||
| 617 | return 0; | ||
| 618 | |||
| 619 | __pci_read_base(dev, type, &tmp, reg); | ||
| 620 | return resource_alignment(&tmp); | ||
| 621 | } | ||
| 622 | |||
| 623 | /** | ||
| 601 | * pci_restore_iov_state - restore the state of the IOV capability | 624 | * pci_restore_iov_state - restore the state of the IOV capability |
| 602 | * @dev: the PCI device | 625 | * @dev: the PCI device |
| 603 | */ | 626 | */ |
diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h index f73bcbedf37c..5ff4d25bf0e9 100644 --- a/drivers/pci/pci.h +++ b/drivers/pci/pci.h | |||
| @@ -243,6 +243,7 @@ extern int pci_iov_init(struct pci_dev *dev); | |||
| 243 | extern void pci_iov_release(struct pci_dev *dev); | 243 | extern void pci_iov_release(struct pci_dev *dev); |
| 244 | extern int pci_iov_resource_bar(struct pci_dev *dev, int resno, | 244 | extern int pci_iov_resource_bar(struct pci_dev *dev, int resno, |
| 245 | enum pci_bar_type *type); | 245 | enum pci_bar_type *type); |
| 246 | extern int pci_sriov_resource_alignment(struct pci_dev *dev, int resno); | ||
| 246 | extern void pci_restore_iov_state(struct pci_dev *dev); | 247 | extern void pci_restore_iov_state(struct pci_dev *dev); |
| 247 | extern int pci_iov_bus_range(struct pci_bus *bus); | 248 | extern int pci_iov_bus_range(struct pci_bus *bus); |
| 248 | 249 | ||
| @@ -298,4 +299,16 @@ static inline int pci_ats_enabled(struct pci_dev *dev) | |||
| 298 | } | 299 | } |
| 299 | #endif /* CONFIG_PCI_IOV */ | 300 | #endif /* CONFIG_PCI_IOV */ |
| 300 | 301 | ||
| 302 | static inline int pci_resource_alignment(struct pci_dev *dev, | ||
| 303 | struct resource *res) | ||
| 304 | { | ||
| 305 | #ifdef CONFIG_PCI_IOV | ||
| 306 | int resno = res - dev->resource; | ||
| 307 | |||
| 308 | if (resno >= PCI_IOV_RESOURCES && resno <= PCI_IOV_RESOURCE_END) | ||
| 309 | return pci_sriov_resource_alignment(dev, resno); | ||
| 310 | #endif | ||
| 311 | return resource_alignment(res); | ||
| 312 | } | ||
| 313 | |||
| 301 | #endif /* DRIVERS_PCI_H */ | 314 | #endif /* DRIVERS_PCI_H */ |
diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c index b636e245445d..7c443b4583ab 100644 --- a/drivers/pci/setup-bus.c +++ b/drivers/pci/setup-bus.c | |||
| @@ -25,7 +25,7 @@ | |||
| 25 | #include <linux/ioport.h> | 25 | #include <linux/ioport.h> |
| 26 | #include <linux/cache.h> | 26 | #include <linux/cache.h> |
| 27 | #include <linux/slab.h> | 27 | #include <linux/slab.h> |
| 28 | 28 | #include "pci.h" | |
| 29 | 29 | ||
| 30 | static void pbus_assign_resources_sorted(const struct pci_bus *bus) | 30 | static void pbus_assign_resources_sorted(const struct pci_bus *bus) |
| 31 | { | 31 | { |
| @@ -384,7 +384,7 @@ static int pbus_size_mem(struct pci_bus *bus, unsigned long mask, unsigned long | |||
| 384 | continue; | 384 | continue; |
| 385 | r_size = resource_size(r); | 385 | r_size = resource_size(r); |
| 386 | /* For bridges size != alignment */ | 386 | /* For bridges size != alignment */ |
| 387 | align = resource_alignment(r); | 387 | align = pci_resource_alignment(dev, r); |
| 388 | order = __ffs(align) - 20; | 388 | order = __ffs(align) - 20; |
| 389 | if (order > 11) { | 389 | if (order > 11) { |
| 390 | dev_warn(&dev->dev, "BAR %d bad alignment %llx: " | 390 | dev_warn(&dev->dev, "BAR %d bad alignment %llx: " |
diff --git a/drivers/pci/setup-res.c b/drivers/pci/setup-res.c index 1898c7b47907..88cdd1a937d6 100644 --- a/drivers/pci/setup-res.c +++ b/drivers/pci/setup-res.c | |||
| @@ -144,7 +144,7 @@ static int __pci_assign_resource(struct pci_bus *bus, struct pci_dev *dev, | |||
| 144 | 144 | ||
| 145 | size = resource_size(res); | 145 | size = resource_size(res); |
| 146 | min = (res->flags & IORESOURCE_IO) ? PCIBIOS_MIN_IO : PCIBIOS_MIN_MEM; | 146 | min = (res->flags & IORESOURCE_IO) ? PCIBIOS_MIN_IO : PCIBIOS_MIN_MEM; |
| 147 | align = resource_alignment(res); | 147 | align = pci_resource_alignment(dev, res); |
| 148 | 148 | ||
| 149 | /* First, try exact prefetching match.. */ | 149 | /* First, try exact prefetching match.. */ |
| 150 | ret = pci_bus_alloc_resource(bus, res, size, align, min, | 150 | ret = pci_bus_alloc_resource(bus, res, size, align, min, |
| @@ -178,7 +178,7 @@ int pci_assign_resource(struct pci_dev *dev, int resno) | |||
| 178 | struct pci_bus *bus; | 178 | struct pci_bus *bus; |
| 179 | int ret; | 179 | int ret; |
| 180 | 180 | ||
| 181 | align = resource_alignment(res); | 181 | align = pci_resource_alignment(dev, res); |
| 182 | if (!align) { | 182 | if (!align) { |
| 183 | dev_info(&dev->dev, "BAR %d: can't allocate resource (bogus " | 183 | dev_info(&dev->dev, "BAR %d: can't allocate resource (bogus " |
| 184 | "alignment) %pR flags %#lx\n", | 184 | "alignment) %pR flags %#lx\n", |
| @@ -259,7 +259,7 @@ void pdev_sort_resources(struct pci_dev *dev, struct resource_list *head) | |||
| 259 | if (!(r->flags) || r->parent) | 259 | if (!(r->flags) || r->parent) |
| 260 | continue; | 260 | continue; |
| 261 | 261 | ||
| 262 | r_align = resource_alignment(r); | 262 | r_align = pci_resource_alignment(dev, r); |
| 263 | if (!r_align) { | 263 | if (!r_align) { |
| 264 | dev_warn(&dev->dev, "BAR %d: bogus alignment " | 264 | dev_warn(&dev->dev, "BAR %d: bogus alignment " |
| 265 | "%pR flags %#lx\n", | 265 | "%pR flags %#lx\n", |
| @@ -271,7 +271,7 @@ void pdev_sort_resources(struct pci_dev *dev, struct resource_list *head) | |||
| 271 | struct resource_list *ln = list->next; | 271 | struct resource_list *ln = list->next; |
| 272 | 272 | ||
| 273 | if (ln) | 273 | if (ln) |
| 274 | align = resource_alignment(ln->res); | 274 | align = pci_resource_alignment(ln->dev, ln->res); |
| 275 | 275 | ||
| 276 | if (r_align > align) { | 276 | if (r_align > align) { |
| 277 | tmp = kmalloc(sizeof(*tmp), GFP_KERNEL); | 277 | tmp = kmalloc(sizeof(*tmp), GFP_KERNEL); |
diff --git a/drivers/platform/x86/toshiba_acpi.c b/drivers/platform/x86/toshiba_acpi.c index 81d31ea507d1..51c0a8bee414 100644 --- a/drivers/platform/x86/toshiba_acpi.c +++ b/drivers/platform/x86/toshiba_acpi.c | |||
| @@ -335,6 +335,7 @@ static void bt_rfkill_poll(struct rfkill *rfkill, void *data) | |||
| 335 | if (hci_result != HCI_SUCCESS) { | 335 | if (hci_result != HCI_SUCCESS) { |
| 336 | /* Can't do anything useful */ | 336 | /* Can't do anything useful */ |
| 337 | mutex_unlock(&dev->mutex); | 337 | mutex_unlock(&dev->mutex); |
| 338 | return; | ||
| 338 | } | 339 | } |
| 339 | 340 | ||
| 340 | new_rfk_state = value; | 341 | new_rfk_state = value; |
diff --git a/drivers/platform/x86/wmi.c b/drivers/platform/x86/wmi.c index 043b208d971d..f215a5919192 100644 --- a/drivers/platform/x86/wmi.c +++ b/drivers/platform/x86/wmi.c | |||
| @@ -270,7 +270,7 @@ u32 method_id, const struct acpi_buffer *in, struct acpi_buffer *out) | |||
| 270 | acpi_status status; | 270 | acpi_status status; |
| 271 | struct acpi_object_list input; | 271 | struct acpi_object_list input; |
| 272 | union acpi_object params[3]; | 272 | union acpi_object params[3]; |
| 273 | char method[4] = "WM"; | 273 | char method[5] = "WM"; |
| 274 | 274 | ||
| 275 | if (!find_guid(guid_string, &wblock)) | 275 | if (!find_guid(guid_string, &wblock)) |
| 276 | return AE_ERROR; | 276 | return AE_ERROR; |
| @@ -328,8 +328,8 @@ struct acpi_buffer *out) | |||
| 328 | acpi_status status, wc_status = AE_ERROR; | 328 | acpi_status status, wc_status = AE_ERROR; |
| 329 | struct acpi_object_list input, wc_input; | 329 | struct acpi_object_list input, wc_input; |
| 330 | union acpi_object wc_params[1], wq_params[1]; | 330 | union acpi_object wc_params[1], wq_params[1]; |
| 331 | char method[4]; | 331 | char method[5]; |
| 332 | char wc_method[4] = "WC"; | 332 | char wc_method[5] = "WC"; |
| 333 | 333 | ||
| 334 | if (!guid_string || !out) | 334 | if (!guid_string || !out) |
| 335 | return AE_BAD_PARAMETER; | 335 | return AE_BAD_PARAMETER; |
| @@ -410,7 +410,7 @@ const struct acpi_buffer *in) | |||
| 410 | acpi_handle handle; | 410 | acpi_handle handle; |
| 411 | struct acpi_object_list input; | 411 | struct acpi_object_list input; |
| 412 | union acpi_object params[2]; | 412 | union acpi_object params[2]; |
| 413 | char method[4] = "WS"; | 413 | char method[5] = "WS"; |
| 414 | 414 | ||
| 415 | if (!guid_string || !in) | 415 | if (!guid_string || !in) |
| 416 | return AE_BAD_DATA; | 416 | return AE_BAD_DATA; |
diff --git a/drivers/pps/pps.c b/drivers/pps/pps.c index ac8cc8cea1e3..fea17e7805e9 100644 --- a/drivers/pps/pps.c +++ b/drivers/pps/pps.c | |||
| @@ -244,7 +244,7 @@ int pps_register_cdev(struct pps_device *pps) | |||
| 244 | } | 244 | } |
| 245 | pps->dev = device_create(pps_class, pps->info.dev, pps->devno, NULL, | 245 | pps->dev = device_create(pps_class, pps->info.dev, pps->devno, NULL, |
| 246 | "pps%d", pps->id); | 246 | "pps%d", pps->id); |
| 247 | if (err) | 247 | if (IS_ERR(pps->dev)) |
| 248 | goto del_cdev; | 248 | goto del_cdev; |
| 249 | dev_set_drvdata(pps->dev, pps); | 249 | dev_set_drvdata(pps->dev, pps); |
| 250 | 250 | ||
diff --git a/drivers/s390/block/dasd.c b/drivers/s390/block/dasd.c index 749836668655..3f62dd50bbbe 100644 --- a/drivers/s390/block/dasd.c +++ b/drivers/s390/block/dasd.c | |||
| @@ -2135,9 +2135,9 @@ static int dasd_getgeo(struct block_device *bdev, struct hd_geometry *geo) | |||
| 2135 | struct dasd_device *base; | 2135 | struct dasd_device *base; |
| 2136 | 2136 | ||
| 2137 | block = bdev->bd_disk->private_data; | 2137 | block = bdev->bd_disk->private_data; |
| 2138 | base = block->base; | ||
| 2139 | if (!block) | 2138 | if (!block) |
| 2140 | return -ENODEV; | 2139 | return -ENODEV; |
| 2140 | base = block->base; | ||
| 2141 | 2141 | ||
| 2142 | if (!base->discipline || | 2142 | if (!base->discipline || |
| 2143 | !base->discipline->fill_geometry) | 2143 | !base->discipline->fill_geometry) |
diff --git a/drivers/s390/cio/device.c b/drivers/s390/cio/device.c index 3c57c1a18bb8..d593bc76afe3 100644 --- a/drivers/s390/cio/device.c +++ b/drivers/s390/cio/device.c | |||
| @@ -772,10 +772,8 @@ static struct ccw_device * io_subchannel_create_ccwdev(struct subchannel *sch) | |||
| 772 | cdev = io_subchannel_allocate_dev(sch); | 772 | cdev = io_subchannel_allocate_dev(sch); |
| 773 | if (!IS_ERR(cdev)) { | 773 | if (!IS_ERR(cdev)) { |
| 774 | ret = io_subchannel_initialize_dev(sch, cdev); | 774 | ret = io_subchannel_initialize_dev(sch, cdev); |
| 775 | if (ret) { | 775 | if (ret) |
| 776 | kfree(cdev); | ||
| 777 | cdev = ERR_PTR(ret); | 776 | cdev = ERR_PTR(ret); |
| 778 | } | ||
| 779 | } | 777 | } |
| 780 | return cdev; | 778 | return cdev; |
| 781 | } | 779 | } |
diff --git a/drivers/sbus/char/bbc_envctrl.c b/drivers/sbus/char/bbc_envctrl.c index 15dab96d05e3..7c815d3327f7 100644 --- a/drivers/sbus/char/bbc_envctrl.c +++ b/drivers/sbus/char/bbc_envctrl.c | |||
| @@ -537,8 +537,12 @@ int bbc_envctrl_init(struct bbc_i2c_bus *bp) | |||
| 537 | } | 537 | } |
| 538 | if (temp_index != 0 && fan_index != 0) { | 538 | if (temp_index != 0 && fan_index != 0) { |
| 539 | kenvctrld_task = kthread_run(kenvctrld, NULL, "kenvctrld"); | 539 | kenvctrld_task = kthread_run(kenvctrld, NULL, "kenvctrld"); |
| 540 | if (IS_ERR(kenvctrld_task)) | 540 | if (IS_ERR(kenvctrld_task)) { |
| 541 | return PTR_ERR(kenvctrld_task); | 541 | int err = PTR_ERR(kenvctrld_task); |
| 542 | |||
| 543 | kenvctrld_task = NULL; | ||
| 544 | return err; | ||
| 545 | } | ||
| 542 | } | 546 | } |
| 543 | 547 | ||
| 544 | return 0; | 548 | return 0; |
| @@ -561,7 +565,8 @@ void bbc_envctrl_cleanup(struct bbc_i2c_bus *bp) | |||
| 561 | struct bbc_cpu_temperature *tp, *tpos; | 565 | struct bbc_cpu_temperature *tp, *tpos; |
| 562 | struct bbc_fan_control *fp, *fpos; | 566 | struct bbc_fan_control *fp, *fpos; |
| 563 | 567 | ||
| 564 | kthread_stop(kenvctrld_task); | 568 | if (kenvctrld_task) |
| 569 | kthread_stop(kenvctrld_task); | ||
| 565 | 570 | ||
| 566 | list_for_each_entry_safe(tp, tpos, &bp->temps, bp_list) { | 571 | list_for_each_entry_safe(tp, tpos, &bp->temps, bp_list) { |
| 567 | list_del(&tp->bp_list); | 572 | list_del(&tp->bp_list); |
diff --git a/drivers/thermal/thermal_sys.c b/drivers/thermal/thermal_sys.c index 0a69672097a8..4e83c297ec9e 100644 --- a/drivers/thermal/thermal_sys.c +++ b/drivers/thermal/thermal_sys.c | |||
| @@ -953,7 +953,12 @@ void thermal_zone_device_update(struct thermal_zone_device *tz) | |||
| 953 | 953 | ||
| 954 | mutex_lock(&tz->lock); | 954 | mutex_lock(&tz->lock); |
| 955 | 955 | ||
| 956 | tz->ops->get_temp(tz, &temp); | 956 | if (tz->ops->get_temp(tz, &temp)) { |
| 957 | /* get_temp failed - retry it later */ | ||
| 958 | printk(KERN_WARNING PREFIX "failed to read out thermal zone " | ||
| 959 | "%d\n", tz->id); | ||
| 960 | goto leave; | ||
| 961 | } | ||
| 957 | 962 | ||
| 958 | for (count = 0; count < tz->trips; count++) { | 963 | for (count = 0; count < tz->trips; count++) { |
| 959 | tz->ops->get_trip_type(tz, count, &trip_type); | 964 | tz->ops->get_trip_type(tz, count, &trip_type); |
| @@ -1005,6 +1010,8 @@ void thermal_zone_device_update(struct thermal_zone_device *tz) | |||
| 1005 | THERMAL_TRIPS_NONE); | 1010 | THERMAL_TRIPS_NONE); |
| 1006 | 1011 | ||
| 1007 | tz->last_temperature = temp; | 1012 | tz->last_temperature = temp; |
| 1013 | |||
| 1014 | leave: | ||
| 1008 | if (tz->passive) | 1015 | if (tz->passive) |
| 1009 | thermal_zone_device_set_polling(tz, tz->passive_delay); | 1016 | thermal_zone_device_set_polling(tz, tz->passive_delay); |
| 1010 | else if (tz->polling_delay) | 1017 | else if (tz->polling_delay) |
diff --git a/drivers/video/xen-fbfront.c b/drivers/video/xen-fbfront.c index 15502d5e3641..54cd91610174 100644 --- a/drivers/video/xen-fbfront.c +++ b/drivers/video/xen-fbfront.c | |||
| @@ -454,6 +454,10 @@ static int __devinit xenfb_probe(struct xenbus_device *dev, | |||
| 454 | 454 | ||
| 455 | xenfb_init_shared_page(info, fb_info); | 455 | xenfb_init_shared_page(info, fb_info); |
| 456 | 456 | ||
| 457 | ret = xenfb_connect_backend(dev, info); | ||
| 458 | if (ret < 0) | ||
| 459 | goto error; | ||
| 460 | |||
| 457 | ret = register_framebuffer(fb_info); | 461 | ret = register_framebuffer(fb_info); |
| 458 | if (ret) { | 462 | if (ret) { |
| 459 | fb_deferred_io_cleanup(fb_info); | 463 | fb_deferred_io_cleanup(fb_info); |
| @@ -464,10 +468,6 @@ static int __devinit xenfb_probe(struct xenbus_device *dev, | |||
| 464 | } | 468 | } |
| 465 | info->fb_info = fb_info; | 469 | info->fb_info = fb_info; |
| 466 | 470 | ||
| 467 | ret = xenfb_connect_backend(dev, info); | ||
| 468 | if (ret < 0) | ||
| 469 | goto error; | ||
| 470 | |||
| 471 | xenfb_make_preferred_console(); | 471 | xenfb_make_preferred_console(); |
| 472 | return 0; | 472 | return 0; |
| 473 | 473 | ||
diff --git a/drivers/watchdog/ar7_wdt.c b/drivers/watchdog/ar7_wdt.c index 3fe9742c23ca..2f8643efe92c 100644 --- a/drivers/watchdog/ar7_wdt.c +++ b/drivers/watchdog/ar7_wdt.c | |||
| @@ -37,7 +37,7 @@ | |||
| 37 | #include <linux/uaccess.h> | 37 | #include <linux/uaccess.h> |
| 38 | 38 | ||
| 39 | #include <asm/addrspace.h> | 39 | #include <asm/addrspace.h> |
| 40 | #include <asm/ar7/ar7.h> | 40 | #include <asm/mach-ar7/ar7.h> |
| 41 | 41 | ||
| 42 | #define DRVNAME "ar7_wdt" | 42 | #define DRVNAME "ar7_wdt" |
| 43 | #define LONGNAME "TI AR7 Watchdog Timer" | 43 | #define LONGNAME "TI AR7 Watchdog Timer" |
diff --git a/fs/9p/v9fs.c b/fs/9p/v9fs.c index 332b5ff02fec..f7003cfac63d 100644 --- a/fs/9p/v9fs.c +++ b/fs/9p/v9fs.c | |||
| @@ -76,7 +76,7 @@ static const match_table_t tokens = { | |||
| 76 | * Return 0 upon success, -ERRNO upon failure. | 76 | * Return 0 upon success, -ERRNO upon failure. |
| 77 | */ | 77 | */ |
| 78 | 78 | ||
| 79 | static int v9fs_parse_options(struct v9fs_session_info *v9ses) | 79 | static int v9fs_parse_options(struct v9fs_session_info *v9ses, char *opts) |
| 80 | { | 80 | { |
| 81 | char *options; | 81 | char *options; |
| 82 | substring_t args[MAX_OPT_ARGS]; | 82 | substring_t args[MAX_OPT_ARGS]; |
| @@ -90,10 +90,10 @@ static int v9fs_parse_options(struct v9fs_session_info *v9ses) | |||
| 90 | v9ses->debug = 0; | 90 | v9ses->debug = 0; |
| 91 | v9ses->cache = 0; | 91 | v9ses->cache = 0; |
| 92 | 92 | ||
| 93 | if (!v9ses->options) | 93 | if (!opts) |
| 94 | return 0; | 94 | return 0; |
| 95 | 95 | ||
| 96 | options = kstrdup(v9ses->options, GFP_KERNEL); | 96 | options = kstrdup(opts, GFP_KERNEL); |
| 97 | if (!options) { | 97 | if (!options) { |
| 98 | P9_DPRINTK(P9_DEBUG_ERROR, | 98 | P9_DPRINTK(P9_DEBUG_ERROR, |
| 99 | "failed to allocate copy of option string\n"); | 99 | "failed to allocate copy of option string\n"); |
| @@ -206,24 +206,14 @@ struct p9_fid *v9fs_session_init(struct v9fs_session_info *v9ses, | |||
| 206 | v9ses->uid = ~0; | 206 | v9ses->uid = ~0; |
| 207 | v9ses->dfltuid = V9FS_DEFUID; | 207 | v9ses->dfltuid = V9FS_DEFUID; |
| 208 | v9ses->dfltgid = V9FS_DEFGID; | 208 | v9ses->dfltgid = V9FS_DEFGID; |
| 209 | if (data) { | ||
| 210 | v9ses->options = kstrdup(data, GFP_KERNEL); | ||
| 211 | if (!v9ses->options) { | ||
| 212 | P9_DPRINTK(P9_DEBUG_ERROR, | ||
| 213 | "failed to allocate copy of option string\n"); | ||
| 214 | retval = -ENOMEM; | ||
| 215 | goto error; | ||
| 216 | } | ||
| 217 | } | ||
| 218 | 209 | ||
| 219 | rc = v9fs_parse_options(v9ses); | 210 | rc = v9fs_parse_options(v9ses, data); |
| 220 | if (rc < 0) { | 211 | if (rc < 0) { |
| 221 | retval = rc; | 212 | retval = rc; |
| 222 | goto error; | 213 | goto error; |
| 223 | } | 214 | } |
| 224 | 215 | ||
| 225 | v9ses->clnt = p9_client_create(dev_name, v9ses->options); | 216 | v9ses->clnt = p9_client_create(dev_name, data); |
| 226 | |||
| 227 | if (IS_ERR(v9ses->clnt)) { | 217 | if (IS_ERR(v9ses->clnt)) { |
| 228 | retval = PTR_ERR(v9ses->clnt); | 218 | retval = PTR_ERR(v9ses->clnt); |
| 229 | v9ses->clnt = NULL; | 219 | v9ses->clnt = NULL; |
| @@ -280,7 +270,6 @@ void v9fs_session_close(struct v9fs_session_info *v9ses) | |||
| 280 | 270 | ||
| 281 | __putname(v9ses->uname); | 271 | __putname(v9ses->uname); |
| 282 | __putname(v9ses->aname); | 272 | __putname(v9ses->aname); |
| 283 | kfree(v9ses->options); | ||
| 284 | } | 273 | } |
| 285 | 274 | ||
| 286 | /** | 275 | /** |
diff --git a/fs/9p/v9fs.h b/fs/9p/v9fs.h index a7d567192998..38762bf102a9 100644 --- a/fs/9p/v9fs.h +++ b/fs/9p/v9fs.h | |||
| @@ -85,7 +85,6 @@ struct v9fs_session_info { | |||
| 85 | unsigned int afid; | 85 | unsigned int afid; |
| 86 | unsigned int cache; | 86 | unsigned int cache; |
| 87 | 87 | ||
| 88 | char *options; /* copy of mount options */ | ||
| 89 | char *uname; /* user name to mount as */ | 88 | char *uname; /* user name to mount as */ |
| 90 | char *aname; /* name of remote hierarchy being mounted */ | 89 | char *aname; /* name of remote hierarchy being mounted */ |
| 91 | unsigned int maxdata; /* max data for client interface */ | 90 | unsigned int maxdata; /* max data for client interface */ |
diff --git a/fs/9p/vfs_inode.c b/fs/9p/vfs_inode.c index 81f8bbf12f9f..06a223d50a81 100644 --- a/fs/9p/vfs_inode.c +++ b/fs/9p/vfs_inode.c | |||
| @@ -171,7 +171,6 @@ int v9fs_uflags2omode(int uflags, int extended) | |||
| 171 | 171 | ||
| 172 | /** | 172 | /** |
| 173 | * v9fs_blank_wstat - helper function to setup a 9P stat structure | 173 | * v9fs_blank_wstat - helper function to setup a 9P stat structure |
| 174 | * @v9ses: 9P session info (for determining extended mode) | ||
| 175 | * @wstat: structure to initialize | 174 | * @wstat: structure to initialize |
| 176 | * | 175 | * |
| 177 | */ | 176 | */ |
| @@ -207,65 +206,72 @@ v9fs_blank_wstat(struct p9_wstat *wstat) | |||
| 207 | 206 | ||
| 208 | struct inode *v9fs_get_inode(struct super_block *sb, int mode) | 207 | struct inode *v9fs_get_inode(struct super_block *sb, int mode) |
| 209 | { | 208 | { |
| 209 | int err; | ||
| 210 | struct inode *inode; | 210 | struct inode *inode; |
| 211 | struct v9fs_session_info *v9ses = sb->s_fs_info; | 211 | struct v9fs_session_info *v9ses = sb->s_fs_info; |
| 212 | 212 | ||
| 213 | P9_DPRINTK(P9_DEBUG_VFS, "super block: %p mode: %o\n", sb, mode); | 213 | P9_DPRINTK(P9_DEBUG_VFS, "super block: %p mode: %o\n", sb, mode); |
| 214 | 214 | ||
| 215 | inode = new_inode(sb); | 215 | inode = new_inode(sb); |
| 216 | if (inode) { | 216 | if (!inode) { |
| 217 | inode->i_mode = mode; | ||
| 218 | inode->i_uid = current_fsuid(); | ||
| 219 | inode->i_gid = current_fsgid(); | ||
| 220 | inode->i_blocks = 0; | ||
| 221 | inode->i_rdev = 0; | ||
| 222 | inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; | ||
| 223 | inode->i_mapping->a_ops = &v9fs_addr_operations; | ||
| 224 | |||
| 225 | switch (mode & S_IFMT) { | ||
| 226 | case S_IFIFO: | ||
| 227 | case S_IFBLK: | ||
| 228 | case S_IFCHR: | ||
| 229 | case S_IFSOCK: | ||
| 230 | if (!v9fs_extended(v9ses)) { | ||
| 231 | P9_DPRINTK(P9_DEBUG_ERROR, | ||
| 232 | "special files without extended mode\n"); | ||
| 233 | return ERR_PTR(-EINVAL); | ||
| 234 | } | ||
| 235 | init_special_inode(inode, inode->i_mode, | ||
| 236 | inode->i_rdev); | ||
| 237 | break; | ||
| 238 | case S_IFREG: | ||
| 239 | inode->i_op = &v9fs_file_inode_operations; | ||
| 240 | inode->i_fop = &v9fs_file_operations; | ||
| 241 | break; | ||
| 242 | case S_IFLNK: | ||
| 243 | if (!v9fs_extended(v9ses)) { | ||
| 244 | P9_DPRINTK(P9_DEBUG_ERROR, | ||
| 245 | "extended modes used w/o 9P2000.u\n"); | ||
| 246 | return ERR_PTR(-EINVAL); | ||
| 247 | } | ||
| 248 | inode->i_op = &v9fs_symlink_inode_operations; | ||
| 249 | break; | ||
| 250 | case S_IFDIR: | ||
| 251 | inc_nlink(inode); | ||
| 252 | if (v9fs_extended(v9ses)) | ||
| 253 | inode->i_op = &v9fs_dir_inode_operations_ext; | ||
| 254 | else | ||
| 255 | inode->i_op = &v9fs_dir_inode_operations; | ||
| 256 | inode->i_fop = &v9fs_dir_operations; | ||
| 257 | break; | ||
| 258 | default: | ||
| 259 | P9_DPRINTK(P9_DEBUG_ERROR, | ||
| 260 | "BAD mode 0x%x S_IFMT 0x%x\n", | ||
| 261 | mode, mode & S_IFMT); | ||
| 262 | return ERR_PTR(-EINVAL); | ||
| 263 | } | ||
| 264 | } else { | ||
| 265 | P9_EPRINTK(KERN_WARNING, "Problem allocating inode\n"); | 217 | P9_EPRINTK(KERN_WARNING, "Problem allocating inode\n"); |
| 266 | return ERR_PTR(-ENOMEM); | 218 | return ERR_PTR(-ENOMEM); |
| 267 | } | 219 | } |
| 220 | |||
| 221 | inode->i_mode = mode; | ||
| 222 | inode->i_uid = current_fsuid(); | ||
| 223 | inode->i_gid = current_fsgid(); | ||
| 224 | inode->i_blocks = 0; | ||
| 225 | inode->i_rdev = 0; | ||
| 226 | inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; | ||
| 227 | inode->i_mapping->a_ops = &v9fs_addr_operations; | ||
| 228 | |||
| 229 | switch (mode & S_IFMT) { | ||
| 230 | case S_IFIFO: | ||
| 231 | case S_IFBLK: | ||
| 232 | case S_IFCHR: | ||
| 233 | case S_IFSOCK: | ||
| 234 | if (!v9fs_extended(v9ses)) { | ||
| 235 | P9_DPRINTK(P9_DEBUG_ERROR, | ||
| 236 | "special files without extended mode\n"); | ||
| 237 | err = -EINVAL; | ||
| 238 | goto error; | ||
| 239 | } | ||
| 240 | init_special_inode(inode, inode->i_mode, inode->i_rdev); | ||
| 241 | break; | ||
| 242 | case S_IFREG: | ||
| 243 | inode->i_op = &v9fs_file_inode_operations; | ||
| 244 | inode->i_fop = &v9fs_file_operations; | ||
| 245 | break; | ||
| 246 | case S_IFLNK: | ||
| 247 | if (!v9fs_extended(v9ses)) { | ||
| 248 | P9_DPRINTK(P9_DEBUG_ERROR, | ||
| 249 | "extended modes used w/o 9P2000.u\n"); | ||
| 250 | err = -EINVAL; | ||
| 251 | goto error; | ||
| 252 | } | ||
| 253 | inode->i_op = &v9fs_symlink_inode_operations; | ||
| 254 | break; | ||
| 255 | case S_IFDIR: | ||
| 256 | inc_nlink(inode); | ||
| 257 | if (v9fs_extended(v9ses)) | ||
| 258 | inode->i_op = &v9fs_dir_inode_operations_ext; | ||
| 259 | else | ||
| 260 | inode->i_op = &v9fs_dir_inode_operations; | ||
| 261 | inode->i_fop = &v9fs_dir_operations; | ||
| 262 | break; | ||
| 263 | default: | ||
| 264 | P9_DPRINTK(P9_DEBUG_ERROR, "BAD mode 0x%x S_IFMT 0x%x\n", | ||
| 265 | mode, mode & S_IFMT); | ||
| 266 | err = -EINVAL; | ||
| 267 | goto error; | ||
| 268 | } | ||
| 269 | |||
| 268 | return inode; | 270 | return inode; |
| 271 | |||
| 272 | error: | ||
| 273 | iput(inode); | ||
| 274 | return ERR_PTR(err); | ||
| 269 | } | 275 | } |
| 270 | 276 | ||
| 271 | /* | 277 | /* |
| @@ -338,30 +344,25 @@ v9fs_inode_from_fid(struct v9fs_session_info *v9ses, struct p9_fid *fid, | |||
| 338 | 344 | ||
| 339 | ret = NULL; | 345 | ret = NULL; |
| 340 | st = p9_client_stat(fid); | 346 | st = p9_client_stat(fid); |
| 341 | if (IS_ERR(st)) { | 347 | if (IS_ERR(st)) |
| 342 | err = PTR_ERR(st); | 348 | return ERR_CAST(st); |
| 343 | st = NULL; | ||
| 344 | goto error; | ||
| 345 | } | ||
| 346 | 349 | ||
| 347 | umode = p9mode2unixmode(v9ses, st->mode); | 350 | umode = p9mode2unixmode(v9ses, st->mode); |
| 348 | ret = v9fs_get_inode(sb, umode); | 351 | ret = v9fs_get_inode(sb, umode); |
| 349 | if (IS_ERR(ret)) { | 352 | if (IS_ERR(ret)) { |
| 350 | err = PTR_ERR(ret); | 353 | err = PTR_ERR(ret); |
| 351 | ret = NULL; | ||
| 352 | goto error; | 354 | goto error; |
| 353 | } | 355 | } |
| 354 | 356 | ||
| 355 | v9fs_stat2inode(st, ret, sb); | 357 | v9fs_stat2inode(st, ret, sb); |
| 356 | ret->i_ino = v9fs_qid2ino(&st->qid); | 358 | ret->i_ino = v9fs_qid2ino(&st->qid); |
| 359 | p9stat_free(st); | ||
| 357 | kfree(st); | 360 | kfree(st); |
| 358 | return ret; | 361 | return ret; |
| 359 | 362 | ||
| 360 | error: | 363 | error: |
| 364 | p9stat_free(st); | ||
| 361 | kfree(st); | 365 | kfree(st); |
| 362 | if (ret) | ||
| 363 | iput(ret); | ||
| 364 | |||
| 365 | return ERR_PTR(err); | 366 | return ERR_PTR(err); |
| 366 | } | 367 | } |
| 367 | 368 | ||
| @@ -403,9 +404,9 @@ v9fs_open_created(struct inode *inode, struct file *file) | |||
| 403 | * @v9ses: session information | 404 | * @v9ses: session information |
| 404 | * @dir: directory that dentry is being created in | 405 | * @dir: directory that dentry is being created in |
| 405 | * @dentry: dentry that is being created | 406 | * @dentry: dentry that is being created |
| 407 | * @extension: 9p2000.u extension string to support devices, etc. | ||
| 406 | * @perm: create permissions | 408 | * @perm: create permissions |
| 407 | * @mode: open mode | 409 | * @mode: open mode |
| 408 | * @extension: 9p2000.u extension string to support devices, etc. | ||
| 409 | * | 410 | * |
| 410 | */ | 411 | */ |
| 411 | static struct p9_fid * | 412 | static struct p9_fid * |
| @@ -470,7 +471,10 @@ v9fs_create(struct v9fs_session_info *v9ses, struct inode *dir, | |||
| 470 | dentry->d_op = &v9fs_dentry_operations; | 471 | dentry->d_op = &v9fs_dentry_operations; |
| 471 | 472 | ||
| 472 | d_instantiate(dentry, inode); | 473 | d_instantiate(dentry, inode); |
| 473 | v9fs_fid_add(dentry, fid); | 474 | err = v9fs_fid_add(dentry, fid); |
| 475 | if (err < 0) | ||
| 476 | goto error; | ||
| 477 | |||
| 474 | return ofid; | 478 | return ofid; |
| 475 | 479 | ||
| 476 | error: | 480 | error: |
diff --git a/fs/9p/vfs_super.c b/fs/9p/vfs_super.c index 38d695d66a0b..8961f1a8f668 100644 --- a/fs/9p/vfs_super.c +++ b/fs/9p/vfs_super.c | |||
| @@ -81,7 +81,7 @@ static int v9fs_set_super(struct super_block *s, void *data) | |||
| 81 | 81 | ||
| 82 | static void | 82 | static void |
| 83 | v9fs_fill_super(struct super_block *sb, struct v9fs_session_info *v9ses, | 83 | v9fs_fill_super(struct super_block *sb, struct v9fs_session_info *v9ses, |
| 84 | int flags) | 84 | int flags, void *data) |
| 85 | { | 85 | { |
| 86 | sb->s_maxbytes = MAX_LFS_FILESIZE; | 86 | sb->s_maxbytes = MAX_LFS_FILESIZE; |
| 87 | sb->s_blocksize_bits = fls(v9ses->maxdata - 1); | 87 | sb->s_blocksize_bits = fls(v9ses->maxdata - 1); |
| @@ -91,6 +91,8 @@ v9fs_fill_super(struct super_block *sb, struct v9fs_session_info *v9ses, | |||
| 91 | 91 | ||
| 92 | sb->s_flags = flags | MS_ACTIVE | MS_SYNCHRONOUS | MS_DIRSYNC | | 92 | sb->s_flags = flags | MS_ACTIVE | MS_SYNCHRONOUS | MS_DIRSYNC | |
| 93 | MS_NOATIME; | 93 | MS_NOATIME; |
| 94 | |||
| 95 | save_mount_options(sb, data); | ||
| 94 | } | 96 | } |
| 95 | 97 | ||
| 96 | /** | 98 | /** |
| @@ -113,14 +115,11 @@ static int v9fs_get_sb(struct file_system_type *fs_type, int flags, | |||
| 113 | struct v9fs_session_info *v9ses = NULL; | 115 | struct v9fs_session_info *v9ses = NULL; |
| 114 | struct p9_wstat *st = NULL; | 116 | struct p9_wstat *st = NULL; |
| 115 | int mode = S_IRWXUGO | S_ISVTX; | 117 | int mode = S_IRWXUGO | S_ISVTX; |
| 116 | uid_t uid = current_fsuid(); | ||
| 117 | gid_t gid = current_fsgid(); | ||
| 118 | struct p9_fid *fid; | 118 | struct p9_fid *fid; |
| 119 | int retval = 0; | 119 | int retval = 0; |
| 120 | 120 | ||
| 121 | P9_DPRINTK(P9_DEBUG_VFS, " \n"); | 121 | P9_DPRINTK(P9_DEBUG_VFS, " \n"); |
| 122 | 122 | ||
| 123 | st = NULL; | ||
| 124 | v9ses = kzalloc(sizeof(struct v9fs_session_info), GFP_KERNEL); | 123 | v9ses = kzalloc(sizeof(struct v9fs_session_info), GFP_KERNEL); |
| 125 | if (!v9ses) | 124 | if (!v9ses) |
| 126 | return -ENOMEM; | 125 | return -ENOMEM; |
| @@ -142,7 +141,7 @@ static int v9fs_get_sb(struct file_system_type *fs_type, int flags, | |||
| 142 | retval = PTR_ERR(sb); | 141 | retval = PTR_ERR(sb); |
| 143 | goto free_stat; | 142 | goto free_stat; |
| 144 | } | 143 | } |
| 145 | v9fs_fill_super(sb, v9ses, flags); | 144 | v9fs_fill_super(sb, v9ses, flags, data); |
| 146 | 145 | ||
| 147 | inode = v9fs_get_inode(sb, S_IFDIR | mode); | 146 | inode = v9fs_get_inode(sb, S_IFDIR | mode); |
| 148 | if (IS_ERR(inode)) { | 147 | if (IS_ERR(inode)) { |
| @@ -150,9 +149,6 @@ static int v9fs_get_sb(struct file_system_type *fs_type, int flags, | |||
| 150 | goto release_sb; | 149 | goto release_sb; |
| 151 | } | 150 | } |
| 152 | 151 | ||
| 153 | inode->i_uid = uid; | ||
| 154 | inode->i_gid = gid; | ||
| 155 | |||
| 156 | root = d_alloc_root(inode); | 152 | root = d_alloc_root(inode); |
| 157 | if (!root) { | 153 | if (!root) { |
| 158 | iput(inode); | 154 | iput(inode); |
| @@ -173,10 +169,8 @@ P9_DPRINTK(P9_DEBUG_VFS, " simple set mount, return 0\n"); | |||
| 173 | simple_set_mnt(mnt, sb); | 169 | simple_set_mnt(mnt, sb); |
| 174 | return 0; | 170 | return 0; |
| 175 | 171 | ||
| 176 | release_sb: | ||
| 177 | deactivate_locked_super(sb); | ||
| 178 | |||
| 179 | free_stat: | 172 | free_stat: |
| 173 | p9stat_free(st); | ||
| 180 | kfree(st); | 174 | kfree(st); |
| 181 | 175 | ||
| 182 | clunk_fid: | 176 | clunk_fid: |
| @@ -185,7 +179,12 @@ clunk_fid: | |||
| 185 | close_session: | 179 | close_session: |
| 186 | v9fs_session_close(v9ses); | 180 | v9fs_session_close(v9ses); |
| 187 | kfree(v9ses); | 181 | kfree(v9ses); |
| 182 | return retval; | ||
| 188 | 183 | ||
| 184 | release_sb: | ||
| 185 | p9stat_free(st); | ||
| 186 | kfree(st); | ||
| 187 | deactivate_locked_super(sb); | ||
| 189 | return retval; | 188 | return retval; |
| 190 | } | 189 | } |
| 191 | 190 | ||
| @@ -207,24 +206,10 @@ static void v9fs_kill_super(struct super_block *s) | |||
| 207 | 206 | ||
| 208 | v9fs_session_close(v9ses); | 207 | v9fs_session_close(v9ses); |
| 209 | kfree(v9ses); | 208 | kfree(v9ses); |
| 209 | s->s_fs_info = NULL; | ||
| 210 | P9_DPRINTK(P9_DEBUG_VFS, "exiting kill_super\n"); | 210 | P9_DPRINTK(P9_DEBUG_VFS, "exiting kill_super\n"); |
| 211 | } | 211 | } |
| 212 | 212 | ||
| 213 | /** | ||
| 214 | * v9fs_show_options - Show mount options in /proc/mounts | ||
| 215 | * @m: seq_file to write to | ||
| 216 | * @mnt: mount descriptor | ||
| 217 | * | ||
| 218 | */ | ||
| 219 | |||
| 220 | static int v9fs_show_options(struct seq_file *m, struct vfsmount *mnt) | ||
| 221 | { | ||
| 222 | struct v9fs_session_info *v9ses = mnt->mnt_sb->s_fs_info; | ||
| 223 | |||
| 224 | seq_printf(m, "%s", v9ses->options); | ||
| 225 | return 0; | ||
| 226 | } | ||
| 227 | |||
| 228 | static void | 213 | static void |
| 229 | v9fs_umount_begin(struct super_block *sb) | 214 | v9fs_umount_begin(struct super_block *sb) |
| 230 | { | 215 | { |
| @@ -237,7 +222,7 @@ v9fs_umount_begin(struct super_block *sb) | |||
| 237 | static const struct super_operations v9fs_super_ops = { | 222 | static const struct super_operations v9fs_super_ops = { |
| 238 | .statfs = simple_statfs, | 223 | .statfs = simple_statfs, |
| 239 | .clear_inode = v9fs_clear_inode, | 224 | .clear_inode = v9fs_clear_inode, |
| 240 | .show_options = v9fs_show_options, | 225 | .show_options = generic_show_options, |
| 241 | .umount_begin = v9fs_umount_begin, | 226 | .umount_begin = v9fs_umount_begin, |
| 242 | }; | 227 | }; |
| 243 | 228 | ||
diff --git a/fs/afs/file.c b/fs/afs/file.c index 0149dab365e7..681c2a7b013f 100644 --- a/fs/afs/file.c +++ b/fs/afs/file.c | |||
| @@ -134,9 +134,16 @@ static int afs_readpage(struct file *file, struct page *page) | |||
| 134 | 134 | ||
| 135 | inode = page->mapping->host; | 135 | inode = page->mapping->host; |
| 136 | 136 | ||
| 137 | ASSERT(file != NULL); | 137 | if (file) { |
| 138 | key = file->private_data; | 138 | key = file->private_data; |
| 139 | ASSERT(key != NULL); | 139 | ASSERT(key != NULL); |
| 140 | } else { | ||
| 141 | key = afs_request_key(AFS_FS_S(inode->i_sb)->volume->cell); | ||
| 142 | if (IS_ERR(key)) { | ||
| 143 | ret = PTR_ERR(key); | ||
| 144 | goto error_nokey; | ||
| 145 | } | ||
| 146 | } | ||
| 140 | 147 | ||
| 141 | _enter("{%x},{%lu},{%lu}", key_serial(key), inode->i_ino, page->index); | 148 | _enter("{%x},{%lu},{%lu}", key_serial(key), inode->i_ino, page->index); |
| 142 | 149 | ||
| @@ -207,12 +214,17 @@ static int afs_readpage(struct file *file, struct page *page) | |||
| 207 | unlock_page(page); | 214 | unlock_page(page); |
| 208 | } | 215 | } |
| 209 | 216 | ||
| 217 | if (!file) | ||
| 218 | key_put(key); | ||
| 210 | _leave(" = 0"); | 219 | _leave(" = 0"); |
| 211 | return 0; | 220 | return 0; |
| 212 | 221 | ||
| 213 | error: | 222 | error: |
| 214 | SetPageError(page); | 223 | SetPageError(page); |
| 215 | unlock_page(page); | 224 | unlock_page(page); |
| 225 | if (!file) | ||
| 226 | key_put(key); | ||
| 227 | error_nokey: | ||
| 216 | _leave(" = %d", ret); | 228 | _leave(" = %d", ret); |
| 217 | return ret; | 229 | return ret; |
| 218 | } | 230 | } |
diff --git a/fs/autofs4/expire.c b/fs/autofs4/expire.c index aa39ae83f019..3da18d453488 100644 --- a/fs/autofs4/expire.c +++ b/fs/autofs4/expire.c | |||
| @@ -77,7 +77,7 @@ static int autofs4_mount_busy(struct vfsmount *mnt, struct dentry *dentry) | |||
| 77 | } | 77 | } |
| 78 | 78 | ||
| 79 | /* Update the expiry counter if fs is busy */ | 79 | /* Update the expiry counter if fs is busy */ |
| 80 | if (!may_umount_tree(mnt)) { | 80 | if (!may_umount_tree(path.mnt)) { |
| 81 | struct autofs_info *ino = autofs4_dentry_ino(top); | 81 | struct autofs_info *ino = autofs4_dentry_ino(top); |
| 82 | ino->last_used = jiffies; | 82 | ino->last_used = jiffies; |
| 83 | goto done; | 83 | goto done; |
diff --git a/fs/compat.c b/fs/compat.c index 94502dab972a..6d6f98fe64a0 100644 --- a/fs/compat.c +++ b/fs/compat.c | |||
| @@ -1485,20 +1485,15 @@ int compat_do_execve(char * filename, | |||
| 1485 | if (!bprm) | 1485 | if (!bprm) |
| 1486 | goto out_files; | 1486 | goto out_files; |
| 1487 | 1487 | ||
| 1488 | retval = -ERESTARTNOINTR; | 1488 | retval = prepare_bprm_creds(bprm); |
| 1489 | if (mutex_lock_interruptible(¤t->cred_guard_mutex)) | 1489 | if (retval) |
| 1490 | goto out_free; | 1490 | goto out_free; |
| 1491 | current->in_execve = 1; | ||
| 1492 | |||
| 1493 | retval = -ENOMEM; | ||
| 1494 | bprm->cred = prepare_exec_creds(); | ||
| 1495 | if (!bprm->cred) | ||
| 1496 | goto out_unlock; | ||
| 1497 | 1491 | ||
| 1498 | retval = check_unsafe_exec(bprm); | 1492 | retval = check_unsafe_exec(bprm); |
| 1499 | if (retval < 0) | 1493 | if (retval < 0) |
| 1500 | goto out_unlock; | 1494 | goto out_free; |
| 1501 | clear_in_exec = retval; | 1495 | clear_in_exec = retval; |
| 1496 | current->in_execve = 1; | ||
| 1502 | 1497 | ||
| 1503 | file = open_exec(filename); | 1498 | file = open_exec(filename); |
| 1504 | retval = PTR_ERR(file); | 1499 | retval = PTR_ERR(file); |
| @@ -1547,7 +1542,6 @@ int compat_do_execve(char * filename, | |||
| 1547 | /* execve succeeded */ | 1542 | /* execve succeeded */ |
| 1548 | current->fs->in_exec = 0; | 1543 | current->fs->in_exec = 0; |
| 1549 | current->in_execve = 0; | 1544 | current->in_execve = 0; |
| 1550 | mutex_unlock(¤t->cred_guard_mutex); | ||
| 1551 | acct_update_integrals(current); | 1545 | acct_update_integrals(current); |
| 1552 | free_bprm(bprm); | 1546 | free_bprm(bprm); |
| 1553 | if (displaced) | 1547 | if (displaced) |
| @@ -1567,10 +1561,7 @@ out_file: | |||
| 1567 | out_unmark: | 1561 | out_unmark: |
| 1568 | if (clear_in_exec) | 1562 | if (clear_in_exec) |
| 1569 | current->fs->in_exec = 0; | 1563 | current->fs->in_exec = 0; |
| 1570 | |||
| 1571 | out_unlock: | ||
| 1572 | current->in_execve = 0; | 1564 | current->in_execve = 0; |
| 1573 | mutex_unlock(¤t->cred_guard_mutex); | ||
| 1574 | 1565 | ||
| 1575 | out_free: | 1566 | out_free: |
| 1576 | free_bprm(bprm); | 1567 | free_bprm(bprm); |
| @@ -678,8 +678,8 @@ exit: | |||
| 678 | } | 678 | } |
| 679 | EXPORT_SYMBOL(open_exec); | 679 | EXPORT_SYMBOL(open_exec); |
| 680 | 680 | ||
| 681 | int kernel_read(struct file *file, unsigned long offset, | 681 | int kernel_read(struct file *file, loff_t offset, |
| 682 | char *addr, unsigned long count) | 682 | char *addr, unsigned long count) |
| 683 | { | 683 | { |
| 684 | mm_segment_t old_fs; | 684 | mm_segment_t old_fs; |
| 685 | loff_t pos = offset; | 685 | loff_t pos = offset; |
| @@ -1016,6 +1016,35 @@ out: | |||
| 1016 | EXPORT_SYMBOL(flush_old_exec); | 1016 | EXPORT_SYMBOL(flush_old_exec); |
| 1017 | 1017 | ||
| 1018 | /* | 1018 | /* |
| 1019 | * Prepare credentials and lock ->cred_guard_mutex. | ||
| 1020 | * install_exec_creds() commits the new creds and drops the lock. | ||
| 1021 | * Or, if exec fails before, free_bprm() should release ->cred and | ||
| 1022 | * and unlock. | ||
| 1023 | */ | ||
| 1024 | int prepare_bprm_creds(struct linux_binprm *bprm) | ||
| 1025 | { | ||
| 1026 | if (mutex_lock_interruptible(¤t->cred_guard_mutex)) | ||
| 1027 | return -ERESTARTNOINTR; | ||
| 1028 | |||
| 1029 | bprm->cred = prepare_exec_creds(); | ||
| 1030 | if (likely(bprm->cred)) | ||
| 1031 | return 0; | ||
| 1032 | |||
| 1033 | mutex_unlock(¤t->cred_guard_mutex); | ||
| 1034 | return -ENOMEM; | ||
| 1035 | } | ||
| 1036 | |||
| 1037 | void free_bprm(struct linux_binprm *bprm) | ||
| 1038 | { | ||
| 1039 | free_arg_pages(bprm); | ||
| 1040 | if (bprm->cred) { | ||
| 1041 | mutex_unlock(¤t->cred_guard_mutex); | ||
| 1042 | abort_creds(bprm->cred); | ||
| 1043 | } | ||
| 1044 | kfree(bprm); | ||
| 1045 | } | ||
| 1046 | |||
| 1047 | /* | ||
| 1019 | * install the new credentials for this executable | 1048 | * install the new credentials for this executable |
| 1020 | */ | 1049 | */ |
| 1021 | void install_exec_creds(struct linux_binprm *bprm) | 1050 | void install_exec_creds(struct linux_binprm *bprm) |
| @@ -1024,12 +1053,13 @@ void install_exec_creds(struct linux_binprm *bprm) | |||
| 1024 | 1053 | ||
| 1025 | commit_creds(bprm->cred); | 1054 | commit_creds(bprm->cred); |
| 1026 | bprm->cred = NULL; | 1055 | bprm->cred = NULL; |
| 1027 | 1056 | /* | |
| 1028 | /* cred_guard_mutex must be held at least to this point to prevent | 1057 | * cred_guard_mutex must be held at least to this point to prevent |
| 1029 | * ptrace_attach() from altering our determination of the task's | 1058 | * ptrace_attach() from altering our determination of the task's |
| 1030 | * credentials; any time after this it may be unlocked */ | 1059 | * credentials; any time after this it may be unlocked. |
| 1031 | 1060 | */ | |
| 1032 | security_bprm_committed_creds(bprm); | 1061 | security_bprm_committed_creds(bprm); |
| 1062 | mutex_unlock(¤t->cred_guard_mutex); | ||
| 1033 | } | 1063 | } |
| 1034 | EXPORT_SYMBOL(install_exec_creds); | 1064 | EXPORT_SYMBOL(install_exec_creds); |
| 1035 | 1065 | ||
| @@ -1246,14 +1276,6 @@ int search_binary_handler(struct linux_binprm *bprm,struct pt_regs *regs) | |||
| 1246 | 1276 | ||
| 1247 | EXPORT_SYMBOL(search_binary_handler); | 1277 | EXPORT_SYMBOL(search_binary_handler); |
| 1248 | 1278 | ||
| 1249 | void free_bprm(struct linux_binprm *bprm) | ||
| 1250 | { | ||
| 1251 | free_arg_pages(bprm); | ||
| 1252 | if (bprm->cred) | ||
| 1253 | abort_creds(bprm->cred); | ||
| 1254 | kfree(bprm); | ||
| 1255 | } | ||
| 1256 | |||
| 1257 | /* | 1279 | /* |
| 1258 | * sys_execve() executes a new program. | 1280 | * sys_execve() executes a new program. |
| 1259 | */ | 1281 | */ |
| @@ -1277,20 +1299,15 @@ int do_execve(char * filename, | |||
| 1277 | if (!bprm) | 1299 | if (!bprm) |
| 1278 | goto out_files; | 1300 | goto out_files; |
| 1279 | 1301 | ||
| 1280 | retval = -ERESTARTNOINTR; | 1302 | retval = prepare_bprm_creds(bprm); |
| 1281 | if (mutex_lock_interruptible(¤t->cred_guard_mutex)) | 1303 | if (retval) |
| 1282 | goto out_free; | 1304 | goto out_free; |
| 1283 | current->in_execve = 1; | ||
| 1284 | |||
| 1285 | retval = -ENOMEM; | ||
| 1286 | bprm->cred = prepare_exec_creds(); | ||
| 1287 | if (!bprm->cred) | ||
| 1288 | goto out_unlock; | ||
| 1289 | 1305 | ||
| 1290 | retval = check_unsafe_exec(bprm); | 1306 | retval = check_unsafe_exec(bprm); |
| 1291 | if (retval < 0) | 1307 | if (retval < 0) |
| 1292 | goto out_unlock; | 1308 | goto out_free; |
| 1293 | clear_in_exec = retval; | 1309 | clear_in_exec = retval; |
| 1310 | current->in_execve = 1; | ||
| 1294 | 1311 | ||
| 1295 | file = open_exec(filename); | 1312 | file = open_exec(filename); |
| 1296 | retval = PTR_ERR(file); | 1313 | retval = PTR_ERR(file); |
| @@ -1340,7 +1357,6 @@ int do_execve(char * filename, | |||
| 1340 | /* execve succeeded */ | 1357 | /* execve succeeded */ |
| 1341 | current->fs->in_exec = 0; | 1358 | current->fs->in_exec = 0; |
| 1342 | current->in_execve = 0; | 1359 | current->in_execve = 0; |
| 1343 | mutex_unlock(¤t->cred_guard_mutex); | ||
| 1344 | acct_update_integrals(current); | 1360 | acct_update_integrals(current); |
| 1345 | free_bprm(bprm); | 1361 | free_bprm(bprm); |
| 1346 | if (displaced) | 1362 | if (displaced) |
| @@ -1360,10 +1376,7 @@ out_file: | |||
| 1360 | out_unmark: | 1376 | out_unmark: |
| 1361 | if (clear_in_exec) | 1377 | if (clear_in_exec) |
| 1362 | current->fs->in_exec = 0; | 1378 | current->fs->in_exec = 0; |
| 1363 | |||
| 1364 | out_unlock: | ||
| 1365 | current->in_execve = 0; | 1379 | current->in_execve = 0; |
| 1366 | mutex_unlock(¤t->cred_guard_mutex); | ||
| 1367 | 1380 | ||
| 1368 | out_free: | 1381 | out_free: |
| 1369 | free_bprm(bprm); | 1382 | free_bprm(bprm); |
diff --git a/fs/ext2/namei.c b/fs/ext2/namei.c index e1dedb0f7873..78d9b925fc94 100644 --- a/fs/ext2/namei.c +++ b/fs/ext2/namei.c | |||
| @@ -362,6 +362,10 @@ static int ext2_rename (struct inode * old_dir, struct dentry * old_dentry, | |||
| 362 | if (dir_de) { | 362 | if (dir_de) { |
| 363 | if (old_dir != new_dir) | 363 | if (old_dir != new_dir) |
| 364 | ext2_set_link(old_inode, dir_de, dir_page, new_dir, 0); | 364 | ext2_set_link(old_inode, dir_de, dir_page, new_dir, 0); |
| 365 | else { | ||
| 366 | kunmap(dir_page); | ||
| 367 | page_cache_release(dir_page); | ||
| 368 | } | ||
| 365 | inode_dec_link_count(old_dir); | 369 | inode_dec_link_count(old_dir); |
| 366 | } | 370 | } |
| 367 | return 0; | 371 | return 0; |
diff --git a/fs/ext3/Kconfig b/fs/ext3/Kconfig index fb3c1a21b135..522b15498f45 100644 --- a/fs/ext3/Kconfig +++ b/fs/ext3/Kconfig | |||
| @@ -29,23 +29,25 @@ config EXT3_FS | |||
| 29 | module will be called ext3. | 29 | module will be called ext3. |
| 30 | 30 | ||
| 31 | config EXT3_DEFAULTS_TO_ORDERED | 31 | config EXT3_DEFAULTS_TO_ORDERED |
| 32 | bool "Default to 'data=ordered' in ext3 (legacy option)" | 32 | bool "Default to 'data=ordered' in ext3" |
| 33 | depends on EXT3_FS | 33 | depends on EXT3_FS |
| 34 | help | 34 | help |
| 35 | If a filesystem does not explicitly specify a data ordering | 35 | The journal mode options for ext3 have different tradeoffs |
| 36 | mode, and the journal capability allowed it, ext3 used to | 36 | between when data is guaranteed to be on disk and |
| 37 | historically default to 'data=ordered'. | 37 | performance. The use of "data=writeback" can cause |
| 38 | 38 | unwritten data to appear in files after an system crash or | |
| 39 | That was a rather unfortunate choice, because it leads to all | 39 | power failure, which can be a security issue. However, |
| 40 | kinds of latency problems, and the 'data=writeback' mode is more | 40 | "data=ordered" mode can also result in major performance |
| 41 | appropriate these days. | 41 | problems, including seconds-long delays before an fsync() |
| 42 | 42 | call returns. For details, see: | |
| 43 | You should probably always answer 'n' here, and if you really | 43 | |
| 44 | want to use 'data=ordered' mode, set it in the filesystem itself | 44 | http://ext4.wiki.kernel.org/index.php/Ext3_data_mode_tradeoffs |
| 45 | with 'tune2fs -o journal_data_ordered'. | 45 | |
| 46 | 46 | If you have been historically happy with ext3's performance, | |
| 47 | But if you really want to enable the legacy default, you can do | 47 | data=ordered mode will be a safe choice and you should |
| 48 | so by answering 'y' to this question. | 48 | answer 'y' here. If you understand the reliability and data |
| 49 | privacy issues of data=writeback and are willing to make | ||
| 50 | that trade off, answer 'n'. | ||
| 49 | 51 | ||
| 50 | config EXT3_FS_XATTR | 52 | config EXT3_FS_XATTR |
| 51 | bool "Ext3 extended attributes" | 53 | bool "Ext3 extended attributes" |
diff --git a/fs/ext3/super.c b/fs/ext3/super.c index 524b349c6299..a8d80a7f1105 100644 --- a/fs/ext3/super.c +++ b/fs/ext3/super.c | |||
| @@ -543,6 +543,19 @@ static inline void ext3_show_quota_options(struct seq_file *seq, struct super_bl | |||
| 543 | #endif | 543 | #endif |
| 544 | } | 544 | } |
| 545 | 545 | ||
| 546 | static char *data_mode_string(unsigned long mode) | ||
| 547 | { | ||
| 548 | switch (mode) { | ||
| 549 | case EXT3_MOUNT_JOURNAL_DATA: | ||
| 550 | return "journal"; | ||
| 551 | case EXT3_MOUNT_ORDERED_DATA: | ||
| 552 | return "ordered"; | ||
| 553 | case EXT3_MOUNT_WRITEBACK_DATA: | ||
| 554 | return "writeback"; | ||
| 555 | } | ||
| 556 | return "unknown"; | ||
| 557 | } | ||
| 558 | |||
| 546 | /* | 559 | /* |
| 547 | * Show an option if | 560 | * Show an option if |
| 548 | * - it's set to a non-default value OR | 561 | * - it's set to a non-default value OR |
| @@ -616,13 +629,8 @@ static int ext3_show_options(struct seq_file *seq, struct vfsmount *vfs) | |||
| 616 | if (test_opt(sb, NOBH)) | 629 | if (test_opt(sb, NOBH)) |
| 617 | seq_puts(seq, ",nobh"); | 630 | seq_puts(seq, ",nobh"); |
| 618 | 631 | ||
| 619 | if (test_opt(sb, DATA_FLAGS) == EXT3_MOUNT_JOURNAL_DATA) | 632 | seq_printf(seq, ",data=%s", data_mode_string(sbi->s_mount_opt & |
| 620 | seq_puts(seq, ",data=journal"); | 633 | EXT3_MOUNT_DATA_FLAGS)); |
| 621 | else if (test_opt(sb, DATA_FLAGS) == EXT3_MOUNT_ORDERED_DATA) | ||
| 622 | seq_puts(seq, ",data=ordered"); | ||
| 623 | else if (test_opt(sb, DATA_FLAGS) == EXT3_MOUNT_WRITEBACK_DATA) | ||
| 624 | seq_puts(seq, ",data=writeback"); | ||
| 625 | |||
| 626 | if (test_opt(sb, DATA_ERR_ABORT)) | 634 | if (test_opt(sb, DATA_ERR_ABORT)) |
| 627 | seq_puts(seq, ",data_err=abort"); | 635 | seq_puts(seq, ",data_err=abort"); |
| 628 | 636 | ||
| @@ -1024,12 +1032,18 @@ static int parse_options (char *options, struct super_block *sb, | |||
| 1024 | datacheck: | 1032 | datacheck: |
| 1025 | if (is_remount) { | 1033 | if (is_remount) { |
| 1026 | if ((sbi->s_mount_opt & EXT3_MOUNT_DATA_FLAGS) | 1034 | if ((sbi->s_mount_opt & EXT3_MOUNT_DATA_FLAGS) |
| 1027 | != data_opt) { | 1035 | == data_opt) |
| 1028 | printk(KERN_ERR | 1036 | break; |
| 1029 | "EXT3-fs: cannot change data " | 1037 | printk(KERN_ERR |
| 1030 | "mode on remount\n"); | 1038 | "EXT3-fs (device %s): Cannot change " |
| 1031 | return 0; | 1039 | "data mode on remount. The filesystem " |
| 1032 | } | 1040 | "is mounted in data=%s mode and you " |
| 1041 | "try to remount it in data=%s mode.\n", | ||
| 1042 | sb->s_id, | ||
| 1043 | data_mode_string(sbi->s_mount_opt & | ||
| 1044 | EXT3_MOUNT_DATA_FLAGS), | ||
| 1045 | data_mode_string(data_opt)); | ||
| 1046 | return 0; | ||
| 1033 | } else { | 1047 | } else { |
| 1034 | sbi->s_mount_opt &= ~EXT3_MOUNT_DATA_FLAGS; | 1048 | sbi->s_mount_opt &= ~EXT3_MOUNT_DATA_FLAGS; |
| 1035 | sbi->s_mount_opt |= data_opt; | 1049 | sbi->s_mount_opt |= data_opt; |
diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c index 941c8425c10b..cb88dac8ccaa 100644 --- a/fs/hugetlbfs/inode.c +++ b/fs/hugetlbfs/inode.c | |||
| @@ -935,26 +935,28 @@ static int can_do_hugetlb_shm(void) | |||
| 935 | return capable(CAP_IPC_LOCK) || in_group_p(sysctl_hugetlb_shm_group); | 935 | return capable(CAP_IPC_LOCK) || in_group_p(sysctl_hugetlb_shm_group); |
| 936 | } | 936 | } |
| 937 | 937 | ||
| 938 | struct file *hugetlb_file_setup(const char *name, size_t size, int acctflag) | 938 | struct file *hugetlb_file_setup(const char *name, size_t size, int acctflag, |
| 939 | struct user_struct **user) | ||
| 939 | { | 940 | { |
| 940 | int error = -ENOMEM; | 941 | int error = -ENOMEM; |
| 941 | int unlock_shm = 0; | ||
| 942 | struct file *file; | 942 | struct file *file; |
| 943 | struct inode *inode; | 943 | struct inode *inode; |
| 944 | struct dentry *dentry, *root; | 944 | struct dentry *dentry, *root; |
| 945 | struct qstr quick_string; | 945 | struct qstr quick_string; |
| 946 | struct user_struct *user = current_user(); | ||
| 947 | 946 | ||
| 947 | *user = NULL; | ||
| 948 | if (!hugetlbfs_vfsmount) | 948 | if (!hugetlbfs_vfsmount) |
| 949 | return ERR_PTR(-ENOENT); | 949 | return ERR_PTR(-ENOENT); |
| 950 | 950 | ||
| 951 | if (!can_do_hugetlb_shm()) { | 951 | if (!can_do_hugetlb_shm()) { |
| 952 | if (user_shm_lock(size, user)) { | 952 | *user = current_user(); |
| 953 | unlock_shm = 1; | 953 | if (user_shm_lock(size, *user)) { |
| 954 | WARN_ONCE(1, | 954 | WARN_ONCE(1, |
| 955 | "Using mlock ulimits for SHM_HUGETLB deprecated\n"); | 955 | "Using mlock ulimits for SHM_HUGETLB deprecated\n"); |
| 956 | } else | 956 | } else { |
| 957 | *user = NULL; | ||
| 957 | return ERR_PTR(-EPERM); | 958 | return ERR_PTR(-EPERM); |
| 959 | } | ||
| 958 | } | 960 | } |
| 959 | 961 | ||
| 960 | root = hugetlbfs_vfsmount->mnt_root; | 962 | root = hugetlbfs_vfsmount->mnt_root; |
| @@ -996,8 +998,10 @@ out_inode: | |||
| 996 | out_dentry: | 998 | out_dentry: |
| 997 | dput(dentry); | 999 | dput(dentry); |
| 998 | out_shm_unlock: | 1000 | out_shm_unlock: |
| 999 | if (unlock_shm) | 1001 | if (*user) { |
| 1000 | user_shm_unlock(size, user); | 1002 | user_shm_unlock(size, *user); |
| 1003 | *user = NULL; | ||
| 1004 | } | ||
| 1001 | return ERR_PTR(error); | 1005 | return ERR_PTR(error); |
| 1002 | } | 1006 | } |
| 1003 | 1007 | ||
diff --git a/fs/jffs2/wbuf.c b/fs/jffs2/wbuf.c index d9a721e6db70..5ef7bac265e5 100644 --- a/fs/jffs2/wbuf.c +++ b/fs/jffs2/wbuf.c | |||
| @@ -1268,10 +1268,20 @@ int jffs2_nor_wbuf_flash_setup(struct jffs2_sb_info *c) { | |||
| 1268 | if (!c->wbuf) | 1268 | if (!c->wbuf) |
| 1269 | return -ENOMEM; | 1269 | return -ENOMEM; |
| 1270 | 1270 | ||
| 1271 | #ifdef CONFIG_JFFS2_FS_WBUF_VERIFY | ||
| 1272 | c->wbuf_verify = kmalloc(c->wbuf_pagesize, GFP_KERNEL); | ||
| 1273 | if (!c->wbuf_verify) { | ||
| 1274 | kfree(c->wbuf); | ||
| 1275 | return -ENOMEM; | ||
| 1276 | } | ||
| 1277 | #endif | ||
| 1271 | return 0; | 1278 | return 0; |
| 1272 | } | 1279 | } |
| 1273 | 1280 | ||
| 1274 | void jffs2_nor_wbuf_flash_cleanup(struct jffs2_sb_info *c) { | 1281 | void jffs2_nor_wbuf_flash_cleanup(struct jffs2_sb_info *c) { |
| 1282 | #ifdef CONFIG_JFFS2_FS_WBUF_VERIFY | ||
| 1283 | kfree(c->wbuf_verify); | ||
| 1284 | #endif | ||
| 1275 | kfree(c->wbuf); | 1285 | kfree(c->wbuf); |
| 1276 | } | 1286 | } |
| 1277 | 1287 | ||
diff --git a/fs/namei.c b/fs/namei.c index f3c5b278895a..1f13751693a5 100644 --- a/fs/namei.c +++ b/fs/namei.c | |||
| @@ -1542,28 +1542,31 @@ int may_open(struct path *path, int acc_mode, int flag) | |||
| 1542 | * An append-only file must be opened in append mode for writing. | 1542 | * An append-only file must be opened in append mode for writing. |
| 1543 | */ | 1543 | */ |
| 1544 | if (IS_APPEND(inode)) { | 1544 | if (IS_APPEND(inode)) { |
| 1545 | error = -EPERM; | ||
| 1545 | if ((flag & FMODE_WRITE) && !(flag & O_APPEND)) | 1546 | if ((flag & FMODE_WRITE) && !(flag & O_APPEND)) |
| 1546 | return -EPERM; | 1547 | goto err_out; |
| 1547 | if (flag & O_TRUNC) | 1548 | if (flag & O_TRUNC) |
| 1548 | return -EPERM; | 1549 | goto err_out; |
| 1549 | } | 1550 | } |
| 1550 | 1551 | ||
| 1551 | /* O_NOATIME can only be set by the owner or superuser */ | 1552 | /* O_NOATIME can only be set by the owner or superuser */ |
| 1552 | if (flag & O_NOATIME) | 1553 | if (flag & O_NOATIME) |
| 1553 | if (!is_owner_or_cap(inode)) | 1554 | if (!is_owner_or_cap(inode)) { |
| 1554 | return -EPERM; | 1555 | error = -EPERM; |
| 1556 | goto err_out; | ||
| 1557 | } | ||
| 1555 | 1558 | ||
| 1556 | /* | 1559 | /* |
| 1557 | * Ensure there are no outstanding leases on the file. | 1560 | * Ensure there are no outstanding leases on the file. |
| 1558 | */ | 1561 | */ |
| 1559 | error = break_lease(inode, flag); | 1562 | error = break_lease(inode, flag); |
| 1560 | if (error) | 1563 | if (error) |
| 1561 | return error; | 1564 | goto err_out; |
| 1562 | 1565 | ||
| 1563 | if (flag & O_TRUNC) { | 1566 | if (flag & O_TRUNC) { |
| 1564 | error = get_write_access(inode); | 1567 | error = get_write_access(inode); |
| 1565 | if (error) | 1568 | if (error) |
| 1566 | return error; | 1569 | goto err_out; |
| 1567 | 1570 | ||
| 1568 | /* | 1571 | /* |
| 1569 | * Refuse to truncate files with mandatory locks held on them. | 1572 | * Refuse to truncate files with mandatory locks held on them. |
| @@ -1581,12 +1584,17 @@ int may_open(struct path *path, int acc_mode, int flag) | |||
| 1581 | } | 1584 | } |
| 1582 | put_write_access(inode); | 1585 | put_write_access(inode); |
| 1583 | if (error) | 1586 | if (error) |
| 1584 | return error; | 1587 | goto err_out; |
| 1585 | } else | 1588 | } else |
| 1586 | if (flag & FMODE_WRITE) | 1589 | if (flag & FMODE_WRITE) |
| 1587 | vfs_dq_init(inode); | 1590 | vfs_dq_init(inode); |
| 1588 | 1591 | ||
| 1589 | return 0; | 1592 | return 0; |
| 1593 | err_out: | ||
| 1594 | ima_counts_put(path, acc_mode ? | ||
| 1595 | acc_mode & (MAY_READ | MAY_WRITE | MAY_EXEC) : | ||
| 1596 | ACC_MODE(flag) & (MAY_READ | MAY_WRITE)); | ||
| 1597 | return error; | ||
| 1590 | } | 1598 | } |
| 1591 | 1599 | ||
| 1592 | /* | 1600 | /* |
diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c index 65ca8c18476f..1434080aefeb 100644 --- a/fs/nfs/nfs4state.c +++ b/fs/nfs/nfs4state.c | |||
| @@ -1250,8 +1250,8 @@ static void nfs4_state_manager(struct nfs_client *clp) | |||
| 1250 | continue; | 1250 | continue; |
| 1251 | } | 1251 | } |
| 1252 | /* Initialize or reset the session */ | 1252 | /* Initialize or reset the session */ |
| 1253 | if (nfs4_has_session(clp) && | 1253 | if (test_and_clear_bit(NFS4CLNT_SESSION_SETUP, &clp->cl_state) |
| 1254 | test_and_clear_bit(NFS4CLNT_SESSION_SETUP, &clp->cl_state)) { | 1254 | && nfs4_has_session(clp)) { |
| 1255 | if (clp->cl_cons_state == NFS_CS_SESSION_INITING) | 1255 | if (clp->cl_cons_state == NFS_CS_SESSION_INITING) |
| 1256 | status = nfs4_initialize_session(clp); | 1256 | status = nfs4_initialize_session(clp); |
| 1257 | else | 1257 | else |
diff --git a/fs/nilfs2/btnode.c b/fs/nilfs2/btnode.c index 7e0b61be212e..c668bca579c1 100644 --- a/fs/nilfs2/btnode.c +++ b/fs/nilfs2/btnode.c | |||
| @@ -209,6 +209,7 @@ int nilfs_btnode_prepare_change_key(struct address_space *btnc, | |||
| 209 | * We cannot call radix_tree_preload for the kernels older | 209 | * We cannot call radix_tree_preload for the kernels older |
| 210 | * than 2.6.23, because it is not exported for modules. | 210 | * than 2.6.23, because it is not exported for modules. |
| 211 | */ | 211 | */ |
| 212 | retry: | ||
| 212 | err = radix_tree_preload(GFP_NOFS & ~__GFP_HIGHMEM); | 213 | err = radix_tree_preload(GFP_NOFS & ~__GFP_HIGHMEM); |
| 213 | if (err) | 214 | if (err) |
| 214 | goto failed_unlock; | 215 | goto failed_unlock; |
| @@ -219,7 +220,6 @@ int nilfs_btnode_prepare_change_key(struct address_space *btnc, | |||
| 219 | (unsigned long long)oldkey, | 220 | (unsigned long long)oldkey, |
| 220 | (unsigned long long)newkey); | 221 | (unsigned long long)newkey); |
| 221 | 222 | ||
| 222 | retry: | ||
| 223 | spin_lock_irq(&btnc->tree_lock); | 223 | spin_lock_irq(&btnc->tree_lock); |
| 224 | err = radix_tree_insert(&btnc->page_tree, newkey, obh->b_page); | 224 | err = radix_tree_insert(&btnc->page_tree, newkey, obh->b_page); |
| 225 | spin_unlock_irq(&btnc->tree_lock); | 225 | spin_unlock_irq(&btnc->tree_lock); |
diff --git a/fs/notify/inotify/inotify_fsnotify.c b/fs/notify/inotify/inotify_fsnotify.c index 5dcbafe72d71..c9ee67b442e1 100644 --- a/fs/notify/inotify/inotify_fsnotify.c +++ b/fs/notify/inotify/inotify_fsnotify.c | |||
| @@ -105,16 +105,45 @@ static bool inotify_should_send_event(struct fsnotify_group *group, struct inode | |||
| 105 | return send; | 105 | return send; |
| 106 | } | 106 | } |
| 107 | 107 | ||
| 108 | /* | ||
| 109 | * This is NEVER supposed to be called. Inotify marks should either have been | ||
| 110 | * removed from the idr when the watch was removed or in the | ||
| 111 | * fsnotify_destroy_mark_by_group() call when the inotify instance was being | ||
| 112 | * torn down. This is only called if the idr is about to be freed but there | ||
| 113 | * are still marks in it. | ||
| 114 | */ | ||
| 108 | static int idr_callback(int id, void *p, void *data) | 115 | static int idr_callback(int id, void *p, void *data) |
| 109 | { | 116 | { |
| 110 | BUG(); | 117 | struct fsnotify_mark_entry *entry; |
| 118 | struct inotify_inode_mark_entry *ientry; | ||
| 119 | static bool warned = false; | ||
| 120 | |||
| 121 | if (warned) | ||
| 122 | return 0; | ||
| 123 | |||
| 124 | warned = false; | ||
| 125 | entry = p; | ||
| 126 | ientry = container_of(entry, struct inotify_inode_mark_entry, fsn_entry); | ||
| 127 | |||
| 128 | WARN(1, "inotify closing but id=%d for entry=%p in group=%p still in " | ||
| 129 | "idr. Probably leaking memory\n", id, p, data); | ||
| 130 | |||
| 131 | /* | ||
| 132 | * I'm taking the liberty of assuming that the mark in question is a | ||
| 133 | * valid address and I'm dereferencing it. This might help to figure | ||
| 134 | * out why we got here and the panic is no worse than the original | ||
| 135 | * BUG() that was here. | ||
| 136 | */ | ||
| 137 | if (entry) | ||
| 138 | printk(KERN_WARNING "entry->group=%p inode=%p wd=%d\n", | ||
| 139 | entry->group, entry->inode, ientry->wd); | ||
| 111 | return 0; | 140 | return 0; |
| 112 | } | 141 | } |
| 113 | 142 | ||
| 114 | static void inotify_free_group_priv(struct fsnotify_group *group) | 143 | static void inotify_free_group_priv(struct fsnotify_group *group) |
| 115 | { | 144 | { |
| 116 | /* ideally the idr is empty and we won't hit the BUG in teh callback */ | 145 | /* ideally the idr is empty and we won't hit the BUG in teh callback */ |
| 117 | idr_for_each(&group->inotify_data.idr, idr_callback, NULL); | 146 | idr_for_each(&group->inotify_data.idr, idr_callback, group); |
| 118 | idr_remove_all(&group->inotify_data.idr); | 147 | idr_remove_all(&group->inotify_data.idr); |
| 119 | idr_destroy(&group->inotify_data.idr); | 148 | idr_destroy(&group->inotify_data.idr); |
| 120 | } | 149 | } |
diff --git a/fs/notify/inotify/inotify_user.c b/fs/notify/inotify/inotify_user.c index dc32ed8323ba..dcd2040d330c 100644 --- a/fs/notify/inotify/inotify_user.c +++ b/fs/notify/inotify/inotify_user.c | |||
| @@ -47,9 +47,6 @@ | |||
| 47 | 47 | ||
| 48 | static struct vfsmount *inotify_mnt __read_mostly; | 48 | static struct vfsmount *inotify_mnt __read_mostly; |
| 49 | 49 | ||
| 50 | /* this just sits here and wastes global memory. used to just pad userspace messages with zeros */ | ||
| 51 | static struct inotify_event nul_inotify_event; | ||
| 52 | |||
| 53 | /* these are configurable via /proc/sys/fs/inotify/ */ | 50 | /* these are configurable via /proc/sys/fs/inotify/ */ |
| 54 | static int inotify_max_user_instances __read_mostly; | 51 | static int inotify_max_user_instances __read_mostly; |
| 55 | static int inotify_max_queued_events __read_mostly; | 52 | static int inotify_max_queued_events __read_mostly; |
| @@ -157,7 +154,8 @@ static struct fsnotify_event *get_one_event(struct fsnotify_group *group, | |||
| 157 | 154 | ||
| 158 | event = fsnotify_peek_notify_event(group); | 155 | event = fsnotify_peek_notify_event(group); |
| 159 | 156 | ||
| 160 | event_size += roundup(event->name_len, event_size); | 157 | if (event->name_len) |
| 158 | event_size += roundup(event->name_len + 1, event_size); | ||
| 161 | 159 | ||
| 162 | if (event_size > count) | 160 | if (event_size > count) |
| 163 | return ERR_PTR(-EINVAL); | 161 | return ERR_PTR(-EINVAL); |
| @@ -183,7 +181,7 @@ static ssize_t copy_event_to_user(struct fsnotify_group *group, | |||
| 183 | struct fsnotify_event_private_data *fsn_priv; | 181 | struct fsnotify_event_private_data *fsn_priv; |
| 184 | struct inotify_event_private_data *priv; | 182 | struct inotify_event_private_data *priv; |
| 185 | size_t event_size = sizeof(struct inotify_event); | 183 | size_t event_size = sizeof(struct inotify_event); |
| 186 | size_t name_len; | 184 | size_t name_len = 0; |
| 187 | 185 | ||
| 188 | /* we get the inotify watch descriptor from the event private data */ | 186 | /* we get the inotify watch descriptor from the event private data */ |
| 189 | spin_lock(&event->lock); | 187 | spin_lock(&event->lock); |
| @@ -199,8 +197,12 @@ static ssize_t copy_event_to_user(struct fsnotify_group *group, | |||
| 199 | inotify_free_event_priv(fsn_priv); | 197 | inotify_free_event_priv(fsn_priv); |
| 200 | } | 198 | } |
| 201 | 199 | ||
| 202 | /* round up event->name_len so it is a multiple of event_size */ | 200 | /* |
| 203 | name_len = roundup(event->name_len, event_size); | 201 | * round up event->name_len so it is a multiple of event_size |
| 202 | * plus an extra byte for the terminating '\0'. | ||
| 203 | */ | ||
| 204 | if (event->name_len) | ||
| 205 | name_len = roundup(event->name_len + 1, event_size); | ||
| 204 | inotify_event.len = name_len; | 206 | inotify_event.len = name_len; |
| 205 | 207 | ||
| 206 | inotify_event.mask = inotify_mask_to_arg(event->mask); | 208 | inotify_event.mask = inotify_mask_to_arg(event->mask); |
| @@ -224,8 +226,8 @@ static ssize_t copy_event_to_user(struct fsnotify_group *group, | |||
| 224 | return -EFAULT; | 226 | return -EFAULT; |
| 225 | buf += event->name_len; | 227 | buf += event->name_len; |
| 226 | 228 | ||
| 227 | /* fill userspace with 0's from nul_inotify_event */ | 229 | /* fill userspace with 0's */ |
| 228 | if (copy_to_user(buf, &nul_inotify_event, len_to_zero)) | 230 | if (clear_user(buf, len_to_zero)) |
| 229 | return -EFAULT; | 231 | return -EFAULT; |
| 230 | buf += len_to_zero; | 232 | buf += len_to_zero; |
| 231 | event_size += name_len; | 233 | event_size += name_len; |
| @@ -326,8 +328,9 @@ static long inotify_ioctl(struct file *file, unsigned int cmd, | |||
| 326 | list_for_each_entry(holder, &group->notification_list, event_list) { | 328 | list_for_each_entry(holder, &group->notification_list, event_list) { |
| 327 | event = holder->event; | 329 | event = holder->event; |
| 328 | send_len += sizeof(struct inotify_event); | 330 | send_len += sizeof(struct inotify_event); |
| 329 | send_len += roundup(event->name_len, | 331 | if (event->name_len) |
| 330 | sizeof(struct inotify_event)); | 332 | send_len += roundup(event->name_len + 1, |
| 333 | sizeof(struct inotify_event)); | ||
| 331 | } | 334 | } |
| 332 | mutex_unlock(&group->notification_mutex); | 335 | mutex_unlock(&group->notification_mutex); |
| 333 | ret = put_user(send_len, (int __user *) p); | 336 | ret = put_user(send_len, (int __user *) p); |
| @@ -364,20 +367,53 @@ static int inotify_find_inode(const char __user *dirname, struct path *path, uns | |||
| 364 | return error; | 367 | return error; |
| 365 | } | 368 | } |
| 366 | 369 | ||
| 370 | /* | ||
| 371 | * Remove the mark from the idr (if present) and drop the reference | ||
| 372 | * on the mark because it was in the idr. | ||
| 373 | */ | ||
| 367 | static void inotify_remove_from_idr(struct fsnotify_group *group, | 374 | static void inotify_remove_from_idr(struct fsnotify_group *group, |
| 368 | struct inotify_inode_mark_entry *ientry) | 375 | struct inotify_inode_mark_entry *ientry) |
| 369 | { | 376 | { |
| 370 | struct idr *idr; | 377 | struct idr *idr; |
| 378 | struct fsnotify_mark_entry *entry; | ||
| 379 | struct inotify_inode_mark_entry *found_ientry; | ||
| 380 | int wd; | ||
| 371 | 381 | ||
| 372 | spin_lock(&group->inotify_data.idr_lock); | 382 | spin_lock(&group->inotify_data.idr_lock); |
| 373 | idr = &group->inotify_data.idr; | 383 | idr = &group->inotify_data.idr; |
| 374 | idr_remove(idr, ientry->wd); | 384 | wd = ientry->wd; |
| 375 | spin_unlock(&group->inotify_data.idr_lock); | 385 | |
| 386 | if (wd == -1) | ||
| 387 | goto out; | ||
| 388 | |||
| 389 | entry = idr_find(&group->inotify_data.idr, wd); | ||
| 390 | if (unlikely(!entry)) | ||
| 391 | goto out; | ||
| 392 | |||
| 393 | found_ientry = container_of(entry, struct inotify_inode_mark_entry, fsn_entry); | ||
| 394 | if (unlikely(found_ientry != ientry)) { | ||
| 395 | /* We found an entry in the idr with the right wd, but it's | ||
| 396 | * not the entry we were told to remove. eparis seriously | ||
| 397 | * fucked up somewhere. */ | ||
| 398 | WARN_ON(1); | ||
| 399 | ientry->wd = -1; | ||
| 400 | goto out; | ||
| 401 | } | ||
| 402 | |||
| 403 | /* One ref for being in the idr, one ref held by the caller */ | ||
| 404 | BUG_ON(atomic_read(&entry->refcnt) < 2); | ||
| 405 | |||
| 406 | idr_remove(idr, wd); | ||
| 376 | ientry->wd = -1; | 407 | ientry->wd = -1; |
| 408 | |||
| 409 | /* removed from the idr, drop that ref */ | ||
| 410 | fsnotify_put_mark(entry); | ||
| 411 | out: | ||
| 412 | spin_unlock(&group->inotify_data.idr_lock); | ||
| 377 | } | 413 | } |
| 414 | |||
| 378 | /* | 415 | /* |
| 379 | * Send IN_IGNORED for this wd, remove this wd from the idr, and drop the | 416 | * Send IN_IGNORED for this wd, remove this wd from the idr. |
| 380 | * internal reference help on the mark because it is in the idr. | ||
| 381 | */ | 417 | */ |
| 382 | void inotify_ignored_and_remove_idr(struct fsnotify_mark_entry *entry, | 418 | void inotify_ignored_and_remove_idr(struct fsnotify_mark_entry *entry, |
| 383 | struct fsnotify_group *group) | 419 | struct fsnotify_group *group) |
| @@ -417,9 +453,6 @@ skip_send_ignore: | |||
| 417 | /* remove this entry from the idr */ | 453 | /* remove this entry from the idr */ |
| 418 | inotify_remove_from_idr(group, ientry); | 454 | inotify_remove_from_idr(group, ientry); |
| 419 | 455 | ||
| 420 | /* removed from idr, drop that reference */ | ||
| 421 | fsnotify_put_mark(entry); | ||
| 422 | |||
| 423 | atomic_dec(&group->inotify_data.user->inotify_watches); | 456 | atomic_dec(&group->inotify_data.user->inotify_watches); |
| 424 | } | 457 | } |
| 425 | 458 | ||
| @@ -431,80 +464,29 @@ static void inotify_free_mark(struct fsnotify_mark_entry *entry) | |||
| 431 | kmem_cache_free(inotify_inode_mark_cachep, ientry); | 464 | kmem_cache_free(inotify_inode_mark_cachep, ientry); |
| 432 | } | 465 | } |
| 433 | 466 | ||
| 434 | static int inotify_update_watch(struct fsnotify_group *group, struct inode *inode, u32 arg) | 467 | static int inotify_update_existing_watch(struct fsnotify_group *group, |
| 468 | struct inode *inode, | ||
| 469 | u32 arg) | ||
| 435 | { | 470 | { |
| 436 | struct fsnotify_mark_entry *entry = NULL; | 471 | struct fsnotify_mark_entry *entry; |
| 437 | struct inotify_inode_mark_entry *ientry; | 472 | struct inotify_inode_mark_entry *ientry; |
| 438 | struct inotify_inode_mark_entry *tmp_ientry; | ||
| 439 | int ret = 0; | ||
| 440 | int add = (arg & IN_MASK_ADD); | ||
| 441 | __u32 mask; | ||
| 442 | __u32 old_mask, new_mask; | 473 | __u32 old_mask, new_mask; |
| 474 | __u32 mask; | ||
| 475 | int add = (arg & IN_MASK_ADD); | ||
| 476 | int ret; | ||
| 443 | 477 | ||
| 444 | /* don't allow invalid bits: we don't want flags set */ | 478 | /* don't allow invalid bits: we don't want flags set */ |
| 445 | mask = inotify_arg_to_mask(arg); | 479 | mask = inotify_arg_to_mask(arg); |
| 446 | if (unlikely(!mask)) | 480 | if (unlikely(!mask)) |
| 447 | return -EINVAL; | 481 | return -EINVAL; |
| 448 | 482 | ||
| 449 | tmp_ientry = kmem_cache_alloc(inotify_inode_mark_cachep, GFP_KERNEL); | ||
| 450 | if (unlikely(!tmp_ientry)) | ||
| 451 | return -ENOMEM; | ||
| 452 | /* we set the mask at the end after attaching it */ | ||
| 453 | fsnotify_init_mark(&tmp_ientry->fsn_entry, inotify_free_mark); | ||
| 454 | tmp_ientry->wd = -1; | ||
| 455 | |||
| 456 | find_entry: | ||
| 457 | spin_lock(&inode->i_lock); | 483 | spin_lock(&inode->i_lock); |
| 458 | entry = fsnotify_find_mark_entry(group, inode); | 484 | entry = fsnotify_find_mark_entry(group, inode); |
| 459 | spin_unlock(&inode->i_lock); | 485 | spin_unlock(&inode->i_lock); |
| 460 | if (entry) { | 486 | if (!entry) |
| 461 | ientry = container_of(entry, struct inotify_inode_mark_entry, fsn_entry); | 487 | return -ENOENT; |
| 462 | } else { | ||
| 463 | ret = -ENOSPC; | ||
| 464 | if (atomic_read(&group->inotify_data.user->inotify_watches) >= inotify_max_user_watches) | ||
| 465 | goto out_err; | ||
| 466 | retry: | ||
| 467 | ret = -ENOMEM; | ||
| 468 | if (unlikely(!idr_pre_get(&group->inotify_data.idr, GFP_KERNEL))) | ||
| 469 | goto out_err; | ||
| 470 | |||
| 471 | spin_lock(&group->inotify_data.idr_lock); | ||
| 472 | ret = idr_get_new_above(&group->inotify_data.idr, &tmp_ientry->fsn_entry, | ||
| 473 | group->inotify_data.last_wd, | ||
| 474 | &tmp_ientry->wd); | ||
| 475 | spin_unlock(&group->inotify_data.idr_lock); | ||
| 476 | if (ret) { | ||
| 477 | if (ret == -EAGAIN) | ||
| 478 | goto retry; | ||
| 479 | goto out_err; | ||
| 480 | } | ||
| 481 | |||
| 482 | ret = fsnotify_add_mark(&tmp_ientry->fsn_entry, group, inode); | ||
| 483 | if (ret) { | ||
| 484 | inotify_remove_from_idr(group, tmp_ientry); | ||
| 485 | if (ret == -EEXIST) | ||
| 486 | goto find_entry; | ||
| 487 | goto out_err; | ||
| 488 | } | ||
| 489 | |||
| 490 | /* tmp_ientry has been added to the inode, so we are all set up. | ||
| 491 | * now we just need to make sure tmp_ientry doesn't get freed and | ||
| 492 | * we need to set up entry and ientry so the generic code can | ||
| 493 | * do its thing. */ | ||
| 494 | ientry = tmp_ientry; | ||
| 495 | entry = &ientry->fsn_entry; | ||
| 496 | tmp_ientry = NULL; | ||
| 497 | |||
| 498 | atomic_inc(&group->inotify_data.user->inotify_watches); | ||
| 499 | |||
| 500 | /* update the idr hint */ | ||
| 501 | group->inotify_data.last_wd = ientry->wd; | ||
| 502 | |||
| 503 | /* we put the mark on the idr, take a reference */ | ||
| 504 | fsnotify_get_mark(entry); | ||
| 505 | } | ||
| 506 | 488 | ||
| 507 | ret = ientry->wd; | 489 | ientry = container_of(entry, struct inotify_inode_mark_entry, fsn_entry); |
| 508 | 490 | ||
| 509 | spin_lock(&entry->lock); | 491 | spin_lock(&entry->lock); |
| 510 | 492 | ||
| @@ -536,18 +518,107 @@ retry: | |||
| 536 | fsnotify_recalc_group_mask(group); | 518 | fsnotify_recalc_group_mask(group); |
| 537 | } | 519 | } |
| 538 | 520 | ||
| 539 | /* this either matches fsnotify_find_mark_entry, or init_mark_entry | 521 | /* return the wd */ |
| 540 | * depending on which path we took... */ | 522 | ret = ientry->wd; |
| 523 | |||
| 524 | /* match the get from fsnotify_find_mark_entry() */ | ||
| 541 | fsnotify_put_mark(entry); | 525 | fsnotify_put_mark(entry); |
| 542 | 526 | ||
| 527 | return ret; | ||
| 528 | } | ||
| 529 | |||
| 530 | static int inotify_new_watch(struct fsnotify_group *group, | ||
| 531 | struct inode *inode, | ||
| 532 | u32 arg) | ||
| 533 | { | ||
| 534 | struct inotify_inode_mark_entry *tmp_ientry; | ||
| 535 | __u32 mask; | ||
| 536 | int ret; | ||
| 537 | |||
| 538 | /* don't allow invalid bits: we don't want flags set */ | ||
| 539 | mask = inotify_arg_to_mask(arg); | ||
| 540 | if (unlikely(!mask)) | ||
| 541 | return -EINVAL; | ||
| 542 | |||
| 543 | tmp_ientry = kmem_cache_alloc(inotify_inode_mark_cachep, GFP_KERNEL); | ||
| 544 | if (unlikely(!tmp_ientry)) | ||
| 545 | return -ENOMEM; | ||
| 546 | |||
| 547 | fsnotify_init_mark(&tmp_ientry->fsn_entry, inotify_free_mark); | ||
| 548 | tmp_ientry->fsn_entry.mask = mask; | ||
| 549 | tmp_ientry->wd = -1; | ||
| 550 | |||
| 551 | ret = -ENOSPC; | ||
| 552 | if (atomic_read(&group->inotify_data.user->inotify_watches) >= inotify_max_user_watches) | ||
| 553 | goto out_err; | ||
| 554 | retry: | ||
| 555 | ret = -ENOMEM; | ||
| 556 | if (unlikely(!idr_pre_get(&group->inotify_data.idr, GFP_KERNEL))) | ||
| 557 | goto out_err; | ||
| 558 | |||
| 559 | spin_lock(&group->inotify_data.idr_lock); | ||
| 560 | ret = idr_get_new_above(&group->inotify_data.idr, &tmp_ientry->fsn_entry, | ||
| 561 | group->inotify_data.last_wd, | ||
| 562 | &tmp_ientry->wd); | ||
| 563 | spin_unlock(&group->inotify_data.idr_lock); | ||
| 564 | if (ret) { | ||
| 565 | /* idr was out of memory allocate and try again */ | ||
| 566 | if (ret == -EAGAIN) | ||
| 567 | goto retry; | ||
| 568 | goto out_err; | ||
| 569 | } | ||
| 570 | |||
| 571 | /* we put the mark on the idr, take a reference */ | ||
| 572 | fsnotify_get_mark(&tmp_ientry->fsn_entry); | ||
| 573 | |||
| 574 | /* we are on the idr, now get on the inode */ | ||
| 575 | ret = fsnotify_add_mark(&tmp_ientry->fsn_entry, group, inode); | ||
| 576 | if (ret) { | ||
| 577 | /* we failed to get on the inode, get off the idr */ | ||
| 578 | inotify_remove_from_idr(group, tmp_ientry); | ||
| 579 | goto out_err; | ||
| 580 | } | ||
| 581 | |||
| 582 | /* update the idr hint, who cares about races, it's just a hint */ | ||
| 583 | group->inotify_data.last_wd = tmp_ientry->wd; | ||
| 584 | |||
| 585 | /* increment the number of watches the user has */ | ||
| 586 | atomic_inc(&group->inotify_data.user->inotify_watches); | ||
| 587 | |||
| 588 | /* return the watch descriptor for this new entry */ | ||
| 589 | ret = tmp_ientry->wd; | ||
| 590 | |||
| 591 | /* match the ref from fsnotify_init_markentry() */ | ||
| 592 | fsnotify_put_mark(&tmp_ientry->fsn_entry); | ||
| 593 | |||
| 594 | /* if this mark added a new event update the group mask */ | ||
| 595 | if (mask & ~group->mask) | ||
| 596 | fsnotify_recalc_group_mask(group); | ||
| 597 | |||
| 543 | out_err: | 598 | out_err: |
| 544 | /* could be an error, could be that we found an existing mark */ | 599 | if (ret < 0) |
| 545 | if (tmp_ientry) { | ||
| 546 | /* on the idr but didn't make it on the inode */ | ||
| 547 | if (tmp_ientry->wd != -1) | ||
| 548 | inotify_remove_from_idr(group, tmp_ientry); | ||
| 549 | kmem_cache_free(inotify_inode_mark_cachep, tmp_ientry); | 600 | kmem_cache_free(inotify_inode_mark_cachep, tmp_ientry); |
| 550 | } | 601 | |
| 602 | return ret; | ||
| 603 | } | ||
| 604 | |||
| 605 | static int inotify_update_watch(struct fsnotify_group *group, struct inode *inode, u32 arg) | ||
| 606 | { | ||
| 607 | int ret = 0; | ||
| 608 | |||
| 609 | retry: | ||
| 610 | /* try to update and existing watch with the new arg */ | ||
| 611 | ret = inotify_update_existing_watch(group, inode, arg); | ||
| 612 | /* no mark present, try to add a new one */ | ||
| 613 | if (ret == -ENOENT) | ||
| 614 | ret = inotify_new_watch(group, inode, arg); | ||
| 615 | /* | ||
| 616 | * inotify_new_watch could race with another thread which did an | ||
| 617 | * inotify_new_watch between the update_existing and the add watch | ||
| 618 | * here, go back and try to update an existing mark again. | ||
| 619 | */ | ||
| 620 | if (ret == -EEXIST) | ||
| 621 | goto retry; | ||
| 551 | 622 | ||
| 552 | return ret; | 623 | return ret; |
| 553 | } | 624 | } |
diff --git a/fs/ocfs2/alloc.c b/fs/ocfs2/alloc.c index f9a3e8942669..ab513ddaeff2 100644 --- a/fs/ocfs2/alloc.c +++ b/fs/ocfs2/alloc.c | |||
| @@ -6851,7 +6851,7 @@ static int ocfs2_do_truncate(struct ocfs2_super *osb, | |||
| 6851 | } | 6851 | } |
| 6852 | status = 0; | 6852 | status = 0; |
| 6853 | bail: | 6853 | bail: |
| 6854 | 6854 | brelse(last_eb_bh); | |
| 6855 | mlog_exit(status); | 6855 | mlog_exit(status); |
| 6856 | return status; | 6856 | return status; |
| 6857 | } | 6857 | } |
diff --git a/fs/ocfs2/aops.c b/fs/ocfs2/aops.c index b401654011a2..8a1e61545f41 100644 --- a/fs/ocfs2/aops.c +++ b/fs/ocfs2/aops.c | |||
| @@ -1747,8 +1747,8 @@ int ocfs2_write_begin_nolock(struct address_space *mapping, | |||
| 1747 | * we know zeros will only be needed in the first and/or last cluster. | 1747 | * we know zeros will only be needed in the first and/or last cluster. |
| 1748 | */ | 1748 | */ |
| 1749 | if (clusters_to_alloc || extents_to_split || | 1749 | if (clusters_to_alloc || extents_to_split || |
| 1750 | wc->w_desc[0].c_needs_zero || | 1750 | (wc->w_clen && (wc->w_desc[0].c_needs_zero || |
| 1751 | wc->w_desc[wc->w_clen - 1].c_needs_zero) | 1751 | wc->w_desc[wc->w_clen - 1].c_needs_zero))) |
| 1752 | cluster_of_pages = 1; | 1752 | cluster_of_pages = 1; |
| 1753 | else | 1753 | else |
| 1754 | cluster_of_pages = 0; | 1754 | cluster_of_pages = 0; |
diff --git a/fs/ocfs2/dcache.c b/fs/ocfs2/dcache.c index 2f28b7de2c8d..b4957c7d9fe2 100644 --- a/fs/ocfs2/dcache.c +++ b/fs/ocfs2/dcache.c | |||
| @@ -85,6 +85,17 @@ static int ocfs2_dentry_revalidate(struct dentry *dentry, | |||
| 85 | goto bail; | 85 | goto bail; |
| 86 | } | 86 | } |
| 87 | 87 | ||
| 88 | /* | ||
| 89 | * If the last lookup failed to create dentry lock, let us | ||
| 90 | * redo it. | ||
| 91 | */ | ||
| 92 | if (!dentry->d_fsdata) { | ||
| 93 | mlog(0, "Inode %llu doesn't have dentry lock, " | ||
| 94 | "returning false\n", | ||
| 95 | (unsigned long long)OCFS2_I(inode)->ip_blkno); | ||
| 96 | goto bail; | ||
| 97 | } | ||
| 98 | |||
| 88 | ret = 1; | 99 | ret = 1; |
| 89 | 100 | ||
| 90 | bail: | 101 | bail: |
diff --git a/fs/ocfs2/dlm/dlmunlock.c b/fs/ocfs2/dlm/dlmunlock.c index fcf879ed6930..756f5b0998e0 100644 --- a/fs/ocfs2/dlm/dlmunlock.c +++ b/fs/ocfs2/dlm/dlmunlock.c | |||
| @@ -122,7 +122,7 @@ static enum dlm_status dlmunlock_common(struct dlm_ctxt *dlm, | |||
| 122 | * that still has AST's pending... */ | 122 | * that still has AST's pending... */ |
| 123 | in_use = !list_empty(&lock->ast_list); | 123 | in_use = !list_empty(&lock->ast_list); |
| 124 | spin_unlock(&dlm->ast_lock); | 124 | spin_unlock(&dlm->ast_lock); |
| 125 | if (in_use) { | 125 | if (in_use && !(flags & LKM_CANCEL)) { |
| 126 | mlog(ML_ERROR, "lockres %.*s: Someone is calling dlmunlock " | 126 | mlog(ML_ERROR, "lockres %.*s: Someone is calling dlmunlock " |
| 127 | "while waiting for an ast!", res->lockname.len, | 127 | "while waiting for an ast!", res->lockname.len, |
| 128 | res->lockname.name); | 128 | res->lockname.name); |
| @@ -131,7 +131,7 @@ static enum dlm_status dlmunlock_common(struct dlm_ctxt *dlm, | |||
| 131 | 131 | ||
| 132 | spin_lock(&res->spinlock); | 132 | spin_lock(&res->spinlock); |
| 133 | if (res->state & DLM_LOCK_RES_IN_PROGRESS) { | 133 | if (res->state & DLM_LOCK_RES_IN_PROGRESS) { |
| 134 | if (master_node) { | 134 | if (master_node && !(flags & LKM_CANCEL)) { |
| 135 | mlog(ML_ERROR, "lockres in progress!\n"); | 135 | mlog(ML_ERROR, "lockres in progress!\n"); |
| 136 | spin_unlock(&res->spinlock); | 136 | spin_unlock(&res->spinlock); |
| 137 | return DLM_FORWARD; | 137 | return DLM_FORWARD; |
diff --git a/fs/ocfs2/ocfs2_lockid.h b/fs/ocfs2/ocfs2_lockid.h index fcdba091af3d..c212cf5a2bdf 100644 --- a/fs/ocfs2/ocfs2_lockid.h +++ b/fs/ocfs2/ocfs2_lockid.h | |||
| @@ -108,6 +108,7 @@ static char *ocfs2_lock_type_strings[] = { | |||
| 108 | [OCFS2_LOCK_TYPE_OPEN] = "Open", | 108 | [OCFS2_LOCK_TYPE_OPEN] = "Open", |
| 109 | [OCFS2_LOCK_TYPE_FLOCK] = "Flock", | 109 | [OCFS2_LOCK_TYPE_FLOCK] = "Flock", |
| 110 | [OCFS2_LOCK_TYPE_QINFO] = "Quota", | 110 | [OCFS2_LOCK_TYPE_QINFO] = "Quota", |
| 111 | [OCFS2_LOCK_TYPE_NFS_SYNC] = "NFSSync", | ||
| 111 | [OCFS2_LOCK_TYPE_ORPHAN_SCAN] = "OrphanScan", | 112 | [OCFS2_LOCK_TYPE_ORPHAN_SCAN] = "OrphanScan", |
| 112 | }; | 113 | }; |
| 113 | 114 | ||
diff --git a/fs/ocfs2/quota_global.c b/fs/ocfs2/quota_global.c index bf7742d0ee3b..44f2a5e1d042 100644 --- a/fs/ocfs2/quota_global.c +++ b/fs/ocfs2/quota_global.c | |||
| @@ -23,6 +23,7 @@ | |||
| 23 | #include "sysfile.h" | 23 | #include "sysfile.h" |
| 24 | #include "dlmglue.h" | 24 | #include "dlmglue.h" |
| 25 | #include "uptodate.h" | 25 | #include "uptodate.h" |
| 26 | #include "super.h" | ||
| 26 | #include "quota.h" | 27 | #include "quota.h" |
| 27 | 28 | ||
| 28 | static struct workqueue_struct *ocfs2_quota_wq = NULL; | 29 | static struct workqueue_struct *ocfs2_quota_wq = NULL; |
| @@ -114,6 +115,15 @@ int ocfs2_read_quota_block(struct inode *inode, u64 v_block, | |||
| 114 | int rc = 0; | 115 | int rc = 0; |
| 115 | struct buffer_head *tmp = *bh; | 116 | struct buffer_head *tmp = *bh; |
| 116 | 117 | ||
| 118 | if (i_size_read(inode) >> inode->i_sb->s_blocksize_bits <= v_block) { | ||
| 119 | ocfs2_error(inode->i_sb, | ||
| 120 | "Quota file %llu is probably corrupted! Requested " | ||
| 121 | "to read block %Lu but file has size only %Lu\n", | ||
| 122 | (unsigned long long)OCFS2_I(inode)->ip_blkno, | ||
| 123 | (unsigned long long)v_block, | ||
| 124 | (unsigned long long)i_size_read(inode)); | ||
| 125 | return -EIO; | ||
| 126 | } | ||
| 117 | rc = ocfs2_read_virt_blocks(inode, v_block, 1, &tmp, 0, | 127 | rc = ocfs2_read_virt_blocks(inode, v_block, 1, &tmp, 0, |
| 118 | ocfs2_validate_quota_block); | 128 | ocfs2_validate_quota_block); |
| 119 | if (rc) | 129 | if (rc) |
diff --git a/fs/ocfs2/super.c b/fs/ocfs2/super.c index b0ee0fdf799a..a3f8871d21fd 100644 --- a/fs/ocfs2/super.c +++ b/fs/ocfs2/super.c | |||
| @@ -1218,13 +1218,17 @@ static void ocfs2_kill_sb(struct super_block *sb) | |||
| 1218 | { | 1218 | { |
| 1219 | struct ocfs2_super *osb = OCFS2_SB(sb); | 1219 | struct ocfs2_super *osb = OCFS2_SB(sb); |
| 1220 | 1220 | ||
| 1221 | /* Failed mount? */ | ||
| 1222 | if (!osb || atomic_read(&osb->vol_state) == VOLUME_DISABLED) | ||
| 1223 | goto out; | ||
| 1224 | |||
| 1221 | /* Prevent further queueing of inode drop events */ | 1225 | /* Prevent further queueing of inode drop events */ |
| 1222 | spin_lock(&dentry_list_lock); | 1226 | spin_lock(&dentry_list_lock); |
| 1223 | ocfs2_set_osb_flag(osb, OCFS2_OSB_DROP_DENTRY_LOCK_IMMED); | 1227 | ocfs2_set_osb_flag(osb, OCFS2_OSB_DROP_DENTRY_LOCK_IMMED); |
| 1224 | spin_unlock(&dentry_list_lock); | 1228 | spin_unlock(&dentry_list_lock); |
| 1225 | /* Wait for work to finish and/or remove it */ | 1229 | /* Wait for work to finish and/or remove it */ |
| 1226 | cancel_work_sync(&osb->dentry_lock_work); | 1230 | cancel_work_sync(&osb->dentry_lock_work); |
| 1227 | 1231 | out: | |
| 1228 | kill_block_super(sb); | 1232 | kill_block_super(sb); |
| 1229 | } | 1233 | } |
| 1230 | 1234 | ||
diff --git a/fs/xfs/linux-2.6/xfs_ioctl32.c b/fs/xfs/linux-2.6/xfs_ioctl32.c index 0882d166239a..eafcc7c18706 100644 --- a/fs/xfs/linux-2.6/xfs_ioctl32.c +++ b/fs/xfs/linux-2.6/xfs_ioctl32.c | |||
| @@ -619,7 +619,7 @@ xfs_file_compat_ioctl( | |||
| 619 | case XFS_IOC_GETVERSION_32: | 619 | case XFS_IOC_GETVERSION_32: |
| 620 | cmd = _NATIVE_IOC(cmd, long); | 620 | cmd = _NATIVE_IOC(cmd, long); |
| 621 | return xfs_file_ioctl(filp, cmd, p); | 621 | return xfs_file_ioctl(filp, cmd, p); |
| 622 | case XFS_IOC_SWAPEXT: { | 622 | case XFS_IOC_SWAPEXT_32: { |
| 623 | struct xfs_swapext sxp; | 623 | struct xfs_swapext sxp; |
| 624 | struct compat_xfs_swapext __user *sxu = arg; | 624 | struct compat_xfs_swapext __user *sxu = arg; |
| 625 | 625 | ||
diff --git a/include/acpi/processor.h b/include/acpi/processor.h index baf1e0a9a7ee..740ac3ad8fd0 100644 --- a/include/acpi/processor.h +++ b/include/acpi/processor.h | |||
| @@ -174,7 +174,7 @@ struct acpi_processor_throttling { | |||
| 174 | cpumask_var_t shared_cpu_map; | 174 | cpumask_var_t shared_cpu_map; |
| 175 | int (*acpi_processor_get_throttling) (struct acpi_processor * pr); | 175 | int (*acpi_processor_get_throttling) (struct acpi_processor * pr); |
| 176 | int (*acpi_processor_set_throttling) (struct acpi_processor * pr, | 176 | int (*acpi_processor_set_throttling) (struct acpi_processor * pr, |
| 177 | int state); | 177 | int state, bool force); |
| 178 | 178 | ||
| 179 | u32 address; | 179 | u32 address; |
| 180 | u8 duty_offset; | 180 | u8 duty_offset; |
| @@ -321,7 +321,8 @@ static inline int acpi_processor_ppc_has_changed(struct acpi_processor *pr) | |||
| 321 | /* in processor_throttling.c */ | 321 | /* in processor_throttling.c */ |
| 322 | int acpi_processor_tstate_has_changed(struct acpi_processor *pr); | 322 | int acpi_processor_tstate_has_changed(struct acpi_processor *pr); |
| 323 | int acpi_processor_get_throttling_info(struct acpi_processor *pr); | 323 | int acpi_processor_get_throttling_info(struct acpi_processor *pr); |
| 324 | extern int acpi_processor_set_throttling(struct acpi_processor *pr, int state); | 324 | extern int acpi_processor_set_throttling(struct acpi_processor *pr, |
| 325 | int state, bool force); | ||
| 325 | extern const struct file_operations acpi_processor_throttling_fops; | 326 | extern const struct file_operations acpi_processor_throttling_fops; |
| 326 | extern void acpi_processor_throttling_init(void); | 327 | extern void acpi_processor_throttling_init(void); |
| 327 | /* in processor_idle.c */ | 328 | /* in processor_idle.c */ |
diff --git a/include/crypto/algapi.h b/include/crypto/algapi.h index 010545436efa..5a2bd1cc9656 100644 --- a/include/crypto/algapi.h +++ b/include/crypto/algapi.h | |||
| @@ -137,6 +137,7 @@ struct crypto_instance *crypto_alloc_instance(const char *name, | |||
| 137 | void crypto_init_queue(struct crypto_queue *queue, unsigned int max_qlen); | 137 | void crypto_init_queue(struct crypto_queue *queue, unsigned int max_qlen); |
| 138 | int crypto_enqueue_request(struct crypto_queue *queue, | 138 | int crypto_enqueue_request(struct crypto_queue *queue, |
| 139 | struct crypto_async_request *request); | 139 | struct crypto_async_request *request); |
| 140 | void *__crypto_dequeue_request(struct crypto_queue *queue, unsigned int offset); | ||
| 140 | struct crypto_async_request *crypto_dequeue_request(struct crypto_queue *queue); | 141 | struct crypto_async_request *crypto_dequeue_request(struct crypto_queue *queue); |
| 141 | int crypto_tfm_in_queue(struct crypto_queue *queue, struct crypto_tfm *tfm); | 142 | int crypto_tfm_in_queue(struct crypto_queue *queue, struct crypto_tfm *tfm); |
| 142 | 143 | ||
diff --git a/include/crypto/internal/skcipher.h b/include/crypto/internal/skcipher.h index 2ba42cd7d6aa..3a748a6bf772 100644 --- a/include/crypto/internal/skcipher.h +++ b/include/crypto/internal/skcipher.h | |||
| @@ -79,8 +79,8 @@ static inline int skcipher_enqueue_givcrypt( | |||
| 79 | static inline struct skcipher_givcrypt_request *skcipher_dequeue_givcrypt( | 79 | static inline struct skcipher_givcrypt_request *skcipher_dequeue_givcrypt( |
| 80 | struct crypto_queue *queue) | 80 | struct crypto_queue *queue) |
| 81 | { | 81 | { |
| 82 | return container_of(ablkcipher_dequeue_request(queue), | 82 | return __crypto_dequeue_request( |
| 83 | struct skcipher_givcrypt_request, creq); | 83 | queue, offsetof(struct skcipher_givcrypt_request, creq.base)); |
| 84 | } | 84 | } |
| 85 | 85 | ||
| 86 | static inline void *skcipher_givcrypt_reqctx( | 86 | static inline void *skcipher_givcrypt_reqctx( |
diff --git a/include/linux/binfmts.h b/include/linux/binfmts.h index 61ee18c1bdb4..2046b5b8af48 100644 --- a/include/linux/binfmts.h +++ b/include/linux/binfmts.h | |||
| @@ -117,6 +117,7 @@ extern int setup_arg_pages(struct linux_binprm * bprm, | |||
| 117 | int executable_stack); | 117 | int executable_stack); |
| 118 | extern int bprm_mm_init(struct linux_binprm *bprm); | 118 | extern int bprm_mm_init(struct linux_binprm *bprm); |
| 119 | extern int copy_strings_kernel(int argc,char ** argv,struct linux_binprm *bprm); | 119 | extern int copy_strings_kernel(int argc,char ** argv,struct linux_binprm *bprm); |
| 120 | extern int prepare_bprm_creds(struct linux_binprm *bprm); | ||
| 120 | extern void install_exec_creds(struct linux_binprm *bprm); | 121 | extern void install_exec_creds(struct linux_binprm *bprm); |
| 121 | extern void do_coredump(long signr, int exit_code, struct pt_regs *regs); | 122 | extern void do_coredump(long signr, int exit_code, struct pt_regs *regs); |
| 122 | extern int set_binfmt(struct linux_binfmt *new); | 123 | extern int set_binfmt(struct linux_binfmt *new); |
diff --git a/include/linux/device-mapper.h b/include/linux/device-mapper.h index 655e7721580a..df7607e6dce8 100644 --- a/include/linux/device-mapper.h +++ b/include/linux/device-mapper.h | |||
| @@ -91,6 +91,9 @@ typedef int (*dm_iterate_devices_fn) (struct dm_target *ti, | |||
| 91 | iterate_devices_callout_fn fn, | 91 | iterate_devices_callout_fn fn, |
| 92 | void *data); | 92 | void *data); |
| 93 | 93 | ||
| 94 | typedef void (*dm_io_hints_fn) (struct dm_target *ti, | ||
| 95 | struct queue_limits *limits); | ||
| 96 | |||
| 94 | /* | 97 | /* |
| 95 | * Returns: | 98 | * Returns: |
| 96 | * 0: The target can handle the next I/O immediately. | 99 | * 0: The target can handle the next I/O immediately. |
| @@ -151,6 +154,7 @@ struct target_type { | |||
| 151 | dm_merge_fn merge; | 154 | dm_merge_fn merge; |
| 152 | dm_busy_fn busy; | 155 | dm_busy_fn busy; |
| 153 | dm_iterate_devices_fn iterate_devices; | 156 | dm_iterate_devices_fn iterate_devices; |
| 157 | dm_io_hints_fn io_hints; | ||
| 154 | 158 | ||
| 155 | /* For internal device-mapper use. */ | 159 | /* For internal device-mapper use. */ |
| 156 | struct list_head list; | 160 | struct list_head list; |
diff --git a/include/linux/dm-log-userspace.h b/include/linux/dm-log-userspace.h index 642e3017b51f..8a1f972c0fe9 100644 --- a/include/linux/dm-log-userspace.h +++ b/include/linux/dm-log-userspace.h | |||
| @@ -371,7 +371,18 @@ | |||
| 371 | (DM_ULOG_REQUEST_MASK & (request_type)) | 371 | (DM_ULOG_REQUEST_MASK & (request_type)) |
| 372 | 372 | ||
| 373 | struct dm_ulog_request { | 373 | struct dm_ulog_request { |
| 374 | char uuid[DM_UUID_LEN]; /* Ties a request to a specific mirror log */ | 374 | /* |
| 375 | * The local unique identifier (luid) and the universally unique | ||
| 376 | * identifier (uuid) are used to tie a request to a specific | ||
| 377 | * mirror log. A single machine log could probably make due with | ||
| 378 | * just the 'luid', but a cluster-aware log must use the 'uuid' and | ||
| 379 | * the 'luid'. The uuid is what is required for node to node | ||
| 380 | * communication concerning a particular log, but the 'luid' helps | ||
| 381 | * differentiate between logs that are being swapped and have the | ||
| 382 | * same 'uuid'. (Think "live" and "inactive" device-mapper tables.) | ||
| 383 | */ | ||
| 384 | uint64_t luid; | ||
| 385 | char uuid[DM_UUID_LEN]; | ||
| 375 | char padding[7]; /* Padding because DM_UUID_LEN = 129 */ | 386 | char padding[7]; /* Padding because DM_UUID_LEN = 129 */ |
| 376 | 387 | ||
| 377 | int32_t error; /* Used to report back processing errors */ | 388 | int32_t error; /* Used to report back processing errors */ |
diff --git a/include/linux/flex_array.h b/include/linux/flex_array.h index 23c1ec79a31b..45ff18491514 100644 --- a/include/linux/flex_array.h +++ b/include/linux/flex_array.h | |||
| @@ -21,7 +21,7 @@ struct flex_array { | |||
| 21 | struct { | 21 | struct { |
| 22 | int element_size; | 22 | int element_size; |
| 23 | int total_nr_elements; | 23 | int total_nr_elements; |
| 24 | struct flex_array_part *parts[0]; | 24 | struct flex_array_part *parts[]; |
| 25 | }; | 25 | }; |
| 26 | /* | 26 | /* |
| 27 | * This little trick makes sure that | 27 | * This little trick makes sure that |
| @@ -36,12 +36,14 @@ struct flex_array { | |||
| 36 | .total_nr_elements = (total), \ | 36 | .total_nr_elements = (total), \ |
| 37 | } } } | 37 | } } } |
| 38 | 38 | ||
| 39 | struct flex_array *flex_array_alloc(int element_size, int total, gfp_t flags); | 39 | struct flex_array *flex_array_alloc(int element_size, unsigned int total, |
| 40 | int flex_array_prealloc(struct flex_array *fa, int start, int end, gfp_t flags); | 40 | gfp_t flags); |
| 41 | int flex_array_prealloc(struct flex_array *fa, unsigned int start, | ||
| 42 | unsigned int end, gfp_t flags); | ||
| 41 | void flex_array_free(struct flex_array *fa); | 43 | void flex_array_free(struct flex_array *fa); |
| 42 | void flex_array_free_parts(struct flex_array *fa); | 44 | void flex_array_free_parts(struct flex_array *fa); |
| 43 | int flex_array_put(struct flex_array *fa, int element_nr, void *src, | 45 | int flex_array_put(struct flex_array *fa, unsigned int element_nr, void *src, |
| 44 | gfp_t flags); | 46 | gfp_t flags); |
| 45 | void *flex_array_get(struct flex_array *fa, int element_nr); | 47 | void *flex_array_get(struct flex_array *fa, unsigned int element_nr); |
| 46 | 48 | ||
| 47 | #endif /* _FLEX_ARRAY_H */ | 49 | #endif /* _FLEX_ARRAY_H */ |
diff --git a/include/linux/fs.h b/include/linux/fs.h index 67888a9e0655..73e9b643e455 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
| @@ -2123,7 +2123,7 @@ extern struct file *do_filp_open(int dfd, const char *pathname, | |||
| 2123 | int open_flag, int mode, int acc_mode); | 2123 | int open_flag, int mode, int acc_mode); |
| 2124 | extern int may_open(struct path *, int, int); | 2124 | extern int may_open(struct path *, int, int); |
| 2125 | 2125 | ||
| 2126 | extern int kernel_read(struct file *, unsigned long, char *, unsigned long); | 2126 | extern int kernel_read(struct file *, loff_t, char *, unsigned long); |
| 2127 | extern struct file * open_exec(const char *); | 2127 | extern struct file * open_exec(const char *); |
| 2128 | 2128 | ||
| 2129 | /* fs/dcache.c -- generic fs support functions */ | 2129 | /* fs/dcache.c -- generic fs support functions */ |
diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h index 2723513a5651..5cbc620bdfe0 100644 --- a/include/linux/hugetlb.h +++ b/include/linux/hugetlb.h | |||
| @@ -10,6 +10,7 @@ | |||
| 10 | #include <asm/tlbflush.h> | 10 | #include <asm/tlbflush.h> |
| 11 | 11 | ||
| 12 | struct ctl_table; | 12 | struct ctl_table; |
| 13 | struct user_struct; | ||
| 13 | 14 | ||
| 14 | int PageHuge(struct page *page); | 15 | int PageHuge(struct page *page); |
| 15 | 16 | ||
| @@ -146,7 +147,8 @@ static inline struct hugetlbfs_sb_info *HUGETLBFS_SB(struct super_block *sb) | |||
| 146 | 147 | ||
| 147 | extern const struct file_operations hugetlbfs_file_operations; | 148 | extern const struct file_operations hugetlbfs_file_operations; |
| 148 | extern struct vm_operations_struct hugetlb_vm_ops; | 149 | extern struct vm_operations_struct hugetlb_vm_ops; |
| 149 | struct file *hugetlb_file_setup(const char *name, size_t, int); | 150 | struct file *hugetlb_file_setup(const char *name, size_t size, int acct, |
| 151 | struct user_struct **user); | ||
| 150 | int hugetlb_get_quota(struct address_space *mapping, long delta); | 152 | int hugetlb_get_quota(struct address_space *mapping, long delta); |
| 151 | void hugetlb_put_quota(struct address_space *mapping, long delta); | 153 | void hugetlb_put_quota(struct address_space *mapping, long delta); |
| 152 | 154 | ||
| @@ -168,7 +170,7 @@ static inline void set_file_hugepages(struct file *file) | |||
| 168 | 170 | ||
| 169 | #define is_file_hugepages(file) 0 | 171 | #define is_file_hugepages(file) 0 |
| 170 | #define set_file_hugepages(file) BUG() | 172 | #define set_file_hugepages(file) BUG() |
| 171 | #define hugetlb_file_setup(name,size,acctflag) ERR_PTR(-ENOSYS) | 173 | #define hugetlb_file_setup(name,size,acct,user) ERR_PTR(-ENOSYS) |
| 172 | 174 | ||
| 173 | #endif /* !CONFIG_HUGETLBFS */ | 175 | #endif /* !CONFIG_HUGETLBFS */ |
| 174 | 176 | ||
diff --git a/include/linux/lmb.h b/include/linux/lmb.h index c46c89505dac..2442e3f3d033 100644 --- a/include/linux/lmb.h +++ b/include/linux/lmb.h | |||
| @@ -51,7 +51,7 @@ extern u64 __init lmb_alloc_base(u64 size, | |||
| 51 | extern u64 __init __lmb_alloc_base(u64 size, | 51 | extern u64 __init __lmb_alloc_base(u64 size, |
| 52 | u64 align, u64 max_addr); | 52 | u64 align, u64 max_addr); |
| 53 | extern u64 __init lmb_phys_mem_size(void); | 53 | extern u64 __init lmb_phys_mem_size(void); |
| 54 | extern u64 __init lmb_end_of_DRAM(void); | 54 | extern u64 lmb_end_of_DRAM(void); |
| 55 | extern void __init lmb_enforce_memory_limit(u64 memory_limit); | 55 | extern void __init lmb_enforce_memory_limit(u64 memory_limit); |
| 56 | extern int __init lmb_is_reserved(u64 addr); | 56 | extern int __init lmb_is_reserved(u64 addr); |
| 57 | extern int lmb_find(struct lmb_property *res); | 57 | extern int lmb_find(struct lmb_property *res); |
diff --git a/include/linux/ucb1400.h b/include/linux/ucb1400.h index ed889f4168f3..ae779bb8cc0f 100644 --- a/include/linux/ucb1400.h +++ b/include/linux/ucb1400.h | |||
| @@ -73,6 +73,10 @@ | |||
| 73 | 73 | ||
| 74 | #define UCB_ADC_DATA 0x68 | 74 | #define UCB_ADC_DATA 0x68 |
| 75 | #define UCB_ADC_DAT_VALID (1 << 15) | 75 | #define UCB_ADC_DAT_VALID (1 << 15) |
| 76 | |||
| 77 | #define UCB_FCSR 0x6c | ||
| 78 | #define UCB_FCSR_AVE (1 << 12) | ||
| 79 | |||
| 76 | #define UCB_ADC_DAT_MASK 0x3ff | 80 | #define UCB_ADC_DAT_MASK 0x3ff |
| 77 | 81 | ||
| 78 | #define UCB_ID 0x7e | 82 | #define UCB_ID 0x7e |
diff --git a/include/linux/workqueue.h b/include/linux/workqueue.h index 13e1adf55c4c..6273fa97b527 100644 --- a/include/linux/workqueue.h +++ b/include/linux/workqueue.h | |||
| @@ -240,6 +240,21 @@ static inline int cancel_delayed_work(struct delayed_work *work) | |||
| 240 | return ret; | 240 | return ret; |
| 241 | } | 241 | } |
| 242 | 242 | ||
| 243 | /* | ||
| 244 | * Like above, but uses del_timer() instead of del_timer_sync(). This means, | ||
| 245 | * if it returns 0 the timer function may be running and the queueing is in | ||
| 246 | * progress. | ||
| 247 | */ | ||
| 248 | static inline int __cancel_delayed_work(struct delayed_work *work) | ||
| 249 | { | ||
| 250 | int ret; | ||
| 251 | |||
| 252 | ret = del_timer(&work->timer); | ||
| 253 | if (ret) | ||
| 254 | work_clear_pending(&work->work); | ||
| 255 | return ret; | ||
| 256 | } | ||
| 257 | |||
| 243 | extern int cancel_delayed_work_sync(struct delayed_work *work); | 258 | extern int cancel_delayed_work_sync(struct delayed_work *work); |
| 244 | 259 | ||
| 245 | /* Obsolete. use cancel_delayed_work_sync() */ | 260 | /* Obsolete. use cancel_delayed_work_sync() */ |
diff --git a/init/main.c b/init/main.c index 2d9d6bdfe7c9..11f4f145be3f 100644 --- a/init/main.c +++ b/init/main.c | |||
| @@ -733,13 +733,14 @@ static void __init do_ctors(void) | |||
| 733 | int initcall_debug; | 733 | int initcall_debug; |
| 734 | core_param(initcall_debug, initcall_debug, bool, 0644); | 734 | core_param(initcall_debug, initcall_debug, bool, 0644); |
| 735 | 735 | ||
| 736 | static char msgbuf[64]; | ||
| 737 | static struct boot_trace_call call; | ||
| 738 | static struct boot_trace_ret ret; | ||
| 739 | |||
| 736 | int do_one_initcall(initcall_t fn) | 740 | int do_one_initcall(initcall_t fn) |
| 737 | { | 741 | { |
| 738 | int count = preempt_count(); | 742 | int count = preempt_count(); |
| 739 | ktime_t calltime, delta, rettime; | 743 | ktime_t calltime, delta, rettime; |
| 740 | char msgbuf[64]; | ||
| 741 | struct boot_trace_call call; | ||
| 742 | struct boot_trace_ret ret; | ||
| 743 | 744 | ||
| 744 | if (initcall_debug) { | 745 | if (initcall_debug) { |
| 745 | call.caller = task_pid_nr(current); | 746 | call.caller = task_pid_nr(current); |
| @@ -174,7 +174,7 @@ static void shm_destroy(struct ipc_namespace *ns, struct shmid_kernel *shp) | |||
| 174 | shm_unlock(shp); | 174 | shm_unlock(shp); |
| 175 | if (!is_file_hugepages(shp->shm_file)) | 175 | if (!is_file_hugepages(shp->shm_file)) |
| 176 | shmem_lock(shp->shm_file, 0, shp->mlock_user); | 176 | shmem_lock(shp->shm_file, 0, shp->mlock_user); |
| 177 | else | 177 | else if (shp->mlock_user) |
| 178 | user_shm_unlock(shp->shm_file->f_path.dentry->d_inode->i_size, | 178 | user_shm_unlock(shp->shm_file->f_path.dentry->d_inode->i_size, |
| 179 | shp->mlock_user); | 179 | shp->mlock_user); |
| 180 | fput (shp->shm_file); | 180 | fput (shp->shm_file); |
| @@ -369,8 +369,8 @@ static int newseg(struct ipc_namespace *ns, struct ipc_params *params) | |||
| 369 | /* hugetlb_file_setup applies strict accounting */ | 369 | /* hugetlb_file_setup applies strict accounting */ |
| 370 | if (shmflg & SHM_NORESERVE) | 370 | if (shmflg & SHM_NORESERVE) |
| 371 | acctflag = VM_NORESERVE; | 371 | acctflag = VM_NORESERVE; |
| 372 | file = hugetlb_file_setup(name, size, acctflag); | 372 | file = hugetlb_file_setup(name, size, acctflag, |
| 373 | shp->mlock_user = current_user(); | 373 | &shp->mlock_user); |
| 374 | } else { | 374 | } else { |
| 375 | /* | 375 | /* |
| 376 | * Do not allow no accounting for OVERCOMMIT_NEVER, even | 376 | * Do not allow no accounting for OVERCOMMIT_NEVER, even |
| @@ -410,6 +410,8 @@ static int newseg(struct ipc_namespace *ns, struct ipc_params *params) | |||
| 410 | return error; | 410 | return error; |
| 411 | 411 | ||
| 412 | no_id: | 412 | no_id: |
| 413 | if (shp->mlock_user) /* shmflg & SHM_HUGETLB case */ | ||
| 414 | user_shm_unlock(size, shp->mlock_user); | ||
| 413 | fput(file); | 415 | fput(file); |
| 414 | no_file: | 416 | no_file: |
| 415 | security_shm_free(shp); | 417 | security_shm_free(shp); |
diff --git a/kernel/fork.c b/kernel/fork.c index 144326b7af50..e6c04d462ab2 100644 --- a/kernel/fork.c +++ b/kernel/fork.c | |||
| @@ -815,11 +815,8 @@ static int copy_signal(unsigned long clone_flags, struct task_struct *tsk) | |||
| 815 | { | 815 | { |
| 816 | struct signal_struct *sig; | 816 | struct signal_struct *sig; |
| 817 | 817 | ||
| 818 | if (clone_flags & CLONE_THREAD) { | 818 | if (clone_flags & CLONE_THREAD) |
| 819 | atomic_inc(¤t->signal->count); | ||
| 820 | atomic_inc(¤t->signal->live); | ||
| 821 | return 0; | 819 | return 0; |
| 822 | } | ||
| 823 | 820 | ||
| 824 | sig = kmem_cache_alloc(signal_cachep, GFP_KERNEL); | 821 | sig = kmem_cache_alloc(signal_cachep, GFP_KERNEL); |
| 825 | tsk->signal = sig; | 822 | tsk->signal = sig; |
| @@ -877,16 +874,6 @@ void __cleanup_signal(struct signal_struct *sig) | |||
| 877 | kmem_cache_free(signal_cachep, sig); | 874 | kmem_cache_free(signal_cachep, sig); |
| 878 | } | 875 | } |
| 879 | 876 | ||
| 880 | static void cleanup_signal(struct task_struct *tsk) | ||
| 881 | { | ||
| 882 | struct signal_struct *sig = tsk->signal; | ||
| 883 | |||
| 884 | atomic_dec(&sig->live); | ||
| 885 | |||
| 886 | if (atomic_dec_and_test(&sig->count)) | ||
| 887 | __cleanup_signal(sig); | ||
| 888 | } | ||
| 889 | |||
| 890 | static void copy_flags(unsigned long clone_flags, struct task_struct *p) | 877 | static void copy_flags(unsigned long clone_flags, struct task_struct *p) |
| 891 | { | 878 | { |
| 892 | unsigned long new_flags = p->flags; | 879 | unsigned long new_flags = p->flags; |
| @@ -1239,6 +1226,8 @@ static struct task_struct *copy_process(unsigned long clone_flags, | |||
| 1239 | } | 1226 | } |
| 1240 | 1227 | ||
| 1241 | if (clone_flags & CLONE_THREAD) { | 1228 | if (clone_flags & CLONE_THREAD) { |
| 1229 | atomic_inc(¤t->signal->count); | ||
| 1230 | atomic_inc(¤t->signal->live); | ||
| 1242 | p->group_leader = current->group_leader; | 1231 | p->group_leader = current->group_leader; |
| 1243 | list_add_tail_rcu(&p->thread_group, &p->group_leader->thread_group); | 1232 | list_add_tail_rcu(&p->thread_group, &p->group_leader->thread_group); |
| 1244 | } | 1233 | } |
| @@ -1282,7 +1271,8 @@ bad_fork_cleanup_mm: | |||
| 1282 | if (p->mm) | 1271 | if (p->mm) |
| 1283 | mmput(p->mm); | 1272 | mmput(p->mm); |
| 1284 | bad_fork_cleanup_signal: | 1273 | bad_fork_cleanup_signal: |
| 1285 | cleanup_signal(p); | 1274 | if (!(clone_flags & CLONE_THREAD)) |
| 1275 | __cleanup_signal(p->signal); | ||
| 1286 | bad_fork_cleanup_sighand: | 1276 | bad_fork_cleanup_sighand: |
| 1287 | __cleanup_sighand(p->sighand); | 1277 | __cleanup_sighand(p->sighand); |
| 1288 | bad_fork_cleanup_fs: | 1278 | bad_fork_cleanup_fs: |
diff --git a/kernel/module.c b/kernel/module.c index fd1411403558..2d537186191f 100644 --- a/kernel/module.c +++ b/kernel/module.c | |||
| @@ -909,16 +909,18 @@ void __symbol_put(const char *symbol) | |||
| 909 | } | 909 | } |
| 910 | EXPORT_SYMBOL(__symbol_put); | 910 | EXPORT_SYMBOL(__symbol_put); |
| 911 | 911 | ||
| 912 | /* Note this assumes addr is a function, which it currently always is. */ | ||
| 912 | void symbol_put_addr(void *addr) | 913 | void symbol_put_addr(void *addr) |
| 913 | { | 914 | { |
| 914 | struct module *modaddr; | 915 | struct module *modaddr; |
| 916 | unsigned long a = (unsigned long)dereference_function_descriptor(addr); | ||
| 915 | 917 | ||
| 916 | if (core_kernel_text((unsigned long)addr)) | 918 | if (core_kernel_text(a)) |
| 917 | return; | 919 | return; |
| 918 | 920 | ||
| 919 | /* module_text_address is safe here: we're supposed to have reference | 921 | /* module_text_address is safe here: we're supposed to have reference |
| 920 | * to module from symbol_get, so it can't go away. */ | 922 | * to module from symbol_get, so it can't go away. */ |
| 921 | modaddr = __module_text_address((unsigned long)addr); | 923 | modaddr = __module_text_address(a); |
| 922 | BUG_ON(!modaddr); | 924 | BUG_ON(!modaddr); |
| 923 | module_put(modaddr); | 925 | module_put(modaddr); |
| 924 | } | 926 | } |
| @@ -1272,6 +1274,10 @@ static void add_notes_attrs(struct module *mod, unsigned int nsect, | |||
| 1272 | struct module_notes_attrs *notes_attrs; | 1274 | struct module_notes_attrs *notes_attrs; |
| 1273 | struct bin_attribute *nattr; | 1275 | struct bin_attribute *nattr; |
| 1274 | 1276 | ||
| 1277 | /* failed to create section attributes, so can't create notes */ | ||
| 1278 | if (!mod->sect_attrs) | ||
| 1279 | return; | ||
| 1280 | |||
| 1275 | /* Count notes sections and allocate structures. */ | 1281 | /* Count notes sections and allocate structures. */ |
| 1276 | notes = 0; | 1282 | notes = 0; |
| 1277 | for (i = 0; i < nsect; i++) | 1283 | for (i = 0; i < nsect; i++) |
diff --git a/kernel/perf_counter.c b/kernel/perf_counter.c index 36f65e2b8b57..d7cbc579fc80 100644 --- a/kernel/perf_counter.c +++ b/kernel/perf_counter.c | |||
| @@ -50,7 +50,7 @@ static atomic_t nr_task_counters __read_mostly; | |||
| 50 | * 1 - disallow cpu counters to unpriv | 50 | * 1 - disallow cpu counters to unpriv |
| 51 | * 2 - disallow kernel profiling to unpriv | 51 | * 2 - disallow kernel profiling to unpriv |
| 52 | */ | 52 | */ |
| 53 | int sysctl_perf_counter_paranoid __read_mostly; | 53 | int sysctl_perf_counter_paranoid __read_mostly = 1; |
| 54 | 54 | ||
| 55 | static inline bool perf_paranoid_cpu(void) | 55 | static inline bool perf_paranoid_cpu(void) |
| 56 | { | 56 | { |
| @@ -1791,7 +1791,7 @@ static int perf_counter_read_group(struct perf_counter *counter, | |||
| 1791 | size += err; | 1791 | size += err; |
| 1792 | 1792 | ||
| 1793 | list_for_each_entry(sub, &leader->sibling_list, list_entry) { | 1793 | list_for_each_entry(sub, &leader->sibling_list, list_entry) { |
| 1794 | err = perf_counter_read_entry(counter, read_format, | 1794 | err = perf_counter_read_entry(sub, read_format, |
| 1795 | buf + size); | 1795 | buf + size); |
| 1796 | if (err < 0) | 1796 | if (err < 0) |
| 1797 | return err; | 1797 | return err; |
| @@ -4066,6 +4066,7 @@ perf_counter_alloc(struct perf_counter_attr *attr, | |||
| 4066 | hwc->sample_period = attr->sample_period; | 4066 | hwc->sample_period = attr->sample_period; |
| 4067 | if (attr->freq && attr->sample_freq) | 4067 | if (attr->freq && attr->sample_freq) |
| 4068 | hwc->sample_period = 1; | 4068 | hwc->sample_period = 1; |
| 4069 | hwc->last_period = hwc->sample_period; | ||
| 4069 | 4070 | ||
| 4070 | atomic64_set(&hwc->period_left, hwc->sample_period); | 4071 | atomic64_set(&hwc->period_left, hwc->sample_period); |
| 4071 | 4072 | ||
diff --git a/kernel/time/clockevents.c b/kernel/time/clockevents.c index a6dcd67b041d..620b58abdc32 100644 --- a/kernel/time/clockevents.c +++ b/kernel/time/clockevents.c | |||
| @@ -137,11 +137,12 @@ int clockevents_program_event(struct clock_event_device *dev, ktime_t expires, | |||
| 137 | */ | 137 | */ |
| 138 | int clockevents_register_notifier(struct notifier_block *nb) | 138 | int clockevents_register_notifier(struct notifier_block *nb) |
| 139 | { | 139 | { |
| 140 | unsigned long flags; | ||
| 140 | int ret; | 141 | int ret; |
| 141 | 142 | ||
| 142 | spin_lock(&clockevents_lock); | 143 | spin_lock_irqsave(&clockevents_lock, flags); |
| 143 | ret = raw_notifier_chain_register(&clockevents_chain, nb); | 144 | ret = raw_notifier_chain_register(&clockevents_chain, nb); |
| 144 | spin_unlock(&clockevents_lock); | 145 | spin_unlock_irqrestore(&clockevents_lock, flags); |
| 145 | 146 | ||
| 146 | return ret; | 147 | return ret; |
| 147 | } | 148 | } |
| @@ -178,16 +179,18 @@ static void clockevents_notify_released(void) | |||
| 178 | */ | 179 | */ |
| 179 | void clockevents_register_device(struct clock_event_device *dev) | 180 | void clockevents_register_device(struct clock_event_device *dev) |
| 180 | { | 181 | { |
| 182 | unsigned long flags; | ||
| 183 | |||
| 181 | BUG_ON(dev->mode != CLOCK_EVT_MODE_UNUSED); | 184 | BUG_ON(dev->mode != CLOCK_EVT_MODE_UNUSED); |
| 182 | BUG_ON(!dev->cpumask); | 185 | BUG_ON(!dev->cpumask); |
| 183 | 186 | ||
| 184 | spin_lock(&clockevents_lock); | 187 | spin_lock_irqsave(&clockevents_lock, flags); |
| 185 | 188 | ||
| 186 | list_add(&dev->list, &clockevent_devices); | 189 | list_add(&dev->list, &clockevent_devices); |
| 187 | clockevents_do_notify(CLOCK_EVT_NOTIFY_ADD, dev); | 190 | clockevents_do_notify(CLOCK_EVT_NOTIFY_ADD, dev); |
| 188 | clockevents_notify_released(); | 191 | clockevents_notify_released(); |
| 189 | 192 | ||
| 190 | spin_unlock(&clockevents_lock); | 193 | spin_unlock_irqrestore(&clockevents_lock, flags); |
| 191 | } | 194 | } |
| 192 | EXPORT_SYMBOL_GPL(clockevents_register_device); | 195 | EXPORT_SYMBOL_GPL(clockevents_register_device); |
| 193 | 196 | ||
| @@ -235,8 +238,9 @@ void clockevents_exchange_device(struct clock_event_device *old, | |||
| 235 | void clockevents_notify(unsigned long reason, void *arg) | 238 | void clockevents_notify(unsigned long reason, void *arg) |
| 236 | { | 239 | { |
| 237 | struct list_head *node, *tmp; | 240 | struct list_head *node, *tmp; |
| 241 | unsigned long flags; | ||
| 238 | 242 | ||
| 239 | spin_lock(&clockevents_lock); | 243 | spin_lock_irqsave(&clockevents_lock, flags); |
| 240 | clockevents_do_notify(reason, arg); | 244 | clockevents_do_notify(reason, arg); |
| 241 | 245 | ||
| 242 | switch (reason) { | 246 | switch (reason) { |
| @@ -251,7 +255,7 @@ void clockevents_notify(unsigned long reason, void *arg) | |||
| 251 | default: | 255 | default: |
| 252 | break; | 256 | break; |
| 253 | } | 257 | } |
| 254 | spin_unlock(&clockevents_lock); | 258 | spin_unlock_irqrestore(&clockevents_lock, flags); |
| 255 | } | 259 | } |
| 256 | EXPORT_SYMBOL_GPL(clockevents_notify); | 260 | EXPORT_SYMBOL_GPL(clockevents_notify); |
| 257 | #endif | 261 | #endif |
diff --git a/kernel/time/tick-broadcast.c b/kernel/time/tick-broadcast.c index 877dbedc3118..c2ec25087a35 100644 --- a/kernel/time/tick-broadcast.c +++ b/kernel/time/tick-broadcast.c | |||
| @@ -205,11 +205,11 @@ static void tick_handle_periodic_broadcast(struct clock_event_device *dev) | |||
| 205 | * Powerstate information: The system enters/leaves a state, where | 205 | * Powerstate information: The system enters/leaves a state, where |
| 206 | * affected devices might stop | 206 | * affected devices might stop |
| 207 | */ | 207 | */ |
| 208 | static void tick_do_broadcast_on_off(void *why) | 208 | static void tick_do_broadcast_on_off(unsigned long *reason) |
| 209 | { | 209 | { |
| 210 | struct clock_event_device *bc, *dev; | 210 | struct clock_event_device *bc, *dev; |
| 211 | struct tick_device *td; | 211 | struct tick_device *td; |
| 212 | unsigned long flags, *reason = why; | 212 | unsigned long flags; |
| 213 | int cpu, bc_stopped; | 213 | int cpu, bc_stopped; |
| 214 | 214 | ||
| 215 | spin_lock_irqsave(&tick_broadcast_lock, flags); | 215 | spin_lock_irqsave(&tick_broadcast_lock, flags); |
| @@ -276,8 +276,7 @@ void tick_broadcast_on_off(unsigned long reason, int *oncpu) | |||
| 276 | printk(KERN_ERR "tick-broadcast: ignoring broadcast for " | 276 | printk(KERN_ERR "tick-broadcast: ignoring broadcast for " |
| 277 | "offline CPU #%d\n", *oncpu); | 277 | "offline CPU #%d\n", *oncpu); |
| 278 | else | 278 | else |
| 279 | smp_call_function_single(*oncpu, tick_do_broadcast_on_off, | 279 | tick_do_broadcast_on_off(&reason); |
| 280 | &reason, 1); | ||
| 281 | } | 280 | } |
| 282 | 281 | ||
| 283 | /* | 282 | /* |
diff --git a/kernel/time/timer_list.c b/kernel/time/timer_list.c index a999b92a1277..fddd69d16e03 100644 --- a/kernel/time/timer_list.c +++ b/kernel/time/timer_list.c | |||
| @@ -286,7 +286,7 @@ static int __init init_timer_list_procfs(void) | |||
| 286 | { | 286 | { |
| 287 | struct proc_dir_entry *pe; | 287 | struct proc_dir_entry *pe; |
| 288 | 288 | ||
| 289 | pe = proc_create("timer_list", 0644, NULL, &timer_list_fops); | 289 | pe = proc_create("timer_list", 0444, NULL, &timer_list_fops); |
| 290 | if (!pe) | 290 | if (!pe) |
| 291 | return -ENOMEM; | 291 | return -ENOMEM; |
| 292 | return 0; | 292 | return 0; |
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c index 1e1d23c26308..25edd5cc5935 100644 --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c | |||
| @@ -2278,7 +2278,11 @@ ftrace_regex_write(struct file *file, const char __user *ubuf, | |||
| 2278 | read++; | 2278 | read++; |
| 2279 | cnt--; | 2279 | cnt--; |
| 2280 | 2280 | ||
| 2281 | if (!(iter->flags & ~FTRACE_ITER_CONT)) { | 2281 | /* |
| 2282 | * If the parser haven't finished with the last write, | ||
| 2283 | * continue reading the user input without skipping spaces. | ||
| 2284 | */ | ||
| 2285 | if (!(iter->flags & FTRACE_ITER_CONT)) { | ||
| 2282 | /* skip white space */ | 2286 | /* skip white space */ |
| 2283 | while (cnt && isspace(ch)) { | 2287 | while (cnt && isspace(ch)) { |
| 2284 | ret = get_user(ch, ubuf++); | 2288 | ret = get_user(ch, ubuf++); |
| @@ -2288,8 +2292,9 @@ ftrace_regex_write(struct file *file, const char __user *ubuf, | |||
| 2288 | cnt--; | 2292 | cnt--; |
| 2289 | } | 2293 | } |
| 2290 | 2294 | ||
| 2295 | /* only spaces were written */ | ||
| 2291 | if (isspace(ch)) { | 2296 | if (isspace(ch)) { |
| 2292 | file->f_pos += read; | 2297 | *ppos += read; |
| 2293 | ret = read; | 2298 | ret = read; |
| 2294 | goto out; | 2299 | goto out; |
| 2295 | } | 2300 | } |
| @@ -2319,12 +2324,12 @@ ftrace_regex_write(struct file *file, const char __user *ubuf, | |||
| 2319 | if (ret) | 2324 | if (ret) |
| 2320 | goto out; | 2325 | goto out; |
| 2321 | iter->buffer_idx = 0; | 2326 | iter->buffer_idx = 0; |
| 2322 | } else | 2327 | } else { |
| 2323 | iter->flags |= FTRACE_ITER_CONT; | 2328 | iter->flags |= FTRACE_ITER_CONT; |
| 2329 | iter->buffer[iter->buffer_idx++] = ch; | ||
| 2330 | } | ||
| 2324 | 2331 | ||
| 2325 | 2332 | *ppos += read; | |
| 2326 | file->f_pos += read; | ||
| 2327 | |||
| 2328 | ret = read; | 2333 | ret = read; |
| 2329 | out: | 2334 | out: |
| 2330 | mutex_unlock(&ftrace_regex_lock); | 2335 | mutex_unlock(&ftrace_regex_lock); |
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index c22b40f8f576..8c358395d338 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c | |||
| @@ -3896,17 +3896,9 @@ trace_options_core_write(struct file *filp, const char __user *ubuf, size_t cnt, | |||
| 3896 | if (ret < 0) | 3896 | if (ret < 0) |
| 3897 | return ret; | 3897 | return ret; |
| 3898 | 3898 | ||
| 3899 | switch (val) { | 3899 | if (val != 0 && val != 1) |
| 3900 | case 0: | ||
| 3901 | trace_flags &= ~(1 << index); | ||
| 3902 | break; | ||
| 3903 | case 1: | ||
| 3904 | trace_flags |= 1 << index; | ||
| 3905 | break; | ||
| 3906 | |||
| 3907 | default: | ||
| 3908 | return -EINVAL; | 3900 | return -EINVAL; |
| 3909 | } | 3901 | set_tracer_flags(1 << index, val); |
| 3910 | 3902 | ||
| 3911 | *ppos += cnt; | 3903 | *ppos += cnt; |
| 3912 | 3904 | ||
diff --git a/lib/dma-debug.c b/lib/dma-debug.c index 65b0d99b6d0a..58a9f9fc609a 100644 --- a/lib/dma-debug.c +++ b/lib/dma-debug.c | |||
| @@ -156,9 +156,13 @@ static bool driver_filter(struct device *dev) | |||
| 156 | return true; | 156 | return true; |
| 157 | 157 | ||
| 158 | /* driver filter on and initialized */ | 158 | /* driver filter on and initialized */ |
| 159 | if (current_driver && dev->driver == current_driver) | 159 | if (current_driver && dev && dev->driver == current_driver) |
| 160 | return true; | 160 | return true; |
| 161 | 161 | ||
| 162 | /* driver filter on, but we can't filter on a NULL device... */ | ||
| 163 | if (!dev) | ||
| 164 | return false; | ||
| 165 | |||
| 162 | if (current_driver || !current_driver_name[0]) | 166 | if (current_driver || !current_driver_name[0]) |
| 163 | return false; | 167 | return false; |
| 164 | 168 | ||
| @@ -183,17 +187,17 @@ static bool driver_filter(struct device *dev) | |||
| 183 | return ret; | 187 | return ret; |
| 184 | } | 188 | } |
| 185 | 189 | ||
| 186 | #define err_printk(dev, entry, format, arg...) do { \ | 190 | #define err_printk(dev, entry, format, arg...) do { \ |
| 187 | error_count += 1; \ | 191 | error_count += 1; \ |
| 188 | if (driver_filter(dev) && \ | 192 | if (driver_filter(dev) && \ |
| 189 | (show_all_errors || show_num_errors > 0)) { \ | 193 | (show_all_errors || show_num_errors > 0)) { \ |
| 190 | WARN(1, "%s %s: " format, \ | 194 | WARN(1, "%s %s: " format, \ |
| 191 | dev_driver_string(dev), \ | 195 | dev ? dev_driver_string(dev) : "NULL", \ |
| 192 | dev_name(dev) , ## arg); \ | 196 | dev ? dev_name(dev) : "NULL", ## arg); \ |
| 193 | dump_entry_trace(entry); \ | 197 | dump_entry_trace(entry); \ |
| 194 | } \ | 198 | } \ |
| 195 | if (!show_all_errors && show_num_errors > 0) \ | 199 | if (!show_all_errors && show_num_errors > 0) \ |
| 196 | show_num_errors -= 1; \ | 200 | show_num_errors -= 1; \ |
| 197 | } while (0); | 201 | } while (0); |
| 198 | 202 | ||
| 199 | /* | 203 | /* |
diff --git a/lib/flex_array.c b/lib/flex_array.c index 08f1636d296a..7baed2fc3bc8 100644 --- a/lib/flex_array.c +++ b/lib/flex_array.c | |||
| @@ -99,7 +99,8 @@ static inline int elements_fit_in_base(struct flex_array *fa) | |||
| 99 | * capacity in the base structure. Also note that no effort is made | 99 | * capacity in the base structure. Also note that no effort is made |
| 100 | * to efficiently pack objects across page boundaries. | 100 | * to efficiently pack objects across page boundaries. |
| 101 | */ | 101 | */ |
| 102 | struct flex_array *flex_array_alloc(int element_size, int total, gfp_t flags) | 102 | struct flex_array *flex_array_alloc(int element_size, unsigned int total, |
| 103 | gfp_t flags) | ||
| 103 | { | 104 | { |
| 104 | struct flex_array *ret; | 105 | struct flex_array *ret; |
| 105 | int max_size = nr_base_part_ptrs() * __elements_per_part(element_size); | 106 | int max_size = nr_base_part_ptrs() * __elements_per_part(element_size); |
| @@ -115,16 +116,14 @@ struct flex_array *flex_array_alloc(int element_size, int total, gfp_t flags) | |||
| 115 | return ret; | 116 | return ret; |
| 116 | } | 117 | } |
| 117 | 118 | ||
| 118 | static int fa_element_to_part_nr(struct flex_array *fa, int element_nr) | 119 | static int fa_element_to_part_nr(struct flex_array *fa, |
| 120 | unsigned int element_nr) | ||
| 119 | { | 121 | { |
| 120 | return element_nr / __elements_per_part(fa->element_size); | 122 | return element_nr / __elements_per_part(fa->element_size); |
| 121 | } | 123 | } |
| 122 | 124 | ||
| 123 | /** | 125 | /** |
| 124 | * flex_array_free_parts - just free the second-level pages | 126 | * flex_array_free_parts - just free the second-level pages |
| 125 | * @src: address of data to copy into the array | ||
| 126 | * @element_nr: index of the position in which to insert | ||
| 127 | * the new element. | ||
| 128 | * | 127 | * |
| 129 | * This is to be used in cases where the base 'struct flex_array' | 128 | * This is to be used in cases where the base 'struct flex_array' |
| 130 | * has been statically allocated and should not be free. | 129 | * has been statically allocated and should not be free. |
| @@ -146,14 +145,12 @@ void flex_array_free(struct flex_array *fa) | |||
| 146 | kfree(fa); | 145 | kfree(fa); |
| 147 | } | 146 | } |
| 148 | 147 | ||
| 149 | static int fa_index_inside_part(struct flex_array *fa, int element_nr) | 148 | static unsigned int index_inside_part(struct flex_array *fa, |
| 149 | unsigned int element_nr) | ||
| 150 | { | 150 | { |
| 151 | return element_nr % __elements_per_part(fa->element_size); | 151 | unsigned int part_offset; |
| 152 | } | ||
| 153 | 152 | ||
| 154 | static int index_inside_part(struct flex_array *fa, int element_nr) | 153 | part_offset = element_nr % __elements_per_part(fa->element_size); |
| 155 | { | ||
| 156 | int part_offset = fa_index_inside_part(fa, element_nr); | ||
| 157 | return part_offset * fa->element_size; | 154 | return part_offset * fa->element_size; |
| 158 | } | 155 | } |
| 159 | 156 | ||
| @@ -188,7 +185,8 @@ __fa_get_part(struct flex_array *fa, int part_nr, gfp_t flags) | |||
| 188 | * | 185 | * |
| 189 | * Locking must be provided by the caller. | 186 | * Locking must be provided by the caller. |
| 190 | */ | 187 | */ |
| 191 | int flex_array_put(struct flex_array *fa, int element_nr, void *src, gfp_t flags) | 188 | int flex_array_put(struct flex_array *fa, unsigned int element_nr, void *src, |
| 189 | gfp_t flags) | ||
| 192 | { | 190 | { |
| 193 | int part_nr = fa_element_to_part_nr(fa, element_nr); | 191 | int part_nr = fa_element_to_part_nr(fa, element_nr); |
| 194 | struct flex_array_part *part; | 192 | struct flex_array_part *part; |
| @@ -198,10 +196,11 @@ int flex_array_put(struct flex_array *fa, int element_nr, void *src, gfp_t flags | |||
| 198 | return -ENOSPC; | 196 | return -ENOSPC; |
| 199 | if (elements_fit_in_base(fa)) | 197 | if (elements_fit_in_base(fa)) |
| 200 | part = (struct flex_array_part *)&fa->parts[0]; | 198 | part = (struct flex_array_part *)&fa->parts[0]; |
| 201 | else | 199 | else { |
| 202 | part = __fa_get_part(fa, part_nr, flags); | 200 | part = __fa_get_part(fa, part_nr, flags); |
| 203 | if (!part) | 201 | if (!part) |
| 204 | return -ENOMEM; | 202 | return -ENOMEM; |
| 203 | } | ||
| 205 | dst = &part->elements[index_inside_part(fa, element_nr)]; | 204 | dst = &part->elements[index_inside_part(fa, element_nr)]; |
| 206 | memcpy(dst, src, fa->element_size); | 205 | memcpy(dst, src, fa->element_size); |
| 207 | return 0; | 206 | return 0; |
| @@ -219,7 +218,8 @@ int flex_array_put(struct flex_array *fa, int element_nr, void *src, gfp_t flags | |||
| 219 | * | 218 | * |
| 220 | * Locking must be provided by the caller. | 219 | * Locking must be provided by the caller. |
| 221 | */ | 220 | */ |
| 222 | int flex_array_prealloc(struct flex_array *fa, int start, int end, gfp_t flags) | 221 | int flex_array_prealloc(struct flex_array *fa, unsigned int start, |
| 222 | unsigned int end, gfp_t flags) | ||
| 223 | { | 223 | { |
| 224 | int start_part; | 224 | int start_part; |
| 225 | int end_part; | 225 | int end_part; |
| @@ -250,18 +250,19 @@ int flex_array_prealloc(struct flex_array *fa, int start, int end, gfp_t flags) | |||
| 250 | * | 250 | * |
| 251 | * Locking must be provided by the caller. | 251 | * Locking must be provided by the caller. |
| 252 | */ | 252 | */ |
| 253 | void *flex_array_get(struct flex_array *fa, int element_nr) | 253 | void *flex_array_get(struct flex_array *fa, unsigned int element_nr) |
| 254 | { | 254 | { |
| 255 | int part_nr = fa_element_to_part_nr(fa, element_nr); | 255 | int part_nr = fa_element_to_part_nr(fa, element_nr); |
| 256 | struct flex_array_part *part; | 256 | struct flex_array_part *part; |
| 257 | 257 | ||
| 258 | if (element_nr >= fa->total_nr_elements) | 258 | if (element_nr >= fa->total_nr_elements) |
| 259 | return NULL; | 259 | return NULL; |
| 260 | if (!fa->parts[part_nr]) | ||
| 261 | return NULL; | ||
| 262 | if (elements_fit_in_base(fa)) | 260 | if (elements_fit_in_base(fa)) |
| 263 | part = (struct flex_array_part *)&fa->parts[0]; | 261 | part = (struct flex_array_part *)&fa->parts[0]; |
| 264 | else | 262 | else { |
| 265 | part = fa->parts[part_nr]; | 263 | part = fa->parts[part_nr]; |
| 264 | if (!part) | ||
| 265 | return NULL; | ||
| 266 | } | ||
| 266 | return &part->elements[index_inside_part(fa, element_nr)]; | 267 | return &part->elements[index_inside_part(fa, element_nr)]; |
| 267 | } | 268 | } |
| @@ -429,7 +429,7 @@ u64 __init lmb_phys_mem_size(void) | |||
| 429 | return lmb.memory.size; | 429 | return lmb.memory.size; |
| 430 | } | 430 | } |
| 431 | 431 | ||
| 432 | u64 __init lmb_end_of_DRAM(void) | 432 | u64 lmb_end_of_DRAM(void) |
| 433 | { | 433 | { |
| 434 | int idx = lmb.memory.cnt - 1; | 434 | int idx = lmb.memory.cnt - 1; |
| 435 | 435 | ||
diff --git a/mm/nommu.c b/mm/nommu.c index 4bde489ec431..66e81e7e9fe9 100644 --- a/mm/nommu.c +++ b/mm/nommu.c | |||
| @@ -1352,6 +1352,7 @@ unsigned long do_mmap_pgoff(struct file *file, | |||
| 1352 | } | 1352 | } |
| 1353 | 1353 | ||
| 1354 | vma->vm_region = region; | 1354 | vma->vm_region = region; |
| 1355 | add_nommu_region(region); | ||
| 1355 | 1356 | ||
| 1356 | /* set up the mapping */ | 1357 | /* set up the mapping */ |
| 1357 | if (file && vma->vm_flags & VM_SHARED) | 1358 | if (file && vma->vm_flags & VM_SHARED) |
| @@ -1361,8 +1362,6 @@ unsigned long do_mmap_pgoff(struct file *file, | |||
| 1361 | if (ret < 0) | 1362 | if (ret < 0) |
| 1362 | goto error_put_region; | 1363 | goto error_put_region; |
| 1363 | 1364 | ||
| 1364 | add_nommu_region(region); | ||
| 1365 | |||
| 1366 | /* okay... we have a mapping; now we have to register it */ | 1365 | /* okay... we have a mapping; now we have to register it */ |
| 1367 | result = vma->vm_start; | 1366 | result = vma->vm_start; |
| 1368 | 1367 | ||
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 5cc986eb9f6f..a0de15f46987 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
| @@ -817,13 +817,15 @@ __rmqueue_fallback(struct zone *zone, int order, int start_migratetype) | |||
| 817 | * agressive about taking ownership of free pages | 817 | * agressive about taking ownership of free pages |
| 818 | */ | 818 | */ |
| 819 | if (unlikely(current_order >= (pageblock_order >> 1)) || | 819 | if (unlikely(current_order >= (pageblock_order >> 1)) || |
| 820 | start_migratetype == MIGRATE_RECLAIMABLE) { | 820 | start_migratetype == MIGRATE_RECLAIMABLE || |
| 821 | page_group_by_mobility_disabled) { | ||
| 821 | unsigned long pages; | 822 | unsigned long pages; |
| 822 | pages = move_freepages_block(zone, page, | 823 | pages = move_freepages_block(zone, page, |
| 823 | start_migratetype); | 824 | start_migratetype); |
| 824 | 825 | ||
| 825 | /* Claim the whole block if over half of it is free */ | 826 | /* Claim the whole block if over half of it is free */ |
| 826 | if (pages >= (1 << (pageblock_order-1))) | 827 | if (pages >= (1 << (pageblock_order-1)) || |
| 828 | page_group_by_mobility_disabled) | ||
| 827 | set_pageblock_migratetype(page, | 829 | set_pageblock_migratetype(page, |
| 828 | start_migratetype); | 830 | start_migratetype); |
| 829 | 831 | ||
diff --git a/mm/percpu.c b/mm/percpu.c index 5fe37842e0ea..3311c8919f37 100644 --- a/mm/percpu.c +++ b/mm/percpu.c | |||
| @@ -197,7 +197,12 @@ static unsigned long pcpu_chunk_addr(struct pcpu_chunk *chunk, | |||
| 197 | static bool pcpu_chunk_page_occupied(struct pcpu_chunk *chunk, | 197 | static bool pcpu_chunk_page_occupied(struct pcpu_chunk *chunk, |
| 198 | int page_idx) | 198 | int page_idx) |
| 199 | { | 199 | { |
| 200 | return *pcpu_chunk_pagep(chunk, 0, page_idx) != NULL; | 200 | /* |
| 201 | * Any possible cpu id can be used here, so there's no need to | ||
| 202 | * worry about preemption or cpu hotplug. | ||
| 203 | */ | ||
| 204 | return *pcpu_chunk_pagep(chunk, raw_smp_processor_id(), | ||
| 205 | page_idx) != NULL; | ||
| 201 | } | 206 | } |
| 202 | 207 | ||
| 203 | /* set the pointer to a chunk in a page struct */ | 208 | /* set the pointer to a chunk in a page struct */ |
| @@ -297,6 +302,14 @@ static struct pcpu_chunk *pcpu_chunk_addr_search(void *addr) | |||
| 297 | return pcpu_first_chunk; | 302 | return pcpu_first_chunk; |
| 298 | } | 303 | } |
| 299 | 304 | ||
| 305 | /* | ||
| 306 | * The address is relative to unit0 which might be unused and | ||
| 307 | * thus unmapped. Offset the address to the unit space of the | ||
| 308 | * current processor before looking it up in the vmalloc | ||
| 309 | * space. Note that any possible cpu id can be used here, so | ||
| 310 | * there's no need to worry about preemption or cpu hotplug. | ||
| 311 | */ | ||
| 312 | addr += raw_smp_processor_id() * pcpu_unit_size; | ||
| 300 | return pcpu_get_page_chunk(vmalloc_to_page(addr)); | 313 | return pcpu_get_page_chunk(vmalloc_to_page(addr)); |
| 301 | } | 314 | } |
| 302 | 315 | ||
| @@ -358,6 +358,7 @@ static int page_referenced_one(struct page *page, | |||
| 358 | */ | 358 | */ |
| 359 | if (vma->vm_flags & VM_LOCKED) { | 359 | if (vma->vm_flags & VM_LOCKED) { |
| 360 | *mapcount = 1; /* break early from loop */ | 360 | *mapcount = 1; /* break early from loop */ |
| 361 | *vm_flags |= VM_LOCKED; | ||
| 361 | goto out_unmap; | 362 | goto out_unmap; |
| 362 | } | 363 | } |
| 363 | 364 | ||
| @@ -2594,8 +2594,6 @@ static inline int kmem_cache_close(struct kmem_cache *s) | |||
| 2594 | */ | 2594 | */ |
| 2595 | void kmem_cache_destroy(struct kmem_cache *s) | 2595 | void kmem_cache_destroy(struct kmem_cache *s) |
| 2596 | { | 2596 | { |
| 2597 | if (s->flags & SLAB_DESTROY_BY_RCU) | ||
| 2598 | rcu_barrier(); | ||
| 2599 | down_write(&slub_lock); | 2597 | down_write(&slub_lock); |
| 2600 | s->refcount--; | 2598 | s->refcount--; |
| 2601 | if (!s->refcount) { | 2599 | if (!s->refcount) { |
| @@ -2606,6 +2604,8 @@ void kmem_cache_destroy(struct kmem_cache *s) | |||
| 2606 | "still has objects.\n", s->name, __func__); | 2604 | "still has objects.\n", s->name, __func__); |
| 2607 | dump_stack(); | 2605 | dump_stack(); |
| 2608 | } | 2606 | } |
| 2607 | if (s->flags & SLAB_DESTROY_BY_RCU) | ||
| 2608 | rcu_barrier(); | ||
| 2609 | sysfs_slab_remove(s); | 2609 | sysfs_slab_remove(s); |
| 2610 | } else | 2610 | } else |
| 2611 | up_write(&slub_lock); | 2611 | up_write(&slub_lock); |
diff --git a/mm/vmscan.c b/mm/vmscan.c index dea7abd31098..94e86dd6954c 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c | |||
| @@ -630,9 +630,14 @@ static unsigned long shrink_page_list(struct list_head *page_list, | |||
| 630 | 630 | ||
| 631 | referenced = page_referenced(page, 1, | 631 | referenced = page_referenced(page, 1, |
| 632 | sc->mem_cgroup, &vm_flags); | 632 | sc->mem_cgroup, &vm_flags); |
| 633 | /* In active use or really unfreeable? Activate it. */ | 633 | /* |
| 634 | * In active use or really unfreeable? Activate it. | ||
| 635 | * If page which have PG_mlocked lost isoltation race, | ||
| 636 | * try_to_unmap moves it to unevictable list | ||
| 637 | */ | ||
| 634 | if (sc->order <= PAGE_ALLOC_COSTLY_ORDER && | 638 | if (sc->order <= PAGE_ALLOC_COSTLY_ORDER && |
| 635 | referenced && page_mapping_inuse(page)) | 639 | referenced && page_mapping_inuse(page) |
| 640 | && !(vm_flags & VM_LOCKED)) | ||
| 636 | goto activate_locked; | 641 | goto activate_locked; |
| 637 | 642 | ||
| 638 | /* | 643 | /* |
diff --git a/net/9p/client.c b/net/9p/client.c index 787ccddb85ea..5bf5f227dbe0 100644 --- a/net/9p/client.c +++ b/net/9p/client.c | |||
| @@ -60,9 +60,9 @@ static struct p9_req_t * | |||
| 60 | p9_client_rpc(struct p9_client *c, int8_t type, const char *fmt, ...); | 60 | p9_client_rpc(struct p9_client *c, int8_t type, const char *fmt, ...); |
| 61 | 61 | ||
| 62 | /** | 62 | /** |
| 63 | * v9fs_parse_options - parse mount options into session structure | 63 | * parse_options - parse mount options into client structure |
| 64 | * @options: options string passed from mount | 64 | * @opts: options string passed from mount |
| 65 | * @v9ses: existing v9fs session information | 65 | * @clnt: existing v9fs client information |
| 66 | * | 66 | * |
| 67 | * Return 0 upon success, -ERRNO upon failure | 67 | * Return 0 upon success, -ERRNO upon failure |
| 68 | */ | 68 | */ |
| @@ -232,7 +232,7 @@ EXPORT_SYMBOL(p9_tag_lookup); | |||
| 232 | 232 | ||
| 233 | /** | 233 | /** |
| 234 | * p9_tag_init - setup tags structure and contents | 234 | * p9_tag_init - setup tags structure and contents |
| 235 | * @tags: tags structure from the client struct | 235 | * @c: v9fs client struct |
| 236 | * | 236 | * |
| 237 | * This initializes the tags structure for each client instance. | 237 | * This initializes the tags structure for each client instance. |
| 238 | * | 238 | * |
| @@ -258,7 +258,7 @@ error: | |||
| 258 | 258 | ||
| 259 | /** | 259 | /** |
| 260 | * p9_tag_cleanup - cleans up tags structure and reclaims resources | 260 | * p9_tag_cleanup - cleans up tags structure and reclaims resources |
| 261 | * @tags: tags structure from the client struct | 261 | * @c: v9fs client struct |
| 262 | * | 262 | * |
| 263 | * This frees resources associated with the tags structure | 263 | * This frees resources associated with the tags structure |
| 264 | * | 264 | * |
| @@ -411,14 +411,9 @@ static int p9_check_errors(struct p9_client *c, struct p9_req_t *req) | |||
| 411 | if (c->dotu) | 411 | if (c->dotu) |
| 412 | err = -ecode; | 412 | err = -ecode; |
| 413 | 413 | ||
| 414 | if (!err) { | 414 | if (!err || !IS_ERR_VALUE(err)) |
| 415 | err = p9_errstr2errno(ename, strlen(ename)); | 415 | err = p9_errstr2errno(ename, strlen(ename)); |
| 416 | 416 | ||
| 417 | /* string match failed */ | ||
| 418 | if (!err) | ||
| 419 | err = -ESERVERFAULT; | ||
| 420 | } | ||
| 421 | |||
| 422 | P9_DPRINTK(P9_DEBUG_9P, "<<< RERROR (%d) %s\n", -ecode, ename); | 417 | P9_DPRINTK(P9_DEBUG_9P, "<<< RERROR (%d) %s\n", -ecode, ename); |
| 423 | 418 | ||
| 424 | kfree(ename); | 419 | kfree(ename); |
| @@ -430,8 +425,8 @@ static int p9_check_errors(struct p9_client *c, struct p9_req_t *req) | |||
| 430 | 425 | ||
| 431 | /** | 426 | /** |
| 432 | * p9_client_flush - flush (cancel) a request | 427 | * p9_client_flush - flush (cancel) a request |
| 433 | * c: client state | 428 | * @c: client state |
| 434 | * req: request to cancel | 429 | * @oldreq: request to cancel |
| 435 | * | 430 | * |
| 436 | * This sents a flush for a particular requests and links | 431 | * This sents a flush for a particular requests and links |
| 437 | * the flush request to the original request. The current | 432 | * the flush request to the original request. The current |
diff --git a/net/9p/error.c b/net/9p/error.c index fdebe4314062..52518512a93e 100644 --- a/net/9p/error.c +++ b/net/9p/error.c | |||
| @@ -239,7 +239,7 @@ int p9_errstr2errno(char *errstr, int len) | |||
| 239 | errstr[len] = 0; | 239 | errstr[len] = 0; |
| 240 | printk(KERN_ERR "%s: server reported unknown error %s\n", | 240 | printk(KERN_ERR "%s: server reported unknown error %s\n", |
| 241 | __func__, errstr); | 241 | __func__, errstr); |
| 242 | errno = 1; | 242 | errno = ESERVERFAULT; |
| 243 | } | 243 | } |
| 244 | 244 | ||
| 245 | return -errno; | 245 | return -errno; |
diff --git a/net/9p/trans_fd.c b/net/9p/trans_fd.c index 8c2588e4edc0..8d934dd7fd54 100644 --- a/net/9p/trans_fd.c +++ b/net/9p/trans_fd.c | |||
| @@ -119,8 +119,8 @@ struct p9_poll_wait { | |||
| 119 | * @wpos: write position for current frame | 119 | * @wpos: write position for current frame |
| 120 | * @wsize: amount of data to write for current frame | 120 | * @wsize: amount of data to write for current frame |
| 121 | * @wbuf: current write buffer | 121 | * @wbuf: current write buffer |
| 122 | * @poll_pending_link: pending links to be polled per conn | ||
| 122 | * @poll_wait: array of wait_q's for various worker threads | 123 | * @poll_wait: array of wait_q's for various worker threads |
| 123 | * @poll_waddr: ???? | ||
| 124 | * @pt: poll state | 124 | * @pt: poll state |
| 125 | * @rq: current read work | 125 | * @rq: current read work |
| 126 | * @wq: current write work | 126 | * @wq: current write work |
| @@ -700,9 +700,9 @@ static int p9_fd_cancel(struct p9_client *client, struct p9_req_t *req) | |||
| 700 | } | 700 | } |
| 701 | 701 | ||
| 702 | /** | 702 | /** |
| 703 | * parse_options - parse mount options into session structure | 703 | * parse_opts - parse mount options into p9_fd_opts structure |
| 704 | * @options: options string passed from mount | 704 | * @params: options string passed from mount |
| 705 | * @opts: transport-specific structure to parse options into | 705 | * @opts: fd transport-specific structure to parse options into |
| 706 | * | 706 | * |
| 707 | * Returns 0 upon success, -ERRNO upon failure | 707 | * Returns 0 upon success, -ERRNO upon failure |
| 708 | */ | 708 | */ |
diff --git a/net/9p/trans_rdma.c b/net/9p/trans_rdma.c index ac4990041ebb..65cb29db03f8 100644 --- a/net/9p/trans_rdma.c +++ b/net/9p/trans_rdma.c | |||
| @@ -67,14 +67,15 @@ | |||
| 67 | * @pd: Protection Domain pointer | 67 | * @pd: Protection Domain pointer |
| 68 | * @qp: Queue Pair pointer | 68 | * @qp: Queue Pair pointer |
| 69 | * @cq: Completion Queue pointer | 69 | * @cq: Completion Queue pointer |
| 70 | * @dm_mr: DMA Memory Region pointer | ||
| 70 | * @lkey: The local access only memory region key | 71 | * @lkey: The local access only memory region key |
| 71 | * @timeout: Number of uSecs to wait for connection management events | 72 | * @timeout: Number of uSecs to wait for connection management events |
| 72 | * @sq_depth: The depth of the Send Queue | 73 | * @sq_depth: The depth of the Send Queue |
| 73 | * @sq_sem: Semaphore for the SQ | 74 | * @sq_sem: Semaphore for the SQ |
| 74 | * @rq_depth: The depth of the Receive Queue. | 75 | * @rq_depth: The depth of the Receive Queue. |
| 76 | * @rq_count: Count of requests in the Receive Queue. | ||
| 75 | * @addr: The remote peer's address | 77 | * @addr: The remote peer's address |
| 76 | * @req_lock: Protects the active request list | 78 | * @req_lock: Protects the active request list |
| 77 | * @send_wait: Wait list when the SQ fills up | ||
| 78 | * @cm_done: Completion event for connection management tracking | 79 | * @cm_done: Completion event for connection management tracking |
| 79 | */ | 80 | */ |
| 80 | struct p9_trans_rdma { | 81 | struct p9_trans_rdma { |
| @@ -154,9 +155,9 @@ static match_table_t tokens = { | |||
| 154 | }; | 155 | }; |
| 155 | 156 | ||
| 156 | /** | 157 | /** |
| 157 | * parse_options - parse mount options into session structure | 158 | * parse_opts - parse mount options into rdma options structure |
| 158 | * @options: options string passed from mount | 159 | * @params: options string passed from mount |
| 159 | * @opts: transport-specific structure to parse options into | 160 | * @opts: rdma transport-specific structure to parse options into |
| 160 | * | 161 | * |
| 161 | * Returns 0 upon success, -ERRNO upon failure | 162 | * Returns 0 upon success, -ERRNO upon failure |
| 162 | */ | 163 | */ |
diff --git a/net/9p/trans_virtio.c b/net/9p/trans_virtio.c index a49484e67e1d..9bf0b737aa51 100644 --- a/net/9p/trans_virtio.c +++ b/net/9p/trans_virtio.c | |||
| @@ -57,11 +57,9 @@ static int chan_index; | |||
| 57 | * @initialized: whether the channel is initialized | 57 | * @initialized: whether the channel is initialized |
| 58 | * @inuse: whether the channel is in use | 58 | * @inuse: whether the channel is in use |
| 59 | * @lock: protects multiple elements within this structure | 59 | * @lock: protects multiple elements within this structure |
| 60 | * @client: client instance | ||
| 60 | * @vdev: virtio dev associated with this channel | 61 | * @vdev: virtio dev associated with this channel |
| 61 | * @vq: virtio queue associated with this channel | 62 | * @vq: virtio queue associated with this channel |
| 62 | * @tagpool: accounting for tag ids (and request slots) | ||
| 63 | * @reqs: array of request slots | ||
| 64 | * @max_tag: current number of request_slots allocated | ||
| 65 | * @sg: scatter gather list which is used to pack a request (protected?) | 63 | * @sg: scatter gather list which is used to pack a request (protected?) |
| 66 | * | 64 | * |
| 67 | * We keep all per-channel information in a structure. | 65 | * We keep all per-channel information in a structure. |
| @@ -92,7 +90,7 @@ static unsigned int rest_of_page(void *data) | |||
| 92 | 90 | ||
| 93 | /** | 91 | /** |
| 94 | * p9_virtio_close - reclaim resources of a channel | 92 | * p9_virtio_close - reclaim resources of a channel |
| 95 | * @trans: transport state | 93 | * @client: client instance |
| 96 | * | 94 | * |
| 97 | * This reclaims a channel by freeing its resources and | 95 | * This reclaims a channel by freeing its resources and |
| 98 | * reseting its inuse flag. | 96 | * reseting its inuse flag. |
| @@ -181,9 +179,8 @@ static int p9_virtio_cancel(struct p9_client *client, struct p9_req_t *req) | |||
| 181 | 179 | ||
| 182 | /** | 180 | /** |
| 183 | * p9_virtio_request - issue a request | 181 | * p9_virtio_request - issue a request |
| 184 | * @t: transport state | 182 | * @client: client instance issuing the request |
| 185 | * @tc: &p9_fcall request to transmit | 183 | * @req: request to be issued |
| 186 | * @rc: &p9_fcall to put reponse into | ||
| 187 | * | 184 | * |
| 188 | */ | 185 | */ |
| 189 | 186 | ||
diff --git a/net/core/netpoll.c b/net/core/netpoll.c index df30feb2fc72..1b76eb11deb4 100644 --- a/net/core/netpoll.c +++ b/net/core/netpoll.c | |||
| @@ -319,6 +319,11 @@ static void netpoll_send_skb(struct netpoll *np, struct sk_buff *skb) | |||
| 319 | 319 | ||
| 320 | udelay(USEC_PER_POLL); | 320 | udelay(USEC_PER_POLL); |
| 321 | } | 321 | } |
| 322 | |||
| 323 | WARN_ONCE(!irqs_disabled(), | ||
| 324 | "netpoll_send_skb(): %s enabled interrupts in poll (%pF)\n", | ||
| 325 | dev->name, ops->ndo_start_xmit); | ||
| 326 | |||
| 322 | local_irq_restore(flags); | 327 | local_irq_restore(flags); |
| 323 | } | 328 | } |
| 324 | 329 | ||
diff --git a/net/core/sock.c b/net/core/sock.c index bbb25be7ddfe..76334228ed1c 100644 --- a/net/core/sock.c +++ b/net/core/sock.c | |||
| @@ -1025,6 +1025,7 @@ struct sock *sk_alloc(struct net *net, int family, gfp_t priority, | |||
| 1025 | sk->sk_prot = sk->sk_prot_creator = prot; | 1025 | sk->sk_prot = sk->sk_prot_creator = prot; |
| 1026 | sock_lock_init(sk); | 1026 | sock_lock_init(sk); |
| 1027 | sock_net_set(sk, get_net(net)); | 1027 | sock_net_set(sk, get_net(net)); |
| 1028 | atomic_set(&sk->sk_wmem_alloc, 1); | ||
| 1028 | } | 1029 | } |
| 1029 | 1030 | ||
| 1030 | return sk; | 1031 | return sk; |
| @@ -1872,7 +1873,6 @@ void sock_init_data(struct socket *sock, struct sock *sk) | |||
| 1872 | */ | 1873 | */ |
| 1873 | smp_wmb(); | 1874 | smp_wmb(); |
| 1874 | atomic_set(&sk->sk_refcnt, 1); | 1875 | atomic_set(&sk->sk_refcnt, 1); |
| 1875 | atomic_set(&sk->sk_wmem_alloc, 1); | ||
| 1876 | atomic_set(&sk->sk_drops, 0); | 1876 | atomic_set(&sk->sk_drops, 0); |
| 1877 | } | 1877 | } |
| 1878 | EXPORT_SYMBOL(sock_init_data); | 1878 | EXPORT_SYMBOL(sock_init_data); |
diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c index 7d0821054729..7ffcd96fe591 100644 --- a/net/ipv4/ip_output.c +++ b/net/ipv4/ip_output.c | |||
| @@ -813,6 +813,8 @@ int ip_append_data(struct sock *sk, | |||
| 813 | inet->cork.addr = ipc->addr; | 813 | inet->cork.addr = ipc->addr; |
| 814 | } | 814 | } |
| 815 | rt = *rtp; | 815 | rt = *rtp; |
| 816 | if (unlikely(!rt)) | ||
| 817 | return -EFAULT; | ||
| 816 | /* | 818 | /* |
| 817 | * We steal reference to this route, caller should not release it | 819 | * We steal reference to this route, caller should not release it |
| 818 | */ | 820 | */ |
diff --git a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c index caa0278d30a9..45f9a2a42d56 100644 --- a/net/ipv6/af_inet6.c +++ b/net/ipv6/af_inet6.c | |||
| @@ -306,8 +306,10 @@ int inet6_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) | |||
| 306 | v4addr != htonl(INADDR_ANY) && | 306 | v4addr != htonl(INADDR_ANY) && |
| 307 | chk_addr_ret != RTN_LOCAL && | 307 | chk_addr_ret != RTN_LOCAL && |
| 308 | chk_addr_ret != RTN_MULTICAST && | 308 | chk_addr_ret != RTN_MULTICAST && |
| 309 | chk_addr_ret != RTN_BROADCAST) | 309 | chk_addr_ret != RTN_BROADCAST) { |
| 310 | err = -EADDRNOTAVAIL; | ||
| 310 | goto out; | 311 | goto out; |
| 312 | } | ||
| 311 | } else { | 313 | } else { |
| 312 | if (addr_type != IPV6_ADDR_ANY) { | 314 | if (addr_type != IPV6_ADDR_ANY) { |
| 313 | struct net_device *dev = NULL; | 315 | struct net_device *dev = NULL; |
diff --git a/net/llc/af_llc.c b/net/llc/af_llc.c index 9208cf5f2bd5..c45eee1c0e8d 100644 --- a/net/llc/af_llc.c +++ b/net/llc/af_llc.c | |||
| @@ -914,6 +914,7 @@ static int llc_ui_getname(struct socket *sock, struct sockaddr *uaddr, | |||
| 914 | struct llc_sock *llc = llc_sk(sk); | 914 | struct llc_sock *llc = llc_sk(sk); |
| 915 | int rc = 0; | 915 | int rc = 0; |
| 916 | 916 | ||
| 917 | memset(&sllc, 0, sizeof(sllc)); | ||
| 917 | lock_sock(sk); | 918 | lock_sock(sk); |
| 918 | if (sock_flag(sk, SOCK_ZAPPED)) | 919 | if (sock_flag(sk, SOCK_ZAPPED)) |
| 919 | goto out; | 920 | goto out; |
diff --git a/net/mac80211/key.c b/net/mac80211/key.c index ce267565e180..659a42d529e3 100644 --- a/net/mac80211/key.c +++ b/net/mac80211/key.c | |||
| @@ -67,6 +67,8 @@ static DECLARE_WORK(todo_work, key_todo); | |||
| 67 | * | 67 | * |
| 68 | * @key: key to add to do item for | 68 | * @key: key to add to do item for |
| 69 | * @flag: todo flag(s) | 69 | * @flag: todo flag(s) |
| 70 | * | ||
| 71 | * Must be called with IRQs or softirqs disabled. | ||
| 70 | */ | 72 | */ |
| 71 | static void add_todo(struct ieee80211_key *key, u32 flag) | 73 | static void add_todo(struct ieee80211_key *key, u32 flag) |
| 72 | { | 74 | { |
| @@ -140,9 +142,9 @@ static void ieee80211_key_enable_hw_accel(struct ieee80211_key *key) | |||
| 140 | ret = drv_set_key(key->local, SET_KEY, &sdata->vif, sta, &key->conf); | 142 | ret = drv_set_key(key->local, SET_KEY, &sdata->vif, sta, &key->conf); |
| 141 | 143 | ||
| 142 | if (!ret) { | 144 | if (!ret) { |
| 143 | spin_lock(&todo_lock); | 145 | spin_lock_bh(&todo_lock); |
| 144 | key->flags |= KEY_FLAG_UPLOADED_TO_HARDWARE; | 146 | key->flags |= KEY_FLAG_UPLOADED_TO_HARDWARE; |
| 145 | spin_unlock(&todo_lock); | 147 | spin_unlock_bh(&todo_lock); |
| 146 | } | 148 | } |
| 147 | 149 | ||
| 148 | if (ret && ret != -ENOSPC && ret != -EOPNOTSUPP) | 150 | if (ret && ret != -ENOSPC && ret != -EOPNOTSUPP) |
| @@ -164,12 +166,12 @@ static void ieee80211_key_disable_hw_accel(struct ieee80211_key *key) | |||
| 164 | if (!key || !key->local->ops->set_key) | 166 | if (!key || !key->local->ops->set_key) |
| 165 | return; | 167 | return; |
| 166 | 168 | ||
| 167 | spin_lock(&todo_lock); | 169 | spin_lock_bh(&todo_lock); |
| 168 | if (!(key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE)) { | 170 | if (!(key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE)) { |
| 169 | spin_unlock(&todo_lock); | 171 | spin_unlock_bh(&todo_lock); |
| 170 | return; | 172 | return; |
| 171 | } | 173 | } |
| 172 | spin_unlock(&todo_lock); | 174 | spin_unlock_bh(&todo_lock); |
| 173 | 175 | ||
| 174 | sta = get_sta_for_key(key); | 176 | sta = get_sta_for_key(key); |
| 175 | sdata = key->sdata; | 177 | sdata = key->sdata; |
| @@ -188,9 +190,9 @@ static void ieee80211_key_disable_hw_accel(struct ieee80211_key *key) | |||
| 188 | wiphy_name(key->local->hw.wiphy), | 190 | wiphy_name(key->local->hw.wiphy), |
| 189 | key->conf.keyidx, sta ? sta->addr : bcast_addr, ret); | 191 | key->conf.keyidx, sta ? sta->addr : bcast_addr, ret); |
| 190 | 192 | ||
| 191 | spin_lock(&todo_lock); | 193 | spin_lock_bh(&todo_lock); |
| 192 | key->flags &= ~KEY_FLAG_UPLOADED_TO_HARDWARE; | 194 | key->flags &= ~KEY_FLAG_UPLOADED_TO_HARDWARE; |
| 193 | spin_unlock(&todo_lock); | 195 | spin_unlock_bh(&todo_lock); |
| 194 | } | 196 | } |
| 195 | 197 | ||
| 196 | static void __ieee80211_set_default_key(struct ieee80211_sub_if_data *sdata, | 198 | static void __ieee80211_set_default_key(struct ieee80211_sub_if_data *sdata, |
| @@ -437,14 +439,14 @@ void ieee80211_key_link(struct ieee80211_key *key, | |||
| 437 | 439 | ||
| 438 | __ieee80211_key_replace(sdata, sta, old_key, key); | 440 | __ieee80211_key_replace(sdata, sta, old_key, key); |
| 439 | 441 | ||
| 440 | spin_unlock_irqrestore(&sdata->local->key_lock, flags); | ||
| 441 | |||
| 442 | /* free old key later */ | 442 | /* free old key later */ |
| 443 | add_todo(old_key, KEY_FLAG_TODO_DELETE); | 443 | add_todo(old_key, KEY_FLAG_TODO_DELETE); |
| 444 | 444 | ||
| 445 | add_todo(key, KEY_FLAG_TODO_ADD_DEBUGFS); | 445 | add_todo(key, KEY_FLAG_TODO_ADD_DEBUGFS); |
| 446 | if (netif_running(sdata->dev)) | 446 | if (netif_running(sdata->dev)) |
| 447 | add_todo(key, KEY_FLAG_TODO_HWACCEL_ADD); | 447 | add_todo(key, KEY_FLAG_TODO_HWACCEL_ADD); |
| 448 | |||
| 449 | spin_unlock_irqrestore(&sdata->local->key_lock, flags); | ||
| 448 | } | 450 | } |
| 449 | 451 | ||
| 450 | static void __ieee80211_key_free(struct ieee80211_key *key) | 452 | static void __ieee80211_key_free(struct ieee80211_key *key) |
| @@ -547,7 +549,7 @@ static void __ieee80211_key_todo(void) | |||
| 547 | */ | 549 | */ |
| 548 | synchronize_rcu(); | 550 | synchronize_rcu(); |
| 549 | 551 | ||
| 550 | spin_lock(&todo_lock); | 552 | spin_lock_bh(&todo_lock); |
| 551 | while (!list_empty(&todo_list)) { | 553 | while (!list_empty(&todo_list)) { |
| 552 | key = list_first_entry(&todo_list, struct ieee80211_key, todo); | 554 | key = list_first_entry(&todo_list, struct ieee80211_key, todo); |
| 553 | list_del_init(&key->todo); | 555 | list_del_init(&key->todo); |
| @@ -558,7 +560,7 @@ static void __ieee80211_key_todo(void) | |||
| 558 | KEY_FLAG_TODO_HWACCEL_REMOVE | | 560 | KEY_FLAG_TODO_HWACCEL_REMOVE | |
| 559 | KEY_FLAG_TODO_DELETE); | 561 | KEY_FLAG_TODO_DELETE); |
| 560 | key->flags &= ~todoflags; | 562 | key->flags &= ~todoflags; |
| 561 | spin_unlock(&todo_lock); | 563 | spin_unlock_bh(&todo_lock); |
| 562 | 564 | ||
| 563 | work_done = false; | 565 | work_done = false; |
| 564 | 566 | ||
| @@ -591,9 +593,9 @@ static void __ieee80211_key_todo(void) | |||
| 591 | 593 | ||
| 592 | WARN_ON(!work_done); | 594 | WARN_ON(!work_done); |
| 593 | 595 | ||
| 594 | spin_lock(&todo_lock); | 596 | spin_lock_bh(&todo_lock); |
| 595 | } | 597 | } |
| 596 | spin_unlock(&todo_lock); | 598 | spin_unlock_bh(&todo_lock); |
| 597 | } | 599 | } |
| 598 | 600 | ||
| 599 | void ieee80211_key_todo(void) | 601 | void ieee80211_key_todo(void) |
diff --git a/net/netfilter/xt_quota.c b/net/netfilter/xt_quota.c index 98fc190e8f0e..390b7d09fe51 100644 --- a/net/netfilter/xt_quota.c +++ b/net/netfilter/xt_quota.c | |||
| @@ -52,7 +52,7 @@ static bool quota_mt_check(const struct xt_mtchk_param *par) | |||
| 52 | 52 | ||
| 53 | q->master = kmalloc(sizeof(*q->master), GFP_KERNEL); | 53 | q->master = kmalloc(sizeof(*q->master), GFP_KERNEL); |
| 54 | if (q->master == NULL) | 54 | if (q->master == NULL) |
| 55 | return -ENOMEM; | 55 | return false; |
| 56 | 56 | ||
| 57 | q->master->quota = q->quota; | 57 | q->master->quota = q->quota; |
| 58 | return true; | 58 | return true; |
diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c index 24d17ce9c294..fdb694e9f759 100644 --- a/net/sched/sch_api.c +++ b/net/sched/sch_api.c | |||
| @@ -1456,6 +1456,8 @@ static int tc_fill_tclass(struct sk_buff *skb, struct Qdisc *q, | |||
| 1456 | nlh = NLMSG_NEW(skb, pid, seq, event, sizeof(*tcm), flags); | 1456 | nlh = NLMSG_NEW(skb, pid, seq, event, sizeof(*tcm), flags); |
| 1457 | tcm = NLMSG_DATA(nlh); | 1457 | tcm = NLMSG_DATA(nlh); |
| 1458 | tcm->tcm_family = AF_UNSPEC; | 1458 | tcm->tcm_family = AF_UNSPEC; |
| 1459 | tcm->tcm__pad1 = 0; | ||
| 1460 | tcm->tcm__pad2 = 0; | ||
| 1459 | tcm->tcm_ifindex = qdisc_dev(q)->ifindex; | 1461 | tcm->tcm_ifindex = qdisc_dev(q)->ifindex; |
| 1460 | tcm->tcm_parent = q->handle; | 1462 | tcm->tcm_parent = q->handle; |
| 1461 | tcm->tcm_handle = q->handle; | 1463 | tcm->tcm_handle = q->handle; |
diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c index ebfcf9b89909..df1039f077c2 100644 --- a/net/sunrpc/clnt.c +++ b/net/sunrpc/clnt.c | |||
| @@ -937,6 +937,7 @@ static inline void | |||
| 937 | rpc_task_force_reencode(struct rpc_task *task) | 937 | rpc_task_force_reencode(struct rpc_task *task) |
| 938 | { | 938 | { |
| 939 | task->tk_rqstp->rq_snd_buf.len = 0; | 939 | task->tk_rqstp->rq_snd_buf.len = 0; |
| 940 | task->tk_rqstp->rq_bytes_sent = 0; | ||
| 940 | } | 941 | } |
| 941 | 942 | ||
| 942 | static inline void | 943 | static inline void |
diff --git a/security/integrity/ima/ima_crypto.c b/security/integrity/ima/ima_crypto.c index 63003a63aaee..46642a19bc78 100644 --- a/security/integrity/ima/ima_crypto.c +++ b/security/integrity/ima/ima_crypto.c | |||
| @@ -45,9 +45,9 @@ int ima_calc_hash(struct file *file, char *digest) | |||
| 45 | { | 45 | { |
| 46 | struct hash_desc desc; | 46 | struct hash_desc desc; |
| 47 | struct scatterlist sg[1]; | 47 | struct scatterlist sg[1]; |
| 48 | loff_t i_size; | 48 | loff_t i_size, offset = 0; |
| 49 | char *rbuf; | 49 | char *rbuf; |
| 50 | int rc, offset = 0; | 50 | int rc; |
| 51 | 51 | ||
| 52 | rc = init_desc(&desc); | 52 | rc = init_desc(&desc); |
| 53 | if (rc != 0) | 53 | if (rc != 0) |
| @@ -67,6 +67,8 @@ int ima_calc_hash(struct file *file, char *digest) | |||
| 67 | rc = rbuf_len; | 67 | rc = rbuf_len; |
| 68 | break; | 68 | break; |
| 69 | } | 69 | } |
| 70 | if (rbuf_len == 0) | ||
| 71 | break; | ||
| 70 | offset += rbuf_len; | 72 | offset += rbuf_len; |
| 71 | sg_init_one(sg, rbuf, rbuf_len); | 73 | sg_init_one(sg, rbuf, rbuf_len); |
| 72 | 74 | ||
diff --git a/security/integrity/ima/ima_main.c b/security/integrity/ima/ima_main.c index 101c512564ec..b85e61bcf246 100644 --- a/security/integrity/ima/ima_main.c +++ b/security/integrity/ima/ima_main.c | |||
| @@ -249,7 +249,11 @@ void ima_counts_put(struct path *path, int mask) | |||
| 249 | struct inode *inode = path->dentry->d_inode; | 249 | struct inode *inode = path->dentry->d_inode; |
| 250 | struct ima_iint_cache *iint; | 250 | struct ima_iint_cache *iint; |
| 251 | 251 | ||
| 252 | if (!ima_initialized || !S_ISREG(inode->i_mode)) | 252 | /* The inode may already have been freed, freeing the iint |
| 253 | * with it. Verify the inode is not NULL before dereferencing | ||
| 254 | * it. | ||
| 255 | */ | ||
| 256 | if (!ima_initialized || !inode || !S_ISREG(inode->i_mode)) | ||
| 253 | return; | 257 | return; |
| 254 | iint = ima_iint_find_insert_get(inode); | 258 | iint = ima_iint_find_insert_get(inode); |
| 255 | if (!iint) | 259 | if (!iint) |
| @@ -262,6 +266,8 @@ void ima_counts_put(struct path *path, int mask) | |||
| 262 | else if (mask & (MAY_READ | MAY_EXEC)) | 266 | else if (mask & (MAY_READ | MAY_EXEC)) |
| 263 | iint->readcount--; | 267 | iint->readcount--; |
| 264 | mutex_unlock(&iint->mutex); | 268 | mutex_unlock(&iint->mutex); |
| 269 | |||
| 270 | kref_put(&iint->refcount, iint_free); | ||
| 265 | } | 271 | } |
| 266 | 272 | ||
| 267 | /* | 273 | /* |
| @@ -291,6 +297,8 @@ void ima_counts_get(struct file *file) | |||
| 291 | if (file->f_mode & FMODE_WRITE) | 297 | if (file->f_mode & FMODE_WRITE) |
| 292 | iint->writecount++; | 298 | iint->writecount++; |
| 293 | mutex_unlock(&iint->mutex); | 299 | mutex_unlock(&iint->mutex); |
| 300 | |||
| 301 | kref_put(&iint->refcount, iint_free); | ||
| 294 | } | 302 | } |
| 295 | EXPORT_SYMBOL_GPL(ima_counts_get); | 303 | EXPORT_SYMBOL_GPL(ima_counts_get); |
| 296 | 304 | ||
diff --git a/sound/core/pcm_lib.c b/sound/core/pcm_lib.c index 72cfd47af6b8..9db60d831bb2 100644 --- a/sound/core/pcm_lib.c +++ b/sound/core/pcm_lib.c | |||
| @@ -943,47 +943,24 @@ static int snd_interval_ratden(struct snd_interval *i, | |||
| 943 | int snd_interval_list(struct snd_interval *i, unsigned int count, unsigned int *list, unsigned int mask) | 943 | int snd_interval_list(struct snd_interval *i, unsigned int count, unsigned int *list, unsigned int mask) |
| 944 | { | 944 | { |
| 945 | unsigned int k; | 945 | unsigned int k; |
| 946 | int changed = 0; | 946 | struct snd_interval list_range; |
| 947 | 947 | ||
| 948 | if (!count) { | 948 | if (!count) { |
| 949 | i->empty = 1; | 949 | i->empty = 1; |
| 950 | return -EINVAL; | 950 | return -EINVAL; |
| 951 | } | 951 | } |
| 952 | snd_interval_any(&list_range); | ||
| 953 | list_range.min = UINT_MAX; | ||
| 954 | list_range.max = 0; | ||
| 952 | for (k = 0; k < count; k++) { | 955 | for (k = 0; k < count; k++) { |
| 953 | if (mask && !(mask & (1 << k))) | 956 | if (mask && !(mask & (1 << k))) |
| 954 | continue; | 957 | continue; |
| 955 | if (i->min == list[k] && !i->openmin) | 958 | if (!snd_interval_test(i, list[k])) |
| 956 | goto _l1; | ||
| 957 | if (i->min < list[k]) { | ||
| 958 | i->min = list[k]; | ||
| 959 | i->openmin = 0; | ||
| 960 | changed = 1; | ||
| 961 | goto _l1; | ||
| 962 | } | ||
| 963 | } | ||
| 964 | i->empty = 1; | ||
| 965 | return -EINVAL; | ||
| 966 | _l1: | ||
| 967 | for (k = count; k-- > 0;) { | ||
| 968 | if (mask && !(mask & (1 << k))) | ||
| 969 | continue; | 959 | continue; |
| 970 | if (i->max == list[k] && !i->openmax) | 960 | list_range.min = min(list_range.min, list[k]); |
| 971 | goto _l2; | 961 | list_range.max = max(list_range.max, list[k]); |
| 972 | if (i->max > list[k]) { | ||
| 973 | i->max = list[k]; | ||
| 974 | i->openmax = 0; | ||
| 975 | changed = 1; | ||
| 976 | goto _l2; | ||
| 977 | } | ||
| 978 | } | 962 | } |
| 979 | i->empty = 1; | 963 | return snd_interval_refine(i, &list_range); |
| 980 | return -EINVAL; | ||
| 981 | _l2: | ||
| 982 | if (snd_interval_checkempty(i)) { | ||
| 983 | i->empty = 1; | ||
| 984 | return -EINVAL; | ||
| 985 | } | ||
| 986 | return changed; | ||
| 987 | } | 964 | } |
| 988 | 965 | ||
| 989 | EXPORT_SYMBOL(snd_interval_list); | 966 | EXPORT_SYMBOL(snd_interval_list); |
diff --git a/sound/pci/ali5451/ali5451.c b/sound/pci/ali5451/ali5451.c index c551006e2920..76d76c08339b 100644 --- a/sound/pci/ali5451/ali5451.c +++ b/sound/pci/ali5451/ali5451.c | |||
| @@ -310,12 +310,16 @@ static int snd_ali_codec_ready(struct snd_ali *codec, | |||
| 310 | unsigned int res; | 310 | unsigned int res; |
| 311 | 311 | ||
| 312 | end_time = jiffies + msecs_to_jiffies(250); | 312 | end_time = jiffies + msecs_to_jiffies(250); |
| 313 | do { | 313 | |
| 314 | for (;;) { | ||
| 314 | res = snd_ali_5451_peek(codec,port); | 315 | res = snd_ali_5451_peek(codec,port); |
| 315 | if (!(res & 0x8000)) | 316 | if (!(res & 0x8000)) |
| 316 | return 0; | 317 | return 0; |
| 318 | if (!time_after_eq(end_time, jiffies)) | ||
| 319 | break; | ||
| 317 | schedule_timeout_uninterruptible(1); | 320 | schedule_timeout_uninterruptible(1); |
| 318 | } while (time_after_eq(end_time, jiffies)); | 321 | } |
| 322 | |||
| 319 | snd_ali_5451_poke(codec, port, res & ~0x8000); | 323 | snd_ali_5451_poke(codec, port, res & ~0x8000); |
| 320 | snd_printdd("ali_codec_ready: codec is not ready.\n "); | 324 | snd_printdd("ali_codec_ready: codec is not ready.\n "); |
| 321 | return -EIO; | 325 | return -EIO; |
| @@ -327,15 +331,17 @@ static int snd_ali_stimer_ready(struct snd_ali *codec) | |||
| 327 | unsigned long dwChk1,dwChk2; | 331 | unsigned long dwChk1,dwChk2; |
| 328 | 332 | ||
| 329 | dwChk1 = snd_ali_5451_peek(codec, ALI_STIMER); | 333 | dwChk1 = snd_ali_5451_peek(codec, ALI_STIMER); |
| 330 | dwChk2 = snd_ali_5451_peek(codec, ALI_STIMER); | ||
| 331 | |||
| 332 | end_time = jiffies + msecs_to_jiffies(250); | 334 | end_time = jiffies + msecs_to_jiffies(250); |
| 333 | do { | 335 | |
| 336 | for (;;) { | ||
| 334 | dwChk2 = snd_ali_5451_peek(codec, ALI_STIMER); | 337 | dwChk2 = snd_ali_5451_peek(codec, ALI_STIMER); |
| 335 | if (dwChk2 != dwChk1) | 338 | if (dwChk2 != dwChk1) |
| 336 | return 0; | 339 | return 0; |
| 340 | if (!time_after_eq(end_time, jiffies)) | ||
| 341 | break; | ||
| 337 | schedule_timeout_uninterruptible(1); | 342 | schedule_timeout_uninterruptible(1); |
| 338 | } while (time_after_eq(end_time, jiffies)); | 343 | } |
| 344 | |||
| 339 | snd_printk(KERN_ERR "ali_stimer_read: stimer is not ready.\n"); | 345 | snd_printk(KERN_ERR "ali_stimer_read: stimer is not ready.\n"); |
| 340 | return -EIO; | 346 | return -EIO; |
| 341 | } | 347 | } |
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 6f683e451f2b..30eeb304351c 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
| @@ -6423,9 +6423,9 @@ static struct hda_verb alc885_mbp_ch2_init[] = { | |||
| 6423 | }; | 6423 | }; |
| 6424 | 6424 | ||
| 6425 | /* | 6425 | /* |
| 6426 | * 6ch mode | 6426 | * 4ch mode |
| 6427 | */ | 6427 | */ |
| 6428 | static struct hda_verb alc885_mbp_ch6_init[] = { | 6428 | static struct hda_verb alc885_mbp_ch4_init[] = { |
| 6429 | { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, | 6429 | { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, |
| 6430 | { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | 6430 | { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, |
| 6431 | { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 }, | 6431 | { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 }, |
| @@ -6434,9 +6434,9 @@ static struct hda_verb alc885_mbp_ch6_init[] = { | |||
| 6434 | { } /* end */ | 6434 | { } /* end */ |
| 6435 | }; | 6435 | }; |
| 6436 | 6436 | ||
| 6437 | static struct hda_channel_mode alc885_mbp_6ch_modes[2] = { | 6437 | static struct hda_channel_mode alc885_mbp_4ch_modes[2] = { |
| 6438 | { 2, alc885_mbp_ch2_init }, | 6438 | { 2, alc885_mbp_ch2_init }, |
| 6439 | { 6, alc885_mbp_ch6_init }, | 6439 | { 4, alc885_mbp_ch4_init }, |
| 6440 | }; | 6440 | }; |
| 6441 | 6441 | ||
| 6442 | /* | 6442 | /* |
| @@ -6497,10 +6497,11 @@ static struct snd_kcontrol_new alc882_base_mixer[] = { | |||
| 6497 | }; | 6497 | }; |
| 6498 | 6498 | ||
| 6499 | static struct snd_kcontrol_new alc885_mbp3_mixer[] = { | 6499 | static struct snd_kcontrol_new alc885_mbp3_mixer[] = { |
| 6500 | HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT), | 6500 | HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x00, HDA_OUTPUT), |
| 6501 | HDA_BIND_MUTE ("Front Playback Switch", 0x0c, 0x02, HDA_INPUT), | 6501 | HDA_BIND_MUTE ("Speaker Playback Switch", 0x0c, 0x02, HDA_INPUT), |
| 6502 | HDA_CODEC_MUTE ("Speaker Playback Switch", 0x14, 0x00, HDA_OUTPUT), | 6502 | HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0e, 0x00, HDA_OUTPUT), |
| 6503 | HDA_CODEC_VOLUME("Line-Out Playback Volume", 0x0d, 0x00, HDA_OUTPUT), | 6503 | HDA_BIND_MUTE ("Headphone Playback Switch", 0x0e, 0x02, HDA_INPUT), |
| 6504 | HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT), | ||
| 6504 | HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), | 6505 | HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), |
| 6505 | HDA_CODEC_MUTE ("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), | 6506 | HDA_CODEC_MUTE ("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), |
| 6506 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x00, HDA_INPUT), | 6507 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x00, HDA_INPUT), |
| @@ -6814,14 +6815,18 @@ static struct hda_verb alc885_mbp3_init_verbs[] = { | |||
| 6814 | {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | 6815 | {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, |
| 6815 | {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | 6816 | {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, |
| 6816 | {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, | 6817 | {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, |
| 6818 | /* HP mixer */ | ||
| 6819 | {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | ||
| 6820 | {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
| 6821 | {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, | ||
| 6817 | /* Front Pin: output 0 (0x0c) */ | 6822 | /* Front Pin: output 0 (0x0c) */ |
| 6818 | {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, | 6823 | {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, |
| 6819 | {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | 6824 | {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, |
| 6820 | {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, | 6825 | {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, |
| 6821 | /* HP Pin: output 0 (0x0d) */ | 6826 | /* HP Pin: output 0 (0x0e) */ |
| 6822 | {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4}, | 6827 | {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4}, |
| 6823 | {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | 6828 | {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, |
| 6824 | {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, | 6829 | {0x15, AC_VERB_SET_CONNECT_SEL, 0x02}, |
| 6825 | {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, | 6830 | {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, |
| 6826 | /* Mic (rear) pin: input vref at 80% */ | 6831 | /* Mic (rear) pin: input vref at 80% */ |
| 6827 | {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, | 6832 | {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, |
| @@ -7195,10 +7200,11 @@ static struct alc_config_preset alc882_presets[] = { | |||
| 7195 | .mixers = { alc885_mbp3_mixer, alc882_chmode_mixer }, | 7200 | .mixers = { alc885_mbp3_mixer, alc882_chmode_mixer }, |
| 7196 | .init_verbs = { alc885_mbp3_init_verbs, | 7201 | .init_verbs = { alc885_mbp3_init_verbs, |
| 7197 | alc880_gpio1_init_verbs }, | 7202 | alc880_gpio1_init_verbs }, |
| 7198 | .num_dacs = ARRAY_SIZE(alc882_dac_nids), | 7203 | .num_dacs = 2, |
| 7199 | .dac_nids = alc882_dac_nids, | 7204 | .dac_nids = alc882_dac_nids, |
| 7200 | .channel_mode = alc885_mbp_6ch_modes, | 7205 | .hp_nid = 0x04, |
| 7201 | .num_channel_mode = ARRAY_SIZE(alc885_mbp_6ch_modes), | 7206 | .channel_mode = alc885_mbp_4ch_modes, |
| 7207 | .num_channel_mode = ARRAY_SIZE(alc885_mbp_4ch_modes), | ||
| 7202 | .input_mux = &alc882_capture_source, | 7208 | .input_mux = &alc882_capture_source, |
| 7203 | .dig_out_nid = ALC882_DIGOUT_NID, | 7209 | .dig_out_nid = ALC882_DIGOUT_NID, |
| 7204 | .dig_in_nid = ALC882_DIGIN_NID, | 7210 | .dig_in_nid = ALC882_DIGIN_NID, |
diff --git a/sound/pci/hda/patch_via.c b/sound/pci/hda/patch_via.c index 9008b4b013aa..e8f10b10cceb 100644 --- a/sound/pci/hda/patch_via.c +++ b/sound/pci/hda/patch_via.c | |||
| @@ -1395,6 +1395,7 @@ static int patch_vt1708(struct hda_codec *codec) | |||
| 1395 | if (!spec->adc_nids && spec->input_mux) { | 1395 | if (!spec->adc_nids && spec->input_mux) { |
| 1396 | spec->adc_nids = vt1708_adc_nids; | 1396 | spec->adc_nids = vt1708_adc_nids; |
| 1397 | spec->num_adc_nids = ARRAY_SIZE(vt1708_adc_nids); | 1397 | spec->num_adc_nids = ARRAY_SIZE(vt1708_adc_nids); |
| 1398 | get_mux_nids(codec); | ||
| 1398 | spec->mixers[spec->num_mixers] = vt1708_capture_mixer; | 1399 | spec->mixers[spec->num_mixers] = vt1708_capture_mixer; |
| 1399 | spec->num_mixers++; | 1400 | spec->num_mixers++; |
| 1400 | } | 1401 | } |
diff --git a/sound/pci/oxygen/oxygen_lib.c b/sound/pci/oxygen/oxygen_lib.c index 312251d39696..9a8936e20744 100644 --- a/sound/pci/oxygen/oxygen_lib.c +++ b/sound/pci/oxygen/oxygen_lib.c | |||
| @@ -260,6 +260,9 @@ oxygen_search_pci_id(struct oxygen *chip, const struct pci_device_id ids[]) | |||
| 260 | * chip didn't if the first EEPROM word was overwritten. | 260 | * chip didn't if the first EEPROM word was overwritten. |
| 261 | */ | 261 | */ |
| 262 | subdevice = oxygen_read_eeprom(chip, 2); | 262 | subdevice = oxygen_read_eeprom(chip, 2); |
| 263 | /* use default ID if EEPROM is missing */ | ||
| 264 | if (subdevice == 0xffff) | ||
| 265 | subdevice = 0x8788; | ||
| 263 | /* | 266 | /* |
| 264 | * We use only the subsystem device ID for searching because it is | 267 | * We use only the subsystem device ID for searching because it is |
| 265 | * unique even without the subsystem vendor ID, which may have been | 268 | * unique even without the subsystem vendor ID, which may have been |
diff --git a/sound/pci/oxygen/oxygen_pcm.c b/sound/pci/oxygen/oxygen_pcm.c index 3b5ca70c9d4d..ef2345d82b86 100644 --- a/sound/pci/oxygen/oxygen_pcm.c +++ b/sound/pci/oxygen/oxygen_pcm.c | |||
| @@ -469,9 +469,11 @@ static int oxygen_multich_hw_params(struct snd_pcm_substream *substream, | |||
| 469 | oxygen_write16_masked(chip, OXYGEN_I2S_MULTICH_FORMAT, | 469 | oxygen_write16_masked(chip, OXYGEN_I2S_MULTICH_FORMAT, |
| 470 | oxygen_rate(hw_params) | | 470 | oxygen_rate(hw_params) | |
| 471 | chip->model.dac_i2s_format | | 471 | chip->model.dac_i2s_format | |
| 472 | oxygen_i2s_mclk(hw_params) | | ||
| 472 | oxygen_i2s_bits(hw_params), | 473 | oxygen_i2s_bits(hw_params), |
| 473 | OXYGEN_I2S_RATE_MASK | | 474 | OXYGEN_I2S_RATE_MASK | |
| 474 | OXYGEN_I2S_FORMAT_MASK | | 475 | OXYGEN_I2S_FORMAT_MASK | |
| 476 | OXYGEN_I2S_MCLK_MASK | | ||
| 475 | OXYGEN_I2S_BITS_MASK); | 477 | OXYGEN_I2S_BITS_MASK); |
| 476 | oxygen_update_dac_routing(chip); | 478 | oxygen_update_dac_routing(chip); |
| 477 | oxygen_update_spdif_source(chip); | 479 | oxygen_update_spdif_source(chip); |
diff --git a/sound/pci/vx222/vx222_ops.c b/sound/pci/vx222/vx222_ops.c index 6416d3f0c7be..a69e774d0b13 100644 --- a/sound/pci/vx222/vx222_ops.c +++ b/sound/pci/vx222/vx222_ops.c | |||
| @@ -885,10 +885,10 @@ static int vx_input_level_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem | |||
| 885 | struct vx_core *_chip = snd_kcontrol_chip(kcontrol); | 885 | struct vx_core *_chip = snd_kcontrol_chip(kcontrol); |
| 886 | struct snd_vx222 *chip = (struct snd_vx222 *)_chip; | 886 | struct snd_vx222 *chip = (struct snd_vx222 *)_chip; |
| 887 | if (ucontrol->value.integer.value[0] < 0 || | 887 | if (ucontrol->value.integer.value[0] < 0 || |
| 888 | ucontrol->value.integer.value[0] < MIC_LEVEL_MAX) | 888 | ucontrol->value.integer.value[0] > MIC_LEVEL_MAX) |
| 889 | return -EINVAL; | 889 | return -EINVAL; |
| 890 | if (ucontrol->value.integer.value[1] < 0 || | 890 | if (ucontrol->value.integer.value[1] < 0 || |
| 891 | ucontrol->value.integer.value[1] < MIC_LEVEL_MAX) | 891 | ucontrol->value.integer.value[1] > MIC_LEVEL_MAX) |
| 892 | return -EINVAL; | 892 | return -EINVAL; |
| 893 | mutex_lock(&_chip->mixer_mutex); | 893 | mutex_lock(&_chip->mixer_mutex); |
| 894 | if (chip->input_level[0] != ucontrol->value.integer.value[0] || | 894 | if (chip->input_level[0] != ucontrol->value.integer.value[0] || |
diff --git a/tools/perf/builtin-annotate.c b/tools/perf/builtin-annotate.c index 343e7b14bf01..5e17de984dc8 100644 --- a/tools/perf/builtin-annotate.c +++ b/tools/perf/builtin-annotate.c | |||
| @@ -31,6 +31,7 @@ static char *vmlinux = "vmlinux"; | |||
| 31 | static char default_sort_order[] = "comm,symbol"; | 31 | static char default_sort_order[] = "comm,symbol"; |
| 32 | static char *sort_order = default_sort_order; | 32 | static char *sort_order = default_sort_order; |
| 33 | 33 | ||
| 34 | static int force; | ||
| 34 | static int input; | 35 | static int input; |
| 35 | static int show_mask = SHOW_KERNEL | SHOW_USER | SHOW_HV; | 36 | static int show_mask = SHOW_KERNEL | SHOW_USER | SHOW_HV; |
| 36 | 37 | ||
| @@ -1334,6 +1335,11 @@ static int __cmd_annotate(void) | |||
| 1334 | exit(-1); | 1335 | exit(-1); |
| 1335 | } | 1336 | } |
| 1336 | 1337 | ||
| 1338 | if (!force && (stat.st_uid != geteuid())) { | ||
| 1339 | fprintf(stderr, "file: %s not owned by current user\n", input_name); | ||
| 1340 | exit(-1); | ||
| 1341 | } | ||
| 1342 | |||
| 1337 | if (!stat.st_size) { | 1343 | if (!stat.st_size) { |
| 1338 | fprintf(stderr, "zero-sized file, nothing to do!\n"); | 1344 | fprintf(stderr, "zero-sized file, nothing to do!\n"); |
| 1339 | exit(0); | 1345 | exit(0); |
| @@ -1439,6 +1445,7 @@ static const struct option options[] = { | |||
| 1439 | "input file name"), | 1445 | "input file name"), |
| 1440 | OPT_STRING('s', "symbol", &sym_hist_filter, "symbol", | 1446 | OPT_STRING('s', "symbol", &sym_hist_filter, "symbol", |
| 1441 | "symbol to annotate"), | 1447 | "symbol to annotate"), |
| 1448 | OPT_BOOLEAN('f', "force", &force, "don't complain, do it"), | ||
| 1442 | OPT_BOOLEAN('v', "verbose", &verbose, | 1449 | OPT_BOOLEAN('v', "verbose", &verbose, |
| 1443 | "be more verbose (show symbol address, etc)"), | 1450 | "be more verbose (show symbol address, etc)"), |
| 1444 | OPT_BOOLEAN('D', "dump-raw-trace", &dump_trace, | 1451 | OPT_BOOLEAN('D', "dump-raw-trace", &dump_trace, |
diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c index b53a60fc12de..8b2ec882e6e0 100644 --- a/tools/perf/builtin-report.c +++ b/tools/perf/builtin-report.c | |||
| @@ -38,6 +38,7 @@ static char *dso_list_str, *comm_list_str, *sym_list_str, | |||
| 38 | static struct strlist *dso_list, *comm_list, *sym_list; | 38 | static struct strlist *dso_list, *comm_list, *sym_list; |
| 39 | static char *field_sep; | 39 | static char *field_sep; |
| 40 | 40 | ||
| 41 | static int force; | ||
| 41 | static int input; | 42 | static int input; |
| 42 | static int show_mask = SHOW_KERNEL | SHOW_USER | SHOW_HV; | 43 | static int show_mask = SHOW_KERNEL | SHOW_USER | SHOW_HV; |
| 43 | 44 | ||
| @@ -1856,6 +1857,11 @@ static int __cmd_report(void) | |||
| 1856 | exit(-1); | 1857 | exit(-1); |
| 1857 | } | 1858 | } |
| 1858 | 1859 | ||
| 1860 | if (!force && (stat.st_uid != geteuid())) { | ||
| 1861 | fprintf(stderr, "file: %s not owned by current user\n", input_name); | ||
| 1862 | exit(-1); | ||
| 1863 | } | ||
| 1864 | |||
| 1859 | if (!stat.st_size) { | 1865 | if (!stat.st_size) { |
| 1860 | fprintf(stderr, "zero-sized file, nothing to do!\n"); | 1866 | fprintf(stderr, "zero-sized file, nothing to do!\n"); |
| 1861 | exit(0); | 1867 | exit(0); |
| @@ -2064,6 +2070,7 @@ static const struct option options[] = { | |||
| 2064 | OPT_BOOLEAN('D', "dump-raw-trace", &dump_trace, | 2070 | OPT_BOOLEAN('D', "dump-raw-trace", &dump_trace, |
| 2065 | "dump raw trace in ASCII"), | 2071 | "dump raw trace in ASCII"), |
| 2066 | OPT_STRING('k', "vmlinux", &vmlinux, "file", "vmlinux pathname"), | 2072 | OPT_STRING('k', "vmlinux", &vmlinux, "file", "vmlinux pathname"), |
| 2073 | OPT_BOOLEAN('f', "force", &force, "don't complain, do it"), | ||
| 2067 | OPT_BOOLEAN('m', "modules", &modules, | 2074 | OPT_BOOLEAN('m', "modules", &modules, |
| 2068 | "load module symbols - WARNING: use only with -k and LIVE kernel"), | 2075 | "load module symbols - WARNING: use only with -k and LIVE kernel"), |
| 2069 | OPT_BOOLEAN('n', "show-nr-samples", &show_nr_samples, | 2076 | OPT_BOOLEAN('n', "show-nr-samples", &show_nr_samples, |
