Annotation of /trunk/kernel-alx/patches-5.4/0110-5.4.11-all-fixes.patch
Parent Directory | Revision Log
Revision 3491 -
(hide annotations)
(download)
Mon May 11 14:36:14 2020 UTC (4 years, 4 months ago) by niro
File size: 203262 byte(s)
Mon May 11 14:36:14 2020 UTC (4 years, 4 months ago) by niro
File size: 203262 byte(s)
-linux-5.4.11
1 | niro | 3491 | diff --git a/Makefile b/Makefile |
2 | index 726bb3dacd5b..e8963f623568 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 = 10 | ||
10 | +SUBLEVEL = 11 | ||
11 | EXTRAVERSION = | ||
12 | NAME = Kleptomaniac Octopus | ||
13 | |||
14 | diff --git a/arch/arm/boot/dts/am335x-sancloud-bbe.dts b/arch/arm/boot/dts/am335x-sancloud-bbe.dts | ||
15 | index 8678e6e35493..e5fdb7abb0d5 100644 | ||
16 | --- a/arch/arm/boot/dts/am335x-sancloud-bbe.dts | ||
17 | +++ b/arch/arm/boot/dts/am335x-sancloud-bbe.dts | ||
18 | @@ -108,7 +108,7 @@ | ||
19 | |||
20 | &cpsw_emac0 { | ||
21 | phy-handle = <ðphy0>; | ||
22 | - phy-mode = "rgmii-txid"; | ||
23 | + phy-mode = "rgmii-id"; | ||
24 | }; | ||
25 | |||
26 | &i2c0 { | ||
27 | diff --git a/arch/arm/boot/dts/am437x-gp-evm.dts b/arch/arm/boot/dts/am437x-gp-evm.dts | ||
28 | index cae4500194fe..811c8cae315b 100644 | ||
29 | --- a/arch/arm/boot/dts/am437x-gp-evm.dts | ||
30 | +++ b/arch/arm/boot/dts/am437x-gp-evm.dts | ||
31 | @@ -86,7 +86,7 @@ | ||
32 | }; | ||
33 | |||
34 | lcd0: display { | ||
35 | - compatible = "osddisplays,osd057T0559-34ts", "panel-dpi"; | ||
36 | + compatible = "osddisplays,osd070t1718-19ts", "panel-dpi"; | ||
37 | label = "lcd"; | ||
38 | |||
39 | backlight = <&lcd_bl>; | ||
40 | diff --git a/arch/arm/boot/dts/am43x-epos-evm.dts b/arch/arm/boot/dts/am43x-epos-evm.dts | ||
41 | index 95314121d111..078cb473fa7d 100644 | ||
42 | --- a/arch/arm/boot/dts/am43x-epos-evm.dts | ||
43 | +++ b/arch/arm/boot/dts/am43x-epos-evm.dts | ||
44 | @@ -42,7 +42,7 @@ | ||
45 | }; | ||
46 | |||
47 | lcd0: display { | ||
48 | - compatible = "osddisplays,osd057T0559-34ts", "panel-dpi"; | ||
49 | + compatible = "osddisplays,osd070t1718-19ts", "panel-dpi"; | ||
50 | label = "lcd"; | ||
51 | |||
52 | backlight = <&lcd_bl>; | ||
53 | diff --git a/arch/arm/boot/dts/bcm-cygnus.dtsi b/arch/arm/boot/dts/bcm-cygnus.dtsi | ||
54 | index 2dac3efc7640..1bc45cfd5453 100644 | ||
55 | --- a/arch/arm/boot/dts/bcm-cygnus.dtsi | ||
56 | +++ b/arch/arm/boot/dts/bcm-cygnus.dtsi | ||
57 | @@ -174,8 +174,8 @@ | ||
58 | mdio: mdio@18002000 { | ||
59 | compatible = "brcm,iproc-mdio"; | ||
60 | reg = <0x18002000 0x8>; | ||
61 | - #size-cells = <1>; | ||
62 | - #address-cells = <0>; | ||
63 | + #size-cells = <0>; | ||
64 | + #address-cells = <1>; | ||
65 | status = "disabled"; | ||
66 | |||
67 | gphy0: ethernet-phy@0 { | ||
68 | diff --git a/arch/arm/boot/dts/bcm283x.dtsi b/arch/arm/boot/dts/bcm283x.dtsi | ||
69 | index 2d191fcbc2cc..90125ce19a1b 100644 | ||
70 | --- a/arch/arm/boot/dts/bcm283x.dtsi | ||
71 | +++ b/arch/arm/boot/dts/bcm283x.dtsi | ||
72 | @@ -40,7 +40,7 @@ | ||
73 | |||
74 | trips { | ||
75 | cpu-crit { | ||
76 | - temperature = <80000>; | ||
77 | + temperature = <90000>; | ||
78 | hysteresis = <0>; | ||
79 | type = "critical"; | ||
80 | }; | ||
81 | diff --git a/arch/arm/boot/dts/bcm5301x.dtsi b/arch/arm/boot/dts/bcm5301x.dtsi | ||
82 | index 372dc1eb88a0..2d9b4dd05830 100644 | ||
83 | --- a/arch/arm/boot/dts/bcm5301x.dtsi | ||
84 | +++ b/arch/arm/boot/dts/bcm5301x.dtsi | ||
85 | @@ -353,8 +353,8 @@ | ||
86 | mdio: mdio@18003000 { | ||
87 | compatible = "brcm,iproc-mdio"; | ||
88 | reg = <0x18003000 0x8>; | ||
89 | - #size-cells = <1>; | ||
90 | - #address-cells = <0>; | ||
91 | + #size-cells = <0>; | ||
92 | + #address-cells = <1>; | ||
93 | }; | ||
94 | |||
95 | mdio-bus-mux@18003000 { | ||
96 | diff --git a/arch/arm/boot/dts/imx6ul-14x14-evk.dtsi b/arch/arm/boot/dts/imx6ul-14x14-evk.dtsi | ||
97 | index c2a9dd57e56a..aa86341adaaa 100644 | ||
98 | --- a/arch/arm/boot/dts/imx6ul-14x14-evk.dtsi | ||
99 | +++ b/arch/arm/boot/dts/imx6ul-14x14-evk.dtsi | ||
100 | @@ -215,7 +215,7 @@ | ||
101 | flash0: n25q256a@0 { | ||
102 | #address-cells = <1>; | ||
103 | #size-cells = <1>; | ||
104 | - compatible = "micron,n25q256a"; | ||
105 | + compatible = "micron,n25q256a", "jedec,spi-nor"; | ||
106 | spi-max-frequency = <29000000>; | ||
107 | spi-rx-bus-width = <4>; | ||
108 | spi-tx-bus-width = <4>; | ||
109 | diff --git a/arch/arm/configs/exynos_defconfig b/arch/arm/configs/exynos_defconfig | ||
110 | index 08db1c83eb2d..736ed7a7bcf8 100644 | ||
111 | --- a/arch/arm/configs/exynos_defconfig | ||
112 | +++ b/arch/arm/configs/exynos_defconfig | ||
113 | @@ -348,6 +348,7 @@ CONFIG_PRINTK_TIME=y | ||
114 | CONFIG_DYNAMIC_DEBUG=y | ||
115 | CONFIG_DEBUG_INFO=y | ||
116 | CONFIG_MAGIC_SYSRQ=y | ||
117 | +CONFIG_DEBUG_FS=y | ||
118 | CONFIG_DEBUG_KERNEL=y | ||
119 | CONFIG_SOFTLOCKUP_DETECTOR=y | ||
120 | # CONFIG_DETECT_HUNG_TASK is not set | ||
121 | diff --git a/arch/arm/configs/imx_v6_v7_defconfig b/arch/arm/configs/imx_v6_v7_defconfig | ||
122 | index 0f7381ee0c37..dabb80453249 100644 | ||
123 | --- a/arch/arm/configs/imx_v6_v7_defconfig | ||
124 | +++ b/arch/arm/configs/imx_v6_v7_defconfig | ||
125 | @@ -460,6 +460,7 @@ CONFIG_FONT_8x8=y | ||
126 | CONFIG_FONT_8x16=y | ||
127 | CONFIG_PRINTK_TIME=y | ||
128 | CONFIG_MAGIC_SYSRQ=y | ||
129 | +CONFIG_DEBUG_FS=y | ||
130 | # CONFIG_SCHED_DEBUG is not set | ||
131 | CONFIG_PROVE_LOCKING=y | ||
132 | # CONFIG_DEBUG_BUGVERBOSE is not set | ||
133 | diff --git a/arch/arm/configs/omap2plus_defconfig b/arch/arm/configs/omap2plus_defconfig | ||
134 | index 40d7f1a4fc45..4ec69fb8a698 100644 | ||
135 | --- a/arch/arm/configs/omap2plus_defconfig | ||
136 | +++ b/arch/arm/configs/omap2plus_defconfig | ||
137 | @@ -552,5 +552,6 @@ CONFIG_DEBUG_INFO=y | ||
138 | CONFIG_DEBUG_INFO_SPLIT=y | ||
139 | CONFIG_DEBUG_INFO_DWARF4=y | ||
140 | CONFIG_MAGIC_SYSRQ=y | ||
141 | +CONFIG_DEBUG_FS=y | ||
142 | CONFIG_SCHEDSTATS=y | ||
143 | # CONFIG_DEBUG_BUGVERBOSE is not set | ||
144 | diff --git a/arch/arm/mach-vexpress/spc.c b/arch/arm/mach-vexpress/spc.c | ||
145 | index 354e0e7025ae..1da11bdb1dfb 100644 | ||
146 | --- a/arch/arm/mach-vexpress/spc.c | ||
147 | +++ b/arch/arm/mach-vexpress/spc.c | ||
148 | @@ -551,8 +551,9 @@ static struct clk *ve_spc_clk_register(struct device *cpu_dev) | ||
149 | |||
150 | static int __init ve_spc_clk_init(void) | ||
151 | { | ||
152 | - int cpu; | ||
153 | + int cpu, cluster; | ||
154 | struct clk *clk; | ||
155 | + bool init_opp_table[MAX_CLUSTERS] = { false }; | ||
156 | |||
157 | if (!info) | ||
158 | return 0; /* Continue only if SPC is initialised */ | ||
159 | @@ -578,8 +579,17 @@ static int __init ve_spc_clk_init(void) | ||
160 | continue; | ||
161 | } | ||
162 | |||
163 | + cluster = topology_physical_package_id(cpu_dev->id); | ||
164 | + if (init_opp_table[cluster]) | ||
165 | + continue; | ||
166 | + | ||
167 | if (ve_init_opp_table(cpu_dev)) | ||
168 | pr_warn("failed to initialise cpu%d opp table\n", cpu); | ||
169 | + else if (dev_pm_opp_set_sharing_cpus(cpu_dev, | ||
170 | + topology_core_cpumask(cpu_dev->id))) | ||
171 | + pr_warn("failed to mark OPPs shared for cpu%d\n", cpu); | ||
172 | + else | ||
173 | + init_opp_table[cluster] = true; | ||
174 | } | ||
175 | |||
176 | platform_device_register_simple("vexpress-spc-cpufreq", -1, NULL, 0); | ||
177 | diff --git a/arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi b/arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi | ||
178 | index 72b9a75976a1..bb960fe2bb64 100644 | ||
179 | --- a/arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi | ||
180 | +++ b/arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi | ||
181 | @@ -102,7 +102,7 @@ | ||
182 | |||
183 | reboot { | ||
184 | compatible ="syscon-reboot"; | ||
185 | - regmap = <&dcfg>; | ||
186 | + regmap = <&rst>; | ||
187 | offset = <0xb0>; | ||
188 | mask = <0x02>; | ||
189 | }; | ||
190 | @@ -161,6 +161,12 @@ | ||
191 | big-endian; | ||
192 | }; | ||
193 | |||
194 | + rst: syscon@1e60000 { | ||
195 | + compatible = "syscon"; | ||
196 | + reg = <0x0 0x1e60000 0x0 0x10000>; | ||
197 | + little-endian; | ||
198 | + }; | ||
199 | + | ||
200 | scfg: syscon@1fc0000 { | ||
201 | compatible = "fsl,ls1028a-scfg", "syscon"; | ||
202 | reg = <0x0 0x1fc0000 0x0 0x10000>; | ||
203 | @@ -567,7 +573,7 @@ | ||
204 | 0x00010004 0x0000003d | ||
205 | 0x00010005 0x00000045 | ||
206 | 0x00010006 0x0000004d | ||
207 | - 0x00010007 0x00000045 | ||
208 | + 0x00010007 0x00000055 | ||
209 | 0x00010008 0x0000005e | ||
210 | 0x00010009 0x00000066 | ||
211 | 0x0001000a 0x0000006e | ||
212 | diff --git a/arch/arm64/kernel/cpu_errata.c b/arch/arm64/kernel/cpu_errata.c | ||
213 | index 93f34b4eca25..96f576e9ea46 100644 | ||
214 | --- a/arch/arm64/kernel/cpu_errata.c | ||
215 | +++ b/arch/arm64/kernel/cpu_errata.c | ||
216 | @@ -575,6 +575,7 @@ static const struct midr_range spectre_v2_safe_list[] = { | ||
217 | MIDR_ALL_VERSIONS(MIDR_CORTEX_A53), | ||
218 | MIDR_ALL_VERSIONS(MIDR_CORTEX_A55), | ||
219 | MIDR_ALL_VERSIONS(MIDR_BRAHMA_B53), | ||
220 | + MIDR_ALL_VERSIONS(MIDR_HISI_TSV110), | ||
221 | { /* sentinel */ } | ||
222 | }; | ||
223 | |||
224 | diff --git a/arch/mips/net/ebpf_jit.c b/arch/mips/net/ebpf_jit.c | ||
225 | index a2405d5f7d1e..561154cbcc40 100644 | ||
226 | --- a/arch/mips/net/ebpf_jit.c | ||
227 | +++ b/arch/mips/net/ebpf_jit.c | ||
228 | @@ -604,6 +604,7 @@ static void emit_const_to_reg(struct jit_ctx *ctx, int dst, u64 value) | ||
229 | static int emit_bpf_tail_call(struct jit_ctx *ctx, int this_idx) | ||
230 | { | ||
231 | int off, b_off; | ||
232 | + int tcc_reg; | ||
233 | |||
234 | ctx->flags |= EBPF_SEEN_TC; | ||
235 | /* | ||
236 | @@ -616,14 +617,14 @@ static int emit_bpf_tail_call(struct jit_ctx *ctx, int this_idx) | ||
237 | b_off = b_imm(this_idx + 1, ctx); | ||
238 | emit_instr(ctx, bne, MIPS_R_AT, MIPS_R_ZERO, b_off); | ||
239 | /* | ||
240 | - * if (--TCC < 0) | ||
241 | + * if (TCC-- < 0) | ||
242 | * goto out; | ||
243 | */ | ||
244 | /* Delay slot */ | ||
245 | - emit_instr(ctx, daddiu, MIPS_R_T5, | ||
246 | - (ctx->flags & EBPF_TCC_IN_V1) ? MIPS_R_V1 : MIPS_R_S4, -1); | ||
247 | + tcc_reg = (ctx->flags & EBPF_TCC_IN_V1) ? MIPS_R_V1 : MIPS_R_S4; | ||
248 | + emit_instr(ctx, daddiu, MIPS_R_T5, tcc_reg, -1); | ||
249 | b_off = b_imm(this_idx + 1, ctx); | ||
250 | - emit_instr(ctx, bltz, MIPS_R_T5, b_off); | ||
251 | + emit_instr(ctx, bltz, tcc_reg, b_off); | ||
252 | /* | ||
253 | * prog = array->ptrs[index]; | ||
254 | * if (prog == NULL) | ||
255 | diff --git a/arch/parisc/include/asm/cmpxchg.h b/arch/parisc/include/asm/cmpxchg.h | ||
256 | index f627c37dad9c..ab5c215cf46c 100644 | ||
257 | --- a/arch/parisc/include/asm/cmpxchg.h | ||
258 | +++ b/arch/parisc/include/asm/cmpxchg.h | ||
259 | @@ -44,8 +44,14 @@ __xchg(unsigned long x, __volatile__ void *ptr, int size) | ||
260 | ** if (((unsigned long)p & 0xf) == 0) | ||
261 | ** return __ldcw(p); | ||
262 | */ | ||
263 | -#define xchg(ptr, x) \ | ||
264 | - ((__typeof__(*(ptr)))__xchg((unsigned long)(x), (ptr), sizeof(*(ptr)))) | ||
265 | +#define xchg(ptr, x) \ | ||
266 | +({ \ | ||
267 | + __typeof__(*(ptr)) __ret; \ | ||
268 | + __typeof__(*(ptr)) _x_ = (x); \ | ||
269 | + __ret = (__typeof__(*(ptr))) \ | ||
270 | + __xchg((unsigned long)_x_, (ptr), sizeof(*(ptr))); \ | ||
271 | + __ret; \ | ||
272 | +}) | ||
273 | |||
274 | /* bug catcher for when unsupported size is used - won't link */ | ||
275 | extern void __cmpxchg_called_with_bad_pointer(void); | ||
276 | diff --git a/arch/parisc/include/asm/kexec.h b/arch/parisc/include/asm/kexec.h | ||
277 | index a99ea747d7ed..87e174006995 100644 | ||
278 | --- a/arch/parisc/include/asm/kexec.h | ||
279 | +++ b/arch/parisc/include/asm/kexec.h | ||
280 | @@ -2,8 +2,6 @@ | ||
281 | #ifndef _ASM_PARISC_KEXEC_H | ||
282 | #define _ASM_PARISC_KEXEC_H | ||
283 | |||
284 | -#ifdef CONFIG_KEXEC | ||
285 | - | ||
286 | /* Maximum physical address we can use pages from */ | ||
287 | #define KEXEC_SOURCE_MEMORY_LIMIT (-1UL) | ||
288 | /* Maximum address we can reach in physical address mode */ | ||
289 | @@ -32,6 +30,4 @@ static inline void crash_setup_regs(struct pt_regs *newregs, | ||
290 | |||
291 | #endif /* __ASSEMBLY__ */ | ||
292 | |||
293 | -#endif /* CONFIG_KEXEC */ | ||
294 | - | ||
295 | #endif /* _ASM_PARISC_KEXEC_H */ | ||
296 | diff --git a/arch/parisc/kernel/Makefile b/arch/parisc/kernel/Makefile | ||
297 | index 2663c8f8be11..068d90950d93 100644 | ||
298 | --- a/arch/parisc/kernel/Makefile | ||
299 | +++ b/arch/parisc/kernel/Makefile | ||
300 | @@ -37,5 +37,5 @@ obj-$(CONFIG_FUNCTION_GRAPH_TRACER) += ftrace.o | ||
301 | obj-$(CONFIG_JUMP_LABEL) += jump_label.o | ||
302 | obj-$(CONFIG_KGDB) += kgdb.o | ||
303 | obj-$(CONFIG_KPROBES) += kprobes.o | ||
304 | -obj-$(CONFIG_KEXEC) += kexec.o relocate_kernel.o | ||
305 | +obj-$(CONFIG_KEXEC_CORE) += kexec.o relocate_kernel.o | ||
306 | obj-$(CONFIG_KEXEC_FILE) += kexec_file.o | ||
307 | diff --git a/arch/parisc/kernel/drivers.c b/arch/parisc/kernel/drivers.c | ||
308 | index 3b330e58a4f0..a6c9f49c6612 100644 | ||
309 | --- a/arch/parisc/kernel/drivers.c | ||
310 | +++ b/arch/parisc/kernel/drivers.c | ||
311 | @@ -810,7 +810,7 @@ EXPORT_SYMBOL(device_to_hwpath); | ||
312 | static void walk_native_bus(unsigned long io_io_low, unsigned long io_io_high, | ||
313 | struct device *parent); | ||
314 | |||
315 | -static void walk_lower_bus(struct parisc_device *dev) | ||
316 | +static void __init walk_lower_bus(struct parisc_device *dev) | ||
317 | { | ||
318 | unsigned long io_io_low, io_io_high; | ||
319 | |||
320 | diff --git a/arch/powerpc/include/asm/spinlock.h b/arch/powerpc/include/asm/spinlock.h | ||
321 | index e9a960e28f3c..d6102e34eb21 100644 | ||
322 | --- a/arch/powerpc/include/asm/spinlock.h | ||
323 | +++ b/arch/powerpc/include/asm/spinlock.h | ||
324 | @@ -15,6 +15,7 @@ | ||
325 | * | ||
326 | * (the type definitions are in asm/spinlock_types.h) | ||
327 | */ | ||
328 | +#include <linux/jump_label.h> | ||
329 | #include <linux/irqflags.h> | ||
330 | #ifdef CONFIG_PPC64 | ||
331 | #include <asm/paca.h> | ||
332 | @@ -36,10 +37,12 @@ | ||
333 | #endif | ||
334 | |||
335 | #ifdef CONFIG_PPC_PSERIES | ||
336 | +DECLARE_STATIC_KEY_FALSE(shared_processor); | ||
337 | + | ||
338 | #define vcpu_is_preempted vcpu_is_preempted | ||
339 | static inline bool vcpu_is_preempted(int cpu) | ||
340 | { | ||
341 | - if (!firmware_has_feature(FW_FEATURE_SPLPAR)) | ||
342 | + if (!static_branch_unlikely(&shared_processor)) | ||
343 | return false; | ||
344 | return !!(be32_to_cpu(lppaca_of(cpu).yield_count) & 1); | ||
345 | } | ||
346 | diff --git a/arch/powerpc/mm/mem.c b/arch/powerpc/mm/mem.c | ||
347 | index d30a2e6e68b4..9f5b32163bda 100644 | ||
348 | --- a/arch/powerpc/mm/mem.c | ||
349 | +++ b/arch/powerpc/mm/mem.c | ||
350 | @@ -282,6 +282,14 @@ void __init mem_init(void) | ||
351 | BUILD_BUG_ON(MMU_PAGE_COUNT > 16); | ||
352 | |||
353 | #ifdef CONFIG_SWIOTLB | ||
354 | + /* | ||
355 | + * Some platforms (e.g. 85xx) limit DMA-able memory way below | ||
356 | + * 4G. We force memblock to bottom-up mode to ensure that the | ||
357 | + * memory allocated in swiotlb_init() is DMA-able. | ||
358 | + * As it's the last memblock allocation, no need to reset it | ||
359 | + * back to to-down. | ||
360 | + */ | ||
361 | + memblock_set_bottom_up(true); | ||
362 | swiotlb_init(0); | ||
363 | #endif | ||
364 | |||
365 | diff --git a/arch/powerpc/platforms/pseries/setup.c b/arch/powerpc/platforms/pseries/setup.c | ||
366 | index 0a40201f315f..0c8421dd01ab 100644 | ||
367 | --- a/arch/powerpc/platforms/pseries/setup.c | ||
368 | +++ b/arch/powerpc/platforms/pseries/setup.c | ||
369 | @@ -74,6 +74,9 @@ | ||
370 | #include "pseries.h" | ||
371 | #include "../../../../drivers/pci/pci.h" | ||
372 | |||
373 | +DEFINE_STATIC_KEY_FALSE(shared_processor); | ||
374 | +EXPORT_SYMBOL_GPL(shared_processor); | ||
375 | + | ||
376 | int CMO_PrPSP = -1; | ||
377 | int CMO_SecPSP = -1; | ||
378 | unsigned long CMO_PageSize = (ASM_CONST(1) << IOMMU_PAGE_SHIFT_4K); | ||
379 | @@ -758,6 +761,10 @@ static void __init pSeries_setup_arch(void) | ||
380 | |||
381 | if (firmware_has_feature(FW_FEATURE_LPAR)) { | ||
382 | vpa_init(boot_cpuid); | ||
383 | + | ||
384 | + if (lppaca_shared_proc(get_lppaca())) | ||
385 | + static_branch_enable(&shared_processor); | ||
386 | + | ||
387 | ppc_md.power_save = pseries_lpar_idle; | ||
388 | ppc_md.enable_pmcs = pseries_lpar_enable_pmcs; | ||
389 | #ifdef CONFIG_PCI_IOV | ||
390 | diff --git a/arch/riscv/net/bpf_jit_comp.c b/arch/riscv/net/bpf_jit_comp.c | ||
391 | index 5451ef3845f2..7fbf56aab661 100644 | ||
392 | --- a/arch/riscv/net/bpf_jit_comp.c | ||
393 | +++ b/arch/riscv/net/bpf_jit_comp.c | ||
394 | @@ -631,14 +631,14 @@ static int emit_bpf_tail_call(int insn, struct rv_jit_context *ctx) | ||
395 | return -1; | ||
396 | emit(rv_bgeu(RV_REG_A2, RV_REG_T1, off >> 1), ctx); | ||
397 | |||
398 | - /* if (--TCC < 0) | ||
399 | + /* if (TCC-- < 0) | ||
400 | * goto out; | ||
401 | */ | ||
402 | emit(rv_addi(RV_REG_T1, tcc, -1), ctx); | ||
403 | off = (tc_ninsn - (ctx->ninsns - start_insn)) << 2; | ||
404 | if (is_13b_check(off, insn)) | ||
405 | return -1; | ||
406 | - emit(rv_blt(RV_REG_T1, RV_REG_ZERO, off >> 1), ctx); | ||
407 | + emit(rv_blt(tcc, RV_REG_ZERO, off >> 1), ctx); | ||
408 | |||
409 | /* prog = array->ptrs[index]; | ||
410 | * if (!prog) | ||
411 | diff --git a/arch/s390/purgatory/Makefile b/arch/s390/purgatory/Makefile | ||
412 | index bc0d7a0d0394..9de56065f28c 100644 | ||
413 | --- a/arch/s390/purgatory/Makefile | ||
414 | +++ b/arch/s390/purgatory/Makefile | ||
415 | @@ -15,8 +15,10 @@ CFLAGS_sha256.o := -D__DISABLE_EXPORTS | ||
416 | $(obj)/mem.o: $(srctree)/arch/s390/lib/mem.S FORCE | ||
417 | $(call if_changed_rule,as_o_S) | ||
418 | |||
419 | -$(obj)/string.o: $(srctree)/arch/s390/lib/string.c FORCE | ||
420 | - $(call if_changed_rule,cc_o_c) | ||
421 | +KCOV_INSTRUMENT := n | ||
422 | +GCOV_PROFILE := n | ||
423 | +UBSAN_SANITIZE := n | ||
424 | +KASAN_SANITIZE := n | ||
425 | |||
426 | KBUILD_CFLAGS := -fno-strict-aliasing -Wall -Wstrict-prototypes | ||
427 | KBUILD_CFLAGS += -Wno-pointer-sign -Wno-sign-compare | ||
428 | diff --git a/arch/s390/purgatory/string.c b/arch/s390/purgatory/string.c | ||
429 | new file mode 100644 | ||
430 | index 000000000000..c98c22a72db7 | ||
431 | --- /dev/null | ||
432 | +++ b/arch/s390/purgatory/string.c | ||
433 | @@ -0,0 +1,3 @@ | ||
434 | +// SPDX-License-Identifier: GPL-2.0 | ||
435 | +#define __HAVE_ARCH_MEMCMP /* arch function */ | ||
436 | +#include "../lib/string.c" | ||
437 | diff --git a/arch/x86/events/core.c b/arch/x86/events/core.c | ||
438 | index 7b21455d7504..e622158f5659 100644 | ||
439 | --- a/arch/x86/events/core.c | ||
440 | +++ b/arch/x86/events/core.c | ||
441 | @@ -375,7 +375,7 @@ int x86_add_exclusive(unsigned int what) | ||
442 | * LBR and BTS are still mutually exclusive. | ||
443 | */ | ||
444 | if (x86_pmu.lbr_pt_coexist && what == x86_lbr_exclusive_pt) | ||
445 | - return 0; | ||
446 | + goto out; | ||
447 | |||
448 | if (!atomic_inc_not_zero(&x86_pmu.lbr_exclusive[what])) { | ||
449 | mutex_lock(&pmc_reserve_mutex); | ||
450 | @@ -387,6 +387,7 @@ int x86_add_exclusive(unsigned int what) | ||
451 | mutex_unlock(&pmc_reserve_mutex); | ||
452 | } | ||
453 | |||
454 | +out: | ||
455 | atomic_inc(&active_events); | ||
456 | return 0; | ||
457 | |||
458 | @@ -397,11 +398,15 @@ fail_unlock: | ||
459 | |||
460 | void x86_del_exclusive(unsigned int what) | ||
461 | { | ||
462 | + atomic_dec(&active_events); | ||
463 | + | ||
464 | + /* | ||
465 | + * See the comment in x86_add_exclusive(). | ||
466 | + */ | ||
467 | if (x86_pmu.lbr_pt_coexist && what == x86_lbr_exclusive_pt) | ||
468 | return; | ||
469 | |||
470 | atomic_dec(&x86_pmu.lbr_exclusive[what]); | ||
471 | - atomic_dec(&active_events); | ||
472 | } | ||
473 | |||
474 | int x86_setup_perfctr(struct perf_event *event) | ||
475 | @@ -1641,9 +1646,12 @@ static struct attribute_group x86_pmu_format_group __ro_after_init = { | ||
476 | |||
477 | ssize_t events_sysfs_show(struct device *dev, struct device_attribute *attr, char *page) | ||
478 | { | ||
479 | - struct perf_pmu_events_attr *pmu_attr = \ | ||
480 | + struct perf_pmu_events_attr *pmu_attr = | ||
481 | container_of(attr, struct perf_pmu_events_attr, attr); | ||
482 | - u64 config = x86_pmu.event_map(pmu_attr->id); | ||
483 | + u64 config = 0; | ||
484 | + | ||
485 | + if (pmu_attr->id < x86_pmu.max_events) | ||
486 | + config = x86_pmu.event_map(pmu_attr->id); | ||
487 | |||
488 | /* string trumps id */ | ||
489 | if (pmu_attr->event_str) | ||
490 | @@ -1712,6 +1720,9 @@ is_visible(struct kobject *kobj, struct attribute *attr, int idx) | ||
491 | { | ||
492 | struct perf_pmu_events_attr *pmu_attr; | ||
493 | |||
494 | + if (idx >= x86_pmu.max_events) | ||
495 | + return 0; | ||
496 | + | ||
497 | pmu_attr = container_of(attr, struct perf_pmu_events_attr, attr.attr); | ||
498 | /* str trumps id */ | ||
499 | return pmu_attr->event_str || x86_pmu.event_map(idx) ? attr->mode : 0; | ||
500 | diff --git a/arch/x86/kernel/early-quirks.c b/arch/x86/kernel/early-quirks.c | ||
501 | index 606711f5ebf8..2f9ec14be3b1 100644 | ||
502 | --- a/arch/x86/kernel/early-quirks.c | ||
503 | +++ b/arch/x86/kernel/early-quirks.c | ||
504 | @@ -714,6 +714,8 @@ static struct chipset early_qrk[] __initdata = { | ||
505 | PCI_CLASS_BRIDGE_HOST, PCI_ANY_ID, 0, force_disable_hpet}, | ||
506 | { PCI_VENDOR_ID_INTEL, 0x3ec4, | ||
507 | PCI_CLASS_BRIDGE_HOST, PCI_ANY_ID, 0, force_disable_hpet}, | ||
508 | + { PCI_VENDOR_ID_INTEL, 0x8a12, | ||
509 | + PCI_CLASS_BRIDGE_HOST, PCI_ANY_ID, 0, force_disable_hpet}, | ||
510 | { PCI_VENDOR_ID_BROADCOM, 0x4331, | ||
511 | PCI_CLASS_NETWORK_OTHER, PCI_ANY_ID, 0, apple_airport_reset}, | ||
512 | {} | ||
513 | diff --git a/arch/x86/platform/efi/quirks.c b/arch/x86/platform/efi/quirks.c | ||
514 | index 3b9fd679cea9..aefe845dff59 100644 | ||
515 | --- a/arch/x86/platform/efi/quirks.c | ||
516 | +++ b/arch/x86/platform/efi/quirks.c | ||
517 | @@ -260,10 +260,6 @@ void __init efi_arch_mem_reserve(phys_addr_t addr, u64 size) | ||
518 | return; | ||
519 | } | ||
520 | |||
521 | - /* No need to reserve regions that will never be freed. */ | ||
522 | - if (md.attribute & EFI_MEMORY_RUNTIME) | ||
523 | - return; | ||
524 | - | ||
525 | size += addr % EFI_PAGE_SIZE; | ||
526 | size = round_up(size, EFI_PAGE_SIZE); | ||
527 | addr = round_down(addr, EFI_PAGE_SIZE); | ||
528 | @@ -293,6 +289,8 @@ void __init efi_arch_mem_reserve(phys_addr_t addr, u64 size) | ||
529 | early_memunmap(new, new_size); | ||
530 | |||
531 | efi_memmap_install(new_phys, num_entries); | ||
532 | + e820__range_update(addr, size, E820_TYPE_RAM, E820_TYPE_RESERVED); | ||
533 | + e820__update_table(e820_table); | ||
534 | } | ||
535 | |||
536 | /* | ||
537 | diff --git a/block/blk-core.c b/block/blk-core.c | ||
538 | index d5e668ec751b..1075aaff606d 100644 | ||
539 | --- a/block/blk-core.c | ||
540 | +++ b/block/blk-core.c | ||
541 | @@ -886,11 +886,14 @@ generic_make_request_checks(struct bio *bio) | ||
542 | } | ||
543 | |||
544 | /* | ||
545 | - * For a REQ_NOWAIT based request, return -EOPNOTSUPP | ||
546 | - * if queue is not a request based queue. | ||
547 | + * Non-mq queues do not honor REQ_NOWAIT, so complete a bio | ||
548 | + * with BLK_STS_AGAIN status in order to catch -EAGAIN and | ||
549 | + * to give a chance to the caller to repeat request gracefully. | ||
550 | */ | ||
551 | - if ((bio->bi_opf & REQ_NOWAIT) && !queue_is_mq(q)) | ||
552 | - goto not_supported; | ||
553 | + if ((bio->bi_opf & REQ_NOWAIT) && !queue_is_mq(q)) { | ||
554 | + status = BLK_STS_AGAIN; | ||
555 | + goto end_io; | ||
556 | + } | ||
557 | |||
558 | if (should_fail_bio(bio)) | ||
559 | goto end_io; | ||
560 | diff --git a/block/blk-flush.c b/block/blk-flush.c | ||
561 | index 1eec9cbe5a0a..b1f0a1ac505c 100644 | ||
562 | --- a/block/blk-flush.c | ||
563 | +++ b/block/blk-flush.c | ||
564 | @@ -69,6 +69,7 @@ | ||
565 | #include <linux/blkdev.h> | ||
566 | #include <linux/gfp.h> | ||
567 | #include <linux/blk-mq.h> | ||
568 | +#include <linux/lockdep.h> | ||
569 | |||
570 | #include "blk.h" | ||
571 | #include "blk-mq.h" | ||
572 | @@ -492,6 +493,9 @@ struct blk_flush_queue *blk_alloc_flush_queue(struct request_queue *q, | ||
573 | INIT_LIST_HEAD(&fq->flush_queue[1]); | ||
574 | INIT_LIST_HEAD(&fq->flush_data_in_flight); | ||
575 | |||
576 | + lockdep_register_key(&fq->key); | ||
577 | + lockdep_set_class(&fq->mq_flush_lock, &fq->key); | ||
578 | + | ||
579 | return fq; | ||
580 | |||
581 | fail_rq: | ||
582 | @@ -506,6 +510,7 @@ void blk_free_flush_queue(struct blk_flush_queue *fq) | ||
583 | if (!fq) | ||
584 | return; | ||
585 | |||
586 | + lockdep_unregister_key(&fq->key); | ||
587 | kfree(fq->flush_rq); | ||
588 | kfree(fq); | ||
589 | } | ||
590 | diff --git a/block/blk-map.c b/block/blk-map.c | ||
591 | index 3a62e471d81b..b0790268ed9d 100644 | ||
592 | --- a/block/blk-map.c | ||
593 | +++ b/block/blk-map.c | ||
594 | @@ -151,7 +151,7 @@ int blk_rq_map_user_iov(struct request_queue *q, struct request *rq, | ||
595 | return 0; | ||
596 | |||
597 | unmap_rq: | ||
598 | - __blk_rq_unmap_user(bio); | ||
599 | + blk_rq_unmap_user(bio); | ||
600 | fail: | ||
601 | rq->bio = NULL; | ||
602 | return ret; | ||
603 | diff --git a/block/blk.h b/block/blk.h | ||
604 | index 47fba9362e60..ffea1691470e 100644 | ||
605 | --- a/block/blk.h | ||
606 | +++ b/block/blk.h | ||
607 | @@ -30,6 +30,7 @@ struct blk_flush_queue { | ||
608 | * at the same time | ||
609 | */ | ||
610 | struct request *orig_rq; | ||
611 | + struct lock_class_key key; | ||
612 | spinlock_t mq_flush_lock; | ||
613 | }; | ||
614 | |||
615 | diff --git a/drivers/bus/ti-sysc.c b/drivers/bus/ti-sysc.c | ||
616 | index 2b6670daf7fc..34bd9bf4e68a 100644 | ||
617 | --- a/drivers/bus/ti-sysc.c | ||
618 | +++ b/drivers/bus/ti-sysc.c | ||
619 | @@ -1594,6 +1594,10 @@ static int sysc_reset(struct sysc *ddata) | ||
620 | sysc_val |= sysc_mask; | ||
621 | sysc_write(ddata, sysc_offset, sysc_val); | ||
622 | |||
623 | + if (ddata->cfg.srst_udelay) | ||
624 | + usleep_range(ddata->cfg.srst_udelay, | ||
625 | + ddata->cfg.srst_udelay * 2); | ||
626 | + | ||
627 | if (ddata->clk_enable_quirk) | ||
628 | ddata->clk_enable_quirk(ddata); | ||
629 | |||
630 | diff --git a/drivers/char/tpm/tpm_ftpm_tee.c b/drivers/char/tpm/tpm_ftpm_tee.c | ||
631 | index 6640a14dbe48..22bf553ccf9d 100644 | ||
632 | --- a/drivers/char/tpm/tpm_ftpm_tee.c | ||
633 | +++ b/drivers/char/tpm/tpm_ftpm_tee.c | ||
634 | @@ -32,7 +32,7 @@ static const uuid_t ftpm_ta_uuid = | ||
635 | 0x82, 0xCB, 0x34, 0x3F, 0xB7, 0xF3, 0x78, 0x96); | ||
636 | |||
637 | /** | ||
638 | - * ftpm_tee_tpm_op_recv - retrieve fTPM response. | ||
639 | + * ftpm_tee_tpm_op_recv() - retrieve fTPM response. | ||
640 | * @chip: the tpm_chip description as specified in driver/char/tpm/tpm.h. | ||
641 | * @buf: the buffer to store data. | ||
642 | * @count: the number of bytes to read. | ||
643 | @@ -61,7 +61,7 @@ static int ftpm_tee_tpm_op_recv(struct tpm_chip *chip, u8 *buf, size_t count) | ||
644 | } | ||
645 | |||
646 | /** | ||
647 | - * ftpm_tee_tpm_op_send - send TPM commands through the TEE shared memory. | ||
648 | + * ftpm_tee_tpm_op_send() - send TPM commands through the TEE shared memory. | ||
649 | * @chip: the tpm_chip description as specified in driver/char/tpm/tpm.h | ||
650 | * @buf: the buffer to send. | ||
651 | * @len: the number of bytes to send. | ||
652 | @@ -208,7 +208,7 @@ static int ftpm_tee_match(struct tee_ioctl_version_data *ver, const void *data) | ||
653 | } | ||
654 | |||
655 | /** | ||
656 | - * ftpm_tee_probe - initialize the fTPM | ||
657 | + * ftpm_tee_probe() - initialize the fTPM | ||
658 | * @pdev: the platform_device description. | ||
659 | * | ||
660 | * Return: | ||
661 | @@ -298,7 +298,7 @@ out_tee_session: | ||
662 | } | ||
663 | |||
664 | /** | ||
665 | - * ftpm_tee_remove - remove the TPM device | ||
666 | + * ftpm_tee_remove() - remove the TPM device | ||
667 | * @pdev: the platform_device description. | ||
668 | * | ||
669 | * Return: | ||
670 | @@ -328,6 +328,19 @@ static int ftpm_tee_remove(struct platform_device *pdev) | ||
671 | return 0; | ||
672 | } | ||
673 | |||
674 | +/** | ||
675 | + * ftpm_tee_shutdown() - shutdown the TPM device | ||
676 | + * @pdev: the platform_device description. | ||
677 | + */ | ||
678 | +static void ftpm_tee_shutdown(struct platform_device *pdev) | ||
679 | +{ | ||
680 | + struct ftpm_tee_private *pvt_data = dev_get_drvdata(&pdev->dev); | ||
681 | + | ||
682 | + tee_shm_free(pvt_data->shm); | ||
683 | + tee_client_close_session(pvt_data->ctx, pvt_data->session); | ||
684 | + tee_client_close_context(pvt_data->ctx); | ||
685 | +} | ||
686 | + | ||
687 | static const struct of_device_id of_ftpm_tee_ids[] = { | ||
688 | { .compatible = "microsoft,ftpm" }, | ||
689 | { } | ||
690 | @@ -341,6 +354,7 @@ static struct platform_driver ftpm_tee_driver = { | ||
691 | }, | ||
692 | .probe = ftpm_tee_probe, | ||
693 | .remove = ftpm_tee_remove, | ||
694 | + .shutdown = ftpm_tee_shutdown, | ||
695 | }; | ||
696 | |||
697 | module_platform_driver(ftpm_tee_driver); | ||
698 | diff --git a/drivers/clk/at91/at91sam9260.c b/drivers/clk/at91/at91sam9260.c | ||
699 | index 0aabe49aed09..a9d4234758d7 100644 | ||
700 | --- a/drivers/clk/at91/at91sam9260.c | ||
701 | +++ b/drivers/clk/at91/at91sam9260.c | ||
702 | @@ -348,7 +348,7 @@ static void __init at91sam926x_pmc_setup(struct device_node *np, | ||
703 | return; | ||
704 | mainxtal_name = of_clk_get_parent_name(np, i); | ||
705 | |||
706 | - regmap = syscon_node_to_regmap(np); | ||
707 | + regmap = device_node_to_regmap(np); | ||
708 | if (IS_ERR(regmap)) | ||
709 | return; | ||
710 | |||
711 | diff --git a/drivers/clk/at91/at91sam9rl.c b/drivers/clk/at91/at91sam9rl.c | ||
712 | index 0ac34cdaa106..77fe83a73bf4 100644 | ||
713 | --- a/drivers/clk/at91/at91sam9rl.c | ||
714 | +++ b/drivers/clk/at91/at91sam9rl.c | ||
715 | @@ -83,7 +83,7 @@ static void __init at91sam9rl_pmc_setup(struct device_node *np) | ||
716 | return; | ||
717 | mainxtal_name = of_clk_get_parent_name(np, i); | ||
718 | |||
719 | - regmap = syscon_node_to_regmap(np); | ||
720 | + regmap = device_node_to_regmap(np); | ||
721 | if (IS_ERR(regmap)) | ||
722 | return; | ||
723 | |||
724 | diff --git a/drivers/clk/at91/at91sam9x5.c b/drivers/clk/at91/at91sam9x5.c | ||
725 | index 0855f3a80cc7..086cf0b4955c 100644 | ||
726 | --- a/drivers/clk/at91/at91sam9x5.c | ||
727 | +++ b/drivers/clk/at91/at91sam9x5.c | ||
728 | @@ -146,7 +146,7 @@ static void __init at91sam9x5_pmc_setup(struct device_node *np, | ||
729 | return; | ||
730 | mainxtal_name = of_clk_get_parent_name(np, i); | ||
731 | |||
732 | - regmap = syscon_node_to_regmap(np); | ||
733 | + regmap = device_node_to_regmap(np); | ||
734 | if (IS_ERR(regmap)) | ||
735 | return; | ||
736 | |||
737 | diff --git a/drivers/clk/at91/pmc.c b/drivers/clk/at91/pmc.c | ||
738 | index 0b03cfae3a9d..b71515acdec1 100644 | ||
739 | --- a/drivers/clk/at91/pmc.c | ||
740 | +++ b/drivers/clk/at91/pmc.c | ||
741 | @@ -275,7 +275,7 @@ static int __init pmc_register_ops(void) | ||
742 | |||
743 | np = of_find_matching_node(NULL, sama5d2_pmc_dt_ids); | ||
744 | |||
745 | - pmcreg = syscon_node_to_regmap(np); | ||
746 | + pmcreg = device_node_to_regmap(np); | ||
747 | if (IS_ERR(pmcreg)) | ||
748 | return PTR_ERR(pmcreg); | ||
749 | |||
750 | diff --git a/drivers/clk/at91/sama5d2.c b/drivers/clk/at91/sama5d2.c | ||
751 | index 0de1108737db..ff7e3f727082 100644 | ||
752 | --- a/drivers/clk/at91/sama5d2.c | ||
753 | +++ b/drivers/clk/at91/sama5d2.c | ||
754 | @@ -162,7 +162,7 @@ static void __init sama5d2_pmc_setup(struct device_node *np) | ||
755 | return; | ||
756 | mainxtal_name = of_clk_get_parent_name(np, i); | ||
757 | |||
758 | - regmap = syscon_node_to_regmap(np); | ||
759 | + regmap = device_node_to_regmap(np); | ||
760 | if (IS_ERR(regmap)) | ||
761 | return; | ||
762 | |||
763 | diff --git a/drivers/clk/at91/sama5d4.c b/drivers/clk/at91/sama5d4.c | ||
764 | index 25b156d4e645..a6dee4a3b6e4 100644 | ||
765 | --- a/drivers/clk/at91/sama5d4.c | ||
766 | +++ b/drivers/clk/at91/sama5d4.c | ||
767 | @@ -136,7 +136,7 @@ static void __init sama5d4_pmc_setup(struct device_node *np) | ||
768 | return; | ||
769 | mainxtal_name = of_clk_get_parent_name(np, i); | ||
770 | |||
771 | - regmap = syscon_node_to_regmap(np); | ||
772 | + regmap = device_node_to_regmap(np); | ||
773 | if (IS_ERR(regmap)) | ||
774 | return; | ||
775 | |||
776 | diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c | ||
777 | index 1c677d7f7f53..27a95c86a80b 100644 | ||
778 | --- a/drivers/clk/clk.c | ||
779 | +++ b/drivers/clk/clk.c | ||
780 | @@ -3231,6 +3231,34 @@ static inline void clk_debug_unregister(struct clk_core *core) | ||
781 | } | ||
782 | #endif | ||
783 | |||
784 | +static void clk_core_reparent_orphans_nolock(void) | ||
785 | +{ | ||
786 | + struct clk_core *orphan; | ||
787 | + struct hlist_node *tmp2; | ||
788 | + | ||
789 | + /* | ||
790 | + * walk the list of orphan clocks and reparent any that newly finds a | ||
791 | + * parent. | ||
792 | + */ | ||
793 | + hlist_for_each_entry_safe(orphan, tmp2, &clk_orphan_list, child_node) { | ||
794 | + struct clk_core *parent = __clk_init_parent(orphan); | ||
795 | + | ||
796 | + /* | ||
797 | + * We need to use __clk_set_parent_before() and _after() to | ||
798 | + * to properly migrate any prepare/enable count of the orphan | ||
799 | + * clock. This is important for CLK_IS_CRITICAL clocks, which | ||
800 | + * are enabled during init but might not have a parent yet. | ||
801 | + */ | ||
802 | + if (parent) { | ||
803 | + /* update the clk tree topology */ | ||
804 | + __clk_set_parent_before(orphan, parent); | ||
805 | + __clk_set_parent_after(orphan, parent, NULL); | ||
806 | + __clk_recalc_accuracies(orphan); | ||
807 | + __clk_recalc_rates(orphan, 0); | ||
808 | + } | ||
809 | + } | ||
810 | +} | ||
811 | + | ||
812 | /** | ||
813 | * __clk_core_init - initialize the data structures in a struct clk_core | ||
814 | * @core: clk_core being initialized | ||
815 | @@ -3241,8 +3269,6 @@ static inline void clk_debug_unregister(struct clk_core *core) | ||
816 | static int __clk_core_init(struct clk_core *core) | ||
817 | { | ||
818 | int ret; | ||
819 | - struct clk_core *orphan; | ||
820 | - struct hlist_node *tmp2; | ||
821 | unsigned long rate; | ||
822 | |||
823 | if (!core) | ||
824 | @@ -3389,27 +3415,8 @@ static int __clk_core_init(struct clk_core *core) | ||
825 | clk_enable_unlock(flags); | ||
826 | } | ||
827 | |||
828 | - /* | ||
829 | - * walk the list of orphan clocks and reparent any that newly finds a | ||
830 | - * parent. | ||
831 | - */ | ||
832 | - hlist_for_each_entry_safe(orphan, tmp2, &clk_orphan_list, child_node) { | ||
833 | - struct clk_core *parent = __clk_init_parent(orphan); | ||
834 | + clk_core_reparent_orphans_nolock(); | ||
835 | |||
836 | - /* | ||
837 | - * We need to use __clk_set_parent_before() and _after() to | ||
838 | - * to properly migrate any prepare/enable count of the orphan | ||
839 | - * clock. This is important for CLK_IS_CRITICAL clocks, which | ||
840 | - * are enabled during init but might not have a parent yet. | ||
841 | - */ | ||
842 | - if (parent) { | ||
843 | - /* update the clk tree topology */ | ||
844 | - __clk_set_parent_before(orphan, parent); | ||
845 | - __clk_set_parent_after(orphan, parent, NULL); | ||
846 | - __clk_recalc_accuracies(orphan); | ||
847 | - __clk_recalc_rates(orphan, 0); | ||
848 | - } | ||
849 | - } | ||
850 | |||
851 | kref_init(&core->ref); | ||
852 | out: | ||
853 | @@ -4160,6 +4167,13 @@ int clk_notifier_unregister(struct clk *clk, struct notifier_block *nb) | ||
854 | EXPORT_SYMBOL_GPL(clk_notifier_unregister); | ||
855 | |||
856 | #ifdef CONFIG_OF | ||
857 | +static void clk_core_reparent_orphans(void) | ||
858 | +{ | ||
859 | + clk_prepare_lock(); | ||
860 | + clk_core_reparent_orphans_nolock(); | ||
861 | + clk_prepare_unlock(); | ||
862 | +} | ||
863 | + | ||
864 | /** | ||
865 | * struct of_clk_provider - Clock provider registration structure | ||
866 | * @link: Entry in global list of clock providers | ||
867 | @@ -4255,6 +4269,8 @@ int of_clk_add_provider(struct device_node *np, | ||
868 | mutex_unlock(&of_clk_mutex); | ||
869 | pr_debug("Added clock from %pOF\n", np); | ||
870 | |||
871 | + clk_core_reparent_orphans(); | ||
872 | + | ||
873 | ret = of_clk_set_defaults(np, true); | ||
874 | if (ret < 0) | ||
875 | of_clk_del_provider(np); | ||
876 | @@ -4290,6 +4306,8 @@ int of_clk_add_hw_provider(struct device_node *np, | ||
877 | mutex_unlock(&of_clk_mutex); | ||
878 | pr_debug("Added clk_hw provider from %pOF\n", np); | ||
879 | |||
880 | + clk_core_reparent_orphans(); | ||
881 | + | ||
882 | ret = of_clk_set_defaults(np, true); | ||
883 | if (ret < 0) | ||
884 | of_clk_del_provider(np); | ||
885 | diff --git a/drivers/firmware/efi/earlycon.c b/drivers/firmware/efi/earlycon.c | ||
886 | index c9a0efca17b0..d4077db6dc97 100644 | ||
887 | --- a/drivers/firmware/efi/earlycon.c | ||
888 | +++ b/drivers/firmware/efi/earlycon.c | ||
889 | @@ -13,18 +13,57 @@ | ||
890 | |||
891 | #include <asm/early_ioremap.h> | ||
892 | |||
893 | +static const struct console *earlycon_console __initdata; | ||
894 | static const struct font_desc *font; | ||
895 | static u32 efi_x, efi_y; | ||
896 | static u64 fb_base; | ||
897 | static pgprot_t fb_prot; | ||
898 | +static void *efi_fb; | ||
899 | + | ||
900 | +/* | ||
901 | + * EFI earlycon needs to use early_memremap() to map the framebuffer. | ||
902 | + * But early_memremap() is not usable for 'earlycon=efifb keep_bootcon', | ||
903 | + * memremap() should be used instead. memremap() will be available after | ||
904 | + * paging_init() which is earlier than initcall callbacks. Thus adding this | ||
905 | + * early initcall function early_efi_map_fb() to map the whole EFI framebuffer. | ||
906 | + */ | ||
907 | +static int __init efi_earlycon_remap_fb(void) | ||
908 | +{ | ||
909 | + /* bail if there is no bootconsole or it has been disabled already */ | ||
910 | + if (!earlycon_console || !(earlycon_console->flags & CON_ENABLED)) | ||
911 | + return 0; | ||
912 | + | ||
913 | + if (pgprot_val(fb_prot) == pgprot_val(PAGE_KERNEL)) | ||
914 | + efi_fb = memremap(fb_base, screen_info.lfb_size, MEMREMAP_WB); | ||
915 | + else | ||
916 | + efi_fb = memremap(fb_base, screen_info.lfb_size, MEMREMAP_WC); | ||
917 | + | ||
918 | + return efi_fb ? 0 : -ENOMEM; | ||
919 | +} | ||
920 | +early_initcall(efi_earlycon_remap_fb); | ||
921 | + | ||
922 | +static int __init efi_earlycon_unmap_fb(void) | ||
923 | +{ | ||
924 | + /* unmap the bootconsole fb unless keep_bootcon has left it enabled */ | ||
925 | + if (efi_fb && !(earlycon_console->flags & CON_ENABLED)) | ||
926 | + memunmap(efi_fb); | ||
927 | + return 0; | ||
928 | +} | ||
929 | +late_initcall(efi_earlycon_unmap_fb); | ||
930 | |||
931 | static __ref void *efi_earlycon_map(unsigned long start, unsigned long len) | ||
932 | { | ||
933 | + if (efi_fb) | ||
934 | + return efi_fb + start; | ||
935 | + | ||
936 | return early_memremap_prot(fb_base + start, len, pgprot_val(fb_prot)); | ||
937 | } | ||
938 | |||
939 | static __ref void efi_earlycon_unmap(void *addr, unsigned long len) | ||
940 | { | ||
941 | + if (efi_fb) | ||
942 | + return; | ||
943 | + | ||
944 | early_memunmap(addr, len); | ||
945 | } | ||
946 | |||
947 | @@ -201,6 +240,7 @@ static int __init efi_earlycon_setup(struct earlycon_device *device, | ||
948 | efi_earlycon_scroll_up(); | ||
949 | |||
950 | device->con->write = efi_earlycon_write; | ||
951 | + earlycon_console = device->con; | ||
952 | return 0; | ||
953 | } | ||
954 | EARLYCON_DECLARE(efifb, efi_earlycon_setup); | ||
955 | diff --git a/drivers/firmware/efi/libstub/gop.c b/drivers/firmware/efi/libstub/gop.c | ||
956 | index 0101ca4c13b1..b7bf1e993b8b 100644 | ||
957 | --- a/drivers/firmware/efi/libstub/gop.c | ||
958 | +++ b/drivers/firmware/efi/libstub/gop.c | ||
959 | @@ -83,30 +83,6 @@ setup_pixel_info(struct screen_info *si, u32 pixels_per_scan_line, | ||
960 | } | ||
961 | } | ||
962 | |||
963 | -static efi_status_t | ||
964 | -__gop_query32(efi_system_table_t *sys_table_arg, | ||
965 | - struct efi_graphics_output_protocol_32 *gop32, | ||
966 | - struct efi_graphics_output_mode_info **info, | ||
967 | - unsigned long *size, u64 *fb_base) | ||
968 | -{ | ||
969 | - struct efi_graphics_output_protocol_mode_32 *mode; | ||
970 | - efi_graphics_output_protocol_query_mode query_mode; | ||
971 | - efi_status_t status; | ||
972 | - unsigned long m; | ||
973 | - | ||
974 | - m = gop32->mode; | ||
975 | - mode = (struct efi_graphics_output_protocol_mode_32 *)m; | ||
976 | - query_mode = (void *)(unsigned long)gop32->query_mode; | ||
977 | - | ||
978 | - status = __efi_call_early(query_mode, (void *)gop32, mode->mode, size, | ||
979 | - info); | ||
980 | - if (status != EFI_SUCCESS) | ||
981 | - return status; | ||
982 | - | ||
983 | - *fb_base = mode->frame_buffer_base; | ||
984 | - return status; | ||
985 | -} | ||
986 | - | ||
987 | static efi_status_t | ||
988 | setup_gop32(efi_system_table_t *sys_table_arg, struct screen_info *si, | ||
989 | efi_guid_t *proto, unsigned long size, void **gop_handle) | ||
990 | @@ -119,7 +95,7 @@ setup_gop32(efi_system_table_t *sys_table_arg, struct screen_info *si, | ||
991 | u64 fb_base; | ||
992 | struct efi_pixel_bitmask pixel_info; | ||
993 | int pixel_format; | ||
994 | - efi_status_t status = EFI_NOT_FOUND; | ||
995 | + efi_status_t status; | ||
996 | u32 *handles = (u32 *)(unsigned long)gop_handle; | ||
997 | int i; | ||
998 | |||
999 | @@ -128,6 +104,7 @@ setup_gop32(efi_system_table_t *sys_table_arg, struct screen_info *si, | ||
1000 | |||
1001 | nr_gops = size / sizeof(u32); | ||
1002 | for (i = 0; i < nr_gops; i++) { | ||
1003 | + struct efi_graphics_output_protocol_mode_32 *mode; | ||
1004 | struct efi_graphics_output_mode_info *info = NULL; | ||
1005 | efi_guid_t conout_proto = EFI_CONSOLE_OUT_DEVICE_GUID; | ||
1006 | bool conout_found = false; | ||
1007 | @@ -145,9 +122,11 @@ setup_gop32(efi_system_table_t *sys_table_arg, struct screen_info *si, | ||
1008 | if (status == EFI_SUCCESS) | ||
1009 | conout_found = true; | ||
1010 | |||
1011 | - status = __gop_query32(sys_table_arg, gop32, &info, &size, | ||
1012 | - ¤t_fb_base); | ||
1013 | - if (status == EFI_SUCCESS && (!first_gop || conout_found) && | ||
1014 | + mode = (void *)(unsigned long)gop32->mode; | ||
1015 | + info = (void *)(unsigned long)mode->info; | ||
1016 | + current_fb_base = mode->frame_buffer_base; | ||
1017 | + | ||
1018 | + if ((!first_gop || conout_found) && | ||
1019 | info->pixel_format != PIXEL_BLT_ONLY) { | ||
1020 | /* | ||
1021 | * Systems that use the UEFI Console Splitter may | ||
1022 | @@ -175,7 +154,7 @@ setup_gop32(efi_system_table_t *sys_table_arg, struct screen_info *si, | ||
1023 | |||
1024 | /* Did we find any GOPs? */ | ||
1025 | if (!first_gop) | ||
1026 | - goto out; | ||
1027 | + return EFI_NOT_FOUND; | ||
1028 | |||
1029 | /* EFI framebuffer */ | ||
1030 | si->orig_video_isVGA = VIDEO_TYPE_EFI; | ||
1031 | @@ -197,32 +176,8 @@ setup_gop32(efi_system_table_t *sys_table_arg, struct screen_info *si, | ||
1032 | si->lfb_size = si->lfb_linelength * si->lfb_height; | ||
1033 | |||
1034 | si->capabilities |= VIDEO_CAPABILITY_SKIP_QUIRKS; | ||
1035 | -out: | ||
1036 | - return status; | ||
1037 | -} | ||
1038 | - | ||
1039 | -static efi_status_t | ||
1040 | -__gop_query64(efi_system_table_t *sys_table_arg, | ||
1041 | - struct efi_graphics_output_protocol_64 *gop64, | ||
1042 | - struct efi_graphics_output_mode_info **info, | ||
1043 | - unsigned long *size, u64 *fb_base) | ||
1044 | -{ | ||
1045 | - struct efi_graphics_output_protocol_mode_64 *mode; | ||
1046 | - efi_graphics_output_protocol_query_mode query_mode; | ||
1047 | - efi_status_t status; | ||
1048 | - unsigned long m; | ||
1049 | - | ||
1050 | - m = gop64->mode; | ||
1051 | - mode = (struct efi_graphics_output_protocol_mode_64 *)m; | ||
1052 | - query_mode = (void *)(unsigned long)gop64->query_mode; | ||
1053 | - | ||
1054 | - status = __efi_call_early(query_mode, (void *)gop64, mode->mode, size, | ||
1055 | - info); | ||
1056 | - if (status != EFI_SUCCESS) | ||
1057 | - return status; | ||
1058 | |||
1059 | - *fb_base = mode->frame_buffer_base; | ||
1060 | - return status; | ||
1061 | + return EFI_SUCCESS; | ||
1062 | } | ||
1063 | |||
1064 | static efi_status_t | ||
1065 | @@ -237,7 +192,7 @@ setup_gop64(efi_system_table_t *sys_table_arg, struct screen_info *si, | ||
1066 | u64 fb_base; | ||
1067 | struct efi_pixel_bitmask pixel_info; | ||
1068 | int pixel_format; | ||
1069 | - efi_status_t status = EFI_NOT_FOUND; | ||
1070 | + efi_status_t status; | ||
1071 | u64 *handles = (u64 *)(unsigned long)gop_handle; | ||
1072 | int i; | ||
1073 | |||
1074 | @@ -246,6 +201,7 @@ setup_gop64(efi_system_table_t *sys_table_arg, struct screen_info *si, | ||
1075 | |||
1076 | nr_gops = size / sizeof(u64); | ||
1077 | for (i = 0; i < nr_gops; i++) { | ||
1078 | + struct efi_graphics_output_protocol_mode_64 *mode; | ||
1079 | struct efi_graphics_output_mode_info *info = NULL; | ||
1080 | efi_guid_t conout_proto = EFI_CONSOLE_OUT_DEVICE_GUID; | ||
1081 | bool conout_found = false; | ||
1082 | @@ -263,9 +219,11 @@ setup_gop64(efi_system_table_t *sys_table_arg, struct screen_info *si, | ||
1083 | if (status == EFI_SUCCESS) | ||
1084 | conout_found = true; | ||
1085 | |||
1086 | - status = __gop_query64(sys_table_arg, gop64, &info, &size, | ||
1087 | - ¤t_fb_base); | ||
1088 | - if (status == EFI_SUCCESS && (!first_gop || conout_found) && | ||
1089 | + mode = (void *)(unsigned long)gop64->mode; | ||
1090 | + info = (void *)(unsigned long)mode->info; | ||
1091 | + current_fb_base = mode->frame_buffer_base; | ||
1092 | + | ||
1093 | + if ((!first_gop || conout_found) && | ||
1094 | info->pixel_format != PIXEL_BLT_ONLY) { | ||
1095 | /* | ||
1096 | * Systems that use the UEFI Console Splitter may | ||
1097 | @@ -293,7 +251,7 @@ setup_gop64(efi_system_table_t *sys_table_arg, struct screen_info *si, | ||
1098 | |||
1099 | /* Did we find any GOPs? */ | ||
1100 | if (!first_gop) | ||
1101 | - goto out; | ||
1102 | + return EFI_NOT_FOUND; | ||
1103 | |||
1104 | /* EFI framebuffer */ | ||
1105 | si->orig_video_isVGA = VIDEO_TYPE_EFI; | ||
1106 | @@ -315,8 +273,8 @@ setup_gop64(efi_system_table_t *sys_table_arg, struct screen_info *si, | ||
1107 | si->lfb_size = si->lfb_linelength * si->lfb_height; | ||
1108 | |||
1109 | si->capabilities |= VIDEO_CAPABILITY_SKIP_QUIRKS; | ||
1110 | -out: | ||
1111 | - return status; | ||
1112 | + | ||
1113 | + return EFI_SUCCESS; | ||
1114 | } | ||
1115 | |||
1116 | /* | ||
1117 | diff --git a/drivers/gpio/gpiolib-of.c b/drivers/gpio/gpiolib-of.c | ||
1118 | index 80ea49f570f4..43ffec3a6fbb 100644 | ||
1119 | --- a/drivers/gpio/gpiolib-of.c | ||
1120 | +++ b/drivers/gpio/gpiolib-of.c | ||
1121 | @@ -23,6 +23,29 @@ | ||
1122 | #include "gpiolib.h" | ||
1123 | #include "gpiolib-of.h" | ||
1124 | |||
1125 | +/** | ||
1126 | + * of_gpio_spi_cs_get_count() - special GPIO counting for SPI | ||
1127 | + * Some elder GPIO controllers need special quirks. Currently we handle | ||
1128 | + * the Freescale GPIO controller with bindings that doesn't use the | ||
1129 | + * established "cs-gpios" for chip selects but instead rely on | ||
1130 | + * "gpios" for the chip select lines. If we detect this, we redirect | ||
1131 | + * the counting of "cs-gpios" to count "gpios" transparent to the | ||
1132 | + * driver. | ||
1133 | + */ | ||
1134 | +int of_gpio_spi_cs_get_count(struct device *dev, const char *con_id) | ||
1135 | +{ | ||
1136 | + struct device_node *np = dev->of_node; | ||
1137 | + | ||
1138 | + if (!IS_ENABLED(CONFIG_SPI_MASTER)) | ||
1139 | + return 0; | ||
1140 | + if (!con_id || strcmp(con_id, "cs")) | ||
1141 | + return 0; | ||
1142 | + if (!of_device_is_compatible(np, "fsl,spi") && | ||
1143 | + !of_device_is_compatible(np, "aeroflexgaisler,spictrl")) | ||
1144 | + return 0; | ||
1145 | + return of_gpio_named_count(np, "gpios"); | ||
1146 | +} | ||
1147 | + | ||
1148 | /* | ||
1149 | * This is used by external users of of_gpio_count() from <linux/of_gpio.h> | ||
1150 | * | ||
1151 | @@ -35,6 +58,10 @@ int of_gpio_get_count(struct device *dev, const char *con_id) | ||
1152 | char propname[32]; | ||
1153 | unsigned int i; | ||
1154 | |||
1155 | + ret = of_gpio_spi_cs_get_count(dev, con_id); | ||
1156 | + if (ret > 0) | ||
1157 | + return ret; | ||
1158 | + | ||
1159 | for (i = 0; i < ARRAY_SIZE(gpio_suffixes); i++) { | ||
1160 | if (con_id) | ||
1161 | snprintf(propname, sizeof(propname), "%s-%s", | ||
1162 | diff --git a/drivers/gpu/drm/exynos/exynos_drm_gsc.c b/drivers/gpu/drm/exynos/exynos_drm_gsc.c | ||
1163 | index 7ae087b0504d..88b6fcaa20be 100644 | ||
1164 | --- a/drivers/gpu/drm/exynos/exynos_drm_gsc.c | ||
1165 | +++ b/drivers/gpu/drm/exynos/exynos_drm_gsc.c | ||
1166 | @@ -1313,6 +1313,7 @@ static int gsc_remove(struct platform_device *pdev) | ||
1167 | { | ||
1168 | struct device *dev = &pdev->dev; | ||
1169 | |||
1170 | + component_del(dev, &gsc_component_ops); | ||
1171 | pm_runtime_dont_use_autosuspend(dev); | ||
1172 | pm_runtime_disable(dev); | ||
1173 | |||
1174 | diff --git a/drivers/iommu/dma-iommu.c b/drivers/iommu/dma-iommu.c | ||
1175 | index f321279baf9e..51456e7f264f 100644 | ||
1176 | --- a/drivers/iommu/dma-iommu.c | ||
1177 | +++ b/drivers/iommu/dma-iommu.c | ||
1178 | @@ -19,6 +19,7 @@ | ||
1179 | #include <linux/iova.h> | ||
1180 | #include <linux/irq.h> | ||
1181 | #include <linux/mm.h> | ||
1182 | +#include <linux/mutex.h> | ||
1183 | #include <linux/pci.h> | ||
1184 | #include <linux/scatterlist.h> | ||
1185 | #include <linux/vmalloc.h> | ||
1186 | @@ -43,7 +44,6 @@ struct iommu_dma_cookie { | ||
1187 | dma_addr_t msi_iova; | ||
1188 | }; | ||
1189 | struct list_head msi_page_list; | ||
1190 | - spinlock_t msi_lock; | ||
1191 | |||
1192 | /* Domain for flush queue callback; NULL if flush queue not in use */ | ||
1193 | struct iommu_domain *fq_domain; | ||
1194 | @@ -62,7 +62,6 @@ static struct iommu_dma_cookie *cookie_alloc(enum iommu_dma_cookie_type type) | ||
1195 | |||
1196 | cookie = kzalloc(sizeof(*cookie), GFP_KERNEL); | ||
1197 | if (cookie) { | ||
1198 | - spin_lock_init(&cookie->msi_lock); | ||
1199 | INIT_LIST_HEAD(&cookie->msi_page_list); | ||
1200 | cookie->type = type; | ||
1201 | } | ||
1202 | @@ -1150,7 +1149,7 @@ static struct iommu_dma_msi_page *iommu_dma_get_msi_page(struct device *dev, | ||
1203 | if (msi_page->phys == msi_addr) | ||
1204 | return msi_page; | ||
1205 | |||
1206 | - msi_page = kzalloc(sizeof(*msi_page), GFP_ATOMIC); | ||
1207 | + msi_page = kzalloc(sizeof(*msi_page), GFP_KERNEL); | ||
1208 | if (!msi_page) | ||
1209 | return NULL; | ||
1210 | |||
1211 | @@ -1180,7 +1179,7 @@ int iommu_dma_prepare_msi(struct msi_desc *desc, phys_addr_t msi_addr) | ||
1212 | struct iommu_domain *domain = iommu_get_domain_for_dev(dev); | ||
1213 | struct iommu_dma_cookie *cookie; | ||
1214 | struct iommu_dma_msi_page *msi_page; | ||
1215 | - unsigned long flags; | ||
1216 | + static DEFINE_MUTEX(msi_prepare_lock); /* see below */ | ||
1217 | |||
1218 | if (!domain || !domain->iova_cookie) { | ||
1219 | desc->iommu_cookie = NULL; | ||
1220 | @@ -1190,13 +1189,13 @@ int iommu_dma_prepare_msi(struct msi_desc *desc, phys_addr_t msi_addr) | ||
1221 | cookie = domain->iova_cookie; | ||
1222 | |||
1223 | /* | ||
1224 | - * We disable IRQs to rule out a possible inversion against | ||
1225 | - * irq_desc_lock if, say, someone tries to retarget the affinity | ||
1226 | - * of an MSI from within an IPI handler. | ||
1227 | + * In fact the whole prepare operation should already be serialised by | ||
1228 | + * irq_domain_mutex further up the callchain, but that's pretty subtle | ||
1229 | + * on its own, so consider this locking as failsafe documentation... | ||
1230 | */ | ||
1231 | - spin_lock_irqsave(&cookie->msi_lock, flags); | ||
1232 | + mutex_lock(&msi_prepare_lock); | ||
1233 | msi_page = iommu_dma_get_msi_page(dev, msi_addr, domain); | ||
1234 | - spin_unlock_irqrestore(&cookie->msi_lock, flags); | ||
1235 | + mutex_unlock(&msi_prepare_lock); | ||
1236 | |||
1237 | msi_desc_set_iommu_cookie(desc, msi_page); | ||
1238 | |||
1239 | diff --git a/drivers/iommu/iova.c b/drivers/iommu/iova.c | ||
1240 | index 41c605b0058f..c7a914b9bbbc 100644 | ||
1241 | --- a/drivers/iommu/iova.c | ||
1242 | +++ b/drivers/iommu/iova.c | ||
1243 | @@ -233,7 +233,7 @@ static DEFINE_MUTEX(iova_cache_mutex); | ||
1244 | |||
1245 | struct iova *alloc_iova_mem(void) | ||
1246 | { | ||
1247 | - return kmem_cache_alloc(iova_cache, GFP_ATOMIC); | ||
1248 | + return kmem_cache_zalloc(iova_cache, GFP_ATOMIC); | ||
1249 | } | ||
1250 | EXPORT_SYMBOL(alloc_iova_mem); | ||
1251 | |||
1252 | diff --git a/drivers/misc/habanalabs/command_submission.c b/drivers/misc/habanalabs/command_submission.c | ||
1253 | index a9ac045dcfde..447f307ef4d6 100644 | ||
1254 | --- a/drivers/misc/habanalabs/command_submission.c | ||
1255 | +++ b/drivers/misc/habanalabs/command_submission.c | ||
1256 | @@ -777,8 +777,9 @@ int hl_cs_wait_ioctl(struct hl_fpriv *hpriv, void *data) | ||
1257 | memset(args, 0, sizeof(*args)); | ||
1258 | |||
1259 | if (rc < 0) { | ||
1260 | - dev_err(hdev->dev, "Error %ld on waiting for CS handle %llu\n", | ||
1261 | - rc, seq); | ||
1262 | + dev_err_ratelimited(hdev->dev, | ||
1263 | + "Error %ld on waiting for CS handle %llu\n", | ||
1264 | + rc, seq); | ||
1265 | if (rc == -ERESTARTSYS) { | ||
1266 | args->out.status = HL_WAIT_CS_STATUS_INTERRUPTED; | ||
1267 | rc = -EINTR; | ||
1268 | diff --git a/drivers/misc/habanalabs/context.c b/drivers/misc/habanalabs/context.c | ||
1269 | index 17db7b3dfb4c..2df6fb87e7ff 100644 | ||
1270 | --- a/drivers/misc/habanalabs/context.c | ||
1271 | +++ b/drivers/misc/habanalabs/context.c | ||
1272 | @@ -176,7 +176,7 @@ struct dma_fence *hl_ctx_get_fence(struct hl_ctx *ctx, u64 seq) | ||
1273 | spin_lock(&ctx->cs_lock); | ||
1274 | |||
1275 | if (seq >= ctx->cs_sequence) { | ||
1276 | - dev_notice(hdev->dev, | ||
1277 | + dev_notice_ratelimited(hdev->dev, | ||
1278 | "Can't wait on seq %llu because current CS is at seq %llu\n", | ||
1279 | seq, ctx->cs_sequence); | ||
1280 | spin_unlock(&ctx->cs_lock); | ||
1281 | diff --git a/drivers/misc/habanalabs/goya/goya.c b/drivers/misc/habanalabs/goya/goya.c | ||
1282 | index 6fba14b81f90..fe3574a83b7c 100644 | ||
1283 | --- a/drivers/misc/habanalabs/goya/goya.c | ||
1284 | +++ b/drivers/misc/habanalabs/goya/goya.c | ||
1285 | @@ -2171,7 +2171,7 @@ static int goya_push_linux_to_device(struct hl_device *hdev) | ||
1286 | |||
1287 | static int goya_pldm_init_cpu(struct hl_device *hdev) | ||
1288 | { | ||
1289 | - u32 val, unit_rst_val; | ||
1290 | + u32 unit_rst_val; | ||
1291 | int rc; | ||
1292 | |||
1293 | /* Must initialize SRAM scrambler before pushing u-boot to SRAM */ | ||
1294 | @@ -2179,14 +2179,14 @@ static int goya_pldm_init_cpu(struct hl_device *hdev) | ||
1295 | |||
1296 | /* Put ARM cores into reset */ | ||
1297 | WREG32(mmCPU_CA53_CFG_ARM_RST_CONTROL, CPU_RESET_ASSERT); | ||
1298 | - val = RREG32(mmCPU_CA53_CFG_ARM_RST_CONTROL); | ||
1299 | + RREG32(mmCPU_CA53_CFG_ARM_RST_CONTROL); | ||
1300 | |||
1301 | /* Reset the CA53 MACRO */ | ||
1302 | unit_rst_val = RREG32(mmPSOC_GLOBAL_CONF_UNIT_RST_N); | ||
1303 | WREG32(mmPSOC_GLOBAL_CONF_UNIT_RST_N, CA53_RESET); | ||
1304 | - val = RREG32(mmPSOC_GLOBAL_CONF_UNIT_RST_N); | ||
1305 | + RREG32(mmPSOC_GLOBAL_CONF_UNIT_RST_N); | ||
1306 | WREG32(mmPSOC_GLOBAL_CONF_UNIT_RST_N, unit_rst_val); | ||
1307 | - val = RREG32(mmPSOC_GLOBAL_CONF_UNIT_RST_N); | ||
1308 | + RREG32(mmPSOC_GLOBAL_CONF_UNIT_RST_N); | ||
1309 | |||
1310 | rc = goya_push_uboot_to_device(hdev); | ||
1311 | if (rc) | ||
1312 | @@ -2207,7 +2207,7 @@ static int goya_pldm_init_cpu(struct hl_device *hdev) | ||
1313 | /* Release ARM core 0 from reset */ | ||
1314 | WREG32(mmCPU_CA53_CFG_ARM_RST_CONTROL, | ||
1315 | CPU_RESET_CORE0_DEASSERT); | ||
1316 | - val = RREG32(mmCPU_CA53_CFG_ARM_RST_CONTROL); | ||
1317 | + RREG32(mmCPU_CA53_CFG_ARM_RST_CONTROL); | ||
1318 | |||
1319 | return 0; | ||
1320 | } | ||
1321 | @@ -2475,13 +2475,12 @@ err: | ||
1322 | static int goya_hw_init(struct hl_device *hdev) | ||
1323 | { | ||
1324 | struct asic_fixed_properties *prop = &hdev->asic_prop; | ||
1325 | - u32 val; | ||
1326 | int rc; | ||
1327 | |||
1328 | dev_info(hdev->dev, "Starting initialization of H/W\n"); | ||
1329 | |||
1330 | /* Perform read from the device to make sure device is up */ | ||
1331 | - val = RREG32(mmPCIE_DBI_DEVICE_ID_VENDOR_ID_REG); | ||
1332 | + RREG32(mmPCIE_DBI_DEVICE_ID_VENDOR_ID_REG); | ||
1333 | |||
1334 | /* | ||
1335 | * Let's mark in the H/W that we have reached this point. We check | ||
1336 | @@ -2533,7 +2532,7 @@ static int goya_hw_init(struct hl_device *hdev) | ||
1337 | goto disable_queues; | ||
1338 | |||
1339 | /* Perform read from the device to flush all MSI-X configuration */ | ||
1340 | - val = RREG32(mmPCIE_DBI_DEVICE_ID_VENDOR_ID_REG); | ||
1341 | + RREG32(mmPCIE_DBI_DEVICE_ID_VENDOR_ID_REG); | ||
1342 | |||
1343 | return 0; | ||
1344 | |||
1345 | diff --git a/drivers/misc/ocxl/context.c b/drivers/misc/ocxl/context.c | ||
1346 | index 994563a078eb..de8a66b9d76b 100644 | ||
1347 | --- a/drivers/misc/ocxl/context.c | ||
1348 | +++ b/drivers/misc/ocxl/context.c | ||
1349 | @@ -10,18 +10,17 @@ int ocxl_context_alloc(struct ocxl_context **context, struct ocxl_afu *afu, | ||
1350 | int pasid; | ||
1351 | struct ocxl_context *ctx; | ||
1352 | |||
1353 | - *context = kzalloc(sizeof(struct ocxl_context), GFP_KERNEL); | ||
1354 | - if (!*context) | ||
1355 | + ctx = kzalloc(sizeof(*ctx), GFP_KERNEL); | ||
1356 | + if (!ctx) | ||
1357 | return -ENOMEM; | ||
1358 | |||
1359 | - ctx = *context; | ||
1360 | - | ||
1361 | ctx->afu = afu; | ||
1362 | mutex_lock(&afu->contexts_lock); | ||
1363 | pasid = idr_alloc(&afu->contexts_idr, ctx, afu->pasid_base, | ||
1364 | afu->pasid_base + afu->pasid_max, GFP_KERNEL); | ||
1365 | if (pasid < 0) { | ||
1366 | mutex_unlock(&afu->contexts_lock); | ||
1367 | + kfree(ctx); | ||
1368 | return pasid; | ||
1369 | } | ||
1370 | afu->pasid_count++; | ||
1371 | @@ -43,6 +42,7 @@ int ocxl_context_alloc(struct ocxl_context **context, struct ocxl_afu *afu, | ||
1372 | * duration of the life of the context | ||
1373 | */ | ||
1374 | ocxl_afu_get(afu); | ||
1375 | + *context = ctx; | ||
1376 | return 0; | ||
1377 | } | ||
1378 | EXPORT_SYMBOL_GPL(ocxl_context_alloc); | ||
1379 | diff --git a/drivers/net/dsa/mv88e6xxx/global1.c b/drivers/net/dsa/mv88e6xxx/global1.c | ||
1380 | index 25ec4c0ac589..8a903624fdd7 100644 | ||
1381 | --- a/drivers/net/dsa/mv88e6xxx/global1.c | ||
1382 | +++ b/drivers/net/dsa/mv88e6xxx/global1.c | ||
1383 | @@ -332,6 +332,11 @@ int mv88e6390_g1_set_cpu_port(struct mv88e6xxx_chip *chip, int port) | ||
1384 | { | ||
1385 | u16 ptr = MV88E6390_G1_MONITOR_MGMT_CTL_PTR_CPU_DEST; | ||
1386 | |||
1387 | + /* Use the default high priority for management frames sent to | ||
1388 | + * the CPU. | ||
1389 | + */ | ||
1390 | + port |= MV88E6390_G1_MONITOR_MGMT_CTL_PTR_CPU_DEST_MGMTPRI; | ||
1391 | + | ||
1392 | return mv88e6390_g1_monitor_write(chip, ptr, port); | ||
1393 | } | ||
1394 | |||
1395 | diff --git a/drivers/net/dsa/mv88e6xxx/global1.h b/drivers/net/dsa/mv88e6xxx/global1.h | ||
1396 | index 0870fcc8bfc8..0ae96a1e919b 100644 | ||
1397 | --- a/drivers/net/dsa/mv88e6xxx/global1.h | ||
1398 | +++ b/drivers/net/dsa/mv88e6xxx/global1.h | ||
1399 | @@ -210,6 +210,7 @@ | ||
1400 | #define MV88E6390_G1_MONITOR_MGMT_CTL_PTR_INGRESS_DEST 0x2000 | ||
1401 | #define MV88E6390_G1_MONITOR_MGMT_CTL_PTR_EGRESS_DEST 0x2100 | ||
1402 | #define MV88E6390_G1_MONITOR_MGMT_CTL_PTR_CPU_DEST 0x3000 | ||
1403 | +#define MV88E6390_G1_MONITOR_MGMT_CTL_PTR_CPU_DEST_MGMTPRI 0x00e0 | ||
1404 | #define MV88E6390_G1_MONITOR_MGMT_CTL_DATA_MASK 0x00ff | ||
1405 | |||
1406 | /* Offset 0x1C: Global Control 2 */ | ||
1407 | diff --git a/drivers/net/dsa/mv88e6xxx/port.c b/drivers/net/dsa/mv88e6xxx/port.c | ||
1408 | index 15ef81654b67..330c41e87171 100644 | ||
1409 | --- a/drivers/net/dsa/mv88e6xxx/port.c | ||
1410 | +++ b/drivers/net/dsa/mv88e6xxx/port.c | ||
1411 | @@ -393,7 +393,7 @@ phy_interface_t mv88e6390x_port_max_speed_mode(int port) | ||
1412 | } | ||
1413 | |||
1414 | static int mv88e6xxx_port_set_cmode(struct mv88e6xxx_chip *chip, int port, | ||
1415 | - phy_interface_t mode) | ||
1416 | + phy_interface_t mode, bool force) | ||
1417 | { | ||
1418 | u8 lane; | ||
1419 | u16 cmode; | ||
1420 | @@ -427,8 +427,8 @@ static int mv88e6xxx_port_set_cmode(struct mv88e6xxx_chip *chip, int port, | ||
1421 | cmode = 0; | ||
1422 | } | ||
1423 | |||
1424 | - /* cmode doesn't change, nothing to do for us */ | ||
1425 | - if (cmode == chip->ports[port].cmode) | ||
1426 | + /* cmode doesn't change, nothing to do for us unless forced */ | ||
1427 | + if (cmode == chip->ports[port].cmode && !force) | ||
1428 | return 0; | ||
1429 | |||
1430 | lane = mv88e6xxx_serdes_get_lane(chip, port); | ||
1431 | @@ -484,7 +484,7 @@ int mv88e6390x_port_set_cmode(struct mv88e6xxx_chip *chip, int port, | ||
1432 | if (port != 9 && port != 10) | ||
1433 | return -EOPNOTSUPP; | ||
1434 | |||
1435 | - return mv88e6xxx_port_set_cmode(chip, port, mode); | ||
1436 | + return mv88e6xxx_port_set_cmode(chip, port, mode, false); | ||
1437 | } | ||
1438 | |||
1439 | int mv88e6390_port_set_cmode(struct mv88e6xxx_chip *chip, int port, | ||
1440 | @@ -504,7 +504,7 @@ int mv88e6390_port_set_cmode(struct mv88e6xxx_chip *chip, int port, | ||
1441 | break; | ||
1442 | } | ||
1443 | |||
1444 | - return mv88e6xxx_port_set_cmode(chip, port, mode); | ||
1445 | + return mv88e6xxx_port_set_cmode(chip, port, mode, false); | ||
1446 | } | ||
1447 | |||
1448 | static int mv88e6341_port_set_cmode_writable(struct mv88e6xxx_chip *chip, | ||
1449 | @@ -555,7 +555,7 @@ int mv88e6341_port_set_cmode(struct mv88e6xxx_chip *chip, int port, | ||
1450 | if (err) | ||
1451 | return err; | ||
1452 | |||
1453 | - return mv88e6xxx_port_set_cmode(chip, port, mode); | ||
1454 | + return mv88e6xxx_port_set_cmode(chip, port, mode, true); | ||
1455 | } | ||
1456 | |||
1457 | int mv88e6185_port_get_cmode(struct mv88e6xxx_chip *chip, int port, u8 *cmode) | ||
1458 | diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h | ||
1459 | index 8b08cb18e363..3f63ffd7561b 100644 | ||
1460 | --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h | ||
1461 | +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h | ||
1462 | @@ -1109,7 +1109,7 @@ static inline u8 bnx2x_get_path_func_num(struct bnx2x *bp) | ||
1463 | for (i = 0; i < E1H_FUNC_MAX / 2; i++) { | ||
1464 | u32 func_config = | ||
1465 | MF_CFG_RD(bp, | ||
1466 | - func_mf_config[BP_PORT(bp) + 2 * i]. | ||
1467 | + func_mf_config[BP_PATH(bp) + 2 * i]. | ||
1468 | config); | ||
1469 | func_num += | ||
1470 | ((func_config & FUNC_MF_CFG_FUNC_HIDE) ? 0 : 1); | ||
1471 | diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c | ||
1472 | index 192ff8d5da32..cff64e43bdd8 100644 | ||
1473 | --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c | ||
1474 | +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c | ||
1475 | @@ -9976,10 +9976,18 @@ static void bnx2x_recovery_failed(struct bnx2x *bp) | ||
1476 | */ | ||
1477 | static void bnx2x_parity_recover(struct bnx2x *bp) | ||
1478 | { | ||
1479 | - bool global = false; | ||
1480 | u32 error_recovered, error_unrecovered; | ||
1481 | - bool is_parity; | ||
1482 | + bool is_parity, global = false; | ||
1483 | +#ifdef CONFIG_BNX2X_SRIOV | ||
1484 | + int vf_idx; | ||
1485 | + | ||
1486 | + for (vf_idx = 0; vf_idx < bp->requested_nr_virtfn; vf_idx++) { | ||
1487 | + struct bnx2x_virtf *vf = BP_VF(bp, vf_idx); | ||
1488 | |||
1489 | + if (vf) | ||
1490 | + vf->state = VF_LOST; | ||
1491 | + } | ||
1492 | +#endif | ||
1493 | DP(NETIF_MSG_HW, "Handling parity\n"); | ||
1494 | while (1) { | ||
1495 | switch (bp->recovery_state) { | ||
1496 | diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.h | ||
1497 | index b6ebd92ec565..3a716c015415 100644 | ||
1498 | --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.h | ||
1499 | +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.h | ||
1500 | @@ -139,6 +139,7 @@ struct bnx2x_virtf { | ||
1501 | #define VF_ACQUIRED 1 /* VF acquired, but not initialized */ | ||
1502 | #define VF_ENABLED 2 /* VF Enabled */ | ||
1503 | #define VF_RESET 3 /* VF FLR'd, pending cleanup */ | ||
1504 | +#define VF_LOST 4 /* Recovery while VFs are loaded */ | ||
1505 | |||
1506 | bool flr_clnup_stage; /* true during flr cleanup */ | ||
1507 | bool malicious; /* true if FW indicated so, until FLR */ | ||
1508 | diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_vfpf.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_vfpf.c | ||
1509 | index 0752b7fa4d9c..ea0e9394f898 100644 | ||
1510 | --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_vfpf.c | ||
1511 | +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_vfpf.c | ||
1512 | @@ -2107,6 +2107,18 @@ static void bnx2x_vf_mbx_request(struct bnx2x *bp, struct bnx2x_virtf *vf, | ||
1513 | { | ||
1514 | int i; | ||
1515 | |||
1516 | + if (vf->state == VF_LOST) { | ||
1517 | + /* Just ack the FW and return if VFs are lost | ||
1518 | + * in case of parity error. VFs are supposed to be timedout | ||
1519 | + * on waiting for PF response. | ||
1520 | + */ | ||
1521 | + DP(BNX2X_MSG_IOV, | ||
1522 | + "VF 0x%x lost, not handling the request\n", vf->abs_vfid); | ||
1523 | + | ||
1524 | + storm_memset_vf_mbx_ack(bp, vf->abs_vfid); | ||
1525 | + return; | ||
1526 | + } | ||
1527 | + | ||
1528 | /* check if tlv type is known */ | ||
1529 | if (bnx2x_tlv_supported(mbx->first_tlv.tl.type)) { | ||
1530 | /* Lock the per vf op mutex and note the locker's identity. | ||
1531 | diff --git a/drivers/net/ethernet/cadence/macb_main.c b/drivers/net/ethernet/cadence/macb_main.c | ||
1532 | index 0f10a272827c..f496b248bda3 100644 | ||
1533 | --- a/drivers/net/ethernet/cadence/macb_main.c | ||
1534 | +++ b/drivers/net/ethernet/cadence/macb_main.c | ||
1535 | @@ -4027,7 +4027,7 @@ static int fu540_c000_clk_init(struct platform_device *pdev, struct clk **pclk, | ||
1536 | mgmt->rate = 0; | ||
1537 | mgmt->hw.init = &init; | ||
1538 | |||
1539 | - *tx_clk = clk_register(NULL, &mgmt->hw); | ||
1540 | + *tx_clk = devm_clk_register(&pdev->dev, &mgmt->hw); | ||
1541 | if (IS_ERR(*tx_clk)) | ||
1542 | return PTR_ERR(*tx_clk); | ||
1543 | |||
1544 | @@ -4361,7 +4361,6 @@ err_out_free_netdev: | ||
1545 | |||
1546 | err_disable_clocks: | ||
1547 | clk_disable_unprepare(tx_clk); | ||
1548 | - clk_unregister(tx_clk); | ||
1549 | clk_disable_unprepare(hclk); | ||
1550 | clk_disable_unprepare(pclk); | ||
1551 | clk_disable_unprepare(rx_clk); | ||
1552 | @@ -4397,7 +4396,6 @@ static int macb_remove(struct platform_device *pdev) | ||
1553 | pm_runtime_dont_use_autosuspend(&pdev->dev); | ||
1554 | if (!pm_runtime_suspended(&pdev->dev)) { | ||
1555 | clk_disable_unprepare(bp->tx_clk); | ||
1556 | - clk_unregister(bp->tx_clk); | ||
1557 | clk_disable_unprepare(bp->hclk); | ||
1558 | clk_disable_unprepare(bp->pclk); | ||
1559 | clk_disable_unprepare(bp->rx_clk); | ||
1560 | diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c | ||
1561 | index ae6a47dd7dc9..fb8ade9a05a9 100644 | ||
1562 | --- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c | ||
1563 | +++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c | ||
1564 | @@ -2996,6 +2996,9 @@ static int sge_queue_entries(const struct adapter *adap) | ||
1565 | int tot_uld_entries = 0; | ||
1566 | int i; | ||
1567 | |||
1568 | + if (!is_uld(adap)) | ||
1569 | + goto lld_only; | ||
1570 | + | ||
1571 | mutex_lock(&uld_mutex); | ||
1572 | for (i = 0; i < CXGB4_TX_MAX; i++) | ||
1573 | tot_uld_entries += sge_qinfo_uld_txq_entries(adap, i); | ||
1574 | @@ -3006,6 +3009,7 @@ static int sge_queue_entries(const struct adapter *adap) | ||
1575 | } | ||
1576 | mutex_unlock(&uld_mutex); | ||
1577 | |||
1578 | +lld_only: | ||
1579 | return DIV_ROUND_UP(adap->sge.ethqsets, 4) + | ||
1580 | tot_uld_entries + | ||
1581 | DIV_ROUND_UP(MAX_CTRL_QUEUES, 4) + 1; | ||
1582 | diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c | ||
1583 | index 4bb30761abfc..8336f4cbaf95 100644 | ||
1584 | --- a/drivers/net/ethernet/freescale/fec_main.c | ||
1585 | +++ b/drivers/net/ethernet/freescale/fec_main.c | ||
1586 | @@ -2199,8 +2199,14 @@ static void fec_enet_get_regs(struct net_device *ndev, | ||
1587 | { | ||
1588 | struct fec_enet_private *fep = netdev_priv(ndev); | ||
1589 | u32 __iomem *theregs = (u32 __iomem *)fep->hwp; | ||
1590 | + struct device *dev = &fep->pdev->dev; | ||
1591 | u32 *buf = (u32 *)regbuf; | ||
1592 | u32 i, off; | ||
1593 | + int ret; | ||
1594 | + | ||
1595 | + ret = pm_runtime_get_sync(dev); | ||
1596 | + if (ret < 0) | ||
1597 | + return; | ||
1598 | |||
1599 | regs->version = fec_enet_register_version; | ||
1600 | |||
1601 | @@ -2216,6 +2222,9 @@ static void fec_enet_get_regs(struct net_device *ndev, | ||
1602 | off >>= 2; | ||
1603 | buf[off] = readl(&theregs[off]); | ||
1604 | } | ||
1605 | + | ||
1606 | + pm_runtime_mark_last_busy(dev); | ||
1607 | + pm_runtime_put_autosuspend(dev); | ||
1608 | } | ||
1609 | |||
1610 | static int fec_enet_get_ts_info(struct net_device *ndev, | ||
1611 | diff --git a/drivers/net/ethernet/intel/i40e/i40e.h b/drivers/net/ethernet/intel/i40e/i40e.h | ||
1612 | index 2af9f6308f84..401304d4d553 100644 | ||
1613 | --- a/drivers/net/ethernet/intel/i40e/i40e.h | ||
1614 | +++ b/drivers/net/ethernet/intel/i40e/i40e.h | ||
1615 | @@ -1151,7 +1151,7 @@ void i40e_set_fec_in_flags(u8 fec_cfg, u32 *flags); | ||
1616 | |||
1617 | static inline bool i40e_enabled_xdp_vsi(struct i40e_vsi *vsi) | ||
1618 | { | ||
1619 | - return !!vsi->xdp_prog; | ||
1620 | + return !!READ_ONCE(vsi->xdp_prog); | ||
1621 | } | ||
1622 | |||
1623 | int i40e_create_queue_channel(struct i40e_vsi *vsi, struct i40e_channel *ch); | ||
1624 | diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c | ||
1625 | index 339925af0206..4960c9c3e773 100644 | ||
1626 | --- a/drivers/net/ethernet/intel/i40e/i40e_main.c | ||
1627 | +++ b/drivers/net/ethernet/intel/i40e/i40e_main.c | ||
1628 | @@ -6804,8 +6804,8 @@ void i40e_down(struct i40e_vsi *vsi) | ||
1629 | for (i = 0; i < vsi->num_queue_pairs; i++) { | ||
1630 | i40e_clean_tx_ring(vsi->tx_rings[i]); | ||
1631 | if (i40e_enabled_xdp_vsi(vsi)) { | ||
1632 | - /* Make sure that in-progress ndo_xdp_xmit | ||
1633 | - * calls are completed. | ||
1634 | + /* Make sure that in-progress ndo_xdp_xmit and | ||
1635 | + * ndo_xsk_wakeup calls are completed. | ||
1636 | */ | ||
1637 | synchronize_rcu(); | ||
1638 | i40e_clean_tx_ring(vsi->xdp_rings[i]); | ||
1639 | @@ -12526,8 +12526,12 @@ static int i40e_xdp_setup(struct i40e_vsi *vsi, | ||
1640 | |||
1641 | old_prog = xchg(&vsi->xdp_prog, prog); | ||
1642 | |||
1643 | - if (need_reset) | ||
1644 | + if (need_reset) { | ||
1645 | + if (!prog) | ||
1646 | + /* Wait until ndo_xsk_wakeup completes. */ | ||
1647 | + synchronize_rcu(); | ||
1648 | i40e_reset_and_rebuild(pf, true, true); | ||
1649 | + } | ||
1650 | |||
1651 | for (i = 0; i < vsi->num_queue_pairs; i++) | ||
1652 | WRITE_ONCE(vsi->rx_rings[i]->xdp_prog, vsi->xdp_prog); | ||
1653 | diff --git a/drivers/net/ethernet/intel/i40e/i40e_xsk.c b/drivers/net/ethernet/intel/i40e/i40e_xsk.c | ||
1654 | index d07e1a890428..f73cd917c44f 100644 | ||
1655 | --- a/drivers/net/ethernet/intel/i40e/i40e_xsk.c | ||
1656 | +++ b/drivers/net/ethernet/intel/i40e/i40e_xsk.c | ||
1657 | @@ -787,8 +787,12 @@ int i40e_xsk_wakeup(struct net_device *dev, u32 queue_id, u32 flags) | ||
1658 | { | ||
1659 | struct i40e_netdev_priv *np = netdev_priv(dev); | ||
1660 | struct i40e_vsi *vsi = np->vsi; | ||
1661 | + struct i40e_pf *pf = vsi->back; | ||
1662 | struct i40e_ring *ring; | ||
1663 | |||
1664 | + if (test_bit(__I40E_CONFIG_BUSY, pf->state)) | ||
1665 | + return -ENETDOWN; | ||
1666 | + | ||
1667 | if (test_bit(__I40E_VSI_DOWN, vsi->state)) | ||
1668 | return -ENETDOWN; | ||
1669 | |||
1670 | diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | ||
1671 | index 1a7203fede12..c6404abf2dd1 100644 | ||
1672 | --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | ||
1673 | +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | ||
1674 | @@ -10248,7 +10248,12 @@ static int ixgbe_xdp_setup(struct net_device *dev, struct bpf_prog *prog) | ||
1675 | |||
1676 | /* If transitioning XDP modes reconfigure rings */ | ||
1677 | if (need_reset) { | ||
1678 | - int err = ixgbe_setup_tc(dev, adapter->hw_tcs); | ||
1679 | + int err; | ||
1680 | + | ||
1681 | + if (!prog) | ||
1682 | + /* Wait until ndo_xsk_wakeup completes. */ | ||
1683 | + synchronize_rcu(); | ||
1684 | + err = ixgbe_setup_tc(dev, adapter->hw_tcs); | ||
1685 | |||
1686 | if (err) { | ||
1687 | rcu_assign_pointer(adapter->xdp_prog, old_prog); | ||
1688 | diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_xsk.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_xsk.c | ||
1689 | index d6feaacfbf89..b43be9f14105 100644 | ||
1690 | --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_xsk.c | ||
1691 | +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_xsk.c | ||
1692 | @@ -709,10 +709,14 @@ int ixgbe_xsk_wakeup(struct net_device *dev, u32 qid, u32 flags) | ||
1693 | if (qid >= adapter->num_xdp_queues) | ||
1694 | return -ENXIO; | ||
1695 | |||
1696 | - if (!adapter->xdp_ring[qid]->xsk_umem) | ||
1697 | + ring = adapter->xdp_ring[qid]; | ||
1698 | + | ||
1699 | + if (test_bit(__IXGBE_TX_DISABLED, &ring->state)) | ||
1700 | + return -ENETDOWN; | ||
1701 | + | ||
1702 | + if (!ring->xsk_umem) | ||
1703 | return -ENXIO; | ||
1704 | |||
1705 | - ring = adapter->xdp_ring[qid]; | ||
1706 | if (!napi_if_scheduled_mark_missed(&ring->q_vector->napi)) { | ||
1707 | u64 eics = BIT_ULL(ring->q_vector->v_idx); | ||
1708 | |||
1709 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en.h b/drivers/net/ethernet/mellanox/mlx5/core/en.h | ||
1710 | index 2c16add0b642..9c8427698238 100644 | ||
1711 | --- a/drivers/net/ethernet/mellanox/mlx5/core/en.h | ||
1712 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/en.h | ||
1713 | @@ -760,7 +760,7 @@ enum { | ||
1714 | MLX5E_STATE_OPENED, | ||
1715 | MLX5E_STATE_DESTROYING, | ||
1716 | MLX5E_STATE_XDP_TX_ENABLED, | ||
1717 | - MLX5E_STATE_XDP_OPEN, | ||
1718 | + MLX5E_STATE_XDP_ACTIVE, | ||
1719 | }; | ||
1720 | |||
1721 | struct mlx5e_rqt { | ||
1722 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/fs.h b/drivers/net/ethernet/mellanox/mlx5/core/en/fs.h | ||
1723 | index 68d593074f6c..d48292ccda29 100644 | ||
1724 | --- a/drivers/net/ethernet/mellanox/mlx5/core/en/fs.h | ||
1725 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/en/fs.h | ||
1726 | @@ -122,6 +122,22 @@ enum { | ||
1727 | #endif | ||
1728 | }; | ||
1729 | |||
1730 | +#define MLX5E_TTC_NUM_GROUPS 3 | ||
1731 | +#define MLX5E_TTC_GROUP1_SIZE (BIT(3) + MLX5E_NUM_TUNNEL_TT) | ||
1732 | +#define MLX5E_TTC_GROUP2_SIZE BIT(1) | ||
1733 | +#define MLX5E_TTC_GROUP3_SIZE BIT(0) | ||
1734 | +#define MLX5E_TTC_TABLE_SIZE (MLX5E_TTC_GROUP1_SIZE +\ | ||
1735 | + MLX5E_TTC_GROUP2_SIZE +\ | ||
1736 | + MLX5E_TTC_GROUP3_SIZE) | ||
1737 | + | ||
1738 | +#define MLX5E_INNER_TTC_NUM_GROUPS 3 | ||
1739 | +#define MLX5E_INNER_TTC_GROUP1_SIZE BIT(3) | ||
1740 | +#define MLX5E_INNER_TTC_GROUP2_SIZE BIT(1) | ||
1741 | +#define MLX5E_INNER_TTC_GROUP3_SIZE BIT(0) | ||
1742 | +#define MLX5E_INNER_TTC_TABLE_SIZE (MLX5E_INNER_TTC_GROUP1_SIZE +\ | ||
1743 | + MLX5E_INNER_TTC_GROUP2_SIZE +\ | ||
1744 | + MLX5E_INNER_TTC_GROUP3_SIZE) | ||
1745 | + | ||
1746 | #ifdef CONFIG_MLX5_EN_RXNFC | ||
1747 | |||
1748 | struct mlx5e_ethtool_table { | ||
1749 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/health.c b/drivers/net/ethernet/mellanox/mlx5/core/en/health.c | ||
1750 | index 1d6b58860da6..3a975641f902 100644 | ||
1751 | --- a/drivers/net/ethernet/mellanox/mlx5/core/en/health.c | ||
1752 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/en/health.c | ||
1753 | @@ -197,9 +197,10 @@ int mlx5e_health_report(struct mlx5e_priv *priv, | ||
1754 | struct devlink_health_reporter *reporter, char *err_str, | ||
1755 | struct mlx5e_err_ctx *err_ctx) | ||
1756 | { | ||
1757 | - if (!reporter) { | ||
1758 | - netdev_err(priv->netdev, err_str); | ||
1759 | + netdev_err(priv->netdev, err_str); | ||
1760 | + | ||
1761 | + if (!reporter) | ||
1762 | return err_ctx->recover(&err_ctx->ctx); | ||
1763 | - } | ||
1764 | + | ||
1765 | return devlink_health_report(reporter, err_str, err_ctx); | ||
1766 | } | ||
1767 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.h b/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.h | ||
1768 | index 36ac1e3816b9..d7587f40ecae 100644 | ||
1769 | --- a/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.h | ||
1770 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.h | ||
1771 | @@ -75,12 +75,18 @@ int mlx5e_xdp_xmit(struct net_device *dev, int n, struct xdp_frame **frames, | ||
1772 | static inline void mlx5e_xdp_tx_enable(struct mlx5e_priv *priv) | ||
1773 | { | ||
1774 | set_bit(MLX5E_STATE_XDP_TX_ENABLED, &priv->state); | ||
1775 | + | ||
1776 | + if (priv->channels.params.xdp_prog) | ||
1777 | + set_bit(MLX5E_STATE_XDP_ACTIVE, &priv->state); | ||
1778 | } | ||
1779 | |||
1780 | static inline void mlx5e_xdp_tx_disable(struct mlx5e_priv *priv) | ||
1781 | { | ||
1782 | + if (priv->channels.params.xdp_prog) | ||
1783 | + clear_bit(MLX5E_STATE_XDP_ACTIVE, &priv->state); | ||
1784 | + | ||
1785 | clear_bit(MLX5E_STATE_XDP_TX_ENABLED, &priv->state); | ||
1786 | - /* let other device's napi(s) see our new state */ | ||
1787 | + /* Let other device's napi(s) and XSK wakeups see our new state. */ | ||
1788 | synchronize_rcu(); | ||
1789 | } | ||
1790 | |||
1791 | @@ -89,19 +95,9 @@ static inline bool mlx5e_xdp_tx_is_enabled(struct mlx5e_priv *priv) | ||
1792 | return test_bit(MLX5E_STATE_XDP_TX_ENABLED, &priv->state); | ||
1793 | } | ||
1794 | |||
1795 | -static inline void mlx5e_xdp_set_open(struct mlx5e_priv *priv) | ||
1796 | -{ | ||
1797 | - set_bit(MLX5E_STATE_XDP_OPEN, &priv->state); | ||
1798 | -} | ||
1799 | - | ||
1800 | -static inline void mlx5e_xdp_set_closed(struct mlx5e_priv *priv) | ||
1801 | -{ | ||
1802 | - clear_bit(MLX5E_STATE_XDP_OPEN, &priv->state); | ||
1803 | -} | ||
1804 | - | ||
1805 | -static inline bool mlx5e_xdp_is_open(struct mlx5e_priv *priv) | ||
1806 | +static inline bool mlx5e_xdp_is_active(struct mlx5e_priv *priv) | ||
1807 | { | ||
1808 | - return test_bit(MLX5E_STATE_XDP_OPEN, &priv->state); | ||
1809 | + return test_bit(MLX5E_STATE_XDP_ACTIVE, &priv->state); | ||
1810 | } | ||
1811 | |||
1812 | static inline void mlx5e_xmit_xdp_doorbell(struct mlx5e_xdpsq *sq) | ||
1813 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/setup.c b/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/setup.c | ||
1814 | index 631af8dee517..c28cbae42331 100644 | ||
1815 | --- a/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/setup.c | ||
1816 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/setup.c | ||
1817 | @@ -144,6 +144,7 @@ void mlx5e_close_xsk(struct mlx5e_channel *c) | ||
1818 | { | ||
1819 | clear_bit(MLX5E_CHANNEL_STATE_XSK, c->state); | ||
1820 | napi_synchronize(&c->napi); | ||
1821 | + synchronize_rcu(); /* Sync with the XSK wakeup. */ | ||
1822 | |||
1823 | mlx5e_close_rq(&c->xskrq); | ||
1824 | mlx5e_close_cq(&c->xskrq.cq); | ||
1825 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/tx.c b/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/tx.c | ||
1826 | index 87827477d38c..fe2d596cb361 100644 | ||
1827 | --- a/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/tx.c | ||
1828 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/tx.c | ||
1829 | @@ -14,7 +14,7 @@ int mlx5e_xsk_wakeup(struct net_device *dev, u32 qid, u32 flags) | ||
1830 | struct mlx5e_channel *c; | ||
1831 | u16 ix; | ||
1832 | |||
1833 | - if (unlikely(!mlx5e_xdp_is_open(priv))) | ||
1834 | + if (unlikely(!mlx5e_xdp_is_active(priv))) | ||
1835 | return -ENETDOWN; | ||
1836 | |||
1837 | if (unlikely(!mlx5e_qid_get_ch_if_in_group(params, qid, MLX5E_RQ_GROUP_XSK, &ix))) | ||
1838 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_fs.c b/drivers/net/ethernet/mellanox/mlx5/core/en_fs.c | ||
1839 | index 15b7f0f1427c..73d3dc07331f 100644 | ||
1840 | --- a/drivers/net/ethernet/mellanox/mlx5/core/en_fs.c | ||
1841 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_fs.c | ||
1842 | @@ -904,22 +904,6 @@ del_rules: | ||
1843 | return err; | ||
1844 | } | ||
1845 | |||
1846 | -#define MLX5E_TTC_NUM_GROUPS 3 | ||
1847 | -#define MLX5E_TTC_GROUP1_SIZE (BIT(3) + MLX5E_NUM_TUNNEL_TT) | ||
1848 | -#define MLX5E_TTC_GROUP2_SIZE BIT(1) | ||
1849 | -#define MLX5E_TTC_GROUP3_SIZE BIT(0) | ||
1850 | -#define MLX5E_TTC_TABLE_SIZE (MLX5E_TTC_GROUP1_SIZE +\ | ||
1851 | - MLX5E_TTC_GROUP2_SIZE +\ | ||
1852 | - MLX5E_TTC_GROUP3_SIZE) | ||
1853 | - | ||
1854 | -#define MLX5E_INNER_TTC_NUM_GROUPS 3 | ||
1855 | -#define MLX5E_INNER_TTC_GROUP1_SIZE BIT(3) | ||
1856 | -#define MLX5E_INNER_TTC_GROUP2_SIZE BIT(1) | ||
1857 | -#define MLX5E_INNER_TTC_GROUP3_SIZE BIT(0) | ||
1858 | -#define MLX5E_INNER_TTC_TABLE_SIZE (MLX5E_INNER_TTC_GROUP1_SIZE +\ | ||
1859 | - MLX5E_INNER_TTC_GROUP2_SIZE +\ | ||
1860 | - MLX5E_INNER_TTC_GROUP3_SIZE) | ||
1861 | - | ||
1862 | static int mlx5e_create_ttc_table_groups(struct mlx5e_ttc_table *ttc, | ||
1863 | bool use_ipv) | ||
1864 | { | ||
1865 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c | ||
1866 | index 6abd4ed5b69b..29a5a8c894e3 100644 | ||
1867 | --- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c | ||
1868 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c | ||
1869 | @@ -3002,12 +3002,9 @@ void mlx5e_timestamp_init(struct mlx5e_priv *priv) | ||
1870 | int mlx5e_open_locked(struct net_device *netdev) | ||
1871 | { | ||
1872 | struct mlx5e_priv *priv = netdev_priv(netdev); | ||
1873 | - bool is_xdp = priv->channels.params.xdp_prog; | ||
1874 | int err; | ||
1875 | |||
1876 | set_bit(MLX5E_STATE_OPENED, &priv->state); | ||
1877 | - if (is_xdp) | ||
1878 | - mlx5e_xdp_set_open(priv); | ||
1879 | |||
1880 | err = mlx5e_open_channels(priv, &priv->channels); | ||
1881 | if (err) | ||
1882 | @@ -3022,8 +3019,6 @@ int mlx5e_open_locked(struct net_device *netdev) | ||
1883 | return 0; | ||
1884 | |||
1885 | err_clear_state_opened_flag: | ||
1886 | - if (is_xdp) | ||
1887 | - mlx5e_xdp_set_closed(priv); | ||
1888 | clear_bit(MLX5E_STATE_OPENED, &priv->state); | ||
1889 | return err; | ||
1890 | } | ||
1891 | @@ -3055,8 +3050,6 @@ int mlx5e_close_locked(struct net_device *netdev) | ||
1892 | if (!test_bit(MLX5E_STATE_OPENED, &priv->state)) | ||
1893 | return 0; | ||
1894 | |||
1895 | - if (priv->channels.params.xdp_prog) | ||
1896 | - mlx5e_xdp_set_closed(priv); | ||
1897 | clear_bit(MLX5E_STATE_OPENED, &priv->state); | ||
1898 | |||
1899 | netif_carrier_off(priv->netdev); | ||
1900 | @@ -4373,16 +4366,6 @@ static int mlx5e_xdp_allowed(struct mlx5e_priv *priv, struct bpf_prog *prog) | ||
1901 | return 0; | ||
1902 | } | ||
1903 | |||
1904 | -static int mlx5e_xdp_update_state(struct mlx5e_priv *priv) | ||
1905 | -{ | ||
1906 | - if (priv->channels.params.xdp_prog) | ||
1907 | - mlx5e_xdp_set_open(priv); | ||
1908 | - else | ||
1909 | - mlx5e_xdp_set_closed(priv); | ||
1910 | - | ||
1911 | - return 0; | ||
1912 | -} | ||
1913 | - | ||
1914 | static int mlx5e_xdp_set(struct net_device *netdev, struct bpf_prog *prog) | ||
1915 | { | ||
1916 | struct mlx5e_priv *priv = netdev_priv(netdev); | ||
1917 | @@ -4422,7 +4405,7 @@ static int mlx5e_xdp_set(struct net_device *netdev, struct bpf_prog *prog) | ||
1918 | mlx5e_set_rq_type(priv->mdev, &new_channels.params); | ||
1919 | old_prog = priv->channels.params.xdp_prog; | ||
1920 | |||
1921 | - err = mlx5e_safe_switch_channels(priv, &new_channels, mlx5e_xdp_update_state); | ||
1922 | + err = mlx5e_safe_switch_channels(priv, &new_channels, NULL); | ||
1923 | if (err) | ||
1924 | goto unlock; | ||
1925 | } else { | ||
1926 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c | ||
1927 | index 814a4ba4e7fa..947122c68493 100644 | ||
1928 | --- a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c | ||
1929 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c | ||
1930 | @@ -586,7 +586,7 @@ static void mlx5e_hairpin_set_ttc_params(struct mlx5e_hairpin *hp, | ||
1931 | for (tt = 0; tt < MLX5E_NUM_INDIR_TIRS; tt++) | ||
1932 | ttc_params->indir_tirn[tt] = hp->indir_tirn[tt]; | ||
1933 | |||
1934 | - ft_attr->max_fte = MLX5E_NUM_TT; | ||
1935 | + ft_attr->max_fte = MLX5E_TTC_TABLE_SIZE; | ||
1936 | ft_attr->level = MLX5E_TC_TTC_FT_LEVEL; | ||
1937 | ft_attr->prio = MLX5E_TC_PRIO; | ||
1938 | } | ||
1939 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/main.c b/drivers/net/ethernet/mellanox/mlx5/core/main.c | ||
1940 | index 50ab88d80033..051ab845b501 100644 | ||
1941 | --- a/drivers/net/ethernet/mellanox/mlx5/core/main.c | ||
1942 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/main.c | ||
1943 | @@ -1197,6 +1197,12 @@ static int mlx5_load_one(struct mlx5_core_dev *dev, bool boot) | ||
1944 | if (err) | ||
1945 | goto err_load; | ||
1946 | |||
1947 | + if (boot) { | ||
1948 | + err = mlx5_devlink_register(priv_to_devlink(dev), dev->device); | ||
1949 | + if (err) | ||
1950 | + goto err_devlink_reg; | ||
1951 | + } | ||
1952 | + | ||
1953 | if (mlx5_device_registered(dev)) { | ||
1954 | mlx5_attach_device(dev); | ||
1955 | } else { | ||
1956 | @@ -1214,6 +1220,9 @@ out: | ||
1957 | return err; | ||
1958 | |||
1959 | err_reg_dev: | ||
1960 | + if (boot) | ||
1961 | + mlx5_devlink_unregister(priv_to_devlink(dev)); | ||
1962 | +err_devlink_reg: | ||
1963 | mlx5_unload(dev); | ||
1964 | err_load: | ||
1965 | if (boot) | ||
1966 | @@ -1353,10 +1362,6 @@ static int init_one(struct pci_dev *pdev, const struct pci_device_id *id) | ||
1967 | |||
1968 | request_module_nowait(MLX5_IB_MOD); | ||
1969 | |||
1970 | - err = mlx5_devlink_register(devlink, &pdev->dev); | ||
1971 | - if (err) | ||
1972 | - goto clean_load; | ||
1973 | - | ||
1974 | err = mlx5_crdump_enable(dev); | ||
1975 | if (err) | ||
1976 | dev_err(&pdev->dev, "mlx5_crdump_enable failed with error code %d\n", err); | ||
1977 | @@ -1364,9 +1369,6 @@ static int init_one(struct pci_dev *pdev, const struct pci_device_id *id) | ||
1978 | pci_save_state(pdev); | ||
1979 | return 0; | ||
1980 | |||
1981 | -clean_load: | ||
1982 | - mlx5_unload_one(dev, true); | ||
1983 | - | ||
1984 | err_load_one: | ||
1985 | mlx5_pci_close(dev); | ||
1986 | pci_init_err: | ||
1987 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_rule.c b/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_rule.c | ||
1988 | index bd1699e62142..e1a647dde978 100644 | ||
1989 | --- a/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_rule.c | ||
1990 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_rule.c | ||
1991 | @@ -209,7 +209,7 @@ static void dr_rule_rehash_copy_ste_ctrl(struct mlx5dr_matcher *matcher, | ||
1992 | /* We need to copy the refcount since this ste | ||
1993 | * may have been traversed several times | ||
1994 | */ | ||
1995 | - refcount_set(&new_ste->refcount, refcount_read(&cur_ste->refcount)); | ||
1996 | + new_ste->refcount = cur_ste->refcount; | ||
1997 | |||
1998 | /* Link old STEs rule_mem list to the new ste */ | ||
1999 | mlx5dr_rule_update_rule_member(cur_ste, new_ste); | ||
2000 | @@ -638,6 +638,9 @@ static int dr_rule_add_member(struct mlx5dr_rule_rx_tx *nic_rule, | ||
2001 | if (!rule_mem) | ||
2002 | return -ENOMEM; | ||
2003 | |||
2004 | + INIT_LIST_HEAD(&rule_mem->list); | ||
2005 | + INIT_LIST_HEAD(&rule_mem->use_ste_list); | ||
2006 | + | ||
2007 | rule_mem->ste = ste; | ||
2008 | list_add_tail(&rule_mem->list, &nic_rule->rule_members_list); | ||
2009 | |||
2010 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_ste.c b/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_ste.c | ||
2011 | index 3cbf74b44d1f..2739ed2a2911 100644 | ||
2012 | --- a/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_ste.c | ||
2013 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_ste.c | ||
2014 | @@ -340,7 +340,7 @@ static void dr_ste_replace(struct mlx5dr_ste *dst, struct mlx5dr_ste *src) | ||
2015 | if (dst->next_htbl) | ||
2016 | dst->next_htbl->pointing_ste = dst; | ||
2017 | |||
2018 | - refcount_set(&dst->refcount, refcount_read(&src->refcount)); | ||
2019 | + dst->refcount = src->refcount; | ||
2020 | |||
2021 | INIT_LIST_HEAD(&dst->rule_list); | ||
2022 | list_splice_tail_init(&src->rule_list, &dst->rule_list); | ||
2023 | @@ -557,7 +557,7 @@ bool mlx5dr_ste_is_not_valid_entry(u8 *p_hw_ste) | ||
2024 | |||
2025 | bool mlx5dr_ste_not_used_ste(struct mlx5dr_ste *ste) | ||
2026 | { | ||
2027 | - return !refcount_read(&ste->refcount); | ||
2028 | + return !ste->refcount; | ||
2029 | } | ||
2030 | |||
2031 | /* Init one ste as a pattern for ste data array */ | ||
2032 | @@ -681,14 +681,14 @@ struct mlx5dr_ste_htbl *mlx5dr_ste_htbl_alloc(struct mlx5dr_icm_pool *pool, | ||
2033 | htbl->ste_arr = chunk->ste_arr; | ||
2034 | htbl->hw_ste_arr = chunk->hw_ste_arr; | ||
2035 | htbl->miss_list = chunk->miss_list; | ||
2036 | - refcount_set(&htbl->refcount, 0); | ||
2037 | + htbl->refcount = 0; | ||
2038 | |||
2039 | for (i = 0; i < chunk->num_of_entries; i++) { | ||
2040 | struct mlx5dr_ste *ste = &htbl->ste_arr[i]; | ||
2041 | |||
2042 | ste->hw_ste = htbl->hw_ste_arr + i * DR_STE_SIZE_REDUCED; | ||
2043 | ste->htbl = htbl; | ||
2044 | - refcount_set(&ste->refcount, 0); | ||
2045 | + ste->refcount = 0; | ||
2046 | INIT_LIST_HEAD(&ste->miss_list_node); | ||
2047 | INIT_LIST_HEAD(&htbl->miss_list[i]); | ||
2048 | INIT_LIST_HEAD(&ste->rule_list); | ||
2049 | @@ -705,7 +705,7 @@ out_free_htbl: | ||
2050 | |||
2051 | int mlx5dr_ste_htbl_free(struct mlx5dr_ste_htbl *htbl) | ||
2052 | { | ||
2053 | - if (refcount_read(&htbl->refcount)) | ||
2054 | + if (htbl->refcount) | ||
2055 | return -EBUSY; | ||
2056 | |||
2057 | mlx5dr_icm_free_chunk(htbl->chunk); | ||
2058 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_types.h b/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_types.h | ||
2059 | index 1cb3769d4e3c..31737dfca4ea 100644 | ||
2060 | --- a/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_types.h | ||
2061 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_types.h | ||
2062 | @@ -117,7 +117,7 @@ struct mlx5dr_matcher_rx_tx; | ||
2063 | struct mlx5dr_ste { | ||
2064 | u8 *hw_ste; | ||
2065 | /* refcount: indicates the num of rules that using this ste */ | ||
2066 | - refcount_t refcount; | ||
2067 | + u32 refcount; | ||
2068 | |||
2069 | /* attached to the miss_list head at each htbl entry */ | ||
2070 | struct list_head miss_list_node; | ||
2071 | @@ -149,7 +149,7 @@ struct mlx5dr_ste_htbl_ctrl { | ||
2072 | struct mlx5dr_ste_htbl { | ||
2073 | u8 lu_type; | ||
2074 | u16 byte_mask; | ||
2075 | - refcount_t refcount; | ||
2076 | + u32 refcount; | ||
2077 | struct mlx5dr_icm_chunk *chunk; | ||
2078 | struct mlx5dr_ste *ste_arr; | ||
2079 | u8 *hw_ste_arr; | ||
2080 | @@ -200,13 +200,14 @@ int mlx5dr_ste_htbl_free(struct mlx5dr_ste_htbl *htbl); | ||
2081 | |||
2082 | static inline void mlx5dr_htbl_put(struct mlx5dr_ste_htbl *htbl) | ||
2083 | { | ||
2084 | - if (refcount_dec_and_test(&htbl->refcount)) | ||
2085 | + htbl->refcount--; | ||
2086 | + if (!htbl->refcount) | ||
2087 | mlx5dr_ste_htbl_free(htbl); | ||
2088 | } | ||
2089 | |||
2090 | static inline void mlx5dr_htbl_get(struct mlx5dr_ste_htbl *htbl) | ||
2091 | { | ||
2092 | - refcount_inc(&htbl->refcount); | ||
2093 | + htbl->refcount++; | ||
2094 | } | ||
2095 | |||
2096 | /* STE utils */ | ||
2097 | @@ -248,14 +249,15 @@ static inline void mlx5dr_ste_put(struct mlx5dr_ste *ste, | ||
2098 | struct mlx5dr_matcher *matcher, | ||
2099 | struct mlx5dr_matcher_rx_tx *nic_matcher) | ||
2100 | { | ||
2101 | - if (refcount_dec_and_test(&ste->refcount)) | ||
2102 | + ste->refcount--; | ||
2103 | + if (!ste->refcount) | ||
2104 | mlx5dr_ste_free(ste, matcher, nic_matcher); | ||
2105 | } | ||
2106 | |||
2107 | /* initial as 0, increased only when ste appears in a new rule */ | ||
2108 | static inline void mlx5dr_ste_get(struct mlx5dr_ste *ste) | ||
2109 | { | ||
2110 | - refcount_inc(&ste->refcount); | ||
2111 | + ste->refcount++; | ||
2112 | } | ||
2113 | |||
2114 | void mlx5dr_ste_set_hit_addr_by_next_htbl(u8 *hw_ste, | ||
2115 | diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_qdisc.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_qdisc.c | ||
2116 | index bdf53cf350f6..720514b5c006 100644 | ||
2117 | --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_qdisc.c | ||
2118 | +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_qdisc.c | ||
2119 | @@ -650,6 +650,13 @@ mlxsw_sp_qdisc_prio_graft(struct mlxsw_sp_port *mlxsw_sp_port, | ||
2120 | mlxsw_sp_port->tclass_qdiscs[tclass_num].handle == p->child_handle) | ||
2121 | return 0; | ||
2122 | |||
2123 | + if (!p->child_handle) { | ||
2124 | + /* This is an invisible FIFO replacing the original Qdisc. | ||
2125 | + * Ignore it--the original Qdisc's destroy will follow. | ||
2126 | + */ | ||
2127 | + return 0; | ||
2128 | + } | ||
2129 | + | ||
2130 | /* See if the grafted qdisc is already offloaded on any tclass. If so, | ||
2131 | * unoffload it. | ||
2132 | */ | ||
2133 | diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c | ||
2134 | index 6e47be63a43c..e9e0867ec139 100644 | ||
2135 | --- a/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c | ||
2136 | +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c | ||
2137 | @@ -957,6 +957,9 @@ static int sun8i_dwmac_set_syscon(struct stmmac_priv *priv) | ||
2138 | /* default */ | ||
2139 | break; | ||
2140 | case PHY_INTERFACE_MODE_RGMII: | ||
2141 | + case PHY_INTERFACE_MODE_RGMII_ID: | ||
2142 | + case PHY_INTERFACE_MODE_RGMII_RXID: | ||
2143 | + case PHY_INTERFACE_MODE_RGMII_TXID: | ||
2144 | reg |= SYSCON_EPIT | SYSCON_ETCS_INT_GMII; | ||
2145 | break; | ||
2146 | case PHY_INTERFACE_MODE_RMII: | ||
2147 | diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c | ||
2148 | index a299da3971b4..102d637bc84a 100644 | ||
2149 | --- a/drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c | ||
2150 | +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c | ||
2151 | @@ -44,7 +44,7 @@ static int sun7i_gmac_init(struct platform_device *pdev, void *priv) | ||
2152 | * rate, which then uses the auto-reparenting feature of the | ||
2153 | * clock driver, and enabling/disabling the clock. | ||
2154 | */ | ||
2155 | - if (gmac->interface == PHY_INTERFACE_MODE_RGMII) { | ||
2156 | + if (phy_interface_mode_is_rgmii(gmac->interface)) { | ||
2157 | clk_set_rate(gmac->tx_clk, SUN7I_GMAC_GMII_RGMII_RATE); | ||
2158 | clk_prepare_enable(gmac->tx_clk); | ||
2159 | gmac->clk_enabled = 1; | ||
2160 | diff --git a/drivers/net/ethernet/stmicro/stmmac/dwxgmac2.h b/drivers/net/ethernet/stmicro/stmmac/dwxgmac2.h | ||
2161 | index 9d08a934fe4f..ff751ab3d765 100644 | ||
2162 | --- a/drivers/net/ethernet/stmicro/stmmac/dwxgmac2.h | ||
2163 | +++ b/drivers/net/ethernet/stmicro/stmmac/dwxgmac2.h | ||
2164 | @@ -343,6 +343,8 @@ | ||
2165 | #define XGMAC_DMA_CH_RX_CONTROL(x) (0x00003108 + (0x80 * (x))) | ||
2166 | #define XGMAC_RxPBL GENMASK(21, 16) | ||
2167 | #define XGMAC_RxPBL_SHIFT 16 | ||
2168 | +#define XGMAC_RBSZ GENMASK(14, 1) | ||
2169 | +#define XGMAC_RBSZ_SHIFT 1 | ||
2170 | #define XGMAC_RXST BIT(0) | ||
2171 | #define XGMAC_DMA_CH_TxDESC_HADDR(x) (0x00003110 + (0x80 * (x))) | ||
2172 | #define XGMAC_DMA_CH_TxDESC_LADDR(x) (0x00003114 + (0x80 * (x))) | ||
2173 | diff --git a/drivers/net/ethernet/stmicro/stmmac/dwxgmac2_dma.c b/drivers/net/ethernet/stmicro/stmmac/dwxgmac2_dma.c | ||
2174 | index f70ca5300b82..4af7271cea56 100644 | ||
2175 | --- a/drivers/net/ethernet/stmicro/stmmac/dwxgmac2_dma.c | ||
2176 | +++ b/drivers/net/ethernet/stmicro/stmmac/dwxgmac2_dma.c | ||
2177 | @@ -489,7 +489,8 @@ static void dwxgmac2_set_bfsize(void __iomem *ioaddr, int bfsize, u32 chan) | ||
2178 | u32 value; | ||
2179 | |||
2180 | value = readl(ioaddr + XGMAC_DMA_CH_RX_CONTROL(chan)); | ||
2181 | - value |= bfsize << 1; | ||
2182 | + value &= ~XGMAC_RBSZ; | ||
2183 | + value |= bfsize << XGMAC_RBSZ_SHIFT; | ||
2184 | writel(value, ioaddr + XGMAC_DMA_CH_RX_CONTROL(chan)); | ||
2185 | } | ||
2186 | |||
2187 | diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | ||
2188 | index 271a00f24f45..903c5d8a226e 100644 | ||
2189 | --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | ||
2190 | +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | ||
2191 | @@ -45,7 +45,7 @@ | ||
2192 | #include "dwxgmac2.h" | ||
2193 | #include "hwif.h" | ||
2194 | |||
2195 | -#define STMMAC_ALIGN(x) __ALIGN_KERNEL(x, SMP_CACHE_BYTES) | ||
2196 | +#define STMMAC_ALIGN(x) ALIGN(ALIGN(x, SMP_CACHE_BYTES), 16) | ||
2197 | #define TSO_MAX_BUFF_SIZE (SZ_16K - 1) | ||
2198 | |||
2199 | /* Module parameters */ | ||
2200 | @@ -1292,19 +1292,9 @@ static int init_dma_rx_desc_rings(struct net_device *dev, gfp_t flags) | ||
2201 | struct stmmac_priv *priv = netdev_priv(dev); | ||
2202 | u32 rx_count = priv->plat->rx_queues_to_use; | ||
2203 | int ret = -ENOMEM; | ||
2204 | - int bfsize = 0; | ||
2205 | int queue; | ||
2206 | int i; | ||
2207 | |||
2208 | - bfsize = stmmac_set_16kib_bfsize(priv, dev->mtu); | ||
2209 | - if (bfsize < 0) | ||
2210 | - bfsize = 0; | ||
2211 | - | ||
2212 | - if (bfsize < BUF_SIZE_16KiB) | ||
2213 | - bfsize = stmmac_set_bfsize(dev->mtu, priv->dma_buf_sz); | ||
2214 | - | ||
2215 | - priv->dma_buf_sz = bfsize; | ||
2216 | - | ||
2217 | /* RX INITIALIZATION */ | ||
2218 | netif_dbg(priv, probe, priv->dev, | ||
2219 | "SKB addresses:\nskb\t\tskb data\tdma data\n"); | ||
2220 | @@ -1346,8 +1336,6 @@ static int init_dma_rx_desc_rings(struct net_device *dev, gfp_t flags) | ||
2221 | } | ||
2222 | } | ||
2223 | |||
2224 | - buf_sz = bfsize; | ||
2225 | - | ||
2226 | return 0; | ||
2227 | |||
2228 | err_init_rx_buffers: | ||
2229 | @@ -2654,6 +2642,7 @@ static void stmmac_hw_teardown(struct net_device *dev) | ||
2230 | static int stmmac_open(struct net_device *dev) | ||
2231 | { | ||
2232 | struct stmmac_priv *priv = netdev_priv(dev); | ||
2233 | + int bfsize = 0; | ||
2234 | u32 chan; | ||
2235 | int ret; | ||
2236 | |||
2237 | @@ -2673,7 +2662,16 @@ static int stmmac_open(struct net_device *dev) | ||
2238 | memset(&priv->xstats, 0, sizeof(struct stmmac_extra_stats)); | ||
2239 | priv->xstats.threshold = tc; | ||
2240 | |||
2241 | - priv->dma_buf_sz = STMMAC_ALIGN(buf_sz); | ||
2242 | + bfsize = stmmac_set_16kib_bfsize(priv, dev->mtu); | ||
2243 | + if (bfsize < 0) | ||
2244 | + bfsize = 0; | ||
2245 | + | ||
2246 | + if (bfsize < BUF_SIZE_16KiB) | ||
2247 | + bfsize = stmmac_set_bfsize(dev->mtu, priv->dma_buf_sz); | ||
2248 | + | ||
2249 | + priv->dma_buf_sz = bfsize; | ||
2250 | + buf_sz = bfsize; | ||
2251 | + | ||
2252 | priv->rx_copybreak = STMMAC_RX_COPYBREAK; | ||
2253 | |||
2254 | ret = alloc_dma_desc_resources(priv); | ||
2255 | @@ -3103,6 +3101,7 @@ static netdev_tx_t stmmac_tso_xmit(struct sk_buff *skb, struct net_device *dev) | ||
2256 | |||
2257 | tx_q->tx_tail_addr = tx_q->dma_tx_phy + (tx_q->cur_tx * sizeof(*desc)); | ||
2258 | stmmac_set_tx_tail_ptr(priv, priv->ioaddr, tx_q->tx_tail_addr, queue); | ||
2259 | + stmmac_tx_timer_arm(priv, queue); | ||
2260 | |||
2261 | return NETDEV_TX_OK; | ||
2262 | |||
2263 | @@ -3330,6 +3329,7 @@ static netdev_tx_t stmmac_xmit(struct sk_buff *skb, struct net_device *dev) | ||
2264 | |||
2265 | tx_q->tx_tail_addr = tx_q->dma_tx_phy + (tx_q->cur_tx * sizeof(*desc)); | ||
2266 | stmmac_set_tx_tail_ptr(priv, priv->ioaddr, tx_q->tx_tail_addr, queue); | ||
2267 | + stmmac_tx_timer_arm(priv, queue); | ||
2268 | |||
2269 | return NETDEV_TX_OK; | ||
2270 | |||
2271 | @@ -3747,12 +3747,24 @@ static void stmmac_set_rx_mode(struct net_device *dev) | ||
2272 | static int stmmac_change_mtu(struct net_device *dev, int new_mtu) | ||
2273 | { | ||
2274 | struct stmmac_priv *priv = netdev_priv(dev); | ||
2275 | + int txfifosz = priv->plat->tx_fifo_size; | ||
2276 | + | ||
2277 | + if (txfifosz == 0) | ||
2278 | + txfifosz = priv->dma_cap.tx_fifo_size; | ||
2279 | + | ||
2280 | + txfifosz /= priv->plat->tx_queues_to_use; | ||
2281 | |||
2282 | if (netif_running(dev)) { | ||
2283 | netdev_err(priv->dev, "must be stopped to change its MTU\n"); | ||
2284 | return -EBUSY; | ||
2285 | } | ||
2286 | |||
2287 | + new_mtu = STMMAC_ALIGN(new_mtu); | ||
2288 | + | ||
2289 | + /* If condition true, FIFO is too small or MTU too large */ | ||
2290 | + if ((txfifosz < new_mtu) || (new_mtu > BUF_SIZE_16KiB)) | ||
2291 | + return -EINVAL; | ||
2292 | + | ||
2293 | dev->mtu = new_mtu; | ||
2294 | |||
2295 | netdev_update_features(dev); | ||
2296 | diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c | ||
2297 | index 1f230bd854c4..5150551c28be 100644 | ||
2298 | --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c | ||
2299 | +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c | ||
2300 | @@ -320,7 +320,7 @@ out: | ||
2301 | static int stmmac_dt_phy(struct plat_stmmacenet_data *plat, | ||
2302 | struct device_node *np, struct device *dev) | ||
2303 | { | ||
2304 | - bool mdio = false; | ||
2305 | + bool mdio = !of_phy_is_fixed_link(np); | ||
2306 | static const struct of_device_id need_mdio_ids[] = { | ||
2307 | { .compatible = "snps,dwc-qos-ethernet-4.10" }, | ||
2308 | {}, | ||
2309 | diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_selftests.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_selftests.c | ||
2310 | index ac3f658105c0..a0513deab1a0 100644 | ||
2311 | --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_selftests.c | ||
2312 | +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_selftests.c | ||
2313 | @@ -624,6 +624,8 @@ static int stmmac_test_mcfilt(struct stmmac_priv *priv) | ||
2314 | return -EOPNOTSUPP; | ||
2315 | if (netdev_uc_count(priv->dev) >= priv->hw->unicast_filter_entries) | ||
2316 | return -EOPNOTSUPP; | ||
2317 | + if (netdev_mc_count(priv->dev) >= priv->hw->multicast_filter_bins) | ||
2318 | + return -EOPNOTSUPP; | ||
2319 | |||
2320 | while (--tries) { | ||
2321 | /* We only need to check the mc_addr for collisions */ | ||
2322 | @@ -666,6 +668,8 @@ static int stmmac_test_ucfilt(struct stmmac_priv *priv) | ||
2323 | |||
2324 | if (stmmac_filter_check(priv)) | ||
2325 | return -EOPNOTSUPP; | ||
2326 | + if (netdev_uc_count(priv->dev) >= priv->hw->unicast_filter_entries) | ||
2327 | + return -EOPNOTSUPP; | ||
2328 | if (netdev_mc_count(priv->dev) >= priv->hw->multicast_filter_bins) | ||
2329 | return -EOPNOTSUPP; | ||
2330 | |||
2331 | diff --git a/drivers/net/gtp.c b/drivers/net/gtp.c | ||
2332 | index fca471e27f39..f6222ada6818 100644 | ||
2333 | --- a/drivers/net/gtp.c | ||
2334 | +++ b/drivers/net/gtp.c | ||
2335 | @@ -813,7 +813,7 @@ static struct sock *gtp_encap_enable_socket(int fd, int type, | ||
2336 | lock_sock(sock->sk); | ||
2337 | if (sock->sk->sk_user_data) { | ||
2338 | sk = ERR_PTR(-EBUSY); | ||
2339 | - goto out_sock; | ||
2340 | + goto out_rel_sock; | ||
2341 | } | ||
2342 | |||
2343 | sk = sock->sk; | ||
2344 | @@ -826,8 +826,9 @@ static struct sock *gtp_encap_enable_socket(int fd, int type, | ||
2345 | |||
2346 | setup_udp_tunnel_sock(sock_net(sock->sk), sock, &tuncfg); | ||
2347 | |||
2348 | -out_sock: | ||
2349 | +out_rel_sock: | ||
2350 | release_sock(sock->sk); | ||
2351 | +out_sock: | ||
2352 | sockfd_put(sock); | ||
2353 | return sk; | ||
2354 | } | ||
2355 | diff --git a/drivers/net/hyperv/hyperv_net.h b/drivers/net/hyperv/hyperv_net.h | ||
2356 | index fb547f37af1e..e74f2d1def80 100644 | ||
2357 | --- a/drivers/net/hyperv/hyperv_net.h | ||
2358 | +++ b/drivers/net/hyperv/hyperv_net.h | ||
2359 | @@ -169,7 +169,6 @@ struct rndis_device { | ||
2360 | |||
2361 | u8 hw_mac_adr[ETH_ALEN]; | ||
2362 | u8 rss_key[NETVSC_HASH_KEYLEN]; | ||
2363 | - u16 rx_table[ITAB_NUM]; | ||
2364 | }; | ||
2365 | |||
2366 | |||
2367 | @@ -938,6 +937,8 @@ struct net_device_context { | ||
2368 | |||
2369 | u32 tx_table[VRSS_SEND_TAB_SIZE]; | ||
2370 | |||
2371 | + u16 rx_table[ITAB_NUM]; | ||
2372 | + | ||
2373 | /* Ethtool settings */ | ||
2374 | u8 duplex; | ||
2375 | u32 speed; | ||
2376 | diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c | ||
2377 | index 963509add611..78e3e689a733 100644 | ||
2378 | --- a/drivers/net/hyperv/netvsc_drv.c | ||
2379 | +++ b/drivers/net/hyperv/netvsc_drv.c | ||
2380 | @@ -1659,7 +1659,7 @@ static int netvsc_get_rxfh(struct net_device *dev, u32 *indir, u8 *key, | ||
2381 | rndis_dev = ndev->extension; | ||
2382 | if (indir) { | ||
2383 | for (i = 0; i < ITAB_NUM; i++) | ||
2384 | - indir[i] = rndis_dev->rx_table[i]; | ||
2385 | + indir[i] = ndc->rx_table[i]; | ||
2386 | } | ||
2387 | |||
2388 | if (key) | ||
2389 | @@ -1689,7 +1689,7 @@ static int netvsc_set_rxfh(struct net_device *dev, const u32 *indir, | ||
2390 | return -EINVAL; | ||
2391 | |||
2392 | for (i = 0; i < ITAB_NUM; i++) | ||
2393 | - rndis_dev->rx_table[i] = indir[i]; | ||
2394 | + ndc->rx_table[i] = indir[i]; | ||
2395 | } | ||
2396 | |||
2397 | if (!key) { | ||
2398 | diff --git a/drivers/net/hyperv/rndis_filter.c b/drivers/net/hyperv/rndis_filter.c | ||
2399 | index e3d3c9097ff1..f81e58267a6e 100644 | ||
2400 | --- a/drivers/net/hyperv/rndis_filter.c | ||
2401 | +++ b/drivers/net/hyperv/rndis_filter.c | ||
2402 | @@ -767,6 +767,7 @@ static int rndis_set_rss_param_msg(struct rndis_device *rdev, | ||
2403 | const u8 *rss_key, u16 flag) | ||
2404 | { | ||
2405 | struct net_device *ndev = rdev->ndev; | ||
2406 | + struct net_device_context *ndc = netdev_priv(ndev); | ||
2407 | struct rndis_request *request; | ||
2408 | struct rndis_set_request *set; | ||
2409 | struct rndis_set_complete *set_complete; | ||
2410 | @@ -806,7 +807,7 @@ static int rndis_set_rss_param_msg(struct rndis_device *rdev, | ||
2411 | /* Set indirection table entries */ | ||
2412 | itab = (u32 *)(rssp + 1); | ||
2413 | for (i = 0; i < ITAB_NUM; i++) | ||
2414 | - itab[i] = rdev->rx_table[i]; | ||
2415 | + itab[i] = ndc->rx_table[i]; | ||
2416 | |||
2417 | /* Set hask key values */ | ||
2418 | keyp = (u8 *)((unsigned long)rssp + rssp->hashkey_offset); | ||
2419 | @@ -1305,6 +1306,7 @@ struct netvsc_device *rndis_filter_device_add(struct hv_device *dev, | ||
2420 | struct netvsc_device_info *device_info) | ||
2421 | { | ||
2422 | struct net_device *net = hv_get_drvdata(dev); | ||
2423 | + struct net_device_context *ndc = netdev_priv(net); | ||
2424 | struct netvsc_device *net_device; | ||
2425 | struct rndis_device *rndis_device; | ||
2426 | struct ndis_recv_scale_cap rsscap; | ||
2427 | @@ -1391,9 +1393,11 @@ struct netvsc_device *rndis_filter_device_add(struct hv_device *dev, | ||
2428 | /* We will use the given number of channels if available. */ | ||
2429 | net_device->num_chn = min(net_device->max_chn, device_info->num_chn); | ||
2430 | |||
2431 | - for (i = 0; i < ITAB_NUM; i++) | ||
2432 | - rndis_device->rx_table[i] = ethtool_rxfh_indir_default( | ||
2433 | + if (!netif_is_rxfh_configured(net)) { | ||
2434 | + for (i = 0; i < ITAB_NUM; i++) | ||
2435 | + ndc->rx_table[i] = ethtool_rxfh_indir_default( | ||
2436 | i, net_device->num_chn); | ||
2437 | + } | ||
2438 | |||
2439 | atomic_set(&net_device->open_chn, 1); | ||
2440 | vmbus_set_sc_create_callback(dev->channel, netvsc_sc_open); | ||
2441 | diff --git a/drivers/net/macvlan.c b/drivers/net/macvlan.c | ||
2442 | index 05631d97eeb4..747c0542a53c 100644 | ||
2443 | --- a/drivers/net/macvlan.c | ||
2444 | +++ b/drivers/net/macvlan.c | ||
2445 | @@ -259,7 +259,7 @@ static void macvlan_broadcast(struct sk_buff *skb, | ||
2446 | struct net_device *src, | ||
2447 | enum macvlan_mode mode) | ||
2448 | { | ||
2449 | - const struct ethhdr *eth = eth_hdr(skb); | ||
2450 | + const struct ethhdr *eth = skb_eth_hdr(skb); | ||
2451 | const struct macvlan_dev *vlan; | ||
2452 | struct sk_buff *nskb; | ||
2453 | unsigned int i; | ||
2454 | diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c | ||
2455 | index 0becc79fd431..3e5f2f7a155e 100644 | ||
2456 | --- a/drivers/net/usb/lan78xx.c | ||
2457 | +++ b/drivers/net/usb/lan78xx.c | ||
2458 | @@ -511,7 +511,7 @@ static int lan78xx_read_stats(struct lan78xx_net *dev, | ||
2459 | } | ||
2460 | } else { | ||
2461 | netdev_warn(dev->net, | ||
2462 | - "Failed to read stat ret = 0x%x", ret); | ||
2463 | + "Failed to read stat ret = %d", ret); | ||
2464 | } | ||
2465 | |||
2466 | kfree(stats); | ||
2467 | @@ -2724,11 +2724,6 @@ static int lan78xx_stop(struct net_device *net) | ||
2468 | return 0; | ||
2469 | } | ||
2470 | |||
2471 | -static int lan78xx_linearize(struct sk_buff *skb) | ||
2472 | -{ | ||
2473 | - return skb_linearize(skb); | ||
2474 | -} | ||
2475 | - | ||
2476 | static struct sk_buff *lan78xx_tx_prep(struct lan78xx_net *dev, | ||
2477 | struct sk_buff *skb, gfp_t flags) | ||
2478 | { | ||
2479 | @@ -2740,8 +2735,10 @@ static struct sk_buff *lan78xx_tx_prep(struct lan78xx_net *dev, | ||
2480 | return NULL; | ||
2481 | } | ||
2482 | |||
2483 | - if (lan78xx_linearize(skb) < 0) | ||
2484 | + if (skb_linearize(skb)) { | ||
2485 | + dev_kfree_skb_any(skb); | ||
2486 | return NULL; | ||
2487 | + } | ||
2488 | |||
2489 | tx_cmd_a = (u32)(skb->len & TX_CMD_A_LEN_MASK_) | TX_CMD_A_FCS_; | ||
2490 | |||
2491 | diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c | ||
2492 | index 404ac3a0d1c3..283dfeb406ad 100644 | ||
2493 | --- a/drivers/net/vxlan.c | ||
2494 | +++ b/drivers/net/vxlan.c | ||
2495 | @@ -2542,7 +2542,7 @@ static void vxlan_xmit_one(struct sk_buff *skb, struct net_device *dev, | ||
2496 | ndst = &rt->dst; | ||
2497 | skb_tunnel_check_pmtu(skb, ndst, VXLAN_HEADROOM); | ||
2498 | |||
2499 | - tos = ip_tunnel_ecn_encap(tos, old_iph, skb); | ||
2500 | + tos = ip_tunnel_ecn_encap(RT_TOS(tos), old_iph, skb); | ||
2501 | ttl = ttl ? : ip4_dst_hoplimit(&rt->dst); | ||
2502 | err = vxlan_build_skb(skb, ndst, sizeof(struct iphdr), | ||
2503 | vni, md, flags, udp_sum); | ||
2504 | @@ -2582,7 +2582,7 @@ static void vxlan_xmit_one(struct sk_buff *skb, struct net_device *dev, | ||
2505 | |||
2506 | skb_tunnel_check_pmtu(skb, ndst, VXLAN6_HEADROOM); | ||
2507 | |||
2508 | - tos = ip_tunnel_ecn_encap(tos, old_iph, skb); | ||
2509 | + tos = ip_tunnel_ecn_encap(RT_TOS(tos), old_iph, skb); | ||
2510 | ttl = ttl ? : ip6_dst_hoplimit(ndst); | ||
2511 | skb_scrub_packet(skb, xnet); | ||
2512 | err = vxlan_build_skb(skb, ndst, sizeof(struct ipv6hdr), | ||
2513 | diff --git a/drivers/net/wireless/marvell/mwifiex/tdls.c b/drivers/net/wireless/marvell/mwifiex/tdls.c | ||
2514 | index 09313047beed..7caf1d26124a 100644 | ||
2515 | --- a/drivers/net/wireless/marvell/mwifiex/tdls.c | ||
2516 | +++ b/drivers/net/wireless/marvell/mwifiex/tdls.c | ||
2517 | @@ -953,59 +953,117 @@ void mwifiex_process_tdls_action_frame(struct mwifiex_private *priv, | ||
2518 | |||
2519 | switch (*pos) { | ||
2520 | case WLAN_EID_SUPP_RATES: | ||
2521 | + if (pos[1] > 32) | ||
2522 | + return; | ||
2523 | sta_ptr->tdls_cap.rates_len = pos[1]; | ||
2524 | for (i = 0; i < pos[1]; i++) | ||
2525 | sta_ptr->tdls_cap.rates[i] = pos[i + 2]; | ||
2526 | break; | ||
2527 | |||
2528 | case WLAN_EID_EXT_SUPP_RATES: | ||
2529 | + if (pos[1] > 32) | ||
2530 | + return; | ||
2531 | basic = sta_ptr->tdls_cap.rates_len; | ||
2532 | + if (pos[1] > 32 - basic) | ||
2533 | + return; | ||
2534 | for (i = 0; i < pos[1]; i++) | ||
2535 | sta_ptr->tdls_cap.rates[basic + i] = pos[i + 2]; | ||
2536 | sta_ptr->tdls_cap.rates_len += pos[1]; | ||
2537 | break; | ||
2538 | case WLAN_EID_HT_CAPABILITY: | ||
2539 | - memcpy((u8 *)&sta_ptr->tdls_cap.ht_capb, pos, | ||
2540 | + if (pos > end - sizeof(struct ieee80211_ht_cap) - 2) | ||
2541 | + return; | ||
2542 | + if (pos[1] != sizeof(struct ieee80211_ht_cap)) | ||
2543 | + return; | ||
2544 | + /* copy the ie's value into ht_capb*/ | ||
2545 | + memcpy((u8 *)&sta_ptr->tdls_cap.ht_capb, pos + 2, | ||
2546 | sizeof(struct ieee80211_ht_cap)); | ||
2547 | sta_ptr->is_11n_enabled = 1; | ||
2548 | break; | ||
2549 | case WLAN_EID_HT_OPERATION: | ||
2550 | - memcpy(&sta_ptr->tdls_cap.ht_oper, pos, | ||
2551 | + if (pos > end - | ||
2552 | + sizeof(struct ieee80211_ht_operation) - 2) | ||
2553 | + return; | ||
2554 | + if (pos[1] != sizeof(struct ieee80211_ht_operation)) | ||
2555 | + return; | ||
2556 | + /* copy the ie's value into ht_oper*/ | ||
2557 | + memcpy(&sta_ptr->tdls_cap.ht_oper, pos + 2, | ||
2558 | sizeof(struct ieee80211_ht_operation)); | ||
2559 | break; | ||
2560 | case WLAN_EID_BSS_COEX_2040: | ||
2561 | + if (pos > end - 3) | ||
2562 | + return; | ||
2563 | + if (pos[1] != 1) | ||
2564 | + return; | ||
2565 | sta_ptr->tdls_cap.coex_2040 = pos[2]; | ||
2566 | break; | ||
2567 | case WLAN_EID_EXT_CAPABILITY: | ||
2568 | + if (pos > end - sizeof(struct ieee_types_header)) | ||
2569 | + return; | ||
2570 | + if (pos[1] < sizeof(struct ieee_types_header)) | ||
2571 | + return; | ||
2572 | + if (pos[1] > 8) | ||
2573 | + return; | ||
2574 | memcpy((u8 *)&sta_ptr->tdls_cap.extcap, pos, | ||
2575 | sizeof(struct ieee_types_header) + | ||
2576 | min_t(u8, pos[1], 8)); | ||
2577 | break; | ||
2578 | case WLAN_EID_RSN: | ||
2579 | + if (pos > end - sizeof(struct ieee_types_header)) | ||
2580 | + return; | ||
2581 | + if (pos[1] < sizeof(struct ieee_types_header)) | ||
2582 | + return; | ||
2583 | + if (pos[1] > IEEE_MAX_IE_SIZE - | ||
2584 | + sizeof(struct ieee_types_header)) | ||
2585 | + return; | ||
2586 | memcpy((u8 *)&sta_ptr->tdls_cap.rsn_ie, pos, | ||
2587 | sizeof(struct ieee_types_header) + | ||
2588 | min_t(u8, pos[1], IEEE_MAX_IE_SIZE - | ||
2589 | sizeof(struct ieee_types_header))); | ||
2590 | break; | ||
2591 | case WLAN_EID_QOS_CAPA: | ||
2592 | + if (pos > end - 3) | ||
2593 | + return; | ||
2594 | + if (pos[1] != 1) | ||
2595 | + return; | ||
2596 | sta_ptr->tdls_cap.qos_info = pos[2]; | ||
2597 | break; | ||
2598 | case WLAN_EID_VHT_OPERATION: | ||
2599 | - if (priv->adapter->is_hw_11ac_capable) | ||
2600 | - memcpy(&sta_ptr->tdls_cap.vhtoper, pos, | ||
2601 | + if (priv->adapter->is_hw_11ac_capable) { | ||
2602 | + if (pos > end - | ||
2603 | + sizeof(struct ieee80211_vht_operation) - 2) | ||
2604 | + return; | ||
2605 | + if (pos[1] != | ||
2606 | + sizeof(struct ieee80211_vht_operation)) | ||
2607 | + return; | ||
2608 | + /* copy the ie's value into vhtoper*/ | ||
2609 | + memcpy(&sta_ptr->tdls_cap.vhtoper, pos + 2, | ||
2610 | sizeof(struct ieee80211_vht_operation)); | ||
2611 | + } | ||
2612 | break; | ||
2613 | case WLAN_EID_VHT_CAPABILITY: | ||
2614 | if (priv->adapter->is_hw_11ac_capable) { | ||
2615 | - memcpy((u8 *)&sta_ptr->tdls_cap.vhtcap, pos, | ||
2616 | + if (pos > end - | ||
2617 | + sizeof(struct ieee80211_vht_cap) - 2) | ||
2618 | + return; | ||
2619 | + if (pos[1] != sizeof(struct ieee80211_vht_cap)) | ||
2620 | + return; | ||
2621 | + /* copy the ie's value into vhtcap*/ | ||
2622 | + memcpy((u8 *)&sta_ptr->tdls_cap.vhtcap, pos + 2, | ||
2623 | sizeof(struct ieee80211_vht_cap)); | ||
2624 | sta_ptr->is_11ac_enabled = 1; | ||
2625 | } | ||
2626 | break; | ||
2627 | case WLAN_EID_AID: | ||
2628 | - if (priv->adapter->is_hw_11ac_capable) | ||
2629 | + if (priv->adapter->is_hw_11ac_capable) { | ||
2630 | + if (pos > end - 4) | ||
2631 | + return; | ||
2632 | + if (pos[1] != 2) | ||
2633 | + return; | ||
2634 | sta_ptr->tdls_cap.aid = | ||
2635 | get_unaligned_le16((pos + 2)); | ||
2636 | + } | ||
2637 | + break; | ||
2638 | default: | ||
2639 | break; | ||
2640 | } | ||
2641 | diff --git a/drivers/perf/arm_smmuv3_pmu.c b/drivers/perf/arm_smmuv3_pmu.c | ||
2642 | index abcf54f7d19c..191f410cf35c 100644 | ||
2643 | --- a/drivers/perf/arm_smmuv3_pmu.c | ||
2644 | +++ b/drivers/perf/arm_smmuv3_pmu.c | ||
2645 | @@ -815,7 +815,7 @@ static int smmu_pmu_probe(struct platform_device *pdev) | ||
2646 | if (err) { | ||
2647 | dev_err(dev, "Error %d registering hotplug, PMU @%pa\n", | ||
2648 | err, &res_0->start); | ||
2649 | - goto out_cpuhp_err; | ||
2650 | + return err; | ||
2651 | } | ||
2652 | |||
2653 | err = perf_pmu_register(&smmu_pmu->pmu, name, -1); | ||
2654 | @@ -834,8 +834,6 @@ static int smmu_pmu_probe(struct platform_device *pdev) | ||
2655 | |||
2656 | out_unregister: | ||
2657 | cpuhp_state_remove_instance_nocalls(cpuhp_state_num, &smmu_pmu->node); | ||
2658 | -out_cpuhp_err: | ||
2659 | - put_cpu(); | ||
2660 | return err; | ||
2661 | } | ||
2662 | |||
2663 | diff --git a/drivers/pinctrl/aspeed/pinctrl-aspeed-g6.c b/drivers/pinctrl/aspeed/pinctrl-aspeed-g6.c | ||
2664 | index c6800d220920..bb07024d22ed 100644 | ||
2665 | --- a/drivers/pinctrl/aspeed/pinctrl-aspeed-g6.c | ||
2666 | +++ b/drivers/pinctrl/aspeed/pinctrl-aspeed-g6.c | ||
2667 | @@ -1088,60 +1088,52 @@ SSSF_PIN_DECL(AF15, GPIOV7, LPCSMI, SIG_DESC_SET(SCU434, 15)); | ||
2668 | |||
2669 | #define AB7 176 | ||
2670 | SIG_EXPR_LIST_DECL_SESG(AB7, LAD0, LPC, SIG_DESC_SET(SCU434, 16), | ||
2671 | - SIG_DESC_CLEAR(SCU510, 6)); | ||
2672 | -SIG_EXPR_LIST_DECL_SESG(AB7, ESPID0, ESPI, SIG_DESC_SET(SCU434, 16), | ||
2673 | SIG_DESC_SET(SCU510, 6)); | ||
2674 | +SIG_EXPR_LIST_DECL_SESG(AB7, ESPID0, ESPI, SIG_DESC_SET(SCU434, 16)); | ||
2675 | PIN_DECL_2(AB7, GPIOW0, LAD0, ESPID0); | ||
2676 | |||
2677 | #define AB8 177 | ||
2678 | SIG_EXPR_LIST_DECL_SESG(AB8, LAD1, LPC, SIG_DESC_SET(SCU434, 17), | ||
2679 | - SIG_DESC_CLEAR(SCU510, 6)); | ||
2680 | -SIG_EXPR_LIST_DECL_SESG(AB8, ESPID1, ESPI, SIG_DESC_SET(SCU434, 17), | ||
2681 | SIG_DESC_SET(SCU510, 6)); | ||
2682 | +SIG_EXPR_LIST_DECL_SESG(AB8, ESPID1, ESPI, SIG_DESC_SET(SCU434, 17)); | ||
2683 | PIN_DECL_2(AB8, GPIOW1, LAD1, ESPID1); | ||
2684 | |||
2685 | #define AC8 178 | ||
2686 | SIG_EXPR_LIST_DECL_SESG(AC8, LAD2, LPC, SIG_DESC_SET(SCU434, 18), | ||
2687 | - SIG_DESC_CLEAR(SCU510, 6)); | ||
2688 | -SIG_EXPR_LIST_DECL_SESG(AC8, ESPID2, ESPI, SIG_DESC_SET(SCU434, 18), | ||
2689 | SIG_DESC_SET(SCU510, 6)); | ||
2690 | +SIG_EXPR_LIST_DECL_SESG(AC8, ESPID2, ESPI, SIG_DESC_SET(SCU434, 18)); | ||
2691 | PIN_DECL_2(AC8, GPIOW2, LAD2, ESPID2); | ||
2692 | |||
2693 | #define AC7 179 | ||
2694 | SIG_EXPR_LIST_DECL_SESG(AC7, LAD3, LPC, SIG_DESC_SET(SCU434, 19), | ||
2695 | - SIG_DESC_CLEAR(SCU510, 6)); | ||
2696 | -SIG_EXPR_LIST_DECL_SESG(AC7, ESPID3, ESPI, SIG_DESC_SET(SCU434, 19), | ||
2697 | SIG_DESC_SET(SCU510, 6)); | ||
2698 | +SIG_EXPR_LIST_DECL_SESG(AC7, ESPID3, ESPI, SIG_DESC_SET(SCU434, 19)); | ||
2699 | PIN_DECL_2(AC7, GPIOW3, LAD3, ESPID3); | ||
2700 | |||
2701 | #define AE7 180 | ||
2702 | SIG_EXPR_LIST_DECL_SESG(AE7, LCLK, LPC, SIG_DESC_SET(SCU434, 20), | ||
2703 | - SIG_DESC_CLEAR(SCU510, 6)); | ||
2704 | -SIG_EXPR_LIST_DECL_SESG(AE7, ESPICK, ESPI, SIG_DESC_SET(SCU434, 20), | ||
2705 | SIG_DESC_SET(SCU510, 6)); | ||
2706 | +SIG_EXPR_LIST_DECL_SESG(AE7, ESPICK, ESPI, SIG_DESC_SET(SCU434, 20)); | ||
2707 | PIN_DECL_2(AE7, GPIOW4, LCLK, ESPICK); | ||
2708 | |||
2709 | #define AF7 181 | ||
2710 | SIG_EXPR_LIST_DECL_SESG(AF7, LFRAME, LPC, SIG_DESC_SET(SCU434, 21), | ||
2711 | - SIG_DESC_CLEAR(SCU510, 6)); | ||
2712 | -SIG_EXPR_LIST_DECL_SESG(AF7, ESPICS, ESPI, SIG_DESC_SET(SCU434, 21), | ||
2713 | SIG_DESC_SET(SCU510, 6)); | ||
2714 | +SIG_EXPR_LIST_DECL_SESG(AF7, ESPICS, ESPI, SIG_DESC_SET(SCU434, 21)); | ||
2715 | PIN_DECL_2(AF7, GPIOW5, LFRAME, ESPICS); | ||
2716 | |||
2717 | #define AD7 182 | ||
2718 | SIG_EXPR_LIST_DECL_SESG(AD7, LSIRQ, LSIRQ, SIG_DESC_SET(SCU434, 22), | ||
2719 | - SIG_DESC_CLEAR(SCU510, 6)); | ||
2720 | -SIG_EXPR_LIST_DECL_SESG(AD7, ESPIALT, ESPIALT, SIG_DESC_SET(SCU434, 22), | ||
2721 | SIG_DESC_SET(SCU510, 6)); | ||
2722 | +SIG_EXPR_LIST_DECL_SESG(AD7, ESPIALT, ESPIALT, SIG_DESC_SET(SCU434, 22)); | ||
2723 | PIN_DECL_2(AD7, GPIOW6, LSIRQ, ESPIALT); | ||
2724 | FUNC_GROUP_DECL(LSIRQ, AD7); | ||
2725 | FUNC_GROUP_DECL(ESPIALT, AD7); | ||
2726 | |||
2727 | #define AD8 183 | ||
2728 | SIG_EXPR_LIST_DECL_SESG(AD8, LPCRST, LPC, SIG_DESC_SET(SCU434, 23), | ||
2729 | - SIG_DESC_CLEAR(SCU510, 6)); | ||
2730 | -SIG_EXPR_LIST_DECL_SESG(AD8, ESPIRST, ESPI, SIG_DESC_SET(SCU434, 23), | ||
2731 | SIG_DESC_SET(SCU510, 6)); | ||
2732 | +SIG_EXPR_LIST_DECL_SESG(AD8, ESPIRST, ESPI, SIG_DESC_SET(SCU434, 23)); | ||
2733 | PIN_DECL_2(AD8, GPIOW7, LPCRST, ESPIRST); | ||
2734 | |||
2735 | FUNC_GROUP_DECL(LPC, AB7, AB8, AC8, AC7, AE7, AF7, AD8); | ||
2736 | diff --git a/drivers/pinctrl/pinmux.c b/drivers/pinctrl/pinmux.c | ||
2737 | index e914f6efd39e..9503ddf2edc7 100644 | ||
2738 | --- a/drivers/pinctrl/pinmux.c | ||
2739 | +++ b/drivers/pinctrl/pinmux.c | ||
2740 | @@ -85,7 +85,7 @@ bool pinmux_can_be_used_for_gpio(struct pinctrl_dev *pctldev, unsigned pin) | ||
2741 | const struct pinmux_ops *ops = pctldev->desc->pmxops; | ||
2742 | |||
2743 | /* Can't inspect pin, assume it can be used */ | ||
2744 | - if (!desc) | ||
2745 | + if (!desc || !ops) | ||
2746 | return true; | ||
2747 | |||
2748 | if (ops->strict && desc->mux_usecount) | ||
2749 | diff --git a/drivers/platform/x86/pcengines-apuv2.c b/drivers/platform/x86/pcengines-apuv2.c | ||
2750 | index 48b112b4f0b0..c32daf087640 100644 | ||
2751 | --- a/drivers/platform/x86/pcengines-apuv2.c | ||
2752 | +++ b/drivers/platform/x86/pcengines-apuv2.c | ||
2753 | @@ -95,7 +95,7 @@ static struct gpiod_lookup_table gpios_led_table = { | ||
2754 | NULL, 1, GPIO_ACTIVE_LOW), | ||
2755 | GPIO_LOOKUP_IDX(AMD_FCH_GPIO_DRIVER_NAME, APU2_GPIO_LINE_LED3, | ||
2756 | NULL, 2, GPIO_ACTIVE_LOW), | ||
2757 | - GPIO_LOOKUP_IDX(AMD_FCH_GPIO_DRIVER_NAME, APU2_GPIO_REG_SIMSWAP, | ||
2758 | + GPIO_LOOKUP_IDX(AMD_FCH_GPIO_DRIVER_NAME, APU2_GPIO_LINE_SIMSWAP, | ||
2759 | NULL, 3, GPIO_ACTIVE_LOW), | ||
2760 | } | ||
2761 | }; | ||
2762 | diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c | ||
2763 | index 87bc06b386a0..1dba0bdf3762 100644 | ||
2764 | --- a/drivers/regulator/core.c | ||
2765 | +++ b/drivers/regulator/core.c | ||
2766 | @@ -1937,8 +1937,8 @@ struct regulator *_regulator_get(struct device *dev, const char *id, | ||
2767 | regulator = create_regulator(rdev, dev, id); | ||
2768 | if (regulator == NULL) { | ||
2769 | regulator = ERR_PTR(-ENOMEM); | ||
2770 | - put_device(&rdev->dev); | ||
2771 | module_put(rdev->owner); | ||
2772 | + put_device(&rdev->dev); | ||
2773 | return regulator; | ||
2774 | } | ||
2775 | |||
2776 | @@ -2059,13 +2059,13 @@ static void _regulator_put(struct regulator *regulator) | ||
2777 | |||
2778 | rdev->open_count--; | ||
2779 | rdev->exclusive = 0; | ||
2780 | - put_device(&rdev->dev); | ||
2781 | regulator_unlock(rdev); | ||
2782 | |||
2783 | kfree_const(regulator->supply_name); | ||
2784 | kfree(regulator); | ||
2785 | |||
2786 | module_put(rdev->owner); | ||
2787 | + put_device(&rdev->dev); | ||
2788 | } | ||
2789 | |||
2790 | /** | ||
2791 | @@ -4992,6 +4992,7 @@ regulator_register(const struct regulator_desc *regulator_desc, | ||
2792 | struct regulator_dev *rdev; | ||
2793 | bool dangling_cfg_gpiod = false; | ||
2794 | bool dangling_of_gpiod = false; | ||
2795 | + bool reg_device_fail = false; | ||
2796 | struct device *dev; | ||
2797 | int ret, i; | ||
2798 | |||
2799 | @@ -5177,7 +5178,7 @@ regulator_register(const struct regulator_desc *regulator_desc, | ||
2800 | dev_set_drvdata(&rdev->dev, rdev); | ||
2801 | ret = device_register(&rdev->dev); | ||
2802 | if (ret != 0) { | ||
2803 | - put_device(&rdev->dev); | ||
2804 | + reg_device_fail = true; | ||
2805 | goto unset_supplies; | ||
2806 | } | ||
2807 | |||
2808 | @@ -5208,7 +5209,10 @@ wash: | ||
2809 | clean: | ||
2810 | if (dangling_of_gpiod) | ||
2811 | gpiod_put(config->ena_gpiod); | ||
2812 | - kfree(rdev); | ||
2813 | + if (reg_device_fail) | ||
2814 | + put_device(&rdev->dev); | ||
2815 | + else | ||
2816 | + kfree(rdev); | ||
2817 | kfree(config); | ||
2818 | rinse: | ||
2819 | if (dangling_cfg_gpiod) | ||
2820 | diff --git a/drivers/regulator/rn5t618-regulator.c b/drivers/regulator/rn5t618-regulator.c | ||
2821 | index eb807a059479..aa6e7c5341ce 100644 | ||
2822 | --- a/drivers/regulator/rn5t618-regulator.c | ||
2823 | +++ b/drivers/regulator/rn5t618-regulator.c | ||
2824 | @@ -148,6 +148,7 @@ static struct platform_driver rn5t618_regulator_driver = { | ||
2825 | |||
2826 | module_platform_driver(rn5t618_regulator_driver); | ||
2827 | |||
2828 | +MODULE_ALIAS("platform:rn5t618-regulator"); | ||
2829 | MODULE_AUTHOR("Beniamino Galvani <b.galvani@gmail.com>"); | ||
2830 | MODULE_DESCRIPTION("RN5T618 regulator driver"); | ||
2831 | MODULE_LICENSE("GPL v2"); | ||
2832 | diff --git a/drivers/reset/core.c b/drivers/reset/core.c | ||
2833 | index 3c9a64c1b7a8..f343bd814d32 100644 | ||
2834 | --- a/drivers/reset/core.c | ||
2835 | +++ b/drivers/reset/core.c | ||
2836 | @@ -787,7 +787,7 @@ struct reset_control *__devm_reset_control_get(struct device *dev, | ||
2837 | return ERR_PTR(-ENOMEM); | ||
2838 | |||
2839 | rstc = __reset_control_get(dev, id, index, shared, optional, acquired); | ||
2840 | - if (!IS_ERR(rstc)) { | ||
2841 | + if (!IS_ERR_OR_NULL(rstc)) { | ||
2842 | *ptr = rstc; | ||
2843 | devres_add(dev, ptr); | ||
2844 | } else { | ||
2845 | @@ -930,7 +930,7 @@ devm_reset_control_array_get(struct device *dev, bool shared, bool optional) | ||
2846 | return ERR_PTR(-ENOMEM); | ||
2847 | |||
2848 | rstc = of_reset_control_array_get(dev->of_node, shared, optional, true); | ||
2849 | - if (IS_ERR(rstc)) { | ||
2850 | + if (IS_ERR_OR_NULL(rstc)) { | ||
2851 | devres_free(devres); | ||
2852 | return rstc; | ||
2853 | } | ||
2854 | diff --git a/drivers/s390/block/dasd_eckd.c b/drivers/s390/block/dasd_eckd.c | ||
2855 | index c94184d080f8..a28b9ff82378 100644 | ||
2856 | --- a/drivers/s390/block/dasd_eckd.c | ||
2857 | +++ b/drivers/s390/block/dasd_eckd.c | ||
2858 | @@ -1128,7 +1128,8 @@ static u32 get_fcx_max_data(struct dasd_device *device) | ||
2859 | { | ||
2860 | struct dasd_eckd_private *private = device->private; | ||
2861 | int fcx_in_css, fcx_in_gneq, fcx_in_features; | ||
2862 | - int tpm, mdc; | ||
2863 | + unsigned int mdc; | ||
2864 | + int tpm; | ||
2865 | |||
2866 | if (dasd_nofcx) | ||
2867 | return 0; | ||
2868 | @@ -1142,7 +1143,7 @@ static u32 get_fcx_max_data(struct dasd_device *device) | ||
2869 | return 0; | ||
2870 | |||
2871 | mdc = ccw_device_get_mdc(device->cdev, 0); | ||
2872 | - if (mdc < 0) { | ||
2873 | + if (mdc == 0) { | ||
2874 | dev_warn(&device->cdev->dev, "Detecting the maximum supported data size for zHPF requests failed\n"); | ||
2875 | return 0; | ||
2876 | } else { | ||
2877 | @@ -1153,12 +1154,12 @@ static u32 get_fcx_max_data(struct dasd_device *device) | ||
2878 | static int verify_fcx_max_data(struct dasd_device *device, __u8 lpm) | ||
2879 | { | ||
2880 | struct dasd_eckd_private *private = device->private; | ||
2881 | - int mdc; | ||
2882 | + unsigned int mdc; | ||
2883 | u32 fcx_max_data; | ||
2884 | |||
2885 | if (private->fcx_max_data) { | ||
2886 | mdc = ccw_device_get_mdc(device->cdev, lpm); | ||
2887 | - if ((mdc < 0)) { | ||
2888 | + if (mdc == 0) { | ||
2889 | dev_warn(&device->cdev->dev, | ||
2890 | "Detecting the maximum data size for zHPF " | ||
2891 | "requests failed (rc=%d) for a new path %x\n", | ||
2892 | @@ -2073,7 +2074,7 @@ out_err2: | ||
2893 | dasd_free_block(device->block); | ||
2894 | device->block = NULL; | ||
2895 | out_err1: | ||
2896 | - kfree(private->conf_data); | ||
2897 | + dasd_eckd_clear_conf_data(device); | ||
2898 | kfree(device->private); | ||
2899 | device->private = NULL; | ||
2900 | return rc; | ||
2901 | @@ -2082,7 +2083,6 @@ out_err1: | ||
2902 | static void dasd_eckd_uncheck_device(struct dasd_device *device) | ||
2903 | { | ||
2904 | struct dasd_eckd_private *private = device->private; | ||
2905 | - int i; | ||
2906 | |||
2907 | if (!private) | ||
2908 | return; | ||
2909 | @@ -2092,21 +2092,7 @@ static void dasd_eckd_uncheck_device(struct dasd_device *device) | ||
2910 | private->sneq = NULL; | ||
2911 | private->vdsneq = NULL; | ||
2912 | private->gneq = NULL; | ||
2913 | - private->conf_len = 0; | ||
2914 | - for (i = 0; i < 8; i++) { | ||
2915 | - kfree(device->path[i].conf_data); | ||
2916 | - if ((__u8 *)device->path[i].conf_data == | ||
2917 | - private->conf_data) { | ||
2918 | - private->conf_data = NULL; | ||
2919 | - private->conf_len = 0; | ||
2920 | - } | ||
2921 | - device->path[i].conf_data = NULL; | ||
2922 | - device->path[i].cssid = 0; | ||
2923 | - device->path[i].ssid = 0; | ||
2924 | - device->path[i].chpid = 0; | ||
2925 | - } | ||
2926 | - kfree(private->conf_data); | ||
2927 | - private->conf_data = NULL; | ||
2928 | + dasd_eckd_clear_conf_data(device); | ||
2929 | } | ||
2930 | |||
2931 | static struct dasd_ccw_req * | ||
2932 | diff --git a/drivers/s390/cio/device_ops.c b/drivers/s390/cio/device_ops.c | ||
2933 | index 65841af15748..ccecf6b9504e 100644 | ||
2934 | --- a/drivers/s390/cio/device_ops.c | ||
2935 | +++ b/drivers/s390/cio/device_ops.c | ||
2936 | @@ -635,7 +635,7 @@ EXPORT_SYMBOL(ccw_device_tm_start_timeout); | ||
2937 | * @mask: mask of paths to use | ||
2938 | * | ||
2939 | * Return the number of 64K-bytes blocks all paths at least support | ||
2940 | - * for a transport command. Return values <= 0 indicate failures. | ||
2941 | + * for a transport command. Return value 0 indicates failure. | ||
2942 | */ | ||
2943 | int ccw_device_get_mdc(struct ccw_device *cdev, u8 mask) | ||
2944 | { | ||
2945 | diff --git a/drivers/s390/net/qeth_core_main.c b/drivers/s390/net/qeth_core_main.c | ||
2946 | index 83794d7494d4..9df47421d69c 100644 | ||
2947 | --- a/drivers/s390/net/qeth_core_main.c | ||
2948 | +++ b/drivers/s390/net/qeth_core_main.c | ||
2949 | @@ -653,17 +653,17 @@ static int qeth_check_idx_response(struct qeth_card *card, | ||
2950 | unsigned char *buffer) | ||
2951 | { | ||
2952 | QETH_DBF_HEX(CTRL, 2, buffer, QETH_DBF_CTRL_LEN); | ||
2953 | - if ((buffer[2] & 0xc0) == 0xc0) { | ||
2954 | + if ((buffer[2] & QETH_IDX_TERMINATE_MASK) == QETH_IDX_TERMINATE) { | ||
2955 | QETH_DBF_MESSAGE(2, "received an IDX TERMINATE with cause code %#04x\n", | ||
2956 | buffer[4]); | ||
2957 | QETH_CARD_TEXT(card, 2, "ckidxres"); | ||
2958 | QETH_CARD_TEXT(card, 2, " idxterm"); | ||
2959 | - QETH_CARD_TEXT_(card, 2, " rc%d", -EIO); | ||
2960 | - if (buffer[4] == 0xf6) { | ||
2961 | + QETH_CARD_TEXT_(card, 2, "rc%x", buffer[4]); | ||
2962 | + if (buffer[4] == QETH_IDX_TERM_BAD_TRANSPORT || | ||
2963 | + buffer[4] == QETH_IDX_TERM_BAD_TRANSPORT_VM) { | ||
2964 | dev_err(&card->gdev->dev, | ||
2965 | - "The qeth device is not configured " | ||
2966 | - "for the OSI layer required by z/VM\n"); | ||
2967 | - return -EPERM; | ||
2968 | + "The device does not support the configured transport mode\n"); | ||
2969 | + return -EPROTONOSUPPORT; | ||
2970 | } | ||
2971 | return -EIO; | ||
2972 | } | ||
2973 | @@ -740,10 +740,10 @@ static void qeth_issue_next_read_cb(struct qeth_card *card, | ||
2974 | case 0: | ||
2975 | break; | ||
2976 | case -EIO: | ||
2977 | - qeth_clear_ipacmd_list(card); | ||
2978 | qeth_schedule_recovery(card); | ||
2979 | /* fall through */ | ||
2980 | default: | ||
2981 | + qeth_clear_ipacmd_list(card); | ||
2982 | goto out; | ||
2983 | } | ||
2984 | |||
2985 | diff --git a/drivers/s390/net/qeth_core_mpc.h b/drivers/s390/net/qeth_core_mpc.h | ||
2986 | index 6420b58cf42b..b7c17b5c823b 100644 | ||
2987 | --- a/drivers/s390/net/qeth_core_mpc.h | ||
2988 | +++ b/drivers/s390/net/qeth_core_mpc.h | ||
2989 | @@ -912,6 +912,11 @@ extern unsigned char IDX_ACTIVATE_WRITE[]; | ||
2990 | #define QETH_IDX_ACT_ERR_AUTH 0x1E | ||
2991 | #define QETH_IDX_ACT_ERR_AUTH_USER 0x20 | ||
2992 | |||
2993 | +#define QETH_IDX_TERMINATE 0xc0 | ||
2994 | +#define QETH_IDX_TERMINATE_MASK 0xc0 | ||
2995 | +#define QETH_IDX_TERM_BAD_TRANSPORT 0x41 | ||
2996 | +#define QETH_IDX_TERM_BAD_TRANSPORT_VM 0xf6 | ||
2997 | + | ||
2998 | #define PDU_ENCAPSULATION(buffer) \ | ||
2999 | (buffer + *(buffer + (*(buffer + 0x0b)) + \ | ||
3000 | *(buffer + *(buffer + 0x0b) + 0x11) + 0x07)) | ||
3001 | diff --git a/drivers/s390/net/qeth_core_sys.c b/drivers/s390/net/qeth_core_sys.c | ||
3002 | index 9f392497d570..4c3e222e5572 100644 | ||
3003 | --- a/drivers/s390/net/qeth_core_sys.c | ||
3004 | +++ b/drivers/s390/net/qeth_core_sys.c | ||
3005 | @@ -227,7 +227,7 @@ static ssize_t qeth_dev_prioqing_store(struct device *dev, | ||
3006 | card->qdio.default_out_queue = QETH_DEFAULT_QUEUE; | ||
3007 | } else if (sysfs_streq(buf, "prio_queueing_vlan")) { | ||
3008 | if (IS_LAYER3(card)) { | ||
3009 | - rc = -ENOTSUPP; | ||
3010 | + rc = -EOPNOTSUPP; | ||
3011 | goto out; | ||
3012 | } | ||
3013 | card->qdio.do_prio_queueing = QETH_PRIO_Q_ING_VLAN; | ||
3014 | diff --git a/drivers/s390/net/qeth_l2_main.c b/drivers/s390/net/qeth_l2_main.c | ||
3015 | index 4bccdce19b5a..8b7d911dccd8 100644 | ||
3016 | --- a/drivers/s390/net/qeth_l2_main.c | ||
3017 | +++ b/drivers/s390/net/qeth_l2_main.c | ||
3018 | @@ -295,6 +295,7 @@ static void qeth_l2_stop_card(struct qeth_card *card) | ||
3019 | |||
3020 | flush_workqueue(card->event_wq); | ||
3021 | card->info.mac_bits &= ~QETH_LAYER2_MAC_REGISTERED; | ||
3022 | + card->info.promisc_mode = 0; | ||
3023 | } | ||
3024 | |||
3025 | static int qeth_l2_process_inbound_buffer(struct qeth_card *card, | ||
3026 | diff --git a/drivers/s390/net/qeth_l2_sys.c b/drivers/s390/net/qeth_l2_sys.c | ||
3027 | index e2bcb26105a3..fc7101ad84de 100644 | ||
3028 | --- a/drivers/s390/net/qeth_l2_sys.c | ||
3029 | +++ b/drivers/s390/net/qeth_l2_sys.c | ||
3030 | @@ -279,7 +279,8 @@ void qeth_l2_setup_bridgeport_attrs(struct qeth_card *card) | ||
3031 | return; | ||
3032 | |||
3033 | mutex_lock(&card->sbp_lock); | ||
3034 | - if (card->options.sbp.role != QETH_SBP_ROLE_NONE) { | ||
3035 | + if (!card->options.sbp.reflect_promisc && | ||
3036 | + card->options.sbp.role != QETH_SBP_ROLE_NONE) { | ||
3037 | /* Conditional to avoid spurious error messages */ | ||
3038 | qeth_bridgeport_setrole(card, card->options.sbp.role); | ||
3039 | /* Let the callback function refresh the stored role value. */ | ||
3040 | diff --git a/drivers/s390/net/qeth_l3_main.c b/drivers/s390/net/qeth_l3_main.c | ||
3041 | index d7bfc7a0e4c0..32385327539b 100644 | ||
3042 | --- a/drivers/s390/net/qeth_l3_main.c | ||
3043 | +++ b/drivers/s390/net/qeth_l3_main.c | ||
3044 | @@ -1433,6 +1433,7 @@ static void qeth_l3_stop_card(struct qeth_card *card) | ||
3045 | } | ||
3046 | |||
3047 | flush_workqueue(card->event_wq); | ||
3048 | + card->info.promisc_mode = 0; | ||
3049 | } | ||
3050 | |||
3051 | static void qeth_l3_set_promisc_mode(struct qeth_card *card) | ||
3052 | diff --git a/drivers/spi/spi-cavium-thunderx.c b/drivers/spi/spi-cavium-thunderx.c | ||
3053 | index d12e149f1a41..fd6b9caffaf0 100644 | ||
3054 | --- a/drivers/spi/spi-cavium-thunderx.c | ||
3055 | +++ b/drivers/spi/spi-cavium-thunderx.c | ||
3056 | @@ -82,6 +82,7 @@ static int thunderx_spi_probe(struct pci_dev *pdev, | ||
3057 | |||
3058 | error: | ||
3059 | clk_disable_unprepare(p->clk); | ||
3060 | + pci_release_regions(pdev); | ||
3061 | spi_master_put(master); | ||
3062 | return ret; | ||
3063 | } | ||
3064 | @@ -96,6 +97,7 @@ static void thunderx_spi_remove(struct pci_dev *pdev) | ||
3065 | return; | ||
3066 | |||
3067 | clk_disable_unprepare(p->clk); | ||
3068 | + pci_release_regions(pdev); | ||
3069 | /* Put everything in a known state. */ | ||
3070 | writeq(0, p->register_base + OCTEON_SPI_CFG(p)); | ||
3071 | } | ||
3072 | diff --git a/drivers/spi/spi-fsl-spi.c b/drivers/spi/spi-fsl-spi.c | ||
3073 | index 2d563874b4ac..be7c6ba73072 100644 | ||
3074 | --- a/drivers/spi/spi-fsl-spi.c | ||
3075 | +++ b/drivers/spi/spi-fsl-spi.c | ||
3076 | @@ -612,6 +612,7 @@ static struct spi_master * fsl_spi_probe(struct device *dev, | ||
3077 | master->setup = fsl_spi_setup; | ||
3078 | master->cleanup = fsl_spi_cleanup; | ||
3079 | master->transfer_one_message = fsl_spi_do_one_msg; | ||
3080 | + master->use_gpio_descriptors = true; | ||
3081 | |||
3082 | mpc8xxx_spi = spi_master_get_devdata(master); | ||
3083 | mpc8xxx_spi->max_bits_per_word = 32; | ||
3084 | @@ -728,8 +729,18 @@ static int of_fsl_spi_probe(struct platform_device *ofdev) | ||
3085 | } | ||
3086 | } | ||
3087 | #endif | ||
3088 | - | ||
3089 | - pdata->cs_control = fsl_spi_cs_control; | ||
3090 | + /* | ||
3091 | + * Handle the case where we have one hardwired (always selected) | ||
3092 | + * device on the first "chipselect". Else we let the core code | ||
3093 | + * handle any GPIOs or native chip selects and assign the | ||
3094 | + * appropriate callback for dealing with the CS lines. This isn't | ||
3095 | + * supported on the GRLIB variant. | ||
3096 | + */ | ||
3097 | + ret = gpiod_count(dev, "cs"); | ||
3098 | + if (ret <= 0) | ||
3099 | + pdata->max_chipselect = 1; | ||
3100 | + else | ||
3101 | + pdata->cs_control = fsl_spi_cs_control; | ||
3102 | } | ||
3103 | |||
3104 | ret = of_address_to_resource(np, 0, &mem); | ||
3105 | diff --git a/drivers/spi/spi-nxp-fspi.c b/drivers/spi/spi-nxp-fspi.c | ||
3106 | index 501b923f2c27..28ae5229f889 100644 | ||
3107 | --- a/drivers/spi/spi-nxp-fspi.c | ||
3108 | +++ b/drivers/spi/spi-nxp-fspi.c | ||
3109 | @@ -439,7 +439,7 @@ static bool nxp_fspi_supports_op(struct spi_mem *mem, | ||
3110 | op->data.nbytes > f->devtype_data->txfifo) | ||
3111 | return false; | ||
3112 | |||
3113 | - return true; | ||
3114 | + return spi_mem_default_supports_op(mem, op); | ||
3115 | } | ||
3116 | |||
3117 | /* Instead of busy looping invoke readl_poll_timeout functionality. */ | ||
3118 | diff --git a/drivers/spi/spi-pxa2xx.c b/drivers/spi/spi-pxa2xx.c | ||
3119 | index 2e73d75a6ac5..ae95ec0bc964 100644 | ||
3120 | --- a/drivers/spi/spi-pxa2xx.c | ||
3121 | +++ b/drivers/spi/spi-pxa2xx.c | ||
3122 | @@ -1441,6 +1441,10 @@ static const struct pci_device_id pxa2xx_spi_pci_compound_match[] = { | ||
3123 | { PCI_VDEVICE(INTEL, 0x4b2a), LPSS_BXT_SSP }, | ||
3124 | { PCI_VDEVICE(INTEL, 0x4b2b), LPSS_BXT_SSP }, | ||
3125 | { PCI_VDEVICE(INTEL, 0x4b37), LPSS_BXT_SSP }, | ||
3126 | + /* JSL */ | ||
3127 | + { PCI_VDEVICE(INTEL, 0x4daa), LPSS_CNL_SSP }, | ||
3128 | + { PCI_VDEVICE(INTEL, 0x4dab), LPSS_CNL_SSP }, | ||
3129 | + { PCI_VDEVICE(INTEL, 0x4dfb), LPSS_CNL_SSP }, | ||
3130 | /* APL */ | ||
3131 | { PCI_VDEVICE(INTEL, 0x5ac2), LPSS_BXT_SSP }, | ||
3132 | { PCI_VDEVICE(INTEL, 0x5ac4), LPSS_BXT_SSP }, | ||
3133 | diff --git a/drivers/spi/spi-ti-qspi.c b/drivers/spi/spi-ti-qspi.c | ||
3134 | index 3cb65371ae3b..66dcb6128539 100644 | ||
3135 | --- a/drivers/spi/spi-ti-qspi.c | ||
3136 | +++ b/drivers/spi/spi-ti-qspi.c | ||
3137 | @@ -62,6 +62,7 @@ struct ti_qspi { | ||
3138 | u32 dc; | ||
3139 | |||
3140 | bool mmap_enabled; | ||
3141 | + int current_cs; | ||
3142 | }; | ||
3143 | |||
3144 | #define QSPI_PID (0x0) | ||
3145 | @@ -487,6 +488,7 @@ static void ti_qspi_enable_memory_map(struct spi_device *spi) | ||
3146 | MEM_CS_EN(spi->chip_select)); | ||
3147 | } | ||
3148 | qspi->mmap_enabled = true; | ||
3149 | + qspi->current_cs = spi->chip_select; | ||
3150 | } | ||
3151 | |||
3152 | static void ti_qspi_disable_memory_map(struct spi_device *spi) | ||
3153 | @@ -498,6 +500,7 @@ static void ti_qspi_disable_memory_map(struct spi_device *spi) | ||
3154 | regmap_update_bits(qspi->ctrl_base, qspi->ctrl_reg, | ||
3155 | MEM_CS_MASK, 0); | ||
3156 | qspi->mmap_enabled = false; | ||
3157 | + qspi->current_cs = -1; | ||
3158 | } | ||
3159 | |||
3160 | static void ti_qspi_setup_mmap_read(struct spi_device *spi, u8 opcode, | ||
3161 | @@ -543,7 +546,7 @@ static int ti_qspi_exec_mem_op(struct spi_mem *mem, | ||
3162 | |||
3163 | mutex_lock(&qspi->list_lock); | ||
3164 | |||
3165 | - if (!qspi->mmap_enabled) | ||
3166 | + if (!qspi->mmap_enabled || qspi->current_cs != mem->spi->chip_select) | ||
3167 | ti_qspi_enable_memory_map(mem->spi); | ||
3168 | ti_qspi_setup_mmap_read(mem->spi, op->cmd.opcode, op->data.buswidth, | ||
3169 | op->addr.nbytes, op->dummy.nbytes); | ||
3170 | @@ -799,6 +802,7 @@ no_dma: | ||
3171 | } | ||
3172 | } | ||
3173 | qspi->mmap_enabled = false; | ||
3174 | + qspi->current_cs = -1; | ||
3175 | |||
3176 | ret = devm_spi_register_master(&pdev->dev, master); | ||
3177 | if (!ret) | ||
3178 | diff --git a/drivers/staging/axis-fifo/Kconfig b/drivers/staging/axis-fifo/Kconfig | ||
3179 | index 3fffe4d6f327..f180a8e9f58a 100644 | ||
3180 | --- a/drivers/staging/axis-fifo/Kconfig | ||
3181 | +++ b/drivers/staging/axis-fifo/Kconfig | ||
3182 | @@ -4,7 +4,7 @@ | ||
3183 | # | ||
3184 | config XIL_AXIS_FIFO | ||
3185 | tristate "Xilinx AXI-Stream FIFO IP core driver" | ||
3186 | - depends on OF | ||
3187 | + depends on OF && HAS_IOMEM | ||
3188 | help | ||
3189 | This adds support for the Xilinx AXI-Stream FIFO IP core driver. | ||
3190 | The AXI Streaming FIFO allows memory mapped access to a AXI Streaming | ||
3191 | diff --git a/drivers/usb/core/config.c b/drivers/usb/core/config.c | ||
3192 | index 1ac1095bfeac..5e92c6abe306 100644 | ||
3193 | --- a/drivers/usb/core/config.c | ||
3194 | +++ b/drivers/usb/core/config.c | ||
3195 | @@ -203,9 +203,58 @@ static const unsigned short super_speed_maxpacket_maxes[4] = { | ||
3196 | [USB_ENDPOINT_XFER_INT] = 1024, | ||
3197 | }; | ||
3198 | |||
3199 | -static int usb_parse_endpoint(struct device *ddev, int cfgno, int inum, | ||
3200 | - int asnum, struct usb_host_interface *ifp, int num_ep, | ||
3201 | - unsigned char *buffer, int size) | ||
3202 | +static bool endpoint_is_duplicate(struct usb_endpoint_descriptor *e1, | ||
3203 | + struct usb_endpoint_descriptor *e2) | ||
3204 | +{ | ||
3205 | + if (e1->bEndpointAddress == e2->bEndpointAddress) | ||
3206 | + return true; | ||
3207 | + | ||
3208 | + if (usb_endpoint_xfer_control(e1) || usb_endpoint_xfer_control(e2)) { | ||
3209 | + if (usb_endpoint_num(e1) == usb_endpoint_num(e2)) | ||
3210 | + return true; | ||
3211 | + } | ||
3212 | + | ||
3213 | + return false; | ||
3214 | +} | ||
3215 | + | ||
3216 | +/* | ||
3217 | + * Check for duplicate endpoint addresses in other interfaces and in the | ||
3218 | + * altsetting currently being parsed. | ||
3219 | + */ | ||
3220 | +static bool config_endpoint_is_duplicate(struct usb_host_config *config, | ||
3221 | + int inum, int asnum, struct usb_endpoint_descriptor *d) | ||
3222 | +{ | ||
3223 | + struct usb_endpoint_descriptor *epd; | ||
3224 | + struct usb_interface_cache *intfc; | ||
3225 | + struct usb_host_interface *alt; | ||
3226 | + int i, j, k; | ||
3227 | + | ||
3228 | + for (i = 0; i < config->desc.bNumInterfaces; ++i) { | ||
3229 | + intfc = config->intf_cache[i]; | ||
3230 | + | ||
3231 | + for (j = 0; j < intfc->num_altsetting; ++j) { | ||
3232 | + alt = &intfc->altsetting[j]; | ||
3233 | + | ||
3234 | + if (alt->desc.bInterfaceNumber == inum && | ||
3235 | + alt->desc.bAlternateSetting != asnum) | ||
3236 | + continue; | ||
3237 | + | ||
3238 | + for (k = 0; k < alt->desc.bNumEndpoints; ++k) { | ||
3239 | + epd = &alt->endpoint[k].desc; | ||
3240 | + | ||
3241 | + if (endpoint_is_duplicate(epd, d)) | ||
3242 | + return true; | ||
3243 | + } | ||
3244 | + } | ||
3245 | + } | ||
3246 | + | ||
3247 | + return false; | ||
3248 | +} | ||
3249 | + | ||
3250 | +static int usb_parse_endpoint(struct device *ddev, int cfgno, | ||
3251 | + struct usb_host_config *config, int inum, int asnum, | ||
3252 | + struct usb_host_interface *ifp, int num_ep, | ||
3253 | + unsigned char *buffer, int size) | ||
3254 | { | ||
3255 | unsigned char *buffer0 = buffer; | ||
3256 | struct usb_endpoint_descriptor *d; | ||
3257 | @@ -242,13 +291,10 @@ static int usb_parse_endpoint(struct device *ddev, int cfgno, int inum, | ||
3258 | goto skip_to_next_endpoint_or_interface_descriptor; | ||
3259 | |||
3260 | /* Check for duplicate endpoint addresses */ | ||
3261 | - for (i = 0; i < ifp->desc.bNumEndpoints; ++i) { | ||
3262 | - if (ifp->endpoint[i].desc.bEndpointAddress == | ||
3263 | - d->bEndpointAddress) { | ||
3264 | - dev_warn(ddev, "config %d interface %d altsetting %d has a duplicate endpoint with address 0x%X, skipping\n", | ||
3265 | - cfgno, inum, asnum, d->bEndpointAddress); | ||
3266 | - goto skip_to_next_endpoint_or_interface_descriptor; | ||
3267 | - } | ||
3268 | + if (config_endpoint_is_duplicate(config, inum, asnum, d)) { | ||
3269 | + dev_warn(ddev, "config %d interface %d altsetting %d has a duplicate endpoint with address 0x%X, skipping\n", | ||
3270 | + cfgno, inum, asnum, d->bEndpointAddress); | ||
3271 | + goto skip_to_next_endpoint_or_interface_descriptor; | ||
3272 | } | ||
3273 | |||
3274 | endpoint = &ifp->endpoint[ifp->desc.bNumEndpoints]; | ||
3275 | @@ -522,8 +568,8 @@ static int usb_parse_interface(struct device *ddev, int cfgno, | ||
3276 | if (((struct usb_descriptor_header *) buffer)->bDescriptorType | ||
3277 | == USB_DT_INTERFACE) | ||
3278 | break; | ||
3279 | - retval = usb_parse_endpoint(ddev, cfgno, inum, asnum, alt, | ||
3280 | - num_ep, buffer, size); | ||
3281 | + retval = usb_parse_endpoint(ddev, cfgno, config, inum, asnum, | ||
3282 | + alt, num_ep, buffer, size); | ||
3283 | if (retval < 0) | ||
3284 | return retval; | ||
3285 | ++n; | ||
3286 | diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c | ||
3287 | index dfe9ac8d2375..8b23162e4239 100644 | ||
3288 | --- a/drivers/usb/core/hub.c | ||
3289 | +++ b/drivers/usb/core/hub.c | ||
3290 | @@ -2691,7 +2691,7 @@ static unsigned hub_is_wusb(struct usb_hub *hub) | ||
3291 | #define SET_ADDRESS_TRIES 2 | ||
3292 | #define GET_DESCRIPTOR_TRIES 2 | ||
3293 | #define SET_CONFIG_TRIES (2 * (use_both_schemes + 1)) | ||
3294 | -#define USE_NEW_SCHEME(i, scheme) ((i) / 2 == (int)scheme) | ||
3295 | +#define USE_NEW_SCHEME(i, scheme) ((i) / 2 == (int)(scheme)) | ||
3296 | |||
3297 | #define HUB_ROOT_RESET_TIME 60 /* times are in msec */ | ||
3298 | #define HUB_SHORT_RESET_TIME 10 | ||
3299 | diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c | ||
3300 | index 0c960a97ea02..154f3f3e8cff 100644 | ||
3301 | --- a/drivers/usb/dwc3/gadget.c | ||
3302 | +++ b/drivers/usb/dwc3/gadget.c | ||
3303 | @@ -2467,6 +2467,13 @@ static int dwc3_gadget_ep_reclaim_trb_linear(struct dwc3_ep *dep, | ||
3304 | |||
3305 | static bool dwc3_gadget_ep_request_completed(struct dwc3_request *req) | ||
3306 | { | ||
3307 | + /* | ||
3308 | + * For OUT direction, host may send less than the setup | ||
3309 | + * length. Return true for all OUT requests. | ||
3310 | + */ | ||
3311 | + if (!req->direction) | ||
3312 | + return true; | ||
3313 | + | ||
3314 | return req->request.actual == req->request.length; | ||
3315 | } | ||
3316 | |||
3317 | diff --git a/drivers/usb/gadget/udc/dummy_hcd.c b/drivers/usb/gadget/udc/dummy_hcd.c | ||
3318 | index a8f1e5707c14..4c9d1e49d5ed 100644 | ||
3319 | --- a/drivers/usb/gadget/udc/dummy_hcd.c | ||
3320 | +++ b/drivers/usb/gadget/udc/dummy_hcd.c | ||
3321 | @@ -1321,7 +1321,7 @@ static int dummy_perform_transfer(struct urb *urb, struct dummy_request *req, | ||
3322 | u32 this_sg; | ||
3323 | bool next_sg; | ||
3324 | |||
3325 | - to_host = usb_pipein(urb->pipe); | ||
3326 | + to_host = usb_urb_dir_in(urb); | ||
3327 | rbuf = req->req.buf + req->req.actual; | ||
3328 | |||
3329 | if (!urb->num_sgs) { | ||
3330 | @@ -1409,7 +1409,7 @@ top: | ||
3331 | |||
3332 | /* FIXME update emulated data toggle too */ | ||
3333 | |||
3334 | - to_host = usb_pipein(urb->pipe); | ||
3335 | + to_host = usb_urb_dir_in(urb); | ||
3336 | if (unlikely(len == 0)) | ||
3337 | is_short = 1; | ||
3338 | else { | ||
3339 | @@ -1830,7 +1830,7 @@ restart: | ||
3340 | |||
3341 | /* find the gadget's ep for this request (if configured) */ | ||
3342 | address = usb_pipeendpoint (urb->pipe); | ||
3343 | - if (usb_pipein(urb->pipe)) | ||
3344 | + if (usb_urb_dir_in(urb)) | ||
3345 | address |= USB_DIR_IN; | ||
3346 | ep = find_endpoint(dum, address); | ||
3347 | if (!ep) { | ||
3348 | @@ -2385,7 +2385,7 @@ static inline ssize_t show_urb(char *buf, size_t size, struct urb *urb) | ||
3349 | s = "?"; | ||
3350 | break; | ||
3351 | } s; }), | ||
3352 | - ep, ep ? (usb_pipein(urb->pipe) ? "in" : "out") : "", | ||
3353 | + ep, ep ? (usb_urb_dir_in(urb) ? "in" : "out") : "", | ||
3354 | ({ char *s; \ | ||
3355 | switch (usb_pipetype(urb->pipe)) { \ | ||
3356 | case PIPE_CONTROL: \ | ||
3357 | diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c | ||
3358 | index e9491d400a24..fea09a3f491f 100644 | ||
3359 | --- a/drivers/usb/serial/option.c | ||
3360 | +++ b/drivers/usb/serial/option.c | ||
3361 | @@ -1172,6 +1172,8 @@ static const struct usb_device_id option_ids[] = { | ||
3362 | .driver_info = NCTRL(0) | RSVD(3) }, | ||
3363 | { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1102, 0xff), /* Telit ME910 (ECM) */ | ||
3364 | .driver_info = NCTRL(0) }, | ||
3365 | + { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x110a, 0xff), /* Telit ME910G1 */ | ||
3366 | + .driver_info = NCTRL(0) | RSVD(3) }, | ||
3367 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE910), | ||
3368 | .driver_info = NCTRL(0) | RSVD(1) | RSVD(2) }, | ||
3369 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE910_USBCFG4), | ||
3370 | diff --git a/drivers/usb/typec/tcpm/Kconfig b/drivers/usb/typec/tcpm/Kconfig | ||
3371 | index 72481bbb2af3..5b986d6c801d 100644 | ||
3372 | --- a/drivers/usb/typec/tcpm/Kconfig | ||
3373 | +++ b/drivers/usb/typec/tcpm/Kconfig | ||
3374 | @@ -32,6 +32,7 @@ endif # TYPEC_TCPCI | ||
3375 | config TYPEC_FUSB302 | ||
3376 | tristate "Fairchild FUSB302 Type-C chip driver" | ||
3377 | depends on I2C | ||
3378 | + depends on EXTCON || !EXTCON | ||
3379 | help | ||
3380 | The Fairchild FUSB302 Type-C chip driver that works with | ||
3381 | Type-C Port Controller Manager to provide USB PD and USB | ||
3382 | diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c | ||
3383 | index eb95ed78a18e..dc50605ecbda 100644 | ||
3384 | --- a/fs/btrfs/extent-tree.c | ||
3385 | +++ b/fs/btrfs/extent-tree.c | ||
3386 | @@ -3781,6 +3781,7 @@ static noinline int find_free_extent(struct btrfs_fs_info *fs_info, | ||
3387 | u64 flags, int delalloc) | ||
3388 | { | ||
3389 | int ret = 0; | ||
3390 | + int cache_block_group_error = 0; | ||
3391 | struct btrfs_free_cluster *last_ptr = NULL; | ||
3392 | struct btrfs_block_group_cache *block_group = NULL; | ||
3393 | struct find_free_extent_ctl ffe_ctl = {0}; | ||
3394 | @@ -3940,7 +3941,20 @@ have_block_group: | ||
3395 | if (unlikely(!ffe_ctl.cached)) { | ||
3396 | ffe_ctl.have_caching_bg = true; | ||
3397 | ret = btrfs_cache_block_group(block_group, 0); | ||
3398 | - BUG_ON(ret < 0); | ||
3399 | + | ||
3400 | + /* | ||
3401 | + * If we get ENOMEM here or something else we want to | ||
3402 | + * try other block groups, because it may not be fatal. | ||
3403 | + * However if we can't find anything else we need to | ||
3404 | + * save our return here so that we return the actual | ||
3405 | + * error that caused problems, not ENOSPC. | ||
3406 | + */ | ||
3407 | + if (ret < 0) { | ||
3408 | + if (!cache_block_group_error) | ||
3409 | + cache_block_group_error = ret; | ||
3410 | + ret = 0; | ||
3411 | + goto loop; | ||
3412 | + } | ||
3413 | ret = 0; | ||
3414 | } | ||
3415 | |||
3416 | @@ -4027,7 +4041,7 @@ loop: | ||
3417 | if (ret > 0) | ||
3418 | goto search; | ||
3419 | |||
3420 | - if (ret == -ENOSPC) { | ||
3421 | + if (ret == -ENOSPC && !cache_block_group_error) { | ||
3422 | /* | ||
3423 | * Use ffe_ctl->total_free_space as fallback if we can't find | ||
3424 | * any contiguous hole. | ||
3425 | @@ -4038,6 +4052,8 @@ loop: | ||
3426 | space_info->max_extent_size = ffe_ctl.max_extent_size; | ||
3427 | spin_unlock(&space_info->lock); | ||
3428 | ins->offset = ffe_ctl.max_extent_size; | ||
3429 | + } else if (ret == -ENOSPC) { | ||
3430 | + ret = cache_block_group_error; | ||
3431 | } | ||
3432 | return ret; | ||
3433 | } | ||
3434 | diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c | ||
3435 | index c332968f9056..eaafd00f93d4 100644 | ||
3436 | --- a/fs/btrfs/file.c | ||
3437 | +++ b/fs/btrfs/file.c | ||
3438 | @@ -2601,8 +2601,8 @@ int btrfs_punch_hole_range(struct inode *inode, struct btrfs_path *path, | ||
3439 | } | ||
3440 | } | ||
3441 | |||
3442 | - if (clone_info) { | ||
3443 | - u64 clone_len = drop_end - cur_offset; | ||
3444 | + if (clone_info && drop_end > clone_info->file_offset) { | ||
3445 | + u64 clone_len = drop_end - clone_info->file_offset; | ||
3446 | |||
3447 | ret = btrfs_insert_clone_extent(trans, inode, path, | ||
3448 | clone_info, clone_len); | ||
3449 | diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c | ||
3450 | index a56dcc0c9c2a..5720e450a46f 100644 | ||
3451 | --- a/fs/btrfs/ioctl.c | ||
3452 | +++ b/fs/btrfs/ioctl.c | ||
3453 | @@ -3727,24 +3727,18 @@ process_slot: | ||
3454 | ret = 0; | ||
3455 | |||
3456 | if (last_dest_end < destoff + len) { | ||
3457 | - struct btrfs_clone_extent_info clone_info = { 0 }; | ||
3458 | /* | ||
3459 | - * We have an implicit hole (NO_HOLES feature is enabled) that | ||
3460 | - * fully or partially overlaps our cloning range at its end. | ||
3461 | + * We have an implicit hole that fully or partially overlaps our | ||
3462 | + * cloning range at its end. This means that we either have the | ||
3463 | + * NO_HOLES feature enabled or the implicit hole happened due to | ||
3464 | + * mixing buffered and direct IO writes against this file. | ||
3465 | */ | ||
3466 | btrfs_release_path(path); | ||
3467 | path->leave_spinning = 0; | ||
3468 | |||
3469 | - /* | ||
3470 | - * We are dealing with a hole and our clone_info already has a | ||
3471 | - * disk_offset of 0, we only need to fill the data length and | ||
3472 | - * file offset. | ||
3473 | - */ | ||
3474 | - clone_info.data_len = destoff + len - last_dest_end; | ||
3475 | - clone_info.file_offset = last_dest_end; | ||
3476 | ret = btrfs_punch_hole_range(inode, path, | ||
3477 | last_dest_end, destoff + len - 1, | ||
3478 | - &clone_info, &trans); | ||
3479 | + NULL, &trans); | ||
3480 | if (ret) | ||
3481 | goto out; | ||
3482 | |||
3483 | diff --git a/fs/btrfs/qgroup.c b/fs/btrfs/qgroup.c | ||
3484 | index 27a903aaf43b..aeb5f2f3cdd7 100644 | ||
3485 | --- a/fs/btrfs/qgroup.c | ||
3486 | +++ b/fs/btrfs/qgroup.c | ||
3487 | @@ -3232,12 +3232,12 @@ qgroup_rescan_init(struct btrfs_fs_info *fs_info, u64 progress_objectid, | ||
3488 | if (!(fs_info->qgroup_flags & | ||
3489 | BTRFS_QGROUP_STATUS_FLAG_RESCAN)) { | ||
3490 | btrfs_warn(fs_info, | ||
3491 | - "qgroup rescan init failed, qgroup is not enabled"); | ||
3492 | + "qgroup rescan init failed, qgroup rescan is not queued"); | ||
3493 | ret = -EINVAL; | ||
3494 | } else if (!(fs_info->qgroup_flags & | ||
3495 | BTRFS_QGROUP_STATUS_FLAG_ON)) { | ||
3496 | btrfs_warn(fs_info, | ||
3497 | - "qgroup rescan init failed, qgroup rescan is not queued"); | ||
3498 | + "qgroup rescan init failed, qgroup is not enabled"); | ||
3499 | ret = -EINVAL; | ||
3500 | } | ||
3501 | |||
3502 | diff --git a/fs/drop_caches.c b/fs/drop_caches.c | ||
3503 | index d31b6c72b476..dc1a1d5d825b 100644 | ||
3504 | --- a/fs/drop_caches.c | ||
3505 | +++ b/fs/drop_caches.c | ||
3506 | @@ -35,11 +35,11 @@ static void drop_pagecache_sb(struct super_block *sb, void *unused) | ||
3507 | spin_unlock(&inode->i_lock); | ||
3508 | spin_unlock(&sb->s_inode_list_lock); | ||
3509 | |||
3510 | - cond_resched(); | ||
3511 | invalidate_mapping_pages(inode->i_mapping, 0, -1); | ||
3512 | iput(toput_inode); | ||
3513 | toput_inode = inode; | ||
3514 | |||
3515 | + cond_resched(); | ||
3516 | spin_lock(&sb->s_inode_list_lock); | ||
3517 | } | ||
3518 | spin_unlock(&sb->s_inode_list_lock); | ||
3519 | diff --git a/fs/inode.c b/fs/inode.c | ||
3520 | index fef457a42882..96d62d97694e 100644 | ||
3521 | --- a/fs/inode.c | ||
3522 | +++ b/fs/inode.c | ||
3523 | @@ -676,6 +676,7 @@ int invalidate_inodes(struct super_block *sb, bool kill_dirty) | ||
3524 | struct inode *inode, *next; | ||
3525 | LIST_HEAD(dispose); | ||
3526 | |||
3527 | +again: | ||
3528 | spin_lock(&sb->s_inode_list_lock); | ||
3529 | list_for_each_entry_safe(inode, next, &sb->s_inodes, i_sb_list) { | ||
3530 | spin_lock(&inode->i_lock); | ||
3531 | @@ -698,6 +699,12 @@ int invalidate_inodes(struct super_block *sb, bool kill_dirty) | ||
3532 | inode_lru_list_del(inode); | ||
3533 | spin_unlock(&inode->i_lock); | ||
3534 | list_add(&inode->i_lru, &dispose); | ||
3535 | + if (need_resched()) { | ||
3536 | + spin_unlock(&sb->s_inode_list_lock); | ||
3537 | + cond_resched(); | ||
3538 | + dispose_list(&dispose); | ||
3539 | + goto again; | ||
3540 | + } | ||
3541 | } | ||
3542 | spin_unlock(&sb->s_inode_list_lock); | ||
3543 | |||
3544 | diff --git a/fs/io_uring.c b/fs/io_uring.c | ||
3545 | index a60c6315a348..709671faaed6 100644 | ||
3546 | --- a/fs/io_uring.c | ||
3547 | +++ b/fs/io_uring.c | ||
3548 | @@ -3721,6 +3721,9 @@ SYSCALL_DEFINE6(io_uring_enter, unsigned int, fd, u32, to_submit, | ||
3549 | mutex_lock(&ctx->uring_lock); | ||
3550 | submitted = io_ring_submit(ctx, to_submit); | ||
3551 | mutex_unlock(&ctx->uring_lock); | ||
3552 | + | ||
3553 | + if (submitted != to_submit) | ||
3554 | + goto out; | ||
3555 | } | ||
3556 | if (flags & IORING_ENTER_GETEVENTS) { | ||
3557 | unsigned nr_events = 0; | ||
3558 | @@ -3734,6 +3737,7 @@ SYSCALL_DEFINE6(io_uring_enter, unsigned int, fd, u32, to_submit, | ||
3559 | } | ||
3560 | } | ||
3561 | |||
3562 | +out: | ||
3563 | percpu_ref_put(&ctx->refs); | ||
3564 | out_fput: | ||
3565 | fdput(f); | ||
3566 | diff --git a/fs/notify/fsnotify.c b/fs/notify/fsnotify.c | ||
3567 | index 2ecef6155fc0..f44e39c68328 100644 | ||
3568 | --- a/fs/notify/fsnotify.c | ||
3569 | +++ b/fs/notify/fsnotify.c | ||
3570 | @@ -57,6 +57,9 @@ static void fsnotify_unmount_inodes(struct super_block *sb) | ||
3571 | * doing an __iget/iput with SB_ACTIVE clear would actually | ||
3572 | * evict all inodes with zero i_count from icache which is | ||
3573 | * unnecessarily violent and may in fact be illegal to do. | ||
3574 | + * However, we should have been called /after/ evict_inodes | ||
3575 | + * removed all zero refcount inodes, in any case. Test to | ||
3576 | + * be sure. | ||
3577 | */ | ||
3578 | if (!atomic_read(&inode->i_count)) { | ||
3579 | spin_unlock(&inode->i_lock); | ||
3580 | @@ -77,6 +80,7 @@ static void fsnotify_unmount_inodes(struct super_block *sb) | ||
3581 | |||
3582 | iput_inode = inode; | ||
3583 | |||
3584 | + cond_resched(); | ||
3585 | spin_lock(&sb->s_inode_list_lock); | ||
3586 | } | ||
3587 | spin_unlock(&sb->s_inode_list_lock); | ||
3588 | diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c | ||
3589 | index 9b96243de081..7abc3230c21a 100644 | ||
3590 | --- a/fs/quota/dquot.c | ||
3591 | +++ b/fs/quota/dquot.c | ||
3592 | @@ -986,6 +986,7 @@ static int add_dquot_ref(struct super_block *sb, int type) | ||
3593 | * later. | ||
3594 | */ | ||
3595 | old_inode = inode; | ||
3596 | + cond_resched(); | ||
3597 | spin_lock(&sb->s_inode_list_lock); | ||
3598 | } | ||
3599 | spin_unlock(&sb->s_inode_list_lock); | ||
3600 | diff --git a/fs/super.c b/fs/super.c | ||
3601 | index cfadab2cbf35..cd352530eca9 100644 | ||
3602 | --- a/fs/super.c | ||
3603 | +++ b/fs/super.c | ||
3604 | @@ -448,10 +448,12 @@ void generic_shutdown_super(struct super_block *sb) | ||
3605 | sync_filesystem(sb); | ||
3606 | sb->s_flags &= ~SB_ACTIVE; | ||
3607 | |||
3608 | - fsnotify_sb_delete(sb); | ||
3609 | cgroup_writeback_umount(); | ||
3610 | |||
3611 | + /* evict all inodes with zero refcount */ | ||
3612 | evict_inodes(sb); | ||
3613 | + /* only nonzero refcount inodes can have marks */ | ||
3614 | + fsnotify_sb_delete(sb); | ||
3615 | |||
3616 | if (sb->s_dio_done_wq) { | ||
3617 | destroy_workqueue(sb->s_dio_done_wq); | ||
3618 | diff --git a/include/linux/if_ether.h b/include/linux/if_ether.h | ||
3619 | index 76cf11e905e1..8a9792a6427a 100644 | ||
3620 | --- a/include/linux/if_ether.h | ||
3621 | +++ b/include/linux/if_ether.h | ||
3622 | @@ -24,6 +24,14 @@ static inline struct ethhdr *eth_hdr(const struct sk_buff *skb) | ||
3623 | return (struct ethhdr *)skb_mac_header(skb); | ||
3624 | } | ||
3625 | |||
3626 | +/* Prefer this version in TX path, instead of | ||
3627 | + * skb_reset_mac_header() + eth_hdr() | ||
3628 | + */ | ||
3629 | +static inline struct ethhdr *skb_eth_hdr(const struct sk_buff *skb) | ||
3630 | +{ | ||
3631 | + return (struct ethhdr *)skb->data; | ||
3632 | +} | ||
3633 | + | ||
3634 | static inline struct ethhdr *inner_eth_hdr(const struct sk_buff *skb) | ||
3635 | { | ||
3636 | return (struct ethhdr *)skb_inner_mac_header(skb); | ||
3637 | diff --git a/include/uapi/linux/netfilter/xt_sctp.h b/include/uapi/linux/netfilter/xt_sctp.h | ||
3638 | index 4bc6d1a08781..b4d804a9fccb 100644 | ||
3639 | --- a/include/uapi/linux/netfilter/xt_sctp.h | ||
3640 | +++ b/include/uapi/linux/netfilter/xt_sctp.h | ||
3641 | @@ -41,19 +41,19 @@ struct xt_sctp_info { | ||
3642 | #define SCTP_CHUNKMAP_SET(chunkmap, type) \ | ||
3643 | do { \ | ||
3644 | (chunkmap)[type / bytes(__u32)] |= \ | ||
3645 | - 1 << (type % bytes(__u32)); \ | ||
3646 | + 1u << (type % bytes(__u32)); \ | ||
3647 | } while (0) | ||
3648 | |||
3649 | #define SCTP_CHUNKMAP_CLEAR(chunkmap, type) \ | ||
3650 | do { \ | ||
3651 | (chunkmap)[type / bytes(__u32)] &= \ | ||
3652 | - ~(1 << (type % bytes(__u32))); \ | ||
3653 | + ~(1u << (type % bytes(__u32))); \ | ||
3654 | } while (0) | ||
3655 | |||
3656 | #define SCTP_CHUNKMAP_IS_SET(chunkmap, type) \ | ||
3657 | ({ \ | ||
3658 | ((chunkmap)[type / bytes (__u32)] & \ | ||
3659 | - (1 << (type % bytes (__u32)))) ? 1: 0; \ | ||
3660 | + (1u << (type % bytes (__u32)))) ? 1: 0; \ | ||
3661 | }) | ||
3662 | |||
3663 | #define SCTP_CHUNKMAP_RESET(chunkmap) \ | ||
3664 | diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c | ||
3665 | index 5c51021775af..9c74c98f6501 100644 | ||
3666 | --- a/kernel/bpf/verifier.c | ||
3667 | +++ b/kernel/bpf/verifier.c | ||
3668 | @@ -6039,6 +6039,7 @@ static bool may_access_skb(enum bpf_prog_type type) | ||
3669 | static int check_ld_abs(struct bpf_verifier_env *env, struct bpf_insn *insn) | ||
3670 | { | ||
3671 | struct bpf_reg_state *regs = cur_regs(env); | ||
3672 | + static const int ctx_reg = BPF_REG_6; | ||
3673 | u8 mode = BPF_MODE(insn->code); | ||
3674 | int i, err; | ||
3675 | |||
3676 | @@ -6072,7 +6073,7 @@ static int check_ld_abs(struct bpf_verifier_env *env, struct bpf_insn *insn) | ||
3677 | } | ||
3678 | |||
3679 | /* check whether implicit source operand (register R6) is readable */ | ||
3680 | - err = check_reg_arg(env, BPF_REG_6, SRC_OP); | ||
3681 | + err = check_reg_arg(env, ctx_reg, SRC_OP); | ||
3682 | if (err) | ||
3683 | return err; | ||
3684 | |||
3685 | @@ -6091,7 +6092,7 @@ static int check_ld_abs(struct bpf_verifier_env *env, struct bpf_insn *insn) | ||
3686 | return -EINVAL; | ||
3687 | } | ||
3688 | |||
3689 | - if (regs[BPF_REG_6].type != PTR_TO_CTX) { | ||
3690 | + if (regs[ctx_reg].type != PTR_TO_CTX) { | ||
3691 | verbose(env, | ||
3692 | "at the time of BPF_LD_ABS|IND R6 != pointer to skb\n"); | ||
3693 | return -EINVAL; | ||
3694 | @@ -6104,6 +6105,10 @@ static int check_ld_abs(struct bpf_verifier_env *env, struct bpf_insn *insn) | ||
3695 | return err; | ||
3696 | } | ||
3697 | |||
3698 | + err = check_ctx_reg(env, ®s[ctx_reg], ctx_reg); | ||
3699 | + if (err < 0) | ||
3700 | + return err; | ||
3701 | + | ||
3702 | /* reset caller saved regs to unreadable */ | ||
3703 | for (i = 0; i < CALLER_SAVED_REGS; i++) { | ||
3704 | mark_reg_not_init(env, regs, caller_saved[i]); | ||
3705 | diff --git a/kernel/locking/spinlock_debug.c b/kernel/locking/spinlock_debug.c | ||
3706 | index 399669f7eba8..472dd462a40c 100644 | ||
3707 | --- a/kernel/locking/spinlock_debug.c | ||
3708 | +++ b/kernel/locking/spinlock_debug.c | ||
3709 | @@ -51,19 +51,19 @@ EXPORT_SYMBOL(__rwlock_init); | ||
3710 | |||
3711 | static void spin_dump(raw_spinlock_t *lock, const char *msg) | ||
3712 | { | ||
3713 | - struct task_struct *owner = NULL; | ||
3714 | + struct task_struct *owner = READ_ONCE(lock->owner); | ||
3715 | |||
3716 | - if (lock->owner && lock->owner != SPINLOCK_OWNER_INIT) | ||
3717 | - owner = lock->owner; | ||
3718 | + if (owner == SPINLOCK_OWNER_INIT) | ||
3719 | + owner = NULL; | ||
3720 | printk(KERN_EMERG "BUG: spinlock %s on CPU#%d, %s/%d\n", | ||
3721 | msg, raw_smp_processor_id(), | ||
3722 | current->comm, task_pid_nr(current)); | ||
3723 | printk(KERN_EMERG " lock: %pS, .magic: %08x, .owner: %s/%d, " | ||
3724 | ".owner_cpu: %d\n", | ||
3725 | - lock, lock->magic, | ||
3726 | + lock, READ_ONCE(lock->magic), | ||
3727 | owner ? owner->comm : "<none>", | ||
3728 | owner ? task_pid_nr(owner) : -1, | ||
3729 | - lock->owner_cpu); | ||
3730 | + READ_ONCE(lock->owner_cpu)); | ||
3731 | dump_stack(); | ||
3732 | } | ||
3733 | |||
3734 | @@ -80,16 +80,16 @@ static void spin_bug(raw_spinlock_t *lock, const char *msg) | ||
3735 | static inline void | ||
3736 | debug_spin_lock_before(raw_spinlock_t *lock) | ||
3737 | { | ||
3738 | - SPIN_BUG_ON(lock->magic != SPINLOCK_MAGIC, lock, "bad magic"); | ||
3739 | - SPIN_BUG_ON(lock->owner == current, lock, "recursion"); | ||
3740 | - SPIN_BUG_ON(lock->owner_cpu == raw_smp_processor_id(), | ||
3741 | + SPIN_BUG_ON(READ_ONCE(lock->magic) != SPINLOCK_MAGIC, lock, "bad magic"); | ||
3742 | + SPIN_BUG_ON(READ_ONCE(lock->owner) == current, lock, "recursion"); | ||
3743 | + SPIN_BUG_ON(READ_ONCE(lock->owner_cpu) == raw_smp_processor_id(), | ||
3744 | lock, "cpu recursion"); | ||
3745 | } | ||
3746 | |||
3747 | static inline void debug_spin_lock_after(raw_spinlock_t *lock) | ||
3748 | { | ||
3749 | - lock->owner_cpu = raw_smp_processor_id(); | ||
3750 | - lock->owner = current; | ||
3751 | + WRITE_ONCE(lock->owner_cpu, raw_smp_processor_id()); | ||
3752 | + WRITE_ONCE(lock->owner, current); | ||
3753 | } | ||
3754 | |||
3755 | static inline void debug_spin_unlock(raw_spinlock_t *lock) | ||
3756 | @@ -99,8 +99,8 @@ static inline void debug_spin_unlock(raw_spinlock_t *lock) | ||
3757 | SPIN_BUG_ON(lock->owner != current, lock, "wrong owner"); | ||
3758 | SPIN_BUG_ON(lock->owner_cpu != raw_smp_processor_id(), | ||
3759 | lock, "wrong CPU"); | ||
3760 | - lock->owner = SPINLOCK_OWNER_INIT; | ||
3761 | - lock->owner_cpu = -1; | ||
3762 | + WRITE_ONCE(lock->owner, SPINLOCK_OWNER_INIT); | ||
3763 | + WRITE_ONCE(lock->owner_cpu, -1); | ||
3764 | } | ||
3765 | |||
3766 | /* | ||
3767 | @@ -187,8 +187,8 @@ static inline void debug_write_lock_before(rwlock_t *lock) | ||
3768 | |||
3769 | static inline void debug_write_lock_after(rwlock_t *lock) | ||
3770 | { | ||
3771 | - lock->owner_cpu = raw_smp_processor_id(); | ||
3772 | - lock->owner = current; | ||
3773 | + WRITE_ONCE(lock->owner_cpu, raw_smp_processor_id()); | ||
3774 | + WRITE_ONCE(lock->owner, current); | ||
3775 | } | ||
3776 | |||
3777 | static inline void debug_write_unlock(rwlock_t *lock) | ||
3778 | @@ -197,8 +197,8 @@ static inline void debug_write_unlock(rwlock_t *lock) | ||
3779 | RWLOCK_BUG_ON(lock->owner != current, lock, "wrong owner"); | ||
3780 | RWLOCK_BUG_ON(lock->owner_cpu != raw_smp_processor_id(), | ||
3781 | lock, "wrong CPU"); | ||
3782 | - lock->owner = SPINLOCK_OWNER_INIT; | ||
3783 | - lock->owner_cpu = -1; | ||
3784 | + WRITE_ONCE(lock->owner, SPINLOCK_OWNER_INIT); | ||
3785 | + WRITE_ONCE(lock->owner_cpu, -1); | ||
3786 | } | ||
3787 | |||
3788 | void do_raw_write_lock(rwlock_t *lock) | ||
3789 | diff --git a/kernel/sched/psi.c b/kernel/sched/psi.c | ||
3790 | index 517e3719027e..ce8f6748678a 100644 | ||
3791 | --- a/kernel/sched/psi.c | ||
3792 | +++ b/kernel/sched/psi.c | ||
3793 | @@ -185,7 +185,8 @@ static void group_init(struct psi_group *group) | ||
3794 | |||
3795 | for_each_possible_cpu(cpu) | ||
3796 | seqcount_init(&per_cpu_ptr(group->pcpu, cpu)->seq); | ||
3797 | - group->avg_next_update = sched_clock() + psi_period; | ||
3798 | + group->avg_last_update = sched_clock(); | ||
3799 | + group->avg_next_update = group->avg_last_update + psi_period; | ||
3800 | INIT_DELAYED_WORK(&group->avgs_work, psi_avgs_work); | ||
3801 | mutex_init(&group->avgs_lock); | ||
3802 | /* Init trigger-related members */ | ||
3803 | @@ -481,7 +482,7 @@ static u64 window_update(struct psi_window *win, u64 now, u64 value) | ||
3804 | u32 remaining; | ||
3805 | |||
3806 | remaining = win->size - elapsed; | ||
3807 | - growth += div_u64(win->prev_growth * remaining, win->size); | ||
3808 | + growth += div64_u64(win->prev_growth * remaining, win->size); | ||
3809 | } | ||
3810 | |||
3811 | return growth; | ||
3812 | diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c | ||
3813 | index 66358d66c933..4bf050fcfe3b 100644 | ||
3814 | --- a/kernel/trace/ring_buffer.c | ||
3815 | +++ b/kernel/trace/ring_buffer.c | ||
3816 | @@ -11,6 +11,7 @@ | ||
3817 | #include <linux/trace_seq.h> | ||
3818 | #include <linux/spinlock.h> | ||
3819 | #include <linux/irq_work.h> | ||
3820 | +#include <linux/security.h> | ||
3821 | #include <linux/uaccess.h> | ||
3822 | #include <linux/hardirq.h> | ||
3823 | #include <linux/kthread.h> /* for self test */ | ||
3824 | @@ -5068,6 +5069,11 @@ static __init int test_ringbuffer(void) | ||
3825 | int cpu; | ||
3826 | int ret = 0; | ||
3827 | |||
3828 | + if (security_locked_down(LOCKDOWN_TRACEFS)) { | ||
3829 | + pr_warning("Lockdown is enabled, skipping ring buffer tests\n"); | ||
3830 | + return 0; | ||
3831 | + } | ||
3832 | + | ||
3833 | pr_info("Running ring buffer tests...\n"); | ||
3834 | |||
3835 | buffer = ring_buffer_alloc(RB_TEST_BUFFER_SIZE, RB_FL_OVERWRITE); | ||
3836 | diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c | ||
3837 | index d8bd9b1d8bce..bcb72f102613 100644 | ||
3838 | --- a/kernel/trace/trace.c | ||
3839 | +++ b/kernel/trace/trace.c | ||
3840 | @@ -1804,6 +1804,12 @@ int __init register_tracer(struct tracer *type) | ||
3841 | return -1; | ||
3842 | } | ||
3843 | |||
3844 | + if (security_locked_down(LOCKDOWN_TRACEFS)) { | ||
3845 | + pr_warning("Can not register tracer %s due to lockdown\n", | ||
3846 | + type->name); | ||
3847 | + return -EPERM; | ||
3848 | + } | ||
3849 | + | ||
3850 | mutex_lock(&trace_types_lock); | ||
3851 | |||
3852 | tracing_selftest_running = true; | ||
3853 | @@ -8647,6 +8653,11 @@ struct dentry *tracing_init_dentry(void) | ||
3854 | { | ||
3855 | struct trace_array *tr = &global_trace; | ||
3856 | |||
3857 | + if (security_locked_down(LOCKDOWN_TRACEFS)) { | ||
3858 | + pr_warning("Tracing disabled due to lockdown\n"); | ||
3859 | + return ERR_PTR(-EPERM); | ||
3860 | + } | ||
3861 | + | ||
3862 | /* The top level trace array uses NULL as parent */ | ||
3863 | if (tr->dir) | ||
3864 | return NULL; | ||
3865 | @@ -9089,6 +9100,12 @@ __init static int tracer_alloc_buffers(void) | ||
3866 | int ring_buf_size; | ||
3867 | int ret = -ENOMEM; | ||
3868 | |||
3869 | + | ||
3870 | + if (security_locked_down(LOCKDOWN_TRACEFS)) { | ||
3871 | + pr_warning("Tracing disabled due to lockdown\n"); | ||
3872 | + return -EPERM; | ||
3873 | + } | ||
3874 | + | ||
3875 | /* | ||
3876 | * Make sure we don't accidently add more trace options | ||
3877 | * than we have bits for. | ||
3878 | diff --git a/lib/sbitmap.c b/lib/sbitmap.c | ||
3879 | index 969e5400a615..ee3ce1494568 100644 | ||
3880 | --- a/lib/sbitmap.c | ||
3881 | +++ b/lib/sbitmap.c | ||
3882 | @@ -667,8 +667,8 @@ void sbitmap_add_wait_queue(struct sbitmap_queue *sbq, | ||
3883 | if (!sbq_wait->sbq) { | ||
3884 | sbq_wait->sbq = sbq; | ||
3885 | atomic_inc(&sbq->ws_active); | ||
3886 | + add_wait_queue(&ws->wait, &sbq_wait->wait); | ||
3887 | } | ||
3888 | - add_wait_queue(&ws->wait, &sbq_wait->wait); | ||
3889 | } | ||
3890 | EXPORT_SYMBOL_GPL(sbitmap_add_wait_queue); | ||
3891 | |||
3892 | diff --git a/net/8021q/vlan.h b/net/8021q/vlan.h | ||
3893 | index c46daf09a501..bb7ec1a3915d 100644 | ||
3894 | --- a/net/8021q/vlan.h | ||
3895 | +++ b/net/8021q/vlan.h | ||
3896 | @@ -126,6 +126,7 @@ int vlan_check_real_dev(struct net_device *real_dev, | ||
3897 | void vlan_setup(struct net_device *dev); | ||
3898 | int register_vlan_dev(struct net_device *dev, struct netlink_ext_ack *extack); | ||
3899 | void unregister_vlan_dev(struct net_device *dev, struct list_head *head); | ||
3900 | +void vlan_dev_uninit(struct net_device *dev); | ||
3901 | bool vlan_dev_inherit_address(struct net_device *dev, | ||
3902 | struct net_device *real_dev); | ||
3903 | |||
3904 | diff --git a/net/8021q/vlan_dev.c b/net/8021q/vlan_dev.c | ||
3905 | index e5bff5cc6f97..2a78da4072de 100644 | ||
3906 | --- a/net/8021q/vlan_dev.c | ||
3907 | +++ b/net/8021q/vlan_dev.c | ||
3908 | @@ -586,7 +586,8 @@ static int vlan_dev_init(struct net_device *dev) | ||
3909 | return 0; | ||
3910 | } | ||
3911 | |||
3912 | -static void vlan_dev_uninit(struct net_device *dev) | ||
3913 | +/* Note: this function might be called multiple times for the same device. */ | ||
3914 | +void vlan_dev_uninit(struct net_device *dev) | ||
3915 | { | ||
3916 | struct vlan_priority_tci_mapping *pm; | ||
3917 | struct vlan_dev_priv *vlan = vlan_dev_priv(dev); | ||
3918 | diff --git a/net/8021q/vlan_netlink.c b/net/8021q/vlan_netlink.c | ||
3919 | index c482a6fe9393..0db85aeb119b 100644 | ||
3920 | --- a/net/8021q/vlan_netlink.c | ||
3921 | +++ b/net/8021q/vlan_netlink.c | ||
3922 | @@ -108,11 +108,13 @@ static int vlan_changelink(struct net_device *dev, struct nlattr *tb[], | ||
3923 | struct ifla_vlan_flags *flags; | ||
3924 | struct ifla_vlan_qos_mapping *m; | ||
3925 | struct nlattr *attr; | ||
3926 | - int rem; | ||
3927 | + int rem, err; | ||
3928 | |||
3929 | if (data[IFLA_VLAN_FLAGS]) { | ||
3930 | flags = nla_data(data[IFLA_VLAN_FLAGS]); | ||
3931 | - vlan_dev_change_flags(dev, flags->flags, flags->mask); | ||
3932 | + err = vlan_dev_change_flags(dev, flags->flags, flags->mask); | ||
3933 | + if (err) | ||
3934 | + return err; | ||
3935 | } | ||
3936 | if (data[IFLA_VLAN_INGRESS_QOS]) { | ||
3937 | nla_for_each_nested(attr, data[IFLA_VLAN_INGRESS_QOS], rem) { | ||
3938 | @@ -123,7 +125,9 @@ static int vlan_changelink(struct net_device *dev, struct nlattr *tb[], | ||
3939 | if (data[IFLA_VLAN_EGRESS_QOS]) { | ||
3940 | nla_for_each_nested(attr, data[IFLA_VLAN_EGRESS_QOS], rem) { | ||
3941 | m = nla_data(attr); | ||
3942 | - vlan_dev_set_egress_priority(dev, m->from, m->to); | ||
3943 | + err = vlan_dev_set_egress_priority(dev, m->from, m->to); | ||
3944 | + if (err) | ||
3945 | + return err; | ||
3946 | } | ||
3947 | } | ||
3948 | return 0; | ||
3949 | @@ -179,10 +183,11 @@ static int vlan_newlink(struct net *src_net, struct net_device *dev, | ||
3950 | return -EINVAL; | ||
3951 | |||
3952 | err = vlan_changelink(dev, tb, data, extack); | ||
3953 | - if (err < 0) | ||
3954 | - return err; | ||
3955 | - | ||
3956 | - return register_vlan_dev(dev, extack); | ||
3957 | + if (!err) | ||
3958 | + err = register_vlan_dev(dev, extack); | ||
3959 | + if (err) | ||
3960 | + vlan_dev_uninit(dev); | ||
3961 | + return err; | ||
3962 | } | ||
3963 | |||
3964 | static inline size_t vlan_qos_map_size(unsigned int n) | ||
3965 | diff --git a/net/core/filter.c b/net/core/filter.c | ||
3966 | index 6d0111bfdb4a..2f76461c120d 100644 | ||
3967 | --- a/net/core/filter.c | ||
3968 | +++ b/net/core/filter.c | ||
3969 | @@ -2055,6 +2055,7 @@ static inline int __bpf_tx_skb(struct net_device *dev, struct sk_buff *skb) | ||
3970 | } | ||
3971 | |||
3972 | skb->dev = dev; | ||
3973 | + skb->tstamp = 0; | ||
3974 | |||
3975 | dev_xmit_recursion_inc(); | ||
3976 | ret = dev_queue_xmit(skb); | ||
3977 | diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c | ||
3978 | index a2e52ad7cdab..67e44e6717b0 100644 | ||
3979 | --- a/net/ipv4/tcp_input.c | ||
3980 | +++ b/net/ipv4/tcp_input.c | ||
3981 | @@ -1727,8 +1727,11 @@ tcp_sacktag_write_queue(struct sock *sk, const struct sk_buff *ack_skb, | ||
3982 | } | ||
3983 | |||
3984 | /* Ignore very old stuff early */ | ||
3985 | - if (!after(sp[used_sacks].end_seq, prior_snd_una)) | ||
3986 | + if (!after(sp[used_sacks].end_seq, prior_snd_una)) { | ||
3987 | + if (i == 0) | ||
3988 | + first_sack_index = -1; | ||
3989 | continue; | ||
3990 | + } | ||
3991 | |||
3992 | used_sacks++; | ||
3993 | } | ||
3994 | diff --git a/net/llc/llc_station.c b/net/llc/llc_station.c | ||
3995 | index 204a8351efff..c29170e767a8 100644 | ||
3996 | --- a/net/llc/llc_station.c | ||
3997 | +++ b/net/llc/llc_station.c | ||
3998 | @@ -32,7 +32,7 @@ static int llc_stat_ev_rx_null_dsap_xid_c(struct sk_buff *skb) | ||
3999 | return LLC_PDU_IS_CMD(pdu) && /* command PDU */ | ||
4000 | LLC_PDU_TYPE_IS_U(pdu) && /* U type PDU */ | ||
4001 | LLC_U_PDU_CMD(pdu) == LLC_1_PDU_CMD_XID && | ||
4002 | - !pdu->dsap ? 0 : 1; /* NULL DSAP value */ | ||
4003 | + !pdu->dsap; /* NULL DSAP value */ | ||
4004 | } | ||
4005 | |||
4006 | static int llc_stat_ev_rx_null_dsap_test_c(struct sk_buff *skb) | ||
4007 | @@ -42,7 +42,7 @@ static int llc_stat_ev_rx_null_dsap_test_c(struct sk_buff *skb) | ||
4008 | return LLC_PDU_IS_CMD(pdu) && /* command PDU */ | ||
4009 | LLC_PDU_TYPE_IS_U(pdu) && /* U type PDU */ | ||
4010 | LLC_U_PDU_CMD(pdu) == LLC_1_PDU_CMD_TEST && | ||
4011 | - !pdu->dsap ? 0 : 1; /* NULL DSAP */ | ||
4012 | + !pdu->dsap; /* NULL DSAP */ | ||
4013 | } | ||
4014 | |||
4015 | static int llc_station_ac_send_xid_r(struct sk_buff *skb) | ||
4016 | diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c | ||
4017 | index 1fa422782905..cbd273c0b275 100644 | ||
4018 | --- a/net/mac80211/tx.c | ||
4019 | +++ b/net/mac80211/tx.c | ||
4020 | @@ -2263,6 +2263,15 @@ netdev_tx_t ieee80211_monitor_start_xmit(struct sk_buff *skb, | ||
4021 | payload[7]); | ||
4022 | } | ||
4023 | |||
4024 | + /* | ||
4025 | + * Initialize skb->priority for QoS frames. This is put in the TID field | ||
4026 | + * of the frame before passing it to the driver. | ||
4027 | + */ | ||
4028 | + if (ieee80211_is_data_qos(hdr->frame_control)) { | ||
4029 | + u8 *p = ieee80211_get_qos_ctl(hdr); | ||
4030 | + skb->priority = *p & IEEE80211_QOS_CTL_TAG1D_MASK; | ||
4031 | + } | ||
4032 | + | ||
4033 | memset(info, 0, sizeof(*info)); | ||
4034 | |||
4035 | info->flags = IEEE80211_TX_CTL_REQ_TX_STATUS | | ||
4036 | diff --git a/net/netfilter/nf_conntrack_netlink.c b/net/netfilter/nf_conntrack_netlink.c | ||
4037 | index e2d13cd18875..aa8adf930b3c 100644 | ||
4038 | --- a/net/netfilter/nf_conntrack_netlink.c | ||
4039 | +++ b/net/netfilter/nf_conntrack_netlink.c | ||
4040 | @@ -3602,6 +3602,9 @@ static void __net_exit ctnetlink_net_exit_batch(struct list_head *net_exit_list) | ||
4041 | |||
4042 | list_for_each_entry(net, net_exit_list, exit_list) | ||
4043 | ctnetlink_net_exit(net); | ||
4044 | + | ||
4045 | + /* wait for other cpus until they are done with ctnl_notifiers */ | ||
4046 | + synchronize_rcu(); | ||
4047 | } | ||
4048 | |||
4049 | static struct pernet_operations ctnetlink_net_ops = { | ||
4050 | diff --git a/net/netfilter/nf_tables_api.c b/net/netfilter/nf_tables_api.c | ||
4051 | index 712a428509ad..67ca47c7ce54 100644 | ||
4052 | --- a/net/netfilter/nf_tables_api.c | ||
4053 | +++ b/net/netfilter/nf_tables_api.c | ||
4054 | @@ -4252,8 +4252,10 @@ static int nft_get_set_elem(struct nft_ctx *ctx, struct nft_set *set, | ||
4055 | return err; | ||
4056 | |||
4057 | err = -EINVAL; | ||
4058 | - if (desc.type != NFT_DATA_VALUE || desc.len != set->klen) | ||
4059 | + if (desc.type != NFT_DATA_VALUE || desc.len != set->klen) { | ||
4060 | + nft_data_release(&elem.key.val, desc.type); | ||
4061 | return err; | ||
4062 | + } | ||
4063 | |||
4064 | priv = set->ops->get(ctx->net, set, &elem, flags); | ||
4065 | if (IS_ERR(priv)) | ||
4066 | @@ -4489,14 +4491,20 @@ static int nft_add_set_elem(struct nft_ctx *ctx, struct nft_set *set, | ||
4067 | if (nla[NFTA_SET_ELEM_DATA] == NULL && | ||
4068 | !(flags & NFT_SET_ELEM_INTERVAL_END)) | ||
4069 | return -EINVAL; | ||
4070 | - if (nla[NFTA_SET_ELEM_DATA] != NULL && | ||
4071 | - flags & NFT_SET_ELEM_INTERVAL_END) | ||
4072 | - return -EINVAL; | ||
4073 | } else { | ||
4074 | if (nla[NFTA_SET_ELEM_DATA] != NULL) | ||
4075 | return -EINVAL; | ||
4076 | } | ||
4077 | |||
4078 | + if ((flags & NFT_SET_ELEM_INTERVAL_END) && | ||
4079 | + (nla[NFTA_SET_ELEM_DATA] || | ||
4080 | + nla[NFTA_SET_ELEM_OBJREF] || | ||
4081 | + nla[NFTA_SET_ELEM_TIMEOUT] || | ||
4082 | + nla[NFTA_SET_ELEM_EXPIRATION] || | ||
4083 | + nla[NFTA_SET_ELEM_USERDATA] || | ||
4084 | + nla[NFTA_SET_ELEM_EXPR])) | ||
4085 | + return -EINVAL; | ||
4086 | + | ||
4087 | timeout = 0; | ||
4088 | if (nla[NFTA_SET_ELEM_TIMEOUT] != NULL) { | ||
4089 | if (!(set->flags & NFT_SET_TIMEOUT)) | ||
4090 | @@ -5209,7 +5217,7 @@ static int nf_tables_newobj(struct net *net, struct sock *nlsk, | ||
4091 | if (nlh->nlmsg_flags & NLM_F_REPLACE) | ||
4092 | return -EOPNOTSUPP; | ||
4093 | |||
4094 | - type = nft_obj_type_get(net, objtype); | ||
4095 | + type = __nft_obj_type_get(objtype); | ||
4096 | nft_ctx_init(&ctx, net, skb, nlh, family, table, NULL, nla); | ||
4097 | |||
4098 | return nf_tables_updobj(&ctx, type, nla[NFTA_OBJ_DATA], obj); | ||
4099 | diff --git a/net/netfilter/nf_tables_offload.c b/net/netfilter/nf_tables_offload.c | ||
4100 | index 5f6037695dee..e743f811245f 100644 | ||
4101 | --- a/net/netfilter/nf_tables_offload.c | ||
4102 | +++ b/net/netfilter/nf_tables_offload.c | ||
4103 | @@ -44,6 +44,9 @@ struct nft_flow_rule *nft_flow_rule_create(struct net *net, | ||
4104 | expr = nft_expr_next(expr); | ||
4105 | } | ||
4106 | |||
4107 | + if (num_actions == 0) | ||
4108 | + return ERR_PTR(-EOPNOTSUPP); | ||
4109 | + | ||
4110 | flow = nft_flow_rule_alloc(num_actions); | ||
4111 | if (!flow) | ||
4112 | return ERR_PTR(-ENOMEM); | ||
4113 | @@ -446,6 +449,9 @@ static int nft_offload_netdev_event(struct notifier_block *this, | ||
4114 | struct net *net = dev_net(dev); | ||
4115 | struct nft_chain *chain; | ||
4116 | |||
4117 | + if (event != NETDEV_UNREGISTER) | ||
4118 | + return NOTIFY_DONE; | ||
4119 | + | ||
4120 | mutex_lock(&net->nft.commit_mutex); | ||
4121 | chain = __nft_offload_get_chain(dev); | ||
4122 | if (chain) | ||
4123 | diff --git a/net/netfilter/nft_bitwise.c b/net/netfilter/nft_bitwise.c | ||
4124 | index 02afa752dd2e..10e9d50e4e19 100644 | ||
4125 | --- a/net/netfilter/nft_bitwise.c | ||
4126 | +++ b/net/netfilter/nft_bitwise.c | ||
4127 | @@ -80,7 +80,7 @@ static int nft_bitwise_init(const struct nft_ctx *ctx, | ||
4128 | tb[NFTA_BITWISE_MASK]); | ||
4129 | if (err < 0) | ||
4130 | return err; | ||
4131 | - if (d1.len != priv->len) { | ||
4132 | + if (d1.type != NFT_DATA_VALUE || d1.len != priv->len) { | ||
4133 | err = -EINVAL; | ||
4134 | goto err1; | ||
4135 | } | ||
4136 | @@ -89,7 +89,7 @@ static int nft_bitwise_init(const struct nft_ctx *ctx, | ||
4137 | tb[NFTA_BITWISE_XOR]); | ||
4138 | if (err < 0) | ||
4139 | goto err1; | ||
4140 | - if (d2.len != priv->len) { | ||
4141 | + if (d2.type != NFT_DATA_VALUE || d2.len != priv->len) { | ||
4142 | err = -EINVAL; | ||
4143 | goto err2; | ||
4144 | } | ||
4145 | diff --git a/net/netfilter/nft_cmp.c b/net/netfilter/nft_cmp.c | ||
4146 | index 0744b2bb46da..ae730dba60c8 100644 | ||
4147 | --- a/net/netfilter/nft_cmp.c | ||
4148 | +++ b/net/netfilter/nft_cmp.c | ||
4149 | @@ -80,6 +80,12 @@ static int nft_cmp_init(const struct nft_ctx *ctx, const struct nft_expr *expr, | ||
4150 | if (err < 0) | ||
4151 | return err; | ||
4152 | |||
4153 | + if (desc.type != NFT_DATA_VALUE) { | ||
4154 | + err = -EINVAL; | ||
4155 | + nft_data_release(&priv->data, desc.type); | ||
4156 | + return err; | ||
4157 | + } | ||
4158 | + | ||
4159 | priv->sreg = nft_parse_register(tb[NFTA_CMP_SREG]); | ||
4160 | err = nft_validate_register_load(priv->sreg, desc.len); | ||
4161 | if (err < 0) | ||
4162 | diff --git a/net/netfilter/nft_range.c b/net/netfilter/nft_range.c | ||
4163 | index 4701fa8a45e7..89efcc5a533d 100644 | ||
4164 | --- a/net/netfilter/nft_range.c | ||
4165 | +++ b/net/netfilter/nft_range.c | ||
4166 | @@ -66,11 +66,21 @@ static int nft_range_init(const struct nft_ctx *ctx, const struct nft_expr *expr | ||
4167 | if (err < 0) | ||
4168 | return err; | ||
4169 | |||
4170 | + if (desc_from.type != NFT_DATA_VALUE) { | ||
4171 | + err = -EINVAL; | ||
4172 | + goto err1; | ||
4173 | + } | ||
4174 | + | ||
4175 | err = nft_data_init(NULL, &priv->data_to, sizeof(priv->data_to), | ||
4176 | &desc_to, tb[NFTA_RANGE_TO_DATA]); | ||
4177 | if (err < 0) | ||
4178 | goto err1; | ||
4179 | |||
4180 | + if (desc_to.type != NFT_DATA_VALUE) { | ||
4181 | + err = -EINVAL; | ||
4182 | + goto err2; | ||
4183 | + } | ||
4184 | + | ||
4185 | if (desc_from.len != desc_to.len) { | ||
4186 | err = -EINVAL; | ||
4187 | goto err2; | ||
4188 | diff --git a/net/netfilter/nft_set_rbtree.c b/net/netfilter/nft_set_rbtree.c | ||
4189 | index 57123259452f..a9f804f7a04a 100644 | ||
4190 | --- a/net/netfilter/nft_set_rbtree.c | ||
4191 | +++ b/net/netfilter/nft_set_rbtree.c | ||
4192 | @@ -74,8 +74,13 @@ static bool __nft_rbtree_lookup(const struct net *net, const struct nft_set *set | ||
4193 | parent = rcu_dereference_raw(parent->rb_left); | ||
4194 | continue; | ||
4195 | } | ||
4196 | - if (nft_rbtree_interval_end(rbe)) | ||
4197 | - goto out; | ||
4198 | + if (nft_rbtree_interval_end(rbe)) { | ||
4199 | + if (nft_set_is_anonymous(set)) | ||
4200 | + return false; | ||
4201 | + parent = rcu_dereference_raw(parent->rb_left); | ||
4202 | + interval = NULL; | ||
4203 | + continue; | ||
4204 | + } | ||
4205 | |||
4206 | *ext = &rbe->ext; | ||
4207 | return true; | ||
4208 | @@ -88,7 +93,7 @@ static bool __nft_rbtree_lookup(const struct net *net, const struct nft_set *set | ||
4209 | *ext = &interval->ext; | ||
4210 | return true; | ||
4211 | } | ||
4212 | -out: | ||
4213 | + | ||
4214 | return false; | ||
4215 | } | ||
4216 | |||
4217 | @@ -139,8 +144,10 @@ static bool __nft_rbtree_get(const struct net *net, const struct nft_set *set, | ||
4218 | if (flags & NFT_SET_ELEM_INTERVAL_END) | ||
4219 | interval = rbe; | ||
4220 | } else { | ||
4221 | - if (!nft_set_elem_active(&rbe->ext, genmask)) | ||
4222 | + if (!nft_set_elem_active(&rbe->ext, genmask)) { | ||
4223 | parent = rcu_dereference_raw(parent->rb_left); | ||
4224 | + continue; | ||
4225 | + } | ||
4226 | |||
4227 | if (!nft_set_ext_exists(&rbe->ext, NFT_SET_EXT_FLAGS) || | ||
4228 | (*nft_set_ext_flags(&rbe->ext) & NFT_SET_ELEM_INTERVAL_END) == | ||
4229 | @@ -148,7 +155,11 @@ static bool __nft_rbtree_get(const struct net *net, const struct nft_set *set, | ||
4230 | *elem = rbe; | ||
4231 | return true; | ||
4232 | } | ||
4233 | - return false; | ||
4234 | + | ||
4235 | + if (nft_rbtree_interval_end(rbe)) | ||
4236 | + interval = NULL; | ||
4237 | + | ||
4238 | + parent = rcu_dereference_raw(parent->rb_left); | ||
4239 | } | ||
4240 | } | ||
4241 | |||
4242 | diff --git a/net/rfkill/core.c b/net/rfkill/core.c | ||
4243 | index 0bf9bf1ceb8f..6c089320ae4f 100644 | ||
4244 | --- a/net/rfkill/core.c | ||
4245 | +++ b/net/rfkill/core.c | ||
4246 | @@ -1002,10 +1002,13 @@ static void rfkill_sync_work(struct work_struct *work) | ||
4247 | int __must_check rfkill_register(struct rfkill *rfkill) | ||
4248 | { | ||
4249 | static unsigned long rfkill_no; | ||
4250 | - struct device *dev = &rfkill->dev; | ||
4251 | + struct device *dev; | ||
4252 | int error; | ||
4253 | |||
4254 | - BUG_ON(!rfkill); | ||
4255 | + if (!rfkill) | ||
4256 | + return -EINVAL; | ||
4257 | + | ||
4258 | + dev = &rfkill->dev; | ||
4259 | |||
4260 | mutex_lock(&rfkill_global_mutex); | ||
4261 | |||
4262 | diff --git a/net/sched/sch_cake.c b/net/sched/sch_cake.c | ||
4263 | index 53a80bc6b13a..dd0e8680b030 100644 | ||
4264 | --- a/net/sched/sch_cake.c | ||
4265 | +++ b/net/sched/sch_cake.c | ||
4266 | @@ -1769,7 +1769,7 @@ static s32 cake_enqueue(struct sk_buff *skb, struct Qdisc *sch, | ||
4267 | q->avg_window_begin)); | ||
4268 | u64 b = q->avg_window_bytes * (u64)NSEC_PER_SEC; | ||
4269 | |||
4270 | - do_div(b, window_interval); | ||
4271 | + b = div64_u64(b, window_interval); | ||
4272 | q->avg_peak_bandwidth = | ||
4273 | cake_ewma(q->avg_peak_bandwidth, b, | ||
4274 | b > q->avg_peak_bandwidth ? 2 : 8); | ||
4275 | diff --git a/net/sched/sch_fq.c b/net/sched/sch_fq.c | ||
4276 | index 78ecdf146882..712ad248d6a7 100644 | ||
4277 | --- a/net/sched/sch_fq.c | ||
4278 | +++ b/net/sched/sch_fq.c | ||
4279 | @@ -787,10 +787,12 @@ static int fq_change(struct Qdisc *sch, struct nlattr *opt, | ||
4280 | if (tb[TCA_FQ_QUANTUM]) { | ||
4281 | u32 quantum = nla_get_u32(tb[TCA_FQ_QUANTUM]); | ||
4282 | |||
4283 | - if (quantum > 0) | ||
4284 | + if (quantum > 0 && quantum <= (1 << 20)) { | ||
4285 | q->quantum = quantum; | ||
4286 | - else | ||
4287 | + } else { | ||
4288 | + NL_SET_ERR_MSG_MOD(extack, "invalid quantum"); | ||
4289 | err = -EINVAL; | ||
4290 | + } | ||
4291 | } | ||
4292 | |||
4293 | if (tb[TCA_FQ_INITIAL_QUANTUM]) | ||
4294 | diff --git a/net/sched/sch_prio.c b/net/sched/sch_prio.c | ||
4295 | index 18b884cfdfe8..647941702f9f 100644 | ||
4296 | --- a/net/sched/sch_prio.c | ||
4297 | +++ b/net/sched/sch_prio.c | ||
4298 | @@ -292,8 +292,14 @@ static int prio_graft(struct Qdisc *sch, unsigned long arg, struct Qdisc *new, | ||
4299 | struct tc_prio_qopt_offload graft_offload; | ||
4300 | unsigned long band = arg - 1; | ||
4301 | |||
4302 | - if (new == NULL) | ||
4303 | - new = &noop_qdisc; | ||
4304 | + if (!new) { | ||
4305 | + new = qdisc_create_dflt(sch->dev_queue, &pfifo_qdisc_ops, | ||
4306 | + TC_H_MAKE(sch->handle, arg), extack); | ||
4307 | + if (!new) | ||
4308 | + new = &noop_qdisc; | ||
4309 | + else | ||
4310 | + qdisc_hash_add(new, true); | ||
4311 | + } | ||
4312 | |||
4313 | *old = qdisc_replace(sch, new, &q->queues[band]); | ||
4314 | |||
4315 | diff --git a/net/sctp/sm_sideeffect.c b/net/sctp/sm_sideeffect.c | ||
4316 | index e52b2128e43b..b06cae508158 100644 | ||
4317 | --- a/net/sctp/sm_sideeffect.c | ||
4318 | +++ b/net/sctp/sm_sideeffect.c | ||
4319 | @@ -1358,8 +1358,10 @@ static int sctp_cmd_interpreter(enum sctp_event_type event_type, | ||
4320 | /* Generate an INIT ACK chunk. */ | ||
4321 | new_obj = sctp_make_init_ack(asoc, chunk, GFP_ATOMIC, | ||
4322 | 0); | ||
4323 | - if (!new_obj) | ||
4324 | - goto nomem; | ||
4325 | + if (!new_obj) { | ||
4326 | + error = -ENOMEM; | ||
4327 | + break; | ||
4328 | + } | ||
4329 | |||
4330 | sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, | ||
4331 | SCTP_CHUNK(new_obj)); | ||
4332 | @@ -1381,7 +1383,8 @@ static int sctp_cmd_interpreter(enum sctp_event_type event_type, | ||
4333 | if (!new_obj) { | ||
4334 | if (cmd->obj.chunk) | ||
4335 | sctp_chunk_free(cmd->obj.chunk); | ||
4336 | - goto nomem; | ||
4337 | + error = -ENOMEM; | ||
4338 | + break; | ||
4339 | } | ||
4340 | sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, | ||
4341 | SCTP_CHUNK(new_obj)); | ||
4342 | @@ -1428,8 +1431,10 @@ static int sctp_cmd_interpreter(enum sctp_event_type event_type, | ||
4343 | |||
4344 | /* Generate a SHUTDOWN chunk. */ | ||
4345 | new_obj = sctp_make_shutdown(asoc, chunk); | ||
4346 | - if (!new_obj) | ||
4347 | - goto nomem; | ||
4348 | + if (!new_obj) { | ||
4349 | + error = -ENOMEM; | ||
4350 | + break; | ||
4351 | + } | ||
4352 | sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, | ||
4353 | SCTP_CHUNK(new_obj)); | ||
4354 | break; | ||
4355 | @@ -1765,11 +1770,17 @@ static int sctp_cmd_interpreter(enum sctp_event_type event_type, | ||
4356 | break; | ||
4357 | } | ||
4358 | |||
4359 | - if (error) | ||
4360 | + if (error) { | ||
4361 | + cmd = sctp_next_cmd(commands); | ||
4362 | + while (cmd) { | ||
4363 | + if (cmd->verb == SCTP_CMD_REPLY) | ||
4364 | + sctp_chunk_free(cmd->obj.chunk); | ||
4365 | + cmd = sctp_next_cmd(commands); | ||
4366 | + } | ||
4367 | break; | ||
4368 | + } | ||
4369 | } | ||
4370 | |||
4371 | -out: | ||
4372 | /* If this is in response to a received chunk, wait until | ||
4373 | * we are done with the packet to open the queue so that we don't | ||
4374 | * send multiple packets in response to a single request. | ||
4375 | @@ -1784,7 +1795,4 @@ out: | ||
4376 | sp->data_ready_signalled = 0; | ||
4377 | |||
4378 | return error; | ||
4379 | -nomem: | ||
4380 | - error = -ENOMEM; | ||
4381 | - goto out; | ||
4382 | } | ||
4383 | diff --git a/net/wireless/core.c b/net/wireless/core.c | ||
4384 | index 350513744575..3e25229a059d 100644 | ||
4385 | --- a/net/wireless/core.c | ||
4386 | +++ b/net/wireless/core.c | ||
4387 | @@ -1102,6 +1102,7 @@ static void __cfg80211_unregister_wdev(struct wireless_dev *wdev, bool sync) | ||
4388 | |||
4389 | #ifdef CONFIG_CFG80211_WEXT | ||
4390 | kzfree(wdev->wext.keys); | ||
4391 | + wdev->wext.keys = NULL; | ||
4392 | #endif | ||
4393 | /* only initialized if we have a netdev */ | ||
4394 | if (wdev->netdev) | ||
4395 | diff --git a/net/xdp/xsk.c b/net/xdp/xsk.c | ||
4396 | index 9044073fbf22..d426fc01c529 100644 | ||
4397 | --- a/net/xdp/xsk.c | ||
4398 | +++ b/net/xdp/xsk.c | ||
4399 | @@ -305,12 +305,21 @@ out: | ||
4400 | } | ||
4401 | EXPORT_SYMBOL(xsk_umem_consume_tx); | ||
4402 | |||
4403 | -static int xsk_zc_xmit(struct xdp_sock *xs) | ||
4404 | +static int xsk_wakeup(struct xdp_sock *xs, u8 flags) | ||
4405 | { | ||
4406 | struct net_device *dev = xs->dev; | ||
4407 | + int err; | ||
4408 | + | ||
4409 | + rcu_read_lock(); | ||
4410 | + err = dev->netdev_ops->ndo_xsk_wakeup(dev, xs->queue_id, flags); | ||
4411 | + rcu_read_unlock(); | ||
4412 | + | ||
4413 | + return err; | ||
4414 | +} | ||
4415 | |||
4416 | - return dev->netdev_ops->ndo_xsk_wakeup(dev, xs->queue_id, | ||
4417 | - XDP_WAKEUP_TX); | ||
4418 | +static int xsk_zc_xmit(struct xdp_sock *xs) | ||
4419 | +{ | ||
4420 | + return xsk_wakeup(xs, XDP_WAKEUP_TX); | ||
4421 | } | ||
4422 | |||
4423 | static void xsk_destruct_skb(struct sk_buff *skb) | ||
4424 | @@ -424,19 +433,16 @@ static unsigned int xsk_poll(struct file *file, struct socket *sock, | ||
4425 | unsigned int mask = datagram_poll(file, sock, wait); | ||
4426 | struct sock *sk = sock->sk; | ||
4427 | struct xdp_sock *xs = xdp_sk(sk); | ||
4428 | - struct net_device *dev; | ||
4429 | struct xdp_umem *umem; | ||
4430 | |||
4431 | if (unlikely(!xsk_is_bound(xs))) | ||
4432 | return mask; | ||
4433 | |||
4434 | - dev = xs->dev; | ||
4435 | umem = xs->umem; | ||
4436 | |||
4437 | if (umem->need_wakeup) { | ||
4438 | - if (dev->netdev_ops->ndo_xsk_wakeup) | ||
4439 | - dev->netdev_ops->ndo_xsk_wakeup(dev, xs->queue_id, | ||
4440 | - umem->need_wakeup); | ||
4441 | + if (xs->zc) | ||
4442 | + xsk_wakeup(xs, umem->need_wakeup); | ||
4443 | else | ||
4444 | /* Poll needs to drive Tx also in copy mode */ | ||
4445 | __xsk_sendmsg(sk); | ||
4446 | diff --git a/samples/bpf/syscall_tp_kern.c b/samples/bpf/syscall_tp_kern.c | ||
4447 | index 1d78819ffef1..630ce8c4d5a2 100644 | ||
4448 | --- a/samples/bpf/syscall_tp_kern.c | ||
4449 | +++ b/samples/bpf/syscall_tp_kern.c | ||
4450 | @@ -47,13 +47,27 @@ static __always_inline void count(void *map) | ||
4451 | SEC("tracepoint/syscalls/sys_enter_open") | ||
4452 | int trace_enter_open(struct syscalls_enter_open_args *ctx) | ||
4453 | { | ||
4454 | - count((void *)&enter_open_map); | ||
4455 | + count(&enter_open_map); | ||
4456 | + return 0; | ||
4457 | +} | ||
4458 | + | ||
4459 | +SEC("tracepoint/syscalls/sys_enter_openat") | ||
4460 | +int trace_enter_open_at(struct syscalls_enter_open_args *ctx) | ||
4461 | +{ | ||
4462 | + count(&enter_open_map); | ||
4463 | return 0; | ||
4464 | } | ||
4465 | |||
4466 | SEC("tracepoint/syscalls/sys_exit_open") | ||
4467 | int trace_enter_exit(struct syscalls_exit_open_args *ctx) | ||
4468 | { | ||
4469 | - count((void *)&exit_open_map); | ||
4470 | + count(&exit_open_map); | ||
4471 | + return 0; | ||
4472 | +} | ||
4473 | + | ||
4474 | +SEC("tracepoint/syscalls/sys_exit_openat") | ||
4475 | +int trace_enter_exit_at(struct syscalls_exit_open_args *ctx) | ||
4476 | +{ | ||
4477 | + count(&exit_open_map); | ||
4478 | return 0; | ||
4479 | } | ||
4480 | diff --git a/samples/bpf/trace_event_user.c b/samples/bpf/trace_event_user.c | ||
4481 | index 16a16eadd509..749a50f2f9f3 100644 | ||
4482 | --- a/samples/bpf/trace_event_user.c | ||
4483 | +++ b/samples/bpf/trace_event_user.c | ||
4484 | @@ -37,9 +37,9 @@ static void print_ksym(__u64 addr) | ||
4485 | } | ||
4486 | |||
4487 | printf("%s;", sym->name); | ||
4488 | - if (!strcmp(sym->name, "sys_read")) | ||
4489 | + if (!strstr(sym->name, "sys_read")) | ||
4490 | sys_read_seen = true; | ||
4491 | - else if (!strcmp(sym->name, "sys_write")) | ||
4492 | + else if (!strstr(sym->name, "sys_write")) | ||
4493 | sys_write_seen = true; | ||
4494 | } | ||
4495 | |||
4496 | diff --git a/scripts/kconfig/expr.c b/scripts/kconfig/expr.c | ||
4497 | index 77ffff3a053c..9f1de58e9f0c 100644 | ||
4498 | --- a/scripts/kconfig/expr.c | ||
4499 | +++ b/scripts/kconfig/expr.c | ||
4500 | @@ -254,6 +254,13 @@ static int expr_eq(struct expr *e1, struct expr *e2) | ||
4501 | { | ||
4502 | int res, old_count; | ||
4503 | |||
4504 | + /* | ||
4505 | + * A NULL expr is taken to be yes, but there's also a different way to | ||
4506 | + * represent yes. expr_is_yes() checks for either representation. | ||
4507 | + */ | ||
4508 | + if (!e1 || !e2) | ||
4509 | + return expr_is_yes(e1) && expr_is_yes(e2); | ||
4510 | + | ||
4511 | if (e1->type != e2->type) | ||
4512 | return 0; | ||
4513 | switch (e1->type) { | ||
4514 | diff --git a/scripts/package/mkdebian b/scripts/package/mkdebian | ||
4515 | index e0750b70453f..7c230016b08d 100755 | ||
4516 | --- a/scripts/package/mkdebian | ||
4517 | +++ b/scripts/package/mkdebian | ||
4518 | @@ -174,7 +174,7 @@ Source: $sourcename | ||
4519 | Section: kernel | ||
4520 | Priority: optional | ||
4521 | Maintainer: $maintainer | ||
4522 | -Build-Depends: bc, kmod, cpio, bison, flex | flex:native $extra_build_depends | ||
4523 | +Build-Depends: bc, rsync, kmod, cpio, bison, flex | flex:native $extra_build_depends | ||
4524 | Homepage: http://www.kernel.org/ | ||
4525 | |||
4526 | Package: $packagename | ||
4527 | diff --git a/sound/soc/codecs/max98090.c b/sound/soc/codecs/max98090.c | ||
4528 | index f6bf4cfbea23..45da2b51543e 100644 | ||
4529 | --- a/sound/soc/codecs/max98090.c | ||
4530 | +++ b/sound/soc/codecs/max98090.c | ||
4531 | @@ -2103,10 +2103,8 @@ static void max98090_pll_det_disable_work(struct work_struct *work) | ||
4532 | M98090_IULK_MASK, 0); | ||
4533 | } | ||
4534 | |||
4535 | -static void max98090_pll_work(struct work_struct *work) | ||
4536 | +static void max98090_pll_work(struct max98090_priv *max98090) | ||
4537 | { | ||
4538 | - struct max98090_priv *max98090 = | ||
4539 | - container_of(work, struct max98090_priv, pll_work); | ||
4540 | struct snd_soc_component *component = max98090->component; | ||
4541 | |||
4542 | if (!snd_soc_component_is_active(component)) | ||
4543 | @@ -2259,7 +2257,7 @@ static irqreturn_t max98090_interrupt(int irq, void *data) | ||
4544 | |||
4545 | if (active & M98090_ULK_MASK) { | ||
4546 | dev_dbg(component->dev, "M98090_ULK_MASK\n"); | ||
4547 | - schedule_work(&max98090->pll_work); | ||
4548 | + max98090_pll_work(max98090); | ||
4549 | } | ||
4550 | |||
4551 | if (active & M98090_JDET_MASK) { | ||
4552 | @@ -2422,7 +2420,6 @@ static int max98090_probe(struct snd_soc_component *component) | ||
4553 | max98090_pll_det_enable_work); | ||
4554 | INIT_WORK(&max98090->pll_det_disable_work, | ||
4555 | max98090_pll_det_disable_work); | ||
4556 | - INIT_WORK(&max98090->pll_work, max98090_pll_work); | ||
4557 | |||
4558 | /* Enable jack detection */ | ||
4559 | snd_soc_component_write(component, M98090_REG_JACK_DETECT, | ||
4560 | @@ -2475,7 +2472,6 @@ static void max98090_remove(struct snd_soc_component *component) | ||
4561 | cancel_delayed_work_sync(&max98090->jack_work); | ||
4562 | cancel_delayed_work_sync(&max98090->pll_det_enable_work); | ||
4563 | cancel_work_sync(&max98090->pll_det_disable_work); | ||
4564 | - cancel_work_sync(&max98090->pll_work); | ||
4565 | max98090->component = NULL; | ||
4566 | } | ||
4567 | |||
4568 | diff --git a/sound/soc/codecs/max98090.h b/sound/soc/codecs/max98090.h | ||
4569 | index 57965cd678b4..a197114b0dad 100644 | ||
4570 | --- a/sound/soc/codecs/max98090.h | ||
4571 | +++ b/sound/soc/codecs/max98090.h | ||
4572 | @@ -1530,7 +1530,6 @@ struct max98090_priv { | ||
4573 | struct delayed_work jack_work; | ||
4574 | struct delayed_work pll_det_enable_work; | ||
4575 | struct work_struct pll_det_disable_work; | ||
4576 | - struct work_struct pll_work; | ||
4577 | struct snd_soc_jack *jack; | ||
4578 | unsigned int dai_fmt; | ||
4579 | int tdm_slots; | ||
4580 | diff --git a/sound/soc/codecs/rt5682.c b/sound/soc/codecs/rt5682.c | ||
4581 | index c50b75ce82e0..05e883a65d7a 100644 | ||
4582 | --- a/sound/soc/codecs/rt5682.c | ||
4583 | +++ b/sound/soc/codecs/rt5682.c | ||
4584 | @@ -72,6 +72,7 @@ struct rt5682_priv { | ||
4585 | static const struct reg_sequence patch_list[] = { | ||
4586 | {RT5682_HP_IMP_SENS_CTRL_19, 0x1000}, | ||
4587 | {RT5682_DAC_ADC_DIG_VOL1, 0xa020}, | ||
4588 | + {RT5682_I2C_CTRL, 0x000f}, | ||
4589 | }; | ||
4590 | |||
4591 | static const struct reg_default rt5682_reg[] = { | ||
4592 | @@ -2481,6 +2482,7 @@ static void rt5682_calibrate(struct rt5682_priv *rt5682) | ||
4593 | mutex_lock(&rt5682->calibrate_mutex); | ||
4594 | |||
4595 | rt5682_reset(rt5682->regmap); | ||
4596 | + regmap_write(rt5682->regmap, RT5682_I2C_CTRL, 0x000f); | ||
4597 | regmap_write(rt5682->regmap, RT5682_PWR_ANLG_1, 0xa2af); | ||
4598 | usleep_range(15000, 20000); | ||
4599 | regmap_write(rt5682->regmap, RT5682_PWR_ANLG_1, 0xf2af); | ||
4600 | diff --git a/sound/soc/codecs/wm8962.c b/sound/soc/codecs/wm8962.c | ||
4601 | index 3e5c69fbc33a..d9d59f45833f 100644 | ||
4602 | --- a/sound/soc/codecs/wm8962.c | ||
4603 | +++ b/sound/soc/codecs/wm8962.c | ||
4604 | @@ -2788,7 +2788,7 @@ static int fll_factors(struct _fll_div *fll_div, unsigned int Fref, | ||
4605 | |||
4606 | if (target % Fref == 0) { | ||
4607 | fll_div->theta = 0; | ||
4608 | - fll_div->lambda = 0; | ||
4609 | + fll_div->lambda = 1; | ||
4610 | } else { | ||
4611 | gcd_fll = gcd(target, fratio * Fref); | ||
4612 | |||
4613 | @@ -2858,7 +2858,7 @@ static int wm8962_set_fll(struct snd_soc_component *component, int fll_id, int s | ||
4614 | return -EINVAL; | ||
4615 | } | ||
4616 | |||
4617 | - if (fll_div.theta || fll_div.lambda) | ||
4618 | + if (fll_div.theta) | ||
4619 | fll1 |= WM8962_FLL_FRAC; | ||
4620 | |||
4621 | /* Stop the FLL while we reconfigure */ | ||
4622 | diff --git a/sound/soc/intel/boards/bytcr_rt5640.c b/sound/soc/intel/boards/bytcr_rt5640.c | ||
4623 | index dd2b5ad08659..243f683bc02a 100644 | ||
4624 | --- a/sound/soc/intel/boards/bytcr_rt5640.c | ||
4625 | +++ b/sound/soc/intel/boards/bytcr_rt5640.c | ||
4626 | @@ -707,13 +707,17 @@ static const struct dmi_system_id byt_rt5640_quirk_table[] = { | ||
4627 | BYT_RT5640_MCLK_EN), | ||
4628 | }, | ||
4629 | { | ||
4630 | + /* Teclast X89 */ | ||
4631 | .matches = { | ||
4632 | DMI_MATCH(DMI_BOARD_VENDOR, "TECLAST"), | ||
4633 | DMI_MATCH(DMI_BOARD_NAME, "tPAD"), | ||
4634 | }, | ||
4635 | .driver_data = (void *)(BYT_RT5640_IN3_MAP | | ||
4636 | - BYT_RT5640_MCLK_EN | | ||
4637 | - BYT_RT5640_SSP0_AIF1), | ||
4638 | + BYT_RT5640_JD_SRC_JD1_IN4P | | ||
4639 | + BYT_RT5640_OVCD_TH_2000UA | | ||
4640 | + BYT_RT5640_OVCD_SF_1P0 | | ||
4641 | + BYT_RT5640_SSP0_AIF1 | | ||
4642 | + BYT_RT5640_MCLK_EN), | ||
4643 | }, | ||
4644 | { /* Toshiba Satellite Click Mini L9W-B */ | ||
4645 | .matches = { | ||
4646 | diff --git a/sound/soc/soc-topology.c b/sound/soc/soc-topology.c | ||
4647 | index 0fd032914a31..fd2d22ddc81b 100644 | ||
4648 | --- a/sound/soc/soc-topology.c | ||
4649 | +++ b/sound/soc/soc-topology.c | ||
4650 | @@ -1918,11 +1918,13 @@ static int soc_tplg_fe_link_create(struct soc_tplg *tplg, | ||
4651 | ret = soc_tplg_dai_link_load(tplg, link, NULL); | ||
4652 | if (ret < 0) { | ||
4653 | dev_err(tplg->comp->dev, "ASoC: FE link loading failed\n"); | ||
4654 | - kfree(link->name); | ||
4655 | - kfree(link->stream_name); | ||
4656 | - kfree(link->cpus->dai_name); | ||
4657 | - kfree(link); | ||
4658 | - return ret; | ||
4659 | + goto err; | ||
4660 | + } | ||
4661 | + | ||
4662 | + ret = snd_soc_add_dai_link(tplg->comp->card, link); | ||
4663 | + if (ret < 0) { | ||
4664 | + dev_err(tplg->comp->dev, "ASoC: adding FE link failed\n"); | ||
4665 | + goto err; | ||
4666 | } | ||
4667 | |||
4668 | link->dobj.index = tplg->index; | ||
4669 | @@ -1930,8 +1932,13 @@ static int soc_tplg_fe_link_create(struct soc_tplg *tplg, | ||
4670 | link->dobj.type = SND_SOC_DOBJ_DAI_LINK; | ||
4671 | list_add(&link->dobj.list, &tplg->comp->dobj_list); | ||
4672 | |||
4673 | - snd_soc_add_dai_link(tplg->comp->card, link); | ||
4674 | return 0; | ||
4675 | +err: | ||
4676 | + kfree(link->name); | ||
4677 | + kfree(link->stream_name); | ||
4678 | + kfree(link->cpus->dai_name); | ||
4679 | + kfree(link); | ||
4680 | + return ret; | ||
4681 | } | ||
4682 | |||
4683 | /* create a FE DAI and DAI link from the PCM object */ | ||
4684 | @@ -2024,6 +2031,7 @@ static int soc_tplg_pcm_elems_load(struct soc_tplg *tplg, | ||
4685 | int size; | ||
4686 | int i; | ||
4687 | bool abi_match; | ||
4688 | + int ret; | ||
4689 | |||
4690 | count = le32_to_cpu(hdr->count); | ||
4691 | |||
4692 | @@ -2065,7 +2073,12 @@ static int soc_tplg_pcm_elems_load(struct soc_tplg *tplg, | ||
4693 | } | ||
4694 | |||
4695 | /* create the FE DAIs and DAI links */ | ||
4696 | - soc_tplg_pcm_create(tplg, _pcm); | ||
4697 | + ret = soc_tplg_pcm_create(tplg, _pcm); | ||
4698 | + if (ret < 0) { | ||
4699 | + if (!abi_match) | ||
4700 | + kfree(_pcm); | ||
4701 | + return ret; | ||
4702 | + } | ||
4703 | |||
4704 | /* offset by version-specific struct size and | ||
4705 | * real priv data size | ||
4706 | diff --git a/sound/soc/sof/intel/byt.c b/sound/soc/sof/intel/byt.c | ||
4707 | index a1e514f71739..41008c974ac6 100644 | ||
4708 | --- a/sound/soc/sof/intel/byt.c | ||
4709 | +++ b/sound/soc/sof/intel/byt.c | ||
4710 | @@ -24,7 +24,8 @@ | ||
4711 | #define DRAM_OFFSET 0x100000 | ||
4712 | #define DRAM_SIZE (160 * 1024) | ||
4713 | #define SHIM_OFFSET 0x140000 | ||
4714 | -#define SHIM_SIZE 0x100 | ||
4715 | +#define SHIM_SIZE_BYT 0x100 | ||
4716 | +#define SHIM_SIZE_CHT 0x118 | ||
4717 | #define MBOX_OFFSET 0x144000 | ||
4718 | #define MBOX_SIZE 0x1000 | ||
4719 | #define EXCEPT_OFFSET 0x800 | ||
4720 | @@ -75,7 +76,7 @@ static const struct snd_sof_debugfs_map byt_debugfs[] = { | ||
4721 | SOF_DEBUGFS_ACCESS_D0_ONLY}, | ||
4722 | {"dram", BYT_DSP_BAR, DRAM_OFFSET, DRAM_SIZE, | ||
4723 | SOF_DEBUGFS_ACCESS_D0_ONLY}, | ||
4724 | - {"shim", BYT_DSP_BAR, SHIM_OFFSET, SHIM_SIZE, | ||
4725 | + {"shim", BYT_DSP_BAR, SHIM_OFFSET, SHIM_SIZE_BYT, | ||
4726 | SOF_DEBUGFS_ACCESS_ALWAYS}, | ||
4727 | }; | ||
4728 | |||
4729 | @@ -102,7 +103,7 @@ static const struct snd_sof_debugfs_map cht_debugfs[] = { | ||
4730 | SOF_DEBUGFS_ACCESS_D0_ONLY}, | ||
4731 | {"dram", BYT_DSP_BAR, DRAM_OFFSET, DRAM_SIZE, | ||
4732 | SOF_DEBUGFS_ACCESS_D0_ONLY}, | ||
4733 | - {"shim", BYT_DSP_BAR, SHIM_OFFSET, SHIM_SIZE, | ||
4734 | + {"shim", BYT_DSP_BAR, SHIM_OFFSET, SHIM_SIZE_CHT, | ||
4735 | SOF_DEBUGFS_ACCESS_ALWAYS}, | ||
4736 | }; | ||
4737 | |||
4738 | diff --git a/sound/soc/sof/loader.c b/sound/soc/sof/loader.c | ||
4739 | index 9a9a381a908d..a041adf0669d 100644 | ||
4740 | --- a/sound/soc/sof/loader.c | ||
4741 | +++ b/sound/soc/sof/loader.c | ||
4742 | @@ -66,6 +66,8 @@ int snd_sof_fw_parse_ext_data(struct snd_sof_dev *sdev, u32 bar, u32 offset) | ||
4743 | ret = get_ext_windows(sdev, ext_hdr); | ||
4744 | break; | ||
4745 | default: | ||
4746 | + dev_warn(sdev->dev, "warning: unknown ext header type %d size 0x%x\n", | ||
4747 | + ext_hdr->type, ext_hdr->hdr.size); | ||
4748 | break; | ||
4749 | } | ||
4750 | |||
4751 | diff --git a/tools/bpf/bpftool/prog.c b/tools/bpf/bpftool/prog.c | ||
4752 | index 43fdbbfe41bb..ea0bcd58bcb9 100644 | ||
4753 | --- a/tools/bpf/bpftool/prog.c | ||
4754 | +++ b/tools/bpf/bpftool/prog.c | ||
4755 | @@ -493,7 +493,7 @@ static int do_dump(int argc, char **argv) | ||
4756 | |||
4757 | info = &info_linear->info; | ||
4758 | if (mode == DUMP_JITED) { | ||
4759 | - if (info->jited_prog_len == 0) { | ||
4760 | + if (info->jited_prog_len == 0 || !info->jited_prog_insns) { | ||
4761 | p_info("no instructions returned"); | ||
4762 | goto err_free; | ||
4763 | } | ||
4764 | diff --git a/tools/bpf/bpftool/xlated_dumper.c b/tools/bpf/bpftool/xlated_dumper.c | ||
4765 | index 494d7ae3614d..5b91ee65a080 100644 | ||
4766 | --- a/tools/bpf/bpftool/xlated_dumper.c | ||
4767 | +++ b/tools/bpf/bpftool/xlated_dumper.c | ||
4768 | @@ -174,7 +174,7 @@ static const char *print_call(void *private_data, | ||
4769 | struct kernel_sym *sym; | ||
4770 | |||
4771 | if (insn->src_reg == BPF_PSEUDO_CALL && | ||
4772 | - (__u32) insn->imm < dd->nr_jited_ksyms) | ||
4773 | + (__u32) insn->imm < dd->nr_jited_ksyms && dd->jited_ksyms) | ||
4774 | address = dd->jited_ksyms[insn->imm]; | ||
4775 | |||
4776 | sym = kernel_syms_search(dd, address); | ||
4777 | diff --git a/tools/lib/traceevent/Makefile b/tools/lib/traceevent/Makefile | ||
4778 | index 5315f3787f8d..ecf882308d8a 100644 | ||
4779 | --- a/tools/lib/traceevent/Makefile | ||
4780 | +++ b/tools/lib/traceevent/Makefile | ||
4781 | @@ -97,6 +97,7 @@ EVENT_PARSE_VERSION = $(EP_VERSION).$(EP_PATCHLEVEL).$(EP_EXTRAVERSION) | ||
4782 | |||
4783 | LIB_TARGET = libtraceevent.a libtraceevent.so.$(EVENT_PARSE_VERSION) | ||
4784 | LIB_INSTALL = libtraceevent.a libtraceevent.so* | ||
4785 | +LIB_INSTALL := $(addprefix $(OUTPUT),$(LIB_INSTALL)) | ||
4786 | |||
4787 | INCLUDES = -I. -I $(srctree)/tools/include $(CONFIG_INCLUDES) | ||
4788 | |||
4789 | @@ -207,10 +208,11 @@ define do_install | ||
4790 | $(INSTALL) $(if $3,-m $3,) $1 '$(DESTDIR_SQ)$2' | ||
4791 | endef | ||
4792 | |||
4793 | -PKG_CONFIG_FILE = libtraceevent.pc | ||
4794 | +PKG_CONFIG_SOURCE_FILE = libtraceevent.pc | ||
4795 | +PKG_CONFIG_FILE := $(addprefix $(OUTPUT),$(PKG_CONFIG_SOURCE_FILE)) | ||
4796 | define do_install_pkgconfig_file | ||
4797 | if [ -n "${pkgconfig_dir}" ]; then \ | ||
4798 | - cp -f ${PKG_CONFIG_FILE}.template ${PKG_CONFIG_FILE}; \ | ||
4799 | + cp -f ${PKG_CONFIG_SOURCE_FILE}.template ${PKG_CONFIG_FILE}; \ | ||
4800 | sed -i "s|INSTALL_PREFIX|${1}|g" ${PKG_CONFIG_FILE}; \ | ||
4801 | sed -i "s|LIB_VERSION|${EVENT_PARSE_VERSION}|g" ${PKG_CONFIG_FILE}; \ | ||
4802 | sed -i "s|LIB_DIR|${libdir}|g" ${PKG_CONFIG_FILE}; \ | ||
4803 | diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c | ||
4804 | index becc2d109423..d3412f2c0d18 100644 | ||
4805 | --- a/tools/perf/util/header.c | ||
4806 | +++ b/tools/perf/util/header.c | ||
4807 | @@ -1089,21 +1089,18 @@ static void cpu_cache_level__fprintf(FILE *out, struct cpu_cache_level *c) | ||
4808 | fprintf(out, "L%d %-15s %8s [%s]\n", c->level, c->type, c->size, c->map); | ||
4809 | } | ||
4810 | |||
4811 | -static int build_caches(struct cpu_cache_level caches[], u32 size, u32 *cntp) | ||
4812 | +#define MAX_CACHE_LVL 4 | ||
4813 | + | ||
4814 | +static int build_caches(struct cpu_cache_level caches[], u32 *cntp) | ||
4815 | { | ||
4816 | u32 i, cnt = 0; | ||
4817 | - long ncpus; | ||
4818 | u32 nr, cpu; | ||
4819 | u16 level; | ||
4820 | |||
4821 | - ncpus = sysconf(_SC_NPROCESSORS_CONF); | ||
4822 | - if (ncpus < 0) | ||
4823 | - return -1; | ||
4824 | - | ||
4825 | - nr = (u32)(ncpus & UINT_MAX); | ||
4826 | + nr = cpu__max_cpu(); | ||
4827 | |||
4828 | for (cpu = 0; cpu < nr; cpu++) { | ||
4829 | - for (level = 0; level < 10; level++) { | ||
4830 | + for (level = 0; level < MAX_CACHE_LVL; level++) { | ||
4831 | struct cpu_cache_level c; | ||
4832 | int err; | ||
4833 | |||
4834 | @@ -1123,18 +1120,12 @@ static int build_caches(struct cpu_cache_level caches[], u32 size, u32 *cntp) | ||
4835 | caches[cnt++] = c; | ||
4836 | else | ||
4837 | cpu_cache_level__free(&c); | ||
4838 | - | ||
4839 | - if (WARN_ONCE(cnt == size, "way too many cpu caches..")) | ||
4840 | - goto out; | ||
4841 | } | ||
4842 | } | ||
4843 | - out: | ||
4844 | *cntp = cnt; | ||
4845 | return 0; | ||
4846 | } | ||
4847 | |||
4848 | -#define MAX_CACHE_LVL 4 | ||
4849 | - | ||
4850 | static int write_cache(struct feat_fd *ff, | ||
4851 | struct evlist *evlist __maybe_unused) | ||
4852 | { | ||
4853 | @@ -1143,7 +1134,7 @@ static int write_cache(struct feat_fd *ff, | ||
4854 | u32 cnt = 0, i, version = 1; | ||
4855 | int ret; | ||
4856 | |||
4857 | - ret = build_caches(caches, max_caches, &cnt); | ||
4858 | + ret = build_caches(caches, &cnt); | ||
4859 | if (ret) | ||
4860 | goto out; | ||
4861 | |||
4862 | diff --git a/tools/perf/util/metricgroup.c b/tools/perf/util/metricgroup.c | ||
4863 | index a7c0424dbda3..940a6e7a6854 100644 | ||
4864 | --- a/tools/perf/util/metricgroup.c | ||
4865 | +++ b/tools/perf/util/metricgroup.c | ||
4866 | @@ -103,8 +103,11 @@ static struct evsel *find_evsel_group(struct evlist *perf_evlist, | ||
4867 | if (!strcmp(ev->name, ids[i])) { | ||
4868 | if (!metric_events[i]) | ||
4869 | metric_events[i] = ev; | ||
4870 | + i++; | ||
4871 | + if (i == idnum) | ||
4872 | + break; | ||
4873 | } else { | ||
4874 | - if (++i == idnum) { | ||
4875 | + if (i + 1 == idnum) { | ||
4876 | /* Discard the whole match and start again */ | ||
4877 | i = 0; | ||
4878 | memset(metric_events, 0, | ||
4879 | @@ -124,7 +127,7 @@ static struct evsel *find_evsel_group(struct evlist *perf_evlist, | ||
4880 | } | ||
4881 | } | ||
4882 | |||
4883 | - if (i != idnum - 1) { | ||
4884 | + if (i != idnum) { | ||
4885 | /* Not whole match */ | ||
4886 | return NULL; | ||
4887 | } | ||
4888 | diff --git a/tools/testing/selftests/ftrace/test.d/ftrace/func-filter-stacktrace.tc b/tools/testing/selftests/ftrace/test.d/ftrace/func-filter-stacktrace.tc | ||
4889 | index 36fb59f886ea..1a52f2883fe0 100644 | ||
4890 | --- a/tools/testing/selftests/ftrace/test.d/ftrace/func-filter-stacktrace.tc | ||
4891 | +++ b/tools/testing/selftests/ftrace/test.d/ftrace/func-filter-stacktrace.tc | ||
4892 | @@ -3,6 +3,8 @@ | ||
4893 | # description: ftrace - stacktrace filter command | ||
4894 | # flags: instance | ||
4895 | |||
4896 | +[ ! -f set_ftrace_filter ] && exit_unsupported | ||
4897 | + | ||
4898 | echo _do_fork:stacktrace >> set_ftrace_filter | ||
4899 | |||
4900 | grep -q "_do_fork:stacktrace:unlimited" set_ftrace_filter | ||
4901 | diff --git a/tools/testing/selftests/ftrace/test.d/ftrace/func_cpumask.tc b/tools/testing/selftests/ftrace/test.d/ftrace/func_cpumask.tc | ||
4902 | index 86a1f07ef2ca..71fa3f49e35e 100644 | ||
4903 | --- a/tools/testing/selftests/ftrace/test.d/ftrace/func_cpumask.tc | ||
4904 | +++ b/tools/testing/selftests/ftrace/test.d/ftrace/func_cpumask.tc | ||
4905 | @@ -15,6 +15,11 @@ if [ $NP -eq 1 ] ;then | ||
4906 | exit_unresolved | ||
4907 | fi | ||
4908 | |||
4909 | +if ! grep -q "function" available_tracers ; then | ||
4910 | + echo "Function trace is not enabled" | ||
4911 | + exit_unsupported | ||
4912 | +fi | ||
4913 | + | ||
4914 | ORIG_CPUMASK=`cat tracing_cpumask` | ||
4915 | |||
4916 | do_reset() { | ||
4917 | diff --git a/tools/testing/selftests/ftrace/test.d/functions b/tools/testing/selftests/ftrace/test.d/functions | ||
4918 | index 86986c4bba54..5d4550591ff9 100644 | ||
4919 | --- a/tools/testing/selftests/ftrace/test.d/functions | ||
4920 | +++ b/tools/testing/selftests/ftrace/test.d/functions | ||
4921 | @@ -46,6 +46,9 @@ reset_events_filter() { # reset all current setting filters | ||
4922 | } | ||
4923 | |||
4924 | reset_ftrace_filter() { # reset all triggers in set_ftrace_filter | ||
4925 | + if [ ! -f set_ftrace_filter ]; then | ||
4926 | + return 0 | ||
4927 | + fi | ||
4928 | echo > set_ftrace_filter | ||
4929 | grep -v '^#' set_ftrace_filter | while read t; do | ||
4930 | tr=`echo $t | cut -d: -f2` | ||
4931 | @@ -93,7 +96,7 @@ initialize_ftrace() { # Reset ftrace to initial-state | ||
4932 | disable_events | ||
4933 | [ -f set_event_pid ] && echo > set_event_pid | ||
4934 | [ -f set_ftrace_pid ] && echo > set_ftrace_pid | ||
4935 | - [ -f set_ftrace_filter ] && echo | tee set_ftrace_* | ||
4936 | + [ -f set_ftrace_notrace ] && echo > set_ftrace_notrace | ||
4937 | [ -f set_graph_function ] && echo | tee set_graph_* | ||
4938 | [ -f stack_trace_filter ] && echo > stack_trace_filter | ||
4939 | [ -f kprobe_events ] && echo > kprobe_events | ||
4940 | diff --git a/tools/testing/selftests/ftrace/test.d/kprobe/multiple_kprobes.tc b/tools/testing/selftests/ftrace/test.d/kprobe/multiple_kprobes.tc | ||
4941 | index 5862eee91e1d..6e3dbe5f96b7 100644 | ||
4942 | --- a/tools/testing/selftests/ftrace/test.d/kprobe/multiple_kprobes.tc | ||
4943 | +++ b/tools/testing/selftests/ftrace/test.d/kprobe/multiple_kprobes.tc | ||
4944 | @@ -20,9 +20,9 @@ while read i; do | ||
4945 | test $N -eq 256 && break | ||
4946 | done | ||
4947 | |||
4948 | -L=`wc -l kprobe_events` | ||
4949 | -if [ $L -ne $N ]; then | ||
4950 | - echo "The number of kprobes events ($L) is not $N" | ||
4951 | +L=`cat kprobe_events | wc -l` | ||
4952 | +if [ $L -ne 256 ]; then | ||
4953 | + echo "The number of kprobes events ($L) is not 256" | ||
4954 | exit_fail | ||
4955 | fi | ||
4956 | |||
4957 | diff --git a/tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-action-hist-xfail.tc b/tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-action-hist-xfail.tc | ||
4958 | index 1221240f8cf6..3f2aee115f6e 100644 | ||
4959 | --- a/tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-action-hist-xfail.tc | ||
4960 | +++ b/tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-action-hist-xfail.tc | ||
4961 | @@ -21,10 +21,10 @@ grep -q "snapshot()" README || exit_unsupported # version issue | ||
4962 | |||
4963 | echo "Test expected snapshot action failure" | ||
4964 | |||
4965 | -echo 'hist:keys=comm:onmatch(sched.sched_wakeup).snapshot()' >> /sys/kernel/debug/tracing/events/sched/sched_waking/trigger && exit_fail | ||
4966 | +echo 'hist:keys=comm:onmatch(sched.sched_wakeup).snapshot()' >> events/sched/sched_waking/trigger && exit_fail | ||
4967 | |||
4968 | echo "Test expected save action failure" | ||
4969 | |||
4970 | -echo 'hist:keys=comm:onmatch(sched.sched_wakeup).save(comm,prio)' >> /sys/kernel/debug/tracing/events/sched/sched_waking/trigger && exit_fail | ||
4971 | +echo 'hist:keys=comm:onmatch(sched.sched_wakeup).save(comm,prio)' >> events/sched/sched_waking/trigger && exit_fail | ||
4972 | |||
4973 | exit_xfail | ||
4974 | diff --git a/tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-onchange-action-hist.tc b/tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-onchange-action-hist.tc | ||
4975 | index 064a284e4e75..c80007aa9f86 100644 | ||
4976 | --- a/tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-onchange-action-hist.tc | ||
4977 | +++ b/tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-onchange-action-hist.tc | ||
4978 | @@ -16,7 +16,7 @@ grep -q "onchange(var)" README || exit_unsupported # version issue | ||
4979 | |||
4980 | echo "Test onchange action" | ||
4981 | |||
4982 | -echo 'hist:keys=comm:newprio=prio:onchange($newprio).save(comm,prio) if comm=="ping"' >> /sys/kernel/debug/tracing/events/sched/sched_waking/trigger | ||
4983 | +echo 'hist:keys=comm:newprio=prio:onchange($newprio).save(comm,prio) if comm=="ping"' >> events/sched/sched_waking/trigger | ||
4984 | |||
4985 | ping $LOCALHOST -c 3 | ||
4986 | nice -n 1 ping $LOCALHOST -c 3 | ||
4987 | diff --git a/tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-snapshot-action-hist.tc b/tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-snapshot-action-hist.tc | ||
4988 | index 18fff69fc433..f546c1b66a9b 100644 | ||
4989 | --- a/tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-snapshot-action-hist.tc | ||
4990 | +++ b/tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-snapshot-action-hist.tc | ||
4991 | @@ -23,9 +23,9 @@ grep -q "snapshot()" README || exit_unsupported # version issue | ||
4992 | |||
4993 | echo "Test snapshot action" | ||
4994 | |||
4995 | -echo 1 > /sys/kernel/debug/tracing/events/sched/enable | ||
4996 | +echo 1 > events/sched/enable | ||
4997 | |||
4998 | -echo 'hist:keys=comm:newprio=prio:onchange($newprio).save(comm,prio):onchange($newprio).snapshot() if comm=="ping"' >> /sys/kernel/debug/tracing/events/sched/sched_waking/trigger | ||
4999 | +echo 'hist:keys=comm:newprio=prio:onchange($newprio).save(comm,prio):onchange($newprio).snapshot() if comm=="ping"' >> events/sched/sched_waking/trigger | ||
5000 | |||
5001 | ping $LOCALHOST -c 3 | ||
5002 | nice -n 1 ping $LOCALHOST -c 3 | ||
5003 | diff --git a/tools/testing/selftests/kselftest/prefix.pl b/tools/testing/selftests/kselftest/prefix.pl | ||
5004 | index ec7e48118183..31f7c2a0a8bd 100755 | ||
5005 | --- a/tools/testing/selftests/kselftest/prefix.pl | ||
5006 | +++ b/tools/testing/selftests/kselftest/prefix.pl | ||
5007 | @@ -3,6 +3,7 @@ | ||
5008 | # Prefix all lines with "# ", unbuffered. Command being piped in may need | ||
5009 | # to have unbuffering forced with "stdbuf -i0 -o0 -e0 $cmd". | ||
5010 | use strict; | ||
5011 | +use IO::Handle; | ||
5012 | |||
5013 | binmode STDIN; | ||
5014 | binmode STDOUT; | ||
5015 | diff --git a/tools/testing/selftests/kselftest/runner.sh b/tools/testing/selftests/kselftest/runner.sh | ||
5016 | index 84de7bc74f2c..a8d20cbb711c 100644 | ||
5017 | --- a/tools/testing/selftests/kselftest/runner.sh | ||
5018 | +++ b/tools/testing/selftests/kselftest/runner.sh | ||
5019 | @@ -79,6 +79,7 @@ run_one() | ||
5020 | if [ $rc -eq $skip_rc ]; then \ | ||
5021 | echo "not ok $test_num $TEST_HDR_MSG # SKIP" | ||
5022 | elif [ $rc -eq $timeout_rc ]; then \ | ||
5023 | + echo "#" | ||
5024 | echo "not ok $test_num $TEST_HDR_MSG # TIMEOUT" | ||
5025 | else | ||
5026 | echo "not ok $test_num $TEST_HDR_MSG # exit=$rc" | ||
5027 | diff --git a/tools/testing/selftests/net/pmtu.sh b/tools/testing/selftests/net/pmtu.sh | ||
5028 | index d697815d2785..71a62e7e35b1 100755 | ||
5029 | --- a/tools/testing/selftests/net/pmtu.sh | ||
5030 | +++ b/tools/testing/selftests/net/pmtu.sh | ||
5031 | @@ -11,9 +11,9 @@ | ||
5032 | # R1 and R2 (also implemented with namespaces), with different MTUs: | ||
5033 | # | ||
5034 | # segment a_r1 segment b_r1 a_r1: 2000 | ||
5035 | -# .--------------R1--------------. a_r2: 1500 | ||
5036 | -# A B a_r3: 2000 | ||
5037 | -# '--------------R2--------------' a_r4: 1400 | ||
5038 | +# .--------------R1--------------. b_r1: 1400 | ||
5039 | +# A B a_r2: 2000 | ||
5040 | +# '--------------R2--------------' b_r2: 1500 | ||
5041 | # segment a_r2 segment b_r2 | ||
5042 | # | ||
5043 | # Check that PMTU exceptions with the correct PMTU are created. Then | ||
5044 | diff --git a/tools/testing/selftests/netfilter/nft_nat.sh b/tools/testing/selftests/netfilter/nft_nat.sh | ||
5045 | index 1be55e705780..d7e07f4c3d7f 100755 | ||
5046 | --- a/tools/testing/selftests/netfilter/nft_nat.sh | ||
5047 | +++ b/tools/testing/selftests/netfilter/nft_nat.sh | ||
5048 | @@ -8,9 +8,14 @@ ksft_skip=4 | ||
5049 | ret=0 | ||
5050 | test_inet_nat=true | ||
5051 | |||
5052 | +sfx=$(mktemp -u "XXXXXXXX") | ||
5053 | +ns0="ns0-$sfx" | ||
5054 | +ns1="ns1-$sfx" | ||
5055 | +ns2="ns2-$sfx" | ||
5056 | + | ||
5057 | cleanup() | ||
5058 | { | ||
5059 | - for i in 0 1 2; do ip netns del ns$i;done | ||
5060 | + for i in 0 1 2; do ip netns del ns$i-"$sfx";done | ||
5061 | } | ||
5062 | |||
5063 | nft --version > /dev/null 2>&1 | ||
5064 | @@ -25,40 +30,49 @@ if [ $? -ne 0 ];then | ||
5065 | exit $ksft_skip | ||
5066 | fi | ||
5067 | |||
5068 | -ip netns add ns0 | ||
5069 | +ip netns add "$ns0" | ||
5070 | if [ $? -ne 0 ];then | ||
5071 | - echo "SKIP: Could not create net namespace" | ||
5072 | + echo "SKIP: Could not create net namespace $ns0" | ||
5073 | exit $ksft_skip | ||
5074 | fi | ||
5075 | |||
5076 | trap cleanup EXIT | ||
5077 | |||
5078 | -ip netns add ns1 | ||
5079 | -ip netns add ns2 | ||
5080 | +ip netns add "$ns1" | ||
5081 | +if [ $? -ne 0 ];then | ||
5082 | + echo "SKIP: Could not create net namespace $ns1" | ||
5083 | + exit $ksft_skip | ||
5084 | +fi | ||
5085 | + | ||
5086 | +ip netns add "$ns2" | ||
5087 | +if [ $? -ne 0 ];then | ||
5088 | + echo "SKIP: Could not create net namespace $ns2" | ||
5089 | + exit $ksft_skip | ||
5090 | +fi | ||
5091 | |||
5092 | -ip link add veth0 netns ns0 type veth peer name eth0 netns ns1 > /dev/null 2>&1 | ||
5093 | +ip link add veth0 netns "$ns0" type veth peer name eth0 netns "$ns1" > /dev/null 2>&1 | ||
5094 | if [ $? -ne 0 ];then | ||
5095 | echo "SKIP: No virtual ethernet pair device support in kernel" | ||
5096 | exit $ksft_skip | ||
5097 | fi | ||
5098 | -ip link add veth1 netns ns0 type veth peer name eth0 netns ns2 | ||
5099 | +ip link add veth1 netns "$ns0" type veth peer name eth0 netns "$ns2" | ||
5100 | |||
5101 | -ip -net ns0 link set lo up | ||
5102 | -ip -net ns0 link set veth0 up | ||
5103 | -ip -net ns0 addr add 10.0.1.1/24 dev veth0 | ||
5104 | -ip -net ns0 addr add dead:1::1/64 dev veth0 | ||
5105 | +ip -net "$ns0" link set lo up | ||
5106 | +ip -net "$ns0" link set veth0 up | ||
5107 | +ip -net "$ns0" addr add 10.0.1.1/24 dev veth0 | ||
5108 | +ip -net "$ns0" addr add dead:1::1/64 dev veth0 | ||
5109 | |||
5110 | -ip -net ns0 link set veth1 up | ||
5111 | -ip -net ns0 addr add 10.0.2.1/24 dev veth1 | ||
5112 | -ip -net ns0 addr add dead:2::1/64 dev veth1 | ||
5113 | +ip -net "$ns0" link set veth1 up | ||
5114 | +ip -net "$ns0" addr add 10.0.2.1/24 dev veth1 | ||
5115 | +ip -net "$ns0" addr add dead:2::1/64 dev veth1 | ||
5116 | |||
5117 | for i in 1 2; do | ||
5118 | - ip -net ns$i link set lo up | ||
5119 | - ip -net ns$i link set eth0 up | ||
5120 | - ip -net ns$i addr add 10.0.$i.99/24 dev eth0 | ||
5121 | - ip -net ns$i route add default via 10.0.$i.1 | ||
5122 | - ip -net ns$i addr add dead:$i::99/64 dev eth0 | ||
5123 | - ip -net ns$i route add default via dead:$i::1 | ||
5124 | + ip -net ns$i-$sfx link set lo up | ||
5125 | + ip -net ns$i-$sfx link set eth0 up | ||
5126 | + ip -net ns$i-$sfx addr add 10.0.$i.99/24 dev eth0 | ||
5127 | + ip -net ns$i-$sfx route add default via 10.0.$i.1 | ||
5128 | + ip -net ns$i-$sfx addr add dead:$i::99/64 dev eth0 | ||
5129 | + ip -net ns$i-$sfx route add default via dead:$i::1 | ||
5130 | done | ||
5131 | |||
5132 | bad_counter() | ||
5133 | @@ -66,8 +80,9 @@ bad_counter() | ||
5134 | local ns=$1 | ||
5135 | local counter=$2 | ||
5136 | local expect=$3 | ||
5137 | + local tag=$4 | ||
5138 | |||
5139 | - echo "ERROR: $counter counter in $ns has unexpected value (expected $expect)" 1>&2 | ||
5140 | + echo "ERROR: $counter counter in $ns has unexpected value (expected $expect) at $tag" 1>&2 | ||
5141 | ip netns exec $ns nft list counter inet filter $counter 1>&2 | ||
5142 | } | ||
5143 | |||
5144 | @@ -78,24 +93,24 @@ check_counters() | ||
5145 | |||
5146 | cnt=$(ip netns exec $ns nft list counter inet filter ns0in | grep -q "packets 1 bytes 84") | ||
5147 | if [ $? -ne 0 ]; then | ||
5148 | - bad_counter $ns ns0in "packets 1 bytes 84" | ||
5149 | + bad_counter $ns ns0in "packets 1 bytes 84" "check_counters 1" | ||
5150 | lret=1 | ||
5151 | fi | ||
5152 | cnt=$(ip netns exec $ns nft list counter inet filter ns0out | grep -q "packets 1 bytes 84") | ||
5153 | if [ $? -ne 0 ]; then | ||
5154 | - bad_counter $ns ns0out "packets 1 bytes 84" | ||
5155 | + bad_counter $ns ns0out "packets 1 bytes 84" "check_counters 2" | ||
5156 | lret=1 | ||
5157 | fi | ||
5158 | |||
5159 | expect="packets 1 bytes 104" | ||
5160 | cnt=$(ip netns exec $ns nft list counter inet filter ns0in6 | grep -q "$expect") | ||
5161 | if [ $? -ne 0 ]; then | ||
5162 | - bad_counter $ns ns0in6 "$expect" | ||
5163 | + bad_counter $ns ns0in6 "$expect" "check_counters 3" | ||
5164 | lret=1 | ||
5165 | fi | ||
5166 | cnt=$(ip netns exec $ns nft list counter inet filter ns0out6 | grep -q "$expect") | ||
5167 | if [ $? -ne 0 ]; then | ||
5168 | - bad_counter $ns ns0out6 "$expect" | ||
5169 | + bad_counter $ns ns0out6 "$expect" "check_counters 4" | ||
5170 | lret=1 | ||
5171 | fi | ||
5172 | |||
5173 | @@ -107,41 +122,41 @@ check_ns0_counters() | ||
5174 | local ns=$1 | ||
5175 | local lret=0 | ||
5176 | |||
5177 | - cnt=$(ip netns exec ns0 nft list counter inet filter ns0in | grep -q "packets 0 bytes 0") | ||
5178 | + cnt=$(ip netns exec "$ns0" nft list counter inet filter ns0in | grep -q "packets 0 bytes 0") | ||
5179 | if [ $? -ne 0 ]; then | ||
5180 | - bad_counter ns0 ns0in "packets 0 bytes 0" | ||
5181 | + bad_counter "$ns0" ns0in "packets 0 bytes 0" "check_ns0_counters 1" | ||
5182 | lret=1 | ||
5183 | fi | ||
5184 | |||
5185 | - cnt=$(ip netns exec ns0 nft list counter inet filter ns0in6 | grep -q "packets 0 bytes 0") | ||
5186 | + cnt=$(ip netns exec "$ns0" nft list counter inet filter ns0in6 | grep -q "packets 0 bytes 0") | ||
5187 | if [ $? -ne 0 ]; then | ||
5188 | - bad_counter ns0 ns0in6 "packets 0 bytes 0" | ||
5189 | + bad_counter "$ns0" ns0in6 "packets 0 bytes 0" | ||
5190 | lret=1 | ||
5191 | fi | ||
5192 | |||
5193 | - cnt=$(ip netns exec ns0 nft list counter inet filter ns0out | grep -q "packets 0 bytes 0") | ||
5194 | + cnt=$(ip netns exec "$ns0" nft list counter inet filter ns0out | grep -q "packets 0 bytes 0") | ||
5195 | if [ $? -ne 0 ]; then | ||
5196 | - bad_counter ns0 ns0out "packets 0 bytes 0" | ||
5197 | + bad_counter "$ns0" ns0out "packets 0 bytes 0" "check_ns0_counters 2" | ||
5198 | lret=1 | ||
5199 | fi | ||
5200 | - cnt=$(ip netns exec ns0 nft list counter inet filter ns0out6 | grep -q "packets 0 bytes 0") | ||
5201 | + cnt=$(ip netns exec "$ns0" nft list counter inet filter ns0out6 | grep -q "packets 0 bytes 0") | ||
5202 | if [ $? -ne 0 ]; then | ||
5203 | - bad_counter ns0 ns0out6 "packets 0 bytes 0" | ||
5204 | + bad_counter "$ns0" ns0out6 "packets 0 bytes 0" "check_ns0_counters3 " | ||
5205 | lret=1 | ||
5206 | fi | ||
5207 | |||
5208 | for dir in "in" "out" ; do | ||
5209 | expect="packets 1 bytes 84" | ||
5210 | - cnt=$(ip netns exec ns0 nft list counter inet filter ${ns}${dir} | grep -q "$expect") | ||
5211 | + cnt=$(ip netns exec "$ns0" nft list counter inet filter ${ns}${dir} | grep -q "$expect") | ||
5212 | if [ $? -ne 0 ]; then | ||
5213 | - bad_counter ns0 $ns$dir "$expect" | ||
5214 | + bad_counter "$ns0" $ns$dir "$expect" "check_ns0_counters 4" | ||
5215 | lret=1 | ||
5216 | fi | ||
5217 | |||
5218 | expect="packets 1 bytes 104" | ||
5219 | - cnt=$(ip netns exec ns0 nft list counter inet filter ${ns}${dir}6 | grep -q "$expect") | ||
5220 | + cnt=$(ip netns exec "$ns0" nft list counter inet filter ${ns}${dir}6 | grep -q "$expect") | ||
5221 | if [ $? -ne 0 ]; then | ||
5222 | - bad_counter ns0 $ns$dir6 "$expect" | ||
5223 | + bad_counter "$ns0" $ns$dir6 "$expect" "check_ns0_counters 5" | ||
5224 | lret=1 | ||
5225 | fi | ||
5226 | done | ||
5227 | @@ -152,7 +167,7 @@ check_ns0_counters() | ||
5228 | reset_counters() | ||
5229 | { | ||
5230 | for i in 0 1 2;do | ||
5231 | - ip netns exec ns$i nft reset counters inet > /dev/null | ||
5232 | + ip netns exec ns$i-$sfx nft reset counters inet > /dev/null | ||
5233 | done | ||
5234 | } | ||
5235 | |||
5236 | @@ -166,7 +181,7 @@ test_local_dnat6() | ||
5237 | IPF="ip6" | ||
5238 | fi | ||
5239 | |||
5240 | -ip netns exec ns0 nft -f - <<EOF | ||
5241 | +ip netns exec "$ns0" nft -f /dev/stdin <<EOF | ||
5242 | table $family nat { | ||
5243 | chain output { | ||
5244 | type nat hook output priority 0; policy accept; | ||
5245 | @@ -180,7 +195,7 @@ EOF | ||
5246 | fi | ||
5247 | |||
5248 | # ping netns1, expect rewrite to netns2 | ||
5249 | - ip netns exec ns0 ping -q -c 1 dead:1::99 > /dev/null | ||
5250 | + ip netns exec "$ns0" ping -q -c 1 dead:1::99 > /dev/null | ||
5251 | if [ $? -ne 0 ]; then | ||
5252 | lret=1 | ||
5253 | echo "ERROR: ping6 failed" | ||
5254 | @@ -189,18 +204,18 @@ EOF | ||
5255 | |||
5256 | expect="packets 0 bytes 0" | ||
5257 | for dir in "in6" "out6" ; do | ||
5258 | - cnt=$(ip netns exec ns0 nft list counter inet filter ns1${dir} | grep -q "$expect") | ||
5259 | + cnt=$(ip netns exec "$ns0" nft list counter inet filter ns1${dir} | grep -q "$expect") | ||
5260 | if [ $? -ne 0 ]; then | ||
5261 | - bad_counter ns0 ns1$dir "$expect" | ||
5262 | + bad_counter "$ns0" ns1$dir "$expect" "test_local_dnat6 1" | ||
5263 | lret=1 | ||
5264 | fi | ||
5265 | done | ||
5266 | |||
5267 | expect="packets 1 bytes 104" | ||
5268 | for dir in "in6" "out6" ; do | ||
5269 | - cnt=$(ip netns exec ns0 nft list counter inet filter ns2${dir} | grep -q "$expect") | ||
5270 | + cnt=$(ip netns exec "$ns0" nft list counter inet filter ns2${dir} | grep -q "$expect") | ||
5271 | if [ $? -ne 0 ]; then | ||
5272 | - bad_counter ns0 ns2$dir "$expect" | ||
5273 | + bad_counter "$ns0" ns2$dir "$expect" "test_local_dnat6 2" | ||
5274 | lret=1 | ||
5275 | fi | ||
5276 | done | ||
5277 | @@ -208,9 +223,9 @@ EOF | ||
5278 | # expect 0 count in ns1 | ||
5279 | expect="packets 0 bytes 0" | ||
5280 | for dir in "in6" "out6" ; do | ||
5281 | - cnt=$(ip netns exec ns1 nft list counter inet filter ns0${dir} | grep -q "$expect") | ||
5282 | + cnt=$(ip netns exec "$ns1" nft list counter inet filter ns0${dir} | grep -q "$expect") | ||
5283 | if [ $? -ne 0 ]; then | ||
5284 | - bad_counter ns1 ns0$dir "$expect" | ||
5285 | + bad_counter "$ns1" ns0$dir "$expect" "test_local_dnat6 3" | ||
5286 | lret=1 | ||
5287 | fi | ||
5288 | done | ||
5289 | @@ -218,15 +233,15 @@ EOF | ||
5290 | # expect 1 packet in ns2 | ||
5291 | expect="packets 1 bytes 104" | ||
5292 | for dir in "in6" "out6" ; do | ||
5293 | - cnt=$(ip netns exec ns2 nft list counter inet filter ns0${dir} | grep -q "$expect") | ||
5294 | + cnt=$(ip netns exec "$ns2" nft list counter inet filter ns0${dir} | grep -q "$expect") | ||
5295 | if [ $? -ne 0 ]; then | ||
5296 | - bad_counter ns2 ns0$dir "$expect" | ||
5297 | + bad_counter "$ns2" ns0$dir "$expect" "test_local_dnat6 4" | ||
5298 | lret=1 | ||
5299 | fi | ||
5300 | done | ||
5301 | |||
5302 | - test $lret -eq 0 && echo "PASS: ipv6 ping to ns1 was $family NATted to ns2" | ||
5303 | - ip netns exec ns0 nft flush chain ip6 nat output | ||
5304 | + test $lret -eq 0 && echo "PASS: ipv6 ping to $ns1 was $family NATted to $ns2" | ||
5305 | + ip netns exec "$ns0" nft flush chain ip6 nat output | ||
5306 | |||
5307 | return $lret | ||
5308 | } | ||
5309 | @@ -241,7 +256,7 @@ test_local_dnat() | ||
5310 | IPF="ip" | ||
5311 | fi | ||
5312 | |||
5313 | -ip netns exec ns0 nft -f - <<EOF 2>/dev/null | ||
5314 | +ip netns exec "$ns0" nft -f /dev/stdin <<EOF 2>/dev/null | ||
5315 | table $family nat { | ||
5316 | chain output { | ||
5317 | type nat hook output priority 0; policy accept; | ||
5318 | @@ -260,7 +275,7 @@ EOF | ||
5319 | fi | ||
5320 | |||
5321 | # ping netns1, expect rewrite to netns2 | ||
5322 | - ip netns exec ns0 ping -q -c 1 10.0.1.99 > /dev/null | ||
5323 | + ip netns exec "$ns0" ping -q -c 1 10.0.1.99 > /dev/null | ||
5324 | if [ $? -ne 0 ]; then | ||
5325 | lret=1 | ||
5326 | echo "ERROR: ping failed" | ||
5327 | @@ -269,18 +284,18 @@ EOF | ||
5328 | |||
5329 | expect="packets 0 bytes 0" | ||
5330 | for dir in "in" "out" ; do | ||
5331 | - cnt=$(ip netns exec ns0 nft list counter inet filter ns1${dir} | grep -q "$expect") | ||
5332 | + cnt=$(ip netns exec "$ns0" nft list counter inet filter ns1${dir} | grep -q "$expect") | ||
5333 | if [ $? -ne 0 ]; then | ||
5334 | - bad_counter ns0 ns1$dir "$expect" | ||
5335 | + bad_counter "$ns0" ns1$dir "$expect" "test_local_dnat 1" | ||
5336 | lret=1 | ||
5337 | fi | ||
5338 | done | ||
5339 | |||
5340 | expect="packets 1 bytes 84" | ||
5341 | for dir in "in" "out" ; do | ||
5342 | - cnt=$(ip netns exec ns0 nft list counter inet filter ns2${dir} | grep -q "$expect") | ||
5343 | + cnt=$(ip netns exec "$ns0" nft list counter inet filter ns2${dir} | grep -q "$expect") | ||
5344 | if [ $? -ne 0 ]; then | ||
5345 | - bad_counter ns0 ns2$dir "$expect" | ||
5346 | + bad_counter "$ns0" ns2$dir "$expect" "test_local_dnat 2" | ||
5347 | lret=1 | ||
5348 | fi | ||
5349 | done | ||
5350 | @@ -288,9 +303,9 @@ EOF | ||
5351 | # expect 0 count in ns1 | ||
5352 | expect="packets 0 bytes 0" | ||
5353 | for dir in "in" "out" ; do | ||
5354 | - cnt=$(ip netns exec ns1 nft list counter inet filter ns0${dir} | grep -q "$expect") | ||
5355 | + cnt=$(ip netns exec "$ns1" nft list counter inet filter ns0${dir} | grep -q "$expect") | ||
5356 | if [ $? -ne 0 ]; then | ||
5357 | - bad_counter ns1 ns0$dir "$expect" | ||
5358 | + bad_counter "$ns1" ns0$dir "$expect" "test_local_dnat 3" | ||
5359 | lret=1 | ||
5360 | fi | ||
5361 | done | ||
5362 | @@ -298,19 +313,19 @@ EOF | ||
5363 | # expect 1 packet in ns2 | ||
5364 | expect="packets 1 bytes 84" | ||
5365 | for dir in "in" "out" ; do | ||
5366 | - cnt=$(ip netns exec ns2 nft list counter inet filter ns0${dir} | grep -q "$expect") | ||
5367 | + cnt=$(ip netns exec "$ns2" nft list counter inet filter ns0${dir} | grep -q "$expect") | ||
5368 | if [ $? -ne 0 ]; then | ||
5369 | - bad_counter ns2 ns0$dir "$expect" | ||
5370 | + bad_counter "$ns2" ns0$dir "$expect" "test_local_dnat 4" | ||
5371 | lret=1 | ||
5372 | fi | ||
5373 | done | ||
5374 | |||
5375 | - test $lret -eq 0 && echo "PASS: ping to ns1 was $family NATted to ns2" | ||
5376 | + test $lret -eq 0 && echo "PASS: ping to $ns1 was $family NATted to $ns2" | ||
5377 | |||
5378 | - ip netns exec ns0 nft flush chain $family nat output | ||
5379 | + ip netns exec "$ns0" nft flush chain $family nat output | ||
5380 | |||
5381 | reset_counters | ||
5382 | - ip netns exec ns0 ping -q -c 1 10.0.1.99 > /dev/null | ||
5383 | + ip netns exec "$ns0" ping -q -c 1 10.0.1.99 > /dev/null | ||
5384 | if [ $? -ne 0 ]; then | ||
5385 | lret=1 | ||
5386 | echo "ERROR: ping failed" | ||
5387 | @@ -319,17 +334,17 @@ EOF | ||
5388 | |||
5389 | expect="packets 1 bytes 84" | ||
5390 | for dir in "in" "out" ; do | ||
5391 | - cnt=$(ip netns exec ns0 nft list counter inet filter ns1${dir} | grep -q "$expect") | ||
5392 | + cnt=$(ip netns exec "$ns0" nft list counter inet filter ns1${dir} | grep -q "$expect") | ||
5393 | if [ $? -ne 0 ]; then | ||
5394 | - bad_counter ns1 ns1$dir "$expect" | ||
5395 | + bad_counter "$ns1" ns1$dir "$expect" "test_local_dnat 5" | ||
5396 | lret=1 | ||
5397 | fi | ||
5398 | done | ||
5399 | expect="packets 0 bytes 0" | ||
5400 | for dir in "in" "out" ; do | ||
5401 | - cnt=$(ip netns exec ns0 nft list counter inet filter ns2${dir} | grep -q "$expect") | ||
5402 | + cnt=$(ip netns exec "$ns0" nft list counter inet filter ns2${dir} | grep -q "$expect") | ||
5403 | if [ $? -ne 0 ]; then | ||
5404 | - bad_counter ns0 ns2$dir "$expect" | ||
5405 | + bad_counter "$ns0" ns2$dir "$expect" "test_local_dnat 6" | ||
5406 | lret=1 | ||
5407 | fi | ||
5408 | done | ||
5409 | @@ -337,9 +352,9 @@ EOF | ||
5410 | # expect 1 count in ns1 | ||
5411 | expect="packets 1 bytes 84" | ||
5412 | for dir in "in" "out" ; do | ||
5413 | - cnt=$(ip netns exec ns1 nft list counter inet filter ns0${dir} | grep -q "$expect") | ||
5414 | + cnt=$(ip netns exec "$ns1" nft list counter inet filter ns0${dir} | grep -q "$expect") | ||
5415 | if [ $? -ne 0 ]; then | ||
5416 | - bad_counter ns0 ns0$dir "$expect" | ||
5417 | + bad_counter "$ns0" ns0$dir "$expect" "test_local_dnat 7" | ||
5418 | lret=1 | ||
5419 | fi | ||
5420 | done | ||
5421 | @@ -347,14 +362,14 @@ EOF | ||
5422 | # expect 0 packet in ns2 | ||
5423 | expect="packets 0 bytes 0" | ||
5424 | for dir in "in" "out" ; do | ||
5425 | - cnt=$(ip netns exec ns2 nft list counter inet filter ns0${dir} | grep -q "$expect") | ||
5426 | + cnt=$(ip netns exec "$ns2" nft list counter inet filter ns0${dir} | grep -q "$expect") | ||
5427 | if [ $? -ne 0 ]; then | ||
5428 | - bad_counter ns2 ns2$dir "$expect" | ||
5429 | + bad_counter "$ns2" ns0$dir "$expect" "test_local_dnat 8" | ||
5430 | lret=1 | ||
5431 | fi | ||
5432 | done | ||
5433 | |||
5434 | - test $lret -eq 0 && echo "PASS: ping to ns1 OK after $family nat output chain flush" | ||
5435 | + test $lret -eq 0 && echo "PASS: ping to $ns1 OK after $family nat output chain flush" | ||
5436 | |||
5437 | return $lret | ||
5438 | } | ||
5439 | @@ -366,26 +381,26 @@ test_masquerade6() | ||
5440 | local natflags=$2 | ||
5441 | local lret=0 | ||
5442 | |||
5443 | - ip netns exec ns0 sysctl net.ipv6.conf.all.forwarding=1 > /dev/null | ||
5444 | + ip netns exec "$ns0" sysctl net.ipv6.conf.all.forwarding=1 > /dev/null | ||
5445 | |||
5446 | - ip netns exec ns2 ping -q -c 1 dead:1::99 > /dev/null # ping ns2->ns1 | ||
5447 | + ip netns exec "$ns2" ping -q -c 1 dead:1::99 > /dev/null # ping ns2->ns1 | ||
5448 | if [ $? -ne 0 ] ; then | ||
5449 | - echo "ERROR: cannot ping ns1 from ns2 via ipv6" | ||
5450 | + echo "ERROR: cannot ping $ns1 from $ns2 via ipv6" | ||
5451 | return 1 | ||
5452 | lret=1 | ||
5453 | fi | ||
5454 | |||
5455 | expect="packets 1 bytes 104" | ||
5456 | for dir in "in6" "out6" ; do | ||
5457 | - cnt=$(ip netns exec ns1 nft list counter inet filter ns2${dir} | grep -q "$expect") | ||
5458 | + cnt=$(ip netns exec "$ns1" nft list counter inet filter ns2${dir} | grep -q "$expect") | ||
5459 | if [ $? -ne 0 ]; then | ||
5460 | - bad_counter ns1 ns2$dir "$expect" | ||
5461 | + bad_counter "$ns1" ns2$dir "$expect" "test_masquerade6 1" | ||
5462 | lret=1 | ||
5463 | fi | ||
5464 | |||
5465 | - cnt=$(ip netns exec ns2 nft list counter inet filter ns1${dir} | grep -q "$expect") | ||
5466 | + cnt=$(ip netns exec "$ns2" nft list counter inet filter ns1${dir} | grep -q "$expect") | ||
5467 | if [ $? -ne 0 ]; then | ||
5468 | - bad_counter ns2 ns1$dir "$expect" | ||
5469 | + bad_counter "$ns2" ns1$dir "$expect" "test_masquerade6 2" | ||
5470 | lret=1 | ||
5471 | fi | ||
5472 | done | ||
5473 | @@ -393,7 +408,7 @@ test_masquerade6() | ||
5474 | reset_counters | ||
5475 | |||
5476 | # add masquerading rule | ||
5477 | -ip netns exec ns0 nft -f - <<EOF | ||
5478 | +ip netns exec "$ns0" nft -f /dev/stdin <<EOF | ||
5479 | table $family nat { | ||
5480 | chain postrouting { | ||
5481 | type nat hook postrouting priority 0; policy accept; | ||
5482 | @@ -406,24 +421,24 @@ EOF | ||
5483 | return $ksft_skip | ||
5484 | fi | ||
5485 | |||
5486 | - ip netns exec ns2 ping -q -c 1 dead:1::99 > /dev/null # ping ns2->ns1 | ||
5487 | + ip netns exec "$ns2" ping -q -c 1 dead:1::99 > /dev/null # ping ns2->ns1 | ||
5488 | if [ $? -ne 0 ] ; then | ||
5489 | - echo "ERROR: cannot ping ns1 from ns2 with active $family masquerade $natflags" | ||
5490 | + echo "ERROR: cannot ping $ns1 from $ns2 with active $family masquerade $natflags" | ||
5491 | lret=1 | ||
5492 | fi | ||
5493 | |||
5494 | # ns1 should have seen packets from ns0, due to masquerade | ||
5495 | expect="packets 1 bytes 104" | ||
5496 | for dir in "in6" "out6" ; do | ||
5497 | - cnt=$(ip netns exec ns1 nft list counter inet filter ns0${dir} | grep -q "$expect") | ||
5498 | + cnt=$(ip netns exec "$ns1" nft list counter inet filter ns0${dir} | grep -q "$expect") | ||
5499 | if [ $? -ne 0 ]; then | ||
5500 | - bad_counter ns1 ns0$dir "$expect" | ||
5501 | + bad_counter "$ns1" ns0$dir "$expect" "test_masquerade6 3" | ||
5502 | lret=1 | ||
5503 | fi | ||
5504 | |||
5505 | - cnt=$(ip netns exec ns2 nft list counter inet filter ns1${dir} | grep -q "$expect") | ||
5506 | + cnt=$(ip netns exec "$ns2" nft list counter inet filter ns1${dir} | grep -q "$expect") | ||
5507 | if [ $? -ne 0 ]; then | ||
5508 | - bad_counter ns2 ns1$dir "$expect" | ||
5509 | + bad_counter "$ns2" ns1$dir "$expect" "test_masquerade6 4" | ||
5510 | lret=1 | ||
5511 | fi | ||
5512 | done | ||
5513 | @@ -431,32 +446,32 @@ EOF | ||
5514 | # ns1 should not have seen packets from ns2, due to masquerade | ||
5515 | expect="packets 0 bytes 0" | ||
5516 | for dir in "in6" "out6" ; do | ||
5517 | - cnt=$(ip netns exec ns1 nft list counter inet filter ns2${dir} | grep -q "$expect") | ||
5518 | + cnt=$(ip netns exec "$ns1" nft list counter inet filter ns2${dir} | grep -q "$expect") | ||
5519 | if [ $? -ne 0 ]; then | ||
5520 | - bad_counter ns1 ns0$dir "$expect" | ||
5521 | + bad_counter "$ns1" ns0$dir "$expect" "test_masquerade6 5" | ||
5522 | lret=1 | ||
5523 | fi | ||
5524 | |||
5525 | - cnt=$(ip netns exec ns1 nft list counter inet filter ns2${dir} | grep -q "$expect") | ||
5526 | + cnt=$(ip netns exec "$ns0" nft list counter inet filter ns1${dir} | grep -q "$expect") | ||
5527 | if [ $? -ne 0 ]; then | ||
5528 | - bad_counter ns2 ns1$dir "$expect" | ||
5529 | + bad_counter "$ns0" ns1$dir "$expect" "test_masquerade6 6" | ||
5530 | lret=1 | ||
5531 | fi | ||
5532 | done | ||
5533 | |||
5534 | - ip netns exec ns2 ping -q -c 1 dead:1::99 > /dev/null # ping ns2->ns1 | ||
5535 | + ip netns exec "$ns2" ping -q -c 1 dead:1::99 > /dev/null # ping ns2->ns1 | ||
5536 | if [ $? -ne 0 ] ; then | ||
5537 | - echo "ERROR: cannot ping ns1 from ns2 with active ipv6 masquerade $natflags (attempt 2)" | ||
5538 | + echo "ERROR: cannot ping $ns1 from $ns2 with active ipv6 masquerade $natflags (attempt 2)" | ||
5539 | lret=1 | ||
5540 | fi | ||
5541 | |||
5542 | - ip netns exec ns0 nft flush chain $family nat postrouting | ||
5543 | + ip netns exec "$ns0" nft flush chain $family nat postrouting | ||
5544 | if [ $? -ne 0 ]; then | ||
5545 | echo "ERROR: Could not flush $family nat postrouting" 1>&2 | ||
5546 | lret=1 | ||
5547 | fi | ||
5548 | |||
5549 | - test $lret -eq 0 && echo "PASS: $family IPv6 masquerade $natflags for ns2" | ||
5550 | + test $lret -eq 0 && echo "PASS: $family IPv6 masquerade $natflags for $ns2" | ||
5551 | |||
5552 | return $lret | ||
5553 | } | ||
5554 | @@ -467,26 +482,26 @@ test_masquerade() | ||
5555 | local natflags=$2 | ||
5556 | local lret=0 | ||
5557 | |||
5558 | - ip netns exec ns0 sysctl net.ipv4.conf.veth0.forwarding=1 > /dev/null | ||
5559 | - ip netns exec ns0 sysctl net.ipv4.conf.veth1.forwarding=1 > /dev/null | ||
5560 | + ip netns exec "$ns0" sysctl net.ipv4.conf.veth0.forwarding=1 > /dev/null | ||
5561 | + ip netns exec "$ns0" sysctl net.ipv4.conf.veth1.forwarding=1 > /dev/null | ||
5562 | |||
5563 | - ip netns exec ns2 ping -q -c 1 10.0.1.99 > /dev/null # ping ns2->ns1 | ||
5564 | + ip netns exec "$ns2" ping -q -c 1 10.0.1.99 > /dev/null # ping ns2->ns1 | ||
5565 | if [ $? -ne 0 ] ; then | ||
5566 | - echo "ERROR: cannot ping ns1 from ns2 $natflags" | ||
5567 | + echo "ERROR: cannot ping $ns1 from "$ns2" $natflags" | ||
5568 | lret=1 | ||
5569 | fi | ||
5570 | |||
5571 | expect="packets 1 bytes 84" | ||
5572 | for dir in "in" "out" ; do | ||
5573 | - cnt=$(ip netns exec ns1 nft list counter inet filter ns2${dir} | grep -q "$expect") | ||
5574 | + cnt=$(ip netns exec "$ns1" nft list counter inet filter ns2${dir} | grep -q "$expect") | ||
5575 | if [ $? -ne 0 ]; then | ||
5576 | - bad_counter ns1 ns2$dir "$expect" | ||
5577 | + bad_counter "$ns1" ns2$dir "$expect" "test_masquerade 1" | ||
5578 | lret=1 | ||
5579 | fi | ||
5580 | |||
5581 | - cnt=$(ip netns exec ns2 nft list counter inet filter ns1${dir} | grep -q "$expect") | ||
5582 | + cnt=$(ip netns exec "$ns2" nft list counter inet filter ns1${dir} | grep -q "$expect") | ||
5583 | if [ $? -ne 0 ]; then | ||
5584 | - bad_counter ns2 ns1$dir "$expect" | ||
5585 | + bad_counter "$ns2" ns1$dir "$expect" "test_masquerade 2" | ||
5586 | lret=1 | ||
5587 | fi | ||
5588 | done | ||
5589 | @@ -494,7 +509,7 @@ test_masquerade() | ||
5590 | reset_counters | ||
5591 | |||
5592 | # add masquerading rule | ||
5593 | -ip netns exec ns0 nft -f - <<EOF | ||
5594 | +ip netns exec "$ns0" nft -f /dev/stdin <<EOF | ||
5595 | table $family nat { | ||
5596 | chain postrouting { | ||
5597 | type nat hook postrouting priority 0; policy accept; | ||
5598 | @@ -507,24 +522,24 @@ EOF | ||
5599 | return $ksft_skip | ||
5600 | fi | ||
5601 | |||
5602 | - ip netns exec ns2 ping -q -c 1 10.0.1.99 > /dev/null # ping ns2->ns1 | ||
5603 | + ip netns exec "$ns2" ping -q -c 1 10.0.1.99 > /dev/null # ping ns2->ns1 | ||
5604 | if [ $? -ne 0 ] ; then | ||
5605 | - echo "ERROR: cannot ping ns1 from ns2 with active $family masquerade $natflags" | ||
5606 | + echo "ERROR: cannot ping $ns1 from $ns2 with active $family masquerade $natflags" | ||
5607 | lret=1 | ||
5608 | fi | ||
5609 | |||
5610 | # ns1 should have seen packets from ns0, due to masquerade | ||
5611 | expect="packets 1 bytes 84" | ||
5612 | for dir in "in" "out" ; do | ||
5613 | - cnt=$(ip netns exec ns1 nft list counter inet filter ns0${dir} | grep -q "$expect") | ||
5614 | + cnt=$(ip netns exec "$ns1" nft list counter inet filter ns0${dir} | grep -q "$expect") | ||
5615 | if [ $? -ne 0 ]; then | ||
5616 | - bad_counter ns1 ns0$dir "$expect" | ||
5617 | + bad_counter "$ns1" ns0$dir "$expect" "test_masquerade 3" | ||
5618 | lret=1 | ||
5619 | fi | ||
5620 | |||
5621 | - cnt=$(ip netns exec ns2 nft list counter inet filter ns1${dir} | grep -q "$expect") | ||
5622 | + cnt=$(ip netns exec "$ns2" nft list counter inet filter ns1${dir} | grep -q "$expect") | ||
5623 | if [ $? -ne 0 ]; then | ||
5624 | - bad_counter ns2 ns1$dir "$expect" | ||
5625 | + bad_counter "$ns2" ns1$dir "$expect" "test_masquerade 4" | ||
5626 | lret=1 | ||
5627 | fi | ||
5628 | done | ||
5629 | @@ -532,32 +547,32 @@ EOF | ||
5630 | # ns1 should not have seen packets from ns2, due to masquerade | ||
5631 | expect="packets 0 bytes 0" | ||
5632 | for dir in "in" "out" ; do | ||
5633 | - cnt=$(ip netns exec ns1 nft list counter inet filter ns2${dir} | grep -q "$expect") | ||
5634 | + cnt=$(ip netns exec "$ns1" nft list counter inet filter ns2${dir} | grep -q "$expect") | ||
5635 | if [ $? -ne 0 ]; then | ||
5636 | - bad_counter ns1 ns0$dir "$expect" | ||
5637 | + bad_counter "$ns1" ns0$dir "$expect" "test_masquerade 5" | ||
5638 | lret=1 | ||
5639 | fi | ||
5640 | |||
5641 | - cnt=$(ip netns exec ns1 nft list counter inet filter ns2${dir} | grep -q "$expect") | ||
5642 | + cnt=$(ip netns exec "$ns0" nft list counter inet filter ns1${dir} | grep -q "$expect") | ||
5643 | if [ $? -ne 0 ]; then | ||
5644 | - bad_counter ns2 ns1$dir "$expect" | ||
5645 | + bad_counter "$ns0" ns1$dir "$expect" "test_masquerade 6" | ||
5646 | lret=1 | ||
5647 | fi | ||
5648 | done | ||
5649 | |||
5650 | - ip netns exec ns2 ping -q -c 1 10.0.1.99 > /dev/null # ping ns2->ns1 | ||
5651 | + ip netns exec "$ns2" ping -q -c 1 10.0.1.99 > /dev/null # ping ns2->ns1 | ||
5652 | if [ $? -ne 0 ] ; then | ||
5653 | - echo "ERROR: cannot ping ns1 from ns2 with active ip masquerade $natflags (attempt 2)" | ||
5654 | + echo "ERROR: cannot ping $ns1 from $ns2 with active ip masquerade $natflags (attempt 2)" | ||
5655 | lret=1 | ||
5656 | fi | ||
5657 | |||
5658 | - ip netns exec ns0 nft flush chain $family nat postrouting | ||
5659 | + ip netns exec "$ns0" nft flush chain $family nat postrouting | ||
5660 | if [ $? -ne 0 ]; then | ||
5661 | echo "ERROR: Could not flush $family nat postrouting" 1>&2 | ||
5662 | lret=1 | ||
5663 | fi | ||
5664 | |||
5665 | - test $lret -eq 0 && echo "PASS: $family IP masquerade $natflags for ns2" | ||
5666 | + test $lret -eq 0 && echo "PASS: $family IP masquerade $natflags for $ns2" | ||
5667 | |||
5668 | return $lret | ||
5669 | } | ||
5670 | @@ -567,25 +582,25 @@ test_redirect6() | ||
5671 | local family=$1 | ||
5672 | local lret=0 | ||
5673 | |||
5674 | - ip netns exec ns0 sysctl net.ipv6.conf.all.forwarding=1 > /dev/null | ||
5675 | + ip netns exec "$ns0" sysctl net.ipv6.conf.all.forwarding=1 > /dev/null | ||
5676 | |||
5677 | - ip netns exec ns2 ping -q -c 1 dead:1::99 > /dev/null # ping ns2->ns1 | ||
5678 | + ip netns exec "$ns2" ping -q -c 1 dead:1::99 > /dev/null # ping ns2->ns1 | ||
5679 | if [ $? -ne 0 ] ; then | ||
5680 | - echo "ERROR: cannnot ping ns1 from ns2 via ipv6" | ||
5681 | + echo "ERROR: cannnot ping $ns1 from $ns2 via ipv6" | ||
5682 | lret=1 | ||
5683 | fi | ||
5684 | |||
5685 | expect="packets 1 bytes 104" | ||
5686 | for dir in "in6" "out6" ; do | ||
5687 | - cnt=$(ip netns exec ns1 nft list counter inet filter ns2${dir} | grep -q "$expect") | ||
5688 | + cnt=$(ip netns exec "$ns1" nft list counter inet filter ns2${dir} | grep -q "$expect") | ||
5689 | if [ $? -ne 0 ]; then | ||
5690 | - bad_counter ns1 ns2$dir "$expect" | ||
5691 | + bad_counter "$ns1" ns2$dir "$expect" "test_redirect6 1" | ||
5692 | lret=1 | ||
5693 | fi | ||
5694 | |||
5695 | - cnt=$(ip netns exec ns2 nft list counter inet filter ns1${dir} | grep -q "$expect") | ||
5696 | + cnt=$(ip netns exec "$ns2" nft list counter inet filter ns1${dir} | grep -q "$expect") | ||
5697 | if [ $? -ne 0 ]; then | ||
5698 | - bad_counter ns2 ns1$dir "$expect" | ||
5699 | + bad_counter "$ns2" ns1$dir "$expect" "test_redirect6 2" | ||
5700 | lret=1 | ||
5701 | fi | ||
5702 | done | ||
5703 | @@ -593,7 +608,7 @@ test_redirect6() | ||
5704 | reset_counters | ||
5705 | |||
5706 | # add redirect rule | ||
5707 | -ip netns exec ns0 nft -f - <<EOF | ||
5708 | +ip netns exec "$ns0" nft -f /dev/stdin <<EOF | ||
5709 | table $family nat { | ||
5710 | chain prerouting { | ||
5711 | type nat hook prerouting priority 0; policy accept; | ||
5712 | @@ -606,18 +621,18 @@ EOF | ||
5713 | return $ksft_skip | ||
5714 | fi | ||
5715 | |||
5716 | - ip netns exec ns2 ping -q -c 1 dead:1::99 > /dev/null # ping ns2->ns1 | ||
5717 | + ip netns exec "$ns2" ping -q -c 1 dead:1::99 > /dev/null # ping ns2->ns1 | ||
5718 | if [ $? -ne 0 ] ; then | ||
5719 | - echo "ERROR: cannot ping ns1 from ns2 via ipv6 with active $family redirect" | ||
5720 | + echo "ERROR: cannot ping $ns1 from $ns2 via ipv6 with active $family redirect" | ||
5721 | lret=1 | ||
5722 | fi | ||
5723 | |||
5724 | # ns1 should have seen no packets from ns2, due to redirection | ||
5725 | expect="packets 0 bytes 0" | ||
5726 | for dir in "in6" "out6" ; do | ||
5727 | - cnt=$(ip netns exec ns1 nft list counter inet filter ns2${dir} | grep -q "$expect") | ||
5728 | + cnt=$(ip netns exec "$ns1" nft list counter inet filter ns2${dir} | grep -q "$expect") | ||
5729 | if [ $? -ne 0 ]; then | ||
5730 | - bad_counter ns1 ns0$dir "$expect" | ||
5731 | + bad_counter "$ns1" ns0$dir "$expect" "test_redirect6 3" | ||
5732 | lret=1 | ||
5733 | fi | ||
5734 | done | ||
5735 | @@ -625,20 +640,20 @@ EOF | ||
5736 | # ns0 should have seen packets from ns2, due to masquerade | ||
5737 | expect="packets 1 bytes 104" | ||
5738 | for dir in "in6" "out6" ; do | ||
5739 | - cnt=$(ip netns exec ns0 nft list counter inet filter ns2${dir} | grep -q "$expect") | ||
5740 | + cnt=$(ip netns exec "$ns0" nft list counter inet filter ns2${dir} | grep -q "$expect") | ||
5741 | if [ $? -ne 0 ]; then | ||
5742 | - bad_counter ns1 ns0$dir "$expect" | ||
5743 | + bad_counter "$ns1" ns0$dir "$expect" "test_redirect6 4" | ||
5744 | lret=1 | ||
5745 | fi | ||
5746 | done | ||
5747 | |||
5748 | - ip netns exec ns0 nft delete table $family nat | ||
5749 | + ip netns exec "$ns0" nft delete table $family nat | ||
5750 | if [ $? -ne 0 ]; then | ||
5751 | echo "ERROR: Could not delete $family nat table" 1>&2 | ||
5752 | lret=1 | ||
5753 | fi | ||
5754 | |||
5755 | - test $lret -eq 0 && echo "PASS: $family IPv6 redirection for ns2" | ||
5756 | + test $lret -eq 0 && echo "PASS: $family IPv6 redirection for $ns2" | ||
5757 | |||
5758 | return $lret | ||
5759 | } | ||
5760 | @@ -648,26 +663,26 @@ test_redirect() | ||
5761 | local family=$1 | ||
5762 | local lret=0 | ||
5763 | |||
5764 | - ip netns exec ns0 sysctl net.ipv4.conf.veth0.forwarding=1 > /dev/null | ||
5765 | - ip netns exec ns0 sysctl net.ipv4.conf.veth1.forwarding=1 > /dev/null | ||
5766 | + ip netns exec "$ns0" sysctl net.ipv4.conf.veth0.forwarding=1 > /dev/null | ||
5767 | + ip netns exec "$ns0" sysctl net.ipv4.conf.veth1.forwarding=1 > /dev/null | ||
5768 | |||
5769 | - ip netns exec ns2 ping -q -c 1 10.0.1.99 > /dev/null # ping ns2->ns1 | ||
5770 | + ip netns exec "$ns2" ping -q -c 1 10.0.1.99 > /dev/null # ping ns2->ns1 | ||
5771 | if [ $? -ne 0 ] ; then | ||
5772 | - echo "ERROR: cannot ping ns1 from ns2" | ||
5773 | + echo "ERROR: cannot ping $ns1 from $ns2" | ||
5774 | lret=1 | ||
5775 | fi | ||
5776 | |||
5777 | expect="packets 1 bytes 84" | ||
5778 | for dir in "in" "out" ; do | ||
5779 | - cnt=$(ip netns exec ns1 nft list counter inet filter ns2${dir} | grep -q "$expect") | ||
5780 | + cnt=$(ip netns exec "$ns1" nft list counter inet filter ns2${dir} | grep -q "$expect") | ||
5781 | if [ $? -ne 0 ]; then | ||
5782 | - bad_counter ns1 ns2$dir "$expect" | ||
5783 | + bad_counter "$ns1" $ns2$dir "$expect" "test_redirect 1" | ||
5784 | lret=1 | ||
5785 | fi | ||
5786 | |||
5787 | - cnt=$(ip netns exec ns2 nft list counter inet filter ns1${dir} | grep -q "$expect") | ||
5788 | + cnt=$(ip netns exec "$ns2" nft list counter inet filter ns1${dir} | grep -q "$expect") | ||
5789 | if [ $? -ne 0 ]; then | ||
5790 | - bad_counter ns2 ns1$dir "$expect" | ||
5791 | + bad_counter "$ns2" ns1$dir "$expect" "test_redirect 2" | ||
5792 | lret=1 | ||
5793 | fi | ||
5794 | done | ||
5795 | @@ -675,7 +690,7 @@ test_redirect() | ||
5796 | reset_counters | ||
5797 | |||
5798 | # add redirect rule | ||
5799 | -ip netns exec ns0 nft -f - <<EOF | ||
5800 | +ip netns exec "$ns0" nft -f /dev/stdin <<EOF | ||
5801 | table $family nat { | ||
5802 | chain prerouting { | ||
5803 | type nat hook prerouting priority 0; policy accept; | ||
5804 | @@ -688,9 +703,9 @@ EOF | ||
5805 | return $ksft_skip | ||
5806 | fi | ||
5807 | |||
5808 | - ip netns exec ns2 ping -q -c 1 10.0.1.99 > /dev/null # ping ns2->ns1 | ||
5809 | + ip netns exec "$ns2" ping -q -c 1 10.0.1.99 > /dev/null # ping ns2->ns1 | ||
5810 | if [ $? -ne 0 ] ; then | ||
5811 | - echo "ERROR: cannot ping ns1 from ns2 with active $family ip redirect" | ||
5812 | + echo "ERROR: cannot ping $ns1 from $ns2 with active $family ip redirect" | ||
5813 | lret=1 | ||
5814 | fi | ||
5815 | |||
5816 | @@ -698,9 +713,9 @@ EOF | ||
5817 | expect="packets 0 bytes 0" | ||
5818 | for dir in "in" "out" ; do | ||
5819 | |||
5820 | - cnt=$(ip netns exec ns1 nft list counter inet filter ns2${dir} | grep -q "$expect") | ||
5821 | + cnt=$(ip netns exec "$ns1" nft list counter inet filter ns2${dir} | grep -q "$expect") | ||
5822 | if [ $? -ne 0 ]; then | ||
5823 | - bad_counter ns1 ns0$dir "$expect" | ||
5824 | + bad_counter "$ns1" ns0$dir "$expect" "test_redirect 3" | ||
5825 | lret=1 | ||
5826 | fi | ||
5827 | done | ||
5828 | @@ -708,28 +723,28 @@ EOF | ||
5829 | # ns0 should have seen packets from ns2, due to masquerade | ||
5830 | expect="packets 1 bytes 84" | ||
5831 | for dir in "in" "out" ; do | ||
5832 | - cnt=$(ip netns exec ns0 nft list counter inet filter ns2${dir} | grep -q "$expect") | ||
5833 | + cnt=$(ip netns exec "$ns0" nft list counter inet filter ns2${dir} | grep -q "$expect") | ||
5834 | if [ $? -ne 0 ]; then | ||
5835 | - bad_counter ns1 ns0$dir "$expect" | ||
5836 | + bad_counter "$ns0" ns0$dir "$expect" "test_redirect 4" | ||
5837 | lret=1 | ||
5838 | fi | ||
5839 | done | ||
5840 | |||
5841 | - ip netns exec ns0 nft delete table $family nat | ||
5842 | + ip netns exec "$ns0" nft delete table $family nat | ||
5843 | if [ $? -ne 0 ]; then | ||
5844 | echo "ERROR: Could not delete $family nat table" 1>&2 | ||
5845 | lret=1 | ||
5846 | fi | ||
5847 | |||
5848 | - test $lret -eq 0 && echo "PASS: $family IP redirection for ns2" | ||
5849 | + test $lret -eq 0 && echo "PASS: $family IP redirection for $ns2" | ||
5850 | |||
5851 | return $lret | ||
5852 | } | ||
5853 | |||
5854 | |||
5855 | -# ip netns exec ns0 ping -c 1 -q 10.0.$i.99 | ||
5856 | +# ip netns exec "$ns0" ping -c 1 -q 10.0.$i.99 | ||
5857 | for i in 0 1 2; do | ||
5858 | -ip netns exec ns$i nft -f - <<EOF | ||
5859 | +ip netns exec ns$i-$sfx nft -f /dev/stdin <<EOF | ||
5860 | table inet filter { | ||
5861 | counter ns0in {} | ||
5862 | counter ns1in {} | ||
5863 | @@ -796,18 +811,18 @@ done | ||
5864 | sleep 3 | ||
5865 | # test basic connectivity | ||
5866 | for i in 1 2; do | ||
5867 | - ip netns exec ns0 ping -c 1 -q 10.0.$i.99 > /dev/null | ||
5868 | + ip netns exec "$ns0" ping -c 1 -q 10.0.$i.99 > /dev/null | ||
5869 | if [ $? -ne 0 ];then | ||
5870 | echo "ERROR: Could not reach other namespace(s)" 1>&2 | ||
5871 | ret=1 | ||
5872 | fi | ||
5873 | |||
5874 | - ip netns exec ns0 ping -c 1 -q dead:$i::99 > /dev/null | ||
5875 | + ip netns exec "$ns0" ping -c 1 -q dead:$i::99 > /dev/null | ||
5876 | if [ $? -ne 0 ];then | ||
5877 | echo "ERROR: Could not reach other namespace(s) via ipv6" 1>&2 | ||
5878 | ret=1 | ||
5879 | fi | ||
5880 | - check_counters ns$i | ||
5881 | + check_counters ns$i-$sfx | ||
5882 | if [ $? -ne 0 ]; then | ||
5883 | ret=1 | ||
5884 | fi | ||
5885 | @@ -820,7 +835,7 @@ for i in 1 2; do | ||
5886 | done | ||
5887 | |||
5888 | if [ $ret -eq 0 ];then | ||
5889 | - echo "PASS: netns routing/connectivity: ns0 can reach ns1 and ns2" | ||
5890 | + echo "PASS: netns routing/connectivity: $ns0 can reach $ns1 and $ns2" | ||
5891 | fi | ||
5892 | |||
5893 | reset_counters | ||
5894 | @@ -846,4 +861,9 @@ reset_counters | ||
5895 | $test_inet_nat && test_redirect inet | ||
5896 | $test_inet_nat && test_redirect6 inet | ||
5897 | |||
5898 | +if [ $ret -ne 0 ];then | ||
5899 | + echo -n "FAIL: " | ||
5900 | + nft --version | ||
5901 | +fi | ||
5902 | + | ||
5903 | exit $ret | ||
5904 | diff --git a/tools/testing/selftests/safesetid/Makefile b/tools/testing/selftests/safesetid/Makefile | ||
5905 | index 98da7a504737..fa02c4d5ec13 100644 | ||
5906 | --- a/tools/testing/selftests/safesetid/Makefile | ||
5907 | +++ b/tools/testing/selftests/safesetid/Makefile | ||
5908 | @@ -1,8 +1,9 @@ | ||
5909 | # SPDX-License-Identifier: GPL-2.0 | ||
5910 | # Makefile for mount selftests. | ||
5911 | -CFLAGS = -Wall -lcap -O2 | ||
5912 | +CFLAGS = -Wall -O2 | ||
5913 | +LDLIBS = -lcap | ||
5914 | |||
5915 | -TEST_PROGS := run_tests.sh | ||
5916 | +TEST_PROGS := safesetid-test.sh | ||
5917 | TEST_GEN_FILES := safesetid-test | ||
5918 | |||
5919 | include ../lib.mk | ||
5920 | diff --git a/tools/testing/selftests/safesetid/safesetid-test.c b/tools/testing/selftests/safesetid/safesetid-test.c | ||
5921 | index 8f40c6ecdad1..0c4d50644c13 100644 | ||
5922 | --- a/tools/testing/selftests/safesetid/safesetid-test.c | ||
5923 | +++ b/tools/testing/selftests/safesetid/safesetid-test.c | ||
5924 | @@ -213,7 +213,8 @@ static void test_setuid(uid_t child_uid, bool expect_success) | ||
5925 | } | ||
5926 | |||
5927 | if (cpid == 0) { /* Code executed by child */ | ||
5928 | - setuid(child_uid); | ||
5929 | + if (setuid(child_uid) < 0) | ||
5930 | + exit(EXIT_FAILURE); | ||
5931 | if (getuid() == child_uid) | ||
5932 | exit(EXIT_SUCCESS); | ||
5933 | else | ||
5934 | @@ -291,8 +292,10 @@ int main(int argc, char **argv) | ||
5935 | |||
5936 | // First test to make sure we can write userns mappings from a user | ||
5937 | // that doesn't have any restrictions (as long as it has CAP_SETUID); | ||
5938 | - setuid(NO_POLICY_USER); | ||
5939 | - setgid(NO_POLICY_USER); | ||
5940 | + if (setuid(NO_POLICY_USER) < 0) | ||
5941 | + die("Error with set uid(%d)\n", NO_POLICY_USER); | ||
5942 | + if (setgid(NO_POLICY_USER) < 0) | ||
5943 | + die("Error with set gid(%d)\n", NO_POLICY_USER); | ||
5944 | |||
5945 | // Take away all but setid caps | ||
5946 | drop_caps(true); | ||
5947 | @@ -306,8 +309,10 @@ int main(int argc, char **argv) | ||
5948 | die("test_userns failed when it should work\n"); | ||
5949 | } | ||
5950 | |||
5951 | - setuid(RESTRICTED_PARENT); | ||
5952 | - setgid(RESTRICTED_PARENT); | ||
5953 | + if (setuid(RESTRICTED_PARENT) < 0) | ||
5954 | + die("Error with set uid(%d)\n", RESTRICTED_PARENT); | ||
5955 | + if (setgid(RESTRICTED_PARENT) < 0) | ||
5956 | + die("Error with set gid(%d)\n", RESTRICTED_PARENT); | ||
5957 | |||
5958 | test_setuid(ROOT_USER, false); | ||
5959 | test_setuid(ALLOWED_CHILD1, true); |