Annotation of /trunk/kernel-alx/patches-5.4/0280-5.4.181-all-fixes.patch
Parent Directory | Revision Log
Revision 3635 -
(hide annotations)
(download)
Mon Oct 24 12:34:12 2022 UTC (19 months ago) by niro
File size: 89573 byte(s)
Mon Oct 24 12:34:12 2022 UTC (19 months ago) by niro
File size: 89573 byte(s)
-sync kernel patches
1 | niro | 3635 | diff --git a/Makefile b/Makefile |
2 | index 6eb6645647147..afe2420bb3de0 100644 | ||
3 | --- a/Makefile | ||
4 | +++ b/Makefile | ||
5 | @@ -1,7 +1,7 @@ | ||
6 | # SPDX-License-Identifier: GPL-2.0 | ||
7 | VERSION = 5 | ||
8 | PATCHLEVEL = 4 | ||
9 | -SUBLEVEL = 180 | ||
10 | +SUBLEVEL = 181 | ||
11 | EXTRAVERSION = | ||
12 | NAME = Kleptomaniac Octopus | ||
13 | |||
14 | diff --git a/arch/arm/mach-omap2/display.c b/arch/arm/mach-omap2/display.c | ||
15 | index 46012ca812f48..1bd64f6ba8cfe 100644 | ||
16 | --- a/arch/arm/mach-omap2/display.c | ||
17 | +++ b/arch/arm/mach-omap2/display.c | ||
18 | @@ -263,9 +263,9 @@ static int __init omapdss_init_of(void) | ||
19 | } | ||
20 | |||
21 | r = of_platform_populate(node, NULL, NULL, &pdev->dev); | ||
22 | + put_device(&pdev->dev); | ||
23 | if (r) { | ||
24 | pr_err("Unable to populate DSS submodule devices\n"); | ||
25 | - put_device(&pdev->dev); | ||
26 | return r; | ||
27 | } | ||
28 | |||
29 | diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c | ||
30 | index 6289b288d60a6..202b740adee0e 100644 | ||
31 | --- a/arch/arm/mach-omap2/omap_hwmod.c | ||
32 | +++ b/arch/arm/mach-omap2/omap_hwmod.c | ||
33 | @@ -782,8 +782,10 @@ static int __init _init_clkctrl_providers(void) | ||
34 | |||
35 | for_each_matching_node(np, ti_clkctrl_match_table) { | ||
36 | ret = _setup_clkctrl_provider(np); | ||
37 | - if (ret) | ||
38 | + if (ret) { | ||
39 | + of_node_put(np); | ||
40 | break; | ||
41 | + } | ||
42 | } | ||
43 | |||
44 | return ret; | ||
45 | diff --git a/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi b/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi | ||
46 | index 9533c85fb0a30..d2d255a988a81 100644 | ||
47 | --- a/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi | ||
48 | +++ b/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi | ||
49 | @@ -76,6 +76,12 @@ | ||
50 | no-map; | ||
51 | }; | ||
52 | |||
53 | + /* 32 MiB reserved for ARM Trusted Firmware (BL32) */ | ||
54 | + secmon_reserved_bl32: secmon@5300000 { | ||
55 | + reg = <0x0 0x05300000 0x0 0x2000000>; | ||
56 | + no-map; | ||
57 | + }; | ||
58 | + | ||
59 | linux,cma { | ||
60 | compatible = "shared-dma-pool"; | ||
61 | reusable; | ||
62 | diff --git a/arch/arm64/boot/dts/amlogic/meson-g12a-sei510.dts b/arch/arm64/boot/dts/amlogic/meson-g12a-sei510.dts | ||
63 | index b8d9e92197ac8..c76bf498ee388 100644 | ||
64 | --- a/arch/arm64/boot/dts/amlogic/meson-g12a-sei510.dts | ||
65 | +++ b/arch/arm64/boot/dts/amlogic/meson-g12a-sei510.dts | ||
66 | @@ -157,14 +157,6 @@ | ||
67 | regulator-always-on; | ||
68 | }; | ||
69 | |||
70 | - reserved-memory { | ||
71 | - /* TEE Reserved Memory */ | ||
72 | - bl32_reserved: bl32@5000000 { | ||
73 | - reg = <0x0 0x05300000 0x0 0x2000000>; | ||
74 | - no-map; | ||
75 | - }; | ||
76 | - }; | ||
77 | - | ||
78 | sdio_pwrseq: sdio-pwrseq { | ||
79 | compatible = "mmc-pwrseq-simple"; | ||
80 | reset-gpios = <&gpio GPIOX_6 GPIO_ACTIVE_LOW>; | ||
81 | diff --git a/arch/arm64/boot/dts/amlogic/meson-gx.dtsi b/arch/arm64/boot/dts/amlogic/meson-gx.dtsi | ||
82 | index ce230d6ac35cd..ad7bc0eec6682 100644 | ||
83 | --- a/arch/arm64/boot/dts/amlogic/meson-gx.dtsi | ||
84 | +++ b/arch/arm64/boot/dts/amlogic/meson-gx.dtsi | ||
85 | @@ -41,6 +41,12 @@ | ||
86 | no-map; | ||
87 | }; | ||
88 | |||
89 | + /* 32 MiB reserved for ARM Trusted Firmware (BL32) */ | ||
90 | + secmon_reserved_bl32: secmon@5300000 { | ||
91 | + reg = <0x0 0x05300000 0x0 0x2000000>; | ||
92 | + no-map; | ||
93 | + }; | ||
94 | + | ||
95 | linux,cma { | ||
96 | compatible = "shared-dma-pool"; | ||
97 | reusable; | ||
98 | diff --git a/arch/arm64/boot/dts/amlogic/meson-sm1-sei610.dts b/arch/arm64/boot/dts/amlogic/meson-sm1-sei610.dts | ||
99 | index 29ac78ddc057e..85fb59060cdff 100644 | ||
100 | --- a/arch/arm64/boot/dts/amlogic/meson-sm1-sei610.dts | ||
101 | +++ b/arch/arm64/boot/dts/amlogic/meson-sm1-sei610.dts | ||
102 | @@ -164,14 +164,6 @@ | ||
103 | regulator-always-on; | ||
104 | }; | ||
105 | |||
106 | - reserved-memory { | ||
107 | - /* TEE Reserved Memory */ | ||
108 | - bl32_reserved: bl32@5000000 { | ||
109 | - reg = <0x0 0x05300000 0x0 0x2000000>; | ||
110 | - no-map; | ||
111 | - }; | ||
112 | - }; | ||
113 | - | ||
114 | sdio_pwrseq: sdio-pwrseq { | ||
115 | compatible = "mmc-pwrseq-simple"; | ||
116 | reset-gpios = <&gpio GPIOX_6 GPIO_ACTIVE_LOW>; | ||
117 | diff --git a/arch/arm64/kernel/ftrace.c b/arch/arm64/kernel/ftrace.c | ||
118 | index 06e56b4703153..822718eafdb44 100644 | ||
119 | --- a/arch/arm64/kernel/ftrace.c | ||
120 | +++ b/arch/arm64/kernel/ftrace.c | ||
121 | @@ -73,9 +73,21 @@ int ftrace_make_call(struct dyn_ftrace *rec, unsigned long addr) | ||
122 | |||
123 | if (offset < -SZ_128M || offset >= SZ_128M) { | ||
124 | #ifdef CONFIG_ARM64_MODULE_PLTS | ||
125 | - struct plt_entry trampoline, *dst; | ||
126 | struct module *mod; | ||
127 | |||
128 | + /* | ||
129 | + * There is only one ftrace trampoline per module. For now, | ||
130 | + * this is not a problem since on arm64, all dynamic ftrace | ||
131 | + * invocations are routed via ftrace_caller(). This will need | ||
132 | + * to be revisited if support for multiple ftrace entry points | ||
133 | + * is added in the future, but for now, the pr_err() below | ||
134 | + * deals with a theoretical issue only. | ||
135 | + */ | ||
136 | + if (addr != FTRACE_ADDR) { | ||
137 | + pr_err("ftrace: far branches to multiple entry points unsupported inside a single module\n"); | ||
138 | + return -EINVAL; | ||
139 | + } | ||
140 | + | ||
141 | /* | ||
142 | * On kernels that support module PLTs, the offset between the | ||
143 | * branch instruction and its target may legally exceed the | ||
144 | @@ -93,46 +105,7 @@ int ftrace_make_call(struct dyn_ftrace *rec, unsigned long addr) | ||
145 | if (WARN_ON(!mod)) | ||
146 | return -EINVAL; | ||
147 | |||
148 | - /* | ||
149 | - * There is only one ftrace trampoline per module. For now, | ||
150 | - * this is not a problem since on arm64, all dynamic ftrace | ||
151 | - * invocations are routed via ftrace_caller(). This will need | ||
152 | - * to be revisited if support for multiple ftrace entry points | ||
153 | - * is added in the future, but for now, the pr_err() below | ||
154 | - * deals with a theoretical issue only. | ||
155 | - * | ||
156 | - * Note that PLTs are place relative, and plt_entries_equal() | ||
157 | - * checks whether they point to the same target. Here, we need | ||
158 | - * to check if the actual opcodes are in fact identical, | ||
159 | - * regardless of the offset in memory so use memcmp() instead. | ||
160 | - */ | ||
161 | - dst = mod->arch.ftrace_trampoline; | ||
162 | - trampoline = get_plt_entry(addr, dst); | ||
163 | - if (memcmp(dst, &trampoline, sizeof(trampoline))) { | ||
164 | - if (plt_entry_is_initialized(dst)) { | ||
165 | - pr_err("ftrace: far branches to multiple entry points unsupported inside a single module\n"); | ||
166 | - return -EINVAL; | ||
167 | - } | ||
168 | - | ||
169 | - /* point the trampoline to our ftrace entry point */ | ||
170 | - module_disable_ro(mod); | ||
171 | - *dst = trampoline; | ||
172 | - module_enable_ro(mod, true); | ||
173 | - | ||
174 | - /* | ||
175 | - * Ensure updated trampoline is visible to instruction | ||
176 | - * fetch before we patch in the branch. Although the | ||
177 | - * architecture doesn't require an IPI in this case, | ||
178 | - * Neoverse-N1 erratum #1542419 does require one | ||
179 | - * if the TLB maintenance in module_enable_ro() is | ||
180 | - * skipped due to rodata_enabled. It doesn't seem worth | ||
181 | - * it to make it conditional given that this is | ||
182 | - * certainly not a fast-path. | ||
183 | - */ | ||
184 | - flush_icache_range((unsigned long)&dst[0], | ||
185 | - (unsigned long)&dst[1]); | ||
186 | - } | ||
187 | - addr = (unsigned long)dst; | ||
188 | + addr = (unsigned long)mod->arch.ftrace_trampoline; | ||
189 | #else /* CONFIG_ARM64_MODULE_PLTS */ | ||
190 | return -EINVAL; | ||
191 | #endif /* CONFIG_ARM64_MODULE_PLTS */ | ||
192 | diff --git a/arch/arm64/kernel/module.c b/arch/arm64/kernel/module.c | ||
193 | index 03ff15bffbb6d..d0692ecb99bb0 100644 | ||
194 | --- a/arch/arm64/kernel/module.c | ||
195 | +++ b/arch/arm64/kernel/module.c | ||
196 | @@ -9,6 +9,7 @@ | ||
197 | |||
198 | #include <linux/bitops.h> | ||
199 | #include <linux/elf.h> | ||
200 | +#include <linux/ftrace.h> | ||
201 | #include <linux/gfp.h> | ||
202 | #include <linux/kasan.h> | ||
203 | #include <linux/kernel.h> | ||
204 | @@ -470,22 +471,48 @@ overflow: | ||
205 | return -ENOEXEC; | ||
206 | } | ||
207 | |||
208 | -int module_finalize(const Elf_Ehdr *hdr, | ||
209 | - const Elf_Shdr *sechdrs, | ||
210 | - struct module *me) | ||
211 | +static const Elf_Shdr *find_section(const Elf_Ehdr *hdr, | ||
212 | + const Elf_Shdr *sechdrs, | ||
213 | + const char *name) | ||
214 | { | ||
215 | const Elf_Shdr *s, *se; | ||
216 | const char *secstrs = (void *)hdr + sechdrs[hdr->e_shstrndx].sh_offset; | ||
217 | |||
218 | for (s = sechdrs, se = sechdrs + hdr->e_shnum; s < se; s++) { | ||
219 | - if (strcmp(".altinstructions", secstrs + s->sh_name) == 0) | ||
220 | - apply_alternatives_module((void *)s->sh_addr, s->sh_size); | ||
221 | -#ifdef CONFIG_ARM64_MODULE_PLTS | ||
222 | - if (IS_ENABLED(CONFIG_DYNAMIC_FTRACE) && | ||
223 | - !strcmp(".text.ftrace_trampoline", secstrs + s->sh_name)) | ||
224 | - me->arch.ftrace_trampoline = (void *)s->sh_addr; | ||
225 | -#endif | ||
226 | + if (strcmp(name, secstrs + s->sh_name) == 0) | ||
227 | + return s; | ||
228 | } | ||
229 | |||
230 | + return NULL; | ||
231 | +} | ||
232 | + | ||
233 | +static int module_init_ftrace_plt(const Elf_Ehdr *hdr, | ||
234 | + const Elf_Shdr *sechdrs, | ||
235 | + struct module *mod) | ||
236 | +{ | ||
237 | +#if defined(CONFIG_ARM64_MODULE_PLTS) && defined(CONFIG_DYNAMIC_FTRACE) | ||
238 | + const Elf_Shdr *s; | ||
239 | + struct plt_entry *plt; | ||
240 | + | ||
241 | + s = find_section(hdr, sechdrs, ".text.ftrace_trampoline"); | ||
242 | + if (!s) | ||
243 | + return -ENOEXEC; | ||
244 | + | ||
245 | + plt = (void *)s->sh_addr; | ||
246 | + *plt = get_plt_entry(FTRACE_ADDR, plt); | ||
247 | + mod->arch.ftrace_trampoline = plt; | ||
248 | +#endif | ||
249 | return 0; | ||
250 | } | ||
251 | + | ||
252 | +int module_finalize(const Elf_Ehdr *hdr, | ||
253 | + const Elf_Shdr *sechdrs, | ||
254 | + struct module *me) | ||
255 | +{ | ||
256 | + const Elf_Shdr *s; | ||
257 | + s = find_section(hdr, sechdrs, ".altinstructions"); | ||
258 | + if (s) | ||
259 | + apply_alternatives_module((void *)s->sh_addr, s->sh_size); | ||
260 | + | ||
261 | + return module_init_ftrace_plt(hdr, sechdrs, me); | ||
262 | +} | ||
263 | diff --git a/arch/parisc/Makefile b/arch/parisc/Makefile | ||
264 | index caa90ae0b4acc..04460c2d2f8c1 100644 | ||
265 | --- a/arch/parisc/Makefile | ||
266 | +++ b/arch/parisc/Makefile | ||
267 | @@ -65,7 +65,6 @@ KBUILD_CFLAGS += -DCC_USING_PATCHABLE_FUNCTION_ENTRY=1 \ | ||
268 | -DFTRACE_PATCHABLE_FUNCTION_SIZE=$(NOP_COUNT) | ||
269 | |||
270 | CC_FLAGS_FTRACE := -fpatchable-function-entry=$(NOP_COUNT),$(shell echo $$(($(NOP_COUNT)-1))) | ||
271 | -KBUILD_LDS_MODULE += $(srctree)/arch/parisc/kernel/module.lds | ||
272 | endif | ||
273 | |||
274 | OBJCOPY_FLAGS =-O binary -R .note -R .comment -S | ||
275 | diff --git a/arch/parisc/kernel/module.c b/arch/parisc/kernel/module.c | ||
276 | index ac5f34993b53b..1c50093e2ebee 100644 | ||
277 | --- a/arch/parisc/kernel/module.c | ||
278 | +++ b/arch/parisc/kernel/module.c | ||
279 | @@ -43,6 +43,7 @@ | ||
280 | #include <linux/elf.h> | ||
281 | #include <linux/vmalloc.h> | ||
282 | #include <linux/fs.h> | ||
283 | +#include <linux/ftrace.h> | ||
284 | #include <linux/string.h> | ||
285 | #include <linux/kernel.h> | ||
286 | #include <linux/bug.h> | ||
287 | @@ -862,7 +863,7 @@ int module_finalize(const Elf_Ehdr *hdr, | ||
288 | const char *strtab = NULL; | ||
289 | const Elf_Shdr *s; | ||
290 | char *secstrings; | ||
291 | - int err, symindex = -1; | ||
292 | + int symindex = -1; | ||
293 | Elf_Sym *newptr, *oldptr; | ||
294 | Elf_Shdr *symhdr = NULL; | ||
295 | #ifdef DEBUG | ||
296 | @@ -946,11 +947,13 @@ int module_finalize(const Elf_Ehdr *hdr, | ||
297 | /* patch .altinstructions */ | ||
298 | apply_alternatives(aseg, aseg + s->sh_size, me->name); | ||
299 | |||
300 | +#ifdef CONFIG_DYNAMIC_FTRACE | ||
301 | /* For 32 bit kernels we're compiling modules with | ||
302 | * -ffunction-sections so we must relocate the addresses in the | ||
303 | - *__mcount_loc section. | ||
304 | + * ftrace callsite section. | ||
305 | */ | ||
306 | - if (symindex != -1 && !strcmp(secname, "__mcount_loc")) { | ||
307 | + if (symindex != -1 && !strcmp(secname, FTRACE_CALLSITE_SECTION)) { | ||
308 | + int err; | ||
309 | if (s->sh_type == SHT_REL) | ||
310 | err = apply_relocate((Elf_Shdr *)sechdrs, | ||
311 | strtab, symindex, | ||
312 | @@ -962,6 +965,7 @@ int module_finalize(const Elf_Ehdr *hdr, | ||
313 | if (err) | ||
314 | return err; | ||
315 | } | ||
316 | +#endif | ||
317 | } | ||
318 | return 0; | ||
319 | } | ||
320 | diff --git a/arch/parisc/kernel/module.lds b/arch/parisc/kernel/module.lds | ||
321 | deleted file mode 100644 | ||
322 | index 1a9a92aca5c8a..0000000000000 | ||
323 | --- a/arch/parisc/kernel/module.lds | ||
324 | +++ /dev/null | ||
325 | @@ -1,7 +0,0 @@ | ||
326 | -/* SPDX-License-Identifier: GPL-2.0 */ | ||
327 | - | ||
328 | -SECTIONS { | ||
329 | - __mcount_loc : { | ||
330 | - *(__patchable_function_entries) | ||
331 | - } | ||
332 | -} | ||
333 | diff --git a/arch/parisc/mm/init.c b/arch/parisc/mm/init.c | ||
334 | index d769d61cde7ca..15b7dae1808db 100644 | ||
335 | --- a/arch/parisc/mm/init.c | ||
336 | +++ b/arch/parisc/mm/init.c | ||
337 | @@ -347,9 +347,9 @@ static void __init setup_bootmem(void) | ||
338 | |||
339 | static bool kernel_set_to_readonly; | ||
340 | |||
341 | -static void __init map_pages(unsigned long start_vaddr, | ||
342 | - unsigned long start_paddr, unsigned long size, | ||
343 | - pgprot_t pgprot, int force) | ||
344 | +static void __ref map_pages(unsigned long start_vaddr, | ||
345 | + unsigned long start_paddr, unsigned long size, | ||
346 | + pgprot_t pgprot, int force) | ||
347 | { | ||
348 | pgd_t *pg_dir; | ||
349 | pmd_t *pmd; | ||
350 | @@ -485,7 +485,7 @@ void __init set_kernel_text_rw(int enable_read_write) | ||
351 | flush_tlb_all(); | ||
352 | } | ||
353 | |||
354 | -void __ref free_initmem(void) | ||
355 | +void free_initmem(void) | ||
356 | { | ||
357 | unsigned long init_begin = (unsigned long)__init_begin; | ||
358 | unsigned long init_end = (unsigned long)__init_end; | ||
359 | @@ -499,7 +499,6 @@ void __ref free_initmem(void) | ||
360 | /* The init text pages are marked R-X. We have to | ||
361 | * flush the icache and mark them RW- | ||
362 | * | ||
363 | - * This is tricky, because map_pages is in the init section. | ||
364 | * Do a dummy remap of the data section first (the data | ||
365 | * section is already PAGE_KERNEL) to pull in the TLB entries | ||
366 | * for map_kernel */ | ||
367 | diff --git a/arch/powerpc/lib/sstep.c b/arch/powerpc/lib/sstep.c | ||
368 | index c077acb983a19..dc6728dacbc6b 100644 | ||
369 | --- a/arch/powerpc/lib/sstep.c | ||
370 | +++ b/arch/powerpc/lib/sstep.c | ||
371 | @@ -2787,12 +2787,14 @@ void emulate_update_regs(struct pt_regs *regs, struct instruction_op *op) | ||
372 | case BARRIER_EIEIO: | ||
373 | eieio(); | ||
374 | break; | ||
375 | +#ifdef CONFIG_PPC64 | ||
376 | case BARRIER_LWSYNC: | ||
377 | asm volatile("lwsync" : : : "memory"); | ||
378 | break; | ||
379 | case BARRIER_PTESYNC: | ||
380 | asm volatile("ptesync" : : : "memory"); | ||
381 | break; | ||
382 | +#endif | ||
383 | } | ||
384 | break; | ||
385 | |||
386 | diff --git a/arch/x86/kvm/pmu.c b/arch/x86/kvm/pmu.c | ||
387 | index 46875bbd04198..e0e3776059af4 100644 | ||
388 | --- a/arch/x86/kvm/pmu.c | ||
389 | +++ b/arch/x86/kvm/pmu.c | ||
390 | @@ -191,7 +191,7 @@ void reprogram_gp_counter(struct kvm_pmc *pmc, u64 eventsel) | ||
391 | } | ||
392 | |||
393 | if (type == PERF_TYPE_RAW) | ||
394 | - config = eventsel & X86_RAW_EVENT_MASK; | ||
395 | + config = eventsel & AMD64_RAW_EVENT_MASK; | ||
396 | |||
397 | pmc_reprogram_counter(pmc, type, config, | ||
398 | !(eventsel & ARCH_PERFMON_EVENTSEL_USR), | ||
399 | diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c | ||
400 | index 425444d080712..2f84509f28289 100644 | ||
401 | --- a/arch/x86/kvm/svm.c | ||
402 | +++ b/arch/x86/kvm/svm.c | ||
403 | @@ -4585,8 +4585,6 @@ static int avic_incomplete_ipi_interception(struct vcpu_svm *svm) | ||
404 | break; | ||
405 | } | ||
406 | case AVIC_IPI_FAILURE_INVALID_TARGET: | ||
407 | - WARN_ONCE(1, "Invalid IPI target: index=%u, vcpu=%d, icr=%#0x:%#0x\n", | ||
408 | - index, svm->vcpu.vcpu_id, icrh, icrl); | ||
409 | break; | ||
410 | case AVIC_IPI_FAILURE_INVALID_BACKING_PAGE: | ||
411 | WARN_ONCE(1, "Invalid backing page\n"); | ||
412 | diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c | ||
413 | index 73bffd7af15c1..1a0c581512f28 100644 | ||
414 | --- a/block/bfq-iosched.c | ||
415 | +++ b/block/bfq-iosched.c | ||
416 | @@ -6389,6 +6389,8 @@ static void bfq_exit_queue(struct elevator_queue *e) | ||
417 | spin_unlock_irq(&bfqd->lock); | ||
418 | #endif | ||
419 | |||
420 | + wbt_enable_default(bfqd->queue); | ||
421 | + | ||
422 | kfree(bfqd); | ||
423 | } | ||
424 | |||
425 | diff --git a/block/elevator.c b/block/elevator.c | ||
426 | index 076ba7308e65c..78805c74ea8a4 100644 | ||
427 | --- a/block/elevator.c | ||
428 | +++ b/block/elevator.c | ||
429 | @@ -522,8 +522,6 @@ void elv_unregister_queue(struct request_queue *q) | ||
430 | kobject_del(&e->kobj); | ||
431 | |||
432 | e->registered = 0; | ||
433 | - /* Re-enable throttling in case elevator disabled it */ | ||
434 | - wbt_enable_default(q); | ||
435 | } | ||
436 | } | ||
437 | |||
438 | diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c | ||
439 | index 92fb1f5b240e8..dca1590f295d0 100644 | ||
440 | --- a/drivers/ata/libata-core.c | ||
441 | +++ b/drivers/ata/libata-core.c | ||
442 | @@ -4595,6 +4595,7 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = { | ||
443 | |||
444 | /* devices that don't properly handle TRIM commands */ | ||
445 | { "SuperSSpeed S238*", NULL, ATA_HORKAGE_NOTRIM, }, | ||
446 | + { "M88V29*", NULL, ATA_HORKAGE_NOTRIM, }, | ||
447 | |||
448 | /* | ||
449 | * As defined, the DRAT (Deterministic Read After Trim) and RZAT | ||
450 | diff --git a/drivers/dma/at_xdmac.c b/drivers/dma/at_xdmac.c | ||
451 | index f63d141481a3f..9aae6b3da356b 100644 | ||
452 | --- a/drivers/dma/at_xdmac.c | ||
453 | +++ b/drivers/dma/at_xdmac.c | ||
454 | @@ -1726,11 +1726,13 @@ static irqreturn_t at_xdmac_interrupt(int irq, void *dev_id) | ||
455 | static void at_xdmac_issue_pending(struct dma_chan *chan) | ||
456 | { | ||
457 | struct at_xdmac_chan *atchan = to_at_xdmac_chan(chan); | ||
458 | + unsigned long flags; | ||
459 | |||
460 | dev_dbg(chan2dev(&atchan->chan), "%s\n", __func__); | ||
461 | |||
462 | - if (!at_xdmac_chan_is_cyclic(atchan)) | ||
463 | - at_xdmac_advance_work(atchan); | ||
464 | + spin_lock_irqsave(&atchan->lock, flags); | ||
465 | + at_xdmac_advance_work(atchan); | ||
466 | + spin_unlock_irqrestore(&atchan->lock, flags); | ||
467 | |||
468 | return; | ||
469 | } | ||
470 | diff --git a/drivers/dma/sh/rcar-dmac.c b/drivers/dma/sh/rcar-dmac.c | ||
471 | index 89eb9ea258149..eba942441e382 100644 | ||
472 | --- a/drivers/dma/sh/rcar-dmac.c | ||
473 | +++ b/drivers/dma/sh/rcar-dmac.c | ||
474 | @@ -1825,7 +1825,9 @@ static int rcar_dmac_probe(struct platform_device *pdev) | ||
475 | platform_set_drvdata(pdev, dmac); | ||
476 | dmac->dev->dma_parms = &dmac->parms; | ||
477 | dma_set_max_seg_size(dmac->dev, RCAR_DMATCR_MASK); | ||
478 | - dma_set_mask_and_coherent(dmac->dev, DMA_BIT_MASK(40)); | ||
479 | + ret = dma_set_mask_and_coherent(dmac->dev, DMA_BIT_MASK(40)); | ||
480 | + if (ret) | ||
481 | + return ret; | ||
482 | |||
483 | ret = rcar_dmac_parse_of(&pdev->dev, dmac); | ||
484 | if (ret < 0) | ||
485 | diff --git a/drivers/edac/edac_mc.c b/drivers/edac/edac_mc.c | ||
486 | index e73ca303f1a7e..78e4a070896fc 100644 | ||
487 | --- a/drivers/edac/edac_mc.c | ||
488 | +++ b/drivers/edac/edac_mc.c | ||
489 | @@ -263,7 +263,7 @@ void *edac_align_ptr(void **p, unsigned int size, int n_elems) | ||
490 | else | ||
491 | return (char *)ptr; | ||
492 | |||
493 | - r = (unsigned long)p % align; | ||
494 | + r = (unsigned long)ptr % align; | ||
495 | |||
496 | if (r == 0) | ||
497 | return (char *)ptr; | ||
498 | diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | ||
499 | index 58e14d3040f03..870dd78d5a21a 100644 | ||
500 | --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | ||
501 | +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | ||
502 | @@ -1976,7 +1976,7 @@ int amdgpu_copy_buffer(struct amdgpu_ring *ring, uint64_t src_offset, | ||
503 | unsigned i; | ||
504 | int r; | ||
505 | |||
506 | - if (direct_submit && !ring->sched.ready) { | ||
507 | + if (!direct_submit && !ring->sched.ready) { | ||
508 | DRM_ERROR("Trying to move memory with ring turned off.\n"); | ||
509 | return -EINVAL; | ||
510 | } | ||
511 | diff --git a/drivers/gpu/drm/radeon/atombios_encoders.c b/drivers/gpu/drm/radeon/atombios_encoders.c | ||
512 | index cc8f32a1b03c6..92ffed5c1d690 100644 | ||
513 | --- a/drivers/gpu/drm/radeon/atombios_encoders.c | ||
514 | +++ b/drivers/gpu/drm/radeon/atombios_encoders.c | ||
515 | @@ -197,7 +197,8 @@ void radeon_atom_backlight_init(struct radeon_encoder *radeon_encoder, | ||
516 | * so don't register a backlight device | ||
517 | */ | ||
518 | if ((rdev->pdev->subsystem_vendor == PCI_VENDOR_ID_APPLE) && | ||
519 | - (rdev->pdev->device == 0x6741)) | ||
520 | + (rdev->pdev->device == 0x6741) && | ||
521 | + !dmi_match(DMI_PRODUCT_NAME, "iMac12,1")) | ||
522 | return; | ||
523 | |||
524 | if (!radeon_encoder->enc_priv) | ||
525 | diff --git a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c | ||
526 | index 906891b03a38d..7805091bac32d 100644 | ||
527 | --- a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c | ||
528 | +++ b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c | ||
529 | @@ -528,13 +528,6 @@ static int dw_hdmi_rockchip_bind(struct device *dev, struct device *master, | ||
530 | return ret; | ||
531 | } | ||
532 | |||
533 | - ret = clk_prepare_enable(hdmi->vpll_clk); | ||
534 | - if (ret) { | ||
535 | - DRM_DEV_ERROR(hdmi->dev, "Failed to enable HDMI vpll: %d\n", | ||
536 | - ret); | ||
537 | - return ret; | ||
538 | - } | ||
539 | - | ||
540 | hdmi->phy = devm_phy_optional_get(dev, "hdmi"); | ||
541 | if (IS_ERR(hdmi->phy)) { | ||
542 | ret = PTR_ERR(hdmi->phy); | ||
543 | @@ -543,6 +536,13 @@ static int dw_hdmi_rockchip_bind(struct device *dev, struct device *master, | ||
544 | return ret; | ||
545 | } | ||
546 | |||
547 | + ret = clk_prepare_enable(hdmi->vpll_clk); | ||
548 | + if (ret) { | ||
549 | + DRM_DEV_ERROR(hdmi->dev, "Failed to enable HDMI vpll: %d\n", | ||
550 | + ret); | ||
551 | + return ret; | ||
552 | + } | ||
553 | + | ||
554 | drm_encoder_helper_add(encoder, &dw_hdmi_rockchip_encoder_helper_funcs); | ||
555 | drm_encoder_init(drm, encoder, &dw_hdmi_rockchip_encoder_funcs, | ||
556 | DRM_MODE_ENCODER_TMDS, NULL); | ||
557 | diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h | ||
558 | index 26758ea844c92..c587a77d493c1 100644 | ||
559 | --- a/drivers/hid/hid-ids.h | ||
560 | +++ b/drivers/hid/hid-ids.h | ||
561 | @@ -1311,6 +1311,7 @@ | ||
562 | #define USB_VENDOR_ID_UGTIZER 0x2179 | ||
563 | #define USB_DEVICE_ID_UGTIZER_TABLET_GP0610 0x0053 | ||
564 | #define USB_DEVICE_ID_UGTIZER_TABLET_GT5040 0x0077 | ||
565 | +#define USB_DEVICE_ID_UGTIZER_TABLET_WP5540 0x0004 | ||
566 | |||
567 | #define USB_VENDOR_ID_VIEWSONIC 0x0543 | ||
568 | #define USB_DEVICE_ID_VIEWSONIC_PD1011 0xe621 | ||
569 | diff --git a/drivers/hid/hid-quirks.c b/drivers/hid/hid-quirks.c | ||
570 | index 8a0132c54c312..45eba224cdc77 100644 | ||
571 | --- a/drivers/hid/hid-quirks.c | ||
572 | +++ b/drivers/hid/hid-quirks.c | ||
573 | @@ -187,6 +187,7 @@ static const struct hid_device_id hid_quirks[] = { | ||
574 | { HID_USB_DEVICE(USB_VENDOR_ID_TURBOX, USB_DEVICE_ID_TURBOX_KEYBOARD), HID_QUIRK_NOGET }, | ||
575 | { HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_KNA5), HID_QUIRK_MULTI_INPUT }, | ||
576 | { HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_TWA60), HID_QUIRK_MULTI_INPUT }, | ||
577 | + { HID_USB_DEVICE(USB_VENDOR_ID_UGTIZER, USB_DEVICE_ID_UGTIZER_TABLET_WP5540), HID_QUIRK_MULTI_INPUT }, | ||
578 | { HID_USB_DEVICE(USB_VENDOR_ID_WALTOP, USB_DEVICE_ID_WALTOP_MEDIA_TABLET_10_6_INCH), HID_QUIRK_MULTI_INPUT }, | ||
579 | { HID_USB_DEVICE(USB_VENDOR_ID_WALTOP, USB_DEVICE_ID_WALTOP_MEDIA_TABLET_14_1_INCH), HID_QUIRK_MULTI_INPUT }, | ||
580 | { HID_USB_DEVICE(USB_VENDOR_ID_WALTOP, USB_DEVICE_ID_WALTOP_SIRIUS_BATTERY_FREE_TABLET), HID_QUIRK_MULTI_INPUT }, | ||
581 | diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c | ||
582 | index 2d2568dac2a66..6b7ab8f234e87 100644 | ||
583 | --- a/drivers/hv/vmbus_drv.c | ||
584 | +++ b/drivers/hv/vmbus_drv.c | ||
585 | @@ -1787,8 +1787,10 @@ int vmbus_add_channel_kobj(struct hv_device *dev, struct vmbus_channel *channel) | ||
586 | kobj->kset = dev->channels_kset; | ||
587 | ret = kobject_init_and_add(kobj, &vmbus_chan_ktype, NULL, | ||
588 | "%u", relid); | ||
589 | - if (ret) | ||
590 | + if (ret) { | ||
591 | + kobject_put(kobj); | ||
592 | return ret; | ||
593 | + } | ||
594 | |||
595 | ret = sysfs_create_group(kobj, &vmbus_chan_group); | ||
596 | |||
597 | @@ -1797,6 +1799,7 @@ int vmbus_add_channel_kobj(struct hv_device *dev, struct vmbus_channel *channel) | ||
598 | * The calling functions' error handling paths will cleanup the | ||
599 | * empty channel directory. | ||
600 | */ | ||
601 | + kobject_put(kobj); | ||
602 | dev_err(device, "Unable to set up channel sysfs files\n"); | ||
603 | return ret; | ||
604 | } | ||
605 | diff --git a/drivers/i2c/busses/i2c-brcmstb.c b/drivers/i2c/busses/i2c-brcmstb.c | ||
606 | index 5e89cd6b690ce..36b8aceb972fc 100644 | ||
607 | --- a/drivers/i2c/busses/i2c-brcmstb.c | ||
608 | +++ b/drivers/i2c/busses/i2c-brcmstb.c | ||
609 | @@ -640,7 +640,7 @@ static int brcmstb_i2c_probe(struct platform_device *pdev) | ||
610 | |||
611 | /* set the data in/out register size for compatible SoCs */ | ||
612 | if (of_device_is_compatible(dev->device->of_node, | ||
613 | - "brcmstb,brcmper-i2c")) | ||
614 | + "brcm,brcmper-i2c")) | ||
615 | dev->data_regsz = sizeof(u8); | ||
616 | else | ||
617 | dev->data_regsz = sizeof(u32); | ||
618 | diff --git a/drivers/irqchip/irq-sifive-plic.c b/drivers/irqchip/irq-sifive-plic.c | ||
619 | index 7cd7b140dfe97..9dad45d928bfe 100644 | ||
620 | --- a/drivers/irqchip/irq-sifive-plic.c | ||
621 | +++ b/drivers/irqchip/irq-sifive-plic.c | ||
622 | @@ -313,3 +313,4 @@ out_iounmap: | ||
623 | |||
624 | IRQCHIP_DECLARE(sifive_plic, "sifive,plic-1.0.0", plic_init); | ||
625 | IRQCHIP_DECLARE(riscv_plic0, "riscv,plic0", plic_init); /* for legacy systems */ | ||
626 | +IRQCHIP_DECLARE(thead_c900_plic, "thead,c900-plic", plic_init); /* for firmware driver */ | ||
627 | diff --git a/drivers/mmc/core/block.c b/drivers/mmc/core/block.c | ||
628 | index e92f9373e2274..362ad361d5861 100644 | ||
629 | --- a/drivers/mmc/core/block.c | ||
630 | +++ b/drivers/mmc/core/block.c | ||
631 | @@ -1671,31 +1671,31 @@ static void mmc_blk_read_single(struct mmc_queue *mq, struct request *req) | ||
632 | struct mmc_card *card = mq->card; | ||
633 | struct mmc_host *host = card->host; | ||
634 | blk_status_t error = BLK_STS_OK; | ||
635 | - int retries = 0; | ||
636 | |||
637 | do { | ||
638 | u32 status; | ||
639 | int err; | ||
640 | + int retries = 0; | ||
641 | |||
642 | - mmc_blk_rw_rq_prep(mqrq, card, 1, mq); | ||
643 | + while (retries++ <= MMC_READ_SINGLE_RETRIES) { | ||
644 | + mmc_blk_rw_rq_prep(mqrq, card, 1, mq); | ||
645 | |||
646 | - mmc_wait_for_req(host, mrq); | ||
647 | + mmc_wait_for_req(host, mrq); | ||
648 | |||
649 | - err = mmc_send_status(card, &status); | ||
650 | - if (err) | ||
651 | - goto error_exit; | ||
652 | - | ||
653 | - if (!mmc_host_is_spi(host) && | ||
654 | - !mmc_blk_in_tran_state(status)) { | ||
655 | - err = mmc_blk_fix_state(card, req); | ||
656 | + err = mmc_send_status(card, &status); | ||
657 | if (err) | ||
658 | goto error_exit; | ||
659 | - } | ||
660 | |||
661 | - if (mrq->cmd->error && retries++ < MMC_READ_SINGLE_RETRIES) | ||
662 | - continue; | ||
663 | + if (!mmc_host_is_spi(host) && | ||
664 | + !mmc_blk_in_tran_state(status)) { | ||
665 | + err = mmc_blk_fix_state(card, req); | ||
666 | + if (err) | ||
667 | + goto error_exit; | ||
668 | + } | ||
669 | |||
670 | - retries = 0; | ||
671 | + if (!mrq->cmd->error) | ||
672 | + break; | ||
673 | + } | ||
674 | |||
675 | if (mrq->cmd->error || | ||
676 | mrq->data->error || | ||
677 | diff --git a/drivers/mtd/nand/raw/brcmnand/brcmnand.c b/drivers/mtd/nand/raw/brcmnand/brcmnand.c | ||
678 | index 0f3c09fb9c34f..bd9f45edc9a34 100644 | ||
679 | --- a/drivers/mtd/nand/raw/brcmnand/brcmnand.c | ||
680 | +++ b/drivers/mtd/nand/raw/brcmnand/brcmnand.c | ||
681 | @@ -1756,7 +1756,7 @@ static int brcmnand_read_by_pio(struct mtd_info *mtd, struct nand_chip *chip, | ||
682 | mtd->oobsize / trans, | ||
683 | host->hwcfg.sector_size_1k); | ||
684 | |||
685 | - if (!ret) { | ||
686 | + if (ret != -EBADMSG) { | ||
687 | *err_addr = brcmnand_get_uncorrecc_addr(ctrl); | ||
688 | |||
689 | if (*err_addr) | ||
690 | diff --git a/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c b/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c | ||
691 | index 515094e253dcd..ab2f824abf549 100644 | ||
692 | --- a/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c | ||
693 | +++ b/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c | ||
694 | @@ -2442,7 +2442,7 @@ static int gpmi_nfc_exec_op(struct nand_chip *chip, | ||
695 | this->hw.must_apply_timings = false; | ||
696 | ret = gpmi_nfc_apply_timings(this); | ||
697 | if (ret) | ||
698 | - return ret; | ||
699 | + goto out_pm; | ||
700 | } | ||
701 | |||
702 | dev_dbg(this->dev, "%s: %d instructions\n", __func__, op->ninstrs); | ||
703 | @@ -2571,6 +2571,7 @@ unmap: | ||
704 | |||
705 | this->bch = false; | ||
706 | |||
707 | +out_pm: | ||
708 | pm_runtime_mark_last_busy(this->dev); | ||
709 | pm_runtime_put_autosuspend(this->dev); | ||
710 | |||
711 | diff --git a/drivers/mtd/nand/raw/qcom_nandc.c b/drivers/mtd/nand/raw/qcom_nandc.c | ||
712 | index c10995ca624a6..5af3bef6c2303 100644 | ||
713 | --- a/drivers/mtd/nand/raw/qcom_nandc.c | ||
714 | +++ b/drivers/mtd/nand/raw/qcom_nandc.c | ||
715 | @@ -2,7 +2,6 @@ | ||
716 | /* | ||
717 | * Copyright (c) 2016, The Linux Foundation. All rights reserved. | ||
718 | */ | ||
719 | - | ||
720 | #include <linux/clk.h> | ||
721 | #include <linux/slab.h> | ||
722 | #include <linux/bitops.h> | ||
723 | @@ -2944,10 +2943,6 @@ static int qcom_nandc_probe(struct platform_device *pdev) | ||
724 | if (!nandc->base_dma) | ||
725 | return -ENXIO; | ||
726 | |||
727 | - ret = qcom_nandc_alloc(nandc); | ||
728 | - if (ret) | ||
729 | - goto err_nandc_alloc; | ||
730 | - | ||
731 | ret = clk_prepare_enable(nandc->core_clk); | ||
732 | if (ret) | ||
733 | goto err_core_clk; | ||
734 | @@ -2956,6 +2951,10 @@ static int qcom_nandc_probe(struct platform_device *pdev) | ||
735 | if (ret) | ||
736 | goto err_aon_clk; | ||
737 | |||
738 | + ret = qcom_nandc_alloc(nandc); | ||
739 | + if (ret) | ||
740 | + goto err_nandc_alloc; | ||
741 | + | ||
742 | ret = qcom_nandc_setup(nandc); | ||
743 | if (ret) | ||
744 | goto err_setup; | ||
745 | @@ -2967,15 +2966,14 @@ static int qcom_nandc_probe(struct platform_device *pdev) | ||
746 | return 0; | ||
747 | |||
748 | err_setup: | ||
749 | + qcom_nandc_unalloc(nandc); | ||
750 | +err_nandc_alloc: | ||
751 | clk_disable_unprepare(nandc->aon_clk); | ||
752 | err_aon_clk: | ||
753 | clk_disable_unprepare(nandc->core_clk); | ||
754 | err_core_clk: | ||
755 | - qcom_nandc_unalloc(nandc); | ||
756 | -err_nandc_alloc: | ||
757 | dma_unmap_resource(dev, res->start, resource_size(res), | ||
758 | DMA_BIDIRECTIONAL, 0); | ||
759 | - | ||
760 | return ret; | ||
761 | } | ||
762 | |||
763 | diff --git a/drivers/net/bonding/bond_3ad.c b/drivers/net/bonding/bond_3ad.c | ||
764 | index ed170d803247a..41e58bd2e6069 100644 | ||
765 | --- a/drivers/net/bonding/bond_3ad.c | ||
766 | +++ b/drivers/net/bonding/bond_3ad.c | ||
767 | @@ -233,7 +233,7 @@ static inline int __check_agg_selection_timer(struct port *port) | ||
768 | if (bond == NULL) | ||
769 | return 0; | ||
770 | |||
771 | - return BOND_AD_INFO(bond).agg_select_timer ? 1 : 0; | ||
772 | + return atomic_read(&BOND_AD_INFO(bond).agg_select_timer) ? 1 : 0; | ||
773 | } | ||
774 | |||
775 | /** | ||
776 | @@ -1985,7 +1985,7 @@ static void ad_marker_response_received(struct bond_marker *marker, | ||
777 | */ | ||
778 | void bond_3ad_initiate_agg_selection(struct bonding *bond, int timeout) | ||
779 | { | ||
780 | - BOND_AD_INFO(bond).agg_select_timer = timeout; | ||
781 | + atomic_set(&BOND_AD_INFO(bond).agg_select_timer, timeout); | ||
782 | } | ||
783 | |||
784 | /** | ||
785 | @@ -2268,6 +2268,28 @@ void bond_3ad_update_ad_actor_settings(struct bonding *bond) | ||
786 | spin_unlock_bh(&bond->mode_lock); | ||
787 | } | ||
788 | |||
789 | +/** | ||
790 | + * bond_agg_timer_advance - advance agg_select_timer | ||
791 | + * @bond: bonding structure | ||
792 | + * | ||
793 | + * Return true when agg_select_timer reaches 0. | ||
794 | + */ | ||
795 | +static bool bond_agg_timer_advance(struct bonding *bond) | ||
796 | +{ | ||
797 | + int val, nval; | ||
798 | + | ||
799 | + while (1) { | ||
800 | + val = atomic_read(&BOND_AD_INFO(bond).agg_select_timer); | ||
801 | + if (!val) | ||
802 | + return false; | ||
803 | + nval = val - 1; | ||
804 | + if (atomic_cmpxchg(&BOND_AD_INFO(bond).agg_select_timer, | ||
805 | + val, nval) == val) | ||
806 | + break; | ||
807 | + } | ||
808 | + return nval == 0; | ||
809 | +} | ||
810 | + | ||
811 | /** | ||
812 | * bond_3ad_state_machine_handler - handle state machines timeout | ||
813 | * @bond: bonding struct to work on | ||
814 | @@ -2303,9 +2325,7 @@ void bond_3ad_state_machine_handler(struct work_struct *work) | ||
815 | if (!bond_has_slaves(bond)) | ||
816 | goto re_arm; | ||
817 | |||
818 | - /* check if agg_select_timer timer after initialize is timed out */ | ||
819 | - if (BOND_AD_INFO(bond).agg_select_timer && | ||
820 | - !(--BOND_AD_INFO(bond).agg_select_timer)) { | ||
821 | + if (bond_agg_timer_advance(bond)) { | ||
822 | slave = bond_first_slave_rcu(bond); | ||
823 | port = slave ? &(SLAVE_AD_INFO(slave)->port) : NULL; | ||
824 | |||
825 | diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c | ||
826 | index ff50ccc7dceb1..d6ecd03b60452 100644 | ||
827 | --- a/drivers/net/bonding/bond_main.c | ||
828 | +++ b/drivers/net/bonding/bond_main.c | ||
829 | @@ -1979,10 +1979,9 @@ static int __bond_release_one(struct net_device *bond_dev, | ||
830 | bond_select_active_slave(bond); | ||
831 | } | ||
832 | |||
833 | - if (!bond_has_slaves(bond)) { | ||
834 | - bond_set_carrier(bond); | ||
835 | + bond_set_carrier(bond); | ||
836 | + if (!bond_has_slaves(bond)) | ||
837 | eth_hw_addr_random(bond_dev); | ||
838 | - } | ||
839 | |||
840 | unblock_netpoll_tx(); | ||
841 | synchronize_rcu(); | ||
842 | diff --git a/drivers/net/dsa/lan9303-core.c b/drivers/net/dsa/lan9303-core.c | ||
843 | index 19d1f1c51f97e..4b9d5b0ce416b 100644 | ||
844 | --- a/drivers/net/dsa/lan9303-core.c | ||
845 | +++ b/drivers/net/dsa/lan9303-core.c | ||
846 | @@ -1303,7 +1303,7 @@ static int lan9303_probe_reset_gpio(struct lan9303 *chip, | ||
847 | struct device_node *np) | ||
848 | { | ||
849 | chip->reset_gpio = devm_gpiod_get_optional(chip->dev, "reset", | ||
850 | - GPIOD_OUT_LOW); | ||
851 | + GPIOD_OUT_HIGH); | ||
852 | if (IS_ERR(chip->reset_gpio)) | ||
853 | return PTR_ERR(chip->reset_gpio); | ||
854 | |||
855 | diff --git a/drivers/net/ethernet/cadence/macb_main.c b/drivers/net/ethernet/cadence/macb_main.c | ||
856 | index ebd0853a6f313..0dc52cf5367e7 100644 | ||
857 | --- a/drivers/net/ethernet/cadence/macb_main.c | ||
858 | +++ b/drivers/net/ethernet/cadence/macb_main.c | ||
859 | @@ -4284,7 +4284,7 @@ static int macb_probe(struct platform_device *pdev) | ||
860 | |||
861 | #ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT | ||
862 | if (GEM_BFEXT(DAW64, gem_readl(bp, DCFG6))) { | ||
863 | - dma_set_mask(&pdev->dev, DMA_BIT_MASK(44)); | ||
864 | + dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(44)); | ||
865 | bp->hw_dma_cap |= HW_DMA_CAP_64B; | ||
866 | } | ||
867 | #endif | ||
868 | diff --git a/drivers/net/ieee802154/at86rf230.c b/drivers/net/ieee802154/at86rf230.c | ||
869 | index 7d67f41387f55..4f5ef8a9a9a87 100644 | ||
870 | --- a/drivers/net/ieee802154/at86rf230.c | ||
871 | +++ b/drivers/net/ieee802154/at86rf230.c | ||
872 | @@ -100,6 +100,7 @@ struct at86rf230_local { | ||
873 | unsigned long cal_timeout; | ||
874 | bool is_tx; | ||
875 | bool is_tx_from_off; | ||
876 | + bool was_tx; | ||
877 | u8 tx_retry; | ||
878 | struct sk_buff *tx_skb; | ||
879 | struct at86rf230_state_change tx; | ||
880 | @@ -343,7 +344,11 @@ at86rf230_async_error_recover_complete(void *context) | ||
881 | if (ctx->free) | ||
882 | kfree(ctx); | ||
883 | |||
884 | - ieee802154_wake_queue(lp->hw); | ||
885 | + if (lp->was_tx) { | ||
886 | + lp->was_tx = 0; | ||
887 | + dev_kfree_skb_any(lp->tx_skb); | ||
888 | + ieee802154_wake_queue(lp->hw); | ||
889 | + } | ||
890 | } | ||
891 | |||
892 | static void | ||
893 | @@ -352,7 +357,11 @@ at86rf230_async_error_recover(void *context) | ||
894 | struct at86rf230_state_change *ctx = context; | ||
895 | struct at86rf230_local *lp = ctx->lp; | ||
896 | |||
897 | - lp->is_tx = 0; | ||
898 | + if (lp->is_tx) { | ||
899 | + lp->was_tx = 1; | ||
900 | + lp->is_tx = 0; | ||
901 | + } | ||
902 | + | ||
903 | at86rf230_async_state_change(lp, ctx, STATE_RX_AACK_ON, | ||
904 | at86rf230_async_error_recover_complete); | ||
905 | } | ||
906 | diff --git a/drivers/net/ieee802154/ca8210.c b/drivers/net/ieee802154/ca8210.c | ||
907 | index 7c131a423cafa..47959aadbc503 100644 | ||
908 | --- a/drivers/net/ieee802154/ca8210.c | ||
909 | +++ b/drivers/net/ieee802154/ca8210.c | ||
910 | @@ -2976,8 +2976,8 @@ static void ca8210_hw_setup(struct ieee802154_hw *ca8210_hw) | ||
911 | ca8210_hw->phy->cca.opt = NL802154_CCA_OPT_ENERGY_CARRIER_AND; | ||
912 | ca8210_hw->phy->cca_ed_level = -9800; | ||
913 | ca8210_hw->phy->symbol_duration = 16; | ||
914 | - ca8210_hw->phy->lifs_period = 40; | ||
915 | - ca8210_hw->phy->sifs_period = 12; | ||
916 | + ca8210_hw->phy->lifs_period = 40 * ca8210_hw->phy->symbol_duration; | ||
917 | + ca8210_hw->phy->sifs_period = 12 * ca8210_hw->phy->symbol_duration; | ||
918 | ca8210_hw->flags = | ||
919 | IEEE802154_HW_AFILT | | ||
920 | IEEE802154_HW_OMIT_CKSUM | | ||
921 | diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c | ||
922 | index 6508d70056b3a..566ea48fd6078 100644 | ||
923 | --- a/drivers/net/usb/qmi_wwan.c | ||
924 | +++ b/drivers/net/usb/qmi_wwan.c | ||
925 | @@ -1355,6 +1355,8 @@ static const struct usb_device_id products[] = { | ||
926 | {QMI_FIXED_INTF(0x413c, 0x81d7, 0)}, /* Dell Wireless 5821e */ | ||
927 | {QMI_FIXED_INTF(0x413c, 0x81d7, 1)}, /* Dell Wireless 5821e preproduction config */ | ||
928 | {QMI_FIXED_INTF(0x413c, 0x81e0, 0)}, /* Dell Wireless 5821e with eSIM support*/ | ||
929 | + {QMI_FIXED_INTF(0x413c, 0x81e4, 0)}, /* Dell Wireless 5829e with eSIM support*/ | ||
930 | + {QMI_FIXED_INTF(0x413c, 0x81e6, 0)}, /* Dell Wireless 5829e */ | ||
931 | {QMI_FIXED_INTF(0x03f0, 0x4e1d, 8)}, /* HP lt4111 LTE/EV-DO/HSPA+ Gobi 4G Module */ | ||
932 | {QMI_FIXED_INTF(0x03f0, 0x9d1d, 1)}, /* HP lt4120 Snapdragon X5 LTE */ | ||
933 | {QMI_FIXED_INTF(0x22de, 0x9061, 3)}, /* WeTelecom WPD-600N */ | ||
934 | diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-drv.c b/drivers/net/wireless/intel/iwlwifi/iwl-drv.c | ||
935 | index 83cb2ad03451b..1848b957dc5cd 100644 | ||
936 | --- a/drivers/net/wireless/intel/iwlwifi/iwl-drv.c | ||
937 | +++ b/drivers/net/wireless/intel/iwlwifi/iwl-drv.c | ||
938 | @@ -1616,6 +1616,8 @@ static void iwl_req_fw_callback(const struct firmware *ucode_raw, void *context) | ||
939 | out_unbind: | ||
940 | complete(&drv->request_firmware_complete); | ||
941 | device_release_driver(drv->trans->dev); | ||
942 | + /* drv has just been freed by the release */ | ||
943 | + failure = false; | ||
944 | free: | ||
945 | if (failure) | ||
946 | iwl_dealloc_ucode(drv); | ||
947 | diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/trans-gen2.c b/drivers/net/wireless/intel/iwlwifi/pcie/trans-gen2.c | ||
948 | index ee45e475405a1..fba6fff13349e 100644 | ||
949 | --- a/drivers/net/wireless/intel/iwlwifi/pcie/trans-gen2.c | ||
950 | +++ b/drivers/net/wireless/intel/iwlwifi/pcie/trans-gen2.c | ||
951 | @@ -292,8 +292,7 @@ int iwl_trans_pcie_gen2_start_fw(struct iwl_trans *trans, | ||
952 | /* This may fail if AMT took ownership of the device */ | ||
953 | if (iwl_pcie_prepare_card_hw(trans)) { | ||
954 | IWL_WARN(trans, "Exit HW not ready\n"); | ||
955 | - ret = -EIO; | ||
956 | - goto out; | ||
957 | + return -EIO; | ||
958 | } | ||
959 | |||
960 | iwl_enable_rfkill_int(trans); | ||
961 | diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c | ||
962 | index 0581f082301e0..8915030030c4c 100644 | ||
963 | --- a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c | ||
964 | +++ b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c | ||
965 | @@ -1335,8 +1335,7 @@ static int iwl_trans_pcie_start_fw(struct iwl_trans *trans, | ||
966 | /* This may fail if AMT took ownership of the device */ | ||
967 | if (iwl_pcie_prepare_card_hw(trans)) { | ||
968 | IWL_WARN(trans, "Exit HW not ready\n"); | ||
969 | - ret = -EIO; | ||
970 | - goto out; | ||
971 | + return -EIO; | ||
972 | } | ||
973 | |||
974 | iwl_enable_rfkill_int(trans); | ||
975 | diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c | ||
976 | index a5b5a2305791d..6a9a42809f972 100644 | ||
977 | --- a/drivers/nvme/host/core.c | ||
978 | +++ b/drivers/nvme/host/core.c | ||
979 | @@ -3896,7 +3896,14 @@ static void nvme_async_event_work(struct work_struct *work) | ||
980 | container_of(work, struct nvme_ctrl, async_event_work); | ||
981 | |||
982 | nvme_aen_uevent(ctrl); | ||
983 | - ctrl->ops->submit_async_event(ctrl); | ||
984 | + | ||
985 | + /* | ||
986 | + * The transport drivers must guarantee AER submission here is safe by | ||
987 | + * flushing ctrl async_event_work after changing the controller state | ||
988 | + * from LIVE and before freeing the admin queue. | ||
989 | + */ | ||
990 | + if (ctrl->state == NVME_CTRL_LIVE) | ||
991 | + ctrl->ops->submit_async_event(ctrl); | ||
992 | } | ||
993 | |||
994 | static bool nvme_ctrl_pp_status(struct nvme_ctrl *ctrl) | ||
995 | diff --git a/drivers/nvme/host/rdma.c b/drivers/nvme/host/rdma.c | ||
996 | index 08a23bb4b8b57..4213c71b02a4b 100644 | ||
997 | --- a/drivers/nvme/host/rdma.c | ||
998 | +++ b/drivers/nvme/host/rdma.c | ||
999 | @@ -1110,6 +1110,7 @@ static void nvme_rdma_error_recovery_work(struct work_struct *work) | ||
1000 | struct nvme_rdma_ctrl, err_work); | ||
1001 | |||
1002 | nvme_stop_keep_alive(&ctrl->ctrl); | ||
1003 | + flush_work(&ctrl->ctrl.async_event_work); | ||
1004 | nvme_rdma_teardown_io_queues(ctrl, false); | ||
1005 | nvme_start_queues(&ctrl->ctrl); | ||
1006 | nvme_rdma_teardown_admin_queue(ctrl, false); | ||
1007 | diff --git a/drivers/nvme/host/tcp.c b/drivers/nvme/host/tcp.c | ||
1008 | index 1eef7ed0c3026..4378344f0e7ab 100644 | ||
1009 | --- a/drivers/nvme/host/tcp.c | ||
1010 | +++ b/drivers/nvme/host/tcp.c | ||
1011 | @@ -1955,6 +1955,7 @@ static void nvme_tcp_error_recovery_work(struct work_struct *work) | ||
1012 | struct nvme_ctrl *ctrl = &tcp_ctrl->ctrl; | ||
1013 | |||
1014 | nvme_stop_keep_alive(ctrl); | ||
1015 | + flush_work(&ctrl->async_event_work); | ||
1016 | nvme_tcp_teardown_io_queues(ctrl, false); | ||
1017 | /* unquiesce to fail fast pending requests */ | ||
1018 | nvme_start_queues(ctrl); | ||
1019 | diff --git a/drivers/parisc/ccio-dma.c b/drivers/parisc/ccio-dma.c | ||
1020 | index ad290f79983b9..5013568c571e5 100644 | ||
1021 | --- a/drivers/parisc/ccio-dma.c | ||
1022 | +++ b/drivers/parisc/ccio-dma.c | ||
1023 | @@ -1003,7 +1003,7 @@ ccio_unmap_sg(struct device *dev, struct scatterlist *sglist, int nents, | ||
1024 | ioc->usg_calls++; | ||
1025 | #endif | ||
1026 | |||
1027 | - while(sg_dma_len(sglist) && nents--) { | ||
1028 | + while (nents && sg_dma_len(sglist)) { | ||
1029 | |||
1030 | #ifdef CCIO_COLLECT_STATS | ||
1031 | ioc->usg_pages += sg_dma_len(sglist) >> PAGE_SHIFT; | ||
1032 | @@ -1011,6 +1011,7 @@ ccio_unmap_sg(struct device *dev, struct scatterlist *sglist, int nents, | ||
1033 | ccio_unmap_page(dev, sg_dma_address(sglist), | ||
1034 | sg_dma_len(sglist), direction, 0); | ||
1035 | ++sglist; | ||
1036 | + nents--; | ||
1037 | } | ||
1038 | |||
1039 | DBG_RUN_SG("%s() DONE (nents %d)\n", __func__, nents); | ||
1040 | diff --git a/drivers/parisc/sba_iommu.c b/drivers/parisc/sba_iommu.c | ||
1041 | index e410033b6df0c..822e5d19949e4 100644 | ||
1042 | --- a/drivers/parisc/sba_iommu.c | ||
1043 | +++ b/drivers/parisc/sba_iommu.c | ||
1044 | @@ -1047,7 +1047,7 @@ sba_unmap_sg(struct device *dev, struct scatterlist *sglist, int nents, | ||
1045 | spin_unlock_irqrestore(&ioc->res_lock, flags); | ||
1046 | #endif | ||
1047 | |||
1048 | - while (sg_dma_len(sglist) && nents--) { | ||
1049 | + while (nents && sg_dma_len(sglist)) { | ||
1050 | |||
1051 | sba_unmap_page(dev, sg_dma_address(sglist), sg_dma_len(sglist), | ||
1052 | direction, 0); | ||
1053 | @@ -1056,6 +1056,7 @@ sba_unmap_sg(struct device *dev, struct scatterlist *sglist, int nents, | ||
1054 | ioc->usingle_calls--; /* kluge since call is unmap_sg() */ | ||
1055 | #endif | ||
1056 | ++sglist; | ||
1057 | + nents--; | ||
1058 | } | ||
1059 | |||
1060 | DBG_RUN_SG("%s() DONE (nents %d)\n", __func__, nents); | ||
1061 | diff --git a/drivers/platform/x86/intel_speed_select_if/isst_if_common.c b/drivers/platform/x86/intel_speed_select_if/isst_if_common.c | ||
1062 | index 3de5a3c66529d..cf7b6dee82191 100644 | ||
1063 | --- a/drivers/platform/x86/intel_speed_select_if/isst_if_common.c | ||
1064 | +++ b/drivers/platform/x86/intel_speed_select_if/isst_if_common.c | ||
1065 | @@ -529,7 +529,10 @@ static long isst_if_def_ioctl(struct file *file, unsigned int cmd, | ||
1066 | return ret; | ||
1067 | } | ||
1068 | |||
1069 | -static DEFINE_MUTEX(punit_misc_dev_lock); | ||
1070 | +/* Lock to prevent module registration when already opened by user space */ | ||
1071 | +static DEFINE_MUTEX(punit_misc_dev_open_lock); | ||
1072 | +/* Lock to allow one share misc device for all ISST interace */ | ||
1073 | +static DEFINE_MUTEX(punit_misc_dev_reg_lock); | ||
1074 | static int misc_usage_count; | ||
1075 | static int misc_device_ret; | ||
1076 | static int misc_device_open; | ||
1077 | @@ -539,7 +542,7 @@ static int isst_if_open(struct inode *inode, struct file *file) | ||
1078 | int i, ret = 0; | ||
1079 | |||
1080 | /* Fail open, if a module is going away */ | ||
1081 | - mutex_lock(&punit_misc_dev_lock); | ||
1082 | + mutex_lock(&punit_misc_dev_open_lock); | ||
1083 | for (i = 0; i < ISST_IF_DEV_MAX; ++i) { | ||
1084 | struct isst_if_cmd_cb *cb = &punit_callbacks[i]; | ||
1085 | |||
1086 | @@ -561,7 +564,7 @@ static int isst_if_open(struct inode *inode, struct file *file) | ||
1087 | } else { | ||
1088 | misc_device_open++; | ||
1089 | } | ||
1090 | - mutex_unlock(&punit_misc_dev_lock); | ||
1091 | + mutex_unlock(&punit_misc_dev_open_lock); | ||
1092 | |||
1093 | return ret; | ||
1094 | } | ||
1095 | @@ -570,7 +573,7 @@ static int isst_if_relase(struct inode *inode, struct file *f) | ||
1096 | { | ||
1097 | int i; | ||
1098 | |||
1099 | - mutex_lock(&punit_misc_dev_lock); | ||
1100 | + mutex_lock(&punit_misc_dev_open_lock); | ||
1101 | misc_device_open--; | ||
1102 | for (i = 0; i < ISST_IF_DEV_MAX; ++i) { | ||
1103 | struct isst_if_cmd_cb *cb = &punit_callbacks[i]; | ||
1104 | @@ -578,7 +581,7 @@ static int isst_if_relase(struct inode *inode, struct file *f) | ||
1105 | if (cb->registered) | ||
1106 | module_put(cb->owner); | ||
1107 | } | ||
1108 | - mutex_unlock(&punit_misc_dev_lock); | ||
1109 | + mutex_unlock(&punit_misc_dev_open_lock); | ||
1110 | |||
1111 | return 0; | ||
1112 | } | ||
1113 | @@ -595,6 +598,43 @@ static struct miscdevice isst_if_char_driver = { | ||
1114 | .fops = &isst_if_char_driver_ops, | ||
1115 | }; | ||
1116 | |||
1117 | +static int isst_misc_reg(void) | ||
1118 | +{ | ||
1119 | + mutex_lock(&punit_misc_dev_reg_lock); | ||
1120 | + if (misc_device_ret) | ||
1121 | + goto unlock_exit; | ||
1122 | + | ||
1123 | + if (!misc_usage_count) { | ||
1124 | + misc_device_ret = isst_if_cpu_info_init(); | ||
1125 | + if (misc_device_ret) | ||
1126 | + goto unlock_exit; | ||
1127 | + | ||
1128 | + misc_device_ret = misc_register(&isst_if_char_driver); | ||
1129 | + if (misc_device_ret) { | ||
1130 | + isst_if_cpu_info_exit(); | ||
1131 | + goto unlock_exit; | ||
1132 | + } | ||
1133 | + } | ||
1134 | + misc_usage_count++; | ||
1135 | + | ||
1136 | +unlock_exit: | ||
1137 | + mutex_unlock(&punit_misc_dev_reg_lock); | ||
1138 | + | ||
1139 | + return misc_device_ret; | ||
1140 | +} | ||
1141 | + | ||
1142 | +static void isst_misc_unreg(void) | ||
1143 | +{ | ||
1144 | + mutex_lock(&punit_misc_dev_reg_lock); | ||
1145 | + if (misc_usage_count) | ||
1146 | + misc_usage_count--; | ||
1147 | + if (!misc_usage_count && !misc_device_ret) { | ||
1148 | + misc_deregister(&isst_if_char_driver); | ||
1149 | + isst_if_cpu_info_exit(); | ||
1150 | + } | ||
1151 | + mutex_unlock(&punit_misc_dev_reg_lock); | ||
1152 | +} | ||
1153 | + | ||
1154 | /** | ||
1155 | * isst_if_cdev_register() - Register callback for IOCTL | ||
1156 | * @device_type: The device type this callback handling. | ||
1157 | @@ -612,38 +652,31 @@ static struct miscdevice isst_if_char_driver = { | ||
1158 | */ | ||
1159 | int isst_if_cdev_register(int device_type, struct isst_if_cmd_cb *cb) | ||
1160 | { | ||
1161 | - if (misc_device_ret) | ||
1162 | - return misc_device_ret; | ||
1163 | + int ret; | ||
1164 | |||
1165 | if (device_type >= ISST_IF_DEV_MAX) | ||
1166 | return -EINVAL; | ||
1167 | |||
1168 | - mutex_lock(&punit_misc_dev_lock); | ||
1169 | + mutex_lock(&punit_misc_dev_open_lock); | ||
1170 | + /* Device is already open, we don't want to add new callbacks */ | ||
1171 | if (misc_device_open) { | ||
1172 | - mutex_unlock(&punit_misc_dev_lock); | ||
1173 | + mutex_unlock(&punit_misc_dev_open_lock); | ||
1174 | return -EAGAIN; | ||
1175 | } | ||
1176 | - if (!misc_usage_count) { | ||
1177 | - int ret; | ||
1178 | - | ||
1179 | - misc_device_ret = misc_register(&isst_if_char_driver); | ||
1180 | - if (misc_device_ret) | ||
1181 | - goto unlock_exit; | ||
1182 | - | ||
1183 | - ret = isst_if_cpu_info_init(); | ||
1184 | - if (ret) { | ||
1185 | - misc_deregister(&isst_if_char_driver); | ||
1186 | - misc_device_ret = ret; | ||
1187 | - goto unlock_exit; | ||
1188 | - } | ||
1189 | - } | ||
1190 | memcpy(&punit_callbacks[device_type], cb, sizeof(*cb)); | ||
1191 | punit_callbacks[device_type].registered = 1; | ||
1192 | - misc_usage_count++; | ||
1193 | -unlock_exit: | ||
1194 | - mutex_unlock(&punit_misc_dev_lock); | ||
1195 | + mutex_unlock(&punit_misc_dev_open_lock); | ||
1196 | |||
1197 | - return misc_device_ret; | ||
1198 | + ret = isst_misc_reg(); | ||
1199 | + if (ret) { | ||
1200 | + /* | ||
1201 | + * No need of mutex as the misc device register failed | ||
1202 | + * as no one can open device yet. Hence no contention. | ||
1203 | + */ | ||
1204 | + punit_callbacks[device_type].registered = 0; | ||
1205 | + return ret; | ||
1206 | + } | ||
1207 | + return 0; | ||
1208 | } | ||
1209 | EXPORT_SYMBOL_GPL(isst_if_cdev_register); | ||
1210 | |||
1211 | @@ -658,16 +691,12 @@ EXPORT_SYMBOL_GPL(isst_if_cdev_register); | ||
1212 | */ | ||
1213 | void isst_if_cdev_unregister(int device_type) | ||
1214 | { | ||
1215 | - mutex_lock(&punit_misc_dev_lock); | ||
1216 | - misc_usage_count--; | ||
1217 | + isst_misc_unreg(); | ||
1218 | + mutex_lock(&punit_misc_dev_open_lock); | ||
1219 | punit_callbacks[device_type].registered = 0; | ||
1220 | if (device_type == ISST_IF_DEV_MBOX) | ||
1221 | isst_delete_hash(); | ||
1222 | - if (!misc_usage_count && !misc_device_ret) { | ||
1223 | - misc_deregister(&isst_if_char_driver); | ||
1224 | - isst_if_cpu_info_exit(); | ||
1225 | - } | ||
1226 | - mutex_unlock(&punit_misc_dev_lock); | ||
1227 | + mutex_unlock(&punit_misc_dev_open_lock); | ||
1228 | } | ||
1229 | EXPORT_SYMBOL_GPL(isst_if_cdev_unregister); | ||
1230 | |||
1231 | diff --git a/drivers/scsi/lpfc/lpfc.h b/drivers/scsi/lpfc/lpfc.h | ||
1232 | index 1bf7a4152b34b..088b764aefa43 100644 | ||
1233 | --- a/drivers/scsi/lpfc/lpfc.h | ||
1234 | +++ b/drivers/scsi/lpfc/lpfc.h | ||
1235 | @@ -377,6 +377,7 @@ struct lpfc_vport { | ||
1236 | #define FC_VPORT_LOGO_RCVD 0x200 /* LOGO received on vport */ | ||
1237 | #define FC_RSCN_DISCOVERY 0x400 /* Auth all devices after RSCN */ | ||
1238 | #define FC_LOGO_RCVD_DID_CHNG 0x800 /* FDISC on phys port detect DID chng*/ | ||
1239 | +#define FC_PT2PT_NO_NVME 0x1000 /* Don't send NVME PRLI */ | ||
1240 | #define FC_SCSI_SCAN_TMO 0x4000 /* scsi scan timer running */ | ||
1241 | #define FC_ABORT_DISCOVERY 0x8000 /* we want to abort discovery */ | ||
1242 | #define FC_NDISC_ACTIVE 0x10000 /* NPort discovery active */ | ||
1243 | diff --git a/drivers/scsi/lpfc/lpfc_attr.c b/drivers/scsi/lpfc/lpfc_attr.c | ||
1244 | index d034fe78bf93e..1e59c60a9dcc3 100644 | ||
1245 | --- a/drivers/scsi/lpfc/lpfc_attr.c | ||
1246 | +++ b/drivers/scsi/lpfc/lpfc_attr.c | ||
1247 | @@ -1145,6 +1145,9 @@ lpfc_issue_lip(struct Scsi_Host *shost) | ||
1248 | pmboxq->u.mb.mbxCommand = MBX_DOWN_LINK; | ||
1249 | pmboxq->u.mb.mbxOwner = OWN_HOST; | ||
1250 | |||
1251 | + if ((vport->fc_flag & FC_PT2PT) && (vport->fc_flag & FC_PT2PT_NO_NVME)) | ||
1252 | + vport->fc_flag &= ~FC_PT2PT_NO_NVME; | ||
1253 | + | ||
1254 | mbxstatus = lpfc_sli_issue_mbox_wait(phba, pmboxq, LPFC_MBOX_TMO * 2); | ||
1255 | |||
1256 | if ((mbxstatus == MBX_SUCCESS) && | ||
1257 | diff --git a/drivers/scsi/lpfc/lpfc_els.c b/drivers/scsi/lpfc/lpfc_els.c | ||
1258 | index 2040affa08874..9951d63a8b493 100644 | ||
1259 | --- a/drivers/scsi/lpfc/lpfc_els.c | ||
1260 | +++ b/drivers/scsi/lpfc/lpfc_els.c | ||
1261 | @@ -1066,7 +1066,8 @@ stop_rr_fcf_flogi: | ||
1262 | |||
1263 | /* FLOGI failed, so there is no fabric */ | ||
1264 | spin_lock_irq(shost->host_lock); | ||
1265 | - vport->fc_flag &= ~(FC_FABRIC | FC_PUBLIC_LOOP); | ||
1266 | + vport->fc_flag &= ~(FC_FABRIC | FC_PUBLIC_LOOP | | ||
1267 | + FC_PT2PT_NO_NVME); | ||
1268 | spin_unlock_irq(shost->host_lock); | ||
1269 | |||
1270 | /* If private loop, then allow max outstanding els to be | ||
1271 | @@ -3740,6 +3741,23 @@ lpfc_els_retry(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb, | ||
1272 | /* Added for Vendor specifc support | ||
1273 | * Just keep retrying for these Rsn / Exp codes | ||
1274 | */ | ||
1275 | + if ((vport->fc_flag & FC_PT2PT) && | ||
1276 | + cmd == ELS_CMD_NVMEPRLI) { | ||
1277 | + switch (stat.un.b.lsRjtRsnCode) { | ||
1278 | + case LSRJT_UNABLE_TPC: | ||
1279 | + case LSRJT_INVALID_CMD: | ||
1280 | + case LSRJT_LOGICAL_ERR: | ||
1281 | + case LSRJT_CMD_UNSUPPORTED: | ||
1282 | + lpfc_printf_vlog(vport, KERN_WARNING, LOG_ELS, | ||
1283 | + "0168 NVME PRLI LS_RJT " | ||
1284 | + "reason %x port doesn't " | ||
1285 | + "support NVME, disabling NVME\n", | ||
1286 | + stat.un.b.lsRjtRsnCode); | ||
1287 | + retry = 0; | ||
1288 | + vport->fc_flag |= FC_PT2PT_NO_NVME; | ||
1289 | + goto out_retry; | ||
1290 | + } | ||
1291 | + } | ||
1292 | switch (stat.un.b.lsRjtRsnCode) { | ||
1293 | case LSRJT_UNABLE_TPC: | ||
1294 | /* The driver has a VALID PLOGI but the rport has | ||
1295 | diff --git a/drivers/scsi/lpfc/lpfc_nportdisc.c b/drivers/scsi/lpfc/lpfc_nportdisc.c | ||
1296 | index fdd87508c804d..df2f7c3d7f845 100644 | ||
1297 | --- a/drivers/scsi/lpfc/lpfc_nportdisc.c | ||
1298 | +++ b/drivers/scsi/lpfc/lpfc_nportdisc.c | ||
1299 | @@ -1987,8 +1987,9 @@ lpfc_cmpl_reglogin_reglogin_issue(struct lpfc_vport *vport, | ||
1300 | * is configured try it. | ||
1301 | */ | ||
1302 | ndlp->nlp_fc4_type |= NLP_FC4_FCP; | ||
1303 | - if ((vport->cfg_enable_fc4_type == LPFC_ENABLE_BOTH) || | ||
1304 | - (vport->cfg_enable_fc4_type == LPFC_ENABLE_NVME)) { | ||
1305 | + if ((!(vport->fc_flag & FC_PT2PT_NO_NVME)) && | ||
1306 | + (vport->cfg_enable_fc4_type == LPFC_ENABLE_BOTH || | ||
1307 | + vport->cfg_enable_fc4_type == LPFC_ENABLE_NVME)) { | ||
1308 | ndlp->nlp_fc4_type |= NLP_FC4_NVME; | ||
1309 | /* We need to update the localport also */ | ||
1310 | lpfc_nvme_update_localport(vport); | ||
1311 | diff --git a/drivers/tty/serial/8250/8250_gsc.c b/drivers/tty/serial/8250/8250_gsc.c | ||
1312 | index 0809ae2aa9b14..51cc985216ff3 100644 | ||
1313 | --- a/drivers/tty/serial/8250/8250_gsc.c | ||
1314 | +++ b/drivers/tty/serial/8250/8250_gsc.c | ||
1315 | @@ -26,7 +26,7 @@ static int __init serial_init_chip(struct parisc_device *dev) | ||
1316 | unsigned long address; | ||
1317 | int err; | ||
1318 | |||
1319 | -#ifdef CONFIG_64BIT | ||
1320 | +#if defined(CONFIG_64BIT) && defined(CONFIG_IOSAPIC) | ||
1321 | if (!dev->irq && (dev->id.sversion == 0xad)) | ||
1322 | dev->irq = iosapic_serial_irq(dev); | ||
1323 | #endif | ||
1324 | diff --git a/fs/btrfs/send.c b/fs/btrfs/send.c | ||
1325 | index fc688af57c231..e258fc484cea2 100644 | ||
1326 | --- a/fs/btrfs/send.c | ||
1327 | +++ b/fs/btrfs/send.c | ||
1328 | @@ -5005,6 +5005,10 @@ static ssize_t fill_read_buf(struct send_ctx *sctx, u64 offset, u32 len) | ||
1329 | lock_page(page); | ||
1330 | if (!PageUptodate(page)) { | ||
1331 | unlock_page(page); | ||
1332 | + btrfs_err(fs_info, | ||
1333 | + "send: IO error at offset %llu for inode %llu root %llu", | ||
1334 | + page_offset(page), sctx->cur_ino, | ||
1335 | + sctx->send_root->root_key.objectid); | ||
1336 | put_page(page); | ||
1337 | ret = -EIO; | ||
1338 | break; | ||
1339 | diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c | ||
1340 | index ae73e67936832..f1bbce4350c47 100644 | ||
1341 | --- a/fs/ext4/extents.c | ||
1342 | +++ b/fs/ext4/extents.c | ||
1343 | @@ -133,14 +133,25 @@ static int ext4_ext_truncate_extend_restart(handle_t *handle, | ||
1344 | static int ext4_ext_get_access(handle_t *handle, struct inode *inode, | ||
1345 | struct ext4_ext_path *path) | ||
1346 | { | ||
1347 | + int err = 0; | ||
1348 | + | ||
1349 | if (path->p_bh) { | ||
1350 | /* path points to block */ | ||
1351 | BUFFER_TRACE(path->p_bh, "get_write_access"); | ||
1352 | - return ext4_journal_get_write_access(handle, path->p_bh); | ||
1353 | + err = ext4_journal_get_write_access(handle, path->p_bh); | ||
1354 | + | ||
1355 | + /* | ||
1356 | + * The extent buffer's verified bit will be set again in | ||
1357 | + * __ext4_ext_dirty(). We could leave an inconsistent | ||
1358 | + * buffer if the extents updating procudure break off du | ||
1359 | + * to some error happens, force to check it again. | ||
1360 | + */ | ||
1361 | + if (!err) | ||
1362 | + clear_buffer_verified(path->p_bh); | ||
1363 | } | ||
1364 | /* path points to leaf/index in inode body */ | ||
1365 | /* we use in-core data, no need to protect them */ | ||
1366 | - return 0; | ||
1367 | + return err; | ||
1368 | } | ||
1369 | |||
1370 | /* | ||
1371 | @@ -160,6 +171,9 @@ int __ext4_ext_dirty(const char *where, unsigned int line, handle_t *handle, | ||
1372 | /* path points to block */ | ||
1373 | err = __ext4_handle_dirty_metadata(where, line, handle, | ||
1374 | inode, path->p_bh); | ||
1375 | + /* Extents updating done, re-set verified flag */ | ||
1376 | + if (!err) | ||
1377 | + set_buffer_verified(path->p_bh); | ||
1378 | } else { | ||
1379 | /* path points to leaf/index in inode body */ | ||
1380 | err = ext4_mark_inode_dirty(handle, inode); | ||
1381 | @@ -390,9 +404,13 @@ static int ext4_valid_extent_idx(struct inode *inode, | ||
1382 | |||
1383 | static int ext4_valid_extent_entries(struct inode *inode, | ||
1384 | struct ext4_extent_header *eh, | ||
1385 | + ext4_lblk_t lblk, ext4_fsblk_t *pblk, | ||
1386 | int depth) | ||
1387 | { | ||
1388 | unsigned short entries; | ||
1389 | + ext4_lblk_t lblock = 0; | ||
1390 | + ext4_lblk_t prev = 0; | ||
1391 | + | ||
1392 | if (eh->eh_entries == 0) | ||
1393 | return 1; | ||
1394 | |||
1395 | @@ -403,32 +421,52 @@ static int ext4_valid_extent_entries(struct inode *inode, | ||
1396 | struct ext4_extent *ext = EXT_FIRST_EXTENT(eh); | ||
1397 | struct ext4_super_block *es = EXT4_SB(inode->i_sb)->s_es; | ||
1398 | ext4_fsblk_t pblock = 0; | ||
1399 | - ext4_lblk_t lblock = 0; | ||
1400 | - ext4_lblk_t prev = 0; | ||
1401 | - int len = 0; | ||
1402 | + | ||
1403 | + /* | ||
1404 | + * The logical block in the first entry should equal to | ||
1405 | + * the number in the index block. | ||
1406 | + */ | ||
1407 | + if (depth != ext_depth(inode) && | ||
1408 | + lblk != le32_to_cpu(ext->ee_block)) | ||
1409 | + return 0; | ||
1410 | while (entries) { | ||
1411 | if (!ext4_valid_extent(inode, ext)) | ||
1412 | return 0; | ||
1413 | |||
1414 | /* Check for overlapping extents */ | ||
1415 | lblock = le32_to_cpu(ext->ee_block); | ||
1416 | - len = ext4_ext_get_actual_len(ext); | ||
1417 | if ((lblock <= prev) && prev) { | ||
1418 | pblock = ext4_ext_pblock(ext); | ||
1419 | es->s_last_error_block = cpu_to_le64(pblock); | ||
1420 | return 0; | ||
1421 | } | ||
1422 | + prev = lblock + ext4_ext_get_actual_len(ext) - 1; | ||
1423 | ext++; | ||
1424 | entries--; | ||
1425 | - prev = lblock + len - 1; | ||
1426 | } | ||
1427 | } else { | ||
1428 | struct ext4_extent_idx *ext_idx = EXT_FIRST_INDEX(eh); | ||
1429 | + | ||
1430 | + /* | ||
1431 | + * The logical block in the first entry should equal to | ||
1432 | + * the number in the parent index block. | ||
1433 | + */ | ||
1434 | + if (depth != ext_depth(inode) && | ||
1435 | + lblk != le32_to_cpu(ext_idx->ei_block)) | ||
1436 | + return 0; | ||
1437 | while (entries) { | ||
1438 | if (!ext4_valid_extent_idx(inode, ext_idx)) | ||
1439 | return 0; | ||
1440 | + | ||
1441 | + /* Check for overlapping index extents */ | ||
1442 | + lblock = le32_to_cpu(ext_idx->ei_block); | ||
1443 | + if ((lblock <= prev) && prev) { | ||
1444 | + *pblk = ext4_idx_pblock(ext_idx); | ||
1445 | + return 0; | ||
1446 | + } | ||
1447 | ext_idx++; | ||
1448 | entries--; | ||
1449 | + prev = lblock; | ||
1450 | } | ||
1451 | } | ||
1452 | return 1; | ||
1453 | @@ -436,7 +474,7 @@ static int ext4_valid_extent_entries(struct inode *inode, | ||
1454 | |||
1455 | static int __ext4_ext_check(const char *function, unsigned int line, | ||
1456 | struct inode *inode, struct ext4_extent_header *eh, | ||
1457 | - int depth, ext4_fsblk_t pblk) | ||
1458 | + int depth, ext4_fsblk_t pblk, ext4_lblk_t lblk) | ||
1459 | { | ||
1460 | const char *error_msg; | ||
1461 | int max = 0, err = -EFSCORRUPTED; | ||
1462 | @@ -462,7 +500,7 @@ static int __ext4_ext_check(const char *function, unsigned int line, | ||
1463 | error_msg = "invalid eh_entries"; | ||
1464 | goto corrupted; | ||
1465 | } | ||
1466 | - if (!ext4_valid_extent_entries(inode, eh, depth)) { | ||
1467 | + if (!ext4_valid_extent_entries(inode, eh, lblk, &pblk, depth)) { | ||
1468 | error_msg = "invalid extent entries"; | ||
1469 | goto corrupted; | ||
1470 | } | ||
1471 | @@ -491,7 +529,7 @@ corrupted: | ||
1472 | } | ||
1473 | |||
1474 | #define ext4_ext_check(inode, eh, depth, pblk) \ | ||
1475 | - __ext4_ext_check(__func__, __LINE__, (inode), (eh), (depth), (pblk)) | ||
1476 | + __ext4_ext_check(__func__, __LINE__, (inode), (eh), (depth), (pblk), 0) | ||
1477 | |||
1478 | int ext4_ext_check_inode(struct inode *inode) | ||
1479 | { | ||
1480 | @@ -524,12 +562,14 @@ static void ext4_cache_extents(struct inode *inode, | ||
1481 | |||
1482 | static struct buffer_head * | ||
1483 | __read_extent_tree_block(const char *function, unsigned int line, | ||
1484 | - struct inode *inode, ext4_fsblk_t pblk, int depth, | ||
1485 | - int flags) | ||
1486 | + struct inode *inode, struct ext4_extent_idx *idx, | ||
1487 | + int depth, int flags) | ||
1488 | { | ||
1489 | struct buffer_head *bh; | ||
1490 | int err; | ||
1491 | + ext4_fsblk_t pblk; | ||
1492 | |||
1493 | + pblk = ext4_idx_pblock(idx); | ||
1494 | bh = sb_getblk_gfp(inode->i_sb, pblk, __GFP_MOVABLE | GFP_NOFS); | ||
1495 | if (unlikely(!bh)) | ||
1496 | return ERR_PTR(-ENOMEM); | ||
1497 | @@ -545,8 +585,8 @@ __read_extent_tree_block(const char *function, unsigned int line, | ||
1498 | if (!ext4_has_feature_journal(inode->i_sb) || | ||
1499 | (inode->i_ino != | ||
1500 | le32_to_cpu(EXT4_SB(inode->i_sb)->s_es->s_journal_inum))) { | ||
1501 | - err = __ext4_ext_check(function, line, inode, | ||
1502 | - ext_block_hdr(bh), depth, pblk); | ||
1503 | + err = __ext4_ext_check(function, line, inode, ext_block_hdr(bh), | ||
1504 | + depth, pblk, le32_to_cpu(idx->ei_block)); | ||
1505 | if (err) | ||
1506 | goto errout; | ||
1507 | } | ||
1508 | @@ -565,8 +605,8 @@ errout: | ||
1509 | |||
1510 | } | ||
1511 | |||
1512 | -#define read_extent_tree_block(inode, pblk, depth, flags) \ | ||
1513 | - __read_extent_tree_block(__func__, __LINE__, (inode), (pblk), \ | ||
1514 | +#define read_extent_tree_block(inode, idx, depth, flags) \ | ||
1515 | + __read_extent_tree_block(__func__, __LINE__, (inode), (idx), \ | ||
1516 | (depth), (flags)) | ||
1517 | |||
1518 | /* | ||
1519 | @@ -613,8 +653,7 @@ int ext4_ext_precache(struct inode *inode) | ||
1520 | i--; | ||
1521 | continue; | ||
1522 | } | ||
1523 | - bh = read_extent_tree_block(inode, | ||
1524 | - ext4_idx_pblock(path[i].p_idx++), | ||
1525 | + bh = read_extent_tree_block(inode, path[i].p_idx++, | ||
1526 | depth - i - 1, | ||
1527 | EXT4_EX_FORCE_CACHE); | ||
1528 | if (IS_ERR(bh)) { | ||
1529 | @@ -917,8 +956,7 @@ ext4_find_extent(struct inode *inode, ext4_lblk_t block, | ||
1530 | path[ppos].p_depth = i; | ||
1531 | path[ppos].p_ext = NULL; | ||
1532 | |||
1533 | - bh = read_extent_tree_block(inode, path[ppos].p_block, --i, | ||
1534 | - flags); | ||
1535 | + bh = read_extent_tree_block(inode, path[ppos].p_idx, --i, flags); | ||
1536 | if (IS_ERR(bh)) { | ||
1537 | ret = PTR_ERR(bh); | ||
1538 | goto err; | ||
1539 | @@ -1517,7 +1555,6 @@ static int ext4_ext_search_right(struct inode *inode, | ||
1540 | struct ext4_extent_header *eh; | ||
1541 | struct ext4_extent_idx *ix; | ||
1542 | struct ext4_extent *ex; | ||
1543 | - ext4_fsblk_t block; | ||
1544 | int depth; /* Note, NOT eh_depth; depth from top of tree */ | ||
1545 | int ee_len; | ||
1546 | |||
1547 | @@ -1584,20 +1621,17 @@ got_index: | ||
1548 | * follow it and find the closest allocated | ||
1549 | * block to the right */ | ||
1550 | ix++; | ||
1551 | - block = ext4_idx_pblock(ix); | ||
1552 | while (++depth < path->p_depth) { | ||
1553 | /* subtract from p_depth to get proper eh_depth */ | ||
1554 | - bh = read_extent_tree_block(inode, block, | ||
1555 | - path->p_depth - depth, 0); | ||
1556 | + bh = read_extent_tree_block(inode, ix, path->p_depth - depth, 0); | ||
1557 | if (IS_ERR(bh)) | ||
1558 | return PTR_ERR(bh); | ||
1559 | eh = ext_block_hdr(bh); | ||
1560 | ix = EXT_FIRST_INDEX(eh); | ||
1561 | - block = ext4_idx_pblock(ix); | ||
1562 | put_bh(bh); | ||
1563 | } | ||
1564 | |||
1565 | - bh = read_extent_tree_block(inode, block, path->p_depth - depth, 0); | ||
1566 | + bh = read_extent_tree_block(inode, ix, path->p_depth - depth, 0); | ||
1567 | if (IS_ERR(bh)) | ||
1568 | return PTR_ERR(bh); | ||
1569 | eh = ext_block_hdr(bh); | ||
1570 | @@ -3119,9 +3153,9 @@ again: | ||
1571 | ext_debug("move to level %d (block %llu)\n", | ||
1572 | i + 1, ext4_idx_pblock(path[i].p_idx)); | ||
1573 | memset(path + i + 1, 0, sizeof(*path)); | ||
1574 | - bh = read_extent_tree_block(inode, | ||
1575 | - ext4_idx_pblock(path[i].p_idx), depth - i - 1, | ||
1576 | - EXT4_EX_NOCACHE); | ||
1577 | + bh = read_extent_tree_block(inode, path[i].p_idx, | ||
1578 | + depth - i - 1, | ||
1579 | + EXT4_EX_NOCACHE); | ||
1580 | if (IS_ERR(bh)) { | ||
1581 | /* should we reset i_size? */ | ||
1582 | err = PTR_ERR(bh); | ||
1583 | diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c | ||
1584 | index f1c99fe486c4d..28ceee102d0b3 100644 | ||
1585 | --- a/fs/nfs/dir.c | ||
1586 | +++ b/fs/nfs/dir.c | ||
1587 | @@ -1641,14 +1641,14 @@ no_open: | ||
1588 | if (!res) { | ||
1589 | inode = d_inode(dentry); | ||
1590 | if ((lookup_flags & LOOKUP_DIRECTORY) && inode && | ||
1591 | - !S_ISDIR(inode->i_mode)) | ||
1592 | + !(S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode))) | ||
1593 | res = ERR_PTR(-ENOTDIR); | ||
1594 | else if (inode && S_ISREG(inode->i_mode)) | ||
1595 | res = ERR_PTR(-EOPENSTALE); | ||
1596 | } else if (!IS_ERR(res)) { | ||
1597 | inode = d_inode(res); | ||
1598 | if ((lookup_flags & LOOKUP_DIRECTORY) && inode && | ||
1599 | - !S_ISDIR(inode->i_mode)) { | ||
1600 | + !(S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode))) { | ||
1601 | dput(res); | ||
1602 | res = ERR_PTR(-ENOTDIR); | ||
1603 | } else if (inode && S_ISREG(inode->i_mode)) { | ||
1604 | diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c | ||
1605 | index 209263c0c5377..3bddf5332b6d6 100644 | ||
1606 | --- a/fs/nfs/inode.c | ||
1607 | +++ b/fs/nfs/inode.c | ||
1608 | @@ -791,12 +791,9 @@ int nfs_getattr(const struct path *path, struct kstat *stat, | ||
1609 | goto out_no_update; | ||
1610 | |||
1611 | /* Flush out writes to the server in order to update c/mtime. */ | ||
1612 | - if ((request_mask & (STATX_CTIME|STATX_MTIME)) && | ||
1613 | - S_ISREG(inode->i_mode)) { | ||
1614 | - err = filemap_write_and_wait(inode->i_mapping); | ||
1615 | - if (err) | ||
1616 | - goto out; | ||
1617 | - } | ||
1618 | + if ((request_mask & (STATX_CTIME | STATX_MTIME)) && | ||
1619 | + S_ISREG(inode->i_mode)) | ||
1620 | + filemap_write_and_wait(inode->i_mapping); | ||
1621 | |||
1622 | /* | ||
1623 | * We may force a getattr if the user cares about atime. | ||
1624 | diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c | ||
1625 | index 7abc3230c21a4..dc5f8654b277d 100644 | ||
1626 | --- a/fs/quota/dquot.c | ||
1627 | +++ b/fs/quota/dquot.c | ||
1628 | @@ -693,9 +693,14 @@ int dquot_quota_sync(struct super_block *sb, int type) | ||
1629 | /* This is not very clever (and fast) but currently I don't know about | ||
1630 | * any other simple way of getting quota data to disk and we must get | ||
1631 | * them there for userspace to be visible... */ | ||
1632 | - if (sb->s_op->sync_fs) | ||
1633 | - sb->s_op->sync_fs(sb, 1); | ||
1634 | - sync_blockdev(sb->s_bdev); | ||
1635 | + if (sb->s_op->sync_fs) { | ||
1636 | + ret = sb->s_op->sync_fs(sb, 1); | ||
1637 | + if (ret) | ||
1638 | + return ret; | ||
1639 | + } | ||
1640 | + ret = sync_blockdev(sb->s_bdev); | ||
1641 | + if (ret) | ||
1642 | + return ret; | ||
1643 | |||
1644 | /* | ||
1645 | * Now when everything is written we can discard the pagecache so | ||
1646 | diff --git a/fs/super.c b/fs/super.c | ||
1647 | index b289356f302fc..e255c18fa2c88 100644 | ||
1648 | --- a/fs/super.c | ||
1649 | +++ b/fs/super.c | ||
1650 | @@ -1691,11 +1691,9 @@ static void lockdep_sb_freeze_acquire(struct super_block *sb) | ||
1651 | percpu_rwsem_acquire(sb->s_writers.rw_sem + level, 0, _THIS_IP_); | ||
1652 | } | ||
1653 | |||
1654 | -static void sb_freeze_unlock(struct super_block *sb) | ||
1655 | +static void sb_freeze_unlock(struct super_block *sb, int level) | ||
1656 | { | ||
1657 | - int level; | ||
1658 | - | ||
1659 | - for (level = SB_FREEZE_LEVELS - 1; level >= 0; level--) | ||
1660 | + for (level--; level >= 0; level--) | ||
1661 | percpu_up_write(sb->s_writers.rw_sem + level); | ||
1662 | } | ||
1663 | |||
1664 | @@ -1766,7 +1764,14 @@ int freeze_super(struct super_block *sb) | ||
1665 | sb_wait_write(sb, SB_FREEZE_PAGEFAULT); | ||
1666 | |||
1667 | /* All writers are done so after syncing there won't be dirty data */ | ||
1668 | - sync_filesystem(sb); | ||
1669 | + ret = sync_filesystem(sb); | ||
1670 | + if (ret) { | ||
1671 | + sb->s_writers.frozen = SB_UNFROZEN; | ||
1672 | + sb_freeze_unlock(sb, SB_FREEZE_PAGEFAULT); | ||
1673 | + wake_up(&sb->s_writers.wait_unfrozen); | ||
1674 | + deactivate_locked_super(sb); | ||
1675 | + return ret; | ||
1676 | + } | ||
1677 | |||
1678 | /* Now wait for internal filesystem counter */ | ||
1679 | sb->s_writers.frozen = SB_FREEZE_FS; | ||
1680 | @@ -1778,7 +1783,7 @@ int freeze_super(struct super_block *sb) | ||
1681 | printk(KERN_ERR | ||
1682 | "VFS:Filesystem freeze failed\n"); | ||
1683 | sb->s_writers.frozen = SB_UNFROZEN; | ||
1684 | - sb_freeze_unlock(sb); | ||
1685 | + sb_freeze_unlock(sb, SB_FREEZE_FS); | ||
1686 | wake_up(&sb->s_writers.wait_unfrozen); | ||
1687 | deactivate_locked_super(sb); | ||
1688 | return ret; | ||
1689 | @@ -1829,7 +1834,7 @@ static int thaw_super_locked(struct super_block *sb) | ||
1690 | } | ||
1691 | |||
1692 | sb->s_writers.frozen = SB_UNFROZEN; | ||
1693 | - sb_freeze_unlock(sb); | ||
1694 | + sb_freeze_unlock(sb, SB_FREEZE_FS); | ||
1695 | out: | ||
1696 | wake_up(&sb->s_writers.wait_unfrozen); | ||
1697 | deactivate_locked_super(sb); | ||
1698 | diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h | ||
1699 | index 8a5ced9cf5273..77d4281815579 100644 | ||
1700 | --- a/include/asm-generic/vmlinux.lds.h | ||
1701 | +++ b/include/asm-generic/vmlinux.lds.h | ||
1702 | @@ -110,17 +110,17 @@ | ||
1703 | #endif | ||
1704 | |||
1705 | #ifdef CONFIG_FTRACE_MCOUNT_RECORD | ||
1706 | -#ifdef CC_USING_PATCHABLE_FUNCTION_ENTRY | ||
1707 | -#define MCOUNT_REC() . = ALIGN(8); \ | ||
1708 | - __start_mcount_loc = .; \ | ||
1709 | - KEEP(*(__patchable_function_entries)) \ | ||
1710 | - __stop_mcount_loc = .; | ||
1711 | -#else | ||
1712 | +/* | ||
1713 | + * The ftrace call sites are logged to a section whose name depends on the | ||
1714 | + * compiler option used. A given kernel image will only use one, AKA | ||
1715 | + * FTRACE_CALLSITE_SECTION. We capture all of them here to avoid header | ||
1716 | + * dependencies for FTRACE_CALLSITE_SECTION's definition. | ||
1717 | + */ | ||
1718 | #define MCOUNT_REC() . = ALIGN(8); \ | ||
1719 | __start_mcount_loc = .; \ | ||
1720 | KEEP(*(__mcount_loc)) \ | ||
1721 | + KEEP(*(__patchable_function_entries)) \ | ||
1722 | __stop_mcount_loc = .; | ||
1723 | -#endif | ||
1724 | #else | ||
1725 | #define MCOUNT_REC() | ||
1726 | #endif | ||
1727 | diff --git a/include/linux/ftrace.h b/include/linux/ftrace.h | ||
1728 | index 8a8cb3c401b26..9141f22632864 100644 | ||
1729 | --- a/include/linux/ftrace.h | ||
1730 | +++ b/include/linux/ftrace.h | ||
1731 | @@ -499,7 +499,7 @@ static inline int ftrace_disable_ftrace_graph_caller(void) { return 0; } | ||
1732 | /** | ||
1733 | * ftrace_make_nop - convert code into nop | ||
1734 | * @mod: module structure if called by module load initialization | ||
1735 | - * @rec: the mcount call site record | ||
1736 | + * @rec: the call site record (e.g. mcount/fentry) | ||
1737 | * @addr: the address that the call site should be calling | ||
1738 | * | ||
1739 | * This is a very sensitive operation and great care needs | ||
1740 | @@ -520,9 +520,38 @@ static inline int ftrace_disable_ftrace_graph_caller(void) { return 0; } | ||
1741 | extern int ftrace_make_nop(struct module *mod, | ||
1742 | struct dyn_ftrace *rec, unsigned long addr); | ||
1743 | |||
1744 | + | ||
1745 | +/** | ||
1746 | + * ftrace_init_nop - initialize a nop call site | ||
1747 | + * @mod: module structure if called by module load initialization | ||
1748 | + * @rec: the call site record (e.g. mcount/fentry) | ||
1749 | + * | ||
1750 | + * This is a very sensitive operation and great care needs | ||
1751 | + * to be taken by the arch. The operation should carefully | ||
1752 | + * read the location, check to see if what is read is indeed | ||
1753 | + * what we expect it to be, and then on success of the compare, | ||
1754 | + * it should write to the location. | ||
1755 | + * | ||
1756 | + * The code segment at @rec->ip should contain the contents created by | ||
1757 | + * the compiler | ||
1758 | + * | ||
1759 | + * Return must be: | ||
1760 | + * 0 on success | ||
1761 | + * -EFAULT on error reading the location | ||
1762 | + * -EINVAL on a failed compare of the contents | ||
1763 | + * -EPERM on error writing to the location | ||
1764 | + * Any other value will be considered a failure. | ||
1765 | + */ | ||
1766 | +#ifndef ftrace_init_nop | ||
1767 | +static inline int ftrace_init_nop(struct module *mod, struct dyn_ftrace *rec) | ||
1768 | +{ | ||
1769 | + return ftrace_make_nop(mod, rec, MCOUNT_ADDR); | ||
1770 | +} | ||
1771 | +#endif | ||
1772 | + | ||
1773 | /** | ||
1774 | * ftrace_make_call - convert a nop call site into a call to addr | ||
1775 | - * @rec: the mcount call site record | ||
1776 | + * @rec: the call site record (e.g. mcount/fentry) | ||
1777 | * @addr: the address that the call site should call | ||
1778 | * | ||
1779 | * This is a very sensitive operation and great care needs | ||
1780 | @@ -545,7 +574,7 @@ extern int ftrace_make_call(struct dyn_ftrace *rec, unsigned long addr); | ||
1781 | #ifdef CONFIG_DYNAMIC_FTRACE_WITH_REGS | ||
1782 | /** | ||
1783 | * ftrace_modify_call - convert from one addr to another (no nop) | ||
1784 | - * @rec: the mcount call site record | ||
1785 | + * @rec: the call site record (e.g. mcount/fentry) | ||
1786 | * @old_addr: the address expected to be currently called to | ||
1787 | * @addr: the address to change to | ||
1788 | * | ||
1789 | @@ -709,6 +738,11 @@ static inline unsigned long get_lock_parent_ip(void) | ||
1790 | |||
1791 | #ifdef CONFIG_FTRACE_MCOUNT_RECORD | ||
1792 | extern void ftrace_init(void); | ||
1793 | +#ifdef CC_USING_PATCHABLE_FUNCTION_ENTRY | ||
1794 | +#define FTRACE_CALLSITE_SECTION "__patchable_function_entries" | ||
1795 | +#else | ||
1796 | +#define FTRACE_CALLSITE_SECTION "__mcount_loc" | ||
1797 | +#endif | ||
1798 | #else | ||
1799 | static inline void ftrace_init(void) { } | ||
1800 | #endif | ||
1801 | diff --git a/include/linux/sched.h b/include/linux/sched.h | ||
1802 | index afee5d5eb9458..b341471de9d60 100644 | ||
1803 | --- a/include/linux/sched.h | ||
1804 | +++ b/include/linux/sched.h | ||
1805 | @@ -1454,7 +1454,6 @@ extern struct pid *cad_pid; | ||
1806 | #define PF_MEMALLOC 0x00000800 /* Allocating memory */ | ||
1807 | #define PF_NPROC_EXCEEDED 0x00001000 /* set_user() noticed that RLIMIT_NPROC was exceeded */ | ||
1808 | #define PF_USED_MATH 0x00002000 /* If unset the fpu must be initialized before use */ | ||
1809 | -#define PF_USED_ASYNC 0x00004000 /* Used async_schedule*(), used by module init */ | ||
1810 | #define PF_NOFREEZE 0x00008000 /* This thread should not be frozen */ | ||
1811 | #define PF_FROZEN 0x00010000 /* Frozen for system suspend */ | ||
1812 | #define PF_KSWAPD 0x00020000 /* I am kswapd */ | ||
1813 | diff --git a/include/net/bond_3ad.h b/include/net/bond_3ad.h | ||
1814 | index c8696a230b7d9..1a28f299a4c61 100644 | ||
1815 | --- a/include/net/bond_3ad.h | ||
1816 | +++ b/include/net/bond_3ad.h | ||
1817 | @@ -262,7 +262,7 @@ struct ad_system { | ||
1818 | struct ad_bond_info { | ||
1819 | struct ad_system system; /* 802.3ad system structure */ | ||
1820 | struct bond_3ad_stats stats; | ||
1821 | - u32 agg_select_timer; /* Timer to select aggregator after all adapter's hand shakes */ | ||
1822 | + atomic_t agg_select_timer; /* Timer to select aggregator after all adapter's hand shakes */ | ||
1823 | u16 aggregator_identifier; | ||
1824 | }; | ||
1825 | |||
1826 | diff --git a/kernel/async.c b/kernel/async.c | ||
1827 | index 4f9c1d6140168..74660f611b97d 100644 | ||
1828 | --- a/kernel/async.c | ||
1829 | +++ b/kernel/async.c | ||
1830 | @@ -205,9 +205,6 @@ async_cookie_t async_schedule_node_domain(async_func_t func, void *data, | ||
1831 | atomic_inc(&entry_count); | ||
1832 | spin_unlock_irqrestore(&async_lock, flags); | ||
1833 | |||
1834 | - /* mark that this task has queued an async job, used by module init */ | ||
1835 | - current->flags |= PF_USED_ASYNC; | ||
1836 | - | ||
1837 | /* schedule for execution */ | ||
1838 | queue_work_node(node, system_unbound_wq, &entry->work); | ||
1839 | |||
1840 | diff --git a/kernel/fork.c b/kernel/fork.c | ||
1841 | index cf2cebd214b92..5b4a19682207a 100644 | ||
1842 | --- a/kernel/fork.c | ||
1843 | +++ b/kernel/fork.c | ||
1844 | @@ -2182,10 +2182,6 @@ static __latent_entropy struct task_struct *copy_process( | ||
1845 | goto bad_fork_cancel_cgroup; | ||
1846 | } | ||
1847 | |||
1848 | - /* past the last point of failure */ | ||
1849 | - if (pidfile) | ||
1850 | - fd_install(pidfd, pidfile); | ||
1851 | - | ||
1852 | init_task_pid_links(p); | ||
1853 | if (likely(p->pid)) { | ||
1854 | ptrace_init_task(p, (clone_flags & CLONE_PTRACE) || trace); | ||
1855 | @@ -2234,6 +2230,9 @@ static __latent_entropy struct task_struct *copy_process( | ||
1856 | syscall_tracepoint_update(p); | ||
1857 | write_unlock_irq(&tasklist_lock); | ||
1858 | |||
1859 | + if (pidfile) | ||
1860 | + fd_install(pidfd, pidfile); | ||
1861 | + | ||
1862 | proc_fork_connector(p); | ||
1863 | cgroup_post_fork(p); | ||
1864 | cgroup_threadgroup_change_end(current); | ||
1865 | diff --git a/kernel/module.c b/kernel/module.c | ||
1866 | index 59d487b8d8dad..7c724356aca31 100644 | ||
1867 | --- a/kernel/module.c | ||
1868 | +++ b/kernel/module.c | ||
1869 | @@ -3377,7 +3377,7 @@ static int find_module_sections(struct module *mod, struct load_info *info) | ||
1870 | #endif | ||
1871 | #ifdef CONFIG_FTRACE_MCOUNT_RECORD | ||
1872 | /* sechdrs[0].sh_size is always zero */ | ||
1873 | - mod->ftrace_callsites = section_objs(info, "__mcount_loc", | ||
1874 | + mod->ftrace_callsites = section_objs(info, FTRACE_CALLSITE_SECTION, | ||
1875 | sizeof(*mod->ftrace_callsites), | ||
1876 | &mod->num_ftrace_callsites); | ||
1877 | #endif | ||
1878 | @@ -3711,12 +3711,6 @@ static noinline int do_init_module(struct module *mod) | ||
1879 | } | ||
1880 | freeinit->module_init = mod->init_layout.base; | ||
1881 | |||
1882 | - /* | ||
1883 | - * We want to find out whether @mod uses async during init. Clear | ||
1884 | - * PF_USED_ASYNC. async_schedule*() will set it. | ||
1885 | - */ | ||
1886 | - current->flags &= ~PF_USED_ASYNC; | ||
1887 | - | ||
1888 | do_mod_ctors(mod); | ||
1889 | /* Start the module */ | ||
1890 | if (mod->init != NULL) | ||
1891 | @@ -3742,22 +3736,13 @@ static noinline int do_init_module(struct module *mod) | ||
1892 | |||
1893 | /* | ||
1894 | * We need to finish all async code before the module init sequence | ||
1895 | - * is done. This has potential to deadlock. For example, a newly | ||
1896 | - * detected block device can trigger request_module() of the | ||
1897 | - * default iosched from async probing task. Once userland helper | ||
1898 | - * reaches here, async_synchronize_full() will wait on the async | ||
1899 | - * task waiting on request_module() and deadlock. | ||
1900 | - * | ||
1901 | - * This deadlock is avoided by perfomring async_synchronize_full() | ||
1902 | - * iff module init queued any async jobs. This isn't a full | ||
1903 | - * solution as it will deadlock the same if module loading from | ||
1904 | - * async jobs nests more than once; however, due to the various | ||
1905 | - * constraints, this hack seems to be the best option for now. | ||
1906 | - * Please refer to the following thread for details. | ||
1907 | + * is done. This has potential to deadlock if synchronous module | ||
1908 | + * loading is requested from async (which is not allowed!). | ||
1909 | * | ||
1910 | - * http://thread.gmane.org/gmane.linux.kernel/1420814 | ||
1911 | + * See commit 0fdff3ec6d87 ("async, kmod: warn on synchronous | ||
1912 | + * request_module() from async workers") for more details. | ||
1913 | */ | ||
1914 | - if (!mod->async_probe_requested && (current->flags & PF_USED_ASYNC)) | ||
1915 | + if (!mod->async_probe_requested) | ||
1916 | async_synchronize_full(); | ||
1917 | |||
1918 | ftrace_free_mem(mod, mod->init_layout.base, mod->init_layout.base + | ||
1919 | diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c | ||
1920 | index efc338969b98b..7719d444bda12 100644 | ||
1921 | --- a/kernel/trace/ftrace.c | ||
1922 | +++ b/kernel/trace/ftrace.c | ||
1923 | @@ -2520,14 +2520,14 @@ struct dyn_ftrace *ftrace_rec_iter_record(struct ftrace_rec_iter *iter) | ||
1924 | } | ||
1925 | |||
1926 | static int | ||
1927 | -ftrace_code_disable(struct module *mod, struct dyn_ftrace *rec) | ||
1928 | +ftrace_nop_initialize(struct module *mod, struct dyn_ftrace *rec) | ||
1929 | { | ||
1930 | int ret; | ||
1931 | |||
1932 | if (unlikely(ftrace_disabled)) | ||
1933 | return 0; | ||
1934 | |||
1935 | - ret = ftrace_make_nop(mod, rec, MCOUNT_ADDR); | ||
1936 | + ret = ftrace_init_nop(mod, rec); | ||
1937 | if (ret) { | ||
1938 | ftrace_bug_type = FTRACE_BUG_INIT; | ||
1939 | ftrace_bug(ret, rec); | ||
1940 | @@ -2969,7 +2969,7 @@ static int ftrace_update_code(struct module *mod, struct ftrace_page *new_pgs) | ||
1941 | * to the NOP instructions. | ||
1942 | */ | ||
1943 | if (!__is_defined(CC_USING_NOP_MCOUNT) && | ||
1944 | - !ftrace_code_disable(mod, p)) | ||
1945 | + !ftrace_nop_initialize(mod, p)) | ||
1946 | break; | ||
1947 | |||
1948 | update_cnt++; | ||
1949 | diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c | ||
1950 | index 5a4dfb55ba16b..615259d8fa9ad 100644 | ||
1951 | --- a/kernel/trace/trace.c | ||
1952 | +++ b/kernel/trace/trace.c | ||
1953 | @@ -236,6 +236,10 @@ __setup("trace_clock=", set_trace_boot_clock); | ||
1954 | |||
1955 | static int __init set_tracepoint_printk(char *str) | ||
1956 | { | ||
1957 | + /* Ignore the "tp_printk_stop_on_boot" param */ | ||
1958 | + if (*str == '_') | ||
1959 | + return 0; | ||
1960 | + | ||
1961 | if ((strcmp(str, "=0") != 0 && strcmp(str, "=off") != 0)) | ||
1962 | tracepoint_printk = 1; | ||
1963 | return 1; | ||
1964 | diff --git a/kernel/tsacct.c b/kernel/tsacct.c | ||
1965 | index 7be3e7530841f..33a4093306f9c 100644 | ||
1966 | --- a/kernel/tsacct.c | ||
1967 | +++ b/kernel/tsacct.c | ||
1968 | @@ -35,11 +35,10 @@ void bacct_add_tsk(struct user_namespace *user_ns, | ||
1969 | /* Convert to seconds for btime */ | ||
1970 | do_div(delta, USEC_PER_SEC); | ||
1971 | stats->ac_btime = get_seconds() - delta; | ||
1972 | - if (thread_group_leader(tsk)) { | ||
1973 | + if (tsk->flags & PF_EXITING) | ||
1974 | stats->ac_exitcode = tsk->exit_code; | ||
1975 | - if (tsk->flags & PF_FORKNOEXEC) | ||
1976 | - stats->ac_flag |= AFORK; | ||
1977 | - } | ||
1978 | + if (thread_group_leader(tsk) && (tsk->flags & PF_FORKNOEXEC)) | ||
1979 | + stats->ac_flag |= AFORK; | ||
1980 | if (tsk->flags & PF_SUPERPRIV) | ||
1981 | stats->ac_flag |= ASU; | ||
1982 | if (tsk->flags & PF_DUMPCORE) | ||
1983 | diff --git a/lib/iov_iter.c b/lib/iov_iter.c | ||
1984 | index 957e3e58df652..9d3bda3d49fed 100644 | ||
1985 | --- a/lib/iov_iter.c | ||
1986 | +++ b/lib/iov_iter.c | ||
1987 | @@ -398,6 +398,7 @@ static size_t copy_page_to_iter_pipe(struct page *page, size_t offset, size_t by | ||
1988 | return 0; | ||
1989 | pipe->nrbufs++; | ||
1990 | buf->ops = &page_cache_pipe_buf_ops; | ||
1991 | + buf->flags = 0; | ||
1992 | get_page(buf->page = page); | ||
1993 | buf->offset = offset; | ||
1994 | buf->len = bytes; | ||
1995 | @@ -524,6 +525,7 @@ static size_t push_pipe(struct iov_iter *i, size_t size, | ||
1996 | break; | ||
1997 | pipe->nrbufs++; | ||
1998 | pipe->bufs[idx].ops = &default_pipe_buf_ops; | ||
1999 | + pipe->bufs[idx].flags = 0; | ||
2000 | pipe->bufs[idx].page = page; | ||
2001 | pipe->bufs[idx].offset = 0; | ||
2002 | if (left <= PAGE_SIZE) { | ||
2003 | diff --git a/net/ax25/af_ax25.c b/net/ax25/af_ax25.c | ||
2004 | index 1f84d41e22c36..184af6da0defc 100644 | ||
2005 | --- a/net/ax25/af_ax25.c | ||
2006 | +++ b/net/ax25/af_ax25.c | ||
2007 | @@ -77,6 +77,7 @@ static void ax25_kill_by_device(struct net_device *dev) | ||
2008 | { | ||
2009 | ax25_dev *ax25_dev; | ||
2010 | ax25_cb *s; | ||
2011 | + struct sock *sk; | ||
2012 | |||
2013 | if ((ax25_dev = ax25_dev_ax25dev(dev)) == NULL) | ||
2014 | return; | ||
2015 | @@ -85,13 +86,15 @@ static void ax25_kill_by_device(struct net_device *dev) | ||
2016 | again: | ||
2017 | ax25_for_each(s, &ax25_list) { | ||
2018 | if (s->ax25_dev == ax25_dev) { | ||
2019 | + sk = s->sk; | ||
2020 | + sock_hold(sk); | ||
2021 | spin_unlock_bh(&ax25_list_lock); | ||
2022 | - lock_sock(s->sk); | ||
2023 | + lock_sock(sk); | ||
2024 | s->ax25_dev = NULL; | ||
2025 | - release_sock(s->sk); | ||
2026 | + release_sock(sk); | ||
2027 | ax25_disconnect(s, ENETUNREACH); | ||
2028 | spin_lock_bh(&ax25_list_lock); | ||
2029 | - | ||
2030 | + sock_put(sk); | ||
2031 | /* The entry could have been deleted from the | ||
2032 | * list meanwhile and thus the next pointer is | ||
2033 | * no longer valid. Play it safe and restart | ||
2034 | diff --git a/net/core/drop_monitor.c b/net/core/drop_monitor.c | ||
2035 | index af0130039f377..e8e8389ddc965 100644 | ||
2036 | --- a/net/core/drop_monitor.c | ||
2037 | +++ b/net/core/drop_monitor.c | ||
2038 | @@ -277,13 +277,17 @@ static void trace_napi_poll_hit(void *ignore, struct napi_struct *napi, | ||
2039 | |||
2040 | rcu_read_lock(); | ||
2041 | list_for_each_entry_rcu(new_stat, &hw_stats_list, list) { | ||
2042 | + struct net_device *dev; | ||
2043 | + | ||
2044 | /* | ||
2045 | * only add a note to our monitor buffer if: | ||
2046 | * 1) this is the dev we received on | ||
2047 | * 2) its after the last_rx delta | ||
2048 | * 3) our rx_dropped count has gone up | ||
2049 | */ | ||
2050 | - if ((new_stat->dev == napi->dev) && | ||
2051 | + /* Paired with WRITE_ONCE() in dropmon_net_event() */ | ||
2052 | + dev = READ_ONCE(new_stat->dev); | ||
2053 | + if ((dev == napi->dev) && | ||
2054 | (time_after(jiffies, new_stat->last_rx + dm_hw_check_delta)) && | ||
2055 | (napi->dev->stats.rx_dropped != new_stat->last_drop_val)) { | ||
2056 | trace_drop_common(NULL, NULL); | ||
2057 | @@ -1497,7 +1501,10 @@ static int dropmon_net_event(struct notifier_block *ev_block, | ||
2058 | mutex_lock(&net_dm_mutex); | ||
2059 | list_for_each_entry_safe(new_stat, tmp, &hw_stats_list, list) { | ||
2060 | if (new_stat->dev == dev) { | ||
2061 | - new_stat->dev = NULL; | ||
2062 | + | ||
2063 | + /* Paired with READ_ONCE() in trace_napi_poll_hit() */ | ||
2064 | + WRITE_ONCE(new_stat->dev, NULL); | ||
2065 | + | ||
2066 | if (trace_state == TRACE_OFF) { | ||
2067 | list_del_rcu(&new_stat->list); | ||
2068 | kfree_rcu(new_stat, rcu); | ||
2069 | diff --git a/net/ipv4/ping.c b/net/ipv4/ping.c | ||
2070 | index b0f51c7cc0d90..2a359d0dfe7e8 100644 | ||
2071 | --- a/net/ipv4/ping.c | ||
2072 | +++ b/net/ipv4/ping.c | ||
2073 | @@ -172,16 +172,23 @@ static struct sock *ping_lookup(struct net *net, struct sk_buff *skb, u16 ident) | ||
2074 | struct sock *sk = NULL; | ||
2075 | struct inet_sock *isk; | ||
2076 | struct hlist_nulls_node *hnode; | ||
2077 | - int dif = skb->dev->ifindex; | ||
2078 | + int dif, sdif; | ||
2079 | |||
2080 | if (skb->protocol == htons(ETH_P_IP)) { | ||
2081 | + dif = inet_iif(skb); | ||
2082 | + sdif = inet_sdif(skb); | ||
2083 | pr_debug("try to find: num = %d, daddr = %pI4, dif = %d\n", | ||
2084 | (int)ident, &ip_hdr(skb)->daddr, dif); | ||
2085 | #if IS_ENABLED(CONFIG_IPV6) | ||
2086 | } else if (skb->protocol == htons(ETH_P_IPV6)) { | ||
2087 | + dif = inet6_iif(skb); | ||
2088 | + sdif = inet6_sdif(skb); | ||
2089 | pr_debug("try to find: num = %d, daddr = %pI6c, dif = %d\n", | ||
2090 | (int)ident, &ipv6_hdr(skb)->daddr, dif); | ||
2091 | #endif | ||
2092 | + } else { | ||
2093 | + pr_err("ping: protocol(%x) is not supported\n", ntohs(skb->protocol)); | ||
2094 | + return NULL; | ||
2095 | } | ||
2096 | |||
2097 | read_lock_bh(&ping_table.lock); | ||
2098 | @@ -221,7 +228,7 @@ static struct sock *ping_lookup(struct net *net, struct sk_buff *skb, u16 ident) | ||
2099 | } | ||
2100 | |||
2101 | if (sk->sk_bound_dev_if && sk->sk_bound_dev_if != dif && | ||
2102 | - sk->sk_bound_dev_if != inet_sdif(skb)) | ||
2103 | + sk->sk_bound_dev_if != sdif) | ||
2104 | continue; | ||
2105 | |||
2106 | sock_hold(sk); | ||
2107 | diff --git a/net/netfilter/nf_conntrack_proto_sctp.c b/net/netfilter/nf_conntrack_proto_sctp.c | ||
2108 | index 810cca24b3990..7626f3e1c70a7 100644 | ||
2109 | --- a/net/netfilter/nf_conntrack_proto_sctp.c | ||
2110 | +++ b/net/netfilter/nf_conntrack_proto_sctp.c | ||
2111 | @@ -489,6 +489,15 @@ int nf_conntrack_sctp_packet(struct nf_conn *ct, | ||
2112 | pr_debug("Setting vtag %x for dir %d\n", | ||
2113 | ih->init_tag, !dir); | ||
2114 | ct->proto.sctp.vtag[!dir] = ih->init_tag; | ||
2115 | + | ||
2116 | + /* don't renew timeout on init retransmit so | ||
2117 | + * port reuse by client or NAT middlebox cannot | ||
2118 | + * keep entry alive indefinitely (incl. nat info). | ||
2119 | + */ | ||
2120 | + if (new_state == SCTP_CONNTRACK_CLOSED && | ||
2121 | + old_state == SCTP_CONNTRACK_CLOSED && | ||
2122 | + nf_ct_is_confirmed(ct)) | ||
2123 | + ignore = true; | ||
2124 | } | ||
2125 | |||
2126 | ct->proto.sctp.state = new_state; | ||
2127 | diff --git a/net/netfilter/nft_synproxy.c b/net/netfilter/nft_synproxy.c | ||
2128 | index e2c1fc6088412..15abb0e496034 100644 | ||
2129 | --- a/net/netfilter/nft_synproxy.c | ||
2130 | +++ b/net/netfilter/nft_synproxy.c | ||
2131 | @@ -191,8 +191,10 @@ static int nft_synproxy_do_init(const struct nft_ctx *ctx, | ||
2132 | if (err) | ||
2133 | goto nf_ct_failure; | ||
2134 | err = nf_synproxy_ipv6_init(snet, ctx->net); | ||
2135 | - if (err) | ||
2136 | + if (err) { | ||
2137 | + nf_synproxy_ipv4_fini(snet, ctx->net); | ||
2138 | goto nf_ct_failure; | ||
2139 | + } | ||
2140 | break; | ||
2141 | } | ||
2142 | |||
2143 | diff --git a/net/sched/act_api.c b/net/sched/act_api.c | ||
2144 | index 75132d0ca8870..ab277ee950322 100644 | ||
2145 | --- a/net/sched/act_api.c | ||
2146 | +++ b/net/sched/act_api.c | ||
2147 | @@ -652,15 +652,24 @@ int tcf_action_exec(struct sk_buff *skb, struct tc_action **actions, | ||
2148 | restart_act_graph: | ||
2149 | for (i = 0; i < nr_actions; i++) { | ||
2150 | const struct tc_action *a = actions[i]; | ||
2151 | + int repeat_ttl; | ||
2152 | |||
2153 | if (jmp_prgcnt > 0) { | ||
2154 | jmp_prgcnt -= 1; | ||
2155 | continue; | ||
2156 | } | ||
2157 | + | ||
2158 | + repeat_ttl = 32; | ||
2159 | repeat: | ||
2160 | ret = a->ops->act(skb, a, res); | ||
2161 | - if (ret == TC_ACT_REPEAT) | ||
2162 | - goto repeat; /* we need a ttl - JHS */ | ||
2163 | + | ||
2164 | + if (unlikely(ret == TC_ACT_REPEAT)) { | ||
2165 | + if (--repeat_ttl != 0) | ||
2166 | + goto repeat; | ||
2167 | + /* suspicious opcode, stop pipeline */ | ||
2168 | + net_warn_ratelimited("TC_ACT_REPEAT abuse ?\n"); | ||
2169 | + return TC_ACT_OK; | ||
2170 | + } | ||
2171 | |||
2172 | if (TC_ACT_EXT_CMP(ret, TC_ACT_JUMP)) { | ||
2173 | jmp_prgcnt = ret & TCA_ACT_MAX_PRIO_MASK; | ||
2174 | diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c | ||
2175 | index bc8055f4571bc..d60d7caacbf5d 100644 | ||
2176 | --- a/net/vmw_vsock/af_vsock.c | ||
2177 | +++ b/net/vmw_vsock/af_vsock.c | ||
2178 | @@ -1222,6 +1222,7 @@ static int vsock_stream_connect(struct socket *sock, struct sockaddr *addr, | ||
2179 | sk->sk_state = sk->sk_state == TCP_ESTABLISHED ? TCP_CLOSING : TCP_CLOSE; | ||
2180 | sock->state = SS_UNCONNECTED; | ||
2181 | vsock_transport_cancel_pkt(vsk); | ||
2182 | + vsock_remove_connected(vsk); | ||
2183 | goto out_wait; | ||
2184 | } else if (timeout == 0) { | ||
2185 | err = -ETIMEDOUT; | ||
2186 | diff --git a/scripts/Makefile.extrawarn b/scripts/Makefile.extrawarn | ||
2187 | index ca08f2fe7c344..854e2ba9daa29 100644 | ||
2188 | --- a/scripts/Makefile.extrawarn | ||
2189 | +++ b/scripts/Makefile.extrawarn | ||
2190 | @@ -49,6 +49,7 @@ KBUILD_CFLAGS += -Wno-format | ||
2191 | KBUILD_CFLAGS += -Wno-sign-compare | ||
2192 | KBUILD_CFLAGS += -Wno-format-zero-length | ||
2193 | KBUILD_CFLAGS += $(call cc-disable-warning, pointer-to-enum-cast) | ||
2194 | +KBUILD_CFLAGS += $(call cc-disable-warning, unaligned-access) | ||
2195 | endif | ||
2196 | |||
2197 | endif | ||
2198 | diff --git a/scripts/kconfig/confdata.c b/scripts/kconfig/confdata.c | ||
2199 | index 17298239e3633..5c2493c8e9de8 100644 | ||
2200 | --- a/scripts/kconfig/confdata.c | ||
2201 | +++ b/scripts/kconfig/confdata.c | ||
2202 | @@ -987,14 +987,19 @@ static int conf_write_dep(const char *name) | ||
2203 | |||
2204 | static int conf_touch_deps(void) | ||
2205 | { | ||
2206 | - const char *name; | ||
2207 | + const char *name, *tmp; | ||
2208 | struct symbol *sym; | ||
2209 | int res, i; | ||
2210 | |||
2211 | - strcpy(depfile_path, "include/config/"); | ||
2212 | - depfile_prefix_len = strlen(depfile_path); | ||
2213 | - | ||
2214 | name = conf_get_autoconfig_name(); | ||
2215 | + tmp = strrchr(name, '/'); | ||
2216 | + depfile_prefix_len = tmp ? tmp - name + 1 : 0; | ||
2217 | + if (depfile_prefix_len + 1 > sizeof(depfile_path)) | ||
2218 | + return -1; | ||
2219 | + | ||
2220 | + strncpy(depfile_path, name, depfile_prefix_len); | ||
2221 | + depfile_path[depfile_prefix_len] = 0; | ||
2222 | + | ||
2223 | conf_read_simple(name, S_DEF_AUTO); | ||
2224 | sym_calc_value(modules_sym); | ||
2225 | |||
2226 | diff --git a/scripts/kconfig/preprocess.c b/scripts/kconfig/preprocess.c | ||
2227 | index 0590f86df6e40..748da578b418c 100644 | ||
2228 | --- a/scripts/kconfig/preprocess.c | ||
2229 | +++ b/scripts/kconfig/preprocess.c | ||
2230 | @@ -141,7 +141,7 @@ static char *do_lineno(int argc, char *argv[]) | ||
2231 | static char *do_shell(int argc, char *argv[]) | ||
2232 | { | ||
2233 | FILE *p; | ||
2234 | - char buf[256]; | ||
2235 | + char buf[4096]; | ||
2236 | char *cmd; | ||
2237 | size_t nread; | ||
2238 | int i; | ||
2239 | diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c | ||
2240 | index 95d472d433e70..b8fe0ec5d6247 100644 | ||
2241 | --- a/sound/pci/hda/hda_intel.c | ||
2242 | +++ b/sound/pci/hda/hda_intel.c | ||
2243 | @@ -1608,6 +1608,7 @@ static struct snd_pci_quirk probe_mask_list[] = { | ||
2244 | /* forced codec slots */ | ||
2245 | SND_PCI_QUIRK(0x1043, 0x1262, "ASUS W5Fm", 0x103), | ||
2246 | SND_PCI_QUIRK(0x1046, 0x1262, "ASUS W5F", 0x103), | ||
2247 | + SND_PCI_QUIRK(0x1558, 0x0351, "Schenker Dock 15", 0x105), | ||
2248 | /* WinFast VP200 H (Teradici) user reported broken communication */ | ||
2249 | SND_PCI_QUIRK(0x3a21, 0x040d, "WinFast VP200 H", 0x101), | ||
2250 | {} | ||
2251 | @@ -1793,8 +1794,6 @@ static int azx_create(struct snd_card *card, struct pci_dev *pci, | ||
2252 | |||
2253 | assign_position_fix(chip, check_position_fix(chip, position_fix[dev])); | ||
2254 | |||
2255 | - check_probe_mask(chip, dev); | ||
2256 | - | ||
2257 | if (single_cmd < 0) /* allow fallback to single_cmd at errors */ | ||
2258 | chip->fallback_to_single_cmd = 1; | ||
2259 | else /* explicitly set to single_cmd or not */ | ||
2260 | @@ -1826,6 +1825,8 @@ static int azx_create(struct snd_card *card, struct pci_dev *pci, | ||
2261 | chip->bus.needs_damn_long_delay = 1; | ||
2262 | } | ||
2263 | |||
2264 | + check_probe_mask(chip, dev); | ||
2265 | + | ||
2266 | err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops); | ||
2267 | if (err < 0) { | ||
2268 | dev_err(card->dev, "Error creating device [card]!\n"); | ||
2269 | diff --git a/sound/soc/soc-ops.c b/sound/soc/soc-ops.c | ||
2270 | index ef8fd331526b0..f5dcd625e4355 100644 | ||
2271 | --- a/sound/soc/soc-ops.c | ||
2272 | +++ b/sound/soc/soc-ops.c | ||
2273 | @@ -314,7 +314,7 @@ int snd_soc_put_volsw(struct snd_kcontrol *kcontrol, | ||
2274 | unsigned int sign_bit = mc->sign_bit; | ||
2275 | unsigned int mask = (1 << fls(max)) - 1; | ||
2276 | unsigned int invert = mc->invert; | ||
2277 | - int err; | ||
2278 | + int err, ret; | ||
2279 | bool type_2r = false; | ||
2280 | unsigned int val2 = 0; | ||
2281 | unsigned int val, val_mask; | ||
2282 | @@ -356,12 +356,18 @@ int snd_soc_put_volsw(struct snd_kcontrol *kcontrol, | ||
2283 | err = snd_soc_component_update_bits(component, reg, val_mask, val); | ||
2284 | if (err < 0) | ||
2285 | return err; | ||
2286 | + ret = err; | ||
2287 | |||
2288 | - if (type_2r) | ||
2289 | + if (type_2r) { | ||
2290 | err = snd_soc_component_update_bits(component, reg2, val_mask, | ||
2291 | - val2); | ||
2292 | + val2); | ||
2293 | + /* Don't discard any error code or drop change flag */ | ||
2294 | + if (ret == 0 || err < 0) { | ||
2295 | + ret = err; | ||
2296 | + } | ||
2297 | + } | ||
2298 | |||
2299 | - return err; | ||
2300 | + return ret; | ||
2301 | } | ||
2302 | EXPORT_SYMBOL_GPL(snd_soc_put_volsw); | ||
2303 | |||
2304 | @@ -517,7 +523,7 @@ int snd_soc_put_volsw_range(struct snd_kcontrol *kcontrol, | ||
2305 | unsigned int mask = (1 << fls(max)) - 1; | ||
2306 | unsigned int invert = mc->invert; | ||
2307 | unsigned int val, val_mask; | ||
2308 | - int ret; | ||
2309 | + int err, ret; | ||
2310 | |||
2311 | if (invert) | ||
2312 | val = (max - ucontrol->value.integer.value[0]) & mask; | ||
2313 | @@ -526,9 +532,10 @@ int snd_soc_put_volsw_range(struct snd_kcontrol *kcontrol, | ||
2314 | val_mask = mask << shift; | ||
2315 | val = val << shift; | ||
2316 | |||
2317 | - ret = snd_soc_component_update_bits(component, reg, val_mask, val); | ||
2318 | - if (ret < 0) | ||
2319 | - return ret; | ||
2320 | + err = snd_soc_component_update_bits(component, reg, val_mask, val); | ||
2321 | + if (err < 0) | ||
2322 | + return err; | ||
2323 | + ret = err; | ||
2324 | |||
2325 | if (snd_soc_volsw_is_stereo(mc)) { | ||
2326 | if (invert) | ||
2327 | @@ -538,8 +545,12 @@ int snd_soc_put_volsw_range(struct snd_kcontrol *kcontrol, | ||
2328 | val_mask = mask << shift; | ||
2329 | val = val << shift; | ||
2330 | |||
2331 | - ret = snd_soc_component_update_bits(component, rreg, val_mask, | ||
2332 | + err = snd_soc_component_update_bits(component, rreg, val_mask, | ||
2333 | val); | ||
2334 | + /* Don't discard any error code or drop change flag */ | ||
2335 | + if (ret == 0 || err < 0) { | ||
2336 | + ret = err; | ||
2337 | + } | ||
2338 | } | ||
2339 | |||
2340 | return ret; | ||
2341 | diff --git a/tools/lib/subcmd/subcmd-util.h b/tools/lib/subcmd/subcmd-util.h | ||
2342 | index 794a375dad360..b2aec04fce8f6 100644 | ||
2343 | --- a/tools/lib/subcmd/subcmd-util.h | ||
2344 | +++ b/tools/lib/subcmd/subcmd-util.h | ||
2345 | @@ -50,15 +50,8 @@ static NORETURN inline void die(const char *err, ...) | ||
2346 | static inline void *xrealloc(void *ptr, size_t size) | ||
2347 | { | ||
2348 | void *ret = realloc(ptr, size); | ||
2349 | - if (!ret && !size) | ||
2350 | - ret = realloc(ptr, 1); | ||
2351 | - if (!ret) { | ||
2352 | - ret = realloc(ptr, size); | ||
2353 | - if (!ret && !size) | ||
2354 | - ret = realloc(ptr, 1); | ||
2355 | - if (!ret) | ||
2356 | - die("Out of memory, realloc failed"); | ||
2357 | - } | ||
2358 | + if (!ret) | ||
2359 | + die("Out of memory, realloc failed"); | ||
2360 | return ret; | ||
2361 | } | ||
2362 | |||
2363 | diff --git a/tools/testing/selftests/rtc/settings b/tools/testing/selftests/rtc/settings | ||
2364 | index ba4d85f74cd6b..a953c96aa16e1 100644 | ||
2365 | --- a/tools/testing/selftests/rtc/settings | ||
2366 | +++ b/tools/testing/selftests/rtc/settings | ||
2367 | @@ -1 +1 @@ | ||
2368 | -timeout=90 | ||
2369 | +timeout=180 | ||
2370 | diff --git a/tools/testing/selftests/zram/zram.sh b/tools/testing/selftests/zram/zram.sh | ||
2371 | index 232e958ec4547..b0b91d9b0dc21 100755 | ||
2372 | --- a/tools/testing/selftests/zram/zram.sh | ||
2373 | +++ b/tools/testing/selftests/zram/zram.sh | ||
2374 | @@ -2,9 +2,6 @@ | ||
2375 | # SPDX-License-Identifier: GPL-2.0 | ||
2376 | TCID="zram.sh" | ||
2377 | |||
2378 | -# Kselftest framework requirement - SKIP code is 4. | ||
2379 | -ksft_skip=4 | ||
2380 | - | ||
2381 | . ./zram_lib.sh | ||
2382 | |||
2383 | run_zram () { | ||
2384 | @@ -18,14 +15,4 @@ echo "" | ||
2385 | |||
2386 | check_prereqs | ||
2387 | |||
2388 | -# check zram module exists | ||
2389 | -MODULE_PATH=/lib/modules/`uname -r`/kernel/drivers/block/zram/zram.ko | ||
2390 | -if [ -f $MODULE_PATH ]; then | ||
2391 | - run_zram | ||
2392 | -elif [ -b /dev/zram0 ]; then | ||
2393 | - run_zram | ||
2394 | -else | ||
2395 | - echo "$TCID : No zram.ko module or /dev/zram0 device file not found" | ||
2396 | - echo "$TCID : CONFIG_ZRAM is not set" | ||
2397 | - exit $ksft_skip | ||
2398 | -fi | ||
2399 | +run_zram | ||
2400 | diff --git a/tools/testing/selftests/zram/zram01.sh b/tools/testing/selftests/zram/zram01.sh | ||
2401 | index 114863d9fb876..8f4affe34f3e4 100755 | ||
2402 | --- a/tools/testing/selftests/zram/zram01.sh | ||
2403 | +++ b/tools/testing/selftests/zram/zram01.sh | ||
2404 | @@ -33,9 +33,7 @@ zram_algs="lzo" | ||
2405 | |||
2406 | zram_fill_fs() | ||
2407 | { | ||
2408 | - local mem_free0=$(free -m | awk 'NR==2 {print $4}') | ||
2409 | - | ||
2410 | - for i in $(seq 0 $(($dev_num - 1))); do | ||
2411 | + for i in $(seq $dev_start $dev_end); do | ||
2412 | echo "fill zram$i..." | ||
2413 | local b=0 | ||
2414 | while [ true ]; do | ||
2415 | @@ -45,29 +43,17 @@ zram_fill_fs() | ||
2416 | b=$(($b + 1)) | ||
2417 | done | ||
2418 | echo "zram$i can be filled with '$b' KB" | ||
2419 | - done | ||
2420 | |||
2421 | - local mem_free1=$(free -m | awk 'NR==2 {print $4}') | ||
2422 | - local used_mem=$(($mem_free0 - $mem_free1)) | ||
2423 | + local mem_used_total=`awk '{print $3}' "/sys/block/zram$i/mm_stat"` | ||
2424 | + local v=$((100 * 1024 * $b / $mem_used_total)) | ||
2425 | + if [ "$v" -lt 100 ]; then | ||
2426 | + echo "FAIL compression ratio: 0.$v:1" | ||
2427 | + ERR_CODE=-1 | ||
2428 | + return | ||
2429 | + fi | ||
2430 | |||
2431 | - local total_size=0 | ||
2432 | - for sm in $zram_sizes; do | ||
2433 | - local s=$(echo $sm | sed 's/M//') | ||
2434 | - total_size=$(($total_size + $s)) | ||
2435 | + echo "zram compression ratio: $(echo "scale=2; $v / 100 " | bc):1: OK" | ||
2436 | done | ||
2437 | - | ||
2438 | - echo "zram used ${used_mem}M, zram disk sizes ${total_size}M" | ||
2439 | - | ||
2440 | - local v=$((100 * $total_size / $used_mem)) | ||
2441 | - | ||
2442 | - if [ "$v" -lt 100 ]; then | ||
2443 | - echo "FAIL compression ratio: 0.$v:1" | ||
2444 | - ERR_CODE=-1 | ||
2445 | - zram_cleanup | ||
2446 | - return | ||
2447 | - fi | ||
2448 | - | ||
2449 | - echo "zram compression ratio: $(echo "scale=2; $v / 100 " | bc):1: OK" | ||
2450 | } | ||
2451 | |||
2452 | check_prereqs | ||
2453 | @@ -81,7 +67,6 @@ zram_mount | ||
2454 | |||
2455 | zram_fill_fs | ||
2456 | zram_cleanup | ||
2457 | -zram_unload | ||
2458 | |||
2459 | if [ $ERR_CODE -ne 0 ]; then | ||
2460 | echo "$TCID : [FAIL]" | ||
2461 | diff --git a/tools/testing/selftests/zram/zram02.sh b/tools/testing/selftests/zram/zram02.sh | ||
2462 | index e83b404807c09..2418b0c4ed136 100755 | ||
2463 | --- a/tools/testing/selftests/zram/zram02.sh | ||
2464 | +++ b/tools/testing/selftests/zram/zram02.sh | ||
2465 | @@ -36,7 +36,6 @@ zram_set_memlimit | ||
2466 | zram_makeswap | ||
2467 | zram_swapoff | ||
2468 | zram_cleanup | ||
2469 | -zram_unload | ||
2470 | |||
2471 | if [ $ERR_CODE -ne 0 ]; then | ||
2472 | echo "$TCID : [FAIL]" | ||
2473 | diff --git a/tools/testing/selftests/zram/zram_lib.sh b/tools/testing/selftests/zram/zram_lib.sh | ||
2474 | index 6f872f266fd11..21ec1966de76c 100755 | ||
2475 | --- a/tools/testing/selftests/zram/zram_lib.sh | ||
2476 | +++ b/tools/testing/selftests/zram/zram_lib.sh | ||
2477 | @@ -5,12 +5,17 @@ | ||
2478 | # Author: Alexey Kodanev <alexey.kodanev@oracle.com> | ||
2479 | # Modified: Naresh Kamboju <naresh.kamboju@linaro.org> | ||
2480 | |||
2481 | -MODULE=0 | ||
2482 | dev_makeswap=-1 | ||
2483 | dev_mounted=-1 | ||
2484 | - | ||
2485 | +dev_start=0 | ||
2486 | +dev_end=-1 | ||
2487 | +module_load=-1 | ||
2488 | +sys_control=-1 | ||
2489 | # Kselftest framework requirement - SKIP code is 4. | ||
2490 | ksft_skip=4 | ||
2491 | +kernel_version=`uname -r | cut -d'.' -f1,2` | ||
2492 | +kernel_major=${kernel_version%.*} | ||
2493 | +kernel_minor=${kernel_version#*.} | ||
2494 | |||
2495 | trap INT | ||
2496 | |||
2497 | @@ -25,68 +30,104 @@ check_prereqs() | ||
2498 | fi | ||
2499 | } | ||
2500 | |||
2501 | +kernel_gte() | ||
2502 | +{ | ||
2503 | + major=${1%.*} | ||
2504 | + minor=${1#*.} | ||
2505 | + | ||
2506 | + if [ $kernel_major -gt $major ]; then | ||
2507 | + return 0 | ||
2508 | + elif [[ $kernel_major -eq $major && $kernel_minor -ge $minor ]]; then | ||
2509 | + return 0 | ||
2510 | + fi | ||
2511 | + | ||
2512 | + return 1 | ||
2513 | +} | ||
2514 | + | ||
2515 | zram_cleanup() | ||
2516 | { | ||
2517 | echo "zram cleanup" | ||
2518 | local i= | ||
2519 | - for i in $(seq 0 $dev_makeswap); do | ||
2520 | + for i in $(seq $dev_start $dev_makeswap); do | ||
2521 | swapoff /dev/zram$i | ||
2522 | done | ||
2523 | |||
2524 | - for i in $(seq 0 $dev_mounted); do | ||
2525 | + for i in $(seq $dev_start $dev_mounted); do | ||
2526 | umount /dev/zram$i | ||
2527 | done | ||
2528 | |||
2529 | - for i in $(seq 0 $(($dev_num - 1))); do | ||
2530 | + for i in $(seq $dev_start $dev_end); do | ||
2531 | echo 1 > /sys/block/zram${i}/reset | ||
2532 | rm -rf zram$i | ||
2533 | done | ||
2534 | |||
2535 | -} | ||
2536 | + if [ $sys_control -eq 1 ]; then | ||
2537 | + for i in $(seq $dev_start $dev_end); do | ||
2538 | + echo $i > /sys/class/zram-control/hot_remove | ||
2539 | + done | ||
2540 | + fi | ||
2541 | |||
2542 | -zram_unload() | ||
2543 | -{ | ||
2544 | - if [ $MODULE -ne 0 ] ; then | ||
2545 | - echo "zram rmmod zram" | ||
2546 | + if [ $module_load -eq 1 ]; then | ||
2547 | rmmod zram > /dev/null 2>&1 | ||
2548 | fi | ||
2549 | } | ||
2550 | |||
2551 | zram_load() | ||
2552 | { | ||
2553 | - # check zram module exists | ||
2554 | - MODULE_PATH=/lib/modules/`uname -r`/kernel/drivers/block/zram/zram.ko | ||
2555 | - if [ -f $MODULE_PATH ]; then | ||
2556 | - MODULE=1 | ||
2557 | - echo "create '$dev_num' zram device(s)" | ||
2558 | - modprobe zram num_devices=$dev_num | ||
2559 | - if [ $? -ne 0 ]; then | ||
2560 | - echo "failed to insert zram module" | ||
2561 | - exit 1 | ||
2562 | - fi | ||
2563 | - | ||
2564 | - dev_num_created=$(ls /dev/zram* | wc -w) | ||
2565 | + echo "create '$dev_num' zram device(s)" | ||
2566 | + | ||
2567 | + # zram module loaded, new kernel | ||
2568 | + if [ -d "/sys/class/zram-control" ]; then | ||
2569 | + echo "zram modules already loaded, kernel supports" \ | ||
2570 | + "zram-control interface" | ||
2571 | + dev_start=$(ls /dev/zram* | wc -w) | ||
2572 | + dev_end=$(($dev_start + $dev_num - 1)) | ||
2573 | + sys_control=1 | ||
2574 | + | ||
2575 | + for i in $(seq $dev_start $dev_end); do | ||
2576 | + cat /sys/class/zram-control/hot_add > /dev/null | ||
2577 | + done | ||
2578 | + | ||
2579 | + echo "all zram devices (/dev/zram$dev_start~$dev_end" \ | ||
2580 | + "successfully created" | ||
2581 | + return 0 | ||
2582 | + fi | ||
2583 | |||
2584 | - if [ "$dev_num_created" -ne "$dev_num" ]; then | ||
2585 | - echo "unexpected num of devices: $dev_num_created" | ||
2586 | - ERR_CODE=-1 | ||
2587 | + # detect old kernel or built-in | ||
2588 | + modprobe zram num_devices=$dev_num | ||
2589 | + if [ ! -d "/sys/class/zram-control" ]; then | ||
2590 | + if grep -q '^zram' /proc/modules; then | ||
2591 | + rmmod zram > /dev/null 2>&1 | ||
2592 | + if [ $? -ne 0 ]; then | ||
2593 | + echo "zram module is being used on old kernel" \ | ||
2594 | + "without zram-control interface" | ||
2595 | + exit $ksft_skip | ||
2596 | + fi | ||
2597 | else | ||
2598 | - echo "zram load module successful" | ||
2599 | + echo "test needs CONFIG_ZRAM=m on old kernel without" \ | ||
2600 | + "zram-control interface" | ||
2601 | + exit $ksft_skip | ||
2602 | fi | ||
2603 | - elif [ -b /dev/zram0 ]; then | ||
2604 | - echo "/dev/zram0 device file found: OK" | ||
2605 | - else | ||
2606 | - echo "ERROR: No zram.ko module or no /dev/zram0 device found" | ||
2607 | - echo "$TCID : CONFIG_ZRAM is not set" | ||
2608 | - exit 1 | ||
2609 | + modprobe zram num_devices=$dev_num | ||
2610 | fi | ||
2611 | + | ||
2612 | + module_load=1 | ||
2613 | + dev_end=$(($dev_num - 1)) | ||
2614 | + echo "all zram devices (/dev/zram0~$dev_end) successfully created" | ||
2615 | } | ||
2616 | |||
2617 | zram_max_streams() | ||
2618 | { | ||
2619 | echo "set max_comp_streams to zram device(s)" | ||
2620 | |||
2621 | - local i=0 | ||
2622 | + kernel_gte 4.7 | ||
2623 | + if [ $? -eq 0 ]; then | ||
2624 | + echo "The device attribute max_comp_streams was"\ | ||
2625 | + "deprecated in 4.7" | ||
2626 | + return 0 | ||
2627 | + fi | ||
2628 | + | ||
2629 | + local i=$dev_start | ||
2630 | for max_s in $zram_max_streams; do | ||
2631 | local sys_path="/sys/block/zram${i}/max_comp_streams" | ||
2632 | echo $max_s > $sys_path || \ | ||
2633 | @@ -98,7 +139,7 @@ zram_max_streams() | ||
2634 | echo "FAIL can't set max_streams '$max_s', get $max_stream" | ||
2635 | |||
2636 | i=$(($i + 1)) | ||
2637 | - echo "$sys_path = '$max_streams' ($i/$dev_num)" | ||
2638 | + echo "$sys_path = '$max_streams'" | ||
2639 | done | ||
2640 | |||
2641 | echo "zram max streams: OK" | ||
2642 | @@ -108,15 +149,16 @@ zram_compress_alg() | ||
2643 | { | ||
2644 | echo "test that we can set compression algorithm" | ||
2645 | |||
2646 | - local algs=$(cat /sys/block/zram0/comp_algorithm) | ||
2647 | + local i=$dev_start | ||
2648 | + local algs=$(cat /sys/block/zram${i}/comp_algorithm) | ||
2649 | echo "supported algs: $algs" | ||
2650 | - local i=0 | ||
2651 | + | ||
2652 | for alg in $zram_algs; do | ||
2653 | local sys_path="/sys/block/zram${i}/comp_algorithm" | ||
2654 | echo "$alg" > $sys_path || \ | ||
2655 | echo "FAIL can't set '$alg' to $sys_path" | ||
2656 | i=$(($i + 1)) | ||
2657 | - echo "$sys_path = '$alg' ($i/$dev_num)" | ||
2658 | + echo "$sys_path = '$alg'" | ||
2659 | done | ||
2660 | |||
2661 | echo "zram set compression algorithm: OK" | ||
2662 | @@ -125,14 +167,14 @@ zram_compress_alg() | ||
2663 | zram_set_disksizes() | ||
2664 | { | ||
2665 | echo "set disk size to zram device(s)" | ||
2666 | - local i=0 | ||
2667 | + local i=$dev_start | ||
2668 | for ds in $zram_sizes; do | ||
2669 | local sys_path="/sys/block/zram${i}/disksize" | ||
2670 | echo "$ds" > $sys_path || \ | ||
2671 | echo "FAIL can't set '$ds' to $sys_path" | ||
2672 | |||
2673 | i=$(($i + 1)) | ||
2674 | - echo "$sys_path = '$ds' ($i/$dev_num)" | ||
2675 | + echo "$sys_path = '$ds'" | ||
2676 | done | ||
2677 | |||
2678 | echo "zram set disksizes: OK" | ||
2679 | @@ -142,14 +184,14 @@ zram_set_memlimit() | ||
2680 | { | ||
2681 | echo "set memory limit to zram device(s)" | ||
2682 | |||
2683 | - local i=0 | ||
2684 | + local i=$dev_start | ||
2685 | for ds in $zram_mem_limits; do | ||
2686 | local sys_path="/sys/block/zram${i}/mem_limit" | ||
2687 | echo "$ds" > $sys_path || \ | ||
2688 | echo "FAIL can't set '$ds' to $sys_path" | ||
2689 | |||
2690 | i=$(($i + 1)) | ||
2691 | - echo "$sys_path = '$ds' ($i/$dev_num)" | ||
2692 | + echo "$sys_path = '$ds'" | ||
2693 | done | ||
2694 | |||
2695 | echo "zram set memory limit: OK" | ||
2696 | @@ -158,8 +200,8 @@ zram_set_memlimit() | ||
2697 | zram_makeswap() | ||
2698 | { | ||
2699 | echo "make swap with zram device(s)" | ||
2700 | - local i=0 | ||
2701 | - for i in $(seq 0 $(($dev_num - 1))); do | ||
2702 | + local i=$dev_start | ||
2703 | + for i in $(seq $dev_start $dev_end); do | ||
2704 | mkswap /dev/zram$i > err.log 2>&1 | ||
2705 | if [ $? -ne 0 ]; then | ||
2706 | cat err.log | ||
2707 | @@ -182,7 +224,7 @@ zram_makeswap() | ||
2708 | zram_swapoff() | ||
2709 | { | ||
2710 | local i= | ||
2711 | - for i in $(seq 0 $dev_makeswap); do | ||
2712 | + for i in $(seq $dev_start $dev_end); do | ||
2713 | swapoff /dev/zram$i > err.log 2>&1 | ||
2714 | if [ $? -ne 0 ]; then | ||
2715 | cat err.log | ||
2716 | @@ -196,7 +238,7 @@ zram_swapoff() | ||
2717 | |||
2718 | zram_makefs() | ||
2719 | { | ||
2720 | - local i=0 | ||
2721 | + local i=$dev_start | ||
2722 | for fs in $zram_filesystems; do | ||
2723 | # if requested fs not supported default it to ext2 | ||
2724 | which mkfs.$fs > /dev/null 2>&1 || fs=ext2 | ||
2725 | @@ -215,7 +257,7 @@ zram_makefs() | ||
2726 | zram_mount() | ||
2727 | { | ||
2728 | local i=0 | ||
2729 | - for i in $(seq 0 $(($dev_num - 1))); do | ||
2730 | + for i in $(seq $dev_start $dev_end); do | ||
2731 | echo "mount /dev/zram$i" | ||
2732 | mkdir zram$i | ||
2733 | mount /dev/zram$i zram$i > /dev/null || \ |