Annotation of /trunk/kernel-alx/patches-5.4/0149-5.4.50-all-fixes.patch
Parent Directory | Revision Log
Revision 3535 -
(hide annotations)
(download)
Wed Jul 8 10:50:05 2020 UTC (3 years, 11 months ago) by niro
File size: 183383 byte(s)
Wed Jul 8 10:50:05 2020 UTC (3 years, 11 months ago) by niro
File size: 183383 byte(s)
-linux-5.4.50
1 | niro | 3535 | diff --git a/Makefile b/Makefile |
2 | index 72230ad23299..380e398b2995 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 = 49 | ||
10 | +SUBLEVEL = 50 | ||
11 | EXTRAVERSION = | ||
12 | NAME = Kleptomaniac Octopus | ||
13 | |||
14 | diff --git a/arch/arm/boot/dts/am335x-pocketbeagle.dts b/arch/arm/boot/dts/am335x-pocketbeagle.dts | ||
15 | index ff4f919d22f6..abf2badce53d 100644 | ||
16 | --- a/arch/arm/boot/dts/am335x-pocketbeagle.dts | ||
17 | +++ b/arch/arm/boot/dts/am335x-pocketbeagle.dts | ||
18 | @@ -88,7 +88,6 @@ | ||
19 | AM33XX_PADCONF(AM335X_PIN_MMC0_DAT3, PIN_INPUT_PULLUP, MUX_MODE0) | ||
20 | AM33XX_PADCONF(AM335X_PIN_MMC0_CMD, PIN_INPUT_PULLUP, MUX_MODE0) | ||
21 | AM33XX_PADCONF(AM335X_PIN_MMC0_CLK, PIN_INPUT_PULLUP, MUX_MODE0) | ||
22 | - AM33XX_PADCONF(AM335X_PIN_MCASP0_ACLKR, PIN_INPUT, MUX_MODE4) /* (B12) mcasp0_aclkr.mmc0_sdwp */ | ||
23 | >; | ||
24 | }; | ||
25 | |||
26 | diff --git a/arch/arm/boot/dts/bcm-nsp.dtsi b/arch/arm/boot/dts/bcm-nsp.dtsi | ||
27 | index da6d70f09ef1..418e6b97cb2e 100644 | ||
28 | --- a/arch/arm/boot/dts/bcm-nsp.dtsi | ||
29 | +++ b/arch/arm/boot/dts/bcm-nsp.dtsi | ||
30 | @@ -257,10 +257,10 @@ | ||
31 | status = "disabled"; | ||
32 | }; | ||
33 | |||
34 | - mailbox: mailbox@25000 { | ||
35 | + mailbox: mailbox@25c00 { | ||
36 | compatible = "brcm,iproc-fa2-mbox"; | ||
37 | - reg = <0x25000 0x445>; | ||
38 | - interrupts = <GIC_SPI 150 IRQ_TYPE_LEVEL_HIGH>; | ||
39 | + reg = <0x25c00 0x400>; | ||
40 | + interrupts = <GIC_SPI 151 IRQ_TYPE_LEVEL_HIGH>; | ||
41 | #mbox-cells = <1>; | ||
42 | brcm,rx-status-len = <32>; | ||
43 | brcm,use-bcm-hdr; | ||
44 | diff --git a/arch/arm/boot/dts/omap4-duovero-parlor.dts b/arch/arm/boot/dts/omap4-duovero-parlor.dts | ||
45 | index 8047e8cdb3af..4548d87534e3 100644 | ||
46 | --- a/arch/arm/boot/dts/omap4-duovero-parlor.dts | ||
47 | +++ b/arch/arm/boot/dts/omap4-duovero-parlor.dts | ||
48 | @@ -139,7 +139,7 @@ | ||
49 | ethernet@gpmc { | ||
50 | reg = <5 0 0xff>; | ||
51 | interrupt-parent = <&gpio2>; | ||
52 | - interrupts = <12 IRQ_TYPE_EDGE_FALLING>; /* gpio_44 */ | ||
53 | + interrupts = <12 IRQ_TYPE_LEVEL_LOW>; /* gpio_44 */ | ||
54 | |||
55 | phy-mode = "mii"; | ||
56 | |||
57 | diff --git a/arch/arm/mach-imx/pm-imx5.c b/arch/arm/mach-imx/pm-imx5.c | ||
58 | index f057df813f83..e9962b48e30c 100644 | ||
59 | --- a/arch/arm/mach-imx/pm-imx5.c | ||
60 | +++ b/arch/arm/mach-imx/pm-imx5.c | ||
61 | @@ -295,14 +295,14 @@ static int __init imx_suspend_alloc_ocram( | ||
62 | if (!ocram_pool) { | ||
63 | pr_warn("%s: ocram pool unavailable!\n", __func__); | ||
64 | ret = -ENODEV; | ||
65 | - goto put_node; | ||
66 | + goto put_device; | ||
67 | } | ||
68 | |||
69 | ocram_base = gen_pool_alloc(ocram_pool, size); | ||
70 | if (!ocram_base) { | ||
71 | pr_warn("%s: unable to alloc ocram!\n", __func__); | ||
72 | ret = -ENOMEM; | ||
73 | - goto put_node; | ||
74 | + goto put_device; | ||
75 | } | ||
76 | |||
77 | phys = gen_pool_virt_to_phys(ocram_pool, ocram_base); | ||
78 | @@ -312,6 +312,8 @@ static int __init imx_suspend_alloc_ocram( | ||
79 | if (virt_out) | ||
80 | *virt_out = virt; | ||
81 | |||
82 | +put_device: | ||
83 | + put_device(&pdev->dev); | ||
84 | put_node: | ||
85 | of_node_put(node); | ||
86 | |||
87 | diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c | ||
88 | index 203664c40d3d..eb74aa182661 100644 | ||
89 | --- a/arch/arm/mach-omap2/omap_hwmod.c | ||
90 | +++ b/arch/arm/mach-omap2/omap_hwmod.c | ||
91 | @@ -3535,7 +3535,7 @@ static const struct omap_hwmod_reset dra7_reset_quirks[] = { | ||
92 | }; | ||
93 | |||
94 | static const struct omap_hwmod_reset omap_reset_quirks[] = { | ||
95 | - { .match = "dss", .len = 3, .reset = omap_dss_reset, }, | ||
96 | + { .match = "dss_core", .len = 8, .reset = omap_dss_reset, }, | ||
97 | { .match = "hdq1w", .len = 5, .reset = omap_hdq1w_reset, }, | ||
98 | { .match = "i2c", .len = 3, .reset = omap_i2c_reset, }, | ||
99 | { .match = "wd_timer", .len = 8, .reset = omap2_wd_timer_reset, }, | ||
100 | diff --git a/arch/arm64/boot/dts/freescale/imx8mm-evk.dts b/arch/arm64/boot/dts/freescale/imx8mm-evk.dts | ||
101 | index 13137451b438..b9f8b7aac8ff 100644 | ||
102 | --- a/arch/arm64/boot/dts/freescale/imx8mm-evk.dts | ||
103 | +++ b/arch/arm64/boot/dts/freescale/imx8mm-evk.dts | ||
104 | @@ -231,7 +231,7 @@ | ||
105 | |||
106 | ldo1_reg: LDO1 { | ||
107 | regulator-name = "LDO1"; | ||
108 | - regulator-min-microvolt = <3000000>; | ||
109 | + regulator-min-microvolt = <1600000>; | ||
110 | regulator-max-microvolt = <3300000>; | ||
111 | regulator-boot-on; | ||
112 | regulator-always-on; | ||
113 | @@ -239,7 +239,7 @@ | ||
114 | |||
115 | ldo2_reg: LDO2 { | ||
116 | regulator-name = "LDO2"; | ||
117 | - regulator-min-microvolt = <900000>; | ||
118 | + regulator-min-microvolt = <800000>; | ||
119 | regulator-max-microvolt = <900000>; | ||
120 | regulator-boot-on; | ||
121 | regulator-always-on; | ||
122 | diff --git a/arch/arm64/boot/dts/freescale/imx8mn-ddr4-evk.dts b/arch/arm64/boot/dts/freescale/imx8mn-ddr4-evk.dts | ||
123 | index 11c705d225d0..9ad1d43b8ce7 100644 | ||
124 | --- a/arch/arm64/boot/dts/freescale/imx8mn-ddr4-evk.dts | ||
125 | +++ b/arch/arm64/boot/dts/freescale/imx8mn-ddr4-evk.dts | ||
126 | @@ -268,7 +268,7 @@ | ||
127 | |||
128 | ldo1_reg: LDO1 { | ||
129 | regulator-name = "LDO1"; | ||
130 | - regulator-min-microvolt = <3000000>; | ||
131 | + regulator-min-microvolt = <1600000>; | ||
132 | regulator-max-microvolt = <3300000>; | ||
133 | regulator-boot-on; | ||
134 | regulator-always-on; | ||
135 | @@ -276,7 +276,7 @@ | ||
136 | |||
137 | ldo2_reg: LDO2 { | ||
138 | regulator-name = "LDO2"; | ||
139 | - regulator-min-microvolt = <900000>; | ||
140 | + regulator-min-microvolt = <800000>; | ||
141 | regulator-max-microvolt = <900000>; | ||
142 | regulator-boot-on; | ||
143 | regulator-always-on; | ||
144 | diff --git a/arch/arm64/kernel/fpsimd.c b/arch/arm64/kernel/fpsimd.c | ||
145 | index 1765e5284994..04b982a2799e 100644 | ||
146 | --- a/arch/arm64/kernel/fpsimd.c | ||
147 | +++ b/arch/arm64/kernel/fpsimd.c | ||
148 | @@ -338,7 +338,7 @@ static unsigned int find_supported_vector_length(unsigned int vl) | ||
149 | return sve_vl_from_vq(__bit_to_vq(bit)); | ||
150 | } | ||
151 | |||
152 | -#ifdef CONFIG_SYSCTL | ||
153 | +#if defined(CONFIG_ARM64_SVE) && defined(CONFIG_SYSCTL) | ||
154 | |||
155 | static int sve_proc_do_default_vl(struct ctl_table *table, int write, | ||
156 | void __user *buffer, size_t *lenp, | ||
157 | @@ -384,9 +384,9 @@ static int __init sve_sysctl_init(void) | ||
158 | return 0; | ||
159 | } | ||
160 | |||
161 | -#else /* ! CONFIG_SYSCTL */ | ||
162 | +#else /* ! (CONFIG_ARM64_SVE && CONFIG_SYSCTL) */ | ||
163 | static int __init sve_sysctl_init(void) { return 0; } | ||
164 | -#endif /* ! CONFIG_SYSCTL */ | ||
165 | +#endif /* ! (CONFIG_ARM64_SVE && CONFIG_SYSCTL) */ | ||
166 | |||
167 | #define ZREG(sve_state, vq, n) ((char *)(sve_state) + \ | ||
168 | (SVE_SIG_ZREG_OFFSET(vq, n) - SVE_SIG_REGS_OFFSET)) | ||
169 | diff --git a/arch/arm64/kernel/perf_regs.c b/arch/arm64/kernel/perf_regs.c | ||
170 | index 0bbac612146e..666b225aeb3a 100644 | ||
171 | --- a/arch/arm64/kernel/perf_regs.c | ||
172 | +++ b/arch/arm64/kernel/perf_regs.c | ||
173 | @@ -15,15 +15,34 @@ u64 perf_reg_value(struct pt_regs *regs, int idx) | ||
174 | return 0; | ||
175 | |||
176 | /* | ||
177 | - * Compat (i.e. 32 bit) mode: | ||
178 | - * - PC has been set in the pt_regs struct in kernel_entry, | ||
179 | - * - Handle SP and LR here. | ||
180 | + * Our handling of compat tasks (PERF_SAMPLE_REGS_ABI_32) is weird, but | ||
181 | + * we're stuck with it for ABI compatability reasons. | ||
182 | + * | ||
183 | + * For a 32-bit consumer inspecting a 32-bit task, then it will look at | ||
184 | + * the first 16 registers (see arch/arm/include/uapi/asm/perf_regs.h). | ||
185 | + * These correspond directly to a prefix of the registers saved in our | ||
186 | + * 'struct pt_regs', with the exception of the PC, so we copy that down | ||
187 | + * (x15 corresponds to SP_hyp in the architecture). | ||
188 | + * | ||
189 | + * So far, so good. | ||
190 | + * | ||
191 | + * The oddity arises when a 64-bit consumer looks at a 32-bit task and | ||
192 | + * asks for registers beyond PERF_REG_ARM_MAX. In this case, we return | ||
193 | + * SP_usr, LR_usr and PC in the positions where the AArch64 SP, LR and | ||
194 | + * PC registers would normally live. The initial idea was to allow a | ||
195 | + * 64-bit unwinder to unwind a 32-bit task and, although it's not clear | ||
196 | + * how well that works in practice, somebody might be relying on it. | ||
197 | + * | ||
198 | + * At the time we make a sample, we don't know whether the consumer is | ||
199 | + * 32-bit or 64-bit, so we have to cater for both possibilities. | ||
200 | */ | ||
201 | if (compat_user_mode(regs)) { | ||
202 | if ((u32)idx == PERF_REG_ARM64_SP) | ||
203 | return regs->compat_sp; | ||
204 | if ((u32)idx == PERF_REG_ARM64_LR) | ||
205 | return regs->compat_lr; | ||
206 | + if (idx == 15) | ||
207 | + return regs->pc; | ||
208 | } | ||
209 | |||
210 | if ((u32)idx == PERF_REG_ARM64_SP) | ||
211 | diff --git a/arch/riscv/include/asm/cmpxchg.h b/arch/riscv/include/asm/cmpxchg.h | ||
212 | index d969bab4a26b..262e5bbb2776 100644 | ||
213 | --- a/arch/riscv/include/asm/cmpxchg.h | ||
214 | +++ b/arch/riscv/include/asm/cmpxchg.h | ||
215 | @@ -179,7 +179,7 @@ | ||
216 | " bnez %1, 0b\n" \ | ||
217 | "1:\n" \ | ||
218 | : "=&r" (__ret), "=&r" (__rc), "+A" (*__ptr) \ | ||
219 | - : "rJ" (__old), "rJ" (__new) \ | ||
220 | + : "rJ" ((long)__old), "rJ" (__new) \ | ||
221 | : "memory"); \ | ||
222 | break; \ | ||
223 | case 8: \ | ||
224 | @@ -224,7 +224,7 @@ | ||
225 | RISCV_ACQUIRE_BARRIER \ | ||
226 | "1:\n" \ | ||
227 | : "=&r" (__ret), "=&r" (__rc), "+A" (*__ptr) \ | ||
228 | - : "rJ" (__old), "rJ" (__new) \ | ||
229 | + : "rJ" ((long)__old), "rJ" (__new) \ | ||
230 | : "memory"); \ | ||
231 | break; \ | ||
232 | case 8: \ | ||
233 | @@ -270,7 +270,7 @@ | ||
234 | " bnez %1, 0b\n" \ | ||
235 | "1:\n" \ | ||
236 | : "=&r" (__ret), "=&r" (__rc), "+A" (*__ptr) \ | ||
237 | - : "rJ" (__old), "rJ" (__new) \ | ||
238 | + : "rJ" ((long)__old), "rJ" (__new) \ | ||
239 | : "memory"); \ | ||
240 | break; \ | ||
241 | case 8: \ | ||
242 | @@ -316,7 +316,7 @@ | ||
243 | " fence rw, rw\n" \ | ||
244 | "1:\n" \ | ||
245 | : "=&r" (__ret), "=&r" (__rc), "+A" (*__ptr) \ | ||
246 | - : "rJ" (__old), "rJ" (__new) \ | ||
247 | + : "rJ" ((long)__old), "rJ" (__new) \ | ||
248 | : "memory"); \ | ||
249 | break; \ | ||
250 | case 8: \ | ||
251 | diff --git a/arch/riscv/kernel/sys_riscv.c b/arch/riscv/kernel/sys_riscv.c | ||
252 | index f3619f59d85c..12f8a7fce78b 100644 | ||
253 | --- a/arch/riscv/kernel/sys_riscv.c | ||
254 | +++ b/arch/riscv/kernel/sys_riscv.c | ||
255 | @@ -8,6 +8,7 @@ | ||
256 | #include <linux/syscalls.h> | ||
257 | #include <asm/unistd.h> | ||
258 | #include <asm/cacheflush.h> | ||
259 | +#include <asm-generic/mman-common.h> | ||
260 | |||
261 | static long riscv_sys_mmap(unsigned long addr, unsigned long len, | ||
262 | unsigned long prot, unsigned long flags, | ||
263 | @@ -16,6 +17,11 @@ static long riscv_sys_mmap(unsigned long addr, unsigned long len, | ||
264 | { | ||
265 | if (unlikely(offset & (~PAGE_MASK >> page_shift_offset))) | ||
266 | return -EINVAL; | ||
267 | + | ||
268 | + if ((prot & PROT_WRITE) && (prot & PROT_EXEC)) | ||
269 | + if (unlikely(!(prot & PROT_READ))) | ||
270 | + return -EINVAL; | ||
271 | + | ||
272 | return ksys_mmap_pgoff(addr, len, prot, flags, fd, | ||
273 | offset >> (PAGE_SHIFT - page_shift_offset)); | ||
274 | } | ||
275 | diff --git a/arch/s390/include/asm/vdso.h b/arch/s390/include/asm/vdso.h | ||
276 | index 169d7604eb80..f3ba84fa9bd1 100644 | ||
277 | --- a/arch/s390/include/asm/vdso.h | ||
278 | +++ b/arch/s390/include/asm/vdso.h | ||
279 | @@ -36,6 +36,7 @@ struct vdso_data { | ||
280 | __u32 tk_shift; /* Shift used for xtime_nsec 0x60 */ | ||
281 | __u32 ts_dir; /* TOD steering direction 0x64 */ | ||
282 | __u64 ts_end; /* TOD steering end 0x68 */ | ||
283 | + __u32 hrtimer_res; /* hrtimer resolution 0x70 */ | ||
284 | }; | ||
285 | |||
286 | struct vdso_per_cpu_data { | ||
287 | diff --git a/arch/s390/kernel/asm-offsets.c b/arch/s390/kernel/asm-offsets.c | ||
288 | index b6628586ab70..a65cb4924bdb 100644 | ||
289 | --- a/arch/s390/kernel/asm-offsets.c | ||
290 | +++ b/arch/s390/kernel/asm-offsets.c | ||
291 | @@ -76,6 +76,7 @@ int main(void) | ||
292 | OFFSET(__VDSO_TK_SHIFT, vdso_data, tk_shift); | ||
293 | OFFSET(__VDSO_TS_DIR, vdso_data, ts_dir); | ||
294 | OFFSET(__VDSO_TS_END, vdso_data, ts_end); | ||
295 | + OFFSET(__VDSO_CLOCK_REALTIME_RES, vdso_data, hrtimer_res); | ||
296 | OFFSET(__VDSO_ECTG_BASE, vdso_per_cpu_data, ectg_timer_base); | ||
297 | OFFSET(__VDSO_ECTG_USER, vdso_per_cpu_data, ectg_user_time); | ||
298 | OFFSET(__VDSO_CPU_NR, vdso_per_cpu_data, cpu_nr); | ||
299 | @@ -87,7 +88,6 @@ int main(void) | ||
300 | DEFINE(__CLOCK_REALTIME_COARSE, CLOCK_REALTIME_COARSE); | ||
301 | DEFINE(__CLOCK_MONOTONIC_COARSE, CLOCK_MONOTONIC_COARSE); | ||
302 | DEFINE(__CLOCK_THREAD_CPUTIME_ID, CLOCK_THREAD_CPUTIME_ID); | ||
303 | - DEFINE(__CLOCK_REALTIME_RES, MONOTONIC_RES_NSEC); | ||
304 | DEFINE(__CLOCK_COARSE_RES, LOW_RES_NSEC); | ||
305 | BLANK(); | ||
306 | /* idle data offsets */ | ||
307 | diff --git a/arch/s390/kernel/entry.S b/arch/s390/kernel/entry.S | ||
308 | index bc85987727f0..c544b7a11ebb 100644 | ||
309 | --- a/arch/s390/kernel/entry.S | ||
310 | +++ b/arch/s390/kernel/entry.S | ||
311 | @@ -368,9 +368,9 @@ ENTRY(system_call) | ||
312 | jnz .Lsysc_nr_ok | ||
313 | # svc 0: system call number in %r1 | ||
314 | llgfr %r1,%r1 # clear high word in r1 | ||
315 | + sth %r1,__PT_INT_CODE+2(%r11) | ||
316 | cghi %r1,NR_syscalls | ||
317 | jnl .Lsysc_nr_ok | ||
318 | - sth %r1,__PT_INT_CODE+2(%r11) | ||
319 | slag %r8,%r1,3 | ||
320 | .Lsysc_nr_ok: | ||
321 | xc __SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15) | ||
322 | diff --git a/arch/s390/kernel/ptrace.c b/arch/s390/kernel/ptrace.c | ||
323 | index ad71132374f0..5aa786063eb3 100644 | ||
324 | --- a/arch/s390/kernel/ptrace.c | ||
325 | +++ b/arch/s390/kernel/ptrace.c | ||
326 | @@ -324,6 +324,25 @@ static inline void __poke_user_per(struct task_struct *child, | ||
327 | child->thread.per_user.end = data; | ||
328 | } | ||
329 | |||
330 | +static void fixup_int_code(struct task_struct *child, addr_t data) | ||
331 | +{ | ||
332 | + struct pt_regs *regs = task_pt_regs(child); | ||
333 | + int ilc = regs->int_code >> 16; | ||
334 | + u16 insn; | ||
335 | + | ||
336 | + if (ilc > 6) | ||
337 | + return; | ||
338 | + | ||
339 | + if (ptrace_access_vm(child, regs->psw.addr - (regs->int_code >> 16), | ||
340 | + &insn, sizeof(insn), FOLL_FORCE) != sizeof(insn)) | ||
341 | + return; | ||
342 | + | ||
343 | + /* double check that tracee stopped on svc instruction */ | ||
344 | + if ((insn >> 8) != 0xa) | ||
345 | + return; | ||
346 | + | ||
347 | + regs->int_code = 0x20000 | (data & 0xffff); | ||
348 | +} | ||
349 | /* | ||
350 | * Write a word to the user area of a process at location addr. This | ||
351 | * operation does have an additional problem compared to peek_user. | ||
352 | @@ -335,7 +354,9 @@ static int __poke_user(struct task_struct *child, addr_t addr, addr_t data) | ||
353 | struct user *dummy = NULL; | ||
354 | addr_t offset; | ||
355 | |||
356 | + | ||
357 | if (addr < (addr_t) &dummy->regs.acrs) { | ||
358 | + struct pt_regs *regs = task_pt_regs(child); | ||
359 | /* | ||
360 | * psw and gprs are stored on the stack | ||
361 | */ | ||
362 | @@ -353,7 +374,11 @@ static int __poke_user(struct task_struct *child, addr_t addr, addr_t data) | ||
363 | /* Invalid addressing mode bits */ | ||
364 | return -EINVAL; | ||
365 | } | ||
366 | - *(addr_t *)((addr_t) &task_pt_regs(child)->psw + addr) = data; | ||
367 | + | ||
368 | + if (test_pt_regs_flag(regs, PIF_SYSCALL) && | ||
369 | + addr == offsetof(struct user, regs.gprs[2])) | ||
370 | + fixup_int_code(child, data); | ||
371 | + *(addr_t *)((addr_t) ®s->psw + addr) = data; | ||
372 | |||
373 | } else if (addr < (addr_t) (&dummy->regs.orig_gpr2)) { | ||
374 | /* | ||
375 | @@ -719,6 +744,10 @@ static int __poke_user_compat(struct task_struct *child, | ||
376 | regs->psw.mask = (regs->psw.mask & ~PSW_MASK_BA) | | ||
377 | (__u64)(tmp & PSW32_ADDR_AMODE); | ||
378 | } else { | ||
379 | + | ||
380 | + if (test_pt_regs_flag(regs, PIF_SYSCALL) && | ||
381 | + addr == offsetof(struct compat_user, regs.gprs[2])) | ||
382 | + fixup_int_code(child, data); | ||
383 | /* gpr 0-15 */ | ||
384 | *(__u32*)((addr_t) ®s->psw + addr*2 + 4) = tmp; | ||
385 | } | ||
386 | @@ -844,11 +873,9 @@ asmlinkage long do_syscall_trace_enter(struct pt_regs *regs) | ||
387 | * call number to gprs[2]. | ||
388 | */ | ||
389 | if (test_thread_flag(TIF_SYSCALL_TRACE) && | ||
390 | - (tracehook_report_syscall_entry(regs) || | ||
391 | - regs->gprs[2] >= NR_syscalls)) { | ||
392 | + tracehook_report_syscall_entry(regs)) { | ||
393 | /* | ||
394 | - * Tracing decided this syscall should not happen or the | ||
395 | - * debugger stored an invalid system call number. Skip | ||
396 | + * Tracing decided this syscall should not happen. Skip | ||
397 | * the system call and the system call restart handling. | ||
398 | */ | ||
399 | clear_pt_regs_flag(regs, PIF_SYSCALL); | ||
400 | diff --git a/arch/s390/kernel/time.c b/arch/s390/kernel/time.c | ||
401 | index e8766beee5ad..8ea9db599d38 100644 | ||
402 | --- a/arch/s390/kernel/time.c | ||
403 | +++ b/arch/s390/kernel/time.c | ||
404 | @@ -310,6 +310,7 @@ void update_vsyscall(struct timekeeper *tk) | ||
405 | |||
406 | vdso_data->tk_mult = tk->tkr_mono.mult; | ||
407 | vdso_data->tk_shift = tk->tkr_mono.shift; | ||
408 | + vdso_data->hrtimer_res = hrtimer_resolution; | ||
409 | smp_wmb(); | ||
410 | ++vdso_data->tb_update_count; | ||
411 | } | ||
412 | diff --git a/arch/s390/kernel/vdso64/Makefile b/arch/s390/kernel/vdso64/Makefile | ||
413 | index bec19e7e6e1c..4a66a1cb919b 100644 | ||
414 | --- a/arch/s390/kernel/vdso64/Makefile | ||
415 | +++ b/arch/s390/kernel/vdso64/Makefile | ||
416 | @@ -18,8 +18,8 @@ KBUILD_AFLAGS_64 += -m64 -s | ||
417 | |||
418 | KBUILD_CFLAGS_64 := $(filter-out -m64,$(KBUILD_CFLAGS)) | ||
419 | KBUILD_CFLAGS_64 += -m64 -fPIC -shared -fno-common -fno-builtin | ||
420 | -KBUILD_CFLAGS_64 += -nostdlib -Wl,-soname=linux-vdso64.so.1 \ | ||
421 | - -Wl,--hash-style=both | ||
422 | +ldflags-y := -fPIC -shared -nostdlib -soname=linux-vdso64.so.1 \ | ||
423 | + --hash-style=both --build-id -T | ||
424 | |||
425 | $(targets:%=$(obj)/%.dbg): KBUILD_CFLAGS = $(KBUILD_CFLAGS_64) | ||
426 | $(targets:%=$(obj)/%.dbg): KBUILD_AFLAGS = $(KBUILD_AFLAGS_64) | ||
427 | @@ -37,8 +37,8 @@ KASAN_SANITIZE := n | ||
428 | $(obj)/vdso64_wrapper.o : $(obj)/vdso64.so | ||
429 | |||
430 | # link rule for the .so file, .lds has to be first | ||
431 | -$(obj)/vdso64.so.dbg: $(src)/vdso64.lds $(obj-vdso64) FORCE | ||
432 | - $(call if_changed,vdso64ld) | ||
433 | +$(obj)/vdso64.so.dbg: $(obj)/vdso64.lds $(obj-vdso64) FORCE | ||
434 | + $(call if_changed,ld) | ||
435 | |||
436 | # strip rule for the .so file | ||
437 | $(obj)/%.so: OBJCOPYFLAGS := -S | ||
438 | @@ -50,8 +50,6 @@ $(obj-vdso64): %.o: %.S FORCE | ||
439 | $(call if_changed_dep,vdso64as) | ||
440 | |||
441 | # actual build commands | ||
442 | -quiet_cmd_vdso64ld = VDSO64L $@ | ||
443 | - cmd_vdso64ld = $(CC) $(c_flags) -Wl,-T $(filter %.lds %.o,$^) -o $@ | ||
444 | quiet_cmd_vdso64as = VDSO64A $@ | ||
445 | cmd_vdso64as = $(CC) $(a_flags) -c -o $@ $< | ||
446 | |||
447 | diff --git a/arch/s390/kernel/vdso64/clock_getres.S b/arch/s390/kernel/vdso64/clock_getres.S | ||
448 | index 081435398e0a..0c79caa32b59 100644 | ||
449 | --- a/arch/s390/kernel/vdso64/clock_getres.S | ||
450 | +++ b/arch/s390/kernel/vdso64/clock_getres.S | ||
451 | @@ -17,12 +17,14 @@ | ||
452 | .type __kernel_clock_getres,@function | ||
453 | __kernel_clock_getres: | ||
454 | CFI_STARTPROC | ||
455 | - larl %r1,4f | ||
456 | + larl %r1,3f | ||
457 | + lg %r0,0(%r1) | ||
458 | cghi %r2,__CLOCK_REALTIME_COARSE | ||
459 | je 0f | ||
460 | cghi %r2,__CLOCK_MONOTONIC_COARSE | ||
461 | je 0f | ||
462 | - larl %r1,3f | ||
463 | + larl %r1,_vdso_data | ||
464 | + llgf %r0,__VDSO_CLOCK_REALTIME_RES(%r1) | ||
465 | cghi %r2,__CLOCK_REALTIME | ||
466 | je 0f | ||
467 | cghi %r2,__CLOCK_MONOTONIC | ||
468 | @@ -36,7 +38,6 @@ __kernel_clock_getres: | ||
469 | jz 2f | ||
470 | 0: ltgr %r3,%r3 | ||
471 | jz 1f /* res == NULL */ | ||
472 | - lg %r0,0(%r1) | ||
473 | xc 0(8,%r3),0(%r3) /* set tp->tv_sec to zero */ | ||
474 | stg %r0,8(%r3) /* store tp->tv_usec */ | ||
475 | 1: lghi %r2,0 | ||
476 | @@ -45,6 +46,5 @@ __kernel_clock_getres: | ||
477 | svc 0 | ||
478 | br %r14 | ||
479 | CFI_ENDPROC | ||
480 | -3: .quad __CLOCK_REALTIME_RES | ||
481 | -4: .quad __CLOCK_COARSE_RES | ||
482 | +3: .quad __CLOCK_COARSE_RES | ||
483 | .size __kernel_clock_getres,.-__kernel_clock_getres | ||
484 | diff --git a/arch/sparc/kernel/ptrace_32.c b/arch/sparc/kernel/ptrace_32.c | ||
485 | index 60f7205ebe40..646dd58169ec 100644 | ||
486 | --- a/arch/sparc/kernel/ptrace_32.c | ||
487 | +++ b/arch/sparc/kernel/ptrace_32.c | ||
488 | @@ -168,12 +168,17 @@ static int genregs32_set(struct task_struct *target, | ||
489 | if (ret || !count) | ||
490 | return ret; | ||
491 | ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, | ||
492 | - ®s->y, | ||
493 | + ®s->npc, | ||
494 | 34 * sizeof(u32), 35 * sizeof(u32)); | ||
495 | if (ret || !count) | ||
496 | return ret; | ||
497 | + ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, | ||
498 | + ®s->y, | ||
499 | + 35 * sizeof(u32), 36 * sizeof(u32)); | ||
500 | + if (ret || !count) | ||
501 | + return ret; | ||
502 | return user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, | ||
503 | - 35 * sizeof(u32), 38 * sizeof(u32)); | ||
504 | + 36 * sizeof(u32), 38 * sizeof(u32)); | ||
505 | } | ||
506 | |||
507 | static int fpregs32_get(struct task_struct *target, | ||
508 | diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h | ||
509 | index 7d91a3f5b26a..742de9d97ba1 100644 | ||
510 | --- a/arch/x86/include/asm/kvm_host.h | ||
511 | +++ b/arch/x86/include/asm/kvm_host.h | ||
512 | @@ -1160,7 +1160,7 @@ struct kvm_x86_ops { | ||
513 | void (*enable_log_dirty_pt_masked)(struct kvm *kvm, | ||
514 | struct kvm_memory_slot *slot, | ||
515 | gfn_t offset, unsigned long mask); | ||
516 | - int (*write_log_dirty)(struct kvm_vcpu *vcpu); | ||
517 | + int (*write_log_dirty)(struct kvm_vcpu *vcpu, gpa_t l2_gpa); | ||
518 | |||
519 | /* pmu operations of sub-arch */ | ||
520 | const struct kvm_pmu_ops *pmu_ops; | ||
521 | diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c | ||
522 | index 650df6d21049..9b3f25e14608 100644 | ||
523 | --- a/arch/x86/kernel/cpu/common.c | ||
524 | +++ b/arch/x86/kernel/cpu/common.c | ||
525 | @@ -366,6 +366,9 @@ out: | ||
526 | cr4_clear_bits(X86_CR4_UMIP); | ||
527 | } | ||
528 | |||
529 | +/* These bits should not change their value after CPU init is finished. */ | ||
530 | +static const unsigned long cr4_pinned_mask = | ||
531 | + X86_CR4_SMEP | X86_CR4_SMAP | X86_CR4_UMIP | X86_CR4_FSGSBASE; | ||
532 | static DEFINE_STATIC_KEY_FALSE_RO(cr_pinning); | ||
533 | static unsigned long cr4_pinned_bits __ro_after_init; | ||
534 | |||
535 | @@ -390,20 +393,20 @@ EXPORT_SYMBOL(native_write_cr0); | ||
536 | |||
537 | void native_write_cr4(unsigned long val) | ||
538 | { | ||
539 | - unsigned long bits_missing = 0; | ||
540 | + unsigned long bits_changed = 0; | ||
541 | |||
542 | set_register: | ||
543 | asm volatile("mov %0,%%cr4": "+r" (val), "+m" (cr4_pinned_bits)); | ||
544 | |||
545 | if (static_branch_likely(&cr_pinning)) { | ||
546 | - if (unlikely((val & cr4_pinned_bits) != cr4_pinned_bits)) { | ||
547 | - bits_missing = ~val & cr4_pinned_bits; | ||
548 | - val |= bits_missing; | ||
549 | + if (unlikely((val & cr4_pinned_mask) != cr4_pinned_bits)) { | ||
550 | + bits_changed = (val & cr4_pinned_mask) ^ cr4_pinned_bits; | ||
551 | + val = (val & ~cr4_pinned_mask) | cr4_pinned_bits; | ||
552 | goto set_register; | ||
553 | } | ||
554 | - /* Warn after we've set the missing bits. */ | ||
555 | - WARN_ONCE(bits_missing, "CR4 bits went missing: %lx!?\n", | ||
556 | - bits_missing); | ||
557 | + /* Warn after we've corrected the changed bits. */ | ||
558 | + WARN_ONCE(bits_changed, "pinned CR4 bits changed: 0x%lx!?\n", | ||
559 | + bits_changed); | ||
560 | } | ||
561 | } | ||
562 | EXPORT_SYMBOL(native_write_cr4); | ||
563 | @@ -415,7 +418,7 @@ void cr4_init(void) | ||
564 | if (boot_cpu_has(X86_FEATURE_PCID)) | ||
565 | cr4 |= X86_CR4_PCIDE; | ||
566 | if (static_branch_likely(&cr_pinning)) | ||
567 | - cr4 |= cr4_pinned_bits; | ||
568 | + cr4 = (cr4 & ~cr4_pinned_mask) | cr4_pinned_bits; | ||
569 | |||
570 | __write_cr4(cr4); | ||
571 | |||
572 | @@ -430,10 +433,7 @@ void cr4_init(void) | ||
573 | */ | ||
574 | static void __init setup_cr_pinning(void) | ||
575 | { | ||
576 | - unsigned long mask; | ||
577 | - | ||
578 | - mask = (X86_CR4_SMEP | X86_CR4_SMAP | X86_CR4_UMIP); | ||
579 | - cr4_pinned_bits = this_cpu_read(cpu_tlbstate.cr4) & mask; | ||
580 | + cr4_pinned_bits = this_cpu_read(cpu_tlbstate.cr4) & cr4_pinned_mask; | ||
581 | static_key_enable(&cr_pinning.key); | ||
582 | } | ||
583 | |||
584 | diff --git a/arch/x86/kernel/cpu/resctrl/rdtgroup.c b/arch/x86/kernel/cpu/resctrl/rdtgroup.c | ||
585 | index 20856d80dce3..54b711bc0607 100644 | ||
586 | --- a/arch/x86/kernel/cpu/resctrl/rdtgroup.c | ||
587 | +++ b/arch/x86/kernel/cpu/resctrl/rdtgroup.c | ||
588 | @@ -1027,6 +1027,7 @@ static int rdt_cdp_peer_get(struct rdt_resource *r, struct rdt_domain *d, | ||
589 | _d_cdp = rdt_find_domain(_r_cdp, d->id, NULL); | ||
590 | if (WARN_ON(IS_ERR_OR_NULL(_d_cdp))) { | ||
591 | _r_cdp = NULL; | ||
592 | + _d_cdp = NULL; | ||
593 | ret = -EINVAL; | ||
594 | } | ||
595 | |||
596 | diff --git a/arch/x86/kernel/cpu/umwait.c b/arch/x86/kernel/cpu/umwait.c | ||
597 | index c222f283b456..32b4dc9030aa 100644 | ||
598 | --- a/arch/x86/kernel/cpu/umwait.c | ||
599 | +++ b/arch/x86/kernel/cpu/umwait.c | ||
600 | @@ -17,12 +17,6 @@ | ||
601 | */ | ||
602 | static u32 umwait_control_cached = UMWAIT_CTRL_VAL(100000, UMWAIT_C02_ENABLE); | ||
603 | |||
604 | -u32 get_umwait_control_msr(void) | ||
605 | -{ | ||
606 | - return umwait_control_cached; | ||
607 | -} | ||
608 | -EXPORT_SYMBOL_GPL(get_umwait_control_msr); | ||
609 | - | ||
610 | /* | ||
611 | * Cache the original IA32_UMWAIT_CONTROL MSR value which is configured by | ||
612 | * hardware or BIOS before kernel boot. | ||
613 | diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c | ||
614 | index a3824ae9a634..aab02ea2d2cb 100644 | ||
615 | --- a/arch/x86/kvm/mmu.c | ||
616 | +++ b/arch/x86/kvm/mmu.c | ||
617 | @@ -1819,10 +1819,10 @@ void kvm_arch_mmu_enable_log_dirty_pt_masked(struct kvm *kvm, | ||
618 | * Emulate arch specific page modification logging for the | ||
619 | * nested hypervisor | ||
620 | */ | ||
621 | -int kvm_arch_write_log_dirty(struct kvm_vcpu *vcpu) | ||
622 | +int kvm_arch_write_log_dirty(struct kvm_vcpu *vcpu, gpa_t l2_gpa) | ||
623 | { | ||
624 | if (kvm_x86_ops->write_log_dirty) | ||
625 | - return kvm_x86_ops->write_log_dirty(vcpu); | ||
626 | + return kvm_x86_ops->write_log_dirty(vcpu, l2_gpa); | ||
627 | |||
628 | return 0; | ||
629 | } | ||
630 | diff --git a/arch/x86/kvm/mmu.h b/arch/x86/kvm/mmu.h | ||
631 | index d55674f44a18..6f2208cf30df 100644 | ||
632 | --- a/arch/x86/kvm/mmu.h | ||
633 | +++ b/arch/x86/kvm/mmu.h | ||
634 | @@ -209,7 +209,7 @@ void kvm_mmu_gfn_disallow_lpage(struct kvm_memory_slot *slot, gfn_t gfn); | ||
635 | void kvm_mmu_gfn_allow_lpage(struct kvm_memory_slot *slot, gfn_t gfn); | ||
636 | bool kvm_mmu_slot_gfn_write_protect(struct kvm *kvm, | ||
637 | struct kvm_memory_slot *slot, u64 gfn); | ||
638 | -int kvm_arch_write_log_dirty(struct kvm_vcpu *vcpu); | ||
639 | +int kvm_arch_write_log_dirty(struct kvm_vcpu *vcpu, gpa_t l2_gpa); | ||
640 | |||
641 | int kvm_mmu_post_init_vm(struct kvm *kvm); | ||
642 | void kvm_mmu_pre_destroy_vm(struct kvm *kvm); | ||
643 | diff --git a/arch/x86/kvm/paging_tmpl.h b/arch/x86/kvm/paging_tmpl.h | ||
644 | index 4e3f137ffa8c..a20fc1ba607f 100644 | ||
645 | --- a/arch/x86/kvm/paging_tmpl.h | ||
646 | +++ b/arch/x86/kvm/paging_tmpl.h | ||
647 | @@ -220,7 +220,7 @@ static inline unsigned FNAME(gpte_access)(u64 gpte) | ||
648 | static int FNAME(update_accessed_dirty_bits)(struct kvm_vcpu *vcpu, | ||
649 | struct kvm_mmu *mmu, | ||
650 | struct guest_walker *walker, | ||
651 | - int write_fault) | ||
652 | + gpa_t addr, int write_fault) | ||
653 | { | ||
654 | unsigned level, index; | ||
655 | pt_element_t pte, orig_pte; | ||
656 | @@ -245,7 +245,7 @@ static int FNAME(update_accessed_dirty_bits)(struct kvm_vcpu *vcpu, | ||
657 | !(pte & PT_GUEST_DIRTY_MASK)) { | ||
658 | trace_kvm_mmu_set_dirty_bit(table_gfn, index, sizeof(pte)); | ||
659 | #if PTTYPE == PTTYPE_EPT | ||
660 | - if (kvm_arch_write_log_dirty(vcpu)) | ||
661 | + if (kvm_arch_write_log_dirty(vcpu, addr)) | ||
662 | return -EINVAL; | ||
663 | #endif | ||
664 | pte |= PT_GUEST_DIRTY_MASK; | ||
665 | @@ -442,7 +442,8 @@ retry_walk: | ||
666 | (PT_GUEST_DIRTY_SHIFT - PT_GUEST_ACCESSED_SHIFT); | ||
667 | |||
668 | if (unlikely(!accessed_dirty)) { | ||
669 | - ret = FNAME(update_accessed_dirty_bits)(vcpu, mmu, walker, write_fault); | ||
670 | + ret = FNAME(update_accessed_dirty_bits)(vcpu, mmu, walker, | ||
671 | + addr, write_fault); | ||
672 | if (unlikely(ret < 0)) | ||
673 | goto error; | ||
674 | else if (ret) | ||
675 | diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c | ||
676 | index 5fac01865a2d..10e6471896cd 100644 | ||
677 | --- a/arch/x86/kvm/vmx/vmx.c | ||
678 | +++ b/arch/x86/kvm/vmx/vmx.c | ||
679 | @@ -6427,23 +6427,6 @@ static void atomic_switch_perf_msrs(struct vcpu_vmx *vmx) | ||
680 | msrs[i].host, false); | ||
681 | } | ||
682 | |||
683 | -static void atomic_switch_umwait_control_msr(struct vcpu_vmx *vmx) | ||
684 | -{ | ||
685 | - u32 host_umwait_control; | ||
686 | - | ||
687 | - if (!vmx_has_waitpkg(vmx)) | ||
688 | - return; | ||
689 | - | ||
690 | - host_umwait_control = get_umwait_control_msr(); | ||
691 | - | ||
692 | - if (vmx->msr_ia32_umwait_control != host_umwait_control) | ||
693 | - add_atomic_switch_msr(vmx, MSR_IA32_UMWAIT_CONTROL, | ||
694 | - vmx->msr_ia32_umwait_control, | ||
695 | - host_umwait_control, false); | ||
696 | - else | ||
697 | - clear_atomic_switch_msr(vmx, MSR_IA32_UMWAIT_CONTROL); | ||
698 | -} | ||
699 | - | ||
700 | static void vmx_update_hv_timer(struct kvm_vcpu *vcpu) | ||
701 | { | ||
702 | struct vcpu_vmx *vmx = to_vmx(vcpu); | ||
703 | @@ -6533,7 +6516,6 @@ static void vmx_vcpu_run(struct kvm_vcpu *vcpu) | ||
704 | pt_guest_enter(vmx); | ||
705 | |||
706 | atomic_switch_perf_msrs(vmx); | ||
707 | - atomic_switch_umwait_control_msr(vmx); | ||
708 | |||
709 | if (enable_preemption_timer) | ||
710 | vmx_update_hv_timer(vcpu); | ||
711 | @@ -7272,11 +7254,11 @@ static void vmx_flush_log_dirty(struct kvm *kvm) | ||
712 | kvm_flush_pml_buffers(kvm); | ||
713 | } | ||
714 | |||
715 | -static int vmx_write_pml_buffer(struct kvm_vcpu *vcpu) | ||
716 | +static int vmx_write_pml_buffer(struct kvm_vcpu *vcpu, gpa_t gpa) | ||
717 | { | ||
718 | struct vmcs12 *vmcs12; | ||
719 | struct vcpu_vmx *vmx = to_vmx(vcpu); | ||
720 | - gpa_t gpa, dst; | ||
721 | + gpa_t dst; | ||
722 | |||
723 | if (is_guest_mode(vcpu)) { | ||
724 | WARN_ON_ONCE(vmx->nested.pml_full); | ||
725 | @@ -7295,7 +7277,7 @@ static int vmx_write_pml_buffer(struct kvm_vcpu *vcpu) | ||
726 | return 1; | ||
727 | } | ||
728 | |||
729 | - gpa = vmcs_read64(GUEST_PHYSICAL_ADDRESS) & ~0xFFFull; | ||
730 | + gpa &= ~0xFFFull; | ||
731 | dst = vmcs12->pml_address + sizeof(u64) * vmcs12->guest_pml_index; | ||
732 | |||
733 | if (kvm_write_guest_page(vcpu->kvm, gpa_to_gfn(dst), &gpa, | ||
734 | diff --git a/arch/x86/kvm/vmx/vmx.h b/arch/x86/kvm/vmx/vmx.h | ||
735 | index 295c5f83842e..a1919ec7fd10 100644 | ||
736 | --- a/arch/x86/kvm/vmx/vmx.h | ||
737 | +++ b/arch/x86/kvm/vmx/vmx.h | ||
738 | @@ -14,8 +14,6 @@ | ||
739 | extern const u32 vmx_msr_index[]; | ||
740 | extern u64 host_efer; | ||
741 | |||
742 | -extern u32 get_umwait_control_msr(void); | ||
743 | - | ||
744 | #define MSR_TYPE_R 1 | ||
745 | #define MSR_TYPE_W 2 | ||
746 | #define MSR_TYPE_RW 3 | ||
747 | diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c | ||
748 | index fff279fb173b..eed1866ae4d3 100644 | ||
749 | --- a/arch/x86/kvm/x86.c | ||
750 | +++ b/arch/x86/kvm/x86.c | ||
751 | @@ -2753,7 +2753,7 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info) | ||
752 | return kvm_mtrr_set_msr(vcpu, msr, data); | ||
753 | case MSR_IA32_APICBASE: | ||
754 | return kvm_set_apic_base(vcpu, msr_info); | ||
755 | - case APIC_BASE_MSR ... APIC_BASE_MSR + 0x3ff: | ||
756 | + case APIC_BASE_MSR ... APIC_BASE_MSR + 0xff: | ||
757 | return kvm_x2apic_msr_write(vcpu, msr, data); | ||
758 | case MSR_IA32_TSCDEADLINE: | ||
759 | kvm_set_lapic_tscdeadline_msr(vcpu, data); | ||
760 | @@ -3057,7 +3057,7 @@ int kvm_get_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info) | ||
761 | case MSR_IA32_APICBASE: | ||
762 | msr_info->data = kvm_get_apic_base(vcpu); | ||
763 | break; | ||
764 | - case APIC_BASE_MSR ... APIC_BASE_MSR + 0x3ff: | ||
765 | + case APIC_BASE_MSR ... APIC_BASE_MSR + 0xff: | ||
766 | return kvm_x2apic_msr_read(vcpu, msr_info->index, &msr_info->data); | ||
767 | break; | ||
768 | case MSR_IA32_TSCDEADLINE: | ||
769 | diff --git a/arch/x86/lib/usercopy_64.c b/arch/x86/lib/usercopy_64.c | ||
770 | index fff28c6f73a2..b0dfac3d3df7 100644 | ||
771 | --- a/arch/x86/lib/usercopy_64.c | ||
772 | +++ b/arch/x86/lib/usercopy_64.c | ||
773 | @@ -24,6 +24,7 @@ unsigned long __clear_user(void __user *addr, unsigned long size) | ||
774 | asm volatile( | ||
775 | " testq %[size8],%[size8]\n" | ||
776 | " jz 4f\n" | ||
777 | + " .align 16\n" | ||
778 | "0: movq $0,(%[dst])\n" | ||
779 | " addq $8,%[dst]\n" | ||
780 | " decl %%ecx ; jnz 0b\n" | ||
781 | diff --git a/block/bio-integrity.c b/block/bio-integrity.c | ||
782 | index bf62c25cde8f..ae07dd78e951 100644 | ||
783 | --- a/block/bio-integrity.c | ||
784 | +++ b/block/bio-integrity.c | ||
785 | @@ -278,7 +278,6 @@ bool bio_integrity_prep(struct bio *bio) | ||
786 | |||
787 | if (ret == 0) { | ||
788 | printk(KERN_ERR "could not attach integrity payload\n"); | ||
789 | - kfree(buf); | ||
790 | status = BLK_STS_RESOURCE; | ||
791 | goto err_end_io; | ||
792 | } | ||
793 | diff --git a/block/blk-mq.c b/block/blk-mq.c | ||
794 | index 0550366e25d8..f1b930a300a3 100644 | ||
795 | --- a/block/blk-mq.c | ||
796 | +++ b/block/blk-mq.c | ||
797 | @@ -3279,7 +3279,9 @@ static void __blk_mq_update_nr_hw_queues(struct blk_mq_tag_set *set, | ||
798 | |||
799 | if (set->nr_maps == 1 && nr_hw_queues > nr_cpu_ids) | ||
800 | nr_hw_queues = nr_cpu_ids; | ||
801 | - if (nr_hw_queues < 1 || nr_hw_queues == set->nr_hw_queues) | ||
802 | + if (nr_hw_queues < 1) | ||
803 | + return; | ||
804 | + if (set->nr_maps == 1 && nr_hw_queues == set->nr_hw_queues) | ||
805 | return; | ||
806 | |||
807 | list_for_each_entry(q, &set->tag_list, tag_set_list) | ||
808 | diff --git a/drivers/acpi/acpi_configfs.c b/drivers/acpi/acpi_configfs.c | ||
809 | index 57d9d574d4dd..01738d8e888e 100644 | ||
810 | --- a/drivers/acpi/acpi_configfs.c | ||
811 | +++ b/drivers/acpi/acpi_configfs.c | ||
812 | @@ -11,6 +11,7 @@ | ||
813 | #include <linux/module.h> | ||
814 | #include <linux/configfs.h> | ||
815 | #include <linux/acpi.h> | ||
816 | +#include <linux/security.h> | ||
817 | |||
818 | #include "acpica/accommon.h" | ||
819 | #include "acpica/actables.h" | ||
820 | @@ -28,7 +29,10 @@ static ssize_t acpi_table_aml_write(struct config_item *cfg, | ||
821 | { | ||
822 | const struct acpi_table_header *header = data; | ||
823 | struct acpi_table *table; | ||
824 | - int ret; | ||
825 | + int ret = security_locked_down(LOCKDOWN_ACPI_TABLES); | ||
826 | + | ||
827 | + if (ret) | ||
828 | + return ret; | ||
829 | |||
830 | table = container_of(cfg, struct acpi_table, cfg); | ||
831 | |||
832 | diff --git a/drivers/acpi/sysfs.c b/drivers/acpi/sysfs.c | ||
833 | index 3a89909b50a6..76c668c05fa0 100644 | ||
834 | --- a/drivers/acpi/sysfs.c | ||
835 | +++ b/drivers/acpi/sysfs.c | ||
836 | @@ -938,13 +938,13 @@ static void __exit interrupt_stats_exit(void) | ||
837 | } | ||
838 | |||
839 | static ssize_t | ||
840 | -acpi_show_profile(struct device *dev, struct device_attribute *attr, | ||
841 | +acpi_show_profile(struct kobject *kobj, struct kobj_attribute *attr, | ||
842 | char *buf) | ||
843 | { | ||
844 | return sprintf(buf, "%d\n", acpi_gbl_FADT.preferred_profile); | ||
845 | } | ||
846 | |||
847 | -static const struct device_attribute pm_profile_attr = | ||
848 | +static const struct kobj_attribute pm_profile_attr = | ||
849 | __ATTR(pm_profile, S_IRUGO, acpi_show_profile, NULL); | ||
850 | |||
851 | static ssize_t hotplug_enabled_show(struct kobject *kobj, | ||
852 | diff --git a/drivers/android/binder.c b/drivers/android/binder.c | ||
853 | index 34a6de65aa7e..5e6586af21b7 100644 | ||
854 | --- a/drivers/android/binder.c | ||
855 | +++ b/drivers/android/binder.c | ||
856 | @@ -4688,8 +4688,15 @@ static struct binder_thread *binder_get_thread(struct binder_proc *proc) | ||
857 | |||
858 | static void binder_free_proc(struct binder_proc *proc) | ||
859 | { | ||
860 | + struct binder_device *device; | ||
861 | + | ||
862 | BUG_ON(!list_empty(&proc->todo)); | ||
863 | BUG_ON(!list_empty(&proc->delivered_death)); | ||
864 | + device = container_of(proc->context, struct binder_device, context); | ||
865 | + if (refcount_dec_and_test(&device->ref)) { | ||
866 | + kfree(proc->context->name); | ||
867 | + kfree(device); | ||
868 | + } | ||
869 | binder_alloc_deferred_release(&proc->alloc); | ||
870 | put_task_struct(proc->tsk); | ||
871 | binder_stats_deleted(BINDER_STAT_PROC); | ||
872 | @@ -5408,7 +5415,6 @@ static int binder_node_release(struct binder_node *node, int refs) | ||
873 | static void binder_deferred_release(struct binder_proc *proc) | ||
874 | { | ||
875 | struct binder_context *context = proc->context; | ||
876 | - struct binder_device *device; | ||
877 | struct rb_node *n; | ||
878 | int threads, nodes, incoming_refs, outgoing_refs, active_transactions; | ||
879 | |||
880 | @@ -5425,12 +5431,6 @@ static void binder_deferred_release(struct binder_proc *proc) | ||
881 | context->binder_context_mgr_node = NULL; | ||
882 | } | ||
883 | mutex_unlock(&context->context_mgr_node_lock); | ||
884 | - device = container_of(proc->context, struct binder_device, context); | ||
885 | - if (refcount_dec_and_test(&device->ref)) { | ||
886 | - kfree(context->name); | ||
887 | - kfree(device); | ||
888 | - } | ||
889 | - proc->context = NULL; | ||
890 | binder_inner_proc_lock(proc); | ||
891 | /* | ||
892 | * Make sure proc stays alive after we | ||
893 | diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c | ||
894 | index 5af34a3201ed..5596c9b6ebf2 100644 | ||
895 | --- a/drivers/ata/libata-scsi.c | ||
896 | +++ b/drivers/ata/libata-scsi.c | ||
897 | @@ -3978,12 +3978,13 @@ static unsigned int ata_scsi_mode_select_xlat(struct ata_queued_cmd *qc) | ||
898 | { | ||
899 | struct scsi_cmnd *scmd = qc->scsicmd; | ||
900 | const u8 *cdb = scmd->cmnd; | ||
901 | - const u8 *p; | ||
902 | u8 pg, spg; | ||
903 | unsigned six_byte, pg_len, hdr_len, bd_len; | ||
904 | int len; | ||
905 | u16 fp = (u16)-1; | ||
906 | u8 bp = 0xff; | ||
907 | + u8 buffer[64]; | ||
908 | + const u8 *p = buffer; | ||
909 | |||
910 | VPRINTK("ENTER\n"); | ||
911 | |||
912 | @@ -4017,12 +4018,14 @@ static unsigned int ata_scsi_mode_select_xlat(struct ata_queued_cmd *qc) | ||
913 | if (!scsi_sg_count(scmd) || scsi_sglist(scmd)->length < len) | ||
914 | goto invalid_param_len; | ||
915 | |||
916 | - p = page_address(sg_page(scsi_sglist(scmd))); | ||
917 | - | ||
918 | /* Move past header and block descriptors. */ | ||
919 | if (len < hdr_len) | ||
920 | goto invalid_param_len; | ||
921 | |||
922 | + if (!sg_copy_to_buffer(scsi_sglist(scmd), scsi_sg_count(scmd), | ||
923 | + buffer, sizeof(buffer))) | ||
924 | + goto invalid_param_len; | ||
925 | + | ||
926 | if (six_byte) | ||
927 | bd_len = p[3]; | ||
928 | else | ||
929 | diff --git a/drivers/ata/sata_rcar.c b/drivers/ata/sata_rcar.c | ||
930 | index 3495e1733a8e..c35b7b993133 100644 | ||
931 | --- a/drivers/ata/sata_rcar.c | ||
932 | +++ b/drivers/ata/sata_rcar.c | ||
933 | @@ -905,7 +905,7 @@ static int sata_rcar_probe(struct platform_device *pdev) | ||
934 | pm_runtime_enable(dev); | ||
935 | ret = pm_runtime_get_sync(dev); | ||
936 | if (ret < 0) | ||
937 | - goto err_pm_disable; | ||
938 | + goto err_pm_put; | ||
939 | |||
940 | host = ata_host_alloc(dev, 1); | ||
941 | if (!host) { | ||
942 | @@ -935,7 +935,6 @@ static int sata_rcar_probe(struct platform_device *pdev) | ||
943 | |||
944 | err_pm_put: | ||
945 | pm_runtime_put(dev); | ||
946 | -err_pm_disable: | ||
947 | pm_runtime_disable(dev); | ||
948 | return ret; | ||
949 | } | ||
950 | @@ -989,8 +988,10 @@ static int sata_rcar_resume(struct device *dev) | ||
951 | int ret; | ||
952 | |||
953 | ret = pm_runtime_get_sync(dev); | ||
954 | - if (ret < 0) | ||
955 | + if (ret < 0) { | ||
956 | + pm_runtime_put(dev); | ||
957 | return ret; | ||
958 | + } | ||
959 | |||
960 | if (priv->type == RCAR_GEN3_SATA) { | ||
961 | sata_rcar_init_module(priv); | ||
962 | @@ -1015,8 +1016,10 @@ static int sata_rcar_restore(struct device *dev) | ||
963 | int ret; | ||
964 | |||
965 | ret = pm_runtime_get_sync(dev); | ||
966 | - if (ret < 0) | ||
967 | + if (ret < 0) { | ||
968 | + pm_runtime_put(dev); | ||
969 | return ret; | ||
970 | + } | ||
971 | |||
972 | sata_rcar_setup_port(host); | ||
973 | |||
974 | diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c | ||
975 | index 59f911e57719..508bbd6ea439 100644 | ||
976 | --- a/drivers/base/regmap/regmap.c | ||
977 | +++ b/drivers/base/regmap/regmap.c | ||
978 | @@ -1356,6 +1356,7 @@ void regmap_exit(struct regmap *map) | ||
979 | if (map->hwlock) | ||
980 | hwspin_lock_free(map->hwlock); | ||
981 | kfree_const(map->name); | ||
982 | + kfree(map->patch); | ||
983 | kfree(map); | ||
984 | } | ||
985 | EXPORT_SYMBOL_GPL(regmap_exit); | ||
986 | diff --git a/drivers/block/loop.c b/drivers/block/loop.c | ||
987 | index 57ed6b70d295..565e35e69f24 100644 | ||
988 | --- a/drivers/block/loop.c | ||
989 | +++ b/drivers/block/loop.c | ||
990 | @@ -1284,7 +1284,7 @@ loop_set_status(struct loop_device *lo, const struct loop_info64 *info) | ||
991 | if (lo->lo_offset != info->lo_offset || | ||
992 | lo->lo_sizelimit != info->lo_sizelimit) { | ||
993 | sync_blockdev(lo->lo_device); | ||
994 | - kill_bdev(lo->lo_device); | ||
995 | + invalidate_bdev(lo->lo_device); | ||
996 | } | ||
997 | |||
998 | /* I/O need to be drained during transfer transition */ | ||
999 | @@ -1558,12 +1558,12 @@ static int loop_set_block_size(struct loop_device *lo, unsigned long arg) | ||
1000 | |||
1001 | if (lo->lo_queue->limits.logical_block_size != arg) { | ||
1002 | sync_blockdev(lo->lo_device); | ||
1003 | - kill_bdev(lo->lo_device); | ||
1004 | + invalidate_bdev(lo->lo_device); | ||
1005 | } | ||
1006 | |||
1007 | blk_mq_freeze_queue(lo->lo_queue); | ||
1008 | |||
1009 | - /* kill_bdev should have truncated all the pages */ | ||
1010 | + /* invalidate_bdev should have truncated all the pages */ | ||
1011 | if (lo->lo_queue->limits.logical_block_size != arg && | ||
1012 | lo->lo_device->bd_inode->i_mapping->nrpages) { | ||
1013 | err = -EAGAIN; | ||
1014 | diff --git a/drivers/bus/ti-sysc.c b/drivers/bus/ti-sysc.c | ||
1015 | index f0bc0841cbc4..553c0e279621 100644 | ||
1016 | --- a/drivers/bus/ti-sysc.c | ||
1017 | +++ b/drivers/bus/ti-sysc.c | ||
1018 | @@ -880,10 +880,13 @@ static int sysc_enable_module(struct device *dev) | ||
1019 | regbits = ddata->cap->regbits; | ||
1020 | reg = sysc_read(ddata, ddata->offsets[SYSC_SYSCONFIG]); | ||
1021 | |||
1022 | - /* Set CLOCKACTIVITY, we only use it for ick */ | ||
1023 | + /* | ||
1024 | + * Set CLOCKACTIVITY, we only use it for ick. And we only configure it | ||
1025 | + * based on the SYSC_QUIRK_USE_CLOCKACT flag, not based on the hardware | ||
1026 | + * capabilities. See the old HWMOD_SET_DEFAULT_CLOCKACT flag. | ||
1027 | + */ | ||
1028 | if (regbits->clkact_shift >= 0 && | ||
1029 | - (ddata->cfg.quirks & SYSC_QUIRK_USE_CLOCKACT || | ||
1030 | - ddata->cfg.sysc_val & BIT(regbits->clkact_shift))) | ||
1031 | + (ddata->cfg.quirks & SYSC_QUIRK_USE_CLOCKACT)) | ||
1032 | reg |= SYSC_CLOCACT_ICK << regbits->clkact_shift; | ||
1033 | |||
1034 | /* Set SIDLE mode */ | ||
1035 | @@ -938,6 +941,9 @@ set_autoidle: | ||
1036 | sysc_write(ddata, ddata->offsets[SYSC_SYSCONFIG], reg); | ||
1037 | } | ||
1038 | |||
1039 | + /* Flush posted write */ | ||
1040 | + sysc_read(ddata, ddata->offsets[SYSC_SYSCONFIG]); | ||
1041 | + | ||
1042 | if (ddata->module_enable_quirk) | ||
1043 | ddata->module_enable_quirk(ddata); | ||
1044 | |||
1045 | @@ -1018,6 +1024,9 @@ set_sidle: | ||
1046 | reg |= 1 << regbits->autoidle_shift; | ||
1047 | sysc_write(ddata, ddata->offsets[SYSC_SYSCONFIG], reg); | ||
1048 | |||
1049 | + /* Flush posted write */ | ||
1050 | + sysc_read(ddata, ddata->offsets[SYSC_SYSCONFIG]); | ||
1051 | + | ||
1052 | return 0; | ||
1053 | } | ||
1054 | |||
1055 | diff --git a/drivers/char/hw_random/ks-sa-rng.c b/drivers/char/hw_random/ks-sa-rng.c | ||
1056 | index a67430010aa6..5c7d3dfcfdd0 100644 | ||
1057 | --- a/drivers/char/hw_random/ks-sa-rng.c | ||
1058 | +++ b/drivers/char/hw_random/ks-sa-rng.c | ||
1059 | @@ -208,6 +208,7 @@ static int ks_sa_rng_probe(struct platform_device *pdev) | ||
1060 | ret = pm_runtime_get_sync(dev); | ||
1061 | if (ret < 0) { | ||
1062 | dev_err(dev, "Failed to enable SA power-domain\n"); | ||
1063 | + pm_runtime_put_noidle(dev); | ||
1064 | pm_runtime_disable(dev); | ||
1065 | return ret; | ||
1066 | } | ||
1067 | diff --git a/drivers/clk/sifive/fu540-prci.c b/drivers/clk/sifive/fu540-prci.c | ||
1068 | index 6282ee2f361c..a8901f90a61a 100644 | ||
1069 | --- a/drivers/clk/sifive/fu540-prci.c | ||
1070 | +++ b/drivers/clk/sifive/fu540-prci.c | ||
1071 | @@ -586,7 +586,10 @@ static int sifive_fu540_prci_probe(struct platform_device *pdev) | ||
1072 | struct __prci_data *pd; | ||
1073 | int r; | ||
1074 | |||
1075 | - pd = devm_kzalloc(dev, sizeof(*pd), GFP_KERNEL); | ||
1076 | + pd = devm_kzalloc(dev, | ||
1077 | + struct_size(pd, hw_clks.hws, | ||
1078 | + ARRAY_SIZE(__prci_init_clocks)), | ||
1079 | + GFP_KERNEL); | ||
1080 | if (!pd) | ||
1081 | return -ENOMEM; | ||
1082 | |||
1083 | diff --git a/drivers/firmware/efi/esrt.c b/drivers/firmware/efi/esrt.c | ||
1084 | index d6dd5f503fa2..e8f71a50ba89 100644 | ||
1085 | --- a/drivers/firmware/efi/esrt.c | ||
1086 | +++ b/drivers/firmware/efi/esrt.c | ||
1087 | @@ -181,7 +181,7 @@ static int esre_create_sysfs_entry(void *esre, int entry_num) | ||
1088 | rc = kobject_init_and_add(&entry->kobj, &esre1_ktype, NULL, | ||
1089 | "entry%d", entry_num); | ||
1090 | if (rc) { | ||
1091 | - kfree(entry); | ||
1092 | + kobject_put(&entry->kobj); | ||
1093 | return rc; | ||
1094 | } | ||
1095 | } | ||
1096 | diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c | ||
1097 | index bd715012185c..23fc16dc92b4 100644 | ||
1098 | --- a/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c | ||
1099 | +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c | ||
1100 | @@ -1273,8 +1273,12 @@ static int sdma_v5_0_sw_fini(void *handle) | ||
1101 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; | ||
1102 | int i; | ||
1103 | |||
1104 | - for (i = 0; i < adev->sdma.num_instances; i++) | ||
1105 | + for (i = 0; i < adev->sdma.num_instances; i++) { | ||
1106 | + if (adev->sdma.instance[i].fw != NULL) | ||
1107 | + release_firmware(adev->sdma.instance[i].fw); | ||
1108 | + | ||
1109 | amdgpu_ring_fini(&adev->sdma.instance[i].ring); | ||
1110 | + } | ||
1111 | |||
1112 | return 0; | ||
1113 | } | ||
1114 | diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_process.c b/drivers/gpu/drm/amd/amdkfd/kfd_process.c | ||
1115 | index 40e3fc0c6942..aa0a617b8d44 100644 | ||
1116 | --- a/drivers/gpu/drm/amd/amdkfd/kfd_process.c | ||
1117 | +++ b/drivers/gpu/drm/amd/amdkfd/kfd_process.c | ||
1118 | @@ -312,6 +312,7 @@ struct kfd_process *kfd_create_process(struct file *filep) | ||
1119 | (int)process->lead_thread->pid); | ||
1120 | if (ret) { | ||
1121 | pr_warn("Creating procfs pid directory failed"); | ||
1122 | + kobject_put(process->kobj); | ||
1123 | goto out; | ||
1124 | } | ||
1125 | |||
1126 | diff --git a/drivers/gpu/drm/amd/display/modules/color/color_gamma.c b/drivers/gpu/drm/amd/display/modules/color/color_gamma.c | ||
1127 | index 207435fa4f2c..51d07a4561ce 100644 | ||
1128 | --- a/drivers/gpu/drm/amd/display/modules/color/color_gamma.c | ||
1129 | +++ b/drivers/gpu/drm/amd/display/modules/color/color_gamma.c | ||
1130 | @@ -1862,7 +1862,7 @@ bool calculate_user_regamma_ramp(struct dc_transfer_func *output_tf, | ||
1131 | |||
1132 | kfree(rgb_regamma); | ||
1133 | rgb_regamma_alloc_fail: | ||
1134 | - kvfree(rgb_user); | ||
1135 | + kfree(rgb_user); | ||
1136 | rgb_user_alloc_fail: | ||
1137 | return ret; | ||
1138 | } | ||
1139 | diff --git a/drivers/gpu/drm/radeon/ni_dpm.c b/drivers/gpu/drm/radeon/ni_dpm.c | ||
1140 | index d9e62ca65ab8..bd2e577c701f 100644 | ||
1141 | --- a/drivers/gpu/drm/radeon/ni_dpm.c | ||
1142 | +++ b/drivers/gpu/drm/radeon/ni_dpm.c | ||
1143 | @@ -2128,7 +2128,7 @@ static int ni_init_smc_spll_table(struct radeon_device *rdev) | ||
1144 | if (clk_s & ~(SMC_NISLANDS_SPLL_DIV_TABLE_CLKS_MASK >> SMC_NISLANDS_SPLL_DIV_TABLE_CLKS_SHIFT)) | ||
1145 | ret = -EINVAL; | ||
1146 | |||
1147 | - if (clk_s & ~(SMC_NISLANDS_SPLL_DIV_TABLE_CLKS_MASK >> SMC_NISLANDS_SPLL_DIV_TABLE_CLKS_SHIFT)) | ||
1148 | + if (fb_div & ~(SMC_NISLANDS_SPLL_DIV_TABLE_FBDIV_MASK >> SMC_NISLANDS_SPLL_DIV_TABLE_FBDIV_SHIFT)) | ||
1149 | ret = -EINVAL; | ||
1150 | |||
1151 | if (clk_v & ~(SMC_NISLANDS_SPLL_DIV_TABLE_CLKV_MASK >> SMC_NISLANDS_SPLL_DIV_TABLE_CLKV_SHIFT)) | ||
1152 | diff --git a/drivers/gpu/drm/rcar-du/Kconfig b/drivers/gpu/drm/rcar-du/Kconfig | ||
1153 | index 1529849e217e..7cdba77b1420 100644 | ||
1154 | --- a/drivers/gpu/drm/rcar-du/Kconfig | ||
1155 | +++ b/drivers/gpu/drm/rcar-du/Kconfig | ||
1156 | @@ -23,6 +23,7 @@ config DRM_RCAR_DW_HDMI | ||
1157 | config DRM_RCAR_LVDS | ||
1158 | tristate "R-Car DU LVDS Encoder Support" | ||
1159 | depends on DRM && DRM_BRIDGE && OF | ||
1160 | + select DRM_KMS_HELPER | ||
1161 | select DRM_PANEL | ||
1162 | select OF_FLATTREE | ||
1163 | select OF_OVERLAY | ||
1164 | diff --git a/drivers/i2c/busses/i2c-fsi.c b/drivers/i2c/busses/i2c-fsi.c | ||
1165 | index e0c256922d4f..977d6f524649 100644 | ||
1166 | --- a/drivers/i2c/busses/i2c-fsi.c | ||
1167 | +++ b/drivers/i2c/busses/i2c-fsi.c | ||
1168 | @@ -98,7 +98,7 @@ | ||
1169 | #define I2C_STAT_DAT_REQ BIT(25) | ||
1170 | #define I2C_STAT_CMD_COMP BIT(24) | ||
1171 | #define I2C_STAT_STOP_ERR BIT(23) | ||
1172 | -#define I2C_STAT_MAX_PORT GENMASK(19, 16) | ||
1173 | +#define I2C_STAT_MAX_PORT GENMASK(22, 16) | ||
1174 | #define I2C_STAT_ANY_INT BIT(15) | ||
1175 | #define I2C_STAT_SCL_IN BIT(11) | ||
1176 | #define I2C_STAT_SDA_IN BIT(10) | ||
1177 | diff --git a/drivers/i2c/busses/i2c-tegra.c b/drivers/i2c/busses/i2c-tegra.c | ||
1178 | index dbc43cfec19d..331f7cca9bab 100644 | ||
1179 | --- a/drivers/i2c/busses/i2c-tegra.c | ||
1180 | +++ b/drivers/i2c/busses/i2c-tegra.c | ||
1181 | @@ -1719,14 +1719,9 @@ static int tegra_i2c_remove(struct platform_device *pdev) | ||
1182 | static int __maybe_unused tegra_i2c_suspend(struct device *dev) | ||
1183 | { | ||
1184 | struct tegra_i2c_dev *i2c_dev = dev_get_drvdata(dev); | ||
1185 | - int err; | ||
1186 | |||
1187 | i2c_mark_adapter_suspended(&i2c_dev->adapter); | ||
1188 | |||
1189 | - err = pm_runtime_force_suspend(dev); | ||
1190 | - if (err < 0) | ||
1191 | - return err; | ||
1192 | - | ||
1193 | return 0; | ||
1194 | } | ||
1195 | |||
1196 | @@ -1747,10 +1742,6 @@ static int __maybe_unused tegra_i2c_resume(struct device *dev) | ||
1197 | if (err) | ||
1198 | return err; | ||
1199 | |||
1200 | - err = pm_runtime_force_resume(dev); | ||
1201 | - if (err < 0) | ||
1202 | - return err; | ||
1203 | - | ||
1204 | i2c_mark_adapter_resumed(&i2c_dev->adapter); | ||
1205 | |||
1206 | return 0; | ||
1207 | diff --git a/drivers/i2c/i2c-core-smbus.c b/drivers/i2c/i2c-core-smbus.c | ||
1208 | index 3ac426a8ab5a..c2ae8c8cd429 100644 | ||
1209 | --- a/drivers/i2c/i2c-core-smbus.c | ||
1210 | +++ b/drivers/i2c/i2c-core-smbus.c | ||
1211 | @@ -495,6 +495,13 @@ static s32 i2c_smbus_xfer_emulated(struct i2c_adapter *adapter, u16 addr, | ||
1212 | break; | ||
1213 | case I2C_SMBUS_BLOCK_DATA: | ||
1214 | case I2C_SMBUS_BLOCK_PROC_CALL: | ||
1215 | + if (msg[1].buf[0] > I2C_SMBUS_BLOCK_MAX) { | ||
1216 | + dev_err(&adapter->dev, | ||
1217 | + "Invalid block size returned: %d\n", | ||
1218 | + msg[1].buf[0]); | ||
1219 | + status = -EPROTO; | ||
1220 | + goto cleanup; | ||
1221 | + } | ||
1222 | for (i = 0; i < msg[1].buf[0] + 1; i++) | ||
1223 | data->block[i] = msg[1].buf[i]; | ||
1224 | break; | ||
1225 | diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c | ||
1226 | index 8f776b7de45e..e3cd9d2b0dd2 100644 | ||
1227 | --- a/drivers/infiniband/core/cma.c | ||
1228 | +++ b/drivers/infiniband/core/cma.c | ||
1229 | @@ -1631,6 +1631,8 @@ static struct rdma_id_private *cma_find_listener( | ||
1230 | { | ||
1231 | struct rdma_id_private *id_priv, *id_priv_dev; | ||
1232 | |||
1233 | + lockdep_assert_held(&lock); | ||
1234 | + | ||
1235 | if (!bind_list) | ||
1236 | return ERR_PTR(-EINVAL); | ||
1237 | |||
1238 | @@ -1677,6 +1679,7 @@ cma_ib_id_from_event(struct ib_cm_id *cm_id, | ||
1239 | } | ||
1240 | } | ||
1241 | |||
1242 | + mutex_lock(&lock); | ||
1243 | /* | ||
1244 | * Net namespace might be getting deleted while route lookup, | ||
1245 | * cm_id lookup is in progress. Therefore, perform netdevice | ||
1246 | @@ -1718,6 +1721,7 @@ cma_ib_id_from_event(struct ib_cm_id *cm_id, | ||
1247 | id_priv = cma_find_listener(bind_list, cm_id, ib_event, req, *net_dev); | ||
1248 | err: | ||
1249 | rcu_read_unlock(); | ||
1250 | + mutex_unlock(&lock); | ||
1251 | if (IS_ERR(id_priv) && *net_dev) { | ||
1252 | dev_put(*net_dev); | ||
1253 | *net_dev = NULL; | ||
1254 | @@ -2473,6 +2477,8 @@ static void cma_listen_on_dev(struct rdma_id_private *id_priv, | ||
1255 | struct net *net = id_priv->id.route.addr.dev_addr.net; | ||
1256 | int ret; | ||
1257 | |||
1258 | + lockdep_assert_held(&lock); | ||
1259 | + | ||
1260 | if (cma_family(id_priv) == AF_IB && !rdma_cap_ib_cm(cma_dev->device, 1)) | ||
1261 | return; | ||
1262 | |||
1263 | @@ -3245,6 +3251,8 @@ static void cma_bind_port(struct rdma_bind_list *bind_list, | ||
1264 | u64 sid, mask; | ||
1265 | __be16 port; | ||
1266 | |||
1267 | + lockdep_assert_held(&lock); | ||
1268 | + | ||
1269 | addr = cma_src_addr(id_priv); | ||
1270 | port = htons(bind_list->port); | ||
1271 | |||
1272 | @@ -3273,6 +3281,8 @@ static int cma_alloc_port(enum rdma_ucm_port_space ps, | ||
1273 | struct rdma_bind_list *bind_list; | ||
1274 | int ret; | ||
1275 | |||
1276 | + lockdep_assert_held(&lock); | ||
1277 | + | ||
1278 | bind_list = kzalloc(sizeof *bind_list, GFP_KERNEL); | ||
1279 | if (!bind_list) | ||
1280 | return -ENOMEM; | ||
1281 | @@ -3299,6 +3309,8 @@ static int cma_port_is_unique(struct rdma_bind_list *bind_list, | ||
1282 | struct sockaddr *saddr = cma_src_addr(id_priv); | ||
1283 | __be16 dport = cma_port(daddr); | ||
1284 | |||
1285 | + lockdep_assert_held(&lock); | ||
1286 | + | ||
1287 | hlist_for_each_entry(cur_id, &bind_list->owners, node) { | ||
1288 | struct sockaddr *cur_daddr = cma_dst_addr(cur_id); | ||
1289 | struct sockaddr *cur_saddr = cma_src_addr(cur_id); | ||
1290 | @@ -3338,6 +3350,8 @@ static int cma_alloc_any_port(enum rdma_ucm_port_space ps, | ||
1291 | unsigned int rover; | ||
1292 | struct net *net = id_priv->id.route.addr.dev_addr.net; | ||
1293 | |||
1294 | + lockdep_assert_held(&lock); | ||
1295 | + | ||
1296 | inet_get_local_port_range(net, &low, &high); | ||
1297 | remaining = (high - low) + 1; | ||
1298 | rover = prandom_u32() % remaining + low; | ||
1299 | @@ -3385,6 +3399,8 @@ static int cma_check_port(struct rdma_bind_list *bind_list, | ||
1300 | struct rdma_id_private *cur_id; | ||
1301 | struct sockaddr *addr, *cur_addr; | ||
1302 | |||
1303 | + lockdep_assert_held(&lock); | ||
1304 | + | ||
1305 | addr = cma_src_addr(id_priv); | ||
1306 | hlist_for_each_entry(cur_id, &bind_list->owners, node) { | ||
1307 | if (id_priv == cur_id) | ||
1308 | @@ -3415,6 +3431,8 @@ static int cma_use_port(enum rdma_ucm_port_space ps, | ||
1309 | unsigned short snum; | ||
1310 | int ret; | ||
1311 | |||
1312 | + lockdep_assert_held(&lock); | ||
1313 | + | ||
1314 | snum = ntohs(cma_port(cma_src_addr(id_priv))); | ||
1315 | if (snum < PROT_SOCK && !capable(CAP_NET_BIND_SERVICE)) | ||
1316 | return -EACCES; | ||
1317 | diff --git a/drivers/infiniband/core/mad.c b/drivers/infiniband/core/mad.c | ||
1318 | index 9947d16edef2..2284930b5f91 100644 | ||
1319 | --- a/drivers/infiniband/core/mad.c | ||
1320 | +++ b/drivers/infiniband/core/mad.c | ||
1321 | @@ -639,10 +639,10 @@ static void unregister_mad_agent(struct ib_mad_agent_private *mad_agent_priv) | ||
1322 | xa_erase(&ib_mad_clients, mad_agent_priv->agent.hi_tid); | ||
1323 | |||
1324 | flush_workqueue(port_priv->wq); | ||
1325 | - ib_cancel_rmpp_recvs(mad_agent_priv); | ||
1326 | |||
1327 | deref_mad_agent(mad_agent_priv); | ||
1328 | wait_for_completion(&mad_agent_priv->comp); | ||
1329 | + ib_cancel_rmpp_recvs(mad_agent_priv); | ||
1330 | |||
1331 | ib_mad_agent_security_cleanup(&mad_agent_priv->agent); | ||
1332 | |||
1333 | @@ -2960,6 +2960,7 @@ static int ib_mad_post_receive_mads(struct ib_mad_qp_info *qp_info, | ||
1334 | DMA_FROM_DEVICE); | ||
1335 | if (unlikely(ib_dma_mapping_error(qp_info->port_priv->device, | ||
1336 | sg_list.addr))) { | ||
1337 | + kfree(mad_priv); | ||
1338 | ret = -ENOMEM; | ||
1339 | break; | ||
1340 | } | ||
1341 | diff --git a/drivers/infiniband/hw/hfi1/debugfs.c b/drivers/infiniband/hw/hfi1/debugfs.c | ||
1342 | index d268bf9c42ee..c29da2f4e339 100644 | ||
1343 | --- a/drivers/infiniband/hw/hfi1/debugfs.c | ||
1344 | +++ b/drivers/infiniband/hw/hfi1/debugfs.c | ||
1345 | @@ -985,15 +985,10 @@ static ssize_t qsfp2_debugfs_read(struct file *file, char __user *buf, | ||
1346 | static int __i2c_debugfs_open(struct inode *in, struct file *fp, u32 target) | ||
1347 | { | ||
1348 | struct hfi1_pportdata *ppd; | ||
1349 | - int ret; | ||
1350 | |||
1351 | ppd = private2ppd(fp); | ||
1352 | |||
1353 | - ret = acquire_chip_resource(ppd->dd, i2c_target(target), 0); | ||
1354 | - if (ret) /* failed - release the module */ | ||
1355 | - module_put(THIS_MODULE); | ||
1356 | - | ||
1357 | - return ret; | ||
1358 | + return acquire_chip_resource(ppd->dd, i2c_target(target), 0); | ||
1359 | } | ||
1360 | |||
1361 | static int i2c1_debugfs_open(struct inode *in, struct file *fp) | ||
1362 | @@ -1013,7 +1008,6 @@ static int __i2c_debugfs_release(struct inode *in, struct file *fp, u32 target) | ||
1363 | ppd = private2ppd(fp); | ||
1364 | |||
1365 | release_chip_resource(ppd->dd, i2c_target(target)); | ||
1366 | - module_put(THIS_MODULE); | ||
1367 | |||
1368 | return 0; | ||
1369 | } | ||
1370 | @@ -1031,18 +1025,10 @@ static int i2c2_debugfs_release(struct inode *in, struct file *fp) | ||
1371 | static int __qsfp_debugfs_open(struct inode *in, struct file *fp, u32 target) | ||
1372 | { | ||
1373 | struct hfi1_pportdata *ppd; | ||
1374 | - int ret; | ||
1375 | - | ||
1376 | - if (!try_module_get(THIS_MODULE)) | ||
1377 | - return -ENODEV; | ||
1378 | |||
1379 | ppd = private2ppd(fp); | ||
1380 | |||
1381 | - ret = acquire_chip_resource(ppd->dd, i2c_target(target), 0); | ||
1382 | - if (ret) /* failed - release the module */ | ||
1383 | - module_put(THIS_MODULE); | ||
1384 | - | ||
1385 | - return ret; | ||
1386 | + return acquire_chip_resource(ppd->dd, i2c_target(target), 0); | ||
1387 | } | ||
1388 | |||
1389 | static int qsfp1_debugfs_open(struct inode *in, struct file *fp) | ||
1390 | @@ -1062,7 +1048,6 @@ static int __qsfp_debugfs_release(struct inode *in, struct file *fp, u32 target) | ||
1391 | ppd = private2ppd(fp); | ||
1392 | |||
1393 | release_chip_resource(ppd->dd, i2c_target(target)); | ||
1394 | - module_put(THIS_MODULE); | ||
1395 | |||
1396 | return 0; | ||
1397 | } | ||
1398 | diff --git a/drivers/infiniband/hw/qedr/qedr_iw_cm.c b/drivers/infiniband/hw/qedr/qedr_iw_cm.c | ||
1399 | index 5e9732990be5..a7a926b7b562 100644 | ||
1400 | --- a/drivers/infiniband/hw/qedr/qedr_iw_cm.c | ||
1401 | +++ b/drivers/infiniband/hw/qedr/qedr_iw_cm.c | ||
1402 | @@ -150,8 +150,17 @@ qedr_iw_issue_event(void *context, | ||
1403 | if (params->cm_info) { | ||
1404 | event.ird = params->cm_info->ird; | ||
1405 | event.ord = params->cm_info->ord; | ||
1406 | - event.private_data_len = params->cm_info->private_data_len; | ||
1407 | - event.private_data = (void *)params->cm_info->private_data; | ||
1408 | + /* Only connect_request and reply have valid private data | ||
1409 | + * the rest of the events this may be left overs from | ||
1410 | + * connection establishment. CONNECT_REQUEST is issued via | ||
1411 | + * qedr_iw_mpa_request | ||
1412 | + */ | ||
1413 | + if (event_type == IW_CM_EVENT_CONNECT_REPLY) { | ||
1414 | + event.private_data_len = | ||
1415 | + params->cm_info->private_data_len; | ||
1416 | + event.private_data = | ||
1417 | + (void *)params->cm_info->private_data; | ||
1418 | + } | ||
1419 | } | ||
1420 | |||
1421 | if (ep->cm_id) | ||
1422 | diff --git a/drivers/infiniband/sw/rdmavt/qp.c b/drivers/infiniband/sw/rdmavt/qp.c | ||
1423 | index d35465389357..19556c62c7ea 100644 | ||
1424 | --- a/drivers/infiniband/sw/rdmavt/qp.c | ||
1425 | +++ b/drivers/infiniband/sw/rdmavt/qp.c | ||
1426 | @@ -1196,7 +1196,7 @@ struct ib_qp *rvt_create_qp(struct ib_pd *ibpd, | ||
1427 | err = alloc_ud_wq_attr(qp, rdi->dparms.node); | ||
1428 | if (err) { | ||
1429 | ret = (ERR_PTR(err)); | ||
1430 | - goto bail_driver_priv; | ||
1431 | + goto bail_rq_rvt; | ||
1432 | } | ||
1433 | |||
1434 | err = alloc_qpn(rdi, &rdi->qp_dev->qpn_table, | ||
1435 | @@ -1300,9 +1300,11 @@ bail_qpn: | ||
1436 | rvt_free_qpn(&rdi->qp_dev->qpn_table, qp->ibqp.qp_num); | ||
1437 | |||
1438 | bail_rq_wq: | ||
1439 | - rvt_free_rq(&qp->r_rq); | ||
1440 | free_ud_wq_attr(qp); | ||
1441 | |||
1442 | +bail_rq_rvt: | ||
1443 | + rvt_free_rq(&qp->r_rq); | ||
1444 | + | ||
1445 | bail_driver_priv: | ||
1446 | rdi->driver_f.qp_priv_free(rdi, qp); | ||
1447 | |||
1448 | diff --git a/drivers/infiniband/sw/siw/siw_qp_rx.c b/drivers/infiniband/sw/siw/siw_qp_rx.c | ||
1449 | index c0a887240325..0520e70084f9 100644 | ||
1450 | --- a/drivers/infiniband/sw/siw/siw_qp_rx.c | ||
1451 | +++ b/drivers/infiniband/sw/siw/siw_qp_rx.c | ||
1452 | @@ -139,7 +139,8 @@ static int siw_rx_pbl(struct siw_rx_stream *srx, int *pbl_idx, | ||
1453 | break; | ||
1454 | |||
1455 | bytes = min(bytes, len); | ||
1456 | - if (siw_rx_kva(srx, (void *)buf_addr, bytes) == bytes) { | ||
1457 | + if (siw_rx_kva(srx, (void *)(uintptr_t)buf_addr, bytes) == | ||
1458 | + bytes) { | ||
1459 | copied += bytes; | ||
1460 | offset += bytes; | ||
1461 | len -= bytes; | ||
1462 | diff --git a/drivers/iommu/dmar.c b/drivers/iommu/dmar.c | ||
1463 | index 9e393b9c5091..30ac0ba55864 100644 | ||
1464 | --- a/drivers/iommu/dmar.c | ||
1465 | +++ b/drivers/iommu/dmar.c | ||
1466 | @@ -898,7 +898,8 @@ int __init detect_intel_iommu(void) | ||
1467 | if (!ret) | ||
1468 | ret = dmar_walk_dmar_table((struct acpi_table_dmar *)dmar_tbl, | ||
1469 | &validate_drhd_cb); | ||
1470 | - if (!ret && !no_iommu && !iommu_detected && !dmar_disabled) { | ||
1471 | + if (!ret && !no_iommu && !iommu_detected && | ||
1472 | + (!dmar_disabled || dmar_platform_optin())) { | ||
1473 | iommu_detected = 1; | ||
1474 | /* Make sure ACS will be enabled */ | ||
1475 | pci_request_acs(); | ||
1476 | diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c | ||
1477 | index 773ac2b0d606..6366b5fbb3a4 100644 | ||
1478 | --- a/drivers/iommu/intel-iommu.c | ||
1479 | +++ b/drivers/iommu/intel-iommu.c | ||
1480 | @@ -611,6 +611,12 @@ struct intel_iommu *domain_get_iommu(struct dmar_domain *domain) | ||
1481 | return g_iommus[iommu_id]; | ||
1482 | } | ||
1483 | |||
1484 | +static inline bool iommu_paging_structure_coherency(struct intel_iommu *iommu) | ||
1485 | +{ | ||
1486 | + return sm_supported(iommu) ? | ||
1487 | + ecap_smpwc(iommu->ecap) : ecap_coherent(iommu->ecap); | ||
1488 | +} | ||
1489 | + | ||
1490 | static void domain_update_iommu_coherency(struct dmar_domain *domain) | ||
1491 | { | ||
1492 | struct dmar_drhd_unit *drhd; | ||
1493 | @@ -622,7 +628,7 @@ static void domain_update_iommu_coherency(struct dmar_domain *domain) | ||
1494 | |||
1495 | for_each_domain_iommu(i, domain) { | ||
1496 | found = true; | ||
1497 | - if (!ecap_coherent(g_iommus[i]->ecap)) { | ||
1498 | + if (!iommu_paging_structure_coherency(g_iommus[i])) { | ||
1499 | domain->iommu_coherency = 0; | ||
1500 | break; | ||
1501 | } | ||
1502 | @@ -633,7 +639,7 @@ static void domain_update_iommu_coherency(struct dmar_domain *domain) | ||
1503 | /* No hardware attached; use lowest common denominator */ | ||
1504 | rcu_read_lock(); | ||
1505 | for_each_active_iommu(iommu, drhd) { | ||
1506 | - if (!ecap_coherent(iommu->ecap)) { | ||
1507 | + if (!iommu_paging_structure_coherency(iommu)) { | ||
1508 | domain->iommu_coherency = 0; | ||
1509 | break; | ||
1510 | } | ||
1511 | @@ -2090,7 +2096,8 @@ static int domain_context_mapping_one(struct dmar_domain *domain, | ||
1512 | |||
1513 | context_set_fault_enable(context); | ||
1514 | context_set_present(context); | ||
1515 | - domain_flush_cache(domain, context, sizeof(*context)); | ||
1516 | + if (!ecap_coherent(iommu->ecap)) | ||
1517 | + clflush_cache_range(context, sizeof(*context)); | ||
1518 | |||
1519 | /* | ||
1520 | * It's a non-present to present mapping. If hardware doesn't cache | ||
1521 | diff --git a/drivers/md/dm-writecache.c b/drivers/md/dm-writecache.c | ||
1522 | index 0d6ca723257f..67eb4e972cc3 100644 | ||
1523 | --- a/drivers/md/dm-writecache.c | ||
1524 | +++ b/drivers/md/dm-writecache.c | ||
1525 | @@ -279,6 +279,8 @@ static int persistent_memory_claim(struct dm_writecache *wc) | ||
1526 | while (daa-- && i < p) { | ||
1527 | pages[i++] = pfn_t_to_page(pfn); | ||
1528 | pfn.val++; | ||
1529 | + if (!(i & 15)) | ||
1530 | + cond_resched(); | ||
1531 | } | ||
1532 | } while (i < p); | ||
1533 | wc->memory_map = vmap(pages, p, VM_MAP, PAGE_KERNEL); | ||
1534 | @@ -805,6 +807,8 @@ static void writecache_discard(struct dm_writecache *wc, sector_t start, sector_ | ||
1535 | writecache_wait_for_ios(wc, WRITE); | ||
1536 | discarded_something = true; | ||
1537 | } | ||
1538 | + if (!writecache_entry_is_committed(wc, e)) | ||
1539 | + wc->uncommitted_blocks--; | ||
1540 | writecache_free_entry(wc, e); | ||
1541 | } | ||
1542 | |||
1543 | diff --git a/drivers/net/ethernet/atheros/alx/main.c b/drivers/net/ethernet/atheros/alx/main.c | ||
1544 | index d4bbcdfd691a..aa693c8e285a 100644 | ||
1545 | --- a/drivers/net/ethernet/atheros/alx/main.c | ||
1546 | +++ b/drivers/net/ethernet/atheros/alx/main.c | ||
1547 | @@ -1249,8 +1249,12 @@ out_disable_adv_intr: | ||
1548 | |||
1549 | static void __alx_stop(struct alx_priv *alx) | ||
1550 | { | ||
1551 | - alx_halt(alx); | ||
1552 | alx_free_irq(alx); | ||
1553 | + | ||
1554 | + cancel_work_sync(&alx->link_check_wk); | ||
1555 | + cancel_work_sync(&alx->reset_wk); | ||
1556 | + | ||
1557 | + alx_halt(alx); | ||
1558 | alx_free_rings(alx); | ||
1559 | alx_free_napis(alx); | ||
1560 | } | ||
1561 | @@ -1858,9 +1862,6 @@ static void alx_remove(struct pci_dev *pdev) | ||
1562 | struct alx_priv *alx = pci_get_drvdata(pdev); | ||
1563 | struct alx_hw *hw = &alx->hw; | ||
1564 | |||
1565 | - cancel_work_sync(&alx->link_check_wk); | ||
1566 | - cancel_work_sync(&alx->reset_wk); | ||
1567 | - | ||
1568 | /* restore permanent mac address */ | ||
1569 | alx_set_macaddr(hw, hw->perm_addr); | ||
1570 | |||
1571 | diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c | ||
1572 | index 3d3b1005d076..03f82786c0b9 100644 | ||
1573 | --- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c | ||
1574 | +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c | ||
1575 | @@ -1591,11 +1591,6 @@ static netdev_tx_t bcmgenet_xmit(struct sk_buff *skb, struct net_device *dev) | ||
1576 | goto out; | ||
1577 | } | ||
1578 | |||
1579 | - if (skb_padto(skb, ETH_ZLEN)) { | ||
1580 | - ret = NETDEV_TX_OK; | ||
1581 | - goto out; | ||
1582 | - } | ||
1583 | - | ||
1584 | /* Retain how many bytes will be sent on the wire, without TSB inserted | ||
1585 | * by transmit checksum offload | ||
1586 | */ | ||
1587 | @@ -1644,6 +1639,9 @@ static netdev_tx_t bcmgenet_xmit(struct sk_buff *skb, struct net_device *dev) | ||
1588 | len_stat = (size << DMA_BUFLENGTH_SHIFT) | | ||
1589 | (priv->hw_params->qtag_mask << DMA_TX_QTAG_SHIFT); | ||
1590 | |||
1591 | + /* Note: if we ever change from DMA_TX_APPEND_CRC below we | ||
1592 | + * will need to restore software padding of "runt" packets | ||
1593 | + */ | ||
1594 | if (!i) { | ||
1595 | len_stat |= DMA_TX_APPEND_CRC | DMA_SOP; | ||
1596 | if (skb->ip_summed == CHECKSUM_PARTIAL) | ||
1597 | diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c | ||
1598 | index ca3aa1250dd1..e12ba81288e6 100644 | ||
1599 | --- a/drivers/net/ethernet/broadcom/tg3.c | ||
1600 | +++ b/drivers/net/ethernet/broadcom/tg3.c | ||
1601 | @@ -18176,8 +18176,8 @@ static pci_ers_result_t tg3_io_error_detected(struct pci_dev *pdev, | ||
1602 | |||
1603 | rtnl_lock(); | ||
1604 | |||
1605 | - /* We probably don't have netdev yet */ | ||
1606 | - if (!netdev || !netif_running(netdev)) | ||
1607 | + /* Could be second call or maybe we don't have netdev yet */ | ||
1608 | + if (!netdev || tp->pcierr_recovery || !netif_running(netdev)) | ||
1609 | goto done; | ||
1610 | |||
1611 | /* We needn't recover from permanent error */ | ||
1612 | diff --git a/drivers/net/ethernet/chelsio/cxgb4/l2t.c b/drivers/net/ethernet/chelsio/cxgb4/l2t.c | ||
1613 | index e6fe2870137b..a440c1cf0b61 100644 | ||
1614 | --- a/drivers/net/ethernet/chelsio/cxgb4/l2t.c | ||
1615 | +++ b/drivers/net/ethernet/chelsio/cxgb4/l2t.c | ||
1616 | @@ -506,41 +506,20 @@ u64 cxgb4_select_ntuple(struct net_device *dev, | ||
1617 | } | ||
1618 | EXPORT_SYMBOL(cxgb4_select_ntuple); | ||
1619 | |||
1620 | -/* | ||
1621 | - * Called when address resolution fails for an L2T entry to handle packets | ||
1622 | - * on the arpq head. If a packet specifies a failure handler it is invoked, | ||
1623 | - * otherwise the packet is sent to the device. | ||
1624 | - */ | ||
1625 | -static void handle_failed_resolution(struct adapter *adap, struct l2t_entry *e) | ||
1626 | -{ | ||
1627 | - struct sk_buff *skb; | ||
1628 | - | ||
1629 | - while ((skb = __skb_dequeue(&e->arpq)) != NULL) { | ||
1630 | - const struct l2t_skb_cb *cb = L2T_SKB_CB(skb); | ||
1631 | - | ||
1632 | - spin_unlock(&e->lock); | ||
1633 | - if (cb->arp_err_handler) | ||
1634 | - cb->arp_err_handler(cb->handle, skb); | ||
1635 | - else | ||
1636 | - t4_ofld_send(adap, skb); | ||
1637 | - spin_lock(&e->lock); | ||
1638 | - } | ||
1639 | -} | ||
1640 | - | ||
1641 | /* | ||
1642 | * Called when the host's neighbor layer makes a change to some entry that is | ||
1643 | * loaded into the HW L2 table. | ||
1644 | */ | ||
1645 | void t4_l2t_update(struct adapter *adap, struct neighbour *neigh) | ||
1646 | { | ||
1647 | - struct l2t_entry *e; | ||
1648 | - struct sk_buff_head *arpq = NULL; | ||
1649 | - struct l2t_data *d = adap->l2t; | ||
1650 | unsigned int addr_len = neigh->tbl->key_len; | ||
1651 | u32 *addr = (u32 *) neigh->primary_key; | ||
1652 | - int ifidx = neigh->dev->ifindex; | ||
1653 | - int hash = addr_hash(d, addr, addr_len, ifidx); | ||
1654 | + int hash, ifidx = neigh->dev->ifindex; | ||
1655 | + struct sk_buff_head *arpq = NULL; | ||
1656 | + struct l2t_data *d = adap->l2t; | ||
1657 | + struct l2t_entry *e; | ||
1658 | |||
1659 | + hash = addr_hash(d, addr, addr_len, ifidx); | ||
1660 | read_lock_bh(&d->lock); | ||
1661 | for (e = d->l2tab[hash].first; e; e = e->next) | ||
1662 | if (!addreq(e, addr) && e->ifindex == ifidx) { | ||
1663 | @@ -573,8 +552,25 @@ void t4_l2t_update(struct adapter *adap, struct neighbour *neigh) | ||
1664 | write_l2e(adap, e, 0); | ||
1665 | } | ||
1666 | |||
1667 | - if (arpq) | ||
1668 | - handle_failed_resolution(adap, e); | ||
1669 | + if (arpq) { | ||
1670 | + struct sk_buff *skb; | ||
1671 | + | ||
1672 | + /* Called when address resolution fails for an L2T | ||
1673 | + * entry to handle packets on the arpq head. If a | ||
1674 | + * packet specifies a failure handler it is invoked, | ||
1675 | + * otherwise the packet is sent to the device. | ||
1676 | + */ | ||
1677 | + while ((skb = __skb_dequeue(&e->arpq)) != NULL) { | ||
1678 | + const struct l2t_skb_cb *cb = L2T_SKB_CB(skb); | ||
1679 | + | ||
1680 | + spin_unlock(&e->lock); | ||
1681 | + if (cb->arp_err_handler) | ||
1682 | + cb->arp_err_handler(cb->handle, skb); | ||
1683 | + else | ||
1684 | + t4_ofld_send(adap, skb); | ||
1685 | + spin_lock(&e->lock); | ||
1686 | + } | ||
1687 | + } | ||
1688 | spin_unlock_bh(&e->lock); | ||
1689 | } | ||
1690 | |||
1691 | diff --git a/drivers/net/ethernet/freescale/enetc/enetc.c b/drivers/net/ethernet/freescale/enetc/enetc.c | ||
1692 | index b6ff89307409..4ef4d41b0d8d 100644 | ||
1693 | --- a/drivers/net/ethernet/freescale/enetc/enetc.c | ||
1694 | +++ b/drivers/net/ethernet/freescale/enetc/enetc.c | ||
1695 | @@ -254,7 +254,7 @@ static irqreturn_t enetc_msix(int irq, void *data) | ||
1696 | /* disable interrupts */ | ||
1697 | enetc_wr_reg(v->rbier, 0); | ||
1698 | |||
1699 | - for_each_set_bit(i, &v->tx_rings_map, v->count_tx_rings) | ||
1700 | + for_each_set_bit(i, &v->tx_rings_map, ENETC_MAX_NUM_TXQS) | ||
1701 | enetc_wr_reg(v->tbier_base + ENETC_BDR_OFF(i), 0); | ||
1702 | |||
1703 | napi_schedule_irqoff(&v->napi); | ||
1704 | @@ -290,7 +290,7 @@ static int enetc_poll(struct napi_struct *napi, int budget) | ||
1705 | /* enable interrupts */ | ||
1706 | enetc_wr_reg(v->rbier, ENETC_RBIER_RXTIE); | ||
1707 | |||
1708 | - for_each_set_bit(i, &v->tx_rings_map, v->count_tx_rings) | ||
1709 | + for_each_set_bit(i, &v->tx_rings_map, ENETC_MAX_NUM_TXQS) | ||
1710 | enetc_wr_reg(v->tbier_base + ENETC_BDR_OFF(i), | ||
1711 | ENETC_TBIER_TXTIE); | ||
1712 | |||
1713 | diff --git a/drivers/net/ethernet/ibm/ibmveth.c b/drivers/net/ethernet/ibm/ibmveth.c | ||
1714 | index c5be4ebd8437..aa32a5b04112 100644 | ||
1715 | --- a/drivers/net/ethernet/ibm/ibmveth.c | ||
1716 | +++ b/drivers/net/ethernet/ibm/ibmveth.c | ||
1717 | @@ -1682,7 +1682,7 @@ static int ibmveth_probe(struct vio_dev *dev, const struct vio_device_id *id) | ||
1718 | } | ||
1719 | |||
1720 | netdev->min_mtu = IBMVETH_MIN_MTU; | ||
1721 | - netdev->max_mtu = ETH_MAX_MTU; | ||
1722 | + netdev->max_mtu = ETH_MAX_MTU - IBMVETH_BUFF_OH; | ||
1723 | |||
1724 | memcpy(netdev->dev_addr, mac_addr_p, ETH_ALEN); | ||
1725 | |||
1726 | diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c | ||
1727 | index 5a42ddeecfe5..4f503b9a674c 100644 | ||
1728 | --- a/drivers/net/ethernet/ibm/ibmvnic.c | ||
1729 | +++ b/drivers/net/ethernet/ibm/ibmvnic.c | ||
1730 | @@ -779,12 +779,13 @@ static int ibmvnic_login(struct net_device *netdev) | ||
1731 | struct ibmvnic_adapter *adapter = netdev_priv(netdev); | ||
1732 | unsigned long timeout = msecs_to_jiffies(30000); | ||
1733 | int retry_count = 0; | ||
1734 | + int retries = 10; | ||
1735 | bool retry; | ||
1736 | int rc; | ||
1737 | |||
1738 | do { | ||
1739 | retry = false; | ||
1740 | - if (retry_count > IBMVNIC_MAX_QUEUES) { | ||
1741 | + if (retry_count > retries) { | ||
1742 | netdev_warn(netdev, "Login attempts exceeded\n"); | ||
1743 | return -1; | ||
1744 | } | ||
1745 | @@ -799,11 +800,23 @@ static int ibmvnic_login(struct net_device *netdev) | ||
1746 | |||
1747 | if (!wait_for_completion_timeout(&adapter->init_done, | ||
1748 | timeout)) { | ||
1749 | - netdev_warn(netdev, "Login timed out\n"); | ||
1750 | - return -1; | ||
1751 | + netdev_warn(netdev, "Login timed out, retrying...\n"); | ||
1752 | + retry = true; | ||
1753 | + adapter->init_done_rc = 0; | ||
1754 | + retry_count++; | ||
1755 | + continue; | ||
1756 | } | ||
1757 | |||
1758 | - if (adapter->init_done_rc == PARTIALSUCCESS) { | ||
1759 | + if (adapter->init_done_rc == ABORTED) { | ||
1760 | + netdev_warn(netdev, "Login aborted, retrying...\n"); | ||
1761 | + retry = true; | ||
1762 | + adapter->init_done_rc = 0; | ||
1763 | + retry_count++; | ||
1764 | + /* FW or device may be busy, so | ||
1765 | + * wait a bit before retrying login | ||
1766 | + */ | ||
1767 | + msleep(500); | ||
1768 | + } else if (adapter->init_done_rc == PARTIALSUCCESS) { | ||
1769 | retry_count++; | ||
1770 | release_sub_crqs(adapter, 1); | ||
1771 | |||
1772 | diff --git a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c | ||
1773 | index cf5d447af7db..0f136f1af5d1 100644 | ||
1774 | --- a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c | ||
1775 | +++ b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c | ||
1776 | @@ -1541,7 +1541,7 @@ static void mvpp2_read_stats(struct mvpp2_port *port) | ||
1777 | for (q = 0; q < port->ntxqs; q++) | ||
1778 | for (i = 0; i < ARRAY_SIZE(mvpp2_ethtool_txq_regs); i++) | ||
1779 | *pstats++ += mvpp2_read_index(port->priv, | ||
1780 | - MVPP22_CTRS_TX_CTR(port->id, i), | ||
1781 | + MVPP22_CTRS_TX_CTR(port->id, q), | ||
1782 | mvpp2_ethtool_txq_regs[i].offset); | ||
1783 | |||
1784 | /* Rxqs are numbered from 0 from the user standpoint, but not from the | ||
1785 | @@ -1550,7 +1550,7 @@ static void mvpp2_read_stats(struct mvpp2_port *port) | ||
1786 | for (q = 0; q < port->nrxqs; q++) | ||
1787 | for (i = 0; i < ARRAY_SIZE(mvpp2_ethtool_rxq_regs); i++) | ||
1788 | *pstats++ += mvpp2_read_index(port->priv, | ||
1789 | - port->first_rxq + i, | ||
1790 | + port->first_rxq + q, | ||
1791 | mvpp2_ethtool_rxq_regs[i].offset); | ||
1792 | } | ||
1793 | |||
1794 | diff --git a/drivers/net/ethernet/qlogic/qed/qed_cxt.c b/drivers/net/ethernet/qlogic/qed/qed_cxt.c | ||
1795 | index 8e1bdf58b9e7..1d6dfba0c034 100644 | ||
1796 | --- a/drivers/net/ethernet/qlogic/qed/qed_cxt.c | ||
1797 | +++ b/drivers/net/ethernet/qlogic/qed/qed_cxt.c | ||
1798 | @@ -396,7 +396,7 @@ static void qed_cxt_qm_iids(struct qed_hwfn *p_hwfn, | ||
1799 | vf_tids += segs[NUM_TASK_PF_SEGMENTS].count; | ||
1800 | } | ||
1801 | |||
1802 | - iids->vf_cids += vf_cids * p_mngr->vf_count; | ||
1803 | + iids->vf_cids = vf_cids; | ||
1804 | iids->tids += vf_tids * p_mngr->vf_count; | ||
1805 | |||
1806 | DP_VERBOSE(p_hwfn, QED_MSG_ILT, | ||
1807 | diff --git a/drivers/net/ethernet/qlogic/qed/qed_dev.c b/drivers/net/ethernet/qlogic/qed/qed_dev.c | ||
1808 | index 0bf91df80d47..ecd14474a603 100644 | ||
1809 | --- a/drivers/net/ethernet/qlogic/qed/qed_dev.c | ||
1810 | +++ b/drivers/net/ethernet/qlogic/qed/qed_dev.c | ||
1811 | @@ -1368,6 +1368,8 @@ static void qed_dbg_user_data_free(struct qed_hwfn *p_hwfn) | ||
1812 | |||
1813 | void qed_resc_free(struct qed_dev *cdev) | ||
1814 | { | ||
1815 | + struct qed_rdma_info *rdma_info; | ||
1816 | + struct qed_hwfn *p_hwfn; | ||
1817 | int i; | ||
1818 | |||
1819 | if (IS_VF(cdev)) { | ||
1820 | @@ -1385,7 +1387,8 @@ void qed_resc_free(struct qed_dev *cdev) | ||
1821 | qed_llh_free(cdev); | ||
1822 | |||
1823 | for_each_hwfn(cdev, i) { | ||
1824 | - struct qed_hwfn *p_hwfn = &cdev->hwfns[i]; | ||
1825 | + p_hwfn = cdev->hwfns + i; | ||
1826 | + rdma_info = p_hwfn->p_rdma_info; | ||
1827 | |||
1828 | qed_cxt_mngr_free(p_hwfn); | ||
1829 | qed_qm_info_free(p_hwfn); | ||
1830 | @@ -1404,8 +1407,10 @@ void qed_resc_free(struct qed_dev *cdev) | ||
1831 | qed_ooo_free(p_hwfn); | ||
1832 | } | ||
1833 | |||
1834 | - if (QED_IS_RDMA_PERSONALITY(p_hwfn)) | ||
1835 | + if (QED_IS_RDMA_PERSONALITY(p_hwfn) && rdma_info) { | ||
1836 | + qed_spq_unregister_async_cb(p_hwfn, rdma_info->proto); | ||
1837 | qed_rdma_info_free(p_hwfn); | ||
1838 | + } | ||
1839 | |||
1840 | qed_iov_free(p_hwfn); | ||
1841 | qed_l2_free(p_hwfn); | ||
1842 | diff --git a/drivers/net/ethernet/qlogic/qed/qed_iwarp.c b/drivers/net/ethernet/qlogic/qed/qed_iwarp.c | ||
1843 | index 65ec16a31658..2b3102a2fe5c 100644 | ||
1844 | --- a/drivers/net/ethernet/qlogic/qed/qed_iwarp.c | ||
1845 | +++ b/drivers/net/ethernet/qlogic/qed/qed_iwarp.c | ||
1846 | @@ -2832,8 +2832,6 @@ int qed_iwarp_stop(struct qed_hwfn *p_hwfn) | ||
1847 | if (rc) | ||
1848 | return rc; | ||
1849 | |||
1850 | - qed_spq_unregister_async_cb(p_hwfn, PROTOCOLID_IWARP); | ||
1851 | - | ||
1852 | return qed_iwarp_ll2_stop(p_hwfn); | ||
1853 | } | ||
1854 | |||
1855 | diff --git a/drivers/net/ethernet/qlogic/qed/qed_roce.c b/drivers/net/ethernet/qlogic/qed/qed_roce.c | ||
1856 | index e49fada85410..83817bb50e9f 100644 | ||
1857 | --- a/drivers/net/ethernet/qlogic/qed/qed_roce.c | ||
1858 | +++ b/drivers/net/ethernet/qlogic/qed/qed_roce.c | ||
1859 | @@ -113,7 +113,6 @@ void qed_roce_stop(struct qed_hwfn *p_hwfn) | ||
1860 | break; | ||
1861 | } | ||
1862 | } | ||
1863 | - qed_spq_unregister_async_cb(p_hwfn, PROTOCOLID_ROCE); | ||
1864 | } | ||
1865 | |||
1866 | static void qed_rdma_copy_gids(struct qed_rdma_qp *qp, __le32 *src_gid, | ||
1867 | diff --git a/drivers/net/ethernet/qlogic/qed/qed_vf.c b/drivers/net/ethernet/qlogic/qed/qed_vf.c | ||
1868 | index 856051f50eb7..adc2c8f3d48e 100644 | ||
1869 | --- a/drivers/net/ethernet/qlogic/qed/qed_vf.c | ||
1870 | +++ b/drivers/net/ethernet/qlogic/qed/qed_vf.c | ||
1871 | @@ -81,12 +81,17 @@ static void qed_vf_pf_req_end(struct qed_hwfn *p_hwfn, int req_status) | ||
1872 | mutex_unlock(&(p_hwfn->vf_iov_info->mutex)); | ||
1873 | } | ||
1874 | |||
1875 | +#define QED_VF_CHANNEL_USLEEP_ITERATIONS 90 | ||
1876 | +#define QED_VF_CHANNEL_USLEEP_DELAY 100 | ||
1877 | +#define QED_VF_CHANNEL_MSLEEP_ITERATIONS 10 | ||
1878 | +#define QED_VF_CHANNEL_MSLEEP_DELAY 25 | ||
1879 | + | ||
1880 | static int qed_send_msg2pf(struct qed_hwfn *p_hwfn, u8 *done, u32 resp_size) | ||
1881 | { | ||
1882 | union vfpf_tlvs *p_req = p_hwfn->vf_iov_info->vf2pf_request; | ||
1883 | struct ustorm_trigger_vf_zone trigger; | ||
1884 | struct ustorm_vf_zone *zone_data; | ||
1885 | - int rc = 0, time = 100; | ||
1886 | + int iter, rc = 0; | ||
1887 | |||
1888 | zone_data = (struct ustorm_vf_zone *)PXP_VF_BAR0_START_USDM_ZONE_B; | ||
1889 | |||
1890 | @@ -126,11 +131,19 @@ static int qed_send_msg2pf(struct qed_hwfn *p_hwfn, u8 *done, u32 resp_size) | ||
1891 | REG_WR(p_hwfn, (uintptr_t)&zone_data->trigger, *((u32 *)&trigger)); | ||
1892 | |||
1893 | /* When PF would be done with the response, it would write back to the | ||
1894 | - * `done' address. Poll until then. | ||
1895 | + * `done' address from a coherent DMA zone. Poll until then. | ||
1896 | */ | ||
1897 | - while ((!*done) && time) { | ||
1898 | - msleep(25); | ||
1899 | - time--; | ||
1900 | + | ||
1901 | + iter = QED_VF_CHANNEL_USLEEP_ITERATIONS; | ||
1902 | + while (!*done && iter--) { | ||
1903 | + udelay(QED_VF_CHANNEL_USLEEP_DELAY); | ||
1904 | + dma_rmb(); | ||
1905 | + } | ||
1906 | + | ||
1907 | + iter = QED_VF_CHANNEL_MSLEEP_ITERATIONS; | ||
1908 | + while (!*done && iter--) { | ||
1909 | + msleep(QED_VF_CHANNEL_MSLEEP_DELAY); | ||
1910 | + dma_rmb(); | ||
1911 | } | ||
1912 | |||
1913 | if (!*done) { | ||
1914 | diff --git a/drivers/net/ethernet/qlogic/qede/qede_main.c b/drivers/net/ethernet/qlogic/qede/qede_main.c | ||
1915 | index 1da6b5bda80a..2c3d654c8454 100644 | ||
1916 | --- a/drivers/net/ethernet/qlogic/qede/qede_main.c | ||
1917 | +++ b/drivers/net/ethernet/qlogic/qede/qede_main.c | ||
1918 | @@ -1158,7 +1158,7 @@ static int __qede_probe(struct pci_dev *pdev, u32 dp_module, u8 dp_level, | ||
1919 | |||
1920 | /* PTP not supported on VFs */ | ||
1921 | if (!is_vf) | ||
1922 | - qede_ptp_enable(edev, (mode == QEDE_PROBE_NORMAL)); | ||
1923 | + qede_ptp_enable(edev); | ||
1924 | |||
1925 | edev->ops->register_ops(cdev, &qede_ll_ops, edev); | ||
1926 | |||
1927 | @@ -1247,6 +1247,7 @@ static void __qede_remove(struct pci_dev *pdev, enum qede_remove_mode mode) | ||
1928 | if (system_state == SYSTEM_POWER_OFF) | ||
1929 | return; | ||
1930 | qed_ops->common->remove(cdev); | ||
1931 | + edev->cdev = NULL; | ||
1932 | |||
1933 | /* Since this can happen out-of-sync with other flows, | ||
1934 | * don't release the netdevice until after slowpath stop | ||
1935 | diff --git a/drivers/net/ethernet/qlogic/qede/qede_ptp.c b/drivers/net/ethernet/qlogic/qede/qede_ptp.c | ||
1936 | index f815435cf106..2d3b2fa92df5 100644 | ||
1937 | --- a/drivers/net/ethernet/qlogic/qede/qede_ptp.c | ||
1938 | +++ b/drivers/net/ethernet/qlogic/qede/qede_ptp.c | ||
1939 | @@ -411,6 +411,7 @@ void qede_ptp_disable(struct qede_dev *edev) | ||
1940 | if (ptp->tx_skb) { | ||
1941 | dev_kfree_skb_any(ptp->tx_skb); | ||
1942 | ptp->tx_skb = NULL; | ||
1943 | + clear_bit_unlock(QEDE_FLAGS_PTP_TX_IN_PRORGESS, &edev->flags); | ||
1944 | } | ||
1945 | |||
1946 | /* Disable PTP in HW */ | ||
1947 | @@ -422,7 +423,7 @@ void qede_ptp_disable(struct qede_dev *edev) | ||
1948 | edev->ptp = NULL; | ||
1949 | } | ||
1950 | |||
1951 | -static int qede_ptp_init(struct qede_dev *edev, bool init_tc) | ||
1952 | +static int qede_ptp_init(struct qede_dev *edev) | ||
1953 | { | ||
1954 | struct qede_ptp *ptp; | ||
1955 | int rc; | ||
1956 | @@ -443,25 +444,19 @@ static int qede_ptp_init(struct qede_dev *edev, bool init_tc) | ||
1957 | /* Init work queue for Tx timestamping */ | ||
1958 | INIT_WORK(&ptp->work, qede_ptp_task); | ||
1959 | |||
1960 | - /* Init cyclecounter and timecounter. This is done only in the first | ||
1961 | - * load. If done in every load, PTP application will fail when doing | ||
1962 | - * unload / load (e.g. MTU change) while it is running. | ||
1963 | - */ | ||
1964 | - if (init_tc) { | ||
1965 | - memset(&ptp->cc, 0, sizeof(ptp->cc)); | ||
1966 | - ptp->cc.read = qede_ptp_read_cc; | ||
1967 | - ptp->cc.mask = CYCLECOUNTER_MASK(64); | ||
1968 | - ptp->cc.shift = 0; | ||
1969 | - ptp->cc.mult = 1; | ||
1970 | - | ||
1971 | - timecounter_init(&ptp->tc, &ptp->cc, | ||
1972 | - ktime_to_ns(ktime_get_real())); | ||
1973 | - } | ||
1974 | + /* Init cyclecounter and timecounter */ | ||
1975 | + memset(&ptp->cc, 0, sizeof(ptp->cc)); | ||
1976 | + ptp->cc.read = qede_ptp_read_cc; | ||
1977 | + ptp->cc.mask = CYCLECOUNTER_MASK(64); | ||
1978 | + ptp->cc.shift = 0; | ||
1979 | + ptp->cc.mult = 1; | ||
1980 | |||
1981 | - return rc; | ||
1982 | + timecounter_init(&ptp->tc, &ptp->cc, ktime_to_ns(ktime_get_real())); | ||
1983 | + | ||
1984 | + return 0; | ||
1985 | } | ||
1986 | |||
1987 | -int qede_ptp_enable(struct qede_dev *edev, bool init_tc) | ||
1988 | +int qede_ptp_enable(struct qede_dev *edev) | ||
1989 | { | ||
1990 | struct qede_ptp *ptp; | ||
1991 | int rc; | ||
1992 | @@ -482,7 +477,7 @@ int qede_ptp_enable(struct qede_dev *edev, bool init_tc) | ||
1993 | |||
1994 | edev->ptp = ptp; | ||
1995 | |||
1996 | - rc = qede_ptp_init(edev, init_tc); | ||
1997 | + rc = qede_ptp_init(edev); | ||
1998 | if (rc) | ||
1999 | goto err1; | ||
2000 | |||
2001 | diff --git a/drivers/net/ethernet/qlogic/qede/qede_ptp.h b/drivers/net/ethernet/qlogic/qede/qede_ptp.h | ||
2002 | index 691a14c4b2c5..89c7f3cf3ee2 100644 | ||
2003 | --- a/drivers/net/ethernet/qlogic/qede/qede_ptp.h | ||
2004 | +++ b/drivers/net/ethernet/qlogic/qede/qede_ptp.h | ||
2005 | @@ -41,7 +41,7 @@ void qede_ptp_rx_ts(struct qede_dev *edev, struct sk_buff *skb); | ||
2006 | void qede_ptp_tx_ts(struct qede_dev *edev, struct sk_buff *skb); | ||
2007 | int qede_ptp_hw_ts(struct qede_dev *edev, struct ifreq *req); | ||
2008 | void qede_ptp_disable(struct qede_dev *edev); | ||
2009 | -int qede_ptp_enable(struct qede_dev *edev, bool init_tc); | ||
2010 | +int qede_ptp_enable(struct qede_dev *edev); | ||
2011 | int qede_ptp_get_ts_info(struct qede_dev *edev, struct ethtool_ts_info *ts); | ||
2012 | |||
2013 | static inline void qede_ptp_record_rx_ts(struct qede_dev *edev, | ||
2014 | diff --git a/drivers/net/ethernet/qlogic/qede/qede_rdma.c b/drivers/net/ethernet/qlogic/qede/qede_rdma.c | ||
2015 | index 2d873ae8a234..668ccc9d49f8 100644 | ||
2016 | --- a/drivers/net/ethernet/qlogic/qede/qede_rdma.c | ||
2017 | +++ b/drivers/net/ethernet/qlogic/qede/qede_rdma.c | ||
2018 | @@ -105,6 +105,7 @@ static void qede_rdma_destroy_wq(struct qede_dev *edev) | ||
2019 | |||
2020 | qede_rdma_cleanup_event(edev); | ||
2021 | destroy_workqueue(edev->rdma_info.rdma_wq); | ||
2022 | + edev->rdma_info.rdma_wq = NULL; | ||
2023 | } | ||
2024 | |||
2025 | int qede_rdma_dev_add(struct qede_dev *edev, bool recovery) | ||
2026 | @@ -325,7 +326,7 @@ static void qede_rdma_add_event(struct qede_dev *edev, | ||
2027 | if (edev->rdma_info.exp_recovery) | ||
2028 | return; | ||
2029 | |||
2030 | - if (!edev->rdma_info.qedr_dev) | ||
2031 | + if (!edev->rdma_info.qedr_dev || !edev->rdma_info.rdma_wq) | ||
2032 | return; | ||
2033 | |||
2034 | /* We don't want the cleanup flow to start while we're allocating and | ||
2035 | diff --git a/drivers/net/ethernet/rocker/rocker_main.c b/drivers/net/ethernet/rocker/rocker_main.c | ||
2036 | index 786b158bd305..5abb3f9684ff 100644 | ||
2037 | --- a/drivers/net/ethernet/rocker/rocker_main.c | ||
2038 | +++ b/drivers/net/ethernet/rocker/rocker_main.c | ||
2039 | @@ -647,10 +647,10 @@ static int rocker_dma_rings_init(struct rocker *rocker) | ||
2040 | err_dma_event_ring_bufs_alloc: | ||
2041 | rocker_dma_ring_destroy(rocker, &rocker->event_ring); | ||
2042 | err_dma_event_ring_create: | ||
2043 | + rocker_dma_cmd_ring_waits_free(rocker); | ||
2044 | +err_dma_cmd_ring_waits_alloc: | ||
2045 | rocker_dma_ring_bufs_free(rocker, &rocker->cmd_ring, | ||
2046 | PCI_DMA_BIDIRECTIONAL); | ||
2047 | -err_dma_cmd_ring_waits_alloc: | ||
2048 | - rocker_dma_cmd_ring_waits_free(rocker); | ||
2049 | err_dma_cmd_ring_bufs_alloc: | ||
2050 | rocker_dma_ring_destroy(rocker, &rocker->cmd_ring); | ||
2051 | return err; | ||
2052 | diff --git a/drivers/net/geneve.c b/drivers/net/geneve.c | ||
2053 | index cac75c7d1d01..19d9d78a6df2 100644 | ||
2054 | --- a/drivers/net/geneve.c | ||
2055 | +++ b/drivers/net/geneve.c | ||
2056 | @@ -1649,6 +1649,7 @@ static int geneve_changelink(struct net_device *dev, struct nlattr *tb[], | ||
2057 | geneve->collect_md = metadata; | ||
2058 | geneve->use_udp6_rx_checksums = use_udp6_rx_checksums; | ||
2059 | geneve->ttl_inherit = ttl_inherit; | ||
2060 | + geneve->df = df; | ||
2061 | geneve_unquiesce(geneve, gs4, gs6); | ||
2062 | |||
2063 | return 0; | ||
2064 | diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c | ||
2065 | index 0907c3d8d94a..dba52a5c378a 100644 | ||
2066 | --- a/drivers/net/phy/phy_device.c | ||
2067 | +++ b/drivers/net/phy/phy_device.c | ||
2068 | @@ -797,8 +797,10 @@ static int get_phy_id(struct mii_bus *bus, int addr, u32 *phy_id, | ||
2069 | |||
2070 | /* Grab the bits from PHYIR2, and put them in the lower half */ | ||
2071 | phy_reg = mdiobus_read(bus, addr, MII_PHYSID2); | ||
2072 | - if (phy_reg < 0) | ||
2073 | - return -EIO; | ||
2074 | + if (phy_reg < 0) { | ||
2075 | + /* returning -ENODEV doesn't stop bus scanning */ | ||
2076 | + return (phy_reg == -EIO || phy_reg == -ENODEV) ? -ENODEV : -EIO; | ||
2077 | + } | ||
2078 | |||
2079 | *phy_id |= phy_reg; | ||
2080 | |||
2081 | diff --git a/drivers/net/usb/ax88179_178a.c b/drivers/net/usb/ax88179_178a.c | ||
2082 | index daa54486ab09..df2f7cc6dc03 100644 | ||
2083 | --- a/drivers/net/usb/ax88179_178a.c | ||
2084 | +++ b/drivers/net/usb/ax88179_178a.c | ||
2085 | @@ -1387,10 +1387,10 @@ static int ax88179_rx_fixup(struct usbnet *dev, struct sk_buff *skb) | ||
2086 | } | ||
2087 | |||
2088 | if (pkt_cnt == 0) { | ||
2089 | - /* Skip IP alignment psudo header */ | ||
2090 | - skb_pull(skb, 2); | ||
2091 | skb->len = pkt_len; | ||
2092 | - skb_set_tail_pointer(skb, pkt_len); | ||
2093 | + /* Skip IP alignment pseudo header */ | ||
2094 | + skb_pull(skb, 2); | ||
2095 | + skb_set_tail_pointer(skb, skb->len); | ||
2096 | skb->truesize = pkt_len + sizeof(struct sk_buff); | ||
2097 | ax88179_rx_checksum(skb, pkt_hdr); | ||
2098 | return 1; | ||
2099 | @@ -1399,8 +1399,9 @@ static int ax88179_rx_fixup(struct usbnet *dev, struct sk_buff *skb) | ||
2100 | ax_skb = skb_clone(skb, GFP_ATOMIC); | ||
2101 | if (ax_skb) { | ||
2102 | ax_skb->len = pkt_len; | ||
2103 | - ax_skb->data = skb->data + 2; | ||
2104 | - skb_set_tail_pointer(ax_skb, pkt_len); | ||
2105 | + /* Skip IP alignment pseudo header */ | ||
2106 | + skb_pull(ax_skb, 2); | ||
2107 | + skb_set_tail_pointer(ax_skb, ax_skb->len); | ||
2108 | ax_skb->truesize = pkt_len + sizeof(struct sk_buff); | ||
2109 | ax88179_rx_checksum(ax_skb, pkt_hdr); | ||
2110 | usbnet_skb_return(dev, ax_skb); | ||
2111 | diff --git a/drivers/nvme/host/multipath.c b/drivers/nvme/host/multipath.c | ||
2112 | index 56caddeabb5e..772eb05e57af 100644 | ||
2113 | --- a/drivers/nvme/host/multipath.c | ||
2114 | +++ b/drivers/nvme/host/multipath.c | ||
2115 | @@ -413,11 +413,10 @@ static void nvme_mpath_set_live(struct nvme_ns *ns) | ||
2116 | { | ||
2117 | struct nvme_ns_head *head = ns->head; | ||
2118 | |||
2119 | - lockdep_assert_held(&ns->head->lock); | ||
2120 | - | ||
2121 | if (!head->disk) | ||
2122 | return; | ||
2123 | |||
2124 | + mutex_lock(&head->lock); | ||
2125 | if (!(head->disk->flags & GENHD_FL_UP)) | ||
2126 | device_add_disk(&head->subsys->dev, head->disk, | ||
2127 | nvme_ns_id_attr_groups); | ||
2128 | @@ -430,9 +429,10 @@ static void nvme_mpath_set_live(struct nvme_ns *ns) | ||
2129 | __nvme_find_path(head, node); | ||
2130 | srcu_read_unlock(&head->srcu, srcu_idx); | ||
2131 | } | ||
2132 | + mutex_unlock(&head->lock); | ||
2133 | |||
2134 | - synchronize_srcu(&ns->head->srcu); | ||
2135 | - kblockd_schedule_work(&ns->head->requeue_work); | ||
2136 | + synchronize_srcu(&head->srcu); | ||
2137 | + kblockd_schedule_work(&head->requeue_work); | ||
2138 | } | ||
2139 | |||
2140 | static int nvme_parse_ana_log(struct nvme_ctrl *ctrl, void *data, | ||
2141 | @@ -483,14 +483,12 @@ static inline bool nvme_state_is_live(enum nvme_ana_state state) | ||
2142 | static void nvme_update_ns_ana_state(struct nvme_ana_group_desc *desc, | ||
2143 | struct nvme_ns *ns) | ||
2144 | { | ||
2145 | - mutex_lock(&ns->head->lock); | ||
2146 | ns->ana_grpid = le32_to_cpu(desc->grpid); | ||
2147 | ns->ana_state = desc->state; | ||
2148 | clear_bit(NVME_NS_ANA_PENDING, &ns->flags); | ||
2149 | |||
2150 | if (nvme_state_is_live(ns->ana_state)) | ||
2151 | nvme_mpath_set_live(ns); | ||
2152 | - mutex_unlock(&ns->head->lock); | ||
2153 | } | ||
2154 | |||
2155 | static int nvme_update_ana_state(struct nvme_ctrl *ctrl, | ||
2156 | @@ -661,10 +659,8 @@ void nvme_mpath_add_disk(struct nvme_ns *ns, struct nvme_id_ns *id) | ||
2157 | nvme_parse_ana_log(ns->ctrl, ns, nvme_set_ns_ana_state); | ||
2158 | mutex_unlock(&ns->ctrl->ana_lock); | ||
2159 | } else { | ||
2160 | - mutex_lock(&ns->head->lock); | ||
2161 | ns->ana_state = NVME_ANA_OPTIMIZED; | ||
2162 | nvme_mpath_set_live(ns); | ||
2163 | - mutex_unlock(&ns->head->lock); | ||
2164 | } | ||
2165 | } | ||
2166 | |||
2167 | diff --git a/drivers/pinctrl/qcom/pinctrl-spmi-gpio.c b/drivers/pinctrl/qcom/pinctrl-spmi-gpio.c | ||
2168 | index f1fece5b9c06..3769ad08eadf 100644 | ||
2169 | --- a/drivers/pinctrl/qcom/pinctrl-spmi-gpio.c | ||
2170 | +++ b/drivers/pinctrl/qcom/pinctrl-spmi-gpio.c | ||
2171 | @@ -170,6 +170,7 @@ struct pmic_gpio_state { | ||
2172 | struct regmap *map; | ||
2173 | struct pinctrl_dev *ctrl; | ||
2174 | struct gpio_chip chip; | ||
2175 | + struct irq_chip irq; | ||
2176 | }; | ||
2177 | |||
2178 | static const struct pinconf_generic_params pmic_gpio_bindings[] = { | ||
2179 | @@ -917,16 +918,6 @@ static int pmic_gpio_populate(struct pmic_gpio_state *state, | ||
2180 | return 0; | ||
2181 | } | ||
2182 | |||
2183 | -static struct irq_chip pmic_gpio_irq_chip = { | ||
2184 | - .name = "spmi-gpio", | ||
2185 | - .irq_ack = irq_chip_ack_parent, | ||
2186 | - .irq_mask = irq_chip_mask_parent, | ||
2187 | - .irq_unmask = irq_chip_unmask_parent, | ||
2188 | - .irq_set_type = irq_chip_set_type_parent, | ||
2189 | - .irq_set_wake = irq_chip_set_wake_parent, | ||
2190 | - .flags = IRQCHIP_MASK_ON_SUSPEND, | ||
2191 | -}; | ||
2192 | - | ||
2193 | static int pmic_gpio_domain_translate(struct irq_domain *domain, | ||
2194 | struct irq_fwspec *fwspec, | ||
2195 | unsigned long *hwirq, | ||
2196 | @@ -1053,8 +1044,16 @@ static int pmic_gpio_probe(struct platform_device *pdev) | ||
2197 | if (!parent_domain) | ||
2198 | return -ENXIO; | ||
2199 | |||
2200 | + state->irq.name = "spmi-gpio", | ||
2201 | + state->irq.irq_ack = irq_chip_ack_parent, | ||
2202 | + state->irq.irq_mask = irq_chip_mask_parent, | ||
2203 | + state->irq.irq_unmask = irq_chip_unmask_parent, | ||
2204 | + state->irq.irq_set_type = irq_chip_set_type_parent, | ||
2205 | + state->irq.irq_set_wake = irq_chip_set_wake_parent, | ||
2206 | + state->irq.flags = IRQCHIP_MASK_ON_SUSPEND, | ||
2207 | + | ||
2208 | girq = &state->chip.irq; | ||
2209 | - girq->chip = &pmic_gpio_irq_chip; | ||
2210 | + girq->chip = &state->irq; | ||
2211 | girq->default_type = IRQ_TYPE_NONE; | ||
2212 | girq->handler = handle_level_irq; | ||
2213 | girq->fwnode = of_node_to_fwnode(state->dev->of_node); | ||
2214 | diff --git a/drivers/pinctrl/tegra/pinctrl-tegra.c b/drivers/pinctrl/tegra/pinctrl-tegra.c | ||
2215 | index e9a7cbb9aa33..01bcef2c01bc 100644 | ||
2216 | --- a/drivers/pinctrl/tegra/pinctrl-tegra.c | ||
2217 | +++ b/drivers/pinctrl/tegra/pinctrl-tegra.c | ||
2218 | @@ -685,8 +685,8 @@ static int tegra_pinctrl_resume(struct device *dev) | ||
2219 | } | ||
2220 | |||
2221 | const struct dev_pm_ops tegra_pinctrl_pm = { | ||
2222 | - .suspend = &tegra_pinctrl_suspend, | ||
2223 | - .resume = &tegra_pinctrl_resume | ||
2224 | + .suspend_noirq = &tegra_pinctrl_suspend, | ||
2225 | + .resume_noirq = &tegra_pinctrl_resume | ||
2226 | }; | ||
2227 | |||
2228 | static bool gpio_node_has_range(const char *compatible) | ||
2229 | diff --git a/drivers/regulator/pfuze100-regulator.c b/drivers/regulator/pfuze100-regulator.c | ||
2230 | index 689537927f6f..4c8e8b472287 100644 | ||
2231 | --- a/drivers/regulator/pfuze100-regulator.c | ||
2232 | +++ b/drivers/regulator/pfuze100-regulator.c | ||
2233 | @@ -209,6 +209,19 @@ static const struct regulator_ops pfuze100_swb_regulator_ops = { | ||
2234 | |||
2235 | }; | ||
2236 | |||
2237 | +static const struct regulator_ops pfuze3000_sw_regulator_ops = { | ||
2238 | + .enable = regulator_enable_regmap, | ||
2239 | + .disable = regulator_disable_regmap, | ||
2240 | + .is_enabled = regulator_is_enabled_regmap, | ||
2241 | + .list_voltage = regulator_list_voltage_table, | ||
2242 | + .map_voltage = regulator_map_voltage_ascend, | ||
2243 | + .set_voltage_sel = regulator_set_voltage_sel_regmap, | ||
2244 | + .get_voltage_sel = regulator_get_voltage_sel_regmap, | ||
2245 | + .set_voltage_time_sel = regulator_set_voltage_time_sel, | ||
2246 | + .set_ramp_delay = pfuze100_set_ramp_delay, | ||
2247 | + | ||
2248 | +}; | ||
2249 | + | ||
2250 | #define PFUZE100_FIXED_REG(_chip, _name, base, voltage) \ | ||
2251 | [_chip ## _ ## _name] = { \ | ||
2252 | .desc = { \ | ||
2253 | @@ -318,23 +331,28 @@ static const struct regulator_ops pfuze100_swb_regulator_ops = { | ||
2254 | .stby_mask = 0x20, \ | ||
2255 | } | ||
2256 | |||
2257 | - | ||
2258 | -#define PFUZE3000_SW2_REG(_chip, _name, base, min, max, step) { \ | ||
2259 | - .desc = { \ | ||
2260 | - .name = #_name,\ | ||
2261 | - .n_voltages = ((max) - (min)) / (step) + 1, \ | ||
2262 | - .ops = &pfuze100_sw_regulator_ops, \ | ||
2263 | - .type = REGULATOR_VOLTAGE, \ | ||
2264 | - .id = _chip ## _ ## _name, \ | ||
2265 | - .owner = THIS_MODULE, \ | ||
2266 | - .min_uV = (min), \ | ||
2267 | - .uV_step = (step), \ | ||
2268 | - .vsel_reg = (base) + PFUZE100_VOL_OFFSET, \ | ||
2269 | - .vsel_mask = 0x7, \ | ||
2270 | - }, \ | ||
2271 | - .stby_reg = (base) + PFUZE100_STANDBY_OFFSET, \ | ||
2272 | - .stby_mask = 0x7, \ | ||
2273 | -} | ||
2274 | +/* No linar case for the some switches of PFUZE3000 */ | ||
2275 | +#define PFUZE3000_SW_REG(_chip, _name, base, mask, voltages) \ | ||
2276 | + [_chip ## _ ## _name] = { \ | ||
2277 | + .desc = { \ | ||
2278 | + .name = #_name, \ | ||
2279 | + .n_voltages = ARRAY_SIZE(voltages), \ | ||
2280 | + .ops = &pfuze3000_sw_regulator_ops, \ | ||
2281 | + .type = REGULATOR_VOLTAGE, \ | ||
2282 | + .id = _chip ## _ ## _name, \ | ||
2283 | + .owner = THIS_MODULE, \ | ||
2284 | + .volt_table = voltages, \ | ||
2285 | + .vsel_reg = (base) + PFUZE100_VOL_OFFSET, \ | ||
2286 | + .vsel_mask = (mask), \ | ||
2287 | + .enable_reg = (base) + PFUZE100_MODE_OFFSET, \ | ||
2288 | + .enable_mask = 0xf, \ | ||
2289 | + .enable_val = 0x8, \ | ||
2290 | + .enable_time = 500, \ | ||
2291 | + }, \ | ||
2292 | + .stby_reg = (base) + PFUZE100_STANDBY_OFFSET, \ | ||
2293 | + .stby_mask = (mask), \ | ||
2294 | + .sw_reg = true, \ | ||
2295 | + } | ||
2296 | |||
2297 | #define PFUZE3000_SW3_REG(_chip, _name, base, min, max, step) { \ | ||
2298 | .desc = { \ | ||
2299 | @@ -391,9 +409,9 @@ static struct pfuze_regulator pfuze200_regulators[] = { | ||
2300 | }; | ||
2301 | |||
2302 | static struct pfuze_regulator pfuze3000_regulators[] = { | ||
2303 | - PFUZE100_SWB_REG(PFUZE3000, SW1A, PFUZE100_SW1ABVOL, 0x1f, pfuze3000_sw1a), | ||
2304 | + PFUZE3000_SW_REG(PFUZE3000, SW1A, PFUZE100_SW1ABVOL, 0x1f, pfuze3000_sw1a), | ||
2305 | PFUZE100_SW_REG(PFUZE3000, SW1B, PFUZE100_SW1CVOL, 700000, 1475000, 25000), | ||
2306 | - PFUZE100_SWB_REG(PFUZE3000, SW2, PFUZE100_SW2VOL, 0x7, pfuze3000_sw2lo), | ||
2307 | + PFUZE3000_SW_REG(PFUZE3000, SW2, PFUZE100_SW2VOL, 0x7, pfuze3000_sw2lo), | ||
2308 | PFUZE3000_SW3_REG(PFUZE3000, SW3, PFUZE100_SW3AVOL, 900000, 1650000, 50000), | ||
2309 | PFUZE100_SWB_REG(PFUZE3000, SWBST, PFUZE100_SWBSTCON1, 0x3, pfuze100_swbst), | ||
2310 | PFUZE100_SWB_REG(PFUZE3000, VSNVS, PFUZE100_VSNVSVOL, 0x7, pfuze100_vsnvs), | ||
2311 | @@ -407,8 +425,8 @@ static struct pfuze_regulator pfuze3000_regulators[] = { | ||
2312 | }; | ||
2313 | |||
2314 | static struct pfuze_regulator pfuze3001_regulators[] = { | ||
2315 | - PFUZE100_SWB_REG(PFUZE3001, SW1, PFUZE100_SW1ABVOL, 0x1f, pfuze3000_sw1a), | ||
2316 | - PFUZE100_SWB_REG(PFUZE3001, SW2, PFUZE100_SW2VOL, 0x7, pfuze3000_sw2lo), | ||
2317 | + PFUZE3000_SW_REG(PFUZE3001, SW1, PFUZE100_SW1ABVOL, 0x1f, pfuze3000_sw1a), | ||
2318 | + PFUZE3000_SW_REG(PFUZE3001, SW2, PFUZE100_SW2VOL, 0x7, pfuze3000_sw2lo), | ||
2319 | PFUZE3000_SW3_REG(PFUZE3001, SW3, PFUZE100_SW3AVOL, 900000, 1650000, 50000), | ||
2320 | PFUZE100_SWB_REG(PFUZE3001, VSNVS, PFUZE100_VSNVSVOL, 0x7, pfuze100_vsnvs), | ||
2321 | PFUZE100_VGEN_REG(PFUZE3001, VLDO1, PFUZE100_VGEN1VOL, 1800000, 3300000, 100000), | ||
2322 | diff --git a/drivers/s390/net/qeth_core_main.c b/drivers/s390/net/qeth_core_main.c | ||
2323 | index fe70e9875bde..5043f0fcf399 100644 | ||
2324 | --- a/drivers/s390/net/qeth_core_main.c | ||
2325 | +++ b/drivers/s390/net/qeth_core_main.c | ||
2326 | @@ -4163,9 +4163,6 @@ static int qeth_setadpparms_set_access_ctrl_cb(struct qeth_card *card, | ||
2327 | int fallback = *(int *)reply->param; | ||
2328 | |||
2329 | QETH_CARD_TEXT(card, 4, "setaccb"); | ||
2330 | - if (cmd->hdr.return_code) | ||
2331 | - return -EIO; | ||
2332 | - qeth_setadpparms_inspect_rc(cmd); | ||
2333 | |||
2334 | access_ctrl_req = &cmd->data.setadapterparms.data.set_access_ctrl; | ||
2335 | QETH_CARD_TEXT_(card, 2, "rc=%d", | ||
2336 | @@ -4175,7 +4172,7 @@ static int qeth_setadpparms_set_access_ctrl_cb(struct qeth_card *card, | ||
2337 | QETH_DBF_MESSAGE(3, "ERR:SET_ACCESS_CTRL(%#x) on device %x: %#x\n", | ||
2338 | access_ctrl_req->subcmd_code, CARD_DEVID(card), | ||
2339 | cmd->data.setadapterparms.hdr.return_code); | ||
2340 | - switch (cmd->data.setadapterparms.hdr.return_code) { | ||
2341 | + switch (qeth_setadpparms_inspect_rc(cmd)) { | ||
2342 | case SET_ACCESS_CTRL_RC_SUCCESS: | ||
2343 | if (card->options.isolation == ISOLATION_MODE_NONE) { | ||
2344 | dev_info(&card->gdev->dev, | ||
2345 | diff --git a/drivers/s390/scsi/zfcp_erp.c b/drivers/s390/scsi/zfcp_erp.c | ||
2346 | index cb84125ab80d..08dc2efb7d8a 100644 | ||
2347 | --- a/drivers/s390/scsi/zfcp_erp.c | ||
2348 | +++ b/drivers/s390/scsi/zfcp_erp.c | ||
2349 | @@ -576,7 +576,10 @@ static void zfcp_erp_strategy_check_fsfreq(struct zfcp_erp_action *act) | ||
2350 | ZFCP_STATUS_ERP_TIMEDOUT)) { | ||
2351 | req->status |= ZFCP_STATUS_FSFREQ_DISMISSED; | ||
2352 | zfcp_dbf_rec_run("erscf_1", act); | ||
2353 | - req->erp_action = NULL; | ||
2354 | + /* lock-free concurrent access with | ||
2355 | + * zfcp_erp_timeout_handler() | ||
2356 | + */ | ||
2357 | + WRITE_ONCE(req->erp_action, NULL); | ||
2358 | } | ||
2359 | if (act->status & ZFCP_STATUS_ERP_TIMEDOUT) | ||
2360 | zfcp_dbf_rec_run("erscf_2", act); | ||
2361 | @@ -612,8 +615,14 @@ void zfcp_erp_notify(struct zfcp_erp_action *erp_action, unsigned long set_mask) | ||
2362 | void zfcp_erp_timeout_handler(struct timer_list *t) | ||
2363 | { | ||
2364 | struct zfcp_fsf_req *fsf_req = from_timer(fsf_req, t, timer); | ||
2365 | - struct zfcp_erp_action *act = fsf_req->erp_action; | ||
2366 | + struct zfcp_erp_action *act; | ||
2367 | |||
2368 | + if (fsf_req->status & ZFCP_STATUS_FSFREQ_DISMISSED) | ||
2369 | + return; | ||
2370 | + /* lock-free concurrent access with zfcp_erp_strategy_check_fsfreq() */ | ||
2371 | + act = READ_ONCE(fsf_req->erp_action); | ||
2372 | + if (!act) | ||
2373 | + return; | ||
2374 | zfcp_erp_notify(act, ZFCP_STATUS_ERP_TIMEDOUT); | ||
2375 | } | ||
2376 | |||
2377 | diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c | ||
2378 | index 14d9f41977f1..95abffd9ad10 100644 | ||
2379 | --- a/drivers/scsi/lpfc/lpfc_init.c | ||
2380 | +++ b/drivers/scsi/lpfc/lpfc_init.c | ||
2381 | @@ -11542,7 +11542,8 @@ lpfc_sli4_hba_unset(struct lpfc_hba *phba) | ||
2382 | lpfc_sli4_xri_exchange_busy_wait(phba); | ||
2383 | |||
2384 | /* per-phba callback de-registration for hotplug event */ | ||
2385 | - lpfc_cpuhp_remove(phba); | ||
2386 | + if (phba->pport) | ||
2387 | + lpfc_cpuhp_remove(phba); | ||
2388 | |||
2389 | /* Disable PCI subsystem interrupt */ | ||
2390 | lpfc_sli4_disable_intr(phba); | ||
2391 | diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c | ||
2392 | index 84bb4a048016..a44de4c5dcf6 100644 | ||
2393 | --- a/drivers/scsi/qla2xxx/qla_gs.c | ||
2394 | +++ b/drivers/scsi/qla2xxx/qla_gs.c | ||
2395 | @@ -3638,7 +3638,9 @@ void qla24xx_async_gnnft_done(scsi_qla_host_t *vha, srb_t *sp) | ||
2396 | qla2x00_clear_loop_id(fcport); | ||
2397 | fcport->flags |= FCF_FABRIC_DEVICE; | ||
2398 | } else if (fcport->d_id.b24 != rp->id.b24 || | ||
2399 | - fcport->scan_needed) { | ||
2400 | + (fcport->scan_needed && | ||
2401 | + fcport->port_type != FCT_INITIATOR && | ||
2402 | + fcport->port_type != FCT_NVME_INITIATOR)) { | ||
2403 | qlt_schedule_sess_for_deletion(fcport); | ||
2404 | } | ||
2405 | fcport->d_id.b24 = rp->id.b24; | ||
2406 | diff --git a/drivers/staging/rtl8723bs/core/rtw_wlan_util.c b/drivers/staging/rtl8723bs/core/rtw_wlan_util.c | ||
2407 | index ea3ea2a6b314..f6678ba6d4bc 100644 | ||
2408 | --- a/drivers/staging/rtl8723bs/core/rtw_wlan_util.c | ||
2409 | +++ b/drivers/staging/rtl8723bs/core/rtw_wlan_util.c | ||
2410 | @@ -1845,12 +1845,14 @@ int update_sta_support_rate(struct adapter *padapter, u8 *pvar_ie, uint var_ie_l | ||
2411 | pIE = (struct ndis_80211_var_ie *)rtw_get_ie(pvar_ie, _SUPPORTEDRATES_IE_, &ie_len, var_ie_len); | ||
2412 | if (!pIE) | ||
2413 | return _FAIL; | ||
2414 | + if (ie_len > sizeof(pmlmeinfo->FW_sta_info[cam_idx].SupportedRates)) | ||
2415 | + return _FAIL; | ||
2416 | |||
2417 | memcpy(pmlmeinfo->FW_sta_info[cam_idx].SupportedRates, pIE->data, ie_len); | ||
2418 | supportRateNum = ie_len; | ||
2419 | |||
2420 | pIE = (struct ndis_80211_var_ie *)rtw_get_ie(pvar_ie, _EXT_SUPPORTEDRATES_IE_, &ie_len, var_ie_len); | ||
2421 | - if (pIE) | ||
2422 | + if (pIE && (ie_len <= sizeof(pmlmeinfo->FW_sta_info[cam_idx].SupportedRates) - supportRateNum)) | ||
2423 | memcpy((pmlmeinfo->FW_sta_info[cam_idx].SupportedRates + supportRateNum), pIE->data, ie_len); | ||
2424 | |||
2425 | return _SUCCESS; | ||
2426 | diff --git a/drivers/tty/hvc/hvc_console.c b/drivers/tty/hvc/hvc_console.c | ||
2427 | index f8e43a6faea9..cdcc64ea2554 100644 | ||
2428 | --- a/drivers/tty/hvc/hvc_console.c | ||
2429 | +++ b/drivers/tty/hvc/hvc_console.c | ||
2430 | @@ -75,8 +75,6 @@ static LIST_HEAD(hvc_structs); | ||
2431 | */ | ||
2432 | static DEFINE_MUTEX(hvc_structs_mutex); | ||
2433 | |||
2434 | -/* Mutex to serialize hvc_open */ | ||
2435 | -static DEFINE_MUTEX(hvc_open_mutex); | ||
2436 | /* | ||
2437 | * This value is used to assign a tty->index value to a hvc_struct based | ||
2438 | * upon order of exposure via hvc_probe(), when we can not match it to | ||
2439 | @@ -348,24 +346,16 @@ static int hvc_install(struct tty_driver *driver, struct tty_struct *tty) | ||
2440 | */ | ||
2441 | static int hvc_open(struct tty_struct *tty, struct file * filp) | ||
2442 | { | ||
2443 | - struct hvc_struct *hp; | ||
2444 | + struct hvc_struct *hp = tty->driver_data; | ||
2445 | unsigned long flags; | ||
2446 | int rc = 0; | ||
2447 | |||
2448 | - mutex_lock(&hvc_open_mutex); | ||
2449 | - | ||
2450 | - hp = tty->driver_data; | ||
2451 | - if (!hp) { | ||
2452 | - rc = -EIO; | ||
2453 | - goto out; | ||
2454 | - } | ||
2455 | - | ||
2456 | spin_lock_irqsave(&hp->port.lock, flags); | ||
2457 | /* Check and then increment for fast path open. */ | ||
2458 | if (hp->port.count++ > 0) { | ||
2459 | spin_unlock_irqrestore(&hp->port.lock, flags); | ||
2460 | hvc_kick(); | ||
2461 | - goto out; | ||
2462 | + return 0; | ||
2463 | } /* else count == 0 */ | ||
2464 | spin_unlock_irqrestore(&hp->port.lock, flags); | ||
2465 | |||
2466 | @@ -393,8 +383,6 @@ static int hvc_open(struct tty_struct *tty, struct file * filp) | ||
2467 | /* Force wakeup of the polling thread */ | ||
2468 | hvc_kick(); | ||
2469 | |||
2470 | -out: | ||
2471 | - mutex_unlock(&hvc_open_mutex); | ||
2472 | return rc; | ||
2473 | } | ||
2474 | |||
2475 | diff --git a/drivers/usb/cdns3/ep0.c b/drivers/usb/cdns3/ep0.c | ||
2476 | index e71240b386b4..da4c5eb03d7e 100644 | ||
2477 | --- a/drivers/usb/cdns3/ep0.c | ||
2478 | +++ b/drivers/usb/cdns3/ep0.c | ||
2479 | @@ -327,7 +327,8 @@ static int cdns3_ep0_feature_handle_device(struct cdns3_device *priv_dev, | ||
2480 | if (!set || (tmode & 0xff) != 0) | ||
2481 | return -EINVAL; | ||
2482 | |||
2483 | - switch (tmode >> 8) { | ||
2484 | + tmode >>= 8; | ||
2485 | + switch (tmode) { | ||
2486 | case TEST_J: | ||
2487 | case TEST_K: | ||
2488 | case TEST_SE0_NAK: | ||
2489 | @@ -711,15 +712,17 @@ static int cdns3_gadget_ep0_queue(struct usb_ep *ep, | ||
2490 | int ret = 0; | ||
2491 | u8 zlp = 0; | ||
2492 | |||
2493 | + spin_lock_irqsave(&priv_dev->lock, flags); | ||
2494 | trace_cdns3_ep0_queue(priv_dev, request); | ||
2495 | |||
2496 | /* cancel the request if controller receive new SETUP packet. */ | ||
2497 | - if (cdns3_check_new_setup(priv_dev)) | ||
2498 | + if (cdns3_check_new_setup(priv_dev)) { | ||
2499 | + spin_unlock_irqrestore(&priv_dev->lock, flags); | ||
2500 | return -ECONNRESET; | ||
2501 | + } | ||
2502 | |||
2503 | /* send STATUS stage. Should be called only for SET_CONFIGURATION */ | ||
2504 | if (priv_dev->ep0_stage == CDNS3_STATUS_STAGE) { | ||
2505 | - spin_lock_irqsave(&priv_dev->lock, flags); | ||
2506 | cdns3_select_ep(priv_dev, 0x00); | ||
2507 | |||
2508 | erdy_sent = !priv_dev->hw_configured_flag; | ||
2509 | @@ -744,7 +747,6 @@ static int cdns3_gadget_ep0_queue(struct usb_ep *ep, | ||
2510 | return 0; | ||
2511 | } | ||
2512 | |||
2513 | - spin_lock_irqsave(&priv_dev->lock, flags); | ||
2514 | if (!list_empty(&priv_ep->pending_req_list)) { | ||
2515 | dev_err(priv_dev->dev, | ||
2516 | "can't handle multiple requests for ep0\n"); | ||
2517 | diff --git a/drivers/usb/cdns3/trace.h b/drivers/usb/cdns3/trace.h | ||
2518 | index e92348c9b4d7..7cc8bebaa07d 100644 | ||
2519 | --- a/drivers/usb/cdns3/trace.h | ||
2520 | +++ b/drivers/usb/cdns3/trace.h | ||
2521 | @@ -150,7 +150,7 @@ DECLARE_EVENT_CLASS(cdns3_log_ep0_irq, | ||
2522 | __dynamic_array(char, str, CDNS3_MSG_MAX) | ||
2523 | ), | ||
2524 | TP_fast_assign( | ||
2525 | - __entry->ep_dir = priv_dev->ep0_data_dir; | ||
2526 | + __entry->ep_dir = priv_dev->selected_ep; | ||
2527 | __entry->ep_sts = ep_sts; | ||
2528 | ), | ||
2529 | TP_printk("%s", cdns3_decode_ep0_irq(__get_str(str), | ||
2530 | diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c | ||
2531 | index f67088bb8218..d5187b50fc82 100644 | ||
2532 | --- a/drivers/usb/class/cdc-acm.c | ||
2533 | +++ b/drivers/usb/class/cdc-acm.c | ||
2534 | @@ -1689,6 +1689,8 @@ static int acm_pre_reset(struct usb_interface *intf) | ||
2535 | |||
2536 | static const struct usb_device_id acm_ids[] = { | ||
2537 | /* quirky and broken devices */ | ||
2538 | + { USB_DEVICE(0x0424, 0x274e), /* Microchip Technology, Inc. (formerly SMSC) */ | ||
2539 | + .driver_info = DISABLE_ECHO, }, /* DISABLE ECHO in termios flag */ | ||
2540 | { USB_DEVICE(0x076d, 0x0006), /* Denso Cradle CU-321 */ | ||
2541 | .driver_info = NO_UNION_NORMAL, },/* has no union descriptor */ | ||
2542 | { USB_DEVICE(0x17ef, 0x7000), /* Lenovo USB modem */ | ||
2543 | diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c | ||
2544 | index 3e8efe759c3e..e0b77674869c 100644 | ||
2545 | --- a/drivers/usb/core/quirks.c | ||
2546 | +++ b/drivers/usb/core/quirks.c | ||
2547 | @@ -218,11 +218,12 @@ static const struct usb_device_id usb_quirk_list[] = { | ||
2548 | /* Logitech HD Webcam C270 */ | ||
2549 | { USB_DEVICE(0x046d, 0x0825), .driver_info = USB_QUIRK_RESET_RESUME }, | ||
2550 | |||
2551 | - /* Logitech HD Pro Webcams C920, C920-C, C925e and C930e */ | ||
2552 | + /* Logitech HD Pro Webcams C920, C920-C, C922, C925e and C930e */ | ||
2553 | { USB_DEVICE(0x046d, 0x082d), .driver_info = USB_QUIRK_DELAY_INIT }, | ||
2554 | { USB_DEVICE(0x046d, 0x0841), .driver_info = USB_QUIRK_DELAY_INIT }, | ||
2555 | { USB_DEVICE(0x046d, 0x0843), .driver_info = USB_QUIRK_DELAY_INIT }, | ||
2556 | { USB_DEVICE(0x046d, 0x085b), .driver_info = USB_QUIRK_DELAY_INIT }, | ||
2557 | + { USB_DEVICE(0x046d, 0x085c), .driver_info = USB_QUIRK_DELAY_INIT }, | ||
2558 | |||
2559 | /* Logitech ConferenceCam CC3000e */ | ||
2560 | { USB_DEVICE(0x046d, 0x0847), .driver_info = USB_QUIRK_DELAY_INIT }, | ||
2561 | diff --git a/drivers/usb/dwc2/gadget.c b/drivers/usb/dwc2/gadget.c | ||
2562 | index 7fd0900a9cb0..f7528f732b2a 100644 | ||
2563 | --- a/drivers/usb/dwc2/gadget.c | ||
2564 | +++ b/drivers/usb/dwc2/gadget.c | ||
2565 | @@ -4886,12 +4886,6 @@ int dwc2_gadget_init(struct dwc2_hsotg *hsotg) | ||
2566 | epnum, 0); | ||
2567 | } | ||
2568 | |||
2569 | - ret = usb_add_gadget_udc(dev, &hsotg->gadget); | ||
2570 | - if (ret) { | ||
2571 | - dwc2_hsotg_ep_free_request(&hsotg->eps_out[0]->ep, | ||
2572 | - hsotg->ctrl_req); | ||
2573 | - return ret; | ||
2574 | - } | ||
2575 | dwc2_hsotg_dump(hsotg); | ||
2576 | |||
2577 | return 0; | ||
2578 | diff --git a/drivers/usb/dwc2/platform.c b/drivers/usb/dwc2/platform.c | ||
2579 | index 3c6ce09a6db5..15e55808cf4e 100644 | ||
2580 | --- a/drivers/usb/dwc2/platform.c | ||
2581 | +++ b/drivers/usb/dwc2/platform.c | ||
2582 | @@ -507,6 +507,17 @@ static int dwc2_driver_probe(struct platform_device *dev) | ||
2583 | if (hsotg->dr_mode == USB_DR_MODE_PERIPHERAL) | ||
2584 | dwc2_lowlevel_hw_disable(hsotg); | ||
2585 | |||
2586 | +#if IS_ENABLED(CONFIG_USB_DWC2_PERIPHERAL) || \ | ||
2587 | + IS_ENABLED(CONFIG_USB_DWC2_DUAL_ROLE) | ||
2588 | + /* Postponed adding a new gadget to the udc class driver list */ | ||
2589 | + if (hsotg->gadget_enabled) { | ||
2590 | + retval = usb_add_gadget_udc(hsotg->dev, &hsotg->gadget); | ||
2591 | + if (retval) { | ||
2592 | + dwc2_hsotg_remove(hsotg); | ||
2593 | + goto error; | ||
2594 | + } | ||
2595 | + } | ||
2596 | +#endif /* CONFIG_USB_DWC2_PERIPHERAL || CONFIG_USB_DWC2_DUAL_ROLE */ | ||
2597 | return 0; | ||
2598 | |||
2599 | error: | ||
2600 | diff --git a/drivers/usb/gadget/udc/mv_udc_core.c b/drivers/usb/gadget/udc/mv_udc_core.c | ||
2601 | index cafde053788b..80a1b52c656e 100644 | ||
2602 | --- a/drivers/usb/gadget/udc/mv_udc_core.c | ||
2603 | +++ b/drivers/usb/gadget/udc/mv_udc_core.c | ||
2604 | @@ -2313,7 +2313,8 @@ static int mv_udc_probe(struct platform_device *pdev) | ||
2605 | return 0; | ||
2606 | |||
2607 | err_create_workqueue: | ||
2608 | - destroy_workqueue(udc->qwork); | ||
2609 | + if (udc->qwork) | ||
2610 | + destroy_workqueue(udc->qwork); | ||
2611 | err_destroy_dma: | ||
2612 | dma_pool_destroy(udc->dtd_pool); | ||
2613 | err_free_dma: | ||
2614 | diff --git a/drivers/usb/host/ehci-exynos.c b/drivers/usb/host/ehci-exynos.c | ||
2615 | index 01debfd03d4a..84d59a611511 100644 | ||
2616 | --- a/drivers/usb/host/ehci-exynos.c | ||
2617 | +++ b/drivers/usb/host/ehci-exynos.c | ||
2618 | @@ -203,9 +203,8 @@ static int exynos_ehci_probe(struct platform_device *pdev) | ||
2619 | hcd->rsrc_len = resource_size(res); | ||
2620 | |||
2621 | irq = platform_get_irq(pdev, 0); | ||
2622 | - if (!irq) { | ||
2623 | - dev_err(&pdev->dev, "Failed to get IRQ\n"); | ||
2624 | - err = -ENODEV; | ||
2625 | + if (irq < 0) { | ||
2626 | + err = irq; | ||
2627 | goto fail_io; | ||
2628 | } | ||
2629 | |||
2630 | diff --git a/drivers/usb/host/ehci-pci.c b/drivers/usb/host/ehci-pci.c | ||
2631 | index b0882c13a1d1..66713c253765 100644 | ||
2632 | --- a/drivers/usb/host/ehci-pci.c | ||
2633 | +++ b/drivers/usb/host/ehci-pci.c | ||
2634 | @@ -216,6 +216,13 @@ static int ehci_pci_setup(struct usb_hcd *hcd) | ||
2635 | ehci_info(ehci, "applying MosChip frame-index workaround\n"); | ||
2636 | ehci->frame_index_bug = 1; | ||
2637 | break; | ||
2638 | + case PCI_VENDOR_ID_HUAWEI: | ||
2639 | + /* Synopsys HC bug */ | ||
2640 | + if (pdev->device == 0xa239) { | ||
2641 | + ehci_info(ehci, "applying Synopsys HC workaround\n"); | ||
2642 | + ehci->has_synopsys_hc_bug = 1; | ||
2643 | + } | ||
2644 | + break; | ||
2645 | } | ||
2646 | |||
2647 | /* optional debug port, normally in the first BAR */ | ||
2648 | diff --git a/drivers/usb/host/ohci-sm501.c b/drivers/usb/host/ohci-sm501.c | ||
2649 | index cff965240327..b91d50da6127 100644 | ||
2650 | --- a/drivers/usb/host/ohci-sm501.c | ||
2651 | +++ b/drivers/usb/host/ohci-sm501.c | ||
2652 | @@ -191,6 +191,7 @@ static int ohci_hcd_sm501_drv_remove(struct platform_device *pdev) | ||
2653 | struct resource *mem; | ||
2654 | |||
2655 | usb_remove_hcd(hcd); | ||
2656 | + iounmap(hcd->regs); | ||
2657 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); | ||
2658 | usb_put_hcd(hcd); | ||
2659 | mem = platform_get_resource(pdev, IORESOURCE_MEM, 1); | ||
2660 | diff --git a/drivers/usb/host/xhci-mtk.c b/drivers/usb/host/xhci-mtk.c | ||
2661 | index b18a6baef204..85f1ff0399a9 100644 | ||
2662 | --- a/drivers/usb/host/xhci-mtk.c | ||
2663 | +++ b/drivers/usb/host/xhci-mtk.c | ||
2664 | @@ -592,6 +592,9 @@ static int xhci_mtk_remove(struct platform_device *dev) | ||
2665 | struct xhci_hcd *xhci = hcd_to_xhci(hcd); | ||
2666 | struct usb_hcd *shared_hcd = xhci->shared_hcd; | ||
2667 | |||
2668 | + pm_runtime_put_noidle(&dev->dev); | ||
2669 | + pm_runtime_disable(&dev->dev); | ||
2670 | + | ||
2671 | usb_remove_hcd(shared_hcd); | ||
2672 | xhci->shared_hcd = NULL; | ||
2673 | device_init_wakeup(&dev->dev, false); | ||
2674 | @@ -602,8 +605,6 @@ static int xhci_mtk_remove(struct platform_device *dev) | ||
2675 | xhci_mtk_sch_exit(mtk); | ||
2676 | xhci_mtk_clks_disable(mtk); | ||
2677 | xhci_mtk_ldos_disable(mtk); | ||
2678 | - pm_runtime_put_sync(&dev->dev); | ||
2679 | - pm_runtime_disable(&dev->dev); | ||
2680 | |||
2681 | return 0; | ||
2682 | } | ||
2683 | diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c | ||
2684 | index 81b54a3d2910..11a65854d3f0 100644 | ||
2685 | --- a/drivers/usb/host/xhci.c | ||
2686 | +++ b/drivers/usb/host/xhci.c | ||
2687 | @@ -1430,6 +1430,7 @@ static int xhci_check_maxpacket(struct xhci_hcd *xhci, unsigned int slot_id, | ||
2688 | xhci->devs[slot_id]->out_ctx, ep_index); | ||
2689 | |||
2690 | ep_ctx = xhci_get_ep_ctx(xhci, command->in_ctx, ep_index); | ||
2691 | + ep_ctx->ep_info &= cpu_to_le32(~EP_STATE_MASK);/* must clear */ | ||
2692 | ep_ctx->ep_info2 &= cpu_to_le32(~MAX_PACKET_MASK); | ||
2693 | ep_ctx->ep_info2 |= cpu_to_le32(MAX_PACKET(max_packet_size)); | ||
2694 | |||
2695 | @@ -4390,6 +4391,9 @@ static int xhci_set_usb2_hardware_lpm(struct usb_hcd *hcd, | ||
2696 | int hird, exit_latency; | ||
2697 | int ret; | ||
2698 | |||
2699 | + if (xhci->quirks & XHCI_HW_LPM_DISABLE) | ||
2700 | + return -EPERM; | ||
2701 | + | ||
2702 | if (hcd->speed >= HCD_USB3 || !xhci->hw_lpm_support || | ||
2703 | !udev->lpm_capable) | ||
2704 | return -EPERM; | ||
2705 | @@ -4412,7 +4416,7 @@ static int xhci_set_usb2_hardware_lpm(struct usb_hcd *hcd, | ||
2706 | xhci_dbg(xhci, "%s port %d USB2 hardware LPM\n", | ||
2707 | enable ? "enable" : "disable", port_num + 1); | ||
2708 | |||
2709 | - if (enable && !(xhci->quirks & XHCI_HW_LPM_DISABLE)) { | ||
2710 | + if (enable) { | ||
2711 | /* Host supports BESL timeout instead of HIRD */ | ||
2712 | if (udev->usb2_hw_lpm_besl_capable) { | ||
2713 | /* if device doesn't have a preferred BESL value use a | ||
2714 | @@ -4471,6 +4475,9 @@ static int xhci_set_usb2_hardware_lpm(struct usb_hcd *hcd, | ||
2715 | mutex_lock(hcd->bandwidth_mutex); | ||
2716 | xhci_change_max_exit_latency(xhci, udev, 0); | ||
2717 | mutex_unlock(hcd->bandwidth_mutex); | ||
2718 | + readl_poll_timeout(ports[port_num]->addr, pm_val, | ||
2719 | + (pm_val & PORT_PLS_MASK) == XDEV_U0, | ||
2720 | + 100, 10000); | ||
2721 | return 0; | ||
2722 | } | ||
2723 | } | ||
2724 | diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h | ||
2725 | index 23a1abdc2b43..c656b41b57b5 100644 | ||
2726 | --- a/drivers/usb/host/xhci.h | ||
2727 | +++ b/drivers/usb/host/xhci.h | ||
2728 | @@ -716,7 +716,7 @@ struct xhci_ep_ctx { | ||
2729 | * 4 - TRB error | ||
2730 | * 5-7 - reserved | ||
2731 | */ | ||
2732 | -#define EP_STATE_MASK (0xf) | ||
2733 | +#define EP_STATE_MASK (0x7) | ||
2734 | #define EP_STATE_DISABLED 0 | ||
2735 | #define EP_STATE_RUNNING 1 | ||
2736 | #define EP_STATE_HALTED 2 | ||
2737 | diff --git a/drivers/usb/renesas_usbhs/fifo.c b/drivers/usb/renesas_usbhs/fifo.c | ||
2738 | index 86637cd066cf..05cdad13933b 100644 | ||
2739 | --- a/drivers/usb/renesas_usbhs/fifo.c | ||
2740 | +++ b/drivers/usb/renesas_usbhs/fifo.c | ||
2741 | @@ -803,7 +803,8 @@ static int __usbhsf_dma_map_ctrl(struct usbhs_pkt *pkt, int map) | ||
2742 | return info->dma_map_ctrl(chan->device->dev, pkt, map); | ||
2743 | } | ||
2744 | |||
2745 | -static void usbhsf_dma_complete(void *arg); | ||
2746 | +static void usbhsf_dma_complete(void *arg, | ||
2747 | + const struct dmaengine_result *result); | ||
2748 | static void usbhsf_dma_xfer_preparing(struct usbhs_pkt *pkt) | ||
2749 | { | ||
2750 | struct usbhs_pipe *pipe = pkt->pipe; | ||
2751 | @@ -813,6 +814,7 @@ static void usbhsf_dma_xfer_preparing(struct usbhs_pkt *pkt) | ||
2752 | struct dma_chan *chan; | ||
2753 | struct device *dev = usbhs_priv_to_dev(priv); | ||
2754 | enum dma_transfer_direction dir; | ||
2755 | + dma_cookie_t cookie; | ||
2756 | |||
2757 | fifo = usbhs_pipe_to_fifo(pipe); | ||
2758 | if (!fifo) | ||
2759 | @@ -827,11 +829,11 @@ static void usbhsf_dma_xfer_preparing(struct usbhs_pkt *pkt) | ||
2760 | if (!desc) | ||
2761 | return; | ||
2762 | |||
2763 | - desc->callback = usbhsf_dma_complete; | ||
2764 | - desc->callback_param = pipe; | ||
2765 | + desc->callback_result = usbhsf_dma_complete; | ||
2766 | + desc->callback_param = pkt; | ||
2767 | |||
2768 | - pkt->cookie = dmaengine_submit(desc); | ||
2769 | - if (pkt->cookie < 0) { | ||
2770 | + cookie = dmaengine_submit(desc); | ||
2771 | + if (cookie < 0) { | ||
2772 | dev_err(dev, "Failed to submit dma descriptor\n"); | ||
2773 | return; | ||
2774 | } | ||
2775 | @@ -1152,12 +1154,10 @@ static size_t usbhs_dma_calc_received_size(struct usbhs_pkt *pkt, | ||
2776 | struct dma_chan *chan, int dtln) | ||
2777 | { | ||
2778 | struct usbhs_pipe *pipe = pkt->pipe; | ||
2779 | - struct dma_tx_state state; | ||
2780 | size_t received_size; | ||
2781 | int maxp = usbhs_pipe_get_maxpacket(pipe); | ||
2782 | |||
2783 | - dmaengine_tx_status(chan, pkt->cookie, &state); | ||
2784 | - received_size = pkt->length - state.residue; | ||
2785 | + received_size = pkt->length - pkt->dma_result->residue; | ||
2786 | |||
2787 | if (dtln) { | ||
2788 | received_size -= USBHS_USB_DMAC_XFER_SIZE; | ||
2789 | @@ -1363,13 +1363,16 @@ static int usbhsf_irq_ready(struct usbhs_priv *priv, | ||
2790 | return 0; | ||
2791 | } | ||
2792 | |||
2793 | -static void usbhsf_dma_complete(void *arg) | ||
2794 | +static void usbhsf_dma_complete(void *arg, | ||
2795 | + const struct dmaengine_result *result) | ||
2796 | { | ||
2797 | - struct usbhs_pipe *pipe = arg; | ||
2798 | + struct usbhs_pkt *pkt = arg; | ||
2799 | + struct usbhs_pipe *pipe = pkt->pipe; | ||
2800 | struct usbhs_priv *priv = usbhs_pipe_to_priv(pipe); | ||
2801 | struct device *dev = usbhs_priv_to_dev(priv); | ||
2802 | int ret; | ||
2803 | |||
2804 | + pkt->dma_result = result; | ||
2805 | ret = usbhsf_pkt_handler(pipe, USBHSF_PKT_DMA_DONE); | ||
2806 | if (ret < 0) | ||
2807 | dev_err(dev, "dma_complete run_error %d : %d\n", | ||
2808 | diff --git a/drivers/usb/renesas_usbhs/fifo.h b/drivers/usb/renesas_usbhs/fifo.h | ||
2809 | index c3d3cc35cee0..4a7dc23ce3d3 100644 | ||
2810 | --- a/drivers/usb/renesas_usbhs/fifo.h | ||
2811 | +++ b/drivers/usb/renesas_usbhs/fifo.h | ||
2812 | @@ -50,7 +50,7 @@ struct usbhs_pkt { | ||
2813 | struct usbhs_pkt *pkt); | ||
2814 | struct work_struct work; | ||
2815 | dma_addr_t dma; | ||
2816 | - dma_cookie_t cookie; | ||
2817 | + const struct dmaengine_result *dma_result; | ||
2818 | void *buf; | ||
2819 | int length; | ||
2820 | int trans; | ||
2821 | diff --git a/drivers/usb/typec/tcpm/tcpci_rt1711h.c b/drivers/usb/typec/tcpm/tcpci_rt1711h.c | ||
2822 | index 017389021b96..b56a0880a044 100644 | ||
2823 | --- a/drivers/usb/typec/tcpm/tcpci_rt1711h.c | ||
2824 | +++ b/drivers/usb/typec/tcpm/tcpci_rt1711h.c | ||
2825 | @@ -179,26 +179,6 @@ out: | ||
2826 | return tcpci_irq(chip->tcpci); | ||
2827 | } | ||
2828 | |||
2829 | -static int rt1711h_init_alert(struct rt1711h_chip *chip, | ||
2830 | - struct i2c_client *client) | ||
2831 | -{ | ||
2832 | - int ret; | ||
2833 | - | ||
2834 | - /* Disable chip interrupts before requesting irq */ | ||
2835 | - ret = rt1711h_write16(chip, TCPC_ALERT_MASK, 0); | ||
2836 | - if (ret < 0) | ||
2837 | - return ret; | ||
2838 | - | ||
2839 | - ret = devm_request_threaded_irq(chip->dev, client->irq, NULL, | ||
2840 | - rt1711h_irq, | ||
2841 | - IRQF_ONESHOT | IRQF_TRIGGER_LOW, | ||
2842 | - dev_name(chip->dev), chip); | ||
2843 | - if (ret < 0) | ||
2844 | - return ret; | ||
2845 | - enable_irq_wake(client->irq); | ||
2846 | - return 0; | ||
2847 | -} | ||
2848 | - | ||
2849 | static int rt1711h_sw_reset(struct rt1711h_chip *chip) | ||
2850 | { | ||
2851 | int ret; | ||
2852 | @@ -260,7 +240,8 @@ static int rt1711h_probe(struct i2c_client *client, | ||
2853 | if (ret < 0) | ||
2854 | return ret; | ||
2855 | |||
2856 | - ret = rt1711h_init_alert(chip, client); | ||
2857 | + /* Disable chip interrupts before requesting irq */ | ||
2858 | + ret = rt1711h_write16(chip, TCPC_ALERT_MASK, 0); | ||
2859 | if (ret < 0) | ||
2860 | return ret; | ||
2861 | |||
2862 | @@ -271,6 +252,14 @@ static int rt1711h_probe(struct i2c_client *client, | ||
2863 | if (IS_ERR_OR_NULL(chip->tcpci)) | ||
2864 | return PTR_ERR(chip->tcpci); | ||
2865 | |||
2866 | + ret = devm_request_threaded_irq(chip->dev, client->irq, NULL, | ||
2867 | + rt1711h_irq, | ||
2868 | + IRQF_ONESHOT | IRQF_TRIGGER_LOW, | ||
2869 | + dev_name(chip->dev), chip); | ||
2870 | + if (ret < 0) | ||
2871 | + return ret; | ||
2872 | + enable_irq_wake(client->irq); | ||
2873 | + | ||
2874 | return 0; | ||
2875 | } | ||
2876 | |||
2877 | diff --git a/fs/afs/cell.c b/fs/afs/cell.c | ||
2878 | index 78ba5f932287..296b489861a9 100644 | ||
2879 | --- a/fs/afs/cell.c | ||
2880 | +++ b/fs/afs/cell.c | ||
2881 | @@ -154,10 +154,17 @@ static struct afs_cell *afs_alloc_cell(struct afs_net *net, | ||
2882 | return ERR_PTR(-ENOMEM); | ||
2883 | } | ||
2884 | |||
2885 | + cell->name = kmalloc(namelen + 1, GFP_KERNEL); | ||
2886 | + if (!cell->name) { | ||
2887 | + kfree(cell); | ||
2888 | + return ERR_PTR(-ENOMEM); | ||
2889 | + } | ||
2890 | + | ||
2891 | cell->net = net; | ||
2892 | cell->name_len = namelen; | ||
2893 | for (i = 0; i < namelen; i++) | ||
2894 | cell->name[i] = tolower(name[i]); | ||
2895 | + cell->name[i] = 0; | ||
2896 | |||
2897 | atomic_set(&cell->usage, 2); | ||
2898 | INIT_WORK(&cell->manager, afs_manage_cell); | ||
2899 | @@ -203,6 +210,7 @@ parse_failed: | ||
2900 | if (ret == -EINVAL) | ||
2901 | printk(KERN_ERR "kAFS: bad VL server IP address\n"); | ||
2902 | error: | ||
2903 | + kfree(cell->name); | ||
2904 | kfree(cell); | ||
2905 | _leave(" = %d", ret); | ||
2906 | return ERR_PTR(ret); | ||
2907 | @@ -483,6 +491,7 @@ static void afs_cell_destroy(struct rcu_head *rcu) | ||
2908 | |||
2909 | afs_put_vlserverlist(cell->net, rcu_access_pointer(cell->vl_servers)); | ||
2910 | key_put(cell->anonymous_key); | ||
2911 | + kfree(cell->name); | ||
2912 | kfree(cell); | ||
2913 | |||
2914 | _leave(" [destroyed]"); | ||
2915 | diff --git a/fs/afs/internal.h b/fs/afs/internal.h | ||
2916 | index 555ad7c9afcb..7fe88d918b23 100644 | ||
2917 | --- a/fs/afs/internal.h | ||
2918 | +++ b/fs/afs/internal.h | ||
2919 | @@ -397,7 +397,7 @@ struct afs_cell { | ||
2920 | struct afs_vlserver_list __rcu *vl_servers; | ||
2921 | |||
2922 | u8 name_len; /* Length of name */ | ||
2923 | - char name[64 + 1]; /* Cell name, case-flattened and NUL-padded */ | ||
2924 | + char *name; /* Cell name, case-flattened and NUL-padded */ | ||
2925 | }; | ||
2926 | |||
2927 | /* | ||
2928 | diff --git a/fs/btrfs/block-group.c b/fs/btrfs/block-group.c | ||
2929 | index c2dd94e1b274..42d69e77f89d 100644 | ||
2930 | --- a/fs/btrfs/block-group.c | ||
2931 | +++ b/fs/btrfs/block-group.c | ||
2932 | @@ -910,7 +910,7 @@ int btrfs_remove_block_group(struct btrfs_trans_handle *trans, | ||
2933 | path = btrfs_alloc_path(); | ||
2934 | if (!path) { | ||
2935 | ret = -ENOMEM; | ||
2936 | - goto out_put_group; | ||
2937 | + goto out; | ||
2938 | } | ||
2939 | |||
2940 | /* | ||
2941 | @@ -948,7 +948,7 @@ int btrfs_remove_block_group(struct btrfs_trans_handle *trans, | ||
2942 | ret = btrfs_orphan_add(trans, BTRFS_I(inode)); | ||
2943 | if (ret) { | ||
2944 | btrfs_add_delayed_iput(inode); | ||
2945 | - goto out_put_group; | ||
2946 | + goto out; | ||
2947 | } | ||
2948 | clear_nlink(inode); | ||
2949 | /* One for the block groups ref */ | ||
2950 | @@ -971,13 +971,13 @@ int btrfs_remove_block_group(struct btrfs_trans_handle *trans, | ||
2951 | |||
2952 | ret = btrfs_search_slot(trans, tree_root, &key, path, -1, 1); | ||
2953 | if (ret < 0) | ||
2954 | - goto out_put_group; | ||
2955 | + goto out; | ||
2956 | if (ret > 0) | ||
2957 | btrfs_release_path(path); | ||
2958 | if (ret == 0) { | ||
2959 | ret = btrfs_del_item(trans, tree_root, path); | ||
2960 | if (ret) | ||
2961 | - goto out_put_group; | ||
2962 | + goto out; | ||
2963 | btrfs_release_path(path); | ||
2964 | } | ||
2965 | |||
2966 | @@ -986,6 +986,9 @@ int btrfs_remove_block_group(struct btrfs_trans_handle *trans, | ||
2967 | &fs_info->block_group_cache_tree); | ||
2968 | RB_CLEAR_NODE(&block_group->cache_node); | ||
2969 | |||
2970 | + /* Once for the block groups rbtree */ | ||
2971 | + btrfs_put_block_group(block_group); | ||
2972 | + | ||
2973 | if (fs_info->first_logical_byte == block_group->key.objectid) | ||
2974 | fs_info->first_logical_byte = (u64)-1; | ||
2975 | spin_unlock(&fs_info->block_group_cache_lock); | ||
2976 | @@ -1094,10 +1097,7 @@ int btrfs_remove_block_group(struct btrfs_trans_handle *trans, | ||
2977 | |||
2978 | ret = remove_block_group_free_space(trans, block_group); | ||
2979 | if (ret) | ||
2980 | - goto out_put_group; | ||
2981 | - | ||
2982 | - /* Once for the block groups rbtree */ | ||
2983 | - btrfs_put_block_group(block_group); | ||
2984 | + goto out; | ||
2985 | |||
2986 | ret = btrfs_search_slot(trans, root, &key, path, -1, 1); | ||
2987 | if (ret > 0) | ||
2988 | @@ -1120,10 +1120,9 @@ int btrfs_remove_block_group(struct btrfs_trans_handle *trans, | ||
2989 | free_extent_map(em); | ||
2990 | } | ||
2991 | |||
2992 | -out_put_group: | ||
2993 | +out: | ||
2994 | /* Once for the lookup reference */ | ||
2995 | btrfs_put_block_group(block_group); | ||
2996 | -out: | ||
2997 | if (remove_rsv) | ||
2998 | btrfs_delayed_refs_rsv_release(fs_info, 1); | ||
2999 | btrfs_free_path(path); | ||
3000 | diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h | ||
3001 | index 6d2c277c6e0a..36cd210ee2ef 100644 | ||
3002 | --- a/fs/btrfs/ctree.h | ||
3003 | +++ b/fs/btrfs/ctree.h | ||
3004 | @@ -940,6 +940,8 @@ enum { | ||
3005 | BTRFS_ROOT_DEAD_RELOC_TREE, | ||
3006 | /* Mark dead root stored on device whose cleanup needs to be resumed */ | ||
3007 | BTRFS_ROOT_DEAD_TREE, | ||
3008 | + /* The root has a log tree. Used only for subvolume roots. */ | ||
3009 | + BTRFS_ROOT_HAS_LOG_TREE, | ||
3010 | }; | ||
3011 | |||
3012 | /* | ||
3013 | diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c | ||
3014 | index 127cdecbe872..280c45c91ddc 100644 | ||
3015 | --- a/fs/btrfs/inode.c | ||
3016 | +++ b/fs/btrfs/inode.c | ||
3017 | @@ -975,6 +975,7 @@ static noinline int cow_file_range(struct inode *inode, | ||
3018 | u64 num_bytes; | ||
3019 | unsigned long ram_size; | ||
3020 | u64 cur_alloc_size = 0; | ||
3021 | + u64 min_alloc_size; | ||
3022 | u64 blocksize = fs_info->sectorsize; | ||
3023 | struct btrfs_key ins; | ||
3024 | struct extent_map *em; | ||
3025 | @@ -1025,10 +1026,26 @@ static noinline int cow_file_range(struct inode *inode, | ||
3026 | btrfs_drop_extent_cache(BTRFS_I(inode), start, | ||
3027 | start + num_bytes - 1, 0); | ||
3028 | |||
3029 | + /* | ||
3030 | + * Relocation relies on the relocated extents to have exactly the same | ||
3031 | + * size as the original extents. Normally writeback for relocation data | ||
3032 | + * extents follows a NOCOW path because relocation preallocates the | ||
3033 | + * extents. However, due to an operation such as scrub turning a block | ||
3034 | + * group to RO mode, it may fallback to COW mode, so we must make sure | ||
3035 | + * an extent allocated during COW has exactly the requested size and can | ||
3036 | + * not be split into smaller extents, otherwise relocation breaks and | ||
3037 | + * fails during the stage where it updates the bytenr of file extent | ||
3038 | + * items. | ||
3039 | + */ | ||
3040 | + if (root->root_key.objectid == BTRFS_DATA_RELOC_TREE_OBJECTID) | ||
3041 | + min_alloc_size = num_bytes; | ||
3042 | + else | ||
3043 | + min_alloc_size = fs_info->sectorsize; | ||
3044 | + | ||
3045 | while (num_bytes > 0) { | ||
3046 | cur_alloc_size = num_bytes; | ||
3047 | ret = btrfs_reserve_extent(root, cur_alloc_size, cur_alloc_size, | ||
3048 | - fs_info->sectorsize, 0, alloc_hint, | ||
3049 | + min_alloc_size, 0, alloc_hint, | ||
3050 | &ins, 1, 1); | ||
3051 | if (ret < 0) | ||
3052 | goto out_unlock; | ||
3053 | @@ -1328,6 +1345,8 @@ static int fallback_to_cow(struct inode *inode, struct page *locked_page, | ||
3054 | int *page_started, unsigned long *nr_written) | ||
3055 | { | ||
3056 | const bool is_space_ino = btrfs_is_free_space_inode(BTRFS_I(inode)); | ||
3057 | + const bool is_reloc_ino = (BTRFS_I(inode)->root->root_key.objectid == | ||
3058 | + BTRFS_DATA_RELOC_TREE_OBJECTID); | ||
3059 | const u64 range_bytes = end + 1 - start; | ||
3060 | struct extent_io_tree *io_tree = &BTRFS_I(inode)->io_tree; | ||
3061 | u64 range_start = start; | ||
3062 | @@ -1358,18 +1377,23 @@ static int fallback_to_cow(struct inode *inode, struct page *locked_page, | ||
3063 | * data space info, which we incremented in the step above. | ||
3064 | * | ||
3065 | * If we need to fallback to cow and the inode corresponds to a free | ||
3066 | - * space cache inode, we must also increment bytes_may_use of the data | ||
3067 | - * space_info for the same reason. Space caches always get a prealloc | ||
3068 | + * space cache inode or an inode of the data relocation tree, we must | ||
3069 | + * also increment bytes_may_use of the data space_info for the same | ||
3070 | + * reason. Space caches and relocated data extents always get a prealloc | ||
3071 | * extent for them, however scrub or balance may have set the block | ||
3072 | - * group that contains that extent to RO mode. | ||
3073 | + * group that contains that extent to RO mode and therefore force COW | ||
3074 | + * when starting writeback. | ||
3075 | */ | ||
3076 | count = count_range_bits(io_tree, &range_start, end, range_bytes, | ||
3077 | EXTENT_NORESERVE, 0); | ||
3078 | - if (count > 0 || is_space_ino) { | ||
3079 | - const u64 bytes = is_space_ino ? range_bytes : count; | ||
3080 | + if (count > 0 || is_space_ino || is_reloc_ino) { | ||
3081 | + u64 bytes = count; | ||
3082 | struct btrfs_fs_info *fs_info = BTRFS_I(inode)->root->fs_info; | ||
3083 | struct btrfs_space_info *sinfo = fs_info->data_sinfo; | ||
3084 | |||
3085 | + if (is_space_ino || is_reloc_ino) | ||
3086 | + bytes = range_bytes; | ||
3087 | + | ||
3088 | spin_lock(&sinfo->lock); | ||
3089 | btrfs_space_info_update_bytes_may_use(fs_info, sinfo, bytes); | ||
3090 | spin_unlock(&sinfo->lock); | ||
3091 | @@ -8833,9 +8857,6 @@ static ssize_t btrfs_direct_IO(struct kiocb *iocb, struct iov_iter *iter) | ||
3092 | dio_data.overwrite = 1; | ||
3093 | inode_unlock(inode); | ||
3094 | relock = true; | ||
3095 | - } else if (iocb->ki_flags & IOCB_NOWAIT) { | ||
3096 | - ret = -EAGAIN; | ||
3097 | - goto out; | ||
3098 | } | ||
3099 | ret = btrfs_delalloc_reserve_space(inode, &data_reserved, | ||
3100 | offset, count); | ||
3101 | diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c | ||
3102 | index 7d464b049507..f46afbff668e 100644 | ||
3103 | --- a/fs/btrfs/tree-log.c | ||
3104 | +++ b/fs/btrfs/tree-log.c | ||
3105 | @@ -167,6 +167,7 @@ static int start_log_trans(struct btrfs_trans_handle *trans, | ||
3106 | if (ret) | ||
3107 | goto out; | ||
3108 | |||
3109 | + set_bit(BTRFS_ROOT_HAS_LOG_TREE, &root->state); | ||
3110 | clear_bit(BTRFS_ROOT_MULTI_LOG_TASKS, &root->state); | ||
3111 | root->log_start_pid = current->pid; | ||
3112 | } | ||
3113 | @@ -193,6 +194,9 @@ static int join_running_log_trans(struct btrfs_root *root) | ||
3114 | { | ||
3115 | int ret = -ENOENT; | ||
3116 | |||
3117 | + if (!test_bit(BTRFS_ROOT_HAS_LOG_TREE, &root->state)) | ||
3118 | + return ret; | ||
3119 | + | ||
3120 | mutex_lock(&root->log_mutex); | ||
3121 | if (root->log_root) { | ||
3122 | ret = 0; | ||
3123 | @@ -3327,6 +3331,7 @@ int btrfs_free_log(struct btrfs_trans_handle *trans, struct btrfs_root *root) | ||
3124 | if (root->log_root) { | ||
3125 | free_log_tree(trans, root->log_root); | ||
3126 | root->log_root = NULL; | ||
3127 | + clear_bit(BTRFS_ROOT_HAS_LOG_TREE, &root->state); | ||
3128 | } | ||
3129 | return 0; | ||
3130 | } | ||
3131 | diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c | ||
3132 | index 58915d882285..7ccbfc656478 100644 | ||
3133 | --- a/fs/cifs/smb2ops.c | ||
3134 | +++ b/fs/cifs/smb2ops.c | ||
3135 | @@ -736,6 +736,7 @@ int open_shroot(unsigned int xid, struct cifs_tcon *tcon, struct cifs_fid *pfid) | ||
3136 | /* close extra handle outside of crit sec */ | ||
3137 | SMB2_close(xid, tcon, fid.persistent_fid, fid.volatile_fid); | ||
3138 | } | ||
3139 | + rc = 0; | ||
3140 | goto oshr_free; | ||
3141 | } | ||
3142 | |||
3143 | @@ -2969,6 +2970,11 @@ static long smb3_zero_range(struct file *file, struct cifs_tcon *tcon, | ||
3144 | trace_smb3_zero_enter(xid, cfile->fid.persistent_fid, tcon->tid, | ||
3145 | ses->Suid, offset, len); | ||
3146 | |||
3147 | + /* | ||
3148 | + * We zero the range through ioctl, so we need remove the page caches | ||
3149 | + * first, otherwise the data may be inconsistent with the server. | ||
3150 | + */ | ||
3151 | + truncate_pagecache_range(inode, offset, offset + len - 1); | ||
3152 | |||
3153 | /* if file not oplocked can't be sure whether asking to extend size */ | ||
3154 | if (!CIFS_CACHE_READ(cifsi)) | ||
3155 | @@ -3035,6 +3041,12 @@ static long smb3_punch_hole(struct file *file, struct cifs_tcon *tcon, | ||
3156 | return rc; | ||
3157 | } | ||
3158 | |||
3159 | + /* | ||
3160 | + * We implement the punch hole through ioctl, so we need remove the page | ||
3161 | + * caches first, otherwise the data may be inconsistent with the server. | ||
3162 | + */ | ||
3163 | + truncate_pagecache_range(inode, offset, offset + len - 1); | ||
3164 | + | ||
3165 | cifs_dbg(FYI, "Offset %lld len %lld\n", offset, len); | ||
3166 | |||
3167 | fsctl_buf.FileOffset = cpu_to_le64(offset); | ||
3168 | diff --git a/fs/erofs/zdata.h b/fs/erofs/zdata.h | ||
3169 | index faf950189bd7..568d5a493876 100644 | ||
3170 | --- a/fs/erofs/zdata.h | ||
3171 | +++ b/fs/erofs/zdata.h | ||
3172 | @@ -148,22 +148,22 @@ static inline void z_erofs_onlinepage_init(struct page *page) | ||
3173 | static inline void z_erofs_onlinepage_fixup(struct page *page, | ||
3174 | uintptr_t index, bool down) | ||
3175 | { | ||
3176 | - unsigned long *p, o, v, id; | ||
3177 | -repeat: | ||
3178 | - p = &page_private(page); | ||
3179 | - o = READ_ONCE(*p); | ||
3180 | + union z_erofs_onlinepage_converter u = { .v = &page_private(page) }; | ||
3181 | + int orig, orig_index, val; | ||
3182 | |||
3183 | - id = o >> Z_EROFS_ONLINEPAGE_INDEX_SHIFT; | ||
3184 | - if (id) { | ||
3185 | +repeat: | ||
3186 | + orig = atomic_read(u.o); | ||
3187 | + orig_index = orig >> Z_EROFS_ONLINEPAGE_INDEX_SHIFT; | ||
3188 | + if (orig_index) { | ||
3189 | if (!index) | ||
3190 | return; | ||
3191 | |||
3192 | - DBG_BUGON(id != index); | ||
3193 | + DBG_BUGON(orig_index != index); | ||
3194 | } | ||
3195 | |||
3196 | - v = (index << Z_EROFS_ONLINEPAGE_INDEX_SHIFT) | | ||
3197 | - ((o & Z_EROFS_ONLINEPAGE_COUNT_MASK) + (unsigned int)down); | ||
3198 | - if (cmpxchg(p, o, v) != o) | ||
3199 | + val = (index << Z_EROFS_ONLINEPAGE_INDEX_SHIFT) | | ||
3200 | + ((orig & Z_EROFS_ONLINEPAGE_COUNT_MASK) + (unsigned int)down); | ||
3201 | + if (atomic_cmpxchg(u.o, orig, val) != orig) | ||
3202 | goto repeat; | ||
3203 | } | ||
3204 | |||
3205 | diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c | ||
3206 | index 6b0bf4ebd812..70cf8c5760c7 100644 | ||
3207 | --- a/fs/nfs/direct.c | ||
3208 | +++ b/fs/nfs/direct.c | ||
3209 | @@ -367,8 +367,6 @@ static void nfs_direct_complete(struct nfs_direct_req *dreq) | ||
3210 | { | ||
3211 | struct inode *inode = dreq->inode; | ||
3212 | |||
3213 | - inode_dio_end(inode); | ||
3214 | - | ||
3215 | if (dreq->iocb) { | ||
3216 | long res = (long) dreq->error; | ||
3217 | if (dreq->count != 0) { | ||
3218 | @@ -380,7 +378,10 @@ static void nfs_direct_complete(struct nfs_direct_req *dreq) | ||
3219 | |||
3220 | complete(&dreq->completion); | ||
3221 | |||
3222 | + igrab(inode); | ||
3223 | nfs_direct_req_release(dreq); | ||
3224 | + inode_dio_end(inode); | ||
3225 | + iput(inode); | ||
3226 | } | ||
3227 | |||
3228 | static void nfs_direct_read_completion(struct nfs_pgio_header *hdr) | ||
3229 | @@ -510,8 +511,10 @@ static ssize_t nfs_direct_read_schedule_iovec(struct nfs_direct_req *dreq, | ||
3230 | * generic layer handle the completion. | ||
3231 | */ | ||
3232 | if (requested_bytes == 0) { | ||
3233 | - inode_dio_end(inode); | ||
3234 | + igrab(inode); | ||
3235 | nfs_direct_req_release(dreq); | ||
3236 | + inode_dio_end(inode); | ||
3237 | + iput(inode); | ||
3238 | return result < 0 ? result : -EIO; | ||
3239 | } | ||
3240 | |||
3241 | @@ -923,8 +926,10 @@ static ssize_t nfs_direct_write_schedule_iovec(struct nfs_direct_req *dreq, | ||
3242 | * generic layer handle the completion. | ||
3243 | */ | ||
3244 | if (requested_bytes == 0) { | ||
3245 | - inode_dio_end(inode); | ||
3246 | + igrab(inode); | ||
3247 | nfs_direct_req_release(dreq); | ||
3248 | + inode_dio_end(inode); | ||
3249 | + iput(inode); | ||
3250 | return result < 0 ? result : -EIO; | ||
3251 | } | ||
3252 | |||
3253 | diff --git a/fs/nfs/file.c b/fs/nfs/file.c | ||
3254 | index 95dc90570786..7b3136753205 100644 | ||
3255 | --- a/fs/nfs/file.c | ||
3256 | +++ b/fs/nfs/file.c | ||
3257 | @@ -83,6 +83,7 @@ nfs_file_release(struct inode *inode, struct file *filp) | ||
3258 | dprintk("NFS: release(%pD2)\n", filp); | ||
3259 | |||
3260 | nfs_inc_stats(inode, NFSIOS_VFSRELEASE); | ||
3261 | + inode_dio_wait(inode); | ||
3262 | nfs_file_clear_open_context(filp); | ||
3263 | return 0; | ||
3264 | } | ||
3265 | diff --git a/fs/nfs/flexfilelayout/flexfilelayout.c b/fs/nfs/flexfilelayout/flexfilelayout.c | ||
3266 | index 5657b7f2611f..1741d902b0d8 100644 | ||
3267 | --- a/fs/nfs/flexfilelayout/flexfilelayout.c | ||
3268 | +++ b/fs/nfs/flexfilelayout/flexfilelayout.c | ||
3269 | @@ -984,9 +984,8 @@ retry: | ||
3270 | goto out_mds; | ||
3271 | |||
3272 | /* Use a direct mapping of ds_idx to pgio mirror_idx */ | ||
3273 | - if (WARN_ON_ONCE(pgio->pg_mirror_count != | ||
3274 | - FF_LAYOUT_MIRROR_COUNT(pgio->pg_lseg))) | ||
3275 | - goto out_mds; | ||
3276 | + if (pgio->pg_mirror_count != FF_LAYOUT_MIRROR_COUNT(pgio->pg_lseg)) | ||
3277 | + goto out_eagain; | ||
3278 | |||
3279 | for (i = 0; i < pgio->pg_mirror_count; i++) { | ||
3280 | mirror = FF_LAYOUT_COMP(pgio->pg_lseg, i); | ||
3281 | @@ -1008,7 +1007,10 @@ retry: | ||
3282 | (NFS_MOUNT_SOFT|NFS_MOUNT_SOFTERR)) | ||
3283 | pgio->pg_maxretrans = io_maxretrans; | ||
3284 | return; | ||
3285 | - | ||
3286 | +out_eagain: | ||
3287 | + pnfs_generic_pg_cleanup(pgio); | ||
3288 | + pgio->pg_error = -EAGAIN; | ||
3289 | + return; | ||
3290 | out_mds: | ||
3291 | trace_pnfs_mds_fallback_pg_init_write(pgio->pg_inode, | ||
3292 | 0, NFS4_MAX_UINT64, IOMODE_RW, | ||
3293 | @@ -1018,6 +1020,7 @@ out_mds: | ||
3294 | pgio->pg_lseg = NULL; | ||
3295 | pgio->pg_maxretrans = 0; | ||
3296 | nfs_pageio_reset_write_mds(pgio); | ||
3297 | + pgio->pg_error = -EAGAIN; | ||
3298 | } | ||
3299 | |||
3300 | static unsigned int | ||
3301 | diff --git a/fs/ocfs2/dlmglue.c b/fs/ocfs2/dlmglue.c | ||
3302 | index 8a2e284ccfcd..e2c34c704185 100644 | ||
3303 | --- a/fs/ocfs2/dlmglue.c | ||
3304 | +++ b/fs/ocfs2/dlmglue.c | ||
3305 | @@ -689,6 +689,12 @@ static void ocfs2_nfs_sync_lock_res_init(struct ocfs2_lock_res *res, | ||
3306 | &ocfs2_nfs_sync_lops, osb); | ||
3307 | } | ||
3308 | |||
3309 | +static void ocfs2_nfs_sync_lock_init(struct ocfs2_super *osb) | ||
3310 | +{ | ||
3311 | + ocfs2_nfs_sync_lock_res_init(&osb->osb_nfs_sync_lockres, osb); | ||
3312 | + init_rwsem(&osb->nfs_sync_rwlock); | ||
3313 | +} | ||
3314 | + | ||
3315 | void ocfs2_trim_fs_lock_res_init(struct ocfs2_super *osb) | ||
3316 | { | ||
3317 | struct ocfs2_lock_res *lockres = &osb->osb_trim_fs_lockres; | ||
3318 | @@ -2855,6 +2861,11 @@ int ocfs2_nfs_sync_lock(struct ocfs2_super *osb, int ex) | ||
3319 | if (ocfs2_is_hard_readonly(osb)) | ||
3320 | return -EROFS; | ||
3321 | |||
3322 | + if (ex) | ||
3323 | + down_write(&osb->nfs_sync_rwlock); | ||
3324 | + else | ||
3325 | + down_read(&osb->nfs_sync_rwlock); | ||
3326 | + | ||
3327 | if (ocfs2_mount_local(osb)) | ||
3328 | return 0; | ||
3329 | |||
3330 | @@ -2873,6 +2884,10 @@ void ocfs2_nfs_sync_unlock(struct ocfs2_super *osb, int ex) | ||
3331 | if (!ocfs2_mount_local(osb)) | ||
3332 | ocfs2_cluster_unlock(osb, lockres, | ||
3333 | ex ? LKM_EXMODE : LKM_PRMODE); | ||
3334 | + if (ex) | ||
3335 | + up_write(&osb->nfs_sync_rwlock); | ||
3336 | + else | ||
3337 | + up_read(&osb->nfs_sync_rwlock); | ||
3338 | } | ||
3339 | |||
3340 | int ocfs2_trim_fs_lock(struct ocfs2_super *osb, | ||
3341 | @@ -3340,7 +3355,7 @@ int ocfs2_dlm_init(struct ocfs2_super *osb) | ||
3342 | local: | ||
3343 | ocfs2_super_lock_res_init(&osb->osb_super_lockres, osb); | ||
3344 | ocfs2_rename_lock_res_init(&osb->osb_rename_lockres, osb); | ||
3345 | - ocfs2_nfs_sync_lock_res_init(&osb->osb_nfs_sync_lockres, osb); | ||
3346 | + ocfs2_nfs_sync_lock_init(osb); | ||
3347 | ocfs2_orphan_scan_lock_res_init(&osb->osb_orphan_scan.os_lockres, osb); | ||
3348 | |||
3349 | osb->cconn = conn; | ||
3350 | diff --git a/fs/ocfs2/ocfs2.h b/fs/ocfs2/ocfs2.h | ||
3351 | index 9150cfa4df7d..9461bd3e1c0c 100644 | ||
3352 | --- a/fs/ocfs2/ocfs2.h | ||
3353 | +++ b/fs/ocfs2/ocfs2.h | ||
3354 | @@ -394,6 +394,7 @@ struct ocfs2_super | ||
3355 | struct ocfs2_lock_res osb_super_lockres; | ||
3356 | struct ocfs2_lock_res osb_rename_lockres; | ||
3357 | struct ocfs2_lock_res osb_nfs_sync_lockres; | ||
3358 | + struct rw_semaphore nfs_sync_rwlock; | ||
3359 | struct ocfs2_lock_res osb_trim_fs_lockres; | ||
3360 | struct mutex obs_trim_fs_mutex; | ||
3361 | struct ocfs2_dlm_debug *osb_dlm_debug; | ||
3362 | diff --git a/fs/ocfs2/ocfs2_fs.h b/fs/ocfs2/ocfs2_fs.h | ||
3363 | index 0db4a7ec58a2..dcef83c8796d 100644 | ||
3364 | --- a/fs/ocfs2/ocfs2_fs.h | ||
3365 | +++ b/fs/ocfs2/ocfs2_fs.h | ||
3366 | @@ -290,7 +290,7 @@ | ||
3367 | #define OCFS2_MAX_SLOTS 255 | ||
3368 | |||
3369 | /* Slot map indicator for an empty slot */ | ||
3370 | -#define OCFS2_INVALID_SLOT -1 | ||
3371 | +#define OCFS2_INVALID_SLOT ((u16)-1) | ||
3372 | |||
3373 | #define OCFS2_VOL_UUID_LEN 16 | ||
3374 | #define OCFS2_MAX_VOL_LABEL_LEN 64 | ||
3375 | @@ -326,8 +326,8 @@ struct ocfs2_system_inode_info { | ||
3376 | enum { | ||
3377 | BAD_BLOCK_SYSTEM_INODE = 0, | ||
3378 | GLOBAL_INODE_ALLOC_SYSTEM_INODE, | ||
3379 | +#define OCFS2_FIRST_ONLINE_SYSTEM_INODE GLOBAL_INODE_ALLOC_SYSTEM_INODE | ||
3380 | SLOT_MAP_SYSTEM_INODE, | ||
3381 | -#define OCFS2_FIRST_ONLINE_SYSTEM_INODE SLOT_MAP_SYSTEM_INODE | ||
3382 | HEARTBEAT_SYSTEM_INODE, | ||
3383 | GLOBAL_BITMAP_SYSTEM_INODE, | ||
3384 | USER_QUOTA_SYSTEM_INODE, | ||
3385 | diff --git a/fs/ocfs2/suballoc.c b/fs/ocfs2/suballoc.c | ||
3386 | index 69c21a3843af..503e724d39f5 100644 | ||
3387 | --- a/fs/ocfs2/suballoc.c | ||
3388 | +++ b/fs/ocfs2/suballoc.c | ||
3389 | @@ -2827,9 +2827,12 @@ int ocfs2_test_inode_bit(struct ocfs2_super *osb, u64 blkno, int *res) | ||
3390 | goto bail; | ||
3391 | } | ||
3392 | |||
3393 | - inode_alloc_inode = | ||
3394 | - ocfs2_get_system_file_inode(osb, INODE_ALLOC_SYSTEM_INODE, | ||
3395 | - suballoc_slot); | ||
3396 | + if (suballoc_slot == (u16)OCFS2_INVALID_SLOT) | ||
3397 | + inode_alloc_inode = ocfs2_get_system_file_inode(osb, | ||
3398 | + GLOBAL_INODE_ALLOC_SYSTEM_INODE, suballoc_slot); | ||
3399 | + else | ||
3400 | + inode_alloc_inode = ocfs2_get_system_file_inode(osb, | ||
3401 | + INODE_ALLOC_SYSTEM_INODE, suballoc_slot); | ||
3402 | if (!inode_alloc_inode) { | ||
3403 | /* the error code could be inaccurate, but we are not able to | ||
3404 | * get the correct one. */ | ||
3405 | diff --git a/fs/xfs/libxfs/xfs_alloc.c b/fs/xfs/libxfs/xfs_alloc.c | ||
3406 | index 533b04aaf6f6..0a36f532cf86 100644 | ||
3407 | --- a/fs/xfs/libxfs/xfs_alloc.c | ||
3408 | +++ b/fs/xfs/libxfs/xfs_alloc.c | ||
3409 | @@ -2598,6 +2598,13 @@ xfs_agf_verify( | ||
3410 | be32_to_cpu(agf->agf_flcount) <= xfs_agfl_size(mp))) | ||
3411 | return __this_address; | ||
3412 | |||
3413 | + if (be32_to_cpu(agf->agf_length) > mp->m_sb.sb_dblocks) | ||
3414 | + return __this_address; | ||
3415 | + | ||
3416 | + if (be32_to_cpu(agf->agf_freeblks) < be32_to_cpu(agf->agf_longest) || | ||
3417 | + be32_to_cpu(agf->agf_freeblks) > be32_to_cpu(agf->agf_length)) | ||
3418 | + return __this_address; | ||
3419 | + | ||
3420 | if (be32_to_cpu(agf->agf_levels[XFS_BTNUM_BNO]) < 1 || | ||
3421 | be32_to_cpu(agf->agf_levels[XFS_BTNUM_CNT]) < 1 || | ||
3422 | be32_to_cpu(agf->agf_levels[XFS_BTNUM_BNO]) > XFS_BTREE_MAXLEVELS || | ||
3423 | @@ -2609,6 +2616,10 @@ xfs_agf_verify( | ||
3424 | be32_to_cpu(agf->agf_levels[XFS_BTNUM_RMAP]) > XFS_BTREE_MAXLEVELS)) | ||
3425 | return __this_address; | ||
3426 | |||
3427 | + if (xfs_sb_version_hasrmapbt(&mp->m_sb) && | ||
3428 | + be32_to_cpu(agf->agf_rmap_blocks) > be32_to_cpu(agf->agf_length)) | ||
3429 | + return __this_address; | ||
3430 | + | ||
3431 | /* | ||
3432 | * during growfs operations, the perag is not fully initialised, | ||
3433 | * so we can't use it for any useful checking. growfs ensures we can't | ||
3434 | @@ -2622,6 +2633,11 @@ xfs_agf_verify( | ||
3435 | be32_to_cpu(agf->agf_btreeblks) > be32_to_cpu(agf->agf_length)) | ||
3436 | return __this_address; | ||
3437 | |||
3438 | + if (xfs_sb_version_hasreflink(&mp->m_sb) && | ||
3439 | + be32_to_cpu(agf->agf_refcount_blocks) > | ||
3440 | + be32_to_cpu(agf->agf_length)) | ||
3441 | + return __this_address; | ||
3442 | + | ||
3443 | if (xfs_sb_version_hasreflink(&mp->m_sb) && | ||
3444 | (be32_to_cpu(agf->agf_refcount_level) < 1 || | ||
3445 | be32_to_cpu(agf->agf_refcount_level) > XFS_BTREE_MAXLEVELS)) | ||
3446 | diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h | ||
3447 | index b580a35f50ea..ec3081ab04c0 100644 | ||
3448 | --- a/include/linux/netdevice.h | ||
3449 | +++ b/include/linux/netdevice.h | ||
3450 | @@ -3043,7 +3043,7 @@ static inline int dev_recursion_level(void) | ||
3451 | return this_cpu_read(softnet_data.xmit.recursion); | ||
3452 | } | ||
3453 | |||
3454 | -#define XMIT_RECURSION_LIMIT 10 | ||
3455 | +#define XMIT_RECURSION_LIMIT 8 | ||
3456 | static inline bool dev_xmit_recursion(void) | ||
3457 | { | ||
3458 | return unlikely(__this_cpu_read(softnet_data.xmit.recursion) > | ||
3459 | diff --git a/include/linux/qed/qed_chain.h b/include/linux/qed/qed_chain.h | ||
3460 | index 733fad7dfbed..6d15040c642c 100644 | ||
3461 | --- a/include/linux/qed/qed_chain.h | ||
3462 | +++ b/include/linux/qed/qed_chain.h | ||
3463 | @@ -207,28 +207,34 @@ static inline u32 qed_chain_get_cons_idx_u32(struct qed_chain *p_chain) | ||
3464 | |||
3465 | static inline u16 qed_chain_get_elem_left(struct qed_chain *p_chain) | ||
3466 | { | ||
3467 | + u16 elem_per_page = p_chain->elem_per_page; | ||
3468 | + u32 prod = p_chain->u.chain16.prod_idx; | ||
3469 | + u32 cons = p_chain->u.chain16.cons_idx; | ||
3470 | u16 used; | ||
3471 | |||
3472 | - used = (u16) (((u32)0x10000 + | ||
3473 | - (u32)p_chain->u.chain16.prod_idx) - | ||
3474 | - (u32)p_chain->u.chain16.cons_idx); | ||
3475 | + if (prod < cons) | ||
3476 | + prod += (u32)U16_MAX + 1; | ||
3477 | + | ||
3478 | + used = (u16)(prod - cons); | ||
3479 | if (p_chain->mode == QED_CHAIN_MODE_NEXT_PTR) | ||
3480 | - used -= p_chain->u.chain16.prod_idx / p_chain->elem_per_page - | ||
3481 | - p_chain->u.chain16.cons_idx / p_chain->elem_per_page; | ||
3482 | + used -= prod / elem_per_page - cons / elem_per_page; | ||
3483 | |||
3484 | return (u16)(p_chain->capacity - used); | ||
3485 | } | ||
3486 | |||
3487 | static inline u32 qed_chain_get_elem_left_u32(struct qed_chain *p_chain) | ||
3488 | { | ||
3489 | + u16 elem_per_page = p_chain->elem_per_page; | ||
3490 | + u64 prod = p_chain->u.chain32.prod_idx; | ||
3491 | + u64 cons = p_chain->u.chain32.cons_idx; | ||
3492 | u32 used; | ||
3493 | |||
3494 | - used = (u32) (((u64)0x100000000ULL + | ||
3495 | - (u64)p_chain->u.chain32.prod_idx) - | ||
3496 | - (u64)p_chain->u.chain32.cons_idx); | ||
3497 | + if (prod < cons) | ||
3498 | + prod += (u64)U32_MAX + 1; | ||
3499 | + | ||
3500 | + used = (u32)(prod - cons); | ||
3501 | if (p_chain->mode == QED_CHAIN_MODE_NEXT_PTR) | ||
3502 | - used -= p_chain->u.chain32.prod_idx / p_chain->elem_per_page - | ||
3503 | - p_chain->u.chain32.cons_idx / p_chain->elem_per_page; | ||
3504 | + used -= (u32)(prod / elem_per_page - cons / elem_per_page); | ||
3505 | |||
3506 | return p_chain->capacity - used; | ||
3507 | } | ||
3508 | diff --git a/include/linux/tpm_eventlog.h b/include/linux/tpm_eventlog.h | ||
3509 | index 131ea1bad458..eccfd3a4e4c8 100644 | ||
3510 | --- a/include/linux/tpm_eventlog.h | ||
3511 | +++ b/include/linux/tpm_eventlog.h | ||
3512 | @@ -81,6 +81,8 @@ struct tcg_efi_specid_event_algs { | ||
3513 | u16 digest_size; | ||
3514 | } __packed; | ||
3515 | |||
3516 | +#define TCG_SPECID_SIG "Spec ID Event03" | ||
3517 | + | ||
3518 | struct tcg_efi_specid_event_head { | ||
3519 | u8 signature[16]; | ||
3520 | u32 platform_class; | ||
3521 | @@ -171,6 +173,7 @@ static inline int __calc_tpm2_event_size(struct tcg_pcr_event2_head *event, | ||
3522 | int i; | ||
3523 | int j; | ||
3524 | u32 count, event_type; | ||
3525 | + const u8 zero_digest[sizeof(event_header->digest)] = {0}; | ||
3526 | |||
3527 | marker = event; | ||
3528 | marker_start = marker; | ||
3529 | @@ -198,10 +201,19 @@ static inline int __calc_tpm2_event_size(struct tcg_pcr_event2_head *event, | ||
3530 | count = READ_ONCE(event->count); | ||
3531 | event_type = READ_ONCE(event->event_type); | ||
3532 | |||
3533 | + /* Verify that it's the log header */ | ||
3534 | + if (event_header->pcr_idx != 0 || | ||
3535 | + event_header->event_type != NO_ACTION || | ||
3536 | + memcmp(event_header->digest, zero_digest, sizeof(zero_digest))) { | ||
3537 | + size = 0; | ||
3538 | + goto out; | ||
3539 | + } | ||
3540 | + | ||
3541 | efispecid = (struct tcg_efi_specid_event_head *)event_header->event; | ||
3542 | |||
3543 | /* Check if event is malformed. */ | ||
3544 | - if (count > efispecid->num_algs) { | ||
3545 | + if (memcmp(efispecid->signature, TCG_SPECID_SIG, | ||
3546 | + sizeof(TCG_SPECID_SIG)) || count > efispecid->num_algs) { | ||
3547 | size = 0; | ||
3548 | goto out; | ||
3549 | } | ||
3550 | diff --git a/include/net/sctp/constants.h b/include/net/sctp/constants.h | ||
3551 | index 823afc42a3aa..06e1deeef464 100644 | ||
3552 | --- a/include/net/sctp/constants.h | ||
3553 | +++ b/include/net/sctp/constants.h | ||
3554 | @@ -341,11 +341,13 @@ enum { | ||
3555 | ipv4_is_anycast_6to4(a)) | ||
3556 | |||
3557 | /* Flags used for the bind address copy functions. */ | ||
3558 | -#define SCTP_ADDR6_ALLOWED 0x00000001 /* IPv6 address is allowed by | ||
3559 | +#define SCTP_ADDR4_ALLOWED 0x00000001 /* IPv4 address is allowed by | ||
3560 | local sock family */ | ||
3561 | -#define SCTP_ADDR4_PEERSUPP 0x00000002 /* IPv4 address is supported by | ||
3562 | +#define SCTP_ADDR6_ALLOWED 0x00000002 /* IPv6 address is allowed by | ||
3563 | + local sock family */ | ||
3564 | +#define SCTP_ADDR4_PEERSUPP 0x00000004 /* IPv4 address is supported by | ||
3565 | peer */ | ||
3566 | -#define SCTP_ADDR6_PEERSUPP 0x00000004 /* IPv6 address is supported by | ||
3567 | +#define SCTP_ADDR6_PEERSUPP 0x00000008 /* IPv6 address is supported by | ||
3568 | peer */ | ||
3569 | |||
3570 | /* Reasons to retransmit. */ | ||
3571 | diff --git a/include/net/sock.h b/include/net/sock.h | ||
3572 | index 6c5a3809483e..8263bbf756a2 100644 | ||
3573 | --- a/include/net/sock.h | ||
3574 | +++ b/include/net/sock.h | ||
3575 | @@ -1803,7 +1803,6 @@ static inline int sk_rx_queue_get(const struct sock *sk) | ||
3576 | |||
3577 | static inline void sk_set_socket(struct sock *sk, struct socket *sock) | ||
3578 | { | ||
3579 | - sk_tx_queue_clear(sk); | ||
3580 | sk->sk_socket = sock; | ||
3581 | } | ||
3582 | |||
3583 | diff --git a/include/net/xfrm.h b/include/net/xfrm.h | ||
3584 | index aa08a7a5f6ac..fb391c00c19a 100644 | ||
3585 | --- a/include/net/xfrm.h | ||
3586 | +++ b/include/net/xfrm.h | ||
3587 | @@ -1012,6 +1012,7 @@ struct xfrm_offload { | ||
3588 | #define XFRM_GRO 32 | ||
3589 | #define XFRM_ESP_NO_TRAILER 64 | ||
3590 | #define XFRM_DEV_RESUME 128 | ||
3591 | +#define XFRM_XMIT 256 | ||
3592 | |||
3593 | __u32 status; | ||
3594 | #define CRYPTO_SUCCESS 1 | ||
3595 | diff --git a/kernel/bpf/cgroup.c b/kernel/bpf/cgroup.c | ||
3596 | index 869e2e1860e8..b701af27a779 100644 | ||
3597 | --- a/kernel/bpf/cgroup.c | ||
3598 | +++ b/kernel/bpf/cgroup.c | ||
3599 | @@ -966,16 +966,23 @@ static bool __cgroup_bpf_prog_array_is_empty(struct cgroup *cgrp, | ||
3600 | |||
3601 | static int sockopt_alloc_buf(struct bpf_sockopt_kern *ctx, int max_optlen) | ||
3602 | { | ||
3603 | - if (unlikely(max_optlen > PAGE_SIZE) || max_optlen < 0) | ||
3604 | + if (unlikely(max_optlen < 0)) | ||
3605 | return -EINVAL; | ||
3606 | |||
3607 | + if (unlikely(max_optlen > PAGE_SIZE)) { | ||
3608 | + /* We don't expose optvals that are greater than PAGE_SIZE | ||
3609 | + * to the BPF program. | ||
3610 | + */ | ||
3611 | + max_optlen = PAGE_SIZE; | ||
3612 | + } | ||
3613 | + | ||
3614 | ctx->optval = kzalloc(max_optlen, GFP_USER); | ||
3615 | if (!ctx->optval) | ||
3616 | return -ENOMEM; | ||
3617 | |||
3618 | ctx->optval_end = ctx->optval + max_optlen; | ||
3619 | |||
3620 | - return 0; | ||
3621 | + return max_optlen; | ||
3622 | } | ||
3623 | |||
3624 | static void sockopt_free_buf(struct bpf_sockopt_kern *ctx) | ||
3625 | @@ -1009,13 +1016,13 @@ int __cgroup_bpf_run_filter_setsockopt(struct sock *sk, int *level, | ||
3626 | */ | ||
3627 | max_optlen = max_t(int, 16, *optlen); | ||
3628 | |||
3629 | - ret = sockopt_alloc_buf(&ctx, max_optlen); | ||
3630 | - if (ret) | ||
3631 | - return ret; | ||
3632 | + max_optlen = sockopt_alloc_buf(&ctx, max_optlen); | ||
3633 | + if (max_optlen < 0) | ||
3634 | + return max_optlen; | ||
3635 | |||
3636 | ctx.optlen = *optlen; | ||
3637 | |||
3638 | - if (copy_from_user(ctx.optval, optval, *optlen) != 0) { | ||
3639 | + if (copy_from_user(ctx.optval, optval, min(*optlen, max_optlen)) != 0) { | ||
3640 | ret = -EFAULT; | ||
3641 | goto out; | ||
3642 | } | ||
3643 | @@ -1043,8 +1050,14 @@ int __cgroup_bpf_run_filter_setsockopt(struct sock *sk, int *level, | ||
3644 | /* export any potential modifications */ | ||
3645 | *level = ctx.level; | ||
3646 | *optname = ctx.optname; | ||
3647 | - *optlen = ctx.optlen; | ||
3648 | - *kernel_optval = ctx.optval; | ||
3649 | + | ||
3650 | + /* optlen == 0 from BPF indicates that we should | ||
3651 | + * use original userspace data. | ||
3652 | + */ | ||
3653 | + if (ctx.optlen != 0) { | ||
3654 | + *optlen = ctx.optlen; | ||
3655 | + *kernel_optval = ctx.optval; | ||
3656 | + } | ||
3657 | } | ||
3658 | |||
3659 | out: | ||
3660 | @@ -1076,12 +1089,12 @@ int __cgroup_bpf_run_filter_getsockopt(struct sock *sk, int level, | ||
3661 | __cgroup_bpf_prog_array_is_empty(cgrp, BPF_CGROUP_GETSOCKOPT)) | ||
3662 | return retval; | ||
3663 | |||
3664 | - ret = sockopt_alloc_buf(&ctx, max_optlen); | ||
3665 | - if (ret) | ||
3666 | - return ret; | ||
3667 | - | ||
3668 | ctx.optlen = max_optlen; | ||
3669 | |||
3670 | + max_optlen = sockopt_alloc_buf(&ctx, max_optlen); | ||
3671 | + if (max_optlen < 0) | ||
3672 | + return max_optlen; | ||
3673 | + | ||
3674 | if (!retval) { | ||
3675 | /* If kernel getsockopt finished successfully, | ||
3676 | * copy whatever was returned to the user back | ||
3677 | @@ -1095,10 +1108,8 @@ int __cgroup_bpf_run_filter_getsockopt(struct sock *sk, int level, | ||
3678 | goto out; | ||
3679 | } | ||
3680 | |||
3681 | - if (ctx.optlen > max_optlen) | ||
3682 | - ctx.optlen = max_optlen; | ||
3683 | - | ||
3684 | - if (copy_from_user(ctx.optval, optval, ctx.optlen) != 0) { | ||
3685 | + if (copy_from_user(ctx.optval, optval, | ||
3686 | + min(ctx.optlen, max_optlen)) != 0) { | ||
3687 | ret = -EFAULT; | ||
3688 | goto out; | ||
3689 | } | ||
3690 | @@ -1127,10 +1138,12 @@ int __cgroup_bpf_run_filter_getsockopt(struct sock *sk, int level, | ||
3691 | goto out; | ||
3692 | } | ||
3693 | |||
3694 | - if (copy_to_user(optval, ctx.optval, ctx.optlen) || | ||
3695 | - put_user(ctx.optlen, optlen)) { | ||
3696 | - ret = -EFAULT; | ||
3697 | - goto out; | ||
3698 | + if (ctx.optlen != 0) { | ||
3699 | + if (copy_to_user(optval, ctx.optval, ctx.optlen) || | ||
3700 | + put_user(ctx.optlen, optlen)) { | ||
3701 | + ret = -EFAULT; | ||
3702 | + goto out; | ||
3703 | + } | ||
3704 | } | ||
3705 | |||
3706 | ret = ctx.retval; | ||
3707 | diff --git a/kernel/bpf/devmap.c b/kernel/bpf/devmap.c | ||
3708 | index b4b6b77f309c..6684696fa457 100644 | ||
3709 | --- a/kernel/bpf/devmap.c | ||
3710 | +++ b/kernel/bpf/devmap.c | ||
3711 | @@ -88,12 +88,13 @@ struct bpf_dtab { | ||
3712 | static DEFINE_SPINLOCK(dev_map_lock); | ||
3713 | static LIST_HEAD(dev_map_list); | ||
3714 | |||
3715 | -static struct hlist_head *dev_map_create_hash(unsigned int entries) | ||
3716 | +static struct hlist_head *dev_map_create_hash(unsigned int entries, | ||
3717 | + int numa_node) | ||
3718 | { | ||
3719 | int i; | ||
3720 | struct hlist_head *hash; | ||
3721 | |||
3722 | - hash = kmalloc_array(entries, sizeof(*hash), GFP_KERNEL); | ||
3723 | + hash = bpf_map_area_alloc(entries * sizeof(*hash), numa_node); | ||
3724 | if (hash != NULL) | ||
3725 | for (i = 0; i < entries; i++) | ||
3726 | INIT_HLIST_HEAD(&hash[i]); | ||
3727 | @@ -151,7 +152,8 @@ static int dev_map_init_map(struct bpf_dtab *dtab, union bpf_attr *attr) | ||
3728 | INIT_LIST_HEAD(per_cpu_ptr(dtab->flush_list, cpu)); | ||
3729 | |||
3730 | if (attr->map_type == BPF_MAP_TYPE_DEVMAP_HASH) { | ||
3731 | - dtab->dev_index_head = dev_map_create_hash(dtab->n_buckets); | ||
3732 | + dtab->dev_index_head = dev_map_create_hash(dtab->n_buckets, | ||
3733 | + dtab->map.numa_node); | ||
3734 | if (!dtab->dev_index_head) | ||
3735 | goto free_percpu; | ||
3736 | |||
3737 | @@ -249,7 +251,7 @@ static void dev_map_free(struct bpf_map *map) | ||
3738 | } | ||
3739 | } | ||
3740 | |||
3741 | - kfree(dtab->dev_index_head); | ||
3742 | + bpf_map_area_free(dtab->dev_index_head); | ||
3743 | } else { | ||
3744 | for (i = 0; i < dtab->map.max_entries; i++) { | ||
3745 | struct bpf_dtab_netdev *dev; | ||
3746 | diff --git a/kernel/kprobes.c b/kernel/kprobes.c | ||
3747 | index 195ecb955fcc..950a5cfd262c 100644 | ||
3748 | --- a/kernel/kprobes.c | ||
3749 | +++ b/kernel/kprobes.c | ||
3750 | @@ -326,7 +326,8 @@ struct kprobe *get_kprobe(void *addr) | ||
3751 | struct kprobe *p; | ||
3752 | |||
3753 | head = &kprobe_table[hash_ptr(addr, KPROBE_HASH_BITS)]; | ||
3754 | - hlist_for_each_entry_rcu(p, head, hlist) { | ||
3755 | + hlist_for_each_entry_rcu(p, head, hlist, | ||
3756 | + lockdep_is_held(&kprobe_mutex)) { | ||
3757 | if (p->addr == addr) | ||
3758 | return p; | ||
3759 | } | ||
3760 | diff --git a/kernel/sched/core.c b/kernel/sched/core.c | ||
3761 | index 361cbc2dc966..7238ef445daf 100644 | ||
3762 | --- a/kernel/sched/core.c | ||
3763 | +++ b/kernel/sched/core.c | ||
3764 | @@ -4447,7 +4447,8 @@ void rt_mutex_setprio(struct task_struct *p, struct task_struct *pi_task) | ||
3765 | */ | ||
3766 | if (dl_prio(prio)) { | ||
3767 | if (!dl_prio(p->normal_prio) || | ||
3768 | - (pi_task && dl_entity_preempt(&pi_task->dl, &p->dl))) { | ||
3769 | + (pi_task && dl_prio(pi_task->prio) && | ||
3770 | + dl_entity_preempt(&pi_task->dl, &p->dl))) { | ||
3771 | p->dl.dl_boosted = 1; | ||
3772 | queue_flag |= ENQUEUE_REPLENISH; | ||
3773 | } else | ||
3774 | diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c | ||
3775 | index 08bdee0480b3..4cb00538a207 100644 | ||
3776 | --- a/kernel/sched/deadline.c | ||
3777 | +++ b/kernel/sched/deadline.c | ||
3778 | @@ -2693,6 +2693,7 @@ void __dl_clear_params(struct task_struct *p) | ||
3779 | dl_se->dl_bw = 0; | ||
3780 | dl_se->dl_density = 0; | ||
3781 | |||
3782 | + dl_se->dl_boosted = 0; | ||
3783 | dl_se->dl_throttled = 0; | ||
3784 | dl_se->dl_yielded = 0; | ||
3785 | dl_se->dl_non_contending = 0; | ||
3786 | diff --git a/kernel/trace/blktrace.c b/kernel/trace/blktrace.c | ||
3787 | index a677aa84ccb6..eaee960153e1 100644 | ||
3788 | --- a/kernel/trace/blktrace.c | ||
3789 | +++ b/kernel/trace/blktrace.c | ||
3790 | @@ -3,6 +3,9 @@ | ||
3791 | * Copyright (C) 2006 Jens Axboe <axboe@kernel.dk> | ||
3792 | * | ||
3793 | */ | ||
3794 | + | ||
3795 | +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt | ||
3796 | + | ||
3797 | #include <linux/kernel.h> | ||
3798 | #include <linux/blkdev.h> | ||
3799 | #include <linux/blktrace_api.h> | ||
3800 | @@ -495,6 +498,16 @@ static int do_blk_trace_setup(struct request_queue *q, char *name, dev_t dev, | ||
3801 | */ | ||
3802 | strreplace(buts->name, '/', '_'); | ||
3803 | |||
3804 | + /* | ||
3805 | + * bdev can be NULL, as with scsi-generic, this is a helpful as | ||
3806 | + * we can be. | ||
3807 | + */ | ||
3808 | + if (q->blk_trace) { | ||
3809 | + pr_warn("Concurrent blktraces are not allowed on %s\n", | ||
3810 | + buts->name); | ||
3811 | + return -EBUSY; | ||
3812 | + } | ||
3813 | + | ||
3814 | bt = kzalloc(sizeof(*bt), GFP_KERNEL); | ||
3815 | if (!bt) | ||
3816 | return -ENOMEM; | ||
3817 | diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c | ||
3818 | index 4bf050fcfe3b..9a2581fe7ed5 100644 | ||
3819 | --- a/kernel/trace/ring_buffer.c | ||
3820 | +++ b/kernel/trace/ring_buffer.c | ||
3821 | @@ -2358,7 +2358,7 @@ rb_update_event(struct ring_buffer_per_cpu *cpu_buffer, | ||
3822 | if (unlikely(info->add_timestamp)) { | ||
3823 | bool abs = ring_buffer_time_stamp_abs(cpu_buffer->buffer); | ||
3824 | |||
3825 | - event = rb_add_time_stamp(event, info->delta, abs); | ||
3826 | + event = rb_add_time_stamp(event, abs ? info->delta : delta, abs); | ||
3827 | length -= RB_LEN_TIME_EXTEND; | ||
3828 | delta = 0; | ||
3829 | } | ||
3830 | diff --git a/kernel/trace/trace_events_trigger.c b/kernel/trace/trace_events_trigger.c | ||
3831 | index de840de87a18..e913d41a4194 100644 | ||
3832 | --- a/kernel/trace/trace_events_trigger.c | ||
3833 | +++ b/kernel/trace/trace_events_trigger.c | ||
3834 | @@ -216,11 +216,17 @@ static int event_trigger_regex_open(struct inode *inode, struct file *file) | ||
3835 | |||
3836 | static int trigger_process_regex(struct trace_event_file *file, char *buff) | ||
3837 | { | ||
3838 | - char *command, *next = buff; | ||
3839 | + char *command, *next; | ||
3840 | struct event_command *p; | ||
3841 | int ret = -EINVAL; | ||
3842 | |||
3843 | + next = buff = skip_spaces(buff); | ||
3844 | command = strsep(&next, ": \t"); | ||
3845 | + if (next) { | ||
3846 | + next = skip_spaces(next); | ||
3847 | + if (!*next) | ||
3848 | + next = NULL; | ||
3849 | + } | ||
3850 | command = (command[0] != '!') ? command : command + 1; | ||
3851 | |||
3852 | mutex_lock(&trigger_cmd_mutex); | ||
3853 | @@ -630,8 +636,14 @@ event_trigger_callback(struct event_command *cmd_ops, | ||
3854 | int ret; | ||
3855 | |||
3856 | /* separate the trigger from the filter (t:n [if filter]) */ | ||
3857 | - if (param && isdigit(param[0])) | ||
3858 | + if (param && isdigit(param[0])) { | ||
3859 | trigger = strsep(¶m, " \t"); | ||
3860 | + if (param) { | ||
3861 | + param = skip_spaces(param); | ||
3862 | + if (!*param) | ||
3863 | + param = NULL; | ||
3864 | + } | ||
3865 | + } | ||
3866 | |||
3867 | trigger_ops = cmd_ops->get_trigger_ops(cmd, trigger); | ||
3868 | |||
3869 | @@ -1368,6 +1380,11 @@ int event_enable_trigger_func(struct event_command *cmd_ops, | ||
3870 | trigger = strsep(¶m, " \t"); | ||
3871 | if (!trigger) | ||
3872 | return -EINVAL; | ||
3873 | + if (param) { | ||
3874 | + param = skip_spaces(param); | ||
3875 | + if (!*param) | ||
3876 | + param = NULL; | ||
3877 | + } | ||
3878 | |||
3879 | system = strsep(&trigger, ":"); | ||
3880 | if (!trigger) | ||
3881 | diff --git a/lib/test_objagg.c b/lib/test_objagg.c | ||
3882 | index 72c1abfa154d..da137939a410 100644 | ||
3883 | --- a/lib/test_objagg.c | ||
3884 | +++ b/lib/test_objagg.c | ||
3885 | @@ -979,10 +979,10 @@ err_check_expect_stats2: | ||
3886 | err_world2_obj_get: | ||
3887 | for (i--; i >= 0; i--) | ||
3888 | world_obj_put(&world2, objagg, hints_case->key_ids[i]); | ||
3889 | - objagg_hints_put(hints); | ||
3890 | - objagg_destroy(objagg2); | ||
3891 | i = hints_case->key_ids_count; | ||
3892 | + objagg_destroy(objagg2); | ||
3893 | err_check_expect_hints_stats: | ||
3894 | + objagg_hints_put(hints); | ||
3895 | err_hints_get: | ||
3896 | err_check_expect_stats: | ||
3897 | err_world_obj_get: | ||
3898 | diff --git a/mm/memcontrol.c b/mm/memcontrol.c | ||
3899 | index 0d6f3ea86738..a3f4c35bb5fa 100644 | ||
3900 | --- a/mm/memcontrol.c | ||
3901 | +++ b/mm/memcontrol.c | ||
3902 | @@ -2895,8 +2895,10 @@ static void memcg_schedule_kmem_cache_create(struct mem_cgroup *memcg, | ||
3903 | return; | ||
3904 | |||
3905 | cw = kmalloc(sizeof(*cw), GFP_NOWAIT | __GFP_NOWARN); | ||
3906 | - if (!cw) | ||
3907 | + if (!cw) { | ||
3908 | + css_put(&memcg->css); | ||
3909 | return; | ||
3910 | + } | ||
3911 | |||
3912 | cw->memcg = memcg; | ||
3913 | cw->cachep = cachep; | ||
3914 | diff --git a/mm/slab_common.c b/mm/slab_common.c | ||
3915 | index ade6c257d4b4..8c1ffbf7de45 100644 | ||
3916 | --- a/mm/slab_common.c | ||
3917 | +++ b/mm/slab_common.c | ||
3918 | @@ -1740,7 +1740,7 @@ void kzfree(const void *p) | ||
3919 | if (unlikely(ZERO_OR_NULL_PTR(mem))) | ||
3920 | return; | ||
3921 | ks = ksize(mem); | ||
3922 | - memset(mem, 0, ks); | ||
3923 | + memzero_explicit(mem, ks); | ||
3924 | kfree(mem); | ||
3925 | } | ||
3926 | EXPORT_SYMBOL(kzfree); | ||
3927 | diff --git a/net/bridge/br_private.h b/net/bridge/br_private.h | ||
3928 | index ce2ab14ee605..cecb4223440e 100644 | ||
3929 | --- a/net/bridge/br_private.h | ||
3930 | +++ b/net/bridge/br_private.h | ||
3931 | @@ -208,8 +208,8 @@ struct net_bridge_port_group { | ||
3932 | struct rcu_head rcu; | ||
3933 | struct timer_list timer; | ||
3934 | struct br_ip addr; | ||
3935 | + unsigned char eth_addr[ETH_ALEN] __aligned(2); | ||
3936 | unsigned char flags; | ||
3937 | - unsigned char eth_addr[ETH_ALEN]; | ||
3938 | }; | ||
3939 | |||
3940 | struct net_bridge_mdb_entry { | ||
3941 | diff --git a/net/core/dev.c b/net/core/dev.c | ||
3942 | index 204d87e7c9b1..727965565d31 100644 | ||
3943 | --- a/net/core/dev.c | ||
3944 | +++ b/net/core/dev.c | ||
3945 | @@ -3832,10 +3832,12 @@ int dev_direct_xmit(struct sk_buff *skb, u16 queue_id) | ||
3946 | |||
3947 | local_bh_disable(); | ||
3948 | |||
3949 | + dev_xmit_recursion_inc(); | ||
3950 | HARD_TX_LOCK(dev, txq, smp_processor_id()); | ||
3951 | if (!netif_xmit_frozen_or_drv_stopped(txq)) | ||
3952 | ret = netdev_start_xmit(skb, dev, txq, false); | ||
3953 | HARD_TX_UNLOCK(dev, txq); | ||
3954 | + dev_xmit_recursion_dec(); | ||
3955 | |||
3956 | local_bh_enable(); | ||
3957 | |||
3958 | @@ -9114,6 +9116,13 @@ int register_netdevice(struct net_device *dev) | ||
3959 | rcu_barrier(); | ||
3960 | |||
3961 | dev->reg_state = NETREG_UNREGISTERED; | ||
3962 | + /* We should put the kobject that hold in | ||
3963 | + * netdev_unregister_kobject(), otherwise | ||
3964 | + * the net device cannot be freed when | ||
3965 | + * driver calls free_netdev(), because the | ||
3966 | + * kobject is being hold. | ||
3967 | + */ | ||
3968 | + kobject_put(&dev->dev.kobj); | ||
3969 | } | ||
3970 | /* | ||
3971 | * Prevent userspace races by waiting until the network | ||
3972 | diff --git a/net/core/sock.c b/net/core/sock.c | ||
3973 | index 0adf7a9e5a90..078791a6649a 100644 | ||
3974 | --- a/net/core/sock.c | ||
3975 | +++ b/net/core/sock.c | ||
3976 | @@ -709,7 +709,7 @@ bool sk_mc_loop(struct sock *sk) | ||
3977 | return inet6_sk(sk)->mc_loop; | ||
3978 | #endif | ||
3979 | } | ||
3980 | - WARN_ON(1); | ||
3981 | + WARN_ON_ONCE(1); | ||
3982 | return true; | ||
3983 | } | ||
3984 | EXPORT_SYMBOL(sk_mc_loop); | ||
3985 | @@ -1679,6 +1679,7 @@ struct sock *sk_alloc(struct net *net, int family, gfp_t priority, | ||
3986 | cgroup_sk_alloc(&sk->sk_cgrp_data); | ||
3987 | sock_update_classid(&sk->sk_cgrp_data); | ||
3988 | sock_update_netprioidx(&sk->sk_cgrp_data); | ||
3989 | + sk_tx_queue_clear(sk); | ||
3990 | } | ||
3991 | |||
3992 | return sk; | ||
3993 | @@ -1895,6 +1896,7 @@ struct sock *sk_clone_lock(const struct sock *sk, const gfp_t priority) | ||
3994 | */ | ||
3995 | sk_refcnt_debug_inc(newsk); | ||
3996 | sk_set_socket(newsk, NULL); | ||
3997 | + sk_tx_queue_clear(newsk); | ||
3998 | RCU_INIT_POINTER(newsk->sk_wq, NULL); | ||
3999 | |||
4000 | if (newsk->sk_prot->sockets_allocated) | ||
4001 | diff --git a/net/ipv4/fib_semantics.c b/net/ipv4/fib_semantics.c | ||
4002 | index 01588eef0cee..b1b3220917ca 100644 | ||
4003 | --- a/net/ipv4/fib_semantics.c | ||
4004 | +++ b/net/ipv4/fib_semantics.c | ||
4005 | @@ -1100,7 +1100,7 @@ static int fib_check_nh_v4_gw(struct net *net, struct fib_nh *nh, u32 table, | ||
4006 | if (fl4.flowi4_scope < RT_SCOPE_LINK) | ||
4007 | fl4.flowi4_scope = RT_SCOPE_LINK; | ||
4008 | |||
4009 | - if (table) | ||
4010 | + if (table && table != RT_TABLE_MAIN) | ||
4011 | tbl = fib_get_table(net, table); | ||
4012 | |||
4013 | if (tbl) | ||
4014 | diff --git a/net/ipv4/ip_tunnel.c b/net/ipv4/ip_tunnel.c | ||
4015 | index cd4b84310d92..a0b4dc54f8a6 100644 | ||
4016 | --- a/net/ipv4/ip_tunnel.c | ||
4017 | +++ b/net/ipv4/ip_tunnel.c | ||
4018 | @@ -85,9 +85,10 @@ struct ip_tunnel *ip_tunnel_lookup(struct ip_tunnel_net *itn, | ||
4019 | __be32 remote, __be32 local, | ||
4020 | __be32 key) | ||
4021 | { | ||
4022 | - unsigned int hash; | ||
4023 | struct ip_tunnel *t, *cand = NULL; | ||
4024 | struct hlist_head *head; | ||
4025 | + struct net_device *ndev; | ||
4026 | + unsigned int hash; | ||
4027 | |||
4028 | hash = ip_tunnel_hash(key, remote); | ||
4029 | head = &itn->tunnels[hash]; | ||
4030 | @@ -162,8 +163,9 @@ struct ip_tunnel *ip_tunnel_lookup(struct ip_tunnel_net *itn, | ||
4031 | if (t && t->dev->flags & IFF_UP) | ||
4032 | return t; | ||
4033 | |||
4034 | - if (itn->fb_tunnel_dev && itn->fb_tunnel_dev->flags & IFF_UP) | ||
4035 | - return netdev_priv(itn->fb_tunnel_dev); | ||
4036 | + ndev = READ_ONCE(itn->fb_tunnel_dev); | ||
4037 | + if (ndev && ndev->flags & IFF_UP) | ||
4038 | + return netdev_priv(ndev); | ||
4039 | |||
4040 | return NULL; | ||
4041 | } | ||
4042 | @@ -1245,9 +1247,9 @@ void ip_tunnel_uninit(struct net_device *dev) | ||
4043 | struct ip_tunnel_net *itn; | ||
4044 | |||
4045 | itn = net_generic(net, tunnel->ip_tnl_net_id); | ||
4046 | - /* fb_tunnel_dev will be unregisted in net-exit call. */ | ||
4047 | - if (itn->fb_tunnel_dev != dev) | ||
4048 | - ip_tunnel_del(itn, netdev_priv(dev)); | ||
4049 | + ip_tunnel_del(itn, netdev_priv(dev)); | ||
4050 | + if (itn->fb_tunnel_dev == dev) | ||
4051 | + WRITE_ONCE(itn->fb_tunnel_dev, NULL); | ||
4052 | |||
4053 | dst_cache_reset(&tunnel->dst_cache); | ||
4054 | } | ||
4055 | diff --git a/net/ipv4/tcp_cubic.c b/net/ipv4/tcp_cubic.c | ||
4056 | index 1b3d032a4df2..ee6c38a73325 100644 | ||
4057 | --- a/net/ipv4/tcp_cubic.c | ||
4058 | +++ b/net/ipv4/tcp_cubic.c | ||
4059 | @@ -404,6 +404,8 @@ static void hystart_update(struct sock *sk, u32 delay) | ||
4060 | |||
4061 | if (hystart_detect & HYSTART_DELAY) { | ||
4062 | /* obtain the minimum delay of more than sampling packets */ | ||
4063 | + if (ca->curr_rtt > delay) | ||
4064 | + ca->curr_rtt = delay; | ||
4065 | if (ca->sample_cnt < HYSTART_MIN_SAMPLES) { | ||
4066 | if (ca->curr_rtt == 0 || ca->curr_rtt > delay) | ||
4067 | ca->curr_rtt = delay; | ||
4068 | diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c | ||
4069 | index 677facbeed26..3e63dc9c3eba 100644 | ||
4070 | --- a/net/ipv4/tcp_input.c | ||
4071 | +++ b/net/ipv4/tcp_input.c | ||
4072 | @@ -260,7 +260,8 @@ static void tcp_ecn_accept_cwr(struct sock *sk, const struct sk_buff *skb) | ||
4073 | * cwnd may be very low (even just 1 packet), so we should ACK | ||
4074 | * immediately. | ||
4075 | */ | ||
4076 | - inet_csk(sk)->icsk_ack.pending |= ICSK_ACK_NOW; | ||
4077 | + if (TCP_SKB_CB(skb)->seq != TCP_SKB_CB(skb)->end_seq) | ||
4078 | + inet_csk(sk)->icsk_ack.pending |= ICSK_ACK_NOW; | ||
4079 | } | ||
4080 | } | ||
4081 | |||
4082 | @@ -3682,6 +3683,15 @@ static int tcp_ack(struct sock *sk, const struct sk_buff *skb, int flag) | ||
4083 | tcp_in_ack_event(sk, ack_ev_flags); | ||
4084 | } | ||
4085 | |||
4086 | + /* This is a deviation from RFC3168 since it states that: | ||
4087 | + * "When the TCP data sender is ready to set the CWR bit after reducing | ||
4088 | + * the congestion window, it SHOULD set the CWR bit only on the first | ||
4089 | + * new data packet that it transmits." | ||
4090 | + * We accept CWR on pure ACKs to be more robust | ||
4091 | + * with widely-deployed TCP implementations that do this. | ||
4092 | + */ | ||
4093 | + tcp_ecn_accept_cwr(sk, skb); | ||
4094 | + | ||
4095 | /* We passed data and got it acked, remove any soft error | ||
4096 | * log. Something worked... | ||
4097 | */ | ||
4098 | @@ -4587,7 +4597,11 @@ static void tcp_data_queue_ofo(struct sock *sk, struct sk_buff *skb) | ||
4099 | if (tcp_ooo_try_coalesce(sk, tp->ooo_last_skb, | ||
4100 | skb, &fragstolen)) { | ||
4101 | coalesce_done: | ||
4102 | - tcp_grow_window(sk, skb); | ||
4103 | + /* For non sack flows, do not grow window to force DUPACK | ||
4104 | + * and trigger fast retransmit. | ||
4105 | + */ | ||
4106 | + if (tcp_is_sack(tp)) | ||
4107 | + tcp_grow_window(sk, skb); | ||
4108 | kfree_skb_partial(skb, fragstolen); | ||
4109 | skb = NULL; | ||
4110 | goto add_sack; | ||
4111 | @@ -4671,7 +4685,11 @@ add_sack: | ||
4112 | tcp_sack_new_ofo_skb(sk, seq, end_seq); | ||
4113 | end: | ||
4114 | if (skb) { | ||
4115 | - tcp_grow_window(sk, skb); | ||
4116 | + /* For non sack flows, do not grow window to force DUPACK | ||
4117 | + * and trigger fast retransmit. | ||
4118 | + */ | ||
4119 | + if (tcp_is_sack(tp)) | ||
4120 | + tcp_grow_window(sk, skb); | ||
4121 | skb_condense(skb); | ||
4122 | skb_set_owner_r(skb, sk); | ||
4123 | } | ||
4124 | @@ -4771,8 +4789,6 @@ static void tcp_data_queue(struct sock *sk, struct sk_buff *skb) | ||
4125 | skb_dst_drop(skb); | ||
4126 | __skb_pull(skb, tcp_hdr(skb)->doff * 4); | ||
4127 | |||
4128 | - tcp_ecn_accept_cwr(sk, skb); | ||
4129 | - | ||
4130 | tp->rx_opt.dsack = 0; | ||
4131 | |||
4132 | /* Queue data for delivery to the user. | ||
4133 | diff --git a/net/ipv6/ip6_gre.c b/net/ipv6/ip6_gre.c | ||
4134 | index 9ec05a1df5e1..04d76f043e18 100644 | ||
4135 | --- a/net/ipv6/ip6_gre.c | ||
4136 | +++ b/net/ipv6/ip6_gre.c | ||
4137 | @@ -127,6 +127,7 @@ static struct ip6_tnl *ip6gre_tunnel_lookup(struct net_device *dev, | ||
4138 | gre_proto == htons(ETH_P_ERSPAN2)) ? | ||
4139 | ARPHRD_ETHER : ARPHRD_IP6GRE; | ||
4140 | int score, cand_score = 4; | ||
4141 | + struct net_device *ndev; | ||
4142 | |||
4143 | for_each_ip_tunnel_rcu(t, ign->tunnels_r_l[h0 ^ h1]) { | ||
4144 | if (!ipv6_addr_equal(local, &t->parms.laddr) || | ||
4145 | @@ -238,9 +239,9 @@ static struct ip6_tnl *ip6gre_tunnel_lookup(struct net_device *dev, | ||
4146 | if (t && t->dev->flags & IFF_UP) | ||
4147 | return t; | ||
4148 | |||
4149 | - dev = ign->fb_tunnel_dev; | ||
4150 | - if (dev && dev->flags & IFF_UP) | ||
4151 | - return netdev_priv(dev); | ||
4152 | + ndev = READ_ONCE(ign->fb_tunnel_dev); | ||
4153 | + if (ndev && ndev->flags & IFF_UP) | ||
4154 | + return netdev_priv(ndev); | ||
4155 | |||
4156 | return NULL; | ||
4157 | } | ||
4158 | @@ -413,6 +414,8 @@ static void ip6gre_tunnel_uninit(struct net_device *dev) | ||
4159 | |||
4160 | ip6gre_tunnel_unlink_md(ign, t); | ||
4161 | ip6gre_tunnel_unlink(ign, t); | ||
4162 | + if (ign->fb_tunnel_dev == dev) | ||
4163 | + WRITE_ONCE(ign->fb_tunnel_dev, NULL); | ||
4164 | dst_cache_reset(&t->dst_cache); | ||
4165 | dev_put(dev); | ||
4166 | } | ||
4167 | diff --git a/net/ipv6/mcast.c b/net/ipv6/mcast.c | ||
4168 | index eaa4c2cc2fbb..c875c9b6edbe 100644 | ||
4169 | --- a/net/ipv6/mcast.c | ||
4170 | +++ b/net/ipv6/mcast.c | ||
4171 | @@ -2618,6 +2618,7 @@ void ipv6_mc_destroy_dev(struct inet6_dev *idev) | ||
4172 | idev->mc_list = i->next; | ||
4173 | |||
4174 | write_unlock_bh(&idev->lock); | ||
4175 | + ip6_mc_clear_src(i); | ||
4176 | ma_put(i); | ||
4177 | write_lock_bh(&idev->lock); | ||
4178 | } | ||
4179 | diff --git a/net/netfilter/ipset/ip_set_core.c b/net/netfilter/ipset/ip_set_core.c | ||
4180 | index 75da200aa5d8..133a3f1b6f56 100644 | ||
4181 | --- a/net/netfilter/ipset/ip_set_core.c | ||
4182 | +++ b/net/netfilter/ipset/ip_set_core.c | ||
4183 | @@ -382,6 +382,8 @@ ip_set_elem_len(struct ip_set *set, struct nlattr *tb[], size_t len, | ||
4184 | for (id = 0; id < IPSET_EXT_ID_MAX; id++) { | ||
4185 | if (!add_extension(id, cadt_flags, tb)) | ||
4186 | continue; | ||
4187 | + if (align < ip_set_extensions[id].align) | ||
4188 | + align = ip_set_extensions[id].align; | ||
4189 | len = ALIGN(len, ip_set_extensions[id].align); | ||
4190 | set->offset[id] = len; | ||
4191 | set->extensions |= ip_set_extensions[id].type; | ||
4192 | diff --git a/net/openvswitch/actions.c b/net/openvswitch/actions.c | ||
4193 | index 99352f09deaa..3d96dab10449 100644 | ||
4194 | --- a/net/openvswitch/actions.c | ||
4195 | +++ b/net/openvswitch/actions.c | ||
4196 | @@ -1146,9 +1146,10 @@ static int execute_check_pkt_len(struct datapath *dp, struct sk_buff *skb, | ||
4197 | struct sw_flow_key *key, | ||
4198 | const struct nlattr *attr, bool last) | ||
4199 | { | ||
4200 | + struct ovs_skb_cb *ovs_cb = OVS_CB(skb); | ||
4201 | const struct nlattr *actions, *cpl_arg; | ||
4202 | + int len, max_len, rem = nla_len(attr); | ||
4203 | const struct check_pkt_len_arg *arg; | ||
4204 | - int rem = nla_len(attr); | ||
4205 | bool clone_flow_key; | ||
4206 | |||
4207 | /* The first netlink attribute in 'attr' is always | ||
4208 | @@ -1157,7 +1158,11 @@ static int execute_check_pkt_len(struct datapath *dp, struct sk_buff *skb, | ||
4209 | cpl_arg = nla_data(attr); | ||
4210 | arg = nla_data(cpl_arg); | ||
4211 | |||
4212 | - if (skb->len <= arg->pkt_len) { | ||
4213 | + len = ovs_cb->mru ? ovs_cb->mru + skb->mac_len : skb->len; | ||
4214 | + max_len = arg->pkt_len; | ||
4215 | + | ||
4216 | + if ((skb_is_gso(skb) && skb_gso_validate_mac_len(skb, max_len)) || | ||
4217 | + len <= max_len) { | ||
4218 | /* Second netlink attribute in 'attr' is always | ||
4219 | * 'OVS_CHECK_PKT_LEN_ATTR_ACTIONS_IF_LESS_EQUAL'. | ||
4220 | */ | ||
4221 | diff --git a/net/rxrpc/call_accept.c b/net/rxrpc/call_accept.c | ||
4222 | index b7611cc159e5..032ed76c0166 100644 | ||
4223 | --- a/net/rxrpc/call_accept.c | ||
4224 | +++ b/net/rxrpc/call_accept.c | ||
4225 | @@ -22,6 +22,11 @@ | ||
4226 | #include <net/ip.h> | ||
4227 | #include "ar-internal.h" | ||
4228 | |||
4229 | +static void rxrpc_dummy_notify(struct sock *sk, struct rxrpc_call *call, | ||
4230 | + unsigned long user_call_ID) | ||
4231 | +{ | ||
4232 | +} | ||
4233 | + | ||
4234 | /* | ||
4235 | * Preallocate a single service call, connection and peer and, if possible, | ||
4236 | * give them a user ID and attach the user's side of the ID to them. | ||
4237 | @@ -228,6 +233,8 @@ void rxrpc_discard_prealloc(struct rxrpc_sock *rx) | ||
4238 | if (rx->discard_new_call) { | ||
4239 | _debug("discard %lx", call->user_call_ID); | ||
4240 | rx->discard_new_call(call, call->user_call_ID); | ||
4241 | + if (call->notify_rx) | ||
4242 | + call->notify_rx = rxrpc_dummy_notify; | ||
4243 | rxrpc_put_call(call, rxrpc_call_put_kernel); | ||
4244 | } | ||
4245 | rxrpc_call_completed(call); | ||
4246 | diff --git a/net/rxrpc/input.c b/net/rxrpc/input.c | ||
4247 | index 3be4177baf70..22dec6049e1b 100644 | ||
4248 | --- a/net/rxrpc/input.c | ||
4249 | +++ b/net/rxrpc/input.c | ||
4250 | @@ -723,13 +723,12 @@ static void rxrpc_input_ackinfo(struct rxrpc_call *call, struct sk_buff *skb, | ||
4251 | ntohl(ackinfo->rxMTU), ntohl(ackinfo->maxMTU), | ||
4252 | rwind, ntohl(ackinfo->jumbo_max)); | ||
4253 | |||
4254 | + if (rwind > RXRPC_RXTX_BUFF_SIZE - 1) | ||
4255 | + rwind = RXRPC_RXTX_BUFF_SIZE - 1; | ||
4256 | if (call->tx_winsize != rwind) { | ||
4257 | - if (rwind > RXRPC_RXTX_BUFF_SIZE - 1) | ||
4258 | - rwind = RXRPC_RXTX_BUFF_SIZE - 1; | ||
4259 | if (rwind > call->tx_winsize) | ||
4260 | wake = true; | ||
4261 | - trace_rxrpc_rx_rwind_change(call, sp->hdr.serial, | ||
4262 | - ntohl(ackinfo->rwind), wake); | ||
4263 | + trace_rxrpc_rx_rwind_change(call, sp->hdr.serial, rwind, wake); | ||
4264 | call->tx_winsize = rwind; | ||
4265 | } | ||
4266 | |||
4267 | diff --git a/net/sched/sch_cake.c b/net/sched/sch_cake.c | ||
4268 | index 2277369feae5..5d605bab9afc 100644 | ||
4269 | --- a/net/sched/sch_cake.c | ||
4270 | +++ b/net/sched/sch_cake.c | ||
4271 | @@ -1515,32 +1515,51 @@ static unsigned int cake_drop(struct Qdisc *sch, struct sk_buff **to_free) | ||
4272 | return idx + (tin << 16); | ||
4273 | } | ||
4274 | |||
4275 | -static u8 cake_handle_diffserv(struct sk_buff *skb, u16 wash) | ||
4276 | +static u8 cake_handle_diffserv(struct sk_buff *skb, bool wash) | ||
4277 | { | ||
4278 | - int wlen = skb_network_offset(skb); | ||
4279 | + const int offset = skb_network_offset(skb); | ||
4280 | + u16 *buf, buf_; | ||
4281 | u8 dscp; | ||
4282 | |||
4283 | switch (tc_skb_protocol(skb)) { | ||
4284 | case htons(ETH_P_IP): | ||
4285 | - wlen += sizeof(struct iphdr); | ||
4286 | - if (!pskb_may_pull(skb, wlen) || | ||
4287 | - skb_try_make_writable(skb, wlen)) | ||
4288 | + buf = skb_header_pointer(skb, offset, sizeof(buf_), &buf_); | ||
4289 | + if (unlikely(!buf)) | ||
4290 | return 0; | ||
4291 | |||
4292 | - dscp = ipv4_get_dsfield(ip_hdr(skb)) >> 2; | ||
4293 | - if (wash && dscp) | ||
4294 | + /* ToS is in the second byte of iphdr */ | ||
4295 | + dscp = ipv4_get_dsfield((struct iphdr *)buf) >> 2; | ||
4296 | + | ||
4297 | + if (wash && dscp) { | ||
4298 | + const int wlen = offset + sizeof(struct iphdr); | ||
4299 | + | ||
4300 | + if (!pskb_may_pull(skb, wlen) || | ||
4301 | + skb_try_make_writable(skb, wlen)) | ||
4302 | + return 0; | ||
4303 | + | ||
4304 | ipv4_change_dsfield(ip_hdr(skb), INET_ECN_MASK, 0); | ||
4305 | + } | ||
4306 | + | ||
4307 | return dscp; | ||
4308 | |||
4309 | case htons(ETH_P_IPV6): | ||
4310 | - wlen += sizeof(struct ipv6hdr); | ||
4311 | - if (!pskb_may_pull(skb, wlen) || | ||
4312 | - skb_try_make_writable(skb, wlen)) | ||
4313 | + buf = skb_header_pointer(skb, offset, sizeof(buf_), &buf_); | ||
4314 | + if (unlikely(!buf)) | ||
4315 | return 0; | ||
4316 | |||
4317 | - dscp = ipv6_get_dsfield(ipv6_hdr(skb)) >> 2; | ||
4318 | - if (wash && dscp) | ||
4319 | + /* Traffic class is in the first and second bytes of ipv6hdr */ | ||
4320 | + dscp = ipv6_get_dsfield((struct ipv6hdr *)buf) >> 2; | ||
4321 | + | ||
4322 | + if (wash && dscp) { | ||
4323 | + const int wlen = offset + sizeof(struct ipv6hdr); | ||
4324 | + | ||
4325 | + if (!pskb_may_pull(skb, wlen) || | ||
4326 | + skb_try_make_writable(skb, wlen)) | ||
4327 | + return 0; | ||
4328 | + | ||
4329 | ipv6_change_dsfield(ipv6_hdr(skb), INET_ECN_MASK, 0); | ||
4330 | + } | ||
4331 | + | ||
4332 | return dscp; | ||
4333 | |||
4334 | case htons(ETH_P_ARP): | ||
4335 | @@ -1557,14 +1576,17 @@ static struct cake_tin_data *cake_select_tin(struct Qdisc *sch, | ||
4336 | { | ||
4337 | struct cake_sched_data *q = qdisc_priv(sch); | ||
4338 | u32 tin, mark; | ||
4339 | + bool wash; | ||
4340 | u8 dscp; | ||
4341 | |||
4342 | /* Tin selection: Default to diffserv-based selection, allow overriding | ||
4343 | - * using firewall marks or skb->priority. | ||
4344 | + * using firewall marks or skb->priority. Call DSCP parsing early if | ||
4345 | + * wash is enabled, otherwise defer to below to skip unneeded parsing. | ||
4346 | */ | ||
4347 | - dscp = cake_handle_diffserv(skb, | ||
4348 | - q->rate_flags & CAKE_FLAG_WASH); | ||
4349 | mark = (skb->mark & q->fwmark_mask) >> q->fwmark_shft; | ||
4350 | + wash = !!(q->rate_flags & CAKE_FLAG_WASH); | ||
4351 | + if (wash) | ||
4352 | + dscp = cake_handle_diffserv(skb, wash); | ||
4353 | |||
4354 | if (q->tin_mode == CAKE_DIFFSERV_BESTEFFORT) | ||
4355 | tin = 0; | ||
4356 | @@ -1578,6 +1600,8 @@ static struct cake_tin_data *cake_select_tin(struct Qdisc *sch, | ||
4357 | tin = q->tin_order[TC_H_MIN(skb->priority) - 1]; | ||
4358 | |||
4359 | else { | ||
4360 | + if (!wash) | ||
4361 | + dscp = cake_handle_diffserv(skb, wash); | ||
4362 | tin = q->tin_index[dscp]; | ||
4363 | |||
4364 | if (unlikely(tin >= q->tin_cnt)) | ||
4365 | @@ -2679,7 +2703,7 @@ static int cake_init(struct Qdisc *sch, struct nlattr *opt, | ||
4366 | qdisc_watchdog_init(&q->watchdog, sch); | ||
4367 | |||
4368 | if (opt) { | ||
4369 | - int err = cake_change(sch, opt, extack); | ||
4370 | + err = cake_change(sch, opt, extack); | ||
4371 | |||
4372 | if (err) | ||
4373 | return err; | ||
4374 | @@ -2996,7 +3020,7 @@ static int cake_dump_class_stats(struct Qdisc *sch, unsigned long cl, | ||
4375 | PUT_STAT_S32(BLUE_TIMER_US, | ||
4376 | ktime_to_us( | ||
4377 | ktime_sub(now, | ||
4378 | - flow->cvars.blue_timer))); | ||
4379 | + flow->cvars.blue_timer))); | ||
4380 | } | ||
4381 | if (flow->cvars.dropping) { | ||
4382 | PUT_STAT_S32(DROP_NEXT_US, | ||
4383 | diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c | ||
4384 | index 7c3c5fdb82a9..896c9037155a 100644 | ||
4385 | --- a/net/sched/sch_generic.c | ||
4386 | +++ b/net/sched/sch_generic.c | ||
4387 | @@ -469,6 +469,7 @@ void __netdev_watchdog_up(struct net_device *dev) | ||
4388 | dev_hold(dev); | ||
4389 | } | ||
4390 | } | ||
4391 | +EXPORT_SYMBOL_GPL(__netdev_watchdog_up); | ||
4392 | |||
4393 | static void dev_watchdog_up(struct net_device *dev) | ||
4394 | { | ||
4395 | diff --git a/net/sctp/associola.c b/net/sctp/associola.c | ||
4396 | index 41839b85c268..fb6f62264e87 100644 | ||
4397 | --- a/net/sctp/associola.c | ||
4398 | +++ b/net/sctp/associola.c | ||
4399 | @@ -1569,12 +1569,15 @@ void sctp_assoc_rwnd_decrease(struct sctp_association *asoc, unsigned int len) | ||
4400 | int sctp_assoc_set_bind_addr_from_ep(struct sctp_association *asoc, | ||
4401 | enum sctp_scope scope, gfp_t gfp) | ||
4402 | { | ||
4403 | + struct sock *sk = asoc->base.sk; | ||
4404 | int flags; | ||
4405 | |||
4406 | /* Use scoping rules to determine the subset of addresses from | ||
4407 | * the endpoint. | ||
4408 | */ | ||
4409 | - flags = (PF_INET6 == asoc->base.sk->sk_family) ? SCTP_ADDR6_ALLOWED : 0; | ||
4410 | + flags = (PF_INET6 == sk->sk_family) ? SCTP_ADDR6_ALLOWED : 0; | ||
4411 | + if (!inet_v6_ipv6only(sk)) | ||
4412 | + flags |= SCTP_ADDR4_ALLOWED; | ||
4413 | if (asoc->peer.ipv4_address) | ||
4414 | flags |= SCTP_ADDR4_PEERSUPP; | ||
4415 | if (asoc->peer.ipv6_address) | ||
4416 | diff --git a/net/sctp/bind_addr.c b/net/sctp/bind_addr.c | ||
4417 | index 53bc61537f44..701c5a4e441d 100644 | ||
4418 | --- a/net/sctp/bind_addr.c | ||
4419 | +++ b/net/sctp/bind_addr.c | ||
4420 | @@ -461,6 +461,7 @@ static int sctp_copy_one_addr(struct net *net, struct sctp_bind_addr *dest, | ||
4421 | * well as the remote peer. | ||
4422 | */ | ||
4423 | if ((((AF_INET == addr->sa.sa_family) && | ||
4424 | + (flags & SCTP_ADDR4_ALLOWED) && | ||
4425 | (flags & SCTP_ADDR4_PEERSUPP))) || | ||
4426 | (((AF_INET6 == addr->sa.sa_family) && | ||
4427 | (flags & SCTP_ADDR6_ALLOWED) && | ||
4428 | diff --git a/net/sctp/protocol.c b/net/sctp/protocol.c | ||
4429 | index 237c88eeb538..981c7cbca46a 100644 | ||
4430 | --- a/net/sctp/protocol.c | ||
4431 | +++ b/net/sctp/protocol.c | ||
4432 | @@ -148,7 +148,8 @@ int sctp_copy_local_addr_list(struct net *net, struct sctp_bind_addr *bp, | ||
4433 | * sock as well as the remote peer. | ||
4434 | */ | ||
4435 | if (addr->a.sa.sa_family == AF_INET && | ||
4436 | - !(copy_flags & SCTP_ADDR4_PEERSUPP)) | ||
4437 | + (!(copy_flags & SCTP_ADDR4_ALLOWED) || | ||
4438 | + !(copy_flags & SCTP_ADDR4_PEERSUPP))) | ||
4439 | continue; | ||
4440 | if (addr->a.sa.sa_family == AF_INET6 && | ||
4441 | (!(copy_flags & SCTP_ADDR6_ALLOWED) || | ||
4442 | diff --git a/net/sunrpc/rpc_pipe.c b/net/sunrpc/rpc_pipe.c | ||
4443 | index b71a39ded930..37792675ed57 100644 | ||
4444 | --- a/net/sunrpc/rpc_pipe.c | ||
4445 | +++ b/net/sunrpc/rpc_pipe.c | ||
4446 | @@ -1317,6 +1317,7 @@ rpc_gssd_dummy_populate(struct dentry *root, struct rpc_pipe *pipe_data) | ||
4447 | q.len = strlen(gssd_dummy_clnt_dir[0].name); | ||
4448 | clnt_dentry = d_hash_and_lookup(gssd_dentry, &q); | ||
4449 | if (!clnt_dentry) { | ||
4450 | + __rpc_depopulate(gssd_dentry, gssd_dummy_clnt_dir, 0, 1); | ||
4451 | pipe_dentry = ERR_PTR(-ENOENT); | ||
4452 | goto out; | ||
4453 | } | ||
4454 | diff --git a/net/sunrpc/xdr.c b/net/sunrpc/xdr.c | ||
4455 | index 451ca7ec321c..7ef37054071f 100644 | ||
4456 | --- a/net/sunrpc/xdr.c | ||
4457 | +++ b/net/sunrpc/xdr.c | ||
4458 | @@ -1118,6 +1118,7 @@ xdr_buf_subsegment(struct xdr_buf *buf, struct xdr_buf *subbuf, | ||
4459 | base = 0; | ||
4460 | } else { | ||
4461 | base -= buf->head[0].iov_len; | ||
4462 | + subbuf->head[0].iov_base = buf->head[0].iov_base; | ||
4463 | subbuf->head[0].iov_len = 0; | ||
4464 | } | ||
4465 | |||
4466 | @@ -1130,6 +1131,8 @@ xdr_buf_subsegment(struct xdr_buf *buf, struct xdr_buf *subbuf, | ||
4467 | base = 0; | ||
4468 | } else { | ||
4469 | base -= buf->page_len; | ||
4470 | + subbuf->pages = buf->pages; | ||
4471 | + subbuf->page_base = 0; | ||
4472 | subbuf->page_len = 0; | ||
4473 | } | ||
4474 | |||
4475 | @@ -1141,6 +1144,7 @@ xdr_buf_subsegment(struct xdr_buf *buf, struct xdr_buf *subbuf, | ||
4476 | base = 0; | ||
4477 | } else { | ||
4478 | base -= buf->tail[0].iov_len; | ||
4479 | + subbuf->tail[0].iov_base = buf->tail[0].iov_base; | ||
4480 | subbuf->tail[0].iov_len = 0; | ||
4481 | } | ||
4482 | |||
4483 | diff --git a/net/sunrpc/xprtrdma/rpc_rdma.c b/net/sunrpc/xprtrdma/rpc_rdma.c | ||
4484 | index ef5102b60589..c56e6cfc4a62 100644 | ||
4485 | --- a/net/sunrpc/xprtrdma/rpc_rdma.c | ||
4486 | +++ b/net/sunrpc/xprtrdma/rpc_rdma.c | ||
4487 | @@ -1246,8 +1246,7 @@ rpcrdma_decode_error(struct rpcrdma_xprt *r_xprt, struct rpcrdma_rep *rep, | ||
4488 | be32_to_cpup(p), be32_to_cpu(rep->rr_xid)); | ||
4489 | } | ||
4490 | |||
4491 | - r_xprt->rx_stats.bad_reply_count++; | ||
4492 | - return -EREMOTEIO; | ||
4493 | + return -EIO; | ||
4494 | } | ||
4495 | |||
4496 | /* Perform XID lookup, reconstruction of the RPC reply, and | ||
4497 | @@ -1284,13 +1283,11 @@ out: | ||
4498 | spin_unlock(&xprt->queue_lock); | ||
4499 | return; | ||
4500 | |||
4501 | -/* If the incoming reply terminated a pending RPC, the next | ||
4502 | - * RPC call will post a replacement receive buffer as it is | ||
4503 | - * being marshaled. | ||
4504 | - */ | ||
4505 | out_badheader: | ||
4506 | trace_xprtrdma_reply_hdr(rep); | ||
4507 | r_xprt->rx_stats.bad_reply_count++; | ||
4508 | + rqst->rq_task->tk_status = status; | ||
4509 | + status = 0; | ||
4510 | goto out; | ||
4511 | } | ||
4512 | |||
4513 | diff --git a/net/xfrm/xfrm_device.c b/net/xfrm/xfrm_device.c | ||
4514 | index c365b918be35..bb2292b5260c 100644 | ||
4515 | --- a/net/xfrm/xfrm_device.c | ||
4516 | +++ b/net/xfrm/xfrm_device.c | ||
4517 | @@ -82,7 +82,7 @@ struct sk_buff *validate_xmit_xfrm(struct sk_buff *skb, netdev_features_t featur | ||
4518 | struct xfrm_offload *xo = xfrm_offload(skb); | ||
4519 | struct sec_path *sp; | ||
4520 | |||
4521 | - if (!xo) | ||
4522 | + if (!xo || (xo->flags & XFRM_XMIT)) | ||
4523 | return skb; | ||
4524 | |||
4525 | if (!(features & NETIF_F_HW_ESP)) | ||
4526 | @@ -103,6 +103,8 @@ struct sk_buff *validate_xmit_xfrm(struct sk_buff *skb, netdev_features_t featur | ||
4527 | return skb; | ||
4528 | } | ||
4529 | |||
4530 | + xo->flags |= XFRM_XMIT; | ||
4531 | + | ||
4532 | if (skb_is_gso(skb)) { | ||
4533 | struct net_device *dev = skb->dev; | ||
4534 | |||
4535 | diff --git a/samples/bpf/xdp_monitor_user.c b/samples/bpf/xdp_monitor_user.c | ||
4536 | index dd558cbb2309..ef53b93db573 100644 | ||
4537 | --- a/samples/bpf/xdp_monitor_user.c | ||
4538 | +++ b/samples/bpf/xdp_monitor_user.c | ||
4539 | @@ -509,11 +509,8 @@ static void *alloc_rec_per_cpu(int record_size) | ||
4540 | { | ||
4541 | unsigned int nr_cpus = bpf_num_possible_cpus(); | ||
4542 | void *array; | ||
4543 | - size_t size; | ||
4544 | |||
4545 | - size = record_size * nr_cpus; | ||
4546 | - array = malloc(size); | ||
4547 | - memset(array, 0, size); | ||
4548 | + array = calloc(nr_cpus, record_size); | ||
4549 | if (!array) { | ||
4550 | fprintf(stderr, "Mem alloc error (nr_cpus:%u)\n", nr_cpus); | ||
4551 | exit(EXIT_FAIL_MEM); | ||
4552 | @@ -528,8 +525,7 @@ static struct stats_record *alloc_stats_record(void) | ||
4553 | int i; | ||
4554 | |||
4555 | /* Alloc main stats_record structure */ | ||
4556 | - rec = malloc(sizeof(*rec)); | ||
4557 | - memset(rec, 0, sizeof(*rec)); | ||
4558 | + rec = calloc(1, sizeof(*rec)); | ||
4559 | if (!rec) { | ||
4560 | fprintf(stderr, "Mem alloc error\n"); | ||
4561 | exit(EXIT_FAIL_MEM); | ||
4562 | diff --git a/samples/bpf/xdp_redirect_cpu_kern.c b/samples/bpf/xdp_redirect_cpu_kern.c | ||
4563 | index cfcc31e51197..d94a999b4b4b 100644 | ||
4564 | --- a/samples/bpf/xdp_redirect_cpu_kern.c | ||
4565 | +++ b/samples/bpf/xdp_redirect_cpu_kern.c | ||
4566 | @@ -15,7 +15,7 @@ | ||
4567 | #include "bpf_helpers.h" | ||
4568 | #include "hash_func01.h" | ||
4569 | |||
4570 | -#define MAX_CPUS 64 /* WARNING - sync with _user.c */ | ||
4571 | +#define MAX_CPUS NR_CPUS | ||
4572 | |||
4573 | /* Special map type that can XDP_REDIRECT frames to another CPU */ | ||
4574 | struct { | ||
4575 | diff --git a/samples/bpf/xdp_redirect_cpu_user.c b/samples/bpf/xdp_redirect_cpu_user.c | ||
4576 | index 8b862a7a6c6a..0a7672556822 100644 | ||
4577 | --- a/samples/bpf/xdp_redirect_cpu_user.c | ||
4578 | +++ b/samples/bpf/xdp_redirect_cpu_user.c | ||
4579 | @@ -13,6 +13,7 @@ static const char *__doc__ = | ||
4580 | #include <unistd.h> | ||
4581 | #include <locale.h> | ||
4582 | #include <sys/resource.h> | ||
4583 | +#include <sys/sysinfo.h> | ||
4584 | #include <getopt.h> | ||
4585 | #include <net/if.h> | ||
4586 | #include <time.h> | ||
4587 | @@ -24,8 +25,6 @@ static const char *__doc__ = | ||
4588 | #include <arpa/inet.h> | ||
4589 | #include <linux/if_link.h> | ||
4590 | |||
4591 | -#define MAX_CPUS 64 /* WARNING - sync with _kern.c */ | ||
4592 | - | ||
4593 | /* How many xdp_progs are defined in _kern.c */ | ||
4594 | #define MAX_PROG 6 | ||
4595 | |||
4596 | @@ -40,6 +39,7 @@ static char *ifname; | ||
4597 | static __u32 prog_id; | ||
4598 | |||
4599 | static __u32 xdp_flags = XDP_FLAGS_UPDATE_IF_NOEXIST; | ||
4600 | +static int n_cpus; | ||
4601 | static int cpu_map_fd; | ||
4602 | static int rx_cnt_map_fd; | ||
4603 | static int redirect_err_cnt_map_fd; | ||
4604 | @@ -170,7 +170,7 @@ struct stats_record { | ||
4605 | struct record redir_err; | ||
4606 | struct record kthread; | ||
4607 | struct record exception; | ||
4608 | - struct record enq[MAX_CPUS]; | ||
4609 | + struct record enq[]; | ||
4610 | }; | ||
4611 | |||
4612 | static bool map_collect_percpu(int fd, __u32 key, struct record *rec) | ||
4613 | @@ -210,11 +210,8 @@ static struct datarec *alloc_record_per_cpu(void) | ||
4614 | { | ||
4615 | unsigned int nr_cpus = bpf_num_possible_cpus(); | ||
4616 | struct datarec *array; | ||
4617 | - size_t size; | ||
4618 | |||
4619 | - size = sizeof(struct datarec) * nr_cpus; | ||
4620 | - array = malloc(size); | ||
4621 | - memset(array, 0, size); | ||
4622 | + array = calloc(nr_cpus, sizeof(struct datarec)); | ||
4623 | if (!array) { | ||
4624 | fprintf(stderr, "Mem alloc error (nr_cpus:%u)\n", nr_cpus); | ||
4625 | exit(EXIT_FAIL_MEM); | ||
4626 | @@ -225,19 +222,20 @@ static struct datarec *alloc_record_per_cpu(void) | ||
4627 | static struct stats_record *alloc_stats_record(void) | ||
4628 | { | ||
4629 | struct stats_record *rec; | ||
4630 | - int i; | ||
4631 | + int i, size; | ||
4632 | |||
4633 | - rec = malloc(sizeof(*rec)); | ||
4634 | - memset(rec, 0, sizeof(*rec)); | ||
4635 | + size = sizeof(*rec) + n_cpus * sizeof(struct record); | ||
4636 | + rec = malloc(size); | ||
4637 | if (!rec) { | ||
4638 | fprintf(stderr, "Mem alloc error\n"); | ||
4639 | exit(EXIT_FAIL_MEM); | ||
4640 | } | ||
4641 | + memset(rec, 0, size); | ||
4642 | rec->rx_cnt.cpu = alloc_record_per_cpu(); | ||
4643 | rec->redir_err.cpu = alloc_record_per_cpu(); | ||
4644 | rec->kthread.cpu = alloc_record_per_cpu(); | ||
4645 | rec->exception.cpu = alloc_record_per_cpu(); | ||
4646 | - for (i = 0; i < MAX_CPUS; i++) | ||
4647 | + for (i = 0; i < n_cpus; i++) | ||
4648 | rec->enq[i].cpu = alloc_record_per_cpu(); | ||
4649 | |||
4650 | return rec; | ||
4651 | @@ -247,7 +245,7 @@ static void free_stats_record(struct stats_record *r) | ||
4652 | { | ||
4653 | int i; | ||
4654 | |||
4655 | - for (i = 0; i < MAX_CPUS; i++) | ||
4656 | + for (i = 0; i < n_cpus; i++) | ||
4657 | free(r->enq[i].cpu); | ||
4658 | free(r->exception.cpu); | ||
4659 | free(r->kthread.cpu); | ||
4660 | @@ -350,7 +348,7 @@ static void stats_print(struct stats_record *stats_rec, | ||
4661 | } | ||
4662 | |||
4663 | /* cpumap enqueue stats */ | ||
4664 | - for (to_cpu = 0; to_cpu < MAX_CPUS; to_cpu++) { | ||
4665 | + for (to_cpu = 0; to_cpu < n_cpus; to_cpu++) { | ||
4666 | char *fmt = "%-15s %3d:%-3d %'-14.0f %'-11.0f %'-10.2f %s\n"; | ||
4667 | char *fm2 = "%-15s %3s:%-3d %'-14.0f %'-11.0f %'-10.2f %s\n"; | ||
4668 | char *errstr = ""; | ||
4669 | @@ -475,7 +473,7 @@ static void stats_collect(struct stats_record *rec) | ||
4670 | map_collect_percpu(fd, 1, &rec->redir_err); | ||
4671 | |||
4672 | fd = cpumap_enqueue_cnt_map_fd; | ||
4673 | - for (i = 0; i < MAX_CPUS; i++) | ||
4674 | + for (i = 0; i < n_cpus; i++) | ||
4675 | map_collect_percpu(fd, i, &rec->enq[i]); | ||
4676 | |||
4677 | fd = cpumap_kthread_cnt_map_fd; | ||
4678 | @@ -549,10 +547,10 @@ static int create_cpu_entry(__u32 cpu, __u32 queue_size, | ||
4679 | */ | ||
4680 | static void mark_cpus_unavailable(void) | ||
4681 | { | ||
4682 | - __u32 invalid_cpu = MAX_CPUS; | ||
4683 | + __u32 invalid_cpu = n_cpus; | ||
4684 | int ret, i; | ||
4685 | |||
4686 | - for (i = 0; i < MAX_CPUS; i++) { | ||
4687 | + for (i = 0; i < n_cpus; i++) { | ||
4688 | ret = bpf_map_update_elem(cpus_available_map_fd, &i, | ||
4689 | &invalid_cpu, 0); | ||
4690 | if (ret) { | ||
4691 | @@ -688,6 +686,8 @@ int main(int argc, char **argv) | ||
4692 | int prog_fd; | ||
4693 | __u32 qsize; | ||
4694 | |||
4695 | + n_cpus = get_nprocs_conf(); | ||
4696 | + | ||
4697 | /* Notice: choosing he queue size is very important with the | ||
4698 | * ixgbe driver, because it's driver page recycling trick is | ||
4699 | * dependend on pages being returned quickly. The number of | ||
4700 | @@ -757,7 +757,7 @@ int main(int argc, char **argv) | ||
4701 | case 'c': | ||
4702 | /* Add multiple CPUs */ | ||
4703 | add_cpu = strtoul(optarg, NULL, 0); | ||
4704 | - if (add_cpu >= MAX_CPUS) { | ||
4705 | + if (add_cpu >= n_cpus) { | ||
4706 | fprintf(stderr, | ||
4707 | "--cpu nr too large for cpumap err(%d):%s\n", | ||
4708 | errno, strerror(errno)); | ||
4709 | diff --git a/samples/bpf/xdp_rxq_info_user.c b/samples/bpf/xdp_rxq_info_user.c | ||
4710 | index b88df17853b8..21d6e5067a83 100644 | ||
4711 | --- a/samples/bpf/xdp_rxq_info_user.c | ||
4712 | +++ b/samples/bpf/xdp_rxq_info_user.c | ||
4713 | @@ -198,11 +198,8 @@ static struct datarec *alloc_record_per_cpu(void) | ||
4714 | { | ||
4715 | unsigned int nr_cpus = bpf_num_possible_cpus(); | ||
4716 | struct datarec *array; | ||
4717 | - size_t size; | ||
4718 | |||
4719 | - size = sizeof(struct datarec) * nr_cpus; | ||
4720 | - array = malloc(size); | ||
4721 | - memset(array, 0, size); | ||
4722 | + array = calloc(nr_cpus, sizeof(struct datarec)); | ||
4723 | if (!array) { | ||
4724 | fprintf(stderr, "Mem alloc error (nr_cpus:%u)\n", nr_cpus); | ||
4725 | exit(EXIT_FAIL_MEM); | ||
4726 | @@ -214,11 +211,8 @@ static struct record *alloc_record_per_rxq(void) | ||
4727 | { | ||
4728 | unsigned int nr_rxqs = bpf_map__def(rx_queue_index_map)->max_entries; | ||
4729 | struct record *array; | ||
4730 | - size_t size; | ||
4731 | |||
4732 | - size = sizeof(struct record) * nr_rxqs; | ||
4733 | - array = malloc(size); | ||
4734 | - memset(array, 0, size); | ||
4735 | + array = calloc(nr_rxqs, sizeof(struct record)); | ||
4736 | if (!array) { | ||
4737 | fprintf(stderr, "Mem alloc error (nr_rxqs:%u)\n", nr_rxqs); | ||
4738 | exit(EXIT_FAIL_MEM); | ||
4739 | @@ -232,8 +226,7 @@ static struct stats_record *alloc_stats_record(void) | ||
4740 | struct stats_record *rec; | ||
4741 | int i; | ||
4742 | |||
4743 | - rec = malloc(sizeof(*rec)); | ||
4744 | - memset(rec, 0, sizeof(*rec)); | ||
4745 | + rec = calloc(1, sizeof(struct stats_record)); | ||
4746 | if (!rec) { | ||
4747 | fprintf(stderr, "Mem alloc error\n"); | ||
4748 | exit(EXIT_FAIL_MEM); | ||
4749 | diff --git a/scripts/Kbuild.include b/scripts/Kbuild.include | ||
4750 | index d1dd4a6b6adb..7da10afc92c6 100644 | ||
4751 | --- a/scripts/Kbuild.include | ||
4752 | +++ b/scripts/Kbuild.include | ||
4753 | @@ -82,20 +82,21 @@ cc-cross-prefix = $(firstword $(foreach c, $(1), \ | ||
4754 | $(if $(shell command -v -- $(c)gcc 2>/dev/null), $(c)))) | ||
4755 | |||
4756 | # output directory for tests below | ||
4757 | -TMPOUT := $(if $(KBUILD_EXTMOD),$(firstword $(KBUILD_EXTMOD))/) | ||
4758 | +TMPOUT = $(if $(KBUILD_EXTMOD),$(firstword $(KBUILD_EXTMOD))/).tmp_$$$$ | ||
4759 | |||
4760 | # try-run | ||
4761 | # Usage: option = $(call try-run, $(CC)...-o "$$TMP",option-ok,otherwise) | ||
4762 | # Exit code chooses option. "$$TMP" serves as a temporary file and is | ||
4763 | # automatically cleaned up. | ||
4764 | try-run = $(shell set -e; \ | ||
4765 | - TMP="$(TMPOUT).$$$$.tmp"; \ | ||
4766 | - TMPO="$(TMPOUT).$$$$.o"; \ | ||
4767 | + TMP=$(TMPOUT)/tmp; \ | ||
4768 | + TMPO=$(TMPOUT)/tmp.o; \ | ||
4769 | + mkdir -p $(TMPOUT); \ | ||
4770 | + trap "rm -rf $(TMPOUT)" EXIT; \ | ||
4771 | if ($(1)) >/dev/null 2>&1; \ | ||
4772 | then echo "$(2)"; \ | ||
4773 | else echo "$(3)"; \ | ||
4774 | - fi; \ | ||
4775 | - rm -f "$$TMP" "$$TMPO") | ||
4776 | + fi) | ||
4777 | |||
4778 | # as-option | ||
4779 | # Usage: cflags-y += $(call as-option,-Wa$(comma)-isa=foo,) | ||
4780 | diff --git a/scripts/recordmcount.h b/scripts/recordmcount.h | ||
4781 | index 74eab03e31d4..f9b19524da11 100644 | ||
4782 | --- a/scripts/recordmcount.h | ||
4783 | +++ b/scripts/recordmcount.h | ||
4784 | @@ -29,6 +29,11 @@ | ||
4785 | #undef has_rel_mcount | ||
4786 | #undef tot_relsize | ||
4787 | #undef get_mcountsym | ||
4788 | +#undef find_symtab | ||
4789 | +#undef get_shnum | ||
4790 | +#undef set_shnum | ||
4791 | +#undef get_shstrndx | ||
4792 | +#undef get_symindex | ||
4793 | #undef get_sym_str_and_relp | ||
4794 | #undef do_func | ||
4795 | #undef Elf_Addr | ||
4796 | @@ -58,6 +63,11 @@ | ||
4797 | # define __has_rel_mcount __has64_rel_mcount | ||
4798 | # define has_rel_mcount has64_rel_mcount | ||
4799 | # define tot_relsize tot64_relsize | ||
4800 | +# define find_symtab find_symtab64 | ||
4801 | +# define get_shnum get_shnum64 | ||
4802 | +# define set_shnum set_shnum64 | ||
4803 | +# define get_shstrndx get_shstrndx64 | ||
4804 | +# define get_symindex get_symindex64 | ||
4805 | # define get_sym_str_and_relp get_sym_str_and_relp_64 | ||
4806 | # define do_func do64 | ||
4807 | # define get_mcountsym get_mcountsym_64 | ||
4808 | @@ -91,6 +101,11 @@ | ||
4809 | # define __has_rel_mcount __has32_rel_mcount | ||
4810 | # define has_rel_mcount has32_rel_mcount | ||
4811 | # define tot_relsize tot32_relsize | ||
4812 | +# define find_symtab find_symtab32 | ||
4813 | +# define get_shnum get_shnum32 | ||
4814 | +# define set_shnum set_shnum32 | ||
4815 | +# define get_shstrndx get_shstrndx32 | ||
4816 | +# define get_symindex get_symindex32 | ||
4817 | # define get_sym_str_and_relp get_sym_str_and_relp_32 | ||
4818 | # define do_func do32 | ||
4819 | # define get_mcountsym get_mcountsym_32 | ||
4820 | @@ -173,6 +188,67 @@ static int MIPS_is_fake_mcount(Elf_Rel const *rp) | ||
4821 | return is_fake; | ||
4822 | } | ||
4823 | |||
4824 | +static unsigned int get_symindex(Elf_Sym const *sym, Elf32_Word const *symtab, | ||
4825 | + Elf32_Word const *symtab_shndx) | ||
4826 | +{ | ||
4827 | + unsigned long offset; | ||
4828 | + int index; | ||
4829 | + | ||
4830 | + if (sym->st_shndx != SHN_XINDEX) | ||
4831 | + return w2(sym->st_shndx); | ||
4832 | + | ||
4833 | + offset = (unsigned long)sym - (unsigned long)symtab; | ||
4834 | + index = offset / sizeof(*sym); | ||
4835 | + | ||
4836 | + return w(symtab_shndx[index]); | ||
4837 | +} | ||
4838 | + | ||
4839 | +static unsigned int get_shnum(Elf_Ehdr const *ehdr, Elf_Shdr const *shdr0) | ||
4840 | +{ | ||
4841 | + if (shdr0 && !ehdr->e_shnum) | ||
4842 | + return w(shdr0->sh_size); | ||
4843 | + | ||
4844 | + return w2(ehdr->e_shnum); | ||
4845 | +} | ||
4846 | + | ||
4847 | +static void set_shnum(Elf_Ehdr *ehdr, Elf_Shdr *shdr0, unsigned int new_shnum) | ||
4848 | +{ | ||
4849 | + if (new_shnum >= SHN_LORESERVE) { | ||
4850 | + ehdr->e_shnum = 0; | ||
4851 | + shdr0->sh_size = w(new_shnum); | ||
4852 | + } else | ||
4853 | + ehdr->e_shnum = w2(new_shnum); | ||
4854 | +} | ||
4855 | + | ||
4856 | +static int get_shstrndx(Elf_Ehdr const *ehdr, Elf_Shdr const *shdr0) | ||
4857 | +{ | ||
4858 | + if (ehdr->e_shstrndx != SHN_XINDEX) | ||
4859 | + return w2(ehdr->e_shstrndx); | ||
4860 | + | ||
4861 | + return w(shdr0->sh_link); | ||
4862 | +} | ||
4863 | + | ||
4864 | +static void find_symtab(Elf_Ehdr *const ehdr, Elf_Shdr const *shdr0, | ||
4865 | + unsigned const nhdr, Elf32_Word **symtab, | ||
4866 | + Elf32_Word **symtab_shndx) | ||
4867 | +{ | ||
4868 | + Elf_Shdr const *relhdr; | ||
4869 | + unsigned k; | ||
4870 | + | ||
4871 | + *symtab = NULL; | ||
4872 | + *symtab_shndx = NULL; | ||
4873 | + | ||
4874 | + for (relhdr = shdr0, k = nhdr; k; --k, ++relhdr) { | ||
4875 | + if (relhdr->sh_type == SHT_SYMTAB) | ||
4876 | + *symtab = (void *)ehdr + relhdr->sh_offset; | ||
4877 | + else if (relhdr->sh_type == SHT_SYMTAB_SHNDX) | ||
4878 | + *symtab_shndx = (void *)ehdr + relhdr->sh_offset; | ||
4879 | + | ||
4880 | + if (*symtab && *symtab_shndx) | ||
4881 | + break; | ||
4882 | + } | ||
4883 | +} | ||
4884 | + | ||
4885 | /* Append the new shstrtab, Elf_Shdr[], __mcount_loc and its relocations. */ | ||
4886 | static int append_func(Elf_Ehdr *const ehdr, | ||
4887 | Elf_Shdr *const shstr, | ||
4888 | @@ -188,10 +264,12 @@ static int append_func(Elf_Ehdr *const ehdr, | ||
4889 | char const *mc_name = (sizeof(Elf_Rela) == rel_entsize) | ||
4890 | ? ".rela__mcount_loc" | ||
4891 | : ".rel__mcount_loc"; | ||
4892 | - unsigned const old_shnum = w2(ehdr->e_shnum); | ||
4893 | uint_t const old_shoff = _w(ehdr->e_shoff); | ||
4894 | uint_t const old_shstr_sh_size = _w(shstr->sh_size); | ||
4895 | uint_t const old_shstr_sh_offset = _w(shstr->sh_offset); | ||
4896 | + Elf_Shdr *const shdr0 = (Elf_Shdr *)(old_shoff + (void *)ehdr); | ||
4897 | + unsigned int const old_shnum = get_shnum(ehdr, shdr0); | ||
4898 | + unsigned int const new_shnum = 2 + old_shnum; /* {.rel,}__mcount_loc */ | ||
4899 | uint_t t = 1 + strlen(mc_name) + _w(shstr->sh_size); | ||
4900 | uint_t new_e_shoff; | ||
4901 | |||
4902 | @@ -201,6 +279,8 @@ static int append_func(Elf_Ehdr *const ehdr, | ||
4903 | t += (_align & -t); /* word-byte align */ | ||
4904 | new_e_shoff = t; | ||
4905 | |||
4906 | + set_shnum(ehdr, shdr0, new_shnum); | ||
4907 | + | ||
4908 | /* body for new shstrtab */ | ||
4909 | if (ulseek(sb.st_size, SEEK_SET) < 0) | ||
4910 | return -1; | ||
4911 | @@ -255,7 +335,6 @@ static int append_func(Elf_Ehdr *const ehdr, | ||
4912 | return -1; | ||
4913 | |||
4914 | ehdr->e_shoff = _w(new_e_shoff); | ||
4915 | - ehdr->e_shnum = w2(2 + w2(ehdr->e_shnum)); /* {.rel,}__mcount_loc */ | ||
4916 | if (ulseek(0, SEEK_SET) < 0) | ||
4917 | return -1; | ||
4918 | if (uwrite(ehdr, sizeof(*ehdr)) < 0) | ||
4919 | @@ -434,6 +513,8 @@ static int find_secsym_ndx(unsigned const txtndx, | ||
4920 | uint_t *const recvalp, | ||
4921 | unsigned int *sym_index, | ||
4922 | Elf_Shdr const *const symhdr, | ||
4923 | + Elf32_Word const *symtab, | ||
4924 | + Elf32_Word const *symtab_shndx, | ||
4925 | Elf_Ehdr const *const ehdr) | ||
4926 | { | ||
4927 | Elf_Sym const *const sym0 = (Elf_Sym const *)(_w(symhdr->sh_offset) | ||
4928 | @@ -445,7 +526,7 @@ static int find_secsym_ndx(unsigned const txtndx, | ||
4929 | for (symp = sym0, t = nsym; t; --t, ++symp) { | ||
4930 | unsigned int const st_bind = ELF_ST_BIND(symp->st_info); | ||
4931 | |||
4932 | - if (txtndx == w2(symp->st_shndx) | ||
4933 | + if (txtndx == get_symindex(symp, symtab, symtab_shndx) | ||
4934 | /* avoid STB_WEAK */ | ||
4935 | && (STB_LOCAL == st_bind || STB_GLOBAL == st_bind)) { | ||
4936 | /* function symbols on ARM have quirks, avoid them */ | ||
4937 | @@ -516,21 +597,23 @@ static unsigned tot_relsize(Elf_Shdr const *const shdr0, | ||
4938 | return totrelsz; | ||
4939 | } | ||
4940 | |||
4941 | - | ||
4942 | /* Overall supervision for Elf32 ET_REL file. */ | ||
4943 | static int do_func(Elf_Ehdr *const ehdr, char const *const fname, | ||
4944 | unsigned const reltype) | ||
4945 | { | ||
4946 | Elf_Shdr *const shdr0 = (Elf_Shdr *)(_w(ehdr->e_shoff) | ||
4947 | + (void *)ehdr); | ||
4948 | - unsigned const nhdr = w2(ehdr->e_shnum); | ||
4949 | - Elf_Shdr *const shstr = &shdr0[w2(ehdr->e_shstrndx)]; | ||
4950 | + unsigned const nhdr = get_shnum(ehdr, shdr0); | ||
4951 | + Elf_Shdr *const shstr = &shdr0[get_shstrndx(ehdr, shdr0)]; | ||
4952 | char const *const shstrtab = (char const *)(_w(shstr->sh_offset) | ||
4953 | + (void *)ehdr); | ||
4954 | |||
4955 | Elf_Shdr const *relhdr; | ||
4956 | unsigned k; | ||
4957 | |||
4958 | + Elf32_Word *symtab; | ||
4959 | + Elf32_Word *symtab_shndx; | ||
4960 | + | ||
4961 | /* Upper bound on space: assume all relevant relocs are for mcount. */ | ||
4962 | unsigned totrelsz; | ||
4963 | |||
4964 | @@ -561,6 +644,8 @@ static int do_func(Elf_Ehdr *const ehdr, char const *const fname, | ||
4965 | return -1; | ||
4966 | } | ||
4967 | |||
4968 | + find_symtab(ehdr, shdr0, nhdr, &symtab, &symtab_shndx); | ||
4969 | + | ||
4970 | for (relhdr = shdr0, k = nhdr; k; --k, ++relhdr) { | ||
4971 | char const *const txtname = has_rel_mcount(relhdr, shdr0, | ||
4972 | shstrtab, fname); | ||
4973 | @@ -577,6 +662,7 @@ static int do_func(Elf_Ehdr *const ehdr, char const *const fname, | ||
4974 | result = find_secsym_ndx(w(relhdr->sh_info), txtname, | ||
4975 | &recval, &recsym, | ||
4976 | &shdr0[symsec_sh_link], | ||
4977 | + symtab, symtab_shndx, | ||
4978 | ehdr); | ||
4979 | if (result) | ||
4980 | goto out; | ||
4981 | diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c | ||
4982 | index d41c91468ab3..e78c4367b6c8 100644 | ||
4983 | --- a/sound/pci/hda/patch_hdmi.c | ||
4984 | +++ b/sound/pci/hda/patch_hdmi.c | ||
4985 | @@ -4146,6 +4146,11 @@ HDA_CODEC_ENTRY(0x10de0095, "GPU 95 HDMI/DP", patch_nvhdmi), | ||
4986 | HDA_CODEC_ENTRY(0x10de0097, "GPU 97 HDMI/DP", patch_nvhdmi), | ||
4987 | HDA_CODEC_ENTRY(0x10de0098, "GPU 98 HDMI/DP", patch_nvhdmi), | ||
4988 | HDA_CODEC_ENTRY(0x10de0099, "GPU 99 HDMI/DP", patch_nvhdmi), | ||
4989 | +HDA_CODEC_ENTRY(0x10de009a, "GPU 9a HDMI/DP", patch_nvhdmi), | ||
4990 | +HDA_CODEC_ENTRY(0x10de009d, "GPU 9d HDMI/DP", patch_nvhdmi), | ||
4991 | +HDA_CODEC_ENTRY(0x10de009e, "GPU 9e HDMI/DP", patch_nvhdmi), | ||
4992 | +HDA_CODEC_ENTRY(0x10de009f, "GPU 9f HDMI/DP", patch_nvhdmi), | ||
4993 | +HDA_CODEC_ENTRY(0x10de00a0, "GPU a0 HDMI/DP", patch_nvhdmi), | ||
4994 | HDA_CODEC_ENTRY(0x10de8001, "MCP73 HDMI", patch_nvhdmi_2ch), | ||
4995 | HDA_CODEC_ENTRY(0x10de8067, "MCP67/68 HDMI", patch_nvhdmi_2ch), | ||
4996 | HDA_CODEC_ENTRY(0x11069f80, "VX900 HDMI/DP", patch_via_hdmi), | ||
4997 | diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c | ||
4998 | index 459a7d61326e..34868459104d 100644 | ||
4999 | --- a/sound/pci/hda/patch_realtek.c | ||
5000 | +++ b/sound/pci/hda/patch_realtek.c | ||
5001 | @@ -2460,6 +2460,7 @@ static const struct snd_pci_quirk alc882_fixup_tbl[] = { | ||
5002 | SND_PCI_QUIRK(0x1458, 0xa0b8, "Gigabyte AZ370-Gaming", ALC1220_FIXUP_GB_DUAL_CODECS), | ||
5003 | SND_PCI_QUIRK(0x1458, 0xa0cd, "Gigabyte X570 Aorus Master", ALC1220_FIXUP_CLEVO_P950), | ||
5004 | SND_PCI_QUIRK(0x1458, 0xa0ce, "Gigabyte X570 Aorus Xtreme", ALC1220_FIXUP_CLEVO_P950), | ||
5005 | + SND_PCI_QUIRK(0x1462, 0x11f7, "MSI-GE63", ALC1220_FIXUP_CLEVO_P950), | ||
5006 | SND_PCI_QUIRK(0x1462, 0x1228, "MSI-GP63", ALC1220_FIXUP_CLEVO_P950), | ||
5007 | SND_PCI_QUIRK(0x1462, 0x1275, "MSI-GL63", ALC1220_FIXUP_CLEVO_P950), | ||
5008 | SND_PCI_QUIRK(0x1462, 0x1276, "MSI-GL73", ALC1220_FIXUP_CLEVO_P950), | ||
5009 | @@ -7435,6 +7436,8 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { | ||
5010 | SND_PCI_QUIRK(0x103c, 0x83b9, "HP Spectre x360", ALC269_FIXUP_HP_MUTE_LED_MIC3), | ||
5011 | SND_PCI_QUIRK(0x103c, 0x8497, "HP Envy x360", ALC269_FIXUP_HP_MUTE_LED_MIC3), | ||
5012 | SND_PCI_QUIRK(0x103c, 0x84e7, "HP Pavilion 15", ALC269_FIXUP_HP_MUTE_LED_MIC3), | ||
5013 | + SND_PCI_QUIRK(0x103c, 0x869d, "HP", ALC236_FIXUP_HP_MUTE_LED), | ||
5014 | + SND_PCI_QUIRK(0x103c, 0x8729, "HP", ALC285_FIXUP_HP_GPIO_LED), | ||
5015 | SND_PCI_QUIRK(0x103c, 0x8736, "HP", ALC285_FIXUP_HP_GPIO_LED), | ||
5016 | SND_PCI_QUIRK(0x103c, 0x877a, "HP", ALC285_FIXUP_HP_MUTE_LED), | ||
5017 | SND_PCI_QUIRK(0x103c, 0x877d, "HP", ALC236_FIXUP_HP_MUTE_LED), | ||
5018 | diff --git a/sound/soc/fsl/fsl_ssi.c b/sound/soc/fsl/fsl_ssi.c | ||
5019 | index 537dc69256f0..a4ebd6ddaba1 100644 | ||
5020 | --- a/sound/soc/fsl/fsl_ssi.c | ||
5021 | +++ b/sound/soc/fsl/fsl_ssi.c | ||
5022 | @@ -678,8 +678,9 @@ static int fsl_ssi_set_bclk(struct snd_pcm_substream *substream, | ||
5023 | struct regmap *regs = ssi->regs; | ||
5024 | u32 pm = 999, div2, psr, stccr, mask, afreq, factor, i; | ||
5025 | unsigned long clkrate, baudrate, tmprate; | ||
5026 | - unsigned int slots = params_channels(hw_params); | ||
5027 | - unsigned int slot_width = 32; | ||
5028 | + unsigned int channels = params_channels(hw_params); | ||
5029 | + unsigned int slot_width = params_width(hw_params); | ||
5030 | + unsigned int slots = 2; | ||
5031 | u64 sub, savesub = 100000; | ||
5032 | unsigned int freq; | ||
5033 | bool baudclk_is_used; | ||
5034 | @@ -688,10 +689,14 @@ static int fsl_ssi_set_bclk(struct snd_pcm_substream *substream, | ||
5035 | /* Override slots and slot_width if being specifically set... */ | ||
5036 | if (ssi->slots) | ||
5037 | slots = ssi->slots; | ||
5038 | - /* ...but keep 32 bits if slots is 2 -- I2S Master mode */ | ||
5039 | - if (ssi->slot_width && slots != 2) | ||
5040 | + if (ssi->slot_width) | ||
5041 | slot_width = ssi->slot_width; | ||
5042 | |||
5043 | + /* ...but force 32 bits for stereo audio using I2S Master Mode */ | ||
5044 | + if (channels == 2 && | ||
5045 | + (ssi->i2s_net & SSI_SCR_I2S_MODE_MASK) == SSI_SCR_I2S_MODE_MASTER) | ||
5046 | + slot_width = 32; | ||
5047 | + | ||
5048 | /* Generate bit clock based on the slot number and slot width */ | ||
5049 | freq = slots * slot_width * params_rate(hw_params); | ||
5050 | |||
5051 | diff --git a/sound/soc/qcom/common.c b/sound/soc/qcom/common.c | ||
5052 | index 6c20bdd850f3..8ada4ecba847 100644 | ||
5053 | --- a/sound/soc/qcom/common.c | ||
5054 | +++ b/sound/soc/qcom/common.c | ||
5055 | @@ -4,6 +4,7 @@ | ||
5056 | |||
5057 | #include <linux/module.h> | ||
5058 | #include "common.h" | ||
5059 | +#include "qdsp6/q6afe.h" | ||
5060 | |||
5061 | int qcom_snd_parse_of(struct snd_soc_card *card) | ||
5062 | { | ||
5063 | @@ -101,6 +102,15 @@ int qcom_snd_parse_of(struct snd_soc_card *card) | ||
5064 | } | ||
5065 | link->no_pcm = 1; | ||
5066 | link->ignore_pmdown_time = 1; | ||
5067 | + | ||
5068 | + if (q6afe_is_rx_port(link->id)) { | ||
5069 | + link->dpcm_playback = 1; | ||
5070 | + link->dpcm_capture = 0; | ||
5071 | + } else { | ||
5072 | + link->dpcm_playback = 0; | ||
5073 | + link->dpcm_capture = 1; | ||
5074 | + } | ||
5075 | + | ||
5076 | } else { | ||
5077 | dlc = devm_kzalloc(dev, sizeof(*dlc), GFP_KERNEL); | ||
5078 | if (!dlc) | ||
5079 | @@ -113,12 +123,12 @@ int qcom_snd_parse_of(struct snd_soc_card *card) | ||
5080 | link->codecs->dai_name = "snd-soc-dummy-dai"; | ||
5081 | link->codecs->name = "snd-soc-dummy"; | ||
5082 | link->dynamic = 1; | ||
5083 | + link->dpcm_playback = 1; | ||
5084 | + link->dpcm_capture = 1; | ||
5085 | } | ||
5086 | |||
5087 | link->ignore_suspend = 1; | ||
5088 | link->nonatomic = 1; | ||
5089 | - link->dpcm_playback = 1; | ||
5090 | - link->dpcm_capture = 1; | ||
5091 | link->stream_name = link->name; | ||
5092 | link++; | ||
5093 | |||
5094 | diff --git a/sound/soc/qcom/qdsp6/q6afe.c b/sound/soc/qcom/qdsp6/q6afe.c | ||
5095 | index e0945f7a58c8..0ce4eb60f984 100644 | ||
5096 | --- a/sound/soc/qcom/qdsp6/q6afe.c | ||
5097 | +++ b/sound/soc/qcom/qdsp6/q6afe.c | ||
5098 | @@ -800,6 +800,14 @@ int q6afe_get_port_id(int index) | ||
5099 | } | ||
5100 | EXPORT_SYMBOL_GPL(q6afe_get_port_id); | ||
5101 | |||
5102 | +int q6afe_is_rx_port(int index) | ||
5103 | +{ | ||
5104 | + if (index < 0 || index >= AFE_PORT_MAX) | ||
5105 | + return -EINVAL; | ||
5106 | + | ||
5107 | + return port_maps[index].is_rx; | ||
5108 | +} | ||
5109 | +EXPORT_SYMBOL_GPL(q6afe_is_rx_port); | ||
5110 | static int afe_apr_send_pkt(struct q6afe *afe, struct apr_pkt *pkt, | ||
5111 | struct q6afe_port *port) | ||
5112 | { | ||
5113 | diff --git a/sound/soc/qcom/qdsp6/q6afe.h b/sound/soc/qcom/qdsp6/q6afe.h | ||
5114 | index c7ed5422baff..1a0f80a14afe 100644 | ||
5115 | --- a/sound/soc/qcom/qdsp6/q6afe.h | ||
5116 | +++ b/sound/soc/qcom/qdsp6/q6afe.h | ||
5117 | @@ -198,6 +198,7 @@ int q6afe_port_start(struct q6afe_port *port); | ||
5118 | int q6afe_port_stop(struct q6afe_port *port); | ||
5119 | void q6afe_port_put(struct q6afe_port *port); | ||
5120 | int q6afe_get_port_id(int index); | ||
5121 | +int q6afe_is_rx_port(int index); | ||
5122 | void q6afe_hdmi_port_prepare(struct q6afe_port *port, | ||
5123 | struct q6afe_hdmi_cfg *cfg); | ||
5124 | void q6afe_slim_port_prepare(struct q6afe_port *port, | ||
5125 | diff --git a/sound/soc/qcom/qdsp6/q6asm.c b/sound/soc/qcom/qdsp6/q6asm.c | ||
5126 | index e8141a33a55e..835ac98a789c 100644 | ||
5127 | --- a/sound/soc/qcom/qdsp6/q6asm.c | ||
5128 | +++ b/sound/soc/qcom/qdsp6/q6asm.c | ||
5129 | @@ -25,6 +25,7 @@ | ||
5130 | #define ASM_STREAM_CMD_FLUSH 0x00010BCE | ||
5131 | #define ASM_SESSION_CMD_PAUSE 0x00010BD3 | ||
5132 | #define ASM_DATA_CMD_EOS 0x00010BDB | ||
5133 | +#define ASM_DATA_EVENT_RENDERED_EOS 0x00010C1C | ||
5134 | #define ASM_NULL_POPP_TOPOLOGY 0x00010C68 | ||
5135 | #define ASM_STREAM_CMD_FLUSH_READBUFS 0x00010C09 | ||
5136 | #define ASM_STREAM_CMD_SET_ENCDEC_PARAM 0x00010C10 | ||
5137 | @@ -546,9 +547,6 @@ static int32_t q6asm_stream_callback(struct apr_device *adev, | ||
5138 | case ASM_SESSION_CMD_SUSPEND: | ||
5139 | client_event = ASM_CLIENT_EVENT_CMD_SUSPEND_DONE; | ||
5140 | break; | ||
5141 | - case ASM_DATA_CMD_EOS: | ||
5142 | - client_event = ASM_CLIENT_EVENT_CMD_EOS_DONE; | ||
5143 | - break; | ||
5144 | case ASM_STREAM_CMD_FLUSH: | ||
5145 | client_event = ASM_CLIENT_EVENT_CMD_FLUSH_DONE; | ||
5146 | break; | ||
5147 | @@ -651,6 +649,9 @@ static int32_t q6asm_stream_callback(struct apr_device *adev, | ||
5148 | spin_unlock_irqrestore(&ac->lock, flags); | ||
5149 | } | ||
5150 | |||
5151 | + break; | ||
5152 | + case ASM_DATA_EVENT_RENDERED_EOS: | ||
5153 | + client_event = ASM_CLIENT_EVENT_CMD_EOS_DONE; | ||
5154 | break; | ||
5155 | } | ||
5156 | |||
5157 | diff --git a/sound/soc/rockchip/rockchip_pdm.c b/sound/soc/rockchip/rockchip_pdm.c | ||
5158 | index 7cd42fcfcf38..1707414cfa92 100644 | ||
5159 | --- a/sound/soc/rockchip/rockchip_pdm.c | ||
5160 | +++ b/sound/soc/rockchip/rockchip_pdm.c | ||
5161 | @@ -590,8 +590,10 @@ static int rockchip_pdm_resume(struct device *dev) | ||
5162 | int ret; | ||
5163 | |||
5164 | ret = pm_runtime_get_sync(dev); | ||
5165 | - if (ret < 0) | ||
5166 | + if (ret < 0) { | ||
5167 | + pm_runtime_put(dev); | ||
5168 | return ret; | ||
5169 | + } | ||
5170 | |||
5171 | ret = regcache_sync(pdm->regmap); | ||
5172 | |||
5173 | diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c | ||
5174 | index f55afe3a98e3..9079c380228f 100644 | ||
5175 | --- a/sound/usb/mixer.c | ||
5176 | +++ b/sound/usb/mixer.c | ||
5177 | @@ -576,8 +576,9 @@ static int check_matrix_bitmap(unsigned char *bmap, | ||
5178 | * if failed, give up and free the control instance. | ||
5179 | */ | ||
5180 | |||
5181 | -int snd_usb_mixer_add_control(struct usb_mixer_elem_list *list, | ||
5182 | - struct snd_kcontrol *kctl) | ||
5183 | +int snd_usb_mixer_add_list(struct usb_mixer_elem_list *list, | ||
5184 | + struct snd_kcontrol *kctl, | ||
5185 | + bool is_std_info) | ||
5186 | { | ||
5187 | struct usb_mixer_interface *mixer = list->mixer; | ||
5188 | int err; | ||
5189 | @@ -591,6 +592,7 @@ int snd_usb_mixer_add_control(struct usb_mixer_elem_list *list, | ||
5190 | return err; | ||
5191 | } | ||
5192 | list->kctl = kctl; | ||
5193 | + list->is_std_info = is_std_info; | ||
5194 | list->next_id_elem = mixer->id_elems[list->id]; | ||
5195 | mixer->id_elems[list->id] = list; | ||
5196 | return 0; | ||
5197 | @@ -3213,8 +3215,11 @@ void snd_usb_mixer_notify_id(struct usb_mixer_interface *mixer, int unitid) | ||
5198 | unitid = delegate_notify(mixer, unitid, NULL, NULL); | ||
5199 | |||
5200 | for_each_mixer_elem(list, mixer, unitid) { | ||
5201 | - struct usb_mixer_elem_info *info = | ||
5202 | - mixer_elem_list_to_info(list); | ||
5203 | + struct usb_mixer_elem_info *info; | ||
5204 | + | ||
5205 | + if (!list->is_std_info) | ||
5206 | + continue; | ||
5207 | + info = mixer_elem_list_to_info(list); | ||
5208 | /* invalidate cache, so the value is read from the device */ | ||
5209 | info->cached = 0; | ||
5210 | snd_ctl_notify(mixer->chip->card, SNDRV_CTL_EVENT_MASK_VALUE, | ||
5211 | @@ -3294,6 +3299,8 @@ static void snd_usb_mixer_interrupt_v2(struct usb_mixer_interface *mixer, | ||
5212 | |||
5213 | if (!list->kctl) | ||
5214 | continue; | ||
5215 | + if (!list->is_std_info) | ||
5216 | + continue; | ||
5217 | |||
5218 | info = mixer_elem_list_to_info(list); | ||
5219 | if (count > 1 && info->control != control) | ||
5220 | diff --git a/sound/usb/mixer.h b/sound/usb/mixer.h | ||
5221 | index 8e0fb7fdf1a0..01b5e5cc2221 100644 | ||
5222 | --- a/sound/usb/mixer.h | ||
5223 | +++ b/sound/usb/mixer.h | ||
5224 | @@ -66,6 +66,7 @@ struct usb_mixer_elem_list { | ||
5225 | struct usb_mixer_elem_list *next_id_elem; /* list of controls with same id */ | ||
5226 | struct snd_kcontrol *kctl; | ||
5227 | unsigned int id; | ||
5228 | + bool is_std_info; | ||
5229 | usb_mixer_elem_dump_func_t dump; | ||
5230 | usb_mixer_elem_resume_func_t resume; | ||
5231 | }; | ||
5232 | @@ -103,8 +104,12 @@ void snd_usb_mixer_notify_id(struct usb_mixer_interface *mixer, int unitid); | ||
5233 | int snd_usb_mixer_set_ctl_value(struct usb_mixer_elem_info *cval, | ||
5234 | int request, int validx, int value_set); | ||
5235 | |||
5236 | -int snd_usb_mixer_add_control(struct usb_mixer_elem_list *list, | ||
5237 | - struct snd_kcontrol *kctl); | ||
5238 | +int snd_usb_mixer_add_list(struct usb_mixer_elem_list *list, | ||
5239 | + struct snd_kcontrol *kctl, | ||
5240 | + bool is_std_info); | ||
5241 | + | ||
5242 | +#define snd_usb_mixer_add_control(list, kctl) \ | ||
5243 | + snd_usb_mixer_add_list(list, kctl, true) | ||
5244 | |||
5245 | void snd_usb_mixer_elem_init_std(struct usb_mixer_elem_list *list, | ||
5246 | struct usb_mixer_interface *mixer, | ||
5247 | diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c | ||
5248 | index dc181066c799..d39bf5b648d1 100644 | ||
5249 | --- a/sound/usb/mixer_quirks.c | ||
5250 | +++ b/sound/usb/mixer_quirks.c | ||
5251 | @@ -157,7 +157,8 @@ static int add_single_ctl_with_resume(struct usb_mixer_interface *mixer, | ||
5252 | return -ENOMEM; | ||
5253 | } | ||
5254 | kctl->private_free = snd_usb_mixer_elem_free; | ||
5255 | - return snd_usb_mixer_add_control(list, kctl); | ||
5256 | + /* don't use snd_usb_mixer_add_control() here, this is a special list element */ | ||
5257 | + return snd_usb_mixer_add_list(list, kctl, false); | ||
5258 | } | ||
5259 | |||
5260 | /* | ||
5261 | diff --git a/sound/usb/pcm.c b/sound/usb/pcm.c | ||
5262 | index 6c391e5fad2a..b971d9aaa64a 100644 | ||
5263 | --- a/sound/usb/pcm.c | ||
5264 | +++ b/sound/usb/pcm.c | ||
5265 | @@ -349,6 +349,7 @@ static int set_sync_ep_implicit_fb_quirk(struct snd_usb_substream *subs, | ||
5266 | ifnum = 0; | ||
5267 | goto add_sync_ep_from_ifnum; | ||
5268 | case USB_ID(0x07fd, 0x0008): /* MOTU M Series */ | ||
5269 | + case USB_ID(0x31e9, 0x0002): /* Solid State Logic SSL2+ */ | ||
5270 | ep = 0x81; | ||
5271 | ifnum = 2; | ||
5272 | goto add_sync_ep_from_ifnum; | ||
5273 | @@ -1778,6 +1779,7 @@ static int snd_usb_substream_capture_trigger(struct snd_pcm_substream *substream | ||
5274 | return 0; | ||
5275 | case SNDRV_PCM_TRIGGER_STOP: | ||
5276 | stop_endpoints(subs, false); | ||
5277 | + subs->data_endpoint->retire_data_urb = NULL; | ||
5278 | subs->running = 0; | ||
5279 | return 0; | ||
5280 | case SNDRV_PCM_TRIGGER_PAUSE_PUSH: | ||
5281 | diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c | ||
5282 | index 092720ce2c55..bf5083a20b6d 100644 | ||
5283 | --- a/sound/usb/quirks.c | ||
5284 | +++ b/sound/usb/quirks.c | ||
5285 | @@ -1461,6 +1461,7 @@ bool snd_usb_get_sample_rate_quirk(struct snd_usb_audio *chip) | ||
5286 | static bool is_itf_usb_dsd_dac(unsigned int id) | ||
5287 | { | ||
5288 | switch (id) { | ||
5289 | + case USB_ID(0x154e, 0x1002): /* Denon DCD-1500RE */ | ||
5290 | case USB_ID(0x154e, 0x1003): /* Denon DA-300USB */ | ||
5291 | case USB_ID(0x154e, 0x3005): /* Marantz HD-DAC1 */ | ||
5292 | case USB_ID(0x154e, 0x3006): /* Marantz SA-14S1 */ | ||
5293 | @@ -1602,6 +1603,14 @@ void snd_usb_ctl_msg_quirk(struct usb_device *dev, unsigned int pipe, | ||
5294 | chip->usb_id == USB_ID(0x0951, 0x16ad)) && | ||
5295 | (requesttype & USB_TYPE_MASK) == USB_TYPE_CLASS) | ||
5296 | usleep_range(1000, 2000); | ||
5297 | + | ||
5298 | + /* | ||
5299 | + * Samsung USBC Headset (AKG) need a tiny delay after each | ||
5300 | + * class compliant request. (Model number: AAM625R or AAM627R) | ||
5301 | + */ | ||
5302 | + if (chip->usb_id == USB_ID(0x04e8, 0xa051) && | ||
5303 | + (requesttype & USB_TYPE_MASK) == USB_TYPE_CLASS) | ||
5304 | + usleep_range(5000, 6000); | ||
5305 | } | ||
5306 | |||
5307 | /* | ||
5308 | diff --git a/tools/testing/selftests/net/so_txtime.c b/tools/testing/selftests/net/so_txtime.c | ||
5309 | index 383bac05ac32..ceaad78e9667 100644 | ||
5310 | --- a/tools/testing/selftests/net/so_txtime.c | ||
5311 | +++ b/tools/testing/selftests/net/so_txtime.c | ||
5312 | @@ -15,8 +15,9 @@ | ||
5313 | #include <inttypes.h> | ||
5314 | #include <linux/net_tstamp.h> | ||
5315 | #include <linux/errqueue.h> | ||
5316 | +#include <linux/if_ether.h> | ||
5317 | #include <linux/ipv6.h> | ||
5318 | -#include <linux/tcp.h> | ||
5319 | +#include <linux/udp.h> | ||
5320 | #include <stdbool.h> | ||
5321 | #include <stdlib.h> | ||
5322 | #include <stdio.h> | ||
5323 | @@ -140,8 +141,8 @@ static void do_recv_errqueue_timeout(int fdt) | ||
5324 | { | ||
5325 | char control[CMSG_SPACE(sizeof(struct sock_extended_err)) + | ||
5326 | CMSG_SPACE(sizeof(struct sockaddr_in6))] = {0}; | ||
5327 | - char data[sizeof(struct ipv6hdr) + | ||
5328 | - sizeof(struct tcphdr) + 1]; | ||
5329 | + char data[sizeof(struct ethhdr) + sizeof(struct ipv6hdr) + | ||
5330 | + sizeof(struct udphdr) + 1]; | ||
5331 | struct sock_extended_err *err; | ||
5332 | struct msghdr msg = {0}; | ||
5333 | struct iovec iov = {0}; | ||
5334 | @@ -159,6 +160,8 @@ static void do_recv_errqueue_timeout(int fdt) | ||
5335 | msg.msg_controllen = sizeof(control); | ||
5336 | |||
5337 | while (1) { | ||
5338 | + const char *reason; | ||
5339 | + | ||
5340 | ret = recvmsg(fdt, &msg, MSG_ERRQUEUE); | ||
5341 | if (ret == -1 && errno == EAGAIN) | ||
5342 | break; | ||
5343 | @@ -176,14 +179,30 @@ static void do_recv_errqueue_timeout(int fdt) | ||
5344 | err = (struct sock_extended_err *)CMSG_DATA(cm); | ||
5345 | if (err->ee_origin != SO_EE_ORIGIN_TXTIME) | ||
5346 | error(1, 0, "errqueue: origin 0x%x\n", err->ee_origin); | ||
5347 | - if (err->ee_code != ECANCELED) | ||
5348 | - error(1, 0, "errqueue: code 0x%x\n", err->ee_code); | ||
5349 | + | ||
5350 | + switch (err->ee_errno) { | ||
5351 | + case ECANCELED: | ||
5352 | + if (err->ee_code != SO_EE_CODE_TXTIME_MISSED) | ||
5353 | + error(1, 0, "errqueue: unknown ECANCELED %u\n", | ||
5354 | + err->ee_code); | ||
5355 | + reason = "missed txtime"; | ||
5356 | + break; | ||
5357 | + case EINVAL: | ||
5358 | + if (err->ee_code != SO_EE_CODE_TXTIME_INVALID_PARAM) | ||
5359 | + error(1, 0, "errqueue: unknown EINVAL %u\n", | ||
5360 | + err->ee_code); | ||
5361 | + reason = "invalid txtime"; | ||
5362 | + break; | ||
5363 | + default: | ||
5364 | + error(1, 0, "errqueue: errno %u code %u\n", | ||
5365 | + err->ee_errno, err->ee_code); | ||
5366 | + }; | ||
5367 | |||
5368 | tstamp = ((int64_t) err->ee_data) << 32 | err->ee_info; | ||
5369 | tstamp -= (int64_t) glob_tstart; | ||
5370 | tstamp /= 1000 * 1000; | ||
5371 | - fprintf(stderr, "send: pkt %c at %" PRId64 "ms dropped\n", | ||
5372 | - data[ret - 1], tstamp); | ||
5373 | + fprintf(stderr, "send: pkt %c at %" PRId64 "ms dropped: %s\n", | ||
5374 | + data[ret - 1], tstamp, reason); | ||
5375 | |||
5376 | msg.msg_flags = 0; | ||
5377 | msg.msg_controllen = sizeof(control); |