1 |
commit: deac9d11b550ed21fa6adccef30f618c1037ed28 |
2 |
Author: Mike Pagano <mpagano <AT> gentoo <DOT> org> |
3 |
AuthorDate: Sun Jan 13 19:28:50 2019 +0000 |
4 |
Commit: Mike Pagano <mpagano <AT> gentoo <DOT> org> |
5 |
CommitDate: Sun Jan 13 19:28:50 2019 +0000 |
6 |
URL: https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=deac9d11 |
7 |
|
8 |
proj/linux-patches: Linux patch 4.19.15 |
9 |
|
10 |
Signed-off-by: Mike Pagano <mpagano <AT> gentoo.org> |
11 |
|
12 |
0000_README | 4 + |
13 |
1014_linux-4.19.15.patch | 5529 ++++++++++++++++++++++++++++++++++++++++++++++ |
14 |
2 files changed, 5533 insertions(+) |
15 |
|
16 |
diff --git a/0000_README b/0000_README |
17 |
index 5bb2bcd..2970cec 100644 |
18 |
--- a/0000_README |
19 |
+++ b/0000_README |
20 |
@@ -99,6 +99,10 @@ Patch: 1013_linux-4.19.14.patch |
21 |
From: http://www.kernel.org |
22 |
Desc: Linux 4.19.14 |
23 |
|
24 |
+Patch: 1014_linux-4.19.15.patch |
25 |
+From: http://www.kernel.org |
26 |
+Desc: Linux 4.19.15 |
27 |
+ |
28 |
Patch: 1500_XATTR_USER_PREFIX.patch |
29 |
From: https://bugs.gentoo.org/show_bug.cgi?id=470644 |
30 |
Desc: Support for namespace user.pax.* on tmpfs. |
31 |
|
32 |
diff --git a/1014_linux-4.19.15.patch b/1014_linux-4.19.15.patch |
33 |
new file mode 100644 |
34 |
index 0000000..f589723 |
35 |
--- /dev/null |
36 |
+++ b/1014_linux-4.19.15.patch |
37 |
@@ -0,0 +1,5529 @@ |
38 |
+diff --git a/Makefile b/Makefile |
39 |
+index 3324dd0e11a3..0e30d48274fa 100644 |
40 |
+--- a/Makefile |
41 |
++++ b/Makefile |
42 |
+@@ -1,7 +1,7 @@ |
43 |
+ # SPDX-License-Identifier: GPL-2.0 |
44 |
+ VERSION = 4 |
45 |
+ PATCHLEVEL = 19 |
46 |
+-SUBLEVEL = 14 |
47 |
++SUBLEVEL = 15 |
48 |
+ EXTRAVERSION = |
49 |
+ NAME = "People's Front" |
50 |
+ |
51 |
+@@ -482,18 +482,18 @@ endif |
52 |
+ |
53 |
+ ifeq ($(cc-name),clang) |
54 |
+ ifneq ($(CROSS_COMPILE),) |
55 |
+-CLANG_TARGET := --target=$(notdir $(CROSS_COMPILE:%-=%)) |
56 |
++CLANG_FLAGS := --target=$(notdir $(CROSS_COMPILE:%-=%)) |
57 |
+ GCC_TOOLCHAIN_DIR := $(dir $(shell which $(LD))) |
58 |
+-CLANG_PREFIX := --prefix=$(GCC_TOOLCHAIN_DIR) |
59 |
++CLANG_FLAGS += --prefix=$(GCC_TOOLCHAIN_DIR) |
60 |
+ GCC_TOOLCHAIN := $(realpath $(GCC_TOOLCHAIN_DIR)/..) |
61 |
+ endif |
62 |
+ ifneq ($(GCC_TOOLCHAIN),) |
63 |
+-CLANG_GCC_TC := --gcc-toolchain=$(GCC_TOOLCHAIN) |
64 |
++CLANG_FLAGS += --gcc-toolchain=$(GCC_TOOLCHAIN) |
65 |
+ endif |
66 |
+-KBUILD_CFLAGS += $(CLANG_TARGET) $(CLANG_GCC_TC) $(CLANG_PREFIX) |
67 |
+-KBUILD_AFLAGS += $(CLANG_TARGET) $(CLANG_GCC_TC) $(CLANG_PREFIX) |
68 |
+-KBUILD_CFLAGS += $(call cc-option, -no-integrated-as) |
69 |
+-KBUILD_AFLAGS += $(call cc-option, -no-integrated-as) |
70 |
++CLANG_FLAGS += -no-integrated-as |
71 |
++KBUILD_CFLAGS += $(CLANG_FLAGS) |
72 |
++KBUILD_AFLAGS += $(CLANG_FLAGS) |
73 |
++export CLANG_FLAGS |
74 |
+ endif |
75 |
+ |
76 |
+ RETPOLINE_CFLAGS_GCC := -mindirect-branch=thunk-extern -mindirect-branch-register |
77 |
+@@ -954,11 +954,6 @@ ifdef CONFIG_STACK_VALIDATION |
78 |
+ ifeq ($(has_libelf),1) |
79 |
+ objtool_target := tools/objtool FORCE |
80 |
+ else |
81 |
+- ifdef CONFIG_UNWINDER_ORC |
82 |
+- $(error "Cannot generate ORC metadata for CONFIG_UNWINDER_ORC=y, please install libelf-dev, libelf-devel or elfutils-libelf-devel") |
83 |
+- else |
84 |
+- $(warning "Cannot use CONFIG_STACK_VALIDATION=y, please install libelf-dev, libelf-devel or elfutils-libelf-devel") |
85 |
+- endif |
86 |
+ SKIP_STACK_VALIDATION := 1 |
87 |
+ export SKIP_STACK_VALIDATION |
88 |
+ endif |
89 |
+@@ -1115,6 +1110,14 @@ uapi-asm-generic: |
90 |
+ |
91 |
+ PHONY += prepare-objtool |
92 |
+ prepare-objtool: $(objtool_target) |
93 |
++ifeq ($(SKIP_STACK_VALIDATION),1) |
94 |
++ifdef CONFIG_UNWINDER_ORC |
95 |
++ @echo "error: Cannot generate ORC metadata for CONFIG_UNWINDER_ORC=y, please install libelf-dev, libelf-devel or elfutils-libelf-devel" >&2 |
96 |
++ @false |
97 |
++else |
98 |
++ @echo "warning: Cannot use CONFIG_STACK_VALIDATION=y, please install libelf-dev, libelf-devel or elfutils-libelf-devel" >&2 |
99 |
++endif |
100 |
++endif |
101 |
+ |
102 |
+ # Generate some files |
103 |
+ # --------------------------------------------------------------------------- |
104 |
+diff --git a/arch/arm/boot/dts/imx7d-nitrogen7.dts b/arch/arm/boot/dts/imx7d-nitrogen7.dts |
105 |
+index d8aac4a2d02a..177d21fdeb28 100644 |
106 |
+--- a/arch/arm/boot/dts/imx7d-nitrogen7.dts |
107 |
++++ b/arch/arm/boot/dts/imx7d-nitrogen7.dts |
108 |
+@@ -86,13 +86,17 @@ |
109 |
+ compatible = "regulator-fixed"; |
110 |
+ regulator-min-microvolt = <3300000>; |
111 |
+ regulator-max-microvolt = <3300000>; |
112 |
+- clocks = <&clks IMX7D_CLKO2_ROOT_DIV>; |
113 |
+- clock-names = "slow"; |
114 |
+ regulator-name = "reg_wlan"; |
115 |
+ startup-delay-us = <70000>; |
116 |
+ gpio = <&gpio4 21 GPIO_ACTIVE_HIGH>; |
117 |
+ enable-active-high; |
118 |
+ }; |
119 |
++ |
120 |
++ usdhc2_pwrseq: usdhc2_pwrseq { |
121 |
++ compatible = "mmc-pwrseq-simple"; |
122 |
++ clocks = <&clks IMX7D_CLKO2_ROOT_DIV>; |
123 |
++ clock-names = "ext_clock"; |
124 |
++ }; |
125 |
+ }; |
126 |
+ |
127 |
+ &adc1 { |
128 |
+@@ -375,6 +379,7 @@ |
129 |
+ bus-width = <4>; |
130 |
+ non-removable; |
131 |
+ vmmc-supply = <®_wlan>; |
132 |
++ mmc-pwrseq = <&usdhc2_pwrseq>; |
133 |
+ cap-power-off-card; |
134 |
+ keep-power-in-suspend; |
135 |
+ status = "okay"; |
136 |
+diff --git a/arch/arm/boot/dts/imx7d-pico.dtsi b/arch/arm/boot/dts/imx7d-pico.dtsi |
137 |
+index 21973eb55671..f27b3849d3ff 100644 |
138 |
+--- a/arch/arm/boot/dts/imx7d-pico.dtsi |
139 |
++++ b/arch/arm/boot/dts/imx7d-pico.dtsi |
140 |
+@@ -100,6 +100,19 @@ |
141 |
+ regulator-min-microvolt = <1800000>; |
142 |
+ regulator-max-microvolt = <1800000>; |
143 |
+ }; |
144 |
++ |
145 |
++ usdhc2_pwrseq: usdhc2_pwrseq { |
146 |
++ compatible = "mmc-pwrseq-simple"; |
147 |
++ clocks = <&clks IMX7D_CLKO2_ROOT_DIV>; |
148 |
++ clock-names = "ext_clock"; |
149 |
++ }; |
150 |
++}; |
151 |
++ |
152 |
++&clks { |
153 |
++ assigned-clocks = <&clks IMX7D_CLKO2_ROOT_SRC>, |
154 |
++ <&clks IMX7D_CLKO2_ROOT_DIV>; |
155 |
++ assigned-clock-parents = <&clks IMX7D_CKIL>; |
156 |
++ assigned-clock-rates = <0>, <32768>; |
157 |
+ }; |
158 |
+ |
159 |
+ &i2c4 { |
160 |
+@@ -199,12 +212,13 @@ |
161 |
+ |
162 |
+ &usdhc2 { /* Wifi SDIO */ |
163 |
+ pinctrl-names = "default"; |
164 |
+- pinctrl-0 = <&pinctrl_usdhc2>; |
165 |
++ pinctrl-0 = <&pinctrl_usdhc2 &pinctrl_wifi_clk>; |
166 |
+ no-1-8-v; |
167 |
+ non-removable; |
168 |
+ keep-power-in-suspend; |
169 |
+ wakeup-source; |
170 |
+ vmmc-supply = <®_ap6212>; |
171 |
++ mmc-pwrseq = <&usdhc2_pwrseq>; |
172 |
+ status = "okay"; |
173 |
+ }; |
174 |
+ |
175 |
+@@ -301,6 +315,12 @@ |
176 |
+ }; |
177 |
+ |
178 |
+ &iomuxc_lpsr { |
179 |
++ pinctrl_wifi_clk: wificlkgrp { |
180 |
++ fsl,pins = < |
181 |
++ MX7D_PAD_LPSR_GPIO1_IO03__CCM_CLKO2 0x7d |
182 |
++ >; |
183 |
++ }; |
184 |
++ |
185 |
+ pinctrl_wdog: wdoggrp { |
186 |
+ fsl,pins = < |
187 |
+ MX7D_PAD_LPSR_GPIO1_IO00__WDOG1_WDOG_B 0x74 |
188 |
+diff --git a/arch/arm/boot/dts/sun8i-a83t-bananapi-m3.dts b/arch/arm/boot/dts/sun8i-a83t-bananapi-m3.dts |
189 |
+index c7ce4158d6c8..f250b20af493 100644 |
190 |
+--- a/arch/arm/boot/dts/sun8i-a83t-bananapi-m3.dts |
191 |
++++ b/arch/arm/boot/dts/sun8i-a83t-bananapi-m3.dts |
192 |
+@@ -309,8 +309,8 @@ |
193 |
+ |
194 |
+ ®_dldo3 { |
195 |
+ regulator-always-on; |
196 |
+- regulator-min-microvolt = <2500000>; |
197 |
+- regulator-max-microvolt = <2500000>; |
198 |
++ regulator-min-microvolt = <3300000>; |
199 |
++ regulator-max-microvolt = <3300000>; |
200 |
+ regulator-name = "vcc-pd"; |
201 |
+ }; |
202 |
+ |
203 |
+diff --git a/arch/arm/mach-imx/cpuidle-imx6sx.c b/arch/arm/mach-imx/cpuidle-imx6sx.c |
204 |
+index 243a108a940b..fd0053e47a15 100644 |
205 |
+--- a/arch/arm/mach-imx/cpuidle-imx6sx.c |
206 |
++++ b/arch/arm/mach-imx/cpuidle-imx6sx.c |
207 |
+@@ -110,7 +110,7 @@ int __init imx6sx_cpuidle_init(void) |
208 |
+ * except for power up sw2iso which need to be |
209 |
+ * larger than LDO ramp up time. |
210 |
+ */ |
211 |
+- imx_gpc_set_arm_power_up_timing(2, 1); |
212 |
++ imx_gpc_set_arm_power_up_timing(0xf, 1); |
213 |
+ imx_gpc_set_arm_power_down_timing(1, 1); |
214 |
+ |
215 |
+ return cpuidle_register(&imx6sx_cpuidle_driver, NULL); |
216 |
+diff --git a/arch/arm64/Makefile b/arch/arm64/Makefile |
217 |
+index 106039d25e2f..35649ee8ad56 100644 |
218 |
+--- a/arch/arm64/Makefile |
219 |
++++ b/arch/arm64/Makefile |
220 |
+@@ -18,7 +18,7 @@ ifeq ($(CONFIG_RELOCATABLE), y) |
221 |
+ # Pass --no-apply-dynamic-relocs to restore pre-binutils-2.27 behaviour |
222 |
+ # for relative relocs, since this leads to better Image compression |
223 |
+ # with the relocation offsets always being zero. |
224 |
+-LDFLAGS_vmlinux += -pie -shared -Bsymbolic \ |
225 |
++LDFLAGS_vmlinux += -shared -Bsymbolic -z notext -z norelro \ |
226 |
+ $(call ld-option, --no-apply-dynamic-relocs) |
227 |
+ endif |
228 |
+ |
229 |
+diff --git a/arch/arm64/boot/dts/mediatek/mt7622-rfb1.dts b/arch/arm64/boot/dts/mediatek/mt7622-rfb1.dts |
230 |
+index a747b7bf132d..387be39d40cd 100644 |
231 |
+--- a/arch/arm64/boot/dts/mediatek/mt7622-rfb1.dts |
232 |
++++ b/arch/arm64/boot/dts/mediatek/mt7622-rfb1.dts |
233 |
+@@ -17,8 +17,13 @@ |
234 |
+ model = "MediaTek MT7622 RFB1 board"; |
235 |
+ compatible = "mediatek,mt7622-rfb1", "mediatek,mt7622"; |
236 |
+ |
237 |
++ aliases { |
238 |
++ serial0 = &uart0; |
239 |
++ }; |
240 |
++ |
241 |
+ chosen { |
242 |
+- bootargs = "earlycon=uart8250,mmio32,0x11002000 console=ttyS0,115200n1 swiotlb=512"; |
243 |
++ stdout-path = "serial0:115200n8"; |
244 |
++ bootargs = "earlycon=uart8250,mmio32,0x11002000 swiotlb=512"; |
245 |
+ }; |
246 |
+ |
247 |
+ cpus { |
248 |
+diff --git a/arch/arm64/kernel/image.h b/arch/arm64/kernel/image.h |
249 |
+index a820ed07fb80..8da289dc843a 100644 |
250 |
+--- a/arch/arm64/kernel/image.h |
251 |
++++ b/arch/arm64/kernel/image.h |
252 |
+@@ -75,16 +75,6 @@ |
253 |
+ |
254 |
+ __efistub_stext_offset = stext - _text; |
255 |
+ |
256 |
+-/* |
257 |
+- * Prevent the symbol aliases below from being emitted into the kallsyms |
258 |
+- * table, by forcing them to be absolute symbols (which are conveniently |
259 |
+- * ignored by scripts/kallsyms) rather than section relative symbols. |
260 |
+- * The distinction is only relevant for partial linking, and only for symbols |
261 |
+- * that are defined within a section declaration (which is not the case for |
262 |
+- * the definitions below) so the resulting values will be identical. |
263 |
+- */ |
264 |
+-#define KALLSYMS_HIDE(sym) ABSOLUTE(sym) |
265 |
+- |
266 |
+ /* |
267 |
+ * The EFI stub has its own symbol namespace prefixed by __efistub_, to |
268 |
+ * isolate it from the kernel proper. The following symbols are legally |
269 |
+@@ -94,28 +84,28 @@ __efistub_stext_offset = stext - _text; |
270 |
+ * linked at. The routines below are all implemented in assembler in a |
271 |
+ * position independent manner |
272 |
+ */ |
273 |
+-__efistub_memcmp = KALLSYMS_HIDE(__pi_memcmp); |
274 |
+-__efistub_memchr = KALLSYMS_HIDE(__pi_memchr); |
275 |
+-__efistub_memcpy = KALLSYMS_HIDE(__pi_memcpy); |
276 |
+-__efistub_memmove = KALLSYMS_HIDE(__pi_memmove); |
277 |
+-__efistub_memset = KALLSYMS_HIDE(__pi_memset); |
278 |
+-__efistub_strlen = KALLSYMS_HIDE(__pi_strlen); |
279 |
+-__efistub_strnlen = KALLSYMS_HIDE(__pi_strnlen); |
280 |
+-__efistub_strcmp = KALLSYMS_HIDE(__pi_strcmp); |
281 |
+-__efistub_strncmp = KALLSYMS_HIDE(__pi_strncmp); |
282 |
+-__efistub_strrchr = KALLSYMS_HIDE(__pi_strrchr); |
283 |
+-__efistub___flush_dcache_area = KALLSYMS_HIDE(__pi___flush_dcache_area); |
284 |
++__efistub_memcmp = __pi_memcmp; |
285 |
++__efistub_memchr = __pi_memchr; |
286 |
++__efistub_memcpy = __pi_memcpy; |
287 |
++__efistub_memmove = __pi_memmove; |
288 |
++__efistub_memset = __pi_memset; |
289 |
++__efistub_strlen = __pi_strlen; |
290 |
++__efistub_strnlen = __pi_strnlen; |
291 |
++__efistub_strcmp = __pi_strcmp; |
292 |
++__efistub_strncmp = __pi_strncmp; |
293 |
++__efistub_strrchr = __pi_strrchr; |
294 |
++__efistub___flush_dcache_area = __pi___flush_dcache_area; |
295 |
+ |
296 |
+ #ifdef CONFIG_KASAN |
297 |
+-__efistub___memcpy = KALLSYMS_HIDE(__pi_memcpy); |
298 |
+-__efistub___memmove = KALLSYMS_HIDE(__pi_memmove); |
299 |
+-__efistub___memset = KALLSYMS_HIDE(__pi_memset); |
300 |
++__efistub___memcpy = __pi_memcpy; |
301 |
++__efistub___memmove = __pi_memmove; |
302 |
++__efistub___memset = __pi_memset; |
303 |
+ #endif |
304 |
+ |
305 |
+-__efistub__text = KALLSYMS_HIDE(_text); |
306 |
+-__efistub__end = KALLSYMS_HIDE(_end); |
307 |
+-__efistub__edata = KALLSYMS_HIDE(_edata); |
308 |
+-__efistub_screen_info = KALLSYMS_HIDE(screen_info); |
309 |
++__efistub__text = _text; |
310 |
++__efistub__end = _end; |
311 |
++__efistub__edata = _edata; |
312 |
++__efistub_screen_info = screen_info; |
313 |
+ |
314 |
+ #endif |
315 |
+ |
316 |
+diff --git a/arch/arm64/kernel/vmlinux.lds.S b/arch/arm64/kernel/vmlinux.lds.S |
317 |
+index 605d1b60469c..74e469f8a850 100644 |
318 |
+--- a/arch/arm64/kernel/vmlinux.lds.S |
319 |
++++ b/arch/arm64/kernel/vmlinux.lds.S |
320 |
+@@ -99,7 +99,8 @@ SECTIONS |
321 |
+ *(.discard) |
322 |
+ *(.discard.*) |
323 |
+ *(.interp .dynamic) |
324 |
+- *(.dynsym .dynstr .hash) |
325 |
++ *(.dynsym .dynstr .hash .gnu.hash) |
326 |
++ *(.eh_frame) |
327 |
+ } |
328 |
+ |
329 |
+ . = KIMAGE_VADDR + TEXT_OFFSET; |
330 |
+@@ -176,12 +177,12 @@ SECTIONS |
331 |
+ |
332 |
+ PERCPU_SECTION(L1_CACHE_BYTES) |
333 |
+ |
334 |
+- .rela : ALIGN(8) { |
335 |
++ .rela.dyn : ALIGN(8) { |
336 |
+ *(.rela .rela*) |
337 |
+ } |
338 |
+ |
339 |
+- __rela_offset = ABSOLUTE(ADDR(.rela) - KIMAGE_VADDR); |
340 |
+- __rela_size = SIZEOF(.rela); |
341 |
++ __rela_offset = ABSOLUTE(ADDR(.rela.dyn) - KIMAGE_VADDR); |
342 |
++ __rela_size = SIZEOF(.rela.dyn); |
343 |
+ |
344 |
+ . = ALIGN(SEGMENT_ALIGN); |
345 |
+ __initdata_end = .; |
346 |
+diff --git a/arch/m68k/kernel/setup_mm.c b/arch/m68k/kernel/setup_mm.c |
347 |
+index 5d3596c180f9..de44899c0e61 100644 |
348 |
+--- a/arch/m68k/kernel/setup_mm.c |
349 |
++++ b/arch/m68k/kernel/setup_mm.c |
350 |
+@@ -165,8 +165,6 @@ static void __init m68k_parse_bootinfo(const struct bi_record *record) |
351 |
+ be32_to_cpu(m->addr); |
352 |
+ m68k_memory[m68k_num_memory].size = |
353 |
+ be32_to_cpu(m->size); |
354 |
+- memblock_add(m68k_memory[m68k_num_memory].addr, |
355 |
+- m68k_memory[m68k_num_memory].size); |
356 |
+ m68k_num_memory++; |
357 |
+ } else |
358 |
+ pr_warn("%s: too many memory chunks\n", |
359 |
+diff --git a/arch/m68k/mm/motorola.c b/arch/m68k/mm/motorola.c |
360 |
+index 4e17ecb5928a..2eb2b31fb16a 100644 |
361 |
+--- a/arch/m68k/mm/motorola.c |
362 |
++++ b/arch/m68k/mm/motorola.c |
363 |
+@@ -228,6 +228,7 @@ void __init paging_init(void) |
364 |
+ |
365 |
+ min_addr = m68k_memory[0].addr; |
366 |
+ max_addr = min_addr + m68k_memory[0].size; |
367 |
++ memblock_add(m68k_memory[0].addr, m68k_memory[0].size); |
368 |
+ for (i = 1; i < m68k_num_memory;) { |
369 |
+ if (m68k_memory[i].addr < min_addr) { |
370 |
+ printk("Ignoring memory chunk at 0x%lx:0x%lx before the first chunk\n", |
371 |
+@@ -238,6 +239,7 @@ void __init paging_init(void) |
372 |
+ (m68k_num_memory - i) * sizeof(struct m68k_mem_info)); |
373 |
+ continue; |
374 |
+ } |
375 |
++ memblock_add(m68k_memory[i].addr, m68k_memory[i].size); |
376 |
+ addr = m68k_memory[i].addr + m68k_memory[i].size; |
377 |
+ if (addr > max_addr) |
378 |
+ max_addr = addr; |
379 |
+diff --git a/arch/powerpc/Makefile b/arch/powerpc/Makefile |
380 |
+index d2824b0cc142..c4c03992ee82 100644 |
381 |
+--- a/arch/powerpc/Makefile |
382 |
++++ b/arch/powerpc/Makefile |
383 |
+@@ -160,8 +160,17 @@ else |
384 |
+ CFLAGS-$(CONFIG_GENERIC_CPU) += -mcpu=powerpc64 |
385 |
+ endif |
386 |
+ |
387 |
++ifdef CONFIG_FUNCTION_TRACER |
388 |
++CC_FLAGS_FTRACE := -pg |
389 |
+ ifdef CONFIG_MPROFILE_KERNEL |
390 |
+- CC_FLAGS_FTRACE := -pg -mprofile-kernel |
391 |
++CC_FLAGS_FTRACE += -mprofile-kernel |
392 |
++endif |
393 |
++# Work around gcc code-gen bugs with -pg / -fno-omit-frame-pointer in gcc <= 4.8 |
394 |
++# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=44199 |
395 |
++# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=52828 |
396 |
++ifneq ($(cc-name),clang) |
397 |
++CC_FLAGS_FTRACE += $(call cc-ifversion, -lt, 0409, -mno-sched-epilog) |
398 |
++endif |
399 |
+ endif |
400 |
+ |
401 |
+ CFLAGS-$(CONFIG_TARGET_CPU_BOOL) += $(call cc-option,-mcpu=$(CONFIG_TARGET_CPU)) |
402 |
+@@ -229,11 +238,6 @@ ifdef CONFIG_6xx |
403 |
+ KBUILD_CFLAGS += -mcpu=powerpc |
404 |
+ endif |
405 |
+ |
406 |
+-# Work around a gcc code-gen bug with -fno-omit-frame-pointer. |
407 |
+-ifdef CONFIG_FUNCTION_TRACER |
408 |
+-KBUILD_CFLAGS += -mno-sched-epilog |
409 |
+-endif |
410 |
+- |
411 |
+ cpu-as-$(CONFIG_4xx) += -Wa,-m405 |
412 |
+ cpu-as-$(CONFIG_ALTIVEC) += $(call as-option,-Wa$(comma)-maltivec) |
413 |
+ cpu-as-$(CONFIG_E200) += -Wa,-me200 |
414 |
+@@ -408,36 +412,9 @@ archprepare: checkbin |
415 |
+ # to stdout and these checks are run even on install targets. |
416 |
+ TOUT := .tmp_gas_check |
417 |
+ |
418 |
+-# Check gcc and binutils versions: |
419 |
+-# - gcc-3.4 and binutils-2.14 are a fatal combination |
420 |
+-# - Require gcc 4.0 or above on 64-bit |
421 |
+-# - gcc-4.2.0 has issues compiling modules on 64-bit |
422 |
++# Check toolchain versions: |
423 |
++# - gcc-4.6 is the minimum kernel-wide version so nothing required. |
424 |
+ checkbin: |
425 |
+- @if test "$(cc-name)" != "clang" \ |
426 |
+- && test "$(cc-version)" = "0304" ; then \ |
427 |
+- if ! /bin/echo mftb 5 | $(AS) -v -mppc -many -o $(TOUT) >/dev/null 2>&1 ; then \ |
428 |
+- echo -n '*** ${VERSION}.${PATCHLEVEL} kernels no longer build '; \ |
429 |
+- echo 'correctly with gcc-3.4 and your version of binutils.'; \ |
430 |
+- echo '*** Please upgrade your binutils or downgrade your gcc'; \ |
431 |
+- false; \ |
432 |
+- fi ; \ |
433 |
+- fi |
434 |
+- @if test "$(cc-name)" != "clang" \ |
435 |
+- && test "$(cc-version)" -lt "0400" \ |
436 |
+- && test "x${CONFIG_PPC64}" = "xy" ; then \ |
437 |
+- echo -n "Sorry, GCC v4.0 or above is required to build " ; \ |
438 |
+- echo "the 64-bit powerpc kernel." ; \ |
439 |
+- false ; \ |
440 |
+- fi |
441 |
+- @if test "$(cc-name)" != "clang" \ |
442 |
+- && test "$(cc-fullversion)" = "040200" \ |
443 |
+- && test "x${CONFIG_MODULES}${CONFIG_PPC64}" = "xyy" ; then \ |
444 |
+- echo -n '*** GCC-4.2.0 cannot compile the 64-bit powerpc ' ; \ |
445 |
+- echo 'kernel with modules enabled.' ; \ |
446 |
+- echo -n '*** Please use a different GCC version or ' ; \ |
447 |
+- echo 'disable kernel modules' ; \ |
448 |
+- false ; \ |
449 |
+- fi |
450 |
+ @if test "x${CONFIG_CPU_LITTLE_ENDIAN}" = "xy" \ |
451 |
+ && $(LD) --version | head -1 | grep ' 2\.24$$' >/dev/null ; then \ |
452 |
+ echo -n '*** binutils 2.24 miscompiles weak symbols ' ; \ |
453 |
+diff --git a/arch/powerpc/boot/Makefile b/arch/powerpc/boot/Makefile |
454 |
+index 0fb96c26136f..25e3184f11f7 100644 |
455 |
+--- a/arch/powerpc/boot/Makefile |
456 |
++++ b/arch/powerpc/boot/Makefile |
457 |
+@@ -55,6 +55,11 @@ BOOTAFLAGS := -D__ASSEMBLY__ $(BOOTCFLAGS) -traditional -nostdinc |
458 |
+ |
459 |
+ BOOTARFLAGS := -cr$(KBUILD_ARFLAGS) |
460 |
+ |
461 |
++ifdef CONFIG_CC_IS_CLANG |
462 |
++BOOTCFLAGS += $(CLANG_FLAGS) |
463 |
++BOOTAFLAGS += $(CLANG_FLAGS) |
464 |
++endif |
465 |
++ |
466 |
+ ifdef CONFIG_DEBUG_INFO |
467 |
+ BOOTCFLAGS += -g |
468 |
+ endif |
469 |
+diff --git a/arch/powerpc/boot/crt0.S b/arch/powerpc/boot/crt0.S |
470 |
+index 32dfe6d083f3..9b9d17437373 100644 |
471 |
+--- a/arch/powerpc/boot/crt0.S |
472 |
++++ b/arch/powerpc/boot/crt0.S |
473 |
+@@ -15,7 +15,7 @@ |
474 |
+ RELA = 7 |
475 |
+ RELACOUNT = 0x6ffffff9 |
476 |
+ |
477 |
+- .text |
478 |
++ .data |
479 |
+ /* A procedure descriptor used when booting this as a COFF file. |
480 |
+ * When making COFF, this comes first in the link and we're |
481 |
+ * linked at 0x500000. |
482 |
+@@ -23,6 +23,8 @@ RELACOUNT = 0x6ffffff9 |
483 |
+ .globl _zimage_start_opd |
484 |
+ _zimage_start_opd: |
485 |
+ .long 0x500000, 0, 0, 0 |
486 |
++ .text |
487 |
++ b _zimage_start |
488 |
+ |
489 |
+ #ifdef __powerpc64__ |
490 |
+ .balign 8 |
491 |
+diff --git a/arch/powerpc/kernel/Makefile b/arch/powerpc/kernel/Makefile |
492 |
+index 3b66f2c19c84..eac18790d1b1 100644 |
493 |
+--- a/arch/powerpc/kernel/Makefile |
494 |
++++ b/arch/powerpc/kernel/Makefile |
495 |
+@@ -5,6 +5,9 @@ |
496 |
+ |
497 |
+ CFLAGS_ptrace.o += -DUTS_MACHINE='"$(UTS_MACHINE)"' |
498 |
+ |
499 |
++# Disable clang warning for using setjmp without setjmp.h header |
500 |
++CFLAGS_crash.o += $(call cc-disable-warning, builtin-requires-header) |
501 |
++ |
502 |
+ subdir-ccflags-$(CONFIG_PPC_WERROR) := -Werror |
503 |
+ |
504 |
+ ifdef CONFIG_PPC64 |
505 |
+@@ -22,10 +25,10 @@ CFLAGS_prom.o += $(DISABLE_LATENT_ENTROPY_PLUGIN) |
506 |
+ |
507 |
+ ifdef CONFIG_FUNCTION_TRACER |
508 |
+ # Do not trace early boot code |
509 |
+-CFLAGS_REMOVE_cputable.o = -mno-sched-epilog $(CC_FLAGS_FTRACE) |
510 |
+-CFLAGS_REMOVE_prom_init.o = -mno-sched-epilog $(CC_FLAGS_FTRACE) |
511 |
+-CFLAGS_REMOVE_btext.o = -mno-sched-epilog $(CC_FLAGS_FTRACE) |
512 |
+-CFLAGS_REMOVE_prom.o = -mno-sched-epilog $(CC_FLAGS_FTRACE) |
513 |
++CFLAGS_REMOVE_cputable.o = $(CC_FLAGS_FTRACE) |
514 |
++CFLAGS_REMOVE_prom_init.o = $(CC_FLAGS_FTRACE) |
515 |
++CFLAGS_REMOVE_btext.o = $(CC_FLAGS_FTRACE) |
516 |
++CFLAGS_REMOVE_prom.o = $(CC_FLAGS_FTRACE) |
517 |
+ endif |
518 |
+ |
519 |
+ obj-y := cputable.o ptrace.o syscalls.o \ |
520 |
+diff --git a/arch/powerpc/kernel/signal_32.c b/arch/powerpc/kernel/signal_32.c |
521 |
+index 6327fd79b0fb..fd59fef9931b 100644 |
522 |
+--- a/arch/powerpc/kernel/signal_32.c |
523 |
++++ b/arch/powerpc/kernel/signal_32.c |
524 |
+@@ -848,7 +848,23 @@ static long restore_tm_user_regs(struct pt_regs *regs, |
525 |
+ /* If TM bits are set to the reserved value, it's an invalid context */ |
526 |
+ if (MSR_TM_RESV(msr_hi)) |
527 |
+ return 1; |
528 |
+- /* Pull in the MSR TM bits from the user context */ |
529 |
++ |
530 |
++ /* |
531 |
++ * Disabling preemption, since it is unsafe to be preempted |
532 |
++ * with MSR[TS] set without recheckpointing. |
533 |
++ */ |
534 |
++ preempt_disable(); |
535 |
++ |
536 |
++ /* |
537 |
++ * CAUTION: |
538 |
++ * After regs->MSR[TS] being updated, make sure that get_user(), |
539 |
++ * put_user() or similar functions are *not* called. These |
540 |
++ * functions can generate page faults which will cause the process |
541 |
++ * to be de-scheduled with MSR[TS] set but without calling |
542 |
++ * tm_recheckpoint(). This can cause a bug. |
543 |
++ * |
544 |
++ * Pull in the MSR TM bits from the user context |
545 |
++ */ |
546 |
+ regs->msr = (regs->msr & ~MSR_TS_MASK) | (msr_hi & MSR_TS_MASK); |
547 |
+ /* Now, recheckpoint. This loads up all of the checkpointed (older) |
548 |
+ * registers, including FP and V[S]Rs. After recheckpointing, the |
549 |
+@@ -873,6 +889,8 @@ static long restore_tm_user_regs(struct pt_regs *regs, |
550 |
+ } |
551 |
+ #endif |
552 |
+ |
553 |
++ preempt_enable(); |
554 |
++ |
555 |
+ return 0; |
556 |
+ } |
557 |
+ #endif |
558 |
+@@ -1140,11 +1158,11 @@ SYSCALL_DEFINE0(rt_sigreturn) |
559 |
+ { |
560 |
+ struct rt_sigframe __user *rt_sf; |
561 |
+ struct pt_regs *regs = current_pt_regs(); |
562 |
+- int tm_restore = 0; |
563 |
+ #ifdef CONFIG_PPC_TRANSACTIONAL_MEM |
564 |
+ struct ucontext __user *uc_transact; |
565 |
+ unsigned long msr_hi; |
566 |
+ unsigned long tmp; |
567 |
++ int tm_restore = 0; |
568 |
+ #endif |
569 |
+ /* Always make any pending restarted system calls return -EINTR */ |
570 |
+ current->restart_block.fn = do_no_restart_syscall; |
571 |
+@@ -1192,19 +1210,11 @@ SYSCALL_DEFINE0(rt_sigreturn) |
572 |
+ goto bad; |
573 |
+ } |
574 |
+ } |
575 |
+- if (!tm_restore) { |
576 |
+- /* |
577 |
+- * Unset regs->msr because ucontext MSR TS is not |
578 |
+- * set, and recheckpoint was not called. This avoid |
579 |
+- * hitting a TM Bad thing at RFID |
580 |
+- */ |
581 |
+- regs->msr &= ~MSR_TS_MASK; |
582 |
+- } |
583 |
+- /* Fall through, for non-TM restore */ |
584 |
+-#endif |
585 |
+ if (!tm_restore) |
586 |
+- if (do_setcontext(&rt_sf->uc, regs, 1)) |
587 |
+- goto bad; |
588 |
++ /* Fall through, for non-TM restore */ |
589 |
++#endif |
590 |
++ if (do_setcontext(&rt_sf->uc, regs, 1)) |
591 |
++ goto bad; |
592 |
+ |
593 |
+ /* |
594 |
+ * It's not clear whether or why it is desirable to save the |
595 |
+diff --git a/arch/powerpc/kernel/signal_64.c b/arch/powerpc/kernel/signal_64.c |
596 |
+index daa28cb72272..bbd1c73243d7 100644 |
597 |
+--- a/arch/powerpc/kernel/signal_64.c |
598 |
++++ b/arch/powerpc/kernel/signal_64.c |
599 |
+@@ -467,20 +467,6 @@ static long restore_tm_sigcontexts(struct task_struct *tsk, |
600 |
+ if (MSR_TM_RESV(msr)) |
601 |
+ return -EINVAL; |
602 |
+ |
603 |
+- /* pull in MSR TS bits from user context */ |
604 |
+- regs->msr = (regs->msr & ~MSR_TS_MASK) | (msr & MSR_TS_MASK); |
605 |
+- |
606 |
+- /* |
607 |
+- * Ensure that TM is enabled in regs->msr before we leave the signal |
608 |
+- * handler. It could be the case that (a) user disabled the TM bit |
609 |
+- * through the manipulation of the MSR bits in uc_mcontext or (b) the |
610 |
+- * TM bit was disabled because a sufficient number of context switches |
611 |
+- * happened whilst in the signal handler and load_tm overflowed, |
612 |
+- * disabling the TM bit. In either case we can end up with an illegal |
613 |
+- * TM state leading to a TM Bad Thing when we return to userspace. |
614 |
+- */ |
615 |
+- regs->msr |= MSR_TM; |
616 |
+- |
617 |
+ /* pull in MSR LE from user context */ |
618 |
+ regs->msr = (regs->msr & ~MSR_LE) | (msr & MSR_LE); |
619 |
+ |
620 |
+@@ -572,6 +558,34 @@ static long restore_tm_sigcontexts(struct task_struct *tsk, |
621 |
+ tm_enable(); |
622 |
+ /* Make sure the transaction is marked as failed */ |
623 |
+ tsk->thread.tm_texasr |= TEXASR_FS; |
624 |
++ |
625 |
++ /* |
626 |
++ * Disabling preemption, since it is unsafe to be preempted |
627 |
++ * with MSR[TS] set without recheckpointing. |
628 |
++ */ |
629 |
++ preempt_disable(); |
630 |
++ |
631 |
++ /* pull in MSR TS bits from user context */ |
632 |
++ regs->msr = (regs->msr & ~MSR_TS_MASK) | (msr & MSR_TS_MASK); |
633 |
++ |
634 |
++ /* |
635 |
++ * Ensure that TM is enabled in regs->msr before we leave the signal |
636 |
++ * handler. It could be the case that (a) user disabled the TM bit |
637 |
++ * through the manipulation of the MSR bits in uc_mcontext or (b) the |
638 |
++ * TM bit was disabled because a sufficient number of context switches |
639 |
++ * happened whilst in the signal handler and load_tm overflowed, |
640 |
++ * disabling the TM bit. In either case we can end up with an illegal |
641 |
++ * TM state leading to a TM Bad Thing when we return to userspace. |
642 |
++ * |
643 |
++ * CAUTION: |
644 |
++ * After regs->MSR[TS] being updated, make sure that get_user(), |
645 |
++ * put_user() or similar functions are *not* called. These |
646 |
++ * functions can generate page faults which will cause the process |
647 |
++ * to be de-scheduled with MSR[TS] set but without calling |
648 |
++ * tm_recheckpoint(). This can cause a bug. |
649 |
++ */ |
650 |
++ regs->msr |= MSR_TM; |
651 |
++ |
652 |
+ /* This loads the checkpointed FP/VEC state, if used */ |
653 |
+ tm_recheckpoint(&tsk->thread); |
654 |
+ |
655 |
+@@ -585,6 +599,8 @@ static long restore_tm_sigcontexts(struct task_struct *tsk, |
656 |
+ regs->msr |= MSR_VEC; |
657 |
+ } |
658 |
+ |
659 |
++ preempt_enable(); |
660 |
++ |
661 |
+ return err; |
662 |
+ } |
663 |
+ #endif |
664 |
+@@ -740,23 +756,11 @@ SYSCALL_DEFINE0(rt_sigreturn) |
665 |
+ &uc_transact->uc_mcontext)) |
666 |
+ goto badframe; |
667 |
+ } |
668 |
+-#endif |
669 |
++ else |
670 |
+ /* Fall through, for non-TM restore */ |
671 |
+- if (!MSR_TM_ACTIVE(msr)) { |
672 |
+- /* |
673 |
+- * Unset MSR[TS] on the thread regs since MSR from user |
674 |
+- * context does not have MSR active, and recheckpoint was |
675 |
+- * not called since restore_tm_sigcontexts() was not called |
676 |
+- * also. |
677 |
+- * |
678 |
+- * If not unsetting it, the code can RFID to userspace with |
679 |
+- * MSR[TS] set, but without CPU in the proper state, |
680 |
+- * causing a TM bad thing. |
681 |
+- */ |
682 |
+- current->thread.regs->msr &= ~MSR_TS_MASK; |
683 |
+- if (restore_sigcontext(current, NULL, 1, &uc->uc_mcontext)) |
684 |
+- goto badframe; |
685 |
+- } |
686 |
++#endif |
687 |
++ if (restore_sigcontext(current, NULL, 1, &uc->uc_mcontext)) |
688 |
++ goto badframe; |
689 |
+ |
690 |
+ if (restore_altstack(&uc->uc_stack)) |
691 |
+ goto badframe; |
692 |
+diff --git a/arch/powerpc/kernel/trace/Makefile b/arch/powerpc/kernel/trace/Makefile |
693 |
+index d22d8bafb643..d868ba42032f 100644 |
694 |
+--- a/arch/powerpc/kernel/trace/Makefile |
695 |
++++ b/arch/powerpc/kernel/trace/Makefile |
696 |
+@@ -7,7 +7,7 @@ subdir-ccflags-$(CONFIG_PPC_WERROR) := -Werror |
697 |
+ |
698 |
+ ifdef CONFIG_FUNCTION_TRACER |
699 |
+ # do not trace tracer code |
700 |
+-CFLAGS_REMOVE_ftrace.o = -mno-sched-epilog $(CC_FLAGS_FTRACE) |
701 |
++CFLAGS_REMOVE_ftrace.o = $(CC_FLAGS_FTRACE) |
702 |
+ endif |
703 |
+ |
704 |
+ obj32-$(CONFIG_FUNCTION_TRACER) += ftrace_32.o |
705 |
+diff --git a/arch/powerpc/mm/dump_linuxpagetables.c b/arch/powerpc/mm/dump_linuxpagetables.c |
706 |
+index bdf33b989f98..8464c2c01c0c 100644 |
707 |
+--- a/arch/powerpc/mm/dump_linuxpagetables.c |
708 |
++++ b/arch/powerpc/mm/dump_linuxpagetables.c |
709 |
+@@ -19,6 +19,7 @@ |
710 |
+ #include <linux/hugetlb.h> |
711 |
+ #include <linux/io.h> |
712 |
+ #include <linux/mm.h> |
713 |
++#include <linux/highmem.h> |
714 |
+ #include <linux/sched.h> |
715 |
+ #include <linux/seq_file.h> |
716 |
+ #include <asm/fixmap.h> |
717 |
+diff --git a/arch/powerpc/mm/init_64.c b/arch/powerpc/mm/init_64.c |
718 |
+index 7a9886f98b0c..a5091c034747 100644 |
719 |
+--- a/arch/powerpc/mm/init_64.c |
720 |
++++ b/arch/powerpc/mm/init_64.c |
721 |
+@@ -188,15 +188,20 @@ int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node, |
722 |
+ pr_debug("vmemmap_populate %lx..%lx, node %d\n", start, end, node); |
723 |
+ |
724 |
+ for (; start < end; start += page_size) { |
725 |
+- void *p; |
726 |
++ void *p = NULL; |
727 |
+ int rc; |
728 |
+ |
729 |
+ if (vmemmap_populated(start, page_size)) |
730 |
+ continue; |
731 |
+ |
732 |
++ /* |
733 |
++ * Allocate from the altmap first if we have one. This may |
734 |
++ * fail due to alignment issues when using 16MB hugepages, so |
735 |
++ * fall back to system memory if the altmap allocation fail. |
736 |
++ */ |
737 |
+ if (altmap) |
738 |
+ p = altmap_alloc_block_buf(page_size, altmap); |
739 |
+- else |
740 |
++ if (!p) |
741 |
+ p = vmemmap_alloc_block_buf(page_size, node); |
742 |
+ if (!p) |
743 |
+ return -ENOMEM; |
744 |
+@@ -255,8 +260,15 @@ void __ref vmemmap_free(unsigned long start, unsigned long end, |
745 |
+ { |
746 |
+ unsigned long page_size = 1 << mmu_psize_defs[mmu_vmemmap_psize].shift; |
747 |
+ unsigned long page_order = get_order(page_size); |
748 |
++ unsigned long alt_start = ~0, alt_end = ~0; |
749 |
++ unsigned long base_pfn; |
750 |
+ |
751 |
+ start = _ALIGN_DOWN(start, page_size); |
752 |
++ if (altmap) { |
753 |
++ alt_start = altmap->base_pfn; |
754 |
++ alt_end = altmap->base_pfn + altmap->reserve + |
755 |
++ altmap->free + altmap->alloc + altmap->align; |
756 |
++ } |
757 |
+ |
758 |
+ pr_debug("vmemmap_free %lx...%lx\n", start, end); |
759 |
+ |
760 |
+@@ -280,8 +292,9 @@ void __ref vmemmap_free(unsigned long start, unsigned long end, |
761 |
+ page = pfn_to_page(addr >> PAGE_SHIFT); |
762 |
+ section_base = pfn_to_page(vmemmap_section_start(start)); |
763 |
+ nr_pages = 1 << page_order; |
764 |
++ base_pfn = PHYS_PFN(addr); |
765 |
+ |
766 |
+- if (altmap) { |
767 |
++ if (base_pfn >= alt_start && base_pfn < alt_end) { |
768 |
+ vmem_altmap_free(altmap, nr_pages); |
769 |
+ } else if (PageReserved(page)) { |
770 |
+ /* allocated from bootmem */ |
771 |
+diff --git a/arch/powerpc/platforms/powermac/Makefile b/arch/powerpc/platforms/powermac/Makefile |
772 |
+index f2839eed0f89..561a67d65e4d 100644 |
773 |
+--- a/arch/powerpc/platforms/powermac/Makefile |
774 |
++++ b/arch/powerpc/platforms/powermac/Makefile |
775 |
+@@ -3,7 +3,7 @@ CFLAGS_bootx_init.o += -fPIC |
776 |
+ |
777 |
+ ifdef CONFIG_FUNCTION_TRACER |
778 |
+ # Do not trace early boot code |
779 |
+-CFLAGS_REMOVE_bootx_init.o = -mno-sched-epilog $(CC_FLAGS_FTRACE) |
780 |
++CFLAGS_REMOVE_bootx_init.o = $(CC_FLAGS_FTRACE) |
781 |
+ endif |
782 |
+ |
783 |
+ obj-y += pic.o setup.o time.o feature.o pci.o \ |
784 |
+diff --git a/arch/powerpc/xmon/Makefile b/arch/powerpc/xmon/Makefile |
785 |
+index 1bc3abb237cd..9d7d8e6d705c 100644 |
786 |
+--- a/arch/powerpc/xmon/Makefile |
787 |
++++ b/arch/powerpc/xmon/Makefile |
788 |
+@@ -1,14 +1,17 @@ |
789 |
+ # SPDX-License-Identifier: GPL-2.0 |
790 |
+ # Makefile for xmon |
791 |
+ |
792 |
+-subdir-ccflags-$(CONFIG_PPC_WERROR) := -Werror |
793 |
++# Disable clang warning for using setjmp without setjmp.h header |
794 |
++subdir-ccflags-y := $(call cc-disable-warning, builtin-requires-header) |
795 |
++ |
796 |
++subdir-ccflags-$(CONFIG_PPC_WERROR) += -Werror |
797 |
+ |
798 |
+ GCOV_PROFILE := n |
799 |
+ UBSAN_SANITIZE := n |
800 |
+ |
801 |
+ # Disable ftrace for the entire directory |
802 |
+ ORIG_CFLAGS := $(KBUILD_CFLAGS) |
803 |
+-KBUILD_CFLAGS = $(subst -mno-sched-epilog,,$(subst $(CC_FLAGS_FTRACE),,$(ORIG_CFLAGS))) |
804 |
++KBUILD_CFLAGS = $(subst $(CC_FLAGS_FTRACE),,$(ORIG_CFLAGS)) |
805 |
+ |
806 |
+ ccflags-$(CONFIG_PPC64) := $(NO_MINIMAL_TOC) |
807 |
+ |
808 |
+diff --git a/arch/x86/include/asm/pgtable_64_types.h b/arch/x86/include/asm/pgtable_64_types.h |
809 |
+index 84bd9bdc1987..88bca456da99 100644 |
810 |
+--- a/arch/x86/include/asm/pgtable_64_types.h |
811 |
++++ b/arch/x86/include/asm/pgtable_64_types.h |
812 |
+@@ -111,6 +111,11 @@ extern unsigned int ptrs_per_p4d; |
813 |
+ */ |
814 |
+ #define MAXMEM (1UL << MAX_PHYSMEM_BITS) |
815 |
+ |
816 |
++#define GUARD_HOLE_PGD_ENTRY -256UL |
817 |
++#define GUARD_HOLE_SIZE (16UL << PGDIR_SHIFT) |
818 |
++#define GUARD_HOLE_BASE_ADDR (GUARD_HOLE_PGD_ENTRY << PGDIR_SHIFT) |
819 |
++#define GUARD_HOLE_END_ADDR (GUARD_HOLE_BASE_ADDR + GUARD_HOLE_SIZE) |
820 |
++ |
821 |
+ #define LDT_PGD_ENTRY -240UL |
822 |
+ #define LDT_BASE_ADDR (LDT_PGD_ENTRY << PGDIR_SHIFT) |
823 |
+ #define LDT_END_ADDR (LDT_BASE_ADDR + PGDIR_SIZE) |
824 |
+diff --git a/arch/x86/mm/dump_pagetables.c b/arch/x86/mm/dump_pagetables.c |
825 |
+index a12afff146d1..c05a818224bb 100644 |
826 |
+--- a/arch/x86/mm/dump_pagetables.c |
827 |
++++ b/arch/x86/mm/dump_pagetables.c |
828 |
+@@ -53,10 +53,10 @@ struct addr_marker { |
829 |
+ enum address_markers_idx { |
830 |
+ USER_SPACE_NR = 0, |
831 |
+ KERNEL_SPACE_NR, |
832 |
+- LOW_KERNEL_NR, |
833 |
+-#if defined(CONFIG_MODIFY_LDT_SYSCALL) && defined(CONFIG_X86_5LEVEL) |
834 |
++#ifdef CONFIG_MODIFY_LDT_SYSCALL |
835 |
+ LDT_NR, |
836 |
+ #endif |
837 |
++ LOW_KERNEL_NR, |
838 |
+ VMALLOC_START_NR, |
839 |
+ VMEMMAP_START_NR, |
840 |
+ #ifdef CONFIG_KASAN |
841 |
+@@ -64,9 +64,6 @@ enum address_markers_idx { |
842 |
+ KASAN_SHADOW_END_NR, |
843 |
+ #endif |
844 |
+ CPU_ENTRY_AREA_NR, |
845 |
+-#if defined(CONFIG_MODIFY_LDT_SYSCALL) && !defined(CONFIG_X86_5LEVEL) |
846 |
+- LDT_NR, |
847 |
+-#endif |
848 |
+ #ifdef CONFIG_X86_ESPFIX64 |
849 |
+ ESPFIX_START_NR, |
850 |
+ #endif |
851 |
+@@ -493,11 +490,11 @@ static inline bool is_hypervisor_range(int idx) |
852 |
+ { |
853 |
+ #ifdef CONFIG_X86_64 |
854 |
+ /* |
855 |
+- * ffff800000000000 - ffff87ffffffffff is reserved for |
856 |
+- * the hypervisor. |
857 |
++ * A hole in the beginning of kernel address space reserved |
858 |
++ * for a hypervisor. |
859 |
+ */ |
860 |
+- return (idx >= pgd_index(__PAGE_OFFSET) - 16) && |
861 |
+- (idx < pgd_index(__PAGE_OFFSET)); |
862 |
++ return (idx >= pgd_index(GUARD_HOLE_BASE_ADDR)) && |
863 |
++ (idx < pgd_index(GUARD_HOLE_END_ADDR)); |
864 |
+ #else |
865 |
+ return false; |
866 |
+ #endif |
867 |
+diff --git a/arch/x86/xen/mmu_pv.c b/arch/x86/xen/mmu_pv.c |
868 |
+index 2c84c6ad8b50..c8f011e07a15 100644 |
869 |
+--- a/arch/x86/xen/mmu_pv.c |
870 |
++++ b/arch/x86/xen/mmu_pv.c |
871 |
+@@ -640,19 +640,20 @@ static int __xen_pgd_walk(struct mm_struct *mm, pgd_t *pgd, |
872 |
+ unsigned long limit) |
873 |
+ { |
874 |
+ int i, nr, flush = 0; |
875 |
+- unsigned hole_low, hole_high; |
876 |
++ unsigned hole_low = 0, hole_high = 0; |
877 |
+ |
878 |
+ /* The limit is the last byte to be touched */ |
879 |
+ limit--; |
880 |
+ BUG_ON(limit >= FIXADDR_TOP); |
881 |
+ |
882 |
++#ifdef CONFIG_X86_64 |
883 |
+ /* |
884 |
+ * 64-bit has a great big hole in the middle of the address |
885 |
+- * space, which contains the Xen mappings. On 32-bit these |
886 |
+- * will end up making a zero-sized hole and so is a no-op. |
887 |
++ * space, which contains the Xen mappings. |
888 |
+ */ |
889 |
+- hole_low = pgd_index(USER_LIMIT); |
890 |
+- hole_high = pgd_index(PAGE_OFFSET); |
891 |
++ hole_low = pgd_index(GUARD_HOLE_BASE_ADDR); |
892 |
++ hole_high = pgd_index(GUARD_HOLE_END_ADDR); |
893 |
++#endif |
894 |
+ |
895 |
+ nr = pgd_index(limit) + 1; |
896 |
+ for (i = 0; i < nr; i++) { |
897 |
+diff --git a/block/blk-mq-sched.c b/block/blk-mq-sched.c |
898 |
+index 29bfe8017a2d..da1de190a3b1 100644 |
899 |
+--- a/block/blk-mq-sched.c |
900 |
++++ b/block/blk-mq-sched.c |
901 |
+@@ -54,13 +54,14 @@ void blk_mq_sched_assign_ioc(struct request *rq, struct bio *bio) |
902 |
+ * Mark a hardware queue as needing a restart. For shared queues, maintain |
903 |
+ * a count of how many hardware queues are marked for restart. |
904 |
+ */ |
905 |
+-static void blk_mq_sched_mark_restart_hctx(struct blk_mq_hw_ctx *hctx) |
906 |
++void blk_mq_sched_mark_restart_hctx(struct blk_mq_hw_ctx *hctx) |
907 |
+ { |
908 |
+ if (test_bit(BLK_MQ_S_SCHED_RESTART, &hctx->state)) |
909 |
+ return; |
910 |
+ |
911 |
+ set_bit(BLK_MQ_S_SCHED_RESTART, &hctx->state); |
912 |
+ } |
913 |
++EXPORT_SYMBOL_GPL(blk_mq_sched_mark_restart_hctx); |
914 |
+ |
915 |
+ void blk_mq_sched_restart(struct blk_mq_hw_ctx *hctx) |
916 |
+ { |
917 |
+diff --git a/block/blk-mq-sched.h b/block/blk-mq-sched.h |
918 |
+index 4e028ee42430..fe660764b8d1 100644 |
919 |
+--- a/block/blk-mq-sched.h |
920 |
++++ b/block/blk-mq-sched.h |
921 |
+@@ -15,6 +15,7 @@ bool blk_mq_sched_try_merge(struct request_queue *q, struct bio *bio, |
922 |
+ struct request **merged_request); |
923 |
+ bool __blk_mq_sched_bio_merge(struct request_queue *q, struct bio *bio); |
924 |
+ bool blk_mq_sched_try_insert_merge(struct request_queue *q, struct request *rq); |
925 |
++void blk_mq_sched_mark_restart_hctx(struct blk_mq_hw_ctx *hctx); |
926 |
+ void blk_mq_sched_restart(struct blk_mq_hw_ctx *hctx); |
927 |
+ |
928 |
+ void blk_mq_sched_insert_request(struct request *rq, bool at_head, |
929 |
+diff --git a/block/blk-stat.h b/block/blk-stat.h |
930 |
+index f4a1568e81a4..17b47a86eefb 100644 |
931 |
+--- a/block/blk-stat.h |
932 |
++++ b/block/blk-stat.h |
933 |
+@@ -145,6 +145,11 @@ static inline void blk_stat_activate_nsecs(struct blk_stat_callback *cb, |
934 |
+ mod_timer(&cb->timer, jiffies + nsecs_to_jiffies(nsecs)); |
935 |
+ } |
936 |
+ |
937 |
++static inline void blk_stat_deactivate(struct blk_stat_callback *cb) |
938 |
++{ |
939 |
++ del_timer_sync(&cb->timer); |
940 |
++} |
941 |
++ |
942 |
+ /** |
943 |
+ * blk_stat_activate_msecs() - Gather block statistics during a time window in |
944 |
+ * milliseconds. |
945 |
+diff --git a/block/blk-wbt.c b/block/blk-wbt.c |
946 |
+index 8ac93fcbaa2e..0c62bf4eca75 100644 |
947 |
+--- a/block/blk-wbt.c |
948 |
++++ b/block/blk-wbt.c |
949 |
+@@ -760,8 +760,10 @@ void wbt_disable_default(struct request_queue *q) |
950 |
+ if (!rqos) |
951 |
+ return; |
952 |
+ rwb = RQWB(rqos); |
953 |
+- if (rwb->enable_state == WBT_STATE_ON_DEFAULT) |
954 |
++ if (rwb->enable_state == WBT_STATE_ON_DEFAULT) { |
955 |
++ blk_stat_deactivate(rwb->cb); |
956 |
+ rwb->wb_normal = 0; |
957 |
++ } |
958 |
+ } |
959 |
+ EXPORT_SYMBOL_GPL(wbt_disable_default); |
960 |
+ |
961 |
+diff --git a/block/mq-deadline.c b/block/mq-deadline.c |
962 |
+index 099a9e05854c..d5e21ce44d2c 100644 |
963 |
+--- a/block/mq-deadline.c |
964 |
++++ b/block/mq-deadline.c |
965 |
+@@ -373,9 +373,16 @@ done: |
966 |
+ |
967 |
+ /* |
968 |
+ * One confusing aspect here is that we get called for a specific |
969 |
+- * hardware queue, but we return a request that may not be for a |
970 |
++ * hardware queue, but we may return a request that is for a |
971 |
+ * different hardware queue. This is because mq-deadline has shared |
972 |
+ * state for all hardware queues, in terms of sorting, FIFOs, etc. |
973 |
++ * |
974 |
++ * For a zoned block device, __dd_dispatch_request() may return NULL |
975 |
++ * if all the queued write requests are directed at zones that are already |
976 |
++ * locked due to on-going write requests. In this case, make sure to mark |
977 |
++ * the queue as needing a restart to ensure that the queue is run again |
978 |
++ * and the pending writes dispatched once the target zones for the ongoing |
979 |
++ * write requests are unlocked in dd_finish_request(). |
980 |
+ */ |
981 |
+ static struct request *dd_dispatch_request(struct blk_mq_hw_ctx *hctx) |
982 |
+ { |
983 |
+@@ -384,6 +391,9 @@ static struct request *dd_dispatch_request(struct blk_mq_hw_ctx *hctx) |
984 |
+ |
985 |
+ spin_lock(&dd->lock); |
986 |
+ rq = __dd_dispatch_request(dd); |
987 |
++ if (!rq && blk_queue_is_zoned(hctx->queue) && |
988 |
++ !list_empty(&dd->fifo_list[WRITE])) |
989 |
++ blk_mq_sched_mark_restart_hctx(hctx); |
990 |
+ spin_unlock(&dd->lock); |
991 |
+ |
992 |
+ return rq; |
993 |
+diff --git a/drivers/auxdisplay/charlcd.c b/drivers/auxdisplay/charlcd.c |
994 |
+index 81c22d20d9d9..60e0b772673f 100644 |
995 |
+--- a/drivers/auxdisplay/charlcd.c |
996 |
++++ b/drivers/auxdisplay/charlcd.c |
997 |
+@@ -538,6 +538,9 @@ static inline int handle_lcd_special_code(struct charlcd *lcd) |
998 |
+ } |
999 |
+ case 'x': /* gotoxy : LxXXX[yYYY]; */ |
1000 |
+ case 'y': /* gotoxy : LyYYY[xXXX]; */ |
1001 |
++ if (priv->esc_seq.buf[priv->esc_seq.len - 1] != ';') |
1002 |
++ break; |
1003 |
++ |
1004 |
+ /* If the command is valid, move to the new address */ |
1005 |
+ if (parse_xy(esc, &priv->addr.x, &priv->addr.y)) |
1006 |
+ charlcd_gotoxy(lcd); |
1007 |
+diff --git a/drivers/base/dd.c b/drivers/base/dd.c |
1008 |
+index edfc9f0b1180..2607f859881a 100644 |
1009 |
+--- a/drivers/base/dd.c |
1010 |
++++ b/drivers/base/dd.c |
1011 |
+@@ -931,11 +931,11 @@ static void __device_release_driver(struct device *dev, struct device *parent) |
1012 |
+ |
1013 |
+ while (device_links_busy(dev)) { |
1014 |
+ device_unlock(dev); |
1015 |
+- if (parent) |
1016 |
++ if (parent && dev->bus->need_parent_lock) |
1017 |
+ device_unlock(parent); |
1018 |
+ |
1019 |
+ device_links_unbind_consumers(dev); |
1020 |
+- if (parent) |
1021 |
++ if (parent && dev->bus->need_parent_lock) |
1022 |
+ device_lock(parent); |
1023 |
+ |
1024 |
+ device_lock(dev); |
1025 |
+diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c |
1026 |
+index 66921427d109..e19bf0a750cf 100644 |
1027 |
+--- a/drivers/block/zram/zram_drv.c |
1028 |
++++ b/drivers/block/zram/zram_drv.c |
1029 |
+@@ -382,8 +382,10 @@ static ssize_t backing_dev_store(struct device *dev, |
1030 |
+ |
1031 |
+ bdev = bdgrab(I_BDEV(inode)); |
1032 |
+ err = blkdev_get(bdev, FMODE_READ | FMODE_WRITE | FMODE_EXCL, zram); |
1033 |
+- if (err < 0) |
1034 |
++ if (err < 0) { |
1035 |
++ bdev = NULL; |
1036 |
+ goto out; |
1037 |
++ } |
1038 |
+ |
1039 |
+ nr_pages = i_size_read(inode) >> PAGE_SHIFT; |
1040 |
+ bitmap_sz = BITS_TO_LONGS(nr_pages) * sizeof(long); |
1041 |
+diff --git a/drivers/dax/pmem.c b/drivers/dax/pmem.c |
1042 |
+index 99e2aace8078..2c1f459c0c63 100644 |
1043 |
+--- a/drivers/dax/pmem.c |
1044 |
++++ b/drivers/dax/pmem.c |
1045 |
+@@ -48,9 +48,8 @@ static void dax_pmem_percpu_exit(void *data) |
1046 |
+ percpu_ref_exit(ref); |
1047 |
+ } |
1048 |
+ |
1049 |
+-static void dax_pmem_percpu_kill(void *data) |
1050 |
++static void dax_pmem_percpu_kill(struct percpu_ref *ref) |
1051 |
+ { |
1052 |
+- struct percpu_ref *ref = data; |
1053 |
+ struct dax_pmem *dax_pmem = to_dax_pmem(ref); |
1054 |
+ |
1055 |
+ dev_dbg(dax_pmem->dev, "trace\n"); |
1056 |
+@@ -112,17 +111,10 @@ static int dax_pmem_probe(struct device *dev) |
1057 |
+ } |
1058 |
+ |
1059 |
+ dax_pmem->pgmap.ref = &dax_pmem->ref; |
1060 |
++ dax_pmem->pgmap.kill = dax_pmem_percpu_kill; |
1061 |
+ addr = devm_memremap_pages(dev, &dax_pmem->pgmap); |
1062 |
+- if (IS_ERR(addr)) { |
1063 |
+- devm_remove_action(dev, dax_pmem_percpu_exit, &dax_pmem->ref); |
1064 |
+- percpu_ref_exit(&dax_pmem->ref); |
1065 |
++ if (IS_ERR(addr)) |
1066 |
+ return PTR_ERR(addr); |
1067 |
+- } |
1068 |
+- |
1069 |
+- rc = devm_add_action_or_reset(dev, dax_pmem_percpu_kill, |
1070 |
+- &dax_pmem->ref); |
1071 |
+- if (rc) |
1072 |
+- return rc; |
1073 |
+ |
1074 |
+ /* adjust the dax_region resource to the start of data */ |
1075 |
+ memcpy(&res, &dax_pmem->pgmap.res, sizeof(res)); |
1076 |
+diff --git a/drivers/gpio/gpio-mvebu.c b/drivers/gpio/gpio-mvebu.c |
1077 |
+index 6e02148c208b..adc768f908f1 100644 |
1078 |
+--- a/drivers/gpio/gpio-mvebu.c |
1079 |
++++ b/drivers/gpio/gpio-mvebu.c |
1080 |
+@@ -773,9 +773,6 @@ static int mvebu_pwm_probe(struct platform_device *pdev, |
1081 |
+ "marvell,armada-370-gpio")) |
1082 |
+ return 0; |
1083 |
+ |
1084 |
+- if (IS_ERR(mvchip->clk)) |
1085 |
+- return PTR_ERR(mvchip->clk); |
1086 |
+- |
1087 |
+ /* |
1088 |
+ * There are only two sets of PWM configuration registers for |
1089 |
+ * all the GPIO lines on those SoCs which this driver reserves |
1090 |
+@@ -786,6 +783,9 @@ static int mvebu_pwm_probe(struct platform_device *pdev, |
1091 |
+ if (!res) |
1092 |
+ return 0; |
1093 |
+ |
1094 |
++ if (IS_ERR(mvchip->clk)) |
1095 |
++ return PTR_ERR(mvchip->clk); |
1096 |
++ |
1097 |
+ /* |
1098 |
+ * Use set A for lines of GPIO chip with id 0, B for GPIO chip |
1099 |
+ * with id 1. Don't allow further GPIO chips to be used for PWM. |
1100 |
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c |
1101 |
+index b31d121a876b..81001d879322 100644 |
1102 |
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c |
1103 |
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c |
1104 |
+@@ -122,14 +122,14 @@ static int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, union drm_amdgpu_cs |
1105 |
+ goto free_chunk; |
1106 |
+ } |
1107 |
+ |
1108 |
++ mutex_lock(&p->ctx->lock); |
1109 |
++ |
1110 |
+ /* skip guilty context job */ |
1111 |
+ if (atomic_read(&p->ctx->guilty) == 1) { |
1112 |
+ ret = -ECANCELED; |
1113 |
+ goto free_chunk; |
1114 |
+ } |
1115 |
+ |
1116 |
+- mutex_lock(&p->ctx->lock); |
1117 |
+- |
1118 |
+ /* get chunks */ |
1119 |
+ chunk_array_user = u64_to_user_ptr(cs->in.chunks); |
1120 |
+ if (copy_from_user(chunk_array, chunk_array_user, |
1121 |
+diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c |
1122 |
+index 299def84e69c..d792735f1365 100644 |
1123 |
+--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c |
1124 |
++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c |
1125 |
+@@ -2894,6 +2894,7 @@ void amdgpu_dm_connector_funcs_reset(struct drm_connector *connector) |
1126 |
+ state->underscan_enable = false; |
1127 |
+ state->underscan_hborder = 0; |
1128 |
+ state->underscan_vborder = 0; |
1129 |
++ state->max_bpc = 8; |
1130 |
+ |
1131 |
+ __drm_atomic_helper_connector_reset(connector, &state->base); |
1132 |
+ } |
1133 |
+@@ -2911,6 +2912,7 @@ amdgpu_dm_connector_atomic_duplicate_state(struct drm_connector *connector) |
1134 |
+ if (new_state) { |
1135 |
+ __drm_atomic_helper_connector_duplicate_state(connector, |
1136 |
+ &new_state->base); |
1137 |
++ new_state->max_bpc = state->max_bpc; |
1138 |
+ return &new_state->base; |
1139 |
+ } |
1140 |
+ |
1141 |
+diff --git a/drivers/gpu/drm/nouveau/dispnv50/disp.c b/drivers/gpu/drm/nouveau/dispnv50/disp.c |
1142 |
+index 2abcd7bf104f..f889d41a281f 100644 |
1143 |
+--- a/drivers/gpu/drm/nouveau/dispnv50/disp.c |
1144 |
++++ b/drivers/gpu/drm/nouveau/dispnv50/disp.c |
1145 |
+@@ -1224,8 +1224,16 @@ nv50_mstm_fini(struct nv50_mstm *mstm) |
1146 |
+ static void |
1147 |
+ nv50_mstm_init(struct nv50_mstm *mstm) |
1148 |
+ { |
1149 |
+- if (mstm && mstm->mgr.mst_state) |
1150 |
+- drm_dp_mst_topology_mgr_resume(&mstm->mgr); |
1151 |
++ int ret; |
1152 |
++ |
1153 |
++ if (!mstm || !mstm->mgr.mst_state) |
1154 |
++ return; |
1155 |
++ |
1156 |
++ ret = drm_dp_mst_topology_mgr_resume(&mstm->mgr); |
1157 |
++ if (ret == -1) { |
1158 |
++ drm_dp_mst_topology_mgr_set_mst(&mstm->mgr, false); |
1159 |
++ drm_kms_helper_hotplug_event(mstm->mgr.dev); |
1160 |
++ } |
1161 |
+ } |
1162 |
+ |
1163 |
+ static void |
1164 |
+diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_psr.c b/drivers/gpu/drm/rockchip/rockchip_drm_psr.c |
1165 |
+index 79d00d861a31..01ff3c858875 100644 |
1166 |
+--- a/drivers/gpu/drm/rockchip/rockchip_drm_psr.c |
1167 |
++++ b/drivers/gpu/drm/rockchip/rockchip_drm_psr.c |
1168 |
+@@ -189,12 +189,14 @@ EXPORT_SYMBOL(rockchip_drm_psr_flush_all); |
1169 |
+ int rockchip_drm_psr_register(struct drm_encoder *encoder, |
1170 |
+ int (*psr_set)(struct drm_encoder *, bool enable)) |
1171 |
+ { |
1172 |
+- struct rockchip_drm_private *drm_drv = encoder->dev->dev_private; |
1173 |
++ struct rockchip_drm_private *drm_drv; |
1174 |
+ struct psr_drv *psr; |
1175 |
+ |
1176 |
+ if (!encoder || !psr_set) |
1177 |
+ return -EINVAL; |
1178 |
+ |
1179 |
++ drm_drv = encoder->dev->dev_private; |
1180 |
++ |
1181 |
+ psr = kzalloc(sizeof(struct psr_drv), GFP_KERNEL); |
1182 |
+ if (!psr) |
1183 |
+ return -ENOMEM; |
1184 |
+diff --git a/drivers/gpu/drm/vc4/vc4_plane.c b/drivers/gpu/drm/vc4/vc4_plane.c |
1185 |
+index a3275fa66b7b..629f40424bba 100644 |
1186 |
+--- a/drivers/gpu/drm/vc4/vc4_plane.c |
1187 |
++++ b/drivers/gpu/drm/vc4/vc4_plane.c |
1188 |
+@@ -322,6 +322,7 @@ static int vc4_plane_setup_clipping_and_scaling(struct drm_plane_state *state) |
1189 |
+ if (vc4_state->is_unity) |
1190 |
+ vc4_state->x_scaling[0] = VC4_SCALING_PPF; |
1191 |
+ } else { |
1192 |
++ vc4_state->is_yuv = false; |
1193 |
+ vc4_state->x_scaling[1] = VC4_SCALING_NONE; |
1194 |
+ vc4_state->y_scaling[1] = VC4_SCALING_NONE; |
1195 |
+ } |
1196 |
+diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h |
1197 |
+index 46182d4dd1ce..b7870e7e41d4 100644 |
1198 |
+--- a/drivers/hid/hid-ids.h |
1199 |
++++ b/drivers/hid/hid-ids.h |
1200 |
+@@ -17,6 +17,9 @@ |
1201 |
+ #ifndef HID_IDS_H_FILE |
1202 |
+ #define HID_IDS_H_FILE |
1203 |
+ |
1204 |
++#define USB_VENDOR_ID_258A 0x258a |
1205 |
++#define USB_DEVICE_ID_258A_6A88 0x6a88 |
1206 |
++ |
1207 |
+ #define USB_VENDOR_ID_3M 0x0596 |
1208 |
+ #define USB_DEVICE_ID_3M1968 0x0500 |
1209 |
+ #define USB_DEVICE_ID_3M2256 0x0502 |
1210 |
+diff --git a/drivers/hid/hid-ite.c b/drivers/hid/hid-ite.c |
1211 |
+index 1882a4ab0f29..98b059d79bc8 100644 |
1212 |
+--- a/drivers/hid/hid-ite.c |
1213 |
++++ b/drivers/hid/hid-ite.c |
1214 |
+@@ -42,6 +42,7 @@ static int ite_event(struct hid_device *hdev, struct hid_field *field, |
1215 |
+ |
1216 |
+ static const struct hid_device_id ite_devices[] = { |
1217 |
+ { HID_USB_DEVICE(USB_VENDOR_ID_ITE, USB_DEVICE_ID_ITE8595) }, |
1218 |
++ { HID_USB_DEVICE(USB_VENDOR_ID_258A, USB_DEVICE_ID_258A_6A88) }, |
1219 |
+ { } |
1220 |
+ }; |
1221 |
+ MODULE_DEVICE_TABLE(hid, ite_devices); |
1222 |
+diff --git a/drivers/hv/Kconfig b/drivers/hv/Kconfig |
1223 |
+index 97954f575c3f..1c1a2514d6f3 100644 |
1224 |
+--- a/drivers/hv/Kconfig |
1225 |
++++ b/drivers/hv/Kconfig |
1226 |
+@@ -4,7 +4,7 @@ menu "Microsoft Hyper-V guest support" |
1227 |
+ |
1228 |
+ config HYPERV |
1229 |
+ tristate "Microsoft Hyper-V client drivers" |
1230 |
+- depends on X86 && ACPI && PCI && X86_LOCAL_APIC && HYPERVISOR_GUEST |
1231 |
++ depends on X86 && ACPI && X86_LOCAL_APIC && HYPERVISOR_GUEST |
1232 |
+ select PARAVIRT |
1233 |
+ help |
1234 |
+ Select this option to run Linux as a Hyper-V client operating |
1235 |
+diff --git a/drivers/hwtracing/intel_th/msu.c b/drivers/hwtracing/intel_th/msu.c |
1236 |
+index d293e55553bd..ba7aaf421f36 100644 |
1237 |
+--- a/drivers/hwtracing/intel_th/msu.c |
1238 |
++++ b/drivers/hwtracing/intel_th/msu.c |
1239 |
+@@ -1423,7 +1423,8 @@ nr_pages_store(struct device *dev, struct device_attribute *attr, |
1240 |
+ if (!end) |
1241 |
+ break; |
1242 |
+ |
1243 |
+- len -= end - p; |
1244 |
++ /* consume the number and the following comma, hence +1 */ |
1245 |
++ len -= end - p + 1; |
1246 |
+ p = end + 1; |
1247 |
+ } while (len); |
1248 |
+ |
1249 |
+diff --git a/drivers/iio/dac/ad5686.c b/drivers/iio/dac/ad5686.c |
1250 |
+index 2ddbfc3fdbae..cba62ad26cd8 100644 |
1251 |
+--- a/drivers/iio/dac/ad5686.c |
1252 |
++++ b/drivers/iio/dac/ad5686.c |
1253 |
+@@ -124,7 +124,8 @@ static int ad5686_read_raw(struct iio_dev *indio_dev, |
1254 |
+ mutex_unlock(&indio_dev->mlock); |
1255 |
+ if (ret < 0) |
1256 |
+ return ret; |
1257 |
+- *val = ret; |
1258 |
++ *val = (ret >> chan->scan_type.shift) & |
1259 |
++ GENMASK(chan->scan_type.realbits - 1, 0); |
1260 |
+ return IIO_VAL_INT; |
1261 |
+ case IIO_CHAN_INFO_SCALE: |
1262 |
+ *val = st->vref_mv; |
1263 |
+diff --git a/drivers/infiniband/core/roce_gid_mgmt.c b/drivers/infiniband/core/roce_gid_mgmt.c |
1264 |
+index 25d43c8f1c2a..558de0b9895c 100644 |
1265 |
+--- a/drivers/infiniband/core/roce_gid_mgmt.c |
1266 |
++++ b/drivers/infiniband/core/roce_gid_mgmt.c |
1267 |
+@@ -267,6 +267,9 @@ is_upper_ndev_bond_master_filter(struct ib_device *ib_dev, u8 port, |
1268 |
+ struct net_device *cookie_ndev = cookie; |
1269 |
+ bool match = false; |
1270 |
+ |
1271 |
++ if (!rdma_ndev) |
1272 |
++ return false; |
1273 |
++ |
1274 |
+ rcu_read_lock(); |
1275 |
+ if (netif_is_bond_master(cookie_ndev) && |
1276 |
+ rdma_is_upper_dev_rcu(rdma_ndev, cookie_ndev)) |
1277 |
+diff --git a/drivers/infiniband/hw/mlx5/devx.c b/drivers/infiniband/hw/mlx5/devx.c |
1278 |
+index f2f11e652dcd..02f36ab72ad4 100644 |
1279 |
+--- a/drivers/infiniband/hw/mlx5/devx.c |
1280 |
++++ b/drivers/infiniband/hw/mlx5/devx.c |
1281 |
+@@ -857,7 +857,9 @@ static int devx_umem_get(struct mlx5_ib_dev *dev, struct ib_ucontext *ucontext, |
1282 |
+ |
1283 |
+ err = uverbs_get_flags32(&access, attrs, |
1284 |
+ MLX5_IB_ATTR_DEVX_UMEM_REG_ACCESS, |
1285 |
+- IB_ACCESS_SUPPORTED); |
1286 |
++ IB_ACCESS_LOCAL_WRITE | |
1287 |
++ IB_ACCESS_REMOTE_WRITE | |
1288 |
++ IB_ACCESS_REMOTE_READ); |
1289 |
+ if (err) |
1290 |
+ return err; |
1291 |
+ |
1292 |
+diff --git a/drivers/infiniband/sw/rxe/rxe_resp.c b/drivers/infiniband/sw/rxe/rxe_resp.c |
1293 |
+index fc6c880756da..4111b798fd3c 100644 |
1294 |
+--- a/drivers/infiniband/sw/rxe/rxe_resp.c |
1295 |
++++ b/drivers/infiniband/sw/rxe/rxe_resp.c |
1296 |
+@@ -844,11 +844,16 @@ static enum resp_states do_complete(struct rxe_qp *qp, |
1297 |
+ |
1298 |
+ memset(&cqe, 0, sizeof(cqe)); |
1299 |
+ |
1300 |
+- wc->wr_id = wqe->wr_id; |
1301 |
+- wc->status = qp->resp.status; |
1302 |
+- wc->qp = &qp->ibqp; |
1303 |
++ if (qp->rcq->is_user) { |
1304 |
++ uwc->status = qp->resp.status; |
1305 |
++ uwc->qp_num = qp->ibqp.qp_num; |
1306 |
++ uwc->wr_id = wqe->wr_id; |
1307 |
++ } else { |
1308 |
++ wc->status = qp->resp.status; |
1309 |
++ wc->qp = &qp->ibqp; |
1310 |
++ wc->wr_id = wqe->wr_id; |
1311 |
++ } |
1312 |
+ |
1313 |
+- /* fields after status are not required for errors */ |
1314 |
+ if (wc->status == IB_WC_SUCCESS) { |
1315 |
+ wc->opcode = (pkt->mask & RXE_IMMDT_MASK && |
1316 |
+ pkt->mask & RXE_WRITE_MASK) ? |
1317 |
+diff --git a/drivers/infiniband/ulp/srpt/ib_srpt.c b/drivers/infiniband/ulp/srpt/ib_srpt.c |
1318 |
+index f37cbad022a2..f4bce5aa0ff8 100644 |
1319 |
+--- a/drivers/infiniband/ulp/srpt/ib_srpt.c |
1320 |
++++ b/drivers/infiniband/ulp/srpt/ib_srpt.c |
1321 |
+@@ -2009,6 +2009,14 @@ static void srpt_free_ch(struct kref *kref) |
1322 |
+ kfree_rcu(ch, rcu); |
1323 |
+ } |
1324 |
+ |
1325 |
++/* |
1326 |
++ * Shut down the SCSI target session, tell the connection manager to |
1327 |
++ * disconnect the associated RDMA channel, transition the QP to the error |
1328 |
++ * state and remove the channel from the channel list. This function is |
1329 |
++ * typically called from inside srpt_zerolength_write_done(). Concurrent |
1330 |
++ * srpt_zerolength_write() calls from inside srpt_close_ch() are possible |
1331 |
++ * as long as the channel is on sport->nexus_list. |
1332 |
++ */ |
1333 |
+ static void srpt_release_channel_work(struct work_struct *w) |
1334 |
+ { |
1335 |
+ struct srpt_rdma_ch *ch; |
1336 |
+@@ -2036,6 +2044,11 @@ static void srpt_release_channel_work(struct work_struct *w) |
1337 |
+ else |
1338 |
+ ib_destroy_cm_id(ch->ib_cm.cm_id); |
1339 |
+ |
1340 |
++ sport = ch->sport; |
1341 |
++ mutex_lock(&sport->mutex); |
1342 |
++ list_del_rcu(&ch->list); |
1343 |
++ mutex_unlock(&sport->mutex); |
1344 |
++ |
1345 |
+ srpt_destroy_ch_ib(ch); |
1346 |
+ |
1347 |
+ srpt_free_ioctx_ring((struct srpt_ioctx **)ch->ioctx_ring, |
1348 |
+@@ -2046,11 +2059,6 @@ static void srpt_release_channel_work(struct work_struct *w) |
1349 |
+ sdev, ch->rq_size, |
1350 |
+ srp_max_req_size, DMA_FROM_DEVICE); |
1351 |
+ |
1352 |
+- sport = ch->sport; |
1353 |
+- mutex_lock(&sport->mutex); |
1354 |
+- list_del_rcu(&ch->list); |
1355 |
+- mutex_unlock(&sport->mutex); |
1356 |
+- |
1357 |
+ wake_up(&sport->ch_releaseQ); |
1358 |
+ |
1359 |
+ kref_put(&ch->kref, srpt_free_ch); |
1360 |
+diff --git a/drivers/input/keyboard/omap4-keypad.c b/drivers/input/keyboard/omap4-keypad.c |
1361 |
+index a7dc286f406c..840e53732753 100644 |
1362 |
+--- a/drivers/input/keyboard/omap4-keypad.c |
1363 |
++++ b/drivers/input/keyboard/omap4-keypad.c |
1364 |
+@@ -126,12 +126,8 @@ static irqreturn_t omap4_keypad_irq_handler(int irq, void *dev_id) |
1365 |
+ { |
1366 |
+ struct omap4_keypad *keypad_data = dev_id; |
1367 |
+ |
1368 |
+- if (kbd_read_irqreg(keypad_data, OMAP4_KBD_IRQSTATUS)) { |
1369 |
+- /* Disable interrupts */ |
1370 |
+- kbd_write_irqreg(keypad_data, OMAP4_KBD_IRQENABLE, |
1371 |
+- OMAP4_VAL_IRQDISABLE); |
1372 |
++ if (kbd_read_irqreg(keypad_data, OMAP4_KBD_IRQSTATUS)) |
1373 |
+ return IRQ_WAKE_THREAD; |
1374 |
+- } |
1375 |
+ |
1376 |
+ return IRQ_NONE; |
1377 |
+ } |
1378 |
+@@ -173,11 +169,6 @@ static irqreturn_t omap4_keypad_irq_thread_fn(int irq, void *dev_id) |
1379 |
+ kbd_write_irqreg(keypad_data, OMAP4_KBD_IRQSTATUS, |
1380 |
+ kbd_read_irqreg(keypad_data, OMAP4_KBD_IRQSTATUS)); |
1381 |
+ |
1382 |
+- /* enable interrupts */ |
1383 |
+- kbd_write_irqreg(keypad_data, OMAP4_KBD_IRQENABLE, |
1384 |
+- OMAP4_DEF_IRQENABLE_EVENTEN | |
1385 |
+- OMAP4_DEF_IRQENABLE_LONGKEY); |
1386 |
+- |
1387 |
+ return IRQ_HANDLED; |
1388 |
+ } |
1389 |
+ |
1390 |
+@@ -214,9 +205,10 @@ static void omap4_keypad_close(struct input_dev *input) |
1391 |
+ |
1392 |
+ disable_irq(keypad_data->irq); |
1393 |
+ |
1394 |
+- /* Disable interrupts */ |
1395 |
++ /* Disable interrupts and wake-up events */ |
1396 |
+ kbd_write_irqreg(keypad_data, OMAP4_KBD_IRQENABLE, |
1397 |
+ OMAP4_VAL_IRQDISABLE); |
1398 |
++ kbd_writel(keypad_data, OMAP4_KBD_WAKEUPENABLE, 0); |
1399 |
+ |
1400 |
+ /* clear pending interrupts */ |
1401 |
+ kbd_write_irqreg(keypad_data, OMAP4_KBD_IRQSTATUS, |
1402 |
+@@ -365,7 +357,7 @@ static int omap4_keypad_probe(struct platform_device *pdev) |
1403 |
+ } |
1404 |
+ |
1405 |
+ error = request_threaded_irq(keypad_data->irq, omap4_keypad_irq_handler, |
1406 |
+- omap4_keypad_irq_thread_fn, 0, |
1407 |
++ omap4_keypad_irq_thread_fn, IRQF_ONESHOT, |
1408 |
+ "omap4-keypad", keypad_data); |
1409 |
+ if (error) { |
1410 |
+ dev_err(&pdev->dev, "failed to register interrupt\n"); |
1411 |
+diff --git a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c |
1412 |
+index 2bd5bb11c8ba..b6da0c1267e3 100644 |
1413 |
+--- a/drivers/input/mouse/synaptics.c |
1414 |
++++ b/drivers/input/mouse/synaptics.c |
1415 |
+@@ -171,6 +171,7 @@ static const char * const smbus_pnp_ids[] = { |
1416 |
+ "LEN0046", /* X250 */ |
1417 |
+ "LEN004a", /* W541 */ |
1418 |
+ "LEN005b", /* P50 */ |
1419 |
++ "LEN005e", /* T560 */ |
1420 |
+ "LEN0071", /* T480 */ |
1421 |
+ "LEN0072", /* X1 Carbon Gen 5 (2017) - Elan/ALPS trackpoint */ |
1422 |
+ "LEN0073", /* X1 Carbon G5 (Elantech) */ |
1423 |
+@@ -178,6 +179,7 @@ static const char * const smbus_pnp_ids[] = { |
1424 |
+ "LEN0096", /* X280 */ |
1425 |
+ "LEN0097", /* X280 -> ALPS trackpoint */ |
1426 |
+ "LEN200f", /* T450s */ |
1427 |
++ "SYN3052", /* HP EliteBook 840 G4 */ |
1428 |
+ "SYN3221", /* HP 15-ay000 */ |
1429 |
+ NULL |
1430 |
+ }; |
1431 |
+diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c |
1432 |
+index a76c47f20587..4339177629e3 100644 |
1433 |
+--- a/drivers/iommu/intel-iommu.c |
1434 |
++++ b/drivers/iommu/intel-iommu.c |
1435 |
+@@ -2069,7 +2069,7 @@ static int domain_context_mapping_one(struct dmar_domain *domain, |
1436 |
+ * than default. Unnecessary for PT mode. |
1437 |
+ */ |
1438 |
+ if (translation != CONTEXT_TT_PASS_THROUGH) { |
1439 |
+- for (agaw = domain->agaw; agaw != iommu->agaw; agaw--) { |
1440 |
++ for (agaw = domain->agaw; agaw > iommu->agaw; agaw--) { |
1441 |
+ ret = -ENOMEM; |
1442 |
+ pgd = phys_to_virt(dma_pte_addr(pgd)); |
1443 |
+ if (!dma_pte_present(pgd)) |
1444 |
+@@ -2083,7 +2083,7 @@ static int domain_context_mapping_one(struct dmar_domain *domain, |
1445 |
+ translation = CONTEXT_TT_MULTI_LEVEL; |
1446 |
+ |
1447 |
+ context_set_address_root(context, virt_to_phys(pgd)); |
1448 |
+- context_set_address_width(context, iommu->agaw); |
1449 |
++ context_set_address_width(context, agaw); |
1450 |
+ } else { |
1451 |
+ /* |
1452 |
+ * In pass through mode, AW must be programmed to |
1453 |
+diff --git a/drivers/leds/leds-pwm.c b/drivers/leds/leds-pwm.c |
1454 |
+index df80c89ebe7f..5d3faae51d59 100644 |
1455 |
+--- a/drivers/leds/leds-pwm.c |
1456 |
++++ b/drivers/leds/leds-pwm.c |
1457 |
+@@ -100,8 +100,9 @@ static int led_pwm_add(struct device *dev, struct led_pwm_priv *priv, |
1458 |
+ led_data->pwm = devm_pwm_get(dev, led->name); |
1459 |
+ if (IS_ERR(led_data->pwm)) { |
1460 |
+ ret = PTR_ERR(led_data->pwm); |
1461 |
+- dev_err(dev, "unable to request PWM for %s: %d\n", |
1462 |
+- led->name, ret); |
1463 |
++ if (ret != -EPROBE_DEFER) |
1464 |
++ dev_err(dev, "unable to request PWM for %s: %d\n", |
1465 |
++ led->name, ret); |
1466 |
+ return ret; |
1467 |
+ } |
1468 |
+ |
1469 |
+diff --git a/drivers/media/pci/cx23885/cx23885-core.c b/drivers/media/pci/cx23885/cx23885-core.c |
1470 |
+index 39804d830305..fd5c52b21436 100644 |
1471 |
+--- a/drivers/media/pci/cx23885/cx23885-core.c |
1472 |
++++ b/drivers/media/pci/cx23885/cx23885-core.c |
1473 |
+@@ -23,6 +23,7 @@ |
1474 |
+ #include <linux/moduleparam.h> |
1475 |
+ #include <linux/kmod.h> |
1476 |
+ #include <linux/kernel.h> |
1477 |
++#include <linux/pci.h> |
1478 |
+ #include <linux/slab.h> |
1479 |
+ #include <linux/interrupt.h> |
1480 |
+ #include <linux/delay.h> |
1481 |
+@@ -41,6 +42,18 @@ MODULE_AUTHOR("Steven Toth <stoth@×××××××.org>"); |
1482 |
+ MODULE_LICENSE("GPL"); |
1483 |
+ MODULE_VERSION(CX23885_VERSION); |
1484 |
+ |
1485 |
++/* |
1486 |
++ * Some platforms have been found to require periodic resetting of the DMA |
1487 |
++ * engine. Ryzen and XEON platforms are known to be affected. The symptom |
1488 |
++ * encountered is "mpeg risc op code error". Only Ryzen platforms employ |
1489 |
++ * this workaround if the option equals 1. The workaround can be explicitly |
1490 |
++ * disabled for all platforms by setting to 0, the workaround can be forced |
1491 |
++ * on for any platform by setting to 2. |
1492 |
++ */ |
1493 |
++static unsigned int dma_reset_workaround = 1; |
1494 |
++module_param(dma_reset_workaround, int, 0644); |
1495 |
++MODULE_PARM_DESC(dma_reset_workaround, "periodic RiSC dma engine reset; 0-force disable, 1-driver detect (default), 2-force enable"); |
1496 |
++ |
1497 |
+ static unsigned int debug; |
1498 |
+ module_param(debug, int, 0644); |
1499 |
+ MODULE_PARM_DESC(debug, "enable debug messages"); |
1500 |
+@@ -603,8 +616,13 @@ static void cx23885_risc_disasm(struct cx23885_tsport *port, |
1501 |
+ |
1502 |
+ static void cx23885_clear_bridge_error(struct cx23885_dev *dev) |
1503 |
+ { |
1504 |
+- uint32_t reg1_val = cx_read(TC_REQ); /* read-only */ |
1505 |
+- uint32_t reg2_val = cx_read(TC_REQ_SET); |
1506 |
++ uint32_t reg1_val, reg2_val; |
1507 |
++ |
1508 |
++ if (!dev->need_dma_reset) |
1509 |
++ return; |
1510 |
++ |
1511 |
++ reg1_val = cx_read(TC_REQ); /* read-only */ |
1512 |
++ reg2_val = cx_read(TC_REQ_SET); |
1513 |
+ |
1514 |
+ if (reg1_val && reg2_val) { |
1515 |
+ cx_write(TC_REQ, reg1_val); |
1516 |
+@@ -2058,6 +2076,37 @@ void cx23885_gpio_enable(struct cx23885_dev *dev, u32 mask, int asoutput) |
1517 |
+ /* TODO: 23-19 */ |
1518 |
+ } |
1519 |
+ |
1520 |
++static struct { |
1521 |
++ int vendor, dev; |
1522 |
++} const broken_dev_id[] = { |
1523 |
++ /* According with |
1524 |
++ * https://openbenchmarking.org/system/1703021-RI-AMDZEN08075/Ryzen%207%201800X/lspci, |
1525 |
++ * 0x1451 is PCI ID for the IOMMU found on Ryzen |
1526 |
++ */ |
1527 |
++ { PCI_VENDOR_ID_AMD, 0x1451 }, |
1528 |
++}; |
1529 |
++ |
1530 |
++static bool cx23885_does_need_dma_reset(void) |
1531 |
++{ |
1532 |
++ int i; |
1533 |
++ struct pci_dev *pdev = NULL; |
1534 |
++ |
1535 |
++ if (dma_reset_workaround == 0) |
1536 |
++ return false; |
1537 |
++ else if (dma_reset_workaround == 2) |
1538 |
++ return true; |
1539 |
++ |
1540 |
++ for (i = 0; i < ARRAY_SIZE(broken_dev_id); i++) { |
1541 |
++ pdev = pci_get_device(broken_dev_id[i].vendor, |
1542 |
++ broken_dev_id[i].dev, NULL); |
1543 |
++ if (pdev) { |
1544 |
++ pci_dev_put(pdev); |
1545 |
++ return true; |
1546 |
++ } |
1547 |
++ } |
1548 |
++ return false; |
1549 |
++} |
1550 |
++ |
1551 |
+ static int cx23885_initdev(struct pci_dev *pci_dev, |
1552 |
+ const struct pci_device_id *pci_id) |
1553 |
+ { |
1554 |
+@@ -2069,6 +2118,8 @@ static int cx23885_initdev(struct pci_dev *pci_dev, |
1555 |
+ if (NULL == dev) |
1556 |
+ return -ENOMEM; |
1557 |
+ |
1558 |
++ dev->need_dma_reset = cx23885_does_need_dma_reset(); |
1559 |
++ |
1560 |
+ err = v4l2_device_register(&pci_dev->dev, &dev->v4l2_dev); |
1561 |
+ if (err < 0) |
1562 |
+ goto fail_free; |
1563 |
+diff --git a/drivers/media/pci/cx23885/cx23885.h b/drivers/media/pci/cx23885/cx23885.h |
1564 |
+index d54c7ee1ab21..cf965efabe66 100644 |
1565 |
+--- a/drivers/media/pci/cx23885/cx23885.h |
1566 |
++++ b/drivers/media/pci/cx23885/cx23885.h |
1567 |
+@@ -451,6 +451,8 @@ struct cx23885_dev { |
1568 |
+ /* Analog raw audio */ |
1569 |
+ struct cx23885_audio_dev *audio_dev; |
1570 |
+ |
1571 |
++ /* Does the system require periodic DMA resets? */ |
1572 |
++ unsigned int need_dma_reset:1; |
1573 |
+ }; |
1574 |
+ |
1575 |
+ static inline struct cx23885_dev *to_cx23885(struct v4l2_device *v4l2_dev) |
1576 |
+diff --git a/drivers/misc/genwqe/card_utils.c b/drivers/misc/genwqe/card_utils.c |
1577 |
+index 8679e0bd8ec2..f4f8ab602442 100644 |
1578 |
+--- a/drivers/misc/genwqe/card_utils.c |
1579 |
++++ b/drivers/misc/genwqe/card_utils.c |
1580 |
+@@ -217,7 +217,7 @@ u32 genwqe_crc32(u8 *buff, size_t len, u32 init) |
1581 |
+ void *__genwqe_alloc_consistent(struct genwqe_dev *cd, size_t size, |
1582 |
+ dma_addr_t *dma_handle) |
1583 |
+ { |
1584 |
+- if (get_order(size) > MAX_ORDER) |
1585 |
++ if (get_order(size) >= MAX_ORDER) |
1586 |
+ return NULL; |
1587 |
+ |
1588 |
+ return dma_zalloc_coherent(&cd->pci_dev->dev, size, dma_handle, |
1589 |
+diff --git a/drivers/net/ethernet/apm/xgene/xgene_enet_main.c b/drivers/net/ethernet/apm/xgene/xgene_enet_main.c |
1590 |
+index 3b889efddf78..50dd6bf176d0 100644 |
1591 |
+--- a/drivers/net/ethernet/apm/xgene/xgene_enet_main.c |
1592 |
++++ b/drivers/net/ethernet/apm/xgene/xgene_enet_main.c |
1593 |
+@@ -29,9 +29,6 @@ |
1594 |
+ #define RES_RING_CSR 1 |
1595 |
+ #define RES_RING_CMD 2 |
1596 |
+ |
1597 |
+-static const struct of_device_id xgene_enet_of_match[]; |
1598 |
+-static const struct acpi_device_id xgene_enet_acpi_match[]; |
1599 |
+- |
1600 |
+ static void xgene_enet_init_bufpool(struct xgene_enet_desc_ring *buf_pool) |
1601 |
+ { |
1602 |
+ struct xgene_enet_raw_desc16 *raw_desc; |
1603 |
+diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h |
1604 |
+index 0de487a8f0eb..3db54b664aed 100644 |
1605 |
+--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h |
1606 |
++++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h |
1607 |
+@@ -1282,6 +1282,7 @@ enum sp_rtnl_flag { |
1608 |
+ BNX2X_SP_RTNL_TX_STOP, |
1609 |
+ BNX2X_SP_RTNL_GET_DRV_VERSION, |
1610 |
+ BNX2X_SP_RTNL_CHANGE_UDP_PORT, |
1611 |
++ BNX2X_SP_RTNL_UPDATE_SVID, |
1612 |
+ }; |
1613 |
+ |
1614 |
+ enum bnx2x_iov_flag { |
1615 |
+diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c |
1616 |
+index fcc2328bb0d9..a585f1025a58 100644 |
1617 |
+--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c |
1618 |
++++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c |
1619 |
+@@ -2925,6 +2925,10 @@ static void bnx2x_handle_update_svid_cmd(struct bnx2x *bp) |
1620 |
+ func_params.f_obj = &bp->func_obj; |
1621 |
+ func_params.cmd = BNX2X_F_CMD_SWITCH_UPDATE; |
1622 |
+ |
1623 |
++ /* Prepare parameters for function state transitions */ |
1624 |
++ __set_bit(RAMROD_COMP_WAIT, &func_params.ramrod_flags); |
1625 |
++ __set_bit(RAMROD_RETRY, &func_params.ramrod_flags); |
1626 |
++ |
1627 |
+ if (IS_MF_UFP(bp) || IS_MF_BD(bp)) { |
1628 |
+ int func = BP_ABS_FUNC(bp); |
1629 |
+ u32 val; |
1630 |
+@@ -4301,7 +4305,8 @@ static void bnx2x_attn_int_deasserted3(struct bnx2x *bp, u32 attn) |
1631 |
+ bnx2x_handle_eee_event(bp); |
1632 |
+ |
1633 |
+ if (val & DRV_STATUS_OEM_UPDATE_SVID) |
1634 |
+- bnx2x_handle_update_svid_cmd(bp); |
1635 |
++ bnx2x_schedule_sp_rtnl(bp, |
1636 |
++ BNX2X_SP_RTNL_UPDATE_SVID, 0); |
1637 |
+ |
1638 |
+ if (bp->link_vars.periodic_flags & |
1639 |
+ PERIODIC_FLAGS_LINK_EVENT) { |
1640 |
+@@ -8462,6 +8467,7 @@ int bnx2x_set_vlan_one(struct bnx2x *bp, u16 vlan, |
1641 |
+ /* Fill a user request section if needed */ |
1642 |
+ if (!test_bit(RAMROD_CONT, ramrod_flags)) { |
1643 |
+ ramrod_param.user_req.u.vlan.vlan = vlan; |
1644 |
++ __set_bit(BNX2X_VLAN, &ramrod_param.user_req.vlan_mac_flags); |
1645 |
+ /* Set the command: ADD or DEL */ |
1646 |
+ if (set) |
1647 |
+ ramrod_param.user_req.cmd = BNX2X_VLAN_MAC_ADD; |
1648 |
+@@ -8482,6 +8488,27 @@ int bnx2x_set_vlan_one(struct bnx2x *bp, u16 vlan, |
1649 |
+ return rc; |
1650 |
+ } |
1651 |
+ |
1652 |
++static int bnx2x_del_all_vlans(struct bnx2x *bp) |
1653 |
++{ |
1654 |
++ struct bnx2x_vlan_mac_obj *vlan_obj = &bp->sp_objs[0].vlan_obj; |
1655 |
++ unsigned long ramrod_flags = 0, vlan_flags = 0; |
1656 |
++ struct bnx2x_vlan_entry *vlan; |
1657 |
++ int rc; |
1658 |
++ |
1659 |
++ __set_bit(RAMROD_COMP_WAIT, &ramrod_flags); |
1660 |
++ __set_bit(BNX2X_VLAN, &vlan_flags); |
1661 |
++ rc = vlan_obj->delete_all(bp, vlan_obj, &vlan_flags, &ramrod_flags); |
1662 |
++ if (rc) |
1663 |
++ return rc; |
1664 |
++ |
1665 |
++ /* Mark that hw forgot all entries */ |
1666 |
++ list_for_each_entry(vlan, &bp->vlan_reg, link) |
1667 |
++ vlan->hw = false; |
1668 |
++ bp->vlan_cnt = 0; |
1669 |
++ |
1670 |
++ return 0; |
1671 |
++} |
1672 |
++ |
1673 |
+ int bnx2x_del_all_macs(struct bnx2x *bp, |
1674 |
+ struct bnx2x_vlan_mac_obj *mac_obj, |
1675 |
+ int mac_type, bool wait_for_comp) |
1676 |
+@@ -9320,6 +9347,17 @@ void bnx2x_chip_cleanup(struct bnx2x *bp, int unload_mode, bool keep_link) |
1677 |
+ BNX2X_ERR("Failed to schedule DEL commands for UC MACs list: %d\n", |
1678 |
+ rc); |
1679 |
+ |
1680 |
++ /* The whole *vlan_obj structure may be not initialized if VLAN |
1681 |
++ * filtering offload is not supported by hardware. Currently this is |
1682 |
++ * true for all hardware covered by CHIP_IS_E1x(). |
1683 |
++ */ |
1684 |
++ if (!CHIP_IS_E1x(bp)) { |
1685 |
++ /* Remove all currently configured VLANs */ |
1686 |
++ rc = bnx2x_del_all_vlans(bp); |
1687 |
++ if (rc < 0) |
1688 |
++ BNX2X_ERR("Failed to delete all VLANs\n"); |
1689 |
++ } |
1690 |
++ |
1691 |
+ /* Disable LLH */ |
1692 |
+ if (!CHIP_IS_E1(bp)) |
1693 |
+ REG_WR(bp, NIG_REG_LLH0_FUNC_EN + port*8, 0); |
1694 |
+@@ -10349,6 +10387,9 @@ sp_rtnl_not_reset: |
1695 |
+ &bp->sp_rtnl_state)) |
1696 |
+ bnx2x_update_mng_version(bp); |
1697 |
+ |
1698 |
++ if (test_and_clear_bit(BNX2X_SP_RTNL_UPDATE_SVID, &bp->sp_rtnl_state)) |
1699 |
++ bnx2x_handle_update_svid_cmd(bp); |
1700 |
++ |
1701 |
+ if (test_and_clear_bit(BNX2X_SP_RTNL_CHANGE_UDP_PORT, |
1702 |
+ &bp->sp_rtnl_state)) { |
1703 |
+ if (bnx2x_udp_port_update(bp)) { |
1704 |
+@@ -11740,8 +11781,10 @@ static void bnx2x_get_fcoe_info(struct bnx2x *bp) |
1705 |
+ * If maximum allowed number of connections is zero - |
1706 |
+ * disable the feature. |
1707 |
+ */ |
1708 |
+- if (!bp->cnic_eth_dev.max_fcoe_conn) |
1709 |
++ if (!bp->cnic_eth_dev.max_fcoe_conn) { |
1710 |
+ bp->flags |= NO_FCOE_FLAG; |
1711 |
++ eth_zero_addr(bp->fip_mac); |
1712 |
++ } |
1713 |
+ } |
1714 |
+ |
1715 |
+ static void bnx2x_get_cnic_info(struct bnx2x *bp) |
1716 |
+@@ -13014,13 +13057,6 @@ static void bnx2x_vlan_configure(struct bnx2x *bp, bool set_rx_mode) |
1717 |
+ |
1718 |
+ int bnx2x_vlan_reconfigure_vid(struct bnx2x *bp) |
1719 |
+ { |
1720 |
+- struct bnx2x_vlan_entry *vlan; |
1721 |
+- |
1722 |
+- /* The hw forgot all entries after reload */ |
1723 |
+- list_for_each_entry(vlan, &bp->vlan_reg, link) |
1724 |
+- vlan->hw = false; |
1725 |
+- bp->vlan_cnt = 0; |
1726 |
+- |
1727 |
+ /* Don't set rx mode here. Our caller will do it. */ |
1728 |
+ bnx2x_vlan_configure(bp, false); |
1729 |
+ |
1730 |
+diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.h |
1731 |
+index 0bf2fd470819..7a6e82db4231 100644 |
1732 |
+--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.h |
1733 |
++++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.h |
1734 |
+@@ -265,6 +265,7 @@ enum { |
1735 |
+ BNX2X_ETH_MAC, |
1736 |
+ BNX2X_ISCSI_ETH_MAC, |
1737 |
+ BNX2X_NETQ_ETH_MAC, |
1738 |
++ BNX2X_VLAN, |
1739 |
+ BNX2X_DONT_CONSUME_CAM_CREDIT, |
1740 |
+ BNX2X_DONT_CONSUME_CAM_CREDIT_DEST, |
1741 |
+ }; |
1742 |
+@@ -272,7 +273,8 @@ enum { |
1743 |
+ #define BNX2X_VLAN_MAC_CMP_MASK (1 << BNX2X_UC_LIST_MAC | \ |
1744 |
+ 1 << BNX2X_ETH_MAC | \ |
1745 |
+ 1 << BNX2X_ISCSI_ETH_MAC | \ |
1746 |
+- 1 << BNX2X_NETQ_ETH_MAC) |
1747 |
++ 1 << BNX2X_NETQ_ETH_MAC | \ |
1748 |
++ 1 << BNX2X_VLAN) |
1749 |
+ #define BNX2X_VLAN_MAC_CMP_FLAGS(flags) \ |
1750 |
+ ((flags) & BNX2X_VLAN_MAC_CMP_MASK) |
1751 |
+ |
1752 |
+diff --git a/drivers/net/ethernet/cadence/macb_main.c b/drivers/net/ethernet/cadence/macb_main.c |
1753 |
+index 240fd36b5074..8f4b2f9a8e07 100644 |
1754 |
+--- a/drivers/net/ethernet/cadence/macb_main.c |
1755 |
++++ b/drivers/net/ethernet/cadence/macb_main.c |
1756 |
+@@ -682,6 +682,11 @@ static void macb_set_addr(struct macb *bp, struct macb_dma_desc *desc, dma_addr_ |
1757 |
+ if (bp->hw_dma_cap & HW_DMA_CAP_64B) { |
1758 |
+ desc_64 = macb_64b_desc(bp, desc); |
1759 |
+ desc_64->addrh = upper_32_bits(addr); |
1760 |
++ /* The low bits of RX address contain the RX_USED bit, clearing |
1761 |
++ * of which allows packet RX. Make sure the high bits are also |
1762 |
++ * visible to HW at that point. |
1763 |
++ */ |
1764 |
++ dma_wmb(); |
1765 |
+ } |
1766 |
+ #endif |
1767 |
+ desc->addr = lower_32_bits(addr); |
1768 |
+@@ -930,14 +935,19 @@ static void gem_rx_refill(struct macb_queue *queue) |
1769 |
+ |
1770 |
+ if (entry == bp->rx_ring_size - 1) |
1771 |
+ paddr |= MACB_BIT(RX_WRAP); |
1772 |
+- macb_set_addr(bp, desc, paddr); |
1773 |
+ desc->ctrl = 0; |
1774 |
++ /* Setting addr clears RX_USED and allows reception, |
1775 |
++ * make sure ctrl is cleared first to avoid a race. |
1776 |
++ */ |
1777 |
++ dma_wmb(); |
1778 |
++ macb_set_addr(bp, desc, paddr); |
1779 |
+ |
1780 |
+ /* properly align Ethernet header */ |
1781 |
+ skb_reserve(skb, NET_IP_ALIGN); |
1782 |
+ } else { |
1783 |
+- desc->addr &= ~MACB_BIT(RX_USED); |
1784 |
+ desc->ctrl = 0; |
1785 |
++ dma_wmb(); |
1786 |
++ desc->addr &= ~MACB_BIT(RX_USED); |
1787 |
+ } |
1788 |
+ } |
1789 |
+ |
1790 |
+@@ -991,11 +1001,15 @@ static int gem_rx(struct macb_queue *queue, int budget) |
1791 |
+ |
1792 |
+ rxused = (desc->addr & MACB_BIT(RX_USED)) ? true : false; |
1793 |
+ addr = macb_get_addr(bp, desc); |
1794 |
+- ctrl = desc->ctrl; |
1795 |
+ |
1796 |
+ if (!rxused) |
1797 |
+ break; |
1798 |
+ |
1799 |
++ /* Ensure ctrl is at least as up-to-date as rxused */ |
1800 |
++ dma_rmb(); |
1801 |
++ |
1802 |
++ ctrl = desc->ctrl; |
1803 |
++ |
1804 |
+ queue->rx_tail++; |
1805 |
+ count++; |
1806 |
+ |
1807 |
+@@ -1170,11 +1184,14 @@ static int macb_rx(struct macb_queue *queue, int budget) |
1808 |
+ /* Make hw descriptor updates visible to CPU */ |
1809 |
+ rmb(); |
1810 |
+ |
1811 |
+- ctrl = desc->ctrl; |
1812 |
+- |
1813 |
+ if (!(desc->addr & MACB_BIT(RX_USED))) |
1814 |
+ break; |
1815 |
+ |
1816 |
++ /* Ensure ctrl is at least as up-to-date as addr */ |
1817 |
++ dma_rmb(); |
1818 |
++ |
1819 |
++ ctrl = desc->ctrl; |
1820 |
++ |
1821 |
+ if (ctrl & MACB_BIT(RX_SOF)) { |
1822 |
+ if (first_frag != -1) |
1823 |
+ discard_partial_frame(queue, first_frag, tail); |
1824 |
+diff --git a/drivers/net/ethernet/cadence/macb_ptp.c b/drivers/net/ethernet/cadence/macb_ptp.c |
1825 |
+index cd5296b84229..a6dc47edc4cf 100644 |
1826 |
+--- a/drivers/net/ethernet/cadence/macb_ptp.c |
1827 |
++++ b/drivers/net/ethernet/cadence/macb_ptp.c |
1828 |
+@@ -319,6 +319,8 @@ int gem_ptp_txstamp(struct macb_queue *queue, struct sk_buff *skb, |
1829 |
+ desc_ptp = macb_ptp_desc(queue->bp, desc); |
1830 |
+ tx_timestamp = &queue->tx_timestamps[head]; |
1831 |
+ tx_timestamp->skb = skb; |
1832 |
++ /* ensure ts_1/ts_2 is loaded after ctrl (TX_USED check) */ |
1833 |
++ dma_rmb(); |
1834 |
+ tx_timestamp->desc_ptp.ts_1 = desc_ptp->ts_1; |
1835 |
+ tx_timestamp->desc_ptp.ts_2 = desc_ptp->ts_2; |
1836 |
+ /* move head */ |
1837 |
+diff --git a/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c b/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c |
1838 |
+index b52029e26d15..ad1779fc410e 100644 |
1839 |
+--- a/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c |
1840 |
++++ b/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c |
1841 |
+@@ -379,6 +379,9 @@ static void hns_ae_stop(struct hnae_handle *handle) |
1842 |
+ |
1843 |
+ hns_ae_ring_enable_all(handle, 0); |
1844 |
+ |
1845 |
++ /* clean rx fbd. */ |
1846 |
++ hns_rcb_wait_fbd_clean(handle->qs, handle->q_num, RCB_INT_FLAG_RX); |
1847 |
++ |
1848 |
+ (void)hns_mac_vm_config_bc_en(mac_cb, 0, false); |
1849 |
+ } |
1850 |
+ |
1851 |
+diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_gmac.c b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_gmac.c |
1852 |
+index 09e4061d1fa6..aa2c25d7a61d 100644 |
1853 |
+--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_gmac.c |
1854 |
++++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_gmac.c |
1855 |
+@@ -67,11 +67,14 @@ static void hns_gmac_enable(void *mac_drv, enum mac_commom_mode mode) |
1856 |
+ struct mac_driver *drv = (struct mac_driver *)mac_drv; |
1857 |
+ |
1858 |
+ /*enable GE rX/tX */ |
1859 |
+- if ((mode == MAC_COMM_MODE_TX) || (mode == MAC_COMM_MODE_RX_AND_TX)) |
1860 |
++ if (mode == MAC_COMM_MODE_TX || mode == MAC_COMM_MODE_RX_AND_TX) |
1861 |
+ dsaf_set_dev_bit(drv, GMAC_PORT_EN_REG, GMAC_PORT_TX_EN_B, 1); |
1862 |
+ |
1863 |
+- if ((mode == MAC_COMM_MODE_RX) || (mode == MAC_COMM_MODE_RX_AND_TX)) |
1864 |
++ if (mode == MAC_COMM_MODE_RX || mode == MAC_COMM_MODE_RX_AND_TX) { |
1865 |
++ /* enable rx pcs */ |
1866 |
++ dsaf_set_dev_bit(drv, GMAC_PCS_RX_EN_REG, 0, 0); |
1867 |
+ dsaf_set_dev_bit(drv, GMAC_PORT_EN_REG, GMAC_PORT_RX_EN_B, 1); |
1868 |
++ } |
1869 |
+ } |
1870 |
+ |
1871 |
+ static void hns_gmac_disable(void *mac_drv, enum mac_commom_mode mode) |
1872 |
+@@ -79,11 +82,14 @@ static void hns_gmac_disable(void *mac_drv, enum mac_commom_mode mode) |
1873 |
+ struct mac_driver *drv = (struct mac_driver *)mac_drv; |
1874 |
+ |
1875 |
+ /*disable GE rX/tX */ |
1876 |
+- if ((mode == MAC_COMM_MODE_TX) || (mode == MAC_COMM_MODE_RX_AND_TX)) |
1877 |
++ if (mode == MAC_COMM_MODE_TX || mode == MAC_COMM_MODE_RX_AND_TX) |
1878 |
+ dsaf_set_dev_bit(drv, GMAC_PORT_EN_REG, GMAC_PORT_TX_EN_B, 0); |
1879 |
+ |
1880 |
+- if ((mode == MAC_COMM_MODE_RX) || (mode == MAC_COMM_MODE_RX_AND_TX)) |
1881 |
++ if (mode == MAC_COMM_MODE_RX || mode == MAC_COMM_MODE_RX_AND_TX) { |
1882 |
++ /* disable rx pcs */ |
1883 |
++ dsaf_set_dev_bit(drv, GMAC_PCS_RX_EN_REG, 0, 1); |
1884 |
+ dsaf_set_dev_bit(drv, GMAC_PORT_EN_REG, GMAC_PORT_RX_EN_B, 0); |
1885 |
++ } |
1886 |
+ } |
1887 |
+ |
1888 |
+ /* hns_gmac_get_en - get port enable |
1889 |
+diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c |
1890 |
+index 6ed6f142427e..cfdc92de9dc0 100644 |
1891 |
+--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c |
1892 |
++++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c |
1893 |
+@@ -778,6 +778,17 @@ static int hns_mac_register_phy(struct hns_mac_cb *mac_cb) |
1894 |
+ return rc; |
1895 |
+ } |
1896 |
+ |
1897 |
++static void hns_mac_remove_phydev(struct hns_mac_cb *mac_cb) |
1898 |
++{ |
1899 |
++ if (!to_acpi_device_node(mac_cb->fw_port) || !mac_cb->phy_dev) |
1900 |
++ return; |
1901 |
++ |
1902 |
++ phy_device_remove(mac_cb->phy_dev); |
1903 |
++ phy_device_free(mac_cb->phy_dev); |
1904 |
++ |
1905 |
++ mac_cb->phy_dev = NULL; |
1906 |
++} |
1907 |
++ |
1908 |
+ #define MAC_MEDIA_TYPE_MAX_LEN 16 |
1909 |
+ |
1910 |
+ static const struct { |
1911 |
+@@ -1117,7 +1128,11 @@ void hns_mac_uninit(struct dsaf_device *dsaf_dev) |
1912 |
+ int max_port_num = hns_mac_get_max_port_num(dsaf_dev); |
1913 |
+ |
1914 |
+ for (i = 0; i < max_port_num; i++) { |
1915 |
++ if (!dsaf_dev->mac_cb[i]) |
1916 |
++ continue; |
1917 |
++ |
1918 |
+ dsaf_dev->misc_op->cpld_reset_led(dsaf_dev->mac_cb[i]); |
1919 |
++ hns_mac_remove_phydev(dsaf_dev->mac_cb[i]); |
1920 |
+ dsaf_dev->mac_cb[i] = NULL; |
1921 |
+ } |
1922 |
+ } |
1923 |
+diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c |
1924 |
+index e557a4ef5996..3b9e74be5fbd 100644 |
1925 |
+--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c |
1926 |
++++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c |
1927 |
+@@ -934,6 +934,62 @@ static void hns_dsaf_tcam_mc_cfg( |
1928 |
+ spin_unlock_bh(&dsaf_dev->tcam_lock); |
1929 |
+ } |
1930 |
+ |
1931 |
++/** |
1932 |
++ * hns_dsaf_tcam_uc_cfg_vague - INT |
1933 |
++ * @dsaf_dev: dsa fabric device struct pointer |
1934 |
++ * @address, |
1935 |
++ * @ptbl_tcam_data, |
1936 |
++ */ |
1937 |
++static void hns_dsaf_tcam_uc_cfg_vague(struct dsaf_device *dsaf_dev, |
1938 |
++ u32 address, |
1939 |
++ struct dsaf_tbl_tcam_data *tcam_data, |
1940 |
++ struct dsaf_tbl_tcam_data *tcam_mask, |
1941 |
++ struct dsaf_tbl_tcam_ucast_cfg *tcam_uc) |
1942 |
++{ |
1943 |
++ spin_lock_bh(&dsaf_dev->tcam_lock); |
1944 |
++ hns_dsaf_tbl_tcam_addr_cfg(dsaf_dev, address); |
1945 |
++ hns_dsaf_tbl_tcam_data_cfg(dsaf_dev, tcam_data); |
1946 |
++ hns_dsaf_tbl_tcam_ucast_cfg(dsaf_dev, tcam_uc); |
1947 |
++ hns_dsaf_tbl_tcam_match_cfg(dsaf_dev, tcam_mask); |
1948 |
++ hns_dsaf_tbl_tcam_data_ucast_pul(dsaf_dev); |
1949 |
++ |
1950 |
++ /*Restore Match Data*/ |
1951 |
++ tcam_mask->tbl_tcam_data_high = 0xffffffff; |
1952 |
++ tcam_mask->tbl_tcam_data_low = 0xffffffff; |
1953 |
++ hns_dsaf_tbl_tcam_match_cfg(dsaf_dev, tcam_mask); |
1954 |
++ |
1955 |
++ spin_unlock_bh(&dsaf_dev->tcam_lock); |
1956 |
++} |
1957 |
++ |
1958 |
++/** |
1959 |
++ * hns_dsaf_tcam_mc_cfg_vague - INT |
1960 |
++ * @dsaf_dev: dsa fabric device struct pointer |
1961 |
++ * @address, |
1962 |
++ * @ptbl_tcam_data, |
1963 |
++ * @ptbl_tcam_mask |
1964 |
++ * @ptbl_tcam_mcast |
1965 |
++ */ |
1966 |
++static void hns_dsaf_tcam_mc_cfg_vague(struct dsaf_device *dsaf_dev, |
1967 |
++ u32 address, |
1968 |
++ struct dsaf_tbl_tcam_data *tcam_data, |
1969 |
++ struct dsaf_tbl_tcam_data *tcam_mask, |
1970 |
++ struct dsaf_tbl_tcam_mcast_cfg *tcam_mc) |
1971 |
++{ |
1972 |
++ spin_lock_bh(&dsaf_dev->tcam_lock); |
1973 |
++ hns_dsaf_tbl_tcam_addr_cfg(dsaf_dev, address); |
1974 |
++ hns_dsaf_tbl_tcam_data_cfg(dsaf_dev, tcam_data); |
1975 |
++ hns_dsaf_tbl_tcam_mcast_cfg(dsaf_dev, tcam_mc); |
1976 |
++ hns_dsaf_tbl_tcam_match_cfg(dsaf_dev, tcam_mask); |
1977 |
++ hns_dsaf_tbl_tcam_data_mcast_pul(dsaf_dev); |
1978 |
++ |
1979 |
++ /*Restore Match Data*/ |
1980 |
++ tcam_mask->tbl_tcam_data_high = 0xffffffff; |
1981 |
++ tcam_mask->tbl_tcam_data_low = 0xffffffff; |
1982 |
++ hns_dsaf_tbl_tcam_match_cfg(dsaf_dev, tcam_mask); |
1983 |
++ |
1984 |
++ spin_unlock_bh(&dsaf_dev->tcam_lock); |
1985 |
++} |
1986 |
++ |
1987 |
+ /** |
1988 |
+ * hns_dsaf_tcam_mc_invld - INT |
1989 |
+ * @dsaf_id: dsa fabric id |
1990 |
+@@ -1492,6 +1548,27 @@ static u16 hns_dsaf_find_empty_mac_entry(struct dsaf_device *dsaf_dev) |
1991 |
+ return DSAF_INVALID_ENTRY_IDX; |
1992 |
+ } |
1993 |
+ |
1994 |
++/** |
1995 |
++ * hns_dsaf_find_empty_mac_entry_reverse |
1996 |
++ * search dsa fabric soft empty-entry from the end |
1997 |
++ * @dsaf_dev: dsa fabric device struct pointer |
1998 |
++ */ |
1999 |
++static u16 hns_dsaf_find_empty_mac_entry_reverse(struct dsaf_device *dsaf_dev) |
2000 |
++{ |
2001 |
++ struct dsaf_drv_priv *priv = hns_dsaf_dev_priv(dsaf_dev); |
2002 |
++ struct dsaf_drv_soft_mac_tbl *soft_mac_entry; |
2003 |
++ int i; |
2004 |
++ |
2005 |
++ soft_mac_entry = priv->soft_mac_tbl + (DSAF_TCAM_SUM - 1); |
2006 |
++ for (i = (DSAF_TCAM_SUM - 1); i > 0; i--) { |
2007 |
++ /* search all entry from end to start.*/ |
2008 |
++ if (soft_mac_entry->index == DSAF_INVALID_ENTRY_IDX) |
2009 |
++ return i; |
2010 |
++ soft_mac_entry--; |
2011 |
++ } |
2012 |
++ return DSAF_INVALID_ENTRY_IDX; |
2013 |
++} |
2014 |
++ |
2015 |
+ /** |
2016 |
+ * hns_dsaf_set_mac_key - set mac key |
2017 |
+ * @dsaf_dev: dsa fabric device struct pointer |
2018 |
+@@ -2166,9 +2243,9 @@ void hns_dsaf_update_stats(struct dsaf_device *dsaf_dev, u32 node_num) |
2019 |
+ DSAF_INODE_LOCAL_ADDR_FALSE_NUM_0_REG + 0x80 * (u64)node_num); |
2020 |
+ |
2021 |
+ hw_stats->vlan_drop += dsaf_read_dev(dsaf_dev, |
2022 |
+- DSAF_INODE_SW_VLAN_TAG_DISC_0_REG + 0x80 * (u64)node_num); |
2023 |
++ DSAF_INODE_SW_VLAN_TAG_DISC_0_REG + 4 * (u64)node_num); |
2024 |
+ hw_stats->stp_drop += dsaf_read_dev(dsaf_dev, |
2025 |
+- DSAF_INODE_IN_DATA_STP_DISC_0_REG + 0x80 * (u64)node_num); |
2026 |
++ DSAF_INODE_IN_DATA_STP_DISC_0_REG + 4 * (u64)node_num); |
2027 |
+ |
2028 |
+ /* pfc pause frame statistics stored in dsaf inode*/ |
2029 |
+ if ((node_num < DSAF_SERVICE_NW_NUM) && !is_ver1) { |
2030 |
+@@ -2285,237 +2362,237 @@ void hns_dsaf_get_regs(struct dsaf_device *ddev, u32 port, void *data) |
2031 |
+ DSAF_INODE_BD_ORDER_STATUS_0_REG + j * 4); |
2032 |
+ p[223 + i] = dsaf_read_dev(ddev, |
2033 |
+ DSAF_INODE_SW_VLAN_TAG_DISC_0_REG + j * 4); |
2034 |
+- p[224 + i] = dsaf_read_dev(ddev, |
2035 |
++ p[226 + i] = dsaf_read_dev(ddev, |
2036 |
+ DSAF_INODE_IN_DATA_STP_DISC_0_REG + j * 4); |
2037 |
+ } |
2038 |
+ |
2039 |
+- p[227] = dsaf_read_dev(ddev, DSAF_INODE_GE_FC_EN_0_REG + port * 4); |
2040 |
++ p[229] = dsaf_read_dev(ddev, DSAF_INODE_GE_FC_EN_0_REG + port * 4); |
2041 |
+ |
2042 |
+ for (i = 0; i < DSAF_INODE_NUM / DSAF_COMM_CHN; i++) { |
2043 |
+ j = i * DSAF_COMM_CHN + port; |
2044 |
+- p[228 + i] = dsaf_read_dev(ddev, |
2045 |
++ p[230 + i] = dsaf_read_dev(ddev, |
2046 |
+ DSAF_INODE_VC0_IN_PKT_NUM_0_REG + j * 4); |
2047 |
+ } |
2048 |
+ |
2049 |
+- p[231] = dsaf_read_dev(ddev, |
2050 |
+- DSAF_INODE_VC1_IN_PKT_NUM_0_REG + port * 4); |
2051 |
++ p[233] = dsaf_read_dev(ddev, |
2052 |
++ DSAF_INODE_VC1_IN_PKT_NUM_0_REG + port * 0x80); |
2053 |
+ |
2054 |
+ /* dsaf inode registers */ |
2055 |
+ for (i = 0; i < HNS_DSAF_SBM_NUM(ddev) / DSAF_COMM_CHN; i++) { |
2056 |
+ j = i * DSAF_COMM_CHN + port; |
2057 |
+- p[232 + i] = dsaf_read_dev(ddev, |
2058 |
++ p[234 + i] = dsaf_read_dev(ddev, |
2059 |
+ DSAF_SBM_CFG_REG_0_REG + j * 0x80); |
2060 |
+- p[235 + i] = dsaf_read_dev(ddev, |
2061 |
++ p[237 + i] = dsaf_read_dev(ddev, |
2062 |
+ DSAF_SBM_BP_CFG_0_XGE_REG_0_REG + j * 0x80); |
2063 |
+- p[238 + i] = dsaf_read_dev(ddev, |
2064 |
++ p[240 + i] = dsaf_read_dev(ddev, |
2065 |
+ DSAF_SBM_BP_CFG_1_REG_0_REG + j * 0x80); |
2066 |
+- p[241 + i] = dsaf_read_dev(ddev, |
2067 |
++ p[243 + i] = dsaf_read_dev(ddev, |
2068 |
+ DSAF_SBM_BP_CFG_2_XGE_REG_0_REG + j * 0x80); |
2069 |
+- p[244 + i] = dsaf_read_dev(ddev, |
2070 |
++ p[246 + i] = dsaf_read_dev(ddev, |
2071 |
+ DSAF_SBM_FREE_CNT_0_0_REG + j * 0x80); |
2072 |
+- p[245 + i] = dsaf_read_dev(ddev, |
2073 |
++ p[249 + i] = dsaf_read_dev(ddev, |
2074 |
+ DSAF_SBM_FREE_CNT_1_0_REG + j * 0x80); |
2075 |
+- p[248 + i] = dsaf_read_dev(ddev, |
2076 |
++ p[252 + i] = dsaf_read_dev(ddev, |
2077 |
+ DSAF_SBM_BP_CNT_0_0_REG + j * 0x80); |
2078 |
+- p[251 + i] = dsaf_read_dev(ddev, |
2079 |
++ p[255 + i] = dsaf_read_dev(ddev, |
2080 |
+ DSAF_SBM_BP_CNT_1_0_REG + j * 0x80); |
2081 |
+- p[254 + i] = dsaf_read_dev(ddev, |
2082 |
++ p[258 + i] = dsaf_read_dev(ddev, |
2083 |
+ DSAF_SBM_BP_CNT_2_0_REG + j * 0x80); |
2084 |
+- p[257 + i] = dsaf_read_dev(ddev, |
2085 |
++ p[261 + i] = dsaf_read_dev(ddev, |
2086 |
+ DSAF_SBM_BP_CNT_3_0_REG + j * 0x80); |
2087 |
+- p[260 + i] = dsaf_read_dev(ddev, |
2088 |
++ p[264 + i] = dsaf_read_dev(ddev, |
2089 |
+ DSAF_SBM_INER_ST_0_REG + j * 0x80); |
2090 |
+- p[263 + i] = dsaf_read_dev(ddev, |
2091 |
++ p[267 + i] = dsaf_read_dev(ddev, |
2092 |
+ DSAF_SBM_MIB_REQ_FAILED_TC_0_REG + j * 0x80); |
2093 |
+- p[266 + i] = dsaf_read_dev(ddev, |
2094 |
++ p[270 + i] = dsaf_read_dev(ddev, |
2095 |
+ DSAF_SBM_LNK_INPORT_CNT_0_REG + j * 0x80); |
2096 |
+- p[269 + i] = dsaf_read_dev(ddev, |
2097 |
++ p[273 + i] = dsaf_read_dev(ddev, |
2098 |
+ DSAF_SBM_LNK_DROP_CNT_0_REG + j * 0x80); |
2099 |
+- p[272 + i] = dsaf_read_dev(ddev, |
2100 |
++ p[276 + i] = dsaf_read_dev(ddev, |
2101 |
+ DSAF_SBM_INF_OUTPORT_CNT_0_REG + j * 0x80); |
2102 |
+- p[275 + i] = dsaf_read_dev(ddev, |
2103 |
++ p[279 + i] = dsaf_read_dev(ddev, |
2104 |
+ DSAF_SBM_LNK_INPORT_TC0_CNT_0_REG + j * 0x80); |
2105 |
+- p[278 + i] = dsaf_read_dev(ddev, |
2106 |
++ p[282 + i] = dsaf_read_dev(ddev, |
2107 |
+ DSAF_SBM_LNK_INPORT_TC1_CNT_0_REG + j * 0x80); |
2108 |
+- p[281 + i] = dsaf_read_dev(ddev, |
2109 |
++ p[285 + i] = dsaf_read_dev(ddev, |
2110 |
+ DSAF_SBM_LNK_INPORT_TC2_CNT_0_REG + j * 0x80); |
2111 |
+- p[284 + i] = dsaf_read_dev(ddev, |
2112 |
++ p[288 + i] = dsaf_read_dev(ddev, |
2113 |
+ DSAF_SBM_LNK_INPORT_TC3_CNT_0_REG + j * 0x80); |
2114 |
+- p[287 + i] = dsaf_read_dev(ddev, |
2115 |
++ p[291 + i] = dsaf_read_dev(ddev, |
2116 |
+ DSAF_SBM_LNK_INPORT_TC4_CNT_0_REG + j * 0x80); |
2117 |
+- p[290 + i] = dsaf_read_dev(ddev, |
2118 |
++ p[294 + i] = dsaf_read_dev(ddev, |
2119 |
+ DSAF_SBM_LNK_INPORT_TC5_CNT_0_REG + j * 0x80); |
2120 |
+- p[293 + i] = dsaf_read_dev(ddev, |
2121 |
++ p[297 + i] = dsaf_read_dev(ddev, |
2122 |
+ DSAF_SBM_LNK_INPORT_TC6_CNT_0_REG + j * 0x80); |
2123 |
+- p[296 + i] = dsaf_read_dev(ddev, |
2124 |
++ p[300 + i] = dsaf_read_dev(ddev, |
2125 |
+ DSAF_SBM_LNK_INPORT_TC7_CNT_0_REG + j * 0x80); |
2126 |
+- p[299 + i] = dsaf_read_dev(ddev, |
2127 |
++ p[303 + i] = dsaf_read_dev(ddev, |
2128 |
+ DSAF_SBM_LNK_REQ_CNT_0_REG + j * 0x80); |
2129 |
+- p[302 + i] = dsaf_read_dev(ddev, |
2130 |
++ p[306 + i] = dsaf_read_dev(ddev, |
2131 |
+ DSAF_SBM_LNK_RELS_CNT_0_REG + j * 0x80); |
2132 |
+- p[305 + i] = dsaf_read_dev(ddev, |
2133 |
++ p[309 + i] = dsaf_read_dev(ddev, |
2134 |
+ DSAF_SBM_BP_CFG_3_REG_0_REG + j * 0x80); |
2135 |
+- p[308 + i] = dsaf_read_dev(ddev, |
2136 |
++ p[312 + i] = dsaf_read_dev(ddev, |
2137 |
+ DSAF_SBM_BP_CFG_4_REG_0_REG + j * 0x80); |
2138 |
+ } |
2139 |
+ |
2140 |
+ /* dsaf onode registers */ |
2141 |
+ for (i = 0; i < DSAF_XOD_NUM; i++) { |
2142 |
+- p[311 + i] = dsaf_read_dev(ddev, |
2143 |
++ p[315 + i] = dsaf_read_dev(ddev, |
2144 |
+ DSAF_XOD_ETS_TSA_TC0_TC3_CFG_0_REG + i * 0x90); |
2145 |
+- p[319 + i] = dsaf_read_dev(ddev, |
2146 |
++ p[323 + i] = dsaf_read_dev(ddev, |
2147 |
+ DSAF_XOD_ETS_TSA_TC4_TC7_CFG_0_REG + i * 0x90); |
2148 |
+- p[327 + i] = dsaf_read_dev(ddev, |
2149 |
++ p[331 + i] = dsaf_read_dev(ddev, |
2150 |
+ DSAF_XOD_ETS_BW_TC0_TC3_CFG_0_REG + i * 0x90); |
2151 |
+- p[335 + i] = dsaf_read_dev(ddev, |
2152 |
++ p[339 + i] = dsaf_read_dev(ddev, |
2153 |
+ DSAF_XOD_ETS_BW_TC4_TC7_CFG_0_REG + i * 0x90); |
2154 |
+- p[343 + i] = dsaf_read_dev(ddev, |
2155 |
++ p[347 + i] = dsaf_read_dev(ddev, |
2156 |
+ DSAF_XOD_ETS_BW_OFFSET_CFG_0_REG + i * 0x90); |
2157 |
+- p[351 + i] = dsaf_read_dev(ddev, |
2158 |
++ p[355 + i] = dsaf_read_dev(ddev, |
2159 |
+ DSAF_XOD_ETS_TOKEN_CFG_0_REG + i * 0x90); |
2160 |
+ } |
2161 |
+ |
2162 |
+- p[359] = dsaf_read_dev(ddev, DSAF_XOD_PFS_CFG_0_0_REG + port * 0x90); |
2163 |
+- p[360] = dsaf_read_dev(ddev, DSAF_XOD_PFS_CFG_1_0_REG + port * 0x90); |
2164 |
+- p[361] = dsaf_read_dev(ddev, DSAF_XOD_PFS_CFG_2_0_REG + port * 0x90); |
2165 |
++ p[363] = dsaf_read_dev(ddev, DSAF_XOD_PFS_CFG_0_0_REG + port * 0x90); |
2166 |
++ p[364] = dsaf_read_dev(ddev, DSAF_XOD_PFS_CFG_1_0_REG + port * 0x90); |
2167 |
++ p[365] = dsaf_read_dev(ddev, DSAF_XOD_PFS_CFG_2_0_REG + port * 0x90); |
2168 |
+ |
2169 |
+ for (i = 0; i < DSAF_XOD_BIG_NUM / DSAF_COMM_CHN; i++) { |
2170 |
+ j = i * DSAF_COMM_CHN + port; |
2171 |
+- p[362 + i] = dsaf_read_dev(ddev, |
2172 |
++ p[366 + i] = dsaf_read_dev(ddev, |
2173 |
+ DSAF_XOD_GNT_L_0_REG + j * 0x90); |
2174 |
+- p[365 + i] = dsaf_read_dev(ddev, |
2175 |
++ p[369 + i] = dsaf_read_dev(ddev, |
2176 |
+ DSAF_XOD_GNT_H_0_REG + j * 0x90); |
2177 |
+- p[368 + i] = dsaf_read_dev(ddev, |
2178 |
++ p[372 + i] = dsaf_read_dev(ddev, |
2179 |
+ DSAF_XOD_CONNECT_STATE_0_REG + j * 0x90); |
2180 |
+- p[371 + i] = dsaf_read_dev(ddev, |
2181 |
++ p[375 + i] = dsaf_read_dev(ddev, |
2182 |
+ DSAF_XOD_RCVPKT_CNT_0_REG + j * 0x90); |
2183 |
+- p[374 + i] = dsaf_read_dev(ddev, |
2184 |
++ p[378 + i] = dsaf_read_dev(ddev, |
2185 |
+ DSAF_XOD_RCVTC0_CNT_0_REG + j * 0x90); |
2186 |
+- p[377 + i] = dsaf_read_dev(ddev, |
2187 |
++ p[381 + i] = dsaf_read_dev(ddev, |
2188 |
+ DSAF_XOD_RCVTC1_CNT_0_REG + j * 0x90); |
2189 |
+- p[380 + i] = dsaf_read_dev(ddev, |
2190 |
++ p[384 + i] = dsaf_read_dev(ddev, |
2191 |
+ DSAF_XOD_RCVTC2_CNT_0_REG + j * 0x90); |
2192 |
+- p[383 + i] = dsaf_read_dev(ddev, |
2193 |
++ p[387 + i] = dsaf_read_dev(ddev, |
2194 |
+ DSAF_XOD_RCVTC3_CNT_0_REG + j * 0x90); |
2195 |
+- p[386 + i] = dsaf_read_dev(ddev, |
2196 |
++ p[390 + i] = dsaf_read_dev(ddev, |
2197 |
+ DSAF_XOD_RCVVC0_CNT_0_REG + j * 0x90); |
2198 |
+- p[389 + i] = dsaf_read_dev(ddev, |
2199 |
++ p[393 + i] = dsaf_read_dev(ddev, |
2200 |
+ DSAF_XOD_RCVVC1_CNT_0_REG + j * 0x90); |
2201 |
+ } |
2202 |
+ |
2203 |
+- p[392] = dsaf_read_dev(ddev, |
2204 |
++ p[396] = dsaf_read_dev(ddev, |
2205 |
+ DSAF_XOD_XGE_RCVIN0_CNT_0_REG + port * 0x90); |
2206 |
+- p[393] = dsaf_read_dev(ddev, |
2207 |
++ p[397] = dsaf_read_dev(ddev, |
2208 |
+ DSAF_XOD_XGE_RCVIN1_CNT_0_REG + port * 0x90); |
2209 |
+- p[394] = dsaf_read_dev(ddev, |
2210 |
++ p[398] = dsaf_read_dev(ddev, |
2211 |
+ DSAF_XOD_XGE_RCVIN2_CNT_0_REG + port * 0x90); |
2212 |
+- p[395] = dsaf_read_dev(ddev, |
2213 |
++ p[399] = dsaf_read_dev(ddev, |
2214 |
+ DSAF_XOD_XGE_RCVIN3_CNT_0_REG + port * 0x90); |
2215 |
+- p[396] = dsaf_read_dev(ddev, |
2216 |
++ p[400] = dsaf_read_dev(ddev, |
2217 |
+ DSAF_XOD_XGE_RCVIN4_CNT_0_REG + port * 0x90); |
2218 |
+- p[397] = dsaf_read_dev(ddev, |
2219 |
++ p[401] = dsaf_read_dev(ddev, |
2220 |
+ DSAF_XOD_XGE_RCVIN5_CNT_0_REG + port * 0x90); |
2221 |
+- p[398] = dsaf_read_dev(ddev, |
2222 |
++ p[402] = dsaf_read_dev(ddev, |
2223 |
+ DSAF_XOD_XGE_RCVIN6_CNT_0_REG + port * 0x90); |
2224 |
+- p[399] = dsaf_read_dev(ddev, |
2225 |
++ p[403] = dsaf_read_dev(ddev, |
2226 |
+ DSAF_XOD_XGE_RCVIN7_CNT_0_REG + port * 0x90); |
2227 |
+- p[400] = dsaf_read_dev(ddev, |
2228 |
++ p[404] = dsaf_read_dev(ddev, |
2229 |
+ DSAF_XOD_PPE_RCVIN0_CNT_0_REG + port * 0x90); |
2230 |
+- p[401] = dsaf_read_dev(ddev, |
2231 |
++ p[405] = dsaf_read_dev(ddev, |
2232 |
+ DSAF_XOD_PPE_RCVIN1_CNT_0_REG + port * 0x90); |
2233 |
+- p[402] = dsaf_read_dev(ddev, |
2234 |
++ p[406] = dsaf_read_dev(ddev, |
2235 |
+ DSAF_XOD_ROCEE_RCVIN0_CNT_0_REG + port * 0x90); |
2236 |
+- p[403] = dsaf_read_dev(ddev, |
2237 |
++ p[407] = dsaf_read_dev(ddev, |
2238 |
+ DSAF_XOD_ROCEE_RCVIN1_CNT_0_REG + port * 0x90); |
2239 |
+- p[404] = dsaf_read_dev(ddev, |
2240 |
++ p[408] = dsaf_read_dev(ddev, |
2241 |
+ DSAF_XOD_FIFO_STATUS_0_REG + port * 0x90); |
2242 |
+ |
2243 |
+ /* dsaf voq registers */ |
2244 |
+ for (i = 0; i < DSAF_VOQ_NUM / DSAF_COMM_CHN; i++) { |
2245 |
+ j = (i * DSAF_COMM_CHN + port) * 0x90; |
2246 |
+- p[405 + i] = dsaf_read_dev(ddev, |
2247 |
++ p[409 + i] = dsaf_read_dev(ddev, |
2248 |
+ DSAF_VOQ_ECC_INVERT_EN_0_REG + j); |
2249 |
+- p[408 + i] = dsaf_read_dev(ddev, |
2250 |
++ p[412 + i] = dsaf_read_dev(ddev, |
2251 |
+ DSAF_VOQ_SRAM_PKT_NUM_0_REG + j); |
2252 |
+- p[411 + i] = dsaf_read_dev(ddev, DSAF_VOQ_IN_PKT_NUM_0_REG + j); |
2253 |
+- p[414 + i] = dsaf_read_dev(ddev, |
2254 |
++ p[415 + i] = dsaf_read_dev(ddev, DSAF_VOQ_IN_PKT_NUM_0_REG + j); |
2255 |
++ p[418 + i] = dsaf_read_dev(ddev, |
2256 |
+ DSAF_VOQ_OUT_PKT_NUM_0_REG + j); |
2257 |
+- p[417 + i] = dsaf_read_dev(ddev, |
2258 |
++ p[421 + i] = dsaf_read_dev(ddev, |
2259 |
+ DSAF_VOQ_ECC_ERR_ADDR_0_REG + j); |
2260 |
+- p[420 + i] = dsaf_read_dev(ddev, DSAF_VOQ_BP_STATUS_0_REG + j); |
2261 |
+- p[423 + i] = dsaf_read_dev(ddev, DSAF_VOQ_SPUP_IDLE_0_REG + j); |
2262 |
+- p[426 + i] = dsaf_read_dev(ddev, |
2263 |
++ p[424 + i] = dsaf_read_dev(ddev, DSAF_VOQ_BP_STATUS_0_REG + j); |
2264 |
++ p[427 + i] = dsaf_read_dev(ddev, DSAF_VOQ_SPUP_IDLE_0_REG + j); |
2265 |
++ p[430 + i] = dsaf_read_dev(ddev, |
2266 |
+ DSAF_VOQ_XGE_XOD_REQ_0_0_REG + j); |
2267 |
+- p[429 + i] = dsaf_read_dev(ddev, |
2268 |
++ p[433 + i] = dsaf_read_dev(ddev, |
2269 |
+ DSAF_VOQ_XGE_XOD_REQ_1_0_REG + j); |
2270 |
+- p[432 + i] = dsaf_read_dev(ddev, |
2271 |
++ p[436 + i] = dsaf_read_dev(ddev, |
2272 |
+ DSAF_VOQ_PPE_XOD_REQ_0_REG + j); |
2273 |
+- p[435 + i] = dsaf_read_dev(ddev, |
2274 |
++ p[439 + i] = dsaf_read_dev(ddev, |
2275 |
+ DSAF_VOQ_ROCEE_XOD_REQ_0_REG + j); |
2276 |
+- p[438 + i] = dsaf_read_dev(ddev, |
2277 |
++ p[442 + i] = dsaf_read_dev(ddev, |
2278 |
+ DSAF_VOQ_BP_ALL_THRD_0_REG + j); |
2279 |
+ } |
2280 |
+ |
2281 |
+ /* dsaf tbl registers */ |
2282 |
+- p[441] = dsaf_read_dev(ddev, DSAF_TBL_CTRL_0_REG); |
2283 |
+- p[442] = dsaf_read_dev(ddev, DSAF_TBL_INT_MSK_0_REG); |
2284 |
+- p[443] = dsaf_read_dev(ddev, DSAF_TBL_INT_SRC_0_REG); |
2285 |
+- p[444] = dsaf_read_dev(ddev, DSAF_TBL_INT_STS_0_REG); |
2286 |
+- p[445] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_ADDR_0_REG); |
2287 |
+- p[446] = dsaf_read_dev(ddev, DSAF_TBL_LINE_ADDR_0_REG); |
2288 |
+- p[447] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_HIGH_0_REG); |
2289 |
+- p[448] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_LOW_0_REG); |
2290 |
+- p[449] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_MCAST_CFG_4_0_REG); |
2291 |
+- p[450] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_MCAST_CFG_3_0_REG); |
2292 |
+- p[451] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_MCAST_CFG_2_0_REG); |
2293 |
+- p[452] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_MCAST_CFG_1_0_REG); |
2294 |
+- p[453] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_MCAST_CFG_0_0_REG); |
2295 |
+- p[454] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_UCAST_CFG_0_REG); |
2296 |
+- p[455] = dsaf_read_dev(ddev, DSAF_TBL_LIN_CFG_0_REG); |
2297 |
+- p[456] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_RDATA_HIGH_0_REG); |
2298 |
+- p[457] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_RDATA_LOW_0_REG); |
2299 |
+- p[458] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_RAM_RDATA4_0_REG); |
2300 |
+- p[459] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_RAM_RDATA3_0_REG); |
2301 |
+- p[460] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_RAM_RDATA2_0_REG); |
2302 |
+- p[461] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_RAM_RDATA1_0_REG); |
2303 |
+- p[462] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_RAM_RDATA0_0_REG); |
2304 |
+- p[463] = dsaf_read_dev(ddev, DSAF_TBL_LIN_RDATA_0_REG); |
2305 |
++ p[445] = dsaf_read_dev(ddev, DSAF_TBL_CTRL_0_REG); |
2306 |
++ p[446] = dsaf_read_dev(ddev, DSAF_TBL_INT_MSK_0_REG); |
2307 |
++ p[447] = dsaf_read_dev(ddev, DSAF_TBL_INT_SRC_0_REG); |
2308 |
++ p[448] = dsaf_read_dev(ddev, DSAF_TBL_INT_STS_0_REG); |
2309 |
++ p[449] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_ADDR_0_REG); |
2310 |
++ p[450] = dsaf_read_dev(ddev, DSAF_TBL_LINE_ADDR_0_REG); |
2311 |
++ p[451] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_HIGH_0_REG); |
2312 |
++ p[452] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_LOW_0_REG); |
2313 |
++ p[453] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_MCAST_CFG_4_0_REG); |
2314 |
++ p[454] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_MCAST_CFG_3_0_REG); |
2315 |
++ p[455] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_MCAST_CFG_2_0_REG); |
2316 |
++ p[456] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_MCAST_CFG_1_0_REG); |
2317 |
++ p[457] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_MCAST_CFG_0_0_REG); |
2318 |
++ p[458] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_UCAST_CFG_0_REG); |
2319 |
++ p[459] = dsaf_read_dev(ddev, DSAF_TBL_LIN_CFG_0_REG); |
2320 |
++ p[460] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_RDATA_HIGH_0_REG); |
2321 |
++ p[461] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_RDATA_LOW_0_REG); |
2322 |
++ p[462] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_RAM_RDATA4_0_REG); |
2323 |
++ p[463] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_RAM_RDATA3_0_REG); |
2324 |
++ p[464] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_RAM_RDATA2_0_REG); |
2325 |
++ p[465] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_RAM_RDATA1_0_REG); |
2326 |
++ p[466] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_RAM_RDATA0_0_REG); |
2327 |
++ p[467] = dsaf_read_dev(ddev, DSAF_TBL_LIN_RDATA_0_REG); |
2328 |
+ |
2329 |
+ for (i = 0; i < DSAF_SW_PORT_NUM; i++) { |
2330 |
+ j = i * 0x8; |
2331 |
+- p[464 + 2 * i] = dsaf_read_dev(ddev, |
2332 |
++ p[468 + 2 * i] = dsaf_read_dev(ddev, |
2333 |
+ DSAF_TBL_DA0_MIS_INFO1_0_REG + j); |
2334 |
+- p[465 + 2 * i] = dsaf_read_dev(ddev, |
2335 |
++ p[469 + 2 * i] = dsaf_read_dev(ddev, |
2336 |
+ DSAF_TBL_DA0_MIS_INFO0_0_REG + j); |
2337 |
+ } |
2338 |
+ |
2339 |
+- p[480] = dsaf_read_dev(ddev, DSAF_TBL_SA_MIS_INFO2_0_REG); |
2340 |
+- p[481] = dsaf_read_dev(ddev, DSAF_TBL_SA_MIS_INFO1_0_REG); |
2341 |
+- p[482] = dsaf_read_dev(ddev, DSAF_TBL_SA_MIS_INFO0_0_REG); |
2342 |
+- p[483] = dsaf_read_dev(ddev, DSAF_TBL_PUL_0_REG); |
2343 |
+- p[484] = dsaf_read_dev(ddev, DSAF_TBL_OLD_RSLT_0_REG); |
2344 |
+- p[485] = dsaf_read_dev(ddev, DSAF_TBL_OLD_SCAN_VAL_0_REG); |
2345 |
+- p[486] = dsaf_read_dev(ddev, DSAF_TBL_DFX_CTRL_0_REG); |
2346 |
+- p[487] = dsaf_read_dev(ddev, DSAF_TBL_DFX_STAT_0_REG); |
2347 |
+- p[488] = dsaf_read_dev(ddev, DSAF_TBL_DFX_STAT_2_0_REG); |
2348 |
+- p[489] = dsaf_read_dev(ddev, DSAF_TBL_LKUP_NUM_I_0_REG); |
2349 |
+- p[490] = dsaf_read_dev(ddev, DSAF_TBL_LKUP_NUM_O_0_REG); |
2350 |
+- p[491] = dsaf_read_dev(ddev, DSAF_TBL_UCAST_BCAST_MIS_INFO_0_0_REG); |
2351 |
++ p[484] = dsaf_read_dev(ddev, DSAF_TBL_SA_MIS_INFO2_0_REG); |
2352 |
++ p[485] = dsaf_read_dev(ddev, DSAF_TBL_SA_MIS_INFO1_0_REG); |
2353 |
++ p[486] = dsaf_read_dev(ddev, DSAF_TBL_SA_MIS_INFO0_0_REG); |
2354 |
++ p[487] = dsaf_read_dev(ddev, DSAF_TBL_PUL_0_REG); |
2355 |
++ p[488] = dsaf_read_dev(ddev, DSAF_TBL_OLD_RSLT_0_REG); |
2356 |
++ p[489] = dsaf_read_dev(ddev, DSAF_TBL_OLD_SCAN_VAL_0_REG); |
2357 |
++ p[490] = dsaf_read_dev(ddev, DSAF_TBL_DFX_CTRL_0_REG); |
2358 |
++ p[491] = dsaf_read_dev(ddev, DSAF_TBL_DFX_STAT_0_REG); |
2359 |
++ p[492] = dsaf_read_dev(ddev, DSAF_TBL_DFX_STAT_2_0_REG); |
2360 |
++ p[493] = dsaf_read_dev(ddev, DSAF_TBL_LKUP_NUM_I_0_REG); |
2361 |
++ p[494] = dsaf_read_dev(ddev, DSAF_TBL_LKUP_NUM_O_0_REG); |
2362 |
++ p[495] = dsaf_read_dev(ddev, DSAF_TBL_UCAST_BCAST_MIS_INFO_0_0_REG); |
2363 |
+ |
2364 |
+ /* dsaf other registers */ |
2365 |
+- p[492] = dsaf_read_dev(ddev, DSAF_INODE_FIFO_WL_0_REG + port * 0x4); |
2366 |
+- p[493] = dsaf_read_dev(ddev, DSAF_ONODE_FIFO_WL_0_REG + port * 0x4); |
2367 |
+- p[494] = dsaf_read_dev(ddev, DSAF_XGE_GE_WORK_MODE_0_REG + port * 0x4); |
2368 |
+- p[495] = dsaf_read_dev(ddev, |
2369 |
++ p[496] = dsaf_read_dev(ddev, DSAF_INODE_FIFO_WL_0_REG + port * 0x4); |
2370 |
++ p[497] = dsaf_read_dev(ddev, DSAF_ONODE_FIFO_WL_0_REG + port * 0x4); |
2371 |
++ p[498] = dsaf_read_dev(ddev, DSAF_XGE_GE_WORK_MODE_0_REG + port * 0x4); |
2372 |
++ p[499] = dsaf_read_dev(ddev, |
2373 |
+ DSAF_XGE_APP_RX_LINK_UP_0_REG + port * 0x4); |
2374 |
+- p[496] = dsaf_read_dev(ddev, DSAF_NETPORT_CTRL_SIG_0_REG + port * 0x4); |
2375 |
+- p[497] = dsaf_read_dev(ddev, DSAF_XGE_CTRL_SIG_CFG_0_REG + port * 0x4); |
2376 |
++ p[500] = dsaf_read_dev(ddev, DSAF_NETPORT_CTRL_SIG_0_REG + port * 0x4); |
2377 |
++ p[501] = dsaf_read_dev(ddev, DSAF_XGE_CTRL_SIG_CFG_0_REG + port * 0x4); |
2378 |
+ |
2379 |
+ if (!is_ver1) |
2380 |
+- p[498] = dsaf_read_dev(ddev, DSAF_PAUSE_CFG_REG + port * 0x4); |
2381 |
++ p[502] = dsaf_read_dev(ddev, DSAF_PAUSE_CFG_REG + port * 0x4); |
2382 |
+ |
2383 |
+ /* mark end of dsaf regs */ |
2384 |
+- for (i = 499; i < 504; i++) |
2385 |
++ for (i = 503; i < 504; i++) |
2386 |
+ p[i] = 0xdddddddd; |
2387 |
+ } |
2388 |
+ |
2389 |
+@@ -2673,58 +2750,156 @@ int hns_dsaf_get_regs_count(void) |
2390 |
+ return DSAF_DUMP_REGS_NUM; |
2391 |
+ } |
2392 |
+ |
2393 |
+-/* Reserve the last TCAM entry for promisc support */ |
2394 |
+-#define dsaf_promisc_tcam_entry(port) \ |
2395 |
+- (DSAF_TCAM_SUM - DSAFV2_MAC_FUZZY_TCAM_NUM + (port)) |
2396 |
+-void hns_dsaf_set_promisc_tcam(struct dsaf_device *dsaf_dev, |
2397 |
+- u32 port, bool enable) |
2398 |
++static void set_promisc_tcam_enable(struct dsaf_device *dsaf_dev, u32 port) |
2399 |
+ { |
2400 |
++ struct dsaf_tbl_tcam_ucast_cfg tbl_tcam_ucast = {0, 1, 0, 0, 0x80}; |
2401 |
++ struct dsaf_tbl_tcam_data tbl_tcam_data_mc = {0x01000000, port}; |
2402 |
++ struct dsaf_tbl_tcam_data tbl_tcam_mask_uc = {0x01000000, 0xf}; |
2403 |
++ struct dsaf_tbl_tcam_mcast_cfg tbl_tcam_mcast = {0, 0, {0} }; |
2404 |
+ struct dsaf_drv_priv *priv = hns_dsaf_dev_priv(dsaf_dev); |
2405 |
+- struct dsaf_drv_soft_mac_tbl *soft_mac_entry = priv->soft_mac_tbl; |
2406 |
+- u16 entry_index; |
2407 |
+- struct dsaf_drv_tbl_tcam_key tbl_tcam_data, tbl_tcam_mask; |
2408 |
+- struct dsaf_tbl_tcam_mcast_cfg mac_data = {0}; |
2409 |
++ struct dsaf_tbl_tcam_data tbl_tcam_data_uc = {0, port}; |
2410 |
++ struct dsaf_drv_mac_single_dest_entry mask_entry; |
2411 |
++ struct dsaf_drv_tbl_tcam_key temp_key, mask_key; |
2412 |
++ struct dsaf_drv_soft_mac_tbl *soft_mac_entry; |
2413 |
++ u16 entry_index = DSAF_INVALID_ENTRY_IDX; |
2414 |
++ struct dsaf_drv_tbl_tcam_key mac_key; |
2415 |
++ struct hns_mac_cb *mac_cb; |
2416 |
++ u8 addr[ETH_ALEN] = {0}; |
2417 |
++ u8 port_num; |
2418 |
++ u16 mskid; |
2419 |
++ |
2420 |
++ /* promisc use vague table match with vlanid = 0 & macaddr = 0 */ |
2421 |
++ hns_dsaf_set_mac_key(dsaf_dev, &mac_key, 0x00, port, addr); |
2422 |
++ entry_index = hns_dsaf_find_soft_mac_entry(dsaf_dev, &mac_key); |
2423 |
++ if (entry_index != DSAF_INVALID_ENTRY_IDX) |
2424 |
++ return; |
2425 |
++ |
2426 |
++ /* put promisc tcam entry in the end. */ |
2427 |
++ /* 1. set promisc unicast vague tcam entry. */ |
2428 |
++ entry_index = hns_dsaf_find_empty_mac_entry_reverse(dsaf_dev); |
2429 |
++ if (entry_index == DSAF_INVALID_ENTRY_IDX) { |
2430 |
++ dev_err(dsaf_dev->dev, |
2431 |
++ "enable uc promisc failed (port:%#x)\n", |
2432 |
++ port); |
2433 |
++ return; |
2434 |
++ } |
2435 |
++ |
2436 |
++ mac_cb = dsaf_dev->mac_cb[port]; |
2437 |
++ (void)hns_mac_get_inner_port_num(mac_cb, 0, &port_num); |
2438 |
++ tbl_tcam_ucast.tbl_ucast_out_port = port_num; |
2439 |
+ |
2440 |
+- if ((AE_IS_VER1(dsaf_dev->dsaf_ver)) || HNS_DSAF_IS_DEBUG(dsaf_dev)) |
2441 |
++ /* config uc vague table */ |
2442 |
++ hns_dsaf_tcam_uc_cfg_vague(dsaf_dev, entry_index, &tbl_tcam_data_uc, |
2443 |
++ &tbl_tcam_mask_uc, &tbl_tcam_ucast); |
2444 |
++ |
2445 |
++ /* update software entry */ |
2446 |
++ soft_mac_entry = priv->soft_mac_tbl; |
2447 |
++ soft_mac_entry += entry_index; |
2448 |
++ soft_mac_entry->index = entry_index; |
2449 |
++ soft_mac_entry->tcam_key.high.val = mac_key.high.val; |
2450 |
++ soft_mac_entry->tcam_key.low.val = mac_key.low.val; |
2451 |
++ /* step back to the START for mc. */ |
2452 |
++ soft_mac_entry = priv->soft_mac_tbl; |
2453 |
++ |
2454 |
++ /* 2. set promisc multicast vague tcam entry. */ |
2455 |
++ entry_index = hns_dsaf_find_empty_mac_entry_reverse(dsaf_dev); |
2456 |
++ if (entry_index == DSAF_INVALID_ENTRY_IDX) { |
2457 |
++ dev_err(dsaf_dev->dev, |
2458 |
++ "enable mc promisc failed (port:%#x)\n", |
2459 |
++ port); |
2460 |
+ return; |
2461 |
++ } |
2462 |
++ |
2463 |
++ memset(&mask_entry, 0x0, sizeof(mask_entry)); |
2464 |
++ memset(&mask_key, 0x0, sizeof(mask_key)); |
2465 |
++ memset(&temp_key, 0x0, sizeof(temp_key)); |
2466 |
++ mask_entry.addr[0] = 0x01; |
2467 |
++ hns_dsaf_set_mac_key(dsaf_dev, &mask_key, mask_entry.in_vlan_id, |
2468 |
++ port, mask_entry.addr); |
2469 |
++ tbl_tcam_mcast.tbl_mcast_item_vld = 1; |
2470 |
++ tbl_tcam_mcast.tbl_mcast_old_en = 0; |
2471 |
+ |
2472 |
+- /* find the tcam entry index for promisc */ |
2473 |
+- entry_index = dsaf_promisc_tcam_entry(port); |
2474 |
+- |
2475 |
+- memset(&tbl_tcam_data, 0, sizeof(tbl_tcam_data)); |
2476 |
+- memset(&tbl_tcam_mask, 0, sizeof(tbl_tcam_mask)); |
2477 |
+- |
2478 |
+- /* config key mask */ |
2479 |
+- if (enable) { |
2480 |
+- dsaf_set_field(tbl_tcam_data.low.bits.port_vlan, |
2481 |
+- DSAF_TBL_TCAM_KEY_PORT_M, |
2482 |
+- DSAF_TBL_TCAM_KEY_PORT_S, port); |
2483 |
+- dsaf_set_field(tbl_tcam_mask.low.bits.port_vlan, |
2484 |
+- DSAF_TBL_TCAM_KEY_PORT_M, |
2485 |
+- DSAF_TBL_TCAM_KEY_PORT_S, 0xf); |
2486 |
+- |
2487 |
+- /* SUB_QID */ |
2488 |
+- dsaf_set_bit(mac_data.tbl_mcast_port_msk[0], |
2489 |
+- DSAF_SERVICE_NW_NUM, true); |
2490 |
+- mac_data.tbl_mcast_item_vld = true; /* item_vld bit */ |
2491 |
++ if (port < DSAF_SERVICE_NW_NUM) { |
2492 |
++ mskid = port; |
2493 |
++ } else if (port >= DSAF_BASE_INNER_PORT_NUM) { |
2494 |
++ mskid = port - DSAF_BASE_INNER_PORT_NUM + DSAF_SERVICE_NW_NUM; |
2495 |
+ } else { |
2496 |
+- mac_data.tbl_mcast_item_vld = false; /* item_vld bit */ |
2497 |
++ dev_err(dsaf_dev->dev, "%s,pnum(%d)error,key(%#x:%#x)\n", |
2498 |
++ dsaf_dev->ae_dev.name, port, |
2499 |
++ mask_key.high.val, mask_key.low.val); |
2500 |
++ return; |
2501 |
+ } |
2502 |
+ |
2503 |
+- dev_dbg(dsaf_dev->dev, |
2504 |
+- "set_promisc_entry, %s Mac key(%#x:%#x) entry_index%d\n", |
2505 |
+- dsaf_dev->ae_dev.name, tbl_tcam_data.high.val, |
2506 |
+- tbl_tcam_data.low.val, entry_index); |
2507 |
++ dsaf_set_bit(tbl_tcam_mcast.tbl_mcast_port_msk[mskid / 32], |
2508 |
++ mskid % 32, 1); |
2509 |
++ memcpy(&temp_key, &mask_key, sizeof(mask_key)); |
2510 |
++ hns_dsaf_tcam_mc_cfg_vague(dsaf_dev, entry_index, &tbl_tcam_data_mc, |
2511 |
++ (struct dsaf_tbl_tcam_data *)(&mask_key), |
2512 |
++ &tbl_tcam_mcast); |
2513 |
++ |
2514 |
++ /* update software entry */ |
2515 |
++ soft_mac_entry += entry_index; |
2516 |
++ soft_mac_entry->index = entry_index; |
2517 |
++ soft_mac_entry->tcam_key.high.val = temp_key.high.val; |
2518 |
++ soft_mac_entry->tcam_key.low.val = temp_key.low.val; |
2519 |
++} |
2520 |
+ |
2521 |
+- /* config promisc entry with mask */ |
2522 |
+- hns_dsaf_tcam_mc_cfg(dsaf_dev, entry_index, |
2523 |
+- (struct dsaf_tbl_tcam_data *)&tbl_tcam_data, |
2524 |
+- (struct dsaf_tbl_tcam_data *)&tbl_tcam_mask, |
2525 |
+- &mac_data); |
2526 |
++static void set_promisc_tcam_disable(struct dsaf_device *dsaf_dev, u32 port) |
2527 |
++{ |
2528 |
++ struct dsaf_tbl_tcam_data tbl_tcam_data_mc = {0x01000000, port}; |
2529 |
++ struct dsaf_tbl_tcam_ucast_cfg tbl_tcam_ucast = {0, 0, 0, 0, 0}; |
2530 |
++ struct dsaf_tbl_tcam_mcast_cfg tbl_tcam_mcast = {0, 0, {0} }; |
2531 |
++ struct dsaf_drv_priv *priv = hns_dsaf_dev_priv(dsaf_dev); |
2532 |
++ struct dsaf_tbl_tcam_data tbl_tcam_data_uc = {0, 0}; |
2533 |
++ struct dsaf_tbl_tcam_data tbl_tcam_mask = {0, 0}; |
2534 |
++ struct dsaf_drv_soft_mac_tbl *soft_mac_entry; |
2535 |
++ u16 entry_index = DSAF_INVALID_ENTRY_IDX; |
2536 |
++ struct dsaf_drv_tbl_tcam_key mac_key; |
2537 |
++ u8 addr[ETH_ALEN] = {0}; |
2538 |
+ |
2539 |
+- /* config software entry */ |
2540 |
++ /* 1. delete uc vague tcam entry. */ |
2541 |
++ /* promisc use vague table match with vlanid = 0 & macaddr = 0 */ |
2542 |
++ hns_dsaf_set_mac_key(dsaf_dev, &mac_key, 0x00, port, addr); |
2543 |
++ entry_index = hns_dsaf_find_soft_mac_entry(dsaf_dev, &mac_key); |
2544 |
++ |
2545 |
++ if (entry_index == DSAF_INVALID_ENTRY_IDX) |
2546 |
++ return; |
2547 |
++ |
2548 |
++ /* config uc vague table */ |
2549 |
++ hns_dsaf_tcam_uc_cfg_vague(dsaf_dev, entry_index, &tbl_tcam_data_uc, |
2550 |
++ &tbl_tcam_mask, &tbl_tcam_ucast); |
2551 |
++ /* update soft management table. */ |
2552 |
++ soft_mac_entry = priv->soft_mac_tbl; |
2553 |
++ soft_mac_entry += entry_index; |
2554 |
++ soft_mac_entry->index = DSAF_INVALID_ENTRY_IDX; |
2555 |
++ /* step back to the START for mc. */ |
2556 |
++ soft_mac_entry = priv->soft_mac_tbl; |
2557 |
++ |
2558 |
++ /* 2. delete mc vague tcam entry. */ |
2559 |
++ addr[0] = 0x01; |
2560 |
++ memset(&mac_key, 0x0, sizeof(mac_key)); |
2561 |
++ hns_dsaf_set_mac_key(dsaf_dev, &mac_key, 0x00, port, addr); |
2562 |
++ entry_index = hns_dsaf_find_soft_mac_entry(dsaf_dev, &mac_key); |
2563 |
++ |
2564 |
++ if (entry_index == DSAF_INVALID_ENTRY_IDX) |
2565 |
++ return; |
2566 |
++ |
2567 |
++ /* config mc vague table */ |
2568 |
++ hns_dsaf_tcam_mc_cfg_vague(dsaf_dev, entry_index, &tbl_tcam_data_mc, |
2569 |
++ &tbl_tcam_mask, &tbl_tcam_mcast); |
2570 |
++ /* update soft management table. */ |
2571 |
+ soft_mac_entry += entry_index; |
2572 |
+- soft_mac_entry->index = enable ? entry_index : DSAF_INVALID_ENTRY_IDX; |
2573 |
++ soft_mac_entry->index = DSAF_INVALID_ENTRY_IDX; |
2574 |
++} |
2575 |
++ |
2576 |
++/* Reserve the last TCAM entry for promisc support */ |
2577 |
++void hns_dsaf_set_promisc_tcam(struct dsaf_device *dsaf_dev, |
2578 |
++ u32 port, bool enable) |
2579 |
++{ |
2580 |
++ if (enable) |
2581 |
++ set_promisc_tcam_enable(dsaf_dev, port); |
2582 |
++ else |
2583 |
++ set_promisc_tcam_disable(dsaf_dev, port); |
2584 |
+ } |
2585 |
+ |
2586 |
+ int hns_dsaf_wait_pkt_clean(struct dsaf_device *dsaf_dev, int port) |
2587 |
+diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h |
2588 |
+index 74d935d82cbc..b9733b0b8482 100644 |
2589 |
+--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h |
2590 |
++++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h |
2591 |
+@@ -176,7 +176,7 @@ |
2592 |
+ #define DSAF_INODE_IN_DATA_STP_DISC_0_REG 0x1A50 |
2593 |
+ #define DSAF_INODE_GE_FC_EN_0_REG 0x1B00 |
2594 |
+ #define DSAF_INODE_VC0_IN_PKT_NUM_0_REG 0x1B50 |
2595 |
+-#define DSAF_INODE_VC1_IN_PKT_NUM_0_REG 0x1C00 |
2596 |
++#define DSAF_INODE_VC1_IN_PKT_NUM_0_REG 0x103C |
2597 |
+ #define DSAF_INODE_IN_PRIO_PAUSE_BASE_REG 0x1C00 |
2598 |
+ #define DSAF_INODE_IN_PRIO_PAUSE_BASE_OFFSET 0x100 |
2599 |
+ #define DSAF_INODE_IN_PRIO_PAUSE_OFFSET 0x50 |
2600 |
+@@ -404,11 +404,11 @@ |
2601 |
+ #define RCB_ECC_ERR_ADDR4_REG 0x460 |
2602 |
+ #define RCB_ECC_ERR_ADDR5_REG 0x464 |
2603 |
+ |
2604 |
+-#define RCB_COM_SF_CFG_INTMASK_RING 0x480 |
2605 |
+-#define RCB_COM_SF_CFG_RING_STS 0x484 |
2606 |
+-#define RCB_COM_SF_CFG_RING 0x488 |
2607 |
+-#define RCB_COM_SF_CFG_INTMASK_BD 0x48C |
2608 |
+-#define RCB_COM_SF_CFG_BD_RINT_STS 0x470 |
2609 |
++#define RCB_COM_SF_CFG_INTMASK_RING 0x470 |
2610 |
++#define RCB_COM_SF_CFG_RING_STS 0x474 |
2611 |
++#define RCB_COM_SF_CFG_RING 0x478 |
2612 |
++#define RCB_COM_SF_CFG_INTMASK_BD 0x47C |
2613 |
++#define RCB_COM_SF_CFG_BD_RINT_STS 0x480 |
2614 |
+ #define RCB_COM_RCB_RD_BD_BUSY 0x490 |
2615 |
+ #define RCB_COM_RCB_FBD_CRT_EN 0x494 |
2616 |
+ #define RCB_COM_AXI_WR_ERR_INTMASK 0x498 |
2617 |
+@@ -534,6 +534,7 @@ |
2618 |
+ #define GMAC_LD_LINK_COUNTER_REG 0x01D0UL |
2619 |
+ #define GMAC_LOOP_REG 0x01DCUL |
2620 |
+ #define GMAC_RECV_CONTROL_REG 0x01E0UL |
2621 |
++#define GMAC_PCS_RX_EN_REG 0x01E4UL |
2622 |
+ #define GMAC_VLAN_CODE_REG 0x01E8UL |
2623 |
+ #define GMAC_RX_OVERRUN_CNT_REG 0x01ECUL |
2624 |
+ #define GMAC_RX_LENGTHFIELD_ERR_CNT_REG 0x01F4UL |
2625 |
+diff --git a/drivers/net/ethernet/hisilicon/hns/hns_enet.c b/drivers/net/ethernet/hisilicon/hns/hns_enet.c |
2626 |
+index 28e907831b0e..6242249c9f4c 100644 |
2627 |
+--- a/drivers/net/ethernet/hisilicon/hns/hns_enet.c |
2628 |
++++ b/drivers/net/ethernet/hisilicon/hns/hns_enet.c |
2629 |
+@@ -1186,6 +1186,9 @@ int hns_nic_init_phy(struct net_device *ndev, struct hnae_handle *h) |
2630 |
+ if (h->phy_if == PHY_INTERFACE_MODE_XGMII) |
2631 |
+ phy_dev->autoneg = false; |
2632 |
+ |
2633 |
++ if (h->phy_if == PHY_INTERFACE_MODE_SGMII) |
2634 |
++ phy_stop(phy_dev); |
2635 |
++ |
2636 |
+ return 0; |
2637 |
+ } |
2638 |
+ |
2639 |
+@@ -1281,6 +1284,22 @@ static int hns_nic_init_affinity_mask(int q_num, int ring_idx, |
2640 |
+ return cpu; |
2641 |
+ } |
2642 |
+ |
2643 |
++static void hns_nic_free_irq(int q_num, struct hns_nic_priv *priv) |
2644 |
++{ |
2645 |
++ int i; |
2646 |
++ |
2647 |
++ for (i = 0; i < q_num * 2; i++) { |
2648 |
++ if (priv->ring_data[i].ring->irq_init_flag == RCB_IRQ_INITED) { |
2649 |
++ irq_set_affinity_hint(priv->ring_data[i].ring->irq, |
2650 |
++ NULL); |
2651 |
++ free_irq(priv->ring_data[i].ring->irq, |
2652 |
++ &priv->ring_data[i]); |
2653 |
++ priv->ring_data[i].ring->irq_init_flag = |
2654 |
++ RCB_IRQ_NOT_INITED; |
2655 |
++ } |
2656 |
++ } |
2657 |
++} |
2658 |
++ |
2659 |
+ static int hns_nic_init_irq(struct hns_nic_priv *priv) |
2660 |
+ { |
2661 |
+ struct hnae_handle *h = priv->ae_handle; |
2662 |
+@@ -1306,7 +1325,7 @@ static int hns_nic_init_irq(struct hns_nic_priv *priv) |
2663 |
+ if (ret) { |
2664 |
+ netdev_err(priv->netdev, "request irq(%d) fail\n", |
2665 |
+ rd->ring->irq); |
2666 |
+- return ret; |
2667 |
++ goto out_free_irq; |
2668 |
+ } |
2669 |
+ disable_irq(rd->ring->irq); |
2670 |
+ |
2671 |
+@@ -1321,6 +1340,10 @@ static int hns_nic_init_irq(struct hns_nic_priv *priv) |
2672 |
+ } |
2673 |
+ |
2674 |
+ return 0; |
2675 |
++ |
2676 |
++out_free_irq: |
2677 |
++ hns_nic_free_irq(h->q_num, priv); |
2678 |
++ return ret; |
2679 |
+ } |
2680 |
+ |
2681 |
+ static int hns_nic_net_up(struct net_device *ndev) |
2682 |
+@@ -1330,6 +1353,9 @@ static int hns_nic_net_up(struct net_device *ndev) |
2683 |
+ int i, j; |
2684 |
+ int ret; |
2685 |
+ |
2686 |
++ if (!test_bit(NIC_STATE_DOWN, &priv->state)) |
2687 |
++ return 0; |
2688 |
++ |
2689 |
+ ret = hns_nic_init_irq(priv); |
2690 |
+ if (ret != 0) { |
2691 |
+ netdev_err(ndev, "hns init irq failed! ret=%d\n", ret); |
2692 |
+@@ -1365,6 +1391,7 @@ out_has_some_queues: |
2693 |
+ for (j = i - 1; j >= 0; j--) |
2694 |
+ hns_nic_ring_close(ndev, j); |
2695 |
+ |
2696 |
++ hns_nic_free_irq(h->q_num, priv); |
2697 |
+ set_bit(NIC_STATE_DOWN, &priv->state); |
2698 |
+ |
2699 |
+ return ret; |
2700 |
+@@ -1482,11 +1509,19 @@ static int hns_nic_net_stop(struct net_device *ndev) |
2701 |
+ } |
2702 |
+ |
2703 |
+ static void hns_tx_timeout_reset(struct hns_nic_priv *priv); |
2704 |
++#define HNS_TX_TIMEO_LIMIT (40 * HZ) |
2705 |
+ static void hns_nic_net_timeout(struct net_device *ndev) |
2706 |
+ { |
2707 |
+ struct hns_nic_priv *priv = netdev_priv(ndev); |
2708 |
+ |
2709 |
+- hns_tx_timeout_reset(priv); |
2710 |
++ if (ndev->watchdog_timeo < HNS_TX_TIMEO_LIMIT) { |
2711 |
++ ndev->watchdog_timeo *= 2; |
2712 |
++ netdev_info(ndev, "watchdog_timo changed to %d.\n", |
2713 |
++ ndev->watchdog_timeo); |
2714 |
++ } else { |
2715 |
++ ndev->watchdog_timeo = HNS_NIC_TX_TIMEOUT; |
2716 |
++ hns_tx_timeout_reset(priv); |
2717 |
++ } |
2718 |
+ } |
2719 |
+ |
2720 |
+ static int hns_nic_do_ioctl(struct net_device *netdev, struct ifreq *ifr, |
2721 |
+@@ -2049,11 +2084,11 @@ static void hns_nic_service_task(struct work_struct *work) |
2722 |
+ = container_of(work, struct hns_nic_priv, service_task); |
2723 |
+ struct hnae_handle *h = priv->ae_handle; |
2724 |
+ |
2725 |
++ hns_nic_reset_subtask(priv); |
2726 |
+ hns_nic_update_link_status(priv->netdev); |
2727 |
+ h->dev->ops->update_led_status(h); |
2728 |
+ hns_nic_update_stats(priv->netdev); |
2729 |
+ |
2730 |
+- hns_nic_reset_subtask(priv); |
2731 |
+ hns_nic_service_event_complete(priv); |
2732 |
+ } |
2733 |
+ |
2734 |
+@@ -2339,7 +2374,7 @@ static int hns_nic_dev_probe(struct platform_device *pdev) |
2735 |
+ ndev->min_mtu = MAC_MIN_MTU; |
2736 |
+ switch (priv->enet_ver) { |
2737 |
+ case AE_VERSION_2: |
2738 |
+- ndev->features |= NETIF_F_TSO | NETIF_F_TSO6; |
2739 |
++ ndev->features |= NETIF_F_TSO | NETIF_F_TSO6 | NETIF_F_NTUPLE; |
2740 |
+ ndev->hw_features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | |
2741 |
+ NETIF_F_RXCSUM | NETIF_F_SG | NETIF_F_GSO | |
2742 |
+ NETIF_F_GRO | NETIF_F_TSO | NETIF_F_TSO6; |
2743 |
+diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c |
2744 |
+index 5ab21a1b5444..c8704b1690eb 100644 |
2745 |
+--- a/drivers/net/ethernet/ibm/ibmvnic.c |
2746 |
++++ b/drivers/net/ethernet/ibm/ibmvnic.c |
2747 |
+@@ -1939,8 +1939,9 @@ static int do_hard_reset(struct ibmvnic_adapter *adapter, |
2748 |
+ static struct ibmvnic_rwi *get_next_rwi(struct ibmvnic_adapter *adapter) |
2749 |
+ { |
2750 |
+ struct ibmvnic_rwi *rwi; |
2751 |
++ unsigned long flags; |
2752 |
+ |
2753 |
+- mutex_lock(&adapter->rwi_lock); |
2754 |
++ spin_lock_irqsave(&adapter->rwi_lock, flags); |
2755 |
+ |
2756 |
+ if (!list_empty(&adapter->rwi_list)) { |
2757 |
+ rwi = list_first_entry(&adapter->rwi_list, struct ibmvnic_rwi, |
2758 |
+@@ -1950,7 +1951,7 @@ static struct ibmvnic_rwi *get_next_rwi(struct ibmvnic_adapter *adapter) |
2759 |
+ rwi = NULL; |
2760 |
+ } |
2761 |
+ |
2762 |
+- mutex_unlock(&adapter->rwi_lock); |
2763 |
++ spin_unlock_irqrestore(&adapter->rwi_lock, flags); |
2764 |
+ return rwi; |
2765 |
+ } |
2766 |
+ |
2767 |
+@@ -2025,6 +2026,7 @@ static int ibmvnic_reset(struct ibmvnic_adapter *adapter, |
2768 |
+ struct list_head *entry, *tmp_entry; |
2769 |
+ struct ibmvnic_rwi *rwi, *tmp; |
2770 |
+ struct net_device *netdev = adapter->netdev; |
2771 |
++ unsigned long flags; |
2772 |
+ int ret; |
2773 |
+ |
2774 |
+ if (adapter->state == VNIC_REMOVING || |
2775 |
+@@ -2041,21 +2043,21 @@ static int ibmvnic_reset(struct ibmvnic_adapter *adapter, |
2776 |
+ goto err; |
2777 |
+ } |
2778 |
+ |
2779 |
+- mutex_lock(&adapter->rwi_lock); |
2780 |
++ spin_lock_irqsave(&adapter->rwi_lock, flags); |
2781 |
+ |
2782 |
+ list_for_each(entry, &adapter->rwi_list) { |
2783 |
+ tmp = list_entry(entry, struct ibmvnic_rwi, list); |
2784 |
+ if (tmp->reset_reason == reason) { |
2785 |
+ netdev_dbg(netdev, "Skipping matching reset\n"); |
2786 |
+- mutex_unlock(&adapter->rwi_lock); |
2787 |
++ spin_unlock_irqrestore(&adapter->rwi_lock, flags); |
2788 |
+ ret = EBUSY; |
2789 |
+ goto err; |
2790 |
+ } |
2791 |
+ } |
2792 |
+ |
2793 |
+- rwi = kzalloc(sizeof(*rwi), GFP_KERNEL); |
2794 |
++ rwi = kzalloc(sizeof(*rwi), GFP_ATOMIC); |
2795 |
+ if (!rwi) { |
2796 |
+- mutex_unlock(&adapter->rwi_lock); |
2797 |
++ spin_unlock_irqrestore(&adapter->rwi_lock, flags); |
2798 |
+ ibmvnic_close(netdev); |
2799 |
+ ret = ENOMEM; |
2800 |
+ goto err; |
2801 |
+@@ -2069,7 +2071,7 @@ static int ibmvnic_reset(struct ibmvnic_adapter *adapter, |
2802 |
+ } |
2803 |
+ rwi->reset_reason = reason; |
2804 |
+ list_add_tail(&rwi->list, &adapter->rwi_list); |
2805 |
+- mutex_unlock(&adapter->rwi_lock); |
2806 |
++ spin_unlock_irqrestore(&adapter->rwi_lock, flags); |
2807 |
+ adapter->resetting = true; |
2808 |
+ netdev_dbg(adapter->netdev, "Scheduling reset (reason %d)\n", reason); |
2809 |
+ schedule_work(&adapter->ibmvnic_reset); |
2810 |
+@@ -4700,7 +4702,7 @@ static int ibmvnic_probe(struct vio_dev *dev, const struct vio_device_id *id) |
2811 |
+ |
2812 |
+ INIT_WORK(&adapter->ibmvnic_reset, __ibmvnic_reset); |
2813 |
+ INIT_LIST_HEAD(&adapter->rwi_list); |
2814 |
+- mutex_init(&adapter->rwi_lock); |
2815 |
++ spin_lock_init(&adapter->rwi_lock); |
2816 |
+ adapter->resetting = false; |
2817 |
+ |
2818 |
+ adapter->mac_change_pending = false; |
2819 |
+diff --git a/drivers/net/ethernet/ibm/ibmvnic.h b/drivers/net/ethernet/ibm/ibmvnic.h |
2820 |
+index 735f481b1870..09465397b7ff 100644 |
2821 |
+--- a/drivers/net/ethernet/ibm/ibmvnic.h |
2822 |
++++ b/drivers/net/ethernet/ibm/ibmvnic.h |
2823 |
+@@ -1068,7 +1068,7 @@ struct ibmvnic_adapter { |
2824 |
+ struct tasklet_struct tasklet; |
2825 |
+ enum vnic_state state; |
2826 |
+ enum ibmvnic_reset_reason reset_reason; |
2827 |
+- struct mutex rwi_lock; |
2828 |
++ spinlock_t rwi_lock; |
2829 |
+ struct list_head rwi_list; |
2830 |
+ struct work_struct ibmvnic_reset; |
2831 |
+ bool resetting; |
2832 |
+diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c |
2833 |
+index 3c342700bf5f..ed9d3fc4aaba 100644 |
2834 |
+--- a/drivers/net/ethernet/intel/i40e/i40e_main.c |
2835 |
++++ b/drivers/net/ethernet/intel/i40e/i40e_main.c |
2836 |
+@@ -1539,17 +1539,17 @@ static int i40e_set_mac(struct net_device *netdev, void *p) |
2837 |
+ netdev_info(netdev, "set new mac address %pM\n", addr->sa_data); |
2838 |
+ |
2839 |
+ /* Copy the address first, so that we avoid a possible race with |
2840 |
+- * .set_rx_mode(). If we copy after changing the address in the filter |
2841 |
+- * list, we might open ourselves to a narrow race window where |
2842 |
+- * .set_rx_mode could delete our dev_addr filter and prevent traffic |
2843 |
+- * from passing. |
2844 |
++ * .set_rx_mode(). |
2845 |
++ * - Remove old address from MAC filter |
2846 |
++ * - Copy new address |
2847 |
++ * - Add new address to MAC filter |
2848 |
+ */ |
2849 |
+- ether_addr_copy(netdev->dev_addr, addr->sa_data); |
2850 |
+- |
2851 |
+ spin_lock_bh(&vsi->mac_filter_hash_lock); |
2852 |
+ i40e_del_mac_filter(vsi, netdev->dev_addr); |
2853 |
+- i40e_add_mac_filter(vsi, addr->sa_data); |
2854 |
++ ether_addr_copy(netdev->dev_addr, addr->sa_data); |
2855 |
++ i40e_add_mac_filter(vsi, netdev->dev_addr); |
2856 |
+ spin_unlock_bh(&vsi->mac_filter_hash_lock); |
2857 |
++ |
2858 |
+ if (vsi->type == I40E_VSI_MAIN) { |
2859 |
+ i40e_status ret; |
2860 |
+ |
2861 |
+diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c |
2862 |
+index eea63a99f29c..f6ffd9fb2079 100644 |
2863 |
+--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c |
2864 |
++++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c |
2865 |
+@@ -699,7 +699,6 @@ static inline void ixgbe_vf_reset_event(struct ixgbe_adapter *adapter, u32 vf) |
2866 |
+ u8 num_tcs = adapter->hw_tcs; |
2867 |
+ u32 reg_val; |
2868 |
+ u32 queue; |
2869 |
+- u32 word; |
2870 |
+ |
2871 |
+ /* remove VLAN filters beloning to this VF */ |
2872 |
+ ixgbe_clear_vf_vlans(adapter, vf); |
2873 |
+@@ -754,6 +753,14 @@ static inline void ixgbe_vf_reset_event(struct ixgbe_adapter *adapter, u32 vf) |
2874 |
+ } |
2875 |
+ } |
2876 |
+ |
2877 |
++ IXGBE_WRITE_FLUSH(hw); |
2878 |
++} |
2879 |
++ |
2880 |
++static void ixgbe_vf_clear_mbx(struct ixgbe_adapter *adapter, u32 vf) |
2881 |
++{ |
2882 |
++ struct ixgbe_hw *hw = &adapter->hw; |
2883 |
++ u32 word; |
2884 |
++ |
2885 |
+ /* Clear VF's mailbox memory */ |
2886 |
+ for (word = 0; word < IXGBE_VFMAILBOX_SIZE; word++) |
2887 |
+ IXGBE_WRITE_REG_ARRAY(hw, IXGBE_PFMBMEM(vf), word, 0); |
2888 |
+@@ -827,6 +834,8 @@ static int ixgbe_vf_reset_msg(struct ixgbe_adapter *adapter, u32 vf) |
2889 |
+ /* reset the filters for the device */ |
2890 |
+ ixgbe_vf_reset_event(adapter, vf); |
2891 |
+ |
2892 |
++ ixgbe_vf_clear_mbx(adapter, vf); |
2893 |
++ |
2894 |
+ /* set vf mac address */ |
2895 |
+ if (!is_zero_ether_addr(vf_mac)) |
2896 |
+ ixgbe_set_vf_mac(adapter, vf, vf_mac); |
2897 |
+diff --git a/drivers/net/ethernet/microchip/lan743x_main.c b/drivers/net/ethernet/microchip/lan743x_main.c |
2898 |
+index aaedf1072460..1393252c6e3c 100644 |
2899 |
+--- a/drivers/net/ethernet/microchip/lan743x_main.c |
2900 |
++++ b/drivers/net/ethernet/microchip/lan743x_main.c |
2901 |
+@@ -802,14 +802,8 @@ static int lan743x_mac_init(struct lan743x_adapter *adapter) |
2902 |
+ u32 mac_addr_hi = 0; |
2903 |
+ u32 mac_addr_lo = 0; |
2904 |
+ u32 data; |
2905 |
+- int ret; |
2906 |
+ |
2907 |
+ netdev = adapter->netdev; |
2908 |
+- lan743x_csr_write(adapter, MAC_CR, MAC_CR_RST_); |
2909 |
+- ret = lan743x_csr_wait_for_bit(adapter, MAC_CR, MAC_CR_RST_, |
2910 |
+- 0, 1000, 20000, 100); |
2911 |
+- if (ret) |
2912 |
+- return ret; |
2913 |
+ |
2914 |
+ /* setup auto duplex, and speed detection */ |
2915 |
+ data = lan743x_csr_read(adapter, MAC_CR); |
2916 |
+@@ -2722,8 +2716,9 @@ static int lan743x_mdiobus_init(struct lan743x_adapter *adapter) |
2917 |
+ snprintf(adapter->mdiobus->id, MII_BUS_ID_SIZE, |
2918 |
+ "pci-%s", pci_name(adapter->pdev)); |
2919 |
+ |
2920 |
+- /* set to internal PHY id */ |
2921 |
+- adapter->mdiobus->phy_mask = ~(u32)BIT(1); |
2922 |
++ if ((adapter->csr.id_rev & ID_REV_ID_MASK_) == ID_REV_ID_LAN7430_) |
2923 |
++ /* LAN7430 uses internal phy at address 1 */ |
2924 |
++ adapter->mdiobus->phy_mask = ~(u32)BIT(1); |
2925 |
+ |
2926 |
+ /* register mdiobus */ |
2927 |
+ ret = mdiobus_register(adapter->mdiobus); |
2928 |
+diff --git a/drivers/net/ethernet/neterion/vxge/vxge-config.c b/drivers/net/ethernet/neterion/vxge/vxge-config.c |
2929 |
+index 398011c87643..bf4302e45dcd 100644 |
2930 |
+--- a/drivers/net/ethernet/neterion/vxge/vxge-config.c |
2931 |
++++ b/drivers/net/ethernet/neterion/vxge/vxge-config.c |
2932 |
+@@ -807,7 +807,7 @@ __vxge_hw_vpath_fw_ver_get(struct __vxge_hw_virtualpath *vpath, |
2933 |
+ struct vxge_hw_device_date *fw_date = &hw_info->fw_date; |
2934 |
+ struct vxge_hw_device_version *flash_version = &hw_info->flash_version; |
2935 |
+ struct vxge_hw_device_date *flash_date = &hw_info->flash_date; |
2936 |
+- u64 data0, data1 = 0, steer_ctrl = 0; |
2937 |
++ u64 data0 = 0, data1 = 0, steer_ctrl = 0; |
2938 |
+ enum vxge_hw_status status; |
2939 |
+ |
2940 |
+ status = vxge_hw_vpath_fw_api(vpath, |
2941 |
+diff --git a/drivers/net/ethernet/nuvoton/w90p910_ether.c b/drivers/net/ethernet/nuvoton/w90p910_ether.c |
2942 |
+index 052b3d2c07a1..c662c6f5bee3 100644 |
2943 |
+--- a/drivers/net/ethernet/nuvoton/w90p910_ether.c |
2944 |
++++ b/drivers/net/ethernet/nuvoton/w90p910_ether.c |
2945 |
+@@ -912,7 +912,7 @@ static const struct net_device_ops w90p910_ether_netdev_ops = { |
2946 |
+ .ndo_validate_addr = eth_validate_addr, |
2947 |
+ }; |
2948 |
+ |
2949 |
+-static void __init get_mac_address(struct net_device *dev) |
2950 |
++static void get_mac_address(struct net_device *dev) |
2951 |
+ { |
2952 |
+ struct w90p910_ether *ether = netdev_priv(dev); |
2953 |
+ struct platform_device *pdev; |
2954 |
+diff --git a/drivers/net/ethernet/qlogic/netxen/netxen_nic_init.c b/drivers/net/ethernet/qlogic/netxen/netxen_nic_init.c |
2955 |
+index 0ea141ece19e..6547a9dd5935 100644 |
2956 |
+--- a/drivers/net/ethernet/qlogic/netxen/netxen_nic_init.c |
2957 |
++++ b/drivers/net/ethernet/qlogic/netxen/netxen_nic_init.c |
2958 |
+@@ -1125,7 +1125,8 @@ netxen_validate_firmware(struct netxen_adapter *adapter) |
2959 |
+ return -EINVAL; |
2960 |
+ } |
2961 |
+ val = nx_get_bios_version(adapter); |
2962 |
+- netxen_rom_fast_read(adapter, NX_BIOS_VERSION_OFFSET, (int *)&bios); |
2963 |
++ if (netxen_rom_fast_read(adapter, NX_BIOS_VERSION_OFFSET, (int *)&bios)) |
2964 |
++ return -EIO; |
2965 |
+ if ((__force u32)val != bios) { |
2966 |
+ dev_err(&pdev->dev, "%s: firmware bios is incompatible\n", |
2967 |
+ fw_name[fw_type]); |
2968 |
+diff --git a/drivers/net/ethernet/qlogic/qed/qed_ll2.c b/drivers/net/ethernet/qlogic/qed/qed_ll2.c |
2969 |
+index 14ac9cab2653..2fa1c050a14b 100644 |
2970 |
+--- a/drivers/net/ethernet/qlogic/qed/qed_ll2.c |
2971 |
++++ b/drivers/net/ethernet/qlogic/qed/qed_ll2.c |
2972 |
+@@ -2485,6 +2485,7 @@ static int qed_ll2_start_xmit(struct qed_dev *cdev, struct sk_buff *skb, |
2973 |
+ if (unlikely(dma_mapping_error(&cdev->pdev->dev, mapping))) { |
2974 |
+ DP_NOTICE(cdev, |
2975 |
+ "Unable to map frag - dropping packet\n"); |
2976 |
++ rc = -ENOMEM; |
2977 |
+ goto err; |
2978 |
+ } |
2979 |
+ |
2980 |
+diff --git a/drivers/net/ieee802154/ca8210.c b/drivers/net/ieee802154/ca8210.c |
2981 |
+index 0ff5a403a8dc..b2ff903a9cb6 100644 |
2982 |
+--- a/drivers/net/ieee802154/ca8210.c |
2983 |
++++ b/drivers/net/ieee802154/ca8210.c |
2984 |
+@@ -721,7 +721,7 @@ static void ca8210_mlme_reset_worker(struct work_struct *work) |
2985 |
+ static void ca8210_rx_done(struct cas_control *cas_ctl) |
2986 |
+ { |
2987 |
+ u8 *buf; |
2988 |
+- u8 len; |
2989 |
++ unsigned int len; |
2990 |
+ struct work_priv_container *mlme_reset_wpc; |
2991 |
+ struct ca8210_priv *priv = cas_ctl->priv; |
2992 |
+ |
2993 |
+@@ -730,7 +730,7 @@ static void ca8210_rx_done(struct cas_control *cas_ctl) |
2994 |
+ if (len > CA8210_SPI_BUF_SIZE) { |
2995 |
+ dev_crit( |
2996 |
+ &priv->spi->dev, |
2997 |
+- "Received packet len (%d) erroneously long\n", |
2998 |
++ "Received packet len (%u) erroneously long\n", |
2999 |
+ len |
3000 |
+ ); |
3001 |
+ goto finish; |
3002 |
+diff --git a/drivers/net/ieee802154/mac802154_hwsim.c b/drivers/net/ieee802154/mac802154_hwsim.c |
3003 |
+index bf70ab892e69..624bff4d3636 100644 |
3004 |
+--- a/drivers/net/ieee802154/mac802154_hwsim.c |
3005 |
++++ b/drivers/net/ieee802154/mac802154_hwsim.c |
3006 |
+@@ -500,7 +500,7 @@ static int hwsim_del_edge_nl(struct sk_buff *msg, struct genl_info *info) |
3007 |
+ !info->attrs[MAC802154_HWSIM_ATTR_RADIO_EDGE]) |
3008 |
+ return -EINVAL; |
3009 |
+ |
3010 |
+- if (nla_parse_nested(edge_attrs, MAC802154_HWSIM_EDGE_ATTR_MAX + 1, |
3011 |
++ if (nla_parse_nested(edge_attrs, MAC802154_HWSIM_EDGE_ATTR_MAX, |
3012 |
+ info->attrs[MAC802154_HWSIM_ATTR_RADIO_EDGE], |
3013 |
+ hwsim_edge_policy, NULL)) |
3014 |
+ return -EINVAL; |
3015 |
+@@ -550,7 +550,7 @@ static int hwsim_set_edge_lqi(struct sk_buff *msg, struct genl_info *info) |
3016 |
+ !info->attrs[MAC802154_HWSIM_ATTR_RADIO_EDGE]) |
3017 |
+ return -EINVAL; |
3018 |
+ |
3019 |
+- if (nla_parse_nested(edge_attrs, MAC802154_HWSIM_EDGE_ATTR_MAX + 1, |
3020 |
++ if (nla_parse_nested(edge_attrs, MAC802154_HWSIM_EDGE_ATTR_MAX, |
3021 |
+ info->attrs[MAC802154_HWSIM_ATTR_RADIO_EDGE], |
3022 |
+ hwsim_edge_policy, NULL)) |
3023 |
+ return -EINVAL; |
3024 |
+diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c |
3025 |
+index c3c9ba44e2a1..8d140495da79 100644 |
3026 |
+--- a/drivers/net/usb/lan78xx.c |
3027 |
++++ b/drivers/net/usb/lan78xx.c |
3028 |
+@@ -2335,6 +2335,10 @@ static int lan78xx_set_mac_addr(struct net_device *netdev, void *p) |
3029 |
+ ret = lan78xx_write_reg(dev, RX_ADDRL, addr_lo); |
3030 |
+ ret = lan78xx_write_reg(dev, RX_ADDRH, addr_hi); |
3031 |
+ |
3032 |
++ /* Added to support MAC address changes */ |
3033 |
++ ret = lan78xx_write_reg(dev, MAF_LO(0), addr_lo); |
3034 |
++ ret = lan78xx_write_reg(dev, MAF_HI(0), addr_hi | MAF_HI_VALID_); |
3035 |
++ |
3036 |
+ return 0; |
3037 |
+ } |
3038 |
+ |
3039 |
+diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c |
3040 |
+index f5bac5075386..774e1ff01c9a 100644 |
3041 |
+--- a/drivers/net/usb/qmi_wwan.c |
3042 |
++++ b/drivers/net/usb/qmi_wwan.c |
3043 |
+@@ -151,17 +151,18 @@ static bool qmimux_has_slaves(struct usbnet *dev) |
3044 |
+ |
3045 |
+ static int qmimux_rx_fixup(struct usbnet *dev, struct sk_buff *skb) |
3046 |
+ { |
3047 |
+- unsigned int len, offset = sizeof(struct qmimux_hdr); |
3048 |
++ unsigned int len, offset = 0; |
3049 |
+ struct qmimux_hdr *hdr; |
3050 |
+ struct net_device *net; |
3051 |
+ struct sk_buff *skbn; |
3052 |
++ u8 qmimux_hdr_sz = sizeof(*hdr); |
3053 |
+ |
3054 |
+- while (offset < skb->len) { |
3055 |
+- hdr = (struct qmimux_hdr *)skb->data; |
3056 |
++ while (offset + qmimux_hdr_sz < skb->len) { |
3057 |
++ hdr = (struct qmimux_hdr *)(skb->data + offset); |
3058 |
+ len = be16_to_cpu(hdr->pkt_len); |
3059 |
+ |
3060 |
+ /* drop the packet, bogus length */ |
3061 |
+- if (offset + len > skb->len) |
3062 |
++ if (offset + len + qmimux_hdr_sz > skb->len) |
3063 |
+ return 0; |
3064 |
+ |
3065 |
+ /* control packet, we do not know what to do */ |
3066 |
+@@ -176,7 +177,7 @@ static int qmimux_rx_fixup(struct usbnet *dev, struct sk_buff *skb) |
3067 |
+ return 0; |
3068 |
+ skbn->dev = net; |
3069 |
+ |
3070 |
+- switch (skb->data[offset] & 0xf0) { |
3071 |
++ switch (skb->data[offset + qmimux_hdr_sz] & 0xf0) { |
3072 |
+ case 0x40: |
3073 |
+ skbn->protocol = htons(ETH_P_IP); |
3074 |
+ break; |
3075 |
+@@ -188,12 +189,12 @@ static int qmimux_rx_fixup(struct usbnet *dev, struct sk_buff *skb) |
3076 |
+ goto skip; |
3077 |
+ } |
3078 |
+ |
3079 |
+- skb_put_data(skbn, skb->data + offset, len); |
3080 |
++ skb_put_data(skbn, skb->data + offset + qmimux_hdr_sz, len); |
3081 |
+ if (netif_rx(skbn) != NET_RX_SUCCESS) |
3082 |
+ return 0; |
3083 |
+ |
3084 |
+ skip: |
3085 |
+- offset += len + sizeof(struct qmimux_hdr); |
3086 |
++ offset += len + qmimux_hdr_sz; |
3087 |
+ } |
3088 |
+ return 1; |
3089 |
+ } |
3090 |
+diff --git a/drivers/net/wireless/broadcom/b43/phy_common.c b/drivers/net/wireless/broadcom/b43/phy_common.c |
3091 |
+index 85f2ca989565..ef3ffa5ad466 100644 |
3092 |
+--- a/drivers/net/wireless/broadcom/b43/phy_common.c |
3093 |
++++ b/drivers/net/wireless/broadcom/b43/phy_common.c |
3094 |
+@@ -616,7 +616,7 @@ struct b43_c32 b43_cordic(int theta) |
3095 |
+ u8 i; |
3096 |
+ s32 tmp; |
3097 |
+ s8 signx = 1; |
3098 |
+- u32 angle = 0; |
3099 |
++ s32 angle = 0; |
3100 |
+ struct b43_c32 ret = { .i = 39797, .q = 0, }; |
3101 |
+ |
3102 |
+ while (theta > (180 << 16)) |
3103 |
+diff --git a/drivers/net/wireless/mediatek/mt76/mt76x0/init.c b/drivers/net/wireless/mediatek/mt76/mt76x0/init.c |
3104 |
+index 7cdb3e740522..0a3e046d78db 100644 |
3105 |
+--- a/drivers/net/wireless/mediatek/mt76/mt76x0/init.c |
3106 |
++++ b/drivers/net/wireless/mediatek/mt76/mt76x0/init.c |
3107 |
+@@ -681,6 +681,7 @@ int mt76x0_register_device(struct mt76x0_dev *dev) |
3108 |
+ ieee80211_hw_set(hw, SUPPORTS_HT_CCK_RATES); |
3109 |
+ ieee80211_hw_set(hw, AMPDU_AGGREGATION); |
3110 |
+ ieee80211_hw_set(hw, SUPPORTS_RC_TABLE); |
3111 |
++ ieee80211_hw_set(hw, MFP_CAPABLE); |
3112 |
+ hw->max_rates = 1; |
3113 |
+ hw->max_report_rates = 7; |
3114 |
+ hw->max_rate_tries = 1; |
3115 |
+diff --git a/drivers/net/wireless/mediatek/mt76/tx.c b/drivers/net/wireless/mediatek/mt76/tx.c |
3116 |
+index af48d43bb7dc..20447fdce4c3 100644 |
3117 |
+--- a/drivers/net/wireless/mediatek/mt76/tx.c |
3118 |
++++ b/drivers/net/wireless/mediatek/mt76/tx.c |
3119 |
+@@ -385,7 +385,12 @@ void mt76_stop_tx_queues(struct mt76_dev *dev, struct ieee80211_sta *sta, |
3120 |
+ |
3121 |
+ for (i = 0; i < ARRAY_SIZE(sta->txq); i++) { |
3122 |
+ struct ieee80211_txq *txq = sta->txq[i]; |
3123 |
+- struct mt76_txq *mtxq = (struct mt76_txq *) txq->drv_priv; |
3124 |
++ struct mt76_txq *mtxq; |
3125 |
++ |
3126 |
++ if (!txq) |
3127 |
++ continue; |
3128 |
++ |
3129 |
++ mtxq = (struct mt76_txq *)txq->drv_priv; |
3130 |
+ |
3131 |
+ spin_lock_bh(&mtxq->hwq->lock); |
3132 |
+ mtxq->send_bar = mtxq->aggr && send_bar; |
3133 |
+diff --git a/drivers/nvdimm/pmem.c b/drivers/nvdimm/pmem.c |
3134 |
+index 2082ae01b9c8..1d432c5ed275 100644 |
3135 |
+--- a/drivers/nvdimm/pmem.c |
3136 |
++++ b/drivers/nvdimm/pmem.c |
3137 |
+@@ -309,8 +309,11 @@ static void pmem_release_queue(void *q) |
3138 |
+ blk_cleanup_queue(q); |
3139 |
+ } |
3140 |
+ |
3141 |
+-static void pmem_freeze_queue(void *q) |
3142 |
++static void pmem_freeze_queue(struct percpu_ref *ref) |
3143 |
+ { |
3144 |
++ struct request_queue *q; |
3145 |
++ |
3146 |
++ q = container_of(ref, typeof(*q), q_usage_counter); |
3147 |
+ blk_freeze_queue_start(q); |
3148 |
+ } |
3149 |
+ |
3150 |
+@@ -402,6 +405,7 @@ static int pmem_attach_disk(struct device *dev, |
3151 |
+ |
3152 |
+ pmem->pfn_flags = PFN_DEV; |
3153 |
+ pmem->pgmap.ref = &q->q_usage_counter; |
3154 |
++ pmem->pgmap.kill = pmem_freeze_queue; |
3155 |
+ if (is_nd_pfn(dev)) { |
3156 |
+ if (setup_pagemap_fsdax(dev, &pmem->pgmap)) |
3157 |
+ return -ENOMEM; |
3158 |
+@@ -427,13 +431,6 @@ static int pmem_attach_disk(struct device *dev, |
3159 |
+ memcpy(&bb_res, &nsio->res, sizeof(bb_res)); |
3160 |
+ } |
3161 |
+ |
3162 |
+- /* |
3163 |
+- * At release time the queue must be frozen before |
3164 |
+- * devm_memremap_pages is unwound |
3165 |
+- */ |
3166 |
+- if (devm_add_action_or_reset(dev, pmem_freeze_queue, q)) |
3167 |
+- return -ENOMEM; |
3168 |
+- |
3169 |
+ if (IS_ERR(addr)) |
3170 |
+ return PTR_ERR(addr); |
3171 |
+ pmem->virt_addr = addr; |
3172 |
+diff --git a/drivers/of/base.c b/drivers/of/base.c |
3173 |
+index 70f5fd08891b..3f21ea6a90dc 100644 |
3174 |
+--- a/drivers/of/base.c |
3175 |
++++ b/drivers/of/base.c |
3176 |
+@@ -115,9 +115,6 @@ int __weak of_node_to_nid(struct device_node *np) |
3177 |
+ } |
3178 |
+ #endif |
3179 |
+ |
3180 |
+-static struct device_node **phandle_cache; |
3181 |
+-static u32 phandle_cache_mask; |
3182 |
+- |
3183 |
+ /* |
3184 |
+ * Assumptions behind phandle_cache implementation: |
3185 |
+ * - phandle property values are in a contiguous range of 1..n |
3186 |
+@@ -126,6 +123,66 @@ static u32 phandle_cache_mask; |
3187 |
+ * - the phandle lookup overhead reduction provided by the cache |
3188 |
+ * will likely be less |
3189 |
+ */ |
3190 |
++ |
3191 |
++static struct device_node **phandle_cache; |
3192 |
++static u32 phandle_cache_mask; |
3193 |
++ |
3194 |
++/* |
3195 |
++ * Caller must hold devtree_lock. |
3196 |
++ */ |
3197 |
++static void __of_free_phandle_cache(void) |
3198 |
++{ |
3199 |
++ u32 cache_entries = phandle_cache_mask + 1; |
3200 |
++ u32 k; |
3201 |
++ |
3202 |
++ if (!phandle_cache) |
3203 |
++ return; |
3204 |
++ |
3205 |
++ for (k = 0; k < cache_entries; k++) |
3206 |
++ of_node_put(phandle_cache[k]); |
3207 |
++ |
3208 |
++ kfree(phandle_cache); |
3209 |
++ phandle_cache = NULL; |
3210 |
++} |
3211 |
++ |
3212 |
++int of_free_phandle_cache(void) |
3213 |
++{ |
3214 |
++ unsigned long flags; |
3215 |
++ |
3216 |
++ raw_spin_lock_irqsave(&devtree_lock, flags); |
3217 |
++ |
3218 |
++ __of_free_phandle_cache(); |
3219 |
++ |
3220 |
++ raw_spin_unlock_irqrestore(&devtree_lock, flags); |
3221 |
++ |
3222 |
++ return 0; |
3223 |
++} |
3224 |
++#if !defined(CONFIG_MODULES) |
3225 |
++late_initcall_sync(of_free_phandle_cache); |
3226 |
++#endif |
3227 |
++ |
3228 |
++/* |
3229 |
++ * Caller must hold devtree_lock. |
3230 |
++ */ |
3231 |
++void __of_free_phandle_cache_entry(phandle handle) |
3232 |
++{ |
3233 |
++ phandle masked_handle; |
3234 |
++ struct device_node *np; |
3235 |
++ |
3236 |
++ if (!handle) |
3237 |
++ return; |
3238 |
++ |
3239 |
++ masked_handle = handle & phandle_cache_mask; |
3240 |
++ |
3241 |
++ if (phandle_cache) { |
3242 |
++ np = phandle_cache[masked_handle]; |
3243 |
++ if (np && handle == np->phandle) { |
3244 |
++ of_node_put(np); |
3245 |
++ phandle_cache[masked_handle] = NULL; |
3246 |
++ } |
3247 |
++ } |
3248 |
++} |
3249 |
++ |
3250 |
+ void of_populate_phandle_cache(void) |
3251 |
+ { |
3252 |
+ unsigned long flags; |
3253 |
+@@ -135,8 +192,7 @@ void of_populate_phandle_cache(void) |
3254 |
+ |
3255 |
+ raw_spin_lock_irqsave(&devtree_lock, flags); |
3256 |
+ |
3257 |
+- kfree(phandle_cache); |
3258 |
+- phandle_cache = NULL; |
3259 |
++ __of_free_phandle_cache(); |
3260 |
+ |
3261 |
+ for_each_of_allnodes(np) |
3262 |
+ if (np->phandle && np->phandle != OF_PHANDLE_ILLEGAL) |
3263 |
+@@ -154,30 +210,15 @@ void of_populate_phandle_cache(void) |
3264 |
+ goto out; |
3265 |
+ |
3266 |
+ for_each_of_allnodes(np) |
3267 |
+- if (np->phandle && np->phandle != OF_PHANDLE_ILLEGAL) |
3268 |
++ if (np->phandle && np->phandle != OF_PHANDLE_ILLEGAL) { |
3269 |
++ of_node_get(np); |
3270 |
+ phandle_cache[np->phandle & phandle_cache_mask] = np; |
3271 |
++ } |
3272 |
+ |
3273 |
+ out: |
3274 |
+ raw_spin_unlock_irqrestore(&devtree_lock, flags); |
3275 |
+ } |
3276 |
+ |
3277 |
+-int of_free_phandle_cache(void) |
3278 |
+-{ |
3279 |
+- unsigned long flags; |
3280 |
+- |
3281 |
+- raw_spin_lock_irqsave(&devtree_lock, flags); |
3282 |
+- |
3283 |
+- kfree(phandle_cache); |
3284 |
+- phandle_cache = NULL; |
3285 |
+- |
3286 |
+- raw_spin_unlock_irqrestore(&devtree_lock, flags); |
3287 |
+- |
3288 |
+- return 0; |
3289 |
+-} |
3290 |
+-#if !defined(CONFIG_MODULES) |
3291 |
+-late_initcall_sync(of_free_phandle_cache); |
3292 |
+-#endif |
3293 |
+- |
3294 |
+ void __init of_core_init(void) |
3295 |
+ { |
3296 |
+ struct device_node *np; |
3297 |
+@@ -1150,13 +1191,23 @@ struct device_node *of_find_node_by_phandle(phandle handle) |
3298 |
+ if (phandle_cache[masked_handle] && |
3299 |
+ handle == phandle_cache[masked_handle]->phandle) |
3300 |
+ np = phandle_cache[masked_handle]; |
3301 |
++ if (np && of_node_check_flag(np, OF_DETACHED)) { |
3302 |
++ WARN_ON(1); /* did not uncache np on node removal */ |
3303 |
++ of_node_put(np); |
3304 |
++ phandle_cache[masked_handle] = NULL; |
3305 |
++ np = NULL; |
3306 |
++ } |
3307 |
+ } |
3308 |
+ |
3309 |
+ if (!np) { |
3310 |
+ for_each_of_allnodes(np) |
3311 |
+- if (np->phandle == handle) { |
3312 |
+- if (phandle_cache) |
3313 |
++ if (np->phandle == handle && |
3314 |
++ !of_node_check_flag(np, OF_DETACHED)) { |
3315 |
++ if (phandle_cache) { |
3316 |
++ /* will put when removed from cache */ |
3317 |
++ of_node_get(np); |
3318 |
+ phandle_cache[masked_handle] = np; |
3319 |
++ } |
3320 |
+ break; |
3321 |
+ } |
3322 |
+ } |
3323 |
+diff --git a/drivers/of/dynamic.c b/drivers/of/dynamic.c |
3324 |
+index f4f8ed9b5454..ecea92f68c87 100644 |
3325 |
+--- a/drivers/of/dynamic.c |
3326 |
++++ b/drivers/of/dynamic.c |
3327 |
+@@ -268,6 +268,9 @@ void __of_detach_node(struct device_node *np) |
3328 |
+ } |
3329 |
+ |
3330 |
+ of_node_set_flag(np, OF_DETACHED); |
3331 |
++ |
3332 |
++ /* race with of_find_node_by_phandle() prevented by devtree_lock */ |
3333 |
++ __of_free_phandle_cache_entry(np->phandle); |
3334 |
+ } |
3335 |
+ |
3336 |
+ /** |
3337 |
+diff --git a/drivers/of/of_private.h b/drivers/of/of_private.h |
3338 |
+index 216175d11d3d..f5da842841e5 100644 |
3339 |
+--- a/drivers/of/of_private.h |
3340 |
++++ b/drivers/of/of_private.h |
3341 |
+@@ -76,6 +76,10 @@ static inline void __of_detach_node_sysfs(struct device_node *np) {} |
3342 |
+ int of_resolve_phandles(struct device_node *tree); |
3343 |
+ #endif |
3344 |
+ |
3345 |
++#if defined(CONFIG_OF_DYNAMIC) |
3346 |
++void __of_free_phandle_cache_entry(phandle handle); |
3347 |
++#endif |
3348 |
++ |
3349 |
+ #if defined(CONFIG_OF_OVERLAY) |
3350 |
+ void of_overlay_mutex_lock(void); |
3351 |
+ void of_overlay_mutex_unlock(void); |
3352 |
+diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c |
3353 |
+index bef17c3fca67..33f3f475e5c6 100644 |
3354 |
+--- a/drivers/pci/pci-driver.c |
3355 |
++++ b/drivers/pci/pci-driver.c |
3356 |
+@@ -1251,30 +1251,29 @@ static int pci_pm_runtime_suspend(struct device *dev) |
3357 |
+ return 0; |
3358 |
+ } |
3359 |
+ |
3360 |
+- if (!pm || !pm->runtime_suspend) |
3361 |
+- return -ENOSYS; |
3362 |
+- |
3363 |
+ pci_dev->state_saved = false; |
3364 |
+- error = pm->runtime_suspend(dev); |
3365 |
+- if (error) { |
3366 |
++ if (pm && pm->runtime_suspend) { |
3367 |
++ error = pm->runtime_suspend(dev); |
3368 |
+ /* |
3369 |
+ * -EBUSY and -EAGAIN is used to request the runtime PM core |
3370 |
+ * to schedule a new suspend, so log the event only with debug |
3371 |
+ * log level. |
3372 |
+ */ |
3373 |
+- if (error == -EBUSY || error == -EAGAIN) |
3374 |
++ if (error == -EBUSY || error == -EAGAIN) { |
3375 |
+ dev_dbg(dev, "can't suspend now (%pf returned %d)\n", |
3376 |
+ pm->runtime_suspend, error); |
3377 |
+- else |
3378 |
++ return error; |
3379 |
++ } else if (error) { |
3380 |
+ dev_err(dev, "can't suspend (%pf returned %d)\n", |
3381 |
+ pm->runtime_suspend, error); |
3382 |
+- |
3383 |
+- return error; |
3384 |
++ return error; |
3385 |
++ } |
3386 |
+ } |
3387 |
+ |
3388 |
+ pci_fixup_device(pci_fixup_suspend, pci_dev); |
3389 |
+ |
3390 |
+- if (!pci_dev->state_saved && pci_dev->current_state != PCI_D0 |
3391 |
++ if (pm && pm->runtime_suspend |
3392 |
++ && !pci_dev->state_saved && pci_dev->current_state != PCI_D0 |
3393 |
+ && pci_dev->current_state != PCI_UNKNOWN) { |
3394 |
+ WARN_ONCE(pci_dev->current_state != prev, |
3395 |
+ "PCI PM: State of device not saved by %pF\n", |
3396 |
+@@ -1292,7 +1291,7 @@ static int pci_pm_runtime_suspend(struct device *dev) |
3397 |
+ |
3398 |
+ static int pci_pm_runtime_resume(struct device *dev) |
3399 |
+ { |
3400 |
+- int rc; |
3401 |
++ int rc = 0; |
3402 |
+ struct pci_dev *pci_dev = to_pci_dev(dev); |
3403 |
+ const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL; |
3404 |
+ |
3405 |
+@@ -1306,14 +1305,12 @@ static int pci_pm_runtime_resume(struct device *dev) |
3406 |
+ if (!pci_dev->driver) |
3407 |
+ return 0; |
3408 |
+ |
3409 |
+- if (!pm || !pm->runtime_resume) |
3410 |
+- return -ENOSYS; |
3411 |
+- |
3412 |
+ pci_fixup_device(pci_fixup_resume_early, pci_dev); |
3413 |
+ pci_enable_wake(pci_dev, PCI_D0, false); |
3414 |
+ pci_fixup_device(pci_fixup_resume, pci_dev); |
3415 |
+ |
3416 |
+- rc = pm->runtime_resume(dev); |
3417 |
++ if (pm && pm->runtime_resume) |
3418 |
++ rc = pm->runtime_resume(dev); |
3419 |
+ |
3420 |
+ pci_dev->runtime_d3cold = false; |
3421 |
+ |
3422 |
+diff --git a/drivers/perf/hisilicon/hisi_uncore_ddrc_pmu.c b/drivers/perf/hisilicon/hisi_uncore_ddrc_pmu.c |
3423 |
+index 1b10ea05a914..69372e2bc93c 100644 |
3424 |
+--- a/drivers/perf/hisilicon/hisi_uncore_ddrc_pmu.c |
3425 |
++++ b/drivers/perf/hisilicon/hisi_uncore_ddrc_pmu.c |
3426 |
+@@ -30,8 +30,8 @@ |
3427 |
+ #define DDRC_FLUX_RCMD 0x38c |
3428 |
+ #define DDRC_PRE_CMD 0x3c0 |
3429 |
+ #define DDRC_ACT_CMD 0x3c4 |
3430 |
+-#define DDRC_BNK_CHG 0x3c8 |
3431 |
+ #define DDRC_RNK_CHG 0x3cc |
3432 |
++#define DDRC_RW_CHG 0x3d0 |
3433 |
+ #define DDRC_EVENT_CTRL 0x6C0 |
3434 |
+ #define DDRC_INT_MASK 0x6c8 |
3435 |
+ #define DDRC_INT_STATUS 0x6cc |
3436 |
+@@ -51,7 +51,7 @@ |
3437 |
+ |
3438 |
+ static const u32 ddrc_reg_off[] = { |
3439 |
+ DDRC_FLUX_WR, DDRC_FLUX_RD, DDRC_FLUX_WCMD, DDRC_FLUX_RCMD, |
3440 |
+- DDRC_PRE_CMD, DDRC_ACT_CMD, DDRC_BNK_CHG, DDRC_RNK_CHG |
3441 |
++ DDRC_PRE_CMD, DDRC_ACT_CMD, DDRC_RNK_CHG, DDRC_RW_CHG |
3442 |
+ }; |
3443 |
+ |
3444 |
+ /* |
3445 |
+diff --git a/drivers/pinctrl/meson/pinctrl-meson.c b/drivers/pinctrl/meson/pinctrl-meson.c |
3446 |
+index 4f3ab18636a3..c8eff70fdb1c 100644 |
3447 |
+--- a/drivers/pinctrl/meson/pinctrl-meson.c |
3448 |
++++ b/drivers/pinctrl/meson/pinctrl-meson.c |
3449 |
+@@ -191,7 +191,8 @@ static int meson_pinconf_set(struct pinctrl_dev *pcdev, unsigned int pin, |
3450 |
+ case PIN_CONFIG_BIAS_DISABLE: |
3451 |
+ dev_dbg(pc->dev, "pin %u: disable bias\n", pin); |
3452 |
+ |
3453 |
+- meson_calc_reg_and_bit(bank, pin, REG_PULL, ®, &bit); |
3454 |
++ meson_calc_reg_and_bit(bank, pin, REG_PULLEN, ®, |
3455 |
++ &bit); |
3456 |
+ ret = regmap_update_bits(pc->reg_pullen, reg, |
3457 |
+ BIT(bit), 0); |
3458 |
+ if (ret) |
3459 |
+diff --git a/drivers/power/supply/olpc_battery.c b/drivers/power/supply/olpc_battery.c |
3460 |
+index 6da79ae14860..5a97e42a3547 100644 |
3461 |
+--- a/drivers/power/supply/olpc_battery.c |
3462 |
++++ b/drivers/power/supply/olpc_battery.c |
3463 |
+@@ -428,14 +428,14 @@ static int olpc_bat_get_property(struct power_supply *psy, |
3464 |
+ if (ret) |
3465 |
+ return ret; |
3466 |
+ |
3467 |
+- val->intval = (s16)be16_to_cpu(ec_word) * 100 / 256; |
3468 |
++ val->intval = (s16)be16_to_cpu(ec_word) * 10 / 256; |
3469 |
+ break; |
3470 |
+ case POWER_SUPPLY_PROP_TEMP_AMBIENT: |
3471 |
+ ret = olpc_ec_cmd(EC_AMB_TEMP, NULL, 0, (void *)&ec_word, 2); |
3472 |
+ if (ret) |
3473 |
+ return ret; |
3474 |
+ |
3475 |
+- val->intval = (int)be16_to_cpu(ec_word) * 100 / 256; |
3476 |
++ val->intval = (int)be16_to_cpu(ec_word) * 10 / 256; |
3477 |
+ break; |
3478 |
+ case POWER_SUPPLY_PROP_CHARGE_COUNTER: |
3479 |
+ ret = olpc_ec_cmd(EC_BAT_ACR, NULL, 0, (void *)&ec_word, 2); |
3480 |
+diff --git a/drivers/s390/scsi/zfcp_aux.c b/drivers/s390/scsi/zfcp_aux.c |
3481 |
+index 94f4d8fe85e0..d1b531fe9ada 100644 |
3482 |
+--- a/drivers/s390/scsi/zfcp_aux.c |
3483 |
++++ b/drivers/s390/scsi/zfcp_aux.c |
3484 |
+@@ -275,16 +275,16 @@ static void zfcp_free_low_mem_buffers(struct zfcp_adapter *adapter) |
3485 |
+ */ |
3486 |
+ int zfcp_status_read_refill(struct zfcp_adapter *adapter) |
3487 |
+ { |
3488 |
+- while (atomic_read(&adapter->stat_miss) > 0) |
3489 |
++ while (atomic_add_unless(&adapter->stat_miss, -1, 0)) |
3490 |
+ if (zfcp_fsf_status_read(adapter->qdio)) { |
3491 |
++ atomic_inc(&adapter->stat_miss); /* undo add -1 */ |
3492 |
+ if (atomic_read(&adapter->stat_miss) >= |
3493 |
+ adapter->stat_read_buf_num) { |
3494 |
+ zfcp_erp_adapter_reopen(adapter, 0, "axsref1"); |
3495 |
+ return 1; |
3496 |
+ } |
3497 |
+ break; |
3498 |
+- } else |
3499 |
+- atomic_dec(&adapter->stat_miss); |
3500 |
++ } |
3501 |
+ return 0; |
3502 |
+ } |
3503 |
+ |
3504 |
+diff --git a/drivers/scsi/bnx2fc/bnx2fc_fcoe.c b/drivers/scsi/bnx2fc/bnx2fc_fcoe.c |
3505 |
+index f00045813378..3f97ec4aac4b 100644 |
3506 |
+--- a/drivers/scsi/bnx2fc/bnx2fc_fcoe.c |
3507 |
++++ b/drivers/scsi/bnx2fc/bnx2fc_fcoe.c |
3508 |
+@@ -2371,7 +2371,7 @@ static int _bnx2fc_create(struct net_device *netdev, |
3509 |
+ if (!interface) { |
3510 |
+ printk(KERN_ERR PFX "bnx2fc_interface_create failed\n"); |
3511 |
+ rc = -ENOMEM; |
3512 |
+- goto ifput_err; |
3513 |
++ goto netdev_err; |
3514 |
+ } |
3515 |
+ |
3516 |
+ if (is_vlan_dev(netdev)) { |
3517 |
+diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c |
3518 |
+index be2bac9355cd..a490e63c94b6 100644 |
3519 |
+--- a/drivers/scsi/lpfc/lpfc_sli.c |
3520 |
++++ b/drivers/scsi/lpfc/lpfc_sli.c |
3521 |
+@@ -14221,7 +14221,8 @@ lpfc_sli4_queue_alloc(struct lpfc_hba *phba, uint32_t page_size, |
3522 |
+ hw_page_size))/hw_page_size; |
3523 |
+ |
3524 |
+ /* If needed, Adjust page count to match the max the adapter supports */ |
3525 |
+- if (queue->page_count > phba->sli4_hba.pc_sli4_params.wqpcnt) |
3526 |
++ if (phba->sli4_hba.pc_sli4_params.wqpcnt && |
3527 |
++ (queue->page_count > phba->sli4_hba.pc_sli4_params.wqpcnt)) |
3528 |
+ queue->page_count = phba->sli4_hba.pc_sli4_params.wqpcnt; |
3529 |
+ |
3530 |
+ INIT_LIST_HEAD(&queue->list); |
3531 |
+diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c |
3532 |
+index ae9fd2d01004..42b8f0d3e580 100644 |
3533 |
+--- a/drivers/scsi/qla2xxx/qla_os.c |
3534 |
++++ b/drivers/scsi/qla2xxx/qla_os.c |
3535 |
+@@ -4808,10 +4808,10 @@ void qla24xx_create_new_sess(struct scsi_qla_host *vha, struct qla_work_evt *e) |
3536 |
+ fcport->d_id = e->u.new_sess.id; |
3537 |
+ fcport->flags |= FCF_FABRIC_DEVICE; |
3538 |
+ fcport->fw_login_state = DSC_LS_PLOGI_PEND; |
3539 |
+- if (e->u.new_sess.fc4_type & FS_FC4TYPE_FCP) |
3540 |
++ if (e->u.new_sess.fc4_type == FS_FC4TYPE_FCP) |
3541 |
+ fcport->fc4_type = FC4_TYPE_FCP_SCSI; |
3542 |
+ |
3543 |
+- if (e->u.new_sess.fc4_type & FS_FC4TYPE_NVME) { |
3544 |
++ if (e->u.new_sess.fc4_type == FS_FC4TYPE_NVME) { |
3545 |
+ fcport->fc4_type = FC4_TYPE_OTHER; |
3546 |
+ fcport->fc4f_nvme = FC4_TYPE_NVME; |
3547 |
+ } |
3548 |
+diff --git a/drivers/target/iscsi/cxgbit/cxgbit_cm.c b/drivers/target/iscsi/cxgbit/cxgbit_cm.c |
3549 |
+index 8de16016b6de..b289b90ae6dc 100644 |
3550 |
+--- a/drivers/target/iscsi/cxgbit/cxgbit_cm.c |
3551 |
++++ b/drivers/target/iscsi/cxgbit/cxgbit_cm.c |
3552 |
+@@ -631,8 +631,11 @@ static void cxgbit_send_halfclose(struct cxgbit_sock *csk) |
3553 |
+ |
3554 |
+ static void cxgbit_arp_failure_discard(void *handle, struct sk_buff *skb) |
3555 |
+ { |
3556 |
++ struct cxgbit_sock *csk = handle; |
3557 |
++ |
3558 |
+ pr_debug("%s cxgbit_device %p\n", __func__, handle); |
3559 |
+ kfree_skb(skb); |
3560 |
++ cxgbit_put_csk(csk); |
3561 |
+ } |
3562 |
+ |
3563 |
+ static void cxgbit_abort_arp_failure(void *handle, struct sk_buff *skb) |
3564 |
+@@ -1190,7 +1193,7 @@ cxgbit_pass_accept_rpl(struct cxgbit_sock *csk, struct cpl_pass_accept_req *req) |
3565 |
+ rpl5->opt0 = cpu_to_be64(opt0); |
3566 |
+ rpl5->opt2 = cpu_to_be32(opt2); |
3567 |
+ set_wr_txq(skb, CPL_PRIORITY_SETUP, csk->ctrlq_idx); |
3568 |
+- t4_set_arp_err_handler(skb, NULL, cxgbit_arp_failure_discard); |
3569 |
++ t4_set_arp_err_handler(skb, csk, cxgbit_arp_failure_discard); |
3570 |
+ cxgbit_l2t_send(csk->com.cdev, skb, csk->l2t); |
3571 |
+ } |
3572 |
+ |
3573 |
+diff --git a/drivers/target/iscsi/cxgbit/cxgbit_main.c b/drivers/target/iscsi/cxgbit/cxgbit_main.c |
3574 |
+index f3f8856bfb68..c011c826fc26 100644 |
3575 |
+--- a/drivers/target/iscsi/cxgbit/cxgbit_main.c |
3576 |
++++ b/drivers/target/iscsi/cxgbit/cxgbit_main.c |
3577 |
+@@ -58,6 +58,7 @@ static void *cxgbit_uld_add(const struct cxgb4_lld_info *lldi) |
3578 |
+ return ERR_PTR(-ENOMEM); |
3579 |
+ |
3580 |
+ kref_init(&cdev->kref); |
3581 |
++ spin_lock_init(&cdev->np_lock); |
3582 |
+ |
3583 |
+ cdev->lldi = *lldi; |
3584 |
+ |
3585 |
+diff --git a/drivers/tty/serial/sunsu.c b/drivers/tty/serial/sunsu.c |
3586 |
+index 6cf3e9b0728f..3e77475668c0 100644 |
3587 |
+--- a/drivers/tty/serial/sunsu.c |
3588 |
++++ b/drivers/tty/serial/sunsu.c |
3589 |
+@@ -1394,22 +1394,43 @@ static inline struct console *SUNSU_CONSOLE(void) |
3590 |
+ static enum su_type su_get_type(struct device_node *dp) |
3591 |
+ { |
3592 |
+ struct device_node *ap = of_find_node_by_path("/aliases"); |
3593 |
++ enum su_type rc = SU_PORT_PORT; |
3594 |
+ |
3595 |
+ if (ap) { |
3596 |
+ const char *keyb = of_get_property(ap, "keyboard", NULL); |
3597 |
+ const char *ms = of_get_property(ap, "mouse", NULL); |
3598 |
++ struct device_node *match; |
3599 |
+ |
3600 |
+ if (keyb) { |
3601 |
+- if (dp == of_find_node_by_path(keyb)) |
3602 |
+- return SU_PORT_KBD; |
3603 |
++ match = of_find_node_by_path(keyb); |
3604 |
++ |
3605 |
++ /* |
3606 |
++ * The pointer is used as an identifier not |
3607 |
++ * as a pointer, we can drop the refcount on |
3608 |
++ * the of__node immediately after getting it. |
3609 |
++ */ |
3610 |
++ of_node_put(match); |
3611 |
++ |
3612 |
++ if (dp == match) { |
3613 |
++ rc = SU_PORT_KBD; |
3614 |
++ goto out; |
3615 |
++ } |
3616 |
+ } |
3617 |
+ if (ms) { |
3618 |
+- if (dp == of_find_node_by_path(ms)) |
3619 |
+- return SU_PORT_MS; |
3620 |
++ match = of_find_node_by_path(ms); |
3621 |
++ |
3622 |
++ of_node_put(match); |
3623 |
++ |
3624 |
++ if (dp == match) { |
3625 |
++ rc = SU_PORT_MS; |
3626 |
++ goto out; |
3627 |
++ } |
3628 |
+ } |
3629 |
+ } |
3630 |
+ |
3631 |
+- return SU_PORT_PORT; |
3632 |
++out: |
3633 |
++ of_node_put(ap); |
3634 |
++ return rc; |
3635 |
+ } |
3636 |
+ |
3637 |
+ static int su_probe(struct platform_device *op) |
3638 |
+diff --git a/drivers/video/fbdev/pxafb.c b/drivers/video/fbdev/pxafb.c |
3639 |
+index bbed039617a4..d59c8a59f582 100644 |
3640 |
+--- a/drivers/video/fbdev/pxafb.c |
3641 |
++++ b/drivers/video/fbdev/pxafb.c |
3642 |
+@@ -2234,10 +2234,8 @@ static struct pxafb_mach_info *of_pxafb_of_mach_info(struct device *dev) |
3643 |
+ if (!info) |
3644 |
+ return ERR_PTR(-ENOMEM); |
3645 |
+ ret = of_get_pxafb_mode_info(dev, info); |
3646 |
+- if (ret) { |
3647 |
+- kfree(info->modes); |
3648 |
++ if (ret) |
3649 |
+ return ERR_PTR(ret); |
3650 |
+- } |
3651 |
+ |
3652 |
+ /* |
3653 |
+ * On purpose, neither lccrX registers nor video memory size can be |
3654 |
+diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c |
3655 |
+index dd7dfdd2ba13..eadffaa39f4e 100644 |
3656 |
+--- a/fs/ceph/caps.c |
3657 |
++++ b/fs/ceph/caps.c |
3658 |
+@@ -3566,7 +3566,6 @@ retry: |
3659 |
+ tcap->cap_id = t_cap_id; |
3660 |
+ tcap->seq = t_seq - 1; |
3661 |
+ tcap->issue_seq = t_seq - 1; |
3662 |
+- tcap->mseq = t_mseq; |
3663 |
+ tcap->issued |= issued; |
3664 |
+ tcap->implemented |= issued; |
3665 |
+ if (cap == ci->i_auth_cap) |
3666 |
+diff --git a/fs/dlm/lock.c b/fs/dlm/lock.c |
3667 |
+index cc91963683de..a928ba008d7d 100644 |
3668 |
+--- a/fs/dlm/lock.c |
3669 |
++++ b/fs/dlm/lock.c |
3670 |
+@@ -1209,6 +1209,7 @@ static int create_lkb(struct dlm_ls *ls, struct dlm_lkb **lkb_ret) |
3671 |
+ |
3672 |
+ if (rv < 0) { |
3673 |
+ log_error(ls, "create_lkb idr error %d", rv); |
3674 |
++ dlm_free_lkb(lkb); |
3675 |
+ return rv; |
3676 |
+ } |
3677 |
+ |
3678 |
+@@ -4179,6 +4180,7 @@ static int receive_convert(struct dlm_ls *ls, struct dlm_message *ms) |
3679 |
+ (unsigned long long)lkb->lkb_recover_seq, |
3680 |
+ ms->m_header.h_nodeid, ms->m_lkid); |
3681 |
+ error = -ENOENT; |
3682 |
++ dlm_put_lkb(lkb); |
3683 |
+ goto fail; |
3684 |
+ } |
3685 |
+ |
3686 |
+@@ -4232,6 +4234,7 @@ static int receive_unlock(struct dlm_ls *ls, struct dlm_message *ms) |
3687 |
+ lkb->lkb_id, lkb->lkb_remid, |
3688 |
+ ms->m_header.h_nodeid, ms->m_lkid); |
3689 |
+ error = -ENOENT; |
3690 |
++ dlm_put_lkb(lkb); |
3691 |
+ goto fail; |
3692 |
+ } |
3693 |
+ |
3694 |
+@@ -5792,20 +5795,20 @@ int dlm_user_request(struct dlm_ls *ls, struct dlm_user_args *ua, |
3695 |
+ goto out; |
3696 |
+ } |
3697 |
+ } |
3698 |
+- |
3699 |
+- /* After ua is attached to lkb it will be freed by dlm_free_lkb(). |
3700 |
+- When DLM_IFL_USER is set, the dlm knows that this is a userspace |
3701 |
+- lock and that lkb_astparam is the dlm_user_args structure. */ |
3702 |
+- |
3703 |
+ error = set_lock_args(mode, &ua->lksb, flags, namelen, timeout_cs, |
3704 |
+ fake_astfn, ua, fake_bastfn, &args); |
3705 |
+- lkb->lkb_flags |= DLM_IFL_USER; |
3706 |
+- |
3707 |
+ if (error) { |
3708 |
++ kfree(ua->lksb.sb_lvbptr); |
3709 |
++ ua->lksb.sb_lvbptr = NULL; |
3710 |
++ kfree(ua); |
3711 |
+ __put_lkb(ls, lkb); |
3712 |
+ goto out; |
3713 |
+ } |
3714 |
+ |
3715 |
++ /* After ua is attached to lkb it will be freed by dlm_free_lkb(). |
3716 |
++ When DLM_IFL_USER is set, the dlm knows that this is a userspace |
3717 |
++ lock and that lkb_astparam is the dlm_user_args structure. */ |
3718 |
++ lkb->lkb_flags |= DLM_IFL_USER; |
3719 |
+ error = request_lock(ls, lkb, name, namelen, &args); |
3720 |
+ |
3721 |
+ switch (error) { |
3722 |
+diff --git a/fs/dlm/lockspace.c b/fs/dlm/lockspace.c |
3723 |
+index 5ba94be006ee..6a1529e478f3 100644 |
3724 |
+--- a/fs/dlm/lockspace.c |
3725 |
++++ b/fs/dlm/lockspace.c |
3726 |
+@@ -680,11 +680,11 @@ static int new_lockspace(const char *name, const char *cluster, |
3727 |
+ kfree(ls->ls_recover_buf); |
3728 |
+ out_lkbidr: |
3729 |
+ idr_destroy(&ls->ls_lkbidr); |
3730 |
++ out_rsbtbl: |
3731 |
+ for (i = 0; i < DLM_REMOVE_NAMES_MAX; i++) { |
3732 |
+ if (ls->ls_remove_names[i]) |
3733 |
+ kfree(ls->ls_remove_names[i]); |
3734 |
+ } |
3735 |
+- out_rsbtbl: |
3736 |
+ vfree(ls->ls_rsbtbl); |
3737 |
+ out_lsfree: |
3738 |
+ if (do_unreg) |
3739 |
+diff --git a/fs/gfs2/inode.c b/fs/gfs2/inode.c |
3740 |
+index 648f0ca1ad57..998051c4aea7 100644 |
3741 |
+--- a/fs/gfs2/inode.c |
3742 |
++++ b/fs/gfs2/inode.c |
3743 |
+@@ -744,17 +744,19 @@ static int gfs2_create_inode(struct inode *dir, struct dentry *dentry, |
3744 |
+ the gfs2 structures. */ |
3745 |
+ if (default_acl) { |
3746 |
+ error = __gfs2_set_acl(inode, default_acl, ACL_TYPE_DEFAULT); |
3747 |
++ if (error) |
3748 |
++ goto fail_gunlock3; |
3749 |
+ posix_acl_release(default_acl); |
3750 |
++ default_acl = NULL; |
3751 |
+ } |
3752 |
+ if (acl) { |
3753 |
+- if (!error) |
3754 |
+- error = __gfs2_set_acl(inode, acl, ACL_TYPE_ACCESS); |
3755 |
++ error = __gfs2_set_acl(inode, acl, ACL_TYPE_ACCESS); |
3756 |
++ if (error) |
3757 |
++ goto fail_gunlock3; |
3758 |
+ posix_acl_release(acl); |
3759 |
++ acl = NULL; |
3760 |
+ } |
3761 |
+ |
3762 |
+- if (error) |
3763 |
+- goto fail_gunlock3; |
3764 |
+- |
3765 |
+ error = security_inode_init_security(&ip->i_inode, &dip->i_inode, name, |
3766 |
+ &gfs2_initxattrs, NULL); |
3767 |
+ if (error) |
3768 |
+@@ -789,10 +791,8 @@ fail_free_inode: |
3769 |
+ } |
3770 |
+ gfs2_rsqa_delete(ip, NULL); |
3771 |
+ fail_free_acls: |
3772 |
+- if (default_acl) |
3773 |
+- posix_acl_release(default_acl); |
3774 |
+- if (acl) |
3775 |
+- posix_acl_release(acl); |
3776 |
++ posix_acl_release(default_acl); |
3777 |
++ posix_acl_release(acl); |
3778 |
+ fail_gunlock: |
3779 |
+ gfs2_dir_no_add(&da); |
3780 |
+ gfs2_glock_dq_uninit(ghs); |
3781 |
+diff --git a/fs/gfs2/rgrp.c b/fs/gfs2/rgrp.c |
3782 |
+index 449d0cb45a84..e978f6930575 100644 |
3783 |
+--- a/fs/gfs2/rgrp.c |
3784 |
++++ b/fs/gfs2/rgrp.c |
3785 |
+@@ -1747,9 +1747,9 @@ static int gfs2_rbm_find(struct gfs2_rbm *rbm, u8 state, u32 *minext, |
3786 |
+ goto next_iter; |
3787 |
+ } |
3788 |
+ if (ret == -E2BIG) { |
3789 |
++ n += rbm->bii - initial_bii; |
3790 |
+ rbm->bii = 0; |
3791 |
+ rbm->offset = 0; |
3792 |
+- n += (rbm->bii - initial_bii); |
3793 |
+ goto res_covered_end_of_rgrp; |
3794 |
+ } |
3795 |
+ return ret; |
3796 |
+diff --git a/fs/lockd/clntproc.c b/fs/lockd/clntproc.c |
3797 |
+index d20b92f271c2..0a67dd4250e9 100644 |
3798 |
+--- a/fs/lockd/clntproc.c |
3799 |
++++ b/fs/lockd/clntproc.c |
3800 |
+@@ -442,7 +442,7 @@ nlmclnt_test(struct nlm_rqst *req, struct file_lock *fl) |
3801 |
+ fl->fl_start = req->a_res.lock.fl.fl_start; |
3802 |
+ fl->fl_end = req->a_res.lock.fl.fl_end; |
3803 |
+ fl->fl_type = req->a_res.lock.fl.fl_type; |
3804 |
+- fl->fl_pid = 0; |
3805 |
++ fl->fl_pid = -req->a_res.lock.fl.fl_pid; |
3806 |
+ break; |
3807 |
+ default: |
3808 |
+ status = nlm_stat_to_errno(req->a_res.status); |
3809 |
+diff --git a/fs/lockd/xdr.c b/fs/lockd/xdr.c |
3810 |
+index 7147e4aebecc..9846f7e95282 100644 |
3811 |
+--- a/fs/lockd/xdr.c |
3812 |
++++ b/fs/lockd/xdr.c |
3813 |
+@@ -127,7 +127,7 @@ nlm_decode_lock(__be32 *p, struct nlm_lock *lock) |
3814 |
+ |
3815 |
+ locks_init_lock(fl); |
3816 |
+ fl->fl_owner = current->files; |
3817 |
+- fl->fl_pid = (pid_t)lock->svid; |
3818 |
++ fl->fl_pid = current->tgid; |
3819 |
+ fl->fl_flags = FL_POSIX; |
3820 |
+ fl->fl_type = F_RDLCK; /* as good as anything else */ |
3821 |
+ start = ntohl(*p++); |
3822 |
+@@ -269,7 +269,7 @@ nlmsvc_decode_shareargs(struct svc_rqst *rqstp, __be32 *p) |
3823 |
+ memset(lock, 0, sizeof(*lock)); |
3824 |
+ locks_init_lock(&lock->fl); |
3825 |
+ lock->svid = ~(u32) 0; |
3826 |
+- lock->fl.fl_pid = (pid_t)lock->svid; |
3827 |
++ lock->fl.fl_pid = current->tgid; |
3828 |
+ |
3829 |
+ if (!(p = nlm_decode_cookie(p, &argp->cookie)) |
3830 |
+ || !(p = xdr_decode_string_inplace(p, &lock->caller, |
3831 |
+diff --git a/fs/lockd/xdr4.c b/fs/lockd/xdr4.c |
3832 |
+index 7ed9edf9aed4..70154f376695 100644 |
3833 |
+--- a/fs/lockd/xdr4.c |
3834 |
++++ b/fs/lockd/xdr4.c |
3835 |
+@@ -119,7 +119,7 @@ nlm4_decode_lock(__be32 *p, struct nlm_lock *lock) |
3836 |
+ |
3837 |
+ locks_init_lock(fl); |
3838 |
+ fl->fl_owner = current->files; |
3839 |
+- fl->fl_pid = (pid_t)lock->svid; |
3840 |
++ fl->fl_pid = current->tgid; |
3841 |
+ fl->fl_flags = FL_POSIX; |
3842 |
+ fl->fl_type = F_RDLCK; /* as good as anything else */ |
3843 |
+ p = xdr_decode_hyper(p, &start); |
3844 |
+@@ -266,7 +266,7 @@ nlm4svc_decode_shareargs(struct svc_rqst *rqstp, __be32 *p) |
3845 |
+ memset(lock, 0, sizeof(*lock)); |
3846 |
+ locks_init_lock(&lock->fl); |
3847 |
+ lock->svid = ~(u32) 0; |
3848 |
+- lock->fl.fl_pid = (pid_t)lock->svid; |
3849 |
++ lock->fl.fl_pid = current->tgid; |
3850 |
+ |
3851 |
+ if (!(p = nlm4_decode_cookie(p, &argp->cookie)) |
3852 |
+ || !(p = xdr_decode_string_inplace(p, &lock->caller, |
3853 |
+diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c |
3854 |
+index 9d6b4f0f1a25..f35aa9f88b5e 100644 |
3855 |
+--- a/fs/nfsd/nfs4proc.c |
3856 |
++++ b/fs/nfsd/nfs4proc.c |
3857 |
+@@ -1015,8 +1015,6 @@ nfsd4_write(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, |
3858 |
+ |
3859 |
+ nvecs = svc_fill_write_vector(rqstp, write->wr_pagelist, |
3860 |
+ &write->wr_head, write->wr_buflen); |
3861 |
+- if (!nvecs) |
3862 |
+- return nfserr_io; |
3863 |
+ WARN_ON_ONCE(nvecs > ARRAY_SIZE(rqstp->rq_vec)); |
3864 |
+ |
3865 |
+ status = nfsd_vfs_write(rqstp, &cstate->current_fh, filp, |
3866 |
+diff --git a/include/linux/hmm.h b/include/linux/hmm.h |
3867 |
+index 4c92e3ba3e16..5ec8635f602c 100644 |
3868 |
+--- a/include/linux/hmm.h |
3869 |
++++ b/include/linux/hmm.h |
3870 |
+@@ -499,8 +499,7 @@ struct hmm_devmem { |
3871 |
+ * enough and allocate struct page for it. |
3872 |
+ * |
3873 |
+ * The device driver can wrap the hmm_devmem struct inside a private device |
3874 |
+- * driver struct. The device driver must call hmm_devmem_remove() before the |
3875 |
+- * device goes away and before freeing the hmm_devmem struct memory. |
3876 |
++ * driver struct. |
3877 |
+ */ |
3878 |
+ struct hmm_devmem *hmm_devmem_add(const struct hmm_devmem_ops *ops, |
3879 |
+ struct device *device, |
3880 |
+@@ -508,7 +507,6 @@ struct hmm_devmem *hmm_devmem_add(const struct hmm_devmem_ops *ops, |
3881 |
+ struct hmm_devmem *hmm_devmem_add_resource(const struct hmm_devmem_ops *ops, |
3882 |
+ struct device *device, |
3883 |
+ struct resource *res); |
3884 |
+-void hmm_devmem_remove(struct hmm_devmem *devmem); |
3885 |
+ |
3886 |
+ /* |
3887 |
+ * hmm_devmem_page_set_drvdata - set per-page driver data field |
3888 |
+diff --git a/include/linux/memremap.h b/include/linux/memremap.h |
3889 |
+index f91f9e763557..a84572cdc438 100644 |
3890 |
+--- a/include/linux/memremap.h |
3891 |
++++ b/include/linux/memremap.h |
3892 |
+@@ -106,6 +106,7 @@ typedef void (*dev_page_free_t)(struct page *page, void *data); |
3893 |
+ * @altmap: pre-allocated/reserved memory for vmemmap allocations |
3894 |
+ * @res: physical address range covered by @ref |
3895 |
+ * @ref: reference count that pins the devm_memremap_pages() mapping |
3896 |
++ * @kill: callback to transition @ref to the dead state |
3897 |
+ * @dev: host device of the mapping for debug |
3898 |
+ * @data: private data pointer for page_free() |
3899 |
+ * @type: memory type: see MEMORY_* in memory_hotplug.h |
3900 |
+@@ -117,6 +118,7 @@ struct dev_pagemap { |
3901 |
+ bool altmap_valid; |
3902 |
+ struct resource res; |
3903 |
+ struct percpu_ref *ref; |
3904 |
++ void (*kill)(struct percpu_ref *ref); |
3905 |
+ struct device *dev; |
3906 |
+ void *data; |
3907 |
+ enum memory_type type; |
3908 |
+diff --git a/include/linux/netfilter/nfnetlink.h b/include/linux/netfilter/nfnetlink.h |
3909 |
+index 4a520d3304a2..cf09ab37b45b 100644 |
3910 |
+--- a/include/linux/netfilter/nfnetlink.h |
3911 |
++++ b/include/linux/netfilter/nfnetlink.h |
3912 |
+@@ -62,18 +62,6 @@ static inline bool lockdep_nfnl_is_held(__u8 subsys_id) |
3913 |
+ } |
3914 |
+ #endif /* CONFIG_PROVE_LOCKING */ |
3915 |
+ |
3916 |
+-/* |
3917 |
+- * nfnl_dereference - fetch RCU pointer when updates are prevented by subsys mutex |
3918 |
+- * |
3919 |
+- * @p: The pointer to read, prior to dereferencing |
3920 |
+- * @ss: The nfnetlink subsystem ID |
3921 |
+- * |
3922 |
+- * Return the value of the specified RCU-protected pointer, but omit |
3923 |
+- * the READ_ONCE(), because caller holds the NFNL subsystem mutex. |
3924 |
+- */ |
3925 |
+-#define nfnl_dereference(p, ss) \ |
3926 |
+- rcu_dereference_protected(p, lockdep_nfnl_is_held(ss)) |
3927 |
+- |
3928 |
+ #define MODULE_ALIAS_NFNL_SUBSYS(subsys) \ |
3929 |
+ MODULE_ALIAS("nfnetlink-subsys-" __stringify(subsys)) |
3930 |
+ |
3931 |
+diff --git a/include/uapi/linux/input-event-codes.h b/include/uapi/linux/input-event-codes.h |
3932 |
+index 53fbae27b280..61a5799b440b 100644 |
3933 |
+--- a/include/uapi/linux/input-event-codes.h |
3934 |
++++ b/include/uapi/linux/input-event-codes.h |
3935 |
+@@ -744,6 +744,15 @@ |
3936 |
+ |
3937 |
+ #define ABS_MISC 0x28 |
3938 |
+ |
3939 |
++/* |
3940 |
++ * 0x2e is reserved and should not be used in input drivers. |
3941 |
++ * It was used by HID as ABS_MISC+6 and userspace needs to detect if |
3942 |
++ * the next ABS_* event is correct or is just ABS_MISC + n. |
3943 |
++ * We define here ABS_RESERVED so userspace can rely on it and detect |
3944 |
++ * the situation described above. |
3945 |
++ */ |
3946 |
++#define ABS_RESERVED 0x2e |
3947 |
++ |
3948 |
+ #define ABS_MT_SLOT 0x2f /* MT slot being modified */ |
3949 |
+ #define ABS_MT_TOUCH_MAJOR 0x30 /* Major axis of touching ellipse */ |
3950 |
+ #define ABS_MT_TOUCH_MINOR 0x31 /* Minor axis (omit if circular) */ |
3951 |
+diff --git a/kernel/dma/direct.c b/kernel/dma/direct.c |
3952 |
+index de87b0282e74..1d2f147f737d 100644 |
3953 |
+--- a/kernel/dma/direct.c |
3954 |
++++ b/kernel/dma/direct.c |
3955 |
+@@ -168,7 +168,12 @@ int dma_direct_map_sg(struct device *dev, struct scatterlist *sgl, int nents, |
3956 |
+ int dma_direct_supported(struct device *dev, u64 mask) |
3957 |
+ { |
3958 |
+ #ifdef CONFIG_ZONE_DMA |
3959 |
+- if (mask < phys_to_dma(dev, DMA_BIT_MASK(ARCH_ZONE_DMA_BITS))) |
3960 |
++ /* |
3961 |
++ * This check needs to be against the actual bit mask value, so |
3962 |
++ * use __phys_to_dma() here so that the SME encryption mask isn't |
3963 |
++ * part of the check. |
3964 |
++ */ |
3965 |
++ if (mask < __phys_to_dma(dev, DMA_BIT_MASK(ARCH_ZONE_DMA_BITS))) |
3966 |
+ return 0; |
3967 |
+ #else |
3968 |
+ /* |
3969 |
+@@ -176,8 +181,12 @@ int dma_direct_supported(struct device *dev, u64 mask) |
3970 |
+ * to be able to satisfy them - either by not supporting more physical |
3971 |
+ * memory, or by providing a ZONE_DMA32. If neither is the case, the |
3972 |
+ * architecture needs to use an IOMMU instead of the direct mapping. |
3973 |
++ * |
3974 |
++ * This check needs to be against the actual bit mask value, so |
3975 |
++ * use __phys_to_dma() here so that the SME encryption mask isn't |
3976 |
++ * part of the check. |
3977 |
+ */ |
3978 |
+- if (mask < phys_to_dma(dev, DMA_BIT_MASK(32))) |
3979 |
++ if (mask < __phys_to_dma(dev, DMA_BIT_MASK(32))) |
3980 |
+ return 0; |
3981 |
+ #endif |
3982 |
+ /* |
3983 |
+diff --git a/kernel/fork.c b/kernel/fork.c |
3984 |
+index f0b58479534f..64ef113e387e 100644 |
3985 |
+--- a/kernel/fork.c |
3986 |
++++ b/kernel/fork.c |
3987 |
+@@ -1784,8 +1784,6 @@ static __latent_entropy struct task_struct *copy_process( |
3988 |
+ |
3989 |
+ posix_cpu_timers_init(p); |
3990 |
+ |
3991 |
+- p->start_time = ktime_get_ns(); |
3992 |
+- p->real_start_time = ktime_get_boot_ns(); |
3993 |
+ p->io_context = NULL; |
3994 |
+ audit_set_context(p, NULL); |
3995 |
+ cgroup_fork(p); |
3996 |
+@@ -1949,6 +1947,17 @@ static __latent_entropy struct task_struct *copy_process( |
3997 |
+ if (retval) |
3998 |
+ goto bad_fork_free_pid; |
3999 |
+ |
4000 |
++ /* |
4001 |
++ * From this point on we must avoid any synchronous user-space |
4002 |
++ * communication until we take the tasklist-lock. In particular, we do |
4003 |
++ * not want user-space to be able to predict the process start-time by |
4004 |
++ * stalling fork(2) after we recorded the start_time but before it is |
4005 |
++ * visible to the system. |
4006 |
++ */ |
4007 |
++ |
4008 |
++ p->start_time = ktime_get_ns(); |
4009 |
++ p->real_start_time = ktime_get_boot_ns(); |
4010 |
++ |
4011 |
+ /* |
4012 |
+ * Make it visible to the rest of the system, but dont wake it up yet. |
4013 |
+ * Need tasklist lock for parent etc handling! |
4014 |
+diff --git a/kernel/memremap.c b/kernel/memremap.c |
4015 |
+index 5b8600d39931..7c5fb8a208ac 100644 |
4016 |
+--- a/kernel/memremap.c |
4017 |
++++ b/kernel/memremap.c |
4018 |
+@@ -122,23 +122,25 @@ static void devm_memremap_pages_release(void *data) |
4019 |
+ resource_size_t align_start, align_size; |
4020 |
+ unsigned long pfn; |
4021 |
+ |
4022 |
++ pgmap->kill(pgmap->ref); |
4023 |
+ for_each_device_pfn(pfn, pgmap) |
4024 |
+ put_page(pfn_to_page(pfn)); |
4025 |
+ |
4026 |
+- if (percpu_ref_tryget_live(pgmap->ref)) { |
4027 |
+- dev_WARN(dev, "%s: page mapping is still live!\n", __func__); |
4028 |
+- percpu_ref_put(pgmap->ref); |
4029 |
+- } |
4030 |
+- |
4031 |
+ /* pages are dead and unused, undo the arch mapping */ |
4032 |
+ align_start = res->start & ~(SECTION_SIZE - 1); |
4033 |
+ align_size = ALIGN(res->start + resource_size(res), SECTION_SIZE) |
4034 |
+ - align_start; |
4035 |
+ |
4036 |
+ mem_hotplug_begin(); |
4037 |
+- arch_remove_memory(align_start, align_size, pgmap->altmap_valid ? |
4038 |
+- &pgmap->altmap : NULL); |
4039 |
+- kasan_remove_zero_shadow(__va(align_start), align_size); |
4040 |
++ if (pgmap->type == MEMORY_DEVICE_PRIVATE) { |
4041 |
++ pfn = align_start >> PAGE_SHIFT; |
4042 |
++ __remove_pages(page_zone(pfn_to_page(pfn)), pfn, |
4043 |
++ align_size >> PAGE_SHIFT, NULL); |
4044 |
++ } else { |
4045 |
++ arch_remove_memory(align_start, align_size, |
4046 |
++ pgmap->altmap_valid ? &pgmap->altmap : NULL); |
4047 |
++ kasan_remove_zero_shadow(__va(align_start), align_size); |
4048 |
++ } |
4049 |
+ mem_hotplug_done(); |
4050 |
+ |
4051 |
+ untrack_pfn(NULL, PHYS_PFN(align_start), align_size); |
4052 |
+@@ -150,7 +152,7 @@ static void devm_memremap_pages_release(void *data) |
4053 |
+ /** |
4054 |
+ * devm_memremap_pages - remap and provide memmap backing for the given resource |
4055 |
+ * @dev: hosting device for @res |
4056 |
+- * @pgmap: pointer to a struct dev_pgmap |
4057 |
++ * @pgmap: pointer to a struct dev_pagemap |
4058 |
+ * |
4059 |
+ * Notes: |
4060 |
+ * 1/ At a minimum the res, ref and type members of @pgmap must be initialized |
4061 |
+@@ -159,11 +161,8 @@ static void devm_memremap_pages_release(void *data) |
4062 |
+ * 2/ The altmap field may optionally be initialized, in which case altmap_valid |
4063 |
+ * must be set to true |
4064 |
+ * |
4065 |
+- * 3/ pgmap.ref must be 'live' on entry and 'dead' before devm_memunmap_pages() |
4066 |
+- * time (or devm release event). The expected order of events is that ref has |
4067 |
+- * been through percpu_ref_kill() before devm_memremap_pages_release(). The |
4068 |
+- * wait for the completion of all references being dropped and |
4069 |
+- * percpu_ref_exit() must occur after devm_memremap_pages_release(). |
4070 |
++ * 3/ pgmap->ref must be 'live' on entry and will be killed at |
4071 |
++ * devm_memremap_pages_release() time, or if this routine fails. |
4072 |
+ * |
4073 |
+ * 4/ res is expected to be a host memory range that could feasibly be |
4074 |
+ * treated as a "System RAM" range, i.e. not a device mmio range, but |
4075 |
+@@ -180,6 +179,9 @@ void *devm_memremap_pages(struct device *dev, struct dev_pagemap *pgmap) |
4076 |
+ int error, nid, is_ram; |
4077 |
+ struct dev_pagemap *conflict_pgmap; |
4078 |
+ |
4079 |
++ if (!pgmap->ref || !pgmap->kill) |
4080 |
++ return ERR_PTR(-EINVAL); |
4081 |
++ |
4082 |
+ align_start = res->start & ~(SECTION_SIZE - 1); |
4083 |
+ align_size = ALIGN(res->start + resource_size(res), SECTION_SIZE) |
4084 |
+ - align_start; |
4085 |
+@@ -202,18 +204,13 @@ void *devm_memremap_pages(struct device *dev, struct dev_pagemap *pgmap) |
4086 |
+ is_ram = region_intersects(align_start, align_size, |
4087 |
+ IORESOURCE_SYSTEM_RAM, IORES_DESC_NONE); |
4088 |
+ |
4089 |
+- if (is_ram == REGION_MIXED) { |
4090 |
+- WARN_ONCE(1, "%s attempted on mixed region %pr\n", |
4091 |
+- __func__, res); |
4092 |
+- return ERR_PTR(-ENXIO); |
4093 |
++ if (is_ram != REGION_DISJOINT) { |
4094 |
++ WARN_ONCE(1, "%s attempted on %s region %pr\n", __func__, |
4095 |
++ is_ram == REGION_MIXED ? "mixed" : "ram", res); |
4096 |
++ error = -ENXIO; |
4097 |
++ goto err_array; |
4098 |
+ } |
4099 |
+ |
4100 |
+- if (is_ram == REGION_INTERSECTS) |
4101 |
+- return __va(res->start); |
4102 |
+- |
4103 |
+- if (!pgmap->ref) |
4104 |
+- return ERR_PTR(-EINVAL); |
4105 |
+- |
4106 |
+ pgmap->dev = dev; |
4107 |
+ |
4108 |
+ mutex_lock(&pgmap_lock); |
4109 |
+@@ -241,17 +238,40 @@ void *devm_memremap_pages(struct device *dev, struct dev_pagemap *pgmap) |
4110 |
+ goto err_pfn_remap; |
4111 |
+ |
4112 |
+ mem_hotplug_begin(); |
4113 |
+- error = kasan_add_zero_shadow(__va(align_start), align_size); |
4114 |
+- if (error) { |
4115 |
+- mem_hotplug_done(); |
4116 |
+- goto err_kasan; |
4117 |
++ |
4118 |
++ /* |
4119 |
++ * For device private memory we call add_pages() as we only need to |
4120 |
++ * allocate and initialize struct page for the device memory. More- |
4121 |
++ * over the device memory is un-accessible thus we do not want to |
4122 |
++ * create a linear mapping for the memory like arch_add_memory() |
4123 |
++ * would do. |
4124 |
++ * |
4125 |
++ * For all other device memory types, which are accessible by |
4126 |
++ * the CPU, we do want the linear mapping and thus use |
4127 |
++ * arch_add_memory(). |
4128 |
++ */ |
4129 |
++ if (pgmap->type == MEMORY_DEVICE_PRIVATE) { |
4130 |
++ error = add_pages(nid, align_start >> PAGE_SHIFT, |
4131 |
++ align_size >> PAGE_SHIFT, NULL, false); |
4132 |
++ } else { |
4133 |
++ error = kasan_add_zero_shadow(__va(align_start), align_size); |
4134 |
++ if (error) { |
4135 |
++ mem_hotplug_done(); |
4136 |
++ goto err_kasan; |
4137 |
++ } |
4138 |
++ |
4139 |
++ error = arch_add_memory(nid, align_start, align_size, altmap, |
4140 |
++ false); |
4141 |
++ } |
4142 |
++ |
4143 |
++ if (!error) { |
4144 |
++ struct zone *zone; |
4145 |
++ |
4146 |
++ zone = &NODE_DATA(nid)->node_zones[ZONE_DEVICE]; |
4147 |
++ move_pfn_range_to_zone(zone, align_start >> PAGE_SHIFT, |
4148 |
++ align_size >> PAGE_SHIFT, altmap); |
4149 |
+ } |
4150 |
+ |
4151 |
+- error = arch_add_memory(nid, align_start, align_size, altmap, false); |
4152 |
+- if (!error) |
4153 |
+- move_pfn_range_to_zone(&NODE_DATA(nid)->node_zones[ZONE_DEVICE], |
4154 |
+- align_start >> PAGE_SHIFT, |
4155 |
+- align_size >> PAGE_SHIFT, altmap); |
4156 |
+ mem_hotplug_done(); |
4157 |
+ if (error) |
4158 |
+ goto err_add_memory; |
4159 |
+@@ -270,7 +290,10 @@ void *devm_memremap_pages(struct device *dev, struct dev_pagemap *pgmap) |
4160 |
+ percpu_ref_get(pgmap->ref); |
4161 |
+ } |
4162 |
+ |
4163 |
+- devm_add_action(dev, devm_memremap_pages_release, pgmap); |
4164 |
++ error = devm_add_action_or_reset(dev, devm_memremap_pages_release, |
4165 |
++ pgmap); |
4166 |
++ if (error) |
4167 |
++ return ERR_PTR(error); |
4168 |
+ |
4169 |
+ return __va(res->start); |
4170 |
+ |
4171 |
+@@ -281,9 +304,11 @@ void *devm_memremap_pages(struct device *dev, struct dev_pagemap *pgmap) |
4172 |
+ err_pfn_remap: |
4173 |
+ err_radix: |
4174 |
+ pgmap_radix_release(res, pgoff); |
4175 |
++ err_array: |
4176 |
++ pgmap->kill(pgmap->ref); |
4177 |
+ return ERR_PTR(error); |
4178 |
+ } |
4179 |
+-EXPORT_SYMBOL(devm_memremap_pages); |
4180 |
++EXPORT_SYMBOL_GPL(devm_memremap_pages); |
4181 |
+ |
4182 |
+ unsigned long vmem_altmap_offset(struct vmem_altmap *altmap) |
4183 |
+ { |
4184 |
+diff --git a/kernel/pid.c b/kernel/pid.c |
4185 |
+index cdf63e53a014..b88fe5e494cc 100644 |
4186 |
+--- a/kernel/pid.c |
4187 |
++++ b/kernel/pid.c |
4188 |
+@@ -233,8 +233,10 @@ out_unlock: |
4189 |
+ |
4190 |
+ out_free: |
4191 |
+ spin_lock_irq(&pidmap_lock); |
4192 |
+- while (++i <= ns->level) |
4193 |
+- idr_remove(&ns->idr, (pid->numbers + i)->nr); |
4194 |
++ while (++i <= ns->level) { |
4195 |
++ upid = pid->numbers + i; |
4196 |
++ idr_remove(&upid->ns->idr, upid->nr); |
4197 |
++ } |
4198 |
+ |
4199 |
+ /* On failure to allocate the first pid, reset the state */ |
4200 |
+ if (ns->pid_allocated == PIDNS_ADDING) |
4201 |
+diff --git a/kernel/rcu/srcutree.c b/kernel/rcu/srcutree.c |
4202 |
+index 6c9866a854b1..1ff17e297f0c 100644 |
4203 |
+--- a/kernel/rcu/srcutree.c |
4204 |
++++ b/kernel/rcu/srcutree.c |
4205 |
+@@ -448,10 +448,12 @@ static void srcu_gp_start(struct srcu_struct *sp) |
4206 |
+ |
4207 |
+ lockdep_assert_held(&ACCESS_PRIVATE(sp, lock)); |
4208 |
+ WARN_ON_ONCE(ULONG_CMP_GE(sp->srcu_gp_seq, sp->srcu_gp_seq_needed)); |
4209 |
++ spin_lock_rcu_node(sdp); /* Interrupts already disabled. */ |
4210 |
+ rcu_segcblist_advance(&sdp->srcu_cblist, |
4211 |
+ rcu_seq_current(&sp->srcu_gp_seq)); |
4212 |
+ (void)rcu_segcblist_accelerate(&sdp->srcu_cblist, |
4213 |
+ rcu_seq_snap(&sp->srcu_gp_seq)); |
4214 |
++ spin_unlock_rcu_node(sdp); /* Interrupts remain disabled. */ |
4215 |
+ smp_mb(); /* Order prior store to ->srcu_gp_seq_needed vs. GP start. */ |
4216 |
+ rcu_seq_start(&sp->srcu_gp_seq); |
4217 |
+ state = rcu_seq_state(READ_ONCE(sp->srcu_gp_seq)); |
4218 |
+diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c |
4219 |
+index eabbf6b10b44..7137bc343b4a 100644 |
4220 |
+--- a/kernel/sched/fair.c |
4221 |
++++ b/kernel/sched/fair.c |
4222 |
+@@ -352,10 +352,9 @@ static inline void list_del_leaf_cfs_rq(struct cfs_rq *cfs_rq) |
4223 |
+ } |
4224 |
+ } |
4225 |
+ |
4226 |
+-/* Iterate thr' all leaf cfs_rq's on a runqueue */ |
4227 |
+-#define for_each_leaf_cfs_rq_safe(rq, cfs_rq, pos) \ |
4228 |
+- list_for_each_entry_safe(cfs_rq, pos, &rq->leaf_cfs_rq_list, \ |
4229 |
+- leaf_cfs_rq_list) |
4230 |
++/* Iterate through all leaf cfs_rq's on a runqueue: */ |
4231 |
++#define for_each_leaf_cfs_rq(rq, cfs_rq) \ |
4232 |
++ list_for_each_entry_rcu(cfs_rq, &rq->leaf_cfs_rq_list, leaf_cfs_rq_list) |
4233 |
+ |
4234 |
+ /* Do the two (enqueued) entities belong to the same group ? */ |
4235 |
+ static inline struct cfs_rq * |
4236 |
+@@ -447,8 +446,8 @@ static inline void list_del_leaf_cfs_rq(struct cfs_rq *cfs_rq) |
4237 |
+ { |
4238 |
+ } |
4239 |
+ |
4240 |
+-#define for_each_leaf_cfs_rq_safe(rq, cfs_rq, pos) \ |
4241 |
+- for (cfs_rq = &rq->cfs, pos = NULL; cfs_rq; cfs_rq = pos) |
4242 |
++#define for_each_leaf_cfs_rq(rq, cfs_rq) \ |
4243 |
++ for (cfs_rq = &rq->cfs; cfs_rq; cfs_rq = NULL) |
4244 |
+ |
4245 |
+ static inline struct sched_entity *parent_entity(struct sched_entity *se) |
4246 |
+ { |
4247 |
+@@ -7371,27 +7370,10 @@ static inline bool others_have_blocked(struct rq *rq) |
4248 |
+ |
4249 |
+ #ifdef CONFIG_FAIR_GROUP_SCHED |
4250 |
+ |
4251 |
+-static inline bool cfs_rq_is_decayed(struct cfs_rq *cfs_rq) |
4252 |
+-{ |
4253 |
+- if (cfs_rq->load.weight) |
4254 |
+- return false; |
4255 |
+- |
4256 |
+- if (cfs_rq->avg.load_sum) |
4257 |
+- return false; |
4258 |
+- |
4259 |
+- if (cfs_rq->avg.util_sum) |
4260 |
+- return false; |
4261 |
+- |
4262 |
+- if (cfs_rq->avg.runnable_load_sum) |
4263 |
+- return false; |
4264 |
+- |
4265 |
+- return true; |
4266 |
+-} |
4267 |
+- |
4268 |
+ static void update_blocked_averages(int cpu) |
4269 |
+ { |
4270 |
+ struct rq *rq = cpu_rq(cpu); |
4271 |
+- struct cfs_rq *cfs_rq, *pos; |
4272 |
++ struct cfs_rq *cfs_rq; |
4273 |
+ const struct sched_class *curr_class; |
4274 |
+ struct rq_flags rf; |
4275 |
+ bool done = true; |
4276 |
+@@ -7403,7 +7385,7 @@ static void update_blocked_averages(int cpu) |
4277 |
+ * Iterates the task_group tree in a bottom up fashion, see |
4278 |
+ * list_add_leaf_cfs_rq() for details. |
4279 |
+ */ |
4280 |
+- for_each_leaf_cfs_rq_safe(rq, cfs_rq, pos) { |
4281 |
++ for_each_leaf_cfs_rq(rq, cfs_rq) { |
4282 |
+ struct sched_entity *se; |
4283 |
+ |
4284 |
+ /* throttled entities do not contribute to load */ |
4285 |
+@@ -7418,13 +7400,6 @@ static void update_blocked_averages(int cpu) |
4286 |
+ if (se && !skip_blocked_update(se)) |
4287 |
+ update_load_avg(cfs_rq_of(se), se, 0); |
4288 |
+ |
4289 |
+- /* |
4290 |
+- * There can be a lot of idle CPU cgroups. Don't let fully |
4291 |
+- * decayed cfs_rqs linger on the list. |
4292 |
+- */ |
4293 |
+- if (cfs_rq_is_decayed(cfs_rq)) |
4294 |
+- list_del_leaf_cfs_rq(cfs_rq); |
4295 |
+- |
4296 |
+ /* Don't need periodic decay once load/util_avg are null */ |
4297 |
+ if (cfs_rq_has_blocked(cfs_rq)) |
4298 |
+ done = false; |
4299 |
+@@ -10196,10 +10171,10 @@ const struct sched_class fair_sched_class = { |
4300 |
+ #ifdef CONFIG_SCHED_DEBUG |
4301 |
+ void print_cfs_stats(struct seq_file *m, int cpu) |
4302 |
+ { |
4303 |
+- struct cfs_rq *cfs_rq, *pos; |
4304 |
++ struct cfs_rq *cfs_rq; |
4305 |
+ |
4306 |
+ rcu_read_lock(); |
4307 |
+- for_each_leaf_cfs_rq_safe(cpu_rq(cpu), cfs_rq, pos) |
4308 |
++ for_each_leaf_cfs_rq(cpu_rq(cpu), cfs_rq) |
4309 |
+ print_cfs_rq(m, cpu, cfs_rq); |
4310 |
+ rcu_read_unlock(); |
4311 |
+ } |
4312 |
+diff --git a/lib/raid6/Makefile b/lib/raid6/Makefile |
4313 |
+index 2f8b61dfd9b0..7ed43eaa02ef 100644 |
4314 |
+--- a/lib/raid6/Makefile |
4315 |
++++ b/lib/raid6/Makefile |
4316 |
+@@ -18,6 +18,21 @@ quiet_cmd_unroll = UNROLL $@ |
4317 |
+ |
4318 |
+ ifeq ($(CONFIG_ALTIVEC),y) |
4319 |
+ altivec_flags := -maltivec $(call cc-option,-mabi=altivec) |
4320 |
++ |
4321 |
++ifdef CONFIG_CC_IS_CLANG |
4322 |
++# clang ppc port does not yet support -maltivec when -msoft-float is |
4323 |
++# enabled. A future release of clang will resolve this |
4324 |
++# https://bugs.llvm.org/show_bug.cgi?id=31177 |
4325 |
++CFLAGS_REMOVE_altivec1.o += -msoft-float |
4326 |
++CFLAGS_REMOVE_altivec2.o += -msoft-float |
4327 |
++CFLAGS_REMOVE_altivec4.o += -msoft-float |
4328 |
++CFLAGS_REMOVE_altivec8.o += -msoft-float |
4329 |
++CFLAGS_REMOVE_altivec8.o += -msoft-float |
4330 |
++CFLAGS_REMOVE_vpermxor1.o += -msoft-float |
4331 |
++CFLAGS_REMOVE_vpermxor2.o += -msoft-float |
4332 |
++CFLAGS_REMOVE_vpermxor4.o += -msoft-float |
4333 |
++CFLAGS_REMOVE_vpermxor8.o += -msoft-float |
4334 |
++endif |
4335 |
+ endif |
4336 |
+ |
4337 |
+ # The GCC option -ffreestanding is required in order to compile code containing |
4338 |
+diff --git a/lib/test_debug_virtual.c b/lib/test_debug_virtual.c |
4339 |
+index d5a06addeb27..bf864c73e462 100644 |
4340 |
+--- a/lib/test_debug_virtual.c |
4341 |
++++ b/lib/test_debug_virtual.c |
4342 |
+@@ -5,6 +5,7 @@ |
4343 |
+ #include <linux/vmalloc.h> |
4344 |
+ #include <linux/slab.h> |
4345 |
+ #include <linux/sizes.h> |
4346 |
++#include <linux/io.h> |
4347 |
+ |
4348 |
+ #include <asm/page.h> |
4349 |
+ #ifdef CONFIG_MIPS |
4350 |
+diff --git a/mm/hmm.c b/mm/hmm.c |
4351 |
+index 90193a7fabce..57f0d2a4ff34 100644 |
4352 |
+--- a/mm/hmm.c |
4353 |
++++ b/mm/hmm.c |
4354 |
+@@ -945,7 +945,6 @@ static void hmm_devmem_ref_exit(void *data) |
4355 |
+ |
4356 |
+ devmem = container_of(ref, struct hmm_devmem, ref); |
4357 |
+ percpu_ref_exit(ref); |
4358 |
+- devm_remove_action(devmem->device, &hmm_devmem_ref_exit, data); |
4359 |
+ } |
4360 |
+ |
4361 |
+ static void hmm_devmem_ref_kill(void *data) |
4362 |
+@@ -956,7 +955,6 @@ static void hmm_devmem_ref_kill(void *data) |
4363 |
+ devmem = container_of(ref, struct hmm_devmem, ref); |
4364 |
+ percpu_ref_kill(ref); |
4365 |
+ wait_for_completion(&devmem->completion); |
4366 |
+- devm_remove_action(devmem->device, &hmm_devmem_ref_kill, data); |
4367 |
+ } |
4368 |
+ |
4369 |
+ static int hmm_devmem_fault(struct vm_area_struct *vma, |
4370 |
+@@ -994,7 +992,7 @@ static void hmm_devmem_radix_release(struct resource *resource) |
4371 |
+ mutex_unlock(&hmm_devmem_lock); |
4372 |
+ } |
4373 |
+ |
4374 |
+-static void hmm_devmem_release(struct device *dev, void *data) |
4375 |
++static void hmm_devmem_release(void *data) |
4376 |
+ { |
4377 |
+ struct hmm_devmem *devmem = data; |
4378 |
+ struct resource *resource = devmem->resource; |
4379 |
+@@ -1002,11 +1000,6 @@ static void hmm_devmem_release(struct device *dev, void *data) |
4380 |
+ struct zone *zone; |
4381 |
+ struct page *page; |
4382 |
+ |
4383 |
+- if (percpu_ref_tryget_live(&devmem->ref)) { |
4384 |
+- dev_WARN(dev, "%s: page mapping is still live!\n", __func__); |
4385 |
+- percpu_ref_put(&devmem->ref); |
4386 |
+- } |
4387 |
+- |
4388 |
+ /* pages are dead and unused, undo the arch mapping */ |
4389 |
+ start_pfn = (resource->start & ~(PA_SECTION_SIZE - 1)) >> PAGE_SHIFT; |
4390 |
+ npages = ALIGN(resource_size(resource), PA_SECTION_SIZE) >> PAGE_SHIFT; |
4391 |
+@@ -1130,19 +1123,6 @@ error: |
4392 |
+ return ret; |
4393 |
+ } |
4394 |
+ |
4395 |
+-static int hmm_devmem_match(struct device *dev, void *data, void *match_data) |
4396 |
+-{ |
4397 |
+- struct hmm_devmem *devmem = data; |
4398 |
+- |
4399 |
+- return devmem->resource == match_data; |
4400 |
+-} |
4401 |
+- |
4402 |
+-static void hmm_devmem_pages_remove(struct hmm_devmem *devmem) |
4403 |
+-{ |
4404 |
+- devres_release(devmem->device, &hmm_devmem_release, |
4405 |
+- &hmm_devmem_match, devmem->resource); |
4406 |
+-} |
4407 |
+- |
4408 |
+ /* |
4409 |
+ * hmm_devmem_add() - hotplug ZONE_DEVICE memory for device memory |
4410 |
+ * |
4411 |
+@@ -1170,8 +1150,7 @@ struct hmm_devmem *hmm_devmem_add(const struct hmm_devmem_ops *ops, |
4412 |
+ |
4413 |
+ dev_pagemap_get_ops(); |
4414 |
+ |
4415 |
+- devmem = devres_alloc_node(&hmm_devmem_release, sizeof(*devmem), |
4416 |
+- GFP_KERNEL, dev_to_node(device)); |
4417 |
++ devmem = devm_kzalloc(device, sizeof(*devmem), GFP_KERNEL); |
4418 |
+ if (!devmem) |
4419 |
+ return ERR_PTR(-ENOMEM); |
4420 |
+ |
4421 |
+@@ -1185,11 +1164,11 @@ struct hmm_devmem *hmm_devmem_add(const struct hmm_devmem_ops *ops, |
4422 |
+ ret = percpu_ref_init(&devmem->ref, &hmm_devmem_ref_release, |
4423 |
+ 0, GFP_KERNEL); |
4424 |
+ if (ret) |
4425 |
+- goto error_percpu_ref; |
4426 |
++ return ERR_PTR(ret); |
4427 |
+ |
4428 |
+- ret = devm_add_action(device, hmm_devmem_ref_exit, &devmem->ref); |
4429 |
++ ret = devm_add_action_or_reset(device, hmm_devmem_ref_exit, &devmem->ref); |
4430 |
+ if (ret) |
4431 |
+- goto error_devm_add_action; |
4432 |
++ return ERR_PTR(ret); |
4433 |
+ |
4434 |
+ size = ALIGN(size, PA_SECTION_SIZE); |
4435 |
+ addr = min((unsigned long)iomem_resource.end, |
4436 |
+@@ -1209,16 +1188,12 @@ struct hmm_devmem *hmm_devmem_add(const struct hmm_devmem_ops *ops, |
4437 |
+ |
4438 |
+ devmem->resource = devm_request_mem_region(device, addr, size, |
4439 |
+ dev_name(device)); |
4440 |
+- if (!devmem->resource) { |
4441 |
+- ret = -ENOMEM; |
4442 |
+- goto error_no_resource; |
4443 |
+- } |
4444 |
++ if (!devmem->resource) |
4445 |
++ return ERR_PTR(-ENOMEM); |
4446 |
+ break; |
4447 |
+ } |
4448 |
+- if (!devmem->resource) { |
4449 |
+- ret = -ERANGE; |
4450 |
+- goto error_no_resource; |
4451 |
+- } |
4452 |
++ if (!devmem->resource) |
4453 |
++ return ERR_PTR(-ERANGE); |
4454 |
+ |
4455 |
+ devmem->resource->desc = IORES_DESC_DEVICE_PRIVATE_MEMORY; |
4456 |
+ devmem->pfn_first = devmem->resource->start >> PAGE_SHIFT; |
4457 |
+@@ -1227,30 +1202,15 @@ struct hmm_devmem *hmm_devmem_add(const struct hmm_devmem_ops *ops, |
4458 |
+ |
4459 |
+ ret = hmm_devmem_pages_create(devmem); |
4460 |
+ if (ret) |
4461 |
+- goto error_pages; |
4462 |
+- |
4463 |
+- devres_add(device, devmem); |
4464 |
++ return ERR_PTR(ret); |
4465 |
+ |
4466 |
+- ret = devm_add_action(device, hmm_devmem_ref_kill, &devmem->ref); |
4467 |
+- if (ret) { |
4468 |
+- hmm_devmem_remove(devmem); |
4469 |
++ ret = devm_add_action_or_reset(device, hmm_devmem_release, devmem); |
4470 |
++ if (ret) |
4471 |
+ return ERR_PTR(ret); |
4472 |
+- } |
4473 |
+ |
4474 |
+ return devmem; |
4475 |
+- |
4476 |
+-error_pages: |
4477 |
+- devm_release_mem_region(device, devmem->resource->start, |
4478 |
+- resource_size(devmem->resource)); |
4479 |
+-error_no_resource: |
4480 |
+-error_devm_add_action: |
4481 |
+- hmm_devmem_ref_kill(&devmem->ref); |
4482 |
+- hmm_devmem_ref_exit(&devmem->ref); |
4483 |
+-error_percpu_ref: |
4484 |
+- devres_free(devmem); |
4485 |
+- return ERR_PTR(ret); |
4486 |
+ } |
4487 |
+-EXPORT_SYMBOL(hmm_devmem_add); |
4488 |
++EXPORT_SYMBOL_GPL(hmm_devmem_add); |
4489 |
+ |
4490 |
+ struct hmm_devmem *hmm_devmem_add_resource(const struct hmm_devmem_ops *ops, |
4491 |
+ struct device *device, |
4492 |
+@@ -1264,8 +1224,7 @@ struct hmm_devmem *hmm_devmem_add_resource(const struct hmm_devmem_ops *ops, |
4493 |
+ |
4494 |
+ dev_pagemap_get_ops(); |
4495 |
+ |
4496 |
+- devmem = devres_alloc_node(&hmm_devmem_release, sizeof(*devmem), |
4497 |
+- GFP_KERNEL, dev_to_node(device)); |
4498 |
++ devmem = devm_kzalloc(device, sizeof(*devmem), GFP_KERNEL); |
4499 |
+ if (!devmem) |
4500 |
+ return ERR_PTR(-ENOMEM); |
4501 |
+ |
4502 |
+@@ -1279,12 +1238,12 @@ struct hmm_devmem *hmm_devmem_add_resource(const struct hmm_devmem_ops *ops, |
4503 |
+ ret = percpu_ref_init(&devmem->ref, &hmm_devmem_ref_release, |
4504 |
+ 0, GFP_KERNEL); |
4505 |
+ if (ret) |
4506 |
+- goto error_percpu_ref; |
4507 |
++ return ERR_PTR(ret); |
4508 |
+ |
4509 |
+- ret = devm_add_action(device, hmm_devmem_ref_exit, &devmem->ref); |
4510 |
++ ret = devm_add_action_or_reset(device, hmm_devmem_ref_exit, |
4511 |
++ &devmem->ref); |
4512 |
+ if (ret) |
4513 |
+- goto error_devm_add_action; |
4514 |
+- |
4515 |
++ return ERR_PTR(ret); |
4516 |
+ |
4517 |
+ devmem->pfn_first = devmem->resource->start >> PAGE_SHIFT; |
4518 |
+ devmem->pfn_last = devmem->pfn_first + |
4519 |
+@@ -1292,58 +1251,20 @@ struct hmm_devmem *hmm_devmem_add_resource(const struct hmm_devmem_ops *ops, |
4520 |
+ |
4521 |
+ ret = hmm_devmem_pages_create(devmem); |
4522 |
+ if (ret) |
4523 |
+- goto error_devm_add_action; |
4524 |
++ return ERR_PTR(ret); |
4525 |
+ |
4526 |
+- devres_add(device, devmem); |
4527 |
++ ret = devm_add_action_or_reset(device, hmm_devmem_release, devmem); |
4528 |
++ if (ret) |
4529 |
++ return ERR_PTR(ret); |
4530 |
+ |
4531 |
+- ret = devm_add_action(device, hmm_devmem_ref_kill, &devmem->ref); |
4532 |
+- if (ret) { |
4533 |
+- hmm_devmem_remove(devmem); |
4534 |
++ ret = devm_add_action_or_reset(device, hmm_devmem_ref_kill, |
4535 |
++ &devmem->ref); |
4536 |
++ if (ret) |
4537 |
+ return ERR_PTR(ret); |
4538 |
+- } |
4539 |
+ |
4540 |
+ return devmem; |
4541 |
+- |
4542 |
+-error_devm_add_action: |
4543 |
+- hmm_devmem_ref_kill(&devmem->ref); |
4544 |
+- hmm_devmem_ref_exit(&devmem->ref); |
4545 |
+-error_percpu_ref: |
4546 |
+- devres_free(devmem); |
4547 |
+- return ERR_PTR(ret); |
4548 |
+-} |
4549 |
+-EXPORT_SYMBOL(hmm_devmem_add_resource); |
4550 |
+- |
4551 |
+-/* |
4552 |
+- * hmm_devmem_remove() - remove device memory (kill and free ZONE_DEVICE) |
4553 |
+- * |
4554 |
+- * @devmem: hmm_devmem struct use to track and manage the ZONE_DEVICE memory |
4555 |
+- * |
4556 |
+- * This will hot-unplug memory that was hotplugged by hmm_devmem_add on behalf |
4557 |
+- * of the device driver. It will free struct page and remove the resource that |
4558 |
+- * reserved the physical address range for this device memory. |
4559 |
+- */ |
4560 |
+-void hmm_devmem_remove(struct hmm_devmem *devmem) |
4561 |
+-{ |
4562 |
+- resource_size_t start, size; |
4563 |
+- struct device *device; |
4564 |
+- bool cdm = false; |
4565 |
+- |
4566 |
+- if (!devmem) |
4567 |
+- return; |
4568 |
+- |
4569 |
+- device = devmem->device; |
4570 |
+- start = devmem->resource->start; |
4571 |
+- size = resource_size(devmem->resource); |
4572 |
+- |
4573 |
+- cdm = devmem->resource->desc == IORES_DESC_DEVICE_PUBLIC_MEMORY; |
4574 |
+- hmm_devmem_ref_kill(&devmem->ref); |
4575 |
+- hmm_devmem_ref_exit(&devmem->ref); |
4576 |
+- hmm_devmem_pages_remove(devmem); |
4577 |
+- |
4578 |
+- if (!cdm) |
4579 |
+- devm_release_mem_region(device, start, size); |
4580 |
+ } |
4581 |
+-EXPORT_SYMBOL(hmm_devmem_remove); |
4582 |
++EXPORT_SYMBOL_GPL(hmm_devmem_add_resource); |
4583 |
+ |
4584 |
+ /* |
4585 |
+ * A device driver that wants to handle multiple devices memory through a |
4586 |
+diff --git a/mm/memcontrol.c b/mm/memcontrol.c |
4587 |
+index e79cb59552d9..9518aefd8cbb 100644 |
4588 |
+--- a/mm/memcontrol.c |
4589 |
++++ b/mm/memcontrol.c |
4590 |
+@@ -1666,6 +1666,9 @@ enum oom_status { |
4591 |
+ |
4592 |
+ static enum oom_status mem_cgroup_oom(struct mem_cgroup *memcg, gfp_t mask, int order) |
4593 |
+ { |
4594 |
++ enum oom_status ret; |
4595 |
++ bool locked; |
4596 |
++ |
4597 |
+ if (order > PAGE_ALLOC_COSTLY_ORDER) |
4598 |
+ return OOM_SKIPPED; |
4599 |
+ |
4600 |
+@@ -1698,10 +1701,23 @@ static enum oom_status mem_cgroup_oom(struct mem_cgroup *memcg, gfp_t mask, int |
4601 |
+ return OOM_ASYNC; |
4602 |
+ } |
4603 |
+ |
4604 |
++ mem_cgroup_mark_under_oom(memcg); |
4605 |
++ |
4606 |
++ locked = mem_cgroup_oom_trylock(memcg); |
4607 |
++ |
4608 |
++ if (locked) |
4609 |
++ mem_cgroup_oom_notify(memcg); |
4610 |
++ |
4611 |
++ mem_cgroup_unmark_under_oom(memcg); |
4612 |
+ if (mem_cgroup_out_of_memory(memcg, mask, order)) |
4613 |
+- return OOM_SUCCESS; |
4614 |
++ ret = OOM_SUCCESS; |
4615 |
++ else |
4616 |
++ ret = OOM_FAILED; |
4617 |
+ |
4618 |
+- return OOM_FAILED; |
4619 |
++ if (locked) |
4620 |
++ mem_cgroup_oom_unlock(memcg); |
4621 |
++ |
4622 |
++ return ret; |
4623 |
+ } |
4624 |
+ |
4625 |
+ /** |
4626 |
+diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c |
4627 |
+index f3f919728f5c..8a136ffda370 100644 |
4628 |
+--- a/mm/memory_hotplug.c |
4629 |
++++ b/mm/memory_hotplug.c |
4630 |
+@@ -35,6 +35,7 @@ |
4631 |
+ #include <linux/memblock.h> |
4632 |
+ #include <linux/bootmem.h> |
4633 |
+ #include <linux/compaction.h> |
4634 |
++#include <linux/rmap.h> |
4635 |
+ |
4636 |
+ #include <asm/tlbflush.h> |
4637 |
+ |
4638 |
+@@ -1393,6 +1394,21 @@ do_migrate_range(unsigned long start_pfn, unsigned long end_pfn) |
4639 |
+ pfn = page_to_pfn(compound_head(page)) |
4640 |
+ + hpage_nr_pages(page) - 1; |
4641 |
+ |
4642 |
++ /* |
4643 |
++ * HWPoison pages have elevated reference counts so the migration would |
4644 |
++ * fail on them. It also doesn't make any sense to migrate them in the |
4645 |
++ * first place. Still try to unmap such a page in case it is still mapped |
4646 |
++ * (e.g. current hwpoison implementation doesn't unmap KSM pages but keep |
4647 |
++ * the unmap as the catch all safety net). |
4648 |
++ */ |
4649 |
++ if (PageHWPoison(page)) { |
4650 |
++ if (WARN_ON(PageLRU(page))) |
4651 |
++ isolate_lru_page(page); |
4652 |
++ if (page_mapped(page)) |
4653 |
++ try_to_unmap(page, TTU_IGNORE_MLOCK | TTU_IGNORE_ACCESS); |
4654 |
++ continue; |
4655 |
++ } |
4656 |
++ |
4657 |
+ if (!get_page_unless_zero(page)) |
4658 |
+ continue; |
4659 |
+ /* |
4660 |
+diff --git a/mm/swapfile.c b/mm/swapfile.c |
4661 |
+index 8810a6d7d67f..67aaf7ae22ff 100644 |
4662 |
+--- a/mm/swapfile.c |
4663 |
++++ b/mm/swapfile.c |
4664 |
+@@ -2208,7 +2208,8 @@ int try_to_unuse(unsigned int type, bool frontswap, |
4665 |
+ */ |
4666 |
+ if (PageSwapCache(page) && |
4667 |
+ likely(page_private(page) == entry.val) && |
4668 |
+- !page_swapped(page)) |
4669 |
++ (!PageTransCompound(page) || |
4670 |
++ !swap_page_trans_huge_swapped(si, entry))) |
4671 |
+ delete_from_swap_cache(compound_head(page)); |
4672 |
+ |
4673 |
+ /* |
4674 |
+diff --git a/net/9p/client.c b/net/9p/client.c |
4675 |
+index deae53a7dffc..75b7bf7c7f07 100644 |
4676 |
+--- a/net/9p/client.c |
4677 |
++++ b/net/9p/client.c |
4678 |
+@@ -181,6 +181,12 @@ static int parse_opts(char *opts, struct p9_client *clnt) |
4679 |
+ ret = r; |
4680 |
+ continue; |
4681 |
+ } |
4682 |
++ if (option < 4096) { |
4683 |
++ p9_debug(P9_DEBUG_ERROR, |
4684 |
++ "msize should be at least 4k\n"); |
4685 |
++ ret = -EINVAL; |
4686 |
++ continue; |
4687 |
++ } |
4688 |
+ clnt->msize = option; |
4689 |
+ break; |
4690 |
+ case Opt_trans: |
4691 |
+@@ -993,10 +999,18 @@ static int p9_client_version(struct p9_client *c) |
4692 |
+ else if (!strncmp(version, "9P2000", 6)) |
4693 |
+ c->proto_version = p9_proto_legacy; |
4694 |
+ else { |
4695 |
++ p9_debug(P9_DEBUG_ERROR, |
4696 |
++ "server returned an unknown version: %s\n", version); |
4697 |
+ err = -EREMOTEIO; |
4698 |
+ goto error; |
4699 |
+ } |
4700 |
+ |
4701 |
++ if (msize < 4096) { |
4702 |
++ p9_debug(P9_DEBUG_ERROR, |
4703 |
++ "server returned a msize < 4096: %d\n", msize); |
4704 |
++ err = -EREMOTEIO; |
4705 |
++ goto error; |
4706 |
++ } |
4707 |
+ if (msize < c->msize) |
4708 |
+ c->msize = msize; |
4709 |
+ |
4710 |
+@@ -1055,6 +1069,13 @@ struct p9_client *p9_client_create(const char *dev_name, char *options) |
4711 |
+ if (clnt->msize > clnt->trans_mod->maxsize) |
4712 |
+ clnt->msize = clnt->trans_mod->maxsize; |
4713 |
+ |
4714 |
++ if (clnt->msize < 4096) { |
4715 |
++ p9_debug(P9_DEBUG_ERROR, |
4716 |
++ "Please specify a msize of at least 4k\n"); |
4717 |
++ err = -EINVAL; |
4718 |
++ goto free_client; |
4719 |
++ } |
4720 |
++ |
4721 |
+ err = p9_client_version(clnt); |
4722 |
+ if (err) |
4723 |
+ goto close_trans; |
4724 |
+diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c |
4725 |
+index 5f3c81e705c7..3a0171a65db3 100644 |
4726 |
+--- a/net/mac80211/iface.c |
4727 |
++++ b/net/mac80211/iface.c |
4728 |
+@@ -7,6 +7,7 @@ |
4729 |
+ * Copyright 2008, Johannes Berg <johannes@××××××××××××.net> |
4730 |
+ * Copyright 2013-2014 Intel Mobile Communications GmbH |
4731 |
+ * Copyright (c) 2016 Intel Deutschland GmbH |
4732 |
++ * Copyright (C) 2018 Intel Corporation |
4733 |
+ * |
4734 |
+ * This program is free software; you can redistribute it and/or modify |
4735 |
+ * it under the terms of the GNU General Public License version 2 as |
4736 |
+@@ -1951,6 +1952,8 @@ void ieee80211_remove_interfaces(struct ieee80211_local *local) |
4737 |
+ WARN(local->open_count, "%s: open count remains %d\n", |
4738 |
+ wiphy_name(local->hw.wiphy), local->open_count); |
4739 |
+ |
4740 |
++ ieee80211_txq_teardown_flows(local); |
4741 |
++ |
4742 |
+ mutex_lock(&local->iflist_mtx); |
4743 |
+ list_for_each_entry_safe(sdata, tmp, &local->interfaces, list) { |
4744 |
+ list_del(&sdata->list); |
4745 |
+diff --git a/net/mac80211/main.c b/net/mac80211/main.c |
4746 |
+index 513627896204..68db2a356443 100644 |
4747 |
+--- a/net/mac80211/main.c |
4748 |
++++ b/net/mac80211/main.c |
4749 |
+@@ -1198,7 +1198,6 @@ int ieee80211_register_hw(struct ieee80211_hw *hw) |
4750 |
+ rtnl_unlock(); |
4751 |
+ ieee80211_led_exit(local); |
4752 |
+ ieee80211_wep_free(local); |
4753 |
+- ieee80211_txq_teardown_flows(local); |
4754 |
+ fail_flows: |
4755 |
+ destroy_workqueue(local->workqueue); |
4756 |
+ fail_workqueue: |
4757 |
+@@ -1224,7 +1223,6 @@ void ieee80211_unregister_hw(struct ieee80211_hw *hw) |
4758 |
+ #if IS_ENABLED(CONFIG_IPV6) |
4759 |
+ unregister_inet6addr_notifier(&local->ifa6_notifier); |
4760 |
+ #endif |
4761 |
+- ieee80211_txq_teardown_flows(local); |
4762 |
+ |
4763 |
+ rtnl_lock(); |
4764 |
+ |
4765 |
+diff --git a/net/mac80211/status.c b/net/mac80211/status.c |
4766 |
+index 7fa10d06cc51..534a604b75c2 100644 |
4767 |
+--- a/net/mac80211/status.c |
4768 |
++++ b/net/mac80211/status.c |
4769 |
+@@ -556,6 +556,11 @@ static void ieee80211_report_used_skb(struct ieee80211_local *local, |
4770 |
+ } |
4771 |
+ |
4772 |
+ ieee80211_led_tx(local); |
4773 |
++ |
4774 |
++ if (skb_has_frag_list(skb)) { |
4775 |
++ kfree_skb_list(skb_shinfo(skb)->frag_list); |
4776 |
++ skb_shinfo(skb)->frag_list = NULL; |
4777 |
++ } |
4778 |
+ } |
4779 |
+ |
4780 |
+ /* |
4781 |
+diff --git a/net/netfilter/ipset/ip_set_list_set.c b/net/netfilter/ipset/ip_set_list_set.c |
4782 |
+index 4eef55da0878..8da228da53ae 100644 |
4783 |
+--- a/net/netfilter/ipset/ip_set_list_set.c |
4784 |
++++ b/net/netfilter/ipset/ip_set_list_set.c |
4785 |
+@@ -531,8 +531,8 @@ nla_put_failure: |
4786 |
+ ret = -EMSGSIZE; |
4787 |
+ } else { |
4788 |
+ cb->args[IPSET_CB_ARG0] = i; |
4789 |
++ ipset_nest_end(skb, atd); |
4790 |
+ } |
4791 |
+- ipset_nest_end(skb, atd); |
4792 |
+ out: |
4793 |
+ rcu_read_unlock(); |
4794 |
+ return ret; |
4795 |
+diff --git a/net/netfilter/nf_conncount.c b/net/netfilter/nf_conncount.c |
4796 |
+index b6d0f6deea86..9cd180bda092 100644 |
4797 |
+--- a/net/netfilter/nf_conncount.c |
4798 |
++++ b/net/netfilter/nf_conncount.c |
4799 |
+@@ -427,7 +427,7 @@ insert_tree(struct net *net, |
4800 |
+ count = 1; |
4801 |
+ rbconn->list.count = count; |
4802 |
+ |
4803 |
+- rb_link_node(&rbconn->node, parent, rbnode); |
4804 |
++ rb_link_node_rcu(&rbconn->node, parent, rbnode); |
4805 |
+ rb_insert_color(&rbconn->node, root); |
4806 |
+ out_unlock: |
4807 |
+ spin_unlock_bh(&nf_conncount_locks[hash % CONNCOUNT_LOCK_SLOTS]); |
4808 |
+diff --git a/net/netfilter/nf_conntrack_seqadj.c b/net/netfilter/nf_conntrack_seqadj.c |
4809 |
+index a975efd6b8c3..9da303461069 100644 |
4810 |
+--- a/net/netfilter/nf_conntrack_seqadj.c |
4811 |
++++ b/net/netfilter/nf_conntrack_seqadj.c |
4812 |
+@@ -115,12 +115,12 @@ static void nf_ct_sack_block_adjust(struct sk_buff *skb, |
4813 |
+ /* TCP SACK sequence number adjustment */ |
4814 |
+ static unsigned int nf_ct_sack_adjust(struct sk_buff *skb, |
4815 |
+ unsigned int protoff, |
4816 |
+- struct tcphdr *tcph, |
4817 |
+ struct nf_conn *ct, |
4818 |
+ enum ip_conntrack_info ctinfo) |
4819 |
+ { |
4820 |
+- unsigned int dir, optoff, optend; |
4821 |
++ struct tcphdr *tcph = (void *)skb->data + protoff; |
4822 |
+ struct nf_conn_seqadj *seqadj = nfct_seqadj(ct); |
4823 |
++ unsigned int dir, optoff, optend; |
4824 |
+ |
4825 |
+ optoff = protoff + sizeof(struct tcphdr); |
4826 |
+ optend = protoff + tcph->doff * 4; |
4827 |
+@@ -128,6 +128,7 @@ static unsigned int nf_ct_sack_adjust(struct sk_buff *skb, |
4828 |
+ if (!skb_make_writable(skb, optend)) |
4829 |
+ return 0; |
4830 |
+ |
4831 |
++ tcph = (void *)skb->data + protoff; |
4832 |
+ dir = CTINFO2DIR(ctinfo); |
4833 |
+ |
4834 |
+ while (optoff < optend) { |
4835 |
+@@ -207,7 +208,7 @@ int nf_ct_seq_adjust(struct sk_buff *skb, |
4836 |
+ ntohl(newack)); |
4837 |
+ tcph->ack_seq = newack; |
4838 |
+ |
4839 |
+- res = nf_ct_sack_adjust(skb, protoff, tcph, ct, ctinfo); |
4840 |
++ res = nf_ct_sack_adjust(skb, protoff, ct, ctinfo); |
4841 |
+ out: |
4842 |
+ spin_unlock_bh(&ct->lock); |
4843 |
+ |
4844 |
+diff --git a/net/netfilter/nf_nat_core.c b/net/netfilter/nf_nat_core.c |
4845 |
+index e2b196054dfc..2268b10a9dcf 100644 |
4846 |
+--- a/net/netfilter/nf_nat_core.c |
4847 |
++++ b/net/netfilter/nf_nat_core.c |
4848 |
+@@ -117,7 +117,8 @@ int nf_xfrm_me_harder(struct net *net, struct sk_buff *skb, unsigned int family) |
4849 |
+ dst = skb_dst(skb); |
4850 |
+ if (dst->xfrm) |
4851 |
+ dst = ((struct xfrm_dst *)dst)->route; |
4852 |
+- dst_hold(dst); |
4853 |
++ if (!dst_hold_safe(dst)) |
4854 |
++ return -EHOSTUNREACH; |
4855 |
+ |
4856 |
+ if (sk && !net_eq(net, sock_net(sk))) |
4857 |
+ sk = NULL; |
4858 |
+diff --git a/net/netfilter/nf_tables_api.c b/net/netfilter/nf_tables_api.c |
4859 |
+index fe0558b15fd3..ed9af46720e1 100644 |
4860 |
+--- a/net/netfilter/nf_tables_api.c |
4861 |
++++ b/net/netfilter/nf_tables_api.c |
4862 |
+@@ -1199,7 +1199,8 @@ static int nf_tables_fill_chain_info(struct sk_buff *skb, struct net *net, |
4863 |
+ if (nla_put_string(skb, NFTA_CHAIN_TYPE, basechain->type->name)) |
4864 |
+ goto nla_put_failure; |
4865 |
+ |
4866 |
+- if (basechain->stats && nft_dump_stats(skb, basechain->stats)) |
4867 |
++ if (rcu_access_pointer(basechain->stats) && |
4868 |
++ nft_dump_stats(skb, rcu_dereference(basechain->stats))) |
4869 |
+ goto nla_put_failure; |
4870 |
+ } |
4871 |
+ |
4872 |
+@@ -1375,7 +1376,8 @@ static struct nft_stats __percpu *nft_stats_alloc(const struct nlattr *attr) |
4873 |
+ return newstats; |
4874 |
+ } |
4875 |
+ |
4876 |
+-static void nft_chain_stats_replace(struct nft_base_chain *chain, |
4877 |
++static void nft_chain_stats_replace(struct net *net, |
4878 |
++ struct nft_base_chain *chain, |
4879 |
+ struct nft_stats __percpu *newstats) |
4880 |
+ { |
4881 |
+ struct nft_stats __percpu *oldstats; |
4882 |
+@@ -1383,8 +1385,9 @@ static void nft_chain_stats_replace(struct nft_base_chain *chain, |
4883 |
+ if (newstats == NULL) |
4884 |
+ return; |
4885 |
+ |
4886 |
+- if (chain->stats) { |
4887 |
+- oldstats = nfnl_dereference(chain->stats, NFNL_SUBSYS_NFTABLES); |
4888 |
++ if (rcu_access_pointer(chain->stats)) { |
4889 |
++ oldstats = rcu_dereference_protected(chain->stats, |
4890 |
++ lockdep_commit_lock_is_held(net)); |
4891 |
+ rcu_assign_pointer(chain->stats, newstats); |
4892 |
+ synchronize_rcu(); |
4893 |
+ free_percpu(oldstats); |
4894 |
+@@ -1421,9 +1424,10 @@ static void nf_tables_chain_destroy(struct nft_ctx *ctx) |
4895 |
+ struct nft_base_chain *basechain = nft_base_chain(chain); |
4896 |
+ |
4897 |
+ module_put(basechain->type->owner); |
4898 |
+- free_percpu(basechain->stats); |
4899 |
+- if (basechain->stats) |
4900 |
++ if (rcu_access_pointer(basechain->stats)) { |
4901 |
+ static_branch_dec(&nft_counters_enabled); |
4902 |
++ free_percpu(rcu_dereference_raw(basechain->stats)); |
4903 |
++ } |
4904 |
+ kfree(chain->name); |
4905 |
+ kfree(basechain); |
4906 |
+ } else { |
4907 |
+@@ -1572,7 +1576,7 @@ static int nf_tables_addchain(struct nft_ctx *ctx, u8 family, u8 genmask, |
4908 |
+ kfree(basechain); |
4909 |
+ return PTR_ERR(stats); |
4910 |
+ } |
4911 |
+- basechain->stats = stats; |
4912 |
++ rcu_assign_pointer(basechain->stats, stats); |
4913 |
+ static_branch_inc(&nft_counters_enabled); |
4914 |
+ } |
4915 |
+ |
4916 |
+@@ -6145,7 +6149,8 @@ static void nft_chain_commit_update(struct nft_trans *trans) |
4917 |
+ return; |
4918 |
+ |
4919 |
+ basechain = nft_base_chain(trans->ctx.chain); |
4920 |
+- nft_chain_stats_replace(basechain, nft_trans_chain_stats(trans)); |
4921 |
++ nft_chain_stats_replace(trans->ctx.net, basechain, |
4922 |
++ nft_trans_chain_stats(trans)); |
4923 |
+ |
4924 |
+ switch (nft_trans_chain_policy(trans)) { |
4925 |
+ case NF_DROP: |
4926 |
+diff --git a/net/netfilter/nf_tables_core.c b/net/netfilter/nf_tables_core.c |
4927 |
+index ffd5c0f9412b..60f258f2c707 100644 |
4928 |
+--- a/net/netfilter/nf_tables_core.c |
4929 |
++++ b/net/netfilter/nf_tables_core.c |
4930 |
+@@ -101,7 +101,7 @@ static noinline void nft_update_chain_stats(const struct nft_chain *chain, |
4931 |
+ struct nft_stats *stats; |
4932 |
+ |
4933 |
+ base_chain = nft_base_chain(chain); |
4934 |
+- if (!base_chain->stats) |
4935 |
++ if (!rcu_access_pointer(base_chain->stats)) |
4936 |
+ return; |
4937 |
+ |
4938 |
+ local_bh_disable(); |
4939 |
+diff --git a/net/sunrpc/auth_gss/svcauth_gss.c b/net/sunrpc/auth_gss/svcauth_gss.c |
4940 |
+index 860f2a1bbb67..1a65f88d021a 100644 |
4941 |
+--- a/net/sunrpc/auth_gss/svcauth_gss.c |
4942 |
++++ b/net/sunrpc/auth_gss/svcauth_gss.c |
4943 |
+@@ -1122,7 +1122,7 @@ static int svcauth_gss_legacy_init(struct svc_rqst *rqstp, |
4944 |
+ struct kvec *resv = &rqstp->rq_res.head[0]; |
4945 |
+ struct rsi *rsip, rsikey; |
4946 |
+ int ret; |
4947 |
+- struct sunrpc_net *sn = net_generic(rqstp->rq_xprt->xpt_net, sunrpc_net_id); |
4948 |
++ struct sunrpc_net *sn = net_generic(SVC_NET(rqstp), sunrpc_net_id); |
4949 |
+ |
4950 |
+ memset(&rsikey, 0, sizeof(rsikey)); |
4951 |
+ ret = gss_read_verf(gc, argv, authp, |
4952 |
+@@ -1233,7 +1233,7 @@ static int svcauth_gss_proxy_init(struct svc_rqst *rqstp, |
4953 |
+ uint64_t handle; |
4954 |
+ int status; |
4955 |
+ int ret; |
4956 |
+- struct net *net = rqstp->rq_xprt->xpt_net; |
4957 |
++ struct net *net = SVC_NET(rqstp); |
4958 |
+ struct sunrpc_net *sn = net_generic(net, sunrpc_net_id); |
4959 |
+ |
4960 |
+ memset(&ud, 0, sizeof(ud)); |
4961 |
+@@ -1424,7 +1424,7 @@ svcauth_gss_accept(struct svc_rqst *rqstp, __be32 *authp) |
4962 |
+ __be32 *rpcstart; |
4963 |
+ __be32 *reject_stat = resv->iov_base + resv->iov_len; |
4964 |
+ int ret; |
4965 |
+- struct sunrpc_net *sn = net_generic(rqstp->rq_xprt->xpt_net, sunrpc_net_id); |
4966 |
++ struct sunrpc_net *sn = net_generic(SVC_NET(rqstp), sunrpc_net_id); |
4967 |
+ |
4968 |
+ dprintk("RPC: svcauth_gss: argv->iov_len = %zd\n", |
4969 |
+ argv->iov_len); |
4970 |
+@@ -1714,7 +1714,7 @@ svcauth_gss_release(struct svc_rqst *rqstp) |
4971 |
+ struct rpc_gss_wire_cred *gc = &gsd->clcred; |
4972 |
+ struct xdr_buf *resbuf = &rqstp->rq_res; |
4973 |
+ int stat = -EINVAL; |
4974 |
+- struct sunrpc_net *sn = net_generic(rqstp->rq_xprt->xpt_net, sunrpc_net_id); |
4975 |
++ struct sunrpc_net *sn = net_generic(SVC_NET(rqstp), sunrpc_net_id); |
4976 |
+ |
4977 |
+ if (gc->gc_proc != RPC_GSS_PROC_DATA) |
4978 |
+ goto out; |
4979 |
+diff --git a/net/sunrpc/cache.c b/net/sunrpc/cache.c |
4980 |
+index 109fbe591e7b..b6e8eccf2a52 100644 |
4981 |
+--- a/net/sunrpc/cache.c |
4982 |
++++ b/net/sunrpc/cache.c |
4983 |
+@@ -54,6 +54,11 @@ static void cache_init(struct cache_head *h, struct cache_detail *detail) |
4984 |
+ h->last_refresh = now; |
4985 |
+ } |
4986 |
+ |
4987 |
++static void cache_fresh_locked(struct cache_head *head, time_t expiry, |
4988 |
++ struct cache_detail *detail); |
4989 |
++static void cache_fresh_unlocked(struct cache_head *head, |
4990 |
++ struct cache_detail *detail); |
4991 |
++ |
4992 |
+ struct cache_head *sunrpc_cache_lookup(struct cache_detail *detail, |
4993 |
+ struct cache_head *key, int hash) |
4994 |
+ { |
4995 |
+@@ -95,6 +100,7 @@ struct cache_head *sunrpc_cache_lookup(struct cache_detail *detail, |
4996 |
+ if (cache_is_expired(detail, tmp)) { |
4997 |
+ hlist_del_init(&tmp->cache_list); |
4998 |
+ detail->entries --; |
4999 |
++ cache_fresh_locked(tmp, 0, detail); |
5000 |
+ freeme = tmp; |
5001 |
+ break; |
5002 |
+ } |
5003 |
+@@ -110,8 +116,10 @@ struct cache_head *sunrpc_cache_lookup(struct cache_detail *detail, |
5004 |
+ cache_get(new); |
5005 |
+ write_unlock(&detail->hash_lock); |
5006 |
+ |
5007 |
+- if (freeme) |
5008 |
++ if (freeme) { |
5009 |
++ cache_fresh_unlocked(freeme, detail); |
5010 |
+ cache_put(freeme, detail); |
5011 |
++ } |
5012 |
+ return new; |
5013 |
+ } |
5014 |
+ EXPORT_SYMBOL_GPL(sunrpc_cache_lookup); |
5015 |
+diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c |
5016 |
+index 6b7539c0466e..7d8cce1dfcad 100644 |
5017 |
+--- a/net/sunrpc/xprtsock.c |
5018 |
++++ b/net/sunrpc/xprtsock.c |
5019 |
+@@ -2244,8 +2244,8 @@ static void xs_udp_setup_socket(struct work_struct *work) |
5020 |
+ trace_rpc_socket_connect(xprt, sock, 0); |
5021 |
+ status = 0; |
5022 |
+ out: |
5023 |
+- xprt_unlock_connect(xprt, transport); |
5024 |
+ xprt_clear_connecting(xprt); |
5025 |
++ xprt_unlock_connect(xprt, transport); |
5026 |
+ xprt_wake_pending_tasks(xprt, status); |
5027 |
+ } |
5028 |
+ |
5029 |
+@@ -2480,8 +2480,8 @@ static void xs_tcp_setup_socket(struct work_struct *work) |
5030 |
+ } |
5031 |
+ status = -EAGAIN; |
5032 |
+ out: |
5033 |
+- xprt_unlock_connect(xprt, transport); |
5034 |
+ xprt_clear_connecting(xprt); |
5035 |
++ xprt_unlock_connect(xprt, transport); |
5036 |
+ xprt_wake_pending_tasks(xprt, status); |
5037 |
+ } |
5038 |
+ |
5039 |
+diff --git a/net/tls/tls_main.c b/net/tls/tls_main.c |
5040 |
+index 7fab2891ce7f..a091c03abcb2 100644 |
5041 |
+--- a/net/tls/tls_main.c |
5042 |
++++ b/net/tls/tls_main.c |
5043 |
+@@ -555,6 +555,9 @@ static struct tls_context *create_ctx(struct sock *sk) |
5044 |
+ return NULL; |
5045 |
+ |
5046 |
+ icsk->icsk_ulp_data = ctx; |
5047 |
++ ctx->setsockopt = sk->sk_prot->setsockopt; |
5048 |
++ ctx->getsockopt = sk->sk_prot->getsockopt; |
5049 |
++ ctx->sk_proto_close = sk->sk_prot->close; |
5050 |
+ return ctx; |
5051 |
+ } |
5052 |
+ |
5053 |
+@@ -685,9 +688,6 @@ static int tls_init(struct sock *sk) |
5054 |
+ rc = -ENOMEM; |
5055 |
+ goto out; |
5056 |
+ } |
5057 |
+- ctx->setsockopt = sk->sk_prot->setsockopt; |
5058 |
+- ctx->getsockopt = sk->sk_prot->getsockopt; |
5059 |
+- ctx->sk_proto_close = sk->sk_prot->close; |
5060 |
+ |
5061 |
+ /* Build IPv6 TLS whenever the address of tcpv6 _prot changes */ |
5062 |
+ if (ip_ver == TLSV6 && |
5063 |
+diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c |
5064 |
+index 176edfefcbaa..295cd8d5554f 100644 |
5065 |
+--- a/net/wireless/nl80211.c |
5066 |
++++ b/net/wireless/nl80211.c |
5067 |
+@@ -8993,8 +8993,10 @@ static int nl80211_join_ibss(struct sk_buff *skb, struct genl_info *info) |
5068 |
+ if (info->attrs[NL80211_ATTR_CONTROL_PORT_OVER_NL80211]) { |
5069 |
+ int r = validate_pae_over_nl80211(rdev, info); |
5070 |
+ |
5071 |
+- if (r < 0) |
5072 |
++ if (r < 0) { |
5073 |
++ kzfree(connkeys); |
5074 |
+ return r; |
5075 |
++ } |
5076 |
+ |
5077 |
+ ibss.control_port_over_nl80211 = true; |
5078 |
+ } |
5079 |
+diff --git a/net/xfrm/xfrm_input.c b/net/xfrm/xfrm_input.c |
5080 |
+index be3520e429c9..790b514f86b6 100644 |
5081 |
+--- a/net/xfrm/xfrm_input.c |
5082 |
++++ b/net/xfrm/xfrm_input.c |
5083 |
+@@ -346,6 +346,12 @@ int xfrm_input(struct sk_buff *skb, int nexthdr, __be32 spi, int encap_type) |
5084 |
+ |
5085 |
+ skb->sp->xvec[skb->sp->len++] = x; |
5086 |
+ |
5087 |
++ skb_dst_force(skb); |
5088 |
++ if (!skb_dst(skb)) { |
5089 |
++ XFRM_INC_STATS(net, LINUX_MIB_XFRMINERROR); |
5090 |
++ goto drop; |
5091 |
++ } |
5092 |
++ |
5093 |
+ lock: |
5094 |
+ spin_lock(&x->lock); |
5095 |
+ |
5096 |
+@@ -385,7 +391,6 @@ lock: |
5097 |
+ XFRM_SKB_CB(skb)->seq.input.low = seq; |
5098 |
+ XFRM_SKB_CB(skb)->seq.input.hi = seq_hi; |
5099 |
+ |
5100 |
+- skb_dst_force(skb); |
5101 |
+ dev_hold(skb->dev); |
5102 |
+ |
5103 |
+ if (crypto_done) |
5104 |
+diff --git a/net/xfrm/xfrm_output.c b/net/xfrm/xfrm_output.c |
5105 |
+index 261995d37ced..6d20fbcde000 100644 |
5106 |
+--- a/net/xfrm/xfrm_output.c |
5107 |
++++ b/net/xfrm/xfrm_output.c |
5108 |
+@@ -102,6 +102,7 @@ static int xfrm_output_one(struct sk_buff *skb, int err) |
5109 |
+ skb_dst_force(skb); |
5110 |
+ if (!skb_dst(skb)) { |
5111 |
+ XFRM_INC_STATS(net, LINUX_MIB_XFRMOUTERROR); |
5112 |
++ err = -EHOSTUNREACH; |
5113 |
+ goto error_nolock; |
5114 |
+ } |
5115 |
+ |
5116 |
+diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c |
5117 |
+index 7a34990a68b1..cc0203efb584 100644 |
5118 |
+--- a/net/xfrm/xfrm_state.c |
5119 |
++++ b/net/xfrm/xfrm_state.c |
5120 |
+@@ -794,7 +794,7 @@ void xfrm_sad_getinfo(struct net *net, struct xfrmk_sadinfo *si) |
5121 |
+ { |
5122 |
+ spin_lock_bh(&net->xfrm.xfrm_state_lock); |
5123 |
+ si->sadcnt = net->xfrm.state_num; |
5124 |
+- si->sadhcnt = net->xfrm.state_hmask; |
5125 |
++ si->sadhcnt = net->xfrm.state_hmask + 1; |
5126 |
+ si->sadhmcnt = xfrm_state_hashmax; |
5127 |
+ spin_unlock_bh(&net->xfrm.xfrm_state_lock); |
5128 |
+ } |
5129 |
+diff --git a/scripts/checkstack.pl b/scripts/checkstack.pl |
5130 |
+index 8081b6cf67d2..34414c6efad6 100755 |
5131 |
+--- a/scripts/checkstack.pl |
5132 |
++++ b/scripts/checkstack.pl |
5133 |
+@@ -47,8 +47,8 @@ my (@stack, $re, $dre, $x, $xs, $funcre); |
5134 |
+ $xs = "[0-9a-f ]"; # hex character or space |
5135 |
+ $funcre = qr/^$x* <(.*)>:$/; |
5136 |
+ if ($arch eq 'aarch64') { |
5137 |
+- #ffffffc0006325cc: a9bb7bfd stp x29, x30, [sp,#-80]! |
5138 |
+- $re = qr/^.*stp.*sp,\#-([0-9]{1,8})\]\!/o; |
5139 |
++ #ffffffc0006325cc: a9bb7bfd stp x29, x30, [sp, #-80]! |
5140 |
++ $re = qr/^.*stp.*sp, \#-([0-9]{1,8})\]\!/o; |
5141 |
+ } elsif ($arch eq 'arm') { |
5142 |
+ #c0008ffc: e24dd064 sub sp, sp, #100 ; 0x64 |
5143 |
+ $re = qr/.*sub.*sp, sp, #(([0-9]{2}|[3-9])[0-9]{2})/o; |
5144 |
+diff --git a/security/selinux/ss/policydb.c b/security/selinux/ss/policydb.c |
5145 |
+index f4eadd3f7350..b63ef865ce1e 100644 |
5146 |
+--- a/security/selinux/ss/policydb.c |
5147 |
++++ b/security/selinux/ss/policydb.c |
5148 |
+@@ -2108,6 +2108,7 @@ static int ocontext_read(struct policydb *p, struct policydb_compat_info *info, |
5149 |
+ { |
5150 |
+ int i, j, rc; |
5151 |
+ u32 nel, len; |
5152 |
++ __be64 prefixbuf[1]; |
5153 |
+ __le32 buf[3]; |
5154 |
+ struct ocontext *l, *c; |
5155 |
+ u32 nodebuf[8]; |
5156 |
+@@ -2217,21 +2218,30 @@ static int ocontext_read(struct policydb *p, struct policydb_compat_info *info, |
5157 |
+ goto out; |
5158 |
+ break; |
5159 |
+ } |
5160 |
+- case OCON_IBPKEY: |
5161 |
+- rc = next_entry(nodebuf, fp, sizeof(u32) * 4); |
5162 |
++ case OCON_IBPKEY: { |
5163 |
++ u32 pkey_lo, pkey_hi; |
5164 |
++ |
5165 |
++ rc = next_entry(prefixbuf, fp, sizeof(u64)); |
5166 |
++ if (rc) |
5167 |
++ goto out; |
5168 |
++ |
5169 |
++ /* we need to have subnet_prefix in CPU order */ |
5170 |
++ c->u.ibpkey.subnet_prefix = be64_to_cpu(prefixbuf[0]); |
5171 |
++ |
5172 |
++ rc = next_entry(buf, fp, sizeof(u32) * 2); |
5173 |
+ if (rc) |
5174 |
+ goto out; |
5175 |
+ |
5176 |
+- c->u.ibpkey.subnet_prefix = be64_to_cpu(*((__be64 *)nodebuf)); |
5177 |
++ pkey_lo = le32_to_cpu(buf[0]); |
5178 |
++ pkey_hi = le32_to_cpu(buf[1]); |
5179 |
+ |
5180 |
+- if (nodebuf[2] > 0xffff || |
5181 |
+- nodebuf[3] > 0xffff) { |
5182 |
++ if (pkey_lo > U16_MAX || pkey_hi > U16_MAX) { |
5183 |
+ rc = -EINVAL; |
5184 |
+ goto out; |
5185 |
+ } |
5186 |
+ |
5187 |
+- c->u.ibpkey.low_pkey = le32_to_cpu(nodebuf[2]); |
5188 |
+- c->u.ibpkey.high_pkey = le32_to_cpu(nodebuf[3]); |
5189 |
++ c->u.ibpkey.low_pkey = pkey_lo; |
5190 |
++ c->u.ibpkey.high_pkey = pkey_hi; |
5191 |
+ |
5192 |
+ rc = context_read_and_validate(&c->context[0], |
5193 |
+ p, |
5194 |
+@@ -2239,7 +2249,10 @@ static int ocontext_read(struct policydb *p, struct policydb_compat_info *info, |
5195 |
+ if (rc) |
5196 |
+ goto out; |
5197 |
+ break; |
5198 |
+- case OCON_IBENDPORT: |
5199 |
++ } |
5200 |
++ case OCON_IBENDPORT: { |
5201 |
++ u32 port; |
5202 |
++ |
5203 |
+ rc = next_entry(buf, fp, sizeof(u32) * 2); |
5204 |
+ if (rc) |
5205 |
+ goto out; |
5206 |
+@@ -2249,12 +2262,13 @@ static int ocontext_read(struct policydb *p, struct policydb_compat_info *info, |
5207 |
+ if (rc) |
5208 |
+ goto out; |
5209 |
+ |
5210 |
+- if (buf[1] > 0xff || buf[1] == 0) { |
5211 |
++ port = le32_to_cpu(buf[1]); |
5212 |
++ if (port > U8_MAX || port == 0) { |
5213 |
+ rc = -EINVAL; |
5214 |
+ goto out; |
5215 |
+ } |
5216 |
+ |
5217 |
+- c->u.ibendport.port = le32_to_cpu(buf[1]); |
5218 |
++ c->u.ibendport.port = port; |
5219 |
+ |
5220 |
+ rc = context_read_and_validate(&c->context[0], |
5221 |
+ p, |
5222 |
+@@ -2262,7 +2276,8 @@ static int ocontext_read(struct policydb *p, struct policydb_compat_info *info, |
5223 |
+ if (rc) |
5224 |
+ goto out; |
5225 |
+ break; |
5226 |
+- } |
5227 |
++ } /* end case */ |
5228 |
++ } /* end switch */ |
5229 |
+ } |
5230 |
+ } |
5231 |
+ rc = 0; |
5232 |
+@@ -3105,6 +3120,7 @@ static int ocontext_write(struct policydb *p, struct policydb_compat_info *info, |
5233 |
+ { |
5234 |
+ unsigned int i, j, rc; |
5235 |
+ size_t nel, len; |
5236 |
++ __be64 prefixbuf[1]; |
5237 |
+ __le32 buf[3]; |
5238 |
+ u32 nodebuf[8]; |
5239 |
+ struct ocontext *c; |
5240 |
+@@ -3192,12 +3208,17 @@ static int ocontext_write(struct policydb *p, struct policydb_compat_info *info, |
5241 |
+ return rc; |
5242 |
+ break; |
5243 |
+ case OCON_IBPKEY: |
5244 |
+- *((__be64 *)nodebuf) = cpu_to_be64(c->u.ibpkey.subnet_prefix); |
5245 |
++ /* subnet_prefix is in CPU order */ |
5246 |
++ prefixbuf[0] = cpu_to_be64(c->u.ibpkey.subnet_prefix); |
5247 |
+ |
5248 |
+- nodebuf[2] = cpu_to_le32(c->u.ibpkey.low_pkey); |
5249 |
+- nodebuf[3] = cpu_to_le32(c->u.ibpkey.high_pkey); |
5250 |
++ rc = put_entry(prefixbuf, sizeof(u64), 1, fp); |
5251 |
++ if (rc) |
5252 |
++ return rc; |
5253 |
++ |
5254 |
++ buf[0] = cpu_to_le32(c->u.ibpkey.low_pkey); |
5255 |
++ buf[1] = cpu_to_le32(c->u.ibpkey.high_pkey); |
5256 |
+ |
5257 |
+- rc = put_entry(nodebuf, sizeof(u32), 4, fp); |
5258 |
++ rc = put_entry(buf, sizeof(u32), 2, fp); |
5259 |
+ if (rc) |
5260 |
+ return rc; |
5261 |
+ rc = context_write(p, &c->context[0], fp); |
5262 |
+diff --git a/sound/pci/cs46xx/dsp_spos.c b/sound/pci/cs46xx/dsp_spos.c |
5263 |
+index 598d140bb7cb..5fc497c6d738 100644 |
5264 |
+--- a/sound/pci/cs46xx/dsp_spos.c |
5265 |
++++ b/sound/pci/cs46xx/dsp_spos.c |
5266 |
+@@ -903,6 +903,9 @@ int cs46xx_dsp_proc_done (struct snd_cs46xx *chip) |
5267 |
+ struct dsp_spos_instance * ins = chip->dsp_spos_instance; |
5268 |
+ int i; |
5269 |
+ |
5270 |
++ if (!ins) |
5271 |
++ return 0; |
5272 |
++ |
5273 |
+ snd_info_free_entry(ins->proc_sym_info_entry); |
5274 |
+ ins->proc_sym_info_entry = NULL; |
5275 |
+ |
5276 |
+diff --git a/sound/usb/card.c b/sound/usb/card.c |
5277 |
+index a105947eaf55..746a72e23cf9 100644 |
5278 |
+--- a/sound/usb/card.c |
5279 |
++++ b/sound/usb/card.c |
5280 |
+@@ -246,7 +246,7 @@ static int snd_usb_create_streams(struct snd_usb_audio *chip, int ctrlif) |
5281 |
+ h1 = snd_usb_find_csint_desc(host_iface->extra, |
5282 |
+ host_iface->extralen, |
5283 |
+ NULL, UAC_HEADER); |
5284 |
+- if (!h1) { |
5285 |
++ if (!h1 || h1->bLength < sizeof(*h1)) { |
5286 |
+ dev_err(&dev->dev, "cannot find UAC_HEADER\n"); |
5287 |
+ return -EINVAL; |
5288 |
+ } |
5289 |
+diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c |
5290 |
+index c63c84b54969..e7d441d0e839 100644 |
5291 |
+--- a/sound/usb/mixer.c |
5292 |
++++ b/sound/usb/mixer.c |
5293 |
+@@ -753,8 +753,9 @@ static int uac_mixer_unit_get_channels(struct mixer_build *state, |
5294 |
+ struct uac_mixer_unit_descriptor *desc) |
5295 |
+ { |
5296 |
+ int mu_channels; |
5297 |
++ void *c; |
5298 |
+ |
5299 |
+- if (desc->bLength < 11) |
5300 |
++ if (desc->bLength < sizeof(*desc)) |
5301 |
+ return -EINVAL; |
5302 |
+ if (!desc->bNrInPins) |
5303 |
+ return -EINVAL; |
5304 |
+@@ -763,6 +764,8 @@ static int uac_mixer_unit_get_channels(struct mixer_build *state, |
5305 |
+ case UAC_VERSION_1: |
5306 |
+ case UAC_VERSION_2: |
5307 |
+ default: |
5308 |
++ if (desc->bLength < sizeof(*desc) + desc->bNrInPins + 1) |
5309 |
++ return 0; /* no bmControls -> skip */ |
5310 |
+ mu_channels = uac_mixer_unit_bNrChannels(desc); |
5311 |
+ break; |
5312 |
+ case UAC_VERSION_3: |
5313 |
+@@ -772,7 +775,11 @@ static int uac_mixer_unit_get_channels(struct mixer_build *state, |
5314 |
+ } |
5315 |
+ |
5316 |
+ if (!mu_channels) |
5317 |
+- return -EINVAL; |
5318 |
++ return 0; |
5319 |
++ |
5320 |
++ c = uac_mixer_unit_bmControls(desc, state->mixer->protocol); |
5321 |
++ if (c - (void *)desc + (mu_channels - 1) / 8 >= desc->bLength) |
5322 |
++ return 0; /* no bmControls -> skip */ |
5323 |
+ |
5324 |
+ return mu_channels; |
5325 |
+ } |
5326 |
+@@ -944,7 +951,7 @@ static int check_input_term(struct mixer_build *state, int id, |
5327 |
+ struct uac_mixer_unit_descriptor *d = p1; |
5328 |
+ |
5329 |
+ err = uac_mixer_unit_get_channels(state, d); |
5330 |
+- if (err < 0) |
5331 |
++ if (err <= 0) |
5332 |
+ return err; |
5333 |
+ |
5334 |
+ term->channels = err; |
5335 |
+@@ -2068,11 +2075,15 @@ static int parse_audio_input_terminal(struct mixer_build *state, int unitid, |
5336 |
+ |
5337 |
+ if (state->mixer->protocol == UAC_VERSION_2) { |
5338 |
+ struct uac2_input_terminal_descriptor *d_v2 = raw_desc; |
5339 |
++ if (d_v2->bLength < sizeof(*d_v2)) |
5340 |
++ return -EINVAL; |
5341 |
+ control = UAC2_TE_CONNECTOR; |
5342 |
+ term_id = d_v2->bTerminalID; |
5343 |
+ bmctls = le16_to_cpu(d_v2->bmControls); |
5344 |
+ } else if (state->mixer->protocol == UAC_VERSION_3) { |
5345 |
+ struct uac3_input_terminal_descriptor *d_v3 = raw_desc; |
5346 |
++ if (d_v3->bLength < sizeof(*d_v3)) |
5347 |
++ return -EINVAL; |
5348 |
+ control = UAC3_TE_INSERTION; |
5349 |
+ term_id = d_v3->bTerminalID; |
5350 |
+ bmctls = le32_to_cpu(d_v3->bmControls); |
5351 |
+@@ -2118,7 +2129,7 @@ static int parse_audio_mixer_unit(struct mixer_build *state, int unitid, |
5352 |
+ if (err < 0) |
5353 |
+ continue; |
5354 |
+ /* no bmControls field (e.g. Maya44) -> ignore */ |
5355 |
+- if (desc->bLength <= 10 + input_pins) |
5356 |
++ if (!num_outs) |
5357 |
+ continue; |
5358 |
+ err = check_input_term(state, desc->baSourceID[pin], &iterm); |
5359 |
+ if (err < 0) |
5360 |
+@@ -2314,7 +2325,7 @@ static int build_audio_procunit(struct mixer_build *state, int unitid, |
5361 |
+ char *name) |
5362 |
+ { |
5363 |
+ struct uac_processing_unit_descriptor *desc = raw_desc; |
5364 |
+- int num_ins = desc->bNrInPins; |
5365 |
++ int num_ins; |
5366 |
+ struct usb_mixer_elem_info *cval; |
5367 |
+ struct snd_kcontrol *kctl; |
5368 |
+ int i, err, nameid, type, len; |
5369 |
+@@ -2329,7 +2340,13 @@ static int build_audio_procunit(struct mixer_build *state, int unitid, |
5370 |
+ 0, NULL, default_value_info |
5371 |
+ }; |
5372 |
+ |
5373 |
+- if (desc->bLength < 13 || desc->bLength < 13 + num_ins || |
5374 |
++ if (desc->bLength < 13) { |
5375 |
++ usb_audio_err(state->chip, "invalid %s descriptor (id %d)\n", name, unitid); |
5376 |
++ return -EINVAL; |
5377 |
++ } |
5378 |
++ |
5379 |
++ num_ins = desc->bNrInPins; |
5380 |
++ if (desc->bLength < 13 + num_ins || |
5381 |
+ desc->bLength < num_ins + uac_processing_unit_bControlSize(desc, state->mixer->protocol)) { |
5382 |
+ usb_audio_err(state->chip, "invalid %s descriptor (id %d)\n", name, unitid); |
5383 |
+ return -EINVAL; |
5384 |
+diff --git a/sound/usb/quirks-table.h b/sound/usb/quirks-table.h |
5385 |
+index 1c73b9ed44a6..57c6209a4ccb 100644 |
5386 |
+--- a/sound/usb/quirks-table.h |
5387 |
++++ b/sound/usb/quirks-table.h |
5388 |
+@@ -3326,6 +3326,9 @@ AU0828_DEVICE(0x2040, 0x7270, "Hauppauge", "HVR-950Q"), |
5389 |
+ } |
5390 |
+ } |
5391 |
+ }, |
5392 |
++ { |
5393 |
++ .ifnum = -1 |
5394 |
++ }, |
5395 |
+ } |
5396 |
+ } |
5397 |
+ }, |
5398 |
+@@ -3374,6 +3377,9 @@ AU0828_DEVICE(0x2040, 0x7270, "Hauppauge", "HVR-950Q"), |
5399 |
+ } |
5400 |
+ } |
5401 |
+ }, |
5402 |
++ { |
5403 |
++ .ifnum = -1 |
5404 |
++ }, |
5405 |
+ } |
5406 |
+ } |
5407 |
+ }, |
5408 |
+diff --git a/sound/usb/stream.c b/sound/usb/stream.c |
5409 |
+index 67cf849aa16b..d9e3de495c16 100644 |
5410 |
+--- a/sound/usb/stream.c |
5411 |
++++ b/sound/usb/stream.c |
5412 |
+@@ -596,12 +596,8 @@ static int parse_uac_endpoint_attributes(struct snd_usb_audio *chip, |
5413 |
+ csep = snd_usb_find_desc(alts->extra, alts->extralen, NULL, USB_DT_CS_ENDPOINT); |
5414 |
+ |
5415 |
+ if (!csep || csep->bLength < 7 || |
5416 |
+- csep->bDescriptorSubtype != UAC_EP_GENERAL) { |
5417 |
+- usb_audio_warn(chip, |
5418 |
+- "%u:%d : no or invalid class specific endpoint descriptor\n", |
5419 |
+- iface_no, altsd->bAlternateSetting); |
5420 |
+- return 0; |
5421 |
+- } |
5422 |
++ csep->bDescriptorSubtype != UAC_EP_GENERAL) |
5423 |
++ goto error; |
5424 |
+ |
5425 |
+ if (protocol == UAC_VERSION_1) { |
5426 |
+ attributes = csep->bmAttributes; |
5427 |
+@@ -609,6 +605,8 @@ static int parse_uac_endpoint_attributes(struct snd_usb_audio *chip, |
5428 |
+ struct uac2_iso_endpoint_descriptor *csep2 = |
5429 |
+ (struct uac2_iso_endpoint_descriptor *) csep; |
5430 |
+ |
5431 |
++ if (csep2->bLength < sizeof(*csep2)) |
5432 |
++ goto error; |
5433 |
+ attributes = csep->bmAttributes & UAC_EP_CS_ATTR_FILL_MAX; |
5434 |
+ |
5435 |
+ /* emulate the endpoint attributes of a v1 device */ |
5436 |
+@@ -618,12 +616,20 @@ static int parse_uac_endpoint_attributes(struct snd_usb_audio *chip, |
5437 |
+ struct uac3_iso_endpoint_descriptor *csep3 = |
5438 |
+ (struct uac3_iso_endpoint_descriptor *) csep; |
5439 |
+ |
5440 |
++ if (csep3->bLength < sizeof(*csep3)) |
5441 |
++ goto error; |
5442 |
+ /* emulate the endpoint attributes of a v1 device */ |
5443 |
+ if (le32_to_cpu(csep3->bmControls) & UAC2_CONTROL_PITCH) |
5444 |
+ attributes |= UAC_EP_CS_ATTR_PITCH_CONTROL; |
5445 |
+ } |
5446 |
+ |
5447 |
+ return attributes; |
5448 |
++ |
5449 |
++ error: |
5450 |
++ usb_audio_warn(chip, |
5451 |
++ "%u:%d : no or invalid class specific endpoint descriptor\n", |
5452 |
++ iface_no, altsd->bAlternateSetting); |
5453 |
++ return 0; |
5454 |
+ } |
5455 |
+ |
5456 |
+ /* find an input terminal descriptor (either UAC1 or UAC2) with the given |
5457 |
+@@ -631,13 +637,17 @@ static int parse_uac_endpoint_attributes(struct snd_usb_audio *chip, |
5458 |
+ */ |
5459 |
+ static void * |
5460 |
+ snd_usb_find_input_terminal_descriptor(struct usb_host_interface *ctrl_iface, |
5461 |
+- int terminal_id) |
5462 |
++ int terminal_id, bool uac23) |
5463 |
+ { |
5464 |
+ struct uac2_input_terminal_descriptor *term = NULL; |
5465 |
++ size_t minlen = uac23 ? sizeof(struct uac2_input_terminal_descriptor) : |
5466 |
++ sizeof(struct uac_input_terminal_descriptor); |
5467 |
+ |
5468 |
+ while ((term = snd_usb_find_csint_desc(ctrl_iface->extra, |
5469 |
+ ctrl_iface->extralen, |
5470 |
+ term, UAC_INPUT_TERMINAL))) { |
5471 |
++ if (term->bLength < minlen) |
5472 |
++ continue; |
5473 |
+ if (term->bTerminalID == terminal_id) |
5474 |
+ return term; |
5475 |
+ } |
5476 |
+@@ -655,7 +665,8 @@ snd_usb_find_output_terminal_descriptor(struct usb_host_interface *ctrl_iface, |
5477 |
+ while ((term = snd_usb_find_csint_desc(ctrl_iface->extra, |
5478 |
+ ctrl_iface->extralen, |
5479 |
+ term, UAC_OUTPUT_TERMINAL))) { |
5480 |
+- if (term->bTerminalID == terminal_id) |
5481 |
++ if (term->bLength >= sizeof(*term) && |
5482 |
++ term->bTerminalID == terminal_id) |
5483 |
+ return term; |
5484 |
+ } |
5485 |
+ |
5486 |
+@@ -729,7 +740,8 @@ snd_usb_get_audioformat_uac12(struct snd_usb_audio *chip, |
5487 |
+ format = le16_to_cpu(as->wFormatTag); /* remember the format value */ |
5488 |
+ |
5489 |
+ iterm = snd_usb_find_input_terminal_descriptor(chip->ctrl_intf, |
5490 |
+- as->bTerminalLink); |
5491 |
++ as->bTerminalLink, |
5492 |
++ false); |
5493 |
+ if (iterm) { |
5494 |
+ num_channels = iterm->bNrChannels; |
5495 |
+ chconfig = le16_to_cpu(iterm->wChannelConfig); |
5496 |
+@@ -764,7 +776,8 @@ snd_usb_get_audioformat_uac12(struct snd_usb_audio *chip, |
5497 |
+ * to extract the clock |
5498 |
+ */ |
5499 |
+ input_term = snd_usb_find_input_terminal_descriptor(chip->ctrl_intf, |
5500 |
+- as->bTerminalLink); |
5501 |
++ as->bTerminalLink, |
5502 |
++ true); |
5503 |
+ if (input_term) { |
5504 |
+ clock = input_term->bCSourceID; |
5505 |
+ if (!chconfig && (num_channels == input_term->bNrChannels)) |
5506 |
+@@ -998,7 +1011,8 @@ snd_usb_get_audioformat_uac3(struct snd_usb_audio *chip, |
5507 |
+ * to extract the clock |
5508 |
+ */ |
5509 |
+ input_term = snd_usb_find_input_terminal_descriptor(chip->ctrl_intf, |
5510 |
+- as->bTerminalLink); |
5511 |
++ as->bTerminalLink, |
5512 |
++ true); |
5513 |
+ if (input_term) { |
5514 |
+ clock = input_term->bCSourceID; |
5515 |
+ goto found_clock; |
5516 |
+diff --git a/tools/testing/nvdimm/test/iomap.c b/tools/testing/nvdimm/test/iomap.c |
5517 |
+index ff9d3a5825e1..c6635fee27d8 100644 |
5518 |
+--- a/tools/testing/nvdimm/test/iomap.c |
5519 |
++++ b/tools/testing/nvdimm/test/iomap.c |
5520 |
+@@ -104,16 +104,29 @@ void *__wrap_devm_memremap(struct device *dev, resource_size_t offset, |
5521 |
+ } |
5522 |
+ EXPORT_SYMBOL(__wrap_devm_memremap); |
5523 |
+ |
5524 |
++static void nfit_test_kill(void *_pgmap) |
5525 |
++{ |
5526 |
++ struct dev_pagemap *pgmap = _pgmap; |
5527 |
++ |
5528 |
++ pgmap->kill(pgmap->ref); |
5529 |
++} |
5530 |
++ |
5531 |
+ void *__wrap_devm_memremap_pages(struct device *dev, struct dev_pagemap *pgmap) |
5532 |
+ { |
5533 |
+ resource_size_t offset = pgmap->res.start; |
5534 |
+ struct nfit_test_resource *nfit_res = get_nfit_res(offset); |
5535 |
+ |
5536 |
+- if (nfit_res) |
5537 |
++ if (nfit_res) { |
5538 |
++ int rc; |
5539 |
++ |
5540 |
++ rc = devm_add_action_or_reset(dev, nfit_test_kill, pgmap); |
5541 |
++ if (rc) |
5542 |
++ return ERR_PTR(rc); |
5543 |
+ return nfit_res->buf + offset - nfit_res->res.start; |
5544 |
++ } |
5545 |
+ return devm_memremap_pages(dev, pgmap); |
5546 |
+ } |
5547 |
+-EXPORT_SYMBOL(__wrap_devm_memremap_pages); |
5548 |
++EXPORT_SYMBOL_GPL(__wrap_devm_memremap_pages); |
5549 |
+ |
5550 |
+ pfn_t __wrap_phys_to_pfn_t(phys_addr_t addr, unsigned long flags) |
5551 |
+ { |
5552 |
+diff --git a/tools/virtio/linux/kernel.h b/tools/virtio/linux/kernel.h |
5553 |
+index fb22bccfbc8a..7ef45a4a3cba 100644 |
5554 |
+--- a/tools/virtio/linux/kernel.h |
5555 |
++++ b/tools/virtio/linux/kernel.h |
5556 |
+@@ -23,6 +23,10 @@ |
5557 |
+ #define PAGE_MASK (~(PAGE_SIZE-1)) |
5558 |
+ #define PAGE_ALIGN(x) ((x + PAGE_SIZE - 1) & PAGE_MASK) |
5559 |
+ |
5560 |
++/* generic data direction definitions */ |
5561 |
++#define READ 0 |
5562 |
++#define WRITE 1 |
5563 |
++ |
5564 |
+ typedef unsigned long long phys_addr_t; |
5565 |
+ typedef unsigned long long dma_addr_t; |
5566 |
+ typedef size_t __kernel_size_t; |