Annotation of /trunk/kernel-magellan/patches-3.14/0100-3.14.1-all-fixes.patch
Parent Directory | Revision Log
Revision 2437 -
(hide annotations)
(download)
Thu Jun 5 08:04:56 2014 UTC (10 years, 5 months ago) by niro
File size: 37902 byte(s)
Thu Jun 5 08:04:56 2014 UTC (10 years, 5 months ago) by niro
File size: 37902 byte(s)
-linux-3.14.5
1 | niro | 2437 | diff --git a/Makefile b/Makefile |
2 | index e5ac8a62e6e5..7d0b6992d9ed 100644 | ||
3 | --- a/Makefile | ||
4 | +++ b/Makefile | ||
5 | @@ -1,6 +1,6 @@ | ||
6 | VERSION = 3 | ||
7 | PATCHLEVEL = 14 | ||
8 | -SUBLEVEL = 0 | ||
9 | +SUBLEVEL = 1 | ||
10 | EXTRAVERSION = | ||
11 | NAME = Shuffling Zombie Juror | ||
12 | |||
13 | diff --git a/arch/arc/boot/dts/nsimosci.dts b/arch/arc/boot/dts/nsimosci.dts | ||
14 | index ea16d782af58..4f31b2eb5cdf 100644 | ||
15 | --- a/arch/arc/boot/dts/nsimosci.dts | ||
16 | +++ b/arch/arc/boot/dts/nsimosci.dts | ||
17 | @@ -11,13 +11,16 @@ | ||
18 | |||
19 | / { | ||
20 | compatible = "snps,nsimosci"; | ||
21 | - clock-frequency = <80000000>; /* 80 MHZ */ | ||
22 | + clock-frequency = <20000000>; /* 20 MHZ */ | ||
23 | #address-cells = <1>; | ||
24 | #size-cells = <1>; | ||
25 | interrupt-parent = <&intc>; | ||
26 | |||
27 | chosen { | ||
28 | - bootargs = "console=tty0 consoleblank=0"; | ||
29 | + /* this is for console on PGU */ | ||
30 | + /* bootargs = "console=tty0 consoleblank=0"; */ | ||
31 | + /* this is for console on serial */ | ||
32 | + bootargs = "earlycon=uart8250,mmio32,0xc0000000,115200n8 console=ttyS0,115200n8 consoleblank=0 debug"; | ||
33 | }; | ||
34 | |||
35 | aliases { | ||
36 | @@ -44,15 +47,14 @@ | ||
37 | }; | ||
38 | |||
39 | uart0: serial@c0000000 { | ||
40 | - compatible = "snps,dw-apb-uart"; | ||
41 | + compatible = "ns8250"; | ||
42 | reg = <0xc0000000 0x2000>; | ||
43 | interrupts = <11>; | ||
44 | - #clock-frequency = <80000000>; | ||
45 | clock-frequency = <3686400>; | ||
46 | baud = <115200>; | ||
47 | reg-shift = <2>; | ||
48 | reg-io-width = <4>; | ||
49 | - status = "okay"; | ||
50 | + no-loopback-test = <1>; | ||
51 | }; | ||
52 | |||
53 | pgu0: pgu@c9000000 { | ||
54 | diff --git a/arch/arc/configs/nsimosci_defconfig b/arch/arc/configs/nsimosci_defconfig | ||
55 | index 451af30914f6..c01ba35a4eff 100644 | ||
56 | --- a/arch/arc/configs/nsimosci_defconfig | ||
57 | +++ b/arch/arc/configs/nsimosci_defconfig | ||
58 | @@ -54,6 +54,7 @@ CONFIG_SERIO_ARC_PS2=y | ||
59 | CONFIG_SERIAL_8250=y | ||
60 | CONFIG_SERIAL_8250_CONSOLE=y | ||
61 | CONFIG_SERIAL_8250_DW=y | ||
62 | +CONFIG_SERIAL_OF_PLATFORM=y | ||
63 | CONFIG_SERIAL_ARC=y | ||
64 | CONFIG_SERIAL_ARC_CONSOLE=y | ||
65 | # CONFIG_HW_RANDOM is not set | ||
66 | diff --git a/arch/m68k/Kconfig b/arch/m68k/Kconfig | ||
67 | index dbdd2231c75d..b2e322939256 100644 | ||
68 | --- a/arch/m68k/Kconfig | ||
69 | +++ b/arch/m68k/Kconfig | ||
70 | @@ -17,6 +17,7 @@ config M68K | ||
71 | select FPU if MMU | ||
72 | select ARCH_WANT_IPC_PARSE_VERSION | ||
73 | select ARCH_USES_GETTIMEOFFSET if MMU && !COLDFIRE | ||
74 | + select HAVE_FUTEX_CMPXCHG if MMU && FUTEX | ||
75 | select HAVE_MOD_ARCH_SPECIFIC | ||
76 | select MODULES_USE_ELF_REL | ||
77 | select MODULES_USE_ELF_RELA | ||
78 | diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig | ||
79 | index 65a07750f4f9..bb74b21f007a 100644 | ||
80 | --- a/arch/s390/Kconfig | ||
81 | +++ b/arch/s390/Kconfig | ||
82 | @@ -117,6 +117,7 @@ config S390 | ||
83 | select HAVE_FUNCTION_GRAPH_TRACER | ||
84 | select HAVE_FUNCTION_TRACER | ||
85 | select HAVE_FUNCTION_TRACE_MCOUNT_TEST | ||
86 | + select HAVE_FUTEX_CMPXCHG if FUTEX | ||
87 | select HAVE_KERNEL_BZIP2 | ||
88 | select HAVE_KERNEL_GZIP | ||
89 | select HAVE_KERNEL_LZ4 | ||
90 | diff --git a/arch/x86/crypto/ghash-clmulni-intel_asm.S b/arch/x86/crypto/ghash-clmulni-intel_asm.S | ||
91 | index 586f41aac361..185fad49d86f 100644 | ||
92 | --- a/arch/x86/crypto/ghash-clmulni-intel_asm.S | ||
93 | +++ b/arch/x86/crypto/ghash-clmulni-intel_asm.S | ||
94 | @@ -24,10 +24,6 @@ | ||
95 | .align 16 | ||
96 | .Lbswap_mask: | ||
97 | .octa 0x000102030405060708090a0b0c0d0e0f | ||
98 | -.Lpoly: | ||
99 | - .octa 0xc2000000000000000000000000000001 | ||
100 | -.Ltwo_one: | ||
101 | - .octa 0x00000001000000000000000000000001 | ||
102 | |||
103 | #define DATA %xmm0 | ||
104 | #define SHASH %xmm1 | ||
105 | @@ -134,28 +130,3 @@ ENTRY(clmul_ghash_update) | ||
106 | .Lupdate_just_ret: | ||
107 | ret | ||
108 | ENDPROC(clmul_ghash_update) | ||
109 | - | ||
110 | -/* | ||
111 | - * void clmul_ghash_setkey(be128 *shash, const u8 *key); | ||
112 | - * | ||
113 | - * Calculate hash_key << 1 mod poly | ||
114 | - */ | ||
115 | -ENTRY(clmul_ghash_setkey) | ||
116 | - movaps .Lbswap_mask, BSWAP | ||
117 | - movups (%rsi), %xmm0 | ||
118 | - PSHUFB_XMM BSWAP %xmm0 | ||
119 | - movaps %xmm0, %xmm1 | ||
120 | - psllq $1, %xmm0 | ||
121 | - psrlq $63, %xmm1 | ||
122 | - movaps %xmm1, %xmm2 | ||
123 | - pslldq $8, %xmm1 | ||
124 | - psrldq $8, %xmm2 | ||
125 | - por %xmm1, %xmm0 | ||
126 | - # reduction | ||
127 | - pshufd $0b00100100, %xmm2, %xmm1 | ||
128 | - pcmpeqd .Ltwo_one, %xmm1 | ||
129 | - pand .Lpoly, %xmm1 | ||
130 | - pxor %xmm1, %xmm0 | ||
131 | - movups %xmm0, (%rdi) | ||
132 | - ret | ||
133 | -ENDPROC(clmul_ghash_setkey) | ||
134 | diff --git a/arch/x86/crypto/ghash-clmulni-intel_glue.c b/arch/x86/crypto/ghash-clmulni-intel_glue.c | ||
135 | index 6759dd1135be..d785cf2c529c 100644 | ||
136 | --- a/arch/x86/crypto/ghash-clmulni-intel_glue.c | ||
137 | +++ b/arch/x86/crypto/ghash-clmulni-intel_glue.c | ||
138 | @@ -30,8 +30,6 @@ void clmul_ghash_mul(char *dst, const be128 *shash); | ||
139 | void clmul_ghash_update(char *dst, const char *src, unsigned int srclen, | ||
140 | const be128 *shash); | ||
141 | |||
142 | -void clmul_ghash_setkey(be128 *shash, const u8 *key); | ||
143 | - | ||
144 | struct ghash_async_ctx { | ||
145 | struct cryptd_ahash *cryptd_tfm; | ||
146 | }; | ||
147 | @@ -58,13 +56,23 @@ static int ghash_setkey(struct crypto_shash *tfm, | ||
148 | const u8 *key, unsigned int keylen) | ||
149 | { | ||
150 | struct ghash_ctx *ctx = crypto_shash_ctx(tfm); | ||
151 | + be128 *x = (be128 *)key; | ||
152 | + u64 a, b; | ||
153 | |||
154 | if (keylen != GHASH_BLOCK_SIZE) { | ||
155 | crypto_shash_set_flags(tfm, CRYPTO_TFM_RES_BAD_KEY_LEN); | ||
156 | return -EINVAL; | ||
157 | } | ||
158 | |||
159 | - clmul_ghash_setkey(&ctx->shash, key); | ||
160 | + /* perform multiplication by 'x' in GF(2^128) */ | ||
161 | + a = be64_to_cpu(x->a); | ||
162 | + b = be64_to_cpu(x->b); | ||
163 | + | ||
164 | + ctx->shash.a = (__be64)((b << 1) | (a >> 63)); | ||
165 | + ctx->shash.b = (__be64)((a << 1) | (b >> 63)); | ||
166 | + | ||
167 | + if (a >> 63) | ||
168 | + ctx->shash.b ^= cpu_to_be64(0xc2); | ||
169 | |||
170 | return 0; | ||
171 | } | ||
172 | diff --git a/arch/x86/include/asm/efi.h b/arch/x86/include/asm/efi.h | ||
173 | index acd86c850414..f949715e3957 100644 | ||
174 | --- a/arch/x86/include/asm/efi.h | ||
175 | +++ b/arch/x86/include/asm/efi.h | ||
176 | @@ -130,7 +130,8 @@ extern void efi_memory_uc(u64 addr, unsigned long size); | ||
177 | extern void __init efi_map_region(efi_memory_desc_t *md); | ||
178 | extern void __init efi_map_region_fixed(efi_memory_desc_t *md); | ||
179 | extern void efi_sync_low_kernel_mappings(void); | ||
180 | -extern void efi_setup_page_tables(void); | ||
181 | +extern int efi_setup_page_tables(unsigned long pa_memmap, unsigned num_pages); | ||
182 | +extern void efi_cleanup_page_tables(unsigned long pa_memmap, unsigned num_pages); | ||
183 | extern void __init old_map_region(efi_memory_desc_t *md); | ||
184 | extern void __init runtime_code_page_mkexec(void); | ||
185 | extern void __init efi_runtime_mkexec(void); | ||
186 | diff --git a/arch/x86/include/asm/pgtable_types.h b/arch/x86/include/asm/pgtable_types.h | ||
187 | index 1aa9ccd43223..94e40f1efdfd 100644 | ||
188 | --- a/arch/x86/include/asm/pgtable_types.h | ||
189 | +++ b/arch/x86/include/asm/pgtable_types.h | ||
190 | @@ -385,6 +385,8 @@ extern pte_t *lookup_address(unsigned long address, unsigned int *level); | ||
191 | extern phys_addr_t slow_virt_to_phys(void *__address); | ||
192 | extern int kernel_map_pages_in_pgd(pgd_t *pgd, u64 pfn, unsigned long address, | ||
193 | unsigned numpages, unsigned long page_flags); | ||
194 | +void kernel_unmap_pages_in_pgd(pgd_t *root, unsigned long address, | ||
195 | + unsigned numpages); | ||
196 | #endif /* !__ASSEMBLY__ */ | ||
197 | |||
198 | #endif /* _ASM_X86_PGTABLE_DEFS_H */ | ||
199 | diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c | ||
200 | index b3b19f46c016..a3488689e301 100644 | ||
201 | --- a/arch/x86/mm/pageattr.c | ||
202 | +++ b/arch/x86/mm/pageattr.c | ||
203 | @@ -692,6 +692,18 @@ static bool try_to_free_pmd_page(pmd_t *pmd) | ||
204 | return true; | ||
205 | } | ||
206 | |||
207 | +static bool try_to_free_pud_page(pud_t *pud) | ||
208 | +{ | ||
209 | + int i; | ||
210 | + | ||
211 | + for (i = 0; i < PTRS_PER_PUD; i++) | ||
212 | + if (!pud_none(pud[i])) | ||
213 | + return false; | ||
214 | + | ||
215 | + free_page((unsigned long)pud); | ||
216 | + return true; | ||
217 | +} | ||
218 | + | ||
219 | static bool unmap_pte_range(pmd_t *pmd, unsigned long start, unsigned long end) | ||
220 | { | ||
221 | pte_t *pte = pte_offset_kernel(pmd, start); | ||
222 | @@ -805,6 +817,16 @@ static void unmap_pud_range(pgd_t *pgd, unsigned long start, unsigned long end) | ||
223 | */ | ||
224 | } | ||
225 | |||
226 | +static void unmap_pgd_range(pgd_t *root, unsigned long addr, unsigned long end) | ||
227 | +{ | ||
228 | + pgd_t *pgd_entry = root + pgd_index(addr); | ||
229 | + | ||
230 | + unmap_pud_range(pgd_entry, addr, end); | ||
231 | + | ||
232 | + if (try_to_free_pud_page((pud_t *)pgd_page_vaddr(*pgd_entry))) | ||
233 | + pgd_clear(pgd_entry); | ||
234 | +} | ||
235 | + | ||
236 | static int alloc_pte_page(pmd_t *pmd) | ||
237 | { | ||
238 | pte_t *pte = (pte_t *)get_zeroed_page(GFP_KERNEL | __GFP_NOTRACK); | ||
239 | @@ -999,9 +1021,8 @@ static int populate_pud(struct cpa_data *cpa, unsigned long start, pgd_t *pgd, | ||
240 | static int populate_pgd(struct cpa_data *cpa, unsigned long addr) | ||
241 | { | ||
242 | pgprot_t pgprot = __pgprot(_KERNPG_TABLE); | ||
243 | - bool allocd_pgd = false; | ||
244 | - pgd_t *pgd_entry; | ||
245 | pud_t *pud = NULL; /* shut up gcc */ | ||
246 | + pgd_t *pgd_entry; | ||
247 | int ret; | ||
248 | |||
249 | pgd_entry = cpa->pgd + pgd_index(addr); | ||
250 | @@ -1015,7 +1036,6 @@ static int populate_pgd(struct cpa_data *cpa, unsigned long addr) | ||
251 | return -1; | ||
252 | |||
253 | set_pgd(pgd_entry, __pgd(__pa(pud) | _KERNPG_TABLE)); | ||
254 | - allocd_pgd = true; | ||
255 | } | ||
256 | |||
257 | pgprot_val(pgprot) &= ~pgprot_val(cpa->mask_clr); | ||
258 | @@ -1023,19 +1043,11 @@ static int populate_pgd(struct cpa_data *cpa, unsigned long addr) | ||
259 | |||
260 | ret = populate_pud(cpa, addr, pgd_entry, pgprot); | ||
261 | if (ret < 0) { | ||
262 | - unmap_pud_range(pgd_entry, addr, | ||
263 | + unmap_pgd_range(cpa->pgd, addr, | ||
264 | addr + (cpa->numpages << PAGE_SHIFT)); | ||
265 | - | ||
266 | - if (allocd_pgd) { | ||
267 | - /* | ||
268 | - * If I allocated this PUD page, I can just as well | ||
269 | - * free it in this error path. | ||
270 | - */ | ||
271 | - pgd_clear(pgd_entry); | ||
272 | - free_page((unsigned long)pud); | ||
273 | - } | ||
274 | return ret; | ||
275 | } | ||
276 | + | ||
277 | cpa->numpages = ret; | ||
278 | return 0; | ||
279 | } | ||
280 | @@ -1861,6 +1873,12 @@ out: | ||
281 | return retval; | ||
282 | } | ||
283 | |||
284 | +void kernel_unmap_pages_in_pgd(pgd_t *root, unsigned long address, | ||
285 | + unsigned numpages) | ||
286 | +{ | ||
287 | + unmap_pgd_range(root, address, address + (numpages << PAGE_SHIFT)); | ||
288 | +} | ||
289 | + | ||
290 | /* | ||
291 | * The testcases use internal knowledge of the implementation that shouldn't | ||
292 | * be exposed to the rest of the kernel. Include these directly here. | ||
293 | diff --git a/arch/x86/platform/efi/efi.c b/arch/x86/platform/efi/efi.c | ||
294 | index b97acecf3fd9..abb81b0ad83f 100644 | ||
295 | --- a/arch/x86/platform/efi/efi.c | ||
296 | +++ b/arch/x86/platform/efi/efi.c | ||
297 | @@ -939,14 +939,36 @@ static void __init efi_map_regions_fixed(void) | ||
298 | |||
299 | } | ||
300 | |||
301 | +static void *realloc_pages(void *old_memmap, int old_shift) | ||
302 | +{ | ||
303 | + void *ret; | ||
304 | + | ||
305 | + ret = (void *)__get_free_pages(GFP_KERNEL, old_shift + 1); | ||
306 | + if (!ret) | ||
307 | + goto out; | ||
308 | + | ||
309 | + /* | ||
310 | + * A first-time allocation doesn't have anything to copy. | ||
311 | + */ | ||
312 | + if (!old_memmap) | ||
313 | + return ret; | ||
314 | + | ||
315 | + memcpy(ret, old_memmap, PAGE_SIZE << old_shift); | ||
316 | + | ||
317 | +out: | ||
318 | + free_pages((unsigned long)old_memmap, old_shift); | ||
319 | + return ret; | ||
320 | +} | ||
321 | + | ||
322 | /* | ||
323 | - * Map efi memory ranges for runtime serivce and update new_memmap with virtual | ||
324 | - * addresses. | ||
325 | + * Map the efi memory ranges of the runtime services and update new_mmap with | ||
326 | + * virtual addresses. | ||
327 | */ | ||
328 | -static void * __init efi_map_regions(int *count) | ||
329 | +static void * __init efi_map_regions(int *count, int *pg_shift) | ||
330 | { | ||
331 | + void *p, *new_memmap = NULL; | ||
332 | + unsigned long left = 0; | ||
333 | efi_memory_desc_t *md; | ||
334 | - void *p, *tmp, *new_memmap = NULL; | ||
335 | |||
336 | for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) { | ||
337 | md = p; | ||
338 | @@ -961,20 +983,23 @@ static void * __init efi_map_regions(int *count) | ||
339 | efi_map_region(md); | ||
340 | get_systab_virt_addr(md); | ||
341 | |||
342 | - tmp = krealloc(new_memmap, (*count + 1) * memmap.desc_size, | ||
343 | - GFP_KERNEL); | ||
344 | - if (!tmp) | ||
345 | - goto out; | ||
346 | - new_memmap = tmp; | ||
347 | + if (left < memmap.desc_size) { | ||
348 | + new_memmap = realloc_pages(new_memmap, *pg_shift); | ||
349 | + if (!new_memmap) | ||
350 | + return NULL; | ||
351 | + | ||
352 | + left += PAGE_SIZE << *pg_shift; | ||
353 | + (*pg_shift)++; | ||
354 | + } | ||
355 | + | ||
356 | memcpy(new_memmap + (*count * memmap.desc_size), md, | ||
357 | memmap.desc_size); | ||
358 | + | ||
359 | + left -= memmap.desc_size; | ||
360 | (*count)++; | ||
361 | } | ||
362 | |||
363 | return new_memmap; | ||
364 | -out: | ||
365 | - kfree(new_memmap); | ||
366 | - return NULL; | ||
367 | } | ||
368 | |||
369 | /* | ||
370 | @@ -1000,9 +1025,9 @@ out: | ||
371 | */ | ||
372 | void __init efi_enter_virtual_mode(void) | ||
373 | { | ||
374 | - efi_status_t status; | ||
375 | + int err, count = 0, pg_shift = 0; | ||
376 | void *new_memmap = NULL; | ||
377 | - int err, count = 0; | ||
378 | + efi_status_t status; | ||
379 | |||
380 | efi.systab = NULL; | ||
381 | |||
382 | @@ -1019,20 +1044,24 @@ void __init efi_enter_virtual_mode(void) | ||
383 | efi_map_regions_fixed(); | ||
384 | } else { | ||
385 | efi_merge_regions(); | ||
386 | - new_memmap = efi_map_regions(&count); | ||
387 | + new_memmap = efi_map_regions(&count, &pg_shift); | ||
388 | if (!new_memmap) { | ||
389 | pr_err("Error reallocating memory, EFI runtime non-functional!\n"); | ||
390 | return; | ||
391 | } | ||
392 | - } | ||
393 | |||
394 | - err = save_runtime_map(); | ||
395 | - if (err) | ||
396 | - pr_err("Error saving runtime map, efi runtime on kexec non-functional!!\n"); | ||
397 | + err = save_runtime_map(); | ||
398 | + if (err) | ||
399 | + pr_err("Error saving runtime map, efi runtime on kexec non-functional!!\n"); | ||
400 | + } | ||
401 | |||
402 | BUG_ON(!efi.systab); | ||
403 | |||
404 | - efi_setup_page_tables(); | ||
405 | + if (!efi_setup) { | ||
406 | + if (efi_setup_page_tables(__pa(new_memmap), 1 << pg_shift)) | ||
407 | + return; | ||
408 | + } | ||
409 | + | ||
410 | efi_sync_low_kernel_mappings(); | ||
411 | |||
412 | if (!efi_setup) { | ||
413 | @@ -1072,7 +1101,35 @@ void __init efi_enter_virtual_mode(void) | ||
414 | |||
415 | efi_runtime_mkexec(); | ||
416 | |||
417 | - kfree(new_memmap); | ||
418 | + | ||
419 | + /* | ||
420 | + * We mapped the descriptor array into the EFI pagetable above but we're | ||
421 | + * not unmapping it here. Here's why: | ||
422 | + * | ||
423 | + * We're copying select PGDs from the kernel page table to the EFI page | ||
424 | + * table and when we do so and make changes to those PGDs like unmapping | ||
425 | + * stuff from them, those changes appear in the kernel page table and we | ||
426 | + * go boom. | ||
427 | + * | ||
428 | + * From setup_real_mode(): | ||
429 | + * | ||
430 | + * ... | ||
431 | + * trampoline_pgd[0] = init_level4_pgt[pgd_index(__PAGE_OFFSET)].pgd; | ||
432 | + * | ||
433 | + * In this particular case, our allocation is in PGD 0 of the EFI page | ||
434 | + * table but we've copied that PGD from PGD[272] of the EFI page table: | ||
435 | + * | ||
436 | + * pgd_index(__PAGE_OFFSET = 0xffff880000000000) = 272 | ||
437 | + * | ||
438 | + * where the direct memory mapping in kernel space is. | ||
439 | + * | ||
440 | + * new_memmap's VA comes from that direct mapping and thus clearing it, | ||
441 | + * it would get cleared in the kernel page table too. | ||
442 | + * | ||
443 | + * efi_cleanup_page_tables(__pa(new_memmap), 1 << pg_shift); | ||
444 | + */ | ||
445 | + if (!efi_setup) | ||
446 | + free_pages((unsigned long)new_memmap, pg_shift); | ||
447 | |||
448 | /* clean DUMMY object */ | ||
449 | efi.set_variable(efi_dummy_name, &EFI_DUMMY_GUID, | ||
450 | diff --git a/arch/x86/platform/efi/efi_32.c b/arch/x86/platform/efi/efi_32.c | ||
451 | index 0b74cdf7f816..9ee3491e31fb 100644 | ||
452 | --- a/arch/x86/platform/efi/efi_32.c | ||
453 | +++ b/arch/x86/platform/efi/efi_32.c | ||
454 | @@ -40,7 +40,12 @@ | ||
455 | static unsigned long efi_rt_eflags; | ||
456 | |||
457 | void efi_sync_low_kernel_mappings(void) {} | ||
458 | -void efi_setup_page_tables(void) {} | ||
459 | +void __init efi_dump_pagetable(void) {} | ||
460 | +int efi_setup_page_tables(unsigned long pa_memmap, unsigned num_pages) | ||
461 | +{ | ||
462 | + return 0; | ||
463 | +} | ||
464 | +void efi_cleanup_page_tables(unsigned long pa_memmap, unsigned num_pages) {} | ||
465 | |||
466 | void __init efi_map_region(efi_memory_desc_t *md) | ||
467 | { | ||
468 | diff --git a/arch/x86/platform/efi/efi_64.c b/arch/x86/platform/efi/efi_64.c | ||
469 | index 0c2a234fef1e..666b74a09092 100644 | ||
470 | --- a/arch/x86/platform/efi/efi_64.c | ||
471 | +++ b/arch/x86/platform/efi/efi_64.c | ||
472 | @@ -137,12 +137,38 @@ void efi_sync_low_kernel_mappings(void) | ||
473 | sizeof(pgd_t) * num_pgds); | ||
474 | } | ||
475 | |||
476 | -void efi_setup_page_tables(void) | ||
477 | +int efi_setup_page_tables(unsigned long pa_memmap, unsigned num_pages) | ||
478 | { | ||
479 | + pgd_t *pgd; | ||
480 | + | ||
481 | + if (efi_enabled(EFI_OLD_MEMMAP)) | ||
482 | + return 0; | ||
483 | + | ||
484 | efi_scratch.efi_pgt = (pgd_t *)(unsigned long)real_mode_header->trampoline_pgd; | ||
485 | + pgd = __va(efi_scratch.efi_pgt); | ||
486 | |||
487 | - if (!efi_enabled(EFI_OLD_MEMMAP)) | ||
488 | - efi_scratch.use_pgd = true; | ||
489 | + /* | ||
490 | + * It can happen that the physical address of new_memmap lands in memory | ||
491 | + * which is not mapped in the EFI page table. Therefore we need to go | ||
492 | + * and ident-map those pages containing the map before calling | ||
493 | + * phys_efi_set_virtual_address_map(). | ||
494 | + */ | ||
495 | + if (kernel_map_pages_in_pgd(pgd, pa_memmap, pa_memmap, num_pages, _PAGE_NX)) { | ||
496 | + pr_err("Error ident-mapping new memmap (0x%lx)!\n", pa_memmap); | ||
497 | + return 1; | ||
498 | + } | ||
499 | + | ||
500 | + efi_scratch.use_pgd = true; | ||
501 | + | ||
502 | + | ||
503 | + return 0; | ||
504 | +} | ||
505 | + | ||
506 | +void efi_cleanup_page_tables(unsigned long pa_memmap, unsigned num_pages) | ||
507 | +{ | ||
508 | + pgd_t *pgd = (pgd_t *)__va(real_mode_header->trampoline_pgd); | ||
509 | + | ||
510 | + kernel_unmap_pages_in_pgd(pgd, pa_memmap, num_pages); | ||
511 | } | ||
512 | |||
513 | static void __init __map_region(efi_memory_desc_t *md, u64 va) | ||
514 | diff --git a/drivers/isdn/isdnloop/isdnloop.c b/drivers/isdn/isdnloop/isdnloop.c | ||
515 | index 02125e6a9109..5a4da94aefb0 100644 | ||
516 | --- a/drivers/isdn/isdnloop/isdnloop.c | ||
517 | +++ b/drivers/isdn/isdnloop/isdnloop.c | ||
518 | @@ -518,9 +518,9 @@ static isdnloop_stat isdnloop_cmd_table[] = | ||
519 | static void | ||
520 | isdnloop_fake_err(isdnloop_card *card) | ||
521 | { | ||
522 | - char buf[60]; | ||
523 | + char buf[64]; | ||
524 | |||
525 | - sprintf(buf, "E%s", card->omsg); | ||
526 | + snprintf(buf, sizeof(buf), "E%s", card->omsg); | ||
527 | isdnloop_fake(card, buf, -1); | ||
528 | isdnloop_fake(card, "NAK", -1); | ||
529 | } | ||
530 | @@ -903,6 +903,8 @@ isdnloop_parse_cmd(isdnloop_card *card) | ||
531 | case 7: | ||
532 | /* 0x;EAZ */ | ||
533 | p += 3; | ||
534 | + if (strlen(p) >= sizeof(card->eazlist[0])) | ||
535 | + break; | ||
536 | strcpy(card->eazlist[ch - 1], p); | ||
537 | break; | ||
538 | case 8: | ||
539 | @@ -1070,6 +1072,12 @@ isdnloop_start(isdnloop_card *card, isdnloop_sdef *sdefp) | ||
540 | return -EBUSY; | ||
541 | if (copy_from_user((char *) &sdef, (char *) sdefp, sizeof(sdef))) | ||
542 | return -EFAULT; | ||
543 | + | ||
544 | + for (i = 0; i < 3; i++) { | ||
545 | + if (!memchr(sdef.num[i], 0, sizeof(sdef.num[i]))) | ||
546 | + return -EINVAL; | ||
547 | + } | ||
548 | + | ||
549 | spin_lock_irqsave(&card->isdnloop_lock, flags); | ||
550 | switch (sdef.ptype) { | ||
551 | case ISDN_PTYPE_EURO: | ||
552 | @@ -1127,7 +1135,7 @@ isdnloop_command(isdn_ctrl *c, isdnloop_card *card) | ||
553 | { | ||
554 | ulong a; | ||
555 | int i; | ||
556 | - char cbuf[60]; | ||
557 | + char cbuf[80]; | ||
558 | isdn_ctrl cmd; | ||
559 | isdnloop_cdef cdef; | ||
560 | |||
561 | @@ -1192,7 +1200,6 @@ isdnloop_command(isdn_ctrl *c, isdnloop_card *card) | ||
562 | break; | ||
563 | if ((c->arg & 255) < ISDNLOOP_BCH) { | ||
564 | char *p; | ||
565 | - char dial[50]; | ||
566 | char dcode[4]; | ||
567 | |||
568 | a = c->arg; | ||
569 | @@ -1204,10 +1211,10 @@ isdnloop_command(isdn_ctrl *c, isdnloop_card *card) | ||
570 | } else | ||
571 | /* Normal Dial */ | ||
572 | strcpy(dcode, "CAL"); | ||
573 | - strcpy(dial, p); | ||
574 | - sprintf(cbuf, "%02d;D%s_R%s,%02d,%02d,%s\n", (int) (a + 1), | ||
575 | - dcode, dial, c->parm.setup.si1, | ||
576 | - c->parm.setup.si2, c->parm.setup.eazmsn); | ||
577 | + snprintf(cbuf, sizeof(cbuf), | ||
578 | + "%02d;D%s_R%s,%02d,%02d,%s\n", (int) (a + 1), | ||
579 | + dcode, p, c->parm.setup.si1, | ||
580 | + c->parm.setup.si2, c->parm.setup.eazmsn); | ||
581 | i = isdnloop_writecmd(cbuf, strlen(cbuf), 0, card); | ||
582 | } | ||
583 | break; | ||
584 | diff --git a/drivers/net/ethernet/cadence/at91_ether.c b/drivers/net/ethernet/cadence/at91_ether.c | ||
585 | index ce75de9bae9e..4a79edaf3885 100644 | ||
586 | --- a/drivers/net/ethernet/cadence/at91_ether.c | ||
587 | +++ b/drivers/net/ethernet/cadence/at91_ether.c | ||
588 | @@ -342,6 +342,9 @@ static int __init at91ether_probe(struct platform_device *pdev) | ||
589 | } | ||
590 | clk_enable(lp->pclk); | ||
591 | |||
592 | + lp->hclk = ERR_PTR(-ENOENT); | ||
593 | + lp->tx_clk = ERR_PTR(-ENOENT); | ||
594 | + | ||
595 | /* Install the interrupt handler */ | ||
596 | dev->irq = platform_get_irq(pdev, 0); | ||
597 | res = devm_request_irq(&pdev->dev, dev->irq, at91ether_interrupt, 0, dev->name, dev); | ||
598 | diff --git a/drivers/net/ethernet/sfc/ef10.c b/drivers/net/ethernet/sfc/ef10.c | ||
599 | index 174a92f5fe51..7645a3ce3854 100644 | ||
600 | --- a/drivers/net/ethernet/sfc/ef10.c | ||
601 | +++ b/drivers/net/ethernet/sfc/ef10.c | ||
602 | @@ -565,10 +565,17 @@ static int efx_ef10_dimension_resources(struct efx_nic *efx) | ||
603 | * several of each (in fact that's the only option if host | ||
604 | * page size is >4K). So we may allocate some extra VIs just | ||
605 | * for writing PIO buffers through. | ||
606 | + * | ||
607 | + * The UC mapping contains (min_vis - 1) complete VIs and the | ||
608 | + * first half of the next VI. Then the WC mapping begins with | ||
609 | + * the second half of this last VI. | ||
610 | */ | ||
611 | uc_mem_map_size = PAGE_ALIGN((min_vis - 1) * EFX_VI_PAGE_SIZE + | ||
612 | ER_DZ_TX_PIOBUF); | ||
613 | if (nic_data->n_piobufs) { | ||
614 | + /* pio_write_vi_base rounds down to give the number of complete | ||
615 | + * VIs inside the UC mapping. | ||
616 | + */ | ||
617 | pio_write_vi_base = uc_mem_map_size / EFX_VI_PAGE_SIZE; | ||
618 | wc_mem_map_size = (PAGE_ALIGN((pio_write_vi_base + | ||
619 | nic_data->n_piobufs) * | ||
620 | diff --git a/drivers/net/ethernet/sfc/efx.c b/drivers/net/ethernet/sfc/efx.c | ||
621 | index 83d464347021..f06c790fba5a 100644 | ||
622 | --- a/drivers/net/ethernet/sfc/efx.c | ||
623 | +++ b/drivers/net/ethernet/sfc/efx.c | ||
624 | @@ -1603,6 +1603,8 @@ static int efx_probe_nic(struct efx_nic *efx) | ||
625 | if (rc) | ||
626 | goto fail1; | ||
627 | |||
628 | + efx_set_channels(efx); | ||
629 | + | ||
630 | rc = efx->type->dimension_resources(efx); | ||
631 | if (rc) | ||
632 | goto fail2; | ||
633 | @@ -1613,7 +1615,6 @@ static int efx_probe_nic(struct efx_nic *efx) | ||
634 | efx->rx_indir_table[i] = | ||
635 | ethtool_rxfh_indir_default(i, efx->rss_spread); | ||
636 | |||
637 | - efx_set_channels(efx); | ||
638 | netif_set_real_num_tx_queues(efx->net_dev, efx->n_tx_channels); | ||
639 | netif_set_real_num_rx_queues(efx->net_dev, efx->n_rx_channels); | ||
640 | |||
641 | diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c | ||
642 | index 1236812c7be6..d091e52b00e1 100644 | ||
643 | --- a/drivers/net/vxlan.c | ||
644 | +++ b/drivers/net/vxlan.c | ||
645 | @@ -871,6 +871,9 @@ static int vxlan_fdb_add(struct ndmsg *ndm, struct nlattr *tb[], | ||
646 | if (err) | ||
647 | return err; | ||
648 | |||
649 | + if (vxlan->default_dst.remote_ip.sa.sa_family != ip.sa.sa_family) | ||
650 | + return -EAFNOSUPPORT; | ||
651 | + | ||
652 | spin_lock_bh(&vxlan->hash_lock); | ||
653 | err = vxlan_fdb_create(vxlan, addr, &ip, ndm->ndm_state, flags, | ||
654 | port, vni, ifindex, ndm->ndm_flags); | ||
655 | @@ -2612,9 +2615,10 @@ static int vxlan_newlink(struct net *net, struct net_device *dev, | ||
656 | vni = nla_get_u32(data[IFLA_VXLAN_ID]); | ||
657 | dst->remote_vni = vni; | ||
658 | |||
659 | + /* Unless IPv6 is explicitly requested, assume IPv4 */ | ||
660 | + dst->remote_ip.sa.sa_family = AF_INET; | ||
661 | if (data[IFLA_VXLAN_GROUP]) { | ||
662 | dst->remote_ip.sin.sin_addr.s_addr = nla_get_be32(data[IFLA_VXLAN_GROUP]); | ||
663 | - dst->remote_ip.sa.sa_family = AF_INET; | ||
664 | } else if (data[IFLA_VXLAN_GROUP6]) { | ||
665 | if (!IS_ENABLED(CONFIG_IPV6)) | ||
666 | return -EPFNOSUPPORT; | ||
667 | diff --git a/drivers/net/wireless/iwlwifi/mvm/rs.c b/drivers/net/wireless/iwlwifi/mvm/rs.c | ||
668 | index 6abf74e1351f..5bc871513505 100644 | ||
669 | --- a/drivers/net/wireless/iwlwifi/mvm/rs.c | ||
670 | +++ b/drivers/net/wireless/iwlwifi/mvm/rs.c | ||
671 | @@ -211,9 +211,9 @@ static const struct rs_tx_column rs_tx_columns[] = { | ||
672 | .next_columns = { | ||
673 | RS_COLUMN_LEGACY_ANT_B, | ||
674 | RS_COLUMN_SISO_ANT_A, | ||
675 | + RS_COLUMN_SISO_ANT_B, | ||
676 | RS_COLUMN_MIMO2, | ||
677 | - RS_COLUMN_INVALID, | ||
678 | - RS_COLUMN_INVALID, | ||
679 | + RS_COLUMN_MIMO2_SGI, | ||
680 | }, | ||
681 | }, | ||
682 | [RS_COLUMN_LEGACY_ANT_B] = { | ||
683 | @@ -221,10 +221,10 @@ static const struct rs_tx_column rs_tx_columns[] = { | ||
684 | .ant = ANT_B, | ||
685 | .next_columns = { | ||
686 | RS_COLUMN_LEGACY_ANT_A, | ||
687 | + RS_COLUMN_SISO_ANT_A, | ||
688 | RS_COLUMN_SISO_ANT_B, | ||
689 | RS_COLUMN_MIMO2, | ||
690 | - RS_COLUMN_INVALID, | ||
691 | - RS_COLUMN_INVALID, | ||
692 | + RS_COLUMN_MIMO2_SGI, | ||
693 | }, | ||
694 | }, | ||
695 | [RS_COLUMN_SISO_ANT_A] = { | ||
696 | @@ -234,8 +234,8 @@ static const struct rs_tx_column rs_tx_columns[] = { | ||
697 | RS_COLUMN_SISO_ANT_B, | ||
698 | RS_COLUMN_MIMO2, | ||
699 | RS_COLUMN_SISO_ANT_A_SGI, | ||
700 | - RS_COLUMN_INVALID, | ||
701 | - RS_COLUMN_INVALID, | ||
702 | + RS_COLUMN_SISO_ANT_B_SGI, | ||
703 | + RS_COLUMN_MIMO2_SGI, | ||
704 | }, | ||
705 | .checks = { | ||
706 | rs_siso_allow, | ||
707 | @@ -248,8 +248,8 @@ static const struct rs_tx_column rs_tx_columns[] = { | ||
708 | RS_COLUMN_SISO_ANT_A, | ||
709 | RS_COLUMN_MIMO2, | ||
710 | RS_COLUMN_SISO_ANT_B_SGI, | ||
711 | - RS_COLUMN_INVALID, | ||
712 | - RS_COLUMN_INVALID, | ||
713 | + RS_COLUMN_SISO_ANT_A_SGI, | ||
714 | + RS_COLUMN_MIMO2_SGI, | ||
715 | }, | ||
716 | .checks = { | ||
717 | rs_siso_allow, | ||
718 | @@ -263,8 +263,8 @@ static const struct rs_tx_column rs_tx_columns[] = { | ||
719 | RS_COLUMN_SISO_ANT_B_SGI, | ||
720 | RS_COLUMN_MIMO2_SGI, | ||
721 | RS_COLUMN_SISO_ANT_A, | ||
722 | - RS_COLUMN_INVALID, | ||
723 | - RS_COLUMN_INVALID, | ||
724 | + RS_COLUMN_SISO_ANT_B, | ||
725 | + RS_COLUMN_MIMO2, | ||
726 | }, | ||
727 | .checks = { | ||
728 | rs_siso_allow, | ||
729 | @@ -279,8 +279,8 @@ static const struct rs_tx_column rs_tx_columns[] = { | ||
730 | RS_COLUMN_SISO_ANT_A_SGI, | ||
731 | RS_COLUMN_MIMO2_SGI, | ||
732 | RS_COLUMN_SISO_ANT_B, | ||
733 | - RS_COLUMN_INVALID, | ||
734 | - RS_COLUMN_INVALID, | ||
735 | + RS_COLUMN_SISO_ANT_A, | ||
736 | + RS_COLUMN_MIMO2, | ||
737 | }, | ||
738 | .checks = { | ||
739 | rs_siso_allow, | ||
740 | @@ -292,10 +292,10 @@ static const struct rs_tx_column rs_tx_columns[] = { | ||
741 | .ant = ANT_AB, | ||
742 | .next_columns = { | ||
743 | RS_COLUMN_SISO_ANT_A, | ||
744 | + RS_COLUMN_SISO_ANT_B, | ||
745 | + RS_COLUMN_SISO_ANT_A_SGI, | ||
746 | + RS_COLUMN_SISO_ANT_B_SGI, | ||
747 | RS_COLUMN_MIMO2_SGI, | ||
748 | - RS_COLUMN_INVALID, | ||
749 | - RS_COLUMN_INVALID, | ||
750 | - RS_COLUMN_INVALID, | ||
751 | }, | ||
752 | .checks = { | ||
753 | rs_mimo_allow, | ||
754 | @@ -307,10 +307,10 @@ static const struct rs_tx_column rs_tx_columns[] = { | ||
755 | .sgi = true, | ||
756 | .next_columns = { | ||
757 | RS_COLUMN_SISO_ANT_A_SGI, | ||
758 | + RS_COLUMN_SISO_ANT_B_SGI, | ||
759 | + RS_COLUMN_SISO_ANT_A, | ||
760 | + RS_COLUMN_SISO_ANT_B, | ||
761 | RS_COLUMN_MIMO2, | ||
762 | - RS_COLUMN_INVALID, | ||
763 | - RS_COLUMN_INVALID, | ||
764 | - RS_COLUMN_INVALID, | ||
765 | }, | ||
766 | .checks = { | ||
767 | rs_mimo_allow, | ||
768 | diff --git a/drivers/net/xen-netback/common.h b/drivers/net/xen-netback/common.h | ||
769 | index ae413a2cbee7..4bf5b334664e 100644 | ||
770 | --- a/drivers/net/xen-netback/common.h | ||
771 | +++ b/drivers/net/xen-netback/common.h | ||
772 | @@ -113,6 +113,11 @@ struct xenvif { | ||
773 | domid_t domid; | ||
774 | unsigned int handle; | ||
775 | |||
776 | + /* Is this interface disabled? True when backend discovers | ||
777 | + * frontend is rogue. | ||
778 | + */ | ||
779 | + bool disabled; | ||
780 | + | ||
781 | /* Use NAPI for guest TX */ | ||
782 | struct napi_struct napi; | ||
783 | /* When feature-split-event-channels = 0, tx_irq = rx_irq. */ | ||
784 | diff --git a/drivers/net/xen-netback/interface.c b/drivers/net/xen-netback/interface.c | ||
785 | index 301cc037fda8..2e92d52c0a6d 100644 | ||
786 | --- a/drivers/net/xen-netback/interface.c | ||
787 | +++ b/drivers/net/xen-netback/interface.c | ||
788 | @@ -62,6 +62,15 @@ static int xenvif_poll(struct napi_struct *napi, int budget) | ||
789 | struct xenvif *vif = container_of(napi, struct xenvif, napi); | ||
790 | int work_done; | ||
791 | |||
792 | + /* This vif is rogue, we pretend we've there is nothing to do | ||
793 | + * for this vif to deschedule it from NAPI. But this interface | ||
794 | + * will be turned off in thread context later. | ||
795 | + */ | ||
796 | + if (unlikely(vif->disabled)) { | ||
797 | + napi_complete(napi); | ||
798 | + return 0; | ||
799 | + } | ||
800 | + | ||
801 | work_done = xenvif_tx_action(vif, budget); | ||
802 | |||
803 | if (work_done < budget) { | ||
804 | @@ -321,6 +330,8 @@ struct xenvif *xenvif_alloc(struct device *parent, domid_t domid, | ||
805 | vif->ip_csum = 1; | ||
806 | vif->dev = dev; | ||
807 | |||
808 | + vif->disabled = false; | ||
809 | + | ||
810 | vif->credit_bytes = vif->remaining_credit = ~0UL; | ||
811 | vif->credit_usec = 0UL; | ||
812 | init_timer(&vif->credit_timeout); | ||
813 | diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c | ||
814 | index 438d0c09b7e6..97030c193afd 100644 | ||
815 | --- a/drivers/net/xen-netback/netback.c | ||
816 | +++ b/drivers/net/xen-netback/netback.c | ||
817 | @@ -192,8 +192,8 @@ static bool start_new_rx_buffer(int offset, unsigned long size, int head) | ||
818 | * into multiple copies tend to give large frags their | ||
819 | * own buffers as before. | ||
820 | */ | ||
821 | - if ((offset + size > MAX_BUFFER_OFFSET) && | ||
822 | - (size <= MAX_BUFFER_OFFSET) && offset && !head) | ||
823 | + BUG_ON(size > MAX_BUFFER_OFFSET); | ||
824 | + if ((offset + size > MAX_BUFFER_OFFSET) && offset && !head) | ||
825 | return true; | ||
826 | |||
827 | return false; | ||
828 | @@ -482,6 +482,8 @@ static void xenvif_rx_action(struct xenvif *vif) | ||
829 | |||
830 | while ((skb = skb_dequeue(&vif->rx_queue)) != NULL) { | ||
831 | RING_IDX max_slots_needed; | ||
832 | + RING_IDX old_req_cons; | ||
833 | + RING_IDX ring_slots_used; | ||
834 | int i; | ||
835 | |||
836 | /* We need a cheap worse case estimate for the number of | ||
837 | @@ -493,9 +495,28 @@ static void xenvif_rx_action(struct xenvif *vif) | ||
838 | PAGE_SIZE); | ||
839 | for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { | ||
840 | unsigned int size; | ||
841 | + unsigned int offset; | ||
842 | + | ||
843 | size = skb_frag_size(&skb_shinfo(skb)->frags[i]); | ||
844 | - max_slots_needed += DIV_ROUND_UP(size, PAGE_SIZE); | ||
845 | + offset = skb_shinfo(skb)->frags[i].page_offset; | ||
846 | + | ||
847 | + /* For a worse-case estimate we need to factor in | ||
848 | + * the fragment page offset as this will affect the | ||
849 | + * number of times xenvif_gop_frag_copy() will | ||
850 | + * call start_new_rx_buffer(). | ||
851 | + */ | ||
852 | + max_slots_needed += DIV_ROUND_UP(offset + size, | ||
853 | + PAGE_SIZE); | ||
854 | } | ||
855 | + | ||
856 | + /* To avoid the estimate becoming too pessimal for some | ||
857 | + * frontends that limit posted rx requests, cap the estimate | ||
858 | + * at MAX_SKB_FRAGS. | ||
859 | + */ | ||
860 | + if (max_slots_needed > MAX_SKB_FRAGS) | ||
861 | + max_slots_needed = MAX_SKB_FRAGS; | ||
862 | + | ||
863 | + /* We may need one more slot for GSO metadata */ | ||
864 | if (skb_is_gso(skb) && | ||
865 | (skb_shinfo(skb)->gso_type & SKB_GSO_TCPV4 || | ||
866 | skb_shinfo(skb)->gso_type & SKB_GSO_TCPV6)) | ||
867 | @@ -511,8 +532,12 @@ static void xenvif_rx_action(struct xenvif *vif) | ||
868 | vif->rx_last_skb_slots = 0; | ||
869 | |||
870 | sco = (struct skb_cb_overlay *)skb->cb; | ||
871 | + | ||
872 | + old_req_cons = vif->rx.req_cons; | ||
873 | sco->meta_slots_used = xenvif_gop_skb(skb, &npo); | ||
874 | - BUG_ON(sco->meta_slots_used > max_slots_needed); | ||
875 | + ring_slots_used = vif->rx.req_cons - old_req_cons; | ||
876 | + | ||
877 | + BUG_ON(ring_slots_used > max_slots_needed); | ||
878 | |||
879 | __skb_queue_tail(&rxq, skb); | ||
880 | } | ||
881 | @@ -655,7 +680,8 @@ static void xenvif_tx_err(struct xenvif *vif, | ||
882 | static void xenvif_fatal_tx_err(struct xenvif *vif) | ||
883 | { | ||
884 | netdev_err(vif->dev, "fatal error; disabling device\n"); | ||
885 | - xenvif_carrier_off(vif); | ||
886 | + vif->disabled = true; | ||
887 | + xenvif_kick_thread(vif); | ||
888 | } | ||
889 | |||
890 | static int xenvif_count_requests(struct xenvif *vif, | ||
891 | @@ -1126,7 +1152,7 @@ static unsigned xenvif_tx_build_gops(struct xenvif *vif, int budget) | ||
892 | vif->tx.sring->req_prod, vif->tx.req_cons, | ||
893 | XEN_NETIF_TX_RING_SIZE); | ||
894 | xenvif_fatal_tx_err(vif); | ||
895 | - continue; | ||
896 | + break; | ||
897 | } | ||
898 | |||
899 | work_to_do = RING_HAS_UNCONSUMED_REQUESTS(&vif->tx); | ||
900 | @@ -1548,7 +1574,18 @@ int xenvif_kthread(void *data) | ||
901 | while (!kthread_should_stop()) { | ||
902 | wait_event_interruptible(vif->wq, | ||
903 | rx_work_todo(vif) || | ||
904 | + vif->disabled || | ||
905 | kthread_should_stop()); | ||
906 | + | ||
907 | + /* This frontend is found to be rogue, disable it in | ||
908 | + * kthread context. Currently this is only set when | ||
909 | + * netback finds out frontend sends malformed packet, | ||
910 | + * but we cannot disable the interface in softirq | ||
911 | + * context so we defer it here. | ||
912 | + */ | ||
913 | + if (unlikely(vif->disabled && netif_carrier_ok(vif->dev))) | ||
914 | + xenvif_carrier_off(vif); | ||
915 | + | ||
916 | if (kthread_should_stop()) | ||
917 | break; | ||
918 | |||
919 | diff --git a/include/linux/futex.h b/include/linux/futex.h | ||
920 | index b0d95cac826e..6435f46d6e13 100644 | ||
921 | --- a/include/linux/futex.h | ||
922 | +++ b/include/linux/futex.h | ||
923 | @@ -55,7 +55,11 @@ union futex_key { | ||
924 | #ifdef CONFIG_FUTEX | ||
925 | extern void exit_robust_list(struct task_struct *curr); | ||
926 | extern void exit_pi_state_list(struct task_struct *curr); | ||
927 | +#ifdef CONFIG_HAVE_FUTEX_CMPXCHG | ||
928 | +#define futex_cmpxchg_enabled 1 | ||
929 | +#else | ||
930 | extern int futex_cmpxchg_enabled; | ||
931 | +#endif | ||
932 | #else | ||
933 | static inline void exit_robust_list(struct task_struct *curr) | ||
934 | { | ||
935 | diff --git a/init/Kconfig b/init/Kconfig | ||
936 | index 009a797dd242..d56cb03c1b49 100644 | ||
937 | --- a/init/Kconfig | ||
938 | +++ b/init/Kconfig | ||
939 | @@ -1387,6 +1387,13 @@ config FUTEX | ||
940 | support for "fast userspace mutexes". The resulting kernel may not | ||
941 | run glibc-based applications correctly. | ||
942 | |||
943 | +config HAVE_FUTEX_CMPXCHG | ||
944 | + bool | ||
945 | + help | ||
946 | + Architectures should select this if futex_atomic_cmpxchg_inatomic() | ||
947 | + is implemented and always working. This removes a couple of runtime | ||
948 | + checks. | ||
949 | + | ||
950 | config EPOLL | ||
951 | bool "Enable eventpoll support" if EXPERT | ||
952 | default y | ||
953 | diff --git a/kernel/futex.c b/kernel/futex.c | ||
954 | index 08ec814ad9d2..6801b3751a95 100644 | ||
955 | --- a/kernel/futex.c | ||
956 | +++ b/kernel/futex.c | ||
957 | @@ -157,7 +157,9 @@ | ||
958 | * enqueue. | ||
959 | */ | ||
960 | |||
961 | +#ifndef CONFIG_HAVE_FUTEX_CMPXCHG | ||
962 | int __read_mostly futex_cmpxchg_enabled; | ||
963 | +#endif | ||
964 | |||
965 | /* | ||
966 | * Futex flags used to encode options to functions and preserve them across | ||
967 | @@ -1450,6 +1452,7 @@ retry: | ||
968 | hb2 = hash_futex(&key2); | ||
969 | |||
970 | retry_private: | ||
971 | + hb_waiters_inc(hb2); | ||
972 | double_lock_hb(hb1, hb2); | ||
973 | |||
974 | if (likely(cmpval != NULL)) { | ||
975 | @@ -1459,6 +1462,7 @@ retry_private: | ||
976 | |||
977 | if (unlikely(ret)) { | ||
978 | double_unlock_hb(hb1, hb2); | ||
979 | + hb_waiters_dec(hb2); | ||
980 | |||
981 | ret = get_user(curval, uaddr1); | ||
982 | if (ret) | ||
983 | @@ -1508,6 +1512,7 @@ retry_private: | ||
984 | break; | ||
985 | case -EFAULT: | ||
986 | double_unlock_hb(hb1, hb2); | ||
987 | + hb_waiters_dec(hb2); | ||
988 | put_futex_key(&key2); | ||
989 | put_futex_key(&key1); | ||
990 | ret = fault_in_user_writeable(uaddr2); | ||
991 | @@ -1517,6 +1522,7 @@ retry_private: | ||
992 | case -EAGAIN: | ||
993 | /* The owner was exiting, try again. */ | ||
994 | double_unlock_hb(hb1, hb2); | ||
995 | + hb_waiters_dec(hb2); | ||
996 | put_futex_key(&key2); | ||
997 | put_futex_key(&key1); | ||
998 | cond_resched(); | ||
999 | @@ -1592,6 +1598,7 @@ retry_private: | ||
1000 | |||
1001 | out_unlock: | ||
1002 | double_unlock_hb(hb1, hb2); | ||
1003 | + hb_waiters_dec(hb2); | ||
1004 | |||
1005 | /* | ||
1006 | * drop_futex_key_refs() must be called outside the spinlocks. During | ||
1007 | @@ -2875,9 +2882,28 @@ SYSCALL_DEFINE6(futex, u32 __user *, uaddr, int, op, u32, val, | ||
1008 | return do_futex(uaddr, op, val, tp, uaddr2, val2, val3); | ||
1009 | } | ||
1010 | |||
1011 | -static int __init futex_init(void) | ||
1012 | +static void __init futex_detect_cmpxchg(void) | ||
1013 | { | ||
1014 | +#ifndef CONFIG_HAVE_FUTEX_CMPXCHG | ||
1015 | u32 curval; | ||
1016 | + | ||
1017 | + /* | ||
1018 | + * This will fail and we want it. Some arch implementations do | ||
1019 | + * runtime detection of the futex_atomic_cmpxchg_inatomic() | ||
1020 | + * functionality. We want to know that before we call in any | ||
1021 | + * of the complex code paths. Also we want to prevent | ||
1022 | + * registration of robust lists in that case. NULL is | ||
1023 | + * guaranteed to fault and we get -EFAULT on functional | ||
1024 | + * implementation, the non-functional ones will return | ||
1025 | + * -ENOSYS. | ||
1026 | + */ | ||
1027 | + if (cmpxchg_futex_value_locked(&curval, NULL, 0, 0) == -EFAULT) | ||
1028 | + futex_cmpxchg_enabled = 1; | ||
1029 | +#endif | ||
1030 | +} | ||
1031 | + | ||
1032 | +static int __init futex_init(void) | ||
1033 | +{ | ||
1034 | unsigned int futex_shift; | ||
1035 | unsigned long i; | ||
1036 | |||
1037 | @@ -2893,18 +2919,8 @@ static int __init futex_init(void) | ||
1038 | &futex_shift, NULL, | ||
1039 | futex_hashsize, futex_hashsize); | ||
1040 | futex_hashsize = 1UL << futex_shift; | ||
1041 | - /* | ||
1042 | - * This will fail and we want it. Some arch implementations do | ||
1043 | - * runtime detection of the futex_atomic_cmpxchg_inatomic() | ||
1044 | - * functionality. We want to know that before we call in any | ||
1045 | - * of the complex code paths. Also we want to prevent | ||
1046 | - * registration of robust lists in that case. NULL is | ||
1047 | - * guaranteed to fault and we get -EFAULT on functional | ||
1048 | - * implementation, the non-functional ones will return | ||
1049 | - * -ENOSYS. | ||
1050 | - */ | ||
1051 | - if (cmpxchg_futex_value_locked(&curval, NULL, 0, 0) == -EFAULT) | ||
1052 | - futex_cmpxchg_enabled = 1; | ||
1053 | + | ||
1054 | + futex_detect_cmpxchg(); | ||
1055 | |||
1056 | for (i = 0; i < futex_hashsize; i++) { | ||
1057 | atomic_set(&futex_queues[i].waiters, 0); | ||
1058 | diff --git a/lib/nlattr.c b/lib/nlattr.c | ||
1059 | index 18eca7809b08..fc6754720ced 100644 | ||
1060 | --- a/lib/nlattr.c | ||
1061 | +++ b/lib/nlattr.c | ||
1062 | @@ -303,9 +303,15 @@ int nla_memcmp(const struct nlattr *nla, const void *data, | ||
1063 | */ | ||
1064 | int nla_strcmp(const struct nlattr *nla, const char *str) | ||
1065 | { | ||
1066 | - int len = strlen(str) + 1; | ||
1067 | - int d = nla_len(nla) - len; | ||
1068 | + int len = strlen(str); | ||
1069 | + char *buf = nla_data(nla); | ||
1070 | + int attrlen = nla_len(nla); | ||
1071 | + int d; | ||
1072 | |||
1073 | + if (attrlen > 0 && buf[attrlen - 1] == '\0') | ||
1074 | + attrlen--; | ||
1075 | + | ||
1076 | + d = attrlen - len; | ||
1077 | if (d == 0) | ||
1078 | d = memcmp(nla_data(nla), str, len); | ||
1079 | |||
1080 | diff --git a/net/ipv6/icmp.c b/net/ipv6/icmp.c | ||
1081 | index f2610e157660..7b326529e6a2 100644 | ||
1082 | --- a/net/ipv6/icmp.c | ||
1083 | +++ b/net/ipv6/icmp.c | ||
1084 | @@ -520,7 +520,7 @@ static void icmp6_send(struct sk_buff *skb, u8 type, u8 code, __u32 info) | ||
1085 | np->tclass, NULL, &fl6, (struct rt6_info *)dst, | ||
1086 | MSG_DONTWAIT, np->dontfrag); | ||
1087 | if (err) { | ||
1088 | - ICMP6_INC_STATS_BH(net, idev, ICMP6_MIB_OUTERRORS); | ||
1089 | + ICMP6_INC_STATS(net, idev, ICMP6_MIB_OUTERRORS); | ||
1090 | ip6_flush_pending_frames(sk); | ||
1091 | } else { | ||
1092 | err = icmpv6_push_pending_frames(sk, &fl6, &tmp_hdr, | ||
1093 | diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c | ||
1094 | index 64d6073731d3..3702d179506d 100644 | ||
1095 | --- a/net/ipv6/ip6_output.c | ||
1096 | +++ b/net/ipv6/ip6_output.c | ||
1097 | @@ -1566,8 +1566,8 @@ int ip6_push_pending_frames(struct sock *sk) | ||
1098 | if (proto == IPPROTO_ICMPV6) { | ||
1099 | struct inet6_dev *idev = ip6_dst_idev(skb_dst(skb)); | ||
1100 | |||
1101 | - ICMP6MSGOUT_INC_STATS_BH(net, idev, icmp6_hdr(skb)->icmp6_type); | ||
1102 | - ICMP6_INC_STATS_BH(net, idev, ICMP6_MIB_OUTMSGS); | ||
1103 | + ICMP6MSGOUT_INC_STATS(net, idev, icmp6_hdr(skb)->icmp6_type); | ||
1104 | + ICMP6_INC_STATS(net, idev, ICMP6_MIB_OUTMSGS); | ||
1105 | } | ||
1106 | |||
1107 | err = ip6_local_out(skb); | ||
1108 | diff --git a/net/ipv6/mcast.c b/net/ipv6/mcast.c | ||
1109 | index e1e47350784b..08b367c6b9cf 100644 | ||
1110 | --- a/net/ipv6/mcast.c | ||
1111 | +++ b/net/ipv6/mcast.c | ||
1112 | @@ -1620,11 +1620,12 @@ static void mld_sendpack(struct sk_buff *skb) | ||
1113 | dst_output); | ||
1114 | out: | ||
1115 | if (!err) { | ||
1116 | - ICMP6MSGOUT_INC_STATS_BH(net, idev, ICMPV6_MLD2_REPORT); | ||
1117 | - ICMP6_INC_STATS_BH(net, idev, ICMP6_MIB_OUTMSGS); | ||
1118 | - IP6_UPD_PO_STATS_BH(net, idev, IPSTATS_MIB_OUTMCAST, payload_len); | ||
1119 | - } else | ||
1120 | - IP6_INC_STATS_BH(net, idev, IPSTATS_MIB_OUTDISCARDS); | ||
1121 | + ICMP6MSGOUT_INC_STATS(net, idev, ICMPV6_MLD2_REPORT); | ||
1122 | + ICMP6_INC_STATS(net, idev, ICMP6_MIB_OUTMSGS); | ||
1123 | + IP6_UPD_PO_STATS(net, idev, IPSTATS_MIB_OUTMCAST, payload_len); | ||
1124 | + } else { | ||
1125 | + IP6_INC_STATS(net, idev, IPSTATS_MIB_OUTDISCARDS); | ||
1126 | + } | ||
1127 | |||
1128 | rcu_read_unlock(); | ||
1129 | return; | ||
1130 | diff --git a/net/ipv6/ping.c b/net/ipv6/ping.c | ||
1131 | index 587bbdcb22b4..bda74291c3e0 100644 | ||
1132 | --- a/net/ipv6/ping.c | ||
1133 | +++ b/net/ipv6/ping.c | ||
1134 | @@ -182,8 +182,8 @@ int ping_v6_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, | ||
1135 | MSG_DONTWAIT, np->dontfrag); | ||
1136 | |||
1137 | if (err) { | ||
1138 | - ICMP6_INC_STATS_BH(sock_net(sk), rt->rt6i_idev, | ||
1139 | - ICMP6_MIB_OUTERRORS); | ||
1140 | + ICMP6_INC_STATS(sock_net(sk), rt->rt6i_idev, | ||
1141 | + ICMP6_MIB_OUTERRORS); | ||
1142 | ip6_flush_pending_frames(sk); | ||
1143 | } else { | ||
1144 | err = icmpv6_push_pending_frames(sk, &fl6, | ||
1145 | diff --git a/net/rds/iw.c b/net/rds/iw.c | ||
1146 | index 7826d46baa70..589935661d66 100644 | ||
1147 | --- a/net/rds/iw.c | ||
1148 | +++ b/net/rds/iw.c | ||
1149 | @@ -239,7 +239,8 @@ static int rds_iw_laddr_check(__be32 addr) | ||
1150 | ret = rdma_bind_addr(cm_id, (struct sockaddr *)&sin); | ||
1151 | /* due to this, we will claim to support IB devices unless we | ||
1152 | check node_type. */ | ||
1153 | - if (ret || cm_id->device->node_type != RDMA_NODE_RNIC) | ||
1154 | + if (ret || !cm_id->device || | ||
1155 | + cm_id->device->node_type != RDMA_NODE_RNIC) | ||
1156 | ret = -EADDRNOTAVAIL; | ||
1157 | |||
1158 | rdsdebug("addr %pI4 ret %d node type %d\n", | ||
1159 | diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c | ||
1160 | index b332e2cc0954..e294b86c8d88 100644 | ||
1161 | --- a/security/selinux/hooks.c | ||
1162 | +++ b/security/selinux/hooks.c | ||
1163 | @@ -1418,15 +1418,33 @@ static int inode_doinit_with_dentry(struct inode *inode, struct dentry *opt_dent | ||
1164 | isec->sid = sbsec->sid; | ||
1165 | |||
1166 | if ((sbsec->flags & SE_SBPROC) && !S_ISLNK(inode->i_mode)) { | ||
1167 | - if (opt_dentry) { | ||
1168 | - isec->sclass = inode_mode_to_security_class(inode->i_mode); | ||
1169 | - rc = selinux_proc_get_sid(opt_dentry, | ||
1170 | - isec->sclass, | ||
1171 | - &sid); | ||
1172 | - if (rc) | ||
1173 | - goto out_unlock; | ||
1174 | - isec->sid = sid; | ||
1175 | - } | ||
1176 | + /* We must have a dentry to determine the label on | ||
1177 | + * procfs inodes */ | ||
1178 | + if (opt_dentry) | ||
1179 | + /* Called from d_instantiate or | ||
1180 | + * d_splice_alias. */ | ||
1181 | + dentry = dget(opt_dentry); | ||
1182 | + else | ||
1183 | + /* Called from selinux_complete_init, try to | ||
1184 | + * find a dentry. */ | ||
1185 | + dentry = d_find_alias(inode); | ||
1186 | + /* | ||
1187 | + * This can be hit on boot when a file is accessed | ||
1188 | + * before the policy is loaded. When we load policy we | ||
1189 | + * may find inodes that have no dentry on the | ||
1190 | + * sbsec->isec_head list. No reason to complain as | ||
1191 | + * these will get fixed up the next time we go through | ||
1192 | + * inode_doinit() with a dentry, before these inodes | ||
1193 | + * could be used again by userspace. | ||
1194 | + */ | ||
1195 | + if (!dentry) | ||
1196 | + goto out_unlock; | ||
1197 | + isec->sclass = inode_mode_to_security_class(inode->i_mode); | ||
1198 | + rc = selinux_proc_get_sid(dentry, isec->sclass, &sid); | ||
1199 | + dput(dentry); | ||
1200 | + if (rc) | ||
1201 | + goto out_unlock; | ||
1202 | + isec->sid = sid; | ||
1203 | } | ||
1204 | break; | ||
1205 | } | ||
1206 | diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c | ||
1207 | index e354ab1ec20f..a8dec9e9e876 100644 | ||
1208 | --- a/sound/pci/hda/hda_intel.c | ||
1209 | +++ b/sound/pci/hda/hda_intel.c | ||
1210 | @@ -297,9 +297,9 @@ enum { SDI0, SDI1, SDI2, SDI3, SDO0, SDO1, SDO2, SDO3 }; | ||
1211 | #define ULI_NUM_CAPTURE 5 | ||
1212 | #define ULI_NUM_PLAYBACK 6 | ||
1213 | |||
1214 | -/* ATI HDMI may have up to 8 playbacks and 0 capture */ | ||
1215 | +/* ATI HDMI has 1 playback and 0 capture */ | ||
1216 | #define ATIHDMI_NUM_CAPTURE 0 | ||
1217 | -#define ATIHDMI_NUM_PLAYBACK 8 | ||
1218 | +#define ATIHDMI_NUM_PLAYBACK 1 | ||
1219 | |||
1220 | /* TERA has 4 playback and 3 capture */ | ||
1221 | #define TERA_NUM_CAPTURE 3 |