Contents of /trunk/kernel-alx/patches-4.19/0133-4.19.34-all-fixes.patch
Parent Directory | Revision Log
Revision 3412 -
(show annotations)
(download)
Fri Aug 2 11:47:43 2019 UTC (5 years, 1 month ago) by niro
File size: 211095 byte(s)
Fri Aug 2 11:47:43 2019 UTC (5 years, 1 month ago) by niro
File size: 211095 byte(s)
-linux-4.19.34
1 | diff --git a/Documentation/arm/kernel_mode_neon.txt b/Documentation/arm/kernel_mode_neon.txt |
2 | index 525452726d31..b9e060c5b61e 100644 |
3 | --- a/Documentation/arm/kernel_mode_neon.txt |
4 | +++ b/Documentation/arm/kernel_mode_neon.txt |
5 | @@ -6,7 +6,7 @@ TL;DR summary |
6 | * Use only NEON instructions, or VFP instructions that don't rely on support |
7 | code |
8 | * Isolate your NEON code in a separate compilation unit, and compile it with |
9 | - '-mfpu=neon -mfloat-abi=softfp' |
10 | + '-march=armv7-a -mfpu=neon -mfloat-abi=softfp' |
11 | * Put kernel_neon_begin() and kernel_neon_end() calls around the calls into your |
12 | NEON code |
13 | * Don't sleep in your NEON code, and be aware that it will be executed with |
14 | @@ -87,7 +87,7 @@ instructions appearing in unexpected places if no special care is taken. |
15 | Therefore, the recommended and only supported way of using NEON/VFP in the |
16 | kernel is by adhering to the following rules: |
17 | * isolate the NEON code in a separate compilation unit and compile it with |
18 | - '-mfpu=neon -mfloat-abi=softfp'; |
19 | + '-march=armv7-a -mfpu=neon -mfloat-abi=softfp'; |
20 | * issue the calls to kernel_neon_begin(), kernel_neon_end() as well as the calls |
21 | into the unit containing the NEON code from a compilation unit which is *not* |
22 | built with the GCC flag '-mfpu=neon' set. |
23 | diff --git a/Makefile b/Makefile |
24 | index 8de5fab711d8..8fdfe0af5862 100644 |
25 | --- a/Makefile |
26 | +++ b/Makefile |
27 | @@ -1,7 +1,7 @@ |
28 | # SPDX-License-Identifier: GPL-2.0 |
29 | VERSION = 4 |
30 | PATCHLEVEL = 19 |
31 | -SUBLEVEL = 33 |
32 | +SUBLEVEL = 34 |
33 | EXTRAVERSION = |
34 | NAME = "People's Front" |
35 | |
36 | @@ -626,12 +626,15 @@ ifeq ($(may-sync-config),1) |
37 | -include include/config/auto.conf.cmd |
38 | |
39 | # To avoid any implicit rule to kick in, define an empty command |
40 | -$(KCONFIG_CONFIG) include/config/auto.conf.cmd: ; |
41 | +$(KCONFIG_CONFIG): ; |
42 | |
43 | # The actual configuration files used during the build are stored in |
44 | # include/generated/ and include/config/. Update them if .config is newer than |
45 | # include/config/auto.conf (which mirrors .config). |
46 | -include/config/%.conf: $(KCONFIG_CONFIG) include/config/auto.conf.cmd |
47 | +# |
48 | +# This exploits the 'multi-target pattern rule' trick. |
49 | +# The syncconfig should be executed only once to make all the targets. |
50 | +%/auto.conf %/auto.conf.cmd %/tristate.conf: $(KCONFIG_CONFIG) |
51 | $(Q)$(MAKE) -f $(srctree)/Makefile syncconfig |
52 | else |
53 | # External modules and some install targets need include/generated/autoconf.h |
54 | diff --git a/arch/arm/boot/dts/lpc32xx.dtsi b/arch/arm/boot/dts/lpc32xx.dtsi |
55 | index abff7ef7c9cd..4981741377f3 100644 |
56 | --- a/arch/arm/boot/dts/lpc32xx.dtsi |
57 | +++ b/arch/arm/boot/dts/lpc32xx.dtsi |
58 | @@ -230,7 +230,7 @@ |
59 | status = "disabled"; |
60 | }; |
61 | |
62 | - i2s1: i2s@2009C000 { |
63 | + i2s1: i2s@2009c000 { |
64 | compatible = "nxp,lpc3220-i2s"; |
65 | reg = <0x2009C000 0x1000>; |
66 | }; |
67 | @@ -273,7 +273,7 @@ |
68 | status = "disabled"; |
69 | }; |
70 | |
71 | - i2c1: i2c@400A0000 { |
72 | + i2c1: i2c@400a0000 { |
73 | compatible = "nxp,pnx-i2c"; |
74 | reg = <0x400A0000 0x100>; |
75 | interrupt-parent = <&sic1>; |
76 | @@ -284,7 +284,7 @@ |
77 | clocks = <&clk LPC32XX_CLK_I2C1>; |
78 | }; |
79 | |
80 | - i2c2: i2c@400A8000 { |
81 | + i2c2: i2c@400a8000 { |
82 | compatible = "nxp,pnx-i2c"; |
83 | reg = <0x400A8000 0x100>; |
84 | interrupt-parent = <&sic1>; |
85 | @@ -295,7 +295,7 @@ |
86 | clocks = <&clk LPC32XX_CLK_I2C2>; |
87 | }; |
88 | |
89 | - mpwm: mpwm@400E8000 { |
90 | + mpwm: mpwm@400e8000 { |
91 | compatible = "nxp,lpc3220-motor-pwm"; |
92 | reg = <0x400E8000 0x78>; |
93 | status = "disabled"; |
94 | @@ -394,7 +394,7 @@ |
95 | #gpio-cells = <3>; /* bank, pin, flags */ |
96 | }; |
97 | |
98 | - timer4: timer@4002C000 { |
99 | + timer4: timer@4002c000 { |
100 | compatible = "nxp,lpc3220-timer"; |
101 | reg = <0x4002C000 0x1000>; |
102 | interrupts = <3 IRQ_TYPE_LEVEL_LOW>; |
103 | @@ -412,7 +412,7 @@ |
104 | status = "disabled"; |
105 | }; |
106 | |
107 | - watchdog: watchdog@4003C000 { |
108 | + watchdog: watchdog@4003c000 { |
109 | compatible = "nxp,pnx4008-wdt"; |
110 | reg = <0x4003C000 0x1000>; |
111 | clocks = <&clk LPC32XX_CLK_WDOG>; |
112 | @@ -451,7 +451,7 @@ |
113 | status = "disabled"; |
114 | }; |
115 | |
116 | - timer1: timer@4004C000 { |
117 | + timer1: timer@4004c000 { |
118 | compatible = "nxp,lpc3220-timer"; |
119 | reg = <0x4004C000 0x1000>; |
120 | interrupts = <17 IRQ_TYPE_LEVEL_LOW>; |
121 | @@ -475,7 +475,7 @@ |
122 | status = "disabled"; |
123 | }; |
124 | |
125 | - pwm1: pwm@4005C000 { |
126 | + pwm1: pwm@4005c000 { |
127 | compatible = "nxp,lpc3220-pwm"; |
128 | reg = <0x4005C000 0x4>; |
129 | clocks = <&clk LPC32XX_CLK_PWM1>; |
130 | @@ -484,7 +484,7 @@ |
131 | status = "disabled"; |
132 | }; |
133 | |
134 | - pwm2: pwm@4005C004 { |
135 | + pwm2: pwm@4005c004 { |
136 | compatible = "nxp,lpc3220-pwm"; |
137 | reg = <0x4005C004 0x4>; |
138 | clocks = <&clk LPC32XX_CLK_PWM2>; |
139 | diff --git a/arch/arm/boot/dts/meson8b.dtsi b/arch/arm/boot/dts/meson8b.dtsi |
140 | index 08f7f6be7254..5b3e5c50c72f 100644 |
141 | --- a/arch/arm/boot/dts/meson8b.dtsi |
142 | +++ b/arch/arm/boot/dts/meson8b.dtsi |
143 | @@ -207,9 +207,7 @@ |
144 | groups = "eth_tx_clk", |
145 | "eth_tx_en", |
146 | "eth_txd1_0", |
147 | - "eth_txd1_1", |
148 | "eth_txd0_0", |
149 | - "eth_txd0_1", |
150 | "eth_rx_clk", |
151 | "eth_rx_dv", |
152 | "eth_rxd1", |
153 | @@ -218,7 +216,9 @@ |
154 | "eth_mdc", |
155 | "eth_ref_clk", |
156 | "eth_txd2", |
157 | - "eth_txd3"; |
158 | + "eth_txd3", |
159 | + "eth_rxd3", |
160 | + "eth_rxd2"; |
161 | function = "ethernet"; |
162 | }; |
163 | }; |
164 | diff --git a/arch/arm/include/asm/barrier.h b/arch/arm/include/asm/barrier.h |
165 | index 69772e742a0a..83ae97c049d9 100644 |
166 | --- a/arch/arm/include/asm/barrier.h |
167 | +++ b/arch/arm/include/asm/barrier.h |
168 | @@ -11,6 +11,8 @@ |
169 | #define sev() __asm__ __volatile__ ("sev" : : : "memory") |
170 | #define wfe() __asm__ __volatile__ ("wfe" : : : "memory") |
171 | #define wfi() __asm__ __volatile__ ("wfi" : : : "memory") |
172 | +#else |
173 | +#define wfe() do { } while (0) |
174 | #endif |
175 | |
176 | #if __LINUX_ARM_ARCH__ >= 7 |
177 | diff --git a/arch/arm/include/asm/processor.h b/arch/arm/include/asm/processor.h |
178 | index 1bf65b47808a..cb2a3423b714 100644 |
179 | --- a/arch/arm/include/asm/processor.h |
180 | +++ b/arch/arm/include/asm/processor.h |
181 | @@ -95,7 +95,11 @@ extern void release_thread(struct task_struct *); |
182 | unsigned long get_wchan(struct task_struct *p); |
183 | |
184 | #if __LINUX_ARM_ARCH__ == 6 || defined(CONFIG_ARM_ERRATA_754327) |
185 | -#define cpu_relax() smp_mb() |
186 | +#define cpu_relax() \ |
187 | + do { \ |
188 | + smp_mb(); \ |
189 | + __asm__ __volatile__("nop; nop; nop; nop; nop; nop; nop; nop; nop; nop;"); \ |
190 | + } while (0) |
191 | #else |
192 | #define cpu_relax() barrier() |
193 | #endif |
194 | diff --git a/arch/arm/include/asm/v7m.h b/arch/arm/include/asm/v7m.h |
195 | index 187ccf6496ad..2cb00d15831b 100644 |
196 | --- a/arch/arm/include/asm/v7m.h |
197 | +++ b/arch/arm/include/asm/v7m.h |
198 | @@ -49,7 +49,7 @@ |
199 | * (0 -> msp; 1 -> psp). Bits [1:0] are fixed to 0b01. |
200 | */ |
201 | #define EXC_RET_STACK_MASK 0x00000004 |
202 | -#define EXC_RET_THREADMODE_PROCESSSTACK 0xfffffffd |
203 | +#define EXC_RET_THREADMODE_PROCESSSTACK (3 << 2) |
204 | |
205 | /* Cache related definitions */ |
206 | |
207 | diff --git a/arch/arm/kernel/entry-header.S b/arch/arm/kernel/entry-header.S |
208 | index 773424843d6e..62db1c9746cb 100644 |
209 | --- a/arch/arm/kernel/entry-header.S |
210 | +++ b/arch/arm/kernel/entry-header.S |
211 | @@ -127,7 +127,8 @@ |
212 | */ |
213 | .macro v7m_exception_slow_exit ret_r0 |
214 | cpsid i |
215 | - ldr lr, =EXC_RET_THREADMODE_PROCESSSTACK |
216 | + ldr lr, =exc_ret |
217 | + ldr lr, [lr] |
218 | |
219 | @ read original r12, sp, lr, pc and xPSR |
220 | add r12, sp, #S_IP |
221 | diff --git a/arch/arm/kernel/entry-v7m.S b/arch/arm/kernel/entry-v7m.S |
222 | index abcf47848525..19d2dcd6530d 100644 |
223 | --- a/arch/arm/kernel/entry-v7m.S |
224 | +++ b/arch/arm/kernel/entry-v7m.S |
225 | @@ -146,3 +146,7 @@ ENTRY(vector_table) |
226 | .rept CONFIG_CPU_V7M_NUM_IRQ |
227 | .long __irq_entry @ External Interrupts |
228 | .endr |
229 | + .align 2 |
230 | + .globl exc_ret |
231 | +exc_ret: |
232 | + .space 4 |
233 | diff --git a/arch/arm/kernel/machine_kexec.c b/arch/arm/kernel/machine_kexec.c |
234 | index dd2eb5f76b9f..76300f3813e8 100644 |
235 | --- a/arch/arm/kernel/machine_kexec.c |
236 | +++ b/arch/arm/kernel/machine_kexec.c |
237 | @@ -91,8 +91,11 @@ void machine_crash_nonpanic_core(void *unused) |
238 | |
239 | set_cpu_online(smp_processor_id(), false); |
240 | atomic_dec(&waiting_for_crash_ipi); |
241 | - while (1) |
242 | + |
243 | + while (1) { |
244 | cpu_relax(); |
245 | + wfe(); |
246 | + } |
247 | } |
248 | |
249 | void crash_smp_send_stop(void) |
250 | diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c |
251 | index 1d6f5ea522f4..a3ce7c5365fa 100644 |
252 | --- a/arch/arm/kernel/smp.c |
253 | +++ b/arch/arm/kernel/smp.c |
254 | @@ -604,8 +604,10 @@ static void ipi_cpu_stop(unsigned int cpu) |
255 | local_fiq_disable(); |
256 | local_irq_disable(); |
257 | |
258 | - while (1) |
259 | + while (1) { |
260 | cpu_relax(); |
261 | + wfe(); |
262 | + } |
263 | } |
264 | |
265 | static DEFINE_PER_CPU(struct completion *, cpu_completion); |
266 | diff --git a/arch/arm/kernel/unwind.c b/arch/arm/kernel/unwind.c |
267 | index 0bee233fef9a..314cfb232a63 100644 |
268 | --- a/arch/arm/kernel/unwind.c |
269 | +++ b/arch/arm/kernel/unwind.c |
270 | @@ -93,7 +93,7 @@ extern const struct unwind_idx __start_unwind_idx[]; |
271 | static const struct unwind_idx *__origin_unwind_idx; |
272 | extern const struct unwind_idx __stop_unwind_idx[]; |
273 | |
274 | -static DEFINE_SPINLOCK(unwind_lock); |
275 | +static DEFINE_RAW_SPINLOCK(unwind_lock); |
276 | static LIST_HEAD(unwind_tables); |
277 | |
278 | /* Convert a prel31 symbol to an absolute address */ |
279 | @@ -201,7 +201,7 @@ static const struct unwind_idx *unwind_find_idx(unsigned long addr) |
280 | /* module unwind tables */ |
281 | struct unwind_table *table; |
282 | |
283 | - spin_lock_irqsave(&unwind_lock, flags); |
284 | + raw_spin_lock_irqsave(&unwind_lock, flags); |
285 | list_for_each_entry(table, &unwind_tables, list) { |
286 | if (addr >= table->begin_addr && |
287 | addr < table->end_addr) { |
288 | @@ -213,7 +213,7 @@ static const struct unwind_idx *unwind_find_idx(unsigned long addr) |
289 | break; |
290 | } |
291 | } |
292 | - spin_unlock_irqrestore(&unwind_lock, flags); |
293 | + raw_spin_unlock_irqrestore(&unwind_lock, flags); |
294 | } |
295 | |
296 | pr_debug("%s: idx = %p\n", __func__, idx); |
297 | @@ -529,9 +529,9 @@ struct unwind_table *unwind_table_add(unsigned long start, unsigned long size, |
298 | tab->begin_addr = text_addr; |
299 | tab->end_addr = text_addr + text_size; |
300 | |
301 | - spin_lock_irqsave(&unwind_lock, flags); |
302 | + raw_spin_lock_irqsave(&unwind_lock, flags); |
303 | list_add_tail(&tab->list, &unwind_tables); |
304 | - spin_unlock_irqrestore(&unwind_lock, flags); |
305 | + raw_spin_unlock_irqrestore(&unwind_lock, flags); |
306 | |
307 | return tab; |
308 | } |
309 | @@ -543,9 +543,9 @@ void unwind_table_del(struct unwind_table *tab) |
310 | if (!tab) |
311 | return; |
312 | |
313 | - spin_lock_irqsave(&unwind_lock, flags); |
314 | + raw_spin_lock_irqsave(&unwind_lock, flags); |
315 | list_del(&tab->list); |
316 | - spin_unlock_irqrestore(&unwind_lock, flags); |
317 | + raw_spin_unlock_irqrestore(&unwind_lock, flags); |
318 | |
319 | kfree(tab); |
320 | } |
321 | diff --git a/arch/arm/lib/Makefile b/arch/arm/lib/Makefile |
322 | index ad25fd1872c7..0bff0176db2c 100644 |
323 | --- a/arch/arm/lib/Makefile |
324 | +++ b/arch/arm/lib/Makefile |
325 | @@ -39,7 +39,7 @@ $(obj)/csumpartialcopy.o: $(obj)/csumpartialcopygeneric.S |
326 | $(obj)/csumpartialcopyuser.o: $(obj)/csumpartialcopygeneric.S |
327 | |
328 | ifeq ($(CONFIG_KERNEL_MODE_NEON),y) |
329 | - NEON_FLAGS := -mfloat-abi=softfp -mfpu=neon |
330 | + NEON_FLAGS := -march=armv7-a -mfloat-abi=softfp -mfpu=neon |
331 | CFLAGS_xor-neon.o += $(NEON_FLAGS) |
332 | obj-$(CONFIG_XOR_BLOCKS) += xor-neon.o |
333 | endif |
334 | diff --git a/arch/arm/lib/xor-neon.c b/arch/arm/lib/xor-neon.c |
335 | index 2c40aeab3eaa..c691b901092f 100644 |
336 | --- a/arch/arm/lib/xor-neon.c |
337 | +++ b/arch/arm/lib/xor-neon.c |
338 | @@ -14,7 +14,7 @@ |
339 | MODULE_LICENSE("GPL"); |
340 | |
341 | #ifndef __ARM_NEON__ |
342 | -#error You should compile this file with '-mfloat-abi=softfp -mfpu=neon' |
343 | +#error You should compile this file with '-march=armv7-a -mfloat-abi=softfp -mfpu=neon' |
344 | #endif |
345 | |
346 | /* |
347 | diff --git a/arch/arm/mach-omap2/prm_common.c b/arch/arm/mach-omap2/prm_common.c |
348 | index 058a37e6d11c..fd6e0671f957 100644 |
349 | --- a/arch/arm/mach-omap2/prm_common.c |
350 | +++ b/arch/arm/mach-omap2/prm_common.c |
351 | @@ -523,8 +523,10 @@ void omap_prm_reset_system(void) |
352 | |
353 | prm_ll_data->reset_system(); |
354 | |
355 | - while (1) |
356 | + while (1) { |
357 | cpu_relax(); |
358 | + wfe(); |
359 | + } |
360 | } |
361 | |
362 | /** |
363 | diff --git a/arch/arm/mm/proc-v7m.S b/arch/arm/mm/proc-v7m.S |
364 | index 47a5acc64433..92e84181933a 100644 |
365 | --- a/arch/arm/mm/proc-v7m.S |
366 | +++ b/arch/arm/mm/proc-v7m.S |
367 | @@ -139,6 +139,9 @@ __v7m_setup_cont: |
368 | cpsie i |
369 | svc #0 |
370 | 1: cpsid i |
371 | + ldr r0, =exc_ret |
372 | + orr lr, lr, #EXC_RET_THREADMODE_PROCESSSTACK |
373 | + str lr, [r0] |
374 | ldmia sp, {r0-r3, r12} |
375 | str r5, [r12, #11 * 4] @ restore the original SVC vector entry |
376 | mov lr, r6 @ restore LR |
377 | diff --git a/arch/arm64/mm/fault.c b/arch/arm64/mm/fault.c |
378 | index 50b30ff30de4..a4c134677285 100644 |
379 | --- a/arch/arm64/mm/fault.c |
380 | +++ b/arch/arm64/mm/fault.c |
381 | @@ -827,11 +827,12 @@ void __init hook_debug_fault_code(int nr, |
382 | debug_fault_info[nr].name = name; |
383 | } |
384 | |
385 | -asmlinkage int __exception do_debug_exception(unsigned long addr, |
386 | +asmlinkage int __exception do_debug_exception(unsigned long addr_if_watchpoint, |
387 | unsigned int esr, |
388 | struct pt_regs *regs) |
389 | { |
390 | const struct fault_info *inf = debug_fault_info + DBG_ESR_EVT(esr); |
391 | + unsigned long pc = instruction_pointer(regs); |
392 | int rv; |
393 | |
394 | /* |
395 | @@ -841,10 +842,10 @@ asmlinkage int __exception do_debug_exception(unsigned long addr, |
396 | if (interrupts_enabled(regs)) |
397 | trace_hardirqs_off(); |
398 | |
399 | - if (user_mode(regs) && instruction_pointer(regs) > TASK_SIZE) |
400 | + if (user_mode(regs) && pc > TASK_SIZE) |
401 | arm64_apply_bp_hardening(); |
402 | |
403 | - if (!inf->fn(addr, esr, regs)) { |
404 | + if (!inf->fn(addr_if_watchpoint, esr, regs)) { |
405 | rv = 1; |
406 | } else { |
407 | struct siginfo info; |
408 | @@ -853,7 +854,7 @@ asmlinkage int __exception do_debug_exception(unsigned long addr, |
409 | info.si_signo = inf->sig; |
410 | info.si_errno = 0; |
411 | info.si_code = inf->code; |
412 | - info.si_addr = (void __user *)addr; |
413 | + info.si_addr = (void __user *)pc; |
414 | arm64_notify_die(inf->name, regs, &info, esr); |
415 | rv = 0; |
416 | } |
417 | diff --git a/arch/h8300/Makefile b/arch/h8300/Makefile |
418 | index 58634e6bae92..55f251810129 100644 |
419 | --- a/arch/h8300/Makefile |
420 | +++ b/arch/h8300/Makefile |
421 | @@ -27,7 +27,7 @@ KBUILD_LDFLAGS += $(ldflags-y) |
422 | CHECKFLAGS += -msize-long |
423 | |
424 | ifeq ($(CROSS_COMPILE),) |
425 | -CROSS_COMPILE := h8300-unknown-linux- |
426 | +CROSS_COMPILE := $(call cc-cross-prefix, h8300-unknown-linux- h8300-linux-) |
427 | endif |
428 | |
429 | core-y += arch/$(ARCH)/kernel/ arch/$(ARCH)/mm/ |
430 | diff --git a/arch/powerpc/include/asm/topology.h b/arch/powerpc/include/asm/topology.h |
431 | index a4a718dbfec6..f85e2b01c3df 100644 |
432 | --- a/arch/powerpc/include/asm/topology.h |
433 | +++ b/arch/powerpc/include/asm/topology.h |
434 | @@ -132,6 +132,8 @@ static inline void shared_proc_topology_init(void) {} |
435 | #define topology_sibling_cpumask(cpu) (per_cpu(cpu_sibling_map, cpu)) |
436 | #define topology_core_cpumask(cpu) (per_cpu(cpu_core_map, cpu)) |
437 | #define topology_core_id(cpu) (cpu_to_core_id(cpu)) |
438 | + |
439 | +int dlpar_cpu_readd(int cpu); |
440 | #endif |
441 | #endif |
442 | |
443 | diff --git a/arch/powerpc/kernel/entry_64.S b/arch/powerpc/kernel/entry_64.S |
444 | index c806a3c12592..7a46e0e57a36 100644 |
445 | --- a/arch/powerpc/kernel/entry_64.S |
446 | +++ b/arch/powerpc/kernel/entry_64.S |
447 | @@ -994,6 +994,13 @@ END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR) |
448 | ld r2,_NIP(r1) |
449 | mtspr SPRN_SRR0,r2 |
450 | |
451 | + /* |
452 | + * Leaving a stale exception_marker on the stack can confuse |
453 | + * the reliable stack unwinder later on. Clear it. |
454 | + */ |
455 | + li r2,0 |
456 | + std r2,STACK_FRAME_OVERHEAD-16(r1) |
457 | + |
458 | ld r0,GPR0(r1) |
459 | ld r2,GPR2(r1) |
460 | ld r3,GPR3(r1) |
461 | diff --git a/arch/powerpc/mm/hugetlbpage-radix.c b/arch/powerpc/mm/hugetlbpage-radix.c |
462 | index 2486bee0f93e..97c7a39ebc00 100644 |
463 | --- a/arch/powerpc/mm/hugetlbpage-radix.c |
464 | +++ b/arch/powerpc/mm/hugetlbpage-radix.c |
465 | @@ -1,6 +1,7 @@ |
466 | // SPDX-License-Identifier: GPL-2.0 |
467 | #include <linux/mm.h> |
468 | #include <linux/hugetlb.h> |
469 | +#include <linux/security.h> |
470 | #include <asm/pgtable.h> |
471 | #include <asm/pgalloc.h> |
472 | #include <asm/cacheflush.h> |
473 | @@ -73,7 +74,7 @@ radix__hugetlb_get_unmapped_area(struct file *file, unsigned long addr, |
474 | if (addr) { |
475 | addr = ALIGN(addr, huge_page_size(h)); |
476 | vma = find_vma(mm, addr); |
477 | - if (high_limit - len >= addr && |
478 | + if (high_limit - len >= addr && addr >= mmap_min_addr && |
479 | (!vma || addr + len <= vm_start_gap(vma))) |
480 | return addr; |
481 | } |
482 | @@ -83,7 +84,7 @@ radix__hugetlb_get_unmapped_area(struct file *file, unsigned long addr, |
483 | */ |
484 | info.flags = VM_UNMAPPED_AREA_TOPDOWN; |
485 | info.length = len; |
486 | - info.low_limit = PAGE_SIZE; |
487 | + info.low_limit = max(PAGE_SIZE, mmap_min_addr); |
488 | info.high_limit = mm->mmap_base + (high_limit - DEFAULT_MAP_WINDOW); |
489 | info.align_mask = PAGE_MASK & ~huge_page_mask(h); |
490 | info.align_offset = 0; |
491 | diff --git a/arch/powerpc/mm/numa.c b/arch/powerpc/mm/numa.c |
492 | index 5500e4edabc6..10fb43efef50 100644 |
493 | --- a/arch/powerpc/mm/numa.c |
494 | +++ b/arch/powerpc/mm/numa.c |
495 | @@ -1461,13 +1461,6 @@ static void reset_topology_timer(void) |
496 | |
497 | #ifdef CONFIG_SMP |
498 | |
499 | -static void stage_topology_update(int core_id) |
500 | -{ |
501 | - cpumask_or(&cpu_associativity_changes_mask, |
502 | - &cpu_associativity_changes_mask, cpu_sibling_mask(core_id)); |
503 | - reset_topology_timer(); |
504 | -} |
505 | - |
506 | static int dt_update_callback(struct notifier_block *nb, |
507 | unsigned long action, void *data) |
508 | { |
509 | @@ -1480,7 +1473,7 @@ static int dt_update_callback(struct notifier_block *nb, |
510 | !of_prop_cmp(update->prop->name, "ibm,associativity")) { |
511 | u32 core_id; |
512 | of_property_read_u32(update->dn, "reg", &core_id); |
513 | - stage_topology_update(core_id); |
514 | + rc = dlpar_cpu_readd(core_id); |
515 | rc = NOTIFY_OK; |
516 | } |
517 | break; |
518 | diff --git a/arch/powerpc/platforms/powernv/pci-ioda-tce.c b/arch/powerpc/platforms/powernv/pci-ioda-tce.c |
519 | index 7639b2168755..f5adb6b756f7 100644 |
520 | --- a/arch/powerpc/platforms/powernv/pci-ioda-tce.c |
521 | +++ b/arch/powerpc/platforms/powernv/pci-ioda-tce.c |
522 | @@ -313,7 +313,6 @@ long pnv_pci_ioda2_table_alloc_pages(int nid, __u64 bus_offset, |
523 | page_shift); |
524 | tbl->it_level_size = 1ULL << (level_shift - 3); |
525 | tbl->it_indirect_levels = levels - 1; |
526 | - tbl->it_allocated_size = total_allocated; |
527 | tbl->it_userspace = uas; |
528 | tbl->it_nid = nid; |
529 | |
530 | diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c b/arch/powerpc/platforms/powernv/pci-ioda.c |
531 | index cde710297a4e..326ca6288bb1 100644 |
532 | --- a/arch/powerpc/platforms/powernv/pci-ioda.c |
533 | +++ b/arch/powerpc/platforms/powernv/pci-ioda.c |
534 | @@ -2603,8 +2603,13 @@ static long pnv_pci_ioda2_create_table_userspace( |
535 | int num, __u32 page_shift, __u64 window_size, __u32 levels, |
536 | struct iommu_table **ptbl) |
537 | { |
538 | - return pnv_pci_ioda2_create_table(table_group, |
539 | + long ret = pnv_pci_ioda2_create_table(table_group, |
540 | num, page_shift, window_size, levels, true, ptbl); |
541 | + |
542 | + if (!ret) |
543 | + (*ptbl)->it_allocated_size = pnv_pci_ioda2_get_table_size( |
544 | + page_shift, window_size, levels); |
545 | + return ret; |
546 | } |
547 | |
548 | static void pnv_ioda2_take_ownership(struct iommu_table_group *table_group) |
549 | diff --git a/arch/powerpc/platforms/pseries/hotplug-cpu.c b/arch/powerpc/platforms/pseries/hotplug-cpu.c |
550 | index 6ef77caf7bcf..1d3f9313c02f 100644 |
551 | --- a/arch/powerpc/platforms/pseries/hotplug-cpu.c |
552 | +++ b/arch/powerpc/platforms/pseries/hotplug-cpu.c |
553 | @@ -802,6 +802,25 @@ static int dlpar_cpu_add_by_count(u32 cpus_to_add) |
554 | return rc; |
555 | } |
556 | |
557 | +int dlpar_cpu_readd(int cpu) |
558 | +{ |
559 | + struct device_node *dn; |
560 | + struct device *dev; |
561 | + u32 drc_index; |
562 | + int rc; |
563 | + |
564 | + dev = get_cpu_device(cpu); |
565 | + dn = dev->of_node; |
566 | + |
567 | + rc = of_property_read_u32(dn, "ibm,my-drc-index", &drc_index); |
568 | + |
569 | + rc = dlpar_cpu_remove_by_index(drc_index); |
570 | + if (!rc) |
571 | + rc = dlpar_cpu_add(drc_index); |
572 | + |
573 | + return rc; |
574 | +} |
575 | + |
576 | int dlpar_cpu(struct pseries_hp_errorlog *hp_elog) |
577 | { |
578 | u32 count, drc_index; |
579 | diff --git a/arch/powerpc/xmon/ppc-dis.c b/arch/powerpc/xmon/ppc-dis.c |
580 | index 9deea5ee13f6..27f1e6415036 100644 |
581 | --- a/arch/powerpc/xmon/ppc-dis.c |
582 | +++ b/arch/powerpc/xmon/ppc-dis.c |
583 | @@ -158,7 +158,7 @@ int print_insn_powerpc (unsigned long insn, unsigned long memaddr) |
584 | dialect |= (PPC_OPCODE_POWER5 | PPC_OPCODE_POWER6 | PPC_OPCODE_POWER7 |
585 | | PPC_OPCODE_POWER8 | PPC_OPCODE_POWER9 | PPC_OPCODE_HTM |
586 | | PPC_OPCODE_ALTIVEC | PPC_OPCODE_ALTIVEC2 |
587 | - | PPC_OPCODE_VSX | PPC_OPCODE_VSX3), |
588 | + | PPC_OPCODE_VSX | PPC_OPCODE_VSX3); |
589 | |
590 | /* Get the major opcode of the insn. */ |
591 | opcode = NULL; |
592 | diff --git a/arch/s390/kernel/perf_cpum_sf.c b/arch/s390/kernel/perf_cpum_sf.c |
593 | index 5c53e977be62..44404836e9d1 100644 |
594 | --- a/arch/s390/kernel/perf_cpum_sf.c |
595 | +++ b/arch/s390/kernel/perf_cpum_sf.c |
596 | @@ -1600,7 +1600,7 @@ static void aux_sdb_init(unsigned long sdb) |
597 | |
598 | /* |
599 | * aux_buffer_setup() - Setup AUX buffer for diagnostic mode sampling |
600 | - * @cpu: On which to allocate, -1 means current |
601 | + * @event: Event the buffer is setup for, event->cpu == -1 means current |
602 | * @pages: Array of pointers to buffer pages passed from perf core |
603 | * @nr_pages: Total pages |
604 | * @snapshot: Flag for snapshot mode |
605 | @@ -1612,8 +1612,8 @@ static void aux_sdb_init(unsigned long sdb) |
606 | * |
607 | * Return the private AUX buffer structure if success or NULL if fails. |
608 | */ |
609 | -static void *aux_buffer_setup(int cpu, void **pages, int nr_pages, |
610 | - bool snapshot) |
611 | +static void *aux_buffer_setup(struct perf_event *event, void **pages, |
612 | + int nr_pages, bool snapshot) |
613 | { |
614 | struct sf_buffer *sfb; |
615 | struct aux_buffer *aux; |
616 | diff --git a/arch/x86/boot/Makefile b/arch/x86/boot/Makefile |
617 | index 9b5adae9cc40..e2839b5c246c 100644 |
618 | --- a/arch/x86/boot/Makefile |
619 | +++ b/arch/x86/boot/Makefile |
620 | @@ -100,7 +100,7 @@ $(obj)/zoffset.h: $(obj)/compressed/vmlinux FORCE |
621 | AFLAGS_header.o += -I$(objtree)/$(obj) |
622 | $(obj)/header.o: $(obj)/zoffset.h |
623 | |
624 | -LDFLAGS_setup.elf := -T |
625 | +LDFLAGS_setup.elf := -m elf_i386 -T |
626 | $(obj)/setup.elf: $(src)/setup.ld $(SETUP_OBJS) FORCE |
627 | $(call if_changed,ld) |
628 | |
629 | diff --git a/arch/x86/entry/entry_64.S b/arch/x86/entry/entry_64.S |
630 | index f95dcb209fdf..617df50a11d9 100644 |
631 | --- a/arch/x86/entry/entry_64.S |
632 | +++ b/arch/x86/entry/entry_64.S |
633 | @@ -627,6 +627,7 @@ ENTRY(interrupt_entry) |
634 | |
635 | ret |
636 | END(interrupt_entry) |
637 | +_ASM_NOKPROBE(interrupt_entry) |
638 | |
639 | |
640 | /* Interrupt entry/exit. */ |
641 | @@ -826,6 +827,7 @@ native_irq_return_ldt: |
642 | jmp native_irq_return_iret |
643 | #endif |
644 | END(common_interrupt) |
645 | +_ASM_NOKPROBE(common_interrupt) |
646 | |
647 | /* |
648 | * APIC interrupts. |
649 | @@ -840,6 +842,7 @@ ENTRY(\sym) |
650 | call \do_sym /* rdi points to pt_regs */ |
651 | jmp ret_from_intr |
652 | END(\sym) |
653 | +_ASM_NOKPROBE(\sym) |
654 | .endm |
655 | |
656 | /* Make sure APIC interrupt handlers end up in the irqentry section: */ |
657 | @@ -984,6 +987,7 @@ ENTRY(\sym) |
658 | |
659 | jmp error_exit |
660 | .endif |
661 | +_ASM_NOKPROBE(\sym) |
662 | END(\sym) |
663 | .endm |
664 | |
665 | diff --git a/arch/x86/events/intel/bts.c b/arch/x86/events/intel/bts.c |
666 | index 24ffa1e88cf9..7139f6bf27ad 100644 |
667 | --- a/arch/x86/events/intel/bts.c |
668 | +++ b/arch/x86/events/intel/bts.c |
669 | @@ -77,10 +77,12 @@ static size_t buf_size(struct page *page) |
670 | } |
671 | |
672 | static void * |
673 | -bts_buffer_setup_aux(int cpu, void **pages, int nr_pages, bool overwrite) |
674 | +bts_buffer_setup_aux(struct perf_event *event, void **pages, |
675 | + int nr_pages, bool overwrite) |
676 | { |
677 | struct bts_buffer *buf; |
678 | struct page *page; |
679 | + int cpu = event->cpu; |
680 | int node = (cpu == -1) ? cpu : cpu_to_node(cpu); |
681 | unsigned long offset; |
682 | size_t size = nr_pages << PAGE_SHIFT; |
683 | diff --git a/arch/x86/events/intel/pt.c b/arch/x86/events/intel/pt.c |
684 | index 8d016ce5b80d..8f4c98fdd03c 100644 |
685 | --- a/arch/x86/events/intel/pt.c |
686 | +++ b/arch/x86/events/intel/pt.c |
687 | @@ -1104,10 +1104,11 @@ static int pt_buffer_init_topa(struct pt_buffer *buf, unsigned long nr_pages, |
688 | * Return: Our private PT buffer structure. |
689 | */ |
690 | static void * |
691 | -pt_buffer_setup_aux(int cpu, void **pages, int nr_pages, bool snapshot) |
692 | +pt_buffer_setup_aux(struct perf_event *event, void **pages, |
693 | + int nr_pages, bool snapshot) |
694 | { |
695 | struct pt_buffer *buf; |
696 | - int node, ret; |
697 | + int node, ret, cpu = event->cpu; |
698 | |
699 | if (!nr_pages) |
700 | return NULL; |
701 | diff --git a/arch/x86/hyperv/hv_init.c b/arch/x86/hyperv/hv_init.c |
702 | index 20c876c7c5bf..87abd5145cc9 100644 |
703 | --- a/arch/x86/hyperv/hv_init.c |
704 | +++ b/arch/x86/hyperv/hv_init.c |
705 | @@ -387,6 +387,13 @@ void hyperv_cleanup(void) |
706 | /* Reset our OS id */ |
707 | wrmsrl(HV_X64_MSR_GUEST_OS_ID, 0); |
708 | |
709 | + /* |
710 | + * Reset hypercall page reference before reset the page, |
711 | + * let hypercall operations fail safely rather than |
712 | + * panic the kernel for using invalid hypercall page |
713 | + */ |
714 | + hv_hypercall_pg = NULL; |
715 | + |
716 | /* Reset the hypercall page */ |
717 | hypercall_msr.as_uint64 = 0; |
718 | wrmsrl(HV_X64_MSR_HYPERCALL, hypercall_msr.as_uint64); |
719 | diff --git a/arch/x86/kernel/vmlinux.lds.S b/arch/x86/kernel/vmlinux.lds.S |
720 | index 5dd3317d761f..c63bab98780c 100644 |
721 | --- a/arch/x86/kernel/vmlinux.lds.S |
722 | +++ b/arch/x86/kernel/vmlinux.lds.S |
723 | @@ -411,7 +411,7 @@ SECTIONS |
724 | * Per-cpu symbols which need to be offset from __per_cpu_load |
725 | * for the boot processor. |
726 | */ |
727 | -#define INIT_PER_CPU(x) init_per_cpu__##x = x + __per_cpu_load |
728 | +#define INIT_PER_CPU(x) init_per_cpu__##x = ABSOLUTE(x) + __per_cpu_load |
729 | INIT_PER_CPU(gdt_page); |
730 | INIT_PER_CPU(irq_stack_union); |
731 | |
732 | diff --git a/arch/x86/realmode/rm/Makefile b/arch/x86/realmode/rm/Makefile |
733 | index 4463fa72db94..96cb20de08af 100644 |
734 | --- a/arch/x86/realmode/rm/Makefile |
735 | +++ b/arch/x86/realmode/rm/Makefile |
736 | @@ -47,7 +47,7 @@ $(obj)/pasyms.h: $(REALMODE_OBJS) FORCE |
737 | targets += realmode.lds |
738 | $(obj)/realmode.lds: $(obj)/pasyms.h |
739 | |
740 | -LDFLAGS_realmode.elf := --emit-relocs -T |
741 | +LDFLAGS_realmode.elf := -m elf_i386 --emit-relocs -T |
742 | CPPFLAGS_realmode.lds += -P -C -I$(objtree)/$(obj) |
743 | |
744 | targets += realmode.elf |
745 | diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c |
746 | index 653100fb719e..c5e2c5a01182 100644 |
747 | --- a/block/bfq-iosched.c |
748 | +++ b/block/bfq-iosched.c |
749 | @@ -2215,7 +2215,8 @@ bfq_setup_cooperator(struct bfq_data *bfqd, struct bfq_queue *bfqq, |
750 | |
751 | if (in_service_bfqq && in_service_bfqq != bfqq && |
752 | likely(in_service_bfqq != &bfqd->oom_bfqq) && |
753 | - bfq_rq_close_to_sector(io_struct, request, bfqd->last_position) && |
754 | + bfq_rq_close_to_sector(io_struct, request, |
755 | + bfqd->in_serv_last_pos) && |
756 | bfqq->entity.parent == in_service_bfqq->entity.parent && |
757 | bfq_may_be_close_cooperator(bfqq, in_service_bfqq)) { |
758 | new_bfqq = bfq_setup_merge(bfqq, in_service_bfqq); |
759 | @@ -2755,6 +2756,8 @@ update_rate_and_reset: |
760 | bfq_update_rate_reset(bfqd, rq); |
761 | update_last_values: |
762 | bfqd->last_position = blk_rq_pos(rq) + blk_rq_sectors(rq); |
763 | + if (RQ_BFQQ(rq) == bfqd->in_service_queue) |
764 | + bfqd->in_serv_last_pos = bfqd->last_position; |
765 | bfqd->last_dispatch = now_ns; |
766 | } |
767 | |
768 | diff --git a/block/bfq-iosched.h b/block/bfq-iosched.h |
769 | index a8a2e5aca4d4..d5e9e60cb1a5 100644 |
770 | --- a/block/bfq-iosched.h |
771 | +++ b/block/bfq-iosched.h |
772 | @@ -469,6 +469,9 @@ struct bfq_data { |
773 | /* on-disk position of the last served request */ |
774 | sector_t last_position; |
775 | |
776 | + /* position of the last served request for the in-service queue */ |
777 | + sector_t in_serv_last_pos; |
778 | + |
779 | /* time of last request completion (ns) */ |
780 | u64 last_completion; |
781 | |
782 | diff --git a/drivers/acpi/acpi_video.c b/drivers/acpi/acpi_video.c |
783 | index f0b52266b3ac..d73afb562ad9 100644 |
784 | --- a/drivers/acpi/acpi_video.c |
785 | +++ b/drivers/acpi/acpi_video.c |
786 | @@ -2124,21 +2124,29 @@ static int __init intel_opregion_present(void) |
787 | return opregion; |
788 | } |
789 | |
790 | +/* Check if the chassis-type indicates there is no builtin LCD panel */ |
791 | static bool dmi_is_desktop(void) |
792 | { |
793 | const char *chassis_type; |
794 | + unsigned long type; |
795 | |
796 | chassis_type = dmi_get_system_info(DMI_CHASSIS_TYPE); |
797 | if (!chassis_type) |
798 | return false; |
799 | |
800 | - if (!strcmp(chassis_type, "3") || /* 3: Desktop */ |
801 | - !strcmp(chassis_type, "4") || /* 4: Low Profile Desktop */ |
802 | - !strcmp(chassis_type, "5") || /* 5: Pizza Box */ |
803 | - !strcmp(chassis_type, "6") || /* 6: Mini Tower */ |
804 | - !strcmp(chassis_type, "7") || /* 7: Tower */ |
805 | - !strcmp(chassis_type, "11")) /* 11: Main Server Chassis */ |
806 | + if (kstrtoul(chassis_type, 10, &type) != 0) |
807 | + return false; |
808 | + |
809 | + switch (type) { |
810 | + case 0x03: /* Desktop */ |
811 | + case 0x04: /* Low Profile Desktop */ |
812 | + case 0x05: /* Pizza Box */ |
813 | + case 0x06: /* Mini Tower */ |
814 | + case 0x07: /* Tower */ |
815 | + case 0x10: /* Lunch Box */ |
816 | + case 0x11: /* Main Server Chassis */ |
817 | return true; |
818 | + } |
819 | |
820 | return false; |
821 | } |
822 | diff --git a/drivers/block/loop.c b/drivers/block/loop.c |
823 | index 0c5aeab4d23a..a63da9e07341 100644 |
824 | --- a/drivers/block/loop.c |
825 | +++ b/drivers/block/loop.c |
826 | @@ -1090,16 +1090,12 @@ static int __loop_clr_fd(struct loop_device *lo, bool release) |
827 | kobject_uevent(&disk_to_dev(bdev->bd_disk)->kobj, KOBJ_CHANGE); |
828 | } |
829 | mapping_set_gfp_mask(filp->f_mapping, gfp); |
830 | - lo->lo_state = Lo_unbound; |
831 | /* This is safe: open() is still holding a reference. */ |
832 | module_put(THIS_MODULE); |
833 | blk_mq_unfreeze_queue(lo->lo_queue); |
834 | |
835 | partscan = lo->lo_flags & LO_FLAGS_PARTSCAN && bdev; |
836 | lo_number = lo->lo_number; |
837 | - lo->lo_flags = 0; |
838 | - if (!part_shift) |
839 | - lo->lo_disk->flags |= GENHD_FL_NO_PART_SCAN; |
840 | loop_unprepare_queue(lo); |
841 | out_unlock: |
842 | mutex_unlock(&loop_ctl_mutex); |
843 | @@ -1121,6 +1117,23 @@ out_unlock: |
844 | /* Device is gone, no point in returning error */ |
845 | err = 0; |
846 | } |
847 | + |
848 | + /* |
849 | + * lo->lo_state is set to Lo_unbound here after above partscan has |
850 | + * finished. |
851 | + * |
852 | + * There cannot be anybody else entering __loop_clr_fd() as |
853 | + * lo->lo_backing_file is already cleared and Lo_rundown state |
854 | + * protects us from all the other places trying to change the 'lo' |
855 | + * device. |
856 | + */ |
857 | + mutex_lock(&loop_ctl_mutex); |
858 | + lo->lo_flags = 0; |
859 | + if (!part_shift) |
860 | + lo->lo_disk->flags |= GENHD_FL_NO_PART_SCAN; |
861 | + lo->lo_state = Lo_unbound; |
862 | + mutex_unlock(&loop_ctl_mutex); |
863 | + |
864 | /* |
865 | * Need not hold loop_ctl_mutex to fput backing file. |
866 | * Calling fput holding loop_ctl_mutex triggers a circular |
867 | diff --git a/drivers/cdrom/cdrom.c b/drivers/cdrom/cdrom.c |
868 | index 10802d1fc554..27a82a559ab9 100644 |
869 | --- a/drivers/cdrom/cdrom.c |
870 | +++ b/drivers/cdrom/cdrom.c |
871 | @@ -265,6 +265,7 @@ |
872 | /* #define ERRLOGMASK (CD_WARNING|CD_OPEN|CD_COUNT_TRACKS|CD_CLOSE) */ |
873 | /* #define ERRLOGMASK (CD_WARNING|CD_REG_UNREG|CD_DO_IOCTL|CD_OPEN|CD_CLOSE|CD_COUNT_TRACKS) */ |
874 | |
875 | +#include <linux/atomic.h> |
876 | #include <linux/module.h> |
877 | #include <linux/fs.h> |
878 | #include <linux/major.h> |
879 | @@ -3693,9 +3694,9 @@ static struct ctl_table_header *cdrom_sysctl_header; |
880 | |
881 | static void cdrom_sysctl_register(void) |
882 | { |
883 | - static int initialized; |
884 | + static atomic_t initialized = ATOMIC_INIT(0); |
885 | |
886 | - if (initialized == 1) |
887 | + if (!atomic_add_unless(&initialized, 1, 1)) |
888 | return; |
889 | |
890 | cdrom_sysctl_header = register_sysctl_table(cdrom_root_table); |
891 | @@ -3706,8 +3707,6 @@ static void cdrom_sysctl_register(void) |
892 | cdrom_sysctl_settings.debug = debug; |
893 | cdrom_sysctl_settings.lock = lockdoor; |
894 | cdrom_sysctl_settings.check = check_media_type; |
895 | - |
896 | - initialized = 1; |
897 | } |
898 | |
899 | static void cdrom_sysctl_unregister(void) |
900 | diff --git a/drivers/char/hpet.c b/drivers/char/hpet.c |
901 | index 4a22b4b41aef..9bffcd37cc7b 100644 |
902 | --- a/drivers/char/hpet.c |
903 | +++ b/drivers/char/hpet.c |
904 | @@ -377,7 +377,7 @@ static __init int hpet_mmap_enable(char *str) |
905 | pr_info("HPET mmap %s\n", hpet_mmap_enabled ? "enabled" : "disabled"); |
906 | return 1; |
907 | } |
908 | -__setup("hpet_mmap", hpet_mmap_enable); |
909 | +__setup("hpet_mmap=", hpet_mmap_enable); |
910 | |
911 | static int hpet_mmap(struct file *file, struct vm_area_struct *vma) |
912 | { |
913 | diff --git a/drivers/char/hw_random/virtio-rng.c b/drivers/char/hw_random/virtio-rng.c |
914 | index b89df66ea1ae..7abd604e938c 100644 |
915 | --- a/drivers/char/hw_random/virtio-rng.c |
916 | +++ b/drivers/char/hw_random/virtio-rng.c |
917 | @@ -73,7 +73,7 @@ static int virtio_read(struct hwrng *rng, void *buf, size_t size, bool wait) |
918 | |
919 | if (!vi->busy) { |
920 | vi->busy = true; |
921 | - init_completion(&vi->have_data); |
922 | + reinit_completion(&vi->have_data); |
923 | register_buffer(vi, buf, size); |
924 | } |
925 | |
926 | diff --git a/drivers/clk/clk-fractional-divider.c b/drivers/clk/clk-fractional-divider.c |
927 | index fdf625fb10fa..083daa293280 100644 |
928 | --- a/drivers/clk/clk-fractional-divider.c |
929 | +++ b/drivers/clk/clk-fractional-divider.c |
930 | @@ -77,7 +77,7 @@ static long clk_fd_round_rate(struct clk_hw *hw, unsigned long rate, |
931 | unsigned long m, n; |
932 | u64 ret; |
933 | |
934 | - if (!rate || rate >= *parent_rate) |
935 | + if (!rate || (!clk_hw_can_set_rate_parent(hw) && rate >= *parent_rate)) |
936 | return *parent_rate; |
937 | |
938 | if (fd->approximation) |
939 | diff --git a/drivers/clk/meson/meson-aoclk.c b/drivers/clk/meson/meson-aoclk.c |
940 | index f965845917e3..258c8d259ea1 100644 |
941 | --- a/drivers/clk/meson/meson-aoclk.c |
942 | +++ b/drivers/clk/meson/meson-aoclk.c |
943 | @@ -65,15 +65,20 @@ int meson_aoclkc_probe(struct platform_device *pdev) |
944 | return ret; |
945 | } |
946 | |
947 | - /* |
948 | - * Populate regmap and register all clks |
949 | - */ |
950 | - for (clkid = 0; clkid < data->num_clks; clkid++) { |
951 | + /* Populate regmap */ |
952 | + for (clkid = 0; clkid < data->num_clks; clkid++) |
953 | data->clks[clkid]->map = regmap; |
954 | |
955 | + /* Register all clks */ |
956 | + for (clkid = 0; clkid < data->hw_data->num; clkid++) { |
957 | + if (!data->hw_data->hws[clkid]) |
958 | + continue; |
959 | + |
960 | ret = devm_clk_hw_register(dev, data->hw_data->hws[clkid]); |
961 | - if (ret) |
962 | + if (ret) { |
963 | + dev_err(dev, "Clock registration failed\n"); |
964 | return ret; |
965 | + } |
966 | } |
967 | |
968 | return devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get, |
969 | diff --git a/drivers/clk/rockchip/clk-rk3328.c b/drivers/clk/rockchip/clk-rk3328.c |
970 | index 2c5426607790..e431661fe874 100644 |
971 | --- a/drivers/clk/rockchip/clk-rk3328.c |
972 | +++ b/drivers/clk/rockchip/clk-rk3328.c |
973 | @@ -78,17 +78,17 @@ static struct rockchip_pll_rate_table rk3328_pll_rates[] = { |
974 | |
975 | static struct rockchip_pll_rate_table rk3328_pll_frac_rates[] = { |
976 | /* _mhz, _refdiv, _fbdiv, _postdiv1, _postdiv2, _dsmpd, _frac */ |
977 | - RK3036_PLL_RATE(1016064000, 3, 127, 1, 1, 0, 134217), |
978 | + RK3036_PLL_RATE(1016064000, 3, 127, 1, 1, 0, 134218), |
979 | /* vco = 1016064000 */ |
980 | - RK3036_PLL_RATE(983040000, 24, 983, 1, 1, 0, 671088), |
981 | + RK3036_PLL_RATE(983040000, 24, 983, 1, 1, 0, 671089), |
982 | /* vco = 983040000 */ |
983 | - RK3036_PLL_RATE(491520000, 24, 983, 2, 1, 0, 671088), |
984 | + RK3036_PLL_RATE(491520000, 24, 983, 2, 1, 0, 671089), |
985 | /* vco = 983040000 */ |
986 | - RK3036_PLL_RATE(61440000, 6, 215, 7, 2, 0, 671088), |
987 | + RK3036_PLL_RATE(61440000, 6, 215, 7, 2, 0, 671089), |
988 | /* vco = 860156000 */ |
989 | - RK3036_PLL_RATE(56448000, 12, 451, 4, 4, 0, 9797894), |
990 | + RK3036_PLL_RATE(56448000, 12, 451, 4, 4, 0, 9797895), |
991 | /* vco = 903168000 */ |
992 | - RK3036_PLL_RATE(40960000, 12, 409, 4, 5, 0, 10066329), |
993 | + RK3036_PLL_RATE(40960000, 12, 409, 4, 5, 0, 10066330), |
994 | /* vco = 819200000 */ |
995 | { /* sentinel */ }, |
996 | }; |
997 | diff --git a/drivers/cpufreq/acpi-cpufreq.c b/drivers/cpufreq/acpi-cpufreq.c |
998 | index b61f4ec43e06..aca30f45172e 100644 |
999 | --- a/drivers/cpufreq/acpi-cpufreq.c |
1000 | +++ b/drivers/cpufreq/acpi-cpufreq.c |
1001 | @@ -911,8 +911,10 @@ static void __init acpi_cpufreq_boost_init(void) |
1002 | { |
1003 | int ret; |
1004 | |
1005 | - if (!(boot_cpu_has(X86_FEATURE_CPB) || boot_cpu_has(X86_FEATURE_IDA))) |
1006 | + if (!(boot_cpu_has(X86_FEATURE_CPB) || boot_cpu_has(X86_FEATURE_IDA))) { |
1007 | + pr_debug("Boost capabilities not present in the processor\n"); |
1008 | return; |
1009 | + } |
1010 | |
1011 | acpi_cpufreq_driver.set_boost = set_boost; |
1012 | acpi_cpufreq_driver.boost_enabled = boost_state(0); |
1013 | diff --git a/drivers/crypto/amcc/crypto4xx_trng.c b/drivers/crypto/amcc/crypto4xx_trng.c |
1014 | index 5e63742b0d22..53ab1f140a26 100644 |
1015 | --- a/drivers/crypto/amcc/crypto4xx_trng.c |
1016 | +++ b/drivers/crypto/amcc/crypto4xx_trng.c |
1017 | @@ -80,8 +80,10 @@ void ppc4xx_trng_probe(struct crypto4xx_core_device *core_dev) |
1018 | |
1019 | /* Find the TRNG device node and map it */ |
1020 | trng = of_find_matching_node(NULL, ppc4xx_trng_match); |
1021 | - if (!trng || !of_device_is_available(trng)) |
1022 | + if (!trng || !of_device_is_available(trng)) { |
1023 | + of_node_put(trng); |
1024 | return; |
1025 | + } |
1026 | |
1027 | dev->trng_base = of_iomap(trng, 0); |
1028 | of_node_put(trng); |
1029 | diff --git a/drivers/crypto/cavium/zip/zip_main.c b/drivers/crypto/cavium/zip/zip_main.c |
1030 | index be055b9547f6..6183f9128a8a 100644 |
1031 | --- a/drivers/crypto/cavium/zip/zip_main.c |
1032 | +++ b/drivers/crypto/cavium/zip/zip_main.c |
1033 | @@ -351,6 +351,7 @@ static struct pci_driver zip_driver = { |
1034 | |
1035 | static struct crypto_alg zip_comp_deflate = { |
1036 | .cra_name = "deflate", |
1037 | + .cra_driver_name = "deflate-cavium", |
1038 | .cra_flags = CRYPTO_ALG_TYPE_COMPRESS, |
1039 | .cra_ctxsize = sizeof(struct zip_kernel_ctx), |
1040 | .cra_priority = 300, |
1041 | @@ -365,6 +366,7 @@ static struct crypto_alg zip_comp_deflate = { |
1042 | |
1043 | static struct crypto_alg zip_comp_lzs = { |
1044 | .cra_name = "lzs", |
1045 | + .cra_driver_name = "lzs-cavium", |
1046 | .cra_flags = CRYPTO_ALG_TYPE_COMPRESS, |
1047 | .cra_ctxsize = sizeof(struct zip_kernel_ctx), |
1048 | .cra_priority = 300, |
1049 | @@ -384,7 +386,7 @@ static struct scomp_alg zip_scomp_deflate = { |
1050 | .decompress = zip_scomp_decompress, |
1051 | .base = { |
1052 | .cra_name = "deflate", |
1053 | - .cra_driver_name = "deflate-scomp", |
1054 | + .cra_driver_name = "deflate-scomp-cavium", |
1055 | .cra_module = THIS_MODULE, |
1056 | .cra_priority = 300, |
1057 | } |
1058 | @@ -397,7 +399,7 @@ static struct scomp_alg zip_scomp_lzs = { |
1059 | .decompress = zip_scomp_decompress, |
1060 | .base = { |
1061 | .cra_name = "lzs", |
1062 | - .cra_driver_name = "lzs-scomp", |
1063 | + .cra_driver_name = "lzs-scomp-cavium", |
1064 | .cra_module = THIS_MODULE, |
1065 | .cra_priority = 300, |
1066 | } |
1067 | diff --git a/drivers/dma/imx-dma.c b/drivers/dma/imx-dma.c |
1068 | index 118d371a2a4a..dfee0d895ce3 100644 |
1069 | --- a/drivers/dma/imx-dma.c |
1070 | +++ b/drivers/dma/imx-dma.c |
1071 | @@ -284,7 +284,7 @@ static inline int imxdma_sg_next(struct imxdma_desc *d) |
1072 | struct scatterlist *sg = d->sg; |
1073 | unsigned long now; |
1074 | |
1075 | - now = min(d->len, sg_dma_len(sg)); |
1076 | + now = min_t(size_t, d->len, sg_dma_len(sg)); |
1077 | if (d->len != IMX_DMA_LENGTH_LOOP) |
1078 | d->len -= now; |
1079 | |
1080 | diff --git a/drivers/dma/qcom/hidma.c b/drivers/dma/qcom/hidma.c |
1081 | index 43d4b00b8138..411f91fde734 100644 |
1082 | --- a/drivers/dma/qcom/hidma.c |
1083 | +++ b/drivers/dma/qcom/hidma.c |
1084 | @@ -138,24 +138,25 @@ static void hidma_process_completed(struct hidma_chan *mchan) |
1085 | desc = &mdesc->desc; |
1086 | last_cookie = desc->cookie; |
1087 | |
1088 | + llstat = hidma_ll_status(mdma->lldev, mdesc->tre_ch); |
1089 | + |
1090 | spin_lock_irqsave(&mchan->lock, irqflags); |
1091 | + if (llstat == DMA_COMPLETE) { |
1092 | + mchan->last_success = last_cookie; |
1093 | + result.result = DMA_TRANS_NOERROR; |
1094 | + } else { |
1095 | + result.result = DMA_TRANS_ABORTED; |
1096 | + } |
1097 | + |
1098 | dma_cookie_complete(desc); |
1099 | spin_unlock_irqrestore(&mchan->lock, irqflags); |
1100 | |
1101 | - llstat = hidma_ll_status(mdma->lldev, mdesc->tre_ch); |
1102 | dmaengine_desc_get_callback(desc, &cb); |
1103 | |
1104 | dma_run_dependencies(desc); |
1105 | |
1106 | spin_lock_irqsave(&mchan->lock, irqflags); |
1107 | list_move(&mdesc->node, &mchan->free); |
1108 | - |
1109 | - if (llstat == DMA_COMPLETE) { |
1110 | - mchan->last_success = last_cookie; |
1111 | - result.result = DMA_TRANS_NOERROR; |
1112 | - } else |
1113 | - result.result = DMA_TRANS_ABORTED; |
1114 | - |
1115 | spin_unlock_irqrestore(&mchan->lock, irqflags); |
1116 | |
1117 | dmaengine_desc_callback_invoke(&cb, &result); |
1118 | @@ -415,6 +416,7 @@ hidma_prep_dma_memcpy(struct dma_chan *dmach, dma_addr_t dest, dma_addr_t src, |
1119 | if (!mdesc) |
1120 | return NULL; |
1121 | |
1122 | + mdesc->desc.flags = flags; |
1123 | hidma_ll_set_transfer_params(mdma->lldev, mdesc->tre_ch, |
1124 | src, dest, len, flags, |
1125 | HIDMA_TRE_MEMCPY); |
1126 | @@ -447,6 +449,7 @@ hidma_prep_dma_memset(struct dma_chan *dmach, dma_addr_t dest, int value, |
1127 | if (!mdesc) |
1128 | return NULL; |
1129 | |
1130 | + mdesc->desc.flags = flags; |
1131 | hidma_ll_set_transfer_params(mdma->lldev, mdesc->tre_ch, |
1132 | value, dest, len, flags, |
1133 | HIDMA_TRE_MEMSET); |
1134 | diff --git a/drivers/dma/tegra20-apb-dma.c b/drivers/dma/tegra20-apb-dma.c |
1135 | index 9a558e30c461..8219ab88a507 100644 |
1136 | --- a/drivers/dma/tegra20-apb-dma.c |
1137 | +++ b/drivers/dma/tegra20-apb-dma.c |
1138 | @@ -636,7 +636,10 @@ static void handle_cont_sngl_cycle_dma_done(struct tegra_dma_channel *tdc, |
1139 | |
1140 | sgreq = list_first_entry(&tdc->pending_sg_req, typeof(*sgreq), node); |
1141 | dma_desc = sgreq->dma_desc; |
1142 | - dma_desc->bytes_transferred += sgreq->req_len; |
1143 | + /* if we dma for long enough the transfer count will wrap */ |
1144 | + dma_desc->bytes_transferred = |
1145 | + (dma_desc->bytes_transferred + sgreq->req_len) % |
1146 | + dma_desc->bytes_requested; |
1147 | |
1148 | /* Callback need to be call */ |
1149 | if (!dma_desc->cb_count) |
1150 | diff --git a/drivers/firmware/efi/cper.c b/drivers/firmware/efi/cper.c |
1151 | index a7902fccdcfa..6090d25dce85 100644 |
1152 | --- a/drivers/firmware/efi/cper.c |
1153 | +++ b/drivers/firmware/efi/cper.c |
1154 | @@ -546,19 +546,24 @@ EXPORT_SYMBOL_GPL(cper_estatus_check_header); |
1155 | int cper_estatus_check(const struct acpi_hest_generic_status *estatus) |
1156 | { |
1157 | struct acpi_hest_generic_data *gdata; |
1158 | - unsigned int data_len, gedata_len; |
1159 | + unsigned int data_len, record_size; |
1160 | int rc; |
1161 | |
1162 | rc = cper_estatus_check_header(estatus); |
1163 | if (rc) |
1164 | return rc; |
1165 | + |
1166 | data_len = estatus->data_length; |
1167 | |
1168 | apei_estatus_for_each_section(estatus, gdata) { |
1169 | - gedata_len = acpi_hest_get_error_length(gdata); |
1170 | - if (gedata_len > data_len - acpi_hest_get_size(gdata)) |
1171 | + if (sizeof(struct acpi_hest_generic_data) > data_len) |
1172 | + return -EINVAL; |
1173 | + |
1174 | + record_size = acpi_hest_get_record_size(gdata); |
1175 | + if (record_size > data_len) |
1176 | return -EINVAL; |
1177 | - data_len -= acpi_hest_get_record_size(gdata); |
1178 | + |
1179 | + data_len -= record_size; |
1180 | } |
1181 | if (data_len) |
1182 | return -EINVAL; |
1183 | diff --git a/drivers/firmware/efi/libstub/arm-stub.c b/drivers/firmware/efi/libstub/arm-stub.c |
1184 | index 6920033de6d4..6c09644d620e 100644 |
1185 | --- a/drivers/firmware/efi/libstub/arm-stub.c |
1186 | +++ b/drivers/firmware/efi/libstub/arm-stub.c |
1187 | @@ -340,6 +340,11 @@ void efi_get_virtmap(efi_memory_desc_t *memory_map, unsigned long map_size, |
1188 | paddr = in->phys_addr; |
1189 | size = in->num_pages * EFI_PAGE_SIZE; |
1190 | |
1191 | + if (novamap()) { |
1192 | + in->virt_addr = in->phys_addr; |
1193 | + continue; |
1194 | + } |
1195 | + |
1196 | /* |
1197 | * Make the mapping compatible with 64k pages: this allows |
1198 | * a 4k page size kernel to kexec a 64k page size kernel and |
1199 | diff --git a/drivers/firmware/efi/libstub/efi-stub-helper.c b/drivers/firmware/efi/libstub/efi-stub-helper.c |
1200 | index e94975f4655b..442f51c2a53d 100644 |
1201 | --- a/drivers/firmware/efi/libstub/efi-stub-helper.c |
1202 | +++ b/drivers/firmware/efi/libstub/efi-stub-helper.c |
1203 | @@ -34,6 +34,7 @@ static unsigned long __chunk_size = EFI_READ_CHUNK_SIZE; |
1204 | |
1205 | static int __section(.data) __nokaslr; |
1206 | static int __section(.data) __quiet; |
1207 | +static int __section(.data) __novamap; |
1208 | |
1209 | int __pure nokaslr(void) |
1210 | { |
1211 | @@ -43,6 +44,10 @@ int __pure is_quiet(void) |
1212 | { |
1213 | return __quiet; |
1214 | } |
1215 | +int __pure novamap(void) |
1216 | +{ |
1217 | + return __novamap; |
1218 | +} |
1219 | |
1220 | #define EFI_MMAP_NR_SLACK_SLOTS 8 |
1221 | |
1222 | @@ -482,6 +487,11 @@ efi_status_t efi_parse_options(char const *cmdline) |
1223 | __chunk_size = -1UL; |
1224 | } |
1225 | |
1226 | + if (!strncmp(str, "novamap", 7)) { |
1227 | + str += strlen("novamap"); |
1228 | + __novamap = 1; |
1229 | + } |
1230 | + |
1231 | /* Group words together, delimited by "," */ |
1232 | while (*str && *str != ' ' && *str != ',') |
1233 | str++; |
1234 | diff --git a/drivers/firmware/efi/libstub/efistub.h b/drivers/firmware/efi/libstub/efistub.h |
1235 | index 32799cf039ef..337b52c4702c 100644 |
1236 | --- a/drivers/firmware/efi/libstub/efistub.h |
1237 | +++ b/drivers/firmware/efi/libstub/efistub.h |
1238 | @@ -27,6 +27,7 @@ |
1239 | |
1240 | extern int __pure nokaslr(void); |
1241 | extern int __pure is_quiet(void); |
1242 | +extern int __pure novamap(void); |
1243 | |
1244 | #define pr_efi(sys_table, msg) do { \ |
1245 | if (!is_quiet()) efi_printk(sys_table, "EFI stub: "msg); \ |
1246 | diff --git a/drivers/firmware/efi/libstub/fdt.c b/drivers/firmware/efi/libstub/fdt.c |
1247 | index 0c0d2312f4a8..dba296a44f4e 100644 |
1248 | --- a/drivers/firmware/efi/libstub/fdt.c |
1249 | +++ b/drivers/firmware/efi/libstub/fdt.c |
1250 | @@ -327,6 +327,9 @@ efi_status_t allocate_new_fdt_and_exit_boot(efi_system_table_t *sys_table, |
1251 | if (status == EFI_SUCCESS) { |
1252 | efi_set_virtual_address_map_t *svam; |
1253 | |
1254 | + if (novamap()) |
1255 | + return EFI_SUCCESS; |
1256 | + |
1257 | /* Install the new virtual address map */ |
1258 | svam = sys_table->runtime->set_virtual_address_map; |
1259 | status = svam(runtime_entry_count * desc_size, desc_size, |
1260 | diff --git a/drivers/firmware/efi/memattr.c b/drivers/firmware/efi/memattr.c |
1261 | index 8986757eafaf..aac972b056d9 100644 |
1262 | --- a/drivers/firmware/efi/memattr.c |
1263 | +++ b/drivers/firmware/efi/memattr.c |
1264 | @@ -94,7 +94,7 @@ static bool entry_is_valid(const efi_memory_desc_t *in, efi_memory_desc_t *out) |
1265 | |
1266 | if (!(md->attribute & EFI_MEMORY_RUNTIME)) |
1267 | continue; |
1268 | - if (md->virt_addr == 0) { |
1269 | + if (md->virt_addr == 0 && md->phys_addr != 0) { |
1270 | /* no virtual mapping has been installed by the stub */ |
1271 | break; |
1272 | } |
1273 | diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c |
1274 | index e81008678a38..6c1acf642c8e 100644 |
1275 | --- a/drivers/gpio/gpio-omap.c |
1276 | +++ b/drivers/gpio/gpio-omap.c |
1277 | @@ -888,14 +888,16 @@ static void omap_gpio_unmask_irq(struct irq_data *d) |
1278 | if (trigger) |
1279 | omap_set_gpio_triggering(bank, offset, trigger); |
1280 | |
1281 | - /* For level-triggered GPIOs, the clearing must be done after |
1282 | - * the HW source is cleared, thus after the handler has run */ |
1283 | - if (bank->level_mask & BIT(offset)) { |
1284 | - omap_set_gpio_irqenable(bank, offset, 0); |
1285 | + omap_set_gpio_irqenable(bank, offset, 1); |
1286 | + |
1287 | + /* |
1288 | + * For level-triggered GPIOs, clearing must be done after the source |
1289 | + * is cleared, thus after the handler has run. OMAP4 needs this done |
1290 | + * after enabing the interrupt to clear the wakeup status. |
1291 | + */ |
1292 | + if (bank->level_mask & BIT(offset)) |
1293 | omap_clear_gpio_irqstatus(bank, offset); |
1294 | - } |
1295 | |
1296 | - omap_set_gpio_irqenable(bank, offset, 1); |
1297 | raw_spin_unlock_irqrestore(&bank->lock, flags); |
1298 | } |
1299 | |
1300 | diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c |
1301 | index c5ba9128b736..2b8b892eb846 100644 |
1302 | --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c |
1303 | +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c |
1304 | @@ -4368,7 +4368,8 @@ static void amdgpu_dm_commit_planes(struct drm_atomic_state *state, |
1305 | static void amdgpu_dm_crtc_copy_transient_flags(struct drm_crtc_state *crtc_state, |
1306 | struct dc_stream_state *stream_state) |
1307 | { |
1308 | - stream_state->mode_changed = crtc_state->mode_changed; |
1309 | + stream_state->mode_changed = |
1310 | + crtc_state->mode_changed || crtc_state->active_changed; |
1311 | } |
1312 | |
1313 | static int amdgpu_dm_atomic_commit(struct drm_device *dev, |
1314 | @@ -4389,10 +4390,22 @@ static int amdgpu_dm_atomic_commit(struct drm_device *dev, |
1315 | */ |
1316 | for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) { |
1317 | struct dm_crtc_state *dm_old_crtc_state = to_dm_crtc_state(old_crtc_state); |
1318 | + struct dm_crtc_state *dm_new_crtc_state = to_dm_crtc_state(new_crtc_state); |
1319 | struct amdgpu_crtc *acrtc = to_amdgpu_crtc(crtc); |
1320 | |
1321 | - if (drm_atomic_crtc_needs_modeset(new_crtc_state) && dm_old_crtc_state->stream) |
1322 | + if (drm_atomic_crtc_needs_modeset(new_crtc_state) |
1323 | + && dm_old_crtc_state->stream) { |
1324 | + /* |
1325 | + * CRC capture was enabled but not disabled. |
1326 | + * Release the vblank reference. |
1327 | + */ |
1328 | + if (dm_new_crtc_state->crc_enabled) { |
1329 | + drm_crtc_vblank_put(crtc); |
1330 | + dm_new_crtc_state->crc_enabled = false; |
1331 | + } |
1332 | + |
1333 | manage_dm_interrupts(adev, acrtc, false); |
1334 | + } |
1335 | } |
1336 | /* Add check here for SoC's that support hardware cursor plane, to |
1337 | * unset legacy_cursor_update */ |
1338 | diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crc.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crc.c |
1339 | index 6a6d977ddd7a..36a0bed9af07 100644 |
1340 | --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crc.c |
1341 | +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crc.c |
1342 | @@ -51,6 +51,7 @@ int amdgpu_dm_crtc_set_crc_source(struct drm_crtc *crtc, const char *src_name, |
1343 | { |
1344 | struct dm_crtc_state *crtc_state = to_dm_crtc_state(crtc->state); |
1345 | struct dc_stream_state *stream_state = crtc_state->stream; |
1346 | + bool enable; |
1347 | |
1348 | enum amdgpu_dm_pipe_crc_source source = dm_parse_crc_source(src_name); |
1349 | |
1350 | @@ -65,28 +66,27 @@ int amdgpu_dm_crtc_set_crc_source(struct drm_crtc *crtc, const char *src_name, |
1351 | return -EINVAL; |
1352 | } |
1353 | |
1354 | + enable = (source == AMDGPU_DM_PIPE_CRC_SOURCE_AUTO); |
1355 | + |
1356 | + if (!dc_stream_configure_crc(stream_state->ctx->dc, stream_state, |
1357 | + enable, enable)) |
1358 | + return -EINVAL; |
1359 | + |
1360 | /* When enabling CRC, we should also disable dithering. */ |
1361 | - if (source == AMDGPU_DM_PIPE_CRC_SOURCE_AUTO) { |
1362 | - if (dc_stream_configure_crc(stream_state->ctx->dc, |
1363 | - stream_state, |
1364 | - true, true)) { |
1365 | - crtc_state->crc_enabled = true; |
1366 | - dc_stream_set_dither_option(stream_state, |
1367 | - DITHER_OPTION_TRUN8); |
1368 | - } |
1369 | - else |
1370 | - return -EINVAL; |
1371 | - } else { |
1372 | - if (dc_stream_configure_crc(stream_state->ctx->dc, |
1373 | - stream_state, |
1374 | - false, false)) { |
1375 | - crtc_state->crc_enabled = false; |
1376 | - dc_stream_set_dither_option(stream_state, |
1377 | - DITHER_OPTION_DEFAULT); |
1378 | - } |
1379 | - else |
1380 | - return -EINVAL; |
1381 | - } |
1382 | + dc_stream_set_dither_option(stream_state, |
1383 | + enable ? DITHER_OPTION_TRUN8 |
1384 | + : DITHER_OPTION_DEFAULT); |
1385 | + |
1386 | + /* |
1387 | + * Reading the CRC requires the vblank interrupt handler to be |
1388 | + * enabled. Keep a reference until CRC capture stops. |
1389 | + */ |
1390 | + if (!crtc_state->crc_enabled && enable) |
1391 | + drm_crtc_vblank_get(crtc); |
1392 | + else if (crtc_state->crc_enabled && !enable) |
1393 | + drm_crtc_vblank_put(crtc); |
1394 | + |
1395 | + crtc_state->crc_enabled = enable; |
1396 | |
1397 | *values_cnt = 3; |
1398 | /* Reset crc_skipped on dm state */ |
1399 | diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c b/drivers/gpu/drm/amd/display/dc/core/dc.c |
1400 | index 9045e6fa0780..bb0cda727605 100644 |
1401 | --- a/drivers/gpu/drm/amd/display/dc/core/dc.c |
1402 | +++ b/drivers/gpu/drm/amd/display/dc/core/dc.c |
1403 | @@ -958,6 +958,9 @@ static enum dc_status dc_commit_state_no_check(struct dc *dc, struct dc_state *c |
1404 | /* pplib is notified if disp_num changed */ |
1405 | dc->hwss.set_bandwidth(dc, context, true); |
1406 | |
1407 | + for (i = 0; i < context->stream_count; i++) |
1408 | + context->streams[i]->mode_changed = false; |
1409 | + |
1410 | dc_release_state(dc->current_state); |
1411 | |
1412 | dc->current_state = context; |
1413 | 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 |
1414 | index 4058b59d9bea..a0355709abd1 100644 |
1415 | --- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c |
1416 | +++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c |
1417 | @@ -2336,9 +2336,10 @@ static void dcn10_apply_ctx_for_surface( |
1418 | } |
1419 | } |
1420 | |
1421 | - if (!pipe_ctx->plane_state && |
1422 | - old_pipe_ctx->plane_state && |
1423 | - old_pipe_ctx->stream_res.tg == tg) { |
1424 | + if ((!pipe_ctx->plane_state || |
1425 | + pipe_ctx->stream_res.tg != old_pipe_ctx->stream_res.tg) && |
1426 | + old_pipe_ctx->plane_state && |
1427 | + old_pipe_ctx->stream_res.tg == tg) { |
1428 | |
1429 | dc->hwss.plane_atomic_disconnect(dc, old_pipe_ctx); |
1430 | removed_pipe[i] = true; |
1431 | diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c b/drivers/gpu/drm/drm_dp_mst_topology.c |
1432 | index d708472d93c4..65f58e23e03d 100644 |
1433 | --- a/drivers/gpu/drm/drm_dp_mst_topology.c |
1434 | +++ b/drivers/gpu/drm/drm_dp_mst_topology.c |
1435 | @@ -3278,6 +3278,7 @@ static int drm_dp_mst_i2c_xfer(struct i2c_adapter *adapter, struct i2c_msg *msgs |
1436 | msg.u.i2c_read.transactions[i].i2c_dev_id = msgs[i].addr; |
1437 | msg.u.i2c_read.transactions[i].num_bytes = msgs[i].len; |
1438 | msg.u.i2c_read.transactions[i].bytes = msgs[i].buf; |
1439 | + msg.u.i2c_read.transactions[i].no_stop_bit = !(msgs[i].flags & I2C_M_STOP); |
1440 | } |
1441 | msg.u.i2c_read.read_i2c_device_id = msgs[num - 1].addr; |
1442 | msg.u.i2c_read.num_bytes_read = msgs[num - 1].len; |
1443 | diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c |
1444 | index e65596617239..a0663f44e218 100644 |
1445 | --- a/drivers/gpu/drm/drm_fb_helper.c |
1446 | +++ b/drivers/gpu/drm/drm_fb_helper.c |
1447 | @@ -2877,7 +2877,7 @@ int drm_fb_helper_fbdev_setup(struct drm_device *dev, |
1448 | return 0; |
1449 | |
1450 | err_drm_fb_helper_fini: |
1451 | - drm_fb_helper_fini(fb_helper); |
1452 | + drm_fb_helper_fbdev_teardown(dev); |
1453 | |
1454 | return ret; |
1455 | } |
1456 | diff --git a/drivers/gpu/drm/drm_plane.c b/drivers/gpu/drm/drm_plane.c |
1457 | index 6153cbda239f..d36b1be632d9 100644 |
1458 | --- a/drivers/gpu/drm/drm_plane.c |
1459 | +++ b/drivers/gpu/drm/drm_plane.c |
1460 | @@ -211,6 +211,9 @@ int drm_universal_plane_init(struct drm_device *dev, struct drm_plane *plane, |
1461 | format_modifier_count++; |
1462 | } |
1463 | |
1464 | + if (format_modifier_count) |
1465 | + config->allow_fb_modifiers = true; |
1466 | + |
1467 | plane->modifier_count = format_modifier_count; |
1468 | plane->modifiers = kmalloc_array(format_modifier_count, |
1469 | sizeof(format_modifiers[0]), |
1470 | diff --git a/drivers/gpu/drm/nouveau/dispnv04/tvnv17.c b/drivers/gpu/drm/nouveau/dispnv04/tvnv17.c |
1471 | index 6a4ca139cf5d..8fd8124d72ba 100644 |
1472 | --- a/drivers/gpu/drm/nouveau/dispnv04/tvnv17.c |
1473 | +++ b/drivers/gpu/drm/nouveau/dispnv04/tvnv17.c |
1474 | @@ -750,7 +750,9 @@ static int nv17_tv_set_property(struct drm_encoder *encoder, |
1475 | /* Disable the crtc to ensure a full modeset is |
1476 | * performed whenever it's turned on again. */ |
1477 | if (crtc) |
1478 | - drm_crtc_force_disable(crtc); |
1479 | + drm_crtc_helper_set_mode(crtc, &crtc->mode, |
1480 | + crtc->x, crtc->y, |
1481 | + crtc->primary->fb); |
1482 | } |
1483 | |
1484 | return 0; |
1485 | diff --git a/drivers/gpu/drm/rcar-du/rcar_du_kms.c b/drivers/gpu/drm/rcar-du/rcar_du_kms.c |
1486 | index fb46df56f0c4..0386b454e221 100644 |
1487 | --- a/drivers/gpu/drm/rcar-du/rcar_du_kms.c |
1488 | +++ b/drivers/gpu/drm/rcar-du/rcar_du_kms.c |
1489 | @@ -300,6 +300,7 @@ static int rcar_du_encoders_init_one(struct rcar_du_device *rcdu, |
1490 | dev_dbg(rcdu->dev, |
1491 | "connected entity %pOF is disabled, skipping\n", |
1492 | entity); |
1493 | + of_node_put(entity); |
1494 | return -ENODEV; |
1495 | } |
1496 | |
1497 | @@ -335,6 +336,7 @@ static int rcar_du_encoders_init_one(struct rcar_du_device *rcdu, |
1498 | dev_warn(rcdu->dev, |
1499 | "no encoder found for endpoint %pOF, skipping\n", |
1500 | ep->local_node); |
1501 | + of_node_put(entity); |
1502 | return -ENODEV; |
1503 | } |
1504 | |
1505 | diff --git a/drivers/gpu/drm/vkms/vkms_crtc.c b/drivers/gpu/drm/vkms/vkms_crtc.c |
1506 | index 1ea2dd35bca9..0a271f762a0a 100644 |
1507 | --- a/drivers/gpu/drm/vkms/vkms_crtc.c |
1508 | +++ b/drivers/gpu/drm/vkms/vkms_crtc.c |
1509 | @@ -55,6 +55,9 @@ bool vkms_get_vblank_timestamp(struct drm_device *dev, unsigned int pipe, |
1510 | |
1511 | *vblank_time = output->vblank_hrtimer.node.expires; |
1512 | |
1513 | + if (!in_vblank_irq) |
1514 | + *vblank_time -= output->period_ns; |
1515 | + |
1516 | return true; |
1517 | } |
1518 | |
1519 | diff --git a/drivers/hid/intel-ish-hid/ipc/ipc.c b/drivers/hid/intel-ish-hid/ipc/ipc.c |
1520 | index bfbca7ec54ce..e00b9dbe220f 100644 |
1521 | --- a/drivers/hid/intel-ish-hid/ipc/ipc.c |
1522 | +++ b/drivers/hid/intel-ish-hid/ipc/ipc.c |
1523 | @@ -91,7 +91,10 @@ static bool check_generated_interrupt(struct ishtp_device *dev) |
1524 | IPC_INT_FROM_ISH_TO_HOST_CHV_AB(pisr_val); |
1525 | } else { |
1526 | pisr_val = ish_reg_read(dev, IPC_REG_PISR_BXT); |
1527 | - interrupt_generated = IPC_INT_FROM_ISH_TO_HOST_BXT(pisr_val); |
1528 | + interrupt_generated = !!pisr_val; |
1529 | + /* only busy-clear bit is RW, others are RO */ |
1530 | + if (pisr_val) |
1531 | + ish_reg_write(dev, IPC_REG_PISR_BXT, pisr_val); |
1532 | } |
1533 | |
1534 | return interrupt_generated; |
1535 | @@ -843,11 +846,11 @@ int ish_hw_start(struct ishtp_device *dev) |
1536 | { |
1537 | ish_set_host_rdy(dev); |
1538 | |
1539 | + set_host_ready(dev); |
1540 | + |
1541 | /* After that we can enable ISH DMA operation and wakeup ISHFW */ |
1542 | ish_wakeup(dev); |
1543 | |
1544 | - set_host_ready(dev); |
1545 | - |
1546 | /* wait for FW-initiated reset flow */ |
1547 | if (!dev->recvd_hw_ready) |
1548 | wait_event_interruptible_timeout(dev->wait_hw_ready, |
1549 | diff --git a/drivers/hid/intel-ish-hid/ishtp/bus.c b/drivers/hid/intel-ish-hid/ishtp/bus.c |
1550 | index 2623a567ffba..f546635e9ac9 100644 |
1551 | --- a/drivers/hid/intel-ish-hid/ishtp/bus.c |
1552 | +++ b/drivers/hid/intel-ish-hid/ishtp/bus.c |
1553 | @@ -623,7 +623,8 @@ int ishtp_cl_device_bind(struct ishtp_cl *cl) |
1554 | spin_lock_irqsave(&cl->dev->device_list_lock, flags); |
1555 | list_for_each_entry(cl_device, &cl->dev->device_list, |
1556 | device_link) { |
1557 | - if (cl_device->fw_client->client_id == cl->fw_client_id) { |
1558 | + if (cl_device->fw_client && |
1559 | + cl_device->fw_client->client_id == cl->fw_client_id) { |
1560 | cl->device = cl_device; |
1561 | rv = 0; |
1562 | break; |
1563 | @@ -683,6 +684,7 @@ void ishtp_bus_remove_all_clients(struct ishtp_device *ishtp_dev, |
1564 | spin_lock_irqsave(&ishtp_dev->device_list_lock, flags); |
1565 | list_for_each_entry_safe(cl_device, n, &ishtp_dev->device_list, |
1566 | device_link) { |
1567 | + cl_device->fw_client = NULL; |
1568 | if (warm_reset && cl_device->reference_count) |
1569 | continue; |
1570 | |
1571 | diff --git a/drivers/hwtracing/coresight/coresight-etm-perf.c b/drivers/hwtracing/coresight/coresight-etm-perf.c |
1572 | index 677695635211..0f5e03e4df22 100644 |
1573 | --- a/drivers/hwtracing/coresight/coresight-etm-perf.c |
1574 | +++ b/drivers/hwtracing/coresight/coresight-etm-perf.c |
1575 | @@ -181,15 +181,15 @@ static void etm_free_aux(void *data) |
1576 | schedule_work(&event_data->work); |
1577 | } |
1578 | |
1579 | -static void *etm_setup_aux(int event_cpu, void **pages, |
1580 | +static void *etm_setup_aux(struct perf_event *event, void **pages, |
1581 | int nr_pages, bool overwrite) |
1582 | { |
1583 | - int cpu; |
1584 | + int cpu = event->cpu; |
1585 | cpumask_t *mask; |
1586 | struct coresight_device *sink; |
1587 | struct etm_event_data *event_data = NULL; |
1588 | |
1589 | - event_data = alloc_event_data(event_cpu); |
1590 | + event_data = alloc_event_data(cpu); |
1591 | if (!event_data) |
1592 | return NULL; |
1593 | INIT_WORK(&event_data->work, free_event_data); |
1594 | diff --git a/drivers/hwtracing/coresight/coresight-etm4x.c b/drivers/hwtracing/coresight/coresight-etm4x.c |
1595 | index 1d94ebec027b..2bce7cf0b0af 100644 |
1596 | --- a/drivers/hwtracing/coresight/coresight-etm4x.c |
1597 | +++ b/drivers/hwtracing/coresight/coresight-etm4x.c |
1598 | @@ -54,7 +54,8 @@ static void etm4_os_unlock(struct etmv4_drvdata *drvdata) |
1599 | |
1600 | static bool etm4_arch_supported(u8 arch) |
1601 | { |
1602 | - switch (arch) { |
1603 | + /* Mask out the minor version number */ |
1604 | + switch (arch & 0xf0) { |
1605 | case ETM_ARCH_V4: |
1606 | break; |
1607 | default: |
1608 | diff --git a/drivers/i2c/i2c-core-of.c b/drivers/i2c/i2c-core-of.c |
1609 | index 6cb7ad608bcd..0f01cdba9d2c 100644 |
1610 | --- a/drivers/i2c/i2c-core-of.c |
1611 | +++ b/drivers/i2c/i2c-core-of.c |
1612 | @@ -121,6 +121,17 @@ static int of_dev_node_match(struct device *dev, void *data) |
1613 | return dev->of_node == data; |
1614 | } |
1615 | |
1616 | +static int of_dev_or_parent_node_match(struct device *dev, void *data) |
1617 | +{ |
1618 | + if (dev->of_node == data) |
1619 | + return 1; |
1620 | + |
1621 | + if (dev->parent) |
1622 | + return dev->parent->of_node == data; |
1623 | + |
1624 | + return 0; |
1625 | +} |
1626 | + |
1627 | /* must call put_device() when done with returned i2c_client device */ |
1628 | struct i2c_client *of_find_i2c_device_by_node(struct device_node *node) |
1629 | { |
1630 | @@ -145,7 +156,8 @@ struct i2c_adapter *of_find_i2c_adapter_by_node(struct device_node *node) |
1631 | struct device *dev; |
1632 | struct i2c_adapter *adapter; |
1633 | |
1634 | - dev = bus_find_device(&i2c_bus_type, NULL, node, of_dev_node_match); |
1635 | + dev = bus_find_device(&i2c_bus_type, NULL, node, |
1636 | + of_dev_or_parent_node_match); |
1637 | if (!dev) |
1638 | return NULL; |
1639 | |
1640 | diff --git a/drivers/iio/adc/qcom-pm8xxx-xoadc.c b/drivers/iio/adc/qcom-pm8xxx-xoadc.c |
1641 | index b093ecddf1a8..54db848f0bcd 100644 |
1642 | --- a/drivers/iio/adc/qcom-pm8xxx-xoadc.c |
1643 | +++ b/drivers/iio/adc/qcom-pm8xxx-xoadc.c |
1644 | @@ -423,18 +423,14 @@ static irqreturn_t pm8xxx_eoc_irq(int irq, void *d) |
1645 | static struct pm8xxx_chan_info * |
1646 | pm8xxx_get_channel(struct pm8xxx_xoadc *adc, u8 chan) |
1647 | { |
1648 | - struct pm8xxx_chan_info *ch; |
1649 | int i; |
1650 | |
1651 | for (i = 0; i < adc->nchans; i++) { |
1652 | - ch = &adc->chans[i]; |
1653 | + struct pm8xxx_chan_info *ch = &adc->chans[i]; |
1654 | if (ch->hwchan->amux_channel == chan) |
1655 | - break; |
1656 | + return ch; |
1657 | } |
1658 | - if (i == adc->nchans) |
1659 | - return NULL; |
1660 | - |
1661 | - return ch; |
1662 | + return NULL; |
1663 | } |
1664 | |
1665 | static int pm8xxx_read_channel_rsv(struct pm8xxx_xoadc *adc, |
1666 | diff --git a/drivers/infiniband/hw/cxgb4/cm.c b/drivers/infiniband/hw/cxgb4/cm.c |
1667 | index 0f83cbec33f3..a68569ec86bf 100644 |
1668 | --- a/drivers/infiniband/hw/cxgb4/cm.c |
1669 | +++ b/drivers/infiniband/hw/cxgb4/cm.c |
1670 | @@ -1904,8 +1904,10 @@ static int abort_rpl(struct c4iw_dev *dev, struct sk_buff *skb) |
1671 | } |
1672 | mutex_unlock(&ep->com.mutex); |
1673 | |
1674 | - if (release) |
1675 | + if (release) { |
1676 | + close_complete_upcall(ep, -ECONNRESET); |
1677 | release_ep_resources(ep); |
1678 | + } |
1679 | c4iw_put_ep(&ep->com); |
1680 | return 0; |
1681 | } |
1682 | @@ -3608,7 +3610,6 @@ int c4iw_ep_disconnect(struct c4iw_ep *ep, int abrupt, gfp_t gfp) |
1683 | if (close) { |
1684 | if (abrupt) { |
1685 | set_bit(EP_DISC_ABORT, &ep->com.history); |
1686 | - close_complete_upcall(ep, -ECONNRESET); |
1687 | ret = send_abort(ep); |
1688 | } else { |
1689 | set_bit(EP_DISC_CLOSE, &ep->com.history); |
1690 | diff --git a/drivers/infiniband/hw/mlx4/cm.c b/drivers/infiniband/hw/mlx4/cm.c |
1691 | index fedaf8260105..8c79a480f2b7 100644 |
1692 | --- a/drivers/infiniband/hw/mlx4/cm.c |
1693 | +++ b/drivers/infiniband/hw/mlx4/cm.c |
1694 | @@ -39,7 +39,7 @@ |
1695 | |
1696 | #include "mlx4_ib.h" |
1697 | |
1698 | -#define CM_CLEANUP_CACHE_TIMEOUT (5 * HZ) |
1699 | +#define CM_CLEANUP_CACHE_TIMEOUT (30 * HZ) |
1700 | |
1701 | struct id_map_entry { |
1702 | struct rb_node node; |
1703 | diff --git a/drivers/input/misc/soc_button_array.c b/drivers/input/misc/soc_button_array.c |
1704 | index 23520df7650f..55cd6e0b409c 100644 |
1705 | --- a/drivers/input/misc/soc_button_array.c |
1706 | +++ b/drivers/input/misc/soc_button_array.c |
1707 | @@ -373,7 +373,7 @@ static struct soc_button_info soc_button_PNP0C40[] = { |
1708 | { "home", 1, EV_KEY, KEY_LEFTMETA, false, true }, |
1709 | { "volume_up", 2, EV_KEY, KEY_VOLUMEUP, true, false }, |
1710 | { "volume_down", 3, EV_KEY, KEY_VOLUMEDOWN, true, false }, |
1711 | - { "rotation_lock", 4, EV_SW, SW_ROTATE_LOCK, false, false }, |
1712 | + { "rotation_lock", 4, EV_KEY, KEY_ROTATE_LOCK_TOGGLE, false, false }, |
1713 | { } |
1714 | }; |
1715 | |
1716 | diff --git a/drivers/iommu/io-pgtable-arm-v7s.c b/drivers/iommu/io-pgtable-arm-v7s.c |
1717 | index fde728ea2900..48d4709a8e93 100644 |
1718 | --- a/drivers/iommu/io-pgtable-arm-v7s.c |
1719 | +++ b/drivers/iommu/io-pgtable-arm-v7s.c |
1720 | @@ -228,7 +228,8 @@ static void *__arm_v7s_alloc_table(int lvl, gfp_t gfp, |
1721 | if (dma != phys) |
1722 | goto out_unmap; |
1723 | } |
1724 | - kmemleak_ignore(table); |
1725 | + if (lvl == 2) |
1726 | + kmemleak_ignore(table); |
1727 | return table; |
1728 | |
1729 | out_unmap: |
1730 | diff --git a/drivers/leds/leds-lp55xx-common.c b/drivers/leds/leds-lp55xx-common.c |
1731 | index 3d79a6380761..723f2f17497a 100644 |
1732 | --- a/drivers/leds/leds-lp55xx-common.c |
1733 | +++ b/drivers/leds/leds-lp55xx-common.c |
1734 | @@ -201,7 +201,7 @@ static void lp55xx_firmware_loaded(const struct firmware *fw, void *context) |
1735 | |
1736 | if (!fw) { |
1737 | dev_err(dev, "firmware request failed\n"); |
1738 | - goto out; |
1739 | + return; |
1740 | } |
1741 | |
1742 | /* handling firmware data is chip dependent */ |
1743 | @@ -214,9 +214,9 @@ static void lp55xx_firmware_loaded(const struct firmware *fw, void *context) |
1744 | |
1745 | mutex_unlock(&chip->lock); |
1746 | |
1747 | -out: |
1748 | /* firmware should be released for other channel use */ |
1749 | release_firmware(chip->fw); |
1750 | + chip->fw = NULL; |
1751 | } |
1752 | |
1753 | static int lp55xx_request_firmware(struct lp55xx_chip *chip) |
1754 | diff --git a/drivers/md/bcache/sysfs.c b/drivers/md/bcache/sysfs.c |
1755 | index 26f035a0c5b9..d9481640b3e1 100644 |
1756 | --- a/drivers/md/bcache/sysfs.c |
1757 | +++ b/drivers/md/bcache/sysfs.c |
1758 | @@ -283,8 +283,12 @@ STORE(__cached_dev) |
1759 | sysfs_strtoul_clamp(writeback_rate_update_seconds, |
1760 | dc->writeback_rate_update_seconds, |
1761 | 1, WRITEBACK_RATE_UPDATE_SECS_MAX); |
1762 | - d_strtoul(writeback_rate_i_term_inverse); |
1763 | - d_strtoul_nonzero(writeback_rate_p_term_inverse); |
1764 | + sysfs_strtoul_clamp(writeback_rate_i_term_inverse, |
1765 | + dc->writeback_rate_i_term_inverse, |
1766 | + 1, UINT_MAX); |
1767 | + sysfs_strtoul_clamp(writeback_rate_p_term_inverse, |
1768 | + dc->writeback_rate_p_term_inverse, |
1769 | + 1, UINT_MAX); |
1770 | d_strtoul_nonzero(writeback_rate_minimum); |
1771 | |
1772 | sysfs_strtoul_clamp(io_error_limit, dc->error_limit, 0, INT_MAX); |
1773 | @@ -295,7 +299,9 @@ STORE(__cached_dev) |
1774 | dc->io_disable = v ? 1 : 0; |
1775 | } |
1776 | |
1777 | - d_strtoi_h(sequential_cutoff); |
1778 | + sysfs_strtoul_clamp(sequential_cutoff, |
1779 | + dc->sequential_cutoff, |
1780 | + 0, UINT_MAX); |
1781 | d_strtoi_h(readahead); |
1782 | |
1783 | if (attr == &sysfs_clear_stats) |
1784 | @@ -766,8 +772,17 @@ STORE(__bch_cache_set) |
1785 | c->error_limit = strtoul_or_return(buf); |
1786 | |
1787 | /* See count_io_errors() for why 88 */ |
1788 | - if (attr == &sysfs_io_error_halflife) |
1789 | - c->error_decay = strtoul_or_return(buf) / 88; |
1790 | + if (attr == &sysfs_io_error_halflife) { |
1791 | + unsigned long v = 0; |
1792 | + ssize_t ret; |
1793 | + |
1794 | + ret = strtoul_safe_clamp(buf, v, 0, UINT_MAX); |
1795 | + if (!ret) { |
1796 | + c->error_decay = v / 88; |
1797 | + return size; |
1798 | + } |
1799 | + return ret; |
1800 | + } |
1801 | |
1802 | if (attr == &sysfs_io_disable) { |
1803 | v = strtoul_or_return(buf); |
1804 | diff --git a/drivers/md/bcache/sysfs.h b/drivers/md/bcache/sysfs.h |
1805 | index 3fe82425859c..0ad2715a884e 100644 |
1806 | --- a/drivers/md/bcache/sysfs.h |
1807 | +++ b/drivers/md/bcache/sysfs.h |
1808 | @@ -81,9 +81,16 @@ do { \ |
1809 | |
1810 | #define sysfs_strtoul_clamp(file, var, min, max) \ |
1811 | do { \ |
1812 | - if (attr == &sysfs_ ## file) \ |
1813 | - return strtoul_safe_clamp(buf, var, min, max) \ |
1814 | - ?: (ssize_t) size; \ |
1815 | + if (attr == &sysfs_ ## file) { \ |
1816 | + unsigned long v = 0; \ |
1817 | + ssize_t ret; \ |
1818 | + ret = strtoul_safe_clamp(buf, v, min, max); \ |
1819 | + if (!ret) { \ |
1820 | + var = v; \ |
1821 | + return size; \ |
1822 | + } \ |
1823 | + return ret; \ |
1824 | + } \ |
1825 | } while (0) |
1826 | |
1827 | #define strtoul_or_return(cp) \ |
1828 | diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c |
1829 | index cd4220ee7004..435a2ee4a392 100644 |
1830 | --- a/drivers/md/dm-thin.c |
1831 | +++ b/drivers/md/dm-thin.c |
1832 | @@ -3283,6 +3283,13 @@ static int pool_ctr(struct dm_target *ti, unsigned argc, char **argv) |
1833 | as.argc = argc; |
1834 | as.argv = argv; |
1835 | |
1836 | + /* make sure metadata and data are different devices */ |
1837 | + if (!strcmp(argv[0], argv[1])) { |
1838 | + ti->error = "Error setting metadata or data device"; |
1839 | + r = -EINVAL; |
1840 | + goto out_unlock; |
1841 | + } |
1842 | + |
1843 | /* |
1844 | * Set default pool features. |
1845 | */ |
1846 | @@ -4167,6 +4174,12 @@ static int thin_ctr(struct dm_target *ti, unsigned argc, char **argv) |
1847 | tc->sort_bio_list = RB_ROOT; |
1848 | |
1849 | if (argc == 3) { |
1850 | + if (!strcmp(argv[0], argv[2])) { |
1851 | + ti->error = "Error setting origin device"; |
1852 | + r = -EINVAL; |
1853 | + goto bad_origin_dev; |
1854 | + } |
1855 | + |
1856 | r = dm_get_device(ti, argv[2], FMODE_READ, &origin_dev); |
1857 | if (r) { |
1858 | ti->error = "Error opening origin device"; |
1859 | diff --git a/drivers/media/i2c/mt9m111.c b/drivers/media/i2c/mt9m111.c |
1860 | index efda1aa95ca0..7a7d3969af20 100644 |
1861 | --- a/drivers/media/i2c/mt9m111.c |
1862 | +++ b/drivers/media/i2c/mt9m111.c |
1863 | @@ -1014,6 +1014,8 @@ static int mt9m111_probe(struct i2c_client *client, |
1864 | mt9m111->rect.top = MT9M111_MIN_DARK_ROWS; |
1865 | mt9m111->rect.width = MT9M111_MAX_WIDTH; |
1866 | mt9m111->rect.height = MT9M111_MAX_HEIGHT; |
1867 | + mt9m111->width = mt9m111->rect.width; |
1868 | + mt9m111->height = mt9m111->rect.height; |
1869 | mt9m111->fmt = &mt9m111_colour_fmts[0]; |
1870 | mt9m111->lastpage = -1; |
1871 | mutex_init(&mt9m111->power_lock); |
1872 | diff --git a/drivers/media/i2c/ov7740.c b/drivers/media/i2c/ov7740.c |
1873 | index 605f3e25ad82..f5a1ee90a6c5 100644 |
1874 | --- a/drivers/media/i2c/ov7740.c |
1875 | +++ b/drivers/media/i2c/ov7740.c |
1876 | @@ -1101,6 +1101,9 @@ static int ov7740_probe(struct i2c_client *client, |
1877 | if (ret) |
1878 | return ret; |
1879 | |
1880 | + pm_runtime_set_active(&client->dev); |
1881 | + pm_runtime_enable(&client->dev); |
1882 | + |
1883 | ret = ov7740_detect(ov7740); |
1884 | if (ret) |
1885 | goto error_detect; |
1886 | @@ -1123,8 +1126,6 @@ static int ov7740_probe(struct i2c_client *client, |
1887 | if (ret) |
1888 | goto error_async_register; |
1889 | |
1890 | - pm_runtime_set_active(&client->dev); |
1891 | - pm_runtime_enable(&client->dev); |
1892 | pm_runtime_idle(&client->dev); |
1893 | |
1894 | return 0; |
1895 | @@ -1134,6 +1135,8 @@ error_async_register: |
1896 | error_init_controls: |
1897 | ov7740_free_controls(ov7740); |
1898 | error_detect: |
1899 | + pm_runtime_disable(&client->dev); |
1900 | + pm_runtime_set_suspended(&client->dev); |
1901 | ov7740_set_power(ov7740, 0); |
1902 | media_entity_cleanup(&ov7740->subdev.entity); |
1903 | |
1904 | diff --git a/drivers/media/platform/mtk-jpeg/mtk_jpeg_core.c b/drivers/media/platform/mtk-jpeg/mtk_jpeg_core.c |
1905 | index 4f24da8afecc..11429633b2fb 100644 |
1906 | --- a/drivers/media/platform/mtk-jpeg/mtk_jpeg_core.c |
1907 | +++ b/drivers/media/platform/mtk-jpeg/mtk_jpeg_core.c |
1908 | @@ -702,7 +702,7 @@ end: |
1909 | v4l2_m2m_buf_queue(ctx->fh.m2m_ctx, to_vb2_v4l2_buffer(vb)); |
1910 | } |
1911 | |
1912 | -static void *mtk_jpeg_buf_remove(struct mtk_jpeg_ctx *ctx, |
1913 | +static struct vb2_v4l2_buffer *mtk_jpeg_buf_remove(struct mtk_jpeg_ctx *ctx, |
1914 | enum v4l2_buf_type type) |
1915 | { |
1916 | if (V4L2_TYPE_IS_OUTPUT(type)) |
1917 | @@ -714,7 +714,7 @@ static void *mtk_jpeg_buf_remove(struct mtk_jpeg_ctx *ctx, |
1918 | static int mtk_jpeg_start_streaming(struct vb2_queue *q, unsigned int count) |
1919 | { |
1920 | struct mtk_jpeg_ctx *ctx = vb2_get_drv_priv(q); |
1921 | - struct vb2_buffer *vb; |
1922 | + struct vb2_v4l2_buffer *vb; |
1923 | int ret = 0; |
1924 | |
1925 | ret = pm_runtime_get_sync(ctx->jpeg->dev); |
1926 | @@ -724,14 +724,14 @@ static int mtk_jpeg_start_streaming(struct vb2_queue *q, unsigned int count) |
1927 | return 0; |
1928 | err: |
1929 | while ((vb = mtk_jpeg_buf_remove(ctx, q->type))) |
1930 | - v4l2_m2m_buf_done(to_vb2_v4l2_buffer(vb), VB2_BUF_STATE_QUEUED); |
1931 | + v4l2_m2m_buf_done(vb, VB2_BUF_STATE_QUEUED); |
1932 | return ret; |
1933 | } |
1934 | |
1935 | static void mtk_jpeg_stop_streaming(struct vb2_queue *q) |
1936 | { |
1937 | struct mtk_jpeg_ctx *ctx = vb2_get_drv_priv(q); |
1938 | - struct vb2_buffer *vb; |
1939 | + struct vb2_v4l2_buffer *vb; |
1940 | |
1941 | /* |
1942 | * STREAMOFF is an acknowledgment for source change event. |
1943 | @@ -743,7 +743,7 @@ static void mtk_jpeg_stop_streaming(struct vb2_queue *q) |
1944 | struct mtk_jpeg_src_buf *src_buf; |
1945 | |
1946 | vb = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx); |
1947 | - src_buf = mtk_jpeg_vb2_to_srcbuf(vb); |
1948 | + src_buf = mtk_jpeg_vb2_to_srcbuf(&vb->vb2_buf); |
1949 | mtk_jpeg_set_queue_data(ctx, &src_buf->dec_param); |
1950 | ctx->state = MTK_JPEG_RUNNING; |
1951 | } else if (V4L2_TYPE_IS_OUTPUT(q->type)) { |
1952 | @@ -751,7 +751,7 @@ static void mtk_jpeg_stop_streaming(struct vb2_queue *q) |
1953 | } |
1954 | |
1955 | while ((vb = mtk_jpeg_buf_remove(ctx, q->type))) |
1956 | - v4l2_m2m_buf_done(to_vb2_v4l2_buffer(vb), VB2_BUF_STATE_ERROR); |
1957 | + v4l2_m2m_buf_done(vb, VB2_BUF_STATE_ERROR); |
1958 | |
1959 | pm_runtime_put_sync(ctx->jpeg->dev); |
1960 | } |
1961 | @@ -807,7 +807,7 @@ static void mtk_jpeg_device_run(void *priv) |
1962 | { |
1963 | struct mtk_jpeg_ctx *ctx = priv; |
1964 | struct mtk_jpeg_dev *jpeg = ctx->jpeg; |
1965 | - struct vb2_buffer *src_buf, *dst_buf; |
1966 | + struct vb2_v4l2_buffer *src_buf, *dst_buf; |
1967 | enum vb2_buffer_state buf_state = VB2_BUF_STATE_ERROR; |
1968 | unsigned long flags; |
1969 | struct mtk_jpeg_src_buf *jpeg_src_buf; |
1970 | @@ -817,11 +817,11 @@ static void mtk_jpeg_device_run(void *priv) |
1971 | |
1972 | src_buf = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx); |
1973 | dst_buf = v4l2_m2m_next_dst_buf(ctx->fh.m2m_ctx); |
1974 | - jpeg_src_buf = mtk_jpeg_vb2_to_srcbuf(src_buf); |
1975 | + jpeg_src_buf = mtk_jpeg_vb2_to_srcbuf(&src_buf->vb2_buf); |
1976 | |
1977 | if (jpeg_src_buf->flags & MTK_JPEG_BUF_FLAGS_LAST_FRAME) { |
1978 | - for (i = 0; i < dst_buf->num_planes; i++) |
1979 | - vb2_set_plane_payload(dst_buf, i, 0); |
1980 | + for (i = 0; i < dst_buf->vb2_buf.num_planes; i++) |
1981 | + vb2_set_plane_payload(&dst_buf->vb2_buf, i, 0); |
1982 | buf_state = VB2_BUF_STATE_DONE; |
1983 | goto dec_end; |
1984 | } |
1985 | @@ -833,8 +833,8 @@ static void mtk_jpeg_device_run(void *priv) |
1986 | return; |
1987 | } |
1988 | |
1989 | - mtk_jpeg_set_dec_src(ctx, src_buf, &bs); |
1990 | - if (mtk_jpeg_set_dec_dst(ctx, &jpeg_src_buf->dec_param, dst_buf, &fb)) |
1991 | + mtk_jpeg_set_dec_src(ctx, &src_buf->vb2_buf, &bs); |
1992 | + if (mtk_jpeg_set_dec_dst(ctx, &jpeg_src_buf->dec_param, &dst_buf->vb2_buf, &fb)) |
1993 | goto dec_end; |
1994 | |
1995 | spin_lock_irqsave(&jpeg->hw_lock, flags); |
1996 | @@ -849,8 +849,8 @@ static void mtk_jpeg_device_run(void *priv) |
1997 | dec_end: |
1998 | v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx); |
1999 | v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx); |
2000 | - v4l2_m2m_buf_done(to_vb2_v4l2_buffer(src_buf), buf_state); |
2001 | - v4l2_m2m_buf_done(to_vb2_v4l2_buffer(dst_buf), buf_state); |
2002 | + v4l2_m2m_buf_done(src_buf, buf_state); |
2003 | + v4l2_m2m_buf_done(dst_buf, buf_state); |
2004 | v4l2_m2m_job_finish(jpeg->m2m_dev, ctx->fh.m2m_ctx); |
2005 | } |
2006 | |
2007 | @@ -921,7 +921,7 @@ static irqreturn_t mtk_jpeg_dec_irq(int irq, void *priv) |
2008 | { |
2009 | struct mtk_jpeg_dev *jpeg = priv; |
2010 | struct mtk_jpeg_ctx *ctx; |
2011 | - struct vb2_buffer *src_buf, *dst_buf; |
2012 | + struct vb2_v4l2_buffer *src_buf, *dst_buf; |
2013 | struct mtk_jpeg_src_buf *jpeg_src_buf; |
2014 | enum vb2_buffer_state buf_state = VB2_BUF_STATE_ERROR; |
2015 | u32 dec_irq_ret; |
2016 | @@ -938,7 +938,7 @@ static irqreturn_t mtk_jpeg_dec_irq(int irq, void *priv) |
2017 | |
2018 | src_buf = v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx); |
2019 | dst_buf = v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx); |
2020 | - jpeg_src_buf = mtk_jpeg_vb2_to_srcbuf(src_buf); |
2021 | + jpeg_src_buf = mtk_jpeg_vb2_to_srcbuf(&src_buf->vb2_buf); |
2022 | |
2023 | if (dec_irq_ret >= MTK_JPEG_DEC_RESULT_UNDERFLOW) |
2024 | mtk_jpeg_dec_reset(jpeg->dec_reg_base); |
2025 | @@ -948,15 +948,15 @@ static irqreturn_t mtk_jpeg_dec_irq(int irq, void *priv) |
2026 | goto dec_end; |
2027 | } |
2028 | |
2029 | - for (i = 0; i < dst_buf->num_planes; i++) |
2030 | - vb2_set_plane_payload(dst_buf, i, |
2031 | + for (i = 0; i < dst_buf->vb2_buf.num_planes; i++) |
2032 | + vb2_set_plane_payload(&dst_buf->vb2_buf, i, |
2033 | jpeg_src_buf->dec_param.comp_size[i]); |
2034 | |
2035 | buf_state = VB2_BUF_STATE_DONE; |
2036 | |
2037 | dec_end: |
2038 | - v4l2_m2m_buf_done(to_vb2_v4l2_buffer(src_buf), buf_state); |
2039 | - v4l2_m2m_buf_done(to_vb2_v4l2_buffer(dst_buf), buf_state); |
2040 | + v4l2_m2m_buf_done(src_buf, buf_state); |
2041 | + v4l2_m2m_buf_done(dst_buf, buf_state); |
2042 | v4l2_m2m_job_finish(jpeg->m2m_dev, ctx->fh.m2m_ctx); |
2043 | return IRQ_HANDLED; |
2044 | } |
2045 | diff --git a/drivers/media/platform/mx2_emmaprp.c b/drivers/media/platform/mx2_emmaprp.c |
2046 | index 64195c4ddeaf..419e1cb10dc6 100644 |
2047 | --- a/drivers/media/platform/mx2_emmaprp.c |
2048 | +++ b/drivers/media/platform/mx2_emmaprp.c |
2049 | @@ -274,7 +274,7 @@ static void emmaprp_device_run(void *priv) |
2050 | { |
2051 | struct emmaprp_ctx *ctx = priv; |
2052 | struct emmaprp_q_data *s_q_data, *d_q_data; |
2053 | - struct vb2_buffer *src_buf, *dst_buf; |
2054 | + struct vb2_v4l2_buffer *src_buf, *dst_buf; |
2055 | struct emmaprp_dev *pcdev = ctx->dev; |
2056 | unsigned int s_width, s_height; |
2057 | unsigned int d_width, d_height; |
2058 | @@ -294,8 +294,8 @@ static void emmaprp_device_run(void *priv) |
2059 | d_height = d_q_data->height; |
2060 | d_size = d_width * d_height; |
2061 | |
2062 | - p_in = vb2_dma_contig_plane_dma_addr(src_buf, 0); |
2063 | - p_out = vb2_dma_contig_plane_dma_addr(dst_buf, 0); |
2064 | + p_in = vb2_dma_contig_plane_dma_addr(&src_buf->vb2_buf, 0); |
2065 | + p_out = vb2_dma_contig_plane_dma_addr(&dst_buf->vb2_buf, 0); |
2066 | if (!p_in || !p_out) { |
2067 | v4l2_err(&pcdev->v4l2_dev, |
2068 | "Acquiring kernel pointers to buffers failed\n"); |
2069 | diff --git a/drivers/media/platform/rcar-vin/rcar-core.c b/drivers/media/platform/rcar-vin/rcar-core.c |
2070 | index ce09799976ef..e1085e3ab3cc 100644 |
2071 | --- a/drivers/media/platform/rcar-vin/rcar-core.c |
2072 | +++ b/drivers/media/platform/rcar-vin/rcar-core.c |
2073 | @@ -131,9 +131,13 @@ static int rvin_group_link_notify(struct media_link *link, u32 flags, |
2074 | !is_media_entity_v4l2_video_device(link->sink->entity)) |
2075 | return 0; |
2076 | |
2077 | - /* If any entity is in use don't allow link changes. */ |
2078 | + /* |
2079 | + * Don't allow link changes if any entity in the graph is |
2080 | + * streaming, modifying the CHSEL register fields can disrupt |
2081 | + * running streams. |
2082 | + */ |
2083 | media_device_for_each_entity(entity, &group->mdev) |
2084 | - if (entity->use_count) |
2085 | + if (entity->stream_count) |
2086 | return -EBUSY; |
2087 | |
2088 | mutex_lock(&group->lock); |
2089 | diff --git a/drivers/media/platform/rockchip/rga/rga.c b/drivers/media/platform/rockchip/rga/rga.c |
2090 | index ab5a6f95044a..86a76f35a9a1 100644 |
2091 | --- a/drivers/media/platform/rockchip/rga/rga.c |
2092 | +++ b/drivers/media/platform/rockchip/rga/rga.c |
2093 | @@ -43,7 +43,7 @@ static void device_run(void *prv) |
2094 | { |
2095 | struct rga_ctx *ctx = prv; |
2096 | struct rockchip_rga *rga = ctx->rga; |
2097 | - struct vb2_buffer *src, *dst; |
2098 | + struct vb2_v4l2_buffer *src, *dst; |
2099 | unsigned long flags; |
2100 | |
2101 | spin_lock_irqsave(&rga->ctrl_lock, flags); |
2102 | @@ -53,8 +53,8 @@ static void device_run(void *prv) |
2103 | src = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx); |
2104 | dst = v4l2_m2m_next_dst_buf(ctx->fh.m2m_ctx); |
2105 | |
2106 | - rga_buf_map(src); |
2107 | - rga_buf_map(dst); |
2108 | + rga_buf_map(&src->vb2_buf); |
2109 | + rga_buf_map(&dst->vb2_buf); |
2110 | |
2111 | rga_hw_start(rga); |
2112 | |
2113 | diff --git a/drivers/media/platform/s5p-g2d/g2d.c b/drivers/media/platform/s5p-g2d/g2d.c |
2114 | index e901201b6fcc..1f58574d0b96 100644 |
2115 | --- a/drivers/media/platform/s5p-g2d/g2d.c |
2116 | +++ b/drivers/media/platform/s5p-g2d/g2d.c |
2117 | @@ -487,7 +487,7 @@ static void device_run(void *prv) |
2118 | { |
2119 | struct g2d_ctx *ctx = prv; |
2120 | struct g2d_dev *dev = ctx->dev; |
2121 | - struct vb2_buffer *src, *dst; |
2122 | + struct vb2_v4l2_buffer *src, *dst; |
2123 | unsigned long flags; |
2124 | u32 cmd = 0; |
2125 | |
2126 | @@ -502,10 +502,10 @@ static void device_run(void *prv) |
2127 | spin_lock_irqsave(&dev->ctrl_lock, flags); |
2128 | |
2129 | g2d_set_src_size(dev, &ctx->in); |
2130 | - g2d_set_src_addr(dev, vb2_dma_contig_plane_dma_addr(src, 0)); |
2131 | + g2d_set_src_addr(dev, vb2_dma_contig_plane_dma_addr(&src->vb2_buf, 0)); |
2132 | |
2133 | g2d_set_dst_size(dev, &ctx->out); |
2134 | - g2d_set_dst_addr(dev, vb2_dma_contig_plane_dma_addr(dst, 0)); |
2135 | + g2d_set_dst_addr(dev, vb2_dma_contig_plane_dma_addr(&dst->vb2_buf, 0)); |
2136 | |
2137 | g2d_set_rop4(dev, ctx->rop); |
2138 | g2d_set_flip(dev, ctx->flip); |
2139 | diff --git a/drivers/media/platform/s5p-jpeg/jpeg-core.c b/drivers/media/platform/s5p-jpeg/jpeg-core.c |
2140 | index 04fd2e0493c0..350afaa29a62 100644 |
2141 | --- a/drivers/media/platform/s5p-jpeg/jpeg-core.c |
2142 | +++ b/drivers/media/platform/s5p-jpeg/jpeg-core.c |
2143 | @@ -793,14 +793,14 @@ static void skip(struct s5p_jpeg_buffer *buf, long len); |
2144 | static void exynos4_jpeg_parse_decode_h_tbl(struct s5p_jpeg_ctx *ctx) |
2145 | { |
2146 | struct s5p_jpeg *jpeg = ctx->jpeg; |
2147 | - struct vb2_buffer *vb = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx); |
2148 | + struct vb2_v4l2_buffer *vb = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx); |
2149 | struct s5p_jpeg_buffer jpeg_buffer; |
2150 | unsigned int word; |
2151 | int c, x, components; |
2152 | |
2153 | jpeg_buffer.size = 2; /* Ls */ |
2154 | jpeg_buffer.data = |
2155 | - (unsigned long)vb2_plane_vaddr(vb, 0) + ctx->out_q.sos + 2; |
2156 | + (unsigned long)vb2_plane_vaddr(&vb->vb2_buf, 0) + ctx->out_q.sos + 2; |
2157 | jpeg_buffer.curr = 0; |
2158 | |
2159 | word = 0; |
2160 | @@ -830,14 +830,14 @@ static void exynos4_jpeg_parse_decode_h_tbl(struct s5p_jpeg_ctx *ctx) |
2161 | static void exynos4_jpeg_parse_huff_tbl(struct s5p_jpeg_ctx *ctx) |
2162 | { |
2163 | struct s5p_jpeg *jpeg = ctx->jpeg; |
2164 | - struct vb2_buffer *vb = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx); |
2165 | + struct vb2_v4l2_buffer *vb = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx); |
2166 | struct s5p_jpeg_buffer jpeg_buffer; |
2167 | unsigned int word; |
2168 | int c, i, n, j; |
2169 | |
2170 | for (j = 0; j < ctx->out_q.dht.n; ++j) { |
2171 | jpeg_buffer.size = ctx->out_q.dht.len[j]; |
2172 | - jpeg_buffer.data = (unsigned long)vb2_plane_vaddr(vb, 0) + |
2173 | + jpeg_buffer.data = (unsigned long)vb2_plane_vaddr(&vb->vb2_buf, 0) + |
2174 | ctx->out_q.dht.marker[j]; |
2175 | jpeg_buffer.curr = 0; |
2176 | |
2177 | @@ -889,13 +889,13 @@ static void exynos4_jpeg_parse_huff_tbl(struct s5p_jpeg_ctx *ctx) |
2178 | static void exynos4_jpeg_parse_decode_q_tbl(struct s5p_jpeg_ctx *ctx) |
2179 | { |
2180 | struct s5p_jpeg *jpeg = ctx->jpeg; |
2181 | - struct vb2_buffer *vb = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx); |
2182 | + struct vb2_v4l2_buffer *vb = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx); |
2183 | struct s5p_jpeg_buffer jpeg_buffer; |
2184 | int c, x, components; |
2185 | |
2186 | jpeg_buffer.size = ctx->out_q.sof_len; |
2187 | jpeg_buffer.data = |
2188 | - (unsigned long)vb2_plane_vaddr(vb, 0) + ctx->out_q.sof; |
2189 | + (unsigned long)vb2_plane_vaddr(&vb->vb2_buf, 0) + ctx->out_q.sof; |
2190 | jpeg_buffer.curr = 0; |
2191 | |
2192 | skip(&jpeg_buffer, 5); /* P, Y, X */ |
2193 | @@ -920,14 +920,14 @@ static void exynos4_jpeg_parse_decode_q_tbl(struct s5p_jpeg_ctx *ctx) |
2194 | static void exynos4_jpeg_parse_q_tbl(struct s5p_jpeg_ctx *ctx) |
2195 | { |
2196 | struct s5p_jpeg *jpeg = ctx->jpeg; |
2197 | - struct vb2_buffer *vb = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx); |
2198 | + struct vb2_v4l2_buffer *vb = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx); |
2199 | struct s5p_jpeg_buffer jpeg_buffer; |
2200 | unsigned int word; |
2201 | int c, i, j; |
2202 | |
2203 | for (j = 0; j < ctx->out_q.dqt.n; ++j) { |
2204 | jpeg_buffer.size = ctx->out_q.dqt.len[j]; |
2205 | - jpeg_buffer.data = (unsigned long)vb2_plane_vaddr(vb, 0) + |
2206 | + jpeg_buffer.data = (unsigned long)vb2_plane_vaddr(&vb->vb2_buf, 0) + |
2207 | ctx->out_q.dqt.marker[j]; |
2208 | jpeg_buffer.curr = 0; |
2209 | |
2210 | @@ -1293,13 +1293,16 @@ static int s5p_jpeg_querycap(struct file *file, void *priv, |
2211 | return 0; |
2212 | } |
2213 | |
2214 | -static int enum_fmt(struct s5p_jpeg_fmt *sjpeg_formats, int n, |
2215 | +static int enum_fmt(struct s5p_jpeg_ctx *ctx, |
2216 | + struct s5p_jpeg_fmt *sjpeg_formats, int n, |
2217 | struct v4l2_fmtdesc *f, u32 type) |
2218 | { |
2219 | int i, num = 0; |
2220 | + unsigned int fmt_ver_flag = ctx->jpeg->variant->fmt_ver_flag; |
2221 | |
2222 | for (i = 0; i < n; ++i) { |
2223 | - if (sjpeg_formats[i].flags & type) { |
2224 | + if (sjpeg_formats[i].flags & type && |
2225 | + sjpeg_formats[i].flags & fmt_ver_flag) { |
2226 | /* index-th format of type type found ? */ |
2227 | if (num == f->index) |
2228 | break; |
2229 | @@ -1326,11 +1329,11 @@ static int s5p_jpeg_enum_fmt_vid_cap(struct file *file, void *priv, |
2230 | struct s5p_jpeg_ctx *ctx = fh_to_ctx(priv); |
2231 | |
2232 | if (ctx->mode == S5P_JPEG_ENCODE) |
2233 | - return enum_fmt(sjpeg_formats, SJPEG_NUM_FORMATS, f, |
2234 | + return enum_fmt(ctx, sjpeg_formats, SJPEG_NUM_FORMATS, f, |
2235 | SJPEG_FMT_FLAG_ENC_CAPTURE); |
2236 | |
2237 | - return enum_fmt(sjpeg_formats, SJPEG_NUM_FORMATS, f, |
2238 | - SJPEG_FMT_FLAG_DEC_CAPTURE); |
2239 | + return enum_fmt(ctx, sjpeg_formats, SJPEG_NUM_FORMATS, f, |
2240 | + SJPEG_FMT_FLAG_DEC_CAPTURE); |
2241 | } |
2242 | |
2243 | static int s5p_jpeg_enum_fmt_vid_out(struct file *file, void *priv, |
2244 | @@ -1339,11 +1342,11 @@ static int s5p_jpeg_enum_fmt_vid_out(struct file *file, void *priv, |
2245 | struct s5p_jpeg_ctx *ctx = fh_to_ctx(priv); |
2246 | |
2247 | if (ctx->mode == S5P_JPEG_ENCODE) |
2248 | - return enum_fmt(sjpeg_formats, SJPEG_NUM_FORMATS, f, |
2249 | + return enum_fmt(ctx, sjpeg_formats, SJPEG_NUM_FORMATS, f, |
2250 | SJPEG_FMT_FLAG_ENC_OUTPUT); |
2251 | |
2252 | - return enum_fmt(sjpeg_formats, SJPEG_NUM_FORMATS, f, |
2253 | - SJPEG_FMT_FLAG_DEC_OUTPUT); |
2254 | + return enum_fmt(ctx, sjpeg_formats, SJPEG_NUM_FORMATS, f, |
2255 | + SJPEG_FMT_FLAG_DEC_OUTPUT); |
2256 | } |
2257 | |
2258 | static struct s5p_jpeg_q_data *get_q_data(struct s5p_jpeg_ctx *ctx, |
2259 | @@ -2072,15 +2075,15 @@ static void s5p_jpeg_device_run(void *priv) |
2260 | { |
2261 | struct s5p_jpeg_ctx *ctx = priv; |
2262 | struct s5p_jpeg *jpeg = ctx->jpeg; |
2263 | - struct vb2_buffer *src_buf, *dst_buf; |
2264 | + struct vb2_v4l2_buffer *src_buf, *dst_buf; |
2265 | unsigned long src_addr, dst_addr, flags; |
2266 | |
2267 | spin_lock_irqsave(&ctx->jpeg->slock, flags); |
2268 | |
2269 | src_buf = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx); |
2270 | dst_buf = v4l2_m2m_next_dst_buf(ctx->fh.m2m_ctx); |
2271 | - src_addr = vb2_dma_contig_plane_dma_addr(src_buf, 0); |
2272 | - dst_addr = vb2_dma_contig_plane_dma_addr(dst_buf, 0); |
2273 | + src_addr = vb2_dma_contig_plane_dma_addr(&src_buf->vb2_buf, 0); |
2274 | + dst_addr = vb2_dma_contig_plane_dma_addr(&dst_buf->vb2_buf, 0); |
2275 | |
2276 | s5p_jpeg_reset(jpeg->regs); |
2277 | s5p_jpeg_poweron(jpeg->regs); |
2278 | @@ -2153,7 +2156,7 @@ static void exynos4_jpeg_set_img_addr(struct s5p_jpeg_ctx *ctx) |
2279 | { |
2280 | struct s5p_jpeg *jpeg = ctx->jpeg; |
2281 | struct s5p_jpeg_fmt *fmt; |
2282 | - struct vb2_buffer *vb; |
2283 | + struct vb2_v4l2_buffer *vb; |
2284 | struct s5p_jpeg_addr jpeg_addr = {}; |
2285 | u32 pix_size, padding_bytes = 0; |
2286 | |
2287 | @@ -2172,7 +2175,7 @@ static void exynos4_jpeg_set_img_addr(struct s5p_jpeg_ctx *ctx) |
2288 | vb = v4l2_m2m_next_dst_buf(ctx->fh.m2m_ctx); |
2289 | } |
2290 | |
2291 | - jpeg_addr.y = vb2_dma_contig_plane_dma_addr(vb, 0); |
2292 | + jpeg_addr.y = vb2_dma_contig_plane_dma_addr(&vb->vb2_buf, 0); |
2293 | |
2294 | if (fmt->colplanes == 2) { |
2295 | jpeg_addr.cb = jpeg_addr.y + pix_size - padding_bytes; |
2296 | @@ -2190,7 +2193,7 @@ static void exynos4_jpeg_set_img_addr(struct s5p_jpeg_ctx *ctx) |
2297 | static void exynos4_jpeg_set_jpeg_addr(struct s5p_jpeg_ctx *ctx) |
2298 | { |
2299 | struct s5p_jpeg *jpeg = ctx->jpeg; |
2300 | - struct vb2_buffer *vb; |
2301 | + struct vb2_v4l2_buffer *vb; |
2302 | unsigned int jpeg_addr = 0; |
2303 | |
2304 | if (ctx->mode == S5P_JPEG_ENCODE) |
2305 | @@ -2198,7 +2201,7 @@ static void exynos4_jpeg_set_jpeg_addr(struct s5p_jpeg_ctx *ctx) |
2306 | else |
2307 | vb = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx); |
2308 | |
2309 | - jpeg_addr = vb2_dma_contig_plane_dma_addr(vb, 0); |
2310 | + jpeg_addr = vb2_dma_contig_plane_dma_addr(&vb->vb2_buf, 0); |
2311 | if (jpeg->variant->version == SJPEG_EXYNOS5433 && |
2312 | ctx->mode == S5P_JPEG_DECODE) |
2313 | jpeg_addr += ctx->out_q.sos; |
2314 | @@ -2314,7 +2317,7 @@ static void exynos3250_jpeg_set_img_addr(struct s5p_jpeg_ctx *ctx) |
2315 | { |
2316 | struct s5p_jpeg *jpeg = ctx->jpeg; |
2317 | struct s5p_jpeg_fmt *fmt; |
2318 | - struct vb2_buffer *vb; |
2319 | + struct vb2_v4l2_buffer *vb; |
2320 | struct s5p_jpeg_addr jpeg_addr = {}; |
2321 | u32 pix_size; |
2322 | |
2323 | @@ -2328,7 +2331,7 @@ static void exynos3250_jpeg_set_img_addr(struct s5p_jpeg_ctx *ctx) |
2324 | fmt = ctx->cap_q.fmt; |
2325 | } |
2326 | |
2327 | - jpeg_addr.y = vb2_dma_contig_plane_dma_addr(vb, 0); |
2328 | + jpeg_addr.y = vb2_dma_contig_plane_dma_addr(&vb->vb2_buf, 0); |
2329 | |
2330 | if (fmt->colplanes == 2) { |
2331 | jpeg_addr.cb = jpeg_addr.y + pix_size; |
2332 | @@ -2346,7 +2349,7 @@ static void exynos3250_jpeg_set_img_addr(struct s5p_jpeg_ctx *ctx) |
2333 | static void exynos3250_jpeg_set_jpeg_addr(struct s5p_jpeg_ctx *ctx) |
2334 | { |
2335 | struct s5p_jpeg *jpeg = ctx->jpeg; |
2336 | - struct vb2_buffer *vb; |
2337 | + struct vb2_v4l2_buffer *vb; |
2338 | unsigned int jpeg_addr = 0; |
2339 | |
2340 | if (ctx->mode == S5P_JPEG_ENCODE) |
2341 | @@ -2354,7 +2357,7 @@ static void exynos3250_jpeg_set_jpeg_addr(struct s5p_jpeg_ctx *ctx) |
2342 | else |
2343 | vb = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx); |
2344 | |
2345 | - jpeg_addr = vb2_dma_contig_plane_dma_addr(vb, 0); |
2346 | + jpeg_addr = vb2_dma_contig_plane_dma_addr(&vb->vb2_buf, 0); |
2347 | exynos3250_jpeg_jpgadr(jpeg->regs, jpeg_addr); |
2348 | } |
2349 | |
2350 | diff --git a/drivers/media/platform/sh_veu.c b/drivers/media/platform/sh_veu.c |
2351 | index 1d274c64de09..03ee9839a03e 100644 |
2352 | --- a/drivers/media/platform/sh_veu.c |
2353 | +++ b/drivers/media/platform/sh_veu.c |
2354 | @@ -273,13 +273,13 @@ static void sh_veu_process(struct sh_veu_dev *veu, |
2355 | static void sh_veu_device_run(void *priv) |
2356 | { |
2357 | struct sh_veu_dev *veu = priv; |
2358 | - struct vb2_buffer *src_buf, *dst_buf; |
2359 | + struct vb2_v4l2_buffer *src_buf, *dst_buf; |
2360 | |
2361 | src_buf = v4l2_m2m_next_src_buf(veu->m2m_ctx); |
2362 | dst_buf = v4l2_m2m_next_dst_buf(veu->m2m_ctx); |
2363 | |
2364 | if (src_buf && dst_buf) |
2365 | - sh_veu_process(veu, src_buf, dst_buf); |
2366 | + sh_veu_process(veu, &src_buf->vb2_buf, &dst_buf->vb2_buf); |
2367 | } |
2368 | |
2369 | /* ========== video ioctls ========== */ |
2370 | diff --git a/drivers/mmc/host/omap.c b/drivers/mmc/host/omap.c |
2371 | index c60a7625b1fa..b2873a2432b6 100644 |
2372 | --- a/drivers/mmc/host/omap.c |
2373 | +++ b/drivers/mmc/host/omap.c |
2374 | @@ -920,7 +920,7 @@ static inline void set_cmd_timeout(struct mmc_omap_host *host, struct mmc_reques |
2375 | reg &= ~(1 << 5); |
2376 | OMAP_MMC_WRITE(host, SDIO, reg); |
2377 | /* Set maximum timeout */ |
2378 | - OMAP_MMC_WRITE(host, CTO, 0xff); |
2379 | + OMAP_MMC_WRITE(host, CTO, 0xfd); |
2380 | } |
2381 | |
2382 | static inline void set_data_timeout(struct mmc_omap_host *host, struct mmc_request *req) |
2383 | diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c |
2384 | index c078c791f481..dabe89968a78 100644 |
2385 | --- a/drivers/net/dsa/mv88e6xxx/chip.c |
2386 | +++ b/drivers/net/dsa/mv88e6xxx/chip.c |
2387 | @@ -442,12 +442,20 @@ out_mapping: |
2388 | |
2389 | static int mv88e6xxx_g1_irq_setup(struct mv88e6xxx_chip *chip) |
2390 | { |
2391 | + static struct lock_class_key lock_key; |
2392 | + static struct lock_class_key request_key; |
2393 | int err; |
2394 | |
2395 | err = mv88e6xxx_g1_irq_setup_common(chip); |
2396 | if (err) |
2397 | return err; |
2398 | |
2399 | + /* These lock classes tells lockdep that global 1 irqs are in |
2400 | + * a different category than their parent GPIO, so it won't |
2401 | + * report false recursion. |
2402 | + */ |
2403 | + irq_set_lockdep_class(chip->irq, &lock_key, &request_key); |
2404 | + |
2405 | err = request_threaded_irq(chip->irq, NULL, |
2406 | mv88e6xxx_g1_irq_thread_fn, |
2407 | IRQF_ONESHOT, |
2408 | diff --git a/drivers/net/ethernet/cisco/enic/enic_main.c b/drivers/net/ethernet/cisco/enic/enic_main.c |
2409 | index 9a7f70db20c7..733d9172425b 100644 |
2410 | --- a/drivers/net/ethernet/cisco/enic/enic_main.c |
2411 | +++ b/drivers/net/ethernet/cisco/enic/enic_main.c |
2412 | @@ -119,7 +119,7 @@ static void enic_init_affinity_hint(struct enic *enic) |
2413 | |
2414 | for (i = 0; i < enic->intr_count; i++) { |
2415 | if (enic_is_err_intr(enic, i) || enic_is_notify_intr(enic, i) || |
2416 | - (enic->msix[i].affinity_mask && |
2417 | + (cpumask_available(enic->msix[i].affinity_mask) && |
2418 | !cpumask_empty(enic->msix[i].affinity_mask))) |
2419 | continue; |
2420 | if (zalloc_cpumask_var(&enic->msix[i].affinity_mask, |
2421 | @@ -148,7 +148,7 @@ static void enic_set_affinity_hint(struct enic *enic) |
2422 | for (i = 0; i < enic->intr_count; i++) { |
2423 | if (enic_is_err_intr(enic, i) || |
2424 | enic_is_notify_intr(enic, i) || |
2425 | - !enic->msix[i].affinity_mask || |
2426 | + !cpumask_available(enic->msix[i].affinity_mask) || |
2427 | cpumask_empty(enic->msix[i].affinity_mask)) |
2428 | continue; |
2429 | err = irq_set_affinity_hint(enic->msix_entry[i].vector, |
2430 | @@ -161,7 +161,7 @@ static void enic_set_affinity_hint(struct enic *enic) |
2431 | for (i = 0; i < enic->wq_count; i++) { |
2432 | int wq_intr = enic_msix_wq_intr(enic, i); |
2433 | |
2434 | - if (enic->msix[wq_intr].affinity_mask && |
2435 | + if (cpumask_available(enic->msix[wq_intr].affinity_mask) && |
2436 | !cpumask_empty(enic->msix[wq_intr].affinity_mask)) |
2437 | netif_set_xps_queue(enic->netdev, |
2438 | enic->msix[wq_intr].affinity_mask, |
2439 | diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c |
2440 | index 3ba0c90e7055..8b11682ebba2 100644 |
2441 | --- a/drivers/net/ethernet/intel/e1000e/netdev.c |
2442 | +++ b/drivers/net/ethernet/intel/e1000e/netdev.c |
2443 | @@ -2106,7 +2106,7 @@ static int e1000_request_msix(struct e1000_adapter *adapter) |
2444 | if (strlen(netdev->name) < (IFNAMSIZ - 5)) |
2445 | snprintf(adapter->rx_ring->name, |
2446 | sizeof(adapter->rx_ring->name) - 1, |
2447 | - "%s-rx-0", netdev->name); |
2448 | + "%.14s-rx-0", netdev->name); |
2449 | else |
2450 | memcpy(adapter->rx_ring->name, netdev->name, IFNAMSIZ); |
2451 | err = request_irq(adapter->msix_entries[vector].vector, |
2452 | @@ -2122,7 +2122,7 @@ static int e1000_request_msix(struct e1000_adapter *adapter) |
2453 | if (strlen(netdev->name) < (IFNAMSIZ - 5)) |
2454 | snprintf(adapter->tx_ring->name, |
2455 | sizeof(adapter->tx_ring->name) - 1, |
2456 | - "%s-tx-0", netdev->name); |
2457 | + "%.14s-tx-0", netdev->name); |
2458 | else |
2459 | memcpy(adapter->tx_ring->name, netdev->name, IFNAMSIZ); |
2460 | err = request_irq(adapter->msix_entries[vector].vector, |
2461 | @@ -5286,8 +5286,13 @@ static void e1000_watchdog_task(struct work_struct *work) |
2462 | /* 8000ES2LAN requires a Rx packet buffer work-around |
2463 | * on link down event; reset the controller to flush |
2464 | * the Rx packet buffer. |
2465 | + * |
2466 | + * If the link is lost the controller stops DMA, but |
2467 | + * if there is queued Tx work it cannot be done. So |
2468 | + * reset the controller to flush the Tx packet buffers. |
2469 | */ |
2470 | - if (adapter->flags & FLAG_RX_NEEDS_RESTART) |
2471 | + if ((adapter->flags & FLAG_RX_NEEDS_RESTART) || |
2472 | + e1000_desc_unused(tx_ring) + 1 < tx_ring->count) |
2473 | adapter->flags |= FLAG_RESTART_NOW; |
2474 | else |
2475 | pm_schedule_suspend(netdev->dev.parent, |
2476 | @@ -5310,14 +5315,6 @@ link_up: |
2477 | adapter->gotc_old = adapter->stats.gotc; |
2478 | spin_unlock(&adapter->stats64_lock); |
2479 | |
2480 | - /* If the link is lost the controller stops DMA, but |
2481 | - * if there is queued Tx work it cannot be done. So |
2482 | - * reset the controller to flush the Tx packet buffers. |
2483 | - */ |
2484 | - if (!netif_carrier_ok(netdev) && |
2485 | - (e1000_desc_unused(tx_ring) + 1 < tx_ring->count)) |
2486 | - adapter->flags |= FLAG_RESTART_NOW; |
2487 | - |
2488 | /* If reset is necessary, do it outside of interrupt context. */ |
2489 | if (adapter->flags & FLAG_RESTART_NOW) { |
2490 | schedule_work(&adapter->reset_task); |
2491 | @@ -7330,6 +7327,8 @@ static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent) |
2492 | |
2493 | e1000_print_device_info(adapter); |
2494 | |
2495 | + dev_pm_set_driver_flags(&pdev->dev, DPM_FLAG_NEVER_SKIP); |
2496 | + |
2497 | if (pci_dev_run_wake(pdev)) |
2498 | pm_runtime_put_noidle(&pdev->dev); |
2499 | |
2500 | diff --git a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c |
2501 | index f8e4808a8317..9988c89ed9fd 100644 |
2502 | --- a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c |
2503 | +++ b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c |
2504 | @@ -1372,13 +1372,9 @@ static void mvpp2_port_reset(struct mvpp2_port *port) |
2505 | for (i = 0; i < ARRAY_SIZE(mvpp2_ethtool_regs); i++) |
2506 | mvpp2_read_count(port, &mvpp2_ethtool_regs[i]); |
2507 | |
2508 | - val = readl(port->base + MVPP2_GMAC_CTRL_2_REG) & |
2509 | - ~MVPP2_GMAC_PORT_RESET_MASK; |
2510 | + val = readl(port->base + MVPP2_GMAC_CTRL_2_REG) | |
2511 | + MVPP2_GMAC_PORT_RESET_MASK; |
2512 | writel(val, port->base + MVPP2_GMAC_CTRL_2_REG); |
2513 | - |
2514 | - while (readl(port->base + MVPP2_GMAC_CTRL_2_REG) & |
2515 | - MVPP2_GMAC_PORT_RESET_MASK) |
2516 | - continue; |
2517 | } |
2518 | |
2519 | /* Change maximum receive size of the port */ |
2520 | @@ -4445,12 +4441,15 @@ static void mvpp2_gmac_config(struct mvpp2_port *port, unsigned int mode, |
2521 | const struct phylink_link_state *state) |
2522 | { |
2523 | u32 an, ctrl0, ctrl2, ctrl4; |
2524 | + u32 old_ctrl2; |
2525 | |
2526 | an = readl(port->base + MVPP2_GMAC_AUTONEG_CONFIG); |
2527 | ctrl0 = readl(port->base + MVPP2_GMAC_CTRL_0_REG); |
2528 | ctrl2 = readl(port->base + MVPP2_GMAC_CTRL_2_REG); |
2529 | ctrl4 = readl(port->base + MVPP22_GMAC_CTRL_4_REG); |
2530 | |
2531 | + old_ctrl2 = ctrl2; |
2532 | + |
2533 | /* Force link down */ |
2534 | an &= ~MVPP2_GMAC_FORCE_LINK_PASS; |
2535 | an |= MVPP2_GMAC_FORCE_LINK_DOWN; |
2536 | @@ -4523,6 +4522,12 @@ static void mvpp2_gmac_config(struct mvpp2_port *port, unsigned int mode, |
2537 | writel(ctrl2, port->base + MVPP2_GMAC_CTRL_2_REG); |
2538 | writel(ctrl4, port->base + MVPP22_GMAC_CTRL_4_REG); |
2539 | writel(an, port->base + MVPP2_GMAC_AUTONEG_CONFIG); |
2540 | + |
2541 | + if (old_ctrl2 & MVPP2_GMAC_PORT_RESET_MASK) { |
2542 | + while (readl(port->base + MVPP2_GMAC_CTRL_2_REG) & |
2543 | + MVPP2_GMAC_PORT_RESET_MASK) |
2544 | + continue; |
2545 | + } |
2546 | } |
2547 | |
2548 | static void mvpp2_mac_config(struct net_device *dev, unsigned int mode, |
2549 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c |
2550 | index d6706475a3ba..26c9f9421901 100644 |
2551 | --- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c |
2552 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c |
2553 | @@ -1797,7 +1797,7 @@ int mlx5_eswitch_set_vport_mac(struct mlx5_eswitch *esw, |
2554 | u64 node_guid; |
2555 | int err = 0; |
2556 | |
2557 | - if (!MLX5_CAP_GEN(esw->dev, vport_group_manager)) |
2558 | + if (!esw || !MLX5_CAP_GEN(esw->dev, vport_group_manager)) |
2559 | return -EPERM; |
2560 | if (!LEGAL_VPORT(esw, vport) || is_multicast_ether_addr(mac)) |
2561 | return -EINVAL; |
2562 | @@ -1871,7 +1871,7 @@ int mlx5_eswitch_get_vport_config(struct mlx5_eswitch *esw, |
2563 | { |
2564 | struct mlx5_vport *evport; |
2565 | |
2566 | - if (!MLX5_CAP_GEN(esw->dev, vport_group_manager)) |
2567 | + if (!esw || !MLX5_CAP_GEN(esw->dev, vport_group_manager)) |
2568 | return -EPERM; |
2569 | if (!LEGAL_VPORT(esw, vport)) |
2570 | return -EINVAL; |
2571 | @@ -2044,19 +2044,24 @@ static int normalize_vports_min_rate(struct mlx5_eswitch *esw, u32 divider) |
2572 | int mlx5_eswitch_set_vport_rate(struct mlx5_eswitch *esw, int vport, |
2573 | u32 max_rate, u32 min_rate) |
2574 | { |
2575 | - u32 fw_max_bw_share = MLX5_CAP_QOS(esw->dev, max_tsar_bw_share); |
2576 | - bool min_rate_supported = MLX5_CAP_QOS(esw->dev, esw_bw_share) && |
2577 | - fw_max_bw_share >= MLX5_MIN_BW_SHARE; |
2578 | - bool max_rate_supported = MLX5_CAP_QOS(esw->dev, esw_rate_limit); |
2579 | struct mlx5_vport *evport; |
2580 | + u32 fw_max_bw_share; |
2581 | u32 previous_min_rate; |
2582 | u32 divider; |
2583 | + bool min_rate_supported; |
2584 | + bool max_rate_supported; |
2585 | int err = 0; |
2586 | |
2587 | if (!ESW_ALLOWED(esw)) |
2588 | return -EPERM; |
2589 | if (!LEGAL_VPORT(esw, vport)) |
2590 | return -EINVAL; |
2591 | + |
2592 | + fw_max_bw_share = MLX5_CAP_QOS(esw->dev, max_tsar_bw_share); |
2593 | + min_rate_supported = MLX5_CAP_QOS(esw->dev, esw_bw_share) && |
2594 | + fw_max_bw_share >= MLX5_MIN_BW_SHARE; |
2595 | + max_rate_supported = MLX5_CAP_QOS(esw->dev, esw_rate_limit); |
2596 | + |
2597 | if ((min_rate && !min_rate_supported) || (max_rate && !max_rate_supported)) |
2598 | return -EOPNOTSUPP; |
2599 | |
2600 | diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c |
2601 | index a12b5710891e..f9bef030ee05 100644 |
2602 | --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c |
2603 | +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c |
2604 | @@ -1988,7 +1988,7 @@ static void mlxsw_sp_port_get_prio_strings(u8 **p, int prio) |
2605 | int i; |
2606 | |
2607 | for (i = 0; i < MLXSW_SP_PORT_HW_PRIO_STATS_LEN; i++) { |
2608 | - snprintf(*p, ETH_GSTRING_LEN, "%s_%d", |
2609 | + snprintf(*p, ETH_GSTRING_LEN, "%.29s_%.1d", |
2610 | mlxsw_sp_port_hw_prio_stats[i].str, prio); |
2611 | *p += ETH_GSTRING_LEN; |
2612 | } |
2613 | @@ -1999,7 +1999,7 @@ static void mlxsw_sp_port_get_tc_strings(u8 **p, int tc) |
2614 | int i; |
2615 | |
2616 | for (i = 0; i < MLXSW_SP_PORT_HW_TC_STATS_LEN; i++) { |
2617 | - snprintf(*p, ETH_GSTRING_LEN, "%s_%d", |
2618 | + snprintf(*p, ETH_GSTRING_LEN, "%.29s_%.1d", |
2619 | mlxsw_sp_port_hw_tc_stats[i].str, tc); |
2620 | *p += ETH_GSTRING_LEN; |
2621 | } |
2622 | diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c |
2623 | index 43ab9e905bed..886176be818e 100644 |
2624 | --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c |
2625 | +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c |
2626 | @@ -474,7 +474,7 @@ static void stmmac_get_tx_hwtstamp(struct stmmac_priv *priv, |
2627 | struct dma_desc *p, struct sk_buff *skb) |
2628 | { |
2629 | struct skb_shared_hwtstamps shhwtstamp; |
2630 | - u64 ns; |
2631 | + u64 ns = 0; |
2632 | |
2633 | if (!priv->hwts_tx_en) |
2634 | return; |
2635 | @@ -513,7 +513,7 @@ static void stmmac_get_rx_hwtstamp(struct stmmac_priv *priv, struct dma_desc *p, |
2636 | { |
2637 | struct skb_shared_hwtstamps *shhwtstamp = NULL; |
2638 | struct dma_desc *desc = p; |
2639 | - u64 ns; |
2640 | + u64 ns = 0; |
2641 | |
2642 | if (!priv->hwts_rx_en) |
2643 | return; |
2644 | @@ -558,8 +558,8 @@ static int stmmac_hwtstamp_ioctl(struct net_device *dev, struct ifreq *ifr) |
2645 | u32 snap_type_sel = 0; |
2646 | u32 ts_master_en = 0; |
2647 | u32 ts_event_en = 0; |
2648 | + u32 sec_inc = 0; |
2649 | u32 value = 0; |
2650 | - u32 sec_inc; |
2651 | bool xmac; |
2652 | |
2653 | xmac = priv->plat->has_gmac4 || priv->plat->has_xgmac; |
2654 | diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c |
2655 | index 2293e21f789f..cc60b3fb0892 100644 |
2656 | --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c |
2657 | +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c |
2658 | @@ -105,7 +105,7 @@ static int stmmac_get_time(struct ptp_clock_info *ptp, struct timespec64 *ts) |
2659 | struct stmmac_priv *priv = |
2660 | container_of(ptp, struct stmmac_priv, ptp_clock_ops); |
2661 | unsigned long flags; |
2662 | - u64 ns; |
2663 | + u64 ns = 0; |
2664 | |
2665 | spin_lock_irqsave(&priv->ptp_lock, flags); |
2666 | stmmac_get_systime(priv, priv->ptpaddr, &ns); |
2667 | diff --git a/drivers/net/phy/phy-c45.c b/drivers/net/phy/phy-c45.c |
2668 | index e1225545362d..0ba3607585bd 100644 |
2669 | --- a/drivers/net/phy/phy-c45.c |
2670 | +++ b/drivers/net/phy/phy-c45.c |
2671 | @@ -147,9 +147,15 @@ int genphy_c45_read_link(struct phy_device *phydev, u32 mmd_mask) |
2672 | mmd_mask &= ~BIT(devad); |
2673 | |
2674 | /* The link state is latched low so that momentary link |
2675 | - * drops can be detected. Do not double-read the status |
2676 | - * register if the link is down. |
2677 | + * drops can be detected. Do not double-read the status |
2678 | + * in polling mode to detect such short link drops. |
2679 | */ |
2680 | + if (!phy_polling_mode(phydev)) { |
2681 | + val = phy_read_mmd(phydev, devad, MDIO_STAT1); |
2682 | + if (val < 0) |
2683 | + return val; |
2684 | + } |
2685 | + |
2686 | val = phy_read_mmd(phydev, devad, MDIO_STAT1); |
2687 | if (val < 0) |
2688 | return val; |
2689 | diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c |
2690 | index 2c32c795f5dd..8a96d985a52f 100644 |
2691 | --- a/drivers/net/phy/phy_device.c |
2692 | +++ b/drivers/net/phy/phy_device.c |
2693 | @@ -1503,10 +1503,15 @@ int genphy_update_link(struct phy_device *phydev) |
2694 | { |
2695 | int status; |
2696 | |
2697 | - /* Do a fake read */ |
2698 | - status = phy_read(phydev, MII_BMSR); |
2699 | - if (status < 0) |
2700 | - return status; |
2701 | + /* The link state is latched low so that momentary link |
2702 | + * drops can be detected. Do not double-read the status |
2703 | + * in polling mode to detect such short link drops. |
2704 | + */ |
2705 | + if (!phy_polling_mode(phydev)) { |
2706 | + status = phy_read(phydev, MII_BMSR); |
2707 | + if (status < 0) |
2708 | + return status; |
2709 | + } |
2710 | |
2711 | /* Read link and autonegotiation status */ |
2712 | status = phy_read(phydev, MII_BMSR); |
2713 | diff --git a/drivers/net/wireless/ath/ath10k/ce.c b/drivers/net/wireless/ath/ath10k/ce.c |
2714 | index 18c709c484e7..f761d651c16e 100644 |
2715 | --- a/drivers/net/wireless/ath/ath10k/ce.c |
2716 | +++ b/drivers/net/wireless/ath/ath10k/ce.c |
2717 | @@ -500,14 +500,8 @@ static int _ath10k_ce_send_nolock(struct ath10k_ce_pipe *ce_state, |
2718 | write_index = CE_RING_IDX_INCR(nentries_mask, write_index); |
2719 | |
2720 | /* WORKAROUND */ |
2721 | - if (!(flags & CE_SEND_FLAG_GATHER)) { |
2722 | - if (ar->hw_params.shadow_reg_support) |
2723 | - ath10k_ce_shadow_src_ring_write_index_set(ar, ce_state, |
2724 | - write_index); |
2725 | - else |
2726 | - ath10k_ce_src_ring_write_index_set(ar, ctrl_addr, |
2727 | - write_index); |
2728 | - } |
2729 | + if (!(flags & CE_SEND_FLAG_GATHER)) |
2730 | + ath10k_ce_src_ring_write_index_set(ar, ctrl_addr, write_index); |
2731 | |
2732 | src_ring->write_index = write_index; |
2733 | exit: |
2734 | @@ -581,8 +575,14 @@ static int _ath10k_ce_send_nolock_64(struct ath10k_ce_pipe *ce_state, |
2735 | /* Update Source Ring Write Index */ |
2736 | write_index = CE_RING_IDX_INCR(nentries_mask, write_index); |
2737 | |
2738 | - if (!(flags & CE_SEND_FLAG_GATHER)) |
2739 | - ath10k_ce_src_ring_write_index_set(ar, ctrl_addr, write_index); |
2740 | + if (!(flags & CE_SEND_FLAG_GATHER)) { |
2741 | + if (ar->hw_params.shadow_reg_support) |
2742 | + ath10k_ce_shadow_src_ring_write_index_set(ar, ce_state, |
2743 | + write_index); |
2744 | + else |
2745 | + ath10k_ce_src_ring_write_index_set(ar, ctrl_addr, |
2746 | + write_index); |
2747 | + } |
2748 | |
2749 | src_ring->write_index = write_index; |
2750 | exit: |
2751 | @@ -1394,12 +1394,12 @@ static int ath10k_ce_alloc_shadow_base(struct ath10k *ar, |
2752 | u32 nentries) |
2753 | { |
2754 | src_ring->shadow_base_unaligned = kcalloc(nentries, |
2755 | - sizeof(struct ce_desc), |
2756 | + sizeof(struct ce_desc_64), |
2757 | GFP_KERNEL); |
2758 | if (!src_ring->shadow_base_unaligned) |
2759 | return -ENOMEM; |
2760 | |
2761 | - src_ring->shadow_base = (struct ce_desc *) |
2762 | + src_ring->shadow_base = (struct ce_desc_64 *) |
2763 | PTR_ALIGN(src_ring->shadow_base_unaligned, |
2764 | CE_DESC_RING_ALIGN); |
2765 | return 0; |
2766 | @@ -1453,7 +1453,7 @@ ath10k_ce_alloc_src_ring(struct ath10k *ar, unsigned int ce_id, |
2767 | ret = ath10k_ce_alloc_shadow_base(ar, src_ring, nentries); |
2768 | if (ret) { |
2769 | dma_free_coherent(ar->dev, |
2770 | - (nentries * sizeof(struct ce_desc) + |
2771 | + (nentries * sizeof(struct ce_desc_64) + |
2772 | CE_DESC_RING_ALIGN), |
2773 | src_ring->base_addr_owner_space_unaligned, |
2774 | base_addr); |
2775 | diff --git a/drivers/net/wireless/ath/ath10k/ce.h b/drivers/net/wireless/ath/ath10k/ce.h |
2776 | index b8fb5382dede..8088f7a66426 100644 |
2777 | --- a/drivers/net/wireless/ath/ath10k/ce.h |
2778 | +++ b/drivers/net/wireless/ath/ath10k/ce.h |
2779 | @@ -118,7 +118,7 @@ struct ath10k_ce_ring { |
2780 | u32 base_addr_ce_space; |
2781 | |
2782 | char *shadow_base_unaligned; |
2783 | - struct ce_desc *shadow_base; |
2784 | + struct ce_desc_64 *shadow_base; |
2785 | |
2786 | /* keep last */ |
2787 | void *per_transfer_context[0]; |
2788 | diff --git a/drivers/net/wireless/ath/wil6210/cfg80211.c b/drivers/net/wireless/ath/wil6210/cfg80211.c |
2789 | index f79c337105cb..2daf33342b23 100644 |
2790 | --- a/drivers/net/wireless/ath/wil6210/cfg80211.c |
2791 | +++ b/drivers/net/wireless/ath/wil6210/cfg80211.c |
2792 | @@ -1420,6 +1420,12 @@ static int _wil_cfg80211_merge_extra_ies(const u8 *ies1, u16 ies1_len, |
2793 | u8 *buf, *dpos; |
2794 | const u8 *spos; |
2795 | |
2796 | + if (!ies1) |
2797 | + ies1_len = 0; |
2798 | + |
2799 | + if (!ies2) |
2800 | + ies2_len = 0; |
2801 | + |
2802 | if (ies1_len == 0 && ies2_len == 0) { |
2803 | *merged_ies = NULL; |
2804 | *merged_len = 0; |
2805 | @@ -1429,17 +1435,19 @@ static int _wil_cfg80211_merge_extra_ies(const u8 *ies1, u16 ies1_len, |
2806 | buf = kmalloc(ies1_len + ies2_len, GFP_KERNEL); |
2807 | if (!buf) |
2808 | return -ENOMEM; |
2809 | - memcpy(buf, ies1, ies1_len); |
2810 | + if (ies1) |
2811 | + memcpy(buf, ies1, ies1_len); |
2812 | dpos = buf + ies1_len; |
2813 | spos = ies2; |
2814 | - while (spos + 1 < ies2 + ies2_len) { |
2815 | + while (spos && (spos + 1 < ies2 + ies2_len)) { |
2816 | /* IE tag at offset 0, length at offset 1 */ |
2817 | u16 ielen = 2 + spos[1]; |
2818 | |
2819 | if (spos + ielen > ies2 + ies2_len) |
2820 | break; |
2821 | if (spos[0] == WLAN_EID_VENDOR_SPECIFIC && |
2822 | - !_wil_cfg80211_find_ie(ies1, ies1_len, spos, ielen)) { |
2823 | + (!ies1 || !_wil_cfg80211_find_ie(ies1, ies1_len, |
2824 | + spos, ielen))) { |
2825 | memcpy(dpos, spos, ielen); |
2826 | dpos += ielen; |
2827 | } |
2828 | diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c |
2829 | index cd3651069d0c..27893af63ebc 100644 |
2830 | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c |
2831 | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c |
2832 | @@ -149,7 +149,7 @@ static int brcmf_c_process_clm_blob(struct brcmf_if *ifp) |
2833 | return err; |
2834 | } |
2835 | |
2836 | - err = request_firmware(&clm, clm_name, bus->dev); |
2837 | + err = firmware_request_nowarn(&clm, clm_name, bus->dev); |
2838 | if (err) { |
2839 | brcmf_info("no clm_blob available (err=%d), device may have limited channels available\n", |
2840 | err); |
2841 | diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/fw.c b/drivers/net/wireless/intel/iwlwifi/mvm/fw.c |
2842 | index 16c6c7f921a8..8b7d70e3a379 100644 |
2843 | --- a/drivers/net/wireless/intel/iwlwifi/mvm/fw.c |
2844 | +++ b/drivers/net/wireless/intel/iwlwifi/mvm/fw.c |
2845 | @@ -132,13 +132,17 @@ static int iwl_send_rss_cfg_cmd(struct iwl_mvm *mvm) |
2846 | |
2847 | static int iwl_configure_rxq(struct iwl_mvm *mvm) |
2848 | { |
2849 | - int i, num_queues, size; |
2850 | + int i, num_queues, size, ret; |
2851 | struct iwl_rfh_queue_config *cmd; |
2852 | + struct iwl_host_cmd hcmd = { |
2853 | + .id = WIDE_ID(DATA_PATH_GROUP, RFH_QUEUE_CONFIG_CMD), |
2854 | + .dataflags[0] = IWL_HCMD_DFL_NOCOPY, |
2855 | + }; |
2856 | |
2857 | /* Do not configure default queue, it is configured via context info */ |
2858 | num_queues = mvm->trans->num_rx_queues - 1; |
2859 | |
2860 | - size = sizeof(*cmd) + num_queues * sizeof(struct iwl_rfh_queue_data); |
2861 | + size = struct_size(cmd, data, num_queues); |
2862 | |
2863 | cmd = kzalloc(size, GFP_KERNEL); |
2864 | if (!cmd) |
2865 | @@ -159,10 +163,14 @@ static int iwl_configure_rxq(struct iwl_mvm *mvm) |
2866 | cmd->data[i].fr_bd_wid = cpu_to_le32(data.fr_bd_wid); |
2867 | } |
2868 | |
2869 | - return iwl_mvm_send_cmd_pdu(mvm, |
2870 | - WIDE_ID(DATA_PATH_GROUP, |
2871 | - RFH_QUEUE_CONFIG_CMD), |
2872 | - 0, size, cmd); |
2873 | + hcmd.data[0] = cmd; |
2874 | + hcmd.len[0] = size; |
2875 | + |
2876 | + ret = iwl_mvm_send_cmd(mvm, &hcmd); |
2877 | + |
2878 | + kfree(cmd); |
2879 | + |
2880 | + return ret; |
2881 | } |
2882 | |
2883 | static int iwl_mvm_send_dqa_cmd(struct iwl_mvm *mvm) |
2884 | diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/rx.c b/drivers/net/wireless/intel/iwlwifi/pcie/rx.c |
2885 | index d4a31e014c82..b2905f01b7df 100644 |
2886 | --- a/drivers/net/wireless/intel/iwlwifi/pcie/rx.c |
2887 | +++ b/drivers/net/wireless/intel/iwlwifi/pcie/rx.c |
2888 | @@ -502,7 +502,7 @@ static void iwl_pcie_rx_allocator(struct iwl_trans *trans) |
2889 | struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); |
2890 | struct iwl_rb_allocator *rba = &trans_pcie->rba; |
2891 | struct list_head local_empty; |
2892 | - int pending = atomic_xchg(&rba->req_pending, 0); |
2893 | + int pending = atomic_read(&rba->req_pending); |
2894 | |
2895 | IWL_DEBUG_RX(trans, "Pending allocation requests = %d\n", pending); |
2896 | |
2897 | @@ -557,11 +557,13 @@ static void iwl_pcie_rx_allocator(struct iwl_trans *trans) |
2898 | i++; |
2899 | } |
2900 | |
2901 | + atomic_dec(&rba->req_pending); |
2902 | pending--; |
2903 | + |
2904 | if (!pending) { |
2905 | - pending = atomic_xchg(&rba->req_pending, 0); |
2906 | + pending = atomic_read(&rba->req_pending); |
2907 | IWL_DEBUG_RX(trans, |
2908 | - "Pending allocation requests = %d\n", |
2909 | + "Got more pending allocation requests = %d\n", |
2910 | pending); |
2911 | } |
2912 | |
2913 | @@ -573,12 +575,15 @@ static void iwl_pcie_rx_allocator(struct iwl_trans *trans) |
2914 | spin_unlock(&rba->lock); |
2915 | |
2916 | atomic_inc(&rba->req_ready); |
2917 | + |
2918 | } |
2919 | |
2920 | spin_lock(&rba->lock); |
2921 | /* return unused rbds to the allocator empty list */ |
2922 | list_splice_tail(&local_empty, &rba->rbd_empty); |
2923 | spin_unlock(&rba->lock); |
2924 | + |
2925 | + IWL_DEBUG_RX(trans, "%s, exit.\n", __func__); |
2926 | } |
2927 | |
2928 | /* |
2929 | diff --git a/drivers/net/wireless/marvell/mwifiex/cfg80211.c b/drivers/net/wireless/marvell/mwifiex/cfg80211.c |
2930 | index adc88433faa8..2d87ebbfa4da 100644 |
2931 | --- a/drivers/net/wireless/marvell/mwifiex/cfg80211.c |
2932 | +++ b/drivers/net/wireless/marvell/mwifiex/cfg80211.c |
2933 | @@ -4282,11 +4282,13 @@ int mwifiex_register_cfg80211(struct mwifiex_adapter *adapter) |
2934 | wiphy->mgmt_stypes = mwifiex_mgmt_stypes; |
2935 | wiphy->max_remain_on_channel_duration = 5000; |
2936 | wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) | |
2937 | - BIT(NL80211_IFTYPE_ADHOC) | |
2938 | BIT(NL80211_IFTYPE_P2P_CLIENT) | |
2939 | BIT(NL80211_IFTYPE_P2P_GO) | |
2940 | BIT(NL80211_IFTYPE_AP); |
2941 | |
2942 | + if (ISSUPP_ADHOC_ENABLED(adapter->fw_cap_info)) |
2943 | + wiphy->interface_modes |= BIT(NL80211_IFTYPE_ADHOC); |
2944 | + |
2945 | wiphy->bands[NL80211_BAND_2GHZ] = &mwifiex_band_2ghz; |
2946 | if (adapter->config_bands & BAND_A) |
2947 | wiphy->bands[NL80211_BAND_5GHZ] = &mwifiex_band_5ghz; |
2948 | @@ -4346,11 +4348,13 @@ int mwifiex_register_cfg80211(struct mwifiex_adapter *adapter) |
2949 | wiphy->available_antennas_tx = BIT(adapter->number_of_antenna) - 1; |
2950 | wiphy->available_antennas_rx = BIT(adapter->number_of_antenna) - 1; |
2951 | |
2952 | - wiphy->features |= NL80211_FEATURE_HT_IBSS | |
2953 | - NL80211_FEATURE_INACTIVITY_TIMER | |
2954 | + wiphy->features |= NL80211_FEATURE_INACTIVITY_TIMER | |
2955 | NL80211_FEATURE_LOW_PRIORITY_SCAN | |
2956 | NL80211_FEATURE_NEED_OBSS_SCAN; |
2957 | |
2958 | + if (ISSUPP_ADHOC_ENABLED(adapter->fw_cap_info)) |
2959 | + wiphy->features |= NL80211_FEATURE_HT_IBSS; |
2960 | + |
2961 | if (ISSUPP_RANDOM_MAC(adapter->fw_cap_info)) |
2962 | wiphy->features |= NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR | |
2963 | NL80211_FEATURE_SCHED_SCAN_RANDOM_MAC_ADDR | |
2964 | diff --git a/drivers/net/wireless/mediatek/mt76/eeprom.c b/drivers/net/wireless/mediatek/mt76/eeprom.c |
2965 | index 530e5593765c..a1529920d877 100644 |
2966 | --- a/drivers/net/wireless/mediatek/mt76/eeprom.c |
2967 | +++ b/drivers/net/wireless/mediatek/mt76/eeprom.c |
2968 | @@ -54,22 +54,30 @@ mt76_get_of_eeprom(struct mt76_dev *dev, int len) |
2969 | part = np->name; |
2970 | |
2971 | mtd = get_mtd_device_nm(part); |
2972 | - if (IS_ERR(mtd)) |
2973 | - return PTR_ERR(mtd); |
2974 | + if (IS_ERR(mtd)) { |
2975 | + ret = PTR_ERR(mtd); |
2976 | + goto out_put_node; |
2977 | + } |
2978 | |
2979 | - if (size <= sizeof(*list)) |
2980 | - return -EINVAL; |
2981 | + if (size <= sizeof(*list)) { |
2982 | + ret = -EINVAL; |
2983 | + goto out_put_node; |
2984 | + } |
2985 | |
2986 | offset = be32_to_cpup(list); |
2987 | ret = mtd_read(mtd, offset, len, &retlen, dev->eeprom.data); |
2988 | put_mtd_device(mtd); |
2989 | if (ret) |
2990 | - return ret; |
2991 | + goto out_put_node; |
2992 | |
2993 | - if (retlen < len) |
2994 | - return -EINVAL; |
2995 | + if (retlen < len) { |
2996 | + ret = -EINVAL; |
2997 | + goto out_put_node; |
2998 | + } |
2999 | |
3000 | - return 0; |
3001 | +out_put_node: |
3002 | + of_node_put(np); |
3003 | + return ret; |
3004 | #else |
3005 | return -ENOENT; |
3006 | #endif |
3007 | diff --git a/drivers/net/wireless/mediatek/mt76/usb.c b/drivers/net/wireless/mediatek/mt76/usb.c |
3008 | index 79e59f2379a2..8d40e92fb6f2 100644 |
3009 | --- a/drivers/net/wireless/mediatek/mt76/usb.c |
3010 | +++ b/drivers/net/wireless/mediatek/mt76/usb.c |
3011 | @@ -796,16 +796,9 @@ int mt76u_alloc_queues(struct mt76_dev *dev) |
3012 | |
3013 | err = mt76u_alloc_rx(dev); |
3014 | if (err < 0) |
3015 | - goto err; |
3016 | - |
3017 | - err = mt76u_alloc_tx(dev); |
3018 | - if (err < 0) |
3019 | - goto err; |
3020 | + return err; |
3021 | |
3022 | - return 0; |
3023 | -err: |
3024 | - mt76u_queues_deinit(dev); |
3025 | - return err; |
3026 | + return mt76u_alloc_tx(dev); |
3027 | } |
3028 | EXPORT_SYMBOL_GPL(mt76u_alloc_queues); |
3029 | |
3030 | diff --git a/drivers/net/wireless/mediatek/mt7601u/eeprom.h b/drivers/net/wireless/mediatek/mt7601u/eeprom.h |
3031 | index 662d12703b69..57b503ae63f1 100644 |
3032 | --- a/drivers/net/wireless/mediatek/mt7601u/eeprom.h |
3033 | +++ b/drivers/net/wireless/mediatek/mt7601u/eeprom.h |
3034 | @@ -17,7 +17,7 @@ |
3035 | |
3036 | struct mt7601u_dev; |
3037 | |
3038 | -#define MT7601U_EE_MAX_VER 0x0c |
3039 | +#define MT7601U_EE_MAX_VER 0x0d |
3040 | #define MT7601U_EEPROM_SIZE 256 |
3041 | |
3042 | #define MT7601U_DEFAULT_TX_POWER 6 |
3043 | diff --git a/drivers/net/wireless/ti/wlcore/main.c b/drivers/net/wireless/ti/wlcore/main.c |
3044 | index 19e3c5a0b715..2ca5658bbc2a 100644 |
3045 | --- a/drivers/net/wireless/ti/wlcore/main.c |
3046 | +++ b/drivers/net/wireless/ti/wlcore/main.c |
3047 | @@ -1084,8 +1084,11 @@ static int wl12xx_chip_wakeup(struct wl1271 *wl, bool plt) |
3048 | goto out; |
3049 | |
3050 | ret = wl12xx_fetch_firmware(wl, plt); |
3051 | - if (ret < 0) |
3052 | - goto out; |
3053 | + if (ret < 0) { |
3054 | + kfree(wl->fw_status); |
3055 | + kfree(wl->raw_fw_status); |
3056 | + kfree(wl->tx_res_if); |
3057 | + } |
3058 | |
3059 | out: |
3060 | return ret; |
3061 | diff --git a/drivers/pci/pcie/pme.c b/drivers/pci/pcie/pme.c |
3062 | index 3ed67676ea2a..e85c5a8206c4 100644 |
3063 | --- a/drivers/pci/pcie/pme.c |
3064 | +++ b/drivers/pci/pcie/pme.c |
3065 | @@ -363,6 +363,16 @@ static bool pcie_pme_check_wakeup(struct pci_bus *bus) |
3066 | return false; |
3067 | } |
3068 | |
3069 | +static void pcie_pme_disable_interrupt(struct pci_dev *port, |
3070 | + struct pcie_pme_service_data *data) |
3071 | +{ |
3072 | + spin_lock_irq(&data->lock); |
3073 | + pcie_pme_interrupt_enable(port, false); |
3074 | + pcie_clear_root_pme_status(port); |
3075 | + data->noirq = true; |
3076 | + spin_unlock_irq(&data->lock); |
3077 | +} |
3078 | + |
3079 | /** |
3080 | * pcie_pme_suspend - Suspend PCIe PME service device. |
3081 | * @srv: PCIe service device to suspend. |
3082 | @@ -387,11 +397,7 @@ static int pcie_pme_suspend(struct pcie_device *srv) |
3083 | return 0; |
3084 | } |
3085 | |
3086 | - spin_lock_irq(&data->lock); |
3087 | - pcie_pme_interrupt_enable(port, false); |
3088 | - pcie_clear_root_pme_status(port); |
3089 | - data->noirq = true; |
3090 | - spin_unlock_irq(&data->lock); |
3091 | + pcie_pme_disable_interrupt(port, data); |
3092 | |
3093 | synchronize_irq(srv->irq); |
3094 | |
3095 | @@ -427,9 +433,11 @@ static int pcie_pme_resume(struct pcie_device *srv) |
3096 | */ |
3097 | static void pcie_pme_remove(struct pcie_device *srv) |
3098 | { |
3099 | - pcie_pme_suspend(srv); |
3100 | + struct pcie_pme_service_data *data = get_service_data(srv); |
3101 | + |
3102 | + pcie_pme_disable_interrupt(srv->port, data); |
3103 | free_irq(srv->irq, srv); |
3104 | - kfree(get_service_data(srv)); |
3105 | + kfree(data); |
3106 | } |
3107 | |
3108 | static struct pcie_port_service_driver pcie_pme_driver = { |
3109 | diff --git a/drivers/perf/arm_spe_pmu.c b/drivers/perf/arm_spe_pmu.c |
3110 | index e1a77b2de78a..3623f6489f49 100644 |
3111 | --- a/drivers/perf/arm_spe_pmu.c |
3112 | +++ b/drivers/perf/arm_spe_pmu.c |
3113 | @@ -824,10 +824,10 @@ static void arm_spe_pmu_read(struct perf_event *event) |
3114 | { |
3115 | } |
3116 | |
3117 | -static void *arm_spe_pmu_setup_aux(int cpu, void **pages, int nr_pages, |
3118 | - bool snapshot) |
3119 | +static void *arm_spe_pmu_setup_aux(struct perf_event *event, void **pages, |
3120 | + int nr_pages, bool snapshot) |
3121 | { |
3122 | - int i; |
3123 | + int i, cpu = event->cpu; |
3124 | struct page **pglist; |
3125 | struct arm_spe_pmu_buf *buf; |
3126 | |
3127 | diff --git a/drivers/pinctrl/meson/pinctrl-meson8b.c b/drivers/pinctrl/meson/pinctrl-meson8b.c |
3128 | index ead4beb5f55f..036124fd363c 100644 |
3129 | --- a/drivers/pinctrl/meson/pinctrl-meson8b.c |
3130 | +++ b/drivers/pinctrl/meson/pinctrl-meson8b.c |
3131 | @@ -346,6 +346,8 @@ static const unsigned int eth_rx_dv_pins[] = { DIF_1_P }; |
3132 | static const unsigned int eth_rx_clk_pins[] = { DIF_1_N }; |
3133 | static const unsigned int eth_txd0_1_pins[] = { DIF_2_P }; |
3134 | static const unsigned int eth_txd1_1_pins[] = { DIF_2_N }; |
3135 | +static const unsigned int eth_rxd3_pins[] = { DIF_2_P }; |
3136 | +static const unsigned int eth_rxd2_pins[] = { DIF_2_N }; |
3137 | static const unsigned int eth_tx_en_pins[] = { DIF_3_P }; |
3138 | static const unsigned int eth_ref_clk_pins[] = { DIF_3_N }; |
3139 | static const unsigned int eth_mdc_pins[] = { DIF_4_P }; |
3140 | @@ -571,6 +573,8 @@ static struct meson_pmx_group meson8b_cbus_groups[] = { |
3141 | GROUP(eth_ref_clk, 6, 8), |
3142 | GROUP(eth_mdc, 6, 9), |
3143 | GROUP(eth_mdio_en, 6, 10), |
3144 | + GROUP(eth_rxd3, 7, 22), |
3145 | + GROUP(eth_rxd2, 7, 23), |
3146 | }; |
3147 | |
3148 | static struct meson_pmx_group meson8b_aobus_groups[] = { |
3149 | @@ -720,7 +724,7 @@ static const char * const ethernet_groups[] = { |
3150 | "eth_tx_clk", "eth_tx_en", "eth_txd1_0", "eth_txd1_1", |
3151 | "eth_txd0_0", "eth_txd0_1", "eth_rx_clk", "eth_rx_dv", |
3152 | "eth_rxd1", "eth_rxd0", "eth_mdio_en", "eth_mdc", "eth_ref_clk", |
3153 | - "eth_txd2", "eth_txd3" |
3154 | + "eth_txd2", "eth_txd3", "eth_rxd3", "eth_rxd2" |
3155 | }; |
3156 | |
3157 | static const char * const i2c_a_groups[] = { |
3158 | diff --git a/drivers/platform/mellanox/mlxreg-hotplug.c b/drivers/platform/mellanox/mlxreg-hotplug.c |
3159 | index b6d44550d98c..eca16d00e310 100644 |
3160 | --- a/drivers/platform/mellanox/mlxreg-hotplug.c |
3161 | +++ b/drivers/platform/mellanox/mlxreg-hotplug.c |
3162 | @@ -248,7 +248,8 @@ mlxreg_hotplug_work_helper(struct mlxreg_hotplug_priv_data *priv, |
3163 | struct mlxreg_core_item *item) |
3164 | { |
3165 | struct mlxreg_core_data *data; |
3166 | - u32 asserted, regval, bit; |
3167 | + unsigned long asserted; |
3168 | + u32 regval, bit; |
3169 | int ret; |
3170 | |
3171 | /* |
3172 | @@ -281,7 +282,7 @@ mlxreg_hotplug_work_helper(struct mlxreg_hotplug_priv_data *priv, |
3173 | asserted = item->cache ^ regval; |
3174 | item->cache = regval; |
3175 | |
3176 | - for_each_set_bit(bit, (unsigned long *)&asserted, 8) { |
3177 | + for_each_set_bit(bit, &asserted, 8) { |
3178 | data = item->data + bit; |
3179 | if (regval & BIT(bit)) { |
3180 | if (item->inversed) |
3181 | diff --git a/drivers/platform/x86/ideapad-laptop.c b/drivers/platform/x86/ideapad-laptop.c |
3182 | index d4f1259ff5a2..62d4b94e2531 100644 |
3183 | --- a/drivers/platform/x86/ideapad-laptop.c |
3184 | +++ b/drivers/platform/x86/ideapad-laptop.c |
3185 | @@ -989,7 +989,7 @@ static const struct dmi_system_id no_hw_rfkill_list[] = { |
3186 | .ident = "Lenovo RESCUER R720-15IKBN", |
3187 | .matches = { |
3188 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), |
3189 | - DMI_MATCH(DMI_BOARD_NAME, "80WW"), |
3190 | + DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo R720-15IKBN"), |
3191 | }, |
3192 | }, |
3193 | { |
3194 | diff --git a/drivers/platform/x86/intel-hid.c b/drivers/platform/x86/intel-hid.c |
3195 | index 6cf9b7fa5bf0..3201a83073b5 100644 |
3196 | --- a/drivers/platform/x86/intel-hid.c |
3197 | +++ b/drivers/platform/x86/intel-hid.c |
3198 | @@ -373,7 +373,7 @@ wakeup: |
3199 | * the 5-button array, but still send notifies with power button |
3200 | * event code to this device object on power button actions. |
3201 | * |
3202 | - * Report the power button press; catch and ignore the button release. |
3203 | + * Report the power button press and release. |
3204 | */ |
3205 | if (!priv->array) { |
3206 | if (event == 0xce) { |
3207 | @@ -382,8 +382,11 @@ wakeup: |
3208 | return; |
3209 | } |
3210 | |
3211 | - if (event == 0xcf) |
3212 | + if (event == 0xcf) { |
3213 | + input_report_key(priv->input_dev, KEY_POWER, 0); |
3214 | + input_sync(priv->input_dev); |
3215 | return; |
3216 | + } |
3217 | } |
3218 | |
3219 | /* 0xC0 is for HID events, other values are for 5 button array */ |
3220 | diff --git a/drivers/platform/x86/intel_pmc_core.c b/drivers/platform/x86/intel_pmc_core.c |
3221 | index 2d272a3e0176..e0dcdb3cc070 100644 |
3222 | --- a/drivers/platform/x86/intel_pmc_core.c |
3223 | +++ b/drivers/platform/x86/intel_pmc_core.c |
3224 | @@ -333,7 +333,8 @@ static int pmc_core_ppfear_sts_show(struct seq_file *s, void *unused) |
3225 | index < PPFEAR_MAX_NUM_ENTRIES; index++, iter++) |
3226 | pf_regs[index] = pmc_core_reg_read_byte(pmcdev, iter); |
3227 | |
3228 | - for (index = 0; map[index].name; index++) |
3229 | + for (index = 0; map[index].name && |
3230 | + index < pmcdev->map->ppfear_buckets * 8; index++) |
3231 | pmc_core_display_map(s, index, pf_regs[index / 8], map); |
3232 | |
3233 | return 0; |
3234 | diff --git a/drivers/platform/x86/intel_pmc_core.h b/drivers/platform/x86/intel_pmc_core.h |
3235 | index 93a7e99e1f8b..3f9711b03cb4 100644 |
3236 | --- a/drivers/platform/x86/intel_pmc_core.h |
3237 | +++ b/drivers/platform/x86/intel_pmc_core.h |
3238 | @@ -39,7 +39,7 @@ |
3239 | #define SPT_PMC_SLP_S0_RES_COUNTER_STEP 0x64 |
3240 | #define PMC_BASE_ADDR_MASK ~(SPT_PMC_MMIO_REG_LEN - 1) |
3241 | #define MTPMC_MASK 0xffff0000 |
3242 | -#define PPFEAR_MAX_NUM_ENTRIES 5 |
3243 | +#define PPFEAR_MAX_NUM_ENTRIES 12 |
3244 | #define SPT_PPFEAR_NUM_ENTRIES 5 |
3245 | #define SPT_PMC_READ_DISABLE_BIT 0x16 |
3246 | #define SPT_PMC_MSG_FULL_STS_BIT 0x18 |
3247 | diff --git a/drivers/regulator/act8865-regulator.c b/drivers/regulator/act8865-regulator.c |
3248 | index 21e20483bd91..e0239cf3f56d 100644 |
3249 | --- a/drivers/regulator/act8865-regulator.c |
3250 | +++ b/drivers/regulator/act8865-regulator.c |
3251 | @@ -131,7 +131,7 @@ |
3252 | * ACT8865 voltage number |
3253 | */ |
3254 | #define ACT8865_VOLTAGE_NUM 64 |
3255 | -#define ACT8600_SUDCDC_VOLTAGE_NUM 255 |
3256 | +#define ACT8600_SUDCDC_VOLTAGE_NUM 256 |
3257 | |
3258 | struct act8865 { |
3259 | struct regmap *regmap; |
3260 | @@ -222,7 +222,8 @@ static const struct regulator_linear_range act8600_sudcdc_voltage_ranges[] = { |
3261 | REGULATOR_LINEAR_RANGE(3000000, 0, 63, 0), |
3262 | REGULATOR_LINEAR_RANGE(3000000, 64, 159, 100000), |
3263 | REGULATOR_LINEAR_RANGE(12600000, 160, 191, 200000), |
3264 | - REGULATOR_LINEAR_RANGE(19000000, 191, 255, 400000), |
3265 | + REGULATOR_LINEAR_RANGE(19000000, 192, 247, 400000), |
3266 | + REGULATOR_LINEAR_RANGE(41400000, 248, 255, 0), |
3267 | }; |
3268 | |
3269 | static struct regulator_ops act8865_ops = { |
3270 | diff --git a/drivers/s390/net/ism_drv.c b/drivers/s390/net/ism_drv.c |
3271 | index 8684bcec8ff4..00cc96341411 100644 |
3272 | --- a/drivers/s390/net/ism_drv.c |
3273 | +++ b/drivers/s390/net/ism_drv.c |
3274 | @@ -141,10 +141,13 @@ static int register_ieq(struct ism_dev *ism) |
3275 | |
3276 | static int unregister_sba(struct ism_dev *ism) |
3277 | { |
3278 | + int ret; |
3279 | + |
3280 | if (!ism->sba) |
3281 | return 0; |
3282 | |
3283 | - if (ism_cmd_simple(ism, ISM_UNREG_SBA)) |
3284 | + ret = ism_cmd_simple(ism, ISM_UNREG_SBA); |
3285 | + if (ret && ret != ISM_ERROR) |
3286 | return -EIO; |
3287 | |
3288 | dma_free_coherent(&ism->pdev->dev, PAGE_SIZE, |
3289 | @@ -158,10 +161,13 @@ static int unregister_sba(struct ism_dev *ism) |
3290 | |
3291 | static int unregister_ieq(struct ism_dev *ism) |
3292 | { |
3293 | + int ret; |
3294 | + |
3295 | if (!ism->ieq) |
3296 | return 0; |
3297 | |
3298 | - if (ism_cmd_simple(ism, ISM_UNREG_IEQ)) |
3299 | + ret = ism_cmd_simple(ism, ISM_UNREG_IEQ); |
3300 | + if (ret && ret != ISM_ERROR) |
3301 | return -EIO; |
3302 | |
3303 | dma_free_coherent(&ism->pdev->dev, PAGE_SIZE, |
3304 | @@ -288,7 +294,7 @@ static int ism_unregister_dmb(struct smcd_dev *smcd, struct smcd_dmb *dmb) |
3305 | cmd.request.dmb_tok = dmb->dmb_tok; |
3306 | |
3307 | ret = ism_cmd(ism, &cmd); |
3308 | - if (ret) |
3309 | + if (ret && ret != ISM_ERROR) |
3310 | goto out; |
3311 | |
3312 | ism_free_dmb(ism, dmb); |
3313 | diff --git a/drivers/scsi/bnx2fc/bnx2fc_fcoe.c b/drivers/scsi/bnx2fc/bnx2fc_fcoe.c |
3314 | index 3f97ec4aac4b..780651c4fc0c 100644 |
3315 | --- a/drivers/scsi/bnx2fc/bnx2fc_fcoe.c |
3316 | +++ b/drivers/scsi/bnx2fc/bnx2fc_fcoe.c |
3317 | @@ -1445,7 +1445,7 @@ bind_err: |
3318 | static struct bnx2fc_interface * |
3319 | bnx2fc_interface_create(struct bnx2fc_hba *hba, |
3320 | struct net_device *netdev, |
3321 | - enum fip_state fip_mode) |
3322 | + enum fip_mode fip_mode) |
3323 | { |
3324 | struct fcoe_ctlr_device *ctlr_dev; |
3325 | struct bnx2fc_interface *interface; |
3326 | diff --git a/drivers/scsi/fcoe/fcoe.c b/drivers/scsi/fcoe/fcoe.c |
3327 | index f46b312d04bc..6768b2e8148a 100644 |
3328 | --- a/drivers/scsi/fcoe/fcoe.c |
3329 | +++ b/drivers/scsi/fcoe/fcoe.c |
3330 | @@ -390,7 +390,7 @@ static int fcoe_interface_setup(struct fcoe_interface *fcoe, |
3331 | * Returns: pointer to a struct fcoe_interface or NULL on error |
3332 | */ |
3333 | static struct fcoe_interface *fcoe_interface_create(struct net_device *netdev, |
3334 | - enum fip_state fip_mode) |
3335 | + enum fip_mode fip_mode) |
3336 | { |
3337 | struct fcoe_ctlr_device *ctlr_dev; |
3338 | struct fcoe_ctlr *ctlr; |
3339 | diff --git a/drivers/scsi/fcoe/fcoe_ctlr.c b/drivers/scsi/fcoe/fcoe_ctlr.c |
3340 | index 54da3166da8d..7dc4ffa24430 100644 |
3341 | --- a/drivers/scsi/fcoe/fcoe_ctlr.c |
3342 | +++ b/drivers/scsi/fcoe/fcoe_ctlr.c |
3343 | @@ -147,7 +147,7 @@ static void fcoe_ctlr_map_dest(struct fcoe_ctlr *fip) |
3344 | * fcoe_ctlr_init() - Initialize the FCoE Controller instance |
3345 | * @fip: The FCoE controller to initialize |
3346 | */ |
3347 | -void fcoe_ctlr_init(struct fcoe_ctlr *fip, enum fip_state mode) |
3348 | +void fcoe_ctlr_init(struct fcoe_ctlr *fip, enum fip_mode mode) |
3349 | { |
3350 | fcoe_ctlr_set_state(fip, FIP_ST_LINK_WAIT); |
3351 | fip->mode = mode; |
3352 | @@ -454,7 +454,10 @@ void fcoe_ctlr_link_up(struct fcoe_ctlr *fip) |
3353 | mutex_unlock(&fip->ctlr_mutex); |
3354 | fc_linkup(fip->lp); |
3355 | } else if (fip->state == FIP_ST_LINK_WAIT) { |
3356 | - fcoe_ctlr_set_state(fip, fip->mode); |
3357 | + if (fip->mode == FIP_MODE_NON_FIP) |
3358 | + fcoe_ctlr_set_state(fip, FIP_ST_NON_FIP); |
3359 | + else |
3360 | + fcoe_ctlr_set_state(fip, FIP_ST_AUTO); |
3361 | switch (fip->mode) { |
3362 | default: |
3363 | LIBFCOE_FIP_DBG(fip, "invalid mode %d\n", fip->mode); |
3364 | diff --git a/drivers/scsi/fcoe/fcoe_transport.c b/drivers/scsi/fcoe/fcoe_transport.c |
3365 | index f4909cd206d3..f15d5e1d56b1 100644 |
3366 | --- a/drivers/scsi/fcoe/fcoe_transport.c |
3367 | +++ b/drivers/scsi/fcoe/fcoe_transport.c |
3368 | @@ -873,7 +873,7 @@ static int fcoe_transport_create(const char *buffer, |
3369 | int rc = -ENODEV; |
3370 | struct net_device *netdev = NULL; |
3371 | struct fcoe_transport *ft = NULL; |
3372 | - enum fip_state fip_mode = (enum fip_state)(long)kp->arg; |
3373 | + enum fip_mode fip_mode = (enum fip_mode)kp->arg; |
3374 | |
3375 | mutex_lock(&ft_mutex); |
3376 | |
3377 | diff --git a/drivers/scsi/hisi_sas/hisi_sas_main.c b/drivers/scsi/hisi_sas/hisi_sas_main.c |
3378 | index a4e2e6aa9a6b..fd9d82c9033d 100644 |
3379 | --- a/drivers/scsi/hisi_sas/hisi_sas_main.c |
3380 | +++ b/drivers/scsi/hisi_sas/hisi_sas_main.c |
3381 | @@ -10,6 +10,7 @@ |
3382 | */ |
3383 | |
3384 | #include "hisi_sas.h" |
3385 | +#include "../libsas/sas_internal.h" |
3386 | #define DRV_NAME "hisi_sas" |
3387 | |
3388 | #define DEV_IS_GONE(dev) \ |
3389 | @@ -809,7 +810,8 @@ static void hisi_sas_do_release_task(struct hisi_hba *hisi_hba, struct sas_task |
3390 | spin_lock_irqsave(&task->task_state_lock, flags); |
3391 | task->task_state_flags &= |
3392 | ~(SAS_TASK_STATE_PENDING | SAS_TASK_AT_INITIATOR); |
3393 | - task->task_state_flags |= SAS_TASK_STATE_DONE; |
3394 | + if (!slot->is_internal && task->task_proto != SAS_PROTOCOL_SMP) |
3395 | + task->task_state_flags |= SAS_TASK_STATE_DONE; |
3396 | spin_unlock_irqrestore(&task->task_state_lock, flags); |
3397 | } |
3398 | |
3399 | @@ -1879,9 +1881,18 @@ static int hisi_sas_write_gpio(struct sas_ha_struct *sha, u8 reg_type, |
3400 | |
3401 | static void hisi_sas_phy_disconnected(struct hisi_sas_phy *phy) |
3402 | { |
3403 | + struct asd_sas_phy *sas_phy = &phy->sas_phy; |
3404 | + struct sas_phy *sphy = sas_phy->phy; |
3405 | + struct sas_phy_data *d = sphy->hostdata; |
3406 | + |
3407 | phy->phy_attached = 0; |
3408 | phy->phy_type = 0; |
3409 | phy->port = NULL; |
3410 | + |
3411 | + if (d->enable) |
3412 | + sphy->negotiated_linkrate = SAS_LINK_RATE_UNKNOWN; |
3413 | + else |
3414 | + sphy->negotiated_linkrate = SAS_PHY_DISABLED; |
3415 | } |
3416 | |
3417 | void hisi_sas_phy_down(struct hisi_hba *hisi_hba, int phy_no, int rdy) |
3418 | diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c b/drivers/scsi/megaraid/megaraid_sas_base.c |
3419 | index f6de7526ded5..acb503ea8f0c 100644 |
3420 | --- a/drivers/scsi/megaraid/megaraid_sas_base.c |
3421 | +++ b/drivers/scsi/megaraid/megaraid_sas_base.c |
3422 | @@ -4155,6 +4155,7 @@ int megasas_alloc_cmds(struct megasas_instance *instance) |
3423 | if (megasas_create_frame_pool(instance)) { |
3424 | dev_printk(KERN_DEBUG, &instance->pdev->dev, "Error creating frame DMA pool\n"); |
3425 | megasas_free_cmds(instance); |
3426 | + return -ENOMEM; |
3427 | } |
3428 | |
3429 | return 0; |
3430 | diff --git a/drivers/scsi/qedf/qedf_main.c b/drivers/scsi/qedf/qedf_main.c |
3431 | index 0a5dd5595dd3..cd61905ca2f5 100644 |
3432 | --- a/drivers/scsi/qedf/qedf_main.c |
3433 | +++ b/drivers/scsi/qedf/qedf_main.c |
3434 | @@ -1418,7 +1418,7 @@ static struct libfc_function_template qedf_lport_template = { |
3435 | |
3436 | static void qedf_fcoe_ctlr_setup(struct qedf_ctx *qedf) |
3437 | { |
3438 | - fcoe_ctlr_init(&qedf->ctlr, FIP_ST_AUTO); |
3439 | + fcoe_ctlr_init(&qedf->ctlr, FIP_MODE_AUTO); |
3440 | |
3441 | qedf->ctlr.send = qedf_fip_send; |
3442 | qedf->ctlr.get_src_addr = qedf_get_src_mac; |
3443 | diff --git a/drivers/scsi/scsi_scan.c b/drivers/scsi/scsi_scan.c |
3444 | index 78ca63dfba4a..9a7e3a3bd5ce 100644 |
3445 | --- a/drivers/scsi/scsi_scan.c |
3446 | +++ b/drivers/scsi/scsi_scan.c |
3447 | @@ -220,7 +220,7 @@ static struct scsi_device *scsi_alloc_sdev(struct scsi_target *starget, |
3448 | struct Scsi_Host *shost = dev_to_shost(starget->dev.parent); |
3449 | |
3450 | sdev = kzalloc(sizeof(*sdev) + shost->transportt->device_size, |
3451 | - GFP_ATOMIC); |
3452 | + GFP_KERNEL); |
3453 | if (!sdev) |
3454 | goto out; |
3455 | |
3456 | @@ -796,7 +796,7 @@ static int scsi_add_lun(struct scsi_device *sdev, unsigned char *inq_result, |
3457 | */ |
3458 | sdev->inquiry = kmemdup(inq_result, |
3459 | max_t(size_t, sdev->inquiry_len, 36), |
3460 | - GFP_ATOMIC); |
3461 | + GFP_KERNEL); |
3462 | if (sdev->inquiry == NULL) |
3463 | return SCSI_SCAN_NO_RESPONSE; |
3464 | |
3465 | @@ -1087,7 +1087,7 @@ static int scsi_probe_and_add_lun(struct scsi_target *starget, |
3466 | if (!sdev) |
3467 | goto out; |
3468 | |
3469 | - result = kmalloc(result_len, GFP_ATOMIC | |
3470 | + result = kmalloc(result_len, GFP_KERNEL | |
3471 | ((shost->unchecked_isa_dma) ? __GFP_DMA : 0)); |
3472 | if (!result) |
3473 | goto out_free_sdev; |
3474 | diff --git a/drivers/soc/qcom/qcom_gsbi.c b/drivers/soc/qcom/qcom_gsbi.c |
3475 | index 09c669e70d63..038abc377fdb 100644 |
3476 | --- a/drivers/soc/qcom/qcom_gsbi.c |
3477 | +++ b/drivers/soc/qcom/qcom_gsbi.c |
3478 | @@ -138,7 +138,7 @@ static int gsbi_probe(struct platform_device *pdev) |
3479 | struct resource *res; |
3480 | void __iomem *base; |
3481 | struct gsbi_info *gsbi; |
3482 | - int i; |
3483 | + int i, ret; |
3484 | u32 mask, gsbi_num; |
3485 | const struct crci_config *config = NULL; |
3486 | |
3487 | @@ -221,7 +221,10 @@ static int gsbi_probe(struct platform_device *pdev) |
3488 | |
3489 | platform_set_drvdata(pdev, gsbi); |
3490 | |
3491 | - return of_platform_populate(node, NULL, NULL, &pdev->dev); |
3492 | + ret = of_platform_populate(node, NULL, NULL, &pdev->dev); |
3493 | + if (ret) |
3494 | + clk_disable_unprepare(gsbi->hclk); |
3495 | + return ret; |
3496 | } |
3497 | |
3498 | static int gsbi_remove(struct platform_device *pdev) |
3499 | diff --git a/drivers/soc/tegra/fuse/fuse-tegra.c b/drivers/soc/tegra/fuse/fuse-tegra.c |
3500 | index a33ee8ef8b6b..51625703399e 100644 |
3501 | --- a/drivers/soc/tegra/fuse/fuse-tegra.c |
3502 | +++ b/drivers/soc/tegra/fuse/fuse-tegra.c |
3503 | @@ -137,13 +137,17 @@ static int tegra_fuse_probe(struct platform_device *pdev) |
3504 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
3505 | fuse->phys = res->start; |
3506 | fuse->base = devm_ioremap_resource(&pdev->dev, res); |
3507 | - if (IS_ERR(fuse->base)) |
3508 | - return PTR_ERR(fuse->base); |
3509 | + if (IS_ERR(fuse->base)) { |
3510 | + err = PTR_ERR(fuse->base); |
3511 | + fuse->base = base; |
3512 | + return err; |
3513 | + } |
3514 | |
3515 | fuse->clk = devm_clk_get(&pdev->dev, "fuse"); |
3516 | if (IS_ERR(fuse->clk)) { |
3517 | dev_err(&pdev->dev, "failed to get FUSE clock: %ld", |
3518 | PTR_ERR(fuse->clk)); |
3519 | + fuse->base = base; |
3520 | return PTR_ERR(fuse->clk); |
3521 | } |
3522 | |
3523 | @@ -152,8 +156,10 @@ static int tegra_fuse_probe(struct platform_device *pdev) |
3524 | |
3525 | if (fuse->soc->probe) { |
3526 | err = fuse->soc->probe(fuse); |
3527 | - if (err < 0) |
3528 | + if (err < 0) { |
3529 | + fuse->base = base; |
3530 | return err; |
3531 | + } |
3532 | } |
3533 | |
3534 | if (tegra_fuse_create_sysfs(&pdev->dev, fuse->soc->info->size, |
3535 | diff --git a/drivers/staging/mt7621-spi/spi-mt7621.c b/drivers/staging/mt7621-spi/spi-mt7621.c |
3536 | index d045b5568e0f..578aa6824ad3 100644 |
3537 | --- a/drivers/staging/mt7621-spi/spi-mt7621.c |
3538 | +++ b/drivers/staging/mt7621-spi/spi-mt7621.c |
3539 | @@ -429,6 +429,7 @@ static int mt7621_spi_probe(struct platform_device *pdev) |
3540 | int status = 0; |
3541 | struct clk *clk; |
3542 | struct mt7621_spi_ops *ops; |
3543 | + int ret; |
3544 | |
3545 | match = of_match_device(mt7621_spi_match, &pdev->dev); |
3546 | if (!match) |
3547 | @@ -476,7 +477,11 @@ static int mt7621_spi_probe(struct platform_device *pdev) |
3548 | rs->pending_write = 0; |
3549 | dev_info(&pdev->dev, "sys_freq: %u\n", rs->sys_freq); |
3550 | |
3551 | - device_reset(&pdev->dev); |
3552 | + ret = device_reset(&pdev->dev); |
3553 | + if (ret) { |
3554 | + dev_err(&pdev->dev, "SPI reset failed!\n"); |
3555 | + return ret; |
3556 | + } |
3557 | |
3558 | mt7621_spi_reset(rs, 0); |
3559 | |
3560 | diff --git a/drivers/tty/serial/8250/8250_pxa.c b/drivers/tty/serial/8250/8250_pxa.c |
3561 | index b9bcbe20a2be..c47188860e32 100644 |
3562 | --- a/drivers/tty/serial/8250/8250_pxa.c |
3563 | +++ b/drivers/tty/serial/8250/8250_pxa.c |
3564 | @@ -113,6 +113,10 @@ static int serial_pxa_probe(struct platform_device *pdev) |
3565 | if (ret) |
3566 | return ret; |
3567 | |
3568 | + ret = of_alias_get_id(pdev->dev.of_node, "serial"); |
3569 | + if (ret >= 0) |
3570 | + uart.port.line = ret; |
3571 | + |
3572 | uart.port.type = PORT_XSCALE; |
3573 | uart.port.iotype = UPIO_MEM32; |
3574 | uart.port.mapbase = mmres->start; |
3575 | diff --git a/drivers/tty/serial/atmel_serial.c b/drivers/tty/serial/atmel_serial.c |
3576 | index bfdd5ad4116f..1cb80fe5f95c 100644 |
3577 | --- a/drivers/tty/serial/atmel_serial.c |
3578 | +++ b/drivers/tty/serial/atmel_serial.c |
3579 | @@ -163,6 +163,8 @@ struct atmel_uart_port { |
3580 | unsigned int pending_status; |
3581 | spinlock_t lock_suspended; |
3582 | |
3583 | + bool hd_start_rx; /* can start RX during half-duplex operation */ |
3584 | + |
3585 | #ifdef CONFIG_PM |
3586 | struct { |
3587 | u32 cr; |
3588 | @@ -225,6 +227,12 @@ static inline void atmel_uart_write_char(struct uart_port *port, u8 value) |
3589 | __raw_writeb(value, port->membase + ATMEL_US_THR); |
3590 | } |
3591 | |
3592 | +static inline int atmel_uart_is_half_duplex(struct uart_port *port) |
3593 | +{ |
3594 | + return (port->rs485.flags & SER_RS485_ENABLED) && |
3595 | + !(port->rs485.flags & SER_RS485_RX_DURING_TX); |
3596 | +} |
3597 | + |
3598 | #ifdef CONFIG_SERIAL_ATMEL_PDC |
3599 | static bool atmel_use_pdc_rx(struct uart_port *port) |
3600 | { |
3601 | @@ -481,9 +489,9 @@ static void atmel_stop_tx(struct uart_port *port) |
3602 | /* Disable interrupts */ |
3603 | atmel_uart_writel(port, ATMEL_US_IDR, atmel_port->tx_done_mask); |
3604 | |
3605 | - if ((port->rs485.flags & SER_RS485_ENABLED) && |
3606 | - !(port->rs485.flags & SER_RS485_RX_DURING_TX)) |
3607 | + if (atmel_uart_is_half_duplex(port)) |
3608 | atmel_start_rx(port); |
3609 | + |
3610 | } |
3611 | |
3612 | /* |
3613 | @@ -500,8 +508,7 @@ static void atmel_start_tx(struct uart_port *port) |
3614 | return; |
3615 | |
3616 | if (atmel_use_pdc_tx(port) || atmel_use_dma_tx(port)) |
3617 | - if ((port->rs485.flags & SER_RS485_ENABLED) && |
3618 | - !(port->rs485.flags & SER_RS485_RX_DURING_TX)) |
3619 | + if (atmel_uart_is_half_duplex(port)) |
3620 | atmel_stop_rx(port); |
3621 | |
3622 | if (atmel_use_pdc_tx(port)) |
3623 | @@ -799,10 +806,14 @@ static void atmel_complete_tx_dma(void *arg) |
3624 | */ |
3625 | if (!uart_circ_empty(xmit)) |
3626 | atmel_tasklet_schedule(atmel_port, &atmel_port->tasklet_tx); |
3627 | - else if ((port->rs485.flags & SER_RS485_ENABLED) && |
3628 | - !(port->rs485.flags & SER_RS485_RX_DURING_TX)) { |
3629 | - /* DMA done, stop TX, start RX for RS485 */ |
3630 | - atmel_start_rx(port); |
3631 | + else if (atmel_uart_is_half_duplex(port)) { |
3632 | + /* |
3633 | + * DMA done, re-enable TXEMPTY and signal that we can stop |
3634 | + * TX and start RX for RS485 |
3635 | + */ |
3636 | + atmel_port->hd_start_rx = true; |
3637 | + atmel_uart_writel(port, ATMEL_US_IER, |
3638 | + atmel_port->tx_done_mask); |
3639 | } |
3640 | |
3641 | spin_unlock_irqrestore(&port->lock, flags); |
3642 | @@ -1248,9 +1259,20 @@ atmel_handle_transmit(struct uart_port *port, unsigned int pending) |
3643 | struct atmel_uart_port *atmel_port = to_atmel_uart_port(port); |
3644 | |
3645 | if (pending & atmel_port->tx_done_mask) { |
3646 | - /* Either PDC or interrupt transmission */ |
3647 | atmel_uart_writel(port, ATMEL_US_IDR, |
3648 | atmel_port->tx_done_mask); |
3649 | + |
3650 | + /* Start RX if flag was set and FIFO is empty */ |
3651 | + if (atmel_port->hd_start_rx) { |
3652 | + if (!(atmel_uart_readl(port, ATMEL_US_CSR) |
3653 | + & ATMEL_US_TXEMPTY)) |
3654 | + dev_warn(port->dev, "Should start RX, but TX fifo is not empty\n"); |
3655 | + |
3656 | + atmel_port->hd_start_rx = false; |
3657 | + atmel_start_rx(port); |
3658 | + return; |
3659 | + } |
3660 | + |
3661 | atmel_tasklet_schedule(atmel_port, &atmel_port->tasklet_tx); |
3662 | } |
3663 | } |
3664 | @@ -1377,8 +1399,7 @@ static void atmel_tx_pdc(struct uart_port *port) |
3665 | atmel_uart_writel(port, ATMEL_US_IER, |
3666 | atmel_port->tx_done_mask); |
3667 | } else { |
3668 | - if ((port->rs485.flags & SER_RS485_ENABLED) && |
3669 | - !(port->rs485.flags & SER_RS485_RX_DURING_TX)) { |
3670 | + if (atmel_uart_is_half_duplex(port)) { |
3671 | /* DMA done, stop TX, start RX for RS485 */ |
3672 | atmel_start_rx(port); |
3673 | } |
3674 | diff --git a/drivers/tty/tty_buffer.c b/drivers/tty/tty_buffer.c |
3675 | index ae3ce330200e..ee3aa57bc0e7 100644 |
3676 | --- a/drivers/tty/tty_buffer.c |
3677 | +++ b/drivers/tty/tty_buffer.c |
3678 | @@ -26,7 +26,7 @@ |
3679 | * Byte threshold to limit memory consumption for flip buffers. |
3680 | * The actual memory limit is > 2x this amount. |
3681 | */ |
3682 | -#define TTYB_DEFAULT_MEM_LIMIT 65536 |
3683 | +#define TTYB_DEFAULT_MEM_LIMIT (640 * 1024UL) |
3684 | |
3685 | /* |
3686 | * We default to dicing tty buffer allocations to this many characters |
3687 | diff --git a/drivers/usb/chipidea/core.c b/drivers/usb/chipidea/core.c |
3688 | index 85fc6db48e44..159b897c5e80 100644 |
3689 | --- a/drivers/usb/chipidea/core.c |
3690 | +++ b/drivers/usb/chipidea/core.c |
3691 | @@ -935,8 +935,15 @@ static int ci_hdrc_probe(struct platform_device *pdev) |
3692 | } else if (ci->platdata->usb_phy) { |
3693 | ci->usb_phy = ci->platdata->usb_phy; |
3694 | } else { |
3695 | + ci->usb_phy = devm_usb_get_phy_by_phandle(dev->parent, "phys", |
3696 | + 0); |
3697 | ci->phy = devm_phy_get(dev->parent, "usb-phy"); |
3698 | - ci->usb_phy = devm_usb_get_phy(dev->parent, USB_PHY_TYPE_USB2); |
3699 | + |
3700 | + /* Fallback to grabbing any registered USB2 PHY */ |
3701 | + if (IS_ERR(ci->usb_phy) && |
3702 | + PTR_ERR(ci->usb_phy) != -EPROBE_DEFER) |
3703 | + ci->usb_phy = devm_usb_get_phy(dev->parent, |
3704 | + USB_PHY_TYPE_USB2); |
3705 | |
3706 | /* if both generic PHY and USB PHY layers aren't enabled */ |
3707 | if (PTR_ERR(ci->phy) == -ENOSYS && |
3708 | diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c |
3709 | index 700fb626ad03..524104eed8a7 100644 |
3710 | --- a/drivers/usb/dwc3/gadget.c |
3711 | +++ b/drivers/usb/dwc3/gadget.c |
3712 | @@ -3233,6 +3233,8 @@ int dwc3_gadget_init(struct dwc3 *dwc) |
3713 | goto err4; |
3714 | } |
3715 | |
3716 | + dwc3_gadget_set_speed(&dwc->gadget, dwc->maximum_speed); |
3717 | + |
3718 | return 0; |
3719 | |
3720 | err4: |
3721 | diff --git a/drivers/usb/gadget/function/f_fs.c b/drivers/usb/gadget/function/f_fs.c |
3722 | index 31e8bf3578c8..aa15593a3ac4 100644 |
3723 | --- a/drivers/usb/gadget/function/f_fs.c |
3724 | +++ b/drivers/usb/gadget/function/f_fs.c |
3725 | @@ -1008,6 +1008,7 @@ static ssize_t ffs_epfile_io(struct file *file, struct ffs_io_data *io_data) |
3726 | * condition with req->complete callback. |
3727 | */ |
3728 | usb_ep_dequeue(ep->ep, req); |
3729 | + wait_for_completion(&done); |
3730 | interrupted = ep->status < 0; |
3731 | } |
3732 | |
3733 | diff --git a/drivers/video/backlight/pwm_bl.c b/drivers/video/backlight/pwm_bl.c |
3734 | index 6bde543452f2..7ddc0930e98c 100644 |
3735 | --- a/drivers/video/backlight/pwm_bl.c |
3736 | +++ b/drivers/video/backlight/pwm_bl.c |
3737 | @@ -425,7 +425,7 @@ static int pwm_backlight_initial_power_state(const struct pwm_bl_data *pb) |
3738 | */ |
3739 | |
3740 | /* if the enable GPIO is disabled, do not enable the backlight */ |
3741 | - if (pb->enable_gpio && gpiod_get_value(pb->enable_gpio) == 0) |
3742 | + if (pb->enable_gpio && gpiod_get_value_cansleep(pb->enable_gpio) == 0) |
3743 | return FB_BLANK_POWERDOWN; |
3744 | |
3745 | /* The regulator is disabled, do not enable the backlight */ |
3746 | diff --git a/drivers/video/fbdev/core/fbmem.c b/drivers/video/fbdev/core/fbmem.c |
3747 | index 77cee99fc36c..c48f083d522a 100644 |
3748 | --- a/drivers/video/fbdev/core/fbmem.c |
3749 | +++ b/drivers/video/fbdev/core/fbmem.c |
3750 | @@ -427,6 +427,9 @@ static void fb_do_show_logo(struct fb_info *info, struct fb_image *image, |
3751 | { |
3752 | unsigned int x; |
3753 | |
3754 | + if (image->width > info->var.xres || image->height > info->var.yres) |
3755 | + return; |
3756 | + |
3757 | if (rotate == FB_ROTATE_UR) { |
3758 | for (x = 0; |
3759 | x < num && image->dx + image->width <= info->var.xres; |
3760 | diff --git a/drivers/xen/gntdev-dmabuf.c b/drivers/xen/gntdev-dmabuf.c |
3761 | index cba6b586bfbd..d97fcfc5e558 100644 |
3762 | --- a/drivers/xen/gntdev-dmabuf.c |
3763 | +++ b/drivers/xen/gntdev-dmabuf.c |
3764 | @@ -80,6 +80,12 @@ struct gntdev_dmabuf_priv { |
3765 | struct list_head imp_list; |
3766 | /* This is the lock which protects dma_buf_xxx lists. */ |
3767 | struct mutex lock; |
3768 | + /* |
3769 | + * We reference this file while exporting dma-bufs, so |
3770 | + * the grant device context is not destroyed while there are |
3771 | + * external users alive. |
3772 | + */ |
3773 | + struct file *filp; |
3774 | }; |
3775 | |
3776 | /* DMA buffer export support. */ |
3777 | @@ -311,6 +317,7 @@ static void dmabuf_exp_release(struct kref *kref) |
3778 | |
3779 | dmabuf_exp_wait_obj_signal(gntdev_dmabuf->priv, gntdev_dmabuf); |
3780 | list_del(&gntdev_dmabuf->next); |
3781 | + fput(gntdev_dmabuf->priv->filp); |
3782 | kfree(gntdev_dmabuf); |
3783 | } |
3784 | |
3785 | @@ -423,6 +430,7 @@ static int dmabuf_exp_from_pages(struct gntdev_dmabuf_export_args *args) |
3786 | mutex_lock(&args->dmabuf_priv->lock); |
3787 | list_add(&gntdev_dmabuf->next, &args->dmabuf_priv->exp_list); |
3788 | mutex_unlock(&args->dmabuf_priv->lock); |
3789 | + get_file(gntdev_dmabuf->priv->filp); |
3790 | return 0; |
3791 | |
3792 | fail: |
3793 | @@ -834,7 +842,7 @@ long gntdev_ioctl_dmabuf_imp_release(struct gntdev_priv *priv, |
3794 | return dmabuf_imp_release(priv->dmabuf_priv, op.fd); |
3795 | } |
3796 | |
3797 | -struct gntdev_dmabuf_priv *gntdev_dmabuf_init(void) |
3798 | +struct gntdev_dmabuf_priv *gntdev_dmabuf_init(struct file *filp) |
3799 | { |
3800 | struct gntdev_dmabuf_priv *priv; |
3801 | |
3802 | @@ -847,6 +855,8 @@ struct gntdev_dmabuf_priv *gntdev_dmabuf_init(void) |
3803 | INIT_LIST_HEAD(&priv->exp_wait_list); |
3804 | INIT_LIST_HEAD(&priv->imp_list); |
3805 | |
3806 | + priv->filp = filp; |
3807 | + |
3808 | return priv; |
3809 | } |
3810 | |
3811 | diff --git a/drivers/xen/gntdev-dmabuf.h b/drivers/xen/gntdev-dmabuf.h |
3812 | index 7220a53d0fc5..3d9b9cf9d5a1 100644 |
3813 | --- a/drivers/xen/gntdev-dmabuf.h |
3814 | +++ b/drivers/xen/gntdev-dmabuf.h |
3815 | @@ -14,7 +14,7 @@ |
3816 | struct gntdev_dmabuf_priv; |
3817 | struct gntdev_priv; |
3818 | |
3819 | -struct gntdev_dmabuf_priv *gntdev_dmabuf_init(void); |
3820 | +struct gntdev_dmabuf_priv *gntdev_dmabuf_init(struct file *filp); |
3821 | |
3822 | void gntdev_dmabuf_fini(struct gntdev_dmabuf_priv *priv); |
3823 | |
3824 | diff --git a/drivers/xen/gntdev.c b/drivers/xen/gntdev.c |
3825 | index b0b02a501167..9d8e02cfd480 100644 |
3826 | --- a/drivers/xen/gntdev.c |
3827 | +++ b/drivers/xen/gntdev.c |
3828 | @@ -600,7 +600,7 @@ static int gntdev_open(struct inode *inode, struct file *flip) |
3829 | mutex_init(&priv->lock); |
3830 | |
3831 | #ifdef CONFIG_XEN_GNTDEV_DMABUF |
3832 | - priv->dmabuf_priv = gntdev_dmabuf_init(); |
3833 | + priv->dmabuf_priv = gntdev_dmabuf_init(flip); |
3834 | if (IS_ERR(priv->dmabuf_priv)) { |
3835 | ret = PTR_ERR(priv->dmabuf_priv); |
3836 | kfree(priv); |
3837 | diff --git a/fs/btrfs/qgroup.c b/fs/btrfs/qgroup.c |
3838 | index e1fcb28ad4cc..e46e83e87600 100644 |
3839 | --- a/fs/btrfs/qgroup.c |
3840 | +++ b/fs/btrfs/qgroup.c |
3841 | @@ -2427,16 +2427,15 @@ out: |
3842 | /* |
3843 | * Two limits to commit transaction in advance. |
3844 | * |
3845 | - * For RATIO, it will be 1/RATIO of the remaining limit |
3846 | - * (excluding data and prealloc meta) as threshold. |
3847 | + * For RATIO, it will be 1/RATIO of the remaining limit as threshold. |
3848 | * For SIZE, it will be in byte unit as threshold. |
3849 | */ |
3850 | -#define QGROUP_PERTRANS_RATIO 32 |
3851 | -#define QGROUP_PERTRANS_SIZE SZ_32M |
3852 | +#define QGROUP_FREE_RATIO 32 |
3853 | +#define QGROUP_FREE_SIZE SZ_32M |
3854 | static bool qgroup_check_limits(struct btrfs_fs_info *fs_info, |
3855 | const struct btrfs_qgroup *qg, u64 num_bytes) |
3856 | { |
3857 | - u64 limit; |
3858 | + u64 free; |
3859 | u64 threshold; |
3860 | |
3861 | if ((qg->lim_flags & BTRFS_QGROUP_LIMIT_MAX_RFER) && |
3862 | @@ -2455,20 +2454,21 @@ static bool qgroup_check_limits(struct btrfs_fs_info *fs_info, |
3863 | */ |
3864 | if ((qg->lim_flags & (BTRFS_QGROUP_LIMIT_MAX_RFER | |
3865 | BTRFS_QGROUP_LIMIT_MAX_EXCL))) { |
3866 | - if (qg->lim_flags & BTRFS_QGROUP_LIMIT_MAX_EXCL) |
3867 | - limit = qg->max_excl; |
3868 | - else |
3869 | - limit = qg->max_rfer; |
3870 | - threshold = (limit - qg->rsv.values[BTRFS_QGROUP_RSV_DATA] - |
3871 | - qg->rsv.values[BTRFS_QGROUP_RSV_META_PREALLOC]) / |
3872 | - QGROUP_PERTRANS_RATIO; |
3873 | - threshold = min_t(u64, threshold, QGROUP_PERTRANS_SIZE); |
3874 | + if (qg->lim_flags & BTRFS_QGROUP_LIMIT_MAX_EXCL) { |
3875 | + free = qg->max_excl - qgroup_rsv_total(qg) - qg->excl; |
3876 | + threshold = min_t(u64, qg->max_excl / QGROUP_FREE_RATIO, |
3877 | + QGROUP_FREE_SIZE); |
3878 | + } else { |
3879 | + free = qg->max_rfer - qgroup_rsv_total(qg) - qg->rfer; |
3880 | + threshold = min_t(u64, qg->max_rfer / QGROUP_FREE_RATIO, |
3881 | + QGROUP_FREE_SIZE); |
3882 | + } |
3883 | |
3884 | /* |
3885 | * Use transaction_kthread to commit transaction, so we no |
3886 | * longer need to bother nested transaction nor lock context. |
3887 | */ |
3888 | - if (qg->rsv.values[BTRFS_QGROUP_RSV_META_PERTRANS] > threshold) |
3889 | + if (free < threshold) |
3890 | btrfs_commit_transaction_locksafe(fs_info); |
3891 | } |
3892 | |
3893 | diff --git a/fs/buffer.c b/fs/buffer.c |
3894 | index c083c4b3c1e7..a550e0d8e965 100644 |
3895 | --- a/fs/buffer.c |
3896 | +++ b/fs/buffer.c |
3897 | @@ -3027,6 +3027,13 @@ void guard_bio_eod(int op, struct bio *bio) |
3898 | /* Uhhuh. We've got a bio that straddles the device size! */ |
3899 | truncated_bytes = bio->bi_iter.bi_size - (maxsector << 9); |
3900 | |
3901 | + /* |
3902 | + * The bio contains more than one segment which spans EOD, just return |
3903 | + * and let IO layer turn it into an EIO |
3904 | + */ |
3905 | + if (truncated_bytes > bvec->bv_len) |
3906 | + return; |
3907 | + |
3908 | /* Truncate the bio.. */ |
3909 | bio->bi_iter.bi_size -= truncated_bytes; |
3910 | bvec->bv_len -= truncated_bytes; |
3911 | diff --git a/fs/cifs/cifs_dfs_ref.c b/fs/cifs/cifs_dfs_ref.c |
3912 | index 6b61df117fd4..563e2f6268c3 100644 |
3913 | --- a/fs/cifs/cifs_dfs_ref.c |
3914 | +++ b/fs/cifs/cifs_dfs_ref.c |
3915 | @@ -271,9 +271,9 @@ static void dump_referral(const struct dfs_info3_param *ref) |
3916 | { |
3917 | cifs_dbg(FYI, "DFS: ref path: %s\n", ref->path_name); |
3918 | cifs_dbg(FYI, "DFS: node path: %s\n", ref->node_name); |
3919 | - cifs_dbg(FYI, "DFS: fl: %hd, srv_type: %hd\n", |
3920 | + cifs_dbg(FYI, "DFS: fl: %d, srv_type: %d\n", |
3921 | ref->flags, ref->server_type); |
3922 | - cifs_dbg(FYI, "DFS: ref_flags: %hd, path_consumed: %hd\n", |
3923 | + cifs_dbg(FYI, "DFS: ref_flags: %d, path_consumed: %d\n", |
3924 | ref->ref_flag, ref->path_consumed); |
3925 | } |
3926 | |
3927 | diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c |
3928 | index a5ea742654aa..f31339db45fd 100644 |
3929 | --- a/fs/cifs/connect.c |
3930 | +++ b/fs/cifs/connect.c |
3931 | @@ -1347,6 +1347,11 @@ cifs_parse_devname(const char *devname, struct smb_vol *vol) |
3932 | const char *delims = "/\\"; |
3933 | size_t len; |
3934 | |
3935 | + if (unlikely(!devname || !*devname)) { |
3936 | + cifs_dbg(VFS, "Device name not specified.\n"); |
3937 | + return -EINVAL; |
3938 | + } |
3939 | + |
3940 | /* make sure we have a valid UNC double delimiter prefix */ |
3941 | len = strspn(devname, delims); |
3942 | if (len != 2) |
3943 | diff --git a/fs/cifs/file.c b/fs/cifs/file.c |
3944 | index 08761a6a039d..d847132ab027 100644 |
3945 | --- a/fs/cifs/file.c |
3946 | +++ b/fs/cifs/file.c |
3947 | @@ -1631,8 +1631,20 @@ cifs_setlk(struct file *file, struct file_lock *flock, __u32 type, |
3948 | rc = server->ops->mand_unlock_range(cfile, flock, xid); |
3949 | |
3950 | out: |
3951 | - if (flock->fl_flags & FL_POSIX && !rc) |
3952 | + if (flock->fl_flags & FL_POSIX) { |
3953 | + /* |
3954 | + * If this is a request to remove all locks because we |
3955 | + * are closing the file, it doesn't matter if the |
3956 | + * unlocking failed as both cifs.ko and the SMB server |
3957 | + * remove the lock on file close |
3958 | + */ |
3959 | + if (rc) { |
3960 | + cifs_dbg(VFS, "%s failed rc=%d\n", __func__, rc); |
3961 | + if (!(flock->fl_flags & FL_CLOSE)) |
3962 | + return rc; |
3963 | + } |
3964 | rc = locks_lock_file_wait(file, flock); |
3965 | + } |
3966 | return rc; |
3967 | } |
3968 | |
3969 | diff --git a/fs/cifs/smb1ops.c b/fs/cifs/smb1ops.c |
3970 | index 378151e09e91..47db8eb6cbcf 100644 |
3971 | --- a/fs/cifs/smb1ops.c |
3972 | +++ b/fs/cifs/smb1ops.c |
3973 | @@ -308,7 +308,7 @@ coalesce_t2(char *second_buf, struct smb_hdr *target_hdr) |
3974 | remaining = tgt_total_cnt - total_in_tgt; |
3975 | |
3976 | if (remaining < 0) { |
3977 | - cifs_dbg(FYI, "Server sent too much data. tgt_total_cnt=%hu total_in_tgt=%hu\n", |
3978 | + cifs_dbg(FYI, "Server sent too much data. tgt_total_cnt=%hu total_in_tgt=%u\n", |
3979 | tgt_total_cnt, total_in_tgt); |
3980 | return -EPROTO; |
3981 | } |
3982 | diff --git a/fs/cifs/smb2pdu.c b/fs/cifs/smb2pdu.c |
3983 | index 3d0db37d64ad..71f32d983384 100644 |
3984 | --- a/fs/cifs/smb2pdu.c |
3985 | +++ b/fs/cifs/smb2pdu.c |
3986 | @@ -881,8 +881,14 @@ int smb3_validate_negotiate(const unsigned int xid, struct cifs_tcon *tcon) |
3987 | rc = SMB2_ioctl(xid, tcon, NO_FILE_ID, NO_FILE_ID, |
3988 | FSCTL_VALIDATE_NEGOTIATE_INFO, true /* is_fsctl */, |
3989 | (char *)pneg_inbuf, inbuflen, (char **)&pneg_rsp, &rsplen); |
3990 | - |
3991 | - if (rc != 0) { |
3992 | + if (rc == -EOPNOTSUPP) { |
3993 | + /* |
3994 | + * Old Windows versions or Netapp SMB server can return |
3995 | + * not supported error. Client should accept it. |
3996 | + */ |
3997 | + cifs_dbg(VFS, "Server does not support validate negotiate\n"); |
3998 | + return 0; |
3999 | + } else if (rc != 0) { |
4000 | cifs_dbg(VFS, "validate protocol negotiate failed: %d\n", rc); |
4001 | rc = -EIO; |
4002 | goto out_free_inbuf; |
4003 | diff --git a/fs/ext4/indirect.c b/fs/ext4/indirect.c |
4004 | index 9e96a0bd08d9..e1801b288847 100644 |
4005 | --- a/fs/ext4/indirect.c |
4006 | +++ b/fs/ext4/indirect.c |
4007 | @@ -1219,6 +1219,7 @@ int ext4_ind_remove_space(handle_t *handle, struct inode *inode, |
4008 | ext4_lblk_t offsets[4], offsets2[4]; |
4009 | Indirect chain[4], chain2[4]; |
4010 | Indirect *partial, *partial2; |
4011 | + Indirect *p = NULL, *p2 = NULL; |
4012 | ext4_lblk_t max_block; |
4013 | __le32 nr = 0, nr2 = 0; |
4014 | int n = 0, n2 = 0; |
4015 | @@ -1260,7 +1261,7 @@ int ext4_ind_remove_space(handle_t *handle, struct inode *inode, |
4016 | } |
4017 | |
4018 | |
4019 | - partial = ext4_find_shared(inode, n, offsets, chain, &nr); |
4020 | + partial = p = ext4_find_shared(inode, n, offsets, chain, &nr); |
4021 | if (nr) { |
4022 | if (partial == chain) { |
4023 | /* Shared branch grows from the inode */ |
4024 | @@ -1285,13 +1286,11 @@ int ext4_ind_remove_space(handle_t *handle, struct inode *inode, |
4025 | partial->p + 1, |
4026 | (__le32 *)partial->bh->b_data+addr_per_block, |
4027 | (chain+n-1) - partial); |
4028 | - BUFFER_TRACE(partial->bh, "call brelse"); |
4029 | - brelse(partial->bh); |
4030 | partial--; |
4031 | } |
4032 | |
4033 | end_range: |
4034 | - partial2 = ext4_find_shared(inode, n2, offsets2, chain2, &nr2); |
4035 | + partial2 = p2 = ext4_find_shared(inode, n2, offsets2, chain2, &nr2); |
4036 | if (nr2) { |
4037 | if (partial2 == chain2) { |
4038 | /* |
4039 | @@ -1321,16 +1320,14 @@ end_range: |
4040 | (__le32 *)partial2->bh->b_data, |
4041 | partial2->p, |
4042 | (chain2+n2-1) - partial2); |
4043 | - BUFFER_TRACE(partial2->bh, "call brelse"); |
4044 | - brelse(partial2->bh); |
4045 | partial2--; |
4046 | } |
4047 | goto do_indirects; |
4048 | } |
4049 | |
4050 | /* Punch happened within the same level (n == n2) */ |
4051 | - partial = ext4_find_shared(inode, n, offsets, chain, &nr); |
4052 | - partial2 = ext4_find_shared(inode, n2, offsets2, chain2, &nr2); |
4053 | + partial = p = ext4_find_shared(inode, n, offsets, chain, &nr); |
4054 | + partial2 = p2 = ext4_find_shared(inode, n2, offsets2, chain2, &nr2); |
4055 | |
4056 | /* Free top, but only if partial2 isn't its subtree. */ |
4057 | if (nr) { |
4058 | @@ -1387,15 +1384,7 @@ end_range: |
4059 | partial->p + 1, |
4060 | partial2->p, |
4061 | (chain+n-1) - partial); |
4062 | - while (partial > chain) { |
4063 | - BUFFER_TRACE(partial->bh, "call brelse"); |
4064 | - brelse(partial->bh); |
4065 | - } |
4066 | - while (partial2 > chain2) { |
4067 | - BUFFER_TRACE(partial2->bh, "call brelse"); |
4068 | - brelse(partial2->bh); |
4069 | - } |
4070 | - return 0; |
4071 | + goto cleanup; |
4072 | } |
4073 | |
4074 | /* |
4075 | @@ -1410,8 +1399,6 @@ end_range: |
4076 | partial->p + 1, |
4077 | (__le32 *)partial->bh->b_data+addr_per_block, |
4078 | (chain+n-1) - partial); |
4079 | - BUFFER_TRACE(partial->bh, "call brelse"); |
4080 | - brelse(partial->bh); |
4081 | partial--; |
4082 | } |
4083 | if (partial2 > chain2 && depth2 <= depth) { |
4084 | @@ -1419,11 +1406,21 @@ end_range: |
4085 | (__le32 *)partial2->bh->b_data, |
4086 | partial2->p, |
4087 | (chain2+n2-1) - partial2); |
4088 | - BUFFER_TRACE(partial2->bh, "call brelse"); |
4089 | - brelse(partial2->bh); |
4090 | partial2--; |
4091 | } |
4092 | } |
4093 | + |
4094 | +cleanup: |
4095 | + while (p && p > chain) { |
4096 | + BUFFER_TRACE(p->bh, "call brelse"); |
4097 | + brelse(p->bh); |
4098 | + p--; |
4099 | + } |
4100 | + while (p2 && p2 > chain2) { |
4101 | + BUFFER_TRACE(p2->bh, "call brelse"); |
4102 | + brelse(p2->bh); |
4103 | + p2--; |
4104 | + } |
4105 | return 0; |
4106 | |
4107 | do_indirects: |
4108 | @@ -1431,7 +1428,7 @@ do_indirects: |
4109 | switch (offsets[0]) { |
4110 | default: |
4111 | if (++n >= n2) |
4112 | - return 0; |
4113 | + break; |
4114 | nr = i_data[EXT4_IND_BLOCK]; |
4115 | if (nr) { |
4116 | ext4_free_branches(handle, inode, NULL, &nr, &nr+1, 1); |
4117 | @@ -1439,7 +1436,7 @@ do_indirects: |
4118 | } |
4119 | case EXT4_IND_BLOCK: |
4120 | if (++n >= n2) |
4121 | - return 0; |
4122 | + break; |
4123 | nr = i_data[EXT4_DIND_BLOCK]; |
4124 | if (nr) { |
4125 | ext4_free_branches(handle, inode, NULL, &nr, &nr+1, 2); |
4126 | @@ -1447,7 +1444,7 @@ do_indirects: |
4127 | } |
4128 | case EXT4_DIND_BLOCK: |
4129 | if (++n >= n2) |
4130 | - return 0; |
4131 | + break; |
4132 | nr = i_data[EXT4_TIND_BLOCK]; |
4133 | if (nr) { |
4134 | ext4_free_branches(handle, inode, NULL, &nr, &nr+1, 3); |
4135 | @@ -1456,5 +1453,5 @@ do_indirects: |
4136 | case EXT4_TIND_BLOCK: |
4137 | ; |
4138 | } |
4139 | - return 0; |
4140 | + goto cleanup; |
4141 | } |
4142 | diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h |
4143 | index 42aef5c94927..a3ba20e5946f 100644 |
4144 | --- a/fs/f2fs/f2fs.h |
4145 | +++ b/fs/f2fs/f2fs.h |
4146 | @@ -450,7 +450,6 @@ struct f2fs_flush_device { |
4147 | |
4148 | /* for inline stuff */ |
4149 | #define DEF_INLINE_RESERVED_SIZE 1 |
4150 | -#define DEF_MIN_INLINE_SIZE 1 |
4151 | static inline int get_extra_isize(struct inode *inode); |
4152 | static inline int get_inline_xattr_addrs(struct inode *inode); |
4153 | #define MAX_INLINE_DATA(inode) (sizeof(__le32) * \ |
4154 | diff --git a/fs/f2fs/inline.c b/fs/f2fs/inline.c |
4155 | index 115dc219344b..92703efde36e 100644 |
4156 | --- a/fs/f2fs/inline.c |
4157 | +++ b/fs/f2fs/inline.c |
4158 | @@ -661,6 +661,12 @@ int f2fs_read_inline_dir(struct file *file, struct dir_context *ctx, |
4159 | if (IS_ERR(ipage)) |
4160 | return PTR_ERR(ipage); |
4161 | |
4162 | + /* |
4163 | + * f2fs_readdir was protected by inode.i_rwsem, it is safe to access |
4164 | + * ipage without page's lock held. |
4165 | + */ |
4166 | + unlock_page(ipage); |
4167 | + |
4168 | inline_dentry = inline_data_addr(inode, ipage); |
4169 | |
4170 | make_dentry_ptr_inline(inode, &d, inline_dentry); |
4171 | @@ -669,7 +675,7 @@ int f2fs_read_inline_dir(struct file *file, struct dir_context *ctx, |
4172 | if (!err) |
4173 | ctx->pos = d.max; |
4174 | |
4175 | - f2fs_put_page(ipage, 1); |
4176 | + f2fs_put_page(ipage, 0); |
4177 | return err < 0 ? err : 0; |
4178 | } |
4179 | |
4180 | diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c |
4181 | index c9639ef0e8d5..79370b7fa9d2 100644 |
4182 | --- a/fs/f2fs/super.c |
4183 | +++ b/fs/f2fs/super.c |
4184 | @@ -822,12 +822,13 @@ static int parse_options(struct super_block *sb, char *options) |
4185 | "set with inline_xattr option"); |
4186 | return -EINVAL; |
4187 | } |
4188 | - if (!F2FS_OPTION(sbi).inline_xattr_size || |
4189 | - F2FS_OPTION(sbi).inline_xattr_size >= |
4190 | - DEF_ADDRS_PER_INODE - |
4191 | - F2FS_TOTAL_EXTRA_ATTR_SIZE - |
4192 | - DEF_INLINE_RESERVED_SIZE - |
4193 | - DEF_MIN_INLINE_SIZE) { |
4194 | + if (F2FS_OPTION(sbi).inline_xattr_size < |
4195 | + sizeof(struct f2fs_xattr_header) / sizeof(__le32) || |
4196 | + F2FS_OPTION(sbi).inline_xattr_size > |
4197 | + DEF_ADDRS_PER_INODE - |
4198 | + F2FS_TOTAL_EXTRA_ATTR_SIZE / sizeof(__le32) - |
4199 | + DEF_INLINE_RESERVED_SIZE - |
4200 | + MIN_INLINE_DENTRY_SIZE / sizeof(__le32)) { |
4201 | f2fs_msg(sb, KERN_ERR, |
4202 | "inline xattr size is out of range"); |
4203 | return -EINVAL; |
4204 | diff --git a/fs/f2fs/sysfs.c b/fs/f2fs/sysfs.c |
4205 | index 81c0e5337443..98887187af4c 100644 |
4206 | --- a/fs/f2fs/sysfs.c |
4207 | +++ b/fs/f2fs/sysfs.c |
4208 | @@ -273,10 +273,16 @@ out: |
4209 | return count; |
4210 | } |
4211 | |
4212 | - *ui = t; |
4213 | |
4214 | - if (!strcmp(a->attr.name, "iostat_enable") && *ui == 0) |
4215 | - f2fs_reset_iostat(sbi); |
4216 | + if (!strcmp(a->attr.name, "iostat_enable")) { |
4217 | + sbi->iostat_enable = !!t; |
4218 | + if (!sbi->iostat_enable) |
4219 | + f2fs_reset_iostat(sbi); |
4220 | + return count; |
4221 | + } |
4222 | + |
4223 | + *ui = (unsigned int)t; |
4224 | + |
4225 | return count; |
4226 | } |
4227 | |
4228 | diff --git a/fs/f2fs/trace.c b/fs/f2fs/trace.c |
4229 | index a1fcd00bbb2b..8ac1851a21c0 100644 |
4230 | --- a/fs/f2fs/trace.c |
4231 | +++ b/fs/f2fs/trace.c |
4232 | @@ -17,7 +17,7 @@ |
4233 | #include "trace.h" |
4234 | |
4235 | static RADIX_TREE(pids, GFP_ATOMIC); |
4236 | -static struct mutex pids_lock; |
4237 | +static spinlock_t pids_lock; |
4238 | static struct last_io_info last_io; |
4239 | |
4240 | static inline void __print_last_io(void) |
4241 | @@ -61,23 +61,29 @@ void f2fs_trace_pid(struct page *page) |
4242 | |
4243 | set_page_private(page, (unsigned long)pid); |
4244 | |
4245 | +retry: |
4246 | if (radix_tree_preload(GFP_NOFS)) |
4247 | return; |
4248 | |
4249 | - mutex_lock(&pids_lock); |
4250 | + spin_lock(&pids_lock); |
4251 | p = radix_tree_lookup(&pids, pid); |
4252 | if (p == current) |
4253 | goto out; |
4254 | if (p) |
4255 | radix_tree_delete(&pids, pid); |
4256 | |
4257 | - f2fs_radix_tree_insert(&pids, pid, current); |
4258 | + if (radix_tree_insert(&pids, pid, current)) { |
4259 | + spin_unlock(&pids_lock); |
4260 | + radix_tree_preload_end(); |
4261 | + cond_resched(); |
4262 | + goto retry; |
4263 | + } |
4264 | |
4265 | trace_printk("%3x:%3x %4x %-16s\n", |
4266 | MAJOR(inode->i_sb->s_dev), MINOR(inode->i_sb->s_dev), |
4267 | pid, current->comm); |
4268 | out: |
4269 | - mutex_unlock(&pids_lock); |
4270 | + spin_unlock(&pids_lock); |
4271 | radix_tree_preload_end(); |
4272 | } |
4273 | |
4274 | @@ -122,7 +128,7 @@ void f2fs_trace_ios(struct f2fs_io_info *fio, int flush) |
4275 | |
4276 | void f2fs_build_trace_ios(void) |
4277 | { |
4278 | - mutex_init(&pids_lock); |
4279 | + spin_lock_init(&pids_lock); |
4280 | } |
4281 | |
4282 | #define PIDVEC_SIZE 128 |
4283 | @@ -150,7 +156,7 @@ void f2fs_destroy_trace_ios(void) |
4284 | pid_t next_pid = 0; |
4285 | unsigned int found; |
4286 | |
4287 | - mutex_lock(&pids_lock); |
4288 | + spin_lock(&pids_lock); |
4289 | while ((found = gang_lookup_pids(pid, next_pid, PIDVEC_SIZE))) { |
4290 | unsigned idx; |
4291 | |
4292 | @@ -158,5 +164,5 @@ void f2fs_destroy_trace_ios(void) |
4293 | for (idx = 0; idx < found; idx++) |
4294 | radix_tree_delete(&pids, pid[idx]); |
4295 | } |
4296 | - mutex_unlock(&pids_lock); |
4297 | + spin_unlock(&pids_lock); |
4298 | } |
4299 | diff --git a/fs/f2fs/xattr.c b/fs/f2fs/xattr.c |
4300 | index 087e53a2d96c..409a637f7a92 100644 |
4301 | --- a/fs/f2fs/xattr.c |
4302 | +++ b/fs/f2fs/xattr.c |
4303 | @@ -227,11 +227,11 @@ static struct f2fs_xattr_entry *__find_inline_xattr(struct inode *inode, |
4304 | { |
4305 | struct f2fs_xattr_entry *entry; |
4306 | unsigned int inline_size = inline_xattr_size(inode); |
4307 | + void *max_addr = base_addr + inline_size; |
4308 | |
4309 | list_for_each_xattr(entry, base_addr) { |
4310 | - if ((void *)entry + sizeof(__u32) > base_addr + inline_size || |
4311 | - (void *)XATTR_NEXT_ENTRY(entry) + sizeof(__u32) > |
4312 | - base_addr + inline_size) { |
4313 | + if ((void *)entry + sizeof(__u32) > max_addr || |
4314 | + (void *)XATTR_NEXT_ENTRY(entry) > max_addr) { |
4315 | *last_addr = entry; |
4316 | return NULL; |
4317 | } |
4318 | @@ -242,6 +242,13 @@ static struct f2fs_xattr_entry *__find_inline_xattr(struct inode *inode, |
4319 | if (!memcmp(entry->e_name, name, len)) |
4320 | break; |
4321 | } |
4322 | + |
4323 | + /* inline xattr header or entry across max inline xattr size */ |
4324 | + if (IS_XATTR_LAST_ENTRY(entry) && |
4325 | + (void *)entry + sizeof(__u32) > max_addr) { |
4326 | + *last_addr = entry; |
4327 | + return NULL; |
4328 | + } |
4329 | return entry; |
4330 | } |
4331 | |
4332 | diff --git a/fs/file.c b/fs/file.c |
4333 | index 7ffd6e9d103d..780d29e58847 100644 |
4334 | --- a/fs/file.c |
4335 | +++ b/fs/file.c |
4336 | @@ -457,6 +457,7 @@ struct files_struct init_files = { |
4337 | .full_fds_bits = init_files.full_fds_bits_init, |
4338 | }, |
4339 | .file_lock = __SPIN_LOCK_UNLOCKED(init_files.file_lock), |
4340 | + .resize_wait = __WAIT_QUEUE_HEAD_INITIALIZER(init_files.resize_wait), |
4341 | }; |
4342 | |
4343 | static unsigned int find_next_fd(struct fdtable *fdt, unsigned int start) |
4344 | diff --git a/fs/jbd2/commit.c b/fs/jbd2/commit.c |
4345 | index 150cc030b4d7..65ea0355a4f6 100644 |
4346 | --- a/fs/jbd2/commit.c |
4347 | +++ b/fs/jbd2/commit.c |
4348 | @@ -691,9 +691,11 @@ void jbd2_journal_commit_transaction(journal_t *journal) |
4349 | the last tag we set up. */ |
4350 | |
4351 | tag->t_flags |= cpu_to_be16(JBD2_FLAG_LAST_TAG); |
4352 | - |
4353 | - jbd2_descriptor_block_csum_set(journal, descriptor); |
4354 | start_journal_io: |
4355 | + if (descriptor) |
4356 | + jbd2_descriptor_block_csum_set(journal, |
4357 | + descriptor); |
4358 | + |
4359 | for (i = 0; i < bufs; i++) { |
4360 | struct buffer_head *bh = wbuf[i]; |
4361 | /* |
4362 | diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c |
4363 | index 8ef6b6daaa7a..88f2a49338a1 100644 |
4364 | --- a/fs/jbd2/journal.c |
4365 | +++ b/fs/jbd2/journal.c |
4366 | @@ -1356,6 +1356,10 @@ static int journal_reset(journal_t *journal) |
4367 | return jbd2_journal_start_thread(journal); |
4368 | } |
4369 | |
4370 | +/* |
4371 | + * This function expects that the caller will have locked the journal |
4372 | + * buffer head, and will return with it unlocked |
4373 | + */ |
4374 | static int jbd2_write_superblock(journal_t *journal, int write_flags) |
4375 | { |
4376 | struct buffer_head *bh = journal->j_sb_buffer; |
4377 | @@ -1365,7 +1369,6 @@ static int jbd2_write_superblock(journal_t *journal, int write_flags) |
4378 | trace_jbd2_write_superblock(journal, write_flags); |
4379 | if (!(journal->j_flags & JBD2_BARRIER)) |
4380 | write_flags &= ~(REQ_FUA | REQ_PREFLUSH); |
4381 | - lock_buffer(bh); |
4382 | if (buffer_write_io_error(bh)) { |
4383 | /* |
4384 | * Oh, dear. A previous attempt to write the journal |
4385 | @@ -1424,6 +1427,7 @@ int jbd2_journal_update_sb_log_tail(journal_t *journal, tid_t tail_tid, |
4386 | jbd_debug(1, "JBD2: updating superblock (start %lu, seq %u)\n", |
4387 | tail_block, tail_tid); |
4388 | |
4389 | + lock_buffer(journal->j_sb_buffer); |
4390 | sb->s_sequence = cpu_to_be32(tail_tid); |
4391 | sb->s_start = cpu_to_be32(tail_block); |
4392 | |
4393 | @@ -1454,18 +1458,17 @@ static void jbd2_mark_journal_empty(journal_t *journal, int write_op) |
4394 | journal_superblock_t *sb = journal->j_superblock; |
4395 | |
4396 | BUG_ON(!mutex_is_locked(&journal->j_checkpoint_mutex)); |
4397 | - read_lock(&journal->j_state_lock); |
4398 | - /* Is it already empty? */ |
4399 | - if (sb->s_start == 0) { |
4400 | - read_unlock(&journal->j_state_lock); |
4401 | + lock_buffer(journal->j_sb_buffer); |
4402 | + if (sb->s_start == 0) { /* Is it already empty? */ |
4403 | + unlock_buffer(journal->j_sb_buffer); |
4404 | return; |
4405 | } |
4406 | + |
4407 | jbd_debug(1, "JBD2: Marking journal as empty (seq %d)\n", |
4408 | journal->j_tail_sequence); |
4409 | |
4410 | sb->s_sequence = cpu_to_be32(journal->j_tail_sequence); |
4411 | sb->s_start = cpu_to_be32(0); |
4412 | - read_unlock(&journal->j_state_lock); |
4413 | |
4414 | jbd2_write_superblock(journal, write_op); |
4415 | |
4416 | @@ -1488,9 +1491,8 @@ void jbd2_journal_update_sb_errno(journal_t *journal) |
4417 | journal_superblock_t *sb = journal->j_superblock; |
4418 | int errcode; |
4419 | |
4420 | - read_lock(&journal->j_state_lock); |
4421 | + lock_buffer(journal->j_sb_buffer); |
4422 | errcode = journal->j_errno; |
4423 | - read_unlock(&journal->j_state_lock); |
4424 | if (errcode == -ESHUTDOWN) |
4425 | errcode = 0; |
4426 | jbd_debug(1, "JBD2: updating superblock error (errno %d)\n", errcode); |
4427 | @@ -1894,28 +1896,27 @@ int jbd2_journal_set_features (journal_t *journal, unsigned long compat, |
4428 | |
4429 | sb = journal->j_superblock; |
4430 | |
4431 | + /* Load the checksum driver if necessary */ |
4432 | + if ((journal->j_chksum_driver == NULL) && |
4433 | + INCOMPAT_FEATURE_ON(JBD2_FEATURE_INCOMPAT_CSUM_V3)) { |
4434 | + journal->j_chksum_driver = crypto_alloc_shash("crc32c", 0, 0); |
4435 | + if (IS_ERR(journal->j_chksum_driver)) { |
4436 | + printk(KERN_ERR "JBD2: Cannot load crc32c driver.\n"); |
4437 | + journal->j_chksum_driver = NULL; |
4438 | + return 0; |
4439 | + } |
4440 | + /* Precompute checksum seed for all metadata */ |
4441 | + journal->j_csum_seed = jbd2_chksum(journal, ~0, sb->s_uuid, |
4442 | + sizeof(sb->s_uuid)); |
4443 | + } |
4444 | + |
4445 | + lock_buffer(journal->j_sb_buffer); |
4446 | + |
4447 | /* If enabling v3 checksums, update superblock */ |
4448 | if (INCOMPAT_FEATURE_ON(JBD2_FEATURE_INCOMPAT_CSUM_V3)) { |
4449 | sb->s_checksum_type = JBD2_CRC32C_CHKSUM; |
4450 | sb->s_feature_compat &= |
4451 | ~cpu_to_be32(JBD2_FEATURE_COMPAT_CHECKSUM); |
4452 | - |
4453 | - /* Load the checksum driver */ |
4454 | - if (journal->j_chksum_driver == NULL) { |
4455 | - journal->j_chksum_driver = crypto_alloc_shash("crc32c", |
4456 | - 0, 0); |
4457 | - if (IS_ERR(journal->j_chksum_driver)) { |
4458 | - printk(KERN_ERR "JBD2: Cannot load crc32c " |
4459 | - "driver.\n"); |
4460 | - journal->j_chksum_driver = NULL; |
4461 | - return 0; |
4462 | - } |
4463 | - |
4464 | - /* Precompute checksum seed for all metadata */ |
4465 | - journal->j_csum_seed = jbd2_chksum(journal, ~0, |
4466 | - sb->s_uuid, |
4467 | - sizeof(sb->s_uuid)); |
4468 | - } |
4469 | } |
4470 | |
4471 | /* If enabling v1 checksums, downgrade superblock */ |
4472 | @@ -1927,6 +1928,7 @@ int jbd2_journal_set_features (journal_t *journal, unsigned long compat, |
4473 | sb->s_feature_compat |= cpu_to_be32(compat); |
4474 | sb->s_feature_ro_compat |= cpu_to_be32(ro); |
4475 | sb->s_feature_incompat |= cpu_to_be32(incompat); |
4476 | + unlock_buffer(journal->j_sb_buffer); |
4477 | |
4478 | return 1; |
4479 | #undef COMPAT_FEATURE_ON |
4480 | diff --git a/fs/ocfs2/cluster/nodemanager.c b/fs/ocfs2/cluster/nodemanager.c |
4481 | index 0e4166cc23a0..4ac775e32240 100644 |
4482 | --- a/fs/ocfs2/cluster/nodemanager.c |
4483 | +++ b/fs/ocfs2/cluster/nodemanager.c |
4484 | @@ -621,13 +621,15 @@ static void o2nm_node_group_drop_item(struct config_group *group, |
4485 | struct o2nm_node *node = to_o2nm_node(item); |
4486 | struct o2nm_cluster *cluster = to_o2nm_cluster(group->cg_item.ci_parent); |
4487 | |
4488 | - o2net_disconnect_node(node); |
4489 | + if (cluster->cl_nodes[node->nd_num] == node) { |
4490 | + o2net_disconnect_node(node); |
4491 | |
4492 | - if (cluster->cl_has_local && |
4493 | - (cluster->cl_local_node == node->nd_num)) { |
4494 | - cluster->cl_has_local = 0; |
4495 | - cluster->cl_local_node = O2NM_INVALID_NODE_NUM; |
4496 | - o2net_stop_listening(node); |
4497 | + if (cluster->cl_has_local && |
4498 | + (cluster->cl_local_node == node->nd_num)) { |
4499 | + cluster->cl_has_local = 0; |
4500 | + cluster->cl_local_node = O2NM_INVALID_NODE_NUM; |
4501 | + o2net_stop_listening(node); |
4502 | + } |
4503 | } |
4504 | |
4505 | /* XXX call into net to stop this node from trading messages */ |
4506 | diff --git a/fs/read_write.c b/fs/read_write.c |
4507 | index 8a2737f0d61d..562974a0616c 100644 |
4508 | --- a/fs/read_write.c |
4509 | +++ b/fs/read_write.c |
4510 | @@ -1241,6 +1241,9 @@ COMPAT_SYSCALL_DEFINE5(preadv64v2, unsigned long, fd, |
4511 | const struct compat_iovec __user *,vec, |
4512 | unsigned long, vlen, loff_t, pos, rwf_t, flags) |
4513 | { |
4514 | + if (pos == -1) |
4515 | + return do_compat_readv(fd, vec, vlen, flags); |
4516 | + |
4517 | return do_compat_preadv64(fd, vec, vlen, pos, flags); |
4518 | } |
4519 | #endif |
4520 | @@ -1347,6 +1350,9 @@ COMPAT_SYSCALL_DEFINE5(pwritev64v2, unsigned long, fd, |
4521 | const struct compat_iovec __user *,vec, |
4522 | unsigned long, vlen, loff_t, pos, rwf_t, flags) |
4523 | { |
4524 | + if (pos == -1) |
4525 | + return do_compat_writev(fd, vec, vlen, flags); |
4526 | + |
4527 | return do_compat_pwritev64(fd, vec, vlen, pos, flags); |
4528 | } |
4529 | #endif |
4530 | diff --git a/include/linux/cgroup-defs.h b/include/linux/cgroup-defs.h |
4531 | index 22254c1fe1c5..6002275937f5 100644 |
4532 | --- a/include/linux/cgroup-defs.h |
4533 | +++ b/include/linux/cgroup-defs.h |
4534 | @@ -597,7 +597,7 @@ struct cgroup_subsys { |
4535 | void (*cancel_fork)(struct task_struct *task); |
4536 | void (*fork)(struct task_struct *task); |
4537 | void (*exit)(struct task_struct *task); |
4538 | - void (*free)(struct task_struct *task); |
4539 | + void (*release)(struct task_struct *task); |
4540 | void (*bind)(struct cgroup_subsys_state *root_css); |
4541 | |
4542 | bool early_init:1; |
4543 | diff --git a/include/linux/cgroup.h b/include/linux/cgroup.h |
4544 | index 32c553556bbd..ca51b2c15bcc 100644 |
4545 | --- a/include/linux/cgroup.h |
4546 | +++ b/include/linux/cgroup.h |
4547 | @@ -119,6 +119,7 @@ extern int cgroup_can_fork(struct task_struct *p); |
4548 | extern void cgroup_cancel_fork(struct task_struct *p); |
4549 | extern void cgroup_post_fork(struct task_struct *p); |
4550 | void cgroup_exit(struct task_struct *p); |
4551 | +void cgroup_release(struct task_struct *p); |
4552 | void cgroup_free(struct task_struct *p); |
4553 | |
4554 | int cgroup_init_early(void); |
4555 | @@ -699,6 +700,7 @@ static inline int cgroup_can_fork(struct task_struct *p) { return 0; } |
4556 | static inline void cgroup_cancel_fork(struct task_struct *p) {} |
4557 | static inline void cgroup_post_fork(struct task_struct *p) {} |
4558 | static inline void cgroup_exit(struct task_struct *p) {} |
4559 | +static inline void cgroup_release(struct task_struct *p) {} |
4560 | static inline void cgroup_free(struct task_struct *p) {} |
4561 | |
4562 | static inline int cgroup_init_early(void) { return 0; } |
4563 | diff --git a/include/linux/clk-provider.h b/include/linux/clk-provider.h |
4564 | index 08b1aa70a38d..d1b6d2c3ada6 100644 |
4565 | --- a/include/linux/clk-provider.h |
4566 | +++ b/include/linux/clk-provider.h |
4567 | @@ -782,6 +782,9 @@ unsigned int __clk_get_enable_count(struct clk *clk); |
4568 | unsigned long clk_hw_get_rate(const struct clk_hw *hw); |
4569 | unsigned long __clk_get_flags(struct clk *clk); |
4570 | unsigned long clk_hw_get_flags(const struct clk_hw *hw); |
4571 | +#define clk_hw_can_set_rate_parent(hw) \ |
4572 | + (clk_hw_get_flags((hw)) & CLK_SET_RATE_PARENT) |
4573 | + |
4574 | bool clk_hw_is_prepared(const struct clk_hw *hw); |
4575 | bool clk_hw_rate_is_protected(const struct clk_hw *hw); |
4576 | bool clk_hw_is_enabled(const struct clk_hw *hw); |
4577 | diff --git a/include/linux/f2fs_fs.h b/include/linux/f2fs_fs.h |
4578 | index f70f8ac9c4f4..40fec5f94949 100644 |
4579 | --- a/include/linux/f2fs_fs.h |
4580 | +++ b/include/linux/f2fs_fs.h |
4581 | @@ -489,12 +489,12 @@ typedef __le32 f2fs_hash_t; |
4582 | |
4583 | /* |
4584 | * space utilization of regular dentry and inline dentry (w/o extra reservation) |
4585 | - * regular dentry inline dentry |
4586 | - * bitmap 1 * 27 = 27 1 * 23 = 23 |
4587 | - * reserved 1 * 3 = 3 1 * 7 = 7 |
4588 | - * dentry 11 * 214 = 2354 11 * 182 = 2002 |
4589 | - * filename 8 * 214 = 1712 8 * 182 = 1456 |
4590 | - * total 4096 3488 |
4591 | + * regular dentry inline dentry (def) inline dentry (min) |
4592 | + * bitmap 1 * 27 = 27 1 * 23 = 23 1 * 1 = 1 |
4593 | + * reserved 1 * 3 = 3 1 * 7 = 7 1 * 1 = 1 |
4594 | + * dentry 11 * 214 = 2354 11 * 182 = 2002 11 * 2 = 22 |
4595 | + * filename 8 * 214 = 1712 8 * 182 = 1456 8 * 2 = 16 |
4596 | + * total 4096 3488 40 |
4597 | * |
4598 | * Note: there are more reserved space in inline dentry than in regular |
4599 | * dentry, when converting inline dentry we should handle this carefully. |
4600 | @@ -506,6 +506,7 @@ typedef __le32 f2fs_hash_t; |
4601 | #define SIZE_OF_RESERVED (PAGE_SIZE - ((SIZE_OF_DIR_ENTRY + \ |
4602 | F2FS_SLOT_LEN) * \ |
4603 | NR_DENTRY_IN_BLOCK + SIZE_OF_DENTRY_BITMAP)) |
4604 | +#define MIN_INLINE_DENTRY_SIZE 40 /* just include '.' and '..' entries */ |
4605 | |
4606 | /* One directory entry slot representing F2FS_SLOT_LEN-sized file name */ |
4607 | struct f2fs_dir_entry { |
4608 | diff --git a/include/linux/filter.h b/include/linux/filter.h |
4609 | index 1a39d57eb88f..037610845892 100644 |
4610 | --- a/include/linux/filter.h |
4611 | +++ b/include/linux/filter.h |
4612 | @@ -844,7 +844,9 @@ bpf_jit_binary_alloc(unsigned int proglen, u8 **image_ptr, |
4613 | unsigned int alignment, |
4614 | bpf_jit_fill_hole_t bpf_fill_ill_insns); |
4615 | void bpf_jit_binary_free(struct bpf_binary_header *hdr); |
4616 | - |
4617 | +u64 bpf_jit_alloc_exec_limit(void); |
4618 | +void *bpf_jit_alloc_exec(unsigned long size); |
4619 | +void bpf_jit_free_exec(void *addr); |
4620 | void bpf_jit_free(struct bpf_prog *fp); |
4621 | |
4622 | struct bpf_prog *bpf_jit_blind_constants(struct bpf_prog *fp); |
4623 | diff --git a/include/linux/irqdesc.h b/include/linux/irqdesc.h |
4624 | index dd1e40ddac7d..875c41b23f20 100644 |
4625 | --- a/include/linux/irqdesc.h |
4626 | +++ b/include/linux/irqdesc.h |
4627 | @@ -65,6 +65,7 @@ struct irq_desc { |
4628 | unsigned int core_internal_state__do_not_mess_with_it; |
4629 | unsigned int depth; /* nested irq disables */ |
4630 | unsigned int wake_depth; /* nested wake enables */ |
4631 | + unsigned int tot_count; |
4632 | unsigned int irq_count; /* For detecting broken IRQs */ |
4633 | unsigned long last_unhandled; /* Aging timer for unhandled count */ |
4634 | unsigned int irqs_unhandled; |
4635 | diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h |
4636 | index c2876e740514..42fc852bf512 100644 |
4637 | --- a/include/linux/perf_event.h |
4638 | +++ b/include/linux/perf_event.h |
4639 | @@ -409,7 +409,7 @@ struct pmu { |
4640 | /* |
4641 | * Set up pmu-private data structures for an AUX area |
4642 | */ |
4643 | - void *(*setup_aux) (int cpu, void **pages, |
4644 | + void *(*setup_aux) (struct perf_event *event, void **pages, |
4645 | int nr_pages, bool overwrite); |
4646 | /* optional */ |
4647 | |
4648 | diff --git a/include/linux/relay.h b/include/linux/relay.h |
4649 | index e1bdf01a86e2..c759f96e39c1 100644 |
4650 | --- a/include/linux/relay.h |
4651 | +++ b/include/linux/relay.h |
4652 | @@ -66,7 +66,7 @@ struct rchan |
4653 | struct kref kref; /* channel refcount */ |
4654 | void *private_data; /* for user-defined data */ |
4655 | size_t last_toobig; /* tried to log event > subbuf size */ |
4656 | - struct rchan_buf ** __percpu buf; /* per-cpu channel buffers */ |
4657 | + struct rchan_buf * __percpu *buf; /* per-cpu channel buffers */ |
4658 | int is_global; /* One global buffer ? */ |
4659 | struct list_head list; /* for channel list */ |
4660 | struct dentry *parent; /* parent dentry passed to open */ |
4661 | diff --git a/include/linux/ring_buffer.h b/include/linux/ring_buffer.h |
4662 | index 0940fda59872..941bfd9b3c89 100644 |
4663 | --- a/include/linux/ring_buffer.h |
4664 | +++ b/include/linux/ring_buffer.h |
4665 | @@ -128,7 +128,7 @@ ring_buffer_consume(struct ring_buffer *buffer, int cpu, u64 *ts, |
4666 | unsigned long *lost_events); |
4667 | |
4668 | struct ring_buffer_iter * |
4669 | -ring_buffer_read_prepare(struct ring_buffer *buffer, int cpu); |
4670 | +ring_buffer_read_prepare(struct ring_buffer *buffer, int cpu, gfp_t flags); |
4671 | void ring_buffer_read_prepare_sync(void); |
4672 | void ring_buffer_read_start(struct ring_buffer_iter *iter); |
4673 | void ring_buffer_read_finish(struct ring_buffer_iter *iter); |
4674 | diff --git a/include/linux/sched.h b/include/linux/sched.h |
4675 | index 4abb5bd74b04..5dc024e28397 100644 |
4676 | --- a/include/linux/sched.h |
4677 | +++ b/include/linux/sched.h |
4678 | @@ -1737,9 +1737,9 @@ static __always_inline bool need_resched(void) |
4679 | static inline unsigned int task_cpu(const struct task_struct *p) |
4680 | { |
4681 | #ifdef CONFIG_THREAD_INFO_IN_TASK |
4682 | - return p->cpu; |
4683 | + return READ_ONCE(p->cpu); |
4684 | #else |
4685 | - return task_thread_info(p)->cpu; |
4686 | + return READ_ONCE(task_thread_info(p)->cpu); |
4687 | #endif |
4688 | } |
4689 | |
4690 | diff --git a/include/linux/sched/topology.h b/include/linux/sched/topology.h |
4691 | index 26347741ba50..15f3f61f7e3b 100644 |
4692 | --- a/include/linux/sched/topology.h |
4693 | +++ b/include/linux/sched/topology.h |
4694 | @@ -177,10 +177,10 @@ typedef int (*sched_domain_flags_f)(void); |
4695 | #define SDTL_OVERLAP 0x01 |
4696 | |
4697 | struct sd_data { |
4698 | - struct sched_domain **__percpu sd; |
4699 | - struct sched_domain_shared **__percpu sds; |
4700 | - struct sched_group **__percpu sg; |
4701 | - struct sched_group_capacity **__percpu sgc; |
4702 | + struct sched_domain *__percpu *sd; |
4703 | + struct sched_domain_shared *__percpu *sds; |
4704 | + struct sched_group *__percpu *sg; |
4705 | + struct sched_group_capacity *__percpu *sgc; |
4706 | }; |
4707 | |
4708 | struct sched_domain_topology_level { |
4709 | diff --git a/include/net/netfilter/br_netfilter.h b/include/net/netfilter/br_netfilter.h |
4710 | index 74af19c3a8f7..a4ba601b5d04 100644 |
4711 | --- a/include/net/netfilter/br_netfilter.h |
4712 | +++ b/include/net/netfilter/br_netfilter.h |
4713 | @@ -49,7 +49,6 @@ static inline struct rtable *bridge_parent_rtable(const struct net_device *dev) |
4714 | } |
4715 | |
4716 | struct net_device *setup_pre_routing(struct sk_buff *skb); |
4717 | -void br_netfilter_enable(void); |
4718 | |
4719 | #if IS_ENABLED(CONFIG_IPV6) |
4720 | int br_validate_ipv6(struct net *net, struct sk_buff *skb); |
4721 | diff --git a/include/scsi/libfcoe.h b/include/scsi/libfcoe.h |
4722 | index cb8a273732cf..bb8092fa1e36 100644 |
4723 | --- a/include/scsi/libfcoe.h |
4724 | +++ b/include/scsi/libfcoe.h |
4725 | @@ -79,7 +79,7 @@ enum fip_state { |
4726 | * It must not change after fcoe_ctlr_init() sets it. |
4727 | */ |
4728 | enum fip_mode { |
4729 | - FIP_MODE_AUTO = FIP_ST_AUTO, |
4730 | + FIP_MODE_AUTO, |
4731 | FIP_MODE_NON_FIP, |
4732 | FIP_MODE_FABRIC, |
4733 | FIP_MODE_VN2VN, |
4734 | @@ -250,7 +250,7 @@ struct fcoe_rport { |
4735 | }; |
4736 | |
4737 | /* FIP API functions */ |
4738 | -void fcoe_ctlr_init(struct fcoe_ctlr *, enum fip_state); |
4739 | +void fcoe_ctlr_init(struct fcoe_ctlr *, enum fip_mode); |
4740 | void fcoe_ctlr_destroy(struct fcoe_ctlr *); |
4741 | void fcoe_ctlr_link_up(struct fcoe_ctlr *); |
4742 | int fcoe_ctlr_link_down(struct fcoe_ctlr *); |
4743 | diff --git a/kernel/cgroup/cgroup.c b/kernel/cgroup/cgroup.c |
4744 | index e710ac7fbbbf..63dae7e0ccae 100644 |
4745 | --- a/kernel/cgroup/cgroup.c |
4746 | +++ b/kernel/cgroup/cgroup.c |
4747 | @@ -195,7 +195,7 @@ static u64 css_serial_nr_next = 1; |
4748 | */ |
4749 | static u16 have_fork_callback __read_mostly; |
4750 | static u16 have_exit_callback __read_mostly; |
4751 | -static u16 have_free_callback __read_mostly; |
4752 | +static u16 have_release_callback __read_mostly; |
4753 | static u16 have_canfork_callback __read_mostly; |
4754 | |
4755 | /* cgroup namespace for init task */ |
4756 | @@ -5240,7 +5240,7 @@ static void __init cgroup_init_subsys(struct cgroup_subsys *ss, bool early) |
4757 | |
4758 | have_fork_callback |= (bool)ss->fork << ss->id; |
4759 | have_exit_callback |= (bool)ss->exit << ss->id; |
4760 | - have_free_callback |= (bool)ss->free << ss->id; |
4761 | + have_release_callback |= (bool)ss->release << ss->id; |
4762 | have_canfork_callback |= (bool)ss->can_fork << ss->id; |
4763 | |
4764 | /* At system boot, before all subsystems have been |
4765 | @@ -5676,16 +5676,19 @@ void cgroup_exit(struct task_struct *tsk) |
4766 | } while_each_subsys_mask(); |
4767 | } |
4768 | |
4769 | -void cgroup_free(struct task_struct *task) |
4770 | +void cgroup_release(struct task_struct *task) |
4771 | { |
4772 | - struct css_set *cset = task_css_set(task); |
4773 | struct cgroup_subsys *ss; |
4774 | int ssid; |
4775 | |
4776 | - do_each_subsys_mask(ss, ssid, have_free_callback) { |
4777 | - ss->free(task); |
4778 | + do_each_subsys_mask(ss, ssid, have_release_callback) { |
4779 | + ss->release(task); |
4780 | } while_each_subsys_mask(); |
4781 | +} |
4782 | |
4783 | +void cgroup_free(struct task_struct *task) |
4784 | +{ |
4785 | + struct css_set *cset = task_css_set(task); |
4786 | put_css_set(cset); |
4787 | } |
4788 | |
4789 | diff --git a/kernel/cgroup/pids.c b/kernel/cgroup/pids.c |
4790 | index 9829c67ebc0a..c9960baaa14f 100644 |
4791 | --- a/kernel/cgroup/pids.c |
4792 | +++ b/kernel/cgroup/pids.c |
4793 | @@ -247,7 +247,7 @@ static void pids_cancel_fork(struct task_struct *task) |
4794 | pids_uncharge(pids, 1); |
4795 | } |
4796 | |
4797 | -static void pids_free(struct task_struct *task) |
4798 | +static void pids_release(struct task_struct *task) |
4799 | { |
4800 | struct pids_cgroup *pids = css_pids(task_css(task, pids_cgrp_id)); |
4801 | |
4802 | @@ -342,7 +342,7 @@ struct cgroup_subsys pids_cgrp_subsys = { |
4803 | .cancel_attach = pids_cancel_attach, |
4804 | .can_fork = pids_can_fork, |
4805 | .cancel_fork = pids_cancel_fork, |
4806 | - .free = pids_free, |
4807 | + .release = pids_release, |
4808 | .legacy_cftypes = pids_files, |
4809 | .dfl_cftypes = pids_files, |
4810 | .threaded = true, |
4811 | diff --git a/kernel/cgroup/rstat.c b/kernel/cgroup/rstat.c |
4812 | index d503d1a9007c..bb95a35e8c2d 100644 |
4813 | --- a/kernel/cgroup/rstat.c |
4814 | +++ b/kernel/cgroup/rstat.c |
4815 | @@ -87,7 +87,6 @@ static struct cgroup *cgroup_rstat_cpu_pop_updated(struct cgroup *pos, |
4816 | struct cgroup *root, int cpu) |
4817 | { |
4818 | struct cgroup_rstat_cpu *rstatc; |
4819 | - struct cgroup *parent; |
4820 | |
4821 | if (pos == root) |
4822 | return NULL; |
4823 | @@ -115,8 +114,8 @@ static struct cgroup *cgroup_rstat_cpu_pop_updated(struct cgroup *pos, |
4824 | * However, due to the way we traverse, @pos will be the first |
4825 | * child in most cases. The only exception is @root. |
4826 | */ |
4827 | - parent = cgroup_parent(pos); |
4828 | - if (parent && rstatc->updated_next) { |
4829 | + if (rstatc->updated_next) { |
4830 | + struct cgroup *parent = cgroup_parent(pos); |
4831 | struct cgroup_rstat_cpu *prstatc = cgroup_rstat_cpu(parent, cpu); |
4832 | struct cgroup_rstat_cpu *nrstatc; |
4833 | struct cgroup **nextp; |
4834 | @@ -140,9 +139,12 @@ static struct cgroup *cgroup_rstat_cpu_pop_updated(struct cgroup *pos, |
4835 | * updated stat. |
4836 | */ |
4837 | smp_mb(); |
4838 | + |
4839 | + return pos; |
4840 | } |
4841 | |
4842 | - return pos; |
4843 | + /* only happens for @root */ |
4844 | + return NULL; |
4845 | } |
4846 | |
4847 | /* see cgroup_rstat_flush() */ |
4848 | diff --git a/kernel/cpu.c b/kernel/cpu.c |
4849 | index 9d0ecc4a0e79..dc250ec2c096 100644 |
4850 | --- a/kernel/cpu.c |
4851 | +++ b/kernel/cpu.c |
4852 | @@ -313,6 +313,15 @@ void cpus_write_unlock(void) |
4853 | |
4854 | void lockdep_assert_cpus_held(void) |
4855 | { |
4856 | + /* |
4857 | + * We can't have hotplug operations before userspace starts running, |
4858 | + * and some init codepaths will knowingly not take the hotplug lock. |
4859 | + * This is all valid, so mute lockdep until it makes sense to report |
4860 | + * unheld locks. |
4861 | + */ |
4862 | + if (system_state < SYSTEM_RUNNING) |
4863 | + return; |
4864 | + |
4865 | percpu_rwsem_assert_held(&cpu_hotplug_lock); |
4866 | } |
4867 | |
4868 | diff --git a/kernel/events/ring_buffer.c b/kernel/events/ring_buffer.c |
4869 | index 5631af940316..474b2ccdbe69 100644 |
4870 | --- a/kernel/events/ring_buffer.c |
4871 | +++ b/kernel/events/ring_buffer.c |
4872 | @@ -648,7 +648,7 @@ int rb_alloc_aux(struct ring_buffer *rb, struct perf_event *event, |
4873 | goto out; |
4874 | } |
4875 | |
4876 | - rb->aux_priv = event->pmu->setup_aux(event->cpu, rb->aux_pages, nr_pages, |
4877 | + rb->aux_priv = event->pmu->setup_aux(event, rb->aux_pages, nr_pages, |
4878 | overwrite); |
4879 | if (!rb->aux_priv) |
4880 | goto out; |
4881 | diff --git a/kernel/exit.c b/kernel/exit.c |
4882 | index d607e23fd0c3..5c0964dc805a 100644 |
4883 | --- a/kernel/exit.c |
4884 | +++ b/kernel/exit.c |
4885 | @@ -219,6 +219,7 @@ repeat: |
4886 | } |
4887 | |
4888 | write_unlock_irq(&tasklist_lock); |
4889 | + cgroup_release(p); |
4890 | release_thread(p); |
4891 | call_rcu(&p->rcu, delayed_put_task_struct); |
4892 | |
4893 | diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c |
4894 | index a2b3d9de999c..811009ebacd4 100644 |
4895 | --- a/kernel/irq/chip.c |
4896 | +++ b/kernel/irq/chip.c |
4897 | @@ -855,7 +855,11 @@ void handle_percpu_irq(struct irq_desc *desc) |
4898 | { |
4899 | struct irq_chip *chip = irq_desc_get_chip(desc); |
4900 | |
4901 | - kstat_incr_irqs_this_cpu(desc); |
4902 | + /* |
4903 | + * PER CPU interrupts are not serialized. Do not touch |
4904 | + * desc->tot_count. |
4905 | + */ |
4906 | + __kstat_incr_irqs_this_cpu(desc); |
4907 | |
4908 | if (chip->irq_ack) |
4909 | chip->irq_ack(&desc->irq_data); |
4910 | @@ -884,7 +888,11 @@ void handle_percpu_devid_irq(struct irq_desc *desc) |
4911 | unsigned int irq = irq_desc_get_irq(desc); |
4912 | irqreturn_t res; |
4913 | |
4914 | - kstat_incr_irqs_this_cpu(desc); |
4915 | + /* |
4916 | + * PER CPU interrupts are not serialized. Do not touch |
4917 | + * desc->tot_count. |
4918 | + */ |
4919 | + __kstat_incr_irqs_this_cpu(desc); |
4920 | |
4921 | if (chip->irq_ack) |
4922 | chip->irq_ack(&desc->irq_data); |
4923 | diff --git a/kernel/irq/internals.h b/kernel/irq/internals.h |
4924 | index ca6afa267070..e74e7eea76cf 100644 |
4925 | --- a/kernel/irq/internals.h |
4926 | +++ b/kernel/irq/internals.h |
4927 | @@ -242,12 +242,18 @@ static inline void irq_state_set_masked(struct irq_desc *desc) |
4928 | |
4929 | #undef __irqd_to_state |
4930 | |
4931 | -static inline void kstat_incr_irqs_this_cpu(struct irq_desc *desc) |
4932 | +static inline void __kstat_incr_irqs_this_cpu(struct irq_desc *desc) |
4933 | { |
4934 | __this_cpu_inc(*desc->kstat_irqs); |
4935 | __this_cpu_inc(kstat.irqs_sum); |
4936 | } |
4937 | |
4938 | +static inline void kstat_incr_irqs_this_cpu(struct irq_desc *desc) |
4939 | +{ |
4940 | + __kstat_incr_irqs_this_cpu(desc); |
4941 | + desc->tot_count++; |
4942 | +} |
4943 | + |
4944 | static inline int irq_desc_get_node(struct irq_desc *desc) |
4945 | { |
4946 | return irq_common_data_get_node(&desc->irq_common_data); |
4947 | diff --git a/kernel/irq/irqdesc.c b/kernel/irq/irqdesc.c |
4948 | index 578d0e5f1b5b..ba454cba4069 100644 |
4949 | --- a/kernel/irq/irqdesc.c |
4950 | +++ b/kernel/irq/irqdesc.c |
4951 | @@ -119,6 +119,7 @@ static void desc_set_defaults(unsigned int irq, struct irq_desc *desc, int node, |
4952 | desc->depth = 1; |
4953 | desc->irq_count = 0; |
4954 | desc->irqs_unhandled = 0; |
4955 | + desc->tot_count = 0; |
4956 | desc->name = NULL; |
4957 | desc->owner = owner; |
4958 | for_each_possible_cpu(cpu) |
4959 | @@ -915,11 +916,15 @@ unsigned int kstat_irqs_cpu(unsigned int irq, int cpu) |
4960 | unsigned int kstat_irqs(unsigned int irq) |
4961 | { |
4962 | struct irq_desc *desc = irq_to_desc(irq); |
4963 | - int cpu; |
4964 | unsigned int sum = 0; |
4965 | + int cpu; |
4966 | |
4967 | if (!desc || !desc->kstat_irqs) |
4968 | return 0; |
4969 | + if (!irq_settings_is_per_cpu_devid(desc) && |
4970 | + !irq_settings_is_per_cpu(desc)) |
4971 | + return desc->tot_count; |
4972 | + |
4973 | for_each_possible_cpu(cpu) |
4974 | sum += *per_cpu_ptr(desc->kstat_irqs, cpu); |
4975 | return sum; |
4976 | diff --git a/kernel/rcu/update.c b/kernel/rcu/update.c |
4977 | index 39cb23d22109..81688a133552 100644 |
4978 | --- a/kernel/rcu/update.c |
4979 | +++ b/kernel/rcu/update.c |
4980 | @@ -52,6 +52,7 @@ |
4981 | #include <linux/tick.h> |
4982 | #include <linux/rcupdate_wait.h> |
4983 | #include <linux/sched/isolation.h> |
4984 | +#include <linux/kprobes.h> |
4985 | |
4986 | #define CREATE_TRACE_POINTS |
4987 | |
4988 | @@ -253,6 +254,7 @@ int notrace debug_lockdep_rcu_enabled(void) |
4989 | current->lockdep_recursion == 0; |
4990 | } |
4991 | EXPORT_SYMBOL_GPL(debug_lockdep_rcu_enabled); |
4992 | +NOKPROBE_SYMBOL(debug_lockdep_rcu_enabled); |
4993 | |
4994 | /** |
4995 | * rcu_read_lock_held() - might we be in RCU read-side critical section? |
4996 | diff --git a/kernel/sched/core.c b/kernel/sched/core.c |
4997 | index 152a0b0c91bb..9a4f57d7e931 100644 |
4998 | --- a/kernel/sched/core.c |
4999 | +++ b/kernel/sched/core.c |
5000 | @@ -107,11 +107,12 @@ struct rq *task_rq_lock(struct task_struct *p, struct rq_flags *rf) |
5001 | * [L] ->on_rq |
5002 | * RELEASE (rq->lock) |
5003 | * |
5004 | - * If we observe the old CPU in task_rq_lock, the acquire of |
5005 | + * If we observe the old CPU in task_rq_lock(), the acquire of |
5006 | * the old rq->lock will fully serialize against the stores. |
5007 | * |
5008 | - * If we observe the new CPU in task_rq_lock, the acquire will |
5009 | - * pair with the WMB to ensure we must then also see migrating. |
5010 | + * If we observe the new CPU in task_rq_lock(), the address |
5011 | + * dependency headed by '[L] rq = task_rq()' and the acquire |
5012 | + * will pair with the WMB to ensure we then also see migrating. |
5013 | */ |
5014 | if (likely(rq == task_rq(p) && !task_on_rq_migrating(p))) { |
5015 | rq_pin_lock(rq, rf); |
5016 | @@ -910,7 +911,7 @@ static struct rq *move_queued_task(struct rq *rq, struct rq_flags *rf, |
5017 | { |
5018 | lockdep_assert_held(&rq->lock); |
5019 | |
5020 | - p->on_rq = TASK_ON_RQ_MIGRATING; |
5021 | + WRITE_ONCE(p->on_rq, TASK_ON_RQ_MIGRATING); |
5022 | dequeue_task(rq, p, DEQUEUE_NOCLOCK); |
5023 | set_task_cpu(p, new_cpu); |
5024 | rq_unlock(rq, rf); |
5025 | diff --git a/kernel/sched/debug.c b/kernel/sched/debug.c |
5026 | index 6383aa6a60ca..141ea9ff210e 100644 |
5027 | --- a/kernel/sched/debug.c |
5028 | +++ b/kernel/sched/debug.c |
5029 | @@ -315,6 +315,7 @@ void register_sched_domain_sysctl(void) |
5030 | { |
5031 | static struct ctl_table *cpu_entries; |
5032 | static struct ctl_table **cpu_idx; |
5033 | + static bool init_done = false; |
5034 | char buf[32]; |
5035 | int i; |
5036 | |
5037 | @@ -344,7 +345,10 @@ void register_sched_domain_sysctl(void) |
5038 | if (!cpumask_available(sd_sysctl_cpus)) { |
5039 | if (!alloc_cpumask_var(&sd_sysctl_cpus, GFP_KERNEL)) |
5040 | return; |
5041 | + } |
5042 | |
5043 | + if (!init_done) { |
5044 | + init_done = true; |
5045 | /* init to possible to not have holes in @cpu_entries */ |
5046 | cpumask_copy(sd_sysctl_cpus, cpu_possible_mask); |
5047 | } |
5048 | diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h |
5049 | index b63172288f7b..4c7a837d7c14 100644 |
5050 | --- a/kernel/sched/sched.h |
5051 | +++ b/kernel/sched/sched.h |
5052 | @@ -1331,9 +1331,9 @@ static inline void __set_task_cpu(struct task_struct *p, unsigned int cpu) |
5053 | */ |
5054 | smp_wmb(); |
5055 | #ifdef CONFIG_THREAD_INFO_IN_TASK |
5056 | - p->cpu = cpu; |
5057 | + WRITE_ONCE(p->cpu, cpu); |
5058 | #else |
5059 | - task_thread_info(p)->cpu = cpu; |
5060 | + WRITE_ONCE(task_thread_info(p)->cpu, cpu); |
5061 | #endif |
5062 | p->wake_cpu = cpu; |
5063 | #endif |
5064 | @@ -1434,7 +1434,7 @@ static inline int task_on_rq_queued(struct task_struct *p) |
5065 | |
5066 | static inline int task_on_rq_migrating(struct task_struct *p) |
5067 | { |
5068 | - return p->on_rq == TASK_ON_RQ_MIGRATING; |
5069 | + return READ_ONCE(p->on_rq) == TASK_ON_RQ_MIGRATING; |
5070 | } |
5071 | |
5072 | /* |
5073 | diff --git a/kernel/sched/topology.c b/kernel/sched/topology.c |
5074 | index 505a41c42b96..c0a751464971 100644 |
5075 | --- a/kernel/sched/topology.c |
5076 | +++ b/kernel/sched/topology.c |
5077 | @@ -477,7 +477,7 @@ cpu_attach_domain(struct sched_domain *sd, struct root_domain *rd, int cpu) |
5078 | } |
5079 | |
5080 | struct s_data { |
5081 | - struct sched_domain ** __percpu sd; |
5082 | + struct sched_domain * __percpu *sd; |
5083 | struct root_domain *rd; |
5084 | }; |
5085 | |
5086 | diff --git a/kernel/sysctl.c b/kernel/sysctl.c |
5087 | index 3b86acd5de4e..9e22660153ff 100644 |
5088 | --- a/kernel/sysctl.c |
5089 | +++ b/kernel/sysctl.c |
5090 | @@ -126,6 +126,7 @@ static int __maybe_unused one = 1; |
5091 | static int __maybe_unused two = 2; |
5092 | static int __maybe_unused four = 4; |
5093 | static unsigned long one_ul = 1; |
5094 | +static unsigned long long_max = LONG_MAX; |
5095 | static int one_hundred = 100; |
5096 | static int one_thousand = 1000; |
5097 | #ifdef CONFIG_PRINTK |
5098 | @@ -1695,6 +1696,8 @@ static struct ctl_table fs_table[] = { |
5099 | .maxlen = sizeof(files_stat.max_files), |
5100 | .mode = 0644, |
5101 | .proc_handler = proc_doulongvec_minmax, |
5102 | + .extra1 = &zero, |
5103 | + .extra2 = &long_max, |
5104 | }, |
5105 | { |
5106 | .procname = "nr_open", |
5107 | diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c |
5108 | index 65bd4616220d..34b4c32b0692 100644 |
5109 | --- a/kernel/trace/ring_buffer.c |
5110 | +++ b/kernel/trace/ring_buffer.c |
5111 | @@ -4141,6 +4141,7 @@ EXPORT_SYMBOL_GPL(ring_buffer_consume); |
5112 | * ring_buffer_read_prepare - Prepare for a non consuming read of the buffer |
5113 | * @buffer: The ring buffer to read from |
5114 | * @cpu: The cpu buffer to iterate over |
5115 | + * @flags: gfp flags to use for memory allocation |
5116 | * |
5117 | * This performs the initial preparations necessary to iterate |
5118 | * through the buffer. Memory is allocated, buffer recording |
5119 | @@ -4158,7 +4159,7 @@ EXPORT_SYMBOL_GPL(ring_buffer_consume); |
5120 | * This overall must be paired with ring_buffer_read_finish. |
5121 | */ |
5122 | struct ring_buffer_iter * |
5123 | -ring_buffer_read_prepare(struct ring_buffer *buffer, int cpu) |
5124 | +ring_buffer_read_prepare(struct ring_buffer *buffer, int cpu, gfp_t flags) |
5125 | { |
5126 | struct ring_buffer_per_cpu *cpu_buffer; |
5127 | struct ring_buffer_iter *iter; |
5128 | @@ -4166,7 +4167,7 @@ ring_buffer_read_prepare(struct ring_buffer *buffer, int cpu) |
5129 | if (!cpumask_test_cpu(cpu, buffer->cpumask)) |
5130 | return NULL; |
5131 | |
5132 | - iter = kmalloc(sizeof(*iter), GFP_KERNEL); |
5133 | + iter = kmalloc(sizeof(*iter), flags); |
5134 | if (!iter) |
5135 | return NULL; |
5136 | |
5137 | diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c |
5138 | index 1f96b292df31..c65cea71d1ee 100644 |
5139 | --- a/kernel/trace/trace.c |
5140 | +++ b/kernel/trace/trace.c |
5141 | @@ -3903,7 +3903,8 @@ __tracing_open(struct inode *inode, struct file *file, bool snapshot) |
5142 | if (iter->cpu_file == RING_BUFFER_ALL_CPUS) { |
5143 | for_each_tracing_cpu(cpu) { |
5144 | iter->buffer_iter[cpu] = |
5145 | - ring_buffer_read_prepare(iter->trace_buffer->buffer, cpu); |
5146 | + ring_buffer_read_prepare(iter->trace_buffer->buffer, |
5147 | + cpu, GFP_KERNEL); |
5148 | } |
5149 | ring_buffer_read_prepare_sync(); |
5150 | for_each_tracing_cpu(cpu) { |
5151 | @@ -3913,7 +3914,8 @@ __tracing_open(struct inode *inode, struct file *file, bool snapshot) |
5152 | } else { |
5153 | cpu = iter->cpu_file; |
5154 | iter->buffer_iter[cpu] = |
5155 | - ring_buffer_read_prepare(iter->trace_buffer->buffer, cpu); |
5156 | + ring_buffer_read_prepare(iter->trace_buffer->buffer, |
5157 | + cpu, GFP_KERNEL); |
5158 | ring_buffer_read_prepare_sync(); |
5159 | ring_buffer_read_start(iter->buffer_iter[cpu]); |
5160 | tracing_iter_reset(iter, cpu); |
5161 | diff --git a/kernel/trace/trace_kdb.c b/kernel/trace/trace_kdb.c |
5162 | index d953c163a079..810d78a8d14c 100644 |
5163 | --- a/kernel/trace/trace_kdb.c |
5164 | +++ b/kernel/trace/trace_kdb.c |
5165 | @@ -51,14 +51,16 @@ static void ftrace_dump_buf(int skip_lines, long cpu_file) |
5166 | if (cpu_file == RING_BUFFER_ALL_CPUS) { |
5167 | for_each_tracing_cpu(cpu) { |
5168 | iter.buffer_iter[cpu] = |
5169 | - ring_buffer_read_prepare(iter.trace_buffer->buffer, cpu); |
5170 | + ring_buffer_read_prepare(iter.trace_buffer->buffer, |
5171 | + cpu, GFP_ATOMIC); |
5172 | ring_buffer_read_start(iter.buffer_iter[cpu]); |
5173 | tracing_iter_reset(&iter, cpu); |
5174 | } |
5175 | } else { |
5176 | iter.cpu_file = cpu_file; |
5177 | iter.buffer_iter[cpu_file] = |
5178 | - ring_buffer_read_prepare(iter.trace_buffer->buffer, cpu_file); |
5179 | + ring_buffer_read_prepare(iter.trace_buffer->buffer, |
5180 | + cpu_file, GFP_ATOMIC); |
5181 | ring_buffer_read_start(iter.buffer_iter[cpu_file]); |
5182 | tracing_iter_reset(&iter, cpu_file); |
5183 | } |
5184 | diff --git a/lib/bsearch.c b/lib/bsearch.c |
5185 | index 18b445b010c3..82512fe7b33c 100644 |
5186 | --- a/lib/bsearch.c |
5187 | +++ b/lib/bsearch.c |
5188 | @@ -11,6 +11,7 @@ |
5189 | |
5190 | #include <linux/export.h> |
5191 | #include <linux/bsearch.h> |
5192 | +#include <linux/kprobes.h> |
5193 | |
5194 | /* |
5195 | * bsearch - binary search an array of elements |
5196 | @@ -53,3 +54,4 @@ void *bsearch(const void *key, const void *base, size_t num, size_t size, |
5197 | return NULL; |
5198 | } |
5199 | EXPORT_SYMBOL(bsearch); |
5200 | +NOKPROBE_SYMBOL(bsearch); |
5201 | diff --git a/lib/raid6/Makefile b/lib/raid6/Makefile |
5202 | index 7ed43eaa02ef..5e0d55c54100 100644 |
5203 | --- a/lib/raid6/Makefile |
5204 | +++ b/lib/raid6/Makefile |
5205 | @@ -40,7 +40,7 @@ endif |
5206 | ifeq ($(CONFIG_KERNEL_MODE_NEON),y) |
5207 | NEON_FLAGS := -ffreestanding |
5208 | ifeq ($(ARCH),arm) |
5209 | -NEON_FLAGS += -mfloat-abi=softfp -mfpu=neon |
5210 | +NEON_FLAGS += -march=armv7-a -mfloat-abi=softfp -mfpu=neon |
5211 | endif |
5212 | CFLAGS_recov_neon_inner.o += $(NEON_FLAGS) |
5213 | ifeq ($(ARCH),arm64) |
5214 | diff --git a/mm/cma.c b/mm/cma.c |
5215 | index 4cb76121a3ab..bfe9f5397165 100644 |
5216 | --- a/mm/cma.c |
5217 | +++ b/mm/cma.c |
5218 | @@ -353,12 +353,14 @@ int __init cma_declare_contiguous(phys_addr_t base, |
5219 | |
5220 | ret = cma_init_reserved_mem(base, size, order_per_bit, name, res_cma); |
5221 | if (ret) |
5222 | - goto err; |
5223 | + goto free_mem; |
5224 | |
5225 | pr_info("Reserved %ld MiB at %pa\n", (unsigned long)size / SZ_1M, |
5226 | &base); |
5227 | return 0; |
5228 | |
5229 | +free_mem: |
5230 | + memblock_free(base, size); |
5231 | err: |
5232 | pr_err("Failed to reserve %ld MiB\n", (unsigned long)size / SZ_1M); |
5233 | return ret; |
5234 | diff --git a/mm/memcontrol.c b/mm/memcontrol.c |
5235 | index 9518aefd8cbb..7c712c4565e6 100644 |
5236 | --- a/mm/memcontrol.c |
5237 | +++ b/mm/memcontrol.c |
5238 | @@ -248,6 +248,12 @@ enum res_type { |
5239 | iter != NULL; \ |
5240 | iter = mem_cgroup_iter(NULL, iter, NULL)) |
5241 | |
5242 | +static inline bool should_force_charge(void) |
5243 | +{ |
5244 | + return tsk_is_oom_victim(current) || fatal_signal_pending(current) || |
5245 | + (current->flags & PF_EXITING); |
5246 | +} |
5247 | + |
5248 | /* Some nice accessors for the vmpressure. */ |
5249 | struct vmpressure *memcg_to_vmpressure(struct mem_cgroup *memcg) |
5250 | { |
5251 | @@ -1382,8 +1388,13 @@ static bool mem_cgroup_out_of_memory(struct mem_cgroup *memcg, gfp_t gfp_mask, |
5252 | }; |
5253 | bool ret; |
5254 | |
5255 | - mutex_lock(&oom_lock); |
5256 | - ret = out_of_memory(&oc); |
5257 | + if (mutex_lock_killable(&oom_lock)) |
5258 | + return true; |
5259 | + /* |
5260 | + * A few threads which were not waiting at mutex_lock_killable() can |
5261 | + * fail to bail out. Therefore, check again after holding oom_lock. |
5262 | + */ |
5263 | + ret = should_force_charge() || out_of_memory(&oc); |
5264 | mutex_unlock(&oom_lock); |
5265 | return ret; |
5266 | } |
5267 | @@ -2200,9 +2211,7 @@ retry: |
5268 | * bypass the last charges so that they can exit quickly and |
5269 | * free their memory. |
5270 | */ |
5271 | - if (unlikely(tsk_is_oom_victim(current) || |
5272 | - fatal_signal_pending(current) || |
5273 | - current->flags & PF_EXITING)) |
5274 | + if (unlikely(should_force_charge())) |
5275 | goto force; |
5276 | |
5277 | /* |
5278 | diff --git a/mm/mempolicy.c b/mm/mempolicy.c |
5279 | index f32d0a5be4fb..360b24bc69e5 100644 |
5280 | --- a/mm/mempolicy.c |
5281 | +++ b/mm/mempolicy.c |
5282 | @@ -350,7 +350,7 @@ static void mpol_rebind_policy(struct mempolicy *pol, const nodemask_t *newmask) |
5283 | { |
5284 | if (!pol) |
5285 | return; |
5286 | - if (!mpol_store_user_nodemask(pol) && |
5287 | + if (!mpol_store_user_nodemask(pol) && !(pol->flags & MPOL_F_LOCAL) && |
5288 | nodes_equal(pol->w.cpuset_mems_allowed, *newmask)) |
5289 | return; |
5290 | |
5291 | diff --git a/mm/oom_kill.c b/mm/oom_kill.c |
5292 | index e66ac8a47dd6..dbddb7a409dd 100644 |
5293 | --- a/mm/oom_kill.c |
5294 | +++ b/mm/oom_kill.c |
5295 | @@ -915,7 +915,8 @@ static void __oom_kill_process(struct task_struct *victim) |
5296 | */ |
5297 | static int oom_kill_memcg_member(struct task_struct *task, void *unused) |
5298 | { |
5299 | - if (task->signal->oom_score_adj != OOM_SCORE_ADJ_MIN) { |
5300 | + if (task->signal->oom_score_adj != OOM_SCORE_ADJ_MIN && |
5301 | + !is_global_init(task)) { |
5302 | get_task_struct(task); |
5303 | __oom_kill_process(task); |
5304 | } |
5305 | diff --git a/mm/page_alloc.c b/mm/page_alloc.c |
5306 | index ef99971c13dd..8e6932a140b8 100644 |
5307 | --- a/mm/page_alloc.c |
5308 | +++ b/mm/page_alloc.c |
5309 | @@ -1922,8 +1922,8 @@ inline void post_alloc_hook(struct page *page, unsigned int order, |
5310 | |
5311 | arch_alloc_page(page, order); |
5312 | kernel_map_pages(page, 1 << order, 1); |
5313 | - kernel_poison_pages(page, 1 << order, 1); |
5314 | kasan_alloc_pages(page, order); |
5315 | + kernel_poison_pages(page, 1 << order, 1); |
5316 | set_page_owner(page, order, gfp_flags); |
5317 | } |
5318 | |
5319 | diff --git a/mm/page_ext.c b/mm/page_ext.c |
5320 | index 4961f13b6ec1..aad120123688 100644 |
5321 | --- a/mm/page_ext.c |
5322 | +++ b/mm/page_ext.c |
5323 | @@ -273,6 +273,7 @@ static void free_page_ext(void *addr) |
5324 | table_size = get_entry_size() * PAGES_PER_SECTION; |
5325 | |
5326 | BUG_ON(PageReserved(page)); |
5327 | + kmemleak_free(addr); |
5328 | free_pages_exact(addr, table_size); |
5329 | } |
5330 | } |
5331 | diff --git a/mm/page_poison.c b/mm/page_poison.c |
5332 | index aa2b3d34e8ea..6cfa8e7d7213 100644 |
5333 | --- a/mm/page_poison.c |
5334 | +++ b/mm/page_poison.c |
5335 | @@ -6,6 +6,7 @@ |
5336 | #include <linux/page_ext.h> |
5337 | #include <linux/poison.h> |
5338 | #include <linux/ratelimit.h> |
5339 | +#include <linux/kasan.h> |
5340 | |
5341 | static bool want_page_poisoning __read_mostly; |
5342 | |
5343 | @@ -34,7 +35,10 @@ static void poison_page(struct page *page) |
5344 | { |
5345 | void *addr = kmap_atomic(page); |
5346 | |
5347 | + /* KASAN still think the page is in-use, so skip it. */ |
5348 | + kasan_disable_current(); |
5349 | memset(addr, PAGE_POISON, PAGE_SIZE); |
5350 | + kasan_enable_current(); |
5351 | kunmap_atomic(addr); |
5352 | } |
5353 | |
5354 | diff --git a/mm/slab.c b/mm/slab.c |
5355 | index 364e42d5a399..b8e0ec74330f 100644 |
5356 | --- a/mm/slab.c |
5357 | +++ b/mm/slab.c |
5358 | @@ -563,14 +563,6 @@ static void start_cpu_timer(int cpu) |
5359 | |
5360 | static void init_arraycache(struct array_cache *ac, int limit, int batch) |
5361 | { |
5362 | - /* |
5363 | - * The array_cache structures contain pointers to free object. |
5364 | - * However, when such objects are allocated or transferred to another |
5365 | - * cache the pointers are not cleared and they could be counted as |
5366 | - * valid references during a kmemleak scan. Therefore, kmemleak must |
5367 | - * not scan such objects. |
5368 | - */ |
5369 | - kmemleak_no_scan(ac); |
5370 | if (ac) { |
5371 | ac->avail = 0; |
5372 | ac->limit = limit; |
5373 | @@ -586,6 +578,14 @@ static struct array_cache *alloc_arraycache(int node, int entries, |
5374 | struct array_cache *ac = NULL; |
5375 | |
5376 | ac = kmalloc_node(memsize, gfp, node); |
5377 | + /* |
5378 | + * The array_cache structures contain pointers to free object. |
5379 | + * However, when such objects are allocated or transferred to another |
5380 | + * cache the pointers are not cleared and they could be counted as |
5381 | + * valid references during a kmemleak scan. Therefore, kmemleak must |
5382 | + * not scan such objects. |
5383 | + */ |
5384 | + kmemleak_no_scan(ac); |
5385 | init_arraycache(ac, entries, batchcount); |
5386 | return ac; |
5387 | } |
5388 | @@ -680,6 +680,7 @@ static struct alien_cache *__alloc_alien_cache(int node, int entries, |
5389 | |
5390 | alc = kmalloc_node(memsize, gfp, node); |
5391 | if (alc) { |
5392 | + kmemleak_no_scan(alc); |
5393 | init_arraycache(&alc->ac, entries, batch); |
5394 | spin_lock_init(&alc->lock); |
5395 | } |
5396 | diff --git a/mm/sparse.c b/mm/sparse.c |
5397 | index 10b07eea9a6e..45950a074bdb 100644 |
5398 | --- a/mm/sparse.c |
5399 | +++ b/mm/sparse.c |
5400 | @@ -196,7 +196,7 @@ static inline int next_present_section_nr(int section_nr) |
5401 | } |
5402 | #define for_each_present_section_nr(start, section_nr) \ |
5403 | for (section_nr = next_present_section_nr(start-1); \ |
5404 | - ((section_nr >= 0) && \ |
5405 | + ((section_nr != -1) && \ |
5406 | (section_nr <= __highest_present_section_nr)); \ |
5407 | section_nr = next_present_section_nr(section_nr)) |
5408 | |
5409 | diff --git a/mm/swapfile.c b/mm/swapfile.c |
5410 | index 340ef3177686..0047dcaf9369 100644 |
5411 | --- a/mm/swapfile.c |
5412 | +++ b/mm/swapfile.c |
5413 | @@ -98,6 +98,15 @@ static atomic_t proc_poll_event = ATOMIC_INIT(0); |
5414 | |
5415 | atomic_t nr_rotate_swap = ATOMIC_INIT(0); |
5416 | |
5417 | +static struct swap_info_struct *swap_type_to_swap_info(int type) |
5418 | +{ |
5419 | + if (type >= READ_ONCE(nr_swapfiles)) |
5420 | + return NULL; |
5421 | + |
5422 | + smp_rmb(); /* Pairs with smp_wmb in alloc_swap_info. */ |
5423 | + return READ_ONCE(swap_info[type]); |
5424 | +} |
5425 | + |
5426 | static inline unsigned char swap_count(unsigned char ent) |
5427 | { |
5428 | return ent & ~SWAP_HAS_CACHE; /* may include COUNT_CONTINUED flag */ |
5429 | @@ -1030,12 +1039,14 @@ noswap: |
5430 | /* The only caller of this function is now suspend routine */ |
5431 | swp_entry_t get_swap_page_of_type(int type) |
5432 | { |
5433 | - struct swap_info_struct *si; |
5434 | + struct swap_info_struct *si = swap_type_to_swap_info(type); |
5435 | pgoff_t offset; |
5436 | |
5437 | - si = swap_info[type]; |
5438 | + if (!si) |
5439 | + goto fail; |
5440 | + |
5441 | spin_lock(&si->lock); |
5442 | - if (si && (si->flags & SWP_WRITEOK)) { |
5443 | + if (si->flags & SWP_WRITEOK) { |
5444 | atomic_long_dec(&nr_swap_pages); |
5445 | /* This is called for allocating swap entry, not cache */ |
5446 | offset = scan_swap_map(si, 1); |
5447 | @@ -1046,6 +1057,7 @@ swp_entry_t get_swap_page_of_type(int type) |
5448 | atomic_long_inc(&nr_swap_pages); |
5449 | } |
5450 | spin_unlock(&si->lock); |
5451 | +fail: |
5452 | return (swp_entry_t) {0}; |
5453 | } |
5454 | |
5455 | @@ -1057,9 +1069,9 @@ static struct swap_info_struct *__swap_info_get(swp_entry_t entry) |
5456 | if (!entry.val) |
5457 | goto out; |
5458 | type = swp_type(entry); |
5459 | - if (type >= nr_swapfiles) |
5460 | + p = swap_type_to_swap_info(type); |
5461 | + if (!p) |
5462 | goto bad_nofile; |
5463 | - p = swap_info[type]; |
5464 | if (!(p->flags & SWP_USED)) |
5465 | goto bad_device; |
5466 | offset = swp_offset(entry); |
5467 | @@ -1708,10 +1720,9 @@ int swap_type_of(dev_t device, sector_t offset, struct block_device **bdev_p) |
5468 | sector_t swapdev_block(int type, pgoff_t offset) |
5469 | { |
5470 | struct block_device *bdev; |
5471 | + struct swap_info_struct *si = swap_type_to_swap_info(type); |
5472 | |
5473 | - if ((unsigned int)type >= nr_swapfiles) |
5474 | - return 0; |
5475 | - if (!(swap_info[type]->flags & SWP_WRITEOK)) |
5476 | + if (!si || !(si->flags & SWP_WRITEOK)) |
5477 | return 0; |
5478 | return map_swap_entry(swp_entry(type, offset), &bdev); |
5479 | } |
5480 | @@ -2269,7 +2280,7 @@ static sector_t map_swap_entry(swp_entry_t entry, struct block_device **bdev) |
5481 | struct swap_extent *se; |
5482 | pgoff_t offset; |
5483 | |
5484 | - sis = swap_info[swp_type(entry)]; |
5485 | + sis = swp_swap_info(entry); |
5486 | *bdev = sis->bdev; |
5487 | |
5488 | offset = swp_offset(entry); |
5489 | @@ -2707,9 +2718,7 @@ static void *swap_start(struct seq_file *swap, loff_t *pos) |
5490 | if (!l) |
5491 | return SEQ_START_TOKEN; |
5492 | |
5493 | - for (type = 0; type < nr_swapfiles; type++) { |
5494 | - smp_rmb(); /* read nr_swapfiles before swap_info[type] */ |
5495 | - si = swap_info[type]; |
5496 | + for (type = 0; (si = swap_type_to_swap_info(type)); type++) { |
5497 | if (!(si->flags & SWP_USED) || !si->swap_map) |
5498 | continue; |
5499 | if (!--l) |
5500 | @@ -2729,9 +2738,7 @@ static void *swap_next(struct seq_file *swap, void *v, loff_t *pos) |
5501 | else |
5502 | type = si->type + 1; |
5503 | |
5504 | - for (; type < nr_swapfiles; type++) { |
5505 | - smp_rmb(); /* read nr_swapfiles before swap_info[type] */ |
5506 | - si = swap_info[type]; |
5507 | + for (; (si = swap_type_to_swap_info(type)); type++) { |
5508 | if (!(si->flags & SWP_USED) || !si->swap_map) |
5509 | continue; |
5510 | ++*pos; |
5511 | @@ -2838,14 +2845,14 @@ static struct swap_info_struct *alloc_swap_info(void) |
5512 | } |
5513 | if (type >= nr_swapfiles) { |
5514 | p->type = type; |
5515 | - swap_info[type] = p; |
5516 | + WRITE_ONCE(swap_info[type], p); |
5517 | /* |
5518 | * Write swap_info[type] before nr_swapfiles, in case a |
5519 | * racing procfs swap_start() or swap_next() is reading them. |
5520 | * (We never shrink nr_swapfiles, we never free this entry.) |
5521 | */ |
5522 | smp_wmb(); |
5523 | - nr_swapfiles++; |
5524 | + WRITE_ONCE(nr_swapfiles, nr_swapfiles + 1); |
5525 | } else { |
5526 | kvfree(p); |
5527 | p = swap_info[type]; |
5528 | @@ -3365,7 +3372,7 @@ static int __swap_duplicate(swp_entry_t entry, unsigned char usage) |
5529 | { |
5530 | struct swap_info_struct *p; |
5531 | struct swap_cluster_info *ci; |
5532 | - unsigned long offset, type; |
5533 | + unsigned long offset; |
5534 | unsigned char count; |
5535 | unsigned char has_cache; |
5536 | int err = -EINVAL; |
5537 | @@ -3373,10 +3380,10 @@ static int __swap_duplicate(swp_entry_t entry, unsigned char usage) |
5538 | if (non_swap_entry(entry)) |
5539 | goto out; |
5540 | |
5541 | - type = swp_type(entry); |
5542 | - if (type >= nr_swapfiles) |
5543 | + p = swp_swap_info(entry); |
5544 | + if (!p) |
5545 | goto bad_file; |
5546 | - p = swap_info[type]; |
5547 | + |
5548 | offset = swp_offset(entry); |
5549 | if (unlikely(offset >= p->max)) |
5550 | goto out; |
5551 | @@ -3473,7 +3480,7 @@ int swapcache_prepare(swp_entry_t entry) |
5552 | |
5553 | struct swap_info_struct *swp_swap_info(swp_entry_t entry) |
5554 | { |
5555 | - return swap_info[swp_type(entry)]; |
5556 | + return swap_type_to_swap_info(swp_type(entry)); |
5557 | } |
5558 | |
5559 | struct swap_info_struct *page_swap_info(struct page *page) |
5560 | diff --git a/mm/vmalloc.c b/mm/vmalloc.c |
5561 | index 91a789a46b12..a46ec261a44e 100644 |
5562 | --- a/mm/vmalloc.c |
5563 | +++ b/mm/vmalloc.c |
5564 | @@ -498,7 +498,11 @@ nocache: |
5565 | } |
5566 | |
5567 | found: |
5568 | - if (addr + size > vend) |
5569 | + /* |
5570 | + * Check also calculated address against the vstart, |
5571 | + * because it can be 0 because of big align request. |
5572 | + */ |
5573 | + if (addr + size > vend || addr < vstart) |
5574 | goto overflow; |
5575 | |
5576 | va->va_start = addr; |
5577 | diff --git a/net/bridge/br_netfilter_hooks.c b/net/bridge/br_netfilter_hooks.c |
5578 | index e07a7e62c705..3b0a03b92080 100644 |
5579 | --- a/net/bridge/br_netfilter_hooks.c |
5580 | +++ b/net/bridge/br_netfilter_hooks.c |
5581 | @@ -884,11 +884,6 @@ static const struct nf_br_ops br_ops = { |
5582 | .br_dev_xmit_hook = br_nf_dev_xmit, |
5583 | }; |
5584 | |
5585 | -void br_netfilter_enable(void) |
5586 | -{ |
5587 | -} |
5588 | -EXPORT_SYMBOL_GPL(br_netfilter_enable); |
5589 | - |
5590 | /* For br_nf_post_routing, we need (prio = NF_BR_PRI_LAST), because |
5591 | * br_dev_queue_push_xmit is called afterwards */ |
5592 | static const struct nf_hook_ops br_nf_ops[] = { |
5593 | diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c |
5594 | index 895171a2e1f1..9a249478abf2 100644 |
5595 | --- a/net/netfilter/nf_conntrack_core.c |
5596 | +++ b/net/netfilter/nf_conntrack_core.c |
5597 | @@ -901,10 +901,18 @@ __nf_conntrack_confirm(struct sk_buff *skb) |
5598 | * REJECT will give spurious warnings here. |
5599 | */ |
5600 | |
5601 | - /* No external references means no one else could have |
5602 | - * confirmed us. |
5603 | + /* Another skb with the same unconfirmed conntrack may |
5604 | + * win the race. This may happen for bridge(br_flood) |
5605 | + * or broadcast/multicast packets do skb_clone with |
5606 | + * unconfirmed conntrack. |
5607 | */ |
5608 | - WARN_ON(nf_ct_is_confirmed(ct)); |
5609 | + if (unlikely(nf_ct_is_confirmed(ct))) { |
5610 | + WARN_ON_ONCE(1); |
5611 | + nf_conntrack_double_unlock(hash, reply_hash); |
5612 | + local_bh_enable(); |
5613 | + return NF_DROP; |
5614 | + } |
5615 | + |
5616 | pr_debug("Confirming conntrack %p\n", ct); |
5617 | /* We have to check the DYING flag after unlink to prevent |
5618 | * a race against nf_ct_get_next_corpse() possibly called from |
5619 | diff --git a/net/netfilter/nf_conntrack_proto_tcp.c b/net/netfilter/nf_conntrack_proto_tcp.c |
5620 | index 247b89784a6f..842f3f86fb2e 100644 |
5621 | --- a/net/netfilter/nf_conntrack_proto_tcp.c |
5622 | +++ b/net/netfilter/nf_conntrack_proto_tcp.c |
5623 | @@ -769,6 +769,12 @@ static int tcp_error(struct net *net, struct nf_conn *tmpl, |
5624 | return NF_ACCEPT; |
5625 | } |
5626 | |
5627 | +static bool nf_conntrack_tcp_established(const struct nf_conn *ct) |
5628 | +{ |
5629 | + return ct->proto.tcp.state == TCP_CONNTRACK_ESTABLISHED && |
5630 | + test_bit(IPS_ASSURED_BIT, &ct->status); |
5631 | +} |
5632 | + |
5633 | /* Returns verdict for packet, or -1 for invalid. */ |
5634 | static int tcp_packet(struct nf_conn *ct, |
5635 | const struct sk_buff *skb, |
5636 | @@ -963,16 +969,38 @@ static int tcp_packet(struct nf_conn *ct, |
5637 | new_state = TCP_CONNTRACK_ESTABLISHED; |
5638 | break; |
5639 | case TCP_CONNTRACK_CLOSE: |
5640 | - if (index == TCP_RST_SET |
5641 | - && (ct->proto.tcp.seen[!dir].flags & IP_CT_TCP_FLAG_MAXACK_SET) |
5642 | - && before(ntohl(th->seq), ct->proto.tcp.seen[!dir].td_maxack)) { |
5643 | - /* Invalid RST */ |
5644 | - spin_unlock_bh(&ct->lock); |
5645 | - nf_ct_l4proto_log_invalid(skb, ct, "invalid rst"); |
5646 | - return -NF_ACCEPT; |
5647 | + if (index != TCP_RST_SET) |
5648 | + break; |
5649 | + |
5650 | + if (ct->proto.tcp.seen[!dir].flags & IP_CT_TCP_FLAG_MAXACK_SET) { |
5651 | + u32 seq = ntohl(th->seq); |
5652 | + |
5653 | + if (before(seq, ct->proto.tcp.seen[!dir].td_maxack)) { |
5654 | + /* Invalid RST */ |
5655 | + spin_unlock_bh(&ct->lock); |
5656 | + nf_ct_l4proto_log_invalid(skb, ct, "invalid rst"); |
5657 | + return -NF_ACCEPT; |
5658 | + } |
5659 | + |
5660 | + if (!nf_conntrack_tcp_established(ct) || |
5661 | + seq == ct->proto.tcp.seen[!dir].td_maxack) |
5662 | + break; |
5663 | + |
5664 | + /* Check if rst is part of train, such as |
5665 | + * foo:80 > bar:4379: P, 235946583:235946602(19) ack 42 |
5666 | + * foo:80 > bar:4379: R, 235946602:235946602(0) ack 42 |
5667 | + */ |
5668 | + if (ct->proto.tcp.last_index == TCP_ACK_SET && |
5669 | + ct->proto.tcp.last_dir == dir && |
5670 | + seq == ct->proto.tcp.last_end) |
5671 | + break; |
5672 | + |
5673 | + /* ... RST sequence number doesn't match exactly, keep |
5674 | + * established state to allow a possible challenge ACK. |
5675 | + */ |
5676 | + new_state = old_state; |
5677 | } |
5678 | - if (index == TCP_RST_SET |
5679 | - && ((test_bit(IPS_SEEN_REPLY_BIT, &ct->status) |
5680 | + if (((test_bit(IPS_SEEN_REPLY_BIT, &ct->status) |
5681 | && ct->proto.tcp.last_index == TCP_SYN_SET) |
5682 | || (!test_bit(IPS_ASSURED_BIT, &ct->status) |
5683 | && ct->proto.tcp.last_index == TCP_ACK_SET)) |
5684 | @@ -988,7 +1016,7 @@ static int tcp_packet(struct nf_conn *ct, |
5685 | * segments we ignored. */ |
5686 | goto in_window; |
5687 | } |
5688 | - /* Just fall through */ |
5689 | + break; |
5690 | default: |
5691 | /* Keep compilers happy. */ |
5692 | break; |
5693 | @@ -1023,6 +1051,8 @@ static int tcp_packet(struct nf_conn *ct, |
5694 | if (ct->proto.tcp.retrans >= tn->tcp_max_retrans && |
5695 | timeouts[new_state] > timeouts[TCP_CONNTRACK_RETRANS]) |
5696 | timeout = timeouts[TCP_CONNTRACK_RETRANS]; |
5697 | + else if (unlikely(index == TCP_RST_SET)) |
5698 | + timeout = timeouts[TCP_CONNTRACK_CLOSE]; |
5699 | else if ((ct->proto.tcp.seen[0].flags | ct->proto.tcp.seen[1].flags) & |
5700 | IP_CT_TCP_FLAG_DATA_UNACKNOWLEDGED && |
5701 | timeouts[new_state] > timeouts[TCP_CONNTRACK_UNACK]) |
5702 | diff --git a/net/netfilter/nf_tables_core.c b/net/netfilter/nf_tables_core.c |
5703 | index 60f258f2c707..a3850414dba2 100644 |
5704 | --- a/net/netfilter/nf_tables_core.c |
5705 | +++ b/net/netfilter/nf_tables_core.c |
5706 | @@ -98,21 +98,23 @@ static noinline void nft_update_chain_stats(const struct nft_chain *chain, |
5707 | const struct nft_pktinfo *pkt) |
5708 | { |
5709 | struct nft_base_chain *base_chain; |
5710 | + struct nft_stats __percpu *pstats; |
5711 | struct nft_stats *stats; |
5712 | |
5713 | base_chain = nft_base_chain(chain); |
5714 | - if (!rcu_access_pointer(base_chain->stats)) |
5715 | - return; |
5716 | |
5717 | - local_bh_disable(); |
5718 | - stats = this_cpu_ptr(rcu_dereference(base_chain->stats)); |
5719 | - if (stats) { |
5720 | + rcu_read_lock(); |
5721 | + pstats = READ_ONCE(base_chain->stats); |
5722 | + if (pstats) { |
5723 | + local_bh_disable(); |
5724 | + stats = this_cpu_ptr(pstats); |
5725 | u64_stats_update_begin(&stats->syncp); |
5726 | stats->pkts++; |
5727 | stats->bytes += pkt->skb->len; |
5728 | u64_stats_update_end(&stats->syncp); |
5729 | + local_bh_enable(); |
5730 | } |
5731 | - local_bh_enable(); |
5732 | + rcu_read_unlock(); |
5733 | } |
5734 | |
5735 | struct nft_jumpstack { |
5736 | diff --git a/net/netfilter/xt_physdev.c b/net/netfilter/xt_physdev.c |
5737 | index 9d6d67b953ac..05f00fb20b04 100644 |
5738 | --- a/net/netfilter/xt_physdev.c |
5739 | +++ b/net/netfilter/xt_physdev.c |
5740 | @@ -96,8 +96,7 @@ match_outdev: |
5741 | static int physdev_mt_check(const struct xt_mtchk_param *par) |
5742 | { |
5743 | const struct xt_physdev_info *info = par->matchinfo; |
5744 | - |
5745 | - br_netfilter_enable(); |
5746 | + static bool brnf_probed __read_mostly; |
5747 | |
5748 | if (!(info->bitmask & XT_PHYSDEV_OP_MASK) || |
5749 | info->bitmask & ~XT_PHYSDEV_OP_MASK) |
5750 | @@ -111,6 +110,12 @@ static int physdev_mt_check(const struct xt_mtchk_param *par) |
5751 | if (par->hook_mask & (1 << NF_INET_LOCAL_OUT)) |
5752 | return -EINVAL; |
5753 | } |
5754 | + |
5755 | + if (!brnf_probed) { |
5756 | + brnf_probed = true; |
5757 | + request_module("br_netfilter"); |
5758 | + } |
5759 | + |
5760 | return 0; |
5761 | } |
5762 | |
5763 | diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c |
5764 | index 6ea3d3aa1a1e..4337b6d9369e 100644 |
5765 | --- a/security/selinux/hooks.c |
5766 | +++ b/security/selinux/hooks.c |
5767 | @@ -3458,12 +3458,16 @@ static int selinux_inode_setsecurity(struct inode *inode, const char *name, |
5768 | const void *value, size_t size, int flags) |
5769 | { |
5770 | struct inode_security_struct *isec = inode_security_novalidate(inode); |
5771 | + struct superblock_security_struct *sbsec = inode->i_sb->s_security; |
5772 | u32 newsid; |
5773 | int rc; |
5774 | |
5775 | if (strcmp(name, XATTR_SELINUX_SUFFIX)) |
5776 | return -EOPNOTSUPP; |
5777 | |
5778 | + if (!(sbsec->flags & SBLABEL_MNT)) |
5779 | + return -EOPNOTSUPP; |
5780 | + |
5781 | if (!value || !size) |
5782 | return -EACCES; |
5783 | |
5784 | @@ -6612,7 +6616,10 @@ static void selinux_inode_invalidate_secctx(struct inode *inode) |
5785 | */ |
5786 | static int selinux_inode_notifysecctx(struct inode *inode, void *ctx, u32 ctxlen) |
5787 | { |
5788 | - return selinux_inode_setsecurity(inode, XATTR_SELINUX_SUFFIX, ctx, ctxlen, 0); |
5789 | + int rc = selinux_inode_setsecurity(inode, XATTR_SELINUX_SUFFIX, |
5790 | + ctx, ctxlen, 0); |
5791 | + /* Do not return error when suppressing label (SBLABEL_MNT not set). */ |
5792 | + return rc == -EOPNOTSUPP ? 0 : rc; |
5793 | } |
5794 | |
5795 | /* |
5796 | diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c |
5797 | index b67f6fe08a1b..e08c6c6ca029 100644 |
5798 | --- a/sound/core/pcm_native.c |
5799 | +++ b/sound/core/pcm_native.c |
5800 | @@ -1513,6 +1513,14 @@ int snd_pcm_suspend_all(struct snd_pcm *pcm) |
5801 | /* FIXME: the open/close code should lock this as well */ |
5802 | if (substream->runtime == NULL) |
5803 | continue; |
5804 | + |
5805 | + /* |
5806 | + * Skip BE dai link PCM's that are internal and may |
5807 | + * not have their substream ops set. |
5808 | + */ |
5809 | + if (!substream->ops) |
5810 | + continue; |
5811 | + |
5812 | err = snd_pcm_suspend(substream); |
5813 | if (err < 0 && err != -EBUSY) |
5814 | return err; |
5815 | diff --git a/sound/firewire/dice/dice.c b/sound/firewire/dice/dice.c |
5816 | index 774eb2205668..3d600f498914 100644 |
5817 | --- a/sound/firewire/dice/dice.c |
5818 | +++ b/sound/firewire/dice/dice.c |
5819 | @@ -18,6 +18,7 @@ MODULE_LICENSE("GPL v2"); |
5820 | #define OUI_ALESIS 0x000595 |
5821 | #define OUI_MAUDIO 0x000d6c |
5822 | #define OUI_MYTEK 0x001ee8 |
5823 | +#define OUI_SSL 0x0050c2 // Actually ID reserved by IEEE. |
5824 | |
5825 | #define DICE_CATEGORY_ID 0x04 |
5826 | #define WEISS_CATEGORY_ID 0x00 |
5827 | @@ -216,7 +217,7 @@ static int dice_probe(struct fw_unit *unit, |
5828 | struct snd_dice *dice; |
5829 | int err; |
5830 | |
5831 | - if (!entry->driver_data) { |
5832 | + if (!entry->driver_data && entry->vendor_id != OUI_SSL) { |
5833 | err = check_dice_category(unit); |
5834 | if (err < 0) |
5835 | return -ENODEV; |
5836 | @@ -382,6 +383,15 @@ static const struct ieee1394_device_id dice_id_table[] = { |
5837 | .model_id = 0x000002, |
5838 | .driver_data = (kernel_ulong_t)snd_dice_detect_mytek_formats, |
5839 | }, |
5840 | + // Solid State Logic, Duende Classic and Mini. |
5841 | + // NOTE: each field of GUID in config ROM is not compliant to standard |
5842 | + // DICE scheme. |
5843 | + { |
5844 | + .match_flags = IEEE1394_MATCH_VENDOR_ID | |
5845 | + IEEE1394_MATCH_MODEL_ID, |
5846 | + .vendor_id = OUI_SSL, |
5847 | + .model_id = 0x000070, |
5848 | + }, |
5849 | { |
5850 | .match_flags = IEEE1394_MATCH_VERSION, |
5851 | .version = DICE_INTERFACE, |
5852 | diff --git a/sound/soc/fsl/fsl-asoc-card.c b/sound/soc/fsl/fsl-asoc-card.c |
5853 | index 44433b20435c..600d9be9706e 100644 |
5854 | --- a/sound/soc/fsl/fsl-asoc-card.c |
5855 | +++ b/sound/soc/fsl/fsl-asoc-card.c |
5856 | @@ -689,6 +689,7 @@ static int fsl_asoc_card_probe(struct platform_device *pdev) |
5857 | asrc_fail: |
5858 | of_node_put(asrc_np); |
5859 | of_node_put(codec_np); |
5860 | + put_device(&cpu_pdev->dev); |
5861 | fail: |
5862 | of_node_put(cpu_np); |
5863 | |
5864 | diff --git a/sound/soc/fsl/imx-sgtl5000.c b/sound/soc/fsl/imx-sgtl5000.c |
5865 | index c29200cf755a..9b9a7ec52905 100644 |
5866 | --- a/sound/soc/fsl/imx-sgtl5000.c |
5867 | +++ b/sound/soc/fsl/imx-sgtl5000.c |
5868 | @@ -108,6 +108,7 @@ static int imx_sgtl5000_probe(struct platform_device *pdev) |
5869 | ret = -EPROBE_DEFER; |
5870 | goto fail; |
5871 | } |
5872 | + put_device(&ssi_pdev->dev); |
5873 | codec_dev = of_find_i2c_device_by_node(codec_np); |
5874 | if (!codec_dev) { |
5875 | dev_err(&pdev->dev, "failed to find codec platform device\n"); |
5876 | diff --git a/sound/soc/qcom/common.c b/sound/soc/qcom/common.c |
5877 | index 4715527054e5..5661025e8cec 100644 |
5878 | --- a/sound/soc/qcom/common.c |
5879 | +++ b/sound/soc/qcom/common.c |
5880 | @@ -42,6 +42,9 @@ int qcom_snd_parse_of(struct snd_soc_card *card) |
5881 | link = card->dai_link; |
5882 | for_each_child_of_node(dev->of_node, np) { |
5883 | cpu = of_get_child_by_name(np, "cpu"); |
5884 | + platform = of_get_child_by_name(np, "platform"); |
5885 | + codec = of_get_child_by_name(np, "codec"); |
5886 | + |
5887 | if (!cpu) { |
5888 | dev_err(dev, "Can't find cpu DT node\n"); |
5889 | ret = -EINVAL; |
5890 | @@ -63,8 +66,6 @@ int qcom_snd_parse_of(struct snd_soc_card *card) |
5891 | goto err; |
5892 | } |
5893 | |
5894 | - platform = of_get_child_by_name(np, "platform"); |
5895 | - codec = of_get_child_by_name(np, "codec"); |
5896 | if (codec && platform) { |
5897 | link->platform_of_node = of_parse_phandle(platform, |
5898 | "sound-dai", |
5899 | @@ -100,10 +101,15 @@ int qcom_snd_parse_of(struct snd_soc_card *card) |
5900 | link->dpcm_capture = 1; |
5901 | link->stream_name = link->name; |
5902 | link++; |
5903 | + |
5904 | + of_node_put(cpu); |
5905 | + of_node_put(codec); |
5906 | + of_node_put(platform); |
5907 | } |
5908 | |
5909 | return 0; |
5910 | err: |
5911 | + of_node_put(np); |
5912 | of_node_put(cpu); |
5913 | of_node_put(codec); |
5914 | of_node_put(platform); |
5915 | diff --git a/tools/lib/bpf/Makefile b/tools/lib/bpf/Makefile |
5916 | index d49902e818b5..3624557550a1 100644 |
5917 | --- a/tools/lib/bpf/Makefile |
5918 | +++ b/tools/lib/bpf/Makefile |
5919 | @@ -149,7 +149,8 @@ CMD_TARGETS = $(LIB_FILE) |
5920 | |
5921 | TARGETS = $(CMD_TARGETS) |
5922 | |
5923 | -all: fixdep all_cmd |
5924 | +all: fixdep |
5925 | + $(Q)$(MAKE) all_cmd |
5926 | |
5927 | all_cmd: $(CMD_TARGETS) |
5928 | |
5929 | diff --git a/tools/lib/traceevent/event-parse.c b/tools/lib/traceevent/event-parse.c |
5930 | index 75de355a63d6..10985d991ed2 100644 |
5931 | --- a/tools/lib/traceevent/event-parse.c |
5932 | +++ b/tools/lib/traceevent/event-parse.c |
5933 | @@ -2416,7 +2416,7 @@ static int arg_num_eval(struct print_arg *arg, long long *val) |
5934 | static char *arg_eval (struct print_arg *arg) |
5935 | { |
5936 | long long val; |
5937 | - static char buf[20]; |
5938 | + static char buf[24]; |
5939 | |
5940 | switch (arg->type) { |
5941 | case PRINT_ATOM: |
5942 | diff --git a/tools/perf/builtin-c2c.c b/tools/perf/builtin-c2c.c |
5943 | index f3aa9d02a5ab..763c2edf52e7 100644 |
5944 | --- a/tools/perf/builtin-c2c.c |
5945 | +++ b/tools/perf/builtin-c2c.c |
5946 | @@ -2055,6 +2055,12 @@ static int setup_nodes(struct perf_session *session) |
5947 | if (!set) |
5948 | return -ENOMEM; |
5949 | |
5950 | + nodes[node] = set; |
5951 | + |
5952 | + /* empty node, skip */ |
5953 | + if (cpu_map__empty(map)) |
5954 | + continue; |
5955 | + |
5956 | for (cpu = 0; cpu < map->nr; cpu++) { |
5957 | set_bit(map->map[cpu], set); |
5958 | |
5959 | @@ -2063,8 +2069,6 @@ static int setup_nodes(struct perf_session *session) |
5960 | |
5961 | cpu2node[map->map[cpu]] = node; |
5962 | } |
5963 | - |
5964 | - nodes[node] = set; |
5965 | } |
5966 | |
5967 | setup_nodes_header(); |
5968 | diff --git a/tools/perf/tests/evsel-tp-sched.c b/tools/perf/tests/evsel-tp-sched.c |
5969 | index 67bcbf876776..d0406116c905 100644 |
5970 | --- a/tools/perf/tests/evsel-tp-sched.c |
5971 | +++ b/tools/perf/tests/evsel-tp-sched.c |
5972 | @@ -43,7 +43,7 @@ int test__perf_evsel__tp_sched_test(struct test *test __maybe_unused, int subtes |
5973 | return -1; |
5974 | } |
5975 | |
5976 | - if (perf_evsel__test_field(evsel, "prev_comm", 16, true)) |
5977 | + if (perf_evsel__test_field(evsel, "prev_comm", 16, false)) |
5978 | ret = -1; |
5979 | |
5980 | if (perf_evsel__test_field(evsel, "prev_pid", 4, true)) |
5981 | @@ -55,7 +55,7 @@ int test__perf_evsel__tp_sched_test(struct test *test __maybe_unused, int subtes |
5982 | if (perf_evsel__test_field(evsel, "prev_state", sizeof(long), true)) |
5983 | ret = -1; |
5984 | |
5985 | - if (perf_evsel__test_field(evsel, "next_comm", 16, true)) |
5986 | + if (perf_evsel__test_field(evsel, "next_comm", 16, false)) |
5987 | ret = -1; |
5988 | |
5989 | if (perf_evsel__test_field(evsel, "next_pid", 4, true)) |
5990 | @@ -73,7 +73,7 @@ int test__perf_evsel__tp_sched_test(struct test *test __maybe_unused, int subtes |
5991 | return -1; |
5992 | } |
5993 | |
5994 | - if (perf_evsel__test_field(evsel, "comm", 16, true)) |
5995 | + if (perf_evsel__test_field(evsel, "comm", 16, false)) |
5996 | ret = -1; |
5997 | |
5998 | if (perf_evsel__test_field(evsel, "pid", 4, true)) |
5999 | diff --git a/tools/perf/util/annotate.c b/tools/perf/util/annotate.c |
6000 | index 28cd6a17491b..dfee110b3a58 100644 |
6001 | --- a/tools/perf/util/annotate.c |
6002 | +++ b/tools/perf/util/annotate.c |
6003 | @@ -1862,6 +1862,7 @@ int symbol__annotate(struct symbol *sym, struct map *map, |
6004 | struct annotation_options *options, |
6005 | struct arch **parch) |
6006 | { |
6007 | + struct annotation *notes = symbol__annotation(sym); |
6008 | struct annotate_args args = { |
6009 | .privsize = privsize, |
6010 | .evsel = evsel, |
6011 | @@ -1892,6 +1893,7 @@ int symbol__annotate(struct symbol *sym, struct map *map, |
6012 | |
6013 | args.ms.map = map; |
6014 | args.ms.sym = sym; |
6015 | + notes->start = map__rip_2objdump(map, sym->start); |
6016 | |
6017 | return symbol__disassemble(sym, &args); |
6018 | } |
6019 | @@ -2746,8 +2748,6 @@ int symbol__annotate2(struct symbol *sym, struct map *map, struct perf_evsel *ev |
6020 | |
6021 | symbol__calc_percent(sym, evsel); |
6022 | |
6023 | - notes->start = map__rip_2objdump(map, sym->start); |
6024 | - |
6025 | annotation__set_offsets(notes, size); |
6026 | annotation__mark_jump_targets(notes, sym); |
6027 | annotation__compute_ipc(notes, size); |
6028 | diff --git a/tools/perf/util/s390-cpumsf.c b/tools/perf/util/s390-cpumsf.c |
6029 | index aa7f8c11fbb7..910f2621d211 100644 |
6030 | --- a/tools/perf/util/s390-cpumsf.c |
6031 | +++ b/tools/perf/util/s390-cpumsf.c |
6032 | @@ -294,6 +294,11 @@ static bool s390_cpumsf_validate(int machine_type, |
6033 | *dsdes = 85; |
6034 | *bsdes = 32; |
6035 | break; |
6036 | + case 2964: |
6037 | + case 2965: |
6038 | + *dsdes = 112; |
6039 | + *bsdes = 32; |
6040 | + break; |
6041 | default: |
6042 | /* Illegal trailer entry */ |
6043 | return false; |
6044 | diff --git a/tools/perf/util/scripting-engines/trace-event-python.c b/tools/perf/util/scripting-engines/trace-event-python.c |
6045 | index 05d95de14e20..9569cc06e0a7 100644 |
6046 | --- a/tools/perf/util/scripting-engines/trace-event-python.c |
6047 | +++ b/tools/perf/util/scripting-engines/trace-event-python.c |
6048 | @@ -733,8 +733,7 @@ static PyObject *get_perf_sample_dict(struct perf_sample *sample, |
6049 | Py_FatalError("couldn't create Python dictionary"); |
6050 | |
6051 | pydict_set_item_string_decref(dict, "ev_name", _PyUnicode_FromString(perf_evsel__name(evsel))); |
6052 | - pydict_set_item_string_decref(dict, "attr", _PyUnicode_FromStringAndSize( |
6053 | - (const char *)&evsel->attr, sizeof(evsel->attr))); |
6054 | + pydict_set_item_string_decref(dict, "attr", _PyBytes_FromStringAndSize((const char *)&evsel->attr, sizeof(evsel->attr))); |
6055 | |
6056 | pydict_set_item_string_decref(dict_sample, "pid", |
6057 | _PyLong_FromLong(sample->pid)); |
6058 | @@ -1494,34 +1493,40 @@ static void _free_command_line(wchar_t **command_line, int num) |
6059 | static int python_start_script(const char *script, int argc, const char **argv) |
6060 | { |
6061 | struct tables *tables = &tables_global; |
6062 | + PyMODINIT_FUNC (*initfunc)(void); |
6063 | #if PY_MAJOR_VERSION < 3 |
6064 | const char **command_line; |
6065 | #else |
6066 | wchar_t **command_line; |
6067 | #endif |
6068 | - char buf[PATH_MAX]; |
6069 | + /* |
6070 | + * Use a non-const name variable to cope with python 2.6's |
6071 | + * PyImport_AppendInittab prototype |
6072 | + */ |
6073 | + char buf[PATH_MAX], name[19] = "perf_trace_context"; |
6074 | int i, err = 0; |
6075 | FILE *fp; |
6076 | |
6077 | #if PY_MAJOR_VERSION < 3 |
6078 | + initfunc = initperf_trace_context; |
6079 | command_line = malloc((argc + 1) * sizeof(const char *)); |
6080 | command_line[0] = script; |
6081 | for (i = 1; i < argc + 1; i++) |
6082 | command_line[i] = argv[i - 1]; |
6083 | #else |
6084 | + initfunc = PyInit_perf_trace_context; |
6085 | command_line = malloc((argc + 1) * sizeof(wchar_t *)); |
6086 | command_line[0] = Py_DecodeLocale(script, NULL); |
6087 | for (i = 1; i < argc + 1; i++) |
6088 | command_line[i] = Py_DecodeLocale(argv[i - 1], NULL); |
6089 | #endif |
6090 | |
6091 | + PyImport_AppendInittab(name, initfunc); |
6092 | Py_Initialize(); |
6093 | |
6094 | #if PY_MAJOR_VERSION < 3 |
6095 | - initperf_trace_context(); |
6096 | PySys_SetArgv(argc + 1, (char **)command_line); |
6097 | #else |
6098 | - PyInit_perf_trace_context(); |
6099 | PySys_SetArgv(argc + 1, command_line); |
6100 | #endif |
6101 | |
6102 | diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c |
6103 | index b284276ec963..46daa22b86e3 100644 |
6104 | --- a/tools/perf/util/sort.c |
6105 | +++ b/tools/perf/util/sort.c |
6106 | @@ -229,8 +229,14 @@ static int64_t _sort__sym_cmp(struct symbol *sym_l, struct symbol *sym_r) |
6107 | if (sym_l == sym_r) |
6108 | return 0; |
6109 | |
6110 | - if (sym_l->inlined || sym_r->inlined) |
6111 | - return strcmp(sym_l->name, sym_r->name); |
6112 | + if (sym_l->inlined || sym_r->inlined) { |
6113 | + int ret = strcmp(sym_l->name, sym_r->name); |
6114 | + |
6115 | + if (ret) |
6116 | + return ret; |
6117 | + if ((sym_l->start <= sym_r->end) && (sym_l->end >= sym_r->start)) |
6118 | + return 0; |
6119 | + } |
6120 | |
6121 | if (sym_l->start != sym_r->start) |
6122 | return (int64_t)(sym_r->start - sym_l->start); |
6123 | diff --git a/tools/perf/util/srcline.c b/tools/perf/util/srcline.c |
6124 | index e767c4a9d4d2..af3f9b9f1e8b 100644 |
6125 | --- a/tools/perf/util/srcline.c |
6126 | +++ b/tools/perf/util/srcline.c |
6127 | @@ -104,7 +104,7 @@ static struct symbol *new_inline_sym(struct dso *dso, |
6128 | } else { |
6129 | /* create a fake symbol for the inline frame */ |
6130 | inline_sym = symbol__new(base_sym ? base_sym->start : 0, |
6131 | - base_sym ? base_sym->end : 0, |
6132 | + base_sym ? (base_sym->end - base_sym->start) : 0, |
6133 | base_sym ? base_sym->binding : 0, |
6134 | base_sym ? base_sym->type : 0, |
6135 | funcname); |
6136 | diff --git a/tools/testing/selftests/bpf/test_verifier.c b/tools/testing/selftests/bpf/test_verifier.c |
6137 | index 9db5a7378f40..294fc18aba2a 100644 |
6138 | --- a/tools/testing/selftests/bpf/test_verifier.c |
6139 | +++ b/tools/testing/selftests/bpf/test_verifier.c |
6140 | @@ -32,6 +32,7 @@ |
6141 | #include <linux/if_ether.h> |
6142 | |
6143 | #include <bpf/bpf.h> |
6144 | +#include <bpf/libbpf.h> |
6145 | |
6146 | #ifdef HAVE_GENHDR |
6147 | # include "autoconf.h" |
6148 | @@ -56,6 +57,7 @@ |
6149 | |
6150 | #define UNPRIV_SYSCTL "kernel/unprivileged_bpf_disabled" |
6151 | static bool unpriv_disabled = false; |
6152 | +static int skips; |
6153 | |
6154 | struct bpf_test { |
6155 | const char *descr; |
6156 | @@ -12770,6 +12772,11 @@ static void do_test_single(struct bpf_test *test, bool unpriv, |
6157 | fd_prog = bpf_verify_program(prog_type ? : BPF_PROG_TYPE_SOCKET_FILTER, |
6158 | prog, prog_len, test->flags & F_LOAD_WITH_STRICT_ALIGNMENT, |
6159 | "GPL", 0, bpf_vlog, sizeof(bpf_vlog), 1); |
6160 | + if (fd_prog < 0 && !bpf_probe_prog_type(prog_type, 0)) { |
6161 | + printf("SKIP (unsupported program type %d)\n", prog_type); |
6162 | + skips++; |
6163 | + goto close_fds; |
6164 | + } |
6165 | |
6166 | expected_ret = unpriv && test->result_unpriv != UNDEF ? |
6167 | test->result_unpriv : test->result; |
6168 | @@ -12905,7 +12912,7 @@ static void get_unpriv_disabled() |
6169 | |
6170 | static int do_test(bool unpriv, unsigned int from, unsigned int to) |
6171 | { |
6172 | - int i, passes = 0, errors = 0, skips = 0; |
6173 | + int i, passes = 0, errors = 0; |
6174 | |
6175 | for (i = from; i < to; i++) { |
6176 | struct bpf_test *test = &tests[i]; |
6177 | diff --git a/tools/testing/selftests/seccomp/seccomp_bpf.c b/tools/testing/selftests/seccomp/seccomp_bpf.c |
6178 | index 83057fa9d391..14cad657bc6a 100644 |
6179 | --- a/tools/testing/selftests/seccomp/seccomp_bpf.c |
6180 | +++ b/tools/testing/selftests/seccomp/seccomp_bpf.c |
6181 | @@ -2920,6 +2920,12 @@ TEST(get_metadata) |
6182 | struct seccomp_metadata md; |
6183 | long ret; |
6184 | |
6185 | + /* Only real root can get metadata. */ |
6186 | + if (geteuid()) { |
6187 | + XFAIL(return, "get_metadata requires real root"); |
6188 | + return; |
6189 | + } |
6190 | + |
6191 | ASSERT_EQ(0, pipe(pipefd)); |
6192 | |
6193 | pid = fork(); |