Contents of /trunk/kernel-alx/patches-5.4/0315-5.4.216-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: 32636 byte(s)
Mon Oct 24 12:40:44 2022 UTC (23 months ago) by niro
File size: 32636 byte(s)
-add missing
1 | diff --git a/Makefile b/Makefile |
2 | index 0c501d2c6a3b0..3d9d7ef6f8bf1 100644 |
3 | --- a/Makefile |
4 | +++ b/Makefile |
5 | @@ -1,7 +1,7 @@ |
6 | # SPDX-License-Identifier: GPL-2.0 |
7 | VERSION = 5 |
8 | PATCHLEVEL = 4 |
9 | -SUBLEVEL = 215 |
10 | +SUBLEVEL = 216 |
11 | EXTRAVERSION = |
12 | NAME = Kleptomaniac Octopus |
13 | |
14 | diff --git a/arch/arm/boot/dts/am335x-baltos.dtsi b/arch/arm/boot/dts/am335x-baltos.dtsi |
15 | index ed235f263e293..ee84155844adb 100644 |
16 | --- a/arch/arm/boot/dts/am335x-baltos.dtsi |
17 | +++ b/arch/arm/boot/dts/am335x-baltos.dtsi |
18 | @@ -381,7 +381,7 @@ |
19 | &mmc2 { |
20 | status = "okay"; |
21 | vmmc-supply = <&wl12xx_vmmc>; |
22 | - ti,non-removable; |
23 | + non-removable; |
24 | bus-width = <4>; |
25 | cap-power-off-card; |
26 | pinctrl-names = "default"; |
27 | diff --git a/arch/arm/boot/dts/am335x-boneblack-common.dtsi b/arch/arm/boot/dts/am335x-boneblack-common.dtsi |
28 | index 91f93bc89716d..dd932220a8bf7 100644 |
29 | --- a/arch/arm/boot/dts/am335x-boneblack-common.dtsi |
30 | +++ b/arch/arm/boot/dts/am335x-boneblack-common.dtsi |
31 | @@ -22,6 +22,7 @@ |
32 | pinctrl-0 = <&emmc_pins>; |
33 | bus-width = <8>; |
34 | status = "okay"; |
35 | + non-removable; |
36 | }; |
37 | |
38 | &am33xx_pinmux { |
39 | diff --git a/arch/arm/boot/dts/am335x-boneblack-wireless.dts b/arch/arm/boot/dts/am335x-boneblack-wireless.dts |
40 | index 3124d94c0b3cc..e07dd79795868 100644 |
41 | --- a/arch/arm/boot/dts/am335x-boneblack-wireless.dts |
42 | +++ b/arch/arm/boot/dts/am335x-boneblack-wireless.dts |
43 | @@ -75,7 +75,6 @@ |
44 | bus-width = <4>; |
45 | non-removable; |
46 | cap-power-off-card; |
47 | - ti,needs-special-hs-handling; |
48 | keep-power-in-suspend; |
49 | pinctrl-names = "default"; |
50 | pinctrl-0 = <&mmc3_pins &wl18xx_pins>; |
51 | diff --git a/arch/arm/boot/dts/am335x-boneblue.dts b/arch/arm/boot/dts/am335x-boneblue.dts |
52 | index 2f6652ef9a157..30b62de86b5b1 100644 |
53 | --- a/arch/arm/boot/dts/am335x-boneblue.dts |
54 | +++ b/arch/arm/boot/dts/am335x-boneblue.dts |
55 | @@ -389,7 +389,6 @@ |
56 | bus-width = <4>; |
57 | non-removable; |
58 | cap-power-off-card; |
59 | - ti,needs-special-hs-handling; |
60 | keep-power-in-suspend; |
61 | pinctrl-names = "default"; |
62 | pinctrl-0 = <&mmc3_pins &wl18xx_pins>; |
63 | diff --git a/arch/arm/boot/dts/am335x-bonegreen-wireless.dts b/arch/arm/boot/dts/am335x-bonegreen-wireless.dts |
64 | index 4092cd193b8a6..609c8db687ec6 100644 |
65 | --- a/arch/arm/boot/dts/am335x-bonegreen-wireless.dts |
66 | +++ b/arch/arm/boot/dts/am335x-bonegreen-wireless.dts |
67 | @@ -75,7 +75,6 @@ |
68 | bus-width = <4>; |
69 | non-removable; |
70 | cap-power-off-card; |
71 | - ti,needs-special-hs-handling; |
72 | keep-power-in-suspend; |
73 | pinctrl-names = "default"; |
74 | pinctrl-0 = <&mmc3_pins &wl18xx_pins>; |
75 | diff --git a/arch/arm/boot/dts/am335x-evm.dts b/arch/arm/boot/dts/am335x-evm.dts |
76 | index a00145705c9be..af25b42e85f4d 100644 |
77 | --- a/arch/arm/boot/dts/am335x-evm.dts |
78 | +++ b/arch/arm/boot/dts/am335x-evm.dts |
79 | @@ -782,8 +782,7 @@ |
80 | bus-width = <4>; |
81 | pinctrl-names = "default"; |
82 | pinctrl-0 = <&mmc3_pins &wlan_pins>; |
83 | - ti,non-removable; |
84 | - ti,needs-special-hs-handling; |
85 | + non-removable; |
86 | cap-power-off-card; |
87 | keep-power-in-suspend; |
88 | |
89 | diff --git a/arch/arm/boot/dts/am335x-evmsk.dts b/arch/arm/boot/dts/am335x-evmsk.dts |
90 | index e28a5b82fdf30..7805b0618a4fb 100644 |
91 | --- a/arch/arm/boot/dts/am335x-evmsk.dts |
92 | +++ b/arch/arm/boot/dts/am335x-evmsk.dts |
93 | @@ -700,7 +700,7 @@ |
94 | &mmc2 { |
95 | status = "okay"; |
96 | vmmc-supply = <&wl12xx_vmmc>; |
97 | - ti,non-removable; |
98 | + non-removable; |
99 | bus-width = <4>; |
100 | cap-power-off-card; |
101 | keep-power-in-suspend; |
102 | diff --git a/arch/arm/boot/dts/am335x-lxm.dts b/arch/arm/boot/dts/am335x-lxm.dts |
103 | index a8005e975ea24..c3bfd8ed5f884 100644 |
104 | --- a/arch/arm/boot/dts/am335x-lxm.dts |
105 | +++ b/arch/arm/boot/dts/am335x-lxm.dts |
106 | @@ -361,7 +361,7 @@ |
107 | pinctrl-0 = <&emmc_pins>; |
108 | vmmc-supply = <&vmmcsd_fixed>; |
109 | bus-width = <8>; |
110 | - ti,non-removable; |
111 | + non-removable; |
112 | status = "okay"; |
113 | }; |
114 | |
115 | diff --git a/arch/arm/boot/dts/am335x-moxa-uc-2100-common.dtsi b/arch/arm/boot/dts/am335x-moxa-uc-2100-common.dtsi |
116 | index 671d4a5da9c43..7749122dad71d 100644 |
117 | --- a/arch/arm/boot/dts/am335x-moxa-uc-2100-common.dtsi |
118 | +++ b/arch/arm/boot/dts/am335x-moxa-uc-2100-common.dtsi |
119 | @@ -176,7 +176,7 @@ |
120 | vmmc-supply = <&vmmcsd_fixed>; |
121 | bus-width = <8>; |
122 | pinctrl-0 = <&mmc1_pins_default>; |
123 | - ti,non-removable; |
124 | + non-removable; |
125 | status = "okay"; |
126 | }; |
127 | |
128 | diff --git a/arch/arm/boot/dts/am335x-moxa-uc-8100-me-t.dts b/arch/arm/boot/dts/am335x-moxa-uc-8100-me-t.dts |
129 | index 783d411f2cefe..66a5c09ff388a 100644 |
130 | --- a/arch/arm/boot/dts/am335x-moxa-uc-8100-me-t.dts |
131 | +++ b/arch/arm/boot/dts/am335x-moxa-uc-8100-me-t.dts |
132 | @@ -473,7 +473,7 @@ |
133 | vmmc-supply = <&vmmcsd_fixed>; |
134 | bus-width = <8>; |
135 | pinctrl-0 = <&mmc2_pins_default>; |
136 | - ti,non-removable; |
137 | + non-removable; |
138 | status = "okay"; |
139 | }; |
140 | |
141 | diff --git a/arch/arm/boot/dts/am335x-pepper.dts b/arch/arm/boot/dts/am335x-pepper.dts |
142 | index e7764ecdf65f8..03852eff2b3ce 100644 |
143 | --- a/arch/arm/boot/dts/am335x-pepper.dts |
144 | +++ b/arch/arm/boot/dts/am335x-pepper.dts |
145 | @@ -341,7 +341,7 @@ |
146 | pinctrl-0 = <&emmc_pins>; |
147 | vmmc-supply = <&ldo3_reg>; |
148 | bus-width = <8>; |
149 | - ti,non-removable; |
150 | + non-removable; |
151 | }; |
152 | |
153 | &mmc3 { |
154 | @@ -351,7 +351,7 @@ |
155 | pinctrl-0 = <&wireless_pins>; |
156 | vmmmc-supply = <&v3v3c_reg>; |
157 | bus-width = <4>; |
158 | - ti,non-removable; |
159 | + non-removable; |
160 | dmas = <&edma_xbar 12 0 1 |
161 | &edma_xbar 13 0 2>; |
162 | dma-names = "tx", "rx"; |
163 | diff --git a/arch/arm/boot/dts/am335x-phycore-som.dtsi b/arch/arm/boot/dts/am335x-phycore-som.dtsi |
164 | index 3d0672b53d779..7e46b4c027094 100644 |
165 | --- a/arch/arm/boot/dts/am335x-phycore-som.dtsi |
166 | +++ b/arch/arm/boot/dts/am335x-phycore-som.dtsi |
167 | @@ -69,7 +69,7 @@ |
168 | pinctrl-0 = <&emmc_pins>; |
169 | vmmc-supply = <&vmmc_reg>; |
170 | bus-width = <8>; |
171 | - ti,non-removable; |
172 | + non-removable; |
173 | status = "disabled"; |
174 | }; |
175 | |
176 | diff --git a/arch/arm/boot/dts/am33xx-l4.dtsi b/arch/arm/boot/dts/am33xx-l4.dtsi |
177 | index 7a9eb2b0d45b0..cacd564b4d28b 100644 |
178 | --- a/arch/arm/boot/dts/am33xx-l4.dtsi |
179 | +++ b/arch/arm/boot/dts/am33xx-l4.dtsi |
180 | @@ -1333,12 +1333,9 @@ |
181 | ranges = <0x0 0x60000 0x1000>; |
182 | |
183 | mmc1: mmc@0 { |
184 | - compatible = "ti,omap4-hsmmc"; |
185 | - ti,dual-volt; |
186 | + compatible = "ti,am335-sdhci"; |
187 | ti,needs-special-reset; |
188 | - ti,needs-special-hs-handling; |
189 | - dmas = <&edma_xbar 24 0 0 |
190 | - &edma_xbar 25 0 0>; |
191 | + dmas = <&edma 24 0>, <&edma 25 0>; |
192 | dma-names = "tx", "rx"; |
193 | interrupts = <64>; |
194 | reg = <0x0 0x1000>; |
195 | @@ -1827,7 +1824,7 @@ |
196 | ranges = <0x0 0xd8000 0x1000>; |
197 | |
198 | mmc2: mmc@0 { |
199 | - compatible = "ti,omap4-hsmmc"; |
200 | + compatible = "ti,am335-sdhci"; |
201 | ti,needs-special-reset; |
202 | dmas = <&edma 2 0 |
203 | &edma 3 0>; |
204 | diff --git a/arch/arm/boot/dts/am33xx.dtsi b/arch/arm/boot/dts/am33xx.dtsi |
205 | index 77fa7c0f21046..efe36f395bdd0 100644 |
206 | --- a/arch/arm/boot/dts/am33xx.dtsi |
207 | +++ b/arch/arm/boot/dts/am33xx.dtsi |
208 | @@ -259,10 +259,11 @@ |
209 | ranges = <0x0 0x47810000 0x1000>; |
210 | |
211 | mmc3: mmc@0 { |
212 | - compatible = "ti,omap4-hsmmc"; |
213 | + compatible = "ti,am335-sdhci"; |
214 | ti,needs-special-reset; |
215 | interrupts = <29>; |
216 | reg = <0x0 0x1000>; |
217 | + status = "disabled"; |
218 | }; |
219 | }; |
220 | |
221 | diff --git a/arch/arm/boot/dts/am4372.dtsi b/arch/arm/boot/dts/am4372.dtsi |
222 | index 14bbc438055fd..c5b67993743d6 100644 |
223 | --- a/arch/arm/boot/dts/am4372.dtsi |
224 | +++ b/arch/arm/boot/dts/am4372.dtsi |
225 | @@ -250,10 +250,11 @@ |
226 | ranges = <0x0 0x47810000 0x1000>; |
227 | |
228 | mmc3: mmc@0 { |
229 | - compatible = "ti,omap4-hsmmc"; |
230 | + compatible = "ti,am437-sdhci"; |
231 | ti,needs-special-reset; |
232 | interrupts = <GIC_SPI 29 IRQ_TYPE_LEVEL_HIGH>; |
233 | reg = <0x0 0x1000>; |
234 | + status = "disabled"; |
235 | }; |
236 | }; |
237 | |
238 | diff --git a/arch/arm/boot/dts/am437x-cm-t43.dts b/arch/arm/boot/dts/am437x-cm-t43.dts |
239 | index 063113a5da2d4..a6b4fca8626ac 100644 |
240 | --- a/arch/arm/boot/dts/am437x-cm-t43.dts |
241 | +++ b/arch/arm/boot/dts/am437x-cm-t43.dts |
242 | @@ -291,7 +291,7 @@ |
243 | pinctrl-0 = <&emmc_pins>; |
244 | vmmc-supply = <&vmmc_3v3>; |
245 | bus-width = <8>; |
246 | - ti,non-removable; |
247 | + non-removable; |
248 | }; |
249 | |
250 | &spi0 { |
251 | diff --git a/arch/arm/boot/dts/am437x-gp-evm.dts b/arch/arm/boot/dts/am437x-gp-evm.dts |
252 | index 126965a34841e..448853701d3d1 100644 |
253 | --- a/arch/arm/boot/dts/am437x-gp-evm.dts |
254 | +++ b/arch/arm/boot/dts/am437x-gp-evm.dts |
255 | @@ -872,7 +872,7 @@ |
256 | pinctrl-names = "default", "sleep"; |
257 | pinctrl-0 = <&emmc_pins_default>; |
258 | pinctrl-1 = <&emmc_pins_sleep>; |
259 | - ti,non-removable; |
260 | + non-removable; |
261 | }; |
262 | |
263 | &mmc3 { |
264 | @@ -889,7 +889,7 @@ |
265 | pinctrl-1 = <&mmc3_pins_sleep>; |
266 | cap-power-off-card; |
267 | keep-power-in-suspend; |
268 | - ti,non-removable; |
269 | + non-removable; |
270 | |
271 | #address-cells = <1>; |
272 | #size-cells = <0>; |
273 | diff --git a/arch/arm/boot/dts/am437x-l4.dtsi b/arch/arm/boot/dts/am437x-l4.dtsi |
274 | index 64fdd5079d49b..8c9e7e723fc97 100644 |
275 | --- a/arch/arm/boot/dts/am437x-l4.dtsi |
276 | +++ b/arch/arm/boot/dts/am437x-l4.dtsi |
277 | @@ -1104,9 +1104,8 @@ |
278 | ranges = <0x0 0x60000 0x1000>; |
279 | |
280 | mmc1: mmc@0 { |
281 | - compatible = "ti,omap4-hsmmc"; |
282 | + compatible = "ti,am437-sdhci"; |
283 | reg = <0x0 0x1000>; |
284 | - ti,dual-volt; |
285 | ti,needs-special-reset; |
286 | dmas = <&edma 24 0>, |
287 | <&edma 25 0>; |
288 | @@ -1641,7 +1640,7 @@ |
289 | ranges = <0x0 0xd8000 0x1000>; |
290 | |
291 | mmc2: mmc@0 { |
292 | - compatible = "ti,omap4-hsmmc"; |
293 | + compatible = "ti,am437-sdhci"; |
294 | reg = <0x0 0x1000>; |
295 | ti,needs-special-reset; |
296 | dmas = <&edma 2 0>, |
297 | diff --git a/arch/arm/boot/dts/am437x-sk-evm.dts b/arch/arm/boot/dts/am437x-sk-evm.dts |
298 | index 74eaa6a3b258c..292153c6cb5d3 100644 |
299 | --- a/arch/arm/boot/dts/am437x-sk-evm.dts |
300 | +++ b/arch/arm/boot/dts/am437x-sk-evm.dts |
301 | @@ -694,7 +694,7 @@ |
302 | pinctrl-1 = <&mmc3_pins_sleep>; |
303 | cap-power-off-card; |
304 | keep-power-in-suspend; |
305 | - ti,non-removable; |
306 | + non-removable; |
307 | |
308 | #address-cells = <1>; |
309 | #size-cells = <0>; |
310 | diff --git a/arch/arm/boot/dts/integratorap.dts b/arch/arm/boot/dts/integratorap.dts |
311 | index 94d2ff9836d00..e6c5a99e07416 100644 |
312 | --- a/arch/arm/boot/dts/integratorap.dts |
313 | +++ b/arch/arm/boot/dts/integratorap.dts |
314 | @@ -155,6 +155,7 @@ |
315 | |
316 | pci: pciv3@62000000 { |
317 | compatible = "arm,integrator-ap-pci", "v3,v360epc-pci"; |
318 | + device_type = "pci"; |
319 | #interrupt-cells = <1>; |
320 | #size-cells = <2>; |
321 | #address-cells = <3>; |
322 | diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c |
323 | index fc37e075f3e15..fbb1676aa33f1 100644 |
324 | --- a/drivers/ata/libata-core.c |
325 | +++ b/drivers/ata/libata-core.c |
326 | @@ -4542,6 +4542,10 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = { |
327 | { "PIONEER DVD-RW DVR-212D", NULL, ATA_HORKAGE_NOSETXFER }, |
328 | { "PIONEER DVD-RW DVR-216D", NULL, ATA_HORKAGE_NOSETXFER }, |
329 | |
330 | + /* These specific Pioneer models have LPM issues */ |
331 | + { "PIONEER BD-RW BDR-207M", NULL, ATA_HORKAGE_NOLPM }, |
332 | + { "PIONEER BD-RW BDR-205", NULL, ATA_HORKAGE_NOLPM }, |
333 | + |
334 | /* Crucial BX100 SSD 500GB has broken LPM support */ |
335 | { "CT500BX100SSD1", NULL, ATA_HORKAGE_NOLPM }, |
336 | |
337 | diff --git a/drivers/clk/bcm/clk-iproc-pll.c b/drivers/clk/bcm/clk-iproc-pll.c |
338 | index 274441e2ddb28..8f0619f362e3b 100644 |
339 | --- a/drivers/clk/bcm/clk-iproc-pll.c |
340 | +++ b/drivers/clk/bcm/clk-iproc-pll.c |
341 | @@ -736,6 +736,7 @@ void iproc_pll_clk_setup(struct device_node *node, |
342 | const char *parent_name; |
343 | struct iproc_clk *iclk_array; |
344 | struct clk_hw_onecell_data *clk_data; |
345 | + const char *clk_name; |
346 | |
347 | if (WARN_ON(!pll_ctrl) || WARN_ON(!clk_ctrl)) |
348 | return; |
349 | @@ -783,7 +784,12 @@ void iproc_pll_clk_setup(struct device_node *node, |
350 | iclk = &iclk_array[0]; |
351 | iclk->pll = pll; |
352 | |
353 | - init.name = node->name; |
354 | + ret = of_property_read_string_index(node, "clock-output-names", |
355 | + 0, &clk_name); |
356 | + if (WARN_ON(ret)) |
357 | + goto err_pll_register; |
358 | + |
359 | + init.name = clk_name; |
360 | init.ops = &iproc_pll_ops; |
361 | init.flags = 0; |
362 | parent_name = of_clk_get_parent_name(node, 0); |
363 | @@ -803,13 +809,11 @@ void iproc_pll_clk_setup(struct device_node *node, |
364 | goto err_pll_register; |
365 | |
366 | clk_data->hws[0] = &iclk->hw; |
367 | + parent_name = clk_name; |
368 | |
369 | /* now initialize and register all leaf clocks */ |
370 | for (i = 1; i < num_clks; i++) { |
371 | - const char *clk_name; |
372 | - |
373 | memset(&init, 0, sizeof(init)); |
374 | - parent_name = node->name; |
375 | |
376 | ret = of_property_read_string_index(node, "clock-output-names", |
377 | i, &clk_name); |
378 | diff --git a/drivers/clk/imx/clk-imx6sx.c b/drivers/clk/imx/clk-imx6sx.c |
379 | index c4685c01929a4..579b638b09b86 100644 |
380 | --- a/drivers/clk/imx/clk-imx6sx.c |
381 | +++ b/drivers/clk/imx/clk-imx6sx.c |
382 | @@ -287,13 +287,13 @@ static void __init imx6sx_clocks_init(struct device_node *ccm_node) |
383 | hws[IMX6SX_CLK_SSI3_SEL] = imx_clk_hw_mux("ssi3_sel", base + 0x1c, 14, 2, ssi_sels, ARRAY_SIZE(ssi_sels)); |
384 | hws[IMX6SX_CLK_SSI2_SEL] = imx_clk_hw_mux("ssi2_sel", base + 0x1c, 12, 2, ssi_sels, ARRAY_SIZE(ssi_sels)); |
385 | hws[IMX6SX_CLK_SSI1_SEL] = imx_clk_hw_mux("ssi1_sel", base + 0x1c, 10, 2, ssi_sels, ARRAY_SIZE(ssi_sels)); |
386 | - hws[IMX6SX_CLK_QSPI1_SEL] = imx_clk_hw_mux_flags("qspi1_sel", base + 0x1c, 7, 3, qspi1_sels, ARRAY_SIZE(qspi1_sels), CLK_SET_RATE_PARENT); |
387 | + hws[IMX6SX_CLK_QSPI1_SEL] = imx_clk_hw_mux("qspi1_sel", base + 0x1c, 7, 3, qspi1_sels, ARRAY_SIZE(qspi1_sels)); |
388 | hws[IMX6SX_CLK_PERCLK_SEL] = imx_clk_hw_mux("perclk_sel", base + 0x1c, 6, 1, perclk_sels, ARRAY_SIZE(perclk_sels)); |
389 | hws[IMX6SX_CLK_VID_SEL] = imx_clk_hw_mux("vid_sel", base + 0x20, 21, 3, vid_sels, ARRAY_SIZE(vid_sels)); |
390 | hws[IMX6SX_CLK_ESAI_SEL] = imx_clk_hw_mux("esai_sel", base + 0x20, 19, 2, audio_sels, ARRAY_SIZE(audio_sels)); |
391 | hws[IMX6SX_CLK_CAN_SEL] = imx_clk_hw_mux("can_sel", base + 0x20, 8, 2, can_sels, ARRAY_SIZE(can_sels)); |
392 | hws[IMX6SX_CLK_UART_SEL] = imx_clk_hw_mux("uart_sel", base + 0x24, 6, 1, uart_sels, ARRAY_SIZE(uart_sels)); |
393 | - hws[IMX6SX_CLK_QSPI2_SEL] = imx_clk_hw_mux_flags("qspi2_sel", base + 0x2c, 15, 3, qspi2_sels, ARRAY_SIZE(qspi2_sels), CLK_SET_RATE_PARENT); |
394 | + hws[IMX6SX_CLK_QSPI2_SEL] = imx_clk_hw_mux("qspi2_sel", base + 0x2c, 15, 3, qspi2_sels, ARRAY_SIZE(qspi2_sels)); |
395 | hws[IMX6SX_CLK_SPDIF_SEL] = imx_clk_hw_mux("spdif_sel", base + 0x30, 20, 2, audio_sels, ARRAY_SIZE(audio_sels)); |
396 | hws[IMX6SX_CLK_AUDIO_SEL] = imx_clk_hw_mux("audio_sel", base + 0x30, 7, 2, audio_sels, ARRAY_SIZE(audio_sels)); |
397 | hws[IMX6SX_CLK_ENET_PRE_SEL] = imx_clk_hw_mux("enet_pre_sel", base + 0x34, 15, 3, enet_pre_sels, ARRAY_SIZE(enet_pre_sels)); |
398 | diff --git a/drivers/clk/ingenic/tcu.c b/drivers/clk/ingenic/tcu.c |
399 | index 926696fba3f42..d8739871e114b 100644 |
400 | --- a/drivers/clk/ingenic/tcu.c |
401 | +++ b/drivers/clk/ingenic/tcu.c |
402 | @@ -100,15 +100,11 @@ static bool ingenic_tcu_enable_regs(struct clk_hw *hw) |
403 | bool enabled = false; |
404 | |
405 | /* |
406 | - * If the SoC has no global TCU clock, we must ungate the channel's |
407 | - * clock to be able to access its registers. |
408 | - * If we have a TCU clock, it will be enabled automatically as it has |
409 | - * been attached to the regmap. |
410 | + * According to the programming manual, a timer channel's registers can |
411 | + * only be accessed when the channel's stop bit is clear. |
412 | */ |
413 | - if (!tcu->clk) { |
414 | - enabled = !!ingenic_tcu_is_enabled(hw); |
415 | - regmap_write(tcu->map, TCU_REG_TSCR, BIT(info->gate_bit)); |
416 | - } |
417 | + enabled = !!ingenic_tcu_is_enabled(hw); |
418 | + regmap_write(tcu->map, TCU_REG_TSCR, BIT(info->gate_bit)); |
419 | |
420 | return enabled; |
421 | } |
422 | @@ -119,8 +115,7 @@ static void ingenic_tcu_disable_regs(struct clk_hw *hw) |
423 | const struct ingenic_tcu_clk_info *info = tcu_clk->info; |
424 | struct ingenic_tcu *tcu = tcu_clk->tcu; |
425 | |
426 | - if (!tcu->clk) |
427 | - regmap_write(tcu->map, TCU_REG_TSSR, BIT(info->gate_bit)); |
428 | + regmap_write(tcu->map, TCU_REG_TSSR, BIT(info->gate_bit)); |
429 | } |
430 | |
431 | static u8 ingenic_tcu_get_parent(struct clk_hw *hw) |
432 | diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c |
433 | index c6a51d1c7ec9e..df606a5675663 100644 |
434 | --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c |
435 | +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c |
436 | @@ -1823,12 +1823,6 @@ EXPORT_SYMBOL_GPL(analogix_dp_remove); |
437 | int analogix_dp_suspend(struct analogix_dp_device *dp) |
438 | { |
439 | clk_disable_unprepare(dp->clock); |
440 | - |
441 | - if (dp->plat_data->panel) { |
442 | - if (drm_panel_unprepare(dp->plat_data->panel)) |
443 | - DRM_ERROR("failed to turnoff the panel\n"); |
444 | - } |
445 | - |
446 | return 0; |
447 | } |
448 | EXPORT_SYMBOL_GPL(analogix_dp_suspend); |
449 | @@ -1843,13 +1837,6 @@ int analogix_dp_resume(struct analogix_dp_device *dp) |
450 | return ret; |
451 | } |
452 | |
453 | - if (dp->plat_data->panel) { |
454 | - if (drm_panel_prepare(dp->plat_data->panel)) { |
455 | - DRM_ERROR("failed to setup the panel\n"); |
456 | - return -EBUSY; |
457 | - } |
458 | - } |
459 | - |
460 | return 0; |
461 | } |
462 | EXPORT_SYMBOL_GPL(analogix_dp_resume); |
463 | diff --git a/drivers/input/touchscreen/melfas_mip4.c b/drivers/input/touchscreen/melfas_mip4.c |
464 | index 247c3aaba2d8f..0588b8f04dac6 100644 |
465 | --- a/drivers/input/touchscreen/melfas_mip4.c |
466 | +++ b/drivers/input/touchscreen/melfas_mip4.c |
467 | @@ -1453,7 +1453,7 @@ static int mip4_probe(struct i2c_client *client, const struct i2c_device_id *id) |
468 | "ce", GPIOD_OUT_LOW); |
469 | if (IS_ERR(ts->gpio_ce)) { |
470 | error = PTR_ERR(ts->gpio_ce); |
471 | - if (error != EPROBE_DEFER) |
472 | + if (error != -EPROBE_DEFER) |
473 | dev_err(&client->dev, |
474 | "Failed to get gpio: %d\n", error); |
475 | return error; |
476 | diff --git a/drivers/media/dvb-core/dvb_vb2.c b/drivers/media/dvb-core/dvb_vb2.c |
477 | index 6974f17315294..1331f2c2237e6 100644 |
478 | --- a/drivers/media/dvb-core/dvb_vb2.c |
479 | +++ b/drivers/media/dvb-core/dvb_vb2.c |
480 | @@ -358,6 +358,12 @@ int dvb_vb2_reqbufs(struct dvb_vb2_ctx *ctx, struct dmx_requestbuffers *req) |
481 | |
482 | int dvb_vb2_querybuf(struct dvb_vb2_ctx *ctx, struct dmx_buffer *b) |
483 | { |
484 | + struct vb2_queue *q = &ctx->vb_q; |
485 | + |
486 | + if (b->index >= q->num_buffers) { |
487 | + dprintk(1, "[%s] buffer index out of range\n", ctx->name); |
488 | + return -EINVAL; |
489 | + } |
490 | vb2_core_querybuf(&ctx->vb_q, b->index, b); |
491 | dprintk(3, "[%s] index=%d\n", ctx->name, b->index); |
492 | return 0; |
493 | @@ -382,8 +388,13 @@ int dvb_vb2_expbuf(struct dvb_vb2_ctx *ctx, struct dmx_exportbuffer *exp) |
494 | |
495 | int dvb_vb2_qbuf(struct dvb_vb2_ctx *ctx, struct dmx_buffer *b) |
496 | { |
497 | + struct vb2_queue *q = &ctx->vb_q; |
498 | int ret; |
499 | |
500 | + if (b->index >= q->num_buffers) { |
501 | + dprintk(1, "[%s] buffer index out of range\n", ctx->name); |
502 | + return -EINVAL; |
503 | + } |
504 | ret = vb2_core_qbuf(&ctx->vb_q, b->index, b, NULL); |
505 | if (ret) { |
506 | dprintk(1, "[%s] index=%d errno=%d\n", ctx->name, |
507 | diff --git a/drivers/mmc/host/moxart-mmc.c b/drivers/mmc/host/moxart-mmc.c |
508 | index 5c81dc7371db7..1552d1f09c5c4 100644 |
509 | --- a/drivers/mmc/host/moxart-mmc.c |
510 | +++ b/drivers/mmc/host/moxart-mmc.c |
511 | @@ -111,8 +111,8 @@ |
512 | #define CLK_DIV_MASK 0x7f |
513 | |
514 | /* REG_BUS_WIDTH */ |
515 | -#define BUS_WIDTH_8 BIT(2) |
516 | -#define BUS_WIDTH_4 BIT(1) |
517 | +#define BUS_WIDTH_4_SUPPORT BIT(3) |
518 | +#define BUS_WIDTH_4 BIT(2) |
519 | #define BUS_WIDTH_1 BIT(0) |
520 | |
521 | #define MMC_VDD_360 23 |
522 | @@ -527,9 +527,6 @@ static void moxart_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) |
523 | case MMC_BUS_WIDTH_4: |
524 | writel(BUS_WIDTH_4, host->base + REG_BUS_WIDTH); |
525 | break; |
526 | - case MMC_BUS_WIDTH_8: |
527 | - writel(BUS_WIDTH_8, host->base + REG_BUS_WIDTH); |
528 | - break; |
529 | default: |
530 | writel(BUS_WIDTH_1, host->base + REG_BUS_WIDTH); |
531 | break; |
532 | @@ -646,16 +643,8 @@ static int moxart_probe(struct platform_device *pdev) |
533 | dmaengine_slave_config(host->dma_chan_rx, &cfg); |
534 | } |
535 | |
536 | - switch ((readl(host->base + REG_BUS_WIDTH) >> 3) & 3) { |
537 | - case 1: |
538 | + if (readl(host->base + REG_BUS_WIDTH) & BUS_WIDTH_4_SUPPORT) |
539 | mmc->caps |= MMC_CAP_4_BIT_DATA; |
540 | - break; |
541 | - case 2: |
542 | - mmc->caps |= MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA; |
543 | - break; |
544 | - default: |
545 | - break; |
546 | - } |
547 | |
548 | writel(0, host->base + REG_INTERRUPT_MASK); |
549 | |
550 | diff --git a/drivers/net/ethernet/marvell/mvpp2/mvpp2_debugfs.c b/drivers/net/ethernet/marvell/mvpp2/mvpp2_debugfs.c |
551 | index 0eec05d905eb0..4a3baa7e01424 100644 |
552 | --- a/drivers/net/ethernet/marvell/mvpp2/mvpp2_debugfs.c |
553 | +++ b/drivers/net/ethernet/marvell/mvpp2/mvpp2_debugfs.c |
554 | @@ -700,10 +700,10 @@ void mvpp2_dbgfs_cleanup(struct mvpp2 *priv) |
555 | |
556 | void mvpp2_dbgfs_init(struct mvpp2 *priv, const char *name) |
557 | { |
558 | - static struct dentry *mvpp2_root; |
559 | - struct dentry *mvpp2_dir; |
560 | + struct dentry *mvpp2_dir, *mvpp2_root; |
561 | int ret, i; |
562 | |
563 | + mvpp2_root = debugfs_lookup(MVPP2_DRIVER_NAME, NULL); |
564 | if (!mvpp2_root) |
565 | mvpp2_root = debugfs_create_dir(MVPP2_DRIVER_NAME, NULL); |
566 | |
567 | diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c |
568 | index cee90e505d175..6f82436ff72f7 100644 |
569 | --- a/drivers/net/usb/qmi_wwan.c |
570 | +++ b/drivers/net/usb/qmi_wwan.c |
571 | @@ -1354,6 +1354,7 @@ static const struct usb_device_id products[] = { |
572 | {QMI_FIXED_INTF(0x413c, 0x81b3, 8)}, /* Dell Wireless 5809e Gobi(TM) 4G LTE Mobile Broadband Card (rev3) */ |
573 | {QMI_FIXED_INTF(0x413c, 0x81b6, 8)}, /* Dell Wireless 5811e */ |
574 | {QMI_FIXED_INTF(0x413c, 0x81b6, 10)}, /* Dell Wireless 5811e */ |
575 | + {QMI_FIXED_INTF(0x413c, 0x81c2, 8)}, /* Dell Wireless 5811e */ |
576 | {QMI_FIXED_INTF(0x413c, 0x81cc, 8)}, /* Dell Wireless 5816e */ |
577 | {QMI_FIXED_INTF(0x413c, 0x81d7, 0)}, /* Dell Wireless 5821e */ |
578 | {QMI_FIXED_INTF(0x413c, 0x81d7, 1)}, /* Dell Wireless 5821e preproduction config */ |
579 | diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c |
580 | index 7a8324d2a9686..7af8c3a8f3f17 100644 |
581 | --- a/drivers/net/usb/usbnet.c |
582 | +++ b/drivers/net/usb/usbnet.c |
583 | @@ -1585,6 +1585,7 @@ void usbnet_disconnect (struct usb_interface *intf) |
584 | struct usbnet *dev; |
585 | struct usb_device *xdev; |
586 | struct net_device *net; |
587 | + struct urb *urb; |
588 | |
589 | dev = usb_get_intfdata(intf); |
590 | usb_set_intfdata(intf, NULL); |
591 | @@ -1601,7 +1602,11 @@ void usbnet_disconnect (struct usb_interface *intf) |
592 | net = dev->net; |
593 | unregister_netdev (net); |
594 | |
595 | - usb_scuttle_anchored_urbs(&dev->deferred); |
596 | + while ((urb = usb_get_from_anchor(&dev->deferred))) { |
597 | + dev_kfree_skb(urb->context); |
598 | + kfree(urb->sg); |
599 | + usb_free_urb(urb); |
600 | + } |
601 | |
602 | if (dev->driver_info->unbind) |
603 | dev->driver_info->unbind (dev, intf); |
604 | diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c |
605 | index d2ea6ca37c41f..f1717f34b2f3e 100644 |
606 | --- a/drivers/nvme/host/core.c |
607 | +++ b/drivers/nvme/host/core.c |
608 | @@ -2018,18 +2018,21 @@ static int nvme_pr_preempt(struct block_device *bdev, u64 old, u64 new, |
609 | enum pr_type type, bool abort) |
610 | { |
611 | u32 cdw10 = nvme_pr_type(type) << 8 | (abort ? 2 : 1); |
612 | + |
613 | return nvme_pr_command(bdev, cdw10, old, new, nvme_cmd_resv_acquire); |
614 | } |
615 | |
616 | static int nvme_pr_clear(struct block_device *bdev, u64 key) |
617 | { |
618 | - u32 cdw10 = 1 | (key ? 1 << 3 : 0); |
619 | - return nvme_pr_command(bdev, cdw10, key, 0, nvme_cmd_resv_register); |
620 | + u32 cdw10 = 1 | (key ? 0 : 1 << 3); |
621 | + |
622 | + return nvme_pr_command(bdev, cdw10, key, 0, nvme_cmd_resv_release); |
623 | } |
624 | |
625 | static int nvme_pr_release(struct block_device *bdev, u64 key, enum pr_type type) |
626 | { |
627 | - u32 cdw10 = nvme_pr_type(type) << 8 | (key ? 1 << 3 : 0); |
628 | + u32 cdw10 = nvme_pr_type(type) << 8 | (key ? 0 : 1 << 3); |
629 | + |
630 | return nvme_pr_command(bdev, cdw10, key, 0, nvme_cmd_resv_release); |
631 | } |
632 | |
633 | diff --git a/drivers/soc/sunxi/sunxi_sram.c b/drivers/soc/sunxi/sunxi_sram.c |
634 | index 1b0d50f363493..33139c7817c20 100644 |
635 | --- a/drivers/soc/sunxi/sunxi_sram.c |
636 | +++ b/drivers/soc/sunxi/sunxi_sram.c |
637 | @@ -78,8 +78,8 @@ static struct sunxi_sram_desc sun4i_a10_sram_d = { |
638 | |
639 | static struct sunxi_sram_desc sun50i_a64_sram_c = { |
640 | .data = SUNXI_SRAM_DATA("C", 0x4, 24, 1, |
641 | - SUNXI_SRAM_MAP(0, 1, "cpu"), |
642 | - SUNXI_SRAM_MAP(1, 0, "de2")), |
643 | + SUNXI_SRAM_MAP(1, 0, "cpu"), |
644 | + SUNXI_SRAM_MAP(0, 1, "de2")), |
645 | }; |
646 | |
647 | static const struct of_device_id sunxi_sram_dt_ids[] = { |
648 | @@ -254,6 +254,7 @@ int sunxi_sram_claim(struct device *dev) |
649 | writel(val | ((device << sram_data->offset) & mask), |
650 | base + sram_data->reg); |
651 | |
652 | + sram_desc->claimed = true; |
653 | spin_unlock(&sram_lock); |
654 | |
655 | return 0; |
656 | @@ -318,12 +319,11 @@ static struct regmap_config sunxi_sram_emac_clock_regmap = { |
657 | .writeable_reg = sunxi_sram_regmap_accessible_reg, |
658 | }; |
659 | |
660 | -static int sunxi_sram_probe(struct platform_device *pdev) |
661 | +static int __init sunxi_sram_probe(struct platform_device *pdev) |
662 | { |
663 | - struct resource *res; |
664 | - struct dentry *d; |
665 | struct regmap *emac_clock; |
666 | const struct sunxi_sramc_variant *variant; |
667 | + struct device *dev = &pdev->dev; |
668 | |
669 | sram_dev = &pdev->dev; |
670 | |
671 | @@ -331,18 +331,10 @@ static int sunxi_sram_probe(struct platform_device *pdev) |
672 | if (!variant) |
673 | return -EINVAL; |
674 | |
675 | - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
676 | - base = devm_ioremap_resource(&pdev->dev, res); |
677 | + base = devm_platform_ioremap_resource(pdev, 0); |
678 | if (IS_ERR(base)) |
679 | return PTR_ERR(base); |
680 | |
681 | - of_platform_populate(pdev->dev.of_node, NULL, NULL, &pdev->dev); |
682 | - |
683 | - d = debugfs_create_file("sram", S_IRUGO, NULL, NULL, |
684 | - &sunxi_sram_fops); |
685 | - if (!d) |
686 | - return -ENOMEM; |
687 | - |
688 | if (variant->has_emac_clock) { |
689 | emac_clock = devm_regmap_init_mmio(&pdev->dev, base, |
690 | &sunxi_sram_emac_clock_regmap); |
691 | @@ -351,6 +343,10 @@ static int sunxi_sram_probe(struct platform_device *pdev) |
692 | return PTR_ERR(emac_clock); |
693 | } |
694 | |
695 | + of_platform_populate(dev->of_node, NULL, NULL, dev); |
696 | + |
697 | + debugfs_create_file("sram", 0444, NULL, NULL, &sunxi_sram_fops); |
698 | + |
699 | return 0; |
700 | } |
701 | |
702 | @@ -396,9 +392,8 @@ static struct platform_driver sunxi_sram_driver = { |
703 | .name = "sunxi-sram", |
704 | .of_match_table = sunxi_sram_dt_match, |
705 | }, |
706 | - .probe = sunxi_sram_probe, |
707 | }; |
708 | -module_platform_driver(sunxi_sram_driver); |
709 | +builtin_platform_driver_probe(sunxi_sram_driver, sunxi_sram_probe); |
710 | |
711 | MODULE_AUTHOR("Maxime Ripard <maxime.ripard@free-electrons.com>"); |
712 | MODULE_DESCRIPTION("Allwinner sunXi SRAM Controller Driver"); |
713 | diff --git a/drivers/usb/storage/unusual_uas.h b/drivers/usb/storage/unusual_uas.h |
714 | index 0b37c8e550e7d..92e9bd006622d 100644 |
715 | --- a/drivers/usb/storage/unusual_uas.h |
716 | +++ b/drivers/usb/storage/unusual_uas.h |
717 | @@ -52,6 +52,13 @@ UNUSUAL_DEV(0x059f, 0x1061, 0x0000, 0x9999, |
718 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, |
719 | US_FL_NO_REPORT_OPCODES | US_FL_NO_SAME), |
720 | |
721 | +/* Reported-by: Hongling Zeng <zenghongling@kylinos.cn> */ |
722 | +UNUSUAL_DEV(0x090c, 0x2000, 0x0000, 0x9999, |
723 | + "Hiksemi", |
724 | + "External HDD", |
725 | + USB_SC_DEVICE, USB_PR_DEVICE, NULL, |
726 | + US_FL_IGNORE_UAS), |
727 | + |
728 | /* |
729 | * Apricorn USB3 dongle sometimes returns "USBSUSBSUSBS" in response to SCSI |
730 | * commands in UAS mode. Observed with the 1.28 firmware; are there others? |
731 | @@ -76,6 +83,13 @@ UNUSUAL_DEV(0x0bc2, 0x331a, 0x0000, 0x9999, |
732 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, |
733 | US_FL_NO_REPORT_LUNS), |
734 | |
735 | +/* Reported-by: Hongling Zeng <zenghongling@kylinos.cn> */ |
736 | +UNUSUAL_DEV(0x0bda, 0x9210, 0x0000, 0x9999, |
737 | + "Hiksemi", |
738 | + "External HDD", |
739 | + USB_SC_DEVICE, USB_PR_DEVICE, NULL, |
740 | + US_FL_IGNORE_UAS), |
741 | + |
742 | /* Reported-by: Benjamin Tissoires <benjamin.tissoires@redhat.com> */ |
743 | UNUSUAL_DEV(0x13fd, 0x3940, 0x0000, 0x9999, |
744 | "Initio Corporation", |
745 | @@ -118,6 +132,13 @@ UNUSUAL_DEV(0x154b, 0xf00d, 0x0000, 0x9999, |
746 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, |
747 | US_FL_NO_ATA_1X), |
748 | |
749 | +/* Reported-by: Hongling Zeng <zenghongling@kylinos.cn> */ |
750 | +UNUSUAL_DEV(0x17ef, 0x3899, 0x0000, 0x9999, |
751 | + "Thinkplus", |
752 | + "External HDD", |
753 | + USB_SC_DEVICE, USB_PR_DEVICE, NULL, |
754 | + US_FL_IGNORE_UAS), |
755 | + |
756 | /* Reported-by: Hans de Goede <hdegoede@redhat.com> */ |
757 | UNUSUAL_DEV(0x2109, 0x0711, 0x0000, 0x9999, |
758 | "VIA", |
759 | diff --git a/fs/ntfs/super.c b/fs/ntfs/super.c |
760 | index 7dc3bc604f781..8f33382a00ead 100644 |
761 | --- a/fs/ntfs/super.c |
762 | +++ b/fs/ntfs/super.c |
763 | @@ -2092,7 +2092,8 @@ get_ctx_vol_failed: |
764 | // TODO: Initialize security. |
765 | /* Get the extended system files' directory inode. */ |
766 | vol->extend_ino = ntfs_iget(sb, FILE_Extend); |
767 | - if (IS_ERR(vol->extend_ino) || is_bad_inode(vol->extend_ino)) { |
768 | + if (IS_ERR(vol->extend_ino) || is_bad_inode(vol->extend_ino) || |
769 | + !S_ISDIR(vol->extend_ino->i_mode)) { |
770 | if (!IS_ERR(vol->extend_ino)) |
771 | iput(vol->extend_ino); |
772 | ntfs_error(sb, "Failed to load $Extend."); |
773 | diff --git a/mm/madvise.c b/mm/madvise.c |
774 | index 1107e99e498b2..ac8d68c488b50 100644 |
775 | --- a/mm/madvise.c |
776 | +++ b/mm/madvise.c |
777 | @@ -428,8 +428,11 @@ regular_page: |
778 | continue; |
779 | } |
780 | |
781 | - /* Do not interfere with other mappings of this page */ |
782 | - if (page_mapcount(page) != 1) |
783 | + /* |
784 | + * Do not interfere with other mappings of this page and |
785 | + * non-LRU page. |
786 | + */ |
787 | + if (!PageLRU(page) || page_mapcount(page) != 1) |
788 | continue; |
789 | |
790 | VM_BUG_ON_PAGE(PageTransCompound(page), page); |
791 | diff --git a/mm/migrate.c b/mm/migrate.c |
792 | index 6948d6ec0fd03..034b0662fd3bb 100644 |
793 | --- a/mm/migrate.c |
794 | +++ b/mm/migrate.c |
795 | @@ -2343,13 +2343,14 @@ next: |
796 | migrate->dst[migrate->npages] = 0; |
797 | migrate->src[migrate->npages++] = mpfn; |
798 | } |
799 | - arch_leave_lazy_mmu_mode(); |
800 | - pte_unmap_unlock(ptep - 1, ptl); |
801 | |
802 | /* Only flush the TLB if we actually modified any entries */ |
803 | if (unmapped) |
804 | flush_tlb_range(walk->vma, start, end); |
805 | |
806 | + arch_leave_lazy_mmu_mode(); |
807 | + pte_unmap_unlock(ptep - 1, ptl); |
808 | + |
809 | return 0; |
810 | } |
811 | |
812 | diff --git a/mm/page_alloc.c b/mm/page_alloc.c |
813 | index f08ce248af2a9..c30a8bac5c130 100644 |
814 | --- a/mm/page_alloc.c |
815 | +++ b/mm/page_alloc.c |
816 | @@ -4123,6 +4123,30 @@ void fs_reclaim_release(gfp_t gfp_mask) |
817 | EXPORT_SYMBOL_GPL(fs_reclaim_release); |
818 | #endif |
819 | |
820 | +/* |
821 | + * Zonelists may change due to hotplug during allocation. Detect when zonelists |
822 | + * have been rebuilt so allocation retries. Reader side does not lock and |
823 | + * retries the allocation if zonelist changes. Writer side is protected by the |
824 | + * embedded spin_lock. |
825 | + */ |
826 | +static DEFINE_SEQLOCK(zonelist_update_seq); |
827 | + |
828 | +static unsigned int zonelist_iter_begin(void) |
829 | +{ |
830 | + if (IS_ENABLED(CONFIG_MEMORY_HOTREMOVE)) |
831 | + return read_seqbegin(&zonelist_update_seq); |
832 | + |
833 | + return 0; |
834 | +} |
835 | + |
836 | +static unsigned int check_retry_zonelist(unsigned int seq) |
837 | +{ |
838 | + if (IS_ENABLED(CONFIG_MEMORY_HOTREMOVE)) |
839 | + return read_seqretry(&zonelist_update_seq, seq); |
840 | + |
841 | + return seq; |
842 | +} |
843 | + |
844 | /* Perform direct synchronous page reclaim */ |
845 | static int |
846 | __perform_reclaim(gfp_t gfp_mask, unsigned int order, |
847 | @@ -4430,6 +4454,7 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order, |
848 | int compaction_retries; |
849 | int no_progress_loops; |
850 | unsigned int cpuset_mems_cookie; |
851 | + unsigned int zonelist_iter_cookie; |
852 | int reserve_flags; |
853 | |
854 | /* |
855 | @@ -4440,11 +4465,12 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order, |
856 | (__GFP_ATOMIC|__GFP_DIRECT_RECLAIM))) |
857 | gfp_mask &= ~__GFP_ATOMIC; |
858 | |
859 | -retry_cpuset: |
860 | +restart: |
861 | compaction_retries = 0; |
862 | no_progress_loops = 0; |
863 | compact_priority = DEF_COMPACT_PRIORITY; |
864 | cpuset_mems_cookie = read_mems_allowed_begin(); |
865 | + zonelist_iter_cookie = zonelist_iter_begin(); |
866 | |
867 | /* |
868 | * The fast path uses conservative alloc_flags to succeed only until |
869 | @@ -4617,9 +4643,13 @@ retry: |
870 | goto retry; |
871 | |
872 | |
873 | - /* Deal with possible cpuset update races before we start OOM killing */ |
874 | - if (check_retry_cpuset(cpuset_mems_cookie, ac)) |
875 | - goto retry_cpuset; |
876 | + /* |
877 | + * Deal with possible cpuset update races or zonelist updates to avoid |
878 | + * a unnecessary OOM kill. |
879 | + */ |
880 | + if (check_retry_cpuset(cpuset_mems_cookie, ac) || |
881 | + check_retry_zonelist(zonelist_iter_cookie)) |
882 | + goto restart; |
883 | |
884 | /* Reclaim has failed us, start killing things */ |
885 | page = __alloc_pages_may_oom(gfp_mask, order, ac, &did_some_progress); |
886 | @@ -4639,9 +4669,13 @@ retry: |
887 | } |
888 | |
889 | nopage: |
890 | - /* Deal with possible cpuset update races before we fail */ |
891 | - if (check_retry_cpuset(cpuset_mems_cookie, ac)) |
892 | - goto retry_cpuset; |
893 | + /* |
894 | + * Deal with possible cpuset update races or zonelist updates to avoid |
895 | + * a unnecessary OOM kill. |
896 | + */ |
897 | + if (check_retry_cpuset(cpuset_mems_cookie, ac) || |
898 | + check_retry_zonelist(zonelist_iter_cookie)) |
899 | + goto restart; |
900 | |
901 | /* |
902 | * Make sure that __GFP_NOFAIL request doesn't leak out and make sure |
903 | @@ -4945,6 +4979,18 @@ refill: |
904 | /* reset page count bias and offset to start of new frag */ |
905 | nc->pagecnt_bias = PAGE_FRAG_CACHE_MAX_SIZE + 1; |
906 | offset = size - fragsz; |
907 | + if (unlikely(offset < 0)) { |
908 | + /* |
909 | + * The caller is trying to allocate a fragment |
910 | + * with fragsz > PAGE_SIZE but the cache isn't big |
911 | + * enough to satisfy the request, this may |
912 | + * happen in low memory conditions. |
913 | + * We don't release the cache page because |
914 | + * it could make memory pressure worse |
915 | + * so we simply return NULL here. |
916 | + */ |
917 | + return NULL; |
918 | + } |
919 | } |
920 | |
921 | nc->pagecnt_bias--; |
922 | @@ -5770,9 +5816,8 @@ static void __build_all_zonelists(void *data) |
923 | int nid; |
924 | int __maybe_unused cpu; |
925 | pg_data_t *self = data; |
926 | - static DEFINE_SPINLOCK(lock); |
927 | |
928 | - spin_lock(&lock); |
929 | + write_seqlock(&zonelist_update_seq); |
930 | |
931 | #ifdef CONFIG_NUMA |
932 | memset(node_load, 0, sizeof(node_load)); |
933 | @@ -5805,7 +5850,7 @@ static void __build_all_zonelists(void *data) |
934 | #endif |
935 | } |
936 | |
937 | - spin_unlock(&lock); |
938 | + write_sequnlock(&zonelist_update_seq); |
939 | } |
940 | |
941 | static noinline void __init |
942 | diff --git a/tools/testing/selftests/net/reuseport_bpf.c b/tools/testing/selftests/net/reuseport_bpf.c |
943 | index b5277106df1fd..b0cc082fbb84f 100644 |
944 | --- a/tools/testing/selftests/net/reuseport_bpf.c |
945 | +++ b/tools/testing/selftests/net/reuseport_bpf.c |
946 | @@ -330,7 +330,7 @@ static void test_extra_filter(const struct test_params p) |
947 | if (bind(fd1, addr, sockaddr_size())) |
948 | error(1, errno, "failed to bind recv socket 1"); |
949 | |
950 | - if (!bind(fd2, addr, sockaddr_size()) && errno != EADDRINUSE) |
951 | + if (!bind(fd2, addr, sockaddr_size()) || errno != EADDRINUSE) |
952 | error(1, errno, "bind socket 2 should fail with EADDRINUSE"); |
953 | |
954 | free(addr); |