Contents of /trunk/kernel-alx/patches-4.19/0150-4.19.51-all-fixes.patch
Parent Directory | Revision Log
Revision 3429 -
(show annotations)
(download)
Fri Aug 2 11:47:57 2019 UTC (5 years, 1 month ago) by niro
File size: 102204 byte(s)
Fri Aug 2 11:47:57 2019 UTC (5 years, 1 month ago) by niro
File size: 102204 byte(s)
-linux-4.19.51
1 | diff --git a/Makefile b/Makefile |
2 | index f7e7e365e2ff..dd4be2f32b88 100644 |
3 | --- a/Makefile |
4 | +++ b/Makefile |
5 | @@ -1,7 +1,7 @@ |
6 | # SPDX-License-Identifier: GPL-2.0 |
7 | VERSION = 4 |
8 | PATCHLEVEL = 19 |
9 | -SUBLEVEL = 50 |
10 | +SUBLEVEL = 51 |
11 | EXTRAVERSION = |
12 | NAME = "People's Front" |
13 | |
14 | diff --git a/arch/arm/boot/dts/exynos5420-arndale-octa.dts b/arch/arm/boot/dts/exynos5420-arndale-octa.dts |
15 | index cdda614e417e..a370857beac0 100644 |
16 | --- a/arch/arm/boot/dts/exynos5420-arndale-octa.dts |
17 | +++ b/arch/arm/boot/dts/exynos5420-arndale-octa.dts |
18 | @@ -106,6 +106,7 @@ |
19 | regulator-name = "PVDD_APIO_1V8"; |
20 | regulator-min-microvolt = <1800000>; |
21 | regulator-max-microvolt = <1800000>; |
22 | + regulator-always-on; |
23 | }; |
24 | |
25 | ldo3_reg: LDO3 { |
26 | @@ -144,6 +145,7 @@ |
27 | regulator-name = "PVDD_ABB_1V8"; |
28 | regulator-min-microvolt = <1800000>; |
29 | regulator-max-microvolt = <1800000>; |
30 | + regulator-always-on; |
31 | }; |
32 | |
33 | ldo9_reg: LDO9 { |
34 | diff --git a/arch/arm/boot/dts/imx50.dtsi b/arch/arm/boot/dts/imx50.dtsi |
35 | index 7fae2ffb76fe..ab522c2da6df 100644 |
36 | --- a/arch/arm/boot/dts/imx50.dtsi |
37 | +++ b/arch/arm/boot/dts/imx50.dtsi |
38 | @@ -420,7 +420,7 @@ |
39 | reg = <0x63fb0000 0x4000>; |
40 | interrupts = <6>; |
41 | clocks = <&clks IMX5_CLK_SDMA_GATE>, |
42 | - <&clks IMX5_CLK_SDMA_GATE>; |
43 | + <&clks IMX5_CLK_AHB>; |
44 | clock-names = "ipg", "ahb"; |
45 | #dma-cells = <3>; |
46 | fsl,sdma-ram-script-name = "imx/sdma/sdma-imx50.bin"; |
47 | diff --git a/arch/arm/boot/dts/imx51.dtsi b/arch/arm/boot/dts/imx51.dtsi |
48 | index 5c4ba91e43ba..ef2abc097843 100644 |
49 | --- a/arch/arm/boot/dts/imx51.dtsi |
50 | +++ b/arch/arm/boot/dts/imx51.dtsi |
51 | @@ -481,7 +481,7 @@ |
52 | reg = <0x83fb0000 0x4000>; |
53 | interrupts = <6>; |
54 | clocks = <&clks IMX5_CLK_SDMA_GATE>, |
55 | - <&clks IMX5_CLK_SDMA_GATE>; |
56 | + <&clks IMX5_CLK_AHB>; |
57 | clock-names = "ipg", "ahb"; |
58 | #dma-cells = <3>; |
59 | fsl,sdma-ram-script-name = "imx/sdma/sdma-imx51.bin"; |
60 | diff --git a/arch/arm/boot/dts/imx53.dtsi b/arch/arm/boot/dts/imx53.dtsi |
61 | index 6386185ae234..b6b0818343c4 100644 |
62 | --- a/arch/arm/boot/dts/imx53.dtsi |
63 | +++ b/arch/arm/boot/dts/imx53.dtsi |
64 | @@ -701,7 +701,7 @@ |
65 | reg = <0x63fb0000 0x4000>; |
66 | interrupts = <6>; |
67 | clocks = <&clks IMX5_CLK_SDMA_GATE>, |
68 | - <&clks IMX5_CLK_SDMA_GATE>; |
69 | + <&clks IMX5_CLK_AHB>; |
70 | clock-names = "ipg", "ahb"; |
71 | #dma-cells = <3>; |
72 | fsl,sdma-ram-script-name = "imx/sdma/sdma-imx53.bin"; |
73 | diff --git a/arch/arm/boot/dts/imx6qdl.dtsi b/arch/arm/boot/dts/imx6qdl.dtsi |
74 | index 61d2d26afbf4..00d44a60972f 100644 |
75 | --- a/arch/arm/boot/dts/imx6qdl.dtsi |
76 | +++ b/arch/arm/boot/dts/imx6qdl.dtsi |
77 | @@ -905,7 +905,7 @@ |
78 | compatible = "fsl,imx6q-sdma", "fsl,imx35-sdma"; |
79 | reg = <0x020ec000 0x4000>; |
80 | interrupts = <0 2 IRQ_TYPE_LEVEL_HIGH>; |
81 | - clocks = <&clks IMX6QDL_CLK_SDMA>, |
82 | + clocks = <&clks IMX6QDL_CLK_IPG>, |
83 | <&clks IMX6QDL_CLK_SDMA>; |
84 | clock-names = "ipg", "ahb"; |
85 | #dma-cells = <3>; |
86 | diff --git a/arch/arm/boot/dts/imx6sl.dtsi b/arch/arm/boot/dts/imx6sl.dtsi |
87 | index 7a4f5dace902..2fa88c6f1882 100644 |
88 | --- a/arch/arm/boot/dts/imx6sl.dtsi |
89 | +++ b/arch/arm/boot/dts/imx6sl.dtsi |
90 | @@ -739,7 +739,7 @@ |
91 | reg = <0x020ec000 0x4000>; |
92 | interrupts = <0 2 IRQ_TYPE_LEVEL_HIGH>; |
93 | clocks = <&clks IMX6SL_CLK_SDMA>, |
94 | - <&clks IMX6SL_CLK_SDMA>; |
95 | + <&clks IMX6SL_CLK_AHB>; |
96 | clock-names = "ipg", "ahb"; |
97 | #dma-cells = <3>; |
98 | /* imx6sl reuses imx6q sdma firmware */ |
99 | diff --git a/arch/arm/boot/dts/imx6sll.dtsi b/arch/arm/boot/dts/imx6sll.dtsi |
100 | index 3e6ffaf5f104..7c7d5c47578e 100644 |
101 | --- a/arch/arm/boot/dts/imx6sll.dtsi |
102 | +++ b/arch/arm/boot/dts/imx6sll.dtsi |
103 | @@ -591,7 +591,7 @@ |
104 | compatible = "fsl,imx6sll-sdma", "fsl,imx35-sdma"; |
105 | reg = <0x020ec000 0x4000>; |
106 | interrupts = <GIC_SPI 2 IRQ_TYPE_LEVEL_HIGH>; |
107 | - clocks = <&clks IMX6SLL_CLK_SDMA>, |
108 | + clocks = <&clks IMX6SLL_CLK_IPG>, |
109 | <&clks IMX6SLL_CLK_SDMA>; |
110 | clock-names = "ipg", "ahb"; |
111 | #dma-cells = <3>; |
112 | diff --git a/arch/arm/boot/dts/imx6sx.dtsi b/arch/arm/boot/dts/imx6sx.dtsi |
113 | index 50083cecc6c9..7b62e6fb47eb 100644 |
114 | --- a/arch/arm/boot/dts/imx6sx.dtsi |
115 | +++ b/arch/arm/boot/dts/imx6sx.dtsi |
116 | @@ -803,7 +803,7 @@ |
117 | compatible = "fsl,imx6sx-sdma", "fsl,imx6q-sdma"; |
118 | reg = <0x020ec000 0x4000>; |
119 | interrupts = <GIC_SPI 2 IRQ_TYPE_LEVEL_HIGH>; |
120 | - clocks = <&clks IMX6SX_CLK_SDMA>, |
121 | + clocks = <&clks IMX6SX_CLK_IPG>, |
122 | <&clks IMX6SX_CLK_SDMA>; |
123 | clock-names = "ipg", "ahb"; |
124 | #dma-cells = <3>; |
125 | diff --git a/arch/arm/boot/dts/imx6ul.dtsi b/arch/arm/boot/dts/imx6ul.dtsi |
126 | index 6dc0b569acdf..2366f093cc76 100644 |
127 | --- a/arch/arm/boot/dts/imx6ul.dtsi |
128 | +++ b/arch/arm/boot/dts/imx6ul.dtsi |
129 | @@ -707,7 +707,7 @@ |
130 | "fsl,imx35-sdma"; |
131 | reg = <0x020ec000 0x4000>; |
132 | interrupts = <GIC_SPI 2 IRQ_TYPE_LEVEL_HIGH>; |
133 | - clocks = <&clks IMX6UL_CLK_SDMA>, |
134 | + clocks = <&clks IMX6UL_CLK_IPG>, |
135 | <&clks IMX6UL_CLK_SDMA>; |
136 | clock-names = "ipg", "ahb"; |
137 | #dma-cells = <3>; |
138 | diff --git a/arch/arm/boot/dts/imx7s.dtsi b/arch/arm/boot/dts/imx7s.dtsi |
139 | index a052198f6e96..a7f697b0290f 100644 |
140 | --- a/arch/arm/boot/dts/imx7s.dtsi |
141 | +++ b/arch/arm/boot/dts/imx7s.dtsi |
142 | @@ -1050,8 +1050,8 @@ |
143 | compatible = "fsl,imx7d-sdma", "fsl,imx35-sdma"; |
144 | reg = <0x30bd0000 0x10000>; |
145 | interrupts = <GIC_SPI 2 IRQ_TYPE_LEVEL_HIGH>; |
146 | - clocks = <&clks IMX7D_SDMA_CORE_CLK>, |
147 | - <&clks IMX7D_AHB_CHANNEL_ROOT_CLK>; |
148 | + clocks = <&clks IMX7D_IPG_ROOT_CLK>, |
149 | + <&clks IMX7D_SDMA_CORE_CLK>; |
150 | clock-names = "ipg", "ahb"; |
151 | #dma-cells = <3>; |
152 | fsl,sdma-ram-script-name = "imx/sdma/sdma-imx7d.bin"; |
153 | diff --git a/arch/arm/include/asm/hardirq.h b/arch/arm/include/asm/hardirq.h |
154 | index cba23eaa6072..7a88f160b1fb 100644 |
155 | --- a/arch/arm/include/asm/hardirq.h |
156 | +++ b/arch/arm/include/asm/hardirq.h |
157 | @@ -6,6 +6,7 @@ |
158 | #include <linux/threads.h> |
159 | #include <asm/irq.h> |
160 | |
161 | +/* number of IPIS _not_ including IPI_CPU_BACKTRACE */ |
162 | #define NR_IPI 7 |
163 | |
164 | typedef struct { |
165 | diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c |
166 | index a3ce7c5365fa..bada66ef4419 100644 |
167 | --- a/arch/arm/kernel/smp.c |
168 | +++ b/arch/arm/kernel/smp.c |
169 | @@ -76,6 +76,10 @@ enum ipi_msg_type { |
170 | IPI_CPU_STOP, |
171 | IPI_IRQ_WORK, |
172 | IPI_COMPLETION, |
173 | + /* |
174 | + * CPU_BACKTRACE is special and not included in NR_IPI |
175 | + * or tracable with trace_ipi_* |
176 | + */ |
177 | IPI_CPU_BACKTRACE, |
178 | /* |
179 | * SGI8-15 can be reserved by secure firmware, and thus may |
180 | @@ -803,7 +807,7 @@ core_initcall(register_cpufreq_notifier); |
181 | |
182 | static void raise_nmi(cpumask_t *mask) |
183 | { |
184 | - smp_cross_call(mask, IPI_CPU_BACKTRACE); |
185 | + __smp_cross_call(mask, IPI_CPU_BACKTRACE); |
186 | } |
187 | |
188 | void arch_trigger_cpumask_backtrace(const cpumask_t *mask, bool exclude_self) |
189 | diff --git a/arch/arm/mach-exynos/suspend.c b/arch/arm/mach-exynos/suspend.c |
190 | index b1fe53e8b460..088c34e99b02 100644 |
191 | --- a/arch/arm/mach-exynos/suspend.c |
192 | +++ b/arch/arm/mach-exynos/suspend.c |
193 | @@ -434,8 +434,27 @@ early_wakeup: |
194 | |
195 | static void exynos5420_prepare_pm_resume(void) |
196 | { |
197 | + unsigned int mpidr, cluster; |
198 | + |
199 | + mpidr = read_cpuid_mpidr(); |
200 | + cluster = MPIDR_AFFINITY_LEVEL(mpidr, 1); |
201 | + |
202 | if (IS_ENABLED(CONFIG_EXYNOS5420_MCPM)) |
203 | WARN_ON(mcpm_cpu_powered_up()); |
204 | + |
205 | + if (IS_ENABLED(CONFIG_HW_PERF_EVENTS) && cluster != 0) { |
206 | + /* |
207 | + * When system is resumed on the LITTLE/KFC core (cluster 1), |
208 | + * the DSCR is not properly updated until the power is turned |
209 | + * on also for the cluster 0. Enable it for a while to |
210 | + * propagate the SPNIDEN and SPIDEN signals from Secure JTAG |
211 | + * block and avoid undefined instruction issue on CP14 reset. |
212 | + */ |
213 | + pmu_raw_writel(S5P_CORE_LOCAL_PWR_EN, |
214 | + EXYNOS_COMMON_CONFIGURATION(0)); |
215 | + pmu_raw_writel(0, |
216 | + EXYNOS_COMMON_CONFIGURATION(0)); |
217 | + } |
218 | } |
219 | |
220 | static void exynos5420_pm_resume(void) |
221 | diff --git a/arch/arm/mach-omap2/pm33xx-core.c b/arch/arm/mach-omap2/pm33xx-core.c |
222 | index f4971e4a86b2..ca7026958d42 100644 |
223 | --- a/arch/arm/mach-omap2/pm33xx-core.c |
224 | +++ b/arch/arm/mach-omap2/pm33xx-core.c |
225 | @@ -51,10 +51,12 @@ static int amx3_common_init(void) |
226 | |
227 | /* CEFUSE domain can be turned off post bootup */ |
228 | cefuse_pwrdm = pwrdm_lookup("cefuse_pwrdm"); |
229 | - if (cefuse_pwrdm) |
230 | - omap_set_pwrdm_state(cefuse_pwrdm, PWRDM_POWER_OFF); |
231 | - else |
232 | + if (!cefuse_pwrdm) |
233 | pr_err("PM: Failed to get cefuse_pwrdm\n"); |
234 | + else if (omap_type() != OMAP2_DEVICE_TYPE_GP) |
235 | + pr_info("PM: Leaving EFUSE power domain active\n"); |
236 | + else |
237 | + omap_set_pwrdm_state(cefuse_pwrdm, PWRDM_POWER_OFF); |
238 | |
239 | return 0; |
240 | } |
241 | diff --git a/arch/mips/kernel/prom.c b/arch/mips/kernel/prom.c |
242 | index 89950b7bf536..bdaf3536241a 100644 |
243 | --- a/arch/mips/kernel/prom.c |
244 | +++ b/arch/mips/kernel/prom.c |
245 | @@ -41,7 +41,19 @@ char *mips_get_machine_name(void) |
246 | #ifdef CONFIG_USE_OF |
247 | void __init early_init_dt_add_memory_arch(u64 base, u64 size) |
248 | { |
249 | - return add_memory_region(base, size, BOOT_MEM_RAM); |
250 | + if (base >= PHYS_ADDR_MAX) { |
251 | + pr_warn("Trying to add an invalid memory region, skipped\n"); |
252 | + return; |
253 | + } |
254 | + |
255 | + /* Truncate the passed memory region instead of type casting */ |
256 | + if (base + size - 1 >= PHYS_ADDR_MAX || base + size < base) { |
257 | + pr_warn("Truncate memory region %llx @ %llx to size %llx\n", |
258 | + size, base, PHYS_ADDR_MAX - base); |
259 | + size = PHYS_ADDR_MAX - base; |
260 | + } |
261 | + |
262 | + add_memory_region(base, size, BOOT_MEM_RAM); |
263 | } |
264 | |
265 | int __init early_init_dt_reserve_memory_arch(phys_addr_t base, |
266 | diff --git a/arch/um/kernel/time.c b/arch/um/kernel/time.c |
267 | index 052de4c8acb2..0c572a48158e 100644 |
268 | --- a/arch/um/kernel/time.c |
269 | +++ b/arch/um/kernel/time.c |
270 | @@ -56,7 +56,7 @@ static int itimer_one_shot(struct clock_event_device *evt) |
271 | static struct clock_event_device timer_clockevent = { |
272 | .name = "posix-timer", |
273 | .rating = 250, |
274 | - .cpumask = cpu_all_mask, |
275 | + .cpumask = cpu_possible_mask, |
276 | .features = CLOCK_EVT_FEAT_PERIODIC | |
277 | CLOCK_EVT_FEAT_ONESHOT, |
278 | .set_state_shutdown = itimer_shutdown, |
279 | diff --git a/arch/x86/events/intel/core.c b/arch/x86/events/intel/core.c |
280 | index 09c53bcbd497..c8b0bf2b0d5e 100644 |
281 | --- a/arch/x86/events/intel/core.c |
282 | +++ b/arch/x86/events/intel/core.c |
283 | @@ -3072,7 +3072,7 @@ static int intel_pmu_hw_config(struct perf_event *event) |
284 | return ret; |
285 | |
286 | if (event->attr.precise_ip) { |
287 | - if (!(event->attr.freq || event->attr.wakeup_events)) { |
288 | + if (!(event->attr.freq || (event->attr.wakeup_events && !event->attr.watermark))) { |
289 | event->hw.flags |= PERF_X86_EVENT_AUTO_RELOAD; |
290 | if (!(event->attr.sample_type & |
291 | ~intel_pmu_large_pebs_flags(event))) |
292 | diff --git a/arch/x86/pci/irq.c b/arch/x86/pci/irq.c |
293 | index 52e55108404e..d3a73f9335e1 100644 |
294 | --- a/arch/x86/pci/irq.c |
295 | +++ b/arch/x86/pci/irq.c |
296 | @@ -1119,6 +1119,8 @@ static const struct dmi_system_id pciirq_dmi_table[] __initconst = { |
297 | |
298 | void __init pcibios_irq_init(void) |
299 | { |
300 | + struct irq_routing_table *rtable = NULL; |
301 | + |
302 | DBG(KERN_DEBUG "PCI: IRQ init\n"); |
303 | |
304 | if (raw_pci_ops == NULL) |
305 | @@ -1129,8 +1131,10 @@ void __init pcibios_irq_init(void) |
306 | pirq_table = pirq_find_routing_table(); |
307 | |
308 | #ifdef CONFIG_PCI_BIOS |
309 | - if (!pirq_table && (pci_probe & PCI_BIOS_IRQ_SCAN)) |
310 | + if (!pirq_table && (pci_probe & PCI_BIOS_IRQ_SCAN)) { |
311 | pirq_table = pcibios_get_irq_routing_table(); |
312 | + rtable = pirq_table; |
313 | + } |
314 | #endif |
315 | if (pirq_table) { |
316 | pirq_peer_trick(); |
317 | @@ -1145,8 +1149,10 @@ void __init pcibios_irq_init(void) |
318 | * If we're using the I/O APIC, avoid using the PCI IRQ |
319 | * routing table |
320 | */ |
321 | - if (io_apic_assign_pci_irqs) |
322 | + if (io_apic_assign_pci_irqs) { |
323 | + kfree(rtable); |
324 | pirq_table = NULL; |
325 | + } |
326 | } |
327 | |
328 | x86_init.pci.fixup_irqs(); |
329 | diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c |
330 | index 15e8c9955b79..6bb397995610 100644 |
331 | --- a/block/bfq-iosched.c |
332 | +++ b/block/bfq-iosched.c |
333 | @@ -2509,6 +2509,8 @@ static void bfq_arm_slice_timer(struct bfq_data *bfqd) |
334 | if (BFQQ_SEEKY(bfqq) && bfqq->wr_coeff == 1 && |
335 | bfq_symmetric_scenario(bfqd)) |
336 | sl = min_t(u64, sl, BFQ_MIN_TT); |
337 | + else if (bfqq->wr_coeff > 1) |
338 | + sl = max_t(u32, sl, 20ULL * NSEC_PER_MSEC); |
339 | |
340 | bfqd->last_idling_start = ktime_get(); |
341 | hrtimer_start(&bfqd->idle_slice_timer, ns_to_ktime(sl), |
342 | diff --git a/block/blk-core.c b/block/blk-core.c |
343 | index 33488b1426b7..6eed5d84c2ef 100644 |
344 | --- a/block/blk-core.c |
345 | +++ b/block/blk-core.c |
346 | @@ -411,7 +411,6 @@ void blk_sync_queue(struct request_queue *q) |
347 | struct blk_mq_hw_ctx *hctx; |
348 | int i; |
349 | |
350 | - cancel_delayed_work_sync(&q->requeue_work); |
351 | queue_for_each_hw_ctx(q, hctx, i) |
352 | cancel_delayed_work_sync(&hctx->run_work); |
353 | } else { |
354 | diff --git a/block/blk-mq.c b/block/blk-mq.c |
355 | index 4e563ee462cb..70d839b9c3b0 100644 |
356 | --- a/block/blk-mq.c |
357 | +++ b/block/blk-mq.c |
358 | @@ -2465,6 +2465,8 @@ void blk_mq_release(struct request_queue *q) |
359 | struct blk_mq_hw_ctx *hctx; |
360 | unsigned int i; |
361 | |
362 | + cancel_delayed_work_sync(&q->requeue_work); |
363 | + |
364 | /* hctx kobj stays in hctx */ |
365 | queue_for_each_hw_ctx(q, hctx, i) { |
366 | if (!hctx) |
367 | diff --git a/drivers/clk/rockchip/clk-rk3288.c b/drivers/clk/rockchip/clk-rk3288.c |
368 | index 64191694ff6e..9cfdbea493bb 100644 |
369 | --- a/drivers/clk/rockchip/clk-rk3288.c |
370 | +++ b/drivers/clk/rockchip/clk-rk3288.c |
371 | @@ -835,6 +835,9 @@ static const int rk3288_saved_cru_reg_ids[] = { |
372 | RK3288_CLKSEL_CON(10), |
373 | RK3288_CLKSEL_CON(33), |
374 | RK3288_CLKSEL_CON(37), |
375 | + |
376 | + /* We turn aclk_dmac1 on for suspend; this will restore it */ |
377 | + RK3288_CLKGATE_CON(10), |
378 | }; |
379 | |
380 | static u32 rk3288_saved_cru_regs[ARRAY_SIZE(rk3288_saved_cru_reg_ids)]; |
381 | @@ -850,6 +853,14 @@ static int rk3288_clk_suspend(void) |
382 | readl_relaxed(rk3288_cru_base + reg_id); |
383 | } |
384 | |
385 | + /* |
386 | + * Going into deep sleep (specifically setting PMU_CLR_DMA in |
387 | + * RK3288_PMU_PWRMODE_CON1) appears to fail unless |
388 | + * "aclk_dmac1" is on. |
389 | + */ |
390 | + writel_relaxed(1 << (12 + 16), |
391 | + rk3288_cru_base + RK3288_CLKGATE_CON(10)); |
392 | + |
393 | /* |
394 | * Switch PLLs other than DPLL (for SDRAM) to slow mode to |
395 | * avoid crashes on resume. The Mask ROM on the system will |
396 | diff --git a/drivers/dma/idma64.c b/drivers/dma/idma64.c |
397 | index 1fbf9cb9b742..89c5e5b46068 100644 |
398 | --- a/drivers/dma/idma64.c |
399 | +++ b/drivers/dma/idma64.c |
400 | @@ -597,7 +597,7 @@ static int idma64_probe(struct idma64_chip *chip) |
401 | idma64->dma.directions = BIT(DMA_DEV_TO_MEM) | BIT(DMA_MEM_TO_DEV); |
402 | idma64->dma.residue_granularity = DMA_RESIDUE_GRANULARITY_BURST; |
403 | |
404 | - idma64->dma.dev = chip->dev; |
405 | + idma64->dma.dev = chip->sysdev; |
406 | |
407 | dma_set_max_seg_size(idma64->dma.dev, IDMA64C_CTLH_BLOCK_TS_MASK); |
408 | |
409 | @@ -637,6 +637,7 @@ static int idma64_platform_probe(struct platform_device *pdev) |
410 | { |
411 | struct idma64_chip *chip; |
412 | struct device *dev = &pdev->dev; |
413 | + struct device *sysdev = dev->parent; |
414 | struct resource *mem; |
415 | int ret; |
416 | |
417 | @@ -653,11 +654,12 @@ static int idma64_platform_probe(struct platform_device *pdev) |
418 | if (IS_ERR(chip->regs)) |
419 | return PTR_ERR(chip->regs); |
420 | |
421 | - ret = dma_coerce_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64)); |
422 | + ret = dma_coerce_mask_and_coherent(sysdev, DMA_BIT_MASK(64)); |
423 | if (ret) |
424 | return ret; |
425 | |
426 | chip->dev = dev; |
427 | + chip->sysdev = sysdev; |
428 | |
429 | ret = idma64_probe(chip); |
430 | if (ret) |
431 | diff --git a/drivers/dma/idma64.h b/drivers/dma/idma64.h |
432 | index 6b816878e5e7..baa32e1425de 100644 |
433 | --- a/drivers/dma/idma64.h |
434 | +++ b/drivers/dma/idma64.h |
435 | @@ -216,12 +216,14 @@ static inline void idma64_writel(struct idma64 *idma64, int offset, u32 value) |
436 | /** |
437 | * struct idma64_chip - representation of iDMA 64-bit controller hardware |
438 | * @dev: struct device of the DMA controller |
439 | + * @sysdev: struct device of the physical device that does DMA |
440 | * @irq: irq line |
441 | * @regs: memory mapped I/O space |
442 | * @idma64: struct idma64 that is filed by idma64_probe() |
443 | */ |
444 | struct idma64_chip { |
445 | struct device *dev; |
446 | + struct device *sysdev; |
447 | int irq; |
448 | void __iomem *regs; |
449 | struct idma64 *idma64; |
450 | diff --git a/drivers/edac/Kconfig b/drivers/edac/Kconfig |
451 | index 57304b2e989f..b00cc03ad6b6 100644 |
452 | --- a/drivers/edac/Kconfig |
453 | +++ b/drivers/edac/Kconfig |
454 | @@ -250,8 +250,8 @@ config EDAC_PND2 |
455 | micro-server but may appear on others in the future. |
456 | |
457 | config EDAC_MPC85XX |
458 | - tristate "Freescale MPC83xx / MPC85xx" |
459 | - depends on FSL_SOC |
460 | + bool "Freescale MPC83xx / MPC85xx" |
461 | + depends on FSL_SOC && EDAC=y |
462 | help |
463 | Support for error detection and correction on the Freescale |
464 | MPC8349, MPC8560, MPC8540, MPC8548, T4240 |
465 | diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c |
466 | index 6c1acf642c8e..6fa430d98517 100644 |
467 | --- a/drivers/gpio/gpio-omap.c |
468 | +++ b/drivers/gpio/gpio-omap.c |
469 | @@ -343,6 +343,22 @@ static void omap_clear_gpio_debounce(struct gpio_bank *bank, unsigned offset) |
470 | } |
471 | } |
472 | |
473 | +/* |
474 | + * Off mode wake-up capable GPIOs in bank(s) that are in the wakeup domain. |
475 | + * See TRM section for GPIO for "Wake-Up Generation" for the list of GPIOs |
476 | + * in wakeup domain. If bank->non_wakeup_gpios is not configured, assume none |
477 | + * are capable waking up the system from off mode. |
478 | + */ |
479 | +static bool omap_gpio_is_off_wakeup_capable(struct gpio_bank *bank, u32 gpio_mask) |
480 | +{ |
481 | + u32 no_wake = bank->non_wakeup_gpios; |
482 | + |
483 | + if (no_wake) |
484 | + return !!(~no_wake & gpio_mask); |
485 | + |
486 | + return false; |
487 | +} |
488 | + |
489 | static inline void omap_set_gpio_trigger(struct gpio_bank *bank, int gpio, |
490 | unsigned trigger) |
491 | { |
492 | @@ -374,13 +390,7 @@ static inline void omap_set_gpio_trigger(struct gpio_bank *bank, int gpio, |
493 | } |
494 | |
495 | /* This part needs to be executed always for OMAP{34xx, 44xx} */ |
496 | - if (!bank->regs->irqctrl) { |
497 | - /* On omap24xx proceed only when valid GPIO bit is set */ |
498 | - if (bank->non_wakeup_gpios) { |
499 | - if (!(bank->non_wakeup_gpios & gpio_bit)) |
500 | - goto exit; |
501 | - } |
502 | - |
503 | + if (!bank->regs->irqctrl && !omap_gpio_is_off_wakeup_capable(bank, gpio)) { |
504 | /* |
505 | * Log the edge gpio and manually trigger the IRQ |
506 | * after resume if the input level changes |
507 | @@ -393,7 +403,6 @@ static inline void omap_set_gpio_trigger(struct gpio_bank *bank, int gpio, |
508 | bank->enabled_non_wakeup_gpios &= ~gpio_bit; |
509 | } |
510 | |
511 | -exit: |
512 | bank->level_mask = |
513 | readl_relaxed(bank->base + bank->regs->leveldetect0) | |
514 | readl_relaxed(bank->base + bank->regs->leveldetect1); |
515 | diff --git a/drivers/gpio/gpio-vf610.c b/drivers/gpio/gpio-vf610.c |
516 | index 7e09ce75ffb2..a9cb5571de54 100644 |
517 | --- a/drivers/gpio/gpio-vf610.c |
518 | +++ b/drivers/gpio/gpio-vf610.c |
519 | @@ -37,6 +37,7 @@ struct fsl_gpio_soc_data { |
520 | |
521 | struct vf610_gpio_port { |
522 | struct gpio_chip gc; |
523 | + struct irq_chip ic; |
524 | void __iomem *base; |
525 | void __iomem *gpio_base; |
526 | const struct fsl_gpio_soc_data *sdata; |
527 | @@ -66,8 +67,6 @@ struct vf610_gpio_port { |
528 | #define PORT_INT_EITHER_EDGE 0xb |
529 | #define PORT_INT_LOGIC_ONE 0xc |
530 | |
531 | -static struct irq_chip vf610_gpio_irq_chip; |
532 | - |
533 | static const struct fsl_gpio_soc_data imx_data = { |
534 | .have_paddr = true, |
535 | }; |
536 | @@ -243,15 +242,6 @@ static int vf610_gpio_irq_set_wake(struct irq_data *d, u32 enable) |
537 | return 0; |
538 | } |
539 | |
540 | -static struct irq_chip vf610_gpio_irq_chip = { |
541 | - .name = "gpio-vf610", |
542 | - .irq_ack = vf610_gpio_irq_ack, |
543 | - .irq_mask = vf610_gpio_irq_mask, |
544 | - .irq_unmask = vf610_gpio_irq_unmask, |
545 | - .irq_set_type = vf610_gpio_irq_set_type, |
546 | - .irq_set_wake = vf610_gpio_irq_set_wake, |
547 | -}; |
548 | - |
549 | static int vf610_gpio_probe(struct platform_device *pdev) |
550 | { |
551 | struct device *dev = &pdev->dev; |
552 | @@ -259,6 +249,7 @@ static int vf610_gpio_probe(struct platform_device *pdev) |
553 | struct vf610_gpio_port *port; |
554 | struct resource *iores; |
555 | struct gpio_chip *gc; |
556 | + struct irq_chip *ic; |
557 | int i; |
558 | int ret; |
559 | |
560 | @@ -295,6 +286,14 @@ static int vf610_gpio_probe(struct platform_device *pdev) |
561 | gc->direction_output = vf610_gpio_direction_output; |
562 | gc->set = vf610_gpio_set; |
563 | |
564 | + ic = &port->ic; |
565 | + ic->name = "gpio-vf610"; |
566 | + ic->irq_ack = vf610_gpio_irq_ack; |
567 | + ic->irq_mask = vf610_gpio_irq_mask; |
568 | + ic->irq_unmask = vf610_gpio_irq_unmask; |
569 | + ic->irq_set_type = vf610_gpio_irq_set_type; |
570 | + ic->irq_set_wake = vf610_gpio_irq_set_wake; |
571 | + |
572 | ret = gpiochip_add_data(gc, port); |
573 | if (ret < 0) |
574 | return ret; |
575 | @@ -306,14 +305,13 @@ static int vf610_gpio_probe(struct platform_device *pdev) |
576 | /* Clear the interrupt status register for all GPIO's */ |
577 | vf610_gpio_writel(~0, port->base + PORT_ISFR); |
578 | |
579 | - ret = gpiochip_irqchip_add(gc, &vf610_gpio_irq_chip, 0, |
580 | - handle_edge_irq, IRQ_TYPE_NONE); |
581 | + ret = gpiochip_irqchip_add(gc, ic, 0, handle_edge_irq, IRQ_TYPE_NONE); |
582 | if (ret) { |
583 | dev_err(dev, "failed to add irqchip\n"); |
584 | gpiochip_remove(gc); |
585 | return ret; |
586 | } |
587 | - gpiochip_set_chained_irqchip(gc, &vf610_gpio_irq_chip, port->irq, |
588 | + gpiochip_set_chained_irqchip(gc, ic, port->irq, |
589 | vf610_gpio_irq_handler); |
590 | |
591 | return 0; |
592 | diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp.c |
593 | index bf8b68f8db4f..bce5741f2952 100644 |
594 | --- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp.c |
595 | +++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp.c |
596 | @@ -388,6 +388,10 @@ void dpp1_cnv_setup ( |
597 | default: |
598 | break; |
599 | } |
600 | + |
601 | + /* Set default color space based on format if none is given. */ |
602 | + color_space = input_color_space ? input_color_space : color_space; |
603 | + |
604 | REG_SET(CNVC_SURFACE_PIXEL_FORMAT, 0, |
605 | CNVC_SURFACE_PIXEL_FORMAT, pixel_format); |
606 | REG_UPDATE(FORMAT_CONTROL, FORMAT_CONTROL__ALPHA_EN, alpha_en); |
607 | @@ -399,7 +403,7 @@ void dpp1_cnv_setup ( |
608 | for (i = 0; i < 12; i++) |
609 | tbl_entry.regval[i] = input_csc_color_matrix.matrix[i]; |
610 | |
611 | - tbl_entry.color_space = input_color_space; |
612 | + tbl_entry.color_space = color_space; |
613 | |
614 | if (color_space >= COLOR_SPACE_YCBCR601) |
615 | select = INPUT_CSC_SELECT_ICSC; |
616 | diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c |
617 | index a0355709abd1..7736ef123e9b 100644 |
618 | --- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c |
619 | +++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c |
620 | @@ -1890,7 +1890,7 @@ static void update_dpp(struct dpp *dpp, struct dc_plane_state *plane_state) |
621 | plane_state->format, |
622 | EXPANSION_MODE_ZERO, |
623 | plane_state->input_csc_color_matrix, |
624 | - COLOR_SPACE_YCBCR601_LIMITED); |
625 | + plane_state->color_space); |
626 | |
627 | //set scale and bias registers |
628 | build_prescale_params(&bns_params, plane_state); |
629 | diff --git a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c |
630 | index 85c2d407a52e..e7ddd3e3db92 100644 |
631 | --- a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c |
632 | +++ b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c |
633 | @@ -747,11 +747,11 @@ static void adv7511_mode_set(struct adv7511 *adv7511, |
634 | vsync_polarity = 1; |
635 | } |
636 | |
637 | - if (mode->vrefresh <= 24000) |
638 | + if (drm_mode_vrefresh(mode) <= 24) |
639 | low_refresh_rate = ADV7511_LOW_REFRESH_RATE_24HZ; |
640 | - else if (mode->vrefresh <= 25000) |
641 | + else if (drm_mode_vrefresh(mode) <= 25) |
642 | low_refresh_rate = ADV7511_LOW_REFRESH_RATE_25HZ; |
643 | - else if (mode->vrefresh <= 30000) |
644 | + else if (drm_mode_vrefresh(mode) <= 30) |
645 | low_refresh_rate = ADV7511_LOW_REFRESH_RATE_30HZ; |
646 | else |
647 | low_refresh_rate = ADV7511_LOW_REFRESH_RATE_NONE; |
648 | diff --git a/drivers/gpu/drm/nouveau/Kconfig b/drivers/gpu/drm/nouveau/Kconfig |
649 | index 00d9d77f583a..4b75ad40dd80 100644 |
650 | --- a/drivers/gpu/drm/nouveau/Kconfig |
651 | +++ b/drivers/gpu/drm/nouveau/Kconfig |
652 | @@ -16,20 +16,9 @@ config DRM_NOUVEAU |
653 | select INPUT if ACPI && X86 |
654 | select THERMAL if ACPI && X86 |
655 | select ACPI_VIDEO if ACPI && X86 |
656 | - help |
657 | - Choose this option for open-source NVIDIA support. |
658 | - |
659 | -config NOUVEAU_LEGACY_CTX_SUPPORT |
660 | - bool "Nouveau legacy context support" |
661 | - depends on DRM_NOUVEAU |
662 | select DRM_VM |
663 | - default y |
664 | help |
665 | - There was a version of the nouveau DDX that relied on legacy |
666 | - ctx ioctls not erroring out. But that was back in time a long |
667 | - ways, so offer a way to disable it now. For uapi compat with |
668 | - old nouveau ddx this should be on by default, but modern distros |
669 | - should consider turning it off. |
670 | + Choose this option for open-source NVIDIA support. |
671 | |
672 | config NOUVEAU_PLATFORM_DRIVER |
673 | bool "Nouveau (NVIDIA) SoC GPUs" |
674 | diff --git a/drivers/gpu/drm/nouveau/dispnv50/disp.h b/drivers/gpu/drm/nouveau/dispnv50/disp.h |
675 | index e48c5eb35b49..66c125a6b0b3 100644 |
676 | --- a/drivers/gpu/drm/nouveau/dispnv50/disp.h |
677 | +++ b/drivers/gpu/drm/nouveau/dispnv50/disp.h |
678 | @@ -41,6 +41,7 @@ struct nv50_disp_interlock { |
679 | NV50_DISP_INTERLOCK__SIZE |
680 | } type; |
681 | u32 data; |
682 | + u32 wimm; |
683 | }; |
684 | |
685 | void corec37d_ntfy_init(struct nouveau_bo *, u32); |
686 | diff --git a/drivers/gpu/drm/nouveau/dispnv50/head.c b/drivers/gpu/drm/nouveau/dispnv50/head.c |
687 | index 4f57e5379796..d81a99bb2ac3 100644 |
688 | --- a/drivers/gpu/drm/nouveau/dispnv50/head.c |
689 | +++ b/drivers/gpu/drm/nouveau/dispnv50/head.c |
690 | @@ -306,7 +306,7 @@ nv50_head_atomic_check(struct drm_crtc *crtc, struct drm_crtc_state *state) |
691 | asyh->set.or = head->func->or != NULL; |
692 | } |
693 | |
694 | - if (asyh->state.mode_changed) |
695 | + if (asyh->state.mode_changed || asyh->state.connectors_changed) |
696 | nv50_head_atomic_check_mode(head, asyh); |
697 | |
698 | if (asyh->state.color_mgmt_changed || |
699 | diff --git a/drivers/gpu/drm/nouveau/dispnv50/wimmc37b.c b/drivers/gpu/drm/nouveau/dispnv50/wimmc37b.c |
700 | index 9103b8494279..f7dbd965e4e7 100644 |
701 | --- a/drivers/gpu/drm/nouveau/dispnv50/wimmc37b.c |
702 | +++ b/drivers/gpu/drm/nouveau/dispnv50/wimmc37b.c |
703 | @@ -75,6 +75,7 @@ wimmc37b_init_(const struct nv50_wimm_func *func, struct nouveau_drm *drm, |
704 | return ret; |
705 | } |
706 | |
707 | + wndw->interlock.wimm = wndw->interlock.data; |
708 | wndw->immd = func; |
709 | return 0; |
710 | } |
711 | diff --git a/drivers/gpu/drm/nouveau/dispnv50/wndw.c b/drivers/gpu/drm/nouveau/dispnv50/wndw.c |
712 | index 2187922e8dc2..b3db4553098d 100644 |
713 | --- a/drivers/gpu/drm/nouveau/dispnv50/wndw.c |
714 | +++ b/drivers/gpu/drm/nouveau/dispnv50/wndw.c |
715 | @@ -151,7 +151,7 @@ nv50_wndw_flush_set(struct nv50_wndw *wndw, u32 *interlock, |
716 | if (asyw->set.point) { |
717 | if (asyw->set.point = false, asyw->set.mask) |
718 | interlock[wndw->interlock.type] |= wndw->interlock.data; |
719 | - interlock[NV50_DISP_INTERLOCK_WIMM] |= wndw->interlock.data; |
720 | + interlock[NV50_DISP_INTERLOCK_WIMM] |= wndw->interlock.wimm; |
721 | |
722 | wndw->immd->point(wndw, asyw); |
723 | wndw->immd->update(wndw, interlock); |
724 | diff --git a/drivers/gpu/drm/nouveau/nouveau_drm.c b/drivers/gpu/drm/nouveau/nouveau_drm.c |
725 | index 2b7a54cc3c9e..74d2283f2c28 100644 |
726 | --- a/drivers/gpu/drm/nouveau/nouveau_drm.c |
727 | +++ b/drivers/gpu/drm/nouveau/nouveau_drm.c |
728 | @@ -1015,11 +1015,8 @@ nouveau_driver_fops = { |
729 | static struct drm_driver |
730 | driver_stub = { |
731 | .driver_features = |
732 | - DRIVER_GEM | DRIVER_MODESET | DRIVER_PRIME | DRIVER_RENDER |
733 | -#if defined(CONFIG_NOUVEAU_LEGACY_CTX_SUPPORT) |
734 | - | DRIVER_KMS_LEGACY_CONTEXT |
735 | -#endif |
736 | - , |
737 | + DRIVER_GEM | DRIVER_MODESET | DRIVER_PRIME | DRIVER_RENDER | |
738 | + DRIVER_KMS_LEGACY_CONTEXT, |
739 | |
740 | .load = nouveau_drm_load, |
741 | .unload = nouveau_drm_unload, |
742 | diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/disp/dp.c b/drivers/gpu/drm/nouveau/nvkm/engine/disp/dp.c |
743 | index 5f301e632599..818d21bd28d3 100644 |
744 | --- a/drivers/gpu/drm/nouveau/nvkm/engine/disp/dp.c |
745 | +++ b/drivers/gpu/drm/nouveau/nvkm/engine/disp/dp.c |
746 | @@ -365,8 +365,15 @@ nvkm_dp_train(struct nvkm_dp *dp, u32 dataKBps) |
747 | * and it's better to have a failed modeset than that. |
748 | */ |
749 | for (cfg = nvkm_dp_rates; cfg->rate; cfg++) { |
750 | - if (cfg->nr <= outp_nr && cfg->nr <= outp_bw) |
751 | - failsafe = cfg; |
752 | + if (cfg->nr <= outp_nr && cfg->nr <= outp_bw) { |
753 | + /* Try to respect sink limits too when selecting |
754 | + * lowest link configuration. |
755 | + */ |
756 | + if (!failsafe || |
757 | + (cfg->nr <= sink_nr && cfg->bw <= sink_bw)) |
758 | + failsafe = cfg; |
759 | + } |
760 | + |
761 | if (failsafe && cfg[1].rate < dataKBps) |
762 | break; |
763 | } |
764 | diff --git a/drivers/gpu/drm/pl111/pl111_display.c b/drivers/gpu/drm/pl111/pl111_display.c |
765 | index 754f6b25f265..6d9f78612dee 100644 |
766 | --- a/drivers/gpu/drm/pl111/pl111_display.c |
767 | +++ b/drivers/gpu/drm/pl111/pl111_display.c |
768 | @@ -531,14 +531,15 @@ pl111_init_clock_divider(struct drm_device *drm) |
769 | dev_err(drm->dev, "CLCD: unable to get clcdclk.\n"); |
770 | return PTR_ERR(parent); |
771 | } |
772 | + |
773 | + spin_lock_init(&priv->tim2_lock); |
774 | + |
775 | /* If the clock divider is broken, use the parent directly */ |
776 | if (priv->variant->broken_clockdivider) { |
777 | priv->clk = parent; |
778 | return 0; |
779 | } |
780 | parent_name = __clk_get_name(parent); |
781 | - |
782 | - spin_lock_init(&priv->tim2_lock); |
783 | div->init = &init; |
784 | |
785 | ret = devm_clk_hw_register(drm->dev, div); |
786 | diff --git a/drivers/gpu/drm/vc4/vc4_plane.c b/drivers/gpu/drm/vc4/vc4_plane.c |
787 | index ab39315c9078..39e608271263 100644 |
788 | --- a/drivers/gpu/drm/vc4/vc4_plane.c |
789 | +++ b/drivers/gpu/drm/vc4/vc4_plane.c |
790 | @@ -818,6 +818,7 @@ static void vc4_plane_atomic_async_update(struct drm_plane *plane, |
791 | drm_atomic_set_fb_for_plane(plane->state, state->fb); |
792 | } |
793 | |
794 | + swap(plane->state->fb, state->fb); |
795 | /* Set the cursor's position on the screen. This is the |
796 | * expected change from the drm_mode_cursor_universal() |
797 | * helper. |
798 | diff --git a/drivers/iommu/arm-smmu-v3.c b/drivers/iommu/arm-smmu-v3.c |
799 | index 9ae3678844eb..40fbf20d69e5 100644 |
800 | --- a/drivers/iommu/arm-smmu-v3.c |
801 | +++ b/drivers/iommu/arm-smmu-v3.c |
802 | @@ -2414,13 +2414,9 @@ static int arm_smmu_device_reset(struct arm_smmu_device *smmu, bool bypass) |
803 | /* Clear CR0 and sync (disables SMMU and queue processing) */ |
804 | reg = readl_relaxed(smmu->base + ARM_SMMU_CR0); |
805 | if (reg & CR0_SMMUEN) { |
806 | - if (is_kdump_kernel()) { |
807 | - arm_smmu_update_gbpa(smmu, GBPA_ABORT, 0); |
808 | - arm_smmu_device_disable(smmu); |
809 | - return -EBUSY; |
810 | - } |
811 | - |
812 | dev_warn(smmu->dev, "SMMU currently enabled! Resetting...\n"); |
813 | + WARN_ON(is_kdump_kernel() && !disable_bypass); |
814 | + arm_smmu_update_gbpa(smmu, GBPA_ABORT, 0); |
815 | } |
816 | |
817 | ret = arm_smmu_device_disable(smmu); |
818 | @@ -2513,6 +2509,8 @@ static int arm_smmu_device_reset(struct arm_smmu_device *smmu, bool bypass) |
819 | return ret; |
820 | } |
821 | |
822 | + if (is_kdump_kernel()) |
823 | + enables &= ~(CR0_EVTQEN | CR0_PRIQEN); |
824 | |
825 | /* Enable the SMMU interface, or ensure bypass */ |
826 | if (!bypass || disable_bypass) { |
827 | diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c |
828 | index 603bf5233a99..c1439019dd12 100644 |
829 | --- a/drivers/iommu/intel-iommu.c |
830 | +++ b/drivers/iommu/intel-iommu.c |
831 | @@ -4033,9 +4033,7 @@ static void __init init_no_remapping_devices(void) |
832 | |
833 | /* This IOMMU has *only* gfx devices. Either bypass it or |
834 | set the gfx_mapped flag, as appropriate */ |
835 | - if (dmar_map_gfx) { |
836 | - intel_iommu_gfx_mapped = 1; |
837 | - } else { |
838 | + if (!dmar_map_gfx) { |
839 | drhd->ignored = 1; |
840 | for_each_active_dev_scope(drhd->devices, |
841 | drhd->devices_cnt, i, dev) |
842 | @@ -4831,6 +4829,9 @@ int __init intel_iommu_init(void) |
843 | goto out_free_reserved_range; |
844 | } |
845 | |
846 | + if (dmar_map_gfx) |
847 | + intel_iommu_gfx_mapped = 1; |
848 | + |
849 | init_no_remapping_devices(); |
850 | |
851 | ret = init_dmars(); |
852 | diff --git a/drivers/mailbox/stm32-ipcc.c b/drivers/mailbox/stm32-ipcc.c |
853 | index 533b0da5235d..ca1f993c0de3 100644 |
854 | --- a/drivers/mailbox/stm32-ipcc.c |
855 | +++ b/drivers/mailbox/stm32-ipcc.c |
856 | @@ -8,9 +8,9 @@ |
857 | #include <linux/bitfield.h> |
858 | #include <linux/clk.h> |
859 | #include <linux/interrupt.h> |
860 | +#include <linux/io.h> |
861 | #include <linux/mailbox_controller.h> |
862 | #include <linux/module.h> |
863 | -#include <linux/of_irq.h> |
864 | #include <linux/platform_device.h> |
865 | #include <linux/pm_wakeirq.h> |
866 | |
867 | @@ -240,9 +240,11 @@ static int stm32_ipcc_probe(struct platform_device *pdev) |
868 | |
869 | /* irq */ |
870 | for (i = 0; i < IPCC_IRQ_NUM; i++) { |
871 | - ipcc->irqs[i] = of_irq_get_byname(dev->of_node, irq_name[i]); |
872 | + ipcc->irqs[i] = platform_get_irq_byname(pdev, irq_name[i]); |
873 | if (ipcc->irqs[i] < 0) { |
874 | - dev_err(dev, "no IRQ specified %s\n", irq_name[i]); |
875 | + if (ipcc->irqs[i] != -EPROBE_DEFER) |
876 | + dev_err(dev, "no IRQ specified %s\n", |
877 | + irq_name[i]); |
878 | ret = ipcc->irqs[i]; |
879 | goto err_clk; |
880 | } |
881 | @@ -263,9 +265,10 @@ static int stm32_ipcc_probe(struct platform_device *pdev) |
882 | |
883 | /* wakeup */ |
884 | if (of_property_read_bool(np, "wakeup-source")) { |
885 | - ipcc->wkp = of_irq_get_byname(dev->of_node, "wakeup"); |
886 | + ipcc->wkp = platform_get_irq_byname(pdev, "wakeup"); |
887 | if (ipcc->wkp < 0) { |
888 | - dev_err(dev, "could not get wakeup IRQ\n"); |
889 | + if (ipcc->wkp != -EPROBE_DEFER) |
890 | + dev_err(dev, "could not get wakeup IRQ\n"); |
891 | ret = ipcc->wkp; |
892 | goto err_clk; |
893 | } |
894 | diff --git a/drivers/mfd/intel-lpss.c b/drivers/mfd/intel-lpss.c |
895 | index 50bffc3382d7..ff3fba16e735 100644 |
896 | --- a/drivers/mfd/intel-lpss.c |
897 | +++ b/drivers/mfd/intel-lpss.c |
898 | @@ -273,6 +273,9 @@ static void intel_lpss_init_dev(const struct intel_lpss *lpss) |
899 | { |
900 | u32 value = LPSS_PRIV_SSP_REG_DIS_DMA_FIN; |
901 | |
902 | + /* Set the device in reset state */ |
903 | + writel(0, lpss->priv + LPSS_PRIV_RESETS); |
904 | + |
905 | intel_lpss_deassert_reset(lpss); |
906 | |
907 | intel_lpss_set_remap_addr(lpss); |
908 | diff --git a/drivers/mfd/tps65912-spi.c b/drivers/mfd/tps65912-spi.c |
909 | index 3bd75061f777..f78be039e463 100644 |
910 | --- a/drivers/mfd/tps65912-spi.c |
911 | +++ b/drivers/mfd/tps65912-spi.c |
912 | @@ -27,6 +27,7 @@ static const struct of_device_id tps65912_spi_of_match_table[] = { |
913 | { .compatible = "ti,tps65912", }, |
914 | { /* sentinel */ } |
915 | }; |
916 | +MODULE_DEVICE_TABLE(of, tps65912_spi_of_match_table); |
917 | |
918 | static int tps65912_spi_probe(struct spi_device *spi) |
919 | { |
920 | diff --git a/drivers/mfd/twl6040.c b/drivers/mfd/twl6040.c |
921 | index dd19f17a1b63..2b8c479dbfa6 100644 |
922 | --- a/drivers/mfd/twl6040.c |
923 | +++ b/drivers/mfd/twl6040.c |
924 | @@ -322,8 +322,19 @@ int twl6040_power(struct twl6040 *twl6040, int on) |
925 | } |
926 | } |
927 | |
928 | + /* |
929 | + * Register access can produce errors after power-up unless we |
930 | + * wait at least 8ms based on measurements on duovero. |
931 | + */ |
932 | + usleep_range(10000, 12000); |
933 | + |
934 | /* Sync with the HW */ |
935 | - regcache_sync(twl6040->regmap); |
936 | + ret = regcache_sync(twl6040->regmap); |
937 | + if (ret) { |
938 | + dev_err(twl6040->dev, "Failed to sync with the HW: %i\n", |
939 | + ret); |
940 | + goto out; |
941 | + } |
942 | |
943 | /* Default PLL configuration after power up */ |
944 | twl6040->pll = TWL6040_SYSCLK_SEL_LPPLL; |
945 | diff --git a/drivers/misc/pci_endpoint_test.c b/drivers/misc/pci_endpoint_test.c |
946 | index 896e2df9400f..fd33a3b9c66f 100644 |
947 | --- a/drivers/misc/pci_endpoint_test.c |
948 | +++ b/drivers/misc/pci_endpoint_test.c |
949 | @@ -662,6 +662,7 @@ static int pci_endpoint_test_probe(struct pci_dev *pdev, |
950 | data = (struct pci_endpoint_test_data *)ent->driver_data; |
951 | if (data) { |
952 | test_reg_bar = data->test_reg_bar; |
953 | + test->test_reg_bar = test_reg_bar; |
954 | test->alignment = data->alignment; |
955 | irq_type = data->irq_type; |
956 | } |
957 | diff --git a/drivers/mmc/host/mmci.c b/drivers/mmc/host/mmci.c |
958 | index 1841d250e9e2..eb1a65cb878f 100644 |
959 | --- a/drivers/mmc/host/mmci.c |
960 | +++ b/drivers/mmc/host/mmci.c |
961 | @@ -1295,9 +1295,10 @@ static irqreturn_t mmci_irq(int irq, void *dev_id) |
962 | } |
963 | |
964 | /* |
965 | - * Don't poll for busy completion in irq context. |
966 | + * Busy detection has been handled by mmci_cmd_irq() above. |
967 | + * Clear the status bit to prevent polling in IRQ context. |
968 | */ |
969 | - if (host->variant->busy_detect && host->busy_status) |
970 | + if (host->variant->busy_detect_flag) |
971 | status &= ~host->variant->busy_detect_flag; |
972 | |
973 | ret = 1; |
974 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c |
975 | index 340baf6a470c..4648c6a9d9e8 100644 |
976 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c |
977 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c |
978 | @@ -4300,8 +4300,11 @@ int hclge_add_uc_addr_common(struct hclge_vport *vport, |
979 | return hclge_add_mac_vlan_tbl(vport, &req, NULL); |
980 | |
981 | /* check if we just hit the duplicate */ |
982 | - if (!ret) |
983 | - ret = -EINVAL; |
984 | + if (!ret) { |
985 | + dev_warn(&hdev->pdev->dev, "VF %d mac(%pM) exists\n", |
986 | + vport->vport_id, addr); |
987 | + return 0; |
988 | + } |
989 | |
990 | dev_err(&hdev->pdev->dev, |
991 | "PF failed to add unicast entry(%pM) in the MAC table\n", |
992 | diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c |
993 | index df8808cd7e11..4e04985fb430 100644 |
994 | --- a/drivers/net/ethernet/intel/i40e/i40e_main.c |
995 | +++ b/drivers/net/ethernet/intel/i40e/i40e_main.c |
996 | @@ -6758,10 +6758,12 @@ static int i40e_setup_tc(struct net_device *netdev, void *type_data) |
997 | struct i40e_pf *pf = vsi->back; |
998 | u8 enabled_tc = 0, num_tc, hw; |
999 | bool need_reset = false; |
1000 | + int old_queue_pairs; |
1001 | int ret = -EINVAL; |
1002 | u16 mode; |
1003 | int i; |
1004 | |
1005 | + old_queue_pairs = vsi->num_queue_pairs; |
1006 | num_tc = mqprio_qopt->qopt.num_tc; |
1007 | hw = mqprio_qopt->qopt.hw; |
1008 | mode = mqprio_qopt->mode; |
1009 | @@ -6862,6 +6864,7 @@ config_tc: |
1010 | } |
1011 | ret = i40e_configure_queue_channels(vsi); |
1012 | if (ret) { |
1013 | + vsi->num_queue_pairs = old_queue_pairs; |
1014 | netdev_info(netdev, |
1015 | "Failed configuring queue channels\n"); |
1016 | need_reset = true; |
1017 | diff --git a/drivers/net/ethernet/intel/ice/ice_main.c b/drivers/net/ethernet/intel/ice/ice_main.c |
1018 | index db1543bca701..875f97aba6e0 100644 |
1019 | --- a/drivers/net/ethernet/intel/ice/ice_main.c |
1020 | +++ b/drivers/net/ethernet/intel/ice/ice_main.c |
1021 | @@ -652,6 +652,9 @@ void ice_print_link_msg(struct ice_vsi *vsi, bool isup) |
1022 | case ICE_FC_RX_PAUSE: |
1023 | fc = "RX"; |
1024 | break; |
1025 | + case ICE_FC_NONE: |
1026 | + fc = "None"; |
1027 | + break; |
1028 | default: |
1029 | fc = "Unknown"; |
1030 | break; |
1031 | diff --git a/drivers/net/thunderbolt.c b/drivers/net/thunderbolt.c |
1032 | index e0d6760f3219..4b5af2413970 100644 |
1033 | --- a/drivers/net/thunderbolt.c |
1034 | +++ b/drivers/net/thunderbolt.c |
1035 | @@ -1285,6 +1285,7 @@ static int __maybe_unused tbnet_suspend(struct device *dev) |
1036 | tbnet_tear_down(net, true); |
1037 | } |
1038 | |
1039 | + tb_unregister_protocol_handler(&net->handler); |
1040 | return 0; |
1041 | } |
1042 | |
1043 | @@ -1293,6 +1294,8 @@ static int __maybe_unused tbnet_resume(struct device *dev) |
1044 | struct tb_service *svc = tb_to_service(dev); |
1045 | struct tbnet *net = tb_service_get_drvdata(svc); |
1046 | |
1047 | + tb_register_protocol_handler(&net->handler); |
1048 | + |
1049 | netif_carrier_off(net->dev); |
1050 | if (netif_running(net->dev)) { |
1051 | netif_device_attach(net->dev); |
1052 | diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c |
1053 | index 7b9ef8e734e7..c8eeecc58115 100644 |
1054 | --- a/drivers/nvme/host/pci.c |
1055 | +++ b/drivers/nvme/host/pci.c |
1056 | @@ -1132,6 +1132,7 @@ static enum blk_eh_timer_return nvme_timeout(struct request *req, bool reserved) |
1057 | struct nvme_dev *dev = nvmeq->dev; |
1058 | struct request *abort_req; |
1059 | struct nvme_command cmd; |
1060 | + bool shutdown = false; |
1061 | u32 csts = readl(dev->bar + NVME_REG_CSTS); |
1062 | |
1063 | /* If PCI error recovery process is happening, we cannot reset or |
1064 | @@ -1168,12 +1169,14 @@ static enum blk_eh_timer_return nvme_timeout(struct request *req, bool reserved) |
1065 | * shutdown, so we return BLK_EH_DONE. |
1066 | */ |
1067 | switch (dev->ctrl.state) { |
1068 | + case NVME_CTRL_DELETING: |
1069 | + shutdown = true; |
1070 | case NVME_CTRL_CONNECTING: |
1071 | case NVME_CTRL_RESETTING: |
1072 | dev_warn_ratelimited(dev->ctrl.device, |
1073 | "I/O %d QID %d timeout, disable controller\n", |
1074 | req->tag, nvmeq->qid); |
1075 | - nvme_dev_disable(dev, false); |
1076 | + nvme_dev_disable(dev, shutdown); |
1077 | nvme_req(req)->flags |= NVME_REQ_CANCELLED; |
1078 | return BLK_EH_DONE; |
1079 | default: |
1080 | @@ -2187,8 +2190,11 @@ static void nvme_dev_disable(struct nvme_dev *dev, bool shutdown) |
1081 | * must flush all entered requests to their failed completion to avoid |
1082 | * deadlocking blk-mq hot-cpu notifier. |
1083 | */ |
1084 | - if (shutdown) |
1085 | + if (shutdown) { |
1086 | nvme_start_queues(&dev->ctrl); |
1087 | + if (dev->ctrl.admin_q && !blk_queue_dying(dev->ctrl.admin_q)) |
1088 | + blk_mq_unquiesce_queue(dev->ctrl.admin_q); |
1089 | + } |
1090 | mutex_unlock(&dev->shutdown_lock); |
1091 | } |
1092 | |
1093 | diff --git a/drivers/nvmem/core.c b/drivers/nvmem/core.c |
1094 | index 7c530c88b3fb..99de51e87f7f 100644 |
1095 | --- a/drivers/nvmem/core.c |
1096 | +++ b/drivers/nvmem/core.c |
1097 | @@ -1028,7 +1028,7 @@ EXPORT_SYMBOL_GPL(nvmem_cell_put); |
1098 | static void nvmem_shift_read_buffer_in_place(struct nvmem_cell *cell, void *buf) |
1099 | { |
1100 | u8 *p, *b; |
1101 | - int i, bit_offset = cell->bit_offset; |
1102 | + int i, extra, bit_offset = cell->bit_offset; |
1103 | |
1104 | p = b = buf; |
1105 | if (bit_offset) { |
1106 | @@ -1043,11 +1043,16 @@ static void nvmem_shift_read_buffer_in_place(struct nvmem_cell *cell, void *buf) |
1107 | p = b; |
1108 | *b++ >>= bit_offset; |
1109 | } |
1110 | - |
1111 | - /* result fits in less bytes */ |
1112 | - if (cell->bytes != DIV_ROUND_UP(cell->nbits, BITS_PER_BYTE)) |
1113 | - *p-- = 0; |
1114 | + } else { |
1115 | + /* point to the msb */ |
1116 | + p += cell->bytes - 1; |
1117 | } |
1118 | + |
1119 | + /* result fits in less bytes */ |
1120 | + extra = cell->bytes - DIV_ROUND_UP(cell->nbits, BITS_PER_BYTE); |
1121 | + while (--extra >= 0) |
1122 | + *p-- = 0; |
1123 | + |
1124 | /* clear msb bits if any leftover in the last byte */ |
1125 | *p &= GENMASK((cell->nbits%BITS_PER_BYTE) - 1, 0); |
1126 | } |
1127 | diff --git a/drivers/nvmem/sunxi_sid.c b/drivers/nvmem/sunxi_sid.c |
1128 | index d020f89248fd..69f8e972e29c 100644 |
1129 | --- a/drivers/nvmem/sunxi_sid.c |
1130 | +++ b/drivers/nvmem/sunxi_sid.c |
1131 | @@ -235,8 +235,10 @@ static const struct sunxi_sid_cfg sun50i_a64_cfg = { |
1132 | static const struct of_device_id sunxi_sid_of_match[] = { |
1133 | { .compatible = "allwinner,sun4i-a10-sid", .data = &sun4i_a10_cfg }, |
1134 | { .compatible = "allwinner,sun7i-a20-sid", .data = &sun7i_a20_cfg }, |
1135 | + { .compatible = "allwinner,sun8i-a83t-sid", .data = &sun50i_a64_cfg }, |
1136 | { .compatible = "allwinner,sun8i-h3-sid", .data = &sun8i_h3_cfg }, |
1137 | { .compatible = "allwinner,sun50i-a64-sid", .data = &sun50i_a64_cfg }, |
1138 | + { .compatible = "allwinner,sun50i-h5-sid", .data = &sun50i_a64_cfg }, |
1139 | {/* sentinel */}, |
1140 | }; |
1141 | MODULE_DEVICE_TABLE(of, sunxi_sid_of_match); |
1142 | diff --git a/drivers/pci/controller/dwc/pci-keystone.c b/drivers/pci/controller/dwc/pci-keystone.c |
1143 | index e88bd221fffe..5e199e7d2d4f 100644 |
1144 | --- a/drivers/pci/controller/dwc/pci-keystone.c |
1145 | +++ b/drivers/pci/controller/dwc/pci-keystone.c |
1146 | @@ -237,6 +237,7 @@ static void ks_pcie_setup_interrupts(struct keystone_pcie *ks_pcie) |
1147 | ks_dw_pcie_enable_error_irq(ks_pcie); |
1148 | } |
1149 | |
1150 | +#ifdef CONFIG_ARM |
1151 | /* |
1152 | * When a PCI device does not exist during config cycles, keystone host gets a |
1153 | * bus error instead of returning 0xffffffff. This handler always returns 0 |
1154 | @@ -256,6 +257,7 @@ static int keystone_pcie_fault(unsigned long addr, unsigned int fsr, |
1155 | |
1156 | return 0; |
1157 | } |
1158 | +#endif |
1159 | |
1160 | static int __init ks_pcie_host_init(struct pcie_port *pp) |
1161 | { |
1162 | @@ -279,12 +281,14 @@ static int __init ks_pcie_host_init(struct pcie_port *pp) |
1163 | val |= BIT(12); |
1164 | writel(val, pci->dbi_base + PCIE_CAP_BASE + PCI_EXP_DEVCTL); |
1165 | |
1166 | +#ifdef CONFIG_ARM |
1167 | /* |
1168 | * PCIe access errors that result into OCP errors are caught by ARM as |
1169 | * "External aborts" |
1170 | */ |
1171 | hook_fault_code(17, keystone_pcie_fault, SIGBUS, 0, |
1172 | "Asynchronous external abort"); |
1173 | +#endif |
1174 | |
1175 | return 0; |
1176 | } |
1177 | diff --git a/drivers/pci/controller/dwc/pcie-designware-ep.c b/drivers/pci/controller/dwc/pcie-designware-ep.c |
1178 | index de8635af4cde..739d97080d3b 100644 |
1179 | --- a/drivers/pci/controller/dwc/pcie-designware-ep.c |
1180 | +++ b/drivers/pci/controller/dwc/pcie-designware-ep.c |
1181 | @@ -385,6 +385,7 @@ int dw_pcie_ep_raise_msi_irq(struct dw_pcie_ep *ep, u8 func_no, |
1182 | { |
1183 | struct dw_pcie *pci = to_dw_pcie_from_ep(ep); |
1184 | struct pci_epc *epc = ep->epc; |
1185 | + unsigned int aligned_offset; |
1186 | u16 msg_ctrl, msg_data; |
1187 | u32 msg_addr_lower, msg_addr_upper, reg; |
1188 | u64 msg_addr; |
1189 | @@ -410,13 +411,15 @@ int dw_pcie_ep_raise_msi_irq(struct dw_pcie_ep *ep, u8 func_no, |
1190 | reg = ep->msi_cap + PCI_MSI_DATA_32; |
1191 | msg_data = dw_pcie_readw_dbi(pci, reg); |
1192 | } |
1193 | - msg_addr = ((u64) msg_addr_upper) << 32 | msg_addr_lower; |
1194 | + aligned_offset = msg_addr_lower & (epc->mem->page_size - 1); |
1195 | + msg_addr = ((u64)msg_addr_upper) << 32 | |
1196 | + (msg_addr_lower & ~aligned_offset); |
1197 | ret = dw_pcie_ep_map_addr(epc, func_no, ep->msi_mem_phys, msg_addr, |
1198 | epc->mem->page_size); |
1199 | if (ret) |
1200 | return ret; |
1201 | |
1202 | - writel(msg_data | (interrupt_num - 1), ep->msi_mem); |
1203 | + writel(msg_data | (interrupt_num - 1), ep->msi_mem + aligned_offset); |
1204 | |
1205 | dw_pcie_ep_unmap_addr(epc, func_no, ep->msi_mem_phys); |
1206 | |
1207 | diff --git a/drivers/pci/controller/dwc/pcie-designware-host.c b/drivers/pci/controller/dwc/pcie-designware-host.c |
1208 | index b56e22262a77..acd50920c2ff 100644 |
1209 | --- a/drivers/pci/controller/dwc/pcie-designware-host.c |
1210 | +++ b/drivers/pci/controller/dwc/pcie-designware-host.c |
1211 | @@ -303,20 +303,24 @@ void dw_pcie_free_msi(struct pcie_port *pp) |
1212 | |
1213 | irq_domain_remove(pp->msi_domain); |
1214 | irq_domain_remove(pp->irq_domain); |
1215 | + |
1216 | + if (pp->msi_page) |
1217 | + __free_page(pp->msi_page); |
1218 | } |
1219 | |
1220 | void dw_pcie_msi_init(struct pcie_port *pp) |
1221 | { |
1222 | struct dw_pcie *pci = to_dw_pcie_from_pp(pp); |
1223 | struct device *dev = pci->dev; |
1224 | - struct page *page; |
1225 | u64 msi_target; |
1226 | |
1227 | - page = alloc_page(GFP_KERNEL); |
1228 | - pp->msi_data = dma_map_page(dev, page, 0, PAGE_SIZE, DMA_FROM_DEVICE); |
1229 | + pp->msi_page = alloc_page(GFP_KERNEL); |
1230 | + pp->msi_data = dma_map_page(dev, pp->msi_page, 0, PAGE_SIZE, |
1231 | + DMA_FROM_DEVICE); |
1232 | if (dma_mapping_error(dev, pp->msi_data)) { |
1233 | dev_err(dev, "Failed to map MSI data\n"); |
1234 | - __free_page(page); |
1235 | + __free_page(pp->msi_page); |
1236 | + pp->msi_page = NULL; |
1237 | return; |
1238 | } |
1239 | msi_target = (u64)pp->msi_data; |
1240 | @@ -439,7 +443,7 @@ int dw_pcie_host_init(struct pcie_port *pp) |
1241 | if (ret) |
1242 | pci->num_viewport = 2; |
1243 | |
1244 | - if (IS_ENABLED(CONFIG_PCI_MSI) && pci_msi_enabled()) { |
1245 | + if (pci_msi_enabled()) { |
1246 | /* |
1247 | * If a specific SoC driver needs to change the |
1248 | * default number of vectors, it needs to implement |
1249 | @@ -477,7 +481,7 @@ int dw_pcie_host_init(struct pcie_port *pp) |
1250 | if (pp->ops->host_init) { |
1251 | ret = pp->ops->host_init(pp); |
1252 | if (ret) |
1253 | - goto error; |
1254 | + goto err_free_msi; |
1255 | } |
1256 | |
1257 | pp->root_bus_nr = pp->busn->start; |
1258 | @@ -491,7 +495,7 @@ int dw_pcie_host_init(struct pcie_port *pp) |
1259 | |
1260 | ret = pci_scan_root_bus_bridge(bridge); |
1261 | if (ret) |
1262 | - goto error; |
1263 | + goto err_free_msi; |
1264 | |
1265 | bus = bridge->bus; |
1266 | |
1267 | @@ -507,6 +511,9 @@ int dw_pcie_host_init(struct pcie_port *pp) |
1268 | pci_bus_add_devices(bus); |
1269 | return 0; |
1270 | |
1271 | +err_free_msi: |
1272 | + if (pci_msi_enabled() && !pp->ops->msi_host_init) |
1273 | + dw_pcie_free_msi(pp); |
1274 | error: |
1275 | pci_free_host_bridge(bridge); |
1276 | return ret; |
1277 | diff --git a/drivers/pci/controller/dwc/pcie-designware.h b/drivers/pci/controller/dwc/pcie-designware.h |
1278 | index 9f1a5e399b70..14dcf6646699 100644 |
1279 | --- a/drivers/pci/controller/dwc/pcie-designware.h |
1280 | +++ b/drivers/pci/controller/dwc/pcie-designware.h |
1281 | @@ -164,6 +164,7 @@ struct pcie_port { |
1282 | struct irq_domain *irq_domain; |
1283 | struct irq_domain *msi_domain; |
1284 | dma_addr_t msi_data; |
1285 | + struct page *msi_page; |
1286 | u32 num_vectors; |
1287 | u32 irq_status[MAX_MSI_CTRLS]; |
1288 | raw_spinlock_t lock; |
1289 | diff --git a/drivers/pci/controller/pcie-rcar.c b/drivers/pci/controller/pcie-rcar.c |
1290 | index 6a4e435bd35f..9b9c677ad3a0 100644 |
1291 | --- a/drivers/pci/controller/pcie-rcar.c |
1292 | +++ b/drivers/pci/controller/pcie-rcar.c |
1293 | @@ -892,7 +892,7 @@ static int rcar_pcie_enable_msi(struct rcar_pcie *pcie) |
1294 | { |
1295 | struct device *dev = pcie->dev; |
1296 | struct rcar_msi *msi = &pcie->msi; |
1297 | - unsigned long base; |
1298 | + phys_addr_t base; |
1299 | int err, i; |
1300 | |
1301 | mutex_init(&msi->lock); |
1302 | @@ -931,10 +931,14 @@ static int rcar_pcie_enable_msi(struct rcar_pcie *pcie) |
1303 | |
1304 | /* setup MSI data target */ |
1305 | msi->pages = __get_free_pages(GFP_KERNEL, 0); |
1306 | + if (!msi->pages) { |
1307 | + err = -ENOMEM; |
1308 | + goto err; |
1309 | + } |
1310 | base = virt_to_phys((void *)msi->pages); |
1311 | |
1312 | - rcar_pci_write_reg(pcie, base | MSIFE, PCIEMSIALR); |
1313 | - rcar_pci_write_reg(pcie, 0, PCIEMSIAUR); |
1314 | + rcar_pci_write_reg(pcie, lower_32_bits(base) | MSIFE, PCIEMSIALR); |
1315 | + rcar_pci_write_reg(pcie, upper_32_bits(base), PCIEMSIAUR); |
1316 | |
1317 | /* enable all MSI interrupts */ |
1318 | rcar_pci_write_reg(pcie, 0xffffffff, PCIEMSIIER); |
1319 | diff --git a/drivers/pci/controller/pcie-xilinx.c b/drivers/pci/controller/pcie-xilinx.c |
1320 | index 7b1389d8e2a5..ea48cba5480b 100644 |
1321 | --- a/drivers/pci/controller/pcie-xilinx.c |
1322 | +++ b/drivers/pci/controller/pcie-xilinx.c |
1323 | @@ -336,14 +336,19 @@ static const struct irq_domain_ops msi_domain_ops = { |
1324 | * xilinx_pcie_enable_msi - Enable MSI support |
1325 | * @port: PCIe port information |
1326 | */ |
1327 | -static void xilinx_pcie_enable_msi(struct xilinx_pcie_port *port) |
1328 | +static int xilinx_pcie_enable_msi(struct xilinx_pcie_port *port) |
1329 | { |
1330 | phys_addr_t msg_addr; |
1331 | |
1332 | port->msi_pages = __get_free_pages(GFP_KERNEL, 0); |
1333 | + if (!port->msi_pages) |
1334 | + return -ENOMEM; |
1335 | + |
1336 | msg_addr = virt_to_phys((void *)port->msi_pages); |
1337 | pcie_write(port, 0x0, XILINX_PCIE_REG_MSIBASE1); |
1338 | pcie_write(port, msg_addr, XILINX_PCIE_REG_MSIBASE2); |
1339 | + |
1340 | + return 0; |
1341 | } |
1342 | |
1343 | /* INTx Functions */ |
1344 | @@ -498,6 +503,7 @@ static int xilinx_pcie_init_irq_domain(struct xilinx_pcie_port *port) |
1345 | struct device *dev = port->dev; |
1346 | struct device_node *node = dev->of_node; |
1347 | struct device_node *pcie_intc_node; |
1348 | + int ret; |
1349 | |
1350 | /* Setup INTx */ |
1351 | pcie_intc_node = of_get_next_child(node, NULL); |
1352 | @@ -526,7 +532,9 @@ static int xilinx_pcie_init_irq_domain(struct xilinx_pcie_port *port) |
1353 | return -ENODEV; |
1354 | } |
1355 | |
1356 | - xilinx_pcie_enable_msi(port); |
1357 | + ret = xilinx_pcie_enable_msi(port); |
1358 | + if (ret) |
1359 | + return ret; |
1360 | } |
1361 | |
1362 | return 0; |
1363 | diff --git a/drivers/pci/hotplug/rpadlpar_core.c b/drivers/pci/hotplug/rpadlpar_core.c |
1364 | index e2356a9c7088..182f9e3443ee 100644 |
1365 | --- a/drivers/pci/hotplug/rpadlpar_core.c |
1366 | +++ b/drivers/pci/hotplug/rpadlpar_core.c |
1367 | @@ -51,6 +51,7 @@ static struct device_node *find_vio_slot_node(char *drc_name) |
1368 | if (rc == 0) |
1369 | break; |
1370 | } |
1371 | + of_node_put(parent); |
1372 | |
1373 | return dn; |
1374 | } |
1375 | @@ -71,6 +72,7 @@ static struct device_node *find_php_slot_pci_node(char *drc_name, |
1376 | return np; |
1377 | } |
1378 | |
1379 | +/* Returns a device_node with its reference count incremented */ |
1380 | static struct device_node *find_dlpar_node(char *drc_name, int *node_type) |
1381 | { |
1382 | struct device_node *dn; |
1383 | @@ -306,6 +308,7 @@ int dlpar_add_slot(char *drc_name) |
1384 | rc = dlpar_add_phb(drc_name, dn); |
1385 | break; |
1386 | } |
1387 | + of_node_put(dn); |
1388 | |
1389 | printk(KERN_INFO "%s: slot %s added\n", DLPAR_MODULE_NAME, drc_name); |
1390 | exit: |
1391 | @@ -439,6 +442,7 @@ int dlpar_remove_slot(char *drc_name) |
1392 | rc = dlpar_remove_pci_slot(drc_name, dn); |
1393 | break; |
1394 | } |
1395 | + of_node_put(dn); |
1396 | vm_unmap_aliases(); |
1397 | |
1398 | printk(KERN_INFO "%s: slot %s removed\n", DLPAR_MODULE_NAME, drc_name); |
1399 | diff --git a/drivers/pci/switch/switchtec.c b/drivers/pci/switch/switchtec.c |
1400 | index 37d0c15c9eeb..72db2e0ebced 100644 |
1401 | --- a/drivers/pci/switch/switchtec.c |
1402 | +++ b/drivers/pci/switch/switchtec.c |
1403 | @@ -1116,7 +1116,8 @@ static int mask_event(struct switchtec_dev *stdev, int eid, int idx) |
1404 | if (!(hdr & SWITCHTEC_EVENT_OCCURRED && hdr & SWITCHTEC_EVENT_EN_IRQ)) |
1405 | return 0; |
1406 | |
1407 | - if (eid == SWITCHTEC_IOCTL_EVENT_LINK_STATE) |
1408 | + if (eid == SWITCHTEC_IOCTL_EVENT_LINK_STATE || |
1409 | + eid == SWITCHTEC_IOCTL_EVENT_MRPC_COMP) |
1410 | return 0; |
1411 | |
1412 | dev_dbg(&stdev->dev, "%s: %d %d %x\n", __func__, eid, idx, hdr); |
1413 | diff --git a/drivers/platform/chrome/cros_ec_proto.c b/drivers/platform/chrome/cros_ec_proto.c |
1414 | index e5d5b1adb5a9..ac784ac66ac3 100644 |
1415 | --- a/drivers/platform/chrome/cros_ec_proto.c |
1416 | +++ b/drivers/platform/chrome/cros_ec_proto.c |
1417 | @@ -67,6 +67,17 @@ static int send_command(struct cros_ec_device *ec_dev, |
1418 | else |
1419 | xfer_fxn = ec_dev->cmd_xfer; |
1420 | |
1421 | + if (!xfer_fxn) { |
1422 | + /* |
1423 | + * This error can happen if a communication error happened and |
1424 | + * the EC is trying to use protocol v2, on an underlying |
1425 | + * communication mechanism that does not support v2. |
1426 | + */ |
1427 | + dev_err_once(ec_dev->dev, |
1428 | + "missing EC transfer API, cannot send command\n"); |
1429 | + return -EIO; |
1430 | + } |
1431 | + |
1432 | ret = (*xfer_fxn)(ec_dev, msg); |
1433 | if (msg->result == EC_RES_IN_PROGRESS) { |
1434 | int i; |
1435 | diff --git a/drivers/platform/x86/intel_pmc_ipc.c b/drivers/platform/x86/intel_pmc_ipc.c |
1436 | index e7edc8c63936..4ad9d127f2f5 100644 |
1437 | --- a/drivers/platform/x86/intel_pmc_ipc.c |
1438 | +++ b/drivers/platform/x86/intel_pmc_ipc.c |
1439 | @@ -776,13 +776,17 @@ static int ipc_create_pmc_devices(void) |
1440 | if (ret) { |
1441 | dev_err(ipcdev.dev, "Failed to add punit platform device\n"); |
1442 | platform_device_unregister(ipcdev.tco_dev); |
1443 | + return ret; |
1444 | } |
1445 | |
1446 | if (!ipcdev.telem_res_inval) { |
1447 | ret = ipc_create_telemetry_device(); |
1448 | - if (ret) |
1449 | + if (ret) { |
1450 | dev_warn(ipcdev.dev, |
1451 | "Failed to add telemetry platform device\n"); |
1452 | + platform_device_unregister(ipcdev.punit_dev); |
1453 | + platform_device_unregister(ipcdev.tco_dev); |
1454 | + } |
1455 | } |
1456 | |
1457 | return ret; |
1458 | diff --git a/drivers/power/supply/max14656_charger_detector.c b/drivers/power/supply/max14656_charger_detector.c |
1459 | index b91b1d2999dc..d19307f791c6 100644 |
1460 | --- a/drivers/power/supply/max14656_charger_detector.c |
1461 | +++ b/drivers/power/supply/max14656_charger_detector.c |
1462 | @@ -280,6 +280,13 @@ static int max14656_probe(struct i2c_client *client, |
1463 | |
1464 | INIT_DELAYED_WORK(&chip->irq_work, max14656_irq_worker); |
1465 | |
1466 | + chip->detect_psy = devm_power_supply_register(dev, |
1467 | + &chip->psy_desc, &psy_cfg); |
1468 | + if (IS_ERR(chip->detect_psy)) { |
1469 | + dev_err(dev, "power_supply_register failed\n"); |
1470 | + return -EINVAL; |
1471 | + } |
1472 | + |
1473 | ret = devm_request_irq(dev, chip->irq, max14656_irq, |
1474 | IRQF_TRIGGER_FALLING, |
1475 | MAX14656_NAME, chip); |
1476 | @@ -289,13 +296,6 @@ static int max14656_probe(struct i2c_client *client, |
1477 | } |
1478 | enable_irq_wake(chip->irq); |
1479 | |
1480 | - chip->detect_psy = devm_power_supply_register(dev, |
1481 | - &chip->psy_desc, &psy_cfg); |
1482 | - if (IS_ERR(chip->detect_psy)) { |
1483 | - dev_err(dev, "power_supply_register failed\n"); |
1484 | - return -EINVAL; |
1485 | - } |
1486 | - |
1487 | schedule_delayed_work(&chip->irq_work, msecs_to_jiffies(2000)); |
1488 | |
1489 | return 0; |
1490 | diff --git a/drivers/pwm/core.c b/drivers/pwm/core.c |
1491 | index 1581f6ab1b1f..c45e5719ba17 100644 |
1492 | --- a/drivers/pwm/core.c |
1493 | +++ b/drivers/pwm/core.c |
1494 | @@ -311,10 +311,12 @@ int pwmchip_add_with_polarity(struct pwm_chip *chip, |
1495 | if (IS_ENABLED(CONFIG_OF)) |
1496 | of_pwmchip_add(chip); |
1497 | |
1498 | - pwmchip_sysfs_export(chip); |
1499 | - |
1500 | out: |
1501 | mutex_unlock(&pwm_lock); |
1502 | + |
1503 | + if (!ret) |
1504 | + pwmchip_sysfs_export(chip); |
1505 | + |
1506 | return ret; |
1507 | } |
1508 | EXPORT_SYMBOL_GPL(pwmchip_add_with_polarity); |
1509 | @@ -348,7 +350,7 @@ int pwmchip_remove(struct pwm_chip *chip) |
1510 | unsigned int i; |
1511 | int ret = 0; |
1512 | |
1513 | - pwmchip_sysfs_unexport_children(chip); |
1514 | + pwmchip_sysfs_unexport(chip); |
1515 | |
1516 | mutex_lock(&pwm_lock); |
1517 | |
1518 | @@ -368,8 +370,6 @@ int pwmchip_remove(struct pwm_chip *chip) |
1519 | |
1520 | free_pwms(chip); |
1521 | |
1522 | - pwmchip_sysfs_unexport(chip); |
1523 | - |
1524 | out: |
1525 | mutex_unlock(&pwm_lock); |
1526 | return ret; |
1527 | diff --git a/drivers/pwm/pwm-meson.c b/drivers/pwm/pwm-meson.c |
1528 | index c1ed641b3e26..f6e738ad7bd9 100644 |
1529 | --- a/drivers/pwm/pwm-meson.c |
1530 | +++ b/drivers/pwm/pwm-meson.c |
1531 | @@ -111,6 +111,10 @@ struct meson_pwm { |
1532 | const struct meson_pwm_data *data; |
1533 | void __iomem *base; |
1534 | u8 inverter_mask; |
1535 | + /* |
1536 | + * Protects register (write) access to the REG_MISC_AB register |
1537 | + * that is shared between the two PWMs. |
1538 | + */ |
1539 | spinlock_t lock; |
1540 | }; |
1541 | |
1542 | @@ -235,6 +239,7 @@ static void meson_pwm_enable(struct meson_pwm *meson, |
1543 | { |
1544 | u32 value, clk_shift, clk_enable, enable; |
1545 | unsigned int offset; |
1546 | + unsigned long flags; |
1547 | |
1548 | switch (id) { |
1549 | case 0: |
1550 | @@ -255,6 +260,8 @@ static void meson_pwm_enable(struct meson_pwm *meson, |
1551 | return; |
1552 | } |
1553 | |
1554 | + spin_lock_irqsave(&meson->lock, flags); |
1555 | + |
1556 | value = readl(meson->base + REG_MISC_AB); |
1557 | value &= ~(MISC_CLK_DIV_MASK << clk_shift); |
1558 | value |= channel->pre_div << clk_shift; |
1559 | @@ -267,11 +274,14 @@ static void meson_pwm_enable(struct meson_pwm *meson, |
1560 | value = readl(meson->base + REG_MISC_AB); |
1561 | value |= enable; |
1562 | writel(value, meson->base + REG_MISC_AB); |
1563 | + |
1564 | + spin_unlock_irqrestore(&meson->lock, flags); |
1565 | } |
1566 | |
1567 | static void meson_pwm_disable(struct meson_pwm *meson, unsigned int id) |
1568 | { |
1569 | u32 value, enable; |
1570 | + unsigned long flags; |
1571 | |
1572 | switch (id) { |
1573 | case 0: |
1574 | @@ -286,9 +296,13 @@ static void meson_pwm_disable(struct meson_pwm *meson, unsigned int id) |
1575 | return; |
1576 | } |
1577 | |
1578 | + spin_lock_irqsave(&meson->lock, flags); |
1579 | + |
1580 | value = readl(meson->base + REG_MISC_AB); |
1581 | value &= ~enable; |
1582 | writel(value, meson->base + REG_MISC_AB); |
1583 | + |
1584 | + spin_unlock_irqrestore(&meson->lock, flags); |
1585 | } |
1586 | |
1587 | static int meson_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm, |
1588 | @@ -296,19 +310,16 @@ static int meson_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm, |
1589 | { |
1590 | struct meson_pwm_channel *channel = pwm_get_chip_data(pwm); |
1591 | struct meson_pwm *meson = to_meson_pwm(chip); |
1592 | - unsigned long flags; |
1593 | int err = 0; |
1594 | |
1595 | if (!state) |
1596 | return -EINVAL; |
1597 | |
1598 | - spin_lock_irqsave(&meson->lock, flags); |
1599 | - |
1600 | if (!state->enabled) { |
1601 | meson_pwm_disable(meson, pwm->hwpwm); |
1602 | channel->state.enabled = false; |
1603 | |
1604 | - goto unlock; |
1605 | + return 0; |
1606 | } |
1607 | |
1608 | if (state->period != channel->state.period || |
1609 | @@ -329,7 +340,7 @@ static int meson_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm, |
1610 | err = meson_pwm_calc(meson, channel, pwm->hwpwm, |
1611 | state->duty_cycle, state->period); |
1612 | if (err < 0) |
1613 | - goto unlock; |
1614 | + return err; |
1615 | |
1616 | channel->state.polarity = state->polarity; |
1617 | channel->state.period = state->period; |
1618 | @@ -341,9 +352,7 @@ static int meson_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm, |
1619 | channel->state.enabled = true; |
1620 | } |
1621 | |
1622 | -unlock: |
1623 | - spin_unlock_irqrestore(&meson->lock, flags); |
1624 | - return err; |
1625 | + return 0; |
1626 | } |
1627 | |
1628 | static void meson_pwm_get_state(struct pwm_chip *chip, struct pwm_device *pwm, |
1629 | diff --git a/drivers/pwm/pwm-tiehrpwm.c b/drivers/pwm/pwm-tiehrpwm.c |
1630 | index f7b8a86fa5c5..ad4a40c0f27c 100644 |
1631 | --- a/drivers/pwm/pwm-tiehrpwm.c |
1632 | +++ b/drivers/pwm/pwm-tiehrpwm.c |
1633 | @@ -382,6 +382,8 @@ static void ehrpwm_pwm_disable(struct pwm_chip *chip, struct pwm_device *pwm) |
1634 | } |
1635 | |
1636 | /* Update shadow register first before modifying active register */ |
1637 | + ehrpwm_modify(pc->mmio_base, AQSFRC, AQSFRC_RLDCSF_MASK, |
1638 | + AQSFRC_RLDCSF_ZRO); |
1639 | ehrpwm_modify(pc->mmio_base, AQCSFRC, aqcsfrc_mask, aqcsfrc_val); |
1640 | /* |
1641 | * Changes to immediate action on Action Qualifier. This puts |
1642 | diff --git a/drivers/pwm/sysfs.c b/drivers/pwm/sysfs.c |
1643 | index 7c71cdb8a9d8..1c64fd8e9234 100644 |
1644 | --- a/drivers/pwm/sysfs.c |
1645 | +++ b/drivers/pwm/sysfs.c |
1646 | @@ -399,19 +399,6 @@ void pwmchip_sysfs_export(struct pwm_chip *chip) |
1647 | } |
1648 | |
1649 | void pwmchip_sysfs_unexport(struct pwm_chip *chip) |
1650 | -{ |
1651 | - struct device *parent; |
1652 | - |
1653 | - parent = class_find_device(&pwm_class, NULL, chip, |
1654 | - pwmchip_sysfs_match); |
1655 | - if (parent) { |
1656 | - /* for class_find_device() */ |
1657 | - put_device(parent); |
1658 | - device_unregister(parent); |
1659 | - } |
1660 | -} |
1661 | - |
1662 | -void pwmchip_sysfs_unexport_children(struct pwm_chip *chip) |
1663 | { |
1664 | struct device *parent; |
1665 | unsigned int i; |
1666 | @@ -429,6 +416,7 @@ void pwmchip_sysfs_unexport_children(struct pwm_chip *chip) |
1667 | } |
1668 | |
1669 | put_device(parent); |
1670 | + device_unregister(parent); |
1671 | } |
1672 | |
1673 | static int __init pwm_sysfs_init(void) |
1674 | diff --git a/drivers/rapidio/rio_cm.c b/drivers/rapidio/rio_cm.c |
1675 | index bad0e0ea4f30..ef989a15aefc 100644 |
1676 | --- a/drivers/rapidio/rio_cm.c |
1677 | +++ b/drivers/rapidio/rio_cm.c |
1678 | @@ -2145,6 +2145,14 @@ static int riocm_add_mport(struct device *dev, |
1679 | mutex_init(&cm->rx_lock); |
1680 | riocm_rx_fill(cm, RIOCM_RX_RING_SIZE); |
1681 | cm->rx_wq = create_workqueue(DRV_NAME "/rxq"); |
1682 | + if (!cm->rx_wq) { |
1683 | + riocm_error("failed to allocate IBMBOX_%d on %s", |
1684 | + cmbox, mport->name); |
1685 | + rio_release_outb_mbox(mport, cmbox); |
1686 | + kfree(cm); |
1687 | + return -ENOMEM; |
1688 | + } |
1689 | + |
1690 | INIT_WORK(&cm->rx_work, rio_ibmsg_handler); |
1691 | |
1692 | cm->tx_slot = 0; |
1693 | diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c |
1694 | index de3f2a097451..1f1a05a90d3d 100644 |
1695 | --- a/drivers/scsi/qla2xxx/qla_gs.c |
1696 | +++ b/drivers/scsi/qla2xxx/qla_gs.c |
1697 | @@ -3261,6 +3261,8 @@ static void qla24xx_async_gpsc_sp_done(void *s, int res) |
1698 | "Async done-%s res %x, WWPN %8phC \n", |
1699 | sp->name, res, fcport->port_name); |
1700 | |
1701 | + fcport->flags &= ~(FCF_ASYNC_SENT | FCF_ASYNC_ACTIVE); |
1702 | + |
1703 | if (res == QLA_FUNCTION_TIMEOUT) |
1704 | return; |
1705 | |
1706 | @@ -4604,6 +4606,7 @@ int qla24xx_async_gnnid(scsi_qla_host_t *vha, fc_port_t *fcport) |
1707 | |
1708 | done_free_sp: |
1709 | sp->free(sp); |
1710 | + fcport->flags &= ~FCF_ASYNC_SENT; |
1711 | done: |
1712 | return rval; |
1713 | } |
1714 | diff --git a/drivers/soc/mediatek/mtk-pmic-wrap.c b/drivers/soc/mediatek/mtk-pmic-wrap.c |
1715 | index 4e931fdf4d09..011a40b5fb49 100644 |
1716 | --- a/drivers/soc/mediatek/mtk-pmic-wrap.c |
1717 | +++ b/drivers/soc/mediatek/mtk-pmic-wrap.c |
1718 | @@ -1104,7 +1104,7 @@ static bool pwrap_is_pmic_cipher_ready(struct pmic_wrapper *wrp) |
1719 | static int pwrap_init_cipher(struct pmic_wrapper *wrp) |
1720 | { |
1721 | int ret; |
1722 | - u32 rdata; |
1723 | + u32 rdata = 0; |
1724 | |
1725 | pwrap_writel(wrp, 0x1, PWRAP_CIPHER_SWRST); |
1726 | pwrap_writel(wrp, 0x0, PWRAP_CIPHER_SWRST); |
1727 | diff --git a/drivers/soc/renesas/renesas-soc.c b/drivers/soc/renesas/renesas-soc.c |
1728 | index d44d0e687ab8..2a43d6e99962 100644 |
1729 | --- a/drivers/soc/renesas/renesas-soc.c |
1730 | +++ b/drivers/soc/renesas/renesas-soc.c |
1731 | @@ -285,6 +285,9 @@ static int __init renesas_soc_init(void) |
1732 | /* R-Car M3-W ES1.1 incorrectly identifies as ES2.0 */ |
1733 | if ((product & 0x7fff) == 0x5210) |
1734 | product ^= 0x11; |
1735 | + /* R-Car M3-W ES1.3 incorrectly identifies as ES2.1 */ |
1736 | + if ((product & 0x7fff) == 0x5211) |
1737 | + product ^= 0x12; |
1738 | if (soc->id && ((product >> 8) & 0xff) != soc->id) { |
1739 | pr_warn("SoC mismatch (product = 0x%x)\n", product); |
1740 | return -ENODEV; |
1741 | diff --git a/drivers/soc/rockchip/grf.c b/drivers/soc/rockchip/grf.c |
1742 | index 96882ffde67e..3b81e1d75a97 100644 |
1743 | --- a/drivers/soc/rockchip/grf.c |
1744 | +++ b/drivers/soc/rockchip/grf.c |
1745 | @@ -66,9 +66,11 @@ static const struct rockchip_grf_info rk3228_grf __initconst = { |
1746 | }; |
1747 | |
1748 | #define RK3288_GRF_SOC_CON0 0x244 |
1749 | +#define RK3288_GRF_SOC_CON2 0x24c |
1750 | |
1751 | static const struct rockchip_grf_value rk3288_defaults[] __initconst = { |
1752 | { "jtag switching", RK3288_GRF_SOC_CON0, HIWORD_UPDATE(0, 1, 12) }, |
1753 | + { "pwm select", RK3288_GRF_SOC_CON2, HIWORD_UPDATE(1, 1, 0) }, |
1754 | }; |
1755 | |
1756 | static const struct rockchip_grf_info rk3288_grf __initconst = { |
1757 | diff --git a/drivers/spi/spi-pxa2xx.c b/drivers/spi/spi-pxa2xx.c |
1758 | index 729be74621e3..f41333817c50 100644 |
1759 | --- a/drivers/spi/spi-pxa2xx.c |
1760 | +++ b/drivers/spi/spi-pxa2xx.c |
1761 | @@ -1416,12 +1416,7 @@ static const struct pci_device_id pxa2xx_spi_pci_compound_match[] = { |
1762 | |
1763 | static bool pxa2xx_spi_idma_filter(struct dma_chan *chan, void *param) |
1764 | { |
1765 | - struct device *dev = param; |
1766 | - |
1767 | - if (dev != chan->device->dev->parent) |
1768 | - return false; |
1769 | - |
1770 | - return true; |
1771 | + return param == chan->device->dev; |
1772 | } |
1773 | |
1774 | static struct pxa2xx_spi_master * |
1775 | diff --git a/drivers/thermal/qcom/tsens.c b/drivers/thermal/qcom/tsens.c |
1776 | index a2c9bfae3d86..b139713289a4 100644 |
1777 | --- a/drivers/thermal/qcom/tsens.c |
1778 | +++ b/drivers/thermal/qcom/tsens.c |
1779 | @@ -171,7 +171,8 @@ static int tsens_probe(struct platform_device *pdev) |
1780 | if (tmdev->ops->calibrate) { |
1781 | ret = tmdev->ops->calibrate(tmdev); |
1782 | if (ret < 0) { |
1783 | - dev_err(dev, "tsens calibration failed\n"); |
1784 | + if (ret != -EPROBE_DEFER) |
1785 | + dev_err(dev, "tsens calibration failed\n"); |
1786 | return ret; |
1787 | } |
1788 | } |
1789 | diff --git a/drivers/thermal/rcar_gen3_thermal.c b/drivers/thermal/rcar_gen3_thermal.c |
1790 | index 7aed5337bdd3..704c8ad045bb 100644 |
1791 | --- a/drivers/thermal/rcar_gen3_thermal.c |
1792 | +++ b/drivers/thermal/rcar_gen3_thermal.c |
1793 | @@ -328,6 +328,9 @@ MODULE_DEVICE_TABLE(of, rcar_gen3_thermal_dt_ids); |
1794 | static int rcar_gen3_thermal_remove(struct platform_device *pdev) |
1795 | { |
1796 | struct device *dev = &pdev->dev; |
1797 | + struct rcar_gen3_thermal_priv *priv = dev_get_drvdata(dev); |
1798 | + |
1799 | + rcar_thermal_irq_set(priv, false); |
1800 | |
1801 | pm_runtime_put(dev); |
1802 | pm_runtime_disable(dev); |
1803 | diff --git a/drivers/tty/serial/8250/8250_dw.c b/drivers/tty/serial/8250/8250_dw.c |
1804 | index d31b975dd3fd..284e8d052fc3 100644 |
1805 | --- a/drivers/tty/serial/8250/8250_dw.c |
1806 | +++ b/drivers/tty/serial/8250/8250_dw.c |
1807 | @@ -365,7 +365,7 @@ static bool dw8250_fallback_dma_filter(struct dma_chan *chan, void *param) |
1808 | |
1809 | static bool dw8250_idma_filter(struct dma_chan *chan, void *param) |
1810 | { |
1811 | - return param == chan->device->dev->parent; |
1812 | + return param == chan->device->dev; |
1813 | } |
1814 | |
1815 | /* |
1816 | @@ -434,7 +434,7 @@ static void dw8250_quirks(struct uart_port *p, struct dw8250_data *data) |
1817 | data->uart_16550_compatible = true; |
1818 | } |
1819 | |
1820 | - /* Platforms with iDMA */ |
1821 | + /* Platforms with iDMA 64-bit */ |
1822 | if (platform_get_resource_byname(to_platform_device(p->dev), |
1823 | IORESOURCE_MEM, "lpss_priv")) { |
1824 | data->dma.rx_param = p->dev->parent; |
1825 | diff --git a/drivers/usb/typec/fusb302/fusb302.c b/drivers/usb/typec/fusb302/fusb302.c |
1826 | index 82bed9810be6..62a0060d39d8 100644 |
1827 | --- a/drivers/usb/typec/fusb302/fusb302.c |
1828 | +++ b/drivers/usb/typec/fusb302/fusb302.c |
1829 | @@ -641,6 +641,8 @@ static int fusb302_set_toggling(struct fusb302_chip *chip, |
1830 | return ret; |
1831 | chip->intr_togdone = false; |
1832 | } else { |
1833 | + /* Datasheet says vconn MUST be off when toggling */ |
1834 | + WARN(chip->vconn_on, "Vconn is on during toggle start"); |
1835 | /* unmask TOGDONE interrupt */ |
1836 | ret = fusb302_i2c_clear_bits(chip, FUSB_REG_MASKA, |
1837 | FUSB_REG_MASKA_TOGDONE); |
1838 | diff --git a/drivers/vfio/vfio.c b/drivers/vfio/vfio.c |
1839 | index 64833879f75d..7a386fb30bf1 100644 |
1840 | --- a/drivers/vfio/vfio.c |
1841 | +++ b/drivers/vfio/vfio.c |
1842 | @@ -34,6 +34,7 @@ |
1843 | #include <linux/uaccess.h> |
1844 | #include <linux/vfio.h> |
1845 | #include <linux/wait.h> |
1846 | +#include <linux/sched/signal.h> |
1847 | |
1848 | #define DRIVER_VERSION "0.3" |
1849 | #define DRIVER_AUTHOR "Alex Williamson <alex.williamson@redhat.com>" |
1850 | @@ -904,30 +905,17 @@ void *vfio_device_data(struct vfio_device *device) |
1851 | } |
1852 | EXPORT_SYMBOL_GPL(vfio_device_data); |
1853 | |
1854 | -/* Given a referenced group, check if it contains the device */ |
1855 | -static bool vfio_dev_present(struct vfio_group *group, struct device *dev) |
1856 | -{ |
1857 | - struct vfio_device *device; |
1858 | - |
1859 | - device = vfio_group_get_device(group, dev); |
1860 | - if (!device) |
1861 | - return false; |
1862 | - |
1863 | - vfio_device_put(device); |
1864 | - return true; |
1865 | -} |
1866 | - |
1867 | /* |
1868 | * Decrement the device reference count and wait for the device to be |
1869 | * removed. Open file descriptors for the device... */ |
1870 | void *vfio_del_group_dev(struct device *dev) |
1871 | { |
1872 | + DEFINE_WAIT_FUNC(wait, woken_wake_function); |
1873 | struct vfio_device *device = dev_get_drvdata(dev); |
1874 | struct vfio_group *group = device->group; |
1875 | void *device_data = device->device_data; |
1876 | struct vfio_unbound_dev *unbound; |
1877 | unsigned int i = 0; |
1878 | - long ret; |
1879 | bool interrupted = false; |
1880 | |
1881 | /* |
1882 | @@ -964,6 +952,8 @@ void *vfio_del_group_dev(struct device *dev) |
1883 | * interval with counter to allow the driver to take escalating |
1884 | * measures to release the device if it has the ability to do so. |
1885 | */ |
1886 | + add_wait_queue(&vfio.release_q, &wait); |
1887 | + |
1888 | do { |
1889 | device = vfio_group_get_device(group, dev); |
1890 | if (!device) |
1891 | @@ -975,12 +965,10 @@ void *vfio_del_group_dev(struct device *dev) |
1892 | vfio_device_put(device); |
1893 | |
1894 | if (interrupted) { |
1895 | - ret = wait_event_timeout(vfio.release_q, |
1896 | - !vfio_dev_present(group, dev), HZ * 10); |
1897 | + wait_woken(&wait, TASK_UNINTERRUPTIBLE, HZ * 10); |
1898 | } else { |
1899 | - ret = wait_event_interruptible_timeout(vfio.release_q, |
1900 | - !vfio_dev_present(group, dev), HZ * 10); |
1901 | - if (ret == -ERESTARTSYS) { |
1902 | + wait_woken(&wait, TASK_INTERRUPTIBLE, HZ * 10); |
1903 | + if (signal_pending(current)) { |
1904 | interrupted = true; |
1905 | dev_warn(dev, |
1906 | "Device is currently in use, task" |
1907 | @@ -989,8 +977,10 @@ void *vfio_del_group_dev(struct device *dev) |
1908 | current->comm, task_pid_nr(current)); |
1909 | } |
1910 | } |
1911 | - } while (ret <= 0); |
1912 | |
1913 | + } while (1); |
1914 | + |
1915 | + remove_wait_queue(&vfio.release_q, &wait); |
1916 | /* |
1917 | * In order to support multiple devices per group, devices can be |
1918 | * plucked from the group while other devices in the group are still |
1919 | diff --git a/drivers/video/fbdev/hgafb.c b/drivers/video/fbdev/hgafb.c |
1920 | index 463028543173..59e1cae57948 100644 |
1921 | --- a/drivers/video/fbdev/hgafb.c |
1922 | +++ b/drivers/video/fbdev/hgafb.c |
1923 | @@ -285,6 +285,8 @@ static int hga_card_detect(void) |
1924 | hga_vram_len = 0x08000; |
1925 | |
1926 | hga_vram = ioremap(0xb0000, hga_vram_len); |
1927 | + if (!hga_vram) |
1928 | + goto error; |
1929 | |
1930 | if (request_region(0x3b0, 12, "hgafb")) |
1931 | release_io_ports = 1; |
1932 | diff --git a/drivers/video/fbdev/imsttfb.c b/drivers/video/fbdev/imsttfb.c |
1933 | index ecdcf358ad5e..ffcf553719a3 100644 |
1934 | --- a/drivers/video/fbdev/imsttfb.c |
1935 | +++ b/drivers/video/fbdev/imsttfb.c |
1936 | @@ -1516,6 +1516,11 @@ static int imsttfb_probe(struct pci_dev *pdev, const struct pci_device_id *ent) |
1937 | info->fix.smem_start = addr; |
1938 | info->screen_base = (__u8 *)ioremap(addr, par->ramdac == IBM ? |
1939 | 0x400000 : 0x800000); |
1940 | + if (!info->screen_base) { |
1941 | + release_mem_region(addr, size); |
1942 | + framebuffer_release(info); |
1943 | + return -ENOMEM; |
1944 | + } |
1945 | info->fix.mmio_start = addr + 0x800000; |
1946 | par->dc_regs = ioremap(addr + 0x800000, 0x1000); |
1947 | par->cmap_regs_phys = addr + 0x840000; |
1948 | diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig |
1949 | index 5ea8909a41f9..b165c46aca74 100644 |
1950 | --- a/drivers/watchdog/Kconfig |
1951 | +++ b/drivers/watchdog/Kconfig |
1952 | @@ -1967,6 +1967,7 @@ comment "Watchdog Pretimeout Governors" |
1953 | |
1954 | config WATCHDOG_PRETIMEOUT_GOV |
1955 | bool "Enable watchdog pretimeout governors" |
1956 | + depends on WATCHDOG_CORE |
1957 | help |
1958 | The option allows to select watchdog pretimeout governors. |
1959 | |
1960 | diff --git a/drivers/watchdog/imx2_wdt.c b/drivers/watchdog/imx2_wdt.c |
1961 | index 2b52514eaa86..7e7bdcbbc741 100644 |
1962 | --- a/drivers/watchdog/imx2_wdt.c |
1963 | +++ b/drivers/watchdog/imx2_wdt.c |
1964 | @@ -178,8 +178,10 @@ static void __imx2_wdt_set_timeout(struct watchdog_device *wdog, |
1965 | static int imx2_wdt_set_timeout(struct watchdog_device *wdog, |
1966 | unsigned int new_timeout) |
1967 | { |
1968 | - __imx2_wdt_set_timeout(wdog, new_timeout); |
1969 | + unsigned int actual; |
1970 | |
1971 | + actual = min(new_timeout, wdog->max_hw_heartbeat_ms * 1000); |
1972 | + __imx2_wdt_set_timeout(wdog, actual); |
1973 | wdog->timeout = new_timeout; |
1974 | return 0; |
1975 | } |
1976 | diff --git a/fs/configfs/dir.c b/fs/configfs/dir.c |
1977 | index 39843fa7e11b..920d350df37b 100644 |
1978 | --- a/fs/configfs/dir.c |
1979 | +++ b/fs/configfs/dir.c |
1980 | @@ -1755,12 +1755,19 @@ int configfs_register_group(struct config_group *parent_group, |
1981 | |
1982 | inode_lock_nested(d_inode(parent), I_MUTEX_PARENT); |
1983 | ret = create_default_group(parent_group, group); |
1984 | - if (!ret) { |
1985 | - spin_lock(&configfs_dirent_lock); |
1986 | - configfs_dir_set_ready(group->cg_item.ci_dentry->d_fsdata); |
1987 | - spin_unlock(&configfs_dirent_lock); |
1988 | - } |
1989 | + if (ret) |
1990 | + goto err_out; |
1991 | + |
1992 | + spin_lock(&configfs_dirent_lock); |
1993 | + configfs_dir_set_ready(group->cg_item.ci_dentry->d_fsdata); |
1994 | + spin_unlock(&configfs_dirent_lock); |
1995 | + inode_unlock(d_inode(parent)); |
1996 | + return 0; |
1997 | +err_out: |
1998 | inode_unlock(d_inode(parent)); |
1999 | + mutex_lock(&subsys->su_mutex); |
2000 | + unlink_group(group); |
2001 | + mutex_unlock(&subsys->su_mutex); |
2002 | return ret; |
2003 | } |
2004 | EXPORT_SYMBOL(configfs_register_group); |
2005 | diff --git a/fs/dax.c b/fs/dax.c |
2006 | index 004c8ac1117c..75a289c31c7e 100644 |
2007 | --- a/fs/dax.c |
2008 | +++ b/fs/dax.c |
2009 | @@ -908,7 +908,7 @@ static void dax_mapping_entry_mkclean(struct address_space *mapping, |
2010 | goto unlock_pmd; |
2011 | |
2012 | flush_cache_page(vma, address, pfn); |
2013 | - pmd = pmdp_huge_clear_flush(vma, address, pmdp); |
2014 | + pmd = pmdp_invalidate(vma, address, pmdp); |
2015 | pmd = pmd_wrprotect(pmd); |
2016 | pmd = pmd_mkclean(pmd); |
2017 | set_pmd_at(vma->vm_mm, address, pmdp, pmd); |
2018 | diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h |
2019 | index a4b6eacf22ea..44ea7ac69ef4 100644 |
2020 | --- a/fs/f2fs/f2fs.h |
2021 | +++ b/fs/f2fs/f2fs.h |
2022 | @@ -1744,6 +1744,7 @@ enospc: |
2023 | return -ENOSPC; |
2024 | } |
2025 | |
2026 | +void f2fs_msg(struct super_block *sb, const char *level, const char *fmt, ...); |
2027 | static inline void dec_valid_block_count(struct f2fs_sb_info *sbi, |
2028 | struct inode *inode, |
2029 | block_t count) |
2030 | @@ -1752,13 +1753,21 @@ static inline void dec_valid_block_count(struct f2fs_sb_info *sbi, |
2031 | |
2032 | spin_lock(&sbi->stat_lock); |
2033 | f2fs_bug_on(sbi, sbi->total_valid_block_count < (block_t) count); |
2034 | - f2fs_bug_on(sbi, inode->i_blocks < sectors); |
2035 | sbi->total_valid_block_count -= (block_t)count; |
2036 | if (sbi->reserved_blocks && |
2037 | sbi->current_reserved_blocks < sbi->reserved_blocks) |
2038 | sbi->current_reserved_blocks = min(sbi->reserved_blocks, |
2039 | sbi->current_reserved_blocks + count); |
2040 | spin_unlock(&sbi->stat_lock); |
2041 | + if (unlikely(inode->i_blocks < sectors)) { |
2042 | + f2fs_msg(sbi->sb, KERN_WARNING, |
2043 | + "Inconsistent i_blocks, ino:%lu, iblocks:%llu, sectors:%llu", |
2044 | + inode->i_ino, |
2045 | + (unsigned long long)inode->i_blocks, |
2046 | + (unsigned long long)sectors); |
2047 | + set_sbi_flag(sbi, SBI_NEED_FSCK); |
2048 | + return; |
2049 | + } |
2050 | f2fs_i_blocks_write(inode, count, false, true); |
2051 | } |
2052 | |
2053 | @@ -2488,7 +2497,9 @@ static inline void *inline_xattr_addr(struct inode *inode, struct page *page) |
2054 | |
2055 | static inline int inline_xattr_size(struct inode *inode) |
2056 | { |
2057 | - return get_inline_xattr_addrs(inode) * sizeof(__le32); |
2058 | + if (f2fs_has_inline_xattr(inode)) |
2059 | + return get_inline_xattr_addrs(inode) * sizeof(__le32); |
2060 | + return 0; |
2061 | } |
2062 | |
2063 | static inline int f2fs_has_inline_data(struct inode *inode) |
2064 | @@ -2727,7 +2738,6 @@ static inline void f2fs_update_iostat(struct f2fs_sb_info *sbi, |
2065 | |
2066 | bool f2fs_is_valid_blkaddr(struct f2fs_sb_info *sbi, |
2067 | block_t blkaddr, int type); |
2068 | -void f2fs_msg(struct super_block *sb, const char *level, const char *fmt, ...); |
2069 | static inline void verify_blkaddr(struct f2fs_sb_info *sbi, |
2070 | block_t blkaddr, int type) |
2071 | { |
2072 | diff --git a/fs/f2fs/inode.c b/fs/f2fs/inode.c |
2073 | index dd608b819a3c..0f31df01e36c 100644 |
2074 | --- a/fs/f2fs/inode.c |
2075 | +++ b/fs/f2fs/inode.c |
2076 | @@ -179,8 +179,8 @@ bool f2fs_inode_chksum_verify(struct f2fs_sb_info *sbi, struct page *page) |
2077 | |
2078 | if (provided != calculated) |
2079 | f2fs_msg(sbi->sb, KERN_WARNING, |
2080 | - "checksum invalid, ino = %x, %x vs. %x", |
2081 | - ino_of_node(page), provided, calculated); |
2082 | + "checksum invalid, nid = %lu, ino_of_node = %x, %x vs. %x", |
2083 | + page->index, ino_of_node(page), provided, calculated); |
2084 | |
2085 | return provided == calculated; |
2086 | } |
2087 | @@ -476,6 +476,7 @@ make_now: |
2088 | return inode; |
2089 | |
2090 | bad_inode: |
2091 | + f2fs_inode_synced(inode); |
2092 | iget_failed(inode); |
2093 | trace_f2fs_iget_exit(inode, ret); |
2094 | return ERR_PTR(ret); |
2095 | diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c |
2096 | index 19a0d83aae65..e2d9edad758c 100644 |
2097 | --- a/fs/f2fs/node.c |
2098 | +++ b/fs/f2fs/node.c |
2099 | @@ -1180,8 +1180,14 @@ int f2fs_remove_inode_page(struct inode *inode) |
2100 | f2fs_put_dnode(&dn); |
2101 | return -EIO; |
2102 | } |
2103 | - f2fs_bug_on(F2FS_I_SB(inode), |
2104 | - inode->i_blocks != 0 && inode->i_blocks != 8); |
2105 | + |
2106 | + if (unlikely(inode->i_blocks != 0 && inode->i_blocks != 8)) { |
2107 | + f2fs_msg(F2FS_I_SB(inode)->sb, KERN_WARNING, |
2108 | + "Inconsistent i_blocks, ino:%lu, iblocks:%llu", |
2109 | + inode->i_ino, |
2110 | + (unsigned long long)inode->i_blocks); |
2111 | + set_sbi_flag(F2FS_I_SB(inode), SBI_NEED_FSCK); |
2112 | + } |
2113 | |
2114 | /* will put inode & node pages */ |
2115 | err = truncate_node(&dn); |
2116 | @@ -1276,9 +1282,10 @@ static int read_node_page(struct page *page, int op_flags) |
2117 | int err; |
2118 | |
2119 | if (PageUptodate(page)) { |
2120 | -#ifdef CONFIG_F2FS_CHECK_FS |
2121 | - f2fs_bug_on(sbi, !f2fs_inode_chksum_verify(sbi, page)); |
2122 | -#endif |
2123 | + if (!f2fs_inode_chksum_verify(sbi, page)) { |
2124 | + ClearPageUptodate(page); |
2125 | + return -EBADMSG; |
2126 | + } |
2127 | return LOCKED_PAGE; |
2128 | } |
2129 | |
2130 | @@ -2073,6 +2080,9 @@ static bool add_free_nid(struct f2fs_sb_info *sbi, |
2131 | if (unlikely(nid == 0)) |
2132 | return false; |
2133 | |
2134 | + if (unlikely(f2fs_check_nid_range(sbi, nid))) |
2135 | + return false; |
2136 | + |
2137 | i = f2fs_kmem_cache_alloc(free_nid_slab, GFP_NOFS); |
2138 | i->nid = nid; |
2139 | i->state = FREE_NID; |
2140 | diff --git a/fs/f2fs/recovery.c b/fs/f2fs/recovery.c |
2141 | index ae0e5f2e67b4..bf5c5f4fa77e 100644 |
2142 | --- a/fs/f2fs/recovery.c |
2143 | +++ b/fs/f2fs/recovery.c |
2144 | @@ -485,7 +485,15 @@ retry_dn: |
2145 | goto err; |
2146 | |
2147 | f2fs_bug_on(sbi, ni.ino != ino_of_node(page)); |
2148 | - f2fs_bug_on(sbi, ofs_of_node(dn.node_page) != ofs_of_node(page)); |
2149 | + |
2150 | + if (ofs_of_node(dn.node_page) != ofs_of_node(page)) { |
2151 | + f2fs_msg(sbi->sb, KERN_WARNING, |
2152 | + "Inconsistent ofs_of_node, ino:%lu, ofs:%u, %u", |
2153 | + inode->i_ino, ofs_of_node(dn.node_page), |
2154 | + ofs_of_node(page)); |
2155 | + err = -EFAULT; |
2156 | + goto err; |
2157 | + } |
2158 | |
2159 | for (; start < end; start++, dn.ofs_in_node++) { |
2160 | block_t src, dest; |
2161 | diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c |
2162 | index 03fa2c4d3d79..8fc3edb6760c 100644 |
2163 | --- a/fs/f2fs/segment.c |
2164 | +++ b/fs/f2fs/segment.c |
2165 | @@ -3069,13 +3069,18 @@ int f2fs_inplace_write_data(struct f2fs_io_info *fio) |
2166 | { |
2167 | int err; |
2168 | struct f2fs_sb_info *sbi = fio->sbi; |
2169 | + unsigned int segno; |
2170 | |
2171 | fio->new_blkaddr = fio->old_blkaddr; |
2172 | /* i/o temperature is needed for passing down write hints */ |
2173 | __get_segment_type(fio); |
2174 | |
2175 | - f2fs_bug_on(sbi, !IS_DATASEG(get_seg_entry(sbi, |
2176 | - GET_SEGNO(sbi, fio->new_blkaddr))->type)); |
2177 | + segno = GET_SEGNO(sbi, fio->new_blkaddr); |
2178 | + |
2179 | + if (!IS_DATASEG(get_seg_entry(sbi, segno)->type)) { |
2180 | + set_sbi_flag(sbi, SBI_NEED_FSCK); |
2181 | + return -EFAULT; |
2182 | + } |
2183 | |
2184 | stat_inc_inplace_blocks(fio->sbi); |
2185 | |
2186 | diff --git a/fs/f2fs/segment.h b/fs/f2fs/segment.h |
2187 | index b3d9e317ff0c..5079532cb176 100644 |
2188 | --- a/fs/f2fs/segment.h |
2189 | +++ b/fs/f2fs/segment.h |
2190 | @@ -660,7 +660,6 @@ static inline void verify_block_addr(struct f2fs_io_info *fio, block_t blk_addr) |
2191 | static inline int check_block_count(struct f2fs_sb_info *sbi, |
2192 | int segno, struct f2fs_sit_entry *raw_sit) |
2193 | { |
2194 | -#ifdef CONFIG_F2FS_CHECK_FS |
2195 | bool is_valid = test_bit_le(0, raw_sit->valid_map) ? true : false; |
2196 | int valid_blocks = 0; |
2197 | int cur_pos = 0, next_pos; |
2198 | @@ -687,7 +686,7 @@ static inline int check_block_count(struct f2fs_sb_info *sbi, |
2199 | set_sbi_flag(sbi, SBI_NEED_FSCK); |
2200 | return -EINVAL; |
2201 | } |
2202 | -#endif |
2203 | + |
2204 | /* check segment usage, and check boundary of a given segment number */ |
2205 | if (unlikely(GET_SIT_VBLOCKS(raw_sit) > sbi->blocks_per_seg |
2206 | || segno > TOTAL_SEGS(sbi) - 1)) { |
2207 | diff --git a/fs/fat/file.c b/fs/fat/file.c |
2208 | index 4f3d72fb1e60..f86ea08bd6ce 100644 |
2209 | --- a/fs/fat/file.c |
2210 | +++ b/fs/fat/file.c |
2211 | @@ -193,12 +193,17 @@ static int fat_file_release(struct inode *inode, struct file *filp) |
2212 | int fat_file_fsync(struct file *filp, loff_t start, loff_t end, int datasync) |
2213 | { |
2214 | struct inode *inode = filp->f_mapping->host; |
2215 | - int res, err; |
2216 | + int err; |
2217 | + |
2218 | + err = __generic_file_fsync(filp, start, end, datasync); |
2219 | + if (err) |
2220 | + return err; |
2221 | |
2222 | - res = generic_file_fsync(filp, start, end, datasync); |
2223 | err = sync_mapping_buffers(MSDOS_SB(inode->i_sb)->fat_inode->i_mapping); |
2224 | + if (err) |
2225 | + return err; |
2226 | |
2227 | - return res ? res : err; |
2228 | + return blkdev_issue_flush(inode->i_sb->s_bdev, GFP_KERNEL, NULL); |
2229 | } |
2230 | |
2231 | |
2232 | diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c |
2233 | index 249de20f752a..6ee471b72a34 100644 |
2234 | --- a/fs/fuse/dev.c |
2235 | +++ b/fs/fuse/dev.c |
2236 | @@ -1681,7 +1681,7 @@ static int fuse_retrieve(struct fuse_conn *fc, struct inode *inode, |
2237 | offset = outarg->offset & ~PAGE_MASK; |
2238 | file_size = i_size_read(inode); |
2239 | |
2240 | - num = outarg->size; |
2241 | + num = min(outarg->size, fc->max_write); |
2242 | if (outarg->offset > file_size) |
2243 | num = 0; |
2244 | else if (outarg->offset + num > file_size) |
2245 | diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c |
2246 | index 418fa9c78186..db0beefe65ec 100644 |
2247 | --- a/fs/nfsd/nfs4xdr.c |
2248 | +++ b/fs/nfsd/nfs4xdr.c |
2249 | @@ -2413,8 +2413,10 @@ nfsd4_encode_fattr(struct xdr_stream *xdr, struct svc_fh *fhp, |
2250 | __be32 status; |
2251 | int err; |
2252 | struct nfs4_acl *acl = NULL; |
2253 | +#ifdef CONFIG_NFSD_V4_SECURITY_LABEL |
2254 | void *context = NULL; |
2255 | int contextlen; |
2256 | +#endif |
2257 | bool contextsupport = false; |
2258 | struct nfsd4_compoundres *resp = rqstp->rq_resp; |
2259 | u32 minorversion = resp->cstate.minorversion; |
2260 | @@ -2899,12 +2901,14 @@ out_acl: |
2261 | *p++ = cpu_to_be32(NFS4_CHANGE_TYPE_IS_TIME_METADATA); |
2262 | } |
2263 | |
2264 | +#ifdef CONFIG_NFSD_V4_SECURITY_LABEL |
2265 | if (bmval2 & FATTR4_WORD2_SECURITY_LABEL) { |
2266 | status = nfsd4_encode_security_label(xdr, rqstp, context, |
2267 | contextlen); |
2268 | if (status) |
2269 | goto out; |
2270 | } |
2271 | +#endif |
2272 | |
2273 | attrlen = htonl(xdr->buf->len - attrlen_offset - 4); |
2274 | write_bytes_to_xdr_buf(xdr->buf, attrlen_offset, &attrlen, 4); |
2275 | diff --git a/fs/nfsd/vfs.h b/fs/nfsd/vfs.h |
2276 | index a7e107309f76..db351247892d 100644 |
2277 | --- a/fs/nfsd/vfs.h |
2278 | +++ b/fs/nfsd/vfs.h |
2279 | @@ -120,8 +120,11 @@ void nfsd_put_raparams(struct file *file, struct raparms *ra); |
2280 | |
2281 | static inline int fh_want_write(struct svc_fh *fh) |
2282 | { |
2283 | - int ret = mnt_want_write(fh->fh_export->ex_path.mnt); |
2284 | + int ret; |
2285 | |
2286 | + if (fh->fh_want_write) |
2287 | + return 0; |
2288 | + ret = mnt_want_write(fh->fh_export->ex_path.mnt); |
2289 | if (!ret) |
2290 | fh->fh_want_write = true; |
2291 | return ret; |
2292 | diff --git a/fs/overlayfs/file.c b/fs/overlayfs/file.c |
2293 | index 0c810f20f778..00338b828f76 100644 |
2294 | --- a/fs/overlayfs/file.c |
2295 | +++ b/fs/overlayfs/file.c |
2296 | @@ -11,6 +11,7 @@ |
2297 | #include <linux/mount.h> |
2298 | #include <linux/xattr.h> |
2299 | #include <linux/uio.h> |
2300 | +#include <linux/uaccess.h> |
2301 | #include "overlayfs.h" |
2302 | |
2303 | static char ovl_whatisit(struct inode *inode, struct inode *realinode) |
2304 | @@ -29,10 +30,11 @@ static struct file *ovl_open_realfile(const struct file *file, |
2305 | struct inode *inode = file_inode(file); |
2306 | struct file *realfile; |
2307 | const struct cred *old_cred; |
2308 | + int flags = file->f_flags | O_NOATIME | FMODE_NONOTIFY; |
2309 | |
2310 | old_cred = ovl_override_creds(inode->i_sb); |
2311 | - realfile = open_with_fake_path(&file->f_path, file->f_flags | O_NOATIME, |
2312 | - realinode, current_cred()); |
2313 | + realfile = open_with_fake_path(&file->f_path, flags, realinode, |
2314 | + current_cred()); |
2315 | revert_creds(old_cred); |
2316 | |
2317 | pr_debug("open(%p[%pD2/%c], 0%o) -> (%p, 0%o)\n", |
2318 | @@ -50,7 +52,7 @@ static int ovl_change_flags(struct file *file, unsigned int flags) |
2319 | int err; |
2320 | |
2321 | /* No atime modificaton on underlying */ |
2322 | - flags |= O_NOATIME; |
2323 | + flags |= O_NOATIME | FMODE_NONOTIFY; |
2324 | |
2325 | /* If some flag changed that cannot be changed then something's amiss */ |
2326 | if (WARN_ON((file->f_flags ^ flags) & ~OVL_SETFL_MASK)) |
2327 | @@ -144,11 +146,47 @@ static int ovl_release(struct inode *inode, struct file *file) |
2328 | |
2329 | static loff_t ovl_llseek(struct file *file, loff_t offset, int whence) |
2330 | { |
2331 | - struct inode *realinode = ovl_inode_real(file_inode(file)); |
2332 | + struct inode *inode = file_inode(file); |
2333 | + struct fd real; |
2334 | + const struct cred *old_cred; |
2335 | + ssize_t ret; |
2336 | + |
2337 | + /* |
2338 | + * The two special cases below do not need to involve real fs, |
2339 | + * so we can optimizing concurrent callers. |
2340 | + */ |
2341 | + if (offset == 0) { |
2342 | + if (whence == SEEK_CUR) |
2343 | + return file->f_pos; |
2344 | + |
2345 | + if (whence == SEEK_SET) |
2346 | + return vfs_setpos(file, 0, 0); |
2347 | + } |
2348 | + |
2349 | + ret = ovl_real_fdget(file, &real); |
2350 | + if (ret) |
2351 | + return ret; |
2352 | + |
2353 | + /* |
2354 | + * Overlay file f_pos is the master copy that is preserved |
2355 | + * through copy up and modified on read/write, but only real |
2356 | + * fs knows how to SEEK_HOLE/SEEK_DATA and real fs may impose |
2357 | + * limitations that are more strict than ->s_maxbytes for specific |
2358 | + * files, so we use the real file to perform seeks. |
2359 | + */ |
2360 | + inode_lock(inode); |
2361 | + real.file->f_pos = file->f_pos; |
2362 | + |
2363 | + old_cred = ovl_override_creds(inode->i_sb); |
2364 | + ret = vfs_llseek(real.file, offset, whence); |
2365 | + revert_creds(old_cred); |
2366 | + |
2367 | + file->f_pos = real.file->f_pos; |
2368 | + inode_unlock(inode); |
2369 | + |
2370 | + fdput(real); |
2371 | |
2372 | - return generic_file_llseek_size(file, offset, whence, |
2373 | - realinode->i_sb->s_maxbytes, |
2374 | - i_size_read(realinode)); |
2375 | + return ret; |
2376 | } |
2377 | |
2378 | static void ovl_file_accessed(struct file *file) |
2379 | @@ -371,10 +409,68 @@ static long ovl_real_ioctl(struct file *file, unsigned int cmd, |
2380 | return ret; |
2381 | } |
2382 | |
2383 | -static long ovl_ioctl(struct file *file, unsigned int cmd, unsigned long arg) |
2384 | +static unsigned int ovl_get_inode_flags(struct inode *inode) |
2385 | +{ |
2386 | + unsigned int flags = READ_ONCE(inode->i_flags); |
2387 | + unsigned int ovl_iflags = 0; |
2388 | + |
2389 | + if (flags & S_SYNC) |
2390 | + ovl_iflags |= FS_SYNC_FL; |
2391 | + if (flags & S_APPEND) |
2392 | + ovl_iflags |= FS_APPEND_FL; |
2393 | + if (flags & S_IMMUTABLE) |
2394 | + ovl_iflags |= FS_IMMUTABLE_FL; |
2395 | + if (flags & S_NOATIME) |
2396 | + ovl_iflags |= FS_NOATIME_FL; |
2397 | + |
2398 | + return ovl_iflags; |
2399 | +} |
2400 | + |
2401 | +static long ovl_ioctl_set_flags(struct file *file, unsigned long arg) |
2402 | { |
2403 | long ret; |
2404 | struct inode *inode = file_inode(file); |
2405 | + unsigned int flags; |
2406 | + unsigned int old_flags; |
2407 | + |
2408 | + if (!inode_owner_or_capable(inode)) |
2409 | + return -EACCES; |
2410 | + |
2411 | + if (get_user(flags, (int __user *) arg)) |
2412 | + return -EFAULT; |
2413 | + |
2414 | + ret = mnt_want_write_file(file); |
2415 | + if (ret) |
2416 | + return ret; |
2417 | + |
2418 | + inode_lock(inode); |
2419 | + |
2420 | + /* Check the capability before cred override */ |
2421 | + ret = -EPERM; |
2422 | + old_flags = ovl_get_inode_flags(inode); |
2423 | + if (((flags ^ old_flags) & (FS_APPEND_FL | FS_IMMUTABLE_FL)) && |
2424 | + !capable(CAP_LINUX_IMMUTABLE)) |
2425 | + goto unlock; |
2426 | + |
2427 | + ret = ovl_maybe_copy_up(file_dentry(file), O_WRONLY); |
2428 | + if (ret) |
2429 | + goto unlock; |
2430 | + |
2431 | + ret = ovl_real_ioctl(file, FS_IOC_SETFLAGS, arg); |
2432 | + |
2433 | + ovl_copyflags(ovl_inode_real(inode), inode); |
2434 | +unlock: |
2435 | + inode_unlock(inode); |
2436 | + |
2437 | + mnt_drop_write_file(file); |
2438 | + |
2439 | + return ret; |
2440 | + |
2441 | +} |
2442 | + |
2443 | +static long ovl_ioctl(struct file *file, unsigned int cmd, unsigned long arg) |
2444 | +{ |
2445 | + long ret; |
2446 | |
2447 | switch (cmd) { |
2448 | case FS_IOC_GETFLAGS: |
2449 | @@ -382,23 +478,7 @@ static long ovl_ioctl(struct file *file, unsigned int cmd, unsigned long arg) |
2450 | break; |
2451 | |
2452 | case FS_IOC_SETFLAGS: |
2453 | - if (!inode_owner_or_capable(inode)) |
2454 | - return -EACCES; |
2455 | - |
2456 | - ret = mnt_want_write_file(file); |
2457 | - if (ret) |
2458 | - return ret; |
2459 | - |
2460 | - ret = ovl_maybe_copy_up(file_dentry(file), O_WRONLY); |
2461 | - if (!ret) { |
2462 | - ret = ovl_real_ioctl(file, cmd, arg); |
2463 | - |
2464 | - inode_lock(inode); |
2465 | - ovl_copyflags(ovl_inode_real(inode), inode); |
2466 | - inode_unlock(inode); |
2467 | - } |
2468 | - |
2469 | - mnt_drop_write_file(file); |
2470 | + ret = ovl_ioctl_set_flags(file, arg); |
2471 | break; |
2472 | |
2473 | default: |
2474 | diff --git a/include/linux/pwm.h b/include/linux/pwm.h |
2475 | index 56518adc31dd..bd7d611d63e9 100644 |
2476 | --- a/include/linux/pwm.h |
2477 | +++ b/include/linux/pwm.h |
2478 | @@ -639,7 +639,6 @@ static inline void pwm_remove_table(struct pwm_lookup *table, size_t num) |
2479 | #ifdef CONFIG_PWM_SYSFS |
2480 | void pwmchip_sysfs_export(struct pwm_chip *chip); |
2481 | void pwmchip_sysfs_unexport(struct pwm_chip *chip); |
2482 | -void pwmchip_sysfs_unexport_children(struct pwm_chip *chip); |
2483 | #else |
2484 | static inline void pwmchip_sysfs_export(struct pwm_chip *chip) |
2485 | { |
2486 | @@ -648,10 +647,6 @@ static inline void pwmchip_sysfs_export(struct pwm_chip *chip) |
2487 | static inline void pwmchip_sysfs_unexport(struct pwm_chip *chip) |
2488 | { |
2489 | } |
2490 | - |
2491 | -static inline void pwmchip_sysfs_unexport_children(struct pwm_chip *chip) |
2492 | -{ |
2493 | -} |
2494 | #endif /* CONFIG_PWM_SYSFS */ |
2495 | |
2496 | #endif /* __LINUX_PWM_H */ |
2497 | diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h |
2498 | index cc2d0c3b475b..1dfb75057580 100644 |
2499 | --- a/include/net/bluetooth/hci_core.h |
2500 | +++ b/include/net/bluetooth/hci_core.h |
2501 | @@ -182,9 +182,6 @@ struct adv_info { |
2502 | |
2503 | #define HCI_MAX_SHORT_NAME_LENGTH 10 |
2504 | |
2505 | -/* Min encryption key size to match with SMP */ |
2506 | -#define HCI_MIN_ENC_KEY_SIZE 7 |
2507 | - |
2508 | /* Default LE RPA expiry time, 15 minutes */ |
2509 | #define HCI_DEFAULT_RPA_TIMEOUT (15 * 60) |
2510 | |
2511 | diff --git a/init/initramfs.c b/init/initramfs.c |
2512 | index f6f4a1e4cd54..cd5fb00fcb54 100644 |
2513 | --- a/init/initramfs.c |
2514 | +++ b/init/initramfs.c |
2515 | @@ -612,13 +612,12 @@ static int __init populate_rootfs(void) |
2516 | printk(KERN_INFO "Trying to unpack rootfs image as initramfs...\n"); |
2517 | err = unpack_to_rootfs((char *)initrd_start, |
2518 | initrd_end - initrd_start); |
2519 | - if (!err) { |
2520 | - free_initrd(); |
2521 | + if (!err) |
2522 | goto done; |
2523 | - } else { |
2524 | - clean_rootfs(); |
2525 | - unpack_to_rootfs(__initramfs_start, __initramfs_size); |
2526 | - } |
2527 | + |
2528 | + clean_rootfs(); |
2529 | + unpack_to_rootfs(__initramfs_start, __initramfs_size); |
2530 | + |
2531 | printk(KERN_INFO "rootfs image is not initramfs (%s)" |
2532 | "; looks like an initrd\n", err); |
2533 | fd = ksys_open("/initrd.image", |
2534 | @@ -632,7 +631,6 @@ static int __init populate_rootfs(void) |
2535 | written, initrd_end - initrd_start); |
2536 | |
2537 | ksys_close(fd); |
2538 | - free_initrd(); |
2539 | } |
2540 | done: |
2541 | /* empty statement */; |
2542 | @@ -642,9 +640,9 @@ static int __init populate_rootfs(void) |
2543 | initrd_end - initrd_start); |
2544 | if (err) |
2545 | printk(KERN_EMERG "Initramfs unpacking failed: %s\n", err); |
2546 | - free_initrd(); |
2547 | #endif |
2548 | } |
2549 | + free_initrd(); |
2550 | flush_delayed_fput(); |
2551 | /* |
2552 | * Try loading default modules from initramfs. This gives |
2553 | diff --git a/ipc/mqueue.c b/ipc/mqueue.c |
2554 | index c0d58f390c3b..bce7af1546d9 100644 |
2555 | --- a/ipc/mqueue.c |
2556 | +++ b/ipc/mqueue.c |
2557 | @@ -391,7 +391,8 @@ static void mqueue_evict_inode(struct inode *inode) |
2558 | struct user_struct *user; |
2559 | unsigned long mq_bytes, mq_treesize; |
2560 | struct ipc_namespace *ipc_ns; |
2561 | - struct msg_msg *msg; |
2562 | + struct msg_msg *msg, *nmsg; |
2563 | + LIST_HEAD(tmp_msg); |
2564 | |
2565 | clear_inode(inode); |
2566 | |
2567 | @@ -402,10 +403,15 @@ static void mqueue_evict_inode(struct inode *inode) |
2568 | info = MQUEUE_I(inode); |
2569 | spin_lock(&info->lock); |
2570 | while ((msg = msg_get(info)) != NULL) |
2571 | - free_msg(msg); |
2572 | + list_add_tail(&msg->m_list, &tmp_msg); |
2573 | kfree(info->node_cache); |
2574 | spin_unlock(&info->lock); |
2575 | |
2576 | + list_for_each_entry_safe(msg, nmsg, &tmp_msg, m_list) { |
2577 | + list_del(&msg->m_list); |
2578 | + free_msg(msg); |
2579 | + } |
2580 | + |
2581 | /* Total amount of bytes accounted for the mqueue */ |
2582 | mq_treesize = info->attr.mq_maxmsg * sizeof(struct msg_msg) + |
2583 | min_t(unsigned int, info->attr.mq_maxmsg, MQ_PRIO_MAX) * |
2584 | diff --git a/ipc/msgutil.c b/ipc/msgutil.c |
2585 | index 84598025a6ad..e65593742e2b 100644 |
2586 | --- a/ipc/msgutil.c |
2587 | +++ b/ipc/msgutil.c |
2588 | @@ -18,6 +18,7 @@ |
2589 | #include <linux/utsname.h> |
2590 | #include <linux/proc_ns.h> |
2591 | #include <linux/uaccess.h> |
2592 | +#include <linux/sched.h> |
2593 | |
2594 | #include "util.h" |
2595 | |
2596 | @@ -64,6 +65,9 @@ static struct msg_msg *alloc_msg(size_t len) |
2597 | pseg = &msg->next; |
2598 | while (len > 0) { |
2599 | struct msg_msgseg *seg; |
2600 | + |
2601 | + cond_resched(); |
2602 | + |
2603 | alen = min(len, DATALEN_SEG); |
2604 | seg = kmalloc(sizeof(*seg) + alen, GFP_KERNEL_ACCOUNT); |
2605 | if (seg == NULL) |
2606 | @@ -176,6 +180,8 @@ void free_msg(struct msg_msg *msg) |
2607 | kfree(msg); |
2608 | while (seg != NULL) { |
2609 | struct msg_msgseg *tmp = seg->next; |
2610 | + |
2611 | + cond_resched(); |
2612 | kfree(seg); |
2613 | seg = tmp; |
2614 | } |
2615 | diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c |
2616 | index acc2305ad895..d3580a68dbef 100644 |
2617 | --- a/kernel/bpf/verifier.c |
2618 | +++ b/kernel/bpf/verifier.c |
2619 | @@ -5743,7 +5743,7 @@ static int convert_ctx_accesses(struct bpf_verifier_env *env) |
2620 | insn->dst_reg, |
2621 | shift); |
2622 | insn_buf[cnt++] = BPF_ALU64_IMM(BPF_AND, insn->dst_reg, |
2623 | - (1 << size * 8) - 1); |
2624 | + (1ULL << size * 8) - 1); |
2625 | } |
2626 | } |
2627 | |
2628 | diff --git a/kernel/sys.c b/kernel/sys.c |
2629 | index 123bd73046ec..096932a45046 100644 |
2630 | --- a/kernel/sys.c |
2631 | +++ b/kernel/sys.c |
2632 | @@ -1919,7 +1919,7 @@ static int validate_prctl_map(struct prctl_mm_map *prctl_map) |
2633 | ((unsigned long)prctl_map->__m1 __op \ |
2634 | (unsigned long)prctl_map->__m2) ? 0 : -EINVAL |
2635 | error = __prctl_check_order(start_code, <, end_code); |
2636 | - error |= __prctl_check_order(start_data, <, end_data); |
2637 | + error |= __prctl_check_order(start_data,<=, end_data); |
2638 | error |= __prctl_check_order(start_brk, <=, brk); |
2639 | error |= __prctl_check_order(arg_start, <=, arg_end); |
2640 | error |= __prctl_check_order(env_start, <=, env_end); |
2641 | diff --git a/kernel/sysctl.c b/kernel/sysctl.c |
2642 | index 9a85c7ae7362..f8576509c7be 100644 |
2643 | --- a/kernel/sysctl.c |
2644 | +++ b/kernel/sysctl.c |
2645 | @@ -2791,8 +2791,10 @@ static int __do_proc_doulongvec_minmax(void *data, struct ctl_table *table, int |
2646 | if (neg) |
2647 | continue; |
2648 | val = convmul * val / convdiv; |
2649 | - if ((min && val < *min) || (max && val > *max)) |
2650 | - continue; |
2651 | + if ((min && val < *min) || (max && val > *max)) { |
2652 | + err = -EINVAL; |
2653 | + break; |
2654 | + } |
2655 | *i = val; |
2656 | } else { |
2657 | val = convdiv * (*i) / convmul; |
2658 | diff --git a/kernel/time/ntp.c b/kernel/time/ntp.c |
2659 | index c5e0cba3b39c..6b23cd584295 100644 |
2660 | --- a/kernel/time/ntp.c |
2661 | +++ b/kernel/time/ntp.c |
2662 | @@ -698,7 +698,7 @@ static inline void process_adjtimex_modes(const struct timex *txc, s32 *time_tai |
2663 | time_constant = max(time_constant, 0l); |
2664 | } |
2665 | |
2666 | - if (txc->modes & ADJ_TAI && txc->constant > 0) |
2667 | + if (txc->modes & ADJ_TAI && txc->constant >= 0) |
2668 | *time_tai = txc->constant; |
2669 | |
2670 | if (txc->modes & ADJ_OFFSET) |
2671 | diff --git a/mm/Kconfig b/mm/Kconfig |
2672 | index de64ea658716..b457e94ae618 100644 |
2673 | --- a/mm/Kconfig |
2674 | +++ b/mm/Kconfig |
2675 | @@ -700,12 +700,12 @@ config DEV_PAGEMAP_OPS |
2676 | |
2677 | config HMM |
2678 | bool |
2679 | + select MMU_NOTIFIER |
2680 | select MIGRATE_VMA_HELPER |
2681 | |
2682 | config HMM_MIRROR |
2683 | bool "HMM mirror CPU page table into a device page table" |
2684 | depends on ARCH_HAS_HMM |
2685 | - select MMU_NOTIFIER |
2686 | select HMM |
2687 | help |
2688 | Select HMM_MIRROR if you want to mirror range of the CPU page table of a |
2689 | diff --git a/mm/cma.c b/mm/cma.c |
2690 | index bfe9f5397165..476dfe13a701 100644 |
2691 | --- a/mm/cma.c |
2692 | +++ b/mm/cma.c |
2693 | @@ -106,8 +106,10 @@ static int __init cma_activate_area(struct cma *cma) |
2694 | |
2695 | cma->bitmap = kzalloc(bitmap_size, GFP_KERNEL); |
2696 | |
2697 | - if (!cma->bitmap) |
2698 | + if (!cma->bitmap) { |
2699 | + cma->count = 0; |
2700 | return -ENOMEM; |
2701 | + } |
2702 | |
2703 | WARN_ON_ONCE(!pfn_valid(pfn)); |
2704 | zone = page_zone(pfn_to_page(pfn)); |
2705 | @@ -369,23 +371,26 @@ err: |
2706 | #ifdef CONFIG_CMA_DEBUG |
2707 | static void cma_debug_show_areas(struct cma *cma) |
2708 | { |
2709 | - unsigned long next_zero_bit, next_set_bit; |
2710 | + unsigned long next_zero_bit, next_set_bit, nr_zero; |
2711 | unsigned long start = 0; |
2712 | - unsigned int nr_zero, nr_total = 0; |
2713 | + unsigned long nr_part, nr_total = 0; |
2714 | + unsigned long nbits = cma_bitmap_maxno(cma); |
2715 | |
2716 | mutex_lock(&cma->lock); |
2717 | pr_info("number of available pages: "); |
2718 | for (;;) { |
2719 | - next_zero_bit = find_next_zero_bit(cma->bitmap, cma->count, start); |
2720 | - if (next_zero_bit >= cma->count) |
2721 | + next_zero_bit = find_next_zero_bit(cma->bitmap, nbits, start); |
2722 | + if (next_zero_bit >= nbits) |
2723 | break; |
2724 | - next_set_bit = find_next_bit(cma->bitmap, cma->count, next_zero_bit); |
2725 | + next_set_bit = find_next_bit(cma->bitmap, nbits, next_zero_bit); |
2726 | nr_zero = next_set_bit - next_zero_bit; |
2727 | - pr_cont("%s%u@%lu", nr_total ? "+" : "", nr_zero, next_zero_bit); |
2728 | - nr_total += nr_zero; |
2729 | + nr_part = nr_zero << cma->order_per_bit; |
2730 | + pr_cont("%s%lu@%lu", nr_total ? "+" : "", nr_part, |
2731 | + next_zero_bit); |
2732 | + nr_total += nr_part; |
2733 | start = next_zero_bit + nr_zero; |
2734 | } |
2735 | - pr_cont("=> %u free of %lu total pages\n", nr_total, cma->count); |
2736 | + pr_cont("=> %lu free of %lu total pages\n", nr_total, cma->count); |
2737 | mutex_unlock(&cma->lock); |
2738 | } |
2739 | #else |
2740 | diff --git a/mm/cma_debug.c b/mm/cma_debug.c |
2741 | index ad6723e9d110..3e0415076cc9 100644 |
2742 | --- a/mm/cma_debug.c |
2743 | +++ b/mm/cma_debug.c |
2744 | @@ -58,7 +58,7 @@ static int cma_maxchunk_get(void *data, u64 *val) |
2745 | mutex_lock(&cma->lock); |
2746 | for (;;) { |
2747 | start = find_next_zero_bit(cma->bitmap, bitmap_maxno, end); |
2748 | - if (start >= cma->count) |
2749 | + if (start >= bitmap_maxno) |
2750 | break; |
2751 | end = find_next_bit(cma->bitmap, bitmap_maxno, start); |
2752 | maxchunk = max(end - start, maxchunk); |
2753 | diff --git a/mm/hugetlb.c b/mm/hugetlb.c |
2754 | index 0bbb033d7d8c..65179513c2b2 100644 |
2755 | --- a/mm/hugetlb.c |
2756 | +++ b/mm/hugetlb.c |
2757 | @@ -1256,12 +1256,23 @@ void free_huge_page(struct page *page) |
2758 | ClearPagePrivate(page); |
2759 | |
2760 | /* |
2761 | - * A return code of zero implies that the subpool will be under its |
2762 | - * minimum size if the reservation is not restored after page is free. |
2763 | - * Therefore, force restore_reserve operation. |
2764 | + * If PagePrivate() was set on page, page allocation consumed a |
2765 | + * reservation. If the page was associated with a subpool, there |
2766 | + * would have been a page reserved in the subpool before allocation |
2767 | + * via hugepage_subpool_get_pages(). Since we are 'restoring' the |
2768 | + * reservtion, do not call hugepage_subpool_put_pages() as this will |
2769 | + * remove the reserved page from the subpool. |
2770 | */ |
2771 | - if (hugepage_subpool_put_pages(spool, 1) == 0) |
2772 | - restore_reserve = true; |
2773 | + if (!restore_reserve) { |
2774 | + /* |
2775 | + * A return code of zero implies that the subpool will be |
2776 | + * under its minimum size if the reservation is not restored |
2777 | + * after page is free. Therefore, force restore_reserve |
2778 | + * operation. |
2779 | + */ |
2780 | + if (hugepage_subpool_put_pages(spool, 1) == 0) |
2781 | + restore_reserve = true; |
2782 | + } |
2783 | |
2784 | spin_lock(&hugetlb_lock); |
2785 | clear_page_huge_active(page); |
2786 | diff --git a/mm/page_alloc.c b/mm/page_alloc.c |
2787 | index 8e6932a140b8..2d04bd2e1ced 100644 |
2788 | --- a/mm/page_alloc.c |
2789 | +++ b/mm/page_alloc.c |
2790 | @@ -5937,13 +5937,15 @@ static unsigned long __meminit zone_spanned_pages_in_node(int nid, |
2791 | unsigned long *zone_end_pfn, |
2792 | unsigned long *ignored) |
2793 | { |
2794 | + unsigned long zone_low = arch_zone_lowest_possible_pfn[zone_type]; |
2795 | + unsigned long zone_high = arch_zone_highest_possible_pfn[zone_type]; |
2796 | /* When hotadd a new node from cpu_up(), the node should be empty */ |
2797 | if (!node_start_pfn && !node_end_pfn) |
2798 | return 0; |
2799 | |
2800 | /* Get the start and end of the zone */ |
2801 | - *zone_start_pfn = arch_zone_lowest_possible_pfn[zone_type]; |
2802 | - *zone_end_pfn = arch_zone_highest_possible_pfn[zone_type]; |
2803 | + *zone_start_pfn = clamp(node_start_pfn, zone_low, zone_high); |
2804 | + *zone_end_pfn = clamp(node_end_pfn, zone_low, zone_high); |
2805 | adjust_zone_range_for_zone_movable(nid, zone_type, |
2806 | node_start_pfn, node_end_pfn, |
2807 | zone_start_pfn, zone_end_pfn); |
2808 | diff --git a/mm/percpu.c b/mm/percpu.c |
2809 | index 41e58f3d8fbf..ff76fa0b7528 100644 |
2810 | --- a/mm/percpu.c |
2811 | +++ b/mm/percpu.c |
2812 | @@ -988,7 +988,8 @@ static int pcpu_alloc_area(struct pcpu_chunk *chunk, int alloc_bits, |
2813 | /* |
2814 | * Search to find a fit. |
2815 | */ |
2816 | - end = start + alloc_bits + PCPU_BITMAP_BLOCK_BITS; |
2817 | + end = min_t(int, start + alloc_bits + PCPU_BITMAP_BLOCK_BITS, |
2818 | + pcpu_chunk_map_bits(chunk)); |
2819 | bit_off = bitmap_find_next_zero_area(chunk->alloc_map, end, start, |
2820 | alloc_bits, align_mask); |
2821 | if (bit_off >= end) |
2822 | @@ -1721,6 +1722,7 @@ void free_percpu(void __percpu *ptr) |
2823 | struct pcpu_chunk *chunk; |
2824 | unsigned long flags; |
2825 | int off; |
2826 | + bool need_balance = false; |
2827 | |
2828 | if (!ptr) |
2829 | return; |
2830 | @@ -1742,7 +1744,7 @@ void free_percpu(void __percpu *ptr) |
2831 | |
2832 | list_for_each_entry(pos, &pcpu_slot[pcpu_nr_slots - 1], list) |
2833 | if (pos != chunk) { |
2834 | - pcpu_schedule_balance_work(); |
2835 | + need_balance = true; |
2836 | break; |
2837 | } |
2838 | } |
2839 | @@ -1750,6 +1752,9 @@ void free_percpu(void __percpu *ptr) |
2840 | trace_percpu_free_percpu(chunk->base_addr, off, ptr); |
2841 | |
2842 | spin_unlock_irqrestore(&pcpu_lock, flags); |
2843 | + |
2844 | + if (need_balance) |
2845 | + pcpu_schedule_balance_work(); |
2846 | } |
2847 | EXPORT_SYMBOL_GPL(free_percpu); |
2848 | |
2849 | diff --git a/mm/rmap.c b/mm/rmap.c |
2850 | index 85b7f9423352..f048c2651954 100644 |
2851 | --- a/mm/rmap.c |
2852 | +++ b/mm/rmap.c |
2853 | @@ -926,7 +926,7 @@ static bool page_mkclean_one(struct page *page, struct vm_area_struct *vma, |
2854 | continue; |
2855 | |
2856 | flush_cache_page(vma, address, page_to_pfn(page)); |
2857 | - entry = pmdp_huge_clear_flush(vma, address, pmd); |
2858 | + entry = pmdp_invalidate(vma, address, pmd); |
2859 | entry = pmd_wrprotect(entry); |
2860 | entry = pmd_mkclean(entry); |
2861 | set_pmd_at(vma->vm_mm, address, pmd, entry); |
2862 | diff --git a/mm/slab.c b/mm/slab.c |
2863 | index 018d32496e8d..46f21e73db2f 100644 |
2864 | --- a/mm/slab.c |
2865 | +++ b/mm/slab.c |
2866 | @@ -4326,8 +4326,12 @@ static int leaks_show(struct seq_file *m, void *p) |
2867 | * whole processing. |
2868 | */ |
2869 | do { |
2870 | - set_store_user_clean(cachep); |
2871 | drain_cpu_caches(cachep); |
2872 | + /* |
2873 | + * drain_cpu_caches() could make kmemleak_object and |
2874 | + * debug_objects_cache dirty, so reset afterwards. |
2875 | + */ |
2876 | + set_store_user_clean(cachep); |
2877 | |
2878 | x[1] = 0; |
2879 | |
2880 | diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c |
2881 | index 3cf0764d5793..bd4978ce8c45 100644 |
2882 | --- a/net/bluetooth/hci_conn.c |
2883 | +++ b/net/bluetooth/hci_conn.c |
2884 | @@ -1276,14 +1276,6 @@ int hci_conn_check_link_mode(struct hci_conn *conn) |
2885 | !test_bit(HCI_CONN_ENCRYPT, &conn->flags)) |
2886 | return 0; |
2887 | |
2888 | - /* The minimum encryption key size needs to be enforced by the |
2889 | - * host stack before establishing any L2CAP connections. The |
2890 | - * specification in theory allows a minimum of 1, but to align |
2891 | - * BR/EDR and LE transports, a minimum of 7 is chosen. |
2892 | - */ |
2893 | - if (conn->enc_key_size < HCI_MIN_ENC_KEY_SIZE) |
2894 | - return 0; |
2895 | - |
2896 | return 1; |
2897 | } |
2898 | |
2899 | diff --git a/net/netfilter/nf_conntrack_h323_asn1.c b/net/netfilter/nf_conntrack_h323_asn1.c |
2900 | index 1601275efe2d..4c2ef42e189c 100644 |
2901 | --- a/net/netfilter/nf_conntrack_h323_asn1.c |
2902 | +++ b/net/netfilter/nf_conntrack_h323_asn1.c |
2903 | @@ -172,7 +172,7 @@ static int nf_h323_error_boundary(struct bitstr *bs, size_t bytes, size_t bits) |
2904 | if (bits % BITS_PER_BYTE > 0) |
2905 | bytes++; |
2906 | |
2907 | - if (*bs->cur + bytes > *bs->end) |
2908 | + if (bs->cur + bytes > bs->end) |
2909 | return 1; |
2910 | |
2911 | return 0; |
2912 | diff --git a/net/netfilter/nf_flow_table_core.c b/net/netfilter/nf_flow_table_core.c |
2913 | index e1537ace2b90..5df7486bb416 100644 |
2914 | --- a/net/netfilter/nf_flow_table_core.c |
2915 | +++ b/net/netfilter/nf_flow_table_core.c |
2916 | @@ -185,14 +185,25 @@ static const struct rhashtable_params nf_flow_offload_rhash_params = { |
2917 | |
2918 | int flow_offload_add(struct nf_flowtable *flow_table, struct flow_offload *flow) |
2919 | { |
2920 | - flow->timeout = (u32)jiffies; |
2921 | + int err; |
2922 | |
2923 | - rhashtable_insert_fast(&flow_table->rhashtable, |
2924 | - &flow->tuplehash[FLOW_OFFLOAD_DIR_ORIGINAL].node, |
2925 | - nf_flow_offload_rhash_params); |
2926 | - rhashtable_insert_fast(&flow_table->rhashtable, |
2927 | - &flow->tuplehash[FLOW_OFFLOAD_DIR_REPLY].node, |
2928 | - nf_flow_offload_rhash_params); |
2929 | + err = rhashtable_insert_fast(&flow_table->rhashtable, |
2930 | + &flow->tuplehash[0].node, |
2931 | + nf_flow_offload_rhash_params); |
2932 | + if (err < 0) |
2933 | + return err; |
2934 | + |
2935 | + err = rhashtable_insert_fast(&flow_table->rhashtable, |
2936 | + &flow->tuplehash[1].node, |
2937 | + nf_flow_offload_rhash_params); |
2938 | + if (err < 0) { |
2939 | + rhashtable_remove_fast(&flow_table->rhashtable, |
2940 | + &flow->tuplehash[0].node, |
2941 | + nf_flow_offload_rhash_params); |
2942 | + return err; |
2943 | + } |
2944 | + |
2945 | + flow->timeout = (u32)jiffies; |
2946 | return 0; |
2947 | } |
2948 | EXPORT_SYMBOL_GPL(flow_offload_add); |
2949 | diff --git a/net/netfilter/nf_flow_table_ip.c b/net/netfilter/nf_flow_table_ip.c |
2950 | index 15ed91309992..129e9ec99ec9 100644 |
2951 | --- a/net/netfilter/nf_flow_table_ip.c |
2952 | +++ b/net/netfilter/nf_flow_table_ip.c |
2953 | @@ -181,6 +181,9 @@ static int nf_flow_tuple_ip(struct sk_buff *skb, const struct net_device *dev, |
2954 | iph->protocol != IPPROTO_UDP) |
2955 | return -1; |
2956 | |
2957 | + if (iph->ttl <= 1) |
2958 | + return -1; |
2959 | + |
2960 | thoff = iph->ihl * 4; |
2961 | if (!pskb_may_pull(skb, thoff + sizeof(*ports))) |
2962 | return -1; |
2963 | @@ -412,6 +415,9 @@ static int nf_flow_tuple_ipv6(struct sk_buff *skb, const struct net_device *dev, |
2964 | ip6h->nexthdr != IPPROTO_UDP) |
2965 | return -1; |
2966 | |
2967 | + if (ip6h->hop_limit <= 1) |
2968 | + return -1; |
2969 | + |
2970 | thoff = sizeof(*ip6h); |
2971 | if (!pskb_may_pull(skb, thoff + sizeof(*ports))) |
2972 | return -1; |
2973 | diff --git a/net/netfilter/nf_tables_api.c b/net/netfilter/nf_tables_api.c |
2974 | index ebfcfe1dcbdb..29ff59dd99ac 100644 |
2975 | --- a/net/netfilter/nf_tables_api.c |
2976 | +++ b/net/netfilter/nf_tables_api.c |
2977 | @@ -1142,6 +1142,9 @@ static int nft_dump_stats(struct sk_buff *skb, struct nft_stats __percpu *stats) |
2978 | u64 pkts, bytes; |
2979 | int cpu; |
2980 | |
2981 | + if (!stats) |
2982 | + return 0; |
2983 | + |
2984 | memset(&total, 0, sizeof(total)); |
2985 | for_each_possible_cpu(cpu) { |
2986 | cpu_stats = per_cpu_ptr(stats, cpu); |
2987 | @@ -1199,6 +1202,7 @@ static int nf_tables_fill_chain_info(struct sk_buff *skb, struct net *net, |
2988 | if (nft_is_base_chain(chain)) { |
2989 | const struct nft_base_chain *basechain = nft_base_chain(chain); |
2990 | const struct nf_hook_ops *ops = &basechain->ops; |
2991 | + struct nft_stats __percpu *stats; |
2992 | struct nlattr *nest; |
2993 | |
2994 | nest = nla_nest_start(skb, NFTA_CHAIN_HOOK); |
2995 | @@ -1220,8 +1224,9 @@ static int nf_tables_fill_chain_info(struct sk_buff *skb, struct net *net, |
2996 | if (nla_put_string(skb, NFTA_CHAIN_TYPE, basechain->type->name)) |
2997 | goto nla_put_failure; |
2998 | |
2999 | - if (rcu_access_pointer(basechain->stats) && |
3000 | - nft_dump_stats(skb, rcu_dereference(basechain->stats))) |
3001 | + stats = rcu_dereference_check(basechain->stats, |
3002 | + lockdep_commit_lock_is_held(net)); |
3003 | + if (nft_dump_stats(skb, stats)) |
3004 | goto nla_put_failure; |
3005 | } |
3006 | |
3007 | diff --git a/net/netfilter/nft_flow_offload.c b/net/netfilter/nft_flow_offload.c |
3008 | index 436cc14cfc59..7f85af4c40ff 100644 |
3009 | --- a/net/netfilter/nft_flow_offload.c |
3010 | +++ b/net/netfilter/nft_flow_offload.c |
3011 | @@ -113,6 +113,7 @@ static void nft_flow_offload_eval(const struct nft_expr *expr, |
3012 | if (ret < 0) |
3013 | goto err_flow_add; |
3014 | |
3015 | + dst_release(route.tuple[!dir].dst); |
3016 | return; |
3017 | |
3018 | err_flow_add: |
3019 | diff --git a/sound/core/seq/seq_ports.c b/sound/core/seq/seq_ports.c |
3020 | index 24d90abfc64d..da31aa8e216e 100644 |
3021 | --- a/sound/core/seq/seq_ports.c |
3022 | +++ b/sound/core/seq/seq_ports.c |
3023 | @@ -550,10 +550,10 @@ static void delete_and_unsubscribe_port(struct snd_seq_client *client, |
3024 | list_del_init(list); |
3025 | grp->exclusive = 0; |
3026 | write_unlock_irq(&grp->list_lock); |
3027 | - up_write(&grp->list_mutex); |
3028 | |
3029 | if (!empty) |
3030 | unsubscribe_port(client, port, grp, &subs->info, ack); |
3031 | + up_write(&grp->list_mutex); |
3032 | } |
3033 | |
3034 | /* connect two ports */ |
3035 | diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c |
3036 | index 9bc8a7cb40ea..45bf89ed31de 100644 |
3037 | --- a/sound/pci/hda/hda_intel.c |
3038 | +++ b/sound/pci/hda/hda_intel.c |
3039 | @@ -1883,9 +1883,6 @@ static int azx_first_init(struct azx *chip) |
3040 | chip->msi = 0; |
3041 | } |
3042 | |
3043 | - if (azx_acquire_irq(chip, 0) < 0) |
3044 | - return -EBUSY; |
3045 | - |
3046 | pci_set_master(pci); |
3047 | synchronize_irq(bus->irq); |
3048 | |
3049 | @@ -2000,6 +1997,9 @@ static int azx_first_init(struct azx *chip) |
3050 | return -ENODEV; |
3051 | } |
3052 | |
3053 | + if (azx_acquire_irq(chip, 0) < 0) |
3054 | + return -EBUSY; |
3055 | + |
3056 | strcpy(card->driver, "HDA-Intel"); |
3057 | strlcpy(card->shortname, driver_short_names[chip->driver_type], |
3058 | sizeof(card->shortname)); |
3059 | diff --git a/tools/objtool/check.c b/tools/objtool/check.c |
3060 | index 46be34576620..02a47e365e52 100644 |
3061 | --- a/tools/objtool/check.c |
3062 | +++ b/tools/objtool/check.c |
3063 | @@ -28,6 +28,8 @@ |
3064 | #include <linux/hashtable.h> |
3065 | #include <linux/kernel.h> |
3066 | |
3067 | +#define FAKE_JUMP_OFFSET -1 |
3068 | + |
3069 | struct alternative { |
3070 | struct list_head list; |
3071 | struct instruction *insn; |
3072 | @@ -501,7 +503,7 @@ static int add_jump_destinations(struct objtool_file *file) |
3073 | insn->type != INSN_JUMP_UNCONDITIONAL) |
3074 | continue; |
3075 | |
3076 | - if (insn->ignore) |
3077 | + if (insn->ignore || insn->offset == FAKE_JUMP_OFFSET) |
3078 | continue; |
3079 | |
3080 | rela = find_rela_by_dest_range(insn->sec, insn->offset, |
3081 | @@ -670,10 +672,10 @@ static int handle_group_alt(struct objtool_file *file, |
3082 | clear_insn_state(&fake_jump->state); |
3083 | |
3084 | fake_jump->sec = special_alt->new_sec; |
3085 | - fake_jump->offset = -1; |
3086 | + fake_jump->offset = FAKE_JUMP_OFFSET; |
3087 | fake_jump->type = INSN_JUMP_UNCONDITIONAL; |
3088 | fake_jump->jump_dest = list_next_entry(last_orig_insn, list); |
3089 | - fake_jump->ignore = true; |
3090 | + fake_jump->func = orig_insn->func; |
3091 | } |
3092 | |
3093 | if (!special_alt->new_len) { |