Contents of /trunk/kernel-magellan/patches-3.15/0106-3.15.7-all-fixes.patch
Parent Directory | Revision Log
Revision 2487 -
(show annotations)
(download)
Thu Aug 7 08:27:59 2014 UTC (10 years, 1 month ago) by niro
File size: 122778 byte(s)
Thu Aug 7 08:27:59 2014 UTC (10 years, 1 month ago) by niro
File size: 122778 byte(s)
-linux-3.15.7
1 | diff --git a/Makefile b/Makefile |
2 | index fefa0237c2d1..833f67f3f80f 100644 |
3 | --- a/Makefile |
4 | +++ b/Makefile |
5 | @@ -1,6 +1,6 @@ |
6 | VERSION = 3 |
7 | PATCHLEVEL = 15 |
8 | -SUBLEVEL = 6 |
9 | +SUBLEVEL = 7 |
10 | EXTRAVERSION = |
11 | NAME = Shuffling Zombie Juror |
12 | |
13 | diff --git a/arch/arc/include/uapi/asm/ptrace.h b/arch/arc/include/uapi/asm/ptrace.h |
14 | index 2618cc13ba75..76a7739aab1c 100644 |
15 | --- a/arch/arc/include/uapi/asm/ptrace.h |
16 | +++ b/arch/arc/include/uapi/asm/ptrace.h |
17 | @@ -11,6 +11,7 @@ |
18 | #ifndef _UAPI__ASM_ARC_PTRACE_H |
19 | #define _UAPI__ASM_ARC_PTRACE_H |
20 | |
21 | +#define PTRACE_GET_THREAD_AREA 25 |
22 | |
23 | #ifndef __ASSEMBLY__ |
24 | /* |
25 | diff --git a/arch/arc/kernel/ptrace.c b/arch/arc/kernel/ptrace.c |
26 | index 5d76706139dd..13b3ffb27a38 100644 |
27 | --- a/arch/arc/kernel/ptrace.c |
28 | +++ b/arch/arc/kernel/ptrace.c |
29 | @@ -146,6 +146,10 @@ long arch_ptrace(struct task_struct *child, long request, |
30 | pr_debug("REQ=%ld: ADDR =0x%lx, DATA=0x%lx)\n", request, addr, data); |
31 | |
32 | switch (request) { |
33 | + case PTRACE_GET_THREAD_AREA: |
34 | + ret = put_user(task_thread_info(child)->thr_ptr, |
35 | + (unsigned long __user *)data); |
36 | + break; |
37 | default: |
38 | ret = ptrace_request(child, request, addr, data); |
39 | break; |
40 | diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig |
41 | index db3c5414223e..34c7a24714a7 100644 |
42 | --- a/arch/arm/Kconfig |
43 | +++ b/arch/arm/Kconfig |
44 | @@ -6,6 +6,7 @@ config ARM |
45 | select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST |
46 | select ARCH_HAVE_CUSTOM_GPIO_H |
47 | select ARCH_MIGHT_HAVE_PC_PARPORT |
48 | + select ARCH_SUPPORTS_ATOMIC_RMW |
49 | select ARCH_USE_BUILTIN_BSWAP |
50 | select ARCH_USE_CMPXCHG_LOCKREF |
51 | select ARCH_WANT_IPC_PARSE_VERSION |
52 | diff --git a/arch/arm/boot/dts/imx25.dtsi b/arch/arm/boot/dts/imx25.dtsi |
53 | index ea323f09dc78..413d8f0594cb 100644 |
54 | --- a/arch/arm/boot/dts/imx25.dtsi |
55 | +++ b/arch/arm/boot/dts/imx25.dtsi |
56 | @@ -14,6 +14,7 @@ |
57 | |
58 | / { |
59 | aliases { |
60 | + ethernet0 = &fec; |
61 | gpio0 = &gpio1; |
62 | gpio1 = &gpio2; |
63 | gpio2 = &gpio3; |
64 | diff --git a/arch/arm/boot/dts/imx27.dtsi b/arch/arm/boot/dts/imx27.dtsi |
65 | index 137e010eab35..00cf66c1b8f3 100644 |
66 | --- a/arch/arm/boot/dts/imx27.dtsi |
67 | +++ b/arch/arm/boot/dts/imx27.dtsi |
68 | @@ -16,6 +16,7 @@ |
69 | |
70 | / { |
71 | aliases { |
72 | + ethernet0 = &fec; |
73 | gpio0 = &gpio1; |
74 | gpio1 = &gpio2; |
75 | gpio2 = &gpio3; |
76 | diff --git a/arch/arm/boot/dts/imx35.dtsi b/arch/arm/boot/dts/imx35.dtsi |
77 | index 88b218f8f810..e59ccb4d98e3 100644 |
78 | --- a/arch/arm/boot/dts/imx35.dtsi |
79 | +++ b/arch/arm/boot/dts/imx35.dtsi |
80 | @@ -13,6 +13,7 @@ |
81 | |
82 | / { |
83 | aliases { |
84 | + ethernet0 = &fec; |
85 | gpio0 = &gpio1; |
86 | gpio1 = &gpio2; |
87 | gpio2 = &gpio3; |
88 | diff --git a/arch/arm/boot/dts/imx50.dtsi b/arch/arm/boot/dts/imx50.dtsi |
89 | index 9c89d1ca97c2..6a201cf54366 100644 |
90 | --- a/arch/arm/boot/dts/imx50.dtsi |
91 | +++ b/arch/arm/boot/dts/imx50.dtsi |
92 | @@ -17,6 +17,7 @@ |
93 | |
94 | / { |
95 | aliases { |
96 | + ethernet0 = &fec; |
97 | gpio0 = &gpio1; |
98 | gpio1 = &gpio2; |
99 | gpio2 = &gpio3; |
100 | diff --git a/arch/arm/boot/dts/imx51.dtsi b/arch/arm/boot/dts/imx51.dtsi |
101 | index 150bb4e2f744..51b86700cd88 100644 |
102 | --- a/arch/arm/boot/dts/imx51.dtsi |
103 | +++ b/arch/arm/boot/dts/imx51.dtsi |
104 | @@ -19,6 +19,7 @@ |
105 | |
106 | / { |
107 | aliases { |
108 | + ethernet0 = &fec; |
109 | gpio0 = &gpio1; |
110 | gpio1 = &gpio2; |
111 | gpio2 = &gpio3; |
112 | diff --git a/arch/arm/boot/dts/imx53.dtsi b/arch/arm/boot/dts/imx53.dtsi |
113 | index 6a1bf4ff83d5..eaa627fa82ba 100644 |
114 | --- a/arch/arm/boot/dts/imx53.dtsi |
115 | +++ b/arch/arm/boot/dts/imx53.dtsi |
116 | @@ -18,6 +18,7 @@ |
117 | |
118 | / { |
119 | aliases { |
120 | + ethernet0 = &fec; |
121 | gpio0 = &gpio1; |
122 | gpio1 = &gpio2; |
123 | gpio2 = &gpio3; |
124 | diff --git a/arch/arm/boot/dts/imx6qdl.dtsi b/arch/arm/boot/dts/imx6qdl.dtsi |
125 | index eca0971d4db1..02a6afca7530 100644 |
126 | --- a/arch/arm/boot/dts/imx6qdl.dtsi |
127 | +++ b/arch/arm/boot/dts/imx6qdl.dtsi |
128 | @@ -16,6 +16,7 @@ |
129 | |
130 | / { |
131 | aliases { |
132 | + ethernet0 = &fec; |
133 | can0 = &can1; |
134 | can1 = &can2; |
135 | gpio0 = &gpio1; |
136 | diff --git a/arch/arm/boot/dts/imx6sl.dtsi b/arch/arm/boot/dts/imx6sl.dtsi |
137 | index d26b099260a3..2d4e5285f3f3 100644 |
138 | --- a/arch/arm/boot/dts/imx6sl.dtsi |
139 | +++ b/arch/arm/boot/dts/imx6sl.dtsi |
140 | @@ -14,6 +14,7 @@ |
141 | |
142 | / { |
143 | aliases { |
144 | + ethernet0 = &fec; |
145 | gpio0 = &gpio1; |
146 | gpio1 = &gpio2; |
147 | gpio2 = &gpio3; |
148 | diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig |
149 | index e759af5d7098..6376a39b767e 100644 |
150 | --- a/arch/arm64/Kconfig |
151 | +++ b/arch/arm64/Kconfig |
152 | @@ -2,6 +2,7 @@ config ARM64 |
153 | def_bool y |
154 | select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE |
155 | select ARCH_USE_CMPXCHG_LOCKREF |
156 | + select ARCH_SUPPORTS_ATOMIC_RMW |
157 | select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST |
158 | select ARCH_WANT_OPTIONAL_GPIOLIB |
159 | select ARCH_WANT_COMPAT_IPC_PARSE_VERSION |
160 | diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig |
161 | index c95c4b8c3e74..004851f3d841 100644 |
162 | --- a/arch/powerpc/Kconfig |
163 | +++ b/arch/powerpc/Kconfig |
164 | @@ -145,6 +145,7 @@ config PPC |
165 | select HAVE_IRQ_EXIT_ON_IRQ_STACK |
166 | select ARCH_USE_CMPXCHG_LOCKREF if PPC64 |
167 | select HAVE_ARCH_AUDITSYSCALL |
168 | + select ARCH_SUPPORTS_ATOMIC_RMW |
169 | |
170 | config GENERIC_CSUM |
171 | def_bool CPU_LITTLE_ENDIAN |
172 | diff --git a/arch/sparc/Kconfig b/arch/sparc/Kconfig |
173 | index 29f2e988c56a..407c87d9879a 100644 |
174 | --- a/arch/sparc/Kconfig |
175 | +++ b/arch/sparc/Kconfig |
176 | @@ -78,6 +78,7 @@ config SPARC64 |
177 | select HAVE_C_RECORDMCOUNT |
178 | select NO_BOOTMEM |
179 | select HAVE_ARCH_AUDITSYSCALL |
180 | + select ARCH_SUPPORTS_ATOMIC_RMW |
181 | |
182 | config ARCH_DEFCONFIG |
183 | string |
184 | diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig |
185 | index 6b8b429c832f..512e45f0c204 100644 |
186 | --- a/arch/x86/Kconfig |
187 | +++ b/arch/x86/Kconfig |
188 | @@ -130,6 +130,7 @@ config X86 |
189 | select HAVE_CC_STACKPROTECTOR |
190 | select GENERIC_CPU_AUTOPROBE |
191 | select HAVE_ARCH_AUDITSYSCALL |
192 | + select ARCH_SUPPORTS_ATOMIC_RMW |
193 | |
194 | config INSTRUCTION_DECODER |
195 | def_bool y |
196 | diff --git a/arch/x86/boot/header.S b/arch/x86/boot/header.S |
197 | index 84c223479e3c..7a6d43a554d7 100644 |
198 | --- a/arch/x86/boot/header.S |
199 | +++ b/arch/x86/boot/header.S |
200 | @@ -91,10 +91,9 @@ bs_die: |
201 | |
202 | .section ".bsdata", "a" |
203 | bugger_off_msg: |
204 | - .ascii "Direct floppy boot is not supported. " |
205 | - .ascii "Use a boot loader program instead.\r\n" |
206 | + .ascii "Use a boot loader.\r\n" |
207 | .ascii "\n" |
208 | - .ascii "Remove disk and press any key to reboot ...\r\n" |
209 | + .ascii "Remove disk and press any key to reboot...\r\n" |
210 | .byte 0 |
211 | |
212 | #ifdef CONFIG_EFI_STUB |
213 | @@ -108,7 +107,7 @@ coff_header: |
214 | #else |
215 | .word 0x8664 # x86-64 |
216 | #endif |
217 | - .word 3 # nr_sections |
218 | + .word 4 # nr_sections |
219 | .long 0 # TimeDateStamp |
220 | .long 0 # PointerToSymbolTable |
221 | .long 1 # NumberOfSymbols |
222 | @@ -250,6 +249,25 @@ section_table: |
223 | .word 0 # NumberOfLineNumbers |
224 | .long 0x60500020 # Characteristics (section flags) |
225 | |
226 | + # |
227 | + # The offset & size fields are filled in by build.c. |
228 | + # |
229 | + .ascii ".bss" |
230 | + .byte 0 |
231 | + .byte 0 |
232 | + .byte 0 |
233 | + .byte 0 |
234 | + .long 0 |
235 | + .long 0x0 |
236 | + .long 0 # Size of initialized data |
237 | + # on disk |
238 | + .long 0x0 |
239 | + .long 0 # PointerToRelocations |
240 | + .long 0 # PointerToLineNumbers |
241 | + .word 0 # NumberOfRelocations |
242 | + .word 0 # NumberOfLineNumbers |
243 | + .long 0xc8000080 # Characteristics (section flags) |
244 | + |
245 | #endif /* CONFIG_EFI_STUB */ |
246 | |
247 | # Kernel attributes; used by setup. This is part 1 of the |
248 | diff --git a/arch/x86/boot/tools/build.c b/arch/x86/boot/tools/build.c |
249 | index 1a2f2121cada..a7661c430cd9 100644 |
250 | --- a/arch/x86/boot/tools/build.c |
251 | +++ b/arch/x86/boot/tools/build.c |
252 | @@ -143,7 +143,7 @@ static void usage(void) |
253 | |
254 | #ifdef CONFIG_EFI_STUB |
255 | |
256 | -static void update_pecoff_section_header(char *section_name, u32 offset, u32 size) |
257 | +static void update_pecoff_section_header_fields(char *section_name, u32 vma, u32 size, u32 datasz, u32 offset) |
258 | { |
259 | unsigned int pe_header; |
260 | unsigned short num_sections; |
261 | @@ -164,10 +164,10 @@ static void update_pecoff_section_header(char *section_name, u32 offset, u32 siz |
262 | put_unaligned_le32(size, section + 0x8); |
263 | |
264 | /* section header vma field */ |
265 | - put_unaligned_le32(offset, section + 0xc); |
266 | + put_unaligned_le32(vma, section + 0xc); |
267 | |
268 | /* section header 'size of initialised data' field */ |
269 | - put_unaligned_le32(size, section + 0x10); |
270 | + put_unaligned_le32(datasz, section + 0x10); |
271 | |
272 | /* section header 'file offset' field */ |
273 | put_unaligned_le32(offset, section + 0x14); |
274 | @@ -179,6 +179,11 @@ static void update_pecoff_section_header(char *section_name, u32 offset, u32 siz |
275 | } |
276 | } |
277 | |
278 | +static void update_pecoff_section_header(char *section_name, u32 offset, u32 size) |
279 | +{ |
280 | + update_pecoff_section_header_fields(section_name, offset, size, size, offset); |
281 | +} |
282 | + |
283 | static void update_pecoff_setup_and_reloc(unsigned int size) |
284 | { |
285 | u32 setup_offset = 0x200; |
286 | @@ -203,9 +208,6 @@ static void update_pecoff_text(unsigned int text_start, unsigned int file_sz) |
287 | |
288 | pe_header = get_unaligned_le32(&buf[0x3c]); |
289 | |
290 | - /* Size of image */ |
291 | - put_unaligned_le32(file_sz, &buf[pe_header + 0x50]); |
292 | - |
293 | /* |
294 | * Size of code: Subtract the size of the first sector (512 bytes) |
295 | * which includes the header. |
296 | @@ -220,6 +222,22 @@ static void update_pecoff_text(unsigned int text_start, unsigned int file_sz) |
297 | update_pecoff_section_header(".text", text_start, text_sz); |
298 | } |
299 | |
300 | +static void update_pecoff_bss(unsigned int file_sz, unsigned int init_sz) |
301 | +{ |
302 | + unsigned int pe_header; |
303 | + unsigned int bss_sz = init_sz - file_sz; |
304 | + |
305 | + pe_header = get_unaligned_le32(&buf[0x3c]); |
306 | + |
307 | + /* Size of uninitialized data */ |
308 | + put_unaligned_le32(bss_sz, &buf[pe_header + 0x24]); |
309 | + |
310 | + /* Size of image */ |
311 | + put_unaligned_le32(init_sz, &buf[pe_header + 0x50]); |
312 | + |
313 | + update_pecoff_section_header_fields(".bss", file_sz, bss_sz, 0, 0); |
314 | +} |
315 | + |
316 | static int reserve_pecoff_reloc_section(int c) |
317 | { |
318 | /* Reserve 0x20 bytes for .reloc section */ |
319 | @@ -259,6 +277,8 @@ static void efi_stub_entry_update(void) |
320 | static inline void update_pecoff_setup_and_reloc(unsigned int size) {} |
321 | static inline void update_pecoff_text(unsigned int text_start, |
322 | unsigned int file_sz) {} |
323 | +static inline void update_pecoff_bss(unsigned int file_sz, |
324 | + unsigned int init_sz) {} |
325 | static inline void efi_stub_defaults(void) {} |
326 | static inline void efi_stub_entry_update(void) {} |
327 | |
328 | @@ -310,7 +330,7 @@ static void parse_zoffset(char *fname) |
329 | |
330 | int main(int argc, char ** argv) |
331 | { |
332 | - unsigned int i, sz, setup_sectors; |
333 | + unsigned int i, sz, setup_sectors, init_sz; |
334 | int c; |
335 | u32 sys_size; |
336 | struct stat sb; |
337 | @@ -376,7 +396,9 @@ int main(int argc, char ** argv) |
338 | buf[0x1f1] = setup_sectors-1; |
339 | put_unaligned_le32(sys_size, &buf[0x1f4]); |
340 | |
341 | - update_pecoff_text(setup_sectors * 512, sz + i + ((sys_size * 16) - sz)); |
342 | + update_pecoff_text(setup_sectors * 512, i + (sys_size * 16)); |
343 | + init_sz = get_unaligned_le32(&buf[0x260]); |
344 | + update_pecoff_bss(i + (sys_size * 16), init_sz); |
345 | |
346 | efi_stub_entry_update(); |
347 | |
348 | diff --git a/arch/x86/kernel/cpu/perf_event_intel.c b/arch/x86/kernel/cpu/perf_event_intel.c |
349 | index adb02aa62af5..07846d738bdb 100644 |
350 | --- a/arch/x86/kernel/cpu/perf_event_intel.c |
351 | +++ b/arch/x86/kernel/cpu/perf_event_intel.c |
352 | @@ -1382,6 +1382,15 @@ again: |
353 | intel_pmu_lbr_read(); |
354 | |
355 | /* |
356 | + * CondChgd bit 63 doesn't mean any overflow status. Ignore |
357 | + * and clear the bit. |
358 | + */ |
359 | + if (__test_and_clear_bit(63, (unsigned long *)&status)) { |
360 | + if (!status) |
361 | + goto done; |
362 | + } |
363 | + |
364 | + /* |
365 | * PEBS overflow sets bit 62 in the global status register |
366 | */ |
367 | if (__test_and_clear_bit(62, (unsigned long *)&status)) { |
368 | diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c |
369 | index 57e5ce126d5a..ea030319b321 100644 |
370 | --- a/arch/x86/kernel/tsc.c |
371 | +++ b/arch/x86/kernel/tsc.c |
372 | @@ -920,9 +920,9 @@ static int time_cpufreq_notifier(struct notifier_block *nb, unsigned long val, |
373 | tsc_khz = cpufreq_scale(tsc_khz_ref, ref_freq, freq->new); |
374 | if (!(freq->flags & CPUFREQ_CONST_LOOPS)) |
375 | mark_tsc_unstable("cpufreq changes"); |
376 | - } |
377 | |
378 | - set_cyc2ns_scale(tsc_khz, freq->cpu); |
379 | + set_cyc2ns_scale(tsc_khz, freq->cpu); |
380 | + } |
381 | |
382 | return 0; |
383 | } |
384 | diff --git a/drivers/bluetooth/ath3k.c b/drivers/bluetooth/ath3k.c |
385 | index a83b57e57b63..e625969bb921 100644 |
386 | --- a/drivers/bluetooth/ath3k.c |
387 | +++ b/drivers/bluetooth/ath3k.c |
388 | @@ -90,7 +90,6 @@ static const struct usb_device_id ath3k_table[] = { |
389 | { USB_DEVICE(0x0b05, 0x17d0) }, |
390 | { USB_DEVICE(0x0CF3, 0x0036) }, |
391 | { USB_DEVICE(0x0CF3, 0x3004) }, |
392 | - { USB_DEVICE(0x0CF3, 0x3005) }, |
393 | { USB_DEVICE(0x0CF3, 0x3008) }, |
394 | { USB_DEVICE(0x0CF3, 0x311D) }, |
395 | { USB_DEVICE(0x0CF3, 0x311E) }, |
396 | @@ -140,7 +139,6 @@ static const struct usb_device_id ath3k_blist_tbl[] = { |
397 | { USB_DEVICE(0x0b05, 0x17d0), .driver_info = BTUSB_ATH3012 }, |
398 | { USB_DEVICE(0x0CF3, 0x0036), .driver_info = BTUSB_ATH3012 }, |
399 | { USB_DEVICE(0x0cf3, 0x3004), .driver_info = BTUSB_ATH3012 }, |
400 | - { USB_DEVICE(0x0cf3, 0x3005), .driver_info = BTUSB_ATH3012 }, |
401 | { USB_DEVICE(0x0cf3, 0x3008), .driver_info = BTUSB_ATH3012 }, |
402 | { USB_DEVICE(0x0cf3, 0x311D), .driver_info = BTUSB_ATH3012 }, |
403 | { USB_DEVICE(0x0cf3, 0x311E), .driver_info = BTUSB_ATH3012 }, |
404 | diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c |
405 | index a7dfbf9a3afb..55cee1d67681 100644 |
406 | --- a/drivers/bluetooth/btusb.c |
407 | +++ b/drivers/bluetooth/btusb.c |
408 | @@ -160,7 +160,6 @@ static const struct usb_device_id blacklist_table[] = { |
409 | { USB_DEVICE(0x0b05, 0x17d0), .driver_info = BTUSB_ATH3012 }, |
410 | { USB_DEVICE(0x0cf3, 0x0036), .driver_info = BTUSB_ATH3012 }, |
411 | { USB_DEVICE(0x0cf3, 0x3004), .driver_info = BTUSB_ATH3012 }, |
412 | - { USB_DEVICE(0x0cf3, 0x3005), .driver_info = BTUSB_ATH3012 }, |
413 | { USB_DEVICE(0x0cf3, 0x3008), .driver_info = BTUSB_ATH3012 }, |
414 | { USB_DEVICE(0x0cf3, 0x311d), .driver_info = BTUSB_ATH3012 }, |
415 | { USB_DEVICE(0x0cf3, 0x311e), .driver_info = BTUSB_ATH3012 }, |
416 | diff --git a/drivers/bluetooth/hci_h5.c b/drivers/bluetooth/hci_h5.c |
417 | index 04680ead9275..fede8ca7147c 100644 |
418 | --- a/drivers/bluetooth/hci_h5.c |
419 | +++ b/drivers/bluetooth/hci_h5.c |
420 | @@ -406,6 +406,7 @@ static int h5_rx_3wire_hdr(struct hci_uart *hu, unsigned char c) |
421 | H5_HDR_PKT_TYPE(hdr) != HCI_3WIRE_LINK_PKT) { |
422 | BT_ERR("Non-link packet received in non-active state"); |
423 | h5_reset_rx(h5); |
424 | + return 0; |
425 | } |
426 | |
427 | h5->rx_func = h5_rx_payload; |
428 | diff --git a/drivers/char/hw_random/core.c b/drivers/char/hw_random/core.c |
429 | index 334601cc81cf..2a451b14b3cc 100644 |
430 | --- a/drivers/char/hw_random/core.c |
431 | +++ b/drivers/char/hw_random/core.c |
432 | @@ -55,16 +55,35 @@ static DEFINE_MUTEX(rng_mutex); |
433 | static int data_avail; |
434 | static u8 *rng_buffer; |
435 | |
436 | +static inline int rng_get_data(struct hwrng *rng, u8 *buffer, size_t size, |
437 | + int wait); |
438 | + |
439 | static size_t rng_buffer_size(void) |
440 | { |
441 | return SMP_CACHE_BYTES < 32 ? 32 : SMP_CACHE_BYTES; |
442 | } |
443 | |
444 | +static void add_early_randomness(struct hwrng *rng) |
445 | +{ |
446 | + unsigned char bytes[16]; |
447 | + int bytes_read; |
448 | + |
449 | + bytes_read = rng_get_data(rng, bytes, sizeof(bytes), 1); |
450 | + if (bytes_read > 0) |
451 | + add_device_randomness(bytes, bytes_read); |
452 | +} |
453 | + |
454 | static inline int hwrng_init(struct hwrng *rng) |
455 | { |
456 | - if (!rng->init) |
457 | - return 0; |
458 | - return rng->init(rng); |
459 | + if (rng->init) { |
460 | + int ret; |
461 | + |
462 | + ret = rng->init(rng); |
463 | + if (ret) |
464 | + return ret; |
465 | + } |
466 | + add_early_randomness(rng); |
467 | + return 0; |
468 | } |
469 | |
470 | static inline void hwrng_cleanup(struct hwrng *rng) |
471 | @@ -304,8 +323,6 @@ int hwrng_register(struct hwrng *rng) |
472 | { |
473 | int err = -EINVAL; |
474 | struct hwrng *old_rng, *tmp; |
475 | - unsigned char bytes[16]; |
476 | - int bytes_read; |
477 | |
478 | if (rng->name == NULL || |
479 | (rng->data_read == NULL && rng->read == NULL)) |
480 | @@ -347,9 +364,17 @@ int hwrng_register(struct hwrng *rng) |
481 | INIT_LIST_HEAD(&rng->list); |
482 | list_add_tail(&rng->list, &rng_list); |
483 | |
484 | - bytes_read = rng_get_data(rng, bytes, sizeof(bytes), 1); |
485 | - if (bytes_read > 0) |
486 | - add_device_randomness(bytes, bytes_read); |
487 | + if (old_rng && !rng->init) { |
488 | + /* |
489 | + * Use a new device's input to add some randomness to |
490 | + * the system. If this rng device isn't going to be |
491 | + * used right away, its init function hasn't been |
492 | + * called yet; so only use the randomness from devices |
493 | + * that don't need an init callback. |
494 | + */ |
495 | + add_early_randomness(rng); |
496 | + } |
497 | + |
498 | out_unlock: |
499 | mutex_unlock(&rng_mutex); |
500 | out: |
501 | diff --git a/drivers/char/random.c b/drivers/char/random.c |
502 | index 2b6e4cd8de8e..18ec40459598 100644 |
503 | --- a/drivers/char/random.c |
504 | +++ b/drivers/char/random.c |
505 | @@ -641,7 +641,7 @@ retry: |
506 | } while (unlikely(entropy_count < pool_size-2 && pnfrac)); |
507 | } |
508 | |
509 | - if (entropy_count < 0) { |
510 | + if (unlikely(entropy_count < 0)) { |
511 | pr_warn("random: negative entropy/overflow: pool %s count %d\n", |
512 | r->name, entropy_count); |
513 | WARN_ON(1); |
514 | @@ -980,7 +980,7 @@ static size_t account(struct entropy_store *r, size_t nbytes, int min, |
515 | int reserved) |
516 | { |
517 | int entropy_count, orig; |
518 | - size_t ibytes; |
519 | + size_t ibytes, nfrac; |
520 | |
521 | BUG_ON(r->entropy_count > r->poolinfo->poolfracbits); |
522 | |
523 | @@ -998,7 +998,17 @@ retry: |
524 | } |
525 | if (ibytes < min) |
526 | ibytes = 0; |
527 | - if ((entropy_count -= ibytes << (ENTROPY_SHIFT + 3)) < 0) |
528 | + |
529 | + if (unlikely(entropy_count < 0)) { |
530 | + pr_warn("random: negative entropy count: pool %s count %d\n", |
531 | + r->name, entropy_count); |
532 | + WARN_ON(1); |
533 | + entropy_count = 0; |
534 | + } |
535 | + nfrac = ibytes << (ENTROPY_SHIFT + 3); |
536 | + if ((size_t) entropy_count > nfrac) |
537 | + entropy_count -= nfrac; |
538 | + else |
539 | entropy_count = 0; |
540 | |
541 | if (cmpxchg(&r->entropy_count, orig, entropy_count) != orig) |
542 | @@ -1375,6 +1385,7 @@ urandom_read(struct file *file, char __user *buf, size_t nbytes, loff_t *ppos) |
543 | "with %d bits of entropy available\n", |
544 | current->comm, nonblocking_pool.entropy_total); |
545 | |
546 | + nbytes = min_t(size_t, nbytes, INT_MAX >> (ENTROPY_SHIFT + 3)); |
547 | ret = extract_entropy_user(&nonblocking_pool, buf, nbytes); |
548 | |
549 | trace_urandom_read(8 * nbytes, ENTROPY_BITS(&nonblocking_pool), |
550 | diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c |
551 | index 558224cf55bf..dcac12dc6803 100644 |
552 | --- a/drivers/cpufreq/cpufreq.c |
553 | +++ b/drivers/cpufreq/cpufreq.c |
554 | @@ -1139,10 +1139,12 @@ static int __cpufreq_add_dev(struct device *dev, struct subsys_interface *sif) |
555 | * the creation of a brand new one. So we need to perform this update |
556 | * by invoking update_policy_cpu(). |
557 | */ |
558 | - if (recover_policy && cpu != policy->cpu) |
559 | + if (recover_policy && cpu != policy->cpu) { |
560 | update_policy_cpu(policy, cpu); |
561 | - else |
562 | + WARN_ON(kobject_move(&policy->kobj, &dev->kobj)); |
563 | + } else { |
564 | policy->cpu = cpu; |
565 | + } |
566 | |
567 | cpumask_copy(policy->cpus, cpumask_of(cpu)); |
568 | |
569 | diff --git a/drivers/gpio/gpio-dwapb.c b/drivers/gpio/gpio-dwapb.c |
570 | index ed5711f77e2d..4d25a06bb45e 100644 |
571 | --- a/drivers/gpio/gpio-dwapb.c |
572 | +++ b/drivers/gpio/gpio-dwapb.c |
573 | @@ -260,9 +260,6 @@ static void dwapb_configure_irqs(struct dwapb_gpio *gpio, |
574 | ct->regs.ack = GPIO_PORTA_EOI; |
575 | ct->regs.mask = GPIO_INTMASK; |
576 | |
577 | - irq_setup_generic_chip(irq_gc, IRQ_MSK(port->bgc.gc.ngpio), |
578 | - IRQ_GC_INIT_NESTED_LOCK, IRQ_NOREQUEST, 0); |
579 | - |
580 | irq_set_chained_handler(irq, dwapb_irq_handler); |
581 | irq_set_handler_data(irq, gpio); |
582 | |
583 | diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c |
584 | index 2a00cb828d20..61963d3acce2 100644 |
585 | --- a/drivers/gpu/drm/i915/intel_dp.c |
586 | +++ b/drivers/gpu/drm/i915/intel_dp.c |
587 | @@ -833,8 +833,8 @@ intel_dp_compute_config(struct intel_encoder *encoder, |
588 | mode_rate = intel_dp_link_required(adjusted_mode->crtc_clock, |
589 | bpp); |
590 | |
591 | - for (lane_count = min_lane_count; lane_count <= max_lane_count; lane_count <<= 1) { |
592 | - for (clock = min_clock; clock <= max_clock; clock++) { |
593 | + for (clock = min_clock; clock <= max_clock; clock++) { |
594 | + for (lane_count = min_lane_count; lane_count <= max_lane_count; lane_count <<= 1) { |
595 | link_clock = drm_dp_bw_code_to_link_rate(bws[clock]); |
596 | link_avail = intel_dp_max_data_rate(link_clock, |
597 | lane_count); |
598 | diff --git a/drivers/gpu/drm/qxl/qxl_irq.c b/drivers/gpu/drm/qxl/qxl_irq.c |
599 | index 28f84b4fce32..3485bdccf8b8 100644 |
600 | --- a/drivers/gpu/drm/qxl/qxl_irq.c |
601 | +++ b/drivers/gpu/drm/qxl/qxl_irq.c |
602 | @@ -33,6 +33,9 @@ irqreturn_t qxl_irq_handler(int irq, void *arg) |
603 | |
604 | pending = xchg(&qdev->ram_header->int_pending, 0); |
605 | |
606 | + if (!pending) |
607 | + return IRQ_NONE; |
608 | + |
609 | atomic_inc(&qdev->irq_received); |
610 | |
611 | if (pending & QXL_INTERRUPT_DISPLAY) { |
612 | diff --git a/drivers/gpu/drm/radeon/atombios_encoders.c b/drivers/gpu/drm/radeon/atombios_encoders.c |
613 | index 2b2908440644..7d68203a3737 100644 |
614 | --- a/drivers/gpu/drm/radeon/atombios_encoders.c |
615 | +++ b/drivers/gpu/drm/radeon/atombios_encoders.c |
616 | @@ -183,7 +183,6 @@ void radeon_atom_backlight_init(struct radeon_encoder *radeon_encoder, |
617 | struct backlight_properties props; |
618 | struct radeon_backlight_privdata *pdata; |
619 | struct radeon_encoder_atom_dig *dig; |
620 | - u8 backlight_level; |
621 | char bl_name[16]; |
622 | |
623 | /* Mac laptops with multiple GPUs use the gmux driver for backlight |
624 | @@ -222,12 +221,17 @@ void radeon_atom_backlight_init(struct radeon_encoder *radeon_encoder, |
625 | |
626 | pdata->encoder = radeon_encoder; |
627 | |
628 | - backlight_level = radeon_atom_get_backlight_level_from_reg(rdev); |
629 | - |
630 | dig = radeon_encoder->enc_priv; |
631 | dig->bl_dev = bd; |
632 | |
633 | bd->props.brightness = radeon_atom_backlight_get_brightness(bd); |
634 | + /* Set a reasonable default here if the level is 0 otherwise |
635 | + * fbdev will attempt to turn the backlight on after console |
636 | + * unblanking and it will try and restore 0 which turns the backlight |
637 | + * off again. |
638 | + */ |
639 | + if (bd->props.brightness == 0) |
640 | + bd->props.brightness = RADEON_MAX_BL_LEVEL; |
641 | bd->props.power = FB_BLANK_UNBLANK; |
642 | backlight_update_status(bd); |
643 | |
644 | diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c |
645 | index 356b733caafe..9445db514de0 100644 |
646 | --- a/drivers/gpu/drm/radeon/radeon_display.c |
647 | +++ b/drivers/gpu/drm/radeon/radeon_display.c |
648 | @@ -757,6 +757,10 @@ int radeon_ddc_get_modes(struct radeon_connector *radeon_connector) |
649 | struct radeon_device *rdev = dev->dev_private; |
650 | int ret = 0; |
651 | |
652 | + /* don't leak the edid if we already fetched it in detect() */ |
653 | + if (radeon_connector->edid) |
654 | + goto got_edid; |
655 | + |
656 | /* on hw with routers, select right port */ |
657 | if (radeon_connector->router.ddc_valid) |
658 | radeon_router_select_ddc_port(radeon_connector); |
659 | @@ -795,6 +799,7 @@ int radeon_ddc_get_modes(struct radeon_connector *radeon_connector) |
660 | radeon_connector->edid = radeon_bios_get_hardcoded_edid(rdev); |
661 | } |
662 | if (radeon_connector->edid) { |
663 | +got_edid: |
664 | drm_mode_connector_update_edid_property(&radeon_connector->base, radeon_connector->edid); |
665 | ret = drm_add_edid_modes(&radeon_connector->base, radeon_connector->edid); |
666 | drm_edid_to_eld(&radeon_connector->base, radeon_connector->edid); |
667 | diff --git a/drivers/hv/hv_fcopy.c b/drivers/hv/hv_fcopy.c |
668 | index eaaa3d843b80..23b2ce294c4c 100644 |
669 | --- a/drivers/hv/hv_fcopy.c |
670 | +++ b/drivers/hv/hv_fcopy.c |
671 | @@ -246,8 +246,8 @@ void hv_fcopy_onchannelcallback(void *context) |
672 | /* |
673 | * Send the information to the user-level daemon. |
674 | */ |
675 | - fcopy_send_data(); |
676 | schedule_delayed_work(&fcopy_work, 5*HZ); |
677 | + fcopy_send_data(); |
678 | return; |
679 | } |
680 | icmsghdr->icflags = ICMSGHDRFLAG_TRANSACTION | ICMSGHDRFLAG_RESPONSE; |
681 | diff --git a/drivers/hv/hv_kvp.c b/drivers/hv/hv_kvp.c |
682 | index ea852537307e..2b931feb5131 100644 |
683 | --- a/drivers/hv/hv_kvp.c |
684 | +++ b/drivers/hv/hv_kvp.c |
685 | @@ -127,6 +127,15 @@ kvp_work_func(struct work_struct *dummy) |
686 | kvp_respond_to_host(NULL, HV_E_FAIL); |
687 | } |
688 | |
689 | +static void poll_channel(struct vmbus_channel *channel) |
690 | +{ |
691 | + unsigned long flags; |
692 | + |
693 | + spin_lock_irqsave(&channel->inbound_lock, flags); |
694 | + hv_kvp_onchannelcallback(channel); |
695 | + spin_unlock_irqrestore(&channel->inbound_lock, flags); |
696 | +} |
697 | + |
698 | static int kvp_handle_handshake(struct hv_kvp_msg *msg) |
699 | { |
700 | int ret = 1; |
701 | @@ -155,7 +164,7 @@ static int kvp_handle_handshake(struct hv_kvp_msg *msg) |
702 | kvp_register(dm_reg_value); |
703 | kvp_transaction.active = false; |
704 | if (kvp_transaction.kvp_context) |
705 | - hv_kvp_onchannelcallback(kvp_transaction.kvp_context); |
706 | + poll_channel(kvp_transaction.kvp_context); |
707 | } |
708 | return ret; |
709 | } |
710 | @@ -568,6 +577,7 @@ response_done: |
711 | |
712 | vmbus_sendpacket(channel, recv_buffer, buf_len, req_id, |
713 | VM_PKT_DATA_INBAND, 0); |
714 | + poll_channel(channel); |
715 | |
716 | } |
717 | |
718 | @@ -603,7 +613,7 @@ void hv_kvp_onchannelcallback(void *context) |
719 | return; |
720 | } |
721 | |
722 | - vmbus_recvpacket(channel, recv_buffer, PAGE_SIZE * 2, &recvlen, |
723 | + vmbus_recvpacket(channel, recv_buffer, PAGE_SIZE * 4, &recvlen, |
724 | &requestid); |
725 | |
726 | if (recvlen > 0) { |
727 | diff --git a/drivers/hv/hv_util.c b/drivers/hv/hv_util.c |
728 | index dd761806f0e8..3b9c9ef0deb8 100644 |
729 | --- a/drivers/hv/hv_util.c |
730 | +++ b/drivers/hv/hv_util.c |
731 | @@ -319,7 +319,7 @@ static int util_probe(struct hv_device *dev, |
732 | (struct hv_util_service *)dev_id->driver_data; |
733 | int ret; |
734 | |
735 | - srv->recv_buffer = kmalloc(PAGE_SIZE * 2, GFP_KERNEL); |
736 | + srv->recv_buffer = kmalloc(PAGE_SIZE * 4, GFP_KERNEL); |
737 | if (!srv->recv_buffer) |
738 | return -ENOMEM; |
739 | if (srv->util_init) { |
740 | diff --git a/drivers/hwmon/adt7470.c b/drivers/hwmon/adt7470.c |
741 | index 0f4dea5ccf17..9ee3913850d6 100644 |
742 | --- a/drivers/hwmon/adt7470.c |
743 | +++ b/drivers/hwmon/adt7470.c |
744 | @@ -515,7 +515,7 @@ static ssize_t set_temp_min(struct device *dev, |
745 | return -EINVAL; |
746 | |
747 | temp = DIV_ROUND_CLOSEST(temp, 1000); |
748 | - temp = clamp_val(temp, 0, 255); |
749 | + temp = clamp_val(temp, -128, 127); |
750 | |
751 | mutex_lock(&data->lock); |
752 | data->temp_min[attr->index] = temp; |
753 | @@ -549,7 +549,7 @@ static ssize_t set_temp_max(struct device *dev, |
754 | return -EINVAL; |
755 | |
756 | temp = DIV_ROUND_CLOSEST(temp, 1000); |
757 | - temp = clamp_val(temp, 0, 255); |
758 | + temp = clamp_val(temp, -128, 127); |
759 | |
760 | mutex_lock(&data->lock); |
761 | data->temp_max[attr->index] = temp; |
762 | @@ -826,7 +826,7 @@ static ssize_t set_pwm_tmin(struct device *dev, |
763 | return -EINVAL; |
764 | |
765 | temp = DIV_ROUND_CLOSEST(temp, 1000); |
766 | - temp = clamp_val(temp, 0, 255); |
767 | + temp = clamp_val(temp, -128, 127); |
768 | |
769 | mutex_lock(&data->lock); |
770 | data->pwm_tmin[attr->index] = temp; |
771 | diff --git a/drivers/hwmon/da9052-hwmon.c b/drivers/hwmon/da9052-hwmon.c |
772 | index afd31042b452..d14ab3c45daa 100644 |
773 | --- a/drivers/hwmon/da9052-hwmon.c |
774 | +++ b/drivers/hwmon/da9052-hwmon.c |
775 | @@ -194,7 +194,7 @@ static ssize_t da9052_hwmon_show_name(struct device *dev, |
776 | struct device_attribute *devattr, |
777 | char *buf) |
778 | { |
779 | - return sprintf(buf, "da9052-hwmon\n"); |
780 | + return sprintf(buf, "da9052\n"); |
781 | } |
782 | |
783 | static ssize_t show_label(struct device *dev, |
784 | diff --git a/drivers/hwmon/da9055-hwmon.c b/drivers/hwmon/da9055-hwmon.c |
785 | index 73b3865f1207..35eb7738d711 100644 |
786 | --- a/drivers/hwmon/da9055-hwmon.c |
787 | +++ b/drivers/hwmon/da9055-hwmon.c |
788 | @@ -204,7 +204,7 @@ static ssize_t da9055_hwmon_show_name(struct device *dev, |
789 | struct device_attribute *devattr, |
790 | char *buf) |
791 | { |
792 | - return sprintf(buf, "da9055-hwmon\n"); |
793 | + return sprintf(buf, "da9055\n"); |
794 | } |
795 | |
796 | static ssize_t show_label(struct device *dev, |
797 | diff --git a/drivers/iio/industrialio-event.c b/drivers/iio/industrialio-event.c |
798 | index ea6e06b9c7d4..11dd986e5fa0 100644 |
799 | --- a/drivers/iio/industrialio-event.c |
800 | +++ b/drivers/iio/industrialio-event.c |
801 | @@ -341,6 +341,9 @@ static int iio_device_add_event(struct iio_dev *indio_dev, |
802 | &indio_dev->event_interface->dev_attr_list); |
803 | kfree(postfix); |
804 | |
805 | + if ((ret == -EBUSY) && (shared_by != IIO_SEPARATE)) |
806 | + continue; |
807 | + |
808 | if (ret) |
809 | return ret; |
810 | |
811 | diff --git a/drivers/infiniband/hw/cxgb4/device.c b/drivers/infiniband/hw/cxgb4/device.c |
812 | index 8914ea90ddd9..bff1a8ed47d0 100644 |
813 | --- a/drivers/infiniband/hw/cxgb4/device.c |
814 | +++ b/drivers/infiniband/hw/cxgb4/device.c |
815 | @@ -654,6 +654,7 @@ static int c4iw_rdev_open(struct c4iw_rdev *rdev) |
816 | pr_err(MOD "error allocating status page\n"); |
817 | goto err4; |
818 | } |
819 | + rdev->status_page->db_off = 0; |
820 | return 0; |
821 | err4: |
822 | c4iw_rqtpool_destroy(rdev); |
823 | diff --git a/drivers/infiniband/hw/mlx5/qp.c b/drivers/infiniband/hw/mlx5/qp.c |
824 | index dc930ed21eca..c69adc1705b4 100644 |
825 | --- a/drivers/infiniband/hw/mlx5/qp.c |
826 | +++ b/drivers/infiniband/hw/mlx5/qp.c |
827 | @@ -671,7 +671,7 @@ static int create_kernel_qp(struct mlx5_ib_dev *dev, |
828 | int err; |
829 | |
830 | uuari = &dev->mdev.priv.uuari; |
831 | - if (init_attr->create_flags & ~IB_QP_CREATE_SIGNATURE_EN) |
832 | + if (init_attr->create_flags & ~(IB_QP_CREATE_SIGNATURE_EN | IB_QP_CREATE_BLOCK_MULTICAST_LOOPBACK)) |
833 | return -EINVAL; |
834 | |
835 | if (init_attr->qp_type == MLX5_IB_QPT_REG_UMR) |
836 | diff --git a/drivers/irqchip/irq-gic.c b/drivers/irqchip/irq-gic.c |
837 | index 57d165e026f4..739ca6756cb9 100644 |
838 | --- a/drivers/irqchip/irq-gic.c |
839 | +++ b/drivers/irqchip/irq-gic.c |
840 | @@ -42,6 +42,7 @@ |
841 | #include <linux/irqchip/chained_irq.h> |
842 | #include <linux/irqchip/arm-gic.h> |
843 | |
844 | +#include <asm/cputype.h> |
845 | #include <asm/irq.h> |
846 | #include <asm/exception.h> |
847 | #include <asm/smp_plat.h> |
848 | @@ -954,7 +955,9 @@ void __init gic_init_bases(unsigned int gic_nr, int irq_start, |
849 | } |
850 | |
851 | for_each_possible_cpu(cpu) { |
852 | - unsigned long offset = percpu_offset * cpu_logical_map(cpu); |
853 | + u32 mpidr = cpu_logical_map(cpu); |
854 | + u32 core_id = MPIDR_AFFINITY_LEVEL(mpidr, 0); |
855 | + unsigned long offset = percpu_offset * core_id; |
856 | *per_cpu_ptr(gic->dist_base.percpu_base, cpu) = dist_base + offset; |
857 | *per_cpu_ptr(gic->cpu_base.percpu_base, cpu) = cpu_base + offset; |
858 | } |
859 | @@ -1071,8 +1074,10 @@ gic_of_init(struct device_node *node, struct device_node *parent) |
860 | gic_cnt++; |
861 | return 0; |
862 | } |
863 | +IRQCHIP_DECLARE(gic_400, "arm,gic-400", gic_of_init); |
864 | IRQCHIP_DECLARE(cortex_a15_gic, "arm,cortex-a15-gic", gic_of_init); |
865 | IRQCHIP_DECLARE(cortex_a9_gic, "arm,cortex-a9-gic", gic_of_init); |
866 | +IRQCHIP_DECLARE(cortex_a7_gic, "arm,cortex-a7-gic", gic_of_init); |
867 | IRQCHIP_DECLARE(msm_8660_qgic, "qcom,msm-8660-qgic", gic_of_init); |
868 | IRQCHIP_DECLARE(msm_qgic2, "qcom,msm-qgic2", gic_of_init); |
869 | |
870 | diff --git a/drivers/isdn/i4l/isdn_ppp.c b/drivers/isdn/i4l/isdn_ppp.c |
871 | index a5da511e3c9a..158ed32ac21c 100644 |
872 | --- a/drivers/isdn/i4l/isdn_ppp.c |
873 | +++ b/drivers/isdn/i4l/isdn_ppp.c |
874 | @@ -442,7 +442,7 @@ static int get_filter(void __user *arg, struct sock_filter **p) |
875 | { |
876 | struct sock_fprog uprog; |
877 | struct sock_filter *code = NULL; |
878 | - int len, err; |
879 | + int len; |
880 | |
881 | if (copy_from_user(&uprog, arg, sizeof(uprog))) |
882 | return -EFAULT; |
883 | @@ -458,12 +458,6 @@ static int get_filter(void __user *arg, struct sock_filter **p) |
884 | if (IS_ERR(code)) |
885 | return PTR_ERR(code); |
886 | |
887 | - err = sk_chk_filter(code, uprog.len); |
888 | - if (err) { |
889 | - kfree(code); |
890 | - return err; |
891 | - } |
892 | - |
893 | *p = code; |
894 | return uprog.len; |
895 | } |
896 | @@ -644,9 +638,15 @@ isdn_ppp_ioctl(int min, struct file *file, unsigned int cmd, unsigned long arg) |
897 | fprog.len = len; |
898 | fprog.filter = code; |
899 | |
900 | - if (is->pass_filter) |
901 | + if (is->pass_filter) { |
902 | sk_unattached_filter_destroy(is->pass_filter); |
903 | - err = sk_unattached_filter_create(&is->pass_filter, &fprog); |
904 | + is->pass_filter = NULL; |
905 | + } |
906 | + if (fprog.filter != NULL) |
907 | + err = sk_unattached_filter_create(&is->pass_filter, |
908 | + &fprog); |
909 | + else |
910 | + err = 0; |
911 | kfree(code); |
912 | |
913 | return err; |
914 | @@ -663,9 +663,15 @@ isdn_ppp_ioctl(int min, struct file *file, unsigned int cmd, unsigned long arg) |
915 | fprog.len = len; |
916 | fprog.filter = code; |
917 | |
918 | - if (is->active_filter) |
919 | + if (is->active_filter) { |
920 | sk_unattached_filter_destroy(is->active_filter); |
921 | - err = sk_unattached_filter_create(&is->active_filter, &fprog); |
922 | + is->active_filter = NULL; |
923 | + } |
924 | + if (fprog.filter != NULL) |
925 | + err = sk_unattached_filter_create(&is->active_filter, |
926 | + &fprog); |
927 | + else |
928 | + err = 0; |
929 | kfree(code); |
930 | |
931 | return err; |
932 | diff --git a/drivers/md/dm-cache-metadata.c b/drivers/md/dm-cache-metadata.c |
933 | index 4ead4ba60656..d2899e7eb3aa 100644 |
934 | --- a/drivers/md/dm-cache-metadata.c |
935 | +++ b/drivers/md/dm-cache-metadata.c |
936 | @@ -425,6 +425,15 @@ static int __open_metadata(struct dm_cache_metadata *cmd) |
937 | |
938 | disk_super = dm_block_data(sblock); |
939 | |
940 | + /* Verify the data block size hasn't changed */ |
941 | + if (le32_to_cpu(disk_super->data_block_size) != cmd->data_block_size) { |
942 | + DMERR("changing the data block size (from %u to %llu) is not supported", |
943 | + le32_to_cpu(disk_super->data_block_size), |
944 | + (unsigned long long)cmd->data_block_size); |
945 | + r = -EINVAL; |
946 | + goto bad; |
947 | + } |
948 | + |
949 | r = __check_incompat_features(disk_super, cmd); |
950 | if (r < 0) |
951 | goto bad; |
952 | diff --git a/drivers/md/dm-thin-metadata.c b/drivers/md/dm-thin-metadata.c |
953 | index b086a945edcb..e9d33ad59df5 100644 |
954 | --- a/drivers/md/dm-thin-metadata.c |
955 | +++ b/drivers/md/dm-thin-metadata.c |
956 | @@ -613,6 +613,15 @@ static int __open_metadata(struct dm_pool_metadata *pmd) |
957 | |
958 | disk_super = dm_block_data(sblock); |
959 | |
960 | + /* Verify the data block size hasn't changed */ |
961 | + if (le32_to_cpu(disk_super->data_block_size) != pmd->data_block_size) { |
962 | + DMERR("changing the data block size (from %u to %llu) is not supported", |
963 | + le32_to_cpu(disk_super->data_block_size), |
964 | + (unsigned long long)pmd->data_block_size); |
965 | + r = -EINVAL; |
966 | + goto bad_unlock_sblock; |
967 | + } |
968 | + |
969 | r = __check_incompat_features(disk_super, pmd); |
970 | if (r < 0) |
971 | goto bad_unlock_sblock; |
972 | diff --git a/drivers/media/usb/gspca/pac7302.c b/drivers/media/usb/gspca/pac7302.c |
973 | index 2fd1c5e31a0f..339adce7c7a5 100644 |
974 | --- a/drivers/media/usb/gspca/pac7302.c |
975 | +++ b/drivers/media/usb/gspca/pac7302.c |
976 | @@ -928,6 +928,7 @@ static const struct usb_device_id device_table[] = { |
977 | {USB_DEVICE(0x093a, 0x2620)}, |
978 | {USB_DEVICE(0x093a, 0x2621)}, |
979 | {USB_DEVICE(0x093a, 0x2622), .driver_info = FL_VFLIP}, |
980 | + {USB_DEVICE(0x093a, 0x2623), .driver_info = FL_VFLIP}, |
981 | {USB_DEVICE(0x093a, 0x2624), .driver_info = FL_VFLIP}, |
982 | {USB_DEVICE(0x093a, 0x2625)}, |
983 | {USB_DEVICE(0x093a, 0x2626)}, |
984 | diff --git a/drivers/mtd/devices/elm.c b/drivers/mtd/devices/elm.c |
985 | index 1fd4a0f77967..d85dd3693f47 100644 |
986 | --- a/drivers/mtd/devices/elm.c |
987 | +++ b/drivers/mtd/devices/elm.c |
988 | @@ -445,6 +445,7 @@ static int elm_context_save(struct elm_info *info) |
989 | ELM_SYNDROME_FRAGMENT_1 + offset); |
990 | regs->elm_syndrome_fragment_0[i] = elm_read_reg(info, |
991 | ELM_SYNDROME_FRAGMENT_0 + offset); |
992 | + break; |
993 | default: |
994 | return -EINVAL; |
995 | } |
996 | @@ -483,6 +484,7 @@ static int elm_context_restore(struct elm_info *info) |
997 | regs->elm_syndrome_fragment_1[i]); |
998 | elm_write_reg(info, ELM_SYNDROME_FRAGMENT_0 + offset, |
999 | regs->elm_syndrome_fragment_0[i]); |
1000 | + break; |
1001 | default: |
1002 | return -EINVAL; |
1003 | } |
1004 | diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c |
1005 | index d3a67896d435..96fee83c9606 100644 |
1006 | --- a/drivers/net/bonding/bond_main.c |
1007 | +++ b/drivers/net/bonding/bond_main.c |
1008 | @@ -4028,7 +4028,7 @@ static int bond_check_params(struct bond_params *params) |
1009 | } |
1010 | |
1011 | if (ad_select) { |
1012 | - bond_opt_initstr(&newval, lacp_rate); |
1013 | + bond_opt_initstr(&newval, ad_select); |
1014 | valptr = bond_opt_parse(bond_opt_get(BOND_OPT_AD_SELECT), |
1015 | &newval); |
1016 | if (!valptr) { |
1017 | diff --git a/drivers/net/can/slcan.c b/drivers/net/can/slcan.c |
1018 | index dcf9196f6316..ea4d4f1a6411 100644 |
1019 | --- a/drivers/net/can/slcan.c |
1020 | +++ b/drivers/net/can/slcan.c |
1021 | @@ -52,6 +52,7 @@ |
1022 | #include <linux/delay.h> |
1023 | #include <linux/init.h> |
1024 | #include <linux/kernel.h> |
1025 | +#include <linux/workqueue.h> |
1026 | #include <linux/can.h> |
1027 | #include <linux/can/skb.h> |
1028 | |
1029 | @@ -85,6 +86,7 @@ struct slcan { |
1030 | struct tty_struct *tty; /* ptr to TTY structure */ |
1031 | struct net_device *dev; /* easy for intr handling */ |
1032 | spinlock_t lock; |
1033 | + struct work_struct tx_work; /* Flushes transmit buffer */ |
1034 | |
1035 | /* These are pointers to the malloc()ed frame buffers. */ |
1036 | unsigned char rbuff[SLC_MTU]; /* receiver buffer */ |
1037 | @@ -309,36 +311,46 @@ static void slc_encaps(struct slcan *sl, struct can_frame *cf) |
1038 | sl->dev->stats.tx_bytes += cf->can_dlc; |
1039 | } |
1040 | |
1041 | -/* |
1042 | - * Called by the driver when there's room for more data. If we have |
1043 | - * more packets to send, we send them here. |
1044 | - */ |
1045 | -static void slcan_write_wakeup(struct tty_struct *tty) |
1046 | +/* Write out any remaining transmit buffer. Scheduled when tty is writable */ |
1047 | +static void slcan_transmit(struct work_struct *work) |
1048 | { |
1049 | + struct slcan *sl = container_of(work, struct slcan, tx_work); |
1050 | int actual; |
1051 | - struct slcan *sl = (struct slcan *) tty->disc_data; |
1052 | |
1053 | + spin_lock_bh(&sl->lock); |
1054 | /* First make sure we're connected. */ |
1055 | - if (!sl || sl->magic != SLCAN_MAGIC || !netif_running(sl->dev)) |
1056 | + if (!sl->tty || sl->magic != SLCAN_MAGIC || !netif_running(sl->dev)) { |
1057 | + spin_unlock_bh(&sl->lock); |
1058 | return; |
1059 | + } |
1060 | |
1061 | - spin_lock_bh(&sl->lock); |
1062 | if (sl->xleft <= 0) { |
1063 | /* Now serial buffer is almost free & we can start |
1064 | * transmission of another packet */ |
1065 | sl->dev->stats.tx_packets++; |
1066 | - clear_bit(TTY_DO_WRITE_WAKEUP, &tty->flags); |
1067 | + clear_bit(TTY_DO_WRITE_WAKEUP, &sl->tty->flags); |
1068 | spin_unlock_bh(&sl->lock); |
1069 | netif_wake_queue(sl->dev); |
1070 | return; |
1071 | } |
1072 | |
1073 | - actual = tty->ops->write(tty, sl->xhead, sl->xleft); |
1074 | + actual = sl->tty->ops->write(sl->tty, sl->xhead, sl->xleft); |
1075 | sl->xleft -= actual; |
1076 | sl->xhead += actual; |
1077 | spin_unlock_bh(&sl->lock); |
1078 | } |
1079 | |
1080 | +/* |
1081 | + * Called by the driver when there's room for more data. |
1082 | + * Schedule the transmit. |
1083 | + */ |
1084 | +static void slcan_write_wakeup(struct tty_struct *tty) |
1085 | +{ |
1086 | + struct slcan *sl = tty->disc_data; |
1087 | + |
1088 | + schedule_work(&sl->tx_work); |
1089 | +} |
1090 | + |
1091 | /* Send a can_frame to a TTY queue. */ |
1092 | static netdev_tx_t slc_xmit(struct sk_buff *skb, struct net_device *dev) |
1093 | { |
1094 | @@ -528,6 +540,7 @@ static struct slcan *slc_alloc(dev_t line) |
1095 | sl->magic = SLCAN_MAGIC; |
1096 | sl->dev = dev; |
1097 | spin_lock_init(&sl->lock); |
1098 | + INIT_WORK(&sl->tx_work, slcan_transmit); |
1099 | slcan_devs[i] = dev; |
1100 | |
1101 | return sl; |
1102 | @@ -626,8 +639,12 @@ static void slcan_close(struct tty_struct *tty) |
1103 | if (!sl || sl->magic != SLCAN_MAGIC || sl->tty != tty) |
1104 | return; |
1105 | |
1106 | + spin_lock_bh(&sl->lock); |
1107 | tty->disc_data = NULL; |
1108 | sl->tty = NULL; |
1109 | + spin_unlock_bh(&sl->lock); |
1110 | + |
1111 | + flush_work(&sl->tx_work); |
1112 | |
1113 | /* Flush network side */ |
1114 | unregister_netdev(sl->dev); |
1115 | diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c |
1116 | index 9261d5313b5b..0979967577a1 100644 |
1117 | --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c |
1118 | +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c |
1119 | @@ -797,7 +797,8 @@ static void bnx2x_tpa_stop(struct bnx2x *bp, struct bnx2x_fastpath *fp, |
1120 | |
1121 | return; |
1122 | } |
1123 | - bnx2x_frag_free(fp, new_data); |
1124 | + if (new_data) |
1125 | + bnx2x_frag_free(fp, new_data); |
1126 | drop: |
1127 | /* drop the packet and keep the buffer in the bin */ |
1128 | DP(NETIF_MSG_RX_STATUS, |
1129 | diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c |
1130 | index dc19bc5dec77..2b5ab7c770b5 100644 |
1131 | --- a/drivers/net/ethernet/emulex/benet/be_main.c |
1132 | +++ b/drivers/net/ethernet/emulex/benet/be_main.c |
1133 | @@ -2858,7 +2858,7 @@ static int be_open(struct net_device *netdev) |
1134 | for_all_evt_queues(adapter, eqo, i) { |
1135 | napi_enable(&eqo->napi); |
1136 | be_enable_busy_poll(eqo); |
1137 | - be_eq_notify(adapter, eqo->q.id, true, false, 0); |
1138 | + be_eq_notify(adapter, eqo->q.id, true, true, 0); |
1139 | } |
1140 | adapter->flags |= BE_FLAGS_NAPI_ENABLED; |
1141 | |
1142 | diff --git a/drivers/net/ethernet/intel/igb/e1000_82575.c b/drivers/net/ethernet/intel/igb/e1000_82575.c |
1143 | index fa36fe12e775..4c8d2d530e26 100644 |
1144 | --- a/drivers/net/ethernet/intel/igb/e1000_82575.c |
1145 | +++ b/drivers/net/ethernet/intel/igb/e1000_82575.c |
1146 | @@ -1489,6 +1489,13 @@ static s32 igb_init_hw_82575(struct e1000_hw *hw) |
1147 | s32 ret_val; |
1148 | u16 i, rar_count = mac->rar_entry_count; |
1149 | |
1150 | + if ((hw->mac.type >= e1000_i210) && |
1151 | + !(igb_get_flash_presence_i210(hw))) { |
1152 | + ret_val = igb_pll_workaround_i210(hw); |
1153 | + if (ret_val) |
1154 | + return ret_val; |
1155 | + } |
1156 | + |
1157 | /* Initialize identification LED */ |
1158 | ret_val = igb_id_led_init(hw); |
1159 | if (ret_val) { |
1160 | diff --git a/drivers/net/ethernet/intel/igb/e1000_defines.h b/drivers/net/ethernet/intel/igb/e1000_defines.h |
1161 | index b05bf925ac72..25d236143e9d 100644 |
1162 | --- a/drivers/net/ethernet/intel/igb/e1000_defines.h |
1163 | +++ b/drivers/net/ethernet/intel/igb/e1000_defines.h |
1164 | @@ -49,14 +49,15 @@ |
1165 | #define E1000_CTRL_EXT_SDP3_DIR 0x00000800 /* SDP3 Data direction */ |
1166 | |
1167 | /* Physical Func Reset Done Indication */ |
1168 | -#define E1000_CTRL_EXT_PFRSTD 0x00004000 |
1169 | -#define E1000_CTRL_EXT_LINK_MODE_MASK 0x00C00000 |
1170 | -#define E1000_CTRL_EXT_LINK_MODE_PCIE_SERDES 0x00C00000 |
1171 | -#define E1000_CTRL_EXT_LINK_MODE_1000BASE_KX 0x00400000 |
1172 | -#define E1000_CTRL_EXT_LINK_MODE_SGMII 0x00800000 |
1173 | -#define E1000_CTRL_EXT_LINK_MODE_GMII 0x00000000 |
1174 | -#define E1000_CTRL_EXT_EIAME 0x01000000 |
1175 | -#define E1000_CTRL_EXT_IRCA 0x00000001 |
1176 | +#define E1000_CTRL_EXT_PFRSTD 0x00004000 |
1177 | +#define E1000_CTRL_EXT_SDLPE 0X00040000 /* SerDes Low Power Enable */ |
1178 | +#define E1000_CTRL_EXT_LINK_MODE_MASK 0x00C00000 |
1179 | +#define E1000_CTRL_EXT_LINK_MODE_PCIE_SERDES 0x00C00000 |
1180 | +#define E1000_CTRL_EXT_LINK_MODE_1000BASE_KX 0x00400000 |
1181 | +#define E1000_CTRL_EXT_LINK_MODE_SGMII 0x00800000 |
1182 | +#define E1000_CTRL_EXT_LINK_MODE_GMII 0x00000000 |
1183 | +#define E1000_CTRL_EXT_EIAME 0x01000000 |
1184 | +#define E1000_CTRL_EXT_IRCA 0x00000001 |
1185 | /* Interrupt delay cancellation */ |
1186 | /* Driver loaded bit for FW */ |
1187 | #define E1000_CTRL_EXT_DRV_LOAD 0x10000000 |
1188 | @@ -65,6 +66,7 @@ |
1189 | /* packet buffer parity error detection enabled */ |
1190 | /* descriptor FIFO parity error detection enable */ |
1191 | #define E1000_CTRL_EXT_PBA_CLR 0x80000000 /* PBA Clear */ |
1192 | +#define E1000_CTRL_EXT_PHYPDEN 0x00100000 |
1193 | #define E1000_I2CCMD_REG_ADDR_SHIFT 16 |
1194 | #define E1000_I2CCMD_PHY_ADDR_SHIFT 24 |
1195 | #define E1000_I2CCMD_OPCODE_READ 0x08000000 |
1196 | diff --git a/drivers/net/ethernet/intel/igb/e1000_hw.h b/drivers/net/ethernet/intel/igb/e1000_hw.h |
1197 | index 10741d170f2d..e990cacbf698 100644 |
1198 | --- a/drivers/net/ethernet/intel/igb/e1000_hw.h |
1199 | +++ b/drivers/net/ethernet/intel/igb/e1000_hw.h |
1200 | @@ -571,4 +571,7 @@ struct net_device *igb_get_hw_dev(struct e1000_hw *hw); |
1201 | /* These functions must be implemented by drivers */ |
1202 | s32 igb_read_pcie_cap_reg(struct e1000_hw *hw, u32 reg, u16 *value); |
1203 | s32 igb_write_pcie_cap_reg(struct e1000_hw *hw, u32 reg, u16 *value); |
1204 | + |
1205 | +void igb_read_pci_cfg(struct e1000_hw *hw, u32 reg, u16 *value); |
1206 | +void igb_write_pci_cfg(struct e1000_hw *hw, u32 reg, u16 *value); |
1207 | #endif /* _E1000_HW_H_ */ |
1208 | diff --git a/drivers/net/ethernet/intel/igb/e1000_i210.c b/drivers/net/ethernet/intel/igb/e1000_i210.c |
1209 | index f67f8a170b90..9e2c43361dfe 100644 |
1210 | --- a/drivers/net/ethernet/intel/igb/e1000_i210.c |
1211 | +++ b/drivers/net/ethernet/intel/igb/e1000_i210.c |
1212 | @@ -836,3 +836,69 @@ s32 igb_init_nvm_params_i210(struct e1000_hw *hw) |
1213 | } |
1214 | return ret_val; |
1215 | } |
1216 | + |
1217 | +/** |
1218 | + * igb_pll_workaround_i210 |
1219 | + * @hw: pointer to the HW structure |
1220 | + * |
1221 | + * Works around an errata in the PLL circuit where it occasionally |
1222 | + * provides the wrong clock frequency after power up. |
1223 | + **/ |
1224 | +s32 igb_pll_workaround_i210(struct e1000_hw *hw) |
1225 | +{ |
1226 | + s32 ret_val; |
1227 | + u32 wuc, mdicnfg, ctrl, ctrl_ext, reg_val; |
1228 | + u16 nvm_word, phy_word, pci_word, tmp_nvm; |
1229 | + int i; |
1230 | + |
1231 | + /* Get and set needed register values */ |
1232 | + wuc = rd32(E1000_WUC); |
1233 | + mdicnfg = rd32(E1000_MDICNFG); |
1234 | + reg_val = mdicnfg & ~E1000_MDICNFG_EXT_MDIO; |
1235 | + wr32(E1000_MDICNFG, reg_val); |
1236 | + |
1237 | + /* Get data from NVM, or set default */ |
1238 | + ret_val = igb_read_invm_word_i210(hw, E1000_INVM_AUTOLOAD, |
1239 | + &nvm_word); |
1240 | + if (ret_val) |
1241 | + nvm_word = E1000_INVM_DEFAULT_AL; |
1242 | + tmp_nvm = nvm_word | E1000_INVM_PLL_WO_VAL; |
1243 | + for (i = 0; i < E1000_MAX_PLL_TRIES; i++) { |
1244 | + /* check current state directly from internal PHY */ |
1245 | + igb_read_phy_reg_gs40g(hw, (E1000_PHY_PLL_FREQ_PAGE | |
1246 | + E1000_PHY_PLL_FREQ_REG), &phy_word); |
1247 | + if ((phy_word & E1000_PHY_PLL_UNCONF) |
1248 | + != E1000_PHY_PLL_UNCONF) { |
1249 | + ret_val = 0; |
1250 | + break; |
1251 | + } else { |
1252 | + ret_val = -E1000_ERR_PHY; |
1253 | + } |
1254 | + /* directly reset the internal PHY */ |
1255 | + ctrl = rd32(E1000_CTRL); |
1256 | + wr32(E1000_CTRL, ctrl|E1000_CTRL_PHY_RST); |
1257 | + |
1258 | + ctrl_ext = rd32(E1000_CTRL_EXT); |
1259 | + ctrl_ext |= (E1000_CTRL_EXT_PHYPDEN | E1000_CTRL_EXT_SDLPE); |
1260 | + wr32(E1000_CTRL_EXT, ctrl_ext); |
1261 | + |
1262 | + wr32(E1000_WUC, 0); |
1263 | + reg_val = (E1000_INVM_AUTOLOAD << 4) | (tmp_nvm << 16); |
1264 | + wr32(E1000_EEARBC_I210, reg_val); |
1265 | + |
1266 | + igb_read_pci_cfg(hw, E1000_PCI_PMCSR, &pci_word); |
1267 | + pci_word |= E1000_PCI_PMCSR_D3; |
1268 | + igb_write_pci_cfg(hw, E1000_PCI_PMCSR, &pci_word); |
1269 | + usleep_range(1000, 2000); |
1270 | + pci_word &= ~E1000_PCI_PMCSR_D3; |
1271 | + igb_write_pci_cfg(hw, E1000_PCI_PMCSR, &pci_word); |
1272 | + reg_val = (E1000_INVM_AUTOLOAD << 4) | (nvm_word << 16); |
1273 | + wr32(E1000_EEARBC_I210, reg_val); |
1274 | + |
1275 | + /* restore WUC register */ |
1276 | + wr32(E1000_WUC, wuc); |
1277 | + } |
1278 | + /* restore MDICNFG setting */ |
1279 | + wr32(E1000_MDICNFG, mdicnfg); |
1280 | + return ret_val; |
1281 | +} |
1282 | diff --git a/drivers/net/ethernet/intel/igb/e1000_i210.h b/drivers/net/ethernet/intel/igb/e1000_i210.h |
1283 | index 907fe99a9813..8205e1976595 100644 |
1284 | --- a/drivers/net/ethernet/intel/igb/e1000_i210.h |
1285 | +++ b/drivers/net/ethernet/intel/igb/e1000_i210.h |
1286 | @@ -36,6 +36,7 @@ s32 igb_read_xmdio_reg(struct e1000_hw *hw, u16 addr, u8 dev_addr, u16 *data); |
1287 | s32 igb_write_xmdio_reg(struct e1000_hw *hw, u16 addr, u8 dev_addr, u16 data); |
1288 | s32 igb_init_nvm_params_i210(struct e1000_hw *hw); |
1289 | bool igb_get_flash_presence_i210(struct e1000_hw *hw); |
1290 | +s32 igb_pll_workaround_i210(struct e1000_hw *hw); |
1291 | |
1292 | #define E1000_STM_OPCODE 0xDB00 |
1293 | #define E1000_EEPROM_FLASH_SIZE_WORD 0x11 |
1294 | @@ -81,4 +82,15 @@ enum E1000_INVM_STRUCTURE_TYPE { |
1295 | #define NVM_LED_1_CFG_DEFAULT_I211 0x0184 |
1296 | #define NVM_LED_0_2_CFG_DEFAULT_I211 0x200C |
1297 | |
1298 | +/* PLL Defines */ |
1299 | +#define E1000_PCI_PMCSR 0x44 |
1300 | +#define E1000_PCI_PMCSR_D3 0x03 |
1301 | +#define E1000_MAX_PLL_TRIES 5 |
1302 | +#define E1000_PHY_PLL_UNCONF 0xFF |
1303 | +#define E1000_PHY_PLL_FREQ_PAGE 0xFC0000 |
1304 | +#define E1000_PHY_PLL_FREQ_REG 0x000E |
1305 | +#define E1000_INVM_DEFAULT_AL 0x202F |
1306 | +#define E1000_INVM_AUTOLOAD 0x0A |
1307 | +#define E1000_INVM_PLL_WO_VAL 0x0010 |
1308 | + |
1309 | #endif |
1310 | diff --git a/drivers/net/ethernet/intel/igb/e1000_regs.h b/drivers/net/ethernet/intel/igb/e1000_regs.h |
1311 | index bdb246e848e1..8ded9a12d409 100644 |
1312 | --- a/drivers/net/ethernet/intel/igb/e1000_regs.h |
1313 | +++ b/drivers/net/ethernet/intel/igb/e1000_regs.h |
1314 | @@ -69,6 +69,7 @@ |
1315 | #define E1000_PBA 0x01000 /* Packet Buffer Allocation - RW */ |
1316 | #define E1000_PBS 0x01008 /* Packet Buffer Size */ |
1317 | #define E1000_EEMNGCTL 0x01010 /* MNG EEprom Control */ |
1318 | +#define E1000_EEARBC_I210 0x12024 /* EEPROM Auto Read Bus Control */ |
1319 | #define E1000_EEWR 0x0102C /* EEPROM Write Register - RW */ |
1320 | #define E1000_I2CCMD 0x01028 /* SFPI2C Command Register - RW */ |
1321 | #define E1000_FRTIMER 0x01048 /* Free Running Timer - RW */ |
1322 | diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c |
1323 | index 16430a8440fa..d731df1da919 100644 |
1324 | --- a/drivers/net/ethernet/intel/igb/igb_main.c |
1325 | +++ b/drivers/net/ethernet/intel/igb/igb_main.c |
1326 | @@ -7204,6 +7204,20 @@ static int igb_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd) |
1327 | } |
1328 | } |
1329 | |
1330 | +void igb_read_pci_cfg(struct e1000_hw *hw, u32 reg, u16 *value) |
1331 | +{ |
1332 | + struct igb_adapter *adapter = hw->back; |
1333 | + |
1334 | + pci_read_config_word(adapter->pdev, reg, value); |
1335 | +} |
1336 | + |
1337 | +void igb_write_pci_cfg(struct e1000_hw *hw, u32 reg, u16 *value) |
1338 | +{ |
1339 | + struct igb_adapter *adapter = hw->back; |
1340 | + |
1341 | + pci_write_config_word(adapter->pdev, reg, *value); |
1342 | +} |
1343 | + |
1344 | s32 igb_read_pcie_cap_reg(struct e1000_hw *hw, u32 reg, u16 *value) |
1345 | { |
1346 | struct igb_adapter *adapter = hw->back; |
1347 | @@ -7567,6 +7581,8 @@ static int igb_sriov_reinit(struct pci_dev *dev) |
1348 | |
1349 | if (netif_running(netdev)) |
1350 | igb_close(netdev); |
1351 | + else |
1352 | + igb_reset(adapter); |
1353 | |
1354 | igb_clear_interrupt_scheme(adapter); |
1355 | |
1356 | diff --git a/drivers/net/ethernet/marvell/mvneta.c b/drivers/net/ethernet/marvell/mvneta.c |
1357 | index 14786c8bf99e..d63c4bf96c20 100644 |
1358 | --- a/drivers/net/ethernet/marvell/mvneta.c |
1359 | +++ b/drivers/net/ethernet/marvell/mvneta.c |
1360 | @@ -1189,7 +1189,7 @@ static u32 mvneta_txq_desc_csum(int l3_offs, int l3_proto, |
1361 | command = l3_offs << MVNETA_TX_L3_OFF_SHIFT; |
1362 | command |= ip_hdr_len << MVNETA_TX_IP_HLEN_SHIFT; |
1363 | |
1364 | - if (l3_proto == swab16(ETH_P_IP)) |
1365 | + if (l3_proto == htons(ETH_P_IP)) |
1366 | command |= MVNETA_TXD_IP_CSUM; |
1367 | else |
1368 | command |= MVNETA_TX_L3_IP6; |
1369 | @@ -2365,7 +2365,7 @@ static void mvneta_adjust_link(struct net_device *ndev) |
1370 | |
1371 | if (phydev->speed == SPEED_1000) |
1372 | val |= MVNETA_GMAC_CONFIG_GMII_SPEED; |
1373 | - else |
1374 | + else if (phydev->speed == SPEED_100) |
1375 | val |= MVNETA_GMAC_CONFIG_MII_SPEED; |
1376 | |
1377 | mvreg_write(pp, MVNETA_GMAC_AUTONEG_CONFIG, val); |
1378 | diff --git a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c |
1379 | index 7e4b1720c3d1..e03c9aff81ba 100644 |
1380 | --- a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c |
1381 | +++ b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c |
1382 | @@ -2303,7 +2303,7 @@ static void mlx4_en_add_vxlan_port(struct net_device *dev, |
1383 | struct mlx4_en_priv *priv = netdev_priv(dev); |
1384 | __be16 current_port; |
1385 | |
1386 | - if (!(priv->mdev->dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_VXLAN_OFFLOADS)) |
1387 | + if (priv->mdev->dev->caps.tunnel_offload_mode != MLX4_TUNNEL_OFFLOAD_MODE_VXLAN) |
1388 | return; |
1389 | |
1390 | if (sa_family == AF_INET6) |
1391 | diff --git a/drivers/net/ethernet/mellanox/mlx4/main.c b/drivers/net/ethernet/mellanox/mlx4/main.c |
1392 | index 8fa321f39dfd..52b4c3986c99 100644 |
1393 | --- a/drivers/net/ethernet/mellanox/mlx4/main.c |
1394 | +++ b/drivers/net/ethernet/mellanox/mlx4/main.c |
1395 | @@ -2466,7 +2466,8 @@ slave_start: |
1396 | "with IB port. Single port VFs syntax" |
1397 | " is only supported when all ports " |
1398 | "are configured as ethernet\n"); |
1399 | - goto err_close; |
1400 | + err = -EINVAL; |
1401 | + goto err_master_mfunc; |
1402 | } |
1403 | for (i = 0; i < sizeof(nvfs)/sizeof(nvfs[0]); i++) { |
1404 | unsigned j; |
1405 | diff --git a/drivers/net/ethernet/sun/sunvnet.c b/drivers/net/ethernet/sun/sunvnet.c |
1406 | index 1c24a8f368bd..fd411d6e19a2 100644 |
1407 | --- a/drivers/net/ethernet/sun/sunvnet.c |
1408 | +++ b/drivers/net/ethernet/sun/sunvnet.c |
1409 | @@ -1083,6 +1083,24 @@ static struct vnet *vnet_find_or_create(const u64 *local_mac) |
1410 | return vp; |
1411 | } |
1412 | |
1413 | +static void vnet_cleanup(void) |
1414 | +{ |
1415 | + struct vnet *vp; |
1416 | + struct net_device *dev; |
1417 | + |
1418 | + mutex_lock(&vnet_list_mutex); |
1419 | + while (!list_empty(&vnet_list)) { |
1420 | + vp = list_first_entry(&vnet_list, struct vnet, list); |
1421 | + list_del(&vp->list); |
1422 | + dev = vp->dev; |
1423 | + /* vio_unregister_driver() should have cleaned up port_list */ |
1424 | + BUG_ON(!list_empty(&vp->port_list)); |
1425 | + unregister_netdev(dev); |
1426 | + free_netdev(dev); |
1427 | + } |
1428 | + mutex_unlock(&vnet_list_mutex); |
1429 | +} |
1430 | + |
1431 | static const char *local_mac_prop = "local-mac-address"; |
1432 | |
1433 | static struct vnet *vnet_find_parent(struct mdesc_handle *hp, |
1434 | @@ -1240,7 +1258,6 @@ static int vnet_port_remove(struct vio_dev *vdev) |
1435 | |
1436 | kfree(port); |
1437 | |
1438 | - unregister_netdev(vp->dev); |
1439 | } |
1440 | return 0; |
1441 | } |
1442 | @@ -1268,6 +1285,7 @@ static int __init vnet_init(void) |
1443 | static void __exit vnet_exit(void) |
1444 | { |
1445 | vio_unregister_driver(&vnet_port_driver); |
1446 | + vnet_cleanup(); |
1447 | } |
1448 | |
1449 | module_init(vnet_init); |
1450 | diff --git a/drivers/net/ethernet/ti/cpsw.c b/drivers/net/ethernet/ti/cpsw.c |
1451 | index c331b7ebc812..80d75ee60da8 100644 |
1452 | --- a/drivers/net/ethernet/ti/cpsw.c |
1453 | +++ b/drivers/net/ethernet/ti/cpsw.c |
1454 | @@ -1201,7 +1201,12 @@ static int cpsw_ndo_open(struct net_device *ndev) |
1455 | for_each_slave(priv, cpsw_slave_open, priv); |
1456 | |
1457 | /* Add default VLAN */ |
1458 | - cpsw_add_default_vlan(priv); |
1459 | + if (!priv->data.dual_emac) |
1460 | + cpsw_add_default_vlan(priv); |
1461 | + else |
1462 | + cpsw_ale_add_vlan(priv->ale, priv->data.default_vlan, |
1463 | + ALE_ALL_PORTS << priv->host_port, |
1464 | + ALE_ALL_PORTS << priv->host_port, 0, 0); |
1465 | |
1466 | if (!cpsw_common_res_usage_state(priv)) { |
1467 | /* setup tx dma to fixed prio and zero offset */ |
1468 | diff --git a/drivers/net/ppp/ppp_generic.c b/drivers/net/ppp/ppp_generic.c |
1469 | index e3923ebb693f..3c41a83a1572 100644 |
1470 | --- a/drivers/net/ppp/ppp_generic.c |
1471 | +++ b/drivers/net/ppp/ppp_generic.c |
1472 | @@ -539,7 +539,7 @@ static int get_filter(void __user *arg, struct sock_filter **p) |
1473 | { |
1474 | struct sock_fprog uprog; |
1475 | struct sock_filter *code = NULL; |
1476 | - int len, err; |
1477 | + int len; |
1478 | |
1479 | if (copy_from_user(&uprog, arg, sizeof(uprog))) |
1480 | return -EFAULT; |
1481 | @@ -554,12 +554,6 @@ static int get_filter(void __user *arg, struct sock_filter **p) |
1482 | if (IS_ERR(code)) |
1483 | return PTR_ERR(code); |
1484 | |
1485 | - err = sk_chk_filter(code, uprog.len); |
1486 | - if (err) { |
1487 | - kfree(code); |
1488 | - return err; |
1489 | - } |
1490 | - |
1491 | *p = code; |
1492 | return uprog.len; |
1493 | } |
1494 | @@ -763,10 +757,15 @@ static long ppp_ioctl(struct file *file, unsigned int cmd, unsigned long arg) |
1495 | }; |
1496 | |
1497 | ppp_lock(ppp); |
1498 | - if (ppp->pass_filter) |
1499 | + if (ppp->pass_filter) { |
1500 | sk_unattached_filter_destroy(ppp->pass_filter); |
1501 | - err = sk_unattached_filter_create(&ppp->pass_filter, |
1502 | - &fprog); |
1503 | + ppp->pass_filter = NULL; |
1504 | + } |
1505 | + if (fprog.filter != NULL) |
1506 | + err = sk_unattached_filter_create(&ppp->pass_filter, |
1507 | + &fprog); |
1508 | + else |
1509 | + err = 0; |
1510 | kfree(code); |
1511 | ppp_unlock(ppp); |
1512 | } |
1513 | @@ -784,10 +783,15 @@ static long ppp_ioctl(struct file *file, unsigned int cmd, unsigned long arg) |
1514 | }; |
1515 | |
1516 | ppp_lock(ppp); |
1517 | - if (ppp->active_filter) |
1518 | + if (ppp->active_filter) { |
1519 | sk_unattached_filter_destroy(ppp->active_filter); |
1520 | - err = sk_unattached_filter_create(&ppp->active_filter, |
1521 | - &fprog); |
1522 | + ppp->active_filter = NULL; |
1523 | + } |
1524 | + if (fprog.filter != NULL) |
1525 | + err = sk_unattached_filter_create(&ppp->active_filter, |
1526 | + &fprog); |
1527 | + else |
1528 | + err = 0; |
1529 | kfree(code); |
1530 | ppp_unlock(ppp); |
1531 | } |
1532 | diff --git a/drivers/net/ppp/pppoe.c b/drivers/net/ppp/pppoe.c |
1533 | index 2ea7efd11857..6c9c16d76935 100644 |
1534 | --- a/drivers/net/ppp/pppoe.c |
1535 | +++ b/drivers/net/ppp/pppoe.c |
1536 | @@ -675,7 +675,7 @@ static int pppoe_connect(struct socket *sock, struct sockaddr *uservaddr, |
1537 | po->chan.hdrlen = (sizeof(struct pppoe_hdr) + |
1538 | dev->hard_header_len); |
1539 | |
1540 | - po->chan.mtu = dev->mtu - sizeof(struct pppoe_hdr); |
1541 | + po->chan.mtu = dev->mtu - sizeof(struct pppoe_hdr) - 2; |
1542 | po->chan.private = sk; |
1543 | po->chan.ops = &pppoe_chan_ops; |
1544 | |
1545 | diff --git a/drivers/net/slip/slip.c b/drivers/net/slip/slip.c |
1546 | index ad4a94e9ff57..87526443841f 100644 |
1547 | --- a/drivers/net/slip/slip.c |
1548 | +++ b/drivers/net/slip/slip.c |
1549 | @@ -83,6 +83,7 @@ |
1550 | #include <linux/delay.h> |
1551 | #include <linux/init.h> |
1552 | #include <linux/slab.h> |
1553 | +#include <linux/workqueue.h> |
1554 | #include "slip.h" |
1555 | #ifdef CONFIG_INET |
1556 | #include <linux/ip.h> |
1557 | @@ -416,36 +417,46 @@ static void sl_encaps(struct slip *sl, unsigned char *icp, int len) |
1558 | #endif |
1559 | } |
1560 | |
1561 | -/* |
1562 | - * Called by the driver when there's room for more data. If we have |
1563 | - * more packets to send, we send them here. |
1564 | - */ |
1565 | -static void slip_write_wakeup(struct tty_struct *tty) |
1566 | +/* Write out any remaining transmit buffer. Scheduled when tty is writable */ |
1567 | +static void slip_transmit(struct work_struct *work) |
1568 | { |
1569 | + struct slip *sl = container_of(work, struct slip, tx_work); |
1570 | int actual; |
1571 | - struct slip *sl = tty->disc_data; |
1572 | |
1573 | + spin_lock_bh(&sl->lock); |
1574 | /* First make sure we're connected. */ |
1575 | - if (!sl || sl->magic != SLIP_MAGIC || !netif_running(sl->dev)) |
1576 | + if (!sl->tty || sl->magic != SLIP_MAGIC || !netif_running(sl->dev)) { |
1577 | + spin_unlock_bh(&sl->lock); |
1578 | return; |
1579 | + } |
1580 | |
1581 | - spin_lock_bh(&sl->lock); |
1582 | if (sl->xleft <= 0) { |
1583 | /* Now serial buffer is almost free & we can start |
1584 | * transmission of another packet */ |
1585 | sl->dev->stats.tx_packets++; |
1586 | - clear_bit(TTY_DO_WRITE_WAKEUP, &tty->flags); |
1587 | + clear_bit(TTY_DO_WRITE_WAKEUP, &sl->tty->flags); |
1588 | spin_unlock_bh(&sl->lock); |
1589 | sl_unlock(sl); |
1590 | return; |
1591 | } |
1592 | |
1593 | - actual = tty->ops->write(tty, sl->xhead, sl->xleft); |
1594 | + actual = sl->tty->ops->write(sl->tty, sl->xhead, sl->xleft); |
1595 | sl->xleft -= actual; |
1596 | sl->xhead += actual; |
1597 | spin_unlock_bh(&sl->lock); |
1598 | } |
1599 | |
1600 | +/* |
1601 | + * Called by the driver when there's room for more data. |
1602 | + * Schedule the transmit. |
1603 | + */ |
1604 | +static void slip_write_wakeup(struct tty_struct *tty) |
1605 | +{ |
1606 | + struct slip *sl = tty->disc_data; |
1607 | + |
1608 | + schedule_work(&sl->tx_work); |
1609 | +} |
1610 | + |
1611 | static void sl_tx_timeout(struct net_device *dev) |
1612 | { |
1613 | struct slip *sl = netdev_priv(dev); |
1614 | @@ -749,6 +760,7 @@ static struct slip *sl_alloc(dev_t line) |
1615 | sl->magic = SLIP_MAGIC; |
1616 | sl->dev = dev; |
1617 | spin_lock_init(&sl->lock); |
1618 | + INIT_WORK(&sl->tx_work, slip_transmit); |
1619 | sl->mode = SL_MODE_DEFAULT; |
1620 | #ifdef CONFIG_SLIP_SMART |
1621 | /* initialize timer_list struct */ |
1622 | @@ -872,8 +884,12 @@ static void slip_close(struct tty_struct *tty) |
1623 | if (!sl || sl->magic != SLIP_MAGIC || sl->tty != tty) |
1624 | return; |
1625 | |
1626 | + spin_lock_bh(&sl->lock); |
1627 | tty->disc_data = NULL; |
1628 | sl->tty = NULL; |
1629 | + spin_unlock_bh(&sl->lock); |
1630 | + |
1631 | + flush_work(&sl->tx_work); |
1632 | |
1633 | /* VSV = very important to remove timers */ |
1634 | #ifdef CONFIG_SLIP_SMART |
1635 | diff --git a/drivers/net/slip/slip.h b/drivers/net/slip/slip.h |
1636 | index 67673cf1266b..cf32aadf508f 100644 |
1637 | --- a/drivers/net/slip/slip.h |
1638 | +++ b/drivers/net/slip/slip.h |
1639 | @@ -53,6 +53,7 @@ struct slip { |
1640 | struct tty_struct *tty; /* ptr to TTY structure */ |
1641 | struct net_device *dev; /* easy for intr handling */ |
1642 | spinlock_t lock; |
1643 | + struct work_struct tx_work; /* Flushes transmit buffer */ |
1644 | |
1645 | #ifdef SL_INCLUDE_CSLIP |
1646 | struct slcompress *slcomp; /* for header compression */ |
1647 | diff --git a/drivers/net/usb/huawei_cdc_ncm.c b/drivers/net/usb/huawei_cdc_ncm.c |
1648 | index 312178d7b698..a01462523bc7 100644 |
1649 | --- a/drivers/net/usb/huawei_cdc_ncm.c |
1650 | +++ b/drivers/net/usb/huawei_cdc_ncm.c |
1651 | @@ -84,12 +84,13 @@ static int huawei_cdc_ncm_bind(struct usbnet *usbnet_dev, |
1652 | ctx = drvstate->ctx; |
1653 | |
1654 | if (usbnet_dev->status) |
1655 | - /* CDC-WMC r1.1 requires wMaxCommand to be "at least 256 |
1656 | - * decimal (0x100)" |
1657 | + /* The wMaxCommand buffer must be big enough to hold |
1658 | + * any message from the modem. Experience has shown |
1659 | + * that some replies are more than 256 bytes long |
1660 | */ |
1661 | subdriver = usb_cdc_wdm_register(ctx->control, |
1662 | &usbnet_dev->status->desc, |
1663 | - 256, /* wMaxCommand */ |
1664 | + 1024, /* wMaxCommand */ |
1665 | huawei_cdc_ncm_wdm_manage_power); |
1666 | if (IS_ERR(subdriver)) { |
1667 | ret = PTR_ERR(subdriver); |
1668 | @@ -206,6 +207,9 @@ static const struct usb_device_id huawei_cdc_ncm_devs[] = { |
1669 | { USB_VENDOR_AND_INTERFACE_INFO(0x12d1, 0xff, 0x02, 0x76), |
1670 | .driver_info = (unsigned long)&huawei_cdc_ncm_info, |
1671 | }, |
1672 | + { USB_VENDOR_AND_INTERFACE_INFO(0x12d1, 0xff, 0x03, 0x16), |
1673 | + .driver_info = (unsigned long)&huawei_cdc_ncm_info, |
1674 | + }, |
1675 | |
1676 | /* Terminating entry */ |
1677 | { |
1678 | diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c |
1679 | index cf62d7e8329f..22756db53dca 100644 |
1680 | --- a/drivers/net/usb/qmi_wwan.c |
1681 | +++ b/drivers/net/usb/qmi_wwan.c |
1682 | @@ -667,6 +667,7 @@ static const struct usb_device_id products[] = { |
1683 | {QMI_FIXED_INTF(0x05c6, 0x9084, 4)}, |
1684 | {QMI_FIXED_INTF(0x05c6, 0x920d, 0)}, |
1685 | {QMI_FIXED_INTF(0x05c6, 0x920d, 5)}, |
1686 | + {QMI_FIXED_INTF(0x0846, 0x68a2, 8)}, |
1687 | {QMI_FIXED_INTF(0x12d1, 0x140c, 1)}, /* Huawei E173 */ |
1688 | {QMI_FIXED_INTF(0x12d1, 0x14ac, 1)}, /* Huawei E1820 */ |
1689 | {QMI_FIXED_INTF(0x16d8, 0x6003, 0)}, /* CMOTech 6003 */ |
1690 | @@ -741,6 +742,7 @@ static const struct usb_device_id products[] = { |
1691 | {QMI_FIXED_INTF(0x19d2, 0x1424, 2)}, |
1692 | {QMI_FIXED_INTF(0x19d2, 0x1425, 2)}, |
1693 | {QMI_FIXED_INTF(0x19d2, 0x1426, 2)}, /* ZTE MF91 */ |
1694 | + {QMI_FIXED_INTF(0x19d2, 0x1428, 2)}, /* Telewell TW-LTE 4G v2 */ |
1695 | {QMI_FIXED_INTF(0x19d2, 0x2002, 4)}, /* ZTE (Vodafone) K3765-Z */ |
1696 | {QMI_FIXED_INTF(0x0f3d, 0x68a2, 8)}, /* Sierra Wireless MC7700 */ |
1697 | {QMI_FIXED_INTF(0x114f, 0x68a2, 8)}, /* Sierra Wireless MC7750 */ |
1698 | @@ -756,6 +758,7 @@ static const struct usb_device_id products[] = { |
1699 | {QMI_FIXED_INTF(0x1199, 0x9054, 8)}, /* Sierra Wireless Modem */ |
1700 | {QMI_FIXED_INTF(0x1199, 0x9055, 8)}, /* Netgear AirCard 341U */ |
1701 | {QMI_FIXED_INTF(0x1199, 0x9056, 8)}, /* Sierra Wireless Modem */ |
1702 | + {QMI_FIXED_INTF(0x1199, 0x9057, 8)}, |
1703 | {QMI_FIXED_INTF(0x1199, 0x9061, 8)}, /* Sierra Wireless Modem */ |
1704 | {QMI_FIXED_INTF(0x1bbb, 0x011e, 4)}, /* Telekom Speedstick LTE II (Alcatel One Touch L100V LTE) */ |
1705 | {QMI_FIXED_INTF(0x1bbb, 0x0203, 2)}, /* Alcatel L800MA */ |
1706 | diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c |
1707 | index 3fbfb0869030..d2c007098a3b 100644 |
1708 | --- a/drivers/net/usb/r8152.c |
1709 | +++ b/drivers/net/usb/r8152.c |
1710 | @@ -1361,7 +1361,7 @@ static void r8152_csum_workaround(struct r8152 *tp, struct sk_buff *skb, |
1711 | struct sk_buff_head seg_list; |
1712 | struct sk_buff *segs, *nskb; |
1713 | |
1714 | - features &= ~(NETIF_F_IP_CSUM | NETIF_F_SG | NETIF_F_TSO); |
1715 | + features &= ~(NETIF_F_SG | NETIF_F_IPV6_CSUM | NETIF_F_TSO6); |
1716 | segs = skb_gso_segment(skb, features); |
1717 | if (IS_ERR(segs) || !segs) |
1718 | goto drop; |
1719 | diff --git a/drivers/net/wireless/iwlwifi/dvm/rxon.c b/drivers/net/wireless/iwlwifi/dvm/rxon.c |
1720 | index 503a81e58185..c1e311341b74 100644 |
1721 | --- a/drivers/net/wireless/iwlwifi/dvm/rxon.c |
1722 | +++ b/drivers/net/wireless/iwlwifi/dvm/rxon.c |
1723 | @@ -1068,13 +1068,6 @@ int iwlagn_commit_rxon(struct iwl_priv *priv, struct iwl_rxon_context *ctx) |
1724 | /* recalculate basic rates */ |
1725 | iwl_calc_basic_rates(priv, ctx); |
1726 | |
1727 | - /* |
1728 | - * force CTS-to-self frames protection if RTS-CTS is not preferred |
1729 | - * one aggregation protection method |
1730 | - */ |
1731 | - if (!priv->hw_params.use_rts_for_aggregation) |
1732 | - ctx->staging.flags |= RXON_FLG_SELF_CTS_EN; |
1733 | - |
1734 | if ((ctx->vif && ctx->vif->bss_conf.use_short_slot) || |
1735 | !(ctx->staging.flags & RXON_FLG_BAND_24G_MSK)) |
1736 | ctx->staging.flags |= RXON_FLG_SHORT_SLOT_MSK; |
1737 | @@ -1480,11 +1473,6 @@ void iwlagn_bss_info_changed(struct ieee80211_hw *hw, |
1738 | else |
1739 | ctx->staging.flags &= ~RXON_FLG_TGG_PROTECT_MSK; |
1740 | |
1741 | - if (bss_conf->use_cts_prot) |
1742 | - ctx->staging.flags |= RXON_FLG_SELF_CTS_EN; |
1743 | - else |
1744 | - ctx->staging.flags &= ~RXON_FLG_SELF_CTS_EN; |
1745 | - |
1746 | memcpy(ctx->staging.bssid_addr, bss_conf->bssid, ETH_ALEN); |
1747 | |
1748 | if (vif->type == NL80211_IFTYPE_AP || |
1749 | diff --git a/drivers/net/wireless/iwlwifi/mvm/mac-ctxt.c b/drivers/net/wireless/iwlwifi/mvm/mac-ctxt.c |
1750 | index 9ccec10bba16..c3c8194d85b5 100644 |
1751 | --- a/drivers/net/wireless/iwlwifi/mvm/mac-ctxt.c |
1752 | +++ b/drivers/net/wireless/iwlwifi/mvm/mac-ctxt.c |
1753 | @@ -667,13 +667,9 @@ static void iwl_mvm_mac_ctxt_cmd_common(struct iwl_mvm *mvm, |
1754 | if (vif->bss_conf.qos) |
1755 | cmd->qos_flags |= cpu_to_le32(MAC_QOS_FLG_UPDATE_EDCA); |
1756 | |
1757 | - /* Don't use cts to self as the fw doesn't support it currently. */ |
1758 | - if (vif->bss_conf.use_cts_prot) { |
1759 | + if (vif->bss_conf.use_cts_prot) |
1760 | cmd->protection_flags |= cpu_to_le32(MAC_PROT_FLG_TGG_PROTECT); |
1761 | - if (IWL_UCODE_API(mvm->fw->ucode_ver) >= 8) |
1762 | - cmd->protection_flags |= |
1763 | - cpu_to_le32(MAC_PROT_FLG_SELF_CTS_EN); |
1764 | - } |
1765 | + |
1766 | IWL_DEBUG_RATE(mvm, "use_cts_prot %d, ht_operation_mode %d\n", |
1767 | vif->bss_conf.use_cts_prot, |
1768 | vif->bss_conf.ht_operation_mode); |
1769 | diff --git a/drivers/net/wireless/iwlwifi/pcie/drv.c b/drivers/net/wireless/iwlwifi/pcie/drv.c |
1770 | index 3d1d57f9f5bc..087cb618521c 100644 |
1771 | --- a/drivers/net/wireless/iwlwifi/pcie/drv.c |
1772 | +++ b/drivers/net/wireless/iwlwifi/pcie/drv.c |
1773 | @@ -367,6 +367,7 @@ static DEFINE_PCI_DEVICE_TABLE(iwl_hw_card_ids) = { |
1774 | {IWL_PCI_DEVICE(0x095A, 0x5012, iwl7265_2ac_cfg)}, |
1775 | {IWL_PCI_DEVICE(0x095A, 0x5412, iwl7265_2ac_cfg)}, |
1776 | {IWL_PCI_DEVICE(0x095A, 0x5410, iwl7265_2ac_cfg)}, |
1777 | + {IWL_PCI_DEVICE(0x095A, 0x5510, iwl7265_2ac_cfg)}, |
1778 | {IWL_PCI_DEVICE(0x095A, 0x5400, iwl7265_2ac_cfg)}, |
1779 | {IWL_PCI_DEVICE(0x095A, 0x1010, iwl7265_2ac_cfg)}, |
1780 | {IWL_PCI_DEVICE(0x095A, 0x5000, iwl7265_2n_cfg)}, |
1781 | @@ -380,7 +381,7 @@ static DEFINE_PCI_DEVICE_TABLE(iwl_hw_card_ids) = { |
1782 | {IWL_PCI_DEVICE(0x095A, 0x9110, iwl7265_2ac_cfg)}, |
1783 | {IWL_PCI_DEVICE(0x095A, 0x9112, iwl7265_2ac_cfg)}, |
1784 | {IWL_PCI_DEVICE(0x095A, 0x9210, iwl7265_2ac_cfg)}, |
1785 | - {IWL_PCI_DEVICE(0x095A, 0x9200, iwl7265_2ac_cfg)}, |
1786 | + {IWL_PCI_DEVICE(0x095B, 0x9200, iwl7265_2ac_cfg)}, |
1787 | {IWL_PCI_DEVICE(0x095A, 0x9510, iwl7265_2ac_cfg)}, |
1788 | {IWL_PCI_DEVICE(0x095A, 0x9310, iwl7265_2ac_cfg)}, |
1789 | {IWL_PCI_DEVICE(0x095A, 0x9410, iwl7265_2ac_cfg)}, |
1790 | diff --git a/drivers/net/wireless/mwifiex/main.c b/drivers/net/wireless/mwifiex/main.c |
1791 | index 9c771b3e9918..6ffbe87aecc0 100644 |
1792 | --- a/drivers/net/wireless/mwifiex/main.c |
1793 | +++ b/drivers/net/wireless/mwifiex/main.c |
1794 | @@ -647,6 +647,7 @@ mwifiex_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) |
1795 | } |
1796 | |
1797 | tx_info = MWIFIEX_SKB_TXCB(skb); |
1798 | + memset(tx_info, 0, sizeof(*tx_info)); |
1799 | tx_info->bss_num = priv->bss_num; |
1800 | tx_info->bss_type = priv->bss_type; |
1801 | tx_info->pkt_len = skb->len; |
1802 | diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c |
1803 | index 7367208ee8cd..034645a2978f 100644 |
1804 | --- a/drivers/net/xen-netback/netback.c |
1805 | +++ b/drivers/net/xen-netback/netback.c |
1806 | @@ -1007,14 +1007,21 @@ static int xenvif_tx_check_gop(struct xenvif *vif, |
1807 | { |
1808 | struct gnttab_map_grant_ref *gop_map = *gopp_map; |
1809 | u16 pending_idx = XENVIF_TX_CB(skb)->pending_idx; |
1810 | + /* This always points to the shinfo of the skb being checked, which |
1811 | + * could be either the first or the one on the frag_list |
1812 | + */ |
1813 | struct skb_shared_info *shinfo = skb_shinfo(skb); |
1814 | + /* If this is non-NULL, we are currently checking the frag_list skb, and |
1815 | + * this points to the shinfo of the first one |
1816 | + */ |
1817 | + struct skb_shared_info *first_shinfo = NULL; |
1818 | int nr_frags = shinfo->nr_frags; |
1819 | + const bool sharedslot = nr_frags && |
1820 | + frag_get_pending_idx(&shinfo->frags[0]) == pending_idx; |
1821 | int i, err; |
1822 | - struct sk_buff *first_skb = NULL; |
1823 | |
1824 | /* Check status of header. */ |
1825 | err = (*gopp_copy)->status; |
1826 | - (*gopp_copy)++; |
1827 | if (unlikely(err)) { |
1828 | if (net_ratelimit()) |
1829 | netdev_dbg(vif->dev, |
1830 | @@ -1022,8 +1029,12 @@ static int xenvif_tx_check_gop(struct xenvif *vif, |
1831 | (*gopp_copy)->status, |
1832 | pending_idx, |
1833 | (*gopp_copy)->source.u.ref); |
1834 | - xenvif_idx_release(vif, pending_idx, XEN_NETIF_RSP_ERROR); |
1835 | + /* The first frag might still have this slot mapped */ |
1836 | + if (!sharedslot) |
1837 | + xenvif_idx_release(vif, pending_idx, |
1838 | + XEN_NETIF_RSP_ERROR); |
1839 | } |
1840 | + (*gopp_copy)++; |
1841 | |
1842 | check_frags: |
1843 | for (i = 0; i < nr_frags; i++, gop_map++) { |
1844 | @@ -1039,8 +1050,19 @@ check_frags: |
1845 | pending_idx, |
1846 | gop_map->handle); |
1847 | /* Had a previous error? Invalidate this fragment. */ |
1848 | - if (unlikely(err)) |
1849 | + if (unlikely(err)) { |
1850 | xenvif_idx_unmap(vif, pending_idx); |
1851 | + /* If the mapping of the first frag was OK, but |
1852 | + * the header's copy failed, and they are |
1853 | + * sharing a slot, send an error |
1854 | + */ |
1855 | + if (i == 0 && sharedslot) |
1856 | + xenvif_idx_release(vif, pending_idx, |
1857 | + XEN_NETIF_RSP_ERROR); |
1858 | + else |
1859 | + xenvif_idx_release(vif, pending_idx, |
1860 | + XEN_NETIF_RSP_OKAY); |
1861 | + } |
1862 | continue; |
1863 | } |
1864 | |
1865 | @@ -1052,42 +1074,53 @@ check_frags: |
1866 | gop_map->status, |
1867 | pending_idx, |
1868 | gop_map->ref); |
1869 | + |
1870 | xenvif_idx_release(vif, pending_idx, XEN_NETIF_RSP_ERROR); |
1871 | |
1872 | /* Not the first error? Preceding frags already invalidated. */ |
1873 | if (err) |
1874 | continue; |
1875 | - /* First error: invalidate preceding fragments. */ |
1876 | + |
1877 | + /* First error: if the header haven't shared a slot with the |
1878 | + * first frag, release it as well. |
1879 | + */ |
1880 | + if (!sharedslot) |
1881 | + xenvif_idx_release(vif, |
1882 | + XENVIF_TX_CB(skb)->pending_idx, |
1883 | + XEN_NETIF_RSP_OKAY); |
1884 | + |
1885 | + /* Invalidate preceding fragments of this skb. */ |
1886 | for (j = 0; j < i; j++) { |
1887 | pending_idx = frag_get_pending_idx(&shinfo->frags[j]); |
1888 | xenvif_idx_unmap(vif, pending_idx); |
1889 | + xenvif_idx_release(vif, pending_idx, |
1890 | + XEN_NETIF_RSP_OKAY); |
1891 | + } |
1892 | + |
1893 | + /* And if we found the error while checking the frag_list, unmap |
1894 | + * the first skb's frags |
1895 | + */ |
1896 | + if (first_shinfo) { |
1897 | + for (j = 0; j < first_shinfo->nr_frags; j++) { |
1898 | + pending_idx = frag_get_pending_idx(&first_shinfo->frags[j]); |
1899 | + xenvif_idx_unmap(vif, pending_idx); |
1900 | + xenvif_idx_release(vif, pending_idx, |
1901 | + XEN_NETIF_RSP_OKAY); |
1902 | + } |
1903 | } |
1904 | |
1905 | /* Remember the error: invalidate all subsequent fragments. */ |
1906 | err = newerr; |
1907 | } |
1908 | |
1909 | - if (skb_has_frag_list(skb)) { |
1910 | - first_skb = skb; |
1911 | - skb = shinfo->frag_list; |
1912 | - shinfo = skb_shinfo(skb); |
1913 | + if (skb_has_frag_list(skb) && !first_shinfo) { |
1914 | + first_shinfo = skb_shinfo(skb); |
1915 | + shinfo = skb_shinfo(skb_shinfo(skb)->frag_list); |
1916 | nr_frags = shinfo->nr_frags; |
1917 | |
1918 | goto check_frags; |
1919 | } |
1920 | |
1921 | - /* There was a mapping error in the frag_list skb. We have to unmap |
1922 | - * the first skb's frags |
1923 | - */ |
1924 | - if (first_skb && err) { |
1925 | - int j; |
1926 | - shinfo = skb_shinfo(first_skb); |
1927 | - for (j = 0; j < shinfo->nr_frags; j++) { |
1928 | - pending_idx = frag_get_pending_idx(&shinfo->frags[j]); |
1929 | - xenvif_idx_unmap(vif, pending_idx); |
1930 | - } |
1931 | - } |
1932 | - |
1933 | *gopp_map = gop_map; |
1934 | return err; |
1935 | } |
1936 | @@ -1495,7 +1528,16 @@ static int xenvif_tx_submit(struct xenvif *vif) |
1937 | |
1938 | /* Check the remap error code. */ |
1939 | if (unlikely(xenvif_tx_check_gop(vif, skb, &gop_map, &gop_copy))) { |
1940 | + /* If there was an error, xenvif_tx_check_gop is |
1941 | + * expected to release all the frags which were mapped, |
1942 | + * so kfree_skb shouldn't do it again |
1943 | + */ |
1944 | skb_shinfo(skb)->nr_frags = 0; |
1945 | + if (skb_has_frag_list(skb)) { |
1946 | + struct sk_buff *nskb = |
1947 | + skb_shinfo(skb)->frag_list; |
1948 | + skb_shinfo(nskb)->nr_frags = 0; |
1949 | + } |
1950 | kfree_skb(skb); |
1951 | continue; |
1952 | } |
1953 | @@ -1799,8 +1841,6 @@ void xenvif_idx_unmap(struct xenvif *vif, u16 pending_idx) |
1954 | tx_unmap_op.status); |
1955 | BUG(); |
1956 | } |
1957 | - |
1958 | - xenvif_idx_release(vif, pending_idx, XEN_NETIF_RSP_OKAY); |
1959 | } |
1960 | |
1961 | static inline int rx_work_todo(struct xenvif *vif) |
1962 | diff --git a/drivers/usb/chipidea/udc.c b/drivers/usb/chipidea/udc.c |
1963 | index 482c45b777d3..9d13da48ebe1 100644 |
1964 | --- a/drivers/usb/chipidea/udc.c |
1965 | +++ b/drivers/usb/chipidea/udc.c |
1966 | @@ -1176,8 +1176,8 @@ static int ep_enable(struct usb_ep *ep, |
1967 | |
1968 | if (hwep->type == USB_ENDPOINT_XFER_CONTROL) |
1969 | cap |= QH_IOS; |
1970 | - if (hwep->num) |
1971 | - cap |= QH_ZLT; |
1972 | + |
1973 | + cap |= QH_ZLT; |
1974 | cap |= (hwep->ep.maxpacket << __ffs(QH_MAX_PKT)) & QH_MAX_PKT; |
1975 | /* |
1976 | * For ISO-TX, we set mult at QH as the largest value, and use |
1977 | diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c |
1978 | index 229a73f64304..00c4b96b4e4f 100644 |
1979 | --- a/drivers/usb/core/hub.c |
1980 | +++ b/drivers/usb/core/hub.c |
1981 | @@ -893,6 +893,25 @@ static int hub_usb3_port_disable(struct usb_hub *hub, int port1) |
1982 | if (!hub_is_superspeed(hub->hdev)) |
1983 | return -EINVAL; |
1984 | |
1985 | + ret = hub_port_status(hub, port1, &portstatus, &portchange); |
1986 | + if (ret < 0) |
1987 | + return ret; |
1988 | + |
1989 | + /* |
1990 | + * USB controller Advanced Micro Devices, Inc. [AMD] FCH USB XHCI |
1991 | + * Controller [1022:7814] will have spurious result making the following |
1992 | + * usb 3.0 device hotplugging route to the 2.0 root hub and recognized |
1993 | + * as high-speed device if we set the usb 3.0 port link state to |
1994 | + * Disabled. Since it's already in USB_SS_PORT_LS_RX_DETECT state, we |
1995 | + * check the state here to avoid the bug. |
1996 | + */ |
1997 | + if ((portstatus & USB_PORT_STAT_LINK_STATE) == |
1998 | + USB_SS_PORT_LS_RX_DETECT) { |
1999 | + dev_dbg(&hub->ports[port1 - 1]->dev, |
2000 | + "Not disabling port; link state is RxDetect\n"); |
2001 | + return ret; |
2002 | + } |
2003 | + |
2004 | ret = hub_set_port_link_state(hub, port1, USB_SS_PORT_LS_SS_DISABLED); |
2005 | if (ret) |
2006 | return ret; |
2007 | diff --git a/drivers/xen/balloon.c b/drivers/xen/balloon.c |
2008 | index b7a506f2bb14..5c660c77f03b 100644 |
2009 | --- a/drivers/xen/balloon.c |
2010 | +++ b/drivers/xen/balloon.c |
2011 | @@ -426,20 +426,18 @@ static enum bp_state decrease_reservation(unsigned long nr_pages, gfp_t gfp) |
2012 | * p2m are consistent. |
2013 | */ |
2014 | if (!xen_feature(XENFEAT_auto_translated_physmap)) { |
2015 | - unsigned long p; |
2016 | - struct page *scratch_page = get_balloon_scratch_page(); |
2017 | - |
2018 | if (!PageHighMem(page)) { |
2019 | + struct page *scratch_page = get_balloon_scratch_page(); |
2020 | + |
2021 | ret = HYPERVISOR_update_va_mapping( |
2022 | (unsigned long)__va(pfn << PAGE_SHIFT), |
2023 | pfn_pte(page_to_pfn(scratch_page), |
2024 | PAGE_KERNEL_RO), 0); |
2025 | BUG_ON(ret); |
2026 | - } |
2027 | - p = page_to_pfn(scratch_page); |
2028 | - __set_phys_to_machine(pfn, pfn_to_mfn(p)); |
2029 | |
2030 | - put_balloon_scratch_page(); |
2031 | + put_balloon_scratch_page(); |
2032 | + } |
2033 | + __set_phys_to_machine(pfn, INVALID_P2M_ENTRY); |
2034 | } |
2035 | #endif |
2036 | |
2037 | diff --git a/drivers/xen/manage.c b/drivers/xen/manage.c |
2038 | index 32f9236c959f..8684e0e4d41b 100644 |
2039 | --- a/drivers/xen/manage.c |
2040 | +++ b/drivers/xen/manage.c |
2041 | @@ -109,7 +109,6 @@ static int xen_suspend(void *data) |
2042 | |
2043 | if (!si->cancelled) { |
2044 | xen_irq_resume(); |
2045 | - xen_console_resume(); |
2046 | xen_timer_resume(); |
2047 | } |
2048 | |
2049 | @@ -166,6 +165,10 @@ static void do_suspend(void) |
2050 | |
2051 | err = stop_machine(xen_suspend, &si, cpumask_of(0)); |
2052 | |
2053 | + /* Resume console as early as possible. */ |
2054 | + if (!si.cancelled) |
2055 | + xen_console_resume(); |
2056 | + |
2057 | raw_notifier_call_chain(&xen_resume_notifier, 0, NULL); |
2058 | |
2059 | dpm_resume_start(si.cancelled ? PMSG_THAW : PMSG_RESTORE); |
2060 | diff --git a/fs/aio.c b/fs/aio.c |
2061 | index e609e15f36b9..6d68e01dc7ca 100644 |
2062 | --- a/fs/aio.c |
2063 | +++ b/fs/aio.c |
2064 | @@ -830,16 +830,20 @@ void exit_aio(struct mm_struct *mm) |
2065 | static void put_reqs_available(struct kioctx *ctx, unsigned nr) |
2066 | { |
2067 | struct kioctx_cpu *kcpu; |
2068 | + unsigned long flags; |
2069 | |
2070 | preempt_disable(); |
2071 | kcpu = this_cpu_ptr(ctx->cpu); |
2072 | |
2073 | + local_irq_save(flags); |
2074 | kcpu->reqs_available += nr; |
2075 | + |
2076 | while (kcpu->reqs_available >= ctx->req_batch * 2) { |
2077 | kcpu->reqs_available -= ctx->req_batch; |
2078 | atomic_add(ctx->req_batch, &ctx->reqs_available); |
2079 | } |
2080 | |
2081 | + local_irq_restore(flags); |
2082 | preempt_enable(); |
2083 | } |
2084 | |
2085 | @@ -847,10 +851,12 @@ static bool get_reqs_available(struct kioctx *ctx) |
2086 | { |
2087 | struct kioctx_cpu *kcpu; |
2088 | bool ret = false; |
2089 | + unsigned long flags; |
2090 | |
2091 | preempt_disable(); |
2092 | kcpu = this_cpu_ptr(ctx->cpu); |
2093 | |
2094 | + local_irq_save(flags); |
2095 | if (!kcpu->reqs_available) { |
2096 | int old, avail = atomic_read(&ctx->reqs_available); |
2097 | |
2098 | @@ -869,6 +875,7 @@ static bool get_reqs_available(struct kioctx *ctx) |
2099 | ret = true; |
2100 | kcpu->reqs_available--; |
2101 | out: |
2102 | + local_irq_restore(flags); |
2103 | preempt_enable(); |
2104 | return ret; |
2105 | } |
2106 | diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c |
2107 | index aac71ce373e4..75fa055012b2 100644 |
2108 | --- a/fs/fuse/dev.c |
2109 | +++ b/fs/fuse/dev.c |
2110 | @@ -643,9 +643,8 @@ struct fuse_copy_state { |
2111 | unsigned long seglen; |
2112 | unsigned long addr; |
2113 | struct page *pg; |
2114 | - void *mapaddr; |
2115 | - void *buf; |
2116 | unsigned len; |
2117 | + unsigned offset; |
2118 | unsigned move_pages:1; |
2119 | }; |
2120 | |
2121 | @@ -666,23 +665,17 @@ static void fuse_copy_finish(struct fuse_copy_state *cs) |
2122 | if (cs->currbuf) { |
2123 | struct pipe_buffer *buf = cs->currbuf; |
2124 | |
2125 | - if (!cs->write) { |
2126 | - kunmap_atomic(cs->mapaddr); |
2127 | - } else { |
2128 | - kunmap_atomic(cs->mapaddr); |
2129 | + if (cs->write) |
2130 | buf->len = PAGE_SIZE - cs->len; |
2131 | - } |
2132 | cs->currbuf = NULL; |
2133 | - cs->mapaddr = NULL; |
2134 | - } else if (cs->mapaddr) { |
2135 | - kunmap_atomic(cs->mapaddr); |
2136 | + } else if (cs->pg) { |
2137 | if (cs->write) { |
2138 | flush_dcache_page(cs->pg); |
2139 | set_page_dirty_lock(cs->pg); |
2140 | } |
2141 | put_page(cs->pg); |
2142 | - cs->mapaddr = NULL; |
2143 | } |
2144 | + cs->pg = NULL; |
2145 | } |
2146 | |
2147 | /* |
2148 | @@ -691,7 +684,7 @@ static void fuse_copy_finish(struct fuse_copy_state *cs) |
2149 | */ |
2150 | static int fuse_copy_fill(struct fuse_copy_state *cs) |
2151 | { |
2152 | - unsigned long offset; |
2153 | + struct page *page; |
2154 | int err; |
2155 | |
2156 | unlock_request(cs->fc, cs->req); |
2157 | @@ -706,14 +699,12 @@ static int fuse_copy_fill(struct fuse_copy_state *cs) |
2158 | |
2159 | BUG_ON(!cs->nr_segs); |
2160 | cs->currbuf = buf; |
2161 | - cs->mapaddr = kmap_atomic(buf->page); |
2162 | + cs->pg = buf->page; |
2163 | + cs->offset = buf->offset; |
2164 | cs->len = buf->len; |
2165 | - cs->buf = cs->mapaddr + buf->offset; |
2166 | cs->pipebufs++; |
2167 | cs->nr_segs--; |
2168 | } else { |
2169 | - struct page *page; |
2170 | - |
2171 | if (cs->nr_segs == cs->pipe->buffers) |
2172 | return -EIO; |
2173 | |
2174 | @@ -726,8 +717,8 @@ static int fuse_copy_fill(struct fuse_copy_state *cs) |
2175 | buf->len = 0; |
2176 | |
2177 | cs->currbuf = buf; |
2178 | - cs->mapaddr = kmap_atomic(page); |
2179 | - cs->buf = cs->mapaddr; |
2180 | + cs->pg = page; |
2181 | + cs->offset = 0; |
2182 | cs->len = PAGE_SIZE; |
2183 | cs->pipebufs++; |
2184 | cs->nr_segs++; |
2185 | @@ -740,14 +731,13 @@ static int fuse_copy_fill(struct fuse_copy_state *cs) |
2186 | cs->iov++; |
2187 | cs->nr_segs--; |
2188 | } |
2189 | - err = get_user_pages_fast(cs->addr, 1, cs->write, &cs->pg); |
2190 | + err = get_user_pages_fast(cs->addr, 1, cs->write, &page); |
2191 | if (err < 0) |
2192 | return err; |
2193 | BUG_ON(err != 1); |
2194 | - offset = cs->addr % PAGE_SIZE; |
2195 | - cs->mapaddr = kmap_atomic(cs->pg); |
2196 | - cs->buf = cs->mapaddr + offset; |
2197 | - cs->len = min(PAGE_SIZE - offset, cs->seglen); |
2198 | + cs->pg = page; |
2199 | + cs->offset = cs->addr % PAGE_SIZE; |
2200 | + cs->len = min(PAGE_SIZE - cs->offset, cs->seglen); |
2201 | cs->seglen -= cs->len; |
2202 | cs->addr += cs->len; |
2203 | } |
2204 | @@ -760,15 +750,20 @@ static int fuse_copy_do(struct fuse_copy_state *cs, void **val, unsigned *size) |
2205 | { |
2206 | unsigned ncpy = min(*size, cs->len); |
2207 | if (val) { |
2208 | + void *pgaddr = kmap_atomic(cs->pg); |
2209 | + void *buf = pgaddr + cs->offset; |
2210 | + |
2211 | if (cs->write) |
2212 | - memcpy(cs->buf, *val, ncpy); |
2213 | + memcpy(buf, *val, ncpy); |
2214 | else |
2215 | - memcpy(*val, cs->buf, ncpy); |
2216 | + memcpy(*val, buf, ncpy); |
2217 | + |
2218 | + kunmap_atomic(pgaddr); |
2219 | *val += ncpy; |
2220 | } |
2221 | *size -= ncpy; |
2222 | cs->len -= ncpy; |
2223 | - cs->buf += ncpy; |
2224 | + cs->offset += ncpy; |
2225 | return ncpy; |
2226 | } |
2227 | |
2228 | @@ -874,8 +869,8 @@ static int fuse_try_move_page(struct fuse_copy_state *cs, struct page **pagep) |
2229 | out_fallback_unlock: |
2230 | unlock_page(newpage); |
2231 | out_fallback: |
2232 | - cs->mapaddr = kmap_atomic(buf->page); |
2233 | - cs->buf = cs->mapaddr + buf->offset; |
2234 | + cs->pg = buf->page; |
2235 | + cs->offset = buf->offset; |
2236 | |
2237 | err = lock_request(cs->fc, cs->req); |
2238 | if (err) |
2239 | diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c |
2240 | index 42198359fa1b..202a9721be93 100644 |
2241 | --- a/fs/fuse/dir.c |
2242 | +++ b/fs/fuse/dir.c |
2243 | @@ -198,7 +198,8 @@ static int fuse_dentry_revalidate(struct dentry *entry, unsigned int flags) |
2244 | inode = ACCESS_ONCE(entry->d_inode); |
2245 | if (inode && is_bad_inode(inode)) |
2246 | goto invalid; |
2247 | - else if (fuse_dentry_time(entry) < get_jiffies_64()) { |
2248 | + else if (time_before64(fuse_dentry_time(entry), get_jiffies_64()) || |
2249 | + (flags & LOOKUP_REVAL)) { |
2250 | int err; |
2251 | struct fuse_entry_out outarg; |
2252 | struct fuse_req *req; |
2253 | @@ -985,7 +986,7 @@ int fuse_update_attributes(struct inode *inode, struct kstat *stat, |
2254 | int err; |
2255 | bool r; |
2256 | |
2257 | - if (fi->i_time < get_jiffies_64()) { |
2258 | + if (time_before64(fi->i_time, get_jiffies_64())) { |
2259 | r = true; |
2260 | err = fuse_do_getattr(inode, stat, file); |
2261 | } else { |
2262 | @@ -1171,7 +1172,7 @@ static int fuse_permission(struct inode *inode, int mask) |
2263 | ((mask & MAY_EXEC) && S_ISREG(inode->i_mode))) { |
2264 | struct fuse_inode *fi = get_fuse_inode(inode); |
2265 | |
2266 | - if (fi->i_time < get_jiffies_64()) { |
2267 | + if (time_before64(fi->i_time, get_jiffies_64())) { |
2268 | refreshed = true; |
2269 | |
2270 | err = fuse_perm_getattr(inode, mask); |
2271 | diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c |
2272 | index 754dcf23de8a..e2cd799e4d21 100644 |
2273 | --- a/fs/fuse/inode.c |
2274 | +++ b/fs/fuse/inode.c |
2275 | @@ -478,6 +478,17 @@ static const match_table_t tokens = { |
2276 | {OPT_ERR, NULL} |
2277 | }; |
2278 | |
2279 | +static int fuse_match_uint(substring_t *s, unsigned int *res) |
2280 | +{ |
2281 | + int err = -ENOMEM; |
2282 | + char *buf = match_strdup(s); |
2283 | + if (buf) { |
2284 | + err = kstrtouint(buf, 10, res); |
2285 | + kfree(buf); |
2286 | + } |
2287 | + return err; |
2288 | +} |
2289 | + |
2290 | static int parse_fuse_opt(char *opt, struct fuse_mount_data *d, int is_bdev) |
2291 | { |
2292 | char *p; |
2293 | @@ -488,6 +499,7 @@ static int parse_fuse_opt(char *opt, struct fuse_mount_data *d, int is_bdev) |
2294 | while ((p = strsep(&opt, ",")) != NULL) { |
2295 | int token; |
2296 | int value; |
2297 | + unsigned uv; |
2298 | substring_t args[MAX_OPT_ARGS]; |
2299 | if (!*p) |
2300 | continue; |
2301 | @@ -511,18 +523,18 @@ static int parse_fuse_opt(char *opt, struct fuse_mount_data *d, int is_bdev) |
2302 | break; |
2303 | |
2304 | case OPT_USER_ID: |
2305 | - if (match_int(&args[0], &value)) |
2306 | + if (fuse_match_uint(&args[0], &uv)) |
2307 | return 0; |
2308 | - d->user_id = make_kuid(current_user_ns(), value); |
2309 | + d->user_id = make_kuid(current_user_ns(), uv); |
2310 | if (!uid_valid(d->user_id)) |
2311 | return 0; |
2312 | d->user_id_present = 1; |
2313 | break; |
2314 | |
2315 | case OPT_GROUP_ID: |
2316 | - if (match_int(&args[0], &value)) |
2317 | + if (fuse_match_uint(&args[0], &uv)) |
2318 | return 0; |
2319 | - d->group_id = make_kgid(current_user_ns(), value); |
2320 | + d->group_id = make_kgid(current_user_ns(), uv); |
2321 | if (!gid_valid(d->group_id)) |
2322 | return 0; |
2323 | d->group_id_present = 1; |
2324 | diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c |
2325 | index 9cd5f63715c0..7f30bdc57d13 100644 |
2326 | --- a/fs/quota/dquot.c |
2327 | +++ b/fs/quota/dquot.c |
2328 | @@ -702,6 +702,7 @@ dqcache_shrink_scan(struct shrinker *shrink, struct shrink_control *sc) |
2329 | struct dquot *dquot; |
2330 | unsigned long freed = 0; |
2331 | |
2332 | + spin_lock(&dq_list_lock); |
2333 | head = free_dquots.prev; |
2334 | while (head != &free_dquots && sc->nr_to_scan) { |
2335 | dquot = list_entry(head, struct dquot, dq_free); |
2336 | @@ -713,6 +714,7 @@ dqcache_shrink_scan(struct shrinker *shrink, struct shrink_control *sc) |
2337 | freed++; |
2338 | head = free_dquots.prev; |
2339 | } |
2340 | + spin_unlock(&dq_list_lock); |
2341 | return freed; |
2342 | } |
2343 | |
2344 | diff --git a/include/net/sock.h b/include/net/sock.h |
2345 | index 21569cf456ed..f5a7e22fb09f 100644 |
2346 | --- a/include/net/sock.h |
2347 | +++ b/include/net/sock.h |
2348 | @@ -1728,8 +1728,8 @@ sk_dst_get(struct sock *sk) |
2349 | |
2350 | rcu_read_lock(); |
2351 | dst = rcu_dereference(sk->sk_dst_cache); |
2352 | - if (dst) |
2353 | - dst_hold(dst); |
2354 | + if (dst && !atomic_inc_not_zero(&dst->__refcnt)) |
2355 | + dst = NULL; |
2356 | rcu_read_unlock(); |
2357 | return dst; |
2358 | } |
2359 | @@ -1766,9 +1766,11 @@ __sk_dst_set(struct sock *sk, struct dst_entry *dst) |
2360 | static inline void |
2361 | sk_dst_set(struct sock *sk, struct dst_entry *dst) |
2362 | { |
2363 | - spin_lock(&sk->sk_dst_lock); |
2364 | - __sk_dst_set(sk, dst); |
2365 | - spin_unlock(&sk->sk_dst_lock); |
2366 | + struct dst_entry *old_dst; |
2367 | + |
2368 | + sk_tx_queue_clear(sk); |
2369 | + old_dst = xchg((__force struct dst_entry **)&sk->sk_dst_cache, dst); |
2370 | + dst_release(old_dst); |
2371 | } |
2372 | |
2373 | static inline void |
2374 | @@ -1780,9 +1782,7 @@ __sk_dst_reset(struct sock *sk) |
2375 | static inline void |
2376 | sk_dst_reset(struct sock *sk) |
2377 | { |
2378 | - spin_lock(&sk->sk_dst_lock); |
2379 | - __sk_dst_reset(sk); |
2380 | - spin_unlock(&sk->sk_dst_lock); |
2381 | + sk_dst_set(sk, NULL); |
2382 | } |
2383 | |
2384 | struct dst_entry *__sk_dst_check(struct sock *sk, u32 cookie); |
2385 | diff --git a/kernel/Kconfig.locks b/kernel/Kconfig.locks |
2386 | index d2b32ac27a39..ecee67a00f5f 100644 |
2387 | --- a/kernel/Kconfig.locks |
2388 | +++ b/kernel/Kconfig.locks |
2389 | @@ -220,6 +220,9 @@ config INLINE_WRITE_UNLOCK_IRQRESTORE |
2390 | |
2391 | endif |
2392 | |
2393 | +config ARCH_SUPPORTS_ATOMIC_RMW |
2394 | + bool |
2395 | + |
2396 | config MUTEX_SPIN_ON_OWNER |
2397 | def_bool y |
2398 | - depends on SMP && !DEBUG_MUTEXES |
2399 | + depends on SMP && !DEBUG_MUTEXES && ARCH_SUPPORTS_ATOMIC_RMW |
2400 | diff --git a/kernel/events/core.c b/kernel/events/core.c |
2401 | index 440eefc67397..935271c4b4d4 100644 |
2402 | --- a/kernel/events/core.c |
2403 | +++ b/kernel/events/core.c |
2404 | @@ -2315,7 +2315,7 @@ static void perf_event_context_sched_out(struct task_struct *task, int ctxn, |
2405 | next_parent = rcu_dereference(next_ctx->parent_ctx); |
2406 | |
2407 | /* If neither context have a parent context; they cannot be clones. */ |
2408 | - if (!parent && !next_parent) |
2409 | + if (!parent || !next_parent) |
2410 | goto unlock; |
2411 | |
2412 | if (next_parent == ctx || next_ctx == parent || next_parent == parent) { |
2413 | diff --git a/kernel/power/process.c b/kernel/power/process.c |
2414 | index 06ec8869dbf1..14f9a8d4725d 100644 |
2415 | --- a/kernel/power/process.c |
2416 | +++ b/kernel/power/process.c |
2417 | @@ -184,6 +184,7 @@ void thaw_processes(void) |
2418 | |
2419 | printk("Restarting tasks ... "); |
2420 | |
2421 | + __usermodehelper_set_disable_depth(UMH_FREEZING); |
2422 | thaw_workqueues(); |
2423 | |
2424 | read_lock(&tasklist_lock); |
2425 | diff --git a/kernel/sched/debug.c b/kernel/sched/debug.c |
2426 | index 695f9773bb60..627b3c34b821 100644 |
2427 | --- a/kernel/sched/debug.c |
2428 | +++ b/kernel/sched/debug.c |
2429 | @@ -608,7 +608,7 @@ void proc_sched_show_task(struct task_struct *p, struct seq_file *m) |
2430 | |
2431 | avg_atom = p->se.sum_exec_runtime; |
2432 | if (nr_switches) |
2433 | - do_div(avg_atom, nr_switches); |
2434 | + avg_atom = div64_ul(avg_atom, nr_switches); |
2435 | else |
2436 | avg_atom = -1LL; |
2437 | |
2438 | diff --git a/kernel/time/alarmtimer.c b/kernel/time/alarmtimer.c |
2439 | index 88c9c65a430d..fe75444ae7ec 100644 |
2440 | --- a/kernel/time/alarmtimer.c |
2441 | +++ b/kernel/time/alarmtimer.c |
2442 | @@ -585,9 +585,14 @@ static int alarm_timer_set(struct k_itimer *timr, int flags, |
2443 | struct itimerspec *new_setting, |
2444 | struct itimerspec *old_setting) |
2445 | { |
2446 | + ktime_t exp; |
2447 | + |
2448 | if (!rtcdev) |
2449 | return -ENOTSUPP; |
2450 | |
2451 | + if (flags & ~TIMER_ABSTIME) |
2452 | + return -EINVAL; |
2453 | + |
2454 | if (old_setting) |
2455 | alarm_timer_get(timr, old_setting); |
2456 | |
2457 | @@ -597,8 +602,16 @@ static int alarm_timer_set(struct k_itimer *timr, int flags, |
2458 | |
2459 | /* start the timer */ |
2460 | timr->it.alarm.interval = timespec_to_ktime(new_setting->it_interval); |
2461 | - alarm_start(&timr->it.alarm.alarmtimer, |
2462 | - timespec_to_ktime(new_setting->it_value)); |
2463 | + exp = timespec_to_ktime(new_setting->it_value); |
2464 | + /* Convert (if necessary) to absolute time */ |
2465 | + if (flags != TIMER_ABSTIME) { |
2466 | + ktime_t now; |
2467 | + |
2468 | + now = alarm_bases[timr->it.alarm.alarmtimer.type].gettime(); |
2469 | + exp = ktime_add(now, exp); |
2470 | + } |
2471 | + |
2472 | + alarm_start(&timr->it.alarm.alarmtimer, exp); |
2473 | return 0; |
2474 | } |
2475 | |
2476 | @@ -730,6 +743,9 @@ static int alarm_timer_nsleep(const clockid_t which_clock, int flags, |
2477 | if (!alarmtimer_get_rtcdev()) |
2478 | return -ENOTSUPP; |
2479 | |
2480 | + if (flags & ~TIMER_ABSTIME) |
2481 | + return -EINVAL; |
2482 | + |
2483 | if (!capable(CAP_WAKE_ALARM)) |
2484 | return -EPERM; |
2485 | |
2486 | diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c |
2487 | index 4a54a25afa2f..5aeac5338b30 100644 |
2488 | --- a/kernel/trace/ftrace.c |
2489 | +++ b/kernel/trace/ftrace.c |
2490 | @@ -325,12 +325,12 @@ static void update_ftrace_function(void) |
2491 | func = ftrace_ops_list_func; |
2492 | } |
2493 | |
2494 | + update_function_graph_func(); |
2495 | + |
2496 | /* If there's no change, then do nothing more here */ |
2497 | if (ftrace_trace_function == func) |
2498 | return; |
2499 | |
2500 | - update_function_graph_func(); |
2501 | - |
2502 | /* |
2503 | * If we are using the list function, it doesn't care |
2504 | * about the function_trace_ops. |
2505 | diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c |
2506 | index 7c56c3d06943..ff7027199a9a 100644 |
2507 | --- a/kernel/trace/ring_buffer.c |
2508 | +++ b/kernel/trace/ring_buffer.c |
2509 | @@ -616,10 +616,6 @@ int ring_buffer_poll_wait(struct ring_buffer *buffer, int cpu, |
2510 | struct ring_buffer_per_cpu *cpu_buffer; |
2511 | struct rb_irq_work *work; |
2512 | |
2513 | - if ((cpu == RING_BUFFER_ALL_CPUS && !ring_buffer_empty(buffer)) || |
2514 | - (cpu != RING_BUFFER_ALL_CPUS && !ring_buffer_empty_cpu(buffer, cpu))) |
2515 | - return POLLIN | POLLRDNORM; |
2516 | - |
2517 | if (cpu == RING_BUFFER_ALL_CPUS) |
2518 | work = &buffer->irq_work; |
2519 | else { |
2520 | diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c |
2521 | index 39a12265c253..4dcbf7dc3c51 100644 |
2522 | --- a/kernel/trace/trace.c |
2523 | +++ b/kernel/trace/trace.c |
2524 | @@ -466,6 +466,12 @@ int __trace_puts(unsigned long ip, const char *str, int size) |
2525 | struct print_entry *entry; |
2526 | unsigned long irq_flags; |
2527 | int alloc; |
2528 | + int pc; |
2529 | + |
2530 | + if (!(trace_flags & TRACE_ITER_PRINTK)) |
2531 | + return 0; |
2532 | + |
2533 | + pc = preempt_count(); |
2534 | |
2535 | if (unlikely(tracing_selftest_running || tracing_disabled)) |
2536 | return 0; |
2537 | @@ -475,7 +481,7 @@ int __trace_puts(unsigned long ip, const char *str, int size) |
2538 | local_save_flags(irq_flags); |
2539 | buffer = global_trace.trace_buffer.buffer; |
2540 | event = trace_buffer_lock_reserve(buffer, TRACE_PRINT, alloc, |
2541 | - irq_flags, preempt_count()); |
2542 | + irq_flags, pc); |
2543 | if (!event) |
2544 | return 0; |
2545 | |
2546 | @@ -492,6 +498,7 @@ int __trace_puts(unsigned long ip, const char *str, int size) |
2547 | entry->buf[size] = '\0'; |
2548 | |
2549 | __buffer_unlock_commit(buffer, event); |
2550 | + ftrace_trace_stack(buffer, irq_flags, 4, pc); |
2551 | |
2552 | return size; |
2553 | } |
2554 | @@ -509,6 +516,12 @@ int __trace_bputs(unsigned long ip, const char *str) |
2555 | struct bputs_entry *entry; |
2556 | unsigned long irq_flags; |
2557 | int size = sizeof(struct bputs_entry); |
2558 | + int pc; |
2559 | + |
2560 | + if (!(trace_flags & TRACE_ITER_PRINTK)) |
2561 | + return 0; |
2562 | + |
2563 | + pc = preempt_count(); |
2564 | |
2565 | if (unlikely(tracing_selftest_running || tracing_disabled)) |
2566 | return 0; |
2567 | @@ -516,7 +529,7 @@ int __trace_bputs(unsigned long ip, const char *str) |
2568 | local_save_flags(irq_flags); |
2569 | buffer = global_trace.trace_buffer.buffer; |
2570 | event = trace_buffer_lock_reserve(buffer, TRACE_BPUTS, size, |
2571 | - irq_flags, preempt_count()); |
2572 | + irq_flags, pc); |
2573 | if (!event) |
2574 | return 0; |
2575 | |
2576 | @@ -525,6 +538,7 @@ int __trace_bputs(unsigned long ip, const char *str) |
2577 | entry->str = str; |
2578 | |
2579 | __buffer_unlock_commit(buffer, event); |
2580 | + ftrace_trace_stack(buffer, irq_flags, 4, pc); |
2581 | |
2582 | return 1; |
2583 | } |
2584 | diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c |
2585 | index 3ddfd8f62c05..aec1dac0a4e4 100644 |
2586 | --- a/kernel/trace/trace_events.c |
2587 | +++ b/kernel/trace/trace_events.c |
2588 | @@ -470,6 +470,7 @@ static void remove_event_file_dir(struct ftrace_event_file *file) |
2589 | |
2590 | list_del(&file->list); |
2591 | remove_subsystem(file->system); |
2592 | + free_event_filter(file->filter); |
2593 | kmem_cache_free(file_cachep, file); |
2594 | } |
2595 | |
2596 | diff --git a/mm/shmem.c b/mm/shmem.c |
2597 | index a2801ba8ae2d..a731cef61305 100644 |
2598 | --- a/mm/shmem.c |
2599 | +++ b/mm/shmem.c |
2600 | @@ -80,11 +80,12 @@ static struct vfsmount *shm_mnt; |
2601 | #define SHORT_SYMLINK_LEN 128 |
2602 | |
2603 | /* |
2604 | - * shmem_fallocate and shmem_writepage communicate via inode->i_private |
2605 | - * (with i_mutex making sure that it has only one user at a time): |
2606 | - * we would prefer not to enlarge the shmem inode just for that. |
2607 | + * shmem_fallocate communicates with shmem_fault or shmem_writepage via |
2608 | + * inode->i_private (with i_mutex making sure that it has only one user at |
2609 | + * a time): we would prefer not to enlarge the shmem inode just for that. |
2610 | */ |
2611 | struct shmem_falloc { |
2612 | + wait_queue_head_t *waitq; /* faults into hole wait for punch to end */ |
2613 | pgoff_t start; /* start of range currently being fallocated */ |
2614 | pgoff_t next; /* the next page offset to be fallocated */ |
2615 | pgoff_t nr_falloced; /* how many new pages have been fallocated */ |
2616 | @@ -467,23 +468,20 @@ static void shmem_undo_range(struct inode *inode, loff_t lstart, loff_t lend, |
2617 | return; |
2618 | |
2619 | index = start; |
2620 | - for ( ; ; ) { |
2621 | + while (index < end) { |
2622 | cond_resched(); |
2623 | |
2624 | pvec.nr = find_get_entries(mapping, index, |
2625 | min(end - index, (pgoff_t)PAGEVEC_SIZE), |
2626 | pvec.pages, indices); |
2627 | if (!pvec.nr) { |
2628 | - if (index == start || unfalloc) |
2629 | + /* If all gone or hole-punch or unfalloc, we're done */ |
2630 | + if (index == start || end != -1) |
2631 | break; |
2632 | + /* But if truncating, restart to make sure all gone */ |
2633 | index = start; |
2634 | continue; |
2635 | } |
2636 | - if ((index == start || unfalloc) && indices[0] >= end) { |
2637 | - pagevec_remove_exceptionals(&pvec); |
2638 | - pagevec_release(&pvec); |
2639 | - break; |
2640 | - } |
2641 | mem_cgroup_uncharge_start(); |
2642 | for (i = 0; i < pagevec_count(&pvec); i++) { |
2643 | struct page *page = pvec.pages[i]; |
2644 | @@ -495,8 +493,12 @@ static void shmem_undo_range(struct inode *inode, loff_t lstart, loff_t lend, |
2645 | if (radix_tree_exceptional_entry(page)) { |
2646 | if (unfalloc) |
2647 | continue; |
2648 | - nr_swaps_freed += !shmem_free_swap(mapping, |
2649 | - index, page); |
2650 | + if (shmem_free_swap(mapping, index, page)) { |
2651 | + /* Swap was replaced by page: retry */ |
2652 | + index--; |
2653 | + break; |
2654 | + } |
2655 | + nr_swaps_freed++; |
2656 | continue; |
2657 | } |
2658 | |
2659 | @@ -505,6 +507,11 @@ static void shmem_undo_range(struct inode *inode, loff_t lstart, loff_t lend, |
2660 | if (page->mapping == mapping) { |
2661 | VM_BUG_ON_PAGE(PageWriteback(page), page); |
2662 | truncate_inode_page(mapping, page); |
2663 | + } else { |
2664 | + /* Page was replaced by swap: retry */ |
2665 | + unlock_page(page); |
2666 | + index--; |
2667 | + break; |
2668 | } |
2669 | } |
2670 | unlock_page(page); |
2671 | @@ -759,6 +766,7 @@ static int shmem_writepage(struct page *page, struct writeback_control *wbc) |
2672 | spin_lock(&inode->i_lock); |
2673 | shmem_falloc = inode->i_private; |
2674 | if (shmem_falloc && |
2675 | + !shmem_falloc->waitq && |
2676 | index >= shmem_falloc->start && |
2677 | index < shmem_falloc->next) |
2678 | shmem_falloc->nr_unswapped++; |
2679 | @@ -1233,6 +1241,64 @@ static int shmem_fault(struct vm_area_struct *vma, struct vm_fault *vmf) |
2680 | int error; |
2681 | int ret = VM_FAULT_LOCKED; |
2682 | |
2683 | + /* |
2684 | + * Trinity finds that probing a hole which tmpfs is punching can |
2685 | + * prevent the hole-punch from ever completing: which in turn |
2686 | + * locks writers out with its hold on i_mutex. So refrain from |
2687 | + * faulting pages into the hole while it's being punched. Although |
2688 | + * shmem_undo_range() does remove the additions, it may be unable to |
2689 | + * keep up, as each new page needs its own unmap_mapping_range() call, |
2690 | + * and the i_mmap tree grows ever slower to scan if new vmas are added. |
2691 | + * |
2692 | + * It does not matter if we sometimes reach this check just before the |
2693 | + * hole-punch begins, so that one fault then races with the punch: |
2694 | + * we just need to make racing faults a rare case. |
2695 | + * |
2696 | + * The implementation below would be much simpler if we just used a |
2697 | + * standard mutex or completion: but we cannot take i_mutex in fault, |
2698 | + * and bloating every shmem inode for this unlikely case would be sad. |
2699 | + */ |
2700 | + if (unlikely(inode->i_private)) { |
2701 | + struct shmem_falloc *shmem_falloc; |
2702 | + |
2703 | + spin_lock(&inode->i_lock); |
2704 | + shmem_falloc = inode->i_private; |
2705 | + if (shmem_falloc && |
2706 | + shmem_falloc->waitq && |
2707 | + vmf->pgoff >= shmem_falloc->start && |
2708 | + vmf->pgoff < shmem_falloc->next) { |
2709 | + wait_queue_head_t *shmem_falloc_waitq; |
2710 | + DEFINE_WAIT(shmem_fault_wait); |
2711 | + |
2712 | + ret = VM_FAULT_NOPAGE; |
2713 | + if ((vmf->flags & FAULT_FLAG_ALLOW_RETRY) && |
2714 | + !(vmf->flags & FAULT_FLAG_RETRY_NOWAIT)) { |
2715 | + /* It's polite to up mmap_sem if we can */ |
2716 | + up_read(&vma->vm_mm->mmap_sem); |
2717 | + ret = VM_FAULT_RETRY; |
2718 | + } |
2719 | + |
2720 | + shmem_falloc_waitq = shmem_falloc->waitq; |
2721 | + prepare_to_wait(shmem_falloc_waitq, &shmem_fault_wait, |
2722 | + TASK_UNINTERRUPTIBLE); |
2723 | + spin_unlock(&inode->i_lock); |
2724 | + schedule(); |
2725 | + |
2726 | + /* |
2727 | + * shmem_falloc_waitq points into the shmem_fallocate() |
2728 | + * stack of the hole-punching task: shmem_falloc_waitq |
2729 | + * is usually invalid by the time we reach here, but |
2730 | + * finish_wait() does not dereference it in that case; |
2731 | + * though i_lock needed lest racing with wake_up_all(). |
2732 | + */ |
2733 | + spin_lock(&inode->i_lock); |
2734 | + finish_wait(shmem_falloc_waitq, &shmem_fault_wait); |
2735 | + spin_unlock(&inode->i_lock); |
2736 | + return ret; |
2737 | + } |
2738 | + spin_unlock(&inode->i_lock); |
2739 | + } |
2740 | + |
2741 | error = shmem_getpage(inode, vmf->pgoff, &vmf->page, SGP_CACHE, &ret); |
2742 | if (error) |
2743 | return ((error == -ENOMEM) ? VM_FAULT_OOM : VM_FAULT_SIGBUS); |
2744 | @@ -1737,12 +1803,25 @@ static long shmem_fallocate(struct file *file, int mode, loff_t offset, |
2745 | struct address_space *mapping = file->f_mapping; |
2746 | loff_t unmap_start = round_up(offset, PAGE_SIZE); |
2747 | loff_t unmap_end = round_down(offset + len, PAGE_SIZE) - 1; |
2748 | + DECLARE_WAIT_QUEUE_HEAD_ONSTACK(shmem_falloc_waitq); |
2749 | + |
2750 | + shmem_falloc.waitq = &shmem_falloc_waitq; |
2751 | + shmem_falloc.start = unmap_start >> PAGE_SHIFT; |
2752 | + shmem_falloc.next = (unmap_end + 1) >> PAGE_SHIFT; |
2753 | + spin_lock(&inode->i_lock); |
2754 | + inode->i_private = &shmem_falloc; |
2755 | + spin_unlock(&inode->i_lock); |
2756 | |
2757 | if ((u64)unmap_end > (u64)unmap_start) |
2758 | unmap_mapping_range(mapping, unmap_start, |
2759 | 1 + unmap_end - unmap_start, 0); |
2760 | shmem_truncate_range(inode, offset, offset + len - 1); |
2761 | /* No need to unmap again: hole-punching leaves COWed pages */ |
2762 | + |
2763 | + spin_lock(&inode->i_lock); |
2764 | + inode->i_private = NULL; |
2765 | + wake_up_all(&shmem_falloc_waitq); |
2766 | + spin_unlock(&inode->i_lock); |
2767 | error = 0; |
2768 | goto out; |
2769 | } |
2770 | @@ -1760,6 +1839,7 @@ static long shmem_fallocate(struct file *file, int mode, loff_t offset, |
2771 | goto out; |
2772 | } |
2773 | |
2774 | + shmem_falloc.waitq = NULL; |
2775 | shmem_falloc.start = start; |
2776 | shmem_falloc.next = start; |
2777 | shmem_falloc.nr_falloced = 0; |
2778 | diff --git a/mm/vmscan.c b/mm/vmscan.c |
2779 | index a50bde6edbbc..229c017cd090 100644 |
2780 | --- a/mm/vmscan.c |
2781 | +++ b/mm/vmscan.c |
2782 | @@ -1554,19 +1554,18 @@ shrink_inactive_list(unsigned long nr_to_scan, struct lruvec *lruvec, |
2783 | * If dirty pages are scanned that are not queued for IO, it |
2784 | * implies that flushers are not keeping up. In this case, flag |
2785 | * the zone ZONE_TAIL_LRU_DIRTY and kswapd will start writing |
2786 | - * pages from reclaim context. It will forcibly stall in the |
2787 | - * next check. |
2788 | + * pages from reclaim context. |
2789 | */ |
2790 | if (nr_unqueued_dirty == nr_taken) |
2791 | zone_set_flag(zone, ZONE_TAIL_LRU_DIRTY); |
2792 | |
2793 | /* |
2794 | - * In addition, if kswapd scans pages marked marked for |
2795 | - * immediate reclaim and under writeback (nr_immediate), it |
2796 | - * implies that pages are cycling through the LRU faster than |
2797 | + * If kswapd scans pages marked marked for immediate |
2798 | + * reclaim and under writeback (nr_immediate), it implies |
2799 | + * that pages are cycling through the LRU faster than |
2800 | * they are written so also forcibly stall. |
2801 | */ |
2802 | - if (nr_unqueued_dirty == nr_taken || nr_immediate) |
2803 | + if (nr_immediate) |
2804 | congestion_wait(BLK_RW_ASYNC, HZ/10); |
2805 | } |
2806 | |
2807 | diff --git a/net/8021q/vlan_core.c b/net/8021q/vlan_core.c |
2808 | index 3c32bd257b73..80e0d0360b80 100644 |
2809 | --- a/net/8021q/vlan_core.c |
2810 | +++ b/net/8021q/vlan_core.c |
2811 | @@ -114,8 +114,11 @@ EXPORT_SYMBOL(vlan_dev_vlan_proto); |
2812 | |
2813 | static struct sk_buff *vlan_reorder_header(struct sk_buff *skb) |
2814 | { |
2815 | - if (skb_cow(skb, skb_headroom(skb)) < 0) |
2816 | + if (skb_cow(skb, skb_headroom(skb)) < 0) { |
2817 | + kfree_skb(skb); |
2818 | return NULL; |
2819 | + } |
2820 | + |
2821 | memmove(skb->data - ETH_HLEN, skb->data - VLAN_ETH_HLEN, 2 * ETH_ALEN); |
2822 | skb->mac_header += VLAN_HLEN; |
2823 | return skb; |
2824 | diff --git a/net/8021q/vlan_dev.c b/net/8021q/vlan_dev.c |
2825 | index 019efb79708f..6806d03a67a1 100644 |
2826 | --- a/net/8021q/vlan_dev.c |
2827 | +++ b/net/8021q/vlan_dev.c |
2828 | @@ -627,8 +627,6 @@ static void vlan_dev_uninit(struct net_device *dev) |
2829 | struct vlan_dev_priv *vlan = vlan_dev_priv(dev); |
2830 | int i; |
2831 | |
2832 | - free_percpu(vlan->vlan_pcpu_stats); |
2833 | - vlan->vlan_pcpu_stats = NULL; |
2834 | for (i = 0; i < ARRAY_SIZE(vlan->egress_priority_map); i++) { |
2835 | while ((pm = vlan->egress_priority_map[i]) != NULL) { |
2836 | vlan->egress_priority_map[i] = pm->next; |
2837 | @@ -787,6 +785,15 @@ static const struct net_device_ops vlan_netdev_ops = { |
2838 | .ndo_get_lock_subclass = vlan_dev_get_lock_subclass, |
2839 | }; |
2840 | |
2841 | +static void vlan_dev_free(struct net_device *dev) |
2842 | +{ |
2843 | + struct vlan_dev_priv *vlan = vlan_dev_priv(dev); |
2844 | + |
2845 | + free_percpu(vlan->vlan_pcpu_stats); |
2846 | + vlan->vlan_pcpu_stats = NULL; |
2847 | + free_netdev(dev); |
2848 | +} |
2849 | + |
2850 | void vlan_setup(struct net_device *dev) |
2851 | { |
2852 | ether_setup(dev); |
2853 | @@ -796,7 +803,7 @@ void vlan_setup(struct net_device *dev) |
2854 | dev->tx_queue_len = 0; |
2855 | |
2856 | dev->netdev_ops = &vlan_netdev_ops; |
2857 | - dev->destructor = free_netdev; |
2858 | + dev->destructor = vlan_dev_free; |
2859 | dev->ethtool_ops = &vlan_ethtool_ops; |
2860 | |
2861 | memset(dev->broadcast, 0, ETH_ALEN); |
2862 | diff --git a/net/appletalk/ddp.c b/net/appletalk/ddp.c |
2863 | index 786ee2f83d5f..82f6e63e1a4a 100644 |
2864 | --- a/net/appletalk/ddp.c |
2865 | +++ b/net/appletalk/ddp.c |
2866 | @@ -1489,8 +1489,6 @@ static int atalk_rcv(struct sk_buff *skb, struct net_device *dev, |
2867 | goto drop; |
2868 | |
2869 | /* Queue packet (standard) */ |
2870 | - skb->sk = sock; |
2871 | - |
2872 | if (sock_queue_rcv_skb(sock, skb) < 0) |
2873 | goto drop; |
2874 | |
2875 | @@ -1644,7 +1642,6 @@ static int atalk_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr |
2876 | if (!skb) |
2877 | goto out; |
2878 | |
2879 | - skb->sk = sk; |
2880 | skb_reserve(skb, ddp_dl->header_length); |
2881 | skb_reserve(skb, dev->hard_header_len); |
2882 | skb->dev = dev; |
2883 | diff --git a/net/core/dev.c b/net/core/dev.c |
2884 | index a30bef1882f5..a7621f3ff505 100644 |
2885 | --- a/net/core/dev.c |
2886 | +++ b/net/core/dev.c |
2887 | @@ -148,6 +148,9 @@ struct list_head ptype_all __read_mostly; /* Taps */ |
2888 | static struct list_head offload_base __read_mostly; |
2889 | |
2890 | static int netif_rx_internal(struct sk_buff *skb); |
2891 | +static int call_netdevice_notifiers_info(unsigned long val, |
2892 | + struct net_device *dev, |
2893 | + struct netdev_notifier_info *info); |
2894 | |
2895 | /* |
2896 | * The @dev_base_head list is protected by @dev_base_lock and the rtnl |
2897 | @@ -1207,7 +1210,11 @@ EXPORT_SYMBOL(netdev_features_change); |
2898 | void netdev_state_change(struct net_device *dev) |
2899 | { |
2900 | if (dev->flags & IFF_UP) { |
2901 | - call_netdevice_notifiers(NETDEV_CHANGE, dev); |
2902 | + struct netdev_notifier_change_info change_info; |
2903 | + |
2904 | + change_info.flags_changed = 0; |
2905 | + call_netdevice_notifiers_info(NETDEV_CHANGE, dev, |
2906 | + &change_info.info); |
2907 | rtmsg_ifinfo(RTM_NEWLINK, dev, 0, GFP_KERNEL); |
2908 | } |
2909 | } |
2910 | @@ -4057,6 +4064,8 @@ static void napi_reuse_skb(struct napi_struct *napi, struct sk_buff *skb) |
2911 | skb->vlan_tci = 0; |
2912 | skb->dev = napi->dev; |
2913 | skb->skb_iif = 0; |
2914 | + skb->encapsulation = 0; |
2915 | + skb_shinfo(skb)->gso_type = 0; |
2916 | skb->truesize = SKB_TRUESIZE(skb_end_offset(skb)); |
2917 | |
2918 | napi->skb = skb; |
2919 | diff --git a/net/core/dst.c b/net/core/dst.c |
2920 | index 80d6286c8b62..a028409ee438 100644 |
2921 | --- a/net/core/dst.c |
2922 | +++ b/net/core/dst.c |
2923 | @@ -269,6 +269,15 @@ again: |
2924 | } |
2925 | EXPORT_SYMBOL(dst_destroy); |
2926 | |
2927 | +static void dst_destroy_rcu(struct rcu_head *head) |
2928 | +{ |
2929 | + struct dst_entry *dst = container_of(head, struct dst_entry, rcu_head); |
2930 | + |
2931 | + dst = dst_destroy(dst); |
2932 | + if (dst) |
2933 | + __dst_free(dst); |
2934 | +} |
2935 | + |
2936 | void dst_release(struct dst_entry *dst) |
2937 | { |
2938 | if (dst) { |
2939 | @@ -276,11 +285,8 @@ void dst_release(struct dst_entry *dst) |
2940 | |
2941 | newrefcnt = atomic_dec_return(&dst->__refcnt); |
2942 | WARN_ON(newrefcnt < 0); |
2943 | - if (unlikely(dst->flags & DST_NOCACHE) && !newrefcnt) { |
2944 | - dst = dst_destroy(dst); |
2945 | - if (dst) |
2946 | - __dst_free(dst); |
2947 | - } |
2948 | + if (unlikely(dst->flags & DST_NOCACHE) && !newrefcnt) |
2949 | + call_rcu(&dst->rcu_head, dst_destroy_rcu); |
2950 | } |
2951 | } |
2952 | EXPORT_SYMBOL(dst_release); |
2953 | diff --git a/net/core/filter.c b/net/core/filter.c |
2954 | index 4aec7b93f1a9..5310d5e0884f 100644 |
2955 | --- a/net/core/filter.c |
2956 | +++ b/net/core/filter.c |
2957 | @@ -872,7 +872,7 @@ int sk_convert_filter(struct sock_filter *prog, int len, |
2958 | BUILD_BUG_ON(BPF_MEMWORDS * sizeof(u32) > MAX_BPF_STACK); |
2959 | BUILD_BUG_ON(FP_REG + 1 != MAX_BPF_REG); |
2960 | |
2961 | - if (len <= 0 || len >= BPF_MAXINSNS) |
2962 | + if (len <= 0 || len > BPF_MAXINSNS) |
2963 | return -EINVAL; |
2964 | |
2965 | if (new_prog) { |
2966 | diff --git a/net/core/skbuff.c b/net/core/skbuff.c |
2967 | index 8383b2bddeb9..9433047b2453 100644 |
2968 | --- a/net/core/skbuff.c |
2969 | +++ b/net/core/skbuff.c |
2970 | @@ -2881,12 +2881,13 @@ struct sk_buff *skb_segment(struct sk_buff *head_skb, |
2971 | int pos; |
2972 | int dummy; |
2973 | |
2974 | + __skb_push(head_skb, doffset); |
2975 | proto = skb_network_protocol(head_skb, &dummy); |
2976 | if (unlikely(!proto)) |
2977 | return ERR_PTR(-EINVAL); |
2978 | |
2979 | csum = !!can_checksum_protocol(features, proto); |
2980 | - __skb_push(head_skb, doffset); |
2981 | + |
2982 | headroom = skb_headroom(head_skb); |
2983 | pos = skb_headlen(head_skb); |
2984 | |
2985 | diff --git a/net/dns_resolver/dns_query.c b/net/dns_resolver/dns_query.c |
2986 | index e7b6d53eef88..f005cc760535 100644 |
2987 | --- a/net/dns_resolver/dns_query.c |
2988 | +++ b/net/dns_resolver/dns_query.c |
2989 | @@ -149,7 +149,9 @@ int dns_query(const char *type, const char *name, size_t namelen, |
2990 | if (!*_result) |
2991 | goto put; |
2992 | |
2993 | - memcpy(*_result, upayload->data, len + 1); |
2994 | + memcpy(*_result, upayload->data, len); |
2995 | + (*_result)[len] = '\0'; |
2996 | + |
2997 | if (_expiry) |
2998 | *_expiry = rkey->expiry; |
2999 | |
3000 | diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c |
3001 | index 6d6dd345bc4d..6af8ab6e1706 100644 |
3002 | --- a/net/ipv4/af_inet.c |
3003 | +++ b/net/ipv4/af_inet.c |
3004 | @@ -1434,6 +1434,9 @@ static int inet_gro_complete(struct sk_buff *skb, int nhoff) |
3005 | int proto = iph->protocol; |
3006 | int err = -ENOSYS; |
3007 | |
3008 | + if (skb->encapsulation) |
3009 | + skb_set_inner_network_header(skb, nhoff); |
3010 | + |
3011 | csum_replace2(&iph->check, iph->tot_len, newlen); |
3012 | iph->tot_len = newlen; |
3013 | |
3014 | diff --git a/net/ipv4/gre_offload.c b/net/ipv4/gre_offload.c |
3015 | index f1d32280cb54..2d24f293f977 100644 |
3016 | --- a/net/ipv4/gre_offload.c |
3017 | +++ b/net/ipv4/gre_offload.c |
3018 | @@ -255,6 +255,9 @@ static int gre_gro_complete(struct sk_buff *skb, int nhoff) |
3019 | int err = -ENOENT; |
3020 | __be16 type; |
3021 | |
3022 | + skb->encapsulation = 1; |
3023 | + skb_shinfo(skb)->gso_type = SKB_GSO_GRE; |
3024 | + |
3025 | type = greh->protocol; |
3026 | if (greh->flags & GRE_KEY) |
3027 | grehlen += GRE_HEADER_SECTION; |
3028 | diff --git a/net/ipv4/icmp.c b/net/ipv4/icmp.c |
3029 | index 0134663fdbce..1e4aa8354f93 100644 |
3030 | --- a/net/ipv4/icmp.c |
3031 | +++ b/net/ipv4/icmp.c |
3032 | @@ -732,8 +732,6 @@ static void icmp_unreach(struct sk_buff *skb) |
3033 | /* fall through */ |
3034 | case 0: |
3035 | info = ntohs(icmph->un.frag.mtu); |
3036 | - if (!info) |
3037 | - goto out; |
3038 | } |
3039 | break; |
3040 | case ICMP_SR_FAILED: |
3041 | diff --git a/net/ipv4/igmp.c b/net/ipv4/igmp.c |
3042 | index 97e4d1655d26..9db3b877fcaf 100644 |
3043 | --- a/net/ipv4/igmp.c |
3044 | +++ b/net/ipv4/igmp.c |
3045 | @@ -1952,6 +1952,10 @@ int ip_mc_leave_group(struct sock *sk, struct ip_mreqn *imr) |
3046 | |
3047 | rtnl_lock(); |
3048 | in_dev = ip_mc_find_dev(net, imr); |
3049 | + if (!in_dev) { |
3050 | + ret = -ENODEV; |
3051 | + goto out; |
3052 | + } |
3053 | ifindex = imr->imr_ifindex; |
3054 | for (imlp = &inet->mc_list; |
3055 | (iml = rtnl_dereference(*imlp)) != NULL; |
3056 | @@ -1969,16 +1973,14 @@ int ip_mc_leave_group(struct sock *sk, struct ip_mreqn *imr) |
3057 | |
3058 | *imlp = iml->next_rcu; |
3059 | |
3060 | - if (in_dev) |
3061 | - ip_mc_dec_group(in_dev, group); |
3062 | + ip_mc_dec_group(in_dev, group); |
3063 | rtnl_unlock(); |
3064 | /* decrease mem now to avoid the memleak warning */ |
3065 | atomic_sub(sizeof(*iml), &sk->sk_omem_alloc); |
3066 | kfree_rcu(iml, rcu); |
3067 | return 0; |
3068 | } |
3069 | - if (!in_dev) |
3070 | - ret = -ENODEV; |
3071 | +out: |
3072 | rtnl_unlock(); |
3073 | return ret; |
3074 | } |
3075 | diff --git a/net/ipv4/ip_options.c b/net/ipv4/ip_options.c |
3076 | index f4ab72e19af9..96f90b89df32 100644 |
3077 | --- a/net/ipv4/ip_options.c |
3078 | +++ b/net/ipv4/ip_options.c |
3079 | @@ -288,6 +288,10 @@ int ip_options_compile(struct net *net, |
3080 | optptr++; |
3081 | continue; |
3082 | } |
3083 | + if (unlikely(l < 2)) { |
3084 | + pp_ptr = optptr; |
3085 | + goto error; |
3086 | + } |
3087 | optlen = optptr[1]; |
3088 | if (optlen < 2 || optlen > l) { |
3089 | pp_ptr = optptr; |
3090 | diff --git a/net/ipv4/ip_tunnel.c b/net/ipv4/ip_tunnel.c |
3091 | index 2acc2337d38b..b77b6a55b05e 100644 |
3092 | --- a/net/ipv4/ip_tunnel.c |
3093 | +++ b/net/ipv4/ip_tunnel.c |
3094 | @@ -73,12 +73,7 @@ static void __tunnel_dst_set(struct ip_tunnel_dst *idst, |
3095 | { |
3096 | struct dst_entry *old_dst; |
3097 | |
3098 | - if (dst) { |
3099 | - if (dst->flags & DST_NOCACHE) |
3100 | - dst = NULL; |
3101 | - else |
3102 | - dst_clone(dst); |
3103 | - } |
3104 | + dst_clone(dst); |
3105 | old_dst = xchg((__force struct dst_entry **)&idst->dst, dst); |
3106 | dst_release(old_dst); |
3107 | } |
3108 | @@ -108,13 +103,14 @@ static struct rtable *tunnel_rtable_get(struct ip_tunnel *t, u32 cookie) |
3109 | |
3110 | rcu_read_lock(); |
3111 | dst = rcu_dereference(this_cpu_ptr(t->dst_cache)->dst); |
3112 | + if (dst && !atomic_inc_not_zero(&dst->__refcnt)) |
3113 | + dst = NULL; |
3114 | if (dst) { |
3115 | if (dst->obsolete && dst->ops->check(dst, cookie) == NULL) { |
3116 | - rcu_read_unlock(); |
3117 | tunnel_dst_reset(t); |
3118 | - return NULL; |
3119 | + dst_release(dst); |
3120 | + dst = NULL; |
3121 | } |
3122 | - dst_hold(dst); |
3123 | } |
3124 | rcu_read_unlock(); |
3125 | return (struct rtable *)dst; |
3126 | @@ -173,6 +169,7 @@ struct ip_tunnel *ip_tunnel_lookup(struct ip_tunnel_net *itn, |
3127 | |
3128 | hlist_for_each_entry_rcu(t, head, hash_node) { |
3129 | if (remote != t->parms.iph.daddr || |
3130 | + t->parms.iph.saddr != 0 || |
3131 | !(t->dev->flags & IFF_UP)) |
3132 | continue; |
3133 | |
3134 | @@ -189,10 +186,11 @@ struct ip_tunnel *ip_tunnel_lookup(struct ip_tunnel_net *itn, |
3135 | head = &itn->tunnels[hash]; |
3136 | |
3137 | hlist_for_each_entry_rcu(t, head, hash_node) { |
3138 | - if ((local != t->parms.iph.saddr && |
3139 | - (local != t->parms.iph.daddr || |
3140 | - !ipv4_is_multicast(local))) || |
3141 | - !(t->dev->flags & IFF_UP)) |
3142 | + if ((local != t->parms.iph.saddr || t->parms.iph.daddr != 0) && |
3143 | + (local != t->parms.iph.daddr || !ipv4_is_multicast(local))) |
3144 | + continue; |
3145 | + |
3146 | + if (!(t->dev->flags & IFF_UP)) |
3147 | continue; |
3148 | |
3149 | if (!ip_tunnel_key_match(&t->parms, flags, key)) |
3150 | @@ -209,6 +207,8 @@ struct ip_tunnel *ip_tunnel_lookup(struct ip_tunnel_net *itn, |
3151 | |
3152 | hlist_for_each_entry_rcu(t, head, hash_node) { |
3153 | if (t->parms.i_key != key || |
3154 | + t->parms.iph.saddr != 0 || |
3155 | + t->parms.iph.daddr != 0 || |
3156 | !(t->dev->flags & IFF_UP)) |
3157 | continue; |
3158 | |
3159 | diff --git a/net/ipv4/route.c b/net/ipv4/route.c |
3160 | index 5e676be3daeb..be9f2b1ac3ab 100644 |
3161 | --- a/net/ipv4/route.c |
3162 | +++ b/net/ipv4/route.c |
3163 | @@ -1022,7 +1022,7 @@ void ipv4_sk_update_pmtu(struct sk_buff *skb, struct sock *sk, u32 mtu) |
3164 | const struct iphdr *iph = (const struct iphdr *) skb->data; |
3165 | struct flowi4 fl4; |
3166 | struct rtable *rt; |
3167 | - struct dst_entry *dst; |
3168 | + struct dst_entry *odst = NULL; |
3169 | bool new = false; |
3170 | |
3171 | bh_lock_sock(sk); |
3172 | @@ -1030,16 +1030,17 @@ void ipv4_sk_update_pmtu(struct sk_buff *skb, struct sock *sk, u32 mtu) |
3173 | if (!ip_sk_accept_pmtu(sk)) |
3174 | goto out; |
3175 | |
3176 | - rt = (struct rtable *) __sk_dst_get(sk); |
3177 | + odst = sk_dst_get(sk); |
3178 | |
3179 | - if (sock_owned_by_user(sk) || !rt) { |
3180 | + if (sock_owned_by_user(sk) || !odst) { |
3181 | __ipv4_sk_update_pmtu(skb, sk, mtu); |
3182 | goto out; |
3183 | } |
3184 | |
3185 | __build_flow_key(&fl4, sk, iph, 0, 0, 0, 0, 0); |
3186 | |
3187 | - if (!__sk_dst_check(sk, 0)) { |
3188 | + rt = (struct rtable *)odst; |
3189 | + if (odst->obsolete && odst->ops->check(odst, 0) == NULL) { |
3190 | rt = ip_route_output_flow(sock_net(sk), &fl4, sk); |
3191 | if (IS_ERR(rt)) |
3192 | goto out; |
3193 | @@ -1049,8 +1050,7 @@ void ipv4_sk_update_pmtu(struct sk_buff *skb, struct sock *sk, u32 mtu) |
3194 | |
3195 | __ip_rt_update_pmtu((struct rtable *) rt->dst.path, &fl4, mtu); |
3196 | |
3197 | - dst = dst_check(&rt->dst, 0); |
3198 | - if (!dst) { |
3199 | + if (!dst_check(&rt->dst, 0)) { |
3200 | if (new) |
3201 | dst_release(&rt->dst); |
3202 | |
3203 | @@ -1062,10 +1062,11 @@ void ipv4_sk_update_pmtu(struct sk_buff *skb, struct sock *sk, u32 mtu) |
3204 | } |
3205 | |
3206 | if (new) |
3207 | - __sk_dst_set(sk, &rt->dst); |
3208 | + sk_dst_set(sk, &rt->dst); |
3209 | |
3210 | out: |
3211 | bh_unlock_sock(sk); |
3212 | + dst_release(odst); |
3213 | } |
3214 | EXPORT_SYMBOL_GPL(ipv4_sk_update_pmtu); |
3215 | |
3216 | diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c |
3217 | index 4bd6d52eeffb..599e53e760e3 100644 |
3218 | --- a/net/ipv4/tcp.c |
3219 | +++ b/net/ipv4/tcp.c |
3220 | @@ -1108,7 +1108,7 @@ int tcp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, |
3221 | if (unlikely(tp->repair)) { |
3222 | if (tp->repair_queue == TCP_RECV_QUEUE) { |
3223 | copied = tcp_send_rcvq(sk, msg, size); |
3224 | - goto out; |
3225 | + goto out_nopush; |
3226 | } |
3227 | |
3228 | err = -EINVAL; |
3229 | @@ -1282,6 +1282,7 @@ wait_for_memory: |
3230 | out: |
3231 | if (copied) |
3232 | tcp_push(sk, flags, mss_now, tp->nonagle, size_goal); |
3233 | +out_nopush: |
3234 | release_sock(sk); |
3235 | return copied + copied_syn; |
3236 | |
3237 | diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c |
3238 | index 3a26b3b23f16..09b85cdda165 100644 |
3239 | --- a/net/ipv4/tcp_input.c |
3240 | +++ b/net/ipv4/tcp_input.c |
3241 | @@ -1106,7 +1106,7 @@ static bool tcp_check_dsack(struct sock *sk, const struct sk_buff *ack_skb, |
3242 | } |
3243 | |
3244 | /* D-SACK for already forgotten data... Do dumb counting. */ |
3245 | - if (dup_sack && tp->undo_marker && tp->undo_retrans && |
3246 | + if (dup_sack && tp->undo_marker && tp->undo_retrans > 0 && |
3247 | !after(end_seq_0, prior_snd_una) && |
3248 | after(end_seq_0, tp->undo_marker)) |
3249 | tp->undo_retrans--; |
3250 | @@ -1162,7 +1162,7 @@ static int tcp_match_skb_to_sack(struct sock *sk, struct sk_buff *skb, |
3251 | unsigned int new_len = (pkt_len / mss) * mss; |
3252 | if (!in_sack && new_len < pkt_len) { |
3253 | new_len += mss; |
3254 | - if (new_len > skb->len) |
3255 | + if (new_len >= skb->len) |
3256 | return 0; |
3257 | } |
3258 | pkt_len = new_len; |
3259 | @@ -1187,7 +1187,7 @@ static u8 tcp_sacktag_one(struct sock *sk, |
3260 | |
3261 | /* Account D-SACK for retransmitted packet. */ |
3262 | if (dup_sack && (sacked & TCPCB_RETRANS)) { |
3263 | - if (tp->undo_marker && tp->undo_retrans && |
3264 | + if (tp->undo_marker && tp->undo_retrans > 0 && |
3265 | after(end_seq, tp->undo_marker)) |
3266 | tp->undo_retrans--; |
3267 | if (sacked & TCPCB_SACKED_ACKED) |
3268 | @@ -1893,7 +1893,7 @@ static void tcp_clear_retrans_partial(struct tcp_sock *tp) |
3269 | tp->lost_out = 0; |
3270 | |
3271 | tp->undo_marker = 0; |
3272 | - tp->undo_retrans = 0; |
3273 | + tp->undo_retrans = -1; |
3274 | } |
3275 | |
3276 | void tcp_clear_retrans(struct tcp_sock *tp) |
3277 | @@ -2664,7 +2664,7 @@ static void tcp_enter_recovery(struct sock *sk, bool ece_ack) |
3278 | |
3279 | tp->prior_ssthresh = 0; |
3280 | tp->undo_marker = tp->snd_una; |
3281 | - tp->undo_retrans = tp->retrans_out; |
3282 | + tp->undo_retrans = tp->retrans_out ? : -1; |
3283 | |
3284 | if (inet_csk(sk)->icsk_ca_state < TCP_CA_CWR) { |
3285 | if (!ece_ack) |
3286 | diff --git a/net/ipv4/tcp_offload.c b/net/ipv4/tcp_offload.c |
3287 | index b92b81718ca4..c25953a386d0 100644 |
3288 | --- a/net/ipv4/tcp_offload.c |
3289 | +++ b/net/ipv4/tcp_offload.c |
3290 | @@ -310,7 +310,7 @@ static int tcp4_gro_complete(struct sk_buff *skb, int thoff) |
3291 | |
3292 | th->check = ~tcp_v4_check(skb->len - thoff, iph->saddr, |
3293 | iph->daddr, 0); |
3294 | - skb_shinfo(skb)->gso_type = SKB_GSO_TCPV4; |
3295 | + skb_shinfo(skb)->gso_type |= SKB_GSO_TCPV4; |
3296 | |
3297 | return tcp_gro_complete(skb); |
3298 | } |
3299 | diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c |
3300 | index 12d6016bdd9a..589b5ac1339e 100644 |
3301 | --- a/net/ipv4/tcp_output.c |
3302 | +++ b/net/ipv4/tcp_output.c |
3303 | @@ -2472,8 +2472,6 @@ int tcp_retransmit_skb(struct sock *sk, struct sk_buff *skb) |
3304 | if (!tp->retrans_stamp) |
3305 | tp->retrans_stamp = TCP_SKB_CB(skb)->when; |
3306 | |
3307 | - tp->undo_retrans += tcp_skb_pcount(skb); |
3308 | - |
3309 | /* snd_nxt is stored to detect loss of retransmitted segment, |
3310 | * see tcp_input.c tcp_sacktag_write_queue(). |
3311 | */ |
3312 | @@ -2481,6 +2479,10 @@ int tcp_retransmit_skb(struct sock *sk, struct sk_buff *skb) |
3313 | } else { |
3314 | NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPRETRANSFAIL); |
3315 | } |
3316 | + |
3317 | + if (tp->undo_retrans < 0) |
3318 | + tp->undo_retrans = 0; |
3319 | + tp->undo_retrans += tcp_skb_pcount(skb); |
3320 | return err; |
3321 | } |
3322 | |
3323 | diff --git a/net/ipv6/tcpv6_offload.c b/net/ipv6/tcpv6_offload.c |
3324 | index 8517d3cd1aed..01b0ff9a0c2c 100644 |
3325 | --- a/net/ipv6/tcpv6_offload.c |
3326 | +++ b/net/ipv6/tcpv6_offload.c |
3327 | @@ -73,7 +73,7 @@ static int tcp6_gro_complete(struct sk_buff *skb, int thoff) |
3328 | |
3329 | th->check = ~tcp_v6_check(skb->len - thoff, &iph->saddr, |
3330 | &iph->daddr, 0); |
3331 | - skb_shinfo(skb)->gso_type = SKB_GSO_TCPV6; |
3332 | + skb_shinfo(skb)->gso_type |= SKB_GSO_TCPV6; |
3333 | |
3334 | return tcp_gro_complete(skb); |
3335 | } |
3336 | diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c |
3337 | index f22757a29cd0..6c0fe9766094 100644 |
3338 | --- a/net/netlink/af_netlink.c |
3339 | +++ b/net/netlink/af_netlink.c |
3340 | @@ -636,7 +636,7 @@ static unsigned int netlink_poll(struct file *file, struct socket *sock, |
3341 | while (nlk->cb_running && netlink_dump_space(nlk)) { |
3342 | err = netlink_dump(sk); |
3343 | if (err < 0) { |
3344 | - sk->sk_err = err; |
3345 | + sk->sk_err = -err; |
3346 | sk->sk_error_report(sk); |
3347 | break; |
3348 | } |
3349 | @@ -2453,7 +2453,7 @@ static int netlink_recvmsg(struct kiocb *kiocb, struct socket *sock, |
3350 | atomic_read(&sk->sk_rmem_alloc) <= sk->sk_rcvbuf / 2) { |
3351 | ret = netlink_dump(sk); |
3352 | if (ret) { |
3353 | - sk->sk_err = ret; |
3354 | + sk->sk_err = -ret; |
3355 | sk->sk_error_report(sk); |
3356 | } |
3357 | } |
3358 | diff --git a/net/sctp/sysctl.c b/net/sctp/sysctl.c |
3359 | index c82fdc1eab7c..dfa532f00d88 100644 |
3360 | --- a/net/sctp/sysctl.c |
3361 | +++ b/net/sctp/sysctl.c |
3362 | @@ -307,41 +307,40 @@ static int proc_sctp_do_hmac_alg(struct ctl_table *ctl, int write, |
3363 | loff_t *ppos) |
3364 | { |
3365 | struct net *net = current->nsproxy->net_ns; |
3366 | - char tmp[8]; |
3367 | struct ctl_table tbl; |
3368 | - int ret; |
3369 | - int changed = 0; |
3370 | + bool changed = false; |
3371 | char *none = "none"; |
3372 | + char tmp[8]; |
3373 | + int ret; |
3374 | |
3375 | memset(&tbl, 0, sizeof(struct ctl_table)); |
3376 | |
3377 | if (write) { |
3378 | tbl.data = tmp; |
3379 | - tbl.maxlen = 8; |
3380 | + tbl.maxlen = sizeof(tmp); |
3381 | } else { |
3382 | tbl.data = net->sctp.sctp_hmac_alg ? : none; |
3383 | tbl.maxlen = strlen(tbl.data); |
3384 | } |
3385 | - ret = proc_dostring(&tbl, write, buffer, lenp, ppos); |
3386 | |
3387 | - if (write) { |
3388 | + ret = proc_dostring(&tbl, write, buffer, lenp, ppos); |
3389 | + if (write && ret == 0) { |
3390 | #ifdef CONFIG_CRYPTO_MD5 |
3391 | if (!strncmp(tmp, "md5", 3)) { |
3392 | net->sctp.sctp_hmac_alg = "md5"; |
3393 | - changed = 1; |
3394 | + changed = true; |
3395 | } |
3396 | #endif |
3397 | #ifdef CONFIG_CRYPTO_SHA1 |
3398 | if (!strncmp(tmp, "sha1", 4)) { |
3399 | net->sctp.sctp_hmac_alg = "sha1"; |
3400 | - changed = 1; |
3401 | + changed = true; |
3402 | } |
3403 | #endif |
3404 | if (!strncmp(tmp, "none", 4)) { |
3405 | net->sctp.sctp_hmac_alg = NULL; |
3406 | - changed = 1; |
3407 | + changed = true; |
3408 | } |
3409 | - |
3410 | if (!changed) |
3411 | ret = -EINVAL; |
3412 | } |
3413 | @@ -354,11 +353,10 @@ static int proc_sctp_do_rto_min(struct ctl_table *ctl, int write, |
3414 | loff_t *ppos) |
3415 | { |
3416 | struct net *net = current->nsproxy->net_ns; |
3417 | - int new_value; |
3418 | - struct ctl_table tbl; |
3419 | unsigned int min = *(unsigned int *) ctl->extra1; |
3420 | unsigned int max = *(unsigned int *) ctl->extra2; |
3421 | - int ret; |
3422 | + struct ctl_table tbl; |
3423 | + int ret, new_value; |
3424 | |
3425 | memset(&tbl, 0, sizeof(struct ctl_table)); |
3426 | tbl.maxlen = sizeof(unsigned int); |
3427 | @@ -367,12 +365,15 @@ static int proc_sctp_do_rto_min(struct ctl_table *ctl, int write, |
3428 | tbl.data = &new_value; |
3429 | else |
3430 | tbl.data = &net->sctp.rto_min; |
3431 | + |
3432 | ret = proc_dointvec(&tbl, write, buffer, lenp, ppos); |
3433 | - if (write) { |
3434 | - if (ret || new_value > max || new_value < min) |
3435 | + if (write && ret == 0) { |
3436 | + if (new_value > max || new_value < min) |
3437 | return -EINVAL; |
3438 | + |
3439 | net->sctp.rto_min = new_value; |
3440 | } |
3441 | + |
3442 | return ret; |
3443 | } |
3444 | |
3445 | @@ -381,11 +382,10 @@ static int proc_sctp_do_rto_max(struct ctl_table *ctl, int write, |
3446 | loff_t *ppos) |
3447 | { |
3448 | struct net *net = current->nsproxy->net_ns; |
3449 | - int new_value; |
3450 | - struct ctl_table tbl; |
3451 | unsigned int min = *(unsigned int *) ctl->extra1; |
3452 | unsigned int max = *(unsigned int *) ctl->extra2; |
3453 | - int ret; |
3454 | + struct ctl_table tbl; |
3455 | + int ret, new_value; |
3456 | |
3457 | memset(&tbl, 0, sizeof(struct ctl_table)); |
3458 | tbl.maxlen = sizeof(unsigned int); |
3459 | @@ -394,12 +394,15 @@ static int proc_sctp_do_rto_max(struct ctl_table *ctl, int write, |
3460 | tbl.data = &new_value; |
3461 | else |
3462 | tbl.data = &net->sctp.rto_max; |
3463 | + |
3464 | ret = proc_dointvec(&tbl, write, buffer, lenp, ppos); |
3465 | - if (write) { |
3466 | - if (ret || new_value > max || new_value < min) |
3467 | + if (write && ret == 0) { |
3468 | + if (new_value > max || new_value < min) |
3469 | return -EINVAL; |
3470 | + |
3471 | net->sctp.rto_max = new_value; |
3472 | } |
3473 | + |
3474 | return ret; |
3475 | } |
3476 | |
3477 | @@ -420,8 +423,7 @@ static int proc_sctp_do_auth(struct ctl_table *ctl, int write, |
3478 | tbl.data = &net->sctp.auth_enable; |
3479 | |
3480 | ret = proc_dointvec(&tbl, write, buffer, lenp, ppos); |
3481 | - |
3482 | - if (write) { |
3483 | + if (write && ret == 0) { |
3484 | struct sock *sk = net->sctp.ctl_sock; |
3485 | |
3486 | net->sctp.auth_enable = new_value; |
3487 | diff --git a/net/sctp/ulpevent.c b/net/sctp/ulpevent.c |
3488 | index 85c64658bd0b..b6842fdb53d4 100644 |
3489 | --- a/net/sctp/ulpevent.c |
3490 | +++ b/net/sctp/ulpevent.c |
3491 | @@ -366,9 +366,10 @@ fail: |
3492 | * specification [SCTP] and any extensions for a list of possible |
3493 | * error formats. |
3494 | */ |
3495 | -struct sctp_ulpevent *sctp_ulpevent_make_remote_error( |
3496 | - const struct sctp_association *asoc, struct sctp_chunk *chunk, |
3497 | - __u16 flags, gfp_t gfp) |
3498 | +struct sctp_ulpevent * |
3499 | +sctp_ulpevent_make_remote_error(const struct sctp_association *asoc, |
3500 | + struct sctp_chunk *chunk, __u16 flags, |
3501 | + gfp_t gfp) |
3502 | { |
3503 | struct sctp_ulpevent *event; |
3504 | struct sctp_remote_error *sre; |
3505 | @@ -387,8 +388,7 @@ struct sctp_ulpevent *sctp_ulpevent_make_remote_error( |
3506 | /* Copy the skb to a new skb with room for us to prepend |
3507 | * notification with. |
3508 | */ |
3509 | - skb = skb_copy_expand(chunk->skb, sizeof(struct sctp_remote_error), |
3510 | - 0, gfp); |
3511 | + skb = skb_copy_expand(chunk->skb, sizeof(*sre), 0, gfp); |
3512 | |
3513 | /* Pull off the rest of the cause TLV from the chunk. */ |
3514 | skb_pull(chunk->skb, elen); |
3515 | @@ -399,62 +399,21 @@ struct sctp_ulpevent *sctp_ulpevent_make_remote_error( |
3516 | event = sctp_skb2event(skb); |
3517 | sctp_ulpevent_init(event, MSG_NOTIFICATION, skb->truesize); |
3518 | |
3519 | - sre = (struct sctp_remote_error *) |
3520 | - skb_push(skb, sizeof(struct sctp_remote_error)); |
3521 | + sre = (struct sctp_remote_error *) skb_push(skb, sizeof(*sre)); |
3522 | |
3523 | /* Trim the buffer to the right length. */ |
3524 | - skb_trim(skb, sizeof(struct sctp_remote_error) + elen); |
3525 | + skb_trim(skb, sizeof(*sre) + elen); |
3526 | |
3527 | - /* Socket Extensions for SCTP |
3528 | - * 5.3.1.3 SCTP_REMOTE_ERROR |
3529 | - * |
3530 | - * sre_type: |
3531 | - * It should be SCTP_REMOTE_ERROR. |
3532 | - */ |
3533 | + /* RFC6458, Section 6.1.3. SCTP_REMOTE_ERROR */ |
3534 | + memset(sre, 0, sizeof(*sre)); |
3535 | sre->sre_type = SCTP_REMOTE_ERROR; |
3536 | - |
3537 | - /* |
3538 | - * Socket Extensions for SCTP |
3539 | - * 5.3.1.3 SCTP_REMOTE_ERROR |
3540 | - * |
3541 | - * sre_flags: 16 bits (unsigned integer) |
3542 | - * Currently unused. |
3543 | - */ |
3544 | sre->sre_flags = 0; |
3545 | - |
3546 | - /* Socket Extensions for SCTP |
3547 | - * 5.3.1.3 SCTP_REMOTE_ERROR |
3548 | - * |
3549 | - * sre_length: sizeof (__u32) |
3550 | - * |
3551 | - * This field is the total length of the notification data, |
3552 | - * including the notification header. |
3553 | - */ |
3554 | sre->sre_length = skb->len; |
3555 | - |
3556 | - /* Socket Extensions for SCTP |
3557 | - * 5.3.1.3 SCTP_REMOTE_ERROR |
3558 | - * |
3559 | - * sre_error: 16 bits (unsigned integer) |
3560 | - * This value represents one of the Operational Error causes defined in |
3561 | - * the SCTP specification, in network byte order. |
3562 | - */ |
3563 | sre->sre_error = cause; |
3564 | - |
3565 | - /* Socket Extensions for SCTP |
3566 | - * 5.3.1.3 SCTP_REMOTE_ERROR |
3567 | - * |
3568 | - * sre_assoc_id: sizeof (sctp_assoc_t) |
3569 | - * |
3570 | - * The association id field, holds the identifier for the association. |
3571 | - * All notifications for a given association have the same association |
3572 | - * identifier. For TCP style socket, this field is ignored. |
3573 | - */ |
3574 | sctp_ulpevent_set_owner(event, asoc); |
3575 | sre->sre_assoc_id = sctp_assoc2id(asoc); |
3576 | |
3577 | return event; |
3578 | - |
3579 | fail: |
3580 | return NULL; |
3581 | } |
3582 | @@ -899,7 +858,9 @@ __u16 sctp_ulpevent_get_notification_type(const struct sctp_ulpevent *event) |
3583 | return notification->sn_header.sn_type; |
3584 | } |
3585 | |
3586 | -/* Copy out the sndrcvinfo into a msghdr. */ |
3587 | +/* RFC6458, Section 5.3.2. SCTP Header Information Structure |
3588 | + * (SCTP_SNDRCV, DEPRECATED) |
3589 | + */ |
3590 | void sctp_ulpevent_read_sndrcvinfo(const struct sctp_ulpevent *event, |
3591 | struct msghdr *msghdr) |
3592 | { |
3593 | @@ -908,74 +869,21 @@ void sctp_ulpevent_read_sndrcvinfo(const struct sctp_ulpevent *event, |
3594 | if (sctp_ulpevent_is_notification(event)) |
3595 | return; |
3596 | |
3597 | - /* Sockets API Extensions for SCTP |
3598 | - * Section 5.2.2 SCTP Header Information Structure (SCTP_SNDRCV) |
3599 | - * |
3600 | - * sinfo_stream: 16 bits (unsigned integer) |
3601 | - * |
3602 | - * For recvmsg() the SCTP stack places the message's stream number in |
3603 | - * this value. |
3604 | - */ |
3605 | + memset(&sinfo, 0, sizeof(sinfo)); |
3606 | sinfo.sinfo_stream = event->stream; |
3607 | - /* sinfo_ssn: 16 bits (unsigned integer) |
3608 | - * |
3609 | - * For recvmsg() this value contains the stream sequence number that |
3610 | - * the remote endpoint placed in the DATA chunk. For fragmented |
3611 | - * messages this is the same number for all deliveries of the message |
3612 | - * (if more than one recvmsg() is needed to read the message). |
3613 | - */ |
3614 | sinfo.sinfo_ssn = event->ssn; |
3615 | - /* sinfo_ppid: 32 bits (unsigned integer) |
3616 | - * |
3617 | - * In recvmsg() this value is |
3618 | - * the same information that was passed by the upper layer in the peer |
3619 | - * application. Please note that byte order issues are NOT accounted |
3620 | - * for and this information is passed opaquely by the SCTP stack from |
3621 | - * one end to the other. |
3622 | - */ |
3623 | sinfo.sinfo_ppid = event->ppid; |
3624 | - /* sinfo_flags: 16 bits (unsigned integer) |
3625 | - * |
3626 | - * This field may contain any of the following flags and is composed of |
3627 | - * a bitwise OR of these values. |
3628 | - * |
3629 | - * recvmsg() flags: |
3630 | - * |
3631 | - * SCTP_UNORDERED - This flag is present when the message was sent |
3632 | - * non-ordered. |
3633 | - */ |
3634 | sinfo.sinfo_flags = event->flags; |
3635 | - /* sinfo_tsn: 32 bit (unsigned integer) |
3636 | - * |
3637 | - * For the receiving side, this field holds a TSN that was |
3638 | - * assigned to one of the SCTP Data Chunks. |
3639 | - */ |
3640 | sinfo.sinfo_tsn = event->tsn; |
3641 | - /* sinfo_cumtsn: 32 bit (unsigned integer) |
3642 | - * |
3643 | - * This field will hold the current cumulative TSN as |
3644 | - * known by the underlying SCTP layer. Note this field is |
3645 | - * ignored when sending and only valid for a receive |
3646 | - * operation when sinfo_flags are set to SCTP_UNORDERED. |
3647 | - */ |
3648 | sinfo.sinfo_cumtsn = event->cumtsn; |
3649 | - /* sinfo_assoc_id: sizeof (sctp_assoc_t) |
3650 | - * |
3651 | - * The association handle field, sinfo_assoc_id, holds the identifier |
3652 | - * for the association announced in the COMMUNICATION_UP notification. |
3653 | - * All notifications for a given association have the same identifier. |
3654 | - * Ignored for one-to-one style sockets. |
3655 | - */ |
3656 | sinfo.sinfo_assoc_id = sctp_assoc2id(event->asoc); |
3657 | - |
3658 | - /* context value that is set via SCTP_CONTEXT socket option. */ |
3659 | + /* Context value that is set via SCTP_CONTEXT socket option. */ |
3660 | sinfo.sinfo_context = event->asoc->default_rcv_context; |
3661 | - |
3662 | /* These fields are not used while receiving. */ |
3663 | sinfo.sinfo_timetolive = 0; |
3664 | |
3665 | put_cmsg(msghdr, IPPROTO_SCTP, SCTP_SNDRCV, |
3666 | - sizeof(struct sctp_sndrcvinfo), (void *)&sinfo); |
3667 | + sizeof(sinfo), &sinfo); |
3668 | } |
3669 | |
3670 | /* Do accounting for bytes received and hold a reference to the association |
3671 | diff --git a/net/tipc/bcast.c b/net/tipc/bcast.c |
3672 | index 95ab5ef92920..958279c8e7d7 100644 |
3673 | --- a/net/tipc/bcast.c |
3674 | +++ b/net/tipc/bcast.c |
3675 | @@ -536,6 +536,7 @@ receive: |
3676 | |
3677 | buf = node->bclink.deferred_head; |
3678 | node->bclink.deferred_head = buf->next; |
3679 | + buf->next = NULL; |
3680 | node->bclink.deferred_size--; |
3681 | goto receive; |
3682 | } |
3683 | diff --git a/sound/pci/hda/hda_controller.c b/sound/pci/hda/hda_controller.c |
3684 | index 480bbddbd801..6df04d91c93c 100644 |
3685 | --- a/sound/pci/hda/hda_controller.c |
3686 | +++ b/sound/pci/hda/hda_controller.c |
3687 | @@ -193,7 +193,8 @@ azx_assign_device(struct azx *chip, struct snd_pcm_substream *substream) |
3688 | dsp_unlock(azx_dev); |
3689 | return azx_dev; |
3690 | } |
3691 | - if (!res) |
3692 | + if (!res || |
3693 | + (chip->driver_caps & AZX_DCAPS_REVERSE_ASSIGN)) |
3694 | res = azx_dev; |
3695 | } |
3696 | dsp_unlock(azx_dev); |
3697 | diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c |
3698 | index bc36f9cdd9d2..893beca9d45f 100644 |
3699 | --- a/sound/pci/hda/hda_intel.c |
3700 | +++ b/sound/pci/hda/hda_intel.c |
3701 | @@ -227,7 +227,7 @@ enum { |
3702 | /* quirks for Intel PCH */ |
3703 | #define AZX_DCAPS_INTEL_PCH_NOPM \ |
3704 | (AZX_DCAPS_SCH_SNOOP | AZX_DCAPS_BUFSIZE | \ |
3705 | - AZX_DCAPS_COUNT_LPIB_DELAY) |
3706 | + AZX_DCAPS_COUNT_LPIB_DELAY | AZX_DCAPS_REVERSE_ASSIGN) |
3707 | |
3708 | #define AZX_DCAPS_INTEL_PCH \ |
3709 | (AZX_DCAPS_INTEL_PCH_NOPM | AZX_DCAPS_PM_RUNTIME) |
3710 | @@ -590,7 +590,7 @@ static int azx_suspend(struct device *dev) |
3711 | struct azx *chip = card->private_data; |
3712 | struct azx_pcm *p; |
3713 | |
3714 | - if (chip->disabled) |
3715 | + if (chip->disabled || chip->init_failed) |
3716 | return 0; |
3717 | |
3718 | snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); |
3719 | @@ -622,7 +622,7 @@ static int azx_resume(struct device *dev) |
3720 | struct snd_card *card = dev_get_drvdata(dev); |
3721 | struct azx *chip = card->private_data; |
3722 | |
3723 | - if (chip->disabled) |
3724 | + if (chip->disabled || chip->init_failed) |
3725 | return 0; |
3726 | |
3727 | if (chip->driver_caps & AZX_DCAPS_I915_POWERWELL) { |
3728 | @@ -659,7 +659,7 @@ static int azx_runtime_suspend(struct device *dev) |
3729 | struct snd_card *card = dev_get_drvdata(dev); |
3730 | struct azx *chip = card->private_data; |
3731 | |
3732 | - if (chip->disabled) |
3733 | + if (chip->disabled || chip->init_failed) |
3734 | return 0; |
3735 | |
3736 | if (!(chip->driver_caps & AZX_DCAPS_PM_RUNTIME)) |
3737 | @@ -686,7 +686,7 @@ static int azx_runtime_resume(struct device *dev) |
3738 | struct hda_codec *codec; |
3739 | int status; |
3740 | |
3741 | - if (chip->disabled) |
3742 | + if (chip->disabled || chip->init_failed) |
3743 | return 0; |
3744 | |
3745 | if (!(chip->driver_caps & AZX_DCAPS_PM_RUNTIME)) |
3746 | @@ -723,7 +723,7 @@ static int azx_runtime_idle(struct device *dev) |
3747 | struct snd_card *card = dev_get_drvdata(dev); |
3748 | struct azx *chip = card->private_data; |
3749 | |
3750 | - if (chip->disabled) |
3751 | + if (chip->disabled || chip->init_failed) |
3752 | return 0; |
3753 | |
3754 | if (!power_save_controller || |
3755 | diff --git a/sound/pci/hda/hda_priv.h b/sound/pci/hda/hda_priv.h |
3756 | index 4a7cb01fa912..e9d1a5762a55 100644 |
3757 | --- a/sound/pci/hda/hda_priv.h |
3758 | +++ b/sound/pci/hda/hda_priv.h |
3759 | @@ -186,6 +186,7 @@ enum { SDI0, SDI1, SDI2, SDI3, SDO0, SDO1, SDO2, SDO3 }; |
3760 | #define AZX_DCAPS_BUFSIZE (1 << 21) /* no buffer size alignment */ |
3761 | #define AZX_DCAPS_ALIGN_BUFSIZE (1 << 22) /* buffer size alignment */ |
3762 | #define AZX_DCAPS_4K_BDLE_BOUNDARY (1 << 23) /* BDLE in 4k boundary */ |
3763 | +#define AZX_DCAPS_REVERSE_ASSIGN (1 << 24) /* Assign devices in reverse order */ |
3764 | #define AZX_DCAPS_COUNT_LPIB_DELAY (1 << 25) /* Take LPIB as delay */ |
3765 | #define AZX_DCAPS_PM_RUNTIME (1 << 26) /* runtime PM support */ |
3766 | #define AZX_DCAPS_I915_POWERWELL (1 << 27) /* HSW i915 powerwell support */ |