Contents of /trunk/kernel-magellan/patches-4.17/0109-4.17.10-all-fixes.patch
Parent Directory | Revision Log
Revision 3160 -
(show annotations)
(download)
Tue Jul 31 06:32:25 2018 UTC (6 years, 1 month ago) by niro
File size: 87619 byte(s)
Tue Jul 31 06:32:25 2018 UTC (6 years, 1 month ago) by niro
File size: 87619 byte(s)
-linux-4.16.10
1 | diff --git a/Makefile b/Makefile |
2 | index 693fde3aa317..0ab689c38e82 100644 |
3 | --- a/Makefile |
4 | +++ b/Makefile |
5 | @@ -1,7 +1,7 @@ |
6 | # SPDX-License-Identifier: GPL-2.0 |
7 | VERSION = 4 |
8 | PATCHLEVEL = 17 |
9 | -SUBLEVEL = 9 |
10 | +SUBLEVEL = 10 |
11 | EXTRAVERSION = |
12 | NAME = Merciless Moray |
13 | |
14 | diff --git a/arch/alpha/kernel/osf_sys.c b/arch/alpha/kernel/osf_sys.c |
15 | index 89faa6f4de47..6a92843c0699 100644 |
16 | --- a/arch/alpha/kernel/osf_sys.c |
17 | +++ b/arch/alpha/kernel/osf_sys.c |
18 | @@ -1183,13 +1183,10 @@ SYSCALL_DEFINE2(osf_getrusage, int, who, struct rusage32 __user *, ru) |
19 | SYSCALL_DEFINE4(osf_wait4, pid_t, pid, int __user *, ustatus, int, options, |
20 | struct rusage32 __user *, ur) |
21 | { |
22 | - unsigned int status = 0; |
23 | struct rusage r; |
24 | - long err = kernel_wait4(pid, &status, options, &r); |
25 | + long err = kernel_wait4(pid, ustatus, options, &r); |
26 | if (err <= 0) |
27 | return err; |
28 | - if (put_user(status, ustatus)) |
29 | - return -EFAULT; |
30 | if (!ur) |
31 | return err; |
32 | if (put_tv_to_tv32(&ur->ru_utime, &r.ru_utime)) |
33 | diff --git a/arch/arc/Kconfig b/arch/arc/Kconfig |
34 | index d76bf4a83740..bc0bcf01ec98 100644 |
35 | --- a/arch/arc/Kconfig |
36 | +++ b/arch/arc/Kconfig |
37 | @@ -408,7 +408,7 @@ config ARC_HAS_DIV_REM |
38 | |
39 | config ARC_HAS_ACCL_REGS |
40 | bool "Reg Pair ACCL:ACCH (FPU and/or MPY > 6)" |
41 | - default n |
42 | + default y |
43 | help |
44 | Depending on the configuration, CPU can contain accumulator reg-pair |
45 | (also referred to as r58:r59). These can also be used by gcc as GPR so |
46 | diff --git a/arch/arc/configs/axs101_defconfig b/arch/arc/configs/axs101_defconfig |
47 | index 09f85154c5a4..a635ea972304 100644 |
48 | --- a/arch/arc/configs/axs101_defconfig |
49 | +++ b/arch/arc/configs/axs101_defconfig |
50 | @@ -11,7 +11,6 @@ CONFIG_NAMESPACES=y |
51 | # CONFIG_UTS_NS is not set |
52 | # CONFIG_PID_NS is not set |
53 | CONFIG_BLK_DEV_INITRD=y |
54 | -CONFIG_INITRAMFS_SOURCE="../arc_initramfs/" |
55 | CONFIG_EMBEDDED=y |
56 | CONFIG_PERF_EVENTS=y |
57 | # CONFIG_VM_EVENT_COUNTERS is not set |
58 | diff --git a/arch/arc/configs/axs103_defconfig b/arch/arc/configs/axs103_defconfig |
59 | index 09fed3ef22b6..aa507e423075 100644 |
60 | --- a/arch/arc/configs/axs103_defconfig |
61 | +++ b/arch/arc/configs/axs103_defconfig |
62 | @@ -11,7 +11,6 @@ CONFIG_NAMESPACES=y |
63 | # CONFIG_UTS_NS is not set |
64 | # CONFIG_PID_NS is not set |
65 | CONFIG_BLK_DEV_INITRD=y |
66 | -CONFIG_INITRAMFS_SOURCE="../../arc_initramfs_hs/" |
67 | CONFIG_EMBEDDED=y |
68 | CONFIG_PERF_EVENTS=y |
69 | # CONFIG_VM_EVENT_COUNTERS is not set |
70 | diff --git a/arch/arc/configs/axs103_smp_defconfig b/arch/arc/configs/axs103_smp_defconfig |
71 | index ea2f6d817d1a..eba07f468654 100644 |
72 | --- a/arch/arc/configs/axs103_smp_defconfig |
73 | +++ b/arch/arc/configs/axs103_smp_defconfig |
74 | @@ -11,7 +11,6 @@ CONFIG_NAMESPACES=y |
75 | # CONFIG_UTS_NS is not set |
76 | # CONFIG_PID_NS is not set |
77 | CONFIG_BLK_DEV_INITRD=y |
78 | -CONFIG_INITRAMFS_SOURCE="../../arc_initramfs_hs/" |
79 | CONFIG_EMBEDDED=y |
80 | CONFIG_PERF_EVENTS=y |
81 | # CONFIG_VM_EVENT_COUNTERS is not set |
82 | diff --git a/arch/arc/configs/haps_hs_defconfig b/arch/arc/configs/haps_hs_defconfig |
83 | index ab231c040efe..098b19fbaa51 100644 |
84 | --- a/arch/arc/configs/haps_hs_defconfig |
85 | +++ b/arch/arc/configs/haps_hs_defconfig |
86 | @@ -11,7 +11,6 @@ CONFIG_NAMESPACES=y |
87 | # CONFIG_UTS_NS is not set |
88 | # CONFIG_PID_NS is not set |
89 | CONFIG_BLK_DEV_INITRD=y |
90 | -CONFIG_INITRAMFS_SOURCE="../../arc_initramfs_hs/" |
91 | CONFIG_EXPERT=y |
92 | CONFIG_PERF_EVENTS=y |
93 | # CONFIG_COMPAT_BRK is not set |
94 | diff --git a/arch/arc/configs/haps_hs_smp_defconfig b/arch/arc/configs/haps_hs_smp_defconfig |
95 | index cf449cbf440d..0104c404d897 100644 |
96 | --- a/arch/arc/configs/haps_hs_smp_defconfig |
97 | +++ b/arch/arc/configs/haps_hs_smp_defconfig |
98 | @@ -11,7 +11,6 @@ CONFIG_NAMESPACES=y |
99 | # CONFIG_UTS_NS is not set |
100 | # CONFIG_PID_NS is not set |
101 | CONFIG_BLK_DEV_INITRD=y |
102 | -CONFIG_INITRAMFS_SOURCE="../../arc_initramfs_hs/" |
103 | CONFIG_EMBEDDED=y |
104 | CONFIG_PERF_EVENTS=y |
105 | # CONFIG_VM_EVENT_COUNTERS is not set |
106 | diff --git a/arch/arc/configs/hsdk_defconfig b/arch/arc/configs/hsdk_defconfig |
107 | index 1b54c72f4296..6491be0ddbc9 100644 |
108 | --- a/arch/arc/configs/hsdk_defconfig |
109 | +++ b/arch/arc/configs/hsdk_defconfig |
110 | @@ -9,7 +9,6 @@ CONFIG_NAMESPACES=y |
111 | # CONFIG_UTS_NS is not set |
112 | # CONFIG_PID_NS is not set |
113 | CONFIG_BLK_DEV_INITRD=y |
114 | -CONFIG_INITRAMFS_SOURCE="../../arc_initramfs_hs/" |
115 | CONFIG_EMBEDDED=y |
116 | CONFIG_PERF_EVENTS=y |
117 | # CONFIG_VM_EVENT_COUNTERS is not set |
118 | diff --git a/arch/arc/configs/nsim_700_defconfig b/arch/arc/configs/nsim_700_defconfig |
119 | index 31c2c70b34a1..99e05cf63fca 100644 |
120 | --- a/arch/arc/configs/nsim_700_defconfig |
121 | +++ b/arch/arc/configs/nsim_700_defconfig |
122 | @@ -11,7 +11,6 @@ CONFIG_NAMESPACES=y |
123 | # CONFIG_UTS_NS is not set |
124 | # CONFIG_PID_NS is not set |
125 | CONFIG_BLK_DEV_INITRD=y |
126 | -CONFIG_INITRAMFS_SOURCE="../arc_initramfs/" |
127 | CONFIG_KALLSYMS_ALL=y |
128 | CONFIG_EMBEDDED=y |
129 | CONFIG_PERF_EVENTS=y |
130 | diff --git a/arch/arc/configs/nsim_hs_defconfig b/arch/arc/configs/nsim_hs_defconfig |
131 | index a578c721d50f..0dc4f9b737e7 100644 |
132 | --- a/arch/arc/configs/nsim_hs_defconfig |
133 | +++ b/arch/arc/configs/nsim_hs_defconfig |
134 | @@ -11,7 +11,6 @@ CONFIG_NAMESPACES=y |
135 | # CONFIG_UTS_NS is not set |
136 | # CONFIG_PID_NS is not set |
137 | CONFIG_BLK_DEV_INITRD=y |
138 | -CONFIG_INITRAMFS_SOURCE="../../arc_initramfs_hs/" |
139 | CONFIG_KALLSYMS_ALL=y |
140 | CONFIG_EMBEDDED=y |
141 | CONFIG_PERF_EVENTS=y |
142 | diff --git a/arch/arc/configs/nsim_hs_smp_defconfig b/arch/arc/configs/nsim_hs_smp_defconfig |
143 | index 37d7395f3272..be3c30a15e54 100644 |
144 | --- a/arch/arc/configs/nsim_hs_smp_defconfig |
145 | +++ b/arch/arc/configs/nsim_hs_smp_defconfig |
146 | @@ -9,7 +9,6 @@ CONFIG_NAMESPACES=y |
147 | # CONFIG_UTS_NS is not set |
148 | # CONFIG_PID_NS is not set |
149 | CONFIG_BLK_DEV_INITRD=y |
150 | -CONFIG_INITRAMFS_SOURCE="../arc_initramfs_hs/" |
151 | CONFIG_KALLSYMS_ALL=y |
152 | CONFIG_EMBEDDED=y |
153 | CONFIG_PERF_EVENTS=y |
154 | diff --git a/arch/arc/configs/nsimosci_defconfig b/arch/arc/configs/nsimosci_defconfig |
155 | index 1e1470e2a7f0..3a74b9b21772 100644 |
156 | --- a/arch/arc/configs/nsimosci_defconfig |
157 | +++ b/arch/arc/configs/nsimosci_defconfig |
158 | @@ -11,7 +11,6 @@ CONFIG_NAMESPACES=y |
159 | # CONFIG_UTS_NS is not set |
160 | # CONFIG_PID_NS is not set |
161 | CONFIG_BLK_DEV_INITRD=y |
162 | -CONFIG_INITRAMFS_SOURCE="../arc_initramfs/" |
163 | CONFIG_KALLSYMS_ALL=y |
164 | CONFIG_EMBEDDED=y |
165 | CONFIG_PERF_EVENTS=y |
166 | diff --git a/arch/arc/configs/nsimosci_hs_defconfig b/arch/arc/configs/nsimosci_hs_defconfig |
167 | index 084a6e42685b..ea2834b4dc1d 100644 |
168 | --- a/arch/arc/configs/nsimosci_hs_defconfig |
169 | +++ b/arch/arc/configs/nsimosci_hs_defconfig |
170 | @@ -11,7 +11,6 @@ CONFIG_NAMESPACES=y |
171 | # CONFIG_UTS_NS is not set |
172 | # CONFIG_PID_NS is not set |
173 | CONFIG_BLK_DEV_INITRD=y |
174 | -CONFIG_INITRAMFS_SOURCE="../arc_initramfs_hs/" |
175 | CONFIG_KALLSYMS_ALL=y |
176 | CONFIG_EMBEDDED=y |
177 | CONFIG_PERF_EVENTS=y |
178 | diff --git a/arch/arc/configs/nsimosci_hs_smp_defconfig b/arch/arc/configs/nsimosci_hs_smp_defconfig |
179 | index f36d47990415..80a5a1b4924b 100644 |
180 | --- a/arch/arc/configs/nsimosci_hs_smp_defconfig |
181 | +++ b/arch/arc/configs/nsimosci_hs_smp_defconfig |
182 | @@ -9,7 +9,6 @@ CONFIG_IKCONFIG_PROC=y |
183 | # CONFIG_UTS_NS is not set |
184 | # CONFIG_PID_NS is not set |
185 | CONFIG_BLK_DEV_INITRD=y |
186 | -CONFIG_INITRAMFS_SOURCE="../arc_initramfs_hs/" |
187 | CONFIG_PERF_EVENTS=y |
188 | # CONFIG_COMPAT_BRK is not set |
189 | CONFIG_KPROBES=y |
190 | diff --git a/arch/arc/include/asm/page.h b/arch/arc/include/asm/page.h |
191 | index 109baa06831c..09ddddf71cc5 100644 |
192 | --- a/arch/arc/include/asm/page.h |
193 | +++ b/arch/arc/include/asm/page.h |
194 | @@ -105,7 +105,7 @@ typedef pte_t * pgtable_t; |
195 | #define virt_addr_valid(kaddr) pfn_valid(virt_to_pfn(kaddr)) |
196 | |
197 | /* Default Permissions for stack/heaps pages (Non Executable) */ |
198 | -#define VM_DATA_DEFAULT_FLAGS (VM_READ | VM_WRITE | VM_MAYREAD | VM_MAYWRITE) |
199 | +#define VM_DATA_DEFAULT_FLAGS (VM_READ | VM_WRITE | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC) |
200 | |
201 | #define WANT_PAGE_VIRTUAL 1 |
202 | |
203 | diff --git a/arch/arc/include/asm/pgtable.h b/arch/arc/include/asm/pgtable.h |
204 | index 08fe33830d4b..77676e18da69 100644 |
205 | --- a/arch/arc/include/asm/pgtable.h |
206 | +++ b/arch/arc/include/asm/pgtable.h |
207 | @@ -379,7 +379,7 @@ void update_mmu_cache(struct vm_area_struct *vma, unsigned long address, |
208 | |
209 | /* Decode a PTE containing swap "identifier "into constituents */ |
210 | #define __swp_type(pte_lookalike) (((pte_lookalike).val) & 0x1f) |
211 | -#define __swp_offset(pte_lookalike) ((pte_lookalike).val << 13) |
212 | +#define __swp_offset(pte_lookalike) ((pte_lookalike).val >> 13) |
213 | |
214 | /* NOPs, to keep generic kernel happy */ |
215 | #define __pte_to_swp_entry(pte) ((swp_entry_t) { pte_val(pte) }) |
216 | diff --git a/arch/arc/plat-hsdk/Kconfig b/arch/arc/plat-hsdk/Kconfig |
217 | index 19ab3cf98f0f..fcc9a9e27e9c 100644 |
218 | --- a/arch/arc/plat-hsdk/Kconfig |
219 | +++ b/arch/arc/plat-hsdk/Kconfig |
220 | @@ -7,5 +7,7 @@ |
221 | |
222 | menuconfig ARC_SOC_HSDK |
223 | bool "ARC HS Development Kit SOC" |
224 | + depends on ISA_ARCV2 |
225 | + select ARC_HAS_ACCL_REGS |
226 | select CLK_HSDK |
227 | select RESET_HSDK |
228 | diff --git a/arch/powerpc/kernel/idle_book3s.S b/arch/powerpc/kernel/idle_book3s.S |
229 | index e734f6e45abc..689306118b48 100644 |
230 | --- a/arch/powerpc/kernel/idle_book3s.S |
231 | +++ b/arch/powerpc/kernel/idle_book3s.S |
232 | @@ -144,7 +144,9 @@ power9_restore_additional_sprs: |
233 | mtspr SPRN_MMCR1, r4 |
234 | |
235 | ld r3, STOP_MMCR2(r13) |
236 | + ld r4, PACA_SPRG_VDSO(r13) |
237 | mtspr SPRN_MMCR2, r3 |
238 | + mtspr SPRN_SPRG3, r4 |
239 | blr |
240 | |
241 | /* |
242 | diff --git a/arch/x86/events/intel/ds.c b/arch/x86/events/intel/ds.c |
243 | index 8a10a045b57b..8cf03f101938 100644 |
244 | --- a/arch/x86/events/intel/ds.c |
245 | +++ b/arch/x86/events/intel/ds.c |
246 | @@ -408,9 +408,11 @@ static int alloc_bts_buffer(int cpu) |
247 | ds->bts_buffer_base = (unsigned long) cea; |
248 | ds_update_cea(cea, buffer, BTS_BUFFER_SIZE, PAGE_KERNEL); |
249 | ds->bts_index = ds->bts_buffer_base; |
250 | - max = BTS_RECORD_SIZE * (BTS_BUFFER_SIZE / BTS_RECORD_SIZE); |
251 | - ds->bts_absolute_maximum = ds->bts_buffer_base + max; |
252 | - ds->bts_interrupt_threshold = ds->bts_absolute_maximum - (max / 16); |
253 | + max = BTS_BUFFER_SIZE / BTS_RECORD_SIZE; |
254 | + ds->bts_absolute_maximum = ds->bts_buffer_base + |
255 | + max * BTS_RECORD_SIZE; |
256 | + ds->bts_interrupt_threshold = ds->bts_absolute_maximum - |
257 | + (max / 16) * BTS_RECORD_SIZE; |
258 | return 0; |
259 | } |
260 | |
261 | diff --git a/arch/x86/include/asm/apm.h b/arch/x86/include/asm/apm.h |
262 | index c356098b6fb9..4d4015ddcf26 100644 |
263 | --- a/arch/x86/include/asm/apm.h |
264 | +++ b/arch/x86/include/asm/apm.h |
265 | @@ -7,8 +7,6 @@ |
266 | #ifndef _ASM_X86_MACH_DEFAULT_APM_H |
267 | #define _ASM_X86_MACH_DEFAULT_APM_H |
268 | |
269 | -#include <asm/nospec-branch.h> |
270 | - |
271 | #ifdef APM_ZERO_SEGS |
272 | # define APM_DO_ZERO_SEGS \ |
273 | "pushl %%ds\n\t" \ |
274 | @@ -34,7 +32,6 @@ static inline void apm_bios_call_asm(u32 func, u32 ebx_in, u32 ecx_in, |
275 | * N.B. We do NOT need a cld after the BIOS call |
276 | * because we always save and restore the flags. |
277 | */ |
278 | - firmware_restrict_branch_speculation_start(); |
279 | __asm__ __volatile__(APM_DO_ZERO_SEGS |
280 | "pushl %%edi\n\t" |
281 | "pushl %%ebp\n\t" |
282 | @@ -47,7 +44,6 @@ static inline void apm_bios_call_asm(u32 func, u32 ebx_in, u32 ecx_in, |
283 | "=S" (*esi) |
284 | : "a" (func), "b" (ebx_in), "c" (ecx_in) |
285 | : "memory", "cc"); |
286 | - firmware_restrict_branch_speculation_end(); |
287 | } |
288 | |
289 | static inline bool apm_bios_call_simple_asm(u32 func, u32 ebx_in, |
290 | @@ -60,7 +56,6 @@ static inline bool apm_bios_call_simple_asm(u32 func, u32 ebx_in, |
291 | * N.B. We do NOT need a cld after the BIOS call |
292 | * because we always save and restore the flags. |
293 | */ |
294 | - firmware_restrict_branch_speculation_start(); |
295 | __asm__ __volatile__(APM_DO_ZERO_SEGS |
296 | "pushl %%edi\n\t" |
297 | "pushl %%ebp\n\t" |
298 | @@ -73,7 +68,6 @@ static inline bool apm_bios_call_simple_asm(u32 func, u32 ebx_in, |
299 | "=S" (si) |
300 | : "a" (func), "b" (ebx_in), "c" (ecx_in) |
301 | : "memory", "cc"); |
302 | - firmware_restrict_branch_speculation_end(); |
303 | return error; |
304 | } |
305 | |
306 | diff --git a/arch/x86/kernel/apm_32.c b/arch/x86/kernel/apm_32.c |
307 | index dfcbe6924eaf..3dd661dcc3f7 100644 |
308 | --- a/arch/x86/kernel/apm_32.c |
309 | +++ b/arch/x86/kernel/apm_32.c |
310 | @@ -240,6 +240,7 @@ |
311 | #include <asm/olpc.h> |
312 | #include <asm/paravirt.h> |
313 | #include <asm/reboot.h> |
314 | +#include <asm/nospec-branch.h> |
315 | |
316 | #if defined(CONFIG_APM_DISPLAY_BLANK) && defined(CONFIG_VT) |
317 | extern int (*console_blank_hook)(int); |
318 | @@ -614,11 +615,13 @@ static long __apm_bios_call(void *_call) |
319 | gdt[0x40 / 8] = bad_bios_desc; |
320 | |
321 | apm_irq_save(flags); |
322 | + firmware_restrict_branch_speculation_start(); |
323 | APM_DO_SAVE_SEGS; |
324 | apm_bios_call_asm(call->func, call->ebx, call->ecx, |
325 | &call->eax, &call->ebx, &call->ecx, &call->edx, |
326 | &call->esi); |
327 | APM_DO_RESTORE_SEGS; |
328 | + firmware_restrict_branch_speculation_end(); |
329 | apm_irq_restore(flags); |
330 | gdt[0x40 / 8] = save_desc_40; |
331 | put_cpu(); |
332 | @@ -690,10 +693,12 @@ static long __apm_bios_call_simple(void *_call) |
333 | gdt[0x40 / 8] = bad_bios_desc; |
334 | |
335 | apm_irq_save(flags); |
336 | + firmware_restrict_branch_speculation_start(); |
337 | APM_DO_SAVE_SEGS; |
338 | error = apm_bios_call_simple_asm(call->func, call->ebx, call->ecx, |
339 | &call->eax); |
340 | APM_DO_RESTORE_SEGS; |
341 | + firmware_restrict_branch_speculation_end(); |
342 | apm_irq_restore(flags); |
343 | gdt[0x40 / 8] = save_desc_40; |
344 | put_cpu(); |
345 | diff --git a/arch/x86/kernel/cpu/mcheck/mce.c b/arch/x86/kernel/cpu/mcheck/mce.c |
346 | index 6f7eda9d5297..79ae1423b619 100644 |
347 | --- a/arch/x86/kernel/cpu/mcheck/mce.c |
348 | +++ b/arch/x86/kernel/cpu/mcheck/mce.c |
349 | @@ -2147,9 +2147,6 @@ static ssize_t store_int_with_restart(struct device *s, |
350 | if (check_interval == old_check_interval) |
351 | return ret; |
352 | |
353 | - if (check_interval < 1) |
354 | - check_interval = 1; |
355 | - |
356 | mutex_lock(&mce_sysfs_mutex); |
357 | mce_restart(); |
358 | mutex_unlock(&mce_sysfs_mutex); |
359 | diff --git a/arch/x86/kernel/kvmclock.c b/arch/x86/kernel/kvmclock.c |
360 | index 8b26c9e01cc4..d79a18b4cf9d 100644 |
361 | --- a/arch/x86/kernel/kvmclock.c |
362 | +++ b/arch/x86/kernel/kvmclock.c |
363 | @@ -319,6 +319,8 @@ void __init kvmclock_init(void) |
364 | printk(KERN_INFO "kvm-clock: Using msrs %x and %x", |
365 | msr_kvm_system_time, msr_kvm_wall_clock); |
366 | |
367 | + pvclock_set_pvti_cpu0_va(hv_clock); |
368 | + |
369 | if (kvm_para_has_feature(KVM_FEATURE_CLOCKSOURCE_STABLE_BIT)) |
370 | pvclock_set_flags(PVCLOCK_TSC_STABLE_BIT); |
371 | |
372 | @@ -366,14 +368,11 @@ int __init kvm_setup_vsyscall_timeinfo(void) |
373 | vcpu_time = &hv_clock[cpu].pvti; |
374 | flags = pvclock_read_flags(vcpu_time); |
375 | |
376 | - if (!(flags & PVCLOCK_TSC_STABLE_BIT)) { |
377 | - put_cpu(); |
378 | - return 1; |
379 | - } |
380 | - |
381 | - pvclock_set_pvti_cpu0_va(hv_clock); |
382 | put_cpu(); |
383 | |
384 | + if (!(flags & PVCLOCK_TSC_STABLE_BIT)) |
385 | + return 1; |
386 | + |
387 | kvm_clock.archdata.vclock_mode = VCLOCK_PVCLOCK; |
388 | #endif |
389 | return 0; |
390 | diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c |
391 | index dd4366edc200..a3bbac8ef4d0 100644 |
392 | --- a/arch/x86/kvm/vmx.c |
393 | +++ b/arch/x86/kvm/vmx.c |
394 | @@ -2376,6 +2376,7 @@ static void vmx_save_host_state(struct kvm_vcpu *vcpu) |
395 | struct vcpu_vmx *vmx = to_vmx(vcpu); |
396 | #ifdef CONFIG_X86_64 |
397 | int cpu = raw_smp_processor_id(); |
398 | + unsigned long fs_base, kernel_gs_base; |
399 | #endif |
400 | int i; |
401 | |
402 | @@ -2391,12 +2392,20 @@ static void vmx_save_host_state(struct kvm_vcpu *vcpu) |
403 | vmx->host_state.gs_ldt_reload_needed = vmx->host_state.ldt_sel; |
404 | |
405 | #ifdef CONFIG_X86_64 |
406 | - save_fsgs_for_kvm(); |
407 | - vmx->host_state.fs_sel = current->thread.fsindex; |
408 | - vmx->host_state.gs_sel = current->thread.gsindex; |
409 | -#else |
410 | - savesegment(fs, vmx->host_state.fs_sel); |
411 | - savesegment(gs, vmx->host_state.gs_sel); |
412 | + if (likely(is_64bit_mm(current->mm))) { |
413 | + save_fsgs_for_kvm(); |
414 | + vmx->host_state.fs_sel = current->thread.fsindex; |
415 | + vmx->host_state.gs_sel = current->thread.gsindex; |
416 | + fs_base = current->thread.fsbase; |
417 | + kernel_gs_base = current->thread.gsbase; |
418 | + } else { |
419 | +#endif |
420 | + savesegment(fs, vmx->host_state.fs_sel); |
421 | + savesegment(gs, vmx->host_state.gs_sel); |
422 | +#ifdef CONFIG_X86_64 |
423 | + fs_base = read_msr(MSR_FS_BASE); |
424 | + kernel_gs_base = read_msr(MSR_KERNEL_GS_BASE); |
425 | + } |
426 | #endif |
427 | if (!(vmx->host_state.fs_sel & 7)) { |
428 | vmcs_write16(HOST_FS_SELECTOR, vmx->host_state.fs_sel); |
429 | @@ -2416,10 +2425,10 @@ static void vmx_save_host_state(struct kvm_vcpu *vcpu) |
430 | savesegment(ds, vmx->host_state.ds_sel); |
431 | savesegment(es, vmx->host_state.es_sel); |
432 | |
433 | - vmcs_writel(HOST_FS_BASE, current->thread.fsbase); |
434 | + vmcs_writel(HOST_FS_BASE, fs_base); |
435 | vmcs_writel(HOST_GS_BASE, cpu_kernelmode_gs_base(cpu)); |
436 | |
437 | - vmx->msr_host_kernel_gs_base = current->thread.gsbase; |
438 | + vmx->msr_host_kernel_gs_base = kernel_gs_base; |
439 | if (is_long_mode(&vmx->vcpu)) |
440 | wrmsrl(MSR_KERNEL_GS_BASE, vmx->msr_guest_kernel_gs_base); |
441 | #else |
442 | @@ -4110,11 +4119,7 @@ static __init int setup_vmcs_config(struct vmcs_config *vmcs_conf) |
443 | vmcs_conf->order = get_order(vmcs_conf->size); |
444 | vmcs_conf->basic_cap = vmx_msr_high & ~0x1fff; |
445 | |
446 | - /* KVM supports Enlightened VMCS v1 only */ |
447 | - if (static_branch_unlikely(&enable_evmcs)) |
448 | - vmcs_conf->revision_id = KVM_EVMCS_VERSION; |
449 | - else |
450 | - vmcs_conf->revision_id = vmx_msr_low; |
451 | + vmcs_conf->revision_id = vmx_msr_low; |
452 | |
453 | vmcs_conf->pin_based_exec_ctrl = _pin_based_exec_control; |
454 | vmcs_conf->cpu_based_exec_ctrl = _cpu_based_exec_control; |
455 | @@ -4184,7 +4189,13 @@ static struct vmcs *alloc_vmcs_cpu(int cpu) |
456 | return NULL; |
457 | vmcs = page_address(pages); |
458 | memset(vmcs, 0, vmcs_config.size); |
459 | - vmcs->revision_id = vmcs_config.revision_id; /* vmcs revision id */ |
460 | + |
461 | + /* KVM supports Enlightened VMCS v1 only */ |
462 | + if (static_branch_unlikely(&enable_evmcs)) |
463 | + vmcs->revision_id = KVM_EVMCS_VERSION; |
464 | + else |
465 | + vmcs->revision_id = vmcs_config.revision_id; |
466 | + |
467 | return vmcs; |
468 | } |
469 | |
470 | @@ -4343,6 +4354,19 @@ static __init int alloc_kvm_area(void) |
471 | return -ENOMEM; |
472 | } |
473 | |
474 | + /* |
475 | + * When eVMCS is enabled, alloc_vmcs_cpu() sets |
476 | + * vmcs->revision_id to KVM_EVMCS_VERSION instead of |
477 | + * revision_id reported by MSR_IA32_VMX_BASIC. |
478 | + * |
479 | + * However, even though not explictly documented by |
480 | + * TLFS, VMXArea passed as VMXON argument should |
481 | + * still be marked with revision_id reported by |
482 | + * physical CPU. |
483 | + */ |
484 | + if (static_branch_unlikely(&enable_evmcs)) |
485 | + vmcs->revision_id = vmcs_config.revision_id; |
486 | + |
487 | per_cpu(vmxarea, cpu) = vmcs; |
488 | } |
489 | return 0; |
490 | diff --git a/drivers/cpufreq/intel_pstate.c b/drivers/cpufreq/intel_pstate.c |
491 | index bd3f0a9d5e60..b357f81bfba6 100644 |
492 | --- a/drivers/cpufreq/intel_pstate.c |
493 | +++ b/drivers/cpufreq/intel_pstate.c |
494 | @@ -2179,6 +2179,18 @@ static bool __init intel_pstate_no_acpi_pss(void) |
495 | return true; |
496 | } |
497 | |
498 | +static bool __init intel_pstate_no_acpi_pcch(void) |
499 | +{ |
500 | + acpi_status status; |
501 | + acpi_handle handle; |
502 | + |
503 | + status = acpi_get_handle(NULL, "\\_SB", &handle); |
504 | + if (ACPI_FAILURE(status)) |
505 | + return true; |
506 | + |
507 | + return !acpi_has_method(handle, "PCCH"); |
508 | +} |
509 | + |
510 | static bool __init intel_pstate_has_acpi_ppc(void) |
511 | { |
512 | int i; |
513 | @@ -2238,7 +2250,10 @@ static bool __init intel_pstate_platform_pwr_mgmt_exists(void) |
514 | |
515 | switch (plat_info[idx].data) { |
516 | case PSS: |
517 | - return intel_pstate_no_acpi_pss(); |
518 | + if (!intel_pstate_no_acpi_pss()) |
519 | + return false; |
520 | + |
521 | + return intel_pstate_no_acpi_pcch(); |
522 | case PPC: |
523 | return intel_pstate_has_acpi_ppc() && !force_load; |
524 | } |
525 | diff --git a/drivers/cpufreq/pcc-cpufreq.c b/drivers/cpufreq/pcc-cpufreq.c |
526 | index 3f0ce2ae35ee..0c56c9759672 100644 |
527 | --- a/drivers/cpufreq/pcc-cpufreq.c |
528 | +++ b/drivers/cpufreq/pcc-cpufreq.c |
529 | @@ -580,6 +580,10 @@ static int __init pcc_cpufreq_init(void) |
530 | { |
531 | int ret; |
532 | |
533 | + /* Skip initialization if another cpufreq driver is there. */ |
534 | + if (cpufreq_get_current_driver()) |
535 | + return 0; |
536 | + |
537 | if (acpi_disabled) |
538 | return 0; |
539 | |
540 | diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c |
541 | index dc34b50e6b29..b11e9659e312 100644 |
542 | --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c |
543 | +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c |
544 | @@ -925,6 +925,10 @@ static int amdgpu_cs_ib_vm_chunk(struct amdgpu_device *adev, |
545 | r = amdgpu_bo_vm_update_pte(p); |
546 | if (r) |
547 | return r; |
548 | + |
549 | + r = reservation_object_reserve_shared(vm->root.base.bo->tbo.resv); |
550 | + if (r) |
551 | + return r; |
552 | } |
553 | |
554 | return amdgpu_cs_sync_rings(p); |
555 | diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c |
556 | index 4304d9e408b8..ace9ad578ca0 100644 |
557 | --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c |
558 | +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c |
559 | @@ -83,22 +83,21 @@ static ssize_t dm_dp_aux_transfer(struct drm_dp_aux *aux, |
560 | enum i2c_mot_mode mot = (msg->request & DP_AUX_I2C_MOT) ? |
561 | I2C_MOT_TRUE : I2C_MOT_FALSE; |
562 | enum ddc_result res; |
563 | - uint32_t read_bytes = msg->size; |
564 | + ssize_t read_bytes; |
565 | |
566 | if (WARN_ON(msg->size > 16)) |
567 | return -E2BIG; |
568 | |
569 | switch (msg->request & ~DP_AUX_I2C_MOT) { |
570 | case DP_AUX_NATIVE_READ: |
571 | - res = dal_ddc_service_read_dpcd_data( |
572 | + read_bytes = dal_ddc_service_read_dpcd_data( |
573 | TO_DM_AUX(aux)->ddc_service, |
574 | false, |
575 | I2C_MOT_UNDEF, |
576 | msg->address, |
577 | msg->buffer, |
578 | - msg->size, |
579 | - &read_bytes); |
580 | - break; |
581 | + msg->size); |
582 | + return read_bytes; |
583 | case DP_AUX_NATIVE_WRITE: |
584 | res = dal_ddc_service_write_dpcd_data( |
585 | TO_DM_AUX(aux)->ddc_service, |
586 | @@ -109,15 +108,14 @@ static ssize_t dm_dp_aux_transfer(struct drm_dp_aux *aux, |
587 | msg->size); |
588 | break; |
589 | case DP_AUX_I2C_READ: |
590 | - res = dal_ddc_service_read_dpcd_data( |
591 | + read_bytes = dal_ddc_service_read_dpcd_data( |
592 | TO_DM_AUX(aux)->ddc_service, |
593 | true, |
594 | mot, |
595 | msg->address, |
596 | msg->buffer, |
597 | - msg->size, |
598 | - &read_bytes); |
599 | - break; |
600 | + msg->size); |
601 | + return read_bytes; |
602 | case DP_AUX_I2C_WRITE: |
603 | res = dal_ddc_service_write_dpcd_data( |
604 | TO_DM_AUX(aux)->ddc_service, |
605 | @@ -139,9 +137,7 @@ static ssize_t dm_dp_aux_transfer(struct drm_dp_aux *aux, |
606 | r == DDC_RESULT_SUCESSFULL); |
607 | #endif |
608 | |
609 | - if (res != DDC_RESULT_SUCESSFULL) |
610 | - return -EIO; |
611 | - return read_bytes; |
612 | + return msg->size; |
613 | } |
614 | |
615 | static enum drm_connector_status |
616 | diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link_ddc.c b/drivers/gpu/drm/amd/display/dc/core/dc_link_ddc.c |
617 | index ae48d603ebd6..49c2face1e7a 100644 |
618 | --- a/drivers/gpu/drm/amd/display/dc/core/dc_link_ddc.c |
619 | +++ b/drivers/gpu/drm/amd/display/dc/core/dc_link_ddc.c |
620 | @@ -629,14 +629,13 @@ bool dal_ddc_service_query_ddc_data( |
621 | return ret; |
622 | } |
623 | |
624 | -enum ddc_result dal_ddc_service_read_dpcd_data( |
625 | +ssize_t dal_ddc_service_read_dpcd_data( |
626 | struct ddc_service *ddc, |
627 | bool i2c, |
628 | enum i2c_mot_mode mot, |
629 | uint32_t address, |
630 | uint8_t *data, |
631 | - uint32_t len, |
632 | - uint32_t *read) |
633 | + uint32_t len) |
634 | { |
635 | struct aux_payload read_payload = { |
636 | .i2c_over_aux = i2c, |
637 | @@ -653,8 +652,6 @@ enum ddc_result dal_ddc_service_read_dpcd_data( |
638 | .mot = mot |
639 | }; |
640 | |
641 | - *read = 0; |
642 | - |
643 | if (len > DEFAULT_AUX_MAX_DATA_SIZE) { |
644 | BREAK_TO_DEBUGGER(); |
645 | return DDC_RESULT_FAILED_INVALID_OPERATION; |
646 | @@ -664,8 +661,7 @@ enum ddc_result dal_ddc_service_read_dpcd_data( |
647 | ddc->ctx->i2caux, |
648 | ddc->ddc_pin, |
649 | &command)) { |
650 | - *read = command.payloads->length; |
651 | - return DDC_RESULT_SUCESSFULL; |
652 | + return (ssize_t)command.payloads->length; |
653 | } |
654 | |
655 | return DDC_RESULT_FAILED_OPERATION; |
656 | diff --git a/drivers/gpu/drm/amd/display/dc/inc/dc_link_ddc.h b/drivers/gpu/drm/amd/display/dc/inc/dc_link_ddc.h |
657 | index 30b3a08b91be..090b7a8dd67b 100644 |
658 | --- a/drivers/gpu/drm/amd/display/dc/inc/dc_link_ddc.h |
659 | +++ b/drivers/gpu/drm/amd/display/dc/inc/dc_link_ddc.h |
660 | @@ -102,14 +102,13 @@ bool dal_ddc_service_query_ddc_data( |
661 | uint8_t *read_buf, |
662 | uint32_t read_size); |
663 | |
664 | -enum ddc_result dal_ddc_service_read_dpcd_data( |
665 | +ssize_t dal_ddc_service_read_dpcd_data( |
666 | struct ddc_service *ddc, |
667 | bool i2c, |
668 | enum i2c_mot_mode mot, |
669 | uint32_t address, |
670 | uint8_t *data, |
671 | - uint32_t len, |
672 | - uint32_t *read); |
673 | + uint32_t len); |
674 | |
675 | enum ddc_result dal_ddc_service_write_dpcd_data( |
676 | struct ddc_service *ddc, |
677 | diff --git a/drivers/gpu/drm/drm_lease.c b/drivers/gpu/drm/drm_lease.c |
678 | index d345563fdff3..ce281d651ae8 100644 |
679 | --- a/drivers/gpu/drm/drm_lease.c |
680 | +++ b/drivers/gpu/drm/drm_lease.c |
681 | @@ -553,24 +553,13 @@ int drm_mode_create_lease_ioctl(struct drm_device *dev, |
682 | |
683 | /* Clone the lessor file to create a new file for us */ |
684 | DRM_DEBUG_LEASE("Allocating lease file\n"); |
685 | - path_get(&lessor_file->f_path); |
686 | - lessee_file = alloc_file(&lessor_file->f_path, |
687 | - lessor_file->f_mode, |
688 | - fops_get(lessor_file->f_inode->i_fop)); |
689 | - |
690 | + lessee_file = filp_clone_open(lessor_file); |
691 | if (IS_ERR(lessee_file)) { |
692 | ret = PTR_ERR(lessee_file); |
693 | goto out_lessee; |
694 | } |
695 | |
696 | - /* Initialize the new file for DRM */ |
697 | - DRM_DEBUG_LEASE("Initializing the file with %p\n", lessee_file->f_op->open); |
698 | - ret = lessee_file->f_op->open(lessee_file->f_inode, lessee_file); |
699 | - if (ret) |
700 | - goto out_lessee_file; |
701 | - |
702 | lessee_priv = lessee_file->private_data; |
703 | - |
704 | /* Change the file to a master one */ |
705 | drm_master_put(&lessee_priv->master); |
706 | lessee_priv->master = lessee; |
707 | @@ -588,9 +577,6 @@ int drm_mode_create_lease_ioctl(struct drm_device *dev, |
708 | DRM_DEBUG_LEASE("drm_mode_create_lease_ioctl succeeded\n"); |
709 | return 0; |
710 | |
711 | -out_lessee_file: |
712 | - fput(lessee_file); |
713 | - |
714 | out_lessee: |
715 | drm_master_put(&lessee); |
716 | |
717 | diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c |
718 | index b25cc5aa8fbe..d793b2bbd6c2 100644 |
719 | --- a/drivers/gpu/drm/i915/i915_irq.c |
720 | +++ b/drivers/gpu/drm/i915/i915_irq.c |
721 | @@ -1967,10 +1967,38 @@ static void valleyview_pipestat_irq_handler(struct drm_i915_private *dev_priv, |
722 | |
723 | static u32 i9xx_hpd_irq_ack(struct drm_i915_private *dev_priv) |
724 | { |
725 | - u32 hotplug_status = I915_READ(PORT_HOTPLUG_STAT); |
726 | + u32 hotplug_status = 0, hotplug_status_mask; |
727 | + int i; |
728 | + |
729 | + if (IS_G4X(dev_priv) || |
730 | + IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) |
731 | + hotplug_status_mask = HOTPLUG_INT_STATUS_G4X | |
732 | + DP_AUX_CHANNEL_MASK_INT_STATUS_G4X; |
733 | + else |
734 | + hotplug_status_mask = HOTPLUG_INT_STATUS_I915; |
735 | |
736 | - if (hotplug_status) |
737 | + /* |
738 | + * We absolutely have to clear all the pending interrupt |
739 | + * bits in PORT_HOTPLUG_STAT. Otherwise the ISR port |
740 | + * interrupt bit won't have an edge, and the i965/g4x |
741 | + * edge triggered IIR will not notice that an interrupt |
742 | + * is still pending. We can't use PORT_HOTPLUG_EN to |
743 | + * guarantee the edge as the act of toggling the enable |
744 | + * bits can itself generate a new hotplug interrupt :( |
745 | + */ |
746 | + for (i = 0; i < 10; i++) { |
747 | + u32 tmp = I915_READ(PORT_HOTPLUG_STAT) & hotplug_status_mask; |
748 | + |
749 | + if (tmp == 0) |
750 | + return hotplug_status; |
751 | + |
752 | + hotplug_status |= tmp; |
753 | I915_WRITE(PORT_HOTPLUG_STAT, hotplug_status); |
754 | + } |
755 | + |
756 | + WARN_ONCE(1, |
757 | + "PORT_HOTPLUG_STAT did not clear (0x%08x)\n", |
758 | + I915_READ(PORT_HOTPLUG_STAT)); |
759 | |
760 | return hotplug_status; |
761 | } |
762 | diff --git a/drivers/gpu/drm/nouveau/nouveau_backlight.c b/drivers/gpu/drm/nouveau/nouveau_backlight.c |
763 | index debbbf0fd4bd..408b955e5c39 100644 |
764 | --- a/drivers/gpu/drm/nouveau/nouveau_backlight.c |
765 | +++ b/drivers/gpu/drm/nouveau/nouveau_backlight.c |
766 | @@ -267,6 +267,7 @@ nouveau_backlight_init(struct drm_device *dev) |
767 | struct nouveau_drm *drm = nouveau_drm(dev); |
768 | struct nvif_device *device = &drm->client.device; |
769 | struct drm_connector *connector; |
770 | + struct drm_connector_list_iter conn_iter; |
771 | |
772 | INIT_LIST_HEAD(&drm->bl_connectors); |
773 | |
774 | @@ -275,7 +276,8 @@ nouveau_backlight_init(struct drm_device *dev) |
775 | return 0; |
776 | } |
777 | |
778 | - list_for_each_entry(connector, &dev->mode_config.connector_list, head) { |
779 | + drm_connector_list_iter_begin(dev, &conn_iter); |
780 | + drm_for_each_connector_iter(connector, &conn_iter) { |
781 | if (connector->connector_type != DRM_MODE_CONNECTOR_LVDS && |
782 | connector->connector_type != DRM_MODE_CONNECTOR_eDP) |
783 | continue; |
784 | @@ -292,7 +294,7 @@ nouveau_backlight_init(struct drm_device *dev) |
785 | break; |
786 | } |
787 | } |
788 | - |
789 | + drm_connector_list_iter_end(&conn_iter); |
790 | |
791 | return 0; |
792 | } |
793 | diff --git a/drivers/gpu/drm/nouveau/nouveau_connector.c b/drivers/gpu/drm/nouveau/nouveau_connector.c |
794 | index 6ed9cb053dfa..359fecce8cc0 100644 |
795 | --- a/drivers/gpu/drm/nouveau/nouveau_connector.c |
796 | +++ b/drivers/gpu/drm/nouveau/nouveau_connector.c |
797 | @@ -1208,14 +1208,19 @@ nouveau_connector_create(struct drm_device *dev, int index) |
798 | struct nouveau_display *disp = nouveau_display(dev); |
799 | struct nouveau_connector *nv_connector = NULL; |
800 | struct drm_connector *connector; |
801 | + struct drm_connector_list_iter conn_iter; |
802 | int type, ret = 0; |
803 | bool dummy; |
804 | |
805 | - list_for_each_entry(connector, &dev->mode_config.connector_list, head) { |
806 | + drm_connector_list_iter_begin(dev, &conn_iter); |
807 | + nouveau_for_each_non_mst_connector_iter(connector, &conn_iter) { |
808 | nv_connector = nouveau_connector(connector); |
809 | - if (nv_connector->index == index) |
810 | + if (nv_connector->index == index) { |
811 | + drm_connector_list_iter_end(&conn_iter); |
812 | return connector; |
813 | + } |
814 | } |
815 | + drm_connector_list_iter_end(&conn_iter); |
816 | |
817 | nv_connector = kzalloc(sizeof(*nv_connector), GFP_KERNEL); |
818 | if (!nv_connector) |
819 | diff --git a/drivers/gpu/drm/nouveau/nouveau_connector.h b/drivers/gpu/drm/nouveau/nouveau_connector.h |
820 | index a4d1a059bd3d..dc7454e7f19a 100644 |
821 | --- a/drivers/gpu/drm/nouveau/nouveau_connector.h |
822 | +++ b/drivers/gpu/drm/nouveau/nouveau_connector.h |
823 | @@ -33,6 +33,7 @@ |
824 | #include <drm/drm_encoder.h> |
825 | #include <drm/drm_dp_helper.h> |
826 | #include "nouveau_crtc.h" |
827 | +#include "nouveau_encoder.h" |
828 | |
829 | struct nvkm_i2c_port; |
830 | |
831 | @@ -60,19 +61,46 @@ static inline struct nouveau_connector *nouveau_connector( |
832 | return container_of(con, struct nouveau_connector, base); |
833 | } |
834 | |
835 | +static inline bool |
836 | +nouveau_connector_is_mst(struct drm_connector *connector) |
837 | +{ |
838 | + const struct nouveau_encoder *nv_encoder; |
839 | + const struct drm_encoder *encoder; |
840 | + |
841 | + if (connector->connector_type != DRM_MODE_CONNECTOR_DisplayPort) |
842 | + return false; |
843 | + |
844 | + nv_encoder = find_encoder(connector, DCB_OUTPUT_ANY); |
845 | + if (!nv_encoder) |
846 | + return false; |
847 | + |
848 | + encoder = &nv_encoder->base.base; |
849 | + return encoder->encoder_type == DRM_MODE_ENCODER_DPMST; |
850 | +} |
851 | + |
852 | +#define nouveau_for_each_non_mst_connector_iter(connector, iter) \ |
853 | + drm_for_each_connector_iter(connector, iter) \ |
854 | + for_each_if(!nouveau_connector_is_mst(connector)) |
855 | + |
856 | static inline struct nouveau_connector * |
857 | nouveau_crtc_connector_get(struct nouveau_crtc *nv_crtc) |
858 | { |
859 | struct drm_device *dev = nv_crtc->base.dev; |
860 | struct drm_connector *connector; |
861 | + struct drm_connector_list_iter conn_iter; |
862 | + struct nouveau_connector *nv_connector = NULL; |
863 | struct drm_crtc *crtc = to_drm_crtc(nv_crtc); |
864 | |
865 | - list_for_each_entry(connector, &dev->mode_config.connector_list, head) { |
866 | - if (connector->encoder && connector->encoder->crtc == crtc) |
867 | - return nouveau_connector(connector); |
868 | + drm_connector_list_iter_begin(dev, &conn_iter); |
869 | + nouveau_for_each_non_mst_connector_iter(connector, &conn_iter) { |
870 | + if (connector->encoder && connector->encoder->crtc == crtc) { |
871 | + nv_connector = nouveau_connector(connector); |
872 | + break; |
873 | + } |
874 | } |
875 | + drm_connector_list_iter_end(&conn_iter); |
876 | |
877 | - return NULL; |
878 | + return nv_connector; |
879 | } |
880 | |
881 | struct drm_connector * |
882 | diff --git a/drivers/gpu/drm/nouveau/nouveau_display.c b/drivers/gpu/drm/nouveau/nouveau_display.c |
883 | index 009713404cc4..4cba117e81fc 100644 |
884 | --- a/drivers/gpu/drm/nouveau/nouveau_display.c |
885 | +++ b/drivers/gpu/drm/nouveau/nouveau_display.c |
886 | @@ -406,6 +406,7 @@ nouveau_display_init(struct drm_device *dev) |
887 | struct nouveau_display *disp = nouveau_display(dev); |
888 | struct nouveau_drm *drm = nouveau_drm(dev); |
889 | struct drm_connector *connector; |
890 | + struct drm_connector_list_iter conn_iter; |
891 | int ret; |
892 | |
893 | ret = disp->init(dev); |
894 | @@ -413,10 +414,12 @@ nouveau_display_init(struct drm_device *dev) |
895 | return ret; |
896 | |
897 | /* enable hotplug interrupts */ |
898 | - list_for_each_entry(connector, &dev->mode_config.connector_list, head) { |
899 | + drm_connector_list_iter_begin(dev, &conn_iter); |
900 | + nouveau_for_each_non_mst_connector_iter(connector, &conn_iter) { |
901 | struct nouveau_connector *conn = nouveau_connector(connector); |
902 | nvif_notify_get(&conn->hpd); |
903 | } |
904 | + drm_connector_list_iter_end(&conn_iter); |
905 | |
906 | /* enable flip completion events */ |
907 | nvif_notify_get(&drm->flip); |
908 | @@ -429,6 +432,7 @@ nouveau_display_fini(struct drm_device *dev, bool suspend) |
909 | struct nouveau_display *disp = nouveau_display(dev); |
910 | struct nouveau_drm *drm = nouveau_drm(dev); |
911 | struct drm_connector *connector; |
912 | + struct drm_connector_list_iter conn_iter; |
913 | |
914 | if (!suspend) { |
915 | if (drm_drv_uses_atomic_modeset(dev)) |
916 | @@ -441,10 +445,12 @@ nouveau_display_fini(struct drm_device *dev, bool suspend) |
917 | nvif_notify_put(&drm->flip); |
918 | |
919 | /* disable hotplug interrupts */ |
920 | - list_for_each_entry(connector, &dev->mode_config.connector_list, head) { |
921 | + drm_connector_list_iter_begin(dev, &conn_iter); |
922 | + nouveau_for_each_non_mst_connector_iter(connector, &conn_iter) { |
923 | struct nouveau_connector *conn = nouveau_connector(connector); |
924 | nvif_notify_put(&conn->hpd); |
925 | } |
926 | + drm_connector_list_iter_end(&conn_iter); |
927 | |
928 | drm_kms_helper_poll_disable(dev); |
929 | disp->fini(dev); |
930 | diff --git a/drivers/gpu/drm/nouveau/nouveau_drm.c b/drivers/gpu/drm/nouveau/nouveau_drm.c |
931 | index bbbf353682e1..0bffeb95b072 100644 |
932 | --- a/drivers/gpu/drm/nouveau/nouveau_drm.c |
933 | +++ b/drivers/gpu/drm/nouveau/nouveau_drm.c |
934 | @@ -866,22 +866,11 @@ nouveau_pmops_runtime_resume(struct device *dev) |
935 | static int |
936 | nouveau_pmops_runtime_idle(struct device *dev) |
937 | { |
938 | - struct pci_dev *pdev = to_pci_dev(dev); |
939 | - struct drm_device *drm_dev = pci_get_drvdata(pdev); |
940 | - struct nouveau_drm *drm = nouveau_drm(drm_dev); |
941 | - struct drm_crtc *crtc; |
942 | - |
943 | if (!nouveau_pmops_runtime()) { |
944 | pm_runtime_forbid(dev); |
945 | return -EBUSY; |
946 | } |
947 | |
948 | - list_for_each_entry(crtc, &drm->dev->mode_config.crtc_list, head) { |
949 | - if (crtc->enabled) { |
950 | - DRM_DEBUG_DRIVER("failing to power off - crtc active\n"); |
951 | - return -EBUSY; |
952 | - } |
953 | - } |
954 | pm_runtime_mark_last_busy(dev); |
955 | pm_runtime_autosuspend(dev); |
956 | /* we don't want the main rpm_idle to call suspend - we want to autosuspend */ |
957 | diff --git a/drivers/misc/cxl/api.c b/drivers/misc/cxl/api.c |
958 | index 753b1a698fc4..6b16946f9b05 100644 |
959 | --- a/drivers/misc/cxl/api.c |
960 | +++ b/drivers/misc/cxl/api.c |
961 | @@ -103,15 +103,15 @@ static struct file *cxl_getfile(const char *name, |
962 | d_instantiate(path.dentry, inode); |
963 | |
964 | file = alloc_file(&path, OPEN_FMODE(flags), fops); |
965 | - if (IS_ERR(file)) |
966 | - goto err_dput; |
967 | + if (IS_ERR(file)) { |
968 | + path_put(&path); |
969 | + goto err_fs; |
970 | + } |
971 | file->f_flags = flags & (O_ACCMODE | O_NONBLOCK); |
972 | file->private_data = priv; |
973 | |
974 | return file; |
975 | |
976 | -err_dput: |
977 | - path_put(&path); |
978 | err_inode: |
979 | iput(inode); |
980 | err_fs: |
981 | diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_cfg.h b/drivers/net/ethernet/aquantia/atlantic/aq_cfg.h |
982 | index fc7383106946..91eb8910b1c9 100644 |
983 | --- a/drivers/net/ethernet/aquantia/atlantic/aq_cfg.h |
984 | +++ b/drivers/net/ethernet/aquantia/atlantic/aq_cfg.h |
985 | @@ -63,8 +63,6 @@ |
986 | |
987 | #define AQ_CFG_NAPI_WEIGHT 64U |
988 | |
989 | -#define AQ_CFG_MULTICAST_ADDRESS_MAX 32U |
990 | - |
991 | /*#define AQ_CFG_MAC_ADDR_PERMANENT {0x30, 0x0E, 0xE3, 0x12, 0x34, 0x56}*/ |
992 | |
993 | #define AQ_NIC_FC_OFF 0U |
994 | diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_hw.h b/drivers/net/ethernet/aquantia/atlantic/aq_hw.h |
995 | index a2d416b24ffc..2c6ebd91a9f2 100644 |
996 | --- a/drivers/net/ethernet/aquantia/atlantic/aq_hw.h |
997 | +++ b/drivers/net/ethernet/aquantia/atlantic/aq_hw.h |
998 | @@ -98,6 +98,8 @@ struct aq_stats_s { |
999 | #define AQ_HW_MEDIA_TYPE_TP 1U |
1000 | #define AQ_HW_MEDIA_TYPE_FIBRE 2U |
1001 | |
1002 | +#define AQ_HW_MULTICAST_ADDRESS_MAX 32U |
1003 | + |
1004 | struct aq_hw_s { |
1005 | atomic_t flags; |
1006 | u8 rbl_enabled:1; |
1007 | @@ -177,7 +179,7 @@ struct aq_hw_ops { |
1008 | unsigned int packet_filter); |
1009 | |
1010 | int (*hw_multicast_list_set)(struct aq_hw_s *self, |
1011 | - u8 ar_mac[AQ_CFG_MULTICAST_ADDRESS_MAX] |
1012 | + u8 ar_mac[AQ_HW_MULTICAST_ADDRESS_MAX] |
1013 | [ETH_ALEN], |
1014 | u32 count); |
1015 | |
1016 | diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_main.c b/drivers/net/ethernet/aquantia/atlantic/aq_main.c |
1017 | index ba5fe8c4125d..e3ae29e523f0 100644 |
1018 | --- a/drivers/net/ethernet/aquantia/atlantic/aq_main.c |
1019 | +++ b/drivers/net/ethernet/aquantia/atlantic/aq_main.c |
1020 | @@ -135,17 +135,10 @@ static int aq_ndev_set_mac_address(struct net_device *ndev, void *addr) |
1021 | static void aq_ndev_set_multicast_settings(struct net_device *ndev) |
1022 | { |
1023 | struct aq_nic_s *aq_nic = netdev_priv(ndev); |
1024 | - int err = 0; |
1025 | |
1026 | - err = aq_nic_set_packet_filter(aq_nic, ndev->flags); |
1027 | - if (err < 0) |
1028 | - return; |
1029 | + aq_nic_set_packet_filter(aq_nic, ndev->flags); |
1030 | |
1031 | - if (netdev_mc_count(ndev)) { |
1032 | - err = aq_nic_set_multicast_list(aq_nic, ndev); |
1033 | - if (err < 0) |
1034 | - return; |
1035 | - } |
1036 | + aq_nic_set_multicast_list(aq_nic, ndev); |
1037 | } |
1038 | |
1039 | static const struct net_device_ops aq_ndev_ops = { |
1040 | diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_nic.c b/drivers/net/ethernet/aquantia/atlantic/aq_nic.c |
1041 | index 1a1a6380c128..7a22d0257e04 100644 |
1042 | --- a/drivers/net/ethernet/aquantia/atlantic/aq_nic.c |
1043 | +++ b/drivers/net/ethernet/aquantia/atlantic/aq_nic.c |
1044 | @@ -563,34 +563,41 @@ int aq_nic_set_packet_filter(struct aq_nic_s *self, unsigned int flags) |
1045 | |
1046 | int aq_nic_set_multicast_list(struct aq_nic_s *self, struct net_device *ndev) |
1047 | { |
1048 | + unsigned int packet_filter = self->packet_filter; |
1049 | struct netdev_hw_addr *ha = NULL; |
1050 | unsigned int i = 0U; |
1051 | |
1052 | - self->mc_list.count = 0U; |
1053 | - |
1054 | - netdev_for_each_mc_addr(ha, ndev) { |
1055 | - ether_addr_copy(self->mc_list.ar[i++], ha->addr); |
1056 | - ++self->mc_list.count; |
1057 | + self->mc_list.count = 0; |
1058 | + if (netdev_uc_count(ndev) > AQ_HW_MULTICAST_ADDRESS_MAX) { |
1059 | + packet_filter |= IFF_PROMISC; |
1060 | + } else { |
1061 | + netdev_for_each_uc_addr(ha, ndev) { |
1062 | + ether_addr_copy(self->mc_list.ar[i++], ha->addr); |
1063 | |
1064 | - if (i >= AQ_CFG_MULTICAST_ADDRESS_MAX) |
1065 | - break; |
1066 | + if (i >= AQ_HW_MULTICAST_ADDRESS_MAX) |
1067 | + break; |
1068 | + } |
1069 | } |
1070 | |
1071 | - if (i >= AQ_CFG_MULTICAST_ADDRESS_MAX) { |
1072 | - /* Number of filters is too big: atlantic does not support this. |
1073 | - * Force all multi filter to support this. |
1074 | - * With this we disable all UC filters and setup "all pass" |
1075 | - * multicast mask |
1076 | - */ |
1077 | - self->packet_filter |= IFF_ALLMULTI; |
1078 | - self->aq_nic_cfg.mc_list_count = 0; |
1079 | - return self->aq_hw_ops->hw_packet_filter_set(self->aq_hw, |
1080 | - self->packet_filter); |
1081 | + if (i + netdev_mc_count(ndev) > AQ_HW_MULTICAST_ADDRESS_MAX) { |
1082 | + packet_filter |= IFF_ALLMULTI; |
1083 | } else { |
1084 | - return self->aq_hw_ops->hw_multicast_list_set(self->aq_hw, |
1085 | - self->mc_list.ar, |
1086 | - self->mc_list.count); |
1087 | + netdev_for_each_mc_addr(ha, ndev) { |
1088 | + ether_addr_copy(self->mc_list.ar[i++], ha->addr); |
1089 | + |
1090 | + if (i >= AQ_HW_MULTICAST_ADDRESS_MAX) |
1091 | + break; |
1092 | + } |
1093 | + } |
1094 | + |
1095 | + if (i > 0 && i < AQ_HW_MULTICAST_ADDRESS_MAX) { |
1096 | + packet_filter |= IFF_MULTICAST; |
1097 | + self->mc_list.count = i; |
1098 | + self->aq_hw_ops->hw_multicast_list_set(self->aq_hw, |
1099 | + self->mc_list.ar, |
1100 | + self->mc_list.count); |
1101 | } |
1102 | + return aq_nic_set_packet_filter(self, packet_filter); |
1103 | } |
1104 | |
1105 | int aq_nic_set_mtu(struct aq_nic_s *self, int new_mtu) |
1106 | diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_nic.h b/drivers/net/ethernet/aquantia/atlantic/aq_nic.h |
1107 | index faa533a0ec47..fecfc401f95d 100644 |
1108 | --- a/drivers/net/ethernet/aquantia/atlantic/aq_nic.h |
1109 | +++ b/drivers/net/ethernet/aquantia/atlantic/aq_nic.h |
1110 | @@ -75,7 +75,7 @@ struct aq_nic_s { |
1111 | struct aq_hw_link_status_s link_status; |
1112 | struct { |
1113 | u32 count; |
1114 | - u8 ar[AQ_CFG_MULTICAST_ADDRESS_MAX][ETH_ALEN]; |
1115 | + u8 ar[AQ_HW_MULTICAST_ADDRESS_MAX][ETH_ALEN]; |
1116 | } mc_list; |
1117 | |
1118 | struct pci_dev *pdev; |
1119 | diff --git a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_a0.c b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_a0.c |
1120 | index 67e2f9fb9402..8cc6abadc03b 100644 |
1121 | --- a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_a0.c |
1122 | +++ b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_a0.c |
1123 | @@ -765,7 +765,7 @@ static int hw_atl_a0_hw_packet_filter_set(struct aq_hw_s *self, |
1124 | |
1125 | static int hw_atl_a0_hw_multicast_list_set(struct aq_hw_s *self, |
1126 | u8 ar_mac |
1127 | - [AQ_CFG_MULTICAST_ADDRESS_MAX] |
1128 | + [AQ_HW_MULTICAST_ADDRESS_MAX] |
1129 | [ETH_ALEN], |
1130 | u32 count) |
1131 | { |
1132 | diff --git a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.c b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.c |
1133 | index 819f6bcf9b4e..956860a69797 100644 |
1134 | --- a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.c |
1135 | +++ b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.c |
1136 | @@ -784,7 +784,7 @@ static int hw_atl_b0_hw_packet_filter_set(struct aq_hw_s *self, |
1137 | |
1138 | static int hw_atl_b0_hw_multicast_list_set(struct aq_hw_s *self, |
1139 | u8 ar_mac |
1140 | - [AQ_CFG_MULTICAST_ADDRESS_MAX] |
1141 | + [AQ_HW_MULTICAST_ADDRESS_MAX] |
1142 | [ETH_ALEN], |
1143 | u32 count) |
1144 | { |
1145 | @@ -812,7 +812,7 @@ static int hw_atl_b0_hw_multicast_list_set(struct aq_hw_s *self, |
1146 | |
1147 | hw_atl_rpfl2_uc_flr_en_set(self, |
1148 | (self->aq_nic_cfg->is_mc_list_enabled), |
1149 | - HW_ATL_B0_MAC_MIN + i); |
1150 | + HW_ATL_B0_MAC_MIN + i); |
1151 | } |
1152 | |
1153 | err = aq_hw_err_from_flags(self); |
1154 | diff --git a/drivers/net/ethernet/broadcom/bcmsysport.c b/drivers/net/ethernet/broadcom/bcmsysport.c |
1155 | index f33b25fbca63..7db072fe5f22 100644 |
1156 | --- a/drivers/net/ethernet/broadcom/bcmsysport.c |
1157 | +++ b/drivers/net/ethernet/broadcom/bcmsysport.c |
1158 | @@ -1946,8 +1946,8 @@ static int bcm_sysport_open(struct net_device *dev) |
1159 | if (!priv->is_lite) |
1160 | priv->crc_fwd = !!(umac_readl(priv, UMAC_CMD) & CMD_CRC_FWD); |
1161 | else |
1162 | - priv->crc_fwd = !!(gib_readl(priv, GIB_CONTROL) & |
1163 | - GIB_FCS_STRIP); |
1164 | + priv->crc_fwd = !((gib_readl(priv, GIB_CONTROL) & |
1165 | + GIB_FCS_STRIP) >> GIB_FCS_STRIP_SHIFT); |
1166 | |
1167 | phydev = of_phy_connect(dev, priv->phy_dn, bcm_sysport_adj_link, |
1168 | 0, priv->phy_interface); |
1169 | diff --git a/drivers/net/ethernet/broadcom/bcmsysport.h b/drivers/net/ethernet/broadcom/bcmsysport.h |
1170 | index d6e5d0cbf3a3..cf440b91fd04 100644 |
1171 | --- a/drivers/net/ethernet/broadcom/bcmsysport.h |
1172 | +++ b/drivers/net/ethernet/broadcom/bcmsysport.h |
1173 | @@ -278,7 +278,8 @@ struct bcm_rsb { |
1174 | #define GIB_GTX_CLK_EXT_CLK (0 << GIB_GTX_CLK_SEL_SHIFT) |
1175 | #define GIB_GTX_CLK_125MHZ (1 << GIB_GTX_CLK_SEL_SHIFT) |
1176 | #define GIB_GTX_CLK_250MHZ (2 << GIB_GTX_CLK_SEL_SHIFT) |
1177 | -#define GIB_FCS_STRIP (1 << 6) |
1178 | +#define GIB_FCS_STRIP_SHIFT 6 |
1179 | +#define GIB_FCS_STRIP (1 << GIB_FCS_STRIP_SHIFT) |
1180 | #define GIB_LCL_LOOP_EN (1 << 7) |
1181 | #define GIB_LCL_LOOP_TXEN (1 << 8) |
1182 | #define GIB_RMT_LOOP_EN (1 << 9) |
1183 | diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c |
1184 | index 9f59b1270a7c..3e0e7f18ecf9 100644 |
1185 | --- a/drivers/net/ethernet/broadcom/tg3.c |
1186 | +++ b/drivers/net/ethernet/broadcom/tg3.c |
1187 | @@ -9289,6 +9289,15 @@ static int tg3_chip_reset(struct tg3 *tp) |
1188 | |
1189 | tg3_restore_clk(tp); |
1190 | |
1191 | + /* Increase the core clock speed to fix tx timeout issue for 5762 |
1192 | + * with 100Mbps link speed. |
1193 | + */ |
1194 | + if (tg3_asic_rev(tp) == ASIC_REV_5762) { |
1195 | + val = tr32(TG3_CPMU_CLCK_ORIDE_ENABLE); |
1196 | + tw32(TG3_CPMU_CLCK_ORIDE_ENABLE, val | |
1197 | + TG3_CPMU_MAC_ORIDE_ENABLE); |
1198 | + } |
1199 | + |
1200 | /* Reprobe ASF enable state. */ |
1201 | tg3_flag_clear(tp, ENABLE_ASF); |
1202 | tp->phy_flags &= ~(TG3_PHYFLG_1G_ON_VAUX_OK | |
1203 | diff --git a/drivers/net/ethernet/mellanox/mlx4/en_rx.c b/drivers/net/ethernet/mellanox/mlx4/en_rx.c |
1204 | index 5c613c6663da..2ca0f1dad54c 100644 |
1205 | --- a/drivers/net/ethernet/mellanox/mlx4/en_rx.c |
1206 | +++ b/drivers/net/ethernet/mellanox/mlx4/en_rx.c |
1207 | @@ -474,10 +474,10 @@ static int mlx4_en_complete_rx_desc(struct mlx4_en_priv *priv, |
1208 | { |
1209 | const struct mlx4_en_frag_info *frag_info = priv->frag_info; |
1210 | unsigned int truesize = 0; |
1211 | + bool release = true; |
1212 | int nr, frag_size; |
1213 | struct page *page; |
1214 | dma_addr_t dma; |
1215 | - bool release; |
1216 | |
1217 | /* Collect used fragments while replacing them in the HW descriptors */ |
1218 | for (nr = 0;; frags++) { |
1219 | @@ -500,7 +500,11 @@ static int mlx4_en_complete_rx_desc(struct mlx4_en_priv *priv, |
1220 | release = page_count(page) != 1 || |
1221 | page_is_pfmemalloc(page) || |
1222 | page_to_nid(page) != numa_mem_id(); |
1223 | - } else { |
1224 | + } else if (!priv->rx_headroom) { |
1225 | + /* rx_headroom for non XDP setup is always 0. |
1226 | + * When XDP is set, the above condition will |
1227 | + * guarantee page is always released. |
1228 | + */ |
1229 | u32 sz_align = ALIGN(frag_size, SMP_CACHE_BYTES); |
1230 | |
1231 | frags->page_offset += sz_align; |
1232 | diff --git a/drivers/net/hyperv/netvsc.c b/drivers/net/hyperv/netvsc.c |
1233 | index c418113c6b20..c10ca3c20b36 100644 |
1234 | --- a/drivers/net/hyperv/netvsc.c |
1235 | +++ b/drivers/net/hyperv/netvsc.c |
1236 | @@ -1291,6 +1291,7 @@ int netvsc_poll(struct napi_struct *napi, int budget) |
1237 | struct hv_device *device = netvsc_channel_to_device(channel); |
1238 | struct net_device *ndev = hv_get_drvdata(device); |
1239 | int work_done = 0; |
1240 | + int ret; |
1241 | |
1242 | /* If starting a new interval */ |
1243 | if (!nvchan->desc) |
1244 | @@ -1302,16 +1303,18 @@ int netvsc_poll(struct napi_struct *napi, int budget) |
1245 | nvchan->desc = hv_pkt_iter_next(channel, nvchan->desc); |
1246 | } |
1247 | |
1248 | - /* If send of pending receive completions suceeded |
1249 | - * and did not exhaust NAPI budget this time |
1250 | - * and not doing busy poll |
1251 | + /* Send any pending receive completions */ |
1252 | + ret = send_recv_completions(ndev, net_device, nvchan); |
1253 | + |
1254 | + /* If it did not exhaust NAPI budget this time |
1255 | + * and not doing busy poll |
1256 | * then re-enable host interrupts |
1257 | - * and reschedule if ring is not empty. |
1258 | + * and reschedule if ring is not empty |
1259 | + * or sending receive completion failed. |
1260 | */ |
1261 | - if (send_recv_completions(ndev, net_device, nvchan) == 0 && |
1262 | - work_done < budget && |
1263 | + if (work_done < budget && |
1264 | napi_complete_done(napi, work_done) && |
1265 | - hv_end_read(&channel->inbound) && |
1266 | + (ret || hv_end_read(&channel->inbound)) && |
1267 | napi_schedule_prep(napi)) { |
1268 | hv_begin_read(&channel->inbound); |
1269 | __napi_schedule(napi); |
1270 | diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c |
1271 | index 9e4ba8e80a18..5aa081fda447 100644 |
1272 | --- a/drivers/net/phy/phy_device.c |
1273 | +++ b/drivers/net/phy/phy_device.c |
1274 | @@ -1720,11 +1720,8 @@ EXPORT_SYMBOL(genphy_loopback); |
1275 | |
1276 | static int __set_phy_supported(struct phy_device *phydev, u32 max_speed) |
1277 | { |
1278 | - /* The default values for phydev->supported are provided by the PHY |
1279 | - * driver "features" member, we want to reset to sane defaults first |
1280 | - * before supporting higher speeds. |
1281 | - */ |
1282 | - phydev->supported &= PHY_DEFAULT_FEATURES; |
1283 | + phydev->supported &= ~(PHY_1000BT_FEATURES | PHY_100BT_FEATURES | |
1284 | + PHY_10BT_FEATURES); |
1285 | |
1286 | switch (max_speed) { |
1287 | default: |
1288 | diff --git a/drivers/net/usb/asix_devices.c b/drivers/net/usb/asix_devices.c |
1289 | index 3d4f7959dabb..b1b3d8f7e67d 100644 |
1290 | --- a/drivers/net/usb/asix_devices.c |
1291 | +++ b/drivers/net/usb/asix_devices.c |
1292 | @@ -642,10 +642,12 @@ static void ax88772_restore_phy(struct usbnet *dev) |
1293 | priv->presvd_phy_advertise); |
1294 | |
1295 | /* Restore BMCR */ |
1296 | + if (priv->presvd_phy_bmcr & BMCR_ANENABLE) |
1297 | + priv->presvd_phy_bmcr |= BMCR_ANRESTART; |
1298 | + |
1299 | asix_mdio_write_nopm(dev->net, dev->mii.phy_id, MII_BMCR, |
1300 | priv->presvd_phy_bmcr); |
1301 | |
1302 | - mii_nway_restart(&dev->mii); |
1303 | priv->presvd_phy_advertise = 0; |
1304 | priv->presvd_phy_bmcr = 0; |
1305 | } |
1306 | diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c |
1307 | index 04c22f508ed9..f8f90d77cf0f 100644 |
1308 | --- a/drivers/net/usb/qmi_wwan.c |
1309 | +++ b/drivers/net/usb/qmi_wwan.c |
1310 | @@ -1253,6 +1253,7 @@ static const struct usb_device_id products[] = { |
1311 | {QMI_FIXED_INTF(0x1e0e, 0x9001, 5)}, /* SIMCom 7230E */ |
1312 | {QMI_QUIRK_SET_DTR(0x2c7c, 0x0125, 4)}, /* Quectel EC25, EC20 R2.0 Mini PCIe */ |
1313 | {QMI_QUIRK_SET_DTR(0x2c7c, 0x0121, 4)}, /* Quectel EC21 Mini PCIe */ |
1314 | + {QMI_QUIRK_SET_DTR(0x2c7c, 0x0191, 4)}, /* Quectel EG91 */ |
1315 | {QMI_FIXED_INTF(0x2c7c, 0x0296, 4)}, /* Quectel BG96 */ |
1316 | {QMI_QUIRK_SET_DTR(0x2c7c, 0x0306, 4)}, /* Quectel EP06 Mini PCIe */ |
1317 | |
1318 | diff --git a/drivers/ptp/ptp_chardev.c b/drivers/ptp/ptp_chardev.c |
1319 | index 767c485af59b..522719b494f3 100644 |
1320 | --- a/drivers/ptp/ptp_chardev.c |
1321 | +++ b/drivers/ptp/ptp_chardev.c |
1322 | @@ -89,6 +89,7 @@ int ptp_set_pinfunc(struct ptp_clock *ptp, unsigned int pin, |
1323 | case PTP_PF_PHYSYNC: |
1324 | if (chan != 0) |
1325 | return -EINVAL; |
1326 | + break; |
1327 | default: |
1328 | return -EINVAL; |
1329 | } |
1330 | diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h |
1331 | index eb2ec1fb07cb..209de7cd9358 100644 |
1332 | --- a/drivers/scsi/qla2xxx/qla_def.h |
1333 | +++ b/drivers/scsi/qla2xxx/qla_def.h |
1334 | @@ -361,6 +361,8 @@ struct ct_arg { |
1335 | dma_addr_t rsp_dma; |
1336 | u32 req_size; |
1337 | u32 rsp_size; |
1338 | + u32 req_allocated_size; |
1339 | + u32 rsp_allocated_size; |
1340 | void *req; |
1341 | void *rsp; |
1342 | port_id_t id; |
1343 | diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c |
1344 | index 05abe5aaab7f..cbfbab5d9a59 100644 |
1345 | --- a/drivers/scsi/qla2xxx/qla_gs.c |
1346 | +++ b/drivers/scsi/qla2xxx/qla_gs.c |
1347 | @@ -556,7 +556,7 @@ static void qla2x00_async_sns_sp_done(void *s, int rc) |
1348 | /* please ignore kernel warning. otherwise, we have mem leak. */ |
1349 | if (sp->u.iocb_cmd.u.ctarg.req) { |
1350 | dma_free_coherent(&vha->hw->pdev->dev, |
1351 | - sizeof(struct ct_sns_pkt), |
1352 | + sp->u.iocb_cmd.u.ctarg.req_allocated_size, |
1353 | sp->u.iocb_cmd.u.ctarg.req, |
1354 | sp->u.iocb_cmd.u.ctarg.req_dma); |
1355 | sp->u.iocb_cmd.u.ctarg.req = NULL; |
1356 | @@ -564,7 +564,7 @@ static void qla2x00_async_sns_sp_done(void *s, int rc) |
1357 | |
1358 | if (sp->u.iocb_cmd.u.ctarg.rsp) { |
1359 | dma_free_coherent(&vha->hw->pdev->dev, |
1360 | - sizeof(struct ct_sns_pkt), |
1361 | + sp->u.iocb_cmd.u.ctarg.rsp_allocated_size, |
1362 | sp->u.iocb_cmd.u.ctarg.rsp, |
1363 | sp->u.iocb_cmd.u.ctarg.rsp_dma); |
1364 | sp->u.iocb_cmd.u.ctarg.rsp = NULL; |
1365 | @@ -617,6 +617,7 @@ static int qla_async_rftid(scsi_qla_host_t *vha, port_id_t *d_id) |
1366 | sp->u.iocb_cmd.u.ctarg.req = dma_alloc_coherent(&vha->hw->pdev->dev, |
1367 | sizeof(struct ct_sns_pkt), &sp->u.iocb_cmd.u.ctarg.req_dma, |
1368 | GFP_KERNEL); |
1369 | + sp->u.iocb_cmd.u.ctarg.req_allocated_size = sizeof(struct ct_sns_pkt); |
1370 | if (!sp->u.iocb_cmd.u.ctarg.req) { |
1371 | ql_log(ql_log_warn, vha, 0xd041, |
1372 | "%s: Failed to allocate ct_sns request.\n", |
1373 | @@ -627,6 +628,7 @@ static int qla_async_rftid(scsi_qla_host_t *vha, port_id_t *d_id) |
1374 | sp->u.iocb_cmd.u.ctarg.rsp = dma_alloc_coherent(&vha->hw->pdev->dev, |
1375 | sizeof(struct ct_sns_pkt), &sp->u.iocb_cmd.u.ctarg.rsp_dma, |
1376 | GFP_KERNEL); |
1377 | + sp->u.iocb_cmd.u.ctarg.rsp_allocated_size = sizeof(struct ct_sns_pkt); |
1378 | if (!sp->u.iocb_cmd.u.ctarg.rsp) { |
1379 | ql_log(ql_log_warn, vha, 0xd042, |
1380 | "%s: Failed to allocate ct_sns request.\n", |
1381 | @@ -712,6 +714,7 @@ static int qla_async_rffid(scsi_qla_host_t *vha, port_id_t *d_id, |
1382 | sp->u.iocb_cmd.u.ctarg.req = dma_alloc_coherent(&vha->hw->pdev->dev, |
1383 | sizeof(struct ct_sns_pkt), &sp->u.iocb_cmd.u.ctarg.req_dma, |
1384 | GFP_KERNEL); |
1385 | + sp->u.iocb_cmd.u.ctarg.req_allocated_size = sizeof(struct ct_sns_pkt); |
1386 | if (!sp->u.iocb_cmd.u.ctarg.req) { |
1387 | ql_log(ql_log_warn, vha, 0xd041, |
1388 | "%s: Failed to allocate ct_sns request.\n", |
1389 | @@ -722,6 +725,7 @@ static int qla_async_rffid(scsi_qla_host_t *vha, port_id_t *d_id, |
1390 | sp->u.iocb_cmd.u.ctarg.rsp = dma_alloc_coherent(&vha->hw->pdev->dev, |
1391 | sizeof(struct ct_sns_pkt), &sp->u.iocb_cmd.u.ctarg.rsp_dma, |
1392 | GFP_KERNEL); |
1393 | + sp->u.iocb_cmd.u.ctarg.rsp_allocated_size = sizeof(struct ct_sns_pkt); |
1394 | if (!sp->u.iocb_cmd.u.ctarg.rsp) { |
1395 | ql_log(ql_log_warn, vha, 0xd042, |
1396 | "%s: Failed to allocate ct_sns request.\n", |
1397 | @@ -802,6 +806,7 @@ static int qla_async_rnnid(scsi_qla_host_t *vha, port_id_t *d_id, |
1398 | sp->u.iocb_cmd.u.ctarg.req = dma_alloc_coherent(&vha->hw->pdev->dev, |
1399 | sizeof(struct ct_sns_pkt), &sp->u.iocb_cmd.u.ctarg.req_dma, |
1400 | GFP_KERNEL); |
1401 | + sp->u.iocb_cmd.u.ctarg.req_allocated_size = sizeof(struct ct_sns_pkt); |
1402 | if (!sp->u.iocb_cmd.u.ctarg.req) { |
1403 | ql_log(ql_log_warn, vha, 0xd041, |
1404 | "%s: Failed to allocate ct_sns request.\n", |
1405 | @@ -812,6 +817,7 @@ static int qla_async_rnnid(scsi_qla_host_t *vha, port_id_t *d_id, |
1406 | sp->u.iocb_cmd.u.ctarg.rsp = dma_alloc_coherent(&vha->hw->pdev->dev, |
1407 | sizeof(struct ct_sns_pkt), &sp->u.iocb_cmd.u.ctarg.rsp_dma, |
1408 | GFP_KERNEL); |
1409 | + sp->u.iocb_cmd.u.ctarg.rsp_allocated_size = sizeof(struct ct_sns_pkt); |
1410 | if (!sp->u.iocb_cmd.u.ctarg.rsp) { |
1411 | ql_log(ql_log_warn, vha, 0xd042, |
1412 | "%s: Failed to allocate ct_sns request.\n", |
1413 | @@ -909,6 +915,7 @@ static int qla_async_rsnn_nn(scsi_qla_host_t *vha) |
1414 | sp->u.iocb_cmd.u.ctarg.req = dma_alloc_coherent(&vha->hw->pdev->dev, |
1415 | sizeof(struct ct_sns_pkt), &sp->u.iocb_cmd.u.ctarg.req_dma, |
1416 | GFP_KERNEL); |
1417 | + sp->u.iocb_cmd.u.ctarg.req_allocated_size = sizeof(struct ct_sns_pkt); |
1418 | if (!sp->u.iocb_cmd.u.ctarg.req) { |
1419 | ql_log(ql_log_warn, vha, 0xd041, |
1420 | "%s: Failed to allocate ct_sns request.\n", |
1421 | @@ -919,6 +926,7 @@ static int qla_async_rsnn_nn(scsi_qla_host_t *vha) |
1422 | sp->u.iocb_cmd.u.ctarg.rsp = dma_alloc_coherent(&vha->hw->pdev->dev, |
1423 | sizeof(struct ct_sns_pkt), &sp->u.iocb_cmd.u.ctarg.rsp_dma, |
1424 | GFP_KERNEL); |
1425 | + sp->u.iocb_cmd.u.ctarg.rsp_allocated_size = sizeof(struct ct_sns_pkt); |
1426 | if (!sp->u.iocb_cmd.u.ctarg.rsp) { |
1427 | ql_log(ql_log_warn, vha, 0xd042, |
1428 | "%s: Failed to allocate ct_sns request.\n", |
1429 | @@ -3392,14 +3400,14 @@ void qla24xx_sp_unmap(scsi_qla_host_t *vha, srb_t *sp) |
1430 | { |
1431 | if (sp->u.iocb_cmd.u.ctarg.req) { |
1432 | dma_free_coherent(&vha->hw->pdev->dev, |
1433 | - sizeof(struct ct_sns_pkt), |
1434 | + sp->u.iocb_cmd.u.ctarg.req_allocated_size, |
1435 | sp->u.iocb_cmd.u.ctarg.req, |
1436 | sp->u.iocb_cmd.u.ctarg.req_dma); |
1437 | sp->u.iocb_cmd.u.ctarg.req = NULL; |
1438 | } |
1439 | if (sp->u.iocb_cmd.u.ctarg.rsp) { |
1440 | dma_free_coherent(&vha->hw->pdev->dev, |
1441 | - sizeof(struct ct_sns_pkt), |
1442 | + sp->u.iocb_cmd.u.ctarg.rsp_allocated_size, |
1443 | sp->u.iocb_cmd.u.ctarg.rsp, |
1444 | sp->u.iocb_cmd.u.ctarg.rsp_dma); |
1445 | sp->u.iocb_cmd.u.ctarg.rsp = NULL; |
1446 | @@ -3600,14 +3608,14 @@ static void qla2x00_async_gpnid_sp_done(void *s, int res) |
1447 | /* please ignore kernel warning. otherwise, we have mem leak. */ |
1448 | if (sp->u.iocb_cmd.u.ctarg.req) { |
1449 | dma_free_coherent(&vha->hw->pdev->dev, |
1450 | - sizeof(struct ct_sns_pkt), |
1451 | + sp->u.iocb_cmd.u.ctarg.req_allocated_size, |
1452 | sp->u.iocb_cmd.u.ctarg.req, |
1453 | sp->u.iocb_cmd.u.ctarg.req_dma); |
1454 | sp->u.iocb_cmd.u.ctarg.req = NULL; |
1455 | } |
1456 | if (sp->u.iocb_cmd.u.ctarg.rsp) { |
1457 | dma_free_coherent(&vha->hw->pdev->dev, |
1458 | - sizeof(struct ct_sns_pkt), |
1459 | + sp->u.iocb_cmd.u.ctarg.rsp_allocated_size, |
1460 | sp->u.iocb_cmd.u.ctarg.rsp, |
1461 | sp->u.iocb_cmd.u.ctarg.rsp_dma); |
1462 | sp->u.iocb_cmd.u.ctarg.rsp = NULL; |
1463 | @@ -3658,6 +3666,7 @@ int qla24xx_async_gpnid(scsi_qla_host_t *vha, port_id_t *id) |
1464 | sp->u.iocb_cmd.u.ctarg.req = dma_alloc_coherent(&vha->hw->pdev->dev, |
1465 | sizeof(struct ct_sns_pkt), &sp->u.iocb_cmd.u.ctarg.req_dma, |
1466 | GFP_KERNEL); |
1467 | + sp->u.iocb_cmd.u.ctarg.req_allocated_size = sizeof(struct ct_sns_pkt); |
1468 | if (!sp->u.iocb_cmd.u.ctarg.req) { |
1469 | ql_log(ql_log_warn, vha, 0xd041, |
1470 | "Failed to allocate ct_sns request.\n"); |
1471 | @@ -3667,6 +3676,7 @@ int qla24xx_async_gpnid(scsi_qla_host_t *vha, port_id_t *id) |
1472 | sp->u.iocb_cmd.u.ctarg.rsp = dma_alloc_coherent(&vha->hw->pdev->dev, |
1473 | sizeof(struct ct_sns_pkt), &sp->u.iocb_cmd.u.ctarg.rsp_dma, |
1474 | GFP_KERNEL); |
1475 | + sp->u.iocb_cmd.u.ctarg.rsp_allocated_size = sizeof(struct ct_sns_pkt); |
1476 | if (!sp->u.iocb_cmd.u.ctarg.rsp) { |
1477 | ql_log(ql_log_warn, vha, 0xd042, |
1478 | "Failed to allocate ct_sns request.\n"); |
1479 | @@ -4125,14 +4135,14 @@ static void qla2x00_async_gpnft_gnnft_sp_done(void *s, int res) |
1480 | */ |
1481 | if (sp->u.iocb_cmd.u.ctarg.req) { |
1482 | dma_free_coherent(&vha->hw->pdev->dev, |
1483 | - sizeof(struct ct_sns_pkt), |
1484 | + sp->u.iocb_cmd.u.ctarg.req_allocated_size, |
1485 | sp->u.iocb_cmd.u.ctarg.req, |
1486 | sp->u.iocb_cmd.u.ctarg.req_dma); |
1487 | sp->u.iocb_cmd.u.ctarg.req = NULL; |
1488 | } |
1489 | if (sp->u.iocb_cmd.u.ctarg.rsp) { |
1490 | dma_free_coherent(&vha->hw->pdev->dev, |
1491 | - sizeof(struct ct_sns_pkt), |
1492 | + sp->u.iocb_cmd.u.ctarg.rsp_allocated_size, |
1493 | sp->u.iocb_cmd.u.ctarg.rsp, |
1494 | sp->u.iocb_cmd.u.ctarg.rsp_dma); |
1495 | sp->u.iocb_cmd.u.ctarg.rsp = NULL; |
1496 | @@ -4162,14 +4172,14 @@ static void qla2x00_async_gpnft_gnnft_sp_done(void *s, int res) |
1497 | /* please ignore kernel warning. Otherwise, we have mem leak. */ |
1498 | if (sp->u.iocb_cmd.u.ctarg.req) { |
1499 | dma_free_coherent(&vha->hw->pdev->dev, |
1500 | - sizeof(struct ct_sns_pkt), |
1501 | + sp->u.iocb_cmd.u.ctarg.req_allocated_size, |
1502 | sp->u.iocb_cmd.u.ctarg.req, |
1503 | sp->u.iocb_cmd.u.ctarg.req_dma); |
1504 | sp->u.iocb_cmd.u.ctarg.req = NULL; |
1505 | } |
1506 | if (sp->u.iocb_cmd.u.ctarg.rsp) { |
1507 | dma_free_coherent(&vha->hw->pdev->dev, |
1508 | - sizeof(struct ct_sns_pkt), |
1509 | + sp->u.iocb_cmd.u.ctarg.rsp_allocated_size, |
1510 | sp->u.iocb_cmd.u.ctarg.rsp, |
1511 | sp->u.iocb_cmd.u.ctarg.rsp_dma); |
1512 | sp->u.iocb_cmd.u.ctarg.rsp = NULL; |
1513 | @@ -4264,14 +4274,14 @@ static int qla24xx_async_gnnft(scsi_qla_host_t *vha, struct srb *sp, |
1514 | done_free_sp: |
1515 | if (sp->u.iocb_cmd.u.ctarg.req) { |
1516 | dma_free_coherent(&vha->hw->pdev->dev, |
1517 | - sizeof(struct ct_sns_pkt), |
1518 | + sp->u.iocb_cmd.u.ctarg.req_allocated_size, |
1519 | sp->u.iocb_cmd.u.ctarg.req, |
1520 | sp->u.iocb_cmd.u.ctarg.req_dma); |
1521 | sp->u.iocb_cmd.u.ctarg.req = NULL; |
1522 | } |
1523 | if (sp->u.iocb_cmd.u.ctarg.rsp) { |
1524 | dma_free_coherent(&vha->hw->pdev->dev, |
1525 | - sizeof(struct ct_sns_pkt), |
1526 | + sp->u.iocb_cmd.u.ctarg.rsp_allocated_size, |
1527 | sp->u.iocb_cmd.u.ctarg.rsp, |
1528 | sp->u.iocb_cmd.u.ctarg.rsp_dma); |
1529 | sp->u.iocb_cmd.u.ctarg.rsp = NULL; |
1530 | @@ -4332,6 +4342,7 @@ int qla24xx_async_gpnft(scsi_qla_host_t *vha, u8 fc4_type, srb_t *sp) |
1531 | sp->u.iocb_cmd.u.ctarg.req = dma_zalloc_coherent( |
1532 | &vha->hw->pdev->dev, sizeof(struct ct_sns_pkt), |
1533 | &sp->u.iocb_cmd.u.ctarg.req_dma, GFP_KERNEL); |
1534 | + sp->u.iocb_cmd.u.ctarg.req_allocated_size = sizeof(struct ct_sns_pkt); |
1535 | if (!sp->u.iocb_cmd.u.ctarg.req) { |
1536 | ql_log(ql_log_warn, vha, 0xffff, |
1537 | "Failed to allocate ct_sns request.\n"); |
1538 | @@ -4349,6 +4360,7 @@ int qla24xx_async_gpnft(scsi_qla_host_t *vha, u8 fc4_type, srb_t *sp) |
1539 | sp->u.iocb_cmd.u.ctarg.rsp = dma_zalloc_coherent( |
1540 | &vha->hw->pdev->dev, rspsz, |
1541 | &sp->u.iocb_cmd.u.ctarg.rsp_dma, GFP_KERNEL); |
1542 | + sp->u.iocb_cmd.u.ctarg.rsp_allocated_size = sizeof(struct ct_sns_pkt); |
1543 | if (!sp->u.iocb_cmd.u.ctarg.rsp) { |
1544 | ql_log(ql_log_warn, vha, 0xffff, |
1545 | "Failed to allocate ct_sns request.\n"); |
1546 | @@ -4408,14 +4420,14 @@ int qla24xx_async_gpnft(scsi_qla_host_t *vha, u8 fc4_type, srb_t *sp) |
1547 | done_free_sp: |
1548 | if (sp->u.iocb_cmd.u.ctarg.req) { |
1549 | dma_free_coherent(&vha->hw->pdev->dev, |
1550 | - sizeof(struct ct_sns_pkt), |
1551 | + sp->u.iocb_cmd.u.ctarg.req_allocated_size, |
1552 | sp->u.iocb_cmd.u.ctarg.req, |
1553 | sp->u.iocb_cmd.u.ctarg.req_dma); |
1554 | sp->u.iocb_cmd.u.ctarg.req = NULL; |
1555 | } |
1556 | if (sp->u.iocb_cmd.u.ctarg.rsp) { |
1557 | dma_free_coherent(&vha->hw->pdev->dev, |
1558 | - sizeof(struct ct_sns_pkt), |
1559 | + sp->u.iocb_cmd.u.ctarg.rsp_allocated_size, |
1560 | sp->u.iocb_cmd.u.ctarg.rsp, |
1561 | sp->u.iocb_cmd.u.ctarg.rsp_dma); |
1562 | sp->u.iocb_cmd.u.ctarg.rsp = NULL; |
1563 | diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c |
1564 | index 636960ad029a..0cb552268be3 100644 |
1565 | --- a/drivers/scsi/qla2xxx/qla_init.c |
1566 | +++ b/drivers/scsi/qla2xxx/qla_init.c |
1567 | @@ -591,12 +591,14 @@ static void qla24xx_handle_gnl_done_event(scsi_qla_host_t *vha, |
1568 | conflict_fcport = |
1569 | qla2x00_find_fcport_by_wwpn(vha, |
1570 | e->port_name, 0); |
1571 | - ql_dbg(ql_dbg_disc, vha, 0x20e6, |
1572 | - "%s %d %8phC post del sess\n", |
1573 | - __func__, __LINE__, |
1574 | - conflict_fcport->port_name); |
1575 | - qlt_schedule_sess_for_deletion |
1576 | - (conflict_fcport); |
1577 | + if (conflict_fcport) { |
1578 | + qlt_schedule_sess_for_deletion |
1579 | + (conflict_fcport); |
1580 | + ql_dbg(ql_dbg_disc, vha, 0x20e6, |
1581 | + "%s %d %8phC post del sess\n", |
1582 | + __func__, __LINE__, |
1583 | + conflict_fcport->port_name); |
1584 | + } |
1585 | } |
1586 | |
1587 | /* FW already picked this loop id for another fcport */ |
1588 | diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c |
1589 | index 15eaa6dded04..2b0816dfe9bd 100644 |
1590 | --- a/drivers/scsi/qla2xxx/qla_os.c |
1591 | +++ b/drivers/scsi/qla2xxx/qla_os.c |
1592 | @@ -3180,6 +3180,8 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) |
1593 | "req->req_q_in=%p req->req_q_out=%p rsp->rsp_q_in=%p rsp->rsp_q_out=%p.\n", |
1594 | req->req_q_in, req->req_q_out, rsp->rsp_q_in, rsp->rsp_q_out); |
1595 | |
1596 | + ha->wq = alloc_workqueue("qla2xxx_wq", 0, 0); |
1597 | + |
1598 | if (ha->isp_ops->initialize_adapter(base_vha)) { |
1599 | ql_log(ql_log_fatal, base_vha, 0x00d6, |
1600 | "Failed to initialize adapter - Adapter flags %x.\n", |
1601 | @@ -3216,8 +3218,6 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) |
1602 | host->can_queue, base_vha->req, |
1603 | base_vha->mgmt_svr_loop_id, host->sg_tablesize); |
1604 | |
1605 | - ha->wq = alloc_workqueue("qla2xxx_wq", 0, 0); |
1606 | - |
1607 | if (ha->mqenable) { |
1608 | bool mq = false; |
1609 | bool startit = false; |
1610 | diff --git a/drivers/scsi/sd_zbc.c b/drivers/scsi/sd_zbc.c |
1611 | index 210407cd2341..da868f6c9638 100644 |
1612 | --- a/drivers/scsi/sd_zbc.c |
1613 | +++ b/drivers/scsi/sd_zbc.c |
1614 | @@ -401,7 +401,8 @@ static int sd_zbc_check_capacity(struct scsi_disk *sdkp, unsigned char *buf) |
1615 | * Check that all zones of the device are equal. The last zone can however |
1616 | * be smaller. The zone size must also be a power of two number of LBAs. |
1617 | * |
1618 | - * Returns the zone size in bytes upon success or an error code upon failure. |
1619 | + * Returns the zone size in number of blocks upon success or an error code |
1620 | + * upon failure. |
1621 | */ |
1622 | static s64 sd_zbc_check_zone_size(struct scsi_disk *sdkp) |
1623 | { |
1624 | @@ -411,7 +412,7 @@ static s64 sd_zbc_check_zone_size(struct scsi_disk *sdkp) |
1625 | unsigned char *rec; |
1626 | unsigned int buf_len; |
1627 | unsigned int list_length; |
1628 | - int ret; |
1629 | + s64 ret; |
1630 | u8 same; |
1631 | |
1632 | /* Get a buffer */ |
1633 | diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c |
1634 | index 711da3306b14..61c3dc2f3be5 100644 |
1635 | --- a/drivers/usb/host/xhci.c |
1636 | +++ b/drivers/usb/host/xhci.c |
1637 | @@ -844,6 +844,41 @@ static void xhci_disable_port_wake_on_bits(struct xhci_hcd *xhci) |
1638 | spin_unlock_irqrestore(&xhci->lock, flags); |
1639 | } |
1640 | |
1641 | +static bool xhci_pending_portevent(struct xhci_hcd *xhci) |
1642 | +{ |
1643 | + __le32 __iomem **port_array; |
1644 | + int port_index; |
1645 | + u32 status; |
1646 | + u32 portsc; |
1647 | + |
1648 | + status = readl(&xhci->op_regs->status); |
1649 | + if (status & STS_EINT) |
1650 | + return true; |
1651 | + /* |
1652 | + * Checking STS_EINT is not enough as there is a lag between a change |
1653 | + * bit being set and the Port Status Change Event that it generated |
1654 | + * being written to the Event Ring. See note in xhci 1.1 section 4.19.2. |
1655 | + */ |
1656 | + |
1657 | + port_index = xhci->num_usb2_ports; |
1658 | + port_array = xhci->usb2_ports; |
1659 | + while (port_index--) { |
1660 | + portsc = readl(port_array[port_index]); |
1661 | + if (portsc & PORT_CHANGE_MASK || |
1662 | + (portsc & PORT_PLS_MASK) == XDEV_RESUME) |
1663 | + return true; |
1664 | + } |
1665 | + port_index = xhci->num_usb3_ports; |
1666 | + port_array = xhci->usb3_ports; |
1667 | + while (port_index--) { |
1668 | + portsc = readl(port_array[port_index]); |
1669 | + if (portsc & PORT_CHANGE_MASK || |
1670 | + (portsc & PORT_PLS_MASK) == XDEV_RESUME) |
1671 | + return true; |
1672 | + } |
1673 | + return false; |
1674 | +} |
1675 | + |
1676 | /* |
1677 | * Stop HC (not bus-specific) |
1678 | * |
1679 | @@ -945,7 +980,7 @@ EXPORT_SYMBOL_GPL(xhci_suspend); |
1680 | */ |
1681 | int xhci_resume(struct xhci_hcd *xhci, bool hibernated) |
1682 | { |
1683 | - u32 command, temp = 0, status; |
1684 | + u32 command, temp = 0; |
1685 | struct usb_hcd *hcd = xhci_to_hcd(xhci); |
1686 | struct usb_hcd *secondary_hcd; |
1687 | int retval = 0; |
1688 | @@ -1069,8 +1104,7 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated) |
1689 | done: |
1690 | if (retval == 0) { |
1691 | /* Resume root hubs only when have pending events. */ |
1692 | - status = readl(&xhci->op_regs->status); |
1693 | - if (status & STS_EINT) { |
1694 | + if (xhci_pending_portevent(xhci)) { |
1695 | usb_hcd_resume_root_hub(xhci->shared_hcd); |
1696 | usb_hcd_resume_root_hub(hcd); |
1697 | } |
1698 | diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h |
1699 | index 6dfc4867dbcf..9751c1373fbb 100644 |
1700 | --- a/drivers/usb/host/xhci.h |
1701 | +++ b/drivers/usb/host/xhci.h |
1702 | @@ -382,6 +382,10 @@ struct xhci_op_regs { |
1703 | #define PORT_PLC (1 << 22) |
1704 | /* port configure error change - port failed to configure its link partner */ |
1705 | #define PORT_CEC (1 << 23) |
1706 | +#define PORT_CHANGE_MASK (PORT_CSC | PORT_PEC | PORT_WRC | PORT_OCC | \ |
1707 | + PORT_RC | PORT_PLC | PORT_CEC) |
1708 | + |
1709 | + |
1710 | /* Cold Attach Status - xHC can set this bit to report device attached during |
1711 | * Sx state. Warm port reset should be perfomed to clear this bit and move port |
1712 | * to connected state. |
1713 | diff --git a/drivers/vfio/pci/vfio_pci.c b/drivers/vfio/pci/vfio_pci.c |
1714 | index b423a309a6e0..125b58eff936 100644 |
1715 | --- a/drivers/vfio/pci/vfio_pci.c |
1716 | +++ b/drivers/vfio/pci/vfio_pci.c |
1717 | @@ -28,6 +28,7 @@ |
1718 | #include <linux/uaccess.h> |
1719 | #include <linux/vfio.h> |
1720 | #include <linux/vgaarb.h> |
1721 | +#include <linux/nospec.h> |
1722 | |
1723 | #include "vfio_pci_private.h" |
1724 | |
1725 | @@ -727,6 +728,9 @@ static long vfio_pci_ioctl(void *device_data, |
1726 | if (info.index >= |
1727 | VFIO_PCI_NUM_REGIONS + vdev->num_regions) |
1728 | return -EINVAL; |
1729 | + info.index = array_index_nospec(info.index, |
1730 | + VFIO_PCI_NUM_REGIONS + |
1731 | + vdev->num_regions); |
1732 | |
1733 | i = info.index - VFIO_PCI_NUM_REGIONS; |
1734 | |
1735 | diff --git a/drivers/vfio/vfio_iommu_spapr_tce.c b/drivers/vfio/vfio_iommu_spapr_tce.c |
1736 | index 759a5bdd40e1..2da5f054257a 100644 |
1737 | --- a/drivers/vfio/vfio_iommu_spapr_tce.c |
1738 | +++ b/drivers/vfio/vfio_iommu_spapr_tce.c |
1739 | @@ -457,13 +457,13 @@ static void tce_iommu_unuse_page(struct tce_container *container, |
1740 | } |
1741 | |
1742 | static int tce_iommu_prereg_ua_to_hpa(struct tce_container *container, |
1743 | - unsigned long tce, unsigned long size, |
1744 | + unsigned long tce, unsigned long shift, |
1745 | unsigned long *phpa, struct mm_iommu_table_group_mem_t **pmem) |
1746 | { |
1747 | long ret = 0; |
1748 | struct mm_iommu_table_group_mem_t *mem; |
1749 | |
1750 | - mem = mm_iommu_lookup(container->mm, tce, size); |
1751 | + mem = mm_iommu_lookup(container->mm, tce, 1ULL << shift); |
1752 | if (!mem) |
1753 | return -EINVAL; |
1754 | |
1755 | @@ -487,7 +487,7 @@ static void tce_iommu_unuse_page_v2(struct tce_container *container, |
1756 | if (!pua) |
1757 | return; |
1758 | |
1759 | - ret = tce_iommu_prereg_ua_to_hpa(container, *pua, IOMMU_PAGE_SIZE(tbl), |
1760 | + ret = tce_iommu_prereg_ua_to_hpa(container, *pua, tbl->it_page_shift, |
1761 | &hpa, &mem); |
1762 | if (ret) |
1763 | pr_debug("%s: tce %lx at #%lx was not cached, ret=%d\n", |
1764 | @@ -611,7 +611,7 @@ static long tce_iommu_build_v2(struct tce_container *container, |
1765 | entry + i); |
1766 | |
1767 | ret = tce_iommu_prereg_ua_to_hpa(container, |
1768 | - tce, IOMMU_PAGE_SIZE(tbl), &hpa, &mem); |
1769 | + tce, tbl->it_page_shift, &hpa, &mem); |
1770 | if (ret) |
1771 | break; |
1772 | |
1773 | diff --git a/fs/fat/inode.c b/fs/fat/inode.c |
1774 | index ffbbf0520d9e..6aa49dcaa938 100644 |
1775 | --- a/fs/fat/inode.c |
1776 | +++ b/fs/fat/inode.c |
1777 | @@ -697,13 +697,21 @@ static void fat_set_state(struct super_block *sb, |
1778 | brelse(bh); |
1779 | } |
1780 | |
1781 | +static void fat_reset_iocharset(struct fat_mount_options *opts) |
1782 | +{ |
1783 | + if (opts->iocharset != fat_default_iocharset) { |
1784 | + /* Note: opts->iocharset can be NULL here */ |
1785 | + kfree(opts->iocharset); |
1786 | + opts->iocharset = fat_default_iocharset; |
1787 | + } |
1788 | +} |
1789 | + |
1790 | static void delayed_free(struct rcu_head *p) |
1791 | { |
1792 | struct msdos_sb_info *sbi = container_of(p, struct msdos_sb_info, rcu); |
1793 | unload_nls(sbi->nls_disk); |
1794 | unload_nls(sbi->nls_io); |
1795 | - if (sbi->options.iocharset != fat_default_iocharset) |
1796 | - kfree(sbi->options.iocharset); |
1797 | + fat_reset_iocharset(&sbi->options); |
1798 | kfree(sbi); |
1799 | } |
1800 | |
1801 | @@ -1118,7 +1126,7 @@ static int parse_options(struct super_block *sb, char *options, int is_vfat, |
1802 | opts->fs_fmask = opts->fs_dmask = current_umask(); |
1803 | opts->allow_utime = -1; |
1804 | opts->codepage = fat_default_codepage; |
1805 | - opts->iocharset = fat_default_iocharset; |
1806 | + fat_reset_iocharset(opts); |
1807 | if (is_vfat) { |
1808 | opts->shortname = VFAT_SFN_DISPLAY_WINNT|VFAT_SFN_CREATE_WIN95; |
1809 | opts->rodir = 0; |
1810 | @@ -1275,8 +1283,7 @@ static int parse_options(struct super_block *sb, char *options, int is_vfat, |
1811 | |
1812 | /* vfat specific */ |
1813 | case Opt_charset: |
1814 | - if (opts->iocharset != fat_default_iocharset) |
1815 | - kfree(opts->iocharset); |
1816 | + fat_reset_iocharset(opts); |
1817 | iocharset = match_strdup(&args[0]); |
1818 | if (!iocharset) |
1819 | return -ENOMEM; |
1820 | @@ -1867,8 +1874,7 @@ int fat_fill_super(struct super_block *sb, void *data, int silent, int isvfat, |
1821 | iput(fat_inode); |
1822 | unload_nls(sbi->nls_io); |
1823 | unload_nls(sbi->nls_disk); |
1824 | - if (sbi->options.iocharset != fat_default_iocharset) |
1825 | - kfree(sbi->options.iocharset); |
1826 | + fat_reset_iocharset(&sbi->options); |
1827 | sb->s_fs_info = NULL; |
1828 | kfree(sbi); |
1829 | return error; |
1830 | diff --git a/fs/internal.h b/fs/internal.h |
1831 | index 980d005b21b4..5645b4ebf494 100644 |
1832 | --- a/fs/internal.h |
1833 | +++ b/fs/internal.h |
1834 | @@ -127,7 +127,6 @@ int do_fchownat(int dfd, const char __user *filename, uid_t user, gid_t group, |
1835 | |
1836 | extern int open_check_o_direct(struct file *f); |
1837 | extern int vfs_open(const struct path *, struct file *, const struct cred *); |
1838 | -extern struct file *filp_clone_open(struct file *); |
1839 | |
1840 | /* |
1841 | * inode.c |
1842 | diff --git a/include/linux/fs.h b/include/linux/fs.h |
1843 | index 760d8da1b6c7..81fe0292a7ac 100644 |
1844 | --- a/include/linux/fs.h |
1845 | +++ b/include/linux/fs.h |
1846 | @@ -2401,6 +2401,7 @@ extern struct file *filp_open(const char *, int, umode_t); |
1847 | extern struct file *file_open_root(struct dentry *, struct vfsmount *, |
1848 | const char *, int, umode_t); |
1849 | extern struct file * dentry_open(const struct path *, int, const struct cred *); |
1850 | +extern struct file *filp_clone_open(struct file *); |
1851 | extern int filp_close(struct file *, fl_owner_t id); |
1852 | |
1853 | extern struct filename *getname_flags(const char __user *, int, int *); |
1854 | diff --git a/include/linux/sched/task.h b/include/linux/sched/task.h |
1855 | index 5be31eb7b266..108ede99e533 100644 |
1856 | --- a/include/linux/sched/task.h |
1857 | +++ b/include/linux/sched/task.h |
1858 | @@ -75,7 +75,7 @@ extern long _do_fork(unsigned long, unsigned long, unsigned long, int __user *, |
1859 | extern long do_fork(unsigned long, unsigned long, unsigned long, int __user *, int __user *); |
1860 | struct task_struct *fork_idle(int); |
1861 | extern pid_t kernel_thread(int (*fn)(void *), void *arg, unsigned long flags); |
1862 | -extern long kernel_wait4(pid_t, int *, int, struct rusage *); |
1863 | +extern long kernel_wait4(pid_t, int __user *, int, struct rusage *); |
1864 | |
1865 | extern void free_task(struct task_struct *tsk); |
1866 | |
1867 | diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h |
1868 | index 9065477ed255..15d8f9c84ca5 100644 |
1869 | --- a/include/linux/skbuff.h |
1870 | +++ b/include/linux/skbuff.h |
1871 | @@ -628,6 +628,7 @@ typedef unsigned char *sk_buff_data_t; |
1872 | * @hash: the packet hash |
1873 | * @queue_mapping: Queue mapping for multiqueue devices |
1874 | * @xmit_more: More SKBs are pending for this queue |
1875 | + * @pfmemalloc: skbuff was allocated from PFMEMALLOC reserves |
1876 | * @ndisc_nodetype: router type (from link layer) |
1877 | * @ooo_okay: allow the mapping of a socket to a queue to be changed |
1878 | * @l4_hash: indicate hash is a canonical 4-tuple hash over transport |
1879 | @@ -733,7 +734,7 @@ struct sk_buff { |
1880 | peeked:1, |
1881 | head_frag:1, |
1882 | xmit_more:1, |
1883 | - __unused:1; /* one bit hole */ |
1884 | + pfmemalloc:1; |
1885 | |
1886 | /* fields enclosed in headers_start/headers_end are copied |
1887 | * using a single memcpy() in __copy_skb_header() |
1888 | @@ -752,31 +753,30 @@ struct sk_buff { |
1889 | |
1890 | __u8 __pkt_type_offset[0]; |
1891 | __u8 pkt_type:3; |
1892 | - __u8 pfmemalloc:1; |
1893 | __u8 ignore_df:1; |
1894 | - |
1895 | __u8 nf_trace:1; |
1896 | __u8 ip_summed:2; |
1897 | __u8 ooo_okay:1; |
1898 | + |
1899 | __u8 l4_hash:1; |
1900 | __u8 sw_hash:1; |
1901 | __u8 wifi_acked_valid:1; |
1902 | __u8 wifi_acked:1; |
1903 | - |
1904 | __u8 no_fcs:1; |
1905 | /* Indicates the inner headers are valid in the skbuff. */ |
1906 | __u8 encapsulation:1; |
1907 | __u8 encap_hdr_csum:1; |
1908 | __u8 csum_valid:1; |
1909 | + |
1910 | __u8 csum_complete_sw:1; |
1911 | __u8 csum_level:2; |
1912 | __u8 csum_not_inet:1; |
1913 | - |
1914 | __u8 dst_pending_confirm:1; |
1915 | #ifdef CONFIG_IPV6_NDISC_NODETYPE |
1916 | __u8 ndisc_nodetype:2; |
1917 | #endif |
1918 | __u8 ipvs_property:1; |
1919 | + |
1920 | __u8 inner_protocol_type:1; |
1921 | __u8 remcsum_offload:1; |
1922 | #ifdef CONFIG_NET_SWITCHDEV |
1923 | diff --git a/include/net/ipv6.h b/include/net/ipv6.h |
1924 | index a406f2e8680a..aeebbbb9e0bd 100644 |
1925 | --- a/include/net/ipv6.h |
1926 | +++ b/include/net/ipv6.h |
1927 | @@ -829,7 +829,7 @@ static inline __be32 ip6_make_flowlabel(struct net *net, struct sk_buff *skb, |
1928 | * to minimize possbility that any useful information to an |
1929 | * attacker is leaked. Only lower 20 bits are relevant. |
1930 | */ |
1931 | - rol32(hash, 16); |
1932 | + hash = rol32(hash, 16); |
1933 | |
1934 | flowlabel = (__force __be32)hash & IPV6_FLOWLABEL_MASK; |
1935 | |
1936 | diff --git a/include/net/sctp/sctp.h b/include/net/sctp/sctp.h |
1937 | index 35498e613ff5..edfa9d0f6005 100644 |
1938 | --- a/include/net/sctp/sctp.h |
1939 | +++ b/include/net/sctp/sctp.h |
1940 | @@ -609,10 +609,15 @@ static inline struct dst_entry *sctp_transport_dst_check(struct sctp_transport * |
1941 | return t->dst; |
1942 | } |
1943 | |
1944 | +static inline __u32 sctp_dst_mtu(const struct dst_entry *dst) |
1945 | +{ |
1946 | + return SCTP_TRUNC4(max_t(__u32, dst_mtu(dst), |
1947 | + SCTP_DEFAULT_MINSEGMENT)); |
1948 | +} |
1949 | + |
1950 | static inline bool sctp_transport_pmtu_check(struct sctp_transport *t) |
1951 | { |
1952 | - __u32 pmtu = max_t(size_t, SCTP_TRUNC4(dst_mtu(t->dst)), |
1953 | - SCTP_DEFAULT_MINSEGMENT); |
1954 | + __u32 pmtu = sctp_dst_mtu(t->dst); |
1955 | |
1956 | if (t->pathmtu == pmtu) |
1957 | return true; |
1958 | diff --git a/kernel/stop_machine.c b/kernel/stop_machine.c |
1959 | index 64c0291b579c..2f6fa95de2d8 100644 |
1960 | --- a/kernel/stop_machine.c |
1961 | +++ b/kernel/stop_machine.c |
1962 | @@ -270,7 +270,11 @@ static int cpu_stop_queue_two_works(int cpu1, struct cpu_stop_work *work1, |
1963 | goto retry; |
1964 | } |
1965 | |
1966 | - wake_up_q(&wakeq); |
1967 | + if (!err) { |
1968 | + preempt_disable(); |
1969 | + wake_up_q(&wakeq); |
1970 | + preempt_enable(); |
1971 | + } |
1972 | |
1973 | return err; |
1974 | } |
1975 | diff --git a/lib/rhashtable.c b/lib/rhashtable.c |
1976 | index 2b2b79974b61..240a8b864d5b 100644 |
1977 | --- a/lib/rhashtable.c |
1978 | +++ b/lib/rhashtable.c |
1979 | @@ -923,8 +923,16 @@ EXPORT_SYMBOL_GPL(rhashtable_walk_stop); |
1980 | |
1981 | static size_t rounded_hashtable_size(const struct rhashtable_params *params) |
1982 | { |
1983 | - return max(roundup_pow_of_two(params->nelem_hint * 4 / 3), |
1984 | - (unsigned long)params->min_size); |
1985 | + size_t retsize; |
1986 | + |
1987 | + if (params->nelem_hint) |
1988 | + retsize = max(roundup_pow_of_two(params->nelem_hint * 4 / 3), |
1989 | + (unsigned long)params->min_size); |
1990 | + else |
1991 | + retsize = max(HASH_DEFAULT_SIZE, |
1992 | + (unsigned long)params->min_size); |
1993 | + |
1994 | + return retsize; |
1995 | } |
1996 | |
1997 | static u32 rhashtable_jhash2(const void *key, u32 length, u32 seed) |
1998 | @@ -981,8 +989,6 @@ int rhashtable_init(struct rhashtable *ht, |
1999 | struct bucket_table *tbl; |
2000 | size_t size; |
2001 | |
2002 | - size = HASH_DEFAULT_SIZE; |
2003 | - |
2004 | if ((!params->key_len && !params->obj_hashfn) || |
2005 | (params->obj_hashfn && !params->obj_cmpfn)) |
2006 | return -EINVAL; |
2007 | @@ -1009,8 +1015,7 @@ int rhashtable_init(struct rhashtable *ht, |
2008 | |
2009 | ht->p.min_size = max_t(u16, ht->p.min_size, HASH_MIN_SIZE); |
2010 | |
2011 | - if (params->nelem_hint) |
2012 | - size = rounded_hashtable_size(&ht->p); |
2013 | + size = rounded_hashtable_size(&ht->p); |
2014 | |
2015 | if (params->locks_mul) |
2016 | ht->p.locks_mul = roundup_pow_of_two(params->locks_mul); |
2017 | @@ -1102,13 +1107,14 @@ void rhashtable_free_and_destroy(struct rhashtable *ht, |
2018 | void (*free_fn)(void *ptr, void *arg), |
2019 | void *arg) |
2020 | { |
2021 | - struct bucket_table *tbl; |
2022 | + struct bucket_table *tbl, *next_tbl; |
2023 | unsigned int i; |
2024 | |
2025 | cancel_work_sync(&ht->run_work); |
2026 | |
2027 | mutex_lock(&ht->mutex); |
2028 | tbl = rht_dereference(ht->tbl, ht); |
2029 | +restart: |
2030 | if (free_fn) { |
2031 | for (i = 0; i < tbl->size; i++) { |
2032 | struct rhash_head *pos, *next; |
2033 | @@ -1125,7 +1131,12 @@ void rhashtable_free_and_destroy(struct rhashtable *ht, |
2034 | } |
2035 | } |
2036 | |
2037 | + next_tbl = rht_dereference(tbl->future_tbl, ht); |
2038 | bucket_table_free(tbl); |
2039 | + if (next_tbl) { |
2040 | + tbl = next_tbl; |
2041 | + goto restart; |
2042 | + } |
2043 | mutex_unlock(&ht->mutex); |
2044 | } |
2045 | EXPORT_SYMBOL_GPL(rhashtable_free_and_destroy); |
2046 | diff --git a/mm/huge_memory.c b/mm/huge_memory.c |
2047 | index b9f3dbd885bd..327e12679dd5 100644 |
2048 | --- a/mm/huge_memory.c |
2049 | +++ b/mm/huge_memory.c |
2050 | @@ -2087,6 +2087,8 @@ static void __split_huge_pmd_locked(struct vm_area_struct *vma, pmd_t *pmd, |
2051 | if (vma_is_dax(vma)) |
2052 | return; |
2053 | page = pmd_page(_pmd); |
2054 | + if (!PageDirty(page) && pmd_dirty(_pmd)) |
2055 | + set_page_dirty(page); |
2056 | if (!PageReferenced(page) && pmd_young(_pmd)) |
2057 | SetPageReferenced(page); |
2058 | page_remove_rmap(page, true); |
2059 | diff --git a/mm/memcontrol.c b/mm/memcontrol.c |
2060 | index 2bd3df3d101a..95c0980a6f7e 100644 |
2061 | --- a/mm/memcontrol.c |
2062 | +++ b/mm/memcontrol.c |
2063 | @@ -850,7 +850,7 @@ static void invalidate_reclaim_iterators(struct mem_cgroup *dead_memcg) |
2064 | int nid; |
2065 | int i; |
2066 | |
2067 | - while ((memcg = parent_mem_cgroup(memcg))) { |
2068 | + for (; memcg; memcg = parent_mem_cgroup(memcg)) { |
2069 | for_each_node(nid) { |
2070 | mz = mem_cgroup_nodeinfo(memcg, nid); |
2071 | for (i = 0; i <= DEF_PRIORITY; i++) { |
2072 | diff --git a/net/core/gen_stats.c b/net/core/gen_stats.c |
2073 | index b2b2323bdc84..188d693cb251 100644 |
2074 | --- a/net/core/gen_stats.c |
2075 | +++ b/net/core/gen_stats.c |
2076 | @@ -77,8 +77,20 @@ gnet_stats_start_copy_compat(struct sk_buff *skb, int type, int tc_stats_type, |
2077 | d->lock = lock; |
2078 | spin_lock_bh(lock); |
2079 | } |
2080 | - if (d->tail) |
2081 | - return gnet_stats_copy(d, type, NULL, 0, padattr); |
2082 | + if (d->tail) { |
2083 | + int ret = gnet_stats_copy(d, type, NULL, 0, padattr); |
2084 | + |
2085 | + /* The initial attribute added in gnet_stats_copy() may be |
2086 | + * preceded by a padding attribute, in which case d->tail will |
2087 | + * end up pointing at the padding instead of the real attribute. |
2088 | + * Fix this so gnet_stats_finish_copy() adjusts the length of |
2089 | + * the right attribute. |
2090 | + */ |
2091 | + if (ret == 0 && d->tail->nla_type == padattr) |
2092 | + d->tail = (struct nlattr *)((char *)d->tail + |
2093 | + NLA_ALIGN(d->tail->nla_len)); |
2094 | + return ret; |
2095 | + } |
2096 | |
2097 | return 0; |
2098 | } |
2099 | diff --git a/net/core/skbuff.c b/net/core/skbuff.c |
2100 | index 345b51837ca8..a84d69c047ac 100644 |
2101 | --- a/net/core/skbuff.c |
2102 | +++ b/net/core/skbuff.c |
2103 | @@ -858,6 +858,7 @@ static struct sk_buff *__skb_clone(struct sk_buff *n, struct sk_buff *skb) |
2104 | n->cloned = 1; |
2105 | n->nohdr = 0; |
2106 | n->peeked = 0; |
2107 | + C(pfmemalloc); |
2108 | n->destructor = NULL; |
2109 | C(tail); |
2110 | C(end); |
2111 | diff --git a/net/ipv4/fib_frontend.c b/net/ipv4/fib_frontend.c |
2112 | index e66172aaf241..511d6748ea5f 100644 |
2113 | --- a/net/ipv4/fib_frontend.c |
2114 | +++ b/net/ipv4/fib_frontend.c |
2115 | @@ -300,6 +300,7 @@ __be32 fib_compute_spec_dst(struct sk_buff *skb) |
2116 | if (!ipv4_is_zeronet(ip_hdr(skb)->saddr)) { |
2117 | struct flowi4 fl4 = { |
2118 | .flowi4_iif = LOOPBACK_IFINDEX, |
2119 | + .flowi4_oif = l3mdev_master_ifindex_rcu(dev), |
2120 | .daddr = ip_hdr(skb)->saddr, |
2121 | .flowi4_tos = RT_TOS(ip_hdr(skb)->tos), |
2122 | .flowi4_scope = scope, |
2123 | diff --git a/net/ipv4/sysctl_net_ipv4.c b/net/ipv4/sysctl_net_ipv4.c |
2124 | index 2f600f261690..61e42a3390ba 100644 |
2125 | --- a/net/ipv4/sysctl_net_ipv4.c |
2126 | +++ b/net/ipv4/sysctl_net_ipv4.c |
2127 | @@ -187,8 +187,9 @@ static int ipv4_ping_group_range(struct ctl_table *table, int write, |
2128 | if (write && ret == 0) { |
2129 | low = make_kgid(user_ns, urange[0]); |
2130 | high = make_kgid(user_ns, urange[1]); |
2131 | - if (!gid_valid(low) || !gid_valid(high) || |
2132 | - (urange[1] < urange[0]) || gid_lt(high, low)) { |
2133 | + if (!gid_valid(low) || !gid_valid(high)) |
2134 | + return -EINVAL; |
2135 | + if (urange[1] < urange[0] || gid_lt(high, low)) { |
2136 | low = make_kgid(&init_user_ns, 1); |
2137 | high = make_kgid(&init_user_ns, 0); |
2138 | } |
2139 | diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c |
2140 | index c9d00ef54dec..58e316cf6607 100644 |
2141 | --- a/net/ipv4/tcp.c |
2142 | +++ b/net/ipv4/tcp.c |
2143 | @@ -3524,8 +3524,7 @@ int tcp_abort(struct sock *sk, int err) |
2144 | struct request_sock *req = inet_reqsk(sk); |
2145 | |
2146 | local_bh_disable(); |
2147 | - inet_csk_reqsk_queue_drop_and_put(req->rsk_listener, |
2148 | - req); |
2149 | + inet_csk_reqsk_queue_drop(req->rsk_listener, req); |
2150 | local_bh_enable(); |
2151 | return 0; |
2152 | } |
2153 | diff --git a/net/ipv6/Kconfig b/net/ipv6/Kconfig |
2154 | index 11e4e80cf7e9..0efb914695ac 100644 |
2155 | --- a/net/ipv6/Kconfig |
2156 | +++ b/net/ipv6/Kconfig |
2157 | @@ -108,6 +108,7 @@ config IPV6_MIP6 |
2158 | config IPV6_ILA |
2159 | tristate "IPv6: Identifier Locator Addressing (ILA)" |
2160 | depends on NETFILTER |
2161 | + select DST_CACHE |
2162 | select LWTUNNEL |
2163 | ---help--- |
2164 | Support for IPv6 Identifier Locator Addressing (ILA). |
2165 | diff --git a/net/ipv6/ip6_gre.c b/net/ipv6/ip6_gre.c |
2166 | index 458de353f5d9..1a4d6897d17f 100644 |
2167 | --- a/net/ipv6/ip6_gre.c |
2168 | +++ b/net/ipv6/ip6_gre.c |
2169 | @@ -927,7 +927,6 @@ static netdev_tx_t ip6gre_tunnel_xmit(struct sk_buff *skb, |
2170 | static netdev_tx_t ip6erspan_tunnel_xmit(struct sk_buff *skb, |
2171 | struct net_device *dev) |
2172 | { |
2173 | - struct ipv6hdr *ipv6h = ipv6_hdr(skb); |
2174 | struct ip6_tnl *t = netdev_priv(dev); |
2175 | struct dst_entry *dst = skb_dst(skb); |
2176 | struct net_device_stats *stats; |
2177 | @@ -998,6 +997,8 @@ static netdev_tx_t ip6erspan_tunnel_xmit(struct sk_buff *skb, |
2178 | goto tx_err; |
2179 | } |
2180 | } else { |
2181 | + struct ipv6hdr *ipv6h = ipv6_hdr(skb); |
2182 | + |
2183 | switch (skb->protocol) { |
2184 | case htons(ETH_P_IP): |
2185 | memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt)); |
2186 | diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c |
2187 | index 525051a886bc..3ff9316616d8 100644 |
2188 | --- a/net/ipv6/ndisc.c |
2189 | +++ b/net/ipv6/ndisc.c |
2190 | @@ -811,7 +811,7 @@ static void ndisc_recv_ns(struct sk_buff *skb) |
2191 | return; |
2192 | } |
2193 | } |
2194 | - if (ndopts.nd_opts_nonce) |
2195 | + if (ndopts.nd_opts_nonce && ndopts.nd_opts_nonce->nd_opt_len == 1) |
2196 | memcpy(&nonce, (u8 *)(ndopts.nd_opts_nonce + 1), 6); |
2197 | |
2198 | inc = ipv6_addr_is_multicast(daddr); |
2199 | diff --git a/net/ipv6/route.c b/net/ipv6/route.c |
2200 | index b94345e657f7..3ed4de230830 100644 |
2201 | --- a/net/ipv6/route.c |
2202 | +++ b/net/ipv6/route.c |
2203 | @@ -4274,6 +4274,13 @@ static int ip6_route_multipath_add(struct fib6_config *cfg, |
2204 | err_nh = nh; |
2205 | goto add_errout; |
2206 | } |
2207 | + if (!rt6_qualify_for_ecmp(rt)) { |
2208 | + err = -EINVAL; |
2209 | + NL_SET_ERR_MSG(extack, |
2210 | + "Device only routes can not be added for IPv6 using the multipath API."); |
2211 | + dst_release_immediate(&rt->dst); |
2212 | + goto cleanup; |
2213 | + } |
2214 | |
2215 | /* Because each route is added like a single route we remove |
2216 | * these flags after the first nexthop: if there is a collision, |
2217 | diff --git a/net/sched/sch_fq_codel.c b/net/sched/sch_fq_codel.c |
2218 | index 22fa13cf5d8b..846883907cd4 100644 |
2219 | --- a/net/sched/sch_fq_codel.c |
2220 | +++ b/net/sched/sch_fq_codel.c |
2221 | @@ -479,23 +479,27 @@ static int fq_codel_init(struct Qdisc *sch, struct nlattr *opt, |
2222 | q->cparams.mtu = psched_mtu(qdisc_dev(sch)); |
2223 | |
2224 | if (opt) { |
2225 | - int err = fq_codel_change(sch, opt, extack); |
2226 | + err = fq_codel_change(sch, opt, extack); |
2227 | if (err) |
2228 | - return err; |
2229 | + goto init_failure; |
2230 | } |
2231 | |
2232 | err = tcf_block_get(&q->block, &q->filter_list, sch, extack); |
2233 | if (err) |
2234 | - return err; |
2235 | + goto init_failure; |
2236 | |
2237 | if (!q->flows) { |
2238 | q->flows = kvzalloc(q->flows_cnt * |
2239 | sizeof(struct fq_codel_flow), GFP_KERNEL); |
2240 | - if (!q->flows) |
2241 | - return -ENOMEM; |
2242 | + if (!q->flows) { |
2243 | + err = -ENOMEM; |
2244 | + goto init_failure; |
2245 | + } |
2246 | q->backlogs = kvzalloc(q->flows_cnt * sizeof(u32), GFP_KERNEL); |
2247 | - if (!q->backlogs) |
2248 | - return -ENOMEM; |
2249 | + if (!q->backlogs) { |
2250 | + err = -ENOMEM; |
2251 | + goto alloc_failure; |
2252 | + } |
2253 | for (i = 0; i < q->flows_cnt; i++) { |
2254 | struct fq_codel_flow *flow = q->flows + i; |
2255 | |
2256 | @@ -508,6 +512,13 @@ static int fq_codel_init(struct Qdisc *sch, struct nlattr *opt, |
2257 | else |
2258 | sch->flags &= ~TCQ_F_CAN_BYPASS; |
2259 | return 0; |
2260 | + |
2261 | +alloc_failure: |
2262 | + kvfree(q->flows); |
2263 | + q->flows = NULL; |
2264 | +init_failure: |
2265 | + q->flows_cnt = 0; |
2266 | + return err; |
2267 | } |
2268 | |
2269 | static int fq_codel_dump(struct Qdisc *sch, struct sk_buff *skb) |
2270 | diff --git a/net/sctp/associola.c b/net/sctp/associola.c |
2271 | index a47179da24e6..ef8adac1be83 100644 |
2272 | --- a/net/sctp/associola.c |
2273 | +++ b/net/sctp/associola.c |
2274 | @@ -1446,11 +1446,9 @@ void sctp_assoc_sync_pmtu(struct sctp_association *asoc) |
2275 | return; |
2276 | |
2277 | /* Get the lowest pmtu of all the transports. */ |
2278 | - list_for_each_entry(t, &asoc->peer.transport_addr_list, |
2279 | - transports) { |
2280 | + list_for_each_entry(t, &asoc->peer.transport_addr_list, transports) { |
2281 | if (t->pmtu_pending && t->dst) { |
2282 | - sctp_transport_update_pmtu( |
2283 | - t, SCTP_TRUNC4(dst_mtu(t->dst))); |
2284 | + sctp_transport_update_pmtu(t, sctp_dst_mtu(t->dst)); |
2285 | t->pmtu_pending = 0; |
2286 | } |
2287 | if (!pmtu || (t->pathmtu < pmtu)) |
2288 | diff --git a/net/sctp/transport.c b/net/sctp/transport.c |
2289 | index 03fc2c427aca..e890ceb55939 100644 |
2290 | --- a/net/sctp/transport.c |
2291 | +++ b/net/sctp/transport.c |
2292 | @@ -242,9 +242,9 @@ void sctp_transport_pmtu(struct sctp_transport *transport, struct sock *sk) |
2293 | &transport->fl, sk); |
2294 | } |
2295 | |
2296 | - if (transport->dst) { |
2297 | - transport->pathmtu = SCTP_TRUNC4(dst_mtu(transport->dst)); |
2298 | - } else |
2299 | + if (transport->dst) |
2300 | + transport->pathmtu = sctp_dst_mtu(transport->dst); |
2301 | + else |
2302 | transport->pathmtu = SCTP_DEFAULT_MAXSEGMENT; |
2303 | } |
2304 | |
2305 | @@ -273,7 +273,7 @@ bool sctp_transport_update_pmtu(struct sctp_transport *t, u32 pmtu) |
2306 | |
2307 | if (dst) { |
2308 | /* Re-fetch, as under layers may have a higher minimum size */ |
2309 | - pmtu = SCTP_TRUNC4(dst_mtu(dst)); |
2310 | + pmtu = sctp_dst_mtu(dst); |
2311 | change = t->pathmtu != pmtu; |
2312 | } |
2313 | t->pathmtu = pmtu; |
2314 | diff --git a/sound/core/rawmidi.c b/sound/core/rawmidi.c |
2315 | index 69616d00481c..b53026a72e73 100644 |
2316 | --- a/sound/core/rawmidi.c |
2317 | +++ b/sound/core/rawmidi.c |
2318 | @@ -635,7 +635,7 @@ static int snd_rawmidi_info_select_user(struct snd_card *card, |
2319 | int snd_rawmidi_output_params(struct snd_rawmidi_substream *substream, |
2320 | struct snd_rawmidi_params * params) |
2321 | { |
2322 | - char *newbuf; |
2323 | + char *newbuf, *oldbuf; |
2324 | struct snd_rawmidi_runtime *runtime = substream->runtime; |
2325 | |
2326 | if (substream->append && substream->use_count > 1) |
2327 | @@ -648,13 +648,17 @@ int snd_rawmidi_output_params(struct snd_rawmidi_substream *substream, |
2328 | return -EINVAL; |
2329 | } |
2330 | if (params->buffer_size != runtime->buffer_size) { |
2331 | - newbuf = krealloc(runtime->buffer, params->buffer_size, |
2332 | - GFP_KERNEL); |
2333 | + newbuf = kmalloc(params->buffer_size, GFP_KERNEL); |
2334 | if (!newbuf) |
2335 | return -ENOMEM; |
2336 | + spin_lock_irq(&runtime->lock); |
2337 | + oldbuf = runtime->buffer; |
2338 | runtime->buffer = newbuf; |
2339 | runtime->buffer_size = params->buffer_size; |
2340 | runtime->avail = runtime->buffer_size; |
2341 | + runtime->appl_ptr = runtime->hw_ptr = 0; |
2342 | + spin_unlock_irq(&runtime->lock); |
2343 | + kfree(oldbuf); |
2344 | } |
2345 | runtime->avail_min = params->avail_min; |
2346 | substream->active_sensing = !params->no_active_sensing; |
2347 | @@ -665,7 +669,7 @@ EXPORT_SYMBOL(snd_rawmidi_output_params); |
2348 | int snd_rawmidi_input_params(struct snd_rawmidi_substream *substream, |
2349 | struct snd_rawmidi_params * params) |
2350 | { |
2351 | - char *newbuf; |
2352 | + char *newbuf, *oldbuf; |
2353 | struct snd_rawmidi_runtime *runtime = substream->runtime; |
2354 | |
2355 | snd_rawmidi_drain_input(substream); |
2356 | @@ -676,12 +680,16 @@ int snd_rawmidi_input_params(struct snd_rawmidi_substream *substream, |
2357 | return -EINVAL; |
2358 | } |
2359 | if (params->buffer_size != runtime->buffer_size) { |
2360 | - newbuf = krealloc(runtime->buffer, params->buffer_size, |
2361 | - GFP_KERNEL); |
2362 | + newbuf = kmalloc(params->buffer_size, GFP_KERNEL); |
2363 | if (!newbuf) |
2364 | return -ENOMEM; |
2365 | + spin_lock_irq(&runtime->lock); |
2366 | + oldbuf = runtime->buffer; |
2367 | runtime->buffer = newbuf; |
2368 | runtime->buffer_size = params->buffer_size; |
2369 | + runtime->appl_ptr = runtime->hw_ptr = 0; |
2370 | + spin_unlock_irq(&runtime->lock); |
2371 | + kfree(oldbuf); |
2372 | } |
2373 | runtime->avail_min = params->avail_min; |
2374 | return 0; |
2375 | diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c |
2376 | index ba9a7e552183..88ce2f1022e1 100644 |
2377 | --- a/sound/pci/hda/patch_conexant.c |
2378 | +++ b/sound/pci/hda/patch_conexant.c |
2379 | @@ -965,6 +965,7 @@ static const struct snd_pci_quirk cxt5066_fixups[] = { |
2380 | SND_PCI_QUIRK(0x103c, 0x8115, "HP Z1 Gen3", CXT_FIXUP_HP_GATE_MIC), |
2381 | SND_PCI_QUIRK(0x103c, 0x814f, "HP ZBook 15u G3", CXT_FIXUP_MUTE_LED_GPIO), |
2382 | SND_PCI_QUIRK(0x103c, 0x822e, "HP ProBook 440 G4", CXT_FIXUP_MUTE_LED_GPIO), |
2383 | + SND_PCI_QUIRK(0x103c, 0x836e, "HP ProBook 455 G5", CXT_FIXUP_MUTE_LED_GPIO), |
2384 | SND_PCI_QUIRK(0x103c, 0x8299, "HP 800 G3 SFF", CXT_FIXUP_HP_MIC_NO_PRESENCE), |
2385 | SND_PCI_QUIRK(0x103c, 0x829a, "HP 800 G3 DM", CXT_FIXUP_HP_MIC_NO_PRESENCE), |
2386 | SND_PCI_QUIRK(0x103c, 0x8455, "HP Z2 G4", CXT_FIXUP_HP_MIC_NO_PRESENCE), |
2387 | diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c |
2388 | index 066efe783fe8..7bba415cb850 100644 |
2389 | --- a/sound/pci/hda/patch_realtek.c |
2390 | +++ b/sound/pci/hda/patch_realtek.c |
2391 | @@ -2363,6 +2363,7 @@ static const struct snd_pci_quirk alc882_fixup_tbl[] = { |
2392 | SND_PCI_QUIRK_VENDOR(0x1462, "MSI", ALC882_FIXUP_GPIO3), |
2393 | SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", ALC882_FIXUP_ABIT_AW9D_MAX), |
2394 | SND_PCI_QUIRK(0x1558, 0x9501, "Clevo P950HR", ALC1220_FIXUP_CLEVO_P950), |
2395 | + SND_PCI_QUIRK(0x1558, 0x95e1, "Clevo P95xER", ALC1220_FIXUP_CLEVO_P950), |
2396 | SND_PCI_QUIRK(0x1558, 0x95e2, "Clevo P950ER", ALC1220_FIXUP_CLEVO_P950), |
2397 | SND_PCI_QUIRK_VENDOR(0x1558, "Clevo laptop", ALC882_FIXUP_EAPD), |
2398 | SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_FIXUP_EAPD), |
2399 | @@ -6543,6 +6544,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { |
2400 | SND_PCI_QUIRK(0x10cf, 0x1629, "Lifebook U7x7", ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC), |
2401 | SND_PCI_QUIRK(0x10cf, 0x1845, "Lifebook U904", ALC269_FIXUP_LIFEBOOK_EXTMIC), |
2402 | SND_PCI_QUIRK(0x10ec, 0x10f2, "Intel Reference board", ALC700_FIXUP_INTEL_REFERENCE), |
2403 | + SND_PCI_QUIRK(0x10f7, 0x8338, "Panasonic CF-SZ6", ALC269_FIXUP_HEADSET_MODE), |
2404 | SND_PCI_QUIRK(0x144d, 0xc109, "Samsung Ativ book 9 (NP900X3G)", ALC269_FIXUP_INV_DMIC), |
2405 | SND_PCI_QUIRK(0x144d, 0xc740, "Samsung Ativ book 8 (NP870Z5G)", ALC269_FIXUP_ATIV_BOOK_8), |
2406 | SND_PCI_QUIRK(0x1458, 0xfa53, "Gigabyte BXBT-2807", ALC283_FIXUP_HEADSET_MIC), |
2407 | diff --git a/virt/kvm/eventfd.c b/virt/kvm/eventfd.c |
2408 | index 6e865e8b5b10..fe6eb0fe07f6 100644 |
2409 | --- a/virt/kvm/eventfd.c |
2410 | +++ b/virt/kvm/eventfd.c |
2411 | @@ -119,8 +119,12 @@ irqfd_shutdown(struct work_struct *work) |
2412 | { |
2413 | struct kvm_kernel_irqfd *irqfd = |
2414 | container_of(work, struct kvm_kernel_irqfd, shutdown); |
2415 | + struct kvm *kvm = irqfd->kvm; |
2416 | u64 cnt; |
2417 | |
2418 | + /* Make sure irqfd has been initalized in assign path. */ |
2419 | + synchronize_srcu(&kvm->irq_srcu); |
2420 | + |
2421 | /* |
2422 | * Synchronize with the wait-queue and unhook ourselves to prevent |
2423 | * further events. |
2424 | @@ -387,7 +391,6 @@ kvm_irqfd_assign(struct kvm *kvm, struct kvm_irqfd *args) |
2425 | |
2426 | idx = srcu_read_lock(&kvm->irq_srcu); |
2427 | irqfd_update(kvm, irqfd); |
2428 | - srcu_read_unlock(&kvm->irq_srcu, idx); |
2429 | |
2430 | list_add_tail(&irqfd->list, &kvm->irqfds.items); |
2431 | |
2432 | @@ -402,11 +405,6 @@ kvm_irqfd_assign(struct kvm *kvm, struct kvm_irqfd *args) |
2433 | if (events & EPOLLIN) |
2434 | schedule_work(&irqfd->inject); |
2435 | |
2436 | - /* |
2437 | - * do not drop the file until the irqfd is fully initialized, otherwise |
2438 | - * we might race against the EPOLLHUP |
2439 | - */ |
2440 | - fdput(f); |
2441 | #ifdef CONFIG_HAVE_KVM_IRQ_BYPASS |
2442 | if (kvm_arch_has_irq_bypass()) { |
2443 | irqfd->consumer.token = (void *)irqfd->eventfd; |
2444 | @@ -421,6 +419,13 @@ kvm_irqfd_assign(struct kvm *kvm, struct kvm_irqfd *args) |
2445 | } |
2446 | #endif |
2447 | |
2448 | + srcu_read_unlock(&kvm->irq_srcu, idx); |
2449 | + |
2450 | + /* |
2451 | + * do not drop the file until the irqfd is fully initialized, otherwise |
2452 | + * we might race against the EPOLLHUP |
2453 | + */ |
2454 | + fdput(f); |
2455 | return 0; |
2456 | |
2457 | fail: |