diff options
| author | Ingo Molnar <mingo@elte.hu> | 2008-12-01 14:36:13 -0500 |
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2008-12-01 14:36:13 -0500 |
| commit | f6d2e6f57bba66272b28dd20c949b14ce39cb804 (patch) | |
| tree | 2bf153af4d5b4b33ad2c1e88347c7fd752fb6332 | |
| parent | 8caac56305cef98f9357b060a77939d17699937d (diff) | |
| parent | 7b1dedca42ac0d0d0be01e39d8461bb53a2389b3 (diff) | |
Merge branch 'x86/urgent' into x86/iommu
163 files changed, 1206 insertions, 895 deletions
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt index 9fa6508892c2..e0f346d201ed 100644 --- a/Documentation/kernel-parameters.txt +++ b/Documentation/kernel-parameters.txt | |||
| @@ -294,7 +294,9 @@ and is between 256 and 4096 characters. It is defined in the file | |||
| 294 | Possible values are: | 294 | Possible values are: |
| 295 | isolate - enable device isolation (each device, as far | 295 | isolate - enable device isolation (each device, as far |
| 296 | as possible, will get its own protection | 296 | as possible, will get its own protection |
| 297 | domain) | 297 | domain) [default] |
| 298 | share - put every device behind one IOMMU into the | ||
| 299 | same protection domain | ||
| 298 | fullflush - enable flushing of IO/TLB entries when | 300 | fullflush - enable flushing of IO/TLB entries when |
| 299 | they are unmapped. Otherwise they are | 301 | they are unmapped. Otherwise they are |
| 300 | flushed before they will be reused, which | 302 | flushed before they will be reused, which |
| @@ -1193,8 +1195,8 @@ and is between 256 and 4096 characters. It is defined in the file | |||
| 1193 | it is equivalent to "nosmp", which also disables | 1195 | it is equivalent to "nosmp", which also disables |
| 1194 | the IO APIC. | 1196 | the IO APIC. |
| 1195 | 1197 | ||
| 1196 | max_addr=[KMG] [KNL,BOOT,ia64] All physical memory greater than or | 1198 | max_addr=nn[KMG] [KNL,BOOT,ia64] All physical memory greater than |
| 1197 | equal to this physical address is ignored. | 1199 | or equal to this physical address is ignored. |
| 1198 | 1200 | ||
| 1199 | max_luns= [SCSI] Maximum number of LUNs to probe. | 1201 | max_luns= [SCSI] Maximum number of LUNs to probe. |
| 1200 | Should be between 1 and 2^32-1. | 1202 | Should be between 1 and 2^32-1. |
| @@ -1294,6 +1296,9 @@ and is between 256 and 4096 characters. It is defined in the file | |||
| 1294 | 1296 | ||
| 1295 | mga= [HW,DRM] | 1297 | mga= [HW,DRM] |
| 1296 | 1298 | ||
| 1299 | min_addr=nn[KMG] [KNL,BOOT,ia64] All physical memory below this | ||
| 1300 | physical address is ignored. | ||
| 1301 | |||
| 1297 | mminit_loglevel= | 1302 | mminit_loglevel= |
| 1298 | [KNL] When CONFIG_DEBUG_MEMORY_INIT is set, this | 1303 | [KNL] When CONFIG_DEBUG_MEMORY_INIT is set, this |
| 1299 | parameter allows control of the logging verbosity for | 1304 | parameter allows control of the logging verbosity for |
diff --git a/Documentation/networking/phy.txt b/Documentation/networking/phy.txt index 8df6a7b0e66c..88bb71b46da4 100644 --- a/Documentation/networking/phy.txt +++ b/Documentation/networking/phy.txt | |||
| @@ -96,7 +96,7 @@ Letting the PHY Abstraction Layer do Everything | |||
| 96 | static void adjust_link(struct net_device *dev); | 96 | static void adjust_link(struct net_device *dev); |
| 97 | 97 | ||
| 98 | Next, you need to know the device name of the PHY connected to this device. | 98 | Next, you need to know the device name of the PHY connected to this device. |
| 99 | The name will look something like, "phy0:0", where the first number is the | 99 | The name will look something like, "0:00", where the first number is the |
| 100 | bus id, and the second is the PHY's address on that bus. Typically, | 100 | bus id, and the second is the PHY's address on that bus. Typically, |
| 101 | the bus is responsible for making its ID unique. | 101 | the bus is responsible for making its ID unique. |
| 102 | 102 | ||
diff --git a/MAINTAINERS b/MAINTAINERS index 8e0777fae3ce..618c1ef4a397 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -1809,7 +1809,7 @@ S: Maintained | |||
| 1809 | 1809 | ||
| 1810 | FTRACE | 1810 | FTRACE |
| 1811 | P: Steven Rostedt | 1811 | P: Steven Rostedt |
| 1812 | M: srostedt@redhat.com | 1812 | M: rostedt@goodmis.org |
| 1813 | S: Maintained | 1813 | S: Maintained |
| 1814 | 1814 | ||
| 1815 | FUJITSU FR-V (FRV) PORT | 1815 | FUJITSU FR-V (FRV) PORT |
| @@ -3928,8 +3928,6 @@ M: bootc@bootc.net | |||
| 3928 | S: Maintained | 3928 | S: Maintained |
| 3929 | 3929 | ||
| 3930 | SOFTWARE RAID (Multiple Disks) SUPPORT | 3930 | SOFTWARE RAID (Multiple Disks) SUPPORT |
| 3931 | P: Ingo Molnar | ||
| 3932 | M: mingo@redhat.com | ||
| 3933 | P: Neil Brown | 3931 | P: Neil Brown |
| 3934 | M: neilb@suse.de | 3932 | M: neilb@suse.de |
| 3935 | L: linux-raid@vger.kernel.org | 3933 | L: linux-raid@vger.kernel.org |
| @@ -1,7 +1,7 @@ | |||
| 1 | VERSION = 2 | 1 | VERSION = 2 |
| 2 | PATCHLEVEL = 6 | 2 | PATCHLEVEL = 6 |
| 3 | SUBLEVEL = 28 | 3 | SUBLEVEL = 28 |
| 4 | EXTRAVERSION = -rc5 | 4 | EXTRAVERSION = -rc6 |
| 5 | NAME = Killer Bat of Doom | 5 | NAME = Killer Bat of Doom |
| 6 | 6 | ||
| 7 | # *DOCUMENTATION* | 7 | # *DOCUMENTATION* |
diff --git a/arch/blackfin/include/asm/bfin-global.h b/arch/blackfin/include/asm/bfin-global.h index 56dcb0a2d244..77295666c34b 100644 --- a/arch/blackfin/include/asm/bfin-global.h +++ b/arch/blackfin/include/asm/bfin-global.h | |||
| @@ -101,7 +101,7 @@ extern u16 _bfin_swrst; /* shadow for Software Reset Register (SWRST) */ | |||
| 101 | extern unsigned long _ramstart, _ramend, _rambase; | 101 | extern unsigned long _ramstart, _ramend, _rambase; |
| 102 | extern unsigned long memory_start, memory_end, physical_mem_end; | 102 | extern unsigned long memory_start, memory_end, physical_mem_end; |
| 103 | extern char _stext_l1[], _etext_l1[], _sdata_l1[], _edata_l1[], _sbss_l1[], | 103 | extern char _stext_l1[], _etext_l1[], _sdata_l1[], _edata_l1[], _sbss_l1[], |
| 104 | _ebss_l1[], _l1_lma_start[], _sdata_b_l1[], _ebss_b_l1[], | 104 | _ebss_l1[], _l1_lma_start[], _sdata_b_l1[], _sbss_b_l1[], _ebss_b_l1[], |
| 105 | _stext_l2[], _etext_l2[], _sdata_l2[], _edata_l2[], _sbss_l2[], | 105 | _stext_l2[], _etext_l2[], _sdata_l2[], _edata_l2[], _sbss_l2[], |
| 106 | _ebss_l2[], _l2_lma_start[]; | 106 | _ebss_l2[], _l2_lma_start[]; |
| 107 | 107 | ||
diff --git a/arch/blackfin/include/asm/dma-mapping.h b/arch/blackfin/include/asm/dma-mapping.h index ede748d67efd..d7d9148e433c 100644 --- a/arch/blackfin/include/asm/dma-mapping.h +++ b/arch/blackfin/include/asm/dma-mapping.h | |||
| @@ -15,7 +15,11 @@ void dma_free_coherent(struct device *dev, size_t size, void *vaddr, | |||
| 15 | #define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f) | 15 | #define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f) |
| 16 | #define dma_free_noncoherent(d, s, v, h) dma_free_coherent(d, s, v, h) | 16 | #define dma_free_noncoherent(d, s, v, h) dma_free_coherent(d, s, v, h) |
| 17 | 17 | ||
| 18 | #define dma_mapping_error | 18 | static inline |
| 19 | int dma_mapping_error(struct device *dev, dma_addr_t dma_addr) | ||
| 20 | { | ||
| 21 | return 0; | ||
| 22 | } | ||
| 19 | 23 | ||
| 20 | /* | 24 | /* |
| 21 | * Map a single buffer of the indicated size for DMA in streaming mode. | 25 | * Map a single buffer of the indicated size for DMA in streaming mode. |
diff --git a/arch/blackfin/kernel/bfin_gpio.c b/arch/blackfin/kernel/bfin_gpio.c index 6e08f425bb44..5c0800adb4dd 100644 --- a/arch/blackfin/kernel/bfin_gpio.c +++ b/arch/blackfin/kernel/bfin_gpio.c | |||
| @@ -218,7 +218,7 @@ inline int check_gpio(unsigned gpio) | |||
| 218 | if (gpio == GPIO_PB15 || gpio == GPIO_PC14 || gpio == GPIO_PC15 | 218 | if (gpio == GPIO_PB15 || gpio == GPIO_PC14 || gpio == GPIO_PC15 |
| 219 | || gpio == GPIO_PH14 || gpio == GPIO_PH15 | 219 | || gpio == GPIO_PH14 || gpio == GPIO_PH15 |
| 220 | || gpio == GPIO_PJ14 || gpio == GPIO_PJ15 | 220 | || gpio == GPIO_PJ14 || gpio == GPIO_PJ15 |
| 221 | || gpio > MAX_BLACKFIN_GPIOS) | 221 | || gpio >= MAX_BLACKFIN_GPIOS) |
| 222 | return -EINVAL; | 222 | return -EINVAL; |
| 223 | return 0; | 223 | return 0; |
| 224 | } | 224 | } |
diff --git a/arch/blackfin/kernel/cplb-nompu/cplbinit.c b/arch/blackfin/kernel/cplb-nompu/cplbinit.c index 512f8c92ead5..2debc900e246 100644 --- a/arch/blackfin/kernel/cplb-nompu/cplbinit.c +++ b/arch/blackfin/kernel/cplb-nompu/cplbinit.c | |||
| @@ -188,10 +188,11 @@ static struct cplb_desc cplb_data[] = { | |||
| 188 | 188 | ||
| 189 | static u16 __init lock_kernel_check(u32 start, u32 end) | 189 | static u16 __init lock_kernel_check(u32 start, u32 end) |
| 190 | { | 190 | { |
| 191 | if ((end <= (u32) _end && end >= (u32)_stext) || | 191 | if (start >= (u32)_end || end <= (u32)_stext) |
| 192 | (start <= (u32) _end && start >= (u32)_stext)) | 192 | return 0; |
| 193 | return IN_KERNEL; | 193 | |
| 194 | return 0; | 194 | /* This cplb block overlapped with kernel area. */ |
| 195 | return IN_KERNEL; | ||
| 195 | } | 196 | } |
| 196 | 197 | ||
| 197 | static unsigned short __init | 198 | static unsigned short __init |
diff --git a/arch/blackfin/kernel/process.c b/arch/blackfin/kernel/process.c index 77800dd83e57..0c3ea118b657 100644 --- a/arch/blackfin/kernel/process.c +++ b/arch/blackfin/kernel/process.c | |||
| @@ -351,10 +351,15 @@ int _access_ok(unsigned long addr, unsigned long size) | |||
| 351 | return 1; | 351 | return 1; |
| 352 | #endif | 352 | #endif |
| 353 | #if L1_DATA_B_LENGTH != 0 | 353 | #if L1_DATA_B_LENGTH != 0 |
| 354 | if (addr >= L1_DATA_B_START | 354 | if (addr >= L1_DATA_B_START + (_ebss_b_l1 - _sdata_b_l1) |
| 355 | && addr + size <= L1_DATA_B_START + L1_DATA_B_LENGTH) | 355 | && addr + size <= L1_DATA_B_START + L1_DATA_B_LENGTH) |
| 356 | return 1; | 356 | return 1; |
| 357 | #endif | 357 | #endif |
| 358 | #if L2_LENGTH != 0 | ||
| 359 | if (addr >= L2_START + (_ebss_l2 - _stext_l2) | ||
| 360 | && addr + size <= L2_START + L2_LENGTH) | ||
| 361 | return 1; | ||
| 362 | #endif | ||
| 358 | return 0; | 363 | return 0; |
| 359 | } | 364 | } |
| 360 | EXPORT_SYMBOL(_access_ok); | 365 | EXPORT_SYMBOL(_access_ok); |
diff --git a/arch/blackfin/kernel/setup.c b/arch/blackfin/kernel/setup.c index 7f35d1046cd8..71a9a8c53cea 100644 --- a/arch/blackfin/kernel/setup.c +++ b/arch/blackfin/kernel/setup.c | |||
| @@ -119,23 +119,23 @@ void __init bfin_relocate_l1_mem(void) | |||
| 119 | /* Copy _stext_l1 to _etext_l1 to L1 instruction SRAM */ | 119 | /* Copy _stext_l1 to _etext_l1 to L1 instruction SRAM */ |
| 120 | dma_memcpy(_stext_l1, _l1_lma_start, l1_code_length); | 120 | dma_memcpy(_stext_l1, _l1_lma_start, l1_code_length); |
| 121 | 121 | ||
| 122 | l1_data_a_length = _ebss_l1 - _sdata_l1; | 122 | l1_data_a_length = _sbss_l1 - _sdata_l1; |
| 123 | if (l1_data_a_length > L1_DATA_A_LENGTH) | 123 | if (l1_data_a_length > L1_DATA_A_LENGTH) |
| 124 | panic("L1 Data SRAM Bank A Overflow\n"); | 124 | panic("L1 Data SRAM Bank A Overflow\n"); |
| 125 | 125 | ||
| 126 | /* Copy _sdata_l1 to _ebss_l1 to L1 data bank A SRAM */ | 126 | /* Copy _sdata_l1 to _sbss_l1 to L1 data bank A SRAM */ |
| 127 | dma_memcpy(_sdata_l1, _l1_lma_start + l1_code_length, l1_data_a_length); | 127 | dma_memcpy(_sdata_l1, _l1_lma_start + l1_code_length, l1_data_a_length); |
| 128 | 128 | ||
| 129 | l1_data_b_length = _ebss_b_l1 - _sdata_b_l1; | 129 | l1_data_b_length = _sbss_b_l1 - _sdata_b_l1; |
| 130 | if (l1_data_b_length > L1_DATA_B_LENGTH) | 130 | if (l1_data_b_length > L1_DATA_B_LENGTH) |
| 131 | panic("L1 Data SRAM Bank B Overflow\n"); | 131 | panic("L1 Data SRAM Bank B Overflow\n"); |
| 132 | 132 | ||
| 133 | /* Copy _sdata_b_l1 to _ebss_b_l1 to L1 data bank B SRAM */ | 133 | /* Copy _sdata_b_l1 to _sbss_b_l1 to L1 data bank B SRAM */ |
| 134 | dma_memcpy(_sdata_b_l1, _l1_lma_start + l1_code_length + | 134 | dma_memcpy(_sdata_b_l1, _l1_lma_start + l1_code_length + |
| 135 | l1_data_a_length, l1_data_b_length); | 135 | l1_data_a_length, l1_data_b_length); |
| 136 | 136 | ||
| 137 | if (L2_LENGTH != 0) { | 137 | if (L2_LENGTH != 0) { |
| 138 | l2_length = _ebss_l2 - _stext_l2; | 138 | l2_length = _sbss_l2 - _stext_l2; |
| 139 | if (l2_length > L2_LENGTH) | 139 | if (l2_length > L2_LENGTH) |
| 140 | panic("L2 SRAM Overflow\n"); | 140 | panic("L2 SRAM Overflow\n"); |
| 141 | 141 | ||
| @@ -827,7 +827,7 @@ void __init setup_arch(char **cmdline_p) | |||
| 827 | printk(KERN_ERR "Warning: Compiled for Rev %d, but running on Rev %d\n", | 827 | printk(KERN_ERR "Warning: Compiled for Rev %d, but running on Rev %d\n", |
| 828 | bfin_compiled_revid(), bfin_revid()); | 828 | bfin_compiled_revid(), bfin_revid()); |
| 829 | } | 829 | } |
| 830 | if (bfin_revid() <= CONFIG_BF_REV_MIN || bfin_revid() > CONFIG_BF_REV_MAX) | 830 | if (bfin_revid() < CONFIG_BF_REV_MIN || bfin_revid() > CONFIG_BF_REV_MAX) |
| 831 | printk(KERN_ERR "Warning: Unsupported Chip Revision ADSP-%s Rev 0.%d detected\n", | 831 | printk(KERN_ERR "Warning: Unsupported Chip Revision ADSP-%s Rev 0.%d detected\n", |
| 832 | CPU, bfin_revid()); | 832 | CPU, bfin_revid()); |
| 833 | } | 833 | } |
diff --git a/arch/blackfin/kernel/traps.c b/arch/blackfin/kernel/traps.c index 1aa2c788e228..bef025b07443 100644 --- a/arch/blackfin/kernel/traps.c +++ b/arch/blackfin/kernel/traps.c | |||
| @@ -59,7 +59,7 @@ | |||
| 59 | #endif | 59 | #endif |
| 60 | 60 | ||
| 61 | 61 | ||
| 62 | #ifdef CONFIG_VERBOSE_DEBUG | 62 | #ifdef CONFIG_DEBUG_VERBOSE |
| 63 | #define verbose_printk(fmt, arg...) \ | 63 | #define verbose_printk(fmt, arg...) \ |
| 64 | printk(fmt, ##arg) | 64 | printk(fmt, ##arg) |
| 65 | #else | 65 | #else |
| @@ -147,9 +147,12 @@ static void decode_address(char *buf, unsigned long address) | |||
| 147 | char *name = p->comm; | 147 | char *name = p->comm; |
| 148 | struct file *file = vma->vm_file; | 148 | struct file *file = vma->vm_file; |
| 149 | 149 | ||
| 150 | if (file) | 150 | if (file) { |
| 151 | name = d_path(&file->f_path, _tmpbuf, | 151 | char *d_name = d_path(&file->f_path, _tmpbuf, |
| 152 | sizeof(_tmpbuf)); | 152 | sizeof(_tmpbuf)); |
| 153 | if (!IS_ERR(d_name)) | ||
| 154 | name = d_name; | ||
| 155 | } | ||
| 153 | 156 | ||
| 154 | /* FLAT does not have its text aligned to the start of | 157 | /* FLAT does not have its text aligned to the start of |
| 155 | * the map while FDPIC ELF does ... | 158 | * the map while FDPIC ELF does ... |
| @@ -571,7 +574,7 @@ asmlinkage void trap_c(struct pt_regs *fp) | |||
| 571 | #endif | 574 | #endif |
| 572 | panic("Kernel exception"); | 575 | panic("Kernel exception"); |
| 573 | } else { | 576 | } else { |
| 574 | #ifdef CONFIG_VERBOSE_DEBUG | 577 | #ifdef CONFIG_DEBUG_VERBOSE |
| 575 | unsigned long *stack; | 578 | unsigned long *stack; |
| 576 | /* Dump the user space stack */ | 579 | /* Dump the user space stack */ |
| 577 | stack = (unsigned long *)rdusp(); | 580 | stack = (unsigned long *)rdusp(); |
diff --git a/arch/blackfin/mach-common/cache.S b/arch/blackfin/mach-common/cache.S index db532181fbde..a028e9450419 100644 --- a/arch/blackfin/mach-common/cache.S +++ b/arch/blackfin/mach-common/cache.S | |||
| @@ -25,9 +25,13 @@ | |||
| 25 | */ | 25 | */ |
| 26 | .macro do_flush flushins:req optflushins optnopins label | 26 | .macro do_flush flushins:req optflushins optnopins label |
| 27 | 27 | ||
| 28 | R2 = -L1_CACHE_BYTES; | ||
| 29 | |||
| 30 | /* start = (start & -L1_CACHE_BYTES) */ | ||
| 31 | R0 = R0 & R2; | ||
| 32 | |||
| 28 | /* end = ((end - 1) & -L1_CACHE_BYTES) + L1_CACHE_BYTES; */ | 33 | /* end = ((end - 1) & -L1_CACHE_BYTES) + L1_CACHE_BYTES; */ |
| 29 | R1 += -1; | 34 | R1 += -1; |
| 30 | R2 = -L1_CACHE_BYTES; | ||
| 31 | R1 = R1 & R2; | 35 | R1 = R1 & R2; |
| 32 | R1 += L1_CACHE_BYTES; | 36 | R1 += L1_CACHE_BYTES; |
| 33 | 37 | ||
| @@ -63,7 +67,7 @@ ENDPROC(_blackfin_icache_flush_range) | |||
| 63 | 67 | ||
| 64 | /* Flush all cache lines assocoiated with this area of memory. */ | 68 | /* Flush all cache lines assocoiated with this area of memory. */ |
| 65 | ENTRY(_blackfin_icache_dcache_flush_range) | 69 | ENTRY(_blackfin_icache_dcache_flush_range) |
| 66 | do_flush IFLUSH, FLUSH | 70 | do_flush FLUSH, IFLUSH |
| 67 | ENDPROC(_blackfin_icache_dcache_flush_range) | 71 | ENDPROC(_blackfin_icache_dcache_flush_range) |
| 68 | 72 | ||
| 69 | /* Throw away all D-cached data in specified region without any obligation to | 73 | /* Throw away all D-cached data in specified region without any obligation to |
diff --git a/arch/blackfin/mach-common/cpufreq.c b/arch/blackfin/mach-common/cpufreq.c index c22c47b60127..dda5443b37ed 100644 --- a/arch/blackfin/mach-common/cpufreq.c +++ b/arch/blackfin/mach-common/cpufreq.c | |||
| @@ -72,13 +72,13 @@ unsigned int __bfin_cycles_mod; | |||
| 72 | 72 | ||
| 73 | /**************************************************************************/ | 73 | /**************************************************************************/ |
| 74 | 74 | ||
| 75 | static unsigned int bfin_getfreq(unsigned int cpu) | 75 | static unsigned int bfin_getfreq_khz(unsigned int cpu) |
| 76 | { | 76 | { |
| 77 | /* The driver only support single cpu */ | 77 | /* The driver only support single cpu */ |
| 78 | if (cpu != 0) | 78 | if (cpu != 0) |
| 79 | return -1; | 79 | return -1; |
| 80 | 80 | ||
| 81 | return get_cclk(); | 81 | return get_cclk() / 1000; |
| 82 | } | 82 | } |
| 83 | 83 | ||
| 84 | 84 | ||
| @@ -96,7 +96,7 @@ static int bfin_target(struct cpufreq_policy *policy, | |||
| 96 | 96 | ||
| 97 | cclk_hz = bfin_freq_table[index].frequency; | 97 | cclk_hz = bfin_freq_table[index].frequency; |
| 98 | 98 | ||
| 99 | freqs.old = bfin_getfreq(0); | 99 | freqs.old = bfin_getfreq_khz(0); |
| 100 | freqs.new = cclk_hz; | 100 | freqs.new = cclk_hz; |
| 101 | freqs.cpu = 0; | 101 | freqs.cpu = 0; |
| 102 | 102 | ||
| @@ -137,8 +137,8 @@ static int __init __bfin_cpu_init(struct cpufreq_policy *policy) | |||
| 137 | if (policy->cpu != 0) | 137 | if (policy->cpu != 0) |
| 138 | return -EINVAL; | 138 | return -EINVAL; |
| 139 | 139 | ||
| 140 | cclk = get_cclk(); | 140 | cclk = get_cclk() / 1000; |
| 141 | sclk = get_sclk(); | 141 | sclk = get_sclk() / 1000; |
| 142 | 142 | ||
| 143 | #if ANOMALY_05000273 || (!defined(CONFIG_BF54x) && defined(CONFIG_BFIN_DCACHE)) | 143 | #if ANOMALY_05000273 || (!defined(CONFIG_BF54x) && defined(CONFIG_BFIN_DCACHE)) |
| 144 | min_cclk = sclk * 2; | 144 | min_cclk = sclk * 2; |
| @@ -152,7 +152,7 @@ static int __init __bfin_cpu_init(struct cpufreq_policy *policy) | |||
| 152 | dpm_state_table[index].csel = csel << 4; /* Shift now into PLL_DIV bitpos */ | 152 | dpm_state_table[index].csel = csel << 4; /* Shift now into PLL_DIV bitpos */ |
| 153 | dpm_state_table[index].tscale = (TIME_SCALE / (1 << csel)) - 1; | 153 | dpm_state_table[index].tscale = (TIME_SCALE / (1 << csel)) - 1; |
| 154 | 154 | ||
| 155 | pr_debug("cpufreq: freq:%d csel:%d tscale:%d\n", | 155 | pr_debug("cpufreq: freq:%d csel:0x%x tscale:%d\n", |
| 156 | bfin_freq_table[index].frequency, | 156 | bfin_freq_table[index].frequency, |
| 157 | dpm_state_table[index].csel, | 157 | dpm_state_table[index].csel, |
| 158 | dpm_state_table[index].tscale); | 158 | dpm_state_table[index].tscale); |
| @@ -173,7 +173,7 @@ static struct freq_attr *bfin_freq_attr[] = { | |||
| 173 | static struct cpufreq_driver bfin_driver = { | 173 | static struct cpufreq_driver bfin_driver = { |
| 174 | .verify = bfin_verify_speed, | 174 | .verify = bfin_verify_speed, |
| 175 | .target = bfin_target, | 175 | .target = bfin_target, |
| 176 | .get = bfin_getfreq, | 176 | .get = bfin_getfreq_khz, |
| 177 | .init = __bfin_cpu_init, | 177 | .init = __bfin_cpu_init, |
| 178 | .name = "bfin cpufreq", | 178 | .name = "bfin cpufreq", |
| 179 | .owner = THIS_MODULE, | 179 | .owner = THIS_MODULE, |
diff --git a/arch/blackfin/mach-common/entry.S b/arch/blackfin/mach-common/entry.S index c13fa8da28c7..bde6dc4e2614 100644 --- a/arch/blackfin/mach-common/entry.S +++ b/arch/blackfin/mach-common/entry.S | |||
| @@ -277,7 +277,7 @@ ENTRY(_bfin_return_from_exception) | |||
| 277 | p5.h = hi(ILAT); | 277 | p5.h = hi(ILAT); |
| 278 | r6 = [p5]; | 278 | r6 = [p5]; |
| 279 | r7 = 0x20; /* Did I just cause anther HW error? */ | 279 | r7 = 0x20; /* Did I just cause anther HW error? */ |
| 280 | r7 = r7 & r1; | 280 | r6 = r7 & r6; |
| 281 | CC = R7 == R6; | 281 | CC = R7 == R6; |
| 282 | if CC JUMP _double_fault; | 282 | if CC JUMP _double_fault; |
| 283 | #endif | 283 | #endif |
diff --git a/arch/blackfin/mm/sram-alloc.c b/arch/blackfin/mm/sram-alloc.c index 0f1ca6930c16..cc6f336e7313 100644 --- a/arch/blackfin/mm/sram-alloc.c +++ b/arch/blackfin/mm/sram-alloc.c | |||
| @@ -183,10 +183,10 @@ static void __init l2_sram_init(void) | |||
| 183 | return; | 183 | return; |
| 184 | } | 184 | } |
| 185 | 185 | ||
| 186 | free_l2_sram_head.next->paddr = (void *)L2_START + | 186 | free_l2_sram_head.next->paddr = |
| 187 | (_etext_l2 - _stext_l2) + (_edata_l2 - _sdata_l2); | 187 | (void *)L2_START + (_ebss_l2 - _stext_l2); |
| 188 | free_l2_sram_head.next->size = L2_LENGTH - | 188 | free_l2_sram_head.next->size = |
| 189 | (_etext_l2 - _stext_l2) + (_edata_l2 - _sdata_l2); | 189 | L2_LENGTH - (_ebss_l2 - _stext_l2); |
| 190 | free_l2_sram_head.next->pid = 0; | 190 | free_l2_sram_head.next->pid = 0; |
| 191 | free_l2_sram_head.next->next = NULL; | 191 | free_l2_sram_head.next->next = NULL; |
| 192 | 192 | ||
diff --git a/arch/ia64/include/asm/intrinsics.h b/arch/ia64/include/asm/intrinsics.h index 47d686dba1eb..a3e44a5ed497 100644 --- a/arch/ia64/include/asm/intrinsics.h +++ b/arch/ia64/include/asm/intrinsics.h | |||
| @@ -226,7 +226,7 @@ extern long ia64_cmpxchg_called_with_bad_pointer (void); | |||
| 226 | /************************************************/ | 226 | /************************************************/ |
| 227 | #define ia64_ssm IA64_INTRINSIC_MACRO(ssm) | 227 | #define ia64_ssm IA64_INTRINSIC_MACRO(ssm) |
| 228 | #define ia64_rsm IA64_INTRINSIC_MACRO(rsm) | 228 | #define ia64_rsm IA64_INTRINSIC_MACRO(rsm) |
| 229 | #define ia64_getreg IA64_INTRINSIC_API(getreg) | 229 | #define ia64_getreg IA64_INTRINSIC_MACRO(getreg) |
| 230 | #define ia64_setreg IA64_INTRINSIC_API(setreg) | 230 | #define ia64_setreg IA64_INTRINSIC_API(setreg) |
| 231 | #define ia64_set_rr IA64_INTRINSIC_API(set_rr) | 231 | #define ia64_set_rr IA64_INTRINSIC_API(set_rr) |
| 232 | #define ia64_get_rr IA64_INTRINSIC_API(get_rr) | 232 | #define ia64_get_rr IA64_INTRINSIC_API(get_rr) |
diff --git a/arch/ia64/include/asm/paravirt_privop.h b/arch/ia64/include/asm/paravirt_privop.h index d577aac11835..0b597424fcfc 100644 --- a/arch/ia64/include/asm/paravirt_privop.h +++ b/arch/ia64/include/asm/paravirt_privop.h | |||
| @@ -78,6 +78,19 @@ extern unsigned long ia64_native_getreg_func(int regnum); | |||
| 78 | ia64_native_rsm(mask); \ | 78 | ia64_native_rsm(mask); \ |
| 79 | } while (0) | 79 | } while (0) |
| 80 | 80 | ||
| 81 | /* returned ip value should be the one in the caller, | ||
| 82 | * not in __paravirt_getreg() */ | ||
| 83 | #define paravirt_getreg(reg) \ | ||
| 84 | ({ \ | ||
| 85 | unsigned long res; \ | ||
| 86 | BUILD_BUG_ON(!__builtin_constant_p(reg)); \ | ||
| 87 | if ((reg) == _IA64_REG_IP) \ | ||
| 88 | res = ia64_native_getreg(_IA64_REG_IP); \ | ||
| 89 | else \ | ||
| 90 | res = pv_cpu_ops.getreg(reg); \ | ||
| 91 | res; \ | ||
| 92 | }) | ||
| 93 | |||
| 81 | /****************************************************************************** | 94 | /****************************************************************************** |
| 82 | * replacement of hand written assembly codes. | 95 | * replacement of hand written assembly codes. |
| 83 | */ | 96 | */ |
diff --git a/arch/ia64/kernel/entry.S b/arch/ia64/kernel/entry.S index 7ef0c594f5ed..d435f4a7a96c 100644 --- a/arch/ia64/kernel/entry.S +++ b/arch/ia64/kernel/entry.S | |||
| @@ -499,6 +499,7 @@ GLOBAL_ENTRY(prefetch_stack) | |||
| 499 | END(prefetch_stack) | 499 | END(prefetch_stack) |
| 500 | 500 | ||
| 501 | GLOBAL_ENTRY(kernel_execve) | 501 | GLOBAL_ENTRY(kernel_execve) |
| 502 | rum psr.ac | ||
| 502 | mov r15=__NR_execve // put syscall number in place | 503 | mov r15=__NR_execve // put syscall number in place |
| 503 | break __BREAK_SYSCALL | 504 | break __BREAK_SYSCALL |
| 504 | br.ret.sptk.many rp | 505 | br.ret.sptk.many rp |
diff --git a/arch/ia64/kernel/head.S b/arch/ia64/kernel/head.S index 66e491d8baac..59301c472800 100644 --- a/arch/ia64/kernel/head.S +++ b/arch/ia64/kernel/head.S | |||
| @@ -260,7 +260,7 @@ start_ap: | |||
| 260 | * Switch into virtual mode: | 260 | * Switch into virtual mode: |
| 261 | */ | 261 | */ |
| 262 | movl r16=(IA64_PSR_IT|IA64_PSR_IC|IA64_PSR_DT|IA64_PSR_RT|IA64_PSR_DFH|IA64_PSR_BN \ | 262 | movl r16=(IA64_PSR_IT|IA64_PSR_IC|IA64_PSR_DT|IA64_PSR_RT|IA64_PSR_DFH|IA64_PSR_BN \ |
| 263 | |IA64_PSR_DI) | 263 | |IA64_PSR_DI|IA64_PSR_AC) |
| 264 | ;; | 264 | ;; |
| 265 | mov cr.ipsr=r16 | 265 | mov cr.ipsr=r16 |
| 266 | movl r17=1f | 266 | movl r17=1f |
diff --git a/arch/ia64/kernel/mca.c b/arch/ia64/kernel/mca.c index 7dd96c127177..bab1de2d2f6a 100644 --- a/arch/ia64/kernel/mca.c +++ b/arch/ia64/kernel/mca.c | |||
| @@ -1139,7 +1139,7 @@ ia64_mca_modify_original_stack(struct pt_regs *regs, | |||
| 1139 | return previous_current; | 1139 | return previous_current; |
| 1140 | 1140 | ||
| 1141 | no_mod: | 1141 | no_mod: |
| 1142 | printk(KERN_INFO "cpu %d, %s %s, original stack not modified\n", | 1142 | mprintk(KERN_INFO "cpu %d, %s %s, original stack not modified\n", |
| 1143 | smp_processor_id(), type, msg); | 1143 | smp_processor_id(), type, msg); |
| 1144 | return previous_current; | 1144 | return previous_current; |
| 1145 | } | 1145 | } |
diff --git a/arch/ia64/kernel/paravirt.c b/arch/ia64/kernel/paravirt.c index de35d8e8b7d2..9f14c16f6369 100644 --- a/arch/ia64/kernel/paravirt.c +++ b/arch/ia64/kernel/paravirt.c | |||
| @@ -130,7 +130,7 @@ ia64_native_getreg_func(int regnum) | |||
| 130 | unsigned long res = -1; | 130 | unsigned long res = -1; |
| 131 | switch (regnum) { | 131 | switch (regnum) { |
| 132 | CASE_GET_REG(GP); | 132 | CASE_GET_REG(GP); |
| 133 | CASE_GET_REG(IP); | 133 | /*CASE_GET_REG(IP);*/ /* returned ip value shouldn't be constant */ |
| 134 | CASE_GET_REG(PSR); | 134 | CASE_GET_REG(PSR); |
| 135 | CASE_GET_REG(TP); | 135 | CASE_GET_REG(TP); |
| 136 | CASE_GET_REG(SP); | 136 | CASE_GET_REG(SP); |
diff --git a/arch/ia64/kernel/pci-dma.c b/arch/ia64/kernel/pci-dma.c index dbdb778efa05..2a92f637431d 100644 --- a/arch/ia64/kernel/pci-dma.c +++ b/arch/ia64/kernel/pci-dma.c | |||
| @@ -19,7 +19,6 @@ | |||
| 19 | #include <linux/kernel.h> | 19 | #include <linux/kernel.h> |
| 20 | 20 | ||
| 21 | #include <asm/page.h> | 21 | #include <asm/page.h> |
| 22 | #include <asm/iommu.h> | ||
| 23 | 22 | ||
| 24 | dma_addr_t bad_dma_address __read_mostly; | 23 | dma_addr_t bad_dma_address __read_mostly; |
| 25 | EXPORT_SYMBOL(bad_dma_address); | 24 | EXPORT_SYMBOL(bad_dma_address); |
diff --git a/arch/ia64/xen/hypercall.S b/arch/ia64/xen/hypercall.S index d4ff0b9e79f1..45e02bb64a92 100644 --- a/arch/ia64/xen/hypercall.S +++ b/arch/ia64/xen/hypercall.S | |||
| @@ -58,7 +58,7 @@ __HCALL2(xen_set_rr, HYPERPRIVOP_SET_RR) | |||
| 58 | __HCALL2(xen_set_kr, HYPERPRIVOP_SET_KR) | 58 | __HCALL2(xen_set_kr, HYPERPRIVOP_SET_KR) |
| 59 | 59 | ||
| 60 | #ifdef CONFIG_IA32_SUPPORT | 60 | #ifdef CONFIG_IA32_SUPPORT |
| 61 | __HCALL1(xen_get_eflag, HYPERPRIVOP_GET_EFLAG) | 61 | __HCALL0(xen_get_eflag, HYPERPRIVOP_GET_EFLAG) |
| 62 | __HCALL1(xen_set_eflag, HYPERPRIVOP_SET_EFLAG) // refer SDM vol1 3.1.8 | 62 | __HCALL1(xen_set_eflag, HYPERPRIVOP_SET_EFLAG) // refer SDM vol1 3.1.8 |
| 63 | #endif /* CONFIG_IA32_SUPPORT */ | 63 | #endif /* CONFIG_IA32_SUPPORT */ |
| 64 | 64 | ||
diff --git a/arch/mips/include/asm/mach-rc32434/gpio.h b/arch/mips/include/asm/mach-rc32434/gpio.h index c8e554eafce3..b5cf6457305a 100644 --- a/arch/mips/include/asm/mach-rc32434/gpio.h +++ b/arch/mips/include/asm/mach-rc32434/gpio.h | |||
| @@ -84,5 +84,7 @@ extern void set_434_reg(unsigned reg_offs, unsigned bit, unsigned len, unsigned | |||
| 84 | extern unsigned get_434_reg(unsigned reg_offs); | 84 | extern unsigned get_434_reg(unsigned reg_offs); |
| 85 | extern void set_latch_u5(unsigned char or_mask, unsigned char nand_mask); | 85 | extern void set_latch_u5(unsigned char or_mask, unsigned char nand_mask); |
| 86 | extern unsigned char get_latch_u5(void); | 86 | extern unsigned char get_latch_u5(void); |
| 87 | extern void rb532_gpio_set_ilevel(int bit, unsigned gpio); | ||
| 88 | extern void rb532_gpio_set_istat(int bit, unsigned gpio); | ||
| 87 | 89 | ||
| 88 | #endif /* _RC32434_GPIO_H_ */ | 90 | #endif /* _RC32434_GPIO_H_ */ |
diff --git a/arch/mips/include/asm/mach-rc32434/rb.h b/arch/mips/include/asm/mach-rc32434/rb.h index 79e8ef67d0d3..f25a84916703 100644 --- a/arch/mips/include/asm/mach-rc32434/rb.h +++ b/arch/mips/include/asm/mach-rc32434/rb.h | |||
| @@ -40,12 +40,14 @@ | |||
| 40 | #define BTCS 0x010040 | 40 | #define BTCS 0x010040 |
| 41 | #define BTCOMPARE 0x010044 | 41 | #define BTCOMPARE 0x010044 |
| 42 | #define GPIOBASE 0x050000 | 42 | #define GPIOBASE 0x050000 |
| 43 | #define GPIOCFG 0x050004 | 43 | /* Offsets relative to GPIOBASE */ |
| 44 | #define GPIOD 0x050008 | 44 | #define GPIOFUNC 0x00 |
| 45 | #define GPIOILEVEL 0x05000C | 45 | #define GPIOCFG 0x04 |
| 46 | #define GPIOISTAT 0x050010 | 46 | #define GPIOD 0x08 |
| 47 | #define GPIONMIEN 0x050014 | 47 | #define GPIOILEVEL 0x0C |
| 48 | #define IMASK6 0x038038 | 48 | #define GPIOISTAT 0x10 |
| 49 | #define GPIONMIEN 0x14 | ||
| 50 | #define IMASK6 0x38 | ||
| 49 | #define LO_WPX (1 << 0) | 51 | #define LO_WPX (1 << 0) |
| 50 | #define LO_ALE (1 << 1) | 52 | #define LO_ALE (1 << 1) |
| 51 | #define LO_CLE (1 << 2) | 53 | #define LO_CLE (1 << 2) |
diff --git a/arch/mips/include/asm/time.h b/arch/mips/include/asm/time.h index d3bd5c5aa2ec..9601ea950542 100644 --- a/arch/mips/include/asm/time.h +++ b/arch/mips/include/asm/time.h | |||
| @@ -63,7 +63,7 @@ static inline int mips_clockevent_init(void) | |||
| 63 | /* | 63 | /* |
| 64 | * Initialize the count register as a clocksource | 64 | * Initialize the count register as a clocksource |
| 65 | */ | 65 | */ |
| 66 | #ifdef CONFIG_CEVT_R4K | 66 | #ifdef CONFIG_CSRC_R4K |
| 67 | extern int init_mips_clocksource(void); | 67 | extern int init_mips_clocksource(void); |
| 68 | #else | 68 | #else |
| 69 | static inline int init_mips_clocksource(void) | 69 | static inline int init_mips_clocksource(void) |
diff --git a/arch/mips/kernel/csrc-r4k.c b/arch/mips/kernel/csrc-r4k.c index 86e026f067bc..74fb74583b4e 100644 --- a/arch/mips/kernel/csrc-r4k.c +++ b/arch/mips/kernel/csrc-r4k.c | |||
| @@ -27,7 +27,7 @@ int __init init_mips_clocksource(void) | |||
| 27 | if (!cpu_has_counter || !mips_hpt_frequency) | 27 | if (!cpu_has_counter || !mips_hpt_frequency) |
| 28 | return -ENXIO; | 28 | return -ENXIO; |
| 29 | 29 | ||
| 30 | /* Calclate a somewhat reasonable rating value */ | 30 | /* Calculate a somewhat reasonable rating value */ |
| 31 | clocksource_mips.rating = 200 + mips_hpt_frequency / 10000000; | 31 | clocksource_mips.rating = 200 + mips_hpt_frequency / 10000000; |
| 32 | 32 | ||
| 33 | clocksource_set_clock(&clocksource_mips, mips_hpt_frequency); | 33 | clocksource_set_clock(&clocksource_mips, mips_hpt_frequency); |
diff --git a/arch/mips/mm/sc-ip22.c b/arch/mips/mm/sc-ip22.c index 1f602a110e10..13adb5782110 100644 --- a/arch/mips/mm/sc-ip22.c +++ b/arch/mips/mm/sc-ip22.c | |||
| @@ -161,7 +161,7 @@ static inline int __init indy_sc_probe(void) | |||
| 161 | 161 | ||
| 162 | /* XXX Check with wje if the Indy caches can differenciate between | 162 | /* XXX Check with wje if the Indy caches can differenciate between |
| 163 | writeback + invalidate and just invalidate. */ | 163 | writeback + invalidate and just invalidate. */ |
| 164 | struct bcache_ops indy_sc_ops = { | 164 | static struct bcache_ops indy_sc_ops = { |
| 165 | .bc_enable = indy_sc_enable, | 165 | .bc_enable = indy_sc_enable, |
| 166 | .bc_disable = indy_sc_disable, | 166 | .bc_disable = indy_sc_disable, |
| 167 | .bc_wback_inv = indy_sc_wback_invalidate, | 167 | .bc_wback_inv = indy_sc_wback_invalidate, |
diff --git a/arch/mips/mti-malta/malta-amon.c b/arch/mips/mti-malta/malta-amon.c index 96236bf33838..df9e526312a2 100644 --- a/arch/mips/mti-malta/malta-amon.c +++ b/arch/mips/mti-malta/malta-amon.c | |||
| @@ -22,9 +22,9 @@ | |||
| 22 | #include <linux/init.h> | 22 | #include <linux/init.h> |
| 23 | #include <linux/smp.h> | 23 | #include <linux/smp.h> |
| 24 | 24 | ||
| 25 | #include <asm-mips/addrspace.h> | 25 | #include <asm/addrspace.h> |
| 26 | #include <asm-mips/mips-boards/launch.h> | 26 | #include <asm/mips-boards/launch.h> |
| 27 | #include <asm-mips/mipsmtregs.h> | 27 | #include <asm/mipsmtregs.h> |
| 28 | 28 | ||
| 29 | int amon_cpu_avail(int cpu) | 29 | int amon_cpu_avail(int cpu) |
| 30 | { | 30 | { |
diff --git a/arch/mips/rb532/devices.c b/arch/mips/rb532/devices.c index 2f22d714d5b0..c1c29181bd46 100644 --- a/arch/mips/rb532/devices.c +++ b/arch/mips/rb532/devices.c | |||
| @@ -118,7 +118,7 @@ static struct platform_device cf_slot0 = { | |||
| 118 | /* Resources and device for NAND */ | 118 | /* Resources and device for NAND */ |
| 119 | static int rb532_dev_ready(struct mtd_info *mtd) | 119 | static int rb532_dev_ready(struct mtd_info *mtd) |
| 120 | { | 120 | { |
| 121 | return readl(IDT434_REG_BASE + GPIOD) & GPIO_RDY; | 121 | return gpio_get_value(GPIO_RDY); |
| 122 | } | 122 | } |
| 123 | 123 | ||
| 124 | static void rb532_cmd_ctrl(struct mtd_info *mtd, int cmd, unsigned int ctrl) | 124 | static void rb532_cmd_ctrl(struct mtd_info *mtd, int cmd, unsigned int ctrl) |
diff --git a/arch/mips/rb532/gpio.c b/arch/mips/rb532/gpio.c index 70c4a6726377..0e84c8ab6a39 100644 --- a/arch/mips/rb532/gpio.c +++ b/arch/mips/rb532/gpio.c | |||
| @@ -39,10 +39,6 @@ | |||
| 39 | struct rb532_gpio_chip { | 39 | struct rb532_gpio_chip { |
| 40 | struct gpio_chip chip; | 40 | struct gpio_chip chip; |
| 41 | void __iomem *regbase; | 41 | void __iomem *regbase; |
| 42 | void (*set_int_level)(struct gpio_chip *chip, unsigned offset, int value); | ||
| 43 | int (*get_int_level)(struct gpio_chip *chip, unsigned offset); | ||
| 44 | void (*set_int_status)(struct gpio_chip *chip, unsigned offset, int value); | ||
| 45 | int (*get_int_status)(struct gpio_chip *chip, unsigned offset); | ||
| 46 | }; | 42 | }; |
| 47 | 43 | ||
| 48 | struct mpmc_device dev3; | 44 | struct mpmc_device dev3; |
| @@ -111,15 +107,47 @@ unsigned char get_latch_u5(void) | |||
| 111 | } | 107 | } |
| 112 | EXPORT_SYMBOL(get_latch_u5); | 108 | EXPORT_SYMBOL(get_latch_u5); |
| 113 | 109 | ||
| 110 | /* rb532_set_bit - sanely set a bit | ||
| 111 | * | ||
| 112 | * bitval: new value for the bit | ||
| 113 | * offset: bit index in the 4 byte address range | ||
| 114 | * ioaddr: 4 byte aligned address being altered | ||
| 115 | */ | ||
| 116 | static inline void rb532_set_bit(unsigned bitval, | ||
| 117 | unsigned offset, void __iomem *ioaddr) | ||
| 118 | { | ||
| 119 | unsigned long flags; | ||
| 120 | u32 val; | ||
| 121 | |||
| 122 | bitval = !!bitval; /* map parameter to {0,1} */ | ||
| 123 | |||
| 124 | local_irq_save(flags); | ||
| 125 | |||
| 126 | val = readl(ioaddr); | ||
| 127 | val &= ~( ~bitval << offset ); /* unset bit if bitval == 0 */ | ||
| 128 | val |= ( bitval << offset ); /* set bit if bitval == 1 */ | ||
| 129 | writel(val, ioaddr); | ||
| 130 | |||
| 131 | local_irq_restore(flags); | ||
| 132 | } | ||
| 133 | |||
| 134 | /* rb532_get_bit - read a bit | ||
| 135 | * | ||
| 136 | * returns the boolean state of the bit, which may be > 1 | ||
| 137 | */ | ||
| 138 | static inline int rb532_get_bit(unsigned offset, void __iomem *ioaddr) | ||
| 139 | { | ||
| 140 | return (readl(ioaddr) & (1 << offset)); | ||
| 141 | } | ||
| 142 | |||
| 114 | /* | 143 | /* |
| 115 | * Return GPIO level */ | 144 | * Return GPIO level */ |
| 116 | static int rb532_gpio_get(struct gpio_chip *chip, unsigned offset) | 145 | static int rb532_gpio_get(struct gpio_chip *chip, unsigned offset) |
| 117 | { | 146 | { |
| 118 | u32 mask = 1 << offset; | ||
| 119 | struct rb532_gpio_chip *gpch; | 147 | struct rb532_gpio_chip *gpch; |
| 120 | 148 | ||
| 121 | gpch = container_of(chip, struct rb532_gpio_chip, chip); | 149 | gpch = container_of(chip, struct rb532_gpio_chip, chip); |
| 122 | return readl(gpch->regbase + GPIOD) & mask; | 150 | return rb532_get_bit(offset, gpch->regbase + GPIOD); |
| 123 | } | 151 | } |
| 124 | 152 | ||
| 125 | /* | 153 | /* |
| @@ -128,23 +156,10 @@ static int rb532_gpio_get(struct gpio_chip *chip, unsigned offset) | |||
| 128 | static void rb532_gpio_set(struct gpio_chip *chip, | 156 | static void rb532_gpio_set(struct gpio_chip *chip, |
| 129 | unsigned offset, int value) | 157 | unsigned offset, int value) |
| 130 | { | 158 | { |
| 131 | unsigned long flags; | ||
| 132 | u32 mask = 1 << offset; | ||
| 133 | u32 tmp; | ||
| 134 | struct rb532_gpio_chip *gpch; | 159 | struct rb532_gpio_chip *gpch; |
| 135 | void __iomem *gpvr; | ||
| 136 | 160 | ||
| 137 | gpch = container_of(chip, struct rb532_gpio_chip, chip); | 161 | gpch = container_of(chip, struct rb532_gpio_chip, chip); |
| 138 | gpvr = gpch->regbase + GPIOD; | 162 | rb532_set_bit(value, offset, gpch->regbase + GPIOD); |
| 139 | |||
| 140 | local_irq_save(flags); | ||
| 141 | tmp = readl(gpvr); | ||
| 142 | if (value) | ||
| 143 | tmp |= mask; | ||
| 144 | else | ||
| 145 | tmp &= ~mask; | ||
| 146 | writel(tmp, gpvr); | ||
| 147 | local_irq_restore(flags); | ||
| 148 | } | 163 | } |
| 149 | 164 | ||
| 150 | /* | 165 | /* |
| @@ -152,21 +167,14 @@ static void rb532_gpio_set(struct gpio_chip *chip, | |||
| 152 | */ | 167 | */ |
| 153 | static int rb532_gpio_direction_input(struct gpio_chip *chip, unsigned offset) | 168 | static int rb532_gpio_direction_input(struct gpio_chip *chip, unsigned offset) |
| 154 | { | 169 | { |
| 155 | unsigned long flags; | ||
| 156 | u32 mask = 1 << offset; | ||
| 157 | u32 value; | ||
| 158 | struct rb532_gpio_chip *gpch; | 170 | struct rb532_gpio_chip *gpch; |
| 159 | void __iomem *gpdr; | ||
| 160 | 171 | ||
| 161 | gpch = container_of(chip, struct rb532_gpio_chip, chip); | 172 | gpch = container_of(chip, struct rb532_gpio_chip, chip); |
| 162 | gpdr = gpch->regbase + GPIOCFG; | ||
| 163 | 173 | ||
| 164 | local_irq_save(flags); | 174 | if (rb532_get_bit(offset, gpch->regbase + GPIOFUNC)) |
| 165 | value = readl(gpdr); | 175 | return 1; /* alternate function, GPIOCFG is ignored */ |
| 166 | value &= ~mask; | ||
| 167 | writel(value, gpdr); | ||
| 168 | local_irq_restore(flags); | ||
| 169 | 176 | ||
| 177 | rb532_set_bit(0, offset, gpch->regbase + GPIOCFG); | ||
| 170 | return 0; | 178 | return 0; |
| 171 | } | 179 | } |
| 172 | 180 | ||
| @@ -176,117 +184,60 @@ static int rb532_gpio_direction_input(struct gpio_chip *chip, unsigned offset) | |||
| 176 | static int rb532_gpio_direction_output(struct gpio_chip *chip, | 184 | static int rb532_gpio_direction_output(struct gpio_chip *chip, |
| 177 | unsigned offset, int value) | 185 | unsigned offset, int value) |
| 178 | { | 186 | { |
| 179 | unsigned long flags; | ||
| 180 | u32 mask = 1 << offset; | ||
| 181 | u32 tmp; | ||
| 182 | struct rb532_gpio_chip *gpch; | 187 | struct rb532_gpio_chip *gpch; |
| 183 | void __iomem *gpdr; | ||
| 184 | 188 | ||
| 185 | gpch = container_of(chip, struct rb532_gpio_chip, chip); | 189 | gpch = container_of(chip, struct rb532_gpio_chip, chip); |
| 186 | writel(mask, gpch->regbase + GPIOD); | ||
| 187 | gpdr = gpch->regbase + GPIOCFG; | ||
| 188 | 190 | ||
| 189 | local_irq_save(flags); | 191 | if (rb532_get_bit(offset, gpch->regbase + GPIOFUNC)) |
| 190 | tmp = readl(gpdr); | 192 | return 1; /* alternate function, GPIOCFG is ignored */ |
| 191 | tmp |= mask; | ||
| 192 | writel(tmp, gpdr); | ||
| 193 | local_irq_restore(flags); | ||
| 194 | 193 | ||
| 194 | /* set the initial output value */ | ||
| 195 | rb532_set_bit(value, offset, gpch->regbase + GPIOD); | ||
| 196 | |||
| 197 | rb532_set_bit(1, offset, gpch->regbase + GPIOCFG); | ||
| 195 | return 0; | 198 | return 0; |
| 196 | } | 199 | } |
| 197 | 200 | ||
| 198 | /* | 201 | static struct rb532_gpio_chip rb532_gpio_chip[] = { |
| 199 | * Set the GPIO interrupt level | 202 | [0] = { |
| 200 | */ | 203 | .chip = { |
| 201 | static void rb532_gpio_set_int_level(struct gpio_chip *chip, | 204 | .label = "gpio0", |
| 202 | unsigned offset, int value) | 205 | .direction_input = rb532_gpio_direction_input, |
| 203 | { | 206 | .direction_output = rb532_gpio_direction_output, |
| 204 | unsigned long flags; | 207 | .get = rb532_gpio_get, |
| 205 | u32 mask = 1 << offset; | 208 | .set = rb532_gpio_set, |
| 206 | u32 tmp; | 209 | .base = 0, |
| 207 | struct rb532_gpio_chip *gpch; | 210 | .ngpio = 32, |
| 208 | void __iomem *gpil; | 211 | }, |
| 209 | 212 | }, | |
| 210 | gpch = container_of(chip, struct rb532_gpio_chip, chip); | 213 | }; |
| 211 | gpil = gpch->regbase + GPIOILEVEL; | ||
| 212 | |||
| 213 | local_irq_save(flags); | ||
| 214 | tmp = readl(gpil); | ||
| 215 | if (value) | ||
| 216 | tmp |= mask; | ||
| 217 | else | ||
| 218 | tmp &= ~mask; | ||
| 219 | writel(tmp, gpil); | ||
| 220 | local_irq_restore(flags); | ||
| 221 | } | ||
| 222 | 214 | ||
| 223 | /* | 215 | /* |
| 224 | * Get the GPIO interrupt level | 216 | * Set GPIO interrupt level |
| 225 | */ | 217 | */ |
| 226 | static int rb532_gpio_get_int_level(struct gpio_chip *chip, unsigned offset) | 218 | void rb532_gpio_set_ilevel(int bit, unsigned gpio) |
| 227 | { | 219 | { |
| 228 | u32 mask = 1 << offset; | 220 | rb532_set_bit(bit, gpio, rb532_gpio_chip->regbase + GPIOILEVEL); |
| 229 | struct rb532_gpio_chip *gpch; | ||
| 230 | |||
| 231 | gpch = container_of(chip, struct rb532_gpio_chip, chip); | ||
| 232 | return readl(gpch->regbase + GPIOILEVEL) & mask; | ||
| 233 | } | 221 | } |
| 222 | EXPORT_SYMBOL(rb532_gpio_set_ilevel); | ||
| 234 | 223 | ||
| 235 | /* | 224 | /* |
| 236 | * Set the GPIO interrupt status | 225 | * Set GPIO interrupt status |
| 237 | */ | 226 | */ |
| 238 | static void rb532_gpio_set_int_status(struct gpio_chip *chip, | 227 | void rb532_gpio_set_istat(int bit, unsigned gpio) |
| 239 | unsigned offset, int value) | ||
| 240 | { | 228 | { |
| 241 | unsigned long flags; | 229 | rb532_set_bit(bit, gpio, rb532_gpio_chip->regbase + GPIOISTAT); |
| 242 | u32 mask = 1 << offset; | ||
| 243 | u32 tmp; | ||
| 244 | struct rb532_gpio_chip *gpch; | ||
| 245 | void __iomem *gpis; | ||
| 246 | |||
| 247 | gpch = container_of(chip, struct rb532_gpio_chip, chip); | ||
| 248 | gpis = gpch->regbase + GPIOISTAT; | ||
| 249 | |||
| 250 | local_irq_save(flags); | ||
| 251 | tmp = readl(gpis); | ||
| 252 | if (value) | ||
| 253 | tmp |= mask; | ||
| 254 | else | ||
| 255 | tmp &= ~mask; | ||
| 256 | writel(tmp, gpis); | ||
| 257 | local_irq_restore(flags); | ||
| 258 | } | 230 | } |
| 231 | EXPORT_SYMBOL(rb532_gpio_set_istat); | ||
| 259 | 232 | ||
| 260 | /* | 233 | /* |
| 261 | * Get the GPIO interrupt status | 234 | * Configure GPIO alternate function |
| 262 | */ | 235 | */ |
| 263 | static int rb532_gpio_get_int_status(struct gpio_chip *chip, unsigned offset) | 236 | static void rb532_gpio_set_func(int bit, unsigned gpio) |
| 264 | { | 237 | { |
| 265 | u32 mask = 1 << offset; | 238 | rb532_set_bit(bit, gpio, rb532_gpio_chip->regbase + GPIOFUNC); |
| 266 | struct rb532_gpio_chip *gpch; | ||
| 267 | |||
| 268 | gpch = container_of(chip, struct rb532_gpio_chip, chip); | ||
| 269 | return readl(gpch->regbase + GPIOISTAT) & mask; | ||
| 270 | } | 239 | } |
| 271 | 240 | ||
| 272 | static struct rb532_gpio_chip rb532_gpio_chip[] = { | ||
| 273 | [0] = { | ||
| 274 | .chip = { | ||
| 275 | .label = "gpio0", | ||
| 276 | .direction_input = rb532_gpio_direction_input, | ||
| 277 | .direction_output = rb532_gpio_direction_output, | ||
| 278 | .get = rb532_gpio_get, | ||
| 279 | .set = rb532_gpio_set, | ||
| 280 | .base = 0, | ||
| 281 | .ngpio = 32, | ||
| 282 | }, | ||
| 283 | .get_int_level = rb532_gpio_get_int_level, | ||
| 284 | .set_int_level = rb532_gpio_set_int_level, | ||
| 285 | .get_int_status = rb532_gpio_get_int_status, | ||
| 286 | .set_int_status = rb532_gpio_set_int_status, | ||
| 287 | }, | ||
| 288 | }; | ||
| 289 | |||
| 290 | int __init rb532_gpio_init(void) | 241 | int __init rb532_gpio_init(void) |
| 291 | { | 242 | { |
| 292 | struct resource *r; | 243 | struct resource *r; |
| @@ -310,9 +261,11 @@ int __init rb532_gpio_init(void) | |||
| 310 | return -ENXIO; | 261 | return -ENXIO; |
| 311 | } | 262 | } |
| 312 | 263 | ||
| 313 | /* Set the interrupt status and level for the CF pin */ | 264 | /* configure CF_GPIO_NUM as CFRDY IRQ source */ |
| 314 | rb532_gpio_set_int_level(&rb532_gpio_chip->chip, CF_GPIO_NUM, 1); | 265 | rb532_gpio_set_func(0, CF_GPIO_NUM); |
| 315 | rb532_gpio_set_int_status(&rb532_gpio_chip->chip, CF_GPIO_NUM, 0); | 266 | rb532_gpio_direction_input(&rb532_gpio_chip->chip, CF_GPIO_NUM); |
| 267 | rb532_gpio_set_ilevel(1, CF_GPIO_NUM); | ||
| 268 | rb532_gpio_set_istat(0, CF_GPIO_NUM); | ||
| 316 | 269 | ||
| 317 | return 0; | 270 | return 0; |
| 318 | } | 271 | } |
diff --git a/arch/parisc/kernel/ptrace.c b/arch/parisc/kernel/ptrace.c index 90904f9dfc50..927db3668b6f 100644 --- a/arch/parisc/kernel/ptrace.c +++ b/arch/parisc/kernel/ptrace.c | |||
| @@ -183,10 +183,10 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
| 183 | * being 64 bit in both cases. | 183 | * being 64 bit in both cases. |
| 184 | */ | 184 | */ |
| 185 | 185 | ||
| 186 | static long translate_usr_offset(long offset) | 186 | static compat_ulong_t translate_usr_offset(compat_ulong_t offset) |
| 187 | { | 187 | { |
| 188 | if (offset < 0) | 188 | if (offset < 0) |
| 189 | return -1; | 189 | return sizeof(struct pt_regs); |
| 190 | else if (offset <= 32*4) /* gr[0..31] */ | 190 | else if (offset <= 32*4) /* gr[0..31] */ |
| 191 | return offset * 2 + 4; | 191 | return offset * 2 + 4; |
| 192 | else if (offset <= 32*4+32*8) /* gr[0..31] + fr[0..31] */ | 192 | else if (offset <= 32*4+32*8) /* gr[0..31] + fr[0..31] */ |
| @@ -194,7 +194,7 @@ static long translate_usr_offset(long offset) | |||
| 194 | else if (offset < sizeof(struct pt_regs)/2 + 32*4) | 194 | else if (offset < sizeof(struct pt_regs)/2 + 32*4) |
| 195 | return offset * 2 + 4 - 32*8; | 195 | return offset * 2 + 4 - 32*8; |
| 196 | else | 196 | else |
| 197 | return -1; | 197 | return sizeof(struct pt_regs); |
| 198 | } | 198 | } |
| 199 | 199 | ||
| 200 | long compat_arch_ptrace(struct task_struct *child, compat_long_t request, | 200 | long compat_arch_ptrace(struct task_struct *child, compat_long_t request, |
| @@ -209,7 +209,7 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request, | |||
| 209 | if (addr & (sizeof(compat_uint_t)-1)) | 209 | if (addr & (sizeof(compat_uint_t)-1)) |
| 210 | break; | 210 | break; |
| 211 | addr = translate_usr_offset(addr); | 211 | addr = translate_usr_offset(addr); |
| 212 | if (addr < 0) | 212 | if (addr >= sizeof(struct pt_regs)) |
| 213 | break; | 213 | break; |
| 214 | 214 | ||
| 215 | tmp = *(compat_uint_t *) ((char *) task_regs(child) + addr); | 215 | tmp = *(compat_uint_t *) ((char *) task_regs(child) + addr); |
| @@ -236,7 +236,7 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request, | |||
| 236 | if (addr & (sizeof(compat_uint_t)-1)) | 236 | if (addr & (sizeof(compat_uint_t)-1)) |
| 237 | break; | 237 | break; |
| 238 | addr = translate_usr_offset(addr); | 238 | addr = translate_usr_offset(addr); |
| 239 | if (addr < 0) | 239 | if (addr >= sizeof(struct pt_regs)) |
| 240 | break; | 240 | break; |
| 241 | if (addr >= PT_FR0 && addr <= PT_FR31 + 4) { | 241 | if (addr >= PT_FR0 && addr <= PT_FR31 + 4) { |
| 242 | /* Special case, fp regs are 64 bits anyway */ | 242 | /* Special case, fp regs are 64 bits anyway */ |
diff --git a/arch/sparc/include/asm/unistd_32.h b/arch/sparc/include/asm/unistd_32.h index 648643a9f139..0d13d2a4c76f 100644 --- a/arch/sparc/include/asm/unistd_32.h +++ b/arch/sparc/include/asm/unistd_32.h | |||
| @@ -338,8 +338,9 @@ | |||
| 338 | #define __NR_dup3 320 | 338 | #define __NR_dup3 320 |
| 339 | #define __NR_pipe2 321 | 339 | #define __NR_pipe2 321 |
| 340 | #define __NR_inotify_init1 322 | 340 | #define __NR_inotify_init1 322 |
| 341 | #define __NR_accept4 323 | ||
| 341 | 342 | ||
| 342 | #define NR_SYSCALLS 323 | 343 | #define NR_SYSCALLS 324 |
| 343 | 344 | ||
| 344 | /* Sparc 32-bit only has the "setresuid32", "getresuid32" variants, | 345 | /* Sparc 32-bit only has the "setresuid32", "getresuid32" variants, |
| 345 | * it never had the plain ones and there is no value to adding those | 346 | * it never had the plain ones and there is no value to adding those |
diff --git a/arch/sparc/include/asm/unistd_64.h b/arch/sparc/include/asm/unistd_64.h index c5cc0e052321..fa5d3c0343c7 100644 --- a/arch/sparc/include/asm/unistd_64.h +++ b/arch/sparc/include/asm/unistd_64.h | |||
| @@ -340,8 +340,9 @@ | |||
| 340 | #define __NR_dup3 320 | 340 | #define __NR_dup3 320 |
| 341 | #define __NR_pipe2 321 | 341 | #define __NR_pipe2 321 |
| 342 | #define __NR_inotify_init1 322 | 342 | #define __NR_inotify_init1 322 |
| 343 | #define __NR_accept4 323 | ||
| 343 | 344 | ||
| 344 | #define NR_SYSCALLS 323 | 345 | #define NR_SYSCALLS 324 |
| 345 | 346 | ||
| 346 | #ifdef __KERNEL__ | 347 | #ifdef __KERNEL__ |
| 347 | #define __ARCH_WANT_IPC_PARSE_VERSION | 348 | #define __ARCH_WANT_IPC_PARSE_VERSION |
diff --git a/arch/sparc/kernel/systbls.S b/arch/sparc/kernel/systbls.S index e1b9233b90ab..7d0807586442 100644 --- a/arch/sparc/kernel/systbls.S +++ b/arch/sparc/kernel/systbls.S | |||
| @@ -81,4 +81,4 @@ sys_call_table: | |||
| 81 | /*305*/ .long sys_set_mempolicy, sys_kexec_load, sys_move_pages, sys_getcpu, sys_epoll_pwait | 81 | /*305*/ .long sys_set_mempolicy, sys_kexec_load, sys_move_pages, sys_getcpu, sys_epoll_pwait |
| 82 | /*310*/ .long sys_utimensat, sys_signalfd, sys_timerfd_create, sys_eventfd, sys_fallocate | 82 | /*310*/ .long sys_utimensat, sys_signalfd, sys_timerfd_create, sys_eventfd, sys_fallocate |
| 83 | /*315*/ .long sys_timerfd_settime, sys_timerfd_gettime, sys_signalfd4, sys_eventfd2, sys_epoll_create1 | 83 | /*315*/ .long sys_timerfd_settime, sys_timerfd_gettime, sys_signalfd4, sys_eventfd2, sys_epoll_create1 |
| 84 | /*320*/ .long sys_dup3, sys_pipe2, sys_inotify_init1 | 84 | /*320*/ .long sys_dup3, sys_pipe2, sys_inotify_init1, sys_accept4 |
diff --git a/arch/sparc64/kernel/sys32.S b/arch/sparc64/kernel/sys32.S index ade18ba0c686..f061c4dda9ef 100644 --- a/arch/sparc64/kernel/sys32.S +++ b/arch/sparc64/kernel/sys32.S | |||
| @@ -150,7 +150,7 @@ sys32_mmap2: | |||
| 150 | sys32_socketcall: /* %o0=call, %o1=args */ | 150 | sys32_socketcall: /* %o0=call, %o1=args */ |
| 151 | cmp %o0, 1 | 151 | cmp %o0, 1 |
| 152 | bl,pn %xcc, do_einval | 152 | bl,pn %xcc, do_einval |
| 153 | cmp %o0, 17 | 153 | cmp %o0, 18 |
| 154 | bg,pn %xcc, do_einval | 154 | bg,pn %xcc, do_einval |
| 155 | sub %o0, 1, %o0 | 155 | sub %o0, 1, %o0 |
| 156 | sllx %o0, 5, %o0 | 156 | sllx %o0, 5, %o0 |
| @@ -319,6 +319,15 @@ do_sys_recvmsg: /* compat_sys_recvmsg(int, struct compat_msghdr *, unsigned int) | |||
| 319 | nop | 319 | nop |
| 320 | nop | 320 | nop |
| 321 | nop | 321 | nop |
| 322 | do_sys_accept4: /* sys_accept4(int, struct sockaddr *, int *, int) */ | ||
| 323 | 63: ldswa [%o1 + 0x0] %asi, %o0 | ||
| 324 | sethi %hi(sys_accept4), %g1 | ||
| 325 | 64: lduwa [%o1 + 0x8] %asi, %o2 | ||
| 326 | 65: ldswa [%o1 + 0xc] %asi, %o3 | ||
| 327 | jmpl %g1 + %lo(sys_accept4), %g0 | ||
| 328 | 66: lduwa [%o1 + 0x4] %asi, %o1 | ||
| 329 | nop | ||
| 330 | nop | ||
| 322 | 331 | ||
| 323 | .section __ex_table,"a" | 332 | .section __ex_table,"a" |
| 324 | .align 4 | 333 | .align 4 |
| @@ -353,4 +362,6 @@ do_sys_recvmsg: /* compat_sys_recvmsg(int, struct compat_msghdr *, unsigned int) | |||
| 353 | .word 57b, __retl_efault, 58b, __retl_efault | 362 | .word 57b, __retl_efault, 58b, __retl_efault |
| 354 | .word 59b, __retl_efault, 60b, __retl_efault | 363 | .word 59b, __retl_efault, 60b, __retl_efault |
| 355 | .word 61b, __retl_efault, 62b, __retl_efault | 364 | .word 61b, __retl_efault, 62b, __retl_efault |
| 365 | .word 63b, __retl_efault, 64b, __retl_efault | ||
| 366 | .word 65b, __retl_efault, 66b, __retl_efault | ||
| 356 | .previous | 367 | .previous |
diff --git a/arch/sparc64/kernel/systbls.S b/arch/sparc64/kernel/systbls.S index b2fa4c163638..9fc78cf354bd 100644 --- a/arch/sparc64/kernel/systbls.S +++ b/arch/sparc64/kernel/systbls.S | |||
| @@ -82,7 +82,7 @@ sys_call_table32: | |||
| 82 | .word compat_sys_set_mempolicy, compat_sys_kexec_load, compat_sys_move_pages, sys_getcpu, compat_sys_epoll_pwait | 82 | .word compat_sys_set_mempolicy, compat_sys_kexec_load, compat_sys_move_pages, sys_getcpu, compat_sys_epoll_pwait |
| 83 | /*310*/ .word compat_sys_utimensat, compat_sys_signalfd, sys_timerfd_create, sys_eventfd, compat_sys_fallocate | 83 | /*310*/ .word compat_sys_utimensat, compat_sys_signalfd, sys_timerfd_create, sys_eventfd, compat_sys_fallocate |
| 84 | .word compat_sys_timerfd_settime, compat_sys_timerfd_gettime, compat_sys_signalfd4, sys_eventfd2, sys_epoll_create1 | 84 | .word compat_sys_timerfd_settime, compat_sys_timerfd_gettime, compat_sys_signalfd4, sys_eventfd2, sys_epoll_create1 |
| 85 | /*320*/ .word sys_dup3, sys_pipe2, sys_inotify_init1 | 85 | /*320*/ .word sys_dup3, sys_pipe2, sys_inotify_init1, sys_accept4 |
| 86 | 86 | ||
| 87 | #endif /* CONFIG_COMPAT */ | 87 | #endif /* CONFIG_COMPAT */ |
| 88 | 88 | ||
| @@ -156,4 +156,4 @@ sys_call_table: | |||
| 156 | .word sys_set_mempolicy, sys_kexec_load, sys_move_pages, sys_getcpu, sys_epoll_pwait | 156 | .word sys_set_mempolicy, sys_kexec_load, sys_move_pages, sys_getcpu, sys_epoll_pwait |
| 157 | /*310*/ .word sys_utimensat, sys_signalfd, sys_timerfd_create, sys_eventfd, sys_fallocate | 157 | /*310*/ .word sys_utimensat, sys_signalfd, sys_timerfd_create, sys_eventfd, sys_fallocate |
| 158 | .word sys_timerfd_settime, sys_timerfd_gettime, sys_signalfd4, sys_eventfd2, sys_epoll_create1 | 158 | .word sys_timerfd_settime, sys_timerfd_gettime, sys_signalfd4, sys_eventfd2, sys_epoll_create1 |
| 159 | /*320*/ .word sys_dup3, sys_pipe2, sys_inotify_init1 | 159 | /*320*/ .word sys_dup3, sys_pipe2, sys_inotify_init1, sys_accept4 |
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 669c6d588bde..2187c6086889 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig | |||
| @@ -167,9 +167,12 @@ config GENERIC_PENDING_IRQ | |||
| 167 | config X86_SMP | 167 | config X86_SMP |
| 168 | bool | 168 | bool |
| 169 | depends on SMP && ((X86_32 && !X86_VOYAGER) || X86_64) | 169 | depends on SMP && ((X86_32 && !X86_VOYAGER) || X86_64) |
| 170 | select USE_GENERIC_SMP_HELPERS | ||
| 171 | default y | 170 | default y |
| 172 | 171 | ||
| 172 | config USE_GENERIC_SMP_HELPERS | ||
| 173 | def_bool y | ||
| 174 | depends on SMP | ||
| 175 | |||
| 173 | config X86_32_SMP | 176 | config X86_32_SMP |
| 174 | def_bool y | 177 | def_bool y |
| 175 | depends on X86_32 && SMP | 178 | depends on X86_32 && SMP |
| @@ -957,7 +960,7 @@ config ARCH_PHYS_ADDR_T_64BIT | |||
| 957 | config NUMA | 960 | config NUMA |
| 958 | bool "Numa Memory Allocation and Scheduler Support (EXPERIMENTAL)" | 961 | bool "Numa Memory Allocation and Scheduler Support (EXPERIMENTAL)" |
| 959 | depends on SMP | 962 | depends on SMP |
| 960 | depends on X86_64 || (X86_32 && HIGHMEM64G && (X86_NUMAQ || X86_BIGSMP || X86_SUMMIT && ACPI) && BROKEN) | 963 | depends on X86_64 || (X86_32 && HIGHMEM64G && (X86_NUMAQ || X86_BIGSMP || X86_SUMMIT && ACPI) && EXPERIMENTAL) |
| 961 | default n if X86_PC | 964 | default n if X86_PC |
| 962 | default y if (X86_NUMAQ || X86_SUMMIT || X86_BIGSMP) | 965 | default y if (X86_NUMAQ || X86_SUMMIT || X86_BIGSMP) |
| 963 | help | 966 | help |
diff --git a/arch/x86/boot/tty.c b/arch/x86/boot/tty.c index 0be77b39328a..7e8e8b25f5f6 100644 --- a/arch/x86/boot/tty.c +++ b/arch/x86/boot/tty.c | |||
| @@ -74,7 +74,7 @@ static int kbd_pending(void) | |||
| 74 | { | 74 | { |
| 75 | u8 pending; | 75 | u8 pending; |
| 76 | asm volatile("int $0x16; setnz %0" | 76 | asm volatile("int $0x16; setnz %0" |
| 77 | : "=rm" (pending) | 77 | : "=qm" (pending) |
| 78 | : "a" (0x0100)); | 78 | : "a" (0x0100)); |
| 79 | return pending; | 79 | return pending; |
| 80 | } | 80 | } |
diff --git a/arch/x86/include/asm/dma-mapping.h b/arch/x86/include/asm/dma-mapping.h index 7f225a4b2a26..097794ff6b79 100644 --- a/arch/x86/include/asm/dma-mapping.h +++ b/arch/x86/include/asm/dma-mapping.h | |||
| @@ -71,15 +71,13 @@ static inline struct dma_mapping_ops *get_dma_ops(struct device *dev) | |||
| 71 | /* Make sure we keep the same behaviour */ | 71 | /* Make sure we keep the same behaviour */ |
| 72 | static inline int dma_mapping_error(struct device *dev, dma_addr_t dma_addr) | 72 | static inline int dma_mapping_error(struct device *dev, dma_addr_t dma_addr) |
| 73 | { | 73 | { |
| 74 | #ifdef CONFIG_X86_32 | 74 | #ifdef CONFIG_X86_64 |
| 75 | return 0; | ||
| 76 | #else | ||
| 77 | struct dma_mapping_ops *ops = get_dma_ops(dev); | 75 | struct dma_mapping_ops *ops = get_dma_ops(dev); |
| 78 | if (ops->mapping_error) | 76 | if (ops->mapping_error) |
| 79 | return ops->mapping_error(dev, dma_addr); | 77 | return ops->mapping_error(dev, dma_addr); |
| 80 | 78 | ||
| 81 | return (dma_addr == bad_dma_address); | ||
| 82 | #endif | 79 | #endif |
| 80 | return (dma_addr == bad_dma_address); | ||
| 83 | } | 81 | } |
| 84 | 82 | ||
| 85 | #define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f) | 83 | #define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f) |
diff --git a/arch/x86/include/asm/ds.h b/arch/x86/include/asm/ds.h index 72c5a190bf48..a95008457ea4 100644 --- a/arch/x86/include/asm/ds.h +++ b/arch/x86/include/asm/ds.h | |||
| @@ -23,12 +23,13 @@ | |||
| 23 | #ifndef _ASM_X86_DS_H | 23 | #ifndef _ASM_X86_DS_H |
| 24 | #define _ASM_X86_DS_H | 24 | #define _ASM_X86_DS_H |
| 25 | 25 | ||
| 26 | #ifdef CONFIG_X86_DS | ||
| 27 | 26 | ||
| 28 | #include <linux/types.h> | 27 | #include <linux/types.h> |
| 29 | #include <linux/init.h> | 28 | #include <linux/init.h> |
| 30 | 29 | ||
| 31 | 30 | ||
| 31 | #ifdef CONFIG_X86_DS | ||
| 32 | |||
| 32 | struct task_struct; | 33 | struct task_struct; |
| 33 | 34 | ||
| 34 | /* | 35 | /* |
| @@ -232,7 +233,8 @@ extern void ds_free(struct ds_context *context); | |||
| 232 | 233 | ||
| 233 | #else /* CONFIG_X86_DS */ | 234 | #else /* CONFIG_X86_DS */ |
| 234 | 235 | ||
| 235 | #define ds_init_intel(config) do {} while (0) | 236 | struct cpuinfo_x86; |
| 237 | static inline void __cpuinit ds_init_intel(struct cpuinfo_x86 *ignored) {} | ||
| 236 | 238 | ||
| 237 | #endif /* CONFIG_X86_DS */ | 239 | #endif /* CONFIG_X86_DS */ |
| 238 | #endif /* _ASM_X86_DS_H */ | 240 | #endif /* _ASM_X86_DS_H */ |
diff --git a/include/asm-x86/iomap.h b/arch/x86/include/asm/iomap.h index c1f06289b14b..c1f06289b14b 100644 --- a/include/asm-x86/iomap.h +++ b/arch/x86/include/asm/iomap.h | |||
diff --git a/arch/x86/include/asm/mmzone_32.h b/arch/x86/include/asm/mmzone_32.h index 485bdf059ffb..07f1af494ca5 100644 --- a/arch/x86/include/asm/mmzone_32.h +++ b/arch/x86/include/asm/mmzone_32.h | |||
| @@ -34,10 +34,14 @@ static inline void get_memcfg_numa(void) | |||
| 34 | 34 | ||
| 35 | extern int early_pfn_to_nid(unsigned long pfn); | 35 | extern int early_pfn_to_nid(unsigned long pfn); |
| 36 | 36 | ||
| 37 | extern void resume_map_numa_kva(pgd_t *pgd); | ||
| 38 | |||
| 37 | #else /* !CONFIG_NUMA */ | 39 | #else /* !CONFIG_NUMA */ |
| 38 | 40 | ||
| 39 | #define get_memcfg_numa get_memcfg_numa_flat | 41 | #define get_memcfg_numa get_memcfg_numa_flat |
| 40 | 42 | ||
| 43 | static inline void resume_map_numa_kva(pgd_t *pgd) {} | ||
| 44 | |||
| 41 | #endif /* CONFIG_NUMA */ | 45 | #endif /* CONFIG_NUMA */ |
| 42 | 46 | ||
| 43 | #ifdef CONFIG_DISCONTIGMEM | 47 | #ifdef CONFIG_DISCONTIGMEM |
diff --git a/arch/x86/include/asm/pci_64.h b/arch/x86/include/asm/pci_64.h index 5b28995d664e..d02d936840a3 100644 --- a/arch/x86/include/asm/pci_64.h +++ b/arch/x86/include/asm/pci_64.h | |||
| @@ -34,8 +34,6 @@ extern void pci_iommu_alloc(void); | |||
| 34 | */ | 34 | */ |
| 35 | #define PCI_DMA_BUS_IS_PHYS (dma_ops->is_phys) | 35 | #define PCI_DMA_BUS_IS_PHYS (dma_ops->is_phys) |
| 36 | 36 | ||
| 37 | #if defined(CONFIG_GART_IOMMU) || defined(CONFIG_CALGARY_IOMMU) | ||
| 38 | |||
| 39 | #define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME) \ | 37 | #define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME) \ |
| 40 | dma_addr_t ADDR_NAME; | 38 | dma_addr_t ADDR_NAME; |
| 41 | #define DECLARE_PCI_UNMAP_LEN(LEN_NAME) \ | 39 | #define DECLARE_PCI_UNMAP_LEN(LEN_NAME) \ |
| @@ -49,18 +47,6 @@ extern void pci_iommu_alloc(void); | |||
| 49 | #define pci_unmap_len_set(PTR, LEN_NAME, VAL) \ | 47 | #define pci_unmap_len_set(PTR, LEN_NAME, VAL) \ |
| 50 | (((PTR)->LEN_NAME) = (VAL)) | 48 | (((PTR)->LEN_NAME) = (VAL)) |
| 51 | 49 | ||
| 52 | #else | ||
| 53 | /* No IOMMU */ | ||
| 54 | |||
| 55 | #define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME) | ||
| 56 | #define DECLARE_PCI_UNMAP_LEN(LEN_NAME) | ||
| 57 | #define pci_unmap_addr(PTR, ADDR_NAME) (0) | ||
| 58 | #define pci_unmap_addr_set(PTR, ADDR_NAME, VAL) do { } while (0) | ||
| 59 | #define pci_unmap_len(PTR, LEN_NAME) (0) | ||
| 60 | #define pci_unmap_len_set(PTR, LEN_NAME, VAL) do { } while (0) | ||
| 61 | |||
| 62 | #endif | ||
| 63 | |||
| 64 | #endif /* __KERNEL__ */ | 50 | #endif /* __KERNEL__ */ |
| 65 | 51 | ||
| 66 | #endif /* _ASM_X86_PCI_64_H */ | 52 | #endif /* _ASM_X86_PCI_64_H */ |
diff --git a/arch/x86/include/asm/uaccess_64.h b/arch/x86/include/asm/uaccess_64.h index 664f15280f14..f8cfd00db450 100644 --- a/arch/x86/include/asm/uaccess_64.h +++ b/arch/x86/include/asm/uaccess_64.h | |||
| @@ -46,7 +46,7 @@ int __copy_from_user(void *dst, const void __user *src, unsigned size) | |||
| 46 | return ret; | 46 | return ret; |
| 47 | case 10: | 47 | case 10: |
| 48 | __get_user_asm(*(u64 *)dst, (u64 __user *)src, | 48 | __get_user_asm(*(u64 *)dst, (u64 __user *)src, |
| 49 | ret, "q", "", "=r", 16); | 49 | ret, "q", "", "=r", 10); |
| 50 | if (unlikely(ret)) | 50 | if (unlikely(ret)) |
| 51 | return ret; | 51 | return ret; |
| 52 | __get_user_asm(*(u16 *)(8 + (char *)dst), | 52 | __get_user_asm(*(u16 *)(8 + (char *)dst), |
diff --git a/arch/x86/include/asm/unistd_64.h b/arch/x86/include/asm/unistd_64.h index 834b2c1d89fb..d2e415e6666f 100644 --- a/arch/x86/include/asm/unistd_64.h +++ b/arch/x86/include/asm/unistd_64.h | |||
| @@ -639,8 +639,8 @@ __SYSCALL(__NR_fallocate, sys_fallocate) | |||
| 639 | __SYSCALL(__NR_timerfd_settime, sys_timerfd_settime) | 639 | __SYSCALL(__NR_timerfd_settime, sys_timerfd_settime) |
| 640 | #define __NR_timerfd_gettime 287 | 640 | #define __NR_timerfd_gettime 287 |
| 641 | __SYSCALL(__NR_timerfd_gettime, sys_timerfd_gettime) | 641 | __SYSCALL(__NR_timerfd_gettime, sys_timerfd_gettime) |
| 642 | #define __NR_paccept 288 | 642 | #define __NR_accept4 288 |
| 643 | __SYSCALL(__NR_paccept, sys_paccept) | 643 | __SYSCALL(__NR_accept4, sys_accept4) |
| 644 | #define __NR_signalfd4 289 | 644 | #define __NR_signalfd4 289 |
| 645 | __SYSCALL(__NR_signalfd4, sys_signalfd4) | 645 | __SYSCALL(__NR_signalfd4, sys_signalfd4) |
| 646 | #define __NR_eventfd2 290 | 646 | #define __NR_eventfd2 290 |
diff --git a/arch/x86/kernel/Makefile b/arch/x86/kernel/Makefile index e489ff9cb3e2..b62a7667828e 100644 --- a/arch/x86/kernel/Makefile +++ b/arch/x86/kernel/Makefile | |||
| @@ -41,7 +41,7 @@ obj-$(CONFIG_X86_TRAMPOLINE) += trampoline.o | |||
| 41 | obj-y += process.o | 41 | obj-y += process.o |
| 42 | obj-y += i387.o xsave.o | 42 | obj-y += i387.o xsave.o |
| 43 | obj-y += ptrace.o | 43 | obj-y += ptrace.o |
| 44 | obj-y += ds.o | 44 | obj-$(CONFIG_X86_DS) += ds.o |
| 45 | obj-$(CONFIG_X86_32) += tls.o | 45 | obj-$(CONFIG_X86_32) += tls.o |
| 46 | obj-$(CONFIG_IA32_EMULATION) += tls.o | 46 | obj-$(CONFIG_IA32_EMULATION) += tls.o |
| 47 | obj-y += step.o | 47 | obj-y += step.o |
diff --git a/arch/x86/kernel/amd_iommu.c b/arch/x86/kernel/amd_iommu.c index 172e0dc4641e..d434a97a4c7f 100644 --- a/arch/x86/kernel/amd_iommu.c +++ b/arch/x86/kernel/amd_iommu.c | |||
| @@ -538,7 +538,7 @@ static void dma_ops_free_addresses(struct dma_ops_domain *dom, | |||
| 538 | address >>= PAGE_SHIFT; | 538 | address >>= PAGE_SHIFT; |
| 539 | iommu_area_free(dom->bitmap, address, pages); | 539 | iommu_area_free(dom->bitmap, address, pages); |
| 540 | 540 | ||
| 541 | if (address + pages >= dom->next_bit) | 541 | if (address >= dom->next_bit) |
| 542 | dom->need_flush = true; | 542 | dom->need_flush = true; |
| 543 | } | 543 | } |
| 544 | 544 | ||
diff --git a/arch/x86/kernel/amd_iommu_init.c b/arch/x86/kernel/amd_iommu_init.c index 7685f0774a8f..1188b98e27ea 100644 --- a/arch/x86/kernel/amd_iommu_init.c +++ b/arch/x86/kernel/amd_iommu_init.c | |||
| @@ -122,7 +122,7 @@ u16 amd_iommu_last_bdf; /* largest PCI device id we have | |||
| 122 | LIST_HEAD(amd_iommu_unity_map); /* a list of required unity mappings | 122 | LIST_HEAD(amd_iommu_unity_map); /* a list of required unity mappings |
| 123 | we find in ACPI */ | 123 | we find in ACPI */ |
| 124 | unsigned amd_iommu_aperture_order = 26; /* size of aperture in power of 2 */ | 124 | unsigned amd_iommu_aperture_order = 26; /* size of aperture in power of 2 */ |
| 125 | int amd_iommu_isolate; /* if 1, device isolation is enabled */ | 125 | int amd_iommu_isolate = 1; /* if 1, device isolation is enabled */ |
| 126 | bool amd_iommu_unmap_flush; /* if true, flush on every unmap */ | 126 | bool amd_iommu_unmap_flush; /* if true, flush on every unmap */ |
| 127 | 127 | ||
| 128 | LIST_HEAD(amd_iommu_list); /* list of all AMD IOMMUs in the | 128 | LIST_HEAD(amd_iommu_list); /* list of all AMD IOMMUs in the |
| @@ -1214,7 +1214,9 @@ static int __init parse_amd_iommu_options(char *str) | |||
| 1214 | for (; *str; ++str) { | 1214 | for (; *str; ++str) { |
| 1215 | if (strncmp(str, "isolate", 7) == 0) | 1215 | if (strncmp(str, "isolate", 7) == 0) |
| 1216 | amd_iommu_isolate = 1; | 1216 | amd_iommu_isolate = 1; |
| 1217 | if (strncmp(str, "fullflush", 11) == 0) | 1217 | if (strncmp(str, "share", 5) == 0) |
| 1218 | amd_iommu_isolate = 0; | ||
| 1219 | if (strncmp(str, "fullflush", 9) == 0) | ||
| 1218 | amd_iommu_unmap_flush = true; | 1220 | amd_iommu_unmap_flush = true; |
| 1219 | } | 1221 | } |
| 1220 | 1222 | ||
diff --git a/arch/x86/kernel/ds.c b/arch/x86/kernel/ds.c index 2b69994fd3a8..a2d1176c38ee 100644 --- a/arch/x86/kernel/ds.c +++ b/arch/x86/kernel/ds.c | |||
| @@ -21,8 +21,6 @@ | |||
| 21 | */ | 21 | */ |
| 22 | 22 | ||
| 23 | 23 | ||
| 24 | #ifdef CONFIG_X86_DS | ||
| 25 | |||
| 26 | #include <asm/ds.h> | 24 | #include <asm/ds.h> |
| 27 | 25 | ||
| 28 | #include <linux/errno.h> | 26 | #include <linux/errno.h> |
| @@ -211,14 +209,15 @@ static DEFINE_PER_CPU(struct ds_context *, system_context); | |||
| 211 | static inline struct ds_context *ds_get_context(struct task_struct *task) | 209 | static inline struct ds_context *ds_get_context(struct task_struct *task) |
| 212 | { | 210 | { |
| 213 | struct ds_context *context; | 211 | struct ds_context *context; |
| 212 | unsigned long irq; | ||
| 214 | 213 | ||
| 215 | spin_lock(&ds_lock); | 214 | spin_lock_irqsave(&ds_lock, irq); |
| 216 | 215 | ||
| 217 | context = (task ? task->thread.ds_ctx : this_system_context); | 216 | context = (task ? task->thread.ds_ctx : this_system_context); |
| 218 | if (context) | 217 | if (context) |
| 219 | context->count++; | 218 | context->count++; |
| 220 | 219 | ||
| 221 | spin_unlock(&ds_lock); | 220 | spin_unlock_irqrestore(&ds_lock, irq); |
| 222 | 221 | ||
| 223 | return context; | 222 | return context; |
| 224 | } | 223 | } |
| @@ -226,18 +225,16 @@ static inline struct ds_context *ds_get_context(struct task_struct *task) | |||
| 226 | /* | 225 | /* |
| 227 | * Same as ds_get_context, but allocates the context and it's DS | 226 | * Same as ds_get_context, but allocates the context and it's DS |
| 228 | * structure, if necessary; returns NULL; if out of memory. | 227 | * structure, if necessary; returns NULL; if out of memory. |
| 229 | * | ||
| 230 | * pre: requires ds_lock to be held | ||
| 231 | */ | 228 | */ |
| 232 | static inline struct ds_context *ds_alloc_context(struct task_struct *task) | 229 | static inline struct ds_context *ds_alloc_context(struct task_struct *task) |
| 233 | { | 230 | { |
| 234 | struct ds_context **p_context = | 231 | struct ds_context **p_context = |
| 235 | (task ? &task->thread.ds_ctx : &this_system_context); | 232 | (task ? &task->thread.ds_ctx : &this_system_context); |
| 236 | struct ds_context *context = *p_context; | 233 | struct ds_context *context = *p_context; |
| 234 | unsigned long irq; | ||
| 237 | 235 | ||
| 238 | if (!context) { | 236 | if (!context) { |
| 239 | context = kzalloc(sizeof(*context), GFP_KERNEL); | 237 | context = kzalloc(sizeof(*context), GFP_KERNEL); |
| 240 | |||
| 241 | if (!context) | 238 | if (!context) |
| 242 | return NULL; | 239 | return NULL; |
| 243 | 240 | ||
| @@ -247,18 +244,27 @@ static inline struct ds_context *ds_alloc_context(struct task_struct *task) | |||
| 247 | return NULL; | 244 | return NULL; |
| 248 | } | 245 | } |
| 249 | 246 | ||
| 250 | *p_context = context; | 247 | spin_lock_irqsave(&ds_lock, irq); |
| 251 | 248 | ||
| 252 | context->this = p_context; | 249 | if (*p_context) { |
| 253 | context->task = task; | 250 | kfree(context->ds); |
| 251 | kfree(context); | ||
| 252 | |||
| 253 | context = *p_context; | ||
| 254 | } else { | ||
| 255 | *p_context = context; | ||
| 254 | 256 | ||
| 255 | if (task) | 257 | context->this = p_context; |
| 256 | set_tsk_thread_flag(task, TIF_DS_AREA_MSR); | 258 | context->task = task; |
| 257 | 259 | ||
| 258 | if (!task || (task == current)) | 260 | if (task) |
| 259 | wrmsr(MSR_IA32_DS_AREA, (unsigned long)context->ds, 0); | 261 | set_tsk_thread_flag(task, TIF_DS_AREA_MSR); |
| 260 | 262 | ||
| 261 | get_tracer(task); | 263 | if (!task || (task == current)) |
| 264 | wrmsrl(MSR_IA32_DS_AREA, | ||
| 265 | (unsigned long)context->ds); | ||
| 266 | } | ||
| 267 | spin_unlock_irqrestore(&ds_lock, irq); | ||
| 262 | } | 268 | } |
| 263 | 269 | ||
| 264 | context->count++; | 270 | context->count++; |
| @@ -272,10 +278,12 @@ static inline struct ds_context *ds_alloc_context(struct task_struct *task) | |||
| 272 | */ | 278 | */ |
| 273 | static inline void ds_put_context(struct ds_context *context) | 279 | static inline void ds_put_context(struct ds_context *context) |
| 274 | { | 280 | { |
| 281 | unsigned long irq; | ||
| 282 | |||
| 275 | if (!context) | 283 | if (!context) |
| 276 | return; | 284 | return; |
| 277 | 285 | ||
| 278 | spin_lock(&ds_lock); | 286 | spin_lock_irqsave(&ds_lock, irq); |
| 279 | 287 | ||
| 280 | if (--context->count) | 288 | if (--context->count) |
| 281 | goto out; | 289 | goto out; |
| @@ -297,7 +305,7 @@ static inline void ds_put_context(struct ds_context *context) | |||
| 297 | kfree(context->ds); | 305 | kfree(context->ds); |
| 298 | kfree(context); | 306 | kfree(context); |
| 299 | out: | 307 | out: |
| 300 | spin_unlock(&ds_lock); | 308 | spin_unlock_irqrestore(&ds_lock, irq); |
| 301 | } | 309 | } |
| 302 | 310 | ||
| 303 | 311 | ||
| @@ -368,6 +376,7 @@ static int ds_request(struct task_struct *task, void *base, size_t size, | |||
| 368 | struct ds_context *context; | 376 | struct ds_context *context; |
| 369 | unsigned long buffer, adj; | 377 | unsigned long buffer, adj; |
| 370 | const unsigned long alignment = (1 << 3); | 378 | const unsigned long alignment = (1 << 3); |
| 379 | unsigned long irq; | ||
| 371 | int error = 0; | 380 | int error = 0; |
| 372 | 381 | ||
| 373 | if (!ds_cfg.sizeof_ds) | 382 | if (!ds_cfg.sizeof_ds) |
| @@ -382,25 +391,27 @@ static int ds_request(struct task_struct *task, void *base, size_t size, | |||
| 382 | return -EOPNOTSUPP; | 391 | return -EOPNOTSUPP; |
| 383 | 392 | ||
| 384 | 393 | ||
| 385 | spin_lock(&ds_lock); | ||
| 386 | |||
| 387 | if (!check_tracer(task)) | ||
| 388 | return -EPERM; | ||
| 389 | |||
| 390 | error = -ENOMEM; | ||
| 391 | context = ds_alloc_context(task); | 394 | context = ds_alloc_context(task); |
| 392 | if (!context) | 395 | if (!context) |
| 396 | return -ENOMEM; | ||
| 397 | |||
| 398 | spin_lock_irqsave(&ds_lock, irq); | ||
| 399 | |||
| 400 | error = -EPERM; | ||
| 401 | if (!check_tracer(task)) | ||
| 393 | goto out_unlock; | 402 | goto out_unlock; |
| 394 | 403 | ||
| 404 | get_tracer(task); | ||
| 405 | |||
| 395 | error = -EALREADY; | 406 | error = -EALREADY; |
| 396 | if (context->owner[qual] == current) | 407 | if (context->owner[qual] == current) |
| 397 | goto out_unlock; | 408 | goto out_put_tracer; |
| 398 | error = -EPERM; | 409 | error = -EPERM; |
| 399 | if (context->owner[qual] != NULL) | 410 | if (context->owner[qual] != NULL) |
| 400 | goto out_unlock; | 411 | goto out_put_tracer; |
| 401 | context->owner[qual] = current; | 412 | context->owner[qual] = current; |
| 402 | 413 | ||
| 403 | spin_unlock(&ds_lock); | 414 | spin_unlock_irqrestore(&ds_lock, irq); |
| 404 | 415 | ||
| 405 | 416 | ||
| 406 | error = -ENOMEM; | 417 | error = -ENOMEM; |
| @@ -448,10 +459,17 @@ static int ds_request(struct task_struct *task, void *base, size_t size, | |||
| 448 | out_release: | 459 | out_release: |
| 449 | context->owner[qual] = NULL; | 460 | context->owner[qual] = NULL; |
| 450 | ds_put_context(context); | 461 | ds_put_context(context); |
| 462 | put_tracer(task); | ||
| 463 | return error; | ||
| 464 | |||
| 465 | out_put_tracer: | ||
| 466 | spin_unlock_irqrestore(&ds_lock, irq); | ||
| 467 | ds_put_context(context); | ||
| 468 | put_tracer(task); | ||
| 451 | return error; | 469 | return error; |
| 452 | 470 | ||
| 453 | out_unlock: | 471 | out_unlock: |
| 454 | spin_unlock(&ds_lock); | 472 | spin_unlock_irqrestore(&ds_lock, irq); |
| 455 | ds_put_context(context); | 473 | ds_put_context(context); |
| 456 | return error; | 474 | return error; |
| 457 | } | 475 | } |
| @@ -801,13 +819,21 @@ static const struct ds_configuration ds_cfg_var = { | |||
| 801 | .sizeof_ds = sizeof(long) * 12, | 819 | .sizeof_ds = sizeof(long) * 12, |
| 802 | .sizeof_field = sizeof(long), | 820 | .sizeof_field = sizeof(long), |
| 803 | .sizeof_rec[ds_bts] = sizeof(long) * 3, | 821 | .sizeof_rec[ds_bts] = sizeof(long) * 3, |
| 822 | #ifdef __i386__ | ||
| 804 | .sizeof_rec[ds_pebs] = sizeof(long) * 10 | 823 | .sizeof_rec[ds_pebs] = sizeof(long) * 10 |
| 824 | #else | ||
| 825 | .sizeof_rec[ds_pebs] = sizeof(long) * 18 | ||
| 826 | #endif | ||
| 805 | }; | 827 | }; |
| 806 | static const struct ds_configuration ds_cfg_64 = { | 828 | static const struct ds_configuration ds_cfg_64 = { |
| 807 | .sizeof_ds = 8 * 12, | 829 | .sizeof_ds = 8 * 12, |
| 808 | .sizeof_field = 8, | 830 | .sizeof_field = 8, |
| 809 | .sizeof_rec[ds_bts] = 8 * 3, | 831 | .sizeof_rec[ds_bts] = 8 * 3, |
| 832 | #ifdef __i386__ | ||
| 810 | .sizeof_rec[ds_pebs] = 8 * 10 | 833 | .sizeof_rec[ds_pebs] = 8 * 10 |
| 834 | #else | ||
| 835 | .sizeof_rec[ds_pebs] = 8 * 18 | ||
| 836 | #endif | ||
| 811 | }; | 837 | }; |
| 812 | 838 | ||
| 813 | static inline void | 839 | static inline void |
| @@ -861,4 +887,3 @@ void ds_free(struct ds_context *context) | |||
| 861 | while (leftovers--) | 887 | while (leftovers--) |
| 862 | ds_put_context(context); | 888 | ds_put_context(context); |
| 863 | } | 889 | } |
| 864 | #endif /* CONFIG_X86_DS */ | ||
diff --git a/arch/x86/kernel/es7000_32.c b/arch/x86/kernel/es7000_32.c index f454c78fcef6..0aa2c443d600 100644 --- a/arch/x86/kernel/es7000_32.c +++ b/arch/x86/kernel/es7000_32.c | |||
| @@ -250,31 +250,24 @@ int __init find_unisys_acpi_oem_table(unsigned long *oem_addr) | |||
| 250 | { | 250 | { |
| 251 | struct acpi_table_header *header = NULL; | 251 | struct acpi_table_header *header = NULL; |
| 252 | int i = 0; | 252 | int i = 0; |
| 253 | acpi_size tbl_size; | ||
| 254 | 253 | ||
| 255 | while (ACPI_SUCCESS(acpi_get_table_with_size("OEM1", i++, &header, &tbl_size))) { | 254 | while (ACPI_SUCCESS(acpi_get_table("OEM1", i++, &header))) { |
| 256 | if (!memcmp((char *) &header->oem_id, "UNISYS", 6)) { | 255 | if (!memcmp((char *) &header->oem_id, "UNISYS", 6)) { |
| 257 | struct oem_table *t = (struct oem_table *)header; | 256 | struct oem_table *t = (struct oem_table *)header; |
| 258 | 257 | ||
| 259 | oem_addrX = t->OEMTableAddr; | 258 | oem_addrX = t->OEMTableAddr; |
| 260 | oem_size = t->OEMTableSize; | 259 | oem_size = t->OEMTableSize; |
| 261 | early_acpi_os_unmap_memory(header, tbl_size); | ||
| 262 | 260 | ||
| 263 | *oem_addr = (unsigned long)__acpi_map_table(oem_addrX, | 261 | *oem_addr = (unsigned long)__acpi_map_table(oem_addrX, |
| 264 | oem_size); | 262 | oem_size); |
| 265 | return 0; | 263 | return 0; |
| 266 | } | 264 | } |
| 267 | early_acpi_os_unmap_memory(header, tbl_size); | ||
| 268 | } | 265 | } |
| 269 | return -1; | 266 | return -1; |
| 270 | } | 267 | } |
| 271 | 268 | ||
| 272 | void __init unmap_unisys_acpi_oem_table(unsigned long oem_addr) | 269 | void __init unmap_unisys_acpi_oem_table(unsigned long oem_addr) |
| 273 | { | 270 | { |
| 274 | if (!oem_addr) | ||
| 275 | return; | ||
| 276 | |||
| 277 | __acpi_unmap_table((char *)oem_addr, oem_size); | ||
| 278 | } | 271 | } |
| 279 | #endif | 272 | #endif |
| 280 | 273 | ||
diff --git a/arch/x86/kernel/i387.c b/arch/x86/kernel/i387.c index 1f20608d4ca8..b0f61f0dcd0a 100644 --- a/arch/x86/kernel/i387.c +++ b/arch/x86/kernel/i387.c | |||
| @@ -58,7 +58,7 @@ void __cpuinit mxcsr_feature_mask_init(void) | |||
| 58 | stts(); | 58 | stts(); |
| 59 | } | 59 | } |
| 60 | 60 | ||
| 61 | void __init init_thread_xstate(void) | 61 | void __cpuinit init_thread_xstate(void) |
| 62 | { | 62 | { |
| 63 | if (!HAVE_HWFP) { | 63 | if (!HAVE_HWFP) { |
| 64 | xstate_size = sizeof(struct i387_soft_struct); | 64 | xstate_size = sizeof(struct i387_soft_struct); |
diff --git a/arch/x86/kernel/io_apic.c b/arch/x86/kernel/io_apic.c index 7a3f2028e2eb..1fec0f9b1508 100644 --- a/arch/x86/kernel/io_apic.c +++ b/arch/x86/kernel/io_apic.c | |||
| @@ -1140,6 +1140,20 @@ static void __clear_irq_vector(int irq) | |||
| 1140 | 1140 | ||
| 1141 | cfg->vector = 0; | 1141 | cfg->vector = 0; |
| 1142 | cpus_clear(cfg->domain); | 1142 | cpus_clear(cfg->domain); |
| 1143 | |||
| 1144 | if (likely(!cfg->move_in_progress)) | ||
| 1145 | return; | ||
| 1146 | cpus_and(mask, cfg->old_domain, cpu_online_map); | ||
| 1147 | for_each_cpu_mask_nr(cpu, mask) { | ||
| 1148 | for (vector = FIRST_EXTERNAL_VECTOR; vector < NR_VECTORS; | ||
| 1149 | vector++) { | ||
| 1150 | if (per_cpu(vector_irq, cpu)[vector] != irq) | ||
| 1151 | continue; | ||
| 1152 | per_cpu(vector_irq, cpu)[vector] = -1; | ||
| 1153 | break; | ||
| 1154 | } | ||
| 1155 | } | ||
| 1156 | cfg->move_in_progress = 0; | ||
| 1143 | } | 1157 | } |
| 1144 | 1158 | ||
| 1145 | void __setup_vector_irq(int cpu) | 1159 | void __setup_vector_irq(int cpu) |
| @@ -3594,27 +3608,7 @@ int __init io_apic_get_redir_entries (int ioapic) | |||
| 3594 | 3608 | ||
| 3595 | int __init probe_nr_irqs(void) | 3609 | int __init probe_nr_irqs(void) |
| 3596 | { | 3610 | { |
| 3597 | int idx; | 3611 | return NR_IRQS; |
| 3598 | int nr = 0; | ||
| 3599 | #ifndef CONFIG_XEN | ||
| 3600 | int nr_min = 32; | ||
| 3601 | #else | ||
| 3602 | int nr_min = NR_IRQS; | ||
| 3603 | #endif | ||
| 3604 | |||
| 3605 | for (idx = 0; idx < nr_ioapics; idx++) | ||
| 3606 | nr += io_apic_get_redir_entries(idx) + 1; | ||
| 3607 | |||
| 3608 | /* double it for hotplug and msi and nmi */ | ||
| 3609 | nr <<= 1; | ||
| 3610 | |||
| 3611 | /* something wrong ? */ | ||
| 3612 | if (nr < nr_min) | ||
| 3613 | nr = nr_min; | ||
| 3614 | if (WARN_ON(nr > NR_IRQS)) | ||
| 3615 | nr = NR_IRQS; | ||
| 3616 | |||
| 3617 | return nr; | ||
| 3618 | } | 3612 | } |
| 3619 | 3613 | ||
| 3620 | /* -------------------------------------------------------------------------- | 3614 | /* -------------------------------------------------------------------------- |
diff --git a/arch/x86/kernel/pci-calgary_64.c b/arch/x86/kernel/pci-calgary_64.c index e1e731d78f38..d28bbdc35e4e 100644 --- a/arch/x86/kernel/pci-calgary_64.c +++ b/arch/x86/kernel/pci-calgary_64.c | |||
| @@ -1567,7 +1567,7 @@ static int __init calgary_parse_options(char *p) | |||
| 1567 | ++p; | 1567 | ++p; |
| 1568 | if (*p == '\0') | 1568 | if (*p == '\0') |
| 1569 | break; | 1569 | break; |
| 1570 | bridge = simple_strtol(p, &endp, 0); | 1570 | bridge = simple_strtoul(p, &endp, 0); |
| 1571 | if (p == endp) | 1571 | if (p == endp) |
| 1572 | break; | 1572 | break; |
| 1573 | 1573 | ||
diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c index 724adfc63cb9..cc5a2545dd41 100644 --- a/arch/x86/kernel/reboot.c +++ b/arch/x86/kernel/reboot.c | |||
| @@ -169,6 +169,15 @@ static struct dmi_system_id __initdata reboot_dmi_table[] = { | |||
| 169 | DMI_MATCH(DMI_BOARD_NAME, "0KW626"), | 169 | DMI_MATCH(DMI_BOARD_NAME, "0KW626"), |
| 170 | }, | 170 | }, |
| 171 | }, | 171 | }, |
| 172 | { /* Handle problems with rebooting on Dell Optiplex 330 with 0KP561 */ | ||
| 173 | .callback = set_bios_reboot, | ||
| 174 | .ident = "Dell OptiPlex 330", | ||
| 175 | .matches = { | ||
| 176 | DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
| 177 | DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex 330"), | ||
| 178 | DMI_MATCH(DMI_BOARD_NAME, "0KP561"), | ||
| 179 | }, | ||
| 180 | }, | ||
| 172 | { /* Handle problems with rebooting on Dell 2400's */ | 181 | { /* Handle problems with rebooting on Dell 2400's */ |
| 173 | .callback = set_bios_reboot, | 182 | .callback = set_bios_reboot, |
| 174 | .ident = "Dell PowerEdge 2400", | 183 | .ident = "Dell PowerEdge 2400", |
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c index 67d5979e654e..decb492134c3 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c | |||
| @@ -765,7 +765,7 @@ static struct dmi_system_id __initdata bad_bios_dmi_table[] = { | |||
| 765 | .callback = dmi_low_memory_corruption, | 765 | .callback = dmi_low_memory_corruption, |
| 766 | .ident = "Phoenix BIOS", | 766 | .ident = "Phoenix BIOS", |
| 767 | .matches = { | 767 | .matches = { |
| 768 | DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies, LTD"), | 768 | DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies"), |
| 769 | }, | 769 | }, |
| 770 | }, | 770 | }, |
| 771 | #endif | 771 | #endif |
diff --git a/arch/x86/kernel/tsc_sync.c b/arch/x86/kernel/tsc_sync.c index 9ffb01c31c40..1c0dfbca87c1 100644 --- a/arch/x86/kernel/tsc_sync.c +++ b/arch/x86/kernel/tsc_sync.c | |||
| @@ -46,7 +46,9 @@ static __cpuinit void check_tsc_warp(void) | |||
| 46 | cycles_t start, now, prev, end; | 46 | cycles_t start, now, prev, end; |
| 47 | int i; | 47 | int i; |
| 48 | 48 | ||
| 49 | rdtsc_barrier(); | ||
| 49 | start = get_cycles(); | 50 | start = get_cycles(); |
| 51 | rdtsc_barrier(); | ||
| 50 | /* | 52 | /* |
| 51 | * The measurement runs for 20 msecs: | 53 | * The measurement runs for 20 msecs: |
| 52 | */ | 54 | */ |
| @@ -61,7 +63,9 @@ static __cpuinit void check_tsc_warp(void) | |||
| 61 | */ | 63 | */ |
| 62 | __raw_spin_lock(&sync_lock); | 64 | __raw_spin_lock(&sync_lock); |
| 63 | prev = last_tsc; | 65 | prev = last_tsc; |
| 66 | rdtsc_barrier(); | ||
| 64 | now = get_cycles(); | 67 | now = get_cycles(); |
| 68 | rdtsc_barrier(); | ||
| 65 | last_tsc = now; | 69 | last_tsc = now; |
| 66 | __raw_spin_unlock(&sync_lock); | 70 | __raw_spin_unlock(&sync_lock); |
| 67 | 71 | ||
diff --git a/arch/x86/kernel/xsave.c b/arch/x86/kernel/xsave.c index b13acb75e822..15c3e6999182 100644 --- a/arch/x86/kernel/xsave.c +++ b/arch/x86/kernel/xsave.c | |||
| @@ -310,7 +310,7 @@ static void __init setup_xstate_init(void) | |||
| 310 | /* | 310 | /* |
| 311 | * Enable and initialize the xsave feature. | 311 | * Enable and initialize the xsave feature. |
| 312 | */ | 312 | */ |
| 313 | void __init xsave_cntxt_init(void) | 313 | void __ref xsave_cntxt_init(void) |
| 314 | { | 314 | { |
| 315 | unsigned int eax, ebx, ecx, edx; | 315 | unsigned int eax, ebx, ecx, edx; |
| 316 | 316 | ||
diff --git a/arch/x86/mach-voyager/voyager_smp.c b/arch/x86/mach-voyager/voyager_smp.c index 0e331652681e..52145007bd7e 100644 --- a/arch/x86/mach-voyager/voyager_smp.c +++ b/arch/x86/mach-voyager/voyager_smp.c | |||
| @@ -7,6 +7,7 @@ | |||
| 7 | * This file provides all the same external entries as smp.c but uses | 7 | * This file provides all the same external entries as smp.c but uses |
| 8 | * the voyager hal to provide the functionality | 8 | * the voyager hal to provide the functionality |
| 9 | */ | 9 | */ |
| 10 | #include <linux/cpu.h> | ||
| 10 | #include <linux/module.h> | 11 | #include <linux/module.h> |
| 11 | #include <linux/mm.h> | 12 | #include <linux/mm.h> |
| 12 | #include <linux/kernel_stat.h> | 13 | #include <linux/kernel_stat.h> |
| @@ -1790,6 +1791,17 @@ void __init smp_setup_processor_id(void) | |||
| 1790 | x86_write_percpu(cpu_number, hard_smp_processor_id()); | 1791 | x86_write_percpu(cpu_number, hard_smp_processor_id()); |
| 1791 | } | 1792 | } |
| 1792 | 1793 | ||
| 1794 | static void voyager_send_call_func(cpumask_t callmask) | ||
| 1795 | { | ||
| 1796 | __u32 mask = cpus_addr(callmask)[0] & ~(1 << smp_processor_id()); | ||
| 1797 | send_CPI(mask, VIC_CALL_FUNCTION_CPI); | ||
| 1798 | } | ||
| 1799 | |||
| 1800 | static void voyager_send_call_func_single(int cpu) | ||
| 1801 | { | ||
| 1802 | send_CPI(1 << cpu, VIC_CALL_FUNCTION_SINGLE_CPI); | ||
| 1803 | } | ||
| 1804 | |||
| 1793 | struct smp_ops smp_ops = { | 1805 | struct smp_ops smp_ops = { |
| 1794 | .smp_prepare_boot_cpu = voyager_smp_prepare_boot_cpu, | 1806 | .smp_prepare_boot_cpu = voyager_smp_prepare_boot_cpu, |
| 1795 | .smp_prepare_cpus = voyager_smp_prepare_cpus, | 1807 | .smp_prepare_cpus = voyager_smp_prepare_cpus, |
| @@ -1799,6 +1811,6 @@ struct smp_ops smp_ops = { | |||
| 1799 | .smp_send_stop = voyager_smp_send_stop, | 1811 | .smp_send_stop = voyager_smp_send_stop, |
| 1800 | .smp_send_reschedule = voyager_smp_send_reschedule, | 1812 | .smp_send_reschedule = voyager_smp_send_reschedule, |
| 1801 | 1813 | ||
| 1802 | .send_call_func_ipi = native_send_call_func_ipi, | 1814 | .send_call_func_ipi = voyager_send_call_func, |
| 1803 | .send_call_func_single_ipi = native_send_call_func_single_ipi, | 1815 | .send_call_func_single_ipi = voyager_send_call_func_single, |
| 1804 | }; | 1816 | }; |
diff --git a/arch/x86/mm/numa_32.c b/arch/x86/mm/numa_32.c index 847c164725f4..8518c678d83f 100644 --- a/arch/x86/mm/numa_32.c +++ b/arch/x86/mm/numa_32.c | |||
| @@ -222,6 +222,41 @@ static void __init remap_numa_kva(void) | |||
| 222 | } | 222 | } |
| 223 | } | 223 | } |
| 224 | 224 | ||
| 225 | #ifdef CONFIG_HIBERNATION | ||
| 226 | /** | ||
| 227 | * resume_map_numa_kva - add KVA mapping to the temporary page tables created | ||
| 228 | * during resume from hibernation | ||
| 229 | * @pgd_base - temporary resume page directory | ||
| 230 | */ | ||
| 231 | void resume_map_numa_kva(pgd_t *pgd_base) | ||
| 232 | { | ||
| 233 | int node; | ||
| 234 | |||
| 235 | for_each_online_node(node) { | ||
| 236 | unsigned long start_va, start_pfn, size, pfn; | ||
| 237 | |||
| 238 | start_va = (unsigned long)node_remap_start_vaddr[node]; | ||
| 239 | start_pfn = node_remap_start_pfn[node]; | ||
| 240 | size = node_remap_size[node]; | ||
| 241 | |||
| 242 | printk(KERN_DEBUG "%s: node %d\n", __FUNCTION__, node); | ||
| 243 | |||
| 244 | for (pfn = 0; pfn < size; pfn += PTRS_PER_PTE) { | ||
| 245 | unsigned long vaddr = start_va + (pfn << PAGE_SHIFT); | ||
| 246 | pgd_t *pgd = pgd_base + pgd_index(vaddr); | ||
| 247 | pud_t *pud = pud_offset(pgd, vaddr); | ||
| 248 | pmd_t *pmd = pmd_offset(pud, vaddr); | ||
| 249 | |||
| 250 | set_pmd(pmd, pfn_pmd(start_pfn + pfn, | ||
| 251 | PAGE_KERNEL_LARGE_EXEC)); | ||
| 252 | |||
| 253 | printk(KERN_DEBUG "%s: %08lx -> pfn %08lx\n", | ||
| 254 | __FUNCTION__, vaddr, start_pfn + pfn); | ||
| 255 | } | ||
| 256 | } | ||
| 257 | } | ||
| 258 | #endif | ||
| 259 | |||
| 225 | static unsigned long calculate_numa_remap_pages(void) | 260 | static unsigned long calculate_numa_remap_pages(void) |
| 226 | { | 261 | { |
| 227 | int nid; | 262 | int nid; |
diff --git a/arch/x86/oprofile/op_model_ppro.c b/arch/x86/oprofile/op_model_ppro.c index 3f1b81a83e2e..716d26f0e5d4 100644 --- a/arch/x86/oprofile/op_model_ppro.c +++ b/arch/x86/oprofile/op_model_ppro.c | |||
| @@ -69,7 +69,7 @@ static void ppro_setup_ctrs(struct op_msrs const * const msrs) | |||
| 69 | int i; | 69 | int i; |
| 70 | 70 | ||
| 71 | if (!reset_value) { | 71 | if (!reset_value) { |
| 72 | reset_value = kmalloc(sizeof(unsigned) * num_counters, | 72 | reset_value = kmalloc(sizeof(reset_value[0]) * num_counters, |
| 73 | GFP_ATOMIC); | 73 | GFP_ATOMIC); |
| 74 | if (!reset_value) | 74 | if (!reset_value) |
| 75 | return; | 75 | return; |
diff --git a/arch/x86/pci/fixup.c b/arch/x86/pci/fixup.c index 3c27a809393b..2051dc96b8e9 100644 --- a/arch/x86/pci/fixup.c +++ b/arch/x86/pci/fixup.c | |||
| @@ -496,21 +496,24 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SIEMENS, 0x0015, | |||
| 496 | pci_siemens_interrupt_controller); | 496 | pci_siemens_interrupt_controller); |
| 497 | 497 | ||
| 498 | /* | 498 | /* |
| 499 | * Regular PCI devices have 256 bytes, but AMD Family 10h Opteron ext config | 499 | * Regular PCI devices have 256 bytes, but AMD Family 10h/11h CPUs have |
| 500 | * have 4096 bytes. Even if the device is capable, that doesn't mean we can | 500 | * 4096 bytes configuration space for each function of their processor |
| 501 | * access it. Maybe we don't have a way to generate extended config space | 501 | * configuration space. |
| 502 | * accesses. So check it | ||
| 503 | */ | 502 | */ |
| 504 | static void fam10h_pci_cfg_space_size(struct pci_dev *dev) | 503 | static void amd_cpu_pci_cfg_space_size(struct pci_dev *dev) |
| 505 | { | 504 | { |
| 506 | dev->cfg_size = pci_cfg_space_size_ext(dev); | 505 | dev->cfg_size = pci_cfg_space_size_ext(dev); |
| 507 | } | 506 | } |
| 508 | 507 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1200, amd_cpu_pci_cfg_space_size); | |
| 509 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1200, fam10h_pci_cfg_space_size); | 508 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1201, amd_cpu_pci_cfg_space_size); |
| 510 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1201, fam10h_pci_cfg_space_size); | 509 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1202, amd_cpu_pci_cfg_space_size); |
| 511 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1202, fam10h_pci_cfg_space_size); | 510 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1203, amd_cpu_pci_cfg_space_size); |
| 512 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1203, fam10h_pci_cfg_space_size); | 511 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1204, amd_cpu_pci_cfg_space_size); |
| 513 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1204, fam10h_pci_cfg_space_size); | 512 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1300, amd_cpu_pci_cfg_space_size); |
| 513 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1301, amd_cpu_pci_cfg_space_size); | ||
| 514 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1302, amd_cpu_pci_cfg_space_size); | ||
| 515 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1303, amd_cpu_pci_cfg_space_size); | ||
| 516 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1304, amd_cpu_pci_cfg_space_size); | ||
| 514 | 517 | ||
| 515 | /* | 518 | /* |
| 516 | * SB600: Disable BAR1 on device 14.0 to avoid HPET resources from | 519 | * SB600: Disable BAR1 on device 14.0 to avoid HPET resources from |
diff --git a/arch/x86/power/hibernate_32.c b/arch/x86/power/hibernate_32.c index f2b6e3f11bfc..81197c62d5b3 100644 --- a/arch/x86/power/hibernate_32.c +++ b/arch/x86/power/hibernate_32.c | |||
| @@ -12,6 +12,7 @@ | |||
| 12 | #include <asm/system.h> | 12 | #include <asm/system.h> |
| 13 | #include <asm/page.h> | 13 | #include <asm/page.h> |
| 14 | #include <asm/pgtable.h> | 14 | #include <asm/pgtable.h> |
| 15 | #include <asm/mmzone.h> | ||
| 15 | 16 | ||
| 16 | /* Defined in hibernate_asm_32.S */ | 17 | /* Defined in hibernate_asm_32.S */ |
| 17 | extern int restore_image(void); | 18 | extern int restore_image(void); |
| @@ -127,6 +128,9 @@ static int resume_physical_mapping_init(pgd_t *pgd_base) | |||
| 127 | } | 128 | } |
| 128 | } | 129 | } |
| 129 | } | 130 | } |
| 131 | |||
| 132 | resume_map_numa_kva(pgd_base); | ||
| 133 | |||
| 130 | return 0; | 134 | return 0; |
| 131 | } | 135 | } |
| 132 | 136 | ||
diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c index 688936044dc9..636ef4caa52d 100644 --- a/arch/x86/xen/mmu.c +++ b/arch/x86/xen/mmu.c | |||
| @@ -661,12 +661,11 @@ void xen_set_pgd(pgd_t *ptr, pgd_t val) | |||
| 661 | * For 64-bit, we must skip the Xen hole in the middle of the address | 661 | * For 64-bit, we must skip the Xen hole in the middle of the address |
| 662 | * space, just after the big x86-64 virtual hole. | 662 | * space, just after the big x86-64 virtual hole. |
| 663 | */ | 663 | */ |
| 664 | static int xen_pgd_walk(struct mm_struct *mm, | 664 | static int __xen_pgd_walk(struct mm_struct *mm, pgd_t *pgd, |
| 665 | int (*func)(struct mm_struct *mm, struct page *, | 665 | int (*func)(struct mm_struct *mm, struct page *, |
| 666 | enum pt_level), | 666 | enum pt_level), |
| 667 | unsigned long limit) | 667 | unsigned long limit) |
| 668 | { | 668 | { |
| 669 | pgd_t *pgd = mm->pgd; | ||
| 670 | int flush = 0; | 669 | int flush = 0; |
| 671 | unsigned hole_low, hole_high; | 670 | unsigned hole_low, hole_high; |
| 672 | unsigned pgdidx_limit, pudidx_limit, pmdidx_limit; | 671 | unsigned pgdidx_limit, pudidx_limit, pmdidx_limit; |
| @@ -753,6 +752,14 @@ out: | |||
| 753 | return flush; | 752 | return flush; |
| 754 | } | 753 | } |
| 755 | 754 | ||
| 755 | static int xen_pgd_walk(struct mm_struct *mm, | ||
| 756 | int (*func)(struct mm_struct *mm, struct page *, | ||
| 757 | enum pt_level), | ||
| 758 | unsigned long limit) | ||
| 759 | { | ||
| 760 | return __xen_pgd_walk(mm, mm->pgd, func, limit); | ||
| 761 | } | ||
| 762 | |||
| 756 | /* If we're using split pte locks, then take the page's lock and | 763 | /* If we're using split pte locks, then take the page's lock and |
| 757 | return a pointer to it. Otherwise return NULL. */ | 764 | return a pointer to it. Otherwise return NULL. */ |
| 758 | static spinlock_t *xen_pte_lock(struct page *page, struct mm_struct *mm) | 765 | static spinlock_t *xen_pte_lock(struct page *page, struct mm_struct *mm) |
| @@ -854,7 +861,7 @@ static void __xen_pgd_pin(struct mm_struct *mm, pgd_t *pgd) | |||
| 854 | 861 | ||
| 855 | xen_mc_batch(); | 862 | xen_mc_batch(); |
| 856 | 863 | ||
| 857 | if (xen_pgd_walk(mm, xen_pin_page, USER_LIMIT)) { | 864 | if (__xen_pgd_walk(mm, pgd, xen_pin_page, USER_LIMIT)) { |
| 858 | /* re-enable interrupts for flushing */ | 865 | /* re-enable interrupts for flushing */ |
| 859 | xen_mc_issue(0); | 866 | xen_mc_issue(0); |
| 860 | 867 | ||
| @@ -998,7 +1005,7 @@ static void __xen_pgd_unpin(struct mm_struct *mm, pgd_t *pgd) | |||
| 998 | PT_PMD); | 1005 | PT_PMD); |
| 999 | #endif | 1006 | #endif |
| 1000 | 1007 | ||
| 1001 | xen_pgd_walk(mm, xen_unpin_page, USER_LIMIT); | 1008 | __xen_pgd_walk(mm, pgd, xen_unpin_page, USER_LIMIT); |
| 1002 | 1009 | ||
| 1003 | xen_mc_issue(0); | 1010 | xen_mc_issue(0); |
| 1004 | } | 1011 | } |
diff --git a/block/blk-map.c b/block/blk-map.c index 4849fa36161e..0f4b4b881811 100644 --- a/block/blk-map.c +++ b/block/blk-map.c | |||
| @@ -217,6 +217,12 @@ int blk_rq_map_user_iov(struct request_queue *q, struct request *rq, | |||
| 217 | return PTR_ERR(bio); | 217 | return PTR_ERR(bio); |
| 218 | 218 | ||
| 219 | if (bio->bi_size != len) { | 219 | if (bio->bi_size != len) { |
| 220 | /* | ||
| 221 | * Grab an extra reference to this bio, as bio_unmap_user() | ||
| 222 | * expects to be able to drop it twice as it happens on the | ||
| 223 | * normal IO completion path | ||
| 224 | */ | ||
| 225 | bio_get(bio); | ||
| 220 | bio_endio(bio, 0); | 226 | bio_endio(bio, 0); |
| 221 | bio_unmap_user(bio); | 227 | bio_unmap_user(bio); |
| 222 | return -EINVAL; | 228 | return -EINVAL; |
diff --git a/block/genhd.c b/block/genhd.c index 4e5e7493f676..27549e470da5 100644 --- a/block/genhd.c +++ b/block/genhd.c | |||
| @@ -768,6 +768,8 @@ static int __init genhd_device_init(void) | |||
| 768 | bdev_map = kobj_map_init(base_probe, &block_class_lock); | 768 | bdev_map = kobj_map_init(base_probe, &block_class_lock); |
| 769 | blk_dev_init(); | 769 | blk_dev_init(); |
| 770 | 770 | ||
| 771 | register_blkdev(BLOCK_EXT_MAJOR, "blkext"); | ||
| 772 | |||
| 771 | #ifndef CONFIG_SYSFS_DEPRECATED | 773 | #ifndef CONFIG_SYSFS_DEPRECATED |
| 772 | /* create top-level block dir */ | 774 | /* create top-level block dir */ |
| 773 | block_depr = kobject_create_and_add("block", NULL); | 775 | block_depr = kobject_create_and_add("block", NULL); |
diff --git a/block/ioctl.c b/block/ioctl.c index c832d639b6e2..d03985b04d67 100644 --- a/block/ioctl.c +++ b/block/ioctl.c | |||
| @@ -18,7 +18,6 @@ static int blkpg_ioctl(struct block_device *bdev, struct blkpg_ioctl_arg __user | |||
| 18 | struct disk_part_iter piter; | 18 | struct disk_part_iter piter; |
| 19 | long long start, length; | 19 | long long start, length; |
| 20 | int partno; | 20 | int partno; |
| 21 | int err; | ||
| 22 | 21 | ||
| 23 | if (!capable(CAP_SYS_ADMIN)) | 22 | if (!capable(CAP_SYS_ADMIN)) |
| 24 | return -EACCES; | 23 | return -EACCES; |
| @@ -61,10 +60,10 @@ static int blkpg_ioctl(struct block_device *bdev, struct blkpg_ioctl_arg __user | |||
| 61 | disk_part_iter_exit(&piter); | 60 | disk_part_iter_exit(&piter); |
| 62 | 61 | ||
| 63 | /* all seems OK */ | 62 | /* all seems OK */ |
| 64 | err = add_partition(disk, partno, start, length, | 63 | part = add_partition(disk, partno, start, length, |
| 65 | ADDPART_FLAG_NONE); | 64 | ADDPART_FLAG_NONE); |
| 66 | mutex_unlock(&bdev->bd_mutex); | 65 | mutex_unlock(&bdev->bd_mutex); |
| 67 | return err; | 66 | return IS_ERR(part) ? PTR_ERR(part) : 0; |
| 68 | case BLKPG_DEL_PARTITION: | 67 | case BLKPG_DEL_PARTITION: |
| 69 | part = disk_get_part(disk, partno); | 68 | part = disk_get_part(disk, partno); |
| 70 | if (!part) | 69 | if (!part) |
diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c index 12de1fdaa6c6..9364dc554257 100644 --- a/drivers/block/cciss.c +++ b/drivers/block/cciss.c | |||
| @@ -2847,7 +2847,7 @@ static void do_cciss_request(struct request_queue *q) | |||
| 2847 | h->maxSG = seg; | 2847 | h->maxSG = seg; |
| 2848 | 2848 | ||
| 2849 | #ifdef CCISS_DEBUG | 2849 | #ifdef CCISS_DEBUG |
| 2850 | printk(KERN_DEBUG "cciss: Submitting %d sectors in %d segments\n", | 2850 | printk(KERN_DEBUG "cciss: Submitting %lu sectors in %d segments\n", |
| 2851 | creq->nr_sectors, seg); | 2851 | creq->nr_sectors, seg); |
| 2852 | #endif /* CCISS_DEBUG */ | 2852 | #endif /* CCISS_DEBUG */ |
| 2853 | 2853 | ||
| @@ -3197,7 +3197,7 @@ static int __devinit cciss_pci_init(ctlr_info_t *c, struct pci_dev *pdev) | |||
| 3197 | 3197 | ||
| 3198 | c->paddr = pci_resource_start(pdev, 0); /* addressing mode bits already removed */ | 3198 | c->paddr = pci_resource_start(pdev, 0); /* addressing mode bits already removed */ |
| 3199 | #ifdef CCISS_DEBUG | 3199 | #ifdef CCISS_DEBUG |
| 3200 | printk("address 0 = %x\n", c->paddr); | 3200 | printk("address 0 = %lx\n", c->paddr); |
| 3201 | #endif /* CCISS_DEBUG */ | 3201 | #endif /* CCISS_DEBUG */ |
| 3202 | c->vaddr = remap_pci_mem(c->paddr, 0x250); | 3202 | c->vaddr = remap_pci_mem(c->paddr, 0x250); |
| 3203 | 3203 | ||
| @@ -3224,7 +3224,8 @@ static int __devinit cciss_pci_init(ctlr_info_t *c, struct pci_dev *pdev) | |||
| 3224 | #endif /* CCISS_DEBUG */ | 3224 | #endif /* CCISS_DEBUG */ |
| 3225 | cfg_base_addr_index = find_PCI_BAR_index(pdev, cfg_base_addr); | 3225 | cfg_base_addr_index = find_PCI_BAR_index(pdev, cfg_base_addr); |
| 3226 | #ifdef CCISS_DEBUG | 3226 | #ifdef CCISS_DEBUG |
| 3227 | printk("cfg base address index = %x\n", cfg_base_addr_index); | 3227 | printk("cfg base address index = %llx\n", |
| 3228 | (unsigned long long)cfg_base_addr_index); | ||
| 3228 | #endif /* CCISS_DEBUG */ | 3229 | #endif /* CCISS_DEBUG */ |
| 3229 | if (cfg_base_addr_index == -1) { | 3230 | if (cfg_base_addr_index == -1) { |
| 3230 | printk(KERN_WARNING "cciss: Cannot find cfg_base_addr_index\n"); | 3231 | printk(KERN_WARNING "cciss: Cannot find cfg_base_addr_index\n"); |
| @@ -3234,7 +3235,7 @@ static int __devinit cciss_pci_init(ctlr_info_t *c, struct pci_dev *pdev) | |||
| 3234 | 3235 | ||
| 3235 | cfg_offset = readl(c->vaddr + SA5_CTMEM_OFFSET); | 3236 | cfg_offset = readl(c->vaddr + SA5_CTMEM_OFFSET); |
| 3236 | #ifdef CCISS_DEBUG | 3237 | #ifdef CCISS_DEBUG |
| 3237 | printk("cfg offset = %x\n", cfg_offset); | 3238 | printk("cfg offset = %llx\n", (unsigned long long)cfg_offset); |
| 3238 | #endif /* CCISS_DEBUG */ | 3239 | #endif /* CCISS_DEBUG */ |
| 3239 | c->cfgtable = remap_pci_mem(pci_resource_start(pdev, | 3240 | c->cfgtable = remap_pci_mem(pci_resource_start(pdev, |
| 3240 | cfg_base_addr_index) + | 3241 | cfg_base_addr_index) + |
diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c index b220c686089d..2d19f0cc47f2 100644 --- a/drivers/block/xen-blkfront.c +++ b/drivers/block/xen-blkfront.c | |||
| @@ -338,12 +338,18 @@ wait: | |||
| 338 | static int xlvbd_init_blk_queue(struct gendisk *gd, u16 sector_size) | 338 | static int xlvbd_init_blk_queue(struct gendisk *gd, u16 sector_size) |
| 339 | { | 339 | { |
| 340 | struct request_queue *rq; | 340 | struct request_queue *rq; |
| 341 | elevator_t *old_e; | ||
| 341 | 342 | ||
| 342 | rq = blk_init_queue(do_blkif_request, &blkif_io_lock); | 343 | rq = blk_init_queue(do_blkif_request, &blkif_io_lock); |
| 343 | if (rq == NULL) | 344 | if (rq == NULL) |
| 344 | return -1; | 345 | return -1; |
| 345 | 346 | ||
| 346 | elevator_init(rq, "noop"); | 347 | old_e = rq->elevator; |
| 348 | if (IS_ERR_VALUE(elevator_init(rq, "noop"))) | ||
| 349 | printk(KERN_WARNING | ||
| 350 | "blkfront: Switch elevator failed, use default\n"); | ||
| 351 | else | ||
| 352 | elevator_exit(old_e); | ||
| 347 | 353 | ||
| 348 | /* Hard sector size and max sectors impersonate the equiv. hardware. */ | 354 | /* Hard sector size and max sectors impersonate the equiv. hardware. */ |
| 349 | blk_queue_hardsect_size(rq, sector_size); | 355 | blk_queue_hardsect_size(rq, sector_size); |
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index faa1cc66e9cf..82020abc329e 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c | |||
| @@ -1134,7 +1134,7 @@ static void gpiolib_dbg_show(struct seq_file *s, struct gpio_chip *chip) | |||
| 1134 | continue; | 1134 | continue; |
| 1135 | 1135 | ||
| 1136 | is_out = test_bit(FLAG_IS_OUT, &gdesc->flags); | 1136 | is_out = test_bit(FLAG_IS_OUT, &gdesc->flags); |
| 1137 | seq_printf(s, " gpio-%-3d (%-12s) %s %s", | 1137 | seq_printf(s, " gpio-%-3d (%-20.20s) %s %s", |
| 1138 | gpio, gdesc->label, | 1138 | gpio, gdesc->label, |
| 1139 | is_out ? "out" : "in ", | 1139 | is_out ? "out" : "in ", |
| 1140 | chip->get | 1140 | chip->get |
diff --git a/drivers/hwmon/applesmc.c b/drivers/hwmon/applesmc.c index 488e45cd43d7..f7dce8b9f64b 100644 --- a/drivers/hwmon/applesmc.c +++ b/drivers/hwmon/applesmc.c | |||
| @@ -128,6 +128,9 @@ static const char* temperature_sensors_sets[][36] = { | |||
| 128 | /* Set 13: iMac 8,1 */ | 128 | /* Set 13: iMac 8,1 */ |
| 129 | { "TA0P", "TC0D", "TC0H", "TC0P", "TG0D", "TG0H", "TG0P", "TH0P", | 129 | { "TA0P", "TC0D", "TC0H", "TC0P", "TG0D", "TG0H", "TG0P", "TH0P", |
| 130 | "TL0P", "TO0P", "TW0P", "Tm0P", "Tp0P", NULL }, | 130 | "TL0P", "TO0P", "TW0P", "Tm0P", "Tp0P", NULL }, |
| 131 | /* Set 14: iMac 6,1 */ | ||
| 132 | { "TA0P", "TC0D", "TC0H", "TC0P", "TG0D", "TG0H", "TG0P", "TH0P", | ||
| 133 | "TO0P", "Tp0P", NULL }, | ||
| 131 | }; | 134 | }; |
| 132 | 135 | ||
| 133 | /* List of keys used to read/write fan speeds */ | 136 | /* List of keys used to read/write fan speeds */ |
| @@ -1296,6 +1299,8 @@ static __initdata struct dmi_match_data applesmc_dmi_data[] = { | |||
| 1296 | { .accelerometer = 1, .light = 1, .temperature_set = 12 }, | 1299 | { .accelerometer = 1, .light = 1, .temperature_set = 12 }, |
| 1297 | /* iMac 8: light sensor only, temperature set 13 */ | 1300 | /* iMac 8: light sensor only, temperature set 13 */ |
| 1298 | { .accelerometer = 0, .light = 0, .temperature_set = 13 }, | 1301 | { .accelerometer = 0, .light = 0, .temperature_set = 13 }, |
| 1302 | /* iMac 6: light sensor only, temperature set 14 */ | ||
| 1303 | { .accelerometer = 0, .light = 0, .temperature_set = 14 }, | ||
| 1299 | }; | 1304 | }; |
| 1300 | 1305 | ||
| 1301 | /* Note that DMI_MATCH(...,"MacBook") will match "MacBookPro1,1". | 1306 | /* Note that DMI_MATCH(...,"MacBook") will match "MacBookPro1,1". |
| @@ -1349,10 +1354,18 @@ static __initdata struct dmi_system_id applesmc_whitelist[] = { | |||
| 1349 | DMI_MATCH(DMI_BOARD_VENDOR,"Apple"), | 1354 | DMI_MATCH(DMI_BOARD_VENDOR,"Apple"), |
| 1350 | DMI_MATCH(DMI_PRODUCT_NAME,"MacPro2") }, | 1355 | DMI_MATCH(DMI_PRODUCT_NAME,"MacPro2") }, |
| 1351 | &applesmc_dmi_data[4]}, | 1356 | &applesmc_dmi_data[4]}, |
| 1357 | { applesmc_dmi_match, "Apple MacPro", { | ||
| 1358 | DMI_MATCH(DMI_BOARD_VENDOR, "Apple"), | ||
| 1359 | DMI_MATCH(DMI_PRODUCT_NAME, "MacPro") }, | ||
| 1360 | &applesmc_dmi_data[4]}, | ||
| 1352 | { applesmc_dmi_match, "Apple iMac 8", { | 1361 | { applesmc_dmi_match, "Apple iMac 8", { |
| 1353 | DMI_MATCH(DMI_BOARD_VENDOR, "Apple"), | 1362 | DMI_MATCH(DMI_BOARD_VENDOR, "Apple"), |
| 1354 | DMI_MATCH(DMI_PRODUCT_NAME, "iMac8") }, | 1363 | DMI_MATCH(DMI_PRODUCT_NAME, "iMac8") }, |
| 1355 | &applesmc_dmi_data[13]}, | 1364 | &applesmc_dmi_data[13]}, |
| 1365 | { applesmc_dmi_match, "Apple iMac 6", { | ||
| 1366 | DMI_MATCH(DMI_BOARD_VENDOR, "Apple"), | ||
| 1367 | DMI_MATCH(DMI_PRODUCT_NAME, "iMac6") }, | ||
| 1368 | &applesmc_dmi_data[14]}, | ||
| 1356 | { applesmc_dmi_match, "Apple iMac 5", { | 1369 | { applesmc_dmi_match, "Apple iMac 5", { |
| 1357 | DMI_MATCH(DMI_BOARD_VENDOR, "Apple"), | 1370 | DMI_MATCH(DMI_BOARD_VENDOR, "Apple"), |
| 1358 | DMI_MATCH(DMI_PRODUCT_NAME, "iMac5") }, | 1371 | DMI_MATCH(DMI_PRODUCT_NAME, "iMac5") }, |
diff --git a/drivers/misc/sgi-gru/Makefile b/drivers/misc/sgi-gru/Makefile index d03597a521b0..9e9170b3599a 100644 --- a/drivers/misc/sgi-gru/Makefile +++ b/drivers/misc/sgi-gru/Makefile | |||
| @@ -1,3 +1,7 @@ | |||
| 1 | ifdef CONFIG_SGI_GRU_DEBUG | ||
| 2 | EXTRA_CFLAGS += -DDEBUG | ||
| 3 | endif | ||
| 4 | |||
| 1 | obj-$(CONFIG_SGI_GRU) := gru.o | 5 | obj-$(CONFIG_SGI_GRU) := gru.o |
| 2 | gru-y := grufile.o grumain.o grufault.o grutlbpurge.o gruprocfs.o grukservices.o | 6 | gru-y := grufile.o grumain.o grufault.o grutlbpurge.o gruprocfs.o grukservices.o |
| 3 | 7 | ||
diff --git a/drivers/net/atlx/atl2.c b/drivers/net/atlx/atl2.c index f5bdc92c1a65..8571e8c0bc67 100644 --- a/drivers/net/atlx/atl2.c +++ b/drivers/net/atlx/atl2.c | |||
| @@ -1690,9 +1690,11 @@ static int atl2_resume(struct pci_dev *pdev) | |||
| 1690 | 1690 | ||
| 1691 | ATL2_WRITE_REG(&adapter->hw, REG_WOL_CTRL, 0); | 1691 | ATL2_WRITE_REG(&adapter->hw, REG_WOL_CTRL, 0); |
| 1692 | 1692 | ||
| 1693 | err = atl2_request_irq(adapter); | 1693 | if (netif_running(netdev)) { |
| 1694 | if (netif_running(netdev) && err) | 1694 | err = atl2_request_irq(adapter); |
| 1695 | return err; | 1695 | if (err) |
| 1696 | return err; | ||
| 1697 | } | ||
| 1696 | 1698 | ||
| 1697 | atl2_reset_hw(&adapter->hw); | 1699 | atl2_reset_hw(&adapter->hw); |
| 1698 | 1700 | ||
diff --git a/drivers/net/ipg.c b/drivers/net/ipg.c index 7373dafbb3f7..059369885be1 100644 --- a/drivers/net/ipg.c +++ b/drivers/net/ipg.c | |||
| @@ -1112,7 +1112,7 @@ static void ipg_nic_rx_free_skb(struct net_device *dev) | |||
| 1112 | struct ipg_rx *rxfd = sp->rxd + entry; | 1112 | struct ipg_rx *rxfd = sp->rxd + entry; |
| 1113 | 1113 | ||
| 1114 | pci_unmap_single(sp->pdev, | 1114 | pci_unmap_single(sp->pdev, |
| 1115 | le64_to_cpu(rxfd->frag_info & ~IPG_RFI_FRAGLEN), | 1115 | le64_to_cpu(rxfd->frag_info) & ~IPG_RFI_FRAGLEN, |
| 1116 | sp->rx_buf_sz, PCI_DMA_FROMDEVICE); | 1116 | sp->rx_buf_sz, PCI_DMA_FROMDEVICE); |
| 1117 | dev_kfree_skb_irq(sp->rx_buff[entry]); | 1117 | dev_kfree_skb_irq(sp->rx_buff[entry]); |
| 1118 | sp->rx_buff[entry] = NULL; | 1118 | sp->rx_buff[entry] = NULL; |
| @@ -1179,7 +1179,7 @@ static int ipg_nic_rx_check_error(struct net_device *dev) | |||
| 1179 | */ | 1179 | */ |
| 1180 | if (sp->rx_buff[entry]) { | 1180 | if (sp->rx_buff[entry]) { |
| 1181 | pci_unmap_single(sp->pdev, | 1181 | pci_unmap_single(sp->pdev, |
| 1182 | le64_to_cpu(rxfd->frag_info & ~IPG_RFI_FRAGLEN), | 1182 | le64_to_cpu(rxfd->frag_info) & ~IPG_RFI_FRAGLEN, |
| 1183 | sp->rx_buf_sz, PCI_DMA_FROMDEVICE); | 1183 | sp->rx_buf_sz, PCI_DMA_FROMDEVICE); |
| 1184 | 1184 | ||
| 1185 | dev_kfree_skb_irq(sp->rx_buff[entry]); | 1185 | dev_kfree_skb_irq(sp->rx_buff[entry]); |
| @@ -1246,7 +1246,7 @@ static void ipg_nic_rx_with_start(struct net_device *dev, | |||
| 1246 | if (jumbo->found_start) | 1246 | if (jumbo->found_start) |
| 1247 | dev_kfree_skb_irq(jumbo->skb); | 1247 | dev_kfree_skb_irq(jumbo->skb); |
| 1248 | 1248 | ||
| 1249 | pci_unmap_single(pdev, le64_to_cpu(rxfd->frag_info & ~IPG_RFI_FRAGLEN), | 1249 | pci_unmap_single(pdev, le64_to_cpu(rxfd->frag_info) & ~IPG_RFI_FRAGLEN, |
| 1250 | sp->rx_buf_sz, PCI_DMA_FROMDEVICE); | 1250 | sp->rx_buf_sz, PCI_DMA_FROMDEVICE); |
| 1251 | 1251 | ||
| 1252 | skb_put(skb, sp->rxfrag_size); | 1252 | skb_put(skb, sp->rxfrag_size); |
| @@ -1349,7 +1349,7 @@ static int ipg_nic_rx_jumbo(struct net_device *dev) | |||
| 1349 | unsigned int entry = curr % IPG_RFDLIST_LENGTH; | 1349 | unsigned int entry = curr % IPG_RFDLIST_LENGTH; |
| 1350 | struct ipg_rx *rxfd = sp->rxd + entry; | 1350 | struct ipg_rx *rxfd = sp->rxd + entry; |
| 1351 | 1351 | ||
| 1352 | if (!(rxfd->rfs & le64_to_cpu(IPG_RFS_RFDDONE))) | 1352 | if (!(rxfd->rfs & cpu_to_le64(IPG_RFS_RFDDONE))) |
| 1353 | break; | 1353 | break; |
| 1354 | 1354 | ||
| 1355 | switch (ipg_nic_rx_check_frame_type(dev)) { | 1355 | switch (ipg_nic_rx_check_frame_type(dev)) { |
diff --git a/drivers/net/ixgbe/ixgbe_main.c b/drivers/net/ixgbe/ixgbe_main.c index 7548fb7360d9..36f2bb666bf7 100644 --- a/drivers/net/ixgbe/ixgbe_main.c +++ b/drivers/net/ixgbe/ixgbe_main.c | |||
| @@ -1287,7 +1287,34 @@ static void ixgbe_set_itr(struct ixgbe_adapter *adapter) | |||
| 1287 | return; | 1287 | return; |
| 1288 | } | 1288 | } |
| 1289 | 1289 | ||
| 1290 | static inline void ixgbe_irq_enable(struct ixgbe_adapter *adapter); | 1290 | /** |
| 1291 | * ixgbe_irq_disable - Mask off interrupt generation on the NIC | ||
| 1292 | * @adapter: board private structure | ||
| 1293 | **/ | ||
| 1294 | static inline void ixgbe_irq_disable(struct ixgbe_adapter *adapter) | ||
| 1295 | { | ||
| 1296 | IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC, ~0); | ||
| 1297 | IXGBE_WRITE_FLUSH(&adapter->hw); | ||
| 1298 | if (adapter->flags & IXGBE_FLAG_MSIX_ENABLED) { | ||
| 1299 | int i; | ||
| 1300 | for (i = 0; i < adapter->num_msix_vectors; i++) | ||
| 1301 | synchronize_irq(adapter->msix_entries[i].vector); | ||
| 1302 | } else { | ||
| 1303 | synchronize_irq(adapter->pdev->irq); | ||
| 1304 | } | ||
| 1305 | } | ||
| 1306 | |||
| 1307 | /** | ||
| 1308 | * ixgbe_irq_enable - Enable default interrupt generation settings | ||
| 1309 | * @adapter: board private structure | ||
| 1310 | **/ | ||
| 1311 | static inline void ixgbe_irq_enable(struct ixgbe_adapter *adapter) | ||
| 1312 | { | ||
| 1313 | u32 mask; | ||
| 1314 | mask = IXGBE_EIMS_ENABLE_MASK; | ||
| 1315 | IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMS, mask); | ||
| 1316 | IXGBE_WRITE_FLUSH(&adapter->hw); | ||
| 1317 | } | ||
| 1291 | 1318 | ||
| 1292 | /** | 1319 | /** |
| 1293 | * ixgbe_intr - legacy mode Interrupt Handler | 1320 | * ixgbe_intr - legacy mode Interrupt Handler |
| @@ -1394,35 +1421,6 @@ static void ixgbe_free_irq(struct ixgbe_adapter *adapter) | |||
| 1394 | } | 1421 | } |
| 1395 | 1422 | ||
| 1396 | /** | 1423 | /** |
| 1397 | * ixgbe_irq_disable - Mask off interrupt generation on the NIC | ||
| 1398 | * @adapter: board private structure | ||
| 1399 | **/ | ||
| 1400 | static inline void ixgbe_irq_disable(struct ixgbe_adapter *adapter) | ||
| 1401 | { | ||
| 1402 | IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC, ~0); | ||
| 1403 | IXGBE_WRITE_FLUSH(&adapter->hw); | ||
| 1404 | if (adapter->flags & IXGBE_FLAG_MSIX_ENABLED) { | ||
| 1405 | int i; | ||
| 1406 | for (i = 0; i < adapter->num_msix_vectors; i++) | ||
| 1407 | synchronize_irq(adapter->msix_entries[i].vector); | ||
| 1408 | } else { | ||
| 1409 | synchronize_irq(adapter->pdev->irq); | ||
| 1410 | } | ||
| 1411 | } | ||
| 1412 | |||
| 1413 | /** | ||
| 1414 | * ixgbe_irq_enable - Enable default interrupt generation settings | ||
| 1415 | * @adapter: board private structure | ||
| 1416 | **/ | ||
| 1417 | static inline void ixgbe_irq_enable(struct ixgbe_adapter *adapter) | ||
| 1418 | { | ||
| 1419 | u32 mask; | ||
| 1420 | mask = IXGBE_EIMS_ENABLE_MASK; | ||
| 1421 | IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMS, mask); | ||
| 1422 | IXGBE_WRITE_FLUSH(&adapter->hw); | ||
| 1423 | } | ||
| 1424 | |||
| 1425 | /** | ||
| 1426 | * ixgbe_configure_msi_and_legacy - Initialize PIN (INTA...) and MSI interrupts | 1424 | * ixgbe_configure_msi_and_legacy - Initialize PIN (INTA...) and MSI interrupts |
| 1427 | * | 1425 | * |
| 1428 | **/ | 1426 | **/ |
diff --git a/drivers/net/jme.c b/drivers/net/jme.c index 81c6cdc3851f..665e70d620fc 100644 --- a/drivers/net/jme.c +++ b/drivers/net/jme.c | |||
| @@ -912,23 +912,23 @@ jme_alloc_and_feed_skb(struct jme_adapter *jme, int idx) | |||
| 912 | skb_put(skb, framesize); | 912 | skb_put(skb, framesize); |
| 913 | skb->protocol = eth_type_trans(skb, jme->dev); | 913 | skb->protocol = eth_type_trans(skb, jme->dev); |
| 914 | 914 | ||
| 915 | if (jme_rxsum_ok(jme, rxdesc->descwb.flags)) | 915 | if (jme_rxsum_ok(jme, le16_to_cpu(rxdesc->descwb.flags))) |
| 916 | skb->ip_summed = CHECKSUM_UNNECESSARY; | 916 | skb->ip_summed = CHECKSUM_UNNECESSARY; |
| 917 | else | 917 | else |
| 918 | skb->ip_summed = CHECKSUM_NONE; | 918 | skb->ip_summed = CHECKSUM_NONE; |
| 919 | 919 | ||
| 920 | if (rxdesc->descwb.flags & RXWBFLAG_TAGON) { | 920 | if (rxdesc->descwb.flags & cpu_to_le16(RXWBFLAG_TAGON)) { |
| 921 | if (jme->vlgrp) { | 921 | if (jme->vlgrp) { |
| 922 | jme->jme_vlan_rx(skb, jme->vlgrp, | 922 | jme->jme_vlan_rx(skb, jme->vlgrp, |
| 923 | le32_to_cpu(rxdesc->descwb.vlan)); | 923 | le16_to_cpu(rxdesc->descwb.vlan)); |
| 924 | NET_STAT(jme).rx_bytes += 4; | 924 | NET_STAT(jme).rx_bytes += 4; |
| 925 | } | 925 | } |
| 926 | } else { | 926 | } else { |
| 927 | jme->jme_rx(skb); | 927 | jme->jme_rx(skb); |
| 928 | } | 928 | } |
| 929 | 929 | ||
| 930 | if ((le16_to_cpu(rxdesc->descwb.flags) & RXWBFLAG_DEST) == | 930 | if ((rxdesc->descwb.flags & cpu_to_le16(RXWBFLAG_DEST)) == |
| 931 | RXWBFLAG_DEST_MUL) | 931 | cpu_to_le16(RXWBFLAG_DEST_MUL)) |
| 932 | ++(NET_STAT(jme).multicast); | 932 | ++(NET_STAT(jme).multicast); |
| 933 | 933 | ||
| 934 | jme->dev->last_rx = jiffies; | 934 | jme->dev->last_rx = jiffies; |
| @@ -961,7 +961,7 @@ jme_process_receive(struct jme_adapter *jme, int limit) | |||
| 961 | rxdesc = rxring->desc; | 961 | rxdesc = rxring->desc; |
| 962 | rxdesc += i; | 962 | rxdesc += i; |
| 963 | 963 | ||
| 964 | if ((rxdesc->descwb.flags & RXWBFLAG_OWN) || | 964 | if ((rxdesc->descwb.flags & cpu_to_le16(RXWBFLAG_OWN)) || |
| 965 | !(rxdesc->descwb.desccnt & RXWBDCNT_WBCPL)) | 965 | !(rxdesc->descwb.desccnt & RXWBDCNT_WBCPL)) |
| 966 | goto out; | 966 | goto out; |
| 967 | 967 | ||
| @@ -1763,10 +1763,9 @@ jme_expand_header(struct jme_adapter *jme, struct sk_buff *skb) | |||
| 1763 | } | 1763 | } |
| 1764 | 1764 | ||
| 1765 | static int | 1765 | static int |
| 1766 | jme_tx_tso(struct sk_buff *skb, | 1766 | jme_tx_tso(struct sk_buff *skb, __le16 *mss, u8 *flags) |
| 1767 | u16 *mss, u8 *flags) | ||
| 1768 | { | 1767 | { |
| 1769 | *mss = skb_shinfo(skb)->gso_size << TXDESC_MSS_SHIFT; | 1768 | *mss = cpu_to_le16(skb_shinfo(skb)->gso_size << TXDESC_MSS_SHIFT); |
| 1770 | if (*mss) { | 1769 | if (*mss) { |
| 1771 | *flags |= TXFLAG_LSEN; | 1770 | *flags |= TXFLAG_LSEN; |
| 1772 | 1771 | ||
| @@ -1826,11 +1825,11 @@ jme_tx_csum(struct jme_adapter *jme, struct sk_buff *skb, u8 *flags) | |||
| 1826 | } | 1825 | } |
| 1827 | 1826 | ||
| 1828 | static inline void | 1827 | static inline void |
| 1829 | jme_tx_vlan(struct sk_buff *skb, u16 *vlan, u8 *flags) | 1828 | jme_tx_vlan(struct sk_buff *skb, __le16 *vlan, u8 *flags) |
| 1830 | { | 1829 | { |
| 1831 | if (vlan_tx_tag_present(skb)) { | 1830 | if (vlan_tx_tag_present(skb)) { |
| 1832 | *flags |= TXFLAG_TAGON; | 1831 | *flags |= TXFLAG_TAGON; |
| 1833 | *vlan = vlan_tx_tag_get(skb); | 1832 | *vlan = cpu_to_le16(vlan_tx_tag_get(skb)); |
| 1834 | } | 1833 | } |
| 1835 | } | 1834 | } |
| 1836 | 1835 | ||
diff --git a/drivers/net/mv643xx_eth.c b/drivers/net/mv643xx_eth.c index b9dcdbd369f8..e513f76f2a9f 100644 --- a/drivers/net/mv643xx_eth.c +++ b/drivers/net/mv643xx_eth.c | |||
| @@ -899,7 +899,8 @@ static int txq_reclaim(struct tx_queue *txq, int budget, int force) | |||
| 899 | if (skb != NULL) { | 899 | if (skb != NULL) { |
| 900 | if (skb_queue_len(&mp->rx_recycle) < | 900 | if (skb_queue_len(&mp->rx_recycle) < |
| 901 | mp->default_rx_ring_size && | 901 | mp->default_rx_ring_size && |
| 902 | skb_recycle_check(skb, mp->skb_size)) | 902 | skb_recycle_check(skb, mp->skb_size + |
| 903 | dma_get_cache_alignment() - 1)) | ||
| 903 | __skb_queue_head(&mp->rx_recycle, skb); | 904 | __skb_queue_head(&mp->rx_recycle, skb); |
| 904 | else | 905 | else |
| 905 | dev_kfree_skb(skb); | 906 | dev_kfree_skb(skb); |
| @@ -2435,8 +2436,8 @@ static int mv643xx_eth_shared_remove(struct platform_device *pdev) | |||
| 2435 | struct mv643xx_eth_shared_platform_data *pd = pdev->dev.platform_data; | 2436 | struct mv643xx_eth_shared_platform_data *pd = pdev->dev.platform_data; |
| 2436 | 2437 | ||
| 2437 | if (pd == NULL || pd->shared_smi == NULL) { | 2438 | if (pd == NULL || pd->shared_smi == NULL) { |
| 2438 | mdiobus_free(msp->smi_bus); | ||
| 2439 | mdiobus_unregister(msp->smi_bus); | 2439 | mdiobus_unregister(msp->smi_bus); |
| 2440 | mdiobus_free(msp->smi_bus); | ||
| 2440 | } | 2441 | } |
| 2441 | if (msp->err_interrupt != NO_IRQ) | 2442 | if (msp->err_interrupt != NO_IRQ) |
| 2442 | free_irq(msp->err_interrupt, msp); | 2443 | free_irq(msp->err_interrupt, msp); |
diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c index 8fb1faca883a..55bc24b234e3 100644 --- a/drivers/net/phy/phy_device.c +++ b/drivers/net/phy/phy_device.c | |||
| @@ -564,20 +564,32 @@ EXPORT_SYMBOL(genphy_restart_aneg); | |||
| 564 | */ | 564 | */ |
| 565 | int genphy_config_aneg(struct phy_device *phydev) | 565 | int genphy_config_aneg(struct phy_device *phydev) |
| 566 | { | 566 | { |
| 567 | int result = 0; | 567 | int result; |
| 568 | 568 | ||
| 569 | if (AUTONEG_ENABLE == phydev->autoneg) { | 569 | if (AUTONEG_ENABLE != phydev->autoneg) |
| 570 | int result = genphy_config_advert(phydev); | 570 | return genphy_setup_forced(phydev); |
| 571 | |||
| 572 | result = genphy_config_advert(phydev); | ||
| 573 | |||
| 574 | if (result < 0) /* error */ | ||
| 575 | return result; | ||
| 571 | 576 | ||
| 572 | if (result < 0) /* error */ | 577 | if (result == 0) { |
| 573 | return result; | 578 | /* Advertisment hasn't changed, but maybe aneg was never on to |
| 579 | * begin with? Or maybe phy was isolated? */ | ||
| 580 | int ctl = phy_read(phydev, MII_BMCR); | ||
| 581 | |||
| 582 | if (ctl < 0) | ||
| 583 | return ctl; | ||
| 584 | |||
| 585 | if (!(ctl & BMCR_ANENABLE) || (ctl & BMCR_ISOLATE)) | ||
| 586 | result = 1; /* do restart aneg */ | ||
| 587 | } | ||
| 574 | 588 | ||
| 575 | /* Only restart aneg if we are advertising something different | 589 | /* Only restart aneg if we are advertising something different |
| 576 | * than we were before. */ | 590 | * than we were before. */ |
| 577 | if (result > 0) | 591 | if (result > 0) |
| 578 | result = genphy_restart_aneg(phydev); | 592 | result = genphy_restart_aneg(phydev); |
| 579 | } else | ||
| 580 | result = genphy_setup_forced(phydev); | ||
| 581 | 593 | ||
| 582 | return result; | 594 | return result; |
| 583 | } | 595 | } |
diff --git a/drivers/net/sh_eth.c b/drivers/net/sh_eth.c index a24bb68887ab..59f242a67714 100644 --- a/drivers/net/sh_eth.c +++ b/drivers/net/sh_eth.c | |||
| @@ -927,7 +927,7 @@ static int sh_eth_start_xmit(struct sk_buff *skb, struct net_device *ndev) | |||
| 927 | struct sh_eth_private *mdp = netdev_priv(ndev); | 927 | struct sh_eth_private *mdp = netdev_priv(ndev); |
| 928 | struct sh_eth_txdesc *txdesc; | 928 | struct sh_eth_txdesc *txdesc; |
| 929 | u32 entry; | 929 | u32 entry; |
| 930 | int flags; | 930 | unsigned long flags; |
| 931 | 931 | ||
| 932 | spin_lock_irqsave(&mdp->lock, flags); | 932 | spin_lock_irqsave(&mdp->lock, flags); |
| 933 | if ((mdp->cur_tx - mdp->dirty_tx) >= (TX_RING_SIZE - 4)) { | 933 | if ((mdp->cur_tx - mdp->dirty_tx) >= (TX_RING_SIZE - 4)) { |
| @@ -1141,7 +1141,7 @@ static int sh_mdio_init(struct net_device *ndev, int id) | |||
| 1141 | /* Hook up MII support for ethtool */ | 1141 | /* Hook up MII support for ethtool */ |
| 1142 | mdp->mii_bus->name = "sh_mii"; | 1142 | mdp->mii_bus->name = "sh_mii"; |
| 1143 | mdp->mii_bus->parent = &ndev->dev; | 1143 | mdp->mii_bus->parent = &ndev->dev; |
| 1144 | mdp->mii_bus->id[0] = id; | 1144 | snprintf(mdp->mii_bus->id, MII_BUS_ID_SIZE, "%x", id); |
| 1145 | 1145 | ||
| 1146 | /* PHY IRQ */ | 1146 | /* PHY IRQ */ |
| 1147 | mdp->mii_bus->irq = kmalloc(sizeof(int)*PHY_MAX_ADDR, GFP_KERNEL); | 1147 | mdp->mii_bus->irq = kmalloc(sizeof(int)*PHY_MAX_ADDR, GFP_KERNEL); |
diff --git a/drivers/net/smc911x.c b/drivers/net/smc911x.c index 1f26ab0e7986..b185cd12269c 100644 --- a/drivers/net/smc911x.c +++ b/drivers/net/smc911x.c | |||
| @@ -1813,7 +1813,7 @@ static int __init smc911x_probe(struct net_device *dev) | |||
| 1813 | val = SMC_GET_BYTE_TEST(lp); | 1813 | val = SMC_GET_BYTE_TEST(lp); |
| 1814 | DBG(SMC_DEBUG_MISC, "%s: endian probe returned 0x%04x\n", CARDNAME, val); | 1814 | DBG(SMC_DEBUG_MISC, "%s: endian probe returned 0x%04x\n", CARDNAME, val); |
| 1815 | if (val != 0x87654321) { | 1815 | if (val != 0x87654321) { |
| 1816 | printk(KERN_ERR "Invalid chip endian 0x08%x\n",val); | 1816 | printk(KERN_ERR "Invalid chip endian 0x%08x\n",val); |
| 1817 | retval = -ENODEV; | 1817 | retval = -ENODEV; |
| 1818 | goto err_out; | 1818 | goto err_out; |
| 1819 | } | 1819 | } |
diff --git a/drivers/net/usb/asix.c b/drivers/net/usb/asix.c index e12cdb4543b4..de57490103fc 100644 --- a/drivers/net/usb/asix.c +++ b/drivers/net/usb/asix.c | |||
| @@ -1102,12 +1102,14 @@ static int ax88178_link_reset(struct usbnet *dev) | |||
| 1102 | mode = AX88178_MEDIUM_DEFAULT; | 1102 | mode = AX88178_MEDIUM_DEFAULT; |
| 1103 | 1103 | ||
| 1104 | if (ecmd.speed == SPEED_1000) | 1104 | if (ecmd.speed == SPEED_1000) |
| 1105 | mode |= AX_MEDIUM_GM | AX_MEDIUM_ENCK; | 1105 | mode |= AX_MEDIUM_GM; |
| 1106 | else if (ecmd.speed == SPEED_100) | 1106 | else if (ecmd.speed == SPEED_100) |
| 1107 | mode |= AX_MEDIUM_PS; | 1107 | mode |= AX_MEDIUM_PS; |
| 1108 | else | 1108 | else |
| 1109 | mode &= ~(AX_MEDIUM_PS | AX_MEDIUM_GM); | 1109 | mode &= ~(AX_MEDIUM_PS | AX_MEDIUM_GM); |
| 1110 | 1110 | ||
| 1111 | mode |= AX_MEDIUM_ENCK; | ||
| 1112 | |||
| 1111 | if (ecmd.duplex == DUPLEX_FULL) | 1113 | if (ecmd.duplex == DUPLEX_FULL) |
| 1112 | mode |= AX_MEDIUM_FD; | 1114 | mode |= AX_MEDIUM_FD; |
| 1113 | else | 1115 | else |
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c index 8d690a0eb1a9..444c5cc05f03 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn.c | |||
| @@ -1384,7 +1384,7 @@ void iwl_rx_handle(struct iwl_priv *priv) | |||
| 1384 | 1384 | ||
| 1385 | rxq->queue[i] = NULL; | 1385 | rxq->queue[i] = NULL; |
| 1386 | 1386 | ||
| 1387 | pci_dma_sync_single_for_cpu(priv->pci_dev, rxb->dma_addr, | 1387 | pci_dma_sync_single_for_cpu(priv->pci_dev, rxb->aligned_dma_addr, |
| 1388 | priv->hw_params.rx_buf_size, | 1388 | priv->hw_params.rx_buf_size, |
| 1389 | PCI_DMA_FROMDEVICE); | 1389 | PCI_DMA_FROMDEVICE); |
| 1390 | pkt = (struct iwl_rx_packet *)rxb->skb->data; | 1390 | pkt = (struct iwl_rx_packet *)rxb->skb->data; |
| @@ -1436,8 +1436,8 @@ void iwl_rx_handle(struct iwl_priv *priv) | |||
| 1436 | rxb->skb = NULL; | 1436 | rxb->skb = NULL; |
| 1437 | } | 1437 | } |
| 1438 | 1438 | ||
| 1439 | pci_unmap_single(priv->pci_dev, rxb->dma_addr, | 1439 | pci_unmap_single(priv->pci_dev, rxb->real_dma_addr, |
| 1440 | priv->hw_params.rx_buf_size, | 1440 | priv->hw_params.rx_buf_size + 256, |
| 1441 | PCI_DMA_FROMDEVICE); | 1441 | PCI_DMA_FROMDEVICE); |
| 1442 | spin_lock_irqsave(&rxq->lock, flags); | 1442 | spin_lock_irqsave(&rxq->lock, flags); |
| 1443 | list_add_tail(&rxb->list, &priv->rxq.rx_used); | 1443 | list_add_tail(&rxb->list, &priv->rxq.rx_used); |
| @@ -2341,7 +2341,6 @@ static void iwl_bg_alive_start(struct work_struct *data) | |||
| 2341 | mutex_lock(&priv->mutex); | 2341 | mutex_lock(&priv->mutex); |
| 2342 | iwl_alive_start(priv); | 2342 | iwl_alive_start(priv); |
| 2343 | mutex_unlock(&priv->mutex); | 2343 | mutex_unlock(&priv->mutex); |
| 2344 | ieee80211_notify_mac(priv->hw, IEEE80211_NOTIFY_RE_ASSOC); | ||
| 2345 | } | 2344 | } |
| 2346 | 2345 | ||
| 2347 | static void iwl4965_bg_rf_kill(struct work_struct *work) | 2346 | static void iwl4965_bg_rf_kill(struct work_struct *work) |
diff --git a/drivers/net/wireless/iwlwifi/iwl-dev.h b/drivers/net/wireless/iwlwifi/iwl-dev.h index c018121085e9..9966d4e384ce 100644 --- a/drivers/net/wireless/iwlwifi/iwl-dev.h +++ b/drivers/net/wireless/iwlwifi/iwl-dev.h | |||
| @@ -89,7 +89,8 @@ extern struct iwl_cfg iwl5100_abg_cfg; | |||
| 89 | #define DEFAULT_LONG_RETRY_LIMIT 4U | 89 | #define DEFAULT_LONG_RETRY_LIMIT 4U |
| 90 | 90 | ||
| 91 | struct iwl_rx_mem_buffer { | 91 | struct iwl_rx_mem_buffer { |
| 92 | dma_addr_t dma_addr; | 92 | dma_addr_t real_dma_addr; |
| 93 | dma_addr_t aligned_dma_addr; | ||
| 93 | struct sk_buff *skb; | 94 | struct sk_buff *skb; |
| 94 | struct list_head list; | 95 | struct list_head list; |
| 95 | }; | 96 | }; |
diff --git a/drivers/net/wireless/iwlwifi/iwl-rx.c b/drivers/net/wireless/iwlwifi/iwl-rx.c index 7cde9d76ff5d..0509c16dbe75 100644 --- a/drivers/net/wireless/iwlwifi/iwl-rx.c +++ b/drivers/net/wireless/iwlwifi/iwl-rx.c | |||
| @@ -204,7 +204,7 @@ int iwl_rx_queue_restock(struct iwl_priv *priv) | |||
| 204 | list_del(element); | 204 | list_del(element); |
| 205 | 205 | ||
| 206 | /* Point to Rx buffer via next RBD in circular buffer */ | 206 | /* Point to Rx buffer via next RBD in circular buffer */ |
| 207 | rxq->bd[rxq->write] = iwl_dma_addr2rbd_ptr(priv, rxb->dma_addr); | 207 | rxq->bd[rxq->write] = iwl_dma_addr2rbd_ptr(priv, rxb->aligned_dma_addr); |
| 208 | rxq->queue[rxq->write] = rxb; | 208 | rxq->queue[rxq->write] = rxb; |
| 209 | rxq->write = (rxq->write + 1) & RX_QUEUE_MASK; | 209 | rxq->write = (rxq->write + 1) & RX_QUEUE_MASK; |
| 210 | rxq->free_count--; | 210 | rxq->free_count--; |
| @@ -251,7 +251,7 @@ void iwl_rx_allocate(struct iwl_priv *priv) | |||
| 251 | rxb = list_entry(element, struct iwl_rx_mem_buffer, list); | 251 | rxb = list_entry(element, struct iwl_rx_mem_buffer, list); |
| 252 | 252 | ||
| 253 | /* Alloc a new receive buffer */ | 253 | /* Alloc a new receive buffer */ |
| 254 | rxb->skb = alloc_skb(priv->hw_params.rx_buf_size, | 254 | rxb->skb = alloc_skb(priv->hw_params.rx_buf_size + 256, |
| 255 | __GFP_NOWARN | GFP_ATOMIC); | 255 | __GFP_NOWARN | GFP_ATOMIC); |
| 256 | if (!rxb->skb) { | 256 | if (!rxb->skb) { |
| 257 | if (net_ratelimit()) | 257 | if (net_ratelimit()) |
| @@ -266,9 +266,17 @@ void iwl_rx_allocate(struct iwl_priv *priv) | |||
| 266 | list_del(element); | 266 | list_del(element); |
| 267 | 267 | ||
| 268 | /* Get physical address of RB/SKB */ | 268 | /* Get physical address of RB/SKB */ |
| 269 | rxb->dma_addr = | 269 | rxb->real_dma_addr = pci_map_single( |
| 270 | pci_map_single(priv->pci_dev, rxb->skb->data, | 270 | priv->pci_dev, |
| 271 | priv->hw_params.rx_buf_size, PCI_DMA_FROMDEVICE); | 271 | rxb->skb->data, |
| 272 | priv->hw_params.rx_buf_size + 256, | ||
| 273 | PCI_DMA_FROMDEVICE); | ||
| 274 | /* dma address must be no more than 36 bits */ | ||
| 275 | BUG_ON(rxb->real_dma_addr & ~DMA_BIT_MASK(36)); | ||
| 276 | /* and also 256 byte aligned! */ | ||
| 277 | rxb->aligned_dma_addr = ALIGN(rxb->real_dma_addr, 256); | ||
| 278 | skb_reserve(rxb->skb, rxb->aligned_dma_addr - rxb->real_dma_addr); | ||
| 279 | |||
| 272 | list_add_tail(&rxb->list, &rxq->rx_free); | 280 | list_add_tail(&rxb->list, &rxq->rx_free); |
| 273 | rxq->free_count++; | 281 | rxq->free_count++; |
| 274 | } | 282 | } |
| @@ -300,8 +308,8 @@ void iwl_rx_queue_free(struct iwl_priv *priv, struct iwl_rx_queue *rxq) | |||
| 300 | for (i = 0; i < RX_QUEUE_SIZE + RX_FREE_BUFFERS; i++) { | 308 | for (i = 0; i < RX_QUEUE_SIZE + RX_FREE_BUFFERS; i++) { |
| 301 | if (rxq->pool[i].skb != NULL) { | 309 | if (rxq->pool[i].skb != NULL) { |
| 302 | pci_unmap_single(priv->pci_dev, | 310 | pci_unmap_single(priv->pci_dev, |
| 303 | rxq->pool[i].dma_addr, | 311 | rxq->pool[i].real_dma_addr, |
| 304 | priv->hw_params.rx_buf_size, | 312 | priv->hw_params.rx_buf_size + 256, |
| 305 | PCI_DMA_FROMDEVICE); | 313 | PCI_DMA_FROMDEVICE); |
| 306 | dev_kfree_skb(rxq->pool[i].skb); | 314 | dev_kfree_skb(rxq->pool[i].skb); |
| 307 | } | 315 | } |
| @@ -354,8 +362,8 @@ void iwl_rx_queue_reset(struct iwl_priv *priv, struct iwl_rx_queue *rxq) | |||
| 354 | * to an SKB, so we need to unmap and free potential storage */ | 362 | * to an SKB, so we need to unmap and free potential storage */ |
| 355 | if (rxq->pool[i].skb != NULL) { | 363 | if (rxq->pool[i].skb != NULL) { |
| 356 | pci_unmap_single(priv->pci_dev, | 364 | pci_unmap_single(priv->pci_dev, |
| 357 | rxq->pool[i].dma_addr, | 365 | rxq->pool[i].real_dma_addr, |
| 358 | priv->hw_params.rx_buf_size, | 366 | priv->hw_params.rx_buf_size + 256, |
| 359 | PCI_DMA_FROMDEVICE); | 367 | PCI_DMA_FROMDEVICE); |
| 360 | priv->alloc_rxb_skb--; | 368 | priv->alloc_rxb_skb--; |
| 361 | dev_kfree_skb(rxq->pool[i].skb); | 369 | dev_kfree_skb(rxq->pool[i].skb); |
diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c index 285b53e7e261..45a6b0c35695 100644 --- a/drivers/net/wireless/iwlwifi/iwl3945-base.c +++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c | |||
| @@ -6012,7 +6012,6 @@ static void iwl3945_bg_alive_start(struct work_struct *data) | |||
| 6012 | mutex_lock(&priv->mutex); | 6012 | mutex_lock(&priv->mutex); |
| 6013 | iwl3945_alive_start(priv); | 6013 | iwl3945_alive_start(priv); |
| 6014 | mutex_unlock(&priv->mutex); | 6014 | mutex_unlock(&priv->mutex); |
| 6015 | ieee80211_notify_mac(priv->hw, IEEE80211_NOTIFY_RE_ASSOC); | ||
| 6016 | } | 6015 | } |
| 6017 | 6016 | ||
| 6018 | static void iwl3945_bg_rf_kill(struct work_struct *work) | 6017 | static void iwl3945_bg_rf_kill(struct work_struct *work) |
diff --git a/drivers/net/wireless/libertas_tf/if_usb.c b/drivers/net/wireless/libertas_tf/if_usb.c index 1cc03a8dd67a..59634c33b1f9 100644 --- a/drivers/net/wireless/libertas_tf/if_usb.c +++ b/drivers/net/wireless/libertas_tf/if_usb.c | |||
| @@ -331,7 +331,7 @@ static int __if_usb_submit_rx_urb(struct if_usb_card *cardp, | |||
| 331 | /* Fill the receive configuration URB and initialise the Rx call back */ | 331 | /* Fill the receive configuration URB and initialise the Rx call back */ |
| 332 | usb_fill_bulk_urb(cardp->rx_urb, cardp->udev, | 332 | usb_fill_bulk_urb(cardp->rx_urb, cardp->udev, |
| 333 | usb_rcvbulkpipe(cardp->udev, cardp->ep_in), | 333 | usb_rcvbulkpipe(cardp->udev, cardp->ep_in), |
| 334 | (void *) (skb->tail), | 334 | skb_tail_pointer(skb), |
| 335 | MRVDRV_ETH_RX_PACKET_BUFFER_SIZE, callbackfn, cardp); | 335 | MRVDRV_ETH_RX_PACKET_BUFFER_SIZE, callbackfn, cardp); |
| 336 | 336 | ||
| 337 | cardp->rx_urb->transfer_flags |= URB_ZERO_PACKET; | 337 | cardp->rx_urb->transfer_flags |= URB_ZERO_PACKET; |
diff --git a/drivers/parport/Kconfig b/drivers/parport/Kconfig index 209b4a464bcf..855f389eea40 100644 --- a/drivers/parport/Kconfig +++ b/drivers/parport/Kconfig | |||
| @@ -36,7 +36,7 @@ if PARPORT | |||
| 36 | config PARPORT_PC | 36 | config PARPORT_PC |
| 37 | tristate "PC-style hardware" | 37 | tristate "PC-style hardware" |
| 38 | depends on (!SPARC64 || PCI) && !SPARC32 && !M32R && !FRV && \ | 38 | depends on (!SPARC64 || PCI) && !SPARC32 && !M32R && !FRV && \ |
| 39 | (!M68K || ISA) && !MN10300 && !AVR32 | 39 | (!M68K || ISA) && !MN10300 && !AVR32 && !BLACKFIN |
| 40 | ---help--- | 40 | ---help--- |
| 41 | You should say Y here if you have a PC-style parallel port. All | 41 | You should say Y here if you have a PC-style parallel port. All |
| 42 | IBM PC compatible computers and some Alphas have PC-style | 42 | IBM PC compatible computers and some Alphas have PC-style |
diff --git a/drivers/pci/intel-iommu.c b/drivers/pci/intel-iommu.c index a2692724b68f..5c8baa43ac9c 100644 --- a/drivers/pci/intel-iommu.c +++ b/drivers/pci/intel-iommu.c | |||
| @@ -1655,12 +1655,14 @@ int __init init_dmars(void) | |||
| 1655 | iommu->flush.flush_context = __iommu_flush_context; | 1655 | iommu->flush.flush_context = __iommu_flush_context; |
| 1656 | iommu->flush.flush_iotlb = __iommu_flush_iotlb; | 1656 | iommu->flush.flush_iotlb = __iommu_flush_iotlb; |
| 1657 | printk(KERN_INFO "IOMMU 0x%Lx: using Register based " | 1657 | printk(KERN_INFO "IOMMU 0x%Lx: using Register based " |
| 1658 | "invalidation\n", drhd->reg_base_addr); | 1658 | "invalidation\n", |
| 1659 | (unsigned long long)drhd->reg_base_addr); | ||
| 1659 | } else { | 1660 | } else { |
| 1660 | iommu->flush.flush_context = qi_flush_context; | 1661 | iommu->flush.flush_context = qi_flush_context; |
| 1661 | iommu->flush.flush_iotlb = qi_flush_iotlb; | 1662 | iommu->flush.flush_iotlb = qi_flush_iotlb; |
| 1662 | printk(KERN_INFO "IOMMU 0x%Lx: using Queued " | 1663 | printk(KERN_INFO "IOMMU 0x%Lx: using Queued " |
| 1663 | "invalidation\n", drhd->reg_base_addr); | 1664 | "invalidation\n", |
| 1665 | (unsigned long long)drhd->reg_base_addr); | ||
| 1664 | } | 1666 | } |
| 1665 | } | 1667 | } |
| 1666 | 1668 | ||
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index 21f2ac639cab..28af496b441e 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c | |||
| @@ -1832,7 +1832,7 @@ int pci_reset_function(struct pci_dev *dev) | |||
| 1832 | if (!(cap & PCI_EXP_DEVCAP_FLR)) | 1832 | if (!(cap & PCI_EXP_DEVCAP_FLR)) |
| 1833 | return -ENOTTY; | 1833 | return -ENOTTY; |
| 1834 | 1834 | ||
| 1835 | if (!dev->msi_enabled && !dev->msix_enabled) | 1835 | if (!dev->msi_enabled && !dev->msix_enabled && dev->irq != 0) |
| 1836 | disable_irq(dev->irq); | 1836 | disable_irq(dev->irq); |
| 1837 | pci_save_state(dev); | 1837 | pci_save_state(dev); |
| 1838 | 1838 | ||
| @@ -1841,7 +1841,7 @@ int pci_reset_function(struct pci_dev *dev) | |||
| 1841 | r = pci_execute_reset_function(dev); | 1841 | r = pci_execute_reset_function(dev); |
| 1842 | 1842 | ||
| 1843 | pci_restore_state(dev); | 1843 | pci_restore_state(dev); |
| 1844 | if (!dev->msi_enabled && !dev->msix_enabled) | 1844 | if (!dev->msi_enabled && !dev->msix_enabled && dev->irq != 0) |
| 1845 | enable_irq(dev->irq); | 1845 | enable_irq(dev->irq); |
| 1846 | 1846 | ||
| 1847 | return r; | 1847 | return r; |
diff --git a/drivers/spi/pxa2xx_spi.c b/drivers/spi/pxa2xx_spi.c index dae87b1a4c6e..cf12f2d84be2 100644 --- a/drivers/spi/pxa2xx_spi.c +++ b/drivers/spi/pxa2xx_spi.c | |||
| @@ -352,21 +352,21 @@ static int map_dma_buffers(struct driver_data *drv_data) | |||
| 352 | } else | 352 | } else |
| 353 | drv_data->tx_map_len = drv_data->len; | 353 | drv_data->tx_map_len = drv_data->len; |
| 354 | 354 | ||
| 355 | /* Stream map the rx buffer */ | 355 | /* Stream map the tx buffer. Always do DMA_TO_DEVICE first |
| 356 | drv_data->rx_dma = dma_map_single(dev, drv_data->rx, | 356 | * so we flush the cache *before* invalidating it, in case |
| 357 | drv_data->rx_map_len, | 357 | * the tx and rx buffers overlap. |
| 358 | DMA_FROM_DEVICE); | 358 | */ |
| 359 | if (dma_mapping_error(dev, drv_data->rx_dma)) | ||
| 360 | return 0; | ||
| 361 | |||
| 362 | /* Stream map the tx buffer */ | ||
| 363 | drv_data->tx_dma = dma_map_single(dev, drv_data->tx, | 359 | drv_data->tx_dma = dma_map_single(dev, drv_data->tx, |
| 364 | drv_data->tx_map_len, | 360 | drv_data->tx_map_len, DMA_TO_DEVICE); |
| 365 | DMA_TO_DEVICE); | 361 | if (dma_mapping_error(dev, drv_data->tx_dma)) |
| 362 | return 0; | ||
| 366 | 363 | ||
| 367 | if (dma_mapping_error(dev, drv_data->tx_dma)) { | 364 | /* Stream map the rx buffer */ |
| 368 | dma_unmap_single(dev, drv_data->rx_dma, | 365 | drv_data->rx_dma = dma_map_single(dev, drv_data->rx, |
| 369 | drv_data->rx_map_len, DMA_FROM_DEVICE); | 366 | drv_data->rx_map_len, DMA_FROM_DEVICE); |
| 367 | if (dma_mapping_error(dev, drv_data->rx_dma)) { | ||
| 368 | dma_unmap_single(dev, drv_data->tx_dma, | ||
| 369 | drv_data->tx_map_len, DMA_TO_DEVICE); | ||
| 370 | return 0; | 370 | return 0; |
| 371 | } | 371 | } |
| 372 | 372 | ||
diff --git a/drivers/spi/spi_imx.c b/drivers/spi/spi_imx.c index 61ba147e384d..0b4db0ce78d6 100644 --- a/drivers/spi/spi_imx.c +++ b/drivers/spi/spi_imx.c | |||
| @@ -506,20 +506,6 @@ static int map_dma_buffers(struct driver_data *drv_data) | |||
| 506 | if (!IS_DMA_ALIGNED(drv_data->rx) || !IS_DMA_ALIGNED(drv_data->tx)) | 506 | if (!IS_DMA_ALIGNED(drv_data->rx) || !IS_DMA_ALIGNED(drv_data->tx)) |
| 507 | return -1; | 507 | return -1; |
| 508 | 508 | ||
| 509 | /* NULL rx means write-only transfer and no map needed | ||
| 510 | since rx DMA will not be used */ | ||
| 511 | if (drv_data->rx) { | ||
| 512 | buf = drv_data->rx; | ||
| 513 | drv_data->rx_dma = dma_map_single( | ||
| 514 | dev, | ||
| 515 | buf, | ||
| 516 | drv_data->len, | ||
| 517 | DMA_FROM_DEVICE); | ||
| 518 | if (dma_mapping_error(dev, drv_data->rx_dma)) | ||
| 519 | return -1; | ||
| 520 | drv_data->rx_dma_needs_unmap = 1; | ||
| 521 | } | ||
| 522 | |||
| 523 | if (drv_data->tx == NULL) { | 509 | if (drv_data->tx == NULL) { |
| 524 | /* Read only message --> use drv_data->dummy_dma_buf for dummy | 510 | /* Read only message --> use drv_data->dummy_dma_buf for dummy |
| 525 | writes to achive reads */ | 511 | writes to achive reads */ |
| @@ -533,18 +519,31 @@ static int map_dma_buffers(struct driver_data *drv_data) | |||
| 533 | buf, | 519 | buf, |
| 534 | drv_data->tx_map_len, | 520 | drv_data->tx_map_len, |
| 535 | DMA_TO_DEVICE); | 521 | DMA_TO_DEVICE); |
| 536 | if (dma_mapping_error(dev, drv_data->tx_dma)) { | 522 | if (dma_mapping_error(dev, drv_data->tx_dma)) |
| 537 | if (drv_data->rx_dma) { | ||
| 538 | dma_unmap_single(dev, | ||
| 539 | drv_data->rx_dma, | ||
| 540 | drv_data->len, | ||
| 541 | DMA_FROM_DEVICE); | ||
| 542 | drv_data->rx_dma_needs_unmap = 0; | ||
| 543 | } | ||
| 544 | return -1; | 523 | return -1; |
| 545 | } | ||
| 546 | drv_data->tx_dma_needs_unmap = 1; | 524 | drv_data->tx_dma_needs_unmap = 1; |
| 547 | 525 | ||
| 526 | /* NULL rx means write-only transfer and no map needed | ||
| 527 | * since rx DMA will not be used */ | ||
| 528 | if (drv_data->rx) { | ||
| 529 | buf = drv_data->rx; | ||
| 530 | drv_data->rx_dma = dma_map_single(dev, | ||
| 531 | buf, | ||
| 532 | drv_data->len, | ||
| 533 | DMA_FROM_DEVICE); | ||
| 534 | if (dma_mapping_error(dev, drv_data->rx_dma)) { | ||
| 535 | if (drv_data->tx_dma) { | ||
| 536 | dma_unmap_single(dev, | ||
| 537 | drv_data->tx_dma, | ||
| 538 | drv_data->tx_map_len, | ||
| 539 | DMA_TO_DEVICE); | ||
| 540 | drv_data->tx_dma_needs_unmap = 0; | ||
| 541 | } | ||
| 542 | return -1; | ||
| 543 | } | ||
| 544 | drv_data->rx_dma_needs_unmap = 1; | ||
| 545 | } | ||
| 546 | |||
| 548 | return 0; | 547 | return 0; |
| 549 | } | 548 | } |
| 550 | 549 | ||
diff --git a/drivers/usb/gadget/f_rndis.c b/drivers/usb/gadget/f_rndis.c index 659b3d9671c4..428b5993575a 100644 --- a/drivers/usb/gadget/f_rndis.c +++ b/drivers/usb/gadget/f_rndis.c | |||
| @@ -172,7 +172,6 @@ static struct usb_interface_descriptor rndis_data_intf __initdata = { | |||
| 172 | .bDescriptorType = USB_DT_INTERFACE, | 172 | .bDescriptorType = USB_DT_INTERFACE, |
| 173 | 173 | ||
| 174 | /* .bInterfaceNumber = DYNAMIC */ | 174 | /* .bInterfaceNumber = DYNAMIC */ |
| 175 | .bAlternateSetting = 1, | ||
| 176 | .bNumEndpoints = 2, | 175 | .bNumEndpoints = 2, |
| 177 | .bInterfaceClass = USB_CLASS_CDC_DATA, | 176 | .bInterfaceClass = USB_CLASS_CDC_DATA, |
| 178 | .bInterfaceSubClass = 0, | 177 | .bInterfaceSubClass = 0, |
| @@ -303,7 +302,7 @@ static void rndis_response_available(void *_rndis) | |||
| 303 | __le32 *data = req->buf; | 302 | __le32 *data = req->buf; |
| 304 | int status; | 303 | int status; |
| 305 | 304 | ||
| 306 | if (atomic_inc_return(&rndis->notify_count)) | 305 | if (atomic_inc_return(&rndis->notify_count) != 1) |
| 307 | return; | 306 | return; |
| 308 | 307 | ||
| 309 | /* Send RNDIS RESPONSE_AVAILABLE notification; a | 308 | /* Send RNDIS RESPONSE_AVAILABLE notification; a |
diff --git a/drivers/usb/host/ehci-pci.c b/drivers/usb/host/ehci-pci.c index c46a58f9181d..9d0ea573aef6 100644 --- a/drivers/usb/host/ehci-pci.c +++ b/drivers/usb/host/ehci-pci.c | |||
| @@ -66,6 +66,8 @@ static int ehci_pci_setup(struct usb_hcd *hcd) | |||
| 66 | { | 66 | { |
| 67 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); | 67 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); |
| 68 | struct pci_dev *pdev = to_pci_dev(hcd->self.controller); | 68 | struct pci_dev *pdev = to_pci_dev(hcd->self.controller); |
| 69 | struct pci_dev *p_smbus; | ||
| 70 | u8 rev; | ||
| 69 | u32 temp; | 71 | u32 temp; |
| 70 | int retval; | 72 | int retval; |
| 71 | 73 | ||
| @@ -166,6 +168,25 @@ static int ehci_pci_setup(struct usb_hcd *hcd) | |||
| 166 | pci_write_config_byte(pdev, 0x4b, tmp | 0x20); | 168 | pci_write_config_byte(pdev, 0x4b, tmp | 0x20); |
| 167 | } | 169 | } |
| 168 | break; | 170 | break; |
| 171 | case PCI_VENDOR_ID_ATI: | ||
| 172 | /* SB700 old version has a bug in EHCI controller, | ||
| 173 | * which causes usb devices lose response in some cases. | ||
| 174 | */ | ||
| 175 | if (pdev->device == 0x4396) { | ||
| 176 | p_smbus = pci_get_device(PCI_VENDOR_ID_ATI, | ||
| 177 | PCI_DEVICE_ID_ATI_SBX00_SMBUS, | ||
| 178 | NULL); | ||
| 179 | if (!p_smbus) | ||
| 180 | break; | ||
| 181 | rev = p_smbus->revision; | ||
| 182 | if ((rev == 0x3a) || (rev == 0x3b)) { | ||
| 183 | u8 tmp; | ||
| 184 | pci_read_config_byte(pdev, 0x53, &tmp); | ||
| 185 | pci_write_config_byte(pdev, 0x53, tmp | (1<<3)); | ||
| 186 | } | ||
| 187 | pci_dev_put(p_smbus); | ||
| 188 | } | ||
| 189 | break; | ||
| 169 | } | 190 | } |
| 170 | 191 | ||
| 171 | ehci_reset(ehci); | 192 | ehci_reset(ehci); |
diff --git a/drivers/usb/mon/mon_bin.c b/drivers/usb/mon/mon_bin.c index c9de3f027aab..e06810aef2df 100644 --- a/drivers/usb/mon/mon_bin.c +++ b/drivers/usb/mon/mon_bin.c | |||
| @@ -687,7 +687,10 @@ static ssize_t mon_bin_read(struct file *file, char __user *buf, | |||
| 687 | } | 687 | } |
| 688 | 688 | ||
| 689 | if (rp->b_read >= sizeof(struct mon_bin_hdr)) { | 689 | if (rp->b_read >= sizeof(struct mon_bin_hdr)) { |
| 690 | step_len = min(nbytes, (size_t)ep->len_cap); | 690 | step_len = ep->len_cap; |
| 691 | step_len -= rp->b_read - sizeof(struct mon_bin_hdr); | ||
| 692 | if (step_len > nbytes) | ||
| 693 | step_len = nbytes; | ||
| 691 | offset = rp->b_out + PKT_SIZE; | 694 | offset = rp->b_out + PKT_SIZE; |
| 692 | offset += rp->b_read - sizeof(struct mon_bin_hdr); | 695 | offset += rp->b_read - sizeof(struct mon_bin_hdr); |
| 693 | if (offset >= rp->b_size) | 696 | if (offset >= rp->b_size) |
diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c index e45e70bcc5e2..cc64462d4c4e 100644 --- a/drivers/usb/musb/musb_host.c +++ b/drivers/usb/musb/musb_host.c | |||
| @@ -1757,7 +1757,7 @@ static int musb_schedule( | |||
| 1757 | } | 1757 | } |
| 1758 | } | 1758 | } |
| 1759 | /* use bulk reserved ep1 if no other ep is free */ | 1759 | /* use bulk reserved ep1 if no other ep is free */ |
| 1760 | if (best_end > 0 && qh->type == USB_ENDPOINT_XFER_BULK) { | 1760 | if (best_end < 0 && qh->type == USB_ENDPOINT_XFER_BULK) { |
| 1761 | hw_ep = musb->bulk_ep; | 1761 | hw_ep = musb->bulk_ep; |
| 1762 | if (is_in) | 1762 | if (is_in) |
| 1763 | head = &musb->in_bulk; | 1763 | head = &musb->in_bulk; |
diff --git a/drivers/usb/serial/cp2101.c b/drivers/usb/serial/cp2101.c index 9035d7256b03..cfaf1f085535 100644 --- a/drivers/usb/serial/cp2101.c +++ b/drivers/usb/serial/cp2101.c | |||
| @@ -56,6 +56,7 @@ static void cp2101_shutdown(struct usb_serial *); | |||
| 56 | static int debug; | 56 | static int debug; |
| 57 | 57 | ||
| 58 | static struct usb_device_id id_table [] = { | 58 | static struct usb_device_id id_table [] = { |
| 59 | { USB_DEVICE(0x0471, 0x066A) }, /* AKTAKOM ACE-1001 cable */ | ||
| 59 | { USB_DEVICE(0x0489, 0xE000) }, /* Pirelli Broadband S.p.A, DP-L10 SIP/GSM Mobile */ | 60 | { USB_DEVICE(0x0489, 0xE000) }, /* Pirelli Broadband S.p.A, DP-L10 SIP/GSM Mobile */ |
| 60 | { USB_DEVICE(0x08e6, 0x5501) }, /* Gemalto Prox-PU/CU contactless smartcard reader */ | 61 | { USB_DEVICE(0x08e6, 0x5501) }, /* Gemalto Prox-PU/CU contactless smartcard reader */ |
| 61 | { USB_DEVICE(0x0FCF, 0x1003) }, /* Dynastream ANT development board */ | 62 | { USB_DEVICE(0x0FCF, 0x1003) }, /* Dynastream ANT development board */ |
diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h index d4e5fc86e43c..6da9a7a962a8 100644 --- a/drivers/usb/storage/unusual_devs.h +++ b/drivers/usb/storage/unusual_devs.h | |||
| @@ -167,6 +167,13 @@ UNUSUAL_DEV( 0x0421, 0x005d, 0x0001, 0x0600, | |||
| 167 | US_SC_DEVICE, US_PR_DEVICE, NULL, | 167 | US_SC_DEVICE, US_PR_DEVICE, NULL, |
| 168 | US_FL_FIX_CAPACITY ), | 168 | US_FL_FIX_CAPACITY ), |
| 169 | 169 | ||
| 170 | /* Patch for Nokia 5310 capacity */ | ||
| 171 | UNUSUAL_DEV( 0x0421, 0x006a, 0x0000, 0x0591, | ||
| 172 | "Nokia", | ||
| 173 | "5310", | ||
| 174 | US_SC_DEVICE, US_PR_DEVICE, NULL, | ||
| 175 | US_FL_FIX_CAPACITY ), | ||
| 176 | |||
| 170 | /* Reported by Mario Rettig <mariorettig@web.de> */ | 177 | /* Reported by Mario Rettig <mariorettig@web.de> */ |
| 171 | UNUSUAL_DEV( 0x0421, 0x042e, 0x0100, 0x0100, | 178 | UNUSUAL_DEV( 0x0421, 0x042e, 0x0100, 0x0100, |
| 172 | "Nokia", | 179 | "Nokia", |
| @@ -233,14 +240,14 @@ UNUSUAL_DEV( 0x0421, 0x0495, 0x0370, 0x0370, | |||
| 233 | US_FL_MAX_SECTORS_64 ), | 240 | US_FL_MAX_SECTORS_64 ), |
| 234 | 241 | ||
| 235 | /* Reported by Cedric Godin <cedric@belbone.be> */ | 242 | /* Reported by Cedric Godin <cedric@belbone.be> */ |
| 236 | UNUSUAL_DEV( 0x0421, 0x04b9, 0x0551, 0x0551, | 243 | UNUSUAL_DEV( 0x0421, 0x04b9, 0x0500, 0x0551, |
| 237 | "Nokia", | 244 | "Nokia", |
| 238 | "5300", | 245 | "5300", |
| 239 | US_SC_DEVICE, US_PR_DEVICE, NULL, | 246 | US_SC_DEVICE, US_PR_DEVICE, NULL, |
| 240 | US_FL_FIX_CAPACITY ), | 247 | US_FL_FIX_CAPACITY ), |
| 241 | 248 | ||
| 242 | /* Reported by Richard Nauber <RichardNauber@web.de> */ | 249 | /* Reported by Richard Nauber <RichardNauber@web.de> */ |
| 243 | UNUSUAL_DEV( 0x0421, 0x04fa, 0x0601, 0x0601, | 250 | UNUSUAL_DEV( 0x0421, 0x04fa, 0x0550, 0x0660, |
| 244 | "Nokia", | 251 | "Nokia", |
| 245 | "6300", | 252 | "6300", |
| 246 | US_SC_DEVICE, US_PR_DEVICE, NULL, | 253 | US_SC_DEVICE, US_PR_DEVICE, NULL, |
diff --git a/drivers/video/atmel_lcdfb.c b/drivers/video/atmel_lcdfb.c index f8d0a57a07cb..9a577a800db5 100644 --- a/drivers/video/atmel_lcdfb.c +++ b/drivers/video/atmel_lcdfb.c | |||
| @@ -132,7 +132,7 @@ static void init_backlight(struct atmel_lcdfb_info *sinfo) | |||
| 132 | 132 | ||
| 133 | bl = backlight_device_register("backlight", &sinfo->pdev->dev, | 133 | bl = backlight_device_register("backlight", &sinfo->pdev->dev, |
| 134 | sinfo, &atmel_lcdc_bl_ops); | 134 | sinfo, &atmel_lcdc_bl_ops); |
| 135 | if (IS_ERR(sinfo->backlight)) { | 135 | if (IS_ERR(bl)) { |
| 136 | dev_err(&sinfo->pdev->dev, "error %ld on backlight register\n", | 136 | dev_err(&sinfo->pdev->dev, "error %ld on backlight register\n", |
| 137 | PTR_ERR(bl)); | 137 | PTR_ERR(bl)); |
| 138 | return; | 138 | return; |
diff --git a/drivers/video/backlight/da903x.c b/drivers/video/backlight/da903x.c index 242c38250166..93bb4340cc64 100644 --- a/drivers/video/backlight/da903x.c +++ b/drivers/video/backlight/da903x.c | |||
| @@ -119,6 +119,7 @@ static int da903x_backlight_probe(struct platform_device *pdev) | |||
| 119 | default: | 119 | default: |
| 120 | dev_err(&pdev->dev, "invalid backlight device ID(%d)\n", | 120 | dev_err(&pdev->dev, "invalid backlight device ID(%d)\n", |
| 121 | pdev->id); | 121 | pdev->id); |
| 122 | kfree(data); | ||
| 122 | return -EINVAL; | 123 | return -EINVAL; |
| 123 | } | 124 | } |
| 124 | 125 | ||
| @@ -130,6 +131,7 @@ static int da903x_backlight_probe(struct platform_device *pdev) | |||
| 130 | data, &da903x_backlight_ops); | 131 | data, &da903x_backlight_ops); |
| 131 | if (IS_ERR(bl)) { | 132 | if (IS_ERR(bl)) { |
| 132 | dev_err(&pdev->dev, "failed to register backlight\n"); | 133 | dev_err(&pdev->dev, "failed to register backlight\n"); |
| 134 | kfree(data); | ||
| 133 | return PTR_ERR(bl); | 135 | return PTR_ERR(bl); |
| 134 | } | 136 | } |
| 135 | 137 | ||
diff --git a/drivers/video/backlight/lcd.c b/drivers/video/backlight/lcd.c index 8e1731d3b228..680e57b616cd 100644 --- a/drivers/video/backlight/lcd.c +++ b/drivers/video/backlight/lcd.c | |||
| @@ -42,10 +42,13 @@ static int fb_notifier_callback(struct notifier_block *self, | |||
| 42 | 42 | ||
| 43 | mutex_lock(&ld->ops_lock); | 43 | mutex_lock(&ld->ops_lock); |
| 44 | if (!ld->ops->check_fb || ld->ops->check_fb(ld, evdata->info)) { | 44 | if (!ld->ops->check_fb || ld->ops->check_fb(ld, evdata->info)) { |
| 45 | if (event == FB_EVENT_BLANK) | 45 | if (event == FB_EVENT_BLANK) { |
| 46 | ld->ops->set_power(ld, *(int *)evdata->data); | 46 | if (ld->ops->set_power) |
| 47 | else | 47 | ld->ops->set_power(ld, *(int *)evdata->data); |
| 48 | ld->ops->set_mode(ld, evdata->data); | 48 | } else { |
| 49 | if (ld->ops->set_mode) | ||
| 50 | ld->ops->set_mode(ld, evdata->data); | ||
| 51 | } | ||
| 49 | } | 52 | } |
| 50 | mutex_unlock(&ld->ops_lock); | 53 | mutex_unlock(&ld->ops_lock); |
| 51 | return 0; | 54 | return 0; |
diff --git a/drivers/video/cirrusfb.c b/drivers/video/cirrusfb.c index 8a8760230bc7..a2aa6ddffbe2 100644 --- a/drivers/video/cirrusfb.c +++ b/drivers/video/cirrusfb.c | |||
| @@ -2462,8 +2462,7 @@ static int __init cirrusfb_init(void) | |||
| 2462 | 2462 | ||
| 2463 | #ifndef MODULE | 2463 | #ifndef MODULE |
| 2464 | static int __init cirrusfb_setup(char *options) { | 2464 | static int __init cirrusfb_setup(char *options) { |
| 2465 | char *this_opt, s[32]; | 2465 | char *this_opt; |
| 2466 | int i; | ||
| 2467 | 2466 | ||
| 2468 | DPRINTK("ENTER\n"); | 2467 | DPRINTK("ENTER\n"); |
| 2469 | 2468 | ||
diff --git a/drivers/video/fbmem.c b/drivers/video/fbmem.c index 1d5ae39cb271..3c65b0d67617 100644 --- a/drivers/video/fbmem.c +++ b/drivers/video/fbmem.c | |||
| @@ -230,7 +230,7 @@ static void fb_set_logo_directpalette(struct fb_info *info, | |||
| 230 | greenshift = info->var.green.offset; | 230 | greenshift = info->var.green.offset; |
| 231 | blueshift = info->var.blue.offset; | 231 | blueshift = info->var.blue.offset; |
| 232 | 232 | ||
| 233 | for (i = 32; i < logo->clutsize; i++) | 233 | for (i = 32; i < 32 + logo->clutsize; i++) |
| 234 | palette[i] = i << redshift | i << greenshift | i << blueshift; | 234 | palette[i] = i << redshift | i << greenshift | i << blueshift; |
| 235 | } | 235 | } |
| 236 | 236 | ||
diff --git a/drivers/video/tmiofb.c b/drivers/video/tmiofb.c index 2a380011e9ba..7baf2dd12d50 100644 --- a/drivers/video/tmiofb.c +++ b/drivers/video/tmiofb.c | |||
| @@ -222,6 +222,9 @@ static irqreturn_t tmiofb_irq(int irq, void *__info) | |||
| 222 | unsigned int bbisc = tmio_ioread16(par->lcr + LCR_BBISC); | 222 | unsigned int bbisc = tmio_ioread16(par->lcr + LCR_BBISC); |
| 223 | 223 | ||
| 224 | 224 | ||
| 225 | tmio_iowrite16(bbisc, par->lcr + LCR_BBISC); | ||
| 226 | |||
| 227 | #ifdef CONFIG_FB_TMIO_ACCELL | ||
| 225 | /* | 228 | /* |
| 226 | * We were in polling mode and now we got correct irq. | 229 | * We were in polling mode and now we got correct irq. |
| 227 | * Switch back to IRQ-based sync of command FIFO | 230 | * Switch back to IRQ-based sync of command FIFO |
| @@ -231,9 +234,6 @@ static irqreturn_t tmiofb_irq(int irq, void *__info) | |||
| 231 | par->use_polling = false; | 234 | par->use_polling = false; |
| 232 | } | 235 | } |
| 233 | 236 | ||
| 234 | tmio_iowrite16(bbisc, par->lcr + LCR_BBISC); | ||
| 235 | |||
| 236 | #ifdef CONFIG_FB_TMIO_ACCELL | ||
| 237 | if (bbisc & 1) | 237 | if (bbisc & 1) |
| 238 | wake_up(&par->wait_acc); | 238 | wake_up(&par->wait_acc); |
| 239 | #endif | 239 | #endif |
| @@ -938,7 +938,9 @@ static void tmiofb_dump_regs(struct platform_device *dev) | |||
| 938 | static int tmiofb_suspend(struct platform_device *dev, pm_message_t state) | 938 | static int tmiofb_suspend(struct platform_device *dev, pm_message_t state) |
| 939 | { | 939 | { |
| 940 | struct fb_info *info = platform_get_drvdata(dev); | 940 | struct fb_info *info = platform_get_drvdata(dev); |
| 941 | #ifdef CONFIG_FB_TMIO_ACCELL | ||
| 941 | struct tmiofb_par *par = info->par; | 942 | struct tmiofb_par *par = info->par; |
| 943 | #endif | ||
| 942 | struct mfd_cell *cell = dev->dev.platform_data; | 944 | struct mfd_cell *cell = dev->dev.platform_data; |
| 943 | int retval = 0; | 945 | int retval = 0; |
| 944 | 946 | ||
| @@ -950,12 +952,14 @@ static int tmiofb_suspend(struct platform_device *dev, pm_message_t state) | |||
| 950 | info->fbops->fb_sync(info); | 952 | info->fbops->fb_sync(info); |
| 951 | 953 | ||
| 952 | 954 | ||
| 955 | #ifdef CONFIG_FB_TMIO_ACCELL | ||
| 953 | /* | 956 | /* |
| 954 | * The fb should be usable even if interrupts are disabled (and they are | 957 | * The fb should be usable even if interrupts are disabled (and they are |
| 955 | * during suspend/resume). Switch temporary to forced polling. | 958 | * during suspend/resume). Switch temporary to forced polling. |
| 956 | */ | 959 | */ |
| 957 | printk(KERN_INFO "tmiofb: switching to polling\n"); | 960 | printk(KERN_INFO "tmiofb: switching to polling\n"); |
| 958 | par->use_polling = true; | 961 | par->use_polling = true; |
| 962 | #endif | ||
| 959 | tmiofb_hw_stop(dev); | 963 | tmiofb_hw_stop(dev); |
| 960 | 964 | ||
| 961 | if (cell->suspend) | 965 | if (cell->suspend) |
diff --git a/drivers/video/via/viafbdev.c b/drivers/video/via/viafbdev.c index 0132eae06f55..73ac754ad801 100644 --- a/drivers/video/via/viafbdev.c +++ b/drivers/video/via/viafbdev.c | |||
| @@ -2036,30 +2036,30 @@ static int viafb_vt1636_proc_write(struct file *file, | |||
| 2036 | return count; | 2036 | return count; |
| 2037 | } | 2037 | } |
| 2038 | 2038 | ||
| 2039 | static void viafb_init_proc(struct proc_dir_entry *viafb_entry) | 2039 | static void viafb_init_proc(struct proc_dir_entry **viafb_entry) |
| 2040 | { | 2040 | { |
| 2041 | struct proc_dir_entry *entry; | 2041 | struct proc_dir_entry *entry; |
| 2042 | viafb_entry = proc_mkdir("viafb", NULL); | 2042 | *viafb_entry = proc_mkdir("viafb", NULL); |
| 2043 | if (viafb_entry) { | 2043 | if (viafb_entry) { |
| 2044 | entry = create_proc_entry("dvp0", 0, viafb_entry); | 2044 | entry = create_proc_entry("dvp0", 0, *viafb_entry); |
| 2045 | if (entry) { | 2045 | if (entry) { |
| 2046 | entry->owner = THIS_MODULE; | 2046 | entry->owner = THIS_MODULE; |
| 2047 | entry->read_proc = viafb_dvp0_proc_read; | 2047 | entry->read_proc = viafb_dvp0_proc_read; |
| 2048 | entry->write_proc = viafb_dvp0_proc_write; | 2048 | entry->write_proc = viafb_dvp0_proc_write; |
| 2049 | } | 2049 | } |
| 2050 | entry = create_proc_entry("dvp1", 0, viafb_entry); | 2050 | entry = create_proc_entry("dvp1", 0, *viafb_entry); |
| 2051 | if (entry) { | 2051 | if (entry) { |
| 2052 | entry->owner = THIS_MODULE; | 2052 | entry->owner = THIS_MODULE; |
| 2053 | entry->read_proc = viafb_dvp1_proc_read; | 2053 | entry->read_proc = viafb_dvp1_proc_read; |
| 2054 | entry->write_proc = viafb_dvp1_proc_write; | 2054 | entry->write_proc = viafb_dvp1_proc_write; |
| 2055 | } | 2055 | } |
| 2056 | entry = create_proc_entry("dfph", 0, viafb_entry); | 2056 | entry = create_proc_entry("dfph", 0, *viafb_entry); |
| 2057 | if (entry) { | 2057 | if (entry) { |
| 2058 | entry->owner = THIS_MODULE; | 2058 | entry->owner = THIS_MODULE; |
| 2059 | entry->read_proc = viafb_dfph_proc_read; | 2059 | entry->read_proc = viafb_dfph_proc_read; |
| 2060 | entry->write_proc = viafb_dfph_proc_write; | 2060 | entry->write_proc = viafb_dfph_proc_write; |
| 2061 | } | 2061 | } |
| 2062 | entry = create_proc_entry("dfpl", 0, viafb_entry); | 2062 | entry = create_proc_entry("dfpl", 0, *viafb_entry); |
| 2063 | if (entry) { | 2063 | if (entry) { |
| 2064 | entry->owner = THIS_MODULE; | 2064 | entry->owner = THIS_MODULE; |
| 2065 | entry->read_proc = viafb_dfpl_proc_read; | 2065 | entry->read_proc = viafb_dfpl_proc_read; |
| @@ -2068,7 +2068,7 @@ static void viafb_init_proc(struct proc_dir_entry *viafb_entry) | |||
| 2068 | if (VT1636_LVDS == viaparinfo->chip_info->lvds_chip_info. | 2068 | if (VT1636_LVDS == viaparinfo->chip_info->lvds_chip_info. |
| 2069 | lvds_chip_name || VT1636_LVDS == | 2069 | lvds_chip_name || VT1636_LVDS == |
| 2070 | viaparinfo->chip_info->lvds_chip_info2.lvds_chip_name) { | 2070 | viaparinfo->chip_info->lvds_chip_info2.lvds_chip_name) { |
| 2071 | entry = create_proc_entry("vt1636", 0, viafb_entry); | 2071 | entry = create_proc_entry("vt1636", 0, *viafb_entry); |
| 2072 | if (entry) { | 2072 | if (entry) { |
| 2073 | entry->owner = THIS_MODULE; | 2073 | entry->owner = THIS_MODULE; |
| 2074 | entry->read_proc = viafb_vt1636_proc_read; | 2074 | entry->read_proc = viafb_vt1636_proc_read; |
| @@ -2087,6 +2087,7 @@ static void viafb_remove_proc(struct proc_dir_entry *viafb_entry) | |||
| 2087 | remove_proc_entry("dfpl", viafb_entry); | 2087 | remove_proc_entry("dfpl", viafb_entry); |
| 2088 | remove_proc_entry("vt1636", viafb_entry); | 2088 | remove_proc_entry("vt1636", viafb_entry); |
| 2089 | remove_proc_entry("vt1625", viafb_entry); | 2089 | remove_proc_entry("vt1625", viafb_entry); |
| 2090 | remove_proc_entry("viafb", NULL); | ||
| 2090 | } | 2091 | } |
| 2091 | 2092 | ||
| 2092 | static int __devinit via_pci_probe(void) | 2093 | static int __devinit via_pci_probe(void) |
| @@ -2348,7 +2349,7 @@ static int __devinit via_pci_probe(void) | |||
| 2348 | viafbinfo->node, viafbinfo->fix.id, default_var.xres, | 2349 | viafbinfo->node, viafbinfo->fix.id, default_var.xres, |
| 2349 | default_var.yres, default_var.bits_per_pixel); | 2350 | default_var.yres, default_var.bits_per_pixel); |
| 2350 | 2351 | ||
| 2351 | viafb_init_proc(viaparinfo->proc_entry); | 2352 | viafb_init_proc(&viaparinfo->proc_entry); |
| 2352 | viafb_init_dac(IGA2); | 2353 | viafb_init_dac(IGA2); |
| 2353 | return 0; | 2354 | return 0; |
| 2354 | } | 2355 | } |
diff --git a/drivers/w1/masters/omap_hdq.c b/drivers/w1/masters/omap_hdq.c index 1295625c4825..c973889110c8 100644 --- a/drivers/w1/masters/omap_hdq.c +++ b/drivers/w1/masters/omap_hdq.c | |||
| @@ -86,8 +86,8 @@ static struct platform_driver omap_hdq_driver = { | |||
| 86 | static u8 omap_w1_read_byte(void *_hdq); | 86 | static u8 omap_w1_read_byte(void *_hdq); |
| 87 | static void omap_w1_write_byte(void *_hdq, u8 byte); | 87 | static void omap_w1_write_byte(void *_hdq, u8 byte); |
| 88 | static u8 omap_w1_reset_bus(void *_hdq); | 88 | static u8 omap_w1_reset_bus(void *_hdq); |
| 89 | static void omap_w1_search_bus(void *_hdq, u8 search_type, | 89 | static void omap_w1_search_bus(void *_hdq, struct w1_master *master_dev, |
| 90 | w1_slave_found_callback slave_found); | 90 | u8 search_type, w1_slave_found_callback slave_found); |
| 91 | 91 | ||
| 92 | 92 | ||
| 93 | static struct w1_bus_master omap_w1_master = { | 93 | static struct w1_bus_master omap_w1_master = { |
| @@ -231,8 +231,8 @@ static u8 omap_w1_reset_bus(void *_hdq) | |||
| 231 | } | 231 | } |
| 232 | 232 | ||
| 233 | /* W1 search callback function */ | 233 | /* W1 search callback function */ |
| 234 | static void omap_w1_search_bus(void *_hdq, u8 search_type, | 234 | static void omap_w1_search_bus(void *_hdq, struct w1_master *master_dev, |
| 235 | w1_slave_found_callback slave_found) | 235 | u8 search_type, w1_slave_found_callback slave_found) |
| 236 | { | 236 | { |
| 237 | u64 module_id, rn_le, cs, id; | 237 | u64 module_id, rn_le, cs, id; |
| 238 | 238 | ||
| @@ -249,7 +249,7 @@ static void omap_w1_search_bus(void *_hdq, u8 search_type, | |||
| 249 | cs = w1_calc_crc8((u8 *)&rn_le, 7); | 249 | cs = w1_calc_crc8((u8 *)&rn_le, 7); |
| 250 | id = (cs << 56) | module_id; | 250 | id = (cs << 56) | module_id; |
| 251 | 251 | ||
| 252 | slave_found(_hdq, id); | 252 | slave_found(master_dev, id); |
| 253 | } | 253 | } |
| 254 | 254 | ||
| 255 | static int _omap_hdq_reset(struct hdq_data *hdq_data) | 255 | static int _omap_hdq_reset(struct hdq_data *hdq_data) |
diff --git a/drivers/xen/balloon.c b/drivers/xen/balloon.c index a0fb5eac407c..526c191e84ea 100644 --- a/drivers/xen/balloon.c +++ b/drivers/xen/balloon.c | |||
| @@ -122,14 +122,7 @@ static struct timer_list balloon_timer; | |||
| 122 | static void scrub_page(struct page *page) | 122 | static void scrub_page(struct page *page) |
| 123 | { | 123 | { |
| 124 | #ifdef CONFIG_XEN_SCRUB_PAGES | 124 | #ifdef CONFIG_XEN_SCRUB_PAGES |
| 125 | if (PageHighMem(page)) { | 125 | clear_highpage(page); |
| 126 | void *v = kmap(page); | ||
| 127 | clear_page(v); | ||
| 128 | kunmap(v); | ||
| 129 | } else { | ||
| 130 | void *v = page_address(page); | ||
| 131 | clear_page(v); | ||
| 132 | } | ||
| 133 | #endif | 126 | #endif |
| 134 | } | 127 | } |
| 135 | 128 | ||
diff --git a/fs/cifs/CHANGES b/fs/cifs/CHANGES index 8855331b2fba..e078b7aea143 100644 --- a/fs/cifs/CHANGES +++ b/fs/cifs/CHANGES | |||
| @@ -8,7 +8,11 @@ handling fcntl(F_SETLEASE). Convert cifs to using blocking tcp | |||
| 8 | sends, and also let tcp autotune the socket send and receive buffers. | 8 | sends, and also let tcp autotune the socket send and receive buffers. |
| 9 | This reduces the number of EAGAIN errors returned by TCP/IP in | 9 | This reduces the number of EAGAIN errors returned by TCP/IP in |
| 10 | high stress workloads (and the number of retries on socket writes | 10 | high stress workloads (and the number of retries on socket writes |
| 11 | when sending large SMBWriteX requests). | 11 | when sending large SMBWriteX requests). Fix case in which a portion of |
| 12 | data can in some cases not get written to the file on the server before the | ||
| 13 | file is closed. Fix DFS parsing to properly handle path consumed field, | ||
| 14 | and to handle certain codepage conversions better. Fix mount and | ||
| 15 | umount race that can cause oops in mount or umount or reconnect. | ||
| 12 | 16 | ||
| 13 | Version 1.54 | 17 | Version 1.54 |
| 14 | ------------ | 18 | ------------ |
diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h index f1ae1f57c30d..c57c0565547f 100644 --- a/fs/cifs/cifsglob.h +++ b/fs/cifs/cifsglob.h | |||
| @@ -606,7 +606,15 @@ GLOBAL_EXTERN struct list_head cifs_tcp_ses_list; | |||
| 606 | * changes to the tcon->tidStatus should be done while holding this lock. | 606 | * changes to the tcon->tidStatus should be done while holding this lock. |
| 607 | */ | 607 | */ |
| 608 | GLOBAL_EXTERN rwlock_t cifs_tcp_ses_lock; | 608 | GLOBAL_EXTERN rwlock_t cifs_tcp_ses_lock; |
| 609 | GLOBAL_EXTERN rwlock_t GlobalSMBSeslock; /* protects list inserts on 3 above */ | 609 | |
| 610 | /* | ||
| 611 | * This lock protects the cifs_file->llist and cifs_file->flist | ||
| 612 | * list operations, and updates to some flags (cifs_file->invalidHandle) | ||
| 613 | * It will be moved to either use the tcon->stat_lock or equivalent later. | ||
| 614 | * If cifs_tcp_ses_lock and the lock below are both needed to be held, then | ||
| 615 | * the cifs_tcp_ses_lock must be grabbed first and released last. | ||
| 616 | */ | ||
| 617 | GLOBAL_EXTERN rwlock_t GlobalSMBSeslock; | ||
| 610 | 618 | ||
| 611 | GLOBAL_EXTERN struct list_head GlobalOplock_Q; | 619 | GLOBAL_EXTERN struct list_head GlobalOplock_Q; |
| 612 | 620 | ||
diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c index bdda46dd435a..2af8626ced43 100644 --- a/fs/cifs/cifssmb.c +++ b/fs/cifs/cifssmb.c | |||
| @@ -295,7 +295,7 @@ smb_init(int smb_command, int wct, struct cifsTconInfo *tcon, | |||
| 295 | check for tcp and smb session status done differently | 295 | check for tcp and smb session status done differently |
| 296 | for those three - in the calling routine */ | 296 | for those three - in the calling routine */ |
| 297 | if (tcon) { | 297 | if (tcon) { |
| 298 | if (tcon->need_reconnect) { | 298 | if (tcon->tidStatus == CifsExiting) { |
| 299 | /* only tree disconnect, open, and write, | 299 | /* only tree disconnect, open, and write, |
| 300 | (and ulogoff which does not have tcon) | 300 | (and ulogoff which does not have tcon) |
| 301 | are allowed as we start force umount */ | 301 | are allowed as we start force umount */ |
diff --git a/fs/cifs/file.c b/fs/cifs/file.c index 6449e1aae621..b691b893a848 100644 --- a/fs/cifs/file.c +++ b/fs/cifs/file.c | |||
| @@ -488,12 +488,13 @@ int cifs_close(struct inode *inode, struct file *file) | |||
| 488 | pTcon = cifs_sb->tcon; | 488 | pTcon = cifs_sb->tcon; |
| 489 | if (pSMBFile) { | 489 | if (pSMBFile) { |
| 490 | struct cifsLockInfo *li, *tmp; | 490 | struct cifsLockInfo *li, *tmp; |
| 491 | 491 | write_lock(&GlobalSMBSeslock); | |
| 492 | pSMBFile->closePend = true; | 492 | pSMBFile->closePend = true; |
| 493 | if (pTcon) { | 493 | if (pTcon) { |
| 494 | /* no sense reconnecting to close a file that is | 494 | /* no sense reconnecting to close a file that is |
| 495 | already closed */ | 495 | already closed */ |
| 496 | if (!pTcon->need_reconnect) { | 496 | if (!pTcon->need_reconnect) { |
| 497 | write_unlock(&GlobalSMBSeslock); | ||
| 497 | timeout = 2; | 498 | timeout = 2; |
| 498 | while ((atomic_read(&pSMBFile->wrtPending) != 0) | 499 | while ((atomic_read(&pSMBFile->wrtPending) != 0) |
| 499 | && (timeout <= 2048)) { | 500 | && (timeout <= 2048)) { |
| @@ -510,12 +511,15 @@ int cifs_close(struct inode *inode, struct file *file) | |||
| 510 | timeout *= 4; | 511 | timeout *= 4; |
| 511 | } | 512 | } |
| 512 | if (atomic_read(&pSMBFile->wrtPending)) | 513 | if (atomic_read(&pSMBFile->wrtPending)) |
| 513 | cERROR(1, | 514 | cERROR(1, ("close with pending write")); |
| 514 | ("close with pending writes")); | 515 | if (!pTcon->need_reconnect && |
| 515 | rc = CIFSSMBClose(xid, pTcon, | 516 | !pSMBFile->invalidHandle) |
| 517 | rc = CIFSSMBClose(xid, pTcon, | ||
| 516 | pSMBFile->netfid); | 518 | pSMBFile->netfid); |
| 517 | } | 519 | } else |
| 518 | } | 520 | write_unlock(&GlobalSMBSeslock); |
| 521 | } else | ||
| 522 | write_unlock(&GlobalSMBSeslock); | ||
| 519 | 523 | ||
| 520 | /* Delete any outstanding lock records. | 524 | /* Delete any outstanding lock records. |
| 521 | We'll lose them when the file is closed anyway. */ | 525 | We'll lose them when the file is closed anyway. */ |
| @@ -587,15 +591,18 @@ int cifs_closedir(struct inode *inode, struct file *file) | |||
| 587 | pTcon = cifs_sb->tcon; | 591 | pTcon = cifs_sb->tcon; |
| 588 | 592 | ||
| 589 | cFYI(1, ("Freeing private data in close dir")); | 593 | cFYI(1, ("Freeing private data in close dir")); |
| 594 | write_lock(&GlobalSMBSeslock); | ||
| 590 | if (!pCFileStruct->srch_inf.endOfSearch && | 595 | if (!pCFileStruct->srch_inf.endOfSearch && |
| 591 | !pCFileStruct->invalidHandle) { | 596 | !pCFileStruct->invalidHandle) { |
| 592 | pCFileStruct->invalidHandle = true; | 597 | pCFileStruct->invalidHandle = true; |
| 598 | write_unlock(&GlobalSMBSeslock); | ||
| 593 | rc = CIFSFindClose(xid, pTcon, pCFileStruct->netfid); | 599 | rc = CIFSFindClose(xid, pTcon, pCFileStruct->netfid); |
| 594 | cFYI(1, ("Closing uncompleted readdir with rc %d", | 600 | cFYI(1, ("Closing uncompleted readdir with rc %d", |
| 595 | rc)); | 601 | rc)); |
| 596 | /* not much we can do if it fails anyway, ignore rc */ | 602 | /* not much we can do if it fails anyway, ignore rc */ |
| 597 | rc = 0; | 603 | rc = 0; |
| 598 | } | 604 | } else |
| 605 | write_unlock(&GlobalSMBSeslock); | ||
| 599 | ptmp = pCFileStruct->srch_inf.ntwrk_buf_start; | 606 | ptmp = pCFileStruct->srch_inf.ntwrk_buf_start; |
| 600 | if (ptmp) { | 607 | if (ptmp) { |
| 601 | cFYI(1, ("closedir free smb buf in srch struct")); | 608 | cFYI(1, ("closedir free smb buf in srch struct")); |
diff --git a/fs/cifs/misc.c b/fs/cifs/misc.c index addd1dcc2d79..9ee3f689c2b0 100644 --- a/fs/cifs/misc.c +++ b/fs/cifs/misc.c | |||
| @@ -555,12 +555,14 @@ is_valid_oplock_break(struct smb_hdr *buf, struct TCP_Server_Info *srv) | |||
| 555 | continue; | 555 | continue; |
| 556 | 556 | ||
| 557 | cifs_stats_inc(&tcon->num_oplock_brks); | 557 | cifs_stats_inc(&tcon->num_oplock_brks); |
| 558 | write_lock(&GlobalSMBSeslock); | ||
| 558 | list_for_each(tmp2, &tcon->openFileList) { | 559 | list_for_each(tmp2, &tcon->openFileList) { |
| 559 | netfile = list_entry(tmp2, struct cifsFileInfo, | 560 | netfile = list_entry(tmp2, struct cifsFileInfo, |
| 560 | tlist); | 561 | tlist); |
| 561 | if (pSMB->Fid != netfile->netfid) | 562 | if (pSMB->Fid != netfile->netfid) |
| 562 | continue; | 563 | continue; |
| 563 | 564 | ||
| 565 | write_unlock(&GlobalSMBSeslock); | ||
| 564 | read_unlock(&cifs_tcp_ses_lock); | 566 | read_unlock(&cifs_tcp_ses_lock); |
| 565 | cFYI(1, ("file id match, oplock break")); | 567 | cFYI(1, ("file id match, oplock break")); |
| 566 | pCifsInode = CIFS_I(netfile->pInode); | 568 | pCifsInode = CIFS_I(netfile->pInode); |
| @@ -576,6 +578,7 @@ is_valid_oplock_break(struct smb_hdr *buf, struct TCP_Server_Info *srv) | |||
| 576 | 578 | ||
| 577 | return true; | 579 | return true; |
| 578 | } | 580 | } |
| 581 | write_unlock(&GlobalSMBSeslock); | ||
| 579 | read_unlock(&cifs_tcp_ses_lock); | 582 | read_unlock(&cifs_tcp_ses_lock); |
| 580 | cFYI(1, ("No matching file for oplock break")); | 583 | cFYI(1, ("No matching file for oplock break")); |
| 581 | return true; | 584 | return true; |
diff --git a/fs/cifs/readdir.c b/fs/cifs/readdir.c index 58d57299f2a0..9f51f9bf0292 100644 --- a/fs/cifs/readdir.c +++ b/fs/cifs/readdir.c | |||
| @@ -741,11 +741,14 @@ static int find_cifs_entry(const int xid, struct cifsTconInfo *pTcon, | |||
| 741 | (index_to_find < first_entry_in_buffer)) { | 741 | (index_to_find < first_entry_in_buffer)) { |
| 742 | /* close and restart search */ | 742 | /* close and restart search */ |
| 743 | cFYI(1, ("search backing up - close and restart search")); | 743 | cFYI(1, ("search backing up - close and restart search")); |
| 744 | write_lock(&GlobalSMBSeslock); | ||
| 744 | if (!cifsFile->srch_inf.endOfSearch && | 745 | if (!cifsFile->srch_inf.endOfSearch && |
| 745 | !cifsFile->invalidHandle) { | 746 | !cifsFile->invalidHandle) { |
| 746 | cifsFile->invalidHandle = true; | 747 | cifsFile->invalidHandle = true; |
| 748 | write_unlock(&GlobalSMBSeslock); | ||
| 747 | CIFSFindClose(xid, pTcon, cifsFile->netfid); | 749 | CIFSFindClose(xid, pTcon, cifsFile->netfid); |
| 748 | } | 750 | } else |
| 751 | write_unlock(&GlobalSMBSeslock); | ||
| 749 | if (cifsFile->srch_inf.ntwrk_buf_start) { | 752 | if (cifsFile->srch_inf.ntwrk_buf_start) { |
| 750 | cFYI(1, ("freeing SMB ff cache buf on search rewind")); | 753 | cFYI(1, ("freeing SMB ff cache buf on search rewind")); |
| 751 | if (cifsFile->srch_inf.smallBuf) | 754 | if (cifsFile->srch_inf.smallBuf) |
diff --git a/fs/ecryptfs/keystore.c b/fs/ecryptfs/keystore.c index e22bc3961345..0d713b691941 100644 --- a/fs/ecryptfs/keystore.c +++ b/fs/ecryptfs/keystore.c | |||
| @@ -1037,17 +1037,14 @@ static int | |||
| 1037 | decrypt_passphrase_encrypted_session_key(struct ecryptfs_auth_tok *auth_tok, | 1037 | decrypt_passphrase_encrypted_session_key(struct ecryptfs_auth_tok *auth_tok, |
| 1038 | struct ecryptfs_crypt_stat *crypt_stat) | 1038 | struct ecryptfs_crypt_stat *crypt_stat) |
| 1039 | { | 1039 | { |
| 1040 | struct scatterlist dst_sg; | 1040 | struct scatterlist dst_sg[2]; |
| 1041 | struct scatterlist src_sg; | 1041 | struct scatterlist src_sg[2]; |
| 1042 | struct mutex *tfm_mutex; | 1042 | struct mutex *tfm_mutex; |
| 1043 | struct blkcipher_desc desc = { | 1043 | struct blkcipher_desc desc = { |
| 1044 | .flags = CRYPTO_TFM_REQ_MAY_SLEEP | 1044 | .flags = CRYPTO_TFM_REQ_MAY_SLEEP |
| 1045 | }; | 1045 | }; |
| 1046 | int rc = 0; | 1046 | int rc = 0; |
| 1047 | 1047 | ||
| 1048 | sg_init_table(&dst_sg, 1); | ||
| 1049 | sg_init_table(&src_sg, 1); | ||
| 1050 | |||
| 1051 | if (unlikely(ecryptfs_verbosity > 0)) { | 1048 | if (unlikely(ecryptfs_verbosity > 0)) { |
| 1052 | ecryptfs_printk( | 1049 | ecryptfs_printk( |
| 1053 | KERN_DEBUG, "Session key encryption key (size [%d]):\n", | 1050 | KERN_DEBUG, "Session key encryption key (size [%d]):\n", |
| @@ -1066,8 +1063,8 @@ decrypt_passphrase_encrypted_session_key(struct ecryptfs_auth_tok *auth_tok, | |||
| 1066 | } | 1063 | } |
| 1067 | rc = virt_to_scatterlist(auth_tok->session_key.encrypted_key, | 1064 | rc = virt_to_scatterlist(auth_tok->session_key.encrypted_key, |
| 1068 | auth_tok->session_key.encrypted_key_size, | 1065 | auth_tok->session_key.encrypted_key_size, |
| 1069 | &src_sg, 1); | 1066 | src_sg, 2); |
| 1070 | if (rc != 1) { | 1067 | if (rc < 1 || rc > 2) { |
| 1071 | printk(KERN_ERR "Internal error whilst attempting to convert " | 1068 | printk(KERN_ERR "Internal error whilst attempting to convert " |
| 1072 | "auth_tok->session_key.encrypted_key to scatterlist; " | 1069 | "auth_tok->session_key.encrypted_key to scatterlist; " |
| 1073 | "expected rc = 1; got rc = [%d]. " | 1070 | "expected rc = 1; got rc = [%d]. " |
| @@ -1079,8 +1076,8 @@ decrypt_passphrase_encrypted_session_key(struct ecryptfs_auth_tok *auth_tok, | |||
| 1079 | auth_tok->session_key.encrypted_key_size; | 1076 | auth_tok->session_key.encrypted_key_size; |
| 1080 | rc = virt_to_scatterlist(auth_tok->session_key.decrypted_key, | 1077 | rc = virt_to_scatterlist(auth_tok->session_key.decrypted_key, |
| 1081 | auth_tok->session_key.decrypted_key_size, | 1078 | auth_tok->session_key.decrypted_key_size, |
| 1082 | &dst_sg, 1); | 1079 | dst_sg, 2); |
| 1083 | if (rc != 1) { | 1080 | if (rc < 1 || rc > 2) { |
| 1084 | printk(KERN_ERR "Internal error whilst attempting to convert " | 1081 | printk(KERN_ERR "Internal error whilst attempting to convert " |
| 1085 | "auth_tok->session_key.decrypted_key to scatterlist; " | 1082 | "auth_tok->session_key.decrypted_key to scatterlist; " |
| 1086 | "expected rc = 1; got rc = [%d]\n", rc); | 1083 | "expected rc = 1; got rc = [%d]\n", rc); |
| @@ -1096,7 +1093,7 @@ decrypt_passphrase_encrypted_session_key(struct ecryptfs_auth_tok *auth_tok, | |||
| 1096 | rc = -EINVAL; | 1093 | rc = -EINVAL; |
| 1097 | goto out; | 1094 | goto out; |
| 1098 | } | 1095 | } |
| 1099 | rc = crypto_blkcipher_decrypt(&desc, &dst_sg, &src_sg, | 1096 | rc = crypto_blkcipher_decrypt(&desc, dst_sg, src_sg, |
| 1100 | auth_tok->session_key.encrypted_key_size); | 1097 | auth_tok->session_key.encrypted_key_size); |
| 1101 | mutex_unlock(tfm_mutex); | 1098 | mutex_unlock(tfm_mutex); |
| 1102 | if (unlikely(rc)) { | 1099 | if (unlikely(rc)) { |
| @@ -1539,8 +1536,8 @@ write_tag_3_packet(char *dest, size_t *remaining_bytes, | |||
| 1539 | size_t i; | 1536 | size_t i; |
| 1540 | size_t encrypted_session_key_valid = 0; | 1537 | size_t encrypted_session_key_valid = 0; |
| 1541 | char session_key_encryption_key[ECRYPTFS_MAX_KEY_BYTES]; | 1538 | char session_key_encryption_key[ECRYPTFS_MAX_KEY_BYTES]; |
| 1542 | struct scatterlist dst_sg; | 1539 | struct scatterlist dst_sg[2]; |
| 1543 | struct scatterlist src_sg; | 1540 | struct scatterlist src_sg[2]; |
| 1544 | struct mutex *tfm_mutex = NULL; | 1541 | struct mutex *tfm_mutex = NULL; |
| 1545 | u8 cipher_code; | 1542 | u8 cipher_code; |
| 1546 | size_t packet_size_length; | 1543 | size_t packet_size_length; |
| @@ -1619,8 +1616,8 @@ write_tag_3_packet(char *dest, size_t *remaining_bytes, | |||
| 1619 | ecryptfs_dump_hex(session_key_encryption_key, 16); | 1616 | ecryptfs_dump_hex(session_key_encryption_key, 16); |
| 1620 | } | 1617 | } |
| 1621 | rc = virt_to_scatterlist(crypt_stat->key, key_rec->enc_key_size, | 1618 | rc = virt_to_scatterlist(crypt_stat->key, key_rec->enc_key_size, |
| 1622 | &src_sg, 1); | 1619 | src_sg, 2); |
| 1623 | if (rc != 1) { | 1620 | if (rc < 1 || rc > 2) { |
| 1624 | ecryptfs_printk(KERN_ERR, "Error generating scatterlist " | 1621 | ecryptfs_printk(KERN_ERR, "Error generating scatterlist " |
| 1625 | "for crypt_stat session key; expected rc = 1; " | 1622 | "for crypt_stat session key; expected rc = 1; " |
| 1626 | "got rc = [%d]. key_rec->enc_key_size = [%d]\n", | 1623 | "got rc = [%d]. key_rec->enc_key_size = [%d]\n", |
| @@ -1629,8 +1626,8 @@ write_tag_3_packet(char *dest, size_t *remaining_bytes, | |||
| 1629 | goto out; | 1626 | goto out; |
| 1630 | } | 1627 | } |
| 1631 | rc = virt_to_scatterlist(key_rec->enc_key, key_rec->enc_key_size, | 1628 | rc = virt_to_scatterlist(key_rec->enc_key, key_rec->enc_key_size, |
| 1632 | &dst_sg, 1); | 1629 | dst_sg, 2); |
| 1633 | if (rc != 1) { | 1630 | if (rc < 1 || rc > 2) { |
| 1634 | ecryptfs_printk(KERN_ERR, "Error generating scatterlist " | 1631 | ecryptfs_printk(KERN_ERR, "Error generating scatterlist " |
| 1635 | "for crypt_stat encrypted session key; " | 1632 | "for crypt_stat encrypted session key; " |
| 1636 | "expected rc = 1; got rc = [%d]. " | 1633 | "expected rc = 1; got rc = [%d]. " |
| @@ -1651,7 +1648,7 @@ write_tag_3_packet(char *dest, size_t *remaining_bytes, | |||
| 1651 | rc = 0; | 1648 | rc = 0; |
| 1652 | ecryptfs_printk(KERN_DEBUG, "Encrypting [%d] bytes of the key\n", | 1649 | ecryptfs_printk(KERN_DEBUG, "Encrypting [%d] bytes of the key\n", |
| 1653 | crypt_stat->key_size); | 1650 | crypt_stat->key_size); |
| 1654 | rc = crypto_blkcipher_encrypt(&desc, &dst_sg, &src_sg, | 1651 | rc = crypto_blkcipher_encrypt(&desc, dst_sg, src_sg, |
| 1655 | (*key_rec).enc_key_size); | 1652 | (*key_rec).enc_key_size); |
| 1656 | mutex_unlock(tfm_mutex); | 1653 | mutex_unlock(tfm_mutex); |
| 1657 | if (rc) { | 1654 | if (rc) { |
diff --git a/fs/hostfs/hostfs.h b/fs/hostfs/hostfs.h index 6ae9011b95eb..2f34f8f2134b 100644 --- a/fs/hostfs/hostfs.h +++ b/fs/hostfs/hostfs.h | |||
| @@ -81,7 +81,7 @@ extern int do_rmdir(const char *file); | |||
| 81 | extern int do_mknod(const char *file, int mode, unsigned int major, | 81 | extern int do_mknod(const char *file, int mode, unsigned int major, |
| 82 | unsigned int minor); | 82 | unsigned int minor); |
| 83 | extern int link_file(const char *from, const char *to); | 83 | extern int link_file(const char *from, const char *to); |
| 84 | extern int do_readlink(char *file, char *buf, int size); | 84 | extern int hostfs_do_readlink(char *file, char *buf, int size); |
| 85 | extern int rename_file(char *from, char *to); | 85 | extern int rename_file(char *from, char *to); |
| 86 | extern int do_statfs(char *root, long *bsize_out, long long *blocks_out, | 86 | extern int do_statfs(char *root, long *bsize_out, long long *blocks_out, |
| 87 | long long *bfree_out, long long *bavail_out, | 87 | long long *bfree_out, long long *bavail_out, |
diff --git a/fs/hostfs/hostfs_kern.c b/fs/hostfs/hostfs_kern.c index 7f34f4385de0..3a31451ac170 100644 --- a/fs/hostfs/hostfs_kern.c +++ b/fs/hostfs/hostfs_kern.c | |||
| @@ -168,7 +168,7 @@ static char *follow_link(char *link) | |||
| 168 | if (name == NULL) | 168 | if (name == NULL) |
| 169 | goto out; | 169 | goto out; |
| 170 | 170 | ||
| 171 | n = do_readlink(link, name, len); | 171 | n = hostfs_do_readlink(link, name, len); |
| 172 | if (n < len) | 172 | if (n < len) |
| 173 | break; | 173 | break; |
| 174 | len *= 2; | 174 | len *= 2; |
| @@ -943,7 +943,7 @@ int hostfs_link_readpage(struct file *file, struct page *page) | |||
| 943 | name = inode_name(page->mapping->host, 0); | 943 | name = inode_name(page->mapping->host, 0); |
| 944 | if (name == NULL) | 944 | if (name == NULL) |
| 945 | return -ENOMEM; | 945 | return -ENOMEM; |
| 946 | err = do_readlink(name, buffer, PAGE_CACHE_SIZE); | 946 | err = hostfs_do_readlink(name, buffer, PAGE_CACHE_SIZE); |
| 947 | kfree(name); | 947 | kfree(name); |
| 948 | if (err == PAGE_CACHE_SIZE) | 948 | if (err == PAGE_CACHE_SIZE) |
| 949 | err = -E2BIG; | 949 | err = -E2BIG; |
diff --git a/fs/hostfs/hostfs_user.c b/fs/hostfs/hostfs_user.c index 53fd0a67c11a..b79424f93282 100644 --- a/fs/hostfs/hostfs_user.c +++ b/fs/hostfs/hostfs_user.c | |||
| @@ -377,7 +377,7 @@ int link_file(const char *to, const char *from) | |||
| 377 | return 0; | 377 | return 0; |
| 378 | } | 378 | } |
| 379 | 379 | ||
| 380 | int do_readlink(char *file, char *buf, int size) | 380 | int hostfs_do_readlink(char *file, char *buf, int size) |
| 381 | { | 381 | { |
| 382 | int n; | 382 | int n; |
| 383 | 383 | ||
diff --git a/fs/namei.c b/fs/namei.c index 09ce58e49e72..d34e0f9681c6 100644 --- a/fs/namei.c +++ b/fs/namei.c | |||
| @@ -1378,7 +1378,7 @@ static int may_delete(struct inode *dir,struct dentry *victim,int isdir) | |||
| 1378 | if (IS_APPEND(dir)) | 1378 | if (IS_APPEND(dir)) |
| 1379 | return -EPERM; | 1379 | return -EPERM; |
| 1380 | if (check_sticky(dir, victim->d_inode)||IS_APPEND(victim->d_inode)|| | 1380 | if (check_sticky(dir, victim->d_inode)||IS_APPEND(victim->d_inode)|| |
| 1381 | IS_IMMUTABLE(victim->d_inode)) | 1381 | IS_IMMUTABLE(victim->d_inode) || IS_SWAPFILE(victim->d_inode)) |
| 1382 | return -EPERM; | 1382 | return -EPERM; |
| 1383 | if (isdir) { | 1383 | if (isdir) { |
| 1384 | if (!S_ISDIR(victim->d_inode->i_mode)) | 1384 | if (!S_ISDIR(victim->d_inode->i_mode)) |
diff --git a/fs/partitions/check.c b/fs/partitions/check.c index 633f7a0ebb2c..6d5b213b8a9b 100644 --- a/fs/partitions/check.c +++ b/fs/partitions/check.c | |||
| @@ -348,8 +348,8 @@ static ssize_t whole_disk_show(struct device *dev, | |||
| 348 | static DEVICE_ATTR(whole_disk, S_IRUSR | S_IRGRP | S_IROTH, | 348 | static DEVICE_ATTR(whole_disk, S_IRUSR | S_IRGRP | S_IROTH, |
| 349 | whole_disk_show, NULL); | 349 | whole_disk_show, NULL); |
| 350 | 350 | ||
| 351 | int add_partition(struct gendisk *disk, int partno, | 351 | struct hd_struct *add_partition(struct gendisk *disk, int partno, |
| 352 | sector_t start, sector_t len, int flags) | 352 | sector_t start, sector_t len, int flags) |
| 353 | { | 353 | { |
| 354 | struct hd_struct *p; | 354 | struct hd_struct *p; |
| 355 | dev_t devt = MKDEV(0, 0); | 355 | dev_t devt = MKDEV(0, 0); |
| @@ -361,15 +361,15 @@ int add_partition(struct gendisk *disk, int partno, | |||
| 361 | 361 | ||
| 362 | err = disk_expand_part_tbl(disk, partno); | 362 | err = disk_expand_part_tbl(disk, partno); |
| 363 | if (err) | 363 | if (err) |
| 364 | return err; | 364 | return ERR_PTR(err); |
| 365 | ptbl = disk->part_tbl; | 365 | ptbl = disk->part_tbl; |
| 366 | 366 | ||
| 367 | if (ptbl->part[partno]) | 367 | if (ptbl->part[partno]) |
| 368 | return -EBUSY; | 368 | return ERR_PTR(-EBUSY); |
| 369 | 369 | ||
| 370 | p = kzalloc(sizeof(*p), GFP_KERNEL); | 370 | p = kzalloc(sizeof(*p), GFP_KERNEL); |
| 371 | if (!p) | 371 | if (!p) |
| 372 | return -ENOMEM; | 372 | return ERR_PTR(-EBUSY); |
| 373 | 373 | ||
| 374 | if (!init_part_stats(p)) { | 374 | if (!init_part_stats(p)) { |
| 375 | err = -ENOMEM; | 375 | err = -ENOMEM; |
| @@ -395,7 +395,7 @@ int add_partition(struct gendisk *disk, int partno, | |||
| 395 | 395 | ||
| 396 | err = blk_alloc_devt(p, &devt); | 396 | err = blk_alloc_devt(p, &devt); |
| 397 | if (err) | 397 | if (err) |
| 398 | goto out_free; | 398 | goto out_free_stats; |
| 399 | pdev->devt = devt; | 399 | pdev->devt = devt; |
| 400 | 400 | ||
| 401 | /* delay uevent until 'holders' subdir is created */ | 401 | /* delay uevent until 'holders' subdir is created */ |
| @@ -424,18 +424,20 @@ int add_partition(struct gendisk *disk, int partno, | |||
| 424 | if (!ddev->uevent_suppress) | 424 | if (!ddev->uevent_suppress) |
| 425 | kobject_uevent(&pdev->kobj, KOBJ_ADD); | 425 | kobject_uevent(&pdev->kobj, KOBJ_ADD); |
| 426 | 426 | ||
| 427 | return 0; | 427 | return p; |
| 428 | 428 | ||
| 429 | out_free_stats: | ||
| 430 | free_part_stats(p); | ||
| 429 | out_free: | 431 | out_free: |
| 430 | kfree(p); | 432 | kfree(p); |
| 431 | return err; | 433 | return ERR_PTR(err); |
| 432 | out_del: | 434 | out_del: |
| 433 | kobject_put(p->holder_dir); | 435 | kobject_put(p->holder_dir); |
| 434 | device_del(pdev); | 436 | device_del(pdev); |
| 435 | out_put: | 437 | out_put: |
| 436 | put_device(pdev); | 438 | put_device(pdev); |
| 437 | blk_free_devt(devt); | 439 | blk_free_devt(devt); |
| 438 | return err; | 440 | return ERR_PTR(err); |
| 439 | } | 441 | } |
| 440 | 442 | ||
| 441 | /* Not exported, helper to add_disk(). */ | 443 | /* Not exported, helper to add_disk(). */ |
| @@ -566,15 +568,16 @@ int rescan_partitions(struct gendisk *disk, struct block_device *bdev) | |||
| 566 | disk->disk_name, p, (unsigned long long) size); | 568 | disk->disk_name, p, (unsigned long long) size); |
| 567 | size = get_capacity(disk) - from; | 569 | size = get_capacity(disk) - from; |
| 568 | } | 570 | } |
| 569 | res = add_partition(disk, p, from, size, state->parts[p].flags); | 571 | part = add_partition(disk, p, from, size, |
| 570 | if (res) { | 572 | state->parts[p].flags); |
| 571 | printk(KERN_ERR " %s: p%d could not be added: %d\n", | 573 | if (IS_ERR(part)) { |
| 572 | disk->disk_name, p, -res); | 574 | printk(KERN_ERR " %s: p%d could not be added: %ld\n", |
| 575 | disk->disk_name, p, -PTR_ERR(part)); | ||
| 573 | continue; | 576 | continue; |
| 574 | } | 577 | } |
| 575 | #ifdef CONFIG_BLK_DEV_MD | 578 | #ifdef CONFIG_BLK_DEV_MD |
| 576 | if (state->parts[p].flags & ADDPART_FLAG_RAID) | 579 | if (state->parts[p].flags & ADDPART_FLAG_RAID) |
| 577 | md_autodetect_dev(bdev->bd_dev+p); | 580 | md_autodetect_dev(part_to_dev(part)->devt); |
| 578 | #endif | 581 | #endif |
| 579 | } | 582 | } |
| 580 | kfree(state); | 583 | kfree(state); |
diff --git a/include/linux/cpuset.h b/include/linux/cpuset.h index 2691926fb506..8e540d32c9fe 100644 --- a/include/linux/cpuset.h +++ b/include/linux/cpuset.h | |||
| @@ -74,8 +74,6 @@ static inline int cpuset_do_slab_mem_spread(void) | |||
| 74 | return current->flags & PF_SPREAD_SLAB; | 74 | return current->flags & PF_SPREAD_SLAB; |
| 75 | } | 75 | } |
| 76 | 76 | ||
| 77 | extern void cpuset_track_online_nodes(void); | ||
| 78 | |||
| 79 | extern int current_cpuset_is_being_rebound(void); | 77 | extern int current_cpuset_is_being_rebound(void); |
| 80 | 78 | ||
| 81 | extern void rebuild_sched_domains(void); | 79 | extern void rebuild_sched_domains(void); |
| @@ -151,8 +149,6 @@ static inline int cpuset_do_slab_mem_spread(void) | |||
| 151 | return 0; | 149 | return 0; |
| 152 | } | 150 | } |
| 153 | 151 | ||
| 154 | static inline void cpuset_track_online_nodes(void) {} | ||
| 155 | |||
| 156 | static inline int current_cpuset_is_being_rebound(void) | 152 | static inline int current_cpuset_is_being_rebound(void) |
| 157 | { | 153 | { |
| 158 | return 0; | 154 | return 0; |
diff --git a/include/linux/genhd.h b/include/linux/genhd.h index e439e6aed832..3df7742ce246 100644 --- a/include/linux/genhd.h +++ b/include/linux/genhd.h | |||
| @@ -522,7 +522,9 @@ extern char *disk_name (struct gendisk *hd, int partno, char *buf); | |||
| 522 | 522 | ||
| 523 | extern int disk_expand_part_tbl(struct gendisk *disk, int target); | 523 | extern int disk_expand_part_tbl(struct gendisk *disk, int target); |
| 524 | extern int rescan_partitions(struct gendisk *disk, struct block_device *bdev); | 524 | extern int rescan_partitions(struct gendisk *disk, struct block_device *bdev); |
| 525 | extern int __must_check add_partition(struct gendisk *, int, sector_t, sector_t, int); | 525 | extern struct hd_struct * __must_check add_partition(struct gendisk *disk, |
| 526 | int partno, sector_t start, | ||
| 527 | sector_t len, int flags); | ||
| 526 | extern void delete_partition(struct gendisk *, int); | 528 | extern void delete_partition(struct gendisk *, int); |
| 527 | extern void printk_all_partitions(void); | 529 | extern void printk_all_partitions(void); |
| 528 | 530 | ||
diff --git a/include/linux/net.h b/include/linux/net.h index 6dc14a240042..4515efae4c39 100644 --- a/include/linux/net.h +++ b/include/linux/net.h | |||
| @@ -40,7 +40,7 @@ | |||
| 40 | #define SYS_GETSOCKOPT 15 /* sys_getsockopt(2) */ | 40 | #define SYS_GETSOCKOPT 15 /* sys_getsockopt(2) */ |
| 41 | #define SYS_SENDMSG 16 /* sys_sendmsg(2) */ | 41 | #define SYS_SENDMSG 16 /* sys_sendmsg(2) */ |
| 42 | #define SYS_RECVMSG 17 /* sys_recvmsg(2) */ | 42 | #define SYS_RECVMSG 17 /* sys_recvmsg(2) */ |
| 43 | #define SYS_PACCEPT 18 /* sys_paccept(2) */ | 43 | #define SYS_ACCEPT4 18 /* sys_accept4(2) */ |
| 44 | 44 | ||
| 45 | typedef enum { | 45 | typedef enum { |
| 46 | SS_FREE = 0, /* not allocated */ | 46 | SS_FREE = 0, /* not allocated */ |
| @@ -100,7 +100,7 @@ enum sock_type { | |||
| 100 | * remaining bits are used as flags. */ | 100 | * remaining bits are used as flags. */ |
| 101 | #define SOCK_TYPE_MASK 0xf | 101 | #define SOCK_TYPE_MASK 0xf |
| 102 | 102 | ||
| 103 | /* Flags for socket, socketpair, paccept */ | 103 | /* Flags for socket, socketpair, accept4 */ |
| 104 | #define SOCK_CLOEXEC O_CLOEXEC | 104 | #define SOCK_CLOEXEC O_CLOEXEC |
| 105 | #ifndef SOCK_NONBLOCK | 105 | #ifndef SOCK_NONBLOCK |
| 106 | #define SOCK_NONBLOCK O_NONBLOCK | 106 | #define SOCK_NONBLOCK O_NONBLOCK |
| @@ -223,8 +223,6 @@ extern int sock_map_fd(struct socket *sock, int flags); | |||
| 223 | extern struct socket *sockfd_lookup(int fd, int *err); | 223 | extern struct socket *sockfd_lookup(int fd, int *err); |
| 224 | #define sockfd_put(sock) fput(sock->file) | 224 | #define sockfd_put(sock) fput(sock->file) |
| 225 | extern int net_ratelimit(void); | 225 | extern int net_ratelimit(void); |
| 226 | extern long do_accept(int fd, struct sockaddr __user *upeer_sockaddr, | ||
| 227 | int __user *upeer_addrlen, int flags); | ||
| 228 | 226 | ||
| 229 | #define net_random() random32() | 227 | #define net_random() random32() |
| 230 | #define net_srandom(seed) srandom32((__force u32)seed) | 228 | #define net_srandom(seed) srandom32((__force u32)seed) |
diff --git a/include/linux/ring_buffer.h b/include/linux/ring_buffer.h index 536b0ca46a03..e097c2e6b6dc 100644 --- a/include/linux/ring_buffer.h +++ b/include/linux/ring_buffer.h | |||
| @@ -120,6 +120,9 @@ unsigned long ring_buffer_overruns(struct ring_buffer *buffer); | |||
| 120 | u64 ring_buffer_time_stamp(int cpu); | 120 | u64 ring_buffer_time_stamp(int cpu); |
| 121 | void ring_buffer_normalize_time_stamp(int cpu, u64 *ts); | 121 | void ring_buffer_normalize_time_stamp(int cpu, u64 *ts); |
| 122 | 122 | ||
| 123 | void tracing_on(void); | ||
| 124 | void tracing_off(void); | ||
| 125 | |||
| 123 | enum ring_buffer_flags { | 126 | enum ring_buffer_flags { |
| 124 | RB_FL_OVERWRITE = 1 << 0, | 127 | RB_FL_OVERWRITE = 1 << 0, |
| 125 | }; | 128 | }; |
diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h index d6ff145919ca..04fb47bfb920 100644 --- a/include/linux/syscalls.h +++ b/include/linux/syscalls.h | |||
| @@ -410,8 +410,7 @@ asmlinkage long sys_getsockopt(int fd, int level, int optname, | |||
| 410 | asmlinkage long sys_bind(int, struct sockaddr __user *, int); | 410 | asmlinkage long sys_bind(int, struct sockaddr __user *, int); |
| 411 | asmlinkage long sys_connect(int, struct sockaddr __user *, int); | 411 | asmlinkage long sys_connect(int, struct sockaddr __user *, int); |
| 412 | asmlinkage long sys_accept(int, struct sockaddr __user *, int __user *); | 412 | asmlinkage long sys_accept(int, struct sockaddr __user *, int __user *); |
| 413 | asmlinkage long sys_paccept(int, struct sockaddr __user *, int __user *, | 413 | asmlinkage long sys_accept4(int, struct sockaddr __user *, int __user *, int); |
| 414 | const __user sigset_t *, size_t, int); | ||
| 415 | asmlinkage long sys_getsockname(int, struct sockaddr __user *, int __user *); | 414 | asmlinkage long sys_getsockname(int, struct sockaddr __user *, int __user *); |
| 416 | asmlinkage long sys_getpeername(int, struct sockaddr __user *, int __user *); | 415 | asmlinkage long sys_getpeername(int, struct sockaddr __user *, int __user *); |
| 417 | asmlinkage long sys_send(int, void __user *, size_t, unsigned); | 416 | asmlinkage long sys_send(int, void __user *, size_t, unsigned); |
diff --git a/include/net/mac80211.h b/include/net/mac80211.h index 8856e2d60e9f..73d81bc6aa75 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h | |||
| @@ -74,14 +74,6 @@ | |||
| 74 | */ | 74 | */ |
| 75 | 75 | ||
| 76 | /** | 76 | /** |
| 77 | * enum ieee80211_notification_type - Low level driver notification | ||
| 78 | * @IEEE80211_NOTIFY_RE_ASSOC: start the re-association sequence | ||
| 79 | */ | ||
| 80 | enum ieee80211_notification_types { | ||
| 81 | IEEE80211_NOTIFY_RE_ASSOC, | ||
| 82 | }; | ||
| 83 | |||
| 84 | /** | ||
| 85 | * struct ieee80211_ht_bss_info - describing BSS's HT characteristics | 77 | * struct ieee80211_ht_bss_info - describing BSS's HT characteristics |
| 86 | * | 78 | * |
| 87 | * This structure describes most essential parameters needed | 79 | * This structure describes most essential parameters needed |
| @@ -1798,18 +1790,6 @@ void ieee80211_stop_tx_ba_cb_irqsafe(struct ieee80211_hw *hw, const u8 *ra, | |||
| 1798 | u16 tid); | 1790 | u16 tid); |
| 1799 | 1791 | ||
| 1800 | /** | 1792 | /** |
| 1801 | * ieee80211_notify_mac - low level driver notification | ||
| 1802 | * @hw: pointer as obtained from ieee80211_alloc_hw(). | ||
| 1803 | * @notif_type: enum ieee80211_notification_types | ||
| 1804 | * | ||
| 1805 | * This function must be called by low level driver to inform mac80211 of | ||
| 1806 | * low level driver status change or force mac80211 to re-assoc for low | ||
| 1807 | * level driver internal error that require re-assoc. | ||
| 1808 | */ | ||
| 1809 | void ieee80211_notify_mac(struct ieee80211_hw *hw, | ||
| 1810 | enum ieee80211_notification_types notif_type); | ||
| 1811 | |||
| 1812 | /** | ||
| 1813 | * ieee80211_find_sta - find a station | 1793 | * ieee80211_find_sta - find a station |
| 1814 | * | 1794 | * |
| 1815 | * @hw: pointer as obtained from ieee80211_alloc_hw() | 1795 | * @hw: pointer as obtained from ieee80211_alloc_hw() |
diff --git a/init/Kconfig b/init/Kconfig index 226da2733c1e..f763762d544a 100644 --- a/init/Kconfig +++ b/init/Kconfig | |||
| @@ -354,7 +354,7 @@ config RT_GROUP_SCHED | |||
| 354 | setting below. If enabled, it will also make it impossible to | 354 | setting below. If enabled, it will also make it impossible to |
| 355 | schedule realtime tasks for non-root users until you allocate | 355 | schedule realtime tasks for non-root users until you allocate |
| 356 | realtime bandwidth for them. | 356 | realtime bandwidth for them. |
| 357 | See Documentation/sched-rt-group.txt for more information. | 357 | See Documentation/scheduler/sched-rt-group.txt for more information. |
| 358 | 358 | ||
| 359 | choice | 359 | choice |
| 360 | depends on GROUP_SCHED | 360 | depends on GROUP_SCHED |
diff --git a/ipc/util.c b/ipc/util.c index 49b3ea615dc5..361fd1c96fcf 100644 --- a/ipc/util.c +++ b/ipc/util.c | |||
| @@ -266,9 +266,17 @@ int ipc_addid(struct ipc_ids* ids, struct kern_ipc_perm* new, int size) | |||
| 266 | if (ids->in_use >= size) | 266 | if (ids->in_use >= size) |
| 267 | return -ENOSPC; | 267 | return -ENOSPC; |
| 268 | 268 | ||
| 269 | spin_lock_init(&new->lock); | ||
| 270 | new->deleted = 0; | ||
| 271 | rcu_read_lock(); | ||
| 272 | spin_lock(&new->lock); | ||
| 273 | |||
| 269 | err = idr_get_new(&ids->ipcs_idr, new, &id); | 274 | err = idr_get_new(&ids->ipcs_idr, new, &id); |
| 270 | if (err) | 275 | if (err) { |
| 276 | spin_unlock(&new->lock); | ||
| 277 | rcu_read_unlock(); | ||
| 271 | return err; | 278 | return err; |
| 279 | } | ||
| 272 | 280 | ||
| 273 | ids->in_use++; | 281 | ids->in_use++; |
| 274 | 282 | ||
| @@ -280,10 +288,6 @@ int ipc_addid(struct ipc_ids* ids, struct kern_ipc_perm* new, int size) | |||
| 280 | ids->seq = 0; | 288 | ids->seq = 0; |
| 281 | 289 | ||
| 282 | new->id = ipc_buildid(id, new->seq); | 290 | new->id = ipc_buildid(id, new->seq); |
| 283 | spin_lock_init(&new->lock); | ||
| 284 | new->deleted = 0; | ||
| 285 | rcu_read_lock(); | ||
| 286 | spin_lock(&new->lock); | ||
| 287 | return id; | 291 | return id; |
| 288 | } | 292 | } |
| 289 | 293 | ||
diff --git a/kernel/cgroup.c b/kernel/cgroup.c index 358e77564e6f..fe00b3b983a8 100644 --- a/kernel/cgroup.c +++ b/kernel/cgroup.c | |||
| @@ -2039,10 +2039,13 @@ int cgroupstats_build(struct cgroupstats *stats, struct dentry *dentry) | |||
| 2039 | struct cgroup *cgrp; | 2039 | struct cgroup *cgrp; |
| 2040 | struct cgroup_iter it; | 2040 | struct cgroup_iter it; |
| 2041 | struct task_struct *tsk; | 2041 | struct task_struct *tsk; |
| 2042 | |||
| 2042 | /* | 2043 | /* |
| 2043 | * Validate dentry by checking the superblock operations | 2044 | * Validate dentry by checking the superblock operations, |
| 2045 | * and make sure it's a directory. | ||
| 2044 | */ | 2046 | */ |
| 2045 | if (dentry->d_sb->s_op != &cgroup_ops) | 2047 | if (dentry->d_sb->s_op != &cgroup_ops || |
| 2048 | !S_ISDIR(dentry->d_inode->i_mode)) | ||
| 2046 | goto err; | 2049 | goto err; |
| 2047 | 2050 | ||
| 2048 | ret = 0; | 2051 | ret = 0; |
| @@ -2472,10 +2475,7 @@ static int cgroup_rmdir(struct inode *unused_dir, struct dentry *dentry) | |||
| 2472 | mutex_unlock(&cgroup_mutex); | 2475 | mutex_unlock(&cgroup_mutex); |
| 2473 | return -EBUSY; | 2476 | return -EBUSY; |
| 2474 | } | 2477 | } |
| 2475 | 2478 | mutex_unlock(&cgroup_mutex); | |
| 2476 | parent = cgrp->parent; | ||
| 2477 | root = cgrp->root; | ||
| 2478 | sb = root->sb; | ||
| 2479 | 2479 | ||
| 2480 | /* | 2480 | /* |
| 2481 | * Call pre_destroy handlers of subsys. Notify subsystems | 2481 | * Call pre_destroy handlers of subsys. Notify subsystems |
| @@ -2483,7 +2483,14 @@ static int cgroup_rmdir(struct inode *unused_dir, struct dentry *dentry) | |||
| 2483 | */ | 2483 | */ |
| 2484 | cgroup_call_pre_destroy(cgrp); | 2484 | cgroup_call_pre_destroy(cgrp); |
| 2485 | 2485 | ||
| 2486 | if (cgroup_has_css_refs(cgrp)) { | 2486 | mutex_lock(&cgroup_mutex); |
| 2487 | parent = cgrp->parent; | ||
| 2488 | root = cgrp->root; | ||
| 2489 | sb = root->sb; | ||
| 2490 | |||
| 2491 | if (atomic_read(&cgrp->count) | ||
| 2492 | || !list_empty(&cgrp->children) | ||
| 2493 | || cgroup_has_css_refs(cgrp)) { | ||
| 2487 | mutex_unlock(&cgroup_mutex); | 2494 | mutex_unlock(&cgroup_mutex); |
| 2488 | return -EBUSY; | 2495 | return -EBUSY; |
| 2489 | } | 2496 | } |
diff --git a/kernel/cpuset.c b/kernel/cpuset.c index 3e00526f52ec..da7ff6137f37 100644 --- a/kernel/cpuset.c +++ b/kernel/cpuset.c | |||
| @@ -36,6 +36,7 @@ | |||
| 36 | #include <linux/list.h> | 36 | #include <linux/list.h> |
| 37 | #include <linux/mempolicy.h> | 37 | #include <linux/mempolicy.h> |
| 38 | #include <linux/mm.h> | 38 | #include <linux/mm.h> |
| 39 | #include <linux/memory.h> | ||
| 39 | #include <linux/module.h> | 40 | #include <linux/module.h> |
| 40 | #include <linux/mount.h> | 41 | #include <linux/mount.h> |
| 41 | #include <linux/namei.h> | 42 | #include <linux/namei.h> |
| @@ -587,7 +588,6 @@ static int generate_sched_domains(cpumask_t **domains, | |||
| 587 | int ndoms; /* number of sched domains in result */ | 588 | int ndoms; /* number of sched domains in result */ |
| 588 | int nslot; /* next empty doms[] cpumask_t slot */ | 589 | int nslot; /* next empty doms[] cpumask_t slot */ |
| 589 | 590 | ||
| 590 | ndoms = 0; | ||
| 591 | doms = NULL; | 591 | doms = NULL; |
| 592 | dattr = NULL; | 592 | dattr = NULL; |
| 593 | csa = NULL; | 593 | csa = NULL; |
| @@ -674,10 +674,8 @@ restart: | |||
| 674 | * Convert <csn, csa> to <ndoms, doms> and populate cpu masks. | 674 | * Convert <csn, csa> to <ndoms, doms> and populate cpu masks. |
| 675 | */ | 675 | */ |
| 676 | doms = kmalloc(ndoms * sizeof(cpumask_t), GFP_KERNEL); | 676 | doms = kmalloc(ndoms * sizeof(cpumask_t), GFP_KERNEL); |
| 677 | if (!doms) { | 677 | if (!doms) |
| 678 | ndoms = 0; | ||
| 679 | goto done; | 678 | goto done; |
| 680 | } | ||
| 681 | 679 | ||
| 682 | /* | 680 | /* |
| 683 | * The rest of the code, including the scheduler, can deal with | 681 | * The rest of the code, including the scheduler, can deal with |
| @@ -732,6 +730,13 @@ restart: | |||
| 732 | done: | 730 | done: |
| 733 | kfree(csa); | 731 | kfree(csa); |
| 734 | 732 | ||
| 733 | /* | ||
| 734 | * Fallback to the default domain if kmalloc() failed. | ||
| 735 | * See comments in partition_sched_domains(). | ||
| 736 | */ | ||
| 737 | if (doms == NULL) | ||
| 738 | ndoms = 1; | ||
| 739 | |||
| 735 | *domains = doms; | 740 | *domains = doms; |
| 736 | *attributes = dattr; | 741 | *attributes = dattr; |
| 737 | return ndoms; | 742 | return ndoms; |
| @@ -2011,12 +2016,23 @@ static int cpuset_track_online_cpus(struct notifier_block *unused_nb, | |||
| 2011 | * Call this routine anytime after node_states[N_HIGH_MEMORY] changes. | 2016 | * Call this routine anytime after node_states[N_HIGH_MEMORY] changes. |
| 2012 | * See also the previous routine cpuset_track_online_cpus(). | 2017 | * See also the previous routine cpuset_track_online_cpus(). |
| 2013 | */ | 2018 | */ |
| 2014 | void cpuset_track_online_nodes(void) | 2019 | static int cpuset_track_online_nodes(struct notifier_block *self, |
| 2020 | unsigned long action, void *arg) | ||
| 2015 | { | 2021 | { |
| 2016 | cgroup_lock(); | 2022 | cgroup_lock(); |
| 2017 | top_cpuset.mems_allowed = node_states[N_HIGH_MEMORY]; | 2023 | switch (action) { |
| 2018 | scan_for_empty_cpusets(&top_cpuset); | 2024 | case MEM_ONLINE: |
| 2025 | top_cpuset.mems_allowed = node_states[N_HIGH_MEMORY]; | ||
| 2026 | break; | ||
| 2027 | case MEM_OFFLINE: | ||
| 2028 | top_cpuset.mems_allowed = node_states[N_HIGH_MEMORY]; | ||
| 2029 | scan_for_empty_cpusets(&top_cpuset); | ||
| 2030 | break; | ||
| 2031 | default: | ||
| 2032 | break; | ||
| 2033 | } | ||
| 2019 | cgroup_unlock(); | 2034 | cgroup_unlock(); |
| 2035 | return NOTIFY_OK; | ||
| 2020 | } | 2036 | } |
| 2021 | #endif | 2037 | #endif |
| 2022 | 2038 | ||
| @@ -2032,6 +2048,7 @@ void __init cpuset_init_smp(void) | |||
| 2032 | top_cpuset.mems_allowed = node_states[N_HIGH_MEMORY]; | 2048 | top_cpuset.mems_allowed = node_states[N_HIGH_MEMORY]; |
| 2033 | 2049 | ||
| 2034 | hotcpu_notifier(cpuset_track_online_cpus, 0); | 2050 | hotcpu_notifier(cpuset_track_online_cpus, 0); |
| 2051 | hotplug_memory_notifier(cpuset_track_online_nodes, 10); | ||
| 2035 | } | 2052 | } |
| 2036 | 2053 | ||
| 2037 | /** | 2054 | /** |
diff --git a/kernel/kallsyms.c b/kernel/kallsyms.c index 5072cf1685a2..7b8b0f21a5b1 100644 --- a/kernel/kallsyms.c +++ b/kernel/kallsyms.c | |||
| @@ -304,17 +304,24 @@ int sprint_symbol(char *buffer, unsigned long address) | |||
| 304 | char *modname; | 304 | char *modname; |
| 305 | const char *name; | 305 | const char *name; |
| 306 | unsigned long offset, size; | 306 | unsigned long offset, size; |
| 307 | char namebuf[KSYM_NAME_LEN]; | 307 | int len; |
| 308 | 308 | ||
| 309 | name = kallsyms_lookup(address, &size, &offset, &modname, namebuf); | 309 | name = kallsyms_lookup(address, &size, &offset, &modname, buffer); |
| 310 | if (!name) | 310 | if (!name) |
| 311 | return sprintf(buffer, "0x%lx", address); | 311 | return sprintf(buffer, "0x%lx", address); |
| 312 | 312 | ||
| 313 | if (name != buffer) | ||
| 314 | strcpy(buffer, name); | ||
| 315 | len = strlen(buffer); | ||
| 316 | buffer += len; | ||
| 317 | |||
| 313 | if (modname) | 318 | if (modname) |
| 314 | return sprintf(buffer, "%s+%#lx/%#lx [%s]", name, offset, | 319 | len += sprintf(buffer, "+%#lx/%#lx [%s]", |
| 315 | size, modname); | 320 | offset, size, modname); |
| 316 | else | 321 | else |
| 317 | return sprintf(buffer, "%s+%#lx/%#lx", name, offset, size); | 322 | len += sprintf(buffer, "+%#lx/%#lx", offset, size); |
| 323 | |||
| 324 | return len; | ||
| 318 | } | 325 | } |
| 319 | 326 | ||
| 320 | /* Look up a kernel symbol and print it to the kernel messages. */ | 327 | /* Look up a kernel symbol and print it to the kernel messages. */ |
diff --git a/kernel/posix-cpu-timers.c b/kernel/posix-cpu-timers.c index 153dcb2639c3..895337b16a24 100644 --- a/kernel/posix-cpu-timers.c +++ b/kernel/posix-cpu-timers.c | |||
| @@ -1308,9 +1308,10 @@ static inline int task_cputime_expired(const struct task_cputime *sample, | |||
| 1308 | */ | 1308 | */ |
| 1309 | static inline int fastpath_timer_check(struct task_struct *tsk) | 1309 | static inline int fastpath_timer_check(struct task_struct *tsk) |
| 1310 | { | 1310 | { |
| 1311 | struct signal_struct *sig = tsk->signal; | 1311 | struct signal_struct *sig; |
| 1312 | 1312 | ||
| 1313 | if (unlikely(!sig)) | 1313 | /* tsk == current, ensure it is safe to use ->signal/sighand */ |
| 1314 | if (unlikely(tsk->exit_state)) | ||
| 1314 | return 0; | 1315 | return 0; |
| 1315 | 1316 | ||
| 1316 | if (!task_cputime_zero(&tsk->cputime_expires)) { | 1317 | if (!task_cputime_zero(&tsk->cputime_expires)) { |
| @@ -1323,6 +1324,8 @@ static inline int fastpath_timer_check(struct task_struct *tsk) | |||
| 1323 | if (task_cputime_expired(&task_sample, &tsk->cputime_expires)) | 1324 | if (task_cputime_expired(&task_sample, &tsk->cputime_expires)) |
| 1324 | return 1; | 1325 | return 1; |
| 1325 | } | 1326 | } |
| 1327 | |||
| 1328 | sig = tsk->signal; | ||
| 1326 | if (!task_cputime_zero(&sig->cputime_expires)) { | 1329 | if (!task_cputime_zero(&sig->cputime_expires)) { |
| 1327 | struct task_cputime group_sample; | 1330 | struct task_cputime group_sample; |
| 1328 | 1331 | ||
diff --git a/kernel/power/main.c b/kernel/power/main.c index 19122cf6d827..b8f7ce9473e8 100644 --- a/kernel/power/main.c +++ b/kernel/power/main.c | |||
| @@ -174,7 +174,7 @@ static void suspend_test_finish(const char *label) | |||
| 174 | * has some performance issues. The stack dump of a WARN_ON | 174 | * has some performance issues. The stack dump of a WARN_ON |
| 175 | * is more likely to get the right attention than a printk... | 175 | * is more likely to get the right attention than a printk... |
| 176 | */ | 176 | */ |
| 177 | WARN_ON(msec > (TEST_SUSPEND_SECONDS * 1000)); | 177 | WARN(msec > (TEST_SUSPEND_SECONDS * 1000), "Component: %s\n", label); |
| 178 | } | 178 | } |
| 179 | 179 | ||
| 180 | #else | 180 | #else |
diff --git a/kernel/profile.c b/kernel/profile.c index 9830a037d8db..5b7d1ac7124c 100644 --- a/kernel/profile.c +++ b/kernel/profile.c | |||
| @@ -544,7 +544,7 @@ static const struct file_operations proc_profile_operations = { | |||
| 544 | }; | 544 | }; |
| 545 | 545 | ||
| 546 | #ifdef CONFIG_SMP | 546 | #ifdef CONFIG_SMP |
| 547 | static void __init profile_nop(void *unused) | 547 | static inline void profile_nop(void *unused) |
| 548 | { | 548 | { |
| 549 | } | 549 | } |
| 550 | 550 | ||
diff --git a/kernel/relay.c b/kernel/relay.c index 8d13a7855c08..32b0befdcb6a 100644 --- a/kernel/relay.c +++ b/kernel/relay.c | |||
| @@ -400,7 +400,7 @@ void relay_reset(struct rchan *chan) | |||
| 400 | } | 400 | } |
| 401 | 401 | ||
| 402 | mutex_lock(&relay_channels_mutex); | 402 | mutex_lock(&relay_channels_mutex); |
| 403 | for_each_online_cpu(i) | 403 | for_each_possible_cpu(i) |
| 404 | if (chan->buf[i]) | 404 | if (chan->buf[i]) |
| 405 | __relay_reset(chan->buf[i], 0); | 405 | __relay_reset(chan->buf[i], 0); |
| 406 | mutex_unlock(&relay_channels_mutex); | 406 | mutex_unlock(&relay_channels_mutex); |
| @@ -611,10 +611,9 @@ struct rchan *relay_open(const char *base_filename, | |||
| 611 | return chan; | 611 | return chan; |
| 612 | 612 | ||
| 613 | free_bufs: | 613 | free_bufs: |
| 614 | for_each_online_cpu(i) { | 614 | for_each_possible_cpu(i) { |
| 615 | if (!chan->buf[i]) | 615 | if (chan->buf[i]) |
| 616 | break; | 616 | relay_close_buf(chan->buf[i]); |
| 617 | relay_close_buf(chan->buf[i]); | ||
| 618 | } | 617 | } |
| 619 | 618 | ||
| 620 | kref_put(&chan->kref, relay_destroy_channel); | 619 | kref_put(&chan->kref, relay_destroy_channel); |
diff --git a/kernel/sched.c b/kernel/sched.c index c94baf2969e7..9b1e79371c20 100644 --- a/kernel/sched.c +++ b/kernel/sched.c | |||
| @@ -7789,13 +7789,14 @@ static int dattrs_equal(struct sched_domain_attr *cur, int idx_cur, | |||
| 7789 | * | 7789 | * |
| 7790 | * The passed in 'doms_new' should be kmalloc'd. This routine takes | 7790 | * The passed in 'doms_new' should be kmalloc'd. This routine takes |
| 7791 | * ownership of it and will kfree it when done with it. If the caller | 7791 | * ownership of it and will kfree it when done with it. If the caller |
| 7792 | * failed the kmalloc call, then it can pass in doms_new == NULL, | 7792 | * failed the kmalloc call, then it can pass in doms_new == NULL && |
| 7793 | * and partition_sched_domains() will fallback to the single partition | 7793 | * ndoms_new == 1, and partition_sched_domains() will fallback to |
| 7794 | * 'fallback_doms', it also forces the domains to be rebuilt. | 7794 | * the single partition 'fallback_doms', it also forces the domains |
| 7795 | * to be rebuilt. | ||
| 7795 | * | 7796 | * |
| 7796 | * If doms_new==NULL it will be replaced with cpu_online_map. | 7797 | * If doms_new == NULL it will be replaced with cpu_online_map. |
| 7797 | * ndoms_new==0 is a special case for destroying existing domains. | 7798 | * ndoms_new == 0 is a special case for destroying existing domains, |
| 7798 | * It will not create the default domain. | 7799 | * and it will not create the default domain. |
| 7799 | * | 7800 | * |
| 7800 | * Call with hotplug lock held | 7801 | * Call with hotplug lock held |
| 7801 | */ | 7802 | */ |
diff --git a/kernel/sched_debug.c b/kernel/sched_debug.c index 48ecc51e7701..26ed8e3d1c15 100644 --- a/kernel/sched_debug.c +++ b/kernel/sched_debug.c | |||
| @@ -423,10 +423,11 @@ void proc_sched_show_task(struct task_struct *p, struct seq_file *m) | |||
| 423 | #undef __P | 423 | #undef __P |
| 424 | 424 | ||
| 425 | { | 425 | { |
| 426 | unsigned int this_cpu = raw_smp_processor_id(); | ||
| 426 | u64 t0, t1; | 427 | u64 t0, t1; |
| 427 | 428 | ||
| 428 | t0 = sched_clock(); | 429 | t0 = cpu_clock(this_cpu); |
| 429 | t1 = sched_clock(); | 430 | t1 = cpu_clock(this_cpu); |
| 430 | SEQ_printf(m, "%-35s:%21Ld\n", | 431 | SEQ_printf(m, "%-35s:%21Ld\n", |
| 431 | "clock-delta", (long long)(t1-t0)); | 432 | "clock-delta", (long long)(t1-t0)); |
| 432 | } | 433 | } |
diff --git a/kernel/sched_stats.h b/kernel/sched_stats.h index ee71bec1da66..7dbf72a2b02c 100644 --- a/kernel/sched_stats.h +++ b/kernel/sched_stats.h | |||
| @@ -298,9 +298,11 @@ static inline void account_group_user_time(struct task_struct *tsk, | |||
| 298 | { | 298 | { |
| 299 | struct signal_struct *sig; | 299 | struct signal_struct *sig; |
| 300 | 300 | ||
| 301 | sig = tsk->signal; | 301 | /* tsk == current, ensure it is safe to use ->signal */ |
| 302 | if (unlikely(!sig)) | 302 | if (unlikely(tsk->exit_state)) |
| 303 | return; | 303 | return; |
| 304 | |||
| 305 | sig = tsk->signal; | ||
| 304 | if (sig->cputime.totals) { | 306 | if (sig->cputime.totals) { |
| 305 | struct task_cputime *times; | 307 | struct task_cputime *times; |
| 306 | 308 | ||
| @@ -325,9 +327,11 @@ static inline void account_group_system_time(struct task_struct *tsk, | |||
| 325 | { | 327 | { |
| 326 | struct signal_struct *sig; | 328 | struct signal_struct *sig; |
| 327 | 329 | ||
| 328 | sig = tsk->signal; | 330 | /* tsk == current, ensure it is safe to use ->signal */ |
| 329 | if (unlikely(!sig)) | 331 | if (unlikely(tsk->exit_state)) |
| 330 | return; | 332 | return; |
| 333 | |||
| 334 | sig = tsk->signal; | ||
| 331 | if (sig->cputime.totals) { | 335 | if (sig->cputime.totals) { |
| 332 | struct task_cputime *times; | 336 | struct task_cputime *times; |
| 333 | 337 | ||
| @@ -353,8 +357,11 @@ static inline void account_group_exec_runtime(struct task_struct *tsk, | |||
| 353 | struct signal_struct *sig; | 357 | struct signal_struct *sig; |
| 354 | 358 | ||
| 355 | sig = tsk->signal; | 359 | sig = tsk->signal; |
| 360 | /* see __exit_signal()->task_rq_unlock_wait() */ | ||
| 361 | barrier(); | ||
| 356 | if (unlikely(!sig)) | 362 | if (unlikely(!sig)) |
| 357 | return; | 363 | return; |
| 364 | |||
| 358 | if (sig->cputime.totals) { | 365 | if (sig->cputime.totals) { |
| 359 | struct task_cputime *times; | 366 | struct task_cputime *times; |
| 360 | 367 | ||
diff --git a/kernel/sys_ni.c b/kernel/sys_ni.c index a77b27b11b04..e14a23281707 100644 --- a/kernel/sys_ni.c +++ b/kernel/sys_ni.c | |||
| @@ -31,7 +31,7 @@ cond_syscall(sys_socketpair); | |||
| 31 | cond_syscall(sys_bind); | 31 | cond_syscall(sys_bind); |
| 32 | cond_syscall(sys_listen); | 32 | cond_syscall(sys_listen); |
| 33 | cond_syscall(sys_accept); | 33 | cond_syscall(sys_accept); |
| 34 | cond_syscall(sys_paccept); | 34 | cond_syscall(sys_accept4); |
| 35 | cond_syscall(sys_connect); | 35 | cond_syscall(sys_connect); |
| 36 | cond_syscall(sys_getsockname); | 36 | cond_syscall(sys_getsockname); |
| 37 | cond_syscall(sys_getpeername); | 37 | cond_syscall(sys_getpeername); |
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c index 4a39d24568c8..78db083390f0 100644 --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c | |||
| @@ -185,7 +185,6 @@ enum { | |||
| 185 | }; | 185 | }; |
| 186 | 186 | ||
| 187 | static int ftrace_filtered; | 187 | static int ftrace_filtered; |
| 188 | static int tracing_on; | ||
| 189 | 188 | ||
| 190 | static LIST_HEAD(ftrace_new_addrs); | 189 | static LIST_HEAD(ftrace_new_addrs); |
| 191 | 190 | ||
| @@ -327,96 +326,89 @@ ftrace_record_ip(unsigned long ip) | |||
| 327 | 326 | ||
| 328 | static int | 327 | static int |
| 329 | __ftrace_replace_code(struct dyn_ftrace *rec, | 328 | __ftrace_replace_code(struct dyn_ftrace *rec, |
| 330 | unsigned char *old, unsigned char *new, int enable) | 329 | unsigned char *nop, int enable) |
| 331 | { | 330 | { |
| 332 | unsigned long ip, fl; | 331 | unsigned long ip, fl; |
| 332 | unsigned char *call, *old, *new; | ||
| 333 | 333 | ||
| 334 | ip = rec->ip; | 334 | ip = rec->ip; |
| 335 | 335 | ||
| 336 | if (ftrace_filtered && enable) { | 336 | /* |
| 337 | * If this record is not to be traced and | ||
| 338 | * it is not enabled then do nothing. | ||
| 339 | * | ||
| 340 | * If this record is not to be traced and | ||
| 341 | * it is enabled then disabled it. | ||
| 342 | * | ||
| 343 | */ | ||
| 344 | if (rec->flags & FTRACE_FL_NOTRACE) { | ||
| 345 | if (rec->flags & FTRACE_FL_ENABLED) | ||
| 346 | rec->flags &= ~FTRACE_FL_ENABLED; | ||
| 347 | else | ||
| 348 | return 0; | ||
| 349 | |||
| 350 | } else if (ftrace_filtered && enable) { | ||
| 337 | /* | 351 | /* |
| 338 | * If filtering is on: | 352 | * Filtering is on: |
| 339 | * | ||
| 340 | * If this record is set to be filtered and | ||
| 341 | * is enabled then do nothing. | ||
| 342 | * | ||
| 343 | * If this record is set to be filtered and | ||
| 344 | * it is not enabled, enable it. | ||
| 345 | * | ||
| 346 | * If this record is not set to be filtered | ||
| 347 | * and it is not enabled do nothing. | ||
| 348 | * | ||
| 349 | * If this record is set not to trace then | ||
| 350 | * do nothing. | ||
| 351 | * | ||
| 352 | * If this record is set not to trace and | ||
| 353 | * it is enabled then disable it. | ||
| 354 | * | ||
| 355 | * If this record is not set to be filtered and | ||
| 356 | * it is enabled, disable it. | ||
| 357 | */ | 353 | */ |
| 358 | 354 | ||
| 359 | fl = rec->flags & (FTRACE_FL_FILTER | FTRACE_FL_NOTRACE | | 355 | fl = rec->flags & (FTRACE_FL_FILTER | FTRACE_FL_ENABLED); |
| 360 | FTRACE_FL_ENABLED); | ||
| 361 | 356 | ||
| 362 | if ((fl == (FTRACE_FL_FILTER | FTRACE_FL_ENABLED)) || | 357 | /* Record is filtered and enabled, do nothing */ |
| 363 | (fl == (FTRACE_FL_FILTER | FTRACE_FL_NOTRACE)) || | 358 | if (fl == (FTRACE_FL_FILTER | FTRACE_FL_ENABLED)) |
| 364 | !fl || (fl == FTRACE_FL_NOTRACE)) | ||
| 365 | return 0; | 359 | return 0; |
| 366 | 360 | ||
| 367 | /* | 361 | /* Record is not filtered and is not enabled do nothing */ |
| 368 | * If it is enabled disable it, | 362 | if (!fl) |
| 369 | * otherwise enable it! | 363 | return 0; |
| 370 | */ | 364 | |
| 371 | if (fl & FTRACE_FL_ENABLED) { | 365 | /* Record is not filtered but enabled, disable it */ |
| 372 | /* swap new and old */ | 366 | if (fl == FTRACE_FL_ENABLED) |
| 373 | new = old; | ||
| 374 | old = ftrace_call_replace(ip, FTRACE_ADDR); | ||
| 375 | rec->flags &= ~FTRACE_FL_ENABLED; | 367 | rec->flags &= ~FTRACE_FL_ENABLED; |
| 376 | } else { | 368 | else |
| 377 | new = ftrace_call_replace(ip, FTRACE_ADDR); | 369 | /* Otherwise record is filtered but not enabled, enable it */ |
| 378 | rec->flags |= FTRACE_FL_ENABLED; | 370 | rec->flags |= FTRACE_FL_ENABLED; |
| 379 | } | ||
| 380 | } else { | 371 | } else { |
| 372 | /* Disable or not filtered */ | ||
| 381 | 373 | ||
| 382 | if (enable) { | 374 | if (enable) { |
| 383 | /* | 375 | /* if record is enabled, do nothing */ |
| 384 | * If this record is set not to trace and is | ||
| 385 | * not enabled, do nothing. | ||
| 386 | */ | ||
| 387 | fl = rec->flags & (FTRACE_FL_NOTRACE | FTRACE_FL_ENABLED); | ||
| 388 | if (fl == FTRACE_FL_NOTRACE) | ||
| 389 | return 0; | ||
| 390 | |||
| 391 | new = ftrace_call_replace(ip, FTRACE_ADDR); | ||
| 392 | } else | ||
| 393 | old = ftrace_call_replace(ip, FTRACE_ADDR); | ||
| 394 | |||
| 395 | if (enable) { | ||
| 396 | if (rec->flags & FTRACE_FL_ENABLED) | 376 | if (rec->flags & FTRACE_FL_ENABLED) |
| 397 | return 0; | 377 | return 0; |
| 378 | |||
| 398 | rec->flags |= FTRACE_FL_ENABLED; | 379 | rec->flags |= FTRACE_FL_ENABLED; |
| 380 | |||
| 399 | } else { | 381 | } else { |
| 382 | |||
| 383 | /* if record is not enabled do nothing */ | ||
| 400 | if (!(rec->flags & FTRACE_FL_ENABLED)) | 384 | if (!(rec->flags & FTRACE_FL_ENABLED)) |
| 401 | return 0; | 385 | return 0; |
| 386 | |||
| 402 | rec->flags &= ~FTRACE_FL_ENABLED; | 387 | rec->flags &= ~FTRACE_FL_ENABLED; |
| 403 | } | 388 | } |
| 404 | } | 389 | } |
| 405 | 390 | ||
| 391 | call = ftrace_call_replace(ip, FTRACE_ADDR); | ||
| 392 | |||
| 393 | if (rec->flags & FTRACE_FL_ENABLED) { | ||
| 394 | old = nop; | ||
| 395 | new = call; | ||
| 396 | } else { | ||
| 397 | old = call; | ||
| 398 | new = nop; | ||
| 399 | } | ||
| 400 | |||
| 406 | return ftrace_modify_code(ip, old, new); | 401 | return ftrace_modify_code(ip, old, new); |
| 407 | } | 402 | } |
| 408 | 403 | ||
| 409 | static void ftrace_replace_code(int enable) | 404 | static void ftrace_replace_code(int enable) |
| 410 | { | 405 | { |
| 411 | int i, failed; | 406 | int i, failed; |
| 412 | unsigned char *new = NULL, *old = NULL; | 407 | unsigned char *nop = NULL; |
| 413 | struct dyn_ftrace *rec; | 408 | struct dyn_ftrace *rec; |
| 414 | struct ftrace_page *pg; | 409 | struct ftrace_page *pg; |
| 415 | 410 | ||
| 416 | if (enable) | 411 | nop = ftrace_nop_replace(); |
| 417 | old = ftrace_nop_replace(); | ||
| 418 | else | ||
| 419 | new = ftrace_nop_replace(); | ||
| 420 | 412 | ||
| 421 | for (pg = ftrace_pages_start; pg; pg = pg->next) { | 413 | for (pg = ftrace_pages_start; pg; pg = pg->next) { |
| 422 | for (i = 0; i < pg->index; i++) { | 414 | for (i = 0; i < pg->index; i++) { |
| @@ -434,7 +426,7 @@ static void ftrace_replace_code(int enable) | |||
| 434 | unfreeze_record(rec); | 426 | unfreeze_record(rec); |
| 435 | } | 427 | } |
| 436 | 428 | ||
| 437 | failed = __ftrace_replace_code(rec, old, new, enable); | 429 | failed = __ftrace_replace_code(rec, nop, enable); |
| 438 | if (failed && (rec->flags & FTRACE_FL_CONVERTED)) { | 430 | if (failed && (rec->flags & FTRACE_FL_CONVERTED)) { |
| 439 | rec->flags |= FTRACE_FL_FAILED; | 431 | rec->flags |= FTRACE_FL_FAILED; |
| 440 | if ((system_state == SYSTEM_BOOTING) || | 432 | if ((system_state == SYSTEM_BOOTING) || |
| @@ -506,13 +498,10 @@ static int __ftrace_modify_code(void *data) | |||
| 506 | { | 498 | { |
| 507 | int *command = data; | 499 | int *command = data; |
| 508 | 500 | ||
| 509 | if (*command & FTRACE_ENABLE_CALLS) { | 501 | if (*command & FTRACE_ENABLE_CALLS) |
| 510 | ftrace_replace_code(1); | 502 | ftrace_replace_code(1); |
| 511 | tracing_on = 1; | 503 | else if (*command & FTRACE_DISABLE_CALLS) |
| 512 | } else if (*command & FTRACE_DISABLE_CALLS) { | ||
| 513 | ftrace_replace_code(0); | 504 | ftrace_replace_code(0); |
| 514 | tracing_on = 0; | ||
| 515 | } | ||
| 516 | 505 | ||
| 517 | if (*command & FTRACE_UPDATE_TRACE_FUNC) | 506 | if (*command & FTRACE_UPDATE_TRACE_FUNC) |
| 518 | ftrace_update_ftrace_func(ftrace_trace_function); | 507 | ftrace_update_ftrace_func(ftrace_trace_function); |
| @@ -538,8 +527,7 @@ static void ftrace_startup(void) | |||
| 538 | 527 | ||
| 539 | mutex_lock(&ftrace_start_lock); | 528 | mutex_lock(&ftrace_start_lock); |
| 540 | ftrace_start++; | 529 | ftrace_start++; |
| 541 | if (ftrace_start == 1) | 530 | command |= FTRACE_ENABLE_CALLS; |
| 542 | command |= FTRACE_ENABLE_CALLS; | ||
| 543 | 531 | ||
| 544 | if (saved_ftrace_func != ftrace_trace_function) { | 532 | if (saved_ftrace_func != ftrace_trace_function) { |
| 545 | saved_ftrace_func = ftrace_trace_function; | 533 | saved_ftrace_func = ftrace_trace_function; |
| @@ -677,7 +665,7 @@ static int __init ftrace_dyn_table_alloc(unsigned long num_to_init) | |||
| 677 | 665 | ||
| 678 | cnt = num_to_init / ENTRIES_PER_PAGE; | 666 | cnt = num_to_init / ENTRIES_PER_PAGE; |
| 679 | pr_info("ftrace: allocating %ld entries in %d pages\n", | 667 | pr_info("ftrace: allocating %ld entries in %d pages\n", |
| 680 | num_to_init, cnt); | 668 | num_to_init, cnt + 1); |
| 681 | 669 | ||
| 682 | for (i = 0; i < cnt; i++) { | 670 | for (i = 0; i < cnt; i++) { |
| 683 | pg->next = (void *)get_zeroed_page(GFP_KERNEL); | 671 | pg->next = (void *)get_zeroed_page(GFP_KERNEL); |
| @@ -738,6 +726,9 @@ t_next(struct seq_file *m, void *v, loff_t *pos) | |||
| 738 | ((iter->flags & FTRACE_ITER_FAILURES) && | 726 | ((iter->flags & FTRACE_ITER_FAILURES) && |
| 739 | !(rec->flags & FTRACE_FL_FAILED)) || | 727 | !(rec->flags & FTRACE_FL_FAILED)) || |
| 740 | 728 | ||
| 729 | ((iter->flags & FTRACE_ITER_FILTER) && | ||
| 730 | !(rec->flags & FTRACE_FL_FILTER)) || | ||
| 731 | |||
| 741 | ((iter->flags & FTRACE_ITER_NOTRACE) && | 732 | ((iter->flags & FTRACE_ITER_NOTRACE) && |
| 742 | !(rec->flags & FTRACE_FL_NOTRACE))) { | 733 | !(rec->flags & FTRACE_FL_NOTRACE))) { |
| 743 | rec = NULL; | 734 | rec = NULL; |
| @@ -757,13 +748,11 @@ static void *t_start(struct seq_file *m, loff_t *pos) | |||
| 757 | void *p = NULL; | 748 | void *p = NULL; |
| 758 | loff_t l = -1; | 749 | loff_t l = -1; |
| 759 | 750 | ||
| 760 | if (*pos != iter->pos) { | 751 | if (*pos > iter->pos) |
| 761 | for (p = t_next(m, p, &l); p && l < *pos; p = t_next(m, p, &l)) | 752 | *pos = iter->pos; |
| 762 | ; | 753 | |
| 763 | } else { | 754 | l = *pos; |
| 764 | l = *pos; | 755 | p = t_next(m, p, &l); |
| 765 | p = t_next(m, p, &l); | ||
| 766 | } | ||
| 767 | 756 | ||
| 768 | return p; | 757 | return p; |
| 769 | } | 758 | } |
| @@ -774,15 +763,21 @@ static void t_stop(struct seq_file *m, void *p) | |||
| 774 | 763 | ||
| 775 | static int t_show(struct seq_file *m, void *v) | 764 | static int t_show(struct seq_file *m, void *v) |
| 776 | { | 765 | { |
| 766 | struct ftrace_iterator *iter = m->private; | ||
| 777 | struct dyn_ftrace *rec = v; | 767 | struct dyn_ftrace *rec = v; |
| 778 | char str[KSYM_SYMBOL_LEN]; | 768 | char str[KSYM_SYMBOL_LEN]; |
| 769 | int ret = 0; | ||
| 779 | 770 | ||
| 780 | if (!rec) | 771 | if (!rec) |
| 781 | return 0; | 772 | return 0; |
| 782 | 773 | ||
| 783 | kallsyms_lookup(rec->ip, NULL, NULL, NULL, str); | 774 | kallsyms_lookup(rec->ip, NULL, NULL, NULL, str); |
| 784 | 775 | ||
| 785 | seq_printf(m, "%s\n", str); | 776 | ret = seq_printf(m, "%s\n", str); |
| 777 | if (ret < 0) { | ||
| 778 | iter->pos--; | ||
| 779 | iter->idx--; | ||
| 780 | } | ||
| 786 | 781 | ||
| 787 | return 0; | 782 | return 0; |
| 788 | } | 783 | } |
| @@ -808,7 +803,7 @@ ftrace_avail_open(struct inode *inode, struct file *file) | |||
| 808 | return -ENOMEM; | 803 | return -ENOMEM; |
| 809 | 804 | ||
| 810 | iter->pg = ftrace_pages_start; | 805 | iter->pg = ftrace_pages_start; |
| 811 | iter->pos = -1; | 806 | iter->pos = 0; |
| 812 | 807 | ||
| 813 | ret = seq_open(file, &show_ftrace_seq_ops); | 808 | ret = seq_open(file, &show_ftrace_seq_ops); |
| 814 | if (!ret) { | 809 | if (!ret) { |
| @@ -895,7 +890,7 @@ ftrace_regex_open(struct inode *inode, struct file *file, int enable) | |||
| 895 | 890 | ||
| 896 | if (file->f_mode & FMODE_READ) { | 891 | if (file->f_mode & FMODE_READ) { |
| 897 | iter->pg = ftrace_pages_start; | 892 | iter->pg = ftrace_pages_start; |
| 898 | iter->pos = -1; | 893 | iter->pos = 0; |
| 899 | iter->flags = enable ? FTRACE_ITER_FILTER : | 894 | iter->flags = enable ? FTRACE_ITER_FILTER : |
| 900 | FTRACE_ITER_NOTRACE; | 895 | FTRACE_ITER_NOTRACE; |
| 901 | 896 | ||
| @@ -1186,7 +1181,7 @@ ftrace_regex_release(struct inode *inode, struct file *file, int enable) | |||
| 1186 | 1181 | ||
| 1187 | mutex_lock(&ftrace_sysctl_lock); | 1182 | mutex_lock(&ftrace_sysctl_lock); |
| 1188 | mutex_lock(&ftrace_start_lock); | 1183 | mutex_lock(&ftrace_start_lock); |
| 1189 | if (iter->filtered && ftrace_start && ftrace_enabled) | 1184 | if (ftrace_start && ftrace_enabled) |
| 1190 | ftrace_run_update_code(FTRACE_ENABLE_CALLS); | 1185 | ftrace_run_update_code(FTRACE_ENABLE_CALLS); |
| 1191 | mutex_unlock(&ftrace_start_lock); | 1186 | mutex_unlock(&ftrace_start_lock); |
| 1192 | mutex_unlock(&ftrace_sysctl_lock); | 1187 | mutex_unlock(&ftrace_sysctl_lock); |
diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c index 2f76193c3489..f780e9552f91 100644 --- a/kernel/trace/ring_buffer.c +++ b/kernel/trace/ring_buffer.c | |||
| @@ -16,14 +16,49 @@ | |||
| 16 | #include <linux/list.h> | 16 | #include <linux/list.h> |
| 17 | #include <linux/fs.h> | 17 | #include <linux/fs.h> |
| 18 | 18 | ||
| 19 | #include "trace.h" | ||
| 20 | |||
| 21 | /* Global flag to disable all recording to ring buffers */ | ||
| 22 | static int ring_buffers_off __read_mostly; | ||
| 23 | |||
| 24 | /** | ||
| 25 | * tracing_on - enable all tracing buffers | ||
| 26 | * | ||
| 27 | * This function enables all tracing buffers that may have been | ||
| 28 | * disabled with tracing_off. | ||
| 29 | */ | ||
| 30 | void tracing_on(void) | ||
| 31 | { | ||
| 32 | ring_buffers_off = 0; | ||
| 33 | } | ||
| 34 | |||
| 35 | /** | ||
| 36 | * tracing_off - turn off all tracing buffers | ||
| 37 | * | ||
| 38 | * This function stops all tracing buffers from recording data. | ||
| 39 | * It does not disable any overhead the tracers themselves may | ||
| 40 | * be causing. This function simply causes all recording to | ||
| 41 | * the ring buffers to fail. | ||
| 42 | */ | ||
| 43 | void tracing_off(void) | ||
| 44 | { | ||
| 45 | ring_buffers_off = 1; | ||
| 46 | } | ||
| 47 | |||
| 19 | /* Up this if you want to test the TIME_EXTENTS and normalization */ | 48 | /* Up this if you want to test the TIME_EXTENTS and normalization */ |
| 20 | #define DEBUG_SHIFT 0 | 49 | #define DEBUG_SHIFT 0 |
| 21 | 50 | ||
| 22 | /* FIXME!!! */ | 51 | /* FIXME!!! */ |
| 23 | u64 ring_buffer_time_stamp(int cpu) | 52 | u64 ring_buffer_time_stamp(int cpu) |
| 24 | { | 53 | { |
| 54 | u64 time; | ||
| 55 | |||
| 56 | preempt_disable_notrace(); | ||
| 25 | /* shift to debug/test normalization and TIME_EXTENTS */ | 57 | /* shift to debug/test normalization and TIME_EXTENTS */ |
| 26 | return sched_clock() << DEBUG_SHIFT; | 58 | time = sched_clock() << DEBUG_SHIFT; |
| 59 | preempt_enable_notrace(); | ||
| 60 | |||
| 61 | return time; | ||
| 27 | } | 62 | } |
| 28 | 63 | ||
| 29 | void ring_buffer_normalize_time_stamp(int cpu, u64 *ts) | 64 | void ring_buffer_normalize_time_stamp(int cpu, u64 *ts) |
| @@ -503,6 +538,12 @@ int ring_buffer_resize(struct ring_buffer *buffer, unsigned long size) | |||
| 503 | LIST_HEAD(pages); | 538 | LIST_HEAD(pages); |
| 504 | int i, cpu; | 539 | int i, cpu; |
| 505 | 540 | ||
| 541 | /* | ||
| 542 | * Always succeed at resizing a non-existent buffer: | ||
| 543 | */ | ||
| 544 | if (!buffer) | ||
| 545 | return size; | ||
| 546 | |||
| 506 | size = DIV_ROUND_UP(size, BUF_PAGE_SIZE); | 547 | size = DIV_ROUND_UP(size, BUF_PAGE_SIZE); |
| 507 | size *= BUF_PAGE_SIZE; | 548 | size *= BUF_PAGE_SIZE; |
| 508 | buffer_size = buffer->pages * BUF_PAGE_SIZE; | 549 | buffer_size = buffer->pages * BUF_PAGE_SIZE; |
| @@ -576,6 +617,7 @@ int ring_buffer_resize(struct ring_buffer *buffer, unsigned long size) | |||
| 576 | list_del_init(&page->list); | 617 | list_del_init(&page->list); |
| 577 | free_buffer_page(page); | 618 | free_buffer_page(page); |
| 578 | } | 619 | } |
| 620 | mutex_unlock(&buffer->mutex); | ||
| 579 | return -ENOMEM; | 621 | return -ENOMEM; |
| 580 | } | 622 | } |
| 581 | 623 | ||
| @@ -1133,6 +1175,9 @@ ring_buffer_lock_reserve(struct ring_buffer *buffer, | |||
| 1133 | struct ring_buffer_event *event; | 1175 | struct ring_buffer_event *event; |
| 1134 | int cpu, resched; | 1176 | int cpu, resched; |
| 1135 | 1177 | ||
| 1178 | if (ring_buffers_off) | ||
| 1179 | return NULL; | ||
| 1180 | |||
| 1136 | if (atomic_read(&buffer->record_disabled)) | 1181 | if (atomic_read(&buffer->record_disabled)) |
| 1137 | return NULL; | 1182 | return NULL; |
| 1138 | 1183 | ||
| @@ -1249,6 +1294,9 @@ int ring_buffer_write(struct ring_buffer *buffer, | |||
| 1249 | int ret = -EBUSY; | 1294 | int ret = -EBUSY; |
| 1250 | int cpu, resched; | 1295 | int cpu, resched; |
| 1251 | 1296 | ||
| 1297 | if (ring_buffers_off) | ||
| 1298 | return -EBUSY; | ||
| 1299 | |||
| 1252 | if (atomic_read(&buffer->record_disabled)) | 1300 | if (atomic_read(&buffer->record_disabled)) |
| 1253 | return -EBUSY; | 1301 | return -EBUSY; |
| 1254 | 1302 | ||
| @@ -2070,3 +2118,69 @@ int ring_buffer_swap_cpu(struct ring_buffer *buffer_a, | |||
| 2070 | return 0; | 2118 | return 0; |
| 2071 | } | 2119 | } |
| 2072 | 2120 | ||
| 2121 | static ssize_t | ||
| 2122 | rb_simple_read(struct file *filp, char __user *ubuf, | ||
| 2123 | size_t cnt, loff_t *ppos) | ||
| 2124 | { | ||
| 2125 | int *p = filp->private_data; | ||
| 2126 | char buf[64]; | ||
| 2127 | int r; | ||
| 2128 | |||
| 2129 | /* !ring_buffers_off == tracing_on */ | ||
| 2130 | r = sprintf(buf, "%d\n", !*p); | ||
| 2131 | |||
| 2132 | return simple_read_from_buffer(ubuf, cnt, ppos, buf, r); | ||
| 2133 | } | ||
| 2134 | |||
| 2135 | static ssize_t | ||
| 2136 | rb_simple_write(struct file *filp, const char __user *ubuf, | ||
| 2137 | size_t cnt, loff_t *ppos) | ||
| 2138 | { | ||
| 2139 | int *p = filp->private_data; | ||
| 2140 | char buf[64]; | ||
| 2141 | long val; | ||
| 2142 | int ret; | ||
| 2143 | |||
| 2144 | if (cnt >= sizeof(buf)) | ||
| 2145 | return -EINVAL; | ||
| 2146 | |||
| 2147 | if (copy_from_user(&buf, ubuf, cnt)) | ||
| 2148 | return -EFAULT; | ||
| 2149 | |||
| 2150 | buf[cnt] = 0; | ||
| 2151 | |||
| 2152 | ret = strict_strtoul(buf, 10, &val); | ||
| 2153 | if (ret < 0) | ||
| 2154 | return ret; | ||
| 2155 | |||
| 2156 | /* !ring_buffers_off == tracing_on */ | ||
| 2157 | *p = !val; | ||
| 2158 | |||
| 2159 | (*ppos)++; | ||
| 2160 | |||
| 2161 | return cnt; | ||
| 2162 | } | ||
| 2163 | |||
| 2164 | static struct file_operations rb_simple_fops = { | ||
| 2165 | .open = tracing_open_generic, | ||
| 2166 | .read = rb_simple_read, | ||
| 2167 | .write = rb_simple_write, | ||
| 2168 | }; | ||
| 2169 | |||
| 2170 | |||
| 2171 | static __init int rb_init_debugfs(void) | ||
| 2172 | { | ||
| 2173 | struct dentry *d_tracer; | ||
| 2174 | struct dentry *entry; | ||
| 2175 | |||
| 2176 | d_tracer = tracing_init_dentry(); | ||
| 2177 | |||
| 2178 | entry = debugfs_create_file("tracing_on", 0644, d_tracer, | ||
| 2179 | &ring_buffers_off, &rb_simple_fops); | ||
| 2180 | if (!entry) | ||
| 2181 | pr_warning("Could not create debugfs 'tracing_on' entry\n"); | ||
| 2182 | |||
| 2183 | return 0; | ||
| 2184 | } | ||
| 2185 | |||
| 2186 | fs_initcall(rb_init_debugfs); | ||
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 697eda36b86a..d86e3252f300 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c | |||
| @@ -1936,6 +1936,7 @@ __tracing_open(struct inode *inode, struct file *file, int *ret) | |||
| 1936 | ring_buffer_read_finish(iter->buffer_iter[cpu]); | 1936 | ring_buffer_read_finish(iter->buffer_iter[cpu]); |
| 1937 | } | 1937 | } |
| 1938 | mutex_unlock(&trace_types_lock); | 1938 | mutex_unlock(&trace_types_lock); |
| 1939 | kfree(iter); | ||
| 1939 | 1940 | ||
| 1940 | return ERR_PTR(-ENOMEM); | 1941 | return ERR_PTR(-ENOMEM); |
| 1941 | } | 1942 | } |
diff --git a/lib/scatterlist.c b/lib/scatterlist.c index 8d2688ff1352..b7b449dafbe5 100644 --- a/lib/scatterlist.c +++ b/lib/scatterlist.c | |||
| @@ -395,7 +395,7 @@ void sg_miter_stop(struct sg_mapping_iter *miter) | |||
| 395 | WARN_ON(!irqs_disabled()); | 395 | WARN_ON(!irqs_disabled()); |
| 396 | kunmap_atomic(miter->addr, KM_BIO_SRC_IRQ); | 396 | kunmap_atomic(miter->addr, KM_BIO_SRC_IRQ); |
| 397 | } else | 397 | } else |
| 398 | kunmap(miter->addr); | 398 | kunmap(miter->page); |
| 399 | 399 | ||
| 400 | miter->page = NULL; | 400 | miter->page = NULL; |
| 401 | miter->addr = NULL; | 401 | miter->addr = NULL; |
diff --git a/lib/swiotlb.c b/lib/swiotlb.c index 78330c37a61b..5f6c629a924d 100644 --- a/lib/swiotlb.c +++ b/lib/swiotlb.c | |||
| @@ -467,9 +467,13 @@ swiotlb_alloc_coherent(struct device *hwdev, size_t size, | |||
| 467 | dma_addr_t dev_addr; | 467 | dma_addr_t dev_addr; |
| 468 | void *ret; | 468 | void *ret; |
| 469 | int order = get_order(size); | 469 | int order = get_order(size); |
| 470 | u64 dma_mask = DMA_32BIT_MASK; | ||
| 471 | |||
| 472 | if (hwdev && hwdev->coherent_dma_mask) | ||
| 473 | dma_mask = hwdev->coherent_dma_mask; | ||
| 470 | 474 | ||
| 471 | ret = (void *)__get_free_pages(flags, order); | 475 | ret = (void *)__get_free_pages(flags, order); |
| 472 | if (ret && address_needs_mapping(hwdev, virt_to_bus(ret), size)) { | 476 | if (ret && !is_buffer_dma_capable(dma_mask, virt_to_bus(ret), size)) { |
| 473 | /* | 477 | /* |
| 474 | * The allocated memory isn't reachable by the device. | 478 | * The allocated memory isn't reachable by the device. |
| 475 | * Fall back on swiotlb_map_single(). | 479 | * Fall back on swiotlb_map_single(). |
| @@ -493,9 +497,9 @@ swiotlb_alloc_coherent(struct device *hwdev, size_t size, | |||
| 493 | dev_addr = virt_to_bus(ret); | 497 | dev_addr = virt_to_bus(ret); |
| 494 | 498 | ||
| 495 | /* Confirm address can be DMA'd by device */ | 499 | /* Confirm address can be DMA'd by device */ |
| 496 | if (address_needs_mapping(hwdev, dev_addr, size)) { | 500 | if (!is_buffer_dma_capable(dma_mask, dev_addr, size)) { |
| 497 | printk("hwdev DMA mask = 0x%016Lx, dev_addr = 0x%016Lx\n", | 501 | printk("hwdev DMA mask = 0x%016Lx, dev_addr = 0x%016Lx\n", |
| 498 | (unsigned long long)*hwdev->dma_mask, | 502 | (unsigned long long)dma_mask, |
| 499 | (unsigned long long)dev_addr); | 503 | (unsigned long long)dev_addr); |
| 500 | 504 | ||
| 501 | /* DMA_TO_DEVICE to avoid memcpy in unmap_single */ | 505 | /* DMA_TO_DEVICE to avoid memcpy in unmap_single */ |
diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c index 6837a1014372..b5b2b15085a8 100644 --- a/mm/memory_hotplug.c +++ b/mm/memory_hotplug.c | |||
| @@ -22,7 +22,6 @@ | |||
| 22 | #include <linux/highmem.h> | 22 | #include <linux/highmem.h> |
| 23 | #include <linux/vmalloc.h> | 23 | #include <linux/vmalloc.h> |
| 24 | #include <linux/ioport.h> | 24 | #include <linux/ioport.h> |
| 25 | #include <linux/cpuset.h> | ||
| 26 | #include <linux/delay.h> | 25 | #include <linux/delay.h> |
| 27 | #include <linux/migrate.h> | 26 | #include <linux/migrate.h> |
| 28 | #include <linux/page-isolation.h> | 27 | #include <linux/page-isolation.h> |
| @@ -498,8 +497,6 @@ int add_memory(int nid, u64 start, u64 size) | |||
| 498 | /* we online node here. we can't roll back from here. */ | 497 | /* we online node here. we can't roll back from here. */ |
| 499 | node_set_online(nid); | 498 | node_set_online(nid); |
| 500 | 499 | ||
| 501 | cpuset_track_online_nodes(); | ||
| 502 | |||
| 503 | if (new_pgdat) { | 500 | if (new_pgdat) { |
| 504 | ret = register_one_node(nid); | 501 | ret = register_one_node(nid); |
| 505 | /* | 502 | /* |
diff --git a/mm/migrate.c b/mm/migrate.c index 385db89f0c33..1e0d6b237f44 100644 --- a/mm/migrate.c +++ b/mm/migrate.c | |||
| @@ -522,15 +522,12 @@ static int writeout(struct address_space *mapping, struct page *page) | |||
| 522 | remove_migration_ptes(page, page); | 522 | remove_migration_ptes(page, page); |
| 523 | 523 | ||
| 524 | rc = mapping->a_ops->writepage(page, &wbc); | 524 | rc = mapping->a_ops->writepage(page, &wbc); |
| 525 | if (rc < 0) | ||
| 526 | /* I/O Error writing */ | ||
| 527 | return -EIO; | ||
| 528 | 525 | ||
| 529 | if (rc != AOP_WRITEPAGE_ACTIVATE) | 526 | if (rc != AOP_WRITEPAGE_ACTIVATE) |
| 530 | /* unlocked. Relock */ | 527 | /* unlocked. Relock */ |
| 531 | lock_page(page); | 528 | lock_page(page); |
| 532 | 529 | ||
| 533 | return -EAGAIN; | 530 | return (rc < 0) ? -EIO : -EAGAIN; |
| 534 | } | 531 | } |
| 535 | 532 | ||
| 536 | /* | 533 | /* |
diff --git a/mm/vmalloc.c b/mm/vmalloc.c index ba6b0f5f7fac..30f826d484f0 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c | |||
| @@ -324,14 +324,14 @@ static struct vmap_area *alloc_vmap_area(unsigned long size, | |||
| 324 | 324 | ||
| 325 | BUG_ON(size & ~PAGE_MASK); | 325 | BUG_ON(size & ~PAGE_MASK); |
| 326 | 326 | ||
| 327 | addr = ALIGN(vstart, align); | ||
| 328 | |||
| 329 | va = kmalloc_node(sizeof(struct vmap_area), | 327 | va = kmalloc_node(sizeof(struct vmap_area), |
| 330 | gfp_mask & GFP_RECLAIM_MASK, node); | 328 | gfp_mask & GFP_RECLAIM_MASK, node); |
| 331 | if (unlikely(!va)) | 329 | if (unlikely(!va)) |
| 332 | return ERR_PTR(-ENOMEM); | 330 | return ERR_PTR(-ENOMEM); |
| 333 | 331 | ||
| 334 | retry: | 332 | retry: |
| 333 | addr = ALIGN(vstart, align); | ||
| 334 | |||
| 335 | spin_lock(&vmap_area_lock); | 335 | spin_lock(&vmap_area_lock); |
| 336 | /* XXX: could have a last_hole cache */ | 336 | /* XXX: could have a last_hole cache */ |
| 337 | n = vmap_area_root.rb_node; | 337 | n = vmap_area_root.rb_node; |
| @@ -362,7 +362,7 @@ retry: | |||
| 362 | goto found; | 362 | goto found; |
| 363 | } | 363 | } |
| 364 | 364 | ||
| 365 | while (addr + size >= first->va_start && addr + size <= vend) { | 365 | while (addr + size > first->va_start && addr + size <= vend) { |
| 366 | addr = ALIGN(first->va_end + PAGE_SIZE, align); | 366 | addr = ALIGN(first->va_end + PAGE_SIZE, align); |
| 367 | 367 | ||
| 368 | n = rb_next(&first->rb_node); | 368 | n = rb_next(&first->rb_node); |
| @@ -522,13 +522,24 @@ static void __purge_vmap_area_lazy(unsigned long *start, unsigned long *end, | |||
| 522 | } | 522 | } |
| 523 | 523 | ||
| 524 | /* | 524 | /* |
| 525 | * Kick off a purge of the outstanding lazy areas. Don't bother if somebody | ||
| 526 | * is already purging. | ||
| 527 | */ | ||
| 528 | static void try_purge_vmap_area_lazy(void) | ||
| 529 | { | ||
| 530 | unsigned long start = ULONG_MAX, end = 0; | ||
| 531 | |||
| 532 | __purge_vmap_area_lazy(&start, &end, 0, 0); | ||
| 533 | } | ||
| 534 | |||
| 535 | /* | ||
| 525 | * Kick off a purge of the outstanding lazy areas. | 536 | * Kick off a purge of the outstanding lazy areas. |
| 526 | */ | 537 | */ |
| 527 | static void purge_vmap_area_lazy(void) | 538 | static void purge_vmap_area_lazy(void) |
| 528 | { | 539 | { |
| 529 | unsigned long start = ULONG_MAX, end = 0; | 540 | unsigned long start = ULONG_MAX, end = 0; |
| 530 | 541 | ||
| 531 | __purge_vmap_area_lazy(&start, &end, 0, 0); | 542 | __purge_vmap_area_lazy(&start, &end, 1, 0); |
| 532 | } | 543 | } |
| 533 | 544 | ||
| 534 | /* | 545 | /* |
| @@ -539,7 +550,7 @@ static void free_unmap_vmap_area(struct vmap_area *va) | |||
| 539 | va->flags |= VM_LAZY_FREE; | 550 | va->flags |= VM_LAZY_FREE; |
| 540 | atomic_add((va->va_end - va->va_start) >> PAGE_SHIFT, &vmap_lazy_nr); | 551 | atomic_add((va->va_end - va->va_start) >> PAGE_SHIFT, &vmap_lazy_nr); |
| 541 | if (unlikely(atomic_read(&vmap_lazy_nr) > lazy_max_pages())) | 552 | if (unlikely(atomic_read(&vmap_lazy_nr) > lazy_max_pages())) |
| 542 | purge_vmap_area_lazy(); | 553 | try_purge_vmap_area_lazy(); |
| 543 | } | 554 | } |
| 544 | 555 | ||
| 545 | static struct vmap_area *find_vmap_area(unsigned long addr) | 556 | static struct vmap_area *find_vmap_area(unsigned long addr) |
diff --git a/mm/vmscan.c b/mm/vmscan.c index c141b3e78071..7ea1440b53db 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c | |||
| @@ -623,6 +623,8 @@ static unsigned long shrink_page_list(struct list_head *page_list, | |||
| 623 | * Try to allocate it some swap space here. | 623 | * Try to allocate it some swap space here. |
| 624 | */ | 624 | */ |
| 625 | if (PageAnon(page) && !PageSwapCache(page)) { | 625 | if (PageAnon(page) && !PageSwapCache(page)) { |
| 626 | if (!(sc->gfp_mask & __GFP_IO)) | ||
| 627 | goto keep_locked; | ||
| 626 | switch (try_to_munlock(page)) { | 628 | switch (try_to_munlock(page)) { |
| 627 | case SWAP_FAIL: /* shouldn't happen */ | 629 | case SWAP_FAIL: /* shouldn't happen */ |
| 628 | case SWAP_AGAIN: | 630 | case SWAP_AGAIN: |
| @@ -634,6 +636,7 @@ static unsigned long shrink_page_list(struct list_head *page_list, | |||
| 634 | } | 636 | } |
| 635 | if (!add_to_swap(page, GFP_ATOMIC)) | 637 | if (!add_to_swap(page, GFP_ATOMIC)) |
| 636 | goto activate_locked; | 638 | goto activate_locked; |
| 639 | may_enter_fs = 1; | ||
| 637 | } | 640 | } |
| 638 | #endif /* CONFIG_SWAP */ | 641 | #endif /* CONFIG_SWAP */ |
| 639 | 642 | ||
| @@ -1386,9 +1389,9 @@ static void get_scan_ratio(struct zone *zone, struct scan_control *sc, | |||
| 1386 | file_prio = 200 - sc->swappiness; | 1389 | file_prio = 200 - sc->swappiness; |
| 1387 | 1390 | ||
| 1388 | /* | 1391 | /* |
| 1389 | * anon recent_rotated[0] | 1392 | * The amount of pressure on anon vs file pages is inversely |
| 1390 | * %anon = 100 * ----------- / ----------------- * IO cost | 1393 | * proportional to the fraction of recently scanned pages on |
| 1391 | * anon + file rotate_sum | 1394 | * each list that were recently referenced and in active use. |
| 1392 | */ | 1395 | */ |
| 1393 | ap = (anon_prio + 1) * (zone->recent_scanned[0] + 1); | 1396 | ap = (anon_prio + 1) * (zone->recent_scanned[0] + 1); |
| 1394 | ap /= zone->recent_rotated[0] + 1; | 1397 | ap /= zone->recent_rotated[0] + 1; |
diff --git a/net/compat.c b/net/compat.c index 6ce1a1cadcc0..a3a2ba0fac08 100644 --- a/net/compat.c +++ b/net/compat.c | |||
| @@ -725,7 +725,7 @@ EXPORT_SYMBOL(compat_mc_getsockopt); | |||
| 725 | static unsigned char nas[19]={AL(0),AL(3),AL(3),AL(3),AL(2),AL(3), | 725 | static unsigned char nas[19]={AL(0),AL(3),AL(3),AL(3),AL(2),AL(3), |
| 726 | AL(3),AL(3),AL(4),AL(4),AL(4),AL(6), | 726 | AL(3),AL(3),AL(4),AL(4),AL(4),AL(6), |
| 727 | AL(6),AL(2),AL(5),AL(5),AL(3),AL(3), | 727 | AL(6),AL(2),AL(5),AL(5),AL(3),AL(3), |
| 728 | AL(6)}; | 728 | AL(4)}; |
| 729 | #undef AL | 729 | #undef AL |
| 730 | 730 | ||
| 731 | asmlinkage long compat_sys_sendmsg(int fd, struct compat_msghdr __user *msg, unsigned flags) | 731 | asmlinkage long compat_sys_sendmsg(int fd, struct compat_msghdr __user *msg, unsigned flags) |
| @@ -738,52 +738,13 @@ asmlinkage long compat_sys_recvmsg(int fd, struct compat_msghdr __user *msg, uns | |||
| 738 | return sys_recvmsg(fd, (struct msghdr __user *)msg, flags | MSG_CMSG_COMPAT); | 738 | return sys_recvmsg(fd, (struct msghdr __user *)msg, flags | MSG_CMSG_COMPAT); |
| 739 | } | 739 | } |
| 740 | 740 | ||
| 741 | asmlinkage long compat_sys_paccept(int fd, struct sockaddr __user *upeer_sockaddr, | ||
| 742 | int __user *upeer_addrlen, | ||
| 743 | const compat_sigset_t __user *sigmask, | ||
| 744 | compat_size_t sigsetsize, int flags) | ||
| 745 | { | ||
| 746 | compat_sigset_t ss32; | ||
| 747 | sigset_t ksigmask, sigsaved; | ||
| 748 | int ret; | ||
| 749 | |||
| 750 | if (sigmask) { | ||
| 751 | if (sigsetsize != sizeof(compat_sigset_t)) | ||
| 752 | return -EINVAL; | ||
| 753 | if (copy_from_user(&ss32, sigmask, sizeof(ss32))) | ||
| 754 | return -EFAULT; | ||
| 755 | sigset_from_compat(&ksigmask, &ss32); | ||
| 756 | |||
| 757 | sigdelsetmask(&ksigmask, sigmask(SIGKILL)|sigmask(SIGSTOP)); | ||
| 758 | sigprocmask(SIG_SETMASK, &ksigmask, &sigsaved); | ||
| 759 | } | ||
| 760 | |||
| 761 | ret = do_accept(fd, upeer_sockaddr, upeer_addrlen, flags); | ||
| 762 | |||
| 763 | if (ret == -ERESTARTNOHAND) { | ||
| 764 | /* | ||
| 765 | * Don't restore the signal mask yet. Let do_signal() deliver | ||
| 766 | * the signal on the way back to userspace, before the signal | ||
| 767 | * mask is restored. | ||
| 768 | */ | ||
| 769 | if (sigmask) { | ||
| 770 | memcpy(¤t->saved_sigmask, &sigsaved, | ||
| 771 | sizeof(sigsaved)); | ||
| 772 | set_restore_sigmask(); | ||
| 773 | } | ||
| 774 | } else if (sigmask) | ||
| 775 | sigprocmask(SIG_SETMASK, &sigsaved, NULL); | ||
| 776 | |||
| 777 | return ret; | ||
| 778 | } | ||
| 779 | |||
| 780 | asmlinkage long compat_sys_socketcall(int call, u32 __user *args) | 741 | asmlinkage long compat_sys_socketcall(int call, u32 __user *args) |
| 781 | { | 742 | { |
| 782 | int ret; | 743 | int ret; |
| 783 | u32 a[6]; | 744 | u32 a[6]; |
| 784 | u32 a0, a1; | 745 | u32 a0, a1; |
| 785 | 746 | ||
| 786 | if (call < SYS_SOCKET || call > SYS_PACCEPT) | 747 | if (call < SYS_SOCKET || call > SYS_ACCEPT4) |
| 787 | return -EINVAL; | 748 | return -EINVAL; |
| 788 | if (copy_from_user(a, args, nas[call])) | 749 | if (copy_from_user(a, args, nas[call])) |
| 789 | return -EFAULT; | 750 | return -EFAULT; |
| @@ -804,7 +765,7 @@ asmlinkage long compat_sys_socketcall(int call, u32 __user *args) | |||
| 804 | ret = sys_listen(a0, a1); | 765 | ret = sys_listen(a0, a1); |
| 805 | break; | 766 | break; |
| 806 | case SYS_ACCEPT: | 767 | case SYS_ACCEPT: |
| 807 | ret = do_accept(a0, compat_ptr(a1), compat_ptr(a[2]), 0); | 768 | ret = sys_accept4(a0, compat_ptr(a1), compat_ptr(a[2]), 0); |
| 808 | break; | 769 | break; |
| 809 | case SYS_GETSOCKNAME: | 770 | case SYS_GETSOCKNAME: |
| 810 | ret = sys_getsockname(a0, compat_ptr(a1), compat_ptr(a[2])); | 771 | ret = sys_getsockname(a0, compat_ptr(a1), compat_ptr(a[2])); |
| @@ -844,9 +805,8 @@ asmlinkage long compat_sys_socketcall(int call, u32 __user *args) | |||
| 844 | case SYS_RECVMSG: | 805 | case SYS_RECVMSG: |
| 845 | ret = compat_sys_recvmsg(a0, compat_ptr(a1), a[2]); | 806 | ret = compat_sys_recvmsg(a0, compat_ptr(a1), a[2]); |
| 846 | break; | 807 | break; |
| 847 | case SYS_PACCEPT: | 808 | case SYS_ACCEPT4: |
| 848 | ret = compat_sys_paccept(a0, compat_ptr(a1), compat_ptr(a[2]), | 809 | ret = sys_accept4(a0, compat_ptr(a1), compat_ptr(a[2]), a[3]); |
| 849 | compat_ptr(a[3]), a[4], a[5]); | ||
| 850 | break; | 810 | break; |
| 851 | default: | 811 | default: |
| 852 | ret = -EINVAL; | 812 | ret = -EINVAL; |
diff --git a/net/core/pktgen.c b/net/core/pktgen.c index a47f5bad110d..8997e912aaaf 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c | |||
| @@ -1973,13 +1973,7 @@ static void pktgen_setup_inject(struct pktgen_dev *pkt_dev) | |||
| 1973 | 1973 | ||
| 1974 | /* make sure that we don't pick a non-existing transmit queue */ | 1974 | /* make sure that we don't pick a non-existing transmit queue */ |
| 1975 | ntxq = pkt_dev->odev->real_num_tx_queues; | 1975 | ntxq = pkt_dev->odev->real_num_tx_queues; |
| 1976 | if (ntxq > num_online_cpus() && (pkt_dev->flags & F_QUEUE_MAP_CPU)) { | 1976 | |
| 1977 | printk(KERN_WARNING "pktgen: WARNING: QUEUE_MAP_CPU " | ||
| 1978 | "disabled because CPU count (%d) exceeds number " | ||
| 1979 | "of tx queues (%d) on %s\n", num_online_cpus(), ntxq, | ||
| 1980 | pkt_dev->odev->name); | ||
| 1981 | pkt_dev->flags &= ~F_QUEUE_MAP_CPU; | ||
| 1982 | } | ||
| 1983 | if (ntxq <= pkt_dev->queue_map_min) { | 1977 | if (ntxq <= pkt_dev->queue_map_min) { |
| 1984 | printk(KERN_WARNING "pktgen: WARNING: Requested " | 1978 | printk(KERN_WARNING "pktgen: WARNING: Requested " |
| 1985 | "queue_map_min (zero-based) (%d) exceeds valid range " | 1979 | "queue_map_min (zero-based) (%d) exceeds valid range " |
| @@ -2202,6 +2196,7 @@ static void set_cur_queue_map(struct pktgen_dev *pkt_dev) | |||
| 2202 | } | 2196 | } |
| 2203 | pkt_dev->cur_queue_map = t; | 2197 | pkt_dev->cur_queue_map = t; |
| 2204 | } | 2198 | } |
| 2199 | pkt_dev->cur_queue_map = pkt_dev->cur_queue_map % pkt_dev->odev->real_num_tx_queues; | ||
| 2205 | } | 2200 | } |
| 2206 | 2201 | ||
| 2207 | /* Increment/randomize headers according to flags and current values | 2202 | /* Increment/randomize headers according to flags and current values |
diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c index 1fbff5fa4241..1aa2dc9e380e 100644 --- a/net/ipv4/af_inet.c +++ b/net/ipv4/af_inet.c | |||
| @@ -1117,6 +1117,7 @@ int inet_sk_rebuild_header(struct sock *sk) | |||
| 1117 | }, | 1117 | }, |
| 1118 | }, | 1118 | }, |
| 1119 | .proto = sk->sk_protocol, | 1119 | .proto = sk->sk_protocol, |
| 1120 | .flags = inet_sk_flowi_flags(sk), | ||
| 1120 | .uli_u = { | 1121 | .uli_u = { |
| 1121 | .ports = { | 1122 | .ports = { |
| 1122 | .sport = inet->sport, | 1123 | .sport = inet->sport, |
diff --git a/net/ipv4/ipmr.c b/net/ipv4/ipmr.c index b42e082cc170..25924b1eb2ef 100644 --- a/net/ipv4/ipmr.c +++ b/net/ipv4/ipmr.c | |||
| @@ -1945,13 +1945,14 @@ int __init ip_mr_init(void) | |||
| 1945 | goto proc_cache_fail; | 1945 | goto proc_cache_fail; |
| 1946 | #endif | 1946 | #endif |
| 1947 | return 0; | 1947 | return 0; |
| 1948 | reg_notif_fail: | ||
| 1949 | kmem_cache_destroy(mrt_cachep); | ||
| 1950 | #ifdef CONFIG_PROC_FS | 1948 | #ifdef CONFIG_PROC_FS |
| 1951 | proc_vif_fail: | ||
| 1952 | unregister_netdevice_notifier(&ip_mr_notifier); | ||
| 1953 | proc_cache_fail: | 1949 | proc_cache_fail: |
| 1954 | proc_net_remove(&init_net, "ip_mr_vif"); | 1950 | proc_net_remove(&init_net, "ip_mr_vif"); |
| 1951 | proc_vif_fail: | ||
| 1952 | unregister_netdevice_notifier(&ip_mr_notifier); | ||
| 1955 | #endif | 1953 | #endif |
| 1954 | reg_notif_fail: | ||
| 1955 | del_timer(&ipmr_expire_timer); | ||
| 1956 | kmem_cache_destroy(mrt_cachep); | ||
| 1956 | return err; | 1957 | return err; |
| 1957 | } | 1958 | } |
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index cf02701ced48..98c1fd09be88 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c | |||
| @@ -633,6 +633,7 @@ int udp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, | |||
| 633 | .saddr = saddr, | 633 | .saddr = saddr, |
| 634 | .tos = tos } }, | 634 | .tos = tos } }, |
| 635 | .proto = sk->sk_protocol, | 635 | .proto = sk->sk_protocol, |
| 636 | .flags = inet_sk_flowi_flags(sk), | ||
| 636 | .uli_u = { .ports = | 637 | .uli_u = { .ports = |
| 637 | { .sport = inet->sport, | 638 | { .sport = inet->sport, |
| 638 | .dport = dport } } }; | 639 | .dport = dport } } }; |
diff --git a/net/ipv6/ip6mr.c b/net/ipv6/ip6mr.c index 52a7eb0e2c2c..0524769632e7 100644 --- a/net/ipv6/ip6mr.c +++ b/net/ipv6/ip6mr.c | |||
| @@ -224,7 +224,7 @@ static struct file_operations ip6mr_vif_fops = { | |||
| 224 | .open = ip6mr_vif_open, | 224 | .open = ip6mr_vif_open, |
| 225 | .read = seq_read, | 225 | .read = seq_read, |
| 226 | .llseek = seq_lseek, | 226 | .llseek = seq_lseek, |
| 227 | .release = seq_release, | 227 | .release = seq_release_private, |
| 228 | }; | 228 | }; |
| 229 | 229 | ||
| 230 | static void *ipmr_mfc_seq_start(struct seq_file *seq, loff_t *pos) | 230 | static void *ipmr_mfc_seq_start(struct seq_file *seq, loff_t *pos) |
| @@ -338,7 +338,7 @@ static struct file_operations ip6mr_mfc_fops = { | |||
| 338 | .open = ipmr_mfc_open, | 338 | .open = ipmr_mfc_open, |
| 339 | .read = seq_read, | 339 | .read = seq_read, |
| 340 | .llseek = seq_lseek, | 340 | .llseek = seq_lseek, |
| 341 | .release = seq_release, | 341 | .release = seq_release_private, |
| 342 | }; | 342 | }; |
| 343 | #endif | 343 | #endif |
| 344 | 344 | ||
diff --git a/net/ipv6/proc.c b/net/ipv6/proc.c index 07f0b76e7427..97c17fdd6f75 100644 --- a/net/ipv6/proc.c +++ b/net/ipv6/proc.c | |||
| @@ -132,7 +132,7 @@ static struct snmp_mib snmp6_udplite6_list[] = { | |||
| 132 | 132 | ||
| 133 | static void snmp6_seq_show_icmpv6msg(struct seq_file *seq, void **mib) | 133 | static void snmp6_seq_show_icmpv6msg(struct seq_file *seq, void **mib) |
| 134 | { | 134 | { |
| 135 | static char name[32]; | 135 | char name[32]; |
| 136 | int i; | 136 | int i; |
| 137 | 137 | ||
| 138 | /* print by name -- deprecated items */ | 138 | /* print by name -- deprecated items */ |
| @@ -144,7 +144,7 @@ static void snmp6_seq_show_icmpv6msg(struct seq_file *seq, void **mib) | |||
| 144 | p = icmp6type2name[icmptype]; | 144 | p = icmp6type2name[icmptype]; |
| 145 | if (!p) /* don't print un-named types here */ | 145 | if (!p) /* don't print un-named types here */ |
| 146 | continue; | 146 | continue; |
| 147 | (void) snprintf(name, sizeof(name)-1, "Icmp6%s%s", | 147 | snprintf(name, sizeof(name), "Icmp6%s%s", |
| 148 | i & 0x100 ? "Out" : "In", p); | 148 | i & 0x100 ? "Out" : "In", p); |
| 149 | seq_printf(seq, "%-32s\t%lu\n", name, | 149 | seq_printf(seq, "%-32s\t%lu\n", name, |
| 150 | snmp_fold_field(mib, i)); | 150 | snmp_fold_field(mib, i)); |
| @@ -157,7 +157,7 @@ static void snmp6_seq_show_icmpv6msg(struct seq_file *seq, void **mib) | |||
| 157 | val = snmp_fold_field(mib, i); | 157 | val = snmp_fold_field(mib, i); |
| 158 | if (!val) | 158 | if (!val) |
| 159 | continue; | 159 | continue; |
| 160 | (void) snprintf(name, sizeof(name)-1, "Icmp6%sType%u", | 160 | snprintf(name, sizeof(name), "Icmp6%sType%u", |
| 161 | i & 0x100 ? "Out" : "In", i & 0xff); | 161 | i & 0x100 ? "Out" : "In", i & 0xff); |
| 162 | seq_printf(seq, "%-32s\t%lu\n", name, val); | 162 | seq_printf(seq, "%-32s\t%lu\n", name, val); |
| 163 | } | 163 | } |
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c index 14d165f0df75..409bb7716236 100644 --- a/net/mac80211/mlme.c +++ b/net/mac80211/mlme.c | |||
| @@ -2560,25 +2560,3 @@ void ieee80211_mlme_notify_scan_completed(struct ieee80211_local *local) | |||
| 2560 | ieee80211_restart_sta_timer(sdata); | 2560 | ieee80211_restart_sta_timer(sdata); |
| 2561 | rcu_read_unlock(); | 2561 | rcu_read_unlock(); |
| 2562 | } | 2562 | } |
| 2563 | |||
| 2564 | /* driver notification call */ | ||
| 2565 | void ieee80211_notify_mac(struct ieee80211_hw *hw, | ||
| 2566 | enum ieee80211_notification_types notif_type) | ||
| 2567 | { | ||
| 2568 | struct ieee80211_local *local = hw_to_local(hw); | ||
| 2569 | struct ieee80211_sub_if_data *sdata; | ||
| 2570 | |||
| 2571 | switch (notif_type) { | ||
| 2572 | case IEEE80211_NOTIFY_RE_ASSOC: | ||
| 2573 | rtnl_lock(); | ||
| 2574 | list_for_each_entry(sdata, &local->interfaces, list) { | ||
| 2575 | if (sdata->vif.type != NL80211_IFTYPE_STATION) | ||
| 2576 | continue; | ||
| 2577 | |||
| 2578 | ieee80211_sta_req_auth(sdata, &sdata->u.sta); | ||
| 2579 | } | ||
| 2580 | rtnl_unlock(); | ||
| 2581 | break; | ||
| 2582 | } | ||
| 2583 | } | ||
| 2584 | EXPORT_SYMBOL(ieee80211_notify_mac); | ||
diff --git a/net/phonet/af_phonet.c b/net/phonet/af_phonet.c index 7ab30f668b5a..9d211f12582b 100644 --- a/net/phonet/af_phonet.c +++ b/net/phonet/af_phonet.c | |||
| @@ -33,9 +33,30 @@ | |||
| 33 | #include <net/phonet/phonet.h> | 33 | #include <net/phonet/phonet.h> |
| 34 | #include <net/phonet/pn_dev.h> | 34 | #include <net/phonet/pn_dev.h> |
| 35 | 35 | ||
| 36 | static struct net_proto_family phonet_proto_family; | 36 | /* Transport protocol registration */ |
| 37 | static struct phonet_protocol *phonet_proto_get(int protocol); | 37 | static struct phonet_protocol *proto_tab[PHONET_NPROTO] __read_mostly; |
| 38 | static inline void phonet_proto_put(struct phonet_protocol *pp); | 38 | static DEFINE_SPINLOCK(proto_tab_lock); |
| 39 | |||
| 40 | static struct phonet_protocol *phonet_proto_get(int protocol) | ||
| 41 | { | ||
| 42 | struct phonet_protocol *pp; | ||
| 43 | |||
| 44 | if (protocol >= PHONET_NPROTO) | ||
| 45 | return NULL; | ||
| 46 | |||
| 47 | spin_lock(&proto_tab_lock); | ||
| 48 | pp = proto_tab[protocol]; | ||
| 49 | if (pp && !try_module_get(pp->prot->owner)) | ||
| 50 | pp = NULL; | ||
| 51 | spin_unlock(&proto_tab_lock); | ||
| 52 | |||
| 53 | return pp; | ||
| 54 | } | ||
| 55 | |||
| 56 | static inline void phonet_proto_put(struct phonet_protocol *pp) | ||
| 57 | { | ||
| 58 | module_put(pp->prot->owner); | ||
| 59 | } | ||
| 39 | 60 | ||
| 40 | /* protocol family functions */ | 61 | /* protocol family functions */ |
| 41 | 62 | ||
| @@ -375,10 +396,6 @@ static struct packet_type phonet_packet_type = { | |||
| 375 | .func = phonet_rcv, | 396 | .func = phonet_rcv, |
| 376 | }; | 397 | }; |
| 377 | 398 | ||
| 378 | /* Transport protocol registration */ | ||
| 379 | static struct phonet_protocol *proto_tab[PHONET_NPROTO] __read_mostly; | ||
| 380 | static DEFINE_SPINLOCK(proto_tab_lock); | ||
| 381 | |||
| 382 | int __init_or_module phonet_proto_register(int protocol, | 399 | int __init_or_module phonet_proto_register(int protocol, |
| 383 | struct phonet_protocol *pp) | 400 | struct phonet_protocol *pp) |
| 384 | { | 401 | { |
| @@ -412,27 +429,6 @@ void phonet_proto_unregister(int protocol, struct phonet_protocol *pp) | |||
| 412 | } | 429 | } |
| 413 | EXPORT_SYMBOL(phonet_proto_unregister); | 430 | EXPORT_SYMBOL(phonet_proto_unregister); |
| 414 | 431 | ||
| 415 | static struct phonet_protocol *phonet_proto_get(int protocol) | ||
| 416 | { | ||
| 417 | struct phonet_protocol *pp; | ||
| 418 | |||
| 419 | if (protocol >= PHONET_NPROTO) | ||
| 420 | return NULL; | ||
| 421 | |||
| 422 | spin_lock(&proto_tab_lock); | ||
| 423 | pp = proto_tab[protocol]; | ||
| 424 | if (pp && !try_module_get(pp->prot->owner)) | ||
| 425 | pp = NULL; | ||
| 426 | spin_unlock(&proto_tab_lock); | ||
| 427 | |||
| 428 | return pp; | ||
| 429 | } | ||
| 430 | |||
| 431 | static inline void phonet_proto_put(struct phonet_protocol *pp) | ||
| 432 | { | ||
| 433 | module_put(pp->prot->owner); | ||
| 434 | } | ||
| 435 | |||
| 436 | /* Module registration */ | 432 | /* Module registration */ |
| 437 | static int __init phonet_init(void) | 433 | static int __init phonet_init(void) |
| 438 | { | 434 | { |
diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c index b16ad2972c6b..6ab4a2f92ca0 100644 --- a/net/sched/sch_api.c +++ b/net/sched/sch_api.c | |||
| @@ -417,6 +417,8 @@ static int qdisc_dump_stab(struct sk_buff *skb, struct qdisc_size_table *stab) | |||
| 417 | struct nlattr *nest; | 417 | struct nlattr *nest; |
| 418 | 418 | ||
| 419 | nest = nla_nest_start(skb, TCA_STAB); | 419 | nest = nla_nest_start(skb, TCA_STAB); |
| 420 | if (nest == NULL) | ||
| 421 | goto nla_put_failure; | ||
| 420 | NLA_PUT(skb, TCA_STAB_BASE, sizeof(stab->szopts), &stab->szopts); | 422 | NLA_PUT(skb, TCA_STAB_BASE, sizeof(stab->szopts), &stab->szopts); |
| 421 | nla_nest_end(skb, nest); | 423 | nla_nest_end(skb, nest); |
| 422 | 424 | ||
diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c index 93cd30ce6501..cdcd16fcfeda 100644 --- a/net/sched/sch_generic.c +++ b/net/sched/sch_generic.c | |||
| @@ -270,6 +270,8 @@ static void dev_watchdog_down(struct net_device *dev) | |||
| 270 | void netif_carrier_on(struct net_device *dev) | 270 | void netif_carrier_on(struct net_device *dev) |
| 271 | { | 271 | { |
| 272 | if (test_and_clear_bit(__LINK_STATE_NOCARRIER, &dev->state)) { | 272 | if (test_and_clear_bit(__LINK_STATE_NOCARRIER, &dev->state)) { |
| 273 | if (dev->reg_state == NETREG_UNINITIALIZED) | ||
| 274 | return; | ||
| 273 | linkwatch_fire_event(dev); | 275 | linkwatch_fire_event(dev); |
| 274 | if (netif_running(dev)) | 276 | if (netif_running(dev)) |
| 275 | __netdev_watchdog_up(dev); | 277 | __netdev_watchdog_up(dev); |
| @@ -285,8 +287,11 @@ EXPORT_SYMBOL(netif_carrier_on); | |||
| 285 | */ | 287 | */ |
| 286 | void netif_carrier_off(struct net_device *dev) | 288 | void netif_carrier_off(struct net_device *dev) |
| 287 | { | 289 | { |
| 288 | if (!test_and_set_bit(__LINK_STATE_NOCARRIER, &dev->state)) | 290 | if (!test_and_set_bit(__LINK_STATE_NOCARRIER, &dev->state)) { |
| 291 | if (dev->reg_state == NETREG_UNINITIALIZED) | ||
| 292 | return; | ||
| 289 | linkwatch_fire_event(dev); | 293 | linkwatch_fire_event(dev); |
| 294 | } | ||
| 290 | } | 295 | } |
| 291 | EXPORT_SYMBOL(netif_carrier_off); | 296 | EXPORT_SYMBOL(netif_carrier_off); |
| 292 | 297 | ||
diff --git a/net/socket.c b/net/socket.c index 57550c3bcabe..92764d836891 100644 --- a/net/socket.c +++ b/net/socket.c | |||
| @@ -1426,8 +1426,8 @@ asmlinkage long sys_listen(int fd, int backlog) | |||
| 1426 | * clean when we restucture accept also. | 1426 | * clean when we restucture accept also. |
| 1427 | */ | 1427 | */ |
| 1428 | 1428 | ||
| 1429 | long do_accept(int fd, struct sockaddr __user *upeer_sockaddr, | 1429 | asmlinkage long sys_accept4(int fd, struct sockaddr __user *upeer_sockaddr, |
| 1430 | int __user *upeer_addrlen, int flags) | 1430 | int __user *upeer_addrlen, int flags) |
| 1431 | { | 1431 | { |
| 1432 | struct socket *sock, *newsock; | 1432 | struct socket *sock, *newsock; |
| 1433 | struct file *newfile; | 1433 | struct file *newfile; |
| @@ -1510,66 +1510,10 @@ out_fd: | |||
| 1510 | goto out_put; | 1510 | goto out_put; |
| 1511 | } | 1511 | } |
| 1512 | 1512 | ||
| 1513 | #if 0 | ||
| 1514 | #ifdef HAVE_SET_RESTORE_SIGMASK | ||
| 1515 | asmlinkage long sys_paccept(int fd, struct sockaddr __user *upeer_sockaddr, | ||
| 1516 | int __user *upeer_addrlen, | ||
| 1517 | const sigset_t __user *sigmask, | ||
| 1518 | size_t sigsetsize, int flags) | ||
| 1519 | { | ||
| 1520 | sigset_t ksigmask, sigsaved; | ||
| 1521 | int ret; | ||
| 1522 | |||
| 1523 | if (sigmask) { | ||
| 1524 | /* XXX: Don't preclude handling different sized sigset_t's. */ | ||
| 1525 | if (sigsetsize != sizeof(sigset_t)) | ||
| 1526 | return -EINVAL; | ||
| 1527 | if (copy_from_user(&ksigmask, sigmask, sizeof(ksigmask))) | ||
| 1528 | return -EFAULT; | ||
| 1529 | |||
| 1530 | sigdelsetmask(&ksigmask, sigmask(SIGKILL)|sigmask(SIGSTOP)); | ||
| 1531 | sigprocmask(SIG_SETMASK, &ksigmask, &sigsaved); | ||
| 1532 | } | ||
| 1533 | |||
| 1534 | ret = do_accept(fd, upeer_sockaddr, upeer_addrlen, flags); | ||
| 1535 | |||
| 1536 | if (ret < 0 && signal_pending(current)) { | ||
| 1537 | /* | ||
| 1538 | * Don't restore the signal mask yet. Let do_signal() deliver | ||
| 1539 | * the signal on the way back to userspace, before the signal | ||
| 1540 | * mask is restored. | ||
| 1541 | */ | ||
| 1542 | if (sigmask) { | ||
| 1543 | memcpy(¤t->saved_sigmask, &sigsaved, | ||
| 1544 | sizeof(sigsaved)); | ||
| 1545 | set_restore_sigmask(); | ||
| 1546 | } | ||
| 1547 | } else if (sigmask) | ||
| 1548 | sigprocmask(SIG_SETMASK, &sigsaved, NULL); | ||
| 1549 | |||
| 1550 | return ret; | ||
| 1551 | } | ||
| 1552 | #else | ||
| 1553 | asmlinkage long sys_paccept(int fd, struct sockaddr __user *upeer_sockaddr, | ||
| 1554 | int __user *upeer_addrlen, | ||
| 1555 | const sigset_t __user *sigmask, | ||
| 1556 | size_t sigsetsize, int flags) | ||
| 1557 | { | ||
| 1558 | /* The platform does not support restoring the signal mask in the | ||
| 1559 | * return path. So we do not allow using paccept() with a signal | ||
| 1560 | * mask. */ | ||
| 1561 | if (sigmask) | ||
| 1562 | return -EINVAL; | ||
| 1563 | |||
| 1564 | return do_accept(fd, upeer_sockaddr, upeer_addrlen, flags); | ||
| 1565 | } | ||
| 1566 | #endif | ||
| 1567 | #endif | ||
| 1568 | |||
| 1569 | asmlinkage long sys_accept(int fd, struct sockaddr __user *upeer_sockaddr, | 1513 | asmlinkage long sys_accept(int fd, struct sockaddr __user *upeer_sockaddr, |
| 1570 | int __user *upeer_addrlen) | 1514 | int __user *upeer_addrlen) |
| 1571 | { | 1515 | { |
| 1572 | return do_accept(fd, upeer_sockaddr, upeer_addrlen, 0); | 1516 | return sys_accept4(fd, upeer_sockaddr, upeer_addrlen, 0); |
| 1573 | } | 1517 | } |
| 1574 | 1518 | ||
| 1575 | /* | 1519 | /* |
| @@ -2096,7 +2040,7 @@ static const unsigned char nargs[19]={ | |||
| 2096 | AL(0),AL(3),AL(3),AL(3),AL(2),AL(3), | 2040 | AL(0),AL(3),AL(3),AL(3),AL(2),AL(3), |
| 2097 | AL(3),AL(3),AL(4),AL(4),AL(4),AL(6), | 2041 | AL(3),AL(3),AL(4),AL(4),AL(4),AL(6), |
| 2098 | AL(6),AL(2),AL(5),AL(5),AL(3),AL(3), | 2042 | AL(6),AL(2),AL(5),AL(5),AL(3),AL(3), |
| 2099 | AL(6) | 2043 | AL(4) |
| 2100 | }; | 2044 | }; |
| 2101 | 2045 | ||
| 2102 | #undef AL | 2046 | #undef AL |
| @@ -2115,7 +2059,7 @@ asmlinkage long sys_socketcall(int call, unsigned long __user *args) | |||
| 2115 | unsigned long a0, a1; | 2059 | unsigned long a0, a1; |
| 2116 | int err; | 2060 | int err; |
| 2117 | 2061 | ||
| 2118 | if (call < 1 || call > SYS_PACCEPT) | 2062 | if (call < 1 || call > SYS_ACCEPT4) |
| 2119 | return -EINVAL; | 2063 | return -EINVAL; |
| 2120 | 2064 | ||
| 2121 | /* copy_from_user should be SMP safe. */ | 2065 | /* copy_from_user should be SMP safe. */ |
| @@ -2143,9 +2087,8 @@ asmlinkage long sys_socketcall(int call, unsigned long __user *args) | |||
| 2143 | err = sys_listen(a0, a1); | 2087 | err = sys_listen(a0, a1); |
| 2144 | break; | 2088 | break; |
| 2145 | case SYS_ACCEPT: | 2089 | case SYS_ACCEPT: |
| 2146 | err = | 2090 | err = sys_accept4(a0, (struct sockaddr __user *)a1, |
| 2147 | do_accept(a0, (struct sockaddr __user *)a1, | 2091 | (int __user *)a[2], 0); |
| 2148 | (int __user *)a[2], 0); | ||
| 2149 | break; | 2092 | break; |
| 2150 | case SYS_GETSOCKNAME: | 2093 | case SYS_GETSOCKNAME: |
| 2151 | err = | 2094 | err = |
| @@ -2192,12 +2135,9 @@ asmlinkage long sys_socketcall(int call, unsigned long __user *args) | |||
| 2192 | case SYS_RECVMSG: | 2135 | case SYS_RECVMSG: |
| 2193 | err = sys_recvmsg(a0, (struct msghdr __user *)a1, a[2]); | 2136 | err = sys_recvmsg(a0, (struct msghdr __user *)a1, a[2]); |
| 2194 | break; | 2137 | break; |
| 2195 | case SYS_PACCEPT: | 2138 | case SYS_ACCEPT4: |
| 2196 | err = | 2139 | err = sys_accept4(a0, (struct sockaddr __user *)a1, |
| 2197 | sys_paccept(a0, (struct sockaddr __user *)a1, | 2140 | (int __user *)a[2], a[3]); |
| 2198 | (int __user *)a[2], | ||
| 2199 | (const sigset_t __user *) a[3], | ||
| 2200 | a[4], a[5]); | ||
| 2201 | break; | 2141 | break; |
| 2202 | default: | 2142 | default: |
| 2203 | err = -EINVAL; | 2143 | err = -EINVAL; |
diff --git a/net/sunrpc/auth_generic.c b/net/sunrpc/auth_generic.c index 744b79fdcb19..4028502f0528 100644 --- a/net/sunrpc/auth_generic.c +++ b/net/sunrpc/auth_generic.c | |||
| @@ -133,13 +133,29 @@ static int | |||
| 133 | generic_match(struct auth_cred *acred, struct rpc_cred *cred, int flags) | 133 | generic_match(struct auth_cred *acred, struct rpc_cred *cred, int flags) |
| 134 | { | 134 | { |
| 135 | struct generic_cred *gcred = container_of(cred, struct generic_cred, gc_base); | 135 | struct generic_cred *gcred = container_of(cred, struct generic_cred, gc_base); |
| 136 | int i; | ||
| 136 | 137 | ||
| 137 | if (gcred->acred.uid != acred->uid || | 138 | if (gcred->acred.uid != acred->uid || |
| 138 | gcred->acred.gid != acred->gid || | 139 | gcred->acred.gid != acred->gid || |
| 139 | gcred->acred.group_info != acred->group_info || | ||
| 140 | gcred->acred.machine_cred != acred->machine_cred) | 140 | gcred->acred.machine_cred != acred->machine_cred) |
| 141 | return 0; | 141 | goto out_nomatch; |
| 142 | |||
| 143 | /* Optimisation in the case where pointers are identical... */ | ||
| 144 | if (gcred->acred.group_info == acred->group_info) | ||
| 145 | goto out_match; | ||
| 146 | |||
| 147 | /* Slow path... */ | ||
| 148 | if (gcred->acred.group_info->ngroups != acred->group_info->ngroups) | ||
| 149 | goto out_nomatch; | ||
| 150 | for (i = 0; i < gcred->acred.group_info->ngroups; i++) { | ||
| 151 | if (GROUP_AT(gcred->acred.group_info, i) != | ||
| 152 | GROUP_AT(acred->group_info, i)) | ||
| 153 | goto out_nomatch; | ||
| 154 | } | ||
| 155 | out_match: | ||
| 142 | return 1; | 156 | return 1; |
| 157 | out_nomatch: | ||
| 158 | return 0; | ||
| 143 | } | 159 | } |
| 144 | 160 | ||
| 145 | void __init rpc_init_generic_auth(void) | 161 | void __init rpc_init_generic_auth(void) |
diff --git a/sound/pci/hda/hda_beep.c b/sound/pci/hda/hda_beep.c index 9b77b3e0fa98..3ecd7e797dee 100644 --- a/sound/pci/hda/hda_beep.c +++ b/sound/pci/hda/hda_beep.c | |||
| @@ -37,6 +37,9 @@ static void snd_hda_generate_beep(struct work_struct *work) | |||
| 37 | container_of(work, struct hda_beep, beep_work); | 37 | container_of(work, struct hda_beep, beep_work); |
| 38 | struct hda_codec *codec = beep->codec; | 38 | struct hda_codec *codec = beep->codec; |
| 39 | 39 | ||
| 40 | if (!beep->enabled) | ||
| 41 | return; | ||
| 42 | |||
| 40 | /* generate tone */ | 43 | /* generate tone */ |
| 41 | snd_hda_codec_write_cache(codec, beep->nid, 0, | 44 | snd_hda_codec_write_cache(codec, beep->nid, 0, |
| 42 | AC_VERB_SET_BEEP_CONTROL, beep->tone); | 45 | AC_VERB_SET_BEEP_CONTROL, beep->tone); |
| @@ -85,6 +88,10 @@ int snd_hda_attach_beep_device(struct hda_codec *codec, int nid) | |||
| 85 | snprintf(beep->phys, sizeof(beep->phys), | 88 | snprintf(beep->phys, sizeof(beep->phys), |
| 86 | "card%d/codec#%d/beep0", codec->bus->card->number, codec->addr); | 89 | "card%d/codec#%d/beep0", codec->bus->card->number, codec->addr); |
| 87 | input_dev = input_allocate_device(); | 90 | input_dev = input_allocate_device(); |
| 91 | if (!input_dev) { | ||
| 92 | kfree(beep); | ||
| 93 | return -ENOMEM; | ||
| 94 | } | ||
| 88 | 95 | ||
| 89 | /* setup digital beep device */ | 96 | /* setup digital beep device */ |
| 90 | input_dev->name = "HDA Digital PCBeep"; | 97 | input_dev->name = "HDA Digital PCBeep"; |
| @@ -115,6 +122,7 @@ int snd_hda_attach_beep_device(struct hda_codec *codec, int nid) | |||
| 115 | beep->nid = nid; | 122 | beep->nid = nid; |
| 116 | beep->dev = input_dev; | 123 | beep->dev = input_dev; |
| 117 | beep->codec = codec; | 124 | beep->codec = codec; |
| 125 | beep->enabled = 1; | ||
| 118 | codec->beep = beep; | 126 | codec->beep = beep; |
| 119 | 127 | ||
| 120 | INIT_WORK(&beep->beep_work, &snd_hda_generate_beep); | 128 | INIT_WORK(&beep->beep_work, &snd_hda_generate_beep); |
diff --git a/sound/pci/hda/hda_beep.h b/sound/pci/hda/hda_beep.h index de4036e6e710..b9679f081cae 100644 --- a/sound/pci/hda/hda_beep.h +++ b/sound/pci/hda/hda_beep.h | |||
| @@ -31,6 +31,7 @@ struct hda_beep { | |||
| 31 | char phys[32]; | 31 | char phys[32]; |
| 32 | int tone; | 32 | int tone; |
| 33 | int nid; | 33 | int nid; |
| 34 | int enabled; | ||
| 34 | struct work_struct beep_work; /* scheduled task for beep event */ | 35 | struct work_struct beep_work; /* scheduled task for beep event */ |
| 35 | }; | 36 | }; |
| 36 | 37 | ||
diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index 4300a679cd86..9563b5bbb272 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c | |||
| @@ -36,9 +36,11 @@ | |||
| 36 | #include "hda_beep.h" | 36 | #include "hda_beep.h" |
| 37 | 37 | ||
| 38 | #define NUM_CONTROL_ALLOC 32 | 38 | #define NUM_CONTROL_ALLOC 32 |
| 39 | |||
| 40 | #define STAC_VREF_EVENT 0x00 | ||
| 41 | #define STAC_INSERT_EVENT 0x10 | ||
| 39 | #define STAC_PWR_EVENT 0x20 | 42 | #define STAC_PWR_EVENT 0x20 |
| 40 | #define STAC_HP_EVENT 0x30 | 43 | #define STAC_HP_EVENT 0x30 |
| 41 | #define STAC_VREF_EVENT 0x40 | ||
| 42 | 44 | ||
| 43 | enum { | 45 | enum { |
| 44 | STAC_REF, | 46 | STAC_REF, |
| @@ -1686,6 +1688,10 @@ static struct snd_pci_quirk stac92hd71bxx_cfg_tbl[] = { | |||
| 1686 | /* SigmaTel reference board */ | 1688 | /* SigmaTel reference board */ |
| 1687 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, | 1689 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, |
| 1688 | "DFI LanParty", STAC_92HD71BXX_REF), | 1690 | "DFI LanParty", STAC_92HD71BXX_REF), |
| 1691 | SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x30f2, | ||
| 1692 | "HP dv5", STAC_HP_M4), | ||
| 1693 | SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x30f4, | ||
| 1694 | "HP dv7", STAC_HP_M4), | ||
| 1689 | SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x361a, | 1695 | SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x361a, |
| 1690 | "unknown HP", STAC_HP_M4), | 1696 | "unknown HP", STAC_HP_M4), |
| 1691 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0233, | 1697 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0233, |
| @@ -2587,8 +2593,10 @@ static struct snd_kcontrol_new stac92xx_control_templates[] = { | |||
| 2587 | }; | 2593 | }; |
| 2588 | 2594 | ||
| 2589 | /* add dynamic controls */ | 2595 | /* add dynamic controls */ |
| 2590 | static int stac92xx_add_control_idx(struct sigmatel_spec *spec, int type, | 2596 | static int stac92xx_add_control_temp(struct sigmatel_spec *spec, |
| 2591 | int idx, const char *name, unsigned long val) | 2597 | struct snd_kcontrol_new *ktemp, |
| 2598 | int idx, const char *name, | ||
| 2599 | unsigned long val) | ||
| 2592 | { | 2600 | { |
| 2593 | struct snd_kcontrol_new *knew; | 2601 | struct snd_kcontrol_new *knew; |
| 2594 | 2602 | ||
| @@ -2607,20 +2615,29 @@ static int stac92xx_add_control_idx(struct sigmatel_spec *spec, int type, | |||
| 2607 | } | 2615 | } |
| 2608 | 2616 | ||
| 2609 | knew = &spec->kctl_alloc[spec->num_kctl_used]; | 2617 | knew = &spec->kctl_alloc[spec->num_kctl_used]; |
| 2610 | *knew = stac92xx_control_templates[type]; | 2618 | *knew = *ktemp; |
| 2611 | knew->index = idx; | 2619 | knew->index = idx; |
| 2612 | knew->name = kstrdup(name, GFP_KERNEL); | 2620 | knew->name = kstrdup(name, GFP_KERNEL); |
| 2613 | if (! knew->name) | 2621 | if (!knew->name) |
| 2614 | return -ENOMEM; | 2622 | return -ENOMEM; |
| 2615 | knew->private_value = val; | 2623 | knew->private_value = val; |
| 2616 | spec->num_kctl_used++; | 2624 | spec->num_kctl_used++; |
| 2617 | return 0; | 2625 | return 0; |
| 2618 | } | 2626 | } |
| 2619 | 2627 | ||
| 2628 | static inline int stac92xx_add_control_idx(struct sigmatel_spec *spec, | ||
| 2629 | int type, int idx, const char *name, | ||
| 2630 | unsigned long val) | ||
| 2631 | { | ||
| 2632 | return stac92xx_add_control_temp(spec, | ||
| 2633 | &stac92xx_control_templates[type], | ||
| 2634 | idx, name, val); | ||
| 2635 | } | ||
| 2636 | |||
| 2620 | 2637 | ||
| 2621 | /* add dynamic controls */ | 2638 | /* add dynamic controls */ |
| 2622 | static int stac92xx_add_control(struct sigmatel_spec *spec, int type, | 2639 | static inline int stac92xx_add_control(struct sigmatel_spec *spec, int type, |
| 2623 | const char *name, unsigned long val) | 2640 | const char *name, unsigned long val) |
| 2624 | { | 2641 | { |
| 2625 | return stac92xx_add_control_idx(spec, type, 0, name, val); | 2642 | return stac92xx_add_control_idx(spec, type, 0, name, val); |
| 2626 | } | 2643 | } |
| @@ -3062,6 +3079,43 @@ static int stac92xx_auto_create_beep_ctls(struct hda_codec *codec, | |||
| 3062 | return 0; | 3079 | return 0; |
| 3063 | } | 3080 | } |
| 3064 | 3081 | ||
| 3082 | #ifdef CONFIG_SND_HDA_INPUT_BEEP | ||
| 3083 | #define stac92xx_dig_beep_switch_info snd_ctl_boolean_mono_info | ||
| 3084 | |||
| 3085 | static int stac92xx_dig_beep_switch_get(struct snd_kcontrol *kcontrol, | ||
| 3086 | struct snd_ctl_elem_value *ucontrol) | ||
| 3087 | { | ||
| 3088 | struct hda_codec *codec = snd_kcontrol_chip(kcontrol); | ||
| 3089 | ucontrol->value.integer.value[0] = codec->beep->enabled; | ||
| 3090 | return 0; | ||
| 3091 | } | ||
| 3092 | |||
| 3093 | static int stac92xx_dig_beep_switch_put(struct snd_kcontrol *kcontrol, | ||
| 3094 | struct snd_ctl_elem_value *ucontrol) | ||
| 3095 | { | ||
| 3096 | struct hda_codec *codec = snd_kcontrol_chip(kcontrol); | ||
| 3097 | int enabled = !!ucontrol->value.integer.value[0]; | ||
| 3098 | if (codec->beep->enabled != enabled) { | ||
| 3099 | codec->beep->enabled = enabled; | ||
| 3100 | return 1; | ||
| 3101 | } | ||
| 3102 | return 0; | ||
| 3103 | } | ||
| 3104 | |||
| 3105 | static struct snd_kcontrol_new stac92xx_dig_beep_ctrl = { | ||
| 3106 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, | ||
| 3107 | .info = stac92xx_dig_beep_switch_info, | ||
| 3108 | .get = stac92xx_dig_beep_switch_get, | ||
| 3109 | .put = stac92xx_dig_beep_switch_put, | ||
| 3110 | }; | ||
| 3111 | |||
| 3112 | static int stac92xx_beep_switch_ctl(struct hda_codec *codec) | ||
| 3113 | { | ||
| 3114 | return stac92xx_add_control_temp(codec->spec, &stac92xx_dig_beep_ctrl, | ||
| 3115 | 0, "PC Beep Playback Switch", 0); | ||
| 3116 | } | ||
| 3117 | #endif | ||
| 3118 | |||
| 3065 | static int stac92xx_auto_create_mux_input_ctls(struct hda_codec *codec) | 3119 | static int stac92xx_auto_create_mux_input_ctls(struct hda_codec *codec) |
| 3066 | { | 3120 | { |
| 3067 | struct sigmatel_spec *spec = codec->spec; | 3121 | struct sigmatel_spec *spec = codec->spec; |
| @@ -3368,6 +3422,7 @@ static int stac92xx_parse_auto_config(struct hda_codec *codec, hda_nid_t dig_out | |||
| 3368 | #ifdef CONFIG_SND_HDA_INPUT_BEEP | 3422 | #ifdef CONFIG_SND_HDA_INPUT_BEEP |
| 3369 | if (spec->digbeep_nid > 0) { | 3423 | if (spec->digbeep_nid > 0) { |
| 3370 | hda_nid_t nid = spec->digbeep_nid; | 3424 | hda_nid_t nid = spec->digbeep_nid; |
| 3425 | unsigned int caps; | ||
| 3371 | 3426 | ||
| 3372 | err = stac92xx_auto_create_beep_ctls(codec, nid); | 3427 | err = stac92xx_auto_create_beep_ctls(codec, nid); |
| 3373 | if (err < 0) | 3428 | if (err < 0) |
| @@ -3375,6 +3430,14 @@ static int stac92xx_parse_auto_config(struct hda_codec *codec, hda_nid_t dig_out | |||
| 3375 | err = snd_hda_attach_beep_device(codec, nid); | 3430 | err = snd_hda_attach_beep_device(codec, nid); |
| 3376 | if (err < 0) | 3431 | if (err < 0) |
| 3377 | return err; | 3432 | return err; |
| 3433 | /* if no beep switch is available, make its own one */ | ||
| 3434 | caps = query_amp_caps(codec, nid, HDA_OUTPUT); | ||
| 3435 | if (codec->beep && | ||
| 3436 | !((caps & AC_AMPCAP_MUTE) >> AC_AMPCAP_MUTE_SHIFT)) { | ||
| 3437 | err = stac92xx_beep_switch_ctl(codec); | ||
| 3438 | if (err < 0) | ||
| 3439 | return err; | ||
| 3440 | } | ||
| 3378 | } | 3441 | } |
| 3379 | #endif | 3442 | #endif |
| 3380 | 3443 | ||
| @@ -4419,6 +4482,13 @@ again: | |||
| 4419 | stac92xx_set_config_regs(codec); | 4482 | stac92xx_set_config_regs(codec); |
| 4420 | } | 4483 | } |
| 4421 | 4484 | ||
| 4485 | if (spec->board_config > STAC_92HD71BXX_REF) { | ||
| 4486 | /* GPIO0 = EAPD */ | ||
| 4487 | spec->gpio_mask = 0x01; | ||
| 4488 | spec->gpio_dir = 0x01; | ||
| 4489 | spec->gpio_data = 0x01; | ||
| 4490 | } | ||
| 4491 | |||
| 4422 | switch (codec->vendor_id) { | 4492 | switch (codec->vendor_id) { |
| 4423 | case 0x111d76b6: /* 4 Port without Analog Mixer */ | 4493 | case 0x111d76b6: /* 4 Port without Analog Mixer */ |
| 4424 | case 0x111d76b7: | 4494 | case 0x111d76b7: |
| @@ -4429,10 +4499,10 @@ again: | |||
| 4429 | codec->slave_dig_outs = stac92hd71bxx_slave_dig_outs; | 4499 | codec->slave_dig_outs = stac92hd71bxx_slave_dig_outs; |
| 4430 | break; | 4500 | break; |
| 4431 | case 0x111d7608: /* 5 Port with Analog Mixer */ | 4501 | case 0x111d7608: /* 5 Port with Analog Mixer */ |
| 4432 | switch (codec->subsystem_id) { | 4502 | switch (spec->board_config) { |
| 4433 | case 0x103c361a: | 4503 | case STAC_HP_M4: |
| 4434 | /* Enable VREF power saving on GPIO1 detect */ | 4504 | /* Enable VREF power saving on GPIO1 detect */ |
| 4435 | snd_hda_codec_write(codec, codec->afg, 0, | 4505 | snd_hda_codec_write_cache(codec, codec->afg, 0, |
| 4436 | AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x02); | 4506 | AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x02); |
| 4437 | snd_hda_codec_write_cache(codec, codec->afg, 0, | 4507 | snd_hda_codec_write_cache(codec, codec->afg, 0, |
| 4438 | AC_VERB_SET_UNSOLICITED_ENABLE, | 4508 | AC_VERB_SET_UNSOLICITED_ENABLE, |
| @@ -4478,13 +4548,6 @@ again: | |||
| 4478 | spec->aloopback_mask = 0x50; | 4548 | spec->aloopback_mask = 0x50; |
| 4479 | spec->aloopback_shift = 0; | 4549 | spec->aloopback_shift = 0; |
| 4480 | 4550 | ||
| 4481 | if (spec->board_config > STAC_92HD71BXX_REF) { | ||
| 4482 | /* GPIO0 = EAPD */ | ||
| 4483 | spec->gpio_mask = 0x01; | ||
| 4484 | spec->gpio_dir = 0x01; | ||
| 4485 | spec->gpio_data = 0x01; | ||
| 4486 | } | ||
| 4487 | |||
| 4488 | spec->powerdown_adcs = 1; | 4551 | spec->powerdown_adcs = 1; |
| 4489 | spec->digbeep_nid = 0x26; | 4552 | spec->digbeep_nid = 0x26; |
| 4490 | spec->mux_nids = stac92hd71bxx_mux_nids; | 4553 | spec->mux_nids = stac92hd71bxx_mux_nids; |
| @@ -4832,7 +4895,7 @@ static int patch_stac9205(struct hda_codec *codec) | |||
| 4832 | stac92xx_set_config_reg(codec, 0x20, 0x1c410030); | 4895 | stac92xx_set_config_reg(codec, 0x20, 0x1c410030); |
| 4833 | 4896 | ||
| 4834 | /* Enable unsol response for GPIO4/Dock HP connection */ | 4897 | /* Enable unsol response for GPIO4/Dock HP connection */ |
| 4835 | snd_hda_codec_write(codec, codec->afg, 0, | 4898 | snd_hda_codec_write_cache(codec, codec->afg, 0, |
| 4836 | AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x10); | 4899 | AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x10); |
| 4837 | snd_hda_codec_write_cache(codec, codec->afg, 0, | 4900 | snd_hda_codec_write_cache(codec, codec->afg, 0, |
| 4838 | AC_VERB_SET_UNSOLICITED_ENABLE, | 4901 | AC_VERB_SET_UNSOLICITED_ENABLE, |
diff --git a/sound/pci/pcxhr/pcxhr.c b/sound/pci/pcxhr/pcxhr.c index 0e06c6c9fcc0..73de6e989b3d 100644 --- a/sound/pci/pcxhr/pcxhr.c +++ b/sound/pci/pcxhr/pcxhr.c | |||
| @@ -1229,8 +1229,11 @@ static int __devinit pcxhr_probe(struct pci_dev *pci, const struct pci_device_id | |||
| 1229 | return -ENOMEM; | 1229 | return -ENOMEM; |
| 1230 | } | 1230 | } |
| 1231 | 1231 | ||
| 1232 | if (snd_BUG_ON(pci_id->driver_data >= PCI_ID_LAST)) | 1232 | if (snd_BUG_ON(pci_id->driver_data >= PCI_ID_LAST)) { |
| 1233 | kfree(mgr); | ||
| 1234 | pci_disable_device(pci); | ||
| 1233 | return -ENODEV; | 1235 | return -ENODEV; |
| 1236 | } | ||
| 1234 | card_name = pcxhr_board_params[pci_id->driver_data].board_name; | 1237 | card_name = pcxhr_board_params[pci_id->driver_data].board_name; |
| 1235 | mgr->playback_chips = pcxhr_board_params[pci_id->driver_data].playback_chips; | 1238 | mgr->playback_chips = pcxhr_board_params[pci_id->driver_data].playback_chips; |
| 1236 | mgr->capture_chips = pcxhr_board_params[pci_id->driver_data].capture_chips; | 1239 | mgr->capture_chips = pcxhr_board_params[pci_id->driver_data].capture_chips; |
