Contents of /trunk/kernel-alx/patches-5.4/0123-5.4.24-all-fixes.patch
Parent Directory | Revision Log
Revision 3504 -
(show annotations)
(download)
Mon May 11 14:36:25 2020 UTC (4 years, 4 months ago) by niro
File size: 291670 byte(s)
Mon May 11 14:36:25 2020 UTC (4 years, 4 months ago) by niro
File size: 291670 byte(s)
-linux-5.4.24
1 | diff --git a/Documentation/kbuild/makefiles.rst b/Documentation/kbuild/makefiles.rst |
2 | index b89c88168d6a..b9b50553bfc5 100644 |
3 | --- a/Documentation/kbuild/makefiles.rst |
4 | +++ b/Documentation/kbuild/makefiles.rst |
5 | @@ -1115,23 +1115,6 @@ When kbuild executes, the following steps are followed (roughly): |
6 | In this example, extra-y is used to list object files that |
7 | shall be built, but shall not be linked as part of built-in.a. |
8 | |
9 | - header-test-y |
10 | - |
11 | - header-test-y specifies headers (`*.h`) in the current directory that |
12 | - should be compile tested to ensure they are self-contained, |
13 | - i.e. compilable as standalone units. If CONFIG_HEADER_TEST is enabled, |
14 | - this builds them as part of extra-y. |
15 | - |
16 | - header-test-pattern-y |
17 | - |
18 | - This works as a weaker version of header-test-y, and accepts wildcard |
19 | - patterns. The typical usage is:: |
20 | - |
21 | - header-test-pattern-y += *.h |
22 | - |
23 | - This specifies all the files that matches to `*.h` in the current |
24 | - directory, but the files in 'header-test-' are excluded. |
25 | - |
26 | 6.7 Commands useful for building a boot image |
27 | --------------------------------------------- |
28 | |
29 | diff --git a/Documentation/networking/nf_flowtable.txt b/Documentation/networking/nf_flowtable.txt |
30 | index ca2136c76042..0bf32d1121be 100644 |
31 | --- a/Documentation/networking/nf_flowtable.txt |
32 | +++ b/Documentation/networking/nf_flowtable.txt |
33 | @@ -76,7 +76,7 @@ flowtable and add one rule to your forward chain. |
34 | |
35 | table inet x { |
36 | flowtable f { |
37 | - hook ingress priority 0 devices = { eth0, eth1 }; |
38 | + hook ingress priority 0; devices = { eth0, eth1 }; |
39 | } |
40 | chain y { |
41 | type filter hook forward priority 0; policy accept; |
42 | diff --git a/Makefile b/Makefile |
43 | index af5e90075514..c32c78cf2fe5 100644 |
44 | --- a/Makefile |
45 | +++ b/Makefile |
46 | @@ -1,7 +1,7 @@ |
47 | # SPDX-License-Identifier: GPL-2.0 |
48 | VERSION = 5 |
49 | PATCHLEVEL = 4 |
50 | -SUBLEVEL = 23 |
51 | +SUBLEVEL = 24 |
52 | EXTRAVERSION = |
53 | NAME = Kleptomaniac Octopus |
54 | |
55 | @@ -618,7 +618,6 @@ ifeq ($(KBUILD_EXTMOD),) |
56 | init-y := init/ |
57 | drivers-y := drivers/ sound/ |
58 | drivers-$(CONFIG_SAMPLES) += samples/ |
59 | -drivers-$(CONFIG_KERNEL_HEADER_TEST) += include/ |
60 | net-y := net/ |
61 | libs-y := lib/ |
62 | core-y := usr/ |
63 | @@ -1196,19 +1195,15 @@ headers: $(version_h) scripts_unifdef uapi-asm-generic archheaders archscripts |
64 | $(Q)$(MAKE) $(hdr-inst)=include/uapi |
65 | $(Q)$(MAKE) $(hdr-inst)=arch/$(SRCARCH)/include/uapi |
66 | |
67 | +# Deprecated. It is no-op now. |
68 | PHONY += headers_check |
69 | -headers_check: headers |
70 | - $(Q)$(MAKE) $(hdr-inst)=include/uapi HDRCHECK=1 |
71 | - $(Q)$(MAKE) $(hdr-inst)=arch/$(SRCARCH)/include/uapi HDRCHECK=1 |
72 | +headers_check: |
73 | + @: |
74 | |
75 | ifdef CONFIG_HEADERS_INSTALL |
76 | prepare: headers |
77 | endif |
78 | |
79 | -ifdef CONFIG_HEADERS_CHECK |
80 | -all: headers_check |
81 | -endif |
82 | - |
83 | PHONY += scripts_unifdef |
84 | scripts_unifdef: scripts_basic |
85 | $(Q)$(MAKE) $(build)=scripts scripts/unifdef |
86 | @@ -1476,7 +1471,6 @@ help: |
87 | @echo ' versioncheck - Sanity check on version.h usage' |
88 | @echo ' includecheck - Check for duplicate included header files' |
89 | @echo ' export_report - List the usages of all exported symbols' |
90 | - @echo ' headers_check - Sanity check on exported headers' |
91 | @echo ' headerdep - Detect inclusion cycles in headers' |
92 | @echo ' coccicheck - Check with Coccinelle' |
93 | @echo '' |
94 | @@ -1641,6 +1635,50 @@ help: |
95 | PHONY += prepare |
96 | endif # KBUILD_EXTMOD |
97 | |
98 | +# Single targets |
99 | +# --------------------------------------------------------------------------- |
100 | +# To build individual files in subdirectories, you can do like this: |
101 | +# |
102 | +# make foo/bar/baz.s |
103 | +# |
104 | +# The supported suffixes for single-target are listed in 'single-targets' |
105 | +# |
106 | +# To build only under specific subdirectories, you can do like this: |
107 | +# |
108 | +# make foo/bar/baz/ |
109 | + |
110 | +ifdef single-build |
111 | + |
112 | +# .ko is special because modpost is needed |
113 | +single-ko := $(sort $(filter %.ko, $(MAKECMDGOALS))) |
114 | +single-no-ko := $(sort $(patsubst %.ko,%.mod, $(MAKECMDGOALS))) |
115 | + |
116 | +$(single-ko): single_modpost |
117 | + @: |
118 | +$(single-no-ko): descend |
119 | + @: |
120 | + |
121 | +ifeq ($(KBUILD_EXTMOD),) |
122 | +# For the single build of in-tree modules, use a temporary file to avoid |
123 | +# the situation of modules_install installing an invalid modules.order. |
124 | +MODORDER := .modules.tmp |
125 | +endif |
126 | + |
127 | +PHONY += single_modpost |
128 | +single_modpost: $(single-no-ko) |
129 | + $(Q){ $(foreach m, $(single-ko), echo $(extmod-prefix)$m;) } > $(MODORDER) |
130 | + $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost |
131 | + |
132 | +KBUILD_MODULES := 1 |
133 | + |
134 | +export KBUILD_SINGLE_TARGETS := $(addprefix $(extmod-prefix), $(single-no-ko)) |
135 | + |
136 | +# trim unrelated directories |
137 | +build-dirs := $(foreach d, $(build-dirs), \ |
138 | + $(if $(filter $(d)/%, $(KBUILD_SINGLE_TARGETS)), $(d))) |
139 | + |
140 | +endif |
141 | + |
142 | # Handle descending into subdirectories listed in $(build-dirs) |
143 | # Preset locale variables to speed up the build process. Limit locale |
144 | # tweaks to this spot to avoid wrong language settings when running |
145 | @@ -1649,7 +1687,9 @@ endif # KBUILD_EXTMOD |
146 | PHONY += descend $(build-dirs) |
147 | descend: $(build-dirs) |
148 | $(build-dirs): prepare |
149 | - $(Q)$(MAKE) $(build)=$@ single-build=$(single-build) need-builtin=1 need-modorder=1 |
150 | + $(Q)$(MAKE) $(build)=$@ \ |
151 | + single-build=$(if $(filter-out $@/, $(single-no-ko)),1) \ |
152 | + need-builtin=1 need-modorder=1 |
153 | |
154 | clean-dirs := $(addprefix _clean_, $(clean-dirs)) |
155 | PHONY += $(clean-dirs) clean |
156 | @@ -1753,50 +1793,6 @@ tools/%: FORCE |
157 | $(Q)mkdir -p $(objtree)/tools |
158 | $(Q)$(MAKE) LDFLAGS= MAKEFLAGS="$(tools_silent) $(filter --j% -j,$(MAKEFLAGS))" O=$(abspath $(objtree)) subdir=tools -C $(srctree)/tools/ $* |
159 | |
160 | -# Single targets |
161 | -# --------------------------------------------------------------------------- |
162 | -# To build individual files in subdirectories, you can do like this: |
163 | -# |
164 | -# make foo/bar/baz.s |
165 | -# |
166 | -# The supported suffixes for single-target are listed in 'single-targets' |
167 | -# |
168 | -# To build only under specific subdirectories, you can do like this: |
169 | -# |
170 | -# make foo/bar/baz/ |
171 | - |
172 | -ifdef single-build |
173 | - |
174 | -single-all := $(filter $(single-targets), $(MAKECMDGOALS)) |
175 | - |
176 | -# .ko is special because modpost is needed |
177 | -single-ko := $(sort $(filter %.ko, $(single-all))) |
178 | -single-no-ko := $(sort $(patsubst %.ko,%.mod, $(single-all))) |
179 | - |
180 | -$(single-ko): single_modpost |
181 | - @: |
182 | -$(single-no-ko): descend |
183 | - @: |
184 | - |
185 | -ifeq ($(KBUILD_EXTMOD),) |
186 | -# For the single build of in-tree modules, use a temporary file to avoid |
187 | -# the situation of modules_install installing an invalid modules.order. |
188 | -MODORDER := .modules.tmp |
189 | -endif |
190 | - |
191 | -PHONY += single_modpost |
192 | -single_modpost: $(single-no-ko) |
193 | - $(Q){ $(foreach m, $(single-ko), echo $(extmod-prefix)$m;) } > $(MODORDER) |
194 | - $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost |
195 | - |
196 | -KBUILD_MODULES := 1 |
197 | - |
198 | -export KBUILD_SINGLE_TARGETS := $(addprefix $(extmod-prefix), $(single-no-ko)) |
199 | - |
200 | -single-build = $(if $(filter-out $@/, $(single-no-ko)),1) |
201 | - |
202 | -endif |
203 | - |
204 | # FIXME Should go into a make.lib or something |
205 | # =========================================================================== |
206 | |
207 | diff --git a/arch/arm/boot/dts/stihxxx-b2120.dtsi b/arch/arm/boot/dts/stihxxx-b2120.dtsi |
208 | index 60e11045ad76..d051f080e52e 100644 |
209 | --- a/arch/arm/boot/dts/stihxxx-b2120.dtsi |
210 | +++ b/arch/arm/boot/dts/stihxxx-b2120.dtsi |
211 | @@ -46,7 +46,7 @@ |
212 | /* DAC */ |
213 | format = "i2s"; |
214 | mclk-fs = <256>; |
215 | - frame-inversion = <1>; |
216 | + frame-inversion; |
217 | cpu { |
218 | sound-dai = <&sti_uni_player2>; |
219 | }; |
220 | diff --git a/arch/mips/kernel/vpe.c b/arch/mips/kernel/vpe.c |
221 | index 6176b9acba95..d0d832ab3d3b 100644 |
222 | --- a/arch/mips/kernel/vpe.c |
223 | +++ b/arch/mips/kernel/vpe.c |
224 | @@ -134,7 +134,7 @@ void release_vpe(struct vpe *v) |
225 | { |
226 | list_del(&v->list); |
227 | if (v->load_addr) |
228 | - release_progmem(v); |
229 | + release_progmem(v->load_addr); |
230 | kfree(v); |
231 | } |
232 | |
233 | diff --git a/arch/x86/events/intel/core.c b/arch/x86/events/intel/core.c |
234 | index fcef678c3423..c531e3f3269e 100644 |
235 | --- a/arch/x86/events/intel/core.c |
236 | +++ b/arch/x86/events/intel/core.c |
237 | @@ -4746,6 +4746,7 @@ __init int intel_pmu_init(void) |
238 | break; |
239 | |
240 | case INTEL_FAM6_ATOM_TREMONT_D: |
241 | + case INTEL_FAM6_ATOM_TREMONT: |
242 | x86_pmu.late_ack = true; |
243 | memcpy(hw_cache_event_ids, glp_hw_cache_event_ids, |
244 | sizeof(hw_cache_event_ids)); |
245 | diff --git a/arch/x86/events/intel/cstate.c b/arch/x86/events/intel/cstate.c |
246 | index e1daf4151e11..4814c964692c 100644 |
247 | --- a/arch/x86/events/intel/cstate.c |
248 | +++ b/arch/x86/events/intel/cstate.c |
249 | @@ -40,17 +40,18 @@ |
250 | * Model specific counters: |
251 | * MSR_CORE_C1_RES: CORE C1 Residency Counter |
252 | * perf code: 0x00 |
253 | - * Available model: SLM,AMT,GLM,CNL |
254 | + * Available model: SLM,AMT,GLM,CNL,TNT |
255 | * Scope: Core (each processor core has a MSR) |
256 | * MSR_CORE_C3_RESIDENCY: CORE C3 Residency Counter |
257 | * perf code: 0x01 |
258 | * Available model: NHM,WSM,SNB,IVB,HSW,BDW,SKL,GLM, |
259 | - * CNL,KBL,CML |
260 | + * CNL,KBL,CML,TNT |
261 | * Scope: Core |
262 | * MSR_CORE_C6_RESIDENCY: CORE C6 Residency Counter |
263 | * perf code: 0x02 |
264 | * Available model: SLM,AMT,NHM,WSM,SNB,IVB,HSW,BDW, |
265 | - * SKL,KNL,GLM,CNL,KBL,CML,ICL,TGL |
266 | + * SKL,KNL,GLM,CNL,KBL,CML,ICL,TGL, |
267 | + * TNT |
268 | * Scope: Core |
269 | * MSR_CORE_C7_RESIDENCY: CORE C7 Residency Counter |
270 | * perf code: 0x03 |
271 | @@ -60,17 +61,18 @@ |
272 | * MSR_PKG_C2_RESIDENCY: Package C2 Residency Counter. |
273 | * perf code: 0x00 |
274 | * Available model: SNB,IVB,HSW,BDW,SKL,KNL,GLM,CNL, |
275 | - * KBL,CML,ICL,TGL |
276 | + * KBL,CML,ICL,TGL,TNT |
277 | * Scope: Package (physical package) |
278 | * MSR_PKG_C3_RESIDENCY: Package C3 Residency Counter. |
279 | * perf code: 0x01 |
280 | * Available model: NHM,WSM,SNB,IVB,HSW,BDW,SKL,KNL, |
281 | - * GLM,CNL,KBL,CML,ICL,TGL |
282 | + * GLM,CNL,KBL,CML,ICL,TGL,TNT |
283 | * Scope: Package (physical package) |
284 | * MSR_PKG_C6_RESIDENCY: Package C6 Residency Counter. |
285 | * perf code: 0x02 |
286 | - * Available model: SLM,AMT,NHM,WSM,SNB,IVB,HSW,BDW |
287 | - * SKL,KNL,GLM,CNL,KBL,CML,ICL,TGL |
288 | + * Available model: SLM,AMT,NHM,WSM,SNB,IVB,HSW,BDW, |
289 | + * SKL,KNL,GLM,CNL,KBL,CML,ICL,TGL, |
290 | + * TNT |
291 | * Scope: Package (physical package) |
292 | * MSR_PKG_C7_RESIDENCY: Package C7 Residency Counter. |
293 | * perf code: 0x03 |
294 | @@ -87,7 +89,8 @@ |
295 | * Scope: Package (physical package) |
296 | * MSR_PKG_C10_RESIDENCY: Package C10 Residency Counter. |
297 | * perf code: 0x06 |
298 | - * Available model: HSW ULT,KBL,GLM,CNL,CML,ICL,TGL |
299 | + * Available model: HSW ULT,KBL,GLM,CNL,CML,ICL,TGL, |
300 | + * TNT |
301 | * Scope: Package (physical package) |
302 | * |
303 | */ |
304 | @@ -640,8 +643,9 @@ static const struct x86_cpu_id intel_cstates_match[] __initconst = { |
305 | |
306 | X86_CSTATES_MODEL(INTEL_FAM6_ATOM_GOLDMONT, glm_cstates), |
307 | X86_CSTATES_MODEL(INTEL_FAM6_ATOM_GOLDMONT_D, glm_cstates), |
308 | - |
309 | X86_CSTATES_MODEL(INTEL_FAM6_ATOM_GOLDMONT_PLUS, glm_cstates), |
310 | + X86_CSTATES_MODEL(INTEL_FAM6_ATOM_TREMONT_D, glm_cstates), |
311 | + X86_CSTATES_MODEL(INTEL_FAM6_ATOM_TREMONT, glm_cstates), |
312 | |
313 | X86_CSTATES_MODEL(INTEL_FAM6_ICELAKE_L, icl_cstates), |
314 | X86_CSTATES_MODEL(INTEL_FAM6_ICELAKE, icl_cstates), |
315 | diff --git a/arch/x86/events/msr.c b/arch/x86/events/msr.c |
316 | index 6f86650b3f77..a949f6f55991 100644 |
317 | --- a/arch/x86/events/msr.c |
318 | +++ b/arch/x86/events/msr.c |
319 | @@ -75,8 +75,9 @@ static bool test_intel(int idx, void *data) |
320 | |
321 | case INTEL_FAM6_ATOM_GOLDMONT: |
322 | case INTEL_FAM6_ATOM_GOLDMONT_D: |
323 | - |
324 | case INTEL_FAM6_ATOM_GOLDMONT_PLUS: |
325 | + case INTEL_FAM6_ATOM_TREMONT_D: |
326 | + case INTEL_FAM6_ATOM_TREMONT: |
327 | |
328 | case INTEL_FAM6_XEON_PHI_KNL: |
329 | case INTEL_FAM6_XEON_PHI_KNM: |
330 | diff --git a/arch/x86/kernel/cpu/resctrl/internal.h b/arch/x86/kernel/cpu/resctrl/internal.h |
331 | index e49b77283924..181c992f448c 100644 |
332 | --- a/arch/x86/kernel/cpu/resctrl/internal.h |
333 | +++ b/arch/x86/kernel/cpu/resctrl/internal.h |
334 | @@ -57,6 +57,7 @@ static inline struct rdt_fs_context *rdt_fc2context(struct fs_context *fc) |
335 | } |
336 | |
337 | DECLARE_STATIC_KEY_FALSE(rdt_enable_key); |
338 | +DECLARE_STATIC_KEY_FALSE(rdt_mon_enable_key); |
339 | |
340 | /** |
341 | * struct mon_evt - Entry in the event list of a resource |
342 | diff --git a/arch/x86/kernel/cpu/resctrl/monitor.c b/arch/x86/kernel/cpu/resctrl/monitor.c |
343 | index 397206f23d14..773124b0e18a 100644 |
344 | --- a/arch/x86/kernel/cpu/resctrl/monitor.c |
345 | +++ b/arch/x86/kernel/cpu/resctrl/monitor.c |
346 | @@ -514,7 +514,7 @@ void mbm_handle_overflow(struct work_struct *work) |
347 | |
348 | mutex_lock(&rdtgroup_mutex); |
349 | |
350 | - if (!static_branch_likely(&rdt_enable_key)) |
351 | + if (!static_branch_likely(&rdt_mon_enable_key)) |
352 | goto out_unlock; |
353 | |
354 | d = get_domain_from_cpu(cpu, &rdt_resources_all[RDT_RESOURCE_L3]); |
355 | @@ -543,7 +543,7 @@ void mbm_setup_overflow_handler(struct rdt_domain *dom, unsigned long delay_ms) |
356 | unsigned long delay = msecs_to_jiffies(delay_ms); |
357 | int cpu; |
358 | |
359 | - if (!static_branch_likely(&rdt_enable_key)) |
360 | + if (!static_branch_likely(&rdt_mon_enable_key)) |
361 | return; |
362 | cpu = cpumask_any(&dom->cpu_mask); |
363 | dom->mbm_work_cpu = cpu; |
364 | diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c |
365 | index 207030db3481..07459120a222 100644 |
366 | --- a/arch/x86/kvm/svm.c |
367 | +++ b/arch/x86/kvm/svm.c |
368 | @@ -1298,6 +1298,47 @@ static void shrink_ple_window(struct kvm_vcpu *vcpu) |
369 | } |
370 | } |
371 | |
372 | +/* |
373 | + * The default MMIO mask is a single bit (excluding the present bit), |
374 | + * which could conflict with the memory encryption bit. Check for |
375 | + * memory encryption support and override the default MMIO mask if |
376 | + * memory encryption is enabled. |
377 | + */ |
378 | +static __init void svm_adjust_mmio_mask(void) |
379 | +{ |
380 | + unsigned int enc_bit, mask_bit; |
381 | + u64 msr, mask; |
382 | + |
383 | + /* If there is no memory encryption support, use existing mask */ |
384 | + if (cpuid_eax(0x80000000) < 0x8000001f) |
385 | + return; |
386 | + |
387 | + /* If memory encryption is not enabled, use existing mask */ |
388 | + rdmsrl(MSR_K8_SYSCFG, msr); |
389 | + if (!(msr & MSR_K8_SYSCFG_MEM_ENCRYPT)) |
390 | + return; |
391 | + |
392 | + enc_bit = cpuid_ebx(0x8000001f) & 0x3f; |
393 | + mask_bit = boot_cpu_data.x86_phys_bits; |
394 | + |
395 | + /* Increment the mask bit if it is the same as the encryption bit */ |
396 | + if (enc_bit == mask_bit) |
397 | + mask_bit++; |
398 | + |
399 | + /* |
400 | + * If the mask bit location is below 52, then some bits above the |
401 | + * physical addressing limit will always be reserved, so use the |
402 | + * rsvd_bits() function to generate the mask. This mask, along with |
403 | + * the present bit, will be used to generate a page fault with |
404 | + * PFER.RSV = 1. |
405 | + * |
406 | + * If the mask bit location is 52 (or above), then clear the mask. |
407 | + */ |
408 | + mask = (mask_bit < 52) ? rsvd_bits(mask_bit, 51) | PT_PRESENT_MASK : 0; |
409 | + |
410 | + kvm_mmu_set_mmio_spte_mask(mask, mask, PT_WRITABLE_MASK | PT_USER_MASK); |
411 | +} |
412 | + |
413 | static __init int svm_hardware_setup(void) |
414 | { |
415 | int cpu; |
416 | @@ -1352,6 +1393,8 @@ static __init int svm_hardware_setup(void) |
417 | } |
418 | } |
419 | |
420 | + svm_adjust_mmio_mask(); |
421 | + |
422 | for_each_possible_cpu(cpu) { |
423 | r = svm_cpu_init(cpu); |
424 | if (r) |
425 | diff --git a/arch/x86/kvm/vmx/nested.c b/arch/x86/kvm/vmx/nested.c |
426 | index 802ef7177d53..e1d8062ef12e 100644 |
427 | --- a/arch/x86/kvm/vmx/nested.c |
428 | +++ b/arch/x86/kvm/vmx/nested.c |
429 | @@ -4609,32 +4609,28 @@ static int handle_vmread(struct kvm_vcpu *vcpu) |
430 | { |
431 | unsigned long field; |
432 | u64 field_value; |
433 | + struct vcpu_vmx *vmx = to_vmx(vcpu); |
434 | unsigned long exit_qualification = vmcs_readl(EXIT_QUALIFICATION); |
435 | u32 vmx_instruction_info = vmcs_read32(VMX_INSTRUCTION_INFO); |
436 | int len; |
437 | gva_t gva = 0; |
438 | - struct vmcs12 *vmcs12; |
439 | + struct vmcs12 *vmcs12 = is_guest_mode(vcpu) ? get_shadow_vmcs12(vcpu) |
440 | + : get_vmcs12(vcpu); |
441 | struct x86_exception e; |
442 | short offset; |
443 | |
444 | if (!nested_vmx_check_permission(vcpu)) |
445 | return 1; |
446 | |
447 | - if (to_vmx(vcpu)->nested.current_vmptr == -1ull) |
448 | + /* |
449 | + * In VMX non-root operation, when the VMCS-link pointer is -1ull, |
450 | + * any VMREAD sets the ALU flags for VMfailInvalid. |
451 | + */ |
452 | + if (vmx->nested.current_vmptr == -1ull || |
453 | + (is_guest_mode(vcpu) && |
454 | + get_vmcs12(vcpu)->vmcs_link_pointer == -1ull)) |
455 | return nested_vmx_failInvalid(vcpu); |
456 | |
457 | - if (!is_guest_mode(vcpu)) |
458 | - vmcs12 = get_vmcs12(vcpu); |
459 | - else { |
460 | - /* |
461 | - * When vmcs->vmcs_link_pointer is -1ull, any VMREAD |
462 | - * to shadowed-field sets the ALU flags for VMfailInvalid. |
463 | - */ |
464 | - if (get_vmcs12(vcpu)->vmcs_link_pointer == -1ull) |
465 | - return nested_vmx_failInvalid(vcpu); |
466 | - vmcs12 = get_shadow_vmcs12(vcpu); |
467 | - } |
468 | - |
469 | /* Decode instruction info and find the field to read */ |
470 | field = kvm_register_readl(vcpu, (((vmx_instruction_info) >> 28) & 0xf)); |
471 | |
472 | @@ -4713,13 +4709,20 @@ static int handle_vmwrite(struct kvm_vcpu *vcpu) |
473 | */ |
474 | u64 field_value = 0; |
475 | struct x86_exception e; |
476 | - struct vmcs12 *vmcs12; |
477 | + struct vmcs12 *vmcs12 = is_guest_mode(vcpu) ? get_shadow_vmcs12(vcpu) |
478 | + : get_vmcs12(vcpu); |
479 | short offset; |
480 | |
481 | if (!nested_vmx_check_permission(vcpu)) |
482 | return 1; |
483 | |
484 | - if (vmx->nested.current_vmptr == -1ull) |
485 | + /* |
486 | + * In VMX non-root operation, when the VMCS-link pointer is -1ull, |
487 | + * any VMWRITE sets the ALU flags for VMfailInvalid. |
488 | + */ |
489 | + if (vmx->nested.current_vmptr == -1ull || |
490 | + (is_guest_mode(vcpu) && |
491 | + get_vmcs12(vcpu)->vmcs_link_pointer == -1ull)) |
492 | return nested_vmx_failInvalid(vcpu); |
493 | |
494 | if (vmx_instruction_info & (1u << 10)) |
495 | @@ -4738,6 +4741,12 @@ static int handle_vmwrite(struct kvm_vcpu *vcpu) |
496 | |
497 | |
498 | field = kvm_register_readl(vcpu, (((vmx_instruction_info) >> 28) & 0xf)); |
499 | + |
500 | + offset = vmcs_field_to_offset(field); |
501 | + if (offset < 0) |
502 | + return nested_vmx_failValid(vcpu, |
503 | + VMXERR_UNSUPPORTED_VMCS_COMPONENT); |
504 | + |
505 | /* |
506 | * If the vCPU supports "VMWRITE to any supported field in the |
507 | * VMCS," then the "read-only" fields are actually read/write. |
508 | @@ -4747,29 +4756,12 @@ static int handle_vmwrite(struct kvm_vcpu *vcpu) |
509 | return nested_vmx_failValid(vcpu, |
510 | VMXERR_VMWRITE_READ_ONLY_VMCS_COMPONENT); |
511 | |
512 | - if (!is_guest_mode(vcpu)) { |
513 | - vmcs12 = get_vmcs12(vcpu); |
514 | - |
515 | - /* |
516 | - * Ensure vmcs12 is up-to-date before any VMWRITE that dirties |
517 | - * vmcs12, else we may crush a field or consume a stale value. |
518 | - */ |
519 | - if (!is_shadow_field_rw(field)) |
520 | - copy_vmcs02_to_vmcs12_rare(vcpu, vmcs12); |
521 | - } else { |
522 | - /* |
523 | - * When vmcs->vmcs_link_pointer is -1ull, any VMWRITE |
524 | - * to shadowed-field sets the ALU flags for VMfailInvalid. |
525 | - */ |
526 | - if (get_vmcs12(vcpu)->vmcs_link_pointer == -1ull) |
527 | - return nested_vmx_failInvalid(vcpu); |
528 | - vmcs12 = get_shadow_vmcs12(vcpu); |
529 | - } |
530 | - |
531 | - offset = vmcs_field_to_offset(field); |
532 | - if (offset < 0) |
533 | - return nested_vmx_failValid(vcpu, |
534 | - VMXERR_UNSUPPORTED_VMCS_COMPONENT); |
535 | + /* |
536 | + * Ensure vmcs12 is up-to-date before any VMWRITE that dirties |
537 | + * vmcs12, else we may crush a field or consume a stale value. |
538 | + */ |
539 | + if (!is_guest_mode(vcpu) && !is_shadow_field_rw(field)) |
540 | + copy_vmcs02_to_vmcs12_rare(vcpu, vmcs12); |
541 | |
542 | /* |
543 | * Some Intel CPUs intentionally drop the reserved bits of the AR byte |
544 | diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c |
545 | index 8ebcd9de87a2..8129b6b27c93 100644 |
546 | --- a/arch/x86/kvm/vmx/vmx.c |
547 | +++ b/arch/x86/kvm/vmx/vmx.c |
548 | @@ -7165,6 +7165,7 @@ static int vmx_check_intercept_io(struct kvm_vcpu *vcpu, |
549 | else |
550 | intercept = nested_vmx_check_io_bitmaps(vcpu, port, size); |
551 | |
552 | + /* FIXME: produce nested vmexit and return X86EMUL_INTERCEPTED. */ |
553 | return intercept ? X86EMUL_UNHANDLEABLE : X86EMUL_CONTINUE; |
554 | } |
555 | |
556 | @@ -7194,6 +7195,20 @@ static int vmx_check_intercept(struct kvm_vcpu *vcpu, |
557 | case x86_intercept_outs: |
558 | return vmx_check_intercept_io(vcpu, info); |
559 | |
560 | + case x86_intercept_lgdt: |
561 | + case x86_intercept_lidt: |
562 | + case x86_intercept_lldt: |
563 | + case x86_intercept_ltr: |
564 | + case x86_intercept_sgdt: |
565 | + case x86_intercept_sidt: |
566 | + case x86_intercept_sldt: |
567 | + case x86_intercept_str: |
568 | + if (!nested_cpu_has2(vmcs12, SECONDARY_EXEC_DESC)) |
569 | + return X86EMUL_CONTINUE; |
570 | + |
571 | + /* FIXME: produce nested vmexit and return X86EMUL_INTERCEPTED. */ |
572 | + break; |
573 | + |
574 | /* TODO: check more intercepts... */ |
575 | default: |
576 | break; |
577 | diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c |
578 | index 95180d67d570..c5e15eba8052 100644 |
579 | --- a/arch/x86/kvm/x86.c |
580 | +++ b/arch/x86/kvm/x86.c |
581 | @@ -9192,12 +9192,6 @@ void kvm_arch_vcpu_postcreate(struct kvm_vcpu *vcpu) |
582 | |
583 | void kvm_arch_vcpu_destroy(struct kvm_vcpu *vcpu) |
584 | { |
585 | - vcpu->arch.apf.msr_val = 0; |
586 | - |
587 | - vcpu_load(vcpu); |
588 | - kvm_mmu_unload(vcpu); |
589 | - vcpu_put(vcpu); |
590 | - |
591 | kvm_arch_vcpu_free(vcpu); |
592 | } |
593 | |
594 | diff --git a/drivers/acpi/acpi_watchdog.c b/drivers/acpi/acpi_watchdog.c |
595 | index b5516b04ffc0..d827a4a3e946 100644 |
596 | --- a/drivers/acpi/acpi_watchdog.c |
597 | +++ b/drivers/acpi/acpi_watchdog.c |
598 | @@ -126,12 +126,11 @@ void __init acpi_watchdog_init(void) |
599 | gas = &entries[i].register_region; |
600 | |
601 | res.start = gas->address; |
602 | + res.end = res.start + ACPI_ACCESS_BYTE_WIDTH(gas->access_width) - 1; |
603 | if (gas->space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY) { |
604 | res.flags = IORESOURCE_MEM; |
605 | - res.end = res.start + ALIGN(gas->access_width, 4) - 1; |
606 | } else if (gas->space_id == ACPI_ADR_SPACE_SYSTEM_IO) { |
607 | res.flags = IORESOURCE_IO; |
608 | - res.end = res.start + gas->access_width - 1; |
609 | } else { |
610 | pr_warn("Unsupported address space: %u\n", |
611 | gas->space_id); |
612 | diff --git a/drivers/bus/Kconfig b/drivers/bus/Kconfig |
613 | index 6b331061d34b..47c2bb444ab4 100644 |
614 | --- a/drivers/bus/Kconfig |
615 | +++ b/drivers/bus/Kconfig |
616 | @@ -138,7 +138,6 @@ config TEGRA_ACONNECT |
617 | tristate "Tegra ACONNECT Bus Driver" |
618 | depends on ARCH_TEGRA_210_SOC |
619 | depends on OF && PM |
620 | - select PM_CLK |
621 | help |
622 | Driver for the Tegra ACONNECT bus which is used to interface with |
623 | the devices inside the Audio Processing Engine (APE) for Tegra210. |
624 | diff --git a/drivers/char/ipmi/ipmi_ssif.c b/drivers/char/ipmi/ipmi_ssif.c |
625 | index 22c6a2e61236..8ac390c2b514 100644 |
626 | --- a/drivers/char/ipmi/ipmi_ssif.c |
627 | +++ b/drivers/char/ipmi/ipmi_ssif.c |
628 | @@ -775,10 +775,14 @@ static void msg_done_handler(struct ssif_info *ssif_info, int result, |
629 | flags = ipmi_ssif_lock_cond(ssif_info, &oflags); |
630 | msg = ssif_info->curr_msg; |
631 | if (msg) { |
632 | + if (data) { |
633 | + if (len > IPMI_MAX_MSG_LENGTH) |
634 | + len = IPMI_MAX_MSG_LENGTH; |
635 | + memcpy(msg->rsp, data, len); |
636 | + } else { |
637 | + len = 0; |
638 | + } |
639 | msg->rsp_size = len; |
640 | - if (msg->rsp_size > IPMI_MAX_MSG_LENGTH) |
641 | - msg->rsp_size = IPMI_MAX_MSG_LENGTH; |
642 | - memcpy(msg->rsp, data, msg->rsp_size); |
643 | ssif_info->curr_msg = NULL; |
644 | } |
645 | |
646 | diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c |
647 | index 7679f8a91745..35f8e098e9fa 100644 |
648 | --- a/drivers/cpufreq/cpufreq.c |
649 | +++ b/drivers/cpufreq/cpufreq.c |
650 | @@ -1071,9 +1071,17 @@ static int cpufreq_init_policy(struct cpufreq_policy *policy) |
651 | pol = policy->last_policy; |
652 | } else if (def_gov) { |
653 | pol = cpufreq_parse_policy(def_gov->name); |
654 | - } else { |
655 | - return -ENODATA; |
656 | + /* |
657 | + * In case the default governor is neiter "performance" |
658 | + * nor "powersave", fall back to the initial policy |
659 | + * value set by the driver. |
660 | + */ |
661 | + if (pol == CPUFREQ_POLICY_UNKNOWN) |
662 | + pol = policy->policy; |
663 | } |
664 | + if (pol != CPUFREQ_POLICY_PERFORMANCE && |
665 | + pol != CPUFREQ_POLICY_POWERSAVE) |
666 | + return -ENODATA; |
667 | } |
668 | |
669 | return cpufreq_set_policy(policy, gov, pol); |
670 | diff --git a/drivers/devfreq/devfreq.c b/drivers/devfreq/devfreq.c |
671 | index 174795ecbd3b..ff81b7cdab71 100644 |
672 | --- a/drivers/devfreq/devfreq.c |
673 | +++ b/drivers/devfreq/devfreq.c |
674 | @@ -613,7 +613,6 @@ struct devfreq *devfreq_add_device(struct device *dev, |
675 | { |
676 | struct devfreq *devfreq; |
677 | struct devfreq_governor *governor; |
678 | - static atomic_t devfreq_no = ATOMIC_INIT(-1); |
679 | int err = 0; |
680 | |
681 | if (!dev || !profile || !governor_name) { |
682 | @@ -677,8 +676,7 @@ struct devfreq *devfreq_add_device(struct device *dev, |
683 | devfreq->suspend_freq = dev_pm_opp_get_suspend_opp_freq(dev); |
684 | atomic_set(&devfreq->suspend_count, 0); |
685 | |
686 | - dev_set_name(&devfreq->dev, "devfreq%d", |
687 | - atomic_inc_return(&devfreq_no)); |
688 | + dev_set_name(&devfreq->dev, "%s", dev_name(dev)); |
689 | err = device_register(&devfreq->dev); |
690 | if (err) { |
691 | mutex_unlock(&devfreq->lock); |
692 | diff --git a/drivers/edac/skx_common.c b/drivers/edac/skx_common.c |
693 | index d8ff63d91b86..a04349c6d17e 100644 |
694 | --- a/drivers/edac/skx_common.c |
695 | +++ b/drivers/edac/skx_common.c |
696 | @@ -235,7 +235,7 @@ int skx_get_hi_lo(unsigned int did, int off[], u64 *tolm, u64 *tohm) |
697 | |
698 | pdev = pci_get_device(PCI_VENDOR_ID_INTEL, did, NULL); |
699 | if (!pdev) { |
700 | - skx_printk(KERN_ERR, "Can't get tolm/tohm\n"); |
701 | + edac_dbg(2, "Can't get tolm/tohm\n"); |
702 | return -ENODEV; |
703 | } |
704 | |
705 | diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c |
706 | index bb9a2771a0f9..05d114a72ca1 100644 |
707 | --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c |
708 | +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c |
709 | @@ -1421,7 +1421,7 @@ amdgpu_get_crtc_scanout_position(struct drm_device *dev, unsigned int pipe, |
710 | |
711 | static struct drm_driver kms_driver = { |
712 | .driver_features = |
713 | - DRIVER_USE_AGP | DRIVER_ATOMIC | |
714 | + DRIVER_ATOMIC | |
715 | DRIVER_GEM | |
716 | DRIVER_RENDER | DRIVER_MODESET | DRIVER_SYNCOBJ, |
717 | .load = amdgpu_driver_load_kms, |
718 | diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h |
719 | index aef6c396bd58..8c0ac66d31d0 100644 |
720 | --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h |
721 | +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h |
722 | @@ -157,6 +157,7 @@ struct amdgpu_gmc { |
723 | uint32_t srbm_soft_reset; |
724 | bool prt_warning; |
725 | uint64_t stolen_size; |
726 | + uint32_t sdpif_register; |
727 | /* apertures */ |
728 | u64 shared_aperture_start; |
729 | u64 shared_aperture_end; |
730 | diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c |
731 | index d7caca042173..da53a55bf955 100644 |
732 | --- a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c |
733 | +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c |
734 | @@ -1382,6 +1382,19 @@ static void gmc_v9_0_init_golden_registers(struct amdgpu_device *adev) |
735 | } |
736 | } |
737 | |
738 | +/** |
739 | + * gmc_v9_0_restore_registers - restores regs |
740 | + * |
741 | + * @adev: amdgpu_device pointer |
742 | + * |
743 | + * This restores register values, saved at suspend. |
744 | + */ |
745 | +static void gmc_v9_0_restore_registers(struct amdgpu_device *adev) |
746 | +{ |
747 | + if (adev->asic_type == CHIP_RAVEN) |
748 | + WREG32(mmDCHUBBUB_SDPIF_MMIO_CNTRL_0, adev->gmc.sdpif_register); |
749 | +} |
750 | + |
751 | /** |
752 | * gmc_v9_0_gart_enable - gart enable |
753 | * |
754 | @@ -1478,6 +1491,20 @@ static int gmc_v9_0_hw_init(void *handle) |
755 | return r; |
756 | } |
757 | |
758 | +/** |
759 | + * gmc_v9_0_save_registers - saves regs |
760 | + * |
761 | + * @adev: amdgpu_device pointer |
762 | + * |
763 | + * This saves potential register values that should be |
764 | + * restored upon resume |
765 | + */ |
766 | +static void gmc_v9_0_save_registers(struct amdgpu_device *adev) |
767 | +{ |
768 | + if (adev->asic_type == CHIP_RAVEN) |
769 | + adev->gmc.sdpif_register = RREG32(mmDCHUBBUB_SDPIF_MMIO_CNTRL_0); |
770 | +} |
771 | + |
772 | /** |
773 | * gmc_v9_0_gart_disable - gart disable |
774 | * |
775 | @@ -1514,9 +1541,16 @@ static int gmc_v9_0_hw_fini(void *handle) |
776 | |
777 | static int gmc_v9_0_suspend(void *handle) |
778 | { |
779 | + int r; |
780 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; |
781 | |
782 | - return gmc_v9_0_hw_fini(adev); |
783 | + r = gmc_v9_0_hw_fini(adev); |
784 | + if (r) |
785 | + return r; |
786 | + |
787 | + gmc_v9_0_save_registers(adev); |
788 | + |
789 | + return 0; |
790 | } |
791 | |
792 | static int gmc_v9_0_resume(void *handle) |
793 | @@ -1524,6 +1558,7 @@ static int gmc_v9_0_resume(void *handle) |
794 | int r; |
795 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; |
796 | |
797 | + gmc_v9_0_restore_registers(adev); |
798 | r = gmc_v9_0_hw_init(adev); |
799 | if (r) |
800 | return r; |
801 | diff --git a/drivers/gpu/drm/amd/display/dc/clk_mgr/Makefile b/drivers/gpu/drm/amd/display/dc/clk_mgr/Makefile |
802 | index b864869cc7e3..6fa7422c51da 100644 |
803 | --- a/drivers/gpu/drm/amd/display/dc/clk_mgr/Makefile |
804 | +++ b/drivers/gpu/drm/amd/display/dc/clk_mgr/Makefile |
805 | @@ -91,6 +91,12 @@ ifdef CONFIG_DRM_AMD_DC_DCN2_1 |
806 | ############################################################################### |
807 | CLK_MGR_DCN21 = rn_clk_mgr.o rn_clk_mgr_vbios_smu.o |
808 | |
809 | +# prevent build errors regarding soft-float vs hard-float FP ABI tags |
810 | +# this code is currently unused on ppc64, as it applies to Renoir APUs only |
811 | +ifdef CONFIG_PPC64 |
812 | +CFLAGS_$(AMDDALPATH)/dc/clk_mgr/dcn21/rn_clk_mgr.o := $(call cc-option,-mno-gnu-attribute) |
813 | +endif |
814 | + |
815 | AMD_DAL_CLK_MGR_DCN21 = $(addprefix $(AMDDALPATH)/dc/clk_mgr/dcn21/,$(CLK_MGR_DCN21)) |
816 | |
817 | AMD_DISPLAY_FILES += $(AMD_DAL_CLK_MGR_DCN21) |
818 | diff --git a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn21/rn_clk_mgr.c b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn21/rn_clk_mgr.c |
819 | index 787f94d815f4..dd92f9c295b4 100644 |
820 | --- a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn21/rn_clk_mgr.c |
821 | +++ b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn21/rn_clk_mgr.c |
822 | @@ -91,6 +91,12 @@ void rn_update_clocks(struct clk_mgr *clk_mgr_base, |
823 | rn_vbios_smu_set_min_deep_sleep_dcfclk(clk_mgr, clk_mgr_base->clks.dcfclk_deep_sleep_khz); |
824 | } |
825 | |
826 | + // workaround: Limit dppclk to 100Mhz to avoid lower eDP panel switch to plus 4K monitor underflow. |
827 | + if (!IS_DIAG_DC(dc->ctx->dce_environment)) { |
828 | + if (new_clocks->dppclk_khz < 100000) |
829 | + new_clocks->dppclk_khz = 100000; |
830 | + } |
831 | + |
832 | if (should_set_clock(safe_to_lower, new_clocks->dppclk_khz, clk_mgr->base.clks.dppclk_khz)) { |
833 | if (clk_mgr->base.clks.dppclk_khz > new_clocks->dppclk_khz) |
834 | dpp_clock_lowered = true; |
835 | diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_aux.c b/drivers/gpu/drm/amd/display/dc/dce/dce_aux.c |
836 | index c3f9f4185ce8..cf877238fff9 100644 |
837 | --- a/drivers/gpu/drm/amd/display/dc/dce/dce_aux.c |
838 | +++ b/drivers/gpu/drm/amd/display/dc/dce/dce_aux.c |
839 | @@ -386,7 +386,7 @@ static bool acquire( |
840 | { |
841 | enum gpio_result result; |
842 | |
843 | - if (!is_engine_available(engine)) |
844 | + if ((engine == NULL) || !is_engine_available(engine)) |
845 | return false; |
846 | |
847 | result = dal_ddc_open(ddc, GPIO_MODE_HARDWARE, |
848 | diff --git a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c |
849 | index 937a8ba81160..e933f6a369f9 100644 |
850 | --- a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c |
851 | +++ b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c |
852 | @@ -493,7 +493,6 @@ static void dcn20_plane_atomic_disable(struct dc *dc, struct pipe_ctx *pipe_ctx) |
853 | dpp->funcs->dpp_dppclk_control(dpp, false, false); |
854 | |
855 | hubp->power_gated = true; |
856 | - dc->optimized_required = false; /* We're powering off, no need to optimize */ |
857 | |
858 | dc->hwss.plane_atomic_power_down(dc, |
859 | pipe_ctx->plane_res.dpp, |
860 | diff --git a/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_resource.c b/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_resource.c |
861 | index b0e5e64df212..161bf7caf3ae 100644 |
862 | --- a/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_resource.c |
863 | +++ b/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_resource.c |
864 | @@ -57,6 +57,7 @@ |
865 | #include "dcn20/dcn20_dccg.h" |
866 | #include "dcn21_hubbub.h" |
867 | #include "dcn10/dcn10_resource.h" |
868 | +#include "dce110/dce110_resource.h" |
869 | |
870 | #include "dcn20/dcn20_dwb.h" |
871 | #include "dcn20/dcn20_mmhubbub.h" |
872 | @@ -824,6 +825,7 @@ static const struct dc_debug_options debug_defaults_diags = { |
873 | enum dcn20_clk_src_array_id { |
874 | DCN20_CLK_SRC_PLL0, |
875 | DCN20_CLK_SRC_PLL1, |
876 | + DCN20_CLK_SRC_PLL2, |
877 | DCN20_CLK_SRC_TOTAL_DCN21 |
878 | }; |
879 | |
880 | @@ -1492,6 +1494,10 @@ static bool construct( |
881 | dcn21_clock_source_create(ctx, ctx->dc_bios, |
882 | CLOCK_SOURCE_COMBO_PHY_PLL1, |
883 | &clk_src_regs[1], false); |
884 | + pool->base.clock_sources[DCN20_CLK_SRC_PLL2] = |
885 | + dcn21_clock_source_create(ctx, ctx->dc_bios, |
886 | + CLOCK_SOURCE_COMBO_PHY_PLL2, |
887 | + &clk_src_regs[2], false); |
888 | |
889 | pool->base.clk_src_count = DCN20_CLK_SRC_TOTAL_DCN21; |
890 | |
891 | diff --git a/drivers/gpu/drm/amd/include/asic_reg/dce/dce_12_0_offset.h b/drivers/gpu/drm/amd/include/asic_reg/dce/dce_12_0_offset.h |
892 | index b6f74bf4af02..27bb8c1ab858 100644 |
893 | --- a/drivers/gpu/drm/amd/include/asic_reg/dce/dce_12_0_offset.h |
894 | +++ b/drivers/gpu/drm/amd/include/asic_reg/dce/dce_12_0_offset.h |
895 | @@ -7376,6 +7376,8 @@ |
896 | #define mmCRTC4_CRTC_DRR_CONTROL 0x0f3e |
897 | #define mmCRTC4_CRTC_DRR_CONTROL_BASE_IDX 2 |
898 | |
899 | +#define mmDCHUBBUB_SDPIF_MMIO_CNTRL_0 0x395d |
900 | +#define mmDCHUBBUB_SDPIF_MMIO_CNTRL_0_BASE_IDX 2 |
901 | |
902 | // addressBlock: dce_dc_fmt4_dispdec |
903 | // base address: 0x2000 |
904 | diff --git a/drivers/gpu/drm/i915/Kconfig.debug b/drivers/gpu/drm/i915/Kconfig.debug |
905 | index 00786a142ff0..41c8e39a73ba 100644 |
906 | --- a/drivers/gpu/drm/i915/Kconfig.debug |
907 | +++ b/drivers/gpu/drm/i915/Kconfig.debug |
908 | @@ -7,7 +7,6 @@ config DRM_I915_WERROR |
909 | # We use the dependency on !COMPILE_TEST to not be enabled in |
910 | # allmodconfig or allyesconfig configurations |
911 | depends on !COMPILE_TEST |
912 | - select HEADER_TEST |
913 | default n |
914 | help |
915 | Add -Werror to the build flags for (and only for) i915.ko. |
916 | diff --git a/drivers/gpu/drm/i915/gvt/dmabuf.c b/drivers/gpu/drm/i915/gvt/dmabuf.c |
917 | index 4bfaefdf548d..c0347956f7cf 100644 |
918 | --- a/drivers/gpu/drm/i915/gvt/dmabuf.c |
919 | +++ b/drivers/gpu/drm/i915/gvt/dmabuf.c |
920 | @@ -96,12 +96,12 @@ static void dmabuf_gem_object_free(struct kref *kref) |
921 | dmabuf_obj = container_of(pos, |
922 | struct intel_vgpu_dmabuf_obj, list); |
923 | if (dmabuf_obj == obj) { |
924 | + list_del(pos); |
925 | intel_gvt_hypervisor_put_vfio_device(vgpu); |
926 | idr_remove(&vgpu->object_idr, |
927 | dmabuf_obj->dmabuf_id); |
928 | kfree(dmabuf_obj->info); |
929 | kfree(dmabuf_obj); |
930 | - list_del(pos); |
931 | break; |
932 | } |
933 | } |
934 | diff --git a/drivers/gpu/drm/i915/gvt/vgpu.c b/drivers/gpu/drm/i915/gvt/vgpu.c |
935 | index d5a6e4e3d0fd..b232965b45b5 100644 |
936 | --- a/drivers/gpu/drm/i915/gvt/vgpu.c |
937 | +++ b/drivers/gpu/drm/i915/gvt/vgpu.c |
938 | @@ -560,9 +560,9 @@ void intel_gvt_reset_vgpu_locked(struct intel_vgpu *vgpu, bool dmlr, |
939 | |
940 | intel_vgpu_reset_mmio(vgpu, dmlr); |
941 | populate_pvinfo_page(vgpu); |
942 | - intel_vgpu_reset_display(vgpu); |
943 | |
944 | if (dmlr) { |
945 | + intel_vgpu_reset_display(vgpu); |
946 | intel_vgpu_reset_cfg_space(vgpu); |
947 | /* only reset the failsafe mode when dmlr reset */ |
948 | vgpu->failsafe = false; |
949 | diff --git a/drivers/gpu/drm/msm/msm_drv.c b/drivers/gpu/drm/msm/msm_drv.c |
950 | index c84f0a8b3f2c..b73fbb65e14b 100644 |
951 | --- a/drivers/gpu/drm/msm/msm_drv.c |
952 | +++ b/drivers/gpu/drm/msm/msm_drv.c |
953 | @@ -441,6 +441,14 @@ static int msm_drm_init(struct device *dev, struct drm_driver *drv) |
954 | if (ret) |
955 | goto err_msm_uninit; |
956 | |
957 | + if (!dev->dma_parms) { |
958 | + dev->dma_parms = devm_kzalloc(dev, sizeof(*dev->dma_parms), |
959 | + GFP_KERNEL); |
960 | + if (!dev->dma_parms) |
961 | + return -ENOMEM; |
962 | + } |
963 | + dma_set_max_seg_size(dev, DMA_BIT_MASK(32)); |
964 | + |
965 | msm_gem_shrinker_init(ddev); |
966 | |
967 | switch (get_mdp_ver(pdev)) { |
968 | diff --git a/drivers/gpu/drm/radeon/radeon_drv.c b/drivers/gpu/drm/radeon/radeon_drv.c |
969 | index 4528f4dc0b2d..6128792ab883 100644 |
970 | --- a/drivers/gpu/drm/radeon/radeon_drv.c |
971 | +++ b/drivers/gpu/drm/radeon/radeon_drv.c |
972 | @@ -37,6 +37,7 @@ |
973 | #include <linux/vga_switcheroo.h> |
974 | #include <linux/mmu_notifier.h> |
975 | |
976 | +#include <drm/drm_agpsupport.h> |
977 | #include <drm/drm_crtc_helper.h> |
978 | #include <drm/drm_drv.h> |
979 | #include <drm/drm_fb_helper.h> |
980 | @@ -325,6 +326,7 @@ static int radeon_pci_probe(struct pci_dev *pdev, |
981 | const struct pci_device_id *ent) |
982 | { |
983 | unsigned long flags = 0; |
984 | + struct drm_device *dev; |
985 | int ret; |
986 | |
987 | if (!ent) |
988 | @@ -365,7 +367,44 @@ static int radeon_pci_probe(struct pci_dev *pdev, |
989 | if (ret) |
990 | return ret; |
991 | |
992 | - return drm_get_pci_dev(pdev, ent, &kms_driver); |
993 | + dev = drm_dev_alloc(&kms_driver, &pdev->dev); |
994 | + if (IS_ERR(dev)) |
995 | + return PTR_ERR(dev); |
996 | + |
997 | + ret = pci_enable_device(pdev); |
998 | + if (ret) |
999 | + goto err_free; |
1000 | + |
1001 | + dev->pdev = pdev; |
1002 | +#ifdef __alpha__ |
1003 | + dev->hose = pdev->sysdata; |
1004 | +#endif |
1005 | + |
1006 | + pci_set_drvdata(pdev, dev); |
1007 | + |
1008 | + if (pci_find_capability(dev->pdev, PCI_CAP_ID_AGP)) |
1009 | + dev->agp = drm_agp_init(dev); |
1010 | + if (dev->agp) { |
1011 | + dev->agp->agp_mtrr = arch_phys_wc_add( |
1012 | + dev->agp->agp_info.aper_base, |
1013 | + dev->agp->agp_info.aper_size * |
1014 | + 1024 * 1024); |
1015 | + } |
1016 | + |
1017 | + ret = drm_dev_register(dev, ent->driver_data); |
1018 | + if (ret) |
1019 | + goto err_agp; |
1020 | + |
1021 | + return 0; |
1022 | + |
1023 | +err_agp: |
1024 | + if (dev->agp) |
1025 | + arch_phys_wc_del(dev->agp->agp_mtrr); |
1026 | + kfree(dev->agp); |
1027 | + pci_disable_device(pdev); |
1028 | +err_free: |
1029 | + drm_dev_put(dev); |
1030 | + return ret; |
1031 | } |
1032 | |
1033 | static void |
1034 | @@ -578,7 +617,7 @@ radeon_get_crtc_scanout_position(struct drm_device *dev, unsigned int pipe, |
1035 | |
1036 | static struct drm_driver kms_driver = { |
1037 | .driver_features = |
1038 | - DRIVER_USE_AGP | DRIVER_GEM | DRIVER_RENDER, |
1039 | + DRIVER_GEM | DRIVER_RENDER, |
1040 | .load = radeon_driver_load_kms, |
1041 | .open = radeon_driver_open_kms, |
1042 | .postclose = radeon_driver_postclose_kms, |
1043 | diff --git a/drivers/gpu/drm/radeon/radeon_kms.c b/drivers/gpu/drm/radeon/radeon_kms.c |
1044 | index e85c554eeaa9..2bb0187c5bc7 100644 |
1045 | --- a/drivers/gpu/drm/radeon/radeon_kms.c |
1046 | +++ b/drivers/gpu/drm/radeon/radeon_kms.c |
1047 | @@ -31,6 +31,7 @@ |
1048 | #include <linux/uaccess.h> |
1049 | #include <linux/vga_switcheroo.h> |
1050 | |
1051 | +#include <drm/drm_agpsupport.h> |
1052 | #include <drm/drm_fb_helper.h> |
1053 | #include <drm/drm_file.h> |
1054 | #include <drm/drm_ioctl.h> |
1055 | @@ -77,6 +78,11 @@ void radeon_driver_unload_kms(struct drm_device *dev) |
1056 | radeon_modeset_fini(rdev); |
1057 | radeon_device_fini(rdev); |
1058 | |
1059 | + if (dev->agp) |
1060 | + arch_phys_wc_del(dev->agp->agp_mtrr); |
1061 | + kfree(dev->agp); |
1062 | + dev->agp = NULL; |
1063 | + |
1064 | done_free: |
1065 | kfree(rdev); |
1066 | dev->dev_private = NULL; |
1067 | diff --git a/drivers/hid/hid-alps.c b/drivers/hid/hid-alps.c |
1068 | index ae79a7c66737..fa704153cb00 100644 |
1069 | --- a/drivers/hid/hid-alps.c |
1070 | +++ b/drivers/hid/hid-alps.c |
1071 | @@ -730,7 +730,7 @@ static int alps_input_configured(struct hid_device *hdev, struct hid_input *hi) |
1072 | if (data->has_sp) { |
1073 | input2 = input_allocate_device(); |
1074 | if (!input2) { |
1075 | - input_free_device(input2); |
1076 | + ret = -ENOMEM; |
1077 | goto exit; |
1078 | } |
1079 | |
1080 | diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c |
1081 | index 851fe54ea59e..359616e3efbb 100644 |
1082 | --- a/drivers/hid/hid-core.c |
1083 | +++ b/drivers/hid/hid-core.c |
1084 | @@ -1741,7 +1741,9 @@ int hid_report_raw_event(struct hid_device *hid, int type, u8 *data, u32 size, |
1085 | |
1086 | rsize = ((report->size - 1) >> 3) + 1; |
1087 | |
1088 | - if (rsize > HID_MAX_BUFFER_SIZE) |
1089 | + if (report_enum->numbered && rsize >= HID_MAX_BUFFER_SIZE) |
1090 | + rsize = HID_MAX_BUFFER_SIZE - 1; |
1091 | + else if (rsize > HID_MAX_BUFFER_SIZE) |
1092 | rsize = HID_MAX_BUFFER_SIZE; |
1093 | |
1094 | if (csize < rsize) { |
1095 | diff --git a/drivers/hid/hid-ite.c b/drivers/hid/hid-ite.c |
1096 | index c436e12feb23..6c55682c5974 100644 |
1097 | --- a/drivers/hid/hid-ite.c |
1098 | +++ b/drivers/hid/hid-ite.c |
1099 | @@ -41,8 +41,9 @@ static const struct hid_device_id ite_devices[] = { |
1100 | { HID_USB_DEVICE(USB_VENDOR_ID_ITE, USB_DEVICE_ID_ITE8595) }, |
1101 | { HID_USB_DEVICE(USB_VENDOR_ID_258A, USB_DEVICE_ID_258A_6A88) }, |
1102 | /* ITE8595 USB kbd ctlr, with Synaptics touchpad connected to it. */ |
1103 | - { HID_USB_DEVICE(USB_VENDOR_ID_SYNAPTICS, |
1104 | - USB_DEVICE_ID_SYNAPTICS_ACER_SWITCH5_012) }, |
1105 | + { HID_DEVICE(BUS_USB, HID_GROUP_GENERIC, |
1106 | + USB_VENDOR_ID_SYNAPTICS, |
1107 | + USB_DEVICE_ID_SYNAPTICS_ACER_SWITCH5_012) }, |
1108 | { } |
1109 | }; |
1110 | MODULE_DEVICE_TABLE(hid, ite_devices); |
1111 | diff --git a/drivers/hid/usbhid/hiddev.c b/drivers/hid/usbhid/hiddev.c |
1112 | index c879b214a479..35b1fa6d962e 100644 |
1113 | --- a/drivers/hid/usbhid/hiddev.c |
1114 | +++ b/drivers/hid/usbhid/hiddev.c |
1115 | @@ -941,9 +941,9 @@ void hiddev_disconnect(struct hid_device *hid) |
1116 | hiddev->exist = 0; |
1117 | |
1118 | if (hiddev->open) { |
1119 | - mutex_unlock(&hiddev->existancelock); |
1120 | hid_hw_close(hiddev->hid); |
1121 | wake_up_interruptible(&hiddev->wait); |
1122 | + mutex_unlock(&hiddev->existancelock); |
1123 | } else { |
1124 | mutex_unlock(&hiddev->existancelock); |
1125 | kfree(hiddev); |
1126 | diff --git a/drivers/i2c/busses/i2c-altera.c b/drivers/i2c/busses/i2c-altera.c |
1127 | index 5255d3755411..1de23b4f3809 100644 |
1128 | --- a/drivers/i2c/busses/i2c-altera.c |
1129 | +++ b/drivers/i2c/busses/i2c-altera.c |
1130 | @@ -171,7 +171,7 @@ static void altr_i2c_init(struct altr_i2c_dev *idev) |
1131 | /* SCL Low Time */ |
1132 | writel(t_low, idev->base + ALTR_I2C_SCL_LOW); |
1133 | /* SDA Hold Time, 300ns */ |
1134 | - writel(div_u64(300 * clk_mhz, 1000), idev->base + ALTR_I2C_SDA_HOLD); |
1135 | + writel(3 * clk_mhz / 10, idev->base + ALTR_I2C_SDA_HOLD); |
1136 | |
1137 | /* Mask all master interrupt bits */ |
1138 | altr_i2c_int_enable(idev, ALTR_I2C_ALL_IRQ, false); |
1139 | diff --git a/drivers/i2c/busses/i2c-jz4780.c b/drivers/i2c/busses/i2c-jz4780.c |
1140 | index 25dcd73acd63..8f0e1f802f2d 100644 |
1141 | --- a/drivers/i2c/busses/i2c-jz4780.c |
1142 | +++ b/drivers/i2c/busses/i2c-jz4780.c |
1143 | @@ -73,25 +73,6 @@ |
1144 | #define JZ4780_I2C_STA_TFNF BIT(1) |
1145 | #define JZ4780_I2C_STA_ACT BIT(0) |
1146 | |
1147 | -static const char * const jz4780_i2c_abrt_src[] = { |
1148 | - "ABRT_7B_ADDR_NOACK", |
1149 | - "ABRT_10ADDR1_NOACK", |
1150 | - "ABRT_10ADDR2_NOACK", |
1151 | - "ABRT_XDATA_NOACK", |
1152 | - "ABRT_GCALL_NOACK", |
1153 | - "ABRT_GCALL_READ", |
1154 | - "ABRT_HS_ACKD", |
1155 | - "SBYTE_ACKDET", |
1156 | - "ABRT_HS_NORSTRT", |
1157 | - "SBYTE_NORSTRT", |
1158 | - "ABRT_10B_RD_NORSTRT", |
1159 | - "ABRT_MASTER_DIS", |
1160 | - "ARB_LOST", |
1161 | - "SLVFLUSH_TXFIFO", |
1162 | - "SLV_ARBLOST", |
1163 | - "SLVRD_INTX", |
1164 | -}; |
1165 | - |
1166 | #define JZ4780_I2C_INTST_IGC BIT(11) |
1167 | #define JZ4780_I2C_INTST_ISTT BIT(10) |
1168 | #define JZ4780_I2C_INTST_ISTP BIT(9) |
1169 | @@ -529,21 +510,8 @@ done: |
1170 | |
1171 | static void jz4780_i2c_txabrt(struct jz4780_i2c *i2c, int src) |
1172 | { |
1173 | - int i; |
1174 | - |
1175 | - dev_err(&i2c->adap.dev, "txabrt: 0x%08x\n", src); |
1176 | - dev_err(&i2c->adap.dev, "device addr=%x\n", |
1177 | - jz4780_i2c_readw(i2c, JZ4780_I2C_TAR)); |
1178 | - dev_err(&i2c->adap.dev, "send cmd count:%d %d\n", |
1179 | - i2c->cmd, i2c->cmd_buf[i2c->cmd]); |
1180 | - dev_err(&i2c->adap.dev, "receive data count:%d %d\n", |
1181 | - i2c->cmd, i2c->data_buf[i2c->cmd]); |
1182 | - |
1183 | - for (i = 0; i < 16; i++) { |
1184 | - if (src & BIT(i)) |
1185 | - dev_dbg(&i2c->adap.dev, "I2C TXABRT[%d]=%s\n", |
1186 | - i, jz4780_i2c_abrt_src[i]); |
1187 | - } |
1188 | + dev_dbg(&i2c->adap.dev, "txabrt: 0x%08x, cmd: %d, send: %d, recv: %d\n", |
1189 | + src, i2c->cmd, i2c->cmd_buf[i2c->cmd], i2c->data_buf[i2c->cmd]); |
1190 | } |
1191 | |
1192 | static inline int jz4780_i2c_xfer_read(struct jz4780_i2c *i2c, |
1193 | diff --git a/drivers/infiniband/hw/hns/hns_roce_device.h b/drivers/infiniband/hw/hns/hns_roce_device.h |
1194 | index 96d1302abde1..e36d31569081 100644 |
1195 | --- a/drivers/infiniband/hw/hns/hns_roce_device.h |
1196 | +++ b/drivers/infiniband/hw/hns/hns_roce_device.h |
1197 | @@ -425,7 +425,7 @@ struct hns_roce_mr_table { |
1198 | struct hns_roce_wq { |
1199 | u64 *wrid; /* Work request ID */ |
1200 | spinlock_t lock; |
1201 | - int wqe_cnt; /* WQE num */ |
1202 | + u32 wqe_cnt; /* WQE num */ |
1203 | u32 max_post; |
1204 | int max_gs; |
1205 | int offset; |
1206 | @@ -658,7 +658,6 @@ struct hns_roce_qp { |
1207 | u8 sdb_en; |
1208 | u32 doorbell_qpn; |
1209 | u32 sq_signal_bits; |
1210 | - u32 sq_next_wqe; |
1211 | struct hns_roce_wq sq; |
1212 | |
1213 | struct ib_umem *umem; |
1214 | diff --git a/drivers/infiniband/hw/hns/hns_roce_hw_v1.c b/drivers/infiniband/hw/hns/hns_roce_hw_v1.c |
1215 | index 5f74bf55f471..a79fa67df871 100644 |
1216 | --- a/drivers/infiniband/hw/hns/hns_roce_hw_v1.c |
1217 | +++ b/drivers/infiniband/hw/hns/hns_roce_hw_v1.c |
1218 | @@ -74,8 +74,8 @@ static int hns_roce_v1_post_send(struct ib_qp *ibqp, |
1219 | unsigned long flags = 0; |
1220 | void *wqe = NULL; |
1221 | __le32 doorbell[2]; |
1222 | + u32 wqe_idx = 0; |
1223 | int nreq = 0; |
1224 | - u32 ind = 0; |
1225 | int ret = 0; |
1226 | u8 *smac; |
1227 | int loopback; |
1228 | @@ -88,7 +88,7 @@ static int hns_roce_v1_post_send(struct ib_qp *ibqp, |
1229 | } |
1230 | |
1231 | spin_lock_irqsave(&qp->sq.lock, flags); |
1232 | - ind = qp->sq_next_wqe; |
1233 | + |
1234 | for (nreq = 0; wr; ++nreq, wr = wr->next) { |
1235 | if (hns_roce_wq_overflow(&qp->sq, nreq, qp->ibqp.send_cq)) { |
1236 | ret = -ENOMEM; |
1237 | @@ -96,6 +96,8 @@ static int hns_roce_v1_post_send(struct ib_qp *ibqp, |
1238 | goto out; |
1239 | } |
1240 | |
1241 | + wqe_idx = (qp->sq.head + nreq) & (qp->sq.wqe_cnt - 1); |
1242 | + |
1243 | if (unlikely(wr->num_sge > qp->sq.max_gs)) { |
1244 | dev_err(dev, "num_sge=%d > qp->sq.max_gs=%d\n", |
1245 | wr->num_sge, qp->sq.max_gs); |
1246 | @@ -104,9 +106,8 @@ static int hns_roce_v1_post_send(struct ib_qp *ibqp, |
1247 | goto out; |
1248 | } |
1249 | |
1250 | - wqe = get_send_wqe(qp, ind & (qp->sq.wqe_cnt - 1)); |
1251 | - qp->sq.wrid[(qp->sq.head + nreq) & (qp->sq.wqe_cnt - 1)] = |
1252 | - wr->wr_id; |
1253 | + wqe = get_send_wqe(qp, wqe_idx); |
1254 | + qp->sq.wrid[wqe_idx] = wr->wr_id; |
1255 | |
1256 | /* Corresponding to the RC and RD type wqe process separately */ |
1257 | if (ibqp->qp_type == IB_QPT_GSI) { |
1258 | @@ -210,7 +211,6 @@ static int hns_roce_v1_post_send(struct ib_qp *ibqp, |
1259 | cpu_to_le32((wr->sg_list[1].addr) >> 32); |
1260 | ud_sq_wqe->l_key1 = |
1261 | cpu_to_le32(wr->sg_list[1].lkey); |
1262 | - ind++; |
1263 | } else if (ibqp->qp_type == IB_QPT_RC) { |
1264 | u32 tmp_len = 0; |
1265 | |
1266 | @@ -308,7 +308,6 @@ static int hns_roce_v1_post_send(struct ib_qp *ibqp, |
1267 | ctrl->flag |= cpu_to_le32(wr->num_sge << |
1268 | HNS_ROCE_WQE_SGE_NUM_BIT); |
1269 | } |
1270 | - ind++; |
1271 | } |
1272 | } |
1273 | |
1274 | @@ -336,7 +335,6 @@ out: |
1275 | doorbell[1] = sq_db.u32_8; |
1276 | |
1277 | hns_roce_write64_k(doorbell, qp->sq.db_reg_l); |
1278 | - qp->sq_next_wqe = ind; |
1279 | } |
1280 | |
1281 | spin_unlock_irqrestore(&qp->sq.lock, flags); |
1282 | @@ -348,12 +346,6 @@ static int hns_roce_v1_post_recv(struct ib_qp *ibqp, |
1283 | const struct ib_recv_wr *wr, |
1284 | const struct ib_recv_wr **bad_wr) |
1285 | { |
1286 | - int ret = 0; |
1287 | - int nreq = 0; |
1288 | - int ind = 0; |
1289 | - int i = 0; |
1290 | - u32 reg_val; |
1291 | - unsigned long flags = 0; |
1292 | struct hns_roce_rq_wqe_ctrl *ctrl = NULL; |
1293 | struct hns_roce_wqe_data_seg *scat = NULL; |
1294 | struct hns_roce_qp *hr_qp = to_hr_qp(ibqp); |
1295 | @@ -361,9 +353,14 @@ static int hns_roce_v1_post_recv(struct ib_qp *ibqp, |
1296 | struct device *dev = &hr_dev->pdev->dev; |
1297 | struct hns_roce_rq_db rq_db; |
1298 | __le32 doorbell[2] = {0}; |
1299 | + unsigned long flags = 0; |
1300 | + unsigned int wqe_idx; |
1301 | + int ret = 0; |
1302 | + int nreq = 0; |
1303 | + int i = 0; |
1304 | + u32 reg_val; |
1305 | |
1306 | spin_lock_irqsave(&hr_qp->rq.lock, flags); |
1307 | - ind = hr_qp->rq.head & (hr_qp->rq.wqe_cnt - 1); |
1308 | |
1309 | for (nreq = 0; wr; ++nreq, wr = wr->next) { |
1310 | if (hns_roce_wq_overflow(&hr_qp->rq, nreq, |
1311 | @@ -373,6 +370,8 @@ static int hns_roce_v1_post_recv(struct ib_qp *ibqp, |
1312 | goto out; |
1313 | } |
1314 | |
1315 | + wqe_idx = (hr_qp->rq.head + nreq) & (hr_qp->rq.wqe_cnt - 1); |
1316 | + |
1317 | if (unlikely(wr->num_sge > hr_qp->rq.max_gs)) { |
1318 | dev_err(dev, "rq:num_sge=%d > qp->sq.max_gs=%d\n", |
1319 | wr->num_sge, hr_qp->rq.max_gs); |
1320 | @@ -381,7 +380,7 @@ static int hns_roce_v1_post_recv(struct ib_qp *ibqp, |
1321 | goto out; |
1322 | } |
1323 | |
1324 | - ctrl = get_recv_wqe(hr_qp, ind); |
1325 | + ctrl = get_recv_wqe(hr_qp, wqe_idx); |
1326 | |
1327 | roce_set_field(ctrl->rwqe_byte_12, |
1328 | RQ_WQE_CTRL_RWQE_BYTE_12_RWQE_SGE_NUM_M, |
1329 | @@ -393,9 +392,7 @@ static int hns_roce_v1_post_recv(struct ib_qp *ibqp, |
1330 | for (i = 0; i < wr->num_sge; i++) |
1331 | set_data_seg(scat + i, wr->sg_list + i); |
1332 | |
1333 | - hr_qp->rq.wrid[ind] = wr->wr_id; |
1334 | - |
1335 | - ind = (ind + 1) & (hr_qp->rq.wqe_cnt - 1); |
1336 | + hr_qp->rq.wrid[wqe_idx] = wr->wr_id; |
1337 | } |
1338 | |
1339 | out: |
1340 | @@ -2702,7 +2699,6 @@ static int hns_roce_v1_m_sqp(struct ib_qp *ibqp, const struct ib_qp_attr *attr, |
1341 | hr_qp->rq.tail = 0; |
1342 | hr_qp->sq.head = 0; |
1343 | hr_qp->sq.tail = 0; |
1344 | - hr_qp->sq_next_wqe = 0; |
1345 | } |
1346 | |
1347 | kfree(context); |
1348 | @@ -3316,7 +3312,6 @@ static int hns_roce_v1_m_qp(struct ib_qp *ibqp, const struct ib_qp_attr *attr, |
1349 | hr_qp->rq.tail = 0; |
1350 | hr_qp->sq.head = 0; |
1351 | hr_qp->sq.tail = 0; |
1352 | - hr_qp->sq_next_wqe = 0; |
1353 | } |
1354 | out: |
1355 | kfree(context); |
1356 | diff --git a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c |
1357 | index 79294f278b26..4540b00ccee9 100644 |
1358 | --- a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c |
1359 | +++ b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c |
1360 | @@ -110,7 +110,7 @@ static void set_atomic_seg(struct hns_roce_wqe_atomic_seg *aseg, |
1361 | } |
1362 | |
1363 | static void set_extend_sge(struct hns_roce_qp *qp, const struct ib_send_wr *wr, |
1364 | - unsigned int *sge_ind) |
1365 | + unsigned int *sge_ind, int valid_num_sge) |
1366 | { |
1367 | struct hns_roce_v2_wqe_data_seg *dseg; |
1368 | struct ib_sge *sg; |
1369 | @@ -123,7 +123,7 @@ static void set_extend_sge(struct hns_roce_qp *qp, const struct ib_send_wr *wr, |
1370 | |
1371 | if (qp->ibqp.qp_type == IB_QPT_RC || qp->ibqp.qp_type == IB_QPT_UC) |
1372 | num_in_wqe = HNS_ROCE_V2_UC_RC_SGE_NUM_IN_WQE; |
1373 | - extend_sge_num = wr->num_sge - num_in_wqe; |
1374 | + extend_sge_num = valid_num_sge - num_in_wqe; |
1375 | sg = wr->sg_list + num_in_wqe; |
1376 | shift = qp->hr_buf.page_shift; |
1377 | |
1378 | @@ -159,14 +159,16 @@ static void set_extend_sge(struct hns_roce_qp *qp, const struct ib_send_wr *wr, |
1379 | static int set_rwqe_data_seg(struct ib_qp *ibqp, const struct ib_send_wr *wr, |
1380 | struct hns_roce_v2_rc_send_wqe *rc_sq_wqe, |
1381 | void *wqe, unsigned int *sge_ind, |
1382 | + int valid_num_sge, |
1383 | const struct ib_send_wr **bad_wr) |
1384 | { |
1385 | struct hns_roce_dev *hr_dev = to_hr_dev(ibqp->device); |
1386 | struct hns_roce_v2_wqe_data_seg *dseg = wqe; |
1387 | struct hns_roce_qp *qp = to_hr_qp(ibqp); |
1388 | + int j = 0; |
1389 | int i; |
1390 | |
1391 | - if (wr->send_flags & IB_SEND_INLINE && wr->num_sge) { |
1392 | + if (wr->send_flags & IB_SEND_INLINE && valid_num_sge) { |
1393 | if (le32_to_cpu(rc_sq_wqe->msg_len) > |
1394 | hr_dev->caps.max_sq_inline) { |
1395 | *bad_wr = wr; |
1396 | @@ -190,7 +192,7 @@ static int set_rwqe_data_seg(struct ib_qp *ibqp, const struct ib_send_wr *wr, |
1397 | roce_set_bit(rc_sq_wqe->byte_4, V2_RC_SEND_WQE_BYTE_4_INLINE_S, |
1398 | 1); |
1399 | } else { |
1400 | - if (wr->num_sge <= HNS_ROCE_V2_UC_RC_SGE_NUM_IN_WQE) { |
1401 | + if (valid_num_sge <= HNS_ROCE_V2_UC_RC_SGE_NUM_IN_WQE) { |
1402 | for (i = 0; i < wr->num_sge; i++) { |
1403 | if (likely(wr->sg_list[i].length)) { |
1404 | set_data_seg_v2(dseg, wr->sg_list + i); |
1405 | @@ -203,19 +205,21 @@ static int set_rwqe_data_seg(struct ib_qp *ibqp, const struct ib_send_wr *wr, |
1406 | V2_RC_SEND_WQE_BYTE_20_MSG_START_SGE_IDX_S, |
1407 | (*sge_ind) & (qp->sge.sge_cnt - 1)); |
1408 | |
1409 | - for (i = 0; i < HNS_ROCE_V2_UC_RC_SGE_NUM_IN_WQE; i++) { |
1410 | + for (i = 0; i < wr->num_sge && |
1411 | + j < HNS_ROCE_V2_UC_RC_SGE_NUM_IN_WQE; i++) { |
1412 | if (likely(wr->sg_list[i].length)) { |
1413 | set_data_seg_v2(dseg, wr->sg_list + i); |
1414 | dseg++; |
1415 | + j++; |
1416 | } |
1417 | } |
1418 | |
1419 | - set_extend_sge(qp, wr, sge_ind); |
1420 | + set_extend_sge(qp, wr, sge_ind, valid_num_sge); |
1421 | } |
1422 | |
1423 | roce_set_field(rc_sq_wqe->byte_16, |
1424 | V2_RC_SEND_WQE_BYTE_16_SGE_NUM_M, |
1425 | - V2_RC_SEND_WQE_BYTE_16_SGE_NUM_S, wr->num_sge); |
1426 | + V2_RC_SEND_WQE_BYTE_16_SGE_NUM_S, valid_num_sge); |
1427 | } |
1428 | |
1429 | return 0; |
1430 | @@ -239,10 +243,11 @@ static int hns_roce_v2_post_send(struct ib_qp *ibqp, |
1431 | struct device *dev = hr_dev->dev; |
1432 | struct hns_roce_v2_db sq_db; |
1433 | struct ib_qp_attr attr; |
1434 | - unsigned int sge_ind; |
1435 | unsigned int owner_bit; |
1436 | + unsigned int sge_idx; |
1437 | + unsigned int wqe_idx; |
1438 | unsigned long flags; |
1439 | - unsigned int ind; |
1440 | + int valid_num_sge; |
1441 | void *wqe = NULL; |
1442 | bool loopback; |
1443 | int attr_mask; |
1444 | @@ -269,8 +274,7 @@ static int hns_roce_v2_post_send(struct ib_qp *ibqp, |
1445 | } |
1446 | |
1447 | spin_lock_irqsave(&qp->sq.lock, flags); |
1448 | - ind = qp->sq_next_wqe; |
1449 | - sge_ind = qp->next_sge; |
1450 | + sge_idx = qp->next_sge; |
1451 | |
1452 | for (nreq = 0; wr; ++nreq, wr = wr->next) { |
1453 | if (hns_roce_wq_overflow(&qp->sq, nreq, qp->ibqp.send_cq)) { |
1454 | @@ -279,6 +283,8 @@ static int hns_roce_v2_post_send(struct ib_qp *ibqp, |
1455 | goto out; |
1456 | } |
1457 | |
1458 | + wqe_idx = (qp->sq.head + nreq) & (qp->sq.wqe_cnt - 1); |
1459 | + |
1460 | if (unlikely(wr->num_sge > qp->sq.max_gs)) { |
1461 | dev_err(dev, "num_sge=%d > qp->sq.max_gs=%d\n", |
1462 | wr->num_sge, qp->sq.max_gs); |
1463 | @@ -287,14 +293,20 @@ static int hns_roce_v2_post_send(struct ib_qp *ibqp, |
1464 | goto out; |
1465 | } |
1466 | |
1467 | - wqe = get_send_wqe(qp, ind & (qp->sq.wqe_cnt - 1)); |
1468 | - qp->sq.wrid[(qp->sq.head + nreq) & (qp->sq.wqe_cnt - 1)] = |
1469 | - wr->wr_id; |
1470 | - |
1471 | + wqe = get_send_wqe(qp, wqe_idx); |
1472 | + qp->sq.wrid[wqe_idx] = wr->wr_id; |
1473 | owner_bit = |
1474 | ~(((qp->sq.head + nreq) >> ilog2(qp->sq.wqe_cnt)) & 0x1); |
1475 | + valid_num_sge = 0; |
1476 | tmp_len = 0; |
1477 | |
1478 | + for (i = 0; i < wr->num_sge; i++) { |
1479 | + if (likely(wr->sg_list[i].length)) { |
1480 | + tmp_len += wr->sg_list[i].length; |
1481 | + valid_num_sge++; |
1482 | + } |
1483 | + } |
1484 | + |
1485 | /* Corresponding to the QP type, wqe process separately */ |
1486 | if (ibqp->qp_type == IB_QPT_GSI) { |
1487 | ud_sq_wqe = wqe; |
1488 | @@ -330,9 +342,6 @@ static int hns_roce_v2_post_send(struct ib_qp *ibqp, |
1489 | V2_UD_SEND_WQE_BYTE_4_OPCODE_S, |
1490 | HNS_ROCE_V2_WQE_OP_SEND); |
1491 | |
1492 | - for (i = 0; i < wr->num_sge; i++) |
1493 | - tmp_len += wr->sg_list[i].length; |
1494 | - |
1495 | ud_sq_wqe->msg_len = |
1496 | cpu_to_le32(le32_to_cpu(ud_sq_wqe->msg_len) + tmp_len); |
1497 | |
1498 | @@ -368,12 +377,12 @@ static int hns_roce_v2_post_send(struct ib_qp *ibqp, |
1499 | roce_set_field(ud_sq_wqe->byte_16, |
1500 | V2_UD_SEND_WQE_BYTE_16_SGE_NUM_M, |
1501 | V2_UD_SEND_WQE_BYTE_16_SGE_NUM_S, |
1502 | - wr->num_sge); |
1503 | + valid_num_sge); |
1504 | |
1505 | roce_set_field(ud_sq_wqe->byte_20, |
1506 | V2_UD_SEND_WQE_BYTE_20_MSG_START_SGE_IDX_M, |
1507 | V2_UD_SEND_WQE_BYTE_20_MSG_START_SGE_IDX_S, |
1508 | - sge_ind & (qp->sge.sge_cnt - 1)); |
1509 | + sge_idx & (qp->sge.sge_cnt - 1)); |
1510 | |
1511 | roce_set_field(ud_sq_wqe->byte_24, |
1512 | V2_UD_SEND_WQE_BYTE_24_UDPSPN_M, |
1513 | @@ -423,13 +432,10 @@ static int hns_roce_v2_post_send(struct ib_qp *ibqp, |
1514 | memcpy(&ud_sq_wqe->dgid[0], &ah->av.dgid[0], |
1515 | GID_LEN_V2); |
1516 | |
1517 | - set_extend_sge(qp, wr, &sge_ind); |
1518 | - ind++; |
1519 | + set_extend_sge(qp, wr, &sge_idx, valid_num_sge); |
1520 | } else if (ibqp->qp_type == IB_QPT_RC) { |
1521 | rc_sq_wqe = wqe; |
1522 | memset(rc_sq_wqe, 0, sizeof(*rc_sq_wqe)); |
1523 | - for (i = 0; i < wr->num_sge; i++) |
1524 | - tmp_len += wr->sg_list[i].length; |
1525 | |
1526 | rc_sq_wqe->msg_len = |
1527 | cpu_to_le32(le32_to_cpu(rc_sq_wqe->msg_len) + tmp_len); |
1528 | @@ -550,15 +556,14 @@ static int hns_roce_v2_post_send(struct ib_qp *ibqp, |
1529 | roce_set_field(rc_sq_wqe->byte_16, |
1530 | V2_RC_SEND_WQE_BYTE_16_SGE_NUM_M, |
1531 | V2_RC_SEND_WQE_BYTE_16_SGE_NUM_S, |
1532 | - wr->num_sge); |
1533 | + valid_num_sge); |
1534 | } else if (wr->opcode != IB_WR_REG_MR) { |
1535 | ret = set_rwqe_data_seg(ibqp, wr, rc_sq_wqe, |
1536 | - wqe, &sge_ind, bad_wr); |
1537 | + wqe, &sge_idx, |
1538 | + valid_num_sge, bad_wr); |
1539 | if (ret) |
1540 | goto out; |
1541 | } |
1542 | - |
1543 | - ind++; |
1544 | } else { |
1545 | dev_err(dev, "Illegal qp_type(0x%x)\n", ibqp->qp_type); |
1546 | spin_unlock_irqrestore(&qp->sq.lock, flags); |
1547 | @@ -588,8 +593,7 @@ out: |
1548 | |
1549 | hns_roce_write64(hr_dev, (__le32 *)&sq_db, qp->sq.db_reg_l); |
1550 | |
1551 | - qp->sq_next_wqe = ind; |
1552 | - qp->next_sge = sge_ind; |
1553 | + qp->next_sge = sge_idx; |
1554 | |
1555 | if (qp->state == IB_QPS_ERR) { |
1556 | attr_mask = IB_QP_STATE; |
1557 | @@ -623,13 +627,12 @@ static int hns_roce_v2_post_recv(struct ib_qp *ibqp, |
1558 | unsigned long flags; |
1559 | void *wqe = NULL; |
1560 | int attr_mask; |
1561 | + u32 wqe_idx; |
1562 | int ret = 0; |
1563 | int nreq; |
1564 | - int ind; |
1565 | int i; |
1566 | |
1567 | spin_lock_irqsave(&hr_qp->rq.lock, flags); |
1568 | - ind = hr_qp->rq.head & (hr_qp->rq.wqe_cnt - 1); |
1569 | |
1570 | if (hr_qp->state == IB_QPS_RESET) { |
1571 | spin_unlock_irqrestore(&hr_qp->rq.lock, flags); |
1572 | @@ -645,6 +648,8 @@ static int hns_roce_v2_post_recv(struct ib_qp *ibqp, |
1573 | goto out; |
1574 | } |
1575 | |
1576 | + wqe_idx = (hr_qp->rq.head + nreq) & (hr_qp->rq.wqe_cnt - 1); |
1577 | + |
1578 | if (unlikely(wr->num_sge > hr_qp->rq.max_gs)) { |
1579 | dev_err(dev, "rq:num_sge=%d > qp->sq.max_gs=%d\n", |
1580 | wr->num_sge, hr_qp->rq.max_gs); |
1581 | @@ -653,7 +658,7 @@ static int hns_roce_v2_post_recv(struct ib_qp *ibqp, |
1582 | goto out; |
1583 | } |
1584 | |
1585 | - wqe = get_recv_wqe(hr_qp, ind); |
1586 | + wqe = get_recv_wqe(hr_qp, wqe_idx); |
1587 | dseg = (struct hns_roce_v2_wqe_data_seg *)wqe; |
1588 | for (i = 0; i < wr->num_sge; i++) { |
1589 | if (!wr->sg_list[i].length) |
1590 | @@ -669,8 +674,8 @@ static int hns_roce_v2_post_recv(struct ib_qp *ibqp, |
1591 | |
1592 | /* rq support inline data */ |
1593 | if (hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_RQ_INLINE) { |
1594 | - sge_list = hr_qp->rq_inl_buf.wqe_list[ind].sg_list; |
1595 | - hr_qp->rq_inl_buf.wqe_list[ind].sge_cnt = |
1596 | + sge_list = hr_qp->rq_inl_buf.wqe_list[wqe_idx].sg_list; |
1597 | + hr_qp->rq_inl_buf.wqe_list[wqe_idx].sge_cnt = |
1598 | (u32)wr->num_sge; |
1599 | for (i = 0; i < wr->num_sge; i++) { |
1600 | sge_list[i].addr = |
1601 | @@ -679,9 +684,7 @@ static int hns_roce_v2_post_recv(struct ib_qp *ibqp, |
1602 | } |
1603 | } |
1604 | |
1605 | - hr_qp->rq.wrid[ind] = wr->wr_id; |
1606 | - |
1607 | - ind = (ind + 1) & (hr_qp->rq.wqe_cnt - 1); |
1608 | + hr_qp->rq.wrid[wqe_idx] = wr->wr_id; |
1609 | } |
1610 | |
1611 | out: |
1612 | @@ -4465,7 +4468,6 @@ static int hns_roce_v2_modify_qp(struct ib_qp *ibqp, |
1613 | hr_qp->rq.tail = 0; |
1614 | hr_qp->sq.head = 0; |
1615 | hr_qp->sq.tail = 0; |
1616 | - hr_qp->sq_next_wqe = 0; |
1617 | hr_qp->next_sge = 0; |
1618 | if (hr_qp->rq.wqe_cnt) |
1619 | *hr_qp->rdb.db_record = 0; |
1620 | diff --git a/drivers/infiniband/sw/siw/siw_cm.c b/drivers/infiniband/sw/siw/siw_cm.c |
1621 | index 0454561718d9..31aa41d85ccf 100644 |
1622 | --- a/drivers/infiniband/sw/siw/siw_cm.c |
1623 | +++ b/drivers/infiniband/sw/siw/siw_cm.c |
1624 | @@ -1225,10 +1225,9 @@ static void siw_cm_llp_data_ready(struct sock *sk) |
1625 | read_lock(&sk->sk_callback_lock); |
1626 | |
1627 | cep = sk_to_cep(sk); |
1628 | - if (!cep) { |
1629 | - WARN_ON(1); |
1630 | + if (!cep) |
1631 | goto out; |
1632 | - } |
1633 | + |
1634 | siw_dbg_cep(cep, "state: %d\n", cep->state); |
1635 | |
1636 | switch (cep->state) { |
1637 | diff --git a/drivers/macintosh/therm_windtunnel.c b/drivers/macintosh/therm_windtunnel.c |
1638 | index 8c744578122a..a0d87ed9da69 100644 |
1639 | --- a/drivers/macintosh/therm_windtunnel.c |
1640 | +++ b/drivers/macintosh/therm_windtunnel.c |
1641 | @@ -300,9 +300,11 @@ static int control_loop(void *dummy) |
1642 | /* i2c probing and setup */ |
1643 | /************************************************************************/ |
1644 | |
1645 | -static int |
1646 | -do_attach( struct i2c_adapter *adapter ) |
1647 | +static void do_attach(struct i2c_adapter *adapter) |
1648 | { |
1649 | + struct i2c_board_info info = { }; |
1650 | + struct device_node *np; |
1651 | + |
1652 | /* scan 0x48-0x4f (DS1775) and 0x2c-2x2f (ADM1030) */ |
1653 | static const unsigned short scan_ds1775[] = { |
1654 | 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, |
1655 | @@ -313,25 +315,24 @@ do_attach( struct i2c_adapter *adapter ) |
1656 | I2C_CLIENT_END |
1657 | }; |
1658 | |
1659 | - if( strncmp(adapter->name, "uni-n", 5) ) |
1660 | - return 0; |
1661 | - |
1662 | - if( !x.running ) { |
1663 | - struct i2c_board_info info; |
1664 | + if (x.running || strncmp(adapter->name, "uni-n", 5)) |
1665 | + return; |
1666 | |
1667 | - memset(&info, 0, sizeof(struct i2c_board_info)); |
1668 | - strlcpy(info.type, "therm_ds1775", I2C_NAME_SIZE); |
1669 | + np = of_find_compatible_node(adapter->dev.of_node, NULL, "MAC,ds1775"); |
1670 | + if (np) { |
1671 | + of_node_put(np); |
1672 | + } else { |
1673 | + strlcpy(info.type, "MAC,ds1775", I2C_NAME_SIZE); |
1674 | i2c_new_probed_device(adapter, &info, scan_ds1775, NULL); |
1675 | + } |
1676 | |
1677 | - strlcpy(info.type, "therm_adm1030", I2C_NAME_SIZE); |
1678 | + np = of_find_compatible_node(adapter->dev.of_node, NULL, "MAC,adm1030"); |
1679 | + if (np) { |
1680 | + of_node_put(np); |
1681 | + } else { |
1682 | + strlcpy(info.type, "MAC,adm1030", I2C_NAME_SIZE); |
1683 | i2c_new_probed_device(adapter, &info, scan_adm1030, NULL); |
1684 | - |
1685 | - if( x.thermostat && x.fan ) { |
1686 | - x.running = 1; |
1687 | - x.poll_task = kthread_run(control_loop, NULL, "g4fand"); |
1688 | - } |
1689 | } |
1690 | - return 0; |
1691 | } |
1692 | |
1693 | static int |
1694 | @@ -404,8 +405,8 @@ out: |
1695 | enum chip { ds1775, adm1030 }; |
1696 | |
1697 | static const struct i2c_device_id therm_windtunnel_id[] = { |
1698 | - { "therm_ds1775", ds1775 }, |
1699 | - { "therm_adm1030", adm1030 }, |
1700 | + { "MAC,ds1775", ds1775 }, |
1701 | + { "MAC,adm1030", adm1030 }, |
1702 | { } |
1703 | }; |
1704 | MODULE_DEVICE_TABLE(i2c, therm_windtunnel_id); |
1705 | @@ -414,6 +415,7 @@ static int |
1706 | do_probe(struct i2c_client *cl, const struct i2c_device_id *id) |
1707 | { |
1708 | struct i2c_adapter *adapter = cl->adapter; |
1709 | + int ret = 0; |
1710 | |
1711 | if( !i2c_check_functionality(adapter, I2C_FUNC_SMBUS_WORD_DATA |
1712 | | I2C_FUNC_SMBUS_WRITE_BYTE) ) |
1713 | @@ -421,11 +423,19 @@ do_probe(struct i2c_client *cl, const struct i2c_device_id *id) |
1714 | |
1715 | switch (id->driver_data) { |
1716 | case adm1030: |
1717 | - return attach_fan( cl ); |
1718 | + ret = attach_fan(cl); |
1719 | + break; |
1720 | case ds1775: |
1721 | - return attach_thermostat(cl); |
1722 | + ret = attach_thermostat(cl); |
1723 | + break; |
1724 | } |
1725 | - return 0; |
1726 | + |
1727 | + if (!x.running && x.thermostat && x.fan) { |
1728 | + x.running = 1; |
1729 | + x.poll_task = kthread_run(control_loop, NULL, "g4fand"); |
1730 | + } |
1731 | + |
1732 | + return ret; |
1733 | } |
1734 | |
1735 | static struct i2c_driver g4fan_driver = { |
1736 | diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c |
1737 | index 7dcd709f4ac3..703c5c2c80e5 100644 |
1738 | --- a/drivers/net/bonding/bond_main.c |
1739 | +++ b/drivers/net/bonding/bond_main.c |
1740 | @@ -3436,6 +3436,47 @@ static void bond_fold_stats(struct rtnl_link_stats64 *_res, |
1741 | } |
1742 | } |
1743 | |
1744 | +#ifdef CONFIG_LOCKDEP |
1745 | +static int bond_get_lowest_level_rcu(struct net_device *dev) |
1746 | +{ |
1747 | + struct net_device *ldev, *next, *now, *dev_stack[MAX_NEST_DEV + 1]; |
1748 | + struct list_head *niter, *iter, *iter_stack[MAX_NEST_DEV + 1]; |
1749 | + int cur = 0, max = 0; |
1750 | + |
1751 | + now = dev; |
1752 | + iter = &dev->adj_list.lower; |
1753 | + |
1754 | + while (1) { |
1755 | + next = NULL; |
1756 | + while (1) { |
1757 | + ldev = netdev_next_lower_dev_rcu(now, &iter); |
1758 | + if (!ldev) |
1759 | + break; |
1760 | + |
1761 | + next = ldev; |
1762 | + niter = &ldev->adj_list.lower; |
1763 | + dev_stack[cur] = now; |
1764 | + iter_stack[cur++] = iter; |
1765 | + if (max <= cur) |
1766 | + max = cur; |
1767 | + break; |
1768 | + } |
1769 | + |
1770 | + if (!next) { |
1771 | + if (!cur) |
1772 | + return max; |
1773 | + next = dev_stack[--cur]; |
1774 | + niter = iter_stack[cur]; |
1775 | + } |
1776 | + |
1777 | + now = next; |
1778 | + iter = niter; |
1779 | + } |
1780 | + |
1781 | + return max; |
1782 | +} |
1783 | +#endif |
1784 | + |
1785 | static void bond_get_stats(struct net_device *bond_dev, |
1786 | struct rtnl_link_stats64 *stats) |
1787 | { |
1788 | @@ -3443,11 +3484,17 @@ static void bond_get_stats(struct net_device *bond_dev, |
1789 | struct rtnl_link_stats64 temp; |
1790 | struct list_head *iter; |
1791 | struct slave *slave; |
1792 | + int nest_level = 0; |
1793 | |
1794 | - spin_lock(&bond->stats_lock); |
1795 | - memcpy(stats, &bond->bond_stats, sizeof(*stats)); |
1796 | |
1797 | rcu_read_lock(); |
1798 | +#ifdef CONFIG_LOCKDEP |
1799 | + nest_level = bond_get_lowest_level_rcu(bond_dev); |
1800 | +#endif |
1801 | + |
1802 | + spin_lock_nested(&bond->stats_lock, nest_level); |
1803 | + memcpy(stats, &bond->bond_stats, sizeof(*stats)); |
1804 | + |
1805 | bond_for_each_slave_rcu(bond, slave, iter) { |
1806 | const struct rtnl_link_stats64 *new = |
1807 | dev_get_stats(slave->dev, &temp); |
1808 | @@ -3457,10 +3504,10 @@ static void bond_get_stats(struct net_device *bond_dev, |
1809 | /* save off the slave stats for the next run */ |
1810 | memcpy(&slave->slave_stats, new, sizeof(*new)); |
1811 | } |
1812 | - rcu_read_unlock(); |
1813 | |
1814 | memcpy(&bond->bond_stats, stats, sizeof(*stats)); |
1815 | spin_unlock(&bond->stats_lock); |
1816 | + rcu_read_unlock(); |
1817 | } |
1818 | |
1819 | static int bond_do_ioctl(struct net_device *bond_dev, struct ifreq *ifr, int cmd) |
1820 | @@ -3550,6 +3597,8 @@ static int bond_do_ioctl(struct net_device *bond_dev, struct ifreq *ifr, int cmd |
1821 | case BOND_RELEASE_OLD: |
1822 | case SIOCBONDRELEASE: |
1823 | res = bond_release(bond_dev, slave_dev); |
1824 | + if (!res) |
1825 | + netdev_update_lockdep_key(slave_dev); |
1826 | break; |
1827 | case BOND_SETHWADDR_OLD: |
1828 | case SIOCBONDSETHWADDR: |
1829 | diff --git a/drivers/net/bonding/bond_options.c b/drivers/net/bonding/bond_options.c |
1830 | index ddb3916d3506..215c10923289 100644 |
1831 | --- a/drivers/net/bonding/bond_options.c |
1832 | +++ b/drivers/net/bonding/bond_options.c |
1833 | @@ -1398,6 +1398,8 @@ static int bond_option_slaves_set(struct bonding *bond, |
1834 | case '-': |
1835 | slave_dbg(bond->dev, dev, "Releasing interface\n"); |
1836 | ret = bond_release(bond->dev, dev); |
1837 | + if (!ret) |
1838 | + netdev_update_lockdep_key(dev); |
1839 | break; |
1840 | |
1841 | default: |
1842 | diff --git a/drivers/net/dsa/b53/b53_common.c b/drivers/net/dsa/b53/b53_common.c |
1843 | index 7ed667b304d1..d618650533b6 100644 |
1844 | --- a/drivers/net/dsa/b53/b53_common.c |
1845 | +++ b/drivers/net/dsa/b53/b53_common.c |
1846 | @@ -1353,6 +1353,9 @@ void b53_vlan_add(struct dsa_switch *ds, int port, |
1847 | |
1848 | b53_get_vlan_entry(dev, vid, vl); |
1849 | |
1850 | + if (vid == 0 && vid == b53_default_pvid(dev)) |
1851 | + untagged = true; |
1852 | + |
1853 | vl->members |= BIT(port); |
1854 | if (untagged && !dsa_is_cpu_port(ds, port)) |
1855 | vl->untag |= BIT(port); |
1856 | diff --git a/drivers/net/ethernet/amazon/ena/ena_com.c b/drivers/net/ethernet/amazon/ena/ena_com.c |
1857 | index ea62604fdf8c..48de4bee209e 100644 |
1858 | --- a/drivers/net/ethernet/amazon/ena/ena_com.c |
1859 | +++ b/drivers/net/ethernet/amazon/ena/ena_com.c |
1860 | @@ -200,6 +200,11 @@ static void comp_ctxt_release(struct ena_com_admin_queue *queue, |
1861 | static struct ena_comp_ctx *get_comp_ctxt(struct ena_com_admin_queue *queue, |
1862 | u16 command_id, bool capture) |
1863 | { |
1864 | + if (unlikely(!queue->comp_ctx)) { |
1865 | + pr_err("Completion context is NULL\n"); |
1866 | + return NULL; |
1867 | + } |
1868 | + |
1869 | if (unlikely(command_id >= queue->q_depth)) { |
1870 | pr_err("command id is larger than the queue size. cmd_id: %u queue size %d\n", |
1871 | command_id, queue->q_depth); |
1872 | @@ -1041,9 +1046,41 @@ static int ena_com_get_feature(struct ena_com_dev *ena_dev, |
1873 | feature_ver); |
1874 | } |
1875 | |
1876 | +static void ena_com_hash_key_fill_default_key(struct ena_com_dev *ena_dev) |
1877 | +{ |
1878 | + struct ena_admin_feature_rss_flow_hash_control *hash_key = |
1879 | + (ena_dev->rss).hash_key; |
1880 | + |
1881 | + netdev_rss_key_fill(&hash_key->key, sizeof(hash_key->key)); |
1882 | + /* The key is stored in the device in u32 array |
1883 | + * as well as the API requires the key to be passed in this |
1884 | + * format. Thus the size of our array should be divided by 4 |
1885 | + */ |
1886 | + hash_key->keys_num = sizeof(hash_key->key) / sizeof(u32); |
1887 | +} |
1888 | + |
1889 | +int ena_com_get_current_hash_function(struct ena_com_dev *ena_dev) |
1890 | +{ |
1891 | + return ena_dev->rss.hash_func; |
1892 | +} |
1893 | + |
1894 | static int ena_com_hash_key_allocate(struct ena_com_dev *ena_dev) |
1895 | { |
1896 | struct ena_rss *rss = &ena_dev->rss; |
1897 | + struct ena_admin_feature_rss_flow_hash_control *hash_key; |
1898 | + struct ena_admin_get_feat_resp get_resp; |
1899 | + int rc; |
1900 | + |
1901 | + hash_key = (ena_dev->rss).hash_key; |
1902 | + |
1903 | + rc = ena_com_get_feature_ex(ena_dev, &get_resp, |
1904 | + ENA_ADMIN_RSS_HASH_FUNCTION, |
1905 | + ena_dev->rss.hash_key_dma_addr, |
1906 | + sizeof(ena_dev->rss.hash_key), 0); |
1907 | + if (unlikely(rc)) { |
1908 | + hash_key = NULL; |
1909 | + return -EOPNOTSUPP; |
1910 | + } |
1911 | |
1912 | rss->hash_key = |
1913 | dma_alloc_coherent(ena_dev->dmadev, sizeof(*rss->hash_key), |
1914 | @@ -1254,30 +1291,6 @@ static int ena_com_ind_tbl_convert_to_device(struct ena_com_dev *ena_dev) |
1915 | return 0; |
1916 | } |
1917 | |
1918 | -static int ena_com_ind_tbl_convert_from_device(struct ena_com_dev *ena_dev) |
1919 | -{ |
1920 | - u16 dev_idx_to_host_tbl[ENA_TOTAL_NUM_QUEUES] = { (u16)-1 }; |
1921 | - struct ena_rss *rss = &ena_dev->rss; |
1922 | - u8 idx; |
1923 | - u16 i; |
1924 | - |
1925 | - for (i = 0; i < ENA_TOTAL_NUM_QUEUES; i++) |
1926 | - dev_idx_to_host_tbl[ena_dev->io_sq_queues[i].idx] = i; |
1927 | - |
1928 | - for (i = 0; i < 1 << rss->tbl_log_size; i++) { |
1929 | - if (rss->rss_ind_tbl[i].cq_idx > ENA_TOTAL_NUM_QUEUES) |
1930 | - return -EINVAL; |
1931 | - idx = (u8)rss->rss_ind_tbl[i].cq_idx; |
1932 | - |
1933 | - if (dev_idx_to_host_tbl[idx] > ENA_TOTAL_NUM_QUEUES) |
1934 | - return -EINVAL; |
1935 | - |
1936 | - rss->host_rss_ind_tbl[i] = dev_idx_to_host_tbl[idx]; |
1937 | - } |
1938 | - |
1939 | - return 0; |
1940 | -} |
1941 | - |
1942 | static void ena_com_update_intr_delay_resolution(struct ena_com_dev *ena_dev, |
1943 | u16 intr_delay_resolution) |
1944 | { |
1945 | @@ -2297,15 +2310,16 @@ int ena_com_fill_hash_function(struct ena_com_dev *ena_dev, |
1946 | |
1947 | switch (func) { |
1948 | case ENA_ADMIN_TOEPLITZ: |
1949 | - if (key_len > sizeof(hash_key->key)) { |
1950 | - pr_err("key len (%hu) is bigger than the max supported (%zu)\n", |
1951 | - key_len, sizeof(hash_key->key)); |
1952 | - return -EINVAL; |
1953 | + if (key) { |
1954 | + if (key_len != sizeof(hash_key->key)) { |
1955 | + pr_err("key len (%hu) doesn't equal the supported size (%zu)\n", |
1956 | + key_len, sizeof(hash_key->key)); |
1957 | + return -EINVAL; |
1958 | + } |
1959 | + memcpy(hash_key->key, key, key_len); |
1960 | + rss->hash_init_val = init_val; |
1961 | + hash_key->keys_num = key_len >> 2; |
1962 | } |
1963 | - |
1964 | - memcpy(hash_key->key, key, key_len); |
1965 | - rss->hash_init_val = init_val; |
1966 | - hash_key->keys_num = key_len >> 2; |
1967 | break; |
1968 | case ENA_ADMIN_CRC32: |
1969 | rss->hash_init_val = init_val; |
1970 | @@ -2342,7 +2356,11 @@ int ena_com_get_hash_function(struct ena_com_dev *ena_dev, |
1971 | if (unlikely(rc)) |
1972 | return rc; |
1973 | |
1974 | - rss->hash_func = get_resp.u.flow_hash_func.selected_func; |
1975 | + /* ffs() returns 1 in case the lsb is set */ |
1976 | + rss->hash_func = ffs(get_resp.u.flow_hash_func.selected_func); |
1977 | + if (rss->hash_func) |
1978 | + rss->hash_func--; |
1979 | + |
1980 | if (func) |
1981 | *func = rss->hash_func; |
1982 | |
1983 | @@ -2606,10 +2624,6 @@ int ena_com_indirect_table_get(struct ena_com_dev *ena_dev, u32 *ind_tbl) |
1984 | if (!ind_tbl) |
1985 | return 0; |
1986 | |
1987 | - rc = ena_com_ind_tbl_convert_from_device(ena_dev); |
1988 | - if (unlikely(rc)) |
1989 | - return rc; |
1990 | - |
1991 | for (i = 0; i < (1 << rss->tbl_log_size); i++) |
1992 | ind_tbl[i] = rss->host_rss_ind_tbl[i]; |
1993 | |
1994 | @@ -2626,9 +2640,15 @@ int ena_com_rss_init(struct ena_com_dev *ena_dev, u16 indr_tbl_log_size) |
1995 | if (unlikely(rc)) |
1996 | goto err_indr_tbl; |
1997 | |
1998 | + /* The following function might return unsupported in case the |
1999 | + * device doesn't support setting the key / hash function. We can safely |
2000 | + * ignore this error and have indirection table support only. |
2001 | + */ |
2002 | rc = ena_com_hash_key_allocate(ena_dev); |
2003 | - if (unlikely(rc)) |
2004 | + if (unlikely(rc) && rc != -EOPNOTSUPP) |
2005 | goto err_hash_key; |
2006 | + else if (rc != -EOPNOTSUPP) |
2007 | + ena_com_hash_key_fill_default_key(ena_dev); |
2008 | |
2009 | rc = ena_com_hash_ctrl_init(ena_dev); |
2010 | if (unlikely(rc)) |
2011 | diff --git a/drivers/net/ethernet/amazon/ena/ena_com.h b/drivers/net/ethernet/amazon/ena/ena_com.h |
2012 | index 0ce37d54ed10..469f298199a7 100644 |
2013 | --- a/drivers/net/ethernet/amazon/ena/ena_com.h |
2014 | +++ b/drivers/net/ethernet/amazon/ena/ena_com.h |
2015 | @@ -44,6 +44,7 @@ |
2016 | #include <linux/spinlock.h> |
2017 | #include <linux/types.h> |
2018 | #include <linux/wait.h> |
2019 | +#include <linux/netdevice.h> |
2020 | |
2021 | #include "ena_common_defs.h" |
2022 | #include "ena_admin_defs.h" |
2023 | @@ -655,6 +656,14 @@ int ena_com_rss_init(struct ena_com_dev *ena_dev, u16 log_size); |
2024 | */ |
2025 | void ena_com_rss_destroy(struct ena_com_dev *ena_dev); |
2026 | |
2027 | +/* ena_com_get_current_hash_function - Get RSS hash function |
2028 | + * @ena_dev: ENA communication layer struct |
2029 | + * |
2030 | + * Return the current hash function. |
2031 | + * @return: 0 or one of the ena_admin_hash_functions values. |
2032 | + */ |
2033 | +int ena_com_get_current_hash_function(struct ena_com_dev *ena_dev); |
2034 | + |
2035 | /* ena_com_fill_hash_function - Fill RSS hash function |
2036 | * @ena_dev: ENA communication layer struct |
2037 | * @func: The hash function (Toeplitz or crc) |
2038 | diff --git a/drivers/net/ethernet/amazon/ena/ena_ethtool.c b/drivers/net/ethernet/amazon/ena/ena_ethtool.c |
2039 | index 8c1c73b0ced7..ae631b8770fc 100644 |
2040 | --- a/drivers/net/ethernet/amazon/ena/ena_ethtool.c |
2041 | +++ b/drivers/net/ethernet/amazon/ena/ena_ethtool.c |
2042 | @@ -636,6 +636,28 @@ static u32 ena_get_rxfh_key_size(struct net_device *netdev) |
2043 | return ENA_HASH_KEY_SIZE; |
2044 | } |
2045 | |
2046 | +static int ena_indirection_table_get(struct ena_adapter *adapter, u32 *indir) |
2047 | +{ |
2048 | + struct ena_com_dev *ena_dev = adapter->ena_dev; |
2049 | + int i, rc; |
2050 | + |
2051 | + if (!indir) |
2052 | + return 0; |
2053 | + |
2054 | + rc = ena_com_indirect_table_get(ena_dev, indir); |
2055 | + if (rc) |
2056 | + return rc; |
2057 | + |
2058 | + /* Our internal representation of the indices is: even indices |
2059 | + * for Tx and uneven indices for Rx. We need to convert the Rx |
2060 | + * indices to be consecutive |
2061 | + */ |
2062 | + for (i = 0; i < ENA_RX_RSS_TABLE_SIZE; i++) |
2063 | + indir[i] = ENA_IO_RXQ_IDX_TO_COMBINED_IDX(indir[i]); |
2064 | + |
2065 | + return rc; |
2066 | +} |
2067 | + |
2068 | static int ena_get_rxfh(struct net_device *netdev, u32 *indir, u8 *key, |
2069 | u8 *hfunc) |
2070 | { |
2071 | @@ -644,11 +666,25 @@ static int ena_get_rxfh(struct net_device *netdev, u32 *indir, u8 *key, |
2072 | u8 func; |
2073 | int rc; |
2074 | |
2075 | - rc = ena_com_indirect_table_get(adapter->ena_dev, indir); |
2076 | + rc = ena_indirection_table_get(adapter, indir); |
2077 | if (rc) |
2078 | return rc; |
2079 | |
2080 | + /* We call this function in order to check if the device |
2081 | + * supports getting/setting the hash function. |
2082 | + */ |
2083 | rc = ena_com_get_hash_function(adapter->ena_dev, &ena_func, key); |
2084 | + |
2085 | + if (rc) { |
2086 | + if (rc == -EOPNOTSUPP) { |
2087 | + key = NULL; |
2088 | + hfunc = NULL; |
2089 | + rc = 0; |
2090 | + } |
2091 | + |
2092 | + return rc; |
2093 | + } |
2094 | + |
2095 | if (rc) |
2096 | return rc; |
2097 | |
2098 | @@ -657,7 +693,7 @@ static int ena_get_rxfh(struct net_device *netdev, u32 *indir, u8 *key, |
2099 | func = ETH_RSS_HASH_TOP; |
2100 | break; |
2101 | case ENA_ADMIN_CRC32: |
2102 | - func = ETH_RSS_HASH_XOR; |
2103 | + func = ETH_RSS_HASH_CRC32; |
2104 | break; |
2105 | default: |
2106 | netif_err(adapter, drv, netdev, |
2107 | @@ -700,10 +736,13 @@ static int ena_set_rxfh(struct net_device *netdev, const u32 *indir, |
2108 | } |
2109 | |
2110 | switch (hfunc) { |
2111 | + case ETH_RSS_HASH_NO_CHANGE: |
2112 | + func = ena_com_get_current_hash_function(ena_dev); |
2113 | + break; |
2114 | case ETH_RSS_HASH_TOP: |
2115 | func = ENA_ADMIN_TOEPLITZ; |
2116 | break; |
2117 | - case ETH_RSS_HASH_XOR: |
2118 | + case ETH_RSS_HASH_CRC32: |
2119 | func = ENA_ADMIN_CRC32; |
2120 | break; |
2121 | default: |
2122 | @@ -805,6 +844,7 @@ static const struct ethtool_ops ena_ethtool_ops = { |
2123 | .get_channels = ena_get_channels, |
2124 | .get_tunable = ena_get_tunable, |
2125 | .set_tunable = ena_set_tunable, |
2126 | + .get_ts_info = ethtool_op_get_ts_info, |
2127 | }; |
2128 | |
2129 | void ena_set_ethtool_ops(struct net_device *netdev) |
2130 | diff --git a/drivers/net/ethernet/amazon/ena/ena_netdev.c b/drivers/net/ethernet/amazon/ena/ena_netdev.c |
2131 | index b4a145220aba..f0cddf250cfd 100644 |
2132 | --- a/drivers/net/ethernet/amazon/ena/ena_netdev.c |
2133 | +++ b/drivers/net/ethernet/amazon/ena/ena_netdev.c |
2134 | @@ -3035,8 +3035,8 @@ static void check_for_missing_keep_alive(struct ena_adapter *adapter) |
2135 | if (adapter->keep_alive_timeout == ENA_HW_HINTS_NO_TIMEOUT) |
2136 | return; |
2137 | |
2138 | - keep_alive_expired = round_jiffies(adapter->last_keep_alive_jiffies + |
2139 | - adapter->keep_alive_timeout); |
2140 | + keep_alive_expired = adapter->last_keep_alive_jiffies + |
2141 | + adapter->keep_alive_timeout; |
2142 | if (unlikely(time_is_before_jiffies(keep_alive_expired))) { |
2143 | netif_err(adapter, drv, adapter->netdev, |
2144 | "Keep alive watchdog timeout.\n"); |
2145 | @@ -3138,7 +3138,7 @@ static void ena_timer_service(struct timer_list *t) |
2146 | } |
2147 | |
2148 | /* Reset the timer */ |
2149 | - mod_timer(&adapter->timer_service, jiffies + HZ); |
2150 | + mod_timer(&adapter->timer_service, round_jiffies(jiffies + HZ)); |
2151 | } |
2152 | |
2153 | static int ena_calc_io_queue_num(struct pci_dev *pdev, |
2154 | diff --git a/drivers/net/ethernet/amazon/ena/ena_netdev.h b/drivers/net/ethernet/amazon/ena/ena_netdev.h |
2155 | index 72ee51a82ec7..dc02950a96b8 100644 |
2156 | --- a/drivers/net/ethernet/amazon/ena/ena_netdev.h |
2157 | +++ b/drivers/net/ethernet/amazon/ena/ena_netdev.h |
2158 | @@ -127,6 +127,8 @@ |
2159 | |
2160 | #define ENA_IO_TXQ_IDX(q) (2 * (q)) |
2161 | #define ENA_IO_RXQ_IDX(q) (2 * (q) + 1) |
2162 | +#define ENA_IO_TXQ_IDX_TO_COMBINED_IDX(q) ((q) / 2) |
2163 | +#define ENA_IO_RXQ_IDX_TO_COMBINED_IDX(q) (((q) - 1) / 2) |
2164 | |
2165 | #define ENA_MGMNT_IRQ_IDX 0 |
2166 | #define ENA_IO_IRQ_FIRST_IDX 1 |
2167 | diff --git a/drivers/net/ethernet/apm/xgene/xgene_enet_main.c b/drivers/net/ethernet/apm/xgene/xgene_enet_main.c |
2168 | index d8612131c55e..cc8031ae9aa3 100644 |
2169 | --- a/drivers/net/ethernet/apm/xgene/xgene_enet_main.c |
2170 | +++ b/drivers/net/ethernet/apm/xgene/xgene_enet_main.c |
2171 | @@ -2020,7 +2020,7 @@ static int xgene_enet_probe(struct platform_device *pdev) |
2172 | int ret; |
2173 | |
2174 | ndev = alloc_etherdev_mqs(sizeof(struct xgene_enet_pdata), |
2175 | - XGENE_NUM_RX_RING, XGENE_NUM_TX_RING); |
2176 | + XGENE_NUM_TX_RING, XGENE_NUM_RX_RING); |
2177 | if (!ndev) |
2178 | return -ENOMEM; |
2179 | |
2180 | diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_filters.c b/drivers/net/ethernet/aquantia/atlantic/aq_filters.c |
2181 | index aee827f07c16..01af0f028693 100644 |
2182 | --- a/drivers/net/ethernet/aquantia/atlantic/aq_filters.c |
2183 | +++ b/drivers/net/ethernet/aquantia/atlantic/aq_filters.c |
2184 | @@ -158,7 +158,7 @@ aq_check_approve_fvlan(struct aq_nic_s *aq_nic, |
2185 | } |
2186 | |
2187 | if ((aq_nic->ndev->features & NETIF_F_HW_VLAN_CTAG_FILTER) && |
2188 | - (!test_bit(be16_to_cpu(fsp->h_ext.vlan_tci), |
2189 | + (!test_bit(be16_to_cpu(fsp->h_ext.vlan_tci) & VLAN_VID_MASK, |
2190 | aq_nic->active_vlans))) { |
2191 | netdev_err(aq_nic->ndev, |
2192 | "ethtool: unknown vlan-id specified"); |
2193 | diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_nic.c b/drivers/net/ethernet/aquantia/atlantic/aq_nic.c |
2194 | index 137c1de4c6ec..12949f1ec1ea 100644 |
2195 | --- a/drivers/net/ethernet/aquantia/atlantic/aq_nic.c |
2196 | +++ b/drivers/net/ethernet/aquantia/atlantic/aq_nic.c |
2197 | @@ -467,8 +467,10 @@ static unsigned int aq_nic_map_skb(struct aq_nic_s *self, |
2198 | dx_buff->len, |
2199 | DMA_TO_DEVICE); |
2200 | |
2201 | - if (unlikely(dma_mapping_error(aq_nic_get_dev(self), dx_buff->pa))) |
2202 | + if (unlikely(dma_mapping_error(aq_nic_get_dev(self), dx_buff->pa))) { |
2203 | + ret = 0; |
2204 | goto exit; |
2205 | + } |
2206 | |
2207 | first = dx_buff; |
2208 | dx_buff->len_pkt = skb->len; |
2209 | @@ -598,10 +600,6 @@ int aq_nic_xmit(struct aq_nic_s *self, struct sk_buff *skb) |
2210 | if (likely(frags)) { |
2211 | err = self->aq_hw_ops->hw_ring_tx_xmit(self->aq_hw, |
2212 | ring, frags); |
2213 | - if (err >= 0) { |
2214 | - ++ring->stats.tx.packets; |
2215 | - ring->stats.tx.bytes += skb->len; |
2216 | - } |
2217 | } else { |
2218 | err = NETDEV_TX_BUSY; |
2219 | } |
2220 | diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_ring.c b/drivers/net/ethernet/aquantia/atlantic/aq_ring.c |
2221 | index 76bdbe1596d6..03821b46a8cb 100644 |
2222 | --- a/drivers/net/ethernet/aquantia/atlantic/aq_ring.c |
2223 | +++ b/drivers/net/ethernet/aquantia/atlantic/aq_ring.c |
2224 | @@ -243,9 +243,12 @@ bool aq_ring_tx_clean(struct aq_ring_s *self) |
2225 | } |
2226 | } |
2227 | |
2228 | - if (unlikely(buff->is_eop)) |
2229 | - dev_kfree_skb_any(buff->skb); |
2230 | + if (unlikely(buff->is_eop)) { |
2231 | + ++self->stats.rx.packets; |
2232 | + self->stats.tx.bytes += buff->skb->len; |
2233 | |
2234 | + dev_kfree_skb_any(buff->skb); |
2235 | + } |
2236 | buff->pa = 0U; |
2237 | buff->eop_index = 0xffffU; |
2238 | self->sw_head = aq_ring_next_dx(self, self->sw_head); |
2239 | diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c |
2240 | index 68618891b0e4..374e11a91790 100644 |
2241 | --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c |
2242 | +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c |
2243 | @@ -11712,6 +11712,14 @@ static int bnxt_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) |
2244 | if (version_printed++ == 0) |
2245 | pr_info("%s", version); |
2246 | |
2247 | + /* Clear any pending DMA transactions from crash kernel |
2248 | + * while loading driver in capture kernel. |
2249 | + */ |
2250 | + if (is_kdump_kernel()) { |
2251 | + pci_clear_master(pdev); |
2252 | + pcie_flr(pdev); |
2253 | + } |
2254 | + |
2255 | max_irqs = bnxt_get_max_irq(pdev); |
2256 | dev = alloc_etherdev_mq(sizeof(*bp), max_irqs); |
2257 | if (!dev) |
2258 | @@ -11908,10 +11916,10 @@ static void bnxt_shutdown(struct pci_dev *pdev) |
2259 | dev_close(dev); |
2260 | |
2261 | bnxt_ulp_shutdown(bp); |
2262 | + bnxt_clear_int_mode(bp); |
2263 | + pci_disable_device(pdev); |
2264 | |
2265 | if (system_state == SYSTEM_POWER_OFF) { |
2266 | - bnxt_clear_int_mode(bp); |
2267 | - pci_disable_device(pdev); |
2268 | pci_wake_from_d3(pdev, bp->wol); |
2269 | pci_set_power_state(pdev, PCI_D3hot); |
2270 | } |
2271 | diff --git a/drivers/net/ethernet/cadence/macb_main.c b/drivers/net/ethernet/cadence/macb_main.c |
2272 | index 95a94507cec1..234c13ebbc41 100644 |
2273 | --- a/drivers/net/ethernet/cadence/macb_main.c |
2274 | +++ b/drivers/net/ethernet/cadence/macb_main.c |
2275 | @@ -3690,6 +3690,10 @@ static int at91ether_open(struct net_device *dev) |
2276 | u32 ctl; |
2277 | int ret; |
2278 | |
2279 | + ret = pm_runtime_get_sync(&lp->pdev->dev); |
2280 | + if (ret < 0) |
2281 | + return ret; |
2282 | + |
2283 | /* Clear internal statistics */ |
2284 | ctl = macb_readl(lp, NCR); |
2285 | macb_writel(lp, NCR, ctl | MACB_BIT(CLRSTAT)); |
2286 | @@ -3750,7 +3754,7 @@ static int at91ether_close(struct net_device *dev) |
2287 | q->rx_buffers, q->rx_buffers_dma); |
2288 | q->rx_buffers = NULL; |
2289 | |
2290 | - return 0; |
2291 | + return pm_runtime_put(&lp->pdev->dev); |
2292 | } |
2293 | |
2294 | /* Transmit packet */ |
2295 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c |
2296 | index 162881005a6d..c01cf8ef69df 100644 |
2297 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c |
2298 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c |
2299 | @@ -6003,6 +6003,9 @@ static int hclge_get_all_rules(struct hnae3_handle *handle, |
2300 | static void hclge_fd_get_flow_tuples(const struct flow_keys *fkeys, |
2301 | struct hclge_fd_rule_tuples *tuples) |
2302 | { |
2303 | +#define flow_ip6_src fkeys->addrs.v6addrs.src.in6_u.u6_addr32 |
2304 | +#define flow_ip6_dst fkeys->addrs.v6addrs.dst.in6_u.u6_addr32 |
2305 | + |
2306 | tuples->ether_proto = be16_to_cpu(fkeys->basic.n_proto); |
2307 | tuples->ip_proto = fkeys->basic.ip_proto; |
2308 | tuples->dst_port = be16_to_cpu(fkeys->ports.dst); |
2309 | @@ -6011,12 +6014,12 @@ static void hclge_fd_get_flow_tuples(const struct flow_keys *fkeys, |
2310 | tuples->src_ip[3] = be32_to_cpu(fkeys->addrs.v4addrs.src); |
2311 | tuples->dst_ip[3] = be32_to_cpu(fkeys->addrs.v4addrs.dst); |
2312 | } else { |
2313 | - memcpy(tuples->src_ip, |
2314 | - fkeys->addrs.v6addrs.src.in6_u.u6_addr32, |
2315 | - sizeof(tuples->src_ip)); |
2316 | - memcpy(tuples->dst_ip, |
2317 | - fkeys->addrs.v6addrs.dst.in6_u.u6_addr32, |
2318 | - sizeof(tuples->dst_ip)); |
2319 | + int i; |
2320 | + |
2321 | + for (i = 0; i < IPV6_SIZE; i++) { |
2322 | + tuples->src_ip[i] = be32_to_cpu(flow_ip6_src[i]); |
2323 | + tuples->dst_ip[i] = be32_to_cpu(flow_ip6_dst[i]); |
2324 | + } |
2325 | } |
2326 | } |
2327 | |
2328 | @@ -9437,6 +9440,13 @@ static int hclge_reset_ae_dev(struct hnae3_ae_dev *ae_dev) |
2329 | return ret; |
2330 | } |
2331 | |
2332 | + ret = init_mgr_tbl(hdev); |
2333 | + if (ret) { |
2334 | + dev_err(&pdev->dev, |
2335 | + "failed to reinit manager table, ret = %d\n", ret); |
2336 | + return ret; |
2337 | + } |
2338 | + |
2339 | ret = hclge_init_fd_config(hdev); |
2340 | if (ret) { |
2341 | dev_err(&pdev->dev, "fd table init fail, ret=%d\n", ret); |
2342 | diff --git a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c |
2343 | index 3515ace0f020..38042d610f82 100644 |
2344 | --- a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c |
2345 | +++ b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c |
2346 | @@ -2363,7 +2363,7 @@ static int i40e_vc_enable_queues_msg(struct i40e_vf *vf, u8 *msg) |
2347 | goto error_param; |
2348 | } |
2349 | |
2350 | - if (i40e_vc_validate_vqs_bitmaps(vqs)) { |
2351 | + if (!i40e_vc_validate_vqs_bitmaps(vqs)) { |
2352 | aq_ret = I40E_ERR_PARAM; |
2353 | goto error_param; |
2354 | } |
2355 | @@ -2425,7 +2425,7 @@ static int i40e_vc_disable_queues_msg(struct i40e_vf *vf, u8 *msg) |
2356 | goto error_param; |
2357 | } |
2358 | |
2359 | - if (i40e_vc_validate_vqs_bitmaps(vqs)) { |
2360 | + if (!i40e_vc_validate_vqs_bitmaps(vqs)) { |
2361 | aq_ret = I40E_ERR_PARAM; |
2362 | goto error_param; |
2363 | } |
2364 | diff --git a/drivers/net/ethernet/intel/ice/ice_common.c b/drivers/net/ethernet/intel/ice/ice_common.c |
2365 | index 3a6b3950eb0e..171f0b625407 100644 |
2366 | --- a/drivers/net/ethernet/intel/ice/ice_common.c |
2367 | +++ b/drivers/net/ethernet/intel/ice/ice_common.c |
2368 | @@ -934,7 +934,7 @@ void ice_deinit_hw(struct ice_hw *hw) |
2369 | */ |
2370 | enum ice_status ice_check_reset(struct ice_hw *hw) |
2371 | { |
2372 | - u32 cnt, reg = 0, grst_delay; |
2373 | + u32 cnt, reg = 0, grst_delay, uld_mask; |
2374 | |
2375 | /* Poll for Device Active state in case a recent CORER, GLOBR, |
2376 | * or EMPR has occurred. The grst delay value is in 100ms units. |
2377 | @@ -956,13 +956,20 @@ enum ice_status ice_check_reset(struct ice_hw *hw) |
2378 | return ICE_ERR_RESET_FAILED; |
2379 | } |
2380 | |
2381 | -#define ICE_RESET_DONE_MASK (GLNVM_ULD_CORER_DONE_M | \ |
2382 | - GLNVM_ULD_GLOBR_DONE_M) |
2383 | +#define ICE_RESET_DONE_MASK (GLNVM_ULD_PCIER_DONE_M |\ |
2384 | + GLNVM_ULD_PCIER_DONE_1_M |\ |
2385 | + GLNVM_ULD_CORER_DONE_M |\ |
2386 | + GLNVM_ULD_GLOBR_DONE_M |\ |
2387 | + GLNVM_ULD_POR_DONE_M |\ |
2388 | + GLNVM_ULD_POR_DONE_1_M |\ |
2389 | + GLNVM_ULD_PCIER_DONE_2_M) |
2390 | + |
2391 | + uld_mask = ICE_RESET_DONE_MASK; |
2392 | |
2393 | /* Device is Active; check Global Reset processes are done */ |
2394 | for (cnt = 0; cnt < ICE_PF_RESET_WAIT_COUNT; cnt++) { |
2395 | - reg = rd32(hw, GLNVM_ULD) & ICE_RESET_DONE_MASK; |
2396 | - if (reg == ICE_RESET_DONE_MASK) { |
2397 | + reg = rd32(hw, GLNVM_ULD) & uld_mask; |
2398 | + if (reg == uld_mask) { |
2399 | ice_debug(hw, ICE_DBG_INIT, |
2400 | "Global reset processes done. %d\n", cnt); |
2401 | break; |
2402 | diff --git a/drivers/net/ethernet/intel/ice/ice_hw_autogen.h b/drivers/net/ethernet/intel/ice/ice_hw_autogen.h |
2403 | index 152fbd556e9b..9138b19de87e 100644 |
2404 | --- a/drivers/net/ethernet/intel/ice/ice_hw_autogen.h |
2405 | +++ b/drivers/net/ethernet/intel/ice/ice_hw_autogen.h |
2406 | @@ -273,8 +273,14 @@ |
2407 | #define GLNVM_GENS_SR_SIZE_S 5 |
2408 | #define GLNVM_GENS_SR_SIZE_M ICE_M(0x7, 5) |
2409 | #define GLNVM_ULD 0x000B6008 |
2410 | +#define GLNVM_ULD_PCIER_DONE_M BIT(0) |
2411 | +#define GLNVM_ULD_PCIER_DONE_1_M BIT(1) |
2412 | #define GLNVM_ULD_CORER_DONE_M BIT(3) |
2413 | #define GLNVM_ULD_GLOBR_DONE_M BIT(4) |
2414 | +#define GLNVM_ULD_POR_DONE_M BIT(5) |
2415 | +#define GLNVM_ULD_POR_DONE_1_M BIT(8) |
2416 | +#define GLNVM_ULD_PCIER_DONE_2_M BIT(9) |
2417 | +#define GLNVM_ULD_PE_DONE_M BIT(10) |
2418 | #define GLPCI_CNF2 0x000BE004 |
2419 | #define GLPCI_CNF2_CACHELINE_SIZE_M BIT(1) |
2420 | #define PF_FUNC_RID 0x0009E880 |
2421 | diff --git a/drivers/net/ethernet/mscc/ocelot_board.c b/drivers/net/ethernet/mscc/ocelot_board.c |
2422 | index aac115136720..337156232501 100644 |
2423 | --- a/drivers/net/ethernet/mscc/ocelot_board.c |
2424 | +++ b/drivers/net/ethernet/mscc/ocelot_board.c |
2425 | @@ -112,6 +112,14 @@ static irqreturn_t ocelot_xtr_irq_handler(int irq, void *arg) |
2426 | if (err != 4) |
2427 | break; |
2428 | |
2429 | + /* At this point the IFH was read correctly, so it is safe to |
2430 | + * presume that there is no error. The err needs to be reset |
2431 | + * otherwise a frame could come in CPU queue between the while |
2432 | + * condition and the check for error later on. And in that case |
2433 | + * the new frame is just removed and not processed. |
2434 | + */ |
2435 | + err = 0; |
2436 | + |
2437 | ocelot_parse_ifh(ifh, &info); |
2438 | |
2439 | dev = ocelot->ports[info.port]->dev; |
2440 | diff --git a/drivers/net/ethernet/qlogic/qede/qede.h b/drivers/net/ethernet/qlogic/qede/qede.h |
2441 | index c303a92d5b06..1f27f9866b80 100644 |
2442 | --- a/drivers/net/ethernet/qlogic/qede/qede.h |
2443 | +++ b/drivers/net/ethernet/qlogic/qede/qede.h |
2444 | @@ -163,6 +163,8 @@ struct qede_rdma_dev { |
2445 | struct list_head entry; |
2446 | struct list_head rdma_event_list; |
2447 | struct workqueue_struct *rdma_wq; |
2448 | + struct kref refcnt; |
2449 | + struct completion event_comp; |
2450 | bool exp_recovery; |
2451 | }; |
2452 | |
2453 | diff --git a/drivers/net/ethernet/qlogic/qede/qede_rdma.c b/drivers/net/ethernet/qlogic/qede/qede_rdma.c |
2454 | index ffabc2d2f082..2d873ae8a234 100644 |
2455 | --- a/drivers/net/ethernet/qlogic/qede/qede_rdma.c |
2456 | +++ b/drivers/net/ethernet/qlogic/qede/qede_rdma.c |
2457 | @@ -59,6 +59,9 @@ static void _qede_rdma_dev_add(struct qede_dev *edev) |
2458 | static int qede_rdma_create_wq(struct qede_dev *edev) |
2459 | { |
2460 | INIT_LIST_HEAD(&edev->rdma_info.rdma_event_list); |
2461 | + kref_init(&edev->rdma_info.refcnt); |
2462 | + init_completion(&edev->rdma_info.event_comp); |
2463 | + |
2464 | edev->rdma_info.rdma_wq = create_singlethread_workqueue("rdma_wq"); |
2465 | if (!edev->rdma_info.rdma_wq) { |
2466 | DP_NOTICE(edev, "qedr: Could not create workqueue\n"); |
2467 | @@ -83,8 +86,23 @@ static void qede_rdma_cleanup_event(struct qede_dev *edev) |
2468 | } |
2469 | } |
2470 | |
2471 | +static void qede_rdma_complete_event(struct kref *ref) |
2472 | +{ |
2473 | + struct qede_rdma_dev *rdma_dev = |
2474 | + container_of(ref, struct qede_rdma_dev, refcnt); |
2475 | + |
2476 | + /* no more events will be added after this */ |
2477 | + complete(&rdma_dev->event_comp); |
2478 | +} |
2479 | + |
2480 | static void qede_rdma_destroy_wq(struct qede_dev *edev) |
2481 | { |
2482 | + /* Avoid race with add_event flow, make sure it finishes before |
2483 | + * we start accessing the list and cleaning up the work |
2484 | + */ |
2485 | + kref_put(&edev->rdma_info.refcnt, qede_rdma_complete_event); |
2486 | + wait_for_completion(&edev->rdma_info.event_comp); |
2487 | + |
2488 | qede_rdma_cleanup_event(edev); |
2489 | destroy_workqueue(edev->rdma_info.rdma_wq); |
2490 | } |
2491 | @@ -310,15 +328,24 @@ static void qede_rdma_add_event(struct qede_dev *edev, |
2492 | if (!edev->rdma_info.qedr_dev) |
2493 | return; |
2494 | |
2495 | + /* We don't want the cleanup flow to start while we're allocating and |
2496 | + * scheduling the work |
2497 | + */ |
2498 | + if (!kref_get_unless_zero(&edev->rdma_info.refcnt)) |
2499 | + return; /* already being destroyed */ |
2500 | + |
2501 | event_node = qede_rdma_get_free_event_node(edev); |
2502 | if (!event_node) |
2503 | - return; |
2504 | + goto out; |
2505 | |
2506 | event_node->event = event; |
2507 | event_node->ptr = edev; |
2508 | |
2509 | INIT_WORK(&event_node->work, qede_rdma_handle_event); |
2510 | queue_work(edev->rdma_info.rdma_wq, &event_node->work); |
2511 | + |
2512 | +out: |
2513 | + kref_put(&edev->rdma_info.refcnt, qede_rdma_complete_event); |
2514 | } |
2515 | |
2516 | void qede_rdma_dev_event_open(struct qede_dev *edev) |
2517 | diff --git a/drivers/net/hyperv/netvsc.c b/drivers/net/hyperv/netvsc.c |
2518 | index eab83e71567a..6c0732fc8c25 100644 |
2519 | --- a/drivers/net/hyperv/netvsc.c |
2520 | +++ b/drivers/net/hyperv/netvsc.c |
2521 | @@ -99,7 +99,7 @@ static struct netvsc_device *alloc_net_device(void) |
2522 | |
2523 | init_waitqueue_head(&net_device->wait_drain); |
2524 | net_device->destroy = false; |
2525 | - net_device->tx_disable = false; |
2526 | + net_device->tx_disable = true; |
2527 | |
2528 | net_device->max_pkt = RNDIS_MAX_PKT_DEFAULT; |
2529 | net_device->pkt_align = RNDIS_PKT_ALIGN_DEFAULT; |
2530 | diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c |
2531 | index 0dee358864f3..ca16ae8c8332 100644 |
2532 | --- a/drivers/net/hyperv/netvsc_drv.c |
2533 | +++ b/drivers/net/hyperv/netvsc_drv.c |
2534 | @@ -973,6 +973,7 @@ static int netvsc_attach(struct net_device *ndev, |
2535 | } |
2536 | |
2537 | /* In any case device is now ready */ |
2538 | + nvdev->tx_disable = false; |
2539 | netif_device_attach(ndev); |
2540 | |
2541 | /* Note: enable and attach happen when sub-channels setup */ |
2542 | @@ -2350,6 +2351,8 @@ static int netvsc_probe(struct hv_device *dev, |
2543 | else |
2544 | net->max_mtu = ETH_DATA_LEN; |
2545 | |
2546 | + nvdev->tx_disable = false; |
2547 | + |
2548 | ret = register_netdevice(net); |
2549 | if (ret != 0) { |
2550 | pr_err("Unable to register netdev.\n"); |
2551 | diff --git a/drivers/net/phy/mdio-bcm-iproc.c b/drivers/net/phy/mdio-bcm-iproc.c |
2552 | index 7e9975d25066..f1ded03f0229 100644 |
2553 | --- a/drivers/net/phy/mdio-bcm-iproc.c |
2554 | +++ b/drivers/net/phy/mdio-bcm-iproc.c |
2555 | @@ -178,6 +178,23 @@ static int iproc_mdio_remove(struct platform_device *pdev) |
2556 | return 0; |
2557 | } |
2558 | |
2559 | +#ifdef CONFIG_PM_SLEEP |
2560 | +int iproc_mdio_resume(struct device *dev) |
2561 | +{ |
2562 | + struct platform_device *pdev = to_platform_device(dev); |
2563 | + struct iproc_mdio_priv *priv = platform_get_drvdata(pdev); |
2564 | + |
2565 | + /* restore the mii clock configuration */ |
2566 | + iproc_mdio_config_clk(priv->base); |
2567 | + |
2568 | + return 0; |
2569 | +} |
2570 | + |
2571 | +static const struct dev_pm_ops iproc_mdio_pm_ops = { |
2572 | + .resume = iproc_mdio_resume |
2573 | +}; |
2574 | +#endif /* CONFIG_PM_SLEEP */ |
2575 | + |
2576 | static const struct of_device_id iproc_mdio_of_match[] = { |
2577 | { .compatible = "brcm,iproc-mdio", }, |
2578 | { /* sentinel */ }, |
2579 | @@ -188,6 +205,9 @@ static struct platform_driver iproc_mdio_driver = { |
2580 | .driver = { |
2581 | .name = "iproc-mdio", |
2582 | .of_match_table = iproc_mdio_of_match, |
2583 | +#ifdef CONFIG_PM_SLEEP |
2584 | + .pm = &iproc_mdio_pm_ops, |
2585 | +#endif |
2586 | }, |
2587 | .probe = iproc_mdio_probe, |
2588 | .remove = iproc_mdio_remove, |
2589 | diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c |
2590 | index 9485c8d1de8a..3b7a3b8a5e06 100644 |
2591 | --- a/drivers/net/usb/qmi_wwan.c |
2592 | +++ b/drivers/net/usb/qmi_wwan.c |
2593 | @@ -61,7 +61,6 @@ enum qmi_wwan_flags { |
2594 | |
2595 | enum qmi_wwan_quirks { |
2596 | QMI_WWAN_QUIRK_DTR = 1 << 0, /* needs "set DTR" request */ |
2597 | - QMI_WWAN_QUIRK_QUECTEL_DYNCFG = 1 << 1, /* check num. endpoints */ |
2598 | }; |
2599 | |
2600 | struct qmimux_hdr { |
2601 | @@ -916,16 +915,6 @@ static const struct driver_info qmi_wwan_info_quirk_dtr = { |
2602 | .data = QMI_WWAN_QUIRK_DTR, |
2603 | }; |
2604 | |
2605 | -static const struct driver_info qmi_wwan_info_quirk_quectel_dyncfg = { |
2606 | - .description = "WWAN/QMI device", |
2607 | - .flags = FLAG_WWAN | FLAG_SEND_ZLP, |
2608 | - .bind = qmi_wwan_bind, |
2609 | - .unbind = qmi_wwan_unbind, |
2610 | - .manage_power = qmi_wwan_manage_power, |
2611 | - .rx_fixup = qmi_wwan_rx_fixup, |
2612 | - .data = QMI_WWAN_QUIRK_DTR | QMI_WWAN_QUIRK_QUECTEL_DYNCFG, |
2613 | -}; |
2614 | - |
2615 | #define HUAWEI_VENDOR_ID 0x12D1 |
2616 | |
2617 | /* map QMI/wwan function by a fixed interface number */ |
2618 | @@ -946,14 +935,18 @@ static const struct driver_info qmi_wwan_info_quirk_quectel_dyncfg = { |
2619 | #define QMI_GOBI_DEVICE(vend, prod) \ |
2620 | QMI_FIXED_INTF(vend, prod, 0) |
2621 | |
2622 | -/* Quectel does not use fixed interface numbers on at least some of their |
2623 | - * devices. We need to check the number of endpoints to ensure that we bind to |
2624 | - * the correct interface. |
2625 | +/* Many devices have QMI and DIAG functions which are distinguishable |
2626 | + * from other vendor specific functions by class, subclass and |
2627 | + * protocol all being 0xff. The DIAG function has exactly 2 endpoints |
2628 | + * and is silently rejected when probed. |
2629 | + * |
2630 | + * This makes it possible to match dynamically numbered QMI functions |
2631 | + * as seen on e.g. many Quectel modems. |
2632 | */ |
2633 | -#define QMI_QUIRK_QUECTEL_DYNCFG(vend, prod) \ |
2634 | +#define QMI_MATCH_FF_FF_FF(vend, prod) \ |
2635 | USB_DEVICE_AND_INTERFACE_INFO(vend, prod, USB_CLASS_VENDOR_SPEC, \ |
2636 | USB_SUBCLASS_VENDOR_SPEC, 0xff), \ |
2637 | - .driver_info = (unsigned long)&qmi_wwan_info_quirk_quectel_dyncfg |
2638 | + .driver_info = (unsigned long)&qmi_wwan_info_quirk_dtr |
2639 | |
2640 | static const struct usb_device_id products[] = { |
2641 | /* 1. CDC ECM like devices match on the control interface */ |
2642 | @@ -1059,10 +1052,10 @@ static const struct usb_device_id products[] = { |
2643 | USB_DEVICE_AND_INTERFACE_INFO(0x03f0, 0x581d, USB_CLASS_VENDOR_SPEC, 1, 7), |
2644 | .driver_info = (unsigned long)&qmi_wwan_info, |
2645 | }, |
2646 | - {QMI_QUIRK_QUECTEL_DYNCFG(0x2c7c, 0x0125)}, /* Quectel EC25, EC20 R2.0 Mini PCIe */ |
2647 | - {QMI_QUIRK_QUECTEL_DYNCFG(0x2c7c, 0x0306)}, /* Quectel EP06/EG06/EM06 */ |
2648 | - {QMI_QUIRK_QUECTEL_DYNCFG(0x2c7c, 0x0512)}, /* Quectel EG12/EM12 */ |
2649 | - {QMI_QUIRK_QUECTEL_DYNCFG(0x2c7c, 0x0800)}, /* Quectel RM500Q-GL */ |
2650 | + {QMI_MATCH_FF_FF_FF(0x2c7c, 0x0125)}, /* Quectel EC25, EC20 R2.0 Mini PCIe */ |
2651 | + {QMI_MATCH_FF_FF_FF(0x2c7c, 0x0306)}, /* Quectel EP06/EG06/EM06 */ |
2652 | + {QMI_MATCH_FF_FF_FF(0x2c7c, 0x0512)}, /* Quectel EG12/EM12 */ |
2653 | + {QMI_MATCH_FF_FF_FF(0x2c7c, 0x0800)}, /* Quectel RM500Q-GL */ |
2654 | |
2655 | /* 3. Combined interface devices matching on interface number */ |
2656 | {QMI_FIXED_INTF(0x0408, 0xea42, 4)}, /* Yota / Megafon M100-1 */ |
2657 | @@ -1363,6 +1356,7 @@ static const struct usb_device_id products[] = { |
2658 | {QMI_FIXED_INTF(0x413c, 0x81b6, 8)}, /* Dell Wireless 5811e */ |
2659 | {QMI_FIXED_INTF(0x413c, 0x81b6, 10)}, /* Dell Wireless 5811e */ |
2660 | {QMI_FIXED_INTF(0x413c, 0x81d7, 0)}, /* Dell Wireless 5821e */ |
2661 | + {QMI_FIXED_INTF(0x413c, 0x81d7, 1)}, /* Dell Wireless 5821e preproduction config */ |
2662 | {QMI_FIXED_INTF(0x413c, 0x81e0, 0)}, /* Dell Wireless 5821e with eSIM support*/ |
2663 | {QMI_FIXED_INTF(0x03f0, 0x4e1d, 8)}, /* HP lt4111 LTE/EV-DO/HSPA+ Gobi 4G Module */ |
2664 | {QMI_FIXED_INTF(0x03f0, 0x9d1d, 1)}, /* HP lt4120 Snapdragon X5 LTE */ |
2665 | @@ -1454,7 +1448,6 @@ static int qmi_wwan_probe(struct usb_interface *intf, |
2666 | { |
2667 | struct usb_device_id *id = (struct usb_device_id *)prod; |
2668 | struct usb_interface_descriptor *desc = &intf->cur_altsetting->desc; |
2669 | - const struct driver_info *info; |
2670 | |
2671 | /* Workaround to enable dynamic IDs. This disables usbnet |
2672 | * blacklisting functionality. Which, if required, can be |
2673 | @@ -1490,12 +1483,8 @@ static int qmi_wwan_probe(struct usb_interface *intf, |
2674 | * different. Ignore the current interface if the number of endpoints |
2675 | * equals the number for the diag interface (two). |
2676 | */ |
2677 | - info = (void *)id->driver_info; |
2678 | - |
2679 | - if (info->data & QMI_WWAN_QUIRK_QUECTEL_DYNCFG) { |
2680 | - if (desc->bNumEndpoints == 2) |
2681 | - return -ENODEV; |
2682 | - } |
2683 | + if (desc->bNumEndpoints == 2) |
2684 | + return -ENODEV; |
2685 | |
2686 | return usbnet_probe(intf, id); |
2687 | } |
2688 | diff --git a/drivers/net/wireless/marvell/mwifiex/main.h b/drivers/net/wireless/marvell/mwifiex/main.h |
2689 | index 547ff3c578ee..fa5634af40f7 100644 |
2690 | --- a/drivers/net/wireless/marvell/mwifiex/main.h |
2691 | +++ b/drivers/net/wireless/marvell/mwifiex/main.h |
2692 | @@ -1295,19 +1295,6 @@ mwifiex_copy_rates(u8 *dest, u32 pos, u8 *src, int len) |
2693 | return pos; |
2694 | } |
2695 | |
2696 | -/* This function return interface number with the same bss_type. |
2697 | - */ |
2698 | -static inline u8 |
2699 | -mwifiex_get_intf_num(struct mwifiex_adapter *adapter, u8 bss_type) |
2700 | -{ |
2701 | - u8 i, num = 0; |
2702 | - |
2703 | - for (i = 0; i < adapter->priv_num; i++) |
2704 | - if (adapter->priv[i] && adapter->priv[i]->bss_type == bss_type) |
2705 | - num++; |
2706 | - return num; |
2707 | -} |
2708 | - |
2709 | /* |
2710 | * This function returns the correct private structure pointer based |
2711 | * upon the BSS type and BSS number. |
2712 | diff --git a/drivers/net/wireless/marvell/mwifiex/tdls.c b/drivers/net/wireless/marvell/mwifiex/tdls.c |
2713 | index 7caf1d26124a..f8f282ce39bd 100644 |
2714 | --- a/drivers/net/wireless/marvell/mwifiex/tdls.c |
2715 | +++ b/drivers/net/wireless/marvell/mwifiex/tdls.c |
2716 | @@ -894,7 +894,7 @@ void mwifiex_process_tdls_action_frame(struct mwifiex_private *priv, |
2717 | u8 *peer, *pos, *end; |
2718 | u8 i, action, basic; |
2719 | u16 cap = 0; |
2720 | - int ie_len = 0; |
2721 | + int ies_len = 0; |
2722 | |
2723 | if (len < (sizeof(struct ethhdr) + 3)) |
2724 | return; |
2725 | @@ -916,7 +916,7 @@ void mwifiex_process_tdls_action_frame(struct mwifiex_private *priv, |
2726 | pos = buf + sizeof(struct ethhdr) + 4; |
2727 | /* payload 1+ category 1 + action 1 + dialog 1 */ |
2728 | cap = get_unaligned_le16(pos); |
2729 | - ie_len = len - sizeof(struct ethhdr) - TDLS_REQ_FIX_LEN; |
2730 | + ies_len = len - sizeof(struct ethhdr) - TDLS_REQ_FIX_LEN; |
2731 | pos += 2; |
2732 | break; |
2733 | |
2734 | @@ -926,7 +926,7 @@ void mwifiex_process_tdls_action_frame(struct mwifiex_private *priv, |
2735 | /* payload 1+ category 1 + action 1 + dialog 1 + status code 2*/ |
2736 | pos = buf + sizeof(struct ethhdr) + 6; |
2737 | cap = get_unaligned_le16(pos); |
2738 | - ie_len = len - sizeof(struct ethhdr) - TDLS_RESP_FIX_LEN; |
2739 | + ies_len = len - sizeof(struct ethhdr) - TDLS_RESP_FIX_LEN; |
2740 | pos += 2; |
2741 | break; |
2742 | |
2743 | @@ -934,7 +934,7 @@ void mwifiex_process_tdls_action_frame(struct mwifiex_private *priv, |
2744 | if (len < (sizeof(struct ethhdr) + TDLS_CONFIRM_FIX_LEN)) |
2745 | return; |
2746 | pos = buf + sizeof(struct ethhdr) + TDLS_CONFIRM_FIX_LEN; |
2747 | - ie_len = len - sizeof(struct ethhdr) - TDLS_CONFIRM_FIX_LEN; |
2748 | + ies_len = len - sizeof(struct ethhdr) - TDLS_CONFIRM_FIX_LEN; |
2749 | break; |
2750 | default: |
2751 | mwifiex_dbg(priv->adapter, ERROR, "Unknown TDLS frame type.\n"); |
2752 | @@ -947,33 +947,33 @@ void mwifiex_process_tdls_action_frame(struct mwifiex_private *priv, |
2753 | |
2754 | sta_ptr->tdls_cap.capab = cpu_to_le16(cap); |
2755 | |
2756 | - for (end = pos + ie_len; pos + 1 < end; pos += 2 + pos[1]) { |
2757 | - if (pos + 2 + pos[1] > end) |
2758 | + for (end = pos + ies_len; pos + 1 < end; pos += 2 + pos[1]) { |
2759 | + u8 ie_len = pos[1]; |
2760 | + |
2761 | + if (pos + 2 + ie_len > end) |
2762 | break; |
2763 | |
2764 | switch (*pos) { |
2765 | case WLAN_EID_SUPP_RATES: |
2766 | - if (pos[1] > 32) |
2767 | + if (ie_len > sizeof(sta_ptr->tdls_cap.rates)) |
2768 | return; |
2769 | - sta_ptr->tdls_cap.rates_len = pos[1]; |
2770 | - for (i = 0; i < pos[1]; i++) |
2771 | + sta_ptr->tdls_cap.rates_len = ie_len; |
2772 | + for (i = 0; i < ie_len; i++) |
2773 | sta_ptr->tdls_cap.rates[i] = pos[i + 2]; |
2774 | break; |
2775 | |
2776 | case WLAN_EID_EXT_SUPP_RATES: |
2777 | - if (pos[1] > 32) |
2778 | + if (ie_len > sizeof(sta_ptr->tdls_cap.rates)) |
2779 | return; |
2780 | basic = sta_ptr->tdls_cap.rates_len; |
2781 | - if (pos[1] > 32 - basic) |
2782 | + if (ie_len > sizeof(sta_ptr->tdls_cap.rates) - basic) |
2783 | return; |
2784 | - for (i = 0; i < pos[1]; i++) |
2785 | + for (i = 0; i < ie_len; i++) |
2786 | sta_ptr->tdls_cap.rates[basic + i] = pos[i + 2]; |
2787 | - sta_ptr->tdls_cap.rates_len += pos[1]; |
2788 | + sta_ptr->tdls_cap.rates_len += ie_len; |
2789 | break; |
2790 | case WLAN_EID_HT_CAPABILITY: |
2791 | - if (pos > end - sizeof(struct ieee80211_ht_cap) - 2) |
2792 | - return; |
2793 | - if (pos[1] != sizeof(struct ieee80211_ht_cap)) |
2794 | + if (ie_len != sizeof(struct ieee80211_ht_cap)) |
2795 | return; |
2796 | /* copy the ie's value into ht_capb*/ |
2797 | memcpy((u8 *)&sta_ptr->tdls_cap.ht_capb, pos + 2, |
2798 | @@ -981,59 +981,45 @@ void mwifiex_process_tdls_action_frame(struct mwifiex_private *priv, |
2799 | sta_ptr->is_11n_enabled = 1; |
2800 | break; |
2801 | case WLAN_EID_HT_OPERATION: |
2802 | - if (pos > end - |
2803 | - sizeof(struct ieee80211_ht_operation) - 2) |
2804 | - return; |
2805 | - if (pos[1] != sizeof(struct ieee80211_ht_operation)) |
2806 | + if (ie_len != sizeof(struct ieee80211_ht_operation)) |
2807 | return; |
2808 | /* copy the ie's value into ht_oper*/ |
2809 | memcpy(&sta_ptr->tdls_cap.ht_oper, pos + 2, |
2810 | sizeof(struct ieee80211_ht_operation)); |
2811 | break; |
2812 | case WLAN_EID_BSS_COEX_2040: |
2813 | - if (pos > end - 3) |
2814 | - return; |
2815 | - if (pos[1] != 1) |
2816 | + if (ie_len != sizeof(pos[2])) |
2817 | return; |
2818 | sta_ptr->tdls_cap.coex_2040 = pos[2]; |
2819 | break; |
2820 | case WLAN_EID_EXT_CAPABILITY: |
2821 | - if (pos > end - sizeof(struct ieee_types_header)) |
2822 | - return; |
2823 | - if (pos[1] < sizeof(struct ieee_types_header)) |
2824 | + if (ie_len < sizeof(struct ieee_types_header)) |
2825 | return; |
2826 | - if (pos[1] > 8) |
2827 | + if (ie_len > 8) |
2828 | return; |
2829 | memcpy((u8 *)&sta_ptr->tdls_cap.extcap, pos, |
2830 | sizeof(struct ieee_types_header) + |
2831 | - min_t(u8, pos[1], 8)); |
2832 | + min_t(u8, ie_len, 8)); |
2833 | break; |
2834 | case WLAN_EID_RSN: |
2835 | - if (pos > end - sizeof(struct ieee_types_header)) |
2836 | + if (ie_len < sizeof(struct ieee_types_header)) |
2837 | return; |
2838 | - if (pos[1] < sizeof(struct ieee_types_header)) |
2839 | - return; |
2840 | - if (pos[1] > IEEE_MAX_IE_SIZE - |
2841 | + if (ie_len > IEEE_MAX_IE_SIZE - |
2842 | sizeof(struct ieee_types_header)) |
2843 | return; |
2844 | memcpy((u8 *)&sta_ptr->tdls_cap.rsn_ie, pos, |
2845 | sizeof(struct ieee_types_header) + |
2846 | - min_t(u8, pos[1], IEEE_MAX_IE_SIZE - |
2847 | + min_t(u8, ie_len, IEEE_MAX_IE_SIZE - |
2848 | sizeof(struct ieee_types_header))); |
2849 | break; |
2850 | case WLAN_EID_QOS_CAPA: |
2851 | - if (pos > end - 3) |
2852 | - return; |
2853 | - if (pos[1] != 1) |
2854 | + if (ie_len != sizeof(pos[2])) |
2855 | return; |
2856 | sta_ptr->tdls_cap.qos_info = pos[2]; |
2857 | break; |
2858 | case WLAN_EID_VHT_OPERATION: |
2859 | if (priv->adapter->is_hw_11ac_capable) { |
2860 | - if (pos > end - |
2861 | - sizeof(struct ieee80211_vht_operation) - 2) |
2862 | - return; |
2863 | - if (pos[1] != |
2864 | + if (ie_len != |
2865 | sizeof(struct ieee80211_vht_operation)) |
2866 | return; |
2867 | /* copy the ie's value into vhtoper*/ |
2868 | @@ -1043,10 +1029,7 @@ void mwifiex_process_tdls_action_frame(struct mwifiex_private *priv, |
2869 | break; |
2870 | case WLAN_EID_VHT_CAPABILITY: |
2871 | if (priv->adapter->is_hw_11ac_capable) { |
2872 | - if (pos > end - |
2873 | - sizeof(struct ieee80211_vht_cap) - 2) |
2874 | - return; |
2875 | - if (pos[1] != sizeof(struct ieee80211_vht_cap)) |
2876 | + if (ie_len != sizeof(struct ieee80211_vht_cap)) |
2877 | return; |
2878 | /* copy the ie's value into vhtcap*/ |
2879 | memcpy((u8 *)&sta_ptr->tdls_cap.vhtcap, pos + 2, |
2880 | @@ -1056,9 +1039,7 @@ void mwifiex_process_tdls_action_frame(struct mwifiex_private *priv, |
2881 | break; |
2882 | case WLAN_EID_AID: |
2883 | if (priv->adapter->is_hw_11ac_capable) { |
2884 | - if (pos > end - 4) |
2885 | - return; |
2886 | - if (pos[1] != 2) |
2887 | + if (ie_len != sizeof(u16)) |
2888 | return; |
2889 | sta_ptr->tdls_cap.aid = |
2890 | get_unaligned_le16((pos + 2)); |
2891 | diff --git a/drivers/nfc/pn544/i2c.c b/drivers/nfc/pn544/i2c.c |
2892 | index 720c89d6066e..4ac8cb262559 100644 |
2893 | --- a/drivers/nfc/pn544/i2c.c |
2894 | +++ b/drivers/nfc/pn544/i2c.c |
2895 | @@ -225,6 +225,7 @@ static void pn544_hci_i2c_platform_init(struct pn544_i2c_phy *phy) |
2896 | |
2897 | out: |
2898 | gpiod_set_value_cansleep(phy->gpiod_en, !phy->en_polarity); |
2899 | + usleep_range(10000, 15000); |
2900 | } |
2901 | |
2902 | static void pn544_hci_i2c_enable_mode(struct pn544_i2c_phy *phy, int run_mode) |
2903 | diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c |
2904 | index e703827d27e9..7dacfd102a99 100644 |
2905 | --- a/drivers/nvme/host/core.c |
2906 | +++ b/drivers/nvme/host/core.c |
2907 | @@ -66,8 +66,8 @@ MODULE_PARM_DESC(streams, "turn on support for Streams write directives"); |
2908 | * nvme_reset_wq - hosts nvme reset works |
2909 | * nvme_delete_wq - hosts nvme delete works |
2910 | * |
2911 | - * nvme_wq will host works such are scan, aen handling, fw activation, |
2912 | - * keep-alive error recovery, periodic reconnects etc. nvme_reset_wq |
2913 | + * nvme_wq will host works such as scan, aen handling, fw activation, |
2914 | + * keep-alive, periodic reconnects etc. nvme_reset_wq |
2915 | * runs reset works which also flush works hosted on nvme_wq for |
2916 | * serialization purposes. nvme_delete_wq host controller deletion |
2917 | * works which flush reset works for serialization. |
2918 | @@ -972,7 +972,7 @@ static void nvme_keep_alive_end_io(struct request *rq, blk_status_t status) |
2919 | startka = true; |
2920 | spin_unlock_irqrestore(&ctrl->lock, flags); |
2921 | if (startka) |
2922 | - schedule_delayed_work(&ctrl->ka_work, ctrl->kato * HZ); |
2923 | + queue_delayed_work(nvme_wq, &ctrl->ka_work, ctrl->kato * HZ); |
2924 | } |
2925 | |
2926 | static int nvme_keep_alive(struct nvme_ctrl *ctrl) |
2927 | @@ -1002,7 +1002,7 @@ static void nvme_keep_alive_work(struct work_struct *work) |
2928 | dev_dbg(ctrl->device, |
2929 | "reschedule traffic based keep-alive timer\n"); |
2930 | ctrl->comp_seen = false; |
2931 | - schedule_delayed_work(&ctrl->ka_work, ctrl->kato * HZ); |
2932 | + queue_delayed_work(nvme_wq, &ctrl->ka_work, ctrl->kato * HZ); |
2933 | return; |
2934 | } |
2935 | |
2936 | @@ -1019,7 +1019,7 @@ static void nvme_start_keep_alive(struct nvme_ctrl *ctrl) |
2937 | if (unlikely(ctrl->kato == 0)) |
2938 | return; |
2939 | |
2940 | - schedule_delayed_work(&ctrl->ka_work, ctrl->kato * HZ); |
2941 | + queue_delayed_work(nvme_wq, &ctrl->ka_work, ctrl->kato * HZ); |
2942 | } |
2943 | |
2944 | void nvme_stop_keep_alive(struct nvme_ctrl *ctrl) |
2945 | diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c |
2946 | index f34a56d588d3..570c75c92e29 100644 |
2947 | --- a/drivers/nvme/host/pci.c |
2948 | +++ b/drivers/nvme/host/pci.c |
2949 | @@ -1084,9 +1084,9 @@ static int nvme_poll(struct blk_mq_hw_ctx *hctx) |
2950 | |
2951 | spin_lock(&nvmeq->cq_poll_lock); |
2952 | found = nvme_process_cq(nvmeq, &start, &end, -1); |
2953 | + nvme_complete_cqes(nvmeq, start, end); |
2954 | spin_unlock(&nvmeq->cq_poll_lock); |
2955 | |
2956 | - nvme_complete_cqes(nvmeq, start, end); |
2957 | return found; |
2958 | } |
2959 | |
2960 | @@ -1407,6 +1407,23 @@ static void nvme_disable_admin_queue(struct nvme_dev *dev, bool shutdown) |
2961 | nvme_poll_irqdisable(nvmeq, -1); |
2962 | } |
2963 | |
2964 | +/* |
2965 | + * Called only on a device that has been disabled and after all other threads |
2966 | + * that can check this device's completion queues have synced. This is the |
2967 | + * last chance for the driver to see a natural completion before |
2968 | + * nvme_cancel_request() terminates all incomplete requests. |
2969 | + */ |
2970 | +static void nvme_reap_pending_cqes(struct nvme_dev *dev) |
2971 | +{ |
2972 | + u16 start, end; |
2973 | + int i; |
2974 | + |
2975 | + for (i = dev->ctrl.queue_count - 1; i > 0; i--) { |
2976 | + nvme_process_cq(&dev->queues[i], &start, &end, -1); |
2977 | + nvme_complete_cqes(&dev->queues[i], start, end); |
2978 | + } |
2979 | +} |
2980 | + |
2981 | static int nvme_cmb_qdepth(struct nvme_dev *dev, int nr_io_queues, |
2982 | int entry_size) |
2983 | { |
2984 | @@ -2241,11 +2258,6 @@ static bool __nvme_disable_io_queues(struct nvme_dev *dev, u8 opcode) |
2985 | if (timeout == 0) |
2986 | return false; |
2987 | |
2988 | - /* handle any remaining CQEs */ |
2989 | - if (opcode == nvme_admin_delete_cq && |
2990 | - !test_bit(NVMEQ_DELETE_ERROR, &nvmeq->flags)) |
2991 | - nvme_poll_irqdisable(nvmeq, -1); |
2992 | - |
2993 | sent--; |
2994 | if (nr_queues) |
2995 | goto retry; |
2996 | @@ -2434,6 +2446,7 @@ static void nvme_dev_disable(struct nvme_dev *dev, bool shutdown) |
2997 | nvme_suspend_io_queues(dev); |
2998 | nvme_suspend_queue(&dev->queues[0]); |
2999 | nvme_pci_disable(dev); |
3000 | + nvme_reap_pending_cqes(dev); |
3001 | |
3002 | blk_mq_tagset_busy_iter(&dev->tagset, nvme_cancel_request, &dev->ctrl); |
3003 | blk_mq_tagset_busy_iter(&dev->admin_tagset, nvme_cancel_request, &dev->ctrl); |
3004 | diff --git a/drivers/nvme/host/rdma.c b/drivers/nvme/host/rdma.c |
3005 | index cb4c3000a57e..4ff51da3b13f 100644 |
3006 | --- a/drivers/nvme/host/rdma.c |
3007 | +++ b/drivers/nvme/host/rdma.c |
3008 | @@ -1088,7 +1088,7 @@ static void nvme_rdma_error_recovery(struct nvme_rdma_ctrl *ctrl) |
3009 | if (!nvme_change_ctrl_state(&ctrl->ctrl, NVME_CTRL_RESETTING)) |
3010 | return; |
3011 | |
3012 | - queue_work(nvme_wq, &ctrl->err_work); |
3013 | + queue_work(nvme_reset_wq, &ctrl->err_work); |
3014 | } |
3015 | |
3016 | static void nvme_rdma_wr_error(struct ib_cq *cq, struct ib_wc *wc, |
3017 | diff --git a/drivers/nvme/host/tcp.c b/drivers/nvme/host/tcp.c |
3018 | index 7544be84ab35..244984420b41 100644 |
3019 | --- a/drivers/nvme/host/tcp.c |
3020 | +++ b/drivers/nvme/host/tcp.c |
3021 | @@ -422,7 +422,7 @@ static void nvme_tcp_error_recovery(struct nvme_ctrl *ctrl) |
3022 | if (!nvme_change_ctrl_state(ctrl, NVME_CTRL_RESETTING)) |
3023 | return; |
3024 | |
3025 | - queue_work(nvme_wq, &to_tcp_ctrl(ctrl)->err_work); |
3026 | + queue_work(nvme_reset_wq, &to_tcp_ctrl(ctrl)->err_work); |
3027 | } |
3028 | |
3029 | static int nvme_tcp_process_nvme_cqe(struct nvme_tcp_queue *queue, |
3030 | @@ -1054,7 +1054,12 @@ static void nvme_tcp_io_work(struct work_struct *w) |
3031 | } else if (unlikely(result < 0)) { |
3032 | dev_err(queue->ctrl->ctrl.device, |
3033 | "failed to send request %d\n", result); |
3034 | - if (result != -EPIPE) |
3035 | + |
3036 | + /* |
3037 | + * Fail the request unless peer closed the connection, |
3038 | + * in which case error recovery flow will complete all. |
3039 | + */ |
3040 | + if ((result != -EPIPE) && (result != -ECONNRESET)) |
3041 | nvme_tcp_fail_request(queue->request); |
3042 | nvme_tcp_done_send_req(queue); |
3043 | return; |
3044 | diff --git a/drivers/perf/arm_smmuv3_pmu.c b/drivers/perf/arm_smmuv3_pmu.c |
3045 | index 191f410cf35c..2f8787276d9b 100644 |
3046 | --- a/drivers/perf/arm_smmuv3_pmu.c |
3047 | +++ b/drivers/perf/arm_smmuv3_pmu.c |
3048 | @@ -772,7 +772,7 @@ static int smmu_pmu_probe(struct platform_device *pdev) |
3049 | smmu_pmu->reloc_base = smmu_pmu->reg_base; |
3050 | } |
3051 | |
3052 | - irq = platform_get_irq(pdev, 0); |
3053 | + irq = platform_get_irq_optional(pdev, 0); |
3054 | if (irq > 0) |
3055 | smmu_pmu->irq = irq; |
3056 | |
3057 | diff --git a/drivers/pwm/pwm-omap-dmtimer.c b/drivers/pwm/pwm-omap-dmtimer.c |
3058 | index e36fcad668a6..88a3c5690fea 100644 |
3059 | --- a/drivers/pwm/pwm-omap-dmtimer.c |
3060 | +++ b/drivers/pwm/pwm-omap-dmtimer.c |
3061 | @@ -256,7 +256,7 @@ static int pwm_omap_dmtimer_probe(struct platform_device *pdev) |
3062 | if (!timer_pdev) { |
3063 | dev_err(&pdev->dev, "Unable to find Timer pdev\n"); |
3064 | ret = -ENODEV; |
3065 | - goto put; |
3066 | + goto err_find_timer_pdev; |
3067 | } |
3068 | |
3069 | timer_pdata = dev_get_platdata(&timer_pdev->dev); |
3070 | @@ -264,7 +264,7 @@ static int pwm_omap_dmtimer_probe(struct platform_device *pdev) |
3071 | dev_dbg(&pdev->dev, |
3072 | "dmtimer pdata structure NULL, deferring probe\n"); |
3073 | ret = -EPROBE_DEFER; |
3074 | - goto put; |
3075 | + goto err_platdata; |
3076 | } |
3077 | |
3078 | pdata = timer_pdata->timer_ops; |
3079 | @@ -283,19 +283,19 @@ static int pwm_omap_dmtimer_probe(struct platform_device *pdev) |
3080 | !pdata->write_counter) { |
3081 | dev_err(&pdev->dev, "Incomplete dmtimer pdata structure\n"); |
3082 | ret = -EINVAL; |
3083 | - goto put; |
3084 | + goto err_platdata; |
3085 | } |
3086 | |
3087 | if (!of_get_property(timer, "ti,timer-pwm", NULL)) { |
3088 | dev_err(&pdev->dev, "Missing ti,timer-pwm capability\n"); |
3089 | ret = -ENODEV; |
3090 | - goto put; |
3091 | + goto err_timer_property; |
3092 | } |
3093 | |
3094 | dm_timer = pdata->request_by_node(timer); |
3095 | if (!dm_timer) { |
3096 | ret = -EPROBE_DEFER; |
3097 | - goto put; |
3098 | + goto err_request_timer; |
3099 | } |
3100 | |
3101 | omap = devm_kzalloc(&pdev->dev, sizeof(*omap), GFP_KERNEL); |
3102 | @@ -352,7 +352,14 @@ err_pwmchip_add: |
3103 | err_alloc_omap: |
3104 | |
3105 | pdata->free(dm_timer); |
3106 | -put: |
3107 | +err_request_timer: |
3108 | + |
3109 | +err_timer_property: |
3110 | +err_platdata: |
3111 | + |
3112 | + put_device(&timer_pdev->dev); |
3113 | +err_find_timer_pdev: |
3114 | + |
3115 | of_node_put(timer); |
3116 | |
3117 | return ret; |
3118 | @@ -372,6 +379,8 @@ static int pwm_omap_dmtimer_remove(struct platform_device *pdev) |
3119 | |
3120 | omap->pdata->free(omap->dm_timer); |
3121 | |
3122 | + put_device(&omap->dm_timer_pdev->dev); |
3123 | + |
3124 | mutex_destroy(&omap->mutex); |
3125 | |
3126 | return 0; |
3127 | diff --git a/drivers/s390/crypto/ap_bus.h b/drivers/s390/crypto/ap_bus.h |
3128 | index bb35ba4a8d24..4348fdff1c61 100644 |
3129 | --- a/drivers/s390/crypto/ap_bus.h |
3130 | +++ b/drivers/s390/crypto/ap_bus.h |
3131 | @@ -162,7 +162,7 @@ struct ap_card { |
3132 | unsigned int functions; /* AP device function bitfield. */ |
3133 | int queue_depth; /* AP queue depth.*/ |
3134 | int id; /* AP card number. */ |
3135 | - atomic_t total_request_count; /* # requests ever for this AP device.*/ |
3136 | + atomic64_t total_request_count; /* # requests ever for this AP device.*/ |
3137 | }; |
3138 | |
3139 | #define to_ap_card(x) container_of((x), struct ap_card, ap_dev.device) |
3140 | @@ -179,7 +179,7 @@ struct ap_queue { |
3141 | enum ap_state state; /* State of the AP device. */ |
3142 | int pendingq_count; /* # requests on pendingq list. */ |
3143 | int requestq_count; /* # requests on requestq list. */ |
3144 | - int total_request_count; /* # requests ever for this AP device.*/ |
3145 | + u64 total_request_count; /* # requests ever for this AP device.*/ |
3146 | int request_timeout; /* Request timeout in jiffies. */ |
3147 | struct timer_list timeout; /* Timer for request timeouts. */ |
3148 | struct list_head pendingq; /* List of message sent to AP queue. */ |
3149 | diff --git a/drivers/s390/crypto/ap_card.c b/drivers/s390/crypto/ap_card.c |
3150 | index 63b4cc6cd7e5..e85bfca1ed16 100644 |
3151 | --- a/drivers/s390/crypto/ap_card.c |
3152 | +++ b/drivers/s390/crypto/ap_card.c |
3153 | @@ -63,13 +63,13 @@ static ssize_t request_count_show(struct device *dev, |
3154 | char *buf) |
3155 | { |
3156 | struct ap_card *ac = to_ap_card(dev); |
3157 | - unsigned int req_cnt; |
3158 | + u64 req_cnt; |
3159 | |
3160 | req_cnt = 0; |
3161 | spin_lock_bh(&ap_list_lock); |
3162 | - req_cnt = atomic_read(&ac->total_request_count); |
3163 | + req_cnt = atomic64_read(&ac->total_request_count); |
3164 | spin_unlock_bh(&ap_list_lock); |
3165 | - return snprintf(buf, PAGE_SIZE, "%d\n", req_cnt); |
3166 | + return snprintf(buf, PAGE_SIZE, "%llu\n", req_cnt); |
3167 | } |
3168 | |
3169 | static ssize_t request_count_store(struct device *dev, |
3170 | @@ -83,7 +83,7 @@ static ssize_t request_count_store(struct device *dev, |
3171 | for_each_ap_queue(aq, ac) |
3172 | aq->total_request_count = 0; |
3173 | spin_unlock_bh(&ap_list_lock); |
3174 | - atomic_set(&ac->total_request_count, 0); |
3175 | + atomic64_set(&ac->total_request_count, 0); |
3176 | |
3177 | return count; |
3178 | } |
3179 | diff --git a/drivers/s390/crypto/ap_queue.c b/drivers/s390/crypto/ap_queue.c |
3180 | index 37c3bdc3642d..a317ab484932 100644 |
3181 | --- a/drivers/s390/crypto/ap_queue.c |
3182 | +++ b/drivers/s390/crypto/ap_queue.c |
3183 | @@ -479,12 +479,12 @@ static ssize_t request_count_show(struct device *dev, |
3184 | char *buf) |
3185 | { |
3186 | struct ap_queue *aq = to_ap_queue(dev); |
3187 | - unsigned int req_cnt; |
3188 | + u64 req_cnt; |
3189 | |
3190 | spin_lock_bh(&aq->lock); |
3191 | req_cnt = aq->total_request_count; |
3192 | spin_unlock_bh(&aq->lock); |
3193 | - return snprintf(buf, PAGE_SIZE, "%d\n", req_cnt); |
3194 | + return snprintf(buf, PAGE_SIZE, "%llu\n", req_cnt); |
3195 | } |
3196 | |
3197 | static ssize_t request_count_store(struct device *dev, |
3198 | @@ -676,7 +676,7 @@ void ap_queue_message(struct ap_queue *aq, struct ap_message *ap_msg) |
3199 | list_add_tail(&ap_msg->list, &aq->requestq); |
3200 | aq->requestq_count++; |
3201 | aq->total_request_count++; |
3202 | - atomic_inc(&aq->card->total_request_count); |
3203 | + atomic64_inc(&aq->card->total_request_count); |
3204 | /* Send/receive as many request from the queue as possible. */ |
3205 | ap_wait(ap_sm_event_loop(aq, AP_EVENT_POLL)); |
3206 | spin_unlock_bh(&aq->lock); |
3207 | diff --git a/drivers/s390/crypto/zcrypt_api.c b/drivers/s390/crypto/zcrypt_api.c |
3208 | index 9157e728a362..7fa0262e91af 100644 |
3209 | --- a/drivers/s390/crypto/zcrypt_api.c |
3210 | +++ b/drivers/s390/crypto/zcrypt_api.c |
3211 | @@ -605,8 +605,8 @@ static inline bool zcrypt_card_compare(struct zcrypt_card *zc, |
3212 | weight += atomic_read(&zc->load); |
3213 | pref_weight += atomic_read(&pref_zc->load); |
3214 | if (weight == pref_weight) |
3215 | - return atomic_read(&zc->card->total_request_count) > |
3216 | - atomic_read(&pref_zc->card->total_request_count); |
3217 | + return atomic64_read(&zc->card->total_request_count) > |
3218 | + atomic64_read(&pref_zc->card->total_request_count); |
3219 | return weight > pref_weight; |
3220 | } |
3221 | |
3222 | @@ -1216,11 +1216,12 @@ static void zcrypt_qdepth_mask(char qdepth[], size_t max_adapters) |
3223 | spin_unlock(&zcrypt_list_lock); |
3224 | } |
3225 | |
3226 | -static void zcrypt_perdev_reqcnt(int reqcnt[], size_t max_adapters) |
3227 | +static void zcrypt_perdev_reqcnt(u32 reqcnt[], size_t max_adapters) |
3228 | { |
3229 | struct zcrypt_card *zc; |
3230 | struct zcrypt_queue *zq; |
3231 | int card; |
3232 | + u64 cnt; |
3233 | |
3234 | memset(reqcnt, 0, sizeof(int) * max_adapters); |
3235 | spin_lock(&zcrypt_list_lock); |
3236 | @@ -1232,8 +1233,9 @@ static void zcrypt_perdev_reqcnt(int reqcnt[], size_t max_adapters) |
3237 | || card >= max_adapters) |
3238 | continue; |
3239 | spin_lock(&zq->queue->lock); |
3240 | - reqcnt[card] = zq->queue->total_request_count; |
3241 | + cnt = zq->queue->total_request_count; |
3242 | spin_unlock(&zq->queue->lock); |
3243 | + reqcnt[card] = (cnt < UINT_MAX) ? (u32) cnt : UINT_MAX; |
3244 | } |
3245 | } |
3246 | local_bh_enable(); |
3247 | @@ -1411,9 +1413,9 @@ static long zcrypt_unlocked_ioctl(struct file *filp, unsigned int cmd, |
3248 | return 0; |
3249 | } |
3250 | case ZCRYPT_PERDEV_REQCNT: { |
3251 | - int *reqcnt; |
3252 | + u32 *reqcnt; |
3253 | |
3254 | - reqcnt = kcalloc(AP_DEVICES, sizeof(int), GFP_KERNEL); |
3255 | + reqcnt = kcalloc(AP_DEVICES, sizeof(u32), GFP_KERNEL); |
3256 | if (!reqcnt) |
3257 | return -ENOMEM; |
3258 | zcrypt_perdev_reqcnt(reqcnt, AP_DEVICES); |
3259 | @@ -1470,7 +1472,7 @@ static long zcrypt_unlocked_ioctl(struct file *filp, unsigned int cmd, |
3260 | } |
3261 | case Z90STAT_PERDEV_REQCNT: { |
3262 | /* the old ioctl supports only 64 adapters */ |
3263 | - int reqcnt[MAX_ZDEV_CARDIDS]; |
3264 | + u32 reqcnt[MAX_ZDEV_CARDIDS]; |
3265 | |
3266 | zcrypt_perdev_reqcnt(reqcnt, MAX_ZDEV_CARDIDS); |
3267 | if (copy_to_user((int __user *) arg, reqcnt, sizeof(reqcnt))) |
3268 | diff --git a/drivers/s390/net/qeth_l2_main.c b/drivers/s390/net/qeth_l2_main.c |
3269 | index 59e220749ad1..92bace3b28fd 100644 |
3270 | --- a/drivers/s390/net/qeth_l2_main.c |
3271 | +++ b/drivers/s390/net/qeth_l2_main.c |
3272 | @@ -1846,15 +1846,14 @@ int qeth_l2_vnicc_set_state(struct qeth_card *card, u32 vnicc, bool state) |
3273 | |
3274 | QETH_CARD_TEXT(card, 2, "vniccsch"); |
3275 | |
3276 | - /* do not change anything if BridgePort is enabled */ |
3277 | - if (qeth_bridgeport_is_in_use(card)) |
3278 | - return -EBUSY; |
3279 | - |
3280 | /* check if characteristic and enable/disable are supported */ |
3281 | if (!(card->options.vnicc.sup_chars & vnicc) || |
3282 | !(card->options.vnicc.set_char_sup & vnicc)) |
3283 | return -EOPNOTSUPP; |
3284 | |
3285 | + if (qeth_bridgeport_is_in_use(card)) |
3286 | + return -EBUSY; |
3287 | + |
3288 | /* set enable/disable command and store wanted characteristic */ |
3289 | if (state) { |
3290 | cmd = IPA_VNICC_ENABLE; |
3291 | @@ -1900,14 +1899,13 @@ int qeth_l2_vnicc_get_state(struct qeth_card *card, u32 vnicc, bool *state) |
3292 | |
3293 | QETH_CARD_TEXT(card, 2, "vniccgch"); |
3294 | |
3295 | - /* do not get anything if BridgePort is enabled */ |
3296 | - if (qeth_bridgeport_is_in_use(card)) |
3297 | - return -EBUSY; |
3298 | - |
3299 | /* check if characteristic is supported */ |
3300 | if (!(card->options.vnicc.sup_chars & vnicc)) |
3301 | return -EOPNOTSUPP; |
3302 | |
3303 | + if (qeth_bridgeport_is_in_use(card)) |
3304 | + return -EBUSY; |
3305 | + |
3306 | /* if card is ready, query current VNICC state */ |
3307 | if (qeth_card_hw_is_reachable(card)) |
3308 | rc = qeth_l2_vnicc_query_chars(card); |
3309 | @@ -1925,15 +1923,14 @@ int qeth_l2_vnicc_set_timeout(struct qeth_card *card, u32 timeout) |
3310 | |
3311 | QETH_CARD_TEXT(card, 2, "vniccsto"); |
3312 | |
3313 | - /* do not change anything if BridgePort is enabled */ |
3314 | - if (qeth_bridgeport_is_in_use(card)) |
3315 | - return -EBUSY; |
3316 | - |
3317 | /* check if characteristic and set_timeout are supported */ |
3318 | if (!(card->options.vnicc.sup_chars & QETH_VNICC_LEARNING) || |
3319 | !(card->options.vnicc.getset_timeout_sup & QETH_VNICC_LEARNING)) |
3320 | return -EOPNOTSUPP; |
3321 | |
3322 | + if (qeth_bridgeport_is_in_use(card)) |
3323 | + return -EBUSY; |
3324 | + |
3325 | /* do we need to do anything? */ |
3326 | if (card->options.vnicc.learning_timeout == timeout) |
3327 | return rc; |
3328 | @@ -1962,14 +1959,14 @@ int qeth_l2_vnicc_get_timeout(struct qeth_card *card, u32 *timeout) |
3329 | |
3330 | QETH_CARD_TEXT(card, 2, "vniccgto"); |
3331 | |
3332 | - /* do not get anything if BridgePort is enabled */ |
3333 | - if (qeth_bridgeport_is_in_use(card)) |
3334 | - return -EBUSY; |
3335 | - |
3336 | /* check if characteristic and get_timeout are supported */ |
3337 | if (!(card->options.vnicc.sup_chars & QETH_VNICC_LEARNING) || |
3338 | !(card->options.vnicc.getset_timeout_sup & QETH_VNICC_LEARNING)) |
3339 | return -EOPNOTSUPP; |
3340 | + |
3341 | + if (qeth_bridgeport_is_in_use(card)) |
3342 | + return -EBUSY; |
3343 | + |
3344 | /* if card is ready, get timeout. Otherwise, just return stored value */ |
3345 | *timeout = card->options.vnicc.learning_timeout; |
3346 | if (qeth_card_hw_is_reachable(card)) |
3347 | diff --git a/drivers/soc/tegra/fuse/fuse-tegra30.c b/drivers/soc/tegra/fuse/fuse-tegra30.c |
3348 | index be9424a87173..9c3ef0a02fd4 100644 |
3349 | --- a/drivers/soc/tegra/fuse/fuse-tegra30.c |
3350 | +++ b/drivers/soc/tegra/fuse/fuse-tegra30.c |
3351 | @@ -35,7 +35,8 @@ |
3352 | defined(CONFIG_ARCH_TEGRA_124_SOC) || \ |
3353 | defined(CONFIG_ARCH_TEGRA_132_SOC) || \ |
3354 | defined(CONFIG_ARCH_TEGRA_210_SOC) || \ |
3355 | - defined(CONFIG_ARCH_TEGRA_186_SOC) |
3356 | + defined(CONFIG_ARCH_TEGRA_186_SOC) || \ |
3357 | + defined(CONFIG_ARCH_TEGRA_194_SOC) |
3358 | static u32 tegra30_fuse_read_early(struct tegra_fuse *fuse, unsigned int offset) |
3359 | { |
3360 | if (WARN_ON(!fuse->base)) |
3361 | diff --git a/drivers/thermal/broadcom/brcmstb_thermal.c b/drivers/thermal/broadcom/brcmstb_thermal.c |
3362 | index 5825ac581f56..680f1a070606 100644 |
3363 | --- a/drivers/thermal/broadcom/brcmstb_thermal.c |
3364 | +++ b/drivers/thermal/broadcom/brcmstb_thermal.c |
3365 | @@ -49,7 +49,7 @@ |
3366 | #define AVS_TMON_TP_TEST_ENABLE 0x20 |
3367 | |
3368 | /* Default coefficients */ |
3369 | -#define AVS_TMON_TEMP_SLOPE -487 |
3370 | +#define AVS_TMON_TEMP_SLOPE 487 |
3371 | #define AVS_TMON_TEMP_OFFSET 410040 |
3372 | |
3373 | /* HW related temperature constants */ |
3374 | @@ -108,23 +108,12 @@ struct brcmstb_thermal_priv { |
3375 | struct thermal_zone_device *thermal; |
3376 | }; |
3377 | |
3378 | -static void avs_tmon_get_coeffs(struct thermal_zone_device *tz, int *slope, |
3379 | - int *offset) |
3380 | -{ |
3381 | - *slope = thermal_zone_get_slope(tz); |
3382 | - *offset = thermal_zone_get_offset(tz); |
3383 | -} |
3384 | - |
3385 | /* Convert a HW code to a temperature reading (millidegree celsius) */ |
3386 | static inline int avs_tmon_code_to_temp(struct thermal_zone_device *tz, |
3387 | u32 code) |
3388 | { |
3389 | - const int val = code & AVS_TMON_TEMP_MASK; |
3390 | - int slope, offset; |
3391 | - |
3392 | - avs_tmon_get_coeffs(tz, &slope, &offset); |
3393 | - |
3394 | - return slope * val + offset; |
3395 | + return (AVS_TMON_TEMP_OFFSET - |
3396 | + (int)((code & AVS_TMON_TEMP_MAX) * AVS_TMON_TEMP_SLOPE)); |
3397 | } |
3398 | |
3399 | /* |
3400 | @@ -136,20 +125,18 @@ static inline int avs_tmon_code_to_temp(struct thermal_zone_device *tz, |
3401 | static inline u32 avs_tmon_temp_to_code(struct thermal_zone_device *tz, |
3402 | int temp, bool low) |
3403 | { |
3404 | - int slope, offset; |
3405 | - |
3406 | if (temp < AVS_TMON_TEMP_MIN) |
3407 | - return AVS_TMON_TEMP_MAX; /* Maximum code value */ |
3408 | - |
3409 | - avs_tmon_get_coeffs(tz, &slope, &offset); |
3410 | + return AVS_TMON_TEMP_MAX; /* Maximum code value */ |
3411 | |
3412 | - if (temp >= offset) |
3413 | + if (temp >= AVS_TMON_TEMP_OFFSET) |
3414 | return 0; /* Minimum code value */ |
3415 | |
3416 | if (low) |
3417 | - return (u32)(DIV_ROUND_UP(offset - temp, abs(slope))); |
3418 | + return (u32)(DIV_ROUND_UP(AVS_TMON_TEMP_OFFSET - temp, |
3419 | + AVS_TMON_TEMP_SLOPE)); |
3420 | else |
3421 | - return (u32)((offset - temp) / abs(slope)); |
3422 | + return (u32)((AVS_TMON_TEMP_OFFSET - temp) / |
3423 | + AVS_TMON_TEMP_SLOPE); |
3424 | } |
3425 | |
3426 | static int brcmstb_get_temp(void *data, int *temp) |
3427 | diff --git a/drivers/thermal/db8500_thermal.c b/drivers/thermal/db8500_thermal.c |
3428 | index 372dbbaaafb8..21d4d6e6409a 100644 |
3429 | --- a/drivers/thermal/db8500_thermal.c |
3430 | +++ b/drivers/thermal/db8500_thermal.c |
3431 | @@ -152,8 +152,8 @@ static irqreturn_t prcmu_high_irq_handler(int irq, void *irq_data) |
3432 | db8500_thermal_update_config(th, idx, THERMAL_TREND_RAISING, |
3433 | next_low, next_high); |
3434 | |
3435 | - dev_info(&th->tz->device, |
3436 | - "PRCMU set max %ld, min %ld\n", next_high, next_low); |
3437 | + dev_dbg(&th->tz->device, |
3438 | + "PRCMU set max %ld, min %ld\n", next_high, next_low); |
3439 | } else if (idx == num_points - 1) |
3440 | /* So we roof out 1 degree over the max point */ |
3441 | th->interpolated_temp = db8500_thermal_points[idx] + 1; |
3442 | diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c |
3443 | index 1a2dd53caade..b53b6528d6ce 100644 |
3444 | --- a/drivers/vhost/net.c |
3445 | +++ b/drivers/vhost/net.c |
3446 | @@ -1414,10 +1414,6 @@ static int vhost_net_release(struct inode *inode, struct file *f) |
3447 | |
3448 | static struct socket *get_raw_socket(int fd) |
3449 | { |
3450 | - struct { |
3451 | - struct sockaddr_ll sa; |
3452 | - char buf[MAX_ADDR_LEN]; |
3453 | - } uaddr; |
3454 | int r; |
3455 | struct socket *sock = sockfd_lookup(fd, &r); |
3456 | |
3457 | @@ -1430,11 +1426,7 @@ static struct socket *get_raw_socket(int fd) |
3458 | goto err; |
3459 | } |
3460 | |
3461 | - r = sock->ops->getname(sock, (struct sockaddr *)&uaddr.sa, 0); |
3462 | - if (r < 0) |
3463 | - goto err; |
3464 | - |
3465 | - if (uaddr.sa.sll_family != AF_PACKET) { |
3466 | + if (sock->sk->sk_family != AF_PACKET) { |
3467 | r = -EPFNOSUPPORT; |
3468 | goto err; |
3469 | } |
3470 | diff --git a/drivers/watchdog/wdat_wdt.c b/drivers/watchdog/wdat_wdt.c |
3471 | index e7cf41aa26c3..1ce39de917f0 100644 |
3472 | --- a/drivers/watchdog/wdat_wdt.c |
3473 | +++ b/drivers/watchdog/wdat_wdt.c |
3474 | @@ -389,7 +389,7 @@ static int wdat_wdt_probe(struct platform_device *pdev) |
3475 | |
3476 | memset(&r, 0, sizeof(r)); |
3477 | r.start = gas->address; |
3478 | - r.end = r.start + gas->access_width - 1; |
3479 | + r.end = r.start + ACPI_ACCESS_BYTE_WIDTH(gas->access_width) - 1; |
3480 | if (gas->space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY) { |
3481 | r.flags = IORESOURCE_MEM; |
3482 | } else if (gas->space_id == ACPI_ADR_SPACE_SYSTEM_IO) { |
3483 | diff --git a/fs/ceph/file.c b/fs/ceph/file.c |
3484 | index 11929d2bb594..cd09e63d682b 100644 |
3485 | --- a/fs/ceph/file.c |
3486 | +++ b/fs/ceph/file.c |
3487 | @@ -1418,6 +1418,7 @@ static ssize_t ceph_write_iter(struct kiocb *iocb, struct iov_iter *from) |
3488 | struct ceph_cap_flush *prealloc_cf; |
3489 | ssize_t count, written = 0; |
3490 | int err, want, got; |
3491 | + bool direct_lock = false; |
3492 | loff_t pos; |
3493 | loff_t limit = max(i_size_read(inode), fsc->max_file_size); |
3494 | |
3495 | @@ -1428,8 +1429,11 @@ static ssize_t ceph_write_iter(struct kiocb *iocb, struct iov_iter *from) |
3496 | if (!prealloc_cf) |
3497 | return -ENOMEM; |
3498 | |
3499 | + if ((iocb->ki_flags & (IOCB_DIRECT | IOCB_APPEND)) == IOCB_DIRECT) |
3500 | + direct_lock = true; |
3501 | + |
3502 | retry_snap: |
3503 | - if (iocb->ki_flags & IOCB_DIRECT) |
3504 | + if (direct_lock) |
3505 | ceph_start_io_direct(inode); |
3506 | else |
3507 | ceph_start_io_write(inode); |
3508 | @@ -1519,14 +1523,15 @@ retry_snap: |
3509 | |
3510 | /* we might need to revert back to that point */ |
3511 | data = *from; |
3512 | - if (iocb->ki_flags & IOCB_DIRECT) { |
3513 | + if (iocb->ki_flags & IOCB_DIRECT) |
3514 | written = ceph_direct_read_write(iocb, &data, snapc, |
3515 | &prealloc_cf); |
3516 | - ceph_end_io_direct(inode); |
3517 | - } else { |
3518 | + else |
3519 | written = ceph_sync_write(iocb, &data, pos, snapc); |
3520 | + if (direct_lock) |
3521 | + ceph_end_io_direct(inode); |
3522 | + else |
3523 | ceph_end_io_write(inode); |
3524 | - } |
3525 | if (written > 0) |
3526 | iov_iter_advance(from, written); |
3527 | ceph_put_snap_context(snapc); |
3528 | @@ -1577,7 +1582,7 @@ retry_snap: |
3529 | |
3530 | goto out_unlocked; |
3531 | out: |
3532 | - if (iocb->ki_flags & IOCB_DIRECT) |
3533 | + if (direct_lock) |
3534 | ceph_end_io_direct(inode); |
3535 | else |
3536 | ceph_end_io_write(inode); |
3537 | diff --git a/fs/cifs/cifsacl.c b/fs/cifs/cifsacl.c |
3538 | index f842944a5c76..1619af216677 100644 |
3539 | --- a/fs/cifs/cifsacl.c |
3540 | +++ b/fs/cifs/cifsacl.c |
3541 | @@ -603,7 +603,7 @@ static void access_flags_to_mode(__le32 ace_flags, int type, umode_t *pmode, |
3542 | ((flags & FILE_EXEC_RIGHTS) == FILE_EXEC_RIGHTS)) |
3543 | *pmode |= (S_IXUGO & (*pbits_to_set)); |
3544 | |
3545 | - cifs_dbg(NOISY, "access flags 0x%x mode now 0x%x\n", flags, *pmode); |
3546 | + cifs_dbg(NOISY, "access flags 0x%x mode now %04o\n", flags, *pmode); |
3547 | return; |
3548 | } |
3549 | |
3550 | @@ -632,7 +632,7 @@ static void mode_to_access_flags(umode_t mode, umode_t bits_to_use, |
3551 | if (mode & S_IXUGO) |
3552 | *pace_flags |= SET_FILE_EXEC_RIGHTS; |
3553 | |
3554 | - cifs_dbg(NOISY, "mode: 0x%x, access flags now 0x%x\n", |
3555 | + cifs_dbg(NOISY, "mode: %04o, access flags now 0x%x\n", |
3556 | mode, *pace_flags); |
3557 | return; |
3558 | } |
3559 | diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c |
3560 | index 5d3c867bdc80..bcda48c03882 100644 |
3561 | --- a/fs/cifs/connect.c |
3562 | +++ b/fs/cifs/connect.c |
3563 | @@ -4094,7 +4094,7 @@ int cifs_setup_cifs_sb(struct smb_vol *pvolume_info, |
3564 | cifs_sb->mnt_gid = pvolume_info->linux_gid; |
3565 | cifs_sb->mnt_file_mode = pvolume_info->file_mode; |
3566 | cifs_sb->mnt_dir_mode = pvolume_info->dir_mode; |
3567 | - cifs_dbg(FYI, "file mode: 0x%hx dir mode: 0x%hx\n", |
3568 | + cifs_dbg(FYI, "file mode: %04ho dir mode: %04ho\n", |
3569 | cifs_sb->mnt_file_mode, cifs_sb->mnt_dir_mode); |
3570 | |
3571 | cifs_sb->actimeo = pvolume_info->actimeo; |
3572 | diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c |
3573 | index ed59e4a8db59..aafcd79c4772 100644 |
3574 | --- a/fs/cifs/inode.c |
3575 | +++ b/fs/cifs/inode.c |
3576 | @@ -1586,7 +1586,7 @@ int cifs_mkdir(struct inode *inode, struct dentry *direntry, umode_t mode) |
3577 | struct TCP_Server_Info *server; |
3578 | char *full_path; |
3579 | |
3580 | - cifs_dbg(FYI, "In cifs_mkdir, mode = 0x%hx inode = 0x%p\n", |
3581 | + cifs_dbg(FYI, "In cifs_mkdir, mode = %04ho inode = 0x%p\n", |
3582 | mode, inode); |
3583 | |
3584 | cifs_sb = CIFS_SB(inode->i_sb); |
3585 | diff --git a/fs/dax.c b/fs/dax.c |
3586 | index 2cc43cd914eb..cc56313c6b3b 100644 |
3587 | --- a/fs/dax.c |
3588 | +++ b/fs/dax.c |
3589 | @@ -1207,6 +1207,9 @@ dax_iomap_rw(struct kiocb *iocb, struct iov_iter *iter, |
3590 | lockdep_assert_held(&inode->i_rwsem); |
3591 | } |
3592 | |
3593 | + if (iocb->ki_flags & IOCB_NOWAIT) |
3594 | + flags |= IOMAP_NOWAIT; |
3595 | + |
3596 | while (iov_iter_count(iter)) { |
3597 | ret = iomap_apply(inode, pos, iov_iter_count(iter), flags, ops, |
3598 | iter, dax_iomap_actor); |
3599 | diff --git a/fs/ext4/super.c b/fs/ext4/super.c |
3600 | index 3ca604807839..8bd806a03a90 100644 |
3601 | --- a/fs/ext4/super.c |
3602 | +++ b/fs/ext4/super.c |
3603 | @@ -2343,7 +2343,7 @@ int ext4_alloc_flex_bg_array(struct super_block *sb, ext4_group_t ngroup) |
3604 | { |
3605 | struct ext4_sb_info *sbi = EXT4_SB(sb); |
3606 | struct flex_groups **old_groups, **new_groups; |
3607 | - int size, i; |
3608 | + int size, i, j; |
3609 | |
3610 | if (!sbi->s_log_groups_per_flex) |
3611 | return 0; |
3612 | @@ -2364,8 +2364,8 @@ int ext4_alloc_flex_bg_array(struct super_block *sb, ext4_group_t ngroup) |
3613 | sizeof(struct flex_groups)), |
3614 | GFP_KERNEL); |
3615 | if (!new_groups[i]) { |
3616 | - for (i--; i >= sbi->s_flex_groups_allocated; i--) |
3617 | - kvfree(new_groups[i]); |
3618 | + for (j = sbi->s_flex_groups_allocated; j < i; j++) |
3619 | + kvfree(new_groups[j]); |
3620 | kvfree(new_groups); |
3621 | ext4_msg(sb, KERN_ERR, |
3622 | "not enough memory for %d flex groups", size); |
3623 | diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c |
3624 | index 5d6fd940aab2..ec9a1f9ce2dd 100644 |
3625 | --- a/fs/f2fs/data.c |
3626 | +++ b/fs/f2fs/data.c |
3627 | @@ -3030,7 +3030,8 @@ int f2fs_migrate_page(struct address_space *mapping, |
3628 | |
3629 | #ifdef CONFIG_SWAP |
3630 | /* Copied from generic_swapfile_activate() to check any holes */ |
3631 | -static int check_swap_activate(struct file *swap_file, unsigned int max) |
3632 | +static int check_swap_activate(struct swap_info_struct *sis, |
3633 | + struct file *swap_file, sector_t *span) |
3634 | { |
3635 | struct address_space *mapping = swap_file->f_mapping; |
3636 | struct inode *inode = mapping->host; |
3637 | @@ -3041,6 +3042,8 @@ static int check_swap_activate(struct file *swap_file, unsigned int max) |
3638 | sector_t last_block; |
3639 | sector_t lowest_block = -1; |
3640 | sector_t highest_block = 0; |
3641 | + int nr_extents = 0; |
3642 | + int ret; |
3643 | |
3644 | blkbits = inode->i_blkbits; |
3645 | blocks_per_page = PAGE_SIZE >> blkbits; |
3646 | @@ -3052,7 +3055,8 @@ static int check_swap_activate(struct file *swap_file, unsigned int max) |
3647 | probe_block = 0; |
3648 | page_no = 0; |
3649 | last_block = i_size_read(inode) >> blkbits; |
3650 | - while ((probe_block + blocks_per_page) <= last_block && page_no < max) { |
3651 | + while ((probe_block + blocks_per_page) <= last_block && |
3652 | + page_no < sis->max) { |
3653 | unsigned block_in_page; |
3654 | sector_t first_block; |
3655 | |
3656 | @@ -3092,13 +3096,27 @@ static int check_swap_activate(struct file *swap_file, unsigned int max) |
3657 | highest_block = first_block; |
3658 | } |
3659 | |
3660 | + /* |
3661 | + * We found a PAGE_SIZE-length, PAGE_SIZE-aligned run of blocks |
3662 | + */ |
3663 | + ret = add_swap_extent(sis, page_no, 1, first_block); |
3664 | + if (ret < 0) |
3665 | + goto out; |
3666 | + nr_extents += ret; |
3667 | page_no++; |
3668 | probe_block += blocks_per_page; |
3669 | reprobe: |
3670 | continue; |
3671 | } |
3672 | - return 0; |
3673 | - |
3674 | + ret = nr_extents; |
3675 | + *span = 1 + highest_block - lowest_block; |
3676 | + if (page_no == 0) |
3677 | + page_no = 1; /* force Empty message */ |
3678 | + sis->max = page_no; |
3679 | + sis->pages = page_no - 1; |
3680 | + sis->highest_bit = page_no - 1; |
3681 | +out: |
3682 | + return ret; |
3683 | bad_bmap: |
3684 | pr_err("swapon: swapfile has holes\n"); |
3685 | return -EINVAL; |
3686 | @@ -3120,14 +3138,14 @@ static int f2fs_swap_activate(struct swap_info_struct *sis, struct file *file, |
3687 | if (ret) |
3688 | return ret; |
3689 | |
3690 | - ret = check_swap_activate(file, sis->max); |
3691 | - if (ret) |
3692 | + ret = check_swap_activate(sis, file, span); |
3693 | + if (ret < 0) |
3694 | return ret; |
3695 | |
3696 | set_inode_flag(inode, FI_PIN_FILE); |
3697 | f2fs_precache_extents(inode); |
3698 | f2fs_update_time(F2FS_I_SB(inode), REQ_TIME); |
3699 | - return 0; |
3700 | + return ret; |
3701 | } |
3702 | |
3703 | static void f2fs_swap_deactivate(struct file *file) |
3704 | diff --git a/fs/io_uring.c b/fs/io_uring.c |
3705 | index ed9a551882cf..e37b84146453 100644 |
3706 | --- a/fs/io_uring.c |
3707 | +++ b/fs/io_uring.c |
3708 | @@ -71,6 +71,7 @@ |
3709 | #include <linux/sizes.h> |
3710 | #include <linux/hugetlb.h> |
3711 | #include <linux/highmem.h> |
3712 | +#include <linux/fs_struct.h> |
3713 | |
3714 | #include <uapi/linux/io_uring.h> |
3715 | |
3716 | @@ -334,6 +335,8 @@ struct io_kiocb { |
3717 | u32 result; |
3718 | u32 sequence; |
3719 | |
3720 | + struct fs_struct *fs; |
3721 | + |
3722 | struct work_struct work; |
3723 | }; |
3724 | |
3725 | @@ -651,6 +654,7 @@ static struct io_kiocb *io_get_req(struct io_ring_ctx *ctx, |
3726 | /* one is dropped after submission, the other at completion */ |
3727 | refcount_set(&req->refs, 2); |
3728 | req->result = 0; |
3729 | + req->fs = NULL; |
3730 | return req; |
3731 | out: |
3732 | percpu_ref_put(&ctx->refs); |
3733 | @@ -1653,6 +1657,11 @@ static int io_send_recvmsg(struct io_kiocb *req, const struct io_uring_sqe *sqe, |
3734 | else if (force_nonblock) |
3735 | flags |= MSG_DONTWAIT; |
3736 | |
3737 | +#ifdef CONFIG_COMPAT |
3738 | + if (req->ctx->compat) |
3739 | + flags |= MSG_CMSG_COMPAT; |
3740 | +#endif |
3741 | + |
3742 | msg = (struct user_msghdr __user *) (unsigned long) |
3743 | READ_ONCE(sqe->addr); |
3744 | |
3745 | @@ -1663,6 +1672,16 @@ static int io_send_recvmsg(struct io_kiocb *req, const struct io_uring_sqe *sqe, |
3746 | ret = -EINTR; |
3747 | } |
3748 | |
3749 | + if (req->fs) { |
3750 | + struct fs_struct *fs = req->fs; |
3751 | + |
3752 | + spin_lock(&req->fs->lock); |
3753 | + if (--fs->users) |
3754 | + fs = NULL; |
3755 | + spin_unlock(&req->fs->lock); |
3756 | + if (fs) |
3757 | + free_fs_struct(fs); |
3758 | + } |
3759 | io_cqring_add_event(req->ctx, sqe->user_data, ret); |
3760 | io_put_req(req); |
3761 | return 0; |
3762 | @@ -2159,6 +2178,7 @@ static inline bool io_sqe_needs_user(const struct io_uring_sqe *sqe) |
3763 | static void io_sq_wq_submit_work(struct work_struct *work) |
3764 | { |
3765 | struct io_kiocb *req = container_of(work, struct io_kiocb, work); |
3766 | + struct fs_struct *old_fs_struct = current->fs; |
3767 | struct io_ring_ctx *ctx = req->ctx; |
3768 | struct mm_struct *cur_mm = NULL; |
3769 | struct async_list *async_list; |
3770 | @@ -2178,6 +2198,15 @@ restart: |
3771 | /* Ensure we clear previously set non-block flag */ |
3772 | req->rw.ki_flags &= ~IOCB_NOWAIT; |
3773 | |
3774 | + if (req->fs != current->fs && current->fs != old_fs_struct) { |
3775 | + task_lock(current); |
3776 | + if (req->fs) |
3777 | + current->fs = req->fs; |
3778 | + else |
3779 | + current->fs = old_fs_struct; |
3780 | + task_unlock(current); |
3781 | + } |
3782 | + |
3783 | ret = 0; |
3784 | if (io_sqe_needs_user(sqe) && !cur_mm) { |
3785 | if (!mmget_not_zero(ctx->sqo_mm)) { |
3786 | @@ -2276,6 +2305,11 @@ out: |
3787 | mmput(cur_mm); |
3788 | } |
3789 | revert_creds(old_cred); |
3790 | + if (old_fs_struct) { |
3791 | + task_lock(current); |
3792 | + current->fs = old_fs_struct; |
3793 | + task_unlock(current); |
3794 | + } |
3795 | } |
3796 | |
3797 | /* |
3798 | @@ -2503,6 +2537,23 @@ err: |
3799 | |
3800 | req->user_data = s->sqe->user_data; |
3801 | |
3802 | +#if defined(CONFIG_NET) |
3803 | + switch (READ_ONCE(s->sqe->opcode)) { |
3804 | + case IORING_OP_SENDMSG: |
3805 | + case IORING_OP_RECVMSG: |
3806 | + spin_lock(¤t->fs->lock); |
3807 | + if (!current->fs->in_exec) { |
3808 | + req->fs = current->fs; |
3809 | + req->fs->users++; |
3810 | + } |
3811 | + spin_unlock(¤t->fs->lock); |
3812 | + if (!req->fs) { |
3813 | + ret = -EAGAIN; |
3814 | + goto err_req; |
3815 | + } |
3816 | + } |
3817 | +#endif |
3818 | + |
3819 | /* |
3820 | * If we already have a head request, queue this one for async |
3821 | * submittal once the head completes. If we don't have a head but |
3822 | diff --git a/fs/namei.c b/fs/namei.c |
3823 | index bd1c0ca4151c..5b5759d70822 100644 |
3824 | --- a/fs/namei.c |
3825 | +++ b/fs/namei.c |
3826 | @@ -1360,7 +1360,7 @@ static int follow_dotdot_rcu(struct nameidata *nd) |
3827 | nd->path.dentry = parent; |
3828 | nd->seq = seq; |
3829 | if (unlikely(!path_connected(&nd->path))) |
3830 | - return -ENOENT; |
3831 | + return -ECHILD; |
3832 | break; |
3833 | } else { |
3834 | struct mount *mnt = real_mount(nd->path.mnt); |
3835 | diff --git a/fs/nfs/nfs4file.c b/fs/nfs/nfs4file.c |
3836 | index 339663d04bf8..54f1c1f626fc 100644 |
3837 | --- a/fs/nfs/nfs4file.c |
3838 | +++ b/fs/nfs/nfs4file.c |
3839 | @@ -86,7 +86,6 @@ nfs4_file_open(struct inode *inode, struct file *filp) |
3840 | if (inode != d_inode(dentry)) |
3841 | goto out_drop; |
3842 | |
3843 | - nfs_set_verifier(dentry, nfs_save_change_attribute(dir)); |
3844 | nfs_file_set_open_context(filp, ctx); |
3845 | nfs_fscache_open_file(inode, filp); |
3846 | err = 0; |
3847 | diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c |
3848 | index f808fb34b110..6b29703d2fe1 100644 |
3849 | --- a/fs/nfs/nfs4proc.c |
3850 | +++ b/fs/nfs/nfs4proc.c |
3851 | @@ -2962,10 +2962,13 @@ static int _nfs4_open_and_get_state(struct nfs4_opendata *opendata, |
3852 | struct dentry *dentry; |
3853 | struct nfs4_state *state; |
3854 | fmode_t acc_mode = _nfs4_ctx_to_accessmode(ctx); |
3855 | + struct inode *dir = d_inode(opendata->dir); |
3856 | + unsigned long dir_verifier; |
3857 | unsigned int seq; |
3858 | int ret; |
3859 | |
3860 | seq = raw_seqcount_begin(&sp->so_reclaim_seqcount); |
3861 | + dir_verifier = nfs_save_change_attribute(dir); |
3862 | |
3863 | ret = _nfs4_proc_open(opendata, ctx); |
3864 | if (ret != 0) |
3865 | @@ -2993,8 +2996,19 @@ static int _nfs4_open_and_get_state(struct nfs4_opendata *opendata, |
3866 | dput(ctx->dentry); |
3867 | ctx->dentry = dentry = alias; |
3868 | } |
3869 | - nfs_set_verifier(dentry, |
3870 | - nfs_save_change_attribute(d_inode(opendata->dir))); |
3871 | + } |
3872 | + |
3873 | + switch(opendata->o_arg.claim) { |
3874 | + default: |
3875 | + break; |
3876 | + case NFS4_OPEN_CLAIM_NULL: |
3877 | + case NFS4_OPEN_CLAIM_DELEGATE_CUR: |
3878 | + case NFS4_OPEN_CLAIM_DELEGATE_PREV: |
3879 | + if (!opendata->rpc_done) |
3880 | + break; |
3881 | + if (opendata->o_res.delegation_type != 0) |
3882 | + dir_verifier = nfs_save_change_attribute(dir); |
3883 | + nfs_set_verifier(dentry, dir_verifier); |
3884 | } |
3885 | |
3886 | /* Parse layoutget results before we check for access */ |
3887 | diff --git a/fs/ubifs/orphan.c b/fs/ubifs/orphan.c |
3888 | index 54d6db61106f..edf43ddd7dce 100644 |
3889 | --- a/fs/ubifs/orphan.c |
3890 | +++ b/fs/ubifs/orphan.c |
3891 | @@ -129,7 +129,7 @@ static void __orphan_drop(struct ubifs_info *c, struct ubifs_orphan *o) |
3892 | static void orphan_delete(struct ubifs_info *c, struct ubifs_orphan *orph) |
3893 | { |
3894 | if (orph->del) { |
3895 | - dbg_gen("deleted twice ino %lu", orph->inum); |
3896 | + dbg_gen("deleted twice ino %lu", (unsigned long)orph->inum); |
3897 | return; |
3898 | } |
3899 | |
3900 | @@ -137,7 +137,7 @@ static void orphan_delete(struct ubifs_info *c, struct ubifs_orphan *orph) |
3901 | orph->del = 1; |
3902 | orph->dnext = c->orph_dnext; |
3903 | c->orph_dnext = orph; |
3904 | - dbg_gen("delete later ino %lu", orph->inum); |
3905 | + dbg_gen("delete later ino %lu", (unsigned long)orph->inum); |
3906 | return; |
3907 | } |
3908 | |
3909 | diff --git a/fs/xfs/libxfs/xfs_attr.h b/fs/xfs/libxfs/xfs_attr.h |
3910 | index 94badfa1743e..91c2cb14276e 100644 |
3911 | --- a/fs/xfs/libxfs/xfs_attr.h |
3912 | +++ b/fs/xfs/libxfs/xfs_attr.h |
3913 | @@ -26,7 +26,7 @@ struct xfs_attr_list_context; |
3914 | *========================================================================*/ |
3915 | |
3916 | |
3917 | -#define ATTR_DONTFOLLOW 0x0001 /* -- unused, from IRIX -- */ |
3918 | +#define ATTR_DONTFOLLOW 0x0001 /* -- ignored, from IRIX -- */ |
3919 | #define ATTR_ROOT 0x0002 /* use attrs in root (trusted) namespace */ |
3920 | #define ATTR_TRUST 0x0004 /* -- unused, from IRIX -- */ |
3921 | #define ATTR_SECURE 0x0008 /* use attrs in security namespace */ |
3922 | @@ -37,7 +37,10 @@ struct xfs_attr_list_context; |
3923 | #define ATTR_KERNOVAL 0x2000 /* [kernel] get attr size only, not value */ |
3924 | |
3925 | #define ATTR_INCOMPLETE 0x4000 /* [kernel] return INCOMPLETE attr keys */ |
3926 | -#define ATTR_ALLOC 0x8000 /* allocate xattr buffer on demand */ |
3927 | +#define ATTR_ALLOC 0x8000 /* [kernel] allocate xattr buffer on demand */ |
3928 | + |
3929 | +#define ATTR_KERNEL_FLAGS \ |
3930 | + (ATTR_KERNOTIME | ATTR_KERNOVAL | ATTR_INCOMPLETE | ATTR_ALLOC) |
3931 | |
3932 | #define XFS_ATTR_FLAGS \ |
3933 | { ATTR_DONTFOLLOW, "DONTFOLLOW" }, \ |
3934 | diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c |
3935 | index d58f0d6a699e..2a1909397cb4 100644 |
3936 | --- a/fs/xfs/xfs_ioctl.c |
3937 | +++ b/fs/xfs/xfs_ioctl.c |
3938 | @@ -536,6 +536,8 @@ xfs_attrmulti_by_handle( |
3939 | |
3940 | error = 0; |
3941 | for (i = 0; i < am_hreq.opcount; i++) { |
3942 | + ops[i].am_flags &= ~ATTR_KERNEL_FLAGS; |
3943 | + |
3944 | ops[i].am_error = strncpy_from_user((char *)attr_name, |
3945 | ops[i].am_attrname, MAXNAMELEN); |
3946 | if (ops[i].am_error == 0 || ops[i].am_error == MAXNAMELEN) |
3947 | diff --git a/fs/xfs/xfs_ioctl32.c b/fs/xfs/xfs_ioctl32.c |
3948 | index 1e08bf79b478..e61cc41189f8 100644 |
3949 | --- a/fs/xfs/xfs_ioctl32.c |
3950 | +++ b/fs/xfs/xfs_ioctl32.c |
3951 | @@ -450,6 +450,8 @@ xfs_compat_attrmulti_by_handle( |
3952 | |
3953 | error = 0; |
3954 | for (i = 0; i < am_hreq.opcount; i++) { |
3955 | + ops[i].am_flags &= ~ATTR_KERNEL_FLAGS; |
3956 | + |
3957 | ops[i].am_error = strncpy_from_user((char *)attr_name, |
3958 | compat_ptr(ops[i].am_attrname), |
3959 | MAXNAMELEN); |
3960 | diff --git a/include/Kbuild b/include/Kbuild |
3961 | deleted file mode 100644 |
3962 | index ffba79483cc5..000000000000 |
3963 | --- a/include/Kbuild |
3964 | +++ /dev/null |
3965 | @@ -1,1185 +0,0 @@ |
3966 | -# SPDX-License-Identifier: GPL-2.0-only |
3967 | - |
3968 | -# Add header-test-$(CONFIG_...) guard to headers that are only compiled |
3969 | -# for particular architectures. |
3970 | -# |
3971 | -# Headers listed in header-test- are excluded from the test coverage. |
3972 | -# Many headers are excluded for now because they fail to build. Please |
3973 | -# consider to fix headers first before adding new ones to the blacklist. |
3974 | -# |
3975 | -# Sorted alphabetically. |
3976 | -header-test- += acpi/acbuffer.h |
3977 | -header-test- += acpi/acpi.h |
3978 | -header-test- += acpi/acpi_bus.h |
3979 | -header-test- += acpi/acpi_drivers.h |
3980 | -header-test- += acpi/acpi_io.h |
3981 | -header-test- += acpi/acpi_lpat.h |
3982 | -header-test- += acpi/acpiosxf.h |
3983 | -header-test- += acpi/acpixf.h |
3984 | -header-test- += acpi/acrestyp.h |
3985 | -header-test- += acpi/actbl.h |
3986 | -header-test- += acpi/actbl1.h |
3987 | -header-test- += acpi/actbl2.h |
3988 | -header-test- += acpi/actbl3.h |
3989 | -header-test- += acpi/actypes.h |
3990 | -header-test- += acpi/battery.h |
3991 | -header-test- += acpi/cppc_acpi.h |
3992 | -header-test- += acpi/nfit.h |
3993 | -header-test- += acpi/platform/acenv.h |
3994 | -header-test- += acpi/platform/acenvex.h |
3995 | -header-test- += acpi/platform/acintel.h |
3996 | -header-test- += acpi/platform/aclinux.h |
3997 | -header-test- += acpi/platform/aclinuxex.h |
3998 | -header-test- += acpi/processor.h |
3999 | -header-test-$(CONFIG_X86) += clocksource/hyperv_timer.h |
4000 | -header-test- += clocksource/timer-sp804.h |
4001 | -header-test- += crypto/cast_common.h |
4002 | -header-test- += crypto/internal/cryptouser.h |
4003 | -header-test- += crypto/pkcs7.h |
4004 | -header-test- += crypto/poly1305.h |
4005 | -header-test- += crypto/sha3.h |
4006 | -header-test- += drm/ati_pcigart.h |
4007 | -header-test- += drm/bridge/dw_hdmi.h |
4008 | -header-test- += drm/bridge/dw_mipi_dsi.h |
4009 | -header-test- += drm/drm_audio_component.h |
4010 | -header-test- += drm/drm_auth.h |
4011 | -header-test- += drm/drm_debugfs.h |
4012 | -header-test- += drm/drm_debugfs_crc.h |
4013 | -header-test- += drm/drm_displayid.h |
4014 | -header-test- += drm/drm_encoder_slave.h |
4015 | -header-test- += drm/drm_fb_cma_helper.h |
4016 | -header-test- += drm/drm_fb_helper.h |
4017 | -header-test- += drm/drm_fixed.h |
4018 | -header-test- += drm/drm_format_helper.h |
4019 | -header-test- += drm/drm_lease.h |
4020 | -header-test- += drm/drm_legacy.h |
4021 | -header-test- += drm/drm_panel.h |
4022 | -header-test- += drm/drm_plane_helper.h |
4023 | -header-test- += drm/drm_rect.h |
4024 | -header-test- += drm/i915_component.h |
4025 | -header-test- += drm/intel-gtt.h |
4026 | -header-test- += drm/tinydrm/tinydrm-helpers.h |
4027 | -header-test- += drm/ttm/ttm_debug.h |
4028 | -header-test- += keys/asymmetric-parser.h |
4029 | -header-test- += keys/asymmetric-subtype.h |
4030 | -header-test- += keys/asymmetric-type.h |
4031 | -header-test- += keys/big_key-type.h |
4032 | -header-test- += keys/request_key_auth-type.h |
4033 | -header-test- += keys/trusted.h |
4034 | -header-test- += kvm/arm_arch_timer.h |
4035 | -header-test- += kvm/arm_pmu.h |
4036 | -header-test-$(CONFIG_ARM) += kvm/arm_psci.h |
4037 | -header-test-$(CONFIG_ARM64) += kvm/arm_psci.h |
4038 | -header-test- += kvm/arm_vgic.h |
4039 | -header-test- += linux/8250_pci.h |
4040 | -header-test- += linux/a.out.h |
4041 | -header-test- += linux/adxl.h |
4042 | -header-test- += linux/agpgart.h |
4043 | -header-test- += linux/alcor_pci.h |
4044 | -header-test- += linux/amba/clcd.h |
4045 | -header-test- += linux/amba/pl080.h |
4046 | -header-test- += linux/amd-iommu.h |
4047 | -header-test-$(CONFIG_ARM) += linux/arm-cci.h |
4048 | -header-test-$(CONFIG_ARM64) += linux/arm-cci.h |
4049 | -header-test- += linux/arm_sdei.h |
4050 | -header-test- += linux/asn1_decoder.h |
4051 | -header-test- += linux/ata_platform.h |
4052 | -header-test- += linux/ath9k_platform.h |
4053 | -header-test- += linux/atm_tcp.h |
4054 | -header-test- += linux/atomic-fallback.h |
4055 | -header-test- += linux/avf/virtchnl.h |
4056 | -header-test- += linux/bcm47xx_sprom.h |
4057 | -header-test- += linux/bcma/bcma_driver_gmac_cmn.h |
4058 | -header-test- += linux/bcma/bcma_driver_mips.h |
4059 | -header-test- += linux/bcma/bcma_driver_pci.h |
4060 | -header-test- += linux/bcma/bcma_driver_pcie2.h |
4061 | -header-test- += linux/bit_spinlock.h |
4062 | -header-test- += linux/blk-mq-rdma.h |
4063 | -header-test- += linux/blk-mq.h |
4064 | -header-test- += linux/blktrace_api.h |
4065 | -header-test- += linux/blockgroup_lock.h |
4066 | -header-test- += linux/bma150.h |
4067 | -header-test- += linux/bpf_lirc.h |
4068 | -header-test- += linux/bpf_types.h |
4069 | -header-test- += linux/bsg-lib.h |
4070 | -header-test- += linux/bsg.h |
4071 | -header-test- += linux/btf.h |
4072 | -header-test- += linux/btree-128.h |
4073 | -header-test- += linux/btree-type.h |
4074 | -header-test-$(CONFIG_CPU_BIG_ENDIAN) += linux/byteorder/big_endian.h |
4075 | -header-test- += linux/byteorder/generic.h |
4076 | -header-test-$(CONFIG_CPU_LITTLE_ENDIAN) += linux/byteorder/little_endian.h |
4077 | -header-test- += linux/c2port.h |
4078 | -header-test- += linux/can/dev/peak_canfd.h |
4079 | -header-test- += linux/can/platform/cc770.h |
4080 | -header-test- += linux/can/platform/sja1000.h |
4081 | -header-test- += linux/ceph/ceph_features.h |
4082 | -header-test- += linux/ceph/ceph_frag.h |
4083 | -header-test- += linux/ceph/ceph_fs.h |
4084 | -header-test- += linux/ceph/debugfs.h |
4085 | -header-test- += linux/ceph/msgr.h |
4086 | -header-test- += linux/ceph/rados.h |
4087 | -header-test- += linux/cgroup_subsys.h |
4088 | -header-test- += linux/clk/sunxi-ng.h |
4089 | -header-test- += linux/clk/ti.h |
4090 | -header-test- += linux/cn_proc.h |
4091 | -header-test- += linux/coda_psdev.h |
4092 | -header-test- += linux/compaction.h |
4093 | -header-test- += linux/console_struct.h |
4094 | -header-test- += linux/count_zeros.h |
4095 | -header-test- += linux/cs5535.h |
4096 | -header-test- += linux/cuda.h |
4097 | -header-test- += linux/cyclades.h |
4098 | -header-test- += linux/dcookies.h |
4099 | -header-test- += linux/delayacct.h |
4100 | -header-test- += linux/delayed_call.h |
4101 | -header-test- += linux/device-mapper.h |
4102 | -header-test- += linux/devpts_fs.h |
4103 | -header-test- += linux/dio.h |
4104 | -header-test- += linux/dirent.h |
4105 | -header-test- += linux/dlm_plock.h |
4106 | -header-test- += linux/dm-dirty-log.h |
4107 | -header-test- += linux/dm-region-hash.h |
4108 | -header-test- += linux/dma-debug.h |
4109 | -header-test- += linux/dma/mmp-pdma.h |
4110 | -header-test- += linux/dma/sprd-dma.h |
4111 | -header-test- += linux/dns_resolver.h |
4112 | -header-test- += linux/drbd_genl.h |
4113 | -header-test- += linux/drbd_genl_api.h |
4114 | -header-test- += linux/dw_apb_timer.h |
4115 | -header-test- += linux/dynamic_debug.h |
4116 | -header-test- += linux/dynamic_queue_limits.h |
4117 | -header-test- += linux/ecryptfs.h |
4118 | -header-test- += linux/edma.h |
4119 | -header-test- += linux/eeprom_93cx6.h |
4120 | -header-test- += linux/efs_vh.h |
4121 | -header-test- += linux/elevator.h |
4122 | -header-test- += linux/elfcore-compat.h |
4123 | -header-test- += linux/error-injection.h |
4124 | -header-test- += linux/errseq.h |
4125 | -header-test- += linux/eventpoll.h |
4126 | -header-test- += linux/ext2_fs.h |
4127 | -header-test- += linux/f75375s.h |
4128 | -header-test- += linux/falloc.h |
4129 | -header-test- += linux/fault-inject.h |
4130 | -header-test- += linux/fbcon.h |
4131 | -header-test- += linux/firmware/intel/stratix10-svc-client.h |
4132 | -header-test- += linux/firmware/meson/meson_sm.h |
4133 | -header-test- += linux/firmware/trusted_foundations.h |
4134 | -header-test- += linux/firmware/xlnx-zynqmp.h |
4135 | -header-test- += linux/fixp-arith.h |
4136 | -header-test- += linux/flat.h |
4137 | -header-test- += linux/fs_types.h |
4138 | -header-test- += linux/fs_uart_pd.h |
4139 | -header-test- += linux/fsi-occ.h |
4140 | -header-test- += linux/fsi-sbefifo.h |
4141 | -header-test- += linux/fsl/bestcomm/ata.h |
4142 | -header-test- += linux/fsl/bestcomm/bestcomm.h |
4143 | -header-test- += linux/fsl/bestcomm/bestcomm_priv.h |
4144 | -header-test- += linux/fsl/bestcomm/fec.h |
4145 | -header-test- += linux/fsl/bestcomm/gen_bd.h |
4146 | -header-test- += linux/fsl/bestcomm/sram.h |
4147 | -header-test- += linux/fsl_hypervisor.h |
4148 | -header-test- += linux/fsldma.h |
4149 | -header-test- += linux/ftrace_irq.h |
4150 | -header-test- += linux/gameport.h |
4151 | -header-test- += linux/genl_magic_func.h |
4152 | -header-test- += linux/genl_magic_struct.h |
4153 | -header-test- += linux/gpio/aspeed.h |
4154 | -header-test- += linux/gpio/gpio-reg.h |
4155 | -header-test- += linux/hid-debug.h |
4156 | -header-test- += linux/hiddev.h |
4157 | -header-test- += linux/hippidevice.h |
4158 | -header-test- += linux/hmm.h |
4159 | -header-test- += linux/hp_sdc.h |
4160 | -header-test- += linux/huge_mm.h |
4161 | -header-test- += linux/hugetlb_cgroup.h |
4162 | -header-test- += linux/hugetlb_inline.h |
4163 | -header-test- += linux/hwmon-vid.h |
4164 | -header-test- += linux/hyperv.h |
4165 | -header-test- += linux/i2c-algo-pca.h |
4166 | -header-test- += linux/i2c-algo-pcf.h |
4167 | -header-test- += linux/i3c/ccc.h |
4168 | -header-test- += linux/i3c/device.h |
4169 | -header-test- += linux/i3c/master.h |
4170 | -header-test- += linux/i8042.h |
4171 | -header-test- += linux/ide.h |
4172 | -header-test- += linux/idle_inject.h |
4173 | -header-test- += linux/if_frad.h |
4174 | -header-test- += linux/if_rmnet.h |
4175 | -header-test- += linux/if_tap.h |
4176 | -header-test- += linux/iio/accel/kxcjk_1013.h |
4177 | -header-test- += linux/iio/adc/ad_sigma_delta.h |
4178 | -header-test- += linux/iio/buffer-dma.h |
4179 | -header-test- += linux/iio/buffer_impl.h |
4180 | -header-test- += linux/iio/common/st_sensors.h |
4181 | -header-test- += linux/iio/common/st_sensors_i2c.h |
4182 | -header-test- += linux/iio/common/st_sensors_spi.h |
4183 | -header-test- += linux/iio/dac/ad5421.h |
4184 | -header-test- += linux/iio/dac/ad5504.h |
4185 | -header-test- += linux/iio/dac/ad5791.h |
4186 | -header-test- += linux/iio/dac/max517.h |
4187 | -header-test- += linux/iio/dac/mcp4725.h |
4188 | -header-test- += linux/iio/frequency/ad9523.h |
4189 | -header-test- += linux/iio/frequency/adf4350.h |
4190 | -header-test- += linux/iio/hw-consumer.h |
4191 | -header-test- += linux/iio/imu/adis.h |
4192 | -header-test- += linux/iio/sysfs.h |
4193 | -header-test- += linux/iio/timer/stm32-timer-trigger.h |
4194 | -header-test- += linux/iio/trigger.h |
4195 | -header-test- += linux/iio/triggered_event.h |
4196 | -header-test- += linux/imx-media.h |
4197 | -header-test- += linux/inet_diag.h |
4198 | -header-test- += linux/init_ohci1394_dma.h |
4199 | -header-test- += linux/initrd.h |
4200 | -header-test- += linux/input/adp5589.h |
4201 | -header-test- += linux/input/bu21013.h |
4202 | -header-test- += linux/input/cma3000.h |
4203 | -header-test- += linux/input/kxtj9.h |
4204 | -header-test- += linux/input/lm8333.h |
4205 | -header-test- += linux/input/sparse-keymap.h |
4206 | -header-test- += linux/input/touchscreen.h |
4207 | -header-test- += linux/input/tps6507x-ts.h |
4208 | -header-test-$(CONFIG_X86) += linux/intel-iommu.h |
4209 | -header-test- += linux/intel-ish-client-if.h |
4210 | -header-test- += linux/intel-pti.h |
4211 | -header-test- += linux/intel-svm.h |
4212 | -header-test- += linux/interconnect-provider.h |
4213 | -header-test- += linux/ioc3.h |
4214 | -header-test-$(CONFIG_BLOCK) += linux/iomap.h |
4215 | -header-test- += linux/ipack.h |
4216 | -header-test- += linux/irq_cpustat.h |
4217 | -header-test- += linux/irq_poll.h |
4218 | -header-test- += linux/irqchip/arm-gic-v3.h |
4219 | -header-test- += linux/irqchip/arm-gic-v4.h |
4220 | -header-test- += linux/irqchip/irq-madera.h |
4221 | -header-test- += linux/irqchip/irq-sa11x0.h |
4222 | -header-test- += linux/irqchip/mxs.h |
4223 | -header-test- += linux/irqchip/versatile-fpga.h |
4224 | -header-test- += linux/irqdesc.h |
4225 | -header-test- += linux/irqflags.h |
4226 | -header-test- += linux/iscsi_boot_sysfs.h |
4227 | -header-test- += linux/isdn/capiutil.h |
4228 | -header-test- += linux/isdn/hdlc.h |
4229 | -header-test- += linux/isdn_ppp.h |
4230 | -header-test- += linux/jbd2.h |
4231 | -header-test- += linux/jump_label.h |
4232 | -header-test- += linux/jump_label_ratelimit.h |
4233 | -header-test- += linux/jz4740-adc.h |
4234 | -header-test- += linux/kasan.h |
4235 | -header-test- += linux/kcore.h |
4236 | -header-test- += linux/kdev_t.h |
4237 | -header-test- += linux/kernelcapi.h |
4238 | -header-test- += linux/khugepaged.h |
4239 | -header-test- += linux/kobj_map.h |
4240 | -header-test- += linux/kobject_ns.h |
4241 | -header-test- += linux/kvm_host.h |
4242 | -header-test- += linux/kvm_irqfd.h |
4243 | -header-test- += linux/kvm_para.h |
4244 | -header-test- += linux/lantiq.h |
4245 | -header-test- += linux/lapb.h |
4246 | -header-test- += linux/latencytop.h |
4247 | -header-test- += linux/led-lm3530.h |
4248 | -header-test- += linux/leds-bd2802.h |
4249 | -header-test- += linux/leds-lp3944.h |
4250 | -header-test- += linux/leds-lp3952.h |
4251 | -header-test- += linux/leds_pwm.h |
4252 | -header-test- += linux/libata.h |
4253 | -header-test- += linux/license.h |
4254 | -header-test- += linux/lightnvm.h |
4255 | -header-test- += linux/lis3lv02d.h |
4256 | -header-test- += linux/list_bl.h |
4257 | -header-test- += linux/list_lru.h |
4258 | -header-test- += linux/list_nulls.h |
4259 | -header-test- += linux/lockd/share.h |
4260 | -header-test- += linux/lzo.h |
4261 | -header-test- += linux/mailbox/zynqmp-ipi-message.h |
4262 | -header-test- += linux/maple.h |
4263 | -header-test- += linux/mbcache.h |
4264 | -header-test- += linux/mbus.h |
4265 | -header-test- += linux/mc146818rtc.h |
4266 | -header-test- += linux/mc6821.h |
4267 | -header-test- += linux/mdev.h |
4268 | -header-test- += linux/mem_encrypt.h |
4269 | -header-test- += linux/memfd.h |
4270 | -header-test- += linux/mfd/88pm80x.h |
4271 | -header-test- += linux/mfd/88pm860x.h |
4272 | -header-test- += linux/mfd/abx500/ab8500-bm.h |
4273 | -header-test- += linux/mfd/abx500/ab8500-gpadc.h |
4274 | -header-test- += linux/mfd/adp5520.h |
4275 | -header-test- += linux/mfd/arizona/pdata.h |
4276 | -header-test- += linux/mfd/as3711.h |
4277 | -header-test- += linux/mfd/as3722.h |
4278 | -header-test- += linux/mfd/da903x.h |
4279 | -header-test- += linux/mfd/da9055/pdata.h |
4280 | -header-test- += linux/mfd/db8500-prcmu.h |
4281 | -header-test- += linux/mfd/dbx500-prcmu.h |
4282 | -header-test- += linux/mfd/dln2.h |
4283 | -header-test- += linux/mfd/dm355evm_msp.h |
4284 | -header-test- += linux/mfd/ds1wm.h |
4285 | -header-test- += linux/mfd/ezx-pcap.h |
4286 | -header-test- += linux/mfd/intel_msic.h |
4287 | -header-test- += linux/mfd/janz.h |
4288 | -header-test- += linux/mfd/kempld.h |
4289 | -header-test- += linux/mfd/lm3533.h |
4290 | -header-test- += linux/mfd/lp8788-isink.h |
4291 | -header-test- += linux/mfd/lpc_ich.h |
4292 | -header-test- += linux/mfd/max77693.h |
4293 | -header-test- += linux/mfd/max8998-private.h |
4294 | -header-test- += linux/mfd/menelaus.h |
4295 | -header-test- += linux/mfd/mt6397/core.h |
4296 | -header-test- += linux/mfd/palmas.h |
4297 | -header-test- += linux/mfd/pcf50633/backlight.h |
4298 | -header-test- += linux/mfd/rc5t583.h |
4299 | -header-test- += linux/mfd/retu.h |
4300 | -header-test- += linux/mfd/samsung/core.h |
4301 | -header-test- += linux/mfd/si476x-platform.h |
4302 | -header-test- += linux/mfd/si476x-reports.h |
4303 | -header-test- += linux/mfd/sky81452.h |
4304 | -header-test- += linux/mfd/smsc.h |
4305 | -header-test- += linux/mfd/sta2x11-mfd.h |
4306 | -header-test- += linux/mfd/stmfx.h |
4307 | -header-test- += linux/mfd/tc3589x.h |
4308 | -header-test- += linux/mfd/tc6387xb.h |
4309 | -header-test- += linux/mfd/tc6393xb.h |
4310 | -header-test- += linux/mfd/tps65090.h |
4311 | -header-test- += linux/mfd/tps6586x.h |
4312 | -header-test- += linux/mfd/tps65910.h |
4313 | -header-test- += linux/mfd/tps80031.h |
4314 | -header-test- += linux/mfd/ucb1x00.h |
4315 | -header-test- += linux/mfd/viperboard.h |
4316 | -header-test- += linux/mfd/wm831x/core.h |
4317 | -header-test- += linux/mfd/wm831x/otp.h |
4318 | -header-test- += linux/mfd/wm831x/pdata.h |
4319 | -header-test- += linux/mfd/wm8994/core.h |
4320 | -header-test- += linux/mfd/wm8994/pdata.h |
4321 | -header-test- += linux/mlx4/doorbell.h |
4322 | -header-test- += linux/mlx4/srq.h |
4323 | -header-test- += linux/mlx5/doorbell.h |
4324 | -header-test- += linux/mlx5/eq.h |
4325 | -header-test- += linux/mlx5/fs_helpers.h |
4326 | -header-test- += linux/mlx5/mlx5_ifc.h |
4327 | -header-test- += linux/mlx5/mlx5_ifc_fpga.h |
4328 | -header-test- += linux/mm-arch-hooks.h |
4329 | -header-test- += linux/mm_inline.h |
4330 | -header-test- += linux/mmu_context.h |
4331 | -header-test- += linux/mpage.h |
4332 | -header-test- += linux/mtd/bbm.h |
4333 | -header-test- += linux/mtd/cfi.h |
4334 | -header-test- += linux/mtd/doc2000.h |
4335 | -header-test- += linux/mtd/flashchip.h |
4336 | -header-test- += linux/mtd/ftl.h |
4337 | -header-test- += linux/mtd/gen_probe.h |
4338 | -header-test- += linux/mtd/jedec.h |
4339 | -header-test- += linux/mtd/nand_bch.h |
4340 | -header-test- += linux/mtd/nand_ecc.h |
4341 | -header-test- += linux/mtd/ndfc.h |
4342 | -header-test- += linux/mtd/onenand.h |
4343 | -header-test- += linux/mtd/pismo.h |
4344 | -header-test- += linux/mtd/plat-ram.h |
4345 | -header-test- += linux/mtd/spi-nor.h |
4346 | -header-test- += linux/mv643xx.h |
4347 | -header-test- += linux/mv643xx_eth.h |
4348 | -header-test- += linux/mvebu-pmsu.h |
4349 | -header-test- += linux/mxm-wmi.h |
4350 | -header-test- += linux/n_r3964.h |
4351 | -header-test- += linux/ndctl.h |
4352 | -header-test- += linux/nfs.h |
4353 | -header-test- += linux/nfs_fs_i.h |
4354 | -header-test- += linux/nfs_fs_sb.h |
4355 | -header-test- += linux/nfs_page.h |
4356 | -header-test- += linux/nfs_xdr.h |
4357 | -header-test- += linux/nfsacl.h |
4358 | -header-test- += linux/nl802154.h |
4359 | -header-test- += linux/ns_common.h |
4360 | -header-test- += linux/nsc_gpio.h |
4361 | -header-test- += linux/ntb_transport.h |
4362 | -header-test- += linux/nubus.h |
4363 | -header-test- += linux/nvme-fc-driver.h |
4364 | -header-test- += linux/nvme-fc.h |
4365 | -header-test- += linux/nvme-rdma.h |
4366 | -header-test- += linux/nvram.h |
4367 | -header-test- += linux/objagg.h |
4368 | -header-test- += linux/of_clk.h |
4369 | -header-test- += linux/of_net.h |
4370 | -header-test- += linux/of_pdt.h |
4371 | -header-test- += linux/olpc-ec.h |
4372 | -header-test- += linux/omap-dma.h |
4373 | -header-test- += linux/omap-dmaengine.h |
4374 | -header-test- += linux/omap-gpmc.h |
4375 | -header-test- += linux/omap-iommu.h |
4376 | -header-test- += linux/omap-mailbox.h |
4377 | -header-test- += linux/once.h |
4378 | -header-test- += linux/osq_lock.h |
4379 | -header-test- += linux/overflow.h |
4380 | -header-test- += linux/page-flags-layout.h |
4381 | -header-test- += linux/page-isolation.h |
4382 | -header-test- += linux/page_ext.h |
4383 | -header-test- += linux/page_owner.h |
4384 | -header-test- += linux/parport_pc.h |
4385 | -header-test- += linux/parser.h |
4386 | -header-test- += linux/pci-acpi.h |
4387 | -header-test- += linux/pci-dma-compat.h |
4388 | -header-test- += linux/pci_hotplug.h |
4389 | -header-test- += linux/pda_power.h |
4390 | -header-test- += linux/perf/arm_pmu.h |
4391 | -header-test- += linux/perf_regs.h |
4392 | -header-test- += linux/phy/omap_control_phy.h |
4393 | -header-test- += linux/phy/tegra/xusb.h |
4394 | -header-test- += linux/phy/ulpi_phy.h |
4395 | -header-test- += linux/phy_fixed.h |
4396 | -header-test- += linux/pipe_fs_i.h |
4397 | -header-test- += linux/pktcdvd.h |
4398 | -header-test- += linux/pl320-ipc.h |
4399 | -header-test- += linux/pl353-smc.h |
4400 | -header-test- += linux/platform_data/ad5449.h |
4401 | -header-test- += linux/platform_data/ad5755.h |
4402 | -header-test- += linux/platform_data/ad7266.h |
4403 | -header-test- += linux/platform_data/ad7291.h |
4404 | -header-test- += linux/platform_data/ad7298.h |
4405 | -header-test- += linux/platform_data/ad7303.h |
4406 | -header-test- += linux/platform_data/ad7791.h |
4407 | -header-test- += linux/platform_data/ad7793.h |
4408 | -header-test- += linux/platform_data/ad7887.h |
4409 | -header-test- += linux/platform_data/adau17x1.h |
4410 | -header-test- += linux/platform_data/adp8870.h |
4411 | -header-test- += linux/platform_data/ads1015.h |
4412 | -header-test- += linux/platform_data/ads7828.h |
4413 | -header-test- += linux/platform_data/apds990x.h |
4414 | -header-test- += linux/platform_data/arm-ux500-pm.h |
4415 | -header-test- += linux/platform_data/asoc-s3c.h |
4416 | -header-test- += linux/platform_data/at91_adc.h |
4417 | -header-test- += linux/platform_data/ata-pxa.h |
4418 | -header-test- += linux/platform_data/atmel.h |
4419 | -header-test- += linux/platform_data/bh1770glc.h |
4420 | -header-test- += linux/platform_data/brcmfmac.h |
4421 | -header-test- += linux/platform_data/cros_ec_commands.h |
4422 | -header-test- += linux/platform_data/clk-u300.h |
4423 | -header-test- += linux/platform_data/cyttsp4.h |
4424 | -header-test- += linux/platform_data/dma-coh901318.h |
4425 | -header-test- += linux/platform_data/dma-imx-sdma.h |
4426 | -header-test- += linux/platform_data/dma-mcf-edma.h |
4427 | -header-test- += linux/platform_data/dma-s3c24xx.h |
4428 | -header-test- += linux/platform_data/dmtimer-omap.h |
4429 | -header-test- += linux/platform_data/dsa.h |
4430 | -header-test- += linux/platform_data/edma.h |
4431 | -header-test- += linux/platform_data/elm.h |
4432 | -header-test- += linux/platform_data/emif_plat.h |
4433 | -header-test- += linux/platform_data/fsa9480.h |
4434 | -header-test- += linux/platform_data/g762.h |
4435 | -header-test- += linux/platform_data/gpio-ath79.h |
4436 | -header-test- += linux/platform_data/gpio-davinci.h |
4437 | -header-test- += linux/platform_data/gpio-dwapb.h |
4438 | -header-test- += linux/platform_data/gpio-htc-egpio.h |
4439 | -header-test- += linux/platform_data/gpmc-omap.h |
4440 | -header-test- += linux/platform_data/hsmmc-omap.h |
4441 | -header-test- += linux/platform_data/hwmon-s3c.h |
4442 | -header-test- += linux/platform_data/i2c-davinci.h |
4443 | -header-test- += linux/platform_data/i2c-imx.h |
4444 | -header-test- += linux/platform_data/i2c-mux-reg.h |
4445 | -header-test- += linux/platform_data/i2c-ocores.h |
4446 | -header-test- += linux/platform_data/i2c-xiic.h |
4447 | -header-test- += linux/platform_data/intel-spi.h |
4448 | -header-test- += linux/platform_data/invensense_mpu6050.h |
4449 | -header-test- += linux/platform_data/irda-pxaficp.h |
4450 | -header-test- += linux/platform_data/irda-sa11x0.h |
4451 | -header-test- += linux/platform_data/itco_wdt.h |
4452 | -header-test- += linux/platform_data/jz4740/jz4740_nand.h |
4453 | -header-test- += linux/platform_data/keyboard-pxa930_rotary.h |
4454 | -header-test- += linux/platform_data/keypad-omap.h |
4455 | -header-test- += linux/platform_data/leds-lp55xx.h |
4456 | -header-test- += linux/platform_data/leds-omap.h |
4457 | -header-test- += linux/platform_data/lp855x.h |
4458 | -header-test- += linux/platform_data/lp8727.h |
4459 | -header-test- += linux/platform_data/max197.h |
4460 | -header-test- += linux/platform_data/max3421-hcd.h |
4461 | -header-test- += linux/platform_data/max732x.h |
4462 | -header-test- += linux/platform_data/mcs.h |
4463 | -header-test- += linux/platform_data/mdio-bcm-unimac.h |
4464 | -header-test- += linux/platform_data/mdio-gpio.h |
4465 | -header-test- += linux/platform_data/media/si4713.h |
4466 | -header-test- += linux/platform_data/mlxreg.h |
4467 | -header-test- += linux/platform_data/mmc-omap.h |
4468 | -header-test- += linux/platform_data/mmc-sdhci-s3c.h |
4469 | -header-test- += linux/platform_data/mmp_audio.h |
4470 | -header-test- += linux/platform_data/mtd-orion_nand.h |
4471 | -header-test- += linux/platform_data/mv88e6xxx.h |
4472 | -header-test- += linux/platform_data/net-cw1200.h |
4473 | -header-test- += linux/platform_data/omap-twl4030.h |
4474 | -header-test- += linux/platform_data/omapdss.h |
4475 | -header-test- += linux/platform_data/pcf857x.h |
4476 | -header-test- += linux/platform_data/pixcir_i2c_ts.h |
4477 | -header-test- += linux/platform_data/pwm_omap_dmtimer.h |
4478 | -header-test- += linux/platform_data/pxa2xx_udc.h |
4479 | -header-test- += linux/platform_data/pxa_sdhci.h |
4480 | -header-test- += linux/platform_data/remoteproc-omap.h |
4481 | -header-test- += linux/platform_data/sa11x0-serial.h |
4482 | -header-test- += linux/platform_data/sc18is602.h |
4483 | -header-test- += linux/platform_data/sdhci-pic32.h |
4484 | -header-test- += linux/platform_data/serial-sccnxp.h |
4485 | -header-test- += linux/platform_data/sht3x.h |
4486 | -header-test- += linux/platform_data/shtc1.h |
4487 | -header-test- += linux/platform_data/si5351.h |
4488 | -header-test- += linux/platform_data/sky81452-backlight.h |
4489 | -header-test- += linux/platform_data/spi-davinci.h |
4490 | -header-test- += linux/platform_data/spi-ep93xx.h |
4491 | -header-test- += linux/platform_data/spi-mt65xx.h |
4492 | -header-test- += linux/platform_data/st_sensors_pdata.h |
4493 | -header-test- += linux/platform_data/ti-sysc.h |
4494 | -header-test- += linux/platform_data/timer-ixp4xx.h |
4495 | -header-test- += linux/platform_data/touchscreen-s3c2410.h |
4496 | -header-test- += linux/platform_data/tsc2007.h |
4497 | -header-test- += linux/platform_data/tsl2772.h |
4498 | -header-test- += linux/platform_data/uio_pruss.h |
4499 | -header-test- += linux/platform_data/usb-davinci.h |
4500 | -header-test- += linux/platform_data/usb-ehci-mxc.h |
4501 | -header-test- += linux/platform_data/usb-ehci-orion.h |
4502 | -header-test- += linux/platform_data/usb-mx2.h |
4503 | -header-test- += linux/platform_data/usb-ohci-s3c2410.h |
4504 | -header-test- += linux/platform_data/usb-omap.h |
4505 | -header-test- += linux/platform_data/usb-s3c2410_udc.h |
4506 | -header-test- += linux/platform_data/usb3503.h |
4507 | -header-test- += linux/platform_data/ux500_wdt.h |
4508 | -header-test- += linux/platform_data/video-clcd-versatile.h |
4509 | -header-test- += linux/platform_data/video-imxfb.h |
4510 | -header-test- += linux/platform_data/video-pxafb.h |
4511 | -header-test- += linux/platform_data/video_s3c.h |
4512 | -header-test- += linux/platform_data/voltage-omap.h |
4513 | -header-test- += linux/platform_data/x86/apple.h |
4514 | -header-test- += linux/platform_data/x86/clk-pmc-atom.h |
4515 | -header-test- += linux/platform_data/x86/pmc_atom.h |
4516 | -header-test- += linux/platform_data/xtalk-bridge.h |
4517 | -header-test- += linux/pm2301_charger.h |
4518 | -header-test- += linux/pm_wakeirq.h |
4519 | -header-test- += linux/pm_wakeup.h |
4520 | -header-test- += linux/pmbus.h |
4521 | -header-test- += linux/pmu.h |
4522 | -header-test- += linux/posix_acl.h |
4523 | -header-test- += linux/posix_acl_xattr.h |
4524 | -header-test- += linux/power/ab8500.h |
4525 | -header-test- += linux/power/bq27xxx_battery.h |
4526 | -header-test- += linux/power/generic-adc-battery.h |
4527 | -header-test- += linux/power/jz4740-battery.h |
4528 | -header-test- += linux/power/max17042_battery.h |
4529 | -header-test- += linux/power/max8903_charger.h |
4530 | -header-test- += linux/ppp-comp.h |
4531 | -header-test- += linux/pps-gpio.h |
4532 | -header-test- += linux/pr.h |
4533 | -header-test- += linux/proc_ns.h |
4534 | -header-test- += linux/processor.h |
4535 | -header-test- += linux/psi.h |
4536 | -header-test- += linux/psp-sev.h |
4537 | -header-test- += linux/pstore.h |
4538 | -header-test- += linux/ptr_ring.h |
4539 | -header-test- += linux/ptrace.h |
4540 | -header-test- += linux/qcom-geni-se.h |
4541 | -header-test- += linux/qed/eth_common.h |
4542 | -header-test- += linux/qed/fcoe_common.h |
4543 | -header-test- += linux/qed/iscsi_common.h |
4544 | -header-test- += linux/qed/iwarp_common.h |
4545 | -header-test- += linux/qed/qed_eth_if.h |
4546 | -header-test- += linux/qed/qed_fcoe_if.h |
4547 | -header-test- += linux/qed/rdma_common.h |
4548 | -header-test- += linux/qed/storage_common.h |
4549 | -header-test- += linux/qed/tcp_common.h |
4550 | -header-test- += linux/qnx6_fs.h |
4551 | -header-test- += linux/quicklist.h |
4552 | -header-test- += linux/ramfs.h |
4553 | -header-test- += linux/range.h |
4554 | -header-test- += linux/rcu_node_tree.h |
4555 | -header-test- += linux/rculist_bl.h |
4556 | -header-test- += linux/rculist_nulls.h |
4557 | -header-test- += linux/rcutiny.h |
4558 | -header-test- += linux/rcutree.h |
4559 | -header-test- += linux/reboot-mode.h |
4560 | -header-test- += linux/regulator/fixed.h |
4561 | -header-test- += linux/regulator/gpio-regulator.h |
4562 | -header-test- += linux/regulator/max8973-regulator.h |
4563 | -header-test- += linux/regulator/of_regulator.h |
4564 | -header-test- += linux/regulator/tps51632-regulator.h |
4565 | -header-test- += linux/regulator/tps62360.h |
4566 | -header-test- += linux/regulator/tps6507x.h |
4567 | -header-test- += linux/regulator/userspace-consumer.h |
4568 | -header-test- += linux/remoteproc/st_slim_rproc.h |
4569 | -header-test- += linux/reset/socfpga.h |
4570 | -header-test- += linux/reset/sunxi.h |
4571 | -header-test- += linux/rtc/m48t59.h |
4572 | -header-test- += linux/rtc/rtc-omap.h |
4573 | -header-test- += linux/rtc/sirfsoc_rtciobrg.h |
4574 | -header-test- += linux/rwlock.h |
4575 | -header-test- += linux/rwlock_types.h |
4576 | -header-test- += linux/scc.h |
4577 | -header-test- += linux/sched/deadline.h |
4578 | -header-test- += linux/sched/smt.h |
4579 | -header-test- += linux/sched/sysctl.h |
4580 | -header-test- += linux/sched_clock.h |
4581 | -header-test- += linux/scpi_protocol.h |
4582 | -header-test- += linux/scx200_gpio.h |
4583 | -header-test- += linux/seccomp.h |
4584 | -header-test- += linux/sed-opal.h |
4585 | -header-test- += linux/seg6_iptunnel.h |
4586 | -header-test- += linux/selection.h |
4587 | -header-test- += linux/set_memory.h |
4588 | -header-test- += linux/shrinker.h |
4589 | -header-test- += linux/sirfsoc_dma.h |
4590 | -header-test- += linux/skb_array.h |
4591 | -header-test- += linux/slab_def.h |
4592 | -header-test- += linux/slub_def.h |
4593 | -header-test- += linux/sm501.h |
4594 | -header-test- += linux/smc91x.h |
4595 | -header-test- += linux/static_key.h |
4596 | -header-test- += linux/soc/actions/owl-sps.h |
4597 | -header-test- += linux/soc/amlogic/meson-canvas.h |
4598 | -header-test- += linux/soc/brcmstb/brcmstb.h |
4599 | -header-test- += linux/soc/ixp4xx/npe.h |
4600 | -header-test- += linux/soc/mediatek/infracfg.h |
4601 | -header-test- += linux/soc/qcom/smd-rpm.h |
4602 | -header-test- += linux/soc/qcom/smem.h |
4603 | -header-test- += linux/soc/qcom/smem_state.h |
4604 | -header-test- += linux/soc/qcom/wcnss_ctrl.h |
4605 | -header-test- += linux/soc/renesas/rcar-rst.h |
4606 | -header-test- += linux/soc/samsung/exynos-pmu.h |
4607 | -header-test- += linux/soc/sunxi/sunxi_sram.h |
4608 | -header-test- += linux/soc/ti/ti-msgmgr.h |
4609 | -header-test- += linux/soc/ti/ti_sci_inta_msi.h |
4610 | -header-test- += linux/soc/ti/ti_sci_protocol.h |
4611 | -header-test- += linux/soundwire/sdw.h |
4612 | -header-test- += linux/soundwire/sdw_intel.h |
4613 | -header-test- += linux/soundwire/sdw_type.h |
4614 | -header-test- += linux/spi/ad7877.h |
4615 | -header-test- += linux/spi/ads7846.h |
4616 | -header-test- += linux/spi/at86rf230.h |
4617 | -header-test- += linux/spi/ds1305.h |
4618 | -header-test- += linux/spi/libertas_spi.h |
4619 | -header-test- += linux/spi/lms283gf05.h |
4620 | -header-test- += linux/spi/max7301.h |
4621 | -header-test- += linux/spi/mcp23s08.h |
4622 | -header-test- += linux/spi/rspi.h |
4623 | -header-test- += linux/spi/s3c24xx.h |
4624 | -header-test- += linux/spi/sh_msiof.h |
4625 | -header-test- += linux/spi/spi-fsl-dspi.h |
4626 | -header-test- += linux/spi/spi_bitbang.h |
4627 | -header-test- += linux/spi/spi_gpio.h |
4628 | -header-test- += linux/spi/xilinx_spi.h |
4629 | -header-test- += linux/spinlock_api_smp.h |
4630 | -header-test- += linux/spinlock_api_up.h |
4631 | -header-test- += linux/spinlock_types.h |
4632 | -header-test- += linux/splice.h |
4633 | -header-test- += linux/sram.h |
4634 | -header-test- += linux/srcutiny.h |
4635 | -header-test- += linux/srcutree.h |
4636 | -header-test- += linux/ssb/ssb_driver_chipcommon.h |
4637 | -header-test- += linux/ssb/ssb_driver_extif.h |
4638 | -header-test- += linux/ssb/ssb_driver_mips.h |
4639 | -header-test- += linux/ssb/ssb_driver_pci.h |
4640 | -header-test- += linux/ssbi.h |
4641 | -header-test- += linux/stackdepot.h |
4642 | -header-test- += linux/stmp3xxx_rtc_wdt.h |
4643 | -header-test- += linux/string_helpers.h |
4644 | -header-test- += linux/sungem_phy.h |
4645 | -header-test- += linux/sunrpc/msg_prot.h |
4646 | -header-test- += linux/sunrpc/rpc_pipe_fs.h |
4647 | -header-test- += linux/sunrpc/xprtmultipath.h |
4648 | -header-test- += linux/sunrpc/xprtsock.h |
4649 | -header-test- += linux/sunxi-rsb.h |
4650 | -header-test- += linux/svga.h |
4651 | -header-test- += linux/sw842.h |
4652 | -header-test- += linux/swapfile.h |
4653 | -header-test- += linux/swapops.h |
4654 | -header-test- += linux/swiotlb.h |
4655 | -header-test- += linux/sysv_fs.h |
4656 | -header-test- += linux/t10-pi.h |
4657 | -header-test- += linux/task_io_accounting.h |
4658 | -header-test- += linux/tick.h |
4659 | -header-test- += linux/timb_dma.h |
4660 | -header-test- += linux/timekeeping.h |
4661 | -header-test- += linux/timekeeping32.h |
4662 | -header-test- += linux/ts-nbus.h |
4663 | -header-test- += linux/tsacct_kern.h |
4664 | -header-test- += linux/tty_flip.h |
4665 | -header-test- += linux/tty_ldisc.h |
4666 | -header-test- += linux/ucb1400.h |
4667 | -header-test- += linux/usb/association.h |
4668 | -header-test- += linux/usb/cdc-wdm.h |
4669 | -header-test- += linux/usb/cdc_ncm.h |
4670 | -header-test- += linux/usb/ezusb.h |
4671 | -header-test- += linux/usb/gadget_configfs.h |
4672 | -header-test- += linux/usb/gpio_vbus.h |
4673 | -header-test- += linux/usb/hcd.h |
4674 | -header-test- += linux/usb/iowarrior.h |
4675 | -header-test- += linux/usb/irda.h |
4676 | -header-test- += linux/usb/isp116x.h |
4677 | -header-test- += linux/usb/isp1362.h |
4678 | -header-test- += linux/usb/musb.h |
4679 | -header-test- += linux/usb/net2280.h |
4680 | -header-test- += linux/usb/ohci_pdriver.h |
4681 | -header-test- += linux/usb/otg-fsm.h |
4682 | -header-test- += linux/usb/pd_ado.h |
4683 | -header-test- += linux/usb/r8a66597.h |
4684 | -header-test- += linux/usb/rndis_host.h |
4685 | -header-test- += linux/usb/serial.h |
4686 | -header-test- += linux/usb/sl811.h |
4687 | -header-test- += linux/usb/storage.h |
4688 | -header-test- += linux/usb/uas.h |
4689 | -header-test- += linux/usb/usb338x.h |
4690 | -header-test- += linux/usb/usbnet.h |
4691 | -header-test- += linux/usb/wusb-wa.h |
4692 | -header-test- += linux/usb/xhci-dbgp.h |
4693 | -header-test- += linux/usb_usual.h |
4694 | -header-test- += linux/user-return-notifier.h |
4695 | -header-test- += linux/userfaultfd_k.h |
4696 | -header-test- += linux/verification.h |
4697 | -header-test- += linux/vgaarb.h |
4698 | -header-test- += linux/via_core.h |
4699 | -header-test- += linux/via_i2c.h |
4700 | -header-test- += linux/virtio_byteorder.h |
4701 | -header-test- += linux/virtio_ring.h |
4702 | -header-test- += linux/visorbus.h |
4703 | -header-test- += linux/vme.h |
4704 | -header-test- += linux/vmstat.h |
4705 | -header-test- += linux/vmw_vmci_api.h |
4706 | -header-test- += linux/vmw_vmci_defs.h |
4707 | -header-test- += linux/vringh.h |
4708 | -header-test- += linux/vt_buffer.h |
4709 | -header-test- += linux/zorro.h |
4710 | -header-test- += linux/zpool.h |
4711 | -header-test- += math-emu/double.h |
4712 | -header-test- += math-emu/op-common.h |
4713 | -header-test- += math-emu/quad.h |
4714 | -header-test- += math-emu/single.h |
4715 | -header-test- += math-emu/soft-fp.h |
4716 | -header-test- += media/davinci/dm355_ccdc.h |
4717 | -header-test- += media/davinci/dm644x_ccdc.h |
4718 | -header-test- += media/davinci/isif.h |
4719 | -header-test- += media/davinci/vpbe_osd.h |
4720 | -header-test- += media/davinci/vpbe_types.h |
4721 | -header-test- += media/davinci/vpif_types.h |
4722 | -header-test- += media/demux.h |
4723 | -header-test- += media/drv-intf/soc_mediabus.h |
4724 | -header-test- += media/dvb_net.h |
4725 | -header-test- += media/fwht-ctrls.h |
4726 | -header-test- += media/i2c/ad9389b.h |
4727 | -header-test- += media/i2c/adv7343.h |
4728 | -header-test- += media/i2c/adv7511.h |
4729 | -header-test- += media/i2c/adv7842.h |
4730 | -header-test- += media/i2c/m5mols.h |
4731 | -header-test- += media/i2c/mt9m032.h |
4732 | -header-test- += media/i2c/mt9t112.h |
4733 | -header-test- += media/i2c/mt9v032.h |
4734 | -header-test- += media/i2c/ov2659.h |
4735 | -header-test- += media/i2c/ov7670.h |
4736 | -header-test- += media/i2c/rj54n1cb0c.h |
4737 | -header-test- += media/i2c/saa6588.h |
4738 | -header-test- += media/i2c/saa7115.h |
4739 | -header-test- += media/i2c/sr030pc30.h |
4740 | -header-test- += media/i2c/tc358743.h |
4741 | -header-test- += media/i2c/tda1997x.h |
4742 | -header-test- += media/i2c/ths7303.h |
4743 | -header-test- += media/i2c/tvaudio.h |
4744 | -header-test- += media/i2c/tvp514x.h |
4745 | -header-test- += media/i2c/tvp7002.h |
4746 | -header-test- += media/i2c/wm8775.h |
4747 | -header-test- += media/imx.h |
4748 | -header-test- += media/media-dev-allocator.h |
4749 | -header-test- += media/mpeg2-ctrls.h |
4750 | -header-test- += media/rcar-fcp.h |
4751 | -header-test- += media/tuner-types.h |
4752 | -header-test- += media/tveeprom.h |
4753 | -header-test- += media/v4l2-flash-led-class.h |
4754 | -header-test- += misc/altera.h |
4755 | -header-test- += misc/cxl-base.h |
4756 | -header-test- += misc/cxllib.h |
4757 | -header-test- += net/9p/9p.h |
4758 | -header-test- += net/9p/client.h |
4759 | -header-test- += net/9p/transport.h |
4760 | -header-test- += net/af_vsock.h |
4761 | -header-test- += net/ax88796.h |
4762 | -header-test- += net/bluetooth/hci.h |
4763 | -header-test- += net/bluetooth/hci_core.h |
4764 | -header-test- += net/bluetooth/hci_mon.h |
4765 | -header-test- += net/bluetooth/hci_sock.h |
4766 | -header-test- += net/bluetooth/l2cap.h |
4767 | -header-test- += net/bluetooth/mgmt.h |
4768 | -header-test- += net/bluetooth/rfcomm.h |
4769 | -header-test- += net/bluetooth/sco.h |
4770 | -header-test- += net/bond_options.h |
4771 | -header-test- += net/caif/cfsrvl.h |
4772 | -header-test- += net/codel_impl.h |
4773 | -header-test- += net/codel_qdisc.h |
4774 | -header-test- += net/compat.h |
4775 | -header-test- += net/datalink.h |
4776 | -header-test- += net/dcbevent.h |
4777 | -header-test- += net/dcbnl.h |
4778 | -header-test- += net/dn_dev.h |
4779 | -header-test- += net/dn_fib.h |
4780 | -header-test- += net/dn_neigh.h |
4781 | -header-test- += net/dn_nsp.h |
4782 | -header-test- += net/dn_route.h |
4783 | -header-test- += net/erspan.h |
4784 | -header-test- += net/esp.h |
4785 | -header-test- += net/ethoc.h |
4786 | -header-test- += net/firewire.h |
4787 | -header-test- += net/flow_offload.h |
4788 | -header-test- += net/fq.h |
4789 | -header-test- += net/fq_impl.h |
4790 | -header-test- += net/garp.h |
4791 | -header-test- += net/gtp.h |
4792 | -header-test- += net/gue.h |
4793 | -header-test- += net/hwbm.h |
4794 | -header-test- += net/ila.h |
4795 | -header-test- += net/inet6_connection_sock.h |
4796 | -header-test- += net/inet_common.h |
4797 | -header-test- += net/inet_frag.h |
4798 | -header-test- += net/ip6_route.h |
4799 | -header-test- += net/ip_vs.h |
4800 | -header-test- += net/ipcomp.h |
4801 | -header-test- += net/ipconfig.h |
4802 | -header-test- += net/iucv/af_iucv.h |
4803 | -header-test- += net/iucv/iucv.h |
4804 | -header-test- += net/lapb.h |
4805 | -header-test- += net/llc_c_ac.h |
4806 | -header-test- += net/llc_c_st.h |
4807 | -header-test- += net/llc_s_ac.h |
4808 | -header-test- += net/llc_s_ev.h |
4809 | -header-test- += net/llc_s_st.h |
4810 | -header-test- += net/mpls_iptunnel.h |
4811 | -header-test- += net/mrp.h |
4812 | -header-test- += net/ncsi.h |
4813 | -header-test- += net/netevent.h |
4814 | -header-test- += net/netns/can.h |
4815 | -header-test- += net/netns/generic.h |
4816 | -header-test- += net/netns/ieee802154_6lowpan.h |
4817 | -header-test- += net/netns/ipv4.h |
4818 | -header-test- += net/netns/ipv6.h |
4819 | -header-test- += net/netns/mpls.h |
4820 | -header-test- += net/netns/nftables.h |
4821 | -header-test- += net/netns/sctp.h |
4822 | -header-test- += net/netrom.h |
4823 | -header-test- += net/p8022.h |
4824 | -header-test- += net/phonet/pep.h |
4825 | -header-test- += net/phonet/phonet.h |
4826 | -header-test- += net/phonet/pn_dev.h |
4827 | -header-test- += net/pptp.h |
4828 | -header-test- += net/psample.h |
4829 | -header-test- += net/psnap.h |
4830 | -header-test- += net/regulatory.h |
4831 | -header-test- += net/rose.h |
4832 | -header-test- += net/sctp/auth.h |
4833 | -header-test- += net/sctp/stream_interleave.h |
4834 | -header-test- += net/sctp/stream_sched.h |
4835 | -header-test- += net/sctp/tsnmap.h |
4836 | -header-test- += net/sctp/ulpevent.h |
4837 | -header-test- += net/sctp/ulpqueue.h |
4838 | -header-test- += net/secure_seq.h |
4839 | -header-test- += net/smc.h |
4840 | -header-test- += net/stp.h |
4841 | -header-test- += net/transp_v6.h |
4842 | -header-test- += net/tun_proto.h |
4843 | -header-test- += net/udplite.h |
4844 | -header-test- += net/xdp.h |
4845 | -header-test- += net/xdp_priv.h |
4846 | -header-test- += pcmcia/cistpl.h |
4847 | -header-test- += pcmcia/ds.h |
4848 | -header-test- += rdma/tid_rdma_defs.h |
4849 | -header-test- += scsi/fc/fc_encaps.h |
4850 | -header-test- += scsi/fc/fc_fc2.h |
4851 | -header-test- += scsi/fc/fc_fcoe.h |
4852 | -header-test- += scsi/fc/fc_fip.h |
4853 | -header-test- += scsi/fc_encode.h |
4854 | -header-test- += scsi/fc_frame.h |
4855 | -header-test- += scsi/iser.h |
4856 | -header-test- += scsi/libfc.h |
4857 | -header-test- += scsi/libfcoe.h |
4858 | -header-test- += scsi/libsas.h |
4859 | -header-test- += scsi/sas_ata.h |
4860 | -header-test- += scsi/scsi_cmnd.h |
4861 | -header-test- += scsi/scsi_dbg.h |
4862 | -header-test- += scsi/scsi_device.h |
4863 | -header-test- += scsi/scsi_dh.h |
4864 | -header-test- += scsi/scsi_eh.h |
4865 | -header-test- += scsi/scsi_host.h |
4866 | -header-test- += scsi/scsi_ioctl.h |
4867 | -header-test- += scsi/scsi_request.h |
4868 | -header-test- += scsi/scsi_tcq.h |
4869 | -header-test- += scsi/scsi_transport.h |
4870 | -header-test- += scsi/scsi_transport_fc.h |
4871 | -header-test- += scsi/scsi_transport_sas.h |
4872 | -header-test- += scsi/scsi_transport_spi.h |
4873 | -header-test- += scsi/scsi_transport_srp.h |
4874 | -header-test- += scsi/scsicam.h |
4875 | -header-test- += scsi/sg.h |
4876 | -header-test- += soc/arc/aux.h |
4877 | -header-test- += soc/arc/mcip.h |
4878 | -header-test- += soc/arc/timers.h |
4879 | -header-test- += soc/brcmstb/common.h |
4880 | -header-test- += soc/fsl/bman.h |
4881 | -header-test- += soc/fsl/qe/qe.h |
4882 | -header-test- += soc/fsl/qe/qe_ic.h |
4883 | -header-test- += soc/fsl/qe/qe_tdm.h |
4884 | -header-test- += soc/fsl/qe/ucc.h |
4885 | -header-test- += soc/fsl/qe/ucc_fast.h |
4886 | -header-test- += soc/fsl/qe/ucc_slow.h |
4887 | -header-test- += soc/fsl/qman.h |
4888 | -header-test- += soc/nps/common.h |
4889 | -header-test-$(CONFIG_ARC) += soc/nps/mtm.h |
4890 | -header-test- += soc/qcom/cmd-db.h |
4891 | -header-test- += soc/qcom/rpmh.h |
4892 | -header-test- += soc/qcom/tcs.h |
4893 | -header-test- += soc/tegra/ahb.h |
4894 | -header-test- += soc/tegra/bpmp-abi.h |
4895 | -header-test- += soc/tegra/common.h |
4896 | -header-test- += soc/tegra/flowctrl.h |
4897 | -header-test- += soc/tegra/fuse.h |
4898 | -header-test- += soc/tegra/mc.h |
4899 | -header-test- += sound/ac97/compat.h |
4900 | -header-test- += sound/aci.h |
4901 | -header-test- += sound/ad1843.h |
4902 | -header-test- += sound/adau1373.h |
4903 | -header-test- += sound/ak4113.h |
4904 | -header-test- += sound/ak4114.h |
4905 | -header-test- += sound/ak4117.h |
4906 | -header-test- += sound/cs35l33.h |
4907 | -header-test- += sound/cs35l34.h |
4908 | -header-test- += sound/cs35l35.h |
4909 | -header-test- += sound/cs35l36.h |
4910 | -header-test- += sound/cs4271.h |
4911 | -header-test- += sound/cs42l52.h |
4912 | -header-test- += sound/cs8427.h |
4913 | -header-test- += sound/da7218.h |
4914 | -header-test- += sound/da7219-aad.h |
4915 | -header-test- += sound/da7219.h |
4916 | -header-test- += sound/da9055.h |
4917 | -header-test- += sound/emu8000.h |
4918 | -header-test- += sound/emux_synth.h |
4919 | -header-test- += sound/hda_component.h |
4920 | -header-test- += sound/hda_hwdep.h |
4921 | -header-test- += sound/hda_i915.h |
4922 | -header-test- += sound/hwdep.h |
4923 | -header-test- += sound/i2c.h |
4924 | -header-test- += sound/l3.h |
4925 | -header-test- += sound/max98088.h |
4926 | -header-test- += sound/max98095.h |
4927 | -header-test- += sound/mixer_oss.h |
4928 | -header-test- += sound/omap-hdmi-audio.h |
4929 | -header-test- += sound/pcm_drm_eld.h |
4930 | -header-test- += sound/pcm_iec958.h |
4931 | -header-test- += sound/pcm_oss.h |
4932 | -header-test- += sound/pxa2xx-lib.h |
4933 | -header-test- += sound/rt286.h |
4934 | -header-test- += sound/rt298.h |
4935 | -header-test- += sound/rt5645.h |
4936 | -header-test- += sound/rt5659.h |
4937 | -header-test- += sound/rt5660.h |
4938 | -header-test- += sound/rt5665.h |
4939 | -header-test- += sound/rt5670.h |
4940 | -header-test- += sound/s3c24xx_uda134x.h |
4941 | -header-test- += sound/seq_device.h |
4942 | -header-test- += sound/seq_kernel.h |
4943 | -header-test- += sound/seq_midi_emul.h |
4944 | -header-test- += sound/seq_oss.h |
4945 | -header-test- += sound/soc-acpi-intel-match.h |
4946 | -header-test- += sound/soc-dai.h |
4947 | -header-test- += sound/soc-dapm.h |
4948 | -header-test- += sound/soc-dpcm.h |
4949 | -header-test- += sound/sof/control.h |
4950 | -header-test- += sound/sof/dai-intel.h |
4951 | -header-test- += sound/sof/dai.h |
4952 | -header-test- += sound/sof/header.h |
4953 | -header-test- += sound/sof/info.h |
4954 | -header-test- += sound/sof/pm.h |
4955 | -header-test- += sound/sof/stream.h |
4956 | -header-test- += sound/sof/topology.h |
4957 | -header-test- += sound/sof/trace.h |
4958 | -header-test- += sound/sof/xtensa.h |
4959 | -header-test- += sound/spear_spdif.h |
4960 | -header-test- += sound/sta32x.h |
4961 | -header-test- += sound/sta350.h |
4962 | -header-test- += sound/tea6330t.h |
4963 | -header-test- += sound/tlv320aic32x4.h |
4964 | -header-test- += sound/tlv320dac33-plat.h |
4965 | -header-test- += sound/uda134x.h |
4966 | -header-test- += sound/wavefront.h |
4967 | -header-test- += sound/wm8903.h |
4968 | -header-test- += sound/wm8904.h |
4969 | -header-test- += sound/wm8960.h |
4970 | -header-test- += sound/wm8962.h |
4971 | -header-test- += sound/wm8993.h |
4972 | -header-test- += sound/wm8996.h |
4973 | -header-test- += sound/wm9081.h |
4974 | -header-test- += sound/wm9090.h |
4975 | -header-test- += target/iscsi/iscsi_target_stat.h |
4976 | -header-test- += trace/bpf_probe.h |
4977 | -header-test- += trace/events/9p.h |
4978 | -header-test- += trace/events/afs.h |
4979 | -header-test- += trace/events/asoc.h |
4980 | -header-test- += trace/events/bcache.h |
4981 | -header-test- += trace/events/block.h |
4982 | -header-test- += trace/events/cachefiles.h |
4983 | -header-test- += trace/events/cgroup.h |
4984 | -header-test- += trace/events/clk.h |
4985 | -header-test- += trace/events/cma.h |
4986 | -header-test- += trace/events/ext4.h |
4987 | -header-test- += trace/events/f2fs.h |
4988 | -header-test- += trace/events/fs_dax.h |
4989 | -header-test- += trace/events/fscache.h |
4990 | -header-test- += trace/events/fsi.h |
4991 | -header-test- += trace/events/fsi_master_ast_cf.h |
4992 | -header-test- += trace/events/fsi_master_gpio.h |
4993 | -header-test- += trace/events/huge_memory.h |
4994 | -header-test- += trace/events/ib_mad.h |
4995 | -header-test- += trace/events/ib_umad.h |
4996 | -header-test- += trace/events/iscsi.h |
4997 | -header-test- += trace/events/jbd2.h |
4998 | -header-test- += trace/events/kvm.h |
4999 | -header-test- += trace/events/kyber.h |
5000 | -header-test- += trace/events/libata.h |
5001 | -header-test- += trace/events/mce.h |
5002 | -header-test- += trace/events/mdio.h |
5003 | -header-test- += trace/events/migrate.h |
5004 | -header-test- += trace/events/mmflags.h |
5005 | -header-test- += trace/events/nbd.h |
5006 | -header-test- += trace/events/nilfs2.h |
5007 | -header-test- += trace/events/pwc.h |
5008 | -header-test- += trace/events/rdma.h |
5009 | -header-test- += trace/events/rpcgss.h |
5010 | -header-test- += trace/events/rpcrdma.h |
5011 | -header-test- += trace/events/rxrpc.h |
5012 | -header-test- += trace/events/scsi.h |
5013 | -header-test- += trace/events/siox.h |
5014 | -header-test- += trace/events/spi.h |
5015 | -header-test- += trace/events/swiotlb.h |
5016 | -header-test- += trace/events/syscalls.h |
5017 | -header-test- += trace/events/target.h |
5018 | -header-test- += trace/events/thermal_power_allocator.h |
5019 | -header-test- += trace/events/timer.h |
5020 | -header-test- += trace/events/wbt.h |
5021 | -header-test- += trace/events/xen.h |
5022 | -header-test- += trace/perf.h |
5023 | -header-test- += trace/trace_events.h |
5024 | -header-test- += uapi/drm/vmwgfx_drm.h |
5025 | -header-test- += uapi/linux/a.out.h |
5026 | -header-test- += uapi/linux/coda.h |
5027 | -header-test- += uapi/linux/coda_psdev.h |
5028 | -header-test- += uapi/linux/errqueue.h |
5029 | -header-test- += uapi/linux/eventpoll.h |
5030 | -header-test- += uapi/linux/hdlc/ioctl.h |
5031 | -header-test- += uapi/linux/input.h |
5032 | -header-test- += uapi/linux/kvm.h |
5033 | -header-test- += uapi/linux/kvm_para.h |
5034 | -header-test- += uapi/linux/lightnvm.h |
5035 | -header-test- += uapi/linux/mic_common.h |
5036 | -header-test- += uapi/linux/mman.h |
5037 | -header-test- += uapi/linux/nilfs2_ondisk.h |
5038 | -header-test- += uapi/linux/patchkey.h |
5039 | -header-test- += uapi/linux/ptrace.h |
5040 | -header-test- += uapi/linux/scc.h |
5041 | -header-test- += uapi/linux/seg6_iptunnel.h |
5042 | -header-test- += uapi/linux/smc_diag.h |
5043 | -header-test- += uapi/linux/timex.h |
5044 | -header-test- += uapi/linux/videodev2.h |
5045 | -header-test- += uapi/scsi/scsi_bsg_fc.h |
5046 | -header-test- += uapi/sound/asound.h |
5047 | -header-test- += uapi/sound/sof/eq.h |
5048 | -header-test- += uapi/sound/sof/fw.h |
5049 | -header-test- += uapi/sound/sof/header.h |
5050 | -header-test- += uapi/sound/sof/manifest.h |
5051 | -header-test- += uapi/sound/sof/trace.h |
5052 | -header-test- += uapi/xen/evtchn.h |
5053 | -header-test- += uapi/xen/gntdev.h |
5054 | -header-test- += uapi/xen/privcmd.h |
5055 | -header-test- += vdso/vsyscall.h |
5056 | -header-test- += video/broadsheetfb.h |
5057 | -header-test- += video/cvisionppc.h |
5058 | -header-test- += video/gbe.h |
5059 | -header-test- += video/kyro.h |
5060 | -header-test- += video/maxinefb.h |
5061 | -header-test- += video/metronomefb.h |
5062 | -header-test- += video/neomagic.h |
5063 | -header-test- += video/of_display_timing.h |
5064 | -header-test- += video/omapvrfb.h |
5065 | -header-test- += video/s1d13xxxfb.h |
5066 | -header-test- += video/sstfb.h |
5067 | -header-test- += video/tgafb.h |
5068 | -header-test- += video/udlfb.h |
5069 | -header-test- += video/uvesafb.h |
5070 | -header-test- += video/vga.h |
5071 | -header-test- += video/w100fb.h |
5072 | -header-test- += xen/acpi.h |
5073 | -header-test- += xen/arm/hypercall.h |
5074 | -header-test- += xen/arm/page-coherent.h |
5075 | -header-test- += xen/arm/page.h |
5076 | -header-test- += xen/balloon.h |
5077 | -header-test- += xen/events.h |
5078 | -header-test- += xen/features.h |
5079 | -header-test- += xen/grant_table.h |
5080 | -header-test- += xen/hvm.h |
5081 | -header-test- += xen/interface/callback.h |
5082 | -header-test- += xen/interface/event_channel.h |
5083 | -header-test- += xen/interface/grant_table.h |
5084 | -header-test- += xen/interface/hvm/dm_op.h |
5085 | -header-test- += xen/interface/hvm/hvm_op.h |
5086 | -header-test- += xen/interface/hvm/hvm_vcpu.h |
5087 | -header-test- += xen/interface/hvm/params.h |
5088 | -header-test- += xen/interface/hvm/start_info.h |
5089 | -header-test- += xen/interface/io/9pfs.h |
5090 | -header-test- += xen/interface/io/blkif.h |
5091 | -header-test- += xen/interface/io/console.h |
5092 | -header-test- += xen/interface/io/displif.h |
5093 | -header-test- += xen/interface/io/fbif.h |
5094 | -header-test- += xen/interface/io/kbdif.h |
5095 | -header-test- += xen/interface/io/netif.h |
5096 | -header-test- += xen/interface/io/pciif.h |
5097 | -header-test- += xen/interface/io/protocols.h |
5098 | -header-test- += xen/interface/io/pvcalls.h |
5099 | -header-test- += xen/interface/io/ring.h |
5100 | -header-test- += xen/interface/io/sndif.h |
5101 | -header-test- += xen/interface/io/tpmif.h |
5102 | -header-test- += xen/interface/io/vscsiif.h |
5103 | -header-test- += xen/interface/io/xs_wire.h |
5104 | -header-test- += xen/interface/memory.h |
5105 | -header-test- += xen/interface/nmi.h |
5106 | -header-test- += xen/interface/physdev.h |
5107 | -header-test- += xen/interface/platform.h |
5108 | -header-test- += xen/interface/sched.h |
5109 | -header-test- += xen/interface/vcpu.h |
5110 | -header-test- += xen/interface/version.h |
5111 | -header-test- += xen/interface/xen-mca.h |
5112 | -header-test- += xen/interface/xen.h |
5113 | -header-test- += xen/interface/xenpmu.h |
5114 | -header-test- += xen/mem-reservation.h |
5115 | -header-test- += xen/page.h |
5116 | -header-test- += xen/platform_pci.h |
5117 | -header-test- += xen/swiotlb-xen.h |
5118 | -header-test- += xen/xen-front-pgdir-shbuf.h |
5119 | -header-test- += xen/xen-ops.h |
5120 | -header-test- += xen/xen.h |
5121 | -header-test- += xen/xenbus.h |
5122 | - |
5123 | -# Do not include directly |
5124 | -header-test- += linux/compiler-clang.h |
5125 | -header-test- += linux/compiler-gcc.h |
5126 | -header-test- += linux/patchkey.h |
5127 | -header-test- += linux/rwlock_api_smp.h |
5128 | -header-test- += linux/spinlock_types_up.h |
5129 | -header-test- += linux/spinlock_up.h |
5130 | -header-test- += linux/wimax/debug.h |
5131 | -header-test- += rdma/uverbs_named_ioctl.h |
5132 | - |
5133 | -# asm-generic/*.h is used by asm/*.h, and should not be included directly |
5134 | -header-test- += asm-generic/% uapi/asm-generic/% |
5135 | - |
5136 | -# Timestamp files touched by Kconfig |
5137 | -header-test- += config/% |
5138 | - |
5139 | -# Timestamp files touched by scripts/adjust_autoksyms.sh |
5140 | -header-test- += ksym/% |
5141 | - |
5142 | -# You could compile-test these, but maybe not so useful... |
5143 | -header-test- += dt-bindings/% |
5144 | - |
5145 | -# Do not test generated headers. Stale headers are often left over when you |
5146 | -# traverse the git history without cleaning. |
5147 | -header-test- += generated/% |
5148 | - |
5149 | -# The rest are compile-tested |
5150 | -header-test-pattern-y += */*.h */*/*.h */*/*/*.h */*/*/*/*.h |
5151 | diff --git a/include/acpi/actypes.h b/include/acpi/actypes.h |
5152 | index 2f3f28c7cea3..9373662cdb44 100644 |
5153 | --- a/include/acpi/actypes.h |
5154 | +++ b/include/acpi/actypes.h |
5155 | @@ -532,11 +532,12 @@ typedef u64 acpi_integer; |
5156 | strnlen (a, ACPI_NAMESEG_SIZE) == ACPI_NAMESEG_SIZE) |
5157 | |
5158 | /* |
5159 | - * Algorithm to obtain access bit width. |
5160 | + * Algorithm to obtain access bit or byte width. |
5161 | * Can be used with access_width of struct acpi_generic_address and access_size of |
5162 | * struct acpi_resource_generic_register. |
5163 | */ |
5164 | #define ACPI_ACCESS_BIT_WIDTH(size) (1 << ((size) + 2)) |
5165 | +#define ACPI_ACCESS_BYTE_WIDTH(size) (1 << ((size) - 1)) |
5166 | |
5167 | /******************************************************************************* |
5168 | * |
5169 | diff --git a/include/asm-generic/vdso/vsyscall.h b/include/asm-generic/vdso/vsyscall.h |
5170 | index ce4103208619..cec543d9e87b 100644 |
5171 | --- a/include/asm-generic/vdso/vsyscall.h |
5172 | +++ b/include/asm-generic/vdso/vsyscall.h |
5173 | @@ -12,9 +12,9 @@ static __always_inline struct vdso_data *__arch_get_k_vdso_data(void) |
5174 | #endif /* __arch_get_k_vdso_data */ |
5175 | |
5176 | #ifndef __arch_update_vdso_data |
5177 | -static __always_inline int __arch_update_vdso_data(void) |
5178 | +static __always_inline bool __arch_update_vdso_data(void) |
5179 | { |
5180 | - return 0; |
5181 | + return true; |
5182 | } |
5183 | #endif /* __arch_update_vdso_data */ |
5184 | |
5185 | diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h |
5186 | index 51ccb4b8770a..bff1def62eed 100644 |
5187 | --- a/include/linux/blkdev.h |
5188 | +++ b/include/linux/blkdev.h |
5189 | @@ -531,7 +531,7 @@ struct request_queue { |
5190 | unsigned int sg_reserved_size; |
5191 | int node; |
5192 | #ifdef CONFIG_BLK_DEV_IO_TRACE |
5193 | - struct blk_trace *blk_trace; |
5194 | + struct blk_trace __rcu *blk_trace; |
5195 | struct mutex blk_trace_mutex; |
5196 | #endif |
5197 | /* |
5198 | diff --git a/include/linux/blktrace_api.h b/include/linux/blktrace_api.h |
5199 | index 7bb2d8de9f30..3b6ff5902edc 100644 |
5200 | --- a/include/linux/blktrace_api.h |
5201 | +++ b/include/linux/blktrace_api.h |
5202 | @@ -51,9 +51,13 @@ void __trace_note_message(struct blk_trace *, struct blkcg *blkcg, const char *f |
5203 | **/ |
5204 | #define blk_add_cgroup_trace_msg(q, cg, fmt, ...) \ |
5205 | do { \ |
5206 | - struct blk_trace *bt = (q)->blk_trace; \ |
5207 | + struct blk_trace *bt; \ |
5208 | + \ |
5209 | + rcu_read_lock(); \ |
5210 | + bt = rcu_dereference((q)->blk_trace); \ |
5211 | if (unlikely(bt)) \ |
5212 | __trace_note_message(bt, cg, fmt, ##__VA_ARGS__);\ |
5213 | + rcu_read_unlock(); \ |
5214 | } while (0) |
5215 | #define blk_add_trace_msg(q, fmt, ...) \ |
5216 | blk_add_cgroup_trace_msg(q, NULL, fmt, ##__VA_ARGS__) |
5217 | @@ -61,10 +65,14 @@ void __trace_note_message(struct blk_trace *, struct blkcg *blkcg, const char *f |
5218 | |
5219 | static inline bool blk_trace_note_message_enabled(struct request_queue *q) |
5220 | { |
5221 | - struct blk_trace *bt = q->blk_trace; |
5222 | - if (likely(!bt)) |
5223 | - return false; |
5224 | - return bt->act_mask & BLK_TC_NOTIFY; |
5225 | + struct blk_trace *bt; |
5226 | + bool ret; |
5227 | + |
5228 | + rcu_read_lock(); |
5229 | + bt = rcu_dereference(q->blk_trace); |
5230 | + ret = bt && (bt->act_mask & BLK_TC_NOTIFY); |
5231 | + rcu_read_unlock(); |
5232 | + return ret; |
5233 | } |
5234 | |
5235 | extern void blk_add_driver_data(struct request_queue *q, struct request *rq, |
5236 | diff --git a/include/linux/hid.h b/include/linux/hid.h |
5237 | index cd41f209043f..875f71132b14 100644 |
5238 | --- a/include/linux/hid.h |
5239 | +++ b/include/linux/hid.h |
5240 | @@ -492,7 +492,7 @@ struct hid_report_enum { |
5241 | }; |
5242 | |
5243 | #define HID_MIN_BUFFER_SIZE 64 /* make sure there is at least a packet size of space */ |
5244 | -#define HID_MAX_BUFFER_SIZE 4096 /* 4kb */ |
5245 | +#define HID_MAX_BUFFER_SIZE 8192 /* 8kb */ |
5246 | #define HID_CONTROL_FIFO_SIZE 256 /* to init devices with >100 reports */ |
5247 | #define HID_OUTPUT_FIFO_SIZE 64 |
5248 | |
5249 | diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h |
5250 | index f8fde9fa479c..b580a35f50ea 100644 |
5251 | --- a/include/linux/netdevice.h |
5252 | +++ b/include/linux/netdevice.h |
5253 | @@ -72,6 +72,8 @@ void netdev_set_default_ethtool_ops(struct net_device *dev, |
5254 | #define NET_RX_SUCCESS 0 /* keep 'em coming, baby */ |
5255 | #define NET_RX_DROP 1 /* packet dropped */ |
5256 | |
5257 | +#define MAX_NEST_DEV 8 |
5258 | + |
5259 | /* |
5260 | * Transmit return codes: transmit return codes originate from three different |
5261 | * namespaces: |
5262 | @@ -4294,11 +4296,8 @@ void *netdev_lower_get_next(struct net_device *dev, |
5263 | ldev; \ |
5264 | ldev = netdev_lower_get_next(dev, &(iter))) |
5265 | |
5266 | -struct net_device *netdev_all_lower_get_next(struct net_device *dev, |
5267 | +struct net_device *netdev_next_lower_dev_rcu(struct net_device *dev, |
5268 | struct list_head **iter); |
5269 | -struct net_device *netdev_all_lower_get_next_rcu(struct net_device *dev, |
5270 | - struct list_head **iter); |
5271 | - |
5272 | int netdev_walk_all_lower_dev(struct net_device *dev, |
5273 | int (*fn)(struct net_device *lower_dev, |
5274 | void *data), |
5275 | diff --git a/include/linux/netfilter/ipset/ip_set.h b/include/linux/netfilter/ipset/ip_set.h |
5276 | index 77336f4c4b1c..32658749e9db 100644 |
5277 | --- a/include/linux/netfilter/ipset/ip_set.h |
5278 | +++ b/include/linux/netfilter/ipset/ip_set.h |
5279 | @@ -121,6 +121,7 @@ struct ip_set_ext { |
5280 | u32 timeout; |
5281 | u8 packets_op; |
5282 | u8 bytes_op; |
5283 | + bool target; |
5284 | }; |
5285 | |
5286 | struct ip_set; |
5287 | @@ -187,6 +188,14 @@ struct ip_set_type_variant { |
5288 | /* Return true if "b" set is the same as "a" |
5289 | * according to the create set parameters */ |
5290 | bool (*same_set)(const struct ip_set *a, const struct ip_set *b); |
5291 | + /* Region-locking is used */ |
5292 | + bool region_lock; |
5293 | +}; |
5294 | + |
5295 | +struct ip_set_region { |
5296 | + spinlock_t lock; /* Region lock */ |
5297 | + size_t ext_size; /* Size of the dynamic extensions */ |
5298 | + u32 elements; /* Number of elements vs timeout */ |
5299 | }; |
5300 | |
5301 | /* The core set type structure */ |
5302 | @@ -681,7 +690,7 @@ ip_set_init_skbinfo(struct ip_set_skbinfo *skbinfo, |
5303 | } |
5304 | |
5305 | #define IP_SET_INIT_KEXT(skb, opt, set) \ |
5306 | - { .bytes = (skb)->len, .packets = 1, \ |
5307 | + { .bytes = (skb)->len, .packets = 1, .target = true,\ |
5308 | .timeout = ip_set_adt_opt_timeout(opt, set) } |
5309 | |
5310 | #define IP_SET_INIT_UEXT(set) \ |
5311 | diff --git a/include/linux/sched/nohz.h b/include/linux/sched/nohz.h |
5312 | index 1abe91ff6e4a..6d67e9a5af6b 100644 |
5313 | --- a/include/linux/sched/nohz.h |
5314 | +++ b/include/linux/sched/nohz.h |
5315 | @@ -15,9 +15,11 @@ static inline void nohz_balance_enter_idle(int cpu) { } |
5316 | |
5317 | #ifdef CONFIG_NO_HZ_COMMON |
5318 | void calc_load_nohz_start(void); |
5319 | +void calc_load_nohz_remote(struct rq *rq); |
5320 | void calc_load_nohz_stop(void); |
5321 | #else |
5322 | static inline void calc_load_nohz_start(void) { } |
5323 | +static inline void calc_load_nohz_remote(struct rq *rq) { } |
5324 | static inline void calc_load_nohz_stop(void) { } |
5325 | #endif /* CONFIG_NO_HZ_COMMON */ |
5326 | |
5327 | diff --git a/include/net/flow_dissector.h b/include/net/flow_dissector.h |
5328 | index e5fc8db1f783..78f6437cbc3a 100644 |
5329 | --- a/include/net/flow_dissector.h |
5330 | +++ b/include/net/flow_dissector.h |
5331 | @@ -5,6 +5,7 @@ |
5332 | #include <linux/types.h> |
5333 | #include <linux/in6.h> |
5334 | #include <linux/siphash.h> |
5335 | +#include <linux/string.h> |
5336 | #include <uapi/linux/if_ether.h> |
5337 | |
5338 | /** |
5339 | @@ -338,4 +339,12 @@ struct bpf_flow_dissector { |
5340 | void *data_end; |
5341 | }; |
5342 | |
5343 | +static inline void |
5344 | +flow_dissector_init_keys(struct flow_dissector_key_control *key_control, |
5345 | + struct flow_dissector_key_basic *key_basic) |
5346 | +{ |
5347 | + memset(key_control, 0, sizeof(*key_control)); |
5348 | + memset(key_basic, 0, sizeof(*key_basic)); |
5349 | +} |
5350 | + |
5351 | #endif |
5352 | diff --git a/include/uapi/linux/usb/charger.h b/include/uapi/linux/usb/charger.h |
5353 | index 5f72af35b3ed..ad22079125bf 100644 |
5354 | --- a/include/uapi/linux/usb/charger.h |
5355 | +++ b/include/uapi/linux/usb/charger.h |
5356 | @@ -14,18 +14,18 @@ |
5357 | * ACA (Accessory Charger Adapters) |
5358 | */ |
5359 | enum usb_charger_type { |
5360 | - UNKNOWN_TYPE, |
5361 | - SDP_TYPE, |
5362 | - DCP_TYPE, |
5363 | - CDP_TYPE, |
5364 | - ACA_TYPE, |
5365 | + UNKNOWN_TYPE = 0, |
5366 | + SDP_TYPE = 1, |
5367 | + DCP_TYPE = 2, |
5368 | + CDP_TYPE = 3, |
5369 | + ACA_TYPE = 4, |
5370 | }; |
5371 | |
5372 | /* USB charger state */ |
5373 | enum usb_charger_state { |
5374 | - USB_CHARGER_DEFAULT, |
5375 | - USB_CHARGER_PRESENT, |
5376 | - USB_CHARGER_ABSENT, |
5377 | + USB_CHARGER_DEFAULT = 0, |
5378 | + USB_CHARGER_PRESENT = 1, |
5379 | + USB_CHARGER_ABSENT = 2, |
5380 | }; |
5381 | |
5382 | #endif /* _UAPI__LINUX_USB_CHARGER_H */ |
5383 | diff --git a/init/Kconfig b/init/Kconfig |
5384 | index 0328b53d09ad..0bffc8fdbf3d 100644 |
5385 | --- a/init/Kconfig |
5386 | +++ b/init/Kconfig |
5387 | @@ -105,29 +105,9 @@ config COMPILE_TEST |
5388 | here. If you are a user/distributor, say N here to exclude useless |
5389 | drivers to be distributed. |
5390 | |
5391 | -config HEADER_TEST |
5392 | - bool "Compile test headers that should be standalone compilable" |
5393 | - help |
5394 | - Compile test headers listed in header-test-y target to ensure they are |
5395 | - self-contained, i.e. compilable as standalone units. |
5396 | - |
5397 | - If you are a developer or tester and want to ensure the requested |
5398 | - headers are self-contained, say Y here. Otherwise, choose N. |
5399 | - |
5400 | -config KERNEL_HEADER_TEST |
5401 | - bool "Compile test kernel headers" |
5402 | - depends on HEADER_TEST |
5403 | - help |
5404 | - Headers in include/ are used to build external moduls. |
5405 | - Compile test them to ensure they are self-contained, i.e. |
5406 | - compilable as standalone units. |
5407 | - |
5408 | - If you are a developer or tester and want to ensure the headers |
5409 | - in include/ are self-contained, say Y here. Otherwise, choose N. |
5410 | - |
5411 | config UAPI_HEADER_TEST |
5412 | bool "Compile test UAPI headers" |
5413 | - depends on HEADER_TEST && HEADERS_INSTALL && CC_CAN_LINK |
5414 | + depends on HEADERS_INSTALL && CC_CAN_LINK |
5415 | help |
5416 | Compile test headers exported to user-space to ensure they are |
5417 | self-contained, i.e. compilable as standalone units. |
5418 | diff --git a/kernel/audit.c b/kernel/audit.c |
5419 | index da8dc0db5bd3..dfc45063cb56 100644 |
5420 | --- a/kernel/audit.c |
5421 | +++ b/kernel/audit.c |
5422 | @@ -1100,13 +1100,11 @@ static void audit_log_feature_change(int which, u32 old_feature, u32 new_feature |
5423 | audit_log_end(ab); |
5424 | } |
5425 | |
5426 | -static int audit_set_feature(struct sk_buff *skb) |
5427 | +static int audit_set_feature(struct audit_features *uaf) |
5428 | { |
5429 | - struct audit_features *uaf; |
5430 | int i; |
5431 | |
5432 | BUILD_BUG_ON(AUDIT_LAST_FEATURE + 1 > ARRAY_SIZE(audit_feature_names)); |
5433 | - uaf = nlmsg_data(nlmsg_hdr(skb)); |
5434 | |
5435 | /* if there is ever a version 2 we should handle that here */ |
5436 | |
5437 | @@ -1174,6 +1172,7 @@ static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh) |
5438 | { |
5439 | u32 seq; |
5440 | void *data; |
5441 | + int data_len; |
5442 | int err; |
5443 | struct audit_buffer *ab; |
5444 | u16 msg_type = nlh->nlmsg_type; |
5445 | @@ -1187,6 +1186,7 @@ static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh) |
5446 | |
5447 | seq = nlh->nlmsg_seq; |
5448 | data = nlmsg_data(nlh); |
5449 | + data_len = nlmsg_len(nlh); |
5450 | |
5451 | switch (msg_type) { |
5452 | case AUDIT_GET: { |
5453 | @@ -1210,7 +1210,7 @@ static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh) |
5454 | struct audit_status s; |
5455 | memset(&s, 0, sizeof(s)); |
5456 | /* guard against past and future API changes */ |
5457 | - memcpy(&s, data, min_t(size_t, sizeof(s), nlmsg_len(nlh))); |
5458 | + memcpy(&s, data, min_t(size_t, sizeof(s), data_len)); |
5459 | if (s.mask & AUDIT_STATUS_ENABLED) { |
5460 | err = audit_set_enabled(s.enabled); |
5461 | if (err < 0) |
5462 | @@ -1314,7 +1314,9 @@ static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh) |
5463 | return err; |
5464 | break; |
5465 | case AUDIT_SET_FEATURE: |
5466 | - err = audit_set_feature(skb); |
5467 | + if (data_len < sizeof(struct audit_features)) |
5468 | + return -EINVAL; |
5469 | + err = audit_set_feature(data); |
5470 | if (err) |
5471 | return err; |
5472 | break; |
5473 | @@ -1326,6 +1328,8 @@ static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh) |
5474 | |
5475 | err = audit_filter(msg_type, AUDIT_FILTER_USER); |
5476 | if (err == 1) { /* match or error */ |
5477 | + char *str = data; |
5478 | + |
5479 | err = 0; |
5480 | if (msg_type == AUDIT_USER_TTY) { |
5481 | err = tty_audit_push(); |
5482 | @@ -1333,26 +1337,24 @@ static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh) |
5483 | break; |
5484 | } |
5485 | audit_log_user_recv_msg(&ab, msg_type); |
5486 | - if (msg_type != AUDIT_USER_TTY) |
5487 | + if (msg_type != AUDIT_USER_TTY) { |
5488 | + /* ensure NULL termination */ |
5489 | + str[data_len - 1] = '\0'; |
5490 | audit_log_format(ab, " msg='%.*s'", |
5491 | AUDIT_MESSAGE_TEXT_MAX, |
5492 | - (char *)data); |
5493 | - else { |
5494 | - int size; |
5495 | - |
5496 | + str); |
5497 | + } else { |
5498 | audit_log_format(ab, " data="); |
5499 | - size = nlmsg_len(nlh); |
5500 | - if (size > 0 && |
5501 | - ((unsigned char *)data)[size - 1] == '\0') |
5502 | - size--; |
5503 | - audit_log_n_untrustedstring(ab, data, size); |
5504 | + if (data_len > 0 && str[data_len - 1] == '\0') |
5505 | + data_len--; |
5506 | + audit_log_n_untrustedstring(ab, str, data_len); |
5507 | } |
5508 | audit_log_end(ab); |
5509 | } |
5510 | break; |
5511 | case AUDIT_ADD_RULE: |
5512 | case AUDIT_DEL_RULE: |
5513 | - if (nlmsg_len(nlh) < sizeof(struct audit_rule_data)) |
5514 | + if (data_len < sizeof(struct audit_rule_data)) |
5515 | return -EINVAL; |
5516 | if (audit_enabled == AUDIT_LOCKED) { |
5517 | audit_log_common_recv_msg(audit_context(), &ab, |
5518 | @@ -1364,7 +1366,7 @@ static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh) |
5519 | audit_log_end(ab); |
5520 | return -EPERM; |
5521 | } |
5522 | - err = audit_rule_change(msg_type, seq, data, nlmsg_len(nlh)); |
5523 | + err = audit_rule_change(msg_type, seq, data, data_len); |
5524 | break; |
5525 | case AUDIT_LIST_RULES: |
5526 | err = audit_list_rules_send(skb, seq); |
5527 | @@ -1379,7 +1381,7 @@ static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh) |
5528 | case AUDIT_MAKE_EQUIV: { |
5529 | void *bufp = data; |
5530 | u32 sizes[2]; |
5531 | - size_t msglen = nlmsg_len(nlh); |
5532 | + size_t msglen = data_len; |
5533 | char *old, *new; |
5534 | |
5535 | err = -EINVAL; |
5536 | @@ -1455,7 +1457,7 @@ static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh) |
5537 | |
5538 | memset(&s, 0, sizeof(s)); |
5539 | /* guard against past and future API changes */ |
5540 | - memcpy(&s, data, min_t(size_t, sizeof(s), nlmsg_len(nlh))); |
5541 | + memcpy(&s, data, min_t(size_t, sizeof(s), data_len)); |
5542 | /* check if new data is valid */ |
5543 | if ((s.enabled != 0 && s.enabled != 1) || |
5544 | (s.log_passwd != 0 && s.log_passwd != 1)) |
5545 | diff --git a/kernel/auditfilter.c b/kernel/auditfilter.c |
5546 | index b0126e9c0743..026e34da4ace 100644 |
5547 | --- a/kernel/auditfilter.c |
5548 | +++ b/kernel/auditfilter.c |
5549 | @@ -456,6 +456,7 @@ static struct audit_entry *audit_data_to_entry(struct audit_rule_data *data, |
5550 | bufp = data->buf; |
5551 | for (i = 0; i < data->field_count; i++) { |
5552 | struct audit_field *f = &entry->rule.fields[i]; |
5553 | + u32 f_val; |
5554 | |
5555 | err = -EINVAL; |
5556 | |
5557 | @@ -464,12 +465,12 @@ static struct audit_entry *audit_data_to_entry(struct audit_rule_data *data, |
5558 | goto exit_free; |
5559 | |
5560 | f->type = data->fields[i]; |
5561 | - f->val = data->values[i]; |
5562 | + f_val = data->values[i]; |
5563 | |
5564 | /* Support legacy tests for a valid loginuid */ |
5565 | - if ((f->type == AUDIT_LOGINUID) && (f->val == AUDIT_UID_UNSET)) { |
5566 | + if ((f->type == AUDIT_LOGINUID) && (f_val == AUDIT_UID_UNSET)) { |
5567 | f->type = AUDIT_LOGINUID_SET; |
5568 | - f->val = 0; |
5569 | + f_val = 0; |
5570 | entry->rule.pflags |= AUDIT_LOGINUID_LEGACY; |
5571 | } |
5572 | |
5573 | @@ -485,7 +486,7 @@ static struct audit_entry *audit_data_to_entry(struct audit_rule_data *data, |
5574 | case AUDIT_SUID: |
5575 | case AUDIT_FSUID: |
5576 | case AUDIT_OBJ_UID: |
5577 | - f->uid = make_kuid(current_user_ns(), f->val); |
5578 | + f->uid = make_kuid(current_user_ns(), f_val); |
5579 | if (!uid_valid(f->uid)) |
5580 | goto exit_free; |
5581 | break; |
5582 | @@ -494,11 +495,12 @@ static struct audit_entry *audit_data_to_entry(struct audit_rule_data *data, |
5583 | case AUDIT_SGID: |
5584 | case AUDIT_FSGID: |
5585 | case AUDIT_OBJ_GID: |
5586 | - f->gid = make_kgid(current_user_ns(), f->val); |
5587 | + f->gid = make_kgid(current_user_ns(), f_val); |
5588 | if (!gid_valid(f->gid)) |
5589 | goto exit_free; |
5590 | break; |
5591 | case AUDIT_ARCH: |
5592 | + f->val = f_val; |
5593 | entry->rule.arch_f = f; |
5594 | break; |
5595 | case AUDIT_SUBJ_USER: |
5596 | @@ -511,11 +513,13 @@ static struct audit_entry *audit_data_to_entry(struct audit_rule_data *data, |
5597 | case AUDIT_OBJ_TYPE: |
5598 | case AUDIT_OBJ_LEV_LOW: |
5599 | case AUDIT_OBJ_LEV_HIGH: |
5600 | - str = audit_unpack_string(&bufp, &remain, f->val); |
5601 | - if (IS_ERR(str)) |
5602 | + str = audit_unpack_string(&bufp, &remain, f_val); |
5603 | + if (IS_ERR(str)) { |
5604 | + err = PTR_ERR(str); |
5605 | goto exit_free; |
5606 | - entry->rule.buflen += f->val; |
5607 | - |
5608 | + } |
5609 | + entry->rule.buflen += f_val; |
5610 | + f->lsm_str = str; |
5611 | err = security_audit_rule_init(f->type, f->op, str, |
5612 | (void **)&f->lsm_rule); |
5613 | /* Keep currently invalid fields around in case they |
5614 | @@ -524,68 +528,71 @@ static struct audit_entry *audit_data_to_entry(struct audit_rule_data *data, |
5615 | pr_warn("audit rule for LSM \'%s\' is invalid\n", |
5616 | str); |
5617 | err = 0; |
5618 | - } |
5619 | - if (err) { |
5620 | - kfree(str); |
5621 | + } else if (err) |
5622 | goto exit_free; |
5623 | - } else |
5624 | - f->lsm_str = str; |
5625 | break; |
5626 | case AUDIT_WATCH: |
5627 | - str = audit_unpack_string(&bufp, &remain, f->val); |
5628 | - if (IS_ERR(str)) |
5629 | + str = audit_unpack_string(&bufp, &remain, f_val); |
5630 | + if (IS_ERR(str)) { |
5631 | + err = PTR_ERR(str); |
5632 | goto exit_free; |
5633 | - entry->rule.buflen += f->val; |
5634 | - |
5635 | - err = audit_to_watch(&entry->rule, str, f->val, f->op); |
5636 | + } |
5637 | + err = audit_to_watch(&entry->rule, str, f_val, f->op); |
5638 | if (err) { |
5639 | kfree(str); |
5640 | goto exit_free; |
5641 | } |
5642 | + entry->rule.buflen += f_val; |
5643 | break; |
5644 | case AUDIT_DIR: |
5645 | - str = audit_unpack_string(&bufp, &remain, f->val); |
5646 | - if (IS_ERR(str)) |
5647 | + str = audit_unpack_string(&bufp, &remain, f_val); |
5648 | + if (IS_ERR(str)) { |
5649 | + err = PTR_ERR(str); |
5650 | goto exit_free; |
5651 | - entry->rule.buflen += f->val; |
5652 | - |
5653 | + } |
5654 | err = audit_make_tree(&entry->rule, str, f->op); |
5655 | kfree(str); |
5656 | if (err) |
5657 | goto exit_free; |
5658 | + entry->rule.buflen += f_val; |
5659 | break; |
5660 | case AUDIT_INODE: |
5661 | + f->val = f_val; |
5662 | err = audit_to_inode(&entry->rule, f); |
5663 | if (err) |
5664 | goto exit_free; |
5665 | break; |
5666 | case AUDIT_FILTERKEY: |
5667 | - if (entry->rule.filterkey || f->val > AUDIT_MAX_KEY_LEN) |
5668 | + if (entry->rule.filterkey || f_val > AUDIT_MAX_KEY_LEN) |
5669 | goto exit_free; |
5670 | - str = audit_unpack_string(&bufp, &remain, f->val); |
5671 | - if (IS_ERR(str)) |
5672 | + str = audit_unpack_string(&bufp, &remain, f_val); |
5673 | + if (IS_ERR(str)) { |
5674 | + err = PTR_ERR(str); |
5675 | goto exit_free; |
5676 | - entry->rule.buflen += f->val; |
5677 | + } |
5678 | + entry->rule.buflen += f_val; |
5679 | entry->rule.filterkey = str; |
5680 | break; |
5681 | case AUDIT_EXE: |
5682 | - if (entry->rule.exe || f->val > PATH_MAX) |
5683 | + if (entry->rule.exe || f_val > PATH_MAX) |
5684 | goto exit_free; |
5685 | - str = audit_unpack_string(&bufp, &remain, f->val); |
5686 | + str = audit_unpack_string(&bufp, &remain, f_val); |
5687 | if (IS_ERR(str)) { |
5688 | err = PTR_ERR(str); |
5689 | goto exit_free; |
5690 | } |
5691 | - entry->rule.buflen += f->val; |
5692 | - |
5693 | - audit_mark = audit_alloc_mark(&entry->rule, str, f->val); |
5694 | + audit_mark = audit_alloc_mark(&entry->rule, str, f_val); |
5695 | if (IS_ERR(audit_mark)) { |
5696 | kfree(str); |
5697 | err = PTR_ERR(audit_mark); |
5698 | goto exit_free; |
5699 | } |
5700 | + entry->rule.buflen += f_val; |
5701 | entry->rule.exe = audit_mark; |
5702 | break; |
5703 | + default: |
5704 | + f->val = f_val; |
5705 | + break; |
5706 | } |
5707 | } |
5708 | |
5709 | diff --git a/kernel/kprobes.c b/kernel/kprobes.c |
5710 | index 53534aa258a6..34e28b236d68 100644 |
5711 | --- a/kernel/kprobes.c |
5712 | +++ b/kernel/kprobes.c |
5713 | @@ -510,6 +510,8 @@ static void do_unoptimize_kprobes(void) |
5714 | arch_unoptimize_kprobes(&unoptimizing_list, &freeing_list); |
5715 | /* Loop free_list for disarming */ |
5716 | list_for_each_entry_safe(op, tmp, &freeing_list, list) { |
5717 | + /* Switching from detour code to origin */ |
5718 | + op->kp.flags &= ~KPROBE_FLAG_OPTIMIZED; |
5719 | /* Disarm probes if marked disabled */ |
5720 | if (kprobe_disabled(&op->kp)) |
5721 | arch_disarm_kprobe(&op->kp); |
5722 | @@ -649,6 +651,7 @@ static void force_unoptimize_kprobe(struct optimized_kprobe *op) |
5723 | { |
5724 | lockdep_assert_cpus_held(); |
5725 | arch_unoptimize_kprobe(op); |
5726 | + op->kp.flags &= ~KPROBE_FLAG_OPTIMIZED; |
5727 | if (kprobe_disabled(&op->kp)) |
5728 | arch_disarm_kprobe(&op->kp); |
5729 | } |
5730 | @@ -676,7 +679,6 @@ static void unoptimize_kprobe(struct kprobe *p, bool force) |
5731 | return; |
5732 | } |
5733 | |
5734 | - op->kp.flags &= ~KPROBE_FLAG_OPTIMIZED; |
5735 | if (!list_empty(&op->list)) { |
5736 | /* Dequeue from the optimization queue */ |
5737 | list_del_init(&op->list); |
5738 | diff --git a/kernel/locking/lockdep_proc.c b/kernel/locking/lockdep_proc.c |
5739 | index dadb7b7fba37..9bb6d2497b04 100644 |
5740 | --- a/kernel/locking/lockdep_proc.c |
5741 | +++ b/kernel/locking/lockdep_proc.c |
5742 | @@ -286,9 +286,9 @@ static int lockdep_stats_show(struct seq_file *m, void *v) |
5743 | seq_printf(m, " stack-trace entries: %11lu [max: %lu]\n", |
5744 | nr_stack_trace_entries, MAX_STACK_TRACE_ENTRIES); |
5745 | #if defined(CONFIG_TRACE_IRQFLAGS) && defined(CONFIG_PROVE_LOCKING) |
5746 | - seq_printf(m, " number of stack traces: %llu\n", |
5747 | + seq_printf(m, " number of stack traces: %11llu\n", |
5748 | lockdep_stack_trace_count()); |
5749 | - seq_printf(m, " number of stack hash chains: %llu\n", |
5750 | + seq_printf(m, " number of stack hash chains: %11llu\n", |
5751 | lockdep_stack_hash_count()); |
5752 | #endif |
5753 | seq_printf(m, " combined max dependencies: %11u\n", |
5754 | diff --git a/kernel/rcu/tree_exp.h b/kernel/rcu/tree_exp.h |
5755 | index f504ac831779..df90d4d7ad2e 100644 |
5756 | --- a/kernel/rcu/tree_exp.h |
5757 | +++ b/kernel/rcu/tree_exp.h |
5758 | @@ -540,14 +540,13 @@ static void rcu_exp_wait_wake(unsigned long s) |
5759 | struct rcu_node *rnp; |
5760 | |
5761 | synchronize_sched_expedited_wait(); |
5762 | - rcu_exp_gp_seq_end(); |
5763 | - trace_rcu_exp_grace_period(rcu_state.name, s, TPS("end")); |
5764 | |
5765 | - /* |
5766 | - * Switch over to wakeup mode, allowing the next GP, but -only- the |
5767 | - * next GP, to proceed. |
5768 | - */ |
5769 | + // Switch over to wakeup mode, allowing the next GP to proceed. |
5770 | + // End the previous grace period only after acquiring the mutex |
5771 | + // to ensure that only one GP runs concurrently with wakeups. |
5772 | mutex_lock(&rcu_state.exp_wake_mutex); |
5773 | + rcu_exp_gp_seq_end(); |
5774 | + trace_rcu_exp_grace_period(rcu_state.name, s, TPS("end")); |
5775 | |
5776 | rcu_for_each_node_breadth_first(rnp) { |
5777 | if (ULONG_CMP_LT(READ_ONCE(rnp->exp_seq_rq), s)) { |
5778 | diff --git a/kernel/sched/core.c b/kernel/sched/core.c |
5779 | index e6c65725b7ce..e921126aec84 100644 |
5780 | --- a/kernel/sched/core.c |
5781 | +++ b/kernel/sched/core.c |
5782 | @@ -3668,28 +3668,32 @@ static void sched_tick_remote(struct work_struct *work) |
5783 | * statistics and checks timeslices in a time-independent way, regardless |
5784 | * of when exactly it is running. |
5785 | */ |
5786 | - if (idle_cpu(cpu) || !tick_nohz_tick_stopped_cpu(cpu)) |
5787 | + if (!tick_nohz_tick_stopped_cpu(cpu)) |
5788 | goto out_requeue; |
5789 | |
5790 | rq_lock_irq(rq, &rf); |
5791 | curr = rq->curr; |
5792 | - if (is_idle_task(curr) || cpu_is_offline(cpu)) |
5793 | + if (cpu_is_offline(cpu)) |
5794 | goto out_unlock; |
5795 | |
5796 | + curr = rq->curr; |
5797 | update_rq_clock(rq); |
5798 | - delta = rq_clock_task(rq) - curr->se.exec_start; |
5799 | |
5800 | - /* |
5801 | - * Make sure the next tick runs within a reasonable |
5802 | - * amount of time. |
5803 | - */ |
5804 | - WARN_ON_ONCE(delta > (u64)NSEC_PER_SEC * 3); |
5805 | + if (!is_idle_task(curr)) { |
5806 | + /* |
5807 | + * Make sure the next tick runs within a reasonable |
5808 | + * amount of time. |
5809 | + */ |
5810 | + delta = rq_clock_task(rq) - curr->se.exec_start; |
5811 | + WARN_ON_ONCE(delta > (u64)NSEC_PER_SEC * 3); |
5812 | + } |
5813 | curr->sched_class->task_tick(rq, curr, 0); |
5814 | |
5815 | + calc_load_nohz_remote(rq); |
5816 | out_unlock: |
5817 | rq_unlock_irq(rq, &rf); |
5818 | - |
5819 | out_requeue: |
5820 | + |
5821 | /* |
5822 | * Run the remote tick once per second (1Hz). This arbitrary |
5823 | * frequency is large enough to avoid overload but short enough |
5824 | @@ -7054,8 +7058,15 @@ void sched_move_task(struct task_struct *tsk) |
5825 | |
5826 | if (queued) |
5827 | enqueue_task(rq, tsk, queue_flags); |
5828 | - if (running) |
5829 | + if (running) { |
5830 | set_next_task(rq, tsk); |
5831 | + /* |
5832 | + * After changing group, the running task may have joined a |
5833 | + * throttled one but it's still the running task. Trigger a |
5834 | + * resched to make sure that task can still run. |
5835 | + */ |
5836 | + resched_curr(rq); |
5837 | + } |
5838 | |
5839 | task_rq_unlock(rq, tsk, &rf); |
5840 | } |
5841 | diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c |
5842 | index c87a798d1456..f32ce3a359fa 100644 |
5843 | --- a/kernel/sched/fair.c |
5844 | +++ b/kernel/sched/fair.c |
5845 | @@ -5933,6 +5933,7 @@ static inline int select_idle_smt(struct task_struct *p, int target) |
5846 | */ |
5847 | static int select_idle_cpu(struct task_struct *p, struct sched_domain *sd, int target) |
5848 | { |
5849 | + struct cpumask *cpus = this_cpu_cpumask_var_ptr(select_idle_mask); |
5850 | struct sched_domain *this_sd; |
5851 | u64 avg_cost, avg_idle; |
5852 | u64 time, cost; |
5853 | @@ -5964,11 +5965,11 @@ static int select_idle_cpu(struct task_struct *p, struct sched_domain *sd, int t |
5854 | |
5855 | time = cpu_clock(this); |
5856 | |
5857 | - for_each_cpu_wrap(cpu, sched_domain_span(sd), target) { |
5858 | + cpumask_and(cpus, sched_domain_span(sd), p->cpus_ptr); |
5859 | + |
5860 | + for_each_cpu_wrap(cpu, cpus, target) { |
5861 | if (!--nr) |
5862 | return si_cpu; |
5863 | - if (!cpumask_test_cpu(cpu, p->cpus_ptr)) |
5864 | - continue; |
5865 | if (available_idle_cpu(cpu)) |
5866 | break; |
5867 | if (si_cpu == -1 && sched_idle_cpu(cpu)) |
5868 | diff --git a/kernel/sched/loadavg.c b/kernel/sched/loadavg.c |
5869 | index 28a516575c18..de22da666ac7 100644 |
5870 | --- a/kernel/sched/loadavg.c |
5871 | +++ b/kernel/sched/loadavg.c |
5872 | @@ -231,16 +231,11 @@ static inline int calc_load_read_idx(void) |
5873 | return calc_load_idx & 1; |
5874 | } |
5875 | |
5876 | -void calc_load_nohz_start(void) |
5877 | +static void calc_load_nohz_fold(struct rq *rq) |
5878 | { |
5879 | - struct rq *this_rq = this_rq(); |
5880 | long delta; |
5881 | |
5882 | - /* |
5883 | - * We're going into NO_HZ mode, if there's any pending delta, fold it |
5884 | - * into the pending NO_HZ delta. |
5885 | - */ |
5886 | - delta = calc_load_fold_active(this_rq, 0); |
5887 | + delta = calc_load_fold_active(rq, 0); |
5888 | if (delta) { |
5889 | int idx = calc_load_write_idx(); |
5890 | |
5891 | @@ -248,6 +243,24 @@ void calc_load_nohz_start(void) |
5892 | } |
5893 | } |
5894 | |
5895 | +void calc_load_nohz_start(void) |
5896 | +{ |
5897 | + /* |
5898 | + * We're going into NO_HZ mode, if there's any pending delta, fold it |
5899 | + * into the pending NO_HZ delta. |
5900 | + */ |
5901 | + calc_load_nohz_fold(this_rq()); |
5902 | +} |
5903 | + |
5904 | +/* |
5905 | + * Keep track of the load for NOHZ_FULL, must be called between |
5906 | + * calc_load_nohz_{start,stop}(). |
5907 | + */ |
5908 | +void calc_load_nohz_remote(struct rq *rq) |
5909 | +{ |
5910 | + calc_load_nohz_fold(rq); |
5911 | +} |
5912 | + |
5913 | void calc_load_nohz_stop(void) |
5914 | { |
5915 | struct rq *this_rq = this_rq(); |
5916 | @@ -268,7 +281,7 @@ void calc_load_nohz_stop(void) |
5917 | this_rq->calc_load_update += LOAD_FREQ; |
5918 | } |
5919 | |
5920 | -static long calc_load_nohz_fold(void) |
5921 | +static long calc_load_nohz_read(void) |
5922 | { |
5923 | int idx = calc_load_read_idx(); |
5924 | long delta = 0; |
5925 | @@ -323,7 +336,7 @@ static void calc_global_nohz(void) |
5926 | } |
5927 | #else /* !CONFIG_NO_HZ_COMMON */ |
5928 | |
5929 | -static inline long calc_load_nohz_fold(void) { return 0; } |
5930 | +static inline long calc_load_nohz_read(void) { return 0; } |
5931 | static inline void calc_global_nohz(void) { } |
5932 | |
5933 | #endif /* CONFIG_NO_HZ_COMMON */ |
5934 | @@ -346,7 +359,7 @@ void calc_global_load(unsigned long ticks) |
5935 | /* |
5936 | * Fold the 'old' NO_HZ-delta to include all NO_HZ CPUs. |
5937 | */ |
5938 | - delta = calc_load_nohz_fold(); |
5939 | + delta = calc_load_nohz_read(); |
5940 | if (delta) |
5941 | atomic_long_add(delta, &calc_load_tasks); |
5942 | |
5943 | diff --git a/kernel/time/vsyscall.c b/kernel/time/vsyscall.c |
5944 | index 5ee0f7709410..9577c89179cd 100644 |
5945 | --- a/kernel/time/vsyscall.c |
5946 | +++ b/kernel/time/vsyscall.c |
5947 | @@ -28,11 +28,6 @@ static inline void update_vdso_data(struct vdso_data *vdata, |
5948 | vdata[CS_RAW].mult = tk->tkr_raw.mult; |
5949 | vdata[CS_RAW].shift = tk->tkr_raw.shift; |
5950 | |
5951 | - /* CLOCK_REALTIME */ |
5952 | - vdso_ts = &vdata[CS_HRES_COARSE].basetime[CLOCK_REALTIME]; |
5953 | - vdso_ts->sec = tk->xtime_sec; |
5954 | - vdso_ts->nsec = tk->tkr_mono.xtime_nsec; |
5955 | - |
5956 | /* CLOCK_MONOTONIC */ |
5957 | vdso_ts = &vdata[CS_HRES_COARSE].basetime[CLOCK_MONOTONIC]; |
5958 | vdso_ts->sec = tk->xtime_sec + tk->wall_to_monotonic.tv_sec; |
5959 | @@ -70,12 +65,6 @@ static inline void update_vdso_data(struct vdso_data *vdata, |
5960 | vdso_ts = &vdata[CS_HRES_COARSE].basetime[CLOCK_TAI]; |
5961 | vdso_ts->sec = tk->xtime_sec + (s64)tk->tai_offset; |
5962 | vdso_ts->nsec = tk->tkr_mono.xtime_nsec; |
5963 | - |
5964 | - /* |
5965 | - * Read without the seqlock held by clock_getres(). |
5966 | - * Note: No need to have a second copy. |
5967 | - */ |
5968 | - WRITE_ONCE(vdata[CS_HRES_COARSE].hrtimer_res, hrtimer_resolution); |
5969 | } |
5970 | |
5971 | void update_vsyscall(struct timekeeper *tk) |
5972 | @@ -84,20 +73,17 @@ void update_vsyscall(struct timekeeper *tk) |
5973 | struct vdso_timestamp *vdso_ts; |
5974 | u64 nsec; |
5975 | |
5976 | - if (__arch_update_vdso_data()) { |
5977 | - /* |
5978 | - * Some architectures might want to skip the update of the |
5979 | - * data page. |
5980 | - */ |
5981 | - return; |
5982 | - } |
5983 | - |
5984 | /* copy vsyscall data */ |
5985 | vdso_write_begin(vdata); |
5986 | |
5987 | vdata[CS_HRES_COARSE].clock_mode = __arch_get_clock_mode(tk); |
5988 | vdata[CS_RAW].clock_mode = __arch_get_clock_mode(tk); |
5989 | |
5990 | + /* CLOCK_REALTIME also required for time() */ |
5991 | + vdso_ts = &vdata[CS_HRES_COARSE].basetime[CLOCK_REALTIME]; |
5992 | + vdso_ts->sec = tk->xtime_sec; |
5993 | + vdso_ts->nsec = tk->tkr_mono.xtime_nsec; |
5994 | + |
5995 | /* CLOCK_REALTIME_COARSE */ |
5996 | vdso_ts = &vdata[CS_HRES_COARSE].basetime[CLOCK_REALTIME_COARSE]; |
5997 | vdso_ts->sec = tk->xtime_sec; |
5998 | @@ -110,7 +96,18 @@ void update_vsyscall(struct timekeeper *tk) |
5999 | nsec = nsec + tk->wall_to_monotonic.tv_nsec; |
6000 | vdso_ts->sec += __iter_div_u64_rem(nsec, NSEC_PER_SEC, &vdso_ts->nsec); |
6001 | |
6002 | - update_vdso_data(vdata, tk); |
6003 | + /* |
6004 | + * Read without the seqlock held by clock_getres(). |
6005 | + * Note: No need to have a second copy. |
6006 | + */ |
6007 | + WRITE_ONCE(vdata[CS_HRES_COARSE].hrtimer_res, hrtimer_resolution); |
6008 | + |
6009 | + /* |
6010 | + * Architectures can opt out of updating the high resolution part |
6011 | + * of the VDSO. |
6012 | + */ |
6013 | + if (__arch_update_vdso_data()) |
6014 | + update_vdso_data(vdata, tk); |
6015 | |
6016 | __arch_update_vsyscall(vdata, tk); |
6017 | |
6018 | diff --git a/kernel/trace/blktrace.c b/kernel/trace/blktrace.c |
6019 | index 2d6e93ab0478..4b2ad374167b 100644 |
6020 | --- a/kernel/trace/blktrace.c |
6021 | +++ b/kernel/trace/blktrace.c |
6022 | @@ -336,6 +336,7 @@ static void put_probe_ref(void) |
6023 | |
6024 | static void blk_trace_cleanup(struct blk_trace *bt) |
6025 | { |
6026 | + synchronize_rcu(); |
6027 | blk_trace_free(bt); |
6028 | put_probe_ref(); |
6029 | } |
6030 | @@ -630,8 +631,10 @@ static int compat_blk_trace_setup(struct request_queue *q, char *name, |
6031 | static int __blk_trace_startstop(struct request_queue *q, int start) |
6032 | { |
6033 | int ret; |
6034 | - struct blk_trace *bt = q->blk_trace; |
6035 | + struct blk_trace *bt; |
6036 | |
6037 | + bt = rcu_dereference_protected(q->blk_trace, |
6038 | + lockdep_is_held(&q->blk_trace_mutex)); |
6039 | if (bt == NULL) |
6040 | return -EINVAL; |
6041 | |
6042 | @@ -741,8 +744,8 @@ int blk_trace_ioctl(struct block_device *bdev, unsigned cmd, char __user *arg) |
6043 | void blk_trace_shutdown(struct request_queue *q) |
6044 | { |
6045 | mutex_lock(&q->blk_trace_mutex); |
6046 | - |
6047 | - if (q->blk_trace) { |
6048 | + if (rcu_dereference_protected(q->blk_trace, |
6049 | + lockdep_is_held(&q->blk_trace_mutex))) { |
6050 | __blk_trace_startstop(q, 0); |
6051 | __blk_trace_remove(q); |
6052 | } |
6053 | @@ -754,8 +757,10 @@ void blk_trace_shutdown(struct request_queue *q) |
6054 | static union kernfs_node_id * |
6055 | blk_trace_bio_get_cgid(struct request_queue *q, struct bio *bio) |
6056 | { |
6057 | - struct blk_trace *bt = q->blk_trace; |
6058 | + struct blk_trace *bt; |
6059 | |
6060 | + /* We don't use the 'bt' value here except as an optimization... */ |
6061 | + bt = rcu_dereference_protected(q->blk_trace, 1); |
6062 | if (!bt || !(blk_tracer_flags.val & TRACE_BLK_OPT_CGROUP)) |
6063 | return NULL; |
6064 | |
6065 | @@ -800,10 +805,14 @@ static void blk_add_trace_rq(struct request *rq, int error, |
6066 | unsigned int nr_bytes, u32 what, |
6067 | union kernfs_node_id *cgid) |
6068 | { |
6069 | - struct blk_trace *bt = rq->q->blk_trace; |
6070 | + struct blk_trace *bt; |
6071 | |
6072 | - if (likely(!bt)) |
6073 | + rcu_read_lock(); |
6074 | + bt = rcu_dereference(rq->q->blk_trace); |
6075 | + if (likely(!bt)) { |
6076 | + rcu_read_unlock(); |
6077 | return; |
6078 | + } |
6079 | |
6080 | if (blk_rq_is_passthrough(rq)) |
6081 | what |= BLK_TC_ACT(BLK_TC_PC); |
6082 | @@ -812,6 +821,7 @@ static void blk_add_trace_rq(struct request *rq, int error, |
6083 | |
6084 | __blk_add_trace(bt, blk_rq_trace_sector(rq), nr_bytes, req_op(rq), |
6085 | rq->cmd_flags, what, error, 0, NULL, cgid); |
6086 | + rcu_read_unlock(); |
6087 | } |
6088 | |
6089 | static void blk_add_trace_rq_insert(void *ignore, |
6090 | @@ -857,14 +867,19 @@ static void blk_add_trace_rq_complete(void *ignore, struct request *rq, |
6091 | static void blk_add_trace_bio(struct request_queue *q, struct bio *bio, |
6092 | u32 what, int error) |
6093 | { |
6094 | - struct blk_trace *bt = q->blk_trace; |
6095 | + struct blk_trace *bt; |
6096 | |
6097 | - if (likely(!bt)) |
6098 | + rcu_read_lock(); |
6099 | + bt = rcu_dereference(q->blk_trace); |
6100 | + if (likely(!bt)) { |
6101 | + rcu_read_unlock(); |
6102 | return; |
6103 | + } |
6104 | |
6105 | __blk_add_trace(bt, bio->bi_iter.bi_sector, bio->bi_iter.bi_size, |
6106 | bio_op(bio), bio->bi_opf, what, error, 0, NULL, |
6107 | blk_trace_bio_get_cgid(q, bio)); |
6108 | + rcu_read_unlock(); |
6109 | } |
6110 | |
6111 | static void blk_add_trace_bio_bounce(void *ignore, |
6112 | @@ -909,11 +924,14 @@ static void blk_add_trace_getrq(void *ignore, |
6113 | if (bio) |
6114 | blk_add_trace_bio(q, bio, BLK_TA_GETRQ, 0); |
6115 | else { |
6116 | - struct blk_trace *bt = q->blk_trace; |
6117 | + struct blk_trace *bt; |
6118 | |
6119 | + rcu_read_lock(); |
6120 | + bt = rcu_dereference(q->blk_trace); |
6121 | if (bt) |
6122 | __blk_add_trace(bt, 0, 0, rw, 0, BLK_TA_GETRQ, 0, 0, |
6123 | NULL, NULL); |
6124 | + rcu_read_unlock(); |
6125 | } |
6126 | } |
6127 | |
6128 | @@ -925,27 +943,35 @@ static void blk_add_trace_sleeprq(void *ignore, |
6129 | if (bio) |
6130 | blk_add_trace_bio(q, bio, BLK_TA_SLEEPRQ, 0); |
6131 | else { |
6132 | - struct blk_trace *bt = q->blk_trace; |
6133 | + struct blk_trace *bt; |
6134 | |
6135 | + rcu_read_lock(); |
6136 | + bt = rcu_dereference(q->blk_trace); |
6137 | if (bt) |
6138 | __blk_add_trace(bt, 0, 0, rw, 0, BLK_TA_SLEEPRQ, |
6139 | 0, 0, NULL, NULL); |
6140 | + rcu_read_unlock(); |
6141 | } |
6142 | } |
6143 | |
6144 | static void blk_add_trace_plug(void *ignore, struct request_queue *q) |
6145 | { |
6146 | - struct blk_trace *bt = q->blk_trace; |
6147 | + struct blk_trace *bt; |
6148 | |
6149 | + rcu_read_lock(); |
6150 | + bt = rcu_dereference(q->blk_trace); |
6151 | if (bt) |
6152 | __blk_add_trace(bt, 0, 0, 0, 0, BLK_TA_PLUG, 0, 0, NULL, NULL); |
6153 | + rcu_read_unlock(); |
6154 | } |
6155 | |
6156 | static void blk_add_trace_unplug(void *ignore, struct request_queue *q, |
6157 | unsigned int depth, bool explicit) |
6158 | { |
6159 | - struct blk_trace *bt = q->blk_trace; |
6160 | + struct blk_trace *bt; |
6161 | |
6162 | + rcu_read_lock(); |
6163 | + bt = rcu_dereference(q->blk_trace); |
6164 | if (bt) { |
6165 | __be64 rpdu = cpu_to_be64(depth); |
6166 | u32 what; |
6167 | @@ -957,14 +983,17 @@ static void blk_add_trace_unplug(void *ignore, struct request_queue *q, |
6168 | |
6169 | __blk_add_trace(bt, 0, 0, 0, 0, what, 0, sizeof(rpdu), &rpdu, NULL); |
6170 | } |
6171 | + rcu_read_unlock(); |
6172 | } |
6173 | |
6174 | static void blk_add_trace_split(void *ignore, |
6175 | struct request_queue *q, struct bio *bio, |
6176 | unsigned int pdu) |
6177 | { |
6178 | - struct blk_trace *bt = q->blk_trace; |
6179 | + struct blk_trace *bt; |
6180 | |
6181 | + rcu_read_lock(); |
6182 | + bt = rcu_dereference(q->blk_trace); |
6183 | if (bt) { |
6184 | __be64 rpdu = cpu_to_be64(pdu); |
6185 | |
6186 | @@ -973,6 +1002,7 @@ static void blk_add_trace_split(void *ignore, |
6187 | BLK_TA_SPLIT, bio->bi_status, sizeof(rpdu), |
6188 | &rpdu, blk_trace_bio_get_cgid(q, bio)); |
6189 | } |
6190 | + rcu_read_unlock(); |
6191 | } |
6192 | |
6193 | /** |
6194 | @@ -992,11 +1022,15 @@ static void blk_add_trace_bio_remap(void *ignore, |
6195 | struct request_queue *q, struct bio *bio, |
6196 | dev_t dev, sector_t from) |
6197 | { |
6198 | - struct blk_trace *bt = q->blk_trace; |
6199 | + struct blk_trace *bt; |
6200 | struct blk_io_trace_remap r; |
6201 | |
6202 | - if (likely(!bt)) |
6203 | + rcu_read_lock(); |
6204 | + bt = rcu_dereference(q->blk_trace); |
6205 | + if (likely(!bt)) { |
6206 | + rcu_read_unlock(); |
6207 | return; |
6208 | + } |
6209 | |
6210 | r.device_from = cpu_to_be32(dev); |
6211 | r.device_to = cpu_to_be32(bio_dev(bio)); |
6212 | @@ -1005,6 +1039,7 @@ static void blk_add_trace_bio_remap(void *ignore, |
6213 | __blk_add_trace(bt, bio->bi_iter.bi_sector, bio->bi_iter.bi_size, |
6214 | bio_op(bio), bio->bi_opf, BLK_TA_REMAP, bio->bi_status, |
6215 | sizeof(r), &r, blk_trace_bio_get_cgid(q, bio)); |
6216 | + rcu_read_unlock(); |
6217 | } |
6218 | |
6219 | /** |
6220 | @@ -1025,11 +1060,15 @@ static void blk_add_trace_rq_remap(void *ignore, |
6221 | struct request *rq, dev_t dev, |
6222 | sector_t from) |
6223 | { |
6224 | - struct blk_trace *bt = q->blk_trace; |
6225 | + struct blk_trace *bt; |
6226 | struct blk_io_trace_remap r; |
6227 | |
6228 | - if (likely(!bt)) |
6229 | + rcu_read_lock(); |
6230 | + bt = rcu_dereference(q->blk_trace); |
6231 | + if (likely(!bt)) { |
6232 | + rcu_read_unlock(); |
6233 | return; |
6234 | + } |
6235 | |
6236 | r.device_from = cpu_to_be32(dev); |
6237 | r.device_to = cpu_to_be32(disk_devt(rq->rq_disk)); |
6238 | @@ -1038,6 +1077,7 @@ static void blk_add_trace_rq_remap(void *ignore, |
6239 | __blk_add_trace(bt, blk_rq_pos(rq), blk_rq_bytes(rq), |
6240 | rq_data_dir(rq), 0, BLK_TA_REMAP, 0, |
6241 | sizeof(r), &r, blk_trace_request_get_cgid(q, rq)); |
6242 | + rcu_read_unlock(); |
6243 | } |
6244 | |
6245 | /** |
6246 | @@ -1055,14 +1095,19 @@ void blk_add_driver_data(struct request_queue *q, |
6247 | struct request *rq, |
6248 | void *data, size_t len) |
6249 | { |
6250 | - struct blk_trace *bt = q->blk_trace; |
6251 | + struct blk_trace *bt; |
6252 | |
6253 | - if (likely(!bt)) |
6254 | + rcu_read_lock(); |
6255 | + bt = rcu_dereference(q->blk_trace); |
6256 | + if (likely(!bt)) { |
6257 | + rcu_read_unlock(); |
6258 | return; |
6259 | + } |
6260 | |
6261 | __blk_add_trace(bt, blk_rq_trace_sector(rq), blk_rq_bytes(rq), 0, 0, |
6262 | BLK_TA_DRV_DATA, 0, len, data, |
6263 | blk_trace_request_get_cgid(q, rq)); |
6264 | + rcu_read_unlock(); |
6265 | } |
6266 | EXPORT_SYMBOL_GPL(blk_add_driver_data); |
6267 | |
6268 | @@ -1589,6 +1634,7 @@ static int blk_trace_remove_queue(struct request_queue *q) |
6269 | return -EINVAL; |
6270 | |
6271 | put_probe_ref(); |
6272 | + synchronize_rcu(); |
6273 | blk_trace_free(bt); |
6274 | return 0; |
6275 | } |
6276 | @@ -1750,6 +1796,7 @@ static ssize_t sysfs_blk_trace_attr_show(struct device *dev, |
6277 | struct hd_struct *p = dev_to_part(dev); |
6278 | struct request_queue *q; |
6279 | struct block_device *bdev; |
6280 | + struct blk_trace *bt; |
6281 | ssize_t ret = -ENXIO; |
6282 | |
6283 | bdev = bdget(part_devt(p)); |
6284 | @@ -1762,21 +1809,23 @@ static ssize_t sysfs_blk_trace_attr_show(struct device *dev, |
6285 | |
6286 | mutex_lock(&q->blk_trace_mutex); |
6287 | |
6288 | + bt = rcu_dereference_protected(q->blk_trace, |
6289 | + lockdep_is_held(&q->blk_trace_mutex)); |
6290 | if (attr == &dev_attr_enable) { |
6291 | - ret = sprintf(buf, "%u\n", !!q->blk_trace); |
6292 | + ret = sprintf(buf, "%u\n", !!bt); |
6293 | goto out_unlock_bdev; |
6294 | } |
6295 | |
6296 | - if (q->blk_trace == NULL) |
6297 | + if (bt == NULL) |
6298 | ret = sprintf(buf, "disabled\n"); |
6299 | else if (attr == &dev_attr_act_mask) |
6300 | - ret = blk_trace_mask2str(buf, q->blk_trace->act_mask); |
6301 | + ret = blk_trace_mask2str(buf, bt->act_mask); |
6302 | else if (attr == &dev_attr_pid) |
6303 | - ret = sprintf(buf, "%u\n", q->blk_trace->pid); |
6304 | + ret = sprintf(buf, "%u\n", bt->pid); |
6305 | else if (attr == &dev_attr_start_lba) |
6306 | - ret = sprintf(buf, "%llu\n", q->blk_trace->start_lba); |
6307 | + ret = sprintf(buf, "%llu\n", bt->start_lba); |
6308 | else if (attr == &dev_attr_end_lba) |
6309 | - ret = sprintf(buf, "%llu\n", q->blk_trace->end_lba); |
6310 | + ret = sprintf(buf, "%llu\n", bt->end_lba); |
6311 | |
6312 | out_unlock_bdev: |
6313 | mutex_unlock(&q->blk_trace_mutex); |
6314 | @@ -1793,6 +1842,7 @@ static ssize_t sysfs_blk_trace_attr_store(struct device *dev, |
6315 | struct block_device *bdev; |
6316 | struct request_queue *q; |
6317 | struct hd_struct *p; |
6318 | + struct blk_trace *bt; |
6319 | u64 value; |
6320 | ssize_t ret = -EINVAL; |
6321 | |
6322 | @@ -1823,8 +1873,10 @@ static ssize_t sysfs_blk_trace_attr_store(struct device *dev, |
6323 | |
6324 | mutex_lock(&q->blk_trace_mutex); |
6325 | |
6326 | + bt = rcu_dereference_protected(q->blk_trace, |
6327 | + lockdep_is_held(&q->blk_trace_mutex)); |
6328 | if (attr == &dev_attr_enable) { |
6329 | - if (!!value == !!q->blk_trace) { |
6330 | + if (!!value == !!bt) { |
6331 | ret = 0; |
6332 | goto out_unlock_bdev; |
6333 | } |
6334 | @@ -1836,18 +1888,18 @@ static ssize_t sysfs_blk_trace_attr_store(struct device *dev, |
6335 | } |
6336 | |
6337 | ret = 0; |
6338 | - if (q->blk_trace == NULL) |
6339 | + if (bt == NULL) |
6340 | ret = blk_trace_setup_queue(q, bdev); |
6341 | |
6342 | if (ret == 0) { |
6343 | if (attr == &dev_attr_act_mask) |
6344 | - q->blk_trace->act_mask = value; |
6345 | + bt->act_mask = value; |
6346 | else if (attr == &dev_attr_pid) |
6347 | - q->blk_trace->pid = value; |
6348 | + bt->pid = value; |
6349 | else if (attr == &dev_attr_start_lba) |
6350 | - q->blk_trace->start_lba = value; |
6351 | + bt->start_lba = value; |
6352 | else if (attr == &dev_attr_end_lba) |
6353 | - q->blk_trace->end_lba = value; |
6354 | + bt->end_lba = value; |
6355 | } |
6356 | |
6357 | out_unlock_bdev: |
6358 | diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c |
6359 | index 341aab32c946..c6ccaf6c62f7 100644 |
6360 | --- a/kernel/trace/trace.c |
6361 | +++ b/kernel/trace/trace.c |
6362 | @@ -1743,6 +1743,7 @@ static __init int init_trace_selftests(void) |
6363 | |
6364 | pr_info("Running postponed tracer tests:\n"); |
6365 | |
6366 | + tracing_selftest_running = true; |
6367 | list_for_each_entry_safe(p, n, &postponed_selftests, list) { |
6368 | /* This loop can take minutes when sanitizers are enabled, so |
6369 | * lets make sure we allow RCU processing. |
6370 | @@ -1765,6 +1766,7 @@ static __init int init_trace_selftests(void) |
6371 | list_del(&p->list); |
6372 | kfree(p); |
6373 | } |
6374 | + tracing_selftest_running = false; |
6375 | |
6376 | out: |
6377 | mutex_unlock(&trace_types_lock); |
6378 | diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug |
6379 | index 93d97f9b0157..f61d834e02fe 100644 |
6380 | --- a/lib/Kconfig.debug |
6381 | +++ b/lib/Kconfig.debug |
6382 | @@ -299,17 +299,6 @@ config HEADERS_INSTALL |
6383 | user-space program samples. It is also needed by some features such |
6384 | as uapi header sanity checks. |
6385 | |
6386 | -config HEADERS_CHECK |
6387 | - bool "Run sanity checks on uapi headers when building 'all'" |
6388 | - depends on HEADERS_INSTALL |
6389 | - help |
6390 | - This option will run basic sanity checks on uapi headers when |
6391 | - building the 'all' target, for example, ensure that they do not |
6392 | - attempt to include files which were not exported, etc. |
6393 | - |
6394 | - If you're making modifications to header files which are |
6395 | - relevant for userspace, say 'Y'. |
6396 | - |
6397 | config OPTIMIZE_INLINING |
6398 | def_bool y |
6399 | help |
6400 | diff --git a/mm/debug.c b/mm/debug.c |
6401 | index 0461df1207cb..6a52316af839 100644 |
6402 | --- a/mm/debug.c |
6403 | +++ b/mm/debug.c |
6404 | @@ -47,6 +47,7 @@ void __dump_page(struct page *page, const char *reason) |
6405 | struct address_space *mapping; |
6406 | bool page_poisoned = PagePoisoned(page); |
6407 | int mapcount; |
6408 | + char *type = ""; |
6409 | |
6410 | /* |
6411 | * If struct page is poisoned don't access Page*() functions as that |
6412 | @@ -78,9 +79,9 @@ void __dump_page(struct page *page, const char *reason) |
6413 | page, page_ref_count(page), mapcount, |
6414 | page->mapping, page_to_pgoff(page)); |
6415 | if (PageKsm(page)) |
6416 | - pr_warn("ksm flags: %#lx(%pGp)\n", page->flags, &page->flags); |
6417 | + type = "ksm "; |
6418 | else if (PageAnon(page)) |
6419 | - pr_warn("anon flags: %#lx(%pGp)\n", page->flags, &page->flags); |
6420 | + type = "anon "; |
6421 | else if (mapping) { |
6422 | if (mapping->host && mapping->host->i_dentry.first) { |
6423 | struct dentry *dentry; |
6424 | @@ -88,10 +89,11 @@ void __dump_page(struct page *page, const char *reason) |
6425 | pr_warn("%ps name:\"%pd\"\n", mapping->a_ops, dentry); |
6426 | } else |
6427 | pr_warn("%ps\n", mapping->a_ops); |
6428 | - pr_warn("flags: %#lx(%pGp)\n", page->flags, &page->flags); |
6429 | } |
6430 | BUILD_BUG_ON(ARRAY_SIZE(pageflag_names) != __NR_PAGEFLAGS + 1); |
6431 | |
6432 | + pr_warn("%sflags: %#lx(%pGp)\n", type, page->flags, &page->flags); |
6433 | + |
6434 | hex_only: |
6435 | print_hex_dump(KERN_WARNING, "raw: ", DUMP_PREFIX_NONE, 32, |
6436 | sizeof(unsigned long), page, |
6437 | diff --git a/mm/gup.c b/mm/gup.c |
6438 | index 8f236a335ae9..745b4036cdfd 100644 |
6439 | --- a/mm/gup.c |
6440 | +++ b/mm/gup.c |
6441 | @@ -2401,7 +2401,8 @@ int get_user_pages_fast(unsigned long start, int nr_pages, |
6442 | unsigned long addr, len, end; |
6443 | int nr = 0, ret = 0; |
6444 | |
6445 | - if (WARN_ON_ONCE(gup_flags & ~(FOLL_WRITE | FOLL_LONGTERM))) |
6446 | + if (WARN_ON_ONCE(gup_flags & ~(FOLL_WRITE | FOLL_LONGTERM | |
6447 | + FOLL_FORCE))) |
6448 | return -EINVAL; |
6449 | |
6450 | start = untagged_addr(start) & PAGE_MASK; |
6451 | diff --git a/mm/huge_memory.c b/mm/huge_memory.c |
6452 | index 1de7f53621a0..6c9689281c07 100644 |
6453 | --- a/mm/huge_memory.c |
6454 | +++ b/mm/huge_memory.c |
6455 | @@ -177,16 +177,13 @@ static ssize_t enabled_store(struct kobject *kobj, |
6456 | { |
6457 | ssize_t ret = count; |
6458 | |
6459 | - if (!memcmp("always", buf, |
6460 | - min(sizeof("always")-1, count))) { |
6461 | + if (sysfs_streq(buf, "always")) { |
6462 | clear_bit(TRANSPARENT_HUGEPAGE_REQ_MADV_FLAG, &transparent_hugepage_flags); |
6463 | set_bit(TRANSPARENT_HUGEPAGE_FLAG, &transparent_hugepage_flags); |
6464 | - } else if (!memcmp("madvise", buf, |
6465 | - min(sizeof("madvise")-1, count))) { |
6466 | + } else if (sysfs_streq(buf, "madvise")) { |
6467 | clear_bit(TRANSPARENT_HUGEPAGE_FLAG, &transparent_hugepage_flags); |
6468 | set_bit(TRANSPARENT_HUGEPAGE_REQ_MADV_FLAG, &transparent_hugepage_flags); |
6469 | - } else if (!memcmp("never", buf, |
6470 | - min(sizeof("never")-1, count))) { |
6471 | + } else if (sysfs_streq(buf, "never")) { |
6472 | clear_bit(TRANSPARENT_HUGEPAGE_FLAG, &transparent_hugepage_flags); |
6473 | clear_bit(TRANSPARENT_HUGEPAGE_REQ_MADV_FLAG, &transparent_hugepage_flags); |
6474 | } else |
6475 | @@ -250,32 +247,27 @@ static ssize_t defrag_store(struct kobject *kobj, |
6476 | struct kobj_attribute *attr, |
6477 | const char *buf, size_t count) |
6478 | { |
6479 | - if (!memcmp("always", buf, |
6480 | - min(sizeof("always")-1, count))) { |
6481 | + if (sysfs_streq(buf, "always")) { |
6482 | clear_bit(TRANSPARENT_HUGEPAGE_DEFRAG_KSWAPD_FLAG, &transparent_hugepage_flags); |
6483 | clear_bit(TRANSPARENT_HUGEPAGE_DEFRAG_KSWAPD_OR_MADV_FLAG, &transparent_hugepage_flags); |
6484 | clear_bit(TRANSPARENT_HUGEPAGE_DEFRAG_REQ_MADV_FLAG, &transparent_hugepage_flags); |
6485 | set_bit(TRANSPARENT_HUGEPAGE_DEFRAG_DIRECT_FLAG, &transparent_hugepage_flags); |
6486 | - } else if (!memcmp("defer+madvise", buf, |
6487 | - min(sizeof("defer+madvise")-1, count))) { |
6488 | + } else if (sysfs_streq(buf, "defer+madvise")) { |
6489 | clear_bit(TRANSPARENT_HUGEPAGE_DEFRAG_DIRECT_FLAG, &transparent_hugepage_flags); |
6490 | clear_bit(TRANSPARENT_HUGEPAGE_DEFRAG_KSWAPD_FLAG, &transparent_hugepage_flags); |
6491 | clear_bit(TRANSPARENT_HUGEPAGE_DEFRAG_REQ_MADV_FLAG, &transparent_hugepage_flags); |
6492 | set_bit(TRANSPARENT_HUGEPAGE_DEFRAG_KSWAPD_OR_MADV_FLAG, &transparent_hugepage_flags); |
6493 | - } else if (!memcmp("defer", buf, |
6494 | - min(sizeof("defer")-1, count))) { |
6495 | + } else if (sysfs_streq(buf, "defer")) { |
6496 | clear_bit(TRANSPARENT_HUGEPAGE_DEFRAG_DIRECT_FLAG, &transparent_hugepage_flags); |
6497 | clear_bit(TRANSPARENT_HUGEPAGE_DEFRAG_KSWAPD_OR_MADV_FLAG, &transparent_hugepage_flags); |
6498 | clear_bit(TRANSPARENT_HUGEPAGE_DEFRAG_REQ_MADV_FLAG, &transparent_hugepage_flags); |
6499 | set_bit(TRANSPARENT_HUGEPAGE_DEFRAG_KSWAPD_FLAG, &transparent_hugepage_flags); |
6500 | - } else if (!memcmp("madvise", buf, |
6501 | - min(sizeof("madvise")-1, count))) { |
6502 | + } else if (sysfs_streq(buf, "madvise")) { |
6503 | clear_bit(TRANSPARENT_HUGEPAGE_DEFRAG_DIRECT_FLAG, &transparent_hugepage_flags); |
6504 | clear_bit(TRANSPARENT_HUGEPAGE_DEFRAG_KSWAPD_FLAG, &transparent_hugepage_flags); |
6505 | clear_bit(TRANSPARENT_HUGEPAGE_DEFRAG_KSWAPD_OR_MADV_FLAG, &transparent_hugepage_flags); |
6506 | set_bit(TRANSPARENT_HUGEPAGE_DEFRAG_REQ_MADV_FLAG, &transparent_hugepage_flags); |
6507 | - } else if (!memcmp("never", buf, |
6508 | - min(sizeof("never")-1, count))) { |
6509 | + } else if (sysfs_streq(buf, "never")) { |
6510 | clear_bit(TRANSPARENT_HUGEPAGE_DEFRAG_DIRECT_FLAG, &transparent_hugepage_flags); |
6511 | clear_bit(TRANSPARENT_HUGEPAGE_DEFRAG_KSWAPD_FLAG, &transparent_hugepage_flags); |
6512 | clear_bit(TRANSPARENT_HUGEPAGE_DEFRAG_KSWAPD_OR_MADV_FLAG, &transparent_hugepage_flags); |
6513 | @@ -2712,7 +2704,7 @@ int split_huge_page_to_list(struct page *page, struct list_head *list) |
6514 | unsigned long flags; |
6515 | pgoff_t end; |
6516 | |
6517 | - VM_BUG_ON_PAGE(is_huge_zero_page(page), page); |
6518 | + VM_BUG_ON_PAGE(is_huge_zero_page(head), head); |
6519 | VM_BUG_ON_PAGE(!PageLocked(page), page); |
6520 | VM_BUG_ON_PAGE(!PageCompound(page), page); |
6521 | |
6522 | diff --git a/net/core/dev.c b/net/core/dev.c |
6523 | index a7e2e57af63a..db8c229e0f4a 100644 |
6524 | --- a/net/core/dev.c |
6525 | +++ b/net/core/dev.c |
6526 | @@ -146,7 +146,6 @@ |
6527 | #include "net-sysfs.h" |
6528 | |
6529 | #define MAX_GRO_SKBS 8 |
6530 | -#define MAX_NEST_DEV 8 |
6531 | |
6532 | /* This should be increased if a protocol with a bigger head is added. */ |
6533 | #define GRO_MAX_HEAD (MAX_HEADER + 128) |
6534 | @@ -3386,26 +3385,8 @@ static inline int __dev_xmit_skb(struct sk_buff *skb, struct Qdisc *q, |
6535 | qdisc_calculate_pkt_len(skb, q); |
6536 | |
6537 | if (q->flags & TCQ_F_NOLOCK) { |
6538 | - if ((q->flags & TCQ_F_CAN_BYPASS) && READ_ONCE(q->empty) && |
6539 | - qdisc_run_begin(q)) { |
6540 | - if (unlikely(test_bit(__QDISC_STATE_DEACTIVATED, |
6541 | - &q->state))) { |
6542 | - __qdisc_drop(skb, &to_free); |
6543 | - rc = NET_XMIT_DROP; |
6544 | - goto end_run; |
6545 | - } |
6546 | - qdisc_bstats_cpu_update(q, skb); |
6547 | - |
6548 | - rc = NET_XMIT_SUCCESS; |
6549 | - if (sch_direct_xmit(skb, q, dev, txq, NULL, true)) |
6550 | - __qdisc_run(q); |
6551 | - |
6552 | -end_run: |
6553 | - qdisc_run_end(q); |
6554 | - } else { |
6555 | - rc = q->enqueue(skb, q, &to_free) & NET_XMIT_MASK; |
6556 | - qdisc_run(q); |
6557 | - } |
6558 | + rc = q->enqueue(skb, q, &to_free) & NET_XMIT_MASK; |
6559 | + qdisc_run(q); |
6560 | |
6561 | if (unlikely(to_free)) |
6562 | kfree_skb_list(to_free); |
6563 | @@ -6932,8 +6913,8 @@ static int __netdev_walk_all_lower_dev(struct net_device *dev, |
6564 | return 0; |
6565 | } |
6566 | |
6567 | -static struct net_device *netdev_next_lower_dev_rcu(struct net_device *dev, |
6568 | - struct list_head **iter) |
6569 | +struct net_device *netdev_next_lower_dev_rcu(struct net_device *dev, |
6570 | + struct list_head **iter) |
6571 | { |
6572 | struct netdev_adjacent *lower; |
6573 | |
6574 | @@ -6945,6 +6926,7 @@ static struct net_device *netdev_next_lower_dev_rcu(struct net_device *dev, |
6575 | |
6576 | return lower->dev; |
6577 | } |
6578 | +EXPORT_SYMBOL(netdev_next_lower_dev_rcu); |
6579 | |
6580 | static u8 __netdev_upper_depth(struct net_device *dev) |
6581 | { |
6582 | diff --git a/net/core/fib_rules.c b/net/core/fib_rules.c |
6583 | index dd220ce7ca7a..bb11fc87bbae 100644 |
6584 | --- a/net/core/fib_rules.c |
6585 | +++ b/net/core/fib_rules.c |
6586 | @@ -967,7 +967,7 @@ static int fib_nl_fill_rule(struct sk_buff *skb, struct fib_rule *rule, |
6587 | |
6588 | frh = nlmsg_data(nlh); |
6589 | frh->family = ops->family; |
6590 | - frh->table = rule->table; |
6591 | + frh->table = rule->table < 256 ? rule->table : RT_TABLE_COMPAT; |
6592 | if (nla_put_u32(skb, FRA_TABLE, rule->table)) |
6593 | goto nla_put_failure; |
6594 | if (nla_put_u32(skb, FRA_SUPPRESS_PREFIXLEN, rule->suppress_prefixlen)) |
6595 | diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c |
6596 | index 7ae7065758bd..f3b7cb725c1b 100644 |
6597 | --- a/net/ipv4/udp.c |
6598 | +++ b/net/ipv4/udp.c |
6599 | @@ -1856,8 +1856,12 @@ int __udp_disconnect(struct sock *sk, int flags) |
6600 | inet->inet_dport = 0; |
6601 | sock_rps_reset_rxhash(sk); |
6602 | sk->sk_bound_dev_if = 0; |
6603 | - if (!(sk->sk_userlocks & SOCK_BINDADDR_LOCK)) |
6604 | + if (!(sk->sk_userlocks & SOCK_BINDADDR_LOCK)) { |
6605 | inet_reset_saddr(sk); |
6606 | + if (sk->sk_prot->rehash && |
6607 | + (sk->sk_userlocks & SOCK_BINDPORT_LOCK)) |
6608 | + sk->sk_prot->rehash(sk); |
6609 | + } |
6610 | |
6611 | if (!(sk->sk_userlocks & SOCK_BINDPORT_LOCK)) { |
6612 | sk->sk_prot->unhash(sk); |
6613 | diff --git a/net/ipv6/ip6_fib.c b/net/ipv6/ip6_fib.c |
6614 | index 6e2af411cd9c..c75274e0745c 100644 |
6615 | --- a/net/ipv6/ip6_fib.c |
6616 | +++ b/net/ipv6/ip6_fib.c |
6617 | @@ -1050,8 +1050,7 @@ static int fib6_add_rt2node(struct fib6_node *fn, struct fib6_info *rt, |
6618 | found++; |
6619 | break; |
6620 | } |
6621 | - if (rt_can_ecmp) |
6622 | - fallback_ins = fallback_ins ?: ins; |
6623 | + fallback_ins = fallback_ins ?: ins; |
6624 | goto next_iter; |
6625 | } |
6626 | |
6627 | @@ -1094,7 +1093,9 @@ next_iter: |
6628 | } |
6629 | |
6630 | if (fallback_ins && !found) { |
6631 | - /* No ECMP-able route found, replace first non-ECMP one */ |
6632 | + /* No matching route with same ecmp-able-ness found, replace |
6633 | + * first matching route |
6634 | + */ |
6635 | ins = fallback_ins; |
6636 | iter = rcu_dereference_protected(*ins, |
6637 | lockdep_is_held(&rt->fib6_table->tb6_lock)); |
6638 | diff --git a/net/ipv6/route.c b/net/ipv6/route.c |
6639 | index e4ed9c7b43b0..894c7370c1bd 100644 |
6640 | --- a/net/ipv6/route.c |
6641 | +++ b/net/ipv6/route.c |
6642 | @@ -5155,6 +5155,7 @@ static int ip6_route_multipath_add(struct fib6_config *cfg, |
6643 | */ |
6644 | cfg->fc_nlinfo.nlh->nlmsg_flags &= ~(NLM_F_EXCL | |
6645 | NLM_F_REPLACE); |
6646 | + cfg->fc_nlinfo.nlh->nlmsg_flags |= NLM_F_CREATE; |
6647 | nhn++; |
6648 | } |
6649 | |
6650 | diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c |
6651 | index 1e3b9d34aaa4..c7d8044ff0fa 100644 |
6652 | --- a/net/mac80211/mlme.c |
6653 | +++ b/net/mac80211/mlme.c |
6654 | @@ -2959,7 +2959,7 @@ static void ieee80211_rx_mgmt_auth(struct ieee80211_sub_if_data *sdata, |
6655 | (auth_transaction == 2 && |
6656 | ifmgd->auth_data->expected_transaction == 2)) { |
6657 | if (!ieee80211_mark_sta_auth(sdata, bssid)) |
6658 | - goto out_err; |
6659 | + return; /* ignore frame -- wait for timeout */ |
6660 | } else if (ifmgd->auth_data->algorithm == WLAN_AUTH_SAE && |
6661 | auth_transaction == 2) { |
6662 | sdata_info(sdata, "SAE peer confirmed\n"); |
6663 | @@ -2967,10 +2967,6 @@ static void ieee80211_rx_mgmt_auth(struct ieee80211_sub_if_data *sdata, |
6664 | } |
6665 | |
6666 | cfg80211_rx_mlme_mgmt(sdata->dev, (u8 *)mgmt, len); |
6667 | - return; |
6668 | - out_err: |
6669 | - mutex_unlock(&sdata->local->sta_mtx); |
6670 | - /* ignore frame -- wait for timeout */ |
6671 | } |
6672 | |
6673 | #define case_WLAN(type) \ |
6674 | diff --git a/net/mac80211/util.c b/net/mac80211/util.c |
6675 | index 32a7a53833c0..decd46b38393 100644 |
6676 | --- a/net/mac80211/util.c |
6677 | +++ b/net/mac80211/util.c |
6678 | @@ -1063,16 +1063,22 @@ _ieee802_11_parse_elems_crc(const u8 *start, size_t len, bool action, |
6679 | elem_parse_failed = true; |
6680 | break; |
6681 | case WLAN_EID_VHT_OPERATION: |
6682 | - if (elen >= sizeof(struct ieee80211_vht_operation)) |
6683 | + if (elen >= sizeof(struct ieee80211_vht_operation)) { |
6684 | elems->vht_operation = (void *)pos; |
6685 | - else |
6686 | - elem_parse_failed = true; |
6687 | + if (calc_crc) |
6688 | + crc = crc32_be(crc, pos - 2, elen + 2); |
6689 | + break; |
6690 | + } |
6691 | + elem_parse_failed = true; |
6692 | break; |
6693 | case WLAN_EID_OPMODE_NOTIF: |
6694 | - if (elen > 0) |
6695 | + if (elen > 0) { |
6696 | elems->opmode_notif = pos; |
6697 | - else |
6698 | - elem_parse_failed = true; |
6699 | + if (calc_crc) |
6700 | + crc = crc32_be(crc, pos - 2, elen + 2); |
6701 | + break; |
6702 | + } |
6703 | + elem_parse_failed = true; |
6704 | break; |
6705 | case WLAN_EID_MESH_ID: |
6706 | elems->mesh_id = pos; |
6707 | @@ -2987,10 +2993,22 @@ bool ieee80211_chandef_vht_oper(struct ieee80211_hw *hw, |
6708 | int cf0, cf1; |
6709 | int ccfs0, ccfs1, ccfs2; |
6710 | int ccf0, ccf1; |
6711 | + u32 vht_cap; |
6712 | + bool support_80_80 = false; |
6713 | + bool support_160 = false; |
6714 | |
6715 | if (!oper || !htop) |
6716 | return false; |
6717 | |
6718 | + vht_cap = hw->wiphy->bands[chandef->chan->band]->vht_cap.cap; |
6719 | + support_160 = (vht_cap & (IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK | |
6720 | + IEEE80211_VHT_CAP_EXT_NSS_BW_MASK)); |
6721 | + support_80_80 = ((vht_cap & |
6722 | + IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ) || |
6723 | + (vht_cap & IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ && |
6724 | + vht_cap & IEEE80211_VHT_CAP_EXT_NSS_BW_MASK) || |
6725 | + ((vht_cap & IEEE80211_VHT_CAP_EXT_NSS_BW_MASK) >> |
6726 | + IEEE80211_VHT_CAP_EXT_NSS_BW_SHIFT > 1)); |
6727 | ccfs0 = oper->center_freq_seg0_idx; |
6728 | ccfs1 = oper->center_freq_seg1_idx; |
6729 | ccfs2 = (le16_to_cpu(htop->operation_mode) & |
6730 | @@ -3018,10 +3036,10 @@ bool ieee80211_chandef_vht_oper(struct ieee80211_hw *hw, |
6731 | unsigned int diff; |
6732 | |
6733 | diff = abs(ccf1 - ccf0); |
6734 | - if (diff == 8) { |
6735 | + if ((diff == 8) && support_160) { |
6736 | new.width = NL80211_CHAN_WIDTH_160; |
6737 | new.center_freq1 = cf1; |
6738 | - } else if (diff > 8) { |
6739 | + } else if ((diff > 8) && support_80_80) { |
6740 | new.width = NL80211_CHAN_WIDTH_80P80; |
6741 | new.center_freq2 = cf1; |
6742 | } |
6743 | diff --git a/net/netfilter/ipset/ip_set_core.c b/net/netfilter/ipset/ip_set_core.c |
6744 | index a9df9dac57b2..75da200aa5d8 100644 |
6745 | --- a/net/netfilter/ipset/ip_set_core.c |
6746 | +++ b/net/netfilter/ipset/ip_set_core.c |
6747 | @@ -557,6 +557,20 @@ ip_set_rcu_get(struct net *net, ip_set_id_t index) |
6748 | return set; |
6749 | } |
6750 | |
6751 | +static inline void |
6752 | +ip_set_lock(struct ip_set *set) |
6753 | +{ |
6754 | + if (!set->variant->region_lock) |
6755 | + spin_lock_bh(&set->lock); |
6756 | +} |
6757 | + |
6758 | +static inline void |
6759 | +ip_set_unlock(struct ip_set *set) |
6760 | +{ |
6761 | + if (!set->variant->region_lock) |
6762 | + spin_unlock_bh(&set->lock); |
6763 | +} |
6764 | + |
6765 | int |
6766 | ip_set_test(ip_set_id_t index, const struct sk_buff *skb, |
6767 | const struct xt_action_param *par, struct ip_set_adt_opt *opt) |
6768 | @@ -578,9 +592,9 @@ ip_set_test(ip_set_id_t index, const struct sk_buff *skb, |
6769 | if (ret == -EAGAIN) { |
6770 | /* Type requests element to be completed */ |
6771 | pr_debug("element must be completed, ADD is triggered\n"); |
6772 | - spin_lock_bh(&set->lock); |
6773 | + ip_set_lock(set); |
6774 | set->variant->kadt(set, skb, par, IPSET_ADD, opt); |
6775 | - spin_unlock_bh(&set->lock); |
6776 | + ip_set_unlock(set); |
6777 | ret = 1; |
6778 | } else { |
6779 | /* --return-nomatch: invert matched element */ |
6780 | @@ -609,9 +623,9 @@ ip_set_add(ip_set_id_t index, const struct sk_buff *skb, |
6781 | !(opt->family == set->family || set->family == NFPROTO_UNSPEC)) |
6782 | return -IPSET_ERR_TYPE_MISMATCH; |
6783 | |
6784 | - spin_lock_bh(&set->lock); |
6785 | + ip_set_lock(set); |
6786 | ret = set->variant->kadt(set, skb, par, IPSET_ADD, opt); |
6787 | - spin_unlock_bh(&set->lock); |
6788 | + ip_set_unlock(set); |
6789 | |
6790 | return ret; |
6791 | } |
6792 | @@ -631,9 +645,9 @@ ip_set_del(ip_set_id_t index, const struct sk_buff *skb, |
6793 | !(opt->family == set->family || set->family == NFPROTO_UNSPEC)) |
6794 | return -IPSET_ERR_TYPE_MISMATCH; |
6795 | |
6796 | - spin_lock_bh(&set->lock); |
6797 | + ip_set_lock(set); |
6798 | ret = set->variant->kadt(set, skb, par, IPSET_DEL, opt); |
6799 | - spin_unlock_bh(&set->lock); |
6800 | + ip_set_unlock(set); |
6801 | |
6802 | return ret; |
6803 | } |
6804 | @@ -1098,9 +1112,9 @@ ip_set_flush_set(struct ip_set *set) |
6805 | { |
6806 | pr_debug("set: %s\n", set->name); |
6807 | |
6808 | - spin_lock_bh(&set->lock); |
6809 | + ip_set_lock(set); |
6810 | set->variant->flush(set); |
6811 | - spin_unlock_bh(&set->lock); |
6812 | + ip_set_unlock(set); |
6813 | } |
6814 | |
6815 | static int ip_set_flush(struct net *net, struct sock *ctnl, struct sk_buff *skb, |
6816 | @@ -1523,9 +1537,9 @@ call_ad(struct sock *ctnl, struct sk_buff *skb, struct ip_set *set, |
6817 | bool eexist = flags & IPSET_FLAG_EXIST, retried = false; |
6818 | |
6819 | do { |
6820 | - spin_lock_bh(&set->lock); |
6821 | + ip_set_lock(set); |
6822 | ret = set->variant->uadt(set, tb, adt, &lineno, flags, retried); |
6823 | - spin_unlock_bh(&set->lock); |
6824 | + ip_set_unlock(set); |
6825 | retried = true; |
6826 | } while (ret == -EAGAIN && |
6827 | set->variant->resize && |
6828 | diff --git a/net/netfilter/ipset/ip_set_hash_gen.h b/net/netfilter/ipset/ip_set_hash_gen.h |
6829 | index d098d87bc331..2389c9f89e48 100644 |
6830 | --- a/net/netfilter/ipset/ip_set_hash_gen.h |
6831 | +++ b/net/netfilter/ipset/ip_set_hash_gen.h |
6832 | @@ -7,13 +7,21 @@ |
6833 | #include <linux/rcupdate.h> |
6834 | #include <linux/jhash.h> |
6835 | #include <linux/types.h> |
6836 | +#include <linux/netfilter/nfnetlink.h> |
6837 | #include <linux/netfilter/ipset/ip_set.h> |
6838 | |
6839 | -#define __ipset_dereference_protected(p, c) rcu_dereference_protected(p, c) |
6840 | -#define ipset_dereference_protected(p, set) \ |
6841 | - __ipset_dereference_protected(p, lockdep_is_held(&(set)->lock)) |
6842 | - |
6843 | -#define rcu_dereference_bh_nfnl(p) rcu_dereference_bh_check(p, 1) |
6844 | +#define __ipset_dereference(p) \ |
6845 | + rcu_dereference_protected(p, 1) |
6846 | +#define ipset_dereference_nfnl(p) \ |
6847 | + rcu_dereference_protected(p, \ |
6848 | + lockdep_nfnl_is_held(NFNL_SUBSYS_IPSET)) |
6849 | +#define ipset_dereference_set(p, set) \ |
6850 | + rcu_dereference_protected(p, \ |
6851 | + lockdep_nfnl_is_held(NFNL_SUBSYS_IPSET) || \ |
6852 | + lockdep_is_held(&(set)->lock)) |
6853 | +#define ipset_dereference_bh_nfnl(p) \ |
6854 | + rcu_dereference_bh_check(p, \ |
6855 | + lockdep_nfnl_is_held(NFNL_SUBSYS_IPSET)) |
6856 | |
6857 | /* Hashing which uses arrays to resolve clashing. The hash table is resized |
6858 | * (doubled) when searching becomes too long. |
6859 | @@ -72,11 +80,35 @@ struct hbucket { |
6860 | __aligned(__alignof__(u64)); |
6861 | }; |
6862 | |
6863 | +/* Region size for locking == 2^HTABLE_REGION_BITS */ |
6864 | +#define HTABLE_REGION_BITS 10 |
6865 | +#define ahash_numof_locks(htable_bits) \ |
6866 | + ((htable_bits) < HTABLE_REGION_BITS ? 1 \ |
6867 | + : jhash_size((htable_bits) - HTABLE_REGION_BITS)) |
6868 | +#define ahash_sizeof_regions(htable_bits) \ |
6869 | + (ahash_numof_locks(htable_bits) * sizeof(struct ip_set_region)) |
6870 | +#define ahash_region(n, htable_bits) \ |
6871 | + ((n) % ahash_numof_locks(htable_bits)) |
6872 | +#define ahash_bucket_start(h, htable_bits) \ |
6873 | + ((htable_bits) < HTABLE_REGION_BITS ? 0 \ |
6874 | + : (h) * jhash_size(HTABLE_REGION_BITS)) |
6875 | +#define ahash_bucket_end(h, htable_bits) \ |
6876 | + ((htable_bits) < HTABLE_REGION_BITS ? jhash_size(htable_bits) \ |
6877 | + : ((h) + 1) * jhash_size(HTABLE_REGION_BITS)) |
6878 | + |
6879 | +struct htable_gc { |
6880 | + struct delayed_work dwork; |
6881 | + struct ip_set *set; /* Set the gc belongs to */ |
6882 | + u32 region; /* Last gc run position */ |
6883 | +}; |
6884 | + |
6885 | /* The hash table: the table size stored here in order to make resizing easy */ |
6886 | struct htable { |
6887 | atomic_t ref; /* References for resizing */ |
6888 | - atomic_t uref; /* References for dumping */ |
6889 | + atomic_t uref; /* References for dumping and gc */ |
6890 | u8 htable_bits; /* size of hash table == 2^htable_bits */ |
6891 | + u32 maxelem; /* Maxelem per region */ |
6892 | + struct ip_set_region *hregion; /* Region locks and ext sizes */ |
6893 | struct hbucket __rcu *bucket[0]; /* hashtable buckets */ |
6894 | }; |
6895 | |
6896 | @@ -162,6 +194,10 @@ htable_bits(u32 hashsize) |
6897 | #define NLEN 0 |
6898 | #endif /* IP_SET_HASH_WITH_NETS */ |
6899 | |
6900 | +#define SET_ELEM_EXPIRED(set, d) \ |
6901 | + (SET_WITH_TIMEOUT(set) && \ |
6902 | + ip_set_timeout_expired(ext_timeout(d, set))) |
6903 | + |
6904 | #endif /* _IP_SET_HASH_GEN_H */ |
6905 | |
6906 | #ifndef MTYPE |
6907 | @@ -205,10 +241,12 @@ htable_bits(u32 hashsize) |
6908 | #undef mtype_test_cidrs |
6909 | #undef mtype_test |
6910 | #undef mtype_uref |
6911 | -#undef mtype_expire |
6912 | #undef mtype_resize |
6913 | +#undef mtype_ext_size |
6914 | +#undef mtype_resize_ad |
6915 | #undef mtype_head |
6916 | #undef mtype_list |
6917 | +#undef mtype_gc_do |
6918 | #undef mtype_gc |
6919 | #undef mtype_gc_init |
6920 | #undef mtype_variant |
6921 | @@ -247,10 +285,12 @@ htable_bits(u32 hashsize) |
6922 | #define mtype_test_cidrs IPSET_TOKEN(MTYPE, _test_cidrs) |
6923 | #define mtype_test IPSET_TOKEN(MTYPE, _test) |
6924 | #define mtype_uref IPSET_TOKEN(MTYPE, _uref) |
6925 | -#define mtype_expire IPSET_TOKEN(MTYPE, _expire) |
6926 | #define mtype_resize IPSET_TOKEN(MTYPE, _resize) |
6927 | +#define mtype_ext_size IPSET_TOKEN(MTYPE, _ext_size) |
6928 | +#define mtype_resize_ad IPSET_TOKEN(MTYPE, _resize_ad) |
6929 | #define mtype_head IPSET_TOKEN(MTYPE, _head) |
6930 | #define mtype_list IPSET_TOKEN(MTYPE, _list) |
6931 | +#define mtype_gc_do IPSET_TOKEN(MTYPE, _gc_do) |
6932 | #define mtype_gc IPSET_TOKEN(MTYPE, _gc) |
6933 | #define mtype_gc_init IPSET_TOKEN(MTYPE, _gc_init) |
6934 | #define mtype_variant IPSET_TOKEN(MTYPE, _variant) |
6935 | @@ -275,8 +315,7 @@ htable_bits(u32 hashsize) |
6936 | /* The generic hash structure */ |
6937 | struct htype { |
6938 | struct htable __rcu *table; /* the hash table */ |
6939 | - struct timer_list gc; /* garbage collection when timeout enabled */ |
6940 | - struct ip_set *set; /* attached to this ip_set */ |
6941 | + struct htable_gc gc; /* gc workqueue */ |
6942 | u32 maxelem; /* max elements in the hash */ |
6943 | u32 initval; /* random jhash init value */ |
6944 | #ifdef IP_SET_HASH_WITH_MARKMASK |
6945 | @@ -288,21 +327,33 @@ struct htype { |
6946 | #ifdef IP_SET_HASH_WITH_NETMASK |
6947 | u8 netmask; /* netmask value for subnets to store */ |
6948 | #endif |
6949 | + struct list_head ad; /* Resize add|del backlist */ |
6950 | struct mtype_elem next; /* temporary storage for uadd */ |
6951 | #ifdef IP_SET_HASH_WITH_NETS |
6952 | struct net_prefixes nets[NLEN]; /* book-keeping of prefixes */ |
6953 | #endif |
6954 | }; |
6955 | |
6956 | +/* ADD|DEL entries saved during resize */ |
6957 | +struct mtype_resize_ad { |
6958 | + struct list_head list; |
6959 | + enum ipset_adt ad; /* ADD|DEL element */ |
6960 | + struct mtype_elem d; /* Element value */ |
6961 | + struct ip_set_ext ext; /* Extensions for ADD */ |
6962 | + struct ip_set_ext mext; /* Target extensions for ADD */ |
6963 | + u32 flags; /* Flags for ADD */ |
6964 | +}; |
6965 | + |
6966 | #ifdef IP_SET_HASH_WITH_NETS |
6967 | /* Network cidr size book keeping when the hash stores different |
6968 | * sized networks. cidr == real cidr + 1 to support /0. |
6969 | */ |
6970 | static void |
6971 | -mtype_add_cidr(struct htype *h, u8 cidr, u8 n) |
6972 | +mtype_add_cidr(struct ip_set *set, struct htype *h, u8 cidr, u8 n) |
6973 | { |
6974 | int i, j; |
6975 | |
6976 | + spin_lock_bh(&set->lock); |
6977 | /* Add in increasing prefix order, so larger cidr first */ |
6978 | for (i = 0, j = -1; i < NLEN && h->nets[i].cidr[n]; i++) { |
6979 | if (j != -1) { |
6980 | @@ -311,7 +362,7 @@ mtype_add_cidr(struct htype *h, u8 cidr, u8 n) |
6981 | j = i; |
6982 | } else if (h->nets[i].cidr[n] == cidr) { |
6983 | h->nets[CIDR_POS(cidr)].nets[n]++; |
6984 | - return; |
6985 | + goto unlock; |
6986 | } |
6987 | } |
6988 | if (j != -1) { |
6989 | @@ -320,24 +371,29 @@ mtype_add_cidr(struct htype *h, u8 cidr, u8 n) |
6990 | } |
6991 | h->nets[i].cidr[n] = cidr; |
6992 | h->nets[CIDR_POS(cidr)].nets[n] = 1; |
6993 | +unlock: |
6994 | + spin_unlock_bh(&set->lock); |
6995 | } |
6996 | |
6997 | static void |
6998 | -mtype_del_cidr(struct htype *h, u8 cidr, u8 n) |
6999 | +mtype_del_cidr(struct ip_set *set, struct htype *h, u8 cidr, u8 n) |
7000 | { |
7001 | u8 i, j, net_end = NLEN - 1; |
7002 | |
7003 | + spin_lock_bh(&set->lock); |
7004 | for (i = 0; i < NLEN; i++) { |
7005 | if (h->nets[i].cidr[n] != cidr) |
7006 | continue; |
7007 | h->nets[CIDR_POS(cidr)].nets[n]--; |
7008 | if (h->nets[CIDR_POS(cidr)].nets[n] > 0) |
7009 | - return; |
7010 | + goto unlock; |
7011 | for (j = i; j < net_end && h->nets[j].cidr[n]; j++) |
7012 | h->nets[j].cidr[n] = h->nets[j + 1].cidr[n]; |
7013 | h->nets[j].cidr[n] = 0; |
7014 | - return; |
7015 | + goto unlock; |
7016 | } |
7017 | +unlock: |
7018 | + spin_unlock_bh(&set->lock); |
7019 | } |
7020 | #endif |
7021 | |
7022 | @@ -345,7 +401,7 @@ mtype_del_cidr(struct htype *h, u8 cidr, u8 n) |
7023 | static size_t |
7024 | mtype_ahash_memsize(const struct htype *h, const struct htable *t) |
7025 | { |
7026 | - return sizeof(*h) + sizeof(*t); |
7027 | + return sizeof(*h) + sizeof(*t) + ahash_sizeof_regions(t->htable_bits); |
7028 | } |
7029 | |
7030 | /* Get the ith element from the array block n */ |
7031 | @@ -369,24 +425,29 @@ mtype_flush(struct ip_set *set) |
7032 | struct htype *h = set->data; |
7033 | struct htable *t; |
7034 | struct hbucket *n; |
7035 | - u32 i; |
7036 | - |
7037 | - t = ipset_dereference_protected(h->table, set); |
7038 | - for (i = 0; i < jhash_size(t->htable_bits); i++) { |
7039 | - n = __ipset_dereference_protected(hbucket(t, i), 1); |
7040 | - if (!n) |
7041 | - continue; |
7042 | - if (set->extensions & IPSET_EXT_DESTROY) |
7043 | - mtype_ext_cleanup(set, n); |
7044 | - /* FIXME: use slab cache */ |
7045 | - rcu_assign_pointer(hbucket(t, i), NULL); |
7046 | - kfree_rcu(n, rcu); |
7047 | + u32 r, i; |
7048 | + |
7049 | + t = ipset_dereference_nfnl(h->table); |
7050 | + for (r = 0; r < ahash_numof_locks(t->htable_bits); r++) { |
7051 | + spin_lock_bh(&t->hregion[r].lock); |
7052 | + for (i = ahash_bucket_start(r, t->htable_bits); |
7053 | + i < ahash_bucket_end(r, t->htable_bits); i++) { |
7054 | + n = __ipset_dereference(hbucket(t, i)); |
7055 | + if (!n) |
7056 | + continue; |
7057 | + if (set->extensions & IPSET_EXT_DESTROY) |
7058 | + mtype_ext_cleanup(set, n); |
7059 | + /* FIXME: use slab cache */ |
7060 | + rcu_assign_pointer(hbucket(t, i), NULL); |
7061 | + kfree_rcu(n, rcu); |
7062 | + } |
7063 | + t->hregion[r].ext_size = 0; |
7064 | + t->hregion[r].elements = 0; |
7065 | + spin_unlock_bh(&t->hregion[r].lock); |
7066 | } |
7067 | #ifdef IP_SET_HASH_WITH_NETS |
7068 | memset(h->nets, 0, sizeof(h->nets)); |
7069 | #endif |
7070 | - set->elements = 0; |
7071 | - set->ext_size = 0; |
7072 | } |
7073 | |
7074 | /* Destroy the hashtable part of the set */ |
7075 | @@ -397,7 +458,7 @@ mtype_ahash_destroy(struct ip_set *set, struct htable *t, bool ext_destroy) |
7076 | u32 i; |
7077 | |
7078 | for (i = 0; i < jhash_size(t->htable_bits); i++) { |
7079 | - n = __ipset_dereference_protected(hbucket(t, i), 1); |
7080 | + n = __ipset_dereference(hbucket(t, i)); |
7081 | if (!n) |
7082 | continue; |
7083 | if (set->extensions & IPSET_EXT_DESTROY && ext_destroy) |
7084 | @@ -406,6 +467,7 @@ mtype_ahash_destroy(struct ip_set *set, struct htable *t, bool ext_destroy) |
7085 | kfree(n); |
7086 | } |
7087 | |
7088 | + ip_set_free(t->hregion); |
7089 | ip_set_free(t); |
7090 | } |
7091 | |
7092 | @@ -414,28 +476,21 @@ static void |
7093 | mtype_destroy(struct ip_set *set) |
7094 | { |
7095 | struct htype *h = set->data; |
7096 | + struct list_head *l, *lt; |
7097 | |
7098 | if (SET_WITH_TIMEOUT(set)) |
7099 | - del_timer_sync(&h->gc); |
7100 | + cancel_delayed_work_sync(&h->gc.dwork); |
7101 | |
7102 | - mtype_ahash_destroy(set, |
7103 | - __ipset_dereference_protected(h->table, 1), true); |
7104 | + mtype_ahash_destroy(set, ipset_dereference_nfnl(h->table), true); |
7105 | + list_for_each_safe(l, lt, &h->ad) { |
7106 | + list_del(l); |
7107 | + kfree(l); |
7108 | + } |
7109 | kfree(h); |
7110 | |
7111 | set->data = NULL; |
7112 | } |
7113 | |
7114 | -static void |
7115 | -mtype_gc_init(struct ip_set *set, void (*gc)(struct timer_list *t)) |
7116 | -{ |
7117 | - struct htype *h = set->data; |
7118 | - |
7119 | - timer_setup(&h->gc, gc, 0); |
7120 | - mod_timer(&h->gc, jiffies + IPSET_GC_PERIOD(set->timeout) * HZ); |
7121 | - pr_debug("gc initialized, run in every %u\n", |
7122 | - IPSET_GC_PERIOD(set->timeout)); |
7123 | -} |
7124 | - |
7125 | static bool |
7126 | mtype_same_set(const struct ip_set *a, const struct ip_set *b) |
7127 | { |
7128 | @@ -454,11 +509,9 @@ mtype_same_set(const struct ip_set *a, const struct ip_set *b) |
7129 | a->extensions == b->extensions; |
7130 | } |
7131 | |
7132 | -/* Delete expired elements from the hashtable */ |
7133 | static void |
7134 | -mtype_expire(struct ip_set *set, struct htype *h) |
7135 | +mtype_gc_do(struct ip_set *set, struct htype *h, struct htable *t, u32 r) |
7136 | { |
7137 | - struct htable *t; |
7138 | struct hbucket *n, *tmp; |
7139 | struct mtype_elem *data; |
7140 | u32 i, j, d; |
7141 | @@ -466,10 +519,12 @@ mtype_expire(struct ip_set *set, struct htype *h) |
7142 | #ifdef IP_SET_HASH_WITH_NETS |
7143 | u8 k; |
7144 | #endif |
7145 | + u8 htable_bits = t->htable_bits; |
7146 | |
7147 | - t = ipset_dereference_protected(h->table, set); |
7148 | - for (i = 0; i < jhash_size(t->htable_bits); i++) { |
7149 | - n = __ipset_dereference_protected(hbucket(t, i), 1); |
7150 | + spin_lock_bh(&t->hregion[r].lock); |
7151 | + for (i = ahash_bucket_start(r, htable_bits); |
7152 | + i < ahash_bucket_end(r, htable_bits); i++) { |
7153 | + n = __ipset_dereference(hbucket(t, i)); |
7154 | if (!n) |
7155 | continue; |
7156 | for (j = 0, d = 0; j < n->pos; j++) { |
7157 | @@ -485,58 +540,100 @@ mtype_expire(struct ip_set *set, struct htype *h) |
7158 | smp_mb__after_atomic(); |
7159 | #ifdef IP_SET_HASH_WITH_NETS |
7160 | for (k = 0; k < IPSET_NET_COUNT; k++) |
7161 | - mtype_del_cidr(h, |
7162 | + mtype_del_cidr(set, h, |
7163 | NCIDR_PUT(DCIDR_GET(data->cidr, k)), |
7164 | k); |
7165 | #endif |
7166 | + t->hregion[r].elements--; |
7167 | ip_set_ext_destroy(set, data); |
7168 | - set->elements--; |
7169 | d++; |
7170 | } |
7171 | if (d >= AHASH_INIT_SIZE) { |
7172 | if (d >= n->size) { |
7173 | + t->hregion[r].ext_size -= |
7174 | + ext_size(n->size, dsize); |
7175 | rcu_assign_pointer(hbucket(t, i), NULL); |
7176 | kfree_rcu(n, rcu); |
7177 | continue; |
7178 | } |
7179 | tmp = kzalloc(sizeof(*tmp) + |
7180 | - (n->size - AHASH_INIT_SIZE) * dsize, |
7181 | - GFP_ATOMIC); |
7182 | + (n->size - AHASH_INIT_SIZE) * dsize, |
7183 | + GFP_ATOMIC); |
7184 | if (!tmp) |
7185 | - /* Still try to delete expired elements */ |
7186 | + /* Still try to delete expired elements. */ |
7187 | continue; |
7188 | tmp->size = n->size - AHASH_INIT_SIZE; |
7189 | for (j = 0, d = 0; j < n->pos; j++) { |
7190 | if (!test_bit(j, n->used)) |
7191 | continue; |
7192 | data = ahash_data(n, j, dsize); |
7193 | - memcpy(tmp->value + d * dsize, data, dsize); |
7194 | + memcpy(tmp->value + d * dsize, |
7195 | + data, dsize); |
7196 | set_bit(d, tmp->used); |
7197 | d++; |
7198 | } |
7199 | tmp->pos = d; |
7200 | - set->ext_size -= ext_size(AHASH_INIT_SIZE, dsize); |
7201 | + t->hregion[r].ext_size -= |
7202 | + ext_size(AHASH_INIT_SIZE, dsize); |
7203 | rcu_assign_pointer(hbucket(t, i), tmp); |
7204 | kfree_rcu(n, rcu); |
7205 | } |
7206 | } |
7207 | + spin_unlock_bh(&t->hregion[r].lock); |
7208 | } |
7209 | |
7210 | static void |
7211 | -mtype_gc(struct timer_list *t) |
7212 | +mtype_gc(struct work_struct *work) |
7213 | { |
7214 | - struct htype *h = from_timer(h, t, gc); |
7215 | - struct ip_set *set = h->set; |
7216 | + struct htable_gc *gc; |
7217 | + struct ip_set *set; |
7218 | + struct htype *h; |
7219 | + struct htable *t; |
7220 | + u32 r, numof_locks; |
7221 | + unsigned int next_run; |
7222 | + |
7223 | + gc = container_of(work, struct htable_gc, dwork.work); |
7224 | + set = gc->set; |
7225 | + h = set->data; |
7226 | |
7227 | - pr_debug("called\n"); |
7228 | spin_lock_bh(&set->lock); |
7229 | - mtype_expire(set, h); |
7230 | + t = ipset_dereference_set(h->table, set); |
7231 | + atomic_inc(&t->uref); |
7232 | + numof_locks = ahash_numof_locks(t->htable_bits); |
7233 | + r = gc->region++; |
7234 | + if (r >= numof_locks) { |
7235 | + r = gc->region = 0; |
7236 | + } |
7237 | + next_run = (IPSET_GC_PERIOD(set->timeout) * HZ) / numof_locks; |
7238 | + if (next_run < HZ/10) |
7239 | + next_run = HZ/10; |
7240 | spin_unlock_bh(&set->lock); |
7241 | |
7242 | - h->gc.expires = jiffies + IPSET_GC_PERIOD(set->timeout) * HZ; |
7243 | - add_timer(&h->gc); |
7244 | + mtype_gc_do(set, h, t, r); |
7245 | + |
7246 | + if (atomic_dec_and_test(&t->uref) && atomic_read(&t->ref)) { |
7247 | + pr_debug("Table destroy after resize by expire: %p\n", t); |
7248 | + mtype_ahash_destroy(set, t, false); |
7249 | + } |
7250 | + |
7251 | + queue_delayed_work(system_power_efficient_wq, &gc->dwork, next_run); |
7252 | + |
7253 | +} |
7254 | + |
7255 | +static void |
7256 | +mtype_gc_init(struct htable_gc *gc) |
7257 | +{ |
7258 | + INIT_DEFERRABLE_WORK(&gc->dwork, mtype_gc); |
7259 | + queue_delayed_work(system_power_efficient_wq, &gc->dwork, HZ); |
7260 | } |
7261 | |
7262 | +static int |
7263 | +mtype_add(struct ip_set *set, void *value, const struct ip_set_ext *ext, |
7264 | + struct ip_set_ext *mext, u32 flags); |
7265 | +static int |
7266 | +mtype_del(struct ip_set *set, void *value, const struct ip_set_ext *ext, |
7267 | + struct ip_set_ext *mext, u32 flags); |
7268 | + |
7269 | /* Resize a hash: create a new hash table with doubling the hashsize |
7270 | * and inserting the elements to it. Repeat until we succeed or |
7271 | * fail due to memory pressures. |
7272 | @@ -547,7 +644,7 @@ mtype_resize(struct ip_set *set, bool retried) |
7273 | struct htype *h = set->data; |
7274 | struct htable *t, *orig; |
7275 | u8 htable_bits; |
7276 | - size_t extsize, dsize = set->dsize; |
7277 | + size_t dsize = set->dsize; |
7278 | #ifdef IP_SET_HASH_WITH_NETS |
7279 | u8 flags; |
7280 | struct mtype_elem *tmp; |
7281 | @@ -555,7 +652,9 @@ mtype_resize(struct ip_set *set, bool retried) |
7282 | struct mtype_elem *data; |
7283 | struct mtype_elem *d; |
7284 | struct hbucket *n, *m; |
7285 | - u32 i, j, key; |
7286 | + struct list_head *l, *lt; |
7287 | + struct mtype_resize_ad *x; |
7288 | + u32 i, j, r, nr, key; |
7289 | int ret; |
7290 | |
7291 | #ifdef IP_SET_HASH_WITH_NETS |
7292 | @@ -563,10 +662,8 @@ mtype_resize(struct ip_set *set, bool retried) |
7293 | if (!tmp) |
7294 | return -ENOMEM; |
7295 | #endif |
7296 | - rcu_read_lock_bh(); |
7297 | - orig = rcu_dereference_bh_nfnl(h->table); |
7298 | + orig = ipset_dereference_bh_nfnl(h->table); |
7299 | htable_bits = orig->htable_bits; |
7300 | - rcu_read_unlock_bh(); |
7301 | |
7302 | retry: |
7303 | ret = 0; |
7304 | @@ -583,88 +680,124 @@ retry: |
7305 | ret = -ENOMEM; |
7306 | goto out; |
7307 | } |
7308 | + t->hregion = ip_set_alloc(ahash_sizeof_regions(htable_bits)); |
7309 | + if (!t->hregion) { |
7310 | + kfree(t); |
7311 | + ret = -ENOMEM; |
7312 | + goto out; |
7313 | + } |
7314 | t->htable_bits = htable_bits; |
7315 | + t->maxelem = h->maxelem / ahash_numof_locks(htable_bits); |
7316 | + for (i = 0; i < ahash_numof_locks(htable_bits); i++) |
7317 | + spin_lock_init(&t->hregion[i].lock); |
7318 | |
7319 | - spin_lock_bh(&set->lock); |
7320 | - orig = __ipset_dereference_protected(h->table, 1); |
7321 | - /* There can't be another parallel resizing, but dumping is possible */ |
7322 | + /* There can't be another parallel resizing, |
7323 | + * but dumping, gc, kernel side add/del are possible |
7324 | + */ |
7325 | + orig = ipset_dereference_bh_nfnl(h->table); |
7326 | atomic_set(&orig->ref, 1); |
7327 | atomic_inc(&orig->uref); |
7328 | - extsize = 0; |
7329 | pr_debug("attempt to resize set %s from %u to %u, t %p\n", |
7330 | set->name, orig->htable_bits, htable_bits, orig); |
7331 | - for (i = 0; i < jhash_size(orig->htable_bits); i++) { |
7332 | - n = __ipset_dereference_protected(hbucket(orig, i), 1); |
7333 | - if (!n) |
7334 | - continue; |
7335 | - for (j = 0; j < n->pos; j++) { |
7336 | - if (!test_bit(j, n->used)) |
7337 | + for (r = 0; r < ahash_numof_locks(orig->htable_bits); r++) { |
7338 | + /* Expire may replace a hbucket with another one */ |
7339 | + rcu_read_lock_bh(); |
7340 | + for (i = ahash_bucket_start(r, orig->htable_bits); |
7341 | + i < ahash_bucket_end(r, orig->htable_bits); i++) { |
7342 | + n = __ipset_dereference(hbucket(orig, i)); |
7343 | + if (!n) |
7344 | continue; |
7345 | - data = ahash_data(n, j, dsize); |
7346 | + for (j = 0; j < n->pos; j++) { |
7347 | + if (!test_bit(j, n->used)) |
7348 | + continue; |
7349 | + data = ahash_data(n, j, dsize); |
7350 | + if (SET_ELEM_EXPIRED(set, data)) |
7351 | + continue; |
7352 | #ifdef IP_SET_HASH_WITH_NETS |
7353 | - /* We have readers running parallel with us, |
7354 | - * so the live data cannot be modified. |
7355 | - */ |
7356 | - flags = 0; |
7357 | - memcpy(tmp, data, dsize); |
7358 | - data = tmp; |
7359 | - mtype_data_reset_flags(data, &flags); |
7360 | + /* We have readers running parallel with us, |
7361 | + * so the live data cannot be modified. |
7362 | + */ |
7363 | + flags = 0; |
7364 | + memcpy(tmp, data, dsize); |
7365 | + data = tmp; |
7366 | + mtype_data_reset_flags(data, &flags); |
7367 | #endif |
7368 | - key = HKEY(data, h->initval, htable_bits); |
7369 | - m = __ipset_dereference_protected(hbucket(t, key), 1); |
7370 | - if (!m) { |
7371 | - m = kzalloc(sizeof(*m) + |
7372 | + key = HKEY(data, h->initval, htable_bits); |
7373 | + m = __ipset_dereference(hbucket(t, key)); |
7374 | + nr = ahash_region(key, htable_bits); |
7375 | + if (!m) { |
7376 | + m = kzalloc(sizeof(*m) + |
7377 | AHASH_INIT_SIZE * dsize, |
7378 | GFP_ATOMIC); |
7379 | - if (!m) { |
7380 | - ret = -ENOMEM; |
7381 | - goto cleanup; |
7382 | - } |
7383 | - m->size = AHASH_INIT_SIZE; |
7384 | - extsize += ext_size(AHASH_INIT_SIZE, dsize); |
7385 | - RCU_INIT_POINTER(hbucket(t, key), m); |
7386 | - } else if (m->pos >= m->size) { |
7387 | - struct hbucket *ht; |
7388 | - |
7389 | - if (m->size >= AHASH_MAX(h)) { |
7390 | - ret = -EAGAIN; |
7391 | - } else { |
7392 | - ht = kzalloc(sizeof(*ht) + |
7393 | + if (!m) { |
7394 | + ret = -ENOMEM; |
7395 | + goto cleanup; |
7396 | + } |
7397 | + m->size = AHASH_INIT_SIZE; |
7398 | + t->hregion[nr].ext_size += |
7399 | + ext_size(AHASH_INIT_SIZE, |
7400 | + dsize); |
7401 | + RCU_INIT_POINTER(hbucket(t, key), m); |
7402 | + } else if (m->pos >= m->size) { |
7403 | + struct hbucket *ht; |
7404 | + |
7405 | + if (m->size >= AHASH_MAX(h)) { |
7406 | + ret = -EAGAIN; |
7407 | + } else { |
7408 | + ht = kzalloc(sizeof(*ht) + |
7409 | (m->size + AHASH_INIT_SIZE) |
7410 | * dsize, |
7411 | GFP_ATOMIC); |
7412 | - if (!ht) |
7413 | - ret = -ENOMEM; |
7414 | + if (!ht) |
7415 | + ret = -ENOMEM; |
7416 | + } |
7417 | + if (ret < 0) |
7418 | + goto cleanup; |
7419 | + memcpy(ht, m, sizeof(struct hbucket) + |
7420 | + m->size * dsize); |
7421 | + ht->size = m->size + AHASH_INIT_SIZE; |
7422 | + t->hregion[nr].ext_size += |
7423 | + ext_size(AHASH_INIT_SIZE, |
7424 | + dsize); |
7425 | + kfree(m); |
7426 | + m = ht; |
7427 | + RCU_INIT_POINTER(hbucket(t, key), ht); |
7428 | } |
7429 | - if (ret < 0) |
7430 | - goto cleanup; |
7431 | - memcpy(ht, m, sizeof(struct hbucket) + |
7432 | - m->size * dsize); |
7433 | - ht->size = m->size + AHASH_INIT_SIZE; |
7434 | - extsize += ext_size(AHASH_INIT_SIZE, dsize); |
7435 | - kfree(m); |
7436 | - m = ht; |
7437 | - RCU_INIT_POINTER(hbucket(t, key), ht); |
7438 | - } |
7439 | - d = ahash_data(m, m->pos, dsize); |
7440 | - memcpy(d, data, dsize); |
7441 | - set_bit(m->pos++, m->used); |
7442 | + d = ahash_data(m, m->pos, dsize); |
7443 | + memcpy(d, data, dsize); |
7444 | + set_bit(m->pos++, m->used); |
7445 | + t->hregion[nr].elements++; |
7446 | #ifdef IP_SET_HASH_WITH_NETS |
7447 | - mtype_data_reset_flags(d, &flags); |
7448 | + mtype_data_reset_flags(d, &flags); |
7449 | #endif |
7450 | + } |
7451 | } |
7452 | + rcu_read_unlock_bh(); |
7453 | } |
7454 | - rcu_assign_pointer(h->table, t); |
7455 | - set->ext_size = extsize; |
7456 | |
7457 | - spin_unlock_bh(&set->lock); |
7458 | + /* There can't be any other writer. */ |
7459 | + rcu_assign_pointer(h->table, t); |
7460 | |
7461 | /* Give time to other readers of the set */ |
7462 | synchronize_rcu(); |
7463 | |
7464 | pr_debug("set %s resized from %u (%p) to %u (%p)\n", set->name, |
7465 | orig->htable_bits, orig, t->htable_bits, t); |
7466 | - /* If there's nobody else dumping the table, destroy it */ |
7467 | + /* Add/delete elements processed by the SET target during resize. |
7468 | + * Kernel-side add cannot trigger a resize and userspace actions |
7469 | + * are serialized by the mutex. |
7470 | + */ |
7471 | + list_for_each_safe(l, lt, &h->ad) { |
7472 | + x = list_entry(l, struct mtype_resize_ad, list); |
7473 | + if (x->ad == IPSET_ADD) { |
7474 | + mtype_add(set, &x->d, &x->ext, &x->mext, x->flags); |
7475 | + } else { |
7476 | + mtype_del(set, &x->d, NULL, NULL, 0); |
7477 | + } |
7478 | + list_del(l); |
7479 | + kfree(l); |
7480 | + } |
7481 | + /* If there's nobody else using the table, destroy it */ |
7482 | if (atomic_dec_and_test(&orig->uref)) { |
7483 | pr_debug("Table destroy by resize %p\n", orig); |
7484 | mtype_ahash_destroy(set, orig, false); |
7485 | @@ -677,15 +810,44 @@ out: |
7486 | return ret; |
7487 | |
7488 | cleanup: |
7489 | + rcu_read_unlock_bh(); |
7490 | atomic_set(&orig->ref, 0); |
7491 | atomic_dec(&orig->uref); |
7492 | - spin_unlock_bh(&set->lock); |
7493 | mtype_ahash_destroy(set, t, false); |
7494 | if (ret == -EAGAIN) |
7495 | goto retry; |
7496 | goto out; |
7497 | } |
7498 | |
7499 | +/* Get the current number of elements and ext_size in the set */ |
7500 | +static void |
7501 | +mtype_ext_size(struct ip_set *set, u32 *elements, size_t *ext_size) |
7502 | +{ |
7503 | + struct htype *h = set->data; |
7504 | + const struct htable *t; |
7505 | + u32 i, j, r; |
7506 | + struct hbucket *n; |
7507 | + struct mtype_elem *data; |
7508 | + |
7509 | + t = rcu_dereference_bh(h->table); |
7510 | + for (r = 0; r < ahash_numof_locks(t->htable_bits); r++) { |
7511 | + for (i = ahash_bucket_start(r, t->htable_bits); |
7512 | + i < ahash_bucket_end(r, t->htable_bits); i++) { |
7513 | + n = rcu_dereference_bh(hbucket(t, i)); |
7514 | + if (!n) |
7515 | + continue; |
7516 | + for (j = 0; j < n->pos; j++) { |
7517 | + if (!test_bit(j, n->used)) |
7518 | + continue; |
7519 | + data = ahash_data(n, j, set->dsize); |
7520 | + if (!SET_ELEM_EXPIRED(set, data)) |
7521 | + (*elements)++; |
7522 | + } |
7523 | + } |
7524 | + *ext_size += t->hregion[r].ext_size; |
7525 | + } |
7526 | +} |
7527 | + |
7528 | /* Add an element to a hash and update the internal counters when succeeded, |
7529 | * otherwise report the proper error code. |
7530 | */ |
7531 | @@ -698,32 +860,49 @@ mtype_add(struct ip_set *set, void *value, const struct ip_set_ext *ext, |
7532 | const struct mtype_elem *d = value; |
7533 | struct mtype_elem *data; |
7534 | struct hbucket *n, *old = ERR_PTR(-ENOENT); |
7535 | - int i, j = -1; |
7536 | + int i, j = -1, ret; |
7537 | bool flag_exist = flags & IPSET_FLAG_EXIST; |
7538 | bool deleted = false, forceadd = false, reuse = false; |
7539 | - u32 key, multi = 0; |
7540 | + u32 r, key, multi = 0, elements, maxelem; |
7541 | |
7542 | - if (set->elements >= h->maxelem) { |
7543 | - if (SET_WITH_TIMEOUT(set)) |
7544 | - /* FIXME: when set is full, we slow down here */ |
7545 | - mtype_expire(set, h); |
7546 | - if (set->elements >= h->maxelem && SET_WITH_FORCEADD(set)) |
7547 | + rcu_read_lock_bh(); |
7548 | + t = rcu_dereference_bh(h->table); |
7549 | + key = HKEY(value, h->initval, t->htable_bits); |
7550 | + r = ahash_region(key, t->htable_bits); |
7551 | + atomic_inc(&t->uref); |
7552 | + elements = t->hregion[r].elements; |
7553 | + maxelem = t->maxelem; |
7554 | + if (elements >= maxelem) { |
7555 | + u32 e; |
7556 | + if (SET_WITH_TIMEOUT(set)) { |
7557 | + rcu_read_unlock_bh(); |
7558 | + mtype_gc_do(set, h, t, r); |
7559 | + rcu_read_lock_bh(); |
7560 | + } |
7561 | + maxelem = h->maxelem; |
7562 | + elements = 0; |
7563 | + for (e = 0; e < ahash_numof_locks(t->htable_bits); e++) |
7564 | + elements += t->hregion[e].elements; |
7565 | + if (elements >= maxelem && SET_WITH_FORCEADD(set)) |
7566 | forceadd = true; |
7567 | } |
7568 | + rcu_read_unlock_bh(); |
7569 | |
7570 | - t = ipset_dereference_protected(h->table, set); |
7571 | - key = HKEY(value, h->initval, t->htable_bits); |
7572 | - n = __ipset_dereference_protected(hbucket(t, key), 1); |
7573 | + spin_lock_bh(&t->hregion[r].lock); |
7574 | + n = rcu_dereference_bh(hbucket(t, key)); |
7575 | if (!n) { |
7576 | - if (forceadd || set->elements >= h->maxelem) |
7577 | + if (forceadd || elements >= maxelem) |
7578 | goto set_full; |
7579 | old = NULL; |
7580 | n = kzalloc(sizeof(*n) + AHASH_INIT_SIZE * set->dsize, |
7581 | GFP_ATOMIC); |
7582 | - if (!n) |
7583 | - return -ENOMEM; |
7584 | + if (!n) { |
7585 | + ret = -ENOMEM; |
7586 | + goto unlock; |
7587 | + } |
7588 | n->size = AHASH_INIT_SIZE; |
7589 | - set->ext_size += ext_size(AHASH_INIT_SIZE, set->dsize); |
7590 | + t->hregion[r].ext_size += |
7591 | + ext_size(AHASH_INIT_SIZE, set->dsize); |
7592 | goto copy_elem; |
7593 | } |
7594 | for (i = 0; i < n->pos; i++) { |
7595 | @@ -737,38 +916,37 @@ mtype_add(struct ip_set *set, void *value, const struct ip_set_ext *ext, |
7596 | } |
7597 | data = ahash_data(n, i, set->dsize); |
7598 | if (mtype_data_equal(data, d, &multi)) { |
7599 | - if (flag_exist || |
7600 | - (SET_WITH_TIMEOUT(set) && |
7601 | - ip_set_timeout_expired(ext_timeout(data, set)))) { |
7602 | + if (flag_exist || SET_ELEM_EXPIRED(set, data)) { |
7603 | /* Just the extensions could be overwritten */ |
7604 | j = i; |
7605 | goto overwrite_extensions; |
7606 | } |
7607 | - return -IPSET_ERR_EXIST; |
7608 | + ret = -IPSET_ERR_EXIST; |
7609 | + goto unlock; |
7610 | } |
7611 | /* Reuse first timed out entry */ |
7612 | - if (SET_WITH_TIMEOUT(set) && |
7613 | - ip_set_timeout_expired(ext_timeout(data, set)) && |
7614 | - j == -1) { |
7615 | + if (SET_ELEM_EXPIRED(set, data) && j == -1) { |
7616 | j = i; |
7617 | reuse = true; |
7618 | } |
7619 | } |
7620 | if (reuse || forceadd) { |
7621 | + if (j == -1) |
7622 | + j = 0; |
7623 | data = ahash_data(n, j, set->dsize); |
7624 | if (!deleted) { |
7625 | #ifdef IP_SET_HASH_WITH_NETS |
7626 | for (i = 0; i < IPSET_NET_COUNT; i++) |
7627 | - mtype_del_cidr(h, |
7628 | + mtype_del_cidr(set, h, |
7629 | NCIDR_PUT(DCIDR_GET(data->cidr, i)), |
7630 | i); |
7631 | #endif |
7632 | ip_set_ext_destroy(set, data); |
7633 | - set->elements--; |
7634 | + t->hregion[r].elements--; |
7635 | } |
7636 | goto copy_data; |
7637 | } |
7638 | - if (set->elements >= h->maxelem) |
7639 | + if (elements >= maxelem) |
7640 | goto set_full; |
7641 | /* Create a new slot */ |
7642 | if (n->pos >= n->size) { |
7643 | @@ -776,28 +954,32 @@ mtype_add(struct ip_set *set, void *value, const struct ip_set_ext *ext, |
7644 | if (n->size >= AHASH_MAX(h)) { |
7645 | /* Trigger rehashing */ |
7646 | mtype_data_next(&h->next, d); |
7647 | - return -EAGAIN; |
7648 | + ret = -EAGAIN; |
7649 | + goto resize; |
7650 | } |
7651 | old = n; |
7652 | n = kzalloc(sizeof(*n) + |
7653 | (old->size + AHASH_INIT_SIZE) * set->dsize, |
7654 | GFP_ATOMIC); |
7655 | - if (!n) |
7656 | - return -ENOMEM; |
7657 | + if (!n) { |
7658 | + ret = -ENOMEM; |
7659 | + goto unlock; |
7660 | + } |
7661 | memcpy(n, old, sizeof(struct hbucket) + |
7662 | old->size * set->dsize); |
7663 | n->size = old->size + AHASH_INIT_SIZE; |
7664 | - set->ext_size += ext_size(AHASH_INIT_SIZE, set->dsize); |
7665 | + t->hregion[r].ext_size += |
7666 | + ext_size(AHASH_INIT_SIZE, set->dsize); |
7667 | } |
7668 | |
7669 | copy_elem: |
7670 | j = n->pos++; |
7671 | data = ahash_data(n, j, set->dsize); |
7672 | copy_data: |
7673 | - set->elements++; |
7674 | + t->hregion[r].elements++; |
7675 | #ifdef IP_SET_HASH_WITH_NETS |
7676 | for (i = 0; i < IPSET_NET_COUNT; i++) |
7677 | - mtype_add_cidr(h, NCIDR_PUT(DCIDR_GET(d->cidr, i)), i); |
7678 | + mtype_add_cidr(set, h, NCIDR_PUT(DCIDR_GET(d->cidr, i)), i); |
7679 | #endif |
7680 | memcpy(data, d, sizeof(struct mtype_elem)); |
7681 | overwrite_extensions: |
7682 | @@ -820,13 +1002,41 @@ overwrite_extensions: |
7683 | if (old) |
7684 | kfree_rcu(old, rcu); |
7685 | } |
7686 | + ret = 0; |
7687 | +resize: |
7688 | + spin_unlock_bh(&t->hregion[r].lock); |
7689 | + if (atomic_read(&t->ref) && ext->target) { |
7690 | + /* Resize is in process and kernel side add, save values */ |
7691 | + struct mtype_resize_ad *x; |
7692 | + |
7693 | + x = kzalloc(sizeof(struct mtype_resize_ad), GFP_ATOMIC); |
7694 | + if (!x) |
7695 | + /* Don't bother */ |
7696 | + goto out; |
7697 | + x->ad = IPSET_ADD; |
7698 | + memcpy(&x->d, value, sizeof(struct mtype_elem)); |
7699 | + memcpy(&x->ext, ext, sizeof(struct ip_set_ext)); |
7700 | + memcpy(&x->mext, mext, sizeof(struct ip_set_ext)); |
7701 | + x->flags = flags; |
7702 | + spin_lock_bh(&set->lock); |
7703 | + list_add_tail(&x->list, &h->ad); |
7704 | + spin_unlock_bh(&set->lock); |
7705 | + } |
7706 | + goto out; |
7707 | |
7708 | - return 0; |
7709 | set_full: |
7710 | if (net_ratelimit()) |
7711 | pr_warn("Set %s is full, maxelem %u reached\n", |
7712 | - set->name, h->maxelem); |
7713 | - return -IPSET_ERR_HASH_FULL; |
7714 | + set->name, maxelem); |
7715 | + ret = -IPSET_ERR_HASH_FULL; |
7716 | +unlock: |
7717 | + spin_unlock_bh(&t->hregion[r].lock); |
7718 | +out: |
7719 | + if (atomic_dec_and_test(&t->uref) && atomic_read(&t->ref)) { |
7720 | + pr_debug("Table destroy after resize by add: %p\n", t); |
7721 | + mtype_ahash_destroy(set, t, false); |
7722 | + } |
7723 | + return ret; |
7724 | } |
7725 | |
7726 | /* Delete an element from the hash and free up space if possible. |
7727 | @@ -840,13 +1050,23 @@ mtype_del(struct ip_set *set, void *value, const struct ip_set_ext *ext, |
7728 | const struct mtype_elem *d = value; |
7729 | struct mtype_elem *data; |
7730 | struct hbucket *n; |
7731 | - int i, j, k, ret = -IPSET_ERR_EXIST; |
7732 | + struct mtype_resize_ad *x = NULL; |
7733 | + int i, j, k, r, ret = -IPSET_ERR_EXIST; |
7734 | u32 key, multi = 0; |
7735 | size_t dsize = set->dsize; |
7736 | |
7737 | - t = ipset_dereference_protected(h->table, set); |
7738 | + /* Userspace add and resize is excluded by the mutex. |
7739 | + * Kernespace add does not trigger resize. |
7740 | + */ |
7741 | + rcu_read_lock_bh(); |
7742 | + t = rcu_dereference_bh(h->table); |
7743 | key = HKEY(value, h->initval, t->htable_bits); |
7744 | - n = __ipset_dereference_protected(hbucket(t, key), 1); |
7745 | + r = ahash_region(key, t->htable_bits); |
7746 | + atomic_inc(&t->uref); |
7747 | + rcu_read_unlock_bh(); |
7748 | + |
7749 | + spin_lock_bh(&t->hregion[r].lock); |
7750 | + n = rcu_dereference_bh(hbucket(t, key)); |
7751 | if (!n) |
7752 | goto out; |
7753 | for (i = 0, k = 0; i < n->pos; i++) { |
7754 | @@ -857,8 +1077,7 @@ mtype_del(struct ip_set *set, void *value, const struct ip_set_ext *ext, |
7755 | data = ahash_data(n, i, dsize); |
7756 | if (!mtype_data_equal(data, d, &multi)) |
7757 | continue; |
7758 | - if (SET_WITH_TIMEOUT(set) && |
7759 | - ip_set_timeout_expired(ext_timeout(data, set))) |
7760 | + if (SET_ELEM_EXPIRED(set, data)) |
7761 | goto out; |
7762 | |
7763 | ret = 0; |
7764 | @@ -866,20 +1085,33 @@ mtype_del(struct ip_set *set, void *value, const struct ip_set_ext *ext, |
7765 | smp_mb__after_atomic(); |
7766 | if (i + 1 == n->pos) |
7767 | n->pos--; |
7768 | - set->elements--; |
7769 | + t->hregion[r].elements--; |
7770 | #ifdef IP_SET_HASH_WITH_NETS |
7771 | for (j = 0; j < IPSET_NET_COUNT; j++) |
7772 | - mtype_del_cidr(h, NCIDR_PUT(DCIDR_GET(d->cidr, j)), |
7773 | - j); |
7774 | + mtype_del_cidr(set, h, |
7775 | + NCIDR_PUT(DCIDR_GET(d->cidr, j)), j); |
7776 | #endif |
7777 | ip_set_ext_destroy(set, data); |
7778 | |
7779 | + if (atomic_read(&t->ref) && ext->target) { |
7780 | + /* Resize is in process and kernel side del, |
7781 | + * save values |
7782 | + */ |
7783 | + x = kzalloc(sizeof(struct mtype_resize_ad), |
7784 | + GFP_ATOMIC); |
7785 | + if (x) { |
7786 | + x->ad = IPSET_DEL; |
7787 | + memcpy(&x->d, value, |
7788 | + sizeof(struct mtype_elem)); |
7789 | + x->flags = flags; |
7790 | + } |
7791 | + } |
7792 | for (; i < n->pos; i++) { |
7793 | if (!test_bit(i, n->used)) |
7794 | k++; |
7795 | } |
7796 | if (n->pos == 0 && k == 0) { |
7797 | - set->ext_size -= ext_size(n->size, dsize); |
7798 | + t->hregion[r].ext_size -= ext_size(n->size, dsize); |
7799 | rcu_assign_pointer(hbucket(t, key), NULL); |
7800 | kfree_rcu(n, rcu); |
7801 | } else if (k >= AHASH_INIT_SIZE) { |
7802 | @@ -898,7 +1130,8 @@ mtype_del(struct ip_set *set, void *value, const struct ip_set_ext *ext, |
7803 | k++; |
7804 | } |
7805 | tmp->pos = k; |
7806 | - set->ext_size -= ext_size(AHASH_INIT_SIZE, dsize); |
7807 | + t->hregion[r].ext_size -= |
7808 | + ext_size(AHASH_INIT_SIZE, dsize); |
7809 | rcu_assign_pointer(hbucket(t, key), tmp); |
7810 | kfree_rcu(n, rcu); |
7811 | } |
7812 | @@ -906,6 +1139,16 @@ mtype_del(struct ip_set *set, void *value, const struct ip_set_ext *ext, |
7813 | } |
7814 | |
7815 | out: |
7816 | + spin_unlock_bh(&t->hregion[r].lock); |
7817 | + if (x) { |
7818 | + spin_lock_bh(&set->lock); |
7819 | + list_add(&x->list, &h->ad); |
7820 | + spin_unlock_bh(&set->lock); |
7821 | + } |
7822 | + if (atomic_dec_and_test(&t->uref) && atomic_read(&t->ref)) { |
7823 | + pr_debug("Table destroy after resize by del: %p\n", t); |
7824 | + mtype_ahash_destroy(set, t, false); |
7825 | + } |
7826 | return ret; |
7827 | } |
7828 | |
7829 | @@ -991,6 +1234,7 @@ mtype_test(struct ip_set *set, void *value, const struct ip_set_ext *ext, |
7830 | int i, ret = 0; |
7831 | u32 key, multi = 0; |
7832 | |
7833 | + rcu_read_lock_bh(); |
7834 | t = rcu_dereference_bh(h->table); |
7835 | #ifdef IP_SET_HASH_WITH_NETS |
7836 | /* If we test an IP address and not a network address, |
7837 | @@ -1022,6 +1266,7 @@ mtype_test(struct ip_set *set, void *value, const struct ip_set_ext *ext, |
7838 | goto out; |
7839 | } |
7840 | out: |
7841 | + rcu_read_unlock_bh(); |
7842 | return ret; |
7843 | } |
7844 | |
7845 | @@ -1033,23 +1278,14 @@ mtype_head(struct ip_set *set, struct sk_buff *skb) |
7846 | const struct htable *t; |
7847 | struct nlattr *nested; |
7848 | size_t memsize; |
7849 | + u32 elements = 0; |
7850 | + size_t ext_size = 0; |
7851 | u8 htable_bits; |
7852 | |
7853 | - /* If any members have expired, set->elements will be wrong |
7854 | - * mytype_expire function will update it with the right count. |
7855 | - * we do not hold set->lock here, so grab it first. |
7856 | - * set->elements can still be incorrect in the case of a huge set, |
7857 | - * because elements might time out during the listing. |
7858 | - */ |
7859 | - if (SET_WITH_TIMEOUT(set)) { |
7860 | - spin_lock_bh(&set->lock); |
7861 | - mtype_expire(set, h); |
7862 | - spin_unlock_bh(&set->lock); |
7863 | - } |
7864 | - |
7865 | rcu_read_lock_bh(); |
7866 | - t = rcu_dereference_bh_nfnl(h->table); |
7867 | - memsize = mtype_ahash_memsize(h, t) + set->ext_size; |
7868 | + t = rcu_dereference_bh(h->table); |
7869 | + mtype_ext_size(set, &elements, &ext_size); |
7870 | + memsize = mtype_ahash_memsize(h, t) + ext_size + set->ext_size; |
7871 | htable_bits = t->htable_bits; |
7872 | rcu_read_unlock_bh(); |
7873 | |
7874 | @@ -1071,7 +1307,7 @@ mtype_head(struct ip_set *set, struct sk_buff *skb) |
7875 | #endif |
7876 | if (nla_put_net32(skb, IPSET_ATTR_REFERENCES, htonl(set->ref)) || |
7877 | nla_put_net32(skb, IPSET_ATTR_MEMSIZE, htonl(memsize)) || |
7878 | - nla_put_net32(skb, IPSET_ATTR_ELEMENTS, htonl(set->elements))) |
7879 | + nla_put_net32(skb, IPSET_ATTR_ELEMENTS, htonl(elements))) |
7880 | goto nla_put_failure; |
7881 | if (unlikely(ip_set_put_flags(skb, set))) |
7882 | goto nla_put_failure; |
7883 | @@ -1091,15 +1327,15 @@ mtype_uref(struct ip_set *set, struct netlink_callback *cb, bool start) |
7884 | |
7885 | if (start) { |
7886 | rcu_read_lock_bh(); |
7887 | - t = rcu_dereference_bh_nfnl(h->table); |
7888 | + t = ipset_dereference_bh_nfnl(h->table); |
7889 | atomic_inc(&t->uref); |
7890 | cb->args[IPSET_CB_PRIVATE] = (unsigned long)t; |
7891 | rcu_read_unlock_bh(); |
7892 | } else if (cb->args[IPSET_CB_PRIVATE]) { |
7893 | t = (struct htable *)cb->args[IPSET_CB_PRIVATE]; |
7894 | if (atomic_dec_and_test(&t->uref) && atomic_read(&t->ref)) { |
7895 | - /* Resizing didn't destroy the hash table */ |
7896 | - pr_debug("Table destroy by dump: %p\n", t); |
7897 | + pr_debug("Table destroy after resize " |
7898 | + " by dump: %p\n", t); |
7899 | mtype_ahash_destroy(set, t, false); |
7900 | } |
7901 | cb->args[IPSET_CB_PRIVATE] = 0; |
7902 | @@ -1141,8 +1377,7 @@ mtype_list(const struct ip_set *set, |
7903 | if (!test_bit(i, n->used)) |
7904 | continue; |
7905 | e = ahash_data(n, i, set->dsize); |
7906 | - if (SET_WITH_TIMEOUT(set) && |
7907 | - ip_set_timeout_expired(ext_timeout(e, set))) |
7908 | + if (SET_ELEM_EXPIRED(set, e)) |
7909 | continue; |
7910 | pr_debug("list hash %lu hbucket %p i %u, data %p\n", |
7911 | cb->args[IPSET_CB_ARG0], n, i, e); |
7912 | @@ -1208,6 +1443,7 @@ static const struct ip_set_type_variant mtype_variant = { |
7913 | .uref = mtype_uref, |
7914 | .resize = mtype_resize, |
7915 | .same_set = mtype_same_set, |
7916 | + .region_lock = true, |
7917 | }; |
7918 | |
7919 | #ifdef IP_SET_EMIT_CREATE |
7920 | @@ -1226,6 +1462,7 @@ IPSET_TOKEN(HTYPE, _create)(struct net *net, struct ip_set *set, |
7921 | size_t hsize; |
7922 | struct htype *h; |
7923 | struct htable *t; |
7924 | + u32 i; |
7925 | |
7926 | pr_debug("Create set %s with family %s\n", |
7927 | set->name, set->family == NFPROTO_IPV4 ? "inet" : "inet6"); |
7928 | @@ -1294,6 +1531,15 @@ IPSET_TOKEN(HTYPE, _create)(struct net *net, struct ip_set *set, |
7929 | kfree(h); |
7930 | return -ENOMEM; |
7931 | } |
7932 | + t->hregion = ip_set_alloc(ahash_sizeof_regions(hbits)); |
7933 | + if (!t->hregion) { |
7934 | + kfree(t); |
7935 | + kfree(h); |
7936 | + return -ENOMEM; |
7937 | + } |
7938 | + h->gc.set = set; |
7939 | + for (i = 0; i < ahash_numof_locks(hbits); i++) |
7940 | + spin_lock_init(&t->hregion[i].lock); |
7941 | h->maxelem = maxelem; |
7942 | #ifdef IP_SET_HASH_WITH_NETMASK |
7943 | h->netmask = netmask; |
7944 | @@ -1304,9 +1550,10 @@ IPSET_TOKEN(HTYPE, _create)(struct net *net, struct ip_set *set, |
7945 | get_random_bytes(&h->initval, sizeof(h->initval)); |
7946 | |
7947 | t->htable_bits = hbits; |
7948 | + t->maxelem = h->maxelem / ahash_numof_locks(hbits); |
7949 | RCU_INIT_POINTER(h->table, t); |
7950 | |
7951 | - h->set = set; |
7952 | + INIT_LIST_HEAD(&h->ad); |
7953 | set->data = h; |
7954 | #ifndef IP_SET_PROTO_UNDEF |
7955 | if (set->family == NFPROTO_IPV4) { |
7956 | @@ -1329,12 +1576,10 @@ IPSET_TOKEN(HTYPE, _create)(struct net *net, struct ip_set *set, |
7957 | #ifndef IP_SET_PROTO_UNDEF |
7958 | if (set->family == NFPROTO_IPV4) |
7959 | #endif |
7960 | - IPSET_TOKEN(HTYPE, 4_gc_init)(set, |
7961 | - IPSET_TOKEN(HTYPE, 4_gc)); |
7962 | + IPSET_TOKEN(HTYPE, 4_gc_init)(&h->gc); |
7963 | #ifndef IP_SET_PROTO_UNDEF |
7964 | else |
7965 | - IPSET_TOKEN(HTYPE, 6_gc_init)(set, |
7966 | - IPSET_TOKEN(HTYPE, 6_gc)); |
7967 | + IPSET_TOKEN(HTYPE, 6_gc_init)(&h->gc); |
7968 | #endif |
7969 | } |
7970 | pr_debug("create %s hashsize %u (%u) maxelem %u: %p(%p)\n", |
7971 | diff --git a/net/netfilter/nft_tunnel.c b/net/netfilter/nft_tunnel.c |
7972 | index f8d2919cf9fd..037e8fce9b30 100644 |
7973 | --- a/net/netfilter/nft_tunnel.c |
7974 | +++ b/net/netfilter/nft_tunnel.c |
7975 | @@ -505,8 +505,8 @@ static int nft_tunnel_opts_dump(struct sk_buff *skb, |
7976 | static int nft_tunnel_ports_dump(struct sk_buff *skb, |
7977 | struct ip_tunnel_info *info) |
7978 | { |
7979 | - if (nla_put_be16(skb, NFTA_TUNNEL_KEY_SPORT, htons(info->key.tp_src)) < 0 || |
7980 | - nla_put_be16(skb, NFTA_TUNNEL_KEY_DPORT, htons(info->key.tp_dst)) < 0) |
7981 | + if (nla_put_be16(skb, NFTA_TUNNEL_KEY_SPORT, info->key.tp_src) < 0 || |
7982 | + nla_put_be16(skb, NFTA_TUNNEL_KEY_DPORT, info->key.tp_dst) < 0) |
7983 | return -1; |
7984 | |
7985 | return 0; |
7986 | diff --git a/net/netfilter/xt_hashlimit.c b/net/netfilter/xt_hashlimit.c |
7987 | index 6520d9ec1297..1b68a131083c 100644 |
7988 | --- a/net/netfilter/xt_hashlimit.c |
7989 | +++ b/net/netfilter/xt_hashlimit.c |
7990 | @@ -36,6 +36,7 @@ |
7991 | #include <linux/netfilter_ipv6/ip6_tables.h> |
7992 | #include <linux/mutex.h> |
7993 | #include <linux/kernel.h> |
7994 | +#include <linux/refcount.h> |
7995 | #include <uapi/linux/netfilter/xt_hashlimit.h> |
7996 | |
7997 | #define XT_HASHLIMIT_ALL (XT_HASHLIMIT_HASH_DIP | XT_HASHLIMIT_HASH_DPT | \ |
7998 | @@ -114,7 +115,7 @@ struct dsthash_ent { |
7999 | |
8000 | struct xt_hashlimit_htable { |
8001 | struct hlist_node node; /* global list of all htables */ |
8002 | - int use; |
8003 | + refcount_t use; |
8004 | u_int8_t family; |
8005 | bool rnd_initialized; |
8006 | |
8007 | @@ -315,7 +316,7 @@ static int htable_create(struct net *net, struct hashlimit_cfg3 *cfg, |
8008 | for (i = 0; i < hinfo->cfg.size; i++) |
8009 | INIT_HLIST_HEAD(&hinfo->hash[i]); |
8010 | |
8011 | - hinfo->use = 1; |
8012 | + refcount_set(&hinfo->use, 1); |
8013 | hinfo->count = 0; |
8014 | hinfo->family = family; |
8015 | hinfo->rnd_initialized = false; |
8016 | @@ -434,7 +435,7 @@ static struct xt_hashlimit_htable *htable_find_get(struct net *net, |
8017 | hlist_for_each_entry(hinfo, &hashlimit_net->htables, node) { |
8018 | if (!strcmp(name, hinfo->name) && |
8019 | hinfo->family == family) { |
8020 | - hinfo->use++; |
8021 | + refcount_inc(&hinfo->use); |
8022 | return hinfo; |
8023 | } |
8024 | } |
8025 | @@ -443,12 +444,11 @@ static struct xt_hashlimit_htable *htable_find_get(struct net *net, |
8026 | |
8027 | static void htable_put(struct xt_hashlimit_htable *hinfo) |
8028 | { |
8029 | - mutex_lock(&hashlimit_mutex); |
8030 | - if (--hinfo->use == 0) { |
8031 | + if (refcount_dec_and_mutex_lock(&hinfo->use, &hashlimit_mutex)) { |
8032 | hlist_del(&hinfo->node); |
8033 | + mutex_unlock(&hashlimit_mutex); |
8034 | htable_destroy(hinfo); |
8035 | } |
8036 | - mutex_unlock(&hashlimit_mutex); |
8037 | } |
8038 | |
8039 | /* The algorithm used is the Simple Token Bucket Filter (TBF) |
8040 | diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c |
8041 | index 90b2ab9dd449..e64b8784d487 100644 |
8042 | --- a/net/netlink/af_netlink.c |
8043 | +++ b/net/netlink/af_netlink.c |
8044 | @@ -1014,7 +1014,8 @@ static int netlink_bind(struct socket *sock, struct sockaddr *addr, |
8045 | if (nlk->netlink_bind && groups) { |
8046 | int group; |
8047 | |
8048 | - for (group = 0; group < nlk->ngroups; group++) { |
8049 | + /* nl_groups is a u32, so cap the maximum groups we can bind */ |
8050 | + for (group = 0; group < BITS_PER_TYPE(u32); group++) { |
8051 | if (!test_bit(group, &groups)) |
8052 | continue; |
8053 | err = nlk->netlink_bind(net, group + 1); |
8054 | @@ -1033,7 +1034,7 @@ static int netlink_bind(struct socket *sock, struct sockaddr *addr, |
8055 | netlink_insert(sk, nladdr->nl_pid) : |
8056 | netlink_autobind(sock); |
8057 | if (err) { |
8058 | - netlink_undo_bind(nlk->ngroups, groups, sk); |
8059 | + netlink_undo_bind(BITS_PER_TYPE(u32), groups, sk); |
8060 | goto unlock; |
8061 | } |
8062 | } |
8063 | diff --git a/net/sched/cls_flower.c b/net/sched/cls_flower.c |
8064 | index 5eceeee593cf..1d270540e74d 100644 |
8065 | --- a/net/sched/cls_flower.c |
8066 | +++ b/net/sched/cls_flower.c |
8067 | @@ -303,6 +303,7 @@ static int fl_classify(struct sk_buff *skb, const struct tcf_proto *tp, |
8068 | struct cls_fl_filter *f; |
8069 | |
8070 | list_for_each_entry_rcu(mask, &head->masks, list) { |
8071 | + flow_dissector_init_keys(&skb_key.control, &skb_key.basic); |
8072 | fl_clear_masked_range(&skb_key, mask); |
8073 | |
8074 | skb_flow_dissect_meta(skb, &mask->dissector, &skb_key); |
8075 | diff --git a/net/sctp/sm_statefuns.c b/net/sctp/sm_statefuns.c |
8076 | index 4ab8208a2dd4..c6d83a64eac3 100644 |
8077 | --- a/net/sctp/sm_statefuns.c |
8078 | +++ b/net/sctp/sm_statefuns.c |
8079 | @@ -170,6 +170,16 @@ static inline bool sctp_chunk_length_valid(struct sctp_chunk *chunk, |
8080 | return true; |
8081 | } |
8082 | |
8083 | +/* Check for format error in an ABORT chunk */ |
8084 | +static inline bool sctp_err_chunk_valid(struct sctp_chunk *chunk) |
8085 | +{ |
8086 | + struct sctp_errhdr *err; |
8087 | + |
8088 | + sctp_walk_errors(err, chunk->chunk_hdr); |
8089 | + |
8090 | + return (void *)err == (void *)chunk->chunk_end; |
8091 | +} |
8092 | + |
8093 | /********************************************************** |
8094 | * These are the state functions for handling chunk events. |
8095 | **********************************************************/ |
8096 | @@ -2255,6 +2265,9 @@ enum sctp_disposition sctp_sf_shutdown_pending_abort( |
8097 | sctp_bind_addr_state(&asoc->base.bind_addr, &chunk->dest)) |
8098 | return sctp_sf_discard_chunk(net, ep, asoc, type, arg, commands); |
8099 | |
8100 | + if (!sctp_err_chunk_valid(chunk)) |
8101 | + return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands); |
8102 | + |
8103 | return __sctp_sf_do_9_1_abort(net, ep, asoc, type, arg, commands); |
8104 | } |
8105 | |
8106 | @@ -2298,6 +2311,9 @@ enum sctp_disposition sctp_sf_shutdown_sent_abort( |
8107 | sctp_bind_addr_state(&asoc->base.bind_addr, &chunk->dest)) |
8108 | return sctp_sf_discard_chunk(net, ep, asoc, type, arg, commands); |
8109 | |
8110 | + if (!sctp_err_chunk_valid(chunk)) |
8111 | + return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands); |
8112 | + |
8113 | /* Stop the T2-shutdown timer. */ |
8114 | sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_STOP, |
8115 | SCTP_TO(SCTP_EVENT_TIMEOUT_T2_SHUTDOWN)); |
8116 | @@ -2565,6 +2581,9 @@ enum sctp_disposition sctp_sf_do_9_1_abort( |
8117 | sctp_bind_addr_state(&asoc->base.bind_addr, &chunk->dest)) |
8118 | return sctp_sf_discard_chunk(net, ep, asoc, type, arg, commands); |
8119 | |
8120 | + if (!sctp_err_chunk_valid(chunk)) |
8121 | + return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands); |
8122 | + |
8123 | return __sctp_sf_do_9_1_abort(net, ep, asoc, type, arg, commands); |
8124 | } |
8125 | |
8126 | @@ -2582,16 +2601,8 @@ static enum sctp_disposition __sctp_sf_do_9_1_abort( |
8127 | |
8128 | /* See if we have an error cause code in the chunk. */ |
8129 | len = ntohs(chunk->chunk_hdr->length); |
8130 | - if (len >= sizeof(struct sctp_chunkhdr) + sizeof(struct sctp_errhdr)) { |
8131 | - struct sctp_errhdr *err; |
8132 | - |
8133 | - sctp_walk_errors(err, chunk->chunk_hdr); |
8134 | - if ((void *)err != (void *)chunk->chunk_end) |
8135 | - return sctp_sf_pdiscard(net, ep, asoc, type, arg, |
8136 | - commands); |
8137 | - |
8138 | + if (len >= sizeof(struct sctp_chunkhdr) + sizeof(struct sctp_errhdr)) |
8139 | error = ((struct sctp_errhdr *)chunk->skb->data)->cause; |
8140 | - } |
8141 | |
8142 | sctp_add_cmd_sf(commands, SCTP_CMD_SET_SK_ERR, SCTP_ERROR(ECONNRESET)); |
8143 | /* ASSOC_FAILED will DELETE_TCB. */ |
8144 | diff --git a/net/smc/af_smc.c b/net/smc/af_smc.c |
8145 | index 6a6d3b2aa5a9..dc09a72f8110 100644 |
8146 | --- a/net/smc/af_smc.c |
8147 | +++ b/net/smc/af_smc.c |
8148 | @@ -467,6 +467,8 @@ static void smc_switch_to_fallback(struct smc_sock *smc) |
8149 | if (smc->sk.sk_socket && smc->sk.sk_socket->file) { |
8150 | smc->clcsock->file = smc->sk.sk_socket->file; |
8151 | smc->clcsock->file->private_data = smc->clcsock; |
8152 | + smc->clcsock->wq.fasync_list = |
8153 | + smc->sk.sk_socket->wq.fasync_list; |
8154 | } |
8155 | } |
8156 | |
8157 | diff --git a/net/smc/smc_clc.c b/net/smc/smc_clc.c |
8158 | index 49bcebff6378..aee9ccfa99c2 100644 |
8159 | --- a/net/smc/smc_clc.c |
8160 | +++ b/net/smc/smc_clc.c |
8161 | @@ -372,7 +372,9 @@ int smc_clc_send_decline(struct smc_sock *smc, u32 peer_diag_info) |
8162 | dclc.hdr.length = htons(sizeof(struct smc_clc_msg_decline)); |
8163 | dclc.hdr.version = SMC_CLC_V1; |
8164 | dclc.hdr.flag = (peer_diag_info == SMC_CLC_DECL_SYNCERR) ? 1 : 0; |
8165 | - memcpy(dclc.id_for_peer, local_systemid, sizeof(local_systemid)); |
8166 | + if (smc->conn.lgr && !smc->conn.lgr->is_smcd) |
8167 | + memcpy(dclc.id_for_peer, local_systemid, |
8168 | + sizeof(local_systemid)); |
8169 | dclc.peer_diagnosis = htonl(peer_diag_info); |
8170 | memcpy(dclc.trl.eyecatcher, SMC_EYECATCHER, sizeof(SMC_EYECATCHER)); |
8171 | |
8172 | diff --git a/net/tls/tls_device.c b/net/tls/tls_device.c |
8173 | index 3f5209e2d4ee..1adeb1c0473b 100644 |
8174 | --- a/net/tls/tls_device.c |
8175 | +++ b/net/tls/tls_device.c |
8176 | @@ -581,7 +581,7 @@ struct tls_record_info *tls_get_record(struct tls_offload_context_tx *context, |
8177 | u32 seq, u64 *p_record_sn) |
8178 | { |
8179 | u64 record_sn = context->hint_record_sn; |
8180 | - struct tls_record_info *info; |
8181 | + struct tls_record_info *info, *last; |
8182 | |
8183 | info = context->retransmit_hint; |
8184 | if (!info || |
8185 | @@ -593,6 +593,24 @@ struct tls_record_info *tls_get_record(struct tls_offload_context_tx *context, |
8186 | struct tls_record_info, list); |
8187 | if (!info) |
8188 | return NULL; |
8189 | + /* send the start_marker record if seq number is before the |
8190 | + * tls offload start marker sequence number. This record is |
8191 | + * required to handle TCP packets which are before TLS offload |
8192 | + * started. |
8193 | + * And if it's not start marker, look if this seq number |
8194 | + * belongs to the list. |
8195 | + */ |
8196 | + if (likely(!tls_record_is_start_marker(info))) { |
8197 | + /* we have the first record, get the last record to see |
8198 | + * if this seq number belongs to the list. |
8199 | + */ |
8200 | + last = list_last_entry(&context->records_list, |
8201 | + struct tls_record_info, list); |
8202 | + |
8203 | + if (!between(seq, tls_record_start_seq(info), |
8204 | + last->end_seq)) |
8205 | + return NULL; |
8206 | + } |
8207 | record_sn = context->unacked_record_sn; |
8208 | } |
8209 | |
8210 | diff --git a/net/wireless/ethtool.c b/net/wireless/ethtool.c |
8211 | index a9c0f368db5d..24e18405cdb4 100644 |
8212 | --- a/net/wireless/ethtool.c |
8213 | +++ b/net/wireless/ethtool.c |
8214 | @@ -7,9 +7,13 @@ |
8215 | void cfg80211_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info) |
8216 | { |
8217 | struct wireless_dev *wdev = dev->ieee80211_ptr; |
8218 | + struct device *pdev = wiphy_dev(wdev->wiphy); |
8219 | |
8220 | - strlcpy(info->driver, wiphy_dev(wdev->wiphy)->driver->name, |
8221 | - sizeof(info->driver)); |
8222 | + if (pdev->driver) |
8223 | + strlcpy(info->driver, pdev->driver->name, |
8224 | + sizeof(info->driver)); |
8225 | + else |
8226 | + strlcpy(info->driver, "N/A", sizeof(info->driver)); |
8227 | |
8228 | strlcpy(info->version, init_utsname()->release, sizeof(info->version)); |
8229 | |
8230 | diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c |
8231 | index c74646b7a751..17514744af9e 100644 |
8232 | --- a/net/wireless/nl80211.c |
8233 | +++ b/net/wireless/nl80211.c |
8234 | @@ -437,6 +437,7 @@ const struct nla_policy nl80211_policy[NUM_NL80211_ATTR] = { |
8235 | [NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT] = { .type = NLA_FLAG }, |
8236 | [NL80211_ATTR_CONTROL_PORT_OVER_NL80211] = { .type = NLA_FLAG }, |
8237 | [NL80211_ATTR_PRIVACY] = { .type = NLA_FLAG }, |
8238 | + [NL80211_ATTR_STATUS_CODE] = { .type = NLA_U16 }, |
8239 | [NL80211_ATTR_CIPHER_SUITE_GROUP] = { .type = NLA_U32 }, |
8240 | [NL80211_ATTR_WPA_VERSIONS] = { .type = NLA_U32 }, |
8241 | [NL80211_ATTR_PID] = { .type = NLA_U32 }, |
8242 | @@ -4794,8 +4795,7 @@ static int nl80211_start_ap(struct sk_buff *skb, struct genl_info *info) |
8243 | err = nl80211_parse_he_obss_pd( |
8244 | info->attrs[NL80211_ATTR_HE_OBSS_PD], |
8245 | ¶ms.he_obss_pd); |
8246 | - if (err) |
8247 | - return err; |
8248 | + goto out; |
8249 | } |
8250 | |
8251 | nl80211_calculate_ap_params(¶ms); |
8252 | @@ -4817,6 +4817,7 @@ static int nl80211_start_ap(struct sk_buff *skb, struct genl_info *info) |
8253 | } |
8254 | wdev_unlock(wdev); |
8255 | |
8256 | +out: |
8257 | kfree(params.acl); |
8258 | |
8259 | return err; |
8260 | diff --git a/scripts/Makefile.build b/scripts/Makefile.build |
8261 | index a9e47953ca53..24a33c01bbf7 100644 |
8262 | --- a/scripts/Makefile.build |
8263 | +++ b/scripts/Makefile.build |
8264 | @@ -283,15 +283,6 @@ quiet_cmd_cc_lst_c = MKLST $@ |
8265 | $(obj)/%.lst: $(src)/%.c FORCE |
8266 | $(call if_changed_dep,cc_lst_c) |
8267 | |
8268 | -# header test (header-test-y, header-test-m target) |
8269 | -# --------------------------------------------------------------------------- |
8270 | - |
8271 | -quiet_cmd_cc_s_h = CC $@ |
8272 | - cmd_cc_s_h = $(CC) $(c_flags) -S -o $@ -x c /dev/null -include $< |
8273 | - |
8274 | -$(obj)/%.h.s: $(src)/%.h FORCE |
8275 | - $(call if_changed_dep,cc_s_h) |
8276 | - |
8277 | # Compile assembler sources (.S) |
8278 | # --------------------------------------------------------------------------- |
8279 | |
8280 | diff --git a/scripts/Makefile.headersinst b/scripts/Makefile.headersinst |
8281 | index 1b405a7ed14f..708fbd08a2c5 100644 |
8282 | --- a/scripts/Makefile.headersinst |
8283 | +++ b/scripts/Makefile.headersinst |
8284 | @@ -56,9 +56,6 @@ new-dirs := $(filter-out $(existing-dirs), $(wanted-dirs)) |
8285 | $(if $(new-dirs), $(shell mkdir -p $(new-dirs))) |
8286 | |
8287 | # Rules |
8288 | - |
8289 | -ifndef HDRCHECK |
8290 | - |
8291 | quiet_cmd_install = HDRINST $@ |
8292 | cmd_install = $(CONFIG_SHELL) $(srctree)/scripts/headers_install.sh $< $@ |
8293 | |
8294 | @@ -81,21 +78,6 @@ existing-headers := $(filter $(old-headers), $(all-headers)) |
8295 | |
8296 | -include $(foreach f,$(existing-headers),$(dir $(f)).$(notdir $(f)).cmd) |
8297 | |
8298 | -else |
8299 | - |
8300 | -quiet_cmd_check = HDRCHK $< |
8301 | - cmd_check = $(PERL) $(srctree)/scripts/headers_check.pl $(dst) $(SRCARCH) $<; touch $@ |
8302 | - |
8303 | -check-files := $(addsuffix .chk, $(all-headers)) |
8304 | - |
8305 | -$(check-files): $(dst)/%.chk : $(dst)/% $(srctree)/scripts/headers_check.pl |
8306 | - $(call cmd,check) |
8307 | - |
8308 | -__headers: $(check-files) |
8309 | - @: |
8310 | - |
8311 | -endif |
8312 | - |
8313 | PHONY += FORCE |
8314 | FORCE: |
8315 | |
8316 | diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib |
8317 | index 179d55af5852..a66fc0acad1e 100644 |
8318 | --- a/scripts/Makefile.lib |
8319 | +++ b/scripts/Makefile.lib |
8320 | @@ -65,20 +65,6 @@ extra-y += $(patsubst %.dtb,%.dt.yaml, $(dtb-y)) |
8321 | extra-$(CONFIG_OF_ALL_DTBS) += $(patsubst %.dtb,%.dt.yaml, $(dtb-)) |
8322 | endif |
8323 | |
8324 | -# Test self-contained headers |
8325 | - |
8326 | -# Wildcard searches in $(srctree)/$(src)/, but not in $(objtree)/$(obj)/. |
8327 | -# Stale generated headers are often left over, so pattern matching should |
8328 | -# be avoided. Please notice $(srctree)/$(src)/ and $(objtree)/$(obj) point |
8329 | -# to the same location for in-tree building. So, header-test-pattern-y should |
8330 | -# be used with care. |
8331 | -header-test-y += $(filter-out $(header-test-), \ |
8332 | - $(patsubst $(srctree)/$(src)/%, %, \ |
8333 | - $(wildcard $(addprefix $(srctree)/$(src)/, \ |
8334 | - $(header-test-pattern-y))))) |
8335 | - |
8336 | -extra-$(CONFIG_HEADER_TEST) += $(addsuffix .s, $(header-test-y) $(header-test-m)) |
8337 | - |
8338 | # Add subdir path |
8339 | |
8340 | extra-y := $(addprefix $(obj)/,$(extra-y)) |
8341 | @@ -305,13 +291,13 @@ DT_TMP_SCHEMA := $(objtree)/$(DT_BINDING_DIR)/processed-schema.yaml |
8342 | quiet_cmd_dtb_check = CHECK $@ |
8343 | cmd_dtb_check = $(DT_CHECKER) -u $(srctree)/$(DT_BINDING_DIR) -p $(DT_TMP_SCHEMA) $@ ; |
8344 | |
8345 | -define rule_dtc_dt_yaml |
8346 | +define rule_dtc |
8347 | $(call cmd_and_fixdep,dtc,yaml) |
8348 | $(call cmd,dtb_check) |
8349 | endef |
8350 | |
8351 | $(obj)/%.dt.yaml: $(src)/%.dts $(DTC) $(DT_TMP_SCHEMA) FORCE |
8352 | - $(call if_changed_rule,dtc_dt_yaml) |
8353 | + $(call if_changed_rule,dtc) |
8354 | |
8355 | dtc-tmp = $(subst $(comma),_,$(dot-target).dts.tmp) |
8356 | |
8357 | diff --git a/security/integrity/ima/ima_policy.c b/security/integrity/ima/ima_policy.c |
8358 | index 5380aca2b351..ee9aec5e98f0 100644 |
8359 | --- a/security/integrity/ima/ima_policy.c |
8360 | +++ b/security/integrity/ima/ima_policy.c |
8361 | @@ -263,7 +263,7 @@ static void ima_lsm_free_rule(struct ima_rule_entry *entry) |
8362 | static struct ima_rule_entry *ima_lsm_copy_rule(struct ima_rule_entry *entry) |
8363 | { |
8364 | struct ima_rule_entry *nentry; |
8365 | - int i, result; |
8366 | + int i; |
8367 | |
8368 | nentry = kmalloc(sizeof(*nentry), GFP_KERNEL); |
8369 | if (!nentry) |
8370 | @@ -277,7 +277,7 @@ static struct ima_rule_entry *ima_lsm_copy_rule(struct ima_rule_entry *entry) |
8371 | memset(nentry->lsm, 0, FIELD_SIZEOF(struct ima_rule_entry, lsm)); |
8372 | |
8373 | for (i = 0; i < MAX_LSM_RULES; i++) { |
8374 | - if (!entry->lsm[i].rule) |
8375 | + if (!entry->lsm[i].args_p) |
8376 | continue; |
8377 | |
8378 | nentry->lsm[i].type = entry->lsm[i].type; |
8379 | @@ -286,13 +286,13 @@ static struct ima_rule_entry *ima_lsm_copy_rule(struct ima_rule_entry *entry) |
8380 | if (!nentry->lsm[i].args_p) |
8381 | goto out_err; |
8382 | |
8383 | - result = security_filter_rule_init(nentry->lsm[i].type, |
8384 | - Audit_equal, |
8385 | - nentry->lsm[i].args_p, |
8386 | - &nentry->lsm[i].rule); |
8387 | - if (result == -EINVAL) |
8388 | - pr_warn("ima: rule for LSM \'%d\' is undefined\n", |
8389 | - entry->lsm[i].type); |
8390 | + security_filter_rule_init(nentry->lsm[i].type, |
8391 | + Audit_equal, |
8392 | + nentry->lsm[i].args_p, |
8393 | + &nentry->lsm[i].rule); |
8394 | + if (!nentry->lsm[i].rule) |
8395 | + pr_warn("rule for LSM \'%s\' is undefined\n", |
8396 | + (char *)entry->lsm[i].args_p); |
8397 | } |
8398 | return nentry; |
8399 | |
8400 | @@ -329,7 +329,7 @@ static void ima_lsm_update_rules(void) |
8401 | list_for_each_entry_safe(entry, e, &ima_policy_rules, list) { |
8402 | needs_update = 0; |
8403 | for (i = 0; i < MAX_LSM_RULES; i++) { |
8404 | - if (entry->lsm[i].rule) { |
8405 | + if (entry->lsm[i].args_p) { |
8406 | needs_update = 1; |
8407 | break; |
8408 | } |
8409 | @@ -339,8 +339,7 @@ static void ima_lsm_update_rules(void) |
8410 | |
8411 | result = ima_lsm_update_rule(entry); |
8412 | if (result) { |
8413 | - pr_err("ima: lsm rule update error %d\n", |
8414 | - result); |
8415 | + pr_err("lsm rule update error %d\n", result); |
8416 | return; |
8417 | } |
8418 | } |
8419 | @@ -357,7 +356,7 @@ int ima_lsm_policy_change(struct notifier_block *nb, unsigned long event, |
8420 | } |
8421 | |
8422 | /** |
8423 | - * ima_match_rules - determine whether an inode matches the measure rule. |
8424 | + * ima_match_rules - determine whether an inode matches the policy rule. |
8425 | * @rule: a pointer to a rule |
8426 | * @inode: a pointer to an inode |
8427 | * @cred: a pointer to a credentials structure for user validation |
8428 | @@ -415,9 +414,12 @@ static bool ima_match_rules(struct ima_rule_entry *rule, struct inode *inode, |
8429 | int rc = 0; |
8430 | u32 osid; |
8431 | |
8432 | - if (!rule->lsm[i].rule) |
8433 | - continue; |
8434 | - |
8435 | + if (!rule->lsm[i].rule) { |
8436 | + if (!rule->lsm[i].args_p) |
8437 | + continue; |
8438 | + else |
8439 | + return false; |
8440 | + } |
8441 | switch (i) { |
8442 | case LSM_OBJ_USER: |
8443 | case LSM_OBJ_ROLE: |
8444 | @@ -822,8 +824,14 @@ static int ima_lsm_rule_init(struct ima_rule_entry *entry, |
8445 | entry->lsm[lsm_rule].args_p, |
8446 | &entry->lsm[lsm_rule].rule); |
8447 | if (!entry->lsm[lsm_rule].rule) { |
8448 | - kfree(entry->lsm[lsm_rule].args_p); |
8449 | - return -EINVAL; |
8450 | + pr_warn("rule for LSM \'%s\' is undefined\n", |
8451 | + (char *)entry->lsm[lsm_rule].args_p); |
8452 | + |
8453 | + if (ima_rules == &ima_default_rules) { |
8454 | + kfree(entry->lsm[lsm_rule].args_p); |
8455 | + result = -EINVAL; |
8456 | + } else |
8457 | + result = 0; |
8458 | } |
8459 | |
8460 | return result; |
8461 | diff --git a/tools/perf/ui/browsers/hists.c b/tools/perf/ui/browsers/hists.c |
8462 | index 7a7187e069b4..88c3df24b748 100644 |
8463 | --- a/tools/perf/ui/browsers/hists.c |
8464 | +++ b/tools/perf/ui/browsers/hists.c |
8465 | @@ -3054,6 +3054,7 @@ static int perf_evsel__hists_browse(struct evsel *evsel, int nr_events, |
8466 | |
8467 | continue; |
8468 | } |
8469 | + actions->ms.map = map; |
8470 | top = pstack__peek(browser->pstack); |
8471 | if (top == &browser->hists->dso_filter) { |
8472 | /* |
8473 | diff --git a/tools/perf/ui/gtk/Build b/tools/perf/ui/gtk/Build |
8474 | index ec22e899a224..9b5d5cbb7af7 100644 |
8475 | --- a/tools/perf/ui/gtk/Build |
8476 | +++ b/tools/perf/ui/gtk/Build |
8477 | @@ -7,3 +7,8 @@ gtk-y += util.o |
8478 | gtk-y += helpline.o |
8479 | gtk-y += progress.o |
8480 | gtk-y += annotate.o |
8481 | +gtk-y += zalloc.o |
8482 | + |
8483 | +$(OUTPUT)ui/gtk/zalloc.o: ../lib/zalloc.c FORCE |
8484 | + $(call rule_mkdir) |
8485 | + $(call if_changed_dep,cc_o_c) |
8486 | diff --git a/tools/testing/selftests/ftrace/Makefile b/tools/testing/selftests/ftrace/Makefile |
8487 | index cd1f5b3a7774..d6e106fbce11 100644 |
8488 | --- a/tools/testing/selftests/ftrace/Makefile |
8489 | +++ b/tools/testing/selftests/ftrace/Makefile |
8490 | @@ -2,7 +2,7 @@ |
8491 | all: |
8492 | |
8493 | TEST_PROGS := ftracetest |
8494 | -TEST_FILES := test.d |
8495 | +TEST_FILES := test.d settings |
8496 | EXTRA_CLEAN := $(OUTPUT)/logs/* |
8497 | |
8498 | include ../lib.mk |
8499 | diff --git a/tools/testing/selftests/livepatch/Makefile b/tools/testing/selftests/livepatch/Makefile |
8500 | index fd405402c3ff..485696a01989 100644 |
8501 | --- a/tools/testing/selftests/livepatch/Makefile |
8502 | +++ b/tools/testing/selftests/livepatch/Makefile |
8503 | @@ -6,4 +6,6 @@ TEST_PROGS := \ |
8504 | test-callbacks.sh \ |
8505 | test-shadow-vars.sh |
8506 | |
8507 | +TEST_FILES := settings |
8508 | + |
8509 | include ../lib.mk |
8510 | diff --git a/tools/testing/selftests/net/fib_tests.sh b/tools/testing/selftests/net/fib_tests.sh |
8511 | index 76c1897e6352..474638ef2697 100755 |
8512 | --- a/tools/testing/selftests/net/fib_tests.sh |
8513 | +++ b/tools/testing/selftests/net/fib_tests.sh |
8514 | @@ -910,6 +910,12 @@ ipv6_rt_replace_mpath() |
8515 | check_route6 "2001:db8:104::/64 via 2001:db8:101::3 dev veth1 metric 1024" |
8516 | log_test $? 0 "Multipath with single path via multipath attribute" |
8517 | |
8518 | + # multipath with dev-only |
8519 | + add_initial_route6 "nexthop via 2001:db8:101::2 nexthop via 2001:db8:103::2" |
8520 | + run_cmd "$IP -6 ro replace 2001:db8:104::/64 dev veth1" |
8521 | + check_route6 "2001:db8:104::/64 dev veth1 metric 1024" |
8522 | + log_test $? 0 "Multipath with dev-only" |
8523 | + |
8524 | # route replace fails - invalid nexthop 1 |
8525 | add_initial_route6 "nexthop via 2001:db8:101::2 nexthop via 2001:db8:103::2" |
8526 | run_cmd "$IP -6 ro replace 2001:db8:104::/64 nexthop via 2001:db8:111::3 nexthop via 2001:db8:103::3" |
8527 | diff --git a/tools/testing/selftests/rseq/Makefile b/tools/testing/selftests/rseq/Makefile |
8528 | index d6469535630a..f1053630bb6f 100644 |
8529 | --- a/tools/testing/selftests/rseq/Makefile |
8530 | +++ b/tools/testing/selftests/rseq/Makefile |
8531 | @@ -19,6 +19,8 @@ TEST_GEN_PROGS_EXTENDED = librseq.so |
8532 | |
8533 | TEST_PROGS = run_param_test.sh |
8534 | |
8535 | +TEST_FILES := settings |
8536 | + |
8537 | include ../lib.mk |
8538 | |
8539 | $(OUTPUT)/librseq.so: rseq.c rseq.h rseq-*.h |
8540 | diff --git a/tools/testing/selftests/rtc/Makefile b/tools/testing/selftests/rtc/Makefile |
8541 | index de9c8566672a..90fa1a346908 100644 |
8542 | --- a/tools/testing/selftests/rtc/Makefile |
8543 | +++ b/tools/testing/selftests/rtc/Makefile |
8544 | @@ -6,4 +6,6 @@ TEST_GEN_PROGS = rtctest |
8545 | |
8546 | TEST_GEN_PROGS_EXTENDED = setdate |
8547 | |
8548 | +TEST_FILES := settings |
8549 | + |
8550 | include ../lib.mk |
8551 | diff --git a/usr/include/Makefile b/usr/include/Makefile |
8552 | index 57b20f7b6729..47cb91d3a51d 100644 |
8553 | --- a/usr/include/Makefile |
8554 | +++ b/usr/include/Makefile |
8555 | @@ -99,9 +99,16 @@ endif |
8556 | # asm-generic/*.h is used by asm/*.h, and should not be included directly |
8557 | header-test- += asm-generic/% |
8558 | |
8559 | -# The rest are compile-tested |
8560 | -header-test-y += $(filter-out $(header-test-), \ |
8561 | - $(patsubst $(obj)/%,%, $(wildcard \ |
8562 | - $(addprefix $(obj)/, *.h */*.h */*/*.h */*/*/*.h)))) |
8563 | +extra-y := $(patsubst $(obj)/%.h,%.hdrtest, $(shell find $(obj) -name '*.h')) |
8564 | + |
8565 | +quiet_cmd_hdrtest = HDRTEST $< |
8566 | + cmd_hdrtest = \ |
8567 | + $(CC) $(c_flags) -S -o /dev/null -x c /dev/null \ |
8568 | + $(if $(filter-out $(header-test-), $*.h), -include $<); \ |
8569 | + $(PERL) $(srctree)/scripts/headers_check.pl $(obj) $(SRCARCH) $<; \ |
8570 | + touch $@ |
8571 | + |
8572 | +$(obj)/%.hdrtest: $(obj)/%.h FORCE |
8573 | + $(call if_changed_dep,hdrtest) |
8574 | |
8575 | clean-files += $(filter-out Makefile, $(notdir $(wildcard $(obj)/*))) |
8576 | diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c |
8577 | index b5ea1bafe513..03c681568ab1 100644 |
8578 | --- a/virt/kvm/kvm_main.c |
8579 | +++ b/virt/kvm/kvm_main.c |
8580 | @@ -2275,12 +2275,12 @@ int kvm_write_guest_offset_cached(struct kvm *kvm, struct gfn_to_hva_cache *ghc, |
8581 | if (slots->generation != ghc->generation) |
8582 | __kvm_gfn_to_hva_cache_init(slots, ghc, ghc->gpa, ghc->len); |
8583 | |
8584 | - if (unlikely(!ghc->memslot)) |
8585 | - return kvm_write_guest(kvm, gpa, data, len); |
8586 | - |
8587 | if (kvm_is_error_hva(ghc->hva)) |
8588 | return -EFAULT; |
8589 | |
8590 | + if (unlikely(!ghc->memslot)) |
8591 | + return kvm_write_guest(kvm, gpa, data, len); |
8592 | + |
8593 | r = __copy_to_user((void __user *)ghc->hva + offset, data, len); |
8594 | if (r) |
8595 | return -EFAULT; |
8596 | @@ -2308,12 +2308,12 @@ int kvm_read_guest_cached(struct kvm *kvm, struct gfn_to_hva_cache *ghc, |
8597 | if (slots->generation != ghc->generation) |
8598 | __kvm_gfn_to_hva_cache_init(slots, ghc, ghc->gpa, ghc->len); |
8599 | |
8600 | - if (unlikely(!ghc->memslot)) |
8601 | - return kvm_read_guest(kvm, ghc->gpa, data, len); |
8602 | - |
8603 | if (kvm_is_error_hva(ghc->hva)) |
8604 | return -EFAULT; |
8605 | |
8606 | + if (unlikely(!ghc->memslot)) |
8607 | + return kvm_read_guest(kvm, ghc->gpa, data, len); |
8608 | + |
8609 | r = __copy_from_user(data, (void __user *)ghc->hva, len); |
8610 | if (r) |
8611 | return -EFAULT; |