Contents of /trunk/kernel-alx/patches-4.14/0104-4.14.5-all-fixes.patch
Parent Directory | Revision Log
Revision 3238 -
(show annotations)
(download)
Fri Nov 9 12:14:58 2018 UTC (5 years, 10 months ago) by niro
File size: 80209 byte(s)
Fri Nov 9 12:14:58 2018 UTC (5 years, 10 months ago) by niro
File size: 80209 byte(s)
-added up to patches-4.14.79
1 | diff --git a/Documentation/devicetree/bindings/timer/renesas,cmt.txt b/Documentation/devicetree/bindings/timer/renesas,cmt.txt |
2 | index 6ca6b9e582a0..d740989eb569 100644 |
3 | --- a/Documentation/devicetree/bindings/timer/renesas,cmt.txt |
4 | +++ b/Documentation/devicetree/bindings/timer/renesas,cmt.txt |
5 | @@ -20,16 +20,16 @@ Required Properties: |
6 | (CMT1 on sh73a0 and r8a7740) |
7 | This is a fallback for the above renesas,cmt-48-* entries. |
8 | |
9 | - - "renesas,cmt0-r8a73a4" for the 32-bit CMT0 device included in r8a73a4. |
10 | - - "renesas,cmt1-r8a73a4" for the 48-bit CMT1 device included in r8a73a4. |
11 | - - "renesas,cmt0-r8a7790" for the 32-bit CMT0 device included in r8a7790. |
12 | - - "renesas,cmt1-r8a7790" for the 48-bit CMT1 device included in r8a7790. |
13 | - - "renesas,cmt0-r8a7791" for the 32-bit CMT0 device included in r8a7791. |
14 | - - "renesas,cmt1-r8a7791" for the 48-bit CMT1 device included in r8a7791. |
15 | - - "renesas,cmt0-r8a7793" for the 32-bit CMT0 device included in r8a7793. |
16 | - - "renesas,cmt1-r8a7793" for the 48-bit CMT1 device included in r8a7793. |
17 | - - "renesas,cmt0-r8a7794" for the 32-bit CMT0 device included in r8a7794. |
18 | - - "renesas,cmt1-r8a7794" for the 48-bit CMT1 device included in r8a7794. |
19 | + - "renesas,r8a73a4-cmt0" for the 32-bit CMT0 device included in r8a73a4. |
20 | + - "renesas,r8a73a4-cmt1" for the 48-bit CMT1 device included in r8a73a4. |
21 | + - "renesas,r8a7790-cmt0" for the 32-bit CMT0 device included in r8a7790. |
22 | + - "renesas,r8a7790-cmt1" for the 48-bit CMT1 device included in r8a7790. |
23 | + - "renesas,r8a7791-cmt0" for the 32-bit CMT0 device included in r8a7791. |
24 | + - "renesas,r8a7791-cmt1" for the 48-bit CMT1 device included in r8a7791. |
25 | + - "renesas,r8a7793-cmt0" for the 32-bit CMT0 device included in r8a7793. |
26 | + - "renesas,r8a7793-cmt1" for the 48-bit CMT1 device included in r8a7793. |
27 | + - "renesas,r8a7794-cmt0" for the 32-bit CMT0 device included in r8a7794. |
28 | + - "renesas,r8a7794-cmt1" for the 48-bit CMT1 device included in r8a7794. |
29 | |
30 | - "renesas,rcar-gen2-cmt0" for 32-bit CMT0 devices included in R-Car Gen2. |
31 | - "renesas,rcar-gen2-cmt1" for 48-bit CMT1 devices included in R-Car Gen2. |
32 | @@ -46,7 +46,7 @@ Required Properties: |
33 | Example: R8A7790 (R-Car H2) CMT0 and CMT1 nodes |
34 | |
35 | cmt0: timer@ffca0000 { |
36 | - compatible = "renesas,cmt0-r8a7790", "renesas,rcar-gen2-cmt0"; |
37 | + compatible = "renesas,r8a7790-cmt0", "renesas,rcar-gen2-cmt0"; |
38 | reg = <0 0xffca0000 0 0x1004>; |
39 | interrupts = <0 142 IRQ_TYPE_LEVEL_HIGH>, |
40 | <0 142 IRQ_TYPE_LEVEL_HIGH>; |
41 | @@ -55,7 +55,7 @@ Example: R8A7790 (R-Car H2) CMT0 and CMT1 nodes |
42 | }; |
43 | |
44 | cmt1: timer@e6130000 { |
45 | - compatible = "renesas,cmt1-r8a7790", "renesas,rcar-gen2-cmt1"; |
46 | + compatible = "renesas,r8a7790-cmt1", "renesas,rcar-gen2-cmt1"; |
47 | reg = <0 0xe6130000 0 0x1004>; |
48 | interrupts = <0 120 IRQ_TYPE_LEVEL_HIGH>, |
49 | <0 121 IRQ_TYPE_LEVEL_HIGH>, |
50 | diff --git a/Makefile b/Makefile |
51 | index ba1648c093fe..43ac7bdb10ad 100644 |
52 | --- a/Makefile |
53 | +++ b/Makefile |
54 | @@ -1,7 +1,7 @@ |
55 | # SPDX-License-Identifier: GPL-2.0 |
56 | VERSION = 4 |
57 | PATCHLEVEL = 14 |
58 | -SUBLEVEL = 4 |
59 | +SUBLEVEL = 5 |
60 | EXTRAVERSION = |
61 | NAME = Petit Gorille |
62 | |
63 | diff --git a/arch/Kconfig b/arch/Kconfig |
64 | index 057370a0ac4e..400b9e1b2f27 100644 |
65 | --- a/arch/Kconfig |
66 | +++ b/arch/Kconfig |
67 | @@ -91,7 +91,7 @@ config STATIC_KEYS_SELFTEST |
68 | config OPTPROBES |
69 | def_bool y |
70 | depends on KPROBES && HAVE_OPTPROBES |
71 | - depends on !PREEMPT |
72 | + select TASKS_RCU if PREEMPT |
73 | |
74 | config KPROBES_ON_FTRACE |
75 | def_bool y |
76 | diff --git a/arch/m68k/mm/mcfmmu.c b/arch/m68k/mm/mcfmmu.c |
77 | index 8d1408583cf4..b523a604cb87 100644 |
78 | --- a/arch/m68k/mm/mcfmmu.c |
79 | +++ b/arch/m68k/mm/mcfmmu.c |
80 | @@ -170,7 +170,7 @@ void __init cf_bootmem_alloc(void) |
81 | max_pfn = max_low_pfn = PFN_DOWN(_ramend); |
82 | high_memory = (void *)_ramend; |
83 | |
84 | - m68k_virt_to_node_shift = fls(_ramend - _rambase - 1) - 6; |
85 | + m68k_virt_to_node_shift = fls(_ramend - 1) - 6; |
86 | module_fixup(NULL, __start_fixup, __stop_fixup); |
87 | |
88 | /* setup bootmem data */ |
89 | diff --git a/arch/mips/include/asm/Kbuild b/arch/mips/include/asm/Kbuild |
90 | index 7c8aab23bce8..b1f66699677d 100644 |
91 | --- a/arch/mips/include/asm/Kbuild |
92 | +++ b/arch/mips/include/asm/Kbuild |
93 | @@ -16,7 +16,6 @@ generic-y += qrwlock.h |
94 | generic-y += qspinlock.h |
95 | generic-y += sections.h |
96 | generic-y += segment.h |
97 | -generic-y += serial.h |
98 | generic-y += trace_clock.h |
99 | generic-y += unaligned.h |
100 | generic-y += user.h |
101 | diff --git a/arch/mips/include/asm/serial.h b/arch/mips/include/asm/serial.h |
102 | new file mode 100644 |
103 | index 000000000000..1d830c6666c2 |
104 | --- /dev/null |
105 | +++ b/arch/mips/include/asm/serial.h |
106 | @@ -0,0 +1,22 @@ |
107 | +/* |
108 | + * Copyright (C) 2017 MIPS Tech, LLC |
109 | + * |
110 | + * This program is free software; you can redistribute it and/or modify it |
111 | + * under the terms of the GNU General Public License as published by the |
112 | + * Free Software Foundation; either version 2 of the License, or (at your |
113 | + * option) any later version. |
114 | + */ |
115 | +#ifndef __ASM__SERIAL_H |
116 | +#define __ASM__SERIAL_H |
117 | + |
118 | +#ifdef CONFIG_MIPS_GENERIC |
119 | +/* |
120 | + * Generic kernels cannot know a correct value for all platforms at |
121 | + * compile time. Set it to 0 to prevent 8250_early using it |
122 | + */ |
123 | +#define BASE_BAUD 0 |
124 | +#else |
125 | +#include <asm-generic/serial.h> |
126 | +#endif |
127 | + |
128 | +#endif /* __ASM__SERIAL_H */ |
129 | diff --git a/arch/powerpc/kernel/kprobes-ftrace.c b/arch/powerpc/kernel/kprobes-ftrace.c |
130 | index 6c089d9757c9..2d81404f818c 100644 |
131 | --- a/arch/powerpc/kernel/kprobes-ftrace.c |
132 | +++ b/arch/powerpc/kernel/kprobes-ftrace.c |
133 | @@ -65,6 +65,7 @@ void kprobe_ftrace_handler(unsigned long nip, unsigned long parent_nip, |
134 | /* Disable irq for emulating a breakpoint and avoiding preempt */ |
135 | local_irq_save(flags); |
136 | hard_irq_disable(); |
137 | + preempt_disable(); |
138 | |
139 | p = get_kprobe((kprobe_opcode_t *)nip); |
140 | if (unlikely(!p) || kprobe_disabled(p)) |
141 | @@ -86,12 +87,18 @@ void kprobe_ftrace_handler(unsigned long nip, unsigned long parent_nip, |
142 | kcb->kprobe_status = KPROBE_HIT_ACTIVE; |
143 | if (!p->pre_handler || !p->pre_handler(p, regs)) |
144 | __skip_singlestep(p, regs, kcb, orig_nip); |
145 | - /* |
146 | - * If pre_handler returns !0, it sets regs->nip and |
147 | - * resets current kprobe. |
148 | - */ |
149 | + else { |
150 | + /* |
151 | + * If pre_handler returns !0, it sets regs->nip and |
152 | + * resets current kprobe. In this case, we still need |
153 | + * to restore irq, but not preemption. |
154 | + */ |
155 | + local_irq_restore(flags); |
156 | + return; |
157 | + } |
158 | } |
159 | end: |
160 | + preempt_enable_no_resched(); |
161 | local_irq_restore(flags); |
162 | } |
163 | NOKPROBE_SYMBOL(kprobe_ftrace_handler); |
164 | diff --git a/arch/powerpc/kernel/optprobes.c b/arch/powerpc/kernel/optprobes.c |
165 | index 91e037ab20a1..60ba7f1370a8 100644 |
166 | --- a/arch/powerpc/kernel/optprobes.c |
167 | +++ b/arch/powerpc/kernel/optprobes.c |
168 | @@ -115,7 +115,6 @@ static unsigned long can_optimize(struct kprobe *p) |
169 | static void optimized_callback(struct optimized_kprobe *op, |
170 | struct pt_regs *regs) |
171 | { |
172 | - struct kprobe_ctlblk *kcb = get_kprobe_ctlblk(); |
173 | unsigned long flags; |
174 | |
175 | /* This is possible if op is under delayed unoptimizing */ |
176 | @@ -124,13 +123,14 @@ static void optimized_callback(struct optimized_kprobe *op, |
177 | |
178 | local_irq_save(flags); |
179 | hard_irq_disable(); |
180 | + preempt_disable(); |
181 | |
182 | if (kprobe_running()) { |
183 | kprobes_inc_nmissed_count(&op->kp); |
184 | } else { |
185 | __this_cpu_write(current_kprobe, &op->kp); |
186 | regs->nip = (unsigned long)op->kp.addr; |
187 | - kcb->kprobe_status = KPROBE_HIT_ACTIVE; |
188 | + get_kprobe_ctlblk()->kprobe_status = KPROBE_HIT_ACTIVE; |
189 | opt_pre_handler(&op->kp, regs); |
190 | __this_cpu_write(current_kprobe, NULL); |
191 | } |
192 | @@ -140,6 +140,7 @@ static void optimized_callback(struct optimized_kprobe *op, |
193 | * local_irq_restore() will re-enable interrupts, |
194 | * if they were hard disabled. |
195 | */ |
196 | + preempt_enable_no_resched(); |
197 | local_irq_restore(flags); |
198 | } |
199 | NOKPROBE_SYMBOL(optimized_callback); |
200 | diff --git a/arch/s390/include/asm/pci_insn.h b/arch/s390/include/asm/pci_insn.h |
201 | index 419e83fa4721..ba22a6ea51a1 100644 |
202 | --- a/arch/s390/include/asm/pci_insn.h |
203 | +++ b/arch/s390/include/asm/pci_insn.h |
204 | @@ -82,6 +82,6 @@ int zpci_refresh_trans(u64 fn, u64 addr, u64 range); |
205 | int zpci_load(u64 *data, u64 req, u64 offset); |
206 | int zpci_store(u64 data, u64 req, u64 offset); |
207 | int zpci_store_block(const u64 *data, u64 req, u64 offset); |
208 | -void zpci_set_irq_ctrl(u16 ctl, char *unused, u8 isc); |
209 | +int zpci_set_irq_ctrl(u16 ctl, char *unused, u8 isc); |
210 | |
211 | #endif |
212 | diff --git a/arch/s390/include/asm/runtime_instr.h b/arch/s390/include/asm/runtime_instr.h |
213 | index ea8896ba5afc..2502d05403ef 100644 |
214 | --- a/arch/s390/include/asm/runtime_instr.h |
215 | +++ b/arch/s390/include/asm/runtime_instr.h |
216 | @@ -86,6 +86,8 @@ static inline void restore_ri_cb(struct runtime_instr_cb *cb_next, |
217 | load_runtime_instr_cb(&runtime_instr_empty_cb); |
218 | } |
219 | |
220 | -void exit_thread_runtime_instr(void); |
221 | +struct task_struct; |
222 | + |
223 | +void runtime_instr_release(struct task_struct *tsk); |
224 | |
225 | #endif /* _RUNTIME_INSTR_H */ |
226 | diff --git a/arch/s390/kernel/process.c b/arch/s390/kernel/process.c |
227 | index 203b7cd7c348..7d4c5500c6c2 100644 |
228 | --- a/arch/s390/kernel/process.c |
229 | +++ b/arch/s390/kernel/process.c |
230 | @@ -49,10 +49,8 @@ extern void kernel_thread_starter(void); |
231 | */ |
232 | void exit_thread(struct task_struct *tsk) |
233 | { |
234 | - if (tsk == current) { |
235 | - exit_thread_runtime_instr(); |
236 | + if (tsk == current) |
237 | exit_thread_gs(); |
238 | - } |
239 | } |
240 | |
241 | void flush_thread(void) |
242 | @@ -65,6 +63,7 @@ void release_thread(struct task_struct *dead_task) |
243 | |
244 | void arch_release_task_struct(struct task_struct *tsk) |
245 | { |
246 | + runtime_instr_release(tsk); |
247 | } |
248 | |
249 | int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src) |
250 | diff --git a/arch/s390/kernel/ptrace.c b/arch/s390/kernel/ptrace.c |
251 | index 1427d60ce628..56e0190d6e65 100644 |
252 | --- a/arch/s390/kernel/ptrace.c |
253 | +++ b/arch/s390/kernel/ptrace.c |
254 | @@ -1172,26 +1172,37 @@ static int s390_gs_cb_set(struct task_struct *target, |
255 | unsigned int pos, unsigned int count, |
256 | const void *kbuf, const void __user *ubuf) |
257 | { |
258 | - struct gs_cb *data = target->thread.gs_cb; |
259 | + struct gs_cb gs_cb = { }, *data = NULL; |
260 | int rc; |
261 | |
262 | if (!MACHINE_HAS_GS) |
263 | return -ENODEV; |
264 | - if (!data) { |
265 | + if (!target->thread.gs_cb) { |
266 | data = kzalloc(sizeof(*data), GFP_KERNEL); |
267 | if (!data) |
268 | return -ENOMEM; |
269 | - data->gsd = 25; |
270 | - target->thread.gs_cb = data; |
271 | - if (target == current) |
272 | - __ctl_set_bit(2, 4); |
273 | - } else if (target == current) { |
274 | - save_gs_cb(data); |
275 | } |
276 | + if (!target->thread.gs_cb) |
277 | + gs_cb.gsd = 25; |
278 | + else if (target == current) |
279 | + save_gs_cb(&gs_cb); |
280 | + else |
281 | + gs_cb = *target->thread.gs_cb; |
282 | rc = user_regset_copyin(&pos, &count, &kbuf, &ubuf, |
283 | - data, 0, sizeof(struct gs_cb)); |
284 | - if (target == current) |
285 | - restore_gs_cb(data); |
286 | + &gs_cb, 0, sizeof(gs_cb)); |
287 | + if (rc) { |
288 | + kfree(data); |
289 | + return -EFAULT; |
290 | + } |
291 | + preempt_disable(); |
292 | + if (!target->thread.gs_cb) |
293 | + target->thread.gs_cb = data; |
294 | + *target->thread.gs_cb = gs_cb; |
295 | + if (target == current) { |
296 | + __ctl_set_bit(2, 4); |
297 | + restore_gs_cb(target->thread.gs_cb); |
298 | + } |
299 | + preempt_enable(); |
300 | return rc; |
301 | } |
302 | |
303 | diff --git a/arch/s390/kernel/runtime_instr.c b/arch/s390/kernel/runtime_instr.c |
304 | index d85c64821a6b..94c9ba72cf83 100644 |
305 | --- a/arch/s390/kernel/runtime_instr.c |
306 | +++ b/arch/s390/kernel/runtime_instr.c |
307 | @@ -21,11 +21,24 @@ |
308 | /* empty control block to disable RI by loading it */ |
309 | struct runtime_instr_cb runtime_instr_empty_cb; |
310 | |
311 | +void runtime_instr_release(struct task_struct *tsk) |
312 | +{ |
313 | + kfree(tsk->thread.ri_cb); |
314 | +} |
315 | + |
316 | static void disable_runtime_instr(void) |
317 | { |
318 | - struct pt_regs *regs = task_pt_regs(current); |
319 | + struct task_struct *task = current; |
320 | + struct pt_regs *regs; |
321 | |
322 | + if (!task->thread.ri_cb) |
323 | + return; |
324 | + regs = task_pt_regs(task); |
325 | + preempt_disable(); |
326 | load_runtime_instr_cb(&runtime_instr_empty_cb); |
327 | + kfree(task->thread.ri_cb); |
328 | + task->thread.ri_cb = NULL; |
329 | + preempt_enable(); |
330 | |
331 | /* |
332 | * Make sure the RI bit is deleted from the PSW. If the user did not |
333 | @@ -46,19 +59,6 @@ static void init_runtime_instr_cb(struct runtime_instr_cb *cb) |
334 | cb->valid = 1; |
335 | } |
336 | |
337 | -void exit_thread_runtime_instr(void) |
338 | -{ |
339 | - struct task_struct *task = current; |
340 | - |
341 | - preempt_disable(); |
342 | - if (!task->thread.ri_cb) |
343 | - return; |
344 | - disable_runtime_instr(); |
345 | - kfree(task->thread.ri_cb); |
346 | - task->thread.ri_cb = NULL; |
347 | - preempt_enable(); |
348 | -} |
349 | - |
350 | SYSCALL_DEFINE1(s390_runtime_instr, int, command) |
351 | { |
352 | struct runtime_instr_cb *cb; |
353 | @@ -67,7 +67,7 @@ SYSCALL_DEFINE1(s390_runtime_instr, int, command) |
354 | return -EOPNOTSUPP; |
355 | |
356 | if (command == S390_RUNTIME_INSTR_STOP) { |
357 | - exit_thread_runtime_instr(); |
358 | + disable_runtime_instr(); |
359 | return 0; |
360 | } |
361 | |
362 | diff --git a/arch/s390/pci/pci.c b/arch/s390/pci/pci.c |
363 | index a25d95a6612d..0fe649c0d542 100644 |
364 | --- a/arch/s390/pci/pci.c |
365 | +++ b/arch/s390/pci/pci.c |
366 | @@ -368,7 +368,8 @@ static void zpci_irq_handler(struct airq_struct *airq) |
367 | /* End of second scan with interrupts on. */ |
368 | break; |
369 | /* First scan complete, reenable interrupts. */ |
370 | - zpci_set_irq_ctrl(SIC_IRQ_MODE_SINGLE, NULL, PCI_ISC); |
371 | + if (zpci_set_irq_ctrl(SIC_IRQ_MODE_SINGLE, NULL, PCI_ISC)) |
372 | + break; |
373 | si = 0; |
374 | continue; |
375 | } |
376 | @@ -956,7 +957,7 @@ static int __init pci_base_init(void) |
377 | if (!s390_pci_probe) |
378 | return 0; |
379 | |
380 | - if (!test_facility(69) || !test_facility(71) || !test_facility(72)) |
381 | + if (!test_facility(69) || !test_facility(71)) |
382 | return 0; |
383 | |
384 | rc = zpci_debug_init(); |
385 | diff --git a/arch/s390/pci/pci_insn.c b/arch/s390/pci/pci_insn.c |
386 | index ea34086c8674..81b840bc6e4e 100644 |
387 | --- a/arch/s390/pci/pci_insn.c |
388 | +++ b/arch/s390/pci/pci_insn.c |
389 | @@ -7,6 +7,7 @@ |
390 | #include <linux/export.h> |
391 | #include <linux/errno.h> |
392 | #include <linux/delay.h> |
393 | +#include <asm/facility.h> |
394 | #include <asm/pci_insn.h> |
395 | #include <asm/pci_debug.h> |
396 | #include <asm/processor.h> |
397 | @@ -91,11 +92,14 @@ int zpci_refresh_trans(u64 fn, u64 addr, u64 range) |
398 | } |
399 | |
400 | /* Set Interruption Controls */ |
401 | -void zpci_set_irq_ctrl(u16 ctl, char *unused, u8 isc) |
402 | +int zpci_set_irq_ctrl(u16 ctl, char *unused, u8 isc) |
403 | { |
404 | + if (!test_facility(72)) |
405 | + return -EIO; |
406 | asm volatile ( |
407 | " .insn rsy,0xeb00000000d1,%[ctl],%[isc],%[u]\n" |
408 | : : [ctl] "d" (ctl), [isc] "d" (isc << 27), [u] "Q" (*unused)); |
409 | + return 0; |
410 | } |
411 | |
412 | /* PCI Load */ |
413 | diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig |
414 | index 2fdb23313dd5..9bceea6a5852 100644 |
415 | --- a/arch/x86/Kconfig |
416 | +++ b/arch/x86/Kconfig |
417 | @@ -56,7 +56,7 @@ config X86 |
418 | select ARCH_HAS_KCOV if X86_64 |
419 | select ARCH_HAS_PMEM_API if X86_64 |
420 | # Causing hangs/crashes, see the commit that added this change for details. |
421 | - select ARCH_HAS_REFCOUNT if BROKEN |
422 | + select ARCH_HAS_REFCOUNT |
423 | select ARCH_HAS_UACCESS_FLUSHCACHE if X86_64 |
424 | select ARCH_HAS_SET_MEMORY |
425 | select ARCH_HAS_SG_CHAIN |
426 | diff --git a/arch/x86/include/asm/refcount.h b/arch/x86/include/asm/refcount.h |
427 | index ff871210b9f2..4e44250e7d0d 100644 |
428 | --- a/arch/x86/include/asm/refcount.h |
429 | +++ b/arch/x86/include/asm/refcount.h |
430 | @@ -15,7 +15,7 @@ |
431 | * back to the regular execution flow in .text. |
432 | */ |
433 | #define _REFCOUNT_EXCEPTION \ |
434 | - ".pushsection .text.unlikely\n" \ |
435 | + ".pushsection .text..refcount\n" \ |
436 | "111:\tlea %[counter], %%" _ASM_CX "\n" \ |
437 | "112:\t" ASM_UD0 "\n" \ |
438 | ASM_UNREACHABLE \ |
439 | diff --git a/arch/x86/include/asm/syscalls.h b/arch/x86/include/asm/syscalls.h |
440 | index 91dfcafe27a6..bad25bb80679 100644 |
441 | --- a/arch/x86/include/asm/syscalls.h |
442 | +++ b/arch/x86/include/asm/syscalls.h |
443 | @@ -21,7 +21,7 @@ asmlinkage long sys_ioperm(unsigned long, unsigned long, int); |
444 | asmlinkage long sys_iopl(unsigned int); |
445 | |
446 | /* kernel/ldt.c */ |
447 | -asmlinkage int sys_modify_ldt(int, void __user *, unsigned long); |
448 | +asmlinkage long sys_modify_ldt(int, void __user *, unsigned long); |
449 | |
450 | /* kernel/signal.c */ |
451 | asmlinkage long sys_rt_sigreturn(void); |
452 | diff --git a/arch/x86/kernel/cpu/intel_rdt.c b/arch/x86/kernel/cpu/intel_rdt.c |
453 | index cd5fc61ba450..88dcf8479013 100644 |
454 | --- a/arch/x86/kernel/cpu/intel_rdt.c |
455 | +++ b/arch/x86/kernel/cpu/intel_rdt.c |
456 | @@ -267,6 +267,7 @@ static void rdt_get_cdp_l3_config(int type) |
457 | r->num_closid = r_l3->num_closid / 2; |
458 | r->cache.cbm_len = r_l3->cache.cbm_len; |
459 | r->default_ctrl = r_l3->default_ctrl; |
460 | + r->cache.shareable_bits = r_l3->cache.shareable_bits; |
461 | r->data_width = (r->cache.cbm_len + 3) / 4; |
462 | r->alloc_capable = true; |
463 | /* |
464 | diff --git a/arch/x86/kernel/cpu/intel_rdt_rdtgroup.c b/arch/x86/kernel/cpu/intel_rdt_rdtgroup.c |
465 | index a869d4a073c5..3d433af856a5 100644 |
466 | --- a/arch/x86/kernel/cpu/intel_rdt_rdtgroup.c |
467 | +++ b/arch/x86/kernel/cpu/intel_rdt_rdtgroup.c |
468 | @@ -1081,6 +1081,7 @@ static struct dentry *rdt_mount(struct file_system_type *fs_type, |
469 | struct dentry *dentry; |
470 | int ret; |
471 | |
472 | + cpus_read_lock(); |
473 | mutex_lock(&rdtgroup_mutex); |
474 | /* |
475 | * resctrl file system can only be mounted once. |
476 | @@ -1130,12 +1131,12 @@ static struct dentry *rdt_mount(struct file_system_type *fs_type, |
477 | goto out_mondata; |
478 | |
479 | if (rdt_alloc_capable) |
480 | - static_branch_enable(&rdt_alloc_enable_key); |
481 | + static_branch_enable_cpuslocked(&rdt_alloc_enable_key); |
482 | if (rdt_mon_capable) |
483 | - static_branch_enable(&rdt_mon_enable_key); |
484 | + static_branch_enable_cpuslocked(&rdt_mon_enable_key); |
485 | |
486 | if (rdt_alloc_capable || rdt_mon_capable) |
487 | - static_branch_enable(&rdt_enable_key); |
488 | + static_branch_enable_cpuslocked(&rdt_enable_key); |
489 | |
490 | if (is_mbm_enabled()) { |
491 | r = &rdt_resources_all[RDT_RESOURCE_L3]; |
492 | @@ -1157,6 +1158,7 @@ static struct dentry *rdt_mount(struct file_system_type *fs_type, |
493 | cdp_disable(); |
494 | out: |
495 | mutex_unlock(&rdtgroup_mutex); |
496 | + cpus_read_unlock(); |
497 | |
498 | return dentry; |
499 | } |
500 | diff --git a/arch/x86/kernel/kprobes/ftrace.c b/arch/x86/kernel/kprobes/ftrace.c |
501 | index 041f7b6dfa0f..bcfee4f69b0e 100644 |
502 | --- a/arch/x86/kernel/kprobes/ftrace.c |
503 | +++ b/arch/x86/kernel/kprobes/ftrace.c |
504 | @@ -26,7 +26,7 @@ |
505 | #include "common.h" |
506 | |
507 | static nokprobe_inline |
508 | -int __skip_singlestep(struct kprobe *p, struct pt_regs *regs, |
509 | +void __skip_singlestep(struct kprobe *p, struct pt_regs *regs, |
510 | struct kprobe_ctlblk *kcb, unsigned long orig_ip) |
511 | { |
512 | /* |
513 | @@ -41,20 +41,21 @@ int __skip_singlestep(struct kprobe *p, struct pt_regs *regs, |
514 | __this_cpu_write(current_kprobe, NULL); |
515 | if (orig_ip) |
516 | regs->ip = orig_ip; |
517 | - return 1; |
518 | } |
519 | |
520 | int skip_singlestep(struct kprobe *p, struct pt_regs *regs, |
521 | struct kprobe_ctlblk *kcb) |
522 | { |
523 | - if (kprobe_ftrace(p)) |
524 | - return __skip_singlestep(p, regs, kcb, 0); |
525 | - else |
526 | - return 0; |
527 | + if (kprobe_ftrace(p)) { |
528 | + __skip_singlestep(p, regs, kcb, 0); |
529 | + preempt_enable_no_resched(); |
530 | + return 1; |
531 | + } |
532 | + return 0; |
533 | } |
534 | NOKPROBE_SYMBOL(skip_singlestep); |
535 | |
536 | -/* Ftrace callback handler for kprobes */ |
537 | +/* Ftrace callback handler for kprobes -- called under preepmt disabed */ |
538 | void kprobe_ftrace_handler(unsigned long ip, unsigned long parent_ip, |
539 | struct ftrace_ops *ops, struct pt_regs *regs) |
540 | { |
541 | @@ -77,13 +78,17 @@ void kprobe_ftrace_handler(unsigned long ip, unsigned long parent_ip, |
542 | /* Kprobe handler expects regs->ip = ip + 1 as breakpoint hit */ |
543 | regs->ip = ip + sizeof(kprobe_opcode_t); |
544 | |
545 | + /* To emulate trap based kprobes, preempt_disable here */ |
546 | + preempt_disable(); |
547 | __this_cpu_write(current_kprobe, p); |
548 | kcb->kprobe_status = KPROBE_HIT_ACTIVE; |
549 | - if (!p->pre_handler || !p->pre_handler(p, regs)) |
550 | + if (!p->pre_handler || !p->pre_handler(p, regs)) { |
551 | __skip_singlestep(p, regs, kcb, orig_ip); |
552 | + preempt_enable_no_resched(); |
553 | + } |
554 | /* |
555 | * If pre_handler returns !0, it sets regs->ip and |
556 | - * resets current kprobe. |
557 | + * resets current kprobe, and keep preempt count +1. |
558 | */ |
559 | } |
560 | end: |
561 | diff --git a/arch/x86/kernel/ldt.c b/arch/x86/kernel/ldt.c |
562 | index 4d17bacf4030..ae5615b03def 100644 |
563 | --- a/arch/x86/kernel/ldt.c |
564 | +++ b/arch/x86/kernel/ldt.c |
565 | @@ -13,6 +13,7 @@ |
566 | #include <linux/string.h> |
567 | #include <linux/mm.h> |
568 | #include <linux/smp.h> |
569 | +#include <linux/syscalls.h> |
570 | #include <linux/slab.h> |
571 | #include <linux/vmalloc.h> |
572 | #include <linux/uaccess.h> |
573 | @@ -295,8 +296,8 @@ static int write_ldt(void __user *ptr, unsigned long bytecount, int oldmode) |
574 | return error; |
575 | } |
576 | |
577 | -asmlinkage int sys_modify_ldt(int func, void __user *ptr, |
578 | - unsigned long bytecount) |
579 | +SYSCALL_DEFINE3(modify_ldt, int , func , void __user * , ptr , |
580 | + unsigned long , bytecount) |
581 | { |
582 | int ret = -ENOSYS; |
583 | |
584 | @@ -314,5 +315,14 @@ asmlinkage int sys_modify_ldt(int func, void __user *ptr, |
585 | ret = write_ldt(ptr, bytecount, 0); |
586 | break; |
587 | } |
588 | - return ret; |
589 | + /* |
590 | + * The SYSCALL_DEFINE() macros give us an 'unsigned long' |
591 | + * return type, but tht ABI for sys_modify_ldt() expects |
592 | + * 'int'. This cast gives us an int-sized value in %rax |
593 | + * for the return code. The 'unsigned' is necessary so |
594 | + * the compiler does not try to sign-extend the negative |
595 | + * return codes into the high half of the register when |
596 | + * taking the value from int->long. |
597 | + */ |
598 | + return (unsigned int)ret; |
599 | } |
600 | diff --git a/arch/x86/mm/extable.c b/arch/x86/mm/extable.c |
601 | index c3521e2be396..30bc4812ceb8 100644 |
602 | --- a/arch/x86/mm/extable.c |
603 | +++ b/arch/x86/mm/extable.c |
604 | @@ -67,17 +67,22 @@ bool ex_handler_refcount(const struct exception_table_entry *fixup, |
605 | * wrapped around) will be set. Additionally, seeing the refcount |
606 | * reach 0 will set ZF (Zero Flag: result was zero). In each of |
607 | * these cases we want a report, since it's a boundary condition. |
608 | - * |
609 | + * The SF case is not reported since it indicates post-boundary |
610 | + * manipulations below zero or above INT_MAX. And if none of the |
611 | + * flags are set, something has gone very wrong, so report it. |
612 | */ |
613 | if (regs->flags & (X86_EFLAGS_OF | X86_EFLAGS_ZF)) { |
614 | bool zero = regs->flags & X86_EFLAGS_ZF; |
615 | |
616 | refcount_error_report(regs, zero ? "hit zero" : "overflow"); |
617 | + } else if ((regs->flags & X86_EFLAGS_SF) == 0) { |
618 | + /* Report if none of OF, ZF, nor SF are set. */ |
619 | + refcount_error_report(regs, "unexpected saturation"); |
620 | } |
621 | |
622 | return true; |
623 | } |
624 | -EXPORT_SYMBOL_GPL(ex_handler_refcount); |
625 | +EXPORT_SYMBOL(ex_handler_refcount); |
626 | |
627 | /* |
628 | * Handler for when we fail to restore a task's FPU state. We should never get |
629 | diff --git a/arch/x86/um/ldt.c b/arch/x86/um/ldt.c |
630 | index 836a1eb5df43..3ee234b6234d 100644 |
631 | --- a/arch/x86/um/ldt.c |
632 | +++ b/arch/x86/um/ldt.c |
633 | @@ -6,6 +6,7 @@ |
634 | #include <linux/mm.h> |
635 | #include <linux/sched.h> |
636 | #include <linux/slab.h> |
637 | +#include <linux/syscalls.h> |
638 | #include <linux/uaccess.h> |
639 | #include <asm/unistd.h> |
640 | #include <os.h> |
641 | @@ -369,7 +370,9 @@ void free_ldt(struct mm_context *mm) |
642 | mm->arch.ldt.entry_count = 0; |
643 | } |
644 | |
645 | -int sys_modify_ldt(int func, void __user *ptr, unsigned long bytecount) |
646 | +SYSCALL_DEFINE3(modify_ldt, int , func , void __user * , ptr , |
647 | + unsigned long , bytecount) |
648 | { |
649 | - return do_modify_ldt_skas(func, ptr, bytecount); |
650 | + /* See non-um modify_ldt() for why we do this cast */ |
651 | + return (unsigned int)do_modify_ldt_skas(func, ptr, bytecount); |
652 | } |
653 | diff --git a/drivers/android/binder.c b/drivers/android/binder.c |
654 | index fddf76ef5bd6..88b4bbe58100 100644 |
655 | --- a/drivers/android/binder.c |
656 | +++ b/drivers/android/binder.c |
657 | @@ -1947,6 +1947,26 @@ static void binder_send_failed_reply(struct binder_transaction *t, |
658 | } |
659 | } |
660 | |
661 | +/** |
662 | + * binder_cleanup_transaction() - cleans up undelivered transaction |
663 | + * @t: transaction that needs to be cleaned up |
664 | + * @reason: reason the transaction wasn't delivered |
665 | + * @error_code: error to return to caller (if synchronous call) |
666 | + */ |
667 | +static void binder_cleanup_transaction(struct binder_transaction *t, |
668 | + const char *reason, |
669 | + uint32_t error_code) |
670 | +{ |
671 | + if (t->buffer->target_node && !(t->flags & TF_ONE_WAY)) { |
672 | + binder_send_failed_reply(t, error_code); |
673 | + } else { |
674 | + binder_debug(BINDER_DEBUG_DEAD_TRANSACTION, |
675 | + "undelivered transaction %d, %s\n", |
676 | + t->debug_id, reason); |
677 | + binder_free_transaction(t); |
678 | + } |
679 | +} |
680 | + |
681 | /** |
682 | * binder_validate_object() - checks for a valid metadata object in a buffer. |
683 | * @buffer: binder_buffer that we're parsing. |
684 | @@ -4015,12 +4035,20 @@ static int binder_thread_read(struct binder_proc *proc, |
685 | if (put_user(cmd, (uint32_t __user *)ptr)) { |
686 | if (t_from) |
687 | binder_thread_dec_tmpref(t_from); |
688 | + |
689 | + binder_cleanup_transaction(t, "put_user failed", |
690 | + BR_FAILED_REPLY); |
691 | + |
692 | return -EFAULT; |
693 | } |
694 | ptr += sizeof(uint32_t); |
695 | if (copy_to_user(ptr, &tr, sizeof(tr))) { |
696 | if (t_from) |
697 | binder_thread_dec_tmpref(t_from); |
698 | + |
699 | + binder_cleanup_transaction(t, "copy_to_user failed", |
700 | + BR_FAILED_REPLY); |
701 | + |
702 | return -EFAULT; |
703 | } |
704 | ptr += sizeof(tr); |
705 | @@ -4090,15 +4118,9 @@ static void binder_release_work(struct binder_proc *proc, |
706 | struct binder_transaction *t; |
707 | |
708 | t = container_of(w, struct binder_transaction, work); |
709 | - if (t->buffer->target_node && |
710 | - !(t->flags & TF_ONE_WAY)) { |
711 | - binder_send_failed_reply(t, BR_DEAD_REPLY); |
712 | - } else { |
713 | - binder_debug(BINDER_DEBUG_DEAD_TRANSACTION, |
714 | - "undelivered transaction %d\n", |
715 | - t->debug_id); |
716 | - binder_free_transaction(t); |
717 | - } |
718 | + |
719 | + binder_cleanup_transaction(t, "process died.", |
720 | + BR_DEAD_REPLY); |
721 | } break; |
722 | case BINDER_WORK_RETURN_ERROR: { |
723 | struct binder_error *e = container_of( |
724 | diff --git a/drivers/base/power/domain.c b/drivers/base/power/domain.c |
725 | index e8ca5e2cf1e5..70f8904f46a3 100644 |
726 | --- a/drivers/base/power/domain.c |
727 | +++ b/drivers/base/power/domain.c |
728 | @@ -921,7 +921,7 @@ static int pm_genpd_prepare(struct device *dev) |
729 | genpd_unlock(genpd); |
730 | |
731 | ret = pm_generic_prepare(dev); |
732 | - if (ret) { |
733 | + if (ret < 0) { |
734 | genpd_lock(genpd); |
735 | |
736 | genpd->prepared_count--; |
737 | @@ -929,7 +929,8 @@ static int pm_genpd_prepare(struct device *dev) |
738 | genpd_unlock(genpd); |
739 | } |
740 | |
741 | - return ret; |
742 | + /* Never return 1, as genpd don't cope with the direct_complete path. */ |
743 | + return ret >= 0 ? 0 : ret; |
744 | } |
745 | |
746 | /** |
747 | diff --git a/drivers/clocksource/arm_arch_timer.c b/drivers/clocksource/arm_arch_timer.c |
748 | index fd4b7f684bd0..14e2419063e9 100644 |
749 | --- a/drivers/clocksource/arm_arch_timer.c |
750 | +++ b/drivers/clocksource/arm_arch_timer.c |
751 | @@ -1268,10 +1268,6 @@ arch_timer_mem_find_best_frame(struct arch_timer_mem *timer_mem) |
752 | |
753 | iounmap(cntctlbase); |
754 | |
755 | - if (!best_frame) |
756 | - pr_err("Unable to find a suitable frame in timer @ %pa\n", |
757 | - &timer_mem->cntctlbase); |
758 | - |
759 | return best_frame; |
760 | } |
761 | |
762 | @@ -1372,6 +1368,8 @@ static int __init arch_timer_mem_of_init(struct device_node *np) |
763 | |
764 | frame = arch_timer_mem_find_best_frame(timer_mem); |
765 | if (!frame) { |
766 | + pr_err("Unable to find a suitable frame in timer @ %pa\n", |
767 | + &timer_mem->cntctlbase); |
768 | ret = -EINVAL; |
769 | goto out; |
770 | } |
771 | @@ -1420,7 +1418,7 @@ arch_timer_mem_verify_cntfrq(struct arch_timer_mem *timer_mem) |
772 | static int __init arch_timer_mem_acpi_init(int platform_timer_count) |
773 | { |
774 | struct arch_timer_mem *timers, *timer; |
775 | - struct arch_timer_mem_frame *frame; |
776 | + struct arch_timer_mem_frame *frame, *best_frame = NULL; |
777 | int timer_count, i, ret = 0; |
778 | |
779 | timers = kcalloc(platform_timer_count, sizeof(*timers), |
780 | @@ -1432,14 +1430,6 @@ static int __init arch_timer_mem_acpi_init(int platform_timer_count) |
781 | if (ret || !timer_count) |
782 | goto out; |
783 | |
784 | - for (i = 0; i < timer_count; i++) { |
785 | - ret = arch_timer_mem_verify_cntfrq(&timers[i]); |
786 | - if (ret) { |
787 | - pr_err("Disabling MMIO timers due to CNTFRQ mismatch\n"); |
788 | - goto out; |
789 | - } |
790 | - } |
791 | - |
792 | /* |
793 | * While unlikely, it's theoretically possible that none of the frames |
794 | * in a timer expose the combination of feature we want. |
795 | @@ -1448,12 +1438,26 @@ static int __init arch_timer_mem_acpi_init(int platform_timer_count) |
796 | timer = &timers[i]; |
797 | |
798 | frame = arch_timer_mem_find_best_frame(timer); |
799 | - if (frame) |
800 | - break; |
801 | + if (!best_frame) |
802 | + best_frame = frame; |
803 | + |
804 | + ret = arch_timer_mem_verify_cntfrq(timer); |
805 | + if (ret) { |
806 | + pr_err("Disabling MMIO timers due to CNTFRQ mismatch\n"); |
807 | + goto out; |
808 | + } |
809 | + |
810 | + if (!best_frame) /* implies !frame */ |
811 | + /* |
812 | + * Only complain about missing suitable frames if we |
813 | + * haven't already found one in a previous iteration. |
814 | + */ |
815 | + pr_err("Unable to find a suitable frame in timer @ %pa\n", |
816 | + &timer->cntctlbase); |
817 | } |
818 | |
819 | - if (frame) |
820 | - ret = arch_timer_mem_frame_register(frame); |
821 | + if (best_frame) |
822 | + ret = arch_timer_mem_frame_register(best_frame); |
823 | out: |
824 | kfree(timers); |
825 | return ret; |
826 | diff --git a/drivers/cpuidle/cpuidle-arm.c b/drivers/cpuidle/cpuidle-arm.c |
827 | index 52a75053ee03..f47c54546752 100644 |
828 | --- a/drivers/cpuidle/cpuidle-arm.c |
829 | +++ b/drivers/cpuidle/cpuidle-arm.c |
830 | @@ -104,13 +104,13 @@ static int __init arm_idle_init(void) |
831 | ret = dt_init_idle_driver(drv, arm_idle_state_match, 1); |
832 | if (ret <= 0) { |
833 | ret = ret ? : -ENODEV; |
834 | - goto init_fail; |
835 | + goto out_kfree_drv; |
836 | } |
837 | |
838 | ret = cpuidle_register_driver(drv); |
839 | if (ret) { |
840 | pr_err("Failed to register cpuidle driver\n"); |
841 | - goto init_fail; |
842 | + goto out_kfree_drv; |
843 | } |
844 | |
845 | /* |
846 | @@ -128,14 +128,14 @@ static int __init arm_idle_init(void) |
847 | |
848 | if (ret) { |
849 | pr_err("CPU %d failed to init idle CPU ops\n", cpu); |
850 | - goto out_fail; |
851 | + goto out_unregister_drv; |
852 | } |
853 | |
854 | dev = kzalloc(sizeof(*dev), GFP_KERNEL); |
855 | if (!dev) { |
856 | pr_err("Failed to allocate cpuidle device\n"); |
857 | ret = -ENOMEM; |
858 | - goto out_fail; |
859 | + goto out_unregister_drv; |
860 | } |
861 | dev->cpu = cpu; |
862 | |
863 | @@ -143,21 +143,25 @@ static int __init arm_idle_init(void) |
864 | if (ret) { |
865 | pr_err("Failed to register cpuidle device for CPU %d\n", |
866 | cpu); |
867 | - kfree(dev); |
868 | - goto out_fail; |
869 | + goto out_kfree_dev; |
870 | } |
871 | } |
872 | |
873 | return 0; |
874 | -init_fail: |
875 | + |
876 | +out_kfree_dev: |
877 | + kfree(dev); |
878 | +out_unregister_drv: |
879 | + cpuidle_unregister_driver(drv); |
880 | +out_kfree_drv: |
881 | kfree(drv); |
882 | out_fail: |
883 | while (--cpu >= 0) { |
884 | dev = per_cpu(cpuidle_devices, cpu); |
885 | + drv = cpuidle_get_cpu_driver(dev); |
886 | cpuidle_unregister_device(dev); |
887 | - kfree(dev); |
888 | - drv = cpuidle_get_driver(); |
889 | cpuidle_unregister_driver(drv); |
890 | + kfree(dev); |
891 | kfree(drv); |
892 | } |
893 | |
894 | diff --git a/drivers/dma-buf/sw_sync.c b/drivers/dma-buf/sw_sync.c |
895 | index 38cc7389a6c1..24f83f9eeaed 100644 |
896 | --- a/drivers/dma-buf/sw_sync.c |
897 | +++ b/drivers/dma-buf/sw_sync.c |
898 | @@ -321,8 +321,16 @@ static int sw_sync_debugfs_open(struct inode *inode, struct file *file) |
899 | static int sw_sync_debugfs_release(struct inode *inode, struct file *file) |
900 | { |
901 | struct sync_timeline *obj = file->private_data; |
902 | + struct sync_pt *pt, *next; |
903 | + |
904 | + spin_lock_irq(&obj->lock); |
905 | + |
906 | + list_for_each_entry_safe(pt, next, &obj->pt_list, link) { |
907 | + dma_fence_set_error(&pt->base, -ENOENT); |
908 | + dma_fence_signal_locked(&pt->base); |
909 | + } |
910 | |
911 | - smp_wmb(); |
912 | + spin_unlock_irq(&obj->lock); |
913 | |
914 | sync_timeline_put(obj); |
915 | return 0; |
916 | diff --git a/drivers/edac/sb_edac.c b/drivers/edac/sb_edac.c |
917 | index 6241fa787d66..cd9d6ba03579 100644 |
918 | --- a/drivers/edac/sb_edac.c |
919 | +++ b/drivers/edac/sb_edac.c |
920 | @@ -2498,6 +2498,7 @@ static int ibridge_mci_bind_devs(struct mem_ctl_info *mci, |
921 | case PCI_DEVICE_ID_INTEL_IBRIDGE_IMC_HA0_TA: |
922 | case PCI_DEVICE_ID_INTEL_IBRIDGE_IMC_HA1_TA: |
923 | pvt->pci_ta = pdev; |
924 | + break; |
925 | case PCI_DEVICE_ID_INTEL_IBRIDGE_IMC_HA0_RAS: |
926 | case PCI_DEVICE_ID_INTEL_IBRIDGE_IMC_HA1_RAS: |
927 | pvt->pci_ras = pdev; |
928 | diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h |
929 | index 87801faaf264..712ad8c2bdc5 100644 |
930 | --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h |
931 | +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h |
932 | @@ -697,7 +697,7 @@ int amdgpu_queue_mgr_fini(struct amdgpu_device *adev, |
933 | struct amdgpu_queue_mgr *mgr); |
934 | int amdgpu_queue_mgr_map(struct amdgpu_device *adev, |
935 | struct amdgpu_queue_mgr *mgr, |
936 | - int hw_ip, int instance, int ring, |
937 | + u32 hw_ip, u32 instance, u32 ring, |
938 | struct amdgpu_ring **out_ring); |
939 | |
940 | /* |
941 | diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_queue_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_queue_mgr.c |
942 | index befc09b68543..b293380bd46c 100644 |
943 | --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_queue_mgr.c |
944 | +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_queue_mgr.c |
945 | @@ -63,7 +63,7 @@ static int amdgpu_update_cached_map(struct amdgpu_queue_mapper *mapper, |
946 | |
947 | static int amdgpu_identity_map(struct amdgpu_device *adev, |
948 | struct amdgpu_queue_mapper *mapper, |
949 | - int ring, |
950 | + u32 ring, |
951 | struct amdgpu_ring **out_ring) |
952 | { |
953 | switch (mapper->hw_ip) { |
954 | @@ -121,7 +121,7 @@ static enum amdgpu_ring_type amdgpu_hw_ip_to_ring_type(int hw_ip) |
955 | |
956 | static int amdgpu_lru_map(struct amdgpu_device *adev, |
957 | struct amdgpu_queue_mapper *mapper, |
958 | - int user_ring, |
959 | + u32 user_ring, |
960 | struct amdgpu_ring **out_ring) |
961 | { |
962 | int r, i, j; |
963 | @@ -208,7 +208,7 @@ int amdgpu_queue_mgr_fini(struct amdgpu_device *adev, |
964 | */ |
965 | int amdgpu_queue_mgr_map(struct amdgpu_device *adev, |
966 | struct amdgpu_queue_mgr *mgr, |
967 | - int hw_ip, int instance, int ring, |
968 | + u32 hw_ip, u32 instance, u32 ring, |
969 | struct amdgpu_ring **out_ring) |
970 | { |
971 | int r, ip_num_rings; |
972 | diff --git a/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c |
973 | index 58e9e0601a61..faf17b83b910 100644 |
974 | --- a/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c |
975 | +++ b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c |
976 | @@ -210,7 +210,6 @@ static int fsl_dcu_drm_pm_suspend(struct device *dev) |
977 | return PTR_ERR(fsl_dev->state); |
978 | } |
979 | |
980 | - clk_disable_unprepare(fsl_dev->pix_clk); |
981 | clk_disable_unprepare(fsl_dev->clk); |
982 | |
983 | return 0; |
984 | @@ -233,6 +232,7 @@ static int fsl_dcu_drm_pm_resume(struct device *dev) |
985 | if (fsl_dev->tcon) |
986 | fsl_tcon_bypass_enable(fsl_dev->tcon); |
987 | fsl_dcu_drm_init_planes(fsl_dev->drm); |
988 | + enable_irq(fsl_dev->irq); |
989 | drm_atomic_helper_resume(fsl_dev->drm, fsl_dev->state); |
990 | |
991 | console_lock(); |
992 | @@ -240,7 +240,6 @@ static int fsl_dcu_drm_pm_resume(struct device *dev) |
993 | console_unlock(); |
994 | |
995 | drm_kms_helper_poll_enable(fsl_dev->drm); |
996 | - enable_irq(fsl_dev->irq); |
997 | |
998 | return 0; |
999 | } |
1000 | diff --git a/drivers/hwmon/pmbus/pmbus.h b/drivers/hwmon/pmbus/pmbus.h |
1001 | index 4efa2bd4f6d8..fa613bd209e3 100644 |
1002 | --- a/drivers/hwmon/pmbus/pmbus.h |
1003 | +++ b/drivers/hwmon/pmbus/pmbus.h |
1004 | @@ -404,9 +404,9 @@ extern const struct regulator_ops pmbus_regulator_ops; |
1005 | /* Function declarations */ |
1006 | |
1007 | void pmbus_clear_cache(struct i2c_client *client); |
1008 | -int pmbus_set_page(struct i2c_client *client, u8 page); |
1009 | -int pmbus_read_word_data(struct i2c_client *client, u8 page, u8 reg); |
1010 | -int pmbus_write_word_data(struct i2c_client *client, u8 page, u8 reg, u16 word); |
1011 | +int pmbus_set_page(struct i2c_client *client, int page); |
1012 | +int pmbus_read_word_data(struct i2c_client *client, int page, u8 reg); |
1013 | +int pmbus_write_word_data(struct i2c_client *client, int page, u8 reg, u16 word); |
1014 | int pmbus_read_byte_data(struct i2c_client *client, int page, u8 reg); |
1015 | int pmbus_write_byte(struct i2c_client *client, int page, u8 value); |
1016 | int pmbus_write_byte_data(struct i2c_client *client, int page, u8 reg, |
1017 | diff --git a/drivers/hwmon/pmbus/pmbus_core.c b/drivers/hwmon/pmbus/pmbus_core.c |
1018 | index 302f0aef59de..52a58b8b6e1b 100644 |
1019 | --- a/drivers/hwmon/pmbus/pmbus_core.c |
1020 | +++ b/drivers/hwmon/pmbus/pmbus_core.c |
1021 | @@ -136,13 +136,13 @@ void pmbus_clear_cache(struct i2c_client *client) |
1022 | } |
1023 | EXPORT_SYMBOL_GPL(pmbus_clear_cache); |
1024 | |
1025 | -int pmbus_set_page(struct i2c_client *client, u8 page) |
1026 | +int pmbus_set_page(struct i2c_client *client, int page) |
1027 | { |
1028 | struct pmbus_data *data = i2c_get_clientdata(client); |
1029 | int rv = 0; |
1030 | int newpage; |
1031 | |
1032 | - if (page != data->currpage) { |
1033 | + if (page >= 0 && page != data->currpage) { |
1034 | rv = i2c_smbus_write_byte_data(client, PMBUS_PAGE, page); |
1035 | newpage = i2c_smbus_read_byte_data(client, PMBUS_PAGE); |
1036 | if (newpage != page) |
1037 | @@ -158,11 +158,9 @@ int pmbus_write_byte(struct i2c_client *client, int page, u8 value) |
1038 | { |
1039 | int rv; |
1040 | |
1041 | - if (page >= 0) { |
1042 | - rv = pmbus_set_page(client, page); |
1043 | - if (rv < 0) |
1044 | - return rv; |
1045 | - } |
1046 | + rv = pmbus_set_page(client, page); |
1047 | + if (rv < 0) |
1048 | + return rv; |
1049 | |
1050 | return i2c_smbus_write_byte(client, value); |
1051 | } |
1052 | @@ -186,7 +184,8 @@ static int _pmbus_write_byte(struct i2c_client *client, int page, u8 value) |
1053 | return pmbus_write_byte(client, page, value); |
1054 | } |
1055 | |
1056 | -int pmbus_write_word_data(struct i2c_client *client, u8 page, u8 reg, u16 word) |
1057 | +int pmbus_write_word_data(struct i2c_client *client, int page, u8 reg, |
1058 | + u16 word) |
1059 | { |
1060 | int rv; |
1061 | |
1062 | @@ -219,7 +218,7 @@ static int _pmbus_write_word_data(struct i2c_client *client, int page, int reg, |
1063 | return pmbus_write_word_data(client, page, reg, word); |
1064 | } |
1065 | |
1066 | -int pmbus_read_word_data(struct i2c_client *client, u8 page, u8 reg) |
1067 | +int pmbus_read_word_data(struct i2c_client *client, int page, u8 reg) |
1068 | { |
1069 | int rv; |
1070 | |
1071 | @@ -255,11 +254,9 @@ int pmbus_read_byte_data(struct i2c_client *client, int page, u8 reg) |
1072 | { |
1073 | int rv; |
1074 | |
1075 | - if (page >= 0) { |
1076 | - rv = pmbus_set_page(client, page); |
1077 | - if (rv < 0) |
1078 | - return rv; |
1079 | - } |
1080 | + rv = pmbus_set_page(client, page); |
1081 | + if (rv < 0) |
1082 | + return rv; |
1083 | |
1084 | return i2c_smbus_read_byte_data(client, reg); |
1085 | } |
1086 | diff --git a/drivers/iio/adc/ti-ads1015.c b/drivers/iio/adc/ti-ads1015.c |
1087 | index e0dc20488335..9ac2fb032df6 100644 |
1088 | --- a/drivers/iio/adc/ti-ads1015.c |
1089 | +++ b/drivers/iio/adc/ti-ads1015.c |
1090 | @@ -369,6 +369,7 @@ int ads1015_get_adc_result(struct ads1015_data *data, int chan, int *val) |
1091 | |
1092 | conv_time = DIV_ROUND_UP(USEC_PER_SEC, data->data_rate[dr_old]); |
1093 | conv_time += DIV_ROUND_UP(USEC_PER_SEC, data->data_rate[dr]); |
1094 | + conv_time += conv_time / 10; /* 10% internal clock inaccuracy */ |
1095 | usleep_range(conv_time, conv_time + 1); |
1096 | data->conv_invalid = false; |
1097 | } |
1098 | diff --git a/drivers/iio/multiplexer/iio-mux.c b/drivers/iio/multiplexer/iio-mux.c |
1099 | index 37ba007f8dca..74831fcd0313 100644 |
1100 | --- a/drivers/iio/multiplexer/iio-mux.c |
1101 | +++ b/drivers/iio/multiplexer/iio-mux.c |
1102 | @@ -285,6 +285,9 @@ static int mux_configure_channel(struct device *dev, struct mux *mux, |
1103 | child->ext_info_cache = devm_kzalloc(dev, |
1104 | sizeof(*child->ext_info_cache) * |
1105 | num_ext_info, GFP_KERNEL); |
1106 | + if (!child->ext_info_cache) |
1107 | + return -ENOMEM; |
1108 | + |
1109 | for (i = 0; i < num_ext_info; ++i) { |
1110 | child->ext_info_cache[i].size = -1; |
1111 | |
1112 | @@ -309,6 +312,9 @@ static int mux_configure_channel(struct device *dev, struct mux *mux, |
1113 | |
1114 | child->ext_info_cache[i].data = devm_kmemdup(dev, page, ret + 1, |
1115 | GFP_KERNEL); |
1116 | + if (!child->ext_info_cache[i].data) |
1117 | + return -ENOMEM; |
1118 | + |
1119 | child->ext_info_cache[i].data[ret] = 0; |
1120 | child->ext_info_cache[i].size = ret; |
1121 | } |
1122 | diff --git a/drivers/mmc/host/sdhci-msm.c b/drivers/mmc/host/sdhci-msm.c |
1123 | index fc73e56eb1e2..92c483ec6cb2 100644 |
1124 | --- a/drivers/mmc/host/sdhci-msm.c |
1125 | +++ b/drivers/mmc/host/sdhci-msm.c |
1126 | @@ -1251,6 +1251,21 @@ static int sdhci_msm_probe(struct platform_device *pdev) |
1127 | CORE_VENDOR_SPEC_CAPABILITIES0); |
1128 | } |
1129 | |
1130 | + /* |
1131 | + * Power on reset state may trigger power irq if previous status of |
1132 | + * PWRCTL was either BUS_ON or IO_HIGH_V. So before enabling pwr irq |
1133 | + * interrupt in GIC, any pending power irq interrupt should be |
1134 | + * acknowledged. Otherwise power irq interrupt handler would be |
1135 | + * fired prematurely. |
1136 | + */ |
1137 | + sdhci_msm_voltage_switch(host); |
1138 | + |
1139 | + /* |
1140 | + * Ensure that above writes are propogated before interrupt enablement |
1141 | + * in GIC. |
1142 | + */ |
1143 | + mb(); |
1144 | + |
1145 | /* Setup IRQ for handling power/voltage tasks with PMIC */ |
1146 | msm_host->pwr_irq = platform_get_irq_byname(pdev, "pwr_irq"); |
1147 | if (msm_host->pwr_irq < 0) { |
1148 | @@ -1260,6 +1275,9 @@ static int sdhci_msm_probe(struct platform_device *pdev) |
1149 | goto clk_disable; |
1150 | } |
1151 | |
1152 | + /* Enable pwr irq interrupts */ |
1153 | + writel_relaxed(INT_MASK, msm_host->core_mem + CORE_PWRCTL_MASK); |
1154 | + |
1155 | ret = devm_request_threaded_irq(&pdev->dev, msm_host->pwr_irq, NULL, |
1156 | sdhci_msm_pwr_irq, IRQF_ONESHOT, |
1157 | dev_name(&pdev->dev), host); |
1158 | diff --git a/drivers/mmc/host/tmio_mmc_core.c b/drivers/mmc/host/tmio_mmc_core.c |
1159 | index 9c4e6199b854..3a6d49f07e22 100644 |
1160 | --- a/drivers/mmc/host/tmio_mmc_core.c |
1161 | +++ b/drivers/mmc/host/tmio_mmc_core.c |
1162 | @@ -1113,8 +1113,11 @@ static int tmio_mmc_init_ocr(struct tmio_mmc_host *host) |
1163 | { |
1164 | struct tmio_mmc_data *pdata = host->pdata; |
1165 | struct mmc_host *mmc = host->mmc; |
1166 | + int err; |
1167 | |
1168 | - mmc_regulator_get_supply(mmc); |
1169 | + err = mmc_regulator_get_supply(mmc); |
1170 | + if (err) |
1171 | + return err; |
1172 | |
1173 | /* use ocr_mask if no regulator */ |
1174 | if (!mmc->ocr_avail) |
1175 | diff --git a/drivers/pci/dwc/pci-dra7xx.c b/drivers/pci/dwc/pci-dra7xx.c |
1176 | index 34427a6a15af..362607f727ee 100644 |
1177 | --- a/drivers/pci/dwc/pci-dra7xx.c |
1178 | +++ b/drivers/pci/dwc/pci-dra7xx.c |
1179 | @@ -11,6 +11,7 @@ |
1180 | */ |
1181 | |
1182 | #include <linux/delay.h> |
1183 | +#include <linux/device.h> |
1184 | #include <linux/err.h> |
1185 | #include <linux/interrupt.h> |
1186 | #include <linux/irq.h> |
1187 | @@ -594,6 +595,7 @@ static int __init dra7xx_pcie_probe(struct platform_device *pdev) |
1188 | int i; |
1189 | int phy_count; |
1190 | struct phy **phy; |
1191 | + struct device_link **link; |
1192 | void __iomem *base; |
1193 | struct resource *res; |
1194 | struct dw_pcie *pci; |
1195 | @@ -649,11 +651,21 @@ static int __init dra7xx_pcie_probe(struct platform_device *pdev) |
1196 | if (!phy) |
1197 | return -ENOMEM; |
1198 | |
1199 | + link = devm_kzalloc(dev, sizeof(*link) * phy_count, GFP_KERNEL); |
1200 | + if (!link) |
1201 | + return -ENOMEM; |
1202 | + |
1203 | for (i = 0; i < phy_count; i++) { |
1204 | snprintf(name, sizeof(name), "pcie-phy%d", i); |
1205 | phy[i] = devm_phy_get(dev, name); |
1206 | if (IS_ERR(phy[i])) |
1207 | return PTR_ERR(phy[i]); |
1208 | + |
1209 | + link[i] = device_link_add(dev, &phy[i]->dev, DL_FLAG_STATELESS); |
1210 | + if (!link[i]) { |
1211 | + ret = -EINVAL; |
1212 | + goto err_link; |
1213 | + } |
1214 | } |
1215 | |
1216 | dra7xx->base = base; |
1217 | @@ -732,6 +744,10 @@ static int __init dra7xx_pcie_probe(struct platform_device *pdev) |
1218 | pm_runtime_disable(dev); |
1219 | dra7xx_pcie_disable_phy(dra7xx); |
1220 | |
1221 | +err_link: |
1222 | + while (--i >= 0) |
1223 | + device_link_del(link[i]); |
1224 | + |
1225 | return ret; |
1226 | } |
1227 | |
1228 | diff --git a/drivers/s390/cio/vfio_ccw_cp.c b/drivers/s390/cio/vfio_ccw_cp.c |
1229 | index f20b4d66c75f..4a39b54732d0 100644 |
1230 | --- a/drivers/s390/cio/vfio_ccw_cp.c |
1231 | +++ b/drivers/s390/cio/vfio_ccw_cp.c |
1232 | @@ -330,6 +330,8 @@ static void ccwchain_cda_free(struct ccwchain *chain, int idx) |
1233 | { |
1234 | struct ccw1 *ccw = chain->ch_ccw + idx; |
1235 | |
1236 | + if (ccw_is_test(ccw) || ccw_is_noop(ccw) || ccw_is_tic(ccw)) |
1237 | + return; |
1238 | if (!ccw->count) |
1239 | return; |
1240 | |
1241 | diff --git a/drivers/spi/spi-axi-spi-engine.c b/drivers/spi/spi-axi-spi-engine.c |
1242 | index 6ab4c7700228..68cfc351b47f 100644 |
1243 | --- a/drivers/spi/spi-axi-spi-engine.c |
1244 | +++ b/drivers/spi/spi-axi-spi-engine.c |
1245 | @@ -553,7 +553,7 @@ static int spi_engine_probe(struct platform_device *pdev) |
1246 | |
1247 | static int spi_engine_remove(struct platform_device *pdev) |
1248 | { |
1249 | - struct spi_master *master = platform_get_drvdata(pdev); |
1250 | + struct spi_master *master = spi_master_get(platform_get_drvdata(pdev)); |
1251 | struct spi_engine *spi_engine = spi_master_get_devdata(master); |
1252 | int irq = platform_get_irq(pdev, 0); |
1253 | |
1254 | @@ -561,6 +561,8 @@ static int spi_engine_remove(struct platform_device *pdev) |
1255 | |
1256 | free_irq(irq, master); |
1257 | |
1258 | + spi_master_put(master); |
1259 | + |
1260 | writel_relaxed(0xff, spi_engine->base + SPI_ENGINE_REG_INT_PENDING); |
1261 | writel_relaxed(0x00, spi_engine->base + SPI_ENGINE_REG_INT_ENABLE); |
1262 | writel_relaxed(0x01, spi_engine->base + SPI_ENGINE_REG_RESET); |
1263 | diff --git a/drivers/spi/spi-sh-msiof.c b/drivers/spi/spi-sh-msiof.c |
1264 | index 0eb1e9583485..837bb95eea62 100644 |
1265 | --- a/drivers/spi/spi-sh-msiof.c |
1266 | +++ b/drivers/spi/spi-sh-msiof.c |
1267 | @@ -900,7 +900,7 @@ static int sh_msiof_transfer_one(struct spi_master *master, |
1268 | break; |
1269 | copy32 = copy_bswap32; |
1270 | } else if (bits <= 16) { |
1271 | - if (l & 1) |
1272 | + if (l & 3) |
1273 | break; |
1274 | copy32 = copy_wswap32; |
1275 | } else { |
1276 | diff --git a/drivers/staging/ccree/ssi_hash.c b/drivers/staging/ccree/ssi_hash.c |
1277 | index 13291aeaf350..f72ca485c86f 100644 |
1278 | --- a/drivers/staging/ccree/ssi_hash.c |
1279 | +++ b/drivers/staging/ccree/ssi_hash.c |
1280 | @@ -1790,9 +1790,12 @@ static int ssi_ahash_import(struct ahash_request *req, const void *in) |
1281 | } |
1282 | in += sizeof(u32); |
1283 | |
1284 | - rc = ssi_hash_init(state, ctx); |
1285 | - if (rc) |
1286 | - goto out; |
1287 | + /* call init() to allocate bufs if the user hasn't */ |
1288 | + if (!state->digest_buff) { |
1289 | + rc = ssi_hash_init(state, ctx); |
1290 | + if (rc) |
1291 | + goto out; |
1292 | + } |
1293 | |
1294 | dma_sync_single_for_cpu(dev, state->digest_buff_dma_addr, |
1295 | ctx->inter_digestsize, DMA_BIDIRECTIONAL); |
1296 | diff --git a/drivers/staging/fsl-dpaa2/ethernet/dpaa2-eth.c b/drivers/staging/fsl-dpaa2/ethernet/dpaa2-eth.c |
1297 | index 26017fe9df93..8e84b2e7f5bd 100644 |
1298 | --- a/drivers/staging/fsl-dpaa2/ethernet/dpaa2-eth.c |
1299 | +++ b/drivers/staging/fsl-dpaa2/ethernet/dpaa2-eth.c |
1300 | @@ -131,6 +131,8 @@ static struct sk_buff *build_linear_skb(struct dpaa2_eth_priv *priv, |
1301 | u16 fd_offset = dpaa2_fd_get_offset(fd); |
1302 | u32 fd_length = dpaa2_fd_get_len(fd); |
1303 | |
1304 | + ch->buf_count--; |
1305 | + |
1306 | skb = build_skb(fd_vaddr, DPAA2_ETH_RX_BUF_SIZE + |
1307 | SKB_DATA_ALIGN(sizeof(struct skb_shared_info))); |
1308 | if (unlikely(!skb)) |
1309 | @@ -139,8 +141,6 @@ static struct sk_buff *build_linear_skb(struct dpaa2_eth_priv *priv, |
1310 | skb_reserve(skb, fd_offset); |
1311 | skb_put(skb, fd_length); |
1312 | |
1313 | - ch->buf_count--; |
1314 | - |
1315 | return skb; |
1316 | } |
1317 | |
1318 | @@ -178,8 +178,15 @@ static struct sk_buff *build_frag_skb(struct dpaa2_eth_priv *priv, |
1319 | /* We build the skb around the first data buffer */ |
1320 | skb = build_skb(sg_vaddr, DPAA2_ETH_RX_BUF_SIZE + |
1321 | SKB_DATA_ALIGN(sizeof(struct skb_shared_info))); |
1322 | - if (unlikely(!skb)) |
1323 | - return NULL; |
1324 | + if (unlikely(!skb)) { |
1325 | + /* We still need to subtract the buffers used |
1326 | + * by this FD from our software counter |
1327 | + */ |
1328 | + while (!dpaa2_sg_is_final(&sgt[i]) && |
1329 | + i < DPAA2_ETH_MAX_SG_ENTRIES) |
1330 | + i++; |
1331 | + break; |
1332 | + } |
1333 | |
1334 | sg_offset = dpaa2_sg_get_offset(sge); |
1335 | skb_reserve(skb, sg_offset); |
1336 | diff --git a/drivers/staging/fsl-mc/bus/dpio/dpio-service.c b/drivers/staging/fsl-mc/bus/dpio/dpio-service.c |
1337 | index f8096828f5b7..a609ec82daf3 100644 |
1338 | --- a/drivers/staging/fsl-mc/bus/dpio/dpio-service.c |
1339 | +++ b/drivers/staging/fsl-mc/bus/dpio/dpio-service.c |
1340 | @@ -76,7 +76,7 @@ static inline struct dpaa2_io *service_select_by_cpu(struct dpaa2_io *d, |
1341 | if (d) |
1342 | return d; |
1343 | |
1344 | - if (unlikely(cpu >= num_possible_cpus())) |
1345 | + if (cpu != DPAA2_IO_ANY_CPU && cpu >= num_possible_cpus()) |
1346 | return NULL; |
1347 | |
1348 | /* |
1349 | @@ -121,7 +121,7 @@ struct dpaa2_io *dpaa2_io_create(const struct dpaa2_io_desc *desc) |
1350 | return NULL; |
1351 | |
1352 | /* check if CPU is out of range (-1 means any cpu) */ |
1353 | - if (desc->cpu >= num_possible_cpus()) { |
1354 | + if (desc->cpu != DPAA2_IO_ANY_CPU && desc->cpu >= num_possible_cpus()) { |
1355 | kfree(obj); |
1356 | return NULL; |
1357 | } |
1358 | diff --git a/drivers/staging/fsl-mc/include/dpaa2-io.h b/drivers/staging/fsl-mc/include/dpaa2-io.h |
1359 | index c5646096c5d4..afc2d060d077 100644 |
1360 | --- a/drivers/staging/fsl-mc/include/dpaa2-io.h |
1361 | +++ b/drivers/staging/fsl-mc/include/dpaa2-io.h |
1362 | @@ -54,6 +54,8 @@ struct device; |
1363 | * for dequeue. |
1364 | */ |
1365 | |
1366 | +#define DPAA2_IO_ANY_CPU -1 |
1367 | + |
1368 | /** |
1369 | * struct dpaa2_io_desc - The DPIO descriptor |
1370 | * @receives_notifications: Use notificaton mode. Non-zero if the DPIO |
1371 | @@ -91,8 +93,8 @@ irqreturn_t dpaa2_io_irq(struct dpaa2_io *obj); |
1372 | * @cb: The callback to be invoked when the notification arrives |
1373 | * @is_cdan: Zero for FQDAN, non-zero for CDAN |
1374 | * @id: FQID or channel ID, needed for rearm |
1375 | - * @desired_cpu: The cpu on which the notifications will show up. -1 means |
1376 | - * any CPU. |
1377 | + * @desired_cpu: The cpu on which the notifications will show up. Use |
1378 | + * DPAA2_IO_ANY_CPU if don't care |
1379 | * @dpio_id: The dpio index |
1380 | * @qman64: The 64-bit context value shows up in the FQDAN/CDAN. |
1381 | * @node: The list node |
1382 | diff --git a/drivers/staging/greybus/loopback.c b/drivers/staging/greybus/loopback.c |
1383 | index 08e255884206..93e86798ec1c 100644 |
1384 | --- a/drivers/staging/greybus/loopback.c |
1385 | +++ b/drivers/staging/greybus/loopback.c |
1386 | @@ -1042,8 +1042,10 @@ static int gb_loopback_fn(void *data) |
1387 | else if (type == GB_LOOPBACK_TYPE_SINK) |
1388 | error = gb_loopback_async_sink(gb, size); |
1389 | |
1390 | - if (error) |
1391 | + if (error) { |
1392 | gb->error++; |
1393 | + gb->iteration_count++; |
1394 | + } |
1395 | } else { |
1396 | /* We are effectively single threaded here */ |
1397 | if (type == GB_LOOPBACK_TYPE_PING) |
1398 | diff --git a/drivers/staging/rtl8188eu/core/rtw_mlme.c b/drivers/staging/rtl8188eu/core/rtw_mlme.c |
1399 | index f663e6c41f8a..f6d71587b803 100644 |
1400 | --- a/drivers/staging/rtl8188eu/core/rtw_mlme.c |
1401 | +++ b/drivers/staging/rtl8188eu/core/rtw_mlme.c |
1402 | @@ -106,10 +106,10 @@ void rtw_free_mlme_priv_ie_data(struct mlme_priv *pmlmepriv) |
1403 | |
1404 | void rtw_free_mlme_priv(struct mlme_priv *pmlmepriv) |
1405 | { |
1406 | - rtw_free_mlme_priv_ie_data(pmlmepriv); |
1407 | - |
1408 | - if (pmlmepriv) |
1409 | + if (pmlmepriv) { |
1410 | + rtw_free_mlme_priv_ie_data(pmlmepriv); |
1411 | vfree(pmlmepriv->free_bss_buf); |
1412 | + } |
1413 | } |
1414 | |
1415 | struct wlan_network *_rtw_alloc_network(struct mlme_priv *pmlmepriv) |
1416 | diff --git a/drivers/staging/rtlwifi/phydm/phydm_dig.c b/drivers/staging/rtlwifi/phydm/phydm_dig.c |
1417 | index 31a4f3fcad19..c88b9788363a 100644 |
1418 | --- a/drivers/staging/rtlwifi/phydm/phydm_dig.c |
1419 | +++ b/drivers/staging/rtlwifi/phydm/phydm_dig.c |
1420 | @@ -490,6 +490,8 @@ void odm_pause_dig(void *dm_void, enum phydm_pause_type pause_type, |
1421 | break; |
1422 | } |
1423 | |
1424 | + /* pin max_level to be >= 0 */ |
1425 | + max_level = max_t(s8, 0, max_level); |
1426 | /* write IGI of lower level */ |
1427 | odm_write_dig(dm, dig_tab->pause_dig_value[max_level]); |
1428 | ODM_RT_TRACE(dm, ODM_COMP_DIG, |
1429 | diff --git a/drivers/staging/rtlwifi/rtl8822be/fw.c b/drivers/staging/rtlwifi/rtl8822be/fw.c |
1430 | index 8e24da16752c..a2cc54866e79 100644 |
1431 | --- a/drivers/staging/rtlwifi/rtl8822be/fw.c |
1432 | +++ b/drivers/staging/rtlwifi/rtl8822be/fw.c |
1433 | @@ -419,7 +419,7 @@ static bool _rtl8822be_send_bcn_or_cmd_packet(struct ieee80211_hw *hw, |
1434 | dma_addr = rtlpriv->cfg->ops->get_desc( |
1435 | hw, (u8 *)pbd_desc, true, HW_DESC_TXBUFF_ADDR); |
1436 | |
1437 | - pci_unmap_single(rtlpci->pdev, dma_addr, skb->len, |
1438 | + pci_unmap_single(rtlpci->pdev, dma_addr, pskb->len, |
1439 | PCI_DMA_TODEVICE); |
1440 | kfree_skb(pskb); |
1441 | |
1442 | diff --git a/drivers/tty/serial/8250/8250_early.c b/drivers/tty/serial/8250/8250_early.c |
1443 | index af72ec32e404..f135c1846477 100644 |
1444 | --- a/drivers/tty/serial/8250/8250_early.c |
1445 | +++ b/drivers/tty/serial/8250/8250_early.c |
1446 | @@ -125,12 +125,14 @@ static void __init init_port(struct earlycon_device *device) |
1447 | serial8250_early_out(port, UART_FCR, 0); /* no fifo */ |
1448 | serial8250_early_out(port, UART_MCR, 0x3); /* DTR + RTS */ |
1449 | |
1450 | - divisor = DIV_ROUND_CLOSEST(port->uartclk, 16 * device->baud); |
1451 | - c = serial8250_early_in(port, UART_LCR); |
1452 | - serial8250_early_out(port, UART_LCR, c | UART_LCR_DLAB); |
1453 | - serial8250_early_out(port, UART_DLL, divisor & 0xff); |
1454 | - serial8250_early_out(port, UART_DLM, (divisor >> 8) & 0xff); |
1455 | - serial8250_early_out(port, UART_LCR, c & ~UART_LCR_DLAB); |
1456 | + if (port->uartclk && device->baud) { |
1457 | + divisor = DIV_ROUND_CLOSEST(port->uartclk, 16 * device->baud); |
1458 | + c = serial8250_early_in(port, UART_LCR); |
1459 | + serial8250_early_out(port, UART_LCR, c | UART_LCR_DLAB); |
1460 | + serial8250_early_out(port, UART_DLL, divisor & 0xff); |
1461 | + serial8250_early_out(port, UART_DLM, (divisor >> 8) & 0xff); |
1462 | + serial8250_early_out(port, UART_LCR, c & ~UART_LCR_DLAB); |
1463 | + } |
1464 | } |
1465 | |
1466 | int __init early_serial8250_setup(struct earlycon_device *device, |
1467 | diff --git a/drivers/tty/serial/8250/8250_fintek.c b/drivers/tty/serial/8250/8250_fintek.c |
1468 | index 4bd376c08b59..ba4af5434b91 100644 |
1469 | --- a/drivers/tty/serial/8250/8250_fintek.c |
1470 | +++ b/drivers/tty/serial/8250/8250_fintek.c |
1471 | @@ -211,7 +211,7 @@ static int fintek_8250_rs485_config(struct uart_port *port, |
1472 | |
1473 | if ((!!(rs485->flags & SER_RS485_RTS_ON_SEND)) == |
1474 | (!!(rs485->flags & SER_RS485_RTS_AFTER_SEND))) |
1475 | - rs485->flags &= SER_RS485_ENABLED; |
1476 | + rs485->flags &= ~SER_RS485_ENABLED; |
1477 | else |
1478 | config |= RS485_URA; |
1479 | |
1480 | diff --git a/drivers/tty/serial/8250/8250_pci.c b/drivers/tty/serial/8250/8250_pci.c |
1481 | index 0c101a7470b0..d4e7be88e0da 100644 |
1482 | --- a/drivers/tty/serial/8250/8250_pci.c |
1483 | +++ b/drivers/tty/serial/8250/8250_pci.c |
1484 | @@ -5137,6 +5137,9 @@ static const struct pci_device_id serial_pci_tbl[] = { |
1485 | { PCI_DEVICE(0x1601, 0x0800), .driver_data = pbn_b0_4_1250000 }, |
1486 | { PCI_DEVICE(0x1601, 0xa801), .driver_data = pbn_b0_4_1250000 }, |
1487 | |
1488 | + /* Amazon PCI serial device */ |
1489 | + { PCI_DEVICE(0x1d0f, 0x8250), .driver_data = pbn_b0_1_115200 }, |
1490 | + |
1491 | /* |
1492 | * These entries match devices with class COMMUNICATION_SERIAL, |
1493 | * COMMUNICATION_MODEM or COMMUNICATION_MULTISERIAL |
1494 | diff --git a/drivers/tty/serial/8250/8250_port.c b/drivers/tty/serial/8250/8250_port.c |
1495 | index f0cc04f62b67..8dcfd4978a03 100644 |
1496 | --- a/drivers/tty/serial/8250/8250_port.c |
1497 | +++ b/drivers/tty/serial/8250/8250_port.c |
1498 | @@ -2586,8 +2586,11 @@ static void serial8250_set_divisor(struct uart_port *port, unsigned int baud, |
1499 | serial_dl_write(up, quot); |
1500 | |
1501 | /* XR17V35x UARTs have an extra fractional divisor register (DLD) */ |
1502 | - if (up->port.type == PORT_XR17V35X) |
1503 | + if (up->port.type == PORT_XR17V35X) { |
1504 | + /* Preserve bits not related to baudrate; DLD[7:4]. */ |
1505 | + quot_frac |= serial_port_in(port, 0x2) & 0xf0; |
1506 | serial_port_out(port, 0x2, quot_frac); |
1507 | + } |
1508 | } |
1509 | |
1510 | static unsigned int serial8250_get_baud_rate(struct uart_port *port, |
1511 | diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c |
1512 | index dfeff3951f93..3657d745e90f 100644 |
1513 | --- a/drivers/tty/serial/imx.c |
1514 | +++ b/drivers/tty/serial/imx.c |
1515 | @@ -334,7 +334,8 @@ static void imx_port_rts_active(struct imx_port *sport, unsigned long *ucr2) |
1516 | { |
1517 | *ucr2 &= ~(UCR2_CTSC | UCR2_CTS); |
1518 | |
1519 | - mctrl_gpio_set(sport->gpios, sport->port.mctrl | TIOCM_RTS); |
1520 | + sport->port.mctrl |= TIOCM_RTS; |
1521 | + mctrl_gpio_set(sport->gpios, sport->port.mctrl); |
1522 | } |
1523 | |
1524 | static void imx_port_rts_inactive(struct imx_port *sport, unsigned long *ucr2) |
1525 | @@ -342,7 +343,8 @@ static void imx_port_rts_inactive(struct imx_port *sport, unsigned long *ucr2) |
1526 | *ucr2 &= ~UCR2_CTSC; |
1527 | *ucr2 |= UCR2_CTS; |
1528 | |
1529 | - mctrl_gpio_set(sport->gpios, sport->port.mctrl & ~TIOCM_RTS); |
1530 | + sport->port.mctrl &= ~TIOCM_RTS; |
1531 | + mctrl_gpio_set(sport->gpios, sport->port.mctrl); |
1532 | } |
1533 | |
1534 | static void imx_port_rts_auto(struct imx_port *sport, unsigned long *ucr2) |
1535 | diff --git a/drivers/tty/serial/sh-sci.c b/drivers/tty/serial/sh-sci.c |
1536 | index 784dd42002ea..761b9f5f1491 100644 |
1537 | --- a/drivers/tty/serial/sh-sci.c |
1538 | +++ b/drivers/tty/serial/sh-sci.c |
1539 | @@ -1491,6 +1491,14 @@ static void sci_request_dma(struct uart_port *port) |
1540 | return; |
1541 | |
1542 | s->cookie_tx = -EINVAL; |
1543 | + |
1544 | + /* |
1545 | + * Don't request a dma channel if no channel was specified |
1546 | + * in the device tree. |
1547 | + */ |
1548 | + if (!of_find_property(port->dev->of_node, "dmas", NULL)) |
1549 | + return; |
1550 | + |
1551 | chan = sci_request_dma_chan(port, DMA_MEM_TO_DEV); |
1552 | dev_dbg(port->dev, "%s: TX: got channel %p\n", __func__, chan); |
1553 | if (chan) { |
1554 | diff --git a/drivers/tty/sysrq.c b/drivers/tty/sysrq.c |
1555 | index d008f5a75197..377b3592384e 100644 |
1556 | --- a/drivers/tty/sysrq.c |
1557 | +++ b/drivers/tty/sysrq.c |
1558 | @@ -246,8 +246,10 @@ static void sysrq_handle_showallcpus(int key) |
1559 | * architecture has no support for it: |
1560 | */ |
1561 | if (!trigger_all_cpu_backtrace()) { |
1562 | - struct pt_regs *regs = get_irq_regs(); |
1563 | + struct pt_regs *regs = NULL; |
1564 | |
1565 | + if (in_irq()) |
1566 | + regs = get_irq_regs(); |
1567 | if (regs) { |
1568 | pr_info("CPU%d:\n", smp_processor_id()); |
1569 | show_regs(regs); |
1570 | @@ -266,7 +268,10 @@ static struct sysrq_key_op sysrq_showallcpus_op = { |
1571 | |
1572 | static void sysrq_handle_showregs(int key) |
1573 | { |
1574 | - struct pt_regs *regs = get_irq_regs(); |
1575 | + struct pt_regs *regs = NULL; |
1576 | + |
1577 | + if (in_irq()) |
1578 | + regs = get_irq_regs(); |
1579 | if (regs) |
1580 | show_regs(regs); |
1581 | perf_event_print_debug(); |
1582 | diff --git a/drivers/usb/common/ulpi.c b/drivers/usb/common/ulpi.c |
1583 | index 4aa5195db8ea..e02acfb1ca95 100644 |
1584 | --- a/drivers/usb/common/ulpi.c |
1585 | +++ b/drivers/usb/common/ulpi.c |
1586 | @@ -183,9 +183,9 @@ static int ulpi_of_register(struct ulpi *ulpi) |
1587 | /* Find a ulpi bus underneath the parent or the grandparent */ |
1588 | parent = ulpi->dev.parent; |
1589 | if (parent->of_node) |
1590 | - np = of_find_node_by_name(parent->of_node, "ulpi"); |
1591 | + np = of_get_child_by_name(parent->of_node, "ulpi"); |
1592 | else if (parent->parent && parent->parent->of_node) |
1593 | - np = of_find_node_by_name(parent->parent->of_node, "ulpi"); |
1594 | + np = of_get_child_by_name(parent->parent->of_node, "ulpi"); |
1595 | if (!np) |
1596 | return 0; |
1597 | |
1598 | diff --git a/drivers/usb/core/config.c b/drivers/usb/core/config.c |
1599 | index 883549ee946c..c42a3e63eb07 100644 |
1600 | --- a/drivers/usb/core/config.c |
1601 | +++ b/drivers/usb/core/config.c |
1602 | @@ -905,14 +905,25 @@ void usb_release_bos_descriptor(struct usb_device *dev) |
1603 | } |
1604 | } |
1605 | |
1606 | +static const __u8 bos_desc_len[256] = { |
1607 | + [USB_CAP_TYPE_WIRELESS_USB] = USB_DT_USB_WIRELESS_CAP_SIZE, |
1608 | + [USB_CAP_TYPE_EXT] = USB_DT_USB_EXT_CAP_SIZE, |
1609 | + [USB_SS_CAP_TYPE] = USB_DT_USB_SS_CAP_SIZE, |
1610 | + [USB_SSP_CAP_TYPE] = USB_DT_USB_SSP_CAP_SIZE(1), |
1611 | + [CONTAINER_ID_TYPE] = USB_DT_USB_SS_CONTN_ID_SIZE, |
1612 | + [USB_PTM_CAP_TYPE] = USB_DT_USB_PTM_ID_SIZE, |
1613 | +}; |
1614 | + |
1615 | /* Get BOS descriptor set */ |
1616 | int usb_get_bos_descriptor(struct usb_device *dev) |
1617 | { |
1618 | struct device *ddev = &dev->dev; |
1619 | struct usb_bos_descriptor *bos; |
1620 | struct usb_dev_cap_header *cap; |
1621 | + struct usb_ssp_cap_descriptor *ssp_cap; |
1622 | unsigned char *buffer; |
1623 | - int length, total_len, num, i; |
1624 | + int length, total_len, num, i, ssac; |
1625 | + __u8 cap_type; |
1626 | int ret; |
1627 | |
1628 | bos = kzalloc(sizeof(struct usb_bos_descriptor), GFP_KERNEL); |
1629 | @@ -965,7 +976,13 @@ int usb_get_bos_descriptor(struct usb_device *dev) |
1630 | dev->bos->desc->bNumDeviceCaps = i; |
1631 | break; |
1632 | } |
1633 | + cap_type = cap->bDevCapabilityType; |
1634 | length = cap->bLength; |
1635 | + if (bos_desc_len[cap_type] && length < bos_desc_len[cap_type]) { |
1636 | + dev->bos->desc->bNumDeviceCaps = i; |
1637 | + break; |
1638 | + } |
1639 | + |
1640 | total_len -= length; |
1641 | |
1642 | if (cap->bDescriptorType != USB_DT_DEVICE_CAPABILITY) { |
1643 | @@ -973,7 +990,7 @@ int usb_get_bos_descriptor(struct usb_device *dev) |
1644 | continue; |
1645 | } |
1646 | |
1647 | - switch (cap->bDevCapabilityType) { |
1648 | + switch (cap_type) { |
1649 | case USB_CAP_TYPE_WIRELESS_USB: |
1650 | /* Wireless USB cap descriptor is handled by wusb */ |
1651 | break; |
1652 | @@ -986,8 +1003,11 @@ int usb_get_bos_descriptor(struct usb_device *dev) |
1653 | (struct usb_ss_cap_descriptor *)buffer; |
1654 | break; |
1655 | case USB_SSP_CAP_TYPE: |
1656 | - dev->bos->ssp_cap = |
1657 | - (struct usb_ssp_cap_descriptor *)buffer; |
1658 | + ssp_cap = (struct usb_ssp_cap_descriptor *)buffer; |
1659 | + ssac = (le32_to_cpu(ssp_cap->bmAttributes) & |
1660 | + USB_SSP_SUBLINK_SPEED_ATTRIBS) + 1; |
1661 | + if (length >= USB_DT_USB_SSP_CAP_SIZE(ssac)) |
1662 | + dev->bos->ssp_cap = ssp_cap; |
1663 | break; |
1664 | case CONTAINER_ID_TYPE: |
1665 | dev->bos->ss_id = |
1666 | diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c |
1667 | index 98c666ef9a57..ab245352f102 100644 |
1668 | --- a/drivers/usb/core/devio.c |
1669 | +++ b/drivers/usb/core/devio.c |
1670 | @@ -1455,14 +1455,18 @@ static int proc_do_submiturb(struct usb_dev_state *ps, struct usbdevfs_urb *uurb |
1671 | int number_of_packets = 0; |
1672 | unsigned int stream_id = 0; |
1673 | void *buf; |
1674 | - |
1675 | - if (uurb->flags & ~(USBDEVFS_URB_ISO_ASAP | |
1676 | - USBDEVFS_URB_SHORT_NOT_OK | |
1677 | + unsigned long mask = USBDEVFS_URB_SHORT_NOT_OK | |
1678 | USBDEVFS_URB_BULK_CONTINUATION | |
1679 | USBDEVFS_URB_NO_FSBR | |
1680 | USBDEVFS_URB_ZERO_PACKET | |
1681 | - USBDEVFS_URB_NO_INTERRUPT)) |
1682 | - return -EINVAL; |
1683 | + USBDEVFS_URB_NO_INTERRUPT; |
1684 | + /* USBDEVFS_URB_ISO_ASAP is a special case */ |
1685 | + if (uurb->type == USBDEVFS_URB_TYPE_ISO) |
1686 | + mask |= USBDEVFS_URB_ISO_ASAP; |
1687 | + |
1688 | + if (uurb->flags & ~mask) |
1689 | + return -EINVAL; |
1690 | + |
1691 | if ((unsigned int)uurb->buffer_length >= USBFS_XFER_MAX) |
1692 | return -EINVAL; |
1693 | if (uurb->buffer_length > 0 && !uurb->buffer) |
1694 | diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c |
1695 | index e9ce6bb0b22d..8f7d94239ee3 100644 |
1696 | --- a/drivers/usb/core/hub.c |
1697 | +++ b/drivers/usb/core/hub.c |
1698 | @@ -4935,6 +4935,15 @@ static void hub_port_connect(struct usb_hub *hub, int port1, u16 portstatus, |
1699 | usb_put_dev(udev); |
1700 | if ((status == -ENOTCONN) || (status == -ENOTSUPP)) |
1701 | break; |
1702 | + |
1703 | + /* When halfway through our retry count, power-cycle the port */ |
1704 | + if (i == (SET_CONFIG_TRIES / 2) - 1) { |
1705 | + dev_info(&port_dev->dev, "attempt power cycle\n"); |
1706 | + usb_hub_set_port_power(hdev, hub, port1, false); |
1707 | + msleep(2 * hub_power_on_good_delay(hub)); |
1708 | + usb_hub_set_port_power(hdev, hub, port1, true); |
1709 | + msleep(hub_power_on_good_delay(hub)); |
1710 | + } |
1711 | } |
1712 | if (hub->hdev->parent || |
1713 | !hcd->driver->port_handed_over || |
1714 | diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c |
1715 | index 37c418e581fb..50010282c010 100644 |
1716 | --- a/drivers/usb/core/quirks.c |
1717 | +++ b/drivers/usb/core/quirks.c |
1718 | @@ -151,6 +151,9 @@ static const struct usb_device_id usb_quirk_list[] = { |
1719 | /* appletouch */ |
1720 | { USB_DEVICE(0x05ac, 0x021a), .driver_info = USB_QUIRK_RESET_RESUME }, |
1721 | |
1722 | + /* Genesys Logic hub, internally used by KY-688 USB 3.1 Type-C Hub */ |
1723 | + { USB_DEVICE(0x05e3, 0x0612), .driver_info = USB_QUIRK_NO_LPM }, |
1724 | + |
1725 | /* Genesys Logic hub, internally used by Moshi USB to Ethernet Adapter */ |
1726 | { USB_DEVICE(0x05e3, 0x0616), .driver_info = USB_QUIRK_NO_LPM }, |
1727 | |
1728 | diff --git a/drivers/usb/host/ehci-dbg.c b/drivers/usb/host/ehci-dbg.c |
1729 | index cbb9b8e12c3c..8c5a6fee4dfd 100644 |
1730 | --- a/drivers/usb/host/ehci-dbg.c |
1731 | +++ b/drivers/usb/host/ehci-dbg.c |
1732 | @@ -837,7 +837,7 @@ static ssize_t fill_registers_buffer(struct debug_buffer *buf) |
1733 | default: /* unknown */ |
1734 | break; |
1735 | } |
1736 | - temp = (cap >> 8) & 0xff; |
1737 | + offset = (cap >> 8) & 0xff; |
1738 | } |
1739 | } |
1740 | #endif |
1741 | diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c |
1742 | index 2a82c927ded2..97f30eb7dac0 100644 |
1743 | --- a/drivers/usb/host/xhci-mem.c |
1744 | +++ b/drivers/usb/host/xhci-mem.c |
1745 | @@ -947,6 +947,12 @@ void xhci_free_virt_devices_depth_first(struct xhci_hcd *xhci, int slot_id) |
1746 | if (!vdev) |
1747 | return; |
1748 | |
1749 | + if (vdev->real_port == 0 || |
1750 | + vdev->real_port > HCS_MAX_PORTS(xhci->hcs_params1)) { |
1751 | + xhci_dbg(xhci, "Bad vdev->real_port.\n"); |
1752 | + goto out; |
1753 | + } |
1754 | + |
1755 | tt_list_head = &(xhci->rh_bw[vdev->real_port - 1].tts); |
1756 | list_for_each_entry_safe(tt_info, next, tt_list_head, tt_list) { |
1757 | /* is this a hub device that added a tt_info to the tts list */ |
1758 | @@ -960,6 +966,7 @@ void xhci_free_virt_devices_depth_first(struct xhci_hcd *xhci, int slot_id) |
1759 | } |
1760 | } |
1761 | } |
1762 | +out: |
1763 | /* we are now at a leaf device */ |
1764 | xhci_free_virt_device(xhci, slot_id); |
1765 | } |
1766 | diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c |
1767 | index 82c746e2d85c..353520005c13 100644 |
1768 | --- a/drivers/usb/host/xhci-ring.c |
1769 | +++ b/drivers/usb/host/xhci-ring.c |
1770 | @@ -2486,12 +2486,16 @@ static int handle_tx_event(struct xhci_hcd *xhci, |
1771 | */ |
1772 | if (list_empty(&ep_ring->td_list)) { |
1773 | /* |
1774 | - * A stopped endpoint may generate an extra completion |
1775 | - * event if the device was suspended. Don't print |
1776 | - * warnings. |
1777 | + * Don't print wanings if it's due to a stopped endpoint |
1778 | + * generating an extra completion event if the device |
1779 | + * was suspended. Or, a event for the last TRB of a |
1780 | + * short TD we already got a short event for. |
1781 | + * The short TD is already removed from the TD list. |
1782 | */ |
1783 | + |
1784 | if (!(trb_comp_code == COMP_STOPPED || |
1785 | - trb_comp_code == COMP_STOPPED_LENGTH_INVALID)) { |
1786 | + trb_comp_code == COMP_STOPPED_LENGTH_INVALID || |
1787 | + ep_ring->last_td_was_short)) { |
1788 | xhci_warn(xhci, "WARN Event TRB for slot %d ep %d with no TDs queued?\n", |
1789 | TRB_TO_SLOT_ID(le32_to_cpu(event->flags)), |
1790 | ep_index); |
1791 | diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c |
1792 | index 51535ba2bcd4..e5677700dea4 100644 |
1793 | --- a/drivers/usb/host/xhci.c |
1794 | +++ b/drivers/usb/host/xhci.c |
1795 | @@ -3583,10 +3583,9 @@ int xhci_disable_slot(struct xhci_hcd *xhci, struct xhci_command *command, |
1796 | state = readl(&xhci->op_regs->status); |
1797 | if (state == 0xffffffff || (xhci->xhc_state & XHCI_STATE_DYING) || |
1798 | (xhci->xhc_state & XHCI_STATE_HALTED)) { |
1799 | - xhci_free_virt_device(xhci, slot_id); |
1800 | spin_unlock_irqrestore(&xhci->lock, flags); |
1801 | kfree(command); |
1802 | - return ret; |
1803 | + return -ENODEV; |
1804 | } |
1805 | |
1806 | ret = xhci_queue_slot_control(xhci, command, TRB_DISABLE_SLOT, |
1807 | diff --git a/drivers/usb/mtu3/mtu3_core.c b/drivers/usb/mtu3/mtu3_core.c |
1808 | index 99c65b0788ff..947579842ad7 100644 |
1809 | --- a/drivers/usb/mtu3/mtu3_core.c |
1810 | +++ b/drivers/usb/mtu3/mtu3_core.c |
1811 | @@ -774,9 +774,9 @@ int ssusb_gadget_init(struct ssusb_mtk *ssusb) |
1812 | return -ENOMEM; |
1813 | |
1814 | mtu->irq = platform_get_irq(pdev, 0); |
1815 | - if (mtu->irq <= 0) { |
1816 | + if (mtu->irq < 0) { |
1817 | dev_err(dev, "fail to get irq number\n"); |
1818 | - return -ENODEV; |
1819 | + return mtu->irq; |
1820 | } |
1821 | dev_info(dev, "irq %d\n", mtu->irq); |
1822 | |
1823 | diff --git a/drivers/usb/phy/phy-tahvo.c b/drivers/usb/phy/phy-tahvo.c |
1824 | index 8babd318c0ed..1ec00eae339a 100644 |
1825 | --- a/drivers/usb/phy/phy-tahvo.c |
1826 | +++ b/drivers/usb/phy/phy-tahvo.c |
1827 | @@ -368,7 +368,8 @@ static int tahvo_usb_probe(struct platform_device *pdev) |
1828 | tu->extcon = devm_extcon_dev_allocate(&pdev->dev, tahvo_cable); |
1829 | if (IS_ERR(tu->extcon)) { |
1830 | dev_err(&pdev->dev, "failed to allocate memory for extcon\n"); |
1831 | - return -ENOMEM; |
1832 | + ret = PTR_ERR(tu->extcon); |
1833 | + goto err_disable_clk; |
1834 | } |
1835 | |
1836 | ret = devm_extcon_dev_register(&pdev->dev, tu->extcon); |
1837 | diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c |
1838 | index ba672cf4e888..54e316b1892d 100644 |
1839 | --- a/drivers/usb/serial/option.c |
1840 | +++ b/drivers/usb/serial/option.c |
1841 | @@ -241,6 +241,7 @@ static void option_instat_callback(struct urb *urb); |
1842 | /* These Quectel products use Quectel's vendor ID */ |
1843 | #define QUECTEL_PRODUCT_EC21 0x0121 |
1844 | #define QUECTEL_PRODUCT_EC25 0x0125 |
1845 | +#define QUECTEL_PRODUCT_BG96 0x0296 |
1846 | |
1847 | #define CMOTECH_VENDOR_ID 0x16d8 |
1848 | #define CMOTECH_PRODUCT_6001 0x6001 |
1849 | @@ -1185,6 +1186,8 @@ static const struct usb_device_id option_ids[] = { |
1850 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, |
1851 | { USB_DEVICE(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC25), |
1852 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, |
1853 | + { USB_DEVICE(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_BG96), |
1854 | + .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, |
1855 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6001) }, |
1856 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CMU_300) }, |
1857 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6003), |
1858 | diff --git a/drivers/usb/serial/usb_debug.c b/drivers/usb/serial/usb_debug.c |
1859 | index 48f285a1ad00..c593ca8800e5 100644 |
1860 | --- a/drivers/usb/serial/usb_debug.c |
1861 | +++ b/drivers/usb/serial/usb_debug.c |
1862 | @@ -34,12 +34,14 @@ static const struct usb_device_id id_table[] = { |
1863 | }; |
1864 | |
1865 | static const struct usb_device_id dbc_id_table[] = { |
1866 | + { USB_DEVICE(0x1d6b, 0x0010) }, |
1867 | { USB_DEVICE(0x1d6b, 0x0011) }, |
1868 | { }, |
1869 | }; |
1870 | |
1871 | static const struct usb_device_id id_table_combined[] = { |
1872 | { USB_DEVICE(0x0525, 0x127a) }, |
1873 | + { USB_DEVICE(0x1d6b, 0x0010) }, |
1874 | { USB_DEVICE(0x1d6b, 0x0011) }, |
1875 | { }, |
1876 | }; |
1877 | diff --git a/drivers/usb/storage/uas-detect.h b/drivers/usb/storage/uas-detect.h |
1878 | index 1fcd758a961f..3734a25e09e5 100644 |
1879 | --- a/drivers/usb/storage/uas-detect.h |
1880 | +++ b/drivers/usb/storage/uas-detect.h |
1881 | @@ -112,6 +112,10 @@ static int uas_use_uas_driver(struct usb_interface *intf, |
1882 | } |
1883 | } |
1884 | |
1885 | + /* All Seagate disk enclosures have broken ATA pass-through support */ |
1886 | + if (le16_to_cpu(udev->descriptor.idVendor) == 0x0bc2) |
1887 | + flags |= US_FL_NO_ATA_1X; |
1888 | + |
1889 | usb_stor_adjust_quirks(udev, &flags); |
1890 | |
1891 | if (flags & US_FL_IGNORE_UAS) { |
1892 | diff --git a/drivers/usb/usbip/vhci_hcd.c b/drivers/usb/usbip/vhci_hcd.c |
1893 | index 11b9a22799cc..1f0cf81cc145 100644 |
1894 | --- a/drivers/usb/usbip/vhci_hcd.c |
1895 | +++ b/drivers/usb/usbip/vhci_hcd.c |
1896 | @@ -1112,7 +1112,6 @@ static int hcd_name_to_id(const char *name) |
1897 | static int vhci_setup(struct usb_hcd *hcd) |
1898 | { |
1899 | struct vhci *vhci = *((void **)dev_get_platdata(hcd->self.controller)); |
1900 | - hcd->self.sg_tablesize = ~0; |
1901 | if (usb_hcd_is_primary_hcd(hcd)) { |
1902 | vhci->vhci_hcd_hs = hcd_to_vhci_hcd(hcd); |
1903 | vhci->vhci_hcd_hs->vhci = vhci; |
1904 | diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h |
1905 | index 8acfc1e099e1..e549bff87c5b 100644 |
1906 | --- a/include/asm-generic/vmlinux.lds.h |
1907 | +++ b/include/asm-generic/vmlinux.lds.h |
1908 | @@ -459,6 +459,7 @@ |
1909 | #define TEXT_TEXT \ |
1910 | ALIGN_FUNCTION(); \ |
1911 | *(.text.hot TEXT_MAIN .text.fixup .text.unlikely) \ |
1912 | + *(.text..refcount) \ |
1913 | *(.ref.text) \ |
1914 | MEM_KEEP(init.text) \ |
1915 | MEM_KEEP(exit.text) \ |
1916 | diff --git a/include/uapi/linux/usb/ch9.h b/include/uapi/linux/usb/ch9.h |
1917 | index cec06625f407..8512777889b0 100644 |
1918 | --- a/include/uapi/linux/usb/ch9.h |
1919 | +++ b/include/uapi/linux/usb/ch9.h |
1920 | @@ -876,6 +876,8 @@ struct usb_wireless_cap_descriptor { /* Ultra Wide Band */ |
1921 | __u8 bReserved; |
1922 | } __attribute__((packed)); |
1923 | |
1924 | +#define USB_DT_USB_WIRELESS_CAP_SIZE 11 |
1925 | + |
1926 | /* USB 2.0 Extension descriptor */ |
1927 | #define USB_CAP_TYPE_EXT 2 |
1928 | |
1929 | @@ -1068,6 +1070,7 @@ struct usb_ptm_cap_descriptor { |
1930 | __u8 bDevCapabilityType; |
1931 | } __attribute__((packed)); |
1932 | |
1933 | +#define USB_DT_USB_PTM_ID_SIZE 3 |
1934 | /* |
1935 | * The size of the descriptor for the Sublink Speed Attribute Count |
1936 | * (SSAC) specified in bmAttributes[4:0]. |
1937 | diff --git a/kernel/events/core.c b/kernel/events/core.c |
1938 | index 10cdb9c26b5d..4f1d4bfc607a 100644 |
1939 | --- a/kernel/events/core.c |
1940 | +++ b/kernel/events/core.c |
1941 | @@ -4433,6 +4433,8 @@ static int __perf_read_group_add(struct perf_event *leader, |
1942 | if (ret) |
1943 | return ret; |
1944 | |
1945 | + raw_spin_lock_irqsave(&ctx->lock, flags); |
1946 | + |
1947 | /* |
1948 | * Since we co-schedule groups, {enabled,running} times of siblings |
1949 | * will be identical to those of the leader, so we only publish one |
1950 | @@ -4455,8 +4457,6 @@ static int __perf_read_group_add(struct perf_event *leader, |
1951 | if (read_format & PERF_FORMAT_ID) |
1952 | values[n++] = primary_event_id(leader); |
1953 | |
1954 | - raw_spin_lock_irqsave(&ctx->lock, flags); |
1955 | - |
1956 | list_for_each_entry(sub, &leader->sibling_list, group_entry) { |
1957 | values[n++] += perf_event_count(sub); |
1958 | if (read_format & PERF_FORMAT_ID) |
1959 | diff --git a/kernel/kprobes.c b/kernel/kprobes.c |
1960 | index a1606a4224e1..a66e838640ea 100644 |
1961 | --- a/kernel/kprobes.c |
1962 | +++ b/kernel/kprobes.c |
1963 | @@ -573,13 +573,15 @@ static void kprobe_optimizer(struct work_struct *work) |
1964 | do_unoptimize_kprobes(); |
1965 | |
1966 | /* |
1967 | - * Step 2: Wait for quiesence period to ensure all running interrupts |
1968 | - * are done. Because optprobe may modify multiple instructions |
1969 | - * there is a chance that Nth instruction is interrupted. In that |
1970 | - * case, running interrupt can return to 2nd-Nth byte of jump |
1971 | - * instruction. This wait is for avoiding it. |
1972 | + * Step 2: Wait for quiesence period to ensure all potentially |
1973 | + * preempted tasks to have normally scheduled. Because optprobe |
1974 | + * may modify multiple instructions, there is a chance that Nth |
1975 | + * instruction is preempted. In that case, such tasks can return |
1976 | + * to 2nd-Nth byte of jump instruction. This wait is for avoiding it. |
1977 | + * Note that on non-preemptive kernel, this is transparently converted |
1978 | + * to synchronoze_sched() to wait for all interrupts to have completed. |
1979 | */ |
1980 | - synchronize_sched(); |
1981 | + synchronize_rcu_tasks(); |
1982 | |
1983 | /* Step 3: Optimize kprobes after quiesence period */ |
1984 | do_optimize_kprobes(); |
1985 | diff --git a/mm/gup.c b/mm/gup.c |
1986 | index 165ba2174c75..e0d82b6706d7 100644 |
1987 | --- a/mm/gup.c |
1988 | +++ b/mm/gup.c |
1989 | @@ -1707,6 +1707,47 @@ static int gup_p4d_range(pgd_t pgd, unsigned long addr, unsigned long end, |
1990 | return 1; |
1991 | } |
1992 | |
1993 | +static void gup_pgd_range(unsigned long addr, unsigned long end, |
1994 | + int write, struct page **pages, int *nr) |
1995 | +{ |
1996 | + unsigned long next; |
1997 | + pgd_t *pgdp; |
1998 | + |
1999 | + pgdp = pgd_offset(current->mm, addr); |
2000 | + do { |
2001 | + pgd_t pgd = READ_ONCE(*pgdp); |
2002 | + |
2003 | + next = pgd_addr_end(addr, end); |
2004 | + if (pgd_none(pgd)) |
2005 | + return; |
2006 | + if (unlikely(pgd_huge(pgd))) { |
2007 | + if (!gup_huge_pgd(pgd, pgdp, addr, next, write, |
2008 | + pages, nr)) |
2009 | + return; |
2010 | + } else if (unlikely(is_hugepd(__hugepd(pgd_val(pgd))))) { |
2011 | + if (!gup_huge_pd(__hugepd(pgd_val(pgd)), addr, |
2012 | + PGDIR_SHIFT, next, write, pages, nr)) |
2013 | + return; |
2014 | + } else if (!gup_p4d_range(pgd, addr, next, write, pages, nr)) |
2015 | + return; |
2016 | + } while (pgdp++, addr = next, addr != end); |
2017 | +} |
2018 | + |
2019 | +#ifndef gup_fast_permitted |
2020 | +/* |
2021 | + * Check if it's allowed to use __get_user_pages_fast() for the range, or |
2022 | + * we need to fall back to the slow version: |
2023 | + */ |
2024 | +bool gup_fast_permitted(unsigned long start, int nr_pages, int write) |
2025 | +{ |
2026 | + unsigned long len, end; |
2027 | + |
2028 | + len = (unsigned long) nr_pages << PAGE_SHIFT; |
2029 | + end = start + len; |
2030 | + return end >= start; |
2031 | +} |
2032 | +#endif |
2033 | + |
2034 | /* |
2035 | * Like get_user_pages_fast() except it's IRQ-safe in that it won't fall back to |
2036 | * the regular GUP. It will only return non-negative values. |
2037 | @@ -1714,10 +1755,8 @@ static int gup_p4d_range(pgd_t pgd, unsigned long addr, unsigned long end, |
2038 | int __get_user_pages_fast(unsigned long start, int nr_pages, int write, |
2039 | struct page **pages) |
2040 | { |
2041 | - struct mm_struct *mm = current->mm; |
2042 | unsigned long addr, len, end; |
2043 | - unsigned long next, flags; |
2044 | - pgd_t *pgdp; |
2045 | + unsigned long flags; |
2046 | int nr = 0; |
2047 | |
2048 | start &= PAGE_MASK; |
2049 | @@ -1741,45 +1780,15 @@ int __get_user_pages_fast(unsigned long start, int nr_pages, int write, |
2050 | * block IPIs that come from THPs splitting. |
2051 | */ |
2052 | |
2053 | - local_irq_save(flags); |
2054 | - pgdp = pgd_offset(mm, addr); |
2055 | - do { |
2056 | - pgd_t pgd = READ_ONCE(*pgdp); |
2057 | - |
2058 | - next = pgd_addr_end(addr, end); |
2059 | - if (pgd_none(pgd)) |
2060 | - break; |
2061 | - if (unlikely(pgd_huge(pgd))) { |
2062 | - if (!gup_huge_pgd(pgd, pgdp, addr, next, write, |
2063 | - pages, &nr)) |
2064 | - break; |
2065 | - } else if (unlikely(is_hugepd(__hugepd(pgd_val(pgd))))) { |
2066 | - if (!gup_huge_pd(__hugepd(pgd_val(pgd)), addr, |
2067 | - PGDIR_SHIFT, next, write, pages, &nr)) |
2068 | - break; |
2069 | - } else if (!gup_p4d_range(pgd, addr, next, write, pages, &nr)) |
2070 | - break; |
2071 | - } while (pgdp++, addr = next, addr != end); |
2072 | - local_irq_restore(flags); |
2073 | + if (gup_fast_permitted(start, nr_pages, write)) { |
2074 | + local_irq_save(flags); |
2075 | + gup_pgd_range(addr, end, write, pages, &nr); |
2076 | + local_irq_restore(flags); |
2077 | + } |
2078 | |
2079 | return nr; |
2080 | } |
2081 | |
2082 | -#ifndef gup_fast_permitted |
2083 | -/* |
2084 | - * Check if it's allowed to use __get_user_pages_fast() for the range, or |
2085 | - * we need to fall back to the slow version: |
2086 | - */ |
2087 | -bool gup_fast_permitted(unsigned long start, int nr_pages, int write) |
2088 | -{ |
2089 | - unsigned long len, end; |
2090 | - |
2091 | - len = (unsigned long) nr_pages << PAGE_SHIFT; |
2092 | - end = start + len; |
2093 | - return end >= start; |
2094 | -} |
2095 | -#endif |
2096 | - |
2097 | /** |
2098 | * get_user_pages_fast() - pin user pages in memory |
2099 | * @start: starting user address |
2100 | @@ -1799,12 +1808,22 @@ bool gup_fast_permitted(unsigned long start, int nr_pages, int write) |
2101 | int get_user_pages_fast(unsigned long start, int nr_pages, int write, |
2102 | struct page **pages) |
2103 | { |
2104 | + unsigned long addr, len, end; |
2105 | int nr = 0, ret = 0; |
2106 | |
2107 | start &= PAGE_MASK; |
2108 | + addr = start; |
2109 | + len = (unsigned long) nr_pages << PAGE_SHIFT; |
2110 | + end = start + len; |
2111 | + |
2112 | + if (unlikely(!access_ok(write ? VERIFY_WRITE : VERIFY_READ, |
2113 | + (void __user *)start, len))) |
2114 | + return 0; |
2115 | |
2116 | if (gup_fast_permitted(start, nr_pages, write)) { |
2117 | - nr = __get_user_pages_fast(start, nr_pages, write, pages); |
2118 | + local_irq_disable(); |
2119 | + gup_pgd_range(addr, end, write, pages, &nr); |
2120 | + local_irq_enable(); |
2121 | ret = nr; |
2122 | } |
2123 | |
2124 | diff --git a/security/integrity/ima/ima_main.c b/security/integrity/ima/ima_main.c |
2125 | index 2aebb7984437..ab70a395f490 100644 |
2126 | --- a/security/integrity/ima/ima_main.c |
2127 | +++ b/security/integrity/ima/ima_main.c |
2128 | @@ -51,6 +51,8 @@ static int __init hash_setup(char *str) |
2129 | ima_hash_algo = HASH_ALGO_SHA1; |
2130 | else if (strncmp(str, "md5", 3) == 0) |
2131 | ima_hash_algo = HASH_ALGO_MD5; |
2132 | + else |
2133 | + return 1; |
2134 | goto out; |
2135 | } |
2136 | |
2137 | @@ -60,6 +62,8 @@ static int __init hash_setup(char *str) |
2138 | break; |
2139 | } |
2140 | } |
2141 | + if (i == HASH_ALGO__LAST) |
2142 | + return 1; |
2143 | out: |
2144 | hash_setup_done = 1; |
2145 | return 1; |
2146 | diff --git a/tools/include/linux/poison.h b/tools/include/linux/poison.h |
2147 | index 4bf6777a8a03..9fdcd3eaac3b 100644 |
2148 | --- a/tools/include/linux/poison.h |
2149 | +++ b/tools/include/linux/poison.h |
2150 | @@ -15,6 +15,10 @@ |
2151 | # define POISON_POINTER_DELTA 0 |
2152 | #endif |
2153 | |
2154 | +#ifdef __cplusplus |
2155 | +#define LIST_POISON1 NULL |
2156 | +#define LIST_POISON2 NULL |
2157 | +#else |
2158 | /* |
2159 | * These are non-NULL pointers that will result in page faults |
2160 | * under normal circumstances, used to verify that nobody uses |
2161 | @@ -22,6 +26,7 @@ |
2162 | */ |
2163 | #define LIST_POISON1 ((void *) 0x100 + POISON_POINTER_DELTA) |
2164 | #define LIST_POISON2 ((void *) 0x200 + POISON_POINTER_DELTA) |
2165 | +#endif |
2166 | |
2167 | /********** include/linux/timer.h **********/ |
2168 | /* |
2169 | diff --git a/tools/perf/builtin-c2c.c b/tools/perf/builtin-c2c.c |
2170 | index fd32ad08c6d4..d00aac51130d 100644 |
2171 | --- a/tools/perf/builtin-c2c.c |
2172 | +++ b/tools/perf/builtin-c2c.c |
2173 | @@ -2733,6 +2733,7 @@ static int perf_c2c__record(int argc, const char **argv) |
2174 | if (!perf_mem_events[j].supported) { |
2175 | pr_err("failed: event '%s' not supported\n", |
2176 | perf_mem_events[j].name); |
2177 | + free(rec_argv); |
2178 | return -1; |
2179 | } |
2180 | |
2181 | diff --git a/tools/perf/builtin-mem.c b/tools/perf/builtin-mem.c |
2182 | index 4db960085273..e15efba605f6 100644 |
2183 | --- a/tools/perf/builtin-mem.c |
2184 | +++ b/tools/perf/builtin-mem.c |
2185 | @@ -113,6 +113,7 @@ static int __cmd_record(int argc, const char **argv, struct perf_mem *mem) |
2186 | if (!perf_mem_events[j].supported) { |
2187 | pr_err("failed: event '%s' not supported\n", |
2188 | perf_mem_events__name(j)); |
2189 | + free(rec_argv); |
2190 | return -1; |
2191 | } |
2192 | |
2193 | diff --git a/tools/perf/builtin-timechart.c b/tools/perf/builtin-timechart.c |
2194 | index 4e2e61695986..01de01ca14f2 100644 |
2195 | --- a/tools/perf/builtin-timechart.c |
2196 | +++ b/tools/perf/builtin-timechart.c |
2197 | @@ -1732,8 +1732,10 @@ static int timechart__io_record(int argc, const char **argv) |
2198 | if (rec_argv == NULL) |
2199 | return -ENOMEM; |
2200 | |
2201 | - if (asprintf(&filter, "common_pid != %d", getpid()) < 0) |
2202 | + if (asprintf(&filter, "common_pid != %d", getpid()) < 0) { |
2203 | + free(rec_argv); |
2204 | return -ENOMEM; |
2205 | + } |
2206 | |
2207 | p = rec_argv; |
2208 | for (i = 0; i < common_args_nr; i++) |
2209 | diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c |
2210 | index d5d7fff1c211..8e3c4ec00017 100644 |
2211 | --- a/tools/perf/builtin-trace.c |
2212 | +++ b/tools/perf/builtin-trace.c |
2213 | @@ -2086,6 +2086,7 @@ static int trace__record(struct trace *trace, int argc, const char **argv) |
2214 | rec_argv[j++] = "syscalls:sys_enter,syscalls:sys_exit"; |
2215 | else { |
2216 | pr_err("Neither raw_syscalls nor syscalls events exist.\n"); |
2217 | + free(rec_argv); |
2218 | return -1; |
2219 | } |
2220 | } |
2221 | diff --git a/tools/perf/tests/attr.c b/tools/perf/tests/attr.c |
2222 | index c180bbcdbef6..0e1367f90af5 100644 |
2223 | --- a/tools/perf/tests/attr.c |
2224 | +++ b/tools/perf/tests/attr.c |
2225 | @@ -167,7 +167,7 @@ static int run_dir(const char *d, const char *perf) |
2226 | snprintf(cmd, 3*PATH_MAX, PYTHON " %s/attr.py -d %s/attr/ -p %s %.*s", |
2227 | d, d, perf, vcnt, v); |
2228 | |
2229 | - return system(cmd); |
2230 | + return system(cmd) ? TEST_FAIL : TEST_OK; |
2231 | } |
2232 | |
2233 | int test__attr(struct test *test __maybe_unused, int subtest __maybe_unused) |
2234 | diff --git a/tools/perf/tests/attr.py b/tools/perf/tests/attr.py |
2235 | index 907b1b2f56ad..ff9b60b99f52 100644 |
2236 | --- a/tools/perf/tests/attr.py |
2237 | +++ b/tools/perf/tests/attr.py |
2238 | @@ -238,6 +238,7 @@ class Test(object): |
2239 | # events in result. Fail if there's not any. |
2240 | for exp_name, exp_event in expect.items(): |
2241 | exp_list = [] |
2242 | + res_event = {} |
2243 | log.debug(" matching [%s]" % exp_name) |
2244 | for res_name, res_event in result.items(): |
2245 | log.debug(" to [%s]" % res_name) |
2246 | @@ -254,7 +255,10 @@ class Test(object): |
2247 | if exp_event.optional(): |
2248 | log.debug(" %s does not match, but is optional" % exp_name) |
2249 | else: |
2250 | - exp_event.diff(res_event) |
2251 | + if not res_event: |
2252 | + log.debug(" res_event is empty"); |
2253 | + else: |
2254 | + exp_event.diff(res_event) |
2255 | raise Fail(self, 'match failure'); |
2256 | |
2257 | match[exp_name] = exp_list |
2258 | diff --git a/tools/testing/selftests/x86/ldt_gdt.c b/tools/testing/selftests/x86/ldt_gdt.c |
2259 | index 961e3ee26c27..2afc41a3730f 100644 |
2260 | --- a/tools/testing/selftests/x86/ldt_gdt.c |
2261 | +++ b/tools/testing/selftests/x86/ldt_gdt.c |
2262 | @@ -115,7 +115,15 @@ static void check_valid_segment(uint16_t index, int ldt, |
2263 | return; |
2264 | } |
2265 | |
2266 | - if (ar != expected_ar) { |
2267 | + /* The SDM says "bits 19:16 are undefined". Thanks. */ |
2268 | + ar &= ~0xF0000; |
2269 | + |
2270 | + /* |
2271 | + * NB: Different Linux versions do different things with the |
2272 | + * accessed bit in set_thread_area(). |
2273 | + */ |
2274 | + if (ar != expected_ar && |
2275 | + (ldt || ar != (expected_ar | AR_ACCESSED))) { |
2276 | printf("[FAIL]\t%s entry %hu has AR 0x%08X but expected 0x%08X\n", |
2277 | (ldt ? "LDT" : "GDT"), index, ar, expected_ar); |
2278 | nerrs++; |
2279 | @@ -367,9 +375,24 @@ static void do_simple_tests(void) |
2280 | install_invalid(&desc, false); |
2281 | |
2282 | desc.seg_not_present = 0; |
2283 | - desc.read_exec_only = 0; |
2284 | desc.seg_32bit = 1; |
2285 | + desc.read_exec_only = 0; |
2286 | + desc.limit = 0xfffff; |
2287 | + |
2288 | install_valid(&desc, AR_DPL3 | AR_TYPE_RWDATA | AR_S | AR_P | AR_DB); |
2289 | + |
2290 | + desc.limit_in_pages = 1; |
2291 | + |
2292 | + install_valid(&desc, AR_DPL3 | AR_TYPE_RWDATA | AR_S | AR_P | AR_DB | AR_G); |
2293 | + desc.read_exec_only = 1; |
2294 | + install_valid(&desc, AR_DPL3 | AR_TYPE_RODATA | AR_S | AR_P | AR_DB | AR_G); |
2295 | + desc.contents = 1; |
2296 | + desc.read_exec_only = 0; |
2297 | + install_valid(&desc, AR_DPL3 | AR_TYPE_RWDATA_EXPDOWN | AR_S | AR_P | AR_DB | AR_G); |
2298 | + desc.read_exec_only = 1; |
2299 | + install_valid(&desc, AR_DPL3 | AR_TYPE_RODATA_EXPDOWN | AR_S | AR_P | AR_DB | AR_G); |
2300 | + |
2301 | + desc.limit = 0; |
2302 | install_invalid(&desc, true); |
2303 | } |
2304 | |
2305 | diff --git a/tools/usb/usbip/Makefile.am b/tools/usb/usbip/Makefile.am |
2306 | index da3a430849a8..5961e9c18812 100644 |
2307 | --- a/tools/usb/usbip/Makefile.am |
2308 | +++ b/tools/usb/usbip/Makefile.am |
2309 | @@ -2,6 +2,7 @@ |
2310 | SUBDIRS := libsrc src |
2311 | includedir = @includedir@/usbip |
2312 | include_HEADERS := $(addprefix libsrc/, \ |
2313 | - usbip_common.h vhci_driver.h usbip_host_driver.h) |
2314 | + usbip_common.h vhci_driver.h usbip_host_driver.h \ |
2315 | + list.h sysfs_utils.h usbip_host_common.h) |
2316 | |
2317 | dist_man_MANS := $(addprefix doc/, usbip.8 usbipd.8) |
2318 | diff --git a/tools/usb/usbip/libsrc/vhci_driver.c b/tools/usb/usbip/libsrc/vhci_driver.c |
2319 | index 5727dfb15a83..8a1cd1616de4 100644 |
2320 | --- a/tools/usb/usbip/libsrc/vhci_driver.c |
2321 | +++ b/tools/usb/usbip/libsrc/vhci_driver.c |
2322 | @@ -329,9 +329,17 @@ int usbip_vhci_refresh_device_list(void) |
2323 | int usbip_vhci_get_free_port(uint32_t speed) |
2324 | { |
2325 | for (int i = 0; i < vhci_driver->nports; i++) { |
2326 | - if (speed == USB_SPEED_SUPER && |
2327 | - vhci_driver->idev[i].hub != HUB_SPEED_SUPER) |
2328 | - continue; |
2329 | + |
2330 | + switch (speed) { |
2331 | + case USB_SPEED_SUPER: |
2332 | + if (vhci_driver->idev[i].hub != HUB_SPEED_SUPER) |
2333 | + continue; |
2334 | + break; |
2335 | + default: |
2336 | + if (vhci_driver->idev[i].hub != HUB_SPEED_HIGH) |
2337 | + continue; |
2338 | + break; |
2339 | + } |
2340 | |
2341 | if (vhci_driver->idev[i].status == VDEV_ST_NULL) |
2342 | return vhci_driver->idev[i].port; |