Contents of /trunk/kernel-alx/patches-5.4/0205-5.4.106-all-fixes.patch
Parent Directory | Revision Log
Revision 3637 -
(show annotations)
(download)
Mon Oct 24 12:40:44 2022 UTC (18 months ago) by niro
File size: 175325 byte(s)
Mon Oct 24 12:40:44 2022 UTC (18 months ago) by niro
File size: 175325 byte(s)
-add missing
1 | diff --git a/Documentation/virt/kvm/api.txt b/Documentation/virt/kvm/api.txt |
2 | index 7064efd3b5ea3..fd22224853e58 100644 |
3 | --- a/Documentation/virt/kvm/api.txt |
4 | +++ b/Documentation/virt/kvm/api.txt |
5 | @@ -172,6 +172,9 @@ is dependent on the CPU capability and the kernel configuration. The limit can |
6 | be retrieved using KVM_CAP_ARM_VM_IPA_SIZE of the KVM_CHECK_EXTENSION |
7 | ioctl() at run-time. |
8 | |
9 | +Creation of the VM will fail if the requested IPA size (whether it is |
10 | +implicit or explicit) is unsupported on the host. |
11 | + |
12 | Please note that configuring the IPA size does not affect the capability |
13 | exposed by the guest CPUs in ID_AA64MMFR0_EL1[PARange]. It only affects |
14 | size of the address translated by the stage2 level (guest physical to |
15 | diff --git a/Makefile b/Makefile |
16 | index e27d031f3241e..a333b378f1f71 100644 |
17 | --- a/Makefile |
18 | +++ b/Makefile |
19 | @@ -1,7 +1,7 @@ |
20 | # SPDX-License-Identifier: GPL-2.0 |
21 | VERSION = 5 |
22 | PATCHLEVEL = 4 |
23 | -SUBLEVEL = 105 |
24 | +SUBLEVEL = 106 |
25 | EXTRAVERSION = |
26 | NAME = Kleptomaniac Octopus |
27 | |
28 | @@ -1175,9 +1175,15 @@ define filechk_utsrelease.h |
29 | endef |
30 | |
31 | define filechk_version.h |
32 | - echo \#define LINUX_VERSION_CODE $(shell \ |
33 | - expr $(VERSION) \* 65536 + 0$(PATCHLEVEL) \* 256 + 0$(SUBLEVEL)); \ |
34 | - echo '#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))' |
35 | + if [ $(SUBLEVEL) -gt 255 ]; then \ |
36 | + echo \#define LINUX_VERSION_CODE $(shell \ |
37 | + expr $(VERSION) \* 65536 + 0$(PATCHLEVEL) \* 256 + 255); \ |
38 | + else \ |
39 | + echo \#define LINUX_VERSION_CODE $(shell \ |
40 | + expr $(VERSION) \* 65536 + 0$(PATCHLEVEL) \* 256 + $(SUBLEVEL)); \ |
41 | + fi; \ |
42 | + echo '#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + \ |
43 | + ((c) > 255 ? 255 : (c)))' |
44 | endef |
45 | |
46 | $(version_h): FORCE |
47 | diff --git a/arch/arm/include/asm/kvm_asm.h b/arch/arm/include/asm/kvm_asm.h |
48 | index f615830f9f57b..9d0b7e677faac 100644 |
49 | --- a/arch/arm/include/asm/kvm_asm.h |
50 | +++ b/arch/arm/include/asm/kvm_asm.h |
51 | @@ -56,7 +56,7 @@ extern char __kvm_hyp_init_end[]; |
52 | extern void __kvm_flush_vm_context(void); |
53 | extern void __kvm_tlb_flush_vmid_ipa(struct kvm *kvm, phys_addr_t ipa); |
54 | extern void __kvm_tlb_flush_vmid(struct kvm *kvm); |
55 | -extern void __kvm_tlb_flush_local_vmid(struct kvm_vcpu *vcpu); |
56 | +extern void __kvm_flush_cpu_context(struct kvm_vcpu *vcpu); |
57 | |
58 | extern void __kvm_timer_set_cntvoff(u32 cntvoff_low, u32 cntvoff_high); |
59 | |
60 | diff --git a/arch/arm/kvm/hyp/tlb.c b/arch/arm/kvm/hyp/tlb.c |
61 | index 848f27bbad9db..80e67108d39d1 100644 |
62 | --- a/arch/arm/kvm/hyp/tlb.c |
63 | +++ b/arch/arm/kvm/hyp/tlb.c |
64 | @@ -45,7 +45,7 @@ void __hyp_text __kvm_tlb_flush_vmid_ipa(struct kvm *kvm, phys_addr_t ipa) |
65 | __kvm_tlb_flush_vmid(kvm); |
66 | } |
67 | |
68 | -void __hyp_text __kvm_tlb_flush_local_vmid(struct kvm_vcpu *vcpu) |
69 | +void __hyp_text __kvm_flush_cpu_context(struct kvm_vcpu *vcpu) |
70 | { |
71 | struct kvm *kvm = kern_hyp_va(kern_hyp_va(vcpu)->kvm); |
72 | |
73 | @@ -54,6 +54,7 @@ void __hyp_text __kvm_tlb_flush_local_vmid(struct kvm_vcpu *vcpu) |
74 | isb(); |
75 | |
76 | write_sysreg(0, TLBIALL); |
77 | + write_sysreg(0, ICIALLU); |
78 | dsb(nsh); |
79 | isb(); |
80 | |
81 | diff --git a/arch/arm64/include/asm/kvm_asm.h b/arch/arm64/include/asm/kvm_asm.h |
82 | index 64d79b2884344..c54e759896c1a 100644 |
83 | --- a/arch/arm64/include/asm/kvm_asm.h |
84 | +++ b/arch/arm64/include/asm/kvm_asm.h |
85 | @@ -60,7 +60,7 @@ extern char __kvm_hyp_vector[]; |
86 | extern void __kvm_flush_vm_context(void); |
87 | extern void __kvm_tlb_flush_vmid_ipa(struct kvm *kvm, phys_addr_t ipa); |
88 | extern void __kvm_tlb_flush_vmid(struct kvm *kvm); |
89 | -extern void __kvm_tlb_flush_local_vmid(struct kvm_vcpu *vcpu); |
90 | +extern void __kvm_flush_cpu_context(struct kvm_vcpu *vcpu); |
91 | |
92 | extern void __kvm_timer_set_cntvoff(u32 cntvoff_low, u32 cntvoff_high); |
93 | |
94 | diff --git a/arch/arm64/include/asm/memory.h b/arch/arm64/include/asm/memory.h |
95 | index 6c295a231882a..67b6b90f37eed 100644 |
96 | --- a/arch/arm64/include/asm/memory.h |
97 | +++ b/arch/arm64/include/asm/memory.h |
98 | @@ -315,6 +315,11 @@ static inline void *phys_to_virt(phys_addr_t x) |
99 | #define ARCH_PFN_OFFSET ((unsigned long)PHYS_PFN_OFFSET) |
100 | |
101 | #if !defined(CONFIG_SPARSEMEM_VMEMMAP) || defined(CONFIG_DEBUG_VIRTUAL) |
102 | +#define page_to_virt(x) ({ \ |
103 | + __typeof__(x) __page = x; \ |
104 | + void *__addr = __va(page_to_phys(__page)); \ |
105 | + (void *)__tag_set((const void *)__addr, page_kasan_tag(__page));\ |
106 | +}) |
107 | #define virt_to_page(x) pfn_to_page(virt_to_pfn(x)) |
108 | #else |
109 | #define page_to_virt(x) ({ \ |
110 | diff --git a/arch/arm64/include/asm/mmu_context.h b/arch/arm64/include/asm/mmu_context.h |
111 | index 3827ff4040a3f..3a5d9f1c91b6d 100644 |
112 | --- a/arch/arm64/include/asm/mmu_context.h |
113 | +++ b/arch/arm64/include/asm/mmu_context.h |
114 | @@ -63,10 +63,7 @@ extern u64 idmap_ptrs_per_pgd; |
115 | |
116 | static inline bool __cpu_uses_extended_idmap(void) |
117 | { |
118 | - if (IS_ENABLED(CONFIG_ARM64_VA_BITS_52)) |
119 | - return false; |
120 | - |
121 | - return unlikely(idmap_t0sz != TCR_T0SZ(VA_BITS)); |
122 | + return unlikely(idmap_t0sz != TCR_T0SZ(vabits_actual)); |
123 | } |
124 | |
125 | /* |
126 | diff --git a/arch/arm64/kernel/head.S b/arch/arm64/kernel/head.S |
127 | index 438de2301cfe3..a2e0b37549433 100644 |
128 | --- a/arch/arm64/kernel/head.S |
129 | +++ b/arch/arm64/kernel/head.S |
130 | @@ -337,7 +337,7 @@ __create_page_tables: |
131 | */ |
132 | adrp x5, __idmap_text_end |
133 | clz x5, x5 |
134 | - cmp x5, TCR_T0SZ(VA_BITS) // default T0SZ small enough? |
135 | + cmp x5, TCR_T0SZ(VA_BITS_MIN) // default T0SZ small enough? |
136 | b.ge 1f // .. then skip VA range extension |
137 | |
138 | adr_l x6, idmap_t0sz |
139 | diff --git a/arch/arm64/kvm/hyp/tlb.c b/arch/arm64/kvm/hyp/tlb.c |
140 | index eb0efc5557f30..7b7213fc17d95 100644 |
141 | --- a/arch/arm64/kvm/hyp/tlb.c |
142 | +++ b/arch/arm64/kvm/hyp/tlb.c |
143 | @@ -182,7 +182,7 @@ void __hyp_text __kvm_tlb_flush_vmid(struct kvm *kvm) |
144 | __tlb_switch_to_host(kvm, &cxt); |
145 | } |
146 | |
147 | -void __hyp_text __kvm_tlb_flush_local_vmid(struct kvm_vcpu *vcpu) |
148 | +void __hyp_text __kvm_flush_cpu_context(struct kvm_vcpu *vcpu) |
149 | { |
150 | struct kvm *kvm = kern_hyp_va(kern_hyp_va(vcpu)->kvm); |
151 | struct tlb_inv_context cxt; |
152 | @@ -191,6 +191,7 @@ void __hyp_text __kvm_tlb_flush_local_vmid(struct kvm_vcpu *vcpu) |
153 | __tlb_switch_to_guest(kvm, &cxt); |
154 | |
155 | __tlbi(vmalle1); |
156 | + asm volatile("ic iallu"); |
157 | dsb(nsh); |
158 | isb(); |
159 | |
160 | diff --git a/arch/arm64/kvm/reset.c b/arch/arm64/kvm/reset.c |
161 | index 784d485218ca1..a3105ae464be1 100644 |
162 | --- a/arch/arm64/kvm/reset.c |
163 | +++ b/arch/arm64/kvm/reset.c |
164 | @@ -378,10 +378,10 @@ void kvm_set_ipa_limit(void) |
165 | pr_info("kvm: Limiting the IPA size due to kernel %s Address limit\n", |
166 | (va_max < pa_max) ? "Virtual" : "Physical"); |
167 | |
168 | - WARN(ipa_max < KVM_PHYS_SHIFT, |
169 | - "KVM IPA limit (%d bit) is smaller than default size\n", ipa_max); |
170 | kvm_ipa_limit = ipa_max; |
171 | - kvm_info("IPA Size Limit: %dbits\n", kvm_ipa_limit); |
172 | + kvm_info("IPA Size Limit: %d bits%s\n", kvm_ipa_limit, |
173 | + ((kvm_ipa_limit < KVM_PHYS_SHIFT) ? |
174 | + " (Reduced IPA size, limited VM/VMM compatibility)" : "")); |
175 | } |
176 | |
177 | /* |
178 | @@ -408,6 +408,11 @@ int kvm_arm_setup_stage2(struct kvm *kvm, unsigned long type) |
179 | return -EINVAL; |
180 | } else { |
181 | phys_shift = KVM_PHYS_SHIFT; |
182 | + if (phys_shift > kvm_ipa_limit) { |
183 | + pr_warn_once("%s using unsupported default IPA limit, upgrade your VMM\n", |
184 | + current->comm); |
185 | + return -EINVAL; |
186 | + } |
187 | } |
188 | |
189 | parange = read_sanitised_ftr_reg(SYS_ID_AA64MMFR0_EL1) & 7; |
190 | diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c |
191 | index 602bd19630ff8..cbcac03c0e0da 100644 |
192 | --- a/arch/arm64/mm/init.c |
193 | +++ b/arch/arm64/mm/init.c |
194 | @@ -245,6 +245,18 @@ int pfn_valid(unsigned long pfn) |
195 | |
196 | if (!valid_section(__nr_to_section(pfn_to_section_nr(pfn)))) |
197 | return 0; |
198 | + |
199 | + /* |
200 | + * ZONE_DEVICE memory does not have the memblock entries. |
201 | + * memblock_is_map_memory() check for ZONE_DEVICE based |
202 | + * addresses will always fail. Even the normal hotplugged |
203 | + * memory will never have MEMBLOCK_NOMAP flag set in their |
204 | + * memblock entries. Skip memblock search for all non early |
205 | + * memory sections covering all of hotplug memory including |
206 | + * both normal and ZONE_DEVICE based. |
207 | + */ |
208 | + if (!early_section(__pfn_to_section(pfn))) |
209 | + return pfn_section_valid(__pfn_to_section(pfn), pfn); |
210 | #endif |
211 | return memblock_is_map_memory(addr); |
212 | } |
213 | diff --git a/arch/arm64/mm/mmu.c b/arch/arm64/mm/mmu.c |
214 | index d10247fab0fdf..99bc0289ab2b6 100644 |
215 | --- a/arch/arm64/mm/mmu.c |
216 | +++ b/arch/arm64/mm/mmu.c |
217 | @@ -38,7 +38,7 @@ |
218 | #define NO_BLOCK_MAPPINGS BIT(0) |
219 | #define NO_CONT_MAPPINGS BIT(1) |
220 | |
221 | -u64 idmap_t0sz = TCR_T0SZ(VA_BITS); |
222 | +u64 idmap_t0sz = TCR_T0SZ(VA_BITS_MIN); |
223 | u64 idmap_ptrs_per_pgd = PTRS_PER_PGD; |
224 | |
225 | u64 __section(".mmuoff.data.write") vabits_actual; |
226 | diff --git a/arch/powerpc/include/asm/code-patching.h b/arch/powerpc/include/asm/code-patching.h |
227 | index 898b542628815..be0f7257b13c8 100644 |
228 | --- a/arch/powerpc/include/asm/code-patching.h |
229 | +++ b/arch/powerpc/include/asm/code-patching.h |
230 | @@ -72,7 +72,7 @@ void __patch_exception(int exc, unsigned long addr); |
231 | #endif |
232 | |
233 | #define OP_RT_RA_MASK 0xffff0000UL |
234 | -#define LIS_R2 0x3c020000UL |
235 | +#define LIS_R2 0x3c400000UL |
236 | #define ADDIS_R2_R12 0x3c4c0000UL |
237 | #define ADDI_R2_R2 0x38420000UL |
238 | |
239 | diff --git a/arch/powerpc/include/asm/machdep.h b/arch/powerpc/include/asm/machdep.h |
240 | index 7bcb64444a394..f71c361dc356f 100644 |
241 | --- a/arch/powerpc/include/asm/machdep.h |
242 | +++ b/arch/powerpc/include/asm/machdep.h |
243 | @@ -59,6 +59,9 @@ struct machdep_calls { |
244 | int (*pcibios_root_bridge_prepare)(struct pci_host_bridge |
245 | *bridge); |
246 | |
247 | + /* finds all the pci_controllers present at boot */ |
248 | + void (*discover_phbs)(void); |
249 | + |
250 | /* To setup PHBs when using automatic OF platform driver for PCI */ |
251 | int (*pci_setup_phb)(struct pci_controller *host); |
252 | |
253 | diff --git a/arch/powerpc/include/asm/ptrace.h b/arch/powerpc/include/asm/ptrace.h |
254 | index c41220f4aad9e..5a424f867c828 100644 |
255 | --- a/arch/powerpc/include/asm/ptrace.h |
256 | +++ b/arch/powerpc/include/asm/ptrace.h |
257 | @@ -62,6 +62,9 @@ struct pt_regs |
258 | }; |
259 | #endif |
260 | |
261 | + |
262 | +#define STACK_FRAME_WITH_PT_REGS (STACK_FRAME_OVERHEAD + sizeof(struct pt_regs)) |
263 | + |
264 | #ifdef __powerpc64__ |
265 | |
266 | /* |
267 | diff --git a/arch/powerpc/kernel/asm-offsets.c b/arch/powerpc/kernel/asm-offsets.c |
268 | index 5c0a1e17219b7..af399675248ed 100644 |
269 | --- a/arch/powerpc/kernel/asm-offsets.c |
270 | +++ b/arch/powerpc/kernel/asm-offsets.c |
271 | @@ -285,7 +285,7 @@ int main(void) |
272 | |
273 | /* Interrupt register frame */ |
274 | DEFINE(INT_FRAME_SIZE, STACK_INT_FRAME_SIZE); |
275 | - DEFINE(SWITCH_FRAME_SIZE, STACK_FRAME_OVERHEAD + sizeof(struct pt_regs)); |
276 | + DEFINE(SWITCH_FRAME_SIZE, STACK_FRAME_WITH_PT_REGS); |
277 | STACK_PT_REGS_OFFSET(GPR0, gpr[0]); |
278 | STACK_PT_REGS_OFFSET(GPR1, gpr[1]); |
279 | STACK_PT_REGS_OFFSET(GPR2, gpr[2]); |
280 | diff --git a/arch/powerpc/kernel/head_32.S b/arch/powerpc/kernel/head_32.S |
281 | index 126ba54384300..edaab1142498c 100644 |
282 | --- a/arch/powerpc/kernel/head_32.S |
283 | +++ b/arch/powerpc/kernel/head_32.S |
284 | @@ -418,10 +418,11 @@ InstructionTLBMiss: |
285 | cmplw 0,r1,r3 |
286 | #endif |
287 | mfspr r2, SPRN_SPRG_PGDIR |
288 | - li r1,_PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_EXEC |
289 | + li r1,_PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_EXEC | _PAGE_USER |
290 | #if defined(CONFIG_MODULES) || defined(CONFIG_DEBUG_PAGEALLOC) |
291 | bge- 112f |
292 | lis r2, (swapper_pg_dir - PAGE_OFFSET)@ha /* if kernel address, use */ |
293 | + li r1,_PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_EXEC |
294 | addi r2, r2, (swapper_pg_dir - PAGE_OFFSET)@l /* kernel page table */ |
295 | #endif |
296 | 112: rlwimi r2,r3,12,20,29 /* insert top 10 bits of address */ |
297 | @@ -480,9 +481,10 @@ DataLoadTLBMiss: |
298 | lis r1,PAGE_OFFSET@h /* check if kernel address */ |
299 | cmplw 0,r1,r3 |
300 | mfspr r2, SPRN_SPRG_PGDIR |
301 | - li r1, _PAGE_PRESENT | _PAGE_ACCESSED |
302 | + li r1, _PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_USER |
303 | bge- 112f |
304 | lis r2, (swapper_pg_dir - PAGE_OFFSET)@ha /* if kernel address, use */ |
305 | + li r1, _PAGE_PRESENT | _PAGE_ACCESSED |
306 | addi r2, r2, (swapper_pg_dir - PAGE_OFFSET)@l /* kernel page table */ |
307 | 112: rlwimi r2,r3,12,20,29 /* insert top 10 bits of address */ |
308 | lwz r2,0(r2) /* get pmd entry */ |
309 | @@ -556,9 +558,10 @@ DataStoreTLBMiss: |
310 | lis r1,PAGE_OFFSET@h /* check if kernel address */ |
311 | cmplw 0,r1,r3 |
312 | mfspr r2, SPRN_SPRG_PGDIR |
313 | - li r1, _PAGE_RW | _PAGE_DIRTY | _PAGE_PRESENT | _PAGE_ACCESSED |
314 | + li r1, _PAGE_RW | _PAGE_DIRTY | _PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_USER |
315 | bge- 112f |
316 | lis r2, (swapper_pg_dir - PAGE_OFFSET)@ha /* if kernel address, use */ |
317 | + li r1, _PAGE_RW | _PAGE_DIRTY | _PAGE_PRESENT | _PAGE_ACCESSED |
318 | addi r2, r2, (swapper_pg_dir - PAGE_OFFSET)@l /* kernel page table */ |
319 | 112: rlwimi r2,r3,12,20,29 /* insert top 10 bits of address */ |
320 | lwz r2,0(r2) /* get pmd entry */ |
321 | diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c |
322 | index 1c448cf255061..a2c258a8d7367 100644 |
323 | --- a/arch/powerpc/kernel/pci-common.c |
324 | +++ b/arch/powerpc/kernel/pci-common.c |
325 | @@ -1669,3 +1669,13 @@ static void fixup_hide_host_resource_fsl(struct pci_dev *dev) |
326 | } |
327 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_MOTOROLA, PCI_ANY_ID, fixup_hide_host_resource_fsl); |
328 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_FREESCALE, PCI_ANY_ID, fixup_hide_host_resource_fsl); |
329 | + |
330 | + |
331 | +static int __init discover_phbs(void) |
332 | +{ |
333 | + if (ppc_md.discover_phbs) |
334 | + ppc_md.discover_phbs(); |
335 | + |
336 | + return 0; |
337 | +} |
338 | +core_initcall(discover_phbs); |
339 | diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c |
340 | index bd0c258a1d5dd..c94bba9142e7e 100644 |
341 | --- a/arch/powerpc/kernel/process.c |
342 | +++ b/arch/powerpc/kernel/process.c |
343 | @@ -2081,7 +2081,7 @@ void show_stack(struct task_struct *tsk, unsigned long *stack) |
344 | * See if this is an exception frame. |
345 | * We look for the "regshere" marker in the current frame. |
346 | */ |
347 | - if (validate_sp(sp, tsk, STACK_INT_FRAME_SIZE) |
348 | + if (validate_sp(sp, tsk, STACK_FRAME_WITH_PT_REGS) |
349 | && stack[STACK_FRAME_MARKER] == STACK_FRAME_REGS_MARKER) { |
350 | struct pt_regs *regs = (struct pt_regs *) |
351 | (sp + STACK_FRAME_OVERHEAD); |
352 | diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c |
353 | index 206032c9b5458..ecfa460f66d17 100644 |
354 | --- a/arch/powerpc/kernel/traps.c |
355 | +++ b/arch/powerpc/kernel/traps.c |
356 | @@ -513,8 +513,11 @@ out: |
357 | die("Unrecoverable nested System Reset", regs, SIGABRT); |
358 | #endif |
359 | /* Must die if the interrupt is not recoverable */ |
360 | - if (!(regs->msr & MSR_RI)) |
361 | + if (!(regs->msr & MSR_RI)) { |
362 | + /* For the reason explained in die_mce, nmi_exit before die */ |
363 | + nmi_exit(); |
364 | die("Unrecoverable System Reset", regs, SIGABRT); |
365 | + } |
366 | |
367 | if (saved_hsrrs) { |
368 | mtspr(SPRN_HSRR0, hsrr0); |
369 | diff --git a/arch/powerpc/perf/core-book3s.c b/arch/powerpc/perf/core-book3s.c |
370 | index 02fc75ddcbb36..6f013e4188349 100644 |
371 | --- a/arch/powerpc/perf/core-book3s.c |
372 | +++ b/arch/powerpc/perf/core-book3s.c |
373 | @@ -2077,7 +2077,17 @@ static void record_and_restart(struct perf_event *event, unsigned long val, |
374 | left += period; |
375 | if (left <= 0) |
376 | left = period; |
377 | - record = siar_valid(regs); |
378 | + |
379 | + /* |
380 | + * If address is not requested in the sample via |
381 | + * PERF_SAMPLE_IP, just record that sample irrespective |
382 | + * of SIAR valid check. |
383 | + */ |
384 | + if (event->attr.sample_type & PERF_SAMPLE_IP) |
385 | + record = siar_valid(regs); |
386 | + else |
387 | + record = 1; |
388 | + |
389 | event->hw.last_period = event->hw.sample_period; |
390 | } |
391 | if (left < 0x80000000LL) |
392 | @@ -2095,9 +2105,10 @@ static void record_and_restart(struct perf_event *event, unsigned long val, |
393 | * MMCR2. Check attr.exclude_kernel and address to drop the sample in |
394 | * these cases. |
395 | */ |
396 | - if (event->attr.exclude_kernel && record) |
397 | - if (is_kernel_addr(mfspr(SPRN_SIAR))) |
398 | - record = 0; |
399 | + if (event->attr.exclude_kernel && |
400 | + (event->attr.sample_type & PERF_SAMPLE_IP) && |
401 | + is_kernel_addr(mfspr(SPRN_SIAR))) |
402 | + record = 0; |
403 | |
404 | /* |
405 | * Finally record data if requested. |
406 | diff --git a/arch/powerpc/platforms/pseries/msi.c b/arch/powerpc/platforms/pseries/msi.c |
407 | index b3ac2455faadc..637300330507f 100644 |
408 | --- a/arch/powerpc/platforms/pseries/msi.c |
409 | +++ b/arch/powerpc/platforms/pseries/msi.c |
410 | @@ -4,6 +4,7 @@ |
411 | * Copyright 2006-2007 Michael Ellerman, IBM Corp. |
412 | */ |
413 | |
414 | +#include <linux/crash_dump.h> |
415 | #include <linux/device.h> |
416 | #include <linux/irq.h> |
417 | #include <linux/msi.h> |
418 | @@ -458,8 +459,28 @@ again: |
419 | return hwirq; |
420 | } |
421 | |
422 | - virq = irq_create_mapping_affinity(NULL, hwirq, |
423 | - entry->affinity); |
424 | + /* |
425 | + * Depending on the number of online CPUs in the original |
426 | + * kernel, it is likely for CPU #0 to be offline in a kdump |
427 | + * kernel. The associated IRQs in the affinity mappings |
428 | + * provided by irq_create_affinity_masks() are thus not |
429 | + * started by irq_startup(), as per-design for managed IRQs. |
430 | + * This can be a problem with multi-queue block devices driven |
431 | + * by blk-mq : such a non-started IRQ is very likely paired |
432 | + * with the single queue enforced by blk-mq during kdump (see |
433 | + * blk_mq_alloc_tag_set()). This causes the device to remain |
434 | + * silent and likely hangs the guest at some point. |
435 | + * |
436 | + * We don't really care for fine-grained affinity when doing |
437 | + * kdump actually : simply ignore the pre-computed affinity |
438 | + * masks in this case and let the default mask with all CPUs |
439 | + * be used when creating the IRQ mappings. |
440 | + */ |
441 | + if (is_kdump_kernel()) |
442 | + virq = irq_create_mapping(NULL, hwirq); |
443 | + else |
444 | + virq = irq_create_mapping_affinity(NULL, hwirq, |
445 | + entry->affinity); |
446 | |
447 | if (!virq) { |
448 | pr_debug("rtas_msi: Failed mapping hwirq %d\n", hwirq); |
449 | diff --git a/arch/s390/kernel/smp.c b/arch/s390/kernel/smp.c |
450 | index 659d99af91566..8c51462f13fd1 100644 |
451 | --- a/arch/s390/kernel/smp.c |
452 | +++ b/arch/s390/kernel/smp.c |
453 | @@ -765,7 +765,7 @@ static int smp_add_core(struct sclp_core_entry *core, cpumask_t *avail, |
454 | static int __smp_rescan_cpus(struct sclp_core_info *info, bool early) |
455 | { |
456 | struct sclp_core_entry *core; |
457 | - cpumask_t avail; |
458 | + static cpumask_t avail; |
459 | bool configured; |
460 | u16 core_id; |
461 | int nr, i; |
462 | diff --git a/arch/sparc/include/asm/mman.h b/arch/sparc/include/asm/mman.h |
463 | index f94532f25db14..274217e7ed702 100644 |
464 | --- a/arch/sparc/include/asm/mman.h |
465 | +++ b/arch/sparc/include/asm/mman.h |
466 | @@ -57,35 +57,39 @@ static inline int sparc_validate_prot(unsigned long prot, unsigned long addr) |
467 | { |
468 | if (prot & ~(PROT_READ | PROT_WRITE | PROT_EXEC | PROT_SEM | PROT_ADI)) |
469 | return 0; |
470 | - if (prot & PROT_ADI) { |
471 | - if (!adi_capable()) |
472 | - return 0; |
473 | + return 1; |
474 | +} |
475 | |
476 | - if (addr) { |
477 | - struct vm_area_struct *vma; |
478 | +#define arch_validate_flags(vm_flags) arch_validate_flags(vm_flags) |
479 | +/* arch_validate_flags() - Ensure combination of flags is valid for a |
480 | + * VMA. |
481 | + */ |
482 | +static inline bool arch_validate_flags(unsigned long vm_flags) |
483 | +{ |
484 | + /* If ADI is being enabled on this VMA, check for ADI |
485 | + * capability on the platform and ensure VMA is suitable |
486 | + * for ADI |
487 | + */ |
488 | + if (vm_flags & VM_SPARC_ADI) { |
489 | + if (!adi_capable()) |
490 | + return false; |
491 | |
492 | - vma = find_vma(current->mm, addr); |
493 | - if (vma) { |
494 | - /* ADI can not be enabled on PFN |
495 | - * mapped pages |
496 | - */ |
497 | - if (vma->vm_flags & (VM_PFNMAP | VM_MIXEDMAP)) |
498 | - return 0; |
499 | + /* ADI can not be enabled on PFN mapped pages */ |
500 | + if (vm_flags & (VM_PFNMAP | VM_MIXEDMAP)) |
501 | + return false; |
502 | |
503 | - /* Mergeable pages can become unmergeable |
504 | - * if ADI is enabled on them even if they |
505 | - * have identical data on them. This can be |
506 | - * because ADI enabled pages with identical |
507 | - * data may still not have identical ADI |
508 | - * tags on them. Disallow ADI on mergeable |
509 | - * pages. |
510 | - */ |
511 | - if (vma->vm_flags & VM_MERGEABLE) |
512 | - return 0; |
513 | - } |
514 | - } |
515 | + /* Mergeable pages can become unmergeable |
516 | + * if ADI is enabled on them even if they |
517 | + * have identical data on them. This can be |
518 | + * because ADI enabled pages with identical |
519 | + * data may still not have identical ADI |
520 | + * tags on them. Disallow ADI on mergeable |
521 | + * pages. |
522 | + */ |
523 | + if (vm_flags & VM_MERGEABLE) |
524 | + return false; |
525 | } |
526 | - return 1; |
527 | + return true; |
528 | } |
529 | #endif /* CONFIG_SPARC64 */ |
530 | |
531 | diff --git a/arch/sparc/mm/init_32.c b/arch/sparc/mm/init_32.c |
532 | index 906eda1158b4d..40dd6cb4a4133 100644 |
533 | --- a/arch/sparc/mm/init_32.c |
534 | +++ b/arch/sparc/mm/init_32.c |
535 | @@ -197,6 +197,9 @@ unsigned long __init bootmem_init(unsigned long *pages_avail) |
536 | size = memblock_phys_mem_size() - memblock_reserved_size(); |
537 | *pages_avail = (size >> PAGE_SHIFT) - high_pages; |
538 | |
539 | + /* Only allow low memory to be allocated via memblock allocation */ |
540 | + memblock_set_current_limit(max_low_pfn << PAGE_SHIFT); |
541 | + |
542 | return max_pfn; |
543 | } |
544 | |
545 | diff --git a/arch/x86/kernel/unwind_orc.c b/arch/x86/kernel/unwind_orc.c |
546 | index f29f015a5e7f3..b934f9f68a168 100644 |
547 | --- a/arch/x86/kernel/unwind_orc.c |
548 | +++ b/arch/x86/kernel/unwind_orc.c |
549 | @@ -357,8 +357,8 @@ static bool deref_stack_regs(struct unwind_state *state, unsigned long addr, |
550 | if (!stack_access_ok(state, addr, sizeof(struct pt_regs))) |
551 | return false; |
552 | |
553 | - *ip = regs->ip; |
554 | - *sp = regs->sp; |
555 | + *ip = READ_ONCE_NOCHECK(regs->ip); |
556 | + *sp = READ_ONCE_NOCHECK(regs->sp); |
557 | return true; |
558 | } |
559 | |
560 | @@ -370,8 +370,8 @@ static bool deref_stack_iret_regs(struct unwind_state *state, unsigned long addr |
561 | if (!stack_access_ok(state, addr, IRET_FRAME_SIZE)) |
562 | return false; |
563 | |
564 | - *ip = regs->ip; |
565 | - *sp = regs->sp; |
566 | + *ip = READ_ONCE_NOCHECK(regs->ip); |
567 | + *sp = READ_ONCE_NOCHECK(regs->sp); |
568 | return true; |
569 | } |
570 | |
571 | @@ -392,12 +392,12 @@ static bool get_reg(struct unwind_state *state, unsigned int reg_off, |
572 | return false; |
573 | |
574 | if (state->full_regs) { |
575 | - *val = ((unsigned long *)state->regs)[reg]; |
576 | + *val = READ_ONCE_NOCHECK(((unsigned long *)state->regs)[reg]); |
577 | return true; |
578 | } |
579 | |
580 | if (state->prev_regs) { |
581 | - *val = ((unsigned long *)state->prev_regs)[reg]; |
582 | + *val = READ_ONCE_NOCHECK(((unsigned long *)state->prev_regs)[reg]); |
583 | return true; |
584 | } |
585 | |
586 | diff --git a/drivers/base/swnode.c b/drivers/base/swnode.c |
587 | index 7d5236eafe845..4c3b9813b2843 100644 |
588 | --- a/drivers/base/swnode.c |
589 | +++ b/drivers/base/swnode.c |
590 | @@ -812,6 +812,9 @@ int software_node_register(const struct software_node *node) |
591 | if (software_node_to_swnode(node)) |
592 | return -EEXIST; |
593 | |
594 | + if (node->parent && !parent) |
595 | + return -EINVAL; |
596 | + |
597 | return PTR_ERR_OR_ZERO(swnode_register(node, parent, 0)); |
598 | } |
599 | EXPORT_SYMBOL_GPL(software_node_register); |
600 | diff --git a/drivers/block/rsxx/core.c b/drivers/block/rsxx/core.c |
601 | index 804d28faa97b0..a1824bb080446 100644 |
602 | --- a/drivers/block/rsxx/core.c |
603 | +++ b/drivers/block/rsxx/core.c |
604 | @@ -869,6 +869,7 @@ static int rsxx_pci_probe(struct pci_dev *dev, |
605 | card->event_wq = create_singlethread_workqueue(DRIVER_NAME"_event"); |
606 | if (!card->event_wq) { |
607 | dev_err(CARD_TO_DEV(card), "Failed card event setup.\n"); |
608 | + st = -ENOMEM; |
609 | goto failed_event_handler; |
610 | } |
611 | |
612 | diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c |
613 | index 22aa432a68bf9..719c6b7741afa 100644 |
614 | --- a/drivers/block/zram/zram_drv.c |
615 | +++ b/drivers/block/zram/zram_drv.c |
616 | @@ -627,7 +627,7 @@ static ssize_t writeback_store(struct device *dev, |
617 | struct bio_vec bio_vec; |
618 | struct page *page; |
619 | ssize_t ret = len; |
620 | - int mode; |
621 | + int mode, err; |
622 | unsigned long blk_idx = 0; |
623 | |
624 | if (sysfs_streq(buf, "idle")) |
625 | @@ -719,12 +719,17 @@ static ssize_t writeback_store(struct device *dev, |
626 | * XXX: A single page IO would be inefficient for write |
627 | * but it would be not bad as starter. |
628 | */ |
629 | - ret = submit_bio_wait(&bio); |
630 | - if (ret) { |
631 | + err = submit_bio_wait(&bio); |
632 | + if (err) { |
633 | zram_slot_lock(zram, index); |
634 | zram_clear_flag(zram, index, ZRAM_UNDER_WB); |
635 | zram_clear_flag(zram, index, ZRAM_IDLE); |
636 | zram_slot_unlock(zram, index); |
637 | + /* |
638 | + * Return last IO error unless every IO were |
639 | + * not suceeded. |
640 | + */ |
641 | + ret = err; |
642 | continue; |
643 | } |
644 | |
645 | diff --git a/drivers/gpu/drm/drm_gem_shmem_helper.c b/drivers/gpu/drm/drm_gem_shmem_helper.c |
646 | index f5918707672f1..d88f4230c2219 100644 |
647 | --- a/drivers/gpu/drm/drm_gem_shmem_helper.c |
648 | +++ b/drivers/gpu/drm/drm_gem_shmem_helper.c |
649 | @@ -474,14 +474,28 @@ static vm_fault_t drm_gem_shmem_fault(struct vm_fault *vmf) |
650 | struct drm_gem_object *obj = vma->vm_private_data; |
651 | struct drm_gem_shmem_object *shmem = to_drm_gem_shmem_obj(obj); |
652 | loff_t num_pages = obj->size >> PAGE_SHIFT; |
653 | + vm_fault_t ret; |
654 | struct page *page; |
655 | + pgoff_t page_offset; |
656 | |
657 | - if (vmf->pgoff >= num_pages || WARN_ON_ONCE(!shmem->pages)) |
658 | - return VM_FAULT_SIGBUS; |
659 | + /* We don't use vmf->pgoff since that has the fake offset */ |
660 | + page_offset = (vmf->address - vma->vm_start) >> PAGE_SHIFT; |
661 | |
662 | - page = shmem->pages[vmf->pgoff]; |
663 | + mutex_lock(&shmem->pages_lock); |
664 | + |
665 | + if (page_offset >= num_pages || |
666 | + WARN_ON_ONCE(!shmem->pages) || |
667 | + shmem->madv < 0) { |
668 | + ret = VM_FAULT_SIGBUS; |
669 | + } else { |
670 | + page = shmem->pages[page_offset]; |
671 | + |
672 | + ret = vmf_insert_page(vma, vmf->address, page); |
673 | + } |
674 | |
675 | - return vmf_insert_page(vma, vmf->address, page); |
676 | + mutex_unlock(&shmem->pages_lock); |
677 | + |
678 | + return ret; |
679 | } |
680 | |
681 | static void drm_gem_shmem_vm_open(struct vm_area_struct *vma) |
682 | @@ -549,9 +563,6 @@ int drm_gem_shmem_mmap(struct file *filp, struct vm_area_struct *vma) |
683 | vma->vm_flags &= ~VM_PFNMAP; |
684 | vma->vm_flags |= VM_MIXEDMAP; |
685 | |
686 | - /* Remove the fake offset */ |
687 | - vma->vm_pgoff -= drm_vma_node_start(&shmem->base.vma_node); |
688 | - |
689 | return 0; |
690 | } |
691 | EXPORT_SYMBOL_GPL(drm_gem_shmem_mmap); |
692 | diff --git a/drivers/gpu/drm/drm_ioc32.c b/drivers/gpu/drm/drm_ioc32.c |
693 | index 22c7fd7196c82..2cf053fb8d54b 100644 |
694 | --- a/drivers/gpu/drm/drm_ioc32.c |
695 | +++ b/drivers/gpu/drm/drm_ioc32.c |
696 | @@ -99,6 +99,8 @@ static int compat_drm_version(struct file *file, unsigned int cmd, |
697 | if (copy_from_user(&v32, (void __user *)arg, sizeof(v32))) |
698 | return -EFAULT; |
699 | |
700 | + memset(&v, 0, sizeof(v)); |
701 | + |
702 | v = (struct drm_version) { |
703 | .name_len = v32.name_len, |
704 | .name = compat_ptr(v32.name), |
705 | @@ -137,6 +139,9 @@ static int compat_drm_getunique(struct file *file, unsigned int cmd, |
706 | |
707 | if (copy_from_user(&uq32, (void __user *)arg, sizeof(uq32))) |
708 | return -EFAULT; |
709 | + |
710 | + memset(&uq, 0, sizeof(uq)); |
711 | + |
712 | uq = (struct drm_unique){ |
713 | .unique_len = uq32.unique_len, |
714 | .unique = compat_ptr(uq32.unique), |
715 | @@ -265,6 +270,8 @@ static int compat_drm_getclient(struct file *file, unsigned int cmd, |
716 | if (copy_from_user(&c32, argp, sizeof(c32))) |
717 | return -EFAULT; |
718 | |
719 | + memset(&client, 0, sizeof(client)); |
720 | + |
721 | client.idx = c32.idx; |
722 | |
723 | err = drm_ioctl_kernel(file, drm_getclient, &client, 0); |
724 | @@ -850,6 +857,8 @@ static int compat_drm_wait_vblank(struct file *file, unsigned int cmd, |
725 | if (copy_from_user(&req32, argp, sizeof(req32))) |
726 | return -EFAULT; |
727 | |
728 | + memset(&req, 0, sizeof(req)); |
729 | + |
730 | req.request.type = req32.request.type; |
731 | req.request.sequence = req32.request.sequence; |
732 | req.request.signal = req32.request.signal; |
733 | @@ -887,6 +896,8 @@ static int compat_drm_mode_addfb2(struct file *file, unsigned int cmd, |
734 | struct drm_mode_fb_cmd2 req64; |
735 | int err; |
736 | |
737 | + memset(&req64, 0, sizeof(req64)); |
738 | + |
739 | if (copy_from_user(&req64, argp, |
740 | offsetof(drm_mode_fb_cmd232_t, modifier))) |
741 | return -EFAULT; |
742 | diff --git a/drivers/gpu/drm/meson/meson_drv.c b/drivers/gpu/drm/meson/meson_drv.c |
743 | index a24f8dec5adc9..86d0961112773 100644 |
744 | --- a/drivers/gpu/drm/meson/meson_drv.c |
745 | +++ b/drivers/gpu/drm/meson/meson_drv.c |
746 | @@ -420,6 +420,16 @@ static int meson_probe_remote(struct platform_device *pdev, |
747 | return count; |
748 | } |
749 | |
750 | +static void meson_drv_shutdown(struct platform_device *pdev) |
751 | +{ |
752 | + struct meson_drm *priv = dev_get_drvdata(&pdev->dev); |
753 | + struct drm_device *drm = priv->drm; |
754 | + |
755 | + DRM_DEBUG_DRIVER("\n"); |
756 | + drm_kms_helper_poll_fini(drm); |
757 | + drm_atomic_helper_shutdown(drm); |
758 | +} |
759 | + |
760 | static int meson_drv_probe(struct platform_device *pdev) |
761 | { |
762 | struct component_match *match = NULL; |
763 | @@ -469,6 +479,7 @@ MODULE_DEVICE_TABLE(of, dt_match); |
764 | |
765 | static struct platform_driver meson_drm_platform_driver = { |
766 | .probe = meson_drv_probe, |
767 | + .shutdown = meson_drv_shutdown, |
768 | .driver = { |
769 | .name = "meson-drm", |
770 | .of_match_table = dt_match, |
771 | diff --git a/drivers/gpu/drm/qxl/qxl_display.c b/drivers/gpu/drm/qxl/qxl_display.c |
772 | index 92d84280096e0..9abf3dc5ef990 100644 |
773 | --- a/drivers/gpu/drm/qxl/qxl_display.c |
774 | +++ b/drivers/gpu/drm/qxl/qxl_display.c |
775 | @@ -325,6 +325,7 @@ static void qxl_crtc_update_monitors_config(struct drm_crtc *crtc, |
776 | |
777 | head.id = i; |
778 | head.flags = 0; |
779 | + head.surface_id = 0; |
780 | oldcount = qdev->monitors_config->count; |
781 | if (crtc->state->active) { |
782 | struct drm_display_mode *mode = &crtc->mode; |
783 | diff --git a/drivers/hid/hid-logitech-dj.c b/drivers/hid/hid-logitech-dj.c |
784 | index 86001cfbdb6f1..b499ac37dc7b0 100644 |
785 | --- a/drivers/hid/hid-logitech-dj.c |
786 | +++ b/drivers/hid/hid-logitech-dj.c |
787 | @@ -995,7 +995,12 @@ static void logi_hidpp_recv_queue_notif(struct hid_device *hdev, |
788 | workitem.reports_supported |= STD_KEYBOARD; |
789 | break; |
790 | case 0x0d: |
791 | - device_type = "eQUAD Lightspeed 1_1"; |
792 | + device_type = "eQUAD Lightspeed 1.1"; |
793 | + logi_hidpp_dev_conn_notif_equad(hdev, hidpp_report, &workitem); |
794 | + workitem.reports_supported |= STD_KEYBOARD; |
795 | + break; |
796 | + case 0x0f: |
797 | + device_type = "eQUAD Lightspeed 1.2"; |
798 | logi_hidpp_dev_conn_notif_equad(hdev, hidpp_report, &workitem); |
799 | workitem.reports_supported |= STD_KEYBOARD; |
800 | break; |
801 | diff --git a/drivers/i2c/busses/i2c-rcar.c b/drivers/i2c/busses/i2c-rcar.c |
802 | index 9c162a01a5849..d0c4b3019e41e 100644 |
803 | --- a/drivers/i2c/busses/i2c-rcar.c |
804 | +++ b/drivers/i2c/busses/i2c-rcar.c |
805 | @@ -89,7 +89,6 @@ |
806 | |
807 | #define RCAR_BUS_PHASE_START (MDBS | MIE | ESG) |
808 | #define RCAR_BUS_PHASE_DATA (MDBS | MIE) |
809 | -#define RCAR_BUS_MASK_DATA (~(ESG | FSB) & 0xFF) |
810 | #define RCAR_BUS_PHASE_STOP (MDBS | MIE | FSB) |
811 | |
812 | #define RCAR_IRQ_SEND (MNR | MAL | MST | MAT | MDE) |
813 | @@ -117,6 +116,7 @@ enum rcar_i2c_type { |
814 | }; |
815 | |
816 | struct rcar_i2c_priv { |
817 | + u32 flags; |
818 | void __iomem *io; |
819 | struct i2c_adapter adap; |
820 | struct i2c_msg *msg; |
821 | @@ -127,7 +127,6 @@ struct rcar_i2c_priv { |
822 | |
823 | int pos; |
824 | u32 icccr; |
825 | - u32 flags; |
826 | u8 recovery_icmcr; /* protected by adapter lock */ |
827 | enum rcar_i2c_type devtype; |
828 | struct i2c_client *slave; |
829 | @@ -616,7 +615,7 @@ static bool rcar_i2c_slave_irq(struct rcar_i2c_priv *priv) |
830 | /* |
831 | * This driver has a lock-free design because there are IP cores (at least |
832 | * R-Car Gen2) which have an inherent race condition in their hardware design. |
833 | - * There, we need to clear RCAR_BUS_MASK_DATA bits as soon as possible after |
834 | + * There, we need to switch to RCAR_BUS_PHASE_DATA as soon as possible after |
835 | * the interrupt was generated, otherwise an unwanted repeated message gets |
836 | * generated. It turned out that taking a spinlock at the beginning of the ISR |
837 | * was already causing repeated messages. Thus, this driver was converted to |
838 | @@ -625,13 +624,11 @@ static bool rcar_i2c_slave_irq(struct rcar_i2c_priv *priv) |
839 | static irqreturn_t rcar_i2c_irq(int irq, void *ptr) |
840 | { |
841 | struct rcar_i2c_priv *priv = ptr; |
842 | - u32 msr, val; |
843 | + u32 msr; |
844 | |
845 | /* Clear START or STOP immediately, except for REPSTART after read */ |
846 | - if (likely(!(priv->flags & ID_P_REP_AFTER_RD))) { |
847 | - val = rcar_i2c_read(priv, ICMCR); |
848 | - rcar_i2c_write(priv, ICMCR, val & RCAR_BUS_MASK_DATA); |
849 | - } |
850 | + if (likely(!(priv->flags & ID_P_REP_AFTER_RD))) |
851 | + rcar_i2c_write(priv, ICMCR, RCAR_BUS_PHASE_DATA); |
852 | |
853 | msr = rcar_i2c_read(priv, ICMSR); |
854 | |
855 | diff --git a/drivers/input/keyboard/applespi.c b/drivers/input/keyboard/applespi.c |
856 | index d38398526965d..a4b7422de534e 100644 |
857 | --- a/drivers/input/keyboard/applespi.c |
858 | +++ b/drivers/input/keyboard/applespi.c |
859 | @@ -48,6 +48,7 @@ |
860 | #include <linux/efi.h> |
861 | #include <linux/input.h> |
862 | #include <linux/input/mt.h> |
863 | +#include <linux/ktime.h> |
864 | #include <linux/leds.h> |
865 | #include <linux/module.h> |
866 | #include <linux/spinlock.h> |
867 | @@ -400,7 +401,7 @@ struct applespi_data { |
868 | unsigned int cmd_msg_cntr; |
869 | /* lock to protect the above parameters and flags below */ |
870 | spinlock_t cmd_msg_lock; |
871 | - bool cmd_msg_queued; |
872 | + ktime_t cmd_msg_queued; |
873 | enum applespi_evt_type cmd_evt_type; |
874 | |
875 | struct led_classdev backlight_info; |
876 | @@ -716,7 +717,7 @@ static void applespi_msg_complete(struct applespi_data *applespi, |
877 | wake_up_all(&applespi->drain_complete); |
878 | |
879 | if (is_write_msg) { |
880 | - applespi->cmd_msg_queued = false; |
881 | + applespi->cmd_msg_queued = 0; |
882 | applespi_send_cmd_msg(applespi); |
883 | } |
884 | |
885 | @@ -758,8 +759,16 @@ static int applespi_send_cmd_msg(struct applespi_data *applespi) |
886 | return 0; |
887 | |
888 | /* check whether send is in progress */ |
889 | - if (applespi->cmd_msg_queued) |
890 | - return 0; |
891 | + if (applespi->cmd_msg_queued) { |
892 | + if (ktime_ms_delta(ktime_get(), applespi->cmd_msg_queued) < 1000) |
893 | + return 0; |
894 | + |
895 | + dev_warn(&applespi->spi->dev, "Command %d timed out\n", |
896 | + applespi->cmd_evt_type); |
897 | + |
898 | + applespi->cmd_msg_queued = 0; |
899 | + applespi->write_active = false; |
900 | + } |
901 | |
902 | /* set up packet */ |
903 | memset(packet, 0, APPLESPI_PACKET_SIZE); |
904 | @@ -856,7 +865,7 @@ static int applespi_send_cmd_msg(struct applespi_data *applespi) |
905 | return sts; |
906 | } |
907 | |
908 | - applespi->cmd_msg_queued = true; |
909 | + applespi->cmd_msg_queued = ktime_get_coarse(); |
910 | applespi->write_active = true; |
911 | |
912 | return 0; |
913 | @@ -1908,7 +1917,7 @@ static int __maybe_unused applespi_resume(struct device *dev) |
914 | applespi->drain = false; |
915 | applespi->have_cl_led_on = false; |
916 | applespi->have_bl_level = 0; |
917 | - applespi->cmd_msg_queued = false; |
918 | + applespi->cmd_msg_queued = 0; |
919 | applespi->read_active = false; |
920 | applespi->write_active = false; |
921 | |
922 | diff --git a/drivers/iommu/amd_iommu_init.c b/drivers/iommu/amd_iommu_init.c |
923 | index 31d7e2d4f3040..ad714ff375f85 100644 |
924 | --- a/drivers/iommu/amd_iommu_init.c |
925 | +++ b/drivers/iommu/amd_iommu_init.c |
926 | @@ -12,6 +12,7 @@ |
927 | #include <linux/acpi.h> |
928 | #include <linux/list.h> |
929 | #include <linux/bitmap.h> |
930 | +#include <linux/delay.h> |
931 | #include <linux/slab.h> |
932 | #include <linux/syscore_ops.h> |
933 | #include <linux/interrupt.h> |
934 | @@ -253,6 +254,8 @@ static enum iommu_init_state init_state = IOMMU_START_STATE; |
935 | static int amd_iommu_enable_interrupts(void); |
936 | static int __init iommu_go_to_state(enum iommu_init_state state); |
937 | static void init_device_table_dma(void); |
938 | +static int iommu_pc_get_set_reg(struct amd_iommu *iommu, u8 bank, u8 cntr, |
939 | + u8 fxn, u64 *value, bool is_write); |
940 | |
941 | static bool amd_iommu_pre_enabled = true; |
942 | |
943 | @@ -1672,13 +1675,11 @@ static int __init init_iommu_all(struct acpi_table_header *table) |
944 | return 0; |
945 | } |
946 | |
947 | -static int iommu_pc_get_set_reg(struct amd_iommu *iommu, u8 bank, u8 cntr, |
948 | - u8 fxn, u64 *value, bool is_write); |
949 | - |
950 | -static void init_iommu_perf_ctr(struct amd_iommu *iommu) |
951 | +static void __init init_iommu_perf_ctr(struct amd_iommu *iommu) |
952 | { |
953 | + int retry; |
954 | struct pci_dev *pdev = iommu->dev; |
955 | - u64 val = 0xabcd, val2 = 0, save_reg = 0; |
956 | + u64 val = 0xabcd, val2 = 0, save_reg, save_src; |
957 | |
958 | if (!iommu_feature(iommu, FEATURE_PC)) |
959 | return; |
960 | @@ -1686,17 +1687,39 @@ static void init_iommu_perf_ctr(struct amd_iommu *iommu) |
961 | amd_iommu_pc_present = true; |
962 | |
963 | /* save the value to restore, if writable */ |
964 | - if (iommu_pc_get_set_reg(iommu, 0, 0, 0, &save_reg, false)) |
965 | + if (iommu_pc_get_set_reg(iommu, 0, 0, 0, &save_reg, false) || |
966 | + iommu_pc_get_set_reg(iommu, 0, 0, 8, &save_src, false)) |
967 | goto pc_false; |
968 | |
969 | - /* Check if the performance counters can be written to */ |
970 | - if ((iommu_pc_get_set_reg(iommu, 0, 0, 0, &val, true)) || |
971 | - (iommu_pc_get_set_reg(iommu, 0, 0, 0, &val2, false)) || |
972 | - (val != val2)) |
973 | + /* |
974 | + * Disable power gating by programing the performance counter |
975 | + * source to 20 (i.e. counts the reads and writes from/to IOMMU |
976 | + * Reserved Register [MMIO Offset 1FF8h] that are ignored.), |
977 | + * which never get incremented during this init phase. |
978 | + * (Note: The event is also deprecated.) |
979 | + */ |
980 | + val = 20; |
981 | + if (iommu_pc_get_set_reg(iommu, 0, 0, 8, &val, true)) |
982 | goto pc_false; |
983 | |
984 | + /* Check if the performance counters can be written to */ |
985 | + val = 0xabcd; |
986 | + for (retry = 5; retry; retry--) { |
987 | + if (iommu_pc_get_set_reg(iommu, 0, 0, 0, &val, true) || |
988 | + iommu_pc_get_set_reg(iommu, 0, 0, 0, &val2, false) || |
989 | + val2) |
990 | + break; |
991 | + |
992 | + /* Wait about 20 msec for power gating to disable and retry. */ |
993 | + msleep(20); |
994 | + } |
995 | + |
996 | /* restore */ |
997 | - if (iommu_pc_get_set_reg(iommu, 0, 0, 0, &save_reg, true)) |
998 | + if (iommu_pc_get_set_reg(iommu, 0, 0, 0, &save_reg, true) || |
999 | + iommu_pc_get_set_reg(iommu, 0, 0, 8, &save_src, true)) |
1000 | + goto pc_false; |
1001 | + |
1002 | + if (val != val2) |
1003 | goto pc_false; |
1004 | |
1005 | pci_info(pdev, "IOMMU performance counters supported\n"); |
1006 | diff --git a/drivers/media/platform/vsp1/vsp1_drm.c b/drivers/media/platform/vsp1/vsp1_drm.c |
1007 | index a4a45d68a6efc..1c00688c71c24 100644 |
1008 | --- a/drivers/media/platform/vsp1/vsp1_drm.c |
1009 | +++ b/drivers/media/platform/vsp1/vsp1_drm.c |
1010 | @@ -245,7 +245,7 @@ static int vsp1_du_pipeline_setup_brx(struct vsp1_device *vsp1, |
1011 | brx = &vsp1->bru->entity; |
1012 | else if (pipe->brx && !drm_pipe->force_brx_release) |
1013 | brx = pipe->brx; |
1014 | - else if (!vsp1->bru->entity.pipe) |
1015 | + else if (vsp1_feature(vsp1, VSP1_HAS_BRU) && !vsp1->bru->entity.pipe) |
1016 | brx = &vsp1->bru->entity; |
1017 | else |
1018 | brx = &vsp1->brs->entity; |
1019 | @@ -462,9 +462,9 @@ static int vsp1_du_pipeline_setup_inputs(struct vsp1_device *vsp1, |
1020 | * make sure it is present in the pipeline's list of entities if it |
1021 | * wasn't already. |
1022 | */ |
1023 | - if (!use_uif) { |
1024 | + if (drm_pipe->uif && !use_uif) { |
1025 | drm_pipe->uif->pipe = NULL; |
1026 | - } else if (!drm_pipe->uif->pipe) { |
1027 | + } else if (drm_pipe->uif && !drm_pipe->uif->pipe) { |
1028 | drm_pipe->uif->pipe = pipe; |
1029 | list_add_tail(&drm_pipe->uif->list_pipe, &pipe->entities); |
1030 | } |
1031 | diff --git a/drivers/media/rc/Makefile b/drivers/media/rc/Makefile |
1032 | index 48d23433b3c06..caeb51def782c 100644 |
1033 | --- a/drivers/media/rc/Makefile |
1034 | +++ b/drivers/media/rc/Makefile |
1035 | @@ -5,6 +5,7 @@ obj-y += keymaps/ |
1036 | obj-$(CONFIG_RC_CORE) += rc-core.o |
1037 | rc-core-y := rc-main.o rc-ir-raw.o |
1038 | rc-core-$(CONFIG_LIRC) += lirc_dev.o |
1039 | +rc-core-$(CONFIG_MEDIA_CEC_RC) += keymaps/rc-cec.o |
1040 | rc-core-$(CONFIG_BPF_LIRC_MODE2) += bpf-lirc.o |
1041 | obj-$(CONFIG_IR_NEC_DECODER) += ir-nec-decoder.o |
1042 | obj-$(CONFIG_IR_RC5_DECODER) += ir-rc5-decoder.o |
1043 | diff --git a/drivers/media/rc/keymaps/Makefile b/drivers/media/rc/keymaps/Makefile |
1044 | index ea91a9afa6a02..d89dcc4481229 100644 |
1045 | --- a/drivers/media/rc/keymaps/Makefile |
1046 | +++ b/drivers/media/rc/keymaps/Makefile |
1047 | @@ -20,7 +20,6 @@ obj-$(CONFIG_RC_MAP) += rc-adstech-dvb-t-pci.o \ |
1048 | rc-behold.o \ |
1049 | rc-behold-columbus.o \ |
1050 | rc-budget-ci-old.o \ |
1051 | - rc-cec.o \ |
1052 | rc-cinergy-1400.o \ |
1053 | rc-cinergy.o \ |
1054 | rc-d680-dmb.o \ |
1055 | diff --git a/drivers/media/rc/keymaps/rc-cec.c b/drivers/media/rc/keymaps/rc-cec.c |
1056 | index 3e3bd11092b45..068e22aeac8c3 100644 |
1057 | --- a/drivers/media/rc/keymaps/rc-cec.c |
1058 | +++ b/drivers/media/rc/keymaps/rc-cec.c |
1059 | @@ -1,5 +1,15 @@ |
1060 | // SPDX-License-Identifier: GPL-2.0-or-later |
1061 | /* Keytable for the CEC remote control |
1062 | + * |
1063 | + * This keymap is unusual in that it can't be built as a module, |
1064 | + * instead it is registered directly in rc-main.c if CONFIG_MEDIA_CEC_RC |
1065 | + * is set. This is because it can be called from drm_dp_cec_set_edid() via |
1066 | + * cec_register_adapter() in an asynchronous context, and it is not |
1067 | + * allowed to use request_module() to load rc-cec.ko in that case. |
1068 | + * |
1069 | + * Since this keymap is only used if CONFIG_MEDIA_CEC_RC is set, we |
1070 | + * just compile this keymap into the rc-core module and never as a |
1071 | + * separate module. |
1072 | * |
1073 | * Copyright (c) 2015 by Kamil Debski |
1074 | */ |
1075 | @@ -152,7 +162,7 @@ static struct rc_map_table cec[] = { |
1076 | /* 0x77-0xff: Reserved */ |
1077 | }; |
1078 | |
1079 | -static struct rc_map_list cec_map = { |
1080 | +struct rc_map_list cec_map = { |
1081 | .map = { |
1082 | .scan = cec, |
1083 | .size = ARRAY_SIZE(cec), |
1084 | @@ -160,19 +170,3 @@ static struct rc_map_list cec_map = { |
1085 | .name = RC_MAP_CEC, |
1086 | } |
1087 | }; |
1088 | - |
1089 | -static int __init init_rc_map_cec(void) |
1090 | -{ |
1091 | - return rc_map_register(&cec_map); |
1092 | -} |
1093 | - |
1094 | -static void __exit exit_rc_map_cec(void) |
1095 | -{ |
1096 | - rc_map_unregister(&cec_map); |
1097 | -} |
1098 | - |
1099 | -module_init(init_rc_map_cec); |
1100 | -module_exit(exit_rc_map_cec); |
1101 | - |
1102 | -MODULE_LICENSE("GPL"); |
1103 | -MODULE_AUTHOR("Kamil Debski"); |
1104 | diff --git a/drivers/media/rc/rc-main.c b/drivers/media/rc/rc-main.c |
1105 | index c4d7e06974d2c..ee80f38970bc4 100644 |
1106 | --- a/drivers/media/rc/rc-main.c |
1107 | +++ b/drivers/media/rc/rc-main.c |
1108 | @@ -2033,6 +2033,9 @@ static int __init rc_core_init(void) |
1109 | |
1110 | led_trigger_register_simple("rc-feedback", &led_feedback); |
1111 | rc_map_register(&empty_map); |
1112 | +#ifdef CONFIG_MEDIA_CEC_RC |
1113 | + rc_map_register(&cec_map); |
1114 | +#endif |
1115 | |
1116 | return 0; |
1117 | } |
1118 | @@ -2042,6 +2045,9 @@ static void __exit rc_core_exit(void) |
1119 | lirc_dev_exit(); |
1120 | class_unregister(&rc_class); |
1121 | led_trigger_unregister_simple(led_feedback); |
1122 | +#ifdef CONFIG_MEDIA_CEC_RC |
1123 | + rc_map_unregister(&cec_map); |
1124 | +#endif |
1125 | rc_map_unregister(&empty_map); |
1126 | } |
1127 | |
1128 | diff --git a/drivers/media/usb/usbtv/usbtv-audio.c b/drivers/media/usb/usbtv/usbtv-audio.c |
1129 | index 6f108996142d7..bbfaec2e6ef61 100644 |
1130 | --- a/drivers/media/usb/usbtv/usbtv-audio.c |
1131 | +++ b/drivers/media/usb/usbtv/usbtv-audio.c |
1132 | @@ -399,7 +399,7 @@ void usbtv_audio_free(struct usbtv *usbtv) |
1133 | cancel_work_sync(&usbtv->snd_trigger); |
1134 | |
1135 | if (usbtv->snd && usbtv->udev) { |
1136 | - snd_card_free(usbtv->snd); |
1137 | + snd_card_free_when_closed(usbtv->snd); |
1138 | usbtv->snd = NULL; |
1139 | } |
1140 | } |
1141 | diff --git a/drivers/misc/fastrpc.c b/drivers/misc/fastrpc.c |
1142 | index 3a5d2890fe2aa..beaf15807f789 100644 |
1143 | --- a/drivers/misc/fastrpc.c |
1144 | +++ b/drivers/misc/fastrpc.c |
1145 | @@ -924,6 +924,11 @@ static int fastrpc_internal_invoke(struct fastrpc_user *fl, u32 kernel, |
1146 | if (!fl->cctx->rpdev) |
1147 | return -EPIPE; |
1148 | |
1149 | + if (handle == FASTRPC_INIT_HANDLE && !kernel) { |
1150 | + dev_warn_ratelimited(fl->sctx->dev, "user app trying to send a kernel RPC message (%d)\n", handle); |
1151 | + return -EPERM; |
1152 | + } |
1153 | + |
1154 | ctx = fastrpc_context_alloc(fl, kernel, sc, args); |
1155 | if (IS_ERR(ctx)) |
1156 | return PTR_ERR(ctx); |
1157 | diff --git a/drivers/misc/pvpanic.c b/drivers/misc/pvpanic.c |
1158 | index 95ff7c5a1dfb6..0a5e5b841aeb1 100644 |
1159 | --- a/drivers/misc/pvpanic.c |
1160 | +++ b/drivers/misc/pvpanic.c |
1161 | @@ -166,6 +166,7 @@ static const struct of_device_id pvpanic_mmio_match[] = { |
1162 | { .compatible = "qemu,pvpanic-mmio", }, |
1163 | {} |
1164 | }; |
1165 | +MODULE_DEVICE_TABLE(of, pvpanic_mmio_match); |
1166 | |
1167 | static struct platform_driver pvpanic_mmio_driver = { |
1168 | .driver = { |
1169 | diff --git a/drivers/mmc/core/bus.c b/drivers/mmc/core/bus.c |
1170 | index 74de3f2dda38e..28501f165d457 100644 |
1171 | --- a/drivers/mmc/core/bus.c |
1172 | +++ b/drivers/mmc/core/bus.c |
1173 | @@ -373,11 +373,6 @@ void mmc_remove_card(struct mmc_card *card) |
1174 | mmc_remove_card_debugfs(card); |
1175 | #endif |
1176 | |
1177 | - if (host->cqe_enabled) { |
1178 | - host->cqe_ops->cqe_disable(host); |
1179 | - host->cqe_enabled = false; |
1180 | - } |
1181 | - |
1182 | if (mmc_card_present(card)) { |
1183 | if (mmc_host_is_spi(card->host)) { |
1184 | pr_info("%s: SPI card removed\n", |
1185 | @@ -390,6 +385,10 @@ void mmc_remove_card(struct mmc_card *card) |
1186 | of_node_put(card->dev.of_node); |
1187 | } |
1188 | |
1189 | + if (host->cqe_enabled) { |
1190 | + host->cqe_ops->cqe_disable(host); |
1191 | + host->cqe_enabled = false; |
1192 | + } |
1193 | + |
1194 | put_device(&card->dev); |
1195 | } |
1196 | - |
1197 | diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c |
1198 | index de14b5845f525..9f29288f2c9a9 100644 |
1199 | --- a/drivers/mmc/core/mmc.c |
1200 | +++ b/drivers/mmc/core/mmc.c |
1201 | @@ -423,10 +423,6 @@ static int mmc_decode_ext_csd(struct mmc_card *card, u8 *ext_csd) |
1202 | |
1203 | /* EXT_CSD value is in units of 10ms, but we store in ms */ |
1204 | card->ext_csd.part_time = 10 * ext_csd[EXT_CSD_PART_SWITCH_TIME]; |
1205 | - /* Some eMMC set the value too low so set a minimum */ |
1206 | - if (card->ext_csd.part_time && |
1207 | - card->ext_csd.part_time < MMC_MIN_PART_SWITCH_TIME) |
1208 | - card->ext_csd.part_time = MMC_MIN_PART_SWITCH_TIME; |
1209 | |
1210 | /* Sleep / awake timeout in 100ns units */ |
1211 | if (sa_shift > 0 && sa_shift <= 0x17) |
1212 | @@ -616,6 +612,17 @@ static int mmc_decode_ext_csd(struct mmc_card *card, u8 *ext_csd) |
1213 | card->ext_csd.data_sector_size = 512; |
1214 | } |
1215 | |
1216 | + /* |
1217 | + * GENERIC_CMD6_TIME is to be used "unless a specific timeout is defined |
1218 | + * when accessing a specific field", so use it here if there is no |
1219 | + * PARTITION_SWITCH_TIME. |
1220 | + */ |
1221 | + if (!card->ext_csd.part_time) |
1222 | + card->ext_csd.part_time = card->ext_csd.generic_cmd6_time; |
1223 | + /* Some eMMC set the value too low so set a minimum */ |
1224 | + if (card->ext_csd.part_time < MMC_MIN_PART_SWITCH_TIME) |
1225 | + card->ext_csd.part_time = MMC_MIN_PART_SWITCH_TIME; |
1226 | + |
1227 | /* eMMC v5 or later */ |
1228 | if (card->ext_csd.rev >= 7) { |
1229 | memcpy(card->ext_csd.fwrev, &ext_csd[EXT_CSD_FIRMWARE_VERSION], |
1230 | diff --git a/drivers/mmc/host/mtk-sd.c b/drivers/mmc/host/mtk-sd.c |
1231 | index 9d47a2bd2546b..1254a5650cfff 100644 |
1232 | --- a/drivers/mmc/host/mtk-sd.c |
1233 | +++ b/drivers/mmc/host/mtk-sd.c |
1234 | @@ -1020,13 +1020,13 @@ static void msdc_track_cmd_data(struct msdc_host *host, |
1235 | static void msdc_request_done(struct msdc_host *host, struct mmc_request *mrq) |
1236 | { |
1237 | unsigned long flags; |
1238 | - bool ret; |
1239 | |
1240 | - ret = cancel_delayed_work(&host->req_timeout); |
1241 | - if (!ret) { |
1242 | - /* delay work already running */ |
1243 | - return; |
1244 | - } |
1245 | + /* |
1246 | + * No need check the return value of cancel_delayed_work, as only ONE |
1247 | + * path will go here! |
1248 | + */ |
1249 | + cancel_delayed_work(&host->req_timeout); |
1250 | + |
1251 | spin_lock_irqsave(&host->lock, flags); |
1252 | host->mrq = NULL; |
1253 | spin_unlock_irqrestore(&host->lock, flags); |
1254 | @@ -1046,7 +1046,7 @@ static bool msdc_cmd_done(struct msdc_host *host, int events, |
1255 | bool done = false; |
1256 | bool sbc_error; |
1257 | unsigned long flags; |
1258 | - u32 *rsp = cmd->resp; |
1259 | + u32 *rsp; |
1260 | |
1261 | if (mrq->sbc && cmd == mrq->cmd && |
1262 | (events & (MSDC_INT_ACMDRDY | MSDC_INT_ACMDCRCERR |
1263 | @@ -1067,6 +1067,7 @@ static bool msdc_cmd_done(struct msdc_host *host, int events, |
1264 | |
1265 | if (done) |
1266 | return true; |
1267 | + rsp = cmd->resp; |
1268 | |
1269 | sdr_clr_bits(host->base + MSDC_INTEN, cmd_ints_mask); |
1270 | |
1271 | @@ -1254,7 +1255,7 @@ static void msdc_data_xfer_next(struct msdc_host *host, |
1272 | static bool msdc_data_xfer_done(struct msdc_host *host, u32 events, |
1273 | struct mmc_request *mrq, struct mmc_data *data) |
1274 | { |
1275 | - struct mmc_command *stop = data->stop; |
1276 | + struct mmc_command *stop; |
1277 | unsigned long flags; |
1278 | bool done; |
1279 | unsigned int check_data = events & |
1280 | @@ -1270,6 +1271,7 @@ static bool msdc_data_xfer_done(struct msdc_host *host, u32 events, |
1281 | |
1282 | if (done) |
1283 | return true; |
1284 | + stop = data->stop; |
1285 | |
1286 | if (check_data || (stop && stop->error)) { |
1287 | dev_dbg(host->dev, "DMA status: 0x%8X\n", |
1288 | diff --git a/drivers/mmc/host/mxs-mmc.c b/drivers/mmc/host/mxs-mmc.c |
1289 | index 4031217d21c37..52054931c3507 100644 |
1290 | --- a/drivers/mmc/host/mxs-mmc.c |
1291 | +++ b/drivers/mmc/host/mxs-mmc.c |
1292 | @@ -644,7 +644,7 @@ static int mxs_mmc_probe(struct platform_device *pdev) |
1293 | |
1294 | ret = mmc_of_parse(mmc); |
1295 | if (ret) |
1296 | - goto out_clk_disable; |
1297 | + goto out_free_dma; |
1298 | |
1299 | mmc->ocr_avail = MMC_VDD_32_33 | MMC_VDD_33_34; |
1300 | |
1301 | diff --git a/drivers/net/can/flexcan.c b/drivers/net/can/flexcan.c |
1302 | index 1bd955e4c7d66..b6d00dfa8b8f6 100644 |
1303 | --- a/drivers/net/can/flexcan.c |
1304 | +++ b/drivers/net/can/flexcan.c |
1305 | @@ -548,7 +548,7 @@ static int flexcan_chip_freeze(struct flexcan_priv *priv) |
1306 | u32 reg; |
1307 | |
1308 | reg = priv->read(®s->mcr); |
1309 | - reg |= FLEXCAN_MCR_HALT; |
1310 | + reg |= FLEXCAN_MCR_FRZ | FLEXCAN_MCR_HALT; |
1311 | priv->write(reg, ®s->mcr); |
1312 | |
1313 | while (timeout-- && !(priv->read(®s->mcr) & FLEXCAN_MCR_FRZ_ACK)) |
1314 | @@ -1057,10 +1057,13 @@ static int flexcan_chip_start(struct net_device *dev) |
1315 | |
1316 | flexcan_set_bittiming(dev); |
1317 | |
1318 | + /* set freeze, halt */ |
1319 | + err = flexcan_chip_freeze(priv); |
1320 | + if (err) |
1321 | + goto out_chip_disable; |
1322 | + |
1323 | /* MCR |
1324 | * |
1325 | - * enable freeze |
1326 | - * halt now |
1327 | * only supervisor access |
1328 | * enable warning int |
1329 | * enable individual RX masking |
1330 | @@ -1069,9 +1072,8 @@ static int flexcan_chip_start(struct net_device *dev) |
1331 | */ |
1332 | reg_mcr = priv->read(®s->mcr); |
1333 | reg_mcr &= ~FLEXCAN_MCR_MAXMB(0xff); |
1334 | - reg_mcr |= FLEXCAN_MCR_FRZ | FLEXCAN_MCR_HALT | FLEXCAN_MCR_SUPV | |
1335 | - FLEXCAN_MCR_WRN_EN | FLEXCAN_MCR_IRMQ | FLEXCAN_MCR_IDAM_C | |
1336 | - FLEXCAN_MCR_MAXMB(priv->tx_mb_idx); |
1337 | + reg_mcr |= FLEXCAN_MCR_SUPV | FLEXCAN_MCR_WRN_EN | FLEXCAN_MCR_IRMQ | |
1338 | + FLEXCAN_MCR_IDAM_C | FLEXCAN_MCR_MAXMB(priv->tx_mb_idx); |
1339 | |
1340 | /* MCR |
1341 | * |
1342 | @@ -1432,10 +1434,14 @@ static int register_flexcandev(struct net_device *dev) |
1343 | if (err) |
1344 | goto out_chip_disable; |
1345 | |
1346 | - /* set freeze, halt and activate FIFO, restrict register access */ |
1347 | + /* set freeze, halt */ |
1348 | + err = flexcan_chip_freeze(priv); |
1349 | + if (err) |
1350 | + goto out_chip_disable; |
1351 | + |
1352 | + /* activate FIFO, restrict register access */ |
1353 | reg = priv->read(®s->mcr); |
1354 | - reg |= FLEXCAN_MCR_FRZ | FLEXCAN_MCR_HALT | |
1355 | - FLEXCAN_MCR_FEN | FLEXCAN_MCR_SUPV; |
1356 | + reg |= FLEXCAN_MCR_FEN | FLEXCAN_MCR_SUPV; |
1357 | priv->write(reg, ®s->mcr); |
1358 | |
1359 | /* Currently we only support newer versions of this core |
1360 | diff --git a/drivers/net/can/m_can/tcan4x5x.c b/drivers/net/can/m_can/tcan4x5x.c |
1361 | index 1f8710b35c6d7..32cb479fe6ac8 100644 |
1362 | --- a/drivers/net/can/m_can/tcan4x5x.c |
1363 | +++ b/drivers/net/can/m_can/tcan4x5x.c |
1364 | @@ -325,14 +325,14 @@ static int tcan4x5x_init(struct m_can_classdev *cdev) |
1365 | if (ret) |
1366 | return ret; |
1367 | |
1368 | + /* Zero out the MCAN buffers */ |
1369 | + m_can_init_ram(cdev); |
1370 | + |
1371 | ret = regmap_update_bits(tcan4x5x->regmap, TCAN4X5X_CONFIG, |
1372 | TCAN4X5X_MODE_SEL_MASK, TCAN4X5X_MODE_NORMAL); |
1373 | if (ret) |
1374 | return ret; |
1375 | |
1376 | - /* Zero out the MCAN buffers */ |
1377 | - m_can_init_ram(cdev); |
1378 | - |
1379 | return ret; |
1380 | } |
1381 | |
1382 | diff --git a/drivers/net/ethernet/atheros/alx/main.c b/drivers/net/ethernet/atheros/alx/main.c |
1383 | index aa693c8e285ab..bde8ec75ac4e9 100644 |
1384 | --- a/drivers/net/ethernet/atheros/alx/main.c |
1385 | +++ b/drivers/net/ethernet/atheros/alx/main.c |
1386 | @@ -1897,13 +1897,16 @@ static int alx_resume(struct device *dev) |
1387 | |
1388 | if (!netif_running(alx->dev)) |
1389 | return 0; |
1390 | - netif_device_attach(alx->dev); |
1391 | |
1392 | rtnl_lock(); |
1393 | err = __alx_open(alx, true); |
1394 | rtnl_unlock(); |
1395 | + if (err) |
1396 | + return err; |
1397 | |
1398 | - return err; |
1399 | + netif_device_attach(alx->dev); |
1400 | + |
1401 | + return 0; |
1402 | } |
1403 | |
1404 | static SIMPLE_DEV_PM_OPS(alx_pm_ops, alx_suspend, alx_resume); |
1405 | diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c |
1406 | index 4ae49d92c1eed..5a7831a97a132 100644 |
1407 | --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c |
1408 | +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c |
1409 | @@ -7925,10 +7925,18 @@ static void bnxt_setup_inta(struct bnxt *bp) |
1410 | bp->irq_tbl[0].handler = bnxt_inta; |
1411 | } |
1412 | |
1413 | +static int bnxt_init_int_mode(struct bnxt *bp); |
1414 | + |
1415 | static int bnxt_setup_int_mode(struct bnxt *bp) |
1416 | { |
1417 | int rc; |
1418 | |
1419 | + if (!bp->irq_tbl) { |
1420 | + rc = bnxt_init_int_mode(bp); |
1421 | + if (rc || !bp->irq_tbl) |
1422 | + return rc ?: -ENODEV; |
1423 | + } |
1424 | + |
1425 | if (bp->flags & BNXT_FLAG_USING_MSIX) |
1426 | bnxt_setup_msix(bp); |
1427 | else |
1428 | @@ -8113,7 +8121,7 @@ static int bnxt_init_inta(struct bnxt *bp) |
1429 | |
1430 | static int bnxt_init_int_mode(struct bnxt *bp) |
1431 | { |
1432 | - int rc = 0; |
1433 | + int rc = -ENODEV; |
1434 | |
1435 | if (bp->flags & BNXT_FLAG_MSIX_CAP) |
1436 | rc = bnxt_init_msix(bp); |
1437 | @@ -8748,7 +8756,8 @@ static int bnxt_hwrm_if_change(struct bnxt *bp, bool up) |
1438 | { |
1439 | struct hwrm_func_drv_if_change_output *resp = bp->hwrm_cmd_resp_addr; |
1440 | struct hwrm_func_drv_if_change_input req = {0}; |
1441 | - bool resc_reinit = false, fw_reset = false; |
1442 | + bool fw_reset = !bp->irq_tbl; |
1443 | + bool resc_reinit = false; |
1444 | u32 flags = 0; |
1445 | int rc; |
1446 | |
1447 | @@ -8776,6 +8785,7 @@ static int bnxt_hwrm_if_change(struct bnxt *bp, bool up) |
1448 | |
1449 | if (test_bit(BNXT_STATE_IN_FW_RESET, &bp->state) && !fw_reset) { |
1450 | netdev_err(bp->dev, "RESET_DONE not set during FW reset.\n"); |
1451 | + set_bit(BNXT_STATE_ABORT_ERR, &bp->state); |
1452 | return -ENODEV; |
1453 | } |
1454 | if (resc_reinit || fw_reset) { |
1455 | diff --git a/drivers/net/ethernet/davicom/dm9000.c b/drivers/net/ethernet/davicom/dm9000.c |
1456 | index 70060c51854fd..0928bec79fe4b 100644 |
1457 | --- a/drivers/net/ethernet/davicom/dm9000.c |
1458 | +++ b/drivers/net/ethernet/davicom/dm9000.c |
1459 | @@ -134,6 +134,8 @@ struct board_info { |
1460 | u32 wake_state; |
1461 | |
1462 | int ip_summed; |
1463 | + |
1464 | + struct regulator *power_supply; |
1465 | }; |
1466 | |
1467 | /* debug code */ |
1468 | @@ -1454,7 +1456,7 @@ dm9000_probe(struct platform_device *pdev) |
1469 | if (ret) { |
1470 | dev_err(dev, "failed to request reset gpio %d: %d\n", |
1471 | reset_gpios, ret); |
1472 | - return -ENODEV; |
1473 | + goto out_regulator_disable; |
1474 | } |
1475 | |
1476 | /* According to manual PWRST# Low Period Min 1ms */ |
1477 | @@ -1466,8 +1468,10 @@ dm9000_probe(struct platform_device *pdev) |
1478 | |
1479 | if (!pdata) { |
1480 | pdata = dm9000_parse_dt(&pdev->dev); |
1481 | - if (IS_ERR(pdata)) |
1482 | - return PTR_ERR(pdata); |
1483 | + if (IS_ERR(pdata)) { |
1484 | + ret = PTR_ERR(pdata); |
1485 | + goto out_regulator_disable; |
1486 | + } |
1487 | } |
1488 | |
1489 | /* Init network device */ |
1490 | @@ -1484,6 +1488,8 @@ dm9000_probe(struct platform_device *pdev) |
1491 | |
1492 | db->dev = &pdev->dev; |
1493 | db->ndev = ndev; |
1494 | + if (!IS_ERR(power)) |
1495 | + db->power_supply = power; |
1496 | |
1497 | spin_lock_init(&db->lock); |
1498 | mutex_init(&db->addr_lock); |
1499 | @@ -1708,6 +1714,10 @@ out: |
1500 | dm9000_release_board(pdev, db); |
1501 | free_netdev(ndev); |
1502 | |
1503 | +out_regulator_disable: |
1504 | + if (!IS_ERR(power)) |
1505 | + regulator_disable(power); |
1506 | + |
1507 | return ret; |
1508 | } |
1509 | |
1510 | @@ -1765,10 +1775,13 @@ static int |
1511 | dm9000_drv_remove(struct platform_device *pdev) |
1512 | { |
1513 | struct net_device *ndev = platform_get_drvdata(pdev); |
1514 | + struct board_info *dm = to_dm9000_board(ndev); |
1515 | |
1516 | unregister_netdev(ndev); |
1517 | - dm9000_release_board(pdev, netdev_priv(ndev)); |
1518 | + dm9000_release_board(pdev, dm); |
1519 | free_netdev(ndev); /* free device structure */ |
1520 | + if (dm->power_supply) |
1521 | + regulator_disable(dm->power_supply); |
1522 | |
1523 | dev_dbg(&pdev->dev, "released and freed device\n"); |
1524 | return 0; |
1525 | diff --git a/drivers/net/ethernet/freescale/enetc/enetc.c b/drivers/net/ethernet/freescale/enetc/enetc.c |
1526 | index 4ef4d41b0d8d6..b77eaf31bd4ed 100644 |
1527 | --- a/drivers/net/ethernet/freescale/enetc/enetc.c |
1528 | +++ b/drivers/net/ethernet/freescale/enetc/enetc.c |
1529 | @@ -942,7 +942,7 @@ static void enetc_free_rxtx_rings(struct enetc_ndev_priv *priv) |
1530 | enetc_free_tx_ring(priv->tx_ring[i]); |
1531 | } |
1532 | |
1533 | -static int enetc_alloc_cbdr(struct device *dev, struct enetc_cbdr *cbdr) |
1534 | +int enetc_alloc_cbdr(struct device *dev, struct enetc_cbdr *cbdr) |
1535 | { |
1536 | int size = cbdr->bd_count * sizeof(struct enetc_cbd); |
1537 | |
1538 | @@ -963,7 +963,7 @@ static int enetc_alloc_cbdr(struct device *dev, struct enetc_cbdr *cbdr) |
1539 | return 0; |
1540 | } |
1541 | |
1542 | -static void enetc_free_cbdr(struct device *dev, struct enetc_cbdr *cbdr) |
1543 | +void enetc_free_cbdr(struct device *dev, struct enetc_cbdr *cbdr) |
1544 | { |
1545 | int size = cbdr->bd_count * sizeof(struct enetc_cbd); |
1546 | |
1547 | @@ -971,7 +971,7 @@ static void enetc_free_cbdr(struct device *dev, struct enetc_cbdr *cbdr) |
1548 | cbdr->bd_base = NULL; |
1549 | } |
1550 | |
1551 | -static void enetc_setup_cbdr(struct enetc_hw *hw, struct enetc_cbdr *cbdr) |
1552 | +void enetc_setup_cbdr(struct enetc_hw *hw, struct enetc_cbdr *cbdr) |
1553 | { |
1554 | /* set CBDR cache attributes */ |
1555 | enetc_wr(hw, ENETC_SICAR2, |
1556 | @@ -991,7 +991,7 @@ static void enetc_setup_cbdr(struct enetc_hw *hw, struct enetc_cbdr *cbdr) |
1557 | cbdr->cir = hw->reg + ENETC_SICBDRCIR; |
1558 | } |
1559 | |
1560 | -static void enetc_clear_cbdr(struct enetc_hw *hw) |
1561 | +void enetc_clear_cbdr(struct enetc_hw *hw) |
1562 | { |
1563 | enetc_wr(hw, ENETC_SICBDRMR, 0); |
1564 | } |
1565 | @@ -1016,13 +1016,12 @@ static int enetc_setup_default_rss_table(struct enetc_si *si, int num_groups) |
1566 | return 0; |
1567 | } |
1568 | |
1569 | -static int enetc_configure_si(struct enetc_ndev_priv *priv) |
1570 | +int enetc_configure_si(struct enetc_ndev_priv *priv) |
1571 | { |
1572 | struct enetc_si *si = priv->si; |
1573 | struct enetc_hw *hw = &si->hw; |
1574 | int err; |
1575 | |
1576 | - enetc_setup_cbdr(hw, &si->cbd_ring); |
1577 | /* set SI cache attributes */ |
1578 | enetc_wr(hw, ENETC_SICAR0, |
1579 | ENETC_SICAR_RD_COHERENT | ENETC_SICAR_WR_COHERENT); |
1580 | @@ -1068,6 +1067,8 @@ int enetc_alloc_si_resources(struct enetc_ndev_priv *priv) |
1581 | if (err) |
1582 | return err; |
1583 | |
1584 | + enetc_setup_cbdr(&si->hw, &si->cbd_ring); |
1585 | + |
1586 | priv->cls_rules = kcalloc(si->num_fs_entries, sizeof(*priv->cls_rules), |
1587 | GFP_KERNEL); |
1588 | if (!priv->cls_rules) { |
1589 | @@ -1075,14 +1076,8 @@ int enetc_alloc_si_resources(struct enetc_ndev_priv *priv) |
1590 | goto err_alloc_cls; |
1591 | } |
1592 | |
1593 | - err = enetc_configure_si(priv); |
1594 | - if (err) |
1595 | - goto err_config_si; |
1596 | - |
1597 | return 0; |
1598 | |
1599 | -err_config_si: |
1600 | - kfree(priv->cls_rules); |
1601 | err_alloc_cls: |
1602 | enetc_clear_cbdr(&si->hw); |
1603 | enetc_free_cbdr(priv->dev, &si->cbd_ring); |
1604 | diff --git a/drivers/net/ethernet/freescale/enetc/enetc.h b/drivers/net/ethernet/freescale/enetc/enetc.h |
1605 | index 541b4e2073fe3..b8801a2b6a025 100644 |
1606 | --- a/drivers/net/ethernet/freescale/enetc/enetc.h |
1607 | +++ b/drivers/net/ethernet/freescale/enetc/enetc.h |
1608 | @@ -221,6 +221,7 @@ void enetc_get_si_caps(struct enetc_si *si); |
1609 | void enetc_init_si_rings_params(struct enetc_ndev_priv *priv); |
1610 | int enetc_alloc_si_resources(struct enetc_ndev_priv *priv); |
1611 | void enetc_free_si_resources(struct enetc_ndev_priv *priv); |
1612 | +int enetc_configure_si(struct enetc_ndev_priv *priv); |
1613 | |
1614 | int enetc_open(struct net_device *ndev); |
1615 | int enetc_close(struct net_device *ndev); |
1616 | @@ -236,6 +237,10 @@ int enetc_setup_tc(struct net_device *ndev, enum tc_setup_type type, |
1617 | void enetc_set_ethtool_ops(struct net_device *ndev); |
1618 | |
1619 | /* control buffer descriptor ring (CBDR) */ |
1620 | +int enetc_alloc_cbdr(struct device *dev, struct enetc_cbdr *cbdr); |
1621 | +void enetc_free_cbdr(struct device *dev, struct enetc_cbdr *cbdr); |
1622 | +void enetc_setup_cbdr(struct enetc_hw *hw, struct enetc_cbdr *cbdr); |
1623 | +void enetc_clear_cbdr(struct enetc_hw *hw); |
1624 | int enetc_set_mac_flt_entry(struct enetc_si *si, int index, |
1625 | char *mac_addr, int si_map); |
1626 | int enetc_clear_mac_flt_entry(struct enetc_si *si, int index); |
1627 | diff --git a/drivers/net/ethernet/freescale/enetc/enetc_pf.c b/drivers/net/ethernet/freescale/enetc/enetc_pf.c |
1628 | index 22f70638a4055..ac62464e0416a 100644 |
1629 | --- a/drivers/net/ethernet/freescale/enetc/enetc_pf.c |
1630 | +++ b/drivers/net/ethernet/freescale/enetc/enetc_pf.c |
1631 | @@ -854,6 +854,26 @@ static int enetc_init_port_rss_memory(struct enetc_si *si) |
1632 | return err; |
1633 | } |
1634 | |
1635 | +static void enetc_init_unused_port(struct enetc_si *si) |
1636 | +{ |
1637 | + struct device *dev = &si->pdev->dev; |
1638 | + struct enetc_hw *hw = &si->hw; |
1639 | + int err; |
1640 | + |
1641 | + si->cbd_ring.bd_count = ENETC_CBDR_DEFAULT_SIZE; |
1642 | + err = enetc_alloc_cbdr(dev, &si->cbd_ring); |
1643 | + if (err) |
1644 | + return; |
1645 | + |
1646 | + enetc_setup_cbdr(hw, &si->cbd_ring); |
1647 | + |
1648 | + enetc_init_port_rfs_memory(si); |
1649 | + enetc_init_port_rss_memory(si); |
1650 | + |
1651 | + enetc_clear_cbdr(hw); |
1652 | + enetc_free_cbdr(dev, &si->cbd_ring); |
1653 | +} |
1654 | + |
1655 | static int enetc_pf_probe(struct pci_dev *pdev, |
1656 | const struct pci_device_id *ent) |
1657 | { |
1658 | @@ -863,11 +883,6 @@ static int enetc_pf_probe(struct pci_dev *pdev, |
1659 | struct enetc_pf *pf; |
1660 | int err; |
1661 | |
1662 | - if (pdev->dev.of_node && !of_device_is_available(pdev->dev.of_node)) { |
1663 | - dev_info(&pdev->dev, "device is disabled, skipping\n"); |
1664 | - return -ENODEV; |
1665 | - } |
1666 | - |
1667 | err = enetc_pci_probe(pdev, KBUILD_MODNAME, sizeof(*pf)); |
1668 | if (err) { |
1669 | dev_err(&pdev->dev, "PCI probing failed\n"); |
1670 | @@ -881,6 +896,13 @@ static int enetc_pf_probe(struct pci_dev *pdev, |
1671 | goto err_map_pf_space; |
1672 | } |
1673 | |
1674 | + if (pdev->dev.of_node && !of_device_is_available(pdev->dev.of_node)) { |
1675 | + enetc_init_unused_port(si); |
1676 | + dev_info(&pdev->dev, "device is disabled, skipping\n"); |
1677 | + err = -ENODEV; |
1678 | + goto err_device_disabled; |
1679 | + } |
1680 | + |
1681 | pf = enetc_si_priv(si); |
1682 | pf->si = si; |
1683 | pf->total_vfs = pci_sriov_get_totalvfs(pdev); |
1684 | @@ -920,6 +942,12 @@ static int enetc_pf_probe(struct pci_dev *pdev, |
1685 | goto err_init_port_rss; |
1686 | } |
1687 | |
1688 | + err = enetc_configure_si(priv); |
1689 | + if (err) { |
1690 | + dev_err(&pdev->dev, "Failed to configure SI\n"); |
1691 | + goto err_config_si; |
1692 | + } |
1693 | + |
1694 | err = enetc_alloc_msix(priv); |
1695 | if (err) { |
1696 | dev_err(&pdev->dev, "MSIX alloc failed\n"); |
1697 | @@ -945,6 +973,7 @@ err_reg_netdev: |
1698 | enetc_mdio_remove(pf); |
1699 | enetc_of_put_phy(priv); |
1700 | enetc_free_msix(priv); |
1701 | +err_config_si: |
1702 | err_init_port_rss: |
1703 | err_init_port_rfs: |
1704 | err_alloc_msix: |
1705 | @@ -953,6 +982,7 @@ err_alloc_si_res: |
1706 | si->ndev = NULL; |
1707 | free_netdev(ndev); |
1708 | err_alloc_netdev: |
1709 | +err_device_disabled: |
1710 | err_map_pf_space: |
1711 | enetc_pci_remove(pdev); |
1712 | |
1713 | diff --git a/drivers/net/ethernet/freescale/enetc/enetc_vf.c b/drivers/net/ethernet/freescale/enetc/enetc_vf.c |
1714 | index ebd21bf4cfa1e..3a8c2049b417c 100644 |
1715 | --- a/drivers/net/ethernet/freescale/enetc/enetc_vf.c |
1716 | +++ b/drivers/net/ethernet/freescale/enetc/enetc_vf.c |
1717 | @@ -189,6 +189,12 @@ static int enetc_vf_probe(struct pci_dev *pdev, |
1718 | goto err_alloc_si_res; |
1719 | } |
1720 | |
1721 | + err = enetc_configure_si(priv); |
1722 | + if (err) { |
1723 | + dev_err(&pdev->dev, "Failed to configure SI\n"); |
1724 | + goto err_config_si; |
1725 | + } |
1726 | + |
1727 | err = enetc_alloc_msix(priv); |
1728 | if (err) { |
1729 | dev_err(&pdev->dev, "MSIX alloc failed\n"); |
1730 | @@ -208,6 +214,7 @@ static int enetc_vf_probe(struct pci_dev *pdev, |
1731 | |
1732 | err_reg_netdev: |
1733 | enetc_free_msix(priv); |
1734 | +err_config_si: |
1735 | err_alloc_msix: |
1736 | enetc_free_si_resources(priv); |
1737 | err_alloc_si_res: |
1738 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h |
1739 | index 1426eb5ddf3df..e34e0854635c3 100644 |
1740 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h |
1741 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h |
1742 | @@ -1018,16 +1018,16 @@ struct hclge_fd_tcam_config_3_cmd { |
1743 | #define HCLGE_FD_AD_DROP_B 0 |
1744 | #define HCLGE_FD_AD_DIRECT_QID_B 1 |
1745 | #define HCLGE_FD_AD_QID_S 2 |
1746 | -#define HCLGE_FD_AD_QID_M GENMASK(12, 2) |
1747 | +#define HCLGE_FD_AD_QID_M GENMASK(11, 2) |
1748 | #define HCLGE_FD_AD_USE_COUNTER_B 12 |
1749 | #define HCLGE_FD_AD_COUNTER_NUM_S 13 |
1750 | #define HCLGE_FD_AD_COUNTER_NUM_M GENMASK(20, 13) |
1751 | #define HCLGE_FD_AD_NXT_STEP_B 20 |
1752 | #define HCLGE_FD_AD_NXT_KEY_S 21 |
1753 | -#define HCLGE_FD_AD_NXT_KEY_M GENMASK(26, 21) |
1754 | +#define HCLGE_FD_AD_NXT_KEY_M GENMASK(25, 21) |
1755 | #define HCLGE_FD_AD_WR_RULE_ID_B 0 |
1756 | #define HCLGE_FD_AD_RULE_ID_S 1 |
1757 | -#define HCLGE_FD_AD_RULE_ID_M GENMASK(13, 1) |
1758 | +#define HCLGE_FD_AD_RULE_ID_M GENMASK(12, 1) |
1759 | |
1760 | struct hclge_fd_ad_config_cmd { |
1761 | u8 stage; |
1762 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c |
1763 | index 08040cafc06bc..93f3865b679bf 100644 |
1764 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c |
1765 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c |
1766 | @@ -4908,9 +4908,9 @@ static bool hclge_fd_convert_tuple(u32 tuple_bit, u8 *key_x, u8 *key_y, |
1767 | case BIT(INNER_SRC_MAC): |
1768 | for (i = 0; i < ETH_ALEN; i++) { |
1769 | calc_x(key_x[ETH_ALEN - 1 - i], rule->tuples.src_mac[i], |
1770 | - rule->tuples.src_mac[i]); |
1771 | + rule->tuples_mask.src_mac[i]); |
1772 | calc_y(key_y[ETH_ALEN - 1 - i], rule->tuples.src_mac[i], |
1773 | - rule->tuples.src_mac[i]); |
1774 | + rule->tuples_mask.src_mac[i]); |
1775 | } |
1776 | |
1777 | return true; |
1778 | @@ -5939,8 +5939,7 @@ static int hclge_get_fd_rule_info(struct hnae3_handle *handle, |
1779 | fs->h_ext.vlan_tci = cpu_to_be16(rule->tuples.vlan_tag1); |
1780 | fs->m_ext.vlan_tci = |
1781 | rule->unused_tuple & BIT(INNER_VLAN_TAG_FST) ? |
1782 | - cpu_to_be16(VLAN_VID_MASK) : |
1783 | - cpu_to_be16(rule->tuples_mask.vlan_tag1); |
1784 | + 0 : cpu_to_be16(rule->tuples_mask.vlan_tag1); |
1785 | } |
1786 | |
1787 | if (fs->flow_type & FLOW_MAC_EXT) { |
1788 | diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c |
1789 | index 309cdc5ebc1ff..79b13750fa2d2 100644 |
1790 | --- a/drivers/net/ethernet/ibm/ibmvnic.c |
1791 | +++ b/drivers/net/ethernet/ibm/ibmvnic.c |
1792 | @@ -1753,10 +1753,9 @@ static int ibmvnic_set_mac(struct net_device *netdev, void *p) |
1793 | if (!is_valid_ether_addr(addr->sa_data)) |
1794 | return -EADDRNOTAVAIL; |
1795 | |
1796 | - if (adapter->state != VNIC_PROBED) { |
1797 | - ether_addr_copy(adapter->mac_addr, addr->sa_data); |
1798 | + ether_addr_copy(adapter->mac_addr, addr->sa_data); |
1799 | + if (adapter->state != VNIC_PROBED) |
1800 | rc = __ibmvnic_set_mac(netdev, addr->sa_data); |
1801 | - } |
1802 | |
1803 | return rc; |
1804 | } |
1805 | diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c |
1806 | index 0604b5aaad86f..58211590229b1 100644 |
1807 | --- a/drivers/net/ethernet/intel/i40e/i40e_main.c |
1808 | +++ b/drivers/net/ethernet/intel/i40e/i40e_main.c |
1809 | @@ -15142,6 +15142,8 @@ static int i40e_probe(struct pci_dev *pdev, const struct pci_device_id *ent) |
1810 | if (err) { |
1811 | dev_info(&pdev->dev, |
1812 | "setup of misc vector failed: %d\n", err); |
1813 | + i40e_cloud_filter_exit(pf); |
1814 | + i40e_fdir_teardown(pf); |
1815 | goto err_vsis; |
1816 | } |
1817 | } |
1818 | diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_ipsec.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_ipsec.c |
1819 | index 113f6087c7c9a..b14b164c9601f 100644 |
1820 | --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_ipsec.c |
1821 | +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_ipsec.c |
1822 | @@ -575,6 +575,11 @@ static int ixgbe_ipsec_add_sa(struct xfrm_state *xs) |
1823 | return -EINVAL; |
1824 | } |
1825 | |
1826 | + if (xs->props.mode != XFRM_MODE_TRANSPORT) { |
1827 | + netdev_err(dev, "Unsupported mode for ipsec offload\n"); |
1828 | + return -EINVAL; |
1829 | + } |
1830 | + |
1831 | if (ixgbe_ipsec_check_mgmt_ip(xs)) { |
1832 | netdev_err(dev, "IPsec IP addr clash with mgmt filters\n"); |
1833 | return -EINVAL; |
1834 | diff --git a/drivers/net/ethernet/intel/ixgbevf/ipsec.c b/drivers/net/ethernet/intel/ixgbevf/ipsec.c |
1835 | index 5170dd9d8705b..caaea2c920a6e 100644 |
1836 | --- a/drivers/net/ethernet/intel/ixgbevf/ipsec.c |
1837 | +++ b/drivers/net/ethernet/intel/ixgbevf/ipsec.c |
1838 | @@ -272,6 +272,11 @@ static int ixgbevf_ipsec_add_sa(struct xfrm_state *xs) |
1839 | return -EINVAL; |
1840 | } |
1841 | |
1842 | + if (xs->props.mode != XFRM_MODE_TRANSPORT) { |
1843 | + netdev_err(dev, "Unsupported mode for ipsec offload\n"); |
1844 | + return -EINVAL; |
1845 | + } |
1846 | + |
1847 | if (xs->xso.flags & XFRM_OFFLOAD_INBOUND) { |
1848 | struct rx_sa rsa; |
1849 | |
1850 | diff --git a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c |
1851 | index a1202e53710cd..5582fba2f5823 100644 |
1852 | --- a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c |
1853 | +++ b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c |
1854 | @@ -47,7 +47,7 @@ |
1855 | #define EN_ETHTOOL_SHORT_MASK cpu_to_be16(0xffff) |
1856 | #define EN_ETHTOOL_WORD_MASK cpu_to_be32(0xffffffff) |
1857 | |
1858 | -static int mlx4_en_moderation_update(struct mlx4_en_priv *priv) |
1859 | +int mlx4_en_moderation_update(struct mlx4_en_priv *priv) |
1860 | { |
1861 | int i, t; |
1862 | int err = 0; |
1863 | diff --git a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c |
1864 | index b5eb116249dda..cd165e52ed33c 100644 |
1865 | --- a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c |
1866 | +++ b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c |
1867 | @@ -3657,6 +3657,8 @@ int mlx4_en_reset_config(struct net_device *dev, |
1868 | en_err(priv, "Failed starting port\n"); |
1869 | } |
1870 | |
1871 | + if (!err) |
1872 | + err = mlx4_en_moderation_update(priv); |
1873 | out: |
1874 | mutex_unlock(&mdev->state_lock); |
1875 | kfree(tmp); |
1876 | diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h |
1877 | index a2f69c6f0c79f..17a5bd4c68b2b 100644 |
1878 | --- a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h |
1879 | +++ b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h |
1880 | @@ -797,6 +797,7 @@ void mlx4_en_ptp_overflow_check(struct mlx4_en_dev *mdev); |
1881 | #define DEV_FEATURE_CHANGED(dev, new_features, feature) \ |
1882 | ((dev->features & feature) ^ (new_features & feature)) |
1883 | |
1884 | +int mlx4_en_moderation_update(struct mlx4_en_priv *priv); |
1885 | int mlx4_en_reset_config(struct net_device *dev, |
1886 | struct hwtstamp_config ts_config, |
1887 | netdev_features_t new_features); |
1888 | diff --git a/drivers/net/ethernet/renesas/sh_eth.c b/drivers/net/ethernet/renesas/sh_eth.c |
1889 | index 18f86e441570c..a042f4607b0d0 100644 |
1890 | --- a/drivers/net/ethernet/renesas/sh_eth.c |
1891 | +++ b/drivers/net/ethernet/renesas/sh_eth.c |
1892 | @@ -610,6 +610,8 @@ static struct sh_eth_cpu_data r7s72100_data = { |
1893 | EESR_TDE, |
1894 | .fdr_value = 0x0000070f, |
1895 | |
1896 | + .trscer_err_mask = DESC_I_RINT8 | DESC_I_RINT5, |
1897 | + |
1898 | .no_psr = 1, |
1899 | .apr = 1, |
1900 | .mpr = 1, |
1901 | @@ -828,6 +830,8 @@ static struct sh_eth_cpu_data r7s9210_data = { |
1902 | |
1903 | .fdr_value = 0x0000070f, |
1904 | |
1905 | + .trscer_err_mask = DESC_I_RINT8 | DESC_I_RINT5, |
1906 | + |
1907 | .apr = 1, |
1908 | .mpr = 1, |
1909 | .tpauser = 1, |
1910 | @@ -1131,6 +1135,9 @@ static struct sh_eth_cpu_data sh771x_data = { |
1911 | EESIPR_CEEFIP | EESIPR_CELFIP | |
1912 | EESIPR_RRFIP | EESIPR_RTLFIP | EESIPR_RTSFIP | |
1913 | EESIPR_PREIP | EESIPR_CERFIP, |
1914 | + |
1915 | + .trscer_err_mask = DESC_I_RINT8, |
1916 | + |
1917 | .tsu = 1, |
1918 | .dual_port = 1, |
1919 | }; |
1920 | diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac4_dma.c b/drivers/net/ethernet/stmicro/stmmac/dwmac4_dma.c |
1921 | index 68c157979b947..a41ac13cc4e55 100644 |
1922 | --- a/drivers/net/ethernet/stmicro/stmmac/dwmac4_dma.c |
1923 | +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac4_dma.c |
1924 | @@ -116,6 +116,23 @@ static void dwmac4_dma_init_channel(void __iomem *ioaddr, |
1925 | ioaddr + DMA_CHAN_INTR_ENA(chan)); |
1926 | } |
1927 | |
1928 | +static void dwmac410_dma_init_channel(void __iomem *ioaddr, |
1929 | + struct stmmac_dma_cfg *dma_cfg, u32 chan) |
1930 | +{ |
1931 | + u32 value; |
1932 | + |
1933 | + /* common channel control register config */ |
1934 | + value = readl(ioaddr + DMA_CHAN_CONTROL(chan)); |
1935 | + if (dma_cfg->pblx8) |
1936 | + value = value | DMA_BUS_MODE_PBL; |
1937 | + |
1938 | + writel(value, ioaddr + DMA_CHAN_CONTROL(chan)); |
1939 | + |
1940 | + /* Mask interrupts by writing to CSR7 */ |
1941 | + writel(DMA_CHAN_INTR_DEFAULT_MASK_4_10, |
1942 | + ioaddr + DMA_CHAN_INTR_ENA(chan)); |
1943 | +} |
1944 | + |
1945 | static void dwmac4_dma_init(void __iomem *ioaddr, |
1946 | struct stmmac_dma_cfg *dma_cfg, int atds) |
1947 | { |
1948 | @@ -462,7 +479,7 @@ const struct stmmac_dma_ops dwmac4_dma_ops = { |
1949 | const struct stmmac_dma_ops dwmac410_dma_ops = { |
1950 | .reset = dwmac4_dma_reset, |
1951 | .init = dwmac4_dma_init, |
1952 | - .init_chan = dwmac4_dma_init_channel, |
1953 | + .init_chan = dwmac410_dma_init_channel, |
1954 | .init_rx_chan = dwmac4_dma_init_rx_chan, |
1955 | .init_tx_chan = dwmac4_dma_init_tx_chan, |
1956 | .axi = dwmac4_dma_axi, |
1957 | diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac4_lib.c b/drivers/net/ethernet/stmicro/stmmac/dwmac4_lib.c |
1958 | index f2a29a90e0854..afdea015f4b45 100644 |
1959 | --- a/drivers/net/ethernet/stmicro/stmmac/dwmac4_lib.c |
1960 | +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac4_lib.c |
1961 | @@ -60,10 +60,6 @@ void dwmac4_dma_stop_tx(void __iomem *ioaddr, u32 chan) |
1962 | |
1963 | value &= ~DMA_CONTROL_ST; |
1964 | writel(value, ioaddr + DMA_CHAN_TX_CONTROL(chan)); |
1965 | - |
1966 | - value = readl(ioaddr + GMAC_CONFIG); |
1967 | - value &= ~GMAC_CONFIG_TE; |
1968 | - writel(value, ioaddr + GMAC_CONFIG); |
1969 | } |
1970 | |
1971 | void dwmac4_dma_start_rx(void __iomem *ioaddr, u32 chan) |
1972 | diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c |
1973 | index ce5d3e9e5dff4..8e7c60e02fa09 100644 |
1974 | --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c |
1975 | +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c |
1976 | @@ -4821,6 +4821,8 @@ static void stmmac_reset_queues_param(struct stmmac_priv *priv) |
1977 | tx_q->cur_tx = 0; |
1978 | tx_q->dirty_tx = 0; |
1979 | tx_q->mss = 0; |
1980 | + |
1981 | + netdev_tx_reset_queue(netdev_get_tx_queue(priv->dev, queue)); |
1982 | } |
1983 | } |
1984 | |
1985 | diff --git a/drivers/net/netdevsim/netdev.c b/drivers/net/netdevsim/netdev.c |
1986 | index a6bbe93f29ef6..917f37c176302 100644 |
1987 | --- a/drivers/net/netdevsim/netdev.c |
1988 | +++ b/drivers/net/netdevsim/netdev.c |
1989 | @@ -292,6 +292,7 @@ nsim_create(struct nsim_dev *nsim_dev, struct nsim_dev_port *nsim_dev_port) |
1990 | |
1991 | ns = netdev_priv(dev); |
1992 | ns->netdev = dev; |
1993 | + u64_stats_init(&ns->syncp); |
1994 | ns->nsim_dev = nsim_dev; |
1995 | ns->nsim_dev_port = nsim_dev_port; |
1996 | ns->nsim_bus_dev = nsim_dev->nsim_bus_dev; |
1997 | diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c |
1998 | index b718b11607fcd..b0b8a3ce82b68 100644 |
1999 | --- a/drivers/net/phy/phy.c |
2000 | +++ b/drivers/net/phy/phy.c |
2001 | @@ -345,15 +345,16 @@ int phy_ethtool_ksettings_set(struct phy_device *phydev, |
2002 | |
2003 | phydev->autoneg = autoneg; |
2004 | |
2005 | - phydev->speed = speed; |
2006 | + if (autoneg == AUTONEG_DISABLE) { |
2007 | + phydev->speed = speed; |
2008 | + phydev->duplex = duplex; |
2009 | + } |
2010 | |
2011 | linkmode_copy(phydev->advertising, advertising); |
2012 | |
2013 | linkmode_mod_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, |
2014 | phydev->advertising, autoneg == AUTONEG_ENABLE); |
2015 | |
2016 | - phydev->duplex = duplex; |
2017 | - |
2018 | phydev->mdix_ctrl = cmd->base.eth_tp_mdix_ctrl; |
2019 | |
2020 | /* Restart the PHY */ |
2021 | diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c |
2022 | index 05b85b94d9518..6508d70056b3a 100644 |
2023 | --- a/drivers/net/usb/qmi_wwan.c |
2024 | +++ b/drivers/net/usb/qmi_wwan.c |
2025 | @@ -441,13 +441,6 @@ static ssize_t add_mux_store(struct device *d, struct device_attribute *attr, c |
2026 | goto err; |
2027 | } |
2028 | |
2029 | - /* we don't want to modify a running netdev */ |
2030 | - if (netif_running(dev->net)) { |
2031 | - netdev_err(dev->net, "Cannot change a running device\n"); |
2032 | - ret = -EBUSY; |
2033 | - goto err; |
2034 | - } |
2035 | - |
2036 | ret = qmimux_register_device(dev->net, mux_id); |
2037 | if (!ret) { |
2038 | info->flags |= QMI_WWAN_FLAG_MUX; |
2039 | @@ -477,13 +470,6 @@ static ssize_t del_mux_store(struct device *d, struct device_attribute *attr, c |
2040 | if (!rtnl_trylock()) |
2041 | return restart_syscall(); |
2042 | |
2043 | - /* we don't want to modify a running netdev */ |
2044 | - if (netif_running(dev->net)) { |
2045 | - netdev_err(dev->net, "Cannot change a running device\n"); |
2046 | - ret = -EBUSY; |
2047 | - goto err; |
2048 | - } |
2049 | - |
2050 | del_dev = qmimux_find_dev(dev, mux_id); |
2051 | if (!del_dev) { |
2052 | netdev_err(dev->net, "mux_id not present\n"); |
2053 | diff --git a/drivers/net/wan/lapbether.c b/drivers/net/wan/lapbether.c |
2054 | index 709e3de0f6af1..60f357d2f79fa 100644 |
2055 | --- a/drivers/net/wan/lapbether.c |
2056 | +++ b/drivers/net/wan/lapbether.c |
2057 | @@ -283,7 +283,6 @@ static int lapbeth_open(struct net_device *dev) |
2058 | return -ENODEV; |
2059 | } |
2060 | |
2061 | - netif_start_queue(dev); |
2062 | return 0; |
2063 | } |
2064 | |
2065 | @@ -291,8 +290,6 @@ static int lapbeth_close(struct net_device *dev) |
2066 | { |
2067 | int err; |
2068 | |
2069 | - netif_stop_queue(dev); |
2070 | - |
2071 | if ((err = lapb_unregister(dev)) != LAPB_OK) |
2072 | pr_err("lapb_unregister error: %d\n", err); |
2073 | |
2074 | diff --git a/drivers/net/wireless/ath/ath9k/ath9k.h b/drivers/net/wireless/ath/ath9k/ath9k.h |
2075 | index a412b352182c8..d50022d264642 100644 |
2076 | --- a/drivers/net/wireless/ath/ath9k/ath9k.h |
2077 | +++ b/drivers/net/wireless/ath/ath9k/ath9k.h |
2078 | @@ -177,7 +177,8 @@ struct ath_frame_info { |
2079 | s8 txq; |
2080 | u8 keyix; |
2081 | u8 rtscts_rate; |
2082 | - u8 retries : 7; |
2083 | + u8 retries : 6; |
2084 | + u8 dyn_smps : 1; |
2085 | u8 baw_tracked : 1; |
2086 | u8 tx_power; |
2087 | enum ath9k_key_type keytype:2; |
2088 | diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c |
2089 | index 31e7b108279c6..14e6871a14054 100644 |
2090 | --- a/drivers/net/wireless/ath/ath9k/xmit.c |
2091 | +++ b/drivers/net/wireless/ath/ath9k/xmit.c |
2092 | @@ -1271,6 +1271,11 @@ static void ath_buf_set_rate(struct ath_softc *sc, struct ath_buf *bf, |
2093 | is_40, is_sgi, is_sp); |
2094 | if (rix < 8 && (tx_info->flags & IEEE80211_TX_CTL_STBC)) |
2095 | info->rates[i].RateFlags |= ATH9K_RATESERIES_STBC; |
2096 | + if (rix >= 8 && fi->dyn_smps) { |
2097 | + info->rates[i].RateFlags |= |
2098 | + ATH9K_RATESERIES_RTS_CTS; |
2099 | + info->flags |= ATH9K_TXDESC_CTSENA; |
2100 | + } |
2101 | |
2102 | info->txpower[i] = ath_get_rate_txpower(sc, bf, rix, |
2103 | is_40, false); |
2104 | @@ -2111,6 +2116,7 @@ static void setup_frame_info(struct ieee80211_hw *hw, |
2105 | fi->keyix = an->ps_key; |
2106 | else |
2107 | fi->keyix = ATH9K_TXKEYIX_INVALID; |
2108 | + fi->dyn_smps = sta && sta->smps_mode == IEEE80211_SMPS_DYNAMIC; |
2109 | fi->keytype = keytype; |
2110 | fi->framelen = framelen; |
2111 | fi->tx_power = txpower; |
2112 | diff --git a/drivers/net/wireless/mediatek/mt76/dma.c b/drivers/net/wireless/mediatek/mt76/dma.c |
2113 | index 781952b686ed2..d3efcbd48ee1e 100644 |
2114 | --- a/drivers/net/wireless/mediatek/mt76/dma.c |
2115 | +++ b/drivers/net/wireless/mediatek/mt76/dma.c |
2116 | @@ -454,13 +454,13 @@ mt76_add_fragment(struct mt76_dev *dev, struct mt76_queue *q, void *data, |
2117 | { |
2118 | struct sk_buff *skb = q->rx_head; |
2119 | struct skb_shared_info *shinfo = skb_shinfo(skb); |
2120 | + int nr_frags = shinfo->nr_frags; |
2121 | |
2122 | - if (shinfo->nr_frags < ARRAY_SIZE(shinfo->frags)) { |
2123 | + if (nr_frags < ARRAY_SIZE(shinfo->frags)) { |
2124 | struct page *page = virt_to_head_page(data); |
2125 | int offset = data - page_address(page) + q->buf_offset; |
2126 | |
2127 | - skb_add_rx_frag(skb, shinfo->nr_frags, page, offset, len, |
2128 | - q->buf_size); |
2129 | + skb_add_rx_frag(skb, nr_frags, page, offset, len, q->buf_size); |
2130 | } else { |
2131 | skb_free_frag(data); |
2132 | } |
2133 | @@ -469,7 +469,10 @@ mt76_add_fragment(struct mt76_dev *dev, struct mt76_queue *q, void *data, |
2134 | return; |
2135 | |
2136 | q->rx_head = NULL; |
2137 | - dev->drv->rx_skb(dev, q - dev->q_rx, skb); |
2138 | + if (nr_frags < ARRAY_SIZE(shinfo->frags)) |
2139 | + dev->drv->rx_skb(dev, q - dev->q_rx, skb); |
2140 | + else |
2141 | + dev_kfree_skb(skb); |
2142 | } |
2143 | |
2144 | static int |
2145 | diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c |
2146 | index 95d77a17375e1..e4e24e7bf4628 100644 |
2147 | --- a/drivers/nvme/host/core.c |
2148 | +++ b/drivers/nvme/host/core.c |
2149 | @@ -455,7 +455,6 @@ static void nvme_free_ns_head(struct kref *ref) |
2150 | |
2151 | nvme_mpath_remove_disk(head); |
2152 | ida_simple_remove(&head->subsys->ns_ida, head->instance); |
2153 | - list_del_init(&head->entry); |
2154 | cleanup_srcu_struct(&head->srcu); |
2155 | nvme_put_subsystem(head->subsys); |
2156 | kfree(head); |
2157 | @@ -3374,7 +3373,6 @@ static int __nvme_check_ids(struct nvme_subsystem *subsys, |
2158 | |
2159 | list_for_each_entry(h, &subsys->nsheads, entry) { |
2160 | if (nvme_ns_ids_valid(&new->ids) && |
2161 | - !list_empty(&h->list) && |
2162 | nvme_ns_ids_equal(&new->ids, &h->ids)) |
2163 | return -EINVAL; |
2164 | } |
2165 | @@ -3469,6 +3467,7 @@ static int nvme_init_ns_head(struct nvme_ns *ns, unsigned nsid, |
2166 | "IDs don't match for shared namespace %d\n", |
2167 | nsid); |
2168 | ret = -EINVAL; |
2169 | + nvme_put_ns_head(head); |
2170 | goto out_unlock; |
2171 | } |
2172 | } |
2173 | @@ -3629,6 +3628,8 @@ static int nvme_alloc_ns(struct nvme_ctrl *ctrl, unsigned nsid) |
2174 | out_unlink_ns: |
2175 | mutex_lock(&ctrl->subsys->lock); |
2176 | list_del_rcu(&ns->siblings); |
2177 | + if (list_empty(&ns->head->list)) |
2178 | + list_del_init(&ns->head->entry); |
2179 | mutex_unlock(&ctrl->subsys->lock); |
2180 | nvme_put_ns_head(ns->head); |
2181 | out_free_id: |
2182 | @@ -3651,7 +3652,10 @@ static void nvme_ns_remove(struct nvme_ns *ns) |
2183 | |
2184 | mutex_lock(&ns->ctrl->subsys->lock); |
2185 | list_del_rcu(&ns->siblings); |
2186 | + if (list_empty(&ns->head->list)) |
2187 | + list_del_init(&ns->head->entry); |
2188 | mutex_unlock(&ns->ctrl->subsys->lock); |
2189 | + |
2190 | synchronize_rcu(); /* guarantee not available in head->list */ |
2191 | nvme_mpath_clear_current_path(ns); |
2192 | synchronize_srcu(&ns->head->srcu); /* wait for concurrent submissions */ |
2193 | diff --git a/drivers/pci/controller/pci-xgene-msi.c b/drivers/pci/controller/pci-xgene-msi.c |
2194 | index f4c02da84e599..0bfa5065b4405 100644 |
2195 | --- a/drivers/pci/controller/pci-xgene-msi.c |
2196 | +++ b/drivers/pci/controller/pci-xgene-msi.c |
2197 | @@ -384,13 +384,9 @@ static int xgene_msi_hwirq_alloc(unsigned int cpu) |
2198 | if (!msi_group->gic_irq) |
2199 | continue; |
2200 | |
2201 | - irq_set_chained_handler(msi_group->gic_irq, |
2202 | - xgene_msi_isr); |
2203 | - err = irq_set_handler_data(msi_group->gic_irq, msi_group); |
2204 | - if (err) { |
2205 | - pr_err("failed to register GIC IRQ handler\n"); |
2206 | - return -EINVAL; |
2207 | - } |
2208 | + irq_set_chained_handler_and_data(msi_group->gic_irq, |
2209 | + xgene_msi_isr, msi_group); |
2210 | + |
2211 | /* |
2212 | * Statically allocate MSI GIC IRQs to each CPU core. |
2213 | * With 8-core X-Gene v1, 2 MSI GIC IRQs are allocated |
2214 | diff --git a/drivers/pci/controller/pcie-mediatek.c b/drivers/pci/controller/pcie-mediatek.c |
2215 | index 626a7c352dfdf..728a59655825d 100644 |
2216 | --- a/drivers/pci/controller/pcie-mediatek.c |
2217 | +++ b/drivers/pci/controller/pcie-mediatek.c |
2218 | @@ -1063,14 +1063,14 @@ static int mtk_pcie_setup(struct mtk_pcie *pcie) |
2219 | err = of_pci_get_devfn(child); |
2220 | if (err < 0) { |
2221 | dev_err(dev, "failed to parse devfn: %d\n", err); |
2222 | - return err; |
2223 | + goto error_put_node; |
2224 | } |
2225 | |
2226 | slot = PCI_SLOT(err); |
2227 | |
2228 | err = mtk_pcie_parse_port(pcie, child, slot); |
2229 | if (err) |
2230 | - return err; |
2231 | + goto error_put_node; |
2232 | } |
2233 | |
2234 | err = mtk_pcie_subsys_powerup(pcie); |
2235 | @@ -1086,6 +1086,9 @@ static int mtk_pcie_setup(struct mtk_pcie *pcie) |
2236 | mtk_pcie_subsys_powerdown(pcie); |
2237 | |
2238 | return 0; |
2239 | +error_put_node: |
2240 | + of_node_put(child); |
2241 | + return err; |
2242 | } |
2243 | |
2244 | static int mtk_pcie_probe(struct platform_device *pdev) |
2245 | diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c |
2246 | index 9add26438be50..3c3bc9f584983 100644 |
2247 | --- a/drivers/pci/pci.c |
2248 | +++ b/drivers/pci/pci.c |
2249 | @@ -3903,6 +3903,10 @@ int pci_register_io_range(struct fwnode_handle *fwnode, phys_addr_t addr, |
2250 | ret = logic_pio_register_range(range); |
2251 | if (ret) |
2252 | kfree(range); |
2253 | + |
2254 | + /* Ignore duplicates due to deferred probing */ |
2255 | + if (ret == -EEXIST) |
2256 | + ret = 0; |
2257 | #endif |
2258 | |
2259 | return ret; |
2260 | diff --git a/drivers/platform/olpc/olpc-ec.c b/drivers/platform/olpc/olpc-ec.c |
2261 | index f64b82824db28..2db7113383fdc 100644 |
2262 | --- a/drivers/platform/olpc/olpc-ec.c |
2263 | +++ b/drivers/platform/olpc/olpc-ec.c |
2264 | @@ -426,11 +426,8 @@ static int olpc_ec_probe(struct platform_device *pdev) |
2265 | |
2266 | /* get the EC revision */ |
2267 | err = olpc_ec_cmd(EC_FIRMWARE_REV, NULL, 0, &ec->version, 1); |
2268 | - if (err) { |
2269 | - ec_priv = NULL; |
2270 | - kfree(ec); |
2271 | - return err; |
2272 | - } |
2273 | + if (err) |
2274 | + goto error; |
2275 | |
2276 | config.dev = pdev->dev.parent; |
2277 | config.driver_data = ec; |
2278 | @@ -440,12 +437,16 @@ static int olpc_ec_probe(struct platform_device *pdev) |
2279 | if (IS_ERR(ec->dcon_rdev)) { |
2280 | dev_err(&pdev->dev, "failed to register DCON regulator\n"); |
2281 | err = PTR_ERR(ec->dcon_rdev); |
2282 | - kfree(ec); |
2283 | - return err; |
2284 | + goto error; |
2285 | } |
2286 | |
2287 | ec->dbgfs_dir = olpc_ec_setup_debugfs(); |
2288 | |
2289 | + return 0; |
2290 | + |
2291 | +error: |
2292 | + ec_priv = NULL; |
2293 | + kfree(ec); |
2294 | return err; |
2295 | } |
2296 | |
2297 | diff --git a/drivers/s390/block/dasd.c b/drivers/s390/block/dasd.c |
2298 | index a0ebc2e603949..b577c8f7e3462 100644 |
2299 | --- a/drivers/s390/block/dasd.c |
2300 | +++ b/drivers/s390/block/dasd.c |
2301 | @@ -3087,7 +3087,8 @@ static blk_status_t do_dasd_request(struct blk_mq_hw_ctx *hctx, |
2302 | |
2303 | basedev = block->base; |
2304 | spin_lock_irq(&dq->lock); |
2305 | - if (basedev->state < DASD_STATE_READY) { |
2306 | + if (basedev->state < DASD_STATE_READY || |
2307 | + test_bit(DASD_FLAG_OFFLINE, &basedev->flags)) { |
2308 | DBF_DEV_EVENT(DBF_ERR, basedev, |
2309 | "device not ready for request %p", req); |
2310 | rc = BLK_STS_IOERR; |
2311 | @@ -3522,8 +3523,6 @@ void dasd_generic_remove(struct ccw_device *cdev) |
2312 | struct dasd_device *device; |
2313 | struct dasd_block *block; |
2314 | |
2315 | - cdev->handler = NULL; |
2316 | - |
2317 | device = dasd_device_from_cdev(cdev); |
2318 | if (IS_ERR(device)) { |
2319 | dasd_remove_sysfs_files(cdev); |
2320 | @@ -3542,6 +3541,7 @@ void dasd_generic_remove(struct ccw_device *cdev) |
2321 | * no quite down yet. |
2322 | */ |
2323 | dasd_set_target_state(device, DASD_STATE_NEW); |
2324 | + cdev->handler = NULL; |
2325 | /* dasd_delete_device destroys the device reference. */ |
2326 | block = device->block; |
2327 | dasd_delete_device(device); |
2328 | diff --git a/drivers/s390/cio/vfio_ccw_ops.c b/drivers/s390/cio/vfio_ccw_ops.c |
2329 | index f0d71ab77c50e..15df0a5c03ecb 100644 |
2330 | --- a/drivers/s390/cio/vfio_ccw_ops.c |
2331 | +++ b/drivers/s390/cio/vfio_ccw_ops.c |
2332 | @@ -506,7 +506,7 @@ static ssize_t vfio_ccw_mdev_ioctl(struct mdev_device *mdev, |
2333 | if (ret) |
2334 | return ret; |
2335 | |
2336 | - return copy_to_user((void __user *)arg, &info, minsz); |
2337 | + return copy_to_user((void __user *)arg, &info, minsz) ? -EFAULT : 0; |
2338 | } |
2339 | case VFIO_DEVICE_GET_REGION_INFO: |
2340 | { |
2341 | @@ -524,7 +524,7 @@ static ssize_t vfio_ccw_mdev_ioctl(struct mdev_device *mdev, |
2342 | if (ret) |
2343 | return ret; |
2344 | |
2345 | - return copy_to_user((void __user *)arg, &info, minsz); |
2346 | + return copy_to_user((void __user *)arg, &info, minsz) ? -EFAULT : 0; |
2347 | } |
2348 | case VFIO_DEVICE_GET_IRQ_INFO: |
2349 | { |
2350 | @@ -545,7 +545,7 @@ static ssize_t vfio_ccw_mdev_ioctl(struct mdev_device *mdev, |
2351 | if (info.count == -1) |
2352 | return -EINVAL; |
2353 | |
2354 | - return copy_to_user((void __user *)arg, &info, minsz); |
2355 | + return copy_to_user((void __user *)arg, &info, minsz) ? -EFAULT : 0; |
2356 | } |
2357 | case VFIO_DEVICE_SET_IRQS: |
2358 | { |
2359 | diff --git a/drivers/s390/crypto/vfio_ap_ops.c b/drivers/s390/crypto/vfio_ap_ops.c |
2360 | index 790b0b2b36272..1ec01148018f1 100644 |
2361 | --- a/drivers/s390/crypto/vfio_ap_ops.c |
2362 | +++ b/drivers/s390/crypto/vfio_ap_ops.c |
2363 | @@ -1279,7 +1279,7 @@ static int vfio_ap_mdev_get_device_info(unsigned long arg) |
2364 | info.num_regions = 0; |
2365 | info.num_irqs = 0; |
2366 | |
2367 | - return copy_to_user((void __user *)arg, &info, minsz); |
2368 | + return copy_to_user((void __user *)arg, &info, minsz) ? -EFAULT : 0; |
2369 | } |
2370 | |
2371 | static ssize_t vfio_ap_mdev_ioctl(struct mdev_device *mdev, |
2372 | diff --git a/drivers/scsi/libiscsi.c b/drivers/scsi/libiscsi.c |
2373 | index a14057c67a12a..c5b7d18513b66 100644 |
2374 | --- a/drivers/scsi/libiscsi.c |
2375 | +++ b/drivers/scsi/libiscsi.c |
2376 | @@ -1532,14 +1532,9 @@ check_mgmt: |
2377 | } |
2378 | rc = iscsi_prep_scsi_cmd_pdu(conn->task); |
2379 | if (rc) { |
2380 | - if (rc == -ENOMEM || rc == -EACCES) { |
2381 | - spin_lock_bh(&conn->taskqueuelock); |
2382 | - list_add_tail(&conn->task->running, |
2383 | - &conn->cmdqueue); |
2384 | - conn->task = NULL; |
2385 | - spin_unlock_bh(&conn->taskqueuelock); |
2386 | - goto done; |
2387 | - } else |
2388 | + if (rc == -ENOMEM || rc == -EACCES) |
2389 | + fail_scsi_task(conn->task, DID_IMM_RETRY); |
2390 | + else |
2391 | fail_scsi_task(conn->task, DID_ABORT); |
2392 | spin_lock_bh(&conn->taskqueuelock); |
2393 | continue; |
2394 | diff --git a/drivers/spi/spi-stm32.c b/drivers/spi/spi-stm32.c |
2395 | index 8622cf9d3f640..9e7a6de3c43d1 100644 |
2396 | --- a/drivers/spi/spi-stm32.c |
2397 | +++ b/drivers/spi/spi-stm32.c |
2398 | @@ -924,8 +924,8 @@ static irqreturn_t stm32h7_spi_irq_thread(int irq, void *dev_id) |
2399 | mask |= STM32H7_SPI_SR_RXP; |
2400 | |
2401 | if (!(sr & mask)) { |
2402 | - dev_dbg(spi->dev, "spurious IT (sr=0x%08x, ier=0x%08x)\n", |
2403 | - sr, ier); |
2404 | + dev_warn(spi->dev, "spurious IT (sr=0x%08x, ier=0x%08x)\n", |
2405 | + sr, ier); |
2406 | spin_unlock_irqrestore(&spi->lock, flags); |
2407 | return IRQ_NONE; |
2408 | } |
2409 | @@ -952,15 +952,8 @@ static irqreturn_t stm32h7_spi_irq_thread(int irq, void *dev_id) |
2410 | } |
2411 | |
2412 | if (sr & STM32H7_SPI_SR_OVR) { |
2413 | - dev_warn(spi->dev, "Overrun: received value discarded\n"); |
2414 | - if (!spi->cur_usedma && (spi->rx_buf && (spi->rx_len > 0))) |
2415 | - stm32h7_spi_read_rxfifo(spi, false); |
2416 | - /* |
2417 | - * If overrun is detected while using DMA, it means that |
2418 | - * something went wrong, so stop the current transfer |
2419 | - */ |
2420 | - if (spi->cur_usedma) |
2421 | - end = true; |
2422 | + dev_err(spi->dev, "Overrun: RX data lost\n"); |
2423 | + end = true; |
2424 | } |
2425 | |
2426 | if (sr & STM32H7_SPI_SR_EOT) { |
2427 | diff --git a/drivers/staging/comedi/drivers/addi_apci_1032.c b/drivers/staging/comedi/drivers/addi_apci_1032.c |
2428 | index e035c9f757a1c..2176d3289eff5 100644 |
2429 | --- a/drivers/staging/comedi/drivers/addi_apci_1032.c |
2430 | +++ b/drivers/staging/comedi/drivers/addi_apci_1032.c |
2431 | @@ -260,6 +260,7 @@ static irqreturn_t apci1032_interrupt(int irq, void *d) |
2432 | struct apci1032_private *devpriv = dev->private; |
2433 | struct comedi_subdevice *s = dev->read_subdev; |
2434 | unsigned int ctrl; |
2435 | + unsigned short val; |
2436 | |
2437 | /* check interrupt is from this device */ |
2438 | if ((inl(devpriv->amcc_iobase + AMCC_OP_REG_INTCSR) & |
2439 | @@ -275,7 +276,8 @@ static irqreturn_t apci1032_interrupt(int irq, void *d) |
2440 | outl(ctrl & ~APCI1032_CTRL_INT_ENA, dev->iobase + APCI1032_CTRL_REG); |
2441 | |
2442 | s->state = inl(dev->iobase + APCI1032_STATUS_REG) & 0xffff; |
2443 | - comedi_buf_write_samples(s, &s->state, 1); |
2444 | + val = s->state; |
2445 | + comedi_buf_write_samples(s, &val, 1); |
2446 | comedi_handle_events(dev, s); |
2447 | |
2448 | /* enable the interrupt */ |
2449 | diff --git a/drivers/staging/comedi/drivers/addi_apci_1500.c b/drivers/staging/comedi/drivers/addi_apci_1500.c |
2450 | index 816dd25b9d0e4..8c3eff7cf465c 100644 |
2451 | --- a/drivers/staging/comedi/drivers/addi_apci_1500.c |
2452 | +++ b/drivers/staging/comedi/drivers/addi_apci_1500.c |
2453 | @@ -208,7 +208,7 @@ static irqreturn_t apci1500_interrupt(int irq, void *d) |
2454 | struct comedi_device *dev = d; |
2455 | struct apci1500_private *devpriv = dev->private; |
2456 | struct comedi_subdevice *s = dev->read_subdev; |
2457 | - unsigned int status = 0; |
2458 | + unsigned short status = 0; |
2459 | unsigned int val; |
2460 | |
2461 | val = inl(devpriv->amcc + AMCC_OP_REG_INTCSR); |
2462 | @@ -238,14 +238,14 @@ static irqreturn_t apci1500_interrupt(int irq, void *d) |
2463 | * |
2464 | * Mask Meaning |
2465 | * ---------- ------------------------------------------ |
2466 | - * 0x00000001 Event 1 has occurred |
2467 | - * 0x00000010 Event 2 has occurred |
2468 | - * 0x00000100 Counter/timer 1 has run down (not implemented) |
2469 | - * 0x00001000 Counter/timer 2 has run down (not implemented) |
2470 | - * 0x00010000 Counter 3 has run down (not implemented) |
2471 | - * 0x00100000 Watchdog has run down (not implemented) |
2472 | - * 0x01000000 Voltage error |
2473 | - * 0x10000000 Short-circuit error |
2474 | + * 0b00000001 Event 1 has occurred |
2475 | + * 0b00000010 Event 2 has occurred |
2476 | + * 0b00000100 Counter/timer 1 has run down (not implemented) |
2477 | + * 0b00001000 Counter/timer 2 has run down (not implemented) |
2478 | + * 0b00010000 Counter 3 has run down (not implemented) |
2479 | + * 0b00100000 Watchdog has run down (not implemented) |
2480 | + * 0b01000000 Voltage error |
2481 | + * 0b10000000 Short-circuit error |
2482 | */ |
2483 | comedi_buf_write_samples(s, &status, 1); |
2484 | comedi_handle_events(dev, s); |
2485 | diff --git a/drivers/staging/comedi/drivers/adv_pci1710.c b/drivers/staging/comedi/drivers/adv_pci1710.c |
2486 | index ddc0dc93d08b6..eca5fa8a9eb8e 100644 |
2487 | --- a/drivers/staging/comedi/drivers/adv_pci1710.c |
2488 | +++ b/drivers/staging/comedi/drivers/adv_pci1710.c |
2489 | @@ -300,11 +300,11 @@ static int pci1710_ai_eoc(struct comedi_device *dev, |
2490 | static int pci1710_ai_read_sample(struct comedi_device *dev, |
2491 | struct comedi_subdevice *s, |
2492 | unsigned int cur_chan, |
2493 | - unsigned int *val) |
2494 | + unsigned short *val) |
2495 | { |
2496 | const struct boardtype *board = dev->board_ptr; |
2497 | struct pci1710_private *devpriv = dev->private; |
2498 | - unsigned int sample; |
2499 | + unsigned short sample; |
2500 | unsigned int chan; |
2501 | |
2502 | sample = inw(dev->iobase + PCI171X_AD_DATA_REG); |
2503 | @@ -345,7 +345,7 @@ static int pci1710_ai_insn_read(struct comedi_device *dev, |
2504 | pci1710_ai_setup_chanlist(dev, s, &insn->chanspec, 1, 1); |
2505 | |
2506 | for (i = 0; i < insn->n; i++) { |
2507 | - unsigned int val; |
2508 | + unsigned short val; |
2509 | |
2510 | /* start conversion */ |
2511 | outw(0, dev->iobase + PCI171X_SOFTTRG_REG); |
2512 | @@ -395,7 +395,7 @@ static void pci1710_handle_every_sample(struct comedi_device *dev, |
2513 | { |
2514 | struct comedi_cmd *cmd = &s->async->cmd; |
2515 | unsigned int status; |
2516 | - unsigned int val; |
2517 | + unsigned short val; |
2518 | int ret; |
2519 | |
2520 | status = inw(dev->iobase + PCI171X_STATUS_REG); |
2521 | @@ -455,7 +455,7 @@ static void pci1710_handle_fifo(struct comedi_device *dev, |
2522 | } |
2523 | |
2524 | for (i = 0; i < devpriv->max_samples; i++) { |
2525 | - unsigned int val; |
2526 | + unsigned short val; |
2527 | int ret; |
2528 | |
2529 | ret = pci1710_ai_read_sample(dev, s, s->async->cur_chan, &val); |
2530 | diff --git a/drivers/staging/comedi/drivers/das6402.c b/drivers/staging/comedi/drivers/das6402.c |
2531 | index f99211ec46deb..0034005bdf8f1 100644 |
2532 | --- a/drivers/staging/comedi/drivers/das6402.c |
2533 | +++ b/drivers/staging/comedi/drivers/das6402.c |
2534 | @@ -186,7 +186,7 @@ static irqreturn_t das6402_interrupt(int irq, void *d) |
2535 | if (status & DAS6402_STATUS_FFULL) { |
2536 | async->events |= COMEDI_CB_OVERFLOW; |
2537 | } else if (status & DAS6402_STATUS_FFNE) { |
2538 | - unsigned int val; |
2539 | + unsigned short val; |
2540 | |
2541 | val = das6402_ai_read_sample(dev, s); |
2542 | comedi_buf_write_samples(s, &val, 1); |
2543 | diff --git a/drivers/staging/comedi/drivers/das800.c b/drivers/staging/comedi/drivers/das800.c |
2544 | index 8cf09ef3012fa..4bd8fd5218c8f 100644 |
2545 | --- a/drivers/staging/comedi/drivers/das800.c |
2546 | +++ b/drivers/staging/comedi/drivers/das800.c |
2547 | @@ -427,7 +427,7 @@ static irqreturn_t das800_interrupt(int irq, void *d) |
2548 | struct comedi_cmd *cmd; |
2549 | unsigned long irq_flags; |
2550 | unsigned int status; |
2551 | - unsigned int val; |
2552 | + unsigned short val; |
2553 | bool fifo_empty; |
2554 | bool fifo_overflow; |
2555 | int i; |
2556 | diff --git a/drivers/staging/comedi/drivers/dmm32at.c b/drivers/staging/comedi/drivers/dmm32at.c |
2557 | index 75693cdde3138..c180d18ce517f 100644 |
2558 | --- a/drivers/staging/comedi/drivers/dmm32at.c |
2559 | +++ b/drivers/staging/comedi/drivers/dmm32at.c |
2560 | @@ -404,7 +404,7 @@ static irqreturn_t dmm32at_isr(int irq, void *d) |
2561 | { |
2562 | struct comedi_device *dev = d; |
2563 | unsigned char intstat; |
2564 | - unsigned int val; |
2565 | + unsigned short val; |
2566 | int i; |
2567 | |
2568 | if (!dev->attached) { |
2569 | diff --git a/drivers/staging/comedi/drivers/me4000.c b/drivers/staging/comedi/drivers/me4000.c |
2570 | index ee53571a89698..ead8000b5929b 100644 |
2571 | --- a/drivers/staging/comedi/drivers/me4000.c |
2572 | +++ b/drivers/staging/comedi/drivers/me4000.c |
2573 | @@ -924,7 +924,7 @@ static irqreturn_t me4000_ai_isr(int irq, void *dev_id) |
2574 | struct comedi_subdevice *s = dev->read_subdev; |
2575 | int i; |
2576 | int c = 0; |
2577 | - unsigned int lval; |
2578 | + unsigned short lval; |
2579 | |
2580 | if (!dev->attached) |
2581 | return IRQ_NONE; |
2582 | diff --git a/drivers/staging/comedi/drivers/pcl711.c b/drivers/staging/comedi/drivers/pcl711.c |
2583 | index a5937206bf1cd..e9abae4180625 100644 |
2584 | --- a/drivers/staging/comedi/drivers/pcl711.c |
2585 | +++ b/drivers/staging/comedi/drivers/pcl711.c |
2586 | @@ -184,7 +184,7 @@ static irqreturn_t pcl711_interrupt(int irq, void *d) |
2587 | struct comedi_device *dev = d; |
2588 | struct comedi_subdevice *s = dev->read_subdev; |
2589 | struct comedi_cmd *cmd = &s->async->cmd; |
2590 | - unsigned int data; |
2591 | + unsigned short data; |
2592 | |
2593 | if (!dev->attached) { |
2594 | dev_err(dev->class_dev, "spurious interrupt\n"); |
2595 | diff --git a/drivers/staging/comedi/drivers/pcl818.c b/drivers/staging/comedi/drivers/pcl818.c |
2596 | index 0af5315d43575..fc8afffc1815f 100644 |
2597 | --- a/drivers/staging/comedi/drivers/pcl818.c |
2598 | +++ b/drivers/staging/comedi/drivers/pcl818.c |
2599 | @@ -423,7 +423,7 @@ static int pcl818_ai_eoc(struct comedi_device *dev, |
2600 | |
2601 | static bool pcl818_ai_write_sample(struct comedi_device *dev, |
2602 | struct comedi_subdevice *s, |
2603 | - unsigned int chan, unsigned int val) |
2604 | + unsigned int chan, unsigned short val) |
2605 | { |
2606 | struct pcl818_private *devpriv = dev->private; |
2607 | struct comedi_cmd *cmd = &s->async->cmd; |
2608 | diff --git a/drivers/staging/ks7010/ks_wlan_net.c b/drivers/staging/ks7010/ks_wlan_net.c |
2609 | index 3cffc8be66563..e61bd8e1d246f 100644 |
2610 | --- a/drivers/staging/ks7010/ks_wlan_net.c |
2611 | +++ b/drivers/staging/ks7010/ks_wlan_net.c |
2612 | @@ -1120,6 +1120,7 @@ static int ks_wlan_set_scan(struct net_device *dev, |
2613 | { |
2614 | struct ks_wlan_private *priv = netdev_priv(dev); |
2615 | struct iw_scan_req *req = NULL; |
2616 | + int len; |
2617 | |
2618 | if (priv->sleep_mode == SLP_SLEEP) |
2619 | return -EPERM; |
2620 | @@ -1129,8 +1130,9 @@ static int ks_wlan_set_scan(struct net_device *dev, |
2621 | if (wrqu->data.length == sizeof(struct iw_scan_req) && |
2622 | wrqu->data.flags & IW_SCAN_THIS_ESSID) { |
2623 | req = (struct iw_scan_req *)extra; |
2624 | - priv->scan_ssid_len = req->essid_len; |
2625 | - memcpy(priv->scan_ssid, req->essid, priv->scan_ssid_len); |
2626 | + len = min_t(int, req->essid_len, IW_ESSID_MAX_SIZE); |
2627 | + priv->scan_ssid_len = len; |
2628 | + memcpy(priv->scan_ssid, req->essid, len); |
2629 | } else { |
2630 | priv->scan_ssid_len = 0; |
2631 | } |
2632 | diff --git a/drivers/staging/rtl8188eu/core/rtw_ap.c b/drivers/staging/rtl8188eu/core/rtw_ap.c |
2633 | index 51a5b71f8c256..1c0300ce63369 100644 |
2634 | --- a/drivers/staging/rtl8188eu/core/rtw_ap.c |
2635 | +++ b/drivers/staging/rtl8188eu/core/rtw_ap.c |
2636 | @@ -784,6 +784,7 @@ int rtw_check_beacon_data(struct adapter *padapter, u8 *pbuf, int len) |
2637 | /* SSID */ |
2638 | p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _SSID_IE_, &ie_len, (pbss_network->ie_length - _BEACON_IE_OFFSET_)); |
2639 | if (p && ie_len > 0) { |
2640 | + ie_len = min_t(int, ie_len, sizeof(pbss_network->ssid.ssid)); |
2641 | memset(&pbss_network->ssid, 0, sizeof(struct ndis_802_11_ssid)); |
2642 | memcpy(pbss_network->ssid.ssid, (p + 2), ie_len); |
2643 | pbss_network->ssid.ssid_length = ie_len; |
2644 | @@ -802,6 +803,7 @@ int rtw_check_beacon_data(struct adapter *padapter, u8 *pbuf, int len) |
2645 | /* get supported rates */ |
2646 | p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _SUPPORTEDRATES_IE_, &ie_len, (pbss_network->ie_length - _BEACON_IE_OFFSET_)); |
2647 | if (p) { |
2648 | + ie_len = min_t(int, ie_len, NDIS_802_11_LENGTH_RATES_EX); |
2649 | memcpy(supportRate, p + 2, ie_len); |
2650 | supportRateNum = ie_len; |
2651 | } |
2652 | @@ -809,6 +811,8 @@ int rtw_check_beacon_data(struct adapter *padapter, u8 *pbuf, int len) |
2653 | /* get ext_supported rates */ |
2654 | p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _EXT_SUPPORTEDRATES_IE_, &ie_len, pbss_network->ie_length - _BEACON_IE_OFFSET_); |
2655 | if (p) { |
2656 | + ie_len = min_t(int, ie_len, |
2657 | + NDIS_802_11_LENGTH_RATES_EX - supportRateNum); |
2658 | memcpy(supportRate + supportRateNum, p + 2, ie_len); |
2659 | supportRateNum += ie_len; |
2660 | } |
2661 | @@ -922,6 +926,7 @@ int rtw_check_beacon_data(struct adapter *padapter, u8 *pbuf, int len) |
2662 | |
2663 | pht_cap->mcs.rx_mask[0] = 0xff; |
2664 | pht_cap->mcs.rx_mask[1] = 0x0; |
2665 | + ie_len = min_t(int, ie_len, sizeof(pmlmepriv->htpriv.ht_cap)); |
2666 | memcpy(&pmlmepriv->htpriv.ht_cap, p + 2, ie_len); |
2667 | } |
2668 | |
2669 | diff --git a/drivers/staging/rtl8188eu/os_dep/ioctl_linux.c b/drivers/staging/rtl8188eu/os_dep/ioctl_linux.c |
2670 | index 630e7d933b104..7b83f0920f3c8 100644 |
2671 | --- a/drivers/staging/rtl8188eu/os_dep/ioctl_linux.c |
2672 | +++ b/drivers/staging/rtl8188eu/os_dep/ioctl_linux.c |
2673 | @@ -1160,9 +1160,11 @@ static int rtw_wx_set_scan(struct net_device *dev, struct iw_request_info *a, |
2674 | break; |
2675 | } |
2676 | sec_len = *(pos++); len -= 1; |
2677 | - if (sec_len > 0 && sec_len <= len) { |
2678 | + if (sec_len > 0 && |
2679 | + sec_len <= len && |
2680 | + sec_len <= 32) { |
2681 | ssid[ssid_index].ssid_length = sec_len; |
2682 | - memcpy(ssid[ssid_index].ssid, pos, ssid[ssid_index].ssid_length); |
2683 | + memcpy(ssid[ssid_index].ssid, pos, sec_len); |
2684 | ssid_index++; |
2685 | } |
2686 | pos += sec_len; |
2687 | diff --git a/drivers/staging/rtl8192e/rtl8192e/rtl_wx.c b/drivers/staging/rtl8192e/rtl8192e/rtl_wx.c |
2688 | index 16bcee13f64b5..407effde5e71a 100644 |
2689 | --- a/drivers/staging/rtl8192e/rtl8192e/rtl_wx.c |
2690 | +++ b/drivers/staging/rtl8192e/rtl8192e/rtl_wx.c |
2691 | @@ -406,9 +406,10 @@ static int _rtl92e_wx_set_scan(struct net_device *dev, |
2692 | struct iw_scan_req *req = (struct iw_scan_req *)b; |
2693 | |
2694 | if (req->essid_len) { |
2695 | - ieee->current_network.ssid_len = req->essid_len; |
2696 | - memcpy(ieee->current_network.ssid, req->essid, |
2697 | - req->essid_len); |
2698 | + int len = min_t(int, req->essid_len, IW_ESSID_MAX_SIZE); |
2699 | + |
2700 | + ieee->current_network.ssid_len = len; |
2701 | + memcpy(ieee->current_network.ssid, req->essid, len); |
2702 | } |
2703 | } |
2704 | |
2705 | diff --git a/drivers/staging/rtl8192u/r8192U_wx.c b/drivers/staging/rtl8192u/r8192U_wx.c |
2706 | index 5822bb7984b91..8f10672ade37e 100644 |
2707 | --- a/drivers/staging/rtl8192u/r8192U_wx.c |
2708 | +++ b/drivers/staging/rtl8192u/r8192U_wx.c |
2709 | @@ -333,8 +333,10 @@ static int r8192_wx_set_scan(struct net_device *dev, struct iw_request_info *a, |
2710 | struct iw_scan_req *req = (struct iw_scan_req *)b; |
2711 | |
2712 | if (req->essid_len) { |
2713 | - ieee->current_network.ssid_len = req->essid_len; |
2714 | - memcpy(ieee->current_network.ssid, req->essid, req->essid_len); |
2715 | + int len = min_t(int, req->essid_len, IW_ESSID_MAX_SIZE); |
2716 | + |
2717 | + ieee->current_network.ssid_len = len; |
2718 | + memcpy(ieee->current_network.ssid, req->essid, len); |
2719 | } |
2720 | } |
2721 | |
2722 | diff --git a/drivers/staging/rtl8712/rtl871x_cmd.c b/drivers/staging/rtl8712/rtl871x_cmd.c |
2723 | index 26b618008fcfe..d989229de88bd 100644 |
2724 | --- a/drivers/staging/rtl8712/rtl871x_cmd.c |
2725 | +++ b/drivers/staging/rtl8712/rtl871x_cmd.c |
2726 | @@ -197,8 +197,10 @@ u8 r8712_sitesurvey_cmd(struct _adapter *padapter, |
2727 | psurveyPara->ss_ssidlen = 0; |
2728 | memset(psurveyPara->ss_ssid, 0, IW_ESSID_MAX_SIZE + 1); |
2729 | if ((pssid != NULL) && (pssid->SsidLength)) { |
2730 | - memcpy(psurveyPara->ss_ssid, pssid->Ssid, pssid->SsidLength); |
2731 | - psurveyPara->ss_ssidlen = cpu_to_le32(pssid->SsidLength); |
2732 | + int len = min_t(int, pssid->SsidLength, IW_ESSID_MAX_SIZE); |
2733 | + |
2734 | + memcpy(psurveyPara->ss_ssid, pssid->Ssid, len); |
2735 | + psurveyPara->ss_ssidlen = cpu_to_le32(len); |
2736 | } |
2737 | set_fwstate(pmlmepriv, _FW_UNDER_SURVEY); |
2738 | r8712_enqueue_cmd(pcmdpriv, ph2c); |
2739 | diff --git a/drivers/staging/rtl8712/rtl871x_ioctl_linux.c b/drivers/staging/rtl8712/rtl871x_ioctl_linux.c |
2740 | index 944336e0d2e2f..cff918d8bcb54 100644 |
2741 | --- a/drivers/staging/rtl8712/rtl871x_ioctl_linux.c |
2742 | +++ b/drivers/staging/rtl8712/rtl871x_ioctl_linux.c |
2743 | @@ -928,7 +928,7 @@ static int r871x_wx_set_priv(struct net_device *dev, |
2744 | struct iw_point *dwrq = (struct iw_point *)awrq; |
2745 | |
2746 | len = dwrq->length; |
2747 | - ext = memdup_user(dwrq->pointer, len); |
2748 | + ext = strndup_user(dwrq->pointer, len); |
2749 | if (IS_ERR(ext)) |
2750 | return PTR_ERR(ext); |
2751 | |
2752 | diff --git a/drivers/target/target_core_pr.c b/drivers/target/target_core_pr.c |
2753 | index 5e931690e6979..51e690ab4d295 100644 |
2754 | --- a/drivers/target/target_core_pr.c |
2755 | +++ b/drivers/target/target_core_pr.c |
2756 | @@ -3731,6 +3731,7 @@ core_scsi3_pri_read_keys(struct se_cmd *cmd) |
2757 | spin_unlock(&dev->t10_pr.registration_lock); |
2758 | |
2759 | put_unaligned_be32(add_len, &buf[4]); |
2760 | + target_set_cmd_data_length(cmd, 8 + add_len); |
2761 | |
2762 | transport_kunmap_data_sg(cmd); |
2763 | |
2764 | @@ -3749,7 +3750,7 @@ core_scsi3_pri_read_reservation(struct se_cmd *cmd) |
2765 | struct t10_pr_registration *pr_reg; |
2766 | unsigned char *buf; |
2767 | u64 pr_res_key; |
2768 | - u32 add_len = 16; /* Hardcoded to 16 when a reservation is held. */ |
2769 | + u32 add_len = 0; |
2770 | |
2771 | if (cmd->data_length < 8) { |
2772 | pr_err("PRIN SA READ_RESERVATIONS SCSI Data Length: %u" |
2773 | @@ -3767,8 +3768,9 @@ core_scsi3_pri_read_reservation(struct se_cmd *cmd) |
2774 | pr_reg = dev->dev_pr_res_holder; |
2775 | if (pr_reg) { |
2776 | /* |
2777 | - * Set the hardcoded Additional Length |
2778 | + * Set the Additional Length to 16 when a reservation is held |
2779 | */ |
2780 | + add_len = 16; |
2781 | put_unaligned_be32(add_len, &buf[4]); |
2782 | |
2783 | if (cmd->data_length < 22) |
2784 | @@ -3804,6 +3806,8 @@ core_scsi3_pri_read_reservation(struct se_cmd *cmd) |
2785 | (pr_reg->pr_res_type & 0x0f); |
2786 | } |
2787 | |
2788 | + target_set_cmd_data_length(cmd, 8 + add_len); |
2789 | + |
2790 | err: |
2791 | spin_unlock(&dev->dev_reservation_lock); |
2792 | transport_kunmap_data_sg(cmd); |
2793 | @@ -3822,7 +3826,7 @@ core_scsi3_pri_report_capabilities(struct se_cmd *cmd) |
2794 | struct se_device *dev = cmd->se_dev; |
2795 | struct t10_reservation *pr_tmpl = &dev->t10_pr; |
2796 | unsigned char *buf; |
2797 | - u16 add_len = 8; /* Hardcoded to 8. */ |
2798 | + u16 len = 8; /* Hardcoded to 8. */ |
2799 | |
2800 | if (cmd->data_length < 6) { |
2801 | pr_err("PRIN SA REPORT_CAPABILITIES SCSI Data Length:" |
2802 | @@ -3834,7 +3838,7 @@ core_scsi3_pri_report_capabilities(struct se_cmd *cmd) |
2803 | if (!buf) |
2804 | return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE; |
2805 | |
2806 | - put_unaligned_be16(add_len, &buf[0]); |
2807 | + put_unaligned_be16(len, &buf[0]); |
2808 | buf[2] |= 0x10; /* CRH: Compatible Reservation Hanlding bit. */ |
2809 | buf[2] |= 0x08; /* SIP_C: Specify Initiator Ports Capable bit */ |
2810 | buf[2] |= 0x04; /* ATP_C: All Target Ports Capable bit */ |
2811 | @@ -3863,6 +3867,8 @@ core_scsi3_pri_report_capabilities(struct se_cmd *cmd) |
2812 | buf[4] |= 0x02; /* PR_TYPE_WRITE_EXCLUSIVE */ |
2813 | buf[5] |= 0x01; /* PR_TYPE_EXCLUSIVE_ACCESS_ALLREG */ |
2814 | |
2815 | + target_set_cmd_data_length(cmd, len); |
2816 | + |
2817 | transport_kunmap_data_sg(cmd); |
2818 | |
2819 | return 0; |
2820 | @@ -4023,6 +4029,7 @@ core_scsi3_pri_read_full_status(struct se_cmd *cmd) |
2821 | * Set ADDITIONAL_LENGTH |
2822 | */ |
2823 | put_unaligned_be32(add_len, &buf[4]); |
2824 | + target_set_cmd_data_length(cmd, 8 + add_len); |
2825 | |
2826 | transport_kunmap_data_sg(cmd); |
2827 | |
2828 | diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c |
2829 | index b1f4be055f838..a16835c0bb1dd 100644 |
2830 | --- a/drivers/target/target_core_transport.c |
2831 | +++ b/drivers/target/target_core_transport.c |
2832 | @@ -873,11 +873,9 @@ void target_complete_cmd(struct se_cmd *cmd, u8 scsi_status) |
2833 | } |
2834 | EXPORT_SYMBOL(target_complete_cmd); |
2835 | |
2836 | -void target_complete_cmd_with_length(struct se_cmd *cmd, u8 scsi_status, int length) |
2837 | +void target_set_cmd_data_length(struct se_cmd *cmd, int length) |
2838 | { |
2839 | - if ((scsi_status == SAM_STAT_GOOD || |
2840 | - cmd->se_cmd_flags & SCF_TREAT_READ_AS_NORMAL) && |
2841 | - length < cmd->data_length) { |
2842 | + if (length < cmd->data_length) { |
2843 | if (cmd->se_cmd_flags & SCF_UNDERFLOW_BIT) { |
2844 | cmd->residual_count += cmd->data_length - length; |
2845 | } else { |
2846 | @@ -887,6 +885,15 @@ void target_complete_cmd_with_length(struct se_cmd *cmd, u8 scsi_status, int len |
2847 | |
2848 | cmd->data_length = length; |
2849 | } |
2850 | +} |
2851 | +EXPORT_SYMBOL(target_set_cmd_data_length); |
2852 | + |
2853 | +void target_complete_cmd_with_length(struct se_cmd *cmd, u8 scsi_status, int length) |
2854 | +{ |
2855 | + if (scsi_status == SAM_STAT_GOOD || |
2856 | + cmd->se_cmd_flags & SCF_TREAT_READ_AS_NORMAL) { |
2857 | + target_set_cmd_data_length(cmd, length); |
2858 | + } |
2859 | |
2860 | target_complete_cmd(cmd, scsi_status); |
2861 | } |
2862 | diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c |
2863 | index 681374a3b3684..00bfc81f24702 100644 |
2864 | --- a/drivers/usb/class/cdc-acm.c |
2865 | +++ b/drivers/usb/class/cdc-acm.c |
2866 | @@ -1941,6 +1941,11 @@ static const struct usb_device_id acm_ids[] = { |
2867 | .driver_info = SEND_ZERO_PACKET, |
2868 | }, |
2869 | |
2870 | + /* Exclude Goodix Fingerprint Reader */ |
2871 | + { USB_DEVICE(0x27c6, 0x5395), |
2872 | + .driver_info = IGNORE_DEVICE, |
2873 | + }, |
2874 | + |
2875 | /* control interfaces without any protocol set */ |
2876 | { USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM, |
2877 | USB_CDC_PROTO_NONE) }, |
2878 | diff --git a/drivers/usb/class/usblp.c b/drivers/usb/class/usblp.c |
2879 | index c9f6e97582885..f27b4aecff3d4 100644 |
2880 | --- a/drivers/usb/class/usblp.c |
2881 | +++ b/drivers/usb/class/usblp.c |
2882 | @@ -494,16 +494,24 @@ static int usblp_release(struct inode *inode, struct file *file) |
2883 | /* No kernel lock - fine */ |
2884 | static __poll_t usblp_poll(struct file *file, struct poll_table_struct *wait) |
2885 | { |
2886 | - __poll_t ret; |
2887 | + struct usblp *usblp = file->private_data; |
2888 | + __poll_t ret = 0; |
2889 | unsigned long flags; |
2890 | |
2891 | - struct usblp *usblp = file->private_data; |
2892 | /* Should we check file->f_mode & FMODE_WRITE before poll_wait()? */ |
2893 | poll_wait(file, &usblp->rwait, wait); |
2894 | poll_wait(file, &usblp->wwait, wait); |
2895 | + |
2896 | + mutex_lock(&usblp->mut); |
2897 | + if (!usblp->present) |
2898 | + ret |= EPOLLHUP; |
2899 | + mutex_unlock(&usblp->mut); |
2900 | + |
2901 | spin_lock_irqsave(&usblp->lock, flags); |
2902 | - ret = ((usblp->bidir && usblp->rcomplete) ? EPOLLIN | EPOLLRDNORM : 0) | |
2903 | - ((usblp->no_paper || usblp->wcomplete) ? EPOLLOUT | EPOLLWRNORM : 0); |
2904 | + if (usblp->bidir && usblp->rcomplete) |
2905 | + ret |= EPOLLIN | EPOLLRDNORM; |
2906 | + if (usblp->no_paper || usblp->wcomplete) |
2907 | + ret |= EPOLLOUT | EPOLLWRNORM; |
2908 | spin_unlock_irqrestore(&usblp->lock, flags); |
2909 | return ret; |
2910 | } |
2911 | diff --git a/drivers/usb/dwc3/dwc3-qcom.c b/drivers/usb/dwc3/dwc3-qcom.c |
2912 | index 261af9e38dddf..7874b97e33227 100644 |
2913 | --- a/drivers/usb/dwc3/dwc3-qcom.c |
2914 | +++ b/drivers/usb/dwc3/dwc3-qcom.c |
2915 | @@ -251,8 +251,10 @@ static int dwc3_qcom_suspend(struct dwc3_qcom *qcom) |
2916 | for (i = qcom->num_clocks - 1; i >= 0; i--) |
2917 | clk_disable_unprepare(qcom->clks[i]); |
2918 | |
2919 | + if (device_may_wakeup(qcom->dev)) |
2920 | + dwc3_qcom_enable_interrupts(qcom); |
2921 | + |
2922 | qcom->is_suspended = true; |
2923 | - dwc3_qcom_enable_interrupts(qcom); |
2924 | |
2925 | return 0; |
2926 | } |
2927 | @@ -265,7 +267,8 @@ static int dwc3_qcom_resume(struct dwc3_qcom *qcom) |
2928 | if (!qcom->is_suspended) |
2929 | return 0; |
2930 | |
2931 | - dwc3_qcom_disable_interrupts(qcom); |
2932 | + if (device_may_wakeup(qcom->dev)) |
2933 | + dwc3_qcom_disable_interrupts(qcom); |
2934 | |
2935 | for (i = 0; i < qcom->num_clocks; i++) { |
2936 | ret = clk_prepare_enable(qcom->clks[i]); |
2937 | @@ -528,16 +531,19 @@ static int dwc3_qcom_of_register_core(struct platform_device *pdev) |
2938 | ret = of_platform_populate(np, NULL, NULL, dev); |
2939 | if (ret) { |
2940 | dev_err(dev, "failed to register dwc3 core - %d\n", ret); |
2941 | - return ret; |
2942 | + goto node_put; |
2943 | } |
2944 | |
2945 | qcom->dwc3 = of_find_device_by_node(dwc3_np); |
2946 | if (!qcom->dwc3) { |
2947 | + ret = -ENODEV; |
2948 | dev_err(dev, "failed to get dwc3 platform device\n"); |
2949 | - return -ENODEV; |
2950 | } |
2951 | |
2952 | - return 0; |
2953 | +node_put: |
2954 | + of_node_put(dwc3_np); |
2955 | + |
2956 | + return ret; |
2957 | } |
2958 | |
2959 | static const struct dwc3_acpi_pdata sdm845_acpi_pdata = { |
2960 | diff --git a/drivers/usb/gadget/function/f_uac1.c b/drivers/usb/gadget/function/f_uac1.c |
2961 | index 00d346965f7a5..560382e0a8f38 100644 |
2962 | --- a/drivers/usb/gadget/function/f_uac1.c |
2963 | +++ b/drivers/usb/gadget/function/f_uac1.c |
2964 | @@ -499,6 +499,7 @@ static void f_audio_disable(struct usb_function *f) |
2965 | uac1->as_out_alt = 0; |
2966 | uac1->as_in_alt = 0; |
2967 | |
2968 | + u_audio_stop_playback(&uac1->g_audio); |
2969 | u_audio_stop_capture(&uac1->g_audio); |
2970 | } |
2971 | |
2972 | diff --git a/drivers/usb/gadget/function/f_uac2.c b/drivers/usb/gadget/function/f_uac2.c |
2973 | index 5d960b6603b6f..6f03e944e0e31 100644 |
2974 | --- a/drivers/usb/gadget/function/f_uac2.c |
2975 | +++ b/drivers/usb/gadget/function/f_uac2.c |
2976 | @@ -478,7 +478,7 @@ static int set_ep_max_packet_size(const struct f_uac2_opts *uac2_opts, |
2977 | } |
2978 | |
2979 | max_size_bw = num_channels(chmask) * ssize * |
2980 | - DIV_ROUND_UP(srate, factor / (1 << (ep_desc->bInterval - 1))); |
2981 | + ((srate / (factor / (1 << (ep_desc->bInterval - 1)))) + 1); |
2982 | ep_desc->wMaxPacketSize = cpu_to_le16(min_t(u16, max_size_bw, |
2983 | max_size_ep)); |
2984 | |
2985 | diff --git a/drivers/usb/gadget/function/u_ether_configfs.h b/drivers/usb/gadget/function/u_ether_configfs.h |
2986 | index d8b92485b727e..5b1d4771d44f4 100644 |
2987 | --- a/drivers/usb/gadget/function/u_ether_configfs.h |
2988 | +++ b/drivers/usb/gadget/function/u_ether_configfs.h |
2989 | @@ -169,12 +169,11 @@ out: \ |
2990 | size_t len) \ |
2991 | { \ |
2992 | struct f_##_f_##_opts *opts = to_f_##_f_##_opts(item); \ |
2993 | - int ret; \ |
2994 | + int ret = -EINVAL; \ |
2995 | u8 val; \ |
2996 | \ |
2997 | mutex_lock(&opts->lock); \ |
2998 | - ret = sscanf(page, "%02hhx", &val); \ |
2999 | - if (ret > 0) { \ |
3000 | + if (sscanf(page, "%02hhx", &val) > 0) { \ |
3001 | opts->_n_ = val; \ |
3002 | ret = len; \ |
3003 | } \ |
3004 | diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c |
3005 | index d08b0079eecb1..71ef473df585f 100644 |
3006 | --- a/drivers/usb/host/xhci-pci.c |
3007 | +++ b/drivers/usb/host/xhci-pci.c |
3008 | @@ -62,6 +62,7 @@ |
3009 | #define PCI_DEVICE_ID_ASMEDIA_1042A_XHCI 0x1142 |
3010 | #define PCI_DEVICE_ID_ASMEDIA_1142_XHCI 0x1242 |
3011 | #define PCI_DEVICE_ID_ASMEDIA_2142_XHCI 0x2142 |
3012 | +#define PCI_DEVICE_ID_ASMEDIA_3242_XHCI 0x3242 |
3013 | |
3014 | static const char hcd_name[] = "xhci_hcd"; |
3015 | |
3016 | @@ -258,11 +259,14 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci) |
3017 | pdev->device == PCI_DEVICE_ID_ASMEDIA_1042_XHCI) |
3018 | xhci->quirks |= XHCI_BROKEN_STREAMS; |
3019 | if (pdev->vendor == PCI_VENDOR_ID_ASMEDIA && |
3020 | - pdev->device == PCI_DEVICE_ID_ASMEDIA_1042A_XHCI) |
3021 | + pdev->device == PCI_DEVICE_ID_ASMEDIA_1042A_XHCI) { |
3022 | xhci->quirks |= XHCI_TRUST_TX_LENGTH; |
3023 | + xhci->quirks |= XHCI_NO_64BIT_SUPPORT; |
3024 | + } |
3025 | if (pdev->vendor == PCI_VENDOR_ID_ASMEDIA && |
3026 | (pdev->device == PCI_DEVICE_ID_ASMEDIA_1142_XHCI || |
3027 | - pdev->device == PCI_DEVICE_ID_ASMEDIA_2142_XHCI)) |
3028 | + pdev->device == PCI_DEVICE_ID_ASMEDIA_2142_XHCI || |
3029 | + pdev->device == PCI_DEVICE_ID_ASMEDIA_3242_XHCI)) |
3030 | xhci->quirks |= XHCI_NO_64BIT_SUPPORT; |
3031 | |
3032 | if (pdev->vendor == PCI_VENDOR_ID_ASMEDIA && |
3033 | @@ -277,6 +281,11 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci) |
3034 | pdev->device == 0x9026) |
3035 | xhci->quirks |= XHCI_RESET_PLL_ON_DISCONNECT; |
3036 | |
3037 | + if (pdev->vendor == PCI_VENDOR_ID_AMD && |
3038 | + (pdev->device == PCI_DEVICE_ID_AMD_PROMONTORYA_2 || |
3039 | + pdev->device == PCI_DEVICE_ID_AMD_PROMONTORYA_4)) |
3040 | + xhci->quirks |= XHCI_NO_SOFT_RETRY; |
3041 | + |
3042 | if (xhci->quirks & XHCI_RESET_ON_RESUME) |
3043 | xhci_dbg_trace(xhci, trace_xhci_dbg_quirks, |
3044 | "QUIRK: Resetting on resume"); |
3045 | diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c |
3046 | index 900ea91fb3c6b..f6b5010deb735 100644 |
3047 | --- a/drivers/usb/host/xhci-ring.c |
3048 | +++ b/drivers/usb/host/xhci-ring.c |
3049 | @@ -2299,7 +2299,8 @@ static int process_bulk_intr_td(struct xhci_hcd *xhci, struct xhci_td *td, |
3050 | remaining = 0; |
3051 | break; |
3052 | case COMP_USB_TRANSACTION_ERROR: |
3053 | - if ((ep_ring->err_count++ > MAX_SOFT_RETRY) || |
3054 | + if (xhci->quirks & XHCI_NO_SOFT_RETRY || |
3055 | + (ep_ring->err_count++ > MAX_SOFT_RETRY) || |
3056 | le32_to_cpu(slot_ctx->tt_info) & TT_SLOT) |
3057 | break; |
3058 | *status = 0; |
3059 | diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c |
3060 | index 91330517444e7..b5080bc1689e4 100644 |
3061 | --- a/drivers/usb/host/xhci.c |
3062 | +++ b/drivers/usb/host/xhci.c |
3063 | @@ -883,44 +883,42 @@ static void xhci_clear_command_ring(struct xhci_hcd *xhci) |
3064 | xhci_set_cmd_ring_deq(xhci); |
3065 | } |
3066 | |
3067 | -static void xhci_disable_port_wake_on_bits(struct xhci_hcd *xhci) |
3068 | +/* |
3069 | + * Disable port wake bits if do_wakeup is not set. |
3070 | + * |
3071 | + * Also clear a possible internal port wake state left hanging for ports that |
3072 | + * detected termination but never successfully enumerated (trained to 0U). |
3073 | + * Internal wake causes immediate xHCI wake after suspend. PORT_CSC write done |
3074 | + * at enumeration clears this wake, force one here as well for unconnected ports |
3075 | + */ |
3076 | + |
3077 | +static void xhci_disable_hub_port_wake(struct xhci_hcd *xhci, |
3078 | + struct xhci_hub *rhub, |
3079 | + bool do_wakeup) |
3080 | { |
3081 | - struct xhci_port **ports; |
3082 | - int port_index; |
3083 | unsigned long flags; |
3084 | u32 t1, t2, portsc; |
3085 | + int i; |
3086 | |
3087 | spin_lock_irqsave(&xhci->lock, flags); |
3088 | |
3089 | - /* disable usb3 ports Wake bits */ |
3090 | - port_index = xhci->usb3_rhub.num_ports; |
3091 | - ports = xhci->usb3_rhub.ports; |
3092 | - while (port_index--) { |
3093 | - t1 = readl(ports[port_index]->addr); |
3094 | - portsc = t1; |
3095 | - t1 = xhci_port_state_to_neutral(t1); |
3096 | - t2 = t1 & ~PORT_WAKE_BITS; |
3097 | - if (t1 != t2) { |
3098 | - writel(t2, ports[port_index]->addr); |
3099 | - xhci_dbg(xhci, "disable wake bits port %d-%d, portsc: 0x%x, write: 0x%x\n", |
3100 | - xhci->usb3_rhub.hcd->self.busnum, |
3101 | - port_index + 1, portsc, t2); |
3102 | - } |
3103 | - } |
3104 | + for (i = 0; i < rhub->num_ports; i++) { |
3105 | + portsc = readl(rhub->ports[i]->addr); |
3106 | + t1 = xhci_port_state_to_neutral(portsc); |
3107 | + t2 = t1; |
3108 | + |
3109 | + /* clear wake bits if do_wake is not set */ |
3110 | + if (!do_wakeup) |
3111 | + t2 &= ~PORT_WAKE_BITS; |
3112 | + |
3113 | + /* Don't touch csc bit if connected or connect change is set */ |
3114 | + if (!(portsc & (PORT_CSC | PORT_CONNECT))) |
3115 | + t2 |= PORT_CSC; |
3116 | |
3117 | - /* disable usb2 ports Wake bits */ |
3118 | - port_index = xhci->usb2_rhub.num_ports; |
3119 | - ports = xhci->usb2_rhub.ports; |
3120 | - while (port_index--) { |
3121 | - t1 = readl(ports[port_index]->addr); |
3122 | - portsc = t1; |
3123 | - t1 = xhci_port_state_to_neutral(t1); |
3124 | - t2 = t1 & ~PORT_WAKE_BITS; |
3125 | if (t1 != t2) { |
3126 | - writel(t2, ports[port_index]->addr); |
3127 | - xhci_dbg(xhci, "disable wake bits port %d-%d, portsc: 0x%x, write: 0x%x\n", |
3128 | - xhci->usb2_rhub.hcd->self.busnum, |
3129 | - port_index + 1, portsc, t2); |
3130 | + writel(t2, rhub->ports[i]->addr); |
3131 | + xhci_dbg(xhci, "config port %d-%d wake bits, portsc: 0x%x, write: 0x%x\n", |
3132 | + rhub->hcd->self.busnum, i + 1, portsc, t2); |
3133 | } |
3134 | } |
3135 | spin_unlock_irqrestore(&xhci->lock, flags); |
3136 | @@ -983,8 +981,8 @@ int xhci_suspend(struct xhci_hcd *xhci, bool do_wakeup) |
3137 | return -EINVAL; |
3138 | |
3139 | /* Clear root port wake on bits if wakeup not allowed. */ |
3140 | - if (!do_wakeup) |
3141 | - xhci_disable_port_wake_on_bits(xhci); |
3142 | + xhci_disable_hub_port_wake(xhci, &xhci->usb3_rhub, do_wakeup); |
3143 | + xhci_disable_hub_port_wake(xhci, &xhci->usb2_rhub, do_wakeup); |
3144 | |
3145 | if (!HCD_HW_ACCESSIBLE(hcd)) |
3146 | return 0; |
3147 | @@ -1088,6 +1086,7 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated) |
3148 | struct usb_hcd *secondary_hcd; |
3149 | int retval = 0; |
3150 | bool comp_timer_running = false; |
3151 | + bool pending_portevent = false; |
3152 | |
3153 | if (!hcd->state) |
3154 | return 0; |
3155 | @@ -1226,13 +1225,22 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated) |
3156 | |
3157 | done: |
3158 | if (retval == 0) { |
3159 | - /* Resume root hubs only when have pending events. */ |
3160 | - if (xhci_pending_portevent(xhci)) { |
3161 | + /* |
3162 | + * Resume roothubs only if there are pending events. |
3163 | + * USB 3 devices resend U3 LFPS wake after a 100ms delay if |
3164 | + * the first wake signalling failed, give it that chance. |
3165 | + */ |
3166 | + pending_portevent = xhci_pending_portevent(xhci); |
3167 | + if (!pending_portevent) { |
3168 | + msleep(120); |
3169 | + pending_portevent = xhci_pending_portevent(xhci); |
3170 | + } |
3171 | + |
3172 | + if (pending_portevent) { |
3173 | usb_hcd_resume_root_hub(xhci->shared_hcd); |
3174 | usb_hcd_resume_root_hub(hcd); |
3175 | } |
3176 | } |
3177 | - |
3178 | /* |
3179 | * If system is subject to the Quirk, Compliance Mode Timer needs to |
3180 | * be re-initialized Always after a system resume. Ports are subject |
3181 | diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h |
3182 | index 1ad1d6e9e9979..8798ed0317864 100644 |
3183 | --- a/drivers/usb/host/xhci.h |
3184 | +++ b/drivers/usb/host/xhci.h |
3185 | @@ -1875,6 +1875,7 @@ struct xhci_hcd { |
3186 | #define XHCI_SNPS_BROKEN_SUSPEND BIT_ULL(35) |
3187 | #define XHCI_SKIP_PHY_INIT BIT_ULL(37) |
3188 | #define XHCI_DISABLE_SPARSE BIT_ULL(38) |
3189 | +#define XHCI_NO_SOFT_RETRY BIT_ULL(40) |
3190 | |
3191 | unsigned int num_active_eps; |
3192 | unsigned int limit_active_eps; |
3193 | diff --git a/drivers/usb/renesas_usbhs/pipe.c b/drivers/usb/renesas_usbhs/pipe.c |
3194 | index 9e5afdde1adbf..40576e7176d8b 100644 |
3195 | --- a/drivers/usb/renesas_usbhs/pipe.c |
3196 | +++ b/drivers/usb/renesas_usbhs/pipe.c |
3197 | @@ -746,6 +746,8 @@ struct usbhs_pipe *usbhs_pipe_malloc(struct usbhs_priv *priv, |
3198 | |
3199 | void usbhs_pipe_free(struct usbhs_pipe *pipe) |
3200 | { |
3201 | + usbhsp_pipe_select(pipe); |
3202 | + usbhsp_pipe_cfg_set(pipe, 0xFFFF, 0); |
3203 | usbhsp_put_pipe(pipe); |
3204 | } |
3205 | |
3206 | diff --git a/drivers/usb/serial/ch341.c b/drivers/usb/serial/ch341.c |
3207 | index fdaefbe924908..a82ba9cc0c724 100644 |
3208 | --- a/drivers/usb/serial/ch341.c |
3209 | +++ b/drivers/usb/serial/ch341.c |
3210 | @@ -85,6 +85,7 @@ static const struct usb_device_id id_table[] = { |
3211 | { USB_DEVICE(0x1a86, 0x7522) }, |
3212 | { USB_DEVICE(0x1a86, 0x7523) }, |
3213 | { USB_DEVICE(0x4348, 0x5523) }, |
3214 | + { USB_DEVICE(0x9986, 0x7523) }, |
3215 | { }, |
3216 | }; |
3217 | MODULE_DEVICE_TABLE(usb, id_table); |
3218 | diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c |
3219 | index 361a2e3ccad8d..caf27a0d51f03 100644 |
3220 | --- a/drivers/usb/serial/cp210x.c |
3221 | +++ b/drivers/usb/serial/cp210x.c |
3222 | @@ -146,6 +146,7 @@ static const struct usb_device_id id_table[] = { |
3223 | { USB_DEVICE(0x10C4, 0x8857) }, /* CEL EM357 ZigBee USB Stick */ |
3224 | { USB_DEVICE(0x10C4, 0x88A4) }, /* MMB Networks ZigBee USB Device */ |
3225 | { USB_DEVICE(0x10C4, 0x88A5) }, /* Planet Innovation Ingeni ZigBee USB Device */ |
3226 | + { USB_DEVICE(0x10C4, 0x88D8) }, /* Acuity Brands nLight Air Adapter */ |
3227 | { USB_DEVICE(0x10C4, 0x88FB) }, /* CESINEL MEDCAL STII Network Analyzer */ |
3228 | { USB_DEVICE(0x10C4, 0x8938) }, /* CESINEL MEDCAL S II Network Analyzer */ |
3229 | { USB_DEVICE(0x10C4, 0x8946) }, /* Ketra N1 Wireless Interface */ |
3230 | @@ -202,6 +203,8 @@ static const struct usb_device_id id_table[] = { |
3231 | { USB_DEVICE(0x1901, 0x0194) }, /* GE Healthcare Remote Alarm Box */ |
3232 | { USB_DEVICE(0x1901, 0x0195) }, /* GE B850/B650/B450 CP2104 DP UART interface */ |
3233 | { USB_DEVICE(0x1901, 0x0196) }, /* GE B850 CP2105 DP UART interface */ |
3234 | + { USB_DEVICE(0x1901, 0x0197) }, /* GE CS1000 Display serial interface */ |
3235 | + { USB_DEVICE(0x1901, 0x0198) }, /* GE CS1000 M.2 Key E serial interface */ |
3236 | { USB_DEVICE(0x199B, 0xBA30) }, /* LORD WSDA-200-USB */ |
3237 | { USB_DEVICE(0x19CF, 0x3000) }, /* Parrot NMEA GPS Flight Recorder */ |
3238 | { USB_DEVICE(0x1ADB, 0x0001) }, /* Schweitzer Engineering C662 Cable */ |
3239 | diff --git a/drivers/usb/serial/io_edgeport.c b/drivers/usb/serial/io_edgeport.c |
3240 | index 4cca0b836f430..3b4d1ff9033dd 100644 |
3241 | --- a/drivers/usb/serial/io_edgeport.c |
3242 | +++ b/drivers/usb/serial/io_edgeport.c |
3243 | @@ -3003,26 +3003,32 @@ static int edge_startup(struct usb_serial *serial) |
3244 | response = -ENODEV; |
3245 | } |
3246 | |
3247 | - usb_free_urb(edge_serial->interrupt_read_urb); |
3248 | - kfree(edge_serial->interrupt_in_buffer); |
3249 | - |
3250 | - usb_free_urb(edge_serial->read_urb); |
3251 | - kfree(edge_serial->bulk_in_buffer); |
3252 | - |
3253 | - kfree(edge_serial); |
3254 | - |
3255 | - return response; |
3256 | + goto error; |
3257 | } |
3258 | |
3259 | /* start interrupt read for this edgeport this interrupt will |
3260 | * continue as long as the edgeport is connected */ |
3261 | response = usb_submit_urb(edge_serial->interrupt_read_urb, |
3262 | GFP_KERNEL); |
3263 | - if (response) |
3264 | + if (response) { |
3265 | dev_err(ddev, "%s - Error %d submitting control urb\n", |
3266 | __func__, response); |
3267 | + |
3268 | + goto error; |
3269 | + } |
3270 | } |
3271 | return response; |
3272 | + |
3273 | +error: |
3274 | + usb_free_urb(edge_serial->interrupt_read_urb); |
3275 | + kfree(edge_serial->interrupt_in_buffer); |
3276 | + |
3277 | + usb_free_urb(edge_serial->read_urb); |
3278 | + kfree(edge_serial->bulk_in_buffer); |
3279 | + |
3280 | + kfree(edge_serial); |
3281 | + |
3282 | + return response; |
3283 | } |
3284 | |
3285 | |
3286 | diff --git a/drivers/usb/usbip/stub_dev.c b/drivers/usb/usbip/stub_dev.c |
3287 | index 2305d425e6c9a..8f1de1fbbeedf 100644 |
3288 | --- a/drivers/usb/usbip/stub_dev.c |
3289 | +++ b/drivers/usb/usbip/stub_dev.c |
3290 | @@ -46,6 +46,8 @@ static ssize_t usbip_sockfd_store(struct device *dev, struct device_attribute *a |
3291 | int sockfd = 0; |
3292 | struct socket *socket; |
3293 | int rv; |
3294 | + struct task_struct *tcp_rx = NULL; |
3295 | + struct task_struct *tcp_tx = NULL; |
3296 | |
3297 | if (!sdev) { |
3298 | dev_err(dev, "sdev is null\n"); |
3299 | @@ -69,23 +71,47 @@ static ssize_t usbip_sockfd_store(struct device *dev, struct device_attribute *a |
3300 | } |
3301 | |
3302 | socket = sockfd_lookup(sockfd, &err); |
3303 | - if (!socket) |
3304 | + if (!socket) { |
3305 | + dev_err(dev, "failed to lookup sock"); |
3306 | goto err; |
3307 | + } |
3308 | |
3309 | - sdev->ud.tcp_socket = socket; |
3310 | - sdev->ud.sockfd = sockfd; |
3311 | + if (socket->type != SOCK_STREAM) { |
3312 | + dev_err(dev, "Expecting SOCK_STREAM - found %d", |
3313 | + socket->type); |
3314 | + goto sock_err; |
3315 | + } |
3316 | |
3317 | + /* unlock and create threads and get tasks */ |
3318 | spin_unlock_irq(&sdev->ud.lock); |
3319 | + tcp_rx = kthread_create(stub_rx_loop, &sdev->ud, "stub_rx"); |
3320 | + if (IS_ERR(tcp_rx)) { |
3321 | + sockfd_put(socket); |
3322 | + return -EINVAL; |
3323 | + } |
3324 | + tcp_tx = kthread_create(stub_tx_loop, &sdev->ud, "stub_tx"); |
3325 | + if (IS_ERR(tcp_tx)) { |
3326 | + kthread_stop(tcp_rx); |
3327 | + sockfd_put(socket); |
3328 | + return -EINVAL; |
3329 | + } |
3330 | |
3331 | - sdev->ud.tcp_rx = kthread_get_run(stub_rx_loop, &sdev->ud, |
3332 | - "stub_rx"); |
3333 | - sdev->ud.tcp_tx = kthread_get_run(stub_tx_loop, &sdev->ud, |
3334 | - "stub_tx"); |
3335 | + /* get task structs now */ |
3336 | + get_task_struct(tcp_rx); |
3337 | + get_task_struct(tcp_tx); |
3338 | |
3339 | + /* lock and update sdev->ud state */ |
3340 | spin_lock_irq(&sdev->ud.lock); |
3341 | + sdev->ud.tcp_socket = socket; |
3342 | + sdev->ud.sockfd = sockfd; |
3343 | + sdev->ud.tcp_rx = tcp_rx; |
3344 | + sdev->ud.tcp_tx = tcp_tx; |
3345 | sdev->ud.status = SDEV_ST_USED; |
3346 | spin_unlock_irq(&sdev->ud.lock); |
3347 | |
3348 | + wake_up_process(sdev->ud.tcp_rx); |
3349 | + wake_up_process(sdev->ud.tcp_tx); |
3350 | + |
3351 | } else { |
3352 | dev_info(dev, "stub down\n"); |
3353 | |
3354 | @@ -100,6 +126,8 @@ static ssize_t usbip_sockfd_store(struct device *dev, struct device_attribute *a |
3355 | |
3356 | return count; |
3357 | |
3358 | +sock_err: |
3359 | + sockfd_put(socket); |
3360 | err: |
3361 | spin_unlock_irq(&sdev->ud.lock); |
3362 | return -EINVAL; |
3363 | diff --git a/drivers/usb/usbip/vhci_sysfs.c b/drivers/usb/usbip/vhci_sysfs.c |
3364 | index be37aec250c2b..e64ea314930be 100644 |
3365 | --- a/drivers/usb/usbip/vhci_sysfs.c |
3366 | +++ b/drivers/usb/usbip/vhci_sysfs.c |
3367 | @@ -312,6 +312,8 @@ static ssize_t attach_store(struct device *dev, struct device_attribute *attr, |
3368 | struct vhci *vhci; |
3369 | int err; |
3370 | unsigned long flags; |
3371 | + struct task_struct *tcp_rx = NULL; |
3372 | + struct task_struct *tcp_tx = NULL; |
3373 | |
3374 | /* |
3375 | * @rhport: port number of vhci_hcd |
3376 | @@ -349,12 +351,35 @@ static ssize_t attach_store(struct device *dev, struct device_attribute *attr, |
3377 | |
3378 | /* Extract socket from fd. */ |
3379 | socket = sockfd_lookup(sockfd, &err); |
3380 | - if (!socket) |
3381 | + if (!socket) { |
3382 | + dev_err(dev, "failed to lookup sock"); |
3383 | return -EINVAL; |
3384 | + } |
3385 | + if (socket->type != SOCK_STREAM) { |
3386 | + dev_err(dev, "Expecting SOCK_STREAM - found %d", |
3387 | + socket->type); |
3388 | + sockfd_put(socket); |
3389 | + return -EINVAL; |
3390 | + } |
3391 | + |
3392 | + /* create threads before locking */ |
3393 | + tcp_rx = kthread_create(vhci_rx_loop, &vdev->ud, "vhci_rx"); |
3394 | + if (IS_ERR(tcp_rx)) { |
3395 | + sockfd_put(socket); |
3396 | + return -EINVAL; |
3397 | + } |
3398 | + tcp_tx = kthread_create(vhci_tx_loop, &vdev->ud, "vhci_tx"); |
3399 | + if (IS_ERR(tcp_tx)) { |
3400 | + kthread_stop(tcp_rx); |
3401 | + sockfd_put(socket); |
3402 | + return -EINVAL; |
3403 | + } |
3404 | |
3405 | - /* now need lock until setting vdev status as used */ |
3406 | + /* get task structs now */ |
3407 | + get_task_struct(tcp_rx); |
3408 | + get_task_struct(tcp_tx); |
3409 | |
3410 | - /* begin a lock */ |
3411 | + /* now begin lock until setting vdev status set */ |
3412 | spin_lock_irqsave(&vhci->lock, flags); |
3413 | spin_lock(&vdev->ud.lock); |
3414 | |
3415 | @@ -364,6 +389,8 @@ static ssize_t attach_store(struct device *dev, struct device_attribute *attr, |
3416 | spin_unlock_irqrestore(&vhci->lock, flags); |
3417 | |
3418 | sockfd_put(socket); |
3419 | + kthread_stop_put(tcp_rx); |
3420 | + kthread_stop_put(tcp_tx); |
3421 | |
3422 | dev_err(dev, "port %d already used\n", rhport); |
3423 | /* |
3424 | @@ -382,14 +409,16 @@ static ssize_t attach_store(struct device *dev, struct device_attribute *attr, |
3425 | vdev->speed = speed; |
3426 | vdev->ud.sockfd = sockfd; |
3427 | vdev->ud.tcp_socket = socket; |
3428 | + vdev->ud.tcp_rx = tcp_rx; |
3429 | + vdev->ud.tcp_tx = tcp_tx; |
3430 | vdev->ud.status = VDEV_ST_NOTASSIGNED; |
3431 | |
3432 | spin_unlock(&vdev->ud.lock); |
3433 | spin_unlock_irqrestore(&vhci->lock, flags); |
3434 | /* end the lock */ |
3435 | |
3436 | - vdev->ud.tcp_rx = kthread_get_run(vhci_rx_loop, &vdev->ud, "vhci_rx"); |
3437 | - vdev->ud.tcp_tx = kthread_get_run(vhci_tx_loop, &vdev->ud, "vhci_tx"); |
3438 | + wake_up_process(vdev->ud.tcp_rx); |
3439 | + wake_up_process(vdev->ud.tcp_tx); |
3440 | |
3441 | rh_port_connect(vdev, speed); |
3442 | |
3443 | diff --git a/drivers/usb/usbip/vudc_sysfs.c b/drivers/usb/usbip/vudc_sysfs.c |
3444 | index 100f680c572ae..a3ec39fc61778 100644 |
3445 | --- a/drivers/usb/usbip/vudc_sysfs.c |
3446 | +++ b/drivers/usb/usbip/vudc_sysfs.c |
3447 | @@ -90,8 +90,9 @@ unlock: |
3448 | } |
3449 | static BIN_ATTR_RO(dev_desc, sizeof(struct usb_device_descriptor)); |
3450 | |
3451 | -static ssize_t usbip_sockfd_store(struct device *dev, struct device_attribute *attr, |
3452 | - const char *in, size_t count) |
3453 | +static ssize_t usbip_sockfd_store(struct device *dev, |
3454 | + struct device_attribute *attr, |
3455 | + const char *in, size_t count) |
3456 | { |
3457 | struct vudc *udc = (struct vudc *) dev_get_drvdata(dev); |
3458 | int rv; |
3459 | @@ -100,6 +101,8 @@ static ssize_t usbip_sockfd_store(struct device *dev, struct device_attribute *a |
3460 | struct socket *socket; |
3461 | unsigned long flags; |
3462 | int ret; |
3463 | + struct task_struct *tcp_rx = NULL; |
3464 | + struct task_struct *tcp_tx = NULL; |
3465 | |
3466 | rv = kstrtoint(in, 0, &sockfd); |
3467 | if (rv != 0) |
3468 | @@ -138,24 +141,54 @@ static ssize_t usbip_sockfd_store(struct device *dev, struct device_attribute *a |
3469 | goto unlock_ud; |
3470 | } |
3471 | |
3472 | - udc->ud.tcp_socket = socket; |
3473 | + if (socket->type != SOCK_STREAM) { |
3474 | + dev_err(dev, "Expecting SOCK_STREAM - found %d", |
3475 | + socket->type); |
3476 | + ret = -EINVAL; |
3477 | + goto sock_err; |
3478 | + } |
3479 | |
3480 | + /* unlock and create threads and get tasks */ |
3481 | spin_unlock_irq(&udc->ud.lock); |
3482 | spin_unlock_irqrestore(&udc->lock, flags); |
3483 | |
3484 | - udc->ud.tcp_rx = kthread_get_run(&v_rx_loop, |
3485 | - &udc->ud, "vudc_rx"); |
3486 | - udc->ud.tcp_tx = kthread_get_run(&v_tx_loop, |
3487 | - &udc->ud, "vudc_tx"); |
3488 | + tcp_rx = kthread_create(&v_rx_loop, &udc->ud, "vudc_rx"); |
3489 | + if (IS_ERR(tcp_rx)) { |
3490 | + sockfd_put(socket); |
3491 | + return -EINVAL; |
3492 | + } |
3493 | + tcp_tx = kthread_create(&v_tx_loop, &udc->ud, "vudc_tx"); |
3494 | + if (IS_ERR(tcp_tx)) { |
3495 | + kthread_stop(tcp_rx); |
3496 | + sockfd_put(socket); |
3497 | + return -EINVAL; |
3498 | + } |
3499 | + |
3500 | + /* get task structs now */ |
3501 | + get_task_struct(tcp_rx); |
3502 | + get_task_struct(tcp_tx); |
3503 | |
3504 | + /* lock and update udc->ud state */ |
3505 | spin_lock_irqsave(&udc->lock, flags); |
3506 | spin_lock_irq(&udc->ud.lock); |
3507 | + |
3508 | + udc->ud.tcp_socket = socket; |
3509 | + udc->ud.tcp_rx = tcp_rx; |
3510 | + udc->ud.tcp_rx = tcp_tx; |
3511 | udc->ud.status = SDEV_ST_USED; |
3512 | + |
3513 | spin_unlock_irq(&udc->ud.lock); |
3514 | |
3515 | ktime_get_ts64(&udc->start_time); |
3516 | v_start_timer(udc); |
3517 | udc->connected = 1; |
3518 | + |
3519 | + spin_unlock_irqrestore(&udc->lock, flags); |
3520 | + |
3521 | + wake_up_process(udc->ud.tcp_rx); |
3522 | + wake_up_process(udc->ud.tcp_tx); |
3523 | + return count; |
3524 | + |
3525 | } else { |
3526 | if (!udc->connected) { |
3527 | dev_err(dev, "Device not connected"); |
3528 | @@ -177,6 +210,8 @@ static ssize_t usbip_sockfd_store(struct device *dev, struct device_attribute *a |
3529 | |
3530 | return count; |
3531 | |
3532 | +sock_err: |
3533 | + sockfd_put(socket); |
3534 | unlock_ud: |
3535 | spin_unlock_irq(&udc->ud.lock); |
3536 | unlock: |
3537 | diff --git a/drivers/xen/events/events_2l.c b/drivers/xen/events/events_2l.c |
3538 | index f026624898e7a..77cc80bcb479c 100644 |
3539 | --- a/drivers/xen/events/events_2l.c |
3540 | +++ b/drivers/xen/events/events_2l.c |
3541 | @@ -47,6 +47,11 @@ static unsigned evtchn_2l_max_channels(void) |
3542 | return EVTCHN_2L_NR_CHANNELS; |
3543 | } |
3544 | |
3545 | +static void evtchn_2l_remove(evtchn_port_t evtchn, unsigned int cpu) |
3546 | +{ |
3547 | + clear_bit(evtchn, BM(per_cpu(cpu_evtchn_mask, cpu))); |
3548 | +} |
3549 | + |
3550 | static void evtchn_2l_bind_to_cpu(struct irq_info *info, unsigned cpu) |
3551 | { |
3552 | clear_bit(info->evtchn, BM(per_cpu(cpu_evtchn_mask, info->cpu))); |
3553 | @@ -71,12 +76,6 @@ static bool evtchn_2l_is_pending(unsigned port) |
3554 | return sync_test_bit(port, BM(&s->evtchn_pending[0])); |
3555 | } |
3556 | |
3557 | -static bool evtchn_2l_test_and_set_mask(unsigned port) |
3558 | -{ |
3559 | - struct shared_info *s = HYPERVISOR_shared_info; |
3560 | - return sync_test_and_set_bit(port, BM(&s->evtchn_mask[0])); |
3561 | -} |
3562 | - |
3563 | static void evtchn_2l_mask(unsigned port) |
3564 | { |
3565 | struct shared_info *s = HYPERVISOR_shared_info; |
3566 | @@ -354,18 +353,27 @@ static void evtchn_2l_resume(void) |
3567 | EVTCHN_2L_NR_CHANNELS/BITS_PER_EVTCHN_WORD); |
3568 | } |
3569 | |
3570 | +static int evtchn_2l_percpu_deinit(unsigned int cpu) |
3571 | +{ |
3572 | + memset(per_cpu(cpu_evtchn_mask, cpu), 0, sizeof(xen_ulong_t) * |
3573 | + EVTCHN_2L_NR_CHANNELS/BITS_PER_EVTCHN_WORD); |
3574 | + |
3575 | + return 0; |
3576 | +} |
3577 | + |
3578 | static const struct evtchn_ops evtchn_ops_2l = { |
3579 | .max_channels = evtchn_2l_max_channels, |
3580 | .nr_channels = evtchn_2l_max_channels, |
3581 | + .remove = evtchn_2l_remove, |
3582 | .bind_to_cpu = evtchn_2l_bind_to_cpu, |
3583 | .clear_pending = evtchn_2l_clear_pending, |
3584 | .set_pending = evtchn_2l_set_pending, |
3585 | .is_pending = evtchn_2l_is_pending, |
3586 | - .test_and_set_mask = evtchn_2l_test_and_set_mask, |
3587 | .mask = evtchn_2l_mask, |
3588 | .unmask = evtchn_2l_unmask, |
3589 | .handle_events = evtchn_2l_handle_events, |
3590 | .resume = evtchn_2l_resume, |
3591 | + .percpu_deinit = evtchn_2l_percpu_deinit, |
3592 | }; |
3593 | |
3594 | void __init xen_evtchn_2l_init(void) |
3595 | diff --git a/drivers/xen/events/events_base.c b/drivers/xen/events/events_base.c |
3596 | index 7b94a6c316643..e492f5fe5be62 100644 |
3597 | --- a/drivers/xen/events/events_base.c |
3598 | +++ b/drivers/xen/events/events_base.c |
3599 | @@ -99,6 +99,7 @@ static DEFINE_RWLOCK(evtchn_rwlock); |
3600 | * evtchn_rwlock |
3601 | * IRQ-desc lock |
3602 | * percpu eoi_list_lock |
3603 | + * irq_info->lock |
3604 | */ |
3605 | |
3606 | static LIST_HEAD(xen_irq_list_head); |
3607 | @@ -220,6 +221,8 @@ static int xen_irq_info_common_setup(struct irq_info *info, |
3608 | info->irq = irq; |
3609 | info->evtchn = evtchn; |
3610 | info->cpu = cpu; |
3611 | + info->mask_reason = EVT_MASK_REASON_EXPLICIT; |
3612 | + spin_lock_init(&info->lock); |
3613 | |
3614 | ret = set_evtchn_to_irq(evtchn, irq); |
3615 | if (ret < 0) |
3616 | @@ -286,6 +289,7 @@ static int xen_irq_info_pirq_setup(unsigned irq, |
3617 | static void xen_irq_info_cleanup(struct irq_info *info) |
3618 | { |
3619 | set_evtchn_to_irq(info->evtchn, -1); |
3620 | + xen_evtchn_port_remove(info->evtchn, info->cpu); |
3621 | info->evtchn = 0; |
3622 | } |
3623 | |
3624 | @@ -366,6 +370,34 @@ unsigned int cpu_from_evtchn(unsigned int evtchn) |
3625 | return ret; |
3626 | } |
3627 | |
3628 | +static void do_mask(struct irq_info *info, u8 reason) |
3629 | +{ |
3630 | + unsigned long flags; |
3631 | + |
3632 | + spin_lock_irqsave(&info->lock, flags); |
3633 | + |
3634 | + if (!info->mask_reason) |
3635 | + mask_evtchn(info->evtchn); |
3636 | + |
3637 | + info->mask_reason |= reason; |
3638 | + |
3639 | + spin_unlock_irqrestore(&info->lock, flags); |
3640 | +} |
3641 | + |
3642 | +static void do_unmask(struct irq_info *info, u8 reason) |
3643 | +{ |
3644 | + unsigned long flags; |
3645 | + |
3646 | + spin_lock_irqsave(&info->lock, flags); |
3647 | + |
3648 | + info->mask_reason &= ~reason; |
3649 | + |
3650 | + if (!info->mask_reason) |
3651 | + unmask_evtchn(info->evtchn); |
3652 | + |
3653 | + spin_unlock_irqrestore(&info->lock, flags); |
3654 | +} |
3655 | + |
3656 | #ifdef CONFIG_X86 |
3657 | static bool pirq_check_eoi_map(unsigned irq) |
3658 | { |
3659 | @@ -493,7 +525,7 @@ static void xen_irq_lateeoi_locked(struct irq_info *info, bool spurious) |
3660 | } |
3661 | |
3662 | info->eoi_time = 0; |
3663 | - unmask_evtchn(evtchn); |
3664 | + do_unmask(info, EVT_MASK_REASON_EOI_PENDING); |
3665 | } |
3666 | |
3667 | static void xen_irq_lateeoi_worker(struct work_struct *work) |
3668 | @@ -662,6 +694,12 @@ static void xen_evtchn_close(unsigned int port) |
3669 | BUG(); |
3670 | } |
3671 | |
3672 | +static void event_handler_exit(struct irq_info *info) |
3673 | +{ |
3674 | + smp_store_release(&info->is_active, 0); |
3675 | + clear_evtchn(info->evtchn); |
3676 | +} |
3677 | + |
3678 | static void pirq_query_unmask(int irq) |
3679 | { |
3680 | struct physdev_irq_status_query irq_status; |
3681 | @@ -680,7 +718,8 @@ static void pirq_query_unmask(int irq) |
3682 | |
3683 | static void eoi_pirq(struct irq_data *data) |
3684 | { |
3685 | - int evtchn = evtchn_from_irq(data->irq); |
3686 | + struct irq_info *info = info_for_irq(data->irq); |
3687 | + int evtchn = info ? info->evtchn : 0; |
3688 | struct physdev_eoi eoi = { .irq = pirq_from_irq(data->irq) }; |
3689 | int rc = 0; |
3690 | |
3691 | @@ -689,16 +728,15 @@ static void eoi_pirq(struct irq_data *data) |
3692 | |
3693 | if (unlikely(irqd_is_setaffinity_pending(data)) && |
3694 | likely(!irqd_irq_disabled(data))) { |
3695 | - int masked = test_and_set_mask(evtchn); |
3696 | + do_mask(info, EVT_MASK_REASON_TEMPORARY); |
3697 | |
3698 | - clear_evtchn(evtchn); |
3699 | + event_handler_exit(info); |
3700 | |
3701 | irq_move_masked_irq(data); |
3702 | |
3703 | - if (!masked) |
3704 | - unmask_evtchn(evtchn); |
3705 | + do_unmask(info, EVT_MASK_REASON_TEMPORARY); |
3706 | } else |
3707 | - clear_evtchn(evtchn); |
3708 | + event_handler_exit(info); |
3709 | |
3710 | if (pirq_needs_eoi(data->irq)) { |
3711 | rc = HYPERVISOR_physdev_op(PHYSDEVOP_eoi, &eoi); |
3712 | @@ -749,7 +787,8 @@ static unsigned int __startup_pirq(unsigned int irq) |
3713 | goto err; |
3714 | |
3715 | out: |
3716 | - unmask_evtchn(evtchn); |
3717 | + do_unmask(info, EVT_MASK_REASON_EXPLICIT); |
3718 | + |
3719 | eoi_pirq(irq_get_irq_data(irq)); |
3720 | |
3721 | return 0; |
3722 | @@ -776,7 +815,7 @@ static void shutdown_pirq(struct irq_data *data) |
3723 | if (!VALID_EVTCHN(evtchn)) |
3724 | return; |
3725 | |
3726 | - mask_evtchn(evtchn); |
3727 | + do_mask(info, EVT_MASK_REASON_EXPLICIT); |
3728 | xen_evtchn_close(evtchn); |
3729 | xen_irq_info_cleanup(info); |
3730 | } |
3731 | @@ -1533,6 +1572,8 @@ void handle_irq_for_port(evtchn_port_t port, struct evtchn_loop_ctrl *ctrl) |
3732 | } |
3733 | |
3734 | info = info_for_irq(irq); |
3735 | + if (xchg_acquire(&info->is_active, 1)) |
3736 | + return; |
3737 | |
3738 | if (ctrl->defer_eoi) { |
3739 | info->eoi_cpu = smp_processor_id(); |
3740 | @@ -1635,10 +1676,10 @@ void rebind_evtchn_irq(int evtchn, int irq) |
3741 | } |
3742 | |
3743 | /* Rebind an evtchn so that it gets delivered to a specific cpu */ |
3744 | -static int xen_rebind_evtchn_to_cpu(int evtchn, unsigned int tcpu) |
3745 | +static int xen_rebind_evtchn_to_cpu(struct irq_info *info, unsigned int tcpu) |
3746 | { |
3747 | struct evtchn_bind_vcpu bind_vcpu; |
3748 | - int masked; |
3749 | + evtchn_port_t evtchn = info ? info->evtchn : 0; |
3750 | |
3751 | if (!VALID_EVTCHN(evtchn)) |
3752 | return -1; |
3753 | @@ -1654,7 +1695,7 @@ static int xen_rebind_evtchn_to_cpu(int evtchn, unsigned int tcpu) |
3754 | * Mask the event while changing the VCPU binding to prevent |
3755 | * it being delivered on an unexpected VCPU. |
3756 | */ |
3757 | - masked = test_and_set_mask(evtchn); |
3758 | + do_mask(info, EVT_MASK_REASON_TEMPORARY); |
3759 | |
3760 | /* |
3761 | * If this fails, it usually just indicates that we're dealing with a |
3762 | @@ -1664,8 +1705,7 @@ static int xen_rebind_evtchn_to_cpu(int evtchn, unsigned int tcpu) |
3763 | if (HYPERVISOR_event_channel_op(EVTCHNOP_bind_vcpu, &bind_vcpu) >= 0) |
3764 | bind_evtchn_to_cpu(evtchn, tcpu); |
3765 | |
3766 | - if (!masked) |
3767 | - unmask_evtchn(evtchn); |
3768 | + do_unmask(info, EVT_MASK_REASON_TEMPORARY); |
3769 | |
3770 | return 0; |
3771 | } |
3772 | @@ -1674,7 +1714,7 @@ static int set_affinity_irq(struct irq_data *data, const struct cpumask *dest, |
3773 | bool force) |
3774 | { |
3775 | unsigned tcpu = cpumask_first_and(dest, cpu_online_mask); |
3776 | - int ret = xen_rebind_evtchn_to_cpu(evtchn_from_irq(data->irq), tcpu); |
3777 | + int ret = xen_rebind_evtchn_to_cpu(info_for_irq(data->irq), tcpu); |
3778 | |
3779 | if (!ret) |
3780 | irq_data_update_effective_affinity(data, cpumask_of(tcpu)); |
3781 | @@ -1693,39 +1733,41 @@ EXPORT_SYMBOL_GPL(xen_set_affinity_evtchn); |
3782 | |
3783 | static void enable_dynirq(struct irq_data *data) |
3784 | { |
3785 | - int evtchn = evtchn_from_irq(data->irq); |
3786 | + struct irq_info *info = info_for_irq(data->irq); |
3787 | + evtchn_port_t evtchn = info ? info->evtchn : 0; |
3788 | |
3789 | if (VALID_EVTCHN(evtchn)) |
3790 | - unmask_evtchn(evtchn); |
3791 | + do_unmask(info, EVT_MASK_REASON_EXPLICIT); |
3792 | } |
3793 | |
3794 | static void disable_dynirq(struct irq_data *data) |
3795 | { |
3796 | - int evtchn = evtchn_from_irq(data->irq); |
3797 | + struct irq_info *info = info_for_irq(data->irq); |
3798 | + evtchn_port_t evtchn = info ? info->evtchn : 0; |
3799 | |
3800 | if (VALID_EVTCHN(evtchn)) |
3801 | - mask_evtchn(evtchn); |
3802 | + do_mask(info, EVT_MASK_REASON_EXPLICIT); |
3803 | } |
3804 | |
3805 | static void ack_dynirq(struct irq_data *data) |
3806 | { |
3807 | - int evtchn = evtchn_from_irq(data->irq); |
3808 | + struct irq_info *info = info_for_irq(data->irq); |
3809 | + evtchn_port_t evtchn = info ? info->evtchn : 0; |
3810 | |
3811 | if (!VALID_EVTCHN(evtchn)) |
3812 | return; |
3813 | |
3814 | if (unlikely(irqd_is_setaffinity_pending(data)) && |
3815 | likely(!irqd_irq_disabled(data))) { |
3816 | - int masked = test_and_set_mask(evtchn); |
3817 | + do_mask(info, EVT_MASK_REASON_TEMPORARY); |
3818 | |
3819 | - clear_evtchn(evtchn); |
3820 | + event_handler_exit(info); |
3821 | |
3822 | irq_move_masked_irq(data); |
3823 | |
3824 | - if (!masked) |
3825 | - unmask_evtchn(evtchn); |
3826 | + do_unmask(info, EVT_MASK_REASON_TEMPORARY); |
3827 | } else |
3828 | - clear_evtchn(evtchn); |
3829 | + event_handler_exit(info); |
3830 | } |
3831 | |
3832 | static void mask_ack_dynirq(struct irq_data *data) |
3833 | @@ -1734,18 +1776,39 @@ static void mask_ack_dynirq(struct irq_data *data) |
3834 | ack_dynirq(data); |
3835 | } |
3836 | |
3837 | +static void lateeoi_ack_dynirq(struct irq_data *data) |
3838 | +{ |
3839 | + struct irq_info *info = info_for_irq(data->irq); |
3840 | + evtchn_port_t evtchn = info ? info->evtchn : 0; |
3841 | + |
3842 | + if (VALID_EVTCHN(evtchn)) { |
3843 | + do_mask(info, EVT_MASK_REASON_EOI_PENDING); |
3844 | + event_handler_exit(info); |
3845 | + } |
3846 | +} |
3847 | + |
3848 | +static void lateeoi_mask_ack_dynirq(struct irq_data *data) |
3849 | +{ |
3850 | + struct irq_info *info = info_for_irq(data->irq); |
3851 | + evtchn_port_t evtchn = info ? info->evtchn : 0; |
3852 | + |
3853 | + if (VALID_EVTCHN(evtchn)) { |
3854 | + do_mask(info, EVT_MASK_REASON_EXPLICIT); |
3855 | + event_handler_exit(info); |
3856 | + } |
3857 | +} |
3858 | + |
3859 | static int retrigger_dynirq(struct irq_data *data) |
3860 | { |
3861 | - unsigned int evtchn = evtchn_from_irq(data->irq); |
3862 | - int masked; |
3863 | + struct irq_info *info = info_for_irq(data->irq); |
3864 | + evtchn_port_t evtchn = info ? info->evtchn : 0; |
3865 | |
3866 | if (!VALID_EVTCHN(evtchn)) |
3867 | return 0; |
3868 | |
3869 | - masked = test_and_set_mask(evtchn); |
3870 | + do_mask(info, EVT_MASK_REASON_TEMPORARY); |
3871 | set_evtchn(evtchn); |
3872 | - if (!masked) |
3873 | - unmask_evtchn(evtchn); |
3874 | + do_unmask(info, EVT_MASK_REASON_TEMPORARY); |
3875 | |
3876 | return 1; |
3877 | } |
3878 | @@ -1840,10 +1903,11 @@ static void restore_cpu_ipis(unsigned int cpu) |
3879 | /* Clear an irq's pending state, in preparation for polling on it */ |
3880 | void xen_clear_irq_pending(int irq) |
3881 | { |
3882 | - int evtchn = evtchn_from_irq(irq); |
3883 | + struct irq_info *info = info_for_irq(irq); |
3884 | + evtchn_port_t evtchn = info ? info->evtchn : 0; |
3885 | |
3886 | if (VALID_EVTCHN(evtchn)) |
3887 | - clear_evtchn(evtchn); |
3888 | + event_handler_exit(info); |
3889 | } |
3890 | EXPORT_SYMBOL(xen_clear_irq_pending); |
3891 | void xen_set_irq_pending(int irq) |
3892 | @@ -1951,8 +2015,8 @@ static struct irq_chip xen_lateeoi_chip __read_mostly = { |
3893 | .irq_mask = disable_dynirq, |
3894 | .irq_unmask = enable_dynirq, |
3895 | |
3896 | - .irq_ack = mask_ack_dynirq, |
3897 | - .irq_mask_ack = mask_ack_dynirq, |
3898 | + .irq_ack = lateeoi_ack_dynirq, |
3899 | + .irq_mask_ack = lateeoi_mask_ack_dynirq, |
3900 | |
3901 | .irq_set_affinity = set_affinity_irq, |
3902 | .irq_retrigger = retrigger_dynirq, |
3903 | diff --git a/drivers/xen/events/events_fifo.c b/drivers/xen/events/events_fifo.c |
3904 | index 33462521bfd0f..360a7f8cdf754 100644 |
3905 | --- a/drivers/xen/events/events_fifo.c |
3906 | +++ b/drivers/xen/events/events_fifo.c |
3907 | @@ -209,12 +209,6 @@ static bool evtchn_fifo_is_pending(unsigned port) |
3908 | return sync_test_bit(EVTCHN_FIFO_BIT(PENDING, word), BM(word)); |
3909 | } |
3910 | |
3911 | -static bool evtchn_fifo_test_and_set_mask(unsigned port) |
3912 | -{ |
3913 | - event_word_t *word = event_word_from_port(port); |
3914 | - return sync_test_and_set_bit(EVTCHN_FIFO_BIT(MASKED, word), BM(word)); |
3915 | -} |
3916 | - |
3917 | static void evtchn_fifo_mask(unsigned port) |
3918 | { |
3919 | event_word_t *word = event_word_from_port(port); |
3920 | @@ -420,7 +414,6 @@ static const struct evtchn_ops evtchn_ops_fifo = { |
3921 | .clear_pending = evtchn_fifo_clear_pending, |
3922 | .set_pending = evtchn_fifo_set_pending, |
3923 | .is_pending = evtchn_fifo_is_pending, |
3924 | - .test_and_set_mask = evtchn_fifo_test_and_set_mask, |
3925 | .mask = evtchn_fifo_mask, |
3926 | .unmask = evtchn_fifo_unmask, |
3927 | .handle_events = evtchn_fifo_handle_events, |
3928 | diff --git a/drivers/xen/events/events_internal.h b/drivers/xen/events/events_internal.h |
3929 | index a35c8c7ac6066..d3a89b4646b8b 100644 |
3930 | --- a/drivers/xen/events/events_internal.h |
3931 | +++ b/drivers/xen/events/events_internal.h |
3932 | @@ -33,13 +33,19 @@ struct irq_info { |
3933 | struct list_head eoi_list; |
3934 | short refcnt; |
3935 | short spurious_cnt; |
3936 | - enum xen_irq_type type; /* type */ |
3937 | + short type; /* type */ |
3938 | + u8 mask_reason; /* Why is event channel masked */ |
3939 | +#define EVT_MASK_REASON_EXPLICIT 0x01 |
3940 | +#define EVT_MASK_REASON_TEMPORARY 0x02 |
3941 | +#define EVT_MASK_REASON_EOI_PENDING 0x04 |
3942 | + u8 is_active; /* Is event just being handled? */ |
3943 | unsigned irq; |
3944 | unsigned int evtchn; /* event channel */ |
3945 | unsigned short cpu; /* cpu bound */ |
3946 | unsigned short eoi_cpu; /* EOI must happen on this cpu */ |
3947 | unsigned int irq_epoch; /* If eoi_cpu valid: irq_epoch of event */ |
3948 | u64 eoi_time; /* Time in jiffies when to EOI. */ |
3949 | + spinlock_t lock; |
3950 | |
3951 | union { |
3952 | unsigned short virq; |
3953 | @@ -65,12 +71,12 @@ struct evtchn_ops { |
3954 | unsigned (*nr_channels)(void); |
3955 | |
3956 | int (*setup)(struct irq_info *info); |
3957 | + void (*remove)(evtchn_port_t port, unsigned int cpu); |
3958 | void (*bind_to_cpu)(struct irq_info *info, unsigned cpu); |
3959 | |
3960 | void (*clear_pending)(unsigned port); |
3961 | void (*set_pending)(unsigned port); |
3962 | bool (*is_pending)(unsigned port); |
3963 | - bool (*test_and_set_mask)(unsigned port); |
3964 | void (*mask)(unsigned port); |
3965 | void (*unmask)(unsigned port); |
3966 | |
3967 | @@ -107,6 +113,13 @@ static inline int xen_evtchn_port_setup(struct irq_info *info) |
3968 | return 0; |
3969 | } |
3970 | |
3971 | +static inline void xen_evtchn_port_remove(evtchn_port_t evtchn, |
3972 | + unsigned int cpu) |
3973 | +{ |
3974 | + if (evtchn_ops->remove) |
3975 | + evtchn_ops->remove(evtchn, cpu); |
3976 | +} |
3977 | + |
3978 | static inline void xen_evtchn_port_bind_to_cpu(struct irq_info *info, |
3979 | unsigned cpu) |
3980 | { |
3981 | @@ -128,11 +141,6 @@ static inline bool test_evtchn(unsigned port) |
3982 | return evtchn_ops->is_pending(port); |
3983 | } |
3984 | |
3985 | -static inline bool test_and_set_mask(unsigned port) |
3986 | -{ |
3987 | - return evtchn_ops->test_and_set_mask(port); |
3988 | -} |
3989 | - |
3990 | static inline void mask_evtchn(unsigned port) |
3991 | { |
3992 | return evtchn_ops->mask(port); |
3993 | diff --git a/fs/binfmt_misc.c b/fs/binfmt_misc.c |
3994 | index cdb45829354d9..056a68292e152 100644 |
3995 | --- a/fs/binfmt_misc.c |
3996 | +++ b/fs/binfmt_misc.c |
3997 | @@ -696,12 +696,24 @@ static ssize_t bm_register_write(struct file *file, const char __user *buffer, |
3998 | struct super_block *sb = file_inode(file)->i_sb; |
3999 | struct dentry *root = sb->s_root, *dentry; |
4000 | int err = 0; |
4001 | + struct file *f = NULL; |
4002 | |
4003 | e = create_entry(buffer, count); |
4004 | |
4005 | if (IS_ERR(e)) |
4006 | return PTR_ERR(e); |
4007 | |
4008 | + if (e->flags & MISC_FMT_OPEN_FILE) { |
4009 | + f = open_exec(e->interpreter); |
4010 | + if (IS_ERR(f)) { |
4011 | + pr_notice("register: failed to install interpreter file %s\n", |
4012 | + e->interpreter); |
4013 | + kfree(e); |
4014 | + return PTR_ERR(f); |
4015 | + } |
4016 | + e->interp_file = f; |
4017 | + } |
4018 | + |
4019 | inode_lock(d_inode(root)); |
4020 | dentry = lookup_one_len(e->name, root, strlen(e->name)); |
4021 | err = PTR_ERR(dentry); |
4022 | @@ -725,21 +737,6 @@ static ssize_t bm_register_write(struct file *file, const char __user *buffer, |
4023 | goto out2; |
4024 | } |
4025 | |
4026 | - if (e->flags & MISC_FMT_OPEN_FILE) { |
4027 | - struct file *f; |
4028 | - |
4029 | - f = open_exec(e->interpreter); |
4030 | - if (IS_ERR(f)) { |
4031 | - err = PTR_ERR(f); |
4032 | - pr_notice("register: failed to install interpreter file %s\n", e->interpreter); |
4033 | - simple_release_fs(&bm_mnt, &entry_count); |
4034 | - iput(inode); |
4035 | - inode = NULL; |
4036 | - goto out2; |
4037 | - } |
4038 | - e->interp_file = f; |
4039 | - } |
4040 | - |
4041 | e->dentry = dget(dentry); |
4042 | inode->i_private = e; |
4043 | inode->i_fop = &bm_entry_operations; |
4044 | @@ -756,6 +753,8 @@ out: |
4045 | inode_unlock(d_inode(root)); |
4046 | |
4047 | if (err) { |
4048 | + if (f) |
4049 | + filp_close(f, NULL); |
4050 | kfree(e); |
4051 | return err; |
4052 | } |
4053 | diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c |
4054 | index 115f063497ffa..41b3c5fc958c7 100644 |
4055 | --- a/fs/cifs/cifsfs.c |
4056 | +++ b/fs/cifs/cifsfs.c |
4057 | @@ -278,7 +278,7 @@ cifs_statfs(struct dentry *dentry, struct kstatfs *buf) |
4058 | rc = server->ops->queryfs(xid, tcon, buf); |
4059 | |
4060 | free_xid(xid); |
4061 | - return 0; |
4062 | + return rc; |
4063 | } |
4064 | |
4065 | static long cifs_fallocate(struct file *file, int mode, loff_t off, loff_t len) |
4066 | diff --git a/fs/configfs/file.c b/fs/configfs/file.c |
4067 | index fb65b706cc0db..84b4d58fc65f7 100644 |
4068 | --- a/fs/configfs/file.c |
4069 | +++ b/fs/configfs/file.c |
4070 | @@ -378,7 +378,7 @@ static int __configfs_open_file(struct inode *inode, struct file *file, int type |
4071 | |
4072 | attr = to_attr(dentry); |
4073 | if (!attr) |
4074 | - goto out_put_item; |
4075 | + goto out_free_buffer; |
4076 | |
4077 | if (type & CONFIGFS_ITEM_BIN_ATTR) { |
4078 | buffer->bin_attr = to_bin_attr(dentry); |
4079 | @@ -391,7 +391,7 @@ static int __configfs_open_file(struct inode *inode, struct file *file, int type |
4080 | /* Grab the module reference for this attribute if we have one */ |
4081 | error = -ENODEV; |
4082 | if (!try_module_get(buffer->owner)) |
4083 | - goto out_put_item; |
4084 | + goto out_free_buffer; |
4085 | |
4086 | error = -EACCES; |
4087 | if (!buffer->item->ci_type) |
4088 | @@ -435,8 +435,6 @@ static int __configfs_open_file(struct inode *inode, struct file *file, int type |
4089 | |
4090 | out_put_module: |
4091 | module_put(buffer->owner); |
4092 | -out_put_item: |
4093 | - config_item_put(buffer->item); |
4094 | out_free_buffer: |
4095 | up_read(&frag->frag_sem); |
4096 | kfree(buffer); |
4097 | diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c |
4098 | index 188b17a3b19eb..e7c0790308fe0 100644 |
4099 | --- a/fs/nfs/dir.c |
4100 | +++ b/fs/nfs/dir.c |
4101 | @@ -1073,6 +1073,15 @@ out_force: |
4102 | goto out; |
4103 | } |
4104 | |
4105 | +static void nfs_mark_dir_for_revalidate(struct inode *inode) |
4106 | +{ |
4107 | + struct nfs_inode *nfsi = NFS_I(inode); |
4108 | + |
4109 | + spin_lock(&inode->i_lock); |
4110 | + nfsi->cache_validity |= NFS_INO_REVAL_PAGECACHE; |
4111 | + spin_unlock(&inode->i_lock); |
4112 | +} |
4113 | + |
4114 | /* |
4115 | * We judge how long we want to trust negative |
4116 | * dentries by looking at the parent inode mtime. |
4117 | @@ -1107,19 +1116,14 @@ nfs_lookup_revalidate_done(struct inode *dir, struct dentry *dentry, |
4118 | __func__, dentry); |
4119 | return 1; |
4120 | case 0: |
4121 | - nfs_mark_for_revalidate(dir); |
4122 | - if (inode && S_ISDIR(inode->i_mode)) { |
4123 | - /* Purge readdir caches. */ |
4124 | - nfs_zap_caches(inode); |
4125 | - /* |
4126 | - * We can't d_drop the root of a disconnected tree: |
4127 | - * its d_hash is on the s_anon list and d_drop() would hide |
4128 | - * it from shrink_dcache_for_unmount(), leading to busy |
4129 | - * inodes on unmount and further oopses. |
4130 | - */ |
4131 | - if (IS_ROOT(dentry)) |
4132 | - return 1; |
4133 | - } |
4134 | + /* |
4135 | + * We can't d_drop the root of a disconnected tree: |
4136 | + * its d_hash is on the s_anon list and d_drop() would hide |
4137 | + * it from shrink_dcache_for_unmount(), leading to busy |
4138 | + * inodes on unmount and further oopses. |
4139 | + */ |
4140 | + if (inode && IS_ROOT(dentry)) |
4141 | + return 1; |
4142 | dfprintk(LOOKUPCACHE, "NFS: %s(%pd2) is invalid\n", |
4143 | __func__, dentry); |
4144 | return 0; |
4145 | @@ -1188,6 +1192,13 @@ out: |
4146 | nfs_free_fattr(fattr); |
4147 | nfs_free_fhandle(fhandle); |
4148 | nfs4_label_free(label); |
4149 | + |
4150 | + /* |
4151 | + * If the lookup failed despite the dentry change attribute being |
4152 | + * a match, then we should revalidate the directory cache. |
4153 | + */ |
4154 | + if (!ret && nfs_verify_change_attribute(dir, dentry->d_time)) |
4155 | + nfs_mark_dir_for_revalidate(dir); |
4156 | return nfs_lookup_revalidate_done(dir, dentry, inode, ret); |
4157 | } |
4158 | |
4159 | @@ -1230,7 +1241,7 @@ nfs_do_lookup_revalidate(struct inode *dir, struct dentry *dentry, |
4160 | error = nfs_lookup_verify_inode(inode, flags); |
4161 | if (error) { |
4162 | if (error == -ESTALE) |
4163 | - nfs_zap_caches(dir); |
4164 | + nfs_mark_dir_for_revalidate(dir); |
4165 | goto out_bad; |
4166 | } |
4167 | nfs_advise_use_readdirplus(dir); |
4168 | @@ -1725,7 +1736,6 @@ out: |
4169 | dput(parent); |
4170 | return d; |
4171 | out_error: |
4172 | - nfs_mark_for_revalidate(dir); |
4173 | d = ERR_PTR(error); |
4174 | goto out; |
4175 | } |
4176 | diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c |
4177 | index 30e44b33040a4..b2119159dead2 100644 |
4178 | --- a/fs/nfs/nfs4proc.c |
4179 | +++ b/fs/nfs/nfs4proc.c |
4180 | @@ -5830,7 +5830,7 @@ static int _nfs4_get_security_label(struct inode *inode, void *buf, |
4181 | return ret; |
4182 | if (!(fattr.valid & NFS_ATTR_FATTR_V4_SECURITY_LABEL)) |
4183 | return -ENOENT; |
4184 | - return 0; |
4185 | + return label.len; |
4186 | } |
4187 | |
4188 | static int nfs4_get_security_label(struct inode *inode, void *buf, |
4189 | diff --git a/fs/pnode.h b/fs/pnode.h |
4190 | index 26f74e092bd98..988f1aa9b02ae 100644 |
4191 | --- a/fs/pnode.h |
4192 | +++ b/fs/pnode.h |
4193 | @@ -12,7 +12,7 @@ |
4194 | |
4195 | #define IS_MNT_SHARED(m) ((m)->mnt.mnt_flags & MNT_SHARED) |
4196 | #define IS_MNT_SLAVE(m) ((m)->mnt_master) |
4197 | -#define IS_MNT_NEW(m) (!(m)->mnt_ns) |
4198 | +#define IS_MNT_NEW(m) (!(m)->mnt_ns || is_anon_ns((m)->mnt_ns)) |
4199 | #define CLEAR_MNT_SHARED(m) ((m)->mnt.mnt_flags &= ~MNT_SHARED) |
4200 | #define IS_MNT_UNBINDABLE(m) ((m)->mnt.mnt_flags & MNT_UNBINDABLE) |
4201 | #define IS_MNT_MARKED(m) ((m)->mnt.mnt_flags & MNT_MARKED) |
4202 | diff --git a/fs/udf/inode.c b/fs/udf/inode.c |
4203 | index 97a192eb9949c..507f8f9103270 100644 |
4204 | --- a/fs/udf/inode.c |
4205 | +++ b/fs/udf/inode.c |
4206 | @@ -547,11 +547,14 @@ static int udf_do_extend_file(struct inode *inode, |
4207 | |
4208 | udf_write_aext(inode, last_pos, &last_ext->extLocation, |
4209 | last_ext->extLength, 1); |
4210 | + |
4211 | /* |
4212 | - * We've rewritten the last extent but there may be empty |
4213 | - * indirect extent after it - enter it. |
4214 | + * We've rewritten the last extent. If we are going to add |
4215 | + * more extents, we may need to enter possible following |
4216 | + * empty indirect extent. |
4217 | */ |
4218 | - udf_next_aext(inode, last_pos, &tmploc, &tmplen, 0); |
4219 | + if (new_block_bytes || prealloc_len) |
4220 | + udf_next_aext(inode, last_pos, &tmploc, &tmplen, 0); |
4221 | } |
4222 | |
4223 | /* Managed to do everything necessary? */ |
4224 | diff --git a/include/linux/can/skb.h b/include/linux/can/skb.h |
4225 | index 0783b0c6d9e2f..1ef071e5a55ef 100644 |
4226 | --- a/include/linux/can/skb.h |
4227 | +++ b/include/linux/can/skb.h |
4228 | @@ -49,8 +49,12 @@ static inline void can_skb_reserve(struct sk_buff *skb) |
4229 | |
4230 | static inline void can_skb_set_owner(struct sk_buff *skb, struct sock *sk) |
4231 | { |
4232 | - if (sk) { |
4233 | - sock_hold(sk); |
4234 | + /* If the socket has already been closed by user space, the |
4235 | + * refcount may already be 0 (and the socket will be freed |
4236 | + * after the last TX skb has been freed). So only increase |
4237 | + * socket refcount if the refcount is > 0. |
4238 | + */ |
4239 | + if (sk && refcount_inc_not_zero(&sk->sk_refcnt)) { |
4240 | skb->destructor = sock_efree; |
4241 | skb->sk = sk; |
4242 | } |
4243 | diff --git a/include/linux/sched/mm.h b/include/linux/sched/mm.h |
4244 | index a132d875d3518..3a1d899019af0 100644 |
4245 | --- a/include/linux/sched/mm.h |
4246 | +++ b/include/linux/sched/mm.h |
4247 | @@ -167,7 +167,8 @@ static inline bool in_vfork(struct task_struct *tsk) |
4248 | * another oom-unkillable task does this it should blame itself. |
4249 | */ |
4250 | rcu_read_lock(); |
4251 | - ret = tsk->vfork_done && tsk->real_parent->mm == tsk->mm; |
4252 | + ret = tsk->vfork_done && |
4253 | + rcu_dereference(tsk->real_parent)->mm == tsk->mm; |
4254 | rcu_read_unlock(); |
4255 | |
4256 | return ret; |
4257 | diff --git a/include/linux/stop_machine.h b/include/linux/stop_machine.h |
4258 | index f9a0c6189852e..69998fc5ffe9d 100644 |
4259 | --- a/include/linux/stop_machine.h |
4260 | +++ b/include/linux/stop_machine.h |
4261 | @@ -139,7 +139,7 @@ int stop_machine_from_inactive_cpu(cpu_stop_fn_t fn, void *data, |
4262 | const struct cpumask *cpus); |
4263 | #else /* CONFIG_SMP || CONFIG_HOTPLUG_CPU */ |
4264 | |
4265 | -static inline int stop_machine_cpuslocked(cpu_stop_fn_t fn, void *data, |
4266 | +static __always_inline int stop_machine_cpuslocked(cpu_stop_fn_t fn, void *data, |
4267 | const struct cpumask *cpus) |
4268 | { |
4269 | unsigned long flags; |
4270 | @@ -150,14 +150,15 @@ static inline int stop_machine_cpuslocked(cpu_stop_fn_t fn, void *data, |
4271 | return ret; |
4272 | } |
4273 | |
4274 | -static inline int stop_machine(cpu_stop_fn_t fn, void *data, |
4275 | - const struct cpumask *cpus) |
4276 | +static __always_inline int |
4277 | +stop_machine(cpu_stop_fn_t fn, void *data, const struct cpumask *cpus) |
4278 | { |
4279 | return stop_machine_cpuslocked(fn, data, cpus); |
4280 | } |
4281 | |
4282 | -static inline int stop_machine_from_inactive_cpu(cpu_stop_fn_t fn, void *data, |
4283 | - const struct cpumask *cpus) |
4284 | +static __always_inline int |
4285 | +stop_machine_from_inactive_cpu(cpu_stop_fn_t fn, void *data, |
4286 | + const struct cpumask *cpus) |
4287 | { |
4288 | return stop_machine(fn, data, cpus); |
4289 | } |
4290 | diff --git a/include/linux/virtio_net.h b/include/linux/virtio_net.h |
4291 | index e8a924eeea3d0..6b5fcfa1e5553 100644 |
4292 | --- a/include/linux/virtio_net.h |
4293 | +++ b/include/linux/virtio_net.h |
4294 | @@ -79,8 +79,13 @@ static inline int virtio_net_hdr_to_skb(struct sk_buff *skb, |
4295 | if (gso_type && skb->network_header) { |
4296 | struct flow_keys_basic keys; |
4297 | |
4298 | - if (!skb->protocol) |
4299 | + if (!skb->protocol) { |
4300 | + __be16 protocol = dev_parse_header_protocol(skb); |
4301 | + |
4302 | virtio_net_hdr_set_proto(skb, hdr); |
4303 | + if (protocol && protocol != skb->protocol) |
4304 | + return -EINVAL; |
4305 | + } |
4306 | retry: |
4307 | if (!skb_flow_dissect_flow_keys_basic(NULL, skb, &keys, |
4308 | NULL, 0, 0, 0, |
4309 | diff --git a/include/media/rc-map.h b/include/media/rc-map.h |
4310 | index c2ef3906e1cd1..a358c87a65de2 100644 |
4311 | --- a/include/media/rc-map.h |
4312 | +++ b/include/media/rc-map.h |
4313 | @@ -126,6 +126,13 @@ struct rc_map_list { |
4314 | struct rc_map map; |
4315 | }; |
4316 | |
4317 | +#ifdef CONFIG_MEDIA_CEC_RC |
4318 | +/* |
4319 | + * rc_map_list from rc-cec.c |
4320 | + */ |
4321 | +extern struct rc_map_list cec_map; |
4322 | +#endif |
4323 | + |
4324 | /* Routines from rc-map.c */ |
4325 | |
4326 | /** |
4327 | diff --git a/include/target/target_core_backend.h b/include/target/target_core_backend.h |
4328 | index 51b6f50eabeeb..0deeff9b4496a 100644 |
4329 | --- a/include/target/target_core_backend.h |
4330 | +++ b/include/target/target_core_backend.h |
4331 | @@ -69,6 +69,7 @@ int transport_backend_register(const struct target_backend_ops *); |
4332 | void target_backend_unregister(const struct target_backend_ops *); |
4333 | |
4334 | void target_complete_cmd(struct se_cmd *, u8); |
4335 | +void target_set_cmd_data_length(struct se_cmd *, int); |
4336 | void target_complete_cmd_with_length(struct se_cmd *, u8, int); |
4337 | |
4338 | void transport_copy_sense_to_cmd(struct se_cmd *, unsigned char *); |
4339 | diff --git a/include/uapi/linux/netfilter/nfnetlink_cthelper.h b/include/uapi/linux/netfilter/nfnetlink_cthelper.h |
4340 | index a13137afc4299..70af02092d16e 100644 |
4341 | --- a/include/uapi/linux/netfilter/nfnetlink_cthelper.h |
4342 | +++ b/include/uapi/linux/netfilter/nfnetlink_cthelper.h |
4343 | @@ -5,7 +5,7 @@ |
4344 | #define NFCT_HELPER_STATUS_DISABLED 0 |
4345 | #define NFCT_HELPER_STATUS_ENABLED 1 |
4346 | |
4347 | -enum nfnl_acct_msg_types { |
4348 | +enum nfnl_cthelper_msg_types { |
4349 | NFNL_MSG_CTHELPER_NEW, |
4350 | NFNL_MSG_CTHELPER_GET, |
4351 | NFNL_MSG_CTHELPER_DEL, |
4352 | diff --git a/kernel/sched/membarrier.c b/kernel/sched/membarrier.c |
4353 | index be0ca3306be8c..46c142b695988 100644 |
4354 | --- a/kernel/sched/membarrier.c |
4355 | +++ b/kernel/sched/membarrier.c |
4356 | @@ -265,9 +265,7 @@ static int sync_runqueues_membarrier_state(struct mm_struct *mm) |
4357 | } |
4358 | rcu_read_unlock(); |
4359 | |
4360 | - preempt_disable(); |
4361 | - smp_call_function_many(tmpmask, ipi_sync_rq_state, mm, 1); |
4362 | - preempt_enable(); |
4363 | + on_each_cpu_mask(tmpmask, ipi_sync_rq_state, mm, true); |
4364 | |
4365 | free_cpumask_var(tmpmask); |
4366 | cpus_read_unlock(); |
4367 | diff --git a/kernel/sysctl.c b/kernel/sysctl.c |
4368 | index 70665934d53e2..eae6a078619f9 100644 |
4369 | --- a/kernel/sysctl.c |
4370 | +++ b/kernel/sysctl.c |
4371 | @@ -1563,7 +1563,7 @@ static struct ctl_table vm_table[] = { |
4372 | .data = &block_dump, |
4373 | .maxlen = sizeof(block_dump), |
4374 | .mode = 0644, |
4375 | - .proc_handler = proc_dointvec, |
4376 | + .proc_handler = proc_dointvec_minmax, |
4377 | .extra1 = SYSCTL_ZERO, |
4378 | }, |
4379 | { |
4380 | @@ -1571,7 +1571,7 @@ static struct ctl_table vm_table[] = { |
4381 | .data = &sysctl_vfs_cache_pressure, |
4382 | .maxlen = sizeof(sysctl_vfs_cache_pressure), |
4383 | .mode = 0644, |
4384 | - .proc_handler = proc_dointvec, |
4385 | + .proc_handler = proc_dointvec_minmax, |
4386 | .extra1 = SYSCTL_ZERO, |
4387 | }, |
4388 | #if defined(HAVE_ARCH_PICK_MMAP_LAYOUT) || \ |
4389 | @@ -1581,7 +1581,7 @@ static struct ctl_table vm_table[] = { |
4390 | .data = &sysctl_legacy_va_layout, |
4391 | .maxlen = sizeof(sysctl_legacy_va_layout), |
4392 | .mode = 0644, |
4393 | - .proc_handler = proc_dointvec, |
4394 | + .proc_handler = proc_dointvec_minmax, |
4395 | .extra1 = SYSCTL_ZERO, |
4396 | }, |
4397 | #endif |
4398 | @@ -1591,7 +1591,7 @@ static struct ctl_table vm_table[] = { |
4399 | .data = &node_reclaim_mode, |
4400 | .maxlen = sizeof(node_reclaim_mode), |
4401 | .mode = 0644, |
4402 | - .proc_handler = proc_dointvec, |
4403 | + .proc_handler = proc_dointvec_minmax, |
4404 | .extra1 = SYSCTL_ZERO, |
4405 | }, |
4406 | { |
4407 | diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c |
4408 | index 7f31932216a12..299a4c5b6cf8d 100644 |
4409 | --- a/kernel/time/hrtimer.c |
4410 | +++ b/kernel/time/hrtimer.c |
4411 | @@ -547,8 +547,11 @@ static ktime_t __hrtimer_next_event_base(struct hrtimer_cpu_base *cpu_base, |
4412 | } |
4413 | |
4414 | /* |
4415 | - * Recomputes cpu_base::*next_timer and returns the earliest expires_next but |
4416 | - * does not set cpu_base::*expires_next, that is done by hrtimer_reprogram. |
4417 | + * Recomputes cpu_base::*next_timer and returns the earliest expires_next |
4418 | + * but does not set cpu_base::*expires_next, that is done by |
4419 | + * hrtimer[_force]_reprogram and hrtimer_interrupt only. When updating |
4420 | + * cpu_base::*expires_next right away, reprogramming logic would no longer |
4421 | + * work. |
4422 | * |
4423 | * When a softirq is pending, we can ignore the HRTIMER_ACTIVE_SOFT bases, |
4424 | * those timers will get run whenever the softirq gets handled, at the end of |
4425 | @@ -589,6 +592,37 @@ __hrtimer_get_next_event(struct hrtimer_cpu_base *cpu_base, unsigned int active_ |
4426 | return expires_next; |
4427 | } |
4428 | |
4429 | +static ktime_t hrtimer_update_next_event(struct hrtimer_cpu_base *cpu_base) |
4430 | +{ |
4431 | + ktime_t expires_next, soft = KTIME_MAX; |
4432 | + |
4433 | + /* |
4434 | + * If the soft interrupt has already been activated, ignore the |
4435 | + * soft bases. They will be handled in the already raised soft |
4436 | + * interrupt. |
4437 | + */ |
4438 | + if (!cpu_base->softirq_activated) { |
4439 | + soft = __hrtimer_get_next_event(cpu_base, HRTIMER_ACTIVE_SOFT); |
4440 | + /* |
4441 | + * Update the soft expiry time. clock_settime() might have |
4442 | + * affected it. |
4443 | + */ |
4444 | + cpu_base->softirq_expires_next = soft; |
4445 | + } |
4446 | + |
4447 | + expires_next = __hrtimer_get_next_event(cpu_base, HRTIMER_ACTIVE_HARD); |
4448 | + /* |
4449 | + * If a softirq timer is expiring first, update cpu_base->next_timer |
4450 | + * and program the hardware with the soft expiry time. |
4451 | + */ |
4452 | + if (expires_next > soft) { |
4453 | + cpu_base->next_timer = cpu_base->softirq_next_timer; |
4454 | + expires_next = soft; |
4455 | + } |
4456 | + |
4457 | + return expires_next; |
4458 | +} |
4459 | + |
4460 | static inline ktime_t hrtimer_update_base(struct hrtimer_cpu_base *base) |
4461 | { |
4462 | ktime_t *offs_real = &base->clock_base[HRTIMER_BASE_REALTIME].offset; |
4463 | @@ -629,23 +663,7 @@ hrtimer_force_reprogram(struct hrtimer_cpu_base *cpu_base, int skip_equal) |
4464 | { |
4465 | ktime_t expires_next; |
4466 | |
4467 | - /* |
4468 | - * Find the current next expiration time. |
4469 | - */ |
4470 | - expires_next = __hrtimer_get_next_event(cpu_base, HRTIMER_ACTIVE_ALL); |
4471 | - |
4472 | - if (cpu_base->next_timer && cpu_base->next_timer->is_soft) { |
4473 | - /* |
4474 | - * When the softirq is activated, hrtimer has to be |
4475 | - * programmed with the first hard hrtimer because soft |
4476 | - * timer interrupt could occur too late. |
4477 | - */ |
4478 | - if (cpu_base->softirq_activated) |
4479 | - expires_next = __hrtimer_get_next_event(cpu_base, |
4480 | - HRTIMER_ACTIVE_HARD); |
4481 | - else |
4482 | - cpu_base->softirq_expires_next = expires_next; |
4483 | - } |
4484 | + expires_next = hrtimer_update_next_event(cpu_base); |
4485 | |
4486 | if (skip_equal && expires_next == cpu_base->expires_next) |
4487 | return; |
4488 | @@ -1640,8 +1658,8 @@ retry: |
4489 | |
4490 | __hrtimer_run_queues(cpu_base, now, flags, HRTIMER_ACTIVE_HARD); |
4491 | |
4492 | - /* Reevaluate the clock bases for the next expiry */ |
4493 | - expires_next = __hrtimer_get_next_event(cpu_base, HRTIMER_ACTIVE_ALL); |
4494 | + /* Reevaluate the clock bases for the [soft] next expiry */ |
4495 | + expires_next = hrtimer_update_next_event(cpu_base); |
4496 | /* |
4497 | * Store the new expiry value so the migration code can verify |
4498 | * against it. |
4499 | diff --git a/lib/logic_pio.c b/lib/logic_pio.c |
4500 | index 905027574e5d8..774bb02fff10a 100644 |
4501 | --- a/lib/logic_pio.c |
4502 | +++ b/lib/logic_pio.c |
4503 | @@ -27,6 +27,8 @@ static DEFINE_MUTEX(io_range_mutex); |
4504 | * @new_range: pointer to the IO range to be registered. |
4505 | * |
4506 | * Returns 0 on success, the error code in case of failure. |
4507 | + * If the range already exists, -EEXIST will be returned, which should be |
4508 | + * considered a success. |
4509 | * |
4510 | * Register a new IO range node in the IO range list. |
4511 | */ |
4512 | @@ -49,6 +51,7 @@ int logic_pio_register_range(struct logic_pio_hwaddr *new_range) |
4513 | list_for_each_entry(range, &io_range_list, list) { |
4514 | if (range->fwnode == new_range->fwnode) { |
4515 | /* range already there */ |
4516 | + ret = -EEXIST; |
4517 | goto end_register; |
4518 | } |
4519 | if (range->flags == LOGIC_PIO_CPU_MMIO && |
4520 | diff --git a/mm/slub.c b/mm/slub.c |
4521 | index e622e8f4c2ac4..52ded855b4ed0 100644 |
4522 | --- a/mm/slub.c |
4523 | +++ b/mm/slub.c |
4524 | @@ -1887,7 +1887,7 @@ static void *get_partial_node(struct kmem_cache *s, struct kmem_cache_node *n, |
4525 | |
4526 | t = acquire_slab(s, n, page, object == NULL, &objects); |
4527 | if (!t) |
4528 | - continue; /* cmpxchg raced */ |
4529 | + break; |
4530 | |
4531 | available += objects; |
4532 | if (!object) { |
4533 | diff --git a/net/ipv4/cipso_ipv4.c b/net/ipv4/cipso_ipv4.c |
4534 | index a23094b050f8b..e290a0c9e9282 100644 |
4535 | --- a/net/ipv4/cipso_ipv4.c |
4536 | +++ b/net/ipv4/cipso_ipv4.c |
4537 | @@ -519,16 +519,10 @@ int cipso_v4_doi_remove(u32 doi, struct netlbl_audit *audit_info) |
4538 | ret_val = -ENOENT; |
4539 | goto doi_remove_return; |
4540 | } |
4541 | - if (!refcount_dec_and_test(&doi_def->refcount)) { |
4542 | - spin_unlock(&cipso_v4_doi_list_lock); |
4543 | - ret_val = -EBUSY; |
4544 | - goto doi_remove_return; |
4545 | - } |
4546 | list_del_rcu(&doi_def->list); |
4547 | spin_unlock(&cipso_v4_doi_list_lock); |
4548 | |
4549 | - cipso_v4_cache_invalidate(); |
4550 | - call_rcu(&doi_def->rcu, cipso_v4_doi_free_rcu); |
4551 | + cipso_v4_doi_putdef(doi_def); |
4552 | ret_val = 0; |
4553 | |
4554 | doi_remove_return: |
4555 | @@ -585,9 +579,6 @@ void cipso_v4_doi_putdef(struct cipso_v4_doi *doi_def) |
4556 | |
4557 | if (!refcount_dec_and_test(&doi_def->refcount)) |
4558 | return; |
4559 | - spin_lock(&cipso_v4_doi_list_lock); |
4560 | - list_del_rcu(&doi_def->list); |
4561 | - spin_unlock(&cipso_v4_doi_list_lock); |
4562 | |
4563 | cipso_v4_cache_invalidate(); |
4564 | call_rcu(&doi_def->rcu, cipso_v4_doi_free_rcu); |
4565 | diff --git a/net/ipv4/nexthop.c b/net/ipv4/nexthop.c |
4566 | index c2b7d43d92b0e..f5f4369c131c9 100644 |
4567 | --- a/net/ipv4/nexthop.c |
4568 | +++ b/net/ipv4/nexthop.c |
4569 | @@ -1065,7 +1065,7 @@ out: |
4570 | |
4571 | /* rtnl */ |
4572 | /* remove all nexthops tied to a device being deleted */ |
4573 | -static void nexthop_flush_dev(struct net_device *dev) |
4574 | +static void nexthop_flush_dev(struct net_device *dev, unsigned long event) |
4575 | { |
4576 | unsigned int hash = nh_dev_hashfn(dev->ifindex); |
4577 | struct net *net = dev_net(dev); |
4578 | @@ -1077,6 +1077,10 @@ static void nexthop_flush_dev(struct net_device *dev) |
4579 | if (nhi->fib_nhc.nhc_dev != dev) |
4580 | continue; |
4581 | |
4582 | + if (nhi->reject_nh && |
4583 | + (event == NETDEV_DOWN || event == NETDEV_CHANGE)) |
4584 | + continue; |
4585 | + |
4586 | remove_nexthop(net, nhi->nh_parent, NULL); |
4587 | } |
4588 | } |
4589 | @@ -1794,11 +1798,11 @@ static int nh_netdev_event(struct notifier_block *this, |
4590 | switch (event) { |
4591 | case NETDEV_DOWN: |
4592 | case NETDEV_UNREGISTER: |
4593 | - nexthop_flush_dev(dev); |
4594 | + nexthop_flush_dev(dev, event); |
4595 | break; |
4596 | case NETDEV_CHANGE: |
4597 | if (!(dev_get_flags(dev) & (IFF_RUNNING | IFF_LOWER_UP))) |
4598 | - nexthop_flush_dev(dev); |
4599 | + nexthop_flush_dev(dev, event); |
4600 | break; |
4601 | case NETDEV_CHANGEMTU: |
4602 | info_ext = ptr; |
4603 | diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c |
4604 | index 6ddec8a23942b..5c8d0fb498256 100644 |
4605 | --- a/net/ipv4/tcp.c |
4606 | +++ b/net/ipv4/tcp.c |
4607 | @@ -2957,16 +2957,23 @@ static int do_tcp_setsockopt(struct sock *sk, int level, |
4608 | break; |
4609 | |
4610 | case TCP_QUEUE_SEQ: |
4611 | - if (sk->sk_state != TCP_CLOSE) |
4612 | + if (sk->sk_state != TCP_CLOSE) { |
4613 | err = -EPERM; |
4614 | - else if (tp->repair_queue == TCP_SEND_QUEUE) |
4615 | - WRITE_ONCE(tp->write_seq, val); |
4616 | - else if (tp->repair_queue == TCP_RECV_QUEUE) { |
4617 | - WRITE_ONCE(tp->rcv_nxt, val); |
4618 | - WRITE_ONCE(tp->copied_seq, val); |
4619 | - } |
4620 | - else |
4621 | + } else if (tp->repair_queue == TCP_SEND_QUEUE) { |
4622 | + if (!tcp_rtx_queue_empty(sk)) |
4623 | + err = -EPERM; |
4624 | + else |
4625 | + WRITE_ONCE(tp->write_seq, val); |
4626 | + } else if (tp->repair_queue == TCP_RECV_QUEUE) { |
4627 | + if (tp->rcv_nxt != tp->copied_seq) { |
4628 | + err = -EPERM; |
4629 | + } else { |
4630 | + WRITE_ONCE(tp->rcv_nxt, val); |
4631 | + WRITE_ONCE(tp->copied_seq, val); |
4632 | + } |
4633 | + } else { |
4634 | err = -EINVAL; |
4635 | + } |
4636 | break; |
4637 | |
4638 | case TCP_REPAIR_OPTIONS: |
4639 | diff --git a/net/ipv4/udp_offload.c b/net/ipv4/udp_offload.c |
4640 | index d7c64e953e9a5..c463eebdc8fe2 100644 |
4641 | --- a/net/ipv4/udp_offload.c |
4642 | +++ b/net/ipv4/udp_offload.c |
4643 | @@ -426,7 +426,7 @@ struct sk_buff *udp_gro_receive(struct list_head *head, struct sk_buff *skb, |
4644 | } |
4645 | |
4646 | if (NAPI_GRO_CB(skb)->encap_mark || |
4647 | - (skb->ip_summed != CHECKSUM_PARTIAL && |
4648 | + (uh->check && skb->ip_summed != CHECKSUM_PARTIAL && |
4649 | NAPI_GRO_CB(skb)->csum_cnt == 0 && |
4650 | !NAPI_GRO_CB(skb)->csum_valid) || |
4651 | !udp_sk(sk)->gro_receive) |
4652 | diff --git a/net/ipv6/calipso.c b/net/ipv6/calipso.c |
4653 | index 8d3f66c310dbd..7426e33686d13 100644 |
4654 | --- a/net/ipv6/calipso.c |
4655 | +++ b/net/ipv6/calipso.c |
4656 | @@ -83,6 +83,9 @@ struct calipso_map_cache_entry { |
4657 | |
4658 | static struct calipso_map_cache_bkt *calipso_cache; |
4659 | |
4660 | +static void calipso_cache_invalidate(void); |
4661 | +static void calipso_doi_putdef(struct calipso_doi *doi_def); |
4662 | + |
4663 | /* Label Mapping Cache Functions |
4664 | */ |
4665 | |
4666 | @@ -444,15 +447,10 @@ static int calipso_doi_remove(u32 doi, struct netlbl_audit *audit_info) |
4667 | ret_val = -ENOENT; |
4668 | goto doi_remove_return; |
4669 | } |
4670 | - if (!refcount_dec_and_test(&doi_def->refcount)) { |
4671 | - spin_unlock(&calipso_doi_list_lock); |
4672 | - ret_val = -EBUSY; |
4673 | - goto doi_remove_return; |
4674 | - } |
4675 | list_del_rcu(&doi_def->list); |
4676 | spin_unlock(&calipso_doi_list_lock); |
4677 | |
4678 | - call_rcu(&doi_def->rcu, calipso_doi_free_rcu); |
4679 | + calipso_doi_putdef(doi_def); |
4680 | ret_val = 0; |
4681 | |
4682 | doi_remove_return: |
4683 | @@ -508,10 +506,8 @@ static void calipso_doi_putdef(struct calipso_doi *doi_def) |
4684 | |
4685 | if (!refcount_dec_and_test(&doi_def->refcount)) |
4686 | return; |
4687 | - spin_lock(&calipso_doi_list_lock); |
4688 | - list_del_rcu(&doi_def->list); |
4689 | - spin_unlock(&calipso_doi_list_lock); |
4690 | |
4691 | + calipso_cache_invalidate(); |
4692 | call_rcu(&doi_def->rcu, calipso_doi_free_rcu); |
4693 | } |
4694 | |
4695 | diff --git a/net/mpls/mpls_gso.c b/net/mpls/mpls_gso.c |
4696 | index b1690149b6fa0..1482259de9b5d 100644 |
4697 | --- a/net/mpls/mpls_gso.c |
4698 | +++ b/net/mpls/mpls_gso.c |
4699 | @@ -14,6 +14,7 @@ |
4700 | #include <linux/netdev_features.h> |
4701 | #include <linux/netdevice.h> |
4702 | #include <linux/skbuff.h> |
4703 | +#include <net/mpls.h> |
4704 | |
4705 | static struct sk_buff *mpls_gso_segment(struct sk_buff *skb, |
4706 | netdev_features_t features) |
4707 | @@ -27,6 +28,8 @@ static struct sk_buff *mpls_gso_segment(struct sk_buff *skb, |
4708 | |
4709 | skb_reset_network_header(skb); |
4710 | mpls_hlen = skb_inner_network_header(skb) - skb_network_header(skb); |
4711 | + if (unlikely(!mpls_hlen || mpls_hlen % MPLS_HLEN)) |
4712 | + goto out; |
4713 | if (unlikely(!pskb_may_pull(skb, mpls_hlen))) |
4714 | goto out; |
4715 | |
4716 | diff --git a/net/netfilter/nf_nat_proto.c b/net/netfilter/nf_nat_proto.c |
4717 | index e87b6bd6b3cdb..4731d21fc3ad8 100644 |
4718 | --- a/net/netfilter/nf_nat_proto.c |
4719 | +++ b/net/netfilter/nf_nat_proto.c |
4720 | @@ -646,8 +646,8 @@ nf_nat_ipv4_fn(void *priv, struct sk_buff *skb, |
4721 | } |
4722 | |
4723 | static unsigned int |
4724 | -nf_nat_ipv4_in(void *priv, struct sk_buff *skb, |
4725 | - const struct nf_hook_state *state) |
4726 | +nf_nat_ipv4_pre_routing(void *priv, struct sk_buff *skb, |
4727 | + const struct nf_hook_state *state) |
4728 | { |
4729 | unsigned int ret; |
4730 | __be32 daddr = ip_hdr(skb)->daddr; |
4731 | @@ -659,6 +659,23 @@ nf_nat_ipv4_in(void *priv, struct sk_buff *skb, |
4732 | return ret; |
4733 | } |
4734 | |
4735 | +static unsigned int |
4736 | +nf_nat_ipv4_local_in(void *priv, struct sk_buff *skb, |
4737 | + const struct nf_hook_state *state) |
4738 | +{ |
4739 | + __be32 saddr = ip_hdr(skb)->saddr; |
4740 | + struct sock *sk = skb->sk; |
4741 | + unsigned int ret; |
4742 | + |
4743 | + ret = nf_nat_ipv4_fn(priv, skb, state); |
4744 | + |
4745 | + if (ret == NF_ACCEPT && sk && saddr != ip_hdr(skb)->saddr && |
4746 | + !inet_sk_transparent(sk)) |
4747 | + skb_orphan(skb); /* TCP edemux obtained wrong socket */ |
4748 | + |
4749 | + return ret; |
4750 | +} |
4751 | + |
4752 | static unsigned int |
4753 | nf_nat_ipv4_out(void *priv, struct sk_buff *skb, |
4754 | const struct nf_hook_state *state) |
4755 | @@ -736,7 +753,7 @@ nf_nat_ipv4_local_fn(void *priv, struct sk_buff *skb, |
4756 | static const struct nf_hook_ops nf_nat_ipv4_ops[] = { |
4757 | /* Before packet filtering, change destination */ |
4758 | { |
4759 | - .hook = nf_nat_ipv4_in, |
4760 | + .hook = nf_nat_ipv4_pre_routing, |
4761 | .pf = NFPROTO_IPV4, |
4762 | .hooknum = NF_INET_PRE_ROUTING, |
4763 | .priority = NF_IP_PRI_NAT_DST, |
4764 | @@ -757,7 +774,7 @@ static const struct nf_hook_ops nf_nat_ipv4_ops[] = { |
4765 | }, |
4766 | /* After packet filtering, change source */ |
4767 | { |
4768 | - .hook = nf_nat_ipv4_fn, |
4769 | + .hook = nf_nat_ipv4_local_in, |
4770 | .pf = NFPROTO_IPV4, |
4771 | .hooknum = NF_INET_LOCAL_IN, |
4772 | .priority = NF_IP_PRI_NAT_SRC, |
4773 | diff --git a/net/netfilter/x_tables.c b/net/netfilter/x_tables.c |
4774 | index d1ef2d7930739..8b60fc04c67c2 100644 |
4775 | --- a/net/netfilter/x_tables.c |
4776 | +++ b/net/netfilter/x_tables.c |
4777 | @@ -330,6 +330,7 @@ static int match_revfn(u8 af, const char *name, u8 revision, int *bestp) |
4778 | const struct xt_match *m; |
4779 | int have_rev = 0; |
4780 | |
4781 | + mutex_lock(&xt[af].mutex); |
4782 | list_for_each_entry(m, &xt[af].match, list) { |
4783 | if (strcmp(m->name, name) == 0) { |
4784 | if (m->revision > *bestp) |
4785 | @@ -338,6 +339,7 @@ static int match_revfn(u8 af, const char *name, u8 revision, int *bestp) |
4786 | have_rev = 1; |
4787 | } |
4788 | } |
4789 | + mutex_unlock(&xt[af].mutex); |
4790 | |
4791 | if (af != NFPROTO_UNSPEC && !have_rev) |
4792 | return match_revfn(NFPROTO_UNSPEC, name, revision, bestp); |
4793 | @@ -350,6 +352,7 @@ static int target_revfn(u8 af, const char *name, u8 revision, int *bestp) |
4794 | const struct xt_target *t; |
4795 | int have_rev = 0; |
4796 | |
4797 | + mutex_lock(&xt[af].mutex); |
4798 | list_for_each_entry(t, &xt[af].target, list) { |
4799 | if (strcmp(t->name, name) == 0) { |
4800 | if (t->revision > *bestp) |
4801 | @@ -358,6 +361,7 @@ static int target_revfn(u8 af, const char *name, u8 revision, int *bestp) |
4802 | have_rev = 1; |
4803 | } |
4804 | } |
4805 | + mutex_unlock(&xt[af].mutex); |
4806 | |
4807 | if (af != NFPROTO_UNSPEC && !have_rev) |
4808 | return target_revfn(NFPROTO_UNSPEC, name, revision, bestp); |
4809 | @@ -371,12 +375,10 @@ int xt_find_revision(u8 af, const char *name, u8 revision, int target, |
4810 | { |
4811 | int have_rev, best = -1; |
4812 | |
4813 | - mutex_lock(&xt[af].mutex); |
4814 | if (target == 1) |
4815 | have_rev = target_revfn(af, name, revision, &best); |
4816 | else |
4817 | have_rev = match_revfn(af, name, revision, &best); |
4818 | - mutex_unlock(&xt[af].mutex); |
4819 | |
4820 | /* Nothing at all? Return 0 to try loading module. */ |
4821 | if (best == -1) { |
4822 | diff --git a/net/netlabel/netlabel_cipso_v4.c b/net/netlabel/netlabel_cipso_v4.c |
4823 | index 0f16080b87cb9..4cb43a2c07d14 100644 |
4824 | --- a/net/netlabel/netlabel_cipso_v4.c |
4825 | +++ b/net/netlabel/netlabel_cipso_v4.c |
4826 | @@ -575,6 +575,7 @@ list_start: |
4827 | |
4828 | break; |
4829 | } |
4830 | + cipso_v4_doi_putdef(doi_def); |
4831 | rcu_read_unlock(); |
4832 | |
4833 | genlmsg_end(ans_skb, data); |
4834 | @@ -583,12 +584,14 @@ list_start: |
4835 | list_retry: |
4836 | /* XXX - this limit is a guesstimate */ |
4837 | if (nlsze_mult < 4) { |
4838 | + cipso_v4_doi_putdef(doi_def); |
4839 | rcu_read_unlock(); |
4840 | kfree_skb(ans_skb); |
4841 | nlsze_mult *= 2; |
4842 | goto list_start; |
4843 | } |
4844 | list_failure_lock: |
4845 | + cipso_v4_doi_putdef(doi_def); |
4846 | rcu_read_unlock(); |
4847 | list_failure: |
4848 | kfree_skb(ans_skb); |
4849 | diff --git a/net/qrtr/qrtr.c b/net/qrtr/qrtr.c |
4850 | index ef602976bb2c8..6e023e93d3186 100644 |
4851 | --- a/net/qrtr/qrtr.c |
4852 | +++ b/net/qrtr/qrtr.c |
4853 | @@ -791,8 +791,10 @@ static int qrtr_sendmsg(struct socket *sock, struct msghdr *msg, size_t len) |
4854 | plen = (len + 3) & ~3; |
4855 | skb = sock_alloc_send_skb(sk, plen + QRTR_HDR_MAX_SIZE, |
4856 | msg->msg_flags & MSG_DONTWAIT, &rc); |
4857 | - if (!skb) |
4858 | + if (!skb) { |
4859 | + rc = -ENOMEM; |
4860 | goto out_node; |
4861 | + } |
4862 | |
4863 | skb_reserve(skb, QRTR_HDR_MAX_SIZE); |
4864 | |
4865 | diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c |
4866 | index b65a405f607b2..3b1b5ee521379 100644 |
4867 | --- a/net/sched/sch_api.c |
4868 | +++ b/net/sched/sch_api.c |
4869 | @@ -2157,7 +2157,7 @@ static int tc_dump_tclass_qdisc(struct Qdisc *q, struct sk_buff *skb, |
4870 | |
4871 | static int tc_dump_tclass_root(struct Qdisc *root, struct sk_buff *skb, |
4872 | struct tcmsg *tcm, struct netlink_callback *cb, |
4873 | - int *t_p, int s_t) |
4874 | + int *t_p, int s_t, bool recur) |
4875 | { |
4876 | struct Qdisc *q; |
4877 | int b; |
4878 | @@ -2168,7 +2168,7 @@ static int tc_dump_tclass_root(struct Qdisc *root, struct sk_buff *skb, |
4879 | if (tc_dump_tclass_qdisc(root, skb, tcm, cb, t_p, s_t) < 0) |
4880 | return -1; |
4881 | |
4882 | - if (!qdisc_dev(root)) |
4883 | + if (!qdisc_dev(root) || !recur) |
4884 | return 0; |
4885 | |
4886 | if (tcm->tcm_parent) { |
4887 | @@ -2203,13 +2203,13 @@ static int tc_dump_tclass(struct sk_buff *skb, struct netlink_callback *cb) |
4888 | s_t = cb->args[0]; |
4889 | t = 0; |
4890 | |
4891 | - if (tc_dump_tclass_root(dev->qdisc, skb, tcm, cb, &t, s_t) < 0) |
4892 | + if (tc_dump_tclass_root(dev->qdisc, skb, tcm, cb, &t, s_t, true) < 0) |
4893 | goto done; |
4894 | |
4895 | dev_queue = dev_ingress_queue(dev); |
4896 | if (dev_queue && |
4897 | tc_dump_tclass_root(dev_queue->qdisc_sleeping, skb, tcm, cb, |
4898 | - &t, s_t) < 0) |
4899 | + &t, s_t, false) < 0) |
4900 | goto done; |
4901 | |
4902 | done: |
4903 | diff --git a/net/sunrpc/sched.c b/net/sunrpc/sched.c |
4904 | index 7afbf15bcbd9a..4beb6d2957c33 100644 |
4905 | --- a/net/sunrpc/sched.c |
4906 | +++ b/net/sunrpc/sched.c |
4907 | @@ -990,8 +990,11 @@ void rpc_execute(struct rpc_task *task) |
4908 | |
4909 | rpc_set_active(task); |
4910 | rpc_make_runnable(rpciod_workqueue, task); |
4911 | - if (!is_async) |
4912 | + if (!is_async) { |
4913 | + unsigned int pflags = memalloc_nofs_save(); |
4914 | __rpc_execute(task); |
4915 | + memalloc_nofs_restore(pflags); |
4916 | + } |
4917 | } |
4918 | |
4919 | static void rpc_async_schedule(struct work_struct *work) |
4920 | diff --git a/samples/bpf/xdpsock_user.c b/samples/bpf/xdpsock_user.c |
4921 | index 79d1005ff2ee3..3b604c1eb3c3b 100644 |
4922 | --- a/samples/bpf/xdpsock_user.c |
4923 | +++ b/samples/bpf/xdpsock_user.c |
4924 | @@ -783,5 +783,7 @@ int main(int argc, char **argv) |
4925 | else |
4926 | l2fwd_all(); |
4927 | |
4928 | + munmap(bufs, NUM_FRAMES * opt_xsk_frame_size); |
4929 | + |
4930 | return 0; |
4931 | } |
4932 | diff --git a/security/commoncap.c b/security/commoncap.c |
4933 | index ed89a6dd4f83d..28a6939bcc4e5 100644 |
4934 | --- a/security/commoncap.c |
4935 | +++ b/security/commoncap.c |
4936 | @@ -500,8 +500,7 @@ int cap_convert_nscap(struct dentry *dentry, void **ivalue, size_t size) |
4937 | __u32 magic, nsmagic; |
4938 | struct inode *inode = d_backing_inode(dentry); |
4939 | struct user_namespace *task_ns = current_user_ns(), |
4940 | - *fs_ns = inode->i_sb->s_user_ns, |
4941 | - *ancestor; |
4942 | + *fs_ns = inode->i_sb->s_user_ns; |
4943 | kuid_t rootid; |
4944 | size_t newsize; |
4945 | |
4946 | @@ -524,15 +523,6 @@ int cap_convert_nscap(struct dentry *dentry, void **ivalue, size_t size) |
4947 | if (nsrootid == -1) |
4948 | return -EINVAL; |
4949 | |
4950 | - /* |
4951 | - * Do not allow allow adding a v3 filesystem capability xattr |
4952 | - * if the rootid field is ambiguous. |
4953 | - */ |
4954 | - for (ancestor = task_ns->parent; ancestor; ancestor = ancestor->parent) { |
4955 | - if (from_kuid(ancestor, rootid) == 0) |
4956 | - return -EINVAL; |
4957 | - } |
4958 | - |
4959 | newsize = sizeof(struct vfs_ns_cap_data); |
4960 | nscap = kmalloc(newsize, GFP_ATOMIC); |
4961 | if (!nscap) |
4962 | diff --git a/sound/pci/hda/hda_bind.c b/sound/pci/hda/hda_bind.c |
4963 | index 6a85645663759..17a25e453f60c 100644 |
4964 | --- a/sound/pci/hda/hda_bind.c |
4965 | +++ b/sound/pci/hda/hda_bind.c |
4966 | @@ -47,6 +47,10 @@ static void hda_codec_unsol_event(struct hdac_device *dev, unsigned int ev) |
4967 | if (codec->bus->shutdown) |
4968 | return; |
4969 | |
4970 | + /* ignore unsol events during system suspend/resume */ |
4971 | + if (codec->core.dev.power.power_state.event != PM_EVENT_ON) |
4972 | + return; |
4973 | + |
4974 | if (codec->patch_ops.unsol_event) |
4975 | codec->patch_ops.unsol_event(codec, ev); |
4976 | } |
4977 | diff --git a/sound/pci/hda/hda_controller.c b/sound/pci/hda/hda_controller.c |
4978 | index 5e6081750bd9b..6a159c6c2f546 100644 |
4979 | --- a/sound/pci/hda/hda_controller.c |
4980 | +++ b/sound/pci/hda/hda_controller.c |
4981 | @@ -613,13 +613,6 @@ static int azx_pcm_open(struct snd_pcm_substream *substream) |
4982 | 20, |
4983 | 178000000); |
4984 | |
4985 | - /* by some reason, the playback stream stalls on PulseAudio with |
4986 | - * tsched=1 when a capture stream triggers. Until we figure out the |
4987 | - * real cause, disable tsched mode by telling the PCM info flag. |
4988 | - */ |
4989 | - if (chip->driver_caps & AZX_DCAPS_AMD_WORKAROUND) |
4990 | - runtime->hw.info |= SNDRV_PCM_INFO_BATCH; |
4991 | - |
4992 | if (chip->align_buffer_size) |
4993 | /* constrain buffer sizes to be multiple of 128 |
4994 | bytes. This is more efficient in terms of memory |
4995 | diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c |
4996 | index 7f9f6bbca5489..febd16c9efd7a 100644 |
4997 | --- a/sound/pci/hda/hda_intel.c |
4998 | +++ b/sound/pci/hda/hda_intel.c |
4999 | @@ -1025,6 +1025,8 @@ static int azx_prepare(struct device *dev) |
5000 | chip = card->private_data; |
5001 | chip->pm_prepared = 1; |
5002 | |
5003 | + flush_work(&azx_bus(chip)->unsol_work); |
5004 | + |
5005 | /* HDA controller always requires different WAKEEN for runtime suspend |
5006 | * and system suspend, so don't use direct-complete here. |
5007 | */ |
5008 | diff --git a/sound/pci/hda/patch_ca0132.c b/sound/pci/hda/patch_ca0132.c |
5009 | index d7b2aae6d4289..9412bdda85c82 100644 |
5010 | --- a/sound/pci/hda/patch_ca0132.c |
5011 | +++ b/sound/pci/hda/patch_ca0132.c |
5012 | @@ -1185,6 +1185,7 @@ static const struct snd_pci_quirk ca0132_quirks[] = { |
5013 | SND_PCI_QUIRK(0x1102, 0x0013, "Recon3D", QUIRK_R3D), |
5014 | SND_PCI_QUIRK(0x1102, 0x0018, "Recon3D", QUIRK_R3D), |
5015 | SND_PCI_QUIRK(0x1102, 0x0051, "Sound Blaster AE-5", QUIRK_AE5), |
5016 | + SND_PCI_QUIRK(0x1102, 0x0191, "Sound Blaster AE-5 Plus", QUIRK_AE5), |
5017 | SND_PCI_QUIRK(0x1102, 0x0081, "Sound Blaster AE-7", QUIRK_AE7), |
5018 | {} |
5019 | }; |
5020 | diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c |
5021 | index df4771b9eff24..ce38b5d4670da 100644 |
5022 | --- a/sound/pci/hda/patch_hdmi.c |
5023 | +++ b/sound/pci/hda/patch_hdmi.c |
5024 | @@ -2382,6 +2382,18 @@ static void generic_hdmi_free(struct hda_codec *codec) |
5025 | } |
5026 | |
5027 | #ifdef CONFIG_PM |
5028 | +static int generic_hdmi_suspend(struct hda_codec *codec) |
5029 | +{ |
5030 | + struct hdmi_spec *spec = codec->spec; |
5031 | + int pin_idx; |
5032 | + |
5033 | + for (pin_idx = 0; pin_idx < spec->num_pins; pin_idx++) { |
5034 | + struct hdmi_spec_per_pin *per_pin = get_pin(spec, pin_idx); |
5035 | + cancel_delayed_work_sync(&per_pin->work); |
5036 | + } |
5037 | + return 0; |
5038 | +} |
5039 | + |
5040 | static int generic_hdmi_resume(struct hda_codec *codec) |
5041 | { |
5042 | struct hdmi_spec *spec = codec->spec; |
5043 | @@ -2405,6 +2417,7 @@ static const struct hda_codec_ops generic_hdmi_patch_ops = { |
5044 | .build_controls = generic_hdmi_build_controls, |
5045 | .unsol_event = hdmi_unsol_event, |
5046 | #ifdef CONFIG_PM |
5047 | + .suspend = generic_hdmi_suspend, |
5048 | .resume = generic_hdmi_resume, |
5049 | #endif |
5050 | }; |
5051 | diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c |
5052 | index a7f31766d14df..9fb03c646a88f 100644 |
5053 | --- a/sound/usb/quirks.c |
5054 | +++ b/sound/usb/quirks.c |
5055 | @@ -1452,6 +1452,7 @@ bool snd_usb_get_sample_rate_quirk(struct snd_usb_audio *chip) |
5056 | case USB_ID(0x1901, 0x0191): /* GE B850V3 CP2114 audio interface */ |
5057 | case USB_ID(0x21B4, 0x0081): /* AudioQuest DragonFly */ |
5058 | case USB_ID(0x2912, 0x30c8): /* Audioengine D1 */ |
5059 | + case USB_ID(0x413c, 0xa506): /* Dell AE515 sound bar */ |
5060 | return true; |
5061 | } |
5062 | |
5063 | @@ -1604,6 +1605,14 @@ void snd_usb_ctl_msg_quirk(struct usb_device *dev, unsigned int pipe, |
5064 | && (requesttype & USB_TYPE_MASK) == USB_TYPE_CLASS) |
5065 | msleep(20); |
5066 | |
5067 | + /* |
5068 | + * Plantronics headsets (C320, C320-M, etc) need a delay to avoid |
5069 | + * random microhpone failures. |
5070 | + */ |
5071 | + if (USB_ID_VENDOR(chip->usb_id) == 0x047f && |
5072 | + (requesttype & USB_TYPE_MASK) == USB_TYPE_CLASS) |
5073 | + msleep(20); |
5074 | + |
5075 | /* Zoom R16/24, many Logitech(at least H650e/H570e/BCC950), |
5076 | * Jabra 550a, Kingston HyperX needs a tiny delay here, |
5077 | * otherwise requests like get/set frequency return |
5078 | diff --git a/tools/perf/util/trace-event-read.c b/tools/perf/util/trace-event-read.c |
5079 | index 8593d3c200c61..0116b0c06e976 100644 |
5080 | --- a/tools/perf/util/trace-event-read.c |
5081 | +++ b/tools/perf/util/trace-event-read.c |
5082 | @@ -361,6 +361,7 @@ static int read_saved_cmdline(struct tep_handle *pevent) |
5083 | pr_debug("error reading saved cmdlines\n"); |
5084 | goto out; |
5085 | } |
5086 | + buf[ret] = '\0'; |
5087 | |
5088 | parse_saved_cmdline(pevent, buf, size); |
5089 | ret = 0; |
5090 | diff --git a/tools/testing/selftests/bpf/progs/test_tunnel_kern.c b/tools/testing/selftests/bpf/progs/test_tunnel_kern.c |
5091 | index 0f98724120deb..b4e9a1d8c6cdb 100644 |
5092 | --- a/tools/testing/selftests/bpf/progs/test_tunnel_kern.c |
5093 | +++ b/tools/testing/selftests/bpf/progs/test_tunnel_kern.c |
5094 | @@ -446,10 +446,8 @@ int _geneve_get_tunnel(struct __sk_buff *skb) |
5095 | } |
5096 | |
5097 | ret = bpf_skb_get_tunnel_opt(skb, &gopt, sizeof(gopt)); |
5098 | - if (ret < 0) { |
5099 | - ERROR(ret); |
5100 | - return TC_ACT_SHOT; |
5101 | - } |
5102 | + if (ret < 0) |
5103 | + gopt.opt_class = 0; |
5104 | |
5105 | bpf_trace_printk(fmt, sizeof(fmt), |
5106 | key.tunnel_id, key.remote_ipv4, gopt.opt_class); |
5107 | diff --git a/tools/testing/selftests/bpf/verifier/array_access.c b/tools/testing/selftests/bpf/verifier/array_access.c |
5108 | index f3c33e128709b..bcc87906c4c19 100644 |
5109 | --- a/tools/testing/selftests/bpf/verifier/array_access.c |
5110 | +++ b/tools/testing/selftests/bpf/verifier/array_access.c |
5111 | @@ -250,12 +250,13 @@ |
5112 | BPF_MOV64_IMM(BPF_REG_5, 0), |
5113 | BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, |
5114 | BPF_FUNC_csum_diff), |
5115 | + BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 0xffff), |
5116 | BPF_EXIT_INSN(), |
5117 | }, |
5118 | .prog_type = BPF_PROG_TYPE_SCHED_CLS, |
5119 | .fixup_map_array_ro = { 3 }, |
5120 | .result = ACCEPT, |
5121 | - .retval = -29, |
5122 | + .retval = 65507, |
5123 | }, |
5124 | { |
5125 | "invalid write map access into a read-only array 1", |
5126 | diff --git a/tools/testing/selftests/net/forwarding/mirror_gre_bridge_1d_vlan.sh b/tools/testing/selftests/net/forwarding/mirror_gre_bridge_1d_vlan.sh |
5127 | index 197e769c2ed16..f8cda822c1cec 100755 |
5128 | --- a/tools/testing/selftests/net/forwarding/mirror_gre_bridge_1d_vlan.sh |
5129 | +++ b/tools/testing/selftests/net/forwarding/mirror_gre_bridge_1d_vlan.sh |
5130 | @@ -86,11 +86,20 @@ test_ip6gretap() |
5131 | |
5132 | test_gretap_stp() |
5133 | { |
5134 | + # Sometimes after mirror installation, the neighbor's state is not valid. |
5135 | + # The reason is that there is no SW datapath activity related to the |
5136 | + # neighbor for the remote GRE address. Therefore whether the corresponding |
5137 | + # neighbor will be valid is a matter of luck, and the test is thus racy. |
5138 | + # Set the neighbor's state to permanent, so it would be always valid. |
5139 | + ip neigh replace 192.0.2.130 lladdr $(mac_get $h3) \ |
5140 | + nud permanent dev br2 |
5141 | full_test_span_gre_stp gt4 $swp3.555 "mirror to gretap" |
5142 | } |
5143 | |
5144 | test_ip6gretap_stp() |
5145 | { |
5146 | + ip neigh replace 2001:db8:2::2 lladdr $(mac_get $h3) \ |
5147 | + nud permanent dev br2 |
5148 | full_test_span_gre_stp gt6 $swp3.555 "mirror to ip6gretap" |
5149 | } |
5150 | |
5151 | diff --git a/virt/kvm/arm/arm.c b/virt/kvm/arm/arm.c |
5152 | index 986fbc3cf667b..2e7d2b3f29079 100644 |
5153 | --- a/virt/kvm/arm/arm.c |
5154 | +++ b/virt/kvm/arm/arm.c |
5155 | @@ -373,11 +373,17 @@ void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu) |
5156 | cpu_data = this_cpu_ptr(&kvm_host_data); |
5157 | |
5158 | /* |
5159 | + * We guarantee that both TLBs and I-cache are private to each |
5160 | + * vcpu. If detecting that a vcpu from the same VM has |
5161 | + * previously run on the same physical CPU, call into the |
5162 | + * hypervisor code to nuke the relevant contexts. |
5163 | + * |
5164 | + * We might get preempted before the vCPU actually runs, but |
5165 | * We might get preempted before the vCPU actually runs, but |
5166 | * over-invalidation doesn't affect correctness. |
5167 | */ |
5168 | if (*last_ran != vcpu->vcpu_id) { |
5169 | - kvm_call_hyp(__kvm_tlb_flush_local_vmid, vcpu); |
5170 | + kvm_call_hyp(__kvm_flush_cpu_context, vcpu); |
5171 | *last_ran = vcpu->vcpu_id; |
5172 | } |
5173 | |
5174 | diff --git a/virt/kvm/arm/mmu.c b/virt/kvm/arm/mmu.c |
5175 | index 03a586ab6d27b..c6ba672f07ccf 100644 |
5176 | --- a/virt/kvm/arm/mmu.c |
5177 | +++ b/virt/kvm/arm/mmu.c |
5178 | @@ -2307,8 +2307,7 @@ int kvm_arch_prepare_memory_region(struct kvm *kvm, |
5179 | * Prevent userspace from creating a memory region outside of the IPA |
5180 | * space addressable by the KVM guest IPA space. |
5181 | */ |
5182 | - if (memslot->base_gfn + memslot->npages >= |
5183 | - (kvm_phys_size(kvm) >> PAGE_SHIFT)) |
5184 | + if ((memslot->base_gfn + memslot->npages) > (kvm_phys_size(kvm) >> PAGE_SHIFT)) |
5185 | return -EFAULT; |
5186 | |
5187 | down_read(¤t->mm->mmap_sem); |