Contents of /trunk/kernel-alx/patches-4.14/0126-4.14.27-all-fixes.patch
Parent Directory | Revision Log
Revision 3238 -
(show annotations)
(download)
Fri Nov 9 12:14:58 2018 UTC (6 years ago) by niro
File size: 203769 byte(s)
Fri Nov 9 12:14:58 2018 UTC (6 years ago) by niro
File size: 203769 byte(s)
-added up to patches-4.14.79
1 | diff --git a/Documentation/devicetree/bindings/power/mti,mips-cpc.txt b/Documentation/devicetree/bindings/power/mti,mips-cpc.txt |
2 | new file mode 100644 |
3 | index 000000000000..c6b82511ae8a |
4 | --- /dev/null |
5 | +++ b/Documentation/devicetree/bindings/power/mti,mips-cpc.txt |
6 | @@ -0,0 +1,8 @@ |
7 | +Binding for MIPS Cluster Power Controller (CPC). |
8 | + |
9 | +This binding allows a system to specify where the CPC registers are |
10 | +located. |
11 | + |
12 | +Required properties: |
13 | +compatible : Should be "mti,mips-cpc". |
14 | +regs: Should describe the address & size of the CPC register region. |
15 | diff --git a/Documentation/sphinx/kerneldoc.py b/Documentation/sphinx/kerneldoc.py |
16 | index 39aa9e8697cc..fbedcc39460b 100644 |
17 | --- a/Documentation/sphinx/kerneldoc.py |
18 | +++ b/Documentation/sphinx/kerneldoc.py |
19 | @@ -36,8 +36,7 @@ import glob |
20 | |
21 | from docutils import nodes, statemachine |
22 | from docutils.statemachine import ViewList |
23 | -from docutils.parsers.rst import directives |
24 | -from sphinx.util.compat import Directive |
25 | +from docutils.parsers.rst import directives, Directive |
26 | from sphinx.ext.autodoc import AutodocReporter |
27 | |
28 | __version__ = '1.0' |
29 | diff --git a/MAINTAINERS b/MAINTAINERS |
30 | index 76ea063d8083..546beb6b0176 100644 |
31 | --- a/MAINTAINERS |
32 | +++ b/MAINTAINERS |
33 | @@ -9001,6 +9001,7 @@ MIPS GENERIC PLATFORM |
34 | M: Paul Burton <paul.burton@mips.com> |
35 | L: linux-mips@linux-mips.org |
36 | S: Supported |
37 | +F: Documentation/devicetree/bindings/power/mti,mips-cpc.txt |
38 | F: arch/mips/generic/ |
39 | F: arch/mips/tools/generic-board-config.sh |
40 | |
41 | diff --git a/Makefile b/Makefile |
42 | index 666182dda187..00e969db94b8 100644 |
43 | --- a/Makefile |
44 | +++ b/Makefile |
45 | @@ -1,7 +1,7 @@ |
46 | # SPDX-License-Identifier: GPL-2.0 |
47 | VERSION = 4 |
48 | PATCHLEVEL = 14 |
49 | -SUBLEVEL = 26 |
50 | +SUBLEVEL = 27 |
51 | EXTRAVERSION = |
52 | NAME = Petit Gorille |
53 | |
54 | @@ -11,6 +11,10 @@ NAME = Petit Gorille |
55 | # Comments in this file are targeted only to the developer, do not |
56 | # expect to learn how to build the kernel reading this file. |
57 | |
58 | +# That's our default target when none is given on the command line |
59 | +PHONY := _all |
60 | +_all: |
61 | + |
62 | # o Do not use make's built-in rules and variables |
63 | # (this increases performance and avoids hard-to-debug behaviour); |
64 | # o Look for make include files relative to root of kernel src |
65 | @@ -117,10 +121,6 @@ ifeq ("$(origin O)", "command line") |
66 | KBUILD_OUTPUT := $(O) |
67 | endif |
68 | |
69 | -# That's our default target when none is given on the command line |
70 | -PHONY := _all |
71 | -_all: |
72 | - |
73 | # Cancel implicit rules on top Makefile |
74 | $(CURDIR)/Makefile Makefile: ; |
75 | |
76 | @@ -187,15 +187,6 @@ ifeq ("$(origin M)", "command line") |
77 | KBUILD_EXTMOD := $(M) |
78 | endif |
79 | |
80 | -# If building an external module we do not care about the all: rule |
81 | -# but instead _all depend on modules |
82 | -PHONY += all |
83 | -ifeq ($(KBUILD_EXTMOD),) |
84 | -_all: all |
85 | -else |
86 | -_all: modules |
87 | -endif |
88 | - |
89 | ifeq ($(KBUILD_SRC),) |
90 | # building in the source tree |
91 | srctree := . |
92 | @@ -207,6 +198,9 @@ else |
93 | srctree := $(KBUILD_SRC) |
94 | endif |
95 | endif |
96 | + |
97 | +export KBUILD_CHECKSRC KBUILD_EXTMOD KBUILD_SRC |
98 | + |
99 | objtree := . |
100 | src := $(srctree) |
101 | obj := $(objtree) |
102 | @@ -215,6 +209,74 @@ VPATH := $(srctree)$(if $(KBUILD_EXTMOD),:$(KBUILD_EXTMOD)) |
103 | |
104 | export srctree objtree VPATH |
105 | |
106 | +# To make sure we do not include .config for any of the *config targets |
107 | +# catch them early, and hand them over to scripts/kconfig/Makefile |
108 | +# It is allowed to specify more targets when calling make, including |
109 | +# mixing *config targets and build targets. |
110 | +# For example 'make oldconfig all'. |
111 | +# Detect when mixed targets is specified, and make a second invocation |
112 | +# of make so .config is not included in this case either (for *config). |
113 | + |
114 | +version_h := include/generated/uapi/linux/version.h |
115 | +old_version_h := include/linux/version.h |
116 | + |
117 | +no-dot-config-targets := clean mrproper distclean \ |
118 | + cscope gtags TAGS tags help% %docs check% coccicheck \ |
119 | + $(version_h) headers_% archheaders archscripts \ |
120 | + kernelversion %src-pkg |
121 | + |
122 | +config-targets := 0 |
123 | +mixed-targets := 0 |
124 | +dot-config := 1 |
125 | + |
126 | +ifneq ($(filter $(no-dot-config-targets), $(MAKECMDGOALS)),) |
127 | + ifeq ($(filter-out $(no-dot-config-targets), $(MAKECMDGOALS)),) |
128 | + dot-config := 0 |
129 | + endif |
130 | +endif |
131 | + |
132 | +ifeq ($(KBUILD_EXTMOD),) |
133 | + ifneq ($(filter config %config,$(MAKECMDGOALS)),) |
134 | + config-targets := 1 |
135 | + ifneq ($(words $(MAKECMDGOALS)),1) |
136 | + mixed-targets := 1 |
137 | + endif |
138 | + endif |
139 | +endif |
140 | +# install and modules_install need also be processed one by one |
141 | +ifneq ($(filter install,$(MAKECMDGOALS)),) |
142 | + ifneq ($(filter modules_install,$(MAKECMDGOALS)),) |
143 | + mixed-targets := 1 |
144 | + endif |
145 | +endif |
146 | + |
147 | +ifeq ($(mixed-targets),1) |
148 | +# =========================================================================== |
149 | +# We're called with mixed targets (*config and build targets). |
150 | +# Handle them one by one. |
151 | + |
152 | +PHONY += $(MAKECMDGOALS) __build_one_by_one |
153 | + |
154 | +$(filter-out __build_one_by_one, $(MAKECMDGOALS)): __build_one_by_one |
155 | + @: |
156 | + |
157 | +__build_one_by_one: |
158 | + $(Q)set -e; \ |
159 | + for i in $(MAKECMDGOALS); do \ |
160 | + $(MAKE) -f $(srctree)/Makefile $$i; \ |
161 | + done |
162 | + |
163 | +else |
164 | + |
165 | +# We need some generic definitions (do not try to remake the file). |
166 | +scripts/Kbuild.include: ; |
167 | +include scripts/Kbuild.include |
168 | + |
169 | +# Read KERNELRELEASE from include/config/kernel.release (if it exists) |
170 | +KERNELRELEASE = $(shell cat include/config/kernel.release 2> /dev/null) |
171 | +KERNELVERSION = $(VERSION)$(if $(PATCHLEVEL),.$(PATCHLEVEL)$(if $(SUBLEVEL),.$(SUBLEVEL)))$(EXTRAVERSION) |
172 | +export VERSION PATCHLEVEL SUBLEVEL KERNELRELEASE KERNELVERSION |
173 | + |
174 | # SUBARCH tells the usermode build what the underlying arch is. That is set |
175 | # first, and if a usermode build is happening, the "ARCH=um" on the command |
176 | # line overrides the setting of ARCH below. If a native build is happening, |
177 | @@ -312,40 +374,6 @@ HOSTCFLAGS += -Wno-unused-value -Wno-unused-parameter \ |
178 | -Wno-missing-field-initializers -fno-delete-null-pointer-checks |
179 | endif |
180 | |
181 | -# Decide whether to build built-in, modular, or both. |
182 | -# Normally, just do built-in. |
183 | - |
184 | -KBUILD_MODULES := |
185 | -KBUILD_BUILTIN := 1 |
186 | - |
187 | -# If we have only "make modules", don't compile built-in objects. |
188 | -# When we're building modules with modversions, we need to consider |
189 | -# the built-in objects during the descend as well, in order to |
190 | -# make sure the checksums are up to date before we record them. |
191 | - |
192 | -ifeq ($(MAKECMDGOALS),modules) |
193 | - KBUILD_BUILTIN := $(if $(CONFIG_MODVERSIONS),1) |
194 | -endif |
195 | - |
196 | -# If we have "make <whatever> modules", compile modules |
197 | -# in addition to whatever we do anyway. |
198 | -# Just "make" or "make all" shall build modules as well |
199 | - |
200 | -ifneq ($(filter all _all modules,$(MAKECMDGOALS)),) |
201 | - KBUILD_MODULES := 1 |
202 | -endif |
203 | - |
204 | -ifeq ($(MAKECMDGOALS),) |
205 | - KBUILD_MODULES := 1 |
206 | -endif |
207 | - |
208 | -export KBUILD_MODULES KBUILD_BUILTIN |
209 | -export KBUILD_CHECKSRC KBUILD_SRC KBUILD_EXTMOD |
210 | - |
211 | -# We need some generic definitions (do not try to remake the file). |
212 | -scripts/Kbuild.include: ; |
213 | -include scripts/Kbuild.include |
214 | - |
215 | # Make variables (CC, etc...) |
216 | AS = $(CROSS_COMPILE)as |
217 | LD = $(CROSS_COMPILE)ld |
218 | @@ -405,11 +433,6 @@ KBUILD_CFLAGS_MODULE := -DMODULE |
219 | KBUILD_LDFLAGS_MODULE := -T $(srctree)/scripts/module-common.lds |
220 | GCC_PLUGINS_CFLAGS := |
221 | |
222 | -# Read KERNELRELEASE from include/config/kernel.release (if it exists) |
223 | -KERNELRELEASE = $(shell cat include/config/kernel.release 2> /dev/null) |
224 | -KERNELVERSION = $(VERSION)$(if $(PATCHLEVEL),.$(PATCHLEVEL)$(if $(SUBLEVEL),.$(SUBLEVEL)))$(EXTRAVERSION) |
225 | - |
226 | -export VERSION PATCHLEVEL SUBLEVEL KERNELRELEASE KERNELVERSION |
227 | export ARCH SRCARCH CONFIG_SHELL HOSTCC HOSTCFLAGS CROSS_COMPILE AS LD CC |
228 | export CPP AR NM STRIP OBJCOPY OBJDUMP HOSTLDFLAGS HOST_LOADLIBES |
229 | export MAKE AWK GENKSYMS INSTALLKERNEL PERL PYTHON UTS_MACHINE |
230 | @@ -459,73 +482,23 @@ ifneq ($(KBUILD_SRC),) |
231 | $(srctree) $(objtree) $(VERSION) $(PATCHLEVEL) |
232 | endif |
233 | |
234 | -# Support for using generic headers in asm-generic |
235 | -PHONY += asm-generic uapi-asm-generic |
236 | -asm-generic: uapi-asm-generic |
237 | - $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.asm-generic \ |
238 | - src=asm obj=arch/$(SRCARCH)/include/generated/asm |
239 | -uapi-asm-generic: |
240 | - $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.asm-generic \ |
241 | - src=uapi/asm obj=arch/$(SRCARCH)/include/generated/uapi/asm |
242 | - |
243 | -# To make sure we do not include .config for any of the *config targets |
244 | -# catch them early, and hand them over to scripts/kconfig/Makefile |
245 | -# It is allowed to specify more targets when calling make, including |
246 | -# mixing *config targets and build targets. |
247 | -# For example 'make oldconfig all'. |
248 | -# Detect when mixed targets is specified, and make a second invocation |
249 | -# of make so .config is not included in this case either (for *config). |
250 | - |
251 | -version_h := include/generated/uapi/linux/version.h |
252 | -old_version_h := include/linux/version.h |
253 | - |
254 | -no-dot-config-targets := clean mrproper distclean \ |
255 | - cscope gtags TAGS tags help% %docs check% coccicheck \ |
256 | - $(version_h) headers_% archheaders archscripts \ |
257 | - kernelversion %src-pkg |
258 | - |
259 | -config-targets := 0 |
260 | -mixed-targets := 0 |
261 | -dot-config := 1 |
262 | - |
263 | -ifneq ($(filter $(no-dot-config-targets), $(MAKECMDGOALS)),) |
264 | - ifeq ($(filter-out $(no-dot-config-targets), $(MAKECMDGOALS)),) |
265 | - dot-config := 0 |
266 | - endif |
267 | +ifeq ($(cc-name),clang) |
268 | +ifneq ($(CROSS_COMPILE),) |
269 | +CLANG_TARGET := --target=$(notdir $(CROSS_COMPILE:%-=%)) |
270 | +GCC_TOOLCHAIN := $(realpath $(dir $(shell which $(LD)))/..) |
271 | endif |
272 | - |
273 | -ifeq ($(KBUILD_EXTMOD),) |
274 | - ifneq ($(filter config %config,$(MAKECMDGOALS)),) |
275 | - config-targets := 1 |
276 | - ifneq ($(words $(MAKECMDGOALS)),1) |
277 | - mixed-targets := 1 |
278 | - endif |
279 | - endif |
280 | +ifneq ($(GCC_TOOLCHAIN),) |
281 | +CLANG_GCC_TC := --gcc-toolchain=$(GCC_TOOLCHAIN) |
282 | endif |
283 | -# install and modules_install need also be processed one by one |
284 | -ifneq ($(filter install,$(MAKECMDGOALS)),) |
285 | - ifneq ($(filter modules_install,$(MAKECMDGOALS)),) |
286 | - mixed-targets := 1 |
287 | - endif |
288 | +KBUILD_CFLAGS += $(CLANG_TARGET) $(CLANG_GCC_TC) |
289 | +KBUILD_AFLAGS += $(CLANG_TARGET) $(CLANG_GCC_TC) |
290 | endif |
291 | |
292 | -ifeq ($(mixed-targets),1) |
293 | -# =========================================================================== |
294 | -# We're called with mixed targets (*config and build targets). |
295 | -# Handle them one by one. |
296 | - |
297 | -PHONY += $(MAKECMDGOALS) __build_one_by_one |
298 | +RETPOLINE_CFLAGS_GCC := -mindirect-branch=thunk-extern -mindirect-branch-register |
299 | +RETPOLINE_CFLAGS_CLANG := -mretpoline-external-thunk |
300 | +RETPOLINE_CFLAGS := $(call cc-option,$(RETPOLINE_CFLAGS_GCC),$(call cc-option,$(RETPOLINE_CFLAGS_CLANG))) |
301 | +export RETPOLINE_CFLAGS |
302 | |
303 | -$(filter-out __build_one_by_one, $(MAKECMDGOALS)): __build_one_by_one |
304 | - @: |
305 | - |
306 | -__build_one_by_one: |
307 | - $(Q)set -e; \ |
308 | - for i in $(MAKECMDGOALS); do \ |
309 | - $(MAKE) -f $(srctree)/Makefile $$i; \ |
310 | - done |
311 | - |
312 | -else |
313 | ifeq ($(config-targets),1) |
314 | # =========================================================================== |
315 | # *config targets only - make sure prerequisites are updated, and descend |
316 | @@ -548,6 +521,44 @@ else |
317 | # Build targets only - this includes vmlinux, arch specific targets, clean |
318 | # targets and others. In general all targets except *config targets. |
319 | |
320 | +# If building an external module we do not care about the all: rule |
321 | +# but instead _all depend on modules |
322 | +PHONY += all |
323 | +ifeq ($(KBUILD_EXTMOD),) |
324 | +_all: all |
325 | +else |
326 | +_all: modules |
327 | +endif |
328 | + |
329 | +# Decide whether to build built-in, modular, or both. |
330 | +# Normally, just do built-in. |
331 | + |
332 | +KBUILD_MODULES := |
333 | +KBUILD_BUILTIN := 1 |
334 | + |
335 | +# If we have only "make modules", don't compile built-in objects. |
336 | +# When we're building modules with modversions, we need to consider |
337 | +# the built-in objects during the descend as well, in order to |
338 | +# make sure the checksums are up to date before we record them. |
339 | + |
340 | +ifeq ($(MAKECMDGOALS),modules) |
341 | + KBUILD_BUILTIN := $(if $(CONFIG_MODVERSIONS),1) |
342 | +endif |
343 | + |
344 | +# If we have "make <whatever> modules", compile modules |
345 | +# in addition to whatever we do anyway. |
346 | +# Just "make" or "make all" shall build modules as well |
347 | + |
348 | +ifneq ($(filter all _all modules,$(MAKECMDGOALS)),) |
349 | + KBUILD_MODULES := 1 |
350 | +endif |
351 | + |
352 | +ifeq ($(MAKECMDGOALS),) |
353 | + KBUILD_MODULES := 1 |
354 | +endif |
355 | + |
356 | +export KBUILD_MODULES KBUILD_BUILTIN |
357 | + |
358 | ifeq ($(KBUILD_EXTMOD),) |
359 | # Additional helpers built in scripts/ |
360 | # Carefully list dependencies so we do not try to build scripts twice |
361 | @@ -699,15 +710,6 @@ endif |
362 | KBUILD_CFLAGS += $(stackp-flag) |
363 | |
364 | ifeq ($(cc-name),clang) |
365 | -ifneq ($(CROSS_COMPILE),) |
366 | -CLANG_TARGET := --target=$(notdir $(CROSS_COMPILE:%-=%)) |
367 | -GCC_TOOLCHAIN := $(realpath $(dir $(shell which $(LD)))/..) |
368 | -endif |
369 | -ifneq ($(GCC_TOOLCHAIN),) |
370 | -CLANG_GCC_TC := --gcc-toolchain=$(GCC_TOOLCHAIN) |
371 | -endif |
372 | -KBUILD_CFLAGS += $(CLANG_TARGET) $(CLANG_GCC_TC) |
373 | -KBUILD_AFLAGS += $(CLANG_TARGET) $(CLANG_GCC_TC) |
374 | KBUILD_CPPFLAGS += $(call cc-option,-Qunused-arguments,) |
375 | KBUILD_CFLAGS += $(call cc-disable-warning, unused-variable) |
376 | KBUILD_CFLAGS += $(call cc-disable-warning, format-invalid-specifier) |
377 | @@ -1076,6 +1078,15 @@ prepare0: archprepare gcc-plugins |
378 | # All the preparing.. |
379 | prepare: prepare0 prepare-objtool |
380 | |
381 | +# Support for using generic headers in asm-generic |
382 | +PHONY += asm-generic uapi-asm-generic |
383 | +asm-generic: uapi-asm-generic |
384 | + $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.asm-generic \ |
385 | + src=asm obj=arch/$(SRCARCH)/include/generated/asm |
386 | +uapi-asm-generic: |
387 | + $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.asm-generic \ |
388 | + src=uapi/asm obj=arch/$(SRCARCH)/include/generated/uapi/asm |
389 | + |
390 | PHONY += prepare-objtool |
391 | prepare-objtool: $(objtool_target) |
392 | |
393 | diff --git a/arch/arm/mach-omap2/omap-secure.c b/arch/arm/mach-omap2/omap-secure.c |
394 | index 9ff92050053c..fa7f308c9027 100644 |
395 | --- a/arch/arm/mach-omap2/omap-secure.c |
396 | +++ b/arch/arm/mach-omap2/omap-secure.c |
397 | @@ -73,6 +73,7 @@ phys_addr_t omap_secure_ram_mempool_base(void) |
398 | return omap_secure_memblock_base; |
399 | } |
400 | |
401 | +#if defined(CONFIG_ARCH_OMAP3) && defined(CONFIG_PM) |
402 | u32 omap3_save_secure_ram(void __iomem *addr, int size) |
403 | { |
404 | u32 ret; |
405 | @@ -91,6 +92,7 @@ u32 omap3_save_secure_ram(void __iomem *addr, int size) |
406 | |
407 | return ret; |
408 | } |
409 | +#endif |
410 | |
411 | /** |
412 | * rx51_secure_dispatcher: Routine to dispatch secure PPA API calls |
413 | diff --git a/arch/arm64/mm/mmu.c b/arch/arm64/mm/mmu.c |
414 | index fa20124c19d5..01bc0688d47d 100644 |
415 | --- a/arch/arm64/mm/mmu.c |
416 | +++ b/arch/arm64/mm/mmu.c |
417 | @@ -107,7 +107,7 @@ static bool pgattr_change_is_safe(u64 old, u64 new) |
418 | * The following mapping attributes may be updated in live |
419 | * kernel mappings without the need for break-before-make. |
420 | */ |
421 | - static const pteval_t mask = PTE_PXN | PTE_RDONLY | PTE_WRITE; |
422 | + static const pteval_t mask = PTE_PXN | PTE_RDONLY | PTE_WRITE | PTE_NG; |
423 | |
424 | /* creating or taking down mappings is always safe */ |
425 | if (old == 0 || new == 0) |
426 | @@ -117,9 +117,9 @@ static bool pgattr_change_is_safe(u64 old, u64 new) |
427 | if ((old | new) & PTE_CONT) |
428 | return false; |
429 | |
430 | - /* Transitioning from Global to Non-Global is safe */ |
431 | - if (((old ^ new) == PTE_NG) && (new & PTE_NG)) |
432 | - return true; |
433 | + /* Transitioning from Non-Global to Global is unsafe */ |
434 | + if (old & ~new & PTE_NG) |
435 | + return false; |
436 | |
437 | return ((old ^ new) & ~mask) == 0; |
438 | } |
439 | diff --git a/arch/mips/ath25/board.c b/arch/mips/ath25/board.c |
440 | index 9ab48ff80c1c..6d11ae581ea7 100644 |
441 | --- a/arch/mips/ath25/board.c |
442 | +++ b/arch/mips/ath25/board.c |
443 | @@ -135,6 +135,8 @@ int __init ath25_find_config(phys_addr_t base, unsigned long size) |
444 | } |
445 | |
446 | board_data = kzalloc(BOARD_CONFIG_BUFSZ, GFP_KERNEL); |
447 | + if (!board_data) |
448 | + goto error; |
449 | ath25_board.config = (struct ath25_boarddata *)board_data; |
450 | memcpy_fromio(board_data, bcfg, 0x100); |
451 | if (broken_boarddata) { |
452 | diff --git a/arch/mips/cavium-octeon/octeon-irq.c b/arch/mips/cavium-octeon/octeon-irq.c |
453 | index 5b3a3f6a9ad3..d99f5242169e 100644 |
454 | --- a/arch/mips/cavium-octeon/octeon-irq.c |
455 | +++ b/arch/mips/cavium-octeon/octeon-irq.c |
456 | @@ -2277,6 +2277,8 @@ static int __init octeon_irq_init_cib(struct device_node *ciu_node, |
457 | } |
458 | |
459 | host_data = kzalloc(sizeof(*host_data), GFP_KERNEL); |
460 | + if (!host_data) |
461 | + return -ENOMEM; |
462 | raw_spin_lock_init(&host_data->lock); |
463 | |
464 | addr = of_get_address(ciu_node, 0, NULL, NULL); |
465 | diff --git a/arch/mips/kernel/mips-cpc.c b/arch/mips/kernel/mips-cpc.c |
466 | index 19c88d770054..fcf9af492d60 100644 |
467 | --- a/arch/mips/kernel/mips-cpc.c |
468 | +++ b/arch/mips/kernel/mips-cpc.c |
469 | @@ -10,6 +10,8 @@ |
470 | |
471 | #include <linux/errno.h> |
472 | #include <linux/percpu.h> |
473 | +#include <linux/of.h> |
474 | +#include <linux/of_address.h> |
475 | #include <linux/spinlock.h> |
476 | |
477 | #include <asm/mips-cps.h> |
478 | @@ -22,6 +24,17 @@ static DEFINE_PER_CPU_ALIGNED(unsigned long, cpc_core_lock_flags); |
479 | |
480 | phys_addr_t __weak mips_cpc_default_phys_base(void) |
481 | { |
482 | + struct device_node *cpc_node; |
483 | + struct resource res; |
484 | + int err; |
485 | + |
486 | + cpc_node = of_find_compatible_node(of_root, NULL, "mti,mips-cpc"); |
487 | + if (cpc_node) { |
488 | + err = of_address_to_resource(cpc_node, 0, &res); |
489 | + if (!err) |
490 | + return res.start; |
491 | + } |
492 | + |
493 | return 0; |
494 | } |
495 | |
496 | diff --git a/arch/mips/kernel/smp-bmips.c b/arch/mips/kernel/smp-bmips.c |
497 | index 87dcac2447c8..382d12eb88f0 100644 |
498 | --- a/arch/mips/kernel/smp-bmips.c |
499 | +++ b/arch/mips/kernel/smp-bmips.c |
500 | @@ -168,11 +168,11 @@ static void bmips_prepare_cpus(unsigned int max_cpus) |
501 | return; |
502 | } |
503 | |
504 | - if (request_irq(IPI0_IRQ, bmips_ipi_interrupt, IRQF_PERCPU, |
505 | - "smp_ipi0", NULL)) |
506 | + if (request_irq(IPI0_IRQ, bmips_ipi_interrupt, |
507 | + IRQF_PERCPU | IRQF_NO_SUSPEND, "smp_ipi0", NULL)) |
508 | panic("Can't request IPI0 interrupt"); |
509 | - if (request_irq(IPI1_IRQ, bmips_ipi_interrupt, IRQF_PERCPU, |
510 | - "smp_ipi1", NULL)) |
511 | + if (request_irq(IPI1_IRQ, bmips_ipi_interrupt, |
512 | + IRQF_PERCPU | IRQF_NO_SUSPEND, "smp_ipi1", NULL)) |
513 | panic("Can't request IPI1 interrupt"); |
514 | } |
515 | |
516 | diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c |
517 | index f4f12ecd0cec..0fa3a788dd20 100644 |
518 | --- a/arch/s390/kvm/kvm-s390.c |
519 | +++ b/arch/s390/kvm/kvm-s390.c |
520 | @@ -2119,6 +2119,7 @@ static void sca_add_vcpu(struct kvm_vcpu *vcpu) |
521 | /* we still need the basic sca for the ipte control */ |
522 | vcpu->arch.sie_block->scaoh = (__u32)(((__u64)sca) >> 32); |
523 | vcpu->arch.sie_block->scaol = (__u32)(__u64)sca; |
524 | + return; |
525 | } |
526 | read_lock(&vcpu->kvm->arch.sca_lock); |
527 | if (vcpu->kvm->arch.use_esca) { |
528 | diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig |
529 | index 559b37bf5a2e..7483cd514c32 100644 |
530 | --- a/arch/x86/Kconfig |
531 | +++ b/arch/x86/Kconfig |
532 | @@ -431,6 +431,7 @@ config GOLDFISH |
533 | config RETPOLINE |
534 | bool "Avoid speculative indirect branches in kernel" |
535 | default y |
536 | + select STACK_VALIDATION if HAVE_STACK_VALIDATION |
537 | help |
538 | Compile kernel with the retpoline compiler options to guard against |
539 | kernel-to-user data leaks by avoiding speculative indirect |
540 | diff --git a/arch/x86/Makefile b/arch/x86/Makefile |
541 | index fad55160dcb9..498c1b812300 100644 |
542 | --- a/arch/x86/Makefile |
543 | +++ b/arch/x86/Makefile |
544 | @@ -232,10 +232,9 @@ KBUILD_CFLAGS += -fno-asynchronous-unwind-tables |
545 | |
546 | # Avoid indirect branches in kernel to deal with Spectre |
547 | ifdef CONFIG_RETPOLINE |
548 | - RETPOLINE_CFLAGS += $(call cc-option,-mindirect-branch=thunk-extern -mindirect-branch-register) |
549 | - ifneq ($(RETPOLINE_CFLAGS),) |
550 | - KBUILD_CFLAGS += $(RETPOLINE_CFLAGS) -DRETPOLINE |
551 | - endif |
552 | +ifneq ($(RETPOLINE_CFLAGS),) |
553 | + KBUILD_CFLAGS += $(RETPOLINE_CFLAGS) -DRETPOLINE |
554 | +endif |
555 | endif |
556 | |
557 | archscripts: scripts_basic |
558 | diff --git a/arch/x86/entry/calling.h b/arch/x86/entry/calling.h |
559 | index dce7092ab24a..5d10b7a85cad 100644 |
560 | --- a/arch/x86/entry/calling.h |
561 | +++ b/arch/x86/entry/calling.h |
562 | @@ -97,7 +97,7 @@ For 32-bit we have the following conventions - kernel is built with |
563 | |
564 | #define SIZEOF_PTREGS 21*8 |
565 | |
566 | -.macro PUSH_AND_CLEAR_REGS rdx=%rdx rax=%rax |
567 | +.macro PUSH_AND_CLEAR_REGS rdx=%rdx rax=%rax save_ret=0 |
568 | /* |
569 | * Push registers and sanitize registers of values that a |
570 | * speculation attack might otherwise want to exploit. The |
571 | @@ -105,32 +105,41 @@ For 32-bit we have the following conventions - kernel is built with |
572 | * could be put to use in a speculative execution gadget. |
573 | * Interleave XOR with PUSH for better uop scheduling: |
574 | */ |
575 | + .if \save_ret |
576 | + pushq %rsi /* pt_regs->si */ |
577 | + movq 8(%rsp), %rsi /* temporarily store the return address in %rsi */ |
578 | + movq %rdi, 8(%rsp) /* pt_regs->di (overwriting original return address) */ |
579 | + .else |
580 | pushq %rdi /* pt_regs->di */ |
581 | pushq %rsi /* pt_regs->si */ |
582 | + .endif |
583 | pushq \rdx /* pt_regs->dx */ |
584 | pushq %rcx /* pt_regs->cx */ |
585 | pushq \rax /* pt_regs->ax */ |
586 | pushq %r8 /* pt_regs->r8 */ |
587 | - xorq %r8, %r8 /* nospec r8 */ |
588 | + xorl %r8d, %r8d /* nospec r8 */ |
589 | pushq %r9 /* pt_regs->r9 */ |
590 | - xorq %r9, %r9 /* nospec r9 */ |
591 | + xorl %r9d, %r9d /* nospec r9 */ |
592 | pushq %r10 /* pt_regs->r10 */ |
593 | - xorq %r10, %r10 /* nospec r10 */ |
594 | + xorl %r10d, %r10d /* nospec r10 */ |
595 | pushq %r11 /* pt_regs->r11 */ |
596 | - xorq %r11, %r11 /* nospec r11*/ |
597 | + xorl %r11d, %r11d /* nospec r11*/ |
598 | pushq %rbx /* pt_regs->rbx */ |
599 | xorl %ebx, %ebx /* nospec rbx*/ |
600 | pushq %rbp /* pt_regs->rbp */ |
601 | xorl %ebp, %ebp /* nospec rbp*/ |
602 | pushq %r12 /* pt_regs->r12 */ |
603 | - xorq %r12, %r12 /* nospec r12*/ |
604 | + xorl %r12d, %r12d /* nospec r12*/ |
605 | pushq %r13 /* pt_regs->r13 */ |
606 | - xorq %r13, %r13 /* nospec r13*/ |
607 | + xorl %r13d, %r13d /* nospec r13*/ |
608 | pushq %r14 /* pt_regs->r14 */ |
609 | - xorq %r14, %r14 /* nospec r14*/ |
610 | + xorl %r14d, %r14d /* nospec r14*/ |
611 | pushq %r15 /* pt_regs->r15 */ |
612 | - xorq %r15, %r15 /* nospec r15*/ |
613 | + xorl %r15d, %r15d /* nospec r15*/ |
614 | UNWIND_HINT_REGS |
615 | + .if \save_ret |
616 | + pushq %rsi /* return address on top of stack */ |
617 | + .endif |
618 | .endm |
619 | |
620 | .macro POP_REGS pop_rdi=1 skip_r11rcx=0 |
621 | diff --git a/arch/x86/entry/entry_32.S b/arch/x86/entry/entry_32.S |
622 | index 2a35b1e0fb90..60c4c342316c 100644 |
623 | --- a/arch/x86/entry/entry_32.S |
624 | +++ b/arch/x86/entry/entry_32.S |
625 | @@ -252,8 +252,7 @@ ENTRY(__switch_to_asm) |
626 | * exist, overwrite the RSB with entries which capture |
627 | * speculative execution to prevent attack. |
628 | */ |
629 | - /* Clobbers %ebx */ |
630 | - FILL_RETURN_BUFFER RSB_CLEAR_LOOPS, X86_FEATURE_RSB_CTXSW |
631 | + FILL_RETURN_BUFFER %ebx, RSB_CLEAR_LOOPS, X86_FEATURE_RSB_CTXSW |
632 | #endif |
633 | |
634 | /* restore callee-saved registers */ |
635 | diff --git a/arch/x86/entry/entry_64.S b/arch/x86/entry/entry_64.S |
636 | index 68a2d76e4f8f..6f3cc15e0c73 100644 |
637 | --- a/arch/x86/entry/entry_64.S |
638 | +++ b/arch/x86/entry/entry_64.S |
639 | @@ -360,8 +360,7 @@ ENTRY(__switch_to_asm) |
640 | * exist, overwrite the RSB with entries which capture |
641 | * speculative execution to prevent attack. |
642 | */ |
643 | - /* Clobbers %rbx */ |
644 | - FILL_RETURN_BUFFER RSB_CLEAR_LOOPS, X86_FEATURE_RSB_CTXSW |
645 | + FILL_RETURN_BUFFER %r12, RSB_CLEAR_LOOPS, X86_FEATURE_RSB_CTXSW |
646 | #endif |
647 | |
648 | /* restore callee-saved registers */ |
649 | @@ -867,12 +866,8 @@ ENTRY(\sym) |
650 | pushq $-1 /* ORIG_RAX: no syscall to restart */ |
651 | .endif |
652 | |
653 | - /* Save all registers in pt_regs */ |
654 | - PUSH_AND_CLEAR_REGS |
655 | - ENCODE_FRAME_POINTER |
656 | - |
657 | .if \paranoid < 2 |
658 | - testb $3, CS(%rsp) /* If coming from userspace, switch stacks */ |
659 | + testb $3, CS-ORIG_RAX(%rsp) /* If coming from userspace, switch stacks */ |
660 | jnz .Lfrom_usermode_switch_stack_\@ |
661 | .endif |
662 | |
663 | @@ -1117,13 +1112,15 @@ idtentry machine_check do_mce has_error_code=0 paranoid=1 |
664 | #endif |
665 | |
666 | /* |
667 | - * Switch gs if needed. |
668 | + * Save all registers in pt_regs, and switch gs if needed. |
669 | * Use slow, but surefire "are we in kernel?" check. |
670 | * Return: ebx=0: need swapgs on exit, ebx=1: otherwise |
671 | */ |
672 | ENTRY(paranoid_entry) |
673 | UNWIND_HINT_FUNC |
674 | cld |
675 | + PUSH_AND_CLEAR_REGS save_ret=1 |
676 | + ENCODE_FRAME_POINTER 8 |
677 | movl $1, %ebx |
678 | movl $MSR_GS_BASE, %ecx |
679 | rdmsr |
680 | @@ -1168,12 +1165,14 @@ ENTRY(paranoid_exit) |
681 | END(paranoid_exit) |
682 | |
683 | /* |
684 | - * Switch gs if needed. |
685 | + * Save all registers in pt_regs, and switch GS if needed. |
686 | * Return: EBX=0: came from user mode; EBX=1: otherwise |
687 | */ |
688 | ENTRY(error_entry) |
689 | - UNWIND_HINT_REGS offset=8 |
690 | + UNWIND_HINT_FUNC |
691 | cld |
692 | + PUSH_AND_CLEAR_REGS save_ret=1 |
693 | + ENCODE_FRAME_POINTER 8 |
694 | testb $3, CS+8(%rsp) |
695 | jz .Lerror_kernelspace |
696 | |
697 | @@ -1564,8 +1563,6 @@ end_repeat_nmi: |
698 | * frame to point back to repeat_nmi. |
699 | */ |
700 | pushq $-1 /* ORIG_RAX: no syscall to restart */ |
701 | - PUSH_AND_CLEAR_REGS |
702 | - ENCODE_FRAME_POINTER |
703 | |
704 | /* |
705 | * Use paranoid_entry to handle SWAPGS, but no need to use paranoid_exit |
706 | diff --git a/arch/x86/entry/entry_64_compat.S b/arch/x86/entry/entry_64_compat.S |
707 | index fd65e016e413..364ea4a207be 100644 |
708 | --- a/arch/x86/entry/entry_64_compat.S |
709 | +++ b/arch/x86/entry/entry_64_compat.S |
710 | @@ -85,25 +85,25 @@ ENTRY(entry_SYSENTER_compat) |
711 | pushq %rcx /* pt_regs->cx */ |
712 | pushq $-ENOSYS /* pt_regs->ax */ |
713 | pushq $0 /* pt_regs->r8 = 0 */ |
714 | - xorq %r8, %r8 /* nospec r8 */ |
715 | + xorl %r8d, %r8d /* nospec r8 */ |
716 | pushq $0 /* pt_regs->r9 = 0 */ |
717 | - xorq %r9, %r9 /* nospec r9 */ |
718 | + xorl %r9d, %r9d /* nospec r9 */ |
719 | pushq $0 /* pt_regs->r10 = 0 */ |
720 | - xorq %r10, %r10 /* nospec r10 */ |
721 | + xorl %r10d, %r10d /* nospec r10 */ |
722 | pushq $0 /* pt_regs->r11 = 0 */ |
723 | - xorq %r11, %r11 /* nospec r11 */ |
724 | + xorl %r11d, %r11d /* nospec r11 */ |
725 | pushq %rbx /* pt_regs->rbx */ |
726 | xorl %ebx, %ebx /* nospec rbx */ |
727 | pushq %rbp /* pt_regs->rbp (will be overwritten) */ |
728 | xorl %ebp, %ebp /* nospec rbp */ |
729 | pushq $0 /* pt_regs->r12 = 0 */ |
730 | - xorq %r12, %r12 /* nospec r12 */ |
731 | + xorl %r12d, %r12d /* nospec r12 */ |
732 | pushq $0 /* pt_regs->r13 = 0 */ |
733 | - xorq %r13, %r13 /* nospec r13 */ |
734 | + xorl %r13d, %r13d /* nospec r13 */ |
735 | pushq $0 /* pt_regs->r14 = 0 */ |
736 | - xorq %r14, %r14 /* nospec r14 */ |
737 | + xorl %r14d, %r14d /* nospec r14 */ |
738 | pushq $0 /* pt_regs->r15 = 0 */ |
739 | - xorq %r15, %r15 /* nospec r15 */ |
740 | + xorl %r15d, %r15d /* nospec r15 */ |
741 | cld |
742 | |
743 | /* |
744 | @@ -224,25 +224,25 @@ GLOBAL(entry_SYSCALL_compat_after_hwframe) |
745 | pushq %rbp /* pt_regs->cx (stashed in bp) */ |
746 | pushq $-ENOSYS /* pt_regs->ax */ |
747 | pushq $0 /* pt_regs->r8 = 0 */ |
748 | - xorq %r8, %r8 /* nospec r8 */ |
749 | + xorl %r8d, %r8d /* nospec r8 */ |
750 | pushq $0 /* pt_regs->r9 = 0 */ |
751 | - xorq %r9, %r9 /* nospec r9 */ |
752 | + xorl %r9d, %r9d /* nospec r9 */ |
753 | pushq $0 /* pt_regs->r10 = 0 */ |
754 | - xorq %r10, %r10 /* nospec r10 */ |
755 | + xorl %r10d, %r10d /* nospec r10 */ |
756 | pushq $0 /* pt_regs->r11 = 0 */ |
757 | - xorq %r11, %r11 /* nospec r11 */ |
758 | + xorl %r11d, %r11d /* nospec r11 */ |
759 | pushq %rbx /* pt_regs->rbx */ |
760 | xorl %ebx, %ebx /* nospec rbx */ |
761 | pushq %rbp /* pt_regs->rbp (will be overwritten) */ |
762 | xorl %ebp, %ebp /* nospec rbp */ |
763 | pushq $0 /* pt_regs->r12 = 0 */ |
764 | - xorq %r12, %r12 /* nospec r12 */ |
765 | + xorl %r12d, %r12d /* nospec r12 */ |
766 | pushq $0 /* pt_regs->r13 = 0 */ |
767 | - xorq %r13, %r13 /* nospec r13 */ |
768 | + xorl %r13d, %r13d /* nospec r13 */ |
769 | pushq $0 /* pt_regs->r14 = 0 */ |
770 | - xorq %r14, %r14 /* nospec r14 */ |
771 | + xorl %r14d, %r14d /* nospec r14 */ |
772 | pushq $0 /* pt_regs->r15 = 0 */ |
773 | - xorq %r15, %r15 /* nospec r15 */ |
774 | + xorl %r15d, %r15d /* nospec r15 */ |
775 | |
776 | /* |
777 | * User mode is traced as though IRQs are on, and SYSENTER |
778 | @@ -298,9 +298,9 @@ sysret32_from_system_call: |
779 | */ |
780 | SWITCH_TO_USER_CR3_NOSTACK scratch_reg=%r8 scratch_reg2=%r9 |
781 | |
782 | - xorq %r8, %r8 |
783 | - xorq %r9, %r9 |
784 | - xorq %r10, %r10 |
785 | + xorl %r8d, %r8d |
786 | + xorl %r9d, %r9d |
787 | + xorl %r10d, %r10d |
788 | swapgs |
789 | sysretl |
790 | END(entry_SYSCALL_compat) |
791 | @@ -358,25 +358,25 @@ ENTRY(entry_INT80_compat) |
792 | pushq %rcx /* pt_regs->cx */ |
793 | pushq $-ENOSYS /* pt_regs->ax */ |
794 | pushq $0 /* pt_regs->r8 = 0 */ |
795 | - xorq %r8, %r8 /* nospec r8 */ |
796 | + xorl %r8d, %r8d /* nospec r8 */ |
797 | pushq $0 /* pt_regs->r9 = 0 */ |
798 | - xorq %r9, %r9 /* nospec r9 */ |
799 | + xorl %r9d, %r9d /* nospec r9 */ |
800 | pushq $0 /* pt_regs->r10 = 0 */ |
801 | - xorq %r10, %r10 /* nospec r10 */ |
802 | + xorl %r10d, %r10d /* nospec r10 */ |
803 | pushq $0 /* pt_regs->r11 = 0 */ |
804 | - xorq %r11, %r11 /* nospec r11 */ |
805 | + xorl %r11d, %r11d /* nospec r11 */ |
806 | pushq %rbx /* pt_regs->rbx */ |
807 | xorl %ebx, %ebx /* nospec rbx */ |
808 | pushq %rbp /* pt_regs->rbp */ |
809 | xorl %ebp, %ebp /* nospec rbp */ |
810 | pushq %r12 /* pt_regs->r12 */ |
811 | - xorq %r12, %r12 /* nospec r12 */ |
812 | + xorl %r12d, %r12d /* nospec r12 */ |
813 | pushq %r13 /* pt_regs->r13 */ |
814 | - xorq %r13, %r13 /* nospec r13 */ |
815 | + xorl %r13d, %r13d /* nospec r13 */ |
816 | pushq %r14 /* pt_regs->r14 */ |
817 | - xorq %r14, %r14 /* nospec r14 */ |
818 | + xorl %r14d, %r14d /* nospec r14 */ |
819 | pushq %r15 /* pt_regs->r15 */ |
820 | - xorq %r15, %r15 /* nospec r15 */ |
821 | + xorl %r15d, %r15d /* nospec r15 */ |
822 | cld |
823 | |
824 | /* |
825 | diff --git a/arch/x86/include/asm/apm.h b/arch/x86/include/asm/apm.h |
826 | index 4d4015ddcf26..c356098b6fb9 100644 |
827 | --- a/arch/x86/include/asm/apm.h |
828 | +++ b/arch/x86/include/asm/apm.h |
829 | @@ -7,6 +7,8 @@ |
830 | #ifndef _ASM_X86_MACH_DEFAULT_APM_H |
831 | #define _ASM_X86_MACH_DEFAULT_APM_H |
832 | |
833 | +#include <asm/nospec-branch.h> |
834 | + |
835 | #ifdef APM_ZERO_SEGS |
836 | # define APM_DO_ZERO_SEGS \ |
837 | "pushl %%ds\n\t" \ |
838 | @@ -32,6 +34,7 @@ static inline void apm_bios_call_asm(u32 func, u32 ebx_in, u32 ecx_in, |
839 | * N.B. We do NOT need a cld after the BIOS call |
840 | * because we always save and restore the flags. |
841 | */ |
842 | + firmware_restrict_branch_speculation_start(); |
843 | __asm__ __volatile__(APM_DO_ZERO_SEGS |
844 | "pushl %%edi\n\t" |
845 | "pushl %%ebp\n\t" |
846 | @@ -44,6 +47,7 @@ static inline void apm_bios_call_asm(u32 func, u32 ebx_in, u32 ecx_in, |
847 | "=S" (*esi) |
848 | : "a" (func), "b" (ebx_in), "c" (ecx_in) |
849 | : "memory", "cc"); |
850 | + firmware_restrict_branch_speculation_end(); |
851 | } |
852 | |
853 | static inline bool apm_bios_call_simple_asm(u32 func, u32 ebx_in, |
854 | @@ -56,6 +60,7 @@ static inline bool apm_bios_call_simple_asm(u32 func, u32 ebx_in, |
855 | * N.B. We do NOT need a cld after the BIOS call |
856 | * because we always save and restore the flags. |
857 | */ |
858 | + firmware_restrict_branch_speculation_start(); |
859 | __asm__ __volatile__(APM_DO_ZERO_SEGS |
860 | "pushl %%edi\n\t" |
861 | "pushl %%ebp\n\t" |
862 | @@ -68,6 +73,7 @@ static inline bool apm_bios_call_simple_asm(u32 func, u32 ebx_in, |
863 | "=S" (si) |
864 | : "a" (func), "b" (ebx_in), "c" (ecx_in) |
865 | : "memory", "cc"); |
866 | + firmware_restrict_branch_speculation_end(); |
867 | return error; |
868 | } |
869 | |
870 | diff --git a/arch/x86/include/asm/asm-prototypes.h b/arch/x86/include/asm/asm-prototypes.h |
871 | index 4d111616524b..1908214b9125 100644 |
872 | --- a/arch/x86/include/asm/asm-prototypes.h |
873 | +++ b/arch/x86/include/asm/asm-prototypes.h |
874 | @@ -38,7 +38,4 @@ INDIRECT_THUNK(dx) |
875 | INDIRECT_THUNK(si) |
876 | INDIRECT_THUNK(di) |
877 | INDIRECT_THUNK(bp) |
878 | -asmlinkage void __fill_rsb(void); |
879 | -asmlinkage void __clear_rsb(void); |
880 | - |
881 | #endif /* CONFIG_RETPOLINE */ |
882 | diff --git a/arch/x86/include/asm/cpufeatures.h b/arch/x86/include/asm/cpufeatures.h |
883 | index 73b5fff159a4..66c14347c502 100644 |
884 | --- a/arch/x86/include/asm/cpufeatures.h |
885 | +++ b/arch/x86/include/asm/cpufeatures.h |
886 | @@ -211,6 +211,7 @@ |
887 | #define X86_FEATURE_RSB_CTXSW ( 7*32+19) /* "" Fill RSB on context switches */ |
888 | |
889 | #define X86_FEATURE_USE_IBPB ( 7*32+21) /* "" Indirect Branch Prediction Barrier enabled */ |
890 | +#define X86_FEATURE_USE_IBRS_FW ( 7*32+22) /* "" Use IBRS during runtime firmware calls */ |
891 | |
892 | /* Virtualization flags: Linux defined, word 8 */ |
893 | #define X86_FEATURE_TPR_SHADOW ( 8*32+ 0) /* Intel TPR Shadow */ |
894 | diff --git a/arch/x86/include/asm/efi.h b/arch/x86/include/asm/efi.h |
895 | index 85f6ccb80b91..a399c1ebf6f0 100644 |
896 | --- a/arch/x86/include/asm/efi.h |
897 | +++ b/arch/x86/include/asm/efi.h |
898 | @@ -6,6 +6,7 @@ |
899 | #include <asm/pgtable.h> |
900 | #include <asm/processor-flags.h> |
901 | #include <asm/tlb.h> |
902 | +#include <asm/nospec-branch.h> |
903 | |
904 | /* |
905 | * We map the EFI regions needed for runtime services non-contiguously, |
906 | @@ -36,8 +37,18 @@ |
907 | |
908 | extern asmlinkage unsigned long efi_call_phys(void *, ...); |
909 | |
910 | -#define arch_efi_call_virt_setup() kernel_fpu_begin() |
911 | -#define arch_efi_call_virt_teardown() kernel_fpu_end() |
912 | +#define arch_efi_call_virt_setup() \ |
913 | +({ \ |
914 | + kernel_fpu_begin(); \ |
915 | + firmware_restrict_branch_speculation_start(); \ |
916 | +}) |
917 | + |
918 | +#define arch_efi_call_virt_teardown() \ |
919 | +({ \ |
920 | + firmware_restrict_branch_speculation_end(); \ |
921 | + kernel_fpu_end(); \ |
922 | +}) |
923 | + |
924 | |
925 | /* |
926 | * Wrap all the virtual calls in a way that forces the parameters on the stack. |
927 | @@ -73,6 +84,7 @@ struct efi_scratch { |
928 | efi_sync_low_kernel_mappings(); \ |
929 | preempt_disable(); \ |
930 | __kernel_fpu_begin(); \ |
931 | + firmware_restrict_branch_speculation_start(); \ |
932 | \ |
933 | if (efi_scratch.use_pgd) { \ |
934 | efi_scratch.prev_cr3 = __read_cr3(); \ |
935 | @@ -91,6 +103,7 @@ struct efi_scratch { |
936 | __flush_tlb_all(); \ |
937 | } \ |
938 | \ |
939 | + firmware_restrict_branch_speculation_end(); \ |
940 | __kernel_fpu_end(); \ |
941 | preempt_enable(); \ |
942 | }) |
943 | diff --git a/arch/x86/include/asm/mmu_context.h b/arch/x86/include/asm/mmu_context.h |
944 | index c931b88982a0..1de72ce514cd 100644 |
945 | --- a/arch/x86/include/asm/mmu_context.h |
946 | +++ b/arch/x86/include/asm/mmu_context.h |
947 | @@ -74,6 +74,7 @@ static inline void *ldt_slot_va(int slot) |
948 | return (void *)(LDT_BASE_ADDR + LDT_SLOT_STRIDE * slot); |
949 | #else |
950 | BUG(); |
951 | + return (void *)fix_to_virt(FIX_HOLE); |
952 | #endif |
953 | } |
954 | |
955 | diff --git a/arch/x86/include/asm/nospec-branch.h b/arch/x86/include/asm/nospec-branch.h |
956 | index 81a1be326571..d0dabeae0505 100644 |
957 | --- a/arch/x86/include/asm/nospec-branch.h |
958 | +++ b/arch/x86/include/asm/nospec-branch.h |
959 | @@ -8,6 +8,50 @@ |
960 | #include <asm/cpufeatures.h> |
961 | #include <asm/msr-index.h> |
962 | |
963 | +/* |
964 | + * Fill the CPU return stack buffer. |
965 | + * |
966 | + * Each entry in the RSB, if used for a speculative 'ret', contains an |
967 | + * infinite 'pause; lfence; jmp' loop to capture speculative execution. |
968 | + * |
969 | + * This is required in various cases for retpoline and IBRS-based |
970 | + * mitigations for the Spectre variant 2 vulnerability. Sometimes to |
971 | + * eliminate potentially bogus entries from the RSB, and sometimes |
972 | + * purely to ensure that it doesn't get empty, which on some CPUs would |
973 | + * allow predictions from other (unwanted!) sources to be used. |
974 | + * |
975 | + * We define a CPP macro such that it can be used from both .S files and |
976 | + * inline assembly. It's possible to do a .macro and then include that |
977 | + * from C via asm(".include <asm/nospec-branch.h>") but let's not go there. |
978 | + */ |
979 | + |
980 | +#define RSB_CLEAR_LOOPS 32 /* To forcibly overwrite all entries */ |
981 | +#define RSB_FILL_LOOPS 16 /* To avoid underflow */ |
982 | + |
983 | +/* |
984 | + * Google experimented with loop-unrolling and this turned out to be |
985 | + * the optimal version — two calls, each with their own speculation |
986 | + * trap should their return address end up getting used, in a loop. |
987 | + */ |
988 | +#define __FILL_RETURN_BUFFER(reg, nr, sp) \ |
989 | + mov $(nr/2), reg; \ |
990 | +771: \ |
991 | + call 772f; \ |
992 | +773: /* speculation trap */ \ |
993 | + pause; \ |
994 | + lfence; \ |
995 | + jmp 773b; \ |
996 | +772: \ |
997 | + call 774f; \ |
998 | +775: /* speculation trap */ \ |
999 | + pause; \ |
1000 | + lfence; \ |
1001 | + jmp 775b; \ |
1002 | +774: \ |
1003 | + dec reg; \ |
1004 | + jnz 771b; \ |
1005 | + add $(BITS_PER_LONG/8) * nr, sp; |
1006 | + |
1007 | #ifdef __ASSEMBLY__ |
1008 | |
1009 | /* |
1010 | @@ -23,6 +67,18 @@ |
1011 | .popsection |
1012 | .endm |
1013 | |
1014 | +/* |
1015 | + * This should be used immediately before an indirect jump/call. It tells |
1016 | + * objtool the subsequent indirect jump/call is vouched safe for retpoline |
1017 | + * builds. |
1018 | + */ |
1019 | +.macro ANNOTATE_RETPOLINE_SAFE |
1020 | + .Lannotate_\@: |
1021 | + .pushsection .discard.retpoline_safe |
1022 | + _ASM_PTR .Lannotate_\@ |
1023 | + .popsection |
1024 | +.endm |
1025 | + |
1026 | /* |
1027 | * These are the bare retpoline primitives for indirect jmp and call. |
1028 | * Do not use these directly; they only exist to make the ALTERNATIVE |
1029 | @@ -59,9 +115,9 @@ |
1030 | .macro JMP_NOSPEC reg:req |
1031 | #ifdef CONFIG_RETPOLINE |
1032 | ANNOTATE_NOSPEC_ALTERNATIVE |
1033 | - ALTERNATIVE_2 __stringify(jmp *\reg), \ |
1034 | + ALTERNATIVE_2 __stringify(ANNOTATE_RETPOLINE_SAFE; jmp *\reg), \ |
1035 | __stringify(RETPOLINE_JMP \reg), X86_FEATURE_RETPOLINE, \ |
1036 | - __stringify(lfence; jmp *\reg), X86_FEATURE_RETPOLINE_AMD |
1037 | + __stringify(lfence; ANNOTATE_RETPOLINE_SAFE; jmp *\reg), X86_FEATURE_RETPOLINE_AMD |
1038 | #else |
1039 | jmp *\reg |
1040 | #endif |
1041 | @@ -70,18 +126,25 @@ |
1042 | .macro CALL_NOSPEC reg:req |
1043 | #ifdef CONFIG_RETPOLINE |
1044 | ANNOTATE_NOSPEC_ALTERNATIVE |
1045 | - ALTERNATIVE_2 __stringify(call *\reg), \ |
1046 | + ALTERNATIVE_2 __stringify(ANNOTATE_RETPOLINE_SAFE; call *\reg), \ |
1047 | __stringify(RETPOLINE_CALL \reg), X86_FEATURE_RETPOLINE,\ |
1048 | - __stringify(lfence; call *\reg), X86_FEATURE_RETPOLINE_AMD |
1049 | + __stringify(lfence; ANNOTATE_RETPOLINE_SAFE; call *\reg), X86_FEATURE_RETPOLINE_AMD |
1050 | #else |
1051 | call *\reg |
1052 | #endif |
1053 | .endm |
1054 | |
1055 | -/* This clobbers the BX register */ |
1056 | -.macro FILL_RETURN_BUFFER nr:req ftr:req |
1057 | + /* |
1058 | + * A simpler FILL_RETURN_BUFFER macro. Don't make people use the CPP |
1059 | + * monstrosity above, manually. |
1060 | + */ |
1061 | +.macro FILL_RETURN_BUFFER reg:req nr:req ftr:req |
1062 | #ifdef CONFIG_RETPOLINE |
1063 | - ALTERNATIVE "", "call __clear_rsb", \ftr |
1064 | + ANNOTATE_NOSPEC_ALTERNATIVE |
1065 | + ALTERNATIVE "jmp .Lskip_rsb_\@", \ |
1066 | + __stringify(__FILL_RETURN_BUFFER(\reg,\nr,%_ASM_SP)) \ |
1067 | + \ftr |
1068 | +.Lskip_rsb_\@: |
1069 | #endif |
1070 | .endm |
1071 | |
1072 | @@ -93,6 +156,12 @@ |
1073 | ".long 999b - .\n\t" \ |
1074 | ".popsection\n\t" |
1075 | |
1076 | +#define ANNOTATE_RETPOLINE_SAFE \ |
1077 | + "999:\n\t" \ |
1078 | + ".pushsection .discard.retpoline_safe\n\t" \ |
1079 | + _ASM_PTR " 999b\n\t" \ |
1080 | + ".popsection\n\t" |
1081 | + |
1082 | #if defined(CONFIG_X86_64) && defined(RETPOLINE) |
1083 | |
1084 | /* |
1085 | @@ -102,6 +171,7 @@ |
1086 | # define CALL_NOSPEC \ |
1087 | ANNOTATE_NOSPEC_ALTERNATIVE \ |
1088 | ALTERNATIVE( \ |
1089 | + ANNOTATE_RETPOLINE_SAFE \ |
1090 | "call *%[thunk_target]\n", \ |
1091 | "call __x86_indirect_thunk_%V[thunk_target]\n", \ |
1092 | X86_FEATURE_RETPOLINE) |
1093 | @@ -156,26 +226,54 @@ extern char __indirect_thunk_end[]; |
1094 | static inline void vmexit_fill_RSB(void) |
1095 | { |
1096 | #ifdef CONFIG_RETPOLINE |
1097 | - alternative_input("", |
1098 | - "call __fill_rsb", |
1099 | - X86_FEATURE_RETPOLINE, |
1100 | - ASM_NO_INPUT_CLOBBER(_ASM_BX, "memory")); |
1101 | + unsigned long loops; |
1102 | + |
1103 | + asm volatile (ANNOTATE_NOSPEC_ALTERNATIVE |
1104 | + ALTERNATIVE("jmp 910f", |
1105 | + __stringify(__FILL_RETURN_BUFFER(%0, RSB_CLEAR_LOOPS, %1)), |
1106 | + X86_FEATURE_RETPOLINE) |
1107 | + "910:" |
1108 | + : "=r" (loops), ASM_CALL_CONSTRAINT |
1109 | + : : "memory" ); |
1110 | #endif |
1111 | } |
1112 | |
1113 | +#define alternative_msr_write(_msr, _val, _feature) \ |
1114 | + asm volatile(ALTERNATIVE("", \ |
1115 | + "movl %[msr], %%ecx\n\t" \ |
1116 | + "movl %[val], %%eax\n\t" \ |
1117 | + "movl $0, %%edx\n\t" \ |
1118 | + "wrmsr", \ |
1119 | + _feature) \ |
1120 | + : : [msr] "i" (_msr), [val] "i" (_val) \ |
1121 | + : "eax", "ecx", "edx", "memory") |
1122 | + |
1123 | static inline void indirect_branch_prediction_barrier(void) |
1124 | { |
1125 | - asm volatile(ALTERNATIVE("", |
1126 | - "movl %[msr], %%ecx\n\t" |
1127 | - "movl %[val], %%eax\n\t" |
1128 | - "movl $0, %%edx\n\t" |
1129 | - "wrmsr", |
1130 | - X86_FEATURE_USE_IBPB) |
1131 | - : : [msr] "i" (MSR_IA32_PRED_CMD), |
1132 | - [val] "i" (PRED_CMD_IBPB) |
1133 | - : "eax", "ecx", "edx", "memory"); |
1134 | + alternative_msr_write(MSR_IA32_PRED_CMD, PRED_CMD_IBPB, |
1135 | + X86_FEATURE_USE_IBPB); |
1136 | } |
1137 | |
1138 | +/* |
1139 | + * With retpoline, we must use IBRS to restrict branch prediction |
1140 | + * before calling into firmware. |
1141 | + * |
1142 | + * (Implemented as CPP macros due to header hell.) |
1143 | + */ |
1144 | +#define firmware_restrict_branch_speculation_start() \ |
1145 | +do { \ |
1146 | + preempt_disable(); \ |
1147 | + alternative_msr_write(MSR_IA32_SPEC_CTRL, SPEC_CTRL_IBRS, \ |
1148 | + X86_FEATURE_USE_IBRS_FW); \ |
1149 | +} while (0) |
1150 | + |
1151 | +#define firmware_restrict_branch_speculation_end() \ |
1152 | +do { \ |
1153 | + alternative_msr_write(MSR_IA32_SPEC_CTRL, 0, \ |
1154 | + X86_FEATURE_USE_IBRS_FW); \ |
1155 | + preempt_enable(); \ |
1156 | +} while (0) |
1157 | + |
1158 | #endif /* __ASSEMBLY__ */ |
1159 | |
1160 | /* |
1161 | diff --git a/arch/x86/include/asm/paravirt.h b/arch/x86/include/asm/paravirt.h |
1162 | index 554841fab717..c83a2f418cea 100644 |
1163 | --- a/arch/x86/include/asm/paravirt.h |
1164 | +++ b/arch/x86/include/asm/paravirt.h |
1165 | @@ -7,6 +7,7 @@ |
1166 | #ifdef CONFIG_PARAVIRT |
1167 | #include <asm/pgtable_types.h> |
1168 | #include <asm/asm.h> |
1169 | +#include <asm/nospec-branch.h> |
1170 | |
1171 | #include <asm/paravirt_types.h> |
1172 | |
1173 | @@ -879,23 +880,27 @@ extern void default_banner(void); |
1174 | |
1175 | #define INTERRUPT_RETURN \ |
1176 | PARA_SITE(PARA_PATCH(pv_cpu_ops, PV_CPU_iret), CLBR_NONE, \ |
1177 | - jmp PARA_INDIRECT(pv_cpu_ops+PV_CPU_iret)) |
1178 | + ANNOTATE_RETPOLINE_SAFE; \ |
1179 | + jmp PARA_INDIRECT(pv_cpu_ops+PV_CPU_iret);) |
1180 | |
1181 | #define DISABLE_INTERRUPTS(clobbers) \ |
1182 | PARA_SITE(PARA_PATCH(pv_irq_ops, PV_IRQ_irq_disable), clobbers, \ |
1183 | PV_SAVE_REGS(clobbers | CLBR_CALLEE_SAVE); \ |
1184 | + ANNOTATE_RETPOLINE_SAFE; \ |
1185 | call PARA_INDIRECT(pv_irq_ops+PV_IRQ_irq_disable); \ |
1186 | PV_RESTORE_REGS(clobbers | CLBR_CALLEE_SAVE);) |
1187 | |
1188 | #define ENABLE_INTERRUPTS(clobbers) \ |
1189 | PARA_SITE(PARA_PATCH(pv_irq_ops, PV_IRQ_irq_enable), clobbers, \ |
1190 | PV_SAVE_REGS(clobbers | CLBR_CALLEE_SAVE); \ |
1191 | + ANNOTATE_RETPOLINE_SAFE; \ |
1192 | call PARA_INDIRECT(pv_irq_ops+PV_IRQ_irq_enable); \ |
1193 | PV_RESTORE_REGS(clobbers | CLBR_CALLEE_SAVE);) |
1194 | |
1195 | #ifdef CONFIG_X86_32 |
1196 | #define GET_CR0_INTO_EAX \ |
1197 | push %ecx; push %edx; \ |
1198 | + ANNOTATE_RETPOLINE_SAFE; \ |
1199 | call PARA_INDIRECT(pv_cpu_ops+PV_CPU_read_cr0); \ |
1200 | pop %edx; pop %ecx |
1201 | #else /* !CONFIG_X86_32 */ |
1202 | @@ -917,21 +922,25 @@ extern void default_banner(void); |
1203 | */ |
1204 | #define SWAPGS \ |
1205 | PARA_SITE(PARA_PATCH(pv_cpu_ops, PV_CPU_swapgs), CLBR_NONE, \ |
1206 | - call PARA_INDIRECT(pv_cpu_ops+PV_CPU_swapgs) \ |
1207 | + ANNOTATE_RETPOLINE_SAFE; \ |
1208 | + call PARA_INDIRECT(pv_cpu_ops+PV_CPU_swapgs); \ |
1209 | ) |
1210 | |
1211 | #define GET_CR2_INTO_RAX \ |
1212 | - call PARA_INDIRECT(pv_mmu_ops+PV_MMU_read_cr2) |
1213 | + ANNOTATE_RETPOLINE_SAFE; \ |
1214 | + call PARA_INDIRECT(pv_mmu_ops+PV_MMU_read_cr2); |
1215 | |
1216 | #define USERGS_SYSRET64 \ |
1217 | PARA_SITE(PARA_PATCH(pv_cpu_ops, PV_CPU_usergs_sysret64), \ |
1218 | CLBR_NONE, \ |
1219 | - jmp PARA_INDIRECT(pv_cpu_ops+PV_CPU_usergs_sysret64)) |
1220 | + ANNOTATE_RETPOLINE_SAFE; \ |
1221 | + jmp PARA_INDIRECT(pv_cpu_ops+PV_CPU_usergs_sysret64);) |
1222 | |
1223 | #ifdef CONFIG_DEBUG_ENTRY |
1224 | #define SAVE_FLAGS(clobbers) \ |
1225 | PARA_SITE(PARA_PATCH(pv_irq_ops, PV_IRQ_save_fl), clobbers, \ |
1226 | PV_SAVE_REGS(clobbers | CLBR_CALLEE_SAVE); \ |
1227 | + ANNOTATE_RETPOLINE_SAFE; \ |
1228 | call PARA_INDIRECT(pv_irq_ops+PV_IRQ_save_fl); \ |
1229 | PV_RESTORE_REGS(clobbers | CLBR_CALLEE_SAVE);) |
1230 | #endif |
1231 | diff --git a/arch/x86/include/asm/paravirt_types.h b/arch/x86/include/asm/paravirt_types.h |
1232 | index f624f1f10316..180bc0bff0fb 100644 |
1233 | --- a/arch/x86/include/asm/paravirt_types.h |
1234 | +++ b/arch/x86/include/asm/paravirt_types.h |
1235 | @@ -43,6 +43,7 @@ |
1236 | #include <asm/desc_defs.h> |
1237 | #include <asm/kmap_types.h> |
1238 | #include <asm/pgtable_types.h> |
1239 | +#include <asm/nospec-branch.h> |
1240 | |
1241 | struct page; |
1242 | struct thread_struct; |
1243 | @@ -392,7 +393,9 @@ int paravirt_disable_iospace(void); |
1244 | * offset into the paravirt_patch_template structure, and can therefore be |
1245 | * freely converted back into a structure offset. |
1246 | */ |
1247 | -#define PARAVIRT_CALL "call *%c[paravirt_opptr];" |
1248 | +#define PARAVIRT_CALL \ |
1249 | + ANNOTATE_RETPOLINE_SAFE \ |
1250 | + "call *%c[paravirt_opptr];" |
1251 | |
1252 | /* |
1253 | * These macros are intended to wrap calls through one of the paravirt |
1254 | diff --git a/arch/x86/include/asm/refcount.h b/arch/x86/include/asm/refcount.h |
1255 | index 4e44250e7d0d..d65171120e90 100644 |
1256 | --- a/arch/x86/include/asm/refcount.h |
1257 | +++ b/arch/x86/include/asm/refcount.h |
1258 | @@ -67,13 +67,13 @@ static __always_inline __must_check |
1259 | bool refcount_sub_and_test(unsigned int i, refcount_t *r) |
1260 | { |
1261 | GEN_BINARY_SUFFIXED_RMWcc(LOCK_PREFIX "subl", REFCOUNT_CHECK_LT_ZERO, |
1262 | - r->refs.counter, "er", i, "%0", e); |
1263 | + r->refs.counter, "er", i, "%0", e, "cx"); |
1264 | } |
1265 | |
1266 | static __always_inline __must_check bool refcount_dec_and_test(refcount_t *r) |
1267 | { |
1268 | GEN_UNARY_SUFFIXED_RMWcc(LOCK_PREFIX "decl", REFCOUNT_CHECK_LT_ZERO, |
1269 | - r->refs.counter, "%0", e); |
1270 | + r->refs.counter, "%0", e, "cx"); |
1271 | } |
1272 | |
1273 | static __always_inline __must_check |
1274 | diff --git a/arch/x86/include/asm/rmwcc.h b/arch/x86/include/asm/rmwcc.h |
1275 | index f91c365e57c3..4914a3e7c803 100644 |
1276 | --- a/arch/x86/include/asm/rmwcc.h |
1277 | +++ b/arch/x86/include/asm/rmwcc.h |
1278 | @@ -2,8 +2,7 @@ |
1279 | #ifndef _ASM_X86_RMWcc |
1280 | #define _ASM_X86_RMWcc |
1281 | |
1282 | -#define __CLOBBERS_MEM "memory" |
1283 | -#define __CLOBBERS_MEM_CC_CX "memory", "cc", "cx" |
1284 | +#define __CLOBBERS_MEM(clb...) "memory", ## clb |
1285 | |
1286 | #if !defined(__GCC_ASM_FLAG_OUTPUTS__) && defined(CC_HAVE_ASM_GOTO) |
1287 | |
1288 | @@ -40,18 +39,19 @@ do { \ |
1289 | #endif /* defined(__GCC_ASM_FLAG_OUTPUTS__) || !defined(CC_HAVE_ASM_GOTO) */ |
1290 | |
1291 | #define GEN_UNARY_RMWcc(op, var, arg0, cc) \ |
1292 | - __GEN_RMWcc(op " " arg0, var, cc, __CLOBBERS_MEM) |
1293 | + __GEN_RMWcc(op " " arg0, var, cc, __CLOBBERS_MEM()) |
1294 | |
1295 | -#define GEN_UNARY_SUFFIXED_RMWcc(op, suffix, var, arg0, cc) \ |
1296 | +#define GEN_UNARY_SUFFIXED_RMWcc(op, suffix, var, arg0, cc, clobbers...)\ |
1297 | __GEN_RMWcc(op " " arg0 "\n\t" suffix, var, cc, \ |
1298 | - __CLOBBERS_MEM_CC_CX) |
1299 | + __CLOBBERS_MEM(clobbers)) |
1300 | |
1301 | #define GEN_BINARY_RMWcc(op, var, vcon, val, arg0, cc) \ |
1302 | __GEN_RMWcc(op __BINARY_RMWcc_ARG arg0, var, cc, \ |
1303 | - __CLOBBERS_MEM, vcon (val)) |
1304 | + __CLOBBERS_MEM(), vcon (val)) |
1305 | |
1306 | -#define GEN_BINARY_SUFFIXED_RMWcc(op, suffix, var, vcon, val, arg0, cc) \ |
1307 | +#define GEN_BINARY_SUFFIXED_RMWcc(op, suffix, var, vcon, val, arg0, cc, \ |
1308 | + clobbers...) \ |
1309 | __GEN_RMWcc(op __BINARY_RMWcc_ARG arg0 "\n\t" suffix, var, cc, \ |
1310 | - __CLOBBERS_MEM_CC_CX, vcon (val)) |
1311 | + __CLOBBERS_MEM(clobbers), vcon (val)) |
1312 | |
1313 | #endif /* _ASM_X86_RMWcc */ |
1314 | diff --git a/arch/x86/include/asm/sections.h b/arch/x86/include/asm/sections.h |
1315 | index d6baf23782bc..5c019d23d06b 100644 |
1316 | --- a/arch/x86/include/asm/sections.h |
1317 | +++ b/arch/x86/include/asm/sections.h |
1318 | @@ -10,6 +10,7 @@ extern struct exception_table_entry __stop___ex_table[]; |
1319 | |
1320 | #if defined(CONFIG_X86_64) |
1321 | extern char __end_rodata_hpage_align[]; |
1322 | +extern char __entry_trampoline_start[], __entry_trampoline_end[]; |
1323 | #endif |
1324 | |
1325 | #endif /* _ASM_X86_SECTIONS_H */ |
1326 | diff --git a/arch/x86/include/uapi/asm/mce.h b/arch/x86/include/uapi/asm/mce.h |
1327 | index 91723461dc1f..435db58a7bad 100644 |
1328 | --- a/arch/x86/include/uapi/asm/mce.h |
1329 | +++ b/arch/x86/include/uapi/asm/mce.h |
1330 | @@ -30,6 +30,7 @@ struct mce { |
1331 | __u64 synd; /* MCA_SYND MSR: only valid on SMCA systems */ |
1332 | __u64 ipid; /* MCA_IPID MSR: only valid on SMCA systems */ |
1333 | __u64 ppin; /* Protected Processor Inventory Number */ |
1334 | + __u32 microcode;/* Microcode revision */ |
1335 | }; |
1336 | |
1337 | #define MCE_GET_RECORD_LEN _IOR('M', 1, int) |
1338 | diff --git a/arch/x86/kernel/cpu/bugs.c b/arch/x86/kernel/cpu/bugs.c |
1339 | index d71c8b54b696..bfca937bdcc3 100644 |
1340 | --- a/arch/x86/kernel/cpu/bugs.c |
1341 | +++ b/arch/x86/kernel/cpu/bugs.c |
1342 | @@ -300,6 +300,15 @@ static void __init spectre_v2_select_mitigation(void) |
1343 | setup_force_cpu_cap(X86_FEATURE_USE_IBPB); |
1344 | pr_info("Spectre v2 mitigation: Enabling Indirect Branch Prediction Barrier\n"); |
1345 | } |
1346 | + |
1347 | + /* |
1348 | + * Retpoline means the kernel is safe because it has no indirect |
1349 | + * branches. But firmware isn't, so use IBRS to protect that. |
1350 | + */ |
1351 | + if (boot_cpu_has(X86_FEATURE_IBRS)) { |
1352 | + setup_force_cpu_cap(X86_FEATURE_USE_IBRS_FW); |
1353 | + pr_info("Enabling Restricted Speculation for firmware calls\n"); |
1354 | + } |
1355 | } |
1356 | |
1357 | #undef pr_fmt |
1358 | @@ -326,8 +335,9 @@ ssize_t cpu_show_spectre_v2(struct device *dev, struct device_attribute *attr, c |
1359 | if (!boot_cpu_has_bug(X86_BUG_SPECTRE_V2)) |
1360 | return sprintf(buf, "Not affected\n"); |
1361 | |
1362 | - return sprintf(buf, "%s%s%s\n", spectre_v2_strings[spectre_v2_enabled], |
1363 | + return sprintf(buf, "%s%s%s%s\n", spectre_v2_strings[spectre_v2_enabled], |
1364 | boot_cpu_has(X86_FEATURE_USE_IBPB) ? ", IBPB" : "", |
1365 | + boot_cpu_has(X86_FEATURE_USE_IBRS_FW) ? ", IBRS_FW" : "", |
1366 | spectre_v2_module_string()); |
1367 | } |
1368 | #endif |
1369 | diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c |
1370 | index d19e903214b4..4aa9fd379390 100644 |
1371 | --- a/arch/x86/kernel/cpu/intel.c |
1372 | +++ b/arch/x86/kernel/cpu/intel.c |
1373 | @@ -144,6 +144,13 @@ static bool bad_spectre_microcode(struct cpuinfo_x86 *c) |
1374 | { |
1375 | int i; |
1376 | |
1377 | + /* |
1378 | + * We know that the hypervisor lie to us on the microcode version so |
1379 | + * we may as well hope that it is running the correct version. |
1380 | + */ |
1381 | + if (cpu_has(c, X86_FEATURE_HYPERVISOR)) |
1382 | + return false; |
1383 | + |
1384 | for (i = 0; i < ARRAY_SIZE(spectre_bad_microcodes); i++) { |
1385 | if (c->x86_model == spectre_bad_microcodes[i].model && |
1386 | c->x86_stepping == spectre_bad_microcodes[i].stepping) |
1387 | diff --git a/arch/x86/kernel/cpu/mcheck/mce.c b/arch/x86/kernel/cpu/mcheck/mce.c |
1388 | index 73237aa271ea..e13d652fc30a 100644 |
1389 | --- a/arch/x86/kernel/cpu/mcheck/mce.c |
1390 | +++ b/arch/x86/kernel/cpu/mcheck/mce.c |
1391 | @@ -57,6 +57,9 @@ |
1392 | |
1393 | static DEFINE_MUTEX(mce_log_mutex); |
1394 | |
1395 | +/* sysfs synchronization */ |
1396 | +static DEFINE_MUTEX(mce_sysfs_mutex); |
1397 | + |
1398 | #define CREATE_TRACE_POINTS |
1399 | #include <trace/events/mce.h> |
1400 | |
1401 | @@ -131,6 +134,8 @@ void mce_setup(struct mce *m) |
1402 | |
1403 | if (this_cpu_has(X86_FEATURE_INTEL_PPIN)) |
1404 | rdmsrl(MSR_PPIN, m->ppin); |
1405 | + |
1406 | + m->microcode = boot_cpu_data.microcode; |
1407 | } |
1408 | |
1409 | DEFINE_PER_CPU(struct mce, injectm); |
1410 | @@ -263,7 +268,7 @@ static void __print_mce(struct mce *m) |
1411 | */ |
1412 | pr_emerg(HW_ERR "PROCESSOR %u:%x TIME %llu SOCKET %u APIC %x microcode %x\n", |
1413 | m->cpuvendor, m->cpuid, m->time, m->socketid, m->apicid, |
1414 | - cpu_data(m->extcpu).microcode); |
1415 | + m->microcode); |
1416 | } |
1417 | |
1418 | static void print_mce(struct mce *m) |
1419 | @@ -2081,6 +2086,7 @@ static ssize_t set_ignore_ce(struct device *s, |
1420 | if (kstrtou64(buf, 0, &new) < 0) |
1421 | return -EINVAL; |
1422 | |
1423 | + mutex_lock(&mce_sysfs_mutex); |
1424 | if (mca_cfg.ignore_ce ^ !!new) { |
1425 | if (new) { |
1426 | /* disable ce features */ |
1427 | @@ -2093,6 +2099,8 @@ static ssize_t set_ignore_ce(struct device *s, |
1428 | on_each_cpu(mce_enable_ce, (void *)1, 1); |
1429 | } |
1430 | } |
1431 | + mutex_unlock(&mce_sysfs_mutex); |
1432 | + |
1433 | return size; |
1434 | } |
1435 | |
1436 | @@ -2105,6 +2113,7 @@ static ssize_t set_cmci_disabled(struct device *s, |
1437 | if (kstrtou64(buf, 0, &new) < 0) |
1438 | return -EINVAL; |
1439 | |
1440 | + mutex_lock(&mce_sysfs_mutex); |
1441 | if (mca_cfg.cmci_disabled ^ !!new) { |
1442 | if (new) { |
1443 | /* disable cmci */ |
1444 | @@ -2116,6 +2125,8 @@ static ssize_t set_cmci_disabled(struct device *s, |
1445 | on_each_cpu(mce_enable_ce, NULL, 1); |
1446 | } |
1447 | } |
1448 | + mutex_unlock(&mce_sysfs_mutex); |
1449 | + |
1450 | return size; |
1451 | } |
1452 | |
1453 | @@ -2123,8 +2134,19 @@ static ssize_t store_int_with_restart(struct device *s, |
1454 | struct device_attribute *attr, |
1455 | const char *buf, size_t size) |
1456 | { |
1457 | - ssize_t ret = device_store_int(s, attr, buf, size); |
1458 | + unsigned long old_check_interval = check_interval; |
1459 | + ssize_t ret = device_store_ulong(s, attr, buf, size); |
1460 | + |
1461 | + if (check_interval == old_check_interval) |
1462 | + return ret; |
1463 | + |
1464 | + if (check_interval < 1) |
1465 | + check_interval = 1; |
1466 | + |
1467 | + mutex_lock(&mce_sysfs_mutex); |
1468 | mce_restart(); |
1469 | + mutex_unlock(&mce_sysfs_mutex); |
1470 | + |
1471 | return ret; |
1472 | } |
1473 | |
1474 | diff --git a/arch/x86/kernel/head_64.S b/arch/x86/kernel/head_64.S |
1475 | index 04a625f0fcda..0f545b3cf926 100644 |
1476 | --- a/arch/x86/kernel/head_64.S |
1477 | +++ b/arch/x86/kernel/head_64.S |
1478 | @@ -23,6 +23,7 @@ |
1479 | #include <asm/nops.h> |
1480 | #include "../entry/calling.h" |
1481 | #include <asm/export.h> |
1482 | +#include <asm/nospec-branch.h> |
1483 | |
1484 | #ifdef CONFIG_PARAVIRT |
1485 | #include <asm/asm-offsets.h> |
1486 | @@ -134,6 +135,7 @@ ENTRY(secondary_startup_64) |
1487 | |
1488 | /* Ensure I am executing from virtual addresses */ |
1489 | movq $1f, %rax |
1490 | + ANNOTATE_RETPOLINE_SAFE |
1491 | jmp *%rax |
1492 | 1: |
1493 | UNWIND_HINT_EMPTY |
1494 | diff --git a/arch/x86/kernel/kprobes/core.c b/arch/x86/kernel/kprobes/core.c |
1495 | index 0742491cbb73..ce06ec9c2323 100644 |
1496 | --- a/arch/x86/kernel/kprobes/core.c |
1497 | +++ b/arch/x86/kernel/kprobes/core.c |
1498 | @@ -1149,10 +1149,18 @@ NOKPROBE_SYMBOL(longjmp_break_handler); |
1499 | |
1500 | bool arch_within_kprobe_blacklist(unsigned long addr) |
1501 | { |
1502 | + bool is_in_entry_trampoline_section = false; |
1503 | + |
1504 | +#ifdef CONFIG_X86_64 |
1505 | + is_in_entry_trampoline_section = |
1506 | + (addr >= (unsigned long)__entry_trampoline_start && |
1507 | + addr < (unsigned long)__entry_trampoline_end); |
1508 | +#endif |
1509 | return (addr >= (unsigned long)__kprobes_text_start && |
1510 | addr < (unsigned long)__kprobes_text_end) || |
1511 | (addr >= (unsigned long)__entry_text_start && |
1512 | - addr < (unsigned long)__entry_text_end); |
1513 | + addr < (unsigned long)__entry_text_end) || |
1514 | + is_in_entry_trampoline_section; |
1515 | } |
1516 | |
1517 | int __init arch_init_kprobes(void) |
1518 | diff --git a/arch/x86/kernel/vmlinux.lds.S b/arch/x86/kernel/vmlinux.lds.S |
1519 | index 9b138a06c1a4..b854ebf5851b 100644 |
1520 | --- a/arch/x86/kernel/vmlinux.lds.S |
1521 | +++ b/arch/x86/kernel/vmlinux.lds.S |
1522 | @@ -118,9 +118,11 @@ SECTIONS |
1523 | |
1524 | #ifdef CONFIG_X86_64 |
1525 | . = ALIGN(PAGE_SIZE); |
1526 | + VMLINUX_SYMBOL(__entry_trampoline_start) = .; |
1527 | _entry_trampoline = .; |
1528 | *(.entry_trampoline) |
1529 | . = ALIGN(PAGE_SIZE); |
1530 | + VMLINUX_SYMBOL(__entry_trampoline_end) = .; |
1531 | ASSERT(. - _entry_trampoline == PAGE_SIZE, "entry trampoline is too big"); |
1532 | #endif |
1533 | |
1534 | diff --git a/arch/x86/lib/Makefile b/arch/x86/lib/Makefile |
1535 | index d0a3170e6804..d435c89875c1 100644 |
1536 | --- a/arch/x86/lib/Makefile |
1537 | +++ b/arch/x86/lib/Makefile |
1538 | @@ -27,7 +27,6 @@ lib-$(CONFIG_RWSEM_XCHGADD_ALGORITHM) += rwsem.o |
1539 | lib-$(CONFIG_INSTRUCTION_DECODER) += insn.o inat.o |
1540 | lib-$(CONFIG_RANDOMIZE_BASE) += kaslr.o |
1541 | lib-$(CONFIG_RETPOLINE) += retpoline.o |
1542 | -OBJECT_FILES_NON_STANDARD_retpoline.o :=y |
1543 | |
1544 | obj-y += msr.o msr-reg.o msr-reg-export.o hweight.o |
1545 | |
1546 | diff --git a/arch/x86/lib/retpoline.S b/arch/x86/lib/retpoline.S |
1547 | index 480edc3a5e03..c909961e678a 100644 |
1548 | --- a/arch/x86/lib/retpoline.S |
1549 | +++ b/arch/x86/lib/retpoline.S |
1550 | @@ -7,7 +7,6 @@ |
1551 | #include <asm/alternative-asm.h> |
1552 | #include <asm/export.h> |
1553 | #include <asm/nospec-branch.h> |
1554 | -#include <asm/bitsperlong.h> |
1555 | |
1556 | .macro THUNK reg |
1557 | .section .text.__x86.indirect_thunk |
1558 | @@ -47,58 +46,3 @@ GENERATE_THUNK(r13) |
1559 | GENERATE_THUNK(r14) |
1560 | GENERATE_THUNK(r15) |
1561 | #endif |
1562 | - |
1563 | -/* |
1564 | - * Fill the CPU return stack buffer. |
1565 | - * |
1566 | - * Each entry in the RSB, if used for a speculative 'ret', contains an |
1567 | - * infinite 'pause; lfence; jmp' loop to capture speculative execution. |
1568 | - * |
1569 | - * This is required in various cases for retpoline and IBRS-based |
1570 | - * mitigations for the Spectre variant 2 vulnerability. Sometimes to |
1571 | - * eliminate potentially bogus entries from the RSB, and sometimes |
1572 | - * purely to ensure that it doesn't get empty, which on some CPUs would |
1573 | - * allow predictions from other (unwanted!) sources to be used. |
1574 | - * |
1575 | - * Google experimented with loop-unrolling and this turned out to be |
1576 | - * the optimal version - two calls, each with their own speculation |
1577 | - * trap should their return address end up getting used, in a loop. |
1578 | - */ |
1579 | -.macro STUFF_RSB nr:req sp:req |
1580 | - mov $(\nr / 2), %_ASM_BX |
1581 | - .align 16 |
1582 | -771: |
1583 | - call 772f |
1584 | -773: /* speculation trap */ |
1585 | - pause |
1586 | - lfence |
1587 | - jmp 773b |
1588 | - .align 16 |
1589 | -772: |
1590 | - call 774f |
1591 | -775: /* speculation trap */ |
1592 | - pause |
1593 | - lfence |
1594 | - jmp 775b |
1595 | - .align 16 |
1596 | -774: |
1597 | - dec %_ASM_BX |
1598 | - jnz 771b |
1599 | - add $((BITS_PER_LONG/8) * \nr), \sp |
1600 | -.endm |
1601 | - |
1602 | -#define RSB_FILL_LOOPS 16 /* To avoid underflow */ |
1603 | - |
1604 | -ENTRY(__fill_rsb) |
1605 | - STUFF_RSB RSB_FILL_LOOPS, %_ASM_SP |
1606 | - ret |
1607 | -END(__fill_rsb) |
1608 | -EXPORT_SYMBOL_GPL(__fill_rsb) |
1609 | - |
1610 | -#define RSB_CLEAR_LOOPS 32 /* To forcibly overwrite all entries */ |
1611 | - |
1612 | -ENTRY(__clear_rsb) |
1613 | - STUFF_RSB RSB_CLEAR_LOOPS, %_ASM_SP |
1614 | - ret |
1615 | -END(__clear_rsb) |
1616 | -EXPORT_SYMBOL_GPL(__clear_rsb) |
1617 | diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c |
1618 | index 9150fe2c9b26..4c155ee0f89e 100644 |
1619 | --- a/arch/x86/mm/fault.c |
1620 | +++ b/arch/x86/mm/fault.c |
1621 | @@ -1252,10 +1252,6 @@ __do_page_fault(struct pt_regs *regs, unsigned long error_code, |
1622 | tsk = current; |
1623 | mm = tsk->mm; |
1624 | |
1625 | - /* |
1626 | - * Detect and handle instructions that would cause a page fault for |
1627 | - * both a tracked kernel page and a userspace page. |
1628 | - */ |
1629 | prefetchw(&mm->mmap_sem); |
1630 | |
1631 | if (unlikely(kmmio_fault(regs, address))) |
1632 | diff --git a/arch/x86/mm/mem_encrypt_boot.S b/arch/x86/mm/mem_encrypt_boot.S |
1633 | index 01f682cf77a8..40a6085063d6 100644 |
1634 | --- a/arch/x86/mm/mem_encrypt_boot.S |
1635 | +++ b/arch/x86/mm/mem_encrypt_boot.S |
1636 | @@ -15,6 +15,7 @@ |
1637 | #include <asm/page.h> |
1638 | #include <asm/processor-flags.h> |
1639 | #include <asm/msr-index.h> |
1640 | +#include <asm/nospec-branch.h> |
1641 | |
1642 | .text |
1643 | .code64 |
1644 | @@ -59,6 +60,7 @@ ENTRY(sme_encrypt_execute) |
1645 | movq %rax, %r8 /* Workarea encryption routine */ |
1646 | addq $PAGE_SIZE, %r8 /* Workarea intermediate copy buffer */ |
1647 | |
1648 | + ANNOTATE_RETPOLINE_SAFE |
1649 | call *%rax /* Call the encryption routine */ |
1650 | |
1651 | pop %r12 |
1652 | diff --git a/arch/x86/realmode/rm/trampoline_64.S b/arch/x86/realmode/rm/trampoline_64.S |
1653 | index de53bd15df5a..24bb7598774e 100644 |
1654 | --- a/arch/x86/realmode/rm/trampoline_64.S |
1655 | +++ b/arch/x86/realmode/rm/trampoline_64.S |
1656 | @@ -102,7 +102,7 @@ ENTRY(startup_32) |
1657 | * don't we'll eventually crash trying to execute encrypted |
1658 | * instructions. |
1659 | */ |
1660 | - bt $TH_FLAGS_SME_ACTIVE_BIT, pa_tr_flags |
1661 | + btl $TH_FLAGS_SME_ACTIVE_BIT, pa_tr_flags |
1662 | jnc .Ldone |
1663 | movl $MSR_K8_SYSCFG, %ecx |
1664 | rdmsr |
1665 | diff --git a/drivers/block/loop.c b/drivers/block/loop.c |
1666 | index a2a0dce5114e..19858a146f30 100644 |
1667 | --- a/drivers/block/loop.c |
1668 | +++ b/drivers/block/loop.c |
1669 | @@ -266,7 +266,7 @@ static int lo_write_bvec(struct file *file, struct bio_vec *bvec, loff_t *ppos) |
1670 | struct iov_iter i; |
1671 | ssize_t bw; |
1672 | |
1673 | - iov_iter_bvec(&i, ITER_BVEC, bvec, 1, bvec->bv_len); |
1674 | + iov_iter_bvec(&i, ITER_BVEC | WRITE, bvec, 1, bvec->bv_len); |
1675 | |
1676 | file_start_write(file); |
1677 | bw = vfs_iter_write(file, &i, ppos, 0); |
1678 | diff --git a/drivers/char/tpm/tpm-interface.c b/drivers/char/tpm/tpm-interface.c |
1679 | index 3cec403a80b3..5294442505cb 100644 |
1680 | --- a/drivers/char/tpm/tpm-interface.c |
1681 | +++ b/drivers/char/tpm/tpm-interface.c |
1682 | @@ -413,6 +413,9 @@ ssize_t tpm_transmit(struct tpm_chip *chip, struct tpm_space *space, |
1683 | if (chip->dev.parent) |
1684 | pm_runtime_get_sync(chip->dev.parent); |
1685 | |
1686 | + if (chip->ops->clk_enable != NULL) |
1687 | + chip->ops->clk_enable(chip, true); |
1688 | + |
1689 | /* Store the decision as chip->locality will be changed. */ |
1690 | need_locality = chip->locality == -1; |
1691 | |
1692 | @@ -489,6 +492,9 @@ ssize_t tpm_transmit(struct tpm_chip *chip, struct tpm_space *space, |
1693 | chip->locality = -1; |
1694 | } |
1695 | out_no_locality: |
1696 | + if (chip->ops->clk_enable != NULL) |
1697 | + chip->ops->clk_enable(chip, false); |
1698 | + |
1699 | if (chip->dev.parent) |
1700 | pm_runtime_put_sync(chip->dev.parent); |
1701 | |
1702 | diff --git a/drivers/char/tpm/tpm_tis.c b/drivers/char/tpm/tpm_tis.c |
1703 | index ebd0e75a3e4d..50b59a69dc33 100644 |
1704 | --- a/drivers/char/tpm/tpm_tis.c |
1705 | +++ b/drivers/char/tpm/tpm_tis.c |
1706 | @@ -132,93 +132,14 @@ static int check_acpi_tpm2(struct device *dev) |
1707 | } |
1708 | #endif |
1709 | |
1710 | -#ifdef CONFIG_X86 |
1711 | -#define INTEL_LEGACY_BLK_BASE_ADDR 0xFED08000 |
1712 | -#define ILB_REMAP_SIZE 0x100 |
1713 | -#define LPC_CNTRL_REG_OFFSET 0x84 |
1714 | -#define LPC_CLKRUN_EN (1 << 2) |
1715 | - |
1716 | -static void __iomem *ilb_base_addr; |
1717 | - |
1718 | -static inline bool is_bsw(void) |
1719 | -{ |
1720 | - return ((boot_cpu_data.x86_model == INTEL_FAM6_ATOM_AIRMONT) ? 1 : 0); |
1721 | -} |
1722 | - |
1723 | -/** |
1724 | - * tpm_platform_begin_xfer() - clear LPC CLKRUN_EN i.e. clocks will be running |
1725 | - */ |
1726 | -static void tpm_platform_begin_xfer(void) |
1727 | -{ |
1728 | - u32 clkrun_val; |
1729 | - |
1730 | - if (!is_bsw()) |
1731 | - return; |
1732 | - |
1733 | - clkrun_val = ioread32(ilb_base_addr + LPC_CNTRL_REG_OFFSET); |
1734 | - |
1735 | - /* Disable LPC CLKRUN# */ |
1736 | - clkrun_val &= ~LPC_CLKRUN_EN; |
1737 | - iowrite32(clkrun_val, ilb_base_addr + LPC_CNTRL_REG_OFFSET); |
1738 | - |
1739 | - /* |
1740 | - * Write any random value on port 0x80 which is on LPC, to make |
1741 | - * sure LPC clock is running before sending any TPM command. |
1742 | - */ |
1743 | - outb(0xCC, 0x80); |
1744 | - |
1745 | -} |
1746 | - |
1747 | -/** |
1748 | - * tpm_platform_end_xfer() - set LPC CLKRUN_EN i.e. clocks can be turned off |
1749 | - */ |
1750 | -static void tpm_platform_end_xfer(void) |
1751 | -{ |
1752 | - u32 clkrun_val; |
1753 | - |
1754 | - if (!is_bsw()) |
1755 | - return; |
1756 | - |
1757 | - clkrun_val = ioread32(ilb_base_addr + LPC_CNTRL_REG_OFFSET); |
1758 | - |
1759 | - /* Enable LPC CLKRUN# */ |
1760 | - clkrun_val |= LPC_CLKRUN_EN; |
1761 | - iowrite32(clkrun_val, ilb_base_addr + LPC_CNTRL_REG_OFFSET); |
1762 | - |
1763 | - /* |
1764 | - * Write any random value on port 0x80 which is on LPC, to make |
1765 | - * sure LPC clock is running before sending any TPM command. |
1766 | - */ |
1767 | - outb(0xCC, 0x80); |
1768 | - |
1769 | -} |
1770 | -#else |
1771 | -static inline bool is_bsw(void) |
1772 | -{ |
1773 | - return false; |
1774 | -} |
1775 | - |
1776 | -static void tpm_platform_begin_xfer(void) |
1777 | -{ |
1778 | -} |
1779 | - |
1780 | -static void tpm_platform_end_xfer(void) |
1781 | -{ |
1782 | -} |
1783 | -#endif |
1784 | - |
1785 | static int tpm_tcg_read_bytes(struct tpm_tis_data *data, u32 addr, u16 len, |
1786 | u8 *result) |
1787 | { |
1788 | struct tpm_tis_tcg_phy *phy = to_tpm_tis_tcg_phy(data); |
1789 | |
1790 | - tpm_platform_begin_xfer(); |
1791 | - |
1792 | while (len--) |
1793 | *result++ = ioread8(phy->iobase + addr); |
1794 | |
1795 | - tpm_platform_end_xfer(); |
1796 | - |
1797 | return 0; |
1798 | } |
1799 | |
1800 | @@ -227,13 +148,9 @@ static int tpm_tcg_write_bytes(struct tpm_tis_data *data, u32 addr, u16 len, |
1801 | { |
1802 | struct tpm_tis_tcg_phy *phy = to_tpm_tis_tcg_phy(data); |
1803 | |
1804 | - tpm_platform_begin_xfer(); |
1805 | - |
1806 | while (len--) |
1807 | iowrite8(*value++, phy->iobase + addr); |
1808 | |
1809 | - tpm_platform_end_xfer(); |
1810 | - |
1811 | return 0; |
1812 | } |
1813 | |
1814 | @@ -241,12 +158,8 @@ static int tpm_tcg_read16(struct tpm_tis_data *data, u32 addr, u16 *result) |
1815 | { |
1816 | struct tpm_tis_tcg_phy *phy = to_tpm_tis_tcg_phy(data); |
1817 | |
1818 | - tpm_platform_begin_xfer(); |
1819 | - |
1820 | *result = ioread16(phy->iobase + addr); |
1821 | |
1822 | - tpm_platform_end_xfer(); |
1823 | - |
1824 | return 0; |
1825 | } |
1826 | |
1827 | @@ -254,12 +167,8 @@ static int tpm_tcg_read32(struct tpm_tis_data *data, u32 addr, u32 *result) |
1828 | { |
1829 | struct tpm_tis_tcg_phy *phy = to_tpm_tis_tcg_phy(data); |
1830 | |
1831 | - tpm_platform_begin_xfer(); |
1832 | - |
1833 | *result = ioread32(phy->iobase + addr); |
1834 | |
1835 | - tpm_platform_end_xfer(); |
1836 | - |
1837 | return 0; |
1838 | } |
1839 | |
1840 | @@ -267,12 +176,8 @@ static int tpm_tcg_write32(struct tpm_tis_data *data, u32 addr, u32 value) |
1841 | { |
1842 | struct tpm_tis_tcg_phy *phy = to_tpm_tis_tcg_phy(data); |
1843 | |
1844 | - tpm_platform_begin_xfer(); |
1845 | - |
1846 | iowrite32(value, phy->iobase + addr); |
1847 | |
1848 | - tpm_platform_end_xfer(); |
1849 | - |
1850 | return 0; |
1851 | } |
1852 | |
1853 | @@ -460,11 +365,6 @@ static int __init init_tis(void) |
1854 | if (rc) |
1855 | goto err_force; |
1856 | |
1857 | -#ifdef CONFIG_X86 |
1858 | - if (is_bsw()) |
1859 | - ilb_base_addr = ioremap(INTEL_LEGACY_BLK_BASE_ADDR, |
1860 | - ILB_REMAP_SIZE); |
1861 | -#endif |
1862 | rc = platform_driver_register(&tis_drv); |
1863 | if (rc) |
1864 | goto err_platform; |
1865 | @@ -483,10 +383,6 @@ static int __init init_tis(void) |
1866 | err_platform: |
1867 | if (force_pdev) |
1868 | platform_device_unregister(force_pdev); |
1869 | -#ifdef CONFIG_X86 |
1870 | - if (is_bsw()) |
1871 | - iounmap(ilb_base_addr); |
1872 | -#endif |
1873 | err_force: |
1874 | return rc; |
1875 | } |
1876 | @@ -496,10 +392,6 @@ static void __exit cleanup_tis(void) |
1877 | pnp_unregister_driver(&tis_pnp_driver); |
1878 | platform_driver_unregister(&tis_drv); |
1879 | |
1880 | -#ifdef CONFIG_X86 |
1881 | - if (is_bsw()) |
1882 | - iounmap(ilb_base_addr); |
1883 | -#endif |
1884 | if (force_pdev) |
1885 | platform_device_unregister(force_pdev); |
1886 | } |
1887 | diff --git a/drivers/char/tpm/tpm_tis_core.c b/drivers/char/tpm/tpm_tis_core.c |
1888 | index 083578b2517e..a21e31c2b952 100644 |
1889 | --- a/drivers/char/tpm/tpm_tis_core.c |
1890 | +++ b/drivers/char/tpm/tpm_tis_core.c |
1891 | @@ -31,6 +31,8 @@ |
1892 | #include "tpm.h" |
1893 | #include "tpm_tis_core.h" |
1894 | |
1895 | +static void tpm_tis_clkrun_enable(struct tpm_chip *chip, bool value); |
1896 | + |
1897 | /* Before we attempt to access the TPM we must see that the valid bit is set. |
1898 | * The specification says that this bit is 0 at reset and remains 0 until the |
1899 | * 'TPM has gone through its self test and initialization and has established |
1900 | @@ -422,19 +424,28 @@ static bool tpm_tis_update_timeouts(struct tpm_chip *chip, |
1901 | int i, rc; |
1902 | u32 did_vid; |
1903 | |
1904 | + if (chip->ops->clk_enable != NULL) |
1905 | + chip->ops->clk_enable(chip, true); |
1906 | + |
1907 | rc = tpm_tis_read32(priv, TPM_DID_VID(0), &did_vid); |
1908 | if (rc < 0) |
1909 | - return rc; |
1910 | + goto out; |
1911 | |
1912 | for (i = 0; i != ARRAY_SIZE(vendor_timeout_overrides); i++) { |
1913 | if (vendor_timeout_overrides[i].did_vid != did_vid) |
1914 | continue; |
1915 | memcpy(timeout_cap, vendor_timeout_overrides[i].timeout_us, |
1916 | sizeof(vendor_timeout_overrides[i].timeout_us)); |
1917 | - return true; |
1918 | + rc = true; |
1919 | } |
1920 | |
1921 | - return false; |
1922 | + rc = false; |
1923 | + |
1924 | +out: |
1925 | + if (chip->ops->clk_enable != NULL) |
1926 | + chip->ops->clk_enable(chip, false); |
1927 | + |
1928 | + return rc; |
1929 | } |
1930 | |
1931 | /* |
1932 | @@ -654,14 +665,73 @@ void tpm_tis_remove(struct tpm_chip *chip) |
1933 | u32 interrupt; |
1934 | int rc; |
1935 | |
1936 | + tpm_tis_clkrun_enable(chip, true); |
1937 | + |
1938 | rc = tpm_tis_read32(priv, reg, &interrupt); |
1939 | if (rc < 0) |
1940 | interrupt = 0; |
1941 | |
1942 | tpm_tis_write32(priv, reg, ~TPM_GLOBAL_INT_ENABLE & interrupt); |
1943 | + |
1944 | + tpm_tis_clkrun_enable(chip, false); |
1945 | + |
1946 | + if (priv->ilb_base_addr) |
1947 | + iounmap(priv->ilb_base_addr); |
1948 | } |
1949 | EXPORT_SYMBOL_GPL(tpm_tis_remove); |
1950 | |
1951 | +/** |
1952 | + * tpm_tis_clkrun_enable() - Keep clkrun protocol disabled for entire duration |
1953 | + * of a single TPM command |
1954 | + * @chip: TPM chip to use |
1955 | + * @value: 1 - Disable CLKRUN protocol, so that clocks are free running |
1956 | + * 0 - Enable CLKRUN protocol |
1957 | + * Call this function directly in tpm_tis_remove() in error or driver removal |
1958 | + * path, since the chip->ops is set to NULL in tpm_chip_unregister(). |
1959 | + */ |
1960 | +static void tpm_tis_clkrun_enable(struct tpm_chip *chip, bool value) |
1961 | +{ |
1962 | + struct tpm_tis_data *data = dev_get_drvdata(&chip->dev); |
1963 | + u32 clkrun_val; |
1964 | + |
1965 | + if (!IS_ENABLED(CONFIG_X86) || !is_bsw() || |
1966 | + !data->ilb_base_addr) |
1967 | + return; |
1968 | + |
1969 | + if (value) { |
1970 | + data->clkrun_enabled++; |
1971 | + if (data->clkrun_enabled > 1) |
1972 | + return; |
1973 | + clkrun_val = ioread32(data->ilb_base_addr + LPC_CNTRL_OFFSET); |
1974 | + |
1975 | + /* Disable LPC CLKRUN# */ |
1976 | + clkrun_val &= ~LPC_CLKRUN_EN; |
1977 | + iowrite32(clkrun_val, data->ilb_base_addr + LPC_CNTRL_OFFSET); |
1978 | + |
1979 | + /* |
1980 | + * Write any random value on port 0x80 which is on LPC, to make |
1981 | + * sure LPC clock is running before sending any TPM command. |
1982 | + */ |
1983 | + outb(0xCC, 0x80); |
1984 | + } else { |
1985 | + data->clkrun_enabled--; |
1986 | + if (data->clkrun_enabled) |
1987 | + return; |
1988 | + |
1989 | + clkrun_val = ioread32(data->ilb_base_addr + LPC_CNTRL_OFFSET); |
1990 | + |
1991 | + /* Enable LPC CLKRUN# */ |
1992 | + clkrun_val |= LPC_CLKRUN_EN; |
1993 | + iowrite32(clkrun_val, data->ilb_base_addr + LPC_CNTRL_OFFSET); |
1994 | + |
1995 | + /* |
1996 | + * Write any random value on port 0x80 which is on LPC, to make |
1997 | + * sure LPC clock is running before sending any TPM command. |
1998 | + */ |
1999 | + outb(0xCC, 0x80); |
2000 | + } |
2001 | +} |
2002 | + |
2003 | static const struct tpm_class_ops tpm_tis = { |
2004 | .flags = TPM_OPS_AUTO_STARTUP, |
2005 | .status = tpm_tis_status, |
2006 | @@ -674,6 +744,7 @@ static const struct tpm_class_ops tpm_tis = { |
2007 | .req_canceled = tpm_tis_req_canceled, |
2008 | .request_locality = request_locality, |
2009 | .relinquish_locality = release_locality, |
2010 | + .clk_enable = tpm_tis_clkrun_enable, |
2011 | }; |
2012 | |
2013 | int tpm_tis_core_init(struct device *dev, struct tpm_tis_data *priv, int irq, |
2014 | @@ -681,6 +752,7 @@ int tpm_tis_core_init(struct device *dev, struct tpm_tis_data *priv, int irq, |
2015 | acpi_handle acpi_dev_handle) |
2016 | { |
2017 | u32 vendor, intfcaps, intmask; |
2018 | + u32 clkrun_val; |
2019 | u8 rid; |
2020 | int rc, probe; |
2021 | struct tpm_chip *chip; |
2022 | @@ -701,6 +773,23 @@ int tpm_tis_core_init(struct device *dev, struct tpm_tis_data *priv, int irq, |
2023 | priv->phy_ops = phy_ops; |
2024 | dev_set_drvdata(&chip->dev, priv); |
2025 | |
2026 | + if (is_bsw()) { |
2027 | + priv->ilb_base_addr = ioremap(INTEL_LEGACY_BLK_BASE_ADDR, |
2028 | + ILB_REMAP_SIZE); |
2029 | + if (!priv->ilb_base_addr) |
2030 | + return -ENOMEM; |
2031 | + |
2032 | + clkrun_val = ioread32(priv->ilb_base_addr + LPC_CNTRL_OFFSET); |
2033 | + /* Check if CLKRUN# is already not enabled in the LPC bus */ |
2034 | + if (!(clkrun_val & LPC_CLKRUN_EN)) { |
2035 | + iounmap(priv->ilb_base_addr); |
2036 | + priv->ilb_base_addr = NULL; |
2037 | + } |
2038 | + } |
2039 | + |
2040 | + if (chip->ops->clk_enable != NULL) |
2041 | + chip->ops->clk_enable(chip, true); |
2042 | + |
2043 | if (wait_startup(chip, 0) != 0) { |
2044 | rc = -ENODEV; |
2045 | goto out_err; |
2046 | @@ -791,9 +880,20 @@ int tpm_tis_core_init(struct device *dev, struct tpm_tis_data *priv, int irq, |
2047 | } |
2048 | } |
2049 | |
2050 | - return tpm_chip_register(chip); |
2051 | + rc = tpm_chip_register(chip); |
2052 | + if (rc) |
2053 | + goto out_err; |
2054 | + |
2055 | + if (chip->ops->clk_enable != NULL) |
2056 | + chip->ops->clk_enable(chip, false); |
2057 | + |
2058 | + return 0; |
2059 | out_err: |
2060 | + if ((chip->ops != NULL) && (chip->ops->clk_enable != NULL)) |
2061 | + chip->ops->clk_enable(chip, false); |
2062 | + |
2063 | tpm_tis_remove(chip); |
2064 | + |
2065 | return rc; |
2066 | } |
2067 | EXPORT_SYMBOL_GPL(tpm_tis_core_init); |
2068 | @@ -805,22 +905,31 @@ static void tpm_tis_reenable_interrupts(struct tpm_chip *chip) |
2069 | u32 intmask; |
2070 | int rc; |
2071 | |
2072 | + if (chip->ops->clk_enable != NULL) |
2073 | + chip->ops->clk_enable(chip, true); |
2074 | + |
2075 | /* reenable interrupts that device may have lost or |
2076 | * BIOS/firmware may have disabled |
2077 | */ |
2078 | rc = tpm_tis_write8(priv, TPM_INT_VECTOR(priv->locality), priv->irq); |
2079 | if (rc < 0) |
2080 | - return; |
2081 | + goto out; |
2082 | |
2083 | rc = tpm_tis_read32(priv, TPM_INT_ENABLE(priv->locality), &intmask); |
2084 | if (rc < 0) |
2085 | - return; |
2086 | + goto out; |
2087 | |
2088 | intmask |= TPM_INTF_CMD_READY_INT |
2089 | | TPM_INTF_LOCALITY_CHANGE_INT | TPM_INTF_DATA_AVAIL_INT |
2090 | | TPM_INTF_STS_VALID_INT | TPM_GLOBAL_INT_ENABLE; |
2091 | |
2092 | tpm_tis_write32(priv, TPM_INT_ENABLE(priv->locality), intmask); |
2093 | + |
2094 | +out: |
2095 | + if (chip->ops->clk_enable != NULL) |
2096 | + chip->ops->clk_enable(chip, false); |
2097 | + |
2098 | + return; |
2099 | } |
2100 | |
2101 | int tpm_tis_resume(struct device *dev) |
2102 | diff --git a/drivers/char/tpm/tpm_tis_core.h b/drivers/char/tpm/tpm_tis_core.h |
2103 | index 6bbac319ff3b..d5c6a2e952b3 100644 |
2104 | --- a/drivers/char/tpm/tpm_tis_core.h |
2105 | +++ b/drivers/char/tpm/tpm_tis_core.h |
2106 | @@ -79,6 +79,11 @@ enum tis_defaults { |
2107 | #define TPM_DID_VID(l) (0x0F00 | ((l) << 12)) |
2108 | #define TPM_RID(l) (0x0F04 | ((l) << 12)) |
2109 | |
2110 | +#define LPC_CNTRL_OFFSET 0x84 |
2111 | +#define LPC_CLKRUN_EN (1 << 2) |
2112 | +#define INTEL_LEGACY_BLK_BASE_ADDR 0xFED08000 |
2113 | +#define ILB_REMAP_SIZE 0x100 |
2114 | + |
2115 | enum tpm_tis_flags { |
2116 | TPM_TIS_ITPM_WORKAROUND = BIT(0), |
2117 | }; |
2118 | @@ -89,6 +94,8 @@ struct tpm_tis_data { |
2119 | int irq; |
2120 | bool irq_tested; |
2121 | unsigned int flags; |
2122 | + void __iomem *ilb_base_addr; |
2123 | + u16 clkrun_enabled; |
2124 | wait_queue_head_t int_queue; |
2125 | wait_queue_head_t read_queue; |
2126 | const struct tpm_tis_phy_ops *phy_ops; |
2127 | @@ -144,6 +151,15 @@ static inline int tpm_tis_write32(struct tpm_tis_data *data, u32 addr, |
2128 | return data->phy_ops->write32(data, addr, value); |
2129 | } |
2130 | |
2131 | +static inline bool is_bsw(void) |
2132 | +{ |
2133 | +#ifdef CONFIG_X86 |
2134 | + return ((boot_cpu_data.x86_model == INTEL_FAM6_ATOM_AIRMONT) ? 1 : 0); |
2135 | +#else |
2136 | + return false; |
2137 | +#endif |
2138 | +} |
2139 | + |
2140 | void tpm_tis_remove(struct tpm_chip *chip); |
2141 | int tpm_tis_core_init(struct device *dev, struct tpm_tis_data *priv, int irq, |
2142 | const struct tpm_tis_phy_ops *phy_ops, |
2143 | diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c |
2144 | index 57afad79f55d..8fa850a070e0 100644 |
2145 | --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c |
2146 | +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c |
2147 | @@ -540,6 +540,9 @@ int amdgpu_acpi_pcie_performance_request(struct amdgpu_device *adev, |
2148 | size_t size; |
2149 | u32 retry = 3; |
2150 | |
2151 | + if (amdgpu_acpi_pcie_notify_device_ready(adev)) |
2152 | + return -EINVAL; |
2153 | + |
2154 | /* Get the device handle */ |
2155 | handle = ACPI_HANDLE(&adev->pdev->dev); |
2156 | if (!handle) |
2157 | diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c |
2158 | index 8d1cf2d3e663..848242821ef3 100644 |
2159 | --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c |
2160 | +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c |
2161 | @@ -739,9 +739,11 @@ amdgpu_connector_lvds_detect(struct drm_connector *connector, bool force) |
2162 | enum drm_connector_status ret = connector_status_disconnected; |
2163 | int r; |
2164 | |
2165 | - r = pm_runtime_get_sync(connector->dev->dev); |
2166 | - if (r < 0) |
2167 | - return connector_status_disconnected; |
2168 | + if (!drm_kms_helper_is_poll_worker()) { |
2169 | + r = pm_runtime_get_sync(connector->dev->dev); |
2170 | + if (r < 0) |
2171 | + return connector_status_disconnected; |
2172 | + } |
2173 | |
2174 | if (encoder) { |
2175 | struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder); |
2176 | @@ -760,8 +762,12 @@ amdgpu_connector_lvds_detect(struct drm_connector *connector, bool force) |
2177 | /* check acpi lid status ??? */ |
2178 | |
2179 | amdgpu_connector_update_scratch_regs(connector, ret); |
2180 | - pm_runtime_mark_last_busy(connector->dev->dev); |
2181 | - pm_runtime_put_autosuspend(connector->dev->dev); |
2182 | + |
2183 | + if (!drm_kms_helper_is_poll_worker()) { |
2184 | + pm_runtime_mark_last_busy(connector->dev->dev); |
2185 | + pm_runtime_put_autosuspend(connector->dev->dev); |
2186 | + } |
2187 | + |
2188 | return ret; |
2189 | } |
2190 | |
2191 | @@ -871,9 +877,11 @@ amdgpu_connector_vga_detect(struct drm_connector *connector, bool force) |
2192 | enum drm_connector_status ret = connector_status_disconnected; |
2193 | int r; |
2194 | |
2195 | - r = pm_runtime_get_sync(connector->dev->dev); |
2196 | - if (r < 0) |
2197 | - return connector_status_disconnected; |
2198 | + if (!drm_kms_helper_is_poll_worker()) { |
2199 | + r = pm_runtime_get_sync(connector->dev->dev); |
2200 | + if (r < 0) |
2201 | + return connector_status_disconnected; |
2202 | + } |
2203 | |
2204 | encoder = amdgpu_connector_best_single_encoder(connector); |
2205 | if (!encoder) |
2206 | @@ -927,8 +935,10 @@ amdgpu_connector_vga_detect(struct drm_connector *connector, bool force) |
2207 | amdgpu_connector_update_scratch_regs(connector, ret); |
2208 | |
2209 | out: |
2210 | - pm_runtime_mark_last_busy(connector->dev->dev); |
2211 | - pm_runtime_put_autosuspend(connector->dev->dev); |
2212 | + if (!drm_kms_helper_is_poll_worker()) { |
2213 | + pm_runtime_mark_last_busy(connector->dev->dev); |
2214 | + pm_runtime_put_autosuspend(connector->dev->dev); |
2215 | + } |
2216 | |
2217 | return ret; |
2218 | } |
2219 | @@ -991,9 +1001,11 @@ amdgpu_connector_dvi_detect(struct drm_connector *connector, bool force) |
2220 | enum drm_connector_status ret = connector_status_disconnected; |
2221 | bool dret = false, broken_edid = false; |
2222 | |
2223 | - r = pm_runtime_get_sync(connector->dev->dev); |
2224 | - if (r < 0) |
2225 | - return connector_status_disconnected; |
2226 | + if (!drm_kms_helper_is_poll_worker()) { |
2227 | + r = pm_runtime_get_sync(connector->dev->dev); |
2228 | + if (r < 0) |
2229 | + return connector_status_disconnected; |
2230 | + } |
2231 | |
2232 | if (!force && amdgpu_connector_check_hpd_status_unchanged(connector)) { |
2233 | ret = connector->status; |
2234 | @@ -1118,8 +1130,10 @@ amdgpu_connector_dvi_detect(struct drm_connector *connector, bool force) |
2235 | amdgpu_connector_update_scratch_regs(connector, ret); |
2236 | |
2237 | exit: |
2238 | - pm_runtime_mark_last_busy(connector->dev->dev); |
2239 | - pm_runtime_put_autosuspend(connector->dev->dev); |
2240 | + if (!drm_kms_helper_is_poll_worker()) { |
2241 | + pm_runtime_mark_last_busy(connector->dev->dev); |
2242 | + pm_runtime_put_autosuspend(connector->dev->dev); |
2243 | + } |
2244 | |
2245 | return ret; |
2246 | } |
2247 | @@ -1362,9 +1376,11 @@ amdgpu_connector_dp_detect(struct drm_connector *connector, bool force) |
2248 | struct drm_encoder *encoder = amdgpu_connector_best_single_encoder(connector); |
2249 | int r; |
2250 | |
2251 | - r = pm_runtime_get_sync(connector->dev->dev); |
2252 | - if (r < 0) |
2253 | - return connector_status_disconnected; |
2254 | + if (!drm_kms_helper_is_poll_worker()) { |
2255 | + r = pm_runtime_get_sync(connector->dev->dev); |
2256 | + if (r < 0) |
2257 | + return connector_status_disconnected; |
2258 | + } |
2259 | |
2260 | if (!force && amdgpu_connector_check_hpd_status_unchanged(connector)) { |
2261 | ret = connector->status; |
2262 | @@ -1432,8 +1448,10 @@ amdgpu_connector_dp_detect(struct drm_connector *connector, bool force) |
2263 | |
2264 | amdgpu_connector_update_scratch_regs(connector, ret); |
2265 | out: |
2266 | - pm_runtime_mark_last_busy(connector->dev->dev); |
2267 | - pm_runtime_put_autosuspend(connector->dev->dev); |
2268 | + if (!drm_kms_helper_is_poll_worker()) { |
2269 | + pm_runtime_mark_last_busy(connector->dev->dev); |
2270 | + pm_runtime_put_autosuspend(connector->dev->dev); |
2271 | + } |
2272 | |
2273 | return ret; |
2274 | } |
2275 | diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c |
2276 | index e19928dae8e3..17deca0f6255 100644 |
2277 | --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c |
2278 | +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c |
2279 | @@ -293,12 +293,15 @@ int amdgpu_uvd_suspend(struct amdgpu_device *adev) |
2280 | if (adev->uvd.vcpu_bo == NULL) |
2281 | return 0; |
2282 | |
2283 | - for (i = 0; i < adev->uvd.max_handles; ++i) |
2284 | - if (atomic_read(&adev->uvd.handles[i])) |
2285 | - break; |
2286 | + /* only valid for physical mode */ |
2287 | + if (adev->asic_type < CHIP_POLARIS10) { |
2288 | + for (i = 0; i < adev->uvd.max_handles; ++i) |
2289 | + if (atomic_read(&adev->uvd.handles[i])) |
2290 | + break; |
2291 | |
2292 | - if (i == AMDGPU_MAX_UVD_HANDLES) |
2293 | - return 0; |
2294 | + if (i == adev->uvd.max_handles) |
2295 | + return 0; |
2296 | + } |
2297 | |
2298 | cancel_delayed_work_sync(&adev->uvd.idle_work); |
2299 | |
2300 | diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c |
2301 | index 00868764a0dd..6f76b2646465 100644 |
2302 | --- a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c |
2303 | +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c |
2304 | @@ -4387,34 +4387,8 @@ static void gfx_v7_0_gpu_early_init(struct amdgpu_device *adev) |
2305 | case CHIP_KAVERI: |
2306 | adev->gfx.config.max_shader_engines = 1; |
2307 | adev->gfx.config.max_tile_pipes = 4; |
2308 | - if ((adev->pdev->device == 0x1304) || |
2309 | - (adev->pdev->device == 0x1305) || |
2310 | - (adev->pdev->device == 0x130C) || |
2311 | - (adev->pdev->device == 0x130F) || |
2312 | - (adev->pdev->device == 0x1310) || |
2313 | - (adev->pdev->device == 0x1311) || |
2314 | - (adev->pdev->device == 0x131C)) { |
2315 | - adev->gfx.config.max_cu_per_sh = 8; |
2316 | - adev->gfx.config.max_backends_per_se = 2; |
2317 | - } else if ((adev->pdev->device == 0x1309) || |
2318 | - (adev->pdev->device == 0x130A) || |
2319 | - (adev->pdev->device == 0x130D) || |
2320 | - (adev->pdev->device == 0x1313) || |
2321 | - (adev->pdev->device == 0x131D)) { |
2322 | - adev->gfx.config.max_cu_per_sh = 6; |
2323 | - adev->gfx.config.max_backends_per_se = 2; |
2324 | - } else if ((adev->pdev->device == 0x1306) || |
2325 | - (adev->pdev->device == 0x1307) || |
2326 | - (adev->pdev->device == 0x130B) || |
2327 | - (adev->pdev->device == 0x130E) || |
2328 | - (adev->pdev->device == 0x1315) || |
2329 | - (adev->pdev->device == 0x131B)) { |
2330 | - adev->gfx.config.max_cu_per_sh = 4; |
2331 | - adev->gfx.config.max_backends_per_se = 1; |
2332 | - } else { |
2333 | - adev->gfx.config.max_cu_per_sh = 3; |
2334 | - adev->gfx.config.max_backends_per_se = 1; |
2335 | - } |
2336 | + adev->gfx.config.max_cu_per_sh = 8; |
2337 | + adev->gfx.config.max_backends_per_se = 2; |
2338 | adev->gfx.config.max_sh_per_se = 1; |
2339 | adev->gfx.config.max_texture_channel_caches = 4; |
2340 | adev->gfx.config.max_gprs = 256; |
2341 | diff --git a/drivers/gpu/drm/amd/amdgpu/si.c b/drivers/gpu/drm/amd/amdgpu/si.c |
2342 | index 8284d5dbfc30..4c178feeb4bd 100644 |
2343 | --- a/drivers/gpu/drm/amd/amdgpu/si.c |
2344 | +++ b/drivers/gpu/drm/amd/amdgpu/si.c |
2345 | @@ -31,6 +31,7 @@ |
2346 | #include "amdgpu_uvd.h" |
2347 | #include "amdgpu_vce.h" |
2348 | #include "atom.h" |
2349 | +#include "amd_pcie.h" |
2350 | #include "amdgpu_powerplay.h" |
2351 | #include "sid.h" |
2352 | #include "si_ih.h" |
2353 | @@ -1461,8 +1462,8 @@ static void si_pcie_gen3_enable(struct amdgpu_device *adev) |
2354 | { |
2355 | struct pci_dev *root = adev->pdev->bus->self; |
2356 | int bridge_pos, gpu_pos; |
2357 | - u32 speed_cntl, mask, current_data_rate; |
2358 | - int ret, i; |
2359 | + u32 speed_cntl, current_data_rate; |
2360 | + int i; |
2361 | u16 tmp16; |
2362 | |
2363 | if (pci_is_root_bus(adev->pdev->bus)) |
2364 | @@ -1474,23 +1475,20 @@ static void si_pcie_gen3_enable(struct amdgpu_device *adev) |
2365 | if (adev->flags & AMD_IS_APU) |
2366 | return; |
2367 | |
2368 | - ret = drm_pcie_get_speed_cap_mask(adev->ddev, &mask); |
2369 | - if (ret != 0) |
2370 | - return; |
2371 | - |
2372 | - if (!(mask & (DRM_PCIE_SPEED_50 | DRM_PCIE_SPEED_80))) |
2373 | + if (!(adev->pm.pcie_gen_mask & (CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2 | |
2374 | + CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3))) |
2375 | return; |
2376 | |
2377 | speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL); |
2378 | current_data_rate = (speed_cntl & LC_CURRENT_DATA_RATE_MASK) >> |
2379 | LC_CURRENT_DATA_RATE_SHIFT; |
2380 | - if (mask & DRM_PCIE_SPEED_80) { |
2381 | + if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3) { |
2382 | if (current_data_rate == 2) { |
2383 | DRM_INFO("PCIE gen 3 link speeds already enabled\n"); |
2384 | return; |
2385 | } |
2386 | DRM_INFO("enabling PCIE gen 3 link speeds, disable with amdgpu.pcie_gen2=0\n"); |
2387 | - } else if (mask & DRM_PCIE_SPEED_50) { |
2388 | + } else if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2) { |
2389 | if (current_data_rate == 1) { |
2390 | DRM_INFO("PCIE gen 2 link speeds already enabled\n"); |
2391 | return; |
2392 | @@ -1506,7 +1504,7 @@ static void si_pcie_gen3_enable(struct amdgpu_device *adev) |
2393 | if (!gpu_pos) |
2394 | return; |
2395 | |
2396 | - if (mask & DRM_PCIE_SPEED_80) { |
2397 | + if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3) { |
2398 | if (current_data_rate != 2) { |
2399 | u16 bridge_cfg, gpu_cfg; |
2400 | u16 bridge_cfg2, gpu_cfg2; |
2401 | @@ -1589,9 +1587,9 @@ static void si_pcie_gen3_enable(struct amdgpu_device *adev) |
2402 | |
2403 | pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL2, &tmp16); |
2404 | tmp16 &= ~0xf; |
2405 | - if (mask & DRM_PCIE_SPEED_80) |
2406 | + if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3) |
2407 | tmp16 |= 3; |
2408 | - else if (mask & DRM_PCIE_SPEED_50) |
2409 | + else if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2) |
2410 | tmp16 |= 2; |
2411 | else |
2412 | tmp16 |= 1; |
2413 | diff --git a/drivers/gpu/drm/amd/amdgpu/si_dpm.c b/drivers/gpu/drm/amd/amdgpu/si_dpm.c |
2414 | index a2aeb643ac51..abb0a2341a41 100644 |
2415 | --- a/drivers/gpu/drm/amd/amdgpu/si_dpm.c |
2416 | +++ b/drivers/gpu/drm/amd/amdgpu/si_dpm.c |
2417 | @@ -26,6 +26,7 @@ |
2418 | #include "amdgpu_pm.h" |
2419 | #include "amdgpu_dpm.h" |
2420 | #include "amdgpu_atombios.h" |
2421 | +#include "amd_pcie.h" |
2422 | #include "sid.h" |
2423 | #include "r600_dpm.h" |
2424 | #include "si_dpm.h" |
2425 | @@ -3332,29 +3333,6 @@ static void btc_apply_voltage_delta_rules(struct amdgpu_device *adev, |
2426 | } |
2427 | } |
2428 | |
2429 | -static enum amdgpu_pcie_gen r600_get_pcie_gen_support(struct amdgpu_device *adev, |
2430 | - u32 sys_mask, |
2431 | - enum amdgpu_pcie_gen asic_gen, |
2432 | - enum amdgpu_pcie_gen default_gen) |
2433 | -{ |
2434 | - switch (asic_gen) { |
2435 | - case AMDGPU_PCIE_GEN1: |
2436 | - return AMDGPU_PCIE_GEN1; |
2437 | - case AMDGPU_PCIE_GEN2: |
2438 | - return AMDGPU_PCIE_GEN2; |
2439 | - case AMDGPU_PCIE_GEN3: |
2440 | - return AMDGPU_PCIE_GEN3; |
2441 | - default: |
2442 | - if ((sys_mask & DRM_PCIE_SPEED_80) && (default_gen == AMDGPU_PCIE_GEN3)) |
2443 | - return AMDGPU_PCIE_GEN3; |
2444 | - else if ((sys_mask & DRM_PCIE_SPEED_50) && (default_gen == AMDGPU_PCIE_GEN2)) |
2445 | - return AMDGPU_PCIE_GEN2; |
2446 | - else |
2447 | - return AMDGPU_PCIE_GEN1; |
2448 | - } |
2449 | - return AMDGPU_PCIE_GEN1; |
2450 | -} |
2451 | - |
2452 | static void r600_calculate_u_and_p(u32 i, u32 r_c, u32 p_b, |
2453 | u32 *p, u32 *u) |
2454 | { |
2455 | @@ -5028,10 +5006,11 @@ static int si_populate_smc_acpi_state(struct amdgpu_device *adev, |
2456 | table->ACPIState.levels[0].vddc.index, |
2457 | &table->ACPIState.levels[0].std_vddc); |
2458 | } |
2459 | - table->ACPIState.levels[0].gen2PCIE = (u8)r600_get_pcie_gen_support(adev, |
2460 | - si_pi->sys_pcie_mask, |
2461 | - si_pi->boot_pcie_gen, |
2462 | - AMDGPU_PCIE_GEN1); |
2463 | + table->ACPIState.levels[0].gen2PCIE = |
2464 | + (u8)amdgpu_get_pcie_gen_support(adev, |
2465 | + si_pi->sys_pcie_mask, |
2466 | + si_pi->boot_pcie_gen, |
2467 | + AMDGPU_PCIE_GEN1); |
2468 | |
2469 | if (si_pi->vddc_phase_shed_control) |
2470 | si_populate_phase_shedding_value(adev, |
2471 | @@ -7162,10 +7141,10 @@ static void si_parse_pplib_clock_info(struct amdgpu_device *adev, |
2472 | pl->vddc = le16_to_cpu(clock_info->si.usVDDC); |
2473 | pl->vddci = le16_to_cpu(clock_info->si.usVDDCI); |
2474 | pl->flags = le32_to_cpu(clock_info->si.ulFlags); |
2475 | - pl->pcie_gen = r600_get_pcie_gen_support(adev, |
2476 | - si_pi->sys_pcie_mask, |
2477 | - si_pi->boot_pcie_gen, |
2478 | - clock_info->si.ucPCIEGen); |
2479 | + pl->pcie_gen = amdgpu_get_pcie_gen_support(adev, |
2480 | + si_pi->sys_pcie_mask, |
2481 | + si_pi->boot_pcie_gen, |
2482 | + clock_info->si.ucPCIEGen); |
2483 | |
2484 | /* patch up vddc if necessary */ |
2485 | ret = si_get_leakage_voltage_from_leakage_index(adev, pl->vddc, |
2486 | @@ -7320,7 +7299,6 @@ static int si_dpm_init(struct amdgpu_device *adev) |
2487 | struct si_power_info *si_pi; |
2488 | struct atom_clock_dividers dividers; |
2489 | int ret; |
2490 | - u32 mask; |
2491 | |
2492 | si_pi = kzalloc(sizeof(struct si_power_info), GFP_KERNEL); |
2493 | if (si_pi == NULL) |
2494 | @@ -7330,11 +7308,9 @@ static int si_dpm_init(struct amdgpu_device *adev) |
2495 | eg_pi = &ni_pi->eg; |
2496 | pi = &eg_pi->rv7xx; |
2497 | |
2498 | - ret = drm_pcie_get_speed_cap_mask(adev->ddev, &mask); |
2499 | - if (ret) |
2500 | - si_pi->sys_pcie_mask = 0; |
2501 | - else |
2502 | - si_pi->sys_pcie_mask = mask; |
2503 | + si_pi->sys_pcie_mask = |
2504 | + (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_MASK) >> |
2505 | + CAIL_PCIE_LINK_SPEED_SUPPORT_SHIFT; |
2506 | si_pi->force_pcie_gen = AMDGPU_PCIE_GEN_INVALID; |
2507 | si_pi->boot_pcie_gen = si_get_current_pcie_speed(adev); |
2508 | |
2509 | diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c |
2510 | index b526f49be65d..336fdd8c7db0 100644 |
2511 | --- a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c |
2512 | +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c |
2513 | @@ -2788,10 +2788,13 @@ static int smu7_apply_state_adjust_rules(struct pp_hwmgr *hwmgr, |
2514 | PHM_PlatformCaps_DisableMclkSwitchingForFrameLock); |
2515 | |
2516 | |
2517 | - disable_mclk_switching = ((1 < info.display_count) || |
2518 | - disable_mclk_switching_for_frame_lock || |
2519 | - smu7_vblank_too_short(hwmgr, mode_info.vblank_time_us) || |
2520 | - (mode_info.refresh_rate > 120)); |
2521 | + if (info.display_count == 0) |
2522 | + disable_mclk_switching = false; |
2523 | + else |
2524 | + disable_mclk_switching = ((1 < info.display_count) || |
2525 | + disable_mclk_switching_for_frame_lock || |
2526 | + smu7_vblank_too_short(hwmgr, mode_info.vblank_time_us) || |
2527 | + (mode_info.refresh_rate > 120)); |
2528 | |
2529 | sclk = smu7_ps->performance_levels[0].engine_clock; |
2530 | mclk = smu7_ps->performance_levels[0].memory_clock; |
2531 | @@ -4576,13 +4579,6 @@ static int smu7_set_power_profile_state(struct pp_hwmgr *hwmgr, |
2532 | int tmp_result, result = 0; |
2533 | uint32_t sclk_mask = 0, mclk_mask = 0; |
2534 | |
2535 | - if (hwmgr->chip_id == CHIP_FIJI) { |
2536 | - if (request->type == AMD_PP_GFX_PROFILE) |
2537 | - smu7_enable_power_containment(hwmgr); |
2538 | - else if (request->type == AMD_PP_COMPUTE_PROFILE) |
2539 | - smu7_disable_power_containment(hwmgr); |
2540 | - } |
2541 | - |
2542 | if (hwmgr->dpm_level != AMD_DPM_FORCED_LEVEL_AUTO) |
2543 | return -EINVAL; |
2544 | |
2545 | diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c |
2546 | index f8f02e70b8bc..ca232a9e2334 100644 |
2547 | --- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c |
2548 | +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c |
2549 | @@ -3243,10 +3243,13 @@ static int vega10_apply_state_adjust_rules(struct pp_hwmgr *hwmgr, |
2550 | force_mclk_high = phm_cap_enabled(hwmgr->platform_descriptor.platformCaps, |
2551 | PHM_PlatformCaps_ForceMclkHigh); |
2552 | |
2553 | - disable_mclk_switching = (info.display_count > 1) || |
2554 | - disable_mclk_switching_for_frame_lock || |
2555 | - disable_mclk_switching_for_vr || |
2556 | - force_mclk_high; |
2557 | + if (info.display_count == 0) |
2558 | + disable_mclk_switching = false; |
2559 | + else |
2560 | + disable_mclk_switching = (info.display_count > 1) || |
2561 | + disable_mclk_switching_for_frame_lock || |
2562 | + disable_mclk_switching_for_vr || |
2563 | + force_mclk_high; |
2564 | |
2565 | sclk = vega10_ps->performance_levels[0].gfx_clock; |
2566 | mclk = vega10_ps->performance_levels[0].mem_clock; |
2567 | diff --git a/drivers/gpu/drm/drm_framebuffer.c b/drivers/gpu/drm/drm_framebuffer.c |
2568 | index af279844d7ce..dd4727489b84 100644 |
2569 | --- a/drivers/gpu/drm/drm_framebuffer.c |
2570 | +++ b/drivers/gpu/drm/drm_framebuffer.c |
2571 | @@ -118,6 +118,10 @@ int drm_mode_addfb(struct drm_device *dev, |
2572 | r.pixel_format = drm_mode_legacy_fb_format(or->bpp, or->depth); |
2573 | r.handles[0] = or->handle; |
2574 | |
2575 | + if (r.pixel_format == DRM_FORMAT_XRGB2101010 && |
2576 | + dev->driver->driver_features & DRIVER_PREFER_XBGR_30BPP) |
2577 | + r.pixel_format = DRM_FORMAT_XBGR2101010; |
2578 | + |
2579 | ret = drm_mode_addfb2(dev, &r, file_priv); |
2580 | if (ret) |
2581 | return ret; |
2582 | diff --git a/drivers/gpu/drm/drm_probe_helper.c b/drivers/gpu/drm/drm_probe_helper.c |
2583 | index 904966cde32b..d29fd8443fed 100644 |
2584 | --- a/drivers/gpu/drm/drm_probe_helper.c |
2585 | +++ b/drivers/gpu/drm/drm_probe_helper.c |
2586 | @@ -671,6 +671,26 @@ static void output_poll_execute(struct work_struct *work) |
2587 | schedule_delayed_work(delayed_work, DRM_OUTPUT_POLL_PERIOD); |
2588 | } |
2589 | |
2590 | +/** |
2591 | + * drm_kms_helper_is_poll_worker - is %current task an output poll worker? |
2592 | + * |
2593 | + * Determine if %current task is an output poll worker. This can be used |
2594 | + * to select distinct code paths for output polling versus other contexts. |
2595 | + * |
2596 | + * One use case is to avoid a deadlock between the output poll worker and |
2597 | + * the autosuspend worker wherein the latter waits for polling to finish |
2598 | + * upon calling drm_kms_helper_poll_disable(), while the former waits for |
2599 | + * runtime suspend to finish upon calling pm_runtime_get_sync() in a |
2600 | + * connector ->detect hook. |
2601 | + */ |
2602 | +bool drm_kms_helper_is_poll_worker(void) |
2603 | +{ |
2604 | + struct work_struct *work = current_work(); |
2605 | + |
2606 | + return work && work->func == output_poll_execute; |
2607 | +} |
2608 | +EXPORT_SYMBOL(drm_kms_helper_is_poll_worker); |
2609 | + |
2610 | /** |
2611 | * drm_kms_helper_poll_disable - disable output polling |
2612 | * @dev: drm_device |
2613 | diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c |
2614 | index 5c5cb2ceee49..562220ec9d41 100644 |
2615 | --- a/drivers/gpu/drm/i915/i915_drv.c |
2616 | +++ b/drivers/gpu/drm/i915/i915_drv.c |
2617 | @@ -1806,6 +1806,8 @@ static int i915_drm_resume_early(struct drm_device *dev) |
2618 | if (IS_GEN9_LP(dev_priv) || |
2619 | !(dev_priv->suspended_to_idle && dev_priv->csr.dmc_payload)) |
2620 | intel_power_domains_init_hw(dev_priv, true); |
2621 | + else |
2622 | + intel_display_set_init_power(dev_priv, true); |
2623 | |
2624 | i915_gem_sanitize(dev_priv); |
2625 | |
2626 | diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c |
2627 | index 83876a1c8d98..de8ca5f1dd2e 100644 |
2628 | --- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c |
2629 | +++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c |
2630 | @@ -499,6 +499,8 @@ eb_add_vma(struct i915_execbuffer *eb, unsigned int i, struct i915_vma *vma) |
2631 | list_add_tail(&vma->exec_link, &eb->unbound); |
2632 | if (drm_mm_node_allocated(&vma->node)) |
2633 | err = i915_vma_unbind(vma); |
2634 | + if (unlikely(err)) |
2635 | + vma->exec_flags = NULL; |
2636 | } |
2637 | return err; |
2638 | } |
2639 | @@ -2408,7 +2410,7 @@ i915_gem_do_execbuffer(struct drm_device *dev, |
2640 | if (out_fence) { |
2641 | if (err == 0) { |
2642 | fd_install(out_fence_fd, out_fence->file); |
2643 | - args->rsvd2 &= GENMASK_ULL(0, 31); /* keep in-fence */ |
2644 | + args->rsvd2 &= GENMASK_ULL(31, 0); /* keep in-fence */ |
2645 | args->rsvd2 |= (u64)out_fence_fd << 32; |
2646 | out_fence_fd = -1; |
2647 | } else { |
2648 | diff --git a/drivers/gpu/drm/i915/i915_perf.c b/drivers/gpu/drm/i915/i915_perf.c |
2649 | index 370b9d248fed..3e49317f3ec3 100644 |
2650 | --- a/drivers/gpu/drm/i915/i915_perf.c |
2651 | +++ b/drivers/gpu/drm/i915/i915_perf.c |
2652 | @@ -1300,9 +1300,8 @@ static void i915_oa_stream_destroy(struct i915_perf_stream *stream) |
2653 | */ |
2654 | mutex_lock(&dev_priv->drm.struct_mutex); |
2655 | dev_priv->perf.oa.exclusive_stream = NULL; |
2656 | - mutex_unlock(&dev_priv->drm.struct_mutex); |
2657 | - |
2658 | dev_priv->perf.oa.ops.disable_metric_set(dev_priv); |
2659 | + mutex_unlock(&dev_priv->drm.struct_mutex); |
2660 | |
2661 | free_oa_buffer(dev_priv); |
2662 | |
2663 | @@ -1754,22 +1753,13 @@ static int gen8_switch_to_updated_kernel_context(struct drm_i915_private *dev_pr |
2664 | * Note: it's only the RCS/Render context that has any OA state. |
2665 | */ |
2666 | static int gen8_configure_all_contexts(struct drm_i915_private *dev_priv, |
2667 | - const struct i915_oa_config *oa_config, |
2668 | - bool interruptible) |
2669 | + const struct i915_oa_config *oa_config) |
2670 | { |
2671 | struct i915_gem_context *ctx; |
2672 | int ret; |
2673 | unsigned int wait_flags = I915_WAIT_LOCKED; |
2674 | |
2675 | - if (interruptible) { |
2676 | - ret = i915_mutex_lock_interruptible(&dev_priv->drm); |
2677 | - if (ret) |
2678 | - return ret; |
2679 | - |
2680 | - wait_flags |= I915_WAIT_INTERRUPTIBLE; |
2681 | - } else { |
2682 | - mutex_lock(&dev_priv->drm.struct_mutex); |
2683 | - } |
2684 | + lockdep_assert_held(&dev_priv->drm.struct_mutex); |
2685 | |
2686 | /* Switch away from any user context. */ |
2687 | ret = gen8_switch_to_updated_kernel_context(dev_priv, oa_config); |
2688 | @@ -1817,8 +1807,6 @@ static int gen8_configure_all_contexts(struct drm_i915_private *dev_priv, |
2689 | } |
2690 | |
2691 | out: |
2692 | - mutex_unlock(&dev_priv->drm.struct_mutex); |
2693 | - |
2694 | return ret; |
2695 | } |
2696 | |
2697 | @@ -1862,7 +1850,7 @@ static int gen8_enable_metric_set(struct drm_i915_private *dev_priv, |
2698 | * to make sure all slices/subslices are ON before writing to NOA |
2699 | * registers. |
2700 | */ |
2701 | - ret = gen8_configure_all_contexts(dev_priv, oa_config, true); |
2702 | + ret = gen8_configure_all_contexts(dev_priv, oa_config); |
2703 | if (ret) |
2704 | return ret; |
2705 | |
2706 | @@ -1877,7 +1865,7 @@ static int gen8_enable_metric_set(struct drm_i915_private *dev_priv, |
2707 | static void gen8_disable_metric_set(struct drm_i915_private *dev_priv) |
2708 | { |
2709 | /* Reset all contexts' slices/subslices configurations. */ |
2710 | - gen8_configure_all_contexts(dev_priv, NULL, false); |
2711 | + gen8_configure_all_contexts(dev_priv, NULL); |
2712 | |
2713 | I915_WRITE(GDT_CHICKEN_BITS, (I915_READ(GDT_CHICKEN_BITS) & |
2714 | ~GT_NOA_ENABLE)); |
2715 | @@ -2127,6 +2115,10 @@ static int i915_oa_stream_init(struct i915_perf_stream *stream, |
2716 | if (ret) |
2717 | goto err_oa_buf_alloc; |
2718 | |
2719 | + ret = i915_mutex_lock_interruptible(&dev_priv->drm); |
2720 | + if (ret) |
2721 | + goto err_lock; |
2722 | + |
2723 | ret = dev_priv->perf.oa.ops.enable_metric_set(dev_priv, |
2724 | stream->oa_config); |
2725 | if (ret) |
2726 | @@ -2134,23 +2126,17 @@ static int i915_oa_stream_init(struct i915_perf_stream *stream, |
2727 | |
2728 | stream->ops = &i915_oa_stream_ops; |
2729 | |
2730 | - /* Lock device for exclusive_stream access late because |
2731 | - * enable_metric_set() might lock as well on gen8+. |
2732 | - */ |
2733 | - ret = i915_mutex_lock_interruptible(&dev_priv->drm); |
2734 | - if (ret) |
2735 | - goto err_lock; |
2736 | - |
2737 | dev_priv->perf.oa.exclusive_stream = stream; |
2738 | |
2739 | mutex_unlock(&dev_priv->drm.struct_mutex); |
2740 | |
2741 | return 0; |
2742 | |
2743 | -err_lock: |
2744 | +err_enable: |
2745 | dev_priv->perf.oa.ops.disable_metric_set(dev_priv); |
2746 | + mutex_unlock(&dev_priv->drm.struct_mutex); |
2747 | |
2748 | -err_enable: |
2749 | +err_lock: |
2750 | free_oa_buffer(dev_priv); |
2751 | |
2752 | err_oa_buf_alloc: |
2753 | diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c |
2754 | index 059db50109bc..cf648c526e12 100644 |
2755 | --- a/drivers/gpu/drm/i915/intel_display.c |
2756 | +++ b/drivers/gpu/drm/i915/intel_display.c |
2757 | @@ -14498,6 +14498,8 @@ static void sanitize_watermarks(struct drm_device *dev) |
2758 | |
2759 | cs->wm.need_postvbl_update = true; |
2760 | dev_priv->display.optimize_watermarks(intel_state, cs); |
2761 | + |
2762 | + to_intel_crtc_state(crtc->state)->wm = cs->wm; |
2763 | } |
2764 | |
2765 | put_state: |
2766 | diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c |
2767 | index 3fed1d3ecded..1b292d5f1a68 100644 |
2768 | --- a/drivers/gpu/drm/i915/intel_hdmi.c |
2769 | +++ b/drivers/gpu/drm/i915/intel_hdmi.c |
2770 | @@ -1563,12 +1563,20 @@ intel_hdmi_set_edid(struct drm_connector *connector) |
2771 | struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector); |
2772 | struct edid *edid; |
2773 | bool connected = false; |
2774 | + struct i2c_adapter *i2c; |
2775 | |
2776 | intel_display_power_get(dev_priv, POWER_DOMAIN_GMBUS); |
2777 | |
2778 | - edid = drm_get_edid(connector, |
2779 | - intel_gmbus_get_adapter(dev_priv, |
2780 | - intel_hdmi->ddc_bus)); |
2781 | + i2c = intel_gmbus_get_adapter(dev_priv, intel_hdmi->ddc_bus); |
2782 | + |
2783 | + edid = drm_get_edid(connector, i2c); |
2784 | + |
2785 | + if (!edid && !intel_gmbus_is_forced_bit(i2c)) { |
2786 | + DRM_DEBUG_KMS("HDMI GMBUS EDID read failed, retry using GPIO bit-banging\n"); |
2787 | + intel_gmbus_force_bit(i2c, true); |
2788 | + edid = drm_get_edid(connector, i2c); |
2789 | + intel_gmbus_force_bit(i2c, false); |
2790 | + } |
2791 | |
2792 | intel_hdmi_dp_dual_mode_detect(connector, edid != NULL); |
2793 | |
2794 | diff --git a/drivers/gpu/drm/i915/intel_runtime_pm.c b/drivers/gpu/drm/i915/intel_runtime_pm.c |
2795 | index 51cb5293bf43..bcccacba1ec6 100644 |
2796 | --- a/drivers/gpu/drm/i915/intel_runtime_pm.c |
2797 | +++ b/drivers/gpu/drm/i915/intel_runtime_pm.c |
2798 | @@ -1844,6 +1844,7 @@ void intel_display_power_put(struct drm_i915_private *dev_priv, |
2799 | CNL_DISPLAY_POWERWELL_2_POWER_DOMAINS | \ |
2800 | BIT_ULL(POWER_DOMAIN_MODESET) | \ |
2801 | BIT_ULL(POWER_DOMAIN_AUX_A) | \ |
2802 | + BIT_ULL(POWER_DOMAIN_GMBUS) | \ |
2803 | BIT_ULL(POWER_DOMAIN_INIT)) |
2804 | |
2805 | static const struct i915_power_well_ops i9xx_always_on_power_well_ops = { |
2806 | diff --git a/drivers/gpu/drm/nouveau/nouveau_connector.c b/drivers/gpu/drm/nouveau/nouveau_connector.c |
2807 | index 70d8e0d69ad5..c902a851eb51 100644 |
2808 | --- a/drivers/gpu/drm/nouveau/nouveau_connector.c |
2809 | +++ b/drivers/gpu/drm/nouveau/nouveau_connector.c |
2810 | @@ -570,9 +570,15 @@ nouveau_connector_detect(struct drm_connector *connector, bool force) |
2811 | nv_connector->edid = NULL; |
2812 | } |
2813 | |
2814 | - ret = pm_runtime_get_sync(connector->dev->dev); |
2815 | - if (ret < 0 && ret != -EACCES) |
2816 | - return conn_status; |
2817 | + /* Outputs are only polled while runtime active, so acquiring a |
2818 | + * runtime PM ref here is unnecessary (and would deadlock upon |
2819 | + * runtime suspend because it waits for polling to finish). |
2820 | + */ |
2821 | + if (!drm_kms_helper_is_poll_worker()) { |
2822 | + ret = pm_runtime_get_sync(connector->dev->dev); |
2823 | + if (ret < 0 && ret != -EACCES) |
2824 | + return conn_status; |
2825 | + } |
2826 | |
2827 | nv_encoder = nouveau_connector_ddc_detect(connector); |
2828 | if (nv_encoder && (i2c = nv_encoder->i2c) != NULL) { |
2829 | @@ -647,8 +653,10 @@ nouveau_connector_detect(struct drm_connector *connector, bool force) |
2830 | |
2831 | out: |
2832 | |
2833 | - pm_runtime_mark_last_busy(connector->dev->dev); |
2834 | - pm_runtime_put_autosuspend(connector->dev->dev); |
2835 | + if (!drm_kms_helper_is_poll_worker()) { |
2836 | + pm_runtime_mark_last_busy(connector->dev->dev); |
2837 | + pm_runtime_put_autosuspend(connector->dev->dev); |
2838 | + } |
2839 | |
2840 | return conn_status; |
2841 | } |
2842 | diff --git a/drivers/gpu/drm/nouveau/nv50_display.c b/drivers/gpu/drm/nouveau/nv50_display.c |
2843 | index fb47d46050ec..6e196bc01118 100644 |
2844 | --- a/drivers/gpu/drm/nouveau/nv50_display.c |
2845 | +++ b/drivers/gpu/drm/nouveau/nv50_display.c |
2846 | @@ -4426,6 +4426,7 @@ nv50_display_create(struct drm_device *dev) |
2847 | nouveau_display(dev)->fini = nv50_display_fini; |
2848 | disp->disp = &nouveau_display(dev)->disp; |
2849 | dev->mode_config.funcs = &nv50_disp_func; |
2850 | + dev->driver->driver_features |= DRIVER_PREFER_XBGR_30BPP; |
2851 | if (nouveau_atomic) |
2852 | dev->driver->driver_features |= DRIVER_ATOMIC; |
2853 | |
2854 | diff --git a/drivers/gpu/drm/radeon/cik.c b/drivers/gpu/drm/radeon/cik.c |
2855 | index 3cb6c55b268d..ce8b353b5753 100644 |
2856 | --- a/drivers/gpu/drm/radeon/cik.c |
2857 | +++ b/drivers/gpu/drm/radeon/cik.c |
2858 | @@ -3229,35 +3229,8 @@ static void cik_gpu_init(struct radeon_device *rdev) |
2859 | case CHIP_KAVERI: |
2860 | rdev->config.cik.max_shader_engines = 1; |
2861 | rdev->config.cik.max_tile_pipes = 4; |
2862 | - if ((rdev->pdev->device == 0x1304) || |
2863 | - (rdev->pdev->device == 0x1305) || |
2864 | - (rdev->pdev->device == 0x130C) || |
2865 | - (rdev->pdev->device == 0x130F) || |
2866 | - (rdev->pdev->device == 0x1310) || |
2867 | - (rdev->pdev->device == 0x1311) || |
2868 | - (rdev->pdev->device == 0x131C)) { |
2869 | - rdev->config.cik.max_cu_per_sh = 8; |
2870 | - rdev->config.cik.max_backends_per_se = 2; |
2871 | - } else if ((rdev->pdev->device == 0x1309) || |
2872 | - (rdev->pdev->device == 0x130A) || |
2873 | - (rdev->pdev->device == 0x130D) || |
2874 | - (rdev->pdev->device == 0x1313) || |
2875 | - (rdev->pdev->device == 0x131D)) { |
2876 | - rdev->config.cik.max_cu_per_sh = 6; |
2877 | - rdev->config.cik.max_backends_per_se = 2; |
2878 | - } else if ((rdev->pdev->device == 0x1306) || |
2879 | - (rdev->pdev->device == 0x1307) || |
2880 | - (rdev->pdev->device == 0x130B) || |
2881 | - (rdev->pdev->device == 0x130E) || |
2882 | - (rdev->pdev->device == 0x1315) || |
2883 | - (rdev->pdev->device == 0x1318) || |
2884 | - (rdev->pdev->device == 0x131B)) { |
2885 | - rdev->config.cik.max_cu_per_sh = 4; |
2886 | - rdev->config.cik.max_backends_per_se = 1; |
2887 | - } else { |
2888 | - rdev->config.cik.max_cu_per_sh = 3; |
2889 | - rdev->config.cik.max_backends_per_se = 1; |
2890 | - } |
2891 | + rdev->config.cik.max_cu_per_sh = 8; |
2892 | + rdev->config.cik.max_backends_per_se = 2; |
2893 | rdev->config.cik.max_sh_per_se = 1; |
2894 | rdev->config.cik.max_texture_channel_caches = 4; |
2895 | rdev->config.cik.max_gprs = 256; |
2896 | diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c |
2897 | index 2f642cbefd8e..c0da44742988 100644 |
2898 | --- a/drivers/gpu/drm/radeon/radeon_connectors.c |
2899 | +++ b/drivers/gpu/drm/radeon/radeon_connectors.c |
2900 | @@ -900,9 +900,11 @@ radeon_lvds_detect(struct drm_connector *connector, bool force) |
2901 | enum drm_connector_status ret = connector_status_disconnected; |
2902 | int r; |
2903 | |
2904 | - r = pm_runtime_get_sync(connector->dev->dev); |
2905 | - if (r < 0) |
2906 | - return connector_status_disconnected; |
2907 | + if (!drm_kms_helper_is_poll_worker()) { |
2908 | + r = pm_runtime_get_sync(connector->dev->dev); |
2909 | + if (r < 0) |
2910 | + return connector_status_disconnected; |
2911 | + } |
2912 | |
2913 | if (encoder) { |
2914 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
2915 | @@ -925,8 +927,12 @@ radeon_lvds_detect(struct drm_connector *connector, bool force) |
2916 | /* check acpi lid status ??? */ |
2917 | |
2918 | radeon_connector_update_scratch_regs(connector, ret); |
2919 | - pm_runtime_mark_last_busy(connector->dev->dev); |
2920 | - pm_runtime_put_autosuspend(connector->dev->dev); |
2921 | + |
2922 | + if (!drm_kms_helper_is_poll_worker()) { |
2923 | + pm_runtime_mark_last_busy(connector->dev->dev); |
2924 | + pm_runtime_put_autosuspend(connector->dev->dev); |
2925 | + } |
2926 | + |
2927 | return ret; |
2928 | } |
2929 | |
2930 | @@ -1040,9 +1046,11 @@ radeon_vga_detect(struct drm_connector *connector, bool force) |
2931 | enum drm_connector_status ret = connector_status_disconnected; |
2932 | int r; |
2933 | |
2934 | - r = pm_runtime_get_sync(connector->dev->dev); |
2935 | - if (r < 0) |
2936 | - return connector_status_disconnected; |
2937 | + if (!drm_kms_helper_is_poll_worker()) { |
2938 | + r = pm_runtime_get_sync(connector->dev->dev); |
2939 | + if (r < 0) |
2940 | + return connector_status_disconnected; |
2941 | + } |
2942 | |
2943 | encoder = radeon_best_single_encoder(connector); |
2944 | if (!encoder) |
2945 | @@ -1109,8 +1117,10 @@ radeon_vga_detect(struct drm_connector *connector, bool force) |
2946 | radeon_connector_update_scratch_regs(connector, ret); |
2947 | |
2948 | out: |
2949 | - pm_runtime_mark_last_busy(connector->dev->dev); |
2950 | - pm_runtime_put_autosuspend(connector->dev->dev); |
2951 | + if (!drm_kms_helper_is_poll_worker()) { |
2952 | + pm_runtime_mark_last_busy(connector->dev->dev); |
2953 | + pm_runtime_put_autosuspend(connector->dev->dev); |
2954 | + } |
2955 | |
2956 | return ret; |
2957 | } |
2958 | @@ -1174,9 +1184,11 @@ radeon_tv_detect(struct drm_connector *connector, bool force) |
2959 | if (!radeon_connector->dac_load_detect) |
2960 | return ret; |
2961 | |
2962 | - r = pm_runtime_get_sync(connector->dev->dev); |
2963 | - if (r < 0) |
2964 | - return connector_status_disconnected; |
2965 | + if (!drm_kms_helper_is_poll_worker()) { |
2966 | + r = pm_runtime_get_sync(connector->dev->dev); |
2967 | + if (r < 0) |
2968 | + return connector_status_disconnected; |
2969 | + } |
2970 | |
2971 | encoder = radeon_best_single_encoder(connector); |
2972 | if (!encoder) |
2973 | @@ -1188,8 +1200,12 @@ radeon_tv_detect(struct drm_connector *connector, bool force) |
2974 | if (ret == connector_status_connected) |
2975 | ret = radeon_connector_analog_encoder_conflict_solve(connector, encoder, ret, false); |
2976 | radeon_connector_update_scratch_regs(connector, ret); |
2977 | - pm_runtime_mark_last_busy(connector->dev->dev); |
2978 | - pm_runtime_put_autosuspend(connector->dev->dev); |
2979 | + |
2980 | + if (!drm_kms_helper_is_poll_worker()) { |
2981 | + pm_runtime_mark_last_busy(connector->dev->dev); |
2982 | + pm_runtime_put_autosuspend(connector->dev->dev); |
2983 | + } |
2984 | + |
2985 | return ret; |
2986 | } |
2987 | |
2988 | @@ -1252,9 +1268,11 @@ radeon_dvi_detect(struct drm_connector *connector, bool force) |
2989 | enum drm_connector_status ret = connector_status_disconnected; |
2990 | bool dret = false, broken_edid = false; |
2991 | |
2992 | - r = pm_runtime_get_sync(connector->dev->dev); |
2993 | - if (r < 0) |
2994 | - return connector_status_disconnected; |
2995 | + if (!drm_kms_helper_is_poll_worker()) { |
2996 | + r = pm_runtime_get_sync(connector->dev->dev); |
2997 | + if (r < 0) |
2998 | + return connector_status_disconnected; |
2999 | + } |
3000 | |
3001 | if (radeon_connector->detected_hpd_without_ddc) { |
3002 | force = true; |
3003 | @@ -1437,8 +1455,10 @@ radeon_dvi_detect(struct drm_connector *connector, bool force) |
3004 | } |
3005 | |
3006 | exit: |
3007 | - pm_runtime_mark_last_busy(connector->dev->dev); |
3008 | - pm_runtime_put_autosuspend(connector->dev->dev); |
3009 | + if (!drm_kms_helper_is_poll_worker()) { |
3010 | + pm_runtime_mark_last_busy(connector->dev->dev); |
3011 | + pm_runtime_put_autosuspend(connector->dev->dev); |
3012 | + } |
3013 | |
3014 | return ret; |
3015 | } |
3016 | @@ -1689,9 +1709,11 @@ radeon_dp_detect(struct drm_connector *connector, bool force) |
3017 | if (radeon_dig_connector->is_mst) |
3018 | return connector_status_disconnected; |
3019 | |
3020 | - r = pm_runtime_get_sync(connector->dev->dev); |
3021 | - if (r < 0) |
3022 | - return connector_status_disconnected; |
3023 | + if (!drm_kms_helper_is_poll_worker()) { |
3024 | + r = pm_runtime_get_sync(connector->dev->dev); |
3025 | + if (r < 0) |
3026 | + return connector_status_disconnected; |
3027 | + } |
3028 | |
3029 | if (!force && radeon_check_hpd_status_unchanged(connector)) { |
3030 | ret = connector->status; |
3031 | @@ -1778,8 +1800,10 @@ radeon_dp_detect(struct drm_connector *connector, bool force) |
3032 | } |
3033 | |
3034 | out: |
3035 | - pm_runtime_mark_last_busy(connector->dev->dev); |
3036 | - pm_runtime_put_autosuspend(connector->dev->dev); |
3037 | + if (!drm_kms_helper_is_poll_worker()) { |
3038 | + pm_runtime_mark_last_busy(connector->dev->dev); |
3039 | + pm_runtime_put_autosuspend(connector->dev->dev); |
3040 | + } |
3041 | |
3042 | return ret; |
3043 | } |
3044 | diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c |
3045 | index ffc10cadcf34..32b577c776b9 100644 |
3046 | --- a/drivers/gpu/drm/radeon/radeon_device.c |
3047 | +++ b/drivers/gpu/drm/radeon/radeon_device.c |
3048 | @@ -1397,6 +1397,10 @@ int radeon_device_init(struct radeon_device *rdev, |
3049 | if ((rdev->flags & RADEON_IS_PCI) && |
3050 | (rdev->family <= CHIP_RS740)) |
3051 | rdev->need_dma32 = true; |
3052 | +#ifdef CONFIG_PPC64 |
3053 | + if (rdev->family == CHIP_CEDAR) |
3054 | + rdev->need_dma32 = true; |
3055 | +#endif |
3056 | |
3057 | dma_bits = rdev->need_dma32 ? 32 : 40; |
3058 | r = pci_set_dma_mask(rdev->pdev, DMA_BIT_MASK(dma_bits)); |
3059 | diff --git a/drivers/gpu/drm/radeon/radeon_pm.c b/drivers/gpu/drm/radeon/radeon_pm.c |
3060 | index 326ad068c15a..4b6542538ff9 100644 |
3061 | --- a/drivers/gpu/drm/radeon/radeon_pm.c |
3062 | +++ b/drivers/gpu/drm/radeon/radeon_pm.c |
3063 | @@ -47,7 +47,6 @@ static bool radeon_pm_in_vbl(struct radeon_device *rdev); |
3064 | static bool radeon_pm_debug_check_in_vbl(struct radeon_device *rdev, bool finish); |
3065 | static void radeon_pm_update_profile(struct radeon_device *rdev); |
3066 | static void radeon_pm_set_clocks(struct radeon_device *rdev); |
3067 | -static void radeon_pm_compute_clocks_dpm(struct radeon_device *rdev); |
3068 | |
3069 | int radeon_pm_get_type_index(struct radeon_device *rdev, |
3070 | enum radeon_pm_state_type ps_type, |
3071 | @@ -80,8 +79,6 @@ void radeon_pm_acpi_event_handler(struct radeon_device *rdev) |
3072 | radeon_dpm_enable_bapm(rdev, rdev->pm.dpm.ac_power); |
3073 | } |
3074 | mutex_unlock(&rdev->pm.mutex); |
3075 | - /* allow new DPM state to be picked */ |
3076 | - radeon_pm_compute_clocks_dpm(rdev); |
3077 | } else if (rdev->pm.pm_method == PM_METHOD_PROFILE) { |
3078 | if (rdev->pm.profile == PM_PROFILE_AUTO) { |
3079 | mutex_lock(&rdev->pm.mutex); |
3080 | @@ -885,8 +882,7 @@ static struct radeon_ps *radeon_dpm_pick_power_state(struct radeon_device *rdev, |
3081 | dpm_state = POWER_STATE_TYPE_INTERNAL_3DPERF; |
3082 | /* balanced states don't exist at the moment */ |
3083 | if (dpm_state == POWER_STATE_TYPE_BALANCED) |
3084 | - dpm_state = rdev->pm.dpm.ac_power ? |
3085 | - POWER_STATE_TYPE_PERFORMANCE : POWER_STATE_TYPE_BATTERY; |
3086 | + dpm_state = POWER_STATE_TYPE_PERFORMANCE; |
3087 | |
3088 | restart_search: |
3089 | /* Pick the best power state based on current conditions */ |
3090 | diff --git a/drivers/infiniband/core/device.c b/drivers/infiniband/core/device.c |
3091 | index d7d042a20ab4..4dff06ab771e 100644 |
3092 | --- a/drivers/infiniband/core/device.c |
3093 | +++ b/drivers/infiniband/core/device.c |
3094 | @@ -534,14 +534,14 @@ int ib_register_device(struct ib_device *device, |
3095 | ret = device->query_device(device, &device->attrs, &uhw); |
3096 | if (ret) { |
3097 | pr_warn("Couldn't query the device attributes\n"); |
3098 | - goto cache_cleanup; |
3099 | + goto cg_cleanup; |
3100 | } |
3101 | |
3102 | ret = ib_device_register_sysfs(device, port_callback); |
3103 | if (ret) { |
3104 | pr_warn("Couldn't register device %s with driver model\n", |
3105 | device->name); |
3106 | - goto cache_cleanup; |
3107 | + goto cg_cleanup; |
3108 | } |
3109 | |
3110 | device->reg_state = IB_DEV_REGISTERED; |
3111 | @@ -557,6 +557,8 @@ int ib_register_device(struct ib_device *device, |
3112 | mutex_unlock(&device_mutex); |
3113 | return 0; |
3114 | |
3115 | +cg_cleanup: |
3116 | + ib_device_unregister_rdmacg(device); |
3117 | cache_cleanup: |
3118 | ib_cache_cleanup_one(device); |
3119 | ib_cache_release_one(device); |
3120 | diff --git a/drivers/infiniband/core/rdma_core.c b/drivers/infiniband/core/rdma_core.c |
3121 | index 4e1f76730855..9cb801d1fe54 100644 |
3122 | --- a/drivers/infiniband/core/rdma_core.c |
3123 | +++ b/drivers/infiniband/core/rdma_core.c |
3124 | @@ -407,13 +407,13 @@ static int __must_check remove_commit_fd_uobject(struct ib_uobject *uobj, |
3125 | return ret; |
3126 | } |
3127 | |
3128 | -static void lockdep_check(struct ib_uobject *uobj, bool exclusive) |
3129 | +static void assert_uverbs_usecnt(struct ib_uobject *uobj, bool exclusive) |
3130 | { |
3131 | #ifdef CONFIG_LOCKDEP |
3132 | if (exclusive) |
3133 | - WARN_ON(atomic_read(&uobj->usecnt) > 0); |
3134 | + WARN_ON(atomic_read(&uobj->usecnt) != -1); |
3135 | else |
3136 | - WARN_ON(atomic_read(&uobj->usecnt) == -1); |
3137 | + WARN_ON(atomic_read(&uobj->usecnt) <= 0); |
3138 | #endif |
3139 | } |
3140 | |
3141 | @@ -452,7 +452,7 @@ int __must_check rdma_remove_commit_uobject(struct ib_uobject *uobj) |
3142 | WARN(true, "ib_uverbs: Cleanup is running while removing an uobject\n"); |
3143 | return 0; |
3144 | } |
3145 | - lockdep_check(uobj, true); |
3146 | + assert_uverbs_usecnt(uobj, true); |
3147 | ret = _rdma_remove_commit_uobject(uobj, RDMA_REMOVE_DESTROY); |
3148 | |
3149 | up_read(&ucontext->cleanup_rwsem); |
3150 | @@ -482,7 +482,7 @@ int rdma_explicit_destroy(struct ib_uobject *uobject) |
3151 | WARN(true, "ib_uverbs: Cleanup is running while removing an uobject\n"); |
3152 | return 0; |
3153 | } |
3154 | - lockdep_check(uobject, true); |
3155 | + assert_uverbs_usecnt(uobject, true); |
3156 | ret = uobject->type->type_class->remove_commit(uobject, |
3157 | RDMA_REMOVE_DESTROY); |
3158 | if (ret) |
3159 | @@ -569,7 +569,7 @@ static void lookup_put_fd_uobject(struct ib_uobject *uobj, bool exclusive) |
3160 | |
3161 | void rdma_lookup_put_uobject(struct ib_uobject *uobj, bool exclusive) |
3162 | { |
3163 | - lockdep_check(uobj, exclusive); |
3164 | + assert_uverbs_usecnt(uobj, exclusive); |
3165 | uobj->type->type_class->lookup_put(uobj, exclusive); |
3166 | /* |
3167 | * In order to unlock an object, either decrease its usecnt for |
3168 | diff --git a/drivers/infiniband/core/ucma.c b/drivers/infiniband/core/ucma.c |
3169 | index eb85b546e223..c8b3a45e9edc 100644 |
3170 | --- a/drivers/infiniband/core/ucma.c |
3171 | +++ b/drivers/infiniband/core/ucma.c |
3172 | @@ -1148,6 +1148,9 @@ static ssize_t ucma_init_qp_attr(struct ucma_file *file, |
3173 | if (copy_from_user(&cmd, inbuf, sizeof(cmd))) |
3174 | return -EFAULT; |
3175 | |
3176 | + if (cmd.qp_state > IB_QPS_ERR) |
3177 | + return -EINVAL; |
3178 | + |
3179 | ctx = ucma_get_ctx(file, cmd.id); |
3180 | if (IS_ERR(ctx)) |
3181 | return PTR_ERR(ctx); |
3182 | @@ -1293,6 +1296,9 @@ static ssize_t ucma_set_option(struct ucma_file *file, const char __user *inbuf, |
3183 | if (IS_ERR(ctx)) |
3184 | return PTR_ERR(ctx); |
3185 | |
3186 | + if (unlikely(cmd.optval > KMALLOC_MAX_SIZE)) |
3187 | + return -EINVAL; |
3188 | + |
3189 | optval = memdup_user((void __user *) (unsigned long) cmd.optval, |
3190 | cmd.optlen); |
3191 | if (IS_ERR(optval)) { |
3192 | diff --git a/drivers/infiniband/hw/mlx5/cq.c b/drivers/infiniband/hw/mlx5/cq.c |
3193 | index 2aa53f427685..faedc080a5e6 100644 |
3194 | --- a/drivers/infiniband/hw/mlx5/cq.c |
3195 | +++ b/drivers/infiniband/hw/mlx5/cq.c |
3196 | @@ -1154,7 +1154,12 @@ static int resize_user(struct mlx5_ib_dev *dev, struct mlx5_ib_cq *cq, |
3197 | if (ucmd.reserved0 || ucmd.reserved1) |
3198 | return -EINVAL; |
3199 | |
3200 | - umem = ib_umem_get(context, ucmd.buf_addr, entries * ucmd.cqe_size, |
3201 | + /* check multiplication overflow */ |
3202 | + if (ucmd.cqe_size && SIZE_MAX / ucmd.cqe_size <= entries - 1) |
3203 | + return -EINVAL; |
3204 | + |
3205 | + umem = ib_umem_get(context, ucmd.buf_addr, |
3206 | + (size_t)ucmd.cqe_size * entries, |
3207 | IB_ACCESS_LOCAL_WRITE, 1); |
3208 | if (IS_ERR(umem)) { |
3209 | err = PTR_ERR(umem); |
3210 | diff --git a/drivers/infiniband/hw/mlx5/mr.c b/drivers/infiniband/hw/mlx5/mr.c |
3211 | index 231b043e2806..000937fe53ec 100644 |
3212 | --- a/drivers/infiniband/hw/mlx5/mr.c |
3213 | +++ b/drivers/infiniband/hw/mlx5/mr.c |
3214 | @@ -1813,7 +1813,6 @@ mlx5_ib_sg_to_klms(struct mlx5_ib_mr *mr, |
3215 | |
3216 | mr->ibmr.iova = sg_dma_address(sg) + sg_offset; |
3217 | mr->ibmr.length = 0; |
3218 | - mr->ndescs = sg_nents; |
3219 | |
3220 | for_each_sg(sgl, sg, sg_nents, i) { |
3221 | if (unlikely(i >= mr->max_descs)) |
3222 | @@ -1825,6 +1824,7 @@ mlx5_ib_sg_to_klms(struct mlx5_ib_mr *mr, |
3223 | |
3224 | sg_offset = 0; |
3225 | } |
3226 | + mr->ndescs = i; |
3227 | |
3228 | if (sg_offset_p) |
3229 | *sg_offset_p = sg_offset; |
3230 | diff --git a/drivers/input/keyboard/matrix_keypad.c b/drivers/input/keyboard/matrix_keypad.c |
3231 | index 1f316d66e6f7..41614c185918 100644 |
3232 | --- a/drivers/input/keyboard/matrix_keypad.c |
3233 | +++ b/drivers/input/keyboard/matrix_keypad.c |
3234 | @@ -218,8 +218,10 @@ static void matrix_keypad_stop(struct input_dev *dev) |
3235 | { |
3236 | struct matrix_keypad *keypad = input_get_drvdata(dev); |
3237 | |
3238 | + spin_lock_irq(&keypad->lock); |
3239 | keypad->stopped = true; |
3240 | - mb(); |
3241 | + spin_unlock_irq(&keypad->lock); |
3242 | + |
3243 | flush_work(&keypad->work.work); |
3244 | /* |
3245 | * matrix_keypad_scan() will leave IRQs enabled; |
3246 | diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c |
3247 | index 25bf003fb198..9417170f180a 100644 |
3248 | --- a/drivers/md/bcache/super.c |
3249 | +++ b/drivers/md/bcache/super.c |
3250 | @@ -938,6 +938,7 @@ int bch_cached_dev_attach(struct cached_dev *dc, struct cache_set *c) |
3251 | uint32_t rtime = cpu_to_le32(get_seconds()); |
3252 | struct uuid_entry *u; |
3253 | char buf[BDEVNAME_SIZE]; |
3254 | + struct cached_dev *exist_dc, *t; |
3255 | |
3256 | bdevname(dc->bdev, buf); |
3257 | |
3258 | @@ -961,6 +962,16 @@ int bch_cached_dev_attach(struct cached_dev *dc, struct cache_set *c) |
3259 | return -EINVAL; |
3260 | } |
3261 | |
3262 | + /* Check whether already attached */ |
3263 | + list_for_each_entry_safe(exist_dc, t, &c->cached_devs, list) { |
3264 | + if (!memcmp(dc->sb.uuid, exist_dc->sb.uuid, 16)) { |
3265 | + pr_err("Tried to attach %s but duplicate UUID already attached", |
3266 | + buf); |
3267 | + |
3268 | + return -EINVAL; |
3269 | + } |
3270 | + } |
3271 | + |
3272 | u = uuid_find(c, dc->sb.uuid); |
3273 | |
3274 | if (u && |
3275 | @@ -1181,7 +1192,7 @@ static void register_bdev(struct cache_sb *sb, struct page *sb_page, |
3276 | |
3277 | return; |
3278 | err: |
3279 | - pr_notice("error opening %s: %s", bdevname(bdev, name), err); |
3280 | + pr_notice("error %s: %s", bdevname(bdev, name), err); |
3281 | bcache_device_stop(&dc->disk); |
3282 | } |
3283 | |
3284 | @@ -1849,6 +1860,8 @@ static int register_cache(struct cache_sb *sb, struct page *sb_page, |
3285 | const char *err = NULL; /* must be set for any error case */ |
3286 | int ret = 0; |
3287 | |
3288 | + bdevname(bdev, name); |
3289 | + |
3290 | memcpy(&ca->sb, sb, sizeof(struct cache_sb)); |
3291 | ca->bdev = bdev; |
3292 | ca->bdev->bd_holder = ca; |
3293 | @@ -1857,11 +1870,12 @@ static int register_cache(struct cache_sb *sb, struct page *sb_page, |
3294 | ca->sb_bio.bi_io_vec[0].bv_page = sb_page; |
3295 | get_page(sb_page); |
3296 | |
3297 | - if (blk_queue_discard(bdev_get_queue(ca->bdev))) |
3298 | + if (blk_queue_discard(bdev_get_queue(bdev))) |
3299 | ca->discard = CACHE_DISCARD(&ca->sb); |
3300 | |
3301 | ret = cache_alloc(ca); |
3302 | if (ret != 0) { |
3303 | + blkdev_put(bdev, FMODE_READ|FMODE_WRITE|FMODE_EXCL); |
3304 | if (ret == -ENOMEM) |
3305 | err = "cache_alloc(): -ENOMEM"; |
3306 | else |
3307 | @@ -1884,14 +1898,14 @@ static int register_cache(struct cache_sb *sb, struct page *sb_page, |
3308 | goto out; |
3309 | } |
3310 | |
3311 | - pr_info("registered cache device %s", bdevname(bdev, name)); |
3312 | + pr_info("registered cache device %s", name); |
3313 | |
3314 | out: |
3315 | kobject_put(&ca->kobj); |
3316 | |
3317 | err: |
3318 | if (err) |
3319 | - pr_notice("error opening %s: %s", bdevname(bdev, name), err); |
3320 | + pr_notice("error %s: %s", name, err); |
3321 | |
3322 | return ret; |
3323 | } |
3324 | @@ -1980,6 +1994,7 @@ static ssize_t register_bcache(struct kobject *k, struct kobj_attribute *attr, |
3325 | if (err) |
3326 | goto err_close; |
3327 | |
3328 | + err = "failed to register device"; |
3329 | if (SB_IS_BDEV(sb)) { |
3330 | struct cached_dev *dc = kzalloc(sizeof(*dc), GFP_KERNEL); |
3331 | if (!dc) |
3332 | @@ -1994,7 +2009,7 @@ static ssize_t register_bcache(struct kobject *k, struct kobj_attribute *attr, |
3333 | goto err_close; |
3334 | |
3335 | if (register_cache(sb, sb_page, bdev, ca) != 0) |
3336 | - goto err_close; |
3337 | + goto err; |
3338 | } |
3339 | out: |
3340 | if (sb_page) |
3341 | @@ -2007,7 +2022,7 @@ static ssize_t register_bcache(struct kobject *k, struct kobj_attribute *attr, |
3342 | err_close: |
3343 | blkdev_put(bdev, FMODE_READ|FMODE_WRITE|FMODE_EXCL); |
3344 | err: |
3345 | - pr_info("error opening %s: %s", path, err); |
3346 | + pr_info("error %s: %s", path, err); |
3347 | ret = -EINVAL; |
3348 | goto out; |
3349 | } |
3350 | diff --git a/drivers/md/dm-bufio.c b/drivers/md/dm-bufio.c |
3351 | index 6d416fdc25cb..1e17e6421da3 100644 |
3352 | --- a/drivers/md/dm-bufio.c |
3353 | +++ b/drivers/md/dm-bufio.c |
3354 | @@ -386,9 +386,6 @@ static void __cache_size_refresh(void) |
3355 | static void *alloc_buffer_data(struct dm_bufio_client *c, gfp_t gfp_mask, |
3356 | enum data_mode *data_mode) |
3357 | { |
3358 | - unsigned noio_flag; |
3359 | - void *ptr; |
3360 | - |
3361 | if (c->block_size <= DM_BUFIO_BLOCK_SIZE_SLAB_LIMIT) { |
3362 | *data_mode = DATA_MODE_SLAB; |
3363 | return kmem_cache_alloc(DM_BUFIO_CACHE(c), gfp_mask); |
3364 | @@ -412,16 +409,15 @@ static void *alloc_buffer_data(struct dm_bufio_client *c, gfp_t gfp_mask, |
3365 | * all allocations done by this process (including pagetables) are done |
3366 | * as if GFP_NOIO was specified. |
3367 | */ |
3368 | + if (gfp_mask & __GFP_NORETRY) { |
3369 | + unsigned noio_flag = memalloc_noio_save(); |
3370 | + void *ptr = __vmalloc(c->block_size, gfp_mask, PAGE_KERNEL); |
3371 | |
3372 | - if (gfp_mask & __GFP_NORETRY) |
3373 | - noio_flag = memalloc_noio_save(); |
3374 | - |
3375 | - ptr = __vmalloc(c->block_size, gfp_mask, PAGE_KERNEL); |
3376 | - |
3377 | - if (gfp_mask & __GFP_NORETRY) |
3378 | memalloc_noio_restore(noio_flag); |
3379 | + return ptr; |
3380 | + } |
3381 | |
3382 | - return ptr; |
3383 | + return __vmalloc(c->block_size, gfp_mask, PAGE_KERNEL); |
3384 | } |
3385 | |
3386 | /* |
3387 | diff --git a/drivers/pci/dwc/pcie-designware-host.c b/drivers/pci/dwc/pcie-designware-host.c |
3388 | index 81e2157a7cfb..bc3e2d8d0cce 100644 |
3389 | --- a/drivers/pci/dwc/pcie-designware-host.c |
3390 | +++ b/drivers/pci/dwc/pcie-designware-host.c |
3391 | @@ -607,7 +607,7 @@ void dw_pcie_setup_rc(struct pcie_port *pp) |
3392 | /* setup bus numbers */ |
3393 | val = dw_pcie_readl_dbi(pci, PCI_PRIMARY_BUS); |
3394 | val &= 0xff000000; |
3395 | - val |= 0x00010100; |
3396 | + val |= 0x00ff0100; |
3397 | dw_pcie_writel_dbi(pci, PCI_PRIMARY_BUS, val); |
3398 | |
3399 | /* setup command register */ |
3400 | diff --git a/drivers/regulator/stm32-vrefbuf.c b/drivers/regulator/stm32-vrefbuf.c |
3401 | index 72c8b3e1022b..e0a9c445ed67 100644 |
3402 | --- a/drivers/regulator/stm32-vrefbuf.c |
3403 | +++ b/drivers/regulator/stm32-vrefbuf.c |
3404 | @@ -51,7 +51,7 @@ static int stm32_vrefbuf_enable(struct regulator_dev *rdev) |
3405 | * arbitrary timeout. |
3406 | */ |
3407 | ret = readl_poll_timeout(priv->base + STM32_VREFBUF_CSR, val, |
3408 | - !(val & STM32_VRR), 650, 10000); |
3409 | + val & STM32_VRR, 650, 10000); |
3410 | if (ret) { |
3411 | dev_err(&rdev->dev, "stm32 vrefbuf timed out!\n"); |
3412 | val = readl_relaxed(priv->base + STM32_VREFBUF_CSR); |
3413 | diff --git a/drivers/scsi/hosts.c b/drivers/scsi/hosts.c |
3414 | index 57bf43e34863..dd9464920456 100644 |
3415 | --- a/drivers/scsi/hosts.c |
3416 | +++ b/drivers/scsi/hosts.c |
3417 | @@ -328,8 +328,6 @@ static void scsi_host_dev_release(struct device *dev) |
3418 | if (shost->work_q) |
3419 | destroy_workqueue(shost->work_q); |
3420 | |
3421 | - destroy_rcu_head(&shost->rcu); |
3422 | - |
3423 | if (shost->shost_state == SHOST_CREATED) { |
3424 | /* |
3425 | * Free the shost_dev device name here if scsi_host_alloc() |
3426 | @@ -404,7 +402,6 @@ struct Scsi_Host *scsi_host_alloc(struct scsi_host_template *sht, int privsize) |
3427 | INIT_LIST_HEAD(&shost->starved_list); |
3428 | init_waitqueue_head(&shost->host_wait); |
3429 | mutex_init(&shost->scan_mutex); |
3430 | - init_rcu_head(&shost->rcu); |
3431 | |
3432 | index = ida_simple_get(&host_index_ida, 0, 0, GFP_KERNEL); |
3433 | if (index < 0) |
3434 | diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h |
3435 | index 486c075998f6..67b305531ec3 100644 |
3436 | --- a/drivers/scsi/qla2xxx/qla_def.h |
3437 | +++ b/drivers/scsi/qla2xxx/qla_def.h |
3438 | @@ -315,6 +315,29 @@ struct srb_cmd { |
3439 | /* To identify if a srb is of T10-CRC type. @sp => srb_t pointer */ |
3440 | #define IS_PROT_IO(sp) (sp->flags & SRB_CRC_CTX_DSD_VALID) |
3441 | |
3442 | +/* |
3443 | + * 24 bit port ID type definition. |
3444 | + */ |
3445 | +typedef union { |
3446 | + uint32_t b24 : 24; |
3447 | + |
3448 | + struct { |
3449 | +#ifdef __BIG_ENDIAN |
3450 | + uint8_t domain; |
3451 | + uint8_t area; |
3452 | + uint8_t al_pa; |
3453 | +#elif defined(__LITTLE_ENDIAN) |
3454 | + uint8_t al_pa; |
3455 | + uint8_t area; |
3456 | + uint8_t domain; |
3457 | +#else |
3458 | +#error "__BIG_ENDIAN or __LITTLE_ENDIAN must be defined!" |
3459 | +#endif |
3460 | + uint8_t rsvd_1; |
3461 | + } b; |
3462 | +} port_id_t; |
3463 | +#define INVALID_PORT_ID 0xFFFFFF |
3464 | + |
3465 | struct els_logo_payload { |
3466 | uint8_t opcode; |
3467 | uint8_t rsvd[3]; |
3468 | @@ -332,6 +355,7 @@ struct ct_arg { |
3469 | u32 rsp_size; |
3470 | void *req; |
3471 | void *rsp; |
3472 | + port_id_t id; |
3473 | }; |
3474 | |
3475 | /* |
3476 | @@ -480,6 +504,7 @@ typedef struct srb { |
3477 | const char *name; |
3478 | int iocbs; |
3479 | struct qla_qpair *qpair; |
3480 | + struct list_head elem; |
3481 | u32 gen1; /* scratch */ |
3482 | u32 gen2; /* scratch */ |
3483 | union { |
3484 | @@ -2144,28 +2169,6 @@ struct imm_ntfy_from_isp { |
3485 | #define REQUEST_ENTRY_SIZE (sizeof(request_t)) |
3486 | |
3487 | |
3488 | -/* |
3489 | - * 24 bit port ID type definition. |
3490 | - */ |
3491 | -typedef union { |
3492 | - uint32_t b24 : 24; |
3493 | - |
3494 | - struct { |
3495 | -#ifdef __BIG_ENDIAN |
3496 | - uint8_t domain; |
3497 | - uint8_t area; |
3498 | - uint8_t al_pa; |
3499 | -#elif defined(__LITTLE_ENDIAN) |
3500 | - uint8_t al_pa; |
3501 | - uint8_t area; |
3502 | - uint8_t domain; |
3503 | -#else |
3504 | -#error "__BIG_ENDIAN or __LITTLE_ENDIAN must be defined!" |
3505 | -#endif |
3506 | - uint8_t rsvd_1; |
3507 | - } b; |
3508 | -} port_id_t; |
3509 | -#define INVALID_PORT_ID 0xFFFFFF |
3510 | |
3511 | /* |
3512 | * Switch info gathering structure. |
3513 | @@ -4082,6 +4085,7 @@ typedef struct scsi_qla_host { |
3514 | #define LOOP_READY 5 |
3515 | #define LOOP_DEAD 6 |
3516 | |
3517 | + unsigned long relogin_jif; |
3518 | unsigned long dpc_flags; |
3519 | #define RESET_MARKER_NEEDED 0 /* Send marker to ISP. */ |
3520 | #define RESET_ACTIVE 1 |
3521 | @@ -4223,6 +4227,7 @@ typedef struct scsi_qla_host { |
3522 | wait_queue_head_t fcport_waitQ; |
3523 | wait_queue_head_t vref_waitq; |
3524 | uint8_t min_link_speed_feat; |
3525 | + struct list_head gpnid_list; |
3526 | } scsi_qla_host_t; |
3527 | |
3528 | struct qla27xx_image_status { |
3529 | diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c |
3530 | index bc3db6abc9a0..59ecc4eda6cd 100644 |
3531 | --- a/drivers/scsi/qla2xxx/qla_gs.c |
3532 | +++ b/drivers/scsi/qla2xxx/qla_gs.c |
3533 | @@ -175,6 +175,9 @@ qla2x00_chk_ms_status(scsi_qla_host_t *vha, ms_iocb_entry_t *ms_pkt, |
3534 | set_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags); |
3535 | } |
3536 | break; |
3537 | + case CS_TIMEOUT: |
3538 | + rval = QLA_FUNCTION_TIMEOUT; |
3539 | + /* drop through */ |
3540 | default: |
3541 | ql_dbg(ql_dbg_disc, vha, 0x2033, |
3542 | "%s failed, completion status (%x) on port_id: " |
3543 | @@ -2833,7 +2836,7 @@ void qla24xx_handle_gidpn_event(scsi_qla_host_t *vha, struct event_arg *ea) |
3544 | } |
3545 | } else { /* fcport->d_id.b24 != ea->id.b24 */ |
3546 | fcport->d_id.b24 = ea->id.b24; |
3547 | - if (fcport->deleted == QLA_SESS_DELETED) { |
3548 | + if (fcport->deleted != QLA_SESS_DELETED) { |
3549 | ql_dbg(ql_dbg_disc, vha, 0x2021, |
3550 | "%s %d %8phC post del sess\n", |
3551 | __func__, __LINE__, fcport->port_name); |
3552 | @@ -2889,9 +2892,22 @@ static void qla2x00_async_gidpn_sp_done(void *s, int res) |
3553 | ea.rc = res; |
3554 | ea.event = FCME_GIDPN_DONE; |
3555 | |
3556 | - ql_dbg(ql_dbg_disc, vha, 0x204f, |
3557 | - "Async done-%s res %x, WWPN %8phC ID %3phC \n", |
3558 | - sp->name, res, fcport->port_name, id); |
3559 | + if (res == QLA_FUNCTION_TIMEOUT) { |
3560 | + ql_dbg(ql_dbg_disc, sp->vha, 0xffff, |
3561 | + "Async done-%s WWPN %8phC timed out.\n", |
3562 | + sp->name, fcport->port_name); |
3563 | + qla24xx_post_gidpn_work(sp->vha, fcport); |
3564 | + sp->free(sp); |
3565 | + return; |
3566 | + } else if (res) { |
3567 | + ql_dbg(ql_dbg_disc, sp->vha, 0xffff, |
3568 | + "Async done-%s fail res %x, WWPN %8phC\n", |
3569 | + sp->name, res, fcport->port_name); |
3570 | + } else { |
3571 | + ql_dbg(ql_dbg_disc, vha, 0x204f, |
3572 | + "Async done-%s good WWPN %8phC ID %3phC\n", |
3573 | + sp->name, fcport->port_name, id); |
3574 | + } |
3575 | |
3576 | qla2x00_fcport_event_handler(vha, &ea); |
3577 | |
3578 | @@ -3205,11 +3221,18 @@ static void qla2x00_async_gpnid_sp_done(void *s, int res) |
3579 | (struct ct_sns_rsp *)sp->u.iocb_cmd.u.ctarg.rsp; |
3580 | struct event_arg ea; |
3581 | struct qla_work_evt *e; |
3582 | + unsigned long flags; |
3583 | |
3584 | - ql_dbg(ql_dbg_disc, vha, 0x2066, |
3585 | - "Async done-%s res %x ID %3phC. %8phC\n", |
3586 | - sp->name, res, ct_req->req.port_id.port_id, |
3587 | - ct_rsp->rsp.gpn_id.port_name); |
3588 | + if (res) |
3589 | + ql_dbg(ql_dbg_disc, vha, 0x2066, |
3590 | + "Async done-%s fail res %x rscn gen %d ID %3phC. %8phC\n", |
3591 | + sp->name, res, sp->gen1, ct_req->req.port_id.port_id, |
3592 | + ct_rsp->rsp.gpn_id.port_name); |
3593 | + else |
3594 | + ql_dbg(ql_dbg_disc, vha, 0x2066, |
3595 | + "Async done-%s good rscn gen %d ID %3phC. %8phC\n", |
3596 | + sp->name, sp->gen1, ct_req->req.port_id.port_id, |
3597 | + ct_rsp->rsp.gpn_id.port_name); |
3598 | |
3599 | memset(&ea, 0, sizeof(ea)); |
3600 | memcpy(ea.port_name, ct_rsp->rsp.gpn_id.port_name, WWN_SIZE); |
3601 | @@ -3220,6 +3243,22 @@ static void qla2x00_async_gpnid_sp_done(void *s, int res) |
3602 | ea.rc = res; |
3603 | ea.event = FCME_GPNID_DONE; |
3604 | |
3605 | + spin_lock_irqsave(&vha->hw->tgt.sess_lock, flags); |
3606 | + list_del(&sp->elem); |
3607 | + spin_unlock_irqrestore(&vha->hw->tgt.sess_lock, flags); |
3608 | + |
3609 | + if (res) { |
3610 | + if (res == QLA_FUNCTION_TIMEOUT) |
3611 | + qla24xx_post_gpnid_work(sp->vha, &ea.id); |
3612 | + sp->free(sp); |
3613 | + return; |
3614 | + } else if (sp->gen1) { |
3615 | + /* There was anoter RSNC for this Nport ID */ |
3616 | + qla24xx_post_gpnid_work(sp->vha, &ea.id); |
3617 | + sp->free(sp); |
3618 | + return; |
3619 | + } |
3620 | + |
3621 | qla2x00_fcport_event_handler(vha, &ea); |
3622 | |
3623 | e = qla2x00_alloc_work(vha, QLA_EVT_GPNID_DONE); |
3624 | @@ -3253,8 +3292,9 @@ int qla24xx_async_gpnid(scsi_qla_host_t *vha, port_id_t *id) |
3625 | { |
3626 | int rval = QLA_FUNCTION_FAILED; |
3627 | struct ct_sns_req *ct_req; |
3628 | - srb_t *sp; |
3629 | + srb_t *sp, *tsp; |
3630 | struct ct_sns_pkt *ct_sns; |
3631 | + unsigned long flags; |
3632 | |
3633 | if (!vha->flags.online) |
3634 | goto done; |
3635 | @@ -3265,8 +3305,22 @@ int qla24xx_async_gpnid(scsi_qla_host_t *vha, port_id_t *id) |
3636 | |
3637 | sp->type = SRB_CT_PTHRU_CMD; |
3638 | sp->name = "gpnid"; |
3639 | + sp->u.iocb_cmd.u.ctarg.id = *id; |
3640 | + sp->gen1 = 0; |
3641 | qla2x00_init_timer(sp, qla2x00_get_async_timeout(vha) + 2); |
3642 | |
3643 | + spin_lock_irqsave(&vha->hw->tgt.sess_lock, flags); |
3644 | + list_for_each_entry(tsp, &vha->gpnid_list, elem) { |
3645 | + if (tsp->u.iocb_cmd.u.ctarg.id.b24 == id->b24) { |
3646 | + tsp->gen1++; |
3647 | + spin_unlock_irqrestore(&vha->hw->tgt.sess_lock, flags); |
3648 | + sp->free(sp); |
3649 | + goto done; |
3650 | + } |
3651 | + } |
3652 | + list_add_tail(&sp->elem, &vha->gpnid_list); |
3653 | + spin_unlock_irqrestore(&vha->hw->tgt.sess_lock, flags); |
3654 | + |
3655 | sp->u.iocb_cmd.u.ctarg.req = dma_alloc_coherent(&vha->hw->pdev->dev, |
3656 | sizeof(struct ct_sns_pkt), &sp->u.iocb_cmd.u.ctarg.req_dma, |
3657 | GFP_KERNEL); |
3658 | diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c |
3659 | index b5b48ddca962..9603886737b5 100644 |
3660 | --- a/drivers/scsi/qla2xxx/qla_init.c |
3661 | +++ b/drivers/scsi/qla2xxx/qla_init.c |
3662 | @@ -864,6 +864,7 @@ void qla24xx_handle_gpdb_event(scsi_qla_host_t *vha, struct event_arg *ea) |
3663 | int rval = ea->rc; |
3664 | fc_port_t *fcport = ea->fcport; |
3665 | unsigned long flags; |
3666 | + u16 opt = ea->sp->u.iocb_cmd.u.mbx.out_mb[10]; |
3667 | |
3668 | fcport->flags &= ~FCF_ASYNC_SENT; |
3669 | |
3670 | @@ -894,7 +895,8 @@ void qla24xx_handle_gpdb_event(scsi_qla_host_t *vha, struct event_arg *ea) |
3671 | } |
3672 | |
3673 | spin_lock_irqsave(&vha->hw->tgt.sess_lock, flags); |
3674 | - ea->fcport->login_gen++; |
3675 | + if (opt != PDO_FORCE_ADISC) |
3676 | + ea->fcport->login_gen++; |
3677 | ea->fcport->deleted = 0; |
3678 | ea->fcport->logout_on_delete = 1; |
3679 | |
3680 | @@ -918,6 +920,13 @@ void qla24xx_handle_gpdb_event(scsi_qla_host_t *vha, struct event_arg *ea) |
3681 | |
3682 | qla24xx_post_gpsc_work(vha, fcport); |
3683 | } |
3684 | + } else if (ea->fcport->login_succ) { |
3685 | + /* |
3686 | + * We have an existing session. A late RSCN delivery |
3687 | + * must have triggered the session to be re-validate. |
3688 | + * session is still valid. |
3689 | + */ |
3690 | + fcport->disc_state = DSC_LOGIN_COMPLETE; |
3691 | } |
3692 | spin_unlock_irqrestore(&vha->hw->tgt.sess_lock, flags); |
3693 | } /* gpdb event */ |
3694 | @@ -964,7 +973,7 @@ int qla24xx_fcport_handle_login(struct scsi_qla_host *vha, fc_port_t *fcport) |
3695 | ql_dbg(ql_dbg_disc, vha, 0x20bd, |
3696 | "%s %d %8phC post gnl\n", |
3697 | __func__, __LINE__, fcport->port_name); |
3698 | - qla24xx_async_gnl(vha, fcport); |
3699 | + qla24xx_post_gnl_work(vha, fcport); |
3700 | } else { |
3701 | ql_dbg(ql_dbg_disc, vha, 0x20bf, |
3702 | "%s %d %8phC post login\n", |
3703 | @@ -1133,7 +1142,7 @@ void qla24xx_handle_relogin_event(scsi_qla_host_t *vha, |
3704 | ql_dbg(ql_dbg_disc, vha, 0x20e9, "%s %d %8phC post gidpn\n", |
3705 | __func__, __LINE__, fcport->port_name); |
3706 | |
3707 | - qla24xx_async_gidpn(vha, fcport); |
3708 | + qla24xx_post_gidpn_work(vha, fcport); |
3709 | return; |
3710 | } |
3711 | |
3712 | @@ -1348,6 +1357,7 @@ qla24xx_abort_sp_done(void *ptr, int res) |
3713 | srb_t *sp = ptr; |
3714 | struct srb_iocb *abt = &sp->u.iocb_cmd; |
3715 | |
3716 | + del_timer(&sp->u.iocb_cmd.timer); |
3717 | complete(&abt->u.abt.comp); |
3718 | } |
3719 | |
3720 | @@ -1445,6 +1455,8 @@ static void |
3721 | qla24xx_handle_plogi_done_event(struct scsi_qla_host *vha, struct event_arg *ea) |
3722 | { |
3723 | port_id_t cid; /* conflict Nport id */ |
3724 | + u16 lid; |
3725 | + struct fc_port *conflict_fcport; |
3726 | |
3727 | switch (ea->data[0]) { |
3728 | case MBS_COMMAND_COMPLETE: |
3729 | @@ -1460,8 +1472,12 @@ qla24xx_handle_plogi_done_event(struct scsi_qla_host *vha, struct event_arg *ea) |
3730 | qla24xx_post_prli_work(vha, ea->fcport); |
3731 | } else { |
3732 | ql_dbg(ql_dbg_disc, vha, 0x20ea, |
3733 | - "%s %d %8phC post gpdb\n", |
3734 | - __func__, __LINE__, ea->fcport->port_name); |
3735 | + "%s %d %8phC LoopID 0x%x in use with %06x. post gnl\n", |
3736 | + __func__, __LINE__, ea->fcport->port_name, |
3737 | + ea->fcport->loop_id, ea->fcport->d_id.b24); |
3738 | + |
3739 | + set_bit(ea->fcport->loop_id, vha->hw->loop_id_map); |
3740 | + ea->fcport->loop_id = FC_NO_LOOP_ID; |
3741 | ea->fcport->chip_reset = vha->hw->base_qpair->chip_reset; |
3742 | ea->fcport->logout_on_delete = 1; |
3743 | ea->fcport->send_els_logo = 0; |
3744 | @@ -1506,8 +1522,38 @@ qla24xx_handle_plogi_done_event(struct scsi_qla_host *vha, struct event_arg *ea) |
3745 | ea->fcport->d_id.b.domain, ea->fcport->d_id.b.area, |
3746 | ea->fcport->d_id.b.al_pa); |
3747 | |
3748 | - qla2x00_clear_loop_id(ea->fcport); |
3749 | - qla24xx_post_gidpn_work(vha, ea->fcport); |
3750 | + lid = ea->iop[1] & 0xffff; |
3751 | + qlt_find_sess_invalidate_other(vha, |
3752 | + wwn_to_u64(ea->fcport->port_name), |
3753 | + ea->fcport->d_id, lid, &conflict_fcport); |
3754 | + |
3755 | + if (conflict_fcport) { |
3756 | + /* |
3757 | + * Another fcport share the same loop_id/nport id. |
3758 | + * Conflict fcport needs to finish cleanup before this |
3759 | + * fcport can proceed to login. |
3760 | + */ |
3761 | + conflict_fcport->conflict = ea->fcport; |
3762 | + ea->fcport->login_pause = 1; |
3763 | + |
3764 | + ql_dbg(ql_dbg_disc, vha, 0x20ed, |
3765 | + "%s %d %8phC NPortId %06x inuse with loopid 0x%x. post gidpn\n", |
3766 | + __func__, __LINE__, ea->fcport->port_name, |
3767 | + ea->fcport->d_id.b24, lid); |
3768 | + qla2x00_clear_loop_id(ea->fcport); |
3769 | + qla24xx_post_gidpn_work(vha, ea->fcport); |
3770 | + } else { |
3771 | + ql_dbg(ql_dbg_disc, vha, 0x20ed, |
3772 | + "%s %d %8phC NPortId %06x inuse with loopid 0x%x. sched delete\n", |
3773 | + __func__, __LINE__, ea->fcport->port_name, |
3774 | + ea->fcport->d_id.b24, lid); |
3775 | + |
3776 | + qla2x00_clear_loop_id(ea->fcport); |
3777 | + set_bit(lid, vha->hw->loop_id_map); |
3778 | + ea->fcport->loop_id = lid; |
3779 | + ea->fcport->keep_nport_handle = 0; |
3780 | + qlt_schedule_sess_for_deletion(ea->fcport, false); |
3781 | + } |
3782 | break; |
3783 | } |
3784 | return; |
3785 | @@ -8047,9 +8093,6 @@ int qla2xxx_delete_qpair(struct scsi_qla_host *vha, struct qla_qpair *qpair) |
3786 | int ret = QLA_FUNCTION_FAILED; |
3787 | struct qla_hw_data *ha = qpair->hw; |
3788 | |
3789 | - if (!vha->flags.qpairs_req_created && !vha->flags.qpairs_rsp_created) |
3790 | - goto fail; |
3791 | - |
3792 | qpair->delete_in_progress = 1; |
3793 | while (atomic_read(&qpair->ref_count)) |
3794 | msleep(500); |
3795 | @@ -8057,6 +8100,7 @@ int qla2xxx_delete_qpair(struct scsi_qla_host *vha, struct qla_qpair *qpair) |
3796 | ret = qla25xx_delete_req_que(vha, qpair->req); |
3797 | if (ret != QLA_SUCCESS) |
3798 | goto fail; |
3799 | + |
3800 | ret = qla25xx_delete_rsp_que(vha, qpair->rsp); |
3801 | if (ret != QLA_SUCCESS) |
3802 | goto fail; |
3803 | diff --git a/drivers/scsi/qla2xxx/qla_iocb.c b/drivers/scsi/qla2xxx/qla_iocb.c |
3804 | index 2f94159186d7..63bea6a65d51 100644 |
3805 | --- a/drivers/scsi/qla2xxx/qla_iocb.c |
3806 | +++ b/drivers/scsi/qla2xxx/qla_iocb.c |
3807 | @@ -2392,26 +2392,13 @@ qla2x00_els_dcmd_iocb_timeout(void *data) |
3808 | srb_t *sp = data; |
3809 | fc_port_t *fcport = sp->fcport; |
3810 | struct scsi_qla_host *vha = sp->vha; |
3811 | - struct qla_hw_data *ha = vha->hw; |
3812 | struct srb_iocb *lio = &sp->u.iocb_cmd; |
3813 | - unsigned long flags = 0; |
3814 | |
3815 | ql_dbg(ql_dbg_io, vha, 0x3069, |
3816 | "%s Timeout, hdl=%x, portid=%02x%02x%02x\n", |
3817 | sp->name, sp->handle, fcport->d_id.b.domain, fcport->d_id.b.area, |
3818 | fcport->d_id.b.al_pa); |
3819 | |
3820 | - /* Abort the exchange */ |
3821 | - spin_lock_irqsave(&ha->hardware_lock, flags); |
3822 | - if (ha->isp_ops->abort_command(sp)) { |
3823 | - ql_dbg(ql_dbg_io, vha, 0x3070, |
3824 | - "mbx abort_command failed.\n"); |
3825 | - } else { |
3826 | - ql_dbg(ql_dbg_io, vha, 0x3071, |
3827 | - "mbx abort_command success.\n"); |
3828 | - } |
3829 | - spin_unlock_irqrestore(&ha->hardware_lock, flags); |
3830 | - |
3831 | complete(&lio->u.els_logo.comp); |
3832 | } |
3833 | |
3834 | diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c |
3835 | index 9d9668aac6f6..d95b879c2bca 100644 |
3836 | --- a/drivers/scsi/qla2xxx/qla_isr.c |
3837 | +++ b/drivers/scsi/qla2xxx/qla_isr.c |
3838 | @@ -1569,7 +1569,7 @@ qla24xx_els_ct_entry(scsi_qla_host_t *vha, struct req_que *req, |
3839 | /* borrowing sts_entry_24xx.comp_status. |
3840 | same location as ct_entry_24xx.comp_status |
3841 | */ |
3842 | - res = qla2x00_chk_ms_status(vha, (ms_iocb_entry_t *)pkt, |
3843 | + res = qla2x00_chk_ms_status(sp->vha, (ms_iocb_entry_t *)pkt, |
3844 | (struct ct_sns_rsp *)sp->u.iocb_cmd.u.ctarg.rsp, |
3845 | sp->name); |
3846 | sp->done(sp, res); |
3847 | @@ -2341,7 +2341,6 @@ qla2x00_status_entry(scsi_qla_host_t *vha, struct rsp_que *rsp, void *pkt) |
3848 | int res = 0; |
3849 | uint16_t state_flags = 0; |
3850 | uint16_t retry_delay = 0; |
3851 | - uint8_t no_logout = 0; |
3852 | |
3853 | sts = (sts_entry_t *) pkt; |
3854 | sts24 = (struct sts_entry_24xx *) pkt; |
3855 | @@ -2612,7 +2611,6 @@ qla2x00_status_entry(scsi_qla_host_t *vha, struct rsp_que *rsp, void *pkt) |
3856 | break; |
3857 | |
3858 | case CS_PORT_LOGGED_OUT: |
3859 | - no_logout = 1; |
3860 | case CS_PORT_CONFIG_CHG: |
3861 | case CS_PORT_BUSY: |
3862 | case CS_INCOMPLETE: |
3863 | @@ -2643,9 +2641,6 @@ qla2x00_status_entry(scsi_qla_host_t *vha, struct rsp_que *rsp, void *pkt) |
3864 | port_state_str[atomic_read(&fcport->state)], |
3865 | comp_status); |
3866 | |
3867 | - if (no_logout) |
3868 | - fcport->logout_on_delete = 0; |
3869 | - |
3870 | qla2x00_mark_device_lost(fcport->vha, fcport, 1, 1); |
3871 | qlt_schedule_sess_for_deletion_lock(fcport); |
3872 | } |
3873 | diff --git a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c |
3874 | index 99502fa90810..2d909e12e23a 100644 |
3875 | --- a/drivers/scsi/qla2xxx/qla_mbx.c |
3876 | +++ b/drivers/scsi/qla2xxx/qla_mbx.c |
3877 | @@ -6078,8 +6078,7 @@ int __qla24xx_parse_gpdb(struct scsi_qla_host *vha, fc_port_t *fcport, |
3878 | } |
3879 | |
3880 | /* Check for logged in state. */ |
3881 | - if (current_login_state != PDS_PRLI_COMPLETE && |
3882 | - last_login_state != PDS_PRLI_COMPLETE) { |
3883 | + if (current_login_state != PDS_PRLI_COMPLETE) { |
3884 | ql_dbg(ql_dbg_mbx, vha, 0x119a, |
3885 | "Unable to verify login-state (%x/%x) for loop_id %x.\n", |
3886 | current_login_state, last_login_state, fcport->loop_id); |
3887 | diff --git a/drivers/scsi/qla2xxx/qla_mid.c b/drivers/scsi/qla2xxx/qla_mid.c |
3888 | index c0f8f6c17b79..78df7cfca568 100644 |
3889 | --- a/drivers/scsi/qla2xxx/qla_mid.c |
3890 | +++ b/drivers/scsi/qla2xxx/qla_mid.c |
3891 | @@ -343,15 +343,21 @@ qla2x00_do_dpc_vp(scsi_qla_host_t *vha) |
3892 | "FCPort update end.\n"); |
3893 | } |
3894 | |
3895 | - if ((test_and_clear_bit(RELOGIN_NEEDED, &vha->dpc_flags)) && |
3896 | - !test_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags) && |
3897 | - atomic_read(&vha->loop_state) != LOOP_DOWN) { |
3898 | - |
3899 | - ql_dbg(ql_dbg_dpc, vha, 0x4018, |
3900 | - "Relogin needed scheduled.\n"); |
3901 | - qla2x00_relogin(vha); |
3902 | - ql_dbg(ql_dbg_dpc, vha, 0x4019, |
3903 | - "Relogin needed end.\n"); |
3904 | + if (test_bit(RELOGIN_NEEDED, &vha->dpc_flags) && |
3905 | + !test_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags) && |
3906 | + atomic_read(&vha->loop_state) != LOOP_DOWN) { |
3907 | + |
3908 | + if (!vha->relogin_jif || |
3909 | + time_after_eq(jiffies, vha->relogin_jif)) { |
3910 | + vha->relogin_jif = jiffies + HZ; |
3911 | + clear_bit(RELOGIN_NEEDED, &vha->dpc_flags); |
3912 | + |
3913 | + ql_dbg(ql_dbg_dpc, vha, 0x4018, |
3914 | + "Relogin needed scheduled.\n"); |
3915 | + qla2x00_relogin(vha); |
3916 | + ql_dbg(ql_dbg_dpc, vha, 0x4019, |
3917 | + "Relogin needed end.\n"); |
3918 | + } |
3919 | } |
3920 | |
3921 | if (test_and_clear_bit(RESET_MARKER_NEEDED, &vha->dpc_flags) && |
3922 | @@ -569,14 +575,15 @@ qla25xx_free_rsp_que(struct scsi_qla_host *vha, struct rsp_que *rsp) |
3923 | int |
3924 | qla25xx_delete_req_que(struct scsi_qla_host *vha, struct req_que *req) |
3925 | { |
3926 | - int ret = -1; |
3927 | + int ret = QLA_SUCCESS; |
3928 | |
3929 | - if (req) { |
3930 | + if (req && vha->flags.qpairs_req_created) { |
3931 | req->options |= BIT_0; |
3932 | ret = qla25xx_init_req_que(vha, req); |
3933 | + if (ret != QLA_SUCCESS) |
3934 | + return QLA_FUNCTION_FAILED; |
3935 | } |
3936 | - if (ret == QLA_SUCCESS) |
3937 | - qla25xx_free_req_que(vha, req); |
3938 | + qla25xx_free_req_que(vha, req); |
3939 | |
3940 | return ret; |
3941 | } |
3942 | @@ -584,14 +591,15 @@ qla25xx_delete_req_que(struct scsi_qla_host *vha, struct req_que *req) |
3943 | int |
3944 | qla25xx_delete_rsp_que(struct scsi_qla_host *vha, struct rsp_que *rsp) |
3945 | { |
3946 | - int ret = -1; |
3947 | + int ret = QLA_SUCCESS; |
3948 | |
3949 | - if (rsp) { |
3950 | + if (rsp && vha->flags.qpairs_rsp_created) { |
3951 | rsp->options |= BIT_0; |
3952 | ret = qla25xx_init_rsp_que(vha, rsp); |
3953 | + if (ret != QLA_SUCCESS) |
3954 | + return QLA_FUNCTION_FAILED; |
3955 | } |
3956 | - if (ret == QLA_SUCCESS) |
3957 | - qla25xx_free_rsp_que(vha, rsp); |
3958 | + qla25xx_free_rsp_que(vha, rsp); |
3959 | |
3960 | return ret; |
3961 | } |
3962 | diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c |
3963 | index 6eaaa326e508..cfe7654f6bd3 100644 |
3964 | --- a/drivers/scsi/qla2xxx/qla_os.c |
3965 | +++ b/drivers/scsi/qla2xxx/qla_os.c |
3966 | @@ -3003,9 +3003,6 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) |
3967 | base_vha = qla2x00_create_host(sht, ha); |
3968 | if (!base_vha) { |
3969 | ret = -ENOMEM; |
3970 | - qla2x00_mem_free(ha); |
3971 | - qla2x00_free_req_que(ha, req); |
3972 | - qla2x00_free_rsp_que(ha, rsp); |
3973 | goto probe_hw_failed; |
3974 | } |
3975 | |
3976 | @@ -3066,7 +3063,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) |
3977 | /* Set up the irqs */ |
3978 | ret = qla2x00_request_irqs(ha, rsp); |
3979 | if (ret) |
3980 | - goto probe_init_failed; |
3981 | + goto probe_hw_failed; |
3982 | |
3983 | /* Alloc arrays of request and response ring ptrs */ |
3984 | if (!qla2x00_alloc_queues(ha, req, rsp)) { |
3985 | @@ -3177,10 +3174,11 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) |
3986 | host->can_queue, base_vha->req, |
3987 | base_vha->mgmt_svr_loop_id, host->sg_tablesize); |
3988 | |
3989 | + ha->wq = alloc_workqueue("qla2xxx_wq", WQ_MEM_RECLAIM, 0); |
3990 | + |
3991 | if (ha->mqenable) { |
3992 | bool mq = false; |
3993 | bool startit = false; |
3994 | - ha->wq = alloc_workqueue("qla2xxx_wq", WQ_MEM_RECLAIM, 0); |
3995 | |
3996 | if (QLA_TGT_MODE_ENABLED()) { |
3997 | mq = true; |
3998 | @@ -3374,6 +3372,9 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) |
3999 | scsi_host_put(base_vha->host); |
4000 | |
4001 | probe_hw_failed: |
4002 | + qla2x00_mem_free(ha); |
4003 | + qla2x00_free_req_que(ha, req); |
4004 | + qla2x00_free_rsp_que(ha, rsp); |
4005 | qla2x00_clear_drv_active(ha); |
4006 | |
4007 | iospace_config_failed: |
4008 | @@ -4498,6 +4499,7 @@ struct scsi_qla_host *qla2x00_create_host(struct scsi_host_template *sht, |
4009 | INIT_LIST_HEAD(&vha->qp_list); |
4010 | INIT_LIST_HEAD(&vha->gnl.fcports); |
4011 | INIT_LIST_HEAD(&vha->nvme_rport_list); |
4012 | + INIT_LIST_HEAD(&vha->gpnid_list); |
4013 | |
4014 | spin_lock_init(&vha->work_lock); |
4015 | spin_lock_init(&vha->cmd_list_lock); |
4016 | @@ -4732,11 +4734,11 @@ void qla24xx_create_new_sess(struct scsi_qla_host *vha, struct qla_work_evt *e) |
4017 | } else { |
4018 | list_add_tail(&fcport->list, &vha->vp_fcports); |
4019 | |
4020 | - if (pla) { |
4021 | - qlt_plogi_ack_link(vha, pla, fcport, |
4022 | - QLT_PLOGI_LINK_SAME_WWN); |
4023 | - pla->ref_count--; |
4024 | - } |
4025 | + } |
4026 | + if (pla) { |
4027 | + qlt_plogi_ack_link(vha, pla, fcport, |
4028 | + QLT_PLOGI_LINK_SAME_WWN); |
4029 | + pla->ref_count--; |
4030 | } |
4031 | } |
4032 | spin_unlock_irqrestore(&vha->hw->tgt.sess_lock, flags); |
4033 | @@ -4858,7 +4860,7 @@ void qla2x00_relogin(struct scsi_qla_host *vha) |
4034 | */ |
4035 | if (atomic_read(&fcport->state) != FCS_ONLINE && |
4036 | fcport->login_retry && !(fcport->flags & FCF_ASYNC_SENT)) { |
4037 | - fcport->login_retry--; |
4038 | + |
4039 | if (fcport->flags & FCF_FABRIC_DEVICE) { |
4040 | ql_dbg(ql_dbg_disc, fcport->vha, 0x2108, |
4041 | "%s %8phC DS %d LS %d\n", __func__, |
4042 | @@ -4869,6 +4871,7 @@ void qla2x00_relogin(struct scsi_qla_host *vha) |
4043 | ea.fcport = fcport; |
4044 | qla2x00_fcport_event_handler(vha, &ea); |
4045 | } else { |
4046 | + fcport->login_retry--; |
4047 | status = qla2x00_local_device_login(vha, |
4048 | fcport); |
4049 | if (status == QLA_SUCCESS) { |
4050 | @@ -5851,16 +5854,21 @@ qla2x00_do_dpc(void *data) |
4051 | } |
4052 | |
4053 | /* Retry each device up to login retry count */ |
4054 | - if ((test_and_clear_bit(RELOGIN_NEEDED, |
4055 | - &base_vha->dpc_flags)) && |
4056 | + if (test_bit(RELOGIN_NEEDED, &base_vha->dpc_flags) && |
4057 | !test_bit(LOOP_RESYNC_NEEDED, &base_vha->dpc_flags) && |
4058 | atomic_read(&base_vha->loop_state) != LOOP_DOWN) { |
4059 | |
4060 | - ql_dbg(ql_dbg_dpc, base_vha, 0x400d, |
4061 | - "Relogin scheduled.\n"); |
4062 | - qla2x00_relogin(base_vha); |
4063 | - ql_dbg(ql_dbg_dpc, base_vha, 0x400e, |
4064 | - "Relogin end.\n"); |
4065 | + if (!base_vha->relogin_jif || |
4066 | + time_after_eq(jiffies, base_vha->relogin_jif)) { |
4067 | + base_vha->relogin_jif = jiffies + HZ; |
4068 | + clear_bit(RELOGIN_NEEDED, &base_vha->dpc_flags); |
4069 | + |
4070 | + ql_dbg(ql_dbg_dpc, base_vha, 0x400d, |
4071 | + "Relogin scheduled.\n"); |
4072 | + qla2x00_relogin(base_vha); |
4073 | + ql_dbg(ql_dbg_dpc, base_vha, 0x400e, |
4074 | + "Relogin end.\n"); |
4075 | + } |
4076 | } |
4077 | loop_resync_check: |
4078 | if (test_and_clear_bit(LOOP_RESYNC_NEEDED, |
4079 | @@ -6591,9 +6599,14 @@ qla83xx_disable_laser(scsi_qla_host_t *vha) |
4080 | |
4081 | static int qla2xxx_map_queues(struct Scsi_Host *shost) |
4082 | { |
4083 | + int rc; |
4084 | scsi_qla_host_t *vha = (scsi_qla_host_t *)shost->hostdata; |
4085 | |
4086 | - return blk_mq_pci_map_queues(&shost->tag_set, vha->hw->pdev); |
4087 | + if (USER_CTRL_IRQ(vha->hw)) |
4088 | + rc = blk_mq_map_queues(&shost->tag_set); |
4089 | + else |
4090 | + rc = blk_mq_pci_map_queues(&shost->tag_set, vha->hw->pdev); |
4091 | + return rc; |
4092 | } |
4093 | |
4094 | static const struct pci_error_handlers qla2xxx_err_handler = { |
4095 | diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c |
4096 | index f05cfc83c9c8..040a76011ffa 100644 |
4097 | --- a/drivers/scsi/qla2xxx/qla_target.c |
4098 | +++ b/drivers/scsi/qla2xxx/qla_target.c |
4099 | @@ -665,7 +665,7 @@ int qla24xx_async_notify_ack(scsi_qla_host_t *vha, fc_port_t *fcport, |
4100 | qla2x00_init_timer(sp, qla2x00_get_async_timeout(vha)+2); |
4101 | |
4102 | sp->u.iocb_cmd.u.nack.ntfy = ntfy; |
4103 | - |
4104 | + sp->u.iocb_cmd.timeout = qla2x00_async_iocb_timeout; |
4105 | sp->done = qla2x00_async_nack_sp_done; |
4106 | |
4107 | rval = qla2x00_start_sp(sp); |
4108 | @@ -974,7 +974,7 @@ static void qlt_free_session_done(struct work_struct *work) |
4109 | qlt_send_first_logo(vha, &logo); |
4110 | } |
4111 | |
4112 | - if (sess->logout_on_delete) { |
4113 | + if (sess->logout_on_delete && sess->loop_id != FC_NO_LOOP_ID) { |
4114 | int rc; |
4115 | |
4116 | rc = qla2x00_post_async_logout_work(vha, sess, NULL); |
4117 | @@ -1033,8 +1033,7 @@ static void qlt_free_session_done(struct work_struct *work) |
4118 | sess->login_succ = 0; |
4119 | } |
4120 | |
4121 | - if (sess->chip_reset != ha->base_qpair->chip_reset) |
4122 | - qla2x00_clear_loop_id(sess); |
4123 | + qla2x00_clear_loop_id(sess); |
4124 | |
4125 | if (sess->conflict) { |
4126 | sess->conflict->login_pause = 0; |
4127 | @@ -1205,7 +1204,8 @@ void qlt_schedule_sess_for_deletion(struct fc_port *sess, |
4128 | ql_dbg(ql_dbg_tgt, sess->vha, 0xe001, |
4129 | "Scheduling sess %p for deletion\n", sess); |
4130 | |
4131 | - schedule_work(&sess->del_work); |
4132 | + INIT_WORK(&sess->del_work, qla24xx_delete_sess_fn); |
4133 | + queue_work(sess->vha->hw->wq, &sess->del_work); |
4134 | } |
4135 | |
4136 | void qlt_schedule_sess_for_deletion_lock(struct fc_port *sess) |
4137 | @@ -1560,8 +1560,11 @@ static void qlt_release(struct qla_tgt *tgt) |
4138 | |
4139 | btree_destroy64(&tgt->lun_qpair_map); |
4140 | |
4141 | - if (ha->tgt.tgt_ops && ha->tgt.tgt_ops->remove_target) |
4142 | - ha->tgt.tgt_ops->remove_target(vha); |
4143 | + if (vha->vp_idx) |
4144 | + if (ha->tgt.tgt_ops && |
4145 | + ha->tgt.tgt_ops->remove_target && |
4146 | + vha->vha_tgt.target_lport_ptr) |
4147 | + ha->tgt.tgt_ops->remove_target(vha); |
4148 | |
4149 | vha->vha_tgt.qla_tgt = NULL; |
4150 | |
4151 | @@ -3708,7 +3711,7 @@ static int qlt_term_ctio_exchange(struct qla_qpair *qpair, void *ctio, |
4152 | term = 1; |
4153 | |
4154 | if (term) |
4155 | - qlt_term_ctio_exchange(qpair, ctio, cmd, status); |
4156 | + qlt_send_term_exchange(qpair, cmd, &cmd->atio, 1, 0); |
4157 | |
4158 | return term; |
4159 | } |
4160 | @@ -4584,9 +4587,9 @@ qlt_find_sess_invalidate_other(scsi_qla_host_t *vha, uint64_t wwn, |
4161 | "Invalidating sess %p loop_id %d wwn %llx.\n", |
4162 | other_sess, other_sess->loop_id, other_wwn); |
4163 | |
4164 | - |
4165 | other_sess->keep_nport_handle = 1; |
4166 | - *conflict_sess = other_sess; |
4167 | + if (other_sess->disc_state != DSC_DELETED) |
4168 | + *conflict_sess = other_sess; |
4169 | qlt_schedule_sess_for_deletion(other_sess, |
4170 | true); |
4171 | } |
4172 | @@ -5755,7 +5758,7 @@ static fc_port_t *qlt_get_port_database(struct scsi_qla_host *vha, |
4173 | unsigned long flags; |
4174 | u8 newfcport = 0; |
4175 | |
4176 | - fcport = kzalloc(sizeof(*fcport), GFP_KERNEL); |
4177 | + fcport = qla2x00_alloc_fcport(vha, GFP_KERNEL); |
4178 | if (!fcport) { |
4179 | ql_dbg(ql_dbg_tgt_mgt, vha, 0xf06f, |
4180 | "qla_target(%d): Allocation of tmp FC port failed", |
4181 | @@ -5784,6 +5787,7 @@ static fc_port_t *qlt_get_port_database(struct scsi_qla_host *vha, |
4182 | tfcp->port_type = fcport->port_type; |
4183 | tfcp->supported_classes = fcport->supported_classes; |
4184 | tfcp->flags |= fcport->flags; |
4185 | + tfcp->scan_state = QLA_FCPORT_FOUND; |
4186 | |
4187 | del = fcport; |
4188 | fcport = tfcp; |
4189 | diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c |
4190 | index fa504ba83ade..cf70f0bb8375 100644 |
4191 | --- a/drivers/scsi/scsi_error.c |
4192 | +++ b/drivers/scsi/scsi_error.c |
4193 | @@ -222,7 +222,8 @@ static void scsi_eh_reset(struct scsi_cmnd *scmd) |
4194 | |
4195 | static void scsi_eh_inc_host_failed(struct rcu_head *head) |
4196 | { |
4197 | - struct Scsi_Host *shost = container_of(head, typeof(*shost), rcu); |
4198 | + struct scsi_cmnd *scmd = container_of(head, typeof(*scmd), rcu); |
4199 | + struct Scsi_Host *shost = scmd->device->host; |
4200 | unsigned long flags; |
4201 | |
4202 | spin_lock_irqsave(shost->host_lock, flags); |
4203 | @@ -258,7 +259,7 @@ void scsi_eh_scmd_add(struct scsi_cmnd *scmd) |
4204 | * Ensure that all tasks observe the host state change before the |
4205 | * host_failed change. |
4206 | */ |
4207 | - call_rcu(&shost->rcu, scsi_eh_inc_host_failed); |
4208 | + call_rcu(&scmd->rcu, scsi_eh_inc_host_failed); |
4209 | } |
4210 | |
4211 | /** |
4212 | diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c |
4213 | index 0d3696e9dddd..359386730523 100644 |
4214 | --- a/drivers/scsi/scsi_lib.c |
4215 | +++ b/drivers/scsi/scsi_lib.c |
4216 | @@ -670,6 +670,7 @@ static bool scsi_end_request(struct request *req, blk_status_t error, |
4217 | if (!blk_rq_is_scsi(req)) { |
4218 | WARN_ON_ONCE(!(cmd->flags & SCMD_INITIALIZED)); |
4219 | cmd->flags &= ~SCMD_INITIALIZED; |
4220 | + destroy_rcu_head(&cmd->rcu); |
4221 | } |
4222 | |
4223 | if (req->mq_ctx) { |
4224 | @@ -1150,6 +1151,7 @@ void scsi_initialize_rq(struct request *rq) |
4225 | struct scsi_cmnd *cmd = blk_mq_rq_to_pdu(rq); |
4226 | |
4227 | scsi_req_init(&cmd->req); |
4228 | + init_rcu_head(&cmd->rcu); |
4229 | cmd->jiffies_at_alloc = jiffies; |
4230 | cmd->retries = 0; |
4231 | } |
4232 | diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c |
4233 | index eb30f3e09a47..71458f493cf8 100644 |
4234 | --- a/drivers/virtio/virtio_ring.c |
4235 | +++ b/drivers/virtio/virtio_ring.c |
4236 | @@ -428,8 +428,6 @@ static inline int virtqueue_add(struct virtqueue *_vq, |
4237 | i = virtio16_to_cpu(_vq->vdev, vq->vring.desc[i].next); |
4238 | } |
4239 | |
4240 | - vq->vq.num_free += total_sg; |
4241 | - |
4242 | if (indirect) |
4243 | kfree(desc); |
4244 | |
4245 | diff --git a/drivers/watchdog/hpwdt.c b/drivers/watchdog/hpwdt.c |
4246 | index 67fbe35ce7cf..b0a158073abd 100644 |
4247 | --- a/drivers/watchdog/hpwdt.c |
4248 | +++ b/drivers/watchdog/hpwdt.c |
4249 | @@ -28,16 +28,7 @@ |
4250 | #include <linux/types.h> |
4251 | #include <linux/uaccess.h> |
4252 | #include <linux/watchdog.h> |
4253 | -#ifdef CONFIG_HPWDT_NMI_DECODING |
4254 | -#include <linux/dmi.h> |
4255 | -#include <linux/spinlock.h> |
4256 | -#include <linux/nmi.h> |
4257 | -#include <linux/kdebug.h> |
4258 | -#include <linux/notifier.h> |
4259 | -#include <asm/set_memory.h> |
4260 | -#endif /* CONFIG_HPWDT_NMI_DECODING */ |
4261 | #include <asm/nmi.h> |
4262 | -#include <asm/frame.h> |
4263 | |
4264 | #define HPWDT_VERSION "1.4.0" |
4265 | #define SECS_TO_TICKS(secs) ((secs) * 1000 / 128) |
4266 | @@ -48,10 +39,14 @@ |
4267 | static unsigned int soft_margin = DEFAULT_MARGIN; /* in seconds */ |
4268 | static unsigned int reload; /* the computed soft_margin */ |
4269 | static bool nowayout = WATCHDOG_NOWAYOUT; |
4270 | +#ifdef CONFIG_HPWDT_NMI_DECODING |
4271 | +static unsigned int allow_kdump = 1; |
4272 | +#endif |
4273 | static char expect_release; |
4274 | static unsigned long hpwdt_is_open; |
4275 | |
4276 | static void __iomem *pci_mem_addr; /* the PCI-memory address */ |
4277 | +static unsigned long __iomem *hpwdt_nmistat; |
4278 | static unsigned long __iomem *hpwdt_timer_reg; |
4279 | static unsigned long __iomem *hpwdt_timer_con; |
4280 | |
4281 | @@ -62,373 +57,6 @@ static const struct pci_device_id hpwdt_devices[] = { |
4282 | }; |
4283 | MODULE_DEVICE_TABLE(pci, hpwdt_devices); |
4284 | |
4285 | -#ifdef CONFIG_HPWDT_NMI_DECODING |
4286 | -#define PCI_BIOS32_SD_VALUE 0x5F32335F /* "_32_" */ |
4287 | -#define CRU_BIOS_SIGNATURE_VALUE 0x55524324 |
4288 | -#define PCI_BIOS32_PARAGRAPH_LEN 16 |
4289 | -#define PCI_ROM_BASE1 0x000F0000 |
4290 | -#define ROM_SIZE 0x10000 |
4291 | - |
4292 | -struct bios32_service_dir { |
4293 | - u32 signature; |
4294 | - u32 entry_point; |
4295 | - u8 revision; |
4296 | - u8 length; |
4297 | - u8 checksum; |
4298 | - u8 reserved[5]; |
4299 | -}; |
4300 | - |
4301 | -/* type 212 */ |
4302 | -struct smbios_cru64_info { |
4303 | - u8 type; |
4304 | - u8 byte_length; |
4305 | - u16 handle; |
4306 | - u32 signature; |
4307 | - u64 physical_address; |
4308 | - u32 double_length; |
4309 | - u32 double_offset; |
4310 | -}; |
4311 | -#define SMBIOS_CRU64_INFORMATION 212 |
4312 | - |
4313 | -/* type 219 */ |
4314 | -struct smbios_proliant_info { |
4315 | - u8 type; |
4316 | - u8 byte_length; |
4317 | - u16 handle; |
4318 | - u32 power_features; |
4319 | - u32 omega_features; |
4320 | - u32 reserved; |
4321 | - u32 misc_features; |
4322 | -}; |
4323 | -#define SMBIOS_ICRU_INFORMATION 219 |
4324 | - |
4325 | - |
4326 | -struct cmn_registers { |
4327 | - union { |
4328 | - struct { |
4329 | - u8 ral; |
4330 | - u8 rah; |
4331 | - u16 rea2; |
4332 | - }; |
4333 | - u32 reax; |
4334 | - } u1; |
4335 | - union { |
4336 | - struct { |
4337 | - u8 rbl; |
4338 | - u8 rbh; |
4339 | - u8 reb2l; |
4340 | - u8 reb2h; |
4341 | - }; |
4342 | - u32 rebx; |
4343 | - } u2; |
4344 | - union { |
4345 | - struct { |
4346 | - u8 rcl; |
4347 | - u8 rch; |
4348 | - u16 rec2; |
4349 | - }; |
4350 | - u32 recx; |
4351 | - } u3; |
4352 | - union { |
4353 | - struct { |
4354 | - u8 rdl; |
4355 | - u8 rdh; |
4356 | - u16 red2; |
4357 | - }; |
4358 | - u32 redx; |
4359 | - } u4; |
4360 | - |
4361 | - u32 resi; |
4362 | - u32 redi; |
4363 | - u16 rds; |
4364 | - u16 res; |
4365 | - u32 reflags; |
4366 | -} __attribute__((packed)); |
4367 | - |
4368 | -static unsigned int hpwdt_nmi_decoding; |
4369 | -static unsigned int allow_kdump = 1; |
4370 | -static unsigned int is_icru; |
4371 | -static unsigned int is_uefi; |
4372 | -static DEFINE_SPINLOCK(rom_lock); |
4373 | -static void *cru_rom_addr; |
4374 | -static struct cmn_registers cmn_regs; |
4375 | - |
4376 | -extern asmlinkage void asminline_call(struct cmn_registers *pi86Regs, |
4377 | - unsigned long *pRomEntry); |
4378 | - |
4379 | -#ifdef CONFIG_X86_32 |
4380 | -/* --32 Bit Bios------------------------------------------------------------ */ |
4381 | - |
4382 | -#define HPWDT_ARCH 32 |
4383 | - |
4384 | -asm(".text \n\t" |
4385 | - ".align 4 \n\t" |
4386 | - ".globl asminline_call \n" |
4387 | - "asminline_call: \n\t" |
4388 | - "pushl %ebp \n\t" |
4389 | - "movl %esp, %ebp \n\t" |
4390 | - "pusha \n\t" |
4391 | - "pushf \n\t" |
4392 | - "push %es \n\t" |
4393 | - "push %ds \n\t" |
4394 | - "pop %es \n\t" |
4395 | - "movl 8(%ebp),%eax \n\t" |
4396 | - "movl 4(%eax),%ebx \n\t" |
4397 | - "movl 8(%eax),%ecx \n\t" |
4398 | - "movl 12(%eax),%edx \n\t" |
4399 | - "movl 16(%eax),%esi \n\t" |
4400 | - "movl 20(%eax),%edi \n\t" |
4401 | - "movl (%eax),%eax \n\t" |
4402 | - "push %cs \n\t" |
4403 | - "call *12(%ebp) \n\t" |
4404 | - "pushf \n\t" |
4405 | - "pushl %eax \n\t" |
4406 | - "movl 8(%ebp),%eax \n\t" |
4407 | - "movl %ebx,4(%eax) \n\t" |
4408 | - "movl %ecx,8(%eax) \n\t" |
4409 | - "movl %edx,12(%eax) \n\t" |
4410 | - "movl %esi,16(%eax) \n\t" |
4411 | - "movl %edi,20(%eax) \n\t" |
4412 | - "movw %ds,24(%eax) \n\t" |
4413 | - "movw %es,26(%eax) \n\t" |
4414 | - "popl %ebx \n\t" |
4415 | - "movl %ebx,(%eax) \n\t" |
4416 | - "popl %ebx \n\t" |
4417 | - "movl %ebx,28(%eax) \n\t" |
4418 | - "pop %es \n\t" |
4419 | - "popf \n\t" |
4420 | - "popa \n\t" |
4421 | - "leave \n\t" |
4422 | - "ret \n\t" |
4423 | - ".previous"); |
4424 | - |
4425 | - |
4426 | -/* |
4427 | - * cru_detect |
4428 | - * |
4429 | - * Routine Description: |
4430 | - * This function uses the 32-bit BIOS Service Directory record to |
4431 | - * search for a $CRU record. |
4432 | - * |
4433 | - * Return Value: |
4434 | - * 0 : SUCCESS |
4435 | - * <0 : FAILURE |
4436 | - */ |
4437 | -static int cru_detect(unsigned long map_entry, |
4438 | - unsigned long map_offset) |
4439 | -{ |
4440 | - void *bios32_map; |
4441 | - unsigned long *bios32_entrypoint; |
4442 | - unsigned long cru_physical_address; |
4443 | - unsigned long cru_length; |
4444 | - unsigned long physical_bios_base = 0; |
4445 | - unsigned long physical_bios_offset = 0; |
4446 | - int retval = -ENODEV; |
4447 | - |
4448 | - bios32_map = ioremap(map_entry, (2 * PAGE_SIZE)); |
4449 | - |
4450 | - if (bios32_map == NULL) |
4451 | - return -ENODEV; |
4452 | - |
4453 | - bios32_entrypoint = bios32_map + map_offset; |
4454 | - |
4455 | - cmn_regs.u1.reax = CRU_BIOS_SIGNATURE_VALUE; |
4456 | - |
4457 | - set_memory_x((unsigned long)bios32_map, 2); |
4458 | - asminline_call(&cmn_regs, bios32_entrypoint); |
4459 | - |
4460 | - if (cmn_regs.u1.ral != 0) { |
4461 | - pr_warn("Call succeeded but with an error: 0x%x\n", |
4462 | - cmn_regs.u1.ral); |
4463 | - } else { |
4464 | - physical_bios_base = cmn_regs.u2.rebx; |
4465 | - physical_bios_offset = cmn_regs.u4.redx; |
4466 | - cru_length = cmn_regs.u3.recx; |
4467 | - cru_physical_address = |
4468 | - physical_bios_base + physical_bios_offset; |
4469 | - |
4470 | - /* If the values look OK, then map it in. */ |
4471 | - if ((physical_bios_base + physical_bios_offset)) { |
4472 | - cru_rom_addr = |
4473 | - ioremap(cru_physical_address, cru_length); |
4474 | - if (cru_rom_addr) { |
4475 | - set_memory_x((unsigned long)cru_rom_addr & PAGE_MASK, |
4476 | - (cru_length + PAGE_SIZE - 1) >> PAGE_SHIFT); |
4477 | - retval = 0; |
4478 | - } |
4479 | - } |
4480 | - |
4481 | - pr_debug("CRU Base Address: 0x%lx\n", physical_bios_base); |
4482 | - pr_debug("CRU Offset Address: 0x%lx\n", physical_bios_offset); |
4483 | - pr_debug("CRU Length: 0x%lx\n", cru_length); |
4484 | - pr_debug("CRU Mapped Address: %p\n", &cru_rom_addr); |
4485 | - } |
4486 | - iounmap(bios32_map); |
4487 | - return retval; |
4488 | -} |
4489 | - |
4490 | -/* |
4491 | - * bios_checksum |
4492 | - */ |
4493 | -static int bios_checksum(const char __iomem *ptr, int len) |
4494 | -{ |
4495 | - char sum = 0; |
4496 | - int i; |
4497 | - |
4498 | - /* |
4499 | - * calculate checksum of size bytes. This should add up |
4500 | - * to zero if we have a valid header. |
4501 | - */ |
4502 | - for (i = 0; i < len; i++) |
4503 | - sum += ptr[i]; |
4504 | - |
4505 | - return ((sum == 0) && (len > 0)); |
4506 | -} |
4507 | - |
4508 | -/* |
4509 | - * bios32_present |
4510 | - * |
4511 | - * Routine Description: |
4512 | - * This function finds the 32-bit BIOS Service Directory |
4513 | - * |
4514 | - * Return Value: |
4515 | - * 0 : SUCCESS |
4516 | - * <0 : FAILURE |
4517 | - */ |
4518 | -static int bios32_present(const char __iomem *p) |
4519 | -{ |
4520 | - struct bios32_service_dir *bios_32_ptr; |
4521 | - int length; |
4522 | - unsigned long map_entry, map_offset; |
4523 | - |
4524 | - bios_32_ptr = (struct bios32_service_dir *) p; |
4525 | - |
4526 | - /* |
4527 | - * Search for signature by checking equal to the swizzled value |
4528 | - * instead of calling another routine to perform a strcmp. |
4529 | - */ |
4530 | - if (bios_32_ptr->signature == PCI_BIOS32_SD_VALUE) { |
4531 | - length = bios_32_ptr->length * PCI_BIOS32_PARAGRAPH_LEN; |
4532 | - if (bios_checksum(p, length)) { |
4533 | - /* |
4534 | - * According to the spec, we're looking for the |
4535 | - * first 4KB-aligned address below the entrypoint |
4536 | - * listed in the header. The Service Directory code |
4537 | - * is guaranteed to occupy no more than 2 4KB pages. |
4538 | - */ |
4539 | - map_entry = bios_32_ptr->entry_point & ~(PAGE_SIZE - 1); |
4540 | - map_offset = bios_32_ptr->entry_point - map_entry; |
4541 | - |
4542 | - return cru_detect(map_entry, map_offset); |
4543 | - } |
4544 | - } |
4545 | - return -ENODEV; |
4546 | -} |
4547 | - |
4548 | -static int detect_cru_service(void) |
4549 | -{ |
4550 | - char __iomem *p, *q; |
4551 | - int rc = -1; |
4552 | - |
4553 | - /* |
4554 | - * Search from 0x0f0000 through 0x0fffff, inclusive. |
4555 | - */ |
4556 | - p = ioremap(PCI_ROM_BASE1, ROM_SIZE); |
4557 | - if (p == NULL) |
4558 | - return -ENOMEM; |
4559 | - |
4560 | - for (q = p; q < p + ROM_SIZE; q += 16) { |
4561 | - rc = bios32_present(q); |
4562 | - if (!rc) |
4563 | - break; |
4564 | - } |
4565 | - iounmap(p); |
4566 | - return rc; |
4567 | -} |
4568 | -/* ------------------------------------------------------------------------- */ |
4569 | -#endif /* CONFIG_X86_32 */ |
4570 | -#ifdef CONFIG_X86_64 |
4571 | -/* --64 Bit Bios------------------------------------------------------------ */ |
4572 | - |
4573 | -#define HPWDT_ARCH 64 |
4574 | - |
4575 | -asm(".text \n\t" |
4576 | - ".align 4 \n\t" |
4577 | - ".globl asminline_call \n\t" |
4578 | - ".type asminline_call, @function \n\t" |
4579 | - "asminline_call: \n\t" |
4580 | - FRAME_BEGIN |
4581 | - "pushq %rax \n\t" |
4582 | - "pushq %rbx \n\t" |
4583 | - "pushq %rdx \n\t" |
4584 | - "pushq %r12 \n\t" |
4585 | - "pushq %r9 \n\t" |
4586 | - "movq %rsi, %r12 \n\t" |
4587 | - "movq %rdi, %r9 \n\t" |
4588 | - "movl 4(%r9),%ebx \n\t" |
4589 | - "movl 8(%r9),%ecx \n\t" |
4590 | - "movl 12(%r9),%edx \n\t" |
4591 | - "movl 16(%r9),%esi \n\t" |
4592 | - "movl 20(%r9),%edi \n\t" |
4593 | - "movl (%r9),%eax \n\t" |
4594 | - "call *%r12 \n\t" |
4595 | - "pushfq \n\t" |
4596 | - "popq %r12 \n\t" |
4597 | - "movl %eax, (%r9) \n\t" |
4598 | - "movl %ebx, 4(%r9) \n\t" |
4599 | - "movl %ecx, 8(%r9) \n\t" |
4600 | - "movl %edx, 12(%r9) \n\t" |
4601 | - "movl %esi, 16(%r9) \n\t" |
4602 | - "movl %edi, 20(%r9) \n\t" |
4603 | - "movq %r12, %rax \n\t" |
4604 | - "movl %eax, 28(%r9) \n\t" |
4605 | - "popq %r9 \n\t" |
4606 | - "popq %r12 \n\t" |
4607 | - "popq %rdx \n\t" |
4608 | - "popq %rbx \n\t" |
4609 | - "popq %rax \n\t" |
4610 | - FRAME_END |
4611 | - "ret \n\t" |
4612 | - ".previous"); |
4613 | - |
4614 | -/* |
4615 | - * dmi_find_cru |
4616 | - * |
4617 | - * Routine Description: |
4618 | - * This function checks whether or not a SMBIOS/DMI record is |
4619 | - * the 64bit CRU info or not |
4620 | - */ |
4621 | -static void dmi_find_cru(const struct dmi_header *dm, void *dummy) |
4622 | -{ |
4623 | - struct smbios_cru64_info *smbios_cru64_ptr; |
4624 | - unsigned long cru_physical_address; |
4625 | - |
4626 | - if (dm->type == SMBIOS_CRU64_INFORMATION) { |
4627 | - smbios_cru64_ptr = (struct smbios_cru64_info *) dm; |
4628 | - if (smbios_cru64_ptr->signature == CRU_BIOS_SIGNATURE_VALUE) { |
4629 | - cru_physical_address = |
4630 | - smbios_cru64_ptr->physical_address + |
4631 | - smbios_cru64_ptr->double_offset; |
4632 | - cru_rom_addr = ioremap(cru_physical_address, |
4633 | - smbios_cru64_ptr->double_length); |
4634 | - set_memory_x((unsigned long)cru_rom_addr & PAGE_MASK, |
4635 | - smbios_cru64_ptr->double_length >> PAGE_SHIFT); |
4636 | - } |
4637 | - } |
4638 | -} |
4639 | - |
4640 | -static int detect_cru_service(void) |
4641 | -{ |
4642 | - cru_rom_addr = NULL; |
4643 | - |
4644 | - dmi_walk(dmi_find_cru, NULL); |
4645 | - |
4646 | - /* if cru_rom_addr has been set then we found a CRU service */ |
4647 | - return ((cru_rom_addr != NULL) ? 0 : -ENODEV); |
4648 | -} |
4649 | -/* ------------------------------------------------------------------------- */ |
4650 | -#endif /* CONFIG_X86_64 */ |
4651 | -#endif /* CONFIG_HPWDT_NMI_DECODING */ |
4652 | |
4653 | /* |
4654 | * Watchdog operations |
4655 | @@ -475,32 +103,22 @@ static int hpwdt_time_left(void) |
4656 | } |
4657 | |
4658 | #ifdef CONFIG_HPWDT_NMI_DECODING |
4659 | +static int hpwdt_my_nmi(void) |
4660 | +{ |
4661 | + return ioread8(hpwdt_nmistat) & 0x6; |
4662 | +} |
4663 | + |
4664 | /* |
4665 | * NMI Handler |
4666 | */ |
4667 | static int hpwdt_pretimeout(unsigned int ulReason, struct pt_regs *regs) |
4668 | { |
4669 | - unsigned long rom_pl; |
4670 | - static int die_nmi_called; |
4671 | - |
4672 | - if (!hpwdt_nmi_decoding) |
4673 | + if ((ulReason == NMI_UNKNOWN) && !hpwdt_my_nmi()) |
4674 | return NMI_DONE; |
4675 | |
4676 | - spin_lock_irqsave(&rom_lock, rom_pl); |
4677 | - if (!die_nmi_called && !is_icru && !is_uefi) |
4678 | - asminline_call(&cmn_regs, cru_rom_addr); |
4679 | - die_nmi_called = 1; |
4680 | - spin_unlock_irqrestore(&rom_lock, rom_pl); |
4681 | - |
4682 | if (allow_kdump) |
4683 | hpwdt_stop(); |
4684 | |
4685 | - if (!is_icru && !is_uefi) { |
4686 | - if (cmn_regs.u1.ral == 0) { |
4687 | - nmi_panic(regs, "An NMI occurred, but unable to determine source.\n"); |
4688 | - return NMI_HANDLED; |
4689 | - } |
4690 | - } |
4691 | nmi_panic(regs, "An NMI occurred. Depending on your system the reason " |
4692 | "for the NMI is logged in any one of the following " |
4693 | "resources:\n" |
4694 | @@ -666,84 +284,11 @@ static struct miscdevice hpwdt_miscdev = { |
4695 | * Init & Exit |
4696 | */ |
4697 | |
4698 | -#ifdef CONFIG_HPWDT_NMI_DECODING |
4699 | -#ifdef CONFIG_X86_LOCAL_APIC |
4700 | -static void hpwdt_check_nmi_decoding(struct pci_dev *dev) |
4701 | -{ |
4702 | - /* |
4703 | - * If nmi_watchdog is turned off then we can turn on |
4704 | - * our nmi decoding capability. |
4705 | - */ |
4706 | - hpwdt_nmi_decoding = 1; |
4707 | -} |
4708 | -#else |
4709 | -static void hpwdt_check_nmi_decoding(struct pci_dev *dev) |
4710 | -{ |
4711 | - dev_warn(&dev->dev, "NMI decoding is disabled. " |
4712 | - "Your kernel does not support a NMI Watchdog.\n"); |
4713 | -} |
4714 | -#endif /* CONFIG_X86_LOCAL_APIC */ |
4715 | - |
4716 | -/* |
4717 | - * dmi_find_icru |
4718 | - * |
4719 | - * Routine Description: |
4720 | - * This function checks whether or not we are on an iCRU-based server. |
4721 | - * This check is independent of architecture and needs to be made for |
4722 | - * any ProLiant system. |
4723 | - */ |
4724 | -static void dmi_find_icru(const struct dmi_header *dm, void *dummy) |
4725 | -{ |
4726 | - struct smbios_proliant_info *smbios_proliant_ptr; |
4727 | - |
4728 | - if (dm->type == SMBIOS_ICRU_INFORMATION) { |
4729 | - smbios_proliant_ptr = (struct smbios_proliant_info *) dm; |
4730 | - if (smbios_proliant_ptr->misc_features & 0x01) |
4731 | - is_icru = 1; |
4732 | - if (smbios_proliant_ptr->misc_features & 0x408) |
4733 | - is_uefi = 1; |
4734 | - } |
4735 | -} |
4736 | |
4737 | static int hpwdt_init_nmi_decoding(struct pci_dev *dev) |
4738 | { |
4739 | +#ifdef CONFIG_HPWDT_NMI_DECODING |
4740 | int retval; |
4741 | - |
4742 | - /* |
4743 | - * On typical CRU-based systems we need to map that service in |
4744 | - * the BIOS. For 32 bit Operating Systems we need to go through |
4745 | - * the 32 Bit BIOS Service Directory. For 64 bit Operating |
4746 | - * Systems we get that service through SMBIOS. |
4747 | - * |
4748 | - * On systems that support the new iCRU service all we need to |
4749 | - * do is call dmi_walk to get the supported flag value and skip |
4750 | - * the old cru detect code. |
4751 | - */ |
4752 | - dmi_walk(dmi_find_icru, NULL); |
4753 | - if (!is_icru && !is_uefi) { |
4754 | - |
4755 | - /* |
4756 | - * We need to map the ROM to get the CRU service. |
4757 | - * For 32 bit Operating Systems we need to go through the 32 Bit |
4758 | - * BIOS Service Directory |
4759 | - * For 64 bit Operating Systems we get that service through SMBIOS. |
4760 | - */ |
4761 | - retval = detect_cru_service(); |
4762 | - if (retval < 0) { |
4763 | - dev_warn(&dev->dev, |
4764 | - "Unable to detect the %d Bit CRU Service.\n", |
4765 | - HPWDT_ARCH); |
4766 | - return retval; |
4767 | - } |
4768 | - |
4769 | - /* |
4770 | - * We know this is the only CRU call we need to make so lets keep as |
4771 | - * few instructions as possible once the NMI comes in. |
4772 | - */ |
4773 | - cmn_regs.u1.rah = 0x0D; |
4774 | - cmn_regs.u1.ral = 0x02; |
4775 | - } |
4776 | - |
4777 | /* |
4778 | * Only one function can register for NMI_UNKNOWN |
4779 | */ |
4780 | @@ -771,44 +316,25 @@ static int hpwdt_init_nmi_decoding(struct pci_dev *dev) |
4781 | dev_warn(&dev->dev, |
4782 | "Unable to register a die notifier (err=%d).\n", |
4783 | retval); |
4784 | - if (cru_rom_addr) |
4785 | - iounmap(cru_rom_addr); |
4786 | return retval; |
4787 | +#endif /* CONFIG_HPWDT_NMI_DECODING */ |
4788 | + return 0; |
4789 | } |
4790 | |
4791 | static void hpwdt_exit_nmi_decoding(void) |
4792 | { |
4793 | +#ifdef CONFIG_HPWDT_NMI_DECODING |
4794 | unregister_nmi_handler(NMI_UNKNOWN, "hpwdt"); |
4795 | unregister_nmi_handler(NMI_SERR, "hpwdt"); |
4796 | unregister_nmi_handler(NMI_IO_CHECK, "hpwdt"); |
4797 | - if (cru_rom_addr) |
4798 | - iounmap(cru_rom_addr); |
4799 | -} |
4800 | -#else /* !CONFIG_HPWDT_NMI_DECODING */ |
4801 | -static void hpwdt_check_nmi_decoding(struct pci_dev *dev) |
4802 | -{ |
4803 | -} |
4804 | - |
4805 | -static int hpwdt_init_nmi_decoding(struct pci_dev *dev) |
4806 | -{ |
4807 | - return 0; |
4808 | +#endif |
4809 | } |
4810 | |
4811 | -static void hpwdt_exit_nmi_decoding(void) |
4812 | -{ |
4813 | -} |
4814 | -#endif /* CONFIG_HPWDT_NMI_DECODING */ |
4815 | - |
4816 | static int hpwdt_init_one(struct pci_dev *dev, |
4817 | const struct pci_device_id *ent) |
4818 | { |
4819 | int retval; |
4820 | |
4821 | - /* |
4822 | - * Check if we can do NMI decoding or not |
4823 | - */ |
4824 | - hpwdt_check_nmi_decoding(dev); |
4825 | - |
4826 | /* |
4827 | * First let's find out if we are on an iLO2+ server. We will |
4828 | * not run on a legacy ASM box. |
4829 | @@ -842,6 +368,7 @@ static int hpwdt_init_one(struct pci_dev *dev, |
4830 | retval = -ENOMEM; |
4831 | goto error_pci_iomap; |
4832 | } |
4833 | + hpwdt_nmistat = pci_mem_addr + 0x6e; |
4834 | hpwdt_timer_reg = pci_mem_addr + 0x70; |
4835 | hpwdt_timer_con = pci_mem_addr + 0x72; |
4836 | |
4837 | @@ -912,6 +439,6 @@ MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" |
4838 | #ifdef CONFIG_HPWDT_NMI_DECODING |
4839 | module_param(allow_kdump, int, 0); |
4840 | MODULE_PARM_DESC(allow_kdump, "Start a kernel dump after NMI occurs"); |
4841 | -#endif /* !CONFIG_HPWDT_NMI_DECODING */ |
4842 | +#endif /* CONFIG_HPWDT_NMI_DECODING */ |
4843 | |
4844 | module_pci_driver(hpwdt_driver); |
4845 | diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c |
4846 | index 8c10b0562e75..621c517b325c 100644 |
4847 | --- a/fs/nfs/direct.c |
4848 | +++ b/fs/nfs/direct.c |
4849 | @@ -86,10 +86,10 @@ struct nfs_direct_req { |
4850 | struct nfs_direct_mirror mirrors[NFS_PAGEIO_DESCRIPTOR_MIRROR_MAX]; |
4851 | int mirror_count; |
4852 | |
4853 | + loff_t io_start; /* Start offset for I/O */ |
4854 | ssize_t count, /* bytes actually processed */ |
4855 | max_count, /* max expected count */ |
4856 | bytes_left, /* bytes left to be sent */ |
4857 | - io_start, /* start of IO */ |
4858 | error; /* any reported error */ |
4859 | struct completion completion; /* wait for i/o completion */ |
4860 | |
4861 | diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c |
4862 | index 5f2f852ef506..7b34534210ce 100644 |
4863 | --- a/fs/nfs/pnfs.c |
4864 | +++ b/fs/nfs/pnfs.c |
4865 | @@ -292,8 +292,11 @@ pnfs_detach_layout_hdr(struct pnfs_layout_hdr *lo) |
4866 | void |
4867 | pnfs_put_layout_hdr(struct pnfs_layout_hdr *lo) |
4868 | { |
4869 | - struct inode *inode = lo->plh_inode; |
4870 | + struct inode *inode; |
4871 | |
4872 | + if (!lo) |
4873 | + return; |
4874 | + inode = lo->plh_inode; |
4875 | pnfs_layoutreturn_before_put_layout_hdr(lo); |
4876 | |
4877 | if (atomic_dec_and_lock(&lo->plh_refcount, &inode->i_lock)) { |
4878 | @@ -1223,10 +1226,12 @@ bool pnfs_roc(struct inode *ino, |
4879 | spin_lock(&ino->i_lock); |
4880 | lo = nfsi->layout; |
4881 | if (!lo || !pnfs_layout_is_valid(lo) || |
4882 | - test_bit(NFS_LAYOUT_BULK_RECALL, &lo->plh_flags)) |
4883 | + test_bit(NFS_LAYOUT_BULK_RECALL, &lo->plh_flags)) { |
4884 | + lo = NULL; |
4885 | goto out_noroc; |
4886 | + } |
4887 | + pnfs_get_layout_hdr(lo); |
4888 | if (test_bit(NFS_LAYOUT_RETURN_LOCK, &lo->plh_flags)) { |
4889 | - pnfs_get_layout_hdr(lo); |
4890 | spin_unlock(&ino->i_lock); |
4891 | wait_on_bit(&lo->plh_flags, NFS_LAYOUT_RETURN, |
4892 | TASK_UNINTERRUPTIBLE); |
4893 | @@ -1294,10 +1299,12 @@ bool pnfs_roc(struct inode *ino, |
4894 | struct pnfs_layoutdriver_type *ld = NFS_SERVER(ino)->pnfs_curr_ld; |
4895 | if (ld->prepare_layoutreturn) |
4896 | ld->prepare_layoutreturn(args); |
4897 | + pnfs_put_layout_hdr(lo); |
4898 | return true; |
4899 | } |
4900 | if (layoutreturn) |
4901 | pnfs_send_layoutreturn(lo, &stateid, iomode, true); |
4902 | + pnfs_put_layout_hdr(lo); |
4903 | return false; |
4904 | } |
4905 | |
4906 | diff --git a/fs/nfs/write.c b/fs/nfs/write.c |
4907 | index 76da415be39a..19e6ea89ad26 100644 |
4908 | --- a/fs/nfs/write.c |
4909 | +++ b/fs/nfs/write.c |
4910 | @@ -1877,40 +1877,43 @@ int nfs_generic_commit_list(struct inode *inode, struct list_head *head, |
4911 | return status; |
4912 | } |
4913 | |
4914 | -int nfs_commit_inode(struct inode *inode, int how) |
4915 | +static int __nfs_commit_inode(struct inode *inode, int how, |
4916 | + struct writeback_control *wbc) |
4917 | { |
4918 | LIST_HEAD(head); |
4919 | struct nfs_commit_info cinfo; |
4920 | int may_wait = how & FLUSH_SYNC; |
4921 | - int error = 0; |
4922 | - int res; |
4923 | + int ret, nscan; |
4924 | |
4925 | nfs_init_cinfo_from_inode(&cinfo, inode); |
4926 | nfs_commit_begin(cinfo.mds); |
4927 | - res = nfs_scan_commit(inode, &head, &cinfo); |
4928 | - if (res) |
4929 | - error = nfs_generic_commit_list(inode, &head, how, &cinfo); |
4930 | + for (;;) { |
4931 | + ret = nscan = nfs_scan_commit(inode, &head, &cinfo); |
4932 | + if (ret <= 0) |
4933 | + break; |
4934 | + ret = nfs_generic_commit_list(inode, &head, how, &cinfo); |
4935 | + if (ret < 0) |
4936 | + break; |
4937 | + ret = 0; |
4938 | + if (wbc && wbc->sync_mode == WB_SYNC_NONE) { |
4939 | + if (nscan < wbc->nr_to_write) |
4940 | + wbc->nr_to_write -= nscan; |
4941 | + else |
4942 | + wbc->nr_to_write = 0; |
4943 | + } |
4944 | + if (nscan < INT_MAX) |
4945 | + break; |
4946 | + cond_resched(); |
4947 | + } |
4948 | nfs_commit_end(cinfo.mds); |
4949 | - if (res == 0) |
4950 | - return res; |
4951 | - if (error < 0) |
4952 | - goto out_error; |
4953 | - if (!may_wait) |
4954 | - goto out_mark_dirty; |
4955 | - error = wait_on_commit(cinfo.mds); |
4956 | - if (error < 0) |
4957 | - return error; |
4958 | - return res; |
4959 | -out_error: |
4960 | - res = error; |
4961 | - /* Note: If we exit without ensuring that the commit is complete, |
4962 | - * we must mark the inode as dirty. Otherwise, future calls to |
4963 | - * sync_inode() with the WB_SYNC_ALL flag set will fail to ensure |
4964 | - * that the data is on the disk. |
4965 | - */ |
4966 | -out_mark_dirty: |
4967 | - __mark_inode_dirty(inode, I_DIRTY_DATASYNC); |
4968 | - return res; |
4969 | + if (ret || !may_wait) |
4970 | + return ret; |
4971 | + return wait_on_commit(cinfo.mds); |
4972 | +} |
4973 | + |
4974 | +int nfs_commit_inode(struct inode *inode, int how) |
4975 | +{ |
4976 | + return __nfs_commit_inode(inode, how, NULL); |
4977 | } |
4978 | EXPORT_SYMBOL_GPL(nfs_commit_inode); |
4979 | |
4980 | @@ -1920,11 +1923,11 @@ int nfs_write_inode(struct inode *inode, struct writeback_control *wbc) |
4981 | int flags = FLUSH_SYNC; |
4982 | int ret = 0; |
4983 | |
4984 | - /* no commits means nothing needs to be done */ |
4985 | - if (!atomic_long_read(&nfsi->commit_info.ncommit)) |
4986 | - return ret; |
4987 | - |
4988 | if (wbc->sync_mode == WB_SYNC_NONE) { |
4989 | + /* no commits means nothing needs to be done */ |
4990 | + if (!atomic_long_read(&nfsi->commit_info.ncommit)) |
4991 | + goto check_requests_outstanding; |
4992 | + |
4993 | /* Don't commit yet if this is a non-blocking flush and there |
4994 | * are a lot of outstanding writes for this mapping. |
4995 | */ |
4996 | @@ -1935,16 +1938,16 @@ int nfs_write_inode(struct inode *inode, struct writeback_control *wbc) |
4997 | flags = 0; |
4998 | } |
4999 | |
5000 | - ret = nfs_commit_inode(inode, flags); |
5001 | - if (ret >= 0) { |
5002 | - if (wbc->sync_mode == WB_SYNC_NONE) { |
5003 | - if (ret < wbc->nr_to_write) |
5004 | - wbc->nr_to_write -= ret; |
5005 | - else |
5006 | - wbc->nr_to_write = 0; |
5007 | - } |
5008 | - return 0; |
5009 | - } |
5010 | + ret = __nfs_commit_inode(inode, flags, wbc); |
5011 | + if (!ret) { |
5012 | + if (flags & FLUSH_SYNC) |
5013 | + return 0; |
5014 | + } else if (atomic_long_read(&nfsi->commit_info.ncommit)) |
5015 | + goto out_mark_dirty; |
5016 | + |
5017 | +check_requests_outstanding: |
5018 | + if (!atomic_read(&nfsi->commit_info.rpcs_out)) |
5019 | + return ret; |
5020 | out_mark_dirty: |
5021 | __mark_inode_dirty(inode, I_DIRTY_DATASYNC); |
5022 | return ret; |
5023 | diff --git a/include/drm/drm_crtc_helper.h b/include/drm/drm_crtc_helper.h |
5024 | index 76e237bd989b..6914633037a5 100644 |
5025 | --- a/include/drm/drm_crtc_helper.h |
5026 | +++ b/include/drm/drm_crtc_helper.h |
5027 | @@ -77,5 +77,6 @@ void drm_kms_helper_hotplug_event(struct drm_device *dev); |
5028 | |
5029 | void drm_kms_helper_poll_disable(struct drm_device *dev); |
5030 | void drm_kms_helper_poll_enable(struct drm_device *dev); |
5031 | +bool drm_kms_helper_is_poll_worker(void); |
5032 | |
5033 | #endif |
5034 | diff --git a/include/drm/drm_drv.h b/include/drm/drm_drv.h |
5035 | index 71bbaaec836d..305304965b89 100644 |
5036 | --- a/include/drm/drm_drv.h |
5037 | +++ b/include/drm/drm_drv.h |
5038 | @@ -55,6 +55,7 @@ struct drm_mode_create_dumb; |
5039 | #define DRIVER_ATOMIC 0x10000 |
5040 | #define DRIVER_KMS_LEGACY_CONTEXT 0x20000 |
5041 | #define DRIVER_SYNCOBJ 0x40000 |
5042 | +#define DRIVER_PREFER_XBGR_30BPP 0x80000 |
5043 | |
5044 | /** |
5045 | * struct drm_driver - DRM driver structure |
5046 | diff --git a/include/linux/compiler-clang.h b/include/linux/compiler-clang.h |
5047 | index 3b609edffa8f..be3aef6839f6 100644 |
5048 | --- a/include/linux/compiler-clang.h |
5049 | +++ b/include/linux/compiler-clang.h |
5050 | @@ -19,3 +19,8 @@ |
5051 | |
5052 | #define randomized_struct_fields_start struct { |
5053 | #define randomized_struct_fields_end }; |
5054 | + |
5055 | +/* Clang doesn't have a way to turn it off per-function, yet. */ |
5056 | +#ifdef __noretpoline |
5057 | +#undef __noretpoline |
5058 | +#endif |
5059 | diff --git a/include/linux/compiler-gcc.h b/include/linux/compiler-gcc.h |
5060 | index bf09213895f7..a1ffbf25873f 100644 |
5061 | --- a/include/linux/compiler-gcc.h |
5062 | +++ b/include/linux/compiler-gcc.h |
5063 | @@ -93,6 +93,10 @@ |
5064 | #define __weak __attribute__((weak)) |
5065 | #define __alias(symbol) __attribute__((alias(#symbol))) |
5066 | |
5067 | +#ifdef RETPOLINE |
5068 | +#define __noretpoline __attribute__((indirect_branch("keep"))) |
5069 | +#endif |
5070 | + |
5071 | /* |
5072 | * it doesn't make sense on ARM (currently the only user of __naked) |
5073 | * to trace naked functions because then mcount is called without |
5074 | diff --git a/include/linux/init.h b/include/linux/init.h |
5075 | index 943139a563e3..07cab8a053af 100644 |
5076 | --- a/include/linux/init.h |
5077 | +++ b/include/linux/init.h |
5078 | @@ -6,10 +6,10 @@ |
5079 | #include <linux/types.h> |
5080 | |
5081 | /* Built-in __init functions needn't be compiled with retpoline */ |
5082 | -#if defined(RETPOLINE) && !defined(MODULE) |
5083 | -#define __noretpoline __attribute__((indirect_branch("keep"))) |
5084 | +#if defined(__noretpoline) && !defined(MODULE) |
5085 | +#define __noinitretpoline __noretpoline |
5086 | #else |
5087 | -#define __noretpoline |
5088 | +#define __noinitretpoline |
5089 | #endif |
5090 | |
5091 | /* These macros are used to mark some functions or |
5092 | @@ -47,7 +47,7 @@ |
5093 | |
5094 | /* These are for everybody (although not all archs will actually |
5095 | discard it in modules) */ |
5096 | -#define __init __section(.init.text) __cold __inittrace __latent_entropy __noretpoline |
5097 | +#define __init __section(.init.text) __cold __inittrace __latent_entropy __noinitretpoline |
5098 | #define __initdata __section(.init.data) |
5099 | #define __initconst __section(.init.rodata) |
5100 | #define __exitdata __section(.exit.data) |
5101 | diff --git a/include/linux/nospec.h b/include/linux/nospec.h |
5102 | index 132e3f5a2e0d..e791ebc65c9c 100644 |
5103 | --- a/include/linux/nospec.h |
5104 | +++ b/include/linux/nospec.h |
5105 | @@ -5,6 +5,7 @@ |
5106 | |
5107 | #ifndef _LINUX_NOSPEC_H |
5108 | #define _LINUX_NOSPEC_H |
5109 | +#include <asm/barrier.h> |
5110 | |
5111 | /** |
5112 | * array_index_mask_nospec() - generate a ~0 mask when index < size, 0 otherwise |
5113 | @@ -29,26 +30,6 @@ static inline unsigned long array_index_mask_nospec(unsigned long index, |
5114 | } |
5115 | #endif |
5116 | |
5117 | -/* |
5118 | - * Warn developers about inappropriate array_index_nospec() usage. |
5119 | - * |
5120 | - * Even if the CPU speculates past the WARN_ONCE branch, the |
5121 | - * sign bit of @index is taken into account when generating the |
5122 | - * mask. |
5123 | - * |
5124 | - * This warning is compiled out when the compiler can infer that |
5125 | - * @index and @size are less than LONG_MAX. |
5126 | - */ |
5127 | -#define array_index_mask_nospec_check(index, size) \ |
5128 | -({ \ |
5129 | - if (WARN_ONCE(index > LONG_MAX || size > LONG_MAX, \ |
5130 | - "array_index_nospec() limited to range of [0, LONG_MAX]\n")) \ |
5131 | - _mask = 0; \ |
5132 | - else \ |
5133 | - _mask = array_index_mask_nospec(index, size); \ |
5134 | - _mask; \ |
5135 | -}) |
5136 | - |
5137 | /* |
5138 | * array_index_nospec - sanitize an array index after a bounds check |
5139 | * |
5140 | @@ -67,7 +48,7 @@ static inline unsigned long array_index_mask_nospec(unsigned long index, |
5141 | ({ \ |
5142 | typeof(index) _i = (index); \ |
5143 | typeof(size) _s = (size); \ |
5144 | - unsigned long _mask = array_index_mask_nospec_check(_i, _s); \ |
5145 | + unsigned long _mask = array_index_mask_nospec(_i, _s); \ |
5146 | \ |
5147 | BUILD_BUG_ON(sizeof(_i) > sizeof(long)); \ |
5148 | BUILD_BUG_ON(sizeof(_s) > sizeof(long)); \ |
5149 | diff --git a/include/linux/tpm.h b/include/linux/tpm.h |
5150 | index 5a090f5ab335..881312d85574 100644 |
5151 | --- a/include/linux/tpm.h |
5152 | +++ b/include/linux/tpm.h |
5153 | @@ -50,6 +50,7 @@ struct tpm_class_ops { |
5154 | unsigned long *timeout_cap); |
5155 | int (*request_locality)(struct tpm_chip *chip, int loc); |
5156 | void (*relinquish_locality)(struct tpm_chip *chip, int loc); |
5157 | + void (*clk_enable)(struct tpm_chip *chip, bool value); |
5158 | }; |
5159 | |
5160 | #if defined(CONFIG_TCG_TPM) || defined(CONFIG_TCG_TPM_MODULE) |
5161 | diff --git a/include/linux/workqueue.h b/include/linux/workqueue.h |
5162 | index 0eae11fc7a23..1c527abb1ae5 100644 |
5163 | --- a/include/linux/workqueue.h |
5164 | +++ b/include/linux/workqueue.h |
5165 | @@ -467,6 +467,7 @@ extern bool cancel_delayed_work_sync(struct delayed_work *dwork); |
5166 | |
5167 | extern void workqueue_set_max_active(struct workqueue_struct *wq, |
5168 | int max_active); |
5169 | +extern struct work_struct *current_work(void); |
5170 | extern bool current_is_workqueue_rescuer(void); |
5171 | extern bool workqueue_congested(int cpu, struct workqueue_struct *wq); |
5172 | extern unsigned int work_busy(struct work_struct *work); |
5173 | diff --git a/include/scsi/scsi_cmnd.h b/include/scsi/scsi_cmnd.h |
5174 | index 7fb57e905526..7bc752fc98de 100644 |
5175 | --- a/include/scsi/scsi_cmnd.h |
5176 | +++ b/include/scsi/scsi_cmnd.h |
5177 | @@ -69,6 +69,9 @@ struct scsi_cmnd { |
5178 | struct list_head list; /* scsi_cmnd participates in queue lists */ |
5179 | struct list_head eh_entry; /* entry for the host eh_cmd_q */ |
5180 | struct delayed_work abort_work; |
5181 | + |
5182 | + struct rcu_head rcu; |
5183 | + |
5184 | int eh_eflags; /* Used by error handlr */ |
5185 | |
5186 | /* |
5187 | diff --git a/include/scsi/scsi_host.h b/include/scsi/scsi_host.h |
5188 | index 1a1df0d21ee3..a8b7bf879ced 100644 |
5189 | --- a/include/scsi/scsi_host.h |
5190 | +++ b/include/scsi/scsi_host.h |
5191 | @@ -571,8 +571,6 @@ struct Scsi_Host { |
5192 | struct blk_mq_tag_set tag_set; |
5193 | }; |
5194 | |
5195 | - struct rcu_head rcu; |
5196 | - |
5197 | atomic_t host_busy; /* commands actually active on low-level */ |
5198 | atomic_t host_blocked; |
5199 | |
5200 | diff --git a/kernel/workqueue.c b/kernel/workqueue.c |
5201 | index 8365a52a74c5..d0c6b50792c8 100644 |
5202 | --- a/kernel/workqueue.c |
5203 | +++ b/kernel/workqueue.c |
5204 | @@ -4184,6 +4184,22 @@ void workqueue_set_max_active(struct workqueue_struct *wq, int max_active) |
5205 | } |
5206 | EXPORT_SYMBOL_GPL(workqueue_set_max_active); |
5207 | |
5208 | +/** |
5209 | + * current_work - retrieve %current task's work struct |
5210 | + * |
5211 | + * Determine if %current task is a workqueue worker and what it's working on. |
5212 | + * Useful to find out the context that the %current task is running in. |
5213 | + * |
5214 | + * Return: work struct if %current task is a workqueue worker, %NULL otherwise. |
5215 | + */ |
5216 | +struct work_struct *current_work(void) |
5217 | +{ |
5218 | + struct worker *worker = current_wq_worker(); |
5219 | + |
5220 | + return worker ? worker->current_work : NULL; |
5221 | +} |
5222 | +EXPORT_SYMBOL(current_work); |
5223 | + |
5224 | /** |
5225 | * current_is_workqueue_rescuer - is %current workqueue rescuer? |
5226 | * |
5227 | diff --git a/lib/bug.c b/lib/bug.c |
5228 | index 1e094408c893..d2c9a099561a 100644 |
5229 | --- a/lib/bug.c |
5230 | +++ b/lib/bug.c |
5231 | @@ -150,6 +150,8 @@ enum bug_trap_type report_bug(unsigned long bugaddr, struct pt_regs *regs) |
5232 | return BUG_TRAP_TYPE_NONE; |
5233 | |
5234 | bug = find_bug(bugaddr); |
5235 | + if (!bug) |
5236 | + return BUG_TRAP_TYPE_NONE; |
5237 | |
5238 | file = NULL; |
5239 | line = 0; |
5240 | diff --git a/mm/memblock.c b/mm/memblock.c |
5241 | index 91205780e6b1..6dd303717a4d 100644 |
5242 | --- a/mm/memblock.c |
5243 | +++ b/mm/memblock.c |
5244 | @@ -1107,7 +1107,7 @@ unsigned long __init_memblock memblock_next_valid_pfn(unsigned long pfn, |
5245 | struct memblock_type *type = &memblock.memory; |
5246 | unsigned int right = type->cnt; |
5247 | unsigned int mid, left = 0; |
5248 | - phys_addr_t addr = PFN_PHYS(pfn + 1); |
5249 | + phys_addr_t addr = PFN_PHYS(++pfn); |
5250 | |
5251 | do { |
5252 | mid = (right + left) / 2; |
5253 | @@ -1118,15 +1118,15 @@ unsigned long __init_memblock memblock_next_valid_pfn(unsigned long pfn, |
5254 | type->regions[mid].size)) |
5255 | left = mid + 1; |
5256 | else { |
5257 | - /* addr is within the region, so pfn + 1 is valid */ |
5258 | - return min(pfn + 1, max_pfn); |
5259 | + /* addr is within the region, so pfn is valid */ |
5260 | + return pfn; |
5261 | } |
5262 | } while (left < right); |
5263 | |
5264 | if (right == type->cnt) |
5265 | - return max_pfn; |
5266 | + return -1UL; |
5267 | else |
5268 | - return min(PHYS_PFN(type->regions[right].base), max_pfn); |
5269 | + return PHYS_PFN(type->regions[right].base); |
5270 | } |
5271 | |
5272 | /** |
5273 | diff --git a/net/bridge/netfilter/ebt_among.c b/net/bridge/netfilter/ebt_among.c |
5274 | index 279527f8b1fe..59baaecd3e54 100644 |
5275 | --- a/net/bridge/netfilter/ebt_among.c |
5276 | +++ b/net/bridge/netfilter/ebt_among.c |
5277 | @@ -172,18 +172,35 @@ ebt_among_mt(const struct sk_buff *skb, struct xt_action_param *par) |
5278 | return true; |
5279 | } |
5280 | |
5281 | +static bool poolsize_invalid(const struct ebt_mac_wormhash *w) |
5282 | +{ |
5283 | + return w && w->poolsize >= (INT_MAX / sizeof(struct ebt_mac_wormhash_tuple)); |
5284 | +} |
5285 | + |
5286 | static int ebt_among_mt_check(const struct xt_mtchk_param *par) |
5287 | { |
5288 | const struct ebt_among_info *info = par->matchinfo; |
5289 | const struct ebt_entry_match *em = |
5290 | container_of(par->matchinfo, const struct ebt_entry_match, data); |
5291 | - int expected_length = sizeof(struct ebt_among_info); |
5292 | + unsigned int expected_length = sizeof(struct ebt_among_info); |
5293 | const struct ebt_mac_wormhash *wh_dst, *wh_src; |
5294 | int err; |
5295 | |
5296 | + if (expected_length > em->match_size) |
5297 | + return -EINVAL; |
5298 | + |
5299 | wh_dst = ebt_among_wh_dst(info); |
5300 | - wh_src = ebt_among_wh_src(info); |
5301 | + if (poolsize_invalid(wh_dst)) |
5302 | + return -EINVAL; |
5303 | + |
5304 | expected_length += ebt_mac_wormhash_size(wh_dst); |
5305 | + if (expected_length > em->match_size) |
5306 | + return -EINVAL; |
5307 | + |
5308 | + wh_src = ebt_among_wh_src(info); |
5309 | + if (poolsize_invalid(wh_src)) |
5310 | + return -EINVAL; |
5311 | + |
5312 | expected_length += ebt_mac_wormhash_size(wh_src); |
5313 | |
5314 | if (em->match_size != EBT_ALIGN(expected_length)) { |
5315 | diff --git a/net/bridge/netfilter/ebtables.c b/net/bridge/netfilter/ebtables.c |
5316 | index 3b3dcf719e07..16eb99458df4 100644 |
5317 | --- a/net/bridge/netfilter/ebtables.c |
5318 | +++ b/net/bridge/netfilter/ebtables.c |
5319 | @@ -2053,7 +2053,9 @@ static int ebt_size_mwt(struct compat_ebt_entry_mwt *match32, |
5320 | if (match_kern) |
5321 | match_kern->match_size = ret; |
5322 | |
5323 | - WARN_ON(type == EBT_COMPAT_TARGET && size_left); |
5324 | + if (WARN_ON(type == EBT_COMPAT_TARGET && size_left)) |
5325 | + return -EINVAL; |
5326 | + |
5327 | match32 = (struct compat_ebt_entry_mwt *) buf; |
5328 | } |
5329 | |
5330 | @@ -2109,6 +2111,15 @@ static int size_entry_mwt(struct ebt_entry *entry, const unsigned char *base, |
5331 | * |
5332 | * offsets are relative to beginning of struct ebt_entry (i.e., 0). |
5333 | */ |
5334 | + for (i = 0; i < 4 ; ++i) { |
5335 | + if (offsets[i] >= *total) |
5336 | + return -EINVAL; |
5337 | + if (i == 0) |
5338 | + continue; |
5339 | + if (offsets[i-1] > offsets[i]) |
5340 | + return -EINVAL; |
5341 | + } |
5342 | + |
5343 | for (i = 0, j = 1 ; j < 4 ; j++, i++) { |
5344 | struct compat_ebt_entry_mwt *match32; |
5345 | unsigned int size; |
5346 | diff --git a/net/ipv4/netfilter/arp_tables.c b/net/ipv4/netfilter/arp_tables.c |
5347 | index 9e2770fd00be..aa4c3b7f7da4 100644 |
5348 | --- a/net/ipv4/netfilter/arp_tables.c |
5349 | +++ b/net/ipv4/netfilter/arp_tables.c |
5350 | @@ -257,6 +257,10 @@ unsigned int arpt_do_table(struct sk_buff *skb, |
5351 | } |
5352 | if (table_base + v |
5353 | != arpt_next_entry(e)) { |
5354 | + if (unlikely(stackidx >= private->stacksize)) { |
5355 | + verdict = NF_DROP; |
5356 | + break; |
5357 | + } |
5358 | jumpstack[stackidx++] = e; |
5359 | } |
5360 | |
5361 | diff --git a/net/ipv4/netfilter/ip_tables.c b/net/ipv4/netfilter/ip_tables.c |
5362 | index 39286e543ee6..cadb82a906b8 100644 |
5363 | --- a/net/ipv4/netfilter/ip_tables.c |
5364 | +++ b/net/ipv4/netfilter/ip_tables.c |
5365 | @@ -335,8 +335,13 @@ ipt_do_table(struct sk_buff *skb, |
5366 | continue; |
5367 | } |
5368 | if (table_base + v != ipt_next_entry(e) && |
5369 | - !(e->ip.flags & IPT_F_GOTO)) |
5370 | + !(e->ip.flags & IPT_F_GOTO)) { |
5371 | + if (unlikely(stackidx >= private->stacksize)) { |
5372 | + verdict = NF_DROP; |
5373 | + break; |
5374 | + } |
5375 | jumpstack[stackidx++] = e; |
5376 | + } |
5377 | |
5378 | e = get_entry(table_base, v); |
5379 | continue; |
5380 | diff --git a/net/ipv4/netfilter/ipt_CLUSTERIP.c b/net/ipv4/netfilter/ipt_CLUSTERIP.c |
5381 | index 24a8c2e63e3d..c07e9db95ccc 100644 |
5382 | --- a/net/ipv4/netfilter/ipt_CLUSTERIP.c |
5383 | +++ b/net/ipv4/netfilter/ipt_CLUSTERIP.c |
5384 | @@ -107,12 +107,6 @@ clusterip_config_entry_put(struct net *net, struct clusterip_config *c) |
5385 | |
5386 | local_bh_disable(); |
5387 | if (refcount_dec_and_lock(&c->entries, &cn->lock)) { |
5388 | - list_del_rcu(&c->list); |
5389 | - spin_unlock(&cn->lock); |
5390 | - local_bh_enable(); |
5391 | - |
5392 | - unregister_netdevice_notifier(&c->notifier); |
5393 | - |
5394 | /* In case anyone still accesses the file, the open/close |
5395 | * functions are also incrementing the refcount on their own, |
5396 | * so it's safe to remove the entry even if it's in use. */ |
5397 | @@ -120,6 +114,12 @@ clusterip_config_entry_put(struct net *net, struct clusterip_config *c) |
5398 | if (cn->procdir) |
5399 | proc_remove(c->pde); |
5400 | #endif |
5401 | + list_del_rcu(&c->list); |
5402 | + spin_unlock(&cn->lock); |
5403 | + local_bh_enable(); |
5404 | + |
5405 | + unregister_netdevice_notifier(&c->notifier); |
5406 | + |
5407 | return; |
5408 | } |
5409 | local_bh_enable(); |
5410 | diff --git a/net/ipv6/netfilter.c b/net/ipv6/netfilter.c |
5411 | index 39970e212ad5..9bf260459f83 100644 |
5412 | --- a/net/ipv6/netfilter.c |
5413 | +++ b/net/ipv6/netfilter.c |
5414 | @@ -21,18 +21,19 @@ |
5415 | int ip6_route_me_harder(struct net *net, struct sk_buff *skb) |
5416 | { |
5417 | const struct ipv6hdr *iph = ipv6_hdr(skb); |
5418 | + struct sock *sk = sk_to_full_sk(skb->sk); |
5419 | unsigned int hh_len; |
5420 | struct dst_entry *dst; |
5421 | struct flowi6 fl6 = { |
5422 | - .flowi6_oif = skb->sk ? skb->sk->sk_bound_dev_if : 0, |
5423 | + .flowi6_oif = sk ? sk->sk_bound_dev_if : 0, |
5424 | .flowi6_mark = skb->mark, |
5425 | - .flowi6_uid = sock_net_uid(net, skb->sk), |
5426 | + .flowi6_uid = sock_net_uid(net, sk), |
5427 | .daddr = iph->daddr, |
5428 | .saddr = iph->saddr, |
5429 | }; |
5430 | int err; |
5431 | |
5432 | - dst = ip6_route_output(net, skb->sk, &fl6); |
5433 | + dst = ip6_route_output(net, sk, &fl6); |
5434 | err = dst->error; |
5435 | if (err) { |
5436 | IP6_INC_STATS(net, ip6_dst_idev(dst), IPSTATS_MIB_OUTNOROUTES); |
5437 | @@ -50,7 +51,7 @@ int ip6_route_me_harder(struct net *net, struct sk_buff *skb) |
5438 | if (!(IP6CB(skb)->flags & IP6SKB_XFRM_TRANSFORMED) && |
5439 | xfrm_decode_session(skb, flowi6_to_flowi(&fl6), AF_INET6) == 0) { |
5440 | skb_dst_set(skb, NULL); |
5441 | - dst = xfrm_lookup(net, dst, flowi6_to_flowi(&fl6), skb->sk, 0); |
5442 | + dst = xfrm_lookup(net, dst, flowi6_to_flowi(&fl6), sk, 0); |
5443 | if (IS_ERR(dst)) |
5444 | return PTR_ERR(dst); |
5445 | skb_dst_set(skb, dst); |
5446 | diff --git a/net/ipv6/netfilter/ip6_tables.c b/net/ipv6/netfilter/ip6_tables.c |
5447 | index 01bd3ee5ebc6..a0a31972fc75 100644 |
5448 | --- a/net/ipv6/netfilter/ip6_tables.c |
5449 | +++ b/net/ipv6/netfilter/ip6_tables.c |
5450 | @@ -357,6 +357,10 @@ ip6t_do_table(struct sk_buff *skb, |
5451 | } |
5452 | if (table_base + v != ip6t_next_entry(e) && |
5453 | !(e->ipv6.flags & IP6T_F_GOTO)) { |
5454 | + if (unlikely(stackidx >= private->stacksize)) { |
5455 | + verdict = NF_DROP; |
5456 | + break; |
5457 | + } |
5458 | jumpstack[stackidx++] = e; |
5459 | } |
5460 | |
5461 | diff --git a/net/ipv6/netfilter/nf_nat_l3proto_ipv6.c b/net/ipv6/netfilter/nf_nat_l3proto_ipv6.c |
5462 | index 46d6dba50698..c5053dbfc391 100644 |
5463 | --- a/net/ipv6/netfilter/nf_nat_l3proto_ipv6.c |
5464 | +++ b/net/ipv6/netfilter/nf_nat_l3proto_ipv6.c |
5465 | @@ -99,6 +99,10 @@ static bool nf_nat_ipv6_manip_pkt(struct sk_buff *skb, |
5466 | !l4proto->manip_pkt(skb, &nf_nat_l3proto_ipv6, iphdroff, hdroff, |
5467 | target, maniptype)) |
5468 | return false; |
5469 | + |
5470 | + /* must reload, offset might have changed */ |
5471 | + ipv6h = (void *)skb->data + iphdroff; |
5472 | + |
5473 | manip_addr: |
5474 | if (maniptype == NF_NAT_MANIP_SRC) |
5475 | ipv6h->saddr = target->src.u3.in6; |
5476 | diff --git a/net/netfilter/nf_nat_proto_common.c b/net/netfilter/nf_nat_proto_common.c |
5477 | index fbce552a796e..7d7466dbf663 100644 |
5478 | --- a/net/netfilter/nf_nat_proto_common.c |
5479 | +++ b/net/netfilter/nf_nat_proto_common.c |
5480 | @@ -41,7 +41,7 @@ void nf_nat_l4proto_unique_tuple(const struct nf_nat_l3proto *l3proto, |
5481 | const struct nf_conn *ct, |
5482 | u16 *rover) |
5483 | { |
5484 | - unsigned int range_size, min, i; |
5485 | + unsigned int range_size, min, max, i; |
5486 | __be16 *portptr; |
5487 | u_int16_t off; |
5488 | |
5489 | @@ -71,7 +71,10 @@ void nf_nat_l4proto_unique_tuple(const struct nf_nat_l3proto *l3proto, |
5490 | } |
5491 | } else { |
5492 | min = ntohs(range->min_proto.all); |
5493 | - range_size = ntohs(range->max_proto.all) - min + 1; |
5494 | + max = ntohs(range->max_proto.all); |
5495 | + if (unlikely(max < min)) |
5496 | + swap(max, min); |
5497 | + range_size = max - min + 1; |
5498 | } |
5499 | |
5500 | if (range->flags & NF_NAT_RANGE_PROTO_RANDOM) { |
5501 | diff --git a/net/netfilter/xt_IDLETIMER.c b/net/netfilter/xt_IDLETIMER.c |
5502 | index daf45da448fa..bb5d6a058fb7 100644 |
5503 | --- a/net/netfilter/xt_IDLETIMER.c |
5504 | +++ b/net/netfilter/xt_IDLETIMER.c |
5505 | @@ -147,11 +147,11 @@ static int idletimer_tg_create(struct idletimer_tg_info *info) |
5506 | (unsigned long) info->timer); |
5507 | info->timer->refcnt = 1; |
5508 | |
5509 | + INIT_WORK(&info->timer->work, idletimer_tg_work); |
5510 | + |
5511 | mod_timer(&info->timer->timer, |
5512 | msecs_to_jiffies(info->timeout * 1000) + jiffies); |
5513 | |
5514 | - INIT_WORK(&info->timer->work, idletimer_tg_work); |
5515 | - |
5516 | return 0; |
5517 | |
5518 | out_free_attr: |
5519 | @@ -192,7 +192,10 @@ static int idletimer_tg_checkentry(const struct xt_tgchk_param *par) |
5520 | pr_debug("timeout value is zero\n"); |
5521 | return -EINVAL; |
5522 | } |
5523 | - |
5524 | + if (info->timeout >= INT_MAX / 1000) { |
5525 | + pr_debug("timeout value is too big\n"); |
5526 | + return -EINVAL; |
5527 | + } |
5528 | if (info->label[0] == '\0' || |
5529 | strnlen(info->label, |
5530 | MAX_IDLETIMER_LABEL_SIZE) == MAX_IDLETIMER_LABEL_SIZE) { |
5531 | diff --git a/net/netfilter/xt_LED.c b/net/netfilter/xt_LED.c |
5532 | index 3ba31c194cce..0858fe17e14a 100644 |
5533 | --- a/net/netfilter/xt_LED.c |
5534 | +++ b/net/netfilter/xt_LED.c |
5535 | @@ -141,10 +141,11 @@ static int led_tg_check(const struct xt_tgchk_param *par) |
5536 | goto exit_alloc; |
5537 | } |
5538 | |
5539 | - /* See if we need to set up a timer */ |
5540 | - if (ledinfo->delay > 0) |
5541 | - setup_timer(&ledinternal->timer, led_timeout_callback, |
5542 | - (unsigned long)ledinternal); |
5543 | + /* Since the letinternal timer can be shared between multiple targets, |
5544 | + * always set it up, even if the current target does not need it |
5545 | + */ |
5546 | + setup_timer(&ledinternal->timer, led_timeout_callback, |
5547 | + (unsigned long)ledinternal); |
5548 | |
5549 | list_add_tail(&ledinternal->list, &xt_led_triggers); |
5550 | |
5551 | @@ -181,8 +182,7 @@ static void led_tg_destroy(const struct xt_tgdtor_param *par) |
5552 | |
5553 | list_del(&ledinternal->list); |
5554 | |
5555 | - if (ledinfo->delay > 0) |
5556 | - del_timer_sync(&ledinternal->timer); |
5557 | + del_timer_sync(&ledinternal->timer); |
5558 | |
5559 | led_trigger_unregister(&ledinternal->netfilter_led_trigger); |
5560 | |
5561 | diff --git a/net/netfilter/xt_hashlimit.c b/net/netfilter/xt_hashlimit.c |
5562 | index 5da8746f7b88..b8a3e740ffd4 100644 |
5563 | --- a/net/netfilter/xt_hashlimit.c |
5564 | +++ b/net/netfilter/xt_hashlimit.c |
5565 | @@ -774,7 +774,7 @@ hashlimit_mt_common(const struct sk_buff *skb, struct xt_action_param *par, |
5566 | if (!dh->rateinfo.prev_window && |
5567 | (dh->rateinfo.current_rate <= dh->rateinfo.burst)) { |
5568 | spin_unlock(&dh->lock); |
5569 | - rcu_read_unlock_bh(); |
5570 | + local_bh_enable(); |
5571 | return !(cfg->mode & XT_HASHLIMIT_INVERT); |
5572 | } else { |
5573 | goto overlimit; |
5574 | diff --git a/net/smc/af_smc.c b/net/smc/af_smc.c |
5575 | index 745f145d4c4d..a6d604fd9695 100644 |
5576 | --- a/net/smc/af_smc.c |
5577 | +++ b/net/smc/af_smc.c |
5578 | @@ -1351,8 +1351,10 @@ static int smc_create(struct net *net, struct socket *sock, int protocol, |
5579 | smc->use_fallback = false; /* assume rdma capability first */ |
5580 | rc = sock_create_kern(net, PF_INET, SOCK_STREAM, |
5581 | IPPROTO_TCP, &smc->clcsock); |
5582 | - if (rc) |
5583 | + if (rc) { |
5584 | sk_common_release(sk); |
5585 | + goto out; |
5586 | + } |
5587 | smc->sk.sk_sndbuf = max(smc->clcsock->sk->sk_sndbuf, SMC_BUF_MIN_SIZE); |
5588 | smc->sk.sk_rcvbuf = max(smc->clcsock->sk->sk_rcvbuf, SMC_BUF_MIN_SIZE); |
5589 | |
5590 | diff --git a/scripts/Makefile.build b/scripts/Makefile.build |
5591 | index 6bed45dc2cb1..7143da06d702 100644 |
5592 | --- a/scripts/Makefile.build |
5593 | +++ b/scripts/Makefile.build |
5594 | @@ -261,6 +261,8 @@ __objtool_obj := $(objtree)/tools/objtool/objtool |
5595 | |
5596 | objtool_args = $(if $(CONFIG_UNWINDER_ORC),orc generate,check) |
5597 | |
5598 | +objtool_args += $(if $(part-of-module), --module,) |
5599 | + |
5600 | ifndef CONFIG_FRAME_POINTER |
5601 | objtool_args += --no-fp |
5602 | endif |
5603 | @@ -269,6 +271,12 @@ objtool_args += --no-unreachable |
5604 | else |
5605 | objtool_args += $(call cc-ifversion, -lt, 0405, --no-unreachable) |
5606 | endif |
5607 | +ifdef CONFIG_RETPOLINE |
5608 | +ifneq ($(RETPOLINE_CFLAGS),) |
5609 | + objtool_args += --retpoline |
5610 | +endif |
5611 | +endif |
5612 | + |
5613 | |
5614 | ifdef CONFIG_MODVERSIONS |
5615 | objtool_o = $(@D)/.tmp_$(@F) |
5616 | diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib |
5617 | index 0b46136a91a8..aac94d962ed6 100644 |
5618 | --- a/scripts/Makefile.lib |
5619 | +++ b/scripts/Makefile.lib |
5620 | @@ -294,11 +294,11 @@ cmd_dt_S_dtb= \ |
5621 | echo '\#include <asm-generic/vmlinux.lds.h>'; \ |
5622 | echo '.section .dtb.init.rodata,"a"'; \ |
5623 | echo '.balign STRUCT_ALIGNMENT'; \ |
5624 | - echo '.global __dtb_$(*F)_begin'; \ |
5625 | - echo '__dtb_$(*F)_begin:'; \ |
5626 | + echo '.global __dtb_$(subst -,_,$(*F))_begin'; \ |
5627 | + echo '__dtb_$(subst -,_,$(*F))_begin:'; \ |
5628 | echo '.incbin "$<" '; \ |
5629 | - echo '__dtb_$(*F)_end:'; \ |
5630 | - echo '.global __dtb_$(*F)_end'; \ |
5631 | + echo '__dtb_$(subst -,_,$(*F))_end:'; \ |
5632 | + echo '.global __dtb_$(subst -,_,$(*F))_end'; \ |
5633 | echo '.balign STRUCT_ALIGNMENT'; \ |
5634 | ) > $@ |
5635 | |
5636 | diff --git a/sound/core/seq/seq_clientmgr.c b/sound/core/seq/seq_clientmgr.c |
5637 | index dea11d1babf5..1f3aa466ac9b 100644 |
5638 | --- a/sound/core/seq/seq_clientmgr.c |
5639 | +++ b/sound/core/seq/seq_clientmgr.c |
5640 | @@ -906,7 +906,8 @@ int snd_seq_dispatch_event(struct snd_seq_event_cell *cell, int atomic, int hop) |
5641 | static int snd_seq_client_enqueue_event(struct snd_seq_client *client, |
5642 | struct snd_seq_event *event, |
5643 | struct file *file, int blocking, |
5644 | - int atomic, int hop) |
5645 | + int atomic, int hop, |
5646 | + struct mutex *mutexp) |
5647 | { |
5648 | struct snd_seq_event_cell *cell; |
5649 | int err; |
5650 | @@ -944,7 +945,8 @@ static int snd_seq_client_enqueue_event(struct snd_seq_client *client, |
5651 | return -ENXIO; /* queue is not allocated */ |
5652 | |
5653 | /* allocate an event cell */ |
5654 | - err = snd_seq_event_dup(client->pool, event, &cell, !blocking || atomic, file); |
5655 | + err = snd_seq_event_dup(client->pool, event, &cell, !blocking || atomic, |
5656 | + file, mutexp); |
5657 | if (err < 0) |
5658 | return err; |
5659 | |
5660 | @@ -1013,12 +1015,11 @@ static ssize_t snd_seq_write(struct file *file, const char __user *buf, |
5661 | return -ENXIO; |
5662 | |
5663 | /* allocate the pool now if the pool is not allocated yet */ |
5664 | + mutex_lock(&client->ioctl_mutex); |
5665 | if (client->pool->size > 0 && !snd_seq_write_pool_allocated(client)) { |
5666 | - mutex_lock(&client->ioctl_mutex); |
5667 | err = snd_seq_pool_init(client->pool); |
5668 | - mutex_unlock(&client->ioctl_mutex); |
5669 | if (err < 0) |
5670 | - return -ENOMEM; |
5671 | + goto out; |
5672 | } |
5673 | |
5674 | /* only process whole events */ |
5675 | @@ -1069,7 +1070,7 @@ static ssize_t snd_seq_write(struct file *file, const char __user *buf, |
5676 | /* ok, enqueue it */ |
5677 | err = snd_seq_client_enqueue_event(client, &event, file, |
5678 | !(file->f_flags & O_NONBLOCK), |
5679 | - 0, 0); |
5680 | + 0, 0, &client->ioctl_mutex); |
5681 | if (err < 0) |
5682 | break; |
5683 | |
5684 | @@ -1080,6 +1081,8 @@ static ssize_t snd_seq_write(struct file *file, const char __user *buf, |
5685 | written += len; |
5686 | } |
5687 | |
5688 | + out: |
5689 | + mutex_unlock(&client->ioctl_mutex); |
5690 | return written ? written : err; |
5691 | } |
5692 | |
5693 | @@ -1834,6 +1837,9 @@ static int snd_seq_ioctl_set_client_pool(struct snd_seq_client *client, |
5694 | (! snd_seq_write_pool_allocated(client) || |
5695 | info->output_pool != client->pool->size)) { |
5696 | if (snd_seq_write_pool_allocated(client)) { |
5697 | + /* is the pool in use? */ |
5698 | + if (atomic_read(&client->pool->counter)) |
5699 | + return -EBUSY; |
5700 | /* remove all existing cells */ |
5701 | snd_seq_pool_mark_closing(client->pool); |
5702 | snd_seq_queue_client_leave_cells(client->number); |
5703 | @@ -2256,7 +2262,8 @@ static int kernel_client_enqueue(int client, struct snd_seq_event *ev, |
5704 | if (! cptr->accept_output) |
5705 | result = -EPERM; |
5706 | else /* send it */ |
5707 | - result = snd_seq_client_enqueue_event(cptr, ev, file, blocking, atomic, hop); |
5708 | + result = snd_seq_client_enqueue_event(cptr, ev, file, blocking, |
5709 | + atomic, hop, NULL); |
5710 | |
5711 | snd_seq_client_unlock(cptr); |
5712 | return result; |
5713 | diff --git a/sound/core/seq/seq_fifo.c b/sound/core/seq/seq_fifo.c |
5714 | index a8c2822e0198..72c0302a55d2 100644 |
5715 | --- a/sound/core/seq/seq_fifo.c |
5716 | +++ b/sound/core/seq/seq_fifo.c |
5717 | @@ -125,7 +125,7 @@ int snd_seq_fifo_event_in(struct snd_seq_fifo *f, |
5718 | return -EINVAL; |
5719 | |
5720 | snd_use_lock_use(&f->use_lock); |
5721 | - err = snd_seq_event_dup(f->pool, event, &cell, 1, NULL); /* always non-blocking */ |
5722 | + err = snd_seq_event_dup(f->pool, event, &cell, 1, NULL, NULL); /* always non-blocking */ |
5723 | if (err < 0) { |
5724 | if ((err == -ENOMEM) || (err == -EAGAIN)) |
5725 | atomic_inc(&f->overflow); |
5726 | diff --git a/sound/core/seq/seq_memory.c b/sound/core/seq/seq_memory.c |
5727 | index f763682584a8..ab1112e90f88 100644 |
5728 | --- a/sound/core/seq/seq_memory.c |
5729 | +++ b/sound/core/seq/seq_memory.c |
5730 | @@ -220,7 +220,8 @@ void snd_seq_cell_free(struct snd_seq_event_cell * cell) |
5731 | */ |
5732 | static int snd_seq_cell_alloc(struct snd_seq_pool *pool, |
5733 | struct snd_seq_event_cell **cellp, |
5734 | - int nonblock, struct file *file) |
5735 | + int nonblock, struct file *file, |
5736 | + struct mutex *mutexp) |
5737 | { |
5738 | struct snd_seq_event_cell *cell; |
5739 | unsigned long flags; |
5740 | @@ -244,7 +245,11 @@ static int snd_seq_cell_alloc(struct snd_seq_pool *pool, |
5741 | set_current_state(TASK_INTERRUPTIBLE); |
5742 | add_wait_queue(&pool->output_sleep, &wait); |
5743 | spin_unlock_irq(&pool->lock); |
5744 | + if (mutexp) |
5745 | + mutex_unlock(mutexp); |
5746 | schedule(); |
5747 | + if (mutexp) |
5748 | + mutex_lock(mutexp); |
5749 | spin_lock_irq(&pool->lock); |
5750 | remove_wait_queue(&pool->output_sleep, &wait); |
5751 | /* interrupted? */ |
5752 | @@ -287,7 +292,7 @@ static int snd_seq_cell_alloc(struct snd_seq_pool *pool, |
5753 | */ |
5754 | int snd_seq_event_dup(struct snd_seq_pool *pool, struct snd_seq_event *event, |
5755 | struct snd_seq_event_cell **cellp, int nonblock, |
5756 | - struct file *file) |
5757 | + struct file *file, struct mutex *mutexp) |
5758 | { |
5759 | int ncells, err; |
5760 | unsigned int extlen; |
5761 | @@ -304,7 +309,7 @@ int snd_seq_event_dup(struct snd_seq_pool *pool, struct snd_seq_event *event, |
5762 | if (ncells >= pool->total_elements) |
5763 | return -ENOMEM; |
5764 | |
5765 | - err = snd_seq_cell_alloc(pool, &cell, nonblock, file); |
5766 | + err = snd_seq_cell_alloc(pool, &cell, nonblock, file, mutexp); |
5767 | if (err < 0) |
5768 | return err; |
5769 | |
5770 | @@ -330,7 +335,8 @@ int snd_seq_event_dup(struct snd_seq_pool *pool, struct snd_seq_event *event, |
5771 | int size = sizeof(struct snd_seq_event); |
5772 | if (len < size) |
5773 | size = len; |
5774 | - err = snd_seq_cell_alloc(pool, &tmp, nonblock, file); |
5775 | + err = snd_seq_cell_alloc(pool, &tmp, nonblock, file, |
5776 | + mutexp); |
5777 | if (err < 0) |
5778 | goto __error; |
5779 | if (cell->event.data.ext.ptr == NULL) |
5780 | diff --git a/sound/core/seq/seq_memory.h b/sound/core/seq/seq_memory.h |
5781 | index 32f959c17786..3abe306c394a 100644 |
5782 | --- a/sound/core/seq/seq_memory.h |
5783 | +++ b/sound/core/seq/seq_memory.h |
5784 | @@ -66,7 +66,8 @@ struct snd_seq_pool { |
5785 | void snd_seq_cell_free(struct snd_seq_event_cell *cell); |
5786 | |
5787 | int snd_seq_event_dup(struct snd_seq_pool *pool, struct snd_seq_event *event, |
5788 | - struct snd_seq_event_cell **cellp, int nonblock, struct file *file); |
5789 | + struct snd_seq_event_cell **cellp, int nonblock, |
5790 | + struct file *file, struct mutex *mutexp); |
5791 | |
5792 | /* return number of unused (free) cells */ |
5793 | static inline int snd_seq_unused_cells(struct snd_seq_pool *pool) |
5794 | diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c |
5795 | index 37e1cf8218ff..5b4dbcec6de8 100644 |
5796 | --- a/sound/pci/hda/patch_conexant.c |
5797 | +++ b/sound/pci/hda/patch_conexant.c |
5798 | @@ -957,6 +957,8 @@ static const struct snd_pci_quirk cxt5066_fixups[] = { |
5799 | SND_PCI_QUIRK(0x1025, 0x054c, "Acer Aspire 3830TG", CXT_FIXUP_ASPIRE_DMIC), |
5800 | SND_PCI_QUIRK(0x1025, 0x054f, "Acer Aspire 4830T", CXT_FIXUP_ASPIRE_DMIC), |
5801 | SND_PCI_QUIRK(0x103c, 0x8079, "HP EliteBook 840 G3", CXT_FIXUP_HP_DOCK), |
5802 | + SND_PCI_QUIRK(0x103c, 0x807C, "HP EliteBook 820 G3", CXT_FIXUP_HP_DOCK), |
5803 | + SND_PCI_QUIRK(0x103c, 0x80FD, "HP ProBook 640 G2", CXT_FIXUP_HP_DOCK), |
5804 | SND_PCI_QUIRK(0x103c, 0x8174, "HP Spectre x360", CXT_FIXUP_HP_SPECTRE), |
5805 | SND_PCI_QUIRK(0x103c, 0x8115, "HP Z1 Gen3", CXT_FIXUP_HP_GATE_MIC), |
5806 | SND_PCI_QUIRK(0x103c, 0x814f, "HP ZBook 15u G3", CXT_FIXUP_MUTE_LED_GPIO), |
5807 | diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c |
5808 | index 454476b47b79..3d19efd2783a 100644 |
5809 | --- a/sound/pci/hda/patch_realtek.c |
5810 | +++ b/sound/pci/hda/patch_realtek.c |
5811 | @@ -5129,6 +5129,16 @@ static void alc298_fixup_speaker_volume(struct hda_codec *codec, |
5812 | } |
5813 | } |
5814 | |
5815 | +/* disable DAC3 (0x06) selection on NID 0x17 as it has no volume amp control */ |
5816 | +static void alc295_fixup_disable_dac3(struct hda_codec *codec, |
5817 | + const struct hda_fixup *fix, int action) |
5818 | +{ |
5819 | + if (action == HDA_FIXUP_ACT_PRE_PROBE) { |
5820 | + hda_nid_t conn[2] = { 0x02, 0x03 }; |
5821 | + snd_hda_override_conn_list(codec, 0x17, 2, conn); |
5822 | + } |
5823 | +} |
5824 | + |
5825 | /* Hook to update amp GPIO4 for automute */ |
5826 | static void alc280_hp_gpio4_automute_hook(struct hda_codec *codec, |
5827 | struct hda_jack_callback *jack) |
5828 | @@ -5321,6 +5331,7 @@ enum { |
5829 | ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY, |
5830 | ALC255_FIXUP_DELL_SPK_NOISE, |
5831 | ALC225_FIXUP_DELL1_MIC_NO_PRESENCE, |
5832 | + ALC295_FIXUP_DISABLE_DAC3, |
5833 | ALC280_FIXUP_HP_HEADSET_MIC, |
5834 | ALC221_FIXUP_HP_FRONT_MIC, |
5835 | ALC292_FIXUP_TPT460, |
5836 | @@ -5335,10 +5346,12 @@ enum { |
5837 | ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE, |
5838 | ALC233_FIXUP_LENOVO_MULTI_CODECS, |
5839 | ALC294_FIXUP_LENOVO_MIC_LOCATION, |
5840 | + ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE, |
5841 | ALC700_FIXUP_INTEL_REFERENCE, |
5842 | ALC274_FIXUP_DELL_BIND_DACS, |
5843 | ALC274_FIXUP_DELL_AIO_LINEOUT_VERB, |
5844 | ALC298_FIXUP_TPT470_DOCK, |
5845 | + ALC255_FIXUP_DUMMY_LINEOUT_VERB, |
5846 | }; |
5847 | |
5848 | static const struct hda_fixup alc269_fixups[] = { |
5849 | @@ -6053,6 +6066,10 @@ static const struct hda_fixup alc269_fixups[] = { |
5850 | .chained = true, |
5851 | .chain_id = ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE, |
5852 | }, |
5853 | + [ALC295_FIXUP_DISABLE_DAC3] = { |
5854 | + .type = HDA_FIXUP_FUNC, |
5855 | + .v.func = alc295_fixup_disable_dac3, |
5856 | + }, |
5857 | [ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER] = { |
5858 | .type = HDA_FIXUP_PINS, |
5859 | .v.pins = (const struct hda_pintbl[]) { |
5860 | @@ -6138,6 +6155,18 @@ static const struct hda_fixup alc269_fixups[] = { |
5861 | { } |
5862 | }, |
5863 | }, |
5864 | + [ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE] = { |
5865 | + .type = HDA_FIXUP_PINS, |
5866 | + .v.pins = (const struct hda_pintbl[]) { |
5867 | + { 0x16, 0x0101102f }, /* Rear Headset HP */ |
5868 | + { 0x19, 0x02a1913c }, /* use as Front headset mic, without its own jack detect */ |
5869 | + { 0x1a, 0x01a19030 }, /* Rear Headset MIC */ |
5870 | + { 0x1b, 0x02011020 }, |
5871 | + { } |
5872 | + }, |
5873 | + .chained = true, |
5874 | + .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC |
5875 | + }, |
5876 | [ALC700_FIXUP_INTEL_REFERENCE] = { |
5877 | .type = HDA_FIXUP_VERBS, |
5878 | .v.verbs = (const struct hda_verb[]) { |
5879 | @@ -6174,6 +6203,15 @@ static const struct hda_fixup alc269_fixups[] = { |
5880 | .chained = true, |
5881 | .chain_id = ALC293_FIXUP_LENOVO_SPK_NOISE |
5882 | }, |
5883 | + [ALC255_FIXUP_DUMMY_LINEOUT_VERB] = { |
5884 | + .type = HDA_FIXUP_PINS, |
5885 | + .v.pins = (const struct hda_pintbl[]) { |
5886 | + { 0x14, 0x0201101f }, |
5887 | + { } |
5888 | + }, |
5889 | + .chained = true, |
5890 | + .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE |
5891 | + }, |
5892 | }; |
5893 | |
5894 | static const struct snd_pci_quirk alc269_fixup_tbl[] = { |
5895 | @@ -6222,10 +6260,13 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { |
5896 | SND_PCI_QUIRK(0x1028, 0x0725, "Dell Inspiron 3162", ALC255_FIXUP_DELL_SPK_NOISE), |
5897 | SND_PCI_QUIRK(0x1028, 0x075b, "Dell XPS 13 9360", ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE), |
5898 | SND_PCI_QUIRK(0x1028, 0x075d, "Dell AIO", ALC298_FIXUP_SPK_VOLUME), |
5899 | + SND_PCI_QUIRK(0x1028, 0x07b0, "Dell Precision 7520", ALC295_FIXUP_DISABLE_DAC3), |
5900 | SND_PCI_QUIRK(0x1028, 0x0798, "Dell Inspiron 17 7000 Gaming", ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER), |
5901 | + SND_PCI_QUIRK(0x1028, 0x080c, "Dell WYSE", ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE), |
5902 | SND_PCI_QUIRK(0x1028, 0x082a, "Dell XPS 13 9360", ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE), |
5903 | SND_PCI_QUIRK(0x1028, 0x084b, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB), |
5904 | SND_PCI_QUIRK(0x1028, 0x084e, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB), |
5905 | + SND_PCI_QUIRK(0x1028, 0x0873, "Dell Precision 3930", ALC255_FIXUP_DUMMY_LINEOUT_VERB), |
5906 | SND_PCI_QUIRK(0x1028, 0x164a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), |
5907 | SND_PCI_QUIRK(0x1028, 0x164b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), |
5908 | SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2), |
5909 | @@ -6363,9 +6404,11 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { |
5910 | SND_PCI_QUIRK(0x17aa, 0x2245, "Thinkpad T470", ALC298_FIXUP_TPT470_DOCK), |
5911 | SND_PCI_QUIRK(0x17aa, 0x2246, "Thinkpad", ALC298_FIXUP_TPT470_DOCK), |
5912 | SND_PCI_QUIRK(0x17aa, 0x2247, "Thinkpad", ALC298_FIXUP_TPT470_DOCK), |
5913 | + SND_PCI_QUIRK(0x17aa, 0x2249, "Thinkpad", ALC292_FIXUP_TPT460), |
5914 | SND_PCI_QUIRK(0x17aa, 0x224b, "Thinkpad", ALC298_FIXUP_TPT470_DOCK), |
5915 | SND_PCI_QUIRK(0x17aa, 0x224c, "Thinkpad", ALC298_FIXUP_TPT470_DOCK), |
5916 | SND_PCI_QUIRK(0x17aa, 0x224d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK), |
5917 | + SND_PCI_QUIRK(0x17aa, 0x225d, "Thinkpad T480", ALC269_FIXUP_LIMIT_INT_MIC_BOOST), |
5918 | SND_PCI_QUIRK(0x17aa, 0x30bb, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY), |
5919 | SND_PCI_QUIRK(0x17aa, 0x30e2, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY), |
5920 | SND_PCI_QUIRK(0x17aa, 0x310c, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION), |
5921 | @@ -6722,7 +6765,7 @@ static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = { |
5922 | {0x12, 0x90a60120}, |
5923 | {0x14, 0x90170110}, |
5924 | {0x21, 0x0321101f}), |
5925 | - SND_HDA_PIN_QUIRK(0x10ec0289, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE, |
5926 | + SND_HDA_PIN_QUIRK(0x10ec0289, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE, |
5927 | {0x12, 0xb7a60130}, |
5928 | {0x14, 0x90170110}, |
5929 | {0x21, 0x04211020}), |
5930 | diff --git a/sound/soc/intel/boards/kbl_rt5663_rt5514_max98927.c b/sound/soc/intel/boards/kbl_rt5663_rt5514_max98927.c |
5931 | index 88ff54220007..69ab55956492 100644 |
5932 | --- a/sound/soc/intel/boards/kbl_rt5663_rt5514_max98927.c |
5933 | +++ b/sound/soc/intel/boards/kbl_rt5663_rt5514_max98927.c |
5934 | @@ -604,6 +604,8 @@ static int kabylake_card_late_probe(struct snd_soc_card *card) |
5935 | |
5936 | list_for_each_entry(pcm, &ctx->hdmi_pcm_list, head) { |
5937 | codec = pcm->codec_dai->codec; |
5938 | + snprintf(jack_name, sizeof(jack_name), |
5939 | + "HDMI/DP,pcm=%d Jack", pcm->device); |
5940 | err = snd_soc_card_jack_new(card, jack_name, |
5941 | SND_JACK_AVOUT, &ctx->kabylake_hdmi[i], |
5942 | NULL, 0); |
5943 | diff --git a/tools/objtool/builtin-check.c b/tools/objtool/builtin-check.c |
5944 | index 57254f5b2779..694abc628e9b 100644 |
5945 | --- a/tools/objtool/builtin-check.c |
5946 | +++ b/tools/objtool/builtin-check.c |
5947 | @@ -29,7 +29,7 @@ |
5948 | #include "builtin.h" |
5949 | #include "check.h" |
5950 | |
5951 | -bool no_fp, no_unreachable; |
5952 | +bool no_fp, no_unreachable, retpoline, module; |
5953 | |
5954 | static const char * const check_usage[] = { |
5955 | "objtool check [<options>] file.o", |
5956 | @@ -39,6 +39,8 @@ static const char * const check_usage[] = { |
5957 | const struct option check_options[] = { |
5958 | OPT_BOOLEAN('f', "no-fp", &no_fp, "Skip frame pointer validation"), |
5959 | OPT_BOOLEAN('u', "no-unreachable", &no_unreachable, "Skip 'unreachable instruction' warnings"), |
5960 | + OPT_BOOLEAN('r', "retpoline", &retpoline, "Validate retpoline assumptions"), |
5961 | + OPT_BOOLEAN('m', "module", &module, "Indicates the object will be part of a kernel module"), |
5962 | OPT_END(), |
5963 | }; |
5964 | |
5965 | @@ -53,5 +55,5 @@ int cmd_check(int argc, const char **argv) |
5966 | |
5967 | objname = argv[0]; |
5968 | |
5969 | - return check(objname, no_fp, no_unreachable, false); |
5970 | + return check(objname, false); |
5971 | } |
5972 | diff --git a/tools/objtool/builtin-orc.c b/tools/objtool/builtin-orc.c |
5973 | index 91e8e19ff5e0..77ea2b97117d 100644 |
5974 | --- a/tools/objtool/builtin-orc.c |
5975 | +++ b/tools/objtool/builtin-orc.c |
5976 | @@ -25,7 +25,6 @@ |
5977 | */ |
5978 | |
5979 | #include <string.h> |
5980 | -#include <subcmd/parse-options.h> |
5981 | #include "builtin.h" |
5982 | #include "check.h" |
5983 | |
5984 | @@ -36,9 +35,6 @@ static const char *orc_usage[] = { |
5985 | NULL, |
5986 | }; |
5987 | |
5988 | -extern const struct option check_options[]; |
5989 | -extern bool no_fp, no_unreachable; |
5990 | - |
5991 | int cmd_orc(int argc, const char **argv) |
5992 | { |
5993 | const char *objname; |
5994 | @@ -54,7 +50,7 @@ int cmd_orc(int argc, const char **argv) |
5995 | |
5996 | objname = argv[0]; |
5997 | |
5998 | - return check(objname, no_fp, no_unreachable, true); |
5999 | + return check(objname, true); |
6000 | } |
6001 | |
6002 | if (!strcmp(argv[0], "dump")) { |
6003 | diff --git a/tools/objtool/builtin.h b/tools/objtool/builtin.h |
6004 | index dd526067fed5..28ff40e19a14 100644 |
6005 | --- a/tools/objtool/builtin.h |
6006 | +++ b/tools/objtool/builtin.h |
6007 | @@ -17,6 +17,11 @@ |
6008 | #ifndef _BUILTIN_H |
6009 | #define _BUILTIN_H |
6010 | |
6011 | +#include <subcmd/parse-options.h> |
6012 | + |
6013 | +extern const struct option check_options[]; |
6014 | +extern bool no_fp, no_unreachable, retpoline, module; |
6015 | + |
6016 | extern int cmd_check(int argc, const char **argv); |
6017 | extern int cmd_orc(int argc, const char **argv); |
6018 | |
6019 | diff --git a/tools/objtool/check.c b/tools/objtool/check.c |
6020 | index c7fb5c2392ee..9d01d0b1084e 100644 |
6021 | --- a/tools/objtool/check.c |
6022 | +++ b/tools/objtool/check.c |
6023 | @@ -18,6 +18,7 @@ |
6024 | #include <string.h> |
6025 | #include <stdlib.h> |
6026 | |
6027 | +#include "builtin.h" |
6028 | #include "check.h" |
6029 | #include "elf.h" |
6030 | #include "special.h" |
6031 | @@ -33,7 +34,6 @@ struct alternative { |
6032 | }; |
6033 | |
6034 | const char *objname; |
6035 | -static bool no_fp; |
6036 | struct cfi_state initial_func_cfi; |
6037 | |
6038 | struct instruction *find_insn(struct objtool_file *file, |
6039 | @@ -496,6 +496,7 @@ static int add_jump_destinations(struct objtool_file *file) |
6040 | * disguise, so convert them accordingly. |
6041 | */ |
6042 | insn->type = INSN_JUMP_DYNAMIC; |
6043 | + insn->retpoline_safe = true; |
6044 | continue; |
6045 | } else { |
6046 | /* sibling call */ |
6047 | @@ -547,7 +548,8 @@ static int add_call_destinations(struct objtool_file *file) |
6048 | if (!insn->call_dest && !insn->ignore) { |
6049 | WARN_FUNC("unsupported intra-function call", |
6050 | insn->sec, insn->offset); |
6051 | - WARN("If this is a retpoline, please patch it in with alternatives and annotate it with ANNOTATE_NOSPEC_ALTERNATIVE."); |
6052 | + if (retpoline) |
6053 | + WARN("If this is a retpoline, please patch it in with alternatives and annotate it with ANNOTATE_NOSPEC_ALTERNATIVE."); |
6054 | return -1; |
6055 | } |
6056 | |
6057 | @@ -922,7 +924,11 @@ static struct rela *find_switch_table(struct objtool_file *file, |
6058 | if (find_symbol_containing(file->rodata, text_rela->addend)) |
6059 | continue; |
6060 | |
6061 | - return find_rela_by_dest(file->rodata, text_rela->addend); |
6062 | + rodata_rela = find_rela_by_dest(file->rodata, text_rela->addend); |
6063 | + if (!rodata_rela) |
6064 | + continue; |
6065 | + |
6066 | + return rodata_rela; |
6067 | } |
6068 | |
6069 | return NULL; |
6070 | @@ -1107,6 +1113,41 @@ static int read_unwind_hints(struct objtool_file *file) |
6071 | return 0; |
6072 | } |
6073 | |
6074 | +static int read_retpoline_hints(struct objtool_file *file) |
6075 | +{ |
6076 | + struct section *sec; |
6077 | + struct instruction *insn; |
6078 | + struct rela *rela; |
6079 | + |
6080 | + sec = find_section_by_name(file->elf, ".rela.discard.retpoline_safe"); |
6081 | + if (!sec) |
6082 | + return 0; |
6083 | + |
6084 | + list_for_each_entry(rela, &sec->rela_list, list) { |
6085 | + if (rela->sym->type != STT_SECTION) { |
6086 | + WARN("unexpected relocation symbol type in %s", sec->name); |
6087 | + return -1; |
6088 | + } |
6089 | + |
6090 | + insn = find_insn(file, rela->sym->sec, rela->addend); |
6091 | + if (!insn) { |
6092 | + WARN("bad .discard.retpoline_safe entry"); |
6093 | + return -1; |
6094 | + } |
6095 | + |
6096 | + if (insn->type != INSN_JUMP_DYNAMIC && |
6097 | + insn->type != INSN_CALL_DYNAMIC) { |
6098 | + WARN_FUNC("retpoline_safe hint not an indirect jump/call", |
6099 | + insn->sec, insn->offset); |
6100 | + return -1; |
6101 | + } |
6102 | + |
6103 | + insn->retpoline_safe = true; |
6104 | + } |
6105 | + |
6106 | + return 0; |
6107 | +} |
6108 | + |
6109 | static int decode_sections(struct objtool_file *file) |
6110 | { |
6111 | int ret; |
6112 | @@ -1145,6 +1186,10 @@ static int decode_sections(struct objtool_file *file) |
6113 | if (ret) |
6114 | return ret; |
6115 | |
6116 | + ret = read_retpoline_hints(file); |
6117 | + if (ret) |
6118 | + return ret; |
6119 | + |
6120 | return 0; |
6121 | } |
6122 | |
6123 | @@ -1890,6 +1935,38 @@ static int validate_unwind_hints(struct objtool_file *file) |
6124 | return warnings; |
6125 | } |
6126 | |
6127 | +static int validate_retpoline(struct objtool_file *file) |
6128 | +{ |
6129 | + struct instruction *insn; |
6130 | + int warnings = 0; |
6131 | + |
6132 | + for_each_insn(file, insn) { |
6133 | + if (insn->type != INSN_JUMP_DYNAMIC && |
6134 | + insn->type != INSN_CALL_DYNAMIC) |
6135 | + continue; |
6136 | + |
6137 | + if (insn->retpoline_safe) |
6138 | + continue; |
6139 | + |
6140 | + /* |
6141 | + * .init.text code is ran before userspace and thus doesn't |
6142 | + * strictly need retpolines, except for modules which are |
6143 | + * loaded late, they very much do need retpoline in their |
6144 | + * .init.text |
6145 | + */ |
6146 | + if (!strcmp(insn->sec->name, ".init.text") && !module) |
6147 | + continue; |
6148 | + |
6149 | + WARN_FUNC("indirect %s found in RETPOLINE build", |
6150 | + insn->sec, insn->offset, |
6151 | + insn->type == INSN_JUMP_DYNAMIC ? "jump" : "call"); |
6152 | + |
6153 | + warnings++; |
6154 | + } |
6155 | + |
6156 | + return warnings; |
6157 | +} |
6158 | + |
6159 | static bool is_kasan_insn(struct instruction *insn) |
6160 | { |
6161 | return (insn->type == INSN_CALL && |
6162 | @@ -2021,13 +2098,12 @@ static void cleanup(struct objtool_file *file) |
6163 | elf_close(file->elf); |
6164 | } |
6165 | |
6166 | -int check(const char *_objname, bool _no_fp, bool no_unreachable, bool orc) |
6167 | +int check(const char *_objname, bool orc) |
6168 | { |
6169 | struct objtool_file file; |
6170 | int ret, warnings = 0; |
6171 | |
6172 | objname = _objname; |
6173 | - no_fp = _no_fp; |
6174 | |
6175 | file.elf = elf_open(objname, orc ? O_RDWR : O_RDONLY); |
6176 | if (!file.elf) |
6177 | @@ -2051,6 +2127,13 @@ int check(const char *_objname, bool _no_fp, bool no_unreachable, bool orc) |
6178 | if (list_empty(&file.insn_list)) |
6179 | goto out; |
6180 | |
6181 | + if (retpoline) { |
6182 | + ret = validate_retpoline(&file); |
6183 | + if (ret < 0) |
6184 | + return ret; |
6185 | + warnings += ret; |
6186 | + } |
6187 | + |
6188 | ret = validate_functions(&file); |
6189 | if (ret < 0) |
6190 | goto out; |
6191 | diff --git a/tools/objtool/check.h b/tools/objtool/check.h |
6192 | index 23a1d065cae1..c6b68fcb926f 100644 |
6193 | --- a/tools/objtool/check.h |
6194 | +++ b/tools/objtool/check.h |
6195 | @@ -45,6 +45,7 @@ struct instruction { |
6196 | unsigned char type; |
6197 | unsigned long immediate; |
6198 | bool alt_group, visited, dead_end, ignore, hint, save, restore, ignore_alts; |
6199 | + bool retpoline_safe; |
6200 | struct symbol *call_dest; |
6201 | struct instruction *jump_dest; |
6202 | struct instruction *first_jump_src; |
6203 | @@ -63,7 +64,7 @@ struct objtool_file { |
6204 | bool ignore_unreachables, c_file, hints; |
6205 | }; |
6206 | |
6207 | -int check(const char *objname, bool no_fp, bool no_unreachable, bool orc); |
6208 | +int check(const char *objname, bool orc); |
6209 | |
6210 | struct instruction *find_insn(struct objtool_file *file, |
6211 | struct section *sec, unsigned long offset); |
6212 | diff --git a/tools/perf/util/trigger.h b/tools/perf/util/trigger.h |
6213 | index 370138e7e35c..88223bc7c82b 100644 |
6214 | --- a/tools/perf/util/trigger.h |
6215 | +++ b/tools/perf/util/trigger.h |
6216 | @@ -12,7 +12,7 @@ |
6217 | * States and transits: |
6218 | * |
6219 | * |
6220 | - * OFF--(on)--> READY --(hit)--> HIT |
6221 | + * OFF--> ON --> READY --(hit)--> HIT |
6222 | * ^ | |
6223 | * | (ready) |
6224 | * | | |
6225 | @@ -27,8 +27,9 @@ struct trigger { |
6226 | volatile enum { |
6227 | TRIGGER_ERROR = -2, |
6228 | TRIGGER_OFF = -1, |
6229 | - TRIGGER_READY = 0, |
6230 | - TRIGGER_HIT = 1, |
6231 | + TRIGGER_ON = 0, |
6232 | + TRIGGER_READY = 1, |
6233 | + TRIGGER_HIT = 2, |
6234 | } state; |
6235 | const char *name; |
6236 | }; |
6237 | @@ -50,7 +51,7 @@ static inline bool trigger_is_error(struct trigger *t) |
6238 | static inline void trigger_on(struct trigger *t) |
6239 | { |
6240 | TRIGGER_WARN_ONCE(t, TRIGGER_OFF); |
6241 | - t->state = TRIGGER_READY; |
6242 | + t->state = TRIGGER_ON; |
6243 | } |
6244 | |
6245 | static inline void trigger_ready(struct trigger *t) |