Contents of /trunk/kernel-alx/patches-5.4/0295-5.4.196-all-fixes.patch
Parent Directory | Revision Log
Revision 3637 -
(show annotations)
(download)
Mon Oct 24 12:40:44 2022 UTC (23 months ago) by niro
File size: 91580 byte(s)
Mon Oct 24 12:40:44 2022 UTC (23 months ago) by niro
File size: 91580 byte(s)
-add missing
1 | diff --git a/Documentation/DMA-attributes.txt b/Documentation/DMA-attributes.txt |
2 | index 7193505a98cab..8f8d97f65d737 100644 |
3 | --- a/Documentation/DMA-attributes.txt |
4 | +++ b/Documentation/DMA-attributes.txt |
5 | @@ -156,13 +156,3 @@ accesses to DMA buffers in both privileged "supervisor" and unprivileged |
6 | subsystem that the buffer is fully accessible at the elevated privilege |
7 | level (and ideally inaccessible or at least read-only at the |
8 | lesser-privileged levels). |
9 | - |
10 | -DMA_ATTR_PRIVILEGED |
11 | -------------------- |
12 | - |
13 | -Some advanced peripherals such as remote processors and GPUs perform |
14 | -accesses to DMA buffers in both privileged "supervisor" and unprivileged |
15 | -"user" modes. This attribute is used to indicate to the DMA-mapping |
16 | -subsystem that the buffer is fully accessible at the elevated privilege |
17 | -level (and ideally inaccessible or at least read-only at the |
18 | -lesser-privileged levels). |
19 | diff --git a/Makefile b/Makefile |
20 | index 4297d0107bd6c..c064ed925552d 100644 |
21 | --- a/Makefile |
22 | +++ b/Makefile |
23 | @@ -1,7 +1,7 @@ |
24 | # SPDX-License-Identifier: GPL-2.0 |
25 | VERSION = 5 |
26 | PATCHLEVEL = 4 |
27 | -SUBLEVEL = 195 |
28 | +SUBLEVEL = 196 |
29 | EXTRAVERSION = |
30 | NAME = Kleptomaniac Octopus |
31 | |
32 | diff --git a/arch/arm/boot/dts/aspeed-g6-pinctrl.dtsi b/arch/arm/boot/dts/aspeed-g6-pinctrl.dtsi |
33 | index f310f4d3bcc7c..ac723fe898c76 100644 |
34 | --- a/arch/arm/boot/dts/aspeed-g6-pinctrl.dtsi |
35 | +++ b/arch/arm/boot/dts/aspeed-g6-pinctrl.dtsi |
36 | @@ -117,11 +117,6 @@ |
37 | groups = "FWSPID"; |
38 | }; |
39 | |
40 | - pinctrl_fwqspid_default: fwqspid_default { |
41 | - function = "FWSPID"; |
42 | - groups = "FWQSPID"; |
43 | - }; |
44 | - |
45 | pinctrl_fwspiwp_default: fwspiwp_default { |
46 | function = "FWSPIWP"; |
47 | groups = "FWSPIWP"; |
48 | @@ -653,12 +648,12 @@ |
49 | }; |
50 | |
51 | pinctrl_qspi1_default: qspi1_default { |
52 | - function = "QSPI1"; |
53 | + function = "SPI1"; |
54 | groups = "QSPI1"; |
55 | }; |
56 | |
57 | pinctrl_qspi2_default: qspi2_default { |
58 | - function = "QSPI2"; |
59 | + function = "SPI2"; |
60 | groups = "QSPI2"; |
61 | }; |
62 | |
63 | diff --git a/arch/arm/boot/dts/imx7-colibri.dtsi b/arch/arm/boot/dts/imx7-colibri.dtsi |
64 | index 8bba03de51ad4..1e61e38621066 100644 |
65 | --- a/arch/arm/boot/dts/imx7-colibri.dtsi |
66 | +++ b/arch/arm/boot/dts/imx7-colibri.dtsi |
67 | @@ -77,7 +77,7 @@ |
68 | |
69 | dailink_master: simple-audio-card,codec { |
70 | sound-dai = <&codec>; |
71 | - clocks = <&clks IMX7D_AUDIO_MCLK_ROOT_CLK>; |
72 | + clocks = <&clks IMX7D_AUDIO_MCLK_ROOT_DIV>; |
73 | }; |
74 | }; |
75 | }; |
76 | @@ -152,7 +152,7 @@ |
77 | compatible = "fsl,sgtl5000"; |
78 | #sound-dai-cells = <0>; |
79 | reg = <0x0a>; |
80 | - clocks = <&clks IMX7D_AUDIO_MCLK_ROOT_CLK>; |
81 | + clocks = <&clks IMX7D_AUDIO_MCLK_ROOT_DIV>; |
82 | pinctrl-names = "default"; |
83 | pinctrl-0 = <&pinctrl_sai1_mclk>; |
84 | VDDA-supply = <®_module_3v3_avdd>; |
85 | diff --git a/arch/arm/boot/dts/imx7-mba7.dtsi b/arch/arm/boot/dts/imx7-mba7.dtsi |
86 | index 50abf18ad30b2..887497e3bb4b8 100644 |
87 | --- a/arch/arm/boot/dts/imx7-mba7.dtsi |
88 | +++ b/arch/arm/boot/dts/imx7-mba7.dtsi |
89 | @@ -250,7 +250,7 @@ |
90 | tlv320aic32x4: audio-codec@18 { |
91 | compatible = "ti,tlv320aic32x4"; |
92 | reg = <0x18>; |
93 | - clocks = <&clks IMX7D_AUDIO_MCLK_ROOT_CLK>; |
94 | + clocks = <&clks IMX7D_AUDIO_MCLK_ROOT_DIV>; |
95 | clock-names = "mclk"; |
96 | ldoin-supply = <®_audio_3v3>; |
97 | iov-supply = <®_audio_3v3>; |
98 | diff --git a/arch/arm/boot/dts/imx7d-nitrogen7.dts b/arch/arm/boot/dts/imx7d-nitrogen7.dts |
99 | index 6b4acea1ef795..ecfa179ccab1c 100644 |
100 | --- a/arch/arm/boot/dts/imx7d-nitrogen7.dts |
101 | +++ b/arch/arm/boot/dts/imx7d-nitrogen7.dts |
102 | @@ -284,7 +284,7 @@ |
103 | codec: wm8960@1a { |
104 | compatible = "wlf,wm8960"; |
105 | reg = <0x1a>; |
106 | - clocks = <&clks IMX7D_AUDIO_MCLK_ROOT_CLK>; |
107 | + clocks = <&clks IMX7D_AUDIO_MCLK_ROOT_DIV>; |
108 | clock-names = "mclk"; |
109 | wlf,shared-lrclk; |
110 | }; |
111 | diff --git a/arch/arm/boot/dts/imx7d-pico-hobbit.dts b/arch/arm/boot/dts/imx7d-pico-hobbit.dts |
112 | index 7b2198a9372c6..d917dc4f2f227 100644 |
113 | --- a/arch/arm/boot/dts/imx7d-pico-hobbit.dts |
114 | +++ b/arch/arm/boot/dts/imx7d-pico-hobbit.dts |
115 | @@ -31,7 +31,7 @@ |
116 | |
117 | dailink_master: simple-audio-card,codec { |
118 | sound-dai = <&sgtl5000>; |
119 | - clocks = <&clks IMX7D_AUDIO_MCLK_ROOT_CLK>; |
120 | + clocks = <&clks IMX7D_AUDIO_MCLK_ROOT_DIV>; |
121 | }; |
122 | }; |
123 | }; |
124 | @@ -41,7 +41,7 @@ |
125 | #sound-dai-cells = <0>; |
126 | reg = <0x0a>; |
127 | compatible = "fsl,sgtl5000"; |
128 | - clocks = <&clks IMX7D_AUDIO_MCLK_ROOT_CLK>; |
129 | + clocks = <&clks IMX7D_AUDIO_MCLK_ROOT_DIV>; |
130 | VDDA-supply = <®_2p5v>; |
131 | VDDIO-supply = <®_vref_1v8>; |
132 | }; |
133 | diff --git a/arch/arm/boot/dts/imx7d-pico-pi.dts b/arch/arm/boot/dts/imx7d-pico-pi.dts |
134 | index 70bea95c06d83..f263e391e24cb 100644 |
135 | --- a/arch/arm/boot/dts/imx7d-pico-pi.dts |
136 | +++ b/arch/arm/boot/dts/imx7d-pico-pi.dts |
137 | @@ -31,7 +31,7 @@ |
138 | |
139 | dailink_master: simple-audio-card,codec { |
140 | sound-dai = <&sgtl5000>; |
141 | - clocks = <&clks IMX7D_AUDIO_MCLK_ROOT_CLK>; |
142 | + clocks = <&clks IMX7D_AUDIO_MCLK_ROOT_DIV>; |
143 | }; |
144 | }; |
145 | }; |
146 | @@ -41,7 +41,7 @@ |
147 | #sound-dai-cells = <0>; |
148 | reg = <0x0a>; |
149 | compatible = "fsl,sgtl5000"; |
150 | - clocks = <&clks IMX7D_AUDIO_MCLK_ROOT_CLK>; |
151 | + clocks = <&clks IMX7D_AUDIO_MCLK_ROOT_DIV>; |
152 | VDDA-supply = <®_2p5v>; |
153 | VDDIO-supply = <®_vref_1v8>; |
154 | }; |
155 | diff --git a/arch/arm/boot/dts/imx7d-sdb.dts b/arch/arm/boot/dts/imx7d-sdb.dts |
156 | index 869efbc4af42c..a97cda17e484e 100644 |
157 | --- a/arch/arm/boot/dts/imx7d-sdb.dts |
158 | +++ b/arch/arm/boot/dts/imx7d-sdb.dts |
159 | @@ -356,7 +356,7 @@ |
160 | codec: wm8960@1a { |
161 | compatible = "wlf,wm8960"; |
162 | reg = <0x1a>; |
163 | - clocks = <&clks IMX7D_AUDIO_MCLK_ROOT_CLK>; |
164 | + clocks = <&clks IMX7D_AUDIO_MCLK_ROOT_DIV>; |
165 | clock-names = "mclk"; |
166 | wlf,shared-lrclk; |
167 | }; |
168 | diff --git a/arch/arm/boot/dts/imx7s-warp.dts b/arch/arm/boot/dts/imx7s-warp.dts |
169 | index d6b4888fa686b..e035dd5bf4f62 100644 |
170 | --- a/arch/arm/boot/dts/imx7s-warp.dts |
171 | +++ b/arch/arm/boot/dts/imx7s-warp.dts |
172 | @@ -75,7 +75,7 @@ |
173 | |
174 | dailink_master: simple-audio-card,codec { |
175 | sound-dai = <&codec>; |
176 | - clocks = <&clks IMX7D_AUDIO_MCLK_ROOT_CLK>; |
177 | + clocks = <&clks IMX7D_AUDIO_MCLK_ROOT_DIV>; |
178 | }; |
179 | }; |
180 | }; |
181 | @@ -232,7 +232,7 @@ |
182 | #sound-dai-cells = <0>; |
183 | reg = <0x0a>; |
184 | compatible = "fsl,sgtl5000"; |
185 | - clocks = <&clks IMX7D_AUDIO_MCLK_ROOT_CLK>; |
186 | + clocks = <&clks IMX7D_AUDIO_MCLK_ROOT_DIV>; |
187 | pinctrl-names = "default"; |
188 | pinctrl-0 = <&pinctrl_sai1_mclk>; |
189 | VDDA-supply = <&vgen4_reg>; |
190 | diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S |
191 | index 3d65fa56a0e5d..8e8efe28d7995 100644 |
192 | --- a/arch/arm/kernel/entry-armv.S |
193 | +++ b/arch/arm/kernel/entry-armv.S |
194 | @@ -1043,7 +1043,7 @@ vector_bhb_loop8_\name: |
195 | |
196 | @ bhb workaround |
197 | mov r0, #8 |
198 | -3: b . + 4 |
199 | +3: W(b) . + 4 |
200 | subs r0, r0, #1 |
201 | bne 3b |
202 | dsb |
203 | diff --git a/arch/arm/kernel/stacktrace.c b/arch/arm/kernel/stacktrace.c |
204 | index db798eac74315..8247749998259 100644 |
205 | --- a/arch/arm/kernel/stacktrace.c |
206 | +++ b/arch/arm/kernel/stacktrace.c |
207 | @@ -53,17 +53,17 @@ int notrace unwind_frame(struct stackframe *frame) |
208 | return -EINVAL; |
209 | |
210 | frame->sp = frame->fp; |
211 | - frame->fp = *(unsigned long *)(fp); |
212 | - frame->pc = *(unsigned long *)(fp + 4); |
213 | + frame->fp = READ_ONCE_NOCHECK(*(unsigned long *)(fp)); |
214 | + frame->pc = READ_ONCE_NOCHECK(*(unsigned long *)(fp + 4)); |
215 | #else |
216 | /* check current frame pointer is within bounds */ |
217 | if (fp < low + 12 || fp > high - 4) |
218 | return -EINVAL; |
219 | |
220 | /* restore the registers from the stack frame */ |
221 | - frame->fp = *(unsigned long *)(fp - 12); |
222 | - frame->sp = *(unsigned long *)(fp - 8); |
223 | - frame->pc = *(unsigned long *)(fp - 4); |
224 | + frame->fp = READ_ONCE_NOCHECK(*(unsigned long *)(fp - 12)); |
225 | + frame->sp = READ_ONCE_NOCHECK(*(unsigned long *)(fp - 8)); |
226 | + frame->pc = READ_ONCE_NOCHECK(*(unsigned long *)(fp - 4)); |
227 | #endif |
228 | |
229 | return 0; |
230 | diff --git a/arch/arm/mm/proc-v7-bugs.c b/arch/arm/mm/proc-v7-bugs.c |
231 | index 097ef85bb7f21..bcb9181601d9b 100644 |
232 | --- a/arch/arm/mm/proc-v7-bugs.c |
233 | +++ b/arch/arm/mm/proc-v7-bugs.c |
234 | @@ -301,6 +301,7 @@ void cpu_v7_ca15_ibe(void) |
235 | { |
236 | if (check_spectre_auxcr(this_cpu_ptr(&spectre_warned), BIT(0))) |
237 | cpu_v7_spectre_v2_init(); |
238 | + cpu_v7_spectre_bhb_init(); |
239 | } |
240 | |
241 | void cpu_v7_bugs_init(void) |
242 | diff --git a/arch/mips/lantiq/falcon/sysctrl.c b/arch/mips/lantiq/falcon/sysctrl.c |
243 | index 037b08f3257e0..a2837a54d9726 100644 |
244 | --- a/arch/mips/lantiq/falcon/sysctrl.c |
245 | +++ b/arch/mips/lantiq/falcon/sysctrl.c |
246 | @@ -167,6 +167,8 @@ static inline void clkdev_add_sys(const char *dev, unsigned int module, |
247 | { |
248 | struct clk *clk = kzalloc(sizeof(struct clk), GFP_KERNEL); |
249 | |
250 | + if (!clk) |
251 | + return; |
252 | clk->cl.dev_id = dev; |
253 | clk->cl.con_id = NULL; |
254 | clk->cl.clk = clk; |
255 | diff --git a/arch/mips/lantiq/xway/gptu.c b/arch/mips/lantiq/xway/gptu.c |
256 | index 3d5683e75cf1e..200fe9ff641d6 100644 |
257 | --- a/arch/mips/lantiq/xway/gptu.c |
258 | +++ b/arch/mips/lantiq/xway/gptu.c |
259 | @@ -122,6 +122,8 @@ static inline void clkdev_add_gptu(struct device *dev, const char *con, |
260 | { |
261 | struct clk *clk = kzalloc(sizeof(struct clk), GFP_KERNEL); |
262 | |
263 | + if (!clk) |
264 | + return; |
265 | clk->cl.dev_id = dev_name(dev); |
266 | clk->cl.con_id = con; |
267 | clk->cl.clk = clk; |
268 | diff --git a/arch/mips/lantiq/xway/sysctrl.c b/arch/mips/lantiq/xway/sysctrl.c |
269 | index 2ee68d6e8bb99..6c2d9779ac727 100644 |
270 | --- a/arch/mips/lantiq/xway/sysctrl.c |
271 | +++ b/arch/mips/lantiq/xway/sysctrl.c |
272 | @@ -311,6 +311,8 @@ static void clkdev_add_pmu(const char *dev, const char *con, bool deactivate, |
273 | { |
274 | struct clk *clk = kzalloc(sizeof(struct clk), GFP_KERNEL); |
275 | |
276 | + if (!clk) |
277 | + return; |
278 | clk->cl.dev_id = dev; |
279 | clk->cl.con_id = con; |
280 | clk->cl.clk = clk; |
281 | @@ -334,6 +336,8 @@ static void clkdev_add_cgu(const char *dev, const char *con, |
282 | { |
283 | struct clk *clk = kzalloc(sizeof(struct clk), GFP_KERNEL); |
284 | |
285 | + if (!clk) |
286 | + return; |
287 | clk->cl.dev_id = dev; |
288 | clk->cl.con_id = con; |
289 | clk->cl.clk = clk; |
290 | @@ -352,24 +356,28 @@ static void clkdev_add_pci(void) |
291 | struct clk *clk_ext = kzalloc(sizeof(struct clk), GFP_KERNEL); |
292 | |
293 | /* main pci clock */ |
294 | - clk->cl.dev_id = "17000000.pci"; |
295 | - clk->cl.con_id = NULL; |
296 | - clk->cl.clk = clk; |
297 | - clk->rate = CLOCK_33M; |
298 | - clk->rates = valid_pci_rates; |
299 | - clk->enable = pci_enable; |
300 | - clk->disable = pmu_disable; |
301 | - clk->module = 0; |
302 | - clk->bits = PMU_PCI; |
303 | - clkdev_add(&clk->cl); |
304 | + if (clk) { |
305 | + clk->cl.dev_id = "17000000.pci"; |
306 | + clk->cl.con_id = NULL; |
307 | + clk->cl.clk = clk; |
308 | + clk->rate = CLOCK_33M; |
309 | + clk->rates = valid_pci_rates; |
310 | + clk->enable = pci_enable; |
311 | + clk->disable = pmu_disable; |
312 | + clk->module = 0; |
313 | + clk->bits = PMU_PCI; |
314 | + clkdev_add(&clk->cl); |
315 | + } |
316 | |
317 | /* use internal/external bus clock */ |
318 | - clk_ext->cl.dev_id = "17000000.pci"; |
319 | - clk_ext->cl.con_id = "external"; |
320 | - clk_ext->cl.clk = clk_ext; |
321 | - clk_ext->enable = pci_ext_enable; |
322 | - clk_ext->disable = pci_ext_disable; |
323 | - clkdev_add(&clk_ext->cl); |
324 | + if (clk_ext) { |
325 | + clk_ext->cl.dev_id = "17000000.pci"; |
326 | + clk_ext->cl.con_id = "external"; |
327 | + clk_ext->cl.clk = clk_ext; |
328 | + clk_ext->enable = pci_ext_enable; |
329 | + clk_ext->disable = pci_ext_disable; |
330 | + clkdev_add(&clk_ext->cl); |
331 | + } |
332 | } |
333 | |
334 | /* xway socs can generate clocks on gpio pins */ |
335 | @@ -389,9 +397,15 @@ static void clkdev_add_clkout(void) |
336 | char *name; |
337 | |
338 | name = kzalloc(sizeof("clkout0"), GFP_KERNEL); |
339 | + if (!name) |
340 | + continue; |
341 | sprintf(name, "clkout%d", i); |
342 | |
343 | clk = kzalloc(sizeof(struct clk), GFP_KERNEL); |
344 | + if (!clk) { |
345 | + kfree(name); |
346 | + continue; |
347 | + } |
348 | clk->cl.dev_id = "1f103000.cgu"; |
349 | clk->cl.con_id = name; |
350 | clk->cl.clk = clk; |
351 | diff --git a/arch/x86/crypto/chacha-avx512vl-x86_64.S b/arch/x86/crypto/chacha-avx512vl-x86_64.S |
352 | index 848f9c75fd4f5..596f91e3a774e 100644 |
353 | --- a/arch/x86/crypto/chacha-avx512vl-x86_64.S |
354 | +++ b/arch/x86/crypto/chacha-avx512vl-x86_64.S |
355 | @@ -172,7 +172,7 @@ ENTRY(chacha_2block_xor_avx512vl) |
356 | # xor remaining bytes from partial register into output |
357 | mov %rcx,%rax |
358 | and $0xf,%rcx |
359 | - jz .Ldone8 |
360 | + jz .Ldone2 |
361 | mov %rax,%r9 |
362 | and $~0xf,%r9 |
363 | |
364 | @@ -438,7 +438,7 @@ ENTRY(chacha_4block_xor_avx512vl) |
365 | # xor remaining bytes from partial register into output |
366 | mov %rcx,%rax |
367 | and $0xf,%rcx |
368 | - jz .Ldone8 |
369 | + jz .Ldone4 |
370 | mov %rax,%r9 |
371 | and $~0xf,%r9 |
372 | |
373 | diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c |
374 | index d3877dd713aef..015da62e4ad75 100644 |
375 | --- a/arch/x86/kvm/mmu.c |
376 | +++ b/arch/x86/kvm/mmu.c |
377 | @@ -5821,6 +5821,7 @@ static void kvm_zap_obsolete_pages(struct kvm *kvm) |
378 | { |
379 | struct kvm_mmu_page *sp, *node; |
380 | int nr_zapped, batch = 0; |
381 | + bool unstable; |
382 | |
383 | restart: |
384 | list_for_each_entry_safe_reverse(sp, node, |
385 | @@ -5853,11 +5854,12 @@ restart: |
386 | goto restart; |
387 | } |
388 | |
389 | - if (__kvm_mmu_prepare_zap_page(kvm, sp, |
390 | - &kvm->arch.zapped_obsolete_pages, &nr_zapped)) { |
391 | - batch += nr_zapped; |
392 | + unstable = __kvm_mmu_prepare_zap_page(kvm, sp, |
393 | + &kvm->arch.zapped_obsolete_pages, &nr_zapped); |
394 | + batch += nr_zapped; |
395 | + |
396 | + if (unstable) |
397 | goto restart; |
398 | - } |
399 | } |
400 | |
401 | /* |
402 | diff --git a/arch/x86/um/shared/sysdep/syscalls_64.h b/arch/x86/um/shared/sysdep/syscalls_64.h |
403 | index 8a7d5e1da98e5..1e6875b4ffd83 100644 |
404 | --- a/arch/x86/um/shared/sysdep/syscalls_64.h |
405 | +++ b/arch/x86/um/shared/sysdep/syscalls_64.h |
406 | @@ -10,13 +10,12 @@ |
407 | #include <linux/msg.h> |
408 | #include <linux/shm.h> |
409 | |
410 | -typedef long syscall_handler_t(void); |
411 | +typedef long syscall_handler_t(long, long, long, long, long, long); |
412 | |
413 | extern syscall_handler_t *sys_call_table[]; |
414 | |
415 | #define EXECUTE_SYSCALL(syscall, regs) \ |
416 | - (((long (*)(long, long, long, long, long, long)) \ |
417 | - (*sys_call_table[syscall]))(UPT_SYSCALL_ARG1(®s->regs), \ |
418 | + (((*sys_call_table[syscall]))(UPT_SYSCALL_ARG1(®s->regs), \ |
419 | UPT_SYSCALL_ARG2(®s->regs), \ |
420 | UPT_SYSCALL_ARG3(®s->regs), \ |
421 | UPT_SYSCALL_ARG4(®s->regs), \ |
422 | diff --git a/arch/x86/xen/smp_pv.c b/arch/x86/xen/smp_pv.c |
423 | index 64e6ec2c32a76..9d9777ded5f7b 100644 |
424 | --- a/arch/x86/xen/smp_pv.c |
425 | +++ b/arch/x86/xen/smp_pv.c |
426 | @@ -53,6 +53,7 @@ static DEFINE_PER_CPU(struct xen_common_irq, xen_irq_work) = { .irq = -1 }; |
427 | static DEFINE_PER_CPU(struct xen_common_irq, xen_pmu_irq) = { .irq = -1 }; |
428 | |
429 | static irqreturn_t xen_irq_work_interrupt(int irq, void *dev_id); |
430 | +void asm_cpu_bringup_and_idle(void); |
431 | |
432 | static void cpu_bringup(void) |
433 | { |
434 | @@ -310,7 +311,7 @@ cpu_initialize_context(unsigned int cpu, struct task_struct *idle) |
435 | * pointing just below where pt_regs would be if it were a normal |
436 | * kernel entry. |
437 | */ |
438 | - ctxt->user_regs.eip = (unsigned long)cpu_bringup_and_idle; |
439 | + ctxt->user_regs.eip = (unsigned long)asm_cpu_bringup_and_idle; |
440 | ctxt->flags = VGCF_IN_KERNEL; |
441 | ctxt->user_regs.eflags = 0x1000; /* IOPL_RING1 */ |
442 | ctxt->user_regs.ds = __USER_DS; |
443 | diff --git a/arch/x86/xen/xen-head.S b/arch/x86/xen/xen-head.S |
444 | index c1d8b90aa4e2d..142da85474801 100644 |
445 | --- a/arch/x86/xen/xen-head.S |
446 | +++ b/arch/x86/xen/xen-head.S |
447 | @@ -35,7 +35,11 @@ ENTRY(startup_xen) |
448 | rep __ASM_SIZE(stos) |
449 | |
450 | mov %_ASM_SI, xen_start_info |
451 | - mov $init_thread_union+THREAD_SIZE, %_ASM_SP |
452 | +#ifdef CONFIG_X86_64 |
453 | + mov initial_stack(%rip), %rsp |
454 | +#else |
455 | + mov initial_stack, %esp |
456 | +#endif |
457 | |
458 | #ifdef CONFIG_X86_64 |
459 | /* Set up %gs. |
460 | @@ -51,9 +55,19 @@ ENTRY(startup_xen) |
461 | wrmsr |
462 | #endif |
463 | |
464 | - jmp xen_start_kernel |
465 | + call xen_start_kernel |
466 | END(startup_xen) |
467 | __FINIT |
468 | + |
469 | +#ifdef CONFIG_XEN_PV_SMP |
470 | +.pushsection .text |
471 | +SYM_CODE_START(asm_cpu_bringup_and_idle) |
472 | + UNWIND_HINT_EMPTY |
473 | + |
474 | + call cpu_bringup_and_idle |
475 | +SYM_CODE_END(asm_cpu_bringup_and_idle) |
476 | +.popsection |
477 | +#endif |
478 | #endif |
479 | |
480 | .pushsection .text |
481 | diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c |
482 | index 1d443d17cf7c5..d46806182b051 100644 |
483 | --- a/block/bfq-iosched.c |
484 | +++ b/block/bfq-iosched.c |
485 | @@ -2251,6 +2251,9 @@ static int bfq_request_merge(struct request_queue *q, struct request **req, |
486 | __rq = bfq_find_rq_fmerge(bfqd, bio, q); |
487 | if (__rq && elv_bio_merge_ok(__rq, bio)) { |
488 | *req = __rq; |
489 | + |
490 | + if (blk_discard_mergable(__rq)) |
491 | + return ELEVATOR_DISCARD_MERGE; |
492 | return ELEVATOR_FRONT_MERGE; |
493 | } |
494 | |
495 | diff --git a/block/blk-merge.c b/block/blk-merge.c |
496 | index a62692d135660..5219064cd72bb 100644 |
497 | --- a/block/blk-merge.c |
498 | +++ b/block/blk-merge.c |
499 | @@ -721,21 +721,6 @@ static void blk_account_io_merge(struct request *req) |
500 | part_stat_unlock(); |
501 | } |
502 | } |
503 | -/* |
504 | - * Two cases of handling DISCARD merge: |
505 | - * If max_discard_segments > 1, the driver takes every bio |
506 | - * as a range and send them to controller together. The ranges |
507 | - * needn't to be contiguous. |
508 | - * Otherwise, the bios/requests will be handled as same as |
509 | - * others which should be contiguous. |
510 | - */ |
511 | -static inline bool blk_discard_mergable(struct request *req) |
512 | -{ |
513 | - if (req_op(req) == REQ_OP_DISCARD && |
514 | - queue_max_discard_segments(req->q) > 1) |
515 | - return true; |
516 | - return false; |
517 | -} |
518 | |
519 | static enum elv_merge blk_try_req_merge(struct request *req, |
520 | struct request *next) |
521 | diff --git a/block/elevator.c b/block/elevator.c |
522 | index 78805c74ea8a4..3ba826230c578 100644 |
523 | --- a/block/elevator.c |
524 | +++ b/block/elevator.c |
525 | @@ -337,6 +337,9 @@ enum elv_merge elv_merge(struct request_queue *q, struct request **req, |
526 | __rq = elv_rqhash_find(q, bio->bi_iter.bi_sector); |
527 | if (__rq && elv_bio_merge_ok(__rq, bio)) { |
528 | *req = __rq; |
529 | + |
530 | + if (blk_discard_mergable(__rq)) |
531 | + return ELEVATOR_DISCARD_MERGE; |
532 | return ELEVATOR_BACK_MERGE; |
533 | } |
534 | |
535 | diff --git a/block/mq-deadline.c b/block/mq-deadline.c |
536 | index 19c6922e85f1b..6d6dda5cfffa3 100644 |
537 | --- a/block/mq-deadline.c |
538 | +++ b/block/mq-deadline.c |
539 | @@ -452,6 +452,8 @@ static int dd_request_merge(struct request_queue *q, struct request **rq, |
540 | |
541 | if (elv_bio_merge_ok(__rq, bio)) { |
542 | *rq = __rq; |
543 | + if (blk_discard_mergable(__rq)) |
544 | + return ELEVATOR_DISCARD_MERGE; |
545 | return ELEVATOR_FRONT_MERGE; |
546 | } |
547 | } |
548 | diff --git a/drivers/base/firmware_loader/main.c b/drivers/base/firmware_loader/main.c |
549 | index 4f6b76bd957ef..12ab50d295484 100644 |
550 | --- a/drivers/base/firmware_loader/main.c |
551 | +++ b/drivers/base/firmware_loader/main.c |
552 | @@ -761,6 +761,8 @@ _request_firmware(const struct firmware **firmware_p, const char *name, |
553 | enum fw_opt opt_flags) |
554 | { |
555 | struct firmware *fw = NULL; |
556 | + struct cred *kern_cred = NULL; |
557 | + const struct cred *old_cred; |
558 | int ret; |
559 | |
560 | if (!firmware_p) |
561 | @@ -776,6 +778,18 @@ _request_firmware(const struct firmware **firmware_p, const char *name, |
562 | if (ret <= 0) /* error or already assigned */ |
563 | goto out; |
564 | |
565 | + /* |
566 | + * We are about to try to access the firmware file. Because we may have been |
567 | + * called by a driver when serving an unrelated request from userland, we use |
568 | + * the kernel credentials to read the file. |
569 | + */ |
570 | + kern_cred = prepare_kernel_cred(NULL); |
571 | + if (!kern_cred) { |
572 | + ret = -ENOMEM; |
573 | + goto out; |
574 | + } |
575 | + old_cred = override_creds(kern_cred); |
576 | + |
577 | ret = fw_get_filesystem_firmware(device, fw->priv, "", NULL); |
578 | #ifdef CONFIG_FW_LOADER_COMPRESS |
579 | if (ret == -ENOENT) |
580 | @@ -792,6 +806,9 @@ _request_firmware(const struct firmware **firmware_p, const char *name, |
581 | } else |
582 | ret = assign_fw(fw, device, opt_flags); |
583 | |
584 | + revert_creds(old_cred); |
585 | + put_cred(kern_cred); |
586 | + |
587 | out: |
588 | if (ret < 0) { |
589 | fw_abort_batch_reqs(fw); |
590 | diff --git a/drivers/block/drbd/drbd_main.c b/drivers/block/drbd/drbd_main.c |
591 | index a18155cdce416..ba10fa24fa1f1 100644 |
592 | --- a/drivers/block/drbd/drbd_main.c |
593 | +++ b/drivers/block/drbd/drbd_main.c |
594 | @@ -183,7 +183,7 @@ void tl_release(struct drbd_connection *connection, unsigned int barrier_nr, |
595 | unsigned int set_size) |
596 | { |
597 | struct drbd_request *r; |
598 | - struct drbd_request *req = NULL; |
599 | + struct drbd_request *req = NULL, *tmp = NULL; |
600 | int expect_epoch = 0; |
601 | int expect_size = 0; |
602 | |
603 | @@ -237,8 +237,11 @@ void tl_release(struct drbd_connection *connection, unsigned int barrier_nr, |
604 | * to catch requests being barrier-acked "unexpectedly". |
605 | * It usually should find the same req again, or some READ preceding it. */ |
606 | list_for_each_entry(req, &connection->transfer_log, tl_requests) |
607 | - if (req->epoch == expect_epoch) |
608 | + if (req->epoch == expect_epoch) { |
609 | + tmp = req; |
610 | break; |
611 | + } |
612 | + req = list_prepare_entry(tmp, &connection->transfer_log, tl_requests); |
613 | list_for_each_entry_safe_from(req, r, &connection->transfer_log, tl_requests) { |
614 | if (req->epoch != expect_epoch) |
615 | break; |
616 | diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c |
617 | index f24e3791e8400..e133ff5fa5961 100644 |
618 | --- a/drivers/block/floppy.c |
619 | +++ b/drivers/block/floppy.c |
620 | @@ -521,8 +521,8 @@ static unsigned long fdc_busy; |
621 | static DECLARE_WAIT_QUEUE_HEAD(fdc_wait); |
622 | static DECLARE_WAIT_QUEUE_HEAD(command_done); |
623 | |
624 | -/* Errors during formatting are counted here. */ |
625 | -static int format_errors; |
626 | +/* errors encountered on the current (or last) request */ |
627 | +static int floppy_errors; |
628 | |
629 | /* Format request descriptor. */ |
630 | static struct format_descr format_req; |
631 | @@ -542,7 +542,6 @@ static struct format_descr format_req; |
632 | static char *floppy_track_buffer; |
633 | static int max_buffer_sectors; |
634 | |
635 | -static int *errors; |
636 | typedef void (*done_f)(int); |
637 | static const struct cont_t { |
638 | void (*interrupt)(void); |
639 | @@ -1435,7 +1434,7 @@ static int interpret_errors(void) |
640 | if (DP->flags & FTD_MSG) |
641 | DPRINT("Over/Underrun - retrying\n"); |
642 | bad = 0; |
643 | - } else if (*errors >= DP->max_errors.reporting) { |
644 | + } else if (floppy_errors >= DP->max_errors.reporting) { |
645 | print_errors(); |
646 | } |
647 | if (ST2 & ST2_WC || ST2 & ST2_BC) |
648 | @@ -2055,7 +2054,7 @@ static void bad_flp_intr(void) |
649 | if (!next_valid_format()) |
650 | return; |
651 | } |
652 | - err_count = ++(*errors); |
653 | + err_count = ++floppy_errors; |
654 | INFBOUND(DRWE->badness, err_count); |
655 | if (err_count > DP->max_errors.abort) |
656 | cont->done(0); |
657 | @@ -2200,9 +2199,8 @@ static int do_format(int drive, struct format_descr *tmp_format_req) |
658 | return -EINVAL; |
659 | } |
660 | format_req = *tmp_format_req; |
661 | - format_errors = 0; |
662 | cont = &format_cont; |
663 | - errors = &format_errors; |
664 | + floppy_errors = 0; |
665 | ret = wait_til_done(redo_format, true); |
666 | if (ret == -EINTR) |
667 | return -EINTR; |
668 | @@ -2677,7 +2675,7 @@ static int make_raw_rw_request(void) |
669 | */ |
670 | if (!direct || |
671 | (indirect * 2 > direct * 3 && |
672 | - *errors < DP->max_errors.read_track && |
673 | + floppy_errors < DP->max_errors.read_track && |
674 | ((!probing || |
675 | (DP->read_track & (1 << DRS->probed_format)))))) { |
676 | max_size = blk_rq_sectors(current_req); |
677 | @@ -2801,10 +2799,11 @@ static int set_next_request(void) |
678 | current_req = list_first_entry_or_null(&floppy_reqs, struct request, |
679 | queuelist); |
680 | if (current_req) { |
681 | - current_req->error_count = 0; |
682 | + floppy_errors = 0; |
683 | list_del_init(¤t_req->queuelist); |
684 | + return 1; |
685 | } |
686 | - return current_req != NULL; |
687 | + return 0; |
688 | } |
689 | |
690 | static void redo_fd_request(void) |
691 | @@ -2860,7 +2859,6 @@ do_request: |
692 | _floppy = floppy_type + DP->autodetect[DRS->probed_format]; |
693 | } else |
694 | probing = 0; |
695 | - errors = &(current_req->error_count); |
696 | tmp = make_raw_rw_request(); |
697 | if (tmp < 2) { |
698 | request_done(tmp); |
699 | diff --git a/drivers/clk/at91/clk-generated.c b/drivers/clk/at91/clk-generated.c |
700 | index d7fe1303f79dc..0e7ec5075689a 100644 |
701 | --- a/drivers/clk/at91/clk-generated.c |
702 | +++ b/drivers/clk/at91/clk-generated.c |
703 | @@ -105,6 +105,10 @@ static void clk_generated_best_diff(struct clk_rate_request *req, |
704 | tmp_rate = parent_rate; |
705 | else |
706 | tmp_rate = parent_rate / div; |
707 | + |
708 | + if (tmp_rate < req->min_rate || tmp_rate > req->max_rate) |
709 | + return; |
710 | + |
711 | tmp_diff = abs(req->rate - tmp_rate); |
712 | |
713 | if (*best_diff < 0 || *best_diff >= tmp_diff) { |
714 | diff --git a/drivers/crypto/qcom-rng.c b/drivers/crypto/qcom-rng.c |
715 | index 3a633a0c40fdf..6cc4fd005fe07 100644 |
716 | --- a/drivers/crypto/qcom-rng.c |
717 | +++ b/drivers/crypto/qcom-rng.c |
718 | @@ -64,6 +64,7 @@ static int qcom_rng_read(struct qcom_rng *rng, u8 *data, unsigned int max) |
719 | } else { |
720 | /* copy only remaining bytes */ |
721 | memcpy(data, &val, max - currsize); |
722 | + break; |
723 | } |
724 | } while (currsize < max); |
725 | |
726 | diff --git a/drivers/crypto/stm32/stm32-crc32.c b/drivers/crypto/stm32/stm32-crc32.c |
727 | index fb640e0ea6140..2ecc970f5cae5 100644 |
728 | --- a/drivers/crypto/stm32/stm32-crc32.c |
729 | +++ b/drivers/crypto/stm32/stm32-crc32.c |
730 | @@ -332,8 +332,10 @@ static int stm32_crc_remove(struct platform_device *pdev) |
731 | struct stm32_crc *crc = platform_get_drvdata(pdev); |
732 | int ret = pm_runtime_get_sync(crc->dev); |
733 | |
734 | - if (ret < 0) |
735 | + if (ret < 0) { |
736 | + pm_runtime_put_noidle(crc->dev); |
737 | return ret; |
738 | + } |
739 | |
740 | spin_lock(&crc_list.lock); |
741 | list_del(&crc->list); |
742 | diff --git a/drivers/gpio/gpio-mvebu.c b/drivers/gpio/gpio-mvebu.c |
743 | index 89a053b1d2799..b5ae28fce9a89 100644 |
744 | --- a/drivers/gpio/gpio-mvebu.c |
745 | +++ b/drivers/gpio/gpio-mvebu.c |
746 | @@ -697,6 +697,9 @@ static int mvebu_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm, |
747 | unsigned long flags; |
748 | unsigned int on, off; |
749 | |
750 | + if (state->polarity != PWM_POLARITY_NORMAL) |
751 | + return -EINVAL; |
752 | + |
753 | val = (unsigned long long) mvpwm->clk_rate * state->duty_cycle; |
754 | do_div(val, NSEC_PER_SEC); |
755 | if (val > UINT_MAX) |
756 | diff --git a/drivers/gpio/gpio-vf610.c b/drivers/gpio/gpio-vf610.c |
757 | index 58776f2d69ff8..1ae612c796eef 100644 |
758 | --- a/drivers/gpio/gpio-vf610.c |
759 | +++ b/drivers/gpio/gpio-vf610.c |
760 | @@ -125,9 +125,13 @@ static int vf610_gpio_direction_output(struct gpio_chip *chip, unsigned gpio, |
761 | { |
762 | struct vf610_gpio_port *port = gpiochip_get_data(chip); |
763 | unsigned long mask = BIT(gpio); |
764 | + u32 val; |
765 | |
766 | - if (port->sdata && port->sdata->have_paddr) |
767 | - vf610_gpio_writel(mask, port->gpio_base + GPIO_PDDR); |
768 | + if (port->sdata && port->sdata->have_paddr) { |
769 | + val = vf610_gpio_readl(port->gpio_base + GPIO_PDDR); |
770 | + val |= mask; |
771 | + vf610_gpio_writel(val, port->gpio_base + GPIO_PDDR); |
772 | + } |
773 | |
774 | vf610_gpio_set(chip, gpio, value); |
775 | |
776 | diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c b/drivers/gpu/drm/drm_dp_mst_topology.c |
777 | index 2de1eebe591f9..1ff13af133243 100644 |
778 | --- a/drivers/gpu/drm/drm_dp_mst_topology.c |
779 | +++ b/drivers/gpu/drm/drm_dp_mst_topology.c |
780 | @@ -3657,6 +3657,7 @@ static void fetch_monitor_name(struct drm_dp_mst_topology_mgr *mgr, |
781 | |
782 | mst_edid = drm_dp_mst_get_edid(port->connector, mgr, port); |
783 | drm_edid_get_monitor_name(mst_edid, name, namelen); |
784 | + kfree(mst_edid); |
785 | } |
786 | |
787 | /** |
788 | diff --git a/drivers/i2c/busses/i2c-mt7621.c b/drivers/i2c/busses/i2c-mt7621.c |
789 | index 62df8379bc895..65e72101b393b 100644 |
790 | --- a/drivers/i2c/busses/i2c-mt7621.c |
791 | +++ b/drivers/i2c/busses/i2c-mt7621.c |
792 | @@ -304,7 +304,8 @@ static int mtk_i2c_probe(struct platform_device *pdev) |
793 | |
794 | if (i2c->bus_freq == 0) { |
795 | dev_warn(i2c->dev, "clock-frequency 0 not supported\n"); |
796 | - return -EINVAL; |
797 | + ret = -EINVAL; |
798 | + goto err_disable_clk; |
799 | } |
800 | |
801 | adap = &i2c->adap; |
802 | @@ -322,10 +323,15 @@ static int mtk_i2c_probe(struct platform_device *pdev) |
803 | |
804 | ret = i2c_add_adapter(adap); |
805 | if (ret < 0) |
806 | - return ret; |
807 | + goto err_disable_clk; |
808 | |
809 | dev_info(&pdev->dev, "clock %u kHz\n", i2c->bus_freq / 1000); |
810 | |
811 | + return 0; |
812 | + |
813 | +err_disable_clk: |
814 | + clk_disable_unprepare(i2c->clk); |
815 | + |
816 | return ret; |
817 | } |
818 | |
819 | diff --git a/drivers/input/input.c b/drivers/input/input.c |
820 | index e2eb9b9b8363d..0e16a9980c6a1 100644 |
821 | --- a/drivers/input/input.c |
822 | +++ b/drivers/input/input.c |
823 | @@ -47,6 +47,17 @@ static DEFINE_MUTEX(input_mutex); |
824 | |
825 | static const struct input_value input_value_sync = { EV_SYN, SYN_REPORT, 1 }; |
826 | |
827 | +static const unsigned int input_max_code[EV_CNT] = { |
828 | + [EV_KEY] = KEY_MAX, |
829 | + [EV_REL] = REL_MAX, |
830 | + [EV_ABS] = ABS_MAX, |
831 | + [EV_MSC] = MSC_MAX, |
832 | + [EV_SW] = SW_MAX, |
833 | + [EV_LED] = LED_MAX, |
834 | + [EV_SND] = SND_MAX, |
835 | + [EV_FF] = FF_MAX, |
836 | +}; |
837 | + |
838 | static inline int is_event_supported(unsigned int code, |
839 | unsigned long *bm, unsigned int max) |
840 | { |
841 | @@ -1978,6 +1989,14 @@ EXPORT_SYMBOL(input_get_timestamp); |
842 | */ |
843 | void input_set_capability(struct input_dev *dev, unsigned int type, unsigned int code) |
844 | { |
845 | + if (type < EV_CNT && input_max_code[type] && |
846 | + code > input_max_code[type]) { |
847 | + pr_err("%s: invalid code %u for type %u\n", __func__, code, |
848 | + type); |
849 | + dump_stack(); |
850 | + return; |
851 | + } |
852 | + |
853 | switch (type) { |
854 | case EV_KEY: |
855 | __set_bit(code, dev->keybit); |
856 | diff --git a/drivers/input/touchscreen/ili210x.c b/drivers/input/touchscreen/ili210x.c |
857 | index 22839dde1d09f..bc6f6a2ac4b9d 100644 |
858 | --- a/drivers/input/touchscreen/ili210x.c |
859 | +++ b/drivers/input/touchscreen/ili210x.c |
860 | @@ -290,9 +290,9 @@ static int ili210x_i2c_probe(struct i2c_client *client, |
861 | if (error) |
862 | return error; |
863 | |
864 | - usleep_range(50, 100); |
865 | + usleep_range(12000, 15000); |
866 | gpiod_set_value_cansleep(reset_gpio, 0); |
867 | - msleep(100); |
868 | + msleep(160); |
869 | } |
870 | |
871 | priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); |
872 | diff --git a/drivers/input/touchscreen/stmfts.c b/drivers/input/touchscreen/stmfts.c |
873 | index cd8805d71d977..be1dd504d5b1d 100644 |
874 | --- a/drivers/input/touchscreen/stmfts.c |
875 | +++ b/drivers/input/touchscreen/stmfts.c |
876 | @@ -339,11 +339,11 @@ static int stmfts_input_open(struct input_dev *dev) |
877 | |
878 | err = pm_runtime_get_sync(&sdata->client->dev); |
879 | if (err < 0) |
880 | - return err; |
881 | + goto out; |
882 | |
883 | err = i2c_smbus_write_byte(sdata->client, STMFTS_MS_MT_SENSE_ON); |
884 | if (err) |
885 | - return err; |
886 | + goto out; |
887 | |
888 | mutex_lock(&sdata->mutex); |
889 | sdata->running = true; |
890 | @@ -366,7 +366,9 @@ static int stmfts_input_open(struct input_dev *dev) |
891 | "failed to enable touchkey\n"); |
892 | } |
893 | |
894 | - return 0; |
895 | +out: |
896 | + pm_runtime_put_noidle(&sdata->client->dev); |
897 | + return err; |
898 | } |
899 | |
900 | static void stmfts_input_close(struct input_dev *dev) |
901 | diff --git a/drivers/mmc/core/block.c b/drivers/mmc/core/block.c |
902 | index 362ad361d5861..709f117fd5772 100644 |
903 | --- a/drivers/mmc/core/block.c |
904 | +++ b/drivers/mmc/core/block.c |
905 | @@ -1126,7 +1126,7 @@ static void mmc_blk_issue_discard_rq(struct mmc_queue *mq, struct request *req) |
906 | card->erase_arg == MMC_TRIM_ARG ? |
907 | INAND_CMD38_ARG_TRIM : |
908 | INAND_CMD38_ARG_ERASE, |
909 | - 0); |
910 | + card->ext_csd.generic_cmd6_time); |
911 | } |
912 | if (!err) |
913 | err = mmc_erase(card, from, nr, card->erase_arg); |
914 | @@ -1168,7 +1168,7 @@ retry: |
915 | arg == MMC_SECURE_TRIM1_ARG ? |
916 | INAND_CMD38_ARG_SECTRIM1 : |
917 | INAND_CMD38_ARG_SECERASE, |
918 | - 0); |
919 | + card->ext_csd.generic_cmd6_time); |
920 | if (err) |
921 | goto out_retry; |
922 | } |
923 | @@ -1186,7 +1186,7 @@ retry: |
924 | err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, |
925 | INAND_CMD38_ARG_EXT_CSD, |
926 | INAND_CMD38_ARG_SECTRIM2, |
927 | - 0); |
928 | + card->ext_csd.generic_cmd6_time); |
929 | if (err) |
930 | goto out_retry; |
931 | } |
932 | diff --git a/drivers/mmc/core/mmc_ops.c b/drivers/mmc/core/mmc_ops.c |
933 | index 09311c2bd8588..d495ba2f368cb 100644 |
934 | --- a/drivers/mmc/core/mmc_ops.c |
935 | +++ b/drivers/mmc/core/mmc_ops.c |
936 | @@ -19,7 +19,9 @@ |
937 | #include "host.h" |
938 | #include "mmc_ops.h" |
939 | |
940 | -#define MMC_OPS_TIMEOUT_MS (10 * 60 * 1000) /* 10 minute timeout */ |
941 | +#define MMC_OPS_TIMEOUT_MS (10 * 60 * 1000) /* 10min*/ |
942 | +#define MMC_BKOPS_TIMEOUT_MS (120 * 1000) /* 120s */ |
943 | +#define MMC_CACHE_FLUSH_TIMEOUT_MS (30 * 1000) /* 30s */ |
944 | |
945 | static const u8 tuning_blk_pattern_4bit[] = { |
946 | 0xff, 0x0f, 0xff, 0x00, 0xff, 0xcc, 0xc3, 0xcc, |
947 | @@ -458,10 +460,6 @@ static int mmc_poll_for_busy(struct mmc_card *card, unsigned int timeout_ms, |
948 | bool expired = false; |
949 | bool busy = false; |
950 | |
951 | - /* We have an unspecified cmd timeout, use the fallback value. */ |
952 | - if (!timeout_ms) |
953 | - timeout_ms = MMC_OPS_TIMEOUT_MS; |
954 | - |
955 | /* |
956 | * In cases when not allowed to poll by using CMD13 or because we aren't |
957 | * capable of polling by using ->card_busy(), then rely on waiting the |
958 | @@ -534,6 +532,12 @@ int __mmc_switch(struct mmc_card *card, u8 set, u8 index, u8 value, |
959 | |
960 | mmc_retune_hold(host); |
961 | |
962 | + if (!timeout_ms) { |
963 | + pr_warn("%s: unspecified timeout for CMD6 - use generic\n", |
964 | + mmc_hostname(host)); |
965 | + timeout_ms = card->ext_csd.generic_cmd6_time; |
966 | + } |
967 | + |
968 | /* |
969 | * If the cmd timeout and the max_busy_timeout of the host are both |
970 | * specified, let's validate them. A failure means we need to prevent |
971 | @@ -542,7 +546,7 @@ int __mmc_switch(struct mmc_card *card, u8 set, u8 index, u8 value, |
972 | * which also means they are on their own when it comes to deal with the |
973 | * busy timeout. |
974 | */ |
975 | - if (!(host->caps & MMC_CAP_NEED_RSP_BUSY) && timeout_ms && |
976 | + if (!(host->caps & MMC_CAP_NEED_RSP_BUSY) && |
977 | host->max_busy_timeout && (timeout_ms > host->max_busy_timeout)) |
978 | use_r1b_resp = false; |
979 | |
980 | @@ -554,10 +558,6 @@ int __mmc_switch(struct mmc_card *card, u8 set, u8 index, u8 value, |
981 | cmd.flags = MMC_CMD_AC; |
982 | if (use_r1b_resp) { |
983 | cmd.flags |= MMC_RSP_SPI_R1B | MMC_RSP_R1B; |
984 | - /* |
985 | - * A busy_timeout of zero means the host can decide to use |
986 | - * whatever value it finds suitable. |
987 | - */ |
988 | cmd.busy_timeout = timeout_ms; |
989 | } else { |
990 | cmd.flags |= MMC_RSP_SPI_R1 | MMC_RSP_R1; |
991 | @@ -943,7 +943,7 @@ void mmc_run_bkops(struct mmc_card *card) |
992 | * urgent levels by using an asynchronous background task, when idle. |
993 | */ |
994 | err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, |
995 | - EXT_CSD_BKOPS_START, 1, MMC_OPS_TIMEOUT_MS); |
996 | + EXT_CSD_BKOPS_START, 1, MMC_BKOPS_TIMEOUT_MS); |
997 | if (err) |
998 | pr_warn("%s: Error %d starting bkops\n", |
999 | mmc_hostname(card->host), err); |
1000 | @@ -961,7 +961,8 @@ int mmc_flush_cache(struct mmc_card *card) |
1001 | |
1002 | if (mmc_cache_enabled(card->host)) { |
1003 | err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, |
1004 | - EXT_CSD_FLUSH_CACHE, 1, 0); |
1005 | + EXT_CSD_FLUSH_CACHE, 1, |
1006 | + MMC_CACHE_FLUSH_TIMEOUT_MS); |
1007 | if (err) |
1008 | pr_err("%s: cache flush error %d\n", |
1009 | mmc_hostname(card->host), err); |
1010 | diff --git a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.c b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.c |
1011 | index 2ad3fa6316ce3..cb5954eeb4090 100644 |
1012 | --- a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.c |
1013 | +++ b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.c |
1014 | @@ -674,6 +674,13 @@ static int hw_atl_b0_hw_ring_tx_head_update(struct aq_hw_s *self, |
1015 | err = -ENXIO; |
1016 | goto err_exit; |
1017 | } |
1018 | + |
1019 | + /* Validate that the new hw_head_ is reasonable. */ |
1020 | + if (hw_head_ >= ring->size) { |
1021 | + err = -ENXIO; |
1022 | + goto err_exit; |
1023 | + } |
1024 | + |
1025 | ring->hw_head = hw_head_; |
1026 | err = aq_hw_err_from_flags(self); |
1027 | |
1028 | diff --git a/drivers/net/ethernet/cadence/macb_main.c b/drivers/net/ethernet/cadence/macb_main.c |
1029 | index 002a374f197bd..78219a9943a73 100644 |
1030 | --- a/drivers/net/ethernet/cadence/macb_main.c |
1031 | +++ b/drivers/net/ethernet/cadence/macb_main.c |
1032 | @@ -927,7 +927,6 @@ static void gem_rx_refill(struct macb_queue *queue) |
1033 | /* Make hw descriptor updates visible to CPU */ |
1034 | rmb(); |
1035 | |
1036 | - queue->rx_prepared_head++; |
1037 | desc = macb_rx_desc(queue, entry); |
1038 | |
1039 | if (!queue->rx_skbuff[entry]) { |
1040 | @@ -966,6 +965,7 @@ static void gem_rx_refill(struct macb_queue *queue) |
1041 | dma_wmb(); |
1042 | desc->addr &= ~MACB_BIT(RX_USED); |
1043 | } |
1044 | + queue->rx_prepared_head++; |
1045 | } |
1046 | |
1047 | /* Make descriptor updates visible to hardware */ |
1048 | diff --git a/drivers/net/ethernet/dec/tulip/tulip_core.c b/drivers/net/ethernet/dec/tulip/tulip_core.c |
1049 | index 3e3e08698876b..fea4223ad6f15 100644 |
1050 | --- a/drivers/net/ethernet/dec/tulip/tulip_core.c |
1051 | +++ b/drivers/net/ethernet/dec/tulip/tulip_core.c |
1052 | @@ -1410,8 +1410,10 @@ static int tulip_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) |
1053 | |
1054 | /* alloc_etherdev ensures aligned and zeroed private structures */ |
1055 | dev = alloc_etherdev (sizeof (*tp)); |
1056 | - if (!dev) |
1057 | + if (!dev) { |
1058 | + pci_disable_device(pdev); |
1059 | return -ENOMEM; |
1060 | + } |
1061 | |
1062 | SET_NETDEV_DEV(dev, &pdev->dev); |
1063 | if (pci_resource_len (pdev, 0) < tulip_tbl[chip_idx].io_size) { |
1064 | @@ -1788,6 +1790,7 @@ err_out_free_res: |
1065 | |
1066 | err_out_free_netdev: |
1067 | free_netdev (dev); |
1068 | + pci_disable_device(pdev); |
1069 | return -ENODEV; |
1070 | } |
1071 | |
1072 | diff --git a/drivers/net/ethernet/intel/ice/ice_main.c b/drivers/net/ethernet/intel/ice/ice_main.c |
1073 | index 3eea68f3a5262..88750a96cb3f2 100644 |
1074 | --- a/drivers/net/ethernet/intel/ice/ice_main.c |
1075 | +++ b/drivers/net/ethernet/intel/ice/ice_main.c |
1076 | @@ -3561,9 +3561,10 @@ static int ice_up_complete(struct ice_vsi *vsi) |
1077 | netif_carrier_on(vsi->netdev); |
1078 | } |
1079 | |
1080 | - /* clear this now, and the first stats read will be used as baseline */ |
1081 | - vsi->stat_offsets_loaded = false; |
1082 | - |
1083 | + /* Perform an initial read of the statistics registers now to |
1084 | + * set the baseline so counters are ready when interface is up |
1085 | + */ |
1086 | + ice_update_eth_stats(vsi); |
1087 | ice_service_task_schedule(pf); |
1088 | |
1089 | return 0; |
1090 | diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c |
1091 | index 3df25b231ab5c..26c8d09ad4ddb 100644 |
1092 | --- a/drivers/net/ethernet/intel/igb/igb_main.c |
1093 | +++ b/drivers/net/ethernet/intel/igb/igb_main.c |
1094 | @@ -5318,7 +5318,8 @@ static void igb_watchdog_task(struct work_struct *work) |
1095 | break; |
1096 | } |
1097 | |
1098 | - if (adapter->link_speed != SPEED_1000) |
1099 | + if (adapter->link_speed != SPEED_1000 || |
1100 | + !hw->phy.ops.read_reg) |
1101 | goto no_wait; |
1102 | |
1103 | /* wait for Remote receiver status OK */ |
1104 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c |
1105 | index 2465165cbea73..73291051808f9 100644 |
1106 | --- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c |
1107 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c |
1108 | @@ -3980,6 +3980,13 @@ static netdev_features_t mlx5e_fix_features(struct net_device *netdev, |
1109 | } |
1110 | } |
1111 | |
1112 | + if (params->xdp_prog) { |
1113 | + if (features & NETIF_F_LRO) { |
1114 | + netdev_warn(netdev, "LRO is incompatible with XDP\n"); |
1115 | + features &= ~NETIF_F_LRO; |
1116 | + } |
1117 | + } |
1118 | + |
1119 | if (MLX5E_GET_PFLAG(params, MLX5E_PFLAG_RX_CQE_COMPRESS)) { |
1120 | features &= ~NETIF_F_RXHASH; |
1121 | if (netdev->features & NETIF_F_RXHASH) |
1122 | diff --git a/drivers/net/ethernet/qlogic/qla3xxx.c b/drivers/net/ethernet/qlogic/qla3xxx.c |
1123 | index da2862d596813..5e81cd317a32f 100644 |
1124 | --- a/drivers/net/ethernet/qlogic/qla3xxx.c |
1125 | +++ b/drivers/net/ethernet/qlogic/qla3xxx.c |
1126 | @@ -3629,7 +3629,8 @@ static void ql_reset_work(struct work_struct *work) |
1127 | qdev->mem_map_registers; |
1128 | unsigned long hw_flags; |
1129 | |
1130 | - if (test_bit((QL_RESET_PER_SCSI | QL_RESET_START), &qdev->flags)) { |
1131 | + if (test_bit(QL_RESET_PER_SCSI, &qdev->flags) || |
1132 | + test_bit(QL_RESET_START, &qdev->flags)) { |
1133 | clear_bit(QL_LINK_MASTER, &qdev->flags); |
1134 | |
1135 | /* |
1136 | diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c |
1137 | index 9cbc0179d24ec..9931724c4727d 100644 |
1138 | --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c |
1139 | +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c |
1140 | @@ -4531,7 +4531,7 @@ int stmmac_dvr_probe(struct device *device, |
1141 | dev_info(priv->device, "TSO feature enabled\n"); |
1142 | } |
1143 | |
1144 | - if (priv->dma_cap.sphen) { |
1145 | + if (priv->dma_cap.sphen && !priv->plat->sph_disable) { |
1146 | ndev->hw_features |= NETIF_F_GRO; |
1147 | priv->sph = true; |
1148 | dev_info(priv->device, "SPH feature enabled\n"); |
1149 | diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_pci.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_pci.c |
1150 | index 292045f4581f7..0edcf3f704b74 100644 |
1151 | --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_pci.c |
1152 | +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_pci.c |
1153 | @@ -119,6 +119,7 @@ static int intel_mgbe_common_data(struct pci_dev *pdev, |
1154 | plat->has_gmac4 = 1; |
1155 | plat->force_sf_dma_mode = 0; |
1156 | plat->tso_en = 1; |
1157 | + plat->sph_disable = 1; |
1158 | |
1159 | plat->rx_sched_algorithm = MTL_RX_ALGORITHM_SP; |
1160 | |
1161 | @@ -481,7 +482,7 @@ static int stmmac_pci_probe(struct pci_dev *pdev, |
1162 | return -ENOMEM; |
1163 | |
1164 | /* Enable pci device */ |
1165 | - ret = pci_enable_device(pdev); |
1166 | + ret = pcim_enable_device(pdev); |
1167 | if (ret) { |
1168 | dev_err(&pdev->dev, "%s: ERROR: failed to enable device\n", |
1169 | __func__); |
1170 | @@ -538,8 +539,6 @@ static void stmmac_pci_remove(struct pci_dev *pdev) |
1171 | pcim_iounmap_regions(pdev, BIT(i)); |
1172 | break; |
1173 | } |
1174 | - |
1175 | - pci_disable_device(pdev); |
1176 | } |
1177 | |
1178 | static int __maybe_unused stmmac_pci_suspend(struct device *dev) |
1179 | diff --git a/drivers/net/vmxnet3/vmxnet3_drv.c b/drivers/net/vmxnet3/vmxnet3_drv.c |
1180 | index cf090f88dac03..609f65530b9b0 100644 |
1181 | --- a/drivers/net/vmxnet3/vmxnet3_drv.c |
1182 | +++ b/drivers/net/vmxnet3/vmxnet3_drv.c |
1183 | @@ -595,6 +595,7 @@ vmxnet3_rq_alloc_rx_buf(struct vmxnet3_rx_queue *rq, u32 ring_idx, |
1184 | if (dma_mapping_error(&adapter->pdev->dev, |
1185 | rbi->dma_addr)) { |
1186 | dev_kfree_skb_any(rbi->skb); |
1187 | + rbi->skb = NULL; |
1188 | rq->stats.rx_buf_alloc_failure++; |
1189 | break; |
1190 | } |
1191 | @@ -619,6 +620,7 @@ vmxnet3_rq_alloc_rx_buf(struct vmxnet3_rx_queue *rq, u32 ring_idx, |
1192 | if (dma_mapping_error(&adapter->pdev->dev, |
1193 | rbi->dma_addr)) { |
1194 | put_page(rbi->page); |
1195 | + rbi->page = NULL; |
1196 | rq->stats.rx_buf_alloc_failure++; |
1197 | break; |
1198 | } |
1199 | @@ -1584,6 +1586,10 @@ vmxnet3_rq_cleanup(struct vmxnet3_rx_queue *rq, |
1200 | u32 i, ring_idx; |
1201 | struct Vmxnet3_RxDesc *rxd; |
1202 | |
1203 | + /* ring has already been cleaned up */ |
1204 | + if (!rq->rx_ring[0].base) |
1205 | + return; |
1206 | + |
1207 | for (ring_idx = 0; ring_idx < 2; ring_idx++) { |
1208 | for (i = 0; i < rq->rx_ring[ring_idx].size; i++) { |
1209 | #ifdef __BIG_ENDIAN_BITFIELD |
1210 | diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c |
1211 | index 6a9a42809f972..79e22618817de 100644 |
1212 | --- a/drivers/nvme/host/core.c |
1213 | +++ b/drivers/nvme/host/core.c |
1214 | @@ -4047,6 +4047,7 @@ void nvme_start_ctrl(struct nvme_ctrl *ctrl) |
1215 | if (ctrl->queue_count > 1) { |
1216 | nvme_queue_scan(ctrl); |
1217 | nvme_start_queues(ctrl); |
1218 | + nvme_mpath_update(ctrl); |
1219 | } |
1220 | ctrl->created = true; |
1221 | } |
1222 | diff --git a/drivers/nvme/host/multipath.c b/drivers/nvme/host/multipath.c |
1223 | index 4d615337e6e22..811f7b96b5517 100644 |
1224 | --- a/drivers/nvme/host/multipath.c |
1225 | +++ b/drivers/nvme/host/multipath.c |
1226 | @@ -501,8 +501,17 @@ static void nvme_update_ns_ana_state(struct nvme_ana_group_desc *desc, |
1227 | ns->ana_grpid = le32_to_cpu(desc->grpid); |
1228 | ns->ana_state = desc->state; |
1229 | clear_bit(NVME_NS_ANA_PENDING, &ns->flags); |
1230 | - |
1231 | - if (nvme_state_is_live(ns->ana_state)) |
1232 | + /* |
1233 | + * nvme_mpath_set_live() will trigger I/O to the multipath path device |
1234 | + * and in turn to this path device. However we cannot accept this I/O |
1235 | + * if the controller is not live. This may deadlock if called from |
1236 | + * nvme_mpath_init_identify() and the ctrl will never complete |
1237 | + * initialization, preventing I/O from completing. For this case we |
1238 | + * will reprocess the ANA log page in nvme_mpath_update() once the |
1239 | + * controller is ready. |
1240 | + */ |
1241 | + if (nvme_state_is_live(ns->ana_state) && |
1242 | + ns->ctrl->state == NVME_CTRL_LIVE) |
1243 | nvme_mpath_set_live(ns); |
1244 | } |
1245 | |
1246 | @@ -586,6 +595,18 @@ static void nvme_ana_work(struct work_struct *work) |
1247 | nvme_read_ana_log(ctrl); |
1248 | } |
1249 | |
1250 | +void nvme_mpath_update(struct nvme_ctrl *ctrl) |
1251 | +{ |
1252 | + u32 nr_change_groups = 0; |
1253 | + |
1254 | + if (!ctrl->ana_log_buf) |
1255 | + return; |
1256 | + |
1257 | + mutex_lock(&ctrl->ana_lock); |
1258 | + nvme_parse_ana_log(ctrl, &nr_change_groups, nvme_update_ana_state); |
1259 | + mutex_unlock(&ctrl->ana_lock); |
1260 | +} |
1261 | + |
1262 | static void nvme_anatt_timeout(struct timer_list *t) |
1263 | { |
1264 | struct nvme_ctrl *ctrl = from_timer(ctrl, t, anatt_timer); |
1265 | diff --git a/drivers/nvme/host/nvme.h b/drivers/nvme/host/nvme.h |
1266 | index 2df90d4355b9a..1d1431dd4f9e3 100644 |
1267 | --- a/drivers/nvme/host/nvme.h |
1268 | +++ b/drivers/nvme/host/nvme.h |
1269 | @@ -551,6 +551,7 @@ void nvme_mpath_add_disk(struct nvme_ns *ns, struct nvme_id_ns *id); |
1270 | void nvme_mpath_remove_disk(struct nvme_ns_head *head); |
1271 | int nvme_mpath_init_identify(struct nvme_ctrl *ctrl, struct nvme_id_ctrl *id); |
1272 | void nvme_mpath_init_ctrl(struct nvme_ctrl *ctrl); |
1273 | +void nvme_mpath_update(struct nvme_ctrl *ctrl); |
1274 | void nvme_mpath_uninit(struct nvme_ctrl *ctrl); |
1275 | void nvme_mpath_stop(struct nvme_ctrl *ctrl); |
1276 | bool nvme_mpath_clear_current_path(struct nvme_ns *ns); |
1277 | @@ -648,6 +649,9 @@ static inline int nvme_mpath_init_identify(struct nvme_ctrl *ctrl, |
1278 | "Please enable CONFIG_NVME_MULTIPATH for full support of multi-port devices.\n"); |
1279 | return 0; |
1280 | } |
1281 | +static inline void nvme_mpath_update(struct nvme_ctrl *ctrl) |
1282 | +{ |
1283 | +} |
1284 | static inline void nvme_mpath_uninit(struct nvme_ctrl *ctrl) |
1285 | { |
1286 | } |
1287 | diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c |
1288 | index b9550cd4280ca..d539eb379743e 100644 |
1289 | --- a/drivers/pci/pci.c |
1290 | +++ b/drivers/pci/pci.c |
1291 | @@ -2613,6 +2613,16 @@ static const struct dmi_system_id bridge_d3_blacklist[] = { |
1292 | DMI_MATCH(DMI_BOARD_VENDOR, "Gigabyte Technology Co., Ltd."), |
1293 | DMI_MATCH(DMI_BOARD_NAME, "X299 DESIGNARE EX-CF"), |
1294 | }, |
1295 | + /* |
1296 | + * Downstream device is not accessible after putting a root port |
1297 | + * into D3cold and back into D0 on Elo i2. |
1298 | + */ |
1299 | + .ident = "Elo i2", |
1300 | + .matches = { |
1301 | + DMI_MATCH(DMI_SYS_VENDOR, "Elo Touch Solutions"), |
1302 | + DMI_MATCH(DMI_PRODUCT_NAME, "Elo i2"), |
1303 | + DMI_MATCH(DMI_PRODUCT_VERSION, "RevB"), |
1304 | + }, |
1305 | }, |
1306 | #endif |
1307 | { } |
1308 | diff --git a/drivers/platform/chrome/cros_ec_debugfs.c b/drivers/platform/chrome/cros_ec_debugfs.c |
1309 | index 6ae484989d1f5..c4b57e1df192a 100644 |
1310 | --- a/drivers/platform/chrome/cros_ec_debugfs.c |
1311 | +++ b/drivers/platform/chrome/cros_ec_debugfs.c |
1312 | @@ -26,6 +26,9 @@ |
1313 | |
1314 | #define CIRC_ADD(idx, size, value) (((idx) + (value)) & ((size) - 1)) |
1315 | |
1316 | +/* waitqueue for log readers */ |
1317 | +static DECLARE_WAIT_QUEUE_HEAD(cros_ec_debugfs_log_wq); |
1318 | + |
1319 | /** |
1320 | * struct cros_ec_debugfs - EC debugging information. |
1321 | * |
1322 | @@ -34,7 +37,6 @@ |
1323 | * @log_buffer: circular buffer for console log information |
1324 | * @read_msg: preallocated EC command and buffer to read console log |
1325 | * @log_mutex: mutex to protect circular buffer |
1326 | - * @log_wq: waitqueue for log readers |
1327 | * @log_poll_work: recurring task to poll EC for new console log data |
1328 | * @panicinfo_blob: panicinfo debugfs blob |
1329 | */ |
1330 | @@ -45,7 +47,6 @@ struct cros_ec_debugfs { |
1331 | struct circ_buf log_buffer; |
1332 | struct cros_ec_command *read_msg; |
1333 | struct mutex log_mutex; |
1334 | - wait_queue_head_t log_wq; |
1335 | struct delayed_work log_poll_work; |
1336 | /* EC panicinfo */ |
1337 | struct debugfs_blob_wrapper panicinfo_blob; |
1338 | @@ -108,7 +109,7 @@ static void cros_ec_console_log_work(struct work_struct *__work) |
1339 | buf_space--; |
1340 | } |
1341 | |
1342 | - wake_up(&debug_info->log_wq); |
1343 | + wake_up(&cros_ec_debugfs_log_wq); |
1344 | } |
1345 | |
1346 | mutex_unlock(&debug_info->log_mutex); |
1347 | @@ -142,7 +143,7 @@ static ssize_t cros_ec_console_log_read(struct file *file, char __user *buf, |
1348 | |
1349 | mutex_unlock(&debug_info->log_mutex); |
1350 | |
1351 | - ret = wait_event_interruptible(debug_info->log_wq, |
1352 | + ret = wait_event_interruptible(cros_ec_debugfs_log_wq, |
1353 | CIRC_CNT(cb->head, cb->tail, LOG_SIZE)); |
1354 | if (ret < 0) |
1355 | return ret; |
1356 | @@ -174,7 +175,7 @@ static __poll_t cros_ec_console_log_poll(struct file *file, |
1357 | struct cros_ec_debugfs *debug_info = file->private_data; |
1358 | __poll_t mask = 0; |
1359 | |
1360 | - poll_wait(file, &debug_info->log_wq, wait); |
1361 | + poll_wait(file, &cros_ec_debugfs_log_wq, wait); |
1362 | |
1363 | mutex_lock(&debug_info->log_mutex); |
1364 | if (CIRC_CNT(debug_info->log_buffer.head, |
1365 | @@ -359,7 +360,6 @@ static int cros_ec_create_console_log(struct cros_ec_debugfs *debug_info) |
1366 | debug_info->log_buffer.tail = 0; |
1367 | |
1368 | mutex_init(&debug_info->log_mutex); |
1369 | - init_waitqueue_head(&debug_info->log_wq); |
1370 | |
1371 | debugfs_create_file("console_log", S_IFREG | 0444, debug_info->dir, |
1372 | debug_info, &cros_ec_console_log_fops); |
1373 | diff --git a/drivers/rtc/class.c b/drivers/rtc/class.c |
1374 | index 9458e6d6686ac..8b434213bc7ad 100644 |
1375 | --- a/drivers/rtc/class.c |
1376 | +++ b/drivers/rtc/class.c |
1377 | @@ -26,6 +26,15 @@ struct class *rtc_class; |
1378 | static void rtc_device_release(struct device *dev) |
1379 | { |
1380 | struct rtc_device *rtc = to_rtc_device(dev); |
1381 | + struct timerqueue_head *head = &rtc->timerqueue; |
1382 | + struct timerqueue_node *node; |
1383 | + |
1384 | + mutex_lock(&rtc->ops_lock); |
1385 | + while ((node = timerqueue_getnext(head))) |
1386 | + timerqueue_del(head, node); |
1387 | + mutex_unlock(&rtc->ops_lock); |
1388 | + |
1389 | + cancel_work_sync(&rtc->irqwork); |
1390 | |
1391 | ida_simple_remove(&rtc_ida, rtc->id); |
1392 | kfree(rtc); |
1393 | diff --git a/drivers/rtc/rtc-mc146818-lib.c b/drivers/rtc/rtc-mc146818-lib.c |
1394 | index 5add637c9ad23..b036ff33fbe61 100644 |
1395 | --- a/drivers/rtc/rtc-mc146818-lib.c |
1396 | +++ b/drivers/rtc/rtc-mc146818-lib.c |
1397 | @@ -99,6 +99,17 @@ unsigned int mc146818_get_time(struct rtc_time *time) |
1398 | } |
1399 | EXPORT_SYMBOL_GPL(mc146818_get_time); |
1400 | |
1401 | +/* AMD systems don't allow access to AltCentury with DV1 */ |
1402 | +static bool apply_amd_register_a_behavior(void) |
1403 | +{ |
1404 | +#ifdef CONFIG_X86 |
1405 | + if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD || |
1406 | + boot_cpu_data.x86_vendor == X86_VENDOR_HYGON) |
1407 | + return true; |
1408 | +#endif |
1409 | + return false; |
1410 | +} |
1411 | + |
1412 | /* Set the current date and time in the real time clock. */ |
1413 | int mc146818_set_time(struct rtc_time *time) |
1414 | { |
1415 | @@ -172,7 +183,10 @@ int mc146818_set_time(struct rtc_time *time) |
1416 | save_control = CMOS_READ(RTC_CONTROL); |
1417 | CMOS_WRITE((save_control|RTC_SET), RTC_CONTROL); |
1418 | save_freq_select = CMOS_READ(RTC_FREQ_SELECT); |
1419 | - CMOS_WRITE((save_freq_select|RTC_DIV_RESET2), RTC_FREQ_SELECT); |
1420 | + if (apply_amd_register_a_behavior()) |
1421 | + CMOS_WRITE((save_freq_select & ~RTC_AMD_BANK_SELECT), RTC_FREQ_SELECT); |
1422 | + else |
1423 | + CMOS_WRITE((save_freq_select|RTC_DIV_RESET2), RTC_FREQ_SELECT); |
1424 | |
1425 | #ifdef CONFIG_MACH_DECSTATION |
1426 | CMOS_WRITE(real_yrs, RTC_DEC_YEAR); |
1427 | diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c |
1428 | index df598c377161d..cb97565b6a333 100644 |
1429 | --- a/drivers/scsi/qla2xxx/qla_target.c |
1430 | +++ b/drivers/scsi/qla2xxx/qla_target.c |
1431 | @@ -3768,6 +3768,9 @@ int qlt_abort_cmd(struct qla_tgt_cmd *cmd) |
1432 | |
1433 | spin_lock_irqsave(&cmd->cmd_lock, flags); |
1434 | if (cmd->aborted) { |
1435 | + if (cmd->sg_mapped) |
1436 | + qlt_unmap_sg(vha, cmd); |
1437 | + |
1438 | spin_unlock_irqrestore(&cmd->cmd_lock, flags); |
1439 | /* |
1440 | * It's normal to see 2 calls in this path: |
1441 | diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c |
1442 | index 1058aba8d5734..3e0267ead718d 100644 |
1443 | --- a/drivers/vhost/net.c |
1444 | +++ b/drivers/vhost/net.c |
1445 | @@ -1446,13 +1446,9 @@ err: |
1446 | return ERR_PTR(r); |
1447 | } |
1448 | |
1449 | -static struct ptr_ring *get_tap_ptr_ring(int fd) |
1450 | +static struct ptr_ring *get_tap_ptr_ring(struct file *file) |
1451 | { |
1452 | struct ptr_ring *ring; |
1453 | - struct file *file = fget(fd); |
1454 | - |
1455 | - if (!file) |
1456 | - return NULL; |
1457 | ring = tun_get_tx_ring(file); |
1458 | if (!IS_ERR(ring)) |
1459 | goto out; |
1460 | @@ -1461,7 +1457,6 @@ static struct ptr_ring *get_tap_ptr_ring(int fd) |
1461 | goto out; |
1462 | ring = NULL; |
1463 | out: |
1464 | - fput(file); |
1465 | return ring; |
1466 | } |
1467 | |
1468 | @@ -1548,8 +1543,12 @@ static long vhost_net_set_backend(struct vhost_net *n, unsigned index, int fd) |
1469 | r = vhost_net_enable_vq(n, vq); |
1470 | if (r) |
1471 | goto err_used; |
1472 | - if (index == VHOST_NET_VQ_RX) |
1473 | - nvq->rx_ring = get_tap_ptr_ring(fd); |
1474 | + if (index == VHOST_NET_VQ_RX) { |
1475 | + if (sock) |
1476 | + nvq->rx_ring = get_tap_ptr_ring(sock->file); |
1477 | + else |
1478 | + nvq->rx_ring = NULL; |
1479 | + } |
1480 | |
1481 | oldubufs = nvq->ubufs; |
1482 | nvq->ubufs = ubufs; |
1483 | diff --git a/fs/afs/inode.c b/fs/afs/inode.c |
1484 | index 4f58b28a1edd2..90eac3ec01cbc 100644 |
1485 | --- a/fs/afs/inode.c |
1486 | +++ b/fs/afs/inode.c |
1487 | @@ -734,10 +734,22 @@ int afs_getattr(const struct path *path, struct kstat *stat, |
1488 | { |
1489 | struct inode *inode = d_inode(path->dentry); |
1490 | struct afs_vnode *vnode = AFS_FS_I(inode); |
1491 | - int seq = 0; |
1492 | + struct key *key; |
1493 | + int ret, seq = 0; |
1494 | |
1495 | _enter("{ ino=%lu v=%u }", inode->i_ino, inode->i_generation); |
1496 | |
1497 | + if (!(query_flags & AT_STATX_DONT_SYNC) && |
1498 | + !test_bit(AFS_VNODE_CB_PROMISED, &vnode->flags)) { |
1499 | + key = afs_request_key(vnode->volume->cell); |
1500 | + if (IS_ERR(key)) |
1501 | + return PTR_ERR(key); |
1502 | + ret = afs_validate(vnode, key); |
1503 | + key_put(key); |
1504 | + if (ret < 0) |
1505 | + return ret; |
1506 | + } |
1507 | + |
1508 | do { |
1509 | read_seqbegin_or_lock(&vnode->cb_lock, &seq); |
1510 | generic_fillattr(inode, stat); |
1511 | diff --git a/fs/file_table.c b/fs/file_table.c |
1512 | index 30d55c9a1744a..70e8fb68a1717 100644 |
1513 | --- a/fs/file_table.c |
1514 | +++ b/fs/file_table.c |
1515 | @@ -375,6 +375,7 @@ void __fput_sync(struct file *file) |
1516 | } |
1517 | |
1518 | EXPORT_SYMBOL(fput); |
1519 | +EXPORT_SYMBOL(__fput_sync); |
1520 | |
1521 | void __init files_init(void) |
1522 | { |
1523 | diff --git a/fs/nilfs2/btnode.c b/fs/nilfs2/btnode.c |
1524 | index 4391fd3abd8f8..e00e184b12615 100644 |
1525 | --- a/fs/nilfs2/btnode.c |
1526 | +++ b/fs/nilfs2/btnode.c |
1527 | @@ -20,6 +20,23 @@ |
1528 | #include "page.h" |
1529 | #include "btnode.h" |
1530 | |
1531 | + |
1532 | +/** |
1533 | + * nilfs_init_btnc_inode - initialize B-tree node cache inode |
1534 | + * @btnc_inode: inode to be initialized |
1535 | + * |
1536 | + * nilfs_init_btnc_inode() sets up an inode for B-tree node cache. |
1537 | + */ |
1538 | +void nilfs_init_btnc_inode(struct inode *btnc_inode) |
1539 | +{ |
1540 | + struct nilfs_inode_info *ii = NILFS_I(btnc_inode); |
1541 | + |
1542 | + btnc_inode->i_mode = S_IFREG; |
1543 | + ii->i_flags = 0; |
1544 | + memset(&ii->i_bmap_data, 0, sizeof(struct nilfs_bmap)); |
1545 | + mapping_set_gfp_mask(btnc_inode->i_mapping, GFP_NOFS); |
1546 | +} |
1547 | + |
1548 | void nilfs_btnode_cache_clear(struct address_space *btnc) |
1549 | { |
1550 | invalidate_mapping_pages(btnc, 0, -1); |
1551 | @@ -29,7 +46,7 @@ void nilfs_btnode_cache_clear(struct address_space *btnc) |
1552 | struct buffer_head * |
1553 | nilfs_btnode_create_block(struct address_space *btnc, __u64 blocknr) |
1554 | { |
1555 | - struct inode *inode = NILFS_BTNC_I(btnc); |
1556 | + struct inode *inode = btnc->host; |
1557 | struct buffer_head *bh; |
1558 | |
1559 | bh = nilfs_grab_buffer(inode, btnc, blocknr, BIT(BH_NILFS_Node)); |
1560 | @@ -57,7 +74,7 @@ int nilfs_btnode_submit_block(struct address_space *btnc, __u64 blocknr, |
1561 | struct buffer_head **pbh, sector_t *submit_ptr) |
1562 | { |
1563 | struct buffer_head *bh; |
1564 | - struct inode *inode = NILFS_BTNC_I(btnc); |
1565 | + struct inode *inode = btnc->host; |
1566 | struct page *page; |
1567 | int err; |
1568 | |
1569 | @@ -157,7 +174,7 @@ int nilfs_btnode_prepare_change_key(struct address_space *btnc, |
1570 | struct nilfs_btnode_chkey_ctxt *ctxt) |
1571 | { |
1572 | struct buffer_head *obh, *nbh; |
1573 | - struct inode *inode = NILFS_BTNC_I(btnc); |
1574 | + struct inode *inode = btnc->host; |
1575 | __u64 oldkey = ctxt->oldkey, newkey = ctxt->newkey; |
1576 | int err; |
1577 | |
1578 | diff --git a/fs/nilfs2/btnode.h b/fs/nilfs2/btnode.h |
1579 | index 0f88dbc9bcb3e..05ab64d354dc9 100644 |
1580 | --- a/fs/nilfs2/btnode.h |
1581 | +++ b/fs/nilfs2/btnode.h |
1582 | @@ -30,6 +30,7 @@ struct nilfs_btnode_chkey_ctxt { |
1583 | struct buffer_head *newbh; |
1584 | }; |
1585 | |
1586 | +void nilfs_init_btnc_inode(struct inode *btnc_inode); |
1587 | void nilfs_btnode_cache_clear(struct address_space *); |
1588 | struct buffer_head *nilfs_btnode_create_block(struct address_space *btnc, |
1589 | __u64 blocknr); |
1590 | diff --git a/fs/nilfs2/btree.c b/fs/nilfs2/btree.c |
1591 | index 23e043eca237b..919d1238ce45f 100644 |
1592 | --- a/fs/nilfs2/btree.c |
1593 | +++ b/fs/nilfs2/btree.c |
1594 | @@ -58,7 +58,8 @@ static void nilfs_btree_free_path(struct nilfs_btree_path *path) |
1595 | static int nilfs_btree_get_new_block(const struct nilfs_bmap *btree, |
1596 | __u64 ptr, struct buffer_head **bhp) |
1597 | { |
1598 | - struct address_space *btnc = &NILFS_BMAP_I(btree)->i_btnode_cache; |
1599 | + struct inode *btnc_inode = NILFS_BMAP_I(btree)->i_assoc_inode; |
1600 | + struct address_space *btnc = btnc_inode->i_mapping; |
1601 | struct buffer_head *bh; |
1602 | |
1603 | bh = nilfs_btnode_create_block(btnc, ptr); |
1604 | @@ -470,7 +471,8 @@ static int __nilfs_btree_get_block(const struct nilfs_bmap *btree, __u64 ptr, |
1605 | struct buffer_head **bhp, |
1606 | const struct nilfs_btree_readahead_info *ra) |
1607 | { |
1608 | - struct address_space *btnc = &NILFS_BMAP_I(btree)->i_btnode_cache; |
1609 | + struct inode *btnc_inode = NILFS_BMAP_I(btree)->i_assoc_inode; |
1610 | + struct address_space *btnc = btnc_inode->i_mapping; |
1611 | struct buffer_head *bh, *ra_bh; |
1612 | sector_t submit_ptr = 0; |
1613 | int ret; |
1614 | @@ -1742,6 +1744,10 @@ nilfs_btree_prepare_convert_and_insert(struct nilfs_bmap *btree, __u64 key, |
1615 | dat = nilfs_bmap_get_dat(btree); |
1616 | } |
1617 | |
1618 | + ret = nilfs_attach_btree_node_cache(&NILFS_BMAP_I(btree)->vfs_inode); |
1619 | + if (ret < 0) |
1620 | + return ret; |
1621 | + |
1622 | ret = nilfs_bmap_prepare_alloc_ptr(btree, dreq, dat); |
1623 | if (ret < 0) |
1624 | return ret; |
1625 | @@ -1914,7 +1920,7 @@ static int nilfs_btree_prepare_update_v(struct nilfs_bmap *btree, |
1626 | path[level].bp_ctxt.newkey = path[level].bp_newreq.bpr_ptr; |
1627 | path[level].bp_ctxt.bh = path[level].bp_bh; |
1628 | ret = nilfs_btnode_prepare_change_key( |
1629 | - &NILFS_BMAP_I(btree)->i_btnode_cache, |
1630 | + NILFS_BMAP_I(btree)->i_assoc_inode->i_mapping, |
1631 | &path[level].bp_ctxt); |
1632 | if (ret < 0) { |
1633 | nilfs_dat_abort_update(dat, |
1634 | @@ -1940,7 +1946,7 @@ static void nilfs_btree_commit_update_v(struct nilfs_bmap *btree, |
1635 | |
1636 | if (buffer_nilfs_node(path[level].bp_bh)) { |
1637 | nilfs_btnode_commit_change_key( |
1638 | - &NILFS_BMAP_I(btree)->i_btnode_cache, |
1639 | + NILFS_BMAP_I(btree)->i_assoc_inode->i_mapping, |
1640 | &path[level].bp_ctxt); |
1641 | path[level].bp_bh = path[level].bp_ctxt.bh; |
1642 | } |
1643 | @@ -1959,7 +1965,7 @@ static void nilfs_btree_abort_update_v(struct nilfs_bmap *btree, |
1644 | &path[level].bp_newreq.bpr_req); |
1645 | if (buffer_nilfs_node(path[level].bp_bh)) |
1646 | nilfs_btnode_abort_change_key( |
1647 | - &NILFS_BMAP_I(btree)->i_btnode_cache, |
1648 | + NILFS_BMAP_I(btree)->i_assoc_inode->i_mapping, |
1649 | &path[level].bp_ctxt); |
1650 | } |
1651 | |
1652 | @@ -2135,7 +2141,8 @@ static void nilfs_btree_add_dirty_buffer(struct nilfs_bmap *btree, |
1653 | static void nilfs_btree_lookup_dirty_buffers(struct nilfs_bmap *btree, |
1654 | struct list_head *listp) |
1655 | { |
1656 | - struct address_space *btcache = &NILFS_BMAP_I(btree)->i_btnode_cache; |
1657 | + struct inode *btnc_inode = NILFS_BMAP_I(btree)->i_assoc_inode; |
1658 | + struct address_space *btcache = btnc_inode->i_mapping; |
1659 | struct list_head lists[NILFS_BTREE_LEVEL_MAX]; |
1660 | struct pagevec pvec; |
1661 | struct buffer_head *bh, *head; |
1662 | @@ -2189,12 +2196,12 @@ static int nilfs_btree_assign_p(struct nilfs_bmap *btree, |
1663 | path[level].bp_ctxt.newkey = blocknr; |
1664 | path[level].bp_ctxt.bh = *bh; |
1665 | ret = nilfs_btnode_prepare_change_key( |
1666 | - &NILFS_BMAP_I(btree)->i_btnode_cache, |
1667 | + NILFS_BMAP_I(btree)->i_assoc_inode->i_mapping, |
1668 | &path[level].bp_ctxt); |
1669 | if (ret < 0) |
1670 | return ret; |
1671 | nilfs_btnode_commit_change_key( |
1672 | - &NILFS_BMAP_I(btree)->i_btnode_cache, |
1673 | + NILFS_BMAP_I(btree)->i_assoc_inode->i_mapping, |
1674 | &path[level].bp_ctxt); |
1675 | *bh = path[level].bp_ctxt.bh; |
1676 | } |
1677 | @@ -2399,6 +2406,10 @@ int nilfs_btree_init(struct nilfs_bmap *bmap) |
1678 | |
1679 | if (nilfs_btree_root_broken(nilfs_btree_get_root(bmap), bmap->b_inode)) |
1680 | ret = -EIO; |
1681 | + else |
1682 | + ret = nilfs_attach_btree_node_cache( |
1683 | + &NILFS_BMAP_I(bmap)->vfs_inode); |
1684 | + |
1685 | return ret; |
1686 | } |
1687 | |
1688 | diff --git a/fs/nilfs2/dat.c b/fs/nilfs2/dat.c |
1689 | index 6f4066636be9a..a3523a243e113 100644 |
1690 | --- a/fs/nilfs2/dat.c |
1691 | +++ b/fs/nilfs2/dat.c |
1692 | @@ -497,7 +497,9 @@ int nilfs_dat_read(struct super_block *sb, size_t entry_size, |
1693 | di = NILFS_DAT_I(dat); |
1694 | lockdep_set_class(&di->mi.mi_sem, &dat_lock_key); |
1695 | nilfs_palloc_setup_cache(dat, &di->palloc_cache); |
1696 | - nilfs_mdt_setup_shadow_map(dat, &di->shadow); |
1697 | + err = nilfs_mdt_setup_shadow_map(dat, &di->shadow); |
1698 | + if (err) |
1699 | + goto failed; |
1700 | |
1701 | err = nilfs_read_inode_common(dat, raw_inode); |
1702 | if (err) |
1703 | diff --git a/fs/nilfs2/gcinode.c b/fs/nilfs2/gcinode.c |
1704 | index aa3c328ee189c..114774ac2185a 100644 |
1705 | --- a/fs/nilfs2/gcinode.c |
1706 | +++ b/fs/nilfs2/gcinode.c |
1707 | @@ -126,9 +126,10 @@ int nilfs_gccache_submit_read_data(struct inode *inode, sector_t blkoff, |
1708 | int nilfs_gccache_submit_read_node(struct inode *inode, sector_t pbn, |
1709 | __u64 vbn, struct buffer_head **out_bh) |
1710 | { |
1711 | + struct inode *btnc_inode = NILFS_I(inode)->i_assoc_inode; |
1712 | int ret; |
1713 | |
1714 | - ret = nilfs_btnode_submit_block(&NILFS_I(inode)->i_btnode_cache, |
1715 | + ret = nilfs_btnode_submit_block(btnc_inode->i_mapping, |
1716 | vbn ? : pbn, pbn, REQ_OP_READ, 0, |
1717 | out_bh, &pbn); |
1718 | if (ret == -EEXIST) /* internal code (cache hit) */ |
1719 | @@ -170,7 +171,7 @@ int nilfs_init_gcinode(struct inode *inode) |
1720 | ii->i_flags = 0; |
1721 | nilfs_bmap_init_gc(ii->i_bmap); |
1722 | |
1723 | - return 0; |
1724 | + return nilfs_attach_btree_node_cache(inode); |
1725 | } |
1726 | |
1727 | /** |
1728 | @@ -185,7 +186,7 @@ void nilfs_remove_all_gcinodes(struct the_nilfs *nilfs) |
1729 | ii = list_first_entry(head, struct nilfs_inode_info, i_dirty); |
1730 | list_del_init(&ii->i_dirty); |
1731 | truncate_inode_pages(&ii->vfs_inode.i_data, 0); |
1732 | - nilfs_btnode_cache_clear(&ii->i_btnode_cache); |
1733 | + nilfs_btnode_cache_clear(ii->i_assoc_inode->i_mapping); |
1734 | iput(&ii->vfs_inode); |
1735 | } |
1736 | } |
1737 | diff --git a/fs/nilfs2/inode.c b/fs/nilfs2/inode.c |
1738 | index 671085512e0fd..35b0bfe9324f2 100644 |
1739 | --- a/fs/nilfs2/inode.c |
1740 | +++ b/fs/nilfs2/inode.c |
1741 | @@ -28,12 +28,16 @@ |
1742 | * @cno: checkpoint number |
1743 | * @root: pointer on NILFS root object (mounted checkpoint) |
1744 | * @for_gc: inode for GC flag |
1745 | + * @for_btnc: inode for B-tree node cache flag |
1746 | + * @for_shadow: inode for shadowed page cache flag |
1747 | */ |
1748 | struct nilfs_iget_args { |
1749 | u64 ino; |
1750 | __u64 cno; |
1751 | struct nilfs_root *root; |
1752 | - int for_gc; |
1753 | + bool for_gc; |
1754 | + bool for_btnc; |
1755 | + bool for_shadow; |
1756 | }; |
1757 | |
1758 | static int nilfs_iget_test(struct inode *inode, void *opaque); |
1759 | @@ -322,7 +326,8 @@ static int nilfs_insert_inode_locked(struct inode *inode, |
1760 | unsigned long ino) |
1761 | { |
1762 | struct nilfs_iget_args args = { |
1763 | - .ino = ino, .root = root, .cno = 0, .for_gc = 0 |
1764 | + .ino = ino, .root = root, .cno = 0, .for_gc = false, |
1765 | + .for_btnc = false, .for_shadow = false |
1766 | }; |
1767 | |
1768 | return insert_inode_locked4(inode, ino, nilfs_iget_test, &args); |
1769 | @@ -534,6 +539,19 @@ static int nilfs_iget_test(struct inode *inode, void *opaque) |
1770 | return 0; |
1771 | |
1772 | ii = NILFS_I(inode); |
1773 | + if (test_bit(NILFS_I_BTNC, &ii->i_state)) { |
1774 | + if (!args->for_btnc) |
1775 | + return 0; |
1776 | + } else if (args->for_btnc) { |
1777 | + return 0; |
1778 | + } |
1779 | + if (test_bit(NILFS_I_SHADOW, &ii->i_state)) { |
1780 | + if (!args->for_shadow) |
1781 | + return 0; |
1782 | + } else if (args->for_shadow) { |
1783 | + return 0; |
1784 | + } |
1785 | + |
1786 | if (!test_bit(NILFS_I_GCINODE, &ii->i_state)) |
1787 | return !args->for_gc; |
1788 | |
1789 | @@ -545,15 +563,17 @@ static int nilfs_iget_set(struct inode *inode, void *opaque) |
1790 | struct nilfs_iget_args *args = opaque; |
1791 | |
1792 | inode->i_ino = args->ino; |
1793 | - if (args->for_gc) { |
1794 | + NILFS_I(inode)->i_cno = args->cno; |
1795 | + NILFS_I(inode)->i_root = args->root; |
1796 | + if (args->root && args->ino == NILFS_ROOT_INO) |
1797 | + nilfs_get_root(args->root); |
1798 | + |
1799 | + if (args->for_gc) |
1800 | NILFS_I(inode)->i_state = BIT(NILFS_I_GCINODE); |
1801 | - NILFS_I(inode)->i_cno = args->cno; |
1802 | - NILFS_I(inode)->i_root = NULL; |
1803 | - } else { |
1804 | - if (args->root && args->ino == NILFS_ROOT_INO) |
1805 | - nilfs_get_root(args->root); |
1806 | - NILFS_I(inode)->i_root = args->root; |
1807 | - } |
1808 | + if (args->for_btnc) |
1809 | + NILFS_I(inode)->i_state |= BIT(NILFS_I_BTNC); |
1810 | + if (args->for_shadow) |
1811 | + NILFS_I(inode)->i_state |= BIT(NILFS_I_SHADOW); |
1812 | return 0; |
1813 | } |
1814 | |
1815 | @@ -561,7 +581,8 @@ struct inode *nilfs_ilookup(struct super_block *sb, struct nilfs_root *root, |
1816 | unsigned long ino) |
1817 | { |
1818 | struct nilfs_iget_args args = { |
1819 | - .ino = ino, .root = root, .cno = 0, .for_gc = 0 |
1820 | + .ino = ino, .root = root, .cno = 0, .for_gc = false, |
1821 | + .for_btnc = false, .for_shadow = false |
1822 | }; |
1823 | |
1824 | return ilookup5(sb, ino, nilfs_iget_test, &args); |
1825 | @@ -571,7 +592,8 @@ struct inode *nilfs_iget_locked(struct super_block *sb, struct nilfs_root *root, |
1826 | unsigned long ino) |
1827 | { |
1828 | struct nilfs_iget_args args = { |
1829 | - .ino = ino, .root = root, .cno = 0, .for_gc = 0 |
1830 | + .ino = ino, .root = root, .cno = 0, .for_gc = false, |
1831 | + .for_btnc = false, .for_shadow = false |
1832 | }; |
1833 | |
1834 | return iget5_locked(sb, ino, nilfs_iget_test, nilfs_iget_set, &args); |
1835 | @@ -602,7 +624,8 @@ struct inode *nilfs_iget_for_gc(struct super_block *sb, unsigned long ino, |
1836 | __u64 cno) |
1837 | { |
1838 | struct nilfs_iget_args args = { |
1839 | - .ino = ino, .root = NULL, .cno = cno, .for_gc = 1 |
1840 | + .ino = ino, .root = NULL, .cno = cno, .for_gc = true, |
1841 | + .for_btnc = false, .for_shadow = false |
1842 | }; |
1843 | struct inode *inode; |
1844 | int err; |
1845 | @@ -622,6 +645,113 @@ struct inode *nilfs_iget_for_gc(struct super_block *sb, unsigned long ino, |
1846 | return inode; |
1847 | } |
1848 | |
1849 | +/** |
1850 | + * nilfs_attach_btree_node_cache - attach a B-tree node cache to the inode |
1851 | + * @inode: inode object |
1852 | + * |
1853 | + * nilfs_attach_btree_node_cache() attaches a B-tree node cache to @inode, |
1854 | + * or does nothing if the inode already has it. This function allocates |
1855 | + * an additional inode to maintain page cache of B-tree nodes one-on-one. |
1856 | + * |
1857 | + * Return Value: On success, 0 is returned. On errors, one of the following |
1858 | + * negative error code is returned. |
1859 | + * |
1860 | + * %-ENOMEM - Insufficient memory available. |
1861 | + */ |
1862 | +int nilfs_attach_btree_node_cache(struct inode *inode) |
1863 | +{ |
1864 | + struct nilfs_inode_info *ii = NILFS_I(inode); |
1865 | + struct inode *btnc_inode; |
1866 | + struct nilfs_iget_args args; |
1867 | + |
1868 | + if (ii->i_assoc_inode) |
1869 | + return 0; |
1870 | + |
1871 | + args.ino = inode->i_ino; |
1872 | + args.root = ii->i_root; |
1873 | + args.cno = ii->i_cno; |
1874 | + args.for_gc = test_bit(NILFS_I_GCINODE, &ii->i_state) != 0; |
1875 | + args.for_btnc = true; |
1876 | + args.for_shadow = test_bit(NILFS_I_SHADOW, &ii->i_state) != 0; |
1877 | + |
1878 | + btnc_inode = iget5_locked(inode->i_sb, inode->i_ino, nilfs_iget_test, |
1879 | + nilfs_iget_set, &args); |
1880 | + if (unlikely(!btnc_inode)) |
1881 | + return -ENOMEM; |
1882 | + if (btnc_inode->i_state & I_NEW) { |
1883 | + nilfs_init_btnc_inode(btnc_inode); |
1884 | + unlock_new_inode(btnc_inode); |
1885 | + } |
1886 | + NILFS_I(btnc_inode)->i_assoc_inode = inode; |
1887 | + NILFS_I(btnc_inode)->i_bmap = ii->i_bmap; |
1888 | + ii->i_assoc_inode = btnc_inode; |
1889 | + |
1890 | + return 0; |
1891 | +} |
1892 | + |
1893 | +/** |
1894 | + * nilfs_detach_btree_node_cache - detach the B-tree node cache from the inode |
1895 | + * @inode: inode object |
1896 | + * |
1897 | + * nilfs_detach_btree_node_cache() detaches the B-tree node cache and its |
1898 | + * holder inode bound to @inode, or does nothing if @inode doesn't have it. |
1899 | + */ |
1900 | +void nilfs_detach_btree_node_cache(struct inode *inode) |
1901 | +{ |
1902 | + struct nilfs_inode_info *ii = NILFS_I(inode); |
1903 | + struct inode *btnc_inode = ii->i_assoc_inode; |
1904 | + |
1905 | + if (btnc_inode) { |
1906 | + NILFS_I(btnc_inode)->i_assoc_inode = NULL; |
1907 | + ii->i_assoc_inode = NULL; |
1908 | + iput(btnc_inode); |
1909 | + } |
1910 | +} |
1911 | + |
1912 | +/** |
1913 | + * nilfs_iget_for_shadow - obtain inode for shadow mapping |
1914 | + * @inode: inode object that uses shadow mapping |
1915 | + * |
1916 | + * nilfs_iget_for_shadow() allocates a pair of inodes that holds page |
1917 | + * caches for shadow mapping. The page cache for data pages is set up |
1918 | + * in one inode and the one for b-tree node pages is set up in the |
1919 | + * other inode, which is attached to the former inode. |
1920 | + * |
1921 | + * Return Value: On success, a pointer to the inode for data pages is |
1922 | + * returned. On errors, one of the following negative error code is returned |
1923 | + * in a pointer type. |
1924 | + * |
1925 | + * %-ENOMEM - Insufficient memory available. |
1926 | + */ |
1927 | +struct inode *nilfs_iget_for_shadow(struct inode *inode) |
1928 | +{ |
1929 | + struct nilfs_iget_args args = { |
1930 | + .ino = inode->i_ino, .root = NULL, .cno = 0, .for_gc = false, |
1931 | + .for_btnc = false, .for_shadow = true |
1932 | + }; |
1933 | + struct inode *s_inode; |
1934 | + int err; |
1935 | + |
1936 | + s_inode = iget5_locked(inode->i_sb, inode->i_ino, nilfs_iget_test, |
1937 | + nilfs_iget_set, &args); |
1938 | + if (unlikely(!s_inode)) |
1939 | + return ERR_PTR(-ENOMEM); |
1940 | + if (!(s_inode->i_state & I_NEW)) |
1941 | + return inode; |
1942 | + |
1943 | + NILFS_I(s_inode)->i_flags = 0; |
1944 | + memset(NILFS_I(s_inode)->i_bmap, 0, sizeof(struct nilfs_bmap)); |
1945 | + mapping_set_gfp_mask(s_inode->i_mapping, GFP_NOFS); |
1946 | + |
1947 | + err = nilfs_attach_btree_node_cache(s_inode); |
1948 | + if (unlikely(err)) { |
1949 | + iget_failed(s_inode); |
1950 | + return ERR_PTR(err); |
1951 | + } |
1952 | + unlock_new_inode(s_inode); |
1953 | + return s_inode; |
1954 | +} |
1955 | + |
1956 | void nilfs_write_inode_common(struct inode *inode, |
1957 | struct nilfs_inode *raw_inode, int has_bmap) |
1958 | { |
1959 | @@ -770,7 +900,8 @@ static void nilfs_clear_inode(struct inode *inode) |
1960 | if (test_bit(NILFS_I_BMAP, &ii->i_state)) |
1961 | nilfs_bmap_clear(ii->i_bmap); |
1962 | |
1963 | - nilfs_btnode_cache_clear(&ii->i_btnode_cache); |
1964 | + if (!test_bit(NILFS_I_BTNC, &ii->i_state)) |
1965 | + nilfs_detach_btree_node_cache(inode); |
1966 | |
1967 | if (ii->i_root && inode->i_ino == NILFS_ROOT_INO) |
1968 | nilfs_put_root(ii->i_root); |
1969 | diff --git a/fs/nilfs2/mdt.c b/fs/nilfs2/mdt.c |
1970 | index 700870a92bc4a..7c9055d767d16 100644 |
1971 | --- a/fs/nilfs2/mdt.c |
1972 | +++ b/fs/nilfs2/mdt.c |
1973 | @@ -469,9 +469,18 @@ int nilfs_mdt_init(struct inode *inode, gfp_t gfp_mask, size_t objsz) |
1974 | void nilfs_mdt_clear(struct inode *inode) |
1975 | { |
1976 | struct nilfs_mdt_info *mdi = NILFS_MDT(inode); |
1977 | + struct nilfs_shadow_map *shadow = mdi->mi_shadow; |
1978 | |
1979 | if (mdi->mi_palloc_cache) |
1980 | nilfs_palloc_destroy_cache(inode); |
1981 | + |
1982 | + if (shadow) { |
1983 | + struct inode *s_inode = shadow->inode; |
1984 | + |
1985 | + shadow->inode = NULL; |
1986 | + iput(s_inode); |
1987 | + mdi->mi_shadow = NULL; |
1988 | + } |
1989 | } |
1990 | |
1991 | /** |
1992 | @@ -505,12 +514,15 @@ int nilfs_mdt_setup_shadow_map(struct inode *inode, |
1993 | struct nilfs_shadow_map *shadow) |
1994 | { |
1995 | struct nilfs_mdt_info *mi = NILFS_MDT(inode); |
1996 | + struct inode *s_inode; |
1997 | |
1998 | INIT_LIST_HEAD(&shadow->frozen_buffers); |
1999 | - address_space_init_once(&shadow->frozen_data); |
2000 | - nilfs_mapping_init(&shadow->frozen_data, inode); |
2001 | - address_space_init_once(&shadow->frozen_btnodes); |
2002 | - nilfs_mapping_init(&shadow->frozen_btnodes, inode); |
2003 | + |
2004 | + s_inode = nilfs_iget_for_shadow(inode); |
2005 | + if (IS_ERR(s_inode)) |
2006 | + return PTR_ERR(s_inode); |
2007 | + |
2008 | + shadow->inode = s_inode; |
2009 | mi->mi_shadow = shadow; |
2010 | return 0; |
2011 | } |
2012 | @@ -524,14 +536,15 @@ int nilfs_mdt_save_to_shadow_map(struct inode *inode) |
2013 | struct nilfs_mdt_info *mi = NILFS_MDT(inode); |
2014 | struct nilfs_inode_info *ii = NILFS_I(inode); |
2015 | struct nilfs_shadow_map *shadow = mi->mi_shadow; |
2016 | + struct inode *s_inode = shadow->inode; |
2017 | int ret; |
2018 | |
2019 | - ret = nilfs_copy_dirty_pages(&shadow->frozen_data, inode->i_mapping); |
2020 | + ret = nilfs_copy_dirty_pages(s_inode->i_mapping, inode->i_mapping); |
2021 | if (ret) |
2022 | goto out; |
2023 | |
2024 | - ret = nilfs_copy_dirty_pages(&shadow->frozen_btnodes, |
2025 | - &ii->i_btnode_cache); |
2026 | + ret = nilfs_copy_dirty_pages(NILFS_I(s_inode)->i_assoc_inode->i_mapping, |
2027 | + ii->i_assoc_inode->i_mapping); |
2028 | if (ret) |
2029 | goto out; |
2030 | |
2031 | @@ -547,7 +560,7 @@ int nilfs_mdt_freeze_buffer(struct inode *inode, struct buffer_head *bh) |
2032 | struct page *page; |
2033 | int blkbits = inode->i_blkbits; |
2034 | |
2035 | - page = grab_cache_page(&shadow->frozen_data, bh->b_page->index); |
2036 | + page = grab_cache_page(shadow->inode->i_mapping, bh->b_page->index); |
2037 | if (!page) |
2038 | return -ENOMEM; |
2039 | |
2040 | @@ -579,7 +592,7 @@ nilfs_mdt_get_frozen_buffer(struct inode *inode, struct buffer_head *bh) |
2041 | struct page *page; |
2042 | int n; |
2043 | |
2044 | - page = find_lock_page(&shadow->frozen_data, bh->b_page->index); |
2045 | + page = find_lock_page(shadow->inode->i_mapping, bh->b_page->index); |
2046 | if (page) { |
2047 | if (page_has_buffers(page)) { |
2048 | n = bh_offset(bh) >> inode->i_blkbits; |
2049 | @@ -620,10 +633,11 @@ void nilfs_mdt_restore_from_shadow_map(struct inode *inode) |
2050 | nilfs_palloc_clear_cache(inode); |
2051 | |
2052 | nilfs_clear_dirty_pages(inode->i_mapping, true); |
2053 | - nilfs_copy_back_pages(inode->i_mapping, &shadow->frozen_data); |
2054 | + nilfs_copy_back_pages(inode->i_mapping, shadow->inode->i_mapping); |
2055 | |
2056 | - nilfs_clear_dirty_pages(&ii->i_btnode_cache, true); |
2057 | - nilfs_copy_back_pages(&ii->i_btnode_cache, &shadow->frozen_btnodes); |
2058 | + nilfs_clear_dirty_pages(ii->i_assoc_inode->i_mapping, true); |
2059 | + nilfs_copy_back_pages(ii->i_assoc_inode->i_mapping, |
2060 | + NILFS_I(shadow->inode)->i_assoc_inode->i_mapping); |
2061 | |
2062 | nilfs_bmap_restore(ii->i_bmap, &shadow->bmap_store); |
2063 | |
2064 | @@ -638,10 +652,11 @@ void nilfs_mdt_clear_shadow_map(struct inode *inode) |
2065 | { |
2066 | struct nilfs_mdt_info *mi = NILFS_MDT(inode); |
2067 | struct nilfs_shadow_map *shadow = mi->mi_shadow; |
2068 | + struct inode *shadow_btnc_inode = NILFS_I(shadow->inode)->i_assoc_inode; |
2069 | |
2070 | down_write(&mi->mi_sem); |
2071 | nilfs_release_frozen_buffers(shadow); |
2072 | - truncate_inode_pages(&shadow->frozen_data, 0); |
2073 | - truncate_inode_pages(&shadow->frozen_btnodes, 0); |
2074 | + truncate_inode_pages(shadow->inode->i_mapping, 0); |
2075 | + truncate_inode_pages(shadow_btnc_inode->i_mapping, 0); |
2076 | up_write(&mi->mi_sem); |
2077 | } |
2078 | diff --git a/fs/nilfs2/mdt.h b/fs/nilfs2/mdt.h |
2079 | index e77aea4bb921c..9d8ac0d27c16e 100644 |
2080 | --- a/fs/nilfs2/mdt.h |
2081 | +++ b/fs/nilfs2/mdt.h |
2082 | @@ -18,14 +18,12 @@ |
2083 | /** |
2084 | * struct nilfs_shadow_map - shadow mapping of meta data file |
2085 | * @bmap_store: shadow copy of bmap state |
2086 | - * @frozen_data: shadowed dirty data pages |
2087 | - * @frozen_btnodes: shadowed dirty b-tree nodes' pages |
2088 | + * @inode: holder of page caches used in shadow mapping |
2089 | * @frozen_buffers: list of frozen buffers |
2090 | */ |
2091 | struct nilfs_shadow_map { |
2092 | struct nilfs_bmap_store bmap_store; |
2093 | - struct address_space frozen_data; |
2094 | - struct address_space frozen_btnodes; |
2095 | + struct inode *inode; |
2096 | struct list_head frozen_buffers; |
2097 | }; |
2098 | |
2099 | diff --git a/fs/nilfs2/nilfs.h b/fs/nilfs2/nilfs.h |
2100 | index 42395ba52da62..4895d978369a1 100644 |
2101 | --- a/fs/nilfs2/nilfs.h |
2102 | +++ b/fs/nilfs2/nilfs.h |
2103 | @@ -28,7 +28,7 @@ |
2104 | * @i_xattr: <TODO> |
2105 | * @i_dir_start_lookup: page index of last successful search |
2106 | * @i_cno: checkpoint number for GC inode |
2107 | - * @i_btnode_cache: cached pages of b-tree nodes |
2108 | + * @i_assoc_inode: associated inode (B-tree node cache holder or back pointer) |
2109 | * @i_dirty: list for connecting dirty files |
2110 | * @xattr_sem: semaphore for extended attributes processing |
2111 | * @i_bh: buffer contains disk inode |
2112 | @@ -43,7 +43,7 @@ struct nilfs_inode_info { |
2113 | __u64 i_xattr; /* sector_t ??? */ |
2114 | __u32 i_dir_start_lookup; |
2115 | __u64 i_cno; /* check point number for GC inode */ |
2116 | - struct address_space i_btnode_cache; |
2117 | + struct inode *i_assoc_inode; |
2118 | struct list_head i_dirty; /* List for connecting dirty files */ |
2119 | |
2120 | #ifdef CONFIG_NILFS_XATTR |
2121 | @@ -75,13 +75,6 @@ NILFS_BMAP_I(const struct nilfs_bmap *bmap) |
2122 | return container_of(bmap, struct nilfs_inode_info, i_bmap_data); |
2123 | } |
2124 | |
2125 | -static inline struct inode *NILFS_BTNC_I(struct address_space *btnc) |
2126 | -{ |
2127 | - struct nilfs_inode_info *ii = |
2128 | - container_of(btnc, struct nilfs_inode_info, i_btnode_cache); |
2129 | - return &ii->vfs_inode; |
2130 | -} |
2131 | - |
2132 | /* |
2133 | * Dynamic state flags of NILFS on-memory inode (i_state) |
2134 | */ |
2135 | @@ -98,6 +91,8 @@ enum { |
2136 | NILFS_I_INODE_SYNC, /* dsync is not allowed for inode */ |
2137 | NILFS_I_BMAP, /* has bmap and btnode_cache */ |
2138 | NILFS_I_GCINODE, /* inode for GC, on memory only */ |
2139 | + NILFS_I_BTNC, /* inode for btree node cache */ |
2140 | + NILFS_I_SHADOW, /* inode for shadowed page cache */ |
2141 | }; |
2142 | |
2143 | /* |
2144 | @@ -264,6 +259,9 @@ struct inode *nilfs_iget(struct super_block *sb, struct nilfs_root *root, |
2145 | unsigned long ino); |
2146 | extern struct inode *nilfs_iget_for_gc(struct super_block *sb, |
2147 | unsigned long ino, __u64 cno); |
2148 | +int nilfs_attach_btree_node_cache(struct inode *inode); |
2149 | +void nilfs_detach_btree_node_cache(struct inode *inode); |
2150 | +struct inode *nilfs_iget_for_shadow(struct inode *inode); |
2151 | extern void nilfs_update_inode(struct inode *, struct buffer_head *, int); |
2152 | extern void nilfs_truncate(struct inode *); |
2153 | extern void nilfs_evict_inode(struct inode *); |
2154 | diff --git a/fs/nilfs2/page.c b/fs/nilfs2/page.c |
2155 | index d7fc8d369d89e..98d21ad9a073f 100644 |
2156 | --- a/fs/nilfs2/page.c |
2157 | +++ b/fs/nilfs2/page.c |
2158 | @@ -450,10 +450,9 @@ void nilfs_mapping_init(struct address_space *mapping, struct inode *inode) |
2159 | /* |
2160 | * NILFS2 needs clear_page_dirty() in the following two cases: |
2161 | * |
2162 | - * 1) For B-tree node pages and data pages of the dat/gcdat, NILFS2 clears |
2163 | - * page dirty flags when it copies back pages from the shadow cache |
2164 | - * (gcdat->{i_mapping,i_btnode_cache}) to its original cache |
2165 | - * (dat->{i_mapping,i_btnode_cache}). |
2166 | + * 1) For B-tree node pages and data pages of DAT file, NILFS2 clears dirty |
2167 | + * flag of pages when it copies back pages from shadow cache to the |
2168 | + * original cache. |
2169 | * |
2170 | * 2) Some B-tree operations like insertion or deletion may dispose buffers |
2171 | * in dirty state, and this needs to cancel the dirty state of their pages. |
2172 | diff --git a/fs/nilfs2/segment.c b/fs/nilfs2/segment.c |
2173 | index 91b58c897f92d..eb3ac76190887 100644 |
2174 | --- a/fs/nilfs2/segment.c |
2175 | +++ b/fs/nilfs2/segment.c |
2176 | @@ -738,15 +738,18 @@ static void nilfs_lookup_dirty_node_buffers(struct inode *inode, |
2177 | struct list_head *listp) |
2178 | { |
2179 | struct nilfs_inode_info *ii = NILFS_I(inode); |
2180 | - struct address_space *mapping = &ii->i_btnode_cache; |
2181 | + struct inode *btnc_inode = ii->i_assoc_inode; |
2182 | struct pagevec pvec; |
2183 | struct buffer_head *bh, *head; |
2184 | unsigned int i; |
2185 | pgoff_t index = 0; |
2186 | |
2187 | + if (!btnc_inode) |
2188 | + return; |
2189 | + |
2190 | pagevec_init(&pvec); |
2191 | |
2192 | - while (pagevec_lookup_tag(&pvec, mapping, &index, |
2193 | + while (pagevec_lookup_tag(&pvec, btnc_inode->i_mapping, &index, |
2194 | PAGECACHE_TAG_DIRTY)) { |
2195 | for (i = 0; i < pagevec_count(&pvec); i++) { |
2196 | bh = head = page_buffers(pvec.pages[i]); |
2197 | @@ -2410,7 +2413,7 @@ nilfs_remove_written_gcinodes(struct the_nilfs *nilfs, struct list_head *head) |
2198 | continue; |
2199 | list_del_init(&ii->i_dirty); |
2200 | truncate_inode_pages(&ii->vfs_inode.i_data, 0); |
2201 | - nilfs_btnode_cache_clear(&ii->i_btnode_cache); |
2202 | + nilfs_btnode_cache_clear(ii->i_assoc_inode->i_mapping); |
2203 | iput(&ii->vfs_inode); |
2204 | } |
2205 | } |
2206 | diff --git a/fs/nilfs2/super.c b/fs/nilfs2/super.c |
2207 | index 5729ee86da9ae..b5bc9f0c6a406 100644 |
2208 | --- a/fs/nilfs2/super.c |
2209 | +++ b/fs/nilfs2/super.c |
2210 | @@ -151,7 +151,8 @@ struct inode *nilfs_alloc_inode(struct super_block *sb) |
2211 | ii->i_bh = NULL; |
2212 | ii->i_state = 0; |
2213 | ii->i_cno = 0; |
2214 | - nilfs_mapping_init(&ii->i_btnode_cache, &ii->vfs_inode); |
2215 | + ii->i_assoc_inode = NULL; |
2216 | + ii->i_bmap = &ii->i_bmap_data; |
2217 | return &ii->vfs_inode; |
2218 | } |
2219 | |
2220 | @@ -1375,8 +1376,6 @@ static void nilfs_inode_init_once(void *obj) |
2221 | #ifdef CONFIG_NILFS_XATTR |
2222 | init_rwsem(&ii->xattr_sem); |
2223 | #endif |
2224 | - address_space_init_once(&ii->i_btnode_cache); |
2225 | - ii->i_bmap = &ii->i_bmap_data; |
2226 | inode_init_once(&ii->vfs_inode); |
2227 | } |
2228 | |
2229 | diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h |
2230 | index 8cc766743270f..308c2d8cdca19 100644 |
2231 | --- a/include/linux/blkdev.h |
2232 | +++ b/include/linux/blkdev.h |
2233 | @@ -1409,6 +1409,22 @@ static inline int queue_limit_discard_alignment(struct queue_limits *lim, sector |
2234 | return offset << SECTOR_SHIFT; |
2235 | } |
2236 | |
2237 | +/* |
2238 | + * Two cases of handling DISCARD merge: |
2239 | + * If max_discard_segments > 1, the driver takes every bio |
2240 | + * as a range and send them to controller together. The ranges |
2241 | + * needn't to be contiguous. |
2242 | + * Otherwise, the bios/requests will be handled as same as |
2243 | + * others which should be contiguous. |
2244 | + */ |
2245 | +static inline bool blk_discard_mergable(struct request *req) |
2246 | +{ |
2247 | + if (req_op(req) == REQ_OP_DISCARD && |
2248 | + queue_max_discard_segments(req->q) > 1) |
2249 | + return true; |
2250 | + return false; |
2251 | +} |
2252 | + |
2253 | static inline int bdev_discard_alignment(struct block_device *bdev) |
2254 | { |
2255 | struct request_queue *q = bdev_get_queue(bdev); |
2256 | diff --git a/include/linux/dma-mapping.h b/include/linux/dma-mapping.h |
2257 | index da90f20e11c1c..4d450672b7d66 100644 |
2258 | --- a/include/linux/dma-mapping.h |
2259 | +++ b/include/linux/dma-mapping.h |
2260 | @@ -70,14 +70,6 @@ |
2261 | */ |
2262 | #define DMA_ATTR_PRIVILEGED (1UL << 9) |
2263 | |
2264 | -/* |
2265 | - * This is a hint to the DMA-mapping subsystem that the device is expected |
2266 | - * to overwrite the entire mapped size, thus the caller does not require any |
2267 | - * of the previous buffer contents to be preserved. This allows |
2268 | - * bounce-buffering implementations to optimise DMA_FROM_DEVICE transfers. |
2269 | - */ |
2270 | -#define DMA_ATTR_OVERWRITE (1UL << 10) |
2271 | - |
2272 | /* |
2273 | * A dma_addr_t can hold any valid DMA or bus address for the platform. |
2274 | * It can be given to a device to use as a DMA source or target. A CPU cannot |
2275 | diff --git a/include/linux/mc146818rtc.h b/include/linux/mc146818rtc.h |
2276 | index 0661af17a7584..1e02058113944 100644 |
2277 | --- a/include/linux/mc146818rtc.h |
2278 | +++ b/include/linux/mc146818rtc.h |
2279 | @@ -86,6 +86,8 @@ struct cmos_rtc_board_info { |
2280 | /* 2 values for divider stage reset, others for "testing purposes only" */ |
2281 | # define RTC_DIV_RESET1 0x60 |
2282 | # define RTC_DIV_RESET2 0x70 |
2283 | + /* In AMD BKDG bit 5 and 6 are reserved, bit 4 is for select dv0 bank */ |
2284 | +# define RTC_AMD_BANK_SELECT 0x10 |
2285 | /* Periodic intr. / Square wave rate select. 0=none, 1=32.8kHz,... 15=2Hz */ |
2286 | # define RTC_RATE_SELECT 0x0F |
2287 | |
2288 | diff --git a/include/linux/stmmac.h b/include/linux/stmmac.h |
2289 | index dc60d03c4b606..0b35747c9837a 100644 |
2290 | --- a/include/linux/stmmac.h |
2291 | +++ b/include/linux/stmmac.h |
2292 | @@ -179,5 +179,6 @@ struct plat_stmmacenet_data { |
2293 | int mac_port_sel_speed; |
2294 | bool en_tx_lpi_clockgating; |
2295 | int has_xgmac; |
2296 | + bool sph_disable; |
2297 | }; |
2298 | #endif |
2299 | diff --git a/include/linux/sunrpc/xprtsock.h b/include/linux/sunrpc/xprtsock.h |
2300 | index a940de03808dd..46deca97e806d 100644 |
2301 | --- a/include/linux/sunrpc/xprtsock.h |
2302 | +++ b/include/linux/sunrpc/xprtsock.h |
2303 | @@ -90,6 +90,7 @@ struct sock_xprt { |
2304 | #define XPRT_SOCK_WAKE_WRITE (5) |
2305 | #define XPRT_SOCK_WAKE_PENDING (6) |
2306 | #define XPRT_SOCK_WAKE_DISCONNECT (7) |
2307 | +#define XPRT_SOCK_CONNECT_SENT (8) |
2308 | |
2309 | #endif /* __KERNEL__ */ |
2310 | |
2311 | diff --git a/include/uapi/linux/dma-buf.h b/include/uapi/linux/dma-buf.h |
2312 | index 7f30393b92c3b..f76d11725c6c6 100644 |
2313 | --- a/include/uapi/linux/dma-buf.h |
2314 | +++ b/include/uapi/linux/dma-buf.h |
2315 | @@ -44,7 +44,7 @@ struct dma_buf_sync { |
2316 | * between them in actual uapi, they're just different numbers. |
2317 | */ |
2318 | #define DMA_BUF_SET_NAME _IOW(DMA_BUF_BASE, 1, const char *) |
2319 | -#define DMA_BUF_SET_NAME_A _IOW(DMA_BUF_BASE, 1, u32) |
2320 | -#define DMA_BUF_SET_NAME_B _IOW(DMA_BUF_BASE, 1, u64) |
2321 | +#define DMA_BUF_SET_NAME_A _IOW(DMA_BUF_BASE, 1, __u32) |
2322 | +#define DMA_BUF_SET_NAME_B _IOW(DMA_BUF_BASE, 1, __u64) |
2323 | |
2324 | #endif |
2325 | diff --git a/kernel/dma/swiotlb.c b/kernel/dma/swiotlb.c |
2326 | index f17b771856d1c..913cb71198af4 100644 |
2327 | --- a/kernel/dma/swiotlb.c |
2328 | +++ b/kernel/dma/swiotlb.c |
2329 | @@ -571,11 +571,14 @@ found: |
2330 | */ |
2331 | for (i = 0; i < nslots; i++) |
2332 | io_tlb_orig_addr[index+i] = orig_addr + (i << IO_TLB_SHIFT); |
2333 | - if (!(attrs & DMA_ATTR_SKIP_CPU_SYNC) && |
2334 | - (!(attrs & DMA_ATTR_OVERWRITE) || dir == DMA_TO_DEVICE || |
2335 | - dir == DMA_BIDIRECTIONAL)) |
2336 | - swiotlb_bounce(orig_addr, tlb_addr, mapping_size, DMA_TO_DEVICE); |
2337 | - |
2338 | + /* |
2339 | + * When dir == DMA_FROM_DEVICE we could omit the copy from the orig |
2340 | + * to the tlb buffer, if we knew for sure the device will |
2341 | + * overwirte the entire current content. But we don't. Thus |
2342 | + * unconditional bounce may prevent leaking swiotlb content (i.e. |
2343 | + * kernel memory) to user-space. |
2344 | + */ |
2345 | + swiotlb_bounce(orig_addr, tlb_addr, mapping_size, DMA_TO_DEVICE); |
2346 | return tlb_addr; |
2347 | } |
2348 | |
2349 | diff --git a/kernel/events/core.c b/kernel/events/core.c |
2350 | index 52f4a9e467040..8336dcb2bd432 100644 |
2351 | --- a/kernel/events/core.c |
2352 | +++ b/kernel/events/core.c |
2353 | @@ -11114,6 +11114,9 @@ SYSCALL_DEFINE5(perf_event_open, |
2354 | * Do not allow to attach to a group in a different task |
2355 | * or CPU context. If we're moving SW events, we'll fix |
2356 | * this up later, so allow that. |
2357 | + * |
2358 | + * Racy, not holding group_leader->ctx->mutex, see comment with |
2359 | + * perf_event_ctx_lock(). |
2360 | */ |
2361 | if (!move_group && group_leader->ctx != ctx) |
2362 | goto err_context; |
2363 | @@ -11181,6 +11184,7 @@ SYSCALL_DEFINE5(perf_event_open, |
2364 | } else { |
2365 | perf_event_ctx_unlock(group_leader, gctx); |
2366 | move_group = 0; |
2367 | + goto not_move_group; |
2368 | } |
2369 | } |
2370 | |
2371 | @@ -11197,7 +11201,17 @@ SYSCALL_DEFINE5(perf_event_open, |
2372 | } |
2373 | } else { |
2374 | mutex_lock(&ctx->mutex); |
2375 | + |
2376 | + /* |
2377 | + * Now that we hold ctx->lock, (re)validate group_leader->ctx == ctx, |
2378 | + * see the group_leader && !move_group test earlier. |
2379 | + */ |
2380 | + if (group_leader && group_leader->ctx != ctx) { |
2381 | + err = -EINVAL; |
2382 | + goto err_locked; |
2383 | + } |
2384 | } |
2385 | +not_move_group: |
2386 | |
2387 | if (ctx->task == TASK_TOMBSTONE) { |
2388 | err = -ESRCH; |
2389 | diff --git a/net/bridge/br_input.c b/net/bridge/br_input.c |
2390 | index 09b1dd8cd8536..464f6a619444d 100644 |
2391 | --- a/net/bridge/br_input.c |
2392 | +++ b/net/bridge/br_input.c |
2393 | @@ -42,6 +42,13 @@ static int br_pass_frame_up(struct sk_buff *skb) |
2394 | u64_stats_update_end(&brstats->syncp); |
2395 | |
2396 | vg = br_vlan_group_rcu(br); |
2397 | + |
2398 | + /* Reset the offload_fwd_mark because there could be a stacked |
2399 | + * bridge above, and it should not think this bridge it doing |
2400 | + * that bridge's work forwarding out its ports. |
2401 | + */ |
2402 | + br_switchdev_frame_unmark(skb); |
2403 | + |
2404 | /* Bridge is just like any other port. Make sure the |
2405 | * packet is allowed except in promisc modue when someone |
2406 | * may be running packet capture. |
2407 | diff --git a/net/key/af_key.c b/net/key/af_key.c |
2408 | index 2ac9560020f91..f67d3ba72c496 100644 |
2409 | --- a/net/key/af_key.c |
2410 | +++ b/net/key/af_key.c |
2411 | @@ -2830,8 +2830,10 @@ static int pfkey_process(struct sock *sk, struct sk_buff *skb, const struct sadb |
2412 | void *ext_hdrs[SADB_EXT_MAX]; |
2413 | int err; |
2414 | |
2415 | - pfkey_broadcast(skb_clone(skb, GFP_KERNEL), GFP_KERNEL, |
2416 | - BROADCAST_PROMISC_ONLY, NULL, sock_net(sk)); |
2417 | + err = pfkey_broadcast(skb_clone(skb, GFP_KERNEL), GFP_KERNEL, |
2418 | + BROADCAST_PROMISC_ONLY, NULL, sock_net(sk)); |
2419 | + if (err) |
2420 | + return err; |
2421 | |
2422 | memset(ext_hdrs, 0, sizeof(ext_hdrs)); |
2423 | err = parse_exthdrs(skb, hdr, ext_hdrs); |
2424 | diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c |
2425 | index ab91683d94596..99d5f8b58e92e 100644 |
2426 | --- a/net/mac80211/rx.c |
2427 | +++ b/net/mac80211/rx.c |
2428 | @@ -1400,8 +1400,7 @@ static void ieee80211_rx_reorder_ampdu(struct ieee80211_rx_data *rx, |
2429 | goto dont_reorder; |
2430 | |
2431 | /* not part of a BA session */ |
2432 | - if (ack_policy != IEEE80211_QOS_CTL_ACK_POLICY_BLOCKACK && |
2433 | - ack_policy != IEEE80211_QOS_CTL_ACK_POLICY_NORMAL) |
2434 | + if (ack_policy == IEEE80211_QOS_CTL_ACK_POLICY_NOACK) |
2435 | goto dont_reorder; |
2436 | |
2437 | /* new, potentially un-ordered, ampdu frame - process it */ |
2438 | diff --git a/net/nfc/nci/data.c b/net/nfc/nci/data.c |
2439 | index ce3382be937ff..b002e18f38c81 100644 |
2440 | --- a/net/nfc/nci/data.c |
2441 | +++ b/net/nfc/nci/data.c |
2442 | @@ -118,7 +118,7 @@ static int nci_queue_tx_data_frags(struct nci_dev *ndev, |
2443 | |
2444 | skb_frag = nci_skb_alloc(ndev, |
2445 | (NCI_DATA_HDR_SIZE + frag_len), |
2446 | - GFP_KERNEL); |
2447 | + GFP_ATOMIC); |
2448 | if (skb_frag == NULL) { |
2449 | rc = -ENOMEM; |
2450 | goto free_exit; |
2451 | diff --git a/net/nfc/nci/hci.c b/net/nfc/nci/hci.c |
2452 | index 04e55ccb33836..4fe336ff2bfa1 100644 |
2453 | --- a/net/nfc/nci/hci.c |
2454 | +++ b/net/nfc/nci/hci.c |
2455 | @@ -153,7 +153,7 @@ static int nci_hci_send_data(struct nci_dev *ndev, u8 pipe, |
2456 | |
2457 | i = 0; |
2458 | skb = nci_skb_alloc(ndev, conn_info->max_pkt_payload_len + |
2459 | - NCI_DATA_HDR_SIZE, GFP_KERNEL); |
2460 | + NCI_DATA_HDR_SIZE, GFP_ATOMIC); |
2461 | if (!skb) |
2462 | return -ENOMEM; |
2463 | |
2464 | @@ -186,7 +186,7 @@ static int nci_hci_send_data(struct nci_dev *ndev, u8 pipe, |
2465 | if (i < data_len) { |
2466 | skb = nci_skb_alloc(ndev, |
2467 | conn_info->max_pkt_payload_len + |
2468 | - NCI_DATA_HDR_SIZE, GFP_KERNEL); |
2469 | + NCI_DATA_HDR_SIZE, GFP_ATOMIC); |
2470 | if (!skb) |
2471 | return -ENOMEM; |
2472 | |
2473 | diff --git a/net/sched/act_pedit.c b/net/sched/act_pedit.c |
2474 | index 305cb190e9979..f095a0fb75c6d 100644 |
2475 | --- a/net/sched/act_pedit.c |
2476 | +++ b/net/sched/act_pedit.c |
2477 | @@ -231,6 +231,10 @@ static int tcf_pedit_init(struct net *net, struct nlattr *nla, |
2478 | for (i = 0; i < p->tcfp_nkeys; ++i) { |
2479 | u32 cur = p->tcfp_keys[i].off; |
2480 | |
2481 | + /* sanitize the shift value for any later use */ |
2482 | + p->tcfp_keys[i].shift = min_t(size_t, BITS_PER_TYPE(int) - 1, |
2483 | + p->tcfp_keys[i].shift); |
2484 | + |
2485 | /* The AT option can read a single byte, we can bound the actual |
2486 | * value with uchar max. |
2487 | */ |
2488 | diff --git a/net/sunrpc/xprt.c b/net/sunrpc/xprt.c |
2489 | index 8ac579778e487..94ae95c57f78a 100644 |
2490 | --- a/net/sunrpc/xprt.c |
2491 | +++ b/net/sunrpc/xprt.c |
2492 | @@ -717,21 +717,30 @@ void xprt_disconnect_done(struct rpc_xprt *xprt) |
2493 | EXPORT_SYMBOL_GPL(xprt_disconnect_done); |
2494 | |
2495 | /** |
2496 | - * xprt_force_disconnect - force a transport to disconnect |
2497 | + * xprt_schedule_autoclose_locked - Try to schedule an autoclose RPC call |
2498 | * @xprt: transport to disconnect |
2499 | - * |
2500 | */ |
2501 | -void xprt_force_disconnect(struct rpc_xprt *xprt) |
2502 | +static void xprt_schedule_autoclose_locked(struct rpc_xprt *xprt) |
2503 | { |
2504 | - /* Don't race with the test_bit() in xprt_clear_locked() */ |
2505 | - spin_lock(&xprt->transport_lock); |
2506 | - set_bit(XPRT_CLOSE_WAIT, &xprt->state); |
2507 | - /* Try to schedule an autoclose RPC call */ |
2508 | + if (test_and_set_bit(XPRT_CLOSE_WAIT, &xprt->state)) |
2509 | + return; |
2510 | if (test_and_set_bit(XPRT_LOCKED, &xprt->state) == 0) |
2511 | queue_work(xprtiod_workqueue, &xprt->task_cleanup); |
2512 | else if (xprt->snd_task && !test_bit(XPRT_SND_IS_COOKIE, &xprt->state)) |
2513 | rpc_wake_up_queued_task_set_status(&xprt->pending, |
2514 | xprt->snd_task, -ENOTCONN); |
2515 | +} |
2516 | + |
2517 | +/** |
2518 | + * xprt_force_disconnect - force a transport to disconnect |
2519 | + * @xprt: transport to disconnect |
2520 | + * |
2521 | + */ |
2522 | +void xprt_force_disconnect(struct rpc_xprt *xprt) |
2523 | +{ |
2524 | + /* Don't race with the test_bit() in xprt_clear_locked() */ |
2525 | + spin_lock(&xprt->transport_lock); |
2526 | + xprt_schedule_autoclose_locked(xprt); |
2527 | spin_unlock(&xprt->transport_lock); |
2528 | } |
2529 | EXPORT_SYMBOL_GPL(xprt_force_disconnect); |
2530 | @@ -771,11 +780,7 @@ void xprt_conditional_disconnect(struct rpc_xprt *xprt, unsigned int cookie) |
2531 | goto out; |
2532 | if (test_bit(XPRT_CLOSING, &xprt->state)) |
2533 | goto out; |
2534 | - set_bit(XPRT_CLOSE_WAIT, &xprt->state); |
2535 | - /* Try to schedule an autoclose RPC call */ |
2536 | - if (test_and_set_bit(XPRT_LOCKED, &xprt->state) == 0) |
2537 | - queue_work(xprtiod_workqueue, &xprt->task_cleanup); |
2538 | - xprt_wake_pending_tasks(xprt, -EAGAIN); |
2539 | + xprt_schedule_autoclose_locked(xprt); |
2540 | out: |
2541 | spin_unlock(&xprt->transport_lock); |
2542 | } |
2543 | @@ -863,10 +868,7 @@ void xprt_connect(struct rpc_task *task) |
2544 | if (!xprt_lock_write(xprt, task)) |
2545 | return; |
2546 | |
2547 | - if (test_and_clear_bit(XPRT_CLOSE_WAIT, &xprt->state)) |
2548 | - xprt->ops->close(xprt); |
2549 | - |
2550 | - if (!xprt_connected(xprt)) { |
2551 | + if (!xprt_connected(xprt) && !test_bit(XPRT_CLOSE_WAIT, &xprt->state)) { |
2552 | task->tk_rqstp->rq_connect_cookie = xprt->connect_cookie; |
2553 | rpc_sleep_on_timeout(&xprt->pending, task, NULL, |
2554 | xprt_request_timeout(task->tk_rqstp)); |
2555 | diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c |
2556 | index 43bc02dea80c8..81f0e03b71b6d 100644 |
2557 | --- a/net/sunrpc/xprtsock.c |
2558 | +++ b/net/sunrpc/xprtsock.c |
2559 | @@ -989,7 +989,7 @@ static int xs_local_send_request(struct rpc_rqst *req) |
2560 | |
2561 | /* Close the stream if the previous transmission was incomplete */ |
2562 | if (xs_send_request_was_aborted(transport, req)) { |
2563 | - xs_close(xprt); |
2564 | + xprt_force_disconnect(xprt); |
2565 | return -ENOTCONN; |
2566 | } |
2567 | |
2568 | @@ -1027,7 +1027,7 @@ static int xs_local_send_request(struct rpc_rqst *req) |
2569 | -status); |
2570 | /* fall through */ |
2571 | case -EPIPE: |
2572 | - xs_close(xprt); |
2573 | + xprt_force_disconnect(xprt); |
2574 | status = -ENOTCONN; |
2575 | } |
2576 | |
2577 | @@ -1303,6 +1303,16 @@ static void xs_reset_transport(struct sock_xprt *transport) |
2578 | |
2579 | if (sk == NULL) |
2580 | return; |
2581 | + /* |
2582 | + * Make sure we're calling this in a context from which it is safe |
2583 | + * to call __fput_sync(). In practice that means rpciod and the |
2584 | + * system workqueue. |
2585 | + */ |
2586 | + if (!(current->flags & PF_WQ_WORKER)) { |
2587 | + WARN_ON_ONCE(1); |
2588 | + set_bit(XPRT_CLOSE_WAIT, &xprt->state); |
2589 | + return; |
2590 | + } |
2591 | |
2592 | if (atomic_read(&transport->xprt.swapper)) |
2593 | sk_clear_memalloc(sk); |
2594 | @@ -1326,7 +1336,7 @@ static void xs_reset_transport(struct sock_xprt *transport) |
2595 | mutex_unlock(&transport->recv_mutex); |
2596 | |
2597 | trace_rpc_socket_close(xprt, sock); |
2598 | - fput(filp); |
2599 | + __fput_sync(filp); |
2600 | |
2601 | xprt_disconnect_done(xprt); |
2602 | } |
2603 | @@ -2384,10 +2394,14 @@ static void xs_tcp_setup_socket(struct work_struct *work) |
2604 | struct rpc_xprt *xprt = &transport->xprt; |
2605 | int status = -EIO; |
2606 | |
2607 | - if (!sock) { |
2608 | - sock = xs_create_sock(xprt, transport, |
2609 | - xs_addr(xprt)->sa_family, SOCK_STREAM, |
2610 | - IPPROTO_TCP, true); |
2611 | + if (xprt_connected(xprt)) |
2612 | + goto out; |
2613 | + if (test_and_clear_bit(XPRT_SOCK_CONNECT_SENT, |
2614 | + &transport->sock_state) || |
2615 | + !sock) { |
2616 | + xs_reset_transport(transport); |
2617 | + sock = xs_create_sock(xprt, transport, xs_addr(xprt)->sa_family, |
2618 | + SOCK_STREAM, IPPROTO_TCP, true); |
2619 | if (IS_ERR(sock)) { |
2620 | status = PTR_ERR(sock); |
2621 | goto out; |
2622 | @@ -2418,6 +2432,8 @@ static void xs_tcp_setup_socket(struct work_struct *work) |
2623 | break; |
2624 | case 0: |
2625 | case -EINPROGRESS: |
2626 | + set_bit(XPRT_SOCK_CONNECT_SENT, &transport->sock_state); |
2627 | + fallthrough; |
2628 | case -EALREADY: |
2629 | xprt_unlock_connect(xprt, transport); |
2630 | return; |
2631 | @@ -2471,11 +2487,7 @@ static void xs_connect(struct rpc_xprt *xprt, struct rpc_task *task) |
2632 | |
2633 | if (transport->sock != NULL) { |
2634 | dprintk("RPC: xs_connect delayed xprt %p for %lu " |
2635 | - "seconds\n", |
2636 | - xprt, xprt->reestablish_timeout / HZ); |
2637 | - |
2638 | - /* Start by resetting any existing state */ |
2639 | - xs_reset_transport(transport); |
2640 | + "seconds\n", xprt, xprt->reestablish_timeout / HZ); |
2641 | |
2642 | delay = xprt_reconnect_delay(xprt); |
2643 | xprt_reconnect_backoff(xprt, XS_TCP_INIT_REEST_TO); |
2644 | diff --git a/sound/isa/wavefront/wavefront_synth.c b/sound/isa/wavefront/wavefront_synth.c |
2645 | index d6420d224d097..09b368761cc00 100644 |
2646 | --- a/sound/isa/wavefront/wavefront_synth.c |
2647 | +++ b/sound/isa/wavefront/wavefront_synth.c |
2648 | @@ -1088,7 +1088,8 @@ wavefront_send_sample (snd_wavefront_t *dev, |
2649 | |
2650 | if (dataptr < data_end) { |
2651 | |
2652 | - __get_user (sample_short, dataptr); |
2653 | + if (get_user(sample_short, dataptr)) |
2654 | + return -EFAULT; |
2655 | dataptr += skip; |
2656 | |
2657 | if (data_is_unsigned) { /* GUS ? */ |
2658 | diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c |
2659 | index 851ea79da31cd..78b5a0f22a415 100644 |
2660 | --- a/sound/pci/hda/patch_realtek.c |
2661 | +++ b/sound/pci/hda/patch_realtek.c |
2662 | @@ -10233,6 +10233,7 @@ static const struct snd_pci_quirk alc662_fixup_tbl[] = { |
2663 | SND_PCI_QUIRK(0x144d, 0xc051, "Samsung R720", ALC662_FIXUP_IDEAPAD), |
2664 | SND_PCI_QUIRK(0x14cd, 0x5003, "USI", ALC662_FIXUP_USI_HEADSET_MODE), |
2665 | SND_PCI_QUIRK(0x17aa, 0x1036, "Lenovo P520", ALC662_FIXUP_LENOVO_MULTI_CODECS), |
2666 | + SND_PCI_QUIRK(0x17aa, 0x1057, "Lenovo P360", ALC897_FIXUP_HEADSET_MIC_PIN), |
2667 | SND_PCI_QUIRK(0x17aa, 0x32ca, "Lenovo ThinkCentre M80", ALC897_FIXUP_HEADSET_MIC_PIN), |
2668 | SND_PCI_QUIRK(0x17aa, 0x32cb, "Lenovo ThinkCentre M70", ALC897_FIXUP_HEADSET_MIC_PIN), |
2669 | SND_PCI_QUIRK(0x17aa, 0x32cf, "Lenovo ThinkCentre M950", ALC897_FIXUP_HEADSET_MIC_PIN), |
2670 | diff --git a/tools/objtool/check.c b/tools/objtool/check.c |
2671 | index 06aaf04e629c2..bae6b261481db 100644 |
2672 | --- a/tools/objtool/check.c |
2673 | +++ b/tools/objtool/check.c |
2674 | @@ -144,6 +144,7 @@ static bool __dead_end_function(struct objtool_file *file, struct symbol *func, |
2675 | "usercopy_abort", |
2676 | "machine_real_restart", |
2677 | "rewind_stack_do_exit", |
2678 | + "cpu_bringup_and_idle", |
2679 | }; |
2680 | |
2681 | if (!func) |
2682 | diff --git a/tools/perf/bench/numa.c b/tools/perf/bench/numa.c |
2683 | index 5797253b97005..69d62e57a0c36 100644 |
2684 | --- a/tools/perf/bench/numa.c |
2685 | +++ b/tools/perf/bench/numa.c |
2686 | @@ -1630,7 +1630,7 @@ static int __bench_numa(const char *name) |
2687 | "GB/sec,", "total-speed", "GB/sec total speed"); |
2688 | |
2689 | if (g->p.show_details >= 2) { |
2690 | - char tname[14 + 2 * 10 + 1]; |
2691 | + char tname[14 + 2 * 11 + 1]; |
2692 | struct thread_data *td; |
2693 | for (p = 0; p < g->p.nr_proc; p++) { |
2694 | for (t = 0; t < g->p.nr_threads; t++) { |
2695 | diff --git a/tools/testing/selftests/net/fcnal-test.sh b/tools/testing/selftests/net/fcnal-test.sh |
2696 | index 157822331954d..d2ac09b35dcf5 100755 |
2697 | --- a/tools/testing/selftests/net/fcnal-test.sh |
2698 | +++ b/tools/testing/selftests/net/fcnal-test.sh |
2699 | @@ -757,10 +757,16 @@ ipv4_ping() |
2700 | setup |
2701 | set_sysctl net.ipv4.raw_l3mdev_accept=1 2>/dev/null |
2702 | ipv4_ping_novrf |
2703 | + setup |
2704 | + set_sysctl net.ipv4.ping_group_range='0 2147483647' 2>/dev/null |
2705 | + ipv4_ping_novrf |
2706 | |
2707 | log_subsection "With VRF" |
2708 | setup "yes" |
2709 | ipv4_ping_vrf |
2710 | + setup "yes" |
2711 | + set_sysctl net.ipv4.ping_group_range='0 2147483647' 2>/dev/null |
2712 | + ipv4_ping_vrf |
2713 | } |
2714 | |
2715 | ################################################################################ |
2716 | @@ -2005,10 +2011,16 @@ ipv6_ping() |
2717 | log_subsection "No VRF" |
2718 | setup |
2719 | ipv6_ping_novrf |
2720 | + setup |
2721 | + set_sysctl net.ipv4.ping_group_range='0 2147483647' 2>/dev/null |
2722 | + ipv6_ping_novrf |
2723 | |
2724 | log_subsection "With VRF" |
2725 | setup "yes" |
2726 | ipv6_ping_vrf |
2727 | + setup "yes" |
2728 | + set_sysctl net.ipv4.ping_group_range='0 2147483647' 2>/dev/null |
2729 | + ipv6_ping_vrf |
2730 | } |
2731 | |
2732 | ################################################################################ |