Annotation of /trunk/kernel-magellan/patches-5.0/0106-5.0.7-all-fixes.patch
Parent Directory | Revision Log
Revision 3333 -
(hide annotations)
(download)
Fri Apr 26 12:20:33 2019 UTC (5 years, 5 months ago) by niro
File size: 307346 byte(s)
Fri Apr 26 12:20:33 2019 UTC (5 years, 5 months ago) by niro
File size: 307346 byte(s)
-linux-5.0.7
1 | niro | 3333 | 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 3ee390feea61..af99c77c7066 100644 | ||
25 | --- a/Makefile | ||
26 | +++ b/Makefile | ||
27 | @@ -1,7 +1,7 @@ | ||
28 | # SPDX-License-Identifier: GPL-2.0 | ||
29 | VERSION = 5 | ||
30 | PATCHLEVEL = 0 | ||
31 | -SUBLEVEL = 6 | ||
32 | +SUBLEVEL = 7 | ||
33 | EXTRAVERSION = | ||
34 | NAME = Shy Crocodile | ||
35 | |||
36 | @@ -15,19 +15,6 @@ NAME = Shy Crocodile | ||
37 | PHONY := _all | ||
38 | _all: | ||
39 | |||
40 | -# Do not use make's built-in rules and variables | ||
41 | -# (this increases performance and avoids hard-to-debug behaviour) | ||
42 | -MAKEFLAGS += -rR | ||
43 | - | ||
44 | -# Avoid funny character set dependencies | ||
45 | -unexport LC_ALL | ||
46 | -LC_COLLATE=C | ||
47 | -LC_NUMERIC=C | ||
48 | -export LC_COLLATE LC_NUMERIC | ||
49 | - | ||
50 | -# Avoid interference with shell env settings | ||
51 | -unexport GREP_OPTIONS | ||
52 | - | ||
53 | # We are using a recursive build, so we need to do a little thinking | ||
54 | # to get the ordering right. | ||
55 | # | ||
56 | @@ -44,6 +31,21 @@ unexport GREP_OPTIONS | ||
57 | # descending is started. They are now explicitly listed as the | ||
58 | # prepare rule. | ||
59 | |||
60 | +ifneq ($(sub-make-done),1) | ||
61 | + | ||
62 | +# Do not use make's built-in rules and variables | ||
63 | +# (this increases performance and avoids hard-to-debug behaviour) | ||
64 | +MAKEFLAGS += -rR | ||
65 | + | ||
66 | +# Avoid funny character set dependencies | ||
67 | +unexport LC_ALL | ||
68 | +LC_COLLATE=C | ||
69 | +LC_NUMERIC=C | ||
70 | +export LC_COLLATE LC_NUMERIC | ||
71 | + | ||
72 | +# Avoid interference with shell env settings | ||
73 | +unexport GREP_OPTIONS | ||
74 | + | ||
75 | # Beautify output | ||
76 | # --------------------------------------------------------------------------- | ||
77 | # | ||
78 | @@ -112,7 +114,6 @@ export quiet Q KBUILD_VERBOSE | ||
79 | |||
80 | # KBUILD_SRC is not intended to be used by the regular user (for now), | ||
81 | # it is set on invocation of make with KBUILD_OUTPUT or O= specified. | ||
82 | -ifeq ($(KBUILD_SRC),) | ||
83 | |||
84 | # OK, Make called in directory where kernel src resides | ||
85 | # Do we want to locate output files in a separate directory? | ||
86 | @@ -142,6 +143,24 @@ $(if $(KBUILD_OUTPUT),, \ | ||
87 | # 'sub-make' below. | ||
88 | MAKEFLAGS += --include-dir=$(CURDIR) | ||
89 | |||
90 | +need-sub-make := 1 | ||
91 | +else | ||
92 | + | ||
93 | +# Do not print "Entering directory ..." at all for in-tree build. | ||
94 | +MAKEFLAGS += --no-print-directory | ||
95 | + | ||
96 | +endif # ifneq ($(KBUILD_OUTPUT),) | ||
97 | + | ||
98 | +ifneq ($(filter 3.%,$(MAKE_VERSION)),) | ||
99 | +# 'MAKEFLAGS += -rR' does not immediately become effective for GNU Make 3.x | ||
100 | +# We need to invoke sub-make to avoid implicit rules in the top Makefile. | ||
101 | +need-sub-make := 1 | ||
102 | +# Cancel implicit rules for this Makefile. | ||
103 | +$(lastword $(MAKEFILE_LIST)): ; | ||
104 | +endif | ||
105 | + | ||
106 | +ifeq ($(need-sub-make),1) | ||
107 | + | ||
108 | PHONY += $(MAKECMDGOALS) sub-make | ||
109 | |||
110 | $(filter-out _all sub-make $(CURDIR)/Makefile, $(MAKECMDGOALS)) _all: sub-make | ||
111 | @@ -149,16 +168,15 @@ $(filter-out _all sub-make $(CURDIR)/Makefile, $(MAKECMDGOALS)) _all: sub-make | ||
112 | |||
113 | # Invoke a second make in the output directory, passing relevant variables | ||
114 | sub-make: | ||
115 | - $(Q)$(MAKE) -C $(KBUILD_OUTPUT) KBUILD_SRC=$(CURDIR) \ | ||
116 | + $(Q)$(MAKE) sub-make-done=1 \ | ||
117 | + $(if $(KBUILD_OUTPUT),-C $(KBUILD_OUTPUT) KBUILD_SRC=$(CURDIR)) \ | ||
118 | -f $(CURDIR)/Makefile $(filter-out _all sub-make,$(MAKECMDGOALS)) | ||
119 | |||
120 | -# Leave processing to above invocation of make | ||
121 | -skip-makefile := 1 | ||
122 | -endif # ifneq ($(KBUILD_OUTPUT),) | ||
123 | -endif # ifeq ($(KBUILD_SRC),) | ||
124 | +endif # need-sub-make | ||
125 | +endif # sub-make-done | ||
126 | |||
127 | # We process the rest of the Makefile if this is the final invocation of make | ||
128 | -ifeq ($(skip-makefile),) | ||
129 | +ifeq ($(need-sub-make),) | ||
130 | |||
131 | # Do not print "Entering directory ...", | ||
132 | # but we want to display it when entering to the output directory | ||
133 | @@ -625,12 +643,15 @@ ifeq ($(may-sync-config),1) | ||
134 | -include include/config/auto.conf.cmd | ||
135 | |||
136 | # To avoid any implicit rule to kick in, define an empty command | ||
137 | -$(KCONFIG_CONFIG) include/config/auto.conf.cmd: ; | ||
138 | +$(KCONFIG_CONFIG): ; | ||
139 | |||
140 | # The actual configuration files used during the build are stored in | ||
141 | # include/generated/ and include/config/. Update them if .config is newer than | ||
142 | # include/config/auto.conf (which mirrors .config). | ||
143 | -include/config/%.conf: $(KCONFIG_CONFIG) include/config/auto.conf.cmd | ||
144 | +# | ||
145 | +# This exploits the 'multi-target pattern rule' trick. | ||
146 | +# The syncconfig should be executed only once to make all the targets. | ||
147 | +%/auto.conf %/auto.conf.cmd %/tristate.conf: $(KCONFIG_CONFIG) | ||
148 | $(Q)$(MAKE) -f $(srctree)/Makefile syncconfig | ||
149 | else | ||
150 | # External modules and some install targets need include/generated/autoconf.h | ||
151 | @@ -1756,7 +1777,7 @@ $(cmd_files): ; # Do not try to update included dependency files | ||
152 | |||
153 | endif # ifeq ($(config-targets),1) | ||
154 | endif # ifeq ($(mixed-targets),1) | ||
155 | -endif # skip-makefile | ||
156 | +endif # need-sub-make | ||
157 | |||
158 | PHONY += FORCE | ||
159 | FORCE: | ||
160 | diff --git a/arch/arm/boot/dts/lpc32xx.dtsi b/arch/arm/boot/dts/lpc32xx.dtsi | ||
161 | index b7303a4e4236..ed0d6fb20122 100644 | ||
162 | --- a/arch/arm/boot/dts/lpc32xx.dtsi | ||
163 | +++ b/arch/arm/boot/dts/lpc32xx.dtsi | ||
164 | @@ -230,7 +230,7 @@ | ||
165 | status = "disabled"; | ||
166 | }; | ||
167 | |||
168 | - i2s1: i2s@2009C000 { | ||
169 | + i2s1: i2s@2009c000 { | ||
170 | compatible = "nxp,lpc3220-i2s"; | ||
171 | reg = <0x2009C000 0x1000>; | ||
172 | }; | ||
173 | @@ -273,7 +273,7 @@ | ||
174 | status = "disabled"; | ||
175 | }; | ||
176 | |||
177 | - i2c1: i2c@400A0000 { | ||
178 | + i2c1: i2c@400a0000 { | ||
179 | compatible = "nxp,pnx-i2c"; | ||
180 | reg = <0x400A0000 0x100>; | ||
181 | interrupt-parent = <&sic1>; | ||
182 | @@ -284,7 +284,7 @@ | ||
183 | clocks = <&clk LPC32XX_CLK_I2C1>; | ||
184 | }; | ||
185 | |||
186 | - i2c2: i2c@400A8000 { | ||
187 | + i2c2: i2c@400a8000 { | ||
188 | compatible = "nxp,pnx-i2c"; | ||
189 | reg = <0x400A8000 0x100>; | ||
190 | interrupt-parent = <&sic1>; | ||
191 | @@ -295,7 +295,7 @@ | ||
192 | clocks = <&clk LPC32XX_CLK_I2C2>; | ||
193 | }; | ||
194 | |||
195 | - mpwm: mpwm@400E8000 { | ||
196 | + mpwm: mpwm@400e8000 { | ||
197 | compatible = "nxp,lpc3220-motor-pwm"; | ||
198 | reg = <0x400E8000 0x78>; | ||
199 | status = "disabled"; | ||
200 | @@ -394,7 +394,7 @@ | ||
201 | #gpio-cells = <3>; /* bank, pin, flags */ | ||
202 | }; | ||
203 | |||
204 | - timer4: timer@4002C000 { | ||
205 | + timer4: timer@4002c000 { | ||
206 | compatible = "nxp,lpc3220-timer"; | ||
207 | reg = <0x4002C000 0x1000>; | ||
208 | interrupts = <3 IRQ_TYPE_LEVEL_LOW>; | ||
209 | @@ -412,7 +412,7 @@ | ||
210 | status = "disabled"; | ||
211 | }; | ||
212 | |||
213 | - watchdog: watchdog@4003C000 { | ||
214 | + watchdog: watchdog@4003c000 { | ||
215 | compatible = "nxp,pnx4008-wdt"; | ||
216 | reg = <0x4003C000 0x1000>; | ||
217 | clocks = <&clk LPC32XX_CLK_WDOG>; | ||
218 | @@ -451,7 +451,7 @@ | ||
219 | status = "disabled"; | ||
220 | }; | ||
221 | |||
222 | - timer1: timer@4004C000 { | ||
223 | + timer1: timer@4004c000 { | ||
224 | compatible = "nxp,lpc3220-timer"; | ||
225 | reg = <0x4004C000 0x1000>; | ||
226 | interrupts = <17 IRQ_TYPE_LEVEL_LOW>; | ||
227 | @@ -475,7 +475,7 @@ | ||
228 | status = "disabled"; | ||
229 | }; | ||
230 | |||
231 | - pwm1: pwm@4005C000 { | ||
232 | + pwm1: pwm@4005c000 { | ||
233 | compatible = "nxp,lpc3220-pwm"; | ||
234 | reg = <0x4005C000 0x4>; | ||
235 | clocks = <&clk LPC32XX_CLK_PWM1>; | ||
236 | @@ -484,7 +484,7 @@ | ||
237 | status = "disabled"; | ||
238 | }; | ||
239 | |||
240 | - pwm2: pwm@4005C004 { | ||
241 | + pwm2: pwm@4005c004 { | ||
242 | compatible = "nxp,lpc3220-pwm"; | ||
243 | reg = <0x4005C004 0x4>; | ||
244 | clocks = <&clk LPC32XX_CLK_PWM2>; | ||
245 | diff --git a/arch/arm/boot/dts/meson8b.dtsi b/arch/arm/boot/dts/meson8b.dtsi | ||
246 | index 22d775460767..dc125769fe85 100644 | ||
247 | --- a/arch/arm/boot/dts/meson8b.dtsi | ||
248 | +++ b/arch/arm/boot/dts/meson8b.dtsi | ||
249 | @@ -270,9 +270,7 @@ | ||
250 | groups = "eth_tx_clk", | ||
251 | "eth_tx_en", | ||
252 | "eth_txd1_0", | ||
253 | - "eth_txd1_1", | ||
254 | "eth_txd0_0", | ||
255 | - "eth_txd0_1", | ||
256 | "eth_rx_clk", | ||
257 | "eth_rx_dv", | ||
258 | "eth_rxd1", | ||
259 | @@ -281,7 +279,9 @@ | ||
260 | "eth_mdc", | ||
261 | "eth_ref_clk", | ||
262 | "eth_txd2", | ||
263 | - "eth_txd3"; | ||
264 | + "eth_txd3", | ||
265 | + "eth_rxd3", | ||
266 | + "eth_rxd2"; | ||
267 | function = "ethernet"; | ||
268 | bias-disable; | ||
269 | }; | ||
270 | diff --git a/arch/arm/include/asm/barrier.h b/arch/arm/include/asm/barrier.h | ||
271 | index 69772e742a0a..83ae97c049d9 100644 | ||
272 | --- a/arch/arm/include/asm/barrier.h | ||
273 | +++ b/arch/arm/include/asm/barrier.h | ||
274 | @@ -11,6 +11,8 @@ | ||
275 | #define sev() __asm__ __volatile__ ("sev" : : : "memory") | ||
276 | #define wfe() __asm__ __volatile__ ("wfe" : : : "memory") | ||
277 | #define wfi() __asm__ __volatile__ ("wfi" : : : "memory") | ||
278 | +#else | ||
279 | +#define wfe() do { } while (0) | ||
280 | #endif | ||
281 | |||
282 | #if __LINUX_ARM_ARCH__ >= 7 | ||
283 | diff --git a/arch/arm/include/asm/processor.h b/arch/arm/include/asm/processor.h | ||
284 | index 120f4c9bbfde..57fe73ea0f72 100644 | ||
285 | --- a/arch/arm/include/asm/processor.h | ||
286 | +++ b/arch/arm/include/asm/processor.h | ||
287 | @@ -89,7 +89,11 @@ extern void release_thread(struct task_struct *); | ||
288 | unsigned long get_wchan(struct task_struct *p); | ||
289 | |||
290 | #if __LINUX_ARM_ARCH__ == 6 || defined(CONFIG_ARM_ERRATA_754327) | ||
291 | -#define cpu_relax() smp_mb() | ||
292 | +#define cpu_relax() \ | ||
293 | + do { \ | ||
294 | + smp_mb(); \ | ||
295 | + __asm__ __volatile__("nop; nop; nop; nop; nop; nop; nop; nop; nop; nop;"); \ | ||
296 | + } while (0) | ||
297 | #else | ||
298 | #define cpu_relax() barrier() | ||
299 | #endif | ||
300 | diff --git a/arch/arm/include/asm/v7m.h b/arch/arm/include/asm/v7m.h | ||
301 | index 187ccf6496ad..2cb00d15831b 100644 | ||
302 | --- a/arch/arm/include/asm/v7m.h | ||
303 | +++ b/arch/arm/include/asm/v7m.h | ||
304 | @@ -49,7 +49,7 @@ | ||
305 | * (0 -> msp; 1 -> psp). Bits [1:0] are fixed to 0b01. | ||
306 | */ | ||
307 | #define EXC_RET_STACK_MASK 0x00000004 | ||
308 | -#define EXC_RET_THREADMODE_PROCESSSTACK 0xfffffffd | ||
309 | +#define EXC_RET_THREADMODE_PROCESSSTACK (3 << 2) | ||
310 | |||
311 | /* Cache related definitions */ | ||
312 | |||
313 | diff --git a/arch/arm/kernel/entry-header.S b/arch/arm/kernel/entry-header.S | ||
314 | index 773424843d6e..62db1c9746cb 100644 | ||
315 | --- a/arch/arm/kernel/entry-header.S | ||
316 | +++ b/arch/arm/kernel/entry-header.S | ||
317 | @@ -127,7 +127,8 @@ | ||
318 | */ | ||
319 | .macro v7m_exception_slow_exit ret_r0 | ||
320 | cpsid i | ||
321 | - ldr lr, =EXC_RET_THREADMODE_PROCESSSTACK | ||
322 | + ldr lr, =exc_ret | ||
323 | + ldr lr, [lr] | ||
324 | |||
325 | @ read original r12, sp, lr, pc and xPSR | ||
326 | add r12, sp, #S_IP | ||
327 | diff --git a/arch/arm/kernel/entry-v7m.S b/arch/arm/kernel/entry-v7m.S | ||
328 | index abcf47848525..19d2dcd6530d 100644 | ||
329 | --- a/arch/arm/kernel/entry-v7m.S | ||
330 | +++ b/arch/arm/kernel/entry-v7m.S | ||
331 | @@ -146,3 +146,7 @@ ENTRY(vector_table) | ||
332 | .rept CONFIG_CPU_V7M_NUM_IRQ | ||
333 | .long __irq_entry @ External Interrupts | ||
334 | .endr | ||
335 | + .align 2 | ||
336 | + .globl exc_ret | ||
337 | +exc_ret: | ||
338 | + .space 4 | ||
339 | diff --git a/arch/arm/kernel/machine_kexec.c b/arch/arm/kernel/machine_kexec.c | ||
340 | index dd2eb5f76b9f..76300f3813e8 100644 | ||
341 | --- a/arch/arm/kernel/machine_kexec.c | ||
342 | +++ b/arch/arm/kernel/machine_kexec.c | ||
343 | @@ -91,8 +91,11 @@ void machine_crash_nonpanic_core(void *unused) | ||
344 | |||
345 | set_cpu_online(smp_processor_id(), false); | ||
346 | atomic_dec(&waiting_for_crash_ipi); | ||
347 | - while (1) | ||
348 | + | ||
349 | + while (1) { | ||
350 | cpu_relax(); | ||
351 | + wfe(); | ||
352 | + } | ||
353 | } | ||
354 | |||
355 | void crash_smp_send_stop(void) | ||
356 | diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c | ||
357 | index 1d6f5ea522f4..a3ce7c5365fa 100644 | ||
358 | --- a/arch/arm/kernel/smp.c | ||
359 | +++ b/arch/arm/kernel/smp.c | ||
360 | @@ -604,8 +604,10 @@ static void ipi_cpu_stop(unsigned int cpu) | ||
361 | local_fiq_disable(); | ||
362 | local_irq_disable(); | ||
363 | |||
364 | - while (1) | ||
365 | + while (1) { | ||
366 | cpu_relax(); | ||
367 | + wfe(); | ||
368 | + } | ||
369 | } | ||
370 | |||
371 | static DEFINE_PER_CPU(struct completion *, cpu_completion); | ||
372 | diff --git a/arch/arm/kernel/unwind.c b/arch/arm/kernel/unwind.c | ||
373 | index 0bee233fef9a..314cfb232a63 100644 | ||
374 | --- a/arch/arm/kernel/unwind.c | ||
375 | +++ b/arch/arm/kernel/unwind.c | ||
376 | @@ -93,7 +93,7 @@ extern const struct unwind_idx __start_unwind_idx[]; | ||
377 | static const struct unwind_idx *__origin_unwind_idx; | ||
378 | extern const struct unwind_idx __stop_unwind_idx[]; | ||
379 | |||
380 | -static DEFINE_SPINLOCK(unwind_lock); | ||
381 | +static DEFINE_RAW_SPINLOCK(unwind_lock); | ||
382 | static LIST_HEAD(unwind_tables); | ||
383 | |||
384 | /* Convert a prel31 symbol to an absolute address */ | ||
385 | @@ -201,7 +201,7 @@ static const struct unwind_idx *unwind_find_idx(unsigned long addr) | ||
386 | /* module unwind tables */ | ||
387 | struct unwind_table *table; | ||
388 | |||
389 | - spin_lock_irqsave(&unwind_lock, flags); | ||
390 | + raw_spin_lock_irqsave(&unwind_lock, flags); | ||
391 | list_for_each_entry(table, &unwind_tables, list) { | ||
392 | if (addr >= table->begin_addr && | ||
393 | addr < table->end_addr) { | ||
394 | @@ -213,7 +213,7 @@ static const struct unwind_idx *unwind_find_idx(unsigned long addr) | ||
395 | break; | ||
396 | } | ||
397 | } | ||
398 | - spin_unlock_irqrestore(&unwind_lock, flags); | ||
399 | + raw_spin_unlock_irqrestore(&unwind_lock, flags); | ||
400 | } | ||
401 | |||
402 | pr_debug("%s: idx = %p\n", __func__, idx); | ||
403 | @@ -529,9 +529,9 @@ struct unwind_table *unwind_table_add(unsigned long start, unsigned long size, | ||
404 | tab->begin_addr = text_addr; | ||
405 | tab->end_addr = text_addr + text_size; | ||
406 | |||
407 | - spin_lock_irqsave(&unwind_lock, flags); | ||
408 | + raw_spin_lock_irqsave(&unwind_lock, flags); | ||
409 | list_add_tail(&tab->list, &unwind_tables); | ||
410 | - spin_unlock_irqrestore(&unwind_lock, flags); | ||
411 | + raw_spin_unlock_irqrestore(&unwind_lock, flags); | ||
412 | |||
413 | return tab; | ||
414 | } | ||
415 | @@ -543,9 +543,9 @@ void unwind_table_del(struct unwind_table *tab) | ||
416 | if (!tab) | ||
417 | return; | ||
418 | |||
419 | - spin_lock_irqsave(&unwind_lock, flags); | ||
420 | + raw_spin_lock_irqsave(&unwind_lock, flags); | ||
421 | list_del(&tab->list); | ||
422 | - spin_unlock_irqrestore(&unwind_lock, flags); | ||
423 | + raw_spin_unlock_irqrestore(&unwind_lock, flags); | ||
424 | |||
425 | kfree(tab); | ||
426 | } | ||
427 | diff --git a/arch/arm/lib/Makefile b/arch/arm/lib/Makefile | ||
428 | index ad25fd1872c7..0bff0176db2c 100644 | ||
429 | --- a/arch/arm/lib/Makefile | ||
430 | +++ b/arch/arm/lib/Makefile | ||
431 | @@ -39,7 +39,7 @@ $(obj)/csumpartialcopy.o: $(obj)/csumpartialcopygeneric.S | ||
432 | $(obj)/csumpartialcopyuser.o: $(obj)/csumpartialcopygeneric.S | ||
433 | |||
434 | ifeq ($(CONFIG_KERNEL_MODE_NEON),y) | ||
435 | - NEON_FLAGS := -mfloat-abi=softfp -mfpu=neon | ||
436 | + NEON_FLAGS := -march=armv7-a -mfloat-abi=softfp -mfpu=neon | ||
437 | CFLAGS_xor-neon.o += $(NEON_FLAGS) | ||
438 | obj-$(CONFIG_XOR_BLOCKS) += xor-neon.o | ||
439 | endif | ||
440 | diff --git a/arch/arm/lib/xor-neon.c b/arch/arm/lib/xor-neon.c | ||
441 | index 2c40aeab3eaa..c691b901092f 100644 | ||
442 | --- a/arch/arm/lib/xor-neon.c | ||
443 | +++ b/arch/arm/lib/xor-neon.c | ||
444 | @@ -14,7 +14,7 @@ | ||
445 | MODULE_LICENSE("GPL"); | ||
446 | |||
447 | #ifndef __ARM_NEON__ | ||
448 | -#error You should compile this file with '-mfloat-abi=softfp -mfpu=neon' | ||
449 | +#error You should compile this file with '-march=armv7-a -mfloat-abi=softfp -mfpu=neon' | ||
450 | #endif | ||
451 | |||
452 | /* | ||
453 | diff --git a/arch/arm/mach-omap2/prm_common.c b/arch/arm/mach-omap2/prm_common.c | ||
454 | index 058a37e6d11c..fd6e0671f957 100644 | ||
455 | --- a/arch/arm/mach-omap2/prm_common.c | ||
456 | +++ b/arch/arm/mach-omap2/prm_common.c | ||
457 | @@ -523,8 +523,10 @@ void omap_prm_reset_system(void) | ||
458 | |||
459 | prm_ll_data->reset_system(); | ||
460 | |||
461 | - while (1) | ||
462 | + while (1) { | ||
463 | cpu_relax(); | ||
464 | + wfe(); | ||
465 | + } | ||
466 | } | ||
467 | |||
468 | /** | ||
469 | diff --git a/arch/arm/mach-shmobile/regulator-quirk-rcar-gen2.c b/arch/arm/mach-shmobile/regulator-quirk-rcar-gen2.c | ||
470 | index 8e50daa99151..dc526ef2e9b3 100644 | ||
471 | --- a/arch/arm/mach-shmobile/regulator-quirk-rcar-gen2.c | ||
472 | +++ b/arch/arm/mach-shmobile/regulator-quirk-rcar-gen2.c | ||
473 | @@ -40,6 +40,7 @@ | ||
474 | struct regulator_quirk { | ||
475 | struct list_head list; | ||
476 | const struct of_device_id *id; | ||
477 | + struct device_node *np; | ||
478 | struct of_phandle_args irq_args; | ||
479 | struct i2c_msg i2c_msg; | ||
480 | bool shared; /* IRQ line is shared */ | ||
481 | @@ -101,6 +102,9 @@ static int regulator_quirk_notify(struct notifier_block *nb, | ||
482 | if (!pos->shared) | ||
483 | continue; | ||
484 | |||
485 | + if (pos->np->parent != client->dev.parent->of_node) | ||
486 | + continue; | ||
487 | + | ||
488 | dev_info(&client->dev, "clearing %s@0x%02x interrupts\n", | ||
489 | pos->id->compatible, pos->i2c_msg.addr); | ||
490 | |||
491 | @@ -165,6 +169,7 @@ static int __init rcar_gen2_regulator_quirk(void) | ||
492 | memcpy(&quirk->i2c_msg, id->data, sizeof(quirk->i2c_msg)); | ||
493 | |||
494 | quirk->id = id; | ||
495 | + quirk->np = np; | ||
496 | quirk->i2c_msg.addr = addr; | ||
497 | |||
498 | ret = of_irq_parse_one(np, 0, argsa); | ||
499 | diff --git a/arch/arm/mm/copypage-v4mc.c b/arch/arm/mm/copypage-v4mc.c | ||
500 | index b03202cddddb..f74cdce6d4da 100644 | ||
501 | --- a/arch/arm/mm/copypage-v4mc.c | ||
502 | +++ b/arch/arm/mm/copypage-v4mc.c | ||
503 | @@ -45,6 +45,7 @@ static void mc_copy_user_page(void *from, void *to) | ||
504 | int tmp; | ||
505 | |||
506 | asm volatile ("\ | ||
507 | + .syntax unified\n\ | ||
508 | ldmia %0!, {r2, r3, ip, lr} @ 4\n\ | ||
509 | 1: mcr p15, 0, %1, c7, c6, 1 @ 1 invalidate D line\n\ | ||
510 | stmia %1!, {r2, r3, ip, lr} @ 4\n\ | ||
511 | @@ -56,7 +57,7 @@ static void mc_copy_user_page(void *from, void *to) | ||
512 | ldmia %0!, {r2, r3, ip, lr} @ 4\n\ | ||
513 | subs %2, %2, #1 @ 1\n\ | ||
514 | stmia %1!, {r2, r3, ip, lr} @ 4\n\ | ||
515 | - ldmneia %0!, {r2, r3, ip, lr} @ 4\n\ | ||
516 | + ldmiane %0!, {r2, r3, ip, lr} @ 4\n\ | ||
517 | bne 1b @ " | ||
518 | : "+&r" (from), "+&r" (to), "=&r" (tmp) | ||
519 | : "2" (PAGE_SIZE / 64) | ||
520 | diff --git a/arch/arm/mm/copypage-v4wb.c b/arch/arm/mm/copypage-v4wb.c | ||
521 | index cd3e165afeed..6d336740aae4 100644 | ||
522 | --- a/arch/arm/mm/copypage-v4wb.c | ||
523 | +++ b/arch/arm/mm/copypage-v4wb.c | ||
524 | @@ -27,6 +27,7 @@ static void v4wb_copy_user_page(void *kto, const void *kfrom) | ||
525 | int tmp; | ||
526 | |||
527 | asm volatile ("\ | ||
528 | + .syntax unified\n\ | ||
529 | ldmia %1!, {r3, r4, ip, lr} @ 4\n\ | ||
530 | 1: mcr p15, 0, %0, c7, c6, 1 @ 1 invalidate D line\n\ | ||
531 | stmia %0!, {r3, r4, ip, lr} @ 4\n\ | ||
532 | @@ -38,7 +39,7 @@ static void v4wb_copy_user_page(void *kto, const void *kfrom) | ||
533 | ldmia %1!, {r3, r4, ip, lr} @ 4\n\ | ||
534 | subs %2, %2, #1 @ 1\n\ | ||
535 | stmia %0!, {r3, r4, ip, lr} @ 4\n\ | ||
536 | - ldmneia %1!, {r3, r4, ip, lr} @ 4\n\ | ||
537 | + ldmiane %1!, {r3, r4, ip, lr} @ 4\n\ | ||
538 | bne 1b @ 1\n\ | ||
539 | mcr p15, 0, %1, c7, c10, 4 @ 1 drain WB" | ||
540 | : "+&r" (kto), "+&r" (kfrom), "=&r" (tmp) | ||
541 | diff --git a/arch/arm/mm/copypage-v4wt.c b/arch/arm/mm/copypage-v4wt.c | ||
542 | index 8614572e1296..3851bb396442 100644 | ||
543 | --- a/arch/arm/mm/copypage-v4wt.c | ||
544 | +++ b/arch/arm/mm/copypage-v4wt.c | ||
545 | @@ -25,6 +25,7 @@ static void v4wt_copy_user_page(void *kto, const void *kfrom) | ||
546 | int tmp; | ||
547 | |||
548 | asm volatile ("\ | ||
549 | + .syntax unified\n\ | ||
550 | ldmia %1!, {r3, r4, ip, lr} @ 4\n\ | ||
551 | 1: stmia %0!, {r3, r4, ip, lr} @ 4\n\ | ||
552 | ldmia %1!, {r3, r4, ip, lr} @ 4+1\n\ | ||
553 | @@ -34,7 +35,7 @@ static void v4wt_copy_user_page(void *kto, const void *kfrom) | ||
554 | ldmia %1!, {r3, r4, ip, lr} @ 4\n\ | ||
555 | subs %2, %2, #1 @ 1\n\ | ||
556 | stmia %0!, {r3, r4, ip, lr} @ 4\n\ | ||
557 | - ldmneia %1!, {r3, r4, ip, lr} @ 4\n\ | ||
558 | + ldmiane %1!, {r3, r4, ip, lr} @ 4\n\ | ||
559 | bne 1b @ 1\n\ | ||
560 | mcr p15, 0, %2, c7, c7, 0 @ flush ID cache" | ||
561 | : "+&r" (kto), "+&r" (kfrom), "=&r" (tmp) | ||
562 | diff --git a/arch/arm/mm/proc-v7m.S b/arch/arm/mm/proc-v7m.S | ||
563 | index 47a5acc64433..92e84181933a 100644 | ||
564 | --- a/arch/arm/mm/proc-v7m.S | ||
565 | +++ b/arch/arm/mm/proc-v7m.S | ||
566 | @@ -139,6 +139,9 @@ __v7m_setup_cont: | ||
567 | cpsie i | ||
568 | svc #0 | ||
569 | 1: cpsid i | ||
570 | + ldr r0, =exc_ret | ||
571 | + orr lr, lr, #EXC_RET_THREADMODE_PROCESSSTACK | ||
572 | + str lr, [r0] | ||
573 | ldmia sp, {r0-r3, r12} | ||
574 | str r5, [r12, #11 * 4] @ restore the original SVC vector entry | ||
575 | mov lr, r6 @ restore LR | ||
576 | diff --git a/arch/h8300/Makefile b/arch/h8300/Makefile | ||
577 | index f801f3708a89..ba0f26cfad61 100644 | ||
578 | --- a/arch/h8300/Makefile | ||
579 | +++ b/arch/h8300/Makefile | ||
580 | @@ -27,7 +27,7 @@ KBUILD_LDFLAGS += $(ldflags-y) | ||
581 | CHECKFLAGS += -msize-long | ||
582 | |||
583 | ifeq ($(CROSS_COMPILE),) | ||
584 | -CROSS_COMPILE := h8300-unknown-linux- | ||
585 | +CROSS_COMPILE := $(call cc-cross-prefix, h8300-unknown-linux- h8300-linux-) | ||
586 | endif | ||
587 | |||
588 | core-y += arch/$(ARCH)/kernel/ arch/$(ARCH)/mm/ | ||
589 | diff --git a/arch/powerpc/include/asm/topology.h b/arch/powerpc/include/asm/topology.h | ||
590 | index a4a718dbfec6..f85e2b01c3df 100644 | ||
591 | --- a/arch/powerpc/include/asm/topology.h | ||
592 | +++ b/arch/powerpc/include/asm/topology.h | ||
593 | @@ -132,6 +132,8 @@ static inline void shared_proc_topology_init(void) {} | ||
594 | #define topology_sibling_cpumask(cpu) (per_cpu(cpu_sibling_map, cpu)) | ||
595 | #define topology_core_cpumask(cpu) (per_cpu(cpu_core_map, cpu)) | ||
596 | #define topology_core_id(cpu) (cpu_to_core_id(cpu)) | ||
597 | + | ||
598 | +int dlpar_cpu_readd(int cpu); | ||
599 | #endif | ||
600 | #endif | ||
601 | |||
602 | diff --git a/arch/powerpc/kernel/entry_64.S b/arch/powerpc/kernel/entry_64.S | ||
603 | index 435927f549c4..a2c168b395d2 100644 | ||
604 | --- a/arch/powerpc/kernel/entry_64.S | ||
605 | +++ b/arch/powerpc/kernel/entry_64.S | ||
606 | @@ -1002,6 +1002,13 @@ END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR) | ||
607 | ld r2,_NIP(r1) | ||
608 | mtspr SPRN_SRR0,r2 | ||
609 | |||
610 | + /* | ||
611 | + * Leaving a stale exception_marker on the stack can confuse | ||
612 | + * the reliable stack unwinder later on. Clear it. | ||
613 | + */ | ||
614 | + li r2,0 | ||
615 | + std r2,STACK_FRAME_OVERHEAD-16(r1) | ||
616 | + | ||
617 | ld r0,GPR0(r1) | ||
618 | ld r2,GPR2(r1) | ||
619 | ld r3,GPR3(r1) | ||
620 | diff --git a/arch/powerpc/kernel/ptrace.c b/arch/powerpc/kernel/ptrace.c | ||
621 | index 53151698bfe0..d9ac7d94656e 100644 | ||
622 | --- a/arch/powerpc/kernel/ptrace.c | ||
623 | +++ b/arch/powerpc/kernel/ptrace.c | ||
624 | @@ -33,6 +33,7 @@ | ||
625 | #include <linux/hw_breakpoint.h> | ||
626 | #include <linux/perf_event.h> | ||
627 | #include <linux/context_tracking.h> | ||
628 | +#include <linux/nospec.h> | ||
629 | |||
630 | #include <linux/uaccess.h> | ||
631 | #include <linux/pkeys.h> | ||
632 | @@ -274,6 +275,8 @@ static int set_user_trap(struct task_struct *task, unsigned long trap) | ||
633 | */ | ||
634 | int ptrace_get_reg(struct task_struct *task, int regno, unsigned long *data) | ||
635 | { | ||
636 | + unsigned int regs_max; | ||
637 | + | ||
638 | if ((task->thread.regs == NULL) || !data) | ||
639 | return -EIO; | ||
640 | |||
641 | @@ -297,7 +300,9 @@ int ptrace_get_reg(struct task_struct *task, int regno, unsigned long *data) | ||
642 | } | ||
643 | #endif | ||
644 | |||
645 | - if (regno < (sizeof(struct user_pt_regs) / sizeof(unsigned long))) { | ||
646 | + regs_max = sizeof(struct user_pt_regs) / sizeof(unsigned long); | ||
647 | + if (regno < regs_max) { | ||
648 | + regno = array_index_nospec(regno, regs_max); | ||
649 | *data = ((unsigned long *)task->thread.regs)[regno]; | ||
650 | return 0; | ||
651 | } | ||
652 | @@ -321,6 +326,7 @@ int ptrace_put_reg(struct task_struct *task, int regno, unsigned long data) | ||
653 | return set_user_dscr(task, data); | ||
654 | |||
655 | if (regno <= PT_MAX_PUT_REG) { | ||
656 | + regno = array_index_nospec(regno, PT_MAX_PUT_REG + 1); | ||
657 | ((unsigned long *)task->thread.regs)[regno] = data; | ||
658 | return 0; | ||
659 | } | ||
660 | diff --git a/arch/powerpc/mm/hugetlbpage-radix.c b/arch/powerpc/mm/hugetlbpage-radix.c | ||
661 | index 2486bee0f93e..97c7a39ebc00 100644 | ||
662 | --- a/arch/powerpc/mm/hugetlbpage-radix.c | ||
663 | +++ b/arch/powerpc/mm/hugetlbpage-radix.c | ||
664 | @@ -1,6 +1,7 @@ | ||
665 | // SPDX-License-Identifier: GPL-2.0 | ||
666 | #include <linux/mm.h> | ||
667 | #include <linux/hugetlb.h> | ||
668 | +#include <linux/security.h> | ||
669 | #include <asm/pgtable.h> | ||
670 | #include <asm/pgalloc.h> | ||
671 | #include <asm/cacheflush.h> | ||
672 | @@ -73,7 +74,7 @@ radix__hugetlb_get_unmapped_area(struct file *file, unsigned long addr, | ||
673 | if (addr) { | ||
674 | addr = ALIGN(addr, huge_page_size(h)); | ||
675 | vma = find_vma(mm, addr); | ||
676 | - if (high_limit - len >= addr && | ||
677 | + if (high_limit - len >= addr && addr >= mmap_min_addr && | ||
678 | (!vma || addr + len <= vm_start_gap(vma))) | ||
679 | return addr; | ||
680 | } | ||
681 | @@ -83,7 +84,7 @@ radix__hugetlb_get_unmapped_area(struct file *file, unsigned long addr, | ||
682 | */ | ||
683 | info.flags = VM_UNMAPPED_AREA_TOPDOWN; | ||
684 | info.length = len; | ||
685 | - info.low_limit = PAGE_SIZE; | ||
686 | + info.low_limit = max(PAGE_SIZE, mmap_min_addr); | ||
687 | info.high_limit = mm->mmap_base + (high_limit - DEFAULT_MAP_WINDOW); | ||
688 | info.align_mask = PAGE_MASK & ~huge_page_mask(h); | ||
689 | info.align_offset = 0; | ||
690 | diff --git a/arch/powerpc/mm/numa.c b/arch/powerpc/mm/numa.c | ||
691 | index 87f0dd004295..b5d1c45c1475 100644 | ||
692 | --- a/arch/powerpc/mm/numa.c | ||
693 | +++ b/arch/powerpc/mm/numa.c | ||
694 | @@ -1460,13 +1460,6 @@ static void reset_topology_timer(void) | ||
695 | |||
696 | #ifdef CONFIG_SMP | ||
697 | |||
698 | -static void stage_topology_update(int core_id) | ||
699 | -{ | ||
700 | - cpumask_or(&cpu_associativity_changes_mask, | ||
701 | - &cpu_associativity_changes_mask, cpu_sibling_mask(core_id)); | ||
702 | - reset_topology_timer(); | ||
703 | -} | ||
704 | - | ||
705 | static int dt_update_callback(struct notifier_block *nb, | ||
706 | unsigned long action, void *data) | ||
707 | { | ||
708 | @@ -1479,7 +1472,7 @@ static int dt_update_callback(struct notifier_block *nb, | ||
709 | !of_prop_cmp(update->prop->name, "ibm,associativity")) { | ||
710 | u32 core_id; | ||
711 | of_property_read_u32(update->dn, "reg", &core_id); | ||
712 | - stage_topology_update(core_id); | ||
713 | + rc = dlpar_cpu_readd(core_id); | ||
714 | rc = NOTIFY_OK; | ||
715 | } | ||
716 | break; | ||
717 | diff --git a/arch/powerpc/platforms/44x/Kconfig b/arch/powerpc/platforms/44x/Kconfig | ||
718 | index 4a9a72d01c3c..35be81fd2dc2 100644 | ||
719 | --- a/arch/powerpc/platforms/44x/Kconfig | ||
720 | +++ b/arch/powerpc/platforms/44x/Kconfig | ||
721 | @@ -180,6 +180,7 @@ config CURRITUCK | ||
722 | depends on PPC_47x | ||
723 | select SWIOTLB | ||
724 | select 476FPE | ||
725 | + select FORCE_PCI | ||
726 | select PPC4xx_PCI_EXPRESS | ||
727 | help | ||
728 | This option enables support for the IBM Currituck (476fpe) evaluation board | ||
729 | diff --git a/arch/powerpc/platforms/powernv/pci-ioda-tce.c b/arch/powerpc/platforms/powernv/pci-ioda-tce.c | ||
730 | index 697449afb3f7..e28f03e1eb5e 100644 | ||
731 | --- a/arch/powerpc/platforms/powernv/pci-ioda-tce.c | ||
732 | +++ b/arch/powerpc/platforms/powernv/pci-ioda-tce.c | ||
733 | @@ -313,7 +313,6 @@ long pnv_pci_ioda2_table_alloc_pages(int nid, __u64 bus_offset, | ||
734 | page_shift); | ||
735 | tbl->it_level_size = 1ULL << (level_shift - 3); | ||
736 | tbl->it_indirect_levels = levels - 1; | ||
737 | - tbl->it_allocated_size = total_allocated; | ||
738 | tbl->it_userspace = uas; | ||
739 | tbl->it_nid = nid; | ||
740 | |||
741 | diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c b/arch/powerpc/platforms/powernv/pci-ioda.c | ||
742 | index 145373f0e5dc..2d62c58f9a4c 100644 | ||
743 | --- a/arch/powerpc/platforms/powernv/pci-ioda.c | ||
744 | +++ b/arch/powerpc/platforms/powernv/pci-ioda.c | ||
745 | @@ -2594,8 +2594,13 @@ static long pnv_pci_ioda2_create_table_userspace( | ||
746 | int num, __u32 page_shift, __u64 window_size, __u32 levels, | ||
747 | struct iommu_table **ptbl) | ||
748 | { | ||
749 | - return pnv_pci_ioda2_create_table(table_group, | ||
750 | + long ret = pnv_pci_ioda2_create_table(table_group, | ||
751 | num, page_shift, window_size, levels, true, ptbl); | ||
752 | + | ||
753 | + if (!ret) | ||
754 | + (*ptbl)->it_allocated_size = pnv_pci_ioda2_get_table_size( | ||
755 | + page_shift, window_size, levels); | ||
756 | + return ret; | ||
757 | } | ||
758 | |||
759 | static void pnv_ioda2_take_ownership(struct iommu_table_group *table_group) | ||
760 | diff --git a/arch/powerpc/platforms/pseries/hotplug-cpu.c b/arch/powerpc/platforms/pseries/hotplug-cpu.c | ||
761 | index 2f8e62163602..97feb6e79f1a 100644 | ||
762 | --- a/arch/powerpc/platforms/pseries/hotplug-cpu.c | ||
763 | +++ b/arch/powerpc/platforms/pseries/hotplug-cpu.c | ||
764 | @@ -802,6 +802,25 @@ static int dlpar_cpu_add_by_count(u32 cpus_to_add) | ||
765 | return rc; | ||
766 | } | ||
767 | |||
768 | +int dlpar_cpu_readd(int cpu) | ||
769 | +{ | ||
770 | + struct device_node *dn; | ||
771 | + struct device *dev; | ||
772 | + u32 drc_index; | ||
773 | + int rc; | ||
774 | + | ||
775 | + dev = get_cpu_device(cpu); | ||
776 | + dn = dev->of_node; | ||
777 | + | ||
778 | + rc = of_property_read_u32(dn, "ibm,my-drc-index", &drc_index); | ||
779 | + | ||
780 | + rc = dlpar_cpu_remove_by_index(drc_index); | ||
781 | + if (!rc) | ||
782 | + rc = dlpar_cpu_add(drc_index); | ||
783 | + | ||
784 | + return rc; | ||
785 | +} | ||
786 | + | ||
787 | int dlpar_cpu(struct pseries_hp_errorlog *hp_elog) | ||
788 | { | ||
789 | u32 count, drc_index; | ||
790 | diff --git a/arch/powerpc/xmon/ppc-dis.c b/arch/powerpc/xmon/ppc-dis.c | ||
791 | index 9deea5ee13f6..27f1e6415036 100644 | ||
792 | --- a/arch/powerpc/xmon/ppc-dis.c | ||
793 | +++ b/arch/powerpc/xmon/ppc-dis.c | ||
794 | @@ -158,7 +158,7 @@ int print_insn_powerpc (unsigned long insn, unsigned long memaddr) | ||
795 | dialect |= (PPC_OPCODE_POWER5 | PPC_OPCODE_POWER6 | PPC_OPCODE_POWER7 | ||
796 | | PPC_OPCODE_POWER8 | PPC_OPCODE_POWER9 | PPC_OPCODE_HTM | ||
797 | | PPC_OPCODE_ALTIVEC | PPC_OPCODE_ALTIVEC2 | ||
798 | - | PPC_OPCODE_VSX | PPC_OPCODE_VSX3), | ||
799 | + | PPC_OPCODE_VSX | PPC_OPCODE_VSX3); | ||
800 | |||
801 | /* Get the major opcode of the insn. */ | ||
802 | opcode = NULL; | ||
803 | diff --git a/arch/s390/kernel/perf_cpum_sf.c b/arch/s390/kernel/perf_cpum_sf.c | ||
804 | index bfabeb1889cc..1266194afb02 100644 | ||
805 | --- a/arch/s390/kernel/perf_cpum_sf.c | ||
806 | +++ b/arch/s390/kernel/perf_cpum_sf.c | ||
807 | @@ -1600,7 +1600,7 @@ static void aux_sdb_init(unsigned long sdb) | ||
808 | |||
809 | /* | ||
810 | * aux_buffer_setup() - Setup AUX buffer for diagnostic mode sampling | ||
811 | - * @cpu: On which to allocate, -1 means current | ||
812 | + * @event: Event the buffer is setup for, event->cpu == -1 means current | ||
813 | * @pages: Array of pointers to buffer pages passed from perf core | ||
814 | * @nr_pages: Total pages | ||
815 | * @snapshot: Flag for snapshot mode | ||
816 | @@ -1612,8 +1612,8 @@ static void aux_sdb_init(unsigned long sdb) | ||
817 | * | ||
818 | * Return the private AUX buffer structure if success or NULL if fails. | ||
819 | */ | ||
820 | -static void *aux_buffer_setup(int cpu, void **pages, int nr_pages, | ||
821 | - bool snapshot) | ||
822 | +static void *aux_buffer_setup(struct perf_event *event, void **pages, | ||
823 | + int nr_pages, bool snapshot) | ||
824 | { | ||
825 | struct sf_buffer *sfb; | ||
826 | struct aux_buffer *aux; | ||
827 | diff --git a/arch/x86/boot/Makefile b/arch/x86/boot/Makefile | ||
828 | index 9b5adae9cc40..e2839b5c246c 100644 | ||
829 | --- a/arch/x86/boot/Makefile | ||
830 | +++ b/arch/x86/boot/Makefile | ||
831 | @@ -100,7 +100,7 @@ $(obj)/zoffset.h: $(obj)/compressed/vmlinux FORCE | ||
832 | AFLAGS_header.o += -I$(objtree)/$(obj) | ||
833 | $(obj)/header.o: $(obj)/zoffset.h | ||
834 | |||
835 | -LDFLAGS_setup.elf := -T | ||
836 | +LDFLAGS_setup.elf := -m elf_i386 -T | ||
837 | $(obj)/setup.elf: $(src)/setup.ld $(SETUP_OBJS) FORCE | ||
838 | $(call if_changed,ld) | ||
839 | |||
840 | diff --git a/arch/x86/events/intel/bts.c b/arch/x86/events/intel/bts.c | ||
841 | index a01ef1b0f883..7cdd7b13bbda 100644 | ||
842 | --- a/arch/x86/events/intel/bts.c | ||
843 | +++ b/arch/x86/events/intel/bts.c | ||
844 | @@ -77,10 +77,12 @@ static size_t buf_size(struct page *page) | ||
845 | } | ||
846 | |||
847 | static void * | ||
848 | -bts_buffer_setup_aux(int cpu, void **pages, int nr_pages, bool overwrite) | ||
849 | +bts_buffer_setup_aux(struct perf_event *event, void **pages, | ||
850 | + int nr_pages, bool overwrite) | ||
851 | { | ||
852 | struct bts_buffer *buf; | ||
853 | struct page *page; | ||
854 | + int cpu = event->cpu; | ||
855 | int node = (cpu == -1) ? cpu : cpu_to_node(cpu); | ||
856 | unsigned long offset; | ||
857 | size_t size = nr_pages << PAGE_SHIFT; | ||
858 | diff --git a/arch/x86/events/intel/pt.c b/arch/x86/events/intel/pt.c | ||
859 | index 9494ca68fd9d..c0e86ff21f81 100644 | ||
860 | --- a/arch/x86/events/intel/pt.c | ||
861 | +++ b/arch/x86/events/intel/pt.c | ||
862 | @@ -1114,10 +1114,11 @@ static int pt_buffer_init_topa(struct pt_buffer *buf, unsigned long nr_pages, | ||
863 | * Return: Our private PT buffer structure. | ||
864 | */ | ||
865 | static void * | ||
866 | -pt_buffer_setup_aux(int cpu, void **pages, int nr_pages, bool snapshot) | ||
867 | +pt_buffer_setup_aux(struct perf_event *event, void **pages, | ||
868 | + int nr_pages, bool snapshot) | ||
869 | { | ||
870 | struct pt_buffer *buf; | ||
871 | - int node, ret; | ||
872 | + int node, ret, cpu = event->cpu; | ||
873 | |||
874 | if (!nr_pages) | ||
875 | return NULL; | ||
876 | diff --git a/arch/x86/hyperv/hv_init.c b/arch/x86/hyperv/hv_init.c | ||
877 | index 7abb09e2eeb8..d3f42b6bbdac 100644 | ||
878 | --- a/arch/x86/hyperv/hv_init.c | ||
879 | +++ b/arch/x86/hyperv/hv_init.c | ||
880 | @@ -406,6 +406,13 @@ void hyperv_cleanup(void) | ||
881 | /* Reset our OS id */ | ||
882 | wrmsrl(HV_X64_MSR_GUEST_OS_ID, 0); | ||
883 | |||
884 | + /* | ||
885 | + * Reset hypercall page reference before reset the page, | ||
886 | + * let hypercall operations fail safely rather than | ||
887 | + * panic the kernel for using invalid hypercall page | ||
888 | + */ | ||
889 | + hv_hypercall_pg = NULL; | ||
890 | + | ||
891 | /* Reset the hypercall page */ | ||
892 | hypercall_msr.as_uint64 = 0; | ||
893 | wrmsrl(HV_X64_MSR_HYPERCALL, hypercall_msr.as_uint64); | ||
894 | diff --git a/arch/x86/include/asm/uaccess.h b/arch/x86/include/asm/uaccess.h | ||
895 | index c1334aaaa78d..f3aed639dccd 100644 | ||
896 | --- a/arch/x86/include/asm/uaccess.h | ||
897 | +++ b/arch/x86/include/asm/uaccess.h | ||
898 | @@ -76,7 +76,7 @@ static inline bool __chk_range_not_ok(unsigned long addr, unsigned long size, un | ||
899 | #endif | ||
900 | |||
901 | /** | ||
902 | - * access_ok: - Checks if a user space pointer is valid | ||
903 | + * access_ok - Checks if a user space pointer is valid | ||
904 | * @addr: User space pointer to start of block to check | ||
905 | * @size: Size of block to check | ||
906 | * | ||
907 | @@ -85,12 +85,12 @@ static inline bool __chk_range_not_ok(unsigned long addr, unsigned long size, un | ||
908 | * | ||
909 | * Checks if a pointer to a block of memory in user space is valid. | ||
910 | * | ||
911 | - * Returns true (nonzero) if the memory block may be valid, false (zero) | ||
912 | - * if it is definitely invalid. | ||
913 | - * | ||
914 | * Note that, depending on architecture, this function probably just | ||
915 | * checks that the pointer is in the user space range - after calling | ||
916 | * this function, memory access functions may still return -EFAULT. | ||
917 | + * | ||
918 | + * Return: true (nonzero) if the memory block may be valid, false (zero) | ||
919 | + * if it is definitely invalid. | ||
920 | */ | ||
921 | #define access_ok(addr, size) \ | ||
922 | ({ \ | ||
923 | @@ -135,7 +135,7 @@ extern int __get_user_bad(void); | ||
924 | __typeof__(__builtin_choose_expr(sizeof(x) > sizeof(0UL), 0ULL, 0UL)) | ||
925 | |||
926 | /** | ||
927 | - * get_user: - Get a simple variable from user space. | ||
928 | + * get_user - Get a simple variable from user space. | ||
929 | * @x: Variable to store result. | ||
930 | * @ptr: Source address, in user space. | ||
931 | * | ||
932 | @@ -149,7 +149,7 @@ __typeof__(__builtin_choose_expr(sizeof(x) > sizeof(0UL), 0ULL, 0UL)) | ||
933 | * @ptr must have pointer-to-simple-variable type, and the result of | ||
934 | * dereferencing @ptr must be assignable to @x without a cast. | ||
935 | * | ||
936 | - * Returns zero on success, or -EFAULT on error. | ||
937 | + * Return: zero on success, or -EFAULT on error. | ||
938 | * On error, the variable @x is set to zero. | ||
939 | */ | ||
940 | /* | ||
941 | @@ -227,7 +227,7 @@ extern void __put_user_4(void); | ||
942 | extern void __put_user_8(void); | ||
943 | |||
944 | /** | ||
945 | - * put_user: - Write a simple value into user space. | ||
946 | + * put_user - Write a simple value into user space. | ||
947 | * @x: Value to copy to user space. | ||
948 | * @ptr: Destination address, in user space. | ||
949 | * | ||
950 | @@ -241,7 +241,7 @@ extern void __put_user_8(void); | ||
951 | * @ptr must have pointer-to-simple-variable type, and @x must be assignable | ||
952 | * to the result of dereferencing @ptr. | ||
953 | * | ||
954 | - * Returns zero on success, or -EFAULT on error. | ||
955 | + * Return: zero on success, or -EFAULT on error. | ||
956 | */ | ||
957 | #define put_user(x, ptr) \ | ||
958 | ({ \ | ||
959 | @@ -503,7 +503,7 @@ struct __large_struct { unsigned long buf[100]; }; | ||
960 | } while (0) | ||
961 | |||
962 | /** | ||
963 | - * __get_user: - Get a simple variable from user space, with less checking. | ||
964 | + * __get_user - Get a simple variable from user space, with less checking. | ||
965 | * @x: Variable to store result. | ||
966 | * @ptr: Source address, in user space. | ||
967 | * | ||
968 | @@ -520,7 +520,7 @@ struct __large_struct { unsigned long buf[100]; }; | ||
969 | * Caller must check the pointer with access_ok() before calling this | ||
970 | * function. | ||
971 | * | ||
972 | - * Returns zero on success, or -EFAULT on error. | ||
973 | + * Return: zero on success, or -EFAULT on error. | ||
974 | * On error, the variable @x is set to zero. | ||
975 | */ | ||
976 | |||
977 | @@ -528,7 +528,7 @@ struct __large_struct { unsigned long buf[100]; }; | ||
978 | __get_user_nocheck((x), (ptr), sizeof(*(ptr))) | ||
979 | |||
980 | /** | ||
981 | - * __put_user: - Write a simple value into user space, with less checking. | ||
982 | + * __put_user - Write a simple value into user space, with less checking. | ||
983 | * @x: Value to copy to user space. | ||
984 | * @ptr: Destination address, in user space. | ||
985 | * | ||
986 | @@ -545,7 +545,7 @@ struct __large_struct { unsigned long buf[100]; }; | ||
987 | * Caller must check the pointer with access_ok() before calling this | ||
988 | * function. | ||
989 | * | ||
990 | - * Returns zero on success, or -EFAULT on error. | ||
991 | + * Return: zero on success, or -EFAULT on error. | ||
992 | */ | ||
993 | |||
994 | #define __put_user(x, ptr) \ | ||
995 | diff --git a/arch/x86/kernel/kexec-bzimage64.c b/arch/x86/kernel/kexec-bzimage64.c | ||
996 | index 53917a3ebf94..1f3b77367948 100644 | ||
997 | --- a/arch/x86/kernel/kexec-bzimage64.c | ||
998 | +++ b/arch/x86/kernel/kexec-bzimage64.c | ||
999 | @@ -218,6 +218,9 @@ setup_boot_parameters(struct kimage *image, struct boot_params *params, | ||
1000 | params->screen_info.ext_mem_k = 0; | ||
1001 | params->alt_mem_k = 0; | ||
1002 | |||
1003 | + /* Always fill in RSDP: it is either 0 or a valid value */ | ||
1004 | + params->acpi_rsdp_addr = boot_params.acpi_rsdp_addr; | ||
1005 | + | ||
1006 | /* Default APM info */ | ||
1007 | memset(¶ms->apm_bios_info, 0, sizeof(params->apm_bios_info)); | ||
1008 | |||
1009 | @@ -256,7 +259,6 @@ setup_boot_parameters(struct kimage *image, struct boot_params *params, | ||
1010 | setup_efi_state(params, params_load_addr, efi_map_offset, efi_map_sz, | ||
1011 | efi_setup_data_offset); | ||
1012 | #endif | ||
1013 | - | ||
1014 | /* Setup EDD info */ | ||
1015 | memcpy(params->eddbuf, boot_params.eddbuf, | ||
1016 | EDDMAXNR * sizeof(struct edd_info)); | ||
1017 | diff --git a/arch/x86/kernel/vmlinux.lds.S b/arch/x86/kernel/vmlinux.lds.S | ||
1018 | index 0d618ee634ac..ee3b5c7d662e 100644 | ||
1019 | --- a/arch/x86/kernel/vmlinux.lds.S | ||
1020 | +++ b/arch/x86/kernel/vmlinux.lds.S | ||
1021 | @@ -401,7 +401,7 @@ SECTIONS | ||
1022 | * Per-cpu symbols which need to be offset from __per_cpu_load | ||
1023 | * for the boot processor. | ||
1024 | */ | ||
1025 | -#define INIT_PER_CPU(x) init_per_cpu__##x = x + __per_cpu_load | ||
1026 | +#define INIT_PER_CPU(x) init_per_cpu__##x = ABSOLUTE(x) + __per_cpu_load | ||
1027 | INIT_PER_CPU(gdt_page); | ||
1028 | INIT_PER_CPU(irq_stack_union); | ||
1029 | |||
1030 | diff --git a/arch/x86/lib/usercopy_32.c b/arch/x86/lib/usercopy_32.c | ||
1031 | index bfd94e7812fc..7d290777246d 100644 | ||
1032 | --- a/arch/x86/lib/usercopy_32.c | ||
1033 | +++ b/arch/x86/lib/usercopy_32.c | ||
1034 | @@ -54,13 +54,13 @@ do { \ | ||
1035 | } while (0) | ||
1036 | |||
1037 | /** | ||
1038 | - * clear_user: - Zero a block of memory in user space. | ||
1039 | + * clear_user - Zero a block of memory in user space. | ||
1040 | * @to: Destination address, in user space. | ||
1041 | * @n: Number of bytes to zero. | ||
1042 | * | ||
1043 | * Zero a block of memory in user space. | ||
1044 | * | ||
1045 | - * Returns number of bytes that could not be cleared. | ||
1046 | + * Return: number of bytes that could not be cleared. | ||
1047 | * On success, this will be zero. | ||
1048 | */ | ||
1049 | unsigned long | ||
1050 | @@ -74,14 +74,14 @@ clear_user(void __user *to, unsigned long n) | ||
1051 | EXPORT_SYMBOL(clear_user); | ||
1052 | |||
1053 | /** | ||
1054 | - * __clear_user: - Zero a block of memory in user space, with less checking. | ||
1055 | + * __clear_user - Zero a block of memory in user space, with less checking. | ||
1056 | * @to: Destination address, in user space. | ||
1057 | * @n: Number of bytes to zero. | ||
1058 | * | ||
1059 | * Zero a block of memory in user space. Caller must check | ||
1060 | * the specified block with access_ok() before calling this function. | ||
1061 | * | ||
1062 | - * Returns number of bytes that could not be cleared. | ||
1063 | + * Return: number of bytes that could not be cleared. | ||
1064 | * On success, this will be zero. | ||
1065 | */ | ||
1066 | unsigned long | ||
1067 | diff --git a/arch/x86/platform/efi/quirks.c b/arch/x86/platform/efi/quirks.c | ||
1068 | index 17456a1d3f04..6c571ae86947 100644 | ||
1069 | --- a/arch/x86/platform/efi/quirks.c | ||
1070 | +++ b/arch/x86/platform/efi/quirks.c | ||
1071 | @@ -717,7 +717,7 @@ void efi_recover_from_page_fault(unsigned long phys_addr) | ||
1072 | * "efi_mm" cannot be used to check if the page fault had occurred | ||
1073 | * in the firmware context because efi=old_map doesn't use efi_pgd. | ||
1074 | */ | ||
1075 | - if (efi_rts_work.efi_rts_id == NONE) | ||
1076 | + if (efi_rts_work.efi_rts_id == EFI_NONE) | ||
1077 | return; | ||
1078 | |||
1079 | /* | ||
1080 | @@ -742,7 +742,7 @@ void efi_recover_from_page_fault(unsigned long phys_addr) | ||
1081 | * because this case occurs *very* rarely and hence could be improved | ||
1082 | * on a need by basis. | ||
1083 | */ | ||
1084 | - if (efi_rts_work.efi_rts_id == RESET_SYSTEM) { | ||
1085 | + if (efi_rts_work.efi_rts_id == EFI_RESET_SYSTEM) { | ||
1086 | pr_info("efi_reset_system() buggy! Reboot through BIOS\n"); | ||
1087 | machine_real_restart(MRR_BIOS); | ||
1088 | return; | ||
1089 | diff --git a/arch/x86/realmode/rm/Makefile b/arch/x86/realmode/rm/Makefile | ||
1090 | index 4463fa72db94..96cb20de08af 100644 | ||
1091 | --- a/arch/x86/realmode/rm/Makefile | ||
1092 | +++ b/arch/x86/realmode/rm/Makefile | ||
1093 | @@ -47,7 +47,7 @@ $(obj)/pasyms.h: $(REALMODE_OBJS) FORCE | ||
1094 | targets += realmode.lds | ||
1095 | $(obj)/realmode.lds: $(obj)/pasyms.h | ||
1096 | |||
1097 | -LDFLAGS_realmode.elf := --emit-relocs -T | ||
1098 | +LDFLAGS_realmode.elf := -m elf_i386 --emit-relocs -T | ||
1099 | CPPFLAGS_realmode.lds += -P -C -I$(objtree)/$(obj) | ||
1100 | |||
1101 | targets += realmode.elf | ||
1102 | diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c | ||
1103 | index cd307767a134..e5ed28629271 100644 | ||
1104 | --- a/block/bfq-iosched.c | ||
1105 | +++ b/block/bfq-iosched.c | ||
1106 | @@ -747,6 +747,7 @@ void bfq_weights_tree_add(struct bfq_data *bfqd, struct bfq_queue *bfqq, | ||
1107 | |||
1108 | inc_counter: | ||
1109 | bfqq->weight_counter->num_active++; | ||
1110 | + bfqq->ref++; | ||
1111 | } | ||
1112 | |||
1113 | /* | ||
1114 | @@ -771,6 +772,7 @@ void __bfq_weights_tree_remove(struct bfq_data *bfqd, | ||
1115 | |||
1116 | reset_entity_pointer: | ||
1117 | bfqq->weight_counter = NULL; | ||
1118 | + bfq_put_queue(bfqq); | ||
1119 | } | ||
1120 | |||
1121 | /* | ||
1122 | @@ -782,9 +784,6 @@ void bfq_weights_tree_remove(struct bfq_data *bfqd, | ||
1123 | { | ||
1124 | struct bfq_entity *entity = bfqq->entity.parent; | ||
1125 | |||
1126 | - __bfq_weights_tree_remove(bfqd, bfqq, | ||
1127 | - &bfqd->queue_weights_tree); | ||
1128 | - | ||
1129 | for_each_entity(entity) { | ||
1130 | struct bfq_sched_data *sd = entity->my_sched_data; | ||
1131 | |||
1132 | @@ -818,6 +817,15 @@ void bfq_weights_tree_remove(struct bfq_data *bfqd, | ||
1133 | bfqd->num_groups_with_pending_reqs--; | ||
1134 | } | ||
1135 | } | ||
1136 | + | ||
1137 | + /* | ||
1138 | + * Next function is invoked last, because it causes bfqq to be | ||
1139 | + * freed if the following holds: bfqq is not in service and | ||
1140 | + * has no dispatched request. DO NOT use bfqq after the next | ||
1141 | + * function invocation. | ||
1142 | + */ | ||
1143 | + __bfq_weights_tree_remove(bfqd, bfqq, | ||
1144 | + &bfqd->queue_weights_tree); | ||
1145 | } | ||
1146 | |||
1147 | /* | ||
1148 | @@ -1011,7 +1019,8 @@ bfq_bfqq_resume_state(struct bfq_queue *bfqq, struct bfq_data *bfqd, | ||
1149 | |||
1150 | static int bfqq_process_refs(struct bfq_queue *bfqq) | ||
1151 | { | ||
1152 | - return bfqq->ref - bfqq->allocated - bfqq->entity.on_st; | ||
1153 | + return bfqq->ref - bfqq->allocated - bfqq->entity.on_st - | ||
1154 | + (bfqq->weight_counter != NULL); | ||
1155 | } | ||
1156 | |||
1157 | /* Empty burst list and add just bfqq (see comments on bfq_handle_burst) */ | ||
1158 | @@ -2224,7 +2233,8 @@ bfq_setup_cooperator(struct bfq_data *bfqd, struct bfq_queue *bfqq, | ||
1159 | |||
1160 | if (in_service_bfqq && in_service_bfqq != bfqq && | ||
1161 | likely(in_service_bfqq != &bfqd->oom_bfqq) && | ||
1162 | - bfq_rq_close_to_sector(io_struct, request, bfqd->last_position) && | ||
1163 | + bfq_rq_close_to_sector(io_struct, request, | ||
1164 | + bfqd->in_serv_last_pos) && | ||
1165 | bfqq->entity.parent == in_service_bfqq->entity.parent && | ||
1166 | bfq_may_be_close_cooperator(bfqq, in_service_bfqq)) { | ||
1167 | new_bfqq = bfq_setup_merge(bfqq, in_service_bfqq); | ||
1168 | @@ -2764,6 +2774,8 @@ update_rate_and_reset: | ||
1169 | bfq_update_rate_reset(bfqd, rq); | ||
1170 | update_last_values: | ||
1171 | bfqd->last_position = blk_rq_pos(rq) + blk_rq_sectors(rq); | ||
1172 | + if (RQ_BFQQ(rq) == bfqd->in_service_queue) | ||
1173 | + bfqd->in_serv_last_pos = bfqd->last_position; | ||
1174 | bfqd->last_dispatch = now_ns; | ||
1175 | } | ||
1176 | |||
1177 | diff --git a/block/bfq-iosched.h b/block/bfq-iosched.h | ||
1178 | index 0b02bf302de0..746bd570b85a 100644 | ||
1179 | --- a/block/bfq-iosched.h | ||
1180 | +++ b/block/bfq-iosched.h | ||
1181 | @@ -537,6 +537,9 @@ struct bfq_data { | ||
1182 | /* on-disk position of the last served request */ | ||
1183 | sector_t last_position; | ||
1184 | |||
1185 | + /* position of the last served request for the in-service queue */ | ||
1186 | + sector_t in_serv_last_pos; | ||
1187 | + | ||
1188 | /* time of last request completion (ns) */ | ||
1189 | u64 last_completion; | ||
1190 | |||
1191 | diff --git a/block/bfq-wf2q.c b/block/bfq-wf2q.c | ||
1192 | index 72adbbe975d5..4aab1a8191f0 100644 | ||
1193 | --- a/block/bfq-wf2q.c | ||
1194 | +++ b/block/bfq-wf2q.c | ||
1195 | @@ -1667,15 +1667,15 @@ void bfq_del_bfqq_busy(struct bfq_data *bfqd, struct bfq_queue *bfqq, | ||
1196 | |||
1197 | bfqd->busy_queues--; | ||
1198 | |||
1199 | - if (!bfqq->dispatched) | ||
1200 | - bfq_weights_tree_remove(bfqd, bfqq); | ||
1201 | - | ||
1202 | if (bfqq->wr_coeff > 1) | ||
1203 | bfqd->wr_busy_queues--; | ||
1204 | |||
1205 | bfqg_stats_update_dequeue(bfqq_group(bfqq)); | ||
1206 | |||
1207 | bfq_deactivate_bfqq(bfqd, bfqq, true, expiration); | ||
1208 | + | ||
1209 | + if (!bfqq->dispatched) | ||
1210 | + bfq_weights_tree_remove(bfqd, bfqq); | ||
1211 | } | ||
1212 | |||
1213 | /* | ||
1214 | diff --git a/drivers/acpi/acpi_video.c b/drivers/acpi/acpi_video.c | ||
1215 | index f0b52266b3ac..d73afb562ad9 100644 | ||
1216 | --- a/drivers/acpi/acpi_video.c | ||
1217 | +++ b/drivers/acpi/acpi_video.c | ||
1218 | @@ -2124,21 +2124,29 @@ static int __init intel_opregion_present(void) | ||
1219 | return opregion; | ||
1220 | } | ||
1221 | |||
1222 | +/* Check if the chassis-type indicates there is no builtin LCD panel */ | ||
1223 | static bool dmi_is_desktop(void) | ||
1224 | { | ||
1225 | const char *chassis_type; | ||
1226 | + unsigned long type; | ||
1227 | |||
1228 | chassis_type = dmi_get_system_info(DMI_CHASSIS_TYPE); | ||
1229 | if (!chassis_type) | ||
1230 | return false; | ||
1231 | |||
1232 | - if (!strcmp(chassis_type, "3") || /* 3: Desktop */ | ||
1233 | - !strcmp(chassis_type, "4") || /* 4: Low Profile Desktop */ | ||
1234 | - !strcmp(chassis_type, "5") || /* 5: Pizza Box */ | ||
1235 | - !strcmp(chassis_type, "6") || /* 6: Mini Tower */ | ||
1236 | - !strcmp(chassis_type, "7") || /* 7: Tower */ | ||
1237 | - !strcmp(chassis_type, "11")) /* 11: Main Server Chassis */ | ||
1238 | + if (kstrtoul(chassis_type, 10, &type) != 0) | ||
1239 | + return false; | ||
1240 | + | ||
1241 | + switch (type) { | ||
1242 | + case 0x03: /* Desktop */ | ||
1243 | + case 0x04: /* Low Profile Desktop */ | ||
1244 | + case 0x05: /* Pizza Box */ | ||
1245 | + case 0x06: /* Mini Tower */ | ||
1246 | + case 0x07: /* Tower */ | ||
1247 | + case 0x10: /* Lunch Box */ | ||
1248 | + case 0x11: /* Main Server Chassis */ | ||
1249 | return true; | ||
1250 | + } | ||
1251 | |||
1252 | return false; | ||
1253 | } | ||
1254 | diff --git a/drivers/block/loop.c b/drivers/block/loop.c | ||
1255 | index 2faefdd6f420..9a8d83bc1e75 100644 | ||
1256 | --- a/drivers/block/loop.c | ||
1257 | +++ b/drivers/block/loop.c | ||
1258 | @@ -1089,16 +1089,12 @@ static int __loop_clr_fd(struct loop_device *lo, bool release) | ||
1259 | kobject_uevent(&disk_to_dev(bdev->bd_disk)->kobj, KOBJ_CHANGE); | ||
1260 | } | ||
1261 | mapping_set_gfp_mask(filp->f_mapping, gfp); | ||
1262 | - lo->lo_state = Lo_unbound; | ||
1263 | /* This is safe: open() is still holding a reference. */ | ||
1264 | module_put(THIS_MODULE); | ||
1265 | blk_mq_unfreeze_queue(lo->lo_queue); | ||
1266 | |||
1267 | partscan = lo->lo_flags & LO_FLAGS_PARTSCAN && bdev; | ||
1268 | lo_number = lo->lo_number; | ||
1269 | - lo->lo_flags = 0; | ||
1270 | - if (!part_shift) | ||
1271 | - lo->lo_disk->flags |= GENHD_FL_NO_PART_SCAN; | ||
1272 | loop_unprepare_queue(lo); | ||
1273 | out_unlock: | ||
1274 | mutex_unlock(&loop_ctl_mutex); | ||
1275 | @@ -1120,6 +1116,23 @@ out_unlock: | ||
1276 | /* Device is gone, no point in returning error */ | ||
1277 | err = 0; | ||
1278 | } | ||
1279 | + | ||
1280 | + /* | ||
1281 | + * lo->lo_state is set to Lo_unbound here after above partscan has | ||
1282 | + * finished. | ||
1283 | + * | ||
1284 | + * There cannot be anybody else entering __loop_clr_fd() as | ||
1285 | + * lo->lo_backing_file is already cleared and Lo_rundown state | ||
1286 | + * protects us from all the other places trying to change the 'lo' | ||
1287 | + * device. | ||
1288 | + */ | ||
1289 | + mutex_lock(&loop_ctl_mutex); | ||
1290 | + lo->lo_flags = 0; | ||
1291 | + if (!part_shift) | ||
1292 | + lo->lo_disk->flags |= GENHD_FL_NO_PART_SCAN; | ||
1293 | + lo->lo_state = Lo_unbound; | ||
1294 | + mutex_unlock(&loop_ctl_mutex); | ||
1295 | + | ||
1296 | /* | ||
1297 | * Need not hold loop_ctl_mutex to fput backing file. | ||
1298 | * Calling fput holding loop_ctl_mutex triggers a circular | ||
1299 | diff --git a/drivers/cdrom/cdrom.c b/drivers/cdrom/cdrom.c | ||
1300 | index 614ecdbb4ab7..933268b8d6a5 100644 | ||
1301 | --- a/drivers/cdrom/cdrom.c | ||
1302 | +++ b/drivers/cdrom/cdrom.c | ||
1303 | @@ -265,6 +265,7 @@ | ||
1304 | /* #define ERRLOGMASK (CD_WARNING|CD_OPEN|CD_COUNT_TRACKS|CD_CLOSE) */ | ||
1305 | /* #define ERRLOGMASK (CD_WARNING|CD_REG_UNREG|CD_DO_IOCTL|CD_OPEN|CD_CLOSE|CD_COUNT_TRACKS) */ | ||
1306 | |||
1307 | +#include <linux/atomic.h> | ||
1308 | #include <linux/module.h> | ||
1309 | #include <linux/fs.h> | ||
1310 | #include <linux/major.h> | ||
1311 | @@ -3692,9 +3693,9 @@ static struct ctl_table_header *cdrom_sysctl_header; | ||
1312 | |||
1313 | static void cdrom_sysctl_register(void) | ||
1314 | { | ||
1315 | - static int initialized; | ||
1316 | + static atomic_t initialized = ATOMIC_INIT(0); | ||
1317 | |||
1318 | - if (initialized == 1) | ||
1319 | + if (!atomic_add_unless(&initialized, 1, 1)) | ||
1320 | return; | ||
1321 | |||
1322 | cdrom_sysctl_header = register_sysctl_table(cdrom_root_table); | ||
1323 | @@ -3705,8 +3706,6 @@ static void cdrom_sysctl_register(void) | ||
1324 | cdrom_sysctl_settings.debug = debug; | ||
1325 | cdrom_sysctl_settings.lock = lockdoor; | ||
1326 | cdrom_sysctl_settings.check = check_media_type; | ||
1327 | - | ||
1328 | - initialized = 1; | ||
1329 | } | ||
1330 | |||
1331 | static void cdrom_sysctl_unregister(void) | ||
1332 | diff --git a/drivers/char/hpet.c b/drivers/char/hpet.c | ||
1333 | index 4a22b4b41aef..9bffcd37cc7b 100644 | ||
1334 | --- a/drivers/char/hpet.c | ||
1335 | +++ b/drivers/char/hpet.c | ||
1336 | @@ -377,7 +377,7 @@ static __init int hpet_mmap_enable(char *str) | ||
1337 | pr_info("HPET mmap %s\n", hpet_mmap_enabled ? "enabled" : "disabled"); | ||
1338 | return 1; | ||
1339 | } | ||
1340 | -__setup("hpet_mmap", hpet_mmap_enable); | ||
1341 | +__setup("hpet_mmap=", hpet_mmap_enable); | ||
1342 | |||
1343 | static int hpet_mmap(struct file *file, struct vm_area_struct *vma) | ||
1344 | { | ||
1345 | diff --git a/drivers/char/hw_random/virtio-rng.c b/drivers/char/hw_random/virtio-rng.c | ||
1346 | index b89df66ea1ae..7abd604e938c 100644 | ||
1347 | --- a/drivers/char/hw_random/virtio-rng.c | ||
1348 | +++ b/drivers/char/hw_random/virtio-rng.c | ||
1349 | @@ -73,7 +73,7 @@ static int virtio_read(struct hwrng *rng, void *buf, size_t size, bool wait) | ||
1350 | |||
1351 | if (!vi->busy) { | ||
1352 | vi->busy = true; | ||
1353 | - init_completion(&vi->have_data); | ||
1354 | + reinit_completion(&vi->have_data); | ||
1355 | register_buffer(vi, buf, size); | ||
1356 | } | ||
1357 | |||
1358 | diff --git a/drivers/clk/clk-fractional-divider.c b/drivers/clk/clk-fractional-divider.c | ||
1359 | index 545dceec0bbf..fdfe2e423d15 100644 | ||
1360 | --- a/drivers/clk/clk-fractional-divider.c | ||
1361 | +++ b/drivers/clk/clk-fractional-divider.c | ||
1362 | @@ -79,7 +79,7 @@ static long clk_fd_round_rate(struct clk_hw *hw, unsigned long rate, | ||
1363 | unsigned long m, n; | ||
1364 | u64 ret; | ||
1365 | |||
1366 | - if (!rate || rate >= *parent_rate) | ||
1367 | + if (!rate || (!clk_hw_can_set_rate_parent(hw) && rate >= *parent_rate)) | ||
1368 | return *parent_rate; | ||
1369 | |||
1370 | if (fd->approximation) | ||
1371 | diff --git a/drivers/clk/meson/meson-aoclk.c b/drivers/clk/meson/meson-aoclk.c | ||
1372 | index f965845917e3..258c8d259ea1 100644 | ||
1373 | --- a/drivers/clk/meson/meson-aoclk.c | ||
1374 | +++ b/drivers/clk/meson/meson-aoclk.c | ||
1375 | @@ -65,15 +65,20 @@ int meson_aoclkc_probe(struct platform_device *pdev) | ||
1376 | return ret; | ||
1377 | } | ||
1378 | |||
1379 | - /* | ||
1380 | - * Populate regmap and register all clks | ||
1381 | - */ | ||
1382 | - for (clkid = 0; clkid < data->num_clks; clkid++) { | ||
1383 | + /* Populate regmap */ | ||
1384 | + for (clkid = 0; clkid < data->num_clks; clkid++) | ||
1385 | data->clks[clkid]->map = regmap; | ||
1386 | |||
1387 | + /* Register all clks */ | ||
1388 | + for (clkid = 0; clkid < data->hw_data->num; clkid++) { | ||
1389 | + if (!data->hw_data->hws[clkid]) | ||
1390 | + continue; | ||
1391 | + | ||
1392 | ret = devm_clk_hw_register(dev, data->hw_data->hws[clkid]); | ||
1393 | - if (ret) | ||
1394 | + if (ret) { | ||
1395 | + dev_err(dev, "Clock registration failed\n"); | ||
1396 | return ret; | ||
1397 | + } | ||
1398 | } | ||
1399 | |||
1400 | return devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get, | ||
1401 | diff --git a/drivers/clk/rockchip/clk-rk3328.c b/drivers/clk/rockchip/clk-rk3328.c | ||
1402 | index faa94adb2a37..65ab5c2f48b0 100644 | ||
1403 | --- a/drivers/clk/rockchip/clk-rk3328.c | ||
1404 | +++ b/drivers/clk/rockchip/clk-rk3328.c | ||
1405 | @@ -78,17 +78,17 @@ static struct rockchip_pll_rate_table rk3328_pll_rates[] = { | ||
1406 | |||
1407 | static struct rockchip_pll_rate_table rk3328_pll_frac_rates[] = { | ||
1408 | /* _mhz, _refdiv, _fbdiv, _postdiv1, _postdiv2, _dsmpd, _frac */ | ||
1409 | - RK3036_PLL_RATE(1016064000, 3, 127, 1, 1, 0, 134217), | ||
1410 | + RK3036_PLL_RATE(1016064000, 3, 127, 1, 1, 0, 134218), | ||
1411 | /* vco = 1016064000 */ | ||
1412 | - RK3036_PLL_RATE(983040000, 24, 983, 1, 1, 0, 671088), | ||
1413 | + RK3036_PLL_RATE(983040000, 24, 983, 1, 1, 0, 671089), | ||
1414 | /* vco = 983040000 */ | ||
1415 | - RK3036_PLL_RATE(491520000, 24, 983, 2, 1, 0, 671088), | ||
1416 | + RK3036_PLL_RATE(491520000, 24, 983, 2, 1, 0, 671089), | ||
1417 | /* vco = 983040000 */ | ||
1418 | - RK3036_PLL_RATE(61440000, 6, 215, 7, 2, 0, 671088), | ||
1419 | + RK3036_PLL_RATE(61440000, 6, 215, 7, 2, 0, 671089), | ||
1420 | /* vco = 860156000 */ | ||
1421 | - RK3036_PLL_RATE(56448000, 12, 451, 4, 4, 0, 9797894), | ||
1422 | + RK3036_PLL_RATE(56448000, 12, 451, 4, 4, 0, 9797895), | ||
1423 | /* vco = 903168000 */ | ||
1424 | - RK3036_PLL_RATE(40960000, 12, 409, 4, 5, 0, 10066329), | ||
1425 | + RK3036_PLL_RATE(40960000, 12, 409, 4, 5, 0, 10066330), | ||
1426 | /* vco = 819200000 */ | ||
1427 | { /* sentinel */ }, | ||
1428 | }; | ||
1429 | diff --git a/drivers/clk/ti/clkctrl.c b/drivers/clk/ti/clkctrl.c | ||
1430 | index 40630eb950fc..85d7f301149b 100644 | ||
1431 | --- a/drivers/clk/ti/clkctrl.c | ||
1432 | +++ b/drivers/clk/ti/clkctrl.c | ||
1433 | @@ -530,7 +530,7 @@ static void __init _ti_omap4_clkctrl_setup(struct device_node *node) | ||
1434 | * Create default clkdm name, replace _cm from end of parent | ||
1435 | * node name with _clkdm | ||
1436 | */ | ||
1437 | - provider->clkdm_name[strlen(provider->clkdm_name) - 5] = 0; | ||
1438 | + provider->clkdm_name[strlen(provider->clkdm_name) - 2] = 0; | ||
1439 | } else { | ||
1440 | provider->clkdm_name = kasprintf(GFP_KERNEL, "%pOFn", node); | ||
1441 | if (!provider->clkdm_name) { | ||
1442 | diff --git a/drivers/cpufreq/acpi-cpufreq.c b/drivers/cpufreq/acpi-cpufreq.c | ||
1443 | index d62fd374d5c7..c72258a44ba4 100644 | ||
1444 | --- a/drivers/cpufreq/acpi-cpufreq.c | ||
1445 | +++ b/drivers/cpufreq/acpi-cpufreq.c | ||
1446 | @@ -916,8 +916,10 @@ static void __init acpi_cpufreq_boost_init(void) | ||
1447 | { | ||
1448 | int ret; | ||
1449 | |||
1450 | - if (!(boot_cpu_has(X86_FEATURE_CPB) || boot_cpu_has(X86_FEATURE_IDA))) | ||
1451 | + if (!(boot_cpu_has(X86_FEATURE_CPB) || boot_cpu_has(X86_FEATURE_IDA))) { | ||
1452 | + pr_debug("Boost capabilities not present in the processor\n"); | ||
1453 | return; | ||
1454 | + } | ||
1455 | |||
1456 | acpi_cpufreq_driver.set_boost = set_boost; | ||
1457 | acpi_cpufreq_driver.boost_enabled = boost_state(0); | ||
1458 | diff --git a/drivers/crypto/amcc/crypto4xx_trng.c b/drivers/crypto/amcc/crypto4xx_trng.c | ||
1459 | index 5e63742b0d22..53ab1f140a26 100644 | ||
1460 | --- a/drivers/crypto/amcc/crypto4xx_trng.c | ||
1461 | +++ b/drivers/crypto/amcc/crypto4xx_trng.c | ||
1462 | @@ -80,8 +80,10 @@ void ppc4xx_trng_probe(struct crypto4xx_core_device *core_dev) | ||
1463 | |||
1464 | /* Find the TRNG device node and map it */ | ||
1465 | trng = of_find_matching_node(NULL, ppc4xx_trng_match); | ||
1466 | - if (!trng || !of_device_is_available(trng)) | ||
1467 | + if (!trng || !of_device_is_available(trng)) { | ||
1468 | + of_node_put(trng); | ||
1469 | return; | ||
1470 | + } | ||
1471 | |||
1472 | dev->trng_base = of_iomap(trng, 0); | ||
1473 | of_node_put(trng); | ||
1474 | diff --git a/drivers/crypto/cavium/zip/zip_main.c b/drivers/crypto/cavium/zip/zip_main.c | ||
1475 | index be055b9547f6..6183f9128a8a 100644 | ||
1476 | --- a/drivers/crypto/cavium/zip/zip_main.c | ||
1477 | +++ b/drivers/crypto/cavium/zip/zip_main.c | ||
1478 | @@ -351,6 +351,7 @@ static struct pci_driver zip_driver = { | ||
1479 | |||
1480 | static struct crypto_alg zip_comp_deflate = { | ||
1481 | .cra_name = "deflate", | ||
1482 | + .cra_driver_name = "deflate-cavium", | ||
1483 | .cra_flags = CRYPTO_ALG_TYPE_COMPRESS, | ||
1484 | .cra_ctxsize = sizeof(struct zip_kernel_ctx), | ||
1485 | .cra_priority = 300, | ||
1486 | @@ -365,6 +366,7 @@ static struct crypto_alg zip_comp_deflate = { | ||
1487 | |||
1488 | static struct crypto_alg zip_comp_lzs = { | ||
1489 | .cra_name = "lzs", | ||
1490 | + .cra_driver_name = "lzs-cavium", | ||
1491 | .cra_flags = CRYPTO_ALG_TYPE_COMPRESS, | ||
1492 | .cra_ctxsize = sizeof(struct zip_kernel_ctx), | ||
1493 | .cra_priority = 300, | ||
1494 | @@ -384,7 +386,7 @@ static struct scomp_alg zip_scomp_deflate = { | ||
1495 | .decompress = zip_scomp_decompress, | ||
1496 | .base = { | ||
1497 | .cra_name = "deflate", | ||
1498 | - .cra_driver_name = "deflate-scomp", | ||
1499 | + .cra_driver_name = "deflate-scomp-cavium", | ||
1500 | .cra_module = THIS_MODULE, | ||
1501 | .cra_priority = 300, | ||
1502 | } | ||
1503 | @@ -397,7 +399,7 @@ static struct scomp_alg zip_scomp_lzs = { | ||
1504 | .decompress = zip_scomp_decompress, | ||
1505 | .base = { | ||
1506 | .cra_name = "lzs", | ||
1507 | - .cra_driver_name = "lzs-scomp", | ||
1508 | + .cra_driver_name = "lzs-scomp-cavium", | ||
1509 | .cra_module = THIS_MODULE, | ||
1510 | .cra_priority = 300, | ||
1511 | } | ||
1512 | diff --git a/drivers/dma/imx-dma.c b/drivers/dma/imx-dma.c | ||
1513 | index 4a09af3cd546..7b9a7fb28bb9 100644 | ||
1514 | --- a/drivers/dma/imx-dma.c | ||
1515 | +++ b/drivers/dma/imx-dma.c | ||
1516 | @@ -285,7 +285,7 @@ static inline int imxdma_sg_next(struct imxdma_desc *d) | ||
1517 | struct scatterlist *sg = d->sg; | ||
1518 | unsigned long now; | ||
1519 | |||
1520 | - now = min(d->len, sg_dma_len(sg)); | ||
1521 | + now = min_t(size_t, d->len, sg_dma_len(sg)); | ||
1522 | if (d->len != IMX_DMA_LENGTH_LOOP) | ||
1523 | d->len -= now; | ||
1524 | |||
1525 | diff --git a/drivers/dma/qcom/hidma.c b/drivers/dma/qcom/hidma.c | ||
1526 | index 43d4b00b8138..411f91fde734 100644 | ||
1527 | --- a/drivers/dma/qcom/hidma.c | ||
1528 | +++ b/drivers/dma/qcom/hidma.c | ||
1529 | @@ -138,24 +138,25 @@ static void hidma_process_completed(struct hidma_chan *mchan) | ||
1530 | desc = &mdesc->desc; | ||
1531 | last_cookie = desc->cookie; | ||
1532 | |||
1533 | + llstat = hidma_ll_status(mdma->lldev, mdesc->tre_ch); | ||
1534 | + | ||
1535 | spin_lock_irqsave(&mchan->lock, irqflags); | ||
1536 | + if (llstat == DMA_COMPLETE) { | ||
1537 | + mchan->last_success = last_cookie; | ||
1538 | + result.result = DMA_TRANS_NOERROR; | ||
1539 | + } else { | ||
1540 | + result.result = DMA_TRANS_ABORTED; | ||
1541 | + } | ||
1542 | + | ||
1543 | dma_cookie_complete(desc); | ||
1544 | spin_unlock_irqrestore(&mchan->lock, irqflags); | ||
1545 | |||
1546 | - llstat = hidma_ll_status(mdma->lldev, mdesc->tre_ch); | ||
1547 | dmaengine_desc_get_callback(desc, &cb); | ||
1548 | |||
1549 | dma_run_dependencies(desc); | ||
1550 | |||
1551 | spin_lock_irqsave(&mchan->lock, irqflags); | ||
1552 | list_move(&mdesc->node, &mchan->free); | ||
1553 | - | ||
1554 | - if (llstat == DMA_COMPLETE) { | ||
1555 | - mchan->last_success = last_cookie; | ||
1556 | - result.result = DMA_TRANS_NOERROR; | ||
1557 | - } else | ||
1558 | - result.result = DMA_TRANS_ABORTED; | ||
1559 | - | ||
1560 | spin_unlock_irqrestore(&mchan->lock, irqflags); | ||
1561 | |||
1562 | dmaengine_desc_callback_invoke(&cb, &result); | ||
1563 | @@ -415,6 +416,7 @@ hidma_prep_dma_memcpy(struct dma_chan *dmach, dma_addr_t dest, dma_addr_t src, | ||
1564 | if (!mdesc) | ||
1565 | return NULL; | ||
1566 | |||
1567 | + mdesc->desc.flags = flags; | ||
1568 | hidma_ll_set_transfer_params(mdma->lldev, mdesc->tre_ch, | ||
1569 | src, dest, len, flags, | ||
1570 | HIDMA_TRE_MEMCPY); | ||
1571 | @@ -447,6 +449,7 @@ hidma_prep_dma_memset(struct dma_chan *dmach, dma_addr_t dest, int value, | ||
1572 | if (!mdesc) | ||
1573 | return NULL; | ||
1574 | |||
1575 | + mdesc->desc.flags = flags; | ||
1576 | hidma_ll_set_transfer_params(mdma->lldev, mdesc->tre_ch, | ||
1577 | value, dest, len, flags, | ||
1578 | HIDMA_TRE_MEMSET); | ||
1579 | diff --git a/drivers/dma/tegra20-apb-dma.c b/drivers/dma/tegra20-apb-dma.c | ||
1580 | index 9a558e30c461..8219ab88a507 100644 | ||
1581 | --- a/drivers/dma/tegra20-apb-dma.c | ||
1582 | +++ b/drivers/dma/tegra20-apb-dma.c | ||
1583 | @@ -636,7 +636,10 @@ static void handle_cont_sngl_cycle_dma_done(struct tegra_dma_channel *tdc, | ||
1584 | |||
1585 | sgreq = list_first_entry(&tdc->pending_sg_req, typeof(*sgreq), node); | ||
1586 | dma_desc = sgreq->dma_desc; | ||
1587 | - dma_desc->bytes_transferred += sgreq->req_len; | ||
1588 | + /* if we dma for long enough the transfer count will wrap */ | ||
1589 | + dma_desc->bytes_transferred = | ||
1590 | + (dma_desc->bytes_transferred + sgreq->req_len) % | ||
1591 | + dma_desc->bytes_requested; | ||
1592 | |||
1593 | /* Callback need to be call */ | ||
1594 | if (!dma_desc->cb_count) | ||
1595 | diff --git a/drivers/firmware/efi/cper.c b/drivers/firmware/efi/cper.c | ||
1596 | index a7902fccdcfa..6090d25dce85 100644 | ||
1597 | --- a/drivers/firmware/efi/cper.c | ||
1598 | +++ b/drivers/firmware/efi/cper.c | ||
1599 | @@ -546,19 +546,24 @@ EXPORT_SYMBOL_GPL(cper_estatus_check_header); | ||
1600 | int cper_estatus_check(const struct acpi_hest_generic_status *estatus) | ||
1601 | { | ||
1602 | struct acpi_hest_generic_data *gdata; | ||
1603 | - unsigned int data_len, gedata_len; | ||
1604 | + unsigned int data_len, record_size; | ||
1605 | int rc; | ||
1606 | |||
1607 | rc = cper_estatus_check_header(estatus); | ||
1608 | if (rc) | ||
1609 | return rc; | ||
1610 | + | ||
1611 | data_len = estatus->data_length; | ||
1612 | |||
1613 | apei_estatus_for_each_section(estatus, gdata) { | ||
1614 | - gedata_len = acpi_hest_get_error_length(gdata); | ||
1615 | - if (gedata_len > data_len - acpi_hest_get_size(gdata)) | ||
1616 | + if (sizeof(struct acpi_hest_generic_data) > data_len) | ||
1617 | + return -EINVAL; | ||
1618 | + | ||
1619 | + record_size = acpi_hest_get_record_size(gdata); | ||
1620 | + if (record_size > data_len) | ||
1621 | return -EINVAL; | ||
1622 | - data_len -= acpi_hest_get_record_size(gdata); | ||
1623 | + | ||
1624 | + data_len -= record_size; | ||
1625 | } | ||
1626 | if (data_len) | ||
1627 | return -EINVAL; | ||
1628 | diff --git a/drivers/firmware/efi/libstub/arm-stub.c b/drivers/firmware/efi/libstub/arm-stub.c | ||
1629 | index c037c6c5d0b7..04e6ecd72cd9 100644 | ||
1630 | --- a/drivers/firmware/efi/libstub/arm-stub.c | ||
1631 | +++ b/drivers/firmware/efi/libstub/arm-stub.c | ||
1632 | @@ -367,6 +367,11 @@ void efi_get_virtmap(efi_memory_desc_t *memory_map, unsigned long map_size, | ||
1633 | paddr = in->phys_addr; | ||
1634 | size = in->num_pages * EFI_PAGE_SIZE; | ||
1635 | |||
1636 | + if (novamap()) { | ||
1637 | + in->virt_addr = in->phys_addr; | ||
1638 | + continue; | ||
1639 | + } | ||
1640 | + | ||
1641 | /* | ||
1642 | * Make the mapping compatible with 64k pages: this allows | ||
1643 | * a 4k page size kernel to kexec a 64k page size kernel and | ||
1644 | diff --git a/drivers/firmware/efi/libstub/efi-stub-helper.c b/drivers/firmware/efi/libstub/efi-stub-helper.c | ||
1645 | index e94975f4655b..442f51c2a53d 100644 | ||
1646 | --- a/drivers/firmware/efi/libstub/efi-stub-helper.c | ||
1647 | +++ b/drivers/firmware/efi/libstub/efi-stub-helper.c | ||
1648 | @@ -34,6 +34,7 @@ static unsigned long __chunk_size = EFI_READ_CHUNK_SIZE; | ||
1649 | |||
1650 | static int __section(.data) __nokaslr; | ||
1651 | static int __section(.data) __quiet; | ||
1652 | +static int __section(.data) __novamap; | ||
1653 | |||
1654 | int __pure nokaslr(void) | ||
1655 | { | ||
1656 | @@ -43,6 +44,10 @@ int __pure is_quiet(void) | ||
1657 | { | ||
1658 | return __quiet; | ||
1659 | } | ||
1660 | +int __pure novamap(void) | ||
1661 | +{ | ||
1662 | + return __novamap; | ||
1663 | +} | ||
1664 | |||
1665 | #define EFI_MMAP_NR_SLACK_SLOTS 8 | ||
1666 | |||
1667 | @@ -482,6 +487,11 @@ efi_status_t efi_parse_options(char const *cmdline) | ||
1668 | __chunk_size = -1UL; | ||
1669 | } | ||
1670 | |||
1671 | + if (!strncmp(str, "novamap", 7)) { | ||
1672 | + str += strlen("novamap"); | ||
1673 | + __novamap = 1; | ||
1674 | + } | ||
1675 | + | ||
1676 | /* Group words together, delimited by "," */ | ||
1677 | while (*str && *str != ' ' && *str != ',') | ||
1678 | str++; | ||
1679 | diff --git a/drivers/firmware/efi/libstub/efistub.h b/drivers/firmware/efi/libstub/efistub.h | ||
1680 | index 32799cf039ef..337b52c4702c 100644 | ||
1681 | --- a/drivers/firmware/efi/libstub/efistub.h | ||
1682 | +++ b/drivers/firmware/efi/libstub/efistub.h | ||
1683 | @@ -27,6 +27,7 @@ | ||
1684 | |||
1685 | extern int __pure nokaslr(void); | ||
1686 | extern int __pure is_quiet(void); | ||
1687 | +extern int __pure novamap(void); | ||
1688 | |||
1689 | #define pr_efi(sys_table, msg) do { \ | ||
1690 | if (!is_quiet()) efi_printk(sys_table, "EFI stub: "msg); \ | ||
1691 | diff --git a/drivers/firmware/efi/libstub/fdt.c b/drivers/firmware/efi/libstub/fdt.c | ||
1692 | index 0dc7b4987cc2..f8f89f995e9d 100644 | ||
1693 | --- a/drivers/firmware/efi/libstub/fdt.c | ||
1694 | +++ b/drivers/firmware/efi/libstub/fdt.c | ||
1695 | @@ -327,6 +327,9 @@ efi_status_t allocate_new_fdt_and_exit_boot(efi_system_table_t *sys_table, | ||
1696 | if (status == EFI_SUCCESS) { | ||
1697 | efi_set_virtual_address_map_t *svam; | ||
1698 | |||
1699 | + if (novamap()) | ||
1700 | + return EFI_SUCCESS; | ||
1701 | + | ||
1702 | /* Install the new virtual address map */ | ||
1703 | svam = sys_table->runtime->set_virtual_address_map; | ||
1704 | status = svam(runtime_entry_count * desc_size, desc_size, | ||
1705 | diff --git a/drivers/firmware/efi/memattr.c b/drivers/firmware/efi/memattr.c | ||
1706 | index 8986757eafaf..aac972b056d9 100644 | ||
1707 | --- a/drivers/firmware/efi/memattr.c | ||
1708 | +++ b/drivers/firmware/efi/memattr.c | ||
1709 | @@ -94,7 +94,7 @@ static bool entry_is_valid(const efi_memory_desc_t *in, efi_memory_desc_t *out) | ||
1710 | |||
1711 | if (!(md->attribute & EFI_MEMORY_RUNTIME)) | ||
1712 | continue; | ||
1713 | - if (md->virt_addr == 0) { | ||
1714 | + if (md->virt_addr == 0 && md->phys_addr != 0) { | ||
1715 | /* no virtual mapping has been installed by the stub */ | ||
1716 | break; | ||
1717 | } | ||
1718 | diff --git a/drivers/firmware/efi/runtime-wrappers.c b/drivers/firmware/efi/runtime-wrappers.c | ||
1719 | index e2abfdb5cee6..698745c249e8 100644 | ||
1720 | --- a/drivers/firmware/efi/runtime-wrappers.c | ||
1721 | +++ b/drivers/firmware/efi/runtime-wrappers.c | ||
1722 | @@ -85,7 +85,7 @@ struct efi_runtime_work efi_rts_work; | ||
1723 | pr_err("Failed to queue work to efi_rts_wq.\n"); \ | ||
1724 | \ | ||
1725 | exit: \ | ||
1726 | - efi_rts_work.efi_rts_id = NONE; \ | ||
1727 | + efi_rts_work.efi_rts_id = EFI_NONE; \ | ||
1728 | efi_rts_work.status; \ | ||
1729 | }) | ||
1730 | |||
1731 | @@ -175,50 +175,50 @@ static void efi_call_rts(struct work_struct *work) | ||
1732 | arg5 = efi_rts_work.arg5; | ||
1733 | |||
1734 | switch (efi_rts_work.efi_rts_id) { | ||
1735 | - case GET_TIME: | ||
1736 | + case EFI_GET_TIME: | ||
1737 | status = efi_call_virt(get_time, (efi_time_t *)arg1, | ||
1738 | (efi_time_cap_t *)arg2); | ||
1739 | break; | ||
1740 | - case SET_TIME: | ||
1741 | + case EFI_SET_TIME: | ||
1742 | status = efi_call_virt(set_time, (efi_time_t *)arg1); | ||
1743 | break; | ||
1744 | - case GET_WAKEUP_TIME: | ||
1745 | + case EFI_GET_WAKEUP_TIME: | ||
1746 | status = efi_call_virt(get_wakeup_time, (efi_bool_t *)arg1, | ||
1747 | (efi_bool_t *)arg2, (efi_time_t *)arg3); | ||
1748 | break; | ||
1749 | - case SET_WAKEUP_TIME: | ||
1750 | + case EFI_SET_WAKEUP_TIME: | ||
1751 | status = efi_call_virt(set_wakeup_time, *(efi_bool_t *)arg1, | ||
1752 | (efi_time_t *)arg2); | ||
1753 | break; | ||
1754 | - case GET_VARIABLE: | ||
1755 | + case EFI_GET_VARIABLE: | ||
1756 | status = efi_call_virt(get_variable, (efi_char16_t *)arg1, | ||
1757 | (efi_guid_t *)arg2, (u32 *)arg3, | ||
1758 | (unsigned long *)arg4, (void *)arg5); | ||
1759 | break; | ||
1760 | - case GET_NEXT_VARIABLE: | ||
1761 | + case EFI_GET_NEXT_VARIABLE: | ||
1762 | status = efi_call_virt(get_next_variable, (unsigned long *)arg1, | ||
1763 | (efi_char16_t *)arg2, | ||
1764 | (efi_guid_t *)arg3); | ||
1765 | break; | ||
1766 | - case SET_VARIABLE: | ||
1767 | + case EFI_SET_VARIABLE: | ||
1768 | status = efi_call_virt(set_variable, (efi_char16_t *)arg1, | ||
1769 | (efi_guid_t *)arg2, *(u32 *)arg3, | ||
1770 | *(unsigned long *)arg4, (void *)arg5); | ||
1771 | break; | ||
1772 | - case QUERY_VARIABLE_INFO: | ||
1773 | + case EFI_QUERY_VARIABLE_INFO: | ||
1774 | status = efi_call_virt(query_variable_info, *(u32 *)arg1, | ||
1775 | (u64 *)arg2, (u64 *)arg3, (u64 *)arg4); | ||
1776 | break; | ||
1777 | - case GET_NEXT_HIGH_MONO_COUNT: | ||
1778 | + case EFI_GET_NEXT_HIGH_MONO_COUNT: | ||
1779 | status = efi_call_virt(get_next_high_mono_count, (u32 *)arg1); | ||
1780 | break; | ||
1781 | - case UPDATE_CAPSULE: | ||
1782 | + case EFI_UPDATE_CAPSULE: | ||
1783 | status = efi_call_virt(update_capsule, | ||
1784 | (efi_capsule_header_t **)arg1, | ||
1785 | *(unsigned long *)arg2, | ||
1786 | *(unsigned long *)arg3); | ||
1787 | break; | ||
1788 | - case QUERY_CAPSULE_CAPS: | ||
1789 | + case EFI_QUERY_CAPSULE_CAPS: | ||
1790 | status = efi_call_virt(query_capsule_caps, | ||
1791 | (efi_capsule_header_t **)arg1, | ||
1792 | *(unsigned long *)arg2, (u64 *)arg3, | ||
1793 | @@ -242,7 +242,7 @@ static efi_status_t virt_efi_get_time(efi_time_t *tm, efi_time_cap_t *tc) | ||
1794 | |||
1795 | if (down_interruptible(&efi_runtime_lock)) | ||
1796 | return EFI_ABORTED; | ||
1797 | - status = efi_queue_work(GET_TIME, tm, tc, NULL, NULL, NULL); | ||
1798 | + status = efi_queue_work(EFI_GET_TIME, tm, tc, NULL, NULL, NULL); | ||
1799 | up(&efi_runtime_lock); | ||
1800 | return status; | ||
1801 | } | ||
1802 | @@ -253,7 +253,7 @@ static efi_status_t virt_efi_set_time(efi_time_t *tm) | ||
1803 | |||
1804 | if (down_interruptible(&efi_runtime_lock)) | ||
1805 | return EFI_ABORTED; | ||
1806 | - status = efi_queue_work(SET_TIME, tm, NULL, NULL, NULL, NULL); | ||
1807 | + status = efi_queue_work(EFI_SET_TIME, tm, NULL, NULL, NULL, NULL); | ||
1808 | up(&efi_runtime_lock); | ||
1809 | return status; | ||
1810 | } | ||
1811 | @@ -266,7 +266,7 @@ static efi_status_t virt_efi_get_wakeup_time(efi_bool_t *enabled, | ||
1812 | |||
1813 | if (down_interruptible(&efi_runtime_lock)) | ||
1814 | return EFI_ABORTED; | ||
1815 | - status = efi_queue_work(GET_WAKEUP_TIME, enabled, pending, tm, NULL, | ||
1816 | + status = efi_queue_work(EFI_GET_WAKEUP_TIME, enabled, pending, tm, NULL, | ||
1817 | NULL); | ||
1818 | up(&efi_runtime_lock); | ||
1819 | return status; | ||
1820 | @@ -278,7 +278,7 @@ static efi_status_t virt_efi_set_wakeup_time(efi_bool_t enabled, efi_time_t *tm) | ||
1821 | |||
1822 | if (down_interruptible(&efi_runtime_lock)) | ||
1823 | return EFI_ABORTED; | ||
1824 | - status = efi_queue_work(SET_WAKEUP_TIME, &enabled, tm, NULL, NULL, | ||
1825 | + status = efi_queue_work(EFI_SET_WAKEUP_TIME, &enabled, tm, NULL, NULL, | ||
1826 | NULL); | ||
1827 | up(&efi_runtime_lock); | ||
1828 | return status; | ||
1829 | @@ -294,7 +294,7 @@ static efi_status_t virt_efi_get_variable(efi_char16_t *name, | ||
1830 | |||
1831 | if (down_interruptible(&efi_runtime_lock)) | ||
1832 | return EFI_ABORTED; | ||
1833 | - status = efi_queue_work(GET_VARIABLE, name, vendor, attr, data_size, | ||
1834 | + status = efi_queue_work(EFI_GET_VARIABLE, name, vendor, attr, data_size, | ||
1835 | data); | ||
1836 | up(&efi_runtime_lock); | ||
1837 | return status; | ||
1838 | @@ -308,7 +308,7 @@ static efi_status_t virt_efi_get_next_variable(unsigned long *name_size, | ||
1839 | |||
1840 | if (down_interruptible(&efi_runtime_lock)) | ||
1841 | return EFI_ABORTED; | ||
1842 | - status = efi_queue_work(GET_NEXT_VARIABLE, name_size, name, vendor, | ||
1843 | + status = efi_queue_work(EFI_GET_NEXT_VARIABLE, name_size, name, vendor, | ||
1844 | NULL, NULL); | ||
1845 | up(&efi_runtime_lock); | ||
1846 | return status; | ||
1847 | @@ -324,7 +324,7 @@ static efi_status_t virt_efi_set_variable(efi_char16_t *name, | ||
1848 | |||
1849 | if (down_interruptible(&efi_runtime_lock)) | ||
1850 | return EFI_ABORTED; | ||
1851 | - status = efi_queue_work(SET_VARIABLE, name, vendor, &attr, &data_size, | ||
1852 | + status = efi_queue_work(EFI_SET_VARIABLE, name, vendor, &attr, &data_size, | ||
1853 | data); | ||
1854 | up(&efi_runtime_lock); | ||
1855 | return status; | ||
1856 | @@ -359,7 +359,7 @@ static efi_status_t virt_efi_query_variable_info(u32 attr, | ||
1857 | |||
1858 | if (down_interruptible(&efi_runtime_lock)) | ||
1859 | return EFI_ABORTED; | ||
1860 | - status = efi_queue_work(QUERY_VARIABLE_INFO, &attr, storage_space, | ||
1861 | + status = efi_queue_work(EFI_QUERY_VARIABLE_INFO, &attr, storage_space, | ||
1862 | remaining_space, max_variable_size, NULL); | ||
1863 | up(&efi_runtime_lock); | ||
1864 | return status; | ||
1865 | @@ -391,7 +391,7 @@ static efi_status_t virt_efi_get_next_high_mono_count(u32 *count) | ||
1866 | |||
1867 | if (down_interruptible(&efi_runtime_lock)) | ||
1868 | return EFI_ABORTED; | ||
1869 | - status = efi_queue_work(GET_NEXT_HIGH_MONO_COUNT, count, NULL, NULL, | ||
1870 | + status = efi_queue_work(EFI_GET_NEXT_HIGH_MONO_COUNT, count, NULL, NULL, | ||
1871 | NULL, NULL); | ||
1872 | up(&efi_runtime_lock); | ||
1873 | return status; | ||
1874 | @@ -407,7 +407,7 @@ static void virt_efi_reset_system(int reset_type, | ||
1875 | "could not get exclusive access to the firmware\n"); | ||
1876 | return; | ||
1877 | } | ||
1878 | - efi_rts_work.efi_rts_id = RESET_SYSTEM; | ||
1879 | + efi_rts_work.efi_rts_id = EFI_RESET_SYSTEM; | ||
1880 | __efi_call_virt(reset_system, reset_type, status, data_size, data); | ||
1881 | up(&efi_runtime_lock); | ||
1882 | } | ||
1883 | @@ -423,7 +423,7 @@ static efi_status_t virt_efi_update_capsule(efi_capsule_header_t **capsules, | ||
1884 | |||
1885 | if (down_interruptible(&efi_runtime_lock)) | ||
1886 | return EFI_ABORTED; | ||
1887 | - status = efi_queue_work(UPDATE_CAPSULE, capsules, &count, &sg_list, | ||
1888 | + status = efi_queue_work(EFI_UPDATE_CAPSULE, capsules, &count, &sg_list, | ||
1889 | NULL, NULL); | ||
1890 | up(&efi_runtime_lock); | ||
1891 | return status; | ||
1892 | @@ -441,7 +441,7 @@ static efi_status_t virt_efi_query_capsule_caps(efi_capsule_header_t **capsules, | ||
1893 | |||
1894 | if (down_interruptible(&efi_runtime_lock)) | ||
1895 | return EFI_ABORTED; | ||
1896 | - status = efi_queue_work(QUERY_CAPSULE_CAPS, capsules, &count, | ||
1897 | + status = efi_queue_work(EFI_QUERY_CAPSULE_CAPS, capsules, &count, | ||
1898 | max_size, reset_type, NULL); | ||
1899 | up(&efi_runtime_lock); | ||
1900 | return status; | ||
1901 | diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c | ||
1902 | index f4e9921fa966..7f33024b6d83 100644 | ||
1903 | --- a/drivers/gpio/gpio-omap.c | ||
1904 | +++ b/drivers/gpio/gpio-omap.c | ||
1905 | @@ -883,14 +883,16 @@ static void omap_gpio_unmask_irq(struct irq_data *d) | ||
1906 | if (trigger) | ||
1907 | omap_set_gpio_triggering(bank, offset, trigger); | ||
1908 | |||
1909 | - /* For level-triggered GPIOs, the clearing must be done after | ||
1910 | - * the HW source is cleared, thus after the handler has run */ | ||
1911 | - if (bank->level_mask & BIT(offset)) { | ||
1912 | - omap_set_gpio_irqenable(bank, offset, 0); | ||
1913 | + omap_set_gpio_irqenable(bank, offset, 1); | ||
1914 | + | ||
1915 | + /* | ||
1916 | + * For level-triggered GPIOs, clearing must be done after the source | ||
1917 | + * is cleared, thus after the handler has run. OMAP4 needs this done | ||
1918 | + * after enabing the interrupt to clear the wakeup status. | ||
1919 | + */ | ||
1920 | + if (bank->level_mask & BIT(offset)) | ||
1921 | omap_clear_gpio_irqstatus(bank, offset); | ||
1922 | - } | ||
1923 | |||
1924 | - omap_set_gpio_irqenable(bank, offset, 1); | ||
1925 | raw_spin_unlock_irqrestore(&bank->lock, flags); | ||
1926 | } | ||
1927 | |||
1928 | diff --git a/drivers/gpio/gpiolib-of.c b/drivers/gpio/gpiolib-of.c | ||
1929 | index a6e1891217e2..a1dd2f1c0d02 100644 | ||
1930 | --- a/drivers/gpio/gpiolib-of.c | ||
1931 | +++ b/drivers/gpio/gpiolib-of.c | ||
1932 | @@ -86,7 +86,8 @@ static void of_gpio_flags_quirks(struct device_node *np, | ||
1933 | if (IS_ENABLED(CONFIG_REGULATOR) && | ||
1934 | (of_device_is_compatible(np, "regulator-fixed") || | ||
1935 | of_device_is_compatible(np, "reg-fixed-voltage") || | ||
1936 | - of_device_is_compatible(np, "regulator-gpio"))) { | ||
1937 | + (of_device_is_compatible(np, "regulator-gpio") && | ||
1938 | + strcmp(propname, "enable-gpio") == 0))) { | ||
1939 | /* | ||
1940 | * The regulator GPIO handles are specified such that the | ||
1941 | * presence or absence of "enable-active-high" solely controls | ||
1942 | diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | ||
1943 | index 636d14a60952..83c8a0407537 100644 | ||
1944 | --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | ||
1945 | +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | ||
1946 | @@ -886,6 +886,7 @@ static void emulated_link_detect(struct dc_link *link) | ||
1947 | return; | ||
1948 | } | ||
1949 | |||
1950 | + /* dc_sink_create returns a new reference */ | ||
1951 | link->local_sink = sink; | ||
1952 | |||
1953 | edid_status = dm_helpers_read_local_edid( | ||
1954 | @@ -952,6 +953,8 @@ static int dm_resume(void *handle) | ||
1955 | if (aconnector->fake_enable && aconnector->dc_link->local_sink) | ||
1956 | aconnector->fake_enable = false; | ||
1957 | |||
1958 | + if (aconnector->dc_sink) | ||
1959 | + dc_sink_release(aconnector->dc_sink); | ||
1960 | aconnector->dc_sink = NULL; | ||
1961 | amdgpu_dm_update_connector_after_detect(aconnector); | ||
1962 | mutex_unlock(&aconnector->hpd_lock); | ||
1963 | @@ -1061,6 +1064,8 @@ amdgpu_dm_update_connector_after_detect(struct amdgpu_dm_connector *aconnector) | ||
1964 | |||
1965 | |||
1966 | sink = aconnector->dc_link->local_sink; | ||
1967 | + if (sink) | ||
1968 | + dc_sink_retain(sink); | ||
1969 | |||
1970 | /* | ||
1971 | * Edid mgmt connector gets first update only in mode_valid hook and then | ||
1972 | @@ -1085,21 +1090,24 @@ amdgpu_dm_update_connector_after_detect(struct amdgpu_dm_connector *aconnector) | ||
1973 | * to it anymore after disconnect, so on next crtc to connector | ||
1974 | * reshuffle by UMD we will get into unwanted dc_sink release | ||
1975 | */ | ||
1976 | - if (aconnector->dc_sink != aconnector->dc_em_sink) | ||
1977 | - dc_sink_release(aconnector->dc_sink); | ||
1978 | + dc_sink_release(aconnector->dc_sink); | ||
1979 | } | ||
1980 | aconnector->dc_sink = sink; | ||
1981 | + dc_sink_retain(aconnector->dc_sink); | ||
1982 | amdgpu_dm_update_freesync_caps(connector, | ||
1983 | aconnector->edid); | ||
1984 | } else { | ||
1985 | amdgpu_dm_update_freesync_caps(connector, NULL); | ||
1986 | - if (!aconnector->dc_sink) | ||
1987 | + if (!aconnector->dc_sink) { | ||
1988 | aconnector->dc_sink = aconnector->dc_em_sink; | ||
1989 | - else if (aconnector->dc_sink != aconnector->dc_em_sink) | ||
1990 | dc_sink_retain(aconnector->dc_sink); | ||
1991 | + } | ||
1992 | } | ||
1993 | |||
1994 | mutex_unlock(&dev->mode_config.mutex); | ||
1995 | + | ||
1996 | + if (sink) | ||
1997 | + dc_sink_release(sink); | ||
1998 | return; | ||
1999 | } | ||
2000 | |||
2001 | @@ -1107,8 +1115,10 @@ amdgpu_dm_update_connector_after_detect(struct amdgpu_dm_connector *aconnector) | ||
2002 | * TODO: temporary guard to look for proper fix | ||
2003 | * if this sink is MST sink, we should not do anything | ||
2004 | */ | ||
2005 | - if (sink && sink->sink_signal == SIGNAL_TYPE_DISPLAY_PORT_MST) | ||
2006 | + if (sink && sink->sink_signal == SIGNAL_TYPE_DISPLAY_PORT_MST) { | ||
2007 | + dc_sink_release(sink); | ||
2008 | return; | ||
2009 | + } | ||
2010 | |||
2011 | if (aconnector->dc_sink == sink) { | ||
2012 | /* | ||
2013 | @@ -1117,6 +1127,8 @@ amdgpu_dm_update_connector_after_detect(struct amdgpu_dm_connector *aconnector) | ||
2014 | */ | ||
2015 | DRM_DEBUG_DRIVER("DCHPD: connector_id=%d: dc_sink didn't change.\n", | ||
2016 | aconnector->connector_id); | ||
2017 | + if (sink) | ||
2018 | + dc_sink_release(sink); | ||
2019 | return; | ||
2020 | } | ||
2021 | |||
2022 | @@ -1138,6 +1150,7 @@ amdgpu_dm_update_connector_after_detect(struct amdgpu_dm_connector *aconnector) | ||
2023 | amdgpu_dm_update_freesync_caps(connector, NULL); | ||
2024 | |||
2025 | aconnector->dc_sink = sink; | ||
2026 | + dc_sink_retain(aconnector->dc_sink); | ||
2027 | if (sink->dc_edid.length == 0) { | ||
2028 | aconnector->edid = NULL; | ||
2029 | drm_dp_cec_unset_edid(&aconnector->dm_dp_aux.aux); | ||
2030 | @@ -1158,11 +1171,15 @@ amdgpu_dm_update_connector_after_detect(struct amdgpu_dm_connector *aconnector) | ||
2031 | amdgpu_dm_update_freesync_caps(connector, NULL); | ||
2032 | drm_connector_update_edid_property(connector, NULL); | ||
2033 | aconnector->num_modes = 0; | ||
2034 | + dc_sink_release(aconnector->dc_sink); | ||
2035 | aconnector->dc_sink = NULL; | ||
2036 | aconnector->edid = NULL; | ||
2037 | } | ||
2038 | |||
2039 | mutex_unlock(&dev->mode_config.mutex); | ||
2040 | + | ||
2041 | + if (sink) | ||
2042 | + dc_sink_release(sink); | ||
2043 | } | ||
2044 | |||
2045 | static void handle_hpd_irq(void *param) | ||
2046 | @@ -2908,6 +2925,7 @@ create_stream_for_sink(struct amdgpu_dm_connector *aconnector, | ||
2047 | } | ||
2048 | } else { | ||
2049 | sink = aconnector->dc_sink; | ||
2050 | + dc_sink_retain(sink); | ||
2051 | } | ||
2052 | |||
2053 | stream = dc_create_stream_for_sink(sink); | ||
2054 | @@ -2974,8 +2992,7 @@ create_stream_for_sink(struct amdgpu_dm_connector *aconnector, | ||
2055 | stream->ignore_msa_timing_param = true; | ||
2056 | |||
2057 | finish: | ||
2058 | - if (sink && sink->sink_signal == SIGNAL_TYPE_VIRTUAL && aconnector->base.force != DRM_FORCE_ON) | ||
2059 | - dc_sink_release(sink); | ||
2060 | + dc_sink_release(sink); | ||
2061 | |||
2062 | return stream; | ||
2063 | } | ||
2064 | @@ -3233,6 +3250,14 @@ static void amdgpu_dm_connector_destroy(struct drm_connector *connector) | ||
2065 | dm->backlight_dev = NULL; | ||
2066 | } | ||
2067 | #endif | ||
2068 | + | ||
2069 | + if (aconnector->dc_em_sink) | ||
2070 | + dc_sink_release(aconnector->dc_em_sink); | ||
2071 | + aconnector->dc_em_sink = NULL; | ||
2072 | + if (aconnector->dc_sink) | ||
2073 | + dc_sink_release(aconnector->dc_sink); | ||
2074 | + aconnector->dc_sink = NULL; | ||
2075 | + | ||
2076 | drm_dp_cec_unregister_connector(&aconnector->dm_dp_aux.aux); | ||
2077 | drm_connector_unregister(connector); | ||
2078 | drm_connector_cleanup(connector); | ||
2079 | @@ -3330,10 +3355,12 @@ static void create_eml_sink(struct amdgpu_dm_connector *aconnector) | ||
2080 | (edid->extensions + 1) * EDID_LENGTH, | ||
2081 | &init_params); | ||
2082 | |||
2083 | - if (aconnector->base.force == DRM_FORCE_ON) | ||
2084 | + if (aconnector->base.force == DRM_FORCE_ON) { | ||
2085 | aconnector->dc_sink = aconnector->dc_link->local_sink ? | ||
2086 | aconnector->dc_link->local_sink : | ||
2087 | aconnector->dc_em_sink; | ||
2088 | + dc_sink_retain(aconnector->dc_sink); | ||
2089 | + } | ||
2090 | } | ||
2091 | |||
2092 | static void handle_edid_mgmt(struct amdgpu_dm_connector *aconnector) | ||
2093 | @@ -4948,7 +4975,8 @@ static void amdgpu_dm_commit_planes(struct drm_atomic_state *state, | ||
2094 | static void amdgpu_dm_crtc_copy_transient_flags(struct drm_crtc_state *crtc_state, | ||
2095 | struct dc_stream_state *stream_state) | ||
2096 | { | ||
2097 | - stream_state->mode_changed = crtc_state->mode_changed; | ||
2098 | + stream_state->mode_changed = | ||
2099 | + crtc_state->mode_changed || crtc_state->active_changed; | ||
2100 | } | ||
2101 | |||
2102 | static int amdgpu_dm_atomic_commit(struct drm_device *dev, | ||
2103 | @@ -4969,10 +4997,22 @@ static int amdgpu_dm_atomic_commit(struct drm_device *dev, | ||
2104 | */ | ||
2105 | for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) { | ||
2106 | struct dm_crtc_state *dm_old_crtc_state = to_dm_crtc_state(old_crtc_state); | ||
2107 | + struct dm_crtc_state *dm_new_crtc_state = to_dm_crtc_state(new_crtc_state); | ||
2108 | struct amdgpu_crtc *acrtc = to_amdgpu_crtc(crtc); | ||
2109 | |||
2110 | - if (drm_atomic_crtc_needs_modeset(new_crtc_state) && dm_old_crtc_state->stream) | ||
2111 | + if (drm_atomic_crtc_needs_modeset(new_crtc_state) | ||
2112 | + && dm_old_crtc_state->stream) { | ||
2113 | + /* | ||
2114 | + * CRC capture was enabled but not disabled. | ||
2115 | + * Release the vblank reference. | ||
2116 | + */ | ||
2117 | + if (dm_new_crtc_state->crc_enabled) { | ||
2118 | + drm_crtc_vblank_put(crtc); | ||
2119 | + dm_new_crtc_state->crc_enabled = false; | ||
2120 | + } | ||
2121 | + | ||
2122 | manage_dm_interrupts(adev, acrtc, false); | ||
2123 | + } | ||
2124 | } | ||
2125 | /* | ||
2126 | * Add check here for SoC's that support hardware cursor plane, to | ||
2127 | 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 | ||
2128 | index f088ac585978..26b651148c67 100644 | ||
2129 | --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crc.c | ||
2130 | +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crc.c | ||
2131 | @@ -66,6 +66,7 @@ int amdgpu_dm_crtc_set_crc_source(struct drm_crtc *crtc, const char *src_name) | ||
2132 | { | ||
2133 | struct dm_crtc_state *crtc_state = to_dm_crtc_state(crtc->state); | ||
2134 | struct dc_stream_state *stream_state = crtc_state->stream; | ||
2135 | + bool enable; | ||
2136 | |||
2137 | enum amdgpu_dm_pipe_crc_source source = dm_parse_crc_source(src_name); | ||
2138 | |||
2139 | @@ -80,28 +81,27 @@ int amdgpu_dm_crtc_set_crc_source(struct drm_crtc *crtc, const char *src_name) | ||
2140 | return -EINVAL; | ||
2141 | } | ||
2142 | |||
2143 | + enable = (source == AMDGPU_DM_PIPE_CRC_SOURCE_AUTO); | ||
2144 | + | ||
2145 | + if (!dc_stream_configure_crc(stream_state->ctx->dc, stream_state, | ||
2146 | + enable, enable)) | ||
2147 | + return -EINVAL; | ||
2148 | + | ||
2149 | /* When enabling CRC, we should also disable dithering. */ | ||
2150 | - if (source == AMDGPU_DM_PIPE_CRC_SOURCE_AUTO) { | ||
2151 | - if (dc_stream_configure_crc(stream_state->ctx->dc, | ||
2152 | - stream_state, | ||
2153 | - true, true)) { | ||
2154 | - crtc_state->crc_enabled = true; | ||
2155 | - dc_stream_set_dither_option(stream_state, | ||
2156 | - DITHER_OPTION_TRUN8); | ||
2157 | - } | ||
2158 | - else | ||
2159 | - return -EINVAL; | ||
2160 | - } else { | ||
2161 | - if (dc_stream_configure_crc(stream_state->ctx->dc, | ||
2162 | - stream_state, | ||
2163 | - false, false)) { | ||
2164 | - crtc_state->crc_enabled = false; | ||
2165 | - dc_stream_set_dither_option(stream_state, | ||
2166 | - DITHER_OPTION_DEFAULT); | ||
2167 | - } | ||
2168 | - else | ||
2169 | - return -EINVAL; | ||
2170 | - } | ||
2171 | + dc_stream_set_dither_option(stream_state, | ||
2172 | + enable ? DITHER_OPTION_TRUN8 | ||
2173 | + : DITHER_OPTION_DEFAULT); | ||
2174 | + | ||
2175 | + /* | ||
2176 | + * Reading the CRC requires the vblank interrupt handler to be | ||
2177 | + * enabled. Keep a reference until CRC capture stops. | ||
2178 | + */ | ||
2179 | + if (!crtc_state->crc_enabled && enable) | ||
2180 | + drm_crtc_vblank_get(crtc); | ||
2181 | + else if (crtc_state->crc_enabled && !enable) | ||
2182 | + drm_crtc_vblank_put(crtc); | ||
2183 | + | ||
2184 | + crtc_state->crc_enabled = enable; | ||
2185 | |||
2186 | /* Reset crc_skipped on dm state */ | ||
2187 | crtc_state->crc_skip_count = 0; | ||
2188 | diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c | ||
2189 | index 1b0d209d8367..3b95a637b508 100644 | ||
2190 | --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c | ||
2191 | +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c | ||
2192 | @@ -239,6 +239,7 @@ static int dm_dp_mst_get_modes(struct drm_connector *connector) | ||
2193 | &init_params); | ||
2194 | |||
2195 | dc_sink->priv = aconnector; | ||
2196 | + /* dc_link_add_remote_sink returns a new reference */ | ||
2197 | aconnector->dc_sink = dc_sink; | ||
2198 | |||
2199 | if (aconnector->dc_sink) | ||
2200 | diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c b/drivers/gpu/drm/amd/display/dc/core/dc.c | ||
2201 | index 5fd52094d459..1f92e7e8e3d3 100644 | ||
2202 | --- a/drivers/gpu/drm/amd/display/dc/core/dc.c | ||
2203 | +++ b/drivers/gpu/drm/amd/display/dc/core/dc.c | ||
2204 | @@ -1078,6 +1078,9 @@ static enum dc_status dc_commit_state_no_check(struct dc *dc, struct dc_state *c | ||
2205 | /* pplib is notified if disp_num changed */ | ||
2206 | dc->hwss.optimize_bandwidth(dc, context); | ||
2207 | |||
2208 | + for (i = 0; i < context->stream_count; i++) | ||
2209 | + context->streams[i]->mode_changed = false; | ||
2210 | + | ||
2211 | dc_release_state(dc->current_state); | ||
2212 | |||
2213 | dc->current_state = context; | ||
2214 | diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link.c b/drivers/gpu/drm/amd/display/dc/core/dc_link.c | ||
2215 | index b0265dbebd4c..583eb367850f 100644 | ||
2216 | --- a/drivers/gpu/drm/amd/display/dc/core/dc_link.c | ||
2217 | +++ b/drivers/gpu/drm/amd/display/dc/core/dc_link.c | ||
2218 | @@ -792,6 +792,7 @@ bool dc_link_detect(struct dc_link *link, enum dc_detect_reason reason) | ||
2219 | sink->dongle_max_pix_clk = sink_caps.max_hdmi_pixel_clock; | ||
2220 | sink->converter_disable_audio = converter_disable_audio; | ||
2221 | |||
2222 | + /* dc_sink_create returns a new reference */ | ||
2223 | link->local_sink = sink; | ||
2224 | |||
2225 | edid_status = dm_helpers_read_local_edid( | ||
2226 | 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 | ||
2227 | index 41883c981789..a684b38332ac 100644 | ||
2228 | --- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c | ||
2229 | +++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c | ||
2230 | @@ -2334,9 +2334,10 @@ static void dcn10_apply_ctx_for_surface( | ||
2231 | } | ||
2232 | } | ||
2233 | |||
2234 | - if (!pipe_ctx->plane_state && | ||
2235 | - old_pipe_ctx->plane_state && | ||
2236 | - old_pipe_ctx->stream_res.tg == tg) { | ||
2237 | + if ((!pipe_ctx->plane_state || | ||
2238 | + pipe_ctx->stream_res.tg != old_pipe_ctx->stream_res.tg) && | ||
2239 | + old_pipe_ctx->plane_state && | ||
2240 | + old_pipe_ctx->stream_res.tg == tg) { | ||
2241 | |||
2242 | dc->hwss.plane_atomic_disconnect(dc, old_pipe_ctx); | ||
2243 | removed_pipe[i] = true; | ||
2244 | diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c b/drivers/gpu/drm/drm_dp_mst_topology.c | ||
2245 | index 529414556962..1a244c53252c 100644 | ||
2246 | --- a/drivers/gpu/drm/drm_dp_mst_topology.c | ||
2247 | +++ b/drivers/gpu/drm/drm_dp_mst_topology.c | ||
2248 | @@ -3286,6 +3286,7 @@ static int drm_dp_mst_i2c_xfer(struct i2c_adapter *adapter, struct i2c_msg *msgs | ||
2249 | msg.u.i2c_read.transactions[i].i2c_dev_id = msgs[i].addr; | ||
2250 | msg.u.i2c_read.transactions[i].num_bytes = msgs[i].len; | ||
2251 | msg.u.i2c_read.transactions[i].bytes = msgs[i].buf; | ||
2252 | + msg.u.i2c_read.transactions[i].no_stop_bit = !(msgs[i].flags & I2C_M_STOP); | ||
2253 | } | ||
2254 | msg.u.i2c_read.read_i2c_device_id = msgs[num - 1].addr; | ||
2255 | msg.u.i2c_read.num_bytes_read = msgs[num - 1].len; | ||
2256 | diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c | ||
2257 | index 70fc8e356b18..edd8cb497f3b 100644 | ||
2258 | --- a/drivers/gpu/drm/drm_fb_helper.c | ||
2259 | +++ b/drivers/gpu/drm/drm_fb_helper.c | ||
2260 | @@ -2891,7 +2891,7 @@ int drm_fb_helper_fbdev_setup(struct drm_device *dev, | ||
2261 | return 0; | ||
2262 | |||
2263 | err_drm_fb_helper_fini: | ||
2264 | - drm_fb_helper_fini(fb_helper); | ||
2265 | + drm_fb_helper_fbdev_teardown(dev); | ||
2266 | |||
2267 | return ret; | ||
2268 | } | ||
2269 | diff --git a/drivers/gpu/drm/drm_mode_object.c b/drivers/gpu/drm/drm_mode_object.c | ||
2270 | index 004191d01772..15b919f90c5a 100644 | ||
2271 | --- a/drivers/gpu/drm/drm_mode_object.c | ||
2272 | +++ b/drivers/gpu/drm/drm_mode_object.c | ||
2273 | @@ -465,6 +465,7 @@ static int set_property_atomic(struct drm_mode_object *obj, | ||
2274 | |||
2275 | drm_modeset_acquire_init(&ctx, 0); | ||
2276 | state->acquire_ctx = &ctx; | ||
2277 | + | ||
2278 | retry: | ||
2279 | if (prop == state->dev->mode_config.dpms_property) { | ||
2280 | if (obj->type != DRM_MODE_OBJECT_CONNECTOR) { | ||
2281 | diff --git a/drivers/gpu/drm/drm_plane.c b/drivers/gpu/drm/drm_plane.c | ||
2282 | index 5f650d8fc66b..4cfb56893b7f 100644 | ||
2283 | --- a/drivers/gpu/drm/drm_plane.c | ||
2284 | +++ b/drivers/gpu/drm/drm_plane.c | ||
2285 | @@ -220,6 +220,9 @@ int drm_universal_plane_init(struct drm_device *dev, struct drm_plane *plane, | ||
2286 | format_modifier_count++; | ||
2287 | } | ||
2288 | |||
2289 | + if (format_modifier_count) | ||
2290 | + config->allow_fb_modifiers = true; | ||
2291 | + | ||
2292 | plane->modifier_count = format_modifier_count; | ||
2293 | plane->modifiers = kmalloc_array(format_modifier_count, | ||
2294 | sizeof(format_modifiers[0]), | ||
2295 | diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_mdss.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_mdss.c | ||
2296 | index cb307a2abf06..7316b4ab1b85 100644 | ||
2297 | --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_mdss.c | ||
2298 | +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_mdss.c | ||
2299 | @@ -23,11 +23,14 @@ struct dpu_mdss { | ||
2300 | struct dpu_irq_controller irq_controller; | ||
2301 | }; | ||
2302 | |||
2303 | -static irqreturn_t dpu_mdss_irq(int irq, void *arg) | ||
2304 | +static void dpu_mdss_irq(struct irq_desc *desc) | ||
2305 | { | ||
2306 | - struct dpu_mdss *dpu_mdss = arg; | ||
2307 | + struct dpu_mdss *dpu_mdss = irq_desc_get_handler_data(desc); | ||
2308 | + struct irq_chip *chip = irq_desc_get_chip(desc); | ||
2309 | u32 interrupts; | ||
2310 | |||
2311 | + chained_irq_enter(chip, desc); | ||
2312 | + | ||
2313 | interrupts = readl_relaxed(dpu_mdss->mmio + HW_INTR_STATUS); | ||
2314 | |||
2315 | while (interrupts) { | ||
2316 | @@ -39,20 +42,20 @@ static irqreturn_t dpu_mdss_irq(int irq, void *arg) | ||
2317 | hwirq); | ||
2318 | if (mapping == 0) { | ||
2319 | DRM_ERROR("couldn't find irq mapping for %lu\n", hwirq); | ||
2320 | - return IRQ_NONE; | ||
2321 | + break; | ||
2322 | } | ||
2323 | |||
2324 | rc = generic_handle_irq(mapping); | ||
2325 | if (rc < 0) { | ||
2326 | DRM_ERROR("handle irq fail: irq=%lu mapping=%u rc=%d\n", | ||
2327 | hwirq, mapping, rc); | ||
2328 | - return IRQ_NONE; | ||
2329 | + break; | ||
2330 | } | ||
2331 | |||
2332 | interrupts &= ~(1 << hwirq); | ||
2333 | } | ||
2334 | |||
2335 | - return IRQ_HANDLED; | ||
2336 | + chained_irq_exit(chip, desc); | ||
2337 | } | ||
2338 | |||
2339 | static void dpu_mdss_irq_mask(struct irq_data *irqd) | ||
2340 | @@ -83,16 +86,16 @@ static struct irq_chip dpu_mdss_irq_chip = { | ||
2341 | .irq_unmask = dpu_mdss_irq_unmask, | ||
2342 | }; | ||
2343 | |||
2344 | +static struct lock_class_key dpu_mdss_lock_key, dpu_mdss_request_key; | ||
2345 | + | ||
2346 | static int dpu_mdss_irqdomain_map(struct irq_domain *domain, | ||
2347 | unsigned int irq, irq_hw_number_t hwirq) | ||
2348 | { | ||
2349 | struct dpu_mdss *dpu_mdss = domain->host_data; | ||
2350 | - int ret; | ||
2351 | |||
2352 | + irq_set_lockdep_class(irq, &dpu_mdss_lock_key, &dpu_mdss_request_key); | ||
2353 | irq_set_chip_and_handler(irq, &dpu_mdss_irq_chip, handle_level_irq); | ||
2354 | - ret = irq_set_chip_data(irq, dpu_mdss); | ||
2355 | - | ||
2356 | - return ret; | ||
2357 | + return irq_set_chip_data(irq, dpu_mdss); | ||
2358 | } | ||
2359 | |||
2360 | static const struct irq_domain_ops dpu_mdss_irqdomain_ops = { | ||
2361 | @@ -159,11 +162,13 @@ static void dpu_mdss_destroy(struct drm_device *dev) | ||
2362 | struct msm_drm_private *priv = dev->dev_private; | ||
2363 | struct dpu_mdss *dpu_mdss = to_dpu_mdss(priv->mdss); | ||
2364 | struct dss_module_power *mp = &dpu_mdss->mp; | ||
2365 | + int irq; | ||
2366 | |||
2367 | pm_runtime_suspend(dev->dev); | ||
2368 | pm_runtime_disable(dev->dev); | ||
2369 | _dpu_mdss_irq_domain_fini(dpu_mdss); | ||
2370 | - free_irq(platform_get_irq(pdev, 0), dpu_mdss); | ||
2371 | + irq = platform_get_irq(pdev, 0); | ||
2372 | + irq_set_chained_handler_and_data(irq, NULL, NULL); | ||
2373 | msm_dss_put_clk(mp->clk_config, mp->num_clk); | ||
2374 | devm_kfree(&pdev->dev, mp->clk_config); | ||
2375 | |||
2376 | @@ -187,6 +192,7 @@ int dpu_mdss_init(struct drm_device *dev) | ||
2377 | struct dpu_mdss *dpu_mdss; | ||
2378 | struct dss_module_power *mp; | ||
2379 | int ret = 0; | ||
2380 | + int irq; | ||
2381 | |||
2382 | dpu_mdss = devm_kzalloc(dev->dev, sizeof(*dpu_mdss), GFP_KERNEL); | ||
2383 | if (!dpu_mdss) | ||
2384 | @@ -219,12 +225,12 @@ int dpu_mdss_init(struct drm_device *dev) | ||
2385 | if (ret) | ||
2386 | goto irq_domain_error; | ||
2387 | |||
2388 | - ret = request_irq(platform_get_irq(pdev, 0), | ||
2389 | - dpu_mdss_irq, 0, "dpu_mdss_isr", dpu_mdss); | ||
2390 | - if (ret) { | ||
2391 | - DPU_ERROR("failed to init irq: %d\n", ret); | ||
2392 | + irq = platform_get_irq(pdev, 0); | ||
2393 | + if (irq < 0) | ||
2394 | goto irq_error; | ||
2395 | - } | ||
2396 | + | ||
2397 | + irq_set_chained_handler_and_data(irq, dpu_mdss_irq, | ||
2398 | + dpu_mdss); | ||
2399 | |||
2400 | pm_runtime_enable(dev->dev); | ||
2401 | |||
2402 | diff --git a/drivers/gpu/drm/nouveau/dispnv04/tvnv17.c b/drivers/gpu/drm/nouveau/dispnv04/tvnv17.c | ||
2403 | index 6a4ca139cf5d..8fd8124d72ba 100644 | ||
2404 | --- a/drivers/gpu/drm/nouveau/dispnv04/tvnv17.c | ||
2405 | +++ b/drivers/gpu/drm/nouveau/dispnv04/tvnv17.c | ||
2406 | @@ -750,7 +750,9 @@ static int nv17_tv_set_property(struct drm_encoder *encoder, | ||
2407 | /* Disable the crtc to ensure a full modeset is | ||
2408 | * performed whenever it's turned on again. */ | ||
2409 | if (crtc) | ||
2410 | - drm_crtc_force_disable(crtc); | ||
2411 | + drm_crtc_helper_set_mode(crtc, &crtc->mode, | ||
2412 | + crtc->x, crtc->y, | ||
2413 | + crtc->primary->fb); | ||
2414 | } | ||
2415 | |||
2416 | return 0; | ||
2417 | diff --git a/drivers/gpu/drm/rcar-du/rcar_du_kms.c b/drivers/gpu/drm/rcar-du/rcar_du_kms.c | ||
2418 | index 9c7007d45408..f9a90ff24e6d 100644 | ||
2419 | --- a/drivers/gpu/drm/rcar-du/rcar_du_kms.c | ||
2420 | +++ b/drivers/gpu/drm/rcar-du/rcar_du_kms.c | ||
2421 | @@ -331,6 +331,7 @@ static int rcar_du_encoders_init_one(struct rcar_du_device *rcdu, | ||
2422 | dev_dbg(rcdu->dev, | ||
2423 | "connected entity %pOF is disabled, skipping\n", | ||
2424 | entity); | ||
2425 | + of_node_put(entity); | ||
2426 | return -ENODEV; | ||
2427 | } | ||
2428 | |||
2429 | @@ -366,6 +367,7 @@ static int rcar_du_encoders_init_one(struct rcar_du_device *rcdu, | ||
2430 | dev_warn(rcdu->dev, | ||
2431 | "no encoder found for endpoint %pOF, skipping\n", | ||
2432 | ep->local_node); | ||
2433 | + of_node_put(entity); | ||
2434 | return -ENODEV; | ||
2435 | } | ||
2436 | |||
2437 | diff --git a/drivers/gpu/drm/scheduler/sched_entity.c b/drivers/gpu/drm/scheduler/sched_entity.c | ||
2438 | index e2942c9a11a7..35ddbec1375a 100644 | ||
2439 | --- a/drivers/gpu/drm/scheduler/sched_entity.c | ||
2440 | +++ b/drivers/gpu/drm/scheduler/sched_entity.c | ||
2441 | @@ -52,12 +52,12 @@ int drm_sched_entity_init(struct drm_sched_entity *entity, | ||
2442 | { | ||
2443 | int i; | ||
2444 | |||
2445 | - if (!(entity && rq_list && num_rq_list > 0 && rq_list[0])) | ||
2446 | + if (!(entity && rq_list && (num_rq_list == 0 || rq_list[0]))) | ||
2447 | return -EINVAL; | ||
2448 | |||
2449 | memset(entity, 0, sizeof(struct drm_sched_entity)); | ||
2450 | INIT_LIST_HEAD(&entity->list); | ||
2451 | - entity->rq = rq_list[0]; | ||
2452 | + entity->rq = NULL; | ||
2453 | entity->guilty = guilty; | ||
2454 | entity->num_rq_list = num_rq_list; | ||
2455 | entity->rq_list = kcalloc(num_rq_list, sizeof(struct drm_sched_rq *), | ||
2456 | @@ -67,6 +67,10 @@ int drm_sched_entity_init(struct drm_sched_entity *entity, | ||
2457 | |||
2458 | for (i = 0; i < num_rq_list; ++i) | ||
2459 | entity->rq_list[i] = rq_list[i]; | ||
2460 | + | ||
2461 | + if (num_rq_list) | ||
2462 | + entity->rq = rq_list[0]; | ||
2463 | + | ||
2464 | entity->last_scheduled = NULL; | ||
2465 | |||
2466 | spin_lock_init(&entity->rq_lock); | ||
2467 | @@ -165,6 +169,9 @@ long drm_sched_entity_flush(struct drm_sched_entity *entity, long timeout) | ||
2468 | struct task_struct *last_user; | ||
2469 | long ret = timeout; | ||
2470 | |||
2471 | + if (!entity->rq) | ||
2472 | + return 0; | ||
2473 | + | ||
2474 | sched = entity->rq->sched; | ||
2475 | /** | ||
2476 | * The client will not queue more IBs during this fini, consume existing | ||
2477 | @@ -264,20 +271,24 @@ static void drm_sched_entity_kill_jobs(struct drm_sched_entity *entity) | ||
2478 | */ | ||
2479 | void drm_sched_entity_fini(struct drm_sched_entity *entity) | ||
2480 | { | ||
2481 | - struct drm_gpu_scheduler *sched; | ||
2482 | + struct drm_gpu_scheduler *sched = NULL; | ||
2483 | |||
2484 | - sched = entity->rq->sched; | ||
2485 | - drm_sched_rq_remove_entity(entity->rq, entity); | ||
2486 | + if (entity->rq) { | ||
2487 | + sched = entity->rq->sched; | ||
2488 | + drm_sched_rq_remove_entity(entity->rq, entity); | ||
2489 | + } | ||
2490 | |||
2491 | /* Consumption of existing IBs wasn't completed. Forcefully | ||
2492 | * remove them here. | ||
2493 | */ | ||
2494 | if (spsc_queue_peek(&entity->job_queue)) { | ||
2495 | - /* Park the kernel for a moment to make sure it isn't processing | ||
2496 | - * our enity. | ||
2497 | - */ | ||
2498 | - kthread_park(sched->thread); | ||
2499 | - kthread_unpark(sched->thread); | ||
2500 | + if (sched) { | ||
2501 | + /* Park the kernel for a moment to make sure it isn't processing | ||
2502 | + * our enity. | ||
2503 | + */ | ||
2504 | + kthread_park(sched->thread); | ||
2505 | + kthread_unpark(sched->thread); | ||
2506 | + } | ||
2507 | if (entity->dependency) { | ||
2508 | dma_fence_remove_callback(entity->dependency, | ||
2509 | &entity->cb); | ||
2510 | @@ -362,9 +373,11 @@ void drm_sched_entity_set_priority(struct drm_sched_entity *entity, | ||
2511 | for (i = 0; i < entity->num_rq_list; ++i) | ||
2512 | drm_sched_entity_set_rq_priority(&entity->rq_list[i], priority); | ||
2513 | |||
2514 | - drm_sched_rq_remove_entity(entity->rq, entity); | ||
2515 | - drm_sched_entity_set_rq_priority(&entity->rq, priority); | ||
2516 | - drm_sched_rq_add_entity(entity->rq, entity); | ||
2517 | + if (entity->rq) { | ||
2518 | + drm_sched_rq_remove_entity(entity->rq, entity); | ||
2519 | + drm_sched_entity_set_rq_priority(&entity->rq, priority); | ||
2520 | + drm_sched_rq_add_entity(entity->rq, entity); | ||
2521 | + } | ||
2522 | |||
2523 | spin_unlock(&entity->rq_lock); | ||
2524 | } | ||
2525 | diff --git a/drivers/gpu/drm/vkms/vkms_crtc.c b/drivers/gpu/drm/vkms/vkms_crtc.c | ||
2526 | index e747a7d16739..1054f535178a 100644 | ||
2527 | --- a/drivers/gpu/drm/vkms/vkms_crtc.c | ||
2528 | +++ b/drivers/gpu/drm/vkms/vkms_crtc.c | ||
2529 | @@ -4,13 +4,17 @@ | ||
2530 | #include <drm/drm_atomic_helper.h> | ||
2531 | #include <drm/drm_crtc_helper.h> | ||
2532 | |||
2533 | -static void _vblank_handle(struct vkms_output *output) | ||
2534 | +static enum hrtimer_restart vkms_vblank_simulate(struct hrtimer *timer) | ||
2535 | { | ||
2536 | + struct vkms_output *output = container_of(timer, struct vkms_output, | ||
2537 | + vblank_hrtimer); | ||
2538 | struct drm_crtc *crtc = &output->crtc; | ||
2539 | struct vkms_crtc_state *state = to_vkms_crtc_state(crtc->state); | ||
2540 | + int ret_overrun; | ||
2541 | bool ret; | ||
2542 | |||
2543 | spin_lock(&output->lock); | ||
2544 | + | ||
2545 | ret = drm_crtc_handle_vblank(crtc); | ||
2546 | if (!ret) | ||
2547 | DRM_ERROR("vkms failure on handling vblank"); | ||
2548 | @@ -31,19 +35,9 @@ static void _vblank_handle(struct vkms_output *output) | ||
2549 | DRM_WARN("failed to queue vkms_crc_work_handle"); | ||
2550 | } | ||
2551 | |||
2552 | - spin_unlock(&output->lock); | ||
2553 | -} | ||
2554 | - | ||
2555 | -static enum hrtimer_restart vkms_vblank_simulate(struct hrtimer *timer) | ||
2556 | -{ | ||
2557 | - struct vkms_output *output = container_of(timer, struct vkms_output, | ||
2558 | - vblank_hrtimer); | ||
2559 | - int ret_overrun; | ||
2560 | - | ||
2561 | - _vblank_handle(output); | ||
2562 | - | ||
2563 | ret_overrun = hrtimer_forward_now(&output->vblank_hrtimer, | ||
2564 | output->period_ns); | ||
2565 | + spin_unlock(&output->lock); | ||
2566 | |||
2567 | return HRTIMER_RESTART; | ||
2568 | } | ||
2569 | @@ -81,6 +75,9 @@ bool vkms_get_vblank_timestamp(struct drm_device *dev, unsigned int pipe, | ||
2570 | |||
2571 | *vblank_time = output->vblank_hrtimer.node.expires; | ||
2572 | |||
2573 | + if (!in_vblank_irq) | ||
2574 | + *vblank_time -= output->period_ns; | ||
2575 | + | ||
2576 | return true; | ||
2577 | } | ||
2578 | |||
2579 | diff --git a/drivers/hid/intel-ish-hid/ipc/ipc.c b/drivers/hid/intel-ish-hid/ipc/ipc.c | ||
2580 | index 742191bb24c6..45e33c7ba9a6 100644 | ||
2581 | --- a/drivers/hid/intel-ish-hid/ipc/ipc.c | ||
2582 | +++ b/drivers/hid/intel-ish-hid/ipc/ipc.c | ||
2583 | @@ -91,7 +91,10 @@ static bool check_generated_interrupt(struct ishtp_device *dev) | ||
2584 | IPC_INT_FROM_ISH_TO_HOST_CHV_AB(pisr_val); | ||
2585 | } else { | ||
2586 | pisr_val = ish_reg_read(dev, IPC_REG_PISR_BXT); | ||
2587 | - interrupt_generated = IPC_INT_FROM_ISH_TO_HOST_BXT(pisr_val); | ||
2588 | + interrupt_generated = !!pisr_val; | ||
2589 | + /* only busy-clear bit is RW, others are RO */ | ||
2590 | + if (pisr_val) | ||
2591 | + ish_reg_write(dev, IPC_REG_PISR_BXT, pisr_val); | ||
2592 | } | ||
2593 | |||
2594 | return interrupt_generated; | ||
2595 | @@ -839,11 +842,11 @@ int ish_hw_start(struct ishtp_device *dev) | ||
2596 | { | ||
2597 | ish_set_host_rdy(dev); | ||
2598 | |||
2599 | + set_host_ready(dev); | ||
2600 | + | ||
2601 | /* After that we can enable ISH DMA operation and wakeup ISHFW */ | ||
2602 | ish_wakeup(dev); | ||
2603 | |||
2604 | - set_host_ready(dev); | ||
2605 | - | ||
2606 | /* wait for FW-initiated reset flow */ | ||
2607 | if (!dev->recvd_hw_ready) | ||
2608 | wait_event_interruptible_timeout(dev->wait_hw_ready, | ||
2609 | diff --git a/drivers/hid/intel-ish-hid/ishtp/bus.c b/drivers/hid/intel-ish-hid/ishtp/bus.c | ||
2610 | index 728dc6d4561a..a271d6d169b1 100644 | ||
2611 | --- a/drivers/hid/intel-ish-hid/ishtp/bus.c | ||
2612 | +++ b/drivers/hid/intel-ish-hid/ishtp/bus.c | ||
2613 | @@ -675,7 +675,8 @@ int ishtp_cl_device_bind(struct ishtp_cl *cl) | ||
2614 | spin_lock_irqsave(&cl->dev->device_list_lock, flags); | ||
2615 | list_for_each_entry(cl_device, &cl->dev->device_list, | ||
2616 | device_link) { | ||
2617 | - if (cl_device->fw_client->client_id == cl->fw_client_id) { | ||
2618 | + if (cl_device->fw_client && | ||
2619 | + cl_device->fw_client->client_id == cl->fw_client_id) { | ||
2620 | cl->device = cl_device; | ||
2621 | rv = 0; | ||
2622 | break; | ||
2623 | @@ -735,6 +736,7 @@ void ishtp_bus_remove_all_clients(struct ishtp_device *ishtp_dev, | ||
2624 | spin_lock_irqsave(&ishtp_dev->device_list_lock, flags); | ||
2625 | list_for_each_entry_safe(cl_device, n, &ishtp_dev->device_list, | ||
2626 | device_link) { | ||
2627 | + cl_device->fw_client = NULL; | ||
2628 | if (warm_reset && cl_device->reference_count) | ||
2629 | continue; | ||
2630 | |||
2631 | diff --git a/drivers/hwtracing/coresight/coresight-etm-perf.c b/drivers/hwtracing/coresight/coresight-etm-perf.c | ||
2632 | index abe8249b893b..f21eb28b6782 100644 | ||
2633 | --- a/drivers/hwtracing/coresight/coresight-etm-perf.c | ||
2634 | +++ b/drivers/hwtracing/coresight/coresight-etm-perf.c | ||
2635 | @@ -177,15 +177,15 @@ static void etm_free_aux(void *data) | ||
2636 | schedule_work(&event_data->work); | ||
2637 | } | ||
2638 | |||
2639 | -static void *etm_setup_aux(int event_cpu, void **pages, | ||
2640 | +static void *etm_setup_aux(struct perf_event *event, void **pages, | ||
2641 | int nr_pages, bool overwrite) | ||
2642 | { | ||
2643 | - int cpu; | ||
2644 | + int cpu = event->cpu; | ||
2645 | cpumask_t *mask; | ||
2646 | struct coresight_device *sink; | ||
2647 | struct etm_event_data *event_data = NULL; | ||
2648 | |||
2649 | - event_data = alloc_event_data(event_cpu); | ||
2650 | + event_data = alloc_event_data(cpu); | ||
2651 | if (!event_data) | ||
2652 | return NULL; | ||
2653 | INIT_WORK(&event_data->work, free_event_data); | ||
2654 | diff --git a/drivers/hwtracing/coresight/coresight-etm4x.c b/drivers/hwtracing/coresight/coresight-etm4x.c | ||
2655 | index 53e2fb6e86f6..fe76b176974a 100644 | ||
2656 | --- a/drivers/hwtracing/coresight/coresight-etm4x.c | ||
2657 | +++ b/drivers/hwtracing/coresight/coresight-etm4x.c | ||
2658 | @@ -55,7 +55,8 @@ static void etm4_os_unlock(struct etmv4_drvdata *drvdata) | ||
2659 | |||
2660 | static bool etm4_arch_supported(u8 arch) | ||
2661 | { | ||
2662 | - switch (arch) { | ||
2663 | + /* Mask out the minor version number */ | ||
2664 | + switch (arch & 0xf0) { | ||
2665 | case ETM_ARCH_V4: | ||
2666 | break; | ||
2667 | default: | ||
2668 | diff --git a/drivers/i2c/busses/i2c-designware-core.h b/drivers/i2c/busses/i2c-designware-core.h | ||
2669 | index b4a0b2b99a78..6b4ef1d38fb2 100644 | ||
2670 | --- a/drivers/i2c/busses/i2c-designware-core.h | ||
2671 | +++ b/drivers/i2c/busses/i2c-designware-core.h | ||
2672 | @@ -215,6 +215,7 @@ | ||
2673 | * @disable_int: function to disable all interrupts | ||
2674 | * @init: function to initialize the I2C hardware | ||
2675 | * @mode: operation mode - DW_IC_MASTER or DW_IC_SLAVE | ||
2676 | + * @suspended: set to true if the controller is suspended | ||
2677 | * | ||
2678 | * HCNT and LCNT parameters can be used if the platform knows more accurate | ||
2679 | * values than the one computed based only on the input clock frequency. | ||
2680 | @@ -270,6 +271,7 @@ struct dw_i2c_dev { | ||
2681 | int (*set_sda_hold_time)(struct dw_i2c_dev *dev); | ||
2682 | int mode; | ||
2683 | struct i2c_bus_recovery_info rinfo; | ||
2684 | + bool suspended; | ||
2685 | }; | ||
2686 | |||
2687 | #define ACCESS_SWAP 0x00000001 | ||
2688 | diff --git a/drivers/i2c/busses/i2c-designware-master.c b/drivers/i2c/busses/i2c-designware-master.c | ||
2689 | index 8d1bc44d2530..bb8e3f149979 100644 | ||
2690 | --- a/drivers/i2c/busses/i2c-designware-master.c | ||
2691 | +++ b/drivers/i2c/busses/i2c-designware-master.c | ||
2692 | @@ -426,6 +426,12 @@ i2c_dw_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num) | ||
2693 | |||
2694 | pm_runtime_get_sync(dev->dev); | ||
2695 | |||
2696 | + if (dev->suspended) { | ||
2697 | + dev_err(dev->dev, "Error %s call while suspended\n", __func__); | ||
2698 | + ret = -ESHUTDOWN; | ||
2699 | + goto done_nolock; | ||
2700 | + } | ||
2701 | + | ||
2702 | reinit_completion(&dev->cmd_complete); | ||
2703 | dev->msgs = msgs; | ||
2704 | dev->msgs_num = num; | ||
2705 | diff --git a/drivers/i2c/busses/i2c-designware-pcidrv.c b/drivers/i2c/busses/i2c-designware-pcidrv.c | ||
2706 | index d50f80487214..76810deb2de6 100644 | ||
2707 | --- a/drivers/i2c/busses/i2c-designware-pcidrv.c | ||
2708 | +++ b/drivers/i2c/busses/i2c-designware-pcidrv.c | ||
2709 | @@ -176,6 +176,7 @@ static int i2c_dw_pci_suspend(struct device *dev) | ||
2710 | struct pci_dev *pdev = to_pci_dev(dev); | ||
2711 | struct dw_i2c_dev *i_dev = pci_get_drvdata(pdev); | ||
2712 | |||
2713 | + i_dev->suspended = true; | ||
2714 | i_dev->disable(i_dev); | ||
2715 | |||
2716 | return 0; | ||
2717 | @@ -185,8 +186,12 @@ static int i2c_dw_pci_resume(struct device *dev) | ||
2718 | { | ||
2719 | struct pci_dev *pdev = to_pci_dev(dev); | ||
2720 | struct dw_i2c_dev *i_dev = pci_get_drvdata(pdev); | ||
2721 | + int ret; | ||
2722 | |||
2723 | - return i_dev->init(i_dev); | ||
2724 | + ret = i_dev->init(i_dev); | ||
2725 | + i_dev->suspended = false; | ||
2726 | + | ||
2727 | + return ret; | ||
2728 | } | ||
2729 | #endif | ||
2730 | |||
2731 | diff --git a/drivers/i2c/busses/i2c-designware-platdrv.c b/drivers/i2c/busses/i2c-designware-platdrv.c | ||
2732 | index 9eaac3be1f63..ead5e7de3e4d 100644 | ||
2733 | --- a/drivers/i2c/busses/i2c-designware-platdrv.c | ||
2734 | +++ b/drivers/i2c/busses/i2c-designware-platdrv.c | ||
2735 | @@ -454,6 +454,8 @@ static int dw_i2c_plat_suspend(struct device *dev) | ||
2736 | { | ||
2737 | struct dw_i2c_dev *i_dev = dev_get_drvdata(dev); | ||
2738 | |||
2739 | + i_dev->suspended = true; | ||
2740 | + | ||
2741 | if (i_dev->shared_with_punit) | ||
2742 | return 0; | ||
2743 | |||
2744 | @@ -471,6 +473,7 @@ static int dw_i2c_plat_resume(struct device *dev) | ||
2745 | i2c_dw_prepare_clk(i_dev, true); | ||
2746 | |||
2747 | i_dev->init(i_dev); | ||
2748 | + i_dev->suspended = false; | ||
2749 | |||
2750 | return 0; | ||
2751 | } | ||
2752 | diff --git a/drivers/i2c/i2c-core-base.c b/drivers/i2c/i2c-core-base.c | ||
2753 | index 28460f6a60cc..af87a16ac3a5 100644 | ||
2754 | --- a/drivers/i2c/i2c-core-base.c | ||
2755 | +++ b/drivers/i2c/i2c-core-base.c | ||
2756 | @@ -430,7 +430,7 @@ static int i2c_device_remove(struct device *dev) | ||
2757 | dev_pm_clear_wake_irq(&client->dev); | ||
2758 | device_init_wakeup(&client->dev, false); | ||
2759 | |||
2760 | - client->irq = 0; | ||
2761 | + client->irq = client->init_irq; | ||
2762 | |||
2763 | return status; | ||
2764 | } | ||
2765 | @@ -741,10 +741,11 @@ i2c_new_device(struct i2c_adapter *adap, struct i2c_board_info const *info) | ||
2766 | client->flags = info->flags; | ||
2767 | client->addr = info->addr; | ||
2768 | |||
2769 | - client->irq = info->irq; | ||
2770 | - if (!client->irq) | ||
2771 | - client->irq = i2c_dev_irq_from_resources(info->resources, | ||
2772 | + client->init_irq = info->irq; | ||
2773 | + if (!client->init_irq) | ||
2774 | + client->init_irq = i2c_dev_irq_from_resources(info->resources, | ||
2775 | info->num_resources); | ||
2776 | + client->irq = client->init_irq; | ||
2777 | |||
2778 | strlcpy(client->name, info->type, sizeof(client->name)); | ||
2779 | |||
2780 | diff --git a/drivers/i2c/i2c-core-of.c b/drivers/i2c/i2c-core-of.c | ||
2781 | index 6cb7ad608bcd..0f01cdba9d2c 100644 | ||
2782 | --- a/drivers/i2c/i2c-core-of.c | ||
2783 | +++ b/drivers/i2c/i2c-core-of.c | ||
2784 | @@ -121,6 +121,17 @@ static int of_dev_node_match(struct device *dev, void *data) | ||
2785 | return dev->of_node == data; | ||
2786 | } | ||
2787 | |||
2788 | +static int of_dev_or_parent_node_match(struct device *dev, void *data) | ||
2789 | +{ | ||
2790 | + if (dev->of_node == data) | ||
2791 | + return 1; | ||
2792 | + | ||
2793 | + if (dev->parent) | ||
2794 | + return dev->parent->of_node == data; | ||
2795 | + | ||
2796 | + return 0; | ||
2797 | +} | ||
2798 | + | ||
2799 | /* must call put_device() when done with returned i2c_client device */ | ||
2800 | struct i2c_client *of_find_i2c_device_by_node(struct device_node *node) | ||
2801 | { | ||
2802 | @@ -145,7 +156,8 @@ struct i2c_adapter *of_find_i2c_adapter_by_node(struct device_node *node) | ||
2803 | struct device *dev; | ||
2804 | struct i2c_adapter *adapter; | ||
2805 | |||
2806 | - dev = bus_find_device(&i2c_bus_type, NULL, node, of_dev_node_match); | ||
2807 | + dev = bus_find_device(&i2c_bus_type, NULL, node, | ||
2808 | + of_dev_or_parent_node_match); | ||
2809 | if (!dev) | ||
2810 | return NULL; | ||
2811 | |||
2812 | diff --git a/drivers/iio/adc/qcom-pm8xxx-xoadc.c b/drivers/iio/adc/qcom-pm8xxx-xoadc.c | ||
2813 | index c30c002f1fef..4735f8a1ca9d 100644 | ||
2814 | --- a/drivers/iio/adc/qcom-pm8xxx-xoadc.c | ||
2815 | +++ b/drivers/iio/adc/qcom-pm8xxx-xoadc.c | ||
2816 | @@ -423,18 +423,14 @@ static irqreturn_t pm8xxx_eoc_irq(int irq, void *d) | ||
2817 | static struct pm8xxx_chan_info * | ||
2818 | pm8xxx_get_channel(struct pm8xxx_xoadc *adc, u8 chan) | ||
2819 | { | ||
2820 | - struct pm8xxx_chan_info *ch; | ||
2821 | int i; | ||
2822 | |||
2823 | for (i = 0; i < adc->nchans; i++) { | ||
2824 | - ch = &adc->chans[i]; | ||
2825 | + struct pm8xxx_chan_info *ch = &adc->chans[i]; | ||
2826 | if (ch->hwchan->amux_channel == chan) | ||
2827 | - break; | ||
2828 | + return ch; | ||
2829 | } | ||
2830 | - if (i == adc->nchans) | ||
2831 | - return NULL; | ||
2832 | - | ||
2833 | - return ch; | ||
2834 | + return NULL; | ||
2835 | } | ||
2836 | |||
2837 | static int pm8xxx_read_channel_rsv(struct pm8xxx_xoadc *adc, | ||
2838 | diff --git a/drivers/infiniband/hw/cxgb4/cm.c b/drivers/infiniband/hw/cxgb4/cm.c | ||
2839 | index 8221813219e5..25a81fbb0d4d 100644 | ||
2840 | --- a/drivers/infiniband/hw/cxgb4/cm.c | ||
2841 | +++ b/drivers/infiniband/hw/cxgb4/cm.c | ||
2842 | @@ -1903,8 +1903,10 @@ static int abort_rpl(struct c4iw_dev *dev, struct sk_buff *skb) | ||
2843 | } | ||
2844 | mutex_unlock(&ep->com.mutex); | ||
2845 | |||
2846 | - if (release) | ||
2847 | + if (release) { | ||
2848 | + close_complete_upcall(ep, -ECONNRESET); | ||
2849 | release_ep_resources(ep); | ||
2850 | + } | ||
2851 | c4iw_put_ep(&ep->com); | ||
2852 | return 0; | ||
2853 | } | ||
2854 | @@ -3606,7 +3608,6 @@ int c4iw_ep_disconnect(struct c4iw_ep *ep, int abrupt, gfp_t gfp) | ||
2855 | if (close) { | ||
2856 | if (abrupt) { | ||
2857 | set_bit(EP_DISC_ABORT, &ep->com.history); | ||
2858 | - close_complete_upcall(ep, -ECONNRESET); | ||
2859 | ret = send_abort(ep); | ||
2860 | } else { | ||
2861 | set_bit(EP_DISC_CLOSE, &ep->com.history); | ||
2862 | diff --git a/drivers/infiniband/hw/mlx4/cm.c b/drivers/infiniband/hw/mlx4/cm.c | ||
2863 | index fedaf8260105..8c79a480f2b7 100644 | ||
2864 | --- a/drivers/infiniband/hw/mlx4/cm.c | ||
2865 | +++ b/drivers/infiniband/hw/mlx4/cm.c | ||
2866 | @@ -39,7 +39,7 @@ | ||
2867 | |||
2868 | #include "mlx4_ib.h" | ||
2869 | |||
2870 | -#define CM_CLEANUP_CACHE_TIMEOUT (5 * HZ) | ||
2871 | +#define CM_CLEANUP_CACHE_TIMEOUT (30 * HZ) | ||
2872 | |||
2873 | struct id_map_entry { | ||
2874 | struct rb_node node; | ||
2875 | diff --git a/drivers/input/misc/soc_button_array.c b/drivers/input/misc/soc_button_array.c | ||
2876 | index 23520df7650f..55cd6e0b409c 100644 | ||
2877 | --- a/drivers/input/misc/soc_button_array.c | ||
2878 | +++ b/drivers/input/misc/soc_button_array.c | ||
2879 | @@ -373,7 +373,7 @@ static struct soc_button_info soc_button_PNP0C40[] = { | ||
2880 | { "home", 1, EV_KEY, KEY_LEFTMETA, false, true }, | ||
2881 | { "volume_up", 2, EV_KEY, KEY_VOLUMEUP, true, false }, | ||
2882 | { "volume_down", 3, EV_KEY, KEY_VOLUMEDOWN, true, false }, | ||
2883 | - { "rotation_lock", 4, EV_SW, SW_ROTATE_LOCK, false, false }, | ||
2884 | + { "rotation_lock", 4, EV_KEY, KEY_ROTATE_LOCK_TOGGLE, false, false }, | ||
2885 | { } | ||
2886 | }; | ||
2887 | |||
2888 | diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c | ||
2889 | index 78188bf7e90d..dbd6824dfffa 100644 | ||
2890 | --- a/drivers/iommu/intel-iommu.c | ||
2891 | +++ b/drivers/iommu/intel-iommu.c | ||
2892 | @@ -2485,7 +2485,8 @@ static struct dmar_domain *dmar_insert_one_dev_info(struct intel_iommu *iommu, | ||
2893 | if (dev && dev_is_pci(dev)) { | ||
2894 | struct pci_dev *pdev = to_pci_dev(info->dev); | ||
2895 | |||
2896 | - if (!pci_ats_disabled() && | ||
2897 | + if (!pdev->untrusted && | ||
2898 | + !pci_ats_disabled() && | ||
2899 | ecap_dev_iotlb_support(iommu->ecap) && | ||
2900 | pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_ATS) && | ||
2901 | dmar_find_matched_atsr_unit(pdev)) | ||
2902 | diff --git a/drivers/iommu/io-pgtable-arm-v7s.c b/drivers/iommu/io-pgtable-arm-v7s.c | ||
2903 | index 1b9e40a203e0..18a8330e1882 100644 | ||
2904 | --- a/drivers/iommu/io-pgtable-arm-v7s.c | ||
2905 | +++ b/drivers/iommu/io-pgtable-arm-v7s.c | ||
2906 | @@ -228,7 +228,8 @@ static void *__arm_v7s_alloc_table(int lvl, gfp_t gfp, | ||
2907 | if (dma != phys) | ||
2908 | goto out_unmap; | ||
2909 | } | ||
2910 | - kmemleak_ignore(table); | ||
2911 | + if (lvl == 2) | ||
2912 | + kmemleak_ignore(table); | ||
2913 | return table; | ||
2914 | |||
2915 | out_unmap: | ||
2916 | diff --git a/drivers/leds/leds-lp55xx-common.c b/drivers/leds/leds-lp55xx-common.c | ||
2917 | index 3d79a6380761..723f2f17497a 100644 | ||
2918 | --- a/drivers/leds/leds-lp55xx-common.c | ||
2919 | +++ b/drivers/leds/leds-lp55xx-common.c | ||
2920 | @@ -201,7 +201,7 @@ static void lp55xx_firmware_loaded(const struct firmware *fw, void *context) | ||
2921 | |||
2922 | if (!fw) { | ||
2923 | dev_err(dev, "firmware request failed\n"); | ||
2924 | - goto out; | ||
2925 | + return; | ||
2926 | } | ||
2927 | |||
2928 | /* handling firmware data is chip dependent */ | ||
2929 | @@ -214,9 +214,9 @@ static void lp55xx_firmware_loaded(const struct firmware *fw, void *context) | ||
2930 | |||
2931 | mutex_unlock(&chip->lock); | ||
2932 | |||
2933 | -out: | ||
2934 | /* firmware should be released for other channel use */ | ||
2935 | release_firmware(chip->fw); | ||
2936 | + chip->fw = NULL; | ||
2937 | } | ||
2938 | |||
2939 | static int lp55xx_request_firmware(struct lp55xx_chip *chip) | ||
2940 | diff --git a/drivers/md/bcache/sysfs.c b/drivers/md/bcache/sysfs.c | ||
2941 | index 557a8a3270a1..e5daf91310f6 100644 | ||
2942 | --- a/drivers/md/bcache/sysfs.c | ||
2943 | +++ b/drivers/md/bcache/sysfs.c | ||
2944 | @@ -287,8 +287,12 @@ STORE(__cached_dev) | ||
2945 | sysfs_strtoul_clamp(writeback_rate_update_seconds, | ||
2946 | dc->writeback_rate_update_seconds, | ||
2947 | 1, WRITEBACK_RATE_UPDATE_SECS_MAX); | ||
2948 | - d_strtoul(writeback_rate_i_term_inverse); | ||
2949 | - d_strtoul_nonzero(writeback_rate_p_term_inverse); | ||
2950 | + sysfs_strtoul_clamp(writeback_rate_i_term_inverse, | ||
2951 | + dc->writeback_rate_i_term_inverse, | ||
2952 | + 1, UINT_MAX); | ||
2953 | + sysfs_strtoul_clamp(writeback_rate_p_term_inverse, | ||
2954 | + dc->writeback_rate_p_term_inverse, | ||
2955 | + 1, UINT_MAX); | ||
2956 | d_strtoul_nonzero(writeback_rate_minimum); | ||
2957 | |||
2958 | sysfs_strtoul_clamp(io_error_limit, dc->error_limit, 0, INT_MAX); | ||
2959 | @@ -299,7 +303,9 @@ STORE(__cached_dev) | ||
2960 | dc->io_disable = v ? 1 : 0; | ||
2961 | } | ||
2962 | |||
2963 | - d_strtoi_h(sequential_cutoff); | ||
2964 | + sysfs_strtoul_clamp(sequential_cutoff, | ||
2965 | + dc->sequential_cutoff, | ||
2966 | + 0, UINT_MAX); | ||
2967 | d_strtoi_h(readahead); | ||
2968 | |||
2969 | if (attr == &sysfs_clear_stats) | ||
2970 | @@ -778,8 +784,17 @@ STORE(__bch_cache_set) | ||
2971 | c->error_limit = strtoul_or_return(buf); | ||
2972 | |||
2973 | /* See count_io_errors() for why 88 */ | ||
2974 | - if (attr == &sysfs_io_error_halflife) | ||
2975 | - c->error_decay = strtoul_or_return(buf) / 88; | ||
2976 | + if (attr == &sysfs_io_error_halflife) { | ||
2977 | + unsigned long v = 0; | ||
2978 | + ssize_t ret; | ||
2979 | + | ||
2980 | + ret = strtoul_safe_clamp(buf, v, 0, UINT_MAX); | ||
2981 | + if (!ret) { | ||
2982 | + c->error_decay = v / 88; | ||
2983 | + return size; | ||
2984 | + } | ||
2985 | + return ret; | ||
2986 | + } | ||
2987 | |||
2988 | if (attr == &sysfs_io_disable) { | ||
2989 | v = strtoul_or_return(buf); | ||
2990 | diff --git a/drivers/md/bcache/sysfs.h b/drivers/md/bcache/sysfs.h | ||
2991 | index 3fe82425859c..0ad2715a884e 100644 | ||
2992 | --- a/drivers/md/bcache/sysfs.h | ||
2993 | +++ b/drivers/md/bcache/sysfs.h | ||
2994 | @@ -81,9 +81,16 @@ do { \ | ||
2995 | |||
2996 | #define sysfs_strtoul_clamp(file, var, min, max) \ | ||
2997 | do { \ | ||
2998 | - if (attr == &sysfs_ ## file) \ | ||
2999 | - return strtoul_safe_clamp(buf, var, min, max) \ | ||
3000 | - ?: (ssize_t) size; \ | ||
3001 | + if (attr == &sysfs_ ## file) { \ | ||
3002 | + unsigned long v = 0; \ | ||
3003 | + ssize_t ret; \ | ||
3004 | + ret = strtoul_safe_clamp(buf, v, min, max); \ | ||
3005 | + if (!ret) { \ | ||
3006 | + var = v; \ | ||
3007 | + return size; \ | ||
3008 | + } \ | ||
3009 | + return ret; \ | ||
3010 | + } \ | ||
3011 | } while (0) | ||
3012 | |||
3013 | #define strtoul_or_return(cp) \ | ||
3014 | diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c | ||
3015 | index e83b63608262..254c26eb963a 100644 | ||
3016 | --- a/drivers/md/dm-thin.c | ||
3017 | +++ b/drivers/md/dm-thin.c | ||
3018 | @@ -3283,6 +3283,13 @@ static int pool_ctr(struct dm_target *ti, unsigned argc, char **argv) | ||
3019 | as.argc = argc; | ||
3020 | as.argv = argv; | ||
3021 | |||
3022 | + /* make sure metadata and data are different devices */ | ||
3023 | + if (!strcmp(argv[0], argv[1])) { | ||
3024 | + ti->error = "Error setting metadata or data device"; | ||
3025 | + r = -EINVAL; | ||
3026 | + goto out_unlock; | ||
3027 | + } | ||
3028 | + | ||
3029 | /* | ||
3030 | * Set default pool features. | ||
3031 | */ | ||
3032 | @@ -4167,6 +4174,12 @@ static int thin_ctr(struct dm_target *ti, unsigned argc, char **argv) | ||
3033 | tc->sort_bio_list = RB_ROOT; | ||
3034 | |||
3035 | if (argc == 3) { | ||
3036 | + if (!strcmp(argv[0], argv[2])) { | ||
3037 | + ti->error = "Error setting origin device"; | ||
3038 | + r = -EINVAL; | ||
3039 | + goto bad_origin_dev; | ||
3040 | + } | ||
3041 | + | ||
3042 | r = dm_get_device(ti, argv[2], FMODE_READ, &origin_dev); | ||
3043 | if (r) { | ||
3044 | ti->error = "Error opening origin device"; | ||
3045 | diff --git a/drivers/media/i2c/mt9m111.c b/drivers/media/i2c/mt9m111.c | ||
3046 | index d639b9bcf64a..7a759b4b88cf 100644 | ||
3047 | --- a/drivers/media/i2c/mt9m111.c | ||
3048 | +++ b/drivers/media/i2c/mt9m111.c | ||
3049 | @@ -1273,6 +1273,8 @@ static int mt9m111_probe(struct i2c_client *client, | ||
3050 | mt9m111->rect.top = MT9M111_MIN_DARK_ROWS; | ||
3051 | mt9m111->rect.width = MT9M111_MAX_WIDTH; | ||
3052 | mt9m111->rect.height = MT9M111_MAX_HEIGHT; | ||
3053 | + mt9m111->width = mt9m111->rect.width; | ||
3054 | + mt9m111->height = mt9m111->rect.height; | ||
3055 | mt9m111->fmt = &mt9m111_colour_fmts[0]; | ||
3056 | mt9m111->lastpage = -1; | ||
3057 | mutex_init(&mt9m111->power_lock); | ||
3058 | diff --git a/drivers/media/i2c/ov7740.c b/drivers/media/i2c/ov7740.c | ||
3059 | index 177688afd9a6..8835b831cdc0 100644 | ||
3060 | --- a/drivers/media/i2c/ov7740.c | ||
3061 | +++ b/drivers/media/i2c/ov7740.c | ||
3062 | @@ -1101,6 +1101,9 @@ static int ov7740_probe(struct i2c_client *client, | ||
3063 | if (ret) | ||
3064 | return ret; | ||
3065 | |||
3066 | + pm_runtime_set_active(&client->dev); | ||
3067 | + pm_runtime_enable(&client->dev); | ||
3068 | + | ||
3069 | ret = ov7740_detect(ov7740); | ||
3070 | if (ret) | ||
3071 | goto error_detect; | ||
3072 | @@ -1123,8 +1126,6 @@ static int ov7740_probe(struct i2c_client *client, | ||
3073 | if (ret) | ||
3074 | goto error_async_register; | ||
3075 | |||
3076 | - pm_runtime_set_active(&client->dev); | ||
3077 | - pm_runtime_enable(&client->dev); | ||
3078 | pm_runtime_idle(&client->dev); | ||
3079 | |||
3080 | return 0; | ||
3081 | @@ -1134,6 +1135,8 @@ error_async_register: | ||
3082 | error_init_controls: | ||
3083 | ov7740_free_controls(ov7740); | ||
3084 | error_detect: | ||
3085 | + pm_runtime_disable(&client->dev); | ||
3086 | + pm_runtime_set_suspended(&client->dev); | ||
3087 | ov7740_set_power(ov7740, 0); | ||
3088 | media_entity_cleanup(&ov7740->subdev.entity); | ||
3089 | |||
3090 | diff --git a/drivers/media/platform/mtk-jpeg/mtk_jpeg_core.c b/drivers/media/platform/mtk-jpeg/mtk_jpeg_core.c | ||
3091 | index 2a5d5002c27e..f761e4d8bf2a 100644 | ||
3092 | --- a/drivers/media/platform/mtk-jpeg/mtk_jpeg_core.c | ||
3093 | +++ b/drivers/media/platform/mtk-jpeg/mtk_jpeg_core.c | ||
3094 | @@ -702,7 +702,7 @@ end: | ||
3095 | v4l2_m2m_buf_queue(ctx->fh.m2m_ctx, to_vb2_v4l2_buffer(vb)); | ||
3096 | } | ||
3097 | |||
3098 | -static void *mtk_jpeg_buf_remove(struct mtk_jpeg_ctx *ctx, | ||
3099 | +static struct vb2_v4l2_buffer *mtk_jpeg_buf_remove(struct mtk_jpeg_ctx *ctx, | ||
3100 | enum v4l2_buf_type type) | ||
3101 | { | ||
3102 | if (V4L2_TYPE_IS_OUTPUT(type)) | ||
3103 | @@ -714,7 +714,7 @@ static void *mtk_jpeg_buf_remove(struct mtk_jpeg_ctx *ctx, | ||
3104 | static int mtk_jpeg_start_streaming(struct vb2_queue *q, unsigned int count) | ||
3105 | { | ||
3106 | struct mtk_jpeg_ctx *ctx = vb2_get_drv_priv(q); | ||
3107 | - struct vb2_buffer *vb; | ||
3108 | + struct vb2_v4l2_buffer *vb; | ||
3109 | int ret = 0; | ||
3110 | |||
3111 | ret = pm_runtime_get_sync(ctx->jpeg->dev); | ||
3112 | @@ -724,14 +724,14 @@ static int mtk_jpeg_start_streaming(struct vb2_queue *q, unsigned int count) | ||
3113 | return 0; | ||
3114 | err: | ||
3115 | while ((vb = mtk_jpeg_buf_remove(ctx, q->type))) | ||
3116 | - v4l2_m2m_buf_done(to_vb2_v4l2_buffer(vb), VB2_BUF_STATE_QUEUED); | ||
3117 | + v4l2_m2m_buf_done(vb, VB2_BUF_STATE_QUEUED); | ||
3118 | return ret; | ||
3119 | } | ||
3120 | |||
3121 | static void mtk_jpeg_stop_streaming(struct vb2_queue *q) | ||
3122 | { | ||
3123 | struct mtk_jpeg_ctx *ctx = vb2_get_drv_priv(q); | ||
3124 | - struct vb2_buffer *vb; | ||
3125 | + struct vb2_v4l2_buffer *vb; | ||
3126 | |||
3127 | /* | ||
3128 | * STREAMOFF is an acknowledgment for source change event. | ||
3129 | @@ -743,7 +743,7 @@ static void mtk_jpeg_stop_streaming(struct vb2_queue *q) | ||
3130 | struct mtk_jpeg_src_buf *src_buf; | ||
3131 | |||
3132 | vb = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx); | ||
3133 | - src_buf = mtk_jpeg_vb2_to_srcbuf(vb); | ||
3134 | + src_buf = mtk_jpeg_vb2_to_srcbuf(&vb->vb2_buf); | ||
3135 | mtk_jpeg_set_queue_data(ctx, &src_buf->dec_param); | ||
3136 | ctx->state = MTK_JPEG_RUNNING; | ||
3137 | } else if (V4L2_TYPE_IS_OUTPUT(q->type)) { | ||
3138 | @@ -751,7 +751,7 @@ static void mtk_jpeg_stop_streaming(struct vb2_queue *q) | ||
3139 | } | ||
3140 | |||
3141 | while ((vb = mtk_jpeg_buf_remove(ctx, q->type))) | ||
3142 | - v4l2_m2m_buf_done(to_vb2_v4l2_buffer(vb), VB2_BUF_STATE_ERROR); | ||
3143 | + v4l2_m2m_buf_done(vb, VB2_BUF_STATE_ERROR); | ||
3144 | |||
3145 | pm_runtime_put_sync(ctx->jpeg->dev); | ||
3146 | } | ||
3147 | @@ -807,7 +807,7 @@ static void mtk_jpeg_device_run(void *priv) | ||
3148 | { | ||
3149 | struct mtk_jpeg_ctx *ctx = priv; | ||
3150 | struct mtk_jpeg_dev *jpeg = ctx->jpeg; | ||
3151 | - struct vb2_buffer *src_buf, *dst_buf; | ||
3152 | + struct vb2_v4l2_buffer *src_buf, *dst_buf; | ||
3153 | enum vb2_buffer_state buf_state = VB2_BUF_STATE_ERROR; | ||
3154 | unsigned long flags; | ||
3155 | struct mtk_jpeg_src_buf *jpeg_src_buf; | ||
3156 | @@ -817,11 +817,11 @@ static void mtk_jpeg_device_run(void *priv) | ||
3157 | |||
3158 | src_buf = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx); | ||
3159 | dst_buf = v4l2_m2m_next_dst_buf(ctx->fh.m2m_ctx); | ||
3160 | - jpeg_src_buf = mtk_jpeg_vb2_to_srcbuf(src_buf); | ||
3161 | + jpeg_src_buf = mtk_jpeg_vb2_to_srcbuf(&src_buf->vb2_buf); | ||
3162 | |||
3163 | if (jpeg_src_buf->flags & MTK_JPEG_BUF_FLAGS_LAST_FRAME) { | ||
3164 | - for (i = 0; i < dst_buf->num_planes; i++) | ||
3165 | - vb2_set_plane_payload(dst_buf, i, 0); | ||
3166 | + for (i = 0; i < dst_buf->vb2_buf.num_planes; i++) | ||
3167 | + vb2_set_plane_payload(&dst_buf->vb2_buf, i, 0); | ||
3168 | buf_state = VB2_BUF_STATE_DONE; | ||
3169 | goto dec_end; | ||
3170 | } | ||
3171 | @@ -833,8 +833,8 @@ static void mtk_jpeg_device_run(void *priv) | ||
3172 | return; | ||
3173 | } | ||
3174 | |||
3175 | - mtk_jpeg_set_dec_src(ctx, src_buf, &bs); | ||
3176 | - if (mtk_jpeg_set_dec_dst(ctx, &jpeg_src_buf->dec_param, dst_buf, &fb)) | ||
3177 | + mtk_jpeg_set_dec_src(ctx, &src_buf->vb2_buf, &bs); | ||
3178 | + if (mtk_jpeg_set_dec_dst(ctx, &jpeg_src_buf->dec_param, &dst_buf->vb2_buf, &fb)) | ||
3179 | goto dec_end; | ||
3180 | |||
3181 | spin_lock_irqsave(&jpeg->hw_lock, flags); | ||
3182 | @@ -849,8 +849,8 @@ static void mtk_jpeg_device_run(void *priv) | ||
3183 | dec_end: | ||
3184 | v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx); | ||
3185 | v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx); | ||
3186 | - v4l2_m2m_buf_done(to_vb2_v4l2_buffer(src_buf), buf_state); | ||
3187 | - v4l2_m2m_buf_done(to_vb2_v4l2_buffer(dst_buf), buf_state); | ||
3188 | + v4l2_m2m_buf_done(src_buf, buf_state); | ||
3189 | + v4l2_m2m_buf_done(dst_buf, buf_state); | ||
3190 | v4l2_m2m_job_finish(jpeg->m2m_dev, ctx->fh.m2m_ctx); | ||
3191 | } | ||
3192 | |||
3193 | @@ -921,7 +921,7 @@ static irqreturn_t mtk_jpeg_dec_irq(int irq, void *priv) | ||
3194 | { | ||
3195 | struct mtk_jpeg_dev *jpeg = priv; | ||
3196 | struct mtk_jpeg_ctx *ctx; | ||
3197 | - struct vb2_buffer *src_buf, *dst_buf; | ||
3198 | + struct vb2_v4l2_buffer *src_buf, *dst_buf; | ||
3199 | struct mtk_jpeg_src_buf *jpeg_src_buf; | ||
3200 | enum vb2_buffer_state buf_state = VB2_BUF_STATE_ERROR; | ||
3201 | u32 dec_irq_ret; | ||
3202 | @@ -938,7 +938,7 @@ static irqreturn_t mtk_jpeg_dec_irq(int irq, void *priv) | ||
3203 | |||
3204 | src_buf = v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx); | ||
3205 | dst_buf = v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx); | ||
3206 | - jpeg_src_buf = mtk_jpeg_vb2_to_srcbuf(src_buf); | ||
3207 | + jpeg_src_buf = mtk_jpeg_vb2_to_srcbuf(&src_buf->vb2_buf); | ||
3208 | |||
3209 | if (dec_irq_ret >= MTK_JPEG_DEC_RESULT_UNDERFLOW) | ||
3210 | mtk_jpeg_dec_reset(jpeg->dec_reg_base); | ||
3211 | @@ -948,15 +948,15 @@ static irqreturn_t mtk_jpeg_dec_irq(int irq, void *priv) | ||
3212 | goto dec_end; | ||
3213 | } | ||
3214 | |||
3215 | - for (i = 0; i < dst_buf->num_planes; i++) | ||
3216 | - vb2_set_plane_payload(dst_buf, i, | ||
3217 | + for (i = 0; i < dst_buf->vb2_buf.num_planes; i++) | ||
3218 | + vb2_set_plane_payload(&dst_buf->vb2_buf, i, | ||
3219 | jpeg_src_buf->dec_param.comp_size[i]); | ||
3220 | |||
3221 | buf_state = VB2_BUF_STATE_DONE; | ||
3222 | |||
3223 | dec_end: | ||
3224 | - v4l2_m2m_buf_done(to_vb2_v4l2_buffer(src_buf), buf_state); | ||
3225 | - v4l2_m2m_buf_done(to_vb2_v4l2_buffer(dst_buf), buf_state); | ||
3226 | + v4l2_m2m_buf_done(src_buf, buf_state); | ||
3227 | + v4l2_m2m_buf_done(dst_buf, buf_state); | ||
3228 | v4l2_m2m_job_finish(jpeg->m2m_dev, ctx->fh.m2m_ctx); | ||
3229 | return IRQ_HANDLED; | ||
3230 | } | ||
3231 | diff --git a/drivers/media/platform/mx2_emmaprp.c b/drivers/media/platform/mx2_emmaprp.c | ||
3232 | index 27b078cf98e3..f60f499c596b 100644 | ||
3233 | --- a/drivers/media/platform/mx2_emmaprp.c | ||
3234 | +++ b/drivers/media/platform/mx2_emmaprp.c | ||
3235 | @@ -274,7 +274,7 @@ static void emmaprp_device_run(void *priv) | ||
3236 | { | ||
3237 | struct emmaprp_ctx *ctx = priv; | ||
3238 | struct emmaprp_q_data *s_q_data, *d_q_data; | ||
3239 | - struct vb2_buffer *src_buf, *dst_buf; | ||
3240 | + struct vb2_v4l2_buffer *src_buf, *dst_buf; | ||
3241 | struct emmaprp_dev *pcdev = ctx->dev; | ||
3242 | unsigned int s_width, s_height; | ||
3243 | unsigned int d_width, d_height; | ||
3244 | @@ -294,8 +294,8 @@ static void emmaprp_device_run(void *priv) | ||
3245 | d_height = d_q_data->height; | ||
3246 | d_size = d_width * d_height; | ||
3247 | |||
3248 | - p_in = vb2_dma_contig_plane_dma_addr(src_buf, 0); | ||
3249 | - p_out = vb2_dma_contig_plane_dma_addr(dst_buf, 0); | ||
3250 | + p_in = vb2_dma_contig_plane_dma_addr(&src_buf->vb2_buf, 0); | ||
3251 | + p_out = vb2_dma_contig_plane_dma_addr(&dst_buf->vb2_buf, 0); | ||
3252 | if (!p_in || !p_out) { | ||
3253 | v4l2_err(&pcdev->v4l2_dev, | ||
3254 | "Acquiring kernel pointers to buffers failed\n"); | ||
3255 | diff --git a/drivers/media/platform/rcar-vin/rcar-core.c b/drivers/media/platform/rcar-vin/rcar-core.c | ||
3256 | index f0719ce24b97..aef8d8dab6ab 100644 | ||
3257 | --- a/drivers/media/platform/rcar-vin/rcar-core.c | ||
3258 | +++ b/drivers/media/platform/rcar-vin/rcar-core.c | ||
3259 | @@ -131,9 +131,13 @@ static int rvin_group_link_notify(struct media_link *link, u32 flags, | ||
3260 | !is_media_entity_v4l2_video_device(link->sink->entity)) | ||
3261 | return 0; | ||
3262 | |||
3263 | - /* If any entity is in use don't allow link changes. */ | ||
3264 | + /* | ||
3265 | + * Don't allow link changes if any entity in the graph is | ||
3266 | + * streaming, modifying the CHSEL register fields can disrupt | ||
3267 | + * running streams. | ||
3268 | + */ | ||
3269 | media_device_for_each_entity(entity, &group->mdev) | ||
3270 | - if (entity->use_count) | ||
3271 | + if (entity->stream_count) | ||
3272 | return -EBUSY; | ||
3273 | |||
3274 | mutex_lock(&group->lock); | ||
3275 | diff --git a/drivers/media/platform/rockchip/rga/rga.c b/drivers/media/platform/rockchip/rga/rga.c | ||
3276 | index 5c653287185f..b096227a9722 100644 | ||
3277 | --- a/drivers/media/platform/rockchip/rga/rga.c | ||
3278 | +++ b/drivers/media/platform/rockchip/rga/rga.c | ||
3279 | @@ -43,7 +43,7 @@ static void device_run(void *prv) | ||
3280 | { | ||
3281 | struct rga_ctx *ctx = prv; | ||
3282 | struct rockchip_rga *rga = ctx->rga; | ||
3283 | - struct vb2_buffer *src, *dst; | ||
3284 | + struct vb2_v4l2_buffer *src, *dst; | ||
3285 | unsigned long flags; | ||
3286 | |||
3287 | spin_lock_irqsave(&rga->ctrl_lock, flags); | ||
3288 | @@ -53,8 +53,8 @@ static void device_run(void *prv) | ||
3289 | src = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx); | ||
3290 | dst = v4l2_m2m_next_dst_buf(ctx->fh.m2m_ctx); | ||
3291 | |||
3292 | - rga_buf_map(src); | ||
3293 | - rga_buf_map(dst); | ||
3294 | + rga_buf_map(&src->vb2_buf); | ||
3295 | + rga_buf_map(&dst->vb2_buf); | ||
3296 | |||
3297 | rga_hw_start(rga); | ||
3298 | |||
3299 | diff --git a/drivers/media/platform/s5p-g2d/g2d.c b/drivers/media/platform/s5p-g2d/g2d.c | ||
3300 | index 57ab1d1085d1..971c47165010 100644 | ||
3301 | --- a/drivers/media/platform/s5p-g2d/g2d.c | ||
3302 | +++ b/drivers/media/platform/s5p-g2d/g2d.c | ||
3303 | @@ -513,7 +513,7 @@ static void device_run(void *prv) | ||
3304 | { | ||
3305 | struct g2d_ctx *ctx = prv; | ||
3306 | struct g2d_dev *dev = ctx->dev; | ||
3307 | - struct vb2_buffer *src, *dst; | ||
3308 | + struct vb2_v4l2_buffer *src, *dst; | ||
3309 | unsigned long flags; | ||
3310 | u32 cmd = 0; | ||
3311 | |||
3312 | @@ -528,10 +528,10 @@ static void device_run(void *prv) | ||
3313 | spin_lock_irqsave(&dev->ctrl_lock, flags); | ||
3314 | |||
3315 | g2d_set_src_size(dev, &ctx->in); | ||
3316 | - g2d_set_src_addr(dev, vb2_dma_contig_plane_dma_addr(src, 0)); | ||
3317 | + g2d_set_src_addr(dev, vb2_dma_contig_plane_dma_addr(&src->vb2_buf, 0)); | ||
3318 | |||
3319 | g2d_set_dst_size(dev, &ctx->out); | ||
3320 | - g2d_set_dst_addr(dev, vb2_dma_contig_plane_dma_addr(dst, 0)); | ||
3321 | + g2d_set_dst_addr(dev, vb2_dma_contig_plane_dma_addr(&dst->vb2_buf, 0)); | ||
3322 | |||
3323 | g2d_set_rop4(dev, ctx->rop); | ||
3324 | g2d_set_flip(dev, ctx->flip); | ||
3325 | diff --git a/drivers/media/platform/s5p-jpeg/jpeg-core.c b/drivers/media/platform/s5p-jpeg/jpeg-core.c | ||
3326 | index 3f9000b70385..370942b67d86 100644 | ||
3327 | --- a/drivers/media/platform/s5p-jpeg/jpeg-core.c | ||
3328 | +++ b/drivers/media/platform/s5p-jpeg/jpeg-core.c | ||
3329 | @@ -793,14 +793,14 @@ static void skip(struct s5p_jpeg_buffer *buf, long len); | ||
3330 | static void exynos4_jpeg_parse_decode_h_tbl(struct s5p_jpeg_ctx *ctx) | ||
3331 | { | ||
3332 | struct s5p_jpeg *jpeg = ctx->jpeg; | ||
3333 | - struct vb2_buffer *vb = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx); | ||
3334 | + struct vb2_v4l2_buffer *vb = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx); | ||
3335 | struct s5p_jpeg_buffer jpeg_buffer; | ||
3336 | unsigned int word; | ||
3337 | int c, x, components; | ||
3338 | |||
3339 | jpeg_buffer.size = 2; /* Ls */ | ||
3340 | jpeg_buffer.data = | ||
3341 | - (unsigned long)vb2_plane_vaddr(vb, 0) + ctx->out_q.sos + 2; | ||
3342 | + (unsigned long)vb2_plane_vaddr(&vb->vb2_buf, 0) + ctx->out_q.sos + 2; | ||
3343 | jpeg_buffer.curr = 0; | ||
3344 | |||
3345 | word = 0; | ||
3346 | @@ -830,14 +830,14 @@ static void exynos4_jpeg_parse_decode_h_tbl(struct s5p_jpeg_ctx *ctx) | ||
3347 | static void exynos4_jpeg_parse_huff_tbl(struct s5p_jpeg_ctx *ctx) | ||
3348 | { | ||
3349 | struct s5p_jpeg *jpeg = ctx->jpeg; | ||
3350 | - struct vb2_buffer *vb = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx); | ||
3351 | + struct vb2_v4l2_buffer *vb = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx); | ||
3352 | struct s5p_jpeg_buffer jpeg_buffer; | ||
3353 | unsigned int word; | ||
3354 | int c, i, n, j; | ||
3355 | |||
3356 | for (j = 0; j < ctx->out_q.dht.n; ++j) { | ||
3357 | jpeg_buffer.size = ctx->out_q.dht.len[j]; | ||
3358 | - jpeg_buffer.data = (unsigned long)vb2_plane_vaddr(vb, 0) + | ||
3359 | + jpeg_buffer.data = (unsigned long)vb2_plane_vaddr(&vb->vb2_buf, 0) + | ||
3360 | ctx->out_q.dht.marker[j]; | ||
3361 | jpeg_buffer.curr = 0; | ||
3362 | |||
3363 | @@ -889,13 +889,13 @@ static void exynos4_jpeg_parse_huff_tbl(struct s5p_jpeg_ctx *ctx) | ||
3364 | static void exynos4_jpeg_parse_decode_q_tbl(struct s5p_jpeg_ctx *ctx) | ||
3365 | { | ||
3366 | struct s5p_jpeg *jpeg = ctx->jpeg; | ||
3367 | - struct vb2_buffer *vb = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx); | ||
3368 | + struct vb2_v4l2_buffer *vb = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx); | ||
3369 | struct s5p_jpeg_buffer jpeg_buffer; | ||
3370 | int c, x, components; | ||
3371 | |||
3372 | jpeg_buffer.size = ctx->out_q.sof_len; | ||
3373 | jpeg_buffer.data = | ||
3374 | - (unsigned long)vb2_plane_vaddr(vb, 0) + ctx->out_q.sof; | ||
3375 | + (unsigned long)vb2_plane_vaddr(&vb->vb2_buf, 0) + ctx->out_q.sof; | ||
3376 | jpeg_buffer.curr = 0; | ||
3377 | |||
3378 | skip(&jpeg_buffer, 5); /* P, Y, X */ | ||
3379 | @@ -920,14 +920,14 @@ static void exynos4_jpeg_parse_decode_q_tbl(struct s5p_jpeg_ctx *ctx) | ||
3380 | static void exynos4_jpeg_parse_q_tbl(struct s5p_jpeg_ctx *ctx) | ||
3381 | { | ||
3382 | struct s5p_jpeg *jpeg = ctx->jpeg; | ||
3383 | - struct vb2_buffer *vb = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx); | ||
3384 | + struct vb2_v4l2_buffer *vb = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx); | ||
3385 | struct s5p_jpeg_buffer jpeg_buffer; | ||
3386 | unsigned int word; | ||
3387 | int c, i, j; | ||
3388 | |||
3389 | for (j = 0; j < ctx->out_q.dqt.n; ++j) { | ||
3390 | jpeg_buffer.size = ctx->out_q.dqt.len[j]; | ||
3391 | - jpeg_buffer.data = (unsigned long)vb2_plane_vaddr(vb, 0) + | ||
3392 | + jpeg_buffer.data = (unsigned long)vb2_plane_vaddr(&vb->vb2_buf, 0) + | ||
3393 | ctx->out_q.dqt.marker[j]; | ||
3394 | jpeg_buffer.curr = 0; | ||
3395 | |||
3396 | @@ -1293,13 +1293,16 @@ static int s5p_jpeg_querycap(struct file *file, void *priv, | ||
3397 | return 0; | ||
3398 | } | ||
3399 | |||
3400 | -static int enum_fmt(struct s5p_jpeg_fmt *sjpeg_formats, int n, | ||
3401 | +static int enum_fmt(struct s5p_jpeg_ctx *ctx, | ||
3402 | + struct s5p_jpeg_fmt *sjpeg_formats, int n, | ||
3403 | struct v4l2_fmtdesc *f, u32 type) | ||
3404 | { | ||
3405 | int i, num = 0; | ||
3406 | + unsigned int fmt_ver_flag = ctx->jpeg->variant->fmt_ver_flag; | ||
3407 | |||
3408 | for (i = 0; i < n; ++i) { | ||
3409 | - if (sjpeg_formats[i].flags & type) { | ||
3410 | + if (sjpeg_formats[i].flags & type && | ||
3411 | + sjpeg_formats[i].flags & fmt_ver_flag) { | ||
3412 | /* index-th format of type type found ? */ | ||
3413 | if (num == f->index) | ||
3414 | break; | ||
3415 | @@ -1326,11 +1329,11 @@ static int s5p_jpeg_enum_fmt_vid_cap(struct file *file, void *priv, | ||
3416 | struct s5p_jpeg_ctx *ctx = fh_to_ctx(priv); | ||
3417 | |||
3418 | if (ctx->mode == S5P_JPEG_ENCODE) | ||
3419 | - return enum_fmt(sjpeg_formats, SJPEG_NUM_FORMATS, f, | ||
3420 | + return enum_fmt(ctx, sjpeg_formats, SJPEG_NUM_FORMATS, f, | ||
3421 | SJPEG_FMT_FLAG_ENC_CAPTURE); | ||
3422 | |||
3423 | - return enum_fmt(sjpeg_formats, SJPEG_NUM_FORMATS, f, | ||
3424 | - SJPEG_FMT_FLAG_DEC_CAPTURE); | ||
3425 | + return enum_fmt(ctx, sjpeg_formats, SJPEG_NUM_FORMATS, f, | ||
3426 | + SJPEG_FMT_FLAG_DEC_CAPTURE); | ||
3427 | } | ||
3428 | |||
3429 | static int s5p_jpeg_enum_fmt_vid_out(struct file *file, void *priv, | ||
3430 | @@ -1339,11 +1342,11 @@ static int s5p_jpeg_enum_fmt_vid_out(struct file *file, void *priv, | ||
3431 | struct s5p_jpeg_ctx *ctx = fh_to_ctx(priv); | ||
3432 | |||
3433 | if (ctx->mode == S5P_JPEG_ENCODE) | ||
3434 | - return enum_fmt(sjpeg_formats, SJPEG_NUM_FORMATS, f, | ||
3435 | + return enum_fmt(ctx, sjpeg_formats, SJPEG_NUM_FORMATS, f, | ||
3436 | SJPEG_FMT_FLAG_ENC_OUTPUT); | ||
3437 | |||
3438 | - return enum_fmt(sjpeg_formats, SJPEG_NUM_FORMATS, f, | ||
3439 | - SJPEG_FMT_FLAG_DEC_OUTPUT); | ||
3440 | + return enum_fmt(ctx, sjpeg_formats, SJPEG_NUM_FORMATS, f, | ||
3441 | + SJPEG_FMT_FLAG_DEC_OUTPUT); | ||
3442 | } | ||
3443 | |||
3444 | static struct s5p_jpeg_q_data *get_q_data(struct s5p_jpeg_ctx *ctx, | ||
3445 | @@ -2072,15 +2075,15 @@ static void s5p_jpeg_device_run(void *priv) | ||
3446 | { | ||
3447 | struct s5p_jpeg_ctx *ctx = priv; | ||
3448 | struct s5p_jpeg *jpeg = ctx->jpeg; | ||
3449 | - struct vb2_buffer *src_buf, *dst_buf; | ||
3450 | + struct vb2_v4l2_buffer *src_buf, *dst_buf; | ||
3451 | unsigned long src_addr, dst_addr, flags; | ||
3452 | |||
3453 | spin_lock_irqsave(&ctx->jpeg->slock, flags); | ||
3454 | |||
3455 | src_buf = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx); | ||
3456 | dst_buf = v4l2_m2m_next_dst_buf(ctx->fh.m2m_ctx); | ||
3457 | - src_addr = vb2_dma_contig_plane_dma_addr(src_buf, 0); | ||
3458 | - dst_addr = vb2_dma_contig_plane_dma_addr(dst_buf, 0); | ||
3459 | + src_addr = vb2_dma_contig_plane_dma_addr(&src_buf->vb2_buf, 0); | ||
3460 | + dst_addr = vb2_dma_contig_plane_dma_addr(&dst_buf->vb2_buf, 0); | ||
3461 | |||
3462 | s5p_jpeg_reset(jpeg->regs); | ||
3463 | s5p_jpeg_poweron(jpeg->regs); | ||
3464 | @@ -2153,7 +2156,7 @@ static void exynos4_jpeg_set_img_addr(struct s5p_jpeg_ctx *ctx) | ||
3465 | { | ||
3466 | struct s5p_jpeg *jpeg = ctx->jpeg; | ||
3467 | struct s5p_jpeg_fmt *fmt; | ||
3468 | - struct vb2_buffer *vb; | ||
3469 | + struct vb2_v4l2_buffer *vb; | ||
3470 | struct s5p_jpeg_addr jpeg_addr = {}; | ||
3471 | u32 pix_size, padding_bytes = 0; | ||
3472 | |||
3473 | @@ -2172,7 +2175,7 @@ static void exynos4_jpeg_set_img_addr(struct s5p_jpeg_ctx *ctx) | ||
3474 | vb = v4l2_m2m_next_dst_buf(ctx->fh.m2m_ctx); | ||
3475 | } | ||
3476 | |||
3477 | - jpeg_addr.y = vb2_dma_contig_plane_dma_addr(vb, 0); | ||
3478 | + jpeg_addr.y = vb2_dma_contig_plane_dma_addr(&vb->vb2_buf, 0); | ||
3479 | |||
3480 | if (fmt->colplanes == 2) { | ||
3481 | jpeg_addr.cb = jpeg_addr.y + pix_size - padding_bytes; | ||
3482 | @@ -2190,7 +2193,7 @@ static void exynos4_jpeg_set_img_addr(struct s5p_jpeg_ctx *ctx) | ||
3483 | static void exynos4_jpeg_set_jpeg_addr(struct s5p_jpeg_ctx *ctx) | ||
3484 | { | ||
3485 | struct s5p_jpeg *jpeg = ctx->jpeg; | ||
3486 | - struct vb2_buffer *vb; | ||
3487 | + struct vb2_v4l2_buffer *vb; | ||
3488 | unsigned int jpeg_addr = 0; | ||
3489 | |||
3490 | if (ctx->mode == S5P_JPEG_ENCODE) | ||
3491 | @@ -2198,7 +2201,7 @@ static void exynos4_jpeg_set_jpeg_addr(struct s5p_jpeg_ctx *ctx) | ||
3492 | else | ||
3493 | vb = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx); | ||
3494 | |||
3495 | - jpeg_addr = vb2_dma_contig_plane_dma_addr(vb, 0); | ||
3496 | + jpeg_addr = vb2_dma_contig_plane_dma_addr(&vb->vb2_buf, 0); | ||
3497 | if (jpeg->variant->version == SJPEG_EXYNOS5433 && | ||
3498 | ctx->mode == S5P_JPEG_DECODE) | ||
3499 | jpeg_addr += ctx->out_q.sos; | ||
3500 | @@ -2314,7 +2317,7 @@ static void exynos3250_jpeg_set_img_addr(struct s5p_jpeg_ctx *ctx) | ||
3501 | { | ||
3502 | struct s5p_jpeg *jpeg = ctx->jpeg; | ||
3503 | struct s5p_jpeg_fmt *fmt; | ||
3504 | - struct vb2_buffer *vb; | ||
3505 | + struct vb2_v4l2_buffer *vb; | ||
3506 | struct s5p_jpeg_addr jpeg_addr = {}; | ||
3507 | u32 pix_size; | ||
3508 | |||
3509 | @@ -2328,7 +2331,7 @@ static void exynos3250_jpeg_set_img_addr(struct s5p_jpeg_ctx *ctx) | ||
3510 | fmt = ctx->cap_q.fmt; | ||
3511 | } | ||
3512 | |||
3513 | - jpeg_addr.y = vb2_dma_contig_plane_dma_addr(vb, 0); | ||
3514 | + jpeg_addr.y = vb2_dma_contig_plane_dma_addr(&vb->vb2_buf, 0); | ||
3515 | |||
3516 | if (fmt->colplanes == 2) { | ||
3517 | jpeg_addr.cb = jpeg_addr.y + pix_size; | ||
3518 | @@ -2346,7 +2349,7 @@ static void exynos3250_jpeg_set_img_addr(struct s5p_jpeg_ctx *ctx) | ||
3519 | static void exynos3250_jpeg_set_jpeg_addr(struct s5p_jpeg_ctx *ctx) | ||
3520 | { | ||
3521 | struct s5p_jpeg *jpeg = ctx->jpeg; | ||
3522 | - struct vb2_buffer *vb; | ||
3523 | + struct vb2_v4l2_buffer *vb; | ||
3524 | unsigned int jpeg_addr = 0; | ||
3525 | |||
3526 | if (ctx->mode == S5P_JPEG_ENCODE) | ||
3527 | @@ -2354,7 +2357,7 @@ static void exynos3250_jpeg_set_jpeg_addr(struct s5p_jpeg_ctx *ctx) | ||
3528 | else | ||
3529 | vb = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx); | ||
3530 | |||
3531 | - jpeg_addr = vb2_dma_contig_plane_dma_addr(vb, 0); | ||
3532 | + jpeg_addr = vb2_dma_contig_plane_dma_addr(&vb->vb2_buf, 0); | ||
3533 | exynos3250_jpeg_jpgadr(jpeg->regs, jpeg_addr); | ||
3534 | } | ||
3535 | |||
3536 | diff --git a/drivers/media/platform/sh_veu.c b/drivers/media/platform/sh_veu.c | ||
3537 | index 09ae64a0004c..d277cc674349 100644 | ||
3538 | --- a/drivers/media/platform/sh_veu.c | ||
3539 | +++ b/drivers/media/platform/sh_veu.c | ||
3540 | @@ -273,13 +273,13 @@ static void sh_veu_process(struct sh_veu_dev *veu, | ||
3541 | static void sh_veu_device_run(void *priv) | ||
3542 | { | ||
3543 | struct sh_veu_dev *veu = priv; | ||
3544 | - struct vb2_buffer *src_buf, *dst_buf; | ||
3545 | + struct vb2_v4l2_buffer *src_buf, *dst_buf; | ||
3546 | |||
3547 | src_buf = v4l2_m2m_next_src_buf(veu->m2m_ctx); | ||
3548 | dst_buf = v4l2_m2m_next_dst_buf(veu->m2m_ctx); | ||
3549 | |||
3550 | if (src_buf && dst_buf) | ||
3551 | - sh_veu_process(veu, src_buf, dst_buf); | ||
3552 | + sh_veu_process(veu, &src_buf->vb2_buf, &dst_buf->vb2_buf); | ||
3553 | } | ||
3554 | |||
3555 | /* ========== video ioctls ========== */ | ||
3556 | diff --git a/drivers/mmc/host/omap.c b/drivers/mmc/host/omap.c | ||
3557 | index c60a7625b1fa..b2873a2432b6 100644 | ||
3558 | --- a/drivers/mmc/host/omap.c | ||
3559 | +++ b/drivers/mmc/host/omap.c | ||
3560 | @@ -920,7 +920,7 @@ static inline void set_cmd_timeout(struct mmc_omap_host *host, struct mmc_reques | ||
3561 | reg &= ~(1 << 5); | ||
3562 | OMAP_MMC_WRITE(host, SDIO, reg); | ||
3563 | /* Set maximum timeout */ | ||
3564 | - OMAP_MMC_WRITE(host, CTO, 0xff); | ||
3565 | + OMAP_MMC_WRITE(host, CTO, 0xfd); | ||
3566 | } | ||
3567 | |||
3568 | static inline void set_data_timeout(struct mmc_omap_host *host, struct mmc_request *req) | ||
3569 | diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c | ||
3570 | index 4a0ec8e87c7a..6cba05a80892 100644 | ||
3571 | --- a/drivers/net/dsa/mv88e6xxx/chip.c | ||
3572 | +++ b/drivers/net/dsa/mv88e6xxx/chip.c | ||
3573 | @@ -442,12 +442,20 @@ out_mapping: | ||
3574 | |||
3575 | static int mv88e6xxx_g1_irq_setup(struct mv88e6xxx_chip *chip) | ||
3576 | { | ||
3577 | + static struct lock_class_key lock_key; | ||
3578 | + static struct lock_class_key request_key; | ||
3579 | int err; | ||
3580 | |||
3581 | err = mv88e6xxx_g1_irq_setup_common(chip); | ||
3582 | if (err) | ||
3583 | return err; | ||
3584 | |||
3585 | + /* These lock classes tells lockdep that global 1 irqs are in | ||
3586 | + * a different category than their parent GPIO, so it won't | ||
3587 | + * report false recursion. | ||
3588 | + */ | ||
3589 | + irq_set_lockdep_class(chip->irq, &lock_key, &request_key); | ||
3590 | + | ||
3591 | err = request_threaded_irq(chip->irq, NULL, | ||
3592 | mv88e6xxx_g1_irq_thread_fn, | ||
3593 | IRQF_ONESHOT | IRQF_SHARED, | ||
3594 | diff --git a/drivers/net/dsa/mv88e6xxx/port.c b/drivers/net/dsa/mv88e6xxx/port.c | ||
3595 | index 41eee62fed25..c44b2822e4dd 100644 | ||
3596 | --- a/drivers/net/dsa/mv88e6xxx/port.c | ||
3597 | +++ b/drivers/net/dsa/mv88e6xxx/port.c | ||
3598 | @@ -480,6 +480,8 @@ int mv88e6390_port_set_cmode(struct mv88e6xxx_chip *chip, int port, | ||
3599 | phy_interface_t mode) | ||
3600 | { | ||
3601 | switch (mode) { | ||
3602 | + case PHY_INTERFACE_MODE_NA: | ||
3603 | + return 0; | ||
3604 | case PHY_INTERFACE_MODE_XGMII: | ||
3605 | case PHY_INTERFACE_MODE_XAUI: | ||
3606 | case PHY_INTERFACE_MODE_RXAUI: | ||
3607 | diff --git a/drivers/net/ethernet/cisco/enic/enic_main.c b/drivers/net/ethernet/cisco/enic/enic_main.c | ||
3608 | index 9a7f70db20c7..733d9172425b 100644 | ||
3609 | --- a/drivers/net/ethernet/cisco/enic/enic_main.c | ||
3610 | +++ b/drivers/net/ethernet/cisco/enic/enic_main.c | ||
3611 | @@ -119,7 +119,7 @@ static void enic_init_affinity_hint(struct enic *enic) | ||
3612 | |||
3613 | for (i = 0; i < enic->intr_count; i++) { | ||
3614 | if (enic_is_err_intr(enic, i) || enic_is_notify_intr(enic, i) || | ||
3615 | - (enic->msix[i].affinity_mask && | ||
3616 | + (cpumask_available(enic->msix[i].affinity_mask) && | ||
3617 | !cpumask_empty(enic->msix[i].affinity_mask))) | ||
3618 | continue; | ||
3619 | if (zalloc_cpumask_var(&enic->msix[i].affinity_mask, | ||
3620 | @@ -148,7 +148,7 @@ static void enic_set_affinity_hint(struct enic *enic) | ||
3621 | for (i = 0; i < enic->intr_count; i++) { | ||
3622 | if (enic_is_err_intr(enic, i) || | ||
3623 | enic_is_notify_intr(enic, i) || | ||
3624 | - !enic->msix[i].affinity_mask || | ||
3625 | + !cpumask_available(enic->msix[i].affinity_mask) || | ||
3626 | cpumask_empty(enic->msix[i].affinity_mask)) | ||
3627 | continue; | ||
3628 | err = irq_set_affinity_hint(enic->msix_entry[i].vector, | ||
3629 | @@ -161,7 +161,7 @@ static void enic_set_affinity_hint(struct enic *enic) | ||
3630 | for (i = 0; i < enic->wq_count; i++) { | ||
3631 | int wq_intr = enic_msix_wq_intr(enic, i); | ||
3632 | |||
3633 | - if (enic->msix[wq_intr].affinity_mask && | ||
3634 | + if (cpumask_available(enic->msix[wq_intr].affinity_mask) && | ||
3635 | !cpumask_empty(enic->msix[wq_intr].affinity_mask)) | ||
3636 | netif_set_xps_queue(enic->netdev, | ||
3637 | enic->msix[wq_intr].affinity_mask, | ||
3638 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c | ||
3639 | index efb6c1a25171..3ea72e4d9dc4 100644 | ||
3640 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c | ||
3641 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c | ||
3642 | @@ -1094,10 +1094,10 @@ static int hclge_log_rocee_ovf_error(struct hclge_dev *hdev) | ||
3643 | return 0; | ||
3644 | } | ||
3645 | |||
3646 | -static int hclge_log_and_clear_rocee_ras_error(struct hclge_dev *hdev) | ||
3647 | +static enum hnae3_reset_type | ||
3648 | +hclge_log_and_clear_rocee_ras_error(struct hclge_dev *hdev) | ||
3649 | { | ||
3650 | - enum hnae3_reset_type reset_type = HNAE3_FUNC_RESET; | ||
3651 | - struct hnae3_ae_dev *ae_dev = hdev->ae_dev; | ||
3652 | + enum hnae3_reset_type reset_type = HNAE3_NONE_RESET; | ||
3653 | struct device *dev = &hdev->pdev->dev; | ||
3654 | struct hclge_desc desc[2]; | ||
3655 | unsigned int status; | ||
3656 | @@ -1110,17 +1110,20 @@ static int hclge_log_and_clear_rocee_ras_error(struct hclge_dev *hdev) | ||
3657 | if (ret) { | ||
3658 | dev_err(dev, "failed(%d) to query ROCEE RAS INT SRC\n", ret); | ||
3659 | /* reset everything for now */ | ||
3660 | - HCLGE_SET_DEFAULT_RESET_REQUEST(HNAE3_GLOBAL_RESET); | ||
3661 | - return ret; | ||
3662 | + return HNAE3_GLOBAL_RESET; | ||
3663 | } | ||
3664 | |||
3665 | status = le32_to_cpu(desc[0].data[0]); | ||
3666 | |||
3667 | - if (status & HCLGE_ROCEE_RERR_INT_MASK) | ||
3668 | + if (status & HCLGE_ROCEE_RERR_INT_MASK) { | ||
3669 | dev_warn(dev, "ROCEE RAS AXI rresp error\n"); | ||
3670 | + reset_type = HNAE3_FUNC_RESET; | ||
3671 | + } | ||
3672 | |||
3673 | - if (status & HCLGE_ROCEE_BERR_INT_MASK) | ||
3674 | + if (status & HCLGE_ROCEE_BERR_INT_MASK) { | ||
3675 | dev_warn(dev, "ROCEE RAS AXI bresp error\n"); | ||
3676 | + reset_type = HNAE3_FUNC_RESET; | ||
3677 | + } | ||
3678 | |||
3679 | if (status & HCLGE_ROCEE_ECC_INT_MASK) { | ||
3680 | dev_warn(dev, "ROCEE RAS 2bit ECC error\n"); | ||
3681 | @@ -1132,9 +1135,9 @@ static int hclge_log_and_clear_rocee_ras_error(struct hclge_dev *hdev) | ||
3682 | if (ret) { | ||
3683 | dev_err(dev, "failed(%d) to process ovf error\n", ret); | ||
3684 | /* reset everything for now */ | ||
3685 | - HCLGE_SET_DEFAULT_RESET_REQUEST(HNAE3_GLOBAL_RESET); | ||
3686 | - return ret; | ||
3687 | + return HNAE3_GLOBAL_RESET; | ||
3688 | } | ||
3689 | + reset_type = HNAE3_FUNC_RESET; | ||
3690 | } | ||
3691 | |||
3692 | /* clear error status */ | ||
3693 | @@ -1143,12 +1146,10 @@ static int hclge_log_and_clear_rocee_ras_error(struct hclge_dev *hdev) | ||
3694 | if (ret) { | ||
3695 | dev_err(dev, "failed(%d) to clear ROCEE RAS error\n", ret); | ||
3696 | /* reset everything for now */ | ||
3697 | - reset_type = HNAE3_GLOBAL_RESET; | ||
3698 | + return HNAE3_GLOBAL_RESET; | ||
3699 | } | ||
3700 | |||
3701 | - HCLGE_SET_DEFAULT_RESET_REQUEST(reset_type); | ||
3702 | - | ||
3703 | - return ret; | ||
3704 | + return reset_type; | ||
3705 | } | ||
3706 | |||
3707 | static int hclge_config_rocee_ras_interrupt(struct hclge_dev *hdev, bool en) | ||
3708 | @@ -1178,15 +1179,18 @@ static int hclge_config_rocee_ras_interrupt(struct hclge_dev *hdev, bool en) | ||
3709 | return ret; | ||
3710 | } | ||
3711 | |||
3712 | -static int hclge_handle_rocee_ras_error(struct hnae3_ae_dev *ae_dev) | ||
3713 | +static void hclge_handle_rocee_ras_error(struct hnae3_ae_dev *ae_dev) | ||
3714 | { | ||
3715 | + enum hnae3_reset_type reset_type = HNAE3_NONE_RESET; | ||
3716 | struct hclge_dev *hdev = ae_dev->priv; | ||
3717 | |||
3718 | if (test_bit(HCLGE_STATE_RST_HANDLING, &hdev->state) || | ||
3719 | hdev->pdev->revision < 0x21) | ||
3720 | - return HNAE3_NONE_RESET; | ||
3721 | + return; | ||
3722 | |||
3723 | - return hclge_log_and_clear_rocee_ras_error(hdev); | ||
3724 | + reset_type = hclge_log_and_clear_rocee_ras_error(hdev); | ||
3725 | + if (reset_type != HNAE3_NONE_RESET) | ||
3726 | + HCLGE_SET_DEFAULT_RESET_REQUEST(reset_type); | ||
3727 | } | ||
3728 | |||
3729 | static const struct hclge_hw_blk hw_blk[] = { | ||
3730 | diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c | ||
3731 | index 189f231075c2..7acc61e4f645 100644 | ||
3732 | --- a/drivers/net/ethernet/intel/e1000e/netdev.c | ||
3733 | +++ b/drivers/net/ethernet/intel/e1000e/netdev.c | ||
3734 | @@ -2106,7 +2106,7 @@ static int e1000_request_msix(struct e1000_adapter *adapter) | ||
3735 | if (strlen(netdev->name) < (IFNAMSIZ - 5)) | ||
3736 | snprintf(adapter->rx_ring->name, | ||
3737 | sizeof(adapter->rx_ring->name) - 1, | ||
3738 | - "%s-rx-0", netdev->name); | ||
3739 | + "%.14s-rx-0", netdev->name); | ||
3740 | else | ||
3741 | memcpy(adapter->rx_ring->name, netdev->name, IFNAMSIZ); | ||
3742 | err = request_irq(adapter->msix_entries[vector].vector, | ||
3743 | @@ -2122,7 +2122,7 @@ static int e1000_request_msix(struct e1000_adapter *adapter) | ||
3744 | if (strlen(netdev->name) < (IFNAMSIZ - 5)) | ||
3745 | snprintf(adapter->tx_ring->name, | ||
3746 | sizeof(adapter->tx_ring->name) - 1, | ||
3747 | - "%s-tx-0", netdev->name); | ||
3748 | + "%.14s-tx-0", netdev->name); | ||
3749 | else | ||
3750 | memcpy(adapter->tx_ring->name, netdev->name, IFNAMSIZ); | ||
3751 | err = request_irq(adapter->msix_entries[vector].vector, | ||
3752 | @@ -5309,8 +5309,13 @@ static void e1000_watchdog_task(struct work_struct *work) | ||
3753 | /* 8000ES2LAN requires a Rx packet buffer work-around | ||
3754 | * on link down event; reset the controller to flush | ||
3755 | * the Rx packet buffer. | ||
3756 | + * | ||
3757 | + * If the link is lost the controller stops DMA, but | ||
3758 | + * if there is queued Tx work it cannot be done. So | ||
3759 | + * reset the controller to flush the Tx packet buffers. | ||
3760 | */ | ||
3761 | - if (adapter->flags & FLAG_RX_NEEDS_RESTART) | ||
3762 | + if ((adapter->flags & FLAG_RX_NEEDS_RESTART) || | ||
3763 | + e1000_desc_unused(tx_ring) + 1 < tx_ring->count) | ||
3764 | adapter->flags |= FLAG_RESTART_NOW; | ||
3765 | else | ||
3766 | pm_schedule_suspend(netdev->dev.parent, | ||
3767 | @@ -5333,14 +5338,6 @@ link_up: | ||
3768 | adapter->gotc_old = adapter->stats.gotc; | ||
3769 | spin_unlock(&adapter->stats64_lock); | ||
3770 | |||
3771 | - /* If the link is lost the controller stops DMA, but | ||
3772 | - * if there is queued Tx work it cannot be done. So | ||
3773 | - * reset the controller to flush the Tx packet buffers. | ||
3774 | - */ | ||
3775 | - if (!netif_carrier_ok(netdev) && | ||
3776 | - (e1000_desc_unused(tx_ring) + 1 < tx_ring->count)) | ||
3777 | - adapter->flags |= FLAG_RESTART_NOW; | ||
3778 | - | ||
3779 | /* If reset is necessary, do it outside of interrupt context. */ | ||
3780 | if (adapter->flags & FLAG_RESTART_NOW) { | ||
3781 | schedule_work(&adapter->reset_task); | ||
3782 | @@ -7351,6 +7348,8 @@ static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | ||
3783 | |||
3784 | e1000_print_device_info(adapter); | ||
3785 | |||
3786 | + dev_pm_set_driver_flags(&pdev->dev, DPM_FLAG_NEVER_SKIP); | ||
3787 | + | ||
3788 | if (pci_dev_run_wake(pdev)) | ||
3789 | pm_runtime_put_noidle(&pdev->dev); | ||
3790 | |||
3791 | diff --git a/drivers/net/ethernet/intel/ice/ice_switch.c b/drivers/net/ethernet/intel/ice/ice_switch.c | ||
3792 | index 2e5693107fa4..8d602247eb44 100644 | ||
3793 | --- a/drivers/net/ethernet/intel/ice/ice_switch.c | ||
3794 | +++ b/drivers/net/ethernet/intel/ice/ice_switch.c | ||
3795 | @@ -1538,9 +1538,20 @@ ice_remove_rule_internal(struct ice_hw *hw, u8 recp_id, | ||
3796 | } else if (!list_elem->vsi_list_info) { | ||
3797 | status = ICE_ERR_DOES_NOT_EXIST; | ||
3798 | goto exit; | ||
3799 | + } else if (list_elem->vsi_list_info->ref_cnt > 1) { | ||
3800 | + /* a ref_cnt > 1 indicates that the vsi_list is being | ||
3801 | + * shared by multiple rules. Decrement the ref_cnt and | ||
3802 | + * remove this rule, but do not modify the list, as it | ||
3803 | + * is in-use by other rules. | ||
3804 | + */ | ||
3805 | + list_elem->vsi_list_info->ref_cnt--; | ||
3806 | + remove_rule = true; | ||
3807 | } else { | ||
3808 | - if (list_elem->vsi_list_info->ref_cnt > 1) | ||
3809 | - list_elem->vsi_list_info->ref_cnt--; | ||
3810 | + /* a ref_cnt of 1 indicates the vsi_list is only used | ||
3811 | + * by one rule. However, the original removal request is only | ||
3812 | + * for a single VSI. Update the vsi_list first, and only | ||
3813 | + * remove the rule if there are no further VSIs in this list. | ||
3814 | + */ | ||
3815 | vsi_handle = f_entry->fltr_info.vsi_handle; | ||
3816 | status = ice_rem_update_vsi_list(hw, vsi_handle, list_elem); | ||
3817 | if (status) | ||
3818 | diff --git a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c | ||
3819 | index 16066c2d5b3a..931beac3359d 100644 | ||
3820 | --- a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c | ||
3821 | +++ b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c | ||
3822 | @@ -1380,13 +1380,9 @@ static void mvpp2_port_reset(struct mvpp2_port *port) | ||
3823 | for (i = 0; i < ARRAY_SIZE(mvpp2_ethtool_regs); i++) | ||
3824 | mvpp2_read_count(port, &mvpp2_ethtool_regs[i]); | ||
3825 | |||
3826 | - val = readl(port->base + MVPP2_GMAC_CTRL_2_REG) & | ||
3827 | - ~MVPP2_GMAC_PORT_RESET_MASK; | ||
3828 | + val = readl(port->base + MVPP2_GMAC_CTRL_2_REG) | | ||
3829 | + MVPP2_GMAC_PORT_RESET_MASK; | ||
3830 | writel(val, port->base + MVPP2_GMAC_CTRL_2_REG); | ||
3831 | - | ||
3832 | - while (readl(port->base + MVPP2_GMAC_CTRL_2_REG) & | ||
3833 | - MVPP2_GMAC_PORT_RESET_MASK) | ||
3834 | - continue; | ||
3835 | } | ||
3836 | |||
3837 | /* Change maximum receive size of the port */ | ||
3838 | @@ -4543,12 +4539,15 @@ static void mvpp2_gmac_config(struct mvpp2_port *port, unsigned int mode, | ||
3839 | const struct phylink_link_state *state) | ||
3840 | { | ||
3841 | u32 an, ctrl0, ctrl2, ctrl4; | ||
3842 | + u32 old_ctrl2; | ||
3843 | |||
3844 | an = readl(port->base + MVPP2_GMAC_AUTONEG_CONFIG); | ||
3845 | ctrl0 = readl(port->base + MVPP2_GMAC_CTRL_0_REG); | ||
3846 | ctrl2 = readl(port->base + MVPP2_GMAC_CTRL_2_REG); | ||
3847 | ctrl4 = readl(port->base + MVPP22_GMAC_CTRL_4_REG); | ||
3848 | |||
3849 | + old_ctrl2 = ctrl2; | ||
3850 | + | ||
3851 | /* Force link down */ | ||
3852 | an &= ~MVPP2_GMAC_FORCE_LINK_PASS; | ||
3853 | an |= MVPP2_GMAC_FORCE_LINK_DOWN; | ||
3854 | @@ -4621,6 +4620,12 @@ static void mvpp2_gmac_config(struct mvpp2_port *port, unsigned int mode, | ||
3855 | writel(ctrl2, port->base + MVPP2_GMAC_CTRL_2_REG); | ||
3856 | writel(ctrl4, port->base + MVPP22_GMAC_CTRL_4_REG); | ||
3857 | writel(an, port->base + MVPP2_GMAC_AUTONEG_CONFIG); | ||
3858 | + | ||
3859 | + if (old_ctrl2 & MVPP2_GMAC_PORT_RESET_MASK) { | ||
3860 | + while (readl(port->base + MVPP2_GMAC_CTRL_2_REG) & | ||
3861 | + MVPP2_GMAC_PORT_RESET_MASK) | ||
3862 | + continue; | ||
3863 | + } | ||
3864 | } | ||
3865 | |||
3866 | static void mvpp2_mac_config(struct net_device *dev, unsigned int mode, | ||
3867 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c b/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c | ||
3868 | index 47233b9a4f81..e6099f51d25f 100644 | ||
3869 | --- a/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c | ||
3870 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c | ||
3871 | @@ -357,6 +357,9 @@ int mlx5e_ethtool_set_channels(struct mlx5e_priv *priv, | ||
3872 | |||
3873 | if (!test_bit(MLX5E_STATE_OPENED, &priv->state)) { | ||
3874 | priv->channels.params = new_channels.params; | ||
3875 | + if (!netif_is_rxfh_configured(priv->netdev)) | ||
3876 | + mlx5e_build_default_indir_rqt(priv->rss_params.indirection_rqt, | ||
3877 | + MLX5E_INDIR_RQT_SIZE, count); | ||
3878 | goto out; | ||
3879 | } | ||
3880 | |||
3881 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c | ||
3882 | index 5b492b67f4e1..13c48883ed61 100644 | ||
3883 | --- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c | ||
3884 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c | ||
3885 | @@ -1812,7 +1812,7 @@ int mlx5_eswitch_set_vport_mac(struct mlx5_eswitch *esw, | ||
3886 | u64 node_guid; | ||
3887 | int err = 0; | ||
3888 | |||
3889 | - if (!MLX5_CAP_GEN(esw->dev, vport_group_manager)) | ||
3890 | + if (!esw || !MLX5_CAP_GEN(esw->dev, vport_group_manager)) | ||
3891 | return -EPERM; | ||
3892 | if (!LEGAL_VPORT(esw, vport) || is_multicast_ether_addr(mac)) | ||
3893 | return -EINVAL; | ||
3894 | @@ -1886,7 +1886,7 @@ int mlx5_eswitch_get_vport_config(struct mlx5_eswitch *esw, | ||
3895 | { | ||
3896 | struct mlx5_vport *evport; | ||
3897 | |||
3898 | - if (!MLX5_CAP_GEN(esw->dev, vport_group_manager)) | ||
3899 | + if (!esw || !MLX5_CAP_GEN(esw->dev, vport_group_manager)) | ||
3900 | return -EPERM; | ||
3901 | if (!LEGAL_VPORT(esw, vport)) | ||
3902 | return -EINVAL; | ||
3903 | @@ -2059,19 +2059,24 @@ static int normalize_vports_min_rate(struct mlx5_eswitch *esw, u32 divider) | ||
3904 | int mlx5_eswitch_set_vport_rate(struct mlx5_eswitch *esw, int vport, | ||
3905 | u32 max_rate, u32 min_rate) | ||
3906 | { | ||
3907 | - u32 fw_max_bw_share = MLX5_CAP_QOS(esw->dev, max_tsar_bw_share); | ||
3908 | - bool min_rate_supported = MLX5_CAP_QOS(esw->dev, esw_bw_share) && | ||
3909 | - fw_max_bw_share >= MLX5_MIN_BW_SHARE; | ||
3910 | - bool max_rate_supported = MLX5_CAP_QOS(esw->dev, esw_rate_limit); | ||
3911 | struct mlx5_vport *evport; | ||
3912 | + u32 fw_max_bw_share; | ||
3913 | u32 previous_min_rate; | ||
3914 | u32 divider; | ||
3915 | + bool min_rate_supported; | ||
3916 | + bool max_rate_supported; | ||
3917 | int err = 0; | ||
3918 | |||
3919 | if (!ESW_ALLOWED(esw)) | ||
3920 | return -EPERM; | ||
3921 | if (!LEGAL_VPORT(esw, vport)) | ||
3922 | return -EINVAL; | ||
3923 | + | ||
3924 | + fw_max_bw_share = MLX5_CAP_QOS(esw->dev, max_tsar_bw_share); | ||
3925 | + min_rate_supported = MLX5_CAP_QOS(esw->dev, esw_bw_share) && | ||
3926 | + fw_max_bw_share >= MLX5_MIN_BW_SHARE; | ||
3927 | + max_rate_supported = MLX5_CAP_QOS(esw->dev, esw_rate_limit); | ||
3928 | + | ||
3929 | if ((min_rate && !min_rate_supported) || (max_rate && !max_rate_supported)) | ||
3930 | return -EOPNOTSUPP; | ||
3931 | |||
3932 | diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c | ||
3933 | index b65e274b02e9..cbdee5164be7 100644 | ||
3934 | --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c | ||
3935 | +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c | ||
3936 | @@ -2105,7 +2105,7 @@ static void mlxsw_sp_port_get_prio_strings(u8 **p, int prio) | ||
3937 | int i; | ||
3938 | |||
3939 | for (i = 0; i < MLXSW_SP_PORT_HW_PRIO_STATS_LEN; i++) { | ||
3940 | - snprintf(*p, ETH_GSTRING_LEN, "%s_%d", | ||
3941 | + snprintf(*p, ETH_GSTRING_LEN, "%.29s_%.1d", | ||
3942 | mlxsw_sp_port_hw_prio_stats[i].str, prio); | ||
3943 | *p += ETH_GSTRING_LEN; | ||
3944 | } | ||
3945 | @@ -2116,7 +2116,7 @@ static void mlxsw_sp_port_get_tc_strings(u8 **p, int tc) | ||
3946 | int i; | ||
3947 | |||
3948 | for (i = 0; i < MLXSW_SP_PORT_HW_TC_STATS_LEN; i++) { | ||
3949 | - snprintf(*p, ETH_GSTRING_LEN, "%s_%d", | ||
3950 | + snprintf(*p, ETH_GSTRING_LEN, "%.29s_%.1d", | ||
3951 | mlxsw_sp_port_hw_tc_stats[i].str, tc); | ||
3952 | *p += ETH_GSTRING_LEN; | ||
3953 | } | ||
3954 | diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | ||
3955 | index 685d20472358..019ab99e65bb 100644 | ||
3956 | --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | ||
3957 | +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | ||
3958 | @@ -474,7 +474,7 @@ static void stmmac_get_tx_hwtstamp(struct stmmac_priv *priv, | ||
3959 | struct dma_desc *p, struct sk_buff *skb) | ||
3960 | { | ||
3961 | struct skb_shared_hwtstamps shhwtstamp; | ||
3962 | - u64 ns; | ||
3963 | + u64 ns = 0; | ||
3964 | |||
3965 | if (!priv->hwts_tx_en) | ||
3966 | return; | ||
3967 | @@ -513,7 +513,7 @@ static void stmmac_get_rx_hwtstamp(struct stmmac_priv *priv, struct dma_desc *p, | ||
3968 | { | ||
3969 | struct skb_shared_hwtstamps *shhwtstamp = NULL; | ||
3970 | struct dma_desc *desc = p; | ||
3971 | - u64 ns; | ||
3972 | + u64 ns = 0; | ||
3973 | |||
3974 | if (!priv->hwts_rx_en) | ||
3975 | return; | ||
3976 | @@ -558,8 +558,8 @@ static int stmmac_hwtstamp_ioctl(struct net_device *dev, struct ifreq *ifr) | ||
3977 | u32 snap_type_sel = 0; | ||
3978 | u32 ts_master_en = 0; | ||
3979 | u32 ts_event_en = 0; | ||
3980 | + u32 sec_inc = 0; | ||
3981 | u32 value = 0; | ||
3982 | - u32 sec_inc; | ||
3983 | bool xmac; | ||
3984 | |||
3985 | xmac = priv->plat->has_gmac4 || priv->plat->has_xgmac; | ||
3986 | diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c | ||
3987 | index 2293e21f789f..cc60b3fb0892 100644 | ||
3988 | --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c | ||
3989 | +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c | ||
3990 | @@ -105,7 +105,7 @@ static int stmmac_get_time(struct ptp_clock_info *ptp, struct timespec64 *ts) | ||
3991 | struct stmmac_priv *priv = | ||
3992 | container_of(ptp, struct stmmac_priv, ptp_clock_ops); | ||
3993 | unsigned long flags; | ||
3994 | - u64 ns; | ||
3995 | + u64 ns = 0; | ||
3996 | |||
3997 | spin_lock_irqsave(&priv->ptp_lock, flags); | ||
3998 | stmmac_get_systime(priv, priv->ptpaddr, &ns); | ||
3999 | diff --git a/drivers/net/phy/phy-c45.c b/drivers/net/phy/phy-c45.c | ||
4000 | index 03af927fa5ad..e39bf0428dd9 100644 | ||
4001 | --- a/drivers/net/phy/phy-c45.c | ||
4002 | +++ b/drivers/net/phy/phy-c45.c | ||
4003 | @@ -147,9 +147,15 @@ int genphy_c45_read_link(struct phy_device *phydev, u32 mmd_mask) | ||
4004 | mmd_mask &= ~BIT(devad); | ||
4005 | |||
4006 | /* The link state is latched low so that momentary link | ||
4007 | - * drops can be detected. Do not double-read the status | ||
4008 | - * register if the link is down. | ||
4009 | + * drops can be detected. Do not double-read the status | ||
4010 | + * in polling mode to detect such short link drops. | ||
4011 | */ | ||
4012 | + if (!phy_polling_mode(phydev)) { | ||
4013 | + val = phy_read_mmd(phydev, devad, MDIO_STAT1); | ||
4014 | + if (val < 0) | ||
4015 | + return val; | ||
4016 | + } | ||
4017 | + | ||
4018 | val = phy_read_mmd(phydev, devad, MDIO_STAT1); | ||
4019 | if (val < 0) | ||
4020 | return val; | ||
4021 | diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c | ||
4022 | index 739434fe04fa..adf79614c2db 100644 | ||
4023 | --- a/drivers/net/phy/phy_device.c | ||
4024 | +++ b/drivers/net/phy/phy_device.c | ||
4025 | @@ -1683,10 +1683,15 @@ int genphy_update_link(struct phy_device *phydev) | ||
4026 | { | ||
4027 | int status; | ||
4028 | |||
4029 | - /* Do a fake read */ | ||
4030 | - status = phy_read(phydev, MII_BMSR); | ||
4031 | - if (status < 0) | ||
4032 | - return status; | ||
4033 | + /* The link state is latched low so that momentary link | ||
4034 | + * drops can be detected. Do not double-read the status | ||
4035 | + * in polling mode to detect such short link drops. | ||
4036 | + */ | ||
4037 | + if (!phy_polling_mode(phydev)) { | ||
4038 | + status = phy_read(phydev, MII_BMSR); | ||
4039 | + if (status < 0) | ||
4040 | + return status; | ||
4041 | + } | ||
4042 | |||
4043 | /* Read link and autonegotiation status */ | ||
4044 | status = phy_read(phydev, MII_BMSR); | ||
4045 | diff --git a/drivers/net/veth.c b/drivers/net/veth.c | ||
4046 | index f412ea1cef18..b203d1867959 100644 | ||
4047 | --- a/drivers/net/veth.c | ||
4048 | +++ b/drivers/net/veth.c | ||
4049 | @@ -115,7 +115,8 @@ static void veth_get_strings(struct net_device *dev, u32 stringset, u8 *buf) | ||
4050 | p += sizeof(ethtool_stats_keys); | ||
4051 | for (i = 0; i < dev->real_num_rx_queues; i++) { | ||
4052 | for (j = 0; j < VETH_RQ_STATS_LEN; j++) { | ||
4053 | - snprintf(p, ETH_GSTRING_LEN, "rx_queue_%u_%s", | ||
4054 | + snprintf(p, ETH_GSTRING_LEN, | ||
4055 | + "rx_queue_%u_%.11s", | ||
4056 | i, veth_rq_stats_desc[j].desc); | ||
4057 | p += ETH_GSTRING_LEN; | ||
4058 | } | ||
4059 | diff --git a/drivers/net/wireless/ath/ath10k/ce.c b/drivers/net/wireless/ath/ath10k/ce.c | ||
4060 | index 2a5668b4f6bc..1a1ea4bbf8a0 100644 | ||
4061 | --- a/drivers/net/wireless/ath/ath10k/ce.c | ||
4062 | +++ b/drivers/net/wireless/ath/ath10k/ce.c | ||
4063 | @@ -500,14 +500,8 @@ static int _ath10k_ce_send_nolock(struct ath10k_ce_pipe *ce_state, | ||
4064 | write_index = CE_RING_IDX_INCR(nentries_mask, write_index); | ||
4065 | |||
4066 | /* WORKAROUND */ | ||
4067 | - if (!(flags & CE_SEND_FLAG_GATHER)) { | ||
4068 | - if (ar->hw_params.shadow_reg_support) | ||
4069 | - ath10k_ce_shadow_src_ring_write_index_set(ar, ce_state, | ||
4070 | - write_index); | ||
4071 | - else | ||
4072 | - ath10k_ce_src_ring_write_index_set(ar, ctrl_addr, | ||
4073 | - write_index); | ||
4074 | - } | ||
4075 | + if (!(flags & CE_SEND_FLAG_GATHER)) | ||
4076 | + ath10k_ce_src_ring_write_index_set(ar, ctrl_addr, write_index); | ||
4077 | |||
4078 | src_ring->write_index = write_index; | ||
4079 | exit: | ||
4080 | @@ -581,8 +575,14 @@ static int _ath10k_ce_send_nolock_64(struct ath10k_ce_pipe *ce_state, | ||
4081 | /* Update Source Ring Write Index */ | ||
4082 | write_index = CE_RING_IDX_INCR(nentries_mask, write_index); | ||
4083 | |||
4084 | - if (!(flags & CE_SEND_FLAG_GATHER)) | ||
4085 | - ath10k_ce_src_ring_write_index_set(ar, ctrl_addr, write_index); | ||
4086 | + if (!(flags & CE_SEND_FLAG_GATHER)) { | ||
4087 | + if (ar->hw_params.shadow_reg_support) | ||
4088 | + ath10k_ce_shadow_src_ring_write_index_set(ar, ce_state, | ||
4089 | + write_index); | ||
4090 | + else | ||
4091 | + ath10k_ce_src_ring_write_index_set(ar, ctrl_addr, | ||
4092 | + write_index); | ||
4093 | + } | ||
4094 | |||
4095 | src_ring->write_index = write_index; | ||
4096 | exit: | ||
4097 | @@ -1404,12 +1404,12 @@ static int ath10k_ce_alloc_shadow_base(struct ath10k *ar, | ||
4098 | u32 nentries) | ||
4099 | { | ||
4100 | src_ring->shadow_base_unaligned = kcalloc(nentries, | ||
4101 | - sizeof(struct ce_desc), | ||
4102 | + sizeof(struct ce_desc_64), | ||
4103 | GFP_KERNEL); | ||
4104 | if (!src_ring->shadow_base_unaligned) | ||
4105 | return -ENOMEM; | ||
4106 | |||
4107 | - src_ring->shadow_base = (struct ce_desc *) | ||
4108 | + src_ring->shadow_base = (struct ce_desc_64 *) | ||
4109 | PTR_ALIGN(src_ring->shadow_base_unaligned, | ||
4110 | CE_DESC_RING_ALIGN); | ||
4111 | return 0; | ||
4112 | @@ -1461,7 +1461,7 @@ ath10k_ce_alloc_src_ring(struct ath10k *ar, unsigned int ce_id, | ||
4113 | ret = ath10k_ce_alloc_shadow_base(ar, src_ring, nentries); | ||
4114 | if (ret) { | ||
4115 | dma_free_coherent(ar->dev, | ||
4116 | - (nentries * sizeof(struct ce_desc) + | ||
4117 | + (nentries * sizeof(struct ce_desc_64) + | ||
4118 | CE_DESC_RING_ALIGN), | ||
4119 | src_ring->base_addr_owner_space_unaligned, | ||
4120 | base_addr); | ||
4121 | diff --git a/drivers/net/wireless/ath/ath10k/ce.h b/drivers/net/wireless/ath/ath10k/ce.h | ||
4122 | index ead9987c3259..463e2fc8b501 100644 | ||
4123 | --- a/drivers/net/wireless/ath/ath10k/ce.h | ||
4124 | +++ b/drivers/net/wireless/ath/ath10k/ce.h | ||
4125 | @@ -118,7 +118,7 @@ struct ath10k_ce_ring { | ||
4126 | u32 base_addr_ce_space; | ||
4127 | |||
4128 | char *shadow_base_unaligned; | ||
4129 | - struct ce_desc *shadow_base; | ||
4130 | + struct ce_desc_64 *shadow_base; | ||
4131 | |||
4132 | /* keep last */ | ||
4133 | void *per_transfer_context[0]; | ||
4134 | diff --git a/drivers/net/wireless/ath/ath10k/debugfs_sta.c b/drivers/net/wireless/ath/ath10k/debugfs_sta.c | ||
4135 | index 4778a455d81a..068f1a7e07d3 100644 | ||
4136 | --- a/drivers/net/wireless/ath/ath10k/debugfs_sta.c | ||
4137 | +++ b/drivers/net/wireless/ath/ath10k/debugfs_sta.c | ||
4138 | @@ -696,11 +696,12 @@ static ssize_t ath10k_dbg_sta_dump_tx_stats(struct file *file, | ||
4139 | " %llu ", stats->ht[j][i]); | ||
4140 | len += scnprintf(buf + len, size - len, "\n"); | ||
4141 | len += scnprintf(buf + len, size - len, | ||
4142 | - " BW %s (20,40,80,160 MHz)\n", str[j]); | ||
4143 | + " BW %s (20,5,10,40,80,160 MHz)\n", str[j]); | ||
4144 | len += scnprintf(buf + len, size - len, | ||
4145 | - " %llu %llu %llu %llu\n", | ||
4146 | + " %llu %llu %llu %llu %llu %llu\n", | ||
4147 | stats->bw[j][0], stats->bw[j][1], | ||
4148 | - stats->bw[j][2], stats->bw[j][3]); | ||
4149 | + stats->bw[j][2], stats->bw[j][3], | ||
4150 | + stats->bw[j][4], stats->bw[j][5]); | ||
4151 | len += scnprintf(buf + len, size - len, | ||
4152 | " NSS %s (1x1,2x2,3x3,4x4)\n", str[j]); | ||
4153 | len += scnprintf(buf + len, size - len, | ||
4154 | diff --git a/drivers/net/wireless/ath/ath10k/htt_rx.c b/drivers/net/wireless/ath/ath10k/htt_rx.c | ||
4155 | index f42bac204ef8..ecf34ce7acf0 100644 | ||
4156 | --- a/drivers/net/wireless/ath/ath10k/htt_rx.c | ||
4157 | +++ b/drivers/net/wireless/ath/ath10k/htt_rx.c | ||
4158 | @@ -2130,9 +2130,15 @@ static bool ath10k_htt_rx_proc_rx_ind_hl(struct ath10k_htt *htt, | ||
4159 | hdr = (struct ieee80211_hdr *)skb->data; | ||
4160 | rx_status = IEEE80211_SKB_RXCB(skb); | ||
4161 | rx_status->chains |= BIT(0); | ||
4162 | - rx_status->signal = ATH10K_DEFAULT_NOISE_FLOOR + | ||
4163 | - rx->ppdu.combined_rssi; | ||
4164 | - rx_status->flag &= ~RX_FLAG_NO_SIGNAL_VAL; | ||
4165 | + if (rx->ppdu.combined_rssi == 0) { | ||
4166 | + /* SDIO firmware does not provide signal */ | ||
4167 | + rx_status->signal = 0; | ||
4168 | + rx_status->flag |= RX_FLAG_NO_SIGNAL_VAL; | ||
4169 | + } else { | ||
4170 | + rx_status->signal = ATH10K_DEFAULT_NOISE_FLOOR + | ||
4171 | + rx->ppdu.combined_rssi; | ||
4172 | + rx_status->flag &= ~RX_FLAG_NO_SIGNAL_VAL; | ||
4173 | + } | ||
4174 | |||
4175 | spin_lock_bh(&ar->data_lock); | ||
4176 | ch = ar->scan_channel; | ||
4177 | diff --git a/drivers/net/wireless/ath/ath10k/wmi.h b/drivers/net/wireless/ath/ath10k/wmi.h | ||
4178 | index 2034ccc7cc72..1d5d0209ebeb 100644 | ||
4179 | --- a/drivers/net/wireless/ath/ath10k/wmi.h | ||
4180 | +++ b/drivers/net/wireless/ath/ath10k/wmi.h | ||
4181 | @@ -5003,7 +5003,7 @@ enum wmi_rate_preamble { | ||
4182 | #define ATH10K_FW_SKIPPED_RATE_CTRL(flags) (((flags) >> 6) & 0x1) | ||
4183 | |||
4184 | #define ATH10K_VHT_MCS_NUM 10 | ||
4185 | -#define ATH10K_BW_NUM 4 | ||
4186 | +#define ATH10K_BW_NUM 6 | ||
4187 | #define ATH10K_NSS_NUM 4 | ||
4188 | #define ATH10K_LEGACY_NUM 12 | ||
4189 | #define ATH10K_GI_NUM 2 | ||
4190 | diff --git a/drivers/net/wireless/ath/wil6210/cfg80211.c b/drivers/net/wireless/ath/wil6210/cfg80211.c | ||
4191 | index 9b2f9f543952..5a44f9d0ff02 100644 | ||
4192 | --- a/drivers/net/wireless/ath/wil6210/cfg80211.c | ||
4193 | +++ b/drivers/net/wireless/ath/wil6210/cfg80211.c | ||
4194 | @@ -1580,6 +1580,12 @@ static int _wil_cfg80211_merge_extra_ies(const u8 *ies1, u16 ies1_len, | ||
4195 | u8 *buf, *dpos; | ||
4196 | const u8 *spos; | ||
4197 | |||
4198 | + if (!ies1) | ||
4199 | + ies1_len = 0; | ||
4200 | + | ||
4201 | + if (!ies2) | ||
4202 | + ies2_len = 0; | ||
4203 | + | ||
4204 | if (ies1_len == 0 && ies2_len == 0) { | ||
4205 | *merged_ies = NULL; | ||
4206 | *merged_len = 0; | ||
4207 | @@ -1589,17 +1595,19 @@ static int _wil_cfg80211_merge_extra_ies(const u8 *ies1, u16 ies1_len, | ||
4208 | buf = kmalloc(ies1_len + ies2_len, GFP_KERNEL); | ||
4209 | if (!buf) | ||
4210 | return -ENOMEM; | ||
4211 | - memcpy(buf, ies1, ies1_len); | ||
4212 | + if (ies1) | ||
4213 | + memcpy(buf, ies1, ies1_len); | ||
4214 | dpos = buf + ies1_len; | ||
4215 | spos = ies2; | ||
4216 | - while (spos + 1 < ies2 + ies2_len) { | ||
4217 | + while (spos && (spos + 1 < ies2 + ies2_len)) { | ||
4218 | /* IE tag at offset 0, length at offset 1 */ | ||
4219 | u16 ielen = 2 + spos[1]; | ||
4220 | |||
4221 | if (spos + ielen > ies2 + ies2_len) | ||
4222 | break; | ||
4223 | if (spos[0] == WLAN_EID_VENDOR_SPECIFIC && | ||
4224 | - !_wil_cfg80211_find_ie(ies1, ies1_len, spos, ielen)) { | ||
4225 | + (!ies1 || !_wil_cfg80211_find_ie(ies1, ies1_len, | ||
4226 | + spos, ielen))) { | ||
4227 | memcpy(dpos, spos, ielen); | ||
4228 | dpos += ielen; | ||
4229 | } | ||
4230 | diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c | ||
4231 | index 1f1e95a15a17..0ce1d8174e6d 100644 | ||
4232 | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c | ||
4233 | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c | ||
4234 | @@ -149,7 +149,7 @@ static int brcmf_c_process_clm_blob(struct brcmf_if *ifp) | ||
4235 | return err; | ||
4236 | } | ||
4237 | |||
4238 | - err = request_firmware(&clm, clm_name, bus->dev); | ||
4239 | + err = firmware_request_nowarn(&clm, clm_name, bus->dev); | ||
4240 | if (err) { | ||
4241 | brcmf_info("no clm_blob available (err=%d), device may have limited channels available\n", | ||
4242 | err); | ||
4243 | diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/fw.c b/drivers/net/wireless/intel/iwlwifi/mvm/fw.c | ||
4244 | index 0d6c313b6669..19ec55cef802 100644 | ||
4245 | --- a/drivers/net/wireless/intel/iwlwifi/mvm/fw.c | ||
4246 | +++ b/drivers/net/wireless/intel/iwlwifi/mvm/fw.c | ||
4247 | @@ -127,13 +127,17 @@ static int iwl_send_rss_cfg_cmd(struct iwl_mvm *mvm) | ||
4248 | |||
4249 | static int iwl_configure_rxq(struct iwl_mvm *mvm) | ||
4250 | { | ||
4251 | - int i, num_queues, size; | ||
4252 | + int i, num_queues, size, ret; | ||
4253 | struct iwl_rfh_queue_config *cmd; | ||
4254 | + struct iwl_host_cmd hcmd = { | ||
4255 | + .id = WIDE_ID(DATA_PATH_GROUP, RFH_QUEUE_CONFIG_CMD), | ||
4256 | + .dataflags[0] = IWL_HCMD_DFL_NOCOPY, | ||
4257 | + }; | ||
4258 | |||
4259 | /* Do not configure default queue, it is configured via context info */ | ||
4260 | num_queues = mvm->trans->num_rx_queues - 1; | ||
4261 | |||
4262 | - size = sizeof(*cmd) + num_queues * sizeof(struct iwl_rfh_queue_data); | ||
4263 | + size = struct_size(cmd, data, num_queues); | ||
4264 | |||
4265 | cmd = kzalloc(size, GFP_KERNEL); | ||
4266 | if (!cmd) | ||
4267 | @@ -154,10 +158,14 @@ static int iwl_configure_rxq(struct iwl_mvm *mvm) | ||
4268 | cmd->data[i].fr_bd_wid = cpu_to_le32(data.fr_bd_wid); | ||
4269 | } | ||
4270 | |||
4271 | - return iwl_mvm_send_cmd_pdu(mvm, | ||
4272 | - WIDE_ID(DATA_PATH_GROUP, | ||
4273 | - RFH_QUEUE_CONFIG_CMD), | ||
4274 | - 0, size, cmd); | ||
4275 | + hcmd.data[0] = cmd; | ||
4276 | + hcmd.len[0] = size; | ||
4277 | + | ||
4278 | + ret = iwl_mvm_send_cmd(mvm, &hcmd); | ||
4279 | + | ||
4280 | + kfree(cmd); | ||
4281 | + | ||
4282 | + return ret; | ||
4283 | } | ||
4284 | |||
4285 | static int iwl_mvm_send_dqa_cmd(struct iwl_mvm *mvm) | ||
4286 | diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/rx.c b/drivers/net/wireless/intel/iwlwifi/pcie/rx.c | ||
4287 | index 9e850c25877b..c596c7b13504 100644 | ||
4288 | --- a/drivers/net/wireless/intel/iwlwifi/pcie/rx.c | ||
4289 | +++ b/drivers/net/wireless/intel/iwlwifi/pcie/rx.c | ||
4290 | @@ -499,7 +499,7 @@ static void iwl_pcie_rx_allocator(struct iwl_trans *trans) | ||
4291 | struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); | ||
4292 | struct iwl_rb_allocator *rba = &trans_pcie->rba; | ||
4293 | struct list_head local_empty; | ||
4294 | - int pending = atomic_xchg(&rba->req_pending, 0); | ||
4295 | + int pending = atomic_read(&rba->req_pending); | ||
4296 | |||
4297 | IWL_DEBUG_RX(trans, "Pending allocation requests = %d\n", pending); | ||
4298 | |||
4299 | @@ -554,11 +554,13 @@ static void iwl_pcie_rx_allocator(struct iwl_trans *trans) | ||
4300 | i++; | ||
4301 | } | ||
4302 | |||
4303 | + atomic_dec(&rba->req_pending); | ||
4304 | pending--; | ||
4305 | + | ||
4306 | if (!pending) { | ||
4307 | - pending = atomic_xchg(&rba->req_pending, 0); | ||
4308 | + pending = atomic_read(&rba->req_pending); | ||
4309 | IWL_DEBUG_RX(trans, | ||
4310 | - "Pending allocation requests = %d\n", | ||
4311 | + "Got more pending allocation requests = %d\n", | ||
4312 | pending); | ||
4313 | } | ||
4314 | |||
4315 | @@ -570,12 +572,15 @@ static void iwl_pcie_rx_allocator(struct iwl_trans *trans) | ||
4316 | spin_unlock(&rba->lock); | ||
4317 | |||
4318 | atomic_inc(&rba->req_ready); | ||
4319 | + | ||
4320 | } | ||
4321 | |||
4322 | spin_lock(&rba->lock); | ||
4323 | /* return unused rbds to the allocator empty list */ | ||
4324 | list_splice_tail(&local_empty, &rba->rbd_empty); | ||
4325 | spin_unlock(&rba->lock); | ||
4326 | + | ||
4327 | + IWL_DEBUG_RX(trans, "%s, exit.\n", __func__); | ||
4328 | } | ||
4329 | |||
4330 | /* | ||
4331 | diff --git a/drivers/net/wireless/marvell/mwifiex/cfg80211.c b/drivers/net/wireless/marvell/mwifiex/cfg80211.c | ||
4332 | index 1467af22e394..883752f640b4 100644 | ||
4333 | --- a/drivers/net/wireless/marvell/mwifiex/cfg80211.c | ||
4334 | +++ b/drivers/net/wireless/marvell/mwifiex/cfg80211.c | ||
4335 | @@ -4310,11 +4310,13 @@ int mwifiex_register_cfg80211(struct mwifiex_adapter *adapter) | ||
4336 | wiphy->mgmt_stypes = mwifiex_mgmt_stypes; | ||
4337 | wiphy->max_remain_on_channel_duration = 5000; | ||
4338 | wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) | | ||
4339 | - BIT(NL80211_IFTYPE_ADHOC) | | ||
4340 | BIT(NL80211_IFTYPE_P2P_CLIENT) | | ||
4341 | BIT(NL80211_IFTYPE_P2P_GO) | | ||
4342 | BIT(NL80211_IFTYPE_AP); | ||
4343 | |||
4344 | + if (ISSUPP_ADHOC_ENABLED(adapter->fw_cap_info)) | ||
4345 | + wiphy->interface_modes |= BIT(NL80211_IFTYPE_ADHOC); | ||
4346 | + | ||
4347 | wiphy->bands[NL80211_BAND_2GHZ] = &mwifiex_band_2ghz; | ||
4348 | if (adapter->config_bands & BAND_A) | ||
4349 | wiphy->bands[NL80211_BAND_5GHZ] = &mwifiex_band_5ghz; | ||
4350 | @@ -4374,11 +4376,13 @@ int mwifiex_register_cfg80211(struct mwifiex_adapter *adapter) | ||
4351 | wiphy->available_antennas_tx = BIT(adapter->number_of_antenna) - 1; | ||
4352 | wiphy->available_antennas_rx = BIT(adapter->number_of_antenna) - 1; | ||
4353 | |||
4354 | - wiphy->features |= NL80211_FEATURE_HT_IBSS | | ||
4355 | - NL80211_FEATURE_INACTIVITY_TIMER | | ||
4356 | + wiphy->features |= NL80211_FEATURE_INACTIVITY_TIMER | | ||
4357 | NL80211_FEATURE_LOW_PRIORITY_SCAN | | ||
4358 | NL80211_FEATURE_NEED_OBSS_SCAN; | ||
4359 | |||
4360 | + if (ISSUPP_ADHOC_ENABLED(adapter->fw_cap_info)) | ||
4361 | + wiphy->features |= NL80211_FEATURE_HT_IBSS; | ||
4362 | + | ||
4363 | if (ISSUPP_RANDOM_MAC(adapter->fw_cap_info)) | ||
4364 | wiphy->features |= NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR | | ||
4365 | NL80211_FEATURE_SCHED_SCAN_RANDOM_MAC_ADDR | | ||
4366 | diff --git a/drivers/net/wireless/mediatek/mt76/eeprom.c b/drivers/net/wireless/mediatek/mt76/eeprom.c | ||
4367 | index 530e5593765c..a1529920d877 100644 | ||
4368 | --- a/drivers/net/wireless/mediatek/mt76/eeprom.c | ||
4369 | +++ b/drivers/net/wireless/mediatek/mt76/eeprom.c | ||
4370 | @@ -54,22 +54,30 @@ mt76_get_of_eeprom(struct mt76_dev *dev, int len) | ||
4371 | part = np->name; | ||
4372 | |||
4373 | mtd = get_mtd_device_nm(part); | ||
4374 | - if (IS_ERR(mtd)) | ||
4375 | - return PTR_ERR(mtd); | ||
4376 | + if (IS_ERR(mtd)) { | ||
4377 | + ret = PTR_ERR(mtd); | ||
4378 | + goto out_put_node; | ||
4379 | + } | ||
4380 | |||
4381 | - if (size <= sizeof(*list)) | ||
4382 | - return -EINVAL; | ||
4383 | + if (size <= sizeof(*list)) { | ||
4384 | + ret = -EINVAL; | ||
4385 | + goto out_put_node; | ||
4386 | + } | ||
4387 | |||
4388 | offset = be32_to_cpup(list); | ||
4389 | ret = mtd_read(mtd, offset, len, &retlen, dev->eeprom.data); | ||
4390 | put_mtd_device(mtd); | ||
4391 | if (ret) | ||
4392 | - return ret; | ||
4393 | + goto out_put_node; | ||
4394 | |||
4395 | - if (retlen < len) | ||
4396 | - return -EINVAL; | ||
4397 | + if (retlen < len) { | ||
4398 | + ret = -EINVAL; | ||
4399 | + goto out_put_node; | ||
4400 | + } | ||
4401 | |||
4402 | - return 0; | ||
4403 | +out_put_node: | ||
4404 | + of_node_put(np); | ||
4405 | + return ret; | ||
4406 | #else | ||
4407 | return -ENOENT; | ||
4408 | #endif | ||
4409 | diff --git a/drivers/net/wireless/mediatek/mt76/usb.c b/drivers/net/wireless/mediatek/mt76/usb.c | ||
4410 | index 09923cedd039..61cde0f9f58f 100644 | ||
4411 | --- a/drivers/net/wireless/mediatek/mt76/usb.c | ||
4412 | +++ b/drivers/net/wireless/mediatek/mt76/usb.c | ||
4413 | @@ -837,16 +837,9 @@ int mt76u_alloc_queues(struct mt76_dev *dev) | ||
4414 | |||
4415 | err = mt76u_alloc_rx(dev); | ||
4416 | if (err < 0) | ||
4417 | - goto err; | ||
4418 | - | ||
4419 | - err = mt76u_alloc_tx(dev); | ||
4420 | - if (err < 0) | ||
4421 | - goto err; | ||
4422 | + return err; | ||
4423 | |||
4424 | - return 0; | ||
4425 | -err: | ||
4426 | - mt76u_queues_deinit(dev); | ||
4427 | - return err; | ||
4428 | + return mt76u_alloc_tx(dev); | ||
4429 | } | ||
4430 | EXPORT_SYMBOL_GPL(mt76u_alloc_queues); | ||
4431 | |||
4432 | diff --git a/drivers/net/wireless/mediatek/mt7601u/eeprom.h b/drivers/net/wireless/mediatek/mt7601u/eeprom.h | ||
4433 | index 662d12703b69..57b503ae63f1 100644 | ||
4434 | --- a/drivers/net/wireless/mediatek/mt7601u/eeprom.h | ||
4435 | +++ b/drivers/net/wireless/mediatek/mt7601u/eeprom.h | ||
4436 | @@ -17,7 +17,7 @@ | ||
4437 | |||
4438 | struct mt7601u_dev; | ||
4439 | |||
4440 | -#define MT7601U_EE_MAX_VER 0x0c | ||
4441 | +#define MT7601U_EE_MAX_VER 0x0d | ||
4442 | #define MT7601U_EEPROM_SIZE 256 | ||
4443 | |||
4444 | #define MT7601U_DEFAULT_TX_POWER 6 | ||
4445 | diff --git a/drivers/net/wireless/ti/wlcore/main.c b/drivers/net/wireless/ti/wlcore/main.c | ||
4446 | index 26b187336875..2e12de813a5b 100644 | ||
4447 | --- a/drivers/net/wireless/ti/wlcore/main.c | ||
4448 | +++ b/drivers/net/wireless/ti/wlcore/main.c | ||
4449 | @@ -1085,8 +1085,11 @@ static int wl12xx_chip_wakeup(struct wl1271 *wl, bool plt) | ||
4450 | goto out; | ||
4451 | |||
4452 | ret = wl12xx_fetch_firmware(wl, plt); | ||
4453 | - if (ret < 0) | ||
4454 | - goto out; | ||
4455 | + if (ret < 0) { | ||
4456 | + kfree(wl->fw_status); | ||
4457 | + kfree(wl->raw_fw_status); | ||
4458 | + kfree(wl->tx_res_if); | ||
4459 | + } | ||
4460 | |||
4461 | out: | ||
4462 | return ret; | ||
4463 | diff --git a/drivers/nvme/host/fc.c b/drivers/nvme/host/fc.c | ||
4464 | index 89accc76d71c..c37d5bbd72ab 100644 | ||
4465 | --- a/drivers/nvme/host/fc.c | ||
4466 | +++ b/drivers/nvme/host/fc.c | ||
4467 | @@ -3018,7 +3018,10 @@ nvme_fc_init_ctrl(struct device *dev, struct nvmf_ctrl_options *opts, | ||
4468 | |||
4469 | ctrl->ctrl.opts = opts; | ||
4470 | ctrl->ctrl.nr_reconnects = 0; | ||
4471 | - ctrl->ctrl.numa_node = dev_to_node(lport->dev); | ||
4472 | + if (lport->dev) | ||
4473 | + ctrl->ctrl.numa_node = dev_to_node(lport->dev); | ||
4474 | + else | ||
4475 | + ctrl->ctrl.numa_node = NUMA_NO_NODE; | ||
4476 | INIT_LIST_HEAD(&ctrl->ctrl_list); | ||
4477 | ctrl->lport = lport; | ||
4478 | ctrl->rport = rport; | ||
4479 | diff --git a/drivers/nvme/target/core.c b/drivers/nvme/target/core.c | ||
4480 | index 88d260f31835..02c63c463222 100644 | ||
4481 | --- a/drivers/nvme/target/core.c | ||
4482 | +++ b/drivers/nvme/target/core.c | ||
4483 | @@ -1171,6 +1171,15 @@ static void nvmet_release_p2p_ns_map(struct nvmet_ctrl *ctrl) | ||
4484 | put_device(ctrl->p2p_client); | ||
4485 | } | ||
4486 | |||
4487 | +static void nvmet_fatal_error_handler(struct work_struct *work) | ||
4488 | +{ | ||
4489 | + struct nvmet_ctrl *ctrl = | ||
4490 | + container_of(work, struct nvmet_ctrl, fatal_err_work); | ||
4491 | + | ||
4492 | + pr_err("ctrl %d fatal error occurred!\n", ctrl->cntlid); | ||
4493 | + ctrl->ops->delete_ctrl(ctrl); | ||
4494 | +} | ||
4495 | + | ||
4496 | u16 nvmet_alloc_ctrl(const char *subsysnqn, const char *hostnqn, | ||
4497 | struct nvmet_req *req, u32 kato, struct nvmet_ctrl **ctrlp) | ||
4498 | { | ||
4499 | @@ -1213,6 +1222,7 @@ u16 nvmet_alloc_ctrl(const char *subsysnqn, const char *hostnqn, | ||
4500 | INIT_WORK(&ctrl->async_event_work, nvmet_async_event_work); | ||
4501 | INIT_LIST_HEAD(&ctrl->async_events); | ||
4502 | INIT_RADIX_TREE(&ctrl->p2p_ns_map, GFP_KERNEL); | ||
4503 | + INIT_WORK(&ctrl->fatal_err_work, nvmet_fatal_error_handler); | ||
4504 | |||
4505 | memcpy(ctrl->subsysnqn, subsysnqn, NVMF_NQN_SIZE); | ||
4506 | memcpy(ctrl->hostnqn, hostnqn, NVMF_NQN_SIZE); | ||
4507 | @@ -1316,21 +1326,11 @@ void nvmet_ctrl_put(struct nvmet_ctrl *ctrl) | ||
4508 | kref_put(&ctrl->ref, nvmet_ctrl_free); | ||
4509 | } | ||
4510 | |||
4511 | -static void nvmet_fatal_error_handler(struct work_struct *work) | ||
4512 | -{ | ||
4513 | - struct nvmet_ctrl *ctrl = | ||
4514 | - container_of(work, struct nvmet_ctrl, fatal_err_work); | ||
4515 | - | ||
4516 | - pr_err("ctrl %d fatal error occurred!\n", ctrl->cntlid); | ||
4517 | - ctrl->ops->delete_ctrl(ctrl); | ||
4518 | -} | ||
4519 | - | ||
4520 | void nvmet_ctrl_fatal_error(struct nvmet_ctrl *ctrl) | ||
4521 | { | ||
4522 | mutex_lock(&ctrl->lock); | ||
4523 | if (!(ctrl->csts & NVME_CSTS_CFS)) { | ||
4524 | ctrl->csts |= NVME_CSTS_CFS; | ||
4525 | - INIT_WORK(&ctrl->fatal_err_work, nvmet_fatal_error_handler); | ||
4526 | schedule_work(&ctrl->fatal_err_work); | ||
4527 | } | ||
4528 | mutex_unlock(&ctrl->lock); | ||
4529 | diff --git a/drivers/pci/controller/pcie-mediatek.c b/drivers/pci/controller/pcie-mediatek.c | ||
4530 | index 55e471c18e8d..c42fe5c4319f 100644 | ||
4531 | --- a/drivers/pci/controller/pcie-mediatek.c | ||
4532 | +++ b/drivers/pci/controller/pcie-mediatek.c | ||
4533 | @@ -654,7 +654,6 @@ static int mtk_pcie_startup_port_v2(struct mtk_pcie_port *port) | ||
4534 | struct resource *mem = &pcie->mem; | ||
4535 | const struct mtk_pcie_soc *soc = port->pcie->soc; | ||
4536 | u32 val; | ||
4537 | - size_t size; | ||
4538 | int err; | ||
4539 | |||
4540 | /* MT7622 platforms need to enable LTSSM and ASPM from PCIe subsys */ | ||
4541 | @@ -706,8 +705,8 @@ static int mtk_pcie_startup_port_v2(struct mtk_pcie_port *port) | ||
4542 | mtk_pcie_enable_msi(port); | ||
4543 | |||
4544 | /* Set AHB to PCIe translation windows */ | ||
4545 | - size = mem->end - mem->start; | ||
4546 | - val = lower_32_bits(mem->start) | AHB2PCIE_SIZE(fls(size)); | ||
4547 | + val = lower_32_bits(mem->start) | | ||
4548 | + AHB2PCIE_SIZE(fls(resource_size(mem))); | ||
4549 | writel(val, port->base + PCIE_AHB_TRANS_BASE0_L); | ||
4550 | |||
4551 | val = upper_32_bits(mem->start); | ||
4552 | diff --git a/drivers/pci/hotplug/pciehp_hpc.c b/drivers/pci/hotplug/pciehp_hpc.c | ||
4553 | index c0fb64ace05a..8bfcb8cd0900 100644 | ||
4554 | --- a/drivers/pci/hotplug/pciehp_hpc.c | ||
4555 | +++ b/drivers/pci/hotplug/pciehp_hpc.c | ||
4556 | @@ -156,9 +156,9 @@ static void pcie_do_write_cmd(struct controller *ctrl, u16 cmd, | ||
4557 | slot_ctrl |= (cmd & mask); | ||
4558 | ctrl->cmd_busy = 1; | ||
4559 | smp_mb(); | ||
4560 | + ctrl->slot_ctrl = slot_ctrl; | ||
4561 | pcie_capability_write_word(pdev, PCI_EXP_SLTCTL, slot_ctrl); | ||
4562 | ctrl->cmd_started = jiffies; | ||
4563 | - ctrl->slot_ctrl = slot_ctrl; | ||
4564 | |||
4565 | /* | ||
4566 | * Controllers with the Intel CF118 and similar errata advertise | ||
4567 | diff --git a/drivers/pci/pcie/pme.c b/drivers/pci/pcie/pme.c | ||
4568 | index 1a8b85051b1b..efa5b552914b 100644 | ||
4569 | --- a/drivers/pci/pcie/pme.c | ||
4570 | +++ b/drivers/pci/pcie/pme.c | ||
4571 | @@ -363,6 +363,16 @@ static bool pcie_pme_check_wakeup(struct pci_bus *bus) | ||
4572 | return false; | ||
4573 | } | ||
4574 | |||
4575 | +static void pcie_pme_disable_interrupt(struct pci_dev *port, | ||
4576 | + struct pcie_pme_service_data *data) | ||
4577 | +{ | ||
4578 | + spin_lock_irq(&data->lock); | ||
4579 | + pcie_pme_interrupt_enable(port, false); | ||
4580 | + pcie_clear_root_pme_status(port); | ||
4581 | + data->noirq = true; | ||
4582 | + spin_unlock_irq(&data->lock); | ||
4583 | +} | ||
4584 | + | ||
4585 | /** | ||
4586 | * pcie_pme_suspend - Suspend PCIe PME service device. | ||
4587 | * @srv: PCIe service device to suspend. | ||
4588 | @@ -387,11 +397,7 @@ static int pcie_pme_suspend(struct pcie_device *srv) | ||
4589 | return 0; | ||
4590 | } | ||
4591 | |||
4592 | - spin_lock_irq(&data->lock); | ||
4593 | - pcie_pme_interrupt_enable(port, false); | ||
4594 | - pcie_clear_root_pme_status(port); | ||
4595 | - data->noirq = true; | ||
4596 | - spin_unlock_irq(&data->lock); | ||
4597 | + pcie_pme_disable_interrupt(port, data); | ||
4598 | |||
4599 | synchronize_irq(srv->irq); | ||
4600 | |||
4601 | @@ -427,9 +433,11 @@ static int pcie_pme_resume(struct pcie_device *srv) | ||
4602 | */ | ||
4603 | static void pcie_pme_remove(struct pcie_device *srv) | ||
4604 | { | ||
4605 | - pcie_pme_suspend(srv); | ||
4606 | + struct pcie_pme_service_data *data = get_service_data(srv); | ||
4607 | + | ||
4608 | + pcie_pme_disable_interrupt(srv->port, data); | ||
4609 | free_irq(srv->irq, srv); | ||
4610 | - kfree(get_service_data(srv)); | ||
4611 | + kfree(data); | ||
4612 | } | ||
4613 | |||
4614 | static struct pcie_port_service_driver pcie_pme_driver = { | ||
4615 | diff --git a/drivers/perf/arm_spe_pmu.c b/drivers/perf/arm_spe_pmu.c | ||
4616 | index 8e46a9dad2fa..7cb766dafe85 100644 | ||
4617 | --- a/drivers/perf/arm_spe_pmu.c | ||
4618 | +++ b/drivers/perf/arm_spe_pmu.c | ||
4619 | @@ -824,10 +824,10 @@ static void arm_spe_pmu_read(struct perf_event *event) | ||
4620 | { | ||
4621 | } | ||
4622 | |||
4623 | -static void *arm_spe_pmu_setup_aux(int cpu, void **pages, int nr_pages, | ||
4624 | - bool snapshot) | ||
4625 | +static void *arm_spe_pmu_setup_aux(struct perf_event *event, void **pages, | ||
4626 | + int nr_pages, bool snapshot) | ||
4627 | { | ||
4628 | - int i; | ||
4629 | + int i, cpu = event->cpu; | ||
4630 | struct page **pglist; | ||
4631 | struct arm_spe_pmu_buf *buf; | ||
4632 | |||
4633 | diff --git a/drivers/pinctrl/meson/pinctrl-meson.c b/drivers/pinctrl/meson/pinctrl-meson.c | ||
4634 | index ea87d739f534..a4ae1ac5369e 100644 | ||
4635 | --- a/drivers/pinctrl/meson/pinctrl-meson.c | ||
4636 | +++ b/drivers/pinctrl/meson/pinctrl-meson.c | ||
4637 | @@ -31,6 +31,9 @@ | ||
4638 | * In some cases the register ranges for pull enable and pull | ||
4639 | * direction are the same and thus there are only 3 register ranges. | ||
4640 | * | ||
4641 | + * Since Meson G12A SoC, the ao register ranges for gpio, pull enable | ||
4642 | + * and pull direction are the same, so there are only 2 register ranges. | ||
4643 | + * | ||
4644 | * For the pull and GPIO configuration every bank uses a contiguous | ||
4645 | * set of bits in the register sets described above; the same register | ||
4646 | * can be shared by more banks with different offsets. | ||
4647 | @@ -488,23 +491,22 @@ static int meson_pinctrl_parse_dt(struct meson_pinctrl *pc, | ||
4648 | return PTR_ERR(pc->reg_mux); | ||
4649 | } | ||
4650 | |||
4651 | - pc->reg_pull = meson_map_resource(pc, gpio_np, "pull"); | ||
4652 | - if (IS_ERR(pc->reg_pull)) { | ||
4653 | - dev_err(pc->dev, "pull registers not found\n"); | ||
4654 | - return PTR_ERR(pc->reg_pull); | ||
4655 | + pc->reg_gpio = meson_map_resource(pc, gpio_np, "gpio"); | ||
4656 | + if (IS_ERR(pc->reg_gpio)) { | ||
4657 | + dev_err(pc->dev, "gpio registers not found\n"); | ||
4658 | + return PTR_ERR(pc->reg_gpio); | ||
4659 | } | ||
4660 | |||
4661 | + pc->reg_pull = meson_map_resource(pc, gpio_np, "pull"); | ||
4662 | + /* Use gpio region if pull one is not present */ | ||
4663 | + if (IS_ERR(pc->reg_pull)) | ||
4664 | + pc->reg_pull = pc->reg_gpio; | ||
4665 | + | ||
4666 | pc->reg_pullen = meson_map_resource(pc, gpio_np, "pull-enable"); | ||
4667 | /* Use pull region if pull-enable one is not present */ | ||
4668 | if (IS_ERR(pc->reg_pullen)) | ||
4669 | pc->reg_pullen = pc->reg_pull; | ||
4670 | |||
4671 | - pc->reg_gpio = meson_map_resource(pc, gpio_np, "gpio"); | ||
4672 | - if (IS_ERR(pc->reg_gpio)) { | ||
4673 | - dev_err(pc->dev, "gpio registers not found\n"); | ||
4674 | - return PTR_ERR(pc->reg_gpio); | ||
4675 | - } | ||
4676 | - | ||
4677 | return 0; | ||
4678 | } | ||
4679 | |||
4680 | diff --git a/drivers/pinctrl/meson/pinctrl-meson8b.c b/drivers/pinctrl/meson/pinctrl-meson8b.c | ||
4681 | index 0f140a802137..7f76000cc12e 100644 | ||
4682 | --- a/drivers/pinctrl/meson/pinctrl-meson8b.c | ||
4683 | +++ b/drivers/pinctrl/meson/pinctrl-meson8b.c | ||
4684 | @@ -346,6 +346,8 @@ static const unsigned int eth_rx_dv_pins[] = { DIF_1_P }; | ||
4685 | static const unsigned int eth_rx_clk_pins[] = { DIF_1_N }; | ||
4686 | static const unsigned int eth_txd0_1_pins[] = { DIF_2_P }; | ||
4687 | static const unsigned int eth_txd1_1_pins[] = { DIF_2_N }; | ||
4688 | +static const unsigned int eth_rxd3_pins[] = { DIF_2_P }; | ||
4689 | +static const unsigned int eth_rxd2_pins[] = { DIF_2_N }; | ||
4690 | static const unsigned int eth_tx_en_pins[] = { DIF_3_P }; | ||
4691 | static const unsigned int eth_ref_clk_pins[] = { DIF_3_N }; | ||
4692 | static const unsigned int eth_mdc_pins[] = { DIF_4_P }; | ||
4693 | @@ -599,6 +601,8 @@ static struct meson_pmx_group meson8b_cbus_groups[] = { | ||
4694 | GROUP(eth_ref_clk, 6, 8), | ||
4695 | GROUP(eth_mdc, 6, 9), | ||
4696 | GROUP(eth_mdio_en, 6, 10), | ||
4697 | + GROUP(eth_rxd3, 7, 22), | ||
4698 | + GROUP(eth_rxd2, 7, 23), | ||
4699 | }; | ||
4700 | |||
4701 | static struct meson_pmx_group meson8b_aobus_groups[] = { | ||
4702 | @@ -748,7 +752,7 @@ static const char * const ethernet_groups[] = { | ||
4703 | "eth_tx_clk", "eth_tx_en", "eth_txd1_0", "eth_txd1_1", | ||
4704 | "eth_txd0_0", "eth_txd0_1", "eth_rx_clk", "eth_rx_dv", | ||
4705 | "eth_rxd1", "eth_rxd0", "eth_mdio_en", "eth_mdc", "eth_ref_clk", | ||
4706 | - "eth_txd2", "eth_txd3" | ||
4707 | + "eth_txd2", "eth_txd3", "eth_rxd3", "eth_rxd2" | ||
4708 | }; | ||
4709 | |||
4710 | static const char * const i2c_a_groups[] = { | ||
4711 | diff --git a/drivers/pinctrl/sh-pfc/pfc-r8a77990.c b/drivers/pinctrl/sh-pfc/pfc-r8a77990.c | ||
4712 | index e40908dc37e0..1ce286f7b286 100644 | ||
4713 | --- a/drivers/pinctrl/sh-pfc/pfc-r8a77990.c | ||
4714 | +++ b/drivers/pinctrl/sh-pfc/pfc-r8a77990.c | ||
4715 | @@ -391,29 +391,33 @@ FM(IP12_23_20) IP12_23_20 FM(IP13_23_20) IP13_23_20 FM(IP14_23_20) IP14_23_20 FM | ||
4716 | FM(IP12_27_24) IP12_27_24 FM(IP13_27_24) IP13_27_24 FM(IP14_27_24) IP14_27_24 FM(IP15_27_24) IP15_27_24 \ | ||
4717 | FM(IP12_31_28) IP12_31_28 FM(IP13_31_28) IP13_31_28 FM(IP14_31_28) IP14_31_28 FM(IP15_31_28) IP15_31_28 | ||
4718 | |||
4719 | +/* The bit numbering in MOD_SEL fields is reversed */ | ||
4720 | +#define REV4(f0, f1, f2, f3) f0 f2 f1 f3 | ||
4721 | +#define REV8(f0, f1, f2, f3, f4, f5, f6, f7) f0 f4 f2 f6 f1 f5 f3 f7 | ||
4722 | + | ||
4723 | /* MOD_SEL0 */ /* 0 */ /* 1 */ /* 2 */ /* 3 */ /* 4 */ /* 5 */ /* 6 */ /* 7 */ | ||
4724 | -#define MOD_SEL0_30_29 FM(SEL_ADGB_0) FM(SEL_ADGB_1) FM(SEL_ADGB_2) F_(0, 0) | ||
4725 | +#define MOD_SEL0_30_29 REV4(FM(SEL_ADGB_0), FM(SEL_ADGB_1), FM(SEL_ADGB_2), F_(0, 0)) | ||
4726 | #define MOD_SEL0_28 FM(SEL_DRIF0_0) FM(SEL_DRIF0_1) | ||
4727 | -#define MOD_SEL0_27_26 FM(SEL_FM_0) FM(SEL_FM_1) FM(SEL_FM_2) F_(0, 0) | ||
4728 | +#define MOD_SEL0_27_26 REV4(FM(SEL_FM_0), FM(SEL_FM_1), FM(SEL_FM_2), F_(0, 0)) | ||
4729 | #define MOD_SEL0_25 FM(SEL_FSO_0) FM(SEL_FSO_1) | ||
4730 | #define MOD_SEL0_24 FM(SEL_HSCIF0_0) FM(SEL_HSCIF0_1) | ||
4731 | #define MOD_SEL0_23 FM(SEL_HSCIF1_0) FM(SEL_HSCIF1_1) | ||
4732 | #define MOD_SEL0_22 FM(SEL_HSCIF2_0) FM(SEL_HSCIF2_1) | ||
4733 | -#define MOD_SEL0_21_20 FM(SEL_I2C1_0) FM(SEL_I2C1_1) FM(SEL_I2C1_2) FM(SEL_I2C1_3) | ||
4734 | -#define MOD_SEL0_19_18_17 FM(SEL_I2C2_0) FM(SEL_I2C2_1) FM(SEL_I2C2_2) FM(SEL_I2C2_3) FM(SEL_I2C2_4) F_(0, 0) F_(0, 0) F_(0, 0) | ||
4735 | +#define MOD_SEL0_21_20 REV4(FM(SEL_I2C1_0), FM(SEL_I2C1_1), FM(SEL_I2C1_2), FM(SEL_I2C1_3)) | ||
4736 | +#define MOD_SEL0_19_18_17 REV8(FM(SEL_I2C2_0), FM(SEL_I2C2_1), FM(SEL_I2C2_2), FM(SEL_I2C2_3), FM(SEL_I2C2_4), F_(0, 0), F_(0, 0), F_(0, 0)) | ||
4737 | #define MOD_SEL0_16 FM(SEL_NDFC_0) FM(SEL_NDFC_1) | ||
4738 | #define MOD_SEL0_15 FM(SEL_PWM0_0) FM(SEL_PWM0_1) | ||
4739 | #define MOD_SEL0_14 FM(SEL_PWM1_0) FM(SEL_PWM1_1) | ||
4740 | -#define MOD_SEL0_13_12 FM(SEL_PWM2_0) FM(SEL_PWM2_1) FM(SEL_PWM2_2) F_(0, 0) | ||
4741 | -#define MOD_SEL0_11_10 FM(SEL_PWM3_0) FM(SEL_PWM3_1) FM(SEL_PWM3_2) F_(0, 0) | ||
4742 | +#define MOD_SEL0_13_12 REV4(FM(SEL_PWM2_0), FM(SEL_PWM2_1), FM(SEL_PWM2_2), F_(0, 0)) | ||
4743 | +#define MOD_SEL0_11_10 REV4(FM(SEL_PWM3_0), FM(SEL_PWM3_1), FM(SEL_PWM3_2), F_(0, 0)) | ||
4744 | #define MOD_SEL0_9 FM(SEL_PWM4_0) FM(SEL_PWM4_1) | ||
4745 | #define MOD_SEL0_8 FM(SEL_PWM5_0) FM(SEL_PWM5_1) | ||
4746 | #define MOD_SEL0_7 FM(SEL_PWM6_0) FM(SEL_PWM6_1) | ||
4747 | -#define MOD_SEL0_6_5 FM(SEL_REMOCON_0) FM(SEL_REMOCON_1) FM(SEL_REMOCON_2) F_(0, 0) | ||
4748 | +#define MOD_SEL0_6_5 REV4(FM(SEL_REMOCON_0), FM(SEL_REMOCON_1), FM(SEL_REMOCON_2), F_(0, 0)) | ||
4749 | #define MOD_SEL0_4 FM(SEL_SCIF_0) FM(SEL_SCIF_1) | ||
4750 | #define MOD_SEL0_3 FM(SEL_SCIF0_0) FM(SEL_SCIF0_1) | ||
4751 | #define MOD_SEL0_2 FM(SEL_SCIF2_0) FM(SEL_SCIF2_1) | ||
4752 | -#define MOD_SEL0_1_0 FM(SEL_SPEED_PULSE_IF_0) FM(SEL_SPEED_PULSE_IF_1) FM(SEL_SPEED_PULSE_IF_2) F_(0, 0) | ||
4753 | +#define MOD_SEL0_1_0 REV4(FM(SEL_SPEED_PULSE_IF_0), FM(SEL_SPEED_PULSE_IF_1), FM(SEL_SPEED_PULSE_IF_2), F_(0, 0)) | ||
4754 | |||
4755 | /* MOD_SEL1 */ /* 0 */ /* 1 */ /* 2 */ /* 3 */ /* 4 */ /* 5 */ /* 6 */ /* 7 */ | ||
4756 | #define MOD_SEL1_31 FM(SEL_SIMCARD_0) FM(SEL_SIMCARD_1) | ||
4757 | @@ -422,18 +426,18 @@ FM(IP12_31_28) IP12_31_28 FM(IP13_31_28) IP13_31_28 FM(IP14_31_28) IP14_31_28 FM | ||
4758 | #define MOD_SEL1_28 FM(SEL_USB_20_CH0_0) FM(SEL_USB_20_CH0_1) | ||
4759 | #define MOD_SEL1_26 FM(SEL_DRIF2_0) FM(SEL_DRIF2_1) | ||
4760 | #define MOD_SEL1_25 FM(SEL_DRIF3_0) FM(SEL_DRIF3_1) | ||
4761 | -#define MOD_SEL1_24_23_22 FM(SEL_HSCIF3_0) FM(SEL_HSCIF3_1) FM(SEL_HSCIF3_2) FM(SEL_HSCIF3_3) FM(SEL_HSCIF3_4) F_(0, 0) F_(0, 0) F_(0, 0) | ||
4762 | -#define MOD_SEL1_21_20_19 FM(SEL_HSCIF4_0) FM(SEL_HSCIF4_1) FM(SEL_HSCIF4_2) FM(SEL_HSCIF4_3) FM(SEL_HSCIF4_4) F_(0, 0) F_(0, 0) F_(0, 0) | ||
4763 | +#define MOD_SEL1_24_23_22 REV8(FM(SEL_HSCIF3_0), FM(SEL_HSCIF3_1), FM(SEL_HSCIF3_2), FM(SEL_HSCIF3_3), FM(SEL_HSCIF3_4), F_(0, 0), F_(0, 0), F_(0, 0)) | ||
4764 | +#define MOD_SEL1_21_20_19 REV8(FM(SEL_HSCIF4_0), FM(SEL_HSCIF4_1), FM(SEL_HSCIF4_2), FM(SEL_HSCIF4_3), FM(SEL_HSCIF4_4), F_(0, 0), F_(0, 0), F_(0, 0)) | ||
4765 | #define MOD_SEL1_18 FM(SEL_I2C6_0) FM(SEL_I2C6_1) | ||
4766 | #define MOD_SEL1_17 FM(SEL_I2C7_0) FM(SEL_I2C7_1) | ||
4767 | #define MOD_SEL1_16 FM(SEL_MSIOF2_0) FM(SEL_MSIOF2_1) | ||
4768 | #define MOD_SEL1_15 FM(SEL_MSIOF3_0) FM(SEL_MSIOF3_1) | ||
4769 | -#define MOD_SEL1_14_13 FM(SEL_SCIF3_0) FM(SEL_SCIF3_1) FM(SEL_SCIF3_2) F_(0, 0) | ||
4770 | -#define MOD_SEL1_12_11 FM(SEL_SCIF4_0) FM(SEL_SCIF4_1) FM(SEL_SCIF4_2) F_(0, 0) | ||
4771 | -#define MOD_SEL1_10_9 FM(SEL_SCIF5_0) FM(SEL_SCIF5_1) FM(SEL_SCIF5_2) F_(0, 0) | ||
4772 | +#define MOD_SEL1_14_13 REV4(FM(SEL_SCIF3_0), FM(SEL_SCIF3_1), FM(SEL_SCIF3_2), F_(0, 0)) | ||
4773 | +#define MOD_SEL1_12_11 REV4(FM(SEL_SCIF4_0), FM(SEL_SCIF4_1), FM(SEL_SCIF4_2), F_(0, 0)) | ||
4774 | +#define MOD_SEL1_10_9 REV4(FM(SEL_SCIF5_0), FM(SEL_SCIF5_1), FM(SEL_SCIF5_2), F_(0, 0)) | ||
4775 | #define MOD_SEL1_8 FM(SEL_VIN4_0) FM(SEL_VIN4_1) | ||
4776 | #define MOD_SEL1_7 FM(SEL_VIN5_0) FM(SEL_VIN5_1) | ||
4777 | -#define MOD_SEL1_6_5 FM(SEL_ADGC_0) FM(SEL_ADGC_1) FM(SEL_ADGC_2) F_(0, 0) | ||
4778 | +#define MOD_SEL1_6_5 REV4(FM(SEL_ADGC_0), FM(SEL_ADGC_1), FM(SEL_ADGC_2), F_(0, 0)) | ||
4779 | #define MOD_SEL1_4 FM(SEL_SSI9_0) FM(SEL_SSI9_1) | ||
4780 | |||
4781 | #define PINMUX_MOD_SELS \ | ||
4782 | diff --git a/drivers/pinctrl/sh-pfc/pfc-r8a77995.c b/drivers/pinctrl/sh-pfc/pfc-r8a77995.c | ||
4783 | index 84d78db381e3..9e377e3b9cb3 100644 | ||
4784 | --- a/drivers/pinctrl/sh-pfc/pfc-r8a77995.c | ||
4785 | +++ b/drivers/pinctrl/sh-pfc/pfc-r8a77995.c | ||
4786 | @@ -381,6 +381,9 @@ FM(IP12_23_20) IP12_23_20 \ | ||
4787 | FM(IP12_27_24) IP12_27_24 \ | ||
4788 | FM(IP12_31_28) IP12_31_28 \ | ||
4789 | |||
4790 | +/* The bit numbering in MOD_SEL fields is reversed */ | ||
4791 | +#define REV4(f0, f1, f2, f3) f0 f2 f1 f3 | ||
4792 | + | ||
4793 | /* MOD_SEL0 */ /* 0 */ /* 1 */ /* 2 */ /* 3 */ | ||
4794 | #define MOD_SEL0_30 FM(SEL_MSIOF2_0) FM(SEL_MSIOF2_1) | ||
4795 | #define MOD_SEL0_29 FM(SEL_I2C3_0) FM(SEL_I2C3_1) | ||
4796 | @@ -388,10 +391,10 @@ FM(IP12_31_28) IP12_31_28 \ | ||
4797 | #define MOD_SEL0_27 FM(SEL_MSIOF3_0) FM(SEL_MSIOF3_1) | ||
4798 | #define MOD_SEL0_26 FM(SEL_HSCIF3_0) FM(SEL_HSCIF3_1) | ||
4799 | #define MOD_SEL0_25 FM(SEL_SCIF4_0) FM(SEL_SCIF4_1) | ||
4800 | -#define MOD_SEL0_24_23 FM(SEL_PWM0_0) FM(SEL_PWM0_1) FM(SEL_PWM0_2) F_(0, 0) | ||
4801 | -#define MOD_SEL0_22_21 FM(SEL_PWM1_0) FM(SEL_PWM1_1) FM(SEL_PWM1_2) F_(0, 0) | ||
4802 | -#define MOD_SEL0_20_19 FM(SEL_PWM2_0) FM(SEL_PWM2_1) FM(SEL_PWM2_2) F_(0, 0) | ||
4803 | -#define MOD_SEL0_18_17 FM(SEL_PWM3_0) FM(SEL_PWM3_1) FM(SEL_PWM3_2) F_(0, 0) | ||
4804 | +#define MOD_SEL0_24_23 REV4(FM(SEL_PWM0_0), FM(SEL_PWM0_1), FM(SEL_PWM0_2), F_(0, 0)) | ||
4805 | +#define MOD_SEL0_22_21 REV4(FM(SEL_PWM1_0), FM(SEL_PWM1_1), FM(SEL_PWM1_2), F_(0, 0)) | ||
4806 | +#define MOD_SEL0_20_19 REV4(FM(SEL_PWM2_0), FM(SEL_PWM2_1), FM(SEL_PWM2_2), F_(0, 0)) | ||
4807 | +#define MOD_SEL0_18_17 REV4(FM(SEL_PWM3_0), FM(SEL_PWM3_1), FM(SEL_PWM3_2), F_(0, 0)) | ||
4808 | #define MOD_SEL0_15 FM(SEL_IRQ_0_0) FM(SEL_IRQ_0_1) | ||
4809 | #define MOD_SEL0_14 FM(SEL_IRQ_1_0) FM(SEL_IRQ_1_1) | ||
4810 | #define MOD_SEL0_13 FM(SEL_IRQ_2_0) FM(SEL_IRQ_2_1) | ||
4811 | diff --git a/drivers/platform/mellanox/mlxreg-hotplug.c b/drivers/platform/mellanox/mlxreg-hotplug.c | ||
4812 | index b6d44550d98c..eca16d00e310 100644 | ||
4813 | --- a/drivers/platform/mellanox/mlxreg-hotplug.c | ||
4814 | +++ b/drivers/platform/mellanox/mlxreg-hotplug.c | ||
4815 | @@ -248,7 +248,8 @@ mlxreg_hotplug_work_helper(struct mlxreg_hotplug_priv_data *priv, | ||
4816 | struct mlxreg_core_item *item) | ||
4817 | { | ||
4818 | struct mlxreg_core_data *data; | ||
4819 | - u32 asserted, regval, bit; | ||
4820 | + unsigned long asserted; | ||
4821 | + u32 regval, bit; | ||
4822 | int ret; | ||
4823 | |||
4824 | /* | ||
4825 | @@ -281,7 +282,7 @@ mlxreg_hotplug_work_helper(struct mlxreg_hotplug_priv_data *priv, | ||
4826 | asserted = item->cache ^ regval; | ||
4827 | item->cache = regval; | ||
4828 | |||
4829 | - for_each_set_bit(bit, (unsigned long *)&asserted, 8) { | ||
4830 | + for_each_set_bit(bit, &asserted, 8) { | ||
4831 | data = item->data + bit; | ||
4832 | if (regval & BIT(bit)) { | ||
4833 | if (item->inversed) | ||
4834 | diff --git a/drivers/platform/x86/ideapad-laptop.c b/drivers/platform/x86/ideapad-laptop.c | ||
4835 | index 1589dffab9fa..8b53a9ceb897 100644 | ||
4836 | --- a/drivers/platform/x86/ideapad-laptop.c | ||
4837 | +++ b/drivers/platform/x86/ideapad-laptop.c | ||
4838 | @@ -989,7 +989,7 @@ static const struct dmi_system_id no_hw_rfkill_list[] = { | ||
4839 | .ident = "Lenovo RESCUER R720-15IKBN", | ||
4840 | .matches = { | ||
4841 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
4842 | - DMI_MATCH(DMI_BOARD_NAME, "80WW"), | ||
4843 | + DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo R720-15IKBN"), | ||
4844 | }, | ||
4845 | }, | ||
4846 | { | ||
4847 | diff --git a/drivers/platform/x86/intel-hid.c b/drivers/platform/x86/intel-hid.c | ||
4848 | index e28bcf61b126..bc0d55a59015 100644 | ||
4849 | --- a/drivers/platform/x86/intel-hid.c | ||
4850 | +++ b/drivers/platform/x86/intel-hid.c | ||
4851 | @@ -363,7 +363,7 @@ wakeup: | ||
4852 | * the 5-button array, but still send notifies with power button | ||
4853 | * event code to this device object on power button actions. | ||
4854 | * | ||
4855 | - * Report the power button press; catch and ignore the button release. | ||
4856 | + * Report the power button press and release. | ||
4857 | */ | ||
4858 | if (!priv->array) { | ||
4859 | if (event == 0xce) { | ||
4860 | @@ -372,8 +372,11 @@ wakeup: | ||
4861 | return; | ||
4862 | } | ||
4863 | |||
4864 | - if (event == 0xcf) | ||
4865 | + if (event == 0xcf) { | ||
4866 | + input_report_key(priv->input_dev, KEY_POWER, 0); | ||
4867 | + input_sync(priv->input_dev); | ||
4868 | return; | ||
4869 | + } | ||
4870 | } | ||
4871 | |||
4872 | /* 0xC0 is for HID events, other values are for 5 button array */ | ||
4873 | diff --git a/drivers/platform/x86/intel_pmc_core.c b/drivers/platform/x86/intel_pmc_core.c | ||
4874 | index 22dbf115782e..c37e74ee609d 100644 | ||
4875 | --- a/drivers/platform/x86/intel_pmc_core.c | ||
4876 | +++ b/drivers/platform/x86/intel_pmc_core.c | ||
4877 | @@ -380,7 +380,8 @@ static int pmc_core_ppfear_show(struct seq_file *s, void *unused) | ||
4878 | index < PPFEAR_MAX_NUM_ENTRIES; index++, iter++) | ||
4879 | pf_regs[index] = pmc_core_reg_read_byte(pmcdev, iter); | ||
4880 | |||
4881 | - for (index = 0; map[index].name; index++) | ||
4882 | + for (index = 0; map[index].name && | ||
4883 | + index < pmcdev->map->ppfear_buckets * 8; index++) | ||
4884 | pmc_core_display_map(s, index, pf_regs[index / 8], map); | ||
4885 | |||
4886 | return 0; | ||
4887 | diff --git a/drivers/platform/x86/intel_pmc_core.h b/drivers/platform/x86/intel_pmc_core.h | ||
4888 | index 89554cba5758..1a0104d2cbf0 100644 | ||
4889 | --- a/drivers/platform/x86/intel_pmc_core.h | ||
4890 | +++ b/drivers/platform/x86/intel_pmc_core.h | ||
4891 | @@ -32,7 +32,7 @@ | ||
4892 | #define SPT_PMC_SLP_S0_RES_COUNTER_STEP 0x64 | ||
4893 | #define PMC_BASE_ADDR_MASK ~(SPT_PMC_MMIO_REG_LEN - 1) | ||
4894 | #define MTPMC_MASK 0xffff0000 | ||
4895 | -#define PPFEAR_MAX_NUM_ENTRIES 5 | ||
4896 | +#define PPFEAR_MAX_NUM_ENTRIES 12 | ||
4897 | #define SPT_PPFEAR_NUM_ENTRIES 5 | ||
4898 | #define SPT_PMC_READ_DISABLE_BIT 0x16 | ||
4899 | #define SPT_PMC_MSG_FULL_STS_BIT 0x18 | ||
4900 | diff --git a/drivers/regulator/act8865-regulator.c b/drivers/regulator/act8865-regulator.c | ||
4901 | index 21e20483bd91..e0239cf3f56d 100644 | ||
4902 | --- a/drivers/regulator/act8865-regulator.c | ||
4903 | +++ b/drivers/regulator/act8865-regulator.c | ||
4904 | @@ -131,7 +131,7 @@ | ||
4905 | * ACT8865 voltage number | ||
4906 | */ | ||
4907 | #define ACT8865_VOLTAGE_NUM 64 | ||
4908 | -#define ACT8600_SUDCDC_VOLTAGE_NUM 255 | ||
4909 | +#define ACT8600_SUDCDC_VOLTAGE_NUM 256 | ||
4910 | |||
4911 | struct act8865 { | ||
4912 | struct regmap *regmap; | ||
4913 | @@ -222,7 +222,8 @@ static const struct regulator_linear_range act8600_sudcdc_voltage_ranges[] = { | ||
4914 | REGULATOR_LINEAR_RANGE(3000000, 0, 63, 0), | ||
4915 | REGULATOR_LINEAR_RANGE(3000000, 64, 159, 100000), | ||
4916 | REGULATOR_LINEAR_RANGE(12600000, 160, 191, 200000), | ||
4917 | - REGULATOR_LINEAR_RANGE(19000000, 191, 255, 400000), | ||
4918 | + REGULATOR_LINEAR_RANGE(19000000, 192, 247, 400000), | ||
4919 | + REGULATOR_LINEAR_RANGE(41400000, 248, 255, 0), | ||
4920 | }; | ||
4921 | |||
4922 | static struct regulator_ops act8865_ops = { | ||
4923 | diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c | ||
4924 | index b9d7b45c7295..e2caf11598c7 100644 | ||
4925 | --- a/drivers/regulator/core.c | ||
4926 | +++ b/drivers/regulator/core.c | ||
4927 | @@ -1349,7 +1349,9 @@ static int set_machine_constraints(struct regulator_dev *rdev, | ||
4928 | * We'll only apply the initial system load if an | ||
4929 | * initial mode wasn't specified. | ||
4930 | */ | ||
4931 | + regulator_lock(rdev); | ||
4932 | drms_uA_update(rdev); | ||
4933 | + regulator_unlock(rdev); | ||
4934 | } | ||
4935 | |||
4936 | if ((rdev->constraints->ramp_delay || rdev->constraints->ramp_disable) | ||
4937 | diff --git a/drivers/regulator/mcp16502.c b/drivers/regulator/mcp16502.c | ||
4938 | index 3479ae009b0b..0fc4963bd5b0 100644 | ||
4939 | --- a/drivers/regulator/mcp16502.c | ||
4940 | +++ b/drivers/regulator/mcp16502.c | ||
4941 | @@ -17,6 +17,7 @@ | ||
4942 | #include <linux/regmap.h> | ||
4943 | #include <linux/regulator/driver.h> | ||
4944 | #include <linux/suspend.h> | ||
4945 | +#include <linux/gpio/consumer.h> | ||
4946 | |||
4947 | #define VDD_LOW_SEL 0x0D | ||
4948 | #define VDD_HIGH_SEL 0x3F | ||
4949 | diff --git a/drivers/s390/net/ism_drv.c b/drivers/s390/net/ism_drv.c | ||
4950 | index ed8e58f09054..3e132592c1fe 100644 | ||
4951 | --- a/drivers/s390/net/ism_drv.c | ||
4952 | +++ b/drivers/s390/net/ism_drv.c | ||
4953 | @@ -141,10 +141,13 @@ static int register_ieq(struct ism_dev *ism) | ||
4954 | |||
4955 | static int unregister_sba(struct ism_dev *ism) | ||
4956 | { | ||
4957 | + int ret; | ||
4958 | + | ||
4959 | if (!ism->sba) | ||
4960 | return 0; | ||
4961 | |||
4962 | - if (ism_cmd_simple(ism, ISM_UNREG_SBA)) | ||
4963 | + ret = ism_cmd_simple(ism, ISM_UNREG_SBA); | ||
4964 | + if (ret && ret != ISM_ERROR) | ||
4965 | return -EIO; | ||
4966 | |||
4967 | dma_free_coherent(&ism->pdev->dev, PAGE_SIZE, | ||
4968 | @@ -158,10 +161,13 @@ static int unregister_sba(struct ism_dev *ism) | ||
4969 | |||
4970 | static int unregister_ieq(struct ism_dev *ism) | ||
4971 | { | ||
4972 | + int ret; | ||
4973 | + | ||
4974 | if (!ism->ieq) | ||
4975 | return 0; | ||
4976 | |||
4977 | - if (ism_cmd_simple(ism, ISM_UNREG_IEQ)) | ||
4978 | + ret = ism_cmd_simple(ism, ISM_UNREG_IEQ); | ||
4979 | + if (ret && ret != ISM_ERROR) | ||
4980 | return -EIO; | ||
4981 | |||
4982 | dma_free_coherent(&ism->pdev->dev, PAGE_SIZE, | ||
4983 | @@ -287,7 +293,7 @@ static int ism_unregister_dmb(struct smcd_dev *smcd, struct smcd_dmb *dmb) | ||
4984 | cmd.request.dmb_tok = dmb->dmb_tok; | ||
4985 | |||
4986 | ret = ism_cmd(ism, &cmd); | ||
4987 | - if (ret) | ||
4988 | + if (ret && ret != ISM_ERROR) | ||
4989 | goto out; | ||
4990 | |||
4991 | ism_free_dmb(ism, dmb); | ||
4992 | diff --git a/drivers/scsi/bnx2fc/bnx2fc_fcoe.c b/drivers/scsi/bnx2fc/bnx2fc_fcoe.c | ||
4993 | index 2e4e7159ebf9..a75e74ad1698 100644 | ||
4994 | --- a/drivers/scsi/bnx2fc/bnx2fc_fcoe.c | ||
4995 | +++ b/drivers/scsi/bnx2fc/bnx2fc_fcoe.c | ||
4996 | @@ -1438,7 +1438,7 @@ bind_err: | ||
4997 | static struct bnx2fc_interface * | ||
4998 | bnx2fc_interface_create(struct bnx2fc_hba *hba, | ||
4999 | struct net_device *netdev, | ||
5000 | - enum fip_state fip_mode) | ||
5001 | + enum fip_mode fip_mode) | ||
5002 | { | ||
5003 | struct fcoe_ctlr_device *ctlr_dev; | ||
5004 | struct bnx2fc_interface *interface; | ||
5005 | diff --git a/drivers/scsi/fcoe/fcoe.c b/drivers/scsi/fcoe/fcoe.c | ||
5006 | index cd19be3f3405..8ba8862d3292 100644 | ||
5007 | --- a/drivers/scsi/fcoe/fcoe.c | ||
5008 | +++ b/drivers/scsi/fcoe/fcoe.c | ||
5009 | @@ -389,7 +389,7 @@ static int fcoe_interface_setup(struct fcoe_interface *fcoe, | ||
5010 | * Returns: pointer to a struct fcoe_interface or NULL on error | ||
5011 | */ | ||
5012 | static struct fcoe_interface *fcoe_interface_create(struct net_device *netdev, | ||
5013 | - enum fip_state fip_mode) | ||
5014 | + enum fip_mode fip_mode) | ||
5015 | { | ||
5016 | struct fcoe_ctlr_device *ctlr_dev; | ||
5017 | struct fcoe_ctlr *ctlr; | ||
5018 | diff --git a/drivers/scsi/fcoe/fcoe_ctlr.c b/drivers/scsi/fcoe/fcoe_ctlr.c | ||
5019 | index 54da3166da8d..7dc4ffa24430 100644 | ||
5020 | --- a/drivers/scsi/fcoe/fcoe_ctlr.c | ||
5021 | +++ b/drivers/scsi/fcoe/fcoe_ctlr.c | ||
5022 | @@ -147,7 +147,7 @@ static void fcoe_ctlr_map_dest(struct fcoe_ctlr *fip) | ||
5023 | * fcoe_ctlr_init() - Initialize the FCoE Controller instance | ||
5024 | * @fip: The FCoE controller to initialize | ||
5025 | */ | ||
5026 | -void fcoe_ctlr_init(struct fcoe_ctlr *fip, enum fip_state mode) | ||
5027 | +void fcoe_ctlr_init(struct fcoe_ctlr *fip, enum fip_mode mode) | ||
5028 | { | ||
5029 | fcoe_ctlr_set_state(fip, FIP_ST_LINK_WAIT); | ||
5030 | fip->mode = mode; | ||
5031 | @@ -454,7 +454,10 @@ void fcoe_ctlr_link_up(struct fcoe_ctlr *fip) | ||
5032 | mutex_unlock(&fip->ctlr_mutex); | ||
5033 | fc_linkup(fip->lp); | ||
5034 | } else if (fip->state == FIP_ST_LINK_WAIT) { | ||
5035 | - fcoe_ctlr_set_state(fip, fip->mode); | ||
5036 | + if (fip->mode == FIP_MODE_NON_FIP) | ||
5037 | + fcoe_ctlr_set_state(fip, FIP_ST_NON_FIP); | ||
5038 | + else | ||
5039 | + fcoe_ctlr_set_state(fip, FIP_ST_AUTO); | ||
5040 | switch (fip->mode) { | ||
5041 | default: | ||
5042 | LIBFCOE_FIP_DBG(fip, "invalid mode %d\n", fip->mode); | ||
5043 | diff --git a/drivers/scsi/fcoe/fcoe_transport.c b/drivers/scsi/fcoe/fcoe_transport.c | ||
5044 | index f4909cd206d3..f15d5e1d56b1 100644 | ||
5045 | --- a/drivers/scsi/fcoe/fcoe_transport.c | ||
5046 | +++ b/drivers/scsi/fcoe/fcoe_transport.c | ||
5047 | @@ -873,7 +873,7 @@ static int fcoe_transport_create(const char *buffer, | ||
5048 | int rc = -ENODEV; | ||
5049 | struct net_device *netdev = NULL; | ||
5050 | struct fcoe_transport *ft = NULL; | ||
5051 | - enum fip_state fip_mode = (enum fip_state)(long)kp->arg; | ||
5052 | + enum fip_mode fip_mode = (enum fip_mode)kp->arg; | ||
5053 | |||
5054 | mutex_lock(&ft_mutex); | ||
5055 | |||
5056 | diff --git a/drivers/scsi/hisi_sas/hisi_sas_main.c b/drivers/scsi/hisi_sas/hisi_sas_main.c | ||
5057 | index bc17fa0d8375..62d158574281 100644 | ||
5058 | --- a/drivers/scsi/hisi_sas/hisi_sas_main.c | ||
5059 | +++ b/drivers/scsi/hisi_sas/hisi_sas_main.c | ||
5060 | @@ -10,6 +10,7 @@ | ||
5061 | */ | ||
5062 | |||
5063 | #include "hisi_sas.h" | ||
5064 | +#include "../libsas/sas_internal.h" | ||
5065 | #define DRV_NAME "hisi_sas" | ||
5066 | |||
5067 | #define DEV_IS_GONE(dev) \ | ||
5068 | @@ -872,7 +873,8 @@ static void hisi_sas_do_release_task(struct hisi_hba *hisi_hba, struct sas_task | ||
5069 | spin_lock_irqsave(&task->task_state_lock, flags); | ||
5070 | task->task_state_flags &= | ||
5071 | ~(SAS_TASK_STATE_PENDING | SAS_TASK_AT_INITIATOR); | ||
5072 | - task->task_state_flags |= SAS_TASK_STATE_DONE; | ||
5073 | + if (!slot->is_internal && task->task_proto != SAS_PROTOCOL_SMP) | ||
5074 | + task->task_state_flags |= SAS_TASK_STATE_DONE; | ||
5075 | spin_unlock_irqrestore(&task->task_state_lock, flags); | ||
5076 | } | ||
5077 | |||
5078 | @@ -1972,9 +1974,18 @@ static int hisi_sas_write_gpio(struct sas_ha_struct *sha, u8 reg_type, | ||
5079 | |||
5080 | static void hisi_sas_phy_disconnected(struct hisi_sas_phy *phy) | ||
5081 | { | ||
5082 | + struct asd_sas_phy *sas_phy = &phy->sas_phy; | ||
5083 | + struct sas_phy *sphy = sas_phy->phy; | ||
5084 | + struct sas_phy_data *d = sphy->hostdata; | ||
5085 | + | ||
5086 | phy->phy_attached = 0; | ||
5087 | phy->phy_type = 0; | ||
5088 | phy->port = NULL; | ||
5089 | + | ||
5090 | + if (d->enable) | ||
5091 | + sphy->negotiated_linkrate = SAS_LINK_RATE_UNKNOWN; | ||
5092 | + else | ||
5093 | + sphy->negotiated_linkrate = SAS_PHY_DISABLED; | ||
5094 | } | ||
5095 | |||
5096 | void hisi_sas_phy_down(struct hisi_hba *hisi_hba, int phy_no, int rdy) | ||
5097 | diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c b/drivers/scsi/megaraid/megaraid_sas_base.c | ||
5098 | index fcbff83c0097..c9811d1aa007 100644 | ||
5099 | --- a/drivers/scsi/megaraid/megaraid_sas_base.c | ||
5100 | +++ b/drivers/scsi/megaraid/megaraid_sas_base.c | ||
5101 | @@ -4188,6 +4188,7 @@ int megasas_alloc_cmds(struct megasas_instance *instance) | ||
5102 | if (megasas_create_frame_pool(instance)) { | ||
5103 | dev_printk(KERN_DEBUG, &instance->pdev->dev, "Error creating frame DMA pool\n"); | ||
5104 | megasas_free_cmds(instance); | ||
5105 | + return -ENOMEM; | ||
5106 | } | ||
5107 | |||
5108 | return 0; | ||
5109 | diff --git a/drivers/scsi/qedf/qedf_main.c b/drivers/scsi/qedf/qedf_main.c | ||
5110 | index 9bbc19fc190b..9f9431a4cc0e 100644 | ||
5111 | --- a/drivers/scsi/qedf/qedf_main.c | ||
5112 | +++ b/drivers/scsi/qedf/qedf_main.c | ||
5113 | @@ -1418,7 +1418,7 @@ static struct libfc_function_template qedf_lport_template = { | ||
5114 | |||
5115 | static void qedf_fcoe_ctlr_setup(struct qedf_ctx *qedf) | ||
5116 | { | ||
5117 | - fcoe_ctlr_init(&qedf->ctlr, FIP_ST_AUTO); | ||
5118 | + fcoe_ctlr_init(&qedf->ctlr, FIP_MODE_AUTO); | ||
5119 | |||
5120 | qedf->ctlr.send = qedf_fip_send; | ||
5121 | qedf->ctlr.get_src_addr = qedf_get_src_mac; | ||
5122 | diff --git a/drivers/scsi/scsi_scan.c b/drivers/scsi/scsi_scan.c | ||
5123 | index dd0d516f65e2..53380e07b40e 100644 | ||
5124 | --- a/drivers/scsi/scsi_scan.c | ||
5125 | +++ b/drivers/scsi/scsi_scan.c | ||
5126 | @@ -220,7 +220,7 @@ static struct scsi_device *scsi_alloc_sdev(struct scsi_target *starget, | ||
5127 | struct Scsi_Host *shost = dev_to_shost(starget->dev.parent); | ||
5128 | |||
5129 | sdev = kzalloc(sizeof(*sdev) + shost->transportt->device_size, | ||
5130 | - GFP_ATOMIC); | ||
5131 | + GFP_KERNEL); | ||
5132 | if (!sdev) | ||
5133 | goto out; | ||
5134 | |||
5135 | @@ -788,7 +788,7 @@ static int scsi_add_lun(struct scsi_device *sdev, unsigned char *inq_result, | ||
5136 | */ | ||
5137 | sdev->inquiry = kmemdup(inq_result, | ||
5138 | max_t(size_t, sdev->inquiry_len, 36), | ||
5139 | - GFP_ATOMIC); | ||
5140 | + GFP_KERNEL); | ||
5141 | if (sdev->inquiry == NULL) | ||
5142 | return SCSI_SCAN_NO_RESPONSE; | ||
5143 | |||
5144 | @@ -1079,7 +1079,7 @@ static int scsi_probe_and_add_lun(struct scsi_target *starget, | ||
5145 | if (!sdev) | ||
5146 | goto out; | ||
5147 | |||
5148 | - result = kmalloc(result_len, GFP_ATOMIC | | ||
5149 | + result = kmalloc(result_len, GFP_KERNEL | | ||
5150 | ((shost->unchecked_isa_dma) ? __GFP_DMA : 0)); | ||
5151 | if (!result) | ||
5152 | goto out_free_sdev; | ||
5153 | diff --git a/drivers/soc/qcom/qcom_gsbi.c b/drivers/soc/qcom/qcom_gsbi.c | ||
5154 | index 09c669e70d63..038abc377fdb 100644 | ||
5155 | --- a/drivers/soc/qcom/qcom_gsbi.c | ||
5156 | +++ b/drivers/soc/qcom/qcom_gsbi.c | ||
5157 | @@ -138,7 +138,7 @@ static int gsbi_probe(struct platform_device *pdev) | ||
5158 | struct resource *res; | ||
5159 | void __iomem *base; | ||
5160 | struct gsbi_info *gsbi; | ||
5161 | - int i; | ||
5162 | + int i, ret; | ||
5163 | u32 mask, gsbi_num; | ||
5164 | const struct crci_config *config = NULL; | ||
5165 | |||
5166 | @@ -221,7 +221,10 @@ static int gsbi_probe(struct platform_device *pdev) | ||
5167 | |||
5168 | platform_set_drvdata(pdev, gsbi); | ||
5169 | |||
5170 | - return of_platform_populate(node, NULL, NULL, &pdev->dev); | ||
5171 | + ret = of_platform_populate(node, NULL, NULL, &pdev->dev); | ||
5172 | + if (ret) | ||
5173 | + clk_disable_unprepare(gsbi->hclk); | ||
5174 | + return ret; | ||
5175 | } | ||
5176 | |||
5177 | static int gsbi_remove(struct platform_device *pdev) | ||
5178 | diff --git a/drivers/soc/tegra/fuse/fuse-tegra.c b/drivers/soc/tegra/fuse/fuse-tegra.c | ||
5179 | index a33ee8ef8b6b..51625703399e 100644 | ||
5180 | --- a/drivers/soc/tegra/fuse/fuse-tegra.c | ||
5181 | +++ b/drivers/soc/tegra/fuse/fuse-tegra.c | ||
5182 | @@ -137,13 +137,17 @@ static int tegra_fuse_probe(struct platform_device *pdev) | ||
5183 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
5184 | fuse->phys = res->start; | ||
5185 | fuse->base = devm_ioremap_resource(&pdev->dev, res); | ||
5186 | - if (IS_ERR(fuse->base)) | ||
5187 | - return PTR_ERR(fuse->base); | ||
5188 | + if (IS_ERR(fuse->base)) { | ||
5189 | + err = PTR_ERR(fuse->base); | ||
5190 | + fuse->base = base; | ||
5191 | + return err; | ||
5192 | + } | ||
5193 | |||
5194 | fuse->clk = devm_clk_get(&pdev->dev, "fuse"); | ||
5195 | if (IS_ERR(fuse->clk)) { | ||
5196 | dev_err(&pdev->dev, "failed to get FUSE clock: %ld", | ||
5197 | PTR_ERR(fuse->clk)); | ||
5198 | + fuse->base = base; | ||
5199 | return PTR_ERR(fuse->clk); | ||
5200 | } | ||
5201 | |||
5202 | @@ -152,8 +156,10 @@ static int tegra_fuse_probe(struct platform_device *pdev) | ||
5203 | |||
5204 | if (fuse->soc->probe) { | ||
5205 | err = fuse->soc->probe(fuse); | ||
5206 | - if (err < 0) | ||
5207 | + if (err < 0) { | ||
5208 | + fuse->base = base; | ||
5209 | return err; | ||
5210 | + } | ||
5211 | } | ||
5212 | |||
5213 | if (tegra_fuse_create_sysfs(&pdev->dev, fuse->soc->info->size, | ||
5214 | diff --git a/drivers/staging/iio/addac/adt7316.c b/drivers/staging/iio/addac/adt7316.c | ||
5215 | index dc93e85808e0..7839d869d25d 100644 | ||
5216 | --- a/drivers/staging/iio/addac/adt7316.c | ||
5217 | +++ b/drivers/staging/iio/addac/adt7316.c | ||
5218 | @@ -651,17 +651,10 @@ static ssize_t adt7316_store_da_high_resolution(struct device *dev, | ||
5219 | u8 config3; | ||
5220 | int ret; | ||
5221 | |||
5222 | - chip->dac_bits = 8; | ||
5223 | - | ||
5224 | - if (buf[0] == '1') { | ||
5225 | + if (buf[0] == '1') | ||
5226 | config3 = chip->config3 | ADT7316_DA_HIGH_RESOLUTION; | ||
5227 | - if (chip->id == ID_ADT7316 || chip->id == ID_ADT7516) | ||
5228 | - chip->dac_bits = 12; | ||
5229 | - else if (chip->id == ID_ADT7317 || chip->id == ID_ADT7517) | ||
5230 | - chip->dac_bits = 10; | ||
5231 | - } else { | ||
5232 | + else | ||
5233 | config3 = chip->config3 & (~ADT7316_DA_HIGH_RESOLUTION); | ||
5234 | - } | ||
5235 | |||
5236 | ret = chip->bus.write(chip->bus.client, ADT7316_CONFIG3, config3); | ||
5237 | if (ret) | ||
5238 | @@ -2123,6 +2116,13 @@ int adt7316_probe(struct device *dev, struct adt7316_bus *bus, | ||
5239 | else | ||
5240 | return -ENODEV; | ||
5241 | |||
5242 | + if (chip->id == ID_ADT7316 || chip->id == ID_ADT7516) | ||
5243 | + chip->dac_bits = 12; | ||
5244 | + else if (chip->id == ID_ADT7317 || chip->id == ID_ADT7517) | ||
5245 | + chip->dac_bits = 10; | ||
5246 | + else | ||
5247 | + chip->dac_bits = 8; | ||
5248 | + | ||
5249 | chip->ldac_pin = devm_gpiod_get_optional(dev, "adi,ldac", GPIOD_OUT_LOW); | ||
5250 | if (IS_ERR(chip->ldac_pin)) { | ||
5251 | ret = PTR_ERR(chip->ldac_pin); | ||
5252 | diff --git a/drivers/staging/media/rockchip/vpu/rk3288_vpu_hw_jpeg_enc.c b/drivers/staging/media/rockchip/vpu/rk3288_vpu_hw_jpeg_enc.c | ||
5253 | index 5282236d1bb1..06daea66fb49 100644 | ||
5254 | --- a/drivers/staging/media/rockchip/vpu/rk3288_vpu_hw_jpeg_enc.c | ||
5255 | +++ b/drivers/staging/media/rockchip/vpu/rk3288_vpu_hw_jpeg_enc.c | ||
5256 | @@ -80,7 +80,7 @@ rk3288_vpu_jpeg_enc_set_qtable(struct rockchip_vpu_dev *vpu, | ||
5257 | void rk3288_vpu_jpeg_enc_run(struct rockchip_vpu_ctx *ctx) | ||
5258 | { | ||
5259 | struct rockchip_vpu_dev *vpu = ctx->dev; | ||
5260 | - struct vb2_buffer *src_buf, *dst_buf; | ||
5261 | + struct vb2_v4l2_buffer *src_buf, *dst_buf; | ||
5262 | struct rockchip_vpu_jpeg_ctx jpeg_ctx; | ||
5263 | u32 reg; | ||
5264 | |||
5265 | @@ -88,7 +88,7 @@ void rk3288_vpu_jpeg_enc_run(struct rockchip_vpu_ctx *ctx) | ||
5266 | dst_buf = v4l2_m2m_next_dst_buf(ctx->fh.m2m_ctx); | ||
5267 | |||
5268 | memset(&jpeg_ctx, 0, sizeof(jpeg_ctx)); | ||
5269 | - jpeg_ctx.buffer = vb2_plane_vaddr(dst_buf, 0); | ||
5270 | + jpeg_ctx.buffer = vb2_plane_vaddr(&dst_buf->vb2_buf, 0); | ||
5271 | jpeg_ctx.width = ctx->dst_fmt.width; | ||
5272 | jpeg_ctx.height = ctx->dst_fmt.height; | ||
5273 | jpeg_ctx.quality = ctx->jpeg_quality; | ||
5274 | @@ -99,7 +99,7 @@ void rk3288_vpu_jpeg_enc_run(struct rockchip_vpu_ctx *ctx) | ||
5275 | VEPU_REG_ENC_CTRL); | ||
5276 | |||
5277 | rk3288_vpu_set_src_img_ctrl(vpu, ctx); | ||
5278 | - rk3288_vpu_jpeg_enc_set_buffers(vpu, ctx, src_buf); | ||
5279 | + rk3288_vpu_jpeg_enc_set_buffers(vpu, ctx, &src_buf->vb2_buf); | ||
5280 | rk3288_vpu_jpeg_enc_set_qtable(vpu, | ||
5281 | rockchip_vpu_jpeg_get_qtable(&jpeg_ctx, 0), | ||
5282 | rockchip_vpu_jpeg_get_qtable(&jpeg_ctx, 1)); | ||
5283 | diff --git a/drivers/staging/media/rockchip/vpu/rk3399_vpu_hw_jpeg_enc.c b/drivers/staging/media/rockchip/vpu/rk3399_vpu_hw_jpeg_enc.c | ||
5284 | index dbc86d95fe3b..3d438797692e 100644 | ||
5285 | --- a/drivers/staging/media/rockchip/vpu/rk3399_vpu_hw_jpeg_enc.c | ||
5286 | +++ b/drivers/staging/media/rockchip/vpu/rk3399_vpu_hw_jpeg_enc.c | ||
5287 | @@ -111,7 +111,7 @@ rk3399_vpu_jpeg_enc_set_qtable(struct rockchip_vpu_dev *vpu, | ||
5288 | void rk3399_vpu_jpeg_enc_run(struct rockchip_vpu_ctx *ctx) | ||
5289 | { | ||
5290 | struct rockchip_vpu_dev *vpu = ctx->dev; | ||
5291 | - struct vb2_buffer *src_buf, *dst_buf; | ||
5292 | + struct vb2_v4l2_buffer *src_buf, *dst_buf; | ||
5293 | struct rockchip_vpu_jpeg_ctx jpeg_ctx; | ||
5294 | u32 reg; | ||
5295 | |||
5296 | @@ -119,7 +119,7 @@ void rk3399_vpu_jpeg_enc_run(struct rockchip_vpu_ctx *ctx) | ||
5297 | dst_buf = v4l2_m2m_next_dst_buf(ctx->fh.m2m_ctx); | ||
5298 | |||
5299 | memset(&jpeg_ctx, 0, sizeof(jpeg_ctx)); | ||
5300 | - jpeg_ctx.buffer = vb2_plane_vaddr(dst_buf, 0); | ||
5301 | + jpeg_ctx.buffer = vb2_plane_vaddr(&dst_buf->vb2_buf, 0); | ||
5302 | jpeg_ctx.width = ctx->dst_fmt.width; | ||
5303 | jpeg_ctx.height = ctx->dst_fmt.height; | ||
5304 | jpeg_ctx.quality = ctx->jpeg_quality; | ||
5305 | @@ -130,7 +130,7 @@ void rk3399_vpu_jpeg_enc_run(struct rockchip_vpu_ctx *ctx) | ||
5306 | VEPU_REG_ENCODE_START); | ||
5307 | |||
5308 | rk3399_vpu_set_src_img_ctrl(vpu, ctx); | ||
5309 | - rk3399_vpu_jpeg_enc_set_buffers(vpu, ctx, src_buf); | ||
5310 | + rk3399_vpu_jpeg_enc_set_buffers(vpu, ctx, &src_buf->vb2_buf); | ||
5311 | rk3399_vpu_jpeg_enc_set_qtable(vpu, | ||
5312 | rockchip_vpu_jpeg_get_qtable(&jpeg_ctx, 0), | ||
5313 | rockchip_vpu_jpeg_get_qtable(&jpeg_ctx, 1)); | ||
5314 | diff --git a/drivers/staging/mt7621-spi/spi-mt7621.c b/drivers/staging/mt7621-spi/spi-mt7621.c | ||
5315 | index 513b6e79b985..e1f50efd0922 100644 | ||
5316 | --- a/drivers/staging/mt7621-spi/spi-mt7621.c | ||
5317 | +++ b/drivers/staging/mt7621-spi/spi-mt7621.c | ||
5318 | @@ -330,6 +330,7 @@ static int mt7621_spi_probe(struct platform_device *pdev) | ||
5319 | int status = 0; | ||
5320 | struct clk *clk; | ||
5321 | struct mt7621_spi_ops *ops; | ||
5322 | + int ret; | ||
5323 | |||
5324 | match = of_match_device(mt7621_spi_match, &pdev->dev); | ||
5325 | if (!match) | ||
5326 | @@ -377,7 +378,11 @@ static int mt7621_spi_probe(struct platform_device *pdev) | ||
5327 | rs->pending_write = 0; | ||
5328 | dev_info(&pdev->dev, "sys_freq: %u\n", rs->sys_freq); | ||
5329 | |||
5330 | - device_reset(&pdev->dev); | ||
5331 | + ret = device_reset(&pdev->dev); | ||
5332 | + if (ret) { | ||
5333 | + dev_err(&pdev->dev, "SPI reset failed!\n"); | ||
5334 | + return ret; | ||
5335 | + } | ||
5336 | |||
5337 | mt7621_spi_reset(rs); | ||
5338 | |||
5339 | diff --git a/drivers/tty/serial/8250/8250_pxa.c b/drivers/tty/serial/8250/8250_pxa.c | ||
5340 | index b9bcbe20a2be..c47188860e32 100644 | ||
5341 | --- a/drivers/tty/serial/8250/8250_pxa.c | ||
5342 | +++ b/drivers/tty/serial/8250/8250_pxa.c | ||
5343 | @@ -113,6 +113,10 @@ static int serial_pxa_probe(struct platform_device *pdev) | ||
5344 | if (ret) | ||
5345 | return ret; | ||
5346 | |||
5347 | + ret = of_alias_get_id(pdev->dev.of_node, "serial"); | ||
5348 | + if (ret >= 0) | ||
5349 | + uart.port.line = ret; | ||
5350 | + | ||
5351 | uart.port.type = PORT_XSCALE; | ||
5352 | uart.port.iotype = UPIO_MEM32; | ||
5353 | uart.port.mapbase = mmres->start; | ||
5354 | diff --git a/drivers/tty/tty_buffer.c b/drivers/tty/tty_buffer.c | ||
5355 | index 77070c2d1240..ec145a59f199 100644 | ||
5356 | --- a/drivers/tty/tty_buffer.c | ||
5357 | +++ b/drivers/tty/tty_buffer.c | ||
5358 | @@ -26,7 +26,7 @@ | ||
5359 | * Byte threshold to limit memory consumption for flip buffers. | ||
5360 | * The actual memory limit is > 2x this amount. | ||
5361 | */ | ||
5362 | -#define TTYB_DEFAULT_MEM_LIMIT 65536 | ||
5363 | +#define TTYB_DEFAULT_MEM_LIMIT (640 * 1024UL) | ||
5364 | |||
5365 | /* | ||
5366 | * We default to dicing tty buffer allocations to this many characters | ||
5367 | diff --git a/drivers/usb/chipidea/core.c b/drivers/usb/chipidea/core.c | ||
5368 | index 7bfcbb23c2a4..016e4004fe9d 100644 | ||
5369 | --- a/drivers/usb/chipidea/core.c | ||
5370 | +++ b/drivers/usb/chipidea/core.c | ||
5371 | @@ -954,8 +954,15 @@ static int ci_hdrc_probe(struct platform_device *pdev) | ||
5372 | } else if (ci->platdata->usb_phy) { | ||
5373 | ci->usb_phy = ci->platdata->usb_phy; | ||
5374 | } else { | ||
5375 | + ci->usb_phy = devm_usb_get_phy_by_phandle(dev->parent, "phys", | ||
5376 | + 0); | ||
5377 | ci->phy = devm_phy_get(dev->parent, "usb-phy"); | ||
5378 | - ci->usb_phy = devm_usb_get_phy(dev->parent, USB_PHY_TYPE_USB2); | ||
5379 | + | ||
5380 | + /* Fallback to grabbing any registered USB2 PHY */ | ||
5381 | + if (IS_ERR(ci->usb_phy) && | ||
5382 | + PTR_ERR(ci->usb_phy) != -EPROBE_DEFER) | ||
5383 | + ci->usb_phy = devm_usb_get_phy(dev->parent, | ||
5384 | + USB_PHY_TYPE_USB2); | ||
5385 | |||
5386 | /* if both generic PHY and USB PHY layers aren't enabled */ | ||
5387 | if (PTR_ERR(ci->phy) == -ENOSYS && | ||
5388 | diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c | ||
5389 | index 6c9b76bcc2e1..8d1dbe36db92 100644 | ||
5390 | --- a/drivers/usb/dwc3/gadget.c | ||
5391 | +++ b/drivers/usb/dwc3/gadget.c | ||
5392 | @@ -3339,6 +3339,8 @@ int dwc3_gadget_init(struct dwc3 *dwc) | ||
5393 | goto err4; | ||
5394 | } | ||
5395 | |||
5396 | + dwc3_gadget_set_speed(&dwc->gadget, dwc->maximum_speed); | ||
5397 | + | ||
5398 | return 0; | ||
5399 | |||
5400 | err4: | ||
5401 | diff --git a/drivers/usb/gadget/function/f_fs.c b/drivers/usb/gadget/function/f_fs.c | ||
5402 | index 1e5430438703..0f8d16de7a37 100644 | ||
5403 | --- a/drivers/usb/gadget/function/f_fs.c | ||
5404 | +++ b/drivers/usb/gadget/function/f_fs.c | ||
5405 | @@ -1082,6 +1082,7 @@ static ssize_t ffs_epfile_io(struct file *file, struct ffs_io_data *io_data) | ||
5406 | * condition with req->complete callback. | ||
5407 | */ | ||
5408 | usb_ep_dequeue(ep->ep, req); | ||
5409 | + wait_for_completion(&done); | ||
5410 | interrupted = ep->status < 0; | ||
5411 | } | ||
5412 | |||
5413 | diff --git a/drivers/video/backlight/pwm_bl.c b/drivers/video/backlight/pwm_bl.c | ||
5414 | index feb90764a811..53b8ceea9bde 100644 | ||
5415 | --- a/drivers/video/backlight/pwm_bl.c | ||
5416 | +++ b/drivers/video/backlight/pwm_bl.c | ||
5417 | @@ -435,7 +435,7 @@ static int pwm_backlight_initial_power_state(const struct pwm_bl_data *pb) | ||
5418 | */ | ||
5419 | |||
5420 | /* if the enable GPIO is disabled, do not enable the backlight */ | ||
5421 | - if (pb->enable_gpio && gpiod_get_value(pb->enable_gpio) == 0) | ||
5422 | + if (pb->enable_gpio && gpiod_get_value_cansleep(pb->enable_gpio) == 0) | ||
5423 | return FB_BLANK_POWERDOWN; | ||
5424 | |||
5425 | /* The regulator is disabled, do not enable the backlight */ | ||
5426 | diff --git a/drivers/video/fbdev/core/fbmem.c b/drivers/video/fbdev/core/fbmem.c | ||
5427 | index cb43a2258c51..4721491e6c8c 100644 | ||
5428 | --- a/drivers/video/fbdev/core/fbmem.c | ||
5429 | +++ b/drivers/video/fbdev/core/fbmem.c | ||
5430 | @@ -431,6 +431,9 @@ static void fb_do_show_logo(struct fb_info *info, struct fb_image *image, | ||
5431 | { | ||
5432 | unsigned int x; | ||
5433 | |||
5434 | + if (image->width > info->var.xres || image->height > info->var.yres) | ||
5435 | + return; | ||
5436 | + | ||
5437 | if (rotate == FB_ROTATE_UR) { | ||
5438 | for (x = 0; | ||
5439 | x < num && image->dx + image->width <= info->var.xres; | ||
5440 | diff --git a/drivers/xen/gntdev-dmabuf.c b/drivers/xen/gntdev-dmabuf.c | ||
5441 | index cba6b586bfbd..d97fcfc5e558 100644 | ||
5442 | --- a/drivers/xen/gntdev-dmabuf.c | ||
5443 | +++ b/drivers/xen/gntdev-dmabuf.c | ||
5444 | @@ -80,6 +80,12 @@ struct gntdev_dmabuf_priv { | ||
5445 | struct list_head imp_list; | ||
5446 | /* This is the lock which protects dma_buf_xxx lists. */ | ||
5447 | struct mutex lock; | ||
5448 | + /* | ||
5449 | + * We reference this file while exporting dma-bufs, so | ||
5450 | + * the grant device context is not destroyed while there are | ||
5451 | + * external users alive. | ||
5452 | + */ | ||
5453 | + struct file *filp; | ||
5454 | }; | ||
5455 | |||
5456 | /* DMA buffer export support. */ | ||
5457 | @@ -311,6 +317,7 @@ static void dmabuf_exp_release(struct kref *kref) | ||
5458 | |||
5459 | dmabuf_exp_wait_obj_signal(gntdev_dmabuf->priv, gntdev_dmabuf); | ||
5460 | list_del(&gntdev_dmabuf->next); | ||
5461 | + fput(gntdev_dmabuf->priv->filp); | ||
5462 | kfree(gntdev_dmabuf); | ||
5463 | } | ||
5464 | |||
5465 | @@ -423,6 +430,7 @@ static int dmabuf_exp_from_pages(struct gntdev_dmabuf_export_args *args) | ||
5466 | mutex_lock(&args->dmabuf_priv->lock); | ||
5467 | list_add(&gntdev_dmabuf->next, &args->dmabuf_priv->exp_list); | ||
5468 | mutex_unlock(&args->dmabuf_priv->lock); | ||
5469 | + get_file(gntdev_dmabuf->priv->filp); | ||
5470 | return 0; | ||
5471 | |||
5472 | fail: | ||
5473 | @@ -834,7 +842,7 @@ long gntdev_ioctl_dmabuf_imp_release(struct gntdev_priv *priv, | ||
5474 | return dmabuf_imp_release(priv->dmabuf_priv, op.fd); | ||
5475 | } | ||
5476 | |||
5477 | -struct gntdev_dmabuf_priv *gntdev_dmabuf_init(void) | ||
5478 | +struct gntdev_dmabuf_priv *gntdev_dmabuf_init(struct file *filp) | ||
5479 | { | ||
5480 | struct gntdev_dmabuf_priv *priv; | ||
5481 | |||
5482 | @@ -847,6 +855,8 @@ struct gntdev_dmabuf_priv *gntdev_dmabuf_init(void) | ||
5483 | INIT_LIST_HEAD(&priv->exp_wait_list); | ||
5484 | INIT_LIST_HEAD(&priv->imp_list); | ||
5485 | |||
5486 | + priv->filp = filp; | ||
5487 | + | ||
5488 | return priv; | ||
5489 | } | ||
5490 | |||
5491 | diff --git a/drivers/xen/gntdev-dmabuf.h b/drivers/xen/gntdev-dmabuf.h | ||
5492 | index 7220a53d0fc5..3d9b9cf9d5a1 100644 | ||
5493 | --- a/drivers/xen/gntdev-dmabuf.h | ||
5494 | +++ b/drivers/xen/gntdev-dmabuf.h | ||
5495 | @@ -14,7 +14,7 @@ | ||
5496 | struct gntdev_dmabuf_priv; | ||
5497 | struct gntdev_priv; | ||
5498 | |||
5499 | -struct gntdev_dmabuf_priv *gntdev_dmabuf_init(void); | ||
5500 | +struct gntdev_dmabuf_priv *gntdev_dmabuf_init(struct file *filp); | ||
5501 | |||
5502 | void gntdev_dmabuf_fini(struct gntdev_dmabuf_priv *priv); | ||
5503 | |||
5504 | diff --git a/drivers/xen/gntdev.c b/drivers/xen/gntdev.c | ||
5505 | index 5efc5eee9544..7cf9c51318aa 100644 | ||
5506 | --- a/drivers/xen/gntdev.c | ||
5507 | +++ b/drivers/xen/gntdev.c | ||
5508 | @@ -600,7 +600,7 @@ static int gntdev_open(struct inode *inode, struct file *flip) | ||
5509 | mutex_init(&priv->lock); | ||
5510 | |||
5511 | #ifdef CONFIG_XEN_GNTDEV_DMABUF | ||
5512 | - priv->dmabuf_priv = gntdev_dmabuf_init(); | ||
5513 | + priv->dmabuf_priv = gntdev_dmabuf_init(flip); | ||
5514 | if (IS_ERR(priv->dmabuf_priv)) { | ||
5515 | ret = PTR_ERR(priv->dmabuf_priv); | ||
5516 | kfree(priv); | ||
5517 | diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c | ||
5518 | index 0a6615573351..1b68700bc1c5 100644 | ||
5519 | --- a/fs/btrfs/extent-tree.c | ||
5520 | +++ b/fs/btrfs/extent-tree.c | ||
5521 | @@ -4808,6 +4808,7 @@ skip_async: | ||
5522 | } | ||
5523 | |||
5524 | struct reserve_ticket { | ||
5525 | + u64 orig_bytes; | ||
5526 | u64 bytes; | ||
5527 | int error; | ||
5528 | struct list_head list; | ||
5529 | @@ -5030,7 +5031,7 @@ static inline int need_do_async_reclaim(struct btrfs_fs_info *fs_info, | ||
5530 | !test_bit(BTRFS_FS_STATE_REMOUNTING, &fs_info->fs_state)); | ||
5531 | } | ||
5532 | |||
5533 | -static void wake_all_tickets(struct list_head *head) | ||
5534 | +static bool wake_all_tickets(struct list_head *head) | ||
5535 | { | ||
5536 | struct reserve_ticket *ticket; | ||
5537 | |||
5538 | @@ -5039,7 +5040,10 @@ static void wake_all_tickets(struct list_head *head) | ||
5539 | list_del_init(&ticket->list); | ||
5540 | ticket->error = -ENOSPC; | ||
5541 | wake_up(&ticket->wait); | ||
5542 | + if (ticket->bytes != ticket->orig_bytes) | ||
5543 | + return true; | ||
5544 | } | ||
5545 | + return false; | ||
5546 | } | ||
5547 | |||
5548 | /* | ||
5549 | @@ -5094,8 +5098,12 @@ static void btrfs_async_reclaim_metadata_space(struct work_struct *work) | ||
5550 | if (flush_state > COMMIT_TRANS) { | ||
5551 | commit_cycles++; | ||
5552 | if (commit_cycles > 2) { | ||
5553 | - wake_all_tickets(&space_info->tickets); | ||
5554 | - space_info->flush = 0; | ||
5555 | + if (wake_all_tickets(&space_info->tickets)) { | ||
5556 | + flush_state = FLUSH_DELAYED_ITEMS_NR; | ||
5557 | + commit_cycles--; | ||
5558 | + } else { | ||
5559 | + space_info->flush = 0; | ||
5560 | + } | ||
5561 | } else { | ||
5562 | flush_state = FLUSH_DELAYED_ITEMS_NR; | ||
5563 | } | ||
5564 | @@ -5147,10 +5155,11 @@ static void priority_reclaim_metadata_space(struct btrfs_fs_info *fs_info, | ||
5565 | |||
5566 | static int wait_reserve_ticket(struct btrfs_fs_info *fs_info, | ||
5567 | struct btrfs_space_info *space_info, | ||
5568 | - struct reserve_ticket *ticket, u64 orig_bytes) | ||
5569 | + struct reserve_ticket *ticket) | ||
5570 | |||
5571 | { | ||
5572 | DEFINE_WAIT(wait); | ||
5573 | + u64 reclaim_bytes = 0; | ||
5574 | int ret = 0; | ||
5575 | |||
5576 | spin_lock(&space_info->lock); | ||
5577 | @@ -5171,14 +5180,12 @@ static int wait_reserve_ticket(struct btrfs_fs_info *fs_info, | ||
5578 | ret = ticket->error; | ||
5579 | if (!list_empty(&ticket->list)) | ||
5580 | list_del_init(&ticket->list); | ||
5581 | - if (ticket->bytes && ticket->bytes < orig_bytes) { | ||
5582 | - u64 num_bytes = orig_bytes - ticket->bytes; | ||
5583 | - update_bytes_may_use(space_info, -num_bytes); | ||
5584 | - trace_btrfs_space_reservation(fs_info, "space_info", | ||
5585 | - space_info->flags, num_bytes, 0); | ||
5586 | - } | ||
5587 | + if (ticket->bytes && ticket->bytes < ticket->orig_bytes) | ||
5588 | + reclaim_bytes = ticket->orig_bytes - ticket->bytes; | ||
5589 | spin_unlock(&space_info->lock); | ||
5590 | |||
5591 | + if (reclaim_bytes) | ||
5592 | + space_info_add_old_bytes(fs_info, space_info, reclaim_bytes); | ||
5593 | return ret; | ||
5594 | } | ||
5595 | |||
5596 | @@ -5204,6 +5211,7 @@ static int __reserve_metadata_bytes(struct btrfs_fs_info *fs_info, | ||
5597 | { | ||
5598 | struct reserve_ticket ticket; | ||
5599 | u64 used; | ||
5600 | + u64 reclaim_bytes = 0; | ||
5601 | int ret = 0; | ||
5602 | |||
5603 | ASSERT(orig_bytes); | ||
5604 | @@ -5239,6 +5247,7 @@ static int __reserve_metadata_bytes(struct btrfs_fs_info *fs_info, | ||
5605 | * the list and we will do our own flushing further down. | ||
5606 | */ | ||
5607 | if (ret && flush != BTRFS_RESERVE_NO_FLUSH) { | ||
5608 | + ticket.orig_bytes = orig_bytes; | ||
5609 | ticket.bytes = orig_bytes; | ||
5610 | ticket.error = 0; | ||
5611 | init_waitqueue_head(&ticket.wait); | ||
5612 | @@ -5279,25 +5288,21 @@ static int __reserve_metadata_bytes(struct btrfs_fs_info *fs_info, | ||
5613 | return ret; | ||
5614 | |||
5615 | if (flush == BTRFS_RESERVE_FLUSH_ALL) | ||
5616 | - return wait_reserve_ticket(fs_info, space_info, &ticket, | ||
5617 | - orig_bytes); | ||
5618 | + return wait_reserve_ticket(fs_info, space_info, &ticket); | ||
5619 | |||
5620 | ret = 0; | ||
5621 | priority_reclaim_metadata_space(fs_info, space_info, &ticket); | ||
5622 | spin_lock(&space_info->lock); | ||
5623 | if (ticket.bytes) { | ||
5624 | - if (ticket.bytes < orig_bytes) { | ||
5625 | - u64 num_bytes = orig_bytes - ticket.bytes; | ||
5626 | - update_bytes_may_use(space_info, -num_bytes); | ||
5627 | - trace_btrfs_space_reservation(fs_info, "space_info", | ||
5628 | - space_info->flags, | ||
5629 | - num_bytes, 0); | ||
5630 | - | ||
5631 | - } | ||
5632 | + if (ticket.bytes < orig_bytes) | ||
5633 | + reclaim_bytes = orig_bytes - ticket.bytes; | ||
5634 | list_del_init(&ticket.list); | ||
5635 | ret = -ENOSPC; | ||
5636 | } | ||
5637 | spin_unlock(&space_info->lock); | ||
5638 | + | ||
5639 | + if (reclaim_bytes) | ||
5640 | + space_info_add_old_bytes(fs_info, space_info, reclaim_bytes); | ||
5641 | ASSERT(list_empty(&ticket.list)); | ||
5642 | return ret; | ||
5643 | } | ||
5644 | @@ -8690,6 +8695,8 @@ struct walk_control { | ||
5645 | u64 refs[BTRFS_MAX_LEVEL]; | ||
5646 | u64 flags[BTRFS_MAX_LEVEL]; | ||
5647 | struct btrfs_key update_progress; | ||
5648 | + struct btrfs_key drop_progress; | ||
5649 | + int drop_level; | ||
5650 | int stage; | ||
5651 | int level; | ||
5652 | int shared_level; | ||
5653 | @@ -9028,6 +9035,16 @@ skip: | ||
5654 | ret); | ||
5655 | } | ||
5656 | } | ||
5657 | + | ||
5658 | + /* | ||
5659 | + * We need to update the next key in our walk control so we can | ||
5660 | + * update the drop_progress key accordingly. We don't care if | ||
5661 | + * find_next_key doesn't find a key because that means we're at | ||
5662 | + * the end and are going to clean up now. | ||
5663 | + */ | ||
5664 | + wc->drop_level = level; | ||
5665 | + find_next_key(path, level, &wc->drop_progress); | ||
5666 | + | ||
5667 | ret = btrfs_free_extent(trans, root, bytenr, fs_info->nodesize, | ||
5668 | parent, root->root_key.objectid, | ||
5669 | level - 1, 0); | ||
5670 | @@ -9378,12 +9395,14 @@ int btrfs_drop_snapshot(struct btrfs_root *root, | ||
5671 | } | ||
5672 | |||
5673 | if (wc->stage == DROP_REFERENCE) { | ||
5674 | - level = wc->level; | ||
5675 | - btrfs_node_key(path->nodes[level], | ||
5676 | - &root_item->drop_progress, | ||
5677 | - path->slots[level]); | ||
5678 | - root_item->drop_level = level; | ||
5679 | - } | ||
5680 | + wc->drop_level = wc->level; | ||
5681 | + btrfs_node_key_to_cpu(path->nodes[wc->drop_level], | ||
5682 | + &wc->drop_progress, | ||
5683 | + path->slots[wc->drop_level]); | ||
5684 | + } | ||
5685 | + btrfs_cpu_key_to_disk(&root_item->drop_progress, | ||
5686 | + &wc->drop_progress); | ||
5687 | + root_item->drop_level = wc->drop_level; | ||
5688 | |||
5689 | BUG_ON(wc->level == 0); | ||
5690 | if (btrfs_should_end_transaction(trans) || | ||
5691 | diff --git a/fs/btrfs/qgroup.c b/fs/btrfs/qgroup.c | ||
5692 | index 543dd5e66f31..e28fb43e943b 100644 | ||
5693 | --- a/fs/btrfs/qgroup.c | ||
5694 | +++ b/fs/btrfs/qgroup.c | ||
5695 | @@ -2842,16 +2842,15 @@ out: | ||
5696 | /* | ||
5697 | * Two limits to commit transaction in advance. | ||
5698 | * | ||
5699 | - * For RATIO, it will be 1/RATIO of the remaining limit | ||
5700 | - * (excluding data and prealloc meta) as threshold. | ||
5701 | + * For RATIO, it will be 1/RATIO of the remaining limit as threshold. | ||
5702 | * For SIZE, it will be in byte unit as threshold. | ||
5703 | */ | ||
5704 | -#define QGROUP_PERTRANS_RATIO 32 | ||
5705 | -#define QGROUP_PERTRANS_SIZE SZ_32M | ||
5706 | +#define QGROUP_FREE_RATIO 32 | ||
5707 | +#define QGROUP_FREE_SIZE SZ_32M | ||
5708 | static bool qgroup_check_limits(struct btrfs_fs_info *fs_info, | ||
5709 | const struct btrfs_qgroup *qg, u64 num_bytes) | ||
5710 | { | ||
5711 | - u64 limit; | ||
5712 | + u64 free; | ||
5713 | u64 threshold; | ||
5714 | |||
5715 | if ((qg->lim_flags & BTRFS_QGROUP_LIMIT_MAX_RFER) && | ||
5716 | @@ -2870,20 +2869,21 @@ static bool qgroup_check_limits(struct btrfs_fs_info *fs_info, | ||
5717 | */ | ||
5718 | if ((qg->lim_flags & (BTRFS_QGROUP_LIMIT_MAX_RFER | | ||
5719 | BTRFS_QGROUP_LIMIT_MAX_EXCL))) { | ||
5720 | - if (qg->lim_flags & BTRFS_QGROUP_LIMIT_MAX_EXCL) | ||
5721 | - limit = qg->max_excl; | ||
5722 | - else | ||
5723 | - limit = qg->max_rfer; | ||
5724 | - threshold = (limit - qg->rsv.values[BTRFS_QGROUP_RSV_DATA] - | ||
5725 | - qg->rsv.values[BTRFS_QGROUP_RSV_META_PREALLOC]) / | ||
5726 | - QGROUP_PERTRANS_RATIO; | ||
5727 | - threshold = min_t(u64, threshold, QGROUP_PERTRANS_SIZE); | ||
5728 | + if (qg->lim_flags & BTRFS_QGROUP_LIMIT_MAX_EXCL) { | ||
5729 | + free = qg->max_excl - qgroup_rsv_total(qg) - qg->excl; | ||
5730 | + threshold = min_t(u64, qg->max_excl / QGROUP_FREE_RATIO, | ||
5731 | + QGROUP_FREE_SIZE); | ||
5732 | + } else { | ||
5733 | + free = qg->max_rfer - qgroup_rsv_total(qg) - qg->rfer; | ||
5734 | + threshold = min_t(u64, qg->max_rfer / QGROUP_FREE_RATIO, | ||
5735 | + QGROUP_FREE_SIZE); | ||
5736 | + } | ||
5737 | |||
5738 | /* | ||
5739 | * Use transaction_kthread to commit transaction, so we no | ||
5740 | * longer need to bother nested transaction nor lock context. | ||
5741 | */ | ||
5742 | - if (qg->rsv.values[BTRFS_QGROUP_RSV_META_PERTRANS] > threshold) | ||
5743 | + if (free < threshold) | ||
5744 | btrfs_commit_transaction_locksafe(fs_info); | ||
5745 | } | ||
5746 | |||
5747 | diff --git a/fs/buffer.c b/fs/buffer.c | ||
5748 | index 48318fb74938..cab7a026876b 100644 | ||
5749 | --- a/fs/buffer.c | ||
5750 | +++ b/fs/buffer.c | ||
5751 | @@ -3027,6 +3027,13 @@ void guard_bio_eod(int op, struct bio *bio) | ||
5752 | /* Uhhuh. We've got a bio that straddles the device size! */ | ||
5753 | truncated_bytes = bio->bi_iter.bi_size - (maxsector << 9); | ||
5754 | |||
5755 | + /* | ||
5756 | + * The bio contains more than one segment which spans EOD, just return | ||
5757 | + * and let IO layer turn it into an EIO | ||
5758 | + */ | ||
5759 | + if (truncated_bytes > bvec->bv_len) | ||
5760 | + return; | ||
5761 | + | ||
5762 | /* Truncate the bio.. */ | ||
5763 | bio->bi_iter.bi_size -= truncated_bytes; | ||
5764 | bvec->bv_len -= truncated_bytes; | ||
5765 | diff --git a/fs/cifs/cifs_dfs_ref.c b/fs/cifs/cifs_dfs_ref.c | ||
5766 | index d9b99abe1243..5d83c924cc47 100644 | ||
5767 | --- a/fs/cifs/cifs_dfs_ref.c | ||
5768 | +++ b/fs/cifs/cifs_dfs_ref.c | ||
5769 | @@ -285,9 +285,9 @@ static void dump_referral(const struct dfs_info3_param *ref) | ||
5770 | { | ||
5771 | cifs_dbg(FYI, "DFS: ref path: %s\n", ref->path_name); | ||
5772 | cifs_dbg(FYI, "DFS: node path: %s\n", ref->node_name); | ||
5773 | - cifs_dbg(FYI, "DFS: fl: %hd, srv_type: %hd\n", | ||
5774 | + cifs_dbg(FYI, "DFS: fl: %d, srv_type: %d\n", | ||
5775 | ref->flags, ref->server_type); | ||
5776 | - cifs_dbg(FYI, "DFS: ref_flags: %hd, path_consumed: %hd\n", | ||
5777 | + cifs_dbg(FYI, "DFS: ref_flags: %d, path_consumed: %d\n", | ||
5778 | ref->ref_flag, ref->path_consumed); | ||
5779 | } | ||
5780 | |||
5781 | diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c | ||
5782 | index e61cd2938c9e..9d4e60123db4 100644 | ||
5783 | --- a/fs/cifs/connect.c | ||
5784 | +++ b/fs/cifs/connect.c | ||
5785 | @@ -1487,6 +1487,11 @@ cifs_parse_devname(const char *devname, struct smb_vol *vol) | ||
5786 | const char *delims = "/\\"; | ||
5787 | size_t len; | ||
5788 | |||
5789 | + if (unlikely(!devname || !*devname)) { | ||
5790 | + cifs_dbg(VFS, "Device name not specified.\n"); | ||
5791 | + return -EINVAL; | ||
5792 | + } | ||
5793 | + | ||
5794 | /* make sure we have a valid UNC double delimiter prefix */ | ||
5795 | len = strspn(devname, delims); | ||
5796 | if (len != 2) | ||
5797 | diff --git a/fs/cifs/file.c b/fs/cifs/file.c | ||
5798 | index 95461db80011..8d107587208f 100644 | ||
5799 | --- a/fs/cifs/file.c | ||
5800 | +++ b/fs/cifs/file.c | ||
5801 | @@ -1645,8 +1645,20 @@ cifs_setlk(struct file *file, struct file_lock *flock, __u32 type, | ||
5802 | rc = server->ops->mand_unlock_range(cfile, flock, xid); | ||
5803 | |||
5804 | out: | ||
5805 | - if (flock->fl_flags & FL_POSIX && !rc) | ||
5806 | + if (flock->fl_flags & FL_POSIX) { | ||
5807 | + /* | ||
5808 | + * If this is a request to remove all locks because we | ||
5809 | + * are closing the file, it doesn't matter if the | ||
5810 | + * unlocking failed as both cifs.ko and the SMB server | ||
5811 | + * remove the lock on file close | ||
5812 | + */ | ||
5813 | + if (rc) { | ||
5814 | + cifs_dbg(VFS, "%s failed rc=%d\n", __func__, rc); | ||
5815 | + if (!(flock->fl_flags & FL_CLOSE)) | ||
5816 | + return rc; | ||
5817 | + } | ||
5818 | rc = locks_lock_file_wait(file, flock); | ||
5819 | + } | ||
5820 | return rc; | ||
5821 | } | ||
5822 | |||
5823 | diff --git a/fs/cifs/smb1ops.c b/fs/cifs/smb1ops.c | ||
5824 | index 32a6c020478f..20a88776f04d 100644 | ||
5825 | --- a/fs/cifs/smb1ops.c | ||
5826 | +++ b/fs/cifs/smb1ops.c | ||
5827 | @@ -308,7 +308,7 @@ coalesce_t2(char *second_buf, struct smb_hdr *target_hdr) | ||
5828 | remaining = tgt_total_cnt - total_in_tgt; | ||
5829 | |||
5830 | if (remaining < 0) { | ||
5831 | - cifs_dbg(FYI, "Server sent too much data. tgt_total_cnt=%hu total_in_tgt=%hu\n", | ||
5832 | + cifs_dbg(FYI, "Server sent too much data. tgt_total_cnt=%hu total_in_tgt=%u\n", | ||
5833 | tgt_total_cnt, total_in_tgt); | ||
5834 | return -EPROTO; | ||
5835 | } | ||
5836 | diff --git a/fs/cifs/smb2pdu.c b/fs/cifs/smb2pdu.c | ||
5837 | index 104905732fbe..53642a237bf9 100644 | ||
5838 | --- a/fs/cifs/smb2pdu.c | ||
5839 | +++ b/fs/cifs/smb2pdu.c | ||
5840 | @@ -986,8 +986,14 @@ int smb3_validate_negotiate(const unsigned int xid, struct cifs_tcon *tcon) | ||
5841 | rc = SMB2_ioctl(xid, tcon, NO_FILE_ID, NO_FILE_ID, | ||
5842 | FSCTL_VALIDATE_NEGOTIATE_INFO, true /* is_fsctl */, | ||
5843 | (char *)pneg_inbuf, inbuflen, (char **)&pneg_rsp, &rsplen); | ||
5844 | - | ||
5845 | - if (rc != 0) { | ||
5846 | + if (rc == -EOPNOTSUPP) { | ||
5847 | + /* | ||
5848 | + * Old Windows versions or Netapp SMB server can return | ||
5849 | + * not supported error. Client should accept it. | ||
5850 | + */ | ||
5851 | + cifs_dbg(VFS, "Server does not support validate negotiate\n"); | ||
5852 | + return 0; | ||
5853 | + } else if (rc != 0) { | ||
5854 | cifs_dbg(VFS, "validate protocol negotiate failed: %d\n", rc); | ||
5855 | rc = -EIO; | ||
5856 | goto out_free_inbuf; | ||
5857 | diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c | ||
5858 | index 240b6dea5441..252bbbb5a2f4 100644 | ||
5859 | --- a/fs/ext4/extents.c | ||
5860 | +++ b/fs/ext4/extents.c | ||
5861 | @@ -2956,14 +2956,17 @@ again: | ||
5862 | if (err < 0) | ||
5863 | goto out; | ||
5864 | |||
5865 | - } else if (sbi->s_cluster_ratio > 1 && end >= ex_end) { | ||
5866 | + } else if (sbi->s_cluster_ratio > 1 && end >= ex_end && | ||
5867 | + partial.state == initial) { | ||
5868 | /* | ||
5869 | - * If there's an extent to the right its first cluster | ||
5870 | - * contains the immediate right boundary of the | ||
5871 | - * truncated/punched region. Set partial_cluster to | ||
5872 | - * its negative value so it won't be freed if shared | ||
5873 | - * with the current extent. The end < ee_block case | ||
5874 | - * is handled in ext4_ext_rm_leaf(). | ||
5875 | + * If we're punching, there's an extent to the right. | ||
5876 | + * If the partial cluster hasn't been set, set it to | ||
5877 | + * that extent's first cluster and its state to nofree | ||
5878 | + * so it won't be freed should it contain blocks to be | ||
5879 | + * removed. If it's already set (tofree/nofree), we're | ||
5880 | + * retrying and keep the original partial cluster info | ||
5881 | + * so a cluster marked tofree as a result of earlier | ||
5882 | + * extent removal is not lost. | ||
5883 | */ | ||
5884 | lblk = ex_end + 1; | ||
5885 | err = ext4_ext_search_right(inode, path, &lblk, &pblk, | ||
5886 | diff --git a/fs/ext4/indirect.c b/fs/ext4/indirect.c | ||
5887 | index 9e96a0bd08d9..e1801b288847 100644 | ||
5888 | --- a/fs/ext4/indirect.c | ||
5889 | +++ b/fs/ext4/indirect.c | ||
5890 | @@ -1219,6 +1219,7 @@ int ext4_ind_remove_space(handle_t *handle, struct inode *inode, | ||
5891 | ext4_lblk_t offsets[4], offsets2[4]; | ||
5892 | Indirect chain[4], chain2[4]; | ||
5893 | Indirect *partial, *partial2; | ||
5894 | + Indirect *p = NULL, *p2 = NULL; | ||
5895 | ext4_lblk_t max_block; | ||
5896 | __le32 nr = 0, nr2 = 0; | ||
5897 | int n = 0, n2 = 0; | ||
5898 | @@ -1260,7 +1261,7 @@ int ext4_ind_remove_space(handle_t *handle, struct inode *inode, | ||
5899 | } | ||
5900 | |||
5901 | |||
5902 | - partial = ext4_find_shared(inode, n, offsets, chain, &nr); | ||
5903 | + partial = p = ext4_find_shared(inode, n, offsets, chain, &nr); | ||
5904 | if (nr) { | ||
5905 | if (partial == chain) { | ||
5906 | /* Shared branch grows from the inode */ | ||
5907 | @@ -1285,13 +1286,11 @@ int ext4_ind_remove_space(handle_t *handle, struct inode *inode, | ||
5908 | partial->p + 1, | ||
5909 | (__le32 *)partial->bh->b_data+addr_per_block, | ||
5910 | (chain+n-1) - partial); | ||
5911 | - BUFFER_TRACE(partial->bh, "call brelse"); | ||
5912 | - brelse(partial->bh); | ||
5913 | partial--; | ||
5914 | } | ||
5915 | |||
5916 | end_range: | ||
5917 | - partial2 = ext4_find_shared(inode, n2, offsets2, chain2, &nr2); | ||
5918 | + partial2 = p2 = ext4_find_shared(inode, n2, offsets2, chain2, &nr2); | ||
5919 | if (nr2) { | ||
5920 | if (partial2 == chain2) { | ||
5921 | /* | ||
5922 | @@ -1321,16 +1320,14 @@ end_range: | ||
5923 | (__le32 *)partial2->bh->b_data, | ||
5924 | partial2->p, | ||
5925 | (chain2+n2-1) - partial2); | ||
5926 | - BUFFER_TRACE(partial2->bh, "call brelse"); | ||
5927 | - brelse(partial2->bh); | ||
5928 | partial2--; | ||
5929 | } | ||
5930 | goto do_indirects; | ||
5931 | } | ||
5932 | |||
5933 | /* Punch happened within the same level (n == n2) */ | ||
5934 | - partial = ext4_find_shared(inode, n, offsets, chain, &nr); | ||
5935 | - partial2 = ext4_find_shared(inode, n2, offsets2, chain2, &nr2); | ||
5936 | + partial = p = ext4_find_shared(inode, n, offsets, chain, &nr); | ||
5937 | + partial2 = p2 = ext4_find_shared(inode, n2, offsets2, chain2, &nr2); | ||
5938 | |||
5939 | /* Free top, but only if partial2 isn't its subtree. */ | ||
5940 | if (nr) { | ||
5941 | @@ -1387,15 +1384,7 @@ end_range: | ||
5942 | partial->p + 1, | ||
5943 | partial2->p, | ||
5944 | (chain+n-1) - partial); | ||
5945 | - while (partial > chain) { | ||
5946 | - BUFFER_TRACE(partial->bh, "call brelse"); | ||
5947 | - brelse(partial->bh); | ||
5948 | - } | ||
5949 | - while (partial2 > chain2) { | ||
5950 | - BUFFER_TRACE(partial2->bh, "call brelse"); | ||
5951 | - brelse(partial2->bh); | ||
5952 | - } | ||
5953 | - return 0; | ||
5954 | + goto cleanup; | ||
5955 | } | ||
5956 | |||
5957 | /* | ||
5958 | @@ -1410,8 +1399,6 @@ end_range: | ||
5959 | partial->p + 1, | ||
5960 | (__le32 *)partial->bh->b_data+addr_per_block, | ||
5961 | (chain+n-1) - partial); | ||
5962 | - BUFFER_TRACE(partial->bh, "call brelse"); | ||
5963 | - brelse(partial->bh); | ||
5964 | partial--; | ||
5965 | } | ||
5966 | if (partial2 > chain2 && depth2 <= depth) { | ||
5967 | @@ -1419,11 +1406,21 @@ end_range: | ||
5968 | (__le32 *)partial2->bh->b_data, | ||
5969 | partial2->p, | ||
5970 | (chain2+n2-1) - partial2); | ||
5971 | - BUFFER_TRACE(partial2->bh, "call brelse"); | ||
5972 | - brelse(partial2->bh); | ||
5973 | partial2--; | ||
5974 | } | ||
5975 | } | ||
5976 | + | ||
5977 | +cleanup: | ||
5978 | + while (p && p > chain) { | ||
5979 | + BUFFER_TRACE(p->bh, "call brelse"); | ||
5980 | + brelse(p->bh); | ||
5981 | + p--; | ||
5982 | + } | ||
5983 | + while (p2 && p2 > chain2) { | ||
5984 | + BUFFER_TRACE(p2->bh, "call brelse"); | ||
5985 | + brelse(p2->bh); | ||
5986 | + p2--; | ||
5987 | + } | ||
5988 | return 0; | ||
5989 | |||
5990 | do_indirects: | ||
5991 | @@ -1431,7 +1428,7 @@ do_indirects: | ||
5992 | switch (offsets[0]) { | ||
5993 | default: | ||
5994 | if (++n >= n2) | ||
5995 | - return 0; | ||
5996 | + break; | ||
5997 | nr = i_data[EXT4_IND_BLOCK]; | ||
5998 | if (nr) { | ||
5999 | ext4_free_branches(handle, inode, NULL, &nr, &nr+1, 1); | ||
6000 | @@ -1439,7 +1436,7 @@ do_indirects: | ||
6001 | } | ||
6002 | case EXT4_IND_BLOCK: | ||
6003 | if (++n >= n2) | ||
6004 | - return 0; | ||
6005 | + break; | ||
6006 | nr = i_data[EXT4_DIND_BLOCK]; | ||
6007 | if (nr) { | ||
6008 | ext4_free_branches(handle, inode, NULL, &nr, &nr+1, 2); | ||
6009 | @@ -1447,7 +1444,7 @@ do_indirects: | ||
6010 | } | ||
6011 | case EXT4_DIND_BLOCK: | ||
6012 | if (++n >= n2) | ||
6013 | - return 0; | ||
6014 | + break; | ||
6015 | nr = i_data[EXT4_TIND_BLOCK]; | ||
6016 | if (nr) { | ||
6017 | ext4_free_branches(handle, inode, NULL, &nr, &nr+1, 3); | ||
6018 | @@ -1456,5 +1453,5 @@ do_indirects: | ||
6019 | case EXT4_TIND_BLOCK: | ||
6020 | ; | ||
6021 | } | ||
6022 | - return 0; | ||
6023 | + goto cleanup; | ||
6024 | } | ||
6025 | diff --git a/fs/f2fs/extent_cache.c b/fs/f2fs/extent_cache.c | ||
6026 | index 1cb0fcc67d2d..caf77fe8ac07 100644 | ||
6027 | --- a/fs/f2fs/extent_cache.c | ||
6028 | +++ b/fs/f2fs/extent_cache.c | ||
6029 | @@ -506,7 +506,7 @@ static void f2fs_update_extent_tree_range(struct inode *inode, | ||
6030 | unsigned int end = fofs + len; | ||
6031 | unsigned int pos = (unsigned int)fofs; | ||
6032 | bool updated = false; | ||
6033 | - bool leftmost; | ||
6034 | + bool leftmost = false; | ||
6035 | |||
6036 | if (!et) | ||
6037 | return; | ||
6038 | diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h | ||
6039 | index 12fabd6735dd..279bc00489cc 100644 | ||
6040 | --- a/fs/f2fs/f2fs.h | ||
6041 | +++ b/fs/f2fs/f2fs.h | ||
6042 | @@ -456,7 +456,6 @@ struct f2fs_flush_device { | ||
6043 | |||
6044 | /* for inline stuff */ | ||
6045 | #define DEF_INLINE_RESERVED_SIZE 1 | ||
6046 | -#define DEF_MIN_INLINE_SIZE 1 | ||
6047 | static inline int get_extra_isize(struct inode *inode); | ||
6048 | static inline int get_inline_xattr_addrs(struct inode *inode); | ||
6049 | #define MAX_INLINE_DATA(inode) (sizeof(__le32) * \ | ||
6050 | diff --git a/fs/f2fs/inline.c b/fs/f2fs/inline.c | ||
6051 | index d636cbcf68f2..aacbb864ec1e 100644 | ||
6052 | --- a/fs/f2fs/inline.c | ||
6053 | +++ b/fs/f2fs/inline.c | ||
6054 | @@ -659,6 +659,12 @@ int f2fs_read_inline_dir(struct file *file, struct dir_context *ctx, | ||
6055 | if (IS_ERR(ipage)) | ||
6056 | return PTR_ERR(ipage); | ||
6057 | |||
6058 | + /* | ||
6059 | + * f2fs_readdir was protected by inode.i_rwsem, it is safe to access | ||
6060 | + * ipage without page's lock held. | ||
6061 | + */ | ||
6062 | + unlock_page(ipage); | ||
6063 | + | ||
6064 | inline_dentry = inline_data_addr(inode, ipage); | ||
6065 | |||
6066 | make_dentry_ptr_inline(inode, &d, inline_dentry); | ||
6067 | @@ -667,7 +673,7 @@ int f2fs_read_inline_dir(struct file *file, struct dir_context *ctx, | ||
6068 | if (!err) | ||
6069 | ctx->pos = d.max; | ||
6070 | |||
6071 | - f2fs_put_page(ipage, 1); | ||
6072 | + f2fs_put_page(ipage, 0); | ||
6073 | return err < 0 ? err : 0; | ||
6074 | } | ||
6075 | |||
6076 | diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c | ||
6077 | index c46a1d4318d4..5892fa3c885f 100644 | ||
6078 | --- a/fs/f2fs/super.c | ||
6079 | +++ b/fs/f2fs/super.c | ||
6080 | @@ -834,12 +834,13 @@ static int parse_options(struct super_block *sb, char *options) | ||
6081 | "set with inline_xattr option"); | ||
6082 | return -EINVAL; | ||
6083 | } | ||
6084 | - if (!F2FS_OPTION(sbi).inline_xattr_size || | ||
6085 | - F2FS_OPTION(sbi).inline_xattr_size >= | ||
6086 | - DEF_ADDRS_PER_INODE - | ||
6087 | - F2FS_TOTAL_EXTRA_ATTR_SIZE - | ||
6088 | - DEF_INLINE_RESERVED_SIZE - | ||
6089 | - DEF_MIN_INLINE_SIZE) { | ||
6090 | + if (F2FS_OPTION(sbi).inline_xattr_size < | ||
6091 | + sizeof(struct f2fs_xattr_header) / sizeof(__le32) || | ||
6092 | + F2FS_OPTION(sbi).inline_xattr_size > | ||
6093 | + DEF_ADDRS_PER_INODE - | ||
6094 | + F2FS_TOTAL_EXTRA_ATTR_SIZE / sizeof(__le32) - | ||
6095 | + DEF_INLINE_RESERVED_SIZE - | ||
6096 | + MIN_INLINE_DENTRY_SIZE / sizeof(__le32)) { | ||
6097 | f2fs_msg(sb, KERN_ERR, | ||
6098 | "inline xattr size is out of range"); | ||
6099 | return -EINVAL; | ||
6100 | @@ -915,6 +916,10 @@ static int f2fs_drop_inode(struct inode *inode) | ||
6101 | sb_start_intwrite(inode->i_sb); | ||
6102 | f2fs_i_size_write(inode, 0); | ||
6103 | |||
6104 | + f2fs_submit_merged_write_cond(F2FS_I_SB(inode), | ||
6105 | + inode, NULL, 0, DATA); | ||
6106 | + truncate_inode_pages_final(inode->i_mapping); | ||
6107 | + | ||
6108 | if (F2FS_HAS_BLOCKS(inode)) | ||
6109 | f2fs_truncate(inode); | ||
6110 | |||
6111 | diff --git a/fs/f2fs/sysfs.c b/fs/f2fs/sysfs.c | ||
6112 | index 0575edbe3ed6..f1ab9000b294 100644 | ||
6113 | --- a/fs/f2fs/sysfs.c | ||
6114 | +++ b/fs/f2fs/sysfs.c | ||
6115 | @@ -278,10 +278,16 @@ out: | ||
6116 | return count; | ||
6117 | } | ||
6118 | |||
6119 | - *ui = t; | ||
6120 | |||
6121 | - if (!strcmp(a->attr.name, "iostat_enable") && *ui == 0) | ||
6122 | - f2fs_reset_iostat(sbi); | ||
6123 | + if (!strcmp(a->attr.name, "iostat_enable")) { | ||
6124 | + sbi->iostat_enable = !!t; | ||
6125 | + if (!sbi->iostat_enable) | ||
6126 | + f2fs_reset_iostat(sbi); | ||
6127 | + return count; | ||
6128 | + } | ||
6129 | + | ||
6130 | + *ui = (unsigned int)t; | ||
6131 | + | ||
6132 | return count; | ||
6133 | } | ||
6134 | |||
6135 | diff --git a/fs/f2fs/trace.c b/fs/f2fs/trace.c | ||
6136 | index ce2a5eb210b6..d0ab533a9ce8 100644 | ||
6137 | --- a/fs/f2fs/trace.c | ||
6138 | +++ b/fs/f2fs/trace.c | ||
6139 | @@ -14,7 +14,7 @@ | ||
6140 | #include "trace.h" | ||
6141 | |||
6142 | static RADIX_TREE(pids, GFP_ATOMIC); | ||
6143 | -static struct mutex pids_lock; | ||
6144 | +static spinlock_t pids_lock; | ||
6145 | static struct last_io_info last_io; | ||
6146 | |||
6147 | static inline void __print_last_io(void) | ||
6148 | @@ -58,23 +58,29 @@ void f2fs_trace_pid(struct page *page) | ||
6149 | |||
6150 | set_page_private(page, (unsigned long)pid); | ||
6151 | |||
6152 | +retry: | ||
6153 | if (radix_tree_preload(GFP_NOFS)) | ||
6154 | return; | ||
6155 | |||
6156 | - mutex_lock(&pids_lock); | ||
6157 | + spin_lock(&pids_lock); | ||
6158 | p = radix_tree_lookup(&pids, pid); | ||
6159 | if (p == current) | ||
6160 | goto out; | ||
6161 | if (p) | ||
6162 | radix_tree_delete(&pids, pid); | ||
6163 | |||
6164 | - f2fs_radix_tree_insert(&pids, pid, current); | ||
6165 | + if (radix_tree_insert(&pids, pid, current)) { | ||
6166 | + spin_unlock(&pids_lock); | ||
6167 | + radix_tree_preload_end(); | ||
6168 | + cond_resched(); | ||
6169 | + goto retry; | ||
6170 | + } | ||
6171 | |||
6172 | trace_printk("%3x:%3x %4x %-16s\n", | ||
6173 | MAJOR(inode->i_sb->s_dev), MINOR(inode->i_sb->s_dev), | ||
6174 | pid, current->comm); | ||
6175 | out: | ||
6176 | - mutex_unlock(&pids_lock); | ||
6177 | + spin_unlock(&pids_lock); | ||
6178 | radix_tree_preload_end(); | ||
6179 | } | ||
6180 | |||
6181 | @@ -119,7 +125,7 @@ void f2fs_trace_ios(struct f2fs_io_info *fio, int flush) | ||
6182 | |||
6183 | void f2fs_build_trace_ios(void) | ||
6184 | { | ||
6185 | - mutex_init(&pids_lock); | ||
6186 | + spin_lock_init(&pids_lock); | ||
6187 | } | ||
6188 | |||
6189 | #define PIDVEC_SIZE 128 | ||
6190 | @@ -147,7 +153,7 @@ void f2fs_destroy_trace_ios(void) | ||
6191 | pid_t next_pid = 0; | ||
6192 | unsigned int found; | ||
6193 | |||
6194 | - mutex_lock(&pids_lock); | ||
6195 | + spin_lock(&pids_lock); | ||
6196 | while ((found = gang_lookup_pids(pid, next_pid, PIDVEC_SIZE))) { | ||
6197 | unsigned idx; | ||
6198 | |||
6199 | @@ -155,5 +161,5 @@ void f2fs_destroy_trace_ios(void) | ||
6200 | for (idx = 0; idx < found; idx++) | ||
6201 | radix_tree_delete(&pids, pid[idx]); | ||
6202 | } | ||
6203 | - mutex_unlock(&pids_lock); | ||
6204 | + spin_unlock(&pids_lock); | ||
6205 | } | ||
6206 | diff --git a/fs/f2fs/xattr.c b/fs/f2fs/xattr.c | ||
6207 | index 18d5ffbc5e8c..73b92985198b 100644 | ||
6208 | --- a/fs/f2fs/xattr.c | ||
6209 | +++ b/fs/f2fs/xattr.c | ||
6210 | @@ -224,11 +224,11 @@ static struct f2fs_xattr_entry *__find_inline_xattr(struct inode *inode, | ||
6211 | { | ||
6212 | struct f2fs_xattr_entry *entry; | ||
6213 | unsigned int inline_size = inline_xattr_size(inode); | ||
6214 | + void *max_addr = base_addr + inline_size; | ||
6215 | |||
6216 | list_for_each_xattr(entry, base_addr) { | ||
6217 | - if ((void *)entry + sizeof(__u32) > base_addr + inline_size || | ||
6218 | - (void *)XATTR_NEXT_ENTRY(entry) + sizeof(__u32) > | ||
6219 | - base_addr + inline_size) { | ||
6220 | + if ((void *)entry + sizeof(__u32) > max_addr || | ||
6221 | + (void *)XATTR_NEXT_ENTRY(entry) > max_addr) { | ||
6222 | *last_addr = entry; | ||
6223 | return NULL; | ||
6224 | } | ||
6225 | @@ -239,6 +239,13 @@ static struct f2fs_xattr_entry *__find_inline_xattr(struct inode *inode, | ||
6226 | if (!memcmp(entry->e_name, name, len)) | ||
6227 | break; | ||
6228 | } | ||
6229 | + | ||
6230 | + /* inline xattr header or entry across max inline xattr size */ | ||
6231 | + if (IS_XATTR_LAST_ENTRY(entry) && | ||
6232 | + (void *)entry + sizeof(__u32) > max_addr) { | ||
6233 | + *last_addr = entry; | ||
6234 | + return NULL; | ||
6235 | + } | ||
6236 | return entry; | ||
6237 | } | ||
6238 | |||
6239 | diff --git a/fs/file.c b/fs/file.c | ||
6240 | index 3209ee271c41..a10487aa0a84 100644 | ||
6241 | --- a/fs/file.c | ||
6242 | +++ b/fs/file.c | ||
6243 | @@ -457,6 +457,7 @@ struct files_struct init_files = { | ||
6244 | .full_fds_bits = init_files.full_fds_bits_init, | ||
6245 | }, | ||
6246 | .file_lock = __SPIN_LOCK_UNLOCKED(init_files.file_lock), | ||
6247 | + .resize_wait = __WAIT_QUEUE_HEAD_INITIALIZER(init_files.resize_wait), | ||
6248 | }; | ||
6249 | |||
6250 | static unsigned int find_next_fd(struct fdtable *fdt, unsigned int start) | ||
6251 | diff --git a/fs/jbd2/commit.c b/fs/jbd2/commit.c | ||
6252 | index 2eb55c3361a8..efd0ce9489ae 100644 | ||
6253 | --- a/fs/jbd2/commit.c | ||
6254 | +++ b/fs/jbd2/commit.c | ||
6255 | @@ -694,9 +694,11 @@ void jbd2_journal_commit_transaction(journal_t *journal) | ||
6256 | the last tag we set up. */ | ||
6257 | |||
6258 | tag->t_flags |= cpu_to_be16(JBD2_FLAG_LAST_TAG); | ||
6259 | - | ||
6260 | - jbd2_descriptor_block_csum_set(journal, descriptor); | ||
6261 | start_journal_io: | ||
6262 | + if (descriptor) | ||
6263 | + jbd2_descriptor_block_csum_set(journal, | ||
6264 | + descriptor); | ||
6265 | + | ||
6266 | for (i = 0; i < bufs; i++) { | ||
6267 | struct buffer_head *bh = wbuf[i]; | ||
6268 | /* | ||
6269 | diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c | ||
6270 | index 8ef6b6daaa7a..88f2a49338a1 100644 | ||
6271 | --- a/fs/jbd2/journal.c | ||
6272 | +++ b/fs/jbd2/journal.c | ||
6273 | @@ -1356,6 +1356,10 @@ static int journal_reset(journal_t *journal) | ||
6274 | return jbd2_journal_start_thread(journal); | ||
6275 | } | ||
6276 | |||
6277 | +/* | ||
6278 | + * This function expects that the caller will have locked the journal | ||
6279 | + * buffer head, and will return with it unlocked | ||
6280 | + */ | ||
6281 | static int jbd2_write_superblock(journal_t *journal, int write_flags) | ||
6282 | { | ||
6283 | struct buffer_head *bh = journal->j_sb_buffer; | ||
6284 | @@ -1365,7 +1369,6 @@ static int jbd2_write_superblock(journal_t *journal, int write_flags) | ||
6285 | trace_jbd2_write_superblock(journal, write_flags); | ||
6286 | if (!(journal->j_flags & JBD2_BARRIER)) | ||
6287 | write_flags &= ~(REQ_FUA | REQ_PREFLUSH); | ||
6288 | - lock_buffer(bh); | ||
6289 | if (buffer_write_io_error(bh)) { | ||
6290 | /* | ||
6291 | * Oh, dear. A previous attempt to write the journal | ||
6292 | @@ -1424,6 +1427,7 @@ int jbd2_journal_update_sb_log_tail(journal_t *journal, tid_t tail_tid, | ||
6293 | jbd_debug(1, "JBD2: updating superblock (start %lu, seq %u)\n", | ||
6294 | tail_block, tail_tid); | ||
6295 | |||
6296 | + lock_buffer(journal->j_sb_buffer); | ||
6297 | sb->s_sequence = cpu_to_be32(tail_tid); | ||
6298 | sb->s_start = cpu_to_be32(tail_block); | ||
6299 | |||
6300 | @@ -1454,18 +1458,17 @@ static void jbd2_mark_journal_empty(journal_t *journal, int write_op) | ||
6301 | journal_superblock_t *sb = journal->j_superblock; | ||
6302 | |||
6303 | BUG_ON(!mutex_is_locked(&journal->j_checkpoint_mutex)); | ||
6304 | - read_lock(&journal->j_state_lock); | ||
6305 | - /* Is it already empty? */ | ||
6306 | - if (sb->s_start == 0) { | ||
6307 | - read_unlock(&journal->j_state_lock); | ||
6308 | + lock_buffer(journal->j_sb_buffer); | ||
6309 | + if (sb->s_start == 0) { /* Is it already empty? */ | ||
6310 | + unlock_buffer(journal->j_sb_buffer); | ||
6311 | return; | ||
6312 | } | ||
6313 | + | ||
6314 | jbd_debug(1, "JBD2: Marking journal as empty (seq %d)\n", | ||
6315 | journal->j_tail_sequence); | ||
6316 | |||
6317 | sb->s_sequence = cpu_to_be32(journal->j_tail_sequence); | ||
6318 | sb->s_start = cpu_to_be32(0); | ||
6319 | - read_unlock(&journal->j_state_lock); | ||
6320 | |||
6321 | jbd2_write_superblock(journal, write_op); | ||
6322 | |||
6323 | @@ -1488,9 +1491,8 @@ void jbd2_journal_update_sb_errno(journal_t *journal) | ||
6324 | journal_superblock_t *sb = journal->j_superblock; | ||
6325 | int errcode; | ||
6326 | |||
6327 | - read_lock(&journal->j_state_lock); | ||
6328 | + lock_buffer(journal->j_sb_buffer); | ||
6329 | errcode = journal->j_errno; | ||
6330 | - read_unlock(&journal->j_state_lock); | ||
6331 | if (errcode == -ESHUTDOWN) | ||
6332 | errcode = 0; | ||
6333 | jbd_debug(1, "JBD2: updating superblock error (errno %d)\n", errcode); | ||
6334 | @@ -1894,28 +1896,27 @@ int jbd2_journal_set_features (journal_t *journal, unsigned long compat, | ||
6335 | |||
6336 | sb = journal->j_superblock; | ||
6337 | |||
6338 | + /* Load the checksum driver if necessary */ | ||
6339 | + if ((journal->j_chksum_driver == NULL) && | ||
6340 | + INCOMPAT_FEATURE_ON(JBD2_FEATURE_INCOMPAT_CSUM_V3)) { | ||
6341 | + journal->j_chksum_driver = crypto_alloc_shash("crc32c", 0, 0); | ||
6342 | + if (IS_ERR(journal->j_chksum_driver)) { | ||
6343 | + printk(KERN_ERR "JBD2: Cannot load crc32c driver.\n"); | ||
6344 | + journal->j_chksum_driver = NULL; | ||
6345 | + return 0; | ||
6346 | + } | ||
6347 | + /* Precompute checksum seed for all metadata */ | ||
6348 | + journal->j_csum_seed = jbd2_chksum(journal, ~0, sb->s_uuid, | ||
6349 | + sizeof(sb->s_uuid)); | ||
6350 | + } | ||
6351 | + | ||
6352 | + lock_buffer(journal->j_sb_buffer); | ||
6353 | + | ||
6354 | /* If enabling v3 checksums, update superblock */ | ||
6355 | if (INCOMPAT_FEATURE_ON(JBD2_FEATURE_INCOMPAT_CSUM_V3)) { | ||
6356 | sb->s_checksum_type = JBD2_CRC32C_CHKSUM; | ||
6357 | sb->s_feature_compat &= | ||
6358 | ~cpu_to_be32(JBD2_FEATURE_COMPAT_CHECKSUM); | ||
6359 | - | ||
6360 | - /* Load the checksum driver */ | ||
6361 | - if (journal->j_chksum_driver == NULL) { | ||
6362 | - journal->j_chksum_driver = crypto_alloc_shash("crc32c", | ||
6363 | - 0, 0); | ||
6364 | - if (IS_ERR(journal->j_chksum_driver)) { | ||
6365 | - printk(KERN_ERR "JBD2: Cannot load crc32c " | ||
6366 | - "driver.\n"); | ||
6367 | - journal->j_chksum_driver = NULL; | ||
6368 | - return 0; | ||
6369 | - } | ||
6370 | - | ||
6371 | - /* Precompute checksum seed for all metadata */ | ||
6372 | - journal->j_csum_seed = jbd2_chksum(journal, ~0, | ||
6373 | - sb->s_uuid, | ||
6374 | - sizeof(sb->s_uuid)); | ||
6375 | - } | ||
6376 | } | ||
6377 | |||
6378 | /* If enabling v1 checksums, downgrade superblock */ | ||
6379 | @@ -1927,6 +1928,7 @@ int jbd2_journal_set_features (journal_t *journal, unsigned long compat, | ||
6380 | sb->s_feature_compat |= cpu_to_be32(compat); | ||
6381 | sb->s_feature_ro_compat |= cpu_to_be32(ro); | ||
6382 | sb->s_feature_incompat |= cpu_to_be32(incompat); | ||
6383 | + unlock_buffer(journal->j_sb_buffer); | ||
6384 | |||
6385 | return 1; | ||
6386 | #undef COMPAT_FEATURE_ON | ||
6387 | diff --git a/fs/ocfs2/cluster/nodemanager.c b/fs/ocfs2/cluster/nodemanager.c | ||
6388 | index 0e4166cc23a0..4ac775e32240 100644 | ||
6389 | --- a/fs/ocfs2/cluster/nodemanager.c | ||
6390 | +++ b/fs/ocfs2/cluster/nodemanager.c | ||
6391 | @@ -621,13 +621,15 @@ static void o2nm_node_group_drop_item(struct config_group *group, | ||
6392 | struct o2nm_node *node = to_o2nm_node(item); | ||
6393 | struct o2nm_cluster *cluster = to_o2nm_cluster(group->cg_item.ci_parent); | ||
6394 | |||
6395 | - o2net_disconnect_node(node); | ||
6396 | + if (cluster->cl_nodes[node->nd_num] == node) { | ||
6397 | + o2net_disconnect_node(node); | ||
6398 | |||
6399 | - if (cluster->cl_has_local && | ||
6400 | - (cluster->cl_local_node == node->nd_num)) { | ||
6401 | - cluster->cl_has_local = 0; | ||
6402 | - cluster->cl_local_node = O2NM_INVALID_NODE_NUM; | ||
6403 | - o2net_stop_listening(node); | ||
6404 | + if (cluster->cl_has_local && | ||
6405 | + (cluster->cl_local_node == node->nd_num)) { | ||
6406 | + cluster->cl_has_local = 0; | ||
6407 | + cluster->cl_local_node = O2NM_INVALID_NODE_NUM; | ||
6408 | + o2net_stop_listening(node); | ||
6409 | + } | ||
6410 | } | ||
6411 | |||
6412 | /* XXX call into net to stop this node from trading messages */ | ||
6413 | diff --git a/fs/read_write.c b/fs/read_write.c | ||
6414 | index ff3c5e6f87cf..27b69b85d49f 100644 | ||
6415 | --- a/fs/read_write.c | ||
6416 | +++ b/fs/read_write.c | ||
6417 | @@ -1238,6 +1238,9 @@ COMPAT_SYSCALL_DEFINE5(preadv64v2, unsigned long, fd, | ||
6418 | const struct compat_iovec __user *,vec, | ||
6419 | unsigned long, vlen, loff_t, pos, rwf_t, flags) | ||
6420 | { | ||
6421 | + if (pos == -1) | ||
6422 | + return do_compat_readv(fd, vec, vlen, flags); | ||
6423 | + | ||
6424 | return do_compat_preadv64(fd, vec, vlen, pos, flags); | ||
6425 | } | ||
6426 | #endif | ||
6427 | @@ -1344,6 +1347,9 @@ COMPAT_SYSCALL_DEFINE5(pwritev64v2, unsigned long, fd, | ||
6428 | const struct compat_iovec __user *,vec, | ||
6429 | unsigned long, vlen, loff_t, pos, rwf_t, flags) | ||
6430 | { | ||
6431 | + if (pos == -1) | ||
6432 | + return do_compat_writev(fd, vec, vlen, flags); | ||
6433 | + | ||
6434 | return do_compat_pwritev64(fd, vec, vlen, pos, flags); | ||
6435 | } | ||
6436 | #endif | ||
6437 | diff --git a/include/linux/atalk.h b/include/linux/atalk.h | ||
6438 | index 23f805562f4e..840cf92307ba 100644 | ||
6439 | --- a/include/linux/atalk.h | ||
6440 | +++ b/include/linux/atalk.h | ||
6441 | @@ -161,16 +161,26 @@ extern int sysctl_aarp_resolve_time; | ||
6442 | extern void atalk_register_sysctl(void); | ||
6443 | extern void atalk_unregister_sysctl(void); | ||
6444 | #else | ||
6445 | -#define atalk_register_sysctl() do { } while(0) | ||
6446 | -#define atalk_unregister_sysctl() do { } while(0) | ||
6447 | +static inline int atalk_register_sysctl(void) | ||
6448 | +{ | ||
6449 | + return 0; | ||
6450 | +} | ||
6451 | +static inline void atalk_unregister_sysctl(void) | ||
6452 | +{ | ||
6453 | +} | ||
6454 | #endif | ||
6455 | |||
6456 | #ifdef CONFIG_PROC_FS | ||
6457 | extern int atalk_proc_init(void); | ||
6458 | extern void atalk_proc_exit(void); | ||
6459 | #else | ||
6460 | -#define atalk_proc_init() ({ 0; }) | ||
6461 | -#define atalk_proc_exit() do { } while(0) | ||
6462 | +static inline int atalk_proc_init(void) | ||
6463 | +{ | ||
6464 | + return 0; | ||
6465 | +} | ||
6466 | +static inline void atalk_proc_exit(void) | ||
6467 | +{ | ||
6468 | +} | ||
6469 | #endif /* CONFIG_PROC_FS */ | ||
6470 | |||
6471 | #endif /* __LINUX_ATALK_H__ */ | ||
6472 | diff --git a/include/linux/cgroup-defs.h b/include/linux/cgroup-defs.h | ||
6473 | index 8fcbae1b8db0..120d1d40704b 100644 | ||
6474 | --- a/include/linux/cgroup-defs.h | ||
6475 | +++ b/include/linux/cgroup-defs.h | ||
6476 | @@ -602,7 +602,7 @@ struct cgroup_subsys { | ||
6477 | void (*cancel_fork)(struct task_struct *task); | ||
6478 | void (*fork)(struct task_struct *task); | ||
6479 | void (*exit)(struct task_struct *task); | ||
6480 | - void (*free)(struct task_struct *task); | ||
6481 | + void (*release)(struct task_struct *task); | ||
6482 | void (*bind)(struct cgroup_subsys_state *root_css); | ||
6483 | |||
6484 | bool early_init:1; | ||
6485 | diff --git a/include/linux/cgroup.h b/include/linux/cgroup.h | ||
6486 | index 9968332cceed..81f58b4a5418 100644 | ||
6487 | --- a/include/linux/cgroup.h | ||
6488 | +++ b/include/linux/cgroup.h | ||
6489 | @@ -121,6 +121,7 @@ extern int cgroup_can_fork(struct task_struct *p); | ||
6490 | extern void cgroup_cancel_fork(struct task_struct *p); | ||
6491 | extern void cgroup_post_fork(struct task_struct *p); | ||
6492 | void cgroup_exit(struct task_struct *p); | ||
6493 | +void cgroup_release(struct task_struct *p); | ||
6494 | void cgroup_free(struct task_struct *p); | ||
6495 | |||
6496 | int cgroup_init_early(void); | ||
6497 | @@ -697,6 +698,7 @@ static inline int cgroup_can_fork(struct task_struct *p) { return 0; } | ||
6498 | static inline void cgroup_cancel_fork(struct task_struct *p) {} | ||
6499 | static inline void cgroup_post_fork(struct task_struct *p) {} | ||
6500 | static inline void cgroup_exit(struct task_struct *p) {} | ||
6501 | +static inline void cgroup_release(struct task_struct *p) {} | ||
6502 | static inline void cgroup_free(struct task_struct *p) {} | ||
6503 | |||
6504 | static inline int cgroup_init_early(void) { return 0; } | ||
6505 | diff --git a/include/linux/clk-provider.h b/include/linux/clk-provider.h | ||
6506 | index e443fa9fa859..b7cf80a71293 100644 | ||
6507 | --- a/include/linux/clk-provider.h | ||
6508 | +++ b/include/linux/clk-provider.h | ||
6509 | @@ -792,6 +792,9 @@ unsigned int __clk_get_enable_count(struct clk *clk); | ||
6510 | unsigned long clk_hw_get_rate(const struct clk_hw *hw); | ||
6511 | unsigned long __clk_get_flags(struct clk *clk); | ||
6512 | unsigned long clk_hw_get_flags(const struct clk_hw *hw); | ||
6513 | +#define clk_hw_can_set_rate_parent(hw) \ | ||
6514 | + (clk_hw_get_flags((hw)) & CLK_SET_RATE_PARENT) | ||
6515 | + | ||
6516 | bool clk_hw_is_prepared(const struct clk_hw *hw); | ||
6517 | bool clk_hw_rate_is_protected(const struct clk_hw *hw); | ||
6518 | bool clk_hw_is_enabled(const struct clk_hw *hw); | ||
6519 | diff --git a/include/linux/efi.h b/include/linux/efi.h | ||
6520 | index 28604a8d0aa9..a86485ac7c87 100644 | ||
6521 | --- a/include/linux/efi.h | ||
6522 | +++ b/include/linux/efi.h | ||
6523 | @@ -1699,19 +1699,19 @@ extern int efi_tpm_eventlog_init(void); | ||
6524 | * fault happened while executing an efi runtime service. | ||
6525 | */ | ||
6526 | enum efi_rts_ids { | ||
6527 | - NONE, | ||
6528 | - GET_TIME, | ||
6529 | - SET_TIME, | ||
6530 | - GET_WAKEUP_TIME, | ||
6531 | - SET_WAKEUP_TIME, | ||
6532 | - GET_VARIABLE, | ||
6533 | - GET_NEXT_VARIABLE, | ||
6534 | - SET_VARIABLE, | ||
6535 | - QUERY_VARIABLE_INFO, | ||
6536 | - GET_NEXT_HIGH_MONO_COUNT, | ||
6537 | - RESET_SYSTEM, | ||
6538 | - UPDATE_CAPSULE, | ||
6539 | - QUERY_CAPSULE_CAPS, | ||
6540 | + EFI_NONE, | ||
6541 | + EFI_GET_TIME, | ||
6542 | + EFI_SET_TIME, | ||
6543 | + EFI_GET_WAKEUP_TIME, | ||
6544 | + EFI_SET_WAKEUP_TIME, | ||
6545 | + EFI_GET_VARIABLE, | ||
6546 | + EFI_GET_NEXT_VARIABLE, | ||
6547 | + EFI_SET_VARIABLE, | ||
6548 | + EFI_QUERY_VARIABLE_INFO, | ||
6549 | + EFI_GET_NEXT_HIGH_MONO_COUNT, | ||
6550 | + EFI_RESET_SYSTEM, | ||
6551 | + EFI_UPDATE_CAPSULE, | ||
6552 | + EFI_QUERY_CAPSULE_CAPS, | ||
6553 | }; | ||
6554 | |||
6555 | /* | ||
6556 | diff --git a/include/linux/f2fs_fs.h b/include/linux/f2fs_fs.h | ||
6557 | index d7711048ef93..c524ad7d31da 100644 | ||
6558 | --- a/include/linux/f2fs_fs.h | ||
6559 | +++ b/include/linux/f2fs_fs.h | ||
6560 | @@ -489,12 +489,12 @@ typedef __le32 f2fs_hash_t; | ||
6561 | |||
6562 | /* | ||
6563 | * space utilization of regular dentry and inline dentry (w/o extra reservation) | ||
6564 | - * regular dentry inline dentry | ||
6565 | - * bitmap 1 * 27 = 27 1 * 23 = 23 | ||
6566 | - * reserved 1 * 3 = 3 1 * 7 = 7 | ||
6567 | - * dentry 11 * 214 = 2354 11 * 182 = 2002 | ||
6568 | - * filename 8 * 214 = 1712 8 * 182 = 1456 | ||
6569 | - * total 4096 3488 | ||
6570 | + * regular dentry inline dentry (def) inline dentry (min) | ||
6571 | + * bitmap 1 * 27 = 27 1 * 23 = 23 1 * 1 = 1 | ||
6572 | + * reserved 1 * 3 = 3 1 * 7 = 7 1 * 1 = 1 | ||
6573 | + * dentry 11 * 214 = 2354 11 * 182 = 2002 11 * 2 = 22 | ||
6574 | + * filename 8 * 214 = 1712 8 * 182 = 1456 8 * 2 = 16 | ||
6575 | + * total 4096 3488 40 | ||
6576 | * | ||
6577 | * Note: there are more reserved space in inline dentry than in regular | ||
6578 | * dentry, when converting inline dentry we should handle this carefully. | ||
6579 | @@ -506,6 +506,7 @@ typedef __le32 f2fs_hash_t; | ||
6580 | #define SIZE_OF_RESERVED (PAGE_SIZE - ((SIZE_OF_DIR_ENTRY + \ | ||
6581 | F2FS_SLOT_LEN) * \ | ||
6582 | NR_DENTRY_IN_BLOCK + SIZE_OF_DENTRY_BITMAP)) | ||
6583 | +#define MIN_INLINE_DENTRY_SIZE 40 /* just include '.' and '..' entries */ | ||
6584 | |||
6585 | /* One directory entry slot representing F2FS_SLOT_LEN-sized file name */ | ||
6586 | struct f2fs_dir_entry { | ||
6587 | diff --git a/include/linux/filter.h b/include/linux/filter.h | ||
6588 | index e532fcc6e4b5..3358646a8e7a 100644 | ||
6589 | --- a/include/linux/filter.h | ||
6590 | +++ b/include/linux/filter.h | ||
6591 | @@ -874,7 +874,9 @@ bpf_jit_binary_alloc(unsigned int proglen, u8 **image_ptr, | ||
6592 | unsigned int alignment, | ||
6593 | bpf_jit_fill_hole_t bpf_fill_ill_insns); | ||
6594 | void bpf_jit_binary_free(struct bpf_binary_header *hdr); | ||
6595 | - | ||
6596 | +u64 bpf_jit_alloc_exec_limit(void); | ||
6597 | +void *bpf_jit_alloc_exec(unsigned long size); | ||
6598 | +void bpf_jit_free_exec(void *addr); | ||
6599 | void bpf_jit_free(struct bpf_prog *fp); | ||
6600 | |||
6601 | int bpf_jit_get_func_addr(const struct bpf_prog *prog, | ||
6602 | diff --git a/include/linux/i2c.h b/include/linux/i2c.h | ||
6603 | index 65b4eaed1d96..7e748648c7d3 100644 | ||
6604 | --- a/include/linux/i2c.h | ||
6605 | +++ b/include/linux/i2c.h | ||
6606 | @@ -333,6 +333,7 @@ struct i2c_client { | ||
6607 | char name[I2C_NAME_SIZE]; | ||
6608 | struct i2c_adapter *adapter; /* the adapter we sit on */ | ||
6609 | struct device dev; /* the device structure */ | ||
6610 | + int init_irq; /* irq set at initialization */ | ||
6611 | int irq; /* irq issued by device */ | ||
6612 | struct list_head detected; | ||
6613 | #if IS_ENABLED(CONFIG_I2C_SLAVE) | ||
6614 | diff --git a/include/linux/irqdesc.h b/include/linux/irqdesc.h | ||
6615 | index dd1e40ddac7d..875c41b23f20 100644 | ||
6616 | --- a/include/linux/irqdesc.h | ||
6617 | +++ b/include/linux/irqdesc.h | ||
6618 | @@ -65,6 +65,7 @@ struct irq_desc { | ||
6619 | unsigned int core_internal_state__do_not_mess_with_it; | ||
6620 | unsigned int depth; /* nested irq disables */ | ||
6621 | unsigned int wake_depth; /* nested wake enables */ | ||
6622 | + unsigned int tot_count; | ||
6623 | unsigned int irq_count; /* For detecting broken IRQs */ | ||
6624 | unsigned long last_unhandled; /* Aging timer for unhandled count */ | ||
6625 | unsigned int irqs_unhandled; | ||
6626 | diff --git a/include/linux/kasan-checks.h b/include/linux/kasan-checks.h | ||
6627 | index d314150658a4..a61dc075e2ce 100644 | ||
6628 | --- a/include/linux/kasan-checks.h | ||
6629 | +++ b/include/linux/kasan-checks.h | ||
6630 | @@ -2,7 +2,7 @@ | ||
6631 | #ifndef _LINUX_KASAN_CHECKS_H | ||
6632 | #define _LINUX_KASAN_CHECKS_H | ||
6633 | |||
6634 | -#ifdef CONFIG_KASAN | ||
6635 | +#if defined(__SANITIZE_ADDRESS__) || defined(__KASAN_INTERNAL) | ||
6636 | void kasan_check_read(const volatile void *p, unsigned int size); | ||
6637 | void kasan_check_write(const volatile void *p, unsigned int size); | ||
6638 | #else | ||
6639 | diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h | ||
6640 | index e1a051724f7e..7cbbd891bfcd 100644 | ||
6641 | --- a/include/linux/perf_event.h | ||
6642 | +++ b/include/linux/perf_event.h | ||
6643 | @@ -409,7 +409,7 @@ struct pmu { | ||
6644 | /* | ||
6645 | * Set up pmu-private data structures for an AUX area | ||
6646 | */ | ||
6647 | - void *(*setup_aux) (int cpu, void **pages, | ||
6648 | + void *(*setup_aux) (struct perf_event *event, void **pages, | ||
6649 | int nr_pages, bool overwrite); | ||
6650 | /* optional */ | ||
6651 | |||
6652 | diff --git a/include/linux/relay.h b/include/linux/relay.h | ||
6653 | index e1bdf01a86e2..c759f96e39c1 100644 | ||
6654 | --- a/include/linux/relay.h | ||
6655 | +++ b/include/linux/relay.h | ||
6656 | @@ -66,7 +66,7 @@ struct rchan | ||
6657 | struct kref kref; /* channel refcount */ | ||
6658 | void *private_data; /* for user-defined data */ | ||
6659 | size_t last_toobig; /* tried to log event > subbuf size */ | ||
6660 | - struct rchan_buf ** __percpu buf; /* per-cpu channel buffers */ | ||
6661 | + struct rchan_buf * __percpu *buf; /* per-cpu channel buffers */ | ||
6662 | int is_global; /* One global buffer ? */ | ||
6663 | struct list_head list; /* for channel list */ | ||
6664 | struct dentry *parent; /* parent dentry passed to open */ | ||
6665 | diff --git a/include/linux/ring_buffer.h b/include/linux/ring_buffer.h | ||
6666 | index 5b9ae62272bb..503778920448 100644 | ||
6667 | --- a/include/linux/ring_buffer.h | ||
6668 | +++ b/include/linux/ring_buffer.h | ||
6669 | @@ -128,7 +128,7 @@ ring_buffer_consume(struct ring_buffer *buffer, int cpu, u64 *ts, | ||
6670 | unsigned long *lost_events); | ||
6671 | |||
6672 | struct ring_buffer_iter * | ||
6673 | -ring_buffer_read_prepare(struct ring_buffer *buffer, int cpu); | ||
6674 | +ring_buffer_read_prepare(struct ring_buffer *buffer, int cpu, gfp_t flags); | ||
6675 | void ring_buffer_read_prepare_sync(void); | ||
6676 | void ring_buffer_read_start(struct ring_buffer_iter *iter); | ||
6677 | void ring_buffer_read_finish(struct ring_buffer_iter *iter); | ||
6678 | diff --git a/include/linux/sched.h b/include/linux/sched.h | ||
6679 | index f9b43c989577..9b35aff09f70 100644 | ||
6680 | --- a/include/linux/sched.h | ||
6681 | +++ b/include/linux/sched.h | ||
6682 | @@ -1748,9 +1748,9 @@ static __always_inline bool need_resched(void) | ||
6683 | static inline unsigned int task_cpu(const struct task_struct *p) | ||
6684 | { | ||
6685 | #ifdef CONFIG_THREAD_INFO_IN_TASK | ||
6686 | - return p->cpu; | ||
6687 | + return READ_ONCE(p->cpu); | ||
6688 | #else | ||
6689 | - return task_thread_info(p)->cpu; | ||
6690 | + return READ_ONCE(task_thread_info(p)->cpu); | ||
6691 | #endif | ||
6692 | } | ||
6693 | |||
6694 | diff --git a/include/linux/sched/topology.h b/include/linux/sched/topology.h | ||
6695 | index c31d3a47a47c..57c7ed3fe465 100644 | ||
6696 | --- a/include/linux/sched/topology.h | ||
6697 | +++ b/include/linux/sched/topology.h | ||
6698 | @@ -176,10 +176,10 @@ typedef int (*sched_domain_flags_f)(void); | ||
6699 | #define SDTL_OVERLAP 0x01 | ||
6700 | |||
6701 | struct sd_data { | ||
6702 | - struct sched_domain **__percpu sd; | ||
6703 | - struct sched_domain_shared **__percpu sds; | ||
6704 | - struct sched_group **__percpu sg; | ||
6705 | - struct sched_group_capacity **__percpu sgc; | ||
6706 | + struct sched_domain *__percpu *sd; | ||
6707 | + struct sched_domain_shared *__percpu *sds; | ||
6708 | + struct sched_group *__percpu *sg; | ||
6709 | + struct sched_group_capacity *__percpu *sgc; | ||
6710 | }; | ||
6711 | |||
6712 | struct sched_domain_topology_level { | ||
6713 | diff --git a/include/net/netfilter/br_netfilter.h b/include/net/netfilter/br_netfilter.h | ||
6714 | index 4cd56808ac4e..89808ce293c4 100644 | ||
6715 | --- a/include/net/netfilter/br_netfilter.h | ||
6716 | +++ b/include/net/netfilter/br_netfilter.h | ||
6717 | @@ -43,7 +43,6 @@ static inline struct rtable *bridge_parent_rtable(const struct net_device *dev) | ||
6718 | } | ||
6719 | |||
6720 | struct net_device *setup_pre_routing(struct sk_buff *skb); | ||
6721 | -void br_netfilter_enable(void); | ||
6722 | |||
6723 | #if IS_ENABLED(CONFIG_IPV6) | ||
6724 | int br_validate_ipv6(struct net *net, struct sk_buff *skb); | ||
6725 | diff --git a/include/scsi/libfcoe.h b/include/scsi/libfcoe.h | ||
6726 | index cb8a273732cf..bb8092fa1e36 100644 | ||
6727 | --- a/include/scsi/libfcoe.h | ||
6728 | +++ b/include/scsi/libfcoe.h | ||
6729 | @@ -79,7 +79,7 @@ enum fip_state { | ||
6730 | * It must not change after fcoe_ctlr_init() sets it. | ||
6731 | */ | ||
6732 | enum fip_mode { | ||
6733 | - FIP_MODE_AUTO = FIP_ST_AUTO, | ||
6734 | + FIP_MODE_AUTO, | ||
6735 | FIP_MODE_NON_FIP, | ||
6736 | FIP_MODE_FABRIC, | ||
6737 | FIP_MODE_VN2VN, | ||
6738 | @@ -250,7 +250,7 @@ struct fcoe_rport { | ||
6739 | }; | ||
6740 | |||
6741 | /* FIP API functions */ | ||
6742 | -void fcoe_ctlr_init(struct fcoe_ctlr *, enum fip_state); | ||
6743 | +void fcoe_ctlr_init(struct fcoe_ctlr *, enum fip_mode); | ||
6744 | void fcoe_ctlr_destroy(struct fcoe_ctlr *); | ||
6745 | void fcoe_ctlr_link_up(struct fcoe_ctlr *); | ||
6746 | int fcoe_ctlr_link_down(struct fcoe_ctlr *); | ||
6747 | diff --git a/kernel/audit.h b/kernel/audit.h | ||
6748 | index 91421679a168..6ffb70575082 100644 | ||
6749 | --- a/kernel/audit.h | ||
6750 | +++ b/kernel/audit.h | ||
6751 | @@ -314,7 +314,7 @@ extern void audit_trim_trees(void); | ||
6752 | extern int audit_tag_tree(char *old, char *new); | ||
6753 | extern const char *audit_tree_path(struct audit_tree *tree); | ||
6754 | extern void audit_put_tree(struct audit_tree *tree); | ||
6755 | -extern void audit_kill_trees(struct list_head *list); | ||
6756 | +extern void audit_kill_trees(struct audit_context *context); | ||
6757 | #else | ||
6758 | #define audit_remove_tree_rule(rule) BUG() | ||
6759 | #define audit_add_tree_rule(rule) -EINVAL | ||
6760 | @@ -323,7 +323,7 @@ extern void audit_kill_trees(struct list_head *list); | ||
6761 | #define audit_put_tree(tree) (void)0 | ||
6762 | #define audit_tag_tree(old, new) -EINVAL | ||
6763 | #define audit_tree_path(rule) "" /* never called */ | ||
6764 | -#define audit_kill_trees(list) BUG() | ||
6765 | +#define audit_kill_trees(context) BUG() | ||
6766 | #endif | ||
6767 | |||
6768 | extern char *audit_unpack_string(void **bufp, size_t *remain, size_t len); | ||
6769 | diff --git a/kernel/audit_tree.c b/kernel/audit_tree.c | ||
6770 | index d4af4d97f847..abfb112f26aa 100644 | ||
6771 | --- a/kernel/audit_tree.c | ||
6772 | +++ b/kernel/audit_tree.c | ||
6773 | @@ -524,13 +524,14 @@ static int tag_chunk(struct inode *inode, struct audit_tree *tree) | ||
6774 | return 0; | ||
6775 | } | ||
6776 | |||
6777 | -static void audit_tree_log_remove_rule(struct audit_krule *rule) | ||
6778 | +static void audit_tree_log_remove_rule(struct audit_context *context, | ||
6779 | + struct audit_krule *rule) | ||
6780 | { | ||
6781 | struct audit_buffer *ab; | ||
6782 | |||
6783 | if (!audit_enabled) | ||
6784 | return; | ||
6785 | - ab = audit_log_start(NULL, GFP_KERNEL, AUDIT_CONFIG_CHANGE); | ||
6786 | + ab = audit_log_start(context, GFP_KERNEL, AUDIT_CONFIG_CHANGE); | ||
6787 | if (unlikely(!ab)) | ||
6788 | return; | ||
6789 | audit_log_format(ab, "op=remove_rule dir="); | ||
6790 | @@ -540,7 +541,7 @@ static void audit_tree_log_remove_rule(struct audit_krule *rule) | ||
6791 | audit_log_end(ab); | ||
6792 | } | ||
6793 | |||
6794 | -static void kill_rules(struct audit_tree *tree) | ||
6795 | +static void kill_rules(struct audit_context *context, struct audit_tree *tree) | ||
6796 | { | ||
6797 | struct audit_krule *rule, *next; | ||
6798 | struct audit_entry *entry; | ||
6799 | @@ -551,7 +552,7 @@ static void kill_rules(struct audit_tree *tree) | ||
6800 | list_del_init(&rule->rlist); | ||
6801 | if (rule->tree) { | ||
6802 | /* not a half-baked one */ | ||
6803 | - audit_tree_log_remove_rule(rule); | ||
6804 | + audit_tree_log_remove_rule(context, rule); | ||
6805 | if (entry->rule.exe) | ||
6806 | audit_remove_mark(entry->rule.exe); | ||
6807 | rule->tree = NULL; | ||
6808 | @@ -633,7 +634,7 @@ static void trim_marked(struct audit_tree *tree) | ||
6809 | tree->goner = 1; | ||
6810 | spin_unlock(&hash_lock); | ||
6811 | mutex_lock(&audit_filter_mutex); | ||
6812 | - kill_rules(tree); | ||
6813 | + kill_rules(audit_context(), tree); | ||
6814 | list_del_init(&tree->list); | ||
6815 | mutex_unlock(&audit_filter_mutex); | ||
6816 | prune_one(tree); | ||
6817 | @@ -973,8 +974,10 @@ static void audit_schedule_prune(void) | ||
6818 | * ... and that one is done if evict_chunk() decides to delay until the end | ||
6819 | * of syscall. Runs synchronously. | ||
6820 | */ | ||
6821 | -void audit_kill_trees(struct list_head *list) | ||
6822 | +void audit_kill_trees(struct audit_context *context) | ||
6823 | { | ||
6824 | + struct list_head *list = &context->killed_trees; | ||
6825 | + | ||
6826 | audit_ctl_lock(); | ||
6827 | mutex_lock(&audit_filter_mutex); | ||
6828 | |||
6829 | @@ -982,7 +985,7 @@ void audit_kill_trees(struct list_head *list) | ||
6830 | struct audit_tree *victim; | ||
6831 | |||
6832 | victim = list_entry(list->next, struct audit_tree, list); | ||
6833 | - kill_rules(victim); | ||
6834 | + kill_rules(context, victim); | ||
6835 | list_del_init(&victim->list); | ||
6836 | |||
6837 | mutex_unlock(&audit_filter_mutex); | ||
6838 | @@ -1017,7 +1020,7 @@ static void evict_chunk(struct audit_chunk *chunk) | ||
6839 | list_del_init(&owner->same_root); | ||
6840 | spin_unlock(&hash_lock); | ||
6841 | if (!postponed) { | ||
6842 | - kill_rules(owner); | ||
6843 | + kill_rules(audit_context(), owner); | ||
6844 | list_move(&owner->list, &prune_list); | ||
6845 | need_prune = 1; | ||
6846 | } else { | ||
6847 | diff --git a/kernel/auditsc.c b/kernel/auditsc.c | ||
6848 | index 6593a5207fb0..b585ceb2f7a2 100644 | ||
6849 | --- a/kernel/auditsc.c | ||
6850 | +++ b/kernel/auditsc.c | ||
6851 | @@ -1444,6 +1444,9 @@ void __audit_free(struct task_struct *tsk) | ||
6852 | if (!context) | ||
6853 | return; | ||
6854 | |||
6855 | + if (!list_empty(&context->killed_trees)) | ||
6856 | + audit_kill_trees(context); | ||
6857 | + | ||
6858 | /* We are called either by do_exit() or the fork() error handling code; | ||
6859 | * in the former case tsk == current and in the latter tsk is a | ||
6860 | * random task_struct that doesn't doesn't have any meaningful data we | ||
6861 | @@ -1460,9 +1463,6 @@ void __audit_free(struct task_struct *tsk) | ||
6862 | audit_log_exit(); | ||
6863 | } | ||
6864 | |||
6865 | - if (!list_empty(&context->killed_trees)) | ||
6866 | - audit_kill_trees(&context->killed_trees); | ||
6867 | - | ||
6868 | audit_set_context(tsk, NULL); | ||
6869 | audit_free_context(context); | ||
6870 | } | ||
6871 | @@ -1537,6 +1537,9 @@ void __audit_syscall_exit(int success, long return_code) | ||
6872 | if (!context) | ||
6873 | return; | ||
6874 | |||
6875 | + if (!list_empty(&context->killed_trees)) | ||
6876 | + audit_kill_trees(context); | ||
6877 | + | ||
6878 | if (!context->dummy && context->in_syscall) { | ||
6879 | if (success) | ||
6880 | context->return_valid = AUDITSC_SUCCESS; | ||
6881 | @@ -1571,9 +1574,6 @@ void __audit_syscall_exit(int success, long return_code) | ||
6882 | context->in_syscall = 0; | ||
6883 | context->prio = context->state == AUDIT_RECORD_CONTEXT ? ~0ULL : 0; | ||
6884 | |||
6885 | - if (!list_empty(&context->killed_trees)) | ||
6886 | - audit_kill_trees(&context->killed_trees); | ||
6887 | - | ||
6888 | audit_free_names(context); | ||
6889 | unroll_tree_refs(context, NULL, 0); | ||
6890 | audit_free_aux(context); | ||
6891 | diff --git a/kernel/cgroup/cgroup.c b/kernel/cgroup/cgroup.c | ||
6892 | index 503bba3c4bae..f84bf28f36ba 100644 | ||
6893 | --- a/kernel/cgroup/cgroup.c | ||
6894 | +++ b/kernel/cgroup/cgroup.c | ||
6895 | @@ -197,7 +197,7 @@ static u64 css_serial_nr_next = 1; | ||
6896 | */ | ||
6897 | static u16 have_fork_callback __read_mostly; | ||
6898 | static u16 have_exit_callback __read_mostly; | ||
6899 | -static u16 have_free_callback __read_mostly; | ||
6900 | +static u16 have_release_callback __read_mostly; | ||
6901 | static u16 have_canfork_callback __read_mostly; | ||
6902 | |||
6903 | /* cgroup namespace for init task */ | ||
6904 | @@ -5316,7 +5316,7 @@ static void __init cgroup_init_subsys(struct cgroup_subsys *ss, bool early) | ||
6905 | |||
6906 | have_fork_callback |= (bool)ss->fork << ss->id; | ||
6907 | have_exit_callback |= (bool)ss->exit << ss->id; | ||
6908 | - have_free_callback |= (bool)ss->free << ss->id; | ||
6909 | + have_release_callback |= (bool)ss->release << ss->id; | ||
6910 | have_canfork_callback |= (bool)ss->can_fork << ss->id; | ||
6911 | |||
6912 | /* At system boot, before all subsystems have been | ||
6913 | @@ -5752,16 +5752,19 @@ void cgroup_exit(struct task_struct *tsk) | ||
6914 | } while_each_subsys_mask(); | ||
6915 | } | ||
6916 | |||
6917 | -void cgroup_free(struct task_struct *task) | ||
6918 | +void cgroup_release(struct task_struct *task) | ||
6919 | { | ||
6920 | - struct css_set *cset = task_css_set(task); | ||
6921 | struct cgroup_subsys *ss; | ||
6922 | int ssid; | ||
6923 | |||
6924 | - do_each_subsys_mask(ss, ssid, have_free_callback) { | ||
6925 | - ss->free(task); | ||
6926 | + do_each_subsys_mask(ss, ssid, have_release_callback) { | ||
6927 | + ss->release(task); | ||
6928 | } while_each_subsys_mask(); | ||
6929 | +} | ||
6930 | |||
6931 | +void cgroup_free(struct task_struct *task) | ||
6932 | +{ | ||
6933 | + struct css_set *cset = task_css_set(task); | ||
6934 | put_css_set(cset); | ||
6935 | } | ||
6936 | |||
6937 | diff --git a/kernel/cgroup/pids.c b/kernel/cgroup/pids.c | ||
6938 | index 9829c67ebc0a..c9960baaa14f 100644 | ||
6939 | --- a/kernel/cgroup/pids.c | ||
6940 | +++ b/kernel/cgroup/pids.c | ||
6941 | @@ -247,7 +247,7 @@ static void pids_cancel_fork(struct task_struct *task) | ||
6942 | pids_uncharge(pids, 1); | ||
6943 | } | ||
6944 | |||
6945 | -static void pids_free(struct task_struct *task) | ||
6946 | +static void pids_release(struct task_struct *task) | ||
6947 | { | ||
6948 | struct pids_cgroup *pids = css_pids(task_css(task, pids_cgrp_id)); | ||
6949 | |||
6950 | @@ -342,7 +342,7 @@ struct cgroup_subsys pids_cgrp_subsys = { | ||
6951 | .cancel_attach = pids_cancel_attach, | ||
6952 | .can_fork = pids_can_fork, | ||
6953 | .cancel_fork = pids_cancel_fork, | ||
6954 | - .free = pids_free, | ||
6955 | + .release = pids_release, | ||
6956 | .legacy_cftypes = pids_files, | ||
6957 | .dfl_cftypes = pids_files, | ||
6958 | .threaded = true, | ||
6959 | diff --git a/kernel/cgroup/rstat.c b/kernel/cgroup/rstat.c | ||
6960 | index d503d1a9007c..bb95a35e8c2d 100644 | ||
6961 | --- a/kernel/cgroup/rstat.c | ||
6962 | +++ b/kernel/cgroup/rstat.c | ||
6963 | @@ -87,7 +87,6 @@ static struct cgroup *cgroup_rstat_cpu_pop_updated(struct cgroup *pos, | ||
6964 | struct cgroup *root, int cpu) | ||
6965 | { | ||
6966 | struct cgroup_rstat_cpu *rstatc; | ||
6967 | - struct cgroup *parent; | ||
6968 | |||
6969 | if (pos == root) | ||
6970 | return NULL; | ||
6971 | @@ -115,8 +114,8 @@ static struct cgroup *cgroup_rstat_cpu_pop_updated(struct cgroup *pos, | ||
6972 | * However, due to the way we traverse, @pos will be the first | ||
6973 | * child in most cases. The only exception is @root. | ||
6974 | */ | ||
6975 | - parent = cgroup_parent(pos); | ||
6976 | - if (parent && rstatc->updated_next) { | ||
6977 | + if (rstatc->updated_next) { | ||
6978 | + struct cgroup *parent = cgroup_parent(pos); | ||
6979 | struct cgroup_rstat_cpu *prstatc = cgroup_rstat_cpu(parent, cpu); | ||
6980 | struct cgroup_rstat_cpu *nrstatc; | ||
6981 | struct cgroup **nextp; | ||
6982 | @@ -140,9 +139,12 @@ static struct cgroup *cgroup_rstat_cpu_pop_updated(struct cgroup *pos, | ||
6983 | * updated stat. | ||
6984 | */ | ||
6985 | smp_mb(); | ||
6986 | + | ||
6987 | + return pos; | ||
6988 | } | ||
6989 | |||
6990 | - return pos; | ||
6991 | + /* only happens for @root */ | ||
6992 | + return NULL; | ||
6993 | } | ||
6994 | |||
6995 | /* see cgroup_rstat_flush() */ | ||
6996 | diff --git a/kernel/cpu.c b/kernel/cpu.c | ||
6997 | index 47f695d80dd1..6754f3ecfd94 100644 | ||
6998 | --- a/kernel/cpu.c | ||
6999 | +++ b/kernel/cpu.c | ||
7000 | @@ -313,6 +313,15 @@ void cpus_write_unlock(void) | ||
7001 | |||
7002 | void lockdep_assert_cpus_held(void) | ||
7003 | { | ||
7004 | + /* | ||
7005 | + * We can't have hotplug operations before userspace starts running, | ||
7006 | + * and some init codepaths will knowingly not take the hotplug lock. | ||
7007 | + * This is all valid, so mute lockdep until it makes sense to report | ||
7008 | + * unheld locks. | ||
7009 | + */ | ||
7010 | + if (system_state < SYSTEM_RUNNING) | ||
7011 | + return; | ||
7012 | + | ||
7013 | percpu_rwsem_assert_held(&cpu_hotplug_lock); | ||
7014 | } | ||
7015 | |||
7016 | diff --git a/kernel/events/ring_buffer.c b/kernel/events/ring_buffer.c | ||
7017 | index 5ab4fe3b1dcc..878c62ec0190 100644 | ||
7018 | --- a/kernel/events/ring_buffer.c | ||
7019 | +++ b/kernel/events/ring_buffer.c | ||
7020 | @@ -658,7 +658,7 @@ int rb_alloc_aux(struct ring_buffer *rb, struct perf_event *event, | ||
7021 | goto out; | ||
7022 | } | ||
7023 | |||
7024 | - rb->aux_priv = event->pmu->setup_aux(event->cpu, rb->aux_pages, nr_pages, | ||
7025 | + rb->aux_priv = event->pmu->setup_aux(event, rb->aux_pages, nr_pages, | ||
7026 | overwrite); | ||
7027 | if (!rb->aux_priv) | ||
7028 | goto out; | ||
7029 | diff --git a/kernel/exit.c b/kernel/exit.c | ||
7030 | index 2639a30a8aa5..2166c2d92ddc 100644 | ||
7031 | --- a/kernel/exit.c | ||
7032 | +++ b/kernel/exit.c | ||
7033 | @@ -219,6 +219,7 @@ repeat: | ||
7034 | } | ||
7035 | |||
7036 | write_unlock_irq(&tasklist_lock); | ||
7037 | + cgroup_release(p); | ||
7038 | release_thread(p); | ||
7039 | call_rcu(&p->rcu, delayed_put_task_struct); | ||
7040 | |||
7041 | diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c | ||
7042 | index 34e969069488..e960c4f46ee0 100644 | ||
7043 | --- a/kernel/irq/chip.c | ||
7044 | +++ b/kernel/irq/chip.c | ||
7045 | @@ -855,7 +855,11 @@ void handle_percpu_irq(struct irq_desc *desc) | ||
7046 | { | ||
7047 | struct irq_chip *chip = irq_desc_get_chip(desc); | ||
7048 | |||
7049 | - kstat_incr_irqs_this_cpu(desc); | ||
7050 | + /* | ||
7051 | + * PER CPU interrupts are not serialized. Do not touch | ||
7052 | + * desc->tot_count. | ||
7053 | + */ | ||
7054 | + __kstat_incr_irqs_this_cpu(desc); | ||
7055 | |||
7056 | if (chip->irq_ack) | ||
7057 | chip->irq_ack(&desc->irq_data); | ||
7058 | @@ -884,7 +888,11 @@ void handle_percpu_devid_irq(struct irq_desc *desc) | ||
7059 | unsigned int irq = irq_desc_get_irq(desc); | ||
7060 | irqreturn_t res; | ||
7061 | |||
7062 | - kstat_incr_irqs_this_cpu(desc); | ||
7063 | + /* | ||
7064 | + * PER CPU interrupts are not serialized. Do not touch | ||
7065 | + * desc->tot_count. | ||
7066 | + */ | ||
7067 | + __kstat_incr_irqs_this_cpu(desc); | ||
7068 | |||
7069 | if (chip->irq_ack) | ||
7070 | chip->irq_ack(&desc->irq_data); | ||
7071 | diff --git a/kernel/irq/internals.h b/kernel/irq/internals.h | ||
7072 | index ca6afa267070..e74e7eea76cf 100644 | ||
7073 | --- a/kernel/irq/internals.h | ||
7074 | +++ b/kernel/irq/internals.h | ||
7075 | @@ -242,12 +242,18 @@ static inline void irq_state_set_masked(struct irq_desc *desc) | ||
7076 | |||
7077 | #undef __irqd_to_state | ||
7078 | |||
7079 | -static inline void kstat_incr_irqs_this_cpu(struct irq_desc *desc) | ||
7080 | +static inline void __kstat_incr_irqs_this_cpu(struct irq_desc *desc) | ||
7081 | { | ||
7082 | __this_cpu_inc(*desc->kstat_irqs); | ||
7083 | __this_cpu_inc(kstat.irqs_sum); | ||
7084 | } | ||
7085 | |||
7086 | +static inline void kstat_incr_irqs_this_cpu(struct irq_desc *desc) | ||
7087 | +{ | ||
7088 | + __kstat_incr_irqs_this_cpu(desc); | ||
7089 | + desc->tot_count++; | ||
7090 | +} | ||
7091 | + | ||
7092 | static inline int irq_desc_get_node(struct irq_desc *desc) | ||
7093 | { | ||
7094 | return irq_common_data_get_node(&desc->irq_common_data); | ||
7095 | diff --git a/kernel/irq/irqdesc.c b/kernel/irq/irqdesc.c | ||
7096 | index ef8ad36cadcf..84fa255d0329 100644 | ||
7097 | --- a/kernel/irq/irqdesc.c | ||
7098 | +++ b/kernel/irq/irqdesc.c | ||
7099 | @@ -119,6 +119,7 @@ static void desc_set_defaults(unsigned int irq, struct irq_desc *desc, int node, | ||
7100 | desc->depth = 1; | ||
7101 | desc->irq_count = 0; | ||
7102 | desc->irqs_unhandled = 0; | ||
7103 | + desc->tot_count = 0; | ||
7104 | desc->name = NULL; | ||
7105 | desc->owner = owner; | ||
7106 | for_each_possible_cpu(cpu) | ||
7107 | @@ -919,11 +920,15 @@ unsigned int kstat_irqs_cpu(unsigned int irq, int cpu) | ||
7108 | unsigned int kstat_irqs(unsigned int irq) | ||
7109 | { | ||
7110 | struct irq_desc *desc = irq_to_desc(irq); | ||
7111 | - int cpu; | ||
7112 | unsigned int sum = 0; | ||
7113 | + int cpu; | ||
7114 | |||
7115 | if (!desc || !desc->kstat_irqs) | ||
7116 | return 0; | ||
7117 | + if (!irq_settings_is_per_cpu_devid(desc) && | ||
7118 | + !irq_settings_is_per_cpu(desc)) | ||
7119 | + return desc->tot_count; | ||
7120 | + | ||
7121 | for_each_possible_cpu(cpu) | ||
7122 | sum += *per_cpu_ptr(desc->kstat_irqs, cpu); | ||
7123 | return sum; | ||
7124 | diff --git a/kernel/rcu/update.c b/kernel/rcu/update.c | ||
7125 | index 1971869c4072..f4ca36d92138 100644 | ||
7126 | --- a/kernel/rcu/update.c | ||
7127 | +++ b/kernel/rcu/update.c | ||
7128 | @@ -52,6 +52,7 @@ | ||
7129 | #include <linux/tick.h> | ||
7130 | #include <linux/rcupdate_wait.h> | ||
7131 | #include <linux/sched/isolation.h> | ||
7132 | +#include <linux/kprobes.h> | ||
7133 | |||
7134 | #define CREATE_TRACE_POINTS | ||
7135 | |||
7136 | @@ -249,6 +250,7 @@ int notrace debug_lockdep_rcu_enabled(void) | ||
7137 | current->lockdep_recursion == 0; | ||
7138 | } | ||
7139 | EXPORT_SYMBOL_GPL(debug_lockdep_rcu_enabled); | ||
7140 | +NOKPROBE_SYMBOL(debug_lockdep_rcu_enabled); | ||
7141 | |||
7142 | /** | ||
7143 | * rcu_read_lock_held() - might we be in RCU read-side critical section? | ||
7144 | diff --git a/kernel/resource.c b/kernel/resource.c | ||
7145 | index 915c02e8e5dd..ca7ed5158cff 100644 | ||
7146 | --- a/kernel/resource.c | ||
7147 | +++ b/kernel/resource.c | ||
7148 | @@ -382,7 +382,7 @@ static int __walk_iomem_res_desc(resource_size_t start, resource_size_t end, | ||
7149 | int (*func)(struct resource *, void *)) | ||
7150 | { | ||
7151 | struct resource res; | ||
7152 | - int ret = -1; | ||
7153 | + int ret = -EINVAL; | ||
7154 | |||
7155 | while (start < end && | ||
7156 | !find_next_iomem_res(start, end, flags, desc, first_lvl, &res)) { | ||
7157 | @@ -462,7 +462,7 @@ int walk_system_ram_range(unsigned long start_pfn, unsigned long nr_pages, | ||
7158 | unsigned long flags; | ||
7159 | struct resource res; | ||
7160 | unsigned long pfn, end_pfn; | ||
7161 | - int ret = -1; | ||
7162 | + int ret = -EINVAL; | ||
7163 | |||
7164 | start = (u64) start_pfn << PAGE_SHIFT; | ||
7165 | end = ((u64)(start_pfn + nr_pages) << PAGE_SHIFT) - 1; | ||
7166 | diff --git a/kernel/sched/core.c b/kernel/sched/core.c | ||
7167 | index d8d76a65cfdd..01a2489de94e 100644 | ||
7168 | --- a/kernel/sched/core.c | ||
7169 | +++ b/kernel/sched/core.c | ||
7170 | @@ -107,11 +107,12 @@ struct rq *task_rq_lock(struct task_struct *p, struct rq_flags *rf) | ||
7171 | * [L] ->on_rq | ||
7172 | * RELEASE (rq->lock) | ||
7173 | * | ||
7174 | - * If we observe the old CPU in task_rq_lock, the acquire of | ||
7175 | + * If we observe the old CPU in task_rq_lock(), the acquire of | ||
7176 | * the old rq->lock will fully serialize against the stores. | ||
7177 | * | ||
7178 | - * If we observe the new CPU in task_rq_lock, the acquire will | ||
7179 | - * pair with the WMB to ensure we must then also see migrating. | ||
7180 | + * If we observe the new CPU in task_rq_lock(), the address | ||
7181 | + * dependency headed by '[L] rq = task_rq()' and the acquire | ||
7182 | + * will pair with the WMB to ensure we then also see migrating. | ||
7183 | */ | ||
7184 | if (likely(rq == task_rq(p) && !task_on_rq_migrating(p))) { | ||
7185 | rq_pin_lock(rq, rf); | ||
7186 | @@ -928,7 +929,7 @@ static struct rq *move_queued_task(struct rq *rq, struct rq_flags *rf, | ||
7187 | { | ||
7188 | lockdep_assert_held(&rq->lock); | ||
7189 | |||
7190 | - p->on_rq = TASK_ON_RQ_MIGRATING; | ||
7191 | + WRITE_ONCE(p->on_rq, TASK_ON_RQ_MIGRATING); | ||
7192 | dequeue_task(rq, p, DEQUEUE_NOCLOCK); | ||
7193 | set_task_cpu(p, new_cpu); | ||
7194 | rq_unlock(rq, rf); | ||
7195 | diff --git a/kernel/sched/debug.c b/kernel/sched/debug.c | ||
7196 | index de3de997e245..8039d62ae36e 100644 | ||
7197 | --- a/kernel/sched/debug.c | ||
7198 | +++ b/kernel/sched/debug.c | ||
7199 | @@ -315,6 +315,7 @@ void register_sched_domain_sysctl(void) | ||
7200 | { | ||
7201 | static struct ctl_table *cpu_entries; | ||
7202 | static struct ctl_table **cpu_idx; | ||
7203 | + static bool init_done = false; | ||
7204 | char buf[32]; | ||
7205 | int i; | ||
7206 | |||
7207 | @@ -344,7 +345,10 @@ void register_sched_domain_sysctl(void) | ||
7208 | if (!cpumask_available(sd_sysctl_cpus)) { | ||
7209 | if (!alloc_cpumask_var(&sd_sysctl_cpus, GFP_KERNEL)) | ||
7210 | return; | ||
7211 | + } | ||
7212 | |||
7213 | + if (!init_done) { | ||
7214 | + init_done = true; | ||
7215 | /* init to possible to not have holes in @cpu_entries */ | ||
7216 | cpumask_copy(sd_sysctl_cpus, cpu_possible_mask); | ||
7217 | } | ||
7218 | diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h | ||
7219 | index d04530bf251f..425a5589e5f6 100644 | ||
7220 | --- a/kernel/sched/sched.h | ||
7221 | +++ b/kernel/sched/sched.h | ||
7222 | @@ -1460,9 +1460,9 @@ static inline void __set_task_cpu(struct task_struct *p, unsigned int cpu) | ||
7223 | */ | ||
7224 | smp_wmb(); | ||
7225 | #ifdef CONFIG_THREAD_INFO_IN_TASK | ||
7226 | - p->cpu = cpu; | ||
7227 | + WRITE_ONCE(p->cpu, cpu); | ||
7228 | #else | ||
7229 | - task_thread_info(p)->cpu = cpu; | ||
7230 | + WRITE_ONCE(task_thread_info(p)->cpu, cpu); | ||
7231 | #endif | ||
7232 | p->wake_cpu = cpu; | ||
7233 | #endif | ||
7234 | @@ -1563,7 +1563,7 @@ static inline int task_on_rq_queued(struct task_struct *p) | ||
7235 | |||
7236 | static inline int task_on_rq_migrating(struct task_struct *p) | ||
7237 | { | ||
7238 | - return p->on_rq == TASK_ON_RQ_MIGRATING; | ||
7239 | + return READ_ONCE(p->on_rq) == TASK_ON_RQ_MIGRATING; | ||
7240 | } | ||
7241 | |||
7242 | /* | ||
7243 | diff --git a/kernel/sched/topology.c b/kernel/sched/topology.c | ||
7244 | index 3f35ba1d8fde..efca2489d881 100644 | ||
7245 | --- a/kernel/sched/topology.c | ||
7246 | +++ b/kernel/sched/topology.c | ||
7247 | @@ -676,7 +676,7 @@ cpu_attach_domain(struct sched_domain *sd, struct root_domain *rd, int cpu) | ||
7248 | } | ||
7249 | |||
7250 | struct s_data { | ||
7251 | - struct sched_domain ** __percpu sd; | ||
7252 | + struct sched_domain * __percpu *sd; | ||
7253 | struct root_domain *rd; | ||
7254 | }; | ||
7255 | |||
7256 | diff --git a/kernel/sysctl.c b/kernel/sysctl.c | ||
7257 | index d80bee8ff12e..28ec71d914c7 100644 | ||
7258 | --- a/kernel/sysctl.c | ||
7259 | +++ b/kernel/sysctl.c | ||
7260 | @@ -127,6 +127,7 @@ static int __maybe_unused one = 1; | ||
7261 | static int __maybe_unused two = 2; | ||
7262 | static int __maybe_unused four = 4; | ||
7263 | static unsigned long one_ul = 1; | ||
7264 | +static unsigned long long_max = LONG_MAX; | ||
7265 | static int one_hundred = 100; | ||
7266 | static int one_thousand = 1000; | ||
7267 | #ifdef CONFIG_PRINTK | ||
7268 | @@ -1722,6 +1723,8 @@ static struct ctl_table fs_table[] = { | ||
7269 | .maxlen = sizeof(files_stat.max_files), | ||
7270 | .mode = 0644, | ||
7271 | .proc_handler = proc_doulongvec_minmax, | ||
7272 | + .extra1 = &zero, | ||
7273 | + .extra2 = &long_max, | ||
7274 | }, | ||
7275 | { | ||
7276 | .procname = "nr_open", | ||
7277 | diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c | ||
7278 | index 06e864a334bb..b49affb4666b 100644 | ||
7279 | --- a/kernel/trace/ring_buffer.c | ||
7280 | +++ b/kernel/trace/ring_buffer.c | ||
7281 | @@ -4205,6 +4205,7 @@ EXPORT_SYMBOL_GPL(ring_buffer_consume); | ||
7282 | * ring_buffer_read_prepare - Prepare for a non consuming read of the buffer | ||
7283 | * @buffer: The ring buffer to read from | ||
7284 | * @cpu: The cpu buffer to iterate over | ||
7285 | + * @flags: gfp flags to use for memory allocation | ||
7286 | * | ||
7287 | * This performs the initial preparations necessary to iterate | ||
7288 | * through the buffer. Memory is allocated, buffer recording | ||
7289 | @@ -4222,7 +4223,7 @@ EXPORT_SYMBOL_GPL(ring_buffer_consume); | ||
7290 | * This overall must be paired with ring_buffer_read_finish. | ||
7291 | */ | ||
7292 | struct ring_buffer_iter * | ||
7293 | -ring_buffer_read_prepare(struct ring_buffer *buffer, int cpu) | ||
7294 | +ring_buffer_read_prepare(struct ring_buffer *buffer, int cpu, gfp_t flags) | ||
7295 | { | ||
7296 | struct ring_buffer_per_cpu *cpu_buffer; | ||
7297 | struct ring_buffer_iter *iter; | ||
7298 | @@ -4230,7 +4231,7 @@ ring_buffer_read_prepare(struct ring_buffer *buffer, int cpu) | ||
7299 | if (!cpumask_test_cpu(cpu, buffer->cpumask)) | ||
7300 | return NULL; | ||
7301 | |||
7302 | - iter = kmalloc(sizeof(*iter), GFP_KERNEL); | ||
7303 | + iter = kmalloc(sizeof(*iter), flags); | ||
7304 | if (!iter) | ||
7305 | return NULL; | ||
7306 | |||
7307 | diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c | ||
7308 | index 5f40db27aaf2..89158aa93fa6 100644 | ||
7309 | --- a/kernel/trace/trace.c | ||
7310 | +++ b/kernel/trace/trace.c | ||
7311 | @@ -3904,7 +3904,8 @@ __tracing_open(struct inode *inode, struct file *file, bool snapshot) | ||
7312 | if (iter->cpu_file == RING_BUFFER_ALL_CPUS) { | ||
7313 | for_each_tracing_cpu(cpu) { | ||
7314 | iter->buffer_iter[cpu] = | ||
7315 | - ring_buffer_read_prepare(iter->trace_buffer->buffer, cpu); | ||
7316 | + ring_buffer_read_prepare(iter->trace_buffer->buffer, | ||
7317 | + cpu, GFP_KERNEL); | ||
7318 | } | ||
7319 | ring_buffer_read_prepare_sync(); | ||
7320 | for_each_tracing_cpu(cpu) { | ||
7321 | @@ -3914,7 +3915,8 @@ __tracing_open(struct inode *inode, struct file *file, bool snapshot) | ||
7322 | } else { | ||
7323 | cpu = iter->cpu_file; | ||
7324 | iter->buffer_iter[cpu] = | ||
7325 | - ring_buffer_read_prepare(iter->trace_buffer->buffer, cpu); | ||
7326 | + ring_buffer_read_prepare(iter->trace_buffer->buffer, | ||
7327 | + cpu, GFP_KERNEL); | ||
7328 | ring_buffer_read_prepare_sync(); | ||
7329 | ring_buffer_read_start(iter->buffer_iter[cpu]); | ||
7330 | tracing_iter_reset(iter, cpu); | ||
7331 | diff --git a/kernel/trace/trace_kdb.c b/kernel/trace/trace_kdb.c | ||
7332 | index d953c163a079..810d78a8d14c 100644 | ||
7333 | --- a/kernel/trace/trace_kdb.c | ||
7334 | +++ b/kernel/trace/trace_kdb.c | ||
7335 | @@ -51,14 +51,16 @@ static void ftrace_dump_buf(int skip_lines, long cpu_file) | ||
7336 | if (cpu_file == RING_BUFFER_ALL_CPUS) { | ||
7337 | for_each_tracing_cpu(cpu) { | ||
7338 | iter.buffer_iter[cpu] = | ||
7339 | - ring_buffer_read_prepare(iter.trace_buffer->buffer, cpu); | ||
7340 | + ring_buffer_read_prepare(iter.trace_buffer->buffer, | ||
7341 | + cpu, GFP_ATOMIC); | ||
7342 | ring_buffer_read_start(iter.buffer_iter[cpu]); | ||
7343 | tracing_iter_reset(&iter, cpu); | ||
7344 | } | ||
7345 | } else { | ||
7346 | iter.cpu_file = cpu_file; | ||
7347 | iter.buffer_iter[cpu_file] = | ||
7348 | - ring_buffer_read_prepare(iter.trace_buffer->buffer, cpu_file); | ||
7349 | + ring_buffer_read_prepare(iter.trace_buffer->buffer, | ||
7350 | + cpu_file, GFP_ATOMIC); | ||
7351 | ring_buffer_read_start(iter.buffer_iter[cpu_file]); | ||
7352 | tracing_iter_reset(&iter, cpu_file); | ||
7353 | } | ||
7354 | diff --git a/lib/bsearch.c b/lib/bsearch.c | ||
7355 | index 18b445b010c3..82512fe7b33c 100644 | ||
7356 | --- a/lib/bsearch.c | ||
7357 | +++ b/lib/bsearch.c | ||
7358 | @@ -11,6 +11,7 @@ | ||
7359 | |||
7360 | #include <linux/export.h> | ||
7361 | #include <linux/bsearch.h> | ||
7362 | +#include <linux/kprobes.h> | ||
7363 | |||
7364 | /* | ||
7365 | * bsearch - binary search an array of elements | ||
7366 | @@ -53,3 +54,4 @@ void *bsearch(const void *key, const void *base, size_t num, size_t size, | ||
7367 | return NULL; | ||
7368 | } | ||
7369 | EXPORT_SYMBOL(bsearch); | ||
7370 | +NOKPROBE_SYMBOL(bsearch); | ||
7371 | diff --git a/lib/raid6/Makefile b/lib/raid6/Makefile | ||
7372 | index 4e90d443d1b0..e723eacf7868 100644 | ||
7373 | --- a/lib/raid6/Makefile | ||
7374 | +++ b/lib/raid6/Makefile | ||
7375 | @@ -39,7 +39,7 @@ endif | ||
7376 | ifeq ($(CONFIG_KERNEL_MODE_NEON),y) | ||
7377 | NEON_FLAGS := -ffreestanding | ||
7378 | ifeq ($(ARCH),arm) | ||
7379 | -NEON_FLAGS += -mfloat-abi=softfp -mfpu=neon | ||
7380 | +NEON_FLAGS += -march=armv7-a -mfloat-abi=softfp -mfpu=neon | ||
7381 | endif | ||
7382 | CFLAGS_recov_neon_inner.o += $(NEON_FLAGS) | ||
7383 | ifeq ($(ARCH),arm64) | ||
7384 | diff --git a/mm/cma.c b/mm/cma.c | ||
7385 | index c7b39dd3b4f6..f4f3a8a57d86 100644 | ||
7386 | --- a/mm/cma.c | ||
7387 | +++ b/mm/cma.c | ||
7388 | @@ -353,12 +353,14 @@ int __init cma_declare_contiguous(phys_addr_t base, | ||
7389 | |||
7390 | ret = cma_init_reserved_mem(base, size, order_per_bit, name, res_cma); | ||
7391 | if (ret) | ||
7392 | - goto err; | ||
7393 | + goto free_mem; | ||
7394 | |||
7395 | pr_info("Reserved %ld MiB at %pa\n", (unsigned long)size / SZ_1M, | ||
7396 | &base); | ||
7397 | return 0; | ||
7398 | |||
7399 | +free_mem: | ||
7400 | + memblock_free(base, size); | ||
7401 | err: | ||
7402 | pr_err("Failed to reserve %ld MiB\n", (unsigned long)size / SZ_1M); | ||
7403 | return ret; | ||
7404 | diff --git a/mm/kasan/common.c b/mm/kasan/common.c | ||
7405 | index 09b534fbba17..80bbe62b16cd 100644 | ||
7406 | --- a/mm/kasan/common.c | ||
7407 | +++ b/mm/kasan/common.c | ||
7408 | @@ -14,6 +14,8 @@ | ||
7409 | * | ||
7410 | */ | ||
7411 | |||
7412 | +#define __KASAN_INTERNAL | ||
7413 | + | ||
7414 | #include <linux/export.h> | ||
7415 | #include <linux/interrupt.h> | ||
7416 | #include <linux/init.h> | ||
7417 | diff --git a/mm/memcontrol.c b/mm/memcontrol.c | ||
7418 | index af7f18b32389..79a7d2a06bba 100644 | ||
7419 | --- a/mm/memcontrol.c | ||
7420 | +++ b/mm/memcontrol.c | ||
7421 | @@ -248,6 +248,12 @@ enum res_type { | ||
7422 | iter != NULL; \ | ||
7423 | iter = mem_cgroup_iter(NULL, iter, NULL)) | ||
7424 | |||
7425 | +static inline bool should_force_charge(void) | ||
7426 | +{ | ||
7427 | + return tsk_is_oom_victim(current) || fatal_signal_pending(current) || | ||
7428 | + (current->flags & PF_EXITING); | ||
7429 | +} | ||
7430 | + | ||
7431 | /* Some nice accessors for the vmpressure. */ | ||
7432 | struct vmpressure *memcg_to_vmpressure(struct mem_cgroup *memcg) | ||
7433 | { | ||
7434 | @@ -1389,8 +1395,13 @@ static bool mem_cgroup_out_of_memory(struct mem_cgroup *memcg, gfp_t gfp_mask, | ||
7435 | }; | ||
7436 | bool ret; | ||
7437 | |||
7438 | - mutex_lock(&oom_lock); | ||
7439 | - ret = out_of_memory(&oc); | ||
7440 | + if (mutex_lock_killable(&oom_lock)) | ||
7441 | + return true; | ||
7442 | + /* | ||
7443 | + * A few threads which were not waiting at mutex_lock_killable() can | ||
7444 | + * fail to bail out. Therefore, check again after holding oom_lock. | ||
7445 | + */ | ||
7446 | + ret = should_force_charge() || out_of_memory(&oc); | ||
7447 | mutex_unlock(&oom_lock); | ||
7448 | return ret; | ||
7449 | } | ||
7450 | @@ -2209,9 +2220,7 @@ retry: | ||
7451 | * bypass the last charges so that they can exit quickly and | ||
7452 | * free their memory. | ||
7453 | */ | ||
7454 | - if (unlikely(tsk_is_oom_victim(current) || | ||
7455 | - fatal_signal_pending(current) || | ||
7456 | - current->flags & PF_EXITING)) | ||
7457 | + if (unlikely(should_force_charge())) | ||
7458 | goto force; | ||
7459 | |||
7460 | /* | ||
7461 | diff --git a/mm/mempolicy.c b/mm/mempolicy.c | ||
7462 | index 6bc9786aad6e..c2275c1e6d2a 100644 | ||
7463 | --- a/mm/mempolicy.c | ||
7464 | +++ b/mm/mempolicy.c | ||
7465 | @@ -350,7 +350,7 @@ static void mpol_rebind_policy(struct mempolicy *pol, const nodemask_t *newmask) | ||
7466 | { | ||
7467 | if (!pol) | ||
7468 | return; | ||
7469 | - if (!mpol_store_user_nodemask(pol) && | ||
7470 | + if (!mpol_store_user_nodemask(pol) && !(pol->flags & MPOL_F_LOCAL) && | ||
7471 | nodes_equal(pol->w.cpuset_mems_allowed, *newmask)) | ||
7472 | return; | ||
7473 | |||
7474 | diff --git a/mm/oom_kill.c b/mm/oom_kill.c | ||
7475 | index 26ea8636758f..da0e44914085 100644 | ||
7476 | --- a/mm/oom_kill.c | ||
7477 | +++ b/mm/oom_kill.c | ||
7478 | @@ -928,7 +928,8 @@ static void __oom_kill_process(struct task_struct *victim) | ||
7479 | */ | ||
7480 | static int oom_kill_memcg_member(struct task_struct *task, void *unused) | ||
7481 | { | ||
7482 | - if (task->signal->oom_score_adj != OOM_SCORE_ADJ_MIN) { | ||
7483 | + if (task->signal->oom_score_adj != OOM_SCORE_ADJ_MIN && | ||
7484 | + !is_global_init(task)) { | ||
7485 | get_task_struct(task); | ||
7486 | __oom_kill_process(task); | ||
7487 | } | ||
7488 | diff --git a/mm/page_alloc.c b/mm/page_alloc.c | ||
7489 | index 11dc3c0e8728..20dd3283bb1b 100644 | ||
7490 | --- a/mm/page_alloc.c | ||
7491 | +++ b/mm/page_alloc.c | ||
7492 | @@ -1945,8 +1945,8 @@ inline void post_alloc_hook(struct page *page, unsigned int order, | ||
7493 | |||
7494 | arch_alloc_page(page, order); | ||
7495 | kernel_map_pages(page, 1 << order, 1); | ||
7496 | - kernel_poison_pages(page, 1 << order, 1); | ||
7497 | kasan_alloc_pages(page, order); | ||
7498 | + kernel_poison_pages(page, 1 << order, 1); | ||
7499 | set_page_owner(page, order, gfp_flags); | ||
7500 | } | ||
7501 | |||
7502 | diff --git a/mm/page_ext.c b/mm/page_ext.c | ||
7503 | index 8c78b8d45117..f116431c3dee 100644 | ||
7504 | --- a/mm/page_ext.c | ||
7505 | +++ b/mm/page_ext.c | ||
7506 | @@ -273,6 +273,7 @@ static void free_page_ext(void *addr) | ||
7507 | table_size = get_entry_size() * PAGES_PER_SECTION; | ||
7508 | |||
7509 | BUG_ON(PageReserved(page)); | ||
7510 | + kmemleak_free(addr); | ||
7511 | free_pages_exact(addr, table_size); | ||
7512 | } | ||
7513 | } | ||
7514 | diff --git a/mm/page_poison.c b/mm/page_poison.c | ||
7515 | index f0c15e9017c0..21d4f97cb49b 100644 | ||
7516 | --- a/mm/page_poison.c | ||
7517 | +++ b/mm/page_poison.c | ||
7518 | @@ -6,6 +6,7 @@ | ||
7519 | #include <linux/page_ext.h> | ||
7520 | #include <linux/poison.h> | ||
7521 | #include <linux/ratelimit.h> | ||
7522 | +#include <linux/kasan.h> | ||
7523 | |||
7524 | static bool want_page_poisoning __read_mostly; | ||
7525 | |||
7526 | @@ -40,7 +41,10 @@ static void poison_page(struct page *page) | ||
7527 | { | ||
7528 | void *addr = kmap_atomic(page); | ||
7529 | |||
7530 | + /* KASAN still think the page is in-use, so skip it. */ | ||
7531 | + kasan_disable_current(); | ||
7532 | memset(addr, PAGE_POISON, PAGE_SIZE); | ||
7533 | + kasan_enable_current(); | ||
7534 | kunmap_atomic(addr); | ||
7535 | } | ||
7536 | |||
7537 | diff --git a/mm/slab.c b/mm/slab.c | ||
7538 | index b3e74b56a468..2f2aa8eaf7d9 100644 | ||
7539 | --- a/mm/slab.c | ||
7540 | +++ b/mm/slab.c | ||
7541 | @@ -550,14 +550,6 @@ static void start_cpu_timer(int cpu) | ||
7542 | |||
7543 | static void init_arraycache(struct array_cache *ac, int limit, int batch) | ||
7544 | { | ||
7545 | - /* | ||
7546 | - * The array_cache structures contain pointers to free object. | ||
7547 | - * However, when such objects are allocated or transferred to another | ||
7548 | - * cache the pointers are not cleared and they could be counted as | ||
7549 | - * valid references during a kmemleak scan. Therefore, kmemleak must | ||
7550 | - * not scan such objects. | ||
7551 | - */ | ||
7552 | - kmemleak_no_scan(ac); | ||
7553 | if (ac) { | ||
7554 | ac->avail = 0; | ||
7555 | ac->limit = limit; | ||
7556 | @@ -573,6 +565,14 @@ static struct array_cache *alloc_arraycache(int node, int entries, | ||
7557 | struct array_cache *ac = NULL; | ||
7558 | |||
7559 | ac = kmalloc_node(memsize, gfp, node); | ||
7560 | + /* | ||
7561 | + * The array_cache structures contain pointers to free object. | ||
7562 | + * However, when such objects are allocated or transferred to another | ||
7563 | + * cache the pointers are not cleared and they could be counted as | ||
7564 | + * valid references during a kmemleak scan. Therefore, kmemleak must | ||
7565 | + * not scan such objects. | ||
7566 | + */ | ||
7567 | + kmemleak_no_scan(ac); | ||
7568 | init_arraycache(ac, entries, batchcount); | ||
7569 | return ac; | ||
7570 | } | ||
7571 | @@ -667,6 +667,7 @@ static struct alien_cache *__alloc_alien_cache(int node, int entries, | ||
7572 | |||
7573 | alc = kmalloc_node(memsize, gfp, node); | ||
7574 | if (alc) { | ||
7575 | + kmemleak_no_scan(alc); | ||
7576 | init_arraycache(&alc->ac, entries, batch); | ||
7577 | spin_lock_init(&alc->lock); | ||
7578 | } | ||
7579 | diff --git a/mm/sparse.c b/mm/sparse.c | ||
7580 | index 4763519d4399..b3771f35a0ed 100644 | ||
7581 | --- a/mm/sparse.c | ||
7582 | +++ b/mm/sparse.c | ||
7583 | @@ -197,7 +197,7 @@ static inline int next_present_section_nr(int section_nr) | ||
7584 | } | ||
7585 | #define for_each_present_section_nr(start, section_nr) \ | ||
7586 | for (section_nr = next_present_section_nr(start-1); \ | ||
7587 | - ((section_nr >= 0) && \ | ||
7588 | + ((section_nr != -1) && \ | ||
7589 | (section_nr <= __highest_present_section_nr)); \ | ||
7590 | section_nr = next_present_section_nr(section_nr)) | ||
7591 | |||
7592 | diff --git a/mm/swapfile.c b/mm/swapfile.c | ||
7593 | index dbac1d49469d..67f60e051814 100644 | ||
7594 | --- a/mm/swapfile.c | ||
7595 | +++ b/mm/swapfile.c | ||
7596 | @@ -98,6 +98,15 @@ static atomic_t proc_poll_event = ATOMIC_INIT(0); | ||
7597 | |||
7598 | atomic_t nr_rotate_swap = ATOMIC_INIT(0); | ||
7599 | |||
7600 | +static struct swap_info_struct *swap_type_to_swap_info(int type) | ||
7601 | +{ | ||
7602 | + if (type >= READ_ONCE(nr_swapfiles)) | ||
7603 | + return NULL; | ||
7604 | + | ||
7605 | + smp_rmb(); /* Pairs with smp_wmb in alloc_swap_info. */ | ||
7606 | + return READ_ONCE(swap_info[type]); | ||
7607 | +} | ||
7608 | + | ||
7609 | static inline unsigned char swap_count(unsigned char ent) | ||
7610 | { | ||
7611 | return ent & ~SWAP_HAS_CACHE; /* may include COUNT_CONTINUED flag */ | ||
7612 | @@ -1044,12 +1053,14 @@ noswap: | ||
7613 | /* The only caller of this function is now suspend routine */ | ||
7614 | swp_entry_t get_swap_page_of_type(int type) | ||
7615 | { | ||
7616 | - struct swap_info_struct *si; | ||
7617 | + struct swap_info_struct *si = swap_type_to_swap_info(type); | ||
7618 | pgoff_t offset; | ||
7619 | |||
7620 | - si = swap_info[type]; | ||
7621 | + if (!si) | ||
7622 | + goto fail; | ||
7623 | + | ||
7624 | spin_lock(&si->lock); | ||
7625 | - if (si && (si->flags & SWP_WRITEOK)) { | ||
7626 | + if (si->flags & SWP_WRITEOK) { | ||
7627 | atomic_long_dec(&nr_swap_pages); | ||
7628 | /* This is called for allocating swap entry, not cache */ | ||
7629 | offset = scan_swap_map(si, 1); | ||
7630 | @@ -1060,6 +1071,7 @@ swp_entry_t get_swap_page_of_type(int type) | ||
7631 | atomic_long_inc(&nr_swap_pages); | ||
7632 | } | ||
7633 | spin_unlock(&si->lock); | ||
7634 | +fail: | ||
7635 | return (swp_entry_t) {0}; | ||
7636 | } | ||
7637 | |||
7638 | @@ -1071,9 +1083,9 @@ static struct swap_info_struct *__swap_info_get(swp_entry_t entry) | ||
7639 | if (!entry.val) | ||
7640 | goto out; | ||
7641 | type = swp_type(entry); | ||
7642 | - if (type >= nr_swapfiles) | ||
7643 | + p = swap_type_to_swap_info(type); | ||
7644 | + if (!p) | ||
7645 | goto bad_nofile; | ||
7646 | - p = swap_info[type]; | ||
7647 | if (!(p->flags & SWP_USED)) | ||
7648 | goto bad_device; | ||
7649 | offset = swp_offset(entry); | ||
7650 | @@ -1697,10 +1709,9 @@ int swap_type_of(dev_t device, sector_t offset, struct block_device **bdev_p) | ||
7651 | sector_t swapdev_block(int type, pgoff_t offset) | ||
7652 | { | ||
7653 | struct block_device *bdev; | ||
7654 | + struct swap_info_struct *si = swap_type_to_swap_info(type); | ||
7655 | |||
7656 | - if ((unsigned int)type >= nr_swapfiles) | ||
7657 | - return 0; | ||
7658 | - if (!(swap_info[type]->flags & SWP_WRITEOK)) | ||
7659 | + if (!si || !(si->flags & SWP_WRITEOK)) | ||
7660 | return 0; | ||
7661 | return map_swap_entry(swp_entry(type, offset), &bdev); | ||
7662 | } | ||
7663 | @@ -2258,7 +2269,7 @@ static sector_t map_swap_entry(swp_entry_t entry, struct block_device **bdev) | ||
7664 | struct swap_extent *se; | ||
7665 | pgoff_t offset; | ||
7666 | |||
7667 | - sis = swap_info[swp_type(entry)]; | ||
7668 | + sis = swp_swap_info(entry); | ||
7669 | *bdev = sis->bdev; | ||
7670 | |||
7671 | offset = swp_offset(entry); | ||
7672 | @@ -2700,9 +2711,7 @@ static void *swap_start(struct seq_file *swap, loff_t *pos) | ||
7673 | if (!l) | ||
7674 | return SEQ_START_TOKEN; | ||
7675 | |||
7676 | - for (type = 0; type < nr_swapfiles; type++) { | ||
7677 | - smp_rmb(); /* read nr_swapfiles before swap_info[type] */ | ||
7678 | - si = swap_info[type]; | ||
7679 | + for (type = 0; (si = swap_type_to_swap_info(type)); type++) { | ||
7680 | if (!(si->flags & SWP_USED) || !si->swap_map) | ||
7681 | continue; | ||
7682 | if (!--l) | ||
7683 | @@ -2722,9 +2731,7 @@ static void *swap_next(struct seq_file *swap, void *v, loff_t *pos) | ||
7684 | else | ||
7685 | type = si->type + 1; | ||
7686 | |||
7687 | - for (; type < nr_swapfiles; type++) { | ||
7688 | - smp_rmb(); /* read nr_swapfiles before swap_info[type] */ | ||
7689 | - si = swap_info[type]; | ||
7690 | + for (; (si = swap_type_to_swap_info(type)); type++) { | ||
7691 | if (!(si->flags & SWP_USED) || !si->swap_map) | ||
7692 | continue; | ||
7693 | ++*pos; | ||
7694 | @@ -2831,14 +2838,14 @@ static struct swap_info_struct *alloc_swap_info(void) | ||
7695 | } | ||
7696 | if (type >= nr_swapfiles) { | ||
7697 | p->type = type; | ||
7698 | - swap_info[type] = p; | ||
7699 | + WRITE_ONCE(swap_info[type], p); | ||
7700 | /* | ||
7701 | * Write swap_info[type] before nr_swapfiles, in case a | ||
7702 | * racing procfs swap_start() or swap_next() is reading them. | ||
7703 | * (We never shrink nr_swapfiles, we never free this entry.) | ||
7704 | */ | ||
7705 | smp_wmb(); | ||
7706 | - nr_swapfiles++; | ||
7707 | + WRITE_ONCE(nr_swapfiles, nr_swapfiles + 1); | ||
7708 | } else { | ||
7709 | kvfree(p); | ||
7710 | p = swap_info[type]; | ||
7711 | @@ -3358,7 +3365,7 @@ static int __swap_duplicate(swp_entry_t entry, unsigned char usage) | ||
7712 | { | ||
7713 | struct swap_info_struct *p; | ||
7714 | struct swap_cluster_info *ci; | ||
7715 | - unsigned long offset, type; | ||
7716 | + unsigned long offset; | ||
7717 | unsigned char count; | ||
7718 | unsigned char has_cache; | ||
7719 | int err = -EINVAL; | ||
7720 | @@ -3366,10 +3373,10 @@ static int __swap_duplicate(swp_entry_t entry, unsigned char usage) | ||
7721 | if (non_swap_entry(entry)) | ||
7722 | goto out; | ||
7723 | |||
7724 | - type = swp_type(entry); | ||
7725 | - if (type >= nr_swapfiles) | ||
7726 | + p = swp_swap_info(entry); | ||
7727 | + if (!p) | ||
7728 | goto bad_file; | ||
7729 | - p = swap_info[type]; | ||
7730 | + | ||
7731 | offset = swp_offset(entry); | ||
7732 | if (unlikely(offset >= p->max)) | ||
7733 | goto out; | ||
7734 | @@ -3466,7 +3473,7 @@ int swapcache_prepare(swp_entry_t entry) | ||
7735 | |||
7736 | struct swap_info_struct *swp_swap_info(swp_entry_t entry) | ||
7737 | { | ||
7738 | - return swap_info[swp_type(entry)]; | ||
7739 | + return swap_type_to_swap_info(swp_type(entry)); | ||
7740 | } | ||
7741 | |||
7742 | struct swap_info_struct *page_swap_info(struct page *page) | ||
7743 | diff --git a/mm/vmalloc.c b/mm/vmalloc.c | ||
7744 | index 2cd24186ba84..583630bf247d 100644 | ||
7745 | --- a/mm/vmalloc.c | ||
7746 | +++ b/mm/vmalloc.c | ||
7747 | @@ -498,7 +498,11 @@ nocache: | ||
7748 | } | ||
7749 | |||
7750 | found: | ||
7751 | - if (addr + size > vend) | ||
7752 | + /* | ||
7753 | + * Check also calculated address against the vstart, | ||
7754 | + * because it can be 0 because of big align request. | ||
7755 | + */ | ||
7756 | + if (addr + size > vend || addr < vstart) | ||
7757 | goto overflow; | ||
7758 | |||
7759 | va->va_start = addr; | ||
7760 | diff --git a/net/bridge/br_netfilter_hooks.c b/net/bridge/br_netfilter_hooks.c | ||
7761 | index c93c35bb73dd..40d058378b52 100644 | ||
7762 | --- a/net/bridge/br_netfilter_hooks.c | ||
7763 | +++ b/net/bridge/br_netfilter_hooks.c | ||
7764 | @@ -881,11 +881,6 @@ static const struct nf_br_ops br_ops = { | ||
7765 | .br_dev_xmit_hook = br_nf_dev_xmit, | ||
7766 | }; | ||
7767 | |||
7768 | -void br_netfilter_enable(void) | ||
7769 | -{ | ||
7770 | -} | ||
7771 | -EXPORT_SYMBOL_GPL(br_netfilter_enable); | ||
7772 | - | ||
7773 | /* For br_nf_post_routing, we need (prio = NF_BR_PRI_LAST), because | ||
7774 | * br_dev_queue_push_xmit is called afterwards */ | ||
7775 | static const struct nf_hook_ops br_nf_ops[] = { | ||
7776 | diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c | ||
7777 | index db4d46332e86..9dd4c2048a2b 100644 | ||
7778 | --- a/net/netfilter/nf_conntrack_core.c | ||
7779 | +++ b/net/netfilter/nf_conntrack_core.c | ||
7780 | @@ -901,10 +901,18 @@ __nf_conntrack_confirm(struct sk_buff *skb) | ||
7781 | * REJECT will give spurious warnings here. | ||
7782 | */ | ||
7783 | |||
7784 | - /* No external references means no one else could have | ||
7785 | - * confirmed us. | ||
7786 | + /* Another skb with the same unconfirmed conntrack may | ||
7787 | + * win the race. This may happen for bridge(br_flood) | ||
7788 | + * or broadcast/multicast packets do skb_clone with | ||
7789 | + * unconfirmed conntrack. | ||
7790 | */ | ||
7791 | - WARN_ON(nf_ct_is_confirmed(ct)); | ||
7792 | + if (unlikely(nf_ct_is_confirmed(ct))) { | ||
7793 | + WARN_ON_ONCE(1); | ||
7794 | + nf_conntrack_double_unlock(hash, reply_hash); | ||
7795 | + local_bh_enable(); | ||
7796 | + return NF_DROP; | ||
7797 | + } | ||
7798 | + | ||
7799 | pr_debug("Confirming conntrack %p\n", ct); | ||
7800 | /* We have to check the DYING flag after unlink to prevent | ||
7801 | * a race against nf_ct_get_next_corpse() possibly called from | ||
7802 | diff --git a/net/netfilter/nf_conntrack_proto_tcp.c b/net/netfilter/nf_conntrack_proto_tcp.c | ||
7803 | index 4dcbd51a8e97..74fb3fa34db4 100644 | ||
7804 | --- a/net/netfilter/nf_conntrack_proto_tcp.c | ||
7805 | +++ b/net/netfilter/nf_conntrack_proto_tcp.c | ||
7806 | @@ -828,6 +828,12 @@ static noinline bool tcp_new(struct nf_conn *ct, const struct sk_buff *skb, | ||
7807 | return true; | ||
7808 | } | ||
7809 | |||
7810 | +static bool nf_conntrack_tcp_established(const struct nf_conn *ct) | ||
7811 | +{ | ||
7812 | + return ct->proto.tcp.state == TCP_CONNTRACK_ESTABLISHED && | ||
7813 | + test_bit(IPS_ASSURED_BIT, &ct->status); | ||
7814 | +} | ||
7815 | + | ||
7816 | /* Returns verdict for packet, or -1 for invalid. */ | ||
7817 | static int tcp_packet(struct nf_conn *ct, | ||
7818 | struct sk_buff *skb, | ||
7819 | @@ -1030,16 +1036,38 @@ static int tcp_packet(struct nf_conn *ct, | ||
7820 | new_state = TCP_CONNTRACK_ESTABLISHED; | ||
7821 | break; | ||
7822 | case TCP_CONNTRACK_CLOSE: | ||
7823 | - if (index == TCP_RST_SET | ||
7824 | - && (ct->proto.tcp.seen[!dir].flags & IP_CT_TCP_FLAG_MAXACK_SET) | ||
7825 | - && before(ntohl(th->seq), ct->proto.tcp.seen[!dir].td_maxack)) { | ||
7826 | - /* Invalid RST */ | ||
7827 | - spin_unlock_bh(&ct->lock); | ||
7828 | - nf_ct_l4proto_log_invalid(skb, ct, "invalid rst"); | ||
7829 | - return -NF_ACCEPT; | ||
7830 | + if (index != TCP_RST_SET) | ||
7831 | + break; | ||
7832 | + | ||
7833 | + if (ct->proto.tcp.seen[!dir].flags & IP_CT_TCP_FLAG_MAXACK_SET) { | ||
7834 | + u32 seq = ntohl(th->seq); | ||
7835 | + | ||
7836 | + if (before(seq, ct->proto.tcp.seen[!dir].td_maxack)) { | ||
7837 | + /* Invalid RST */ | ||
7838 | + spin_unlock_bh(&ct->lock); | ||
7839 | + nf_ct_l4proto_log_invalid(skb, ct, "invalid rst"); | ||
7840 | + return -NF_ACCEPT; | ||
7841 | + } | ||
7842 | + | ||
7843 | + if (!nf_conntrack_tcp_established(ct) || | ||
7844 | + seq == ct->proto.tcp.seen[!dir].td_maxack) | ||
7845 | + break; | ||
7846 | + | ||
7847 | + /* Check if rst is part of train, such as | ||
7848 | + * foo:80 > bar:4379: P, 235946583:235946602(19) ack 42 | ||
7849 | + * foo:80 > bar:4379: R, 235946602:235946602(0) ack 42 | ||
7850 | + */ | ||
7851 | + if (ct->proto.tcp.last_index == TCP_ACK_SET && | ||
7852 | + ct->proto.tcp.last_dir == dir && | ||
7853 | + seq == ct->proto.tcp.last_end) | ||
7854 | + break; | ||
7855 | + | ||
7856 | + /* ... RST sequence number doesn't match exactly, keep | ||
7857 | + * established state to allow a possible challenge ACK. | ||
7858 | + */ | ||
7859 | + new_state = old_state; | ||
7860 | } | ||
7861 | - if (index == TCP_RST_SET | ||
7862 | - && ((test_bit(IPS_SEEN_REPLY_BIT, &ct->status) | ||
7863 | + if (((test_bit(IPS_SEEN_REPLY_BIT, &ct->status) | ||
7864 | && ct->proto.tcp.last_index == TCP_SYN_SET) | ||
7865 | || (!test_bit(IPS_ASSURED_BIT, &ct->status) | ||
7866 | && ct->proto.tcp.last_index == TCP_ACK_SET)) | ||
7867 | @@ -1055,7 +1083,7 @@ static int tcp_packet(struct nf_conn *ct, | ||
7868 | * segments we ignored. */ | ||
7869 | goto in_window; | ||
7870 | } | ||
7871 | - /* Just fall through */ | ||
7872 | + break; | ||
7873 | default: | ||
7874 | /* Keep compilers happy. */ | ||
7875 | break; | ||
7876 | @@ -1090,6 +1118,8 @@ static int tcp_packet(struct nf_conn *ct, | ||
7877 | if (ct->proto.tcp.retrans >= tn->tcp_max_retrans && | ||
7878 | timeouts[new_state] > timeouts[TCP_CONNTRACK_RETRANS]) | ||
7879 | timeout = timeouts[TCP_CONNTRACK_RETRANS]; | ||
7880 | + else if (unlikely(index == TCP_RST_SET)) | ||
7881 | + timeout = timeouts[TCP_CONNTRACK_CLOSE]; | ||
7882 | else if ((ct->proto.tcp.seen[0].flags | ct->proto.tcp.seen[1].flags) & | ||
7883 | IP_CT_TCP_FLAG_DATA_UNACKNOWLEDGED && | ||
7884 | timeouts[new_state] > timeouts[TCP_CONNTRACK_UNACK]) | ||
7885 | diff --git a/net/netfilter/nf_tables_core.c b/net/netfilter/nf_tables_core.c | ||
7886 | index a50500232b0a..7e8dae82ca52 100644 | ||
7887 | --- a/net/netfilter/nf_tables_core.c | ||
7888 | +++ b/net/netfilter/nf_tables_core.c | ||
7889 | @@ -98,21 +98,23 @@ static noinline void nft_update_chain_stats(const struct nft_chain *chain, | ||
7890 | const struct nft_pktinfo *pkt) | ||
7891 | { | ||
7892 | struct nft_base_chain *base_chain; | ||
7893 | + struct nft_stats __percpu *pstats; | ||
7894 | struct nft_stats *stats; | ||
7895 | |||
7896 | base_chain = nft_base_chain(chain); | ||
7897 | - if (!rcu_access_pointer(base_chain->stats)) | ||
7898 | - return; | ||
7899 | |||
7900 | - local_bh_disable(); | ||
7901 | - stats = this_cpu_ptr(rcu_dereference(base_chain->stats)); | ||
7902 | - if (stats) { | ||
7903 | + rcu_read_lock(); | ||
7904 | + pstats = READ_ONCE(base_chain->stats); | ||
7905 | + if (pstats) { | ||
7906 | + local_bh_disable(); | ||
7907 | + stats = this_cpu_ptr(pstats); | ||
7908 | u64_stats_update_begin(&stats->syncp); | ||
7909 | stats->pkts++; | ||
7910 | stats->bytes += pkt->skb->len; | ||
7911 | u64_stats_update_end(&stats->syncp); | ||
7912 | + local_bh_enable(); | ||
7913 | } | ||
7914 | - local_bh_enable(); | ||
7915 | + rcu_read_unlock(); | ||
7916 | } | ||
7917 | |||
7918 | struct nft_jumpstack { | ||
7919 | diff --git a/net/netfilter/xt_physdev.c b/net/netfilter/xt_physdev.c | ||
7920 | index 4034d70bff39..b2e39cb6a590 100644 | ||
7921 | --- a/net/netfilter/xt_physdev.c | ||
7922 | +++ b/net/netfilter/xt_physdev.c | ||
7923 | @@ -96,8 +96,7 @@ match_outdev: | ||
7924 | static int physdev_mt_check(const struct xt_mtchk_param *par) | ||
7925 | { | ||
7926 | const struct xt_physdev_info *info = par->matchinfo; | ||
7927 | - | ||
7928 | - br_netfilter_enable(); | ||
7929 | + static bool brnf_probed __read_mostly; | ||
7930 | |||
7931 | if (!(info->bitmask & XT_PHYSDEV_OP_MASK) || | ||
7932 | info->bitmask & ~XT_PHYSDEV_OP_MASK) | ||
7933 | @@ -111,6 +110,12 @@ static int physdev_mt_check(const struct xt_mtchk_param *par) | ||
7934 | if (par->hook_mask & (1 << NF_INET_LOCAL_OUT)) | ||
7935 | return -EINVAL; | ||
7936 | } | ||
7937 | + | ||
7938 | + if (!brnf_probed) { | ||
7939 | + brnf_probed = true; | ||
7940 | + request_module("br_netfilter"); | ||
7941 | + } | ||
7942 | + | ||
7943 | return 0; | ||
7944 | } | ||
7945 | |||
7946 | diff --git a/net/xdp/xsk.c b/net/xdp/xsk.c | ||
7947 | index 85e4fe4f18cc..f3031c8907d9 100644 | ||
7948 | --- a/net/xdp/xsk.c | ||
7949 | +++ b/net/xdp/xsk.c | ||
7950 | @@ -407,6 +407,10 @@ static int xsk_bind(struct socket *sock, struct sockaddr *addr, int addr_len) | ||
7951 | if (sxdp->sxdp_family != AF_XDP) | ||
7952 | return -EINVAL; | ||
7953 | |||
7954 | + flags = sxdp->sxdp_flags; | ||
7955 | + if (flags & ~(XDP_SHARED_UMEM | XDP_COPY | XDP_ZEROCOPY)) | ||
7956 | + return -EINVAL; | ||
7957 | + | ||
7958 | mutex_lock(&xs->mutex); | ||
7959 | if (xs->dev) { | ||
7960 | err = -EBUSY; | ||
7961 | @@ -425,7 +429,6 @@ static int xsk_bind(struct socket *sock, struct sockaddr *addr, int addr_len) | ||
7962 | } | ||
7963 | |||
7964 | qid = sxdp->sxdp_queue_id; | ||
7965 | - flags = sxdp->sxdp_flags; | ||
7966 | |||
7967 | if (flags & XDP_SHARED_UMEM) { | ||
7968 | struct xdp_sock *umem_xs; | ||
7969 | diff --git a/security/apparmor/policy_unpack.c b/security/apparmor/policy_unpack.c | ||
7970 | index 379682e2a8d5..f6c2bcb2ab14 100644 | ||
7971 | --- a/security/apparmor/policy_unpack.c | ||
7972 | +++ b/security/apparmor/policy_unpack.c | ||
7973 | @@ -579,6 +579,7 @@ fail: | ||
7974 | kfree(profile->secmark[i].label); | ||
7975 | kfree(profile->secmark); | ||
7976 | profile->secmark_count = 0; | ||
7977 | + profile->secmark = NULL; | ||
7978 | } | ||
7979 | |||
7980 | e->pos = pos; | ||
7981 | diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c | ||
7982 | index cf20dd36a30f..07b11b5aaf1f 100644 | ||
7983 | --- a/security/selinux/hooks.c | ||
7984 | +++ b/security/selinux/hooks.c | ||
7985 | @@ -3244,12 +3244,16 @@ static int selinux_inode_setsecurity(struct inode *inode, const char *name, | ||
7986 | const void *value, size_t size, int flags) | ||
7987 | { | ||
7988 | struct inode_security_struct *isec = inode_security_novalidate(inode); | ||
7989 | + struct superblock_security_struct *sbsec = inode->i_sb->s_security; | ||
7990 | u32 newsid; | ||
7991 | int rc; | ||
7992 | |||
7993 | if (strcmp(name, XATTR_SELINUX_SUFFIX)) | ||
7994 | return -EOPNOTSUPP; | ||
7995 | |||
7996 | + if (!(sbsec->flags & SBLABEL_MNT)) | ||
7997 | + return -EOPNOTSUPP; | ||
7998 | + | ||
7999 | if (!value || !size) | ||
8000 | return -EACCES; | ||
8001 | |||
8002 | @@ -6398,7 +6402,10 @@ static void selinux_inode_invalidate_secctx(struct inode *inode) | ||
8003 | */ | ||
8004 | static int selinux_inode_notifysecctx(struct inode *inode, void *ctx, u32 ctxlen) | ||
8005 | { | ||
8006 | - return selinux_inode_setsecurity(inode, XATTR_SELINUX_SUFFIX, ctx, ctxlen, 0); | ||
8007 | + int rc = selinux_inode_setsecurity(inode, XATTR_SELINUX_SUFFIX, | ||
8008 | + ctx, ctxlen, 0); | ||
8009 | + /* Do not return error when suppressing label (SBLABEL_MNT not set). */ | ||
8010 | + return rc == -EOPNOTSUPP ? 0 : rc; | ||
8011 | } | ||
8012 | |||
8013 | /* | ||
8014 | diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c | ||
8015 | index b67f6fe08a1b..e08c6c6ca029 100644 | ||
8016 | --- a/sound/core/pcm_native.c | ||
8017 | +++ b/sound/core/pcm_native.c | ||
8018 | @@ -1513,6 +1513,14 @@ int snd_pcm_suspend_all(struct snd_pcm *pcm) | ||
8019 | /* FIXME: the open/close code should lock this as well */ | ||
8020 | if (substream->runtime == NULL) | ||
8021 | continue; | ||
8022 | + | ||
8023 | + /* | ||
8024 | + * Skip BE dai link PCM's that are internal and may | ||
8025 | + * not have their substream ops set. | ||
8026 | + */ | ||
8027 | + if (!substream->ops) | ||
8028 | + continue; | ||
8029 | + | ||
8030 | err = snd_pcm_suspend(substream); | ||
8031 | if (err < 0 && err != -EBUSY) | ||
8032 | return err; | ||
8033 | diff --git a/sound/firewire/dice/dice.c b/sound/firewire/dice/dice.c | ||
8034 | index ed50b222d36e..eee184b05d93 100644 | ||
8035 | --- a/sound/firewire/dice/dice.c | ||
8036 | +++ b/sound/firewire/dice/dice.c | ||
8037 | @@ -18,6 +18,7 @@ MODULE_LICENSE("GPL v2"); | ||
8038 | #define OUI_ALESIS 0x000595 | ||
8039 | #define OUI_MAUDIO 0x000d6c | ||
8040 | #define OUI_MYTEK 0x001ee8 | ||
8041 | +#define OUI_SSL 0x0050c2 // Actually ID reserved by IEEE. | ||
8042 | |||
8043 | #define DICE_CATEGORY_ID 0x04 | ||
8044 | #define WEISS_CATEGORY_ID 0x00 | ||
8045 | @@ -196,7 +197,7 @@ static int dice_probe(struct fw_unit *unit, | ||
8046 | struct snd_dice *dice; | ||
8047 | int err; | ||
8048 | |||
8049 | - if (!entry->driver_data) { | ||
8050 | + if (!entry->driver_data && entry->vendor_id != OUI_SSL) { | ||
8051 | err = check_dice_category(unit); | ||
8052 | if (err < 0) | ||
8053 | return -ENODEV; | ||
8054 | @@ -361,6 +362,15 @@ static const struct ieee1394_device_id dice_id_table[] = { | ||
8055 | .model_id = 0x000002, | ||
8056 | .driver_data = (kernel_ulong_t)snd_dice_detect_mytek_formats, | ||
8057 | }, | ||
8058 | + // Solid State Logic, Duende Classic and Mini. | ||
8059 | + // NOTE: each field of GUID in config ROM is not compliant to standard | ||
8060 | + // DICE scheme. | ||
8061 | + { | ||
8062 | + .match_flags = IEEE1394_MATCH_VENDOR_ID | | ||
8063 | + IEEE1394_MATCH_MODEL_ID, | ||
8064 | + .vendor_id = OUI_SSL, | ||
8065 | + .model_id = 0x000070, | ||
8066 | + }, | ||
8067 | { | ||
8068 | .match_flags = IEEE1394_MATCH_VERSION, | ||
8069 | .version = DICE_INTERFACE, | ||
8070 | diff --git a/sound/soc/fsl/fsl-asoc-card.c b/sound/soc/fsl/fsl-asoc-card.c | ||
8071 | index 81f2fe2c6d23..60f87a0d99f4 100644 | ||
8072 | --- a/sound/soc/fsl/fsl-asoc-card.c | ||
8073 | +++ b/sound/soc/fsl/fsl-asoc-card.c | ||
8074 | @@ -689,6 +689,7 @@ static int fsl_asoc_card_probe(struct platform_device *pdev) | ||
8075 | asrc_fail: | ||
8076 | of_node_put(asrc_np); | ||
8077 | of_node_put(codec_np); | ||
8078 | + put_device(&cpu_pdev->dev); | ||
8079 | fail: | ||
8080 | of_node_put(cpu_np); | ||
8081 | |||
8082 | diff --git a/sound/soc/fsl/imx-sgtl5000.c b/sound/soc/fsl/imx-sgtl5000.c | ||
8083 | index c29200cf755a..9b9a7ec52905 100644 | ||
8084 | --- a/sound/soc/fsl/imx-sgtl5000.c | ||
8085 | +++ b/sound/soc/fsl/imx-sgtl5000.c | ||
8086 | @@ -108,6 +108,7 @@ static int imx_sgtl5000_probe(struct platform_device *pdev) | ||
8087 | ret = -EPROBE_DEFER; | ||
8088 | goto fail; | ||
8089 | } | ||
8090 | + put_device(&ssi_pdev->dev); | ||
8091 | codec_dev = of_find_i2c_device_by_node(codec_np); | ||
8092 | if (!codec_dev) { | ||
8093 | dev_err(&pdev->dev, "failed to find codec platform device\n"); | ||
8094 | diff --git a/sound/soc/generic/simple-card-utils.c b/sound/soc/generic/simple-card-utils.c | ||
8095 | index b807a47515eb..336895f7fd1e 100644 | ||
8096 | --- a/sound/soc/generic/simple-card-utils.c | ||
8097 | +++ b/sound/soc/generic/simple-card-utils.c | ||
8098 | @@ -283,12 +283,20 @@ static int asoc_simple_card_get_dai_id(struct device_node *ep) | ||
8099 | /* use endpoint/port reg if exist */ | ||
8100 | ret = of_graph_parse_endpoint(ep, &info); | ||
8101 | if (ret == 0) { | ||
8102 | - if (info.id) | ||
8103 | + /* | ||
8104 | + * Because it will count port/endpoint if it doesn't have "reg". | ||
8105 | + * But, we can't judge whether it has "no reg", or "reg = <0>" | ||
8106 | + * only of_graph_parse_endpoint(). | ||
8107 | + * We need to check "reg" property | ||
8108 | + */ | ||
8109 | + if (of_get_property(ep, "reg", NULL)) | ||
8110 | return info.id; | ||
8111 | - if (info.port) | ||
8112 | + | ||
8113 | + node = of_get_parent(ep); | ||
8114 | + of_node_put(node); | ||
8115 | + if (of_get_property(node, "reg", NULL)) | ||
8116 | return info.port; | ||
8117 | } | ||
8118 | - | ||
8119 | node = of_graph_get_port_parent(ep); | ||
8120 | |||
8121 | /* | ||
8122 | diff --git a/sound/soc/qcom/common.c b/sound/soc/qcom/common.c | ||
8123 | index 4715527054e5..5661025e8cec 100644 | ||
8124 | --- a/sound/soc/qcom/common.c | ||
8125 | +++ b/sound/soc/qcom/common.c | ||
8126 | @@ -42,6 +42,9 @@ int qcom_snd_parse_of(struct snd_soc_card *card) | ||
8127 | link = card->dai_link; | ||
8128 | for_each_child_of_node(dev->of_node, np) { | ||
8129 | cpu = of_get_child_by_name(np, "cpu"); | ||
8130 | + platform = of_get_child_by_name(np, "platform"); | ||
8131 | + codec = of_get_child_by_name(np, "codec"); | ||
8132 | + | ||
8133 | if (!cpu) { | ||
8134 | dev_err(dev, "Can't find cpu DT node\n"); | ||
8135 | ret = -EINVAL; | ||
8136 | @@ -63,8 +66,6 @@ int qcom_snd_parse_of(struct snd_soc_card *card) | ||
8137 | goto err; | ||
8138 | } | ||
8139 | |||
8140 | - platform = of_get_child_by_name(np, "platform"); | ||
8141 | - codec = of_get_child_by_name(np, "codec"); | ||
8142 | if (codec && platform) { | ||
8143 | link->platform_of_node = of_parse_phandle(platform, | ||
8144 | "sound-dai", | ||
8145 | @@ -100,10 +101,15 @@ int qcom_snd_parse_of(struct snd_soc_card *card) | ||
8146 | link->dpcm_capture = 1; | ||
8147 | link->stream_name = link->name; | ||
8148 | link++; | ||
8149 | + | ||
8150 | + of_node_put(cpu); | ||
8151 | + of_node_put(codec); | ||
8152 | + of_node_put(platform); | ||
8153 | } | ||
8154 | |||
8155 | return 0; | ||
8156 | err: | ||
8157 | + of_node_put(np); | ||
8158 | of_node_put(cpu); | ||
8159 | of_node_put(codec); | ||
8160 | of_node_put(platform); | ||
8161 | diff --git a/tools/build/Makefile.feature b/tools/build/Makefile.feature | ||
8162 | index 5467c6bf9ceb..bb9dca65eb5f 100644 | ||
8163 | --- a/tools/build/Makefile.feature | ||
8164 | +++ b/tools/build/Makefile.feature | ||
8165 | @@ -70,7 +70,6 @@ FEATURE_TESTS_BASIC := \ | ||
8166 | sched_getcpu \ | ||
8167 | sdt \ | ||
8168 | setns \ | ||
8169 | - libopencsd \ | ||
8170 | libaio | ||
8171 | |||
8172 | # FEATURE_TESTS_BASIC + FEATURE_TESTS_EXTRA is the complete list | ||
8173 | @@ -84,6 +83,7 @@ FEATURE_TESTS_EXTRA := \ | ||
8174 | libbabeltrace \ | ||
8175 | libbfd-liberty \ | ||
8176 | libbfd-liberty-z \ | ||
8177 | + libopencsd \ | ||
8178 | libunwind-debug-frame \ | ||
8179 | libunwind-debug-frame-arm \ | ||
8180 | libunwind-debug-frame-aarch64 \ | ||
8181 | diff --git a/tools/build/feature/test-all.c b/tools/build/feature/test-all.c | ||
8182 | index 20cdaa4fc112..e903b86b742f 100644 | ||
8183 | --- a/tools/build/feature/test-all.c | ||
8184 | +++ b/tools/build/feature/test-all.c | ||
8185 | @@ -170,14 +170,14 @@ | ||
8186 | # include "test-setns.c" | ||
8187 | #undef main | ||
8188 | |||
8189 | -#define main main_test_libopencsd | ||
8190 | -# include "test-libopencsd.c" | ||
8191 | -#undef main | ||
8192 | - | ||
8193 | #define main main_test_libaio | ||
8194 | # include "test-libaio.c" | ||
8195 | #undef main | ||
8196 | |||
8197 | +#define main main_test_reallocarray | ||
8198 | +# include "test-reallocarray.c" | ||
8199 | +#undef main | ||
8200 | + | ||
8201 | int main(int argc, char *argv[]) | ||
8202 | { | ||
8203 | main_test_libpython(); | ||
8204 | @@ -217,8 +217,8 @@ int main(int argc, char *argv[]) | ||
8205 | main_test_sched_getcpu(); | ||
8206 | main_test_sdt(); | ||
8207 | main_test_setns(); | ||
8208 | - main_test_libopencsd(); | ||
8209 | main_test_libaio(); | ||
8210 | + main_test_reallocarray(); | ||
8211 | |||
8212 | return 0; | ||
8213 | } | ||
8214 | diff --git a/tools/build/feature/test-reallocarray.c b/tools/build/feature/test-reallocarray.c | ||
8215 | index 8170de35150d..8f6743e31da7 100644 | ||
8216 | --- a/tools/build/feature/test-reallocarray.c | ||
8217 | +++ b/tools/build/feature/test-reallocarray.c | ||
8218 | @@ -6,3 +6,5 @@ int main(void) | ||
8219 | { | ||
8220 | return !!reallocarray(NULL, 1, 1); | ||
8221 | } | ||
8222 | + | ||
8223 | +#undef _GNU_SOURCE | ||
8224 | diff --git a/tools/lib/bpf/Makefile b/tools/lib/bpf/Makefile | ||
8225 | index 34d9c3619c96..78fd86b85087 100644 | ||
8226 | --- a/tools/lib/bpf/Makefile | ||
8227 | +++ b/tools/lib/bpf/Makefile | ||
8228 | @@ -162,7 +162,8 @@ endif | ||
8229 | |||
8230 | TARGETS = $(CMD_TARGETS) | ||
8231 | |||
8232 | -all: fixdep all_cmd | ||
8233 | +all: fixdep | ||
8234 | + $(Q)$(MAKE) all_cmd | ||
8235 | |||
8236 | all_cmd: $(CMD_TARGETS) check | ||
8237 | |||
8238 | diff --git a/tools/lib/lockdep/run_tests.sh b/tools/lib/lockdep/run_tests.sh | ||
8239 | index c8fbd0306960..11f425662b43 100755 | ||
8240 | --- a/tools/lib/lockdep/run_tests.sh | ||
8241 | +++ b/tools/lib/lockdep/run_tests.sh | ||
8242 | @@ -11,7 +11,7 @@ find tests -name '*.c' | sort | while read -r i; do | ||
8243 | testname=$(basename "$i" .c) | ||
8244 | echo -ne "$testname... " | ||
8245 | if gcc -o "tests/$testname" -pthread "$i" liblockdep.a -Iinclude -D__USE_LIBLOCKDEP && | ||
8246 | - timeout 1 "tests/$testname" 2>&1 | "tests/${testname}.sh"; then | ||
8247 | + timeout 1 "tests/$testname" 2>&1 | /bin/bash "tests/${testname}.sh"; then | ||
8248 | echo "PASSED!" | ||
8249 | else | ||
8250 | echo "FAILED!" | ||
8251 | @@ -24,7 +24,7 @@ find tests -name '*.c' | sort | while read -r i; do | ||
8252 | echo -ne "(PRELOAD) $testname... " | ||
8253 | if gcc -o "tests/$testname" -pthread -Iinclude "$i" && | ||
8254 | timeout 1 ./lockdep "tests/$testname" 2>&1 | | ||
8255 | - "tests/${testname}.sh"; then | ||
8256 | + /bin/bash "tests/${testname}.sh"; then | ||
8257 | echo "PASSED!" | ||
8258 | else | ||
8259 | echo "FAILED!" | ||
8260 | @@ -37,7 +37,7 @@ find tests -name '*.c' | sort | while read -r i; do | ||
8261 | echo -ne "(PRELOAD + Valgrind) $testname... " | ||
8262 | if gcc -o "tests/$testname" -pthread -Iinclude "$i" && | ||
8263 | { timeout 10 valgrind --read-var-info=yes ./lockdep "./tests/$testname" >& "tests/${testname}.vg.out"; true; } && | ||
8264 | - "tests/${testname}.sh" < "tests/${testname}.vg.out" && | ||
8265 | + /bin/bash "tests/${testname}.sh" < "tests/${testname}.vg.out" && | ||
8266 | ! grep -Eq '(^==[0-9]*== (Invalid |Uninitialised ))|Mismatched free|Source and destination overlap| UME ' "tests/${testname}.vg.out"; then | ||
8267 | echo "PASSED!" | ||
8268 | else | ||
8269 | diff --git a/tools/lib/traceevent/event-parse.c b/tools/lib/traceevent/event-parse.c | ||
8270 | index abd4fa5d3088..87494c7c619d 100644 | ||
8271 | --- a/tools/lib/traceevent/event-parse.c | ||
8272 | +++ b/tools/lib/traceevent/event-parse.c | ||
8273 | @@ -2457,7 +2457,7 @@ static int arg_num_eval(struct tep_print_arg *arg, long long *val) | ||
8274 | static char *arg_eval (struct tep_print_arg *arg) | ||
8275 | { | ||
8276 | long long val; | ||
8277 | - static char buf[20]; | ||
8278 | + static char buf[24]; | ||
8279 | |||
8280 | switch (arg->type) { | ||
8281 | case TEP_PRINT_ATOM: | ||
8282 | diff --git a/tools/perf/Makefile.config b/tools/perf/Makefile.config | ||
8283 | index b441c88cafa1..cf4a8329c4c0 100644 | ||
8284 | --- a/tools/perf/Makefile.config | ||
8285 | +++ b/tools/perf/Makefile.config | ||
8286 | @@ -218,6 +218,8 @@ FEATURE_CHECK_LDFLAGS-libpython := $(PYTHON_EMBED_LDOPTS) | ||
8287 | FEATURE_CHECK_CFLAGS-libpython-version := $(PYTHON_EMBED_CCOPTS) | ||
8288 | FEATURE_CHECK_LDFLAGS-libpython-version := $(PYTHON_EMBED_LDOPTS) | ||
8289 | |||
8290 | +FEATURE_CHECK_LDFLAGS-libaio = -lrt | ||
8291 | + | ||
8292 | CFLAGS += -fno-omit-frame-pointer | ||
8293 | CFLAGS += -ggdb3 | ||
8294 | CFLAGS += -funwind-tables | ||
8295 | @@ -386,7 +388,8 @@ ifeq ($(feature-setns), 1) | ||
8296 | $(call detected,CONFIG_SETNS) | ||
8297 | endif | ||
8298 | |||
8299 | -ifndef NO_CORESIGHT | ||
8300 | +ifdef CORESIGHT | ||
8301 | + $(call feature_check,libopencsd) | ||
8302 | ifeq ($(feature-libopencsd), 1) | ||
8303 | CFLAGS += -DHAVE_CSTRACE_SUPPORT $(LIBOPENCSD_CFLAGS) | ||
8304 | LDFLAGS += $(LIBOPENCSD_LDFLAGS) | ||
8305 | diff --git a/tools/perf/Makefile.perf b/tools/perf/Makefile.perf | ||
8306 | index 0ee6795d82cc..77f8f069f1e7 100644 | ||
8307 | --- a/tools/perf/Makefile.perf | ||
8308 | +++ b/tools/perf/Makefile.perf | ||
8309 | @@ -102,7 +102,7 @@ include ../scripts/utilities.mak | ||
8310 | # When selected, pass LLVM_CONFIG=/path/to/llvm-config to `make' if | ||
8311 | # llvm-config is not in $PATH. | ||
8312 | # | ||
8313 | -# Define NO_CORESIGHT if you do not want support for CoreSight trace decoding. | ||
8314 | +# Define CORESIGHT if you DO WANT support for CoreSight trace decoding. | ||
8315 | # | ||
8316 | # Define NO_AIO if you do not want support of Posix AIO based trace | ||
8317 | # streaming for record mode. Currently Posix AIO trace streaming is | ||
8318 | diff --git a/tools/perf/builtin-c2c.c b/tools/perf/builtin-c2c.c | ||
8319 | index d340d2e42776..13758a0b367b 100644 | ||
8320 | --- a/tools/perf/builtin-c2c.c | ||
8321 | +++ b/tools/perf/builtin-c2c.c | ||
8322 | @@ -2055,6 +2055,12 @@ static int setup_nodes(struct perf_session *session) | ||
8323 | if (!set) | ||
8324 | return -ENOMEM; | ||
8325 | |||
8326 | + nodes[node] = set; | ||
8327 | + | ||
8328 | + /* empty node, skip */ | ||
8329 | + if (cpu_map__empty(map)) | ||
8330 | + continue; | ||
8331 | + | ||
8332 | for (cpu = 0; cpu < map->nr; cpu++) { | ||
8333 | set_bit(map->map[cpu], set); | ||
8334 | |||
8335 | @@ -2063,8 +2069,6 @@ static int setup_nodes(struct perf_session *session) | ||
8336 | |||
8337 | cpu2node[map->map[cpu]] = node; | ||
8338 | } | ||
8339 | - | ||
8340 | - nodes[node] = set; | ||
8341 | } | ||
8342 | |||
8343 | setup_nodes_header(); | ||
8344 | diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c | ||
8345 | index ac221f137ed2..cff4d10daf49 100644 | ||
8346 | --- a/tools/perf/builtin-script.c | ||
8347 | +++ b/tools/perf/builtin-script.c | ||
8348 | @@ -148,6 +148,7 @@ static struct { | ||
8349 | unsigned int print_ip_opts; | ||
8350 | u64 fields; | ||
8351 | u64 invalid_fields; | ||
8352 | + u64 user_set_fields; | ||
8353 | } output[OUTPUT_TYPE_MAX] = { | ||
8354 | |||
8355 | [PERF_TYPE_HARDWARE] = { | ||
8356 | @@ -344,7 +345,7 @@ static int perf_evsel__do_check_stype(struct perf_evsel *evsel, | ||
8357 | if (attr->sample_type & sample_type) | ||
8358 | return 0; | ||
8359 | |||
8360 | - if (output[type].user_set) { | ||
8361 | + if (output[type].user_set_fields & field) { | ||
8362 | if (allow_user_set) | ||
8363 | return 0; | ||
8364 | evname = perf_evsel__name(evsel); | ||
8365 | @@ -2627,10 +2628,13 @@ parse: | ||
8366 | pr_warning("\'%s\' not valid for %s events. Ignoring.\n", | ||
8367 | all_output_options[i].str, event_type(j)); | ||
8368 | } else { | ||
8369 | - if (change == REMOVE) | ||
8370 | + if (change == REMOVE) { | ||
8371 | output[j].fields &= ~all_output_options[i].field; | ||
8372 | - else | ||
8373 | + output[j].user_set_fields &= ~all_output_options[i].field; | ||
8374 | + } else { | ||
8375 | output[j].fields |= all_output_options[i].field; | ||
8376 | + output[j].user_set_fields |= all_output_options[i].field; | ||
8377 | + } | ||
8378 | output[j].user_set = true; | ||
8379 | output[j].wildcard_set = true; | ||
8380 | } | ||
8381 | diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c | ||
8382 | index b36061cd1ab8..91cdbf504535 100644 | ||
8383 | --- a/tools/perf/builtin-trace.c | ||
8384 | +++ b/tools/perf/builtin-trace.c | ||
8385 | @@ -1039,6 +1039,9 @@ static const size_t trace__entry_str_size = 2048; | ||
8386 | |||
8387 | static struct file *thread_trace__files_entry(struct thread_trace *ttrace, int fd) | ||
8388 | { | ||
8389 | + if (fd < 0) | ||
8390 | + return NULL; | ||
8391 | + | ||
8392 | if (fd > ttrace->files.max) { | ||
8393 | struct file *nfiles = realloc(ttrace->files.table, (fd + 1) * sizeof(struct file)); | ||
8394 | |||
8395 | @@ -3865,7 +3868,8 @@ int cmd_trace(int argc, const char **argv) | ||
8396 | goto init_augmented_syscall_tp; | ||
8397 | } | ||
8398 | |||
8399 | - if (strcmp(perf_evsel__name(evsel), "raw_syscalls:sys_enter") == 0) { | ||
8400 | + if (trace.syscalls.events.augmented->priv == NULL && | ||
8401 | + strstr(perf_evsel__name(evsel), "syscalls:sys_enter")) { | ||
8402 | struct perf_evsel *augmented = trace.syscalls.events.augmented; | ||
8403 | if (perf_evsel__init_augmented_syscall_tp(augmented, evsel) || | ||
8404 | perf_evsel__init_augmented_syscall_tp_args(augmented)) | ||
8405 | diff --git a/tools/perf/tests/evsel-tp-sched.c b/tools/perf/tests/evsel-tp-sched.c | ||
8406 | index 5cbba70bcdd0..ea7acf403727 100644 | ||
8407 | --- a/tools/perf/tests/evsel-tp-sched.c | ||
8408 | +++ b/tools/perf/tests/evsel-tp-sched.c | ||
8409 | @@ -43,7 +43,7 @@ int test__perf_evsel__tp_sched_test(struct test *test __maybe_unused, int subtes | ||
8410 | return -1; | ||
8411 | } | ||
8412 | |||
8413 | - if (perf_evsel__test_field(evsel, "prev_comm", 16, true)) | ||
8414 | + if (perf_evsel__test_field(evsel, "prev_comm", 16, false)) | ||
8415 | ret = -1; | ||
8416 | |||
8417 | if (perf_evsel__test_field(evsel, "prev_pid", 4, true)) | ||
8418 | @@ -55,7 +55,7 @@ int test__perf_evsel__tp_sched_test(struct test *test __maybe_unused, int subtes | ||
8419 | if (perf_evsel__test_field(evsel, "prev_state", sizeof(long), true)) | ||
8420 | ret = -1; | ||
8421 | |||
8422 | - if (perf_evsel__test_field(evsel, "next_comm", 16, true)) | ||
8423 | + if (perf_evsel__test_field(evsel, "next_comm", 16, false)) | ||
8424 | ret = -1; | ||
8425 | |||
8426 | if (perf_evsel__test_field(evsel, "next_pid", 4, true)) | ||
8427 | @@ -73,7 +73,7 @@ int test__perf_evsel__tp_sched_test(struct test *test __maybe_unused, int subtes | ||
8428 | return -1; | ||
8429 | } | ||
8430 | |||
8431 | - if (perf_evsel__test_field(evsel, "comm", 16, true)) | ||
8432 | + if (perf_evsel__test_field(evsel, "comm", 16, false)) | ||
8433 | ret = -1; | ||
8434 | |||
8435 | if (perf_evsel__test_field(evsel, "pid", 4, true)) | ||
8436 | diff --git a/tools/perf/trace/beauty/msg_flags.c b/tools/perf/trace/beauty/msg_flags.c | ||
8437 | index d66c66315987..ea68db08b8e7 100644 | ||
8438 | --- a/tools/perf/trace/beauty/msg_flags.c | ||
8439 | +++ b/tools/perf/trace/beauty/msg_flags.c | ||
8440 | @@ -29,7 +29,7 @@ static size_t syscall_arg__scnprintf_msg_flags(char *bf, size_t size, | ||
8441 | return scnprintf(bf, size, "NONE"); | ||
8442 | #define P_MSG_FLAG(n) \ | ||
8443 | if (flags & MSG_##n) { \ | ||
8444 | - printed += scnprintf(bf + printed, size - printed, "%s%s", printed ? "|" : "", show_prefix ? prefix : "", #n); \ | ||
8445 | + printed += scnprintf(bf + printed, size - printed, "%s%s%s", printed ? "|" : "", show_prefix ? prefix : "", #n); \ | ||
8446 | flags &= ~MSG_##n; \ | ||
8447 | } | ||
8448 | |||
8449 | diff --git a/tools/perf/trace/beauty/waitid_options.c b/tools/perf/trace/beauty/waitid_options.c | ||
8450 | index 6897fab40dcc..d4d10b33ba0e 100644 | ||
8451 | --- a/tools/perf/trace/beauty/waitid_options.c | ||
8452 | +++ b/tools/perf/trace/beauty/waitid_options.c | ||
8453 | @@ -11,7 +11,7 @@ static size_t syscall_arg__scnprintf_waitid_options(char *bf, size_t size, | ||
8454 | |||
8455 | #define P_OPTION(n) \ | ||
8456 | if (options & W##n) { \ | ||
8457 | - printed += scnprintf(bf + printed, size - printed, "%s%s%s", printed ? "|" : "", show_prefix ? prefix : #n); \ | ||
8458 | + printed += scnprintf(bf + printed, size - printed, "%s%s%s", printed ? "|" : "", show_prefix ? prefix : "", #n); \ | ||
8459 | options &= ~W##n; \ | ||
8460 | } | ||
8461 | |||
8462 | diff --git a/tools/perf/util/annotate.c b/tools/perf/util/annotate.c | ||
8463 | index 70de8f6b3aee..9142fd294e76 100644 | ||
8464 | --- a/tools/perf/util/annotate.c | ||
8465 | +++ b/tools/perf/util/annotate.c | ||
8466 | @@ -1889,6 +1889,7 @@ int symbol__annotate(struct symbol *sym, struct map *map, | ||
8467 | struct annotation_options *options, | ||
8468 | struct arch **parch) | ||
8469 | { | ||
8470 | + struct annotation *notes = symbol__annotation(sym); | ||
8471 | struct annotate_args args = { | ||
8472 | .privsize = privsize, | ||
8473 | .evsel = evsel, | ||
8474 | @@ -1919,6 +1920,7 @@ int symbol__annotate(struct symbol *sym, struct map *map, | ||
8475 | |||
8476 | args.ms.map = map; | ||
8477 | args.ms.sym = sym; | ||
8478 | + notes->start = map__rip_2objdump(map, sym->start); | ||
8479 | |||
8480 | return symbol__disassemble(sym, &args); | ||
8481 | } | ||
8482 | @@ -2794,8 +2796,6 @@ int symbol__annotate2(struct symbol *sym, struct map *map, struct perf_evsel *ev | ||
8483 | |||
8484 | symbol__calc_percent(sym, evsel); | ||
8485 | |||
8486 | - notes->start = map__rip_2objdump(map, sym->start); | ||
8487 | - | ||
8488 | annotation__set_offsets(notes, size); | ||
8489 | annotation__mark_jump_targets(notes, sym); | ||
8490 | annotation__compute_ipc(notes, size); | ||
8491 | diff --git a/tools/perf/util/s390-cpumsf.c b/tools/perf/util/s390-cpumsf.c | ||
8492 | index 68b2570304ec..08073a4d59a4 100644 | ||
8493 | --- a/tools/perf/util/s390-cpumsf.c | ||
8494 | +++ b/tools/perf/util/s390-cpumsf.c | ||
8495 | @@ -301,6 +301,11 @@ static bool s390_cpumsf_validate(int machine_type, | ||
8496 | *dsdes = 85; | ||
8497 | *bsdes = 32; | ||
8498 | break; | ||
8499 | + case 2964: | ||
8500 | + case 2965: | ||
8501 | + *dsdes = 112; | ||
8502 | + *bsdes = 32; | ||
8503 | + break; | ||
8504 | default: | ||
8505 | /* Illegal trailer entry */ | ||
8506 | return false; | ||
8507 | diff --git a/tools/perf/util/scripting-engines/trace-event-python.c b/tools/perf/util/scripting-engines/trace-event-python.c | ||
8508 | index 87ef16a1b17e..7059d1be2d09 100644 | ||
8509 | --- a/tools/perf/util/scripting-engines/trace-event-python.c | ||
8510 | +++ b/tools/perf/util/scripting-engines/trace-event-python.c | ||
8511 | @@ -733,8 +733,7 @@ static PyObject *get_perf_sample_dict(struct perf_sample *sample, | ||
8512 | Py_FatalError("couldn't create Python dictionary"); | ||
8513 | |||
8514 | pydict_set_item_string_decref(dict, "ev_name", _PyUnicode_FromString(perf_evsel__name(evsel))); | ||
8515 | - pydict_set_item_string_decref(dict, "attr", _PyUnicode_FromStringAndSize( | ||
8516 | - (const char *)&evsel->attr, sizeof(evsel->attr))); | ||
8517 | + pydict_set_item_string_decref(dict, "attr", _PyBytes_FromStringAndSize((const char *)&evsel->attr, sizeof(evsel->attr))); | ||
8518 | |||
8519 | pydict_set_item_string_decref(dict_sample, "pid", | ||
8520 | _PyLong_FromLong(sample->pid)); | ||
8521 | @@ -1494,34 +1493,40 @@ static void _free_command_line(wchar_t **command_line, int num) | ||
8522 | static int python_start_script(const char *script, int argc, const char **argv) | ||
8523 | { | ||
8524 | struct tables *tables = &tables_global; | ||
8525 | + PyMODINIT_FUNC (*initfunc)(void); | ||
8526 | #if PY_MAJOR_VERSION < 3 | ||
8527 | const char **command_line; | ||
8528 | #else | ||
8529 | wchar_t **command_line; | ||
8530 | #endif | ||
8531 | - char buf[PATH_MAX]; | ||
8532 | + /* | ||
8533 | + * Use a non-const name variable to cope with python 2.6's | ||
8534 | + * PyImport_AppendInittab prototype | ||
8535 | + */ | ||
8536 | + char buf[PATH_MAX], name[19] = "perf_trace_context"; | ||
8537 | int i, err = 0; | ||
8538 | FILE *fp; | ||
8539 | |||
8540 | #if PY_MAJOR_VERSION < 3 | ||
8541 | + initfunc = initperf_trace_context; | ||
8542 | command_line = malloc((argc + 1) * sizeof(const char *)); | ||
8543 | command_line[0] = script; | ||
8544 | for (i = 1; i < argc + 1; i++) | ||
8545 | command_line[i] = argv[i - 1]; | ||
8546 | #else | ||
8547 | + initfunc = PyInit_perf_trace_context; | ||
8548 | command_line = malloc((argc + 1) * sizeof(wchar_t *)); | ||
8549 | command_line[0] = Py_DecodeLocale(script, NULL); | ||
8550 | for (i = 1; i < argc + 1; i++) | ||
8551 | command_line[i] = Py_DecodeLocale(argv[i - 1], NULL); | ||
8552 | #endif | ||
8553 | |||
8554 | + PyImport_AppendInittab(name, initfunc); | ||
8555 | Py_Initialize(); | ||
8556 | |||
8557 | #if PY_MAJOR_VERSION < 3 | ||
8558 | - initperf_trace_context(); | ||
8559 | PySys_SetArgv(argc + 1, (char **)command_line); | ||
8560 | #else | ||
8561 | - PyInit_perf_trace_context(); | ||
8562 | PySys_SetArgv(argc + 1, command_line); | ||
8563 | #endif | ||
8564 | |||
8565 | diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c | ||
8566 | index 6c1a83768eb0..d0334c33da54 100644 | ||
8567 | --- a/tools/perf/util/sort.c | ||
8568 | +++ b/tools/perf/util/sort.c | ||
8569 | @@ -230,8 +230,14 @@ static int64_t _sort__sym_cmp(struct symbol *sym_l, struct symbol *sym_r) | ||
8570 | if (sym_l == sym_r) | ||
8571 | return 0; | ||
8572 | |||
8573 | - if (sym_l->inlined || sym_r->inlined) | ||
8574 | - return strcmp(sym_l->name, sym_r->name); | ||
8575 | + if (sym_l->inlined || sym_r->inlined) { | ||
8576 | + int ret = strcmp(sym_l->name, sym_r->name); | ||
8577 | + | ||
8578 | + if (ret) | ||
8579 | + return ret; | ||
8580 | + if ((sym_l->start <= sym_r->end) && (sym_l->end >= sym_r->start)) | ||
8581 | + return 0; | ||
8582 | + } | ||
8583 | |||
8584 | if (sym_l->start != sym_r->start) | ||
8585 | return (int64_t)(sym_r->start - sym_l->start); | ||
8586 | diff --git a/tools/perf/util/srcline.c b/tools/perf/util/srcline.c | ||
8587 | index dc86597d0cc4..ccf42c4e83f0 100644 | ||
8588 | --- a/tools/perf/util/srcline.c | ||
8589 | +++ b/tools/perf/util/srcline.c | ||
8590 | @@ -104,7 +104,7 @@ static struct symbol *new_inline_sym(struct dso *dso, | ||
8591 | } else { | ||
8592 | /* create a fake symbol for the inline frame */ | ||
8593 | inline_sym = symbol__new(base_sym ? base_sym->start : 0, | ||
8594 | - base_sym ? base_sym->end : 0, | ||
8595 | + base_sym ? (base_sym->end - base_sym->start) : 0, | ||
8596 | base_sym ? base_sym->binding : 0, | ||
8597 | base_sym ? base_sym->type : 0, | ||
8598 | funcname); | ||
8599 | diff --git a/tools/testing/selftests/bpf/Makefile b/tools/testing/selftests/bpf/Makefile | ||
8600 | index 41ab7a3668b3..936f726f7cd9 100644 | ||
8601 | --- a/tools/testing/selftests/bpf/Makefile | ||
8602 | +++ b/tools/testing/selftests/bpf/Makefile | ||
8603 | @@ -96,6 +96,7 @@ $(BPFOBJ): force | ||
8604 | CLANG ?= clang | ||
8605 | LLC ?= llc | ||
8606 | LLVM_OBJCOPY ?= llvm-objcopy | ||
8607 | +LLVM_READELF ?= llvm-readelf | ||
8608 | BTF_PAHOLE ?= pahole | ||
8609 | |||
8610 | PROBE := $(shell $(LLC) -march=bpf -mcpu=probe -filetype=null /dev/null 2>&1) | ||
8611 | @@ -132,7 +133,7 @@ BTF_PAHOLE_PROBE := $(shell $(BTF_PAHOLE) --help 2>&1 | grep BTF) | ||
8612 | BTF_OBJCOPY_PROBE := $(shell $(LLVM_OBJCOPY) --help 2>&1 | grep -i 'usage.*llvm') | ||
8613 | BTF_LLVM_PROBE := $(shell echo "int main() { return 0; }" | \ | ||
8614 | $(CLANG) -target bpf -O2 -g -c -x c - -o ./llvm_btf_verify.o; \ | ||
8615 | - readelf -S ./llvm_btf_verify.o | grep BTF; \ | ||
8616 | + $(LLVM_READELF) -S ./llvm_btf_verify.o | grep BTF; \ | ||
8617 | /bin/rm -f ./llvm_btf_verify.o) | ||
8618 | |||
8619 | ifneq ($(BTF_LLVM_PROBE),) | ||
8620 | diff --git a/tools/testing/selftests/bpf/test_map_in_map.c b/tools/testing/selftests/bpf/test_map_in_map.c | ||
8621 | index ce923e67e08e..2985f262846e 100644 | ||
8622 | --- a/tools/testing/selftests/bpf/test_map_in_map.c | ||
8623 | +++ b/tools/testing/selftests/bpf/test_map_in_map.c | ||
8624 | @@ -27,6 +27,7 @@ SEC("xdp_mimtest") | ||
8625 | int xdp_mimtest0(struct xdp_md *ctx) | ||
8626 | { | ||
8627 | int value = 123; | ||
8628 | + int *value_p; | ||
8629 | int key = 0; | ||
8630 | void *map; | ||
8631 | |||
8632 | @@ -35,6 +36,9 @@ int xdp_mimtest0(struct xdp_md *ctx) | ||
8633 | return XDP_DROP; | ||
8634 | |||
8635 | bpf_map_update_elem(map, &key, &value, 0); | ||
8636 | + value_p = bpf_map_lookup_elem(map, &key); | ||
8637 | + if (!value_p || *value_p != 123) | ||
8638 | + return XDP_DROP; | ||
8639 | |||
8640 | map = bpf_map_lookup_elem(&mim_hash, &key); | ||
8641 | if (!map) | ||
8642 | diff --git a/tools/testing/selftests/bpf/test_maps.c b/tools/testing/selftests/bpf/test_maps.c | ||
8643 | index e2b9eee37187..6e05a22b346c 100644 | ||
8644 | --- a/tools/testing/selftests/bpf/test_maps.c | ||
8645 | +++ b/tools/testing/selftests/bpf/test_maps.c | ||
8646 | @@ -43,7 +43,7 @@ static int map_flags; | ||
8647 | } \ | ||
8648 | }) | ||
8649 | |||
8650 | -static void test_hashmap(int task, void *data) | ||
8651 | +static void test_hashmap(unsigned int task, void *data) | ||
8652 | { | ||
8653 | long long key, next_key, first_key, value; | ||
8654 | int fd; | ||
8655 | @@ -133,7 +133,7 @@ static void test_hashmap(int task, void *data) | ||
8656 | close(fd); | ||
8657 | } | ||
8658 | |||
8659 | -static void test_hashmap_sizes(int task, void *data) | ||
8660 | +static void test_hashmap_sizes(unsigned int task, void *data) | ||
8661 | { | ||
8662 | int fd, i, j; | ||
8663 | |||
8664 | @@ -153,7 +153,7 @@ static void test_hashmap_sizes(int task, void *data) | ||
8665 | } | ||
8666 | } | ||
8667 | |||
8668 | -static void test_hashmap_percpu(int task, void *data) | ||
8669 | +static void test_hashmap_percpu(unsigned int task, void *data) | ||
8670 | { | ||
8671 | unsigned int nr_cpus = bpf_num_possible_cpus(); | ||
8672 | BPF_DECLARE_PERCPU(long, value); | ||
8673 | @@ -280,7 +280,7 @@ static int helper_fill_hashmap(int max_entries) | ||
8674 | return fd; | ||
8675 | } | ||
8676 | |||
8677 | -static void test_hashmap_walk(int task, void *data) | ||
8678 | +static void test_hashmap_walk(unsigned int task, void *data) | ||
8679 | { | ||
8680 | int fd, i, max_entries = 1000; | ||
8681 | long long key, value, next_key; | ||
8682 | @@ -351,7 +351,7 @@ static void test_hashmap_zero_seed(void) | ||
8683 | close(second); | ||
8684 | } | ||
8685 | |||
8686 | -static void test_arraymap(int task, void *data) | ||
8687 | +static void test_arraymap(unsigned int task, void *data) | ||
8688 | { | ||
8689 | int key, next_key, fd; | ||
8690 | long long value; | ||
8691 | @@ -406,7 +406,7 @@ static void test_arraymap(int task, void *data) | ||
8692 | close(fd); | ||
8693 | } | ||
8694 | |||
8695 | -static void test_arraymap_percpu(int task, void *data) | ||
8696 | +static void test_arraymap_percpu(unsigned int task, void *data) | ||
8697 | { | ||
8698 | unsigned int nr_cpus = bpf_num_possible_cpus(); | ||
8699 | BPF_DECLARE_PERCPU(long, values); | ||
8700 | @@ -502,7 +502,7 @@ static void test_arraymap_percpu_many_keys(void) | ||
8701 | close(fd); | ||
8702 | } | ||
8703 | |||
8704 | -static void test_devmap(int task, void *data) | ||
8705 | +static void test_devmap(unsigned int task, void *data) | ||
8706 | { | ||
8707 | int fd; | ||
8708 | __u32 key, value; | ||
8709 | @@ -517,7 +517,7 @@ static void test_devmap(int task, void *data) | ||
8710 | close(fd); | ||
8711 | } | ||
8712 | |||
8713 | -static void test_queuemap(int task, void *data) | ||
8714 | +static void test_queuemap(unsigned int task, void *data) | ||
8715 | { | ||
8716 | const int MAP_SIZE = 32; | ||
8717 | __u32 vals[MAP_SIZE + MAP_SIZE/2], val; | ||
8718 | @@ -575,7 +575,7 @@ static void test_queuemap(int task, void *data) | ||
8719 | close(fd); | ||
8720 | } | ||
8721 | |||
8722 | -static void test_stackmap(int task, void *data) | ||
8723 | +static void test_stackmap(unsigned int task, void *data) | ||
8724 | { | ||
8725 | const int MAP_SIZE = 32; | ||
8726 | __u32 vals[MAP_SIZE + MAP_SIZE/2], val; | ||
8727 | @@ -641,7 +641,7 @@ static void test_stackmap(int task, void *data) | ||
8728 | #define SOCKMAP_PARSE_PROG "./sockmap_parse_prog.o" | ||
8729 | #define SOCKMAP_VERDICT_PROG "./sockmap_verdict_prog.o" | ||
8730 | #define SOCKMAP_TCP_MSG_PROG "./sockmap_tcp_msg_prog.o" | ||
8731 | -static void test_sockmap(int tasks, void *data) | ||
8732 | +static void test_sockmap(unsigned int tasks, void *data) | ||
8733 | { | ||
8734 | struct bpf_map *bpf_map_rx, *bpf_map_tx, *bpf_map_msg, *bpf_map_break; | ||
8735 | int map_fd_msg = 0, map_fd_rx = 0, map_fd_tx = 0, map_fd_break; | ||
8736 | @@ -1258,10 +1258,11 @@ static void test_map_large(void) | ||
8737 | } | ||
8738 | |||
8739 | #define run_parallel(N, FN, DATA) \ | ||
8740 | - printf("Fork %d tasks to '" #FN "'\n", N); \ | ||
8741 | + printf("Fork %u tasks to '" #FN "'\n", N); \ | ||
8742 | __run_parallel(N, FN, DATA) | ||
8743 | |||
8744 | -static void __run_parallel(int tasks, void (*fn)(int task, void *data), | ||
8745 | +static void __run_parallel(unsigned int tasks, | ||
8746 | + void (*fn)(unsigned int task, void *data), | ||
8747 | void *data) | ||
8748 | { | ||
8749 | pid_t pid[tasks]; | ||
8750 | @@ -1302,7 +1303,7 @@ static void test_map_stress(void) | ||
8751 | #define DO_UPDATE 1 | ||
8752 | #define DO_DELETE 0 | ||
8753 | |||
8754 | -static void test_update_delete(int fn, void *data) | ||
8755 | +static void test_update_delete(unsigned int fn, void *data) | ||
8756 | { | ||
8757 | int do_update = ((int *)data)[1]; | ||
8758 | int fd = ((int *)data)[0]; | ||
8759 | diff --git a/tools/testing/selftests/bpf/test_verifier.c b/tools/testing/selftests/bpf/test_verifier.c | ||
8760 | index 2fd90d456892..9a967983abed 100644 | ||
8761 | --- a/tools/testing/selftests/bpf/test_verifier.c | ||
8762 | +++ b/tools/testing/selftests/bpf/test_verifier.c | ||
8763 | @@ -34,6 +34,7 @@ | ||
8764 | #include <linux/if_ether.h> | ||
8765 | |||
8766 | #include <bpf/bpf.h> | ||
8767 | +#include <bpf/libbpf.h> | ||
8768 | |||
8769 | #ifdef HAVE_GENHDR | ||
8770 | # include "autoconf.h" | ||
8771 | @@ -59,6 +60,7 @@ | ||
8772 | |||
8773 | #define UNPRIV_SYSCTL "kernel/unprivileged_bpf_disabled" | ||
8774 | static bool unpriv_disabled = false; | ||
8775 | +static int skips; | ||
8776 | |||
8777 | struct bpf_test { | ||
8778 | const char *descr; | ||
8779 | @@ -15946,6 +15948,11 @@ static void do_test_single(struct bpf_test *test, bool unpriv, | ||
8780 | pflags |= BPF_F_ANY_ALIGNMENT; | ||
8781 | fd_prog = bpf_verify_program(prog_type, prog, prog_len, pflags, | ||
8782 | "GPL", 0, bpf_vlog, sizeof(bpf_vlog), 1); | ||
8783 | + if (fd_prog < 0 && !bpf_probe_prog_type(prog_type, 0)) { | ||
8784 | + printf("SKIP (unsupported program type %d)\n", prog_type); | ||
8785 | + skips++; | ||
8786 | + goto close_fds; | ||
8787 | + } | ||
8788 | |||
8789 | expected_ret = unpriv && test->result_unpriv != UNDEF ? | ||
8790 | test->result_unpriv : test->result; | ||
8791 | @@ -16099,7 +16106,7 @@ static bool test_as_unpriv(struct bpf_test *test) | ||
8792 | |||
8793 | static int do_test(bool unpriv, unsigned int from, unsigned int to) | ||
8794 | { | ||
8795 | - int i, passes = 0, errors = 0, skips = 0; | ||
8796 | + int i, passes = 0, errors = 0; | ||
8797 | |||
8798 | for (i = from; i < to; i++) { | ||
8799 | struct bpf_test *test = &tests[i]; | ||
8800 | diff --git a/tools/testing/selftests/ir/ir_loopback.c b/tools/testing/selftests/ir/ir_loopback.c | ||
8801 | index 858c19caf224..8cdf1b89ac9c 100644 | ||
8802 | --- a/tools/testing/selftests/ir/ir_loopback.c | ||
8803 | +++ b/tools/testing/selftests/ir/ir_loopback.c | ||
8804 | @@ -27,6 +27,8 @@ | ||
8805 | |||
8806 | #define TEST_SCANCODES 10 | ||
8807 | #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) | ||
8808 | +#define SYSFS_PATH_MAX 256 | ||
8809 | +#define DNAME_PATH_MAX 256 | ||
8810 | |||
8811 | static const struct { | ||
8812 | enum rc_proto proto; | ||
8813 | @@ -56,7 +58,7 @@ static const struct { | ||
8814 | int lirc_open(const char *rc) | ||
8815 | { | ||
8816 | struct dirent *dent; | ||
8817 | - char buf[100]; | ||
8818 | + char buf[SYSFS_PATH_MAX + DNAME_PATH_MAX]; | ||
8819 | DIR *d; | ||
8820 | int fd; | ||
8821 | |||
8822 | diff --git a/tools/testing/selftests/seccomp/seccomp_bpf.c b/tools/testing/selftests/seccomp/seccomp_bpf.c | ||
8823 | index 7e632b465ab4..6d7a81306f8a 100644 | ||
8824 | --- a/tools/testing/selftests/seccomp/seccomp_bpf.c | ||
8825 | +++ b/tools/testing/selftests/seccomp/seccomp_bpf.c | ||
8826 | @@ -2971,6 +2971,12 @@ TEST(get_metadata) | ||
8827 | struct seccomp_metadata md; | ||
8828 | long ret; | ||
8829 | |||
8830 | + /* Only real root can get metadata. */ | ||
8831 | + if (geteuid()) { | ||
8832 | + XFAIL(return, "get_metadata requires real root"); | ||
8833 | + return; | ||
8834 | + } | ||
8835 | + | ||
8836 | ASSERT_EQ(0, pipe(pipefd)); | ||
8837 | |||
8838 | pid = fork(); |