Contents of /trunk/kernel-alx/patches-5.4/0122-5.4.23-all-fixes.patch
Parent Directory | Revision Log
Revision 3503 -
(show annotations)
(download)
Mon May 11 14:36:24 2020 UTC (4 years, 4 months ago) by niro
File size: 201423 byte(s)
Mon May 11 14:36:24 2020 UTC (4 years, 4 months ago) by niro
File size: 201423 byte(s)
-linux-5.4.23
1 | diff --git a/Documentation/arm64/tagged-address-abi.rst b/Documentation/arm64/tagged-address-abi.rst |
2 | index d4a85d535bf9..4a9d9c794ee5 100644 |
3 | --- a/Documentation/arm64/tagged-address-abi.rst |
4 | +++ b/Documentation/arm64/tagged-address-abi.rst |
5 | @@ -44,8 +44,15 @@ The AArch64 Tagged Address ABI has two stages of relaxation depending |
6 | how the user addresses are used by the kernel: |
7 | |
8 | 1. User addresses not accessed by the kernel but used for address space |
9 | - management (e.g. ``mmap()``, ``mprotect()``, ``madvise()``). The use |
10 | - of valid tagged pointers in this context is always allowed. |
11 | + management (e.g. ``mprotect()``, ``madvise()``). The use of valid |
12 | + tagged pointers in this context is allowed with the exception of |
13 | + ``brk()``, ``mmap()`` and the ``new_address`` argument to |
14 | + ``mremap()`` as these have the potential to alias with existing |
15 | + user addresses. |
16 | + |
17 | + NOTE: This behaviour changed in v5.6 and so some earlier kernels may |
18 | + incorrectly accept valid tagged pointers for the ``brk()``, |
19 | + ``mmap()`` and ``mremap()`` system calls. |
20 | |
21 | 2. User addresses accessed by the kernel (e.g. ``write()``). This ABI |
22 | relaxation is disabled by default and the application thread needs to |
23 | diff --git a/MAINTAINERS b/MAINTAINERS |
24 | index d1aeebb59e6a..fe6fa5d3a63e 100644 |
25 | --- a/MAINTAINERS |
26 | +++ b/MAINTAINERS |
27 | @@ -8201,7 +8201,7 @@ M: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> |
28 | M: Rodrigo Vivi <rodrigo.vivi@intel.com> |
29 | L: intel-gfx@lists.freedesktop.org |
30 | W: https://01.org/linuxgraphics/ |
31 | -B: https://01.org/linuxgraphics/documentation/how-report-bugs |
32 | +B: https://gitlab.freedesktop.org/drm/intel/-/wikis/How-to-file-i915-bugs |
33 | C: irc://chat.freenode.net/intel-gfx |
34 | Q: http://patchwork.freedesktop.org/project/intel-gfx/ |
35 | T: git git://anongit.freedesktop.org/drm-intel |
36 | diff --git a/Makefile b/Makefile |
37 | index 9428ec3b611a..af5e90075514 100644 |
38 | --- a/Makefile |
39 | +++ b/Makefile |
40 | @@ -1,7 +1,7 @@ |
41 | # SPDX-License-Identifier: GPL-2.0 |
42 | VERSION = 5 |
43 | PATCHLEVEL = 4 |
44 | -SUBLEVEL = 22 |
45 | +SUBLEVEL = 23 |
46 | EXTRAVERSION = |
47 | NAME = Kleptomaniac Octopus |
48 | |
49 | diff --git a/arch/arm64/include/asm/lse.h b/arch/arm64/include/asm/lse.h |
50 | index 73834996c4b6..5de132100b6d 100644 |
51 | --- a/arch/arm64/include/asm/lse.h |
52 | +++ b/arch/arm64/include/asm/lse.h |
53 | @@ -6,7 +6,7 @@ |
54 | |
55 | #if defined(CONFIG_AS_LSE) && defined(CONFIG_ARM64_LSE_ATOMICS) |
56 | |
57 | -#define __LSE_PREAMBLE ".arch armv8-a+lse\n" |
58 | +#define __LSE_PREAMBLE ".arch_extension lse\n" |
59 | |
60 | #include <linux/compiler_types.h> |
61 | #include <linux/export.h> |
62 | diff --git a/arch/arm64/include/asm/memory.h b/arch/arm64/include/asm/memory.h |
63 | index c23c47360664..08df42e4db96 100644 |
64 | --- a/arch/arm64/include/asm/memory.h |
65 | +++ b/arch/arm64/include/asm/memory.h |
66 | @@ -219,7 +219,7 @@ static inline unsigned long kaslr_offset(void) |
67 | ((__force __typeof__(addr))sign_extend64((__force u64)(addr), 55)) |
68 | |
69 | #define untagged_addr(addr) ({ \ |
70 | - u64 __addr = (__force u64)addr; \ |
71 | + u64 __addr = (__force u64)(addr); \ |
72 | __addr &= __untagged_addr(__addr); \ |
73 | (__force __typeof__(addr))__addr; \ |
74 | }) |
75 | diff --git a/arch/powerpc/include/asm/page.h b/arch/powerpc/include/asm/page.h |
76 | index c8bb14ff4713..6ba5adb96a3b 100644 |
77 | --- a/arch/powerpc/include/asm/page.h |
78 | +++ b/arch/powerpc/include/asm/page.h |
79 | @@ -295,8 +295,13 @@ static inline bool pfn_valid(unsigned long pfn) |
80 | /* |
81 | * Some number of bits at the level of the page table that points to |
82 | * a hugepte are used to encode the size. This masks those bits. |
83 | + * On 8xx, HW assistance requires 4k alignment for the hugepte. |
84 | */ |
85 | +#ifdef CONFIG_PPC_8xx |
86 | +#define HUGEPD_SHIFT_MASK 0xfff |
87 | +#else |
88 | #define HUGEPD_SHIFT_MASK 0x3f |
89 | +#endif |
90 | |
91 | #ifndef __ASSEMBLY__ |
92 | |
93 | diff --git a/arch/powerpc/kernel/eeh_driver.c b/arch/powerpc/kernel/eeh_driver.c |
94 | index 2fb166928e91..4fd7efdf2a53 100644 |
95 | --- a/arch/powerpc/kernel/eeh_driver.c |
96 | +++ b/arch/powerpc/kernel/eeh_driver.c |
97 | @@ -1200,6 +1200,17 @@ void eeh_handle_special_event(void) |
98 | eeh_pe_state_mark(pe, EEH_PE_RECOVERING); |
99 | eeh_handle_normal_event(pe); |
100 | } else { |
101 | + eeh_for_each_pe(pe, tmp_pe) |
102 | + eeh_pe_for_each_dev(tmp_pe, edev, tmp_edev) |
103 | + edev->mode &= ~EEH_DEV_NO_HANDLER; |
104 | + |
105 | + /* Notify all devices to be down */ |
106 | + eeh_pe_state_clear(pe, EEH_PE_PRI_BUS, true); |
107 | + eeh_set_channel_state(pe, pci_channel_io_perm_failure); |
108 | + eeh_pe_report( |
109 | + "error_detected(permanent failure)", pe, |
110 | + eeh_report_failure, NULL); |
111 | + |
112 | pci_lock_rescan_remove(); |
113 | list_for_each_entry(hose, &hose_list, list_node) { |
114 | phb_pe = eeh_phb_pe_get(hose); |
115 | @@ -1208,16 +1219,6 @@ void eeh_handle_special_event(void) |
116 | (phb_pe->state & EEH_PE_RECOVERING)) |
117 | continue; |
118 | |
119 | - eeh_for_each_pe(pe, tmp_pe) |
120 | - eeh_pe_for_each_dev(tmp_pe, edev, tmp_edev) |
121 | - edev->mode &= ~EEH_DEV_NO_HANDLER; |
122 | - |
123 | - /* Notify all devices to be down */ |
124 | - eeh_pe_state_clear(pe, EEH_PE_PRI_BUS, true); |
125 | - eeh_set_channel_state(pe, pci_channel_io_perm_failure); |
126 | - eeh_pe_report( |
127 | - "error_detected(permanent failure)", pe, |
128 | - eeh_report_failure, NULL); |
129 | bus = eeh_pe_bus_get(phb_pe); |
130 | if (!bus) { |
131 | pr_err("%s: Cannot find PCI bus for " |
132 | diff --git a/arch/powerpc/kernel/entry_32.S b/arch/powerpc/kernel/entry_32.S |
133 | index 59bb4f4ae316..13f699256258 100644 |
134 | --- a/arch/powerpc/kernel/entry_32.S |
135 | +++ b/arch/powerpc/kernel/entry_32.S |
136 | @@ -778,7 +778,7 @@ fast_exception_return: |
137 | 1: lis r3,exc_exit_restart_end@ha |
138 | addi r3,r3,exc_exit_restart_end@l |
139 | cmplw r12,r3 |
140 | -#if CONFIG_PPC_BOOK3S_601 |
141 | +#ifdef CONFIG_PPC_BOOK3S_601 |
142 | bge 2b |
143 | #else |
144 | bge 3f |
145 | @@ -786,7 +786,7 @@ fast_exception_return: |
146 | lis r4,exc_exit_restart@ha |
147 | addi r4,r4,exc_exit_restart@l |
148 | cmplw r12,r4 |
149 | -#if CONFIG_PPC_BOOK3S_601 |
150 | +#ifdef CONFIG_PPC_BOOK3S_601 |
151 | blt 2b |
152 | #else |
153 | blt 3f |
154 | diff --git a/arch/powerpc/kernel/head_8xx.S b/arch/powerpc/kernel/head_8xx.S |
155 | index 19f583e18402..98d8b6832fcb 100644 |
156 | --- a/arch/powerpc/kernel/head_8xx.S |
157 | +++ b/arch/powerpc/kernel/head_8xx.S |
158 | @@ -289,7 +289,7 @@ InstructionTLBMiss: |
159 | * set. All other Linux PTE bits control the behavior |
160 | * of the MMU. |
161 | */ |
162 | - rlwimi r10, r10, 0, 0x0f00 /* Clear bits 20-23 */ |
163 | + rlwinm r10, r10, 0, ~0x0f00 /* Clear bits 20-23 */ |
164 | rlwimi r10, r10, 4, 0x0400 /* Copy _PAGE_EXEC into bit 21 */ |
165 | ori r10, r10, RPN_PATTERN | 0x200 /* Set 22 and 24-27 */ |
166 | mtspr SPRN_MI_RPN, r10 /* Update TLB entry */ |
167 | diff --git a/arch/powerpc/kernel/signal.c b/arch/powerpc/kernel/signal.c |
168 | index e6c30cee6abf..d215f9554553 100644 |
169 | --- a/arch/powerpc/kernel/signal.c |
170 | +++ b/arch/powerpc/kernel/signal.c |
171 | @@ -200,14 +200,27 @@ unsigned long get_tm_stackpointer(struct task_struct *tsk) |
172 | * normal/non-checkpointed stack pointer. |
173 | */ |
174 | |
175 | + unsigned long ret = tsk->thread.regs->gpr[1]; |
176 | + |
177 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM |
178 | BUG_ON(tsk != current); |
179 | |
180 | if (MSR_TM_ACTIVE(tsk->thread.regs->msr)) { |
181 | + preempt_disable(); |
182 | tm_reclaim_current(TM_CAUSE_SIGNAL); |
183 | if (MSR_TM_TRANSACTIONAL(tsk->thread.regs->msr)) |
184 | - return tsk->thread.ckpt_regs.gpr[1]; |
185 | + ret = tsk->thread.ckpt_regs.gpr[1]; |
186 | + |
187 | + /* |
188 | + * If we treclaim, we must clear the current thread's TM bits |
189 | + * before re-enabling preemption. Otherwise we might be |
190 | + * preempted and have the live MSR[TS] changed behind our back |
191 | + * (tm_recheckpoint_new_task() would recheckpoint). Besides, we |
192 | + * enter the signal handler in non-transactional state. |
193 | + */ |
194 | + tsk->thread.regs->msr &= ~MSR_TS_MASK; |
195 | + preempt_enable(); |
196 | } |
197 | #endif |
198 | - return tsk->thread.regs->gpr[1]; |
199 | + return ret; |
200 | } |
201 | diff --git a/arch/powerpc/kernel/signal_32.c b/arch/powerpc/kernel/signal_32.c |
202 | index 98600b276f76..1b090a76b444 100644 |
203 | --- a/arch/powerpc/kernel/signal_32.c |
204 | +++ b/arch/powerpc/kernel/signal_32.c |
205 | @@ -489,19 +489,11 @@ static int save_user_regs(struct pt_regs *regs, struct mcontext __user *frame, |
206 | */ |
207 | static int save_tm_user_regs(struct pt_regs *regs, |
208 | struct mcontext __user *frame, |
209 | - struct mcontext __user *tm_frame, int sigret) |
210 | + struct mcontext __user *tm_frame, int sigret, |
211 | + unsigned long msr) |
212 | { |
213 | - unsigned long msr = regs->msr; |
214 | - |
215 | WARN_ON(tm_suspend_disabled); |
216 | |
217 | - /* Remove TM bits from thread's MSR. The MSR in the sigcontext |
218 | - * just indicates to userland that we were doing a transaction, but we |
219 | - * don't want to return in transactional state. This also ensures |
220 | - * that flush_fp_to_thread won't set TIF_RESTORE_TM again. |
221 | - */ |
222 | - regs->msr &= ~MSR_TS_MASK; |
223 | - |
224 | /* Save both sets of general registers */ |
225 | if (save_general_regs(¤t->thread.ckpt_regs, frame) |
226 | || save_general_regs(regs, tm_frame)) |
227 | @@ -912,6 +904,10 @@ int handle_rt_signal32(struct ksignal *ksig, sigset_t *oldset, |
228 | int sigret; |
229 | unsigned long tramp; |
230 | struct pt_regs *regs = tsk->thread.regs; |
231 | +#ifdef CONFIG_PPC_TRANSACTIONAL_MEM |
232 | + /* Save the thread's msr before get_tm_stackpointer() changes it */ |
233 | + unsigned long msr = regs->msr; |
234 | +#endif |
235 | |
236 | BUG_ON(tsk != current); |
237 | |
238 | @@ -944,13 +940,13 @@ int handle_rt_signal32(struct ksignal *ksig, sigset_t *oldset, |
239 | |
240 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM |
241 | tm_frame = &rt_sf->uc_transact.uc_mcontext; |
242 | - if (MSR_TM_ACTIVE(regs->msr)) { |
243 | + if (MSR_TM_ACTIVE(msr)) { |
244 | if (__put_user((unsigned long)&rt_sf->uc_transact, |
245 | &rt_sf->uc.uc_link) || |
246 | __put_user((unsigned long)tm_frame, |
247 | &rt_sf->uc_transact.uc_regs)) |
248 | goto badframe; |
249 | - if (save_tm_user_regs(regs, frame, tm_frame, sigret)) |
250 | + if (save_tm_user_regs(regs, frame, tm_frame, sigret, msr)) |
251 | goto badframe; |
252 | } |
253 | else |
254 | @@ -1369,6 +1365,10 @@ int handle_signal32(struct ksignal *ksig, sigset_t *oldset, |
255 | int sigret; |
256 | unsigned long tramp; |
257 | struct pt_regs *regs = tsk->thread.regs; |
258 | +#ifdef CONFIG_PPC_TRANSACTIONAL_MEM |
259 | + /* Save the thread's msr before get_tm_stackpointer() changes it */ |
260 | + unsigned long msr = regs->msr; |
261 | +#endif |
262 | |
263 | BUG_ON(tsk != current); |
264 | |
265 | @@ -1402,9 +1402,9 @@ int handle_signal32(struct ksignal *ksig, sigset_t *oldset, |
266 | |
267 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM |
268 | tm_mctx = &frame->mctx_transact; |
269 | - if (MSR_TM_ACTIVE(regs->msr)) { |
270 | + if (MSR_TM_ACTIVE(msr)) { |
271 | if (save_tm_user_regs(regs, &frame->mctx, &frame->mctx_transact, |
272 | - sigret)) |
273 | + sigret, msr)) |
274 | goto badframe; |
275 | } |
276 | else |
277 | diff --git a/arch/powerpc/kernel/signal_64.c b/arch/powerpc/kernel/signal_64.c |
278 | index 117515564ec7..84ed2e77ef9c 100644 |
279 | --- a/arch/powerpc/kernel/signal_64.c |
280 | +++ b/arch/powerpc/kernel/signal_64.c |
281 | @@ -192,7 +192,8 @@ static long setup_sigcontext(struct sigcontext __user *sc, |
282 | static long setup_tm_sigcontexts(struct sigcontext __user *sc, |
283 | struct sigcontext __user *tm_sc, |
284 | struct task_struct *tsk, |
285 | - int signr, sigset_t *set, unsigned long handler) |
286 | + int signr, sigset_t *set, unsigned long handler, |
287 | + unsigned long msr) |
288 | { |
289 | /* When CONFIG_ALTIVEC is set, we _always_ setup v_regs even if the |
290 | * process never used altivec yet (MSR_VEC is zero in pt_regs of |
291 | @@ -207,12 +208,11 @@ static long setup_tm_sigcontexts(struct sigcontext __user *sc, |
292 | elf_vrreg_t __user *tm_v_regs = sigcontext_vmx_regs(tm_sc); |
293 | #endif |
294 | struct pt_regs *regs = tsk->thread.regs; |
295 | - unsigned long msr = tsk->thread.regs->msr; |
296 | long err = 0; |
297 | |
298 | BUG_ON(tsk != current); |
299 | |
300 | - BUG_ON(!MSR_TM_ACTIVE(regs->msr)); |
301 | + BUG_ON(!MSR_TM_ACTIVE(msr)); |
302 | |
303 | WARN_ON(tm_suspend_disabled); |
304 | |
305 | @@ -222,13 +222,6 @@ static long setup_tm_sigcontexts(struct sigcontext __user *sc, |
306 | */ |
307 | msr |= tsk->thread.ckpt_regs.msr & (MSR_FP | MSR_VEC | MSR_VSX); |
308 | |
309 | - /* Remove TM bits from thread's MSR. The MSR in the sigcontext |
310 | - * just indicates to userland that we were doing a transaction, but we |
311 | - * don't want to return in transactional state. This also ensures |
312 | - * that flush_fp_to_thread won't set TIF_RESTORE_TM again. |
313 | - */ |
314 | - regs->msr &= ~MSR_TS_MASK; |
315 | - |
316 | #ifdef CONFIG_ALTIVEC |
317 | err |= __put_user(v_regs, &sc->v_regs); |
318 | err |= __put_user(tm_v_regs, &tm_sc->v_regs); |
319 | @@ -824,6 +817,10 @@ int handle_rt_signal64(struct ksignal *ksig, sigset_t *set, |
320 | unsigned long newsp = 0; |
321 | long err = 0; |
322 | struct pt_regs *regs = tsk->thread.regs; |
323 | +#ifdef CONFIG_PPC_TRANSACTIONAL_MEM |
324 | + /* Save the thread's msr before get_tm_stackpointer() changes it */ |
325 | + unsigned long msr = regs->msr; |
326 | +#endif |
327 | |
328 | BUG_ON(tsk != current); |
329 | |
330 | @@ -841,7 +838,7 @@ int handle_rt_signal64(struct ksignal *ksig, sigset_t *set, |
331 | err |= __put_user(0, &frame->uc.uc_flags); |
332 | err |= __save_altstack(&frame->uc.uc_stack, regs->gpr[1]); |
333 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM |
334 | - if (MSR_TM_ACTIVE(regs->msr)) { |
335 | + if (MSR_TM_ACTIVE(msr)) { |
336 | /* The ucontext_t passed to userland points to the second |
337 | * ucontext_t (for transactional state) with its uc_link ptr. |
338 | */ |
339 | @@ -849,7 +846,8 @@ int handle_rt_signal64(struct ksignal *ksig, sigset_t *set, |
340 | err |= setup_tm_sigcontexts(&frame->uc.uc_mcontext, |
341 | &frame->uc_transact.uc_mcontext, |
342 | tsk, ksig->sig, NULL, |
343 | - (unsigned long)ksig->ka.sa.sa_handler); |
344 | + (unsigned long)ksig->ka.sa.sa_handler, |
345 | + msr); |
346 | } else |
347 | #endif |
348 | { |
349 | diff --git a/arch/powerpc/mm/hugetlbpage.c b/arch/powerpc/mm/hugetlbpage.c |
350 | index 73d4873fc7f8..33b3461d91e8 100644 |
351 | --- a/arch/powerpc/mm/hugetlbpage.c |
352 | +++ b/arch/powerpc/mm/hugetlbpage.c |
353 | @@ -53,20 +53,24 @@ static int __hugepte_alloc(struct mm_struct *mm, hugepd_t *hpdp, |
354 | if (pshift >= pdshift) { |
355 | cachep = PGT_CACHE(PTE_T_ORDER); |
356 | num_hugepd = 1 << (pshift - pdshift); |
357 | + new = NULL; |
358 | } else if (IS_ENABLED(CONFIG_PPC_8xx)) { |
359 | - cachep = PGT_CACHE(PTE_INDEX_SIZE); |
360 | + cachep = NULL; |
361 | num_hugepd = 1; |
362 | + new = pte_alloc_one(mm); |
363 | } else { |
364 | cachep = PGT_CACHE(pdshift - pshift); |
365 | num_hugepd = 1; |
366 | + new = NULL; |
367 | } |
368 | |
369 | - if (!cachep) { |
370 | + if (!cachep && !new) { |
371 | WARN_ONCE(1, "No page table cache created for hugetlb tables"); |
372 | return -ENOMEM; |
373 | } |
374 | |
375 | - new = kmem_cache_alloc(cachep, pgtable_gfp_flags(mm, GFP_KERNEL)); |
376 | + if (cachep) |
377 | + new = kmem_cache_alloc(cachep, pgtable_gfp_flags(mm, GFP_KERNEL)); |
378 | |
379 | BUG_ON(pshift > HUGEPD_SHIFT_MASK); |
380 | BUG_ON((unsigned long)new & HUGEPD_SHIFT_MASK); |
381 | @@ -97,7 +101,10 @@ static int __hugepte_alloc(struct mm_struct *mm, hugepd_t *hpdp, |
382 | if (i < num_hugepd) { |
383 | for (i = i - 1 ; i >= 0; i--, hpdp--) |
384 | *hpdp = __hugepd(0); |
385 | - kmem_cache_free(cachep, new); |
386 | + if (cachep) |
387 | + kmem_cache_free(cachep, new); |
388 | + else |
389 | + pte_free(mm, new); |
390 | } else { |
391 | kmemleak_ignore(new); |
392 | } |
393 | @@ -324,8 +331,7 @@ static void free_hugepd_range(struct mmu_gather *tlb, hugepd_t *hpdp, int pdshif |
394 | if (shift >= pdshift) |
395 | hugepd_free(tlb, hugepte); |
396 | else if (IS_ENABLED(CONFIG_PPC_8xx)) |
397 | - pgtable_free_tlb(tlb, hugepte, |
398 | - get_hugepd_cache_index(PTE_INDEX_SIZE)); |
399 | + pgtable_free_tlb(tlb, hugepte, 0); |
400 | else |
401 | pgtable_free_tlb(tlb, hugepte, |
402 | get_hugepd_cache_index(pdshift - shift)); |
403 | @@ -639,12 +645,13 @@ static int __init hugetlbpage_init(void) |
404 | * if we have pdshift and shift value same, we don't |
405 | * use pgt cache for hugepd. |
406 | */ |
407 | - if (pdshift > shift && IS_ENABLED(CONFIG_PPC_8xx)) |
408 | - pgtable_cache_add(PTE_INDEX_SIZE); |
409 | - else if (pdshift > shift) |
410 | - pgtable_cache_add(pdshift - shift); |
411 | - else if (IS_ENABLED(CONFIG_PPC_FSL_BOOK3E) || IS_ENABLED(CONFIG_PPC_8xx)) |
412 | + if (pdshift > shift) { |
413 | + if (!IS_ENABLED(CONFIG_PPC_8xx)) |
414 | + pgtable_cache_add(pdshift - shift); |
415 | + } else if (IS_ENABLED(CONFIG_PPC_FSL_BOOK3E) || |
416 | + IS_ENABLED(CONFIG_PPC_8xx)) { |
417 | pgtable_cache_add(PTE_T_ORDER); |
418 | + } |
419 | |
420 | configured = true; |
421 | } |
422 | diff --git a/arch/s390/boot/kaslr.c b/arch/s390/boot/kaslr.c |
423 | index 5d12352545c5..5591243d673e 100644 |
424 | --- a/arch/s390/boot/kaslr.c |
425 | +++ b/arch/s390/boot/kaslr.c |
426 | @@ -75,7 +75,7 @@ static unsigned long get_random(unsigned long limit) |
427 | *(unsigned long *) prng.parm_block ^= seed; |
428 | for (i = 0; i < 16; i++) { |
429 | cpacf_kmc(CPACF_KMC_PRNG, prng.parm_block, |
430 | - (char *) entropy, (char *) entropy, |
431 | + (u8 *) entropy, (u8 *) entropy, |
432 | sizeof(entropy)); |
433 | memcpy(prng.parm_block, entropy, sizeof(entropy)); |
434 | } |
435 | diff --git a/arch/s390/include/asm/page.h b/arch/s390/include/asm/page.h |
436 | index 3f5cb55cde35..e399102367af 100644 |
437 | --- a/arch/s390/include/asm/page.h |
438 | +++ b/arch/s390/include/asm/page.h |
439 | @@ -42,7 +42,7 @@ void __storage_key_init_range(unsigned long start, unsigned long end); |
440 | |
441 | static inline void storage_key_init_range(unsigned long start, unsigned long end) |
442 | { |
443 | - if (PAGE_DEFAULT_KEY) |
444 | + if (PAGE_DEFAULT_KEY != 0) |
445 | __storage_key_init_range(start, end); |
446 | } |
447 | |
448 | diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h |
449 | index c1ed054c103c..734a3334e0f0 100644 |
450 | --- a/arch/x86/include/asm/kvm_host.h |
451 | +++ b/arch/x86/include/asm/kvm_host.h |
452 | @@ -1098,7 +1098,7 @@ struct kvm_x86_ops { |
453 | void (*load_eoi_exitmap)(struct kvm_vcpu *vcpu, u64 *eoi_exit_bitmap); |
454 | void (*set_virtual_apic_mode)(struct kvm_vcpu *vcpu); |
455 | void (*set_apic_access_page_addr)(struct kvm_vcpu *vcpu, hpa_t hpa); |
456 | - void (*deliver_posted_interrupt)(struct kvm_vcpu *vcpu, int vector); |
457 | + int (*deliver_posted_interrupt)(struct kvm_vcpu *vcpu, int vector); |
458 | int (*sync_pir_to_irr)(struct kvm_vcpu *vcpu); |
459 | int (*set_tss_addr)(struct kvm *kvm, unsigned int addr); |
460 | int (*set_identity_map_addr)(struct kvm *kvm, u64 ident_addr); |
461 | diff --git a/arch/x86/include/asm/msr-index.h b/arch/x86/include/asm/msr-index.h |
462 | index 6a3124664289..1682e4b5ce75 100644 |
463 | --- a/arch/x86/include/asm/msr-index.h |
464 | +++ b/arch/x86/include/asm/msr-index.h |
465 | @@ -510,6 +510,8 @@ |
466 | #define MSR_K7_HWCR 0xc0010015 |
467 | #define MSR_K7_HWCR_SMMLOCK_BIT 0 |
468 | #define MSR_K7_HWCR_SMMLOCK BIT_ULL(MSR_K7_HWCR_SMMLOCK_BIT) |
469 | +#define MSR_K7_HWCR_IRPERF_EN_BIT 30 |
470 | +#define MSR_K7_HWCR_IRPERF_EN BIT_ULL(MSR_K7_HWCR_IRPERF_EN_BIT) |
471 | #define MSR_K7_FID_VID_CTL 0xc0010041 |
472 | #define MSR_K7_FID_VID_STATUS 0xc0010042 |
473 | |
474 | diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c |
475 | index 62c30279be77..c3f4dd4ae155 100644 |
476 | --- a/arch/x86/kernel/cpu/amd.c |
477 | +++ b/arch/x86/kernel/cpu/amd.c |
478 | @@ -28,6 +28,7 @@ |
479 | |
480 | static const int amd_erratum_383[]; |
481 | static const int amd_erratum_400[]; |
482 | +static const int amd_erratum_1054[]; |
483 | static bool cpu_has_amd_erratum(struct cpuinfo_x86 *cpu, const int *erratum); |
484 | |
485 | /* |
486 | @@ -978,6 +979,15 @@ static void init_amd(struct cpuinfo_x86 *c) |
487 | /* AMD CPUs don't reset SS attributes on SYSRET, Xen does. */ |
488 | if (!cpu_has(c, X86_FEATURE_XENPV)) |
489 | set_cpu_bug(c, X86_BUG_SYSRET_SS_ATTRS); |
490 | + |
491 | + /* |
492 | + * Turn on the Instructions Retired free counter on machines not |
493 | + * susceptible to erratum #1054 "Instructions Retired Performance |
494 | + * Counter May Be Inaccurate". |
495 | + */ |
496 | + if (cpu_has(c, X86_FEATURE_IRPERF) && |
497 | + !cpu_has_amd_erratum(c, amd_erratum_1054)) |
498 | + msr_set_bit(MSR_K7_HWCR, MSR_K7_HWCR_IRPERF_EN_BIT); |
499 | } |
500 | |
501 | #ifdef CONFIG_X86_32 |
502 | @@ -1105,6 +1115,10 @@ static const int amd_erratum_400[] = |
503 | static const int amd_erratum_383[] = |
504 | AMD_OSVW_ERRATUM(3, AMD_MODEL_RANGE(0x10, 0, 0, 0xff, 0xf)); |
505 | |
506 | +/* #1054: Instructions Retired Performance Counter May Be Inaccurate */ |
507 | +static const int amd_erratum_1054[] = |
508 | + AMD_OSVW_ERRATUM(0, AMD_MODEL_RANGE(0x17, 0, 0, 0x2f, 0xf)); |
509 | + |
510 | |
511 | static bool cpu_has_amd_erratum(struct cpuinfo_x86 *cpu, const int *erratum) |
512 | { |
513 | diff --git a/arch/x86/kernel/cpu/mce/amd.c b/arch/x86/kernel/cpu/mce/amd.c |
514 | index 259f3f4e2e5f..1cf34fcc3a8e 100644 |
515 | --- a/arch/x86/kernel/cpu/mce/amd.c |
516 | +++ b/arch/x86/kernel/cpu/mce/amd.c |
517 | @@ -1161,9 +1161,12 @@ static const struct sysfs_ops threshold_ops = { |
518 | .store = store, |
519 | }; |
520 | |
521 | +static void threshold_block_release(struct kobject *kobj); |
522 | + |
523 | static struct kobj_type threshold_ktype = { |
524 | .sysfs_ops = &threshold_ops, |
525 | .default_attrs = default_attrs, |
526 | + .release = threshold_block_release, |
527 | }; |
528 | |
529 | static const char *get_name(unsigned int bank, struct threshold_block *b) |
530 | @@ -1196,8 +1199,9 @@ static const char *get_name(unsigned int bank, struct threshold_block *b) |
531 | return buf_mcatype; |
532 | } |
533 | |
534 | -static int allocate_threshold_blocks(unsigned int cpu, unsigned int bank, |
535 | - unsigned int block, u32 address) |
536 | +static int allocate_threshold_blocks(unsigned int cpu, struct threshold_bank *tb, |
537 | + unsigned int bank, unsigned int block, |
538 | + u32 address) |
539 | { |
540 | struct threshold_block *b = NULL; |
541 | u32 low, high; |
542 | @@ -1241,16 +1245,12 @@ static int allocate_threshold_blocks(unsigned int cpu, unsigned int bank, |
543 | |
544 | INIT_LIST_HEAD(&b->miscj); |
545 | |
546 | - if (per_cpu(threshold_banks, cpu)[bank]->blocks) { |
547 | - list_add(&b->miscj, |
548 | - &per_cpu(threshold_banks, cpu)[bank]->blocks->miscj); |
549 | - } else { |
550 | - per_cpu(threshold_banks, cpu)[bank]->blocks = b; |
551 | - } |
552 | + if (tb->blocks) |
553 | + list_add(&b->miscj, &tb->blocks->miscj); |
554 | + else |
555 | + tb->blocks = b; |
556 | |
557 | - err = kobject_init_and_add(&b->kobj, &threshold_ktype, |
558 | - per_cpu(threshold_banks, cpu)[bank]->kobj, |
559 | - get_name(bank, b)); |
560 | + err = kobject_init_and_add(&b->kobj, &threshold_ktype, tb->kobj, get_name(bank, b)); |
561 | if (err) |
562 | goto out_free; |
563 | recurse: |
564 | @@ -1258,7 +1258,7 @@ recurse: |
565 | if (!address) |
566 | return 0; |
567 | |
568 | - err = allocate_threshold_blocks(cpu, bank, block, address); |
569 | + err = allocate_threshold_blocks(cpu, tb, bank, block, address); |
570 | if (err) |
571 | goto out_free; |
572 | |
573 | @@ -1343,8 +1343,6 @@ static int threshold_create_bank(unsigned int cpu, unsigned int bank) |
574 | goto out_free; |
575 | } |
576 | |
577 | - per_cpu(threshold_banks, cpu)[bank] = b; |
578 | - |
579 | if (is_shared_bank(bank)) { |
580 | refcount_set(&b->cpus, 1); |
581 | |
582 | @@ -1355,9 +1353,13 @@ static int threshold_create_bank(unsigned int cpu, unsigned int bank) |
583 | } |
584 | } |
585 | |
586 | - err = allocate_threshold_blocks(cpu, bank, 0, msr_ops.misc(bank)); |
587 | - if (!err) |
588 | - goto out; |
589 | + err = allocate_threshold_blocks(cpu, b, bank, 0, msr_ops.misc(bank)); |
590 | + if (err) |
591 | + goto out_free; |
592 | + |
593 | + per_cpu(threshold_banks, cpu)[bank] = b; |
594 | + |
595 | + return 0; |
596 | |
597 | out_free: |
598 | kfree(b); |
599 | @@ -1366,8 +1368,12 @@ static int threshold_create_bank(unsigned int cpu, unsigned int bank) |
600 | return err; |
601 | } |
602 | |
603 | -static void deallocate_threshold_block(unsigned int cpu, |
604 | - unsigned int bank) |
605 | +static void threshold_block_release(struct kobject *kobj) |
606 | +{ |
607 | + kfree(to_block(kobj)); |
608 | +} |
609 | + |
610 | +static void deallocate_threshold_block(unsigned int cpu, unsigned int bank) |
611 | { |
612 | struct threshold_block *pos = NULL; |
613 | struct threshold_block *tmp = NULL; |
614 | @@ -1377,13 +1383,11 @@ static void deallocate_threshold_block(unsigned int cpu, |
615 | return; |
616 | |
617 | list_for_each_entry_safe(pos, tmp, &head->blocks->miscj, miscj) { |
618 | - kobject_put(&pos->kobj); |
619 | list_del(&pos->miscj); |
620 | - kfree(pos); |
621 | + kobject_put(&pos->kobj); |
622 | } |
623 | |
624 | - kfree(per_cpu(threshold_banks, cpu)[bank]->blocks); |
625 | - per_cpu(threshold_banks, cpu)[bank]->blocks = NULL; |
626 | + kobject_put(&head->blocks->kobj); |
627 | } |
628 | |
629 | static void __threshold_remove_blocks(struct threshold_bank *b) |
630 | diff --git a/arch/x86/kernel/ima_arch.c b/arch/x86/kernel/ima_arch.c |
631 | index 4d4f5d9faac3..23054909c8dd 100644 |
632 | --- a/arch/x86/kernel/ima_arch.c |
633 | +++ b/arch/x86/kernel/ima_arch.c |
634 | @@ -10,8 +10,6 @@ extern struct boot_params boot_params; |
635 | |
636 | static enum efi_secureboot_mode get_sb_mode(void) |
637 | { |
638 | - efi_char16_t efi_SecureBoot_name[] = L"SecureBoot"; |
639 | - efi_char16_t efi_SetupMode_name[] = L"SecureBoot"; |
640 | efi_guid_t efi_variable_guid = EFI_GLOBAL_VARIABLE_GUID; |
641 | efi_status_t status; |
642 | unsigned long size; |
643 | @@ -25,7 +23,7 @@ static enum efi_secureboot_mode get_sb_mode(void) |
644 | } |
645 | |
646 | /* Get variable contents into buffer */ |
647 | - status = efi.get_variable(efi_SecureBoot_name, &efi_variable_guid, |
648 | + status = efi.get_variable(L"SecureBoot", &efi_variable_guid, |
649 | NULL, &size, &secboot); |
650 | if (status == EFI_NOT_FOUND) { |
651 | pr_info("ima: secureboot mode disabled\n"); |
652 | @@ -38,7 +36,7 @@ static enum efi_secureboot_mode get_sb_mode(void) |
653 | } |
654 | |
655 | size = sizeof(setupmode); |
656 | - status = efi.get_variable(efi_SetupMode_name, &efi_variable_guid, |
657 | + status = efi.get_variable(L"SetupMode", &efi_variable_guid, |
658 | NULL, &size, &setupmode); |
659 | |
660 | if (status != EFI_SUCCESS) /* ignore unknown SetupMode */ |
661 | diff --git a/arch/x86/kvm/irq_comm.c b/arch/x86/kvm/irq_comm.c |
662 | index 8ecd48d31800..5ddcaacef291 100644 |
663 | --- a/arch/x86/kvm/irq_comm.c |
664 | +++ b/arch/x86/kvm/irq_comm.c |
665 | @@ -416,7 +416,7 @@ void kvm_scan_ioapic_routes(struct kvm_vcpu *vcpu, |
666 | |
667 | kvm_set_msi_irq(vcpu->kvm, entry, &irq); |
668 | |
669 | - if (irq.level && kvm_apic_match_dest(vcpu, NULL, 0, |
670 | + if (irq.trig_mode && kvm_apic_match_dest(vcpu, NULL, 0, |
671 | irq.dest_id, irq.dest_mode)) |
672 | __set_bit(irq.vector, ioapic_handled_vectors); |
673 | } |
674 | diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c |
675 | index 15728971a430..5d2587005d0e 100644 |
676 | --- a/arch/x86/kvm/lapic.c |
677 | +++ b/arch/x86/kvm/lapic.c |
678 | @@ -637,9 +637,11 @@ static inline bool pv_eoi_enabled(struct kvm_vcpu *vcpu) |
679 | static bool pv_eoi_get_pending(struct kvm_vcpu *vcpu) |
680 | { |
681 | u8 val; |
682 | - if (pv_eoi_get_user(vcpu, &val) < 0) |
683 | + if (pv_eoi_get_user(vcpu, &val) < 0) { |
684 | printk(KERN_WARNING "Can't read EOI MSR value: 0x%llx\n", |
685 | (unsigned long long)vcpu->arch.pv_eoi.msr_val); |
686 | + return false; |
687 | + } |
688 | return val & 0x1; |
689 | } |
690 | |
691 | @@ -1056,11 +1058,8 @@ static int __apic_accept_irq(struct kvm_lapic *apic, int delivery_mode, |
692 | apic->regs + APIC_TMR); |
693 | } |
694 | |
695 | - if (vcpu->arch.apicv_active) |
696 | - kvm_x86_ops->deliver_posted_interrupt(vcpu, vector); |
697 | - else { |
698 | + if (kvm_x86_ops->deliver_posted_interrupt(vcpu, vector)) { |
699 | kvm_lapic_set_irr(vector, apic); |
700 | - |
701 | kvm_make_request(KVM_REQ_EVENT, vcpu); |
702 | kvm_vcpu_kick(vcpu); |
703 | } |
704 | diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c |
705 | index 8d1be7c61f10..207030db3481 100644 |
706 | --- a/arch/x86/kvm/svm.c |
707 | +++ b/arch/x86/kvm/svm.c |
708 | @@ -5141,8 +5141,11 @@ static void svm_load_eoi_exitmap(struct kvm_vcpu *vcpu, u64 *eoi_exit_bitmap) |
709 | return; |
710 | } |
711 | |
712 | -static void svm_deliver_avic_intr(struct kvm_vcpu *vcpu, int vec) |
713 | +static int svm_deliver_avic_intr(struct kvm_vcpu *vcpu, int vec) |
714 | { |
715 | + if (!vcpu->arch.apicv_active) |
716 | + return -1; |
717 | + |
718 | kvm_lapic_set_irr(vec, vcpu->arch.apic); |
719 | smp_mb__after_atomic(); |
720 | |
721 | @@ -5154,6 +5157,8 @@ static void svm_deliver_avic_intr(struct kvm_vcpu *vcpu, int vec) |
722 | put_cpu(); |
723 | } else |
724 | kvm_vcpu_wake_up(vcpu); |
725 | + |
726 | + return 0; |
727 | } |
728 | |
729 | static bool svm_dy_apicv_has_pending_interrupt(struct kvm_vcpu *vcpu) |
730 | diff --git a/arch/x86/kvm/vmx/capabilities.h b/arch/x86/kvm/vmx/capabilities.h |
731 | index 283bdb7071af..f486e2606247 100644 |
732 | --- a/arch/x86/kvm/vmx/capabilities.h |
733 | +++ b/arch/x86/kvm/vmx/capabilities.h |
734 | @@ -12,6 +12,7 @@ extern bool __read_mostly enable_ept; |
735 | extern bool __read_mostly enable_unrestricted_guest; |
736 | extern bool __read_mostly enable_ept_ad_bits; |
737 | extern bool __read_mostly enable_pml; |
738 | +extern bool __read_mostly enable_apicv; |
739 | extern int __read_mostly pt_mode; |
740 | |
741 | #define PT_MODE_SYSTEM 0 |
742 | diff --git a/arch/x86/kvm/vmx/nested.c b/arch/x86/kvm/vmx/nested.c |
743 | index 931d3b5f3acd..802ef7177d53 100644 |
744 | --- a/arch/x86/kvm/vmx/nested.c |
745 | +++ b/arch/x86/kvm/vmx/nested.c |
746 | @@ -5132,24 +5132,17 @@ fail: |
747 | return 1; |
748 | } |
749 | |
750 | - |
751 | -static bool nested_vmx_exit_handled_io(struct kvm_vcpu *vcpu, |
752 | - struct vmcs12 *vmcs12) |
753 | +/* |
754 | + * Return true if an IO instruction with the specified port and size should cause |
755 | + * a VM-exit into L1. |
756 | + */ |
757 | +bool nested_vmx_check_io_bitmaps(struct kvm_vcpu *vcpu, unsigned int port, |
758 | + int size) |
759 | { |
760 | - unsigned long exit_qualification; |
761 | + struct vmcs12 *vmcs12 = get_vmcs12(vcpu); |
762 | gpa_t bitmap, last_bitmap; |
763 | - unsigned int port; |
764 | - int size; |
765 | u8 b; |
766 | |
767 | - if (!nested_cpu_has(vmcs12, CPU_BASED_USE_IO_BITMAPS)) |
768 | - return nested_cpu_has(vmcs12, CPU_BASED_UNCOND_IO_EXITING); |
769 | - |
770 | - exit_qualification = vmcs_readl(EXIT_QUALIFICATION); |
771 | - |
772 | - port = exit_qualification >> 16; |
773 | - size = (exit_qualification & 7) + 1; |
774 | - |
775 | last_bitmap = (gpa_t)-1; |
776 | b = -1; |
777 | |
778 | @@ -5176,6 +5169,24 @@ static bool nested_vmx_exit_handled_io(struct kvm_vcpu *vcpu, |
779 | return false; |
780 | } |
781 | |
782 | +static bool nested_vmx_exit_handled_io(struct kvm_vcpu *vcpu, |
783 | + struct vmcs12 *vmcs12) |
784 | +{ |
785 | + unsigned long exit_qualification; |
786 | + unsigned short port; |
787 | + int size; |
788 | + |
789 | + if (!nested_cpu_has(vmcs12, CPU_BASED_USE_IO_BITMAPS)) |
790 | + return nested_cpu_has(vmcs12, CPU_BASED_UNCOND_IO_EXITING); |
791 | + |
792 | + exit_qualification = vmcs_readl(EXIT_QUALIFICATION); |
793 | + |
794 | + port = exit_qualification >> 16; |
795 | + size = (exit_qualification & 7) + 1; |
796 | + |
797 | + return nested_vmx_check_io_bitmaps(vcpu, port, size); |
798 | +} |
799 | + |
800 | /* |
801 | * Return 1 if we should exit from L2 to L1 to handle an MSR access access, |
802 | * rather than handle it ourselves in L0. I.e., check whether L1 expressed |
803 | @@ -5796,8 +5807,7 @@ void nested_vmx_vcpu_setup(void) |
804 | * bit in the high half is on if the corresponding bit in the control field |
805 | * may be on. See also vmx_control_verify(). |
806 | */ |
807 | -void nested_vmx_setup_ctls_msrs(struct nested_vmx_msrs *msrs, u32 ept_caps, |
808 | - bool apicv) |
809 | +void nested_vmx_setup_ctls_msrs(struct nested_vmx_msrs *msrs, u32 ept_caps) |
810 | { |
811 | /* |
812 | * Note that as a general rule, the high half of the MSRs (bits in |
813 | @@ -5824,7 +5834,7 @@ void nested_vmx_setup_ctls_msrs(struct nested_vmx_msrs *msrs, u32 ept_caps, |
814 | PIN_BASED_EXT_INTR_MASK | |
815 | PIN_BASED_NMI_EXITING | |
816 | PIN_BASED_VIRTUAL_NMIS | |
817 | - (apicv ? PIN_BASED_POSTED_INTR : 0); |
818 | + (enable_apicv ? PIN_BASED_POSTED_INTR : 0); |
819 | msrs->pinbased_ctls_high |= |
820 | PIN_BASED_ALWAYSON_WITHOUT_TRUE_MSR | |
821 | PIN_BASED_VMX_PREEMPTION_TIMER; |
822 | diff --git a/arch/x86/kvm/vmx/nested.h b/arch/x86/kvm/vmx/nested.h |
823 | index 6280f33e5fa6..b8521c451bb0 100644 |
824 | --- a/arch/x86/kvm/vmx/nested.h |
825 | +++ b/arch/x86/kvm/vmx/nested.h |
826 | @@ -17,8 +17,7 @@ enum nvmx_vmentry_status { |
827 | }; |
828 | |
829 | void vmx_leave_nested(struct kvm_vcpu *vcpu); |
830 | -void nested_vmx_setup_ctls_msrs(struct nested_vmx_msrs *msrs, u32 ept_caps, |
831 | - bool apicv); |
832 | +void nested_vmx_setup_ctls_msrs(struct nested_vmx_msrs *msrs, u32 ept_caps); |
833 | void nested_vmx_hardware_unsetup(void); |
834 | __init int nested_vmx_hardware_setup(int (*exit_handlers[])(struct kvm_vcpu *)); |
835 | void nested_vmx_vcpu_setup(void); |
836 | @@ -33,6 +32,8 @@ int vmx_set_vmx_msr(struct kvm_vcpu *vcpu, u32 msr_index, u64 data); |
837 | int vmx_get_vmx_msr(struct nested_vmx_msrs *msrs, u32 msr_index, u64 *pdata); |
838 | int get_vmx_mem_address(struct kvm_vcpu *vcpu, unsigned long exit_qualification, |
839 | u32 vmx_instruction_info, bool wr, int len, gva_t *ret); |
840 | +bool nested_vmx_check_io_bitmaps(struct kvm_vcpu *vcpu, unsigned int port, |
841 | + int size); |
842 | |
843 | static inline struct vmcs12 *get_vmcs12(struct kvm_vcpu *vcpu) |
844 | { |
845 | diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c |
846 | index 84b57b461ad6..8ebcd9de87a2 100644 |
847 | --- a/arch/x86/kvm/vmx/vmx.c |
848 | +++ b/arch/x86/kvm/vmx/vmx.c |
849 | @@ -95,7 +95,7 @@ module_param(emulate_invalid_guest_state, bool, S_IRUGO); |
850 | static bool __read_mostly fasteoi = 1; |
851 | module_param(fasteoi, bool, S_IRUGO); |
852 | |
853 | -static bool __read_mostly enable_apicv = 1; |
854 | +bool __read_mostly enable_apicv = 1; |
855 | module_param(enable_apicv, bool, S_IRUGO); |
856 | |
857 | /* |
858 | @@ -3853,24 +3853,29 @@ static int vmx_deliver_nested_posted_interrupt(struct kvm_vcpu *vcpu, |
859 | * 2. If target vcpu isn't running(root mode), kick it to pick up the |
860 | * interrupt from PIR in next vmentry. |
861 | */ |
862 | -static void vmx_deliver_posted_interrupt(struct kvm_vcpu *vcpu, int vector) |
863 | +static int vmx_deliver_posted_interrupt(struct kvm_vcpu *vcpu, int vector) |
864 | { |
865 | struct vcpu_vmx *vmx = to_vmx(vcpu); |
866 | int r; |
867 | |
868 | r = vmx_deliver_nested_posted_interrupt(vcpu, vector); |
869 | if (!r) |
870 | - return; |
871 | + return 0; |
872 | + |
873 | + if (!vcpu->arch.apicv_active) |
874 | + return -1; |
875 | |
876 | if (pi_test_and_set_pir(vector, &vmx->pi_desc)) |
877 | - return; |
878 | + return 0; |
879 | |
880 | /* If a previous notification has sent the IPI, nothing to do. */ |
881 | if (pi_test_and_set_on(&vmx->pi_desc)) |
882 | - return; |
883 | + return 0; |
884 | |
885 | if (!kvm_vcpu_trigger_posted_interrupt(vcpu, false)) |
886 | kvm_vcpu_kick(vcpu); |
887 | + |
888 | + return 0; |
889 | } |
890 | |
891 | /* |
892 | @@ -6802,8 +6807,7 @@ static struct kvm_vcpu *vmx_create_vcpu(struct kvm *kvm, unsigned int id) |
893 | |
894 | if (nested) |
895 | nested_vmx_setup_ctls_msrs(&vmx->nested.msrs, |
896 | - vmx_capability.ept, |
897 | - kvm_vcpu_apicv_active(&vmx->vcpu)); |
898 | + vmx_capability.ept); |
899 | else |
900 | memset(&vmx->nested.msrs, 0, sizeof(vmx->nested.msrs)); |
901 | |
902 | @@ -6885,8 +6889,7 @@ static int __init vmx_check_processor_compat(void) |
903 | if (setup_vmcs_config(&vmcs_conf, &vmx_cap) < 0) |
904 | return -EIO; |
905 | if (nested) |
906 | - nested_vmx_setup_ctls_msrs(&vmcs_conf.nested, vmx_cap.ept, |
907 | - enable_apicv); |
908 | + nested_vmx_setup_ctls_msrs(&vmcs_conf.nested, vmx_cap.ept); |
909 | if (memcmp(&vmcs_config, &vmcs_conf, sizeof(struct vmcs_config)) != 0) { |
910 | printk(KERN_ERR "kvm: CPU %d feature inconsistency!\n", |
911 | smp_processor_id()); |
912 | @@ -7132,6 +7135,39 @@ static void vmx_request_immediate_exit(struct kvm_vcpu *vcpu) |
913 | to_vmx(vcpu)->req_immediate_exit = true; |
914 | } |
915 | |
916 | +static int vmx_check_intercept_io(struct kvm_vcpu *vcpu, |
917 | + struct x86_instruction_info *info) |
918 | +{ |
919 | + struct vmcs12 *vmcs12 = get_vmcs12(vcpu); |
920 | + unsigned short port; |
921 | + bool intercept; |
922 | + int size; |
923 | + |
924 | + if (info->intercept == x86_intercept_in || |
925 | + info->intercept == x86_intercept_ins) { |
926 | + port = info->src_val; |
927 | + size = info->dst_bytes; |
928 | + } else { |
929 | + port = info->dst_val; |
930 | + size = info->src_bytes; |
931 | + } |
932 | + |
933 | + /* |
934 | + * If the 'use IO bitmaps' VM-execution control is 0, IO instruction |
935 | + * VM-exits depend on the 'unconditional IO exiting' VM-execution |
936 | + * control. |
937 | + * |
938 | + * Otherwise, IO instruction VM-exits are controlled by the IO bitmaps. |
939 | + */ |
940 | + if (!nested_cpu_has(vmcs12, CPU_BASED_USE_IO_BITMAPS)) |
941 | + intercept = nested_cpu_has(vmcs12, |
942 | + CPU_BASED_UNCOND_IO_EXITING); |
943 | + else |
944 | + intercept = nested_vmx_check_io_bitmaps(vcpu, port, size); |
945 | + |
946 | + return intercept ? X86EMUL_UNHANDLEABLE : X86EMUL_CONTINUE; |
947 | +} |
948 | + |
949 | static int vmx_check_intercept(struct kvm_vcpu *vcpu, |
950 | struct x86_instruction_info *info, |
951 | enum x86_intercept_stage stage) |
952 | @@ -7139,19 +7175,31 @@ static int vmx_check_intercept(struct kvm_vcpu *vcpu, |
953 | struct vmcs12 *vmcs12 = get_vmcs12(vcpu); |
954 | struct x86_emulate_ctxt *ctxt = &vcpu->arch.emulate_ctxt; |
955 | |
956 | + switch (info->intercept) { |
957 | /* |
958 | * RDPID causes #UD if disabled through secondary execution controls. |
959 | * Because it is marked as EmulateOnUD, we need to intercept it here. |
960 | */ |
961 | - if (info->intercept == x86_intercept_rdtscp && |
962 | - !nested_cpu_has2(vmcs12, SECONDARY_EXEC_RDTSCP)) { |
963 | - ctxt->exception.vector = UD_VECTOR; |
964 | - ctxt->exception.error_code_valid = false; |
965 | - return X86EMUL_PROPAGATE_FAULT; |
966 | - } |
967 | + case x86_intercept_rdtscp: |
968 | + if (!nested_cpu_has2(vmcs12, SECONDARY_EXEC_RDTSCP)) { |
969 | + ctxt->exception.vector = UD_VECTOR; |
970 | + ctxt->exception.error_code_valid = false; |
971 | + return X86EMUL_PROPAGATE_FAULT; |
972 | + } |
973 | + break; |
974 | + |
975 | + case x86_intercept_in: |
976 | + case x86_intercept_ins: |
977 | + case x86_intercept_out: |
978 | + case x86_intercept_outs: |
979 | + return vmx_check_intercept_io(vcpu, info); |
980 | |
981 | /* TODO: check more intercepts... */ |
982 | - return X86EMUL_CONTINUE; |
983 | + default: |
984 | + break; |
985 | + } |
986 | + |
987 | + return X86EMUL_UNHANDLEABLE; |
988 | } |
989 | |
990 | #ifdef CONFIG_X86_64 |
991 | @@ -7736,7 +7784,7 @@ static __init int hardware_setup(void) |
992 | |
993 | if (nested) { |
994 | nested_vmx_setup_ctls_msrs(&vmcs_config.nested, |
995 | - vmx_capability.ept, enable_apicv); |
996 | + vmx_capability.ept); |
997 | |
998 | r = nested_vmx_hardware_setup(kvm_vmx_exit_handlers); |
999 | if (r) |
1000 | diff --git a/crypto/hash_info.c b/crypto/hash_info.c |
1001 | index c754cb75dd1a..a49ff96bde77 100644 |
1002 | --- a/crypto/hash_info.c |
1003 | +++ b/crypto/hash_info.c |
1004 | @@ -26,7 +26,7 @@ const char *const hash_algo_name[HASH_ALGO__LAST] = { |
1005 | [HASH_ALGO_TGR_128] = "tgr128", |
1006 | [HASH_ALGO_TGR_160] = "tgr160", |
1007 | [HASH_ALGO_TGR_192] = "tgr192", |
1008 | - [HASH_ALGO_SM3_256] = "sm3-256", |
1009 | + [HASH_ALGO_SM3_256] = "sm3", |
1010 | [HASH_ALGO_STREEBOG_256] = "streebog256", |
1011 | [HASH_ALGO_STREEBOG_512] = "streebog512", |
1012 | }; |
1013 | diff --git a/drivers/acpi/acpica/evevent.c b/drivers/acpi/acpica/evevent.c |
1014 | index 9e2f5a05c066..bad2257356fe 100644 |
1015 | --- a/drivers/acpi/acpica/evevent.c |
1016 | +++ b/drivers/acpi/acpica/evevent.c |
1017 | @@ -265,4 +265,49 @@ static u32 acpi_ev_fixed_event_dispatch(u32 event) |
1018 | handler) (acpi_gbl_fixed_event_handlers[event].context)); |
1019 | } |
1020 | |
1021 | +/******************************************************************************* |
1022 | + * |
1023 | + * FUNCTION: acpi_any_fixed_event_status_set |
1024 | + * |
1025 | + * PARAMETERS: None |
1026 | + * |
1027 | + * RETURN: TRUE or FALSE |
1028 | + * |
1029 | + * DESCRIPTION: Checks the PM status register for active fixed events |
1030 | + * |
1031 | + ******************************************************************************/ |
1032 | + |
1033 | +u32 acpi_any_fixed_event_status_set(void) |
1034 | +{ |
1035 | + acpi_status status; |
1036 | + u32 in_status; |
1037 | + u32 in_enable; |
1038 | + u32 i; |
1039 | + |
1040 | + status = acpi_hw_register_read(ACPI_REGISTER_PM1_ENABLE, &in_enable); |
1041 | + if (ACPI_FAILURE(status)) { |
1042 | + return (FALSE); |
1043 | + } |
1044 | + |
1045 | + status = acpi_hw_register_read(ACPI_REGISTER_PM1_STATUS, &in_status); |
1046 | + if (ACPI_FAILURE(status)) { |
1047 | + return (FALSE); |
1048 | + } |
1049 | + |
1050 | + /* |
1051 | + * Check for all possible Fixed Events and dispatch those that are active |
1052 | + */ |
1053 | + for (i = 0; i < ACPI_NUM_FIXED_EVENTS; i++) { |
1054 | + |
1055 | + /* Both the status and enable bits must be on for this event */ |
1056 | + |
1057 | + if ((in_status & acpi_gbl_fixed_event_info[i].status_bit_mask) && |
1058 | + (in_enable & acpi_gbl_fixed_event_info[i].enable_bit_mask)) { |
1059 | + return (TRUE); |
1060 | + } |
1061 | + } |
1062 | + |
1063 | + return (FALSE); |
1064 | +} |
1065 | + |
1066 | #endif /* !ACPI_REDUCED_HARDWARE */ |
1067 | diff --git a/drivers/acpi/sleep.c b/drivers/acpi/sleep.c |
1068 | index 62348ec2a807..827530dae682 100644 |
1069 | --- a/drivers/acpi/sleep.c |
1070 | +++ b/drivers/acpi/sleep.c |
1071 | @@ -992,6 +992,13 @@ static bool acpi_s2idle_wake(void) |
1072 | if (irqd_is_wakeup_armed(irq_get_irq_data(acpi_sci_irq))) |
1073 | return true; |
1074 | |
1075 | + /* |
1076 | + * If the status bit of any enabled fixed event is set, the |
1077 | + * wakeup is regarded as valid. |
1078 | + */ |
1079 | + if (acpi_any_fixed_event_status_set()) |
1080 | + return true; |
1081 | + |
1082 | /* |
1083 | * If there are no EC events to process and at least one of the |
1084 | * other enabled GPEs is active, the wakeup is regarded as a |
1085 | diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c |
1086 | index 05c2b32dcc4d..1787e3ad9c44 100644 |
1087 | --- a/drivers/ata/ahci.c |
1088 | +++ b/drivers/ata/ahci.c |
1089 | @@ -80,6 +80,7 @@ enum board_ids { |
1090 | |
1091 | static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent); |
1092 | static void ahci_remove_one(struct pci_dev *dev); |
1093 | +static void ahci_shutdown_one(struct pci_dev *dev); |
1094 | static int ahci_vt8251_hardreset(struct ata_link *link, unsigned int *class, |
1095 | unsigned long deadline); |
1096 | static int ahci_avn_hardreset(struct ata_link *link, unsigned int *class, |
1097 | @@ -593,6 +594,7 @@ static struct pci_driver ahci_pci_driver = { |
1098 | .id_table = ahci_pci_tbl, |
1099 | .probe = ahci_init_one, |
1100 | .remove = ahci_remove_one, |
1101 | + .shutdown = ahci_shutdown_one, |
1102 | .driver = { |
1103 | .pm = &ahci_pci_pm_ops, |
1104 | }, |
1105 | @@ -1864,6 +1866,11 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) |
1106 | return 0; |
1107 | } |
1108 | |
1109 | +static void ahci_shutdown_one(struct pci_dev *pdev) |
1110 | +{ |
1111 | + ata_pci_shutdown_one(pdev); |
1112 | +} |
1113 | + |
1114 | static void ahci_remove_one(struct pci_dev *pdev) |
1115 | { |
1116 | pm_runtime_get_noresume(&pdev->dev); |
1117 | diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c |
1118 | index 84b183a6424e..581595b35573 100644 |
1119 | --- a/drivers/ata/libata-core.c |
1120 | +++ b/drivers/ata/libata-core.c |
1121 | @@ -6762,6 +6762,26 @@ void ata_pci_remove_one(struct pci_dev *pdev) |
1122 | ata_host_detach(host); |
1123 | } |
1124 | |
1125 | +void ata_pci_shutdown_one(struct pci_dev *pdev) |
1126 | +{ |
1127 | + struct ata_host *host = pci_get_drvdata(pdev); |
1128 | + int i; |
1129 | + |
1130 | + for (i = 0; i < host->n_ports; i++) { |
1131 | + struct ata_port *ap = host->ports[i]; |
1132 | + |
1133 | + ap->pflags |= ATA_PFLAG_FROZEN; |
1134 | + |
1135 | + /* Disable port interrupts */ |
1136 | + if (ap->ops->freeze) |
1137 | + ap->ops->freeze(ap); |
1138 | + |
1139 | + /* Stop the port DMA engines */ |
1140 | + if (ap->ops->port_stop) |
1141 | + ap->ops->port_stop(ap); |
1142 | + } |
1143 | +} |
1144 | + |
1145 | /* move to PCI subsystem */ |
1146 | int pci_test_config_bits(struct pci_dev *pdev, const struct pci_bits *bits) |
1147 | { |
1148 | @@ -7382,6 +7402,7 @@ EXPORT_SYMBOL_GPL(ata_timing_cycle2mode); |
1149 | |
1150 | #ifdef CONFIG_PCI |
1151 | EXPORT_SYMBOL_GPL(pci_test_config_bits); |
1152 | +EXPORT_SYMBOL_GPL(ata_pci_shutdown_one); |
1153 | EXPORT_SYMBOL_GPL(ata_pci_remove_one); |
1154 | #ifdef CONFIG_PM |
1155 | EXPORT_SYMBOL_GPL(ata_pci_device_do_suspend); |
1156 | diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c |
1157 | index 485865fd0412..f19a03b62365 100644 |
1158 | --- a/drivers/block/floppy.c |
1159 | +++ b/drivers/block/floppy.c |
1160 | @@ -853,14 +853,17 @@ static void reset_fdc_info(int mode) |
1161 | /* selects the fdc and drive, and enables the fdc's input/dma. */ |
1162 | static void set_fdc(int drive) |
1163 | { |
1164 | + unsigned int new_fdc = fdc; |
1165 | + |
1166 | if (drive >= 0 && drive < N_DRIVE) { |
1167 | - fdc = FDC(drive); |
1168 | + new_fdc = FDC(drive); |
1169 | current_drive = drive; |
1170 | } |
1171 | - if (fdc != 1 && fdc != 0) { |
1172 | + if (new_fdc >= N_FDC) { |
1173 | pr_info("bad fdc value\n"); |
1174 | return; |
1175 | } |
1176 | + fdc = new_fdc; |
1177 | set_dor(fdc, ~0, 8); |
1178 | #if N_FDC > 1 |
1179 | set_dor(1 - fdc, ~8, 0); |
1180 | diff --git a/drivers/char/tpm/tpm2-cmd.c b/drivers/char/tpm/tpm2-cmd.c |
1181 | index 5817dfe5c5d2..2f8026b71933 100644 |
1182 | --- a/drivers/char/tpm/tpm2-cmd.c |
1183 | +++ b/drivers/char/tpm/tpm2-cmd.c |
1184 | @@ -831,6 +831,8 @@ static int tpm2_init_bank_info(struct tpm_chip *chip, u32 bank_index) |
1185 | return 0; |
1186 | } |
1187 | |
1188 | + bank->crypto_id = HASH_ALGO__LAST; |
1189 | + |
1190 | return tpm2_pcr_read(chip, 0, &digest, &bank->digest_size); |
1191 | } |
1192 | |
1193 | diff --git a/drivers/dma/imx-sdma.c b/drivers/dma/imx-sdma.c |
1194 | index 66f1b2ac5cde..c27e206a764c 100644 |
1195 | --- a/drivers/dma/imx-sdma.c |
1196 | +++ b/drivers/dma/imx-sdma.c |
1197 | @@ -760,8 +760,12 @@ static void sdma_start_desc(struct sdma_channel *sdmac) |
1198 | return; |
1199 | } |
1200 | sdmac->desc = desc = to_sdma_desc(&vd->tx); |
1201 | - |
1202 | - list_del(&vd->node); |
1203 | + /* |
1204 | + * Do not delete the node in desc_issued list in cyclic mode, otherwise |
1205 | + * the desc allocated will never be freed in vchan_dma_desc_free_list |
1206 | + */ |
1207 | + if (!(sdmac->flags & IMX_DMA_SG_LOOP)) |
1208 | + list_del(&vd->node); |
1209 | |
1210 | sdma->channel_control[channel].base_bd_ptr = desc->bd_phys; |
1211 | sdma->channel_control[channel].current_bd_ptr = desc->bd_phys; |
1212 | @@ -1067,6 +1071,7 @@ static void sdma_channel_terminate_work(struct work_struct *work) |
1213 | |
1214 | spin_lock_irqsave(&sdmac->vc.lock, flags); |
1215 | vchan_get_all_descriptors(&sdmac->vc, &head); |
1216 | + sdmac->desc = NULL; |
1217 | spin_unlock_irqrestore(&sdmac->vc.lock, flags); |
1218 | vchan_dma_desc_free_list(&sdmac->vc, &head); |
1219 | sdmac->context_loaded = false; |
1220 | @@ -1075,19 +1080,11 @@ static void sdma_channel_terminate_work(struct work_struct *work) |
1221 | static int sdma_disable_channel_async(struct dma_chan *chan) |
1222 | { |
1223 | struct sdma_channel *sdmac = to_sdma_chan(chan); |
1224 | - unsigned long flags; |
1225 | - |
1226 | - spin_lock_irqsave(&sdmac->vc.lock, flags); |
1227 | |
1228 | sdma_disable_channel(chan); |
1229 | |
1230 | - if (sdmac->desc) { |
1231 | - vchan_terminate_vdesc(&sdmac->desc->vd); |
1232 | - sdmac->desc = NULL; |
1233 | + if (sdmac->desc) |
1234 | schedule_work(&sdmac->terminate_worker); |
1235 | - } |
1236 | - |
1237 | - spin_unlock_irqrestore(&sdmac->vc.lock, flags); |
1238 | |
1239 | return 0; |
1240 | } |
1241 | diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c |
1242 | index 596722e79a26..2816d0329738 100644 |
1243 | --- a/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c |
1244 | +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c |
1245 | @@ -3977,11 +3977,13 @@ static uint64_t gfx_v10_0_get_gpu_clock_counter(struct amdgpu_device *adev) |
1246 | { |
1247 | uint64_t clock; |
1248 | |
1249 | + amdgpu_gfx_off_ctrl(adev, false); |
1250 | mutex_lock(&adev->gfx.gpu_clock_mutex); |
1251 | WREG32_SOC15(GC, 0, mmRLC_CAPTURE_GPU_CLOCK_COUNT, 1); |
1252 | clock = (uint64_t)RREG32_SOC15(GC, 0, mmRLC_GPU_CLOCK_COUNT_LSB) | |
1253 | ((uint64_t)RREG32_SOC15(GC, 0, mmRLC_GPU_CLOCK_COUNT_MSB) << 32ULL); |
1254 | mutex_unlock(&adev->gfx.gpu_clock_mutex); |
1255 | + amdgpu_gfx_off_ctrl(adev, true); |
1256 | return clock; |
1257 | } |
1258 | |
1259 | diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c |
1260 | index 0125ea7c4103..d85e1e559c82 100644 |
1261 | --- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c |
1262 | +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c |
1263 | @@ -4080,11 +4080,13 @@ static uint64_t gfx_v9_0_get_gpu_clock_counter(struct amdgpu_device *adev) |
1264 | { |
1265 | uint64_t clock; |
1266 | |
1267 | + amdgpu_gfx_off_ctrl(adev, false); |
1268 | mutex_lock(&adev->gfx.gpu_clock_mutex); |
1269 | WREG32_SOC15(GC, 0, mmRLC_CAPTURE_GPU_CLOCK_COUNT, 1); |
1270 | clock = (uint64_t)RREG32_SOC15(GC, 0, mmRLC_GPU_CLOCK_COUNT_LSB) | |
1271 | ((uint64_t)RREG32_SOC15(GC, 0, mmRLC_GPU_CLOCK_COUNT_MSB) << 32ULL); |
1272 | mutex_unlock(&adev->gfx.gpu_clock_mutex); |
1273 | + amdgpu_gfx_off_ctrl(adev, true); |
1274 | return clock; |
1275 | } |
1276 | |
1277 | diff --git a/drivers/gpu/drm/amd/amdgpu/soc15.c b/drivers/gpu/drm/amd/amdgpu/soc15.c |
1278 | index 4ccfcdf8f16a..80934ca17260 100644 |
1279 | --- a/drivers/gpu/drm/amd/amdgpu/soc15.c |
1280 | +++ b/drivers/gpu/drm/amd/amdgpu/soc15.c |
1281 | @@ -267,7 +267,12 @@ static u32 soc15_get_config_memsize(struct amdgpu_device *adev) |
1282 | |
1283 | static u32 soc15_get_xclk(struct amdgpu_device *adev) |
1284 | { |
1285 | - return adev->clock.spll.reference_freq; |
1286 | + u32 reference_clock = adev->clock.spll.reference_freq; |
1287 | + |
1288 | + if (adev->asic_type == CHIP_RAVEN) |
1289 | + return reference_clock / 4; |
1290 | + |
1291 | + return reference_clock; |
1292 | } |
1293 | |
1294 | |
1295 | diff --git a/drivers/gpu/drm/bridge/tc358767.c b/drivers/gpu/drm/bridge/tc358767.c |
1296 | index 8a8d605021f0..0454675a44cb 100644 |
1297 | --- a/drivers/gpu/drm/bridge/tc358767.c |
1298 | +++ b/drivers/gpu/drm/bridge/tc358767.c |
1299 | @@ -294,7 +294,7 @@ static inline int tc_poll_timeout(struct tc_data *tc, unsigned int addr, |
1300 | |
1301 | static int tc_aux_wait_busy(struct tc_data *tc) |
1302 | { |
1303 | - return tc_poll_timeout(tc, DP0_AUXSTATUS, AUX_BUSY, 0, 1000, 100000); |
1304 | + return tc_poll_timeout(tc, DP0_AUXSTATUS, AUX_BUSY, 0, 100, 100000); |
1305 | } |
1306 | |
1307 | static int tc_aux_write_data(struct tc_data *tc, const void *data, |
1308 | @@ -637,7 +637,7 @@ static int tc_aux_link_setup(struct tc_data *tc) |
1309 | if (ret) |
1310 | goto err; |
1311 | |
1312 | - ret = tc_poll_timeout(tc, DP_PHY_CTRL, PHY_RDY, PHY_RDY, 1, 1000); |
1313 | + ret = tc_poll_timeout(tc, DP_PHY_CTRL, PHY_RDY, PHY_RDY, 100, 100000); |
1314 | if (ret == -ETIMEDOUT) { |
1315 | dev_err(tc->dev, "Timeout waiting for PHY to become ready"); |
1316 | return ret; |
1317 | @@ -861,7 +861,7 @@ static int tc_wait_link_training(struct tc_data *tc) |
1318 | int ret; |
1319 | |
1320 | ret = tc_poll_timeout(tc, DP0_LTSTAT, LT_LOOPDONE, |
1321 | - LT_LOOPDONE, 1, 1000); |
1322 | + LT_LOOPDONE, 500, 100000); |
1323 | if (ret) { |
1324 | dev_err(tc->dev, "Link training timeout waiting for LT_LOOPDONE!\n"); |
1325 | return ret; |
1326 | @@ -934,7 +934,7 @@ static int tc_main_link_enable(struct tc_data *tc) |
1327 | dp_phy_ctrl &= ~(DP_PHY_RST | PHY_M1_RST | PHY_M0_RST); |
1328 | ret = regmap_write(tc->regmap, DP_PHY_CTRL, dp_phy_ctrl); |
1329 | |
1330 | - ret = tc_poll_timeout(tc, DP_PHY_CTRL, PHY_RDY, PHY_RDY, 1, 1000); |
1331 | + ret = tc_poll_timeout(tc, DP_PHY_CTRL, PHY_RDY, PHY_RDY, 500, 100000); |
1332 | if (ret) { |
1333 | dev_err(dev, "timeout waiting for phy become ready"); |
1334 | return ret; |
1335 | diff --git a/drivers/gpu/drm/i915/Kconfig b/drivers/gpu/drm/i915/Kconfig |
1336 | index 0d21402945ab..3317798945e8 100644 |
1337 | --- a/drivers/gpu/drm/i915/Kconfig |
1338 | +++ b/drivers/gpu/drm/i915/Kconfig |
1339 | @@ -75,9 +75,8 @@ config DRM_I915_CAPTURE_ERROR |
1340 | help |
1341 | This option enables capturing the GPU state when a hang is detected. |
1342 | This information is vital for triaging hangs and assists in debugging. |
1343 | - Please report any hang to |
1344 | - https://bugs.freedesktop.org/enter_bug.cgi?product=DRI |
1345 | - for triaging. |
1346 | + Please report any hang for triaging according to: |
1347 | + https://gitlab.freedesktop.org/drm/intel/-/wikis/How-to-file-i915-bugs |
1348 | |
1349 | If in doubt, say "Y". |
1350 | |
1351 | diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c |
1352 | index af50f05f4e9d..272503615378 100644 |
1353 | --- a/drivers/gpu/drm/i915/display/intel_display.c |
1354 | +++ b/drivers/gpu/drm/i915/display/intel_display.c |
1355 | @@ -10510,7 +10510,7 @@ static u32 intel_cursor_base(const struct intel_plane_state *plane_state) |
1356 | u32 base; |
1357 | |
1358 | if (INTEL_INFO(dev_priv)->display.cursor_needs_physical) |
1359 | - base = obj->phys_handle->busaddr; |
1360 | + base = sg_dma_address(obj->mm.pages->sgl); |
1361 | else |
1362 | base = intel_plane_ggtt_offset(plane_state); |
1363 | |
1364 | diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object_types.h b/drivers/gpu/drm/i915/gem/i915_gem_object_types.h |
1365 | index 646859fea224..08b35587bc6d 100644 |
1366 | --- a/drivers/gpu/drm/i915/gem/i915_gem_object_types.h |
1367 | +++ b/drivers/gpu/drm/i915/gem/i915_gem_object_types.h |
1368 | @@ -240,9 +240,6 @@ struct drm_i915_gem_object { |
1369 | |
1370 | void *gvt_info; |
1371 | }; |
1372 | - |
1373 | - /** for phys allocated objects */ |
1374 | - struct drm_dma_handle *phys_handle; |
1375 | }; |
1376 | |
1377 | static inline struct drm_i915_gem_object * |
1378 | diff --git a/drivers/gpu/drm/i915/gem/i915_gem_phys.c b/drivers/gpu/drm/i915/gem/i915_gem_phys.c |
1379 | index 768356908160..0cfe9bd76377 100644 |
1380 | --- a/drivers/gpu/drm/i915/gem/i915_gem_phys.c |
1381 | +++ b/drivers/gpu/drm/i915/gem/i915_gem_phys.c |
1382 | @@ -21,88 +21,87 @@ |
1383 | static int i915_gem_object_get_pages_phys(struct drm_i915_gem_object *obj) |
1384 | { |
1385 | struct address_space *mapping = obj->base.filp->f_mapping; |
1386 | - struct drm_dma_handle *phys; |
1387 | - struct sg_table *st; |
1388 | struct scatterlist *sg; |
1389 | - char *vaddr; |
1390 | + struct sg_table *st; |
1391 | + dma_addr_t dma; |
1392 | + void *vaddr; |
1393 | + void *dst; |
1394 | int i; |
1395 | - int err; |
1396 | |
1397 | if (WARN_ON(i915_gem_object_needs_bit17_swizzle(obj))) |
1398 | return -EINVAL; |
1399 | |
1400 | - /* Always aligning to the object size, allows a single allocation |
1401 | + /* |
1402 | + * Always aligning to the object size, allows a single allocation |
1403 | * to handle all possible callers, and given typical object sizes, |
1404 | * the alignment of the buddy allocation will naturally match. |
1405 | */ |
1406 | - phys = drm_pci_alloc(obj->base.dev, |
1407 | - roundup_pow_of_two(obj->base.size), |
1408 | - roundup_pow_of_two(obj->base.size)); |
1409 | - if (!phys) |
1410 | + vaddr = dma_alloc_coherent(&obj->base.dev->pdev->dev, |
1411 | + roundup_pow_of_two(obj->base.size), |
1412 | + &dma, GFP_KERNEL); |
1413 | + if (!vaddr) |
1414 | return -ENOMEM; |
1415 | |
1416 | - vaddr = phys->vaddr; |
1417 | + st = kmalloc(sizeof(*st), GFP_KERNEL); |
1418 | + if (!st) |
1419 | + goto err_pci; |
1420 | + |
1421 | + if (sg_alloc_table(st, 1, GFP_KERNEL)) |
1422 | + goto err_st; |
1423 | + |
1424 | + sg = st->sgl; |
1425 | + sg->offset = 0; |
1426 | + sg->length = obj->base.size; |
1427 | + |
1428 | + sg_assign_page(sg, (struct page *)vaddr); |
1429 | + sg_dma_address(sg) = dma; |
1430 | + sg_dma_len(sg) = obj->base.size; |
1431 | + |
1432 | + dst = vaddr; |
1433 | for (i = 0; i < obj->base.size / PAGE_SIZE; i++) { |
1434 | struct page *page; |
1435 | - char *src; |
1436 | + void *src; |
1437 | |
1438 | page = shmem_read_mapping_page(mapping, i); |
1439 | - if (IS_ERR(page)) { |
1440 | - err = PTR_ERR(page); |
1441 | - goto err_phys; |
1442 | - } |
1443 | + if (IS_ERR(page)) |
1444 | + goto err_st; |
1445 | |
1446 | src = kmap_atomic(page); |
1447 | - memcpy(vaddr, src, PAGE_SIZE); |
1448 | - drm_clflush_virt_range(vaddr, PAGE_SIZE); |
1449 | + memcpy(dst, src, PAGE_SIZE); |
1450 | + drm_clflush_virt_range(dst, PAGE_SIZE); |
1451 | kunmap_atomic(src); |
1452 | |
1453 | put_page(page); |
1454 | - vaddr += PAGE_SIZE; |
1455 | + dst += PAGE_SIZE; |
1456 | } |
1457 | |
1458 | intel_gt_chipset_flush(&to_i915(obj->base.dev)->gt); |
1459 | |
1460 | - st = kmalloc(sizeof(*st), GFP_KERNEL); |
1461 | - if (!st) { |
1462 | - err = -ENOMEM; |
1463 | - goto err_phys; |
1464 | - } |
1465 | - |
1466 | - if (sg_alloc_table(st, 1, GFP_KERNEL)) { |
1467 | - kfree(st); |
1468 | - err = -ENOMEM; |
1469 | - goto err_phys; |
1470 | - } |
1471 | - |
1472 | - sg = st->sgl; |
1473 | - sg->offset = 0; |
1474 | - sg->length = obj->base.size; |
1475 | - |
1476 | - sg_dma_address(sg) = phys->busaddr; |
1477 | - sg_dma_len(sg) = obj->base.size; |
1478 | - |
1479 | - obj->phys_handle = phys; |
1480 | - |
1481 | __i915_gem_object_set_pages(obj, st, sg->length); |
1482 | |
1483 | return 0; |
1484 | |
1485 | -err_phys: |
1486 | - drm_pci_free(obj->base.dev, phys); |
1487 | - |
1488 | - return err; |
1489 | +err_st: |
1490 | + kfree(st); |
1491 | +err_pci: |
1492 | + dma_free_coherent(&obj->base.dev->pdev->dev, |
1493 | + roundup_pow_of_two(obj->base.size), |
1494 | + vaddr, dma); |
1495 | + return -ENOMEM; |
1496 | } |
1497 | |
1498 | static void |
1499 | i915_gem_object_put_pages_phys(struct drm_i915_gem_object *obj, |
1500 | struct sg_table *pages) |
1501 | { |
1502 | + dma_addr_t dma = sg_dma_address(pages->sgl); |
1503 | + void *vaddr = sg_page(pages->sgl); |
1504 | + |
1505 | __i915_gem_object_release_shmem(obj, pages, false); |
1506 | |
1507 | if (obj->mm.dirty) { |
1508 | struct address_space *mapping = obj->base.filp->f_mapping; |
1509 | - char *vaddr = obj->phys_handle->vaddr; |
1510 | + void *src = vaddr; |
1511 | int i; |
1512 | |
1513 | for (i = 0; i < obj->base.size / PAGE_SIZE; i++) { |
1514 | @@ -114,15 +113,16 @@ i915_gem_object_put_pages_phys(struct drm_i915_gem_object *obj, |
1515 | continue; |
1516 | |
1517 | dst = kmap_atomic(page); |
1518 | - drm_clflush_virt_range(vaddr, PAGE_SIZE); |
1519 | - memcpy(dst, vaddr, PAGE_SIZE); |
1520 | + drm_clflush_virt_range(src, PAGE_SIZE); |
1521 | + memcpy(dst, src, PAGE_SIZE); |
1522 | kunmap_atomic(dst); |
1523 | |
1524 | set_page_dirty(page); |
1525 | if (obj->mm.madv == I915_MADV_WILLNEED) |
1526 | mark_page_accessed(page); |
1527 | put_page(page); |
1528 | - vaddr += PAGE_SIZE; |
1529 | + |
1530 | + src += PAGE_SIZE; |
1531 | } |
1532 | obj->mm.dirty = false; |
1533 | } |
1534 | @@ -130,7 +130,9 @@ i915_gem_object_put_pages_phys(struct drm_i915_gem_object *obj, |
1535 | sg_free_table(pages); |
1536 | kfree(pages); |
1537 | |
1538 | - drm_pci_free(obj->base.dev, obj->phys_handle); |
1539 | + dma_free_coherent(&obj->base.dev->pdev->dev, |
1540 | + roundup_pow_of_two(obj->base.size), |
1541 | + vaddr, dma); |
1542 | } |
1543 | |
1544 | static void phys_release(struct drm_i915_gem_object *obj) |
1545 | diff --git a/drivers/gpu/drm/i915/gt/intel_engine.h b/drivers/gpu/drm/i915/gt/intel_engine.h |
1546 | index 22aab8593abf..926272b5a0ca 100644 |
1547 | --- a/drivers/gpu/drm/i915/gt/intel_engine.h |
1548 | +++ b/drivers/gpu/drm/i915/gt/intel_engine.h |
1549 | @@ -250,6 +250,14 @@ static inline u32 intel_ring_wrap(const struct intel_ring *ring, u32 pos) |
1550 | return pos & (ring->size - 1); |
1551 | } |
1552 | |
1553 | +static inline int intel_ring_direction(const struct intel_ring *ring, |
1554 | + u32 next, u32 prev) |
1555 | +{ |
1556 | + typecheck(typeof(ring->size), next); |
1557 | + typecheck(typeof(ring->size), prev); |
1558 | + return (next - prev) << ring->wrap; |
1559 | +} |
1560 | + |
1561 | static inline bool |
1562 | intel_ring_offset_valid(const struct intel_ring *ring, |
1563 | unsigned int pos) |
1564 | diff --git a/drivers/gpu/drm/i915/gt/intel_engine_types.h b/drivers/gpu/drm/i915/gt/intel_engine_types.h |
1565 | index 798e1b024406..c77c9518c58b 100644 |
1566 | --- a/drivers/gpu/drm/i915/gt/intel_engine_types.h |
1567 | +++ b/drivers/gpu/drm/i915/gt/intel_engine_types.h |
1568 | @@ -107,6 +107,7 @@ struct intel_ring { |
1569 | |
1570 | u32 space; |
1571 | u32 size; |
1572 | + u32 wrap; |
1573 | u32 effective_size; |
1574 | }; |
1575 | |
1576 | diff --git a/drivers/gpu/drm/i915/gt/intel_lrc.c b/drivers/gpu/drm/i915/gt/intel_lrc.c |
1577 | index 4949b5ad860f..66f6d1a897f2 100644 |
1578 | --- a/drivers/gpu/drm/i915/gt/intel_lrc.c |
1579 | +++ b/drivers/gpu/drm/i915/gt/intel_lrc.c |
1580 | @@ -471,12 +471,6 @@ lrc_descriptor(struct intel_context *ce, struct intel_engine_cs *engine) |
1581 | return desc; |
1582 | } |
1583 | |
1584 | -static void unwind_wa_tail(struct i915_request *rq) |
1585 | -{ |
1586 | - rq->tail = intel_ring_wrap(rq->ring, rq->wa_tail - WA_TAIL_BYTES); |
1587 | - assert_ring_tail_valid(rq->ring, rq->tail); |
1588 | -} |
1589 | - |
1590 | static struct i915_request * |
1591 | __unwind_incomplete_requests(struct intel_engine_cs *engine) |
1592 | { |
1593 | @@ -495,7 +489,6 @@ __unwind_incomplete_requests(struct intel_engine_cs *engine) |
1594 | continue; /* XXX */ |
1595 | |
1596 | __i915_request_unsubmit(rq); |
1597 | - unwind_wa_tail(rq); |
1598 | |
1599 | /* |
1600 | * Push the request back into the queue for later resubmission. |
1601 | @@ -650,13 +643,35 @@ execlists_schedule_out(struct i915_request *rq) |
1602 | i915_request_put(rq); |
1603 | } |
1604 | |
1605 | -static u64 execlists_update_context(const struct i915_request *rq) |
1606 | +static u64 execlists_update_context(struct i915_request *rq) |
1607 | { |
1608 | struct intel_context *ce = rq->hw_context; |
1609 | - u64 desc; |
1610 | + u64 desc = ce->lrc_desc; |
1611 | + u32 tail, prev; |
1612 | |
1613 | - ce->lrc_reg_state[CTX_RING_TAIL + 1] = |
1614 | - intel_ring_set_tail(rq->ring, rq->tail); |
1615 | + /* |
1616 | + * WaIdleLiteRestore:bdw,skl |
1617 | + * |
1618 | + * We should never submit the context with the same RING_TAIL twice |
1619 | + * just in case we submit an empty ring, which confuses the HW. |
1620 | + * |
1621 | + * We append a couple of NOOPs (gen8_emit_wa_tail) after the end of |
1622 | + * the normal request to be able to always advance the RING_TAIL on |
1623 | + * subsequent resubmissions (for lite restore). Should that fail us, |
1624 | + * and we try and submit the same tail again, force the context |
1625 | + * reload. |
1626 | + * |
1627 | + * If we need to return to a preempted context, we need to skip the |
1628 | + * lite-restore and force it to reload the RING_TAIL. Otherwise, the |
1629 | + * HW has a tendency to ignore us rewinding the TAIL to the end of |
1630 | + * an earlier request. |
1631 | + */ |
1632 | + tail = intel_ring_set_tail(rq->ring, rq->tail); |
1633 | + prev = ce->lrc_reg_state[CTX_RING_TAIL + 1]; |
1634 | + if (unlikely(intel_ring_direction(rq->ring, tail, prev) <= 0)) |
1635 | + desc |= CTX_DESC_FORCE_RESTORE; |
1636 | + ce->lrc_reg_state[CTX_RING_TAIL + 1] = tail; |
1637 | + rq->tail = rq->wa_tail; |
1638 | |
1639 | /* |
1640 | * Make sure the context image is complete before we submit it to HW. |
1641 | @@ -675,7 +690,6 @@ static u64 execlists_update_context(const struct i915_request *rq) |
1642 | */ |
1643 | mb(); |
1644 | |
1645 | - desc = ce->lrc_desc; |
1646 | ce->lrc_desc &= ~CTX_DESC_FORCE_RESTORE; |
1647 | |
1648 | return desc; |
1649 | @@ -919,6 +933,11 @@ last_active(const struct intel_engine_execlists *execlists) |
1650 | return *last; |
1651 | } |
1652 | |
1653 | +#define for_each_waiter(p__, rq__) \ |
1654 | + list_for_each_entry_lockless(p__, \ |
1655 | + &(rq__)->sched.waiters_list, \ |
1656 | + wait_link) |
1657 | + |
1658 | static void defer_request(struct i915_request *rq, struct list_head * const pl) |
1659 | { |
1660 | LIST_HEAD(list); |
1661 | @@ -936,7 +955,7 @@ static void defer_request(struct i915_request *rq, struct list_head * const pl) |
1662 | GEM_BUG_ON(i915_request_is_active(rq)); |
1663 | list_move_tail(&rq->sched.link, pl); |
1664 | |
1665 | - list_for_each_entry(p, &rq->sched.waiters_list, wait_link) { |
1666 | + for_each_waiter(p, rq) { |
1667 | struct i915_request *w = |
1668 | container_of(p->waiter, typeof(*w), sched); |
1669 | |
1670 | @@ -1102,14 +1121,6 @@ static void execlists_dequeue(struct intel_engine_cs *engine) |
1671 | */ |
1672 | __unwind_incomplete_requests(engine); |
1673 | |
1674 | - /* |
1675 | - * If we need to return to the preempted context, we |
1676 | - * need to skip the lite-restore and force it to |
1677 | - * reload the RING_TAIL. Otherwise, the HW has a |
1678 | - * tendency to ignore us rewinding the TAIL to the |
1679 | - * end of an earlier request. |
1680 | - */ |
1681 | - last->hw_context->lrc_desc |= CTX_DESC_FORCE_RESTORE; |
1682 | last = NULL; |
1683 | } else if (need_timeslice(engine, last) && |
1684 | !timer_pending(&engine->execlists.timer)) { |
1685 | @@ -1150,16 +1161,6 @@ static void execlists_dequeue(struct intel_engine_cs *engine) |
1686 | if (!list_is_last(&last->sched.link, |
1687 | &engine->active.requests)) |
1688 | return; |
1689 | - |
1690 | - /* |
1691 | - * WaIdleLiteRestore:bdw,skl |
1692 | - * Apply the wa NOOPs to prevent |
1693 | - * ring:HEAD == rq:TAIL as we resubmit the |
1694 | - * request. See gen8_emit_fini_breadcrumb() for |
1695 | - * where we prepare the padding after the |
1696 | - * end of the request. |
1697 | - */ |
1698 | - last->tail = last->wa_tail; |
1699 | } |
1700 | } |
1701 | |
1702 | diff --git a/drivers/gpu/drm/i915/gt/intel_ringbuffer.c b/drivers/gpu/drm/i915/gt/intel_ringbuffer.c |
1703 | index bacaa7bb8c9a..eee9fcbe0434 100644 |
1704 | --- a/drivers/gpu/drm/i915/gt/intel_ringbuffer.c |
1705 | +++ b/drivers/gpu/drm/i915/gt/intel_ringbuffer.c |
1706 | @@ -1312,6 +1312,8 @@ intel_engine_create_ring(struct intel_engine_cs *engine, int size) |
1707 | kref_init(&ring->ref); |
1708 | |
1709 | ring->size = size; |
1710 | + ring->wrap = BITS_PER_TYPE(ring->size) - ilog2(size); |
1711 | + |
1712 | /* Workaround an erratum on the i830 which causes a hang if |
1713 | * the TAIL pointer points to within the last 2 cachelines |
1714 | * of the buffer. |
1715 | diff --git a/drivers/gpu/drm/i915/gvt/gtt.c b/drivers/gpu/drm/i915/gvt/gtt.c |
1716 | index 4b04af569c05..7dc7bb850d0a 100644 |
1717 | --- a/drivers/gpu/drm/i915/gvt/gtt.c |
1718 | +++ b/drivers/gpu/drm/i915/gvt/gtt.c |
1719 | @@ -1956,7 +1956,11 @@ void _intel_vgpu_mm_release(struct kref *mm_ref) |
1720 | |
1721 | if (mm->type == INTEL_GVT_MM_PPGTT) { |
1722 | list_del(&mm->ppgtt_mm.list); |
1723 | + |
1724 | + mutex_lock(&mm->vgpu->gvt->gtt.ppgtt_mm_lock); |
1725 | list_del(&mm->ppgtt_mm.lru_list); |
1726 | + mutex_unlock(&mm->vgpu->gvt->gtt.ppgtt_mm_lock); |
1727 | + |
1728 | invalidate_ppgtt_mm(mm); |
1729 | } else { |
1730 | vfree(mm->ggtt_mm.virtual_ggtt); |
1731 | diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c |
1732 | index 98305d987ac1..4d561da3dcea 100644 |
1733 | --- a/drivers/gpu/drm/i915/i915_gem.c |
1734 | +++ b/drivers/gpu/drm/i915/i915_gem.c |
1735 | @@ -136,7 +136,7 @@ i915_gem_phys_pwrite(struct drm_i915_gem_object *obj, |
1736 | struct drm_i915_gem_pwrite *args, |
1737 | struct drm_file *file) |
1738 | { |
1739 | - void *vaddr = obj->phys_handle->vaddr + args->offset; |
1740 | + void *vaddr = sg_page(obj->mm.pages->sgl) + args->offset; |
1741 | char __user *user_data = u64_to_user_ptr(args->data_ptr); |
1742 | |
1743 | /* |
1744 | @@ -802,10 +802,10 @@ i915_gem_pwrite_ioctl(struct drm_device *dev, void *data, |
1745 | ret = i915_gem_gtt_pwrite_fast(obj, args); |
1746 | |
1747 | if (ret == -EFAULT || ret == -ENOSPC) { |
1748 | - if (obj->phys_handle) |
1749 | - ret = i915_gem_phys_pwrite(obj, args, file); |
1750 | - else |
1751 | + if (i915_gem_object_has_struct_page(obj)) |
1752 | ret = i915_gem_shmem_pwrite(obj, args); |
1753 | + else |
1754 | + ret = i915_gem_phys_pwrite(obj, args, file); |
1755 | } |
1756 | |
1757 | i915_gem_object_unpin_pages(obj); |
1758 | diff --git a/drivers/gpu/drm/i915/i915_gpu_error.c b/drivers/gpu/drm/i915/i915_gpu_error.c |
1759 | index e284bd76fa86..fe9edbba997c 100644 |
1760 | --- a/drivers/gpu/drm/i915/i915_gpu_error.c |
1761 | +++ b/drivers/gpu/drm/i915/i915_gpu_error.c |
1762 | @@ -1768,7 +1768,8 @@ void i915_capture_error_state(struct drm_i915_private *i915, |
1763 | if (!xchg(&warned, true) && |
1764 | ktime_get_real_seconds() - DRIVER_TIMESTAMP < DAY_AS_SECONDS(180)) { |
1765 | pr_info("GPU hangs can indicate a bug anywhere in the entire gfx stack, including userspace.\n"); |
1766 | - pr_info("Please file a _new_ bug report on bugs.freedesktop.org against DRI -> DRM/Intel\n"); |
1767 | + pr_info("Please file a _new_ bug report at https://gitlab.freedesktop.org/drm/intel/issues/new.\n"); |
1768 | + pr_info("Please see https://gitlab.freedesktop.org/drm/intel/-/wikis/How-to-file-i915-bugs for details.\n"); |
1769 | pr_info("drm/i915 developers can then reassign to the right component if it's not a kernel issue.\n"); |
1770 | pr_info("The GPU crash dump is required to analyze GPU hangs, so please always attach it.\n"); |
1771 | pr_info("GPU crash dump saved to /sys/class/drm/card%d/error\n", |
1772 | diff --git a/drivers/gpu/drm/i915/i915_scheduler.c b/drivers/gpu/drm/i915/i915_scheduler.c |
1773 | index 3eba8a2b39c2..0ef205fe5e29 100644 |
1774 | --- a/drivers/gpu/drm/i915/i915_scheduler.c |
1775 | +++ b/drivers/gpu/drm/i915/i915_scheduler.c |
1776 | @@ -418,8 +418,6 @@ bool __i915_sched_node_add_dependency(struct i915_sched_node *node, |
1777 | |
1778 | if (!node_signaled(signal)) { |
1779 | INIT_LIST_HEAD(&dep->dfs_link); |
1780 | - list_add(&dep->wait_link, &signal->waiters_list); |
1781 | - list_add(&dep->signal_link, &node->signalers_list); |
1782 | dep->signaler = signal; |
1783 | dep->waiter = node; |
1784 | dep->flags = flags; |
1785 | @@ -429,6 +427,10 @@ bool __i915_sched_node_add_dependency(struct i915_sched_node *node, |
1786 | !node_started(signal)) |
1787 | node->flags |= I915_SCHED_HAS_SEMAPHORE_CHAIN; |
1788 | |
1789 | + /* All set, now publish. Beware the lockless walkers. */ |
1790 | + list_add(&dep->signal_link, &node->signalers_list); |
1791 | + list_add_rcu(&dep->wait_link, &signal->waiters_list); |
1792 | + |
1793 | /* |
1794 | * As we do not allow WAIT to preempt inflight requests, |
1795 | * once we have executed a request, along with triggering |
1796 | diff --git a/drivers/gpu/drm/i915/i915_utils.c b/drivers/gpu/drm/i915/i915_utils.c |
1797 | index 16acdf7bdbe6..17cfeef35a24 100644 |
1798 | --- a/drivers/gpu/drm/i915/i915_utils.c |
1799 | +++ b/drivers/gpu/drm/i915/i915_utils.c |
1800 | @@ -8,9 +8,8 @@ |
1801 | #include "i915_drv.h" |
1802 | #include "i915_utils.h" |
1803 | |
1804 | -#define FDO_BUG_URL "https://bugs.freedesktop.org/enter_bug.cgi?product=DRI" |
1805 | -#define FDO_BUG_MSG "Please file a bug at " FDO_BUG_URL " against DRM/Intel " \ |
1806 | - "providing the dmesg log by booting with drm.debug=0xf" |
1807 | +#define FDO_BUG_URL "https://gitlab.freedesktop.org/drm/intel/-/wikis/How-to-file-i915-bugs" |
1808 | +#define FDO_BUG_MSG "Please file a bug on drm/i915; see " FDO_BUG_URL " for details." |
1809 | |
1810 | void |
1811 | __i915_printk(struct drm_i915_private *dev_priv, const char *level, |
1812 | diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_formats.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_formats.c |
1813 | index 24ab6249083a..6f420cc73dbd 100644 |
1814 | --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_formats.c |
1815 | +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_formats.c |
1816 | @@ -255,13 +255,13 @@ static const struct dpu_format dpu_format_map[] = { |
1817 | |
1818 | INTERLEAVED_RGB_FMT(RGB565, |
1819 | 0, COLOR_5BIT, COLOR_6BIT, COLOR_5BIT, |
1820 | - C2_R_Cr, C0_G_Y, C1_B_Cb, 0, 3, |
1821 | + C1_B_Cb, C0_G_Y, C2_R_Cr, 0, 3, |
1822 | false, 2, 0, |
1823 | DPU_FETCH_LINEAR, 1), |
1824 | |
1825 | INTERLEAVED_RGB_FMT(BGR565, |
1826 | 0, COLOR_5BIT, COLOR_6BIT, COLOR_5BIT, |
1827 | - C1_B_Cb, C0_G_Y, C2_R_Cr, 0, 3, |
1828 | + C2_R_Cr, C0_G_Y, C1_B_Cb, 0, 3, |
1829 | false, 2, 0, |
1830 | DPU_FETCH_LINEAR, 1), |
1831 | |
1832 | diff --git a/drivers/gpu/drm/nouveau/dispnv50/wndw.c b/drivers/gpu/drm/nouveau/dispnv50/wndw.c |
1833 | index 5193b6257061..b856e87574fd 100644 |
1834 | --- a/drivers/gpu/drm/nouveau/dispnv50/wndw.c |
1835 | +++ b/drivers/gpu/drm/nouveau/dispnv50/wndw.c |
1836 | @@ -451,6 +451,8 @@ nv50_wndw_atomic_check(struct drm_plane *plane, struct drm_plane_state *state) |
1837 | asyw->clr.ntfy = armw->ntfy.handle != 0; |
1838 | asyw->clr.sema = armw->sema.handle != 0; |
1839 | asyw->clr.xlut = armw->xlut.handle != 0; |
1840 | + if (asyw->clr.xlut && asyw->visible) |
1841 | + asyw->set.xlut = asyw->xlut.handle != 0; |
1842 | asyw->clr.csc = armw->csc.valid; |
1843 | if (wndw->func->image_clr) |
1844 | asyw->clr.image = armw->image.handle[0] != 0; |
1845 | diff --git a/drivers/gpu/drm/panfrost/panfrost_mmu.c b/drivers/gpu/drm/panfrost/panfrost_mmu.c |
1846 | index 763cfca886a7..3107b0738e40 100644 |
1847 | --- a/drivers/gpu/drm/panfrost/panfrost_mmu.c |
1848 | +++ b/drivers/gpu/drm/panfrost/panfrost_mmu.c |
1849 | @@ -151,7 +151,12 @@ u32 panfrost_mmu_as_get(struct panfrost_device *pfdev, struct panfrost_mmu *mmu) |
1850 | as = mmu->as; |
1851 | if (as >= 0) { |
1852 | int en = atomic_inc_return(&mmu->as_count); |
1853 | - WARN_ON(en >= NUM_JOB_SLOTS); |
1854 | + |
1855 | + /* |
1856 | + * AS can be retained by active jobs or a perfcnt context, |
1857 | + * hence the '+ 1' here. |
1858 | + */ |
1859 | + WARN_ON(en >= (NUM_JOB_SLOTS + 1)); |
1860 | |
1861 | list_move(&mmu->list, &pfdev->as_lru_list); |
1862 | goto out; |
1863 | diff --git a/drivers/gpu/drm/panfrost/panfrost_perfcnt.c b/drivers/gpu/drm/panfrost/panfrost_perfcnt.c |
1864 | index 684820448be3..6913578d5aa7 100644 |
1865 | --- a/drivers/gpu/drm/panfrost/panfrost_perfcnt.c |
1866 | +++ b/drivers/gpu/drm/panfrost/panfrost_perfcnt.c |
1867 | @@ -73,7 +73,7 @@ static int panfrost_perfcnt_enable_locked(struct panfrost_device *pfdev, |
1868 | struct panfrost_file_priv *user = file_priv->driver_priv; |
1869 | struct panfrost_perfcnt *perfcnt = pfdev->perfcnt; |
1870 | struct drm_gem_shmem_object *bo; |
1871 | - u32 cfg; |
1872 | + u32 cfg, as; |
1873 | int ret; |
1874 | |
1875 | if (user == perfcnt->user) |
1876 | @@ -126,12 +126,8 @@ static int panfrost_perfcnt_enable_locked(struct panfrost_device *pfdev, |
1877 | |
1878 | perfcnt->user = user; |
1879 | |
1880 | - /* |
1881 | - * Always use address space 0 for now. |
1882 | - * FIXME: this needs to be updated when we start using different |
1883 | - * address space. |
1884 | - */ |
1885 | - cfg = GPU_PERFCNT_CFG_AS(0) | |
1886 | + as = panfrost_mmu_as_get(pfdev, perfcnt->mapping->mmu); |
1887 | + cfg = GPU_PERFCNT_CFG_AS(as) | |
1888 | GPU_PERFCNT_CFG_MODE(GPU_PERFCNT_CFG_MODE_MANUAL); |
1889 | |
1890 | /* |
1891 | @@ -195,6 +191,7 @@ static int panfrost_perfcnt_disable_locked(struct panfrost_device *pfdev, |
1892 | drm_gem_shmem_vunmap(&perfcnt->mapping->obj->base.base, perfcnt->buf); |
1893 | perfcnt->buf = NULL; |
1894 | panfrost_gem_close(&perfcnt->mapping->obj->base.base, file_priv); |
1895 | + panfrost_mmu_as_put(pfdev, perfcnt->mapping->mmu); |
1896 | panfrost_gem_mapping_put(perfcnt->mapping); |
1897 | perfcnt->mapping = NULL; |
1898 | pm_runtime_mark_last_busy(pfdev->dev); |
1899 | diff --git a/drivers/infiniband/ulp/isert/ib_isert.c b/drivers/infiniband/ulp/isert/ib_isert.c |
1900 | index b273e421e910..a1a035270cab 100644 |
1901 | --- a/drivers/infiniband/ulp/isert/ib_isert.c |
1902 | +++ b/drivers/infiniband/ulp/isert/ib_isert.c |
1903 | @@ -2575,6 +2575,17 @@ isert_wait4logout(struct isert_conn *isert_conn) |
1904 | } |
1905 | } |
1906 | |
1907 | +static void |
1908 | +isert_wait4cmds(struct iscsi_conn *conn) |
1909 | +{ |
1910 | + isert_info("iscsi_conn %p\n", conn); |
1911 | + |
1912 | + if (conn->sess) { |
1913 | + target_sess_cmd_list_set_waiting(conn->sess->se_sess); |
1914 | + target_wait_for_sess_cmds(conn->sess->se_sess); |
1915 | + } |
1916 | +} |
1917 | + |
1918 | /** |
1919 | * isert_put_unsol_pending_cmds() - Drop commands waiting for |
1920 | * unsolicitate dataout |
1921 | @@ -2622,6 +2633,7 @@ static void isert_wait_conn(struct iscsi_conn *conn) |
1922 | |
1923 | ib_drain_qp(isert_conn->qp); |
1924 | isert_put_unsol_pending_cmds(conn); |
1925 | + isert_wait4cmds(conn); |
1926 | isert_wait4logout(isert_conn); |
1927 | |
1928 | queue_work(isert_release_wq, &isert_conn->release_work); |
1929 | diff --git a/drivers/iommu/qcom_iommu.c b/drivers/iommu/qcom_iommu.c |
1930 | index c31e7bc4ccbe..e0b3fa2bb7ab 100644 |
1931 | --- a/drivers/iommu/qcom_iommu.c |
1932 | +++ b/drivers/iommu/qcom_iommu.c |
1933 | @@ -345,21 +345,19 @@ static void qcom_iommu_domain_free(struct iommu_domain *domain) |
1934 | { |
1935 | struct qcom_iommu_domain *qcom_domain = to_qcom_iommu_domain(domain); |
1936 | |
1937 | - if (WARN_ON(qcom_domain->iommu)) /* forgot to detach? */ |
1938 | - return; |
1939 | - |
1940 | iommu_put_dma_cookie(domain); |
1941 | |
1942 | - /* NOTE: unmap can be called after client device is powered off, |
1943 | - * for example, with GPUs or anything involving dma-buf. So we |
1944 | - * cannot rely on the device_link. Make sure the IOMMU is on to |
1945 | - * avoid unclocked accesses in the TLB inv path: |
1946 | - */ |
1947 | - pm_runtime_get_sync(qcom_domain->iommu->dev); |
1948 | - |
1949 | - free_io_pgtable_ops(qcom_domain->pgtbl_ops); |
1950 | - |
1951 | - pm_runtime_put_sync(qcom_domain->iommu->dev); |
1952 | + if (qcom_domain->iommu) { |
1953 | + /* |
1954 | + * NOTE: unmap can be called after client device is powered |
1955 | + * off, for example, with GPUs or anything involving dma-buf. |
1956 | + * So we cannot rely on the device_link. Make sure the IOMMU |
1957 | + * is on to avoid unclocked accesses in the TLB inv path: |
1958 | + */ |
1959 | + pm_runtime_get_sync(qcom_domain->iommu->dev); |
1960 | + free_io_pgtable_ops(qcom_domain->pgtbl_ops); |
1961 | + pm_runtime_put_sync(qcom_domain->iommu->dev); |
1962 | + } |
1963 | |
1964 | kfree(qcom_domain); |
1965 | } |
1966 | @@ -405,7 +403,7 @@ static void qcom_iommu_detach_dev(struct iommu_domain *domain, struct device *de |
1967 | struct qcom_iommu_domain *qcom_domain = to_qcom_iommu_domain(domain); |
1968 | unsigned i; |
1969 | |
1970 | - if (!qcom_domain->iommu) |
1971 | + if (WARN_ON(!qcom_domain->iommu)) |
1972 | return; |
1973 | |
1974 | pm_runtime_get_sync(qcom_iommu->dev); |
1975 | @@ -418,8 +416,6 @@ static void qcom_iommu_detach_dev(struct iommu_domain *domain, struct device *de |
1976 | ctx->domain = NULL; |
1977 | } |
1978 | pm_runtime_put_sync(qcom_iommu->dev); |
1979 | - |
1980 | - qcom_domain->iommu = NULL; |
1981 | } |
1982 | |
1983 | static int qcom_iommu_map(struct iommu_domain *domain, unsigned long iova, |
1984 | diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c |
1985 | index c27ed7363768..8c4507838325 100644 |
1986 | --- a/drivers/net/ethernet/intel/e1000e/netdev.c |
1987 | +++ b/drivers/net/ethernet/intel/e1000e/netdev.c |
1988 | @@ -4713,12 +4713,12 @@ int e1000e_close(struct net_device *netdev) |
1989 | |
1990 | pm_runtime_get_sync(&pdev->dev); |
1991 | |
1992 | - if (!test_bit(__E1000_DOWN, &adapter->state)) { |
1993 | + if (netif_device_present(netdev)) { |
1994 | e1000e_down(adapter, true); |
1995 | e1000_free_irq(adapter); |
1996 | |
1997 | /* Link status message must follow this format */ |
1998 | - pr_info("%s NIC Link is Down\n", adapter->netdev->name); |
1999 | + pr_info("%s NIC Link is Down\n", netdev->name); |
2000 | } |
2001 | |
2002 | napi_disable(&adapter->napi); |
2003 | @@ -6309,10 +6309,14 @@ static int e1000e_pm_freeze(struct device *dev) |
2004 | { |
2005 | struct net_device *netdev = dev_get_drvdata(dev); |
2006 | struct e1000_adapter *adapter = netdev_priv(netdev); |
2007 | + bool present; |
2008 | |
2009 | + rtnl_lock(); |
2010 | + |
2011 | + present = netif_device_present(netdev); |
2012 | netif_device_detach(netdev); |
2013 | |
2014 | - if (netif_running(netdev)) { |
2015 | + if (present && netif_running(netdev)) { |
2016 | int count = E1000_CHECK_RESET_COUNT; |
2017 | |
2018 | while (test_bit(__E1000_RESETTING, &adapter->state) && count--) |
2019 | @@ -6324,6 +6328,8 @@ static int e1000e_pm_freeze(struct device *dev) |
2020 | e1000e_down(adapter, false); |
2021 | e1000_free_irq(adapter); |
2022 | } |
2023 | + rtnl_unlock(); |
2024 | + |
2025 | e1000e_reset_interrupt_capability(adapter); |
2026 | |
2027 | /* Allow time for pending master requests to run */ |
2028 | @@ -6571,6 +6577,30 @@ static void e1000e_disable_aspm_locked(struct pci_dev *pdev, u16 state) |
2029 | __e1000e_disable_aspm(pdev, state, 1); |
2030 | } |
2031 | |
2032 | +static int e1000e_pm_thaw(struct device *dev) |
2033 | +{ |
2034 | + struct net_device *netdev = dev_get_drvdata(dev); |
2035 | + struct e1000_adapter *adapter = netdev_priv(netdev); |
2036 | + int rc = 0; |
2037 | + |
2038 | + e1000e_set_interrupt_capability(adapter); |
2039 | + |
2040 | + rtnl_lock(); |
2041 | + if (netif_running(netdev)) { |
2042 | + rc = e1000_request_irq(adapter); |
2043 | + if (rc) |
2044 | + goto err_irq; |
2045 | + |
2046 | + e1000e_up(adapter); |
2047 | + } |
2048 | + |
2049 | + netif_device_attach(netdev); |
2050 | +err_irq: |
2051 | + rtnl_unlock(); |
2052 | + |
2053 | + return rc; |
2054 | +} |
2055 | + |
2056 | #ifdef CONFIG_PM |
2057 | static int __e1000_resume(struct pci_dev *pdev) |
2058 | { |
2059 | @@ -6638,26 +6668,6 @@ static int __e1000_resume(struct pci_dev *pdev) |
2060 | } |
2061 | |
2062 | #ifdef CONFIG_PM_SLEEP |
2063 | -static int e1000e_pm_thaw(struct device *dev) |
2064 | -{ |
2065 | - struct net_device *netdev = dev_get_drvdata(dev); |
2066 | - struct e1000_adapter *adapter = netdev_priv(netdev); |
2067 | - |
2068 | - e1000e_set_interrupt_capability(adapter); |
2069 | - if (netif_running(netdev)) { |
2070 | - u32 err = e1000_request_irq(adapter); |
2071 | - |
2072 | - if (err) |
2073 | - return err; |
2074 | - |
2075 | - e1000e_up(adapter); |
2076 | - } |
2077 | - |
2078 | - netif_device_attach(netdev); |
2079 | - |
2080 | - return 0; |
2081 | -} |
2082 | - |
2083 | static int e1000e_pm_suspend(struct device *dev) |
2084 | { |
2085 | struct pci_dev *pdev = to_pci_dev(dev); |
2086 | @@ -6829,16 +6839,11 @@ static void e1000_netpoll(struct net_device *netdev) |
2087 | static pci_ers_result_t e1000_io_error_detected(struct pci_dev *pdev, |
2088 | pci_channel_state_t state) |
2089 | { |
2090 | - struct net_device *netdev = pci_get_drvdata(pdev); |
2091 | - struct e1000_adapter *adapter = netdev_priv(netdev); |
2092 | - |
2093 | - netif_device_detach(netdev); |
2094 | + e1000e_pm_freeze(&pdev->dev); |
2095 | |
2096 | if (state == pci_channel_io_perm_failure) |
2097 | return PCI_ERS_RESULT_DISCONNECT; |
2098 | |
2099 | - if (netif_running(netdev)) |
2100 | - e1000e_down(adapter, true); |
2101 | pci_disable_device(pdev); |
2102 | |
2103 | /* Request a slot slot reset. */ |
2104 | @@ -6904,10 +6909,7 @@ static void e1000_io_resume(struct pci_dev *pdev) |
2105 | |
2106 | e1000_init_manageability_pt(adapter); |
2107 | |
2108 | - if (netif_running(netdev)) |
2109 | - e1000e_up(adapter); |
2110 | - |
2111 | - netif_device_attach(netdev); |
2112 | + e1000e_pm_thaw(&pdev->dev); |
2113 | |
2114 | /* If the controller has AMT, do not set DRV_LOAD until the interface |
2115 | * is up. For all other cases, let the f/w know that the h/w is now |
2116 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/health.c b/drivers/net/ethernet/mellanox/mlx5/core/en/health.c |
2117 | index 3a975641f902..20b907dc1e29 100644 |
2118 | --- a/drivers/net/ethernet/mellanox/mlx5/core/en/health.c |
2119 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/en/health.c |
2120 | @@ -200,7 +200,7 @@ int mlx5e_health_report(struct mlx5e_priv *priv, |
2121 | netdev_err(priv->netdev, err_str); |
2122 | |
2123 | if (!reporter) |
2124 | - return err_ctx->recover(&err_ctx->ctx); |
2125 | + return err_ctx->recover(err_ctx->ctx); |
2126 | |
2127 | return devlink_health_report(reporter, err_str, err_ctx); |
2128 | } |
2129 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/txrx.h b/drivers/net/ethernet/mellanox/mlx5/core/en/txrx.h |
2130 | index 7c8796d9743f..a226277b0980 100644 |
2131 | --- a/drivers/net/ethernet/mellanox/mlx5/core/en/txrx.h |
2132 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/en/txrx.h |
2133 | @@ -179,6 +179,14 @@ mlx5e_tx_dma_unmap(struct device *pdev, struct mlx5e_sq_dma *dma) |
2134 | } |
2135 | } |
2136 | |
2137 | +static inline void mlx5e_rqwq_reset(struct mlx5e_rq *rq) |
2138 | +{ |
2139 | + if (rq->wq_type == MLX5_WQ_TYPE_LINKED_LIST_STRIDING_RQ) |
2140 | + mlx5_wq_ll_reset(&rq->mpwqe.wq); |
2141 | + else |
2142 | + mlx5_wq_cyc_reset(&rq->wqe.wq); |
2143 | +} |
2144 | + |
2145 | /* SW parser related functions */ |
2146 | |
2147 | struct mlx5e_swp_spec { |
2148 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c |
2149 | index 29a5a8c894e3..e5e91cbcbc31 100644 |
2150 | --- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c |
2151 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c |
2152 | @@ -723,6 +723,9 @@ int mlx5e_modify_rq_state(struct mlx5e_rq *rq, int curr_state, int next_state) |
2153 | if (!in) |
2154 | return -ENOMEM; |
2155 | |
2156 | + if (curr_state == MLX5_RQC_STATE_RST && next_state == MLX5_RQC_STATE_RDY) |
2157 | + mlx5e_rqwq_reset(rq); |
2158 | + |
2159 | rqc = MLX5_ADDR_OF(modify_rq_in, in, ctx); |
2160 | |
2161 | MLX5_SET(modify_rq_in, in, rq_state, curr_state); |
2162 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c |
2163 | index 60fddf8afc99..c6ed4b7f4f97 100644 |
2164 | --- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c |
2165 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c |
2166 | @@ -2319,25 +2319,17 @@ out: |
2167 | |
2168 | int mlx5_eswitch_get_vepa(struct mlx5_eswitch *esw, u8 *setting) |
2169 | { |
2170 | - int err = 0; |
2171 | - |
2172 | if (!esw) |
2173 | return -EOPNOTSUPP; |
2174 | |
2175 | if (!ESW_ALLOWED(esw)) |
2176 | return -EPERM; |
2177 | |
2178 | - mutex_lock(&esw->state_lock); |
2179 | - if (esw->mode != MLX5_ESWITCH_LEGACY) { |
2180 | - err = -EOPNOTSUPP; |
2181 | - goto out; |
2182 | - } |
2183 | + if (esw->mode != MLX5_ESWITCH_LEGACY) |
2184 | + return -EOPNOTSUPP; |
2185 | |
2186 | *setting = esw->fdb_table.legacy.vepa_uplink_rule ? 1 : 0; |
2187 | - |
2188 | -out: |
2189 | - mutex_unlock(&esw->state_lock); |
2190 | - return err; |
2191 | + return 0; |
2192 | } |
2193 | |
2194 | int mlx5_eswitch_set_vport_trust(struct mlx5_eswitch *esw, |
2195 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/wq.c b/drivers/net/ethernet/mellanox/mlx5/core/wq.c |
2196 | index dd2315ce4441..41e35b341b70 100644 |
2197 | --- a/drivers/net/ethernet/mellanox/mlx5/core/wq.c |
2198 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/wq.c |
2199 | @@ -96,6 +96,13 @@ err_db_free: |
2200 | return err; |
2201 | } |
2202 | |
2203 | +void mlx5_wq_cyc_reset(struct mlx5_wq_cyc *wq) |
2204 | +{ |
2205 | + wq->wqe_ctr = 0; |
2206 | + wq->cur_sz = 0; |
2207 | + mlx5_wq_cyc_update_db_record(wq); |
2208 | +} |
2209 | + |
2210 | int mlx5_wq_qp_create(struct mlx5_core_dev *mdev, struct mlx5_wq_param *param, |
2211 | void *qpc, struct mlx5_wq_qp *wq, |
2212 | struct mlx5_wq_ctrl *wq_ctrl) |
2213 | @@ -194,6 +201,19 @@ err_db_free: |
2214 | return err; |
2215 | } |
2216 | |
2217 | +static void mlx5_wq_ll_init_list(struct mlx5_wq_ll *wq) |
2218 | +{ |
2219 | + struct mlx5_wqe_srq_next_seg *next_seg; |
2220 | + int i; |
2221 | + |
2222 | + for (i = 0; i < wq->fbc.sz_m1; i++) { |
2223 | + next_seg = mlx5_wq_ll_get_wqe(wq, i); |
2224 | + next_seg->next_wqe_index = cpu_to_be16(i + 1); |
2225 | + } |
2226 | + next_seg = mlx5_wq_ll_get_wqe(wq, i); |
2227 | + wq->tail_next = &next_seg->next_wqe_index; |
2228 | +} |
2229 | + |
2230 | int mlx5_wq_ll_create(struct mlx5_core_dev *mdev, struct mlx5_wq_param *param, |
2231 | void *wqc, struct mlx5_wq_ll *wq, |
2232 | struct mlx5_wq_ctrl *wq_ctrl) |
2233 | @@ -201,9 +221,7 @@ int mlx5_wq_ll_create(struct mlx5_core_dev *mdev, struct mlx5_wq_param *param, |
2234 | u8 log_wq_stride = MLX5_GET(wq, wqc, log_wq_stride); |
2235 | u8 log_wq_sz = MLX5_GET(wq, wqc, log_wq_sz); |
2236 | struct mlx5_frag_buf_ctrl *fbc = &wq->fbc; |
2237 | - struct mlx5_wqe_srq_next_seg *next_seg; |
2238 | int err; |
2239 | - int i; |
2240 | |
2241 | err = mlx5_db_alloc_node(mdev, &wq_ctrl->db, param->db_numa_node); |
2242 | if (err) { |
2243 | @@ -222,13 +240,7 @@ int mlx5_wq_ll_create(struct mlx5_core_dev *mdev, struct mlx5_wq_param *param, |
2244 | |
2245 | mlx5_init_fbc(wq_ctrl->buf.frags, log_wq_stride, log_wq_sz, fbc); |
2246 | |
2247 | - for (i = 0; i < fbc->sz_m1; i++) { |
2248 | - next_seg = mlx5_wq_ll_get_wqe(wq, i); |
2249 | - next_seg->next_wqe_index = cpu_to_be16(i + 1); |
2250 | - } |
2251 | - next_seg = mlx5_wq_ll_get_wqe(wq, i); |
2252 | - wq->tail_next = &next_seg->next_wqe_index; |
2253 | - |
2254 | + mlx5_wq_ll_init_list(wq); |
2255 | wq_ctrl->mdev = mdev; |
2256 | |
2257 | return 0; |
2258 | @@ -239,6 +251,15 @@ err_db_free: |
2259 | return err; |
2260 | } |
2261 | |
2262 | +void mlx5_wq_ll_reset(struct mlx5_wq_ll *wq) |
2263 | +{ |
2264 | + wq->head = 0; |
2265 | + wq->wqe_ctr = 0; |
2266 | + wq->cur_sz = 0; |
2267 | + mlx5_wq_ll_init_list(wq); |
2268 | + mlx5_wq_ll_update_db_record(wq); |
2269 | +} |
2270 | + |
2271 | void mlx5_wq_destroy(struct mlx5_wq_ctrl *wq_ctrl) |
2272 | { |
2273 | mlx5_frag_buf_free(wq_ctrl->mdev, &wq_ctrl->buf); |
2274 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/wq.h b/drivers/net/ethernet/mellanox/mlx5/core/wq.h |
2275 | index 55791f71a778..5efc038440df 100644 |
2276 | --- a/drivers/net/ethernet/mellanox/mlx5/core/wq.h |
2277 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/wq.h |
2278 | @@ -80,10 +80,12 @@ int mlx5_wq_cyc_create(struct mlx5_core_dev *mdev, struct mlx5_wq_param *param, |
2279 | void *wqc, struct mlx5_wq_cyc *wq, |
2280 | struct mlx5_wq_ctrl *wq_ctrl); |
2281 | u32 mlx5_wq_cyc_get_size(struct mlx5_wq_cyc *wq); |
2282 | +void mlx5_wq_cyc_reset(struct mlx5_wq_cyc *wq); |
2283 | |
2284 | int mlx5_wq_qp_create(struct mlx5_core_dev *mdev, struct mlx5_wq_param *param, |
2285 | void *qpc, struct mlx5_wq_qp *wq, |
2286 | struct mlx5_wq_ctrl *wq_ctrl); |
2287 | +void mlx5_wq_ll_reset(struct mlx5_wq_ll *wq); |
2288 | |
2289 | int mlx5_cqwq_create(struct mlx5_core_dev *mdev, struct mlx5_wq_param *param, |
2290 | void *cqc, struct mlx5_cqwq *wq, |
2291 | diff --git a/drivers/nvme/host/multipath.c b/drivers/nvme/host/multipath.c |
2292 | index 132ade51ee87..aed6354cb271 100644 |
2293 | --- a/drivers/nvme/host/multipath.c |
2294 | +++ b/drivers/nvme/host/multipath.c |
2295 | @@ -711,6 +711,7 @@ int nvme_mpath_init(struct nvme_ctrl *ctrl, struct nvme_id_ctrl *id) |
2296 | } |
2297 | |
2298 | INIT_WORK(&ctrl->ana_work, nvme_ana_work); |
2299 | + kfree(ctrl->ana_log_buf); |
2300 | ctrl->ana_log_buf = kmalloc(ctrl->ana_log_size, GFP_KERNEL); |
2301 | if (!ctrl->ana_log_buf) { |
2302 | error = -ENOMEM; |
2303 | diff --git a/drivers/staging/android/ashmem.c b/drivers/staging/android/ashmem.c |
2304 | index 74d497d39c5a..c6695354b123 100644 |
2305 | --- a/drivers/staging/android/ashmem.c |
2306 | +++ b/drivers/staging/android/ashmem.c |
2307 | @@ -351,8 +351,23 @@ static inline vm_flags_t calc_vm_may_flags(unsigned long prot) |
2308 | _calc_vm_trans(prot, PROT_EXEC, VM_MAYEXEC); |
2309 | } |
2310 | |
2311 | +static int ashmem_vmfile_mmap(struct file *file, struct vm_area_struct *vma) |
2312 | +{ |
2313 | + /* do not allow to mmap ashmem backing shmem file directly */ |
2314 | + return -EPERM; |
2315 | +} |
2316 | + |
2317 | +static unsigned long |
2318 | +ashmem_vmfile_get_unmapped_area(struct file *file, unsigned long addr, |
2319 | + unsigned long len, unsigned long pgoff, |
2320 | + unsigned long flags) |
2321 | +{ |
2322 | + return current->mm->get_unmapped_area(file, addr, len, pgoff, flags); |
2323 | +} |
2324 | + |
2325 | static int ashmem_mmap(struct file *file, struct vm_area_struct *vma) |
2326 | { |
2327 | + static struct file_operations vmfile_fops; |
2328 | struct ashmem_area *asma = file->private_data; |
2329 | int ret = 0; |
2330 | |
2331 | @@ -393,6 +408,19 @@ static int ashmem_mmap(struct file *file, struct vm_area_struct *vma) |
2332 | } |
2333 | vmfile->f_mode |= FMODE_LSEEK; |
2334 | asma->file = vmfile; |
2335 | + /* |
2336 | + * override mmap operation of the vmfile so that it can't be |
2337 | + * remapped which would lead to creation of a new vma with no |
2338 | + * asma permission checks. Have to override get_unmapped_area |
2339 | + * as well to prevent VM_BUG_ON check for f_ops modification. |
2340 | + */ |
2341 | + if (!vmfile_fops.mmap) { |
2342 | + vmfile_fops = *vmfile->f_op; |
2343 | + vmfile_fops.mmap = ashmem_vmfile_mmap; |
2344 | + vmfile_fops.get_unmapped_area = |
2345 | + ashmem_vmfile_get_unmapped_area; |
2346 | + } |
2347 | + vmfile->f_op = &vmfile_fops; |
2348 | } |
2349 | get_file(asma->file); |
2350 | |
2351 | diff --git a/drivers/staging/greybus/audio_manager.c b/drivers/staging/greybus/audio_manager.c |
2352 | index 9b19ea9d3fa1..9a3f7c034ab4 100644 |
2353 | --- a/drivers/staging/greybus/audio_manager.c |
2354 | +++ b/drivers/staging/greybus/audio_manager.c |
2355 | @@ -92,8 +92,8 @@ void gb_audio_manager_remove_all(void) |
2356 | |
2357 | list_for_each_entry_safe(module, next, &modules_list, list) { |
2358 | list_del(&module->list); |
2359 | - kobject_put(&module->kobj); |
2360 | ida_simple_remove(&module_id, module->id); |
2361 | + kobject_put(&module->kobj); |
2362 | } |
2363 | |
2364 | is_empty = list_empty(&modules_list); |
2365 | diff --git a/drivers/staging/rtl8188eu/os_dep/ioctl_linux.c b/drivers/staging/rtl8188eu/os_dep/ioctl_linux.c |
2366 | index 9f0418ee7528..630e7d933b10 100644 |
2367 | --- a/drivers/staging/rtl8188eu/os_dep/ioctl_linux.c |
2368 | +++ b/drivers/staging/rtl8188eu/os_dep/ioctl_linux.c |
2369 | @@ -2025,7 +2025,7 @@ static int wpa_supplicant_ioctl(struct net_device *dev, struct iw_point *p) |
2370 | struct ieee_param *param; |
2371 | uint ret = 0; |
2372 | |
2373 | - if (p->length < sizeof(struct ieee_param) || !p->pointer) { |
2374 | + if (!p->pointer || p->length != sizeof(struct ieee_param)) { |
2375 | ret = -EINVAL; |
2376 | goto out; |
2377 | } |
2378 | @@ -2812,7 +2812,7 @@ static int rtw_hostapd_ioctl(struct net_device *dev, struct iw_point *p) |
2379 | goto out; |
2380 | } |
2381 | |
2382 | - if (!p->pointer) { |
2383 | + if (!p->pointer || p->length != sizeof(struct ieee_param)) { |
2384 | ret = -EINVAL; |
2385 | goto out; |
2386 | } |
2387 | diff --git a/drivers/staging/rtl8723bs/hal/rtl8723bs_xmit.c b/drivers/staging/rtl8723bs/hal/rtl8723bs_xmit.c |
2388 | index b44e902ed338..b6d56cfb0a19 100644 |
2389 | --- a/drivers/staging/rtl8723bs/hal/rtl8723bs_xmit.c |
2390 | +++ b/drivers/staging/rtl8723bs/hal/rtl8723bs_xmit.c |
2391 | @@ -476,14 +476,13 @@ int rtl8723bs_xmit_thread(void *context) |
2392 | s32 ret; |
2393 | struct adapter *padapter; |
2394 | struct xmit_priv *pxmitpriv; |
2395 | - u8 thread_name[20] = "RTWHALXT"; |
2396 | - |
2397 | + u8 thread_name[20]; |
2398 | |
2399 | ret = _SUCCESS; |
2400 | padapter = context; |
2401 | pxmitpriv = &padapter->xmitpriv; |
2402 | |
2403 | - rtw_sprintf(thread_name, 20, "%s-"ADPT_FMT, thread_name, ADPT_ARG(padapter)); |
2404 | + rtw_sprintf(thread_name, 20, "RTWHALXT-" ADPT_FMT, ADPT_ARG(padapter)); |
2405 | thread_enter(thread_name); |
2406 | |
2407 | DBG_871X("start "FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter)); |
2408 | diff --git a/drivers/staging/rtl8723bs/os_dep/ioctl_linux.c b/drivers/staging/rtl8723bs/os_dep/ioctl_linux.c |
2409 | index d1b199e3e5bd..d8d44fd9a92f 100644 |
2410 | --- a/drivers/staging/rtl8723bs/os_dep/ioctl_linux.c |
2411 | +++ b/drivers/staging/rtl8723bs/os_dep/ioctl_linux.c |
2412 | @@ -3379,7 +3379,7 @@ static int wpa_supplicant_ioctl(struct net_device *dev, struct iw_point *p) |
2413 | |
2414 | /* down(&ieee->wx_sem); */ |
2415 | |
2416 | - if (p->length < sizeof(struct ieee_param) || !p->pointer) { |
2417 | + if (!p->pointer || p->length != sizeof(struct ieee_param)) { |
2418 | ret = -EINVAL; |
2419 | goto out; |
2420 | } |
2421 | @@ -4213,7 +4213,7 @@ static int rtw_hostapd_ioctl(struct net_device *dev, struct iw_point *p) |
2422 | |
2423 | |
2424 | /* if (p->length < sizeof(struct ieee_param) || !p->pointer) { */ |
2425 | - if (!p->pointer) { |
2426 | + if (!p->pointer || p->length != sizeof(*param)) { |
2427 | ret = -EINVAL; |
2428 | goto out; |
2429 | } |
2430 | diff --git a/drivers/staging/vt6656/dpc.c b/drivers/staging/vt6656/dpc.c |
2431 | index 3b94e80f1d5e..879ceef517fb 100644 |
2432 | --- a/drivers/staging/vt6656/dpc.c |
2433 | +++ b/drivers/staging/vt6656/dpc.c |
2434 | @@ -130,7 +130,7 @@ int vnt_rx_data(struct vnt_private *priv, struct vnt_rcb *ptr_rcb, |
2435 | |
2436 | vnt_rf_rssi_to_dbm(priv, *rssi, &rx_dbm); |
2437 | |
2438 | - priv->bb_pre_ed_rssi = (u8)rx_dbm + 1; |
2439 | + priv->bb_pre_ed_rssi = (u8)-rx_dbm + 1; |
2440 | priv->current_rssi = priv->bb_pre_ed_rssi; |
2441 | |
2442 | skb_pull(skb, 8); |
2443 | diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c |
2444 | index c070cb2a6a5b..d19e051f2bc2 100644 |
2445 | --- a/drivers/target/iscsi/iscsi_target.c |
2446 | +++ b/drivers/target/iscsi/iscsi_target.c |
2447 | @@ -1165,9 +1165,7 @@ int iscsit_setup_scsi_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, |
2448 | hdr->cmdsn, be32_to_cpu(hdr->data_length), payload_length, |
2449 | conn->cid); |
2450 | |
2451 | - if (target_get_sess_cmd(&cmd->se_cmd, true) < 0) |
2452 | - return iscsit_add_reject_cmd(cmd, |
2453 | - ISCSI_REASON_WAITING_FOR_LOGOUT, buf); |
2454 | + target_get_sess_cmd(&cmd->se_cmd, true); |
2455 | |
2456 | cmd->sense_reason = transport_lookup_cmd_lun(&cmd->se_cmd, |
2457 | scsilun_to_int(&hdr->lun)); |
2458 | @@ -2004,9 +2002,7 @@ iscsit_handle_task_mgt_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, |
2459 | conn->sess->se_sess, 0, DMA_NONE, |
2460 | TCM_SIMPLE_TAG, cmd->sense_buffer + 2); |
2461 | |
2462 | - if (target_get_sess_cmd(&cmd->se_cmd, true) < 0) |
2463 | - return iscsit_add_reject_cmd(cmd, |
2464 | - ISCSI_REASON_WAITING_FOR_LOGOUT, buf); |
2465 | + target_get_sess_cmd(&cmd->se_cmd, true); |
2466 | |
2467 | /* |
2468 | * TASK_REASSIGN for ERL=2 / connection stays inside of |
2469 | @@ -4151,6 +4147,9 @@ int iscsit_close_connection( |
2470 | iscsit_stop_nopin_response_timer(conn); |
2471 | iscsit_stop_nopin_timer(conn); |
2472 | |
2473 | + if (conn->conn_transport->iscsit_wait_conn) |
2474 | + conn->conn_transport->iscsit_wait_conn(conn); |
2475 | + |
2476 | /* |
2477 | * During Connection recovery drop unacknowledged out of order |
2478 | * commands for this connection, and prepare the other commands |
2479 | @@ -4233,11 +4232,6 @@ int iscsit_close_connection( |
2480 | * must wait until they have completed. |
2481 | */ |
2482 | iscsit_check_conn_usage_count(conn); |
2483 | - target_sess_cmd_list_set_waiting(sess->se_sess); |
2484 | - target_wait_for_sess_cmds(sess->se_sess); |
2485 | - |
2486 | - if (conn->conn_transport->iscsit_wait_conn) |
2487 | - conn->conn_transport->iscsit_wait_conn(conn); |
2488 | |
2489 | ahash_request_free(conn->conn_tx_hash); |
2490 | if (conn->conn_rx_hash) { |
2491 | diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c |
2492 | index eda8b4736c15..d542e26ca56a 100644 |
2493 | --- a/drivers/target/target_core_transport.c |
2494 | +++ b/drivers/target/target_core_transport.c |
2495 | @@ -666,6 +666,11 @@ static int transport_cmd_check_stop_to_fabric(struct se_cmd *cmd) |
2496 | |
2497 | target_remove_from_state_list(cmd); |
2498 | |
2499 | + /* |
2500 | + * Clear struct se_cmd->se_lun before the handoff to FE. |
2501 | + */ |
2502 | + cmd->se_lun = NULL; |
2503 | + |
2504 | spin_lock_irqsave(&cmd->t_state_lock, flags); |
2505 | /* |
2506 | * Determine if frontend context caller is requesting the stopping of |
2507 | @@ -693,6 +698,17 @@ static int transport_cmd_check_stop_to_fabric(struct se_cmd *cmd) |
2508 | return cmd->se_tfo->check_stop_free(cmd); |
2509 | } |
2510 | |
2511 | +static void transport_lun_remove_cmd(struct se_cmd *cmd) |
2512 | +{ |
2513 | + struct se_lun *lun = cmd->se_lun; |
2514 | + |
2515 | + if (!lun) |
2516 | + return; |
2517 | + |
2518 | + if (cmpxchg(&cmd->lun_ref_active, true, false)) |
2519 | + percpu_ref_put(&lun->lun_ref); |
2520 | +} |
2521 | + |
2522 | static void target_complete_failure_work(struct work_struct *work) |
2523 | { |
2524 | struct se_cmd *cmd = container_of(work, struct se_cmd, work); |
2525 | @@ -783,6 +799,8 @@ static void target_handle_abort(struct se_cmd *cmd) |
2526 | |
2527 | WARN_ON_ONCE(kref_read(&cmd->cmd_kref) == 0); |
2528 | |
2529 | + transport_lun_remove_cmd(cmd); |
2530 | + |
2531 | transport_cmd_check_stop_to_fabric(cmd); |
2532 | } |
2533 | |
2534 | @@ -1695,6 +1713,7 @@ static void target_complete_tmr_failure(struct work_struct *work) |
2535 | se_cmd->se_tmr_req->response = TMR_LUN_DOES_NOT_EXIST; |
2536 | se_cmd->se_tfo->queue_tm_rsp(se_cmd); |
2537 | |
2538 | + transport_lun_remove_cmd(se_cmd); |
2539 | transport_cmd_check_stop_to_fabric(se_cmd); |
2540 | } |
2541 | |
2542 | @@ -1885,6 +1904,7 @@ void transport_generic_request_failure(struct se_cmd *cmd, |
2543 | goto queue_full; |
2544 | |
2545 | check_stop: |
2546 | + transport_lun_remove_cmd(cmd); |
2547 | transport_cmd_check_stop_to_fabric(cmd); |
2548 | return; |
2549 | |
2550 | @@ -2182,6 +2202,7 @@ queue_status: |
2551 | transport_handle_queue_full(cmd, cmd->se_dev, ret, false); |
2552 | return; |
2553 | } |
2554 | + transport_lun_remove_cmd(cmd); |
2555 | transport_cmd_check_stop_to_fabric(cmd); |
2556 | } |
2557 | |
2558 | @@ -2276,6 +2297,7 @@ static void target_complete_ok_work(struct work_struct *work) |
2559 | if (ret) |
2560 | goto queue_full; |
2561 | |
2562 | + transport_lun_remove_cmd(cmd); |
2563 | transport_cmd_check_stop_to_fabric(cmd); |
2564 | return; |
2565 | } |
2566 | @@ -2301,6 +2323,7 @@ static void target_complete_ok_work(struct work_struct *work) |
2567 | if (ret) |
2568 | goto queue_full; |
2569 | |
2570 | + transport_lun_remove_cmd(cmd); |
2571 | transport_cmd_check_stop_to_fabric(cmd); |
2572 | return; |
2573 | } |
2574 | @@ -2336,6 +2359,7 @@ queue_rsp: |
2575 | if (ret) |
2576 | goto queue_full; |
2577 | |
2578 | + transport_lun_remove_cmd(cmd); |
2579 | transport_cmd_check_stop_to_fabric(cmd); |
2580 | return; |
2581 | } |
2582 | @@ -2371,6 +2395,7 @@ queue_status: |
2583 | break; |
2584 | } |
2585 | |
2586 | + transport_lun_remove_cmd(cmd); |
2587 | transport_cmd_check_stop_to_fabric(cmd); |
2588 | return; |
2589 | |
2590 | @@ -2697,6 +2722,9 @@ int transport_generic_free_cmd(struct se_cmd *cmd, int wait_for_tasks) |
2591 | */ |
2592 | if (cmd->state_active) |
2593 | target_remove_from_state_list(cmd); |
2594 | + |
2595 | + if (cmd->se_lun) |
2596 | + transport_lun_remove_cmd(cmd); |
2597 | } |
2598 | if (aborted) |
2599 | cmd->free_compl = &compl; |
2600 | @@ -2768,9 +2796,6 @@ static void target_release_cmd_kref(struct kref *kref) |
2601 | struct completion *abrt_compl = se_cmd->abrt_compl; |
2602 | unsigned long flags; |
2603 | |
2604 | - if (se_cmd->lun_ref_active) |
2605 | - percpu_ref_put(&se_cmd->se_lun->lun_ref); |
2606 | - |
2607 | if (se_sess) { |
2608 | spin_lock_irqsave(&se_sess->sess_cmd_lock, flags); |
2609 | list_del_init(&se_cmd->se_cmd_list); |
2610 | diff --git a/drivers/thunderbolt/switch.c b/drivers/thunderbolt/switch.c |
2611 | index c5974c9af841..e53932d27ac5 100644 |
2612 | --- a/drivers/thunderbolt/switch.c |
2613 | +++ b/drivers/thunderbolt/switch.c |
2614 | @@ -274,6 +274,12 @@ out: |
2615 | return ret; |
2616 | } |
2617 | |
2618 | +static int tb_switch_nvm_no_read(void *priv, unsigned int offset, void *val, |
2619 | + size_t bytes) |
2620 | +{ |
2621 | + return -EPERM; |
2622 | +} |
2623 | + |
2624 | static int tb_switch_nvm_write(void *priv, unsigned int offset, void *val, |
2625 | size_t bytes) |
2626 | { |
2627 | @@ -319,6 +325,7 @@ static struct nvmem_device *register_nvmem(struct tb_switch *sw, int id, |
2628 | config.read_only = true; |
2629 | } else { |
2630 | config.name = "nvm_non_active"; |
2631 | + config.reg_read = tb_switch_nvm_no_read; |
2632 | config.reg_write = tb_switch_nvm_write; |
2633 | config.root_only = true; |
2634 | } |
2635 | diff --git a/drivers/tty/serdev/serdev-ttyport.c b/drivers/tty/serdev/serdev-ttyport.c |
2636 | index d1cdd2ab8b4c..d367803e2044 100644 |
2637 | --- a/drivers/tty/serdev/serdev-ttyport.c |
2638 | +++ b/drivers/tty/serdev/serdev-ttyport.c |
2639 | @@ -265,7 +265,6 @@ struct device *serdev_tty_port_register(struct tty_port *port, |
2640 | struct device *parent, |
2641 | struct tty_driver *drv, int idx) |
2642 | { |
2643 | - const struct tty_port_client_operations *old_ops; |
2644 | struct serdev_controller *ctrl; |
2645 | struct serport *serport; |
2646 | int ret; |
2647 | @@ -284,7 +283,6 @@ struct device *serdev_tty_port_register(struct tty_port *port, |
2648 | |
2649 | ctrl->ops = &ctrl_ops; |
2650 | |
2651 | - old_ops = port->client_ops; |
2652 | port->client_ops = &client_ops; |
2653 | port->client_data = ctrl; |
2654 | |
2655 | @@ -297,7 +295,7 @@ struct device *serdev_tty_port_register(struct tty_port *port, |
2656 | |
2657 | err_reset_data: |
2658 | port->client_data = NULL; |
2659 | - port->client_ops = old_ops; |
2660 | + port->client_ops = &tty_port_default_client_ops; |
2661 | serdev_controller_put(ctrl); |
2662 | |
2663 | return ERR_PTR(ret); |
2664 | @@ -312,8 +310,8 @@ int serdev_tty_port_unregister(struct tty_port *port) |
2665 | return -ENODEV; |
2666 | |
2667 | serdev_controller_remove(ctrl); |
2668 | - port->client_ops = NULL; |
2669 | port->client_data = NULL; |
2670 | + port->client_ops = &tty_port_default_client_ops; |
2671 | serdev_controller_put(ctrl); |
2672 | |
2673 | return 0; |
2674 | diff --git a/drivers/tty/serial/8250/8250_aspeed_vuart.c b/drivers/tty/serial/8250/8250_aspeed_vuart.c |
2675 | index 0438d9a905ce..6ba2efde7252 100644 |
2676 | --- a/drivers/tty/serial/8250/8250_aspeed_vuart.c |
2677 | +++ b/drivers/tty/serial/8250/8250_aspeed_vuart.c |
2678 | @@ -379,7 +379,6 @@ static int aspeed_vuart_probe(struct platform_device *pdev) |
2679 | port.port.line = rc; |
2680 | |
2681 | port.port.irq = irq_of_parse_and_map(np, 0); |
2682 | - port.port.irqflags = IRQF_SHARED; |
2683 | port.port.handle_irq = aspeed_vuart_handle_irq; |
2684 | port.port.iotype = UPIO_MEM; |
2685 | port.port.type = PORT_16550A; |
2686 | diff --git a/drivers/tty/serial/8250/8250_core.c b/drivers/tty/serial/8250/8250_core.c |
2687 | index e682390ce0de..28bdbd7b4ab2 100644 |
2688 | --- a/drivers/tty/serial/8250/8250_core.c |
2689 | +++ b/drivers/tty/serial/8250/8250_core.c |
2690 | @@ -174,7 +174,7 @@ static int serial_link_irq_chain(struct uart_8250_port *up) |
2691 | struct hlist_head *h; |
2692 | struct hlist_node *n; |
2693 | struct irq_info *i; |
2694 | - int ret, irq_flags = up->port.flags & UPF_SHARE_IRQ ? IRQF_SHARED : 0; |
2695 | + int ret; |
2696 | |
2697 | mutex_lock(&hash_mutex); |
2698 | |
2699 | @@ -209,9 +209,8 @@ static int serial_link_irq_chain(struct uart_8250_port *up) |
2700 | INIT_LIST_HEAD(&up->list); |
2701 | i->head = &up->list; |
2702 | spin_unlock_irq(&i->lock); |
2703 | - irq_flags |= up->port.irqflags; |
2704 | ret = request_irq(up->port.irq, serial8250_interrupt, |
2705 | - irq_flags, up->port.name, i); |
2706 | + up->port.irqflags, up->port.name, i); |
2707 | if (ret < 0) |
2708 | serial_do_unlink(i, up); |
2709 | } |
2710 | diff --git a/drivers/tty/serial/8250/8250_of.c b/drivers/tty/serial/8250/8250_of.c |
2711 | index 0826cfdbd406..9ba31701a372 100644 |
2712 | --- a/drivers/tty/serial/8250/8250_of.c |
2713 | +++ b/drivers/tty/serial/8250/8250_of.c |
2714 | @@ -172,7 +172,6 @@ static int of_platform_serial_setup(struct platform_device *ofdev, |
2715 | |
2716 | port->type = type; |
2717 | port->uartclk = clk; |
2718 | - port->irqflags |= IRQF_SHARED; |
2719 | |
2720 | if (of_property_read_bool(np, "no-loopback-test")) |
2721 | port->flags |= UPF_SKIP_TEST; |
2722 | diff --git a/drivers/tty/serial/8250/8250_port.c b/drivers/tty/serial/8250/8250_port.c |
2723 | index 8407166610ce..2c65c775bf5a 100644 |
2724 | --- a/drivers/tty/serial/8250/8250_port.c |
2725 | +++ b/drivers/tty/serial/8250/8250_port.c |
2726 | @@ -2192,6 +2192,10 @@ int serial8250_do_startup(struct uart_port *port) |
2727 | } |
2728 | } |
2729 | |
2730 | + /* Check if we need to have shared IRQs */ |
2731 | + if (port->irq && (up->port.flags & UPF_SHARE_IRQ)) |
2732 | + up->port.irqflags |= IRQF_SHARED; |
2733 | + |
2734 | if (port->irq && !(up->port.flags & UPF_NO_THRE_TEST)) { |
2735 | unsigned char iir1; |
2736 | /* |
2737 | diff --git a/drivers/tty/serial/atmel_serial.c b/drivers/tty/serial/atmel_serial.c |
2738 | index 1ba9bc667e13..8a909d556185 100644 |
2739 | --- a/drivers/tty/serial/atmel_serial.c |
2740 | +++ b/drivers/tty/serial/atmel_serial.c |
2741 | @@ -574,7 +574,8 @@ static void atmel_stop_tx(struct uart_port *port) |
2742 | atmel_uart_writel(port, ATMEL_US_IDR, atmel_port->tx_done_mask); |
2743 | |
2744 | if (atmel_uart_is_half_duplex(port)) |
2745 | - atmel_start_rx(port); |
2746 | + if (!atomic_read(&atmel_port->tasklet_shutdown)) |
2747 | + atmel_start_rx(port); |
2748 | |
2749 | } |
2750 | |
2751 | diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c |
2752 | index 9d8c660dc289..22d8705cd5cd 100644 |
2753 | --- a/drivers/tty/serial/imx.c |
2754 | +++ b/drivers/tty/serial/imx.c |
2755 | @@ -603,7 +603,7 @@ static void imx_uart_dma_tx(struct imx_port *sport) |
2756 | |
2757 | sport->tx_bytes = uart_circ_chars_pending(xmit); |
2758 | |
2759 | - if (xmit->tail < xmit->head) { |
2760 | + if (xmit->tail < xmit->head || xmit->head == 0) { |
2761 | sport->dma_tx_nents = 1; |
2762 | sg_init_one(sgl, xmit->buf + xmit->tail, sport->tx_bytes); |
2763 | } else { |
2764 | diff --git a/drivers/tty/serial/qcom_geni_serial.c b/drivers/tty/serial/qcom_geni_serial.c |
2765 | index 14c6306bc462..f98a79172ad2 100644 |
2766 | --- a/drivers/tty/serial/qcom_geni_serial.c |
2767 | +++ b/drivers/tty/serial/qcom_geni_serial.c |
2768 | @@ -125,6 +125,7 @@ static int handle_rx_console(struct uart_port *uport, u32 bytes, bool drop); |
2769 | static int handle_rx_uart(struct uart_port *uport, u32 bytes, bool drop); |
2770 | static unsigned int qcom_geni_serial_tx_empty(struct uart_port *port); |
2771 | static void qcom_geni_serial_stop_rx(struct uart_port *uport); |
2772 | +static void qcom_geni_serial_handle_rx(struct uart_port *uport, bool drop); |
2773 | |
2774 | static const unsigned long root_freq[] = {7372800, 14745600, 19200000, 29491200, |
2775 | 32000000, 48000000, 64000000, 80000000, |
2776 | @@ -615,7 +616,7 @@ static void qcom_geni_serial_stop_rx(struct uart_port *uport) |
2777 | u32 irq_en; |
2778 | u32 status; |
2779 | struct qcom_geni_serial_port *port = to_dev_port(uport, uport); |
2780 | - u32 irq_clear = S_CMD_DONE_EN; |
2781 | + u32 s_irq_status; |
2782 | |
2783 | irq_en = readl(uport->membase + SE_GENI_S_IRQ_EN); |
2784 | irq_en &= ~(S_RX_FIFO_WATERMARK_EN | S_RX_FIFO_LAST_EN); |
2785 | @@ -631,10 +632,19 @@ static void qcom_geni_serial_stop_rx(struct uart_port *uport) |
2786 | return; |
2787 | |
2788 | geni_se_cancel_s_cmd(&port->se); |
2789 | - qcom_geni_serial_poll_bit(uport, SE_GENI_S_CMD_CTRL_REG, |
2790 | - S_GENI_CMD_CANCEL, false); |
2791 | + qcom_geni_serial_poll_bit(uport, SE_GENI_S_IRQ_STATUS, |
2792 | + S_CMD_CANCEL_EN, true); |
2793 | + /* |
2794 | + * If timeout occurs secondary engine remains active |
2795 | + * and Abort sequence is executed. |
2796 | + */ |
2797 | + s_irq_status = readl(uport->membase + SE_GENI_S_IRQ_STATUS); |
2798 | + /* Flush the Rx buffer */ |
2799 | + if (s_irq_status & S_RX_FIFO_LAST_EN) |
2800 | + qcom_geni_serial_handle_rx(uport, true); |
2801 | + writel(s_irq_status, uport->membase + SE_GENI_S_IRQ_CLEAR); |
2802 | + |
2803 | status = readl(uport->membase + SE_GENI_STATUS); |
2804 | - writel(irq_clear, uport->membase + SE_GENI_S_IRQ_CLEAR); |
2805 | if (status & S_GENI_CMD_ACTIVE) |
2806 | qcom_geni_serial_abort_rx(uport); |
2807 | } |
2808 | diff --git a/drivers/tty/tty_port.c b/drivers/tty/tty_port.c |
2809 | index 044c3cbdcfa4..ea80bf872f54 100644 |
2810 | --- a/drivers/tty/tty_port.c |
2811 | +++ b/drivers/tty/tty_port.c |
2812 | @@ -52,10 +52,11 @@ static void tty_port_default_wakeup(struct tty_port *port) |
2813 | } |
2814 | } |
2815 | |
2816 | -static const struct tty_port_client_operations default_client_ops = { |
2817 | +const struct tty_port_client_operations tty_port_default_client_ops = { |
2818 | .receive_buf = tty_port_default_receive_buf, |
2819 | .write_wakeup = tty_port_default_wakeup, |
2820 | }; |
2821 | +EXPORT_SYMBOL_GPL(tty_port_default_client_ops); |
2822 | |
2823 | void tty_port_init(struct tty_port *port) |
2824 | { |
2825 | @@ -68,7 +69,7 @@ void tty_port_init(struct tty_port *port) |
2826 | spin_lock_init(&port->lock); |
2827 | port->close_delay = (50 * HZ) / 100; |
2828 | port->closing_wait = (3000 * HZ) / 100; |
2829 | - port->client_ops = &default_client_ops; |
2830 | + port->client_ops = &tty_port_default_client_ops; |
2831 | kref_init(&port->kref); |
2832 | } |
2833 | EXPORT_SYMBOL(tty_port_init); |
2834 | diff --git a/drivers/tty/vt/selection.c b/drivers/tty/vt/selection.c |
2835 | index 78732feaf65b..44d974d4159f 100644 |
2836 | --- a/drivers/tty/vt/selection.c |
2837 | +++ b/drivers/tty/vt/selection.c |
2838 | @@ -29,6 +29,8 @@ |
2839 | #include <linux/console.h> |
2840 | #include <linux/tty_flip.h> |
2841 | |
2842 | +#include <linux/sched/signal.h> |
2843 | + |
2844 | /* Don't take this from <ctype.h>: 011-015 on the screen aren't spaces */ |
2845 | #define isspace(c) ((c) == ' ') |
2846 | |
2847 | @@ -350,6 +352,7 @@ int paste_selection(struct tty_struct *tty) |
2848 | unsigned int count; |
2849 | struct tty_ldisc *ld; |
2850 | DECLARE_WAITQUEUE(wait, current); |
2851 | + int ret = 0; |
2852 | |
2853 | console_lock(); |
2854 | poke_blanked_console(); |
2855 | @@ -363,6 +366,10 @@ int paste_selection(struct tty_struct *tty) |
2856 | add_wait_queue(&vc->paste_wait, &wait); |
2857 | while (sel_buffer && sel_buffer_lth > pasted) { |
2858 | set_current_state(TASK_INTERRUPTIBLE); |
2859 | + if (signal_pending(current)) { |
2860 | + ret = -EINTR; |
2861 | + break; |
2862 | + } |
2863 | if (tty_throttled(tty)) { |
2864 | schedule(); |
2865 | continue; |
2866 | @@ -378,6 +385,6 @@ int paste_selection(struct tty_struct *tty) |
2867 | |
2868 | tty_buffer_unlock_exclusive(&vc->port); |
2869 | tty_ldisc_deref(ld); |
2870 | - return 0; |
2871 | + return ret; |
2872 | } |
2873 | EXPORT_SYMBOL_GPL(paste_selection); |
2874 | diff --git a/drivers/tty/vt/vt.c b/drivers/tty/vt/vt.c |
2875 | index 34aa39d1aed9..3b4ccc2a30c1 100644 |
2876 | --- a/drivers/tty/vt/vt.c |
2877 | +++ b/drivers/tty/vt/vt.c |
2878 | @@ -936,10 +936,21 @@ static void flush_scrollback(struct vc_data *vc) |
2879 | WARN_CONSOLE_UNLOCKED(); |
2880 | |
2881 | set_origin(vc); |
2882 | - if (vc->vc_sw->con_flush_scrollback) |
2883 | + if (vc->vc_sw->con_flush_scrollback) { |
2884 | vc->vc_sw->con_flush_scrollback(vc); |
2885 | - else |
2886 | + } else if (con_is_visible(vc)) { |
2887 | + /* |
2888 | + * When no con_flush_scrollback method is provided then the |
2889 | + * legacy way for flushing the scrollback buffer is to use |
2890 | + * a side effect of the con_switch method. We do it only on |
2891 | + * the foreground console as background consoles have no |
2892 | + * scrollback buffers in that case and we obviously don't |
2893 | + * want to switch to them. |
2894 | + */ |
2895 | + hide_cursor(vc); |
2896 | vc->vc_sw->con_switch(vc); |
2897 | + set_cursor(vc); |
2898 | + } |
2899 | } |
2900 | |
2901 | /* |
2902 | diff --git a/drivers/tty/vt/vt_ioctl.c b/drivers/tty/vt/vt_ioctl.c |
2903 | index 8b0ed139592f..ee6c91ef1f6c 100644 |
2904 | --- a/drivers/tty/vt/vt_ioctl.c |
2905 | +++ b/drivers/tty/vt/vt_ioctl.c |
2906 | @@ -876,15 +876,20 @@ int vt_ioctl(struct tty_struct *tty, |
2907 | return -EINVAL; |
2908 | |
2909 | for (i = 0; i < MAX_NR_CONSOLES; i++) { |
2910 | + struct vc_data *vcp; |
2911 | + |
2912 | if (!vc_cons[i].d) |
2913 | continue; |
2914 | console_lock(); |
2915 | - if (v.v_vlin) |
2916 | - vc_cons[i].d->vc_scan_lines = v.v_vlin; |
2917 | - if (v.v_clin) |
2918 | - vc_cons[i].d->vc_font.height = v.v_clin; |
2919 | - vc_cons[i].d->vc_resize_user = 1; |
2920 | - vc_resize(vc_cons[i].d, v.v_cols, v.v_rows); |
2921 | + vcp = vc_cons[i].d; |
2922 | + if (vcp) { |
2923 | + if (v.v_vlin) |
2924 | + vcp->vc_scan_lines = v.v_vlin; |
2925 | + if (v.v_clin) |
2926 | + vcp->vc_font.height = v.v_clin; |
2927 | + vcp->vc_resize_user = 1; |
2928 | + vc_resize(vcp, v.v_cols, v.v_rows); |
2929 | + } |
2930 | console_unlock(); |
2931 | } |
2932 | break; |
2933 | diff --git a/drivers/usb/core/config.c b/drivers/usb/core/config.c |
2934 | index 3e94259406d7..c68217b7dace 100644 |
2935 | --- a/drivers/usb/core/config.c |
2936 | +++ b/drivers/usb/core/config.c |
2937 | @@ -256,6 +256,7 @@ static int usb_parse_endpoint(struct device *ddev, int cfgno, |
2938 | struct usb_host_interface *ifp, int num_ep, |
2939 | unsigned char *buffer, int size) |
2940 | { |
2941 | + struct usb_device *udev = to_usb_device(ddev); |
2942 | unsigned char *buffer0 = buffer; |
2943 | struct usb_endpoint_descriptor *d; |
2944 | struct usb_host_endpoint *endpoint; |
2945 | @@ -297,6 +298,16 @@ static int usb_parse_endpoint(struct device *ddev, int cfgno, |
2946 | goto skip_to_next_endpoint_or_interface_descriptor; |
2947 | } |
2948 | |
2949 | + /* Ignore blacklisted endpoints */ |
2950 | + if (udev->quirks & USB_QUIRK_ENDPOINT_BLACKLIST) { |
2951 | + if (usb_endpoint_is_blacklisted(udev, ifp, d)) { |
2952 | + dev_warn(ddev, "config %d interface %d altsetting %d has a blacklisted endpoint with address 0x%X, skipping\n", |
2953 | + cfgno, inum, asnum, |
2954 | + d->bEndpointAddress); |
2955 | + goto skip_to_next_endpoint_or_interface_descriptor; |
2956 | + } |
2957 | + } |
2958 | + |
2959 | endpoint = &ifp->endpoint[ifp->desc.bNumEndpoints]; |
2960 | ++ifp->desc.bNumEndpoints; |
2961 | |
2962 | diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c |
2963 | index 4ac74b354801..f381faa10f15 100644 |
2964 | --- a/drivers/usb/core/hub.c |
2965 | +++ b/drivers/usb/core/hub.c |
2966 | @@ -37,7 +37,9 @@ |
2967 | #include "otg_whitelist.h" |
2968 | |
2969 | #define USB_VENDOR_GENESYS_LOGIC 0x05e3 |
2970 | +#define USB_VENDOR_SMSC 0x0424 |
2971 | #define HUB_QUIRK_CHECK_PORT_AUTOSUSPEND 0x01 |
2972 | +#define HUB_QUIRK_DISABLE_AUTOSUSPEND 0x02 |
2973 | |
2974 | #define USB_TP_TRANSMISSION_DELAY 40 /* ns */ |
2975 | #define USB_TP_TRANSMISSION_DELAY_MAX 65535 /* ns */ |
2976 | @@ -1216,11 +1218,6 @@ static void hub_activate(struct usb_hub *hub, enum hub_activation_type type) |
2977 | #ifdef CONFIG_PM |
2978 | udev->reset_resume = 1; |
2979 | #endif |
2980 | - /* Don't set the change_bits when the device |
2981 | - * was powered off. |
2982 | - */ |
2983 | - if (test_bit(port1, hub->power_bits)) |
2984 | - set_bit(port1, hub->change_bits); |
2985 | |
2986 | } else { |
2987 | /* The power session is gone; tell hub_wq */ |
2988 | @@ -1730,6 +1727,10 @@ static void hub_disconnect(struct usb_interface *intf) |
2989 | kfree(hub->buffer); |
2990 | |
2991 | pm_suspend_ignore_children(&intf->dev, false); |
2992 | + |
2993 | + if (hub->quirk_disable_autosuspend) |
2994 | + usb_autopm_put_interface(intf); |
2995 | + |
2996 | kref_put(&hub->kref, hub_release); |
2997 | } |
2998 | |
2999 | @@ -1862,6 +1863,11 @@ static int hub_probe(struct usb_interface *intf, const struct usb_device_id *id) |
3000 | if (id->driver_info & HUB_QUIRK_CHECK_PORT_AUTOSUSPEND) |
3001 | hub->quirk_check_port_auto_suspend = 1; |
3002 | |
3003 | + if (id->driver_info & HUB_QUIRK_DISABLE_AUTOSUSPEND) { |
3004 | + hub->quirk_disable_autosuspend = 1; |
3005 | + usb_autopm_get_interface(intf); |
3006 | + } |
3007 | + |
3008 | if (hub_configure(hub, &desc->endpoint[0].desc) >= 0) |
3009 | return 0; |
3010 | |
3011 | @@ -5484,6 +5490,10 @@ out_hdev_lock: |
3012 | } |
3013 | |
3014 | static const struct usb_device_id hub_id_table[] = { |
3015 | + { .match_flags = USB_DEVICE_ID_MATCH_VENDOR | USB_DEVICE_ID_MATCH_INT_CLASS, |
3016 | + .idVendor = USB_VENDOR_SMSC, |
3017 | + .bInterfaceClass = USB_CLASS_HUB, |
3018 | + .driver_info = HUB_QUIRK_DISABLE_AUTOSUSPEND}, |
3019 | { .match_flags = USB_DEVICE_ID_MATCH_VENDOR |
3020 | | USB_DEVICE_ID_MATCH_INT_CLASS, |
3021 | .idVendor = USB_VENDOR_GENESYS_LOGIC, |
3022 | diff --git a/drivers/usb/core/hub.h b/drivers/usb/core/hub.h |
3023 | index a9e24e4b8df1..a97dd1ba964e 100644 |
3024 | --- a/drivers/usb/core/hub.h |
3025 | +++ b/drivers/usb/core/hub.h |
3026 | @@ -61,6 +61,7 @@ struct usb_hub { |
3027 | unsigned quiescing:1; |
3028 | unsigned disconnected:1; |
3029 | unsigned in_reset:1; |
3030 | + unsigned quirk_disable_autosuspend:1; |
3031 | |
3032 | unsigned quirk_check_port_auto_suspend:1; |
3033 | |
3034 | diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c |
3035 | index 6b6413073584..2b24336a72e5 100644 |
3036 | --- a/drivers/usb/core/quirks.c |
3037 | +++ b/drivers/usb/core/quirks.c |
3038 | @@ -354,6 +354,10 @@ static const struct usb_device_id usb_quirk_list[] = { |
3039 | { USB_DEVICE(0x0904, 0x6103), .driver_info = |
3040 | USB_QUIRK_LINEAR_FRAME_INTR_BINTERVAL }, |
3041 | |
3042 | + /* Sound Devices USBPre2 */ |
3043 | + { USB_DEVICE(0x0926, 0x0202), .driver_info = |
3044 | + USB_QUIRK_ENDPOINT_BLACKLIST }, |
3045 | + |
3046 | /* Keytouch QWERTY Panel keyboard */ |
3047 | { USB_DEVICE(0x0926, 0x3333), .driver_info = |
3048 | USB_QUIRK_CONFIG_INTF_STRINGS }, |
3049 | @@ -445,6 +449,9 @@ static const struct usb_device_id usb_quirk_list[] = { |
3050 | /* INTEL VALUE SSD */ |
3051 | { USB_DEVICE(0x8086, 0xf1a5), .driver_info = USB_QUIRK_RESET_RESUME }, |
3052 | |
3053 | + /* novation SoundControl XL */ |
3054 | + { USB_DEVICE(0x1235, 0x0061), .driver_info = USB_QUIRK_RESET_RESUME }, |
3055 | + |
3056 | { } /* terminating entry must be last */ |
3057 | }; |
3058 | |
3059 | @@ -472,6 +479,39 @@ static const struct usb_device_id usb_amd_resume_quirk_list[] = { |
3060 | { } /* terminating entry must be last */ |
3061 | }; |
3062 | |
3063 | +/* |
3064 | + * Entries for blacklisted endpoints that should be ignored when parsing |
3065 | + * configuration descriptors. |
3066 | + * |
3067 | + * Matched for devices with USB_QUIRK_ENDPOINT_BLACKLIST. |
3068 | + */ |
3069 | +static const struct usb_device_id usb_endpoint_blacklist[] = { |
3070 | + { USB_DEVICE_INTERFACE_NUMBER(0x0926, 0x0202, 1), .driver_info = 0x85 }, |
3071 | + { } |
3072 | +}; |
3073 | + |
3074 | +bool usb_endpoint_is_blacklisted(struct usb_device *udev, |
3075 | + struct usb_host_interface *intf, |
3076 | + struct usb_endpoint_descriptor *epd) |
3077 | +{ |
3078 | + const struct usb_device_id *id; |
3079 | + unsigned int address; |
3080 | + |
3081 | + for (id = usb_endpoint_blacklist; id->match_flags; ++id) { |
3082 | + if (!usb_match_device(udev, id)) |
3083 | + continue; |
3084 | + |
3085 | + if (!usb_match_one_id_intf(udev, intf, id)) |
3086 | + continue; |
3087 | + |
3088 | + address = id->driver_info; |
3089 | + if (address == epd->bEndpointAddress) |
3090 | + return true; |
3091 | + } |
3092 | + |
3093 | + return false; |
3094 | +} |
3095 | + |
3096 | static bool usb_match_any_interface(struct usb_device *udev, |
3097 | const struct usb_device_id *id) |
3098 | { |
3099 | diff --git a/drivers/usb/core/usb.h b/drivers/usb/core/usb.h |
3100 | index cf4783cf661a..3ad0ee57e859 100644 |
3101 | --- a/drivers/usb/core/usb.h |
3102 | +++ b/drivers/usb/core/usb.h |
3103 | @@ -37,6 +37,9 @@ extern void usb_authorize_interface(struct usb_interface *); |
3104 | extern void usb_detect_quirks(struct usb_device *udev); |
3105 | extern void usb_detect_interface_quirks(struct usb_device *udev); |
3106 | extern void usb_release_quirk_list(void); |
3107 | +extern bool usb_endpoint_is_blacklisted(struct usb_device *udev, |
3108 | + struct usb_host_interface *intf, |
3109 | + struct usb_endpoint_descriptor *epd); |
3110 | extern int usb_remove_device(struct usb_device *udev); |
3111 | |
3112 | extern int usb_get_device_descriptor(struct usb_device *dev, |
3113 | diff --git a/drivers/usb/dwc2/gadget.c b/drivers/usb/dwc2/gadget.c |
3114 | index a9133773b89e..7fd0900a9cb0 100644 |
3115 | --- a/drivers/usb/dwc2/gadget.c |
3116 | +++ b/drivers/usb/dwc2/gadget.c |
3117 | @@ -1083,11 +1083,6 @@ static void dwc2_hsotg_start_req(struct dwc2_hsotg *hsotg, |
3118 | else |
3119 | packets = 1; /* send one packet if length is zero. */ |
3120 | |
3121 | - if (hs_ep->isochronous && length > (hs_ep->mc * hs_ep->ep.maxpacket)) { |
3122 | - dev_err(hsotg->dev, "req length > maxpacket*mc\n"); |
3123 | - return; |
3124 | - } |
3125 | - |
3126 | if (dir_in && index != 0) |
3127 | if (hs_ep->isochronous) |
3128 | epsize = DXEPTSIZ_MC(packets); |
3129 | @@ -1391,6 +1386,13 @@ static int dwc2_hsotg_ep_queue(struct usb_ep *ep, struct usb_request *req, |
3130 | req->actual = 0; |
3131 | req->status = -EINPROGRESS; |
3132 | |
3133 | + /* Don't queue ISOC request if length greater than mps*mc */ |
3134 | + if (hs_ep->isochronous && |
3135 | + req->length > (hs_ep->mc * hs_ep->ep.maxpacket)) { |
3136 | + dev_err(hs->dev, "req length > maxpacket*mc\n"); |
3137 | + return -EINVAL; |
3138 | + } |
3139 | + |
3140 | /* In DDMA mode for ISOC's don't queue request if length greater |
3141 | * than descriptor limits. |
3142 | */ |
3143 | @@ -1632,6 +1634,7 @@ static int dwc2_hsotg_process_req_status(struct dwc2_hsotg *hsotg, |
3144 | struct dwc2_hsotg_ep *ep0 = hsotg->eps_out[0]; |
3145 | struct dwc2_hsotg_ep *ep; |
3146 | __le16 reply; |
3147 | + u16 status; |
3148 | int ret; |
3149 | |
3150 | dev_dbg(hsotg->dev, "%s: USB_REQ_GET_STATUS\n", __func__); |
3151 | @@ -1643,11 +1646,10 @@ static int dwc2_hsotg_process_req_status(struct dwc2_hsotg *hsotg, |
3152 | |
3153 | switch (ctrl->bRequestType & USB_RECIP_MASK) { |
3154 | case USB_RECIP_DEVICE: |
3155 | - /* |
3156 | - * bit 0 => self powered |
3157 | - * bit 1 => remote wakeup |
3158 | - */ |
3159 | - reply = cpu_to_le16(0); |
3160 | + status = 1 << USB_DEVICE_SELF_POWERED; |
3161 | + status |= hsotg->remote_wakeup_allowed << |
3162 | + USB_DEVICE_REMOTE_WAKEUP; |
3163 | + reply = cpu_to_le16(status); |
3164 | break; |
3165 | |
3166 | case USB_RECIP_INTERFACE: |
3167 | @@ -1758,7 +1760,10 @@ static int dwc2_hsotg_process_req_feature(struct dwc2_hsotg *hsotg, |
3168 | case USB_RECIP_DEVICE: |
3169 | switch (wValue) { |
3170 | case USB_DEVICE_REMOTE_WAKEUP: |
3171 | - hsotg->remote_wakeup_allowed = 1; |
3172 | + if (set) |
3173 | + hsotg->remote_wakeup_allowed = 1; |
3174 | + else |
3175 | + hsotg->remote_wakeup_allowed = 0; |
3176 | break; |
3177 | |
3178 | case USB_DEVICE_TEST_MODE: |
3179 | @@ -1768,16 +1773,17 @@ static int dwc2_hsotg_process_req_feature(struct dwc2_hsotg *hsotg, |
3180 | return -EINVAL; |
3181 | |
3182 | hsotg->test_mode = wIndex >> 8; |
3183 | - ret = dwc2_hsotg_send_reply(hsotg, ep0, NULL, 0); |
3184 | - if (ret) { |
3185 | - dev_err(hsotg->dev, |
3186 | - "%s: failed to send reply\n", __func__); |
3187 | - return ret; |
3188 | - } |
3189 | break; |
3190 | default: |
3191 | return -ENOENT; |
3192 | } |
3193 | + |
3194 | + ret = dwc2_hsotg_send_reply(hsotg, ep0, NULL, 0); |
3195 | + if (ret) { |
3196 | + dev_err(hsotg->dev, |
3197 | + "%s: failed to send reply\n", __func__); |
3198 | + return ret; |
3199 | + } |
3200 | break; |
3201 | |
3202 | case USB_RECIP_ENDPOINT: |
3203 | diff --git a/drivers/usb/dwc3/debug.h b/drivers/usb/dwc3/debug.h |
3204 | index 9baabed87d61..f2c97058a00b 100644 |
3205 | --- a/drivers/usb/dwc3/debug.h |
3206 | +++ b/drivers/usb/dwc3/debug.h |
3207 | @@ -256,86 +256,77 @@ static inline const char *dwc3_ep_event_string(char *str, size_t size, |
3208 | u8 epnum = event->endpoint_number; |
3209 | size_t len; |
3210 | int status; |
3211 | - int ret; |
3212 | |
3213 | - ret = snprintf(str, size, "ep%d%s: ", epnum >> 1, |
3214 | + len = scnprintf(str, size, "ep%d%s: ", epnum >> 1, |
3215 | (epnum & 1) ? "in" : "out"); |
3216 | - if (ret < 0) |
3217 | - return "UNKNOWN"; |
3218 | |
3219 | status = event->status; |
3220 | |
3221 | switch (event->endpoint_event) { |
3222 | case DWC3_DEPEVT_XFERCOMPLETE: |
3223 | - len = strlen(str); |
3224 | - snprintf(str + len, size - len, "Transfer Complete (%c%c%c)", |
3225 | + len += scnprintf(str + len, size - len, |
3226 | + "Transfer Complete (%c%c%c)", |
3227 | status & DEPEVT_STATUS_SHORT ? 'S' : 's', |
3228 | status & DEPEVT_STATUS_IOC ? 'I' : 'i', |
3229 | status & DEPEVT_STATUS_LST ? 'L' : 'l'); |
3230 | |
3231 | - len = strlen(str); |
3232 | - |
3233 | if (epnum <= 1) |
3234 | - snprintf(str + len, size - len, " [%s]", |
3235 | + scnprintf(str + len, size - len, " [%s]", |
3236 | dwc3_ep0_state_string(ep0state)); |
3237 | break; |
3238 | case DWC3_DEPEVT_XFERINPROGRESS: |
3239 | - len = strlen(str); |
3240 | - |
3241 | - snprintf(str + len, size - len, "Transfer In Progress [%d] (%c%c%c)", |
3242 | + scnprintf(str + len, size - len, |
3243 | + "Transfer In Progress [%d] (%c%c%c)", |
3244 | event->parameters, |
3245 | status & DEPEVT_STATUS_SHORT ? 'S' : 's', |
3246 | status & DEPEVT_STATUS_IOC ? 'I' : 'i', |
3247 | status & DEPEVT_STATUS_LST ? 'M' : 'm'); |
3248 | break; |
3249 | case DWC3_DEPEVT_XFERNOTREADY: |
3250 | - len = strlen(str); |
3251 | - |
3252 | - snprintf(str + len, size - len, "Transfer Not Ready [%d]%s", |
3253 | + len += scnprintf(str + len, size - len, |
3254 | + "Transfer Not Ready [%d]%s", |
3255 | event->parameters, |
3256 | status & DEPEVT_STATUS_TRANSFER_ACTIVE ? |
3257 | " (Active)" : " (Not Active)"); |
3258 | |
3259 | - len = strlen(str); |
3260 | - |
3261 | /* Control Endpoints */ |
3262 | if (epnum <= 1) { |
3263 | int phase = DEPEVT_STATUS_CONTROL_PHASE(event->status); |
3264 | |
3265 | switch (phase) { |
3266 | case DEPEVT_STATUS_CONTROL_DATA: |
3267 | - snprintf(str + ret, size - ret, |
3268 | + scnprintf(str + len, size - len, |
3269 | " [Data Phase]"); |
3270 | break; |
3271 | case DEPEVT_STATUS_CONTROL_STATUS: |
3272 | - snprintf(str + ret, size - ret, |
3273 | + scnprintf(str + len, size - len, |
3274 | " [Status Phase]"); |
3275 | } |
3276 | } |
3277 | break; |
3278 | case DWC3_DEPEVT_RXTXFIFOEVT: |
3279 | - snprintf(str + ret, size - ret, "FIFO"); |
3280 | + scnprintf(str + len, size - len, "FIFO"); |
3281 | break; |
3282 | case DWC3_DEPEVT_STREAMEVT: |
3283 | status = event->status; |
3284 | |
3285 | switch (status) { |
3286 | case DEPEVT_STREAMEVT_FOUND: |
3287 | - snprintf(str + ret, size - ret, " Stream %d Found", |
3288 | + scnprintf(str + len, size - len, " Stream %d Found", |
3289 | event->parameters); |
3290 | break; |
3291 | case DEPEVT_STREAMEVT_NOTFOUND: |
3292 | default: |
3293 | - snprintf(str + ret, size - ret, " Stream Not Found"); |
3294 | + scnprintf(str + len, size - len, " Stream Not Found"); |
3295 | break; |
3296 | } |
3297 | |
3298 | break; |
3299 | case DWC3_DEPEVT_EPCMDCMPLT: |
3300 | - snprintf(str + ret, size - ret, "Endpoint Command Complete"); |
3301 | + scnprintf(str + len, size - len, "Endpoint Command Complete"); |
3302 | break; |
3303 | default: |
3304 | - snprintf(str, size, "UNKNOWN"); |
3305 | + scnprintf(str + len, size - len, "UNKNOWN"); |
3306 | } |
3307 | |
3308 | return str; |
3309 | diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c |
3310 | index 8b95be897078..e0cb1c2d5675 100644 |
3311 | --- a/drivers/usb/dwc3/gadget.c |
3312 | +++ b/drivers/usb/dwc3/gadget.c |
3313 | @@ -2426,7 +2426,8 @@ static int dwc3_gadget_ep_reclaim_completed_trb(struct dwc3_ep *dep, |
3314 | if (event->status & DEPEVT_STATUS_SHORT && !chain) |
3315 | return 1; |
3316 | |
3317 | - if (event->status & DEPEVT_STATUS_IOC) |
3318 | + if ((trb->ctrl & DWC3_TRB_CTRL_IOC) || |
3319 | + (trb->ctrl & DWC3_TRB_CTRL_LST)) |
3320 | return 1; |
3321 | |
3322 | return 0; |
3323 | diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c |
3324 | index 5ec54b69c29c..0d45d7a4f949 100644 |
3325 | --- a/drivers/usb/gadget/composite.c |
3326 | +++ b/drivers/usb/gadget/composite.c |
3327 | @@ -437,12 +437,10 @@ static u8 encode_bMaxPower(enum usb_device_speed speed, |
3328 | val = CONFIG_USB_GADGET_VBUS_DRAW; |
3329 | if (!val) |
3330 | return 0; |
3331 | - switch (speed) { |
3332 | - case USB_SPEED_SUPER: |
3333 | - return DIV_ROUND_UP(val, 8); |
3334 | - default: |
3335 | + if (speed < USB_SPEED_SUPER) |
3336 | return DIV_ROUND_UP(val, 2); |
3337 | - } |
3338 | + else |
3339 | + return DIV_ROUND_UP(val, 8); |
3340 | } |
3341 | |
3342 | static int config_buf(struct usb_configuration *config, |
3343 | diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c |
3344 | index 7a3a29e5e9d2..af92b2576fe9 100644 |
3345 | --- a/drivers/usb/host/xhci-hub.c |
3346 | +++ b/drivers/usb/host/xhci-hub.c |
3347 | @@ -55,6 +55,7 @@ static u8 usb_bos_descriptor [] = { |
3348 | static int xhci_create_usb3_bos_desc(struct xhci_hcd *xhci, char *buf, |
3349 | u16 wLength) |
3350 | { |
3351 | + struct xhci_port_cap *port_cap = NULL; |
3352 | int i, ssa_count; |
3353 | u32 temp; |
3354 | u16 desc_size, ssp_cap_size, ssa_size = 0; |
3355 | @@ -64,16 +65,24 @@ static int xhci_create_usb3_bos_desc(struct xhci_hcd *xhci, char *buf, |
3356 | ssp_cap_size = sizeof(usb_bos_descriptor) - desc_size; |
3357 | |
3358 | /* does xhci support USB 3.1 Enhanced SuperSpeed */ |
3359 | - if (xhci->usb3_rhub.min_rev >= 0x01) { |
3360 | + for (i = 0; i < xhci->num_port_caps; i++) { |
3361 | + if (xhci->port_caps[i].maj_rev == 0x03 && |
3362 | + xhci->port_caps[i].min_rev >= 0x01) { |
3363 | + usb3_1 = true; |
3364 | + port_cap = &xhci->port_caps[i]; |
3365 | + break; |
3366 | + } |
3367 | + } |
3368 | + |
3369 | + if (usb3_1) { |
3370 | /* does xhci provide a PSI table for SSA speed attributes? */ |
3371 | - if (xhci->usb3_rhub.psi_count) { |
3372 | + if (port_cap->psi_count) { |
3373 | /* two SSA entries for each unique PSI ID, RX and TX */ |
3374 | - ssa_count = xhci->usb3_rhub.psi_uid_count * 2; |
3375 | + ssa_count = port_cap->psi_uid_count * 2; |
3376 | ssa_size = ssa_count * sizeof(u32); |
3377 | ssp_cap_size -= 16; /* skip copying the default SSA */ |
3378 | } |
3379 | desc_size += ssp_cap_size; |
3380 | - usb3_1 = true; |
3381 | } |
3382 | memcpy(buf, &usb_bos_descriptor, min(desc_size, wLength)); |
3383 | |
3384 | @@ -99,7 +108,7 @@ static int xhci_create_usb3_bos_desc(struct xhci_hcd *xhci, char *buf, |
3385 | } |
3386 | |
3387 | /* If PSI table exists, add the custom speed attributes from it */ |
3388 | - if (usb3_1 && xhci->usb3_rhub.psi_count) { |
3389 | + if (usb3_1 && port_cap->psi_count) { |
3390 | u32 ssp_cap_base, bm_attrib, psi, psi_mant, psi_exp; |
3391 | int offset; |
3392 | |
3393 | @@ -111,7 +120,7 @@ static int xhci_create_usb3_bos_desc(struct xhci_hcd *xhci, char *buf, |
3394 | |
3395 | /* attribute count SSAC bits 4:0 and ID count SSIC bits 8:5 */ |
3396 | bm_attrib = (ssa_count - 1) & 0x1f; |
3397 | - bm_attrib |= (xhci->usb3_rhub.psi_uid_count - 1) << 5; |
3398 | + bm_attrib |= (port_cap->psi_uid_count - 1) << 5; |
3399 | put_unaligned_le32(bm_attrib, &buf[ssp_cap_base + 4]); |
3400 | |
3401 | if (wLength < desc_size + ssa_size) |
3402 | @@ -124,8 +133,8 @@ static int xhci_create_usb3_bos_desc(struct xhci_hcd *xhci, char *buf, |
3403 | * USB 3.1 requires two SSA entries (RX and TX) for every link |
3404 | */ |
3405 | offset = desc_size; |
3406 | - for (i = 0; i < xhci->usb3_rhub.psi_count; i++) { |
3407 | - psi = xhci->usb3_rhub.psi[i]; |
3408 | + for (i = 0; i < port_cap->psi_count; i++) { |
3409 | + psi = port_cap->psi[i]; |
3410 | psi &= ~USB_SSP_SUBLINK_SPEED_RSVD; |
3411 | psi_exp = XHCI_EXT_PORT_PSIE(psi); |
3412 | psi_mant = XHCI_EXT_PORT_PSIM(psi); |
3413 | diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c |
3414 | index 3b1388fa2f36..884c601bfa15 100644 |
3415 | --- a/drivers/usb/host/xhci-mem.c |
3416 | +++ b/drivers/usb/host/xhci-mem.c |
3417 | @@ -1475,9 +1475,15 @@ int xhci_endpoint_init(struct xhci_hcd *xhci, |
3418 | /* Allow 3 retries for everything but isoc, set CErr = 3 */ |
3419 | if (!usb_endpoint_xfer_isoc(&ep->desc)) |
3420 | err_count = 3; |
3421 | - /* Some devices get this wrong */ |
3422 | - if (usb_endpoint_xfer_bulk(&ep->desc) && udev->speed == USB_SPEED_HIGH) |
3423 | - max_packet = 512; |
3424 | + /* HS bulk max packet should be 512, FS bulk supports 8, 16, 32 or 64 */ |
3425 | + if (usb_endpoint_xfer_bulk(&ep->desc)) { |
3426 | + if (udev->speed == USB_SPEED_HIGH) |
3427 | + max_packet = 512; |
3428 | + if (udev->speed == USB_SPEED_FULL) { |
3429 | + max_packet = rounddown_pow_of_two(max_packet); |
3430 | + max_packet = clamp_val(max_packet, 8, 64); |
3431 | + } |
3432 | + } |
3433 | /* xHCI 1.0 and 1.1 indicates that ctrl ep avg TRB Length should be 8 */ |
3434 | if (usb_endpoint_xfer_control(&ep->desc) && xhci->hci_version >= 0x100) |
3435 | avg_trb_len = 8; |
3436 | @@ -1909,17 +1915,17 @@ no_bw: |
3437 | xhci->usb3_rhub.num_ports = 0; |
3438 | xhci->num_active_eps = 0; |
3439 | kfree(xhci->usb2_rhub.ports); |
3440 | - kfree(xhci->usb2_rhub.psi); |
3441 | kfree(xhci->usb3_rhub.ports); |
3442 | - kfree(xhci->usb3_rhub.psi); |
3443 | kfree(xhci->hw_ports); |
3444 | kfree(xhci->rh_bw); |
3445 | kfree(xhci->ext_caps); |
3446 | + for (i = 0; i < xhci->num_port_caps; i++) |
3447 | + kfree(xhci->port_caps[i].psi); |
3448 | + kfree(xhci->port_caps); |
3449 | + xhci->num_port_caps = 0; |
3450 | |
3451 | xhci->usb2_rhub.ports = NULL; |
3452 | - xhci->usb2_rhub.psi = NULL; |
3453 | xhci->usb3_rhub.ports = NULL; |
3454 | - xhci->usb3_rhub.psi = NULL; |
3455 | xhci->hw_ports = NULL; |
3456 | xhci->rh_bw = NULL; |
3457 | xhci->ext_caps = NULL; |
3458 | @@ -2120,6 +2126,7 @@ static void xhci_add_in_port(struct xhci_hcd *xhci, unsigned int num_ports, |
3459 | u8 major_revision, minor_revision; |
3460 | struct xhci_hub *rhub; |
3461 | struct device *dev = xhci_to_hcd(xhci)->self.sysdev; |
3462 | + struct xhci_port_cap *port_cap; |
3463 | |
3464 | temp = readl(addr); |
3465 | major_revision = XHCI_EXT_PORT_MAJOR(temp); |
3466 | @@ -2154,31 +2161,39 @@ static void xhci_add_in_port(struct xhci_hcd *xhci, unsigned int num_ports, |
3467 | /* WTF? "Valid values are ‘1’ to MaxPorts" */ |
3468 | return; |
3469 | |
3470 | - rhub->psi_count = XHCI_EXT_PORT_PSIC(temp); |
3471 | - if (rhub->psi_count) { |
3472 | - rhub->psi = kcalloc_node(rhub->psi_count, sizeof(*rhub->psi), |
3473 | - GFP_KERNEL, dev_to_node(dev)); |
3474 | - if (!rhub->psi) |
3475 | - rhub->psi_count = 0; |
3476 | + port_cap = &xhci->port_caps[xhci->num_port_caps++]; |
3477 | + if (xhci->num_port_caps > max_caps) |
3478 | + return; |
3479 | + |
3480 | + port_cap->maj_rev = major_revision; |
3481 | + port_cap->min_rev = minor_revision; |
3482 | + port_cap->psi_count = XHCI_EXT_PORT_PSIC(temp); |
3483 | |
3484 | - rhub->psi_uid_count++; |
3485 | - for (i = 0; i < rhub->psi_count; i++) { |
3486 | - rhub->psi[i] = readl(addr + 4 + i); |
3487 | + if (port_cap->psi_count) { |
3488 | + port_cap->psi = kcalloc_node(port_cap->psi_count, |
3489 | + sizeof(*port_cap->psi), |
3490 | + GFP_KERNEL, dev_to_node(dev)); |
3491 | + if (!port_cap->psi) |
3492 | + port_cap->psi_count = 0; |
3493 | + |
3494 | + port_cap->psi_uid_count++; |
3495 | + for (i = 0; i < port_cap->psi_count; i++) { |
3496 | + port_cap->psi[i] = readl(addr + 4 + i); |
3497 | |
3498 | /* count unique ID values, two consecutive entries can |
3499 | * have the same ID if link is assymetric |
3500 | */ |
3501 | - if (i && (XHCI_EXT_PORT_PSIV(rhub->psi[i]) != |
3502 | - XHCI_EXT_PORT_PSIV(rhub->psi[i - 1]))) |
3503 | - rhub->psi_uid_count++; |
3504 | + if (i && (XHCI_EXT_PORT_PSIV(port_cap->psi[i]) != |
3505 | + XHCI_EXT_PORT_PSIV(port_cap->psi[i - 1]))) |
3506 | + port_cap->psi_uid_count++; |
3507 | |
3508 | xhci_dbg(xhci, "PSIV:%d PSIE:%d PLT:%d PFD:%d LP:%d PSIM:%d\n", |
3509 | - XHCI_EXT_PORT_PSIV(rhub->psi[i]), |
3510 | - XHCI_EXT_PORT_PSIE(rhub->psi[i]), |
3511 | - XHCI_EXT_PORT_PLT(rhub->psi[i]), |
3512 | - XHCI_EXT_PORT_PFD(rhub->psi[i]), |
3513 | - XHCI_EXT_PORT_LP(rhub->psi[i]), |
3514 | - XHCI_EXT_PORT_PSIM(rhub->psi[i])); |
3515 | + XHCI_EXT_PORT_PSIV(port_cap->psi[i]), |
3516 | + XHCI_EXT_PORT_PSIE(port_cap->psi[i]), |
3517 | + XHCI_EXT_PORT_PLT(port_cap->psi[i]), |
3518 | + XHCI_EXT_PORT_PFD(port_cap->psi[i]), |
3519 | + XHCI_EXT_PORT_LP(port_cap->psi[i]), |
3520 | + XHCI_EXT_PORT_PSIM(port_cap->psi[i])); |
3521 | } |
3522 | } |
3523 | /* cache usb2 port capabilities */ |
3524 | @@ -2213,6 +2228,7 @@ static void xhci_add_in_port(struct xhci_hcd *xhci, unsigned int num_ports, |
3525 | continue; |
3526 | } |
3527 | hw_port->rhub = rhub; |
3528 | + hw_port->port_cap = port_cap; |
3529 | rhub->num_ports++; |
3530 | } |
3531 | /* FIXME: Should we disable ports not in the Extended Capabilities? */ |
3532 | @@ -2303,6 +2319,11 @@ static int xhci_setup_port_arrays(struct xhci_hcd *xhci, gfp_t flags) |
3533 | if (!xhci->ext_caps) |
3534 | return -ENOMEM; |
3535 | |
3536 | + xhci->port_caps = kcalloc_node(cap_count, sizeof(*xhci->port_caps), |
3537 | + flags, dev_to_node(dev)); |
3538 | + if (!xhci->port_caps) |
3539 | + return -ENOMEM; |
3540 | + |
3541 | offset = cap_start; |
3542 | |
3543 | while (offset) { |
3544 | diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c |
3545 | index 4917c5b033fa..5e9b537df631 100644 |
3546 | --- a/drivers/usb/host/xhci-pci.c |
3547 | +++ b/drivers/usb/host/xhci-pci.c |
3548 | @@ -49,6 +49,7 @@ |
3549 | #define PCI_DEVICE_ID_INTEL_TITAN_RIDGE_4C_XHCI 0x15ec |
3550 | #define PCI_DEVICE_ID_INTEL_TITAN_RIDGE_DD_XHCI 0x15f0 |
3551 | #define PCI_DEVICE_ID_INTEL_ICE_LAKE_XHCI 0x8a13 |
3552 | +#define PCI_DEVICE_ID_INTEL_CML_XHCI 0xa3af |
3553 | |
3554 | #define PCI_DEVICE_ID_AMD_PROMONTORYA_4 0x43b9 |
3555 | #define PCI_DEVICE_ID_AMD_PROMONTORYA_3 0x43ba |
3556 | @@ -187,7 +188,8 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci) |
3557 | pdev->device == PCI_DEVICE_ID_INTEL_BROXTON_M_XHCI || |
3558 | pdev->device == PCI_DEVICE_ID_INTEL_BROXTON_B_XHCI || |
3559 | pdev->device == PCI_DEVICE_ID_INTEL_APL_XHCI || |
3560 | - pdev->device == PCI_DEVICE_ID_INTEL_DNV_XHCI)) { |
3561 | + pdev->device == PCI_DEVICE_ID_INTEL_DNV_XHCI || |
3562 | + pdev->device == PCI_DEVICE_ID_INTEL_CML_XHCI)) { |
3563 | xhci->quirks |= XHCI_PME_STUCK_QUIRK; |
3564 | } |
3565 | if (pdev->vendor == PCI_VENDOR_ID_INTEL && |
3566 | @@ -302,6 +304,9 @@ static int xhci_pci_setup(struct usb_hcd *hcd) |
3567 | if (!usb_hcd_is_primary_hcd(hcd)) |
3568 | return 0; |
3569 | |
3570 | + if (xhci->quirks & XHCI_PME_STUCK_QUIRK) |
3571 | + xhci_pme_acpi_rtd3_enable(pdev); |
3572 | + |
3573 | xhci_dbg(xhci, "Got SBRN %u\n", (unsigned int) xhci->sbrn); |
3574 | |
3575 | /* Find any debug ports */ |
3576 | @@ -359,9 +364,6 @@ static int xhci_pci_probe(struct pci_dev *dev, const struct pci_device_id *id) |
3577 | HCC_MAX_PSA(xhci->hcc_params) >= 4) |
3578 | xhci->shared_hcd->can_do_streams = 1; |
3579 | |
3580 | - if (xhci->quirks & XHCI_PME_STUCK_QUIRK) |
3581 | - xhci_pme_acpi_rtd3_enable(dev); |
3582 | - |
3583 | /* USB-2 and USB-3 roothubs initialized, allow runtime pm suspend */ |
3584 | pm_runtime_put_noidle(&dev->dev); |
3585 | |
3586 | diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c |
3587 | index 4a2fe56940bd..f7a190fb2353 100644 |
3588 | --- a/drivers/usb/host/xhci-ring.c |
3589 | +++ b/drivers/usb/host/xhci-ring.c |
3590 | @@ -2740,6 +2740,42 @@ static int xhci_handle_event(struct xhci_hcd *xhci) |
3591 | return 1; |
3592 | } |
3593 | |
3594 | +/* |
3595 | + * Update Event Ring Dequeue Pointer: |
3596 | + * - When all events have finished |
3597 | + * - To avoid "Event Ring Full Error" condition |
3598 | + */ |
3599 | +static void xhci_update_erst_dequeue(struct xhci_hcd *xhci, |
3600 | + union xhci_trb *event_ring_deq) |
3601 | +{ |
3602 | + u64 temp_64; |
3603 | + dma_addr_t deq; |
3604 | + |
3605 | + temp_64 = xhci_read_64(xhci, &xhci->ir_set->erst_dequeue); |
3606 | + /* If necessary, update the HW's version of the event ring deq ptr. */ |
3607 | + if (event_ring_deq != xhci->event_ring->dequeue) { |
3608 | + deq = xhci_trb_virt_to_dma(xhci->event_ring->deq_seg, |
3609 | + xhci->event_ring->dequeue); |
3610 | + if (deq == 0) |
3611 | + xhci_warn(xhci, "WARN something wrong with SW event ring dequeue ptr\n"); |
3612 | + /* |
3613 | + * Per 4.9.4, Software writes to the ERDP register shall |
3614 | + * always advance the Event Ring Dequeue Pointer value. |
3615 | + */ |
3616 | + if ((temp_64 & (u64) ~ERST_PTR_MASK) == |
3617 | + ((u64) deq & (u64) ~ERST_PTR_MASK)) |
3618 | + return; |
3619 | + |
3620 | + /* Update HC event ring dequeue pointer */ |
3621 | + temp_64 &= ERST_PTR_MASK; |
3622 | + temp_64 |= ((u64) deq & (u64) ~ERST_PTR_MASK); |
3623 | + } |
3624 | + |
3625 | + /* Clear the event handler busy flag (RW1C) */ |
3626 | + temp_64 |= ERST_EHB; |
3627 | + xhci_write_64(xhci, temp_64, &xhci->ir_set->erst_dequeue); |
3628 | +} |
3629 | + |
3630 | /* |
3631 | * xHCI spec says we can get an interrupt, and if the HC has an error condition, |
3632 | * we might get bad data out of the event ring. Section 4.10.2.7 has a list of |
3633 | @@ -2751,9 +2787,9 @@ irqreturn_t xhci_irq(struct usb_hcd *hcd) |
3634 | union xhci_trb *event_ring_deq; |
3635 | irqreturn_t ret = IRQ_NONE; |
3636 | unsigned long flags; |
3637 | - dma_addr_t deq; |
3638 | u64 temp_64; |
3639 | u32 status; |
3640 | + int event_loop = 0; |
3641 | |
3642 | spin_lock_irqsave(&xhci->lock, flags); |
3643 | /* Check if the xHC generated the interrupt, or the irq is shared */ |
3644 | @@ -2807,24 +2843,14 @@ irqreturn_t xhci_irq(struct usb_hcd *hcd) |
3645 | /* FIXME this should be a delayed service routine |
3646 | * that clears the EHB. |
3647 | */ |
3648 | - while (xhci_handle_event(xhci) > 0) {} |
3649 | - |
3650 | - temp_64 = xhci_read_64(xhci, &xhci->ir_set->erst_dequeue); |
3651 | - /* If necessary, update the HW's version of the event ring deq ptr. */ |
3652 | - if (event_ring_deq != xhci->event_ring->dequeue) { |
3653 | - deq = xhci_trb_virt_to_dma(xhci->event_ring->deq_seg, |
3654 | - xhci->event_ring->dequeue); |
3655 | - if (deq == 0) |
3656 | - xhci_warn(xhci, "WARN something wrong with SW event " |
3657 | - "ring dequeue ptr.\n"); |
3658 | - /* Update HC event ring dequeue pointer */ |
3659 | - temp_64 &= ERST_PTR_MASK; |
3660 | - temp_64 |= ((u64) deq & (u64) ~ERST_PTR_MASK); |
3661 | + while (xhci_handle_event(xhci) > 0) { |
3662 | + if (event_loop++ < TRBS_PER_SEGMENT / 2) |
3663 | + continue; |
3664 | + xhci_update_erst_dequeue(xhci, event_ring_deq); |
3665 | + event_loop = 0; |
3666 | } |
3667 | |
3668 | - /* Clear the event handler busy flag (RW1C); event ring is empty. */ |
3669 | - temp_64 |= ERST_EHB; |
3670 | - xhci_write_64(xhci, temp_64, &xhci->ir_set->erst_dequeue); |
3671 | + xhci_update_erst_dequeue(xhci, event_ring_deq); |
3672 | ret = IRQ_HANDLED; |
3673 | |
3674 | out: |
3675 | diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h |
3676 | index 973d665052a2..98b98a0cd2a8 100644 |
3677 | --- a/drivers/usb/host/xhci.h |
3678 | +++ b/drivers/usb/host/xhci.h |
3679 | @@ -1702,12 +1702,20 @@ struct xhci_bus_state { |
3680 | * Intel Lynx Point LP xHCI host. |
3681 | */ |
3682 | #define XHCI_MAX_REXIT_TIMEOUT_MS 20 |
3683 | +struct xhci_port_cap { |
3684 | + u32 *psi; /* array of protocol speed ID entries */ |
3685 | + u8 psi_count; |
3686 | + u8 psi_uid_count; |
3687 | + u8 maj_rev; |
3688 | + u8 min_rev; |
3689 | +}; |
3690 | |
3691 | struct xhci_port { |
3692 | __le32 __iomem *addr; |
3693 | int hw_portnum; |
3694 | int hcd_portnum; |
3695 | struct xhci_hub *rhub; |
3696 | + struct xhci_port_cap *port_cap; |
3697 | }; |
3698 | |
3699 | struct xhci_hub { |
3700 | @@ -1719,9 +1727,6 @@ struct xhci_hub { |
3701 | /* supported prococol extended capabiliy values */ |
3702 | u8 maj_rev; |
3703 | u8 min_rev; |
3704 | - u32 *psi; /* array of protocol speed ID entries */ |
3705 | - u8 psi_count; |
3706 | - u8 psi_uid_count; |
3707 | }; |
3708 | |
3709 | /* There is one xhci_hcd structure per controller */ |
3710 | @@ -1880,6 +1885,9 @@ struct xhci_hcd { |
3711 | /* cached usb2 extened protocol capabilites */ |
3712 | u32 *ext_caps; |
3713 | unsigned int num_ext_caps; |
3714 | + /* cached extended protocol port capabilities */ |
3715 | + struct xhci_port_cap *port_caps; |
3716 | + unsigned int num_port_caps; |
3717 | /* Compliance Mode Recovery Data */ |
3718 | struct timer_list comp_mode_recovery_timer; |
3719 | u32 port_status_u0; |
3720 | diff --git a/drivers/usb/misc/iowarrior.c b/drivers/usb/misc/iowarrior.c |
3721 | index dce44fbf031f..dce20301e367 100644 |
3722 | --- a/drivers/usb/misc/iowarrior.c |
3723 | +++ b/drivers/usb/misc/iowarrior.c |
3724 | @@ -33,6 +33,14 @@ |
3725 | #define USB_DEVICE_ID_CODEMERCS_IOWPV2 0x1512 |
3726 | /* full speed iowarrior */ |
3727 | #define USB_DEVICE_ID_CODEMERCS_IOW56 0x1503 |
3728 | +/* fuller speed iowarrior */ |
3729 | +#define USB_DEVICE_ID_CODEMERCS_IOW28 0x1504 |
3730 | +#define USB_DEVICE_ID_CODEMERCS_IOW28L 0x1505 |
3731 | +#define USB_DEVICE_ID_CODEMERCS_IOW100 0x1506 |
3732 | + |
3733 | +/* OEMed devices */ |
3734 | +#define USB_DEVICE_ID_CODEMERCS_IOW24SAG 0x158a |
3735 | +#define USB_DEVICE_ID_CODEMERCS_IOW56AM 0x158b |
3736 | |
3737 | /* Get a minor range for your devices from the usb maintainer */ |
3738 | #ifdef CONFIG_USB_DYNAMIC_MINORS |
3739 | @@ -133,6 +141,11 @@ static const struct usb_device_id iowarrior_ids[] = { |
3740 | {USB_DEVICE(USB_VENDOR_ID_CODEMERCS, USB_DEVICE_ID_CODEMERCS_IOWPV1)}, |
3741 | {USB_DEVICE(USB_VENDOR_ID_CODEMERCS, USB_DEVICE_ID_CODEMERCS_IOWPV2)}, |
3742 | {USB_DEVICE(USB_VENDOR_ID_CODEMERCS, USB_DEVICE_ID_CODEMERCS_IOW56)}, |
3743 | + {USB_DEVICE(USB_VENDOR_ID_CODEMERCS, USB_DEVICE_ID_CODEMERCS_IOW24SAG)}, |
3744 | + {USB_DEVICE(USB_VENDOR_ID_CODEMERCS, USB_DEVICE_ID_CODEMERCS_IOW56AM)}, |
3745 | + {USB_DEVICE(USB_VENDOR_ID_CODEMERCS, USB_DEVICE_ID_CODEMERCS_IOW28)}, |
3746 | + {USB_DEVICE(USB_VENDOR_ID_CODEMERCS, USB_DEVICE_ID_CODEMERCS_IOW28L)}, |
3747 | + {USB_DEVICE(USB_VENDOR_ID_CODEMERCS, USB_DEVICE_ID_CODEMERCS_IOW100)}, |
3748 | {} /* Terminating entry */ |
3749 | }; |
3750 | MODULE_DEVICE_TABLE(usb, iowarrior_ids); |
3751 | @@ -357,6 +370,7 @@ static ssize_t iowarrior_write(struct file *file, |
3752 | } |
3753 | switch (dev->product_id) { |
3754 | case USB_DEVICE_ID_CODEMERCS_IOW24: |
3755 | + case USB_DEVICE_ID_CODEMERCS_IOW24SAG: |
3756 | case USB_DEVICE_ID_CODEMERCS_IOWPV1: |
3757 | case USB_DEVICE_ID_CODEMERCS_IOWPV2: |
3758 | case USB_DEVICE_ID_CODEMERCS_IOW40: |
3759 | @@ -371,6 +385,10 @@ static ssize_t iowarrior_write(struct file *file, |
3760 | goto exit; |
3761 | break; |
3762 | case USB_DEVICE_ID_CODEMERCS_IOW56: |
3763 | + case USB_DEVICE_ID_CODEMERCS_IOW56AM: |
3764 | + case USB_DEVICE_ID_CODEMERCS_IOW28: |
3765 | + case USB_DEVICE_ID_CODEMERCS_IOW28L: |
3766 | + case USB_DEVICE_ID_CODEMERCS_IOW100: |
3767 | /* The IOW56 uses asynchronous IO and more urbs */ |
3768 | if (atomic_read(&dev->write_busy) == MAX_WRITES_IN_FLIGHT) { |
3769 | /* Wait until we are below the limit for submitted urbs */ |
3770 | @@ -493,6 +511,7 @@ static long iowarrior_ioctl(struct file *file, unsigned int cmd, |
3771 | switch (cmd) { |
3772 | case IOW_WRITE: |
3773 | if (dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW24 || |
3774 | + dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW24SAG || |
3775 | dev->product_id == USB_DEVICE_ID_CODEMERCS_IOWPV1 || |
3776 | dev->product_id == USB_DEVICE_ID_CODEMERCS_IOWPV2 || |
3777 | dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW40) { |
3778 | @@ -767,7 +786,11 @@ static int iowarrior_probe(struct usb_interface *interface, |
3779 | goto error; |
3780 | } |
3781 | |
3782 | - if (dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW56) { |
3783 | + if ((dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW56) || |
3784 | + (dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW56AM) || |
3785 | + (dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW28) || |
3786 | + (dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW28L) || |
3787 | + (dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW100)) { |
3788 | res = usb_find_last_int_out_endpoint(iface_desc, |
3789 | &dev->int_out_endpoint); |
3790 | if (res) { |
3791 | @@ -780,7 +803,11 @@ static int iowarrior_probe(struct usb_interface *interface, |
3792 | /* we have to check the report_size often, so remember it in the endianness suitable for our machine */ |
3793 | dev->report_size = usb_endpoint_maxp(dev->int_in_endpoint); |
3794 | if ((dev->interface->cur_altsetting->desc.bInterfaceNumber == 0) && |
3795 | - (dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW56)) |
3796 | + ((dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW56) || |
3797 | + (dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW56AM) || |
3798 | + (dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW28) || |
3799 | + (dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW28L) || |
3800 | + (dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW100))) |
3801 | /* IOWarrior56 has wMaxPacketSize different from report size */ |
3802 | dev->report_size = 7; |
3803 | |
3804 | diff --git a/drivers/usb/storage/uas.c b/drivers/usb/storage/uas.c |
3805 | index 475b9c692827..bb2198496f42 100644 |
3806 | --- a/drivers/usb/storage/uas.c |
3807 | +++ b/drivers/usb/storage/uas.c |
3808 | @@ -45,6 +45,7 @@ struct uas_dev_info { |
3809 | struct scsi_cmnd *cmnd[MAX_CMNDS]; |
3810 | spinlock_t lock; |
3811 | struct work_struct work; |
3812 | + struct work_struct scan_work; /* for async scanning */ |
3813 | }; |
3814 | |
3815 | enum { |
3816 | @@ -114,6 +115,17 @@ out: |
3817 | spin_unlock_irqrestore(&devinfo->lock, flags); |
3818 | } |
3819 | |
3820 | +static void uas_scan_work(struct work_struct *work) |
3821 | +{ |
3822 | + struct uas_dev_info *devinfo = |
3823 | + container_of(work, struct uas_dev_info, scan_work); |
3824 | + struct Scsi_Host *shost = usb_get_intfdata(devinfo->intf); |
3825 | + |
3826 | + dev_dbg(&devinfo->intf->dev, "starting scan\n"); |
3827 | + scsi_scan_host(shost); |
3828 | + dev_dbg(&devinfo->intf->dev, "scan complete\n"); |
3829 | +} |
3830 | + |
3831 | static void uas_add_work(struct uas_cmd_info *cmdinfo) |
3832 | { |
3833 | struct scsi_pointer *scp = (void *)cmdinfo; |
3834 | @@ -983,6 +995,7 @@ static int uas_probe(struct usb_interface *intf, const struct usb_device_id *id) |
3835 | init_usb_anchor(&devinfo->data_urbs); |
3836 | spin_lock_init(&devinfo->lock); |
3837 | INIT_WORK(&devinfo->work, uas_do_work); |
3838 | + INIT_WORK(&devinfo->scan_work, uas_scan_work); |
3839 | |
3840 | result = uas_configure_endpoints(devinfo); |
3841 | if (result) |
3842 | @@ -999,7 +1012,9 @@ static int uas_probe(struct usb_interface *intf, const struct usb_device_id *id) |
3843 | if (result) |
3844 | goto free_streams; |
3845 | |
3846 | - scsi_scan_host(shost); |
3847 | + /* Submit the delayed_work for SCSI-device scanning */ |
3848 | + schedule_work(&devinfo->scan_work); |
3849 | + |
3850 | return result; |
3851 | |
3852 | free_streams: |
3853 | @@ -1167,6 +1182,12 @@ static void uas_disconnect(struct usb_interface *intf) |
3854 | usb_kill_anchored_urbs(&devinfo->data_urbs); |
3855 | uas_zap_pending(devinfo, DID_NO_CONNECT); |
3856 | |
3857 | + /* |
3858 | + * Prevent SCSI scanning (if it hasn't started yet) |
3859 | + * or wait for the SCSI-scanning routine to stop. |
3860 | + */ |
3861 | + cancel_work_sync(&devinfo->scan_work); |
3862 | + |
3863 | scsi_remove_host(shost); |
3864 | uas_free_streams(devinfo); |
3865 | scsi_host_put(shost); |
3866 | diff --git a/drivers/xen/preempt.c b/drivers/xen/preempt.c |
3867 | index 8b9919c26095..456a164364a2 100644 |
3868 | --- a/drivers/xen/preempt.c |
3869 | +++ b/drivers/xen/preempt.c |
3870 | @@ -33,7 +33,9 @@ asmlinkage __visible void xen_maybe_preempt_hcall(void) |
3871 | * cpu. |
3872 | */ |
3873 | __this_cpu_write(xen_in_preemptible_hcall, false); |
3874 | - _cond_resched(); |
3875 | + local_irq_enable(); |
3876 | + cond_resched(); |
3877 | + local_irq_disable(); |
3878 | __this_cpu_write(xen_in_preemptible_hcall, true); |
3879 | } |
3880 | } |
3881 | diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c |
3882 | index b0ccca5d08b5..5cdd1b51285b 100644 |
3883 | --- a/fs/btrfs/disk-io.c |
3884 | +++ b/fs/btrfs/disk-io.c |
3885 | @@ -3203,6 +3203,7 @@ retry_root_backup: |
3886 | if (IS_ERR(fs_info->fs_root)) { |
3887 | err = PTR_ERR(fs_info->fs_root); |
3888 | btrfs_warn(fs_info, "failed to read fs tree: %d", err); |
3889 | + fs_info->fs_root = NULL; |
3890 | goto fail_qgroup; |
3891 | } |
3892 | |
3893 | @@ -4293,6 +4294,7 @@ static int btrfs_destroy_delayed_refs(struct btrfs_transaction *trans, |
3894 | cond_resched(); |
3895 | spin_lock(&delayed_refs->lock); |
3896 | } |
3897 | + btrfs_qgroup_destroy_extent_records(trans); |
3898 | |
3899 | spin_unlock(&delayed_refs->lock); |
3900 | |
3901 | @@ -4518,7 +4520,6 @@ void btrfs_cleanup_one_transaction(struct btrfs_transaction *cur_trans, |
3902 | wake_up(&fs_info->transaction_wait); |
3903 | |
3904 | btrfs_destroy_delayed_inodes(fs_info); |
3905 | - btrfs_assert_delayed_root_empty(fs_info); |
3906 | |
3907 | btrfs_destroy_marked_extents(fs_info, &cur_trans->dirty_pages, |
3908 | EXTENT_DIRTY); |
3909 | diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c |
3910 | index dc50605ecbda..47ecf7216b3e 100644 |
3911 | --- a/fs/btrfs/extent-tree.c |
3912 | +++ b/fs/btrfs/extent-tree.c |
3913 | @@ -4411,6 +4411,8 @@ int btrfs_alloc_logged_file_extent(struct btrfs_trans_handle *trans, |
3914 | |
3915 | ret = alloc_reserved_file_extent(trans, 0, root_objectid, 0, owner, |
3916 | offset, ins, 1); |
3917 | + if (ret) |
3918 | + btrfs_pin_extent(fs_info, ins->objectid, ins->offset, 1); |
3919 | btrfs_put_block_group(block_group); |
3920 | return ret; |
3921 | } |
3922 | diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c |
3923 | index b83eef445db3..50feb01f27f3 100644 |
3924 | --- a/fs/btrfs/inode.c |
3925 | +++ b/fs/btrfs/inode.c |
3926 | @@ -4734,6 +4734,8 @@ int btrfs_truncate_inode_items(struct btrfs_trans_handle *trans, |
3927 | u64 bytes_deleted = 0; |
3928 | bool be_nice = false; |
3929 | bool should_throttle = false; |
3930 | + const u64 lock_start = ALIGN_DOWN(new_size, fs_info->sectorsize); |
3931 | + struct extent_state *cached_state = NULL; |
3932 | |
3933 | BUG_ON(new_size > 0 && min_type != BTRFS_EXTENT_DATA_KEY); |
3934 | |
3935 | @@ -4750,6 +4752,10 @@ int btrfs_truncate_inode_items(struct btrfs_trans_handle *trans, |
3936 | return -ENOMEM; |
3937 | path->reada = READA_BACK; |
3938 | |
3939 | + if (root->root_key.objectid != BTRFS_TREE_LOG_OBJECTID) |
3940 | + lock_extent_bits(&BTRFS_I(inode)->io_tree, lock_start, (u64)-1, |
3941 | + &cached_state); |
3942 | + |
3943 | /* |
3944 | * We want to drop from the next block forward in case this new size is |
3945 | * not block aligned since we will be keeping the last block of the |
3946 | @@ -4786,7 +4792,6 @@ search_again: |
3947 | goto out; |
3948 | } |
3949 | |
3950 | - path->leave_spinning = 1; |
3951 | ret = btrfs_search_slot(trans, root, &key, path, -1, 1); |
3952 | if (ret < 0) |
3953 | goto out; |
3954 | @@ -4938,7 +4943,6 @@ delete: |
3955 | root == fs_info->tree_root)) { |
3956 | struct btrfs_ref ref = { 0 }; |
3957 | |
3958 | - btrfs_set_path_blocking(path); |
3959 | bytes_deleted += extent_num_bytes; |
3960 | |
3961 | btrfs_init_generic_ref(&ref, BTRFS_DROP_DELAYED_REF, |
3962 | @@ -5014,6 +5018,8 @@ out: |
3963 | if (!ret && last_size > new_size) |
3964 | last_size = new_size; |
3965 | btrfs_ordered_update_i_size(inode, last_size, NULL); |
3966 | + unlock_extent_cached(&BTRFS_I(inode)->io_tree, lock_start, |
3967 | + (u64)-1, &cached_state); |
3968 | } |
3969 | |
3970 | btrfs_free_path(path); |
3971 | @@ -10464,6 +10470,7 @@ static int __btrfs_prealloc_file_range(struct inode *inode, int mode, |
3972 | struct btrfs_root *root = BTRFS_I(inode)->root; |
3973 | struct btrfs_key ins; |
3974 | u64 cur_offset = start; |
3975 | + u64 clear_offset = start; |
3976 | u64 i_size; |
3977 | u64 cur_bytes; |
3978 | u64 last_alloc = (u64)-1; |
3979 | @@ -10498,6 +10505,15 @@ static int __btrfs_prealloc_file_range(struct inode *inode, int mode, |
3980 | btrfs_end_transaction(trans); |
3981 | break; |
3982 | } |
3983 | + |
3984 | + /* |
3985 | + * We've reserved this space, and thus converted it from |
3986 | + * ->bytes_may_use to ->bytes_reserved. Any error that happens |
3987 | + * from here on out we will only need to clear our reservation |
3988 | + * for the remaining unreserved area, so advance our |
3989 | + * clear_offset by our extent size. |
3990 | + */ |
3991 | + clear_offset += ins.offset; |
3992 | btrfs_dec_block_group_reservations(fs_info, ins.objectid); |
3993 | |
3994 | last_alloc = ins.offset; |
3995 | @@ -10578,9 +10594,9 @@ next: |
3996 | if (own_trans) |
3997 | btrfs_end_transaction(trans); |
3998 | } |
3999 | - if (cur_offset < end) |
4000 | - btrfs_free_reserved_data_space(inode, NULL, cur_offset, |
4001 | - end - cur_offset + 1); |
4002 | + if (clear_offset < end) |
4003 | + btrfs_free_reserved_data_space(inode, NULL, clear_offset, |
4004 | + end - clear_offset + 1); |
4005 | return ret; |
4006 | } |
4007 | |
4008 | diff --git a/fs/btrfs/ordered-data.c b/fs/btrfs/ordered-data.c |
4009 | index 6240a5a1f2c0..00e1ef4f7979 100644 |
4010 | --- a/fs/btrfs/ordered-data.c |
4011 | +++ b/fs/btrfs/ordered-data.c |
4012 | @@ -690,10 +690,15 @@ int btrfs_wait_ordered_range(struct inode *inode, u64 start, u64 len) |
4013 | } |
4014 | btrfs_start_ordered_extent(inode, ordered, 1); |
4015 | end = ordered->file_offset; |
4016 | + /* |
4017 | + * If the ordered extent had an error save the error but don't |
4018 | + * exit without waiting first for all other ordered extents in |
4019 | + * the range to complete. |
4020 | + */ |
4021 | if (test_bit(BTRFS_ORDERED_IOERR, &ordered->flags)) |
4022 | ret = -EIO; |
4023 | btrfs_put_ordered_extent(ordered); |
4024 | - if (ret || end == 0 || end == start) |
4025 | + if (end == 0 || end == start) |
4026 | break; |
4027 | end--; |
4028 | } |
4029 | diff --git a/fs/btrfs/qgroup.c b/fs/btrfs/qgroup.c |
4030 | index 50517221638a..286c8c11c8d3 100644 |
4031 | --- a/fs/btrfs/qgroup.c |
4032 | +++ b/fs/btrfs/qgroup.c |
4033 | @@ -4018,3 +4018,16 @@ out: |
4034 | } |
4035 | return ret; |
4036 | } |
4037 | + |
4038 | +void btrfs_qgroup_destroy_extent_records(struct btrfs_transaction *trans) |
4039 | +{ |
4040 | + struct btrfs_qgroup_extent_record *entry; |
4041 | + struct btrfs_qgroup_extent_record *next; |
4042 | + struct rb_root *root; |
4043 | + |
4044 | + root = &trans->delayed_refs.dirty_extent_root; |
4045 | + rbtree_postorder_for_each_entry_safe(entry, next, root, node) { |
4046 | + ulist_free(entry->old_roots); |
4047 | + kfree(entry); |
4048 | + } |
4049 | +} |
4050 | diff --git a/fs/btrfs/qgroup.h b/fs/btrfs/qgroup.h |
4051 | index 46ba7bd2961c..17e8ac992c50 100644 |
4052 | --- a/fs/btrfs/qgroup.h |
4053 | +++ b/fs/btrfs/qgroup.h |
4054 | @@ -414,5 +414,6 @@ int btrfs_qgroup_add_swapped_blocks(struct btrfs_trans_handle *trans, |
4055 | u64 last_snapshot); |
4056 | int btrfs_qgroup_trace_subtree_after_cow(struct btrfs_trans_handle *trans, |
4057 | struct btrfs_root *root, struct extent_buffer *eb); |
4058 | +void btrfs_qgroup_destroy_extent_records(struct btrfs_transaction *trans); |
4059 | |
4060 | #endif |
4061 | diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c |
4062 | index ceffec752234..98b6903e3938 100644 |
4063 | --- a/fs/btrfs/transaction.c |
4064 | +++ b/fs/btrfs/transaction.c |
4065 | @@ -51,6 +51,8 @@ void btrfs_put_transaction(struct btrfs_transaction *transaction) |
4066 | BUG_ON(!list_empty(&transaction->list)); |
4067 | WARN_ON(!RB_EMPTY_ROOT( |
4068 | &transaction->delayed_refs.href_root.rb_root)); |
4069 | + WARN_ON(!RB_EMPTY_ROOT( |
4070 | + &transaction->delayed_refs.dirty_extent_root)); |
4071 | if (transaction->delayed_refs.pending_csums) |
4072 | btrfs_err(transaction->fs_info, |
4073 | "pending csums is %llu", |
4074 | diff --git a/fs/ecryptfs/crypto.c b/fs/ecryptfs/crypto.c |
4075 | index f91db24bbf3b..a064b408d841 100644 |
4076 | --- a/fs/ecryptfs/crypto.c |
4077 | +++ b/fs/ecryptfs/crypto.c |
4078 | @@ -311,8 +311,10 @@ static int crypt_scatterlist(struct ecryptfs_crypt_stat *crypt_stat, |
4079 | struct extent_crypt_result ecr; |
4080 | int rc = 0; |
4081 | |
4082 | - BUG_ON(!crypt_stat || !crypt_stat->tfm |
4083 | - || !(crypt_stat->flags & ECRYPTFS_STRUCT_INITIALIZED)); |
4084 | + if (!crypt_stat || !crypt_stat->tfm |
4085 | + || !(crypt_stat->flags & ECRYPTFS_STRUCT_INITIALIZED)) |
4086 | + return -EINVAL; |
4087 | + |
4088 | if (unlikely(ecryptfs_verbosity > 0)) { |
4089 | ecryptfs_printk(KERN_DEBUG, "Key size [%zd]; key:\n", |
4090 | crypt_stat->key_size); |
4091 | diff --git a/fs/ecryptfs/keystore.c b/fs/ecryptfs/keystore.c |
4092 | index 216fbe6a4837..4dc09638de8f 100644 |
4093 | --- a/fs/ecryptfs/keystore.c |
4094 | +++ b/fs/ecryptfs/keystore.c |
4095 | @@ -1304,7 +1304,7 @@ parse_tag_1_packet(struct ecryptfs_crypt_stat *crypt_stat, |
4096 | printk(KERN_WARNING "Tag 1 packet contains key larger " |
4097 | "than ECRYPTFS_MAX_ENCRYPTED_KEY_BYTES\n"); |
4098 | rc = -EINVAL; |
4099 | - goto out; |
4100 | + goto out_free; |
4101 | } |
4102 | memcpy((*new_auth_tok)->session_key.encrypted_key, |
4103 | &data[(*packet_size)], (body_size - (ECRYPTFS_SIG_SIZE + 2))); |
4104 | diff --git a/fs/ecryptfs/messaging.c b/fs/ecryptfs/messaging.c |
4105 | index d668e60b85b5..c05ca39aa449 100644 |
4106 | --- a/fs/ecryptfs/messaging.c |
4107 | +++ b/fs/ecryptfs/messaging.c |
4108 | @@ -379,6 +379,7 @@ int __init ecryptfs_init_messaging(void) |
4109 | * ecryptfs_message_buf_len), |
4110 | GFP_KERNEL); |
4111 | if (!ecryptfs_msg_ctx_arr) { |
4112 | + kfree(ecryptfs_daemon_hash); |
4113 | rc = -ENOMEM; |
4114 | goto out; |
4115 | } |
4116 | diff --git a/fs/ext4/balloc.c b/fs/ext4/balloc.c |
4117 | index 0b202e00d93f..5aba67a504cf 100644 |
4118 | --- a/fs/ext4/balloc.c |
4119 | +++ b/fs/ext4/balloc.c |
4120 | @@ -270,6 +270,7 @@ struct ext4_group_desc * ext4_get_group_desc(struct super_block *sb, |
4121 | ext4_group_t ngroups = ext4_get_groups_count(sb); |
4122 | struct ext4_group_desc *desc; |
4123 | struct ext4_sb_info *sbi = EXT4_SB(sb); |
4124 | + struct buffer_head *bh_p; |
4125 | |
4126 | if (block_group >= ngroups) { |
4127 | ext4_error(sb, "block_group >= groups_count - block_group = %u," |
4128 | @@ -280,7 +281,14 @@ struct ext4_group_desc * ext4_get_group_desc(struct super_block *sb, |
4129 | |
4130 | group_desc = block_group >> EXT4_DESC_PER_BLOCK_BITS(sb); |
4131 | offset = block_group & (EXT4_DESC_PER_BLOCK(sb) - 1); |
4132 | - if (!sbi->s_group_desc[group_desc]) { |
4133 | + bh_p = sbi_array_rcu_deref(sbi, s_group_desc, group_desc); |
4134 | + /* |
4135 | + * sbi_array_rcu_deref returns with rcu unlocked, this is ok since |
4136 | + * the pointer being dereferenced won't be dereferenced again. By |
4137 | + * looking at the usage in add_new_gdb() the value isn't modified, |
4138 | + * just the pointer, and so it remains valid. |
4139 | + */ |
4140 | + if (!bh_p) { |
4141 | ext4_error(sb, "Group descriptor not loaded - " |
4142 | "block_group = %u, group_desc = %u, desc = %u", |
4143 | block_group, group_desc, offset); |
4144 | @@ -288,10 +296,10 @@ struct ext4_group_desc * ext4_get_group_desc(struct super_block *sb, |
4145 | } |
4146 | |
4147 | desc = (struct ext4_group_desc *)( |
4148 | - (__u8 *)sbi->s_group_desc[group_desc]->b_data + |
4149 | + (__u8 *)bh_p->b_data + |
4150 | offset * EXT4_DESC_SIZE(sb)); |
4151 | if (bh) |
4152 | - *bh = sbi->s_group_desc[group_desc]; |
4153 | + *bh = bh_p; |
4154 | return desc; |
4155 | } |
4156 | |
4157 | diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h |
4158 | index e2f65b565c1f..d576addfdd03 100644 |
4159 | --- a/fs/ext4/ext4.h |
4160 | +++ b/fs/ext4/ext4.h |
4161 | @@ -1396,7 +1396,7 @@ struct ext4_sb_info { |
4162 | loff_t s_bitmap_maxbytes; /* max bytes for bitmap files */ |
4163 | struct buffer_head * s_sbh; /* Buffer containing the super block */ |
4164 | struct ext4_super_block *s_es; /* Pointer to the super block in the buffer */ |
4165 | - struct buffer_head **s_group_desc; |
4166 | + struct buffer_head * __rcu *s_group_desc; |
4167 | unsigned int s_mount_opt; |
4168 | unsigned int s_mount_opt2; |
4169 | unsigned int s_mount_flags; |
4170 | @@ -1458,7 +1458,7 @@ struct ext4_sb_info { |
4171 | #endif |
4172 | |
4173 | /* for buddy allocator */ |
4174 | - struct ext4_group_info ***s_group_info; |
4175 | + struct ext4_group_info ** __rcu *s_group_info; |
4176 | struct inode *s_buddy_cache; |
4177 | spinlock_t s_md_lock; |
4178 | unsigned short *s_mb_offsets; |
4179 | @@ -1508,7 +1508,7 @@ struct ext4_sb_info { |
4180 | unsigned int s_extent_max_zeroout_kb; |
4181 | |
4182 | unsigned int s_log_groups_per_flex; |
4183 | - struct flex_groups *s_flex_groups; |
4184 | + struct flex_groups * __rcu *s_flex_groups; |
4185 | ext4_group_t s_flex_groups_allocated; |
4186 | |
4187 | /* workqueue for reserved extent conversions (buffered io) */ |
4188 | @@ -1548,8 +1548,11 @@ struct ext4_sb_info { |
4189 | struct ratelimit_state s_warning_ratelimit_state; |
4190 | struct ratelimit_state s_msg_ratelimit_state; |
4191 | |
4192 | - /* Barrier between changing inodes' journal flags and writepages ops. */ |
4193 | - struct percpu_rw_semaphore s_journal_flag_rwsem; |
4194 | + /* |
4195 | + * Barrier between writepages ops and changing any inode's JOURNAL_DATA |
4196 | + * or EXTENTS flag. |
4197 | + */ |
4198 | + struct percpu_rw_semaphore s_writepages_rwsem; |
4199 | struct dax_device *s_daxdev; |
4200 | }; |
4201 | |
4202 | @@ -1569,6 +1572,23 @@ static inline int ext4_valid_inum(struct super_block *sb, unsigned long ino) |
4203 | ino <= le32_to_cpu(EXT4_SB(sb)->s_es->s_inodes_count)); |
4204 | } |
4205 | |
4206 | +/* |
4207 | + * Returns: sbi->field[index] |
4208 | + * Used to access an array element from the following sbi fields which require |
4209 | + * rcu protection to avoid dereferencing an invalid pointer due to reassignment |
4210 | + * - s_group_desc |
4211 | + * - s_group_info |
4212 | + * - s_flex_group |
4213 | + */ |
4214 | +#define sbi_array_rcu_deref(sbi, field, index) \ |
4215 | +({ \ |
4216 | + typeof(*((sbi)->field)) _v; \ |
4217 | + rcu_read_lock(); \ |
4218 | + _v = ((typeof(_v)*)rcu_dereference((sbi)->field))[index]; \ |
4219 | + rcu_read_unlock(); \ |
4220 | + _v; \ |
4221 | +}) |
4222 | + |
4223 | /* |
4224 | * Inode dynamic state flags |
4225 | */ |
4226 | @@ -2666,6 +2686,7 @@ extern int ext4_generic_delete_entry(handle_t *handle, |
4227 | extern bool ext4_empty_dir(struct inode *inode); |
4228 | |
4229 | /* resize.c */ |
4230 | +extern void ext4_kvfree_array_rcu(void *to_free); |
4231 | extern int ext4_group_add(struct super_block *sb, |
4232 | struct ext4_new_group_data *input); |
4233 | extern int ext4_group_extend(struct super_block *sb, |
4234 | @@ -2913,13 +2934,13 @@ static inline |
4235 | struct ext4_group_info *ext4_get_group_info(struct super_block *sb, |
4236 | ext4_group_t group) |
4237 | { |
4238 | - struct ext4_group_info ***grp_info; |
4239 | + struct ext4_group_info **grp_info; |
4240 | long indexv, indexh; |
4241 | BUG_ON(group >= EXT4_SB(sb)->s_groups_count); |
4242 | - grp_info = EXT4_SB(sb)->s_group_info; |
4243 | indexv = group >> (EXT4_DESC_PER_BLOCK_BITS(sb)); |
4244 | indexh = group & ((EXT4_DESC_PER_BLOCK(sb)) - 1); |
4245 | - return grp_info[indexv][indexh]; |
4246 | + grp_info = sbi_array_rcu_deref(EXT4_SB(sb), s_group_info, indexv); |
4247 | + return grp_info[indexh]; |
4248 | } |
4249 | |
4250 | /* |
4251 | @@ -2969,7 +2990,7 @@ static inline void ext4_update_i_disksize(struct inode *inode, loff_t newsize) |
4252 | !inode_is_locked(inode)); |
4253 | down_write(&EXT4_I(inode)->i_data_sem); |
4254 | if (newsize > EXT4_I(inode)->i_disksize) |
4255 | - EXT4_I(inode)->i_disksize = newsize; |
4256 | + WRITE_ONCE(EXT4_I(inode)->i_disksize, newsize); |
4257 | up_write(&EXT4_I(inode)->i_data_sem); |
4258 | } |
4259 | |
4260 | diff --git a/fs/ext4/ialloc.c b/fs/ext4/ialloc.c |
4261 | index 564e2ceb8417..a6288730210e 100644 |
4262 | --- a/fs/ext4/ialloc.c |
4263 | +++ b/fs/ext4/ialloc.c |
4264 | @@ -325,11 +325,13 @@ void ext4_free_inode(handle_t *handle, struct inode *inode) |
4265 | |
4266 | percpu_counter_inc(&sbi->s_freeinodes_counter); |
4267 | if (sbi->s_log_groups_per_flex) { |
4268 | - ext4_group_t f = ext4_flex_group(sbi, block_group); |
4269 | + struct flex_groups *fg; |
4270 | |
4271 | - atomic_inc(&sbi->s_flex_groups[f].free_inodes); |
4272 | + fg = sbi_array_rcu_deref(sbi, s_flex_groups, |
4273 | + ext4_flex_group(sbi, block_group)); |
4274 | + atomic_inc(&fg->free_inodes); |
4275 | if (is_directory) |
4276 | - atomic_dec(&sbi->s_flex_groups[f].used_dirs); |
4277 | + atomic_dec(&fg->used_dirs); |
4278 | } |
4279 | BUFFER_TRACE(bh2, "call ext4_handle_dirty_metadata"); |
4280 | fatal = ext4_handle_dirty_metadata(handle, NULL, bh2); |
4281 | @@ -365,12 +367,13 @@ static void get_orlov_stats(struct super_block *sb, ext4_group_t g, |
4282 | int flex_size, struct orlov_stats *stats) |
4283 | { |
4284 | struct ext4_group_desc *desc; |
4285 | - struct flex_groups *flex_group = EXT4_SB(sb)->s_flex_groups; |
4286 | |
4287 | if (flex_size > 1) { |
4288 | - stats->free_inodes = atomic_read(&flex_group[g].free_inodes); |
4289 | - stats->free_clusters = atomic64_read(&flex_group[g].free_clusters); |
4290 | - stats->used_dirs = atomic_read(&flex_group[g].used_dirs); |
4291 | + struct flex_groups *fg = sbi_array_rcu_deref(EXT4_SB(sb), |
4292 | + s_flex_groups, g); |
4293 | + stats->free_inodes = atomic_read(&fg->free_inodes); |
4294 | + stats->free_clusters = atomic64_read(&fg->free_clusters); |
4295 | + stats->used_dirs = atomic_read(&fg->used_dirs); |
4296 | return; |
4297 | } |
4298 | |
4299 | @@ -1051,7 +1054,8 @@ got: |
4300 | if (sbi->s_log_groups_per_flex) { |
4301 | ext4_group_t f = ext4_flex_group(sbi, group); |
4302 | |
4303 | - atomic_inc(&sbi->s_flex_groups[f].used_dirs); |
4304 | + atomic_inc(&sbi_array_rcu_deref(sbi, s_flex_groups, |
4305 | + f)->used_dirs); |
4306 | } |
4307 | } |
4308 | if (ext4_has_group_desc_csum(sb)) { |
4309 | @@ -1074,7 +1078,8 @@ got: |
4310 | |
4311 | if (sbi->s_log_groups_per_flex) { |
4312 | flex_group = ext4_flex_group(sbi, group); |
4313 | - atomic_dec(&sbi->s_flex_groups[flex_group].free_inodes); |
4314 | + atomic_dec(&sbi_array_rcu_deref(sbi, s_flex_groups, |
4315 | + flex_group)->free_inodes); |
4316 | } |
4317 | |
4318 | inode->i_ino = ino + group * EXT4_INODES_PER_GROUP(sb); |
4319 | diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c |
4320 | index 76a38ef5f226..70ef4a714b33 100644 |
4321 | --- a/fs/ext4/inode.c |
4322 | +++ b/fs/ext4/inode.c |
4323 | @@ -2573,7 +2573,7 @@ update_disksize: |
4324 | * truncate are avoided by checking i_size under i_data_sem. |
4325 | */ |
4326 | disksize = ((loff_t)mpd->first_page) << PAGE_SHIFT; |
4327 | - if (disksize > EXT4_I(inode)->i_disksize) { |
4328 | + if (disksize > READ_ONCE(EXT4_I(inode)->i_disksize)) { |
4329 | int err2; |
4330 | loff_t i_size; |
4331 | |
4332 | @@ -2734,7 +2734,7 @@ static int ext4_writepages(struct address_space *mapping, |
4333 | if (unlikely(ext4_forced_shutdown(EXT4_SB(inode->i_sb)))) |
4334 | return -EIO; |
4335 | |
4336 | - percpu_down_read(&sbi->s_journal_flag_rwsem); |
4337 | + percpu_down_read(&sbi->s_writepages_rwsem); |
4338 | trace_ext4_writepages(inode, wbc); |
4339 | |
4340 | /* |
4341 | @@ -2955,7 +2955,7 @@ unplug: |
4342 | out_writepages: |
4343 | trace_ext4_writepages_result(inode, wbc, ret, |
4344 | nr_to_write - wbc->nr_to_write); |
4345 | - percpu_up_read(&sbi->s_journal_flag_rwsem); |
4346 | + percpu_up_read(&sbi->s_writepages_rwsem); |
4347 | return ret; |
4348 | } |
4349 | |
4350 | @@ -2970,13 +2970,13 @@ static int ext4_dax_writepages(struct address_space *mapping, |
4351 | if (unlikely(ext4_forced_shutdown(EXT4_SB(inode->i_sb)))) |
4352 | return -EIO; |
4353 | |
4354 | - percpu_down_read(&sbi->s_journal_flag_rwsem); |
4355 | + percpu_down_read(&sbi->s_writepages_rwsem); |
4356 | trace_ext4_writepages(inode, wbc); |
4357 | |
4358 | ret = dax_writeback_mapping_range(mapping, inode->i_sb->s_bdev, wbc); |
4359 | trace_ext4_writepages_result(inode, wbc, ret, |
4360 | nr_to_write - wbc->nr_to_write); |
4361 | - percpu_up_read(&sbi->s_journal_flag_rwsem); |
4362 | + percpu_up_read(&sbi->s_writepages_rwsem); |
4363 | return ret; |
4364 | } |
4365 | |
4366 | @@ -6185,7 +6185,7 @@ int ext4_change_inode_journal_flag(struct inode *inode, int val) |
4367 | } |
4368 | } |
4369 | |
4370 | - percpu_down_write(&sbi->s_journal_flag_rwsem); |
4371 | + percpu_down_write(&sbi->s_writepages_rwsem); |
4372 | jbd2_journal_lock_updates(journal); |
4373 | |
4374 | /* |
4375 | @@ -6202,7 +6202,7 @@ int ext4_change_inode_journal_flag(struct inode *inode, int val) |
4376 | err = jbd2_journal_flush(journal); |
4377 | if (err < 0) { |
4378 | jbd2_journal_unlock_updates(journal); |
4379 | - percpu_up_write(&sbi->s_journal_flag_rwsem); |
4380 | + percpu_up_write(&sbi->s_writepages_rwsem); |
4381 | return err; |
4382 | } |
4383 | ext4_clear_inode_flag(inode, EXT4_INODE_JOURNAL_DATA); |
4384 | @@ -6210,7 +6210,7 @@ int ext4_change_inode_journal_flag(struct inode *inode, int val) |
4385 | ext4_set_aops(inode); |
4386 | |
4387 | jbd2_journal_unlock_updates(journal); |
4388 | - percpu_up_write(&sbi->s_journal_flag_rwsem); |
4389 | + percpu_up_write(&sbi->s_writepages_rwsem); |
4390 | |
4391 | if (val) |
4392 | up_write(&EXT4_I(inode)->i_mmap_sem); |
4393 | diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c |
4394 | index a3e2767bdf2f..c76ffc259d19 100644 |
4395 | --- a/fs/ext4/mballoc.c |
4396 | +++ b/fs/ext4/mballoc.c |
4397 | @@ -2356,7 +2356,7 @@ int ext4_mb_alloc_groupinfo(struct super_block *sb, ext4_group_t ngroups) |
4398 | { |
4399 | struct ext4_sb_info *sbi = EXT4_SB(sb); |
4400 | unsigned size; |
4401 | - struct ext4_group_info ***new_groupinfo; |
4402 | + struct ext4_group_info ***old_groupinfo, ***new_groupinfo; |
4403 | |
4404 | size = (ngroups + EXT4_DESC_PER_BLOCK(sb) - 1) >> |
4405 | EXT4_DESC_PER_BLOCK_BITS(sb); |
4406 | @@ -2369,13 +2369,16 @@ int ext4_mb_alloc_groupinfo(struct super_block *sb, ext4_group_t ngroups) |
4407 | ext4_msg(sb, KERN_ERR, "can't allocate buddy meta group"); |
4408 | return -ENOMEM; |
4409 | } |
4410 | - if (sbi->s_group_info) { |
4411 | - memcpy(new_groupinfo, sbi->s_group_info, |
4412 | + rcu_read_lock(); |
4413 | + old_groupinfo = rcu_dereference(sbi->s_group_info); |
4414 | + if (old_groupinfo) |
4415 | + memcpy(new_groupinfo, old_groupinfo, |
4416 | sbi->s_group_info_size * sizeof(*sbi->s_group_info)); |
4417 | - kvfree(sbi->s_group_info); |
4418 | - } |
4419 | - sbi->s_group_info = new_groupinfo; |
4420 | + rcu_read_unlock(); |
4421 | + rcu_assign_pointer(sbi->s_group_info, new_groupinfo); |
4422 | sbi->s_group_info_size = size / sizeof(*sbi->s_group_info); |
4423 | + if (old_groupinfo) |
4424 | + ext4_kvfree_array_rcu(old_groupinfo); |
4425 | ext4_debug("allocated s_groupinfo array for %d meta_bg's\n", |
4426 | sbi->s_group_info_size); |
4427 | return 0; |
4428 | @@ -2387,6 +2390,7 @@ int ext4_mb_add_groupinfo(struct super_block *sb, ext4_group_t group, |
4429 | { |
4430 | int i; |
4431 | int metalen = 0; |
4432 | + int idx = group >> EXT4_DESC_PER_BLOCK_BITS(sb); |
4433 | struct ext4_sb_info *sbi = EXT4_SB(sb); |
4434 | struct ext4_group_info **meta_group_info; |
4435 | struct kmem_cache *cachep = get_groupinfo_cache(sb->s_blocksize_bits); |
4436 | @@ -2405,12 +2409,12 @@ int ext4_mb_add_groupinfo(struct super_block *sb, ext4_group_t group, |
4437 | "for a buddy group"); |
4438 | goto exit_meta_group_info; |
4439 | } |
4440 | - sbi->s_group_info[group >> EXT4_DESC_PER_BLOCK_BITS(sb)] = |
4441 | - meta_group_info; |
4442 | + rcu_read_lock(); |
4443 | + rcu_dereference(sbi->s_group_info)[idx] = meta_group_info; |
4444 | + rcu_read_unlock(); |
4445 | } |
4446 | |
4447 | - meta_group_info = |
4448 | - sbi->s_group_info[group >> EXT4_DESC_PER_BLOCK_BITS(sb)]; |
4449 | + meta_group_info = sbi_array_rcu_deref(sbi, s_group_info, idx); |
4450 | i = group & (EXT4_DESC_PER_BLOCK(sb) - 1); |
4451 | |
4452 | meta_group_info[i] = kmem_cache_zalloc(cachep, GFP_NOFS); |
4453 | @@ -2458,8 +2462,13 @@ int ext4_mb_add_groupinfo(struct super_block *sb, ext4_group_t group, |
4454 | exit_group_info: |
4455 | /* If a meta_group_info table has been allocated, release it now */ |
4456 | if (group % EXT4_DESC_PER_BLOCK(sb) == 0) { |
4457 | - kfree(sbi->s_group_info[group >> EXT4_DESC_PER_BLOCK_BITS(sb)]); |
4458 | - sbi->s_group_info[group >> EXT4_DESC_PER_BLOCK_BITS(sb)] = NULL; |
4459 | + struct ext4_group_info ***group_info; |
4460 | + |
4461 | + rcu_read_lock(); |
4462 | + group_info = rcu_dereference(sbi->s_group_info); |
4463 | + kfree(group_info[idx]); |
4464 | + group_info[idx] = NULL; |
4465 | + rcu_read_unlock(); |
4466 | } |
4467 | exit_meta_group_info: |
4468 | return -ENOMEM; |
4469 | @@ -2472,6 +2481,7 @@ static int ext4_mb_init_backend(struct super_block *sb) |
4470 | struct ext4_sb_info *sbi = EXT4_SB(sb); |
4471 | int err; |
4472 | struct ext4_group_desc *desc; |
4473 | + struct ext4_group_info ***group_info; |
4474 | struct kmem_cache *cachep; |
4475 | |
4476 | err = ext4_mb_alloc_groupinfo(sb, ngroups); |
4477 | @@ -2507,11 +2517,16 @@ err_freebuddy: |
4478 | while (i-- > 0) |
4479 | kmem_cache_free(cachep, ext4_get_group_info(sb, i)); |
4480 | i = sbi->s_group_info_size; |
4481 | + rcu_read_lock(); |
4482 | + group_info = rcu_dereference(sbi->s_group_info); |
4483 | while (i-- > 0) |
4484 | - kfree(sbi->s_group_info[i]); |
4485 | + kfree(group_info[i]); |
4486 | + rcu_read_unlock(); |
4487 | iput(sbi->s_buddy_cache); |
4488 | err_freesgi: |
4489 | - kvfree(sbi->s_group_info); |
4490 | + rcu_read_lock(); |
4491 | + kvfree(rcu_dereference(sbi->s_group_info)); |
4492 | + rcu_read_unlock(); |
4493 | return -ENOMEM; |
4494 | } |
4495 | |
4496 | @@ -2700,7 +2715,7 @@ int ext4_mb_release(struct super_block *sb) |
4497 | ext4_group_t ngroups = ext4_get_groups_count(sb); |
4498 | ext4_group_t i; |
4499 | int num_meta_group_infos; |
4500 | - struct ext4_group_info *grinfo; |
4501 | + struct ext4_group_info *grinfo, ***group_info; |
4502 | struct ext4_sb_info *sbi = EXT4_SB(sb); |
4503 | struct kmem_cache *cachep = get_groupinfo_cache(sb->s_blocksize_bits); |
4504 | |
4505 | @@ -2719,9 +2734,12 @@ int ext4_mb_release(struct super_block *sb) |
4506 | num_meta_group_infos = (ngroups + |
4507 | EXT4_DESC_PER_BLOCK(sb) - 1) >> |
4508 | EXT4_DESC_PER_BLOCK_BITS(sb); |
4509 | + rcu_read_lock(); |
4510 | + group_info = rcu_dereference(sbi->s_group_info); |
4511 | for (i = 0; i < num_meta_group_infos; i++) |
4512 | - kfree(sbi->s_group_info[i]); |
4513 | - kvfree(sbi->s_group_info); |
4514 | + kfree(group_info[i]); |
4515 | + kvfree(group_info); |
4516 | + rcu_read_unlock(); |
4517 | } |
4518 | kfree(sbi->s_mb_offsets); |
4519 | kfree(sbi->s_mb_maxs); |
4520 | @@ -3020,7 +3038,8 @@ ext4_mb_mark_diskspace_used(struct ext4_allocation_context *ac, |
4521 | ext4_group_t flex_group = ext4_flex_group(sbi, |
4522 | ac->ac_b_ex.fe_group); |
4523 | atomic64_sub(ac->ac_b_ex.fe_len, |
4524 | - &sbi->s_flex_groups[flex_group].free_clusters); |
4525 | + &sbi_array_rcu_deref(sbi, s_flex_groups, |
4526 | + flex_group)->free_clusters); |
4527 | } |
4528 | |
4529 | err = ext4_handle_dirty_metadata(handle, NULL, bitmap_bh); |
4530 | @@ -4914,7 +4933,8 @@ do_more: |
4531 | if (sbi->s_log_groups_per_flex) { |
4532 | ext4_group_t flex_group = ext4_flex_group(sbi, block_group); |
4533 | atomic64_add(count_clusters, |
4534 | - &sbi->s_flex_groups[flex_group].free_clusters); |
4535 | + &sbi_array_rcu_deref(sbi, s_flex_groups, |
4536 | + flex_group)->free_clusters); |
4537 | } |
4538 | |
4539 | /* |
4540 | @@ -5071,7 +5091,8 @@ int ext4_group_add_blocks(handle_t *handle, struct super_block *sb, |
4541 | if (sbi->s_log_groups_per_flex) { |
4542 | ext4_group_t flex_group = ext4_flex_group(sbi, block_group); |
4543 | atomic64_add(clusters_freed, |
4544 | - &sbi->s_flex_groups[flex_group].free_clusters); |
4545 | + &sbi_array_rcu_deref(sbi, s_flex_groups, |
4546 | + flex_group)->free_clusters); |
4547 | } |
4548 | |
4549 | ext4_mb_unload_buddy(&e4b); |
4550 | diff --git a/fs/ext4/migrate.c b/fs/ext4/migrate.c |
4551 | index b1e4d359f73b..be4ee3dcc5cf 100644 |
4552 | --- a/fs/ext4/migrate.c |
4553 | +++ b/fs/ext4/migrate.c |
4554 | @@ -427,6 +427,7 @@ static int free_ext_block(handle_t *handle, struct inode *inode) |
4555 | |
4556 | int ext4_ext_migrate(struct inode *inode) |
4557 | { |
4558 | + struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); |
4559 | handle_t *handle; |
4560 | int retval = 0, i; |
4561 | __le32 *i_data; |
4562 | @@ -451,6 +452,8 @@ int ext4_ext_migrate(struct inode *inode) |
4563 | */ |
4564 | return retval; |
4565 | |
4566 | + percpu_down_write(&sbi->s_writepages_rwsem); |
4567 | + |
4568 | /* |
4569 | * Worst case we can touch the allocation bitmaps, a bgd |
4570 | * block, and a block to link in the orphan list. We do need |
4571 | @@ -461,7 +464,7 @@ int ext4_ext_migrate(struct inode *inode) |
4572 | |
4573 | if (IS_ERR(handle)) { |
4574 | retval = PTR_ERR(handle); |
4575 | - return retval; |
4576 | + goto out_unlock; |
4577 | } |
4578 | goal = (((inode->i_ino - 1) / EXT4_INODES_PER_GROUP(inode->i_sb)) * |
4579 | EXT4_INODES_PER_GROUP(inode->i_sb)) + 1; |
4580 | @@ -472,7 +475,7 @@ int ext4_ext_migrate(struct inode *inode) |
4581 | if (IS_ERR(tmp_inode)) { |
4582 | retval = PTR_ERR(tmp_inode); |
4583 | ext4_journal_stop(handle); |
4584 | - return retval; |
4585 | + goto out_unlock; |
4586 | } |
4587 | i_size_write(tmp_inode, i_size_read(inode)); |
4588 | /* |
4589 | @@ -514,7 +517,7 @@ int ext4_ext_migrate(struct inode *inode) |
4590 | */ |
4591 | ext4_orphan_del(NULL, tmp_inode); |
4592 | retval = PTR_ERR(handle); |
4593 | - goto out; |
4594 | + goto out_tmp_inode; |
4595 | } |
4596 | |
4597 | ei = EXT4_I(inode); |
4598 | @@ -595,10 +598,11 @@ err_out: |
4599 | /* Reset the extent details */ |
4600 | ext4_ext_tree_init(handle, tmp_inode); |
4601 | ext4_journal_stop(handle); |
4602 | -out: |
4603 | +out_tmp_inode: |
4604 | unlock_new_inode(tmp_inode); |
4605 | iput(tmp_inode); |
4606 | - |
4607 | +out_unlock: |
4608 | + percpu_up_write(&sbi->s_writepages_rwsem); |
4609 | return retval; |
4610 | } |
4611 | |
4612 | @@ -608,7 +612,8 @@ out: |
4613 | int ext4_ind_migrate(struct inode *inode) |
4614 | { |
4615 | struct ext4_extent_header *eh; |
4616 | - struct ext4_super_block *es = EXT4_SB(inode->i_sb)->s_es; |
4617 | + struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); |
4618 | + struct ext4_super_block *es = sbi->s_es; |
4619 | struct ext4_inode_info *ei = EXT4_I(inode); |
4620 | struct ext4_extent *ex; |
4621 | unsigned int i, len; |
4622 | @@ -632,9 +637,13 @@ int ext4_ind_migrate(struct inode *inode) |
4623 | if (test_opt(inode->i_sb, DELALLOC)) |
4624 | ext4_alloc_da_blocks(inode); |
4625 | |
4626 | + percpu_down_write(&sbi->s_writepages_rwsem); |
4627 | + |
4628 | handle = ext4_journal_start(inode, EXT4_HT_MIGRATE, 1); |
4629 | - if (IS_ERR(handle)) |
4630 | - return PTR_ERR(handle); |
4631 | + if (IS_ERR(handle)) { |
4632 | + ret = PTR_ERR(handle); |
4633 | + goto out_unlock; |
4634 | + } |
4635 | |
4636 | down_write(&EXT4_I(inode)->i_data_sem); |
4637 | ret = ext4_ext_check_inode(inode); |
4638 | @@ -669,5 +678,7 @@ int ext4_ind_migrate(struct inode *inode) |
4639 | errout: |
4640 | ext4_journal_stop(handle); |
4641 | up_write(&EXT4_I(inode)->i_data_sem); |
4642 | +out_unlock: |
4643 | + percpu_up_write(&sbi->s_writepages_rwsem); |
4644 | return ret; |
4645 | } |
4646 | diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c |
4647 | index 94d84910dc1e..a564d0289a70 100644 |
4648 | --- a/fs/ext4/namei.c |
4649 | +++ b/fs/ext4/namei.c |
4650 | @@ -1507,6 +1507,7 @@ restart: |
4651 | /* |
4652 | * We deal with the read-ahead logic here. |
4653 | */ |
4654 | + cond_resched(); |
4655 | if (ra_ptr >= ra_max) { |
4656 | /* Refill the readahead buffer */ |
4657 | ra_ptr = 0; |
4658 | diff --git a/fs/ext4/resize.c b/fs/ext4/resize.c |
4659 | index c0e9aef376a7..080e25f6ef56 100644 |
4660 | --- a/fs/ext4/resize.c |
4661 | +++ b/fs/ext4/resize.c |
4662 | @@ -17,6 +17,33 @@ |
4663 | |
4664 | #include "ext4_jbd2.h" |
4665 | |
4666 | +struct ext4_rcu_ptr { |
4667 | + struct rcu_head rcu; |
4668 | + void *ptr; |
4669 | +}; |
4670 | + |
4671 | +static void ext4_rcu_ptr_callback(struct rcu_head *head) |
4672 | +{ |
4673 | + struct ext4_rcu_ptr *ptr; |
4674 | + |
4675 | + ptr = container_of(head, struct ext4_rcu_ptr, rcu); |
4676 | + kvfree(ptr->ptr); |
4677 | + kfree(ptr); |
4678 | +} |
4679 | + |
4680 | +void ext4_kvfree_array_rcu(void *to_free) |
4681 | +{ |
4682 | + struct ext4_rcu_ptr *ptr = kzalloc(sizeof(*ptr), GFP_KERNEL); |
4683 | + |
4684 | + if (ptr) { |
4685 | + ptr->ptr = to_free; |
4686 | + call_rcu(&ptr->rcu, ext4_rcu_ptr_callback); |
4687 | + return; |
4688 | + } |
4689 | + synchronize_rcu(); |
4690 | + kvfree(to_free); |
4691 | +} |
4692 | + |
4693 | int ext4_resize_begin(struct super_block *sb) |
4694 | { |
4695 | struct ext4_sb_info *sbi = EXT4_SB(sb); |
4696 | @@ -560,8 +587,8 @@ static int setup_new_flex_group_blocks(struct super_block *sb, |
4697 | brelse(gdb); |
4698 | goto out; |
4699 | } |
4700 | - memcpy(gdb->b_data, sbi->s_group_desc[j]->b_data, |
4701 | - gdb->b_size); |
4702 | + memcpy(gdb->b_data, sbi_array_rcu_deref(sbi, |
4703 | + s_group_desc, j)->b_data, gdb->b_size); |
4704 | set_buffer_uptodate(gdb); |
4705 | |
4706 | err = ext4_handle_dirty_metadata(handle, NULL, gdb); |
4707 | @@ -879,13 +906,15 @@ static int add_new_gdb(handle_t *handle, struct inode *inode, |
4708 | } |
4709 | brelse(dind); |
4710 | |
4711 | - o_group_desc = EXT4_SB(sb)->s_group_desc; |
4712 | + rcu_read_lock(); |
4713 | + o_group_desc = rcu_dereference(EXT4_SB(sb)->s_group_desc); |
4714 | memcpy(n_group_desc, o_group_desc, |
4715 | EXT4_SB(sb)->s_gdb_count * sizeof(struct buffer_head *)); |
4716 | + rcu_read_unlock(); |
4717 | n_group_desc[gdb_num] = gdb_bh; |
4718 | - EXT4_SB(sb)->s_group_desc = n_group_desc; |
4719 | + rcu_assign_pointer(EXT4_SB(sb)->s_group_desc, n_group_desc); |
4720 | EXT4_SB(sb)->s_gdb_count++; |
4721 | - kvfree(o_group_desc); |
4722 | + ext4_kvfree_array_rcu(o_group_desc); |
4723 | |
4724 | le16_add_cpu(&es->s_reserved_gdt_blocks, -1); |
4725 | err = ext4_handle_dirty_super(handle, sb); |
4726 | @@ -929,9 +958,11 @@ static int add_new_gdb_meta_bg(struct super_block *sb, |
4727 | return err; |
4728 | } |
4729 | |
4730 | - o_group_desc = EXT4_SB(sb)->s_group_desc; |
4731 | + rcu_read_lock(); |
4732 | + o_group_desc = rcu_dereference(EXT4_SB(sb)->s_group_desc); |
4733 | memcpy(n_group_desc, o_group_desc, |
4734 | EXT4_SB(sb)->s_gdb_count * sizeof(struct buffer_head *)); |
4735 | + rcu_read_unlock(); |
4736 | n_group_desc[gdb_num] = gdb_bh; |
4737 | |
4738 | BUFFER_TRACE(gdb_bh, "get_write_access"); |
4739 | @@ -942,9 +973,9 @@ static int add_new_gdb_meta_bg(struct super_block *sb, |
4740 | return err; |
4741 | } |
4742 | |
4743 | - EXT4_SB(sb)->s_group_desc = n_group_desc; |
4744 | + rcu_assign_pointer(EXT4_SB(sb)->s_group_desc, n_group_desc); |
4745 | EXT4_SB(sb)->s_gdb_count++; |
4746 | - kvfree(o_group_desc); |
4747 | + ext4_kvfree_array_rcu(o_group_desc); |
4748 | return err; |
4749 | } |
4750 | |
4751 | @@ -1210,7 +1241,8 @@ static int ext4_add_new_descs(handle_t *handle, struct super_block *sb, |
4752 | * use non-sparse filesystems anymore. This is already checked above. |
4753 | */ |
4754 | if (gdb_off) { |
4755 | - gdb_bh = sbi->s_group_desc[gdb_num]; |
4756 | + gdb_bh = sbi_array_rcu_deref(sbi, s_group_desc, |
4757 | + gdb_num); |
4758 | BUFFER_TRACE(gdb_bh, "get_write_access"); |
4759 | err = ext4_journal_get_write_access(handle, gdb_bh); |
4760 | |
4761 | @@ -1292,7 +1324,7 @@ static int ext4_setup_new_descs(handle_t *handle, struct super_block *sb, |
4762 | /* |
4763 | * get_write_access() has been called on gdb_bh by ext4_add_new_desc(). |
4764 | */ |
4765 | - gdb_bh = sbi->s_group_desc[gdb_num]; |
4766 | + gdb_bh = sbi_array_rcu_deref(sbi, s_group_desc, gdb_num); |
4767 | /* Update group descriptor block for new group */ |
4768 | gdp = (struct ext4_group_desc *)(gdb_bh->b_data + |
4769 | gdb_off * EXT4_DESC_SIZE(sb)); |
4770 | @@ -1420,11 +1452,14 @@ static void ext4_update_super(struct super_block *sb, |
4771 | percpu_counter_read(&sbi->s_freeclusters_counter)); |
4772 | if (ext4_has_feature_flex_bg(sb) && sbi->s_log_groups_per_flex) { |
4773 | ext4_group_t flex_group; |
4774 | + struct flex_groups *fg; |
4775 | + |
4776 | flex_group = ext4_flex_group(sbi, group_data[0].group); |
4777 | + fg = sbi_array_rcu_deref(sbi, s_flex_groups, flex_group); |
4778 | atomic64_add(EXT4_NUM_B2C(sbi, free_blocks), |
4779 | - &sbi->s_flex_groups[flex_group].free_clusters); |
4780 | + &fg->free_clusters); |
4781 | atomic_add(EXT4_INODES_PER_GROUP(sb) * flex_gd->count, |
4782 | - &sbi->s_flex_groups[flex_group].free_inodes); |
4783 | + &fg->free_inodes); |
4784 | } |
4785 | |
4786 | /* |
4787 | @@ -1519,7 +1554,8 @@ exit_journal: |
4788 | for (; gdb_num <= gdb_num_end; gdb_num++) { |
4789 | struct buffer_head *gdb_bh; |
4790 | |
4791 | - gdb_bh = sbi->s_group_desc[gdb_num]; |
4792 | + gdb_bh = sbi_array_rcu_deref(sbi, s_group_desc, |
4793 | + gdb_num); |
4794 | if (old_gdb == gdb_bh->b_blocknr) |
4795 | continue; |
4796 | update_backups(sb, gdb_bh->b_blocknr, gdb_bh->b_data, |
4797 | diff --git a/fs/ext4/super.c b/fs/ext4/super.c |
4798 | index 914230e63054..3ca604807839 100644 |
4799 | --- a/fs/ext4/super.c |
4800 | +++ b/fs/ext4/super.c |
4801 | @@ -970,6 +970,8 @@ static void ext4_put_super(struct super_block *sb) |
4802 | { |
4803 | struct ext4_sb_info *sbi = EXT4_SB(sb); |
4804 | struct ext4_super_block *es = sbi->s_es; |
4805 | + struct buffer_head **group_desc; |
4806 | + struct flex_groups **flex_groups; |
4807 | int aborted = 0; |
4808 | int i, err; |
4809 | |
4810 | @@ -1000,15 +1002,23 @@ static void ext4_put_super(struct super_block *sb) |
4811 | if (!sb_rdonly(sb)) |
4812 | ext4_commit_super(sb, 1); |
4813 | |
4814 | + rcu_read_lock(); |
4815 | + group_desc = rcu_dereference(sbi->s_group_desc); |
4816 | for (i = 0; i < sbi->s_gdb_count; i++) |
4817 | - brelse(sbi->s_group_desc[i]); |
4818 | - kvfree(sbi->s_group_desc); |
4819 | - kvfree(sbi->s_flex_groups); |
4820 | + brelse(group_desc[i]); |
4821 | + kvfree(group_desc); |
4822 | + flex_groups = rcu_dereference(sbi->s_flex_groups); |
4823 | + if (flex_groups) { |
4824 | + for (i = 0; i < sbi->s_flex_groups_allocated; i++) |
4825 | + kvfree(flex_groups[i]); |
4826 | + kvfree(flex_groups); |
4827 | + } |
4828 | + rcu_read_unlock(); |
4829 | percpu_counter_destroy(&sbi->s_freeclusters_counter); |
4830 | percpu_counter_destroy(&sbi->s_freeinodes_counter); |
4831 | percpu_counter_destroy(&sbi->s_dirs_counter); |
4832 | percpu_counter_destroy(&sbi->s_dirtyclusters_counter); |
4833 | - percpu_free_rwsem(&sbi->s_journal_flag_rwsem); |
4834 | + percpu_free_rwsem(&sbi->s_writepages_rwsem); |
4835 | #ifdef CONFIG_QUOTA |
4836 | for (i = 0; i < EXT4_MAXQUOTAS; i++) |
4837 | kfree(get_qf_name(sb, sbi, i)); |
4838 | @@ -2332,8 +2342,8 @@ done: |
4839 | int ext4_alloc_flex_bg_array(struct super_block *sb, ext4_group_t ngroup) |
4840 | { |
4841 | struct ext4_sb_info *sbi = EXT4_SB(sb); |
4842 | - struct flex_groups *new_groups; |
4843 | - int size; |
4844 | + struct flex_groups **old_groups, **new_groups; |
4845 | + int size, i; |
4846 | |
4847 | if (!sbi->s_log_groups_per_flex) |
4848 | return 0; |
4849 | @@ -2342,22 +2352,37 @@ int ext4_alloc_flex_bg_array(struct super_block *sb, ext4_group_t ngroup) |
4850 | if (size <= sbi->s_flex_groups_allocated) |
4851 | return 0; |
4852 | |
4853 | - size = roundup_pow_of_two(size * sizeof(struct flex_groups)); |
4854 | - new_groups = kvzalloc(size, GFP_KERNEL); |
4855 | + new_groups = kvzalloc(roundup_pow_of_two(size * |
4856 | + sizeof(*sbi->s_flex_groups)), GFP_KERNEL); |
4857 | if (!new_groups) { |
4858 | - ext4_msg(sb, KERN_ERR, "not enough memory for %d flex groups", |
4859 | - size / (int) sizeof(struct flex_groups)); |
4860 | + ext4_msg(sb, KERN_ERR, |
4861 | + "not enough memory for %d flex group pointers", size); |
4862 | return -ENOMEM; |
4863 | } |
4864 | - |
4865 | - if (sbi->s_flex_groups) { |
4866 | - memcpy(new_groups, sbi->s_flex_groups, |
4867 | - (sbi->s_flex_groups_allocated * |
4868 | - sizeof(struct flex_groups))); |
4869 | - kvfree(sbi->s_flex_groups); |
4870 | + for (i = sbi->s_flex_groups_allocated; i < size; i++) { |
4871 | + new_groups[i] = kvzalloc(roundup_pow_of_two( |
4872 | + sizeof(struct flex_groups)), |
4873 | + GFP_KERNEL); |
4874 | + if (!new_groups[i]) { |
4875 | + for (i--; i >= sbi->s_flex_groups_allocated; i--) |
4876 | + kvfree(new_groups[i]); |
4877 | + kvfree(new_groups); |
4878 | + ext4_msg(sb, KERN_ERR, |
4879 | + "not enough memory for %d flex groups", size); |
4880 | + return -ENOMEM; |
4881 | + } |
4882 | } |
4883 | - sbi->s_flex_groups = new_groups; |
4884 | - sbi->s_flex_groups_allocated = size / sizeof(struct flex_groups); |
4885 | + rcu_read_lock(); |
4886 | + old_groups = rcu_dereference(sbi->s_flex_groups); |
4887 | + if (old_groups) |
4888 | + memcpy(new_groups, old_groups, |
4889 | + (sbi->s_flex_groups_allocated * |
4890 | + sizeof(struct flex_groups *))); |
4891 | + rcu_read_unlock(); |
4892 | + rcu_assign_pointer(sbi->s_flex_groups, new_groups); |
4893 | + sbi->s_flex_groups_allocated = size; |
4894 | + if (old_groups) |
4895 | + ext4_kvfree_array_rcu(old_groups); |
4896 | return 0; |
4897 | } |
4898 | |
4899 | @@ -2365,6 +2390,7 @@ static int ext4_fill_flex_info(struct super_block *sb) |
4900 | { |
4901 | struct ext4_sb_info *sbi = EXT4_SB(sb); |
4902 | struct ext4_group_desc *gdp = NULL; |
4903 | + struct flex_groups *fg; |
4904 | ext4_group_t flex_group; |
4905 | int i, err; |
4906 | |
4907 | @@ -2382,12 +2408,11 @@ static int ext4_fill_flex_info(struct super_block *sb) |
4908 | gdp = ext4_get_group_desc(sb, i, NULL); |
4909 | |
4910 | flex_group = ext4_flex_group(sbi, i); |
4911 | - atomic_add(ext4_free_inodes_count(sb, gdp), |
4912 | - &sbi->s_flex_groups[flex_group].free_inodes); |
4913 | + fg = sbi_array_rcu_deref(sbi, s_flex_groups, flex_group); |
4914 | + atomic_add(ext4_free_inodes_count(sb, gdp), &fg->free_inodes); |
4915 | atomic64_add(ext4_free_group_clusters(sb, gdp), |
4916 | - &sbi->s_flex_groups[flex_group].free_clusters); |
4917 | - atomic_add(ext4_used_dirs_count(sb, gdp), |
4918 | - &sbi->s_flex_groups[flex_group].used_dirs); |
4919 | + &fg->free_clusters); |
4920 | + atomic_add(ext4_used_dirs_count(sb, gdp), &fg->used_dirs); |
4921 | } |
4922 | |
4923 | return 1; |
4924 | @@ -2961,7 +2986,7 @@ static int ext4_feature_set_ok(struct super_block *sb, int readonly) |
4925 | return 0; |
4926 | } |
4927 | |
4928 | -#if !defined(CONFIG_QUOTA) || !defined(CONFIG_QFMT_V2) |
4929 | +#if !IS_ENABLED(CONFIG_QUOTA) || !IS_ENABLED(CONFIG_QFMT_V2) |
4930 | if (!readonly && (ext4_has_feature_quota(sb) || |
4931 | ext4_has_feature_project(sb))) { |
4932 | ext4_msg(sb, KERN_ERR, |
4933 | @@ -3586,9 +3611,10 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) |
4934 | { |
4935 | struct dax_device *dax_dev = fs_dax_get_by_bdev(sb->s_bdev); |
4936 | char *orig_data = kstrdup(data, GFP_KERNEL); |
4937 | - struct buffer_head *bh; |
4938 | + struct buffer_head *bh, **group_desc; |
4939 | struct ext4_super_block *es = NULL; |
4940 | struct ext4_sb_info *sbi = kzalloc(sizeof(*sbi), GFP_KERNEL); |
4941 | + struct flex_groups **flex_groups; |
4942 | ext4_fsblk_t block; |
4943 | ext4_fsblk_t sb_block = get_sb_block(&data); |
4944 | ext4_fsblk_t logical_sb_block; |
4945 | @@ -4242,9 +4268,10 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) |
4946 | goto failed_mount; |
4947 | } |
4948 | } |
4949 | - sbi->s_group_desc = kvmalloc_array(db_count, |
4950 | - sizeof(struct buffer_head *), |
4951 | - GFP_KERNEL); |
4952 | + rcu_assign_pointer(sbi->s_group_desc, |
4953 | + kvmalloc_array(db_count, |
4954 | + sizeof(struct buffer_head *), |
4955 | + GFP_KERNEL)); |
4956 | if (sbi->s_group_desc == NULL) { |
4957 | ext4_msg(sb, KERN_ERR, "not enough memory"); |
4958 | ret = -ENOMEM; |
4959 | @@ -4260,14 +4287,19 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) |
4960 | } |
4961 | |
4962 | for (i = 0; i < db_count; i++) { |
4963 | + struct buffer_head *bh; |
4964 | + |
4965 | block = descriptor_loc(sb, logical_sb_block, i); |
4966 | - sbi->s_group_desc[i] = sb_bread_unmovable(sb, block); |
4967 | - if (!sbi->s_group_desc[i]) { |
4968 | + bh = sb_bread_unmovable(sb, block); |
4969 | + if (!bh) { |
4970 | ext4_msg(sb, KERN_ERR, |
4971 | "can't read group descriptor %d", i); |
4972 | db_count = i; |
4973 | goto failed_mount2; |
4974 | } |
4975 | + rcu_read_lock(); |
4976 | + rcu_dereference(sbi->s_group_desc)[i] = bh; |
4977 | + rcu_read_unlock(); |
4978 | } |
4979 | sbi->s_gdb_count = db_count; |
4980 | if (!ext4_check_descriptors(sb, logical_sb_block, &first_not_zeroed)) { |
4981 | @@ -4553,7 +4585,7 @@ no_journal: |
4982 | err = percpu_counter_init(&sbi->s_dirtyclusters_counter, 0, |
4983 | GFP_KERNEL); |
4984 | if (!err) |
4985 | - err = percpu_init_rwsem(&sbi->s_journal_flag_rwsem); |
4986 | + err = percpu_init_rwsem(&sbi->s_writepages_rwsem); |
4987 | |
4988 | if (err) { |
4989 | ext4_msg(sb, KERN_ERR, "insufficient memory"); |
4990 | @@ -4641,13 +4673,19 @@ failed_mount7: |
4991 | ext4_unregister_li_request(sb); |
4992 | failed_mount6: |
4993 | ext4_mb_release(sb); |
4994 | - if (sbi->s_flex_groups) |
4995 | - kvfree(sbi->s_flex_groups); |
4996 | + rcu_read_lock(); |
4997 | + flex_groups = rcu_dereference(sbi->s_flex_groups); |
4998 | + if (flex_groups) { |
4999 | + for (i = 0; i < sbi->s_flex_groups_allocated; i++) |
5000 | + kvfree(flex_groups[i]); |
5001 | + kvfree(flex_groups); |
5002 | + } |
5003 | + rcu_read_unlock(); |
5004 | percpu_counter_destroy(&sbi->s_freeclusters_counter); |
5005 | percpu_counter_destroy(&sbi->s_freeinodes_counter); |
5006 | percpu_counter_destroy(&sbi->s_dirs_counter); |
5007 | percpu_counter_destroy(&sbi->s_dirtyclusters_counter); |
5008 | - percpu_free_rwsem(&sbi->s_journal_flag_rwsem); |
5009 | + percpu_free_rwsem(&sbi->s_writepages_rwsem); |
5010 | failed_mount5: |
5011 | ext4_ext_release(sb); |
5012 | ext4_release_system_zone(sb); |
5013 | @@ -4676,9 +4714,12 @@ failed_mount3: |
5014 | if (sbi->s_mmp_tsk) |
5015 | kthread_stop(sbi->s_mmp_tsk); |
5016 | failed_mount2: |
5017 | + rcu_read_lock(); |
5018 | + group_desc = rcu_dereference(sbi->s_group_desc); |
5019 | for (i = 0; i < db_count; i++) |
5020 | - brelse(sbi->s_group_desc[i]); |
5021 | - kvfree(sbi->s_group_desc); |
5022 | + brelse(group_desc[i]); |
5023 | + kvfree(group_desc); |
5024 | + rcu_read_unlock(); |
5025 | failed_mount: |
5026 | if (sbi->s_chksum_driver) |
5027 | crypto_free_shash(sbi->s_chksum_driver); |
5028 | diff --git a/fs/io_uring.c b/fs/io_uring.c |
5029 | index 709671faaed6..ed9a551882cf 100644 |
5030 | --- a/fs/io_uring.c |
5031 | +++ b/fs/io_uring.c |
5032 | @@ -882,11 +882,17 @@ static void io_iopoll_reap_events(struct io_ring_ctx *ctx) |
5033 | mutex_unlock(&ctx->uring_lock); |
5034 | } |
5035 | |
5036 | -static int __io_iopoll_check(struct io_ring_ctx *ctx, unsigned *nr_events, |
5037 | - long min) |
5038 | +static int io_iopoll_check(struct io_ring_ctx *ctx, unsigned *nr_events, |
5039 | + long min) |
5040 | { |
5041 | int iters = 0, ret = 0; |
5042 | |
5043 | + /* |
5044 | + * We disallow the app entering submit/complete with polling, but we |
5045 | + * still need to lock the ring to prevent racing with polled issue |
5046 | + * that got punted to a workqueue. |
5047 | + */ |
5048 | + mutex_lock(&ctx->uring_lock); |
5049 | do { |
5050 | int tmin = 0; |
5051 | |
5052 | @@ -922,21 +928,6 @@ static int __io_iopoll_check(struct io_ring_ctx *ctx, unsigned *nr_events, |
5053 | ret = 0; |
5054 | } while (min && !*nr_events && !need_resched()); |
5055 | |
5056 | - return ret; |
5057 | -} |
5058 | - |
5059 | -static int io_iopoll_check(struct io_ring_ctx *ctx, unsigned *nr_events, |
5060 | - long min) |
5061 | -{ |
5062 | - int ret; |
5063 | - |
5064 | - /* |
5065 | - * We disallow the app entering submit/complete with polling, but we |
5066 | - * still need to lock the ring to prevent racing with polled issue |
5067 | - * that got punted to a workqueue. |
5068 | - */ |
5069 | - mutex_lock(&ctx->uring_lock); |
5070 | - ret = __io_iopoll_check(ctx, nr_events, min); |
5071 | mutex_unlock(&ctx->uring_lock); |
5072 | return ret; |
5073 | } |
5074 | @@ -2721,7 +2712,7 @@ static int io_sq_thread(void *data) |
5075 | */ |
5076 | mutex_lock(&ctx->uring_lock); |
5077 | if (!list_empty(&ctx->poll_list)) |
5078 | - __io_iopoll_check(ctx, &nr_events, 0); |
5079 | + io_iopoll_getevents(ctx, &nr_events, 0); |
5080 | else |
5081 | inflight = 0; |
5082 | mutex_unlock(&ctx->uring_lock); |
5083 | @@ -2740,16 +2731,6 @@ static int io_sq_thread(void *data) |
5084 | |
5085 | to_submit = io_sqring_entries(ctx); |
5086 | if (!to_submit) { |
5087 | - /* |
5088 | - * We're polling. If we're within the defined idle |
5089 | - * period, then let us spin without work before going |
5090 | - * to sleep. |
5091 | - */ |
5092 | - if (inflight || !time_after(jiffies, timeout)) { |
5093 | - cond_resched(); |
5094 | - continue; |
5095 | - } |
5096 | - |
5097 | /* |
5098 | * Drop cur_mm before scheduling, we can't hold it for |
5099 | * long periods (or over schedule()). Do this before |
5100 | @@ -2762,6 +2743,16 @@ static int io_sq_thread(void *data) |
5101 | cur_mm = NULL; |
5102 | } |
5103 | |
5104 | + /* |
5105 | + * We're polling. If we're within the defined idle |
5106 | + * period, then let us spin without work before going |
5107 | + * to sleep. |
5108 | + */ |
5109 | + if (inflight || !time_after(jiffies, timeout)) { |
5110 | + cond_resched(); |
5111 | + continue; |
5112 | + } |
5113 | + |
5114 | prepare_to_wait(&ctx->sqo_wait, &wait, |
5115 | TASK_INTERRUPTIBLE); |
5116 | |
5117 | diff --git a/fs/jbd2/transaction.c b/fs/jbd2/transaction.c |
5118 | index 3930c68a9c20..b17f05ae6011 100644 |
5119 | --- a/fs/jbd2/transaction.c |
5120 | +++ b/fs/jbd2/transaction.c |
5121 | @@ -865,8 +865,6 @@ do_get_write_access(handle_t *handle, struct journal_head *jh, |
5122 | char *frozen_buffer = NULL; |
5123 | unsigned long start_lock, time_lock; |
5124 | |
5125 | - if (is_handle_aborted(handle)) |
5126 | - return -EROFS; |
5127 | journal = transaction->t_journal; |
5128 | |
5129 | jbd_debug(5, "journal_head %p, force_copy %d\n", jh, force_copy); |
5130 | @@ -1118,6 +1116,9 @@ int jbd2_journal_get_write_access(handle_t *handle, struct buffer_head *bh) |
5131 | struct journal_head *jh; |
5132 | int rc; |
5133 | |
5134 | + if (is_handle_aborted(handle)) |
5135 | + return -EROFS; |
5136 | + |
5137 | if (jbd2_write_access_granted(handle, bh, false)) |
5138 | return 0; |
5139 | |
5140 | @@ -1255,6 +1256,9 @@ int jbd2_journal_get_undo_access(handle_t *handle, struct buffer_head *bh) |
5141 | struct journal_head *jh; |
5142 | char *committed_data = NULL; |
5143 | |
5144 | + if (is_handle_aborted(handle)) |
5145 | + return -EROFS; |
5146 | + |
5147 | if (jbd2_write_access_granted(handle, bh, true)) |
5148 | return 0; |
5149 | |
5150 | diff --git a/include/acpi/acpixf.h b/include/acpi/acpixf.h |
5151 | index d1fdf26ccb33..4010c42e40bd 100644 |
5152 | --- a/include/acpi/acpixf.h |
5153 | +++ b/include/acpi/acpixf.h |
5154 | @@ -749,6 +749,7 @@ ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status acpi_disable_all_gpes(void)) |
5155 | ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status acpi_enable_all_runtime_gpes(void)) |
5156 | ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status acpi_enable_all_wakeup_gpes(void)) |
5157 | ACPI_HW_DEPENDENT_RETURN_UINT32(u32 acpi_any_gpe_status_set(void)) |
5158 | +ACPI_HW_DEPENDENT_RETURN_UINT32(u32 acpi_any_fixed_event_status_set(void)) |
5159 | |
5160 | ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status |
5161 | acpi_get_gpe_device(u32 gpe_index, |
5162 | diff --git a/include/linux/intel-svm.h b/include/linux/intel-svm.h |
5163 | index 94f047a8a845..d7c403d0dd27 100644 |
5164 | --- a/include/linux/intel-svm.h |
5165 | +++ b/include/linux/intel-svm.h |
5166 | @@ -122,7 +122,7 @@ static inline int intel_svm_unbind_mm(struct device *dev, int pasid) |
5167 | BUG(); |
5168 | } |
5169 | |
5170 | -static int intel_svm_is_pasid_valid(struct device *dev, int pasid) |
5171 | +static inline int intel_svm_is_pasid_valid(struct device *dev, int pasid) |
5172 | { |
5173 | return -EINVAL; |
5174 | } |
5175 | diff --git a/include/linux/irqdomain.h b/include/linux/irqdomain.h |
5176 | index aba5ada373d6..e85f714a623e 100644 |
5177 | --- a/include/linux/irqdomain.h |
5178 | +++ b/include/linux/irqdomain.h |
5179 | @@ -191,7 +191,7 @@ enum { |
5180 | IRQ_DOMAIN_FLAG_HIERARCHY = (1 << 0), |
5181 | |
5182 | /* Irq domain name was allocated in __irq_domain_add() */ |
5183 | - IRQ_DOMAIN_NAME_ALLOCATED = (1 << 6), |
5184 | + IRQ_DOMAIN_NAME_ALLOCATED = (1 << 1), |
5185 | |
5186 | /* Irq domain is an IPI domain with virq per cpu */ |
5187 | IRQ_DOMAIN_FLAG_IPI_PER_CPU = (1 << 2), |
5188 | diff --git a/include/linux/libata.h b/include/linux/libata.h |
5189 | index fa0c3dae2094..c44e4cfbcb16 100644 |
5190 | --- a/include/linux/libata.h |
5191 | +++ b/include/linux/libata.h |
5192 | @@ -1220,6 +1220,7 @@ struct pci_bits { |
5193 | }; |
5194 | |
5195 | extern int pci_test_config_bits(struct pci_dev *pdev, const struct pci_bits *bits); |
5196 | +extern void ata_pci_shutdown_one(struct pci_dev *pdev); |
5197 | extern void ata_pci_remove_one(struct pci_dev *pdev); |
5198 | |
5199 | #ifdef CONFIG_PM |
5200 | diff --git a/include/linux/tty.h b/include/linux/tty.h |
5201 | index bfa4e2ee94a9..bd5fe0e907e8 100644 |
5202 | --- a/include/linux/tty.h |
5203 | +++ b/include/linux/tty.h |
5204 | @@ -225,6 +225,8 @@ struct tty_port_client_operations { |
5205 | void (*write_wakeup)(struct tty_port *port); |
5206 | }; |
5207 | |
5208 | +extern const struct tty_port_client_operations tty_port_default_client_ops; |
5209 | + |
5210 | struct tty_port { |
5211 | struct tty_bufhead buf; /* Locked internally */ |
5212 | struct tty_struct *tty; /* Back pointer */ |
5213 | diff --git a/include/linux/usb/quirks.h b/include/linux/usb/quirks.h |
5214 | index a1be64c9940f..22c1f579afe3 100644 |
5215 | --- a/include/linux/usb/quirks.h |
5216 | +++ b/include/linux/usb/quirks.h |
5217 | @@ -69,4 +69,7 @@ |
5218 | /* Hub needs extra delay after resetting its port. */ |
5219 | #define USB_QUIRK_HUB_SLOW_RESET BIT(14) |
5220 | |
5221 | +/* device has blacklisted endpoints */ |
5222 | +#define USB_QUIRK_ENDPOINT_BLACKLIST BIT(15) |
5223 | + |
5224 | #endif /* __LINUX_USB_QUIRKS_H */ |
5225 | diff --git a/include/scsi/iscsi_proto.h b/include/scsi/iscsi_proto.h |
5226 | index 533f56733ba8..b71b5c4f418c 100644 |
5227 | --- a/include/scsi/iscsi_proto.h |
5228 | +++ b/include/scsi/iscsi_proto.h |
5229 | @@ -627,7 +627,6 @@ struct iscsi_reject { |
5230 | #define ISCSI_REASON_BOOKMARK_INVALID 9 |
5231 | #define ISCSI_REASON_BOOKMARK_NO_RESOURCES 10 |
5232 | #define ISCSI_REASON_NEGOTIATION_RESET 11 |
5233 | -#define ISCSI_REASON_WAITING_FOR_LOGOUT 12 |
5234 | |
5235 | /* Max. number of Key=Value pairs in a text message */ |
5236 | #define MAX_KEY_VALUE_PAIRS 8192 |
5237 | diff --git a/include/sound/rawmidi.h b/include/sound/rawmidi.h |
5238 | index 40ab20439fee..a36b7227a15a 100644 |
5239 | --- a/include/sound/rawmidi.h |
5240 | +++ b/include/sound/rawmidi.h |
5241 | @@ -77,9 +77,9 @@ struct snd_rawmidi_substream { |
5242 | struct list_head list; /* list of all substream for given stream */ |
5243 | int stream; /* direction */ |
5244 | int number; /* substream number */ |
5245 | - unsigned int opened: 1, /* open flag */ |
5246 | - append: 1, /* append flag (merge more streams) */ |
5247 | - active_sensing: 1; /* send active sensing when close */ |
5248 | + bool opened; /* open flag */ |
5249 | + bool append; /* append flag (merge more streams) */ |
5250 | + bool active_sensing; /* send active sensing when close */ |
5251 | int use_count; /* use counter (for output) */ |
5252 | size_t bytes; |
5253 | struct snd_rawmidi *rmidi; |
5254 | diff --git a/ipc/sem.c b/ipc/sem.c |
5255 | index ec97a7072413..fe12ea8dd2b3 100644 |
5256 | --- a/ipc/sem.c |
5257 | +++ b/ipc/sem.c |
5258 | @@ -2368,11 +2368,9 @@ void exit_sem(struct task_struct *tsk) |
5259 | ipc_assert_locked_object(&sma->sem_perm); |
5260 | list_del(&un->list_id); |
5261 | |
5262 | - /* we are the last process using this ulp, acquiring ulp->lock |
5263 | - * isn't required. Besides that, we are also protected against |
5264 | - * IPC_RMID as we hold sma->sem_perm lock now |
5265 | - */ |
5266 | + spin_lock(&ulp->lock); |
5267 | list_del_rcu(&un->list_proc); |
5268 | + spin_unlock(&ulp->lock); |
5269 | |
5270 | /* perform adjustments registered in un */ |
5271 | for (i = 0; i < sma->sem_nsems; i++) { |
5272 | diff --git a/kernel/bpf/offload.c b/kernel/bpf/offload.c |
5273 | index 5b9da0954a27..3668a0bc18ec 100644 |
5274 | --- a/kernel/bpf/offload.c |
5275 | +++ b/kernel/bpf/offload.c |
5276 | @@ -321,7 +321,7 @@ int bpf_prog_offload_info_fill(struct bpf_prog_info *info, |
5277 | |
5278 | ulen = info->jited_prog_len; |
5279 | info->jited_prog_len = aux->offload->jited_len; |
5280 | - if (info->jited_prog_len & ulen) { |
5281 | + if (info->jited_prog_len && ulen) { |
5282 | uinsns = u64_to_user_ptr(info->jited_prog_insns); |
5283 | ulen = min_t(u32, info->jited_prog_len, ulen); |
5284 | if (copy_to_user(uinsns, aux->offload->jited_image, ulen)) { |
5285 | diff --git a/kernel/irq/internals.h b/kernel/irq/internals.h |
5286 | index 3924fbe829d4..c9d8eb7f5c02 100644 |
5287 | --- a/kernel/irq/internals.h |
5288 | +++ b/kernel/irq/internals.h |
5289 | @@ -128,8 +128,6 @@ static inline void unregister_handler_proc(unsigned int irq, |
5290 | |
5291 | extern bool irq_can_set_affinity_usr(unsigned int irq); |
5292 | |
5293 | -extern int irq_select_affinity_usr(unsigned int irq); |
5294 | - |
5295 | extern void irq_set_thread_affinity(struct irq_desc *desc); |
5296 | |
5297 | extern int irq_do_set_affinity(struct irq_data *data, |
5298 | diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c |
5299 | index 1753486b440c..55b080101a20 100644 |
5300 | --- a/kernel/irq/manage.c |
5301 | +++ b/kernel/irq/manage.c |
5302 | @@ -442,23 +442,9 @@ int irq_setup_affinity(struct irq_desc *desc) |
5303 | { |
5304 | return irq_select_affinity(irq_desc_get_irq(desc)); |
5305 | } |
5306 | -#endif |
5307 | +#endif /* CONFIG_AUTO_IRQ_AFFINITY */ |
5308 | +#endif /* CONFIG_SMP */ |
5309 | |
5310 | -/* |
5311 | - * Called when a bogus affinity is set via /proc/irq |
5312 | - */ |
5313 | -int irq_select_affinity_usr(unsigned int irq) |
5314 | -{ |
5315 | - struct irq_desc *desc = irq_to_desc(irq); |
5316 | - unsigned long flags; |
5317 | - int ret; |
5318 | - |
5319 | - raw_spin_lock_irqsave(&desc->lock, flags); |
5320 | - ret = irq_setup_affinity(desc); |
5321 | - raw_spin_unlock_irqrestore(&desc->lock, flags); |
5322 | - return ret; |
5323 | -} |
5324 | -#endif |
5325 | |
5326 | /** |
5327 | * irq_set_vcpu_affinity - Set vcpu affinity for the interrupt |
5328 | diff --git a/kernel/irq/proc.c b/kernel/irq/proc.c |
5329 | index cfc4f088a0e7..f5958c55406f 100644 |
5330 | --- a/kernel/irq/proc.c |
5331 | +++ b/kernel/irq/proc.c |
5332 | @@ -111,6 +111,28 @@ static int irq_affinity_list_proc_show(struct seq_file *m, void *v) |
5333 | return show_irq_affinity(AFFINITY_LIST, m); |
5334 | } |
5335 | |
5336 | +#ifndef CONFIG_AUTO_IRQ_AFFINITY |
5337 | +static inline int irq_select_affinity_usr(unsigned int irq) |
5338 | +{ |
5339 | + /* |
5340 | + * If the interrupt is started up already then this fails. The |
5341 | + * interrupt is assigned to an online CPU already. There is no |
5342 | + * point to move it around randomly. Tell user space that the |
5343 | + * selected mask is bogus. |
5344 | + * |
5345 | + * If not then any change to the affinity is pointless because the |
5346 | + * startup code invokes irq_setup_affinity() which will select |
5347 | + * a online CPU anyway. |
5348 | + */ |
5349 | + return -EINVAL; |
5350 | +} |
5351 | +#else |
5352 | +/* ALPHA magic affinity auto selector. Keep it for historical reasons. */ |
5353 | +static inline int irq_select_affinity_usr(unsigned int irq) |
5354 | +{ |
5355 | + return irq_select_affinity(irq); |
5356 | +} |
5357 | +#endif |
5358 | |
5359 | static ssize_t write_irq_affinity(int type, struct file *file, |
5360 | const char __user *buffer, size_t count, loff_t *pos) |
5361 | diff --git a/kernel/sched/psi.c b/kernel/sched/psi.c |
5362 | index ce8f6748678a..9154e745f097 100644 |
5363 | --- a/kernel/sched/psi.c |
5364 | +++ b/kernel/sched/psi.c |
5365 | @@ -1199,6 +1199,9 @@ static ssize_t psi_write(struct file *file, const char __user *user_buf, |
5366 | if (static_branch_likely(&psi_disabled)) |
5367 | return -EOPNOTSUPP; |
5368 | |
5369 | + if (!nbytes) |
5370 | + return -EINVAL; |
5371 | + |
5372 | buf_size = min(nbytes, sizeof(buf)); |
5373 | if (copy_from_user(buf, user_buf, buf_size)) |
5374 | return -EFAULT; |
5375 | diff --git a/lib/stackdepot.c b/lib/stackdepot.c |
5376 | index ed717dd08ff3..81c69c08d1d1 100644 |
5377 | --- a/lib/stackdepot.c |
5378 | +++ b/lib/stackdepot.c |
5379 | @@ -83,15 +83,19 @@ static bool init_stack_slab(void **prealloc) |
5380 | return true; |
5381 | if (stack_slabs[depot_index] == NULL) { |
5382 | stack_slabs[depot_index] = *prealloc; |
5383 | + *prealloc = NULL; |
5384 | } else { |
5385 | - stack_slabs[depot_index + 1] = *prealloc; |
5386 | + /* If this is the last depot slab, do not touch the next one. */ |
5387 | + if (depot_index + 1 < STACK_ALLOC_MAX_SLABS) { |
5388 | + stack_slabs[depot_index + 1] = *prealloc; |
5389 | + *prealloc = NULL; |
5390 | + } |
5391 | /* |
5392 | * This smp_store_release pairs with smp_load_acquire() from |
5393 | * |next_slab_inited| above and in stack_depot_save(). |
5394 | */ |
5395 | smp_store_release(&next_slab_inited, 1); |
5396 | } |
5397 | - *prealloc = NULL; |
5398 | return true; |
5399 | } |
5400 | |
5401 | diff --git a/mm/memcontrol.c b/mm/memcontrol.c |
5402 | index b5b4e310fe70..ae9044bc9f80 100644 |
5403 | --- a/mm/memcontrol.c |
5404 | +++ b/mm/memcontrol.c |
5405 | @@ -418,8 +418,10 @@ int memcg_expand_shrinker_maps(int new_id) |
5406 | if (mem_cgroup_is_root(memcg)) |
5407 | continue; |
5408 | ret = memcg_expand_one_shrinker_map(memcg, size, old_size); |
5409 | - if (ret) |
5410 | + if (ret) { |
5411 | + mem_cgroup_iter_break(NULL, memcg); |
5412 | goto unlock; |
5413 | + } |
5414 | } |
5415 | unlock: |
5416 | if (!ret) |
5417 | diff --git a/mm/mmap.c b/mm/mmap.c |
5418 | index 4390dbea4aa5..514cc19c5916 100644 |
5419 | --- a/mm/mmap.c |
5420 | +++ b/mm/mmap.c |
5421 | @@ -195,8 +195,6 @@ SYSCALL_DEFINE1(brk, unsigned long, brk) |
5422 | bool downgraded = false; |
5423 | LIST_HEAD(uf); |
5424 | |
5425 | - brk = untagged_addr(brk); |
5426 | - |
5427 | if (down_write_killable(&mm->mmap_sem)) |
5428 | return -EINTR; |
5429 | |
5430 | @@ -1583,8 +1581,6 @@ unsigned long ksys_mmap_pgoff(unsigned long addr, unsigned long len, |
5431 | struct file *file = NULL; |
5432 | unsigned long retval; |
5433 | |
5434 | - addr = untagged_addr(addr); |
5435 | - |
5436 | if (!(flags & MAP_ANONYMOUS)) { |
5437 | audit_mmap_fd(fd, flags); |
5438 | file = fget(fd); |
5439 | diff --git a/mm/mremap.c b/mm/mremap.c |
5440 | index 1fc8a29fbe3f..1d98281f7204 100644 |
5441 | --- a/mm/mremap.c |
5442 | +++ b/mm/mremap.c |
5443 | @@ -607,7 +607,6 @@ SYSCALL_DEFINE5(mremap, unsigned long, addr, unsigned long, old_len, |
5444 | LIST_HEAD(uf_unmap); |
5445 | |
5446 | addr = untagged_addr(addr); |
5447 | - new_addr = untagged_addr(new_addr); |
5448 | |
5449 | if (flags & ~(MREMAP_FIXED | MREMAP_MAYMOVE)) |
5450 | return ret; |
5451 | diff --git a/mm/sparse.c b/mm/sparse.c |
5452 | index 69b41b6046a5..a5e5c1c3a2a8 100644 |
5453 | --- a/mm/sparse.c |
5454 | +++ b/mm/sparse.c |
5455 | @@ -884,7 +884,7 @@ int __meminit sparse_add_section(int nid, unsigned long start_pfn, |
5456 | * Poison uninitialized struct pages in order to catch invalid flags |
5457 | * combinations. |
5458 | */ |
5459 | - page_init_poison(pfn_to_page(start_pfn), sizeof(struct page) * nr_pages); |
5460 | + page_init_poison(memmap, sizeof(struct page) * nr_pages); |
5461 | |
5462 | ms = __nr_to_section(section_nr); |
5463 | set_section_nid(section_nr, nid); |
5464 | diff --git a/mm/vmscan.c b/mm/vmscan.c |
5465 | index e7f10c4b40f0..7fde5f904c8d 100644 |
5466 | --- a/mm/vmscan.c |
5467 | +++ b/mm/vmscan.c |
5468 | @@ -2530,10 +2530,13 @@ out: |
5469 | /* |
5470 | * Scan types proportional to swappiness and |
5471 | * their relative recent reclaim efficiency. |
5472 | - * Make sure we don't miss the last page |
5473 | - * because of a round-off error. |
5474 | + * Make sure we don't miss the last page on |
5475 | + * the offlined memory cgroups because of a |
5476 | + * round-off error. |
5477 | */ |
5478 | - scan = DIV64_U64_ROUND_UP(scan * fraction[file], |
5479 | + scan = mem_cgroup_online(memcg) ? |
5480 | + div64_u64(scan * fraction[file], denominator) : |
5481 | + DIV64_U64_ROUND_UP(scan * fraction[file], |
5482 | denominator); |
5483 | break; |
5484 | case SCAN_FILE: |
5485 | diff --git a/net/netfilter/xt_hashlimit.c b/net/netfilter/xt_hashlimit.c |
5486 | index ced3fc8fad7c..6520d9ec1297 100644 |
5487 | --- a/net/netfilter/xt_hashlimit.c |
5488 | +++ b/net/netfilter/xt_hashlimit.c |
5489 | @@ -851,6 +851,8 @@ hashlimit_mt(const struct sk_buff *skb, struct xt_action_param *par) |
5490 | return hashlimit_mt_common(skb, par, hinfo, &info->cfg, 3); |
5491 | } |
5492 | |
5493 | +#define HASHLIMIT_MAX_SIZE 1048576 |
5494 | + |
5495 | static int hashlimit_mt_check_common(const struct xt_mtchk_param *par, |
5496 | struct xt_hashlimit_htable **hinfo, |
5497 | struct hashlimit_cfg3 *cfg, |
5498 | @@ -861,6 +863,14 @@ static int hashlimit_mt_check_common(const struct xt_mtchk_param *par, |
5499 | |
5500 | if (cfg->gc_interval == 0 || cfg->expire == 0) |
5501 | return -EINVAL; |
5502 | + if (cfg->size > HASHLIMIT_MAX_SIZE) { |
5503 | + cfg->size = HASHLIMIT_MAX_SIZE; |
5504 | + pr_info_ratelimited("size too large, truncated to %u\n", cfg->size); |
5505 | + } |
5506 | + if (cfg->max > HASHLIMIT_MAX_SIZE) { |
5507 | + cfg->max = HASHLIMIT_MAX_SIZE; |
5508 | + pr_info_ratelimited("max too large, truncated to %u\n", cfg->max); |
5509 | + } |
5510 | if (par->family == NFPROTO_IPV4) { |
5511 | if (cfg->srcmask > 32 || cfg->dstmask > 32) |
5512 | return -EINVAL; |
5513 | diff --git a/net/rxrpc/call_object.c b/net/rxrpc/call_object.c |
5514 | index dbdbc4f18b5e..c9f34b0a11df 100644 |
5515 | --- a/net/rxrpc/call_object.c |
5516 | +++ b/net/rxrpc/call_object.c |
5517 | @@ -562,11 +562,11 @@ void rxrpc_put_call(struct rxrpc_call *call, enum rxrpc_call_trace op) |
5518 | } |
5519 | |
5520 | /* |
5521 | - * Final call destruction under RCU. |
5522 | + * Final call destruction - but must be done in process context. |
5523 | */ |
5524 | -static void rxrpc_rcu_destroy_call(struct rcu_head *rcu) |
5525 | +static void rxrpc_destroy_call(struct work_struct *work) |
5526 | { |
5527 | - struct rxrpc_call *call = container_of(rcu, struct rxrpc_call, rcu); |
5528 | + struct rxrpc_call *call = container_of(work, struct rxrpc_call, processor); |
5529 | struct rxrpc_net *rxnet = call->rxnet; |
5530 | |
5531 | rxrpc_put_connection(call->conn); |
5532 | @@ -578,6 +578,22 @@ static void rxrpc_rcu_destroy_call(struct rcu_head *rcu) |
5533 | wake_up_var(&rxnet->nr_calls); |
5534 | } |
5535 | |
5536 | +/* |
5537 | + * Final call destruction under RCU. |
5538 | + */ |
5539 | +static void rxrpc_rcu_destroy_call(struct rcu_head *rcu) |
5540 | +{ |
5541 | + struct rxrpc_call *call = container_of(rcu, struct rxrpc_call, rcu); |
5542 | + |
5543 | + if (in_softirq()) { |
5544 | + INIT_WORK(&call->processor, rxrpc_destroy_call); |
5545 | + if (!rxrpc_queue_work(&call->processor)) |
5546 | + BUG(); |
5547 | + } else { |
5548 | + rxrpc_destroy_call(&call->processor); |
5549 | + } |
5550 | +} |
5551 | + |
5552 | /* |
5553 | * clean up a call |
5554 | */ |
5555 | diff --git a/sound/core/seq/seq_clientmgr.c b/sound/core/seq/seq_clientmgr.c |
5556 | index 6d9592f0ae1d..cc93157fa950 100644 |
5557 | --- a/sound/core/seq/seq_clientmgr.c |
5558 | +++ b/sound/core/seq/seq_clientmgr.c |
5559 | @@ -580,7 +580,7 @@ static int update_timestamp_of_queue(struct snd_seq_event *event, |
5560 | event->queue = queue; |
5561 | event->flags &= ~SNDRV_SEQ_TIME_STAMP_MASK; |
5562 | if (real_time) { |
5563 | - event->time.time = snd_seq_timer_get_cur_time(q->timer); |
5564 | + event->time.time = snd_seq_timer_get_cur_time(q->timer, true); |
5565 | event->flags |= SNDRV_SEQ_TIME_STAMP_REAL; |
5566 | } else { |
5567 | event->time.tick = snd_seq_timer_get_cur_tick(q->timer); |
5568 | @@ -1659,7 +1659,7 @@ static int snd_seq_ioctl_get_queue_status(struct snd_seq_client *client, |
5569 | tmr = queue->timer; |
5570 | status->events = queue->tickq->cells + queue->timeq->cells; |
5571 | |
5572 | - status->time = snd_seq_timer_get_cur_time(tmr); |
5573 | + status->time = snd_seq_timer_get_cur_time(tmr, true); |
5574 | status->tick = snd_seq_timer_get_cur_tick(tmr); |
5575 | |
5576 | status->running = tmr->running; |
5577 | diff --git a/sound/core/seq/seq_queue.c b/sound/core/seq/seq_queue.c |
5578 | index caf68bf42f13..71a6ea62c3be 100644 |
5579 | --- a/sound/core/seq/seq_queue.c |
5580 | +++ b/sound/core/seq/seq_queue.c |
5581 | @@ -238,6 +238,8 @@ void snd_seq_check_queue(struct snd_seq_queue *q, int atomic, int hop) |
5582 | { |
5583 | unsigned long flags; |
5584 | struct snd_seq_event_cell *cell; |
5585 | + snd_seq_tick_time_t cur_tick; |
5586 | + snd_seq_real_time_t cur_time; |
5587 | |
5588 | if (q == NULL) |
5589 | return; |
5590 | @@ -254,17 +256,18 @@ void snd_seq_check_queue(struct snd_seq_queue *q, int atomic, int hop) |
5591 | |
5592 | __again: |
5593 | /* Process tick queue... */ |
5594 | + cur_tick = snd_seq_timer_get_cur_tick(q->timer); |
5595 | for (;;) { |
5596 | - cell = snd_seq_prioq_cell_out(q->tickq, |
5597 | - &q->timer->tick.cur_tick); |
5598 | + cell = snd_seq_prioq_cell_out(q->tickq, &cur_tick); |
5599 | if (!cell) |
5600 | break; |
5601 | snd_seq_dispatch_event(cell, atomic, hop); |
5602 | } |
5603 | |
5604 | /* Process time queue... */ |
5605 | + cur_time = snd_seq_timer_get_cur_time(q->timer, false); |
5606 | for (;;) { |
5607 | - cell = snd_seq_prioq_cell_out(q->timeq, &q->timer->cur_time); |
5608 | + cell = snd_seq_prioq_cell_out(q->timeq, &cur_time); |
5609 | if (!cell) |
5610 | break; |
5611 | snd_seq_dispatch_event(cell, atomic, hop); |
5612 | @@ -392,6 +395,7 @@ int snd_seq_queue_check_access(int queueid, int client) |
5613 | int snd_seq_queue_set_owner(int queueid, int client, int locked) |
5614 | { |
5615 | struct snd_seq_queue *q = queueptr(queueid); |
5616 | + unsigned long flags; |
5617 | |
5618 | if (q == NULL) |
5619 | return -EINVAL; |
5620 | @@ -401,8 +405,10 @@ int snd_seq_queue_set_owner(int queueid, int client, int locked) |
5621 | return -EPERM; |
5622 | } |
5623 | |
5624 | + spin_lock_irqsave(&q->owner_lock, flags); |
5625 | q->locked = locked ? 1 : 0; |
5626 | q->owner = client; |
5627 | + spin_unlock_irqrestore(&q->owner_lock, flags); |
5628 | queue_access_unlock(q); |
5629 | queuefree(q); |
5630 | |
5631 | @@ -539,15 +545,17 @@ void snd_seq_queue_client_termination(int client) |
5632 | unsigned long flags; |
5633 | int i; |
5634 | struct snd_seq_queue *q; |
5635 | + bool matched; |
5636 | |
5637 | for (i = 0; i < SNDRV_SEQ_MAX_QUEUES; i++) { |
5638 | if ((q = queueptr(i)) == NULL) |
5639 | continue; |
5640 | spin_lock_irqsave(&q->owner_lock, flags); |
5641 | - if (q->owner == client) |
5642 | + matched = (q->owner == client); |
5643 | + if (matched) |
5644 | q->klocked = 1; |
5645 | spin_unlock_irqrestore(&q->owner_lock, flags); |
5646 | - if (q->owner == client) { |
5647 | + if (matched) { |
5648 | if (q->timer->running) |
5649 | snd_seq_timer_stop(q->timer); |
5650 | snd_seq_timer_reset(q->timer); |
5651 | @@ -739,6 +747,8 @@ void snd_seq_info_queues_read(struct snd_info_entry *entry, |
5652 | int i, bpm; |
5653 | struct snd_seq_queue *q; |
5654 | struct snd_seq_timer *tmr; |
5655 | + bool locked; |
5656 | + int owner; |
5657 | |
5658 | for (i = 0; i < SNDRV_SEQ_MAX_QUEUES; i++) { |
5659 | if ((q = queueptr(i)) == NULL) |
5660 | @@ -750,9 +760,14 @@ void snd_seq_info_queues_read(struct snd_info_entry *entry, |
5661 | else |
5662 | bpm = 0; |
5663 | |
5664 | + spin_lock_irq(&q->owner_lock); |
5665 | + locked = q->locked; |
5666 | + owner = q->owner; |
5667 | + spin_unlock_irq(&q->owner_lock); |
5668 | + |
5669 | snd_iprintf(buffer, "queue %d: [%s]\n", q->queue, q->name); |
5670 | - snd_iprintf(buffer, "owned by client : %d\n", q->owner); |
5671 | - snd_iprintf(buffer, "lock status : %s\n", q->locked ? "Locked" : "Free"); |
5672 | + snd_iprintf(buffer, "owned by client : %d\n", owner); |
5673 | + snd_iprintf(buffer, "lock status : %s\n", locked ? "Locked" : "Free"); |
5674 | snd_iprintf(buffer, "queued time events : %d\n", snd_seq_prioq_avail(q->timeq)); |
5675 | snd_iprintf(buffer, "queued tick events : %d\n", snd_seq_prioq_avail(q->tickq)); |
5676 | snd_iprintf(buffer, "timer state : %s\n", tmr->running ? "Running" : "Stopped"); |
5677 | diff --git a/sound/core/seq/seq_timer.c b/sound/core/seq/seq_timer.c |
5678 | index 3bc6095df44d..0b43fc5fe349 100644 |
5679 | --- a/sound/core/seq/seq_timer.c |
5680 | +++ b/sound/core/seq/seq_timer.c |
5681 | @@ -422,14 +422,15 @@ int snd_seq_timer_continue(struct snd_seq_timer *tmr) |
5682 | } |
5683 | |
5684 | /* return current 'real' time. use timeofday() to get better granularity. */ |
5685 | -snd_seq_real_time_t snd_seq_timer_get_cur_time(struct snd_seq_timer *tmr) |
5686 | +snd_seq_real_time_t snd_seq_timer_get_cur_time(struct snd_seq_timer *tmr, |
5687 | + bool adjust_ktime) |
5688 | { |
5689 | snd_seq_real_time_t cur_time; |
5690 | unsigned long flags; |
5691 | |
5692 | spin_lock_irqsave(&tmr->lock, flags); |
5693 | cur_time = tmr->cur_time; |
5694 | - if (tmr->running) { |
5695 | + if (adjust_ktime && tmr->running) { |
5696 | struct timespec64 tm; |
5697 | |
5698 | ktime_get_ts64(&tm); |
5699 | @@ -446,7 +447,13 @@ snd_seq_real_time_t snd_seq_timer_get_cur_time(struct snd_seq_timer *tmr) |
5700 | high PPQ values) */ |
5701 | snd_seq_tick_time_t snd_seq_timer_get_cur_tick(struct snd_seq_timer *tmr) |
5702 | { |
5703 | - return tmr->tick.cur_tick; |
5704 | + snd_seq_tick_time_t cur_tick; |
5705 | + unsigned long flags; |
5706 | + |
5707 | + spin_lock_irqsave(&tmr->lock, flags); |
5708 | + cur_tick = tmr->tick.cur_tick; |
5709 | + spin_unlock_irqrestore(&tmr->lock, flags); |
5710 | + return cur_tick; |
5711 | } |
5712 | |
5713 | |
5714 | diff --git a/sound/core/seq/seq_timer.h b/sound/core/seq/seq_timer.h |
5715 | index 66c3e344eae3..4bec57df8158 100644 |
5716 | --- a/sound/core/seq/seq_timer.h |
5717 | +++ b/sound/core/seq/seq_timer.h |
5718 | @@ -120,7 +120,8 @@ int snd_seq_timer_set_tempo_ppq(struct snd_seq_timer *tmr, int tempo, int ppq); |
5719 | int snd_seq_timer_set_position_tick(struct snd_seq_timer *tmr, snd_seq_tick_time_t position); |
5720 | int snd_seq_timer_set_position_time(struct snd_seq_timer *tmr, snd_seq_real_time_t position); |
5721 | int snd_seq_timer_set_skew(struct snd_seq_timer *tmr, unsigned int skew, unsigned int base); |
5722 | -snd_seq_real_time_t snd_seq_timer_get_cur_time(struct snd_seq_timer *tmr); |
5723 | +snd_seq_real_time_t snd_seq_timer_get_cur_time(struct snd_seq_timer *tmr, |
5724 | + bool adjust_ktime); |
5725 | snd_seq_tick_time_t snd_seq_timer_get_cur_tick(struct snd_seq_timer *tmr); |
5726 | |
5727 | extern int seq_default_timer_class; |
5728 | diff --git a/sound/hda/hdmi_chmap.c b/sound/hda/hdmi_chmap.c |
5729 | index 886cb7811bd6..2efee794cac6 100644 |
5730 | --- a/sound/hda/hdmi_chmap.c |
5731 | +++ b/sound/hda/hdmi_chmap.c |
5732 | @@ -250,7 +250,7 @@ void snd_hdac_print_channel_allocation(int spk_alloc, char *buf, int buflen) |
5733 | |
5734 | for (i = 0, j = 0; i < ARRAY_SIZE(cea_speaker_allocation_names); i++) { |
5735 | if (spk_alloc & (1 << i)) |
5736 | - j += snprintf(buf + j, buflen - j, " %s", |
5737 | + j += scnprintf(buf + j, buflen - j, " %s", |
5738 | cea_speaker_allocation_names[i]); |
5739 | } |
5740 | buf[j] = '\0'; /* necessary when j == 0 */ |
5741 | diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c |
5742 | index a2fb19129219..6cb72336433a 100644 |
5743 | --- a/sound/pci/hda/hda_codec.c |
5744 | +++ b/sound/pci/hda/hda_codec.c |
5745 | @@ -4019,7 +4019,7 @@ void snd_print_pcm_bits(int pcm, char *buf, int buflen) |
5746 | |
5747 | for (i = 0, j = 0; i < ARRAY_SIZE(bits); i++) |
5748 | if (pcm & (AC_SUPPCM_BITS_8 << i)) |
5749 | - j += snprintf(buf + j, buflen - j, " %d", bits[i]); |
5750 | + j += scnprintf(buf + j, buflen - j, " %d", bits[i]); |
5751 | |
5752 | buf[j] = '\0'; /* necessary when j == 0 */ |
5753 | } |
5754 | diff --git a/sound/pci/hda/hda_eld.c b/sound/pci/hda/hda_eld.c |
5755 | index d081fb2880a0..82cf1da2ff12 100644 |
5756 | --- a/sound/pci/hda/hda_eld.c |
5757 | +++ b/sound/pci/hda/hda_eld.c |
5758 | @@ -360,7 +360,7 @@ static void hdmi_print_pcm_rates(int pcm, char *buf, int buflen) |
5759 | |
5760 | for (i = 0, j = 0; i < ARRAY_SIZE(alsa_rates); i++) |
5761 | if (pcm & (1 << i)) |
5762 | - j += snprintf(buf + j, buflen - j, " %d", |
5763 | + j += scnprintf(buf + j, buflen - j, " %d", |
5764 | alsa_rates[i]); |
5765 | |
5766 | buf[j] = '\0'; /* necessary when j == 0 */ |
5767 | diff --git a/sound/pci/hda/hda_sysfs.c b/sound/pci/hda/hda_sysfs.c |
5768 | index fcc34417cbce..6dbe99131bc4 100644 |
5769 | --- a/sound/pci/hda/hda_sysfs.c |
5770 | +++ b/sound/pci/hda/hda_sysfs.c |
5771 | @@ -222,7 +222,7 @@ static ssize_t init_verbs_show(struct device *dev, |
5772 | int i, len = 0; |
5773 | mutex_lock(&codec->user_mutex); |
5774 | snd_array_for_each(&codec->init_verbs, i, v) { |
5775 | - len += snprintf(buf + len, PAGE_SIZE - len, |
5776 | + len += scnprintf(buf + len, PAGE_SIZE - len, |
5777 | "0x%02x 0x%03x 0x%04x\n", |
5778 | v->nid, v->verb, v->param); |
5779 | } |
5780 | @@ -272,7 +272,7 @@ static ssize_t hints_show(struct device *dev, |
5781 | int i, len = 0; |
5782 | mutex_lock(&codec->user_mutex); |
5783 | snd_array_for_each(&codec->hints, i, hint) { |
5784 | - len += snprintf(buf + len, PAGE_SIZE - len, |
5785 | + len += scnprintf(buf + len, PAGE_SIZE - len, |
5786 | "%s = %s\n", hint->key, hint->val); |
5787 | } |
5788 | mutex_unlock(&codec->user_mutex); |
5789 | diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c |
5790 | index f162e607fc6c..4f78b40831d8 100644 |
5791 | --- a/sound/pci/hda/patch_realtek.c |
5792 | +++ b/sound/pci/hda/patch_realtek.c |
5793 | @@ -2447,7 +2447,9 @@ static const struct snd_pci_quirk alc882_fixup_tbl[] = { |
5794 | SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC882_FIXUP_EAPD), |
5795 | SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte EP45-DS3/Z87X-UD3H", ALC889_FIXUP_FRONT_HP_NO_PRESENCE), |
5796 | SND_PCI_QUIRK(0x1458, 0xa0b8, "Gigabyte AZ370-Gaming", ALC1220_FIXUP_GB_DUAL_CODECS), |
5797 | + SND_PCI_QUIRK(0x1462, 0x1228, "MSI-GP63", ALC1220_FIXUP_CLEVO_P950), |
5798 | SND_PCI_QUIRK(0x1462, 0x1276, "MSI-GL73", ALC1220_FIXUP_CLEVO_P950), |
5799 | + SND_PCI_QUIRK(0x1462, 0x1293, "MSI-GP65", ALC1220_FIXUP_CLEVO_P950), |
5800 | SND_PCI_QUIRK(0x1462, 0x7350, "MSI-7350", ALC889_FIXUP_CD), |
5801 | SND_PCI_QUIRK(0x1462, 0xda57, "MSI Z270-Gaming", ALC1220_FIXUP_GB_DUAL_CODECS), |
5802 | SND_PCI_QUIRK_VENDOR(0x1462, "MSI", ALC882_FIXUP_GPIO3), |
5803 | diff --git a/sound/soc/atmel/Kconfig b/sound/soc/atmel/Kconfig |
5804 | index d1dc8e6366dc..71f2d42188c4 100644 |
5805 | --- a/sound/soc/atmel/Kconfig |
5806 | +++ b/sound/soc/atmel/Kconfig |
5807 | @@ -10,11 +10,11 @@ config SND_ATMEL_SOC |
5808 | if SND_ATMEL_SOC |
5809 | |
5810 | config SND_ATMEL_SOC_PDC |
5811 | - tristate |
5812 | + bool |
5813 | depends on HAS_DMA |
5814 | |
5815 | config SND_ATMEL_SOC_DMA |
5816 | - tristate |
5817 | + bool |
5818 | select SND_SOC_GENERIC_DMAENGINE_PCM |
5819 | |
5820 | config SND_ATMEL_SOC_SSC |
5821 | diff --git a/sound/soc/atmel/Makefile b/sound/soc/atmel/Makefile |
5822 | index 1f6890ed3738..c7d2989791be 100644 |
5823 | --- a/sound/soc/atmel/Makefile |
5824 | +++ b/sound/soc/atmel/Makefile |
5825 | @@ -6,8 +6,14 @@ snd-soc-atmel_ssc_dai-objs := atmel_ssc_dai.o |
5826 | snd-soc-atmel-i2s-objs := atmel-i2s.o |
5827 | snd-soc-mchp-i2s-mcc-objs := mchp-i2s-mcc.o |
5828 | |
5829 | -obj-$(CONFIG_SND_ATMEL_SOC_PDC) += snd-soc-atmel-pcm-pdc.o |
5830 | -obj-$(CONFIG_SND_ATMEL_SOC_DMA) += snd-soc-atmel-pcm-dma.o |
5831 | +# pdc and dma need to both be built-in if any user of |
5832 | +# ssc is built-in. |
5833 | +ifdef CONFIG_SND_ATMEL_SOC_PDC |
5834 | +obj-$(CONFIG_SND_ATMEL_SOC_SSC) += snd-soc-atmel-pcm-pdc.o |
5835 | +endif |
5836 | +ifdef CONFIG_SND_ATMEL_SOC_DMA |
5837 | +obj-$(CONFIG_SND_ATMEL_SOC_SSC) += snd-soc-atmel-pcm-dma.o |
5838 | +endif |
5839 | obj-$(CONFIG_SND_ATMEL_SOC_SSC) += snd-soc-atmel_ssc_dai.o |
5840 | obj-$(CONFIG_SND_ATMEL_SOC_I2S) += snd-soc-atmel-i2s.o |
5841 | obj-$(CONFIG_SND_MCHP_SOC_I2S_MCC) += snd-soc-mchp-i2s-mcc.o |
5842 | diff --git a/sound/soc/fsl/fsl_sai.c b/sound/soc/fsl/fsl_sai.c |
5843 | index b517e4bc1b87..41b83ecaf008 100644 |
5844 | --- a/sound/soc/fsl/fsl_sai.c |
5845 | +++ b/sound/soc/fsl/fsl_sai.c |
5846 | @@ -1019,12 +1019,24 @@ static int fsl_sai_probe(struct platform_device *pdev) |
5847 | ret = devm_snd_soc_register_component(&pdev->dev, &fsl_component, |
5848 | &fsl_sai_dai, 1); |
5849 | if (ret) |
5850 | - return ret; |
5851 | + goto err_pm_disable; |
5852 | |
5853 | - if (sai->soc_data->use_imx_pcm) |
5854 | - return imx_pcm_dma_init(pdev, IMX_SAI_DMABUF_SIZE); |
5855 | - else |
5856 | - return devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0); |
5857 | + if (sai->soc_data->use_imx_pcm) { |
5858 | + ret = imx_pcm_dma_init(pdev, IMX_SAI_DMABUF_SIZE); |
5859 | + if (ret) |
5860 | + goto err_pm_disable; |
5861 | + } else { |
5862 | + ret = devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0); |
5863 | + if (ret) |
5864 | + goto err_pm_disable; |
5865 | + } |
5866 | + |
5867 | + return ret; |
5868 | + |
5869 | +err_pm_disable: |
5870 | + pm_runtime_disable(&pdev->dev); |
5871 | + |
5872 | + return ret; |
5873 | } |
5874 | |
5875 | static int fsl_sai_remove(struct platform_device *pdev) |
5876 | diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c |
5877 | index b6378f025836..935b5375ecc5 100644 |
5878 | --- a/sound/soc/soc-dapm.c |
5879 | +++ b/sound/soc/soc-dapm.c |
5880 | @@ -3888,9 +3888,6 @@ snd_soc_dai_link_event_pre_pmu(struct snd_soc_dapm_widget *w, |
5881 | runtime->rate = params_rate(params); |
5882 | |
5883 | out: |
5884 | - if (ret < 0) |
5885 | - kfree(runtime); |
5886 | - |
5887 | kfree(params); |
5888 | return ret; |
5889 | } |
5890 | diff --git a/sound/soc/sof/intel/hda-dai.c b/sound/soc/sof/intel/hda-dai.c |
5891 | index 1923b0c36bce..3f645200d3a5 100644 |
5892 | --- a/sound/soc/sof/intel/hda-dai.c |
5893 | +++ b/sound/soc/sof/intel/hda-dai.c |
5894 | @@ -443,6 +443,10 @@ struct snd_soc_dai_driver skl_dai[] = { |
5895 | .name = "iDisp3 Pin", |
5896 | .ops = &hda_link_dai_ops, |
5897 | }, |
5898 | +{ |
5899 | + .name = "iDisp4 Pin", |
5900 | + .ops = &hda_link_dai_ops, |
5901 | +}, |
5902 | { |
5903 | .name = "Analog CPU DAI", |
5904 | .ops = &hda_link_dai_ops, |
5905 | diff --git a/sound/soc/sunxi/sun8i-codec.c b/sound/soc/sunxi/sun8i-codec.c |
5906 | index 55798bc8eae2..686561df8e13 100644 |
5907 | --- a/sound/soc/sunxi/sun8i-codec.c |
5908 | +++ b/sound/soc/sunxi/sun8i-codec.c |
5909 | @@ -80,6 +80,7 @@ |
5910 | |
5911 | #define SUN8I_SYS_SR_CTRL_AIF1_FS_MASK GENMASK(15, 12) |
5912 | #define SUN8I_SYS_SR_CTRL_AIF2_FS_MASK GENMASK(11, 8) |
5913 | +#define SUN8I_AIF1CLK_CTRL_AIF1_DATA_FMT_MASK GENMASK(3, 2) |
5914 | #define SUN8I_AIF1CLK_CTRL_AIF1_WORD_SIZ_MASK GENMASK(5, 4) |
5915 | #define SUN8I_AIF1CLK_CTRL_AIF1_LRCK_DIV_MASK GENMASK(8, 6) |
5916 | #define SUN8I_AIF1CLK_CTRL_AIF1_BCLK_DIV_MASK GENMASK(12, 9) |
5917 | @@ -241,7 +242,7 @@ static int sun8i_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) |
5918 | return -EINVAL; |
5919 | } |
5920 | regmap_update_bits(scodec->regmap, SUN8I_AIF1CLK_CTRL, |
5921 | - BIT(SUN8I_AIF1CLK_CTRL_AIF1_DATA_FMT), |
5922 | + SUN8I_AIF1CLK_CTRL_AIF1_DATA_FMT_MASK, |
5923 | value << SUN8I_AIF1CLK_CTRL_AIF1_DATA_FMT); |
5924 | |
5925 | return 0; |
5926 | diff --git a/tools/testing/selftests/bpf/prog_tests/sockmap_basic.c b/tools/testing/selftests/bpf/prog_tests/sockmap_basic.c |
5927 | index 07f5b462c2ef..aa43e0bd210c 100644 |
5928 | --- a/tools/testing/selftests/bpf/prog_tests/sockmap_basic.c |
5929 | +++ b/tools/testing/selftests/bpf/prog_tests/sockmap_basic.c |
5930 | @@ -3,6 +3,11 @@ |
5931 | |
5932 | #include "test_progs.h" |
5933 | |
5934 | +#define TCP_REPAIR 19 /* TCP sock is under repair right now */ |
5935 | + |
5936 | +#define TCP_REPAIR_ON 1 |
5937 | +#define TCP_REPAIR_OFF_NO_WP -1 /* Turn off without window probes */ |
5938 | + |
5939 | static int connected_socket_v4(void) |
5940 | { |
5941 | struct sockaddr_in addr = { |