Annotation of /trunk/kernel-magellan/patches-5.0/0100-5.0.1-all-fixes.patch
Parent Directory | Revision Log
Revision 3327 -
(hide annotations)
(download)
Fri Apr 26 12:19:47 2019 UTC (5 years ago) by niro
File size: 71154 byte(s)
Fri Apr 26 12:19:47 2019 UTC (5 years ago) by niro
File size: 71154 byte(s)
-linux-5.0.1
1 | niro | 3327 | diff --git a/Makefile b/Makefile |
2 | index d5713e7b1e506..3cd7163fe1646 100644 | ||
3 | --- a/Makefile | ||
4 | +++ b/Makefile | ||
5 | @@ -1,7 +1,7 @@ | ||
6 | # SPDX-License-Identifier: GPL-2.0 | ||
7 | VERSION = 5 | ||
8 | PATCHLEVEL = 0 | ||
9 | -SUBLEVEL = 0 | ||
10 | +SUBLEVEL = 1 | ||
11 | EXTRAVERSION = | ||
12 | NAME = Shy Crocodile | ||
13 | |||
14 | diff --git a/arch/alpha/kernel/syscalls/syscall.tbl b/arch/alpha/kernel/syscalls/syscall.tbl | ||
15 | index 7b56a53be5e30..e09558edae73a 100644 | ||
16 | --- a/arch/alpha/kernel/syscalls/syscall.tbl | ||
17 | +++ b/arch/alpha/kernel/syscalls/syscall.tbl | ||
18 | @@ -451,3 +451,4 @@ | ||
19 | 520 common preadv2 sys_preadv2 | ||
20 | 521 common pwritev2 sys_pwritev2 | ||
21 | 522 common statx sys_statx | ||
22 | +523 common io_pgetevents sys_io_pgetevents | ||
23 | diff --git a/arch/mips/kernel/irq.c b/arch/mips/kernel/irq.c | ||
24 | index ba150c755fcce..85b6c60f285d2 100644 | ||
25 | --- a/arch/mips/kernel/irq.c | ||
26 | +++ b/arch/mips/kernel/irq.c | ||
27 | @@ -52,6 +52,7 @@ asmlinkage void spurious_interrupt(void) | ||
28 | void __init init_IRQ(void) | ||
29 | { | ||
30 | int i; | ||
31 | + unsigned int order = get_order(IRQ_STACK_SIZE); | ||
32 | |||
33 | for (i = 0; i < NR_IRQS; i++) | ||
34 | irq_set_noprobe(i); | ||
35 | @@ -62,8 +63,7 @@ void __init init_IRQ(void) | ||
36 | arch_init_irq(); | ||
37 | |||
38 | for_each_possible_cpu(i) { | ||
39 | - int irq_pages = IRQ_STACK_SIZE / PAGE_SIZE; | ||
40 | - void *s = (void *)__get_free_pages(GFP_KERNEL, irq_pages); | ||
41 | + void *s = (void *)__get_free_pages(GFP_KERNEL, order); | ||
42 | |||
43 | irq_stack[i] = s; | ||
44 | pr_debug("CPU%d IRQ stack at 0x%p - 0x%p\n", i, | ||
45 | diff --git a/arch/x86/boot/compressed/pgtable_64.c b/arch/x86/boot/compressed/pgtable_64.c | ||
46 | index 9e21573714910..f8debf7aeb4c1 100644 | ||
47 | --- a/arch/x86/boot/compressed/pgtable_64.c | ||
48 | +++ b/arch/x86/boot/compressed/pgtable_64.c | ||
49 | @@ -1,5 +1,7 @@ | ||
50 | +#include <linux/efi.h> | ||
51 | #include <asm/e820/types.h> | ||
52 | #include <asm/processor.h> | ||
53 | +#include <asm/efi.h> | ||
54 | #include "pgtable.h" | ||
55 | #include "../string.h" | ||
56 | |||
57 | @@ -37,9 +39,10 @@ int cmdline_find_option_bool(const char *option); | ||
58 | |||
59 | static unsigned long find_trampoline_placement(void) | ||
60 | { | ||
61 | - unsigned long bios_start, ebda_start; | ||
62 | + unsigned long bios_start = 0, ebda_start = 0; | ||
63 | unsigned long trampoline_start; | ||
64 | struct boot_e820_entry *entry; | ||
65 | + char *signature; | ||
66 | int i; | ||
67 | |||
68 | /* | ||
69 | @@ -47,8 +50,18 @@ static unsigned long find_trampoline_placement(void) | ||
70 | * This code is based on reserve_bios_regions(). | ||
71 | */ | ||
72 | |||
73 | - ebda_start = *(unsigned short *)0x40e << 4; | ||
74 | - bios_start = *(unsigned short *)0x413 << 10; | ||
75 | + /* | ||
76 | + * EFI systems may not provide legacy ROM. The memory may not be mapped | ||
77 | + * at all. | ||
78 | + * | ||
79 | + * Only look for values in the legacy ROM for non-EFI system. | ||
80 | + */ | ||
81 | + signature = (char *)&boot_params->efi_info.efi_loader_signature; | ||
82 | + if (strncmp(signature, EFI32_LOADER_SIGNATURE, 4) && | ||
83 | + strncmp(signature, EFI64_LOADER_SIGNATURE, 4)) { | ||
84 | + ebda_start = *(unsigned short *)0x40e << 4; | ||
85 | + bios_start = *(unsigned short *)0x413 << 10; | ||
86 | + } | ||
87 | |||
88 | if (bios_start < BIOS_START_MIN || bios_start > BIOS_START_MAX) | ||
89 | bios_start = BIOS_START_MAX; | ||
90 | diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c | ||
91 | index 69f6bbb41be0b..01004bfb1a1bc 100644 | ||
92 | --- a/arch/x86/kernel/cpu/amd.c | ||
93 | +++ b/arch/x86/kernel/cpu/amd.c | ||
94 | @@ -819,11 +819,9 @@ static void init_amd_bd(struct cpuinfo_x86 *c) | ||
95 | static void init_amd_zn(struct cpuinfo_x86 *c) | ||
96 | { | ||
97 | set_cpu_cap(c, X86_FEATURE_ZEN); | ||
98 | - /* | ||
99 | - * Fix erratum 1076: CPB feature bit not being set in CPUID. It affects | ||
100 | - * all up to and including B1. | ||
101 | - */ | ||
102 | - if (c->x86_model <= 1 && c->x86_stepping <= 1) | ||
103 | + | ||
104 | + /* Fix erratum 1076: CPB feature bit not being set in CPUID. */ | ||
105 | + if (!cpu_has(c, X86_FEATURE_CPB)) | ||
106 | set_cpu_cap(c, X86_FEATURE_CPB); | ||
107 | } | ||
108 | |||
109 | diff --git a/arch/xtensa/kernel/process.c b/arch/xtensa/kernel/process.c | ||
110 | index 74969a437a37c..2e73395f0560c 100644 | ||
111 | --- a/arch/xtensa/kernel/process.c | ||
112 | +++ b/arch/xtensa/kernel/process.c | ||
113 | @@ -321,8 +321,8 @@ unsigned long get_wchan(struct task_struct *p) | ||
114 | |||
115 | /* Stack layout: sp-4: ra, sp-3: sp' */ | ||
116 | |||
117 | - pc = MAKE_PC_FROM_RA(*(unsigned long*)sp - 4, sp); | ||
118 | - sp = *(unsigned long *)sp - 3; | ||
119 | + pc = MAKE_PC_FROM_RA(SPILL_SLOT(sp, 0), sp); | ||
120 | + sp = SPILL_SLOT(sp, 1); | ||
121 | } while (count++ < 16); | ||
122 | return 0; | ||
123 | } | ||
124 | diff --git a/drivers/android/binder.c b/drivers/android/binder.c | ||
125 | index 4d2b2ad1ee0e1..01f80cbd27418 100644 | ||
126 | --- a/drivers/android/binder.c | ||
127 | +++ b/drivers/android/binder.c | ||
128 | @@ -329,6 +329,8 @@ struct binder_error { | ||
129 | * (invariant after initialized) | ||
130 | * @min_priority: minimum scheduling priority | ||
131 | * (invariant after initialized) | ||
132 | + * @txn_security_ctx: require sender's security context | ||
133 | + * (invariant after initialized) | ||
134 | * @async_todo: list of async work items | ||
135 | * (protected by @proc->inner_lock) | ||
136 | * | ||
137 | @@ -365,6 +367,7 @@ struct binder_node { | ||
138 | * invariant after initialization | ||
139 | */ | ||
140 | u8 accept_fds:1; | ||
141 | + u8 txn_security_ctx:1; | ||
142 | u8 min_priority; | ||
143 | }; | ||
144 | bool has_async_transaction; | ||
145 | @@ -615,6 +618,7 @@ struct binder_transaction { | ||
146 | long saved_priority; | ||
147 | kuid_t sender_euid; | ||
148 | struct list_head fd_fixups; | ||
149 | + binder_uintptr_t security_ctx; | ||
150 | /** | ||
151 | * @lock: protects @from, @to_proc, and @to_thread | ||
152 | * | ||
153 | @@ -1152,6 +1156,7 @@ static struct binder_node *binder_init_node_ilocked( | ||
154 | node->work.type = BINDER_WORK_NODE; | ||
155 | node->min_priority = flags & FLAT_BINDER_FLAG_PRIORITY_MASK; | ||
156 | node->accept_fds = !!(flags & FLAT_BINDER_FLAG_ACCEPTS_FDS); | ||
157 | + node->txn_security_ctx = !!(flags & FLAT_BINDER_FLAG_TXN_SECURITY_CTX); | ||
158 | spin_lock_init(&node->lock); | ||
159 | INIT_LIST_HEAD(&node->work.entry); | ||
160 | INIT_LIST_HEAD(&node->async_todo); | ||
161 | @@ -2778,6 +2783,8 @@ static void binder_transaction(struct binder_proc *proc, | ||
162 | binder_size_t last_fixup_min_off = 0; | ||
163 | struct binder_context *context = proc->context; | ||
164 | int t_debug_id = atomic_inc_return(&binder_last_id); | ||
165 | + char *secctx = NULL; | ||
166 | + u32 secctx_sz = 0; | ||
167 | |||
168 | e = binder_transaction_log_add(&binder_transaction_log); | ||
169 | e->debug_id = t_debug_id; | ||
170 | @@ -3020,6 +3027,20 @@ static void binder_transaction(struct binder_proc *proc, | ||
171 | t->flags = tr->flags; | ||
172 | t->priority = task_nice(current); | ||
173 | |||
174 | + if (target_node && target_node->txn_security_ctx) { | ||
175 | + u32 secid; | ||
176 | + | ||
177 | + security_task_getsecid(proc->tsk, &secid); | ||
178 | + ret = security_secid_to_secctx(secid, &secctx, &secctx_sz); | ||
179 | + if (ret) { | ||
180 | + return_error = BR_FAILED_REPLY; | ||
181 | + return_error_param = ret; | ||
182 | + return_error_line = __LINE__; | ||
183 | + goto err_get_secctx_failed; | ||
184 | + } | ||
185 | + extra_buffers_size += ALIGN(secctx_sz, sizeof(u64)); | ||
186 | + } | ||
187 | + | ||
188 | trace_binder_transaction(reply, t, target_node); | ||
189 | |||
190 | t->buffer = binder_alloc_new_buf(&target_proc->alloc, tr->data_size, | ||
191 | @@ -3036,6 +3057,19 @@ static void binder_transaction(struct binder_proc *proc, | ||
192 | t->buffer = NULL; | ||
193 | goto err_binder_alloc_buf_failed; | ||
194 | } | ||
195 | + if (secctx) { | ||
196 | + size_t buf_offset = ALIGN(tr->data_size, sizeof(void *)) + | ||
197 | + ALIGN(tr->offsets_size, sizeof(void *)) + | ||
198 | + ALIGN(extra_buffers_size, sizeof(void *)) - | ||
199 | + ALIGN(secctx_sz, sizeof(u64)); | ||
200 | + char *kptr = t->buffer->data + buf_offset; | ||
201 | + | ||
202 | + t->security_ctx = (uintptr_t)kptr + | ||
203 | + binder_alloc_get_user_buffer_offset(&target_proc->alloc); | ||
204 | + memcpy(kptr, secctx, secctx_sz); | ||
205 | + security_release_secctx(secctx, secctx_sz); | ||
206 | + secctx = NULL; | ||
207 | + } | ||
208 | t->buffer->debug_id = t->debug_id; | ||
209 | t->buffer->transaction = t; | ||
210 | t->buffer->target_node = target_node; | ||
211 | @@ -3305,6 +3339,9 @@ err_copy_data_failed: | ||
212 | t->buffer->transaction = NULL; | ||
213 | binder_alloc_free_buf(&target_proc->alloc, t->buffer); | ||
214 | err_binder_alloc_buf_failed: | ||
215 | + if (secctx) | ||
216 | + security_release_secctx(secctx, secctx_sz); | ||
217 | +err_get_secctx_failed: | ||
218 | kfree(tcomplete); | ||
219 | binder_stats_deleted(BINDER_STAT_TRANSACTION_COMPLETE); | ||
220 | err_alloc_tcomplete_failed: | ||
221 | @@ -4036,11 +4073,13 @@ retry: | ||
222 | |||
223 | while (1) { | ||
224 | uint32_t cmd; | ||
225 | - struct binder_transaction_data tr; | ||
226 | + struct binder_transaction_data_secctx tr; | ||
227 | + struct binder_transaction_data *trd = &tr.transaction_data; | ||
228 | struct binder_work *w = NULL; | ||
229 | struct list_head *list = NULL; | ||
230 | struct binder_transaction *t = NULL; | ||
231 | struct binder_thread *t_from; | ||
232 | + size_t trsize = sizeof(*trd); | ||
233 | |||
234 | binder_inner_proc_lock(proc); | ||
235 | if (!binder_worklist_empty_ilocked(&thread->todo)) | ||
236 | @@ -4240,8 +4279,8 @@ retry: | ||
237 | if (t->buffer->target_node) { | ||
238 | struct binder_node *target_node = t->buffer->target_node; | ||
239 | |||
240 | - tr.target.ptr = target_node->ptr; | ||
241 | - tr.cookie = target_node->cookie; | ||
242 | + trd->target.ptr = target_node->ptr; | ||
243 | + trd->cookie = target_node->cookie; | ||
244 | t->saved_priority = task_nice(current); | ||
245 | if (t->priority < target_node->min_priority && | ||
246 | !(t->flags & TF_ONE_WAY)) | ||
247 | @@ -4251,22 +4290,23 @@ retry: | ||
248 | binder_set_nice(target_node->min_priority); | ||
249 | cmd = BR_TRANSACTION; | ||
250 | } else { | ||
251 | - tr.target.ptr = 0; | ||
252 | - tr.cookie = 0; | ||
253 | + trd->target.ptr = 0; | ||
254 | + trd->cookie = 0; | ||
255 | cmd = BR_REPLY; | ||
256 | } | ||
257 | - tr.code = t->code; | ||
258 | - tr.flags = t->flags; | ||
259 | - tr.sender_euid = from_kuid(current_user_ns(), t->sender_euid); | ||
260 | + trd->code = t->code; | ||
261 | + trd->flags = t->flags; | ||
262 | + trd->sender_euid = from_kuid(current_user_ns(), t->sender_euid); | ||
263 | |||
264 | t_from = binder_get_txn_from(t); | ||
265 | if (t_from) { | ||
266 | struct task_struct *sender = t_from->proc->tsk; | ||
267 | |||
268 | - tr.sender_pid = task_tgid_nr_ns(sender, | ||
269 | - task_active_pid_ns(current)); | ||
270 | + trd->sender_pid = | ||
271 | + task_tgid_nr_ns(sender, | ||
272 | + task_active_pid_ns(current)); | ||
273 | } else { | ||
274 | - tr.sender_pid = 0; | ||
275 | + trd->sender_pid = 0; | ||
276 | } | ||
277 | |||
278 | ret = binder_apply_fd_fixups(t); | ||
279 | @@ -4297,15 +4337,20 @@ retry: | ||
280 | } | ||
281 | continue; | ||
282 | } | ||
283 | - tr.data_size = t->buffer->data_size; | ||
284 | - tr.offsets_size = t->buffer->offsets_size; | ||
285 | - tr.data.ptr.buffer = (binder_uintptr_t) | ||
286 | + trd->data_size = t->buffer->data_size; | ||
287 | + trd->offsets_size = t->buffer->offsets_size; | ||
288 | + trd->data.ptr.buffer = (binder_uintptr_t) | ||
289 | ((uintptr_t)t->buffer->data + | ||
290 | binder_alloc_get_user_buffer_offset(&proc->alloc)); | ||
291 | - tr.data.ptr.offsets = tr.data.ptr.buffer + | ||
292 | + trd->data.ptr.offsets = trd->data.ptr.buffer + | ||
293 | ALIGN(t->buffer->data_size, | ||
294 | sizeof(void *)); | ||
295 | |||
296 | + tr.secctx = t->security_ctx; | ||
297 | + if (t->security_ctx) { | ||
298 | + cmd = BR_TRANSACTION_SEC_CTX; | ||
299 | + trsize = sizeof(tr); | ||
300 | + } | ||
301 | if (put_user(cmd, (uint32_t __user *)ptr)) { | ||
302 | if (t_from) | ||
303 | binder_thread_dec_tmpref(t_from); | ||
304 | @@ -4316,7 +4361,7 @@ retry: | ||
305 | return -EFAULT; | ||
306 | } | ||
307 | ptr += sizeof(uint32_t); | ||
308 | - if (copy_to_user(ptr, &tr, sizeof(tr))) { | ||
309 | + if (copy_to_user(ptr, &tr, trsize)) { | ||
310 | if (t_from) | ||
311 | binder_thread_dec_tmpref(t_from); | ||
312 | |||
313 | @@ -4325,7 +4370,7 @@ retry: | ||
314 | |||
315 | return -EFAULT; | ||
316 | } | ||
317 | - ptr += sizeof(tr); | ||
318 | + ptr += trsize; | ||
319 | |||
320 | trace_binder_transaction_received(t); | ||
321 | binder_stat_br(proc, thread, cmd); | ||
322 | @@ -4333,16 +4378,18 @@ retry: | ||
323 | "%d:%d %s %d %d:%d, cmd %d size %zd-%zd ptr %016llx-%016llx\n", | ||
324 | proc->pid, thread->pid, | ||
325 | (cmd == BR_TRANSACTION) ? "BR_TRANSACTION" : | ||
326 | - "BR_REPLY", | ||
327 | + (cmd == BR_TRANSACTION_SEC_CTX) ? | ||
328 | + "BR_TRANSACTION_SEC_CTX" : "BR_REPLY", | ||
329 | t->debug_id, t_from ? t_from->proc->pid : 0, | ||
330 | t_from ? t_from->pid : 0, cmd, | ||
331 | t->buffer->data_size, t->buffer->offsets_size, | ||
332 | - (u64)tr.data.ptr.buffer, (u64)tr.data.ptr.offsets); | ||
333 | + (u64)trd->data.ptr.buffer, | ||
334 | + (u64)trd->data.ptr.offsets); | ||
335 | |||
336 | if (t_from) | ||
337 | binder_thread_dec_tmpref(t_from); | ||
338 | t->buffer->allow_user_free = 1; | ||
339 | - if (cmd == BR_TRANSACTION && !(t->flags & TF_ONE_WAY)) { | ||
340 | + if (cmd != BR_REPLY && !(t->flags & TF_ONE_WAY)) { | ||
341 | binder_inner_proc_lock(thread->proc); | ||
342 | t->to_parent = thread->transaction_stack; | ||
343 | t->to_thread = thread; | ||
344 | @@ -4690,7 +4737,8 @@ out: | ||
345 | return ret; | ||
346 | } | ||
347 | |||
348 | -static int binder_ioctl_set_ctx_mgr(struct file *filp) | ||
349 | +static int binder_ioctl_set_ctx_mgr(struct file *filp, | ||
350 | + struct flat_binder_object *fbo) | ||
351 | { | ||
352 | int ret = 0; | ||
353 | struct binder_proc *proc = filp->private_data; | ||
354 | @@ -4719,7 +4767,7 @@ static int binder_ioctl_set_ctx_mgr(struct file *filp) | ||
355 | } else { | ||
356 | context->binder_context_mgr_uid = curr_euid; | ||
357 | } | ||
358 | - new_node = binder_new_node(proc, NULL); | ||
359 | + new_node = binder_new_node(proc, fbo); | ||
360 | if (!new_node) { | ||
361 | ret = -ENOMEM; | ||
362 | goto out; | ||
363 | @@ -4842,8 +4890,20 @@ static long binder_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) | ||
364 | binder_inner_proc_unlock(proc); | ||
365 | break; | ||
366 | } | ||
367 | + case BINDER_SET_CONTEXT_MGR_EXT: { | ||
368 | + struct flat_binder_object fbo; | ||
369 | + | ||
370 | + if (copy_from_user(&fbo, ubuf, sizeof(fbo))) { | ||
371 | + ret = -EINVAL; | ||
372 | + goto err; | ||
373 | + } | ||
374 | + ret = binder_ioctl_set_ctx_mgr(filp, &fbo); | ||
375 | + if (ret) | ||
376 | + goto err; | ||
377 | + break; | ||
378 | + } | ||
379 | case BINDER_SET_CONTEXT_MGR: | ||
380 | - ret = binder_ioctl_set_ctx_mgr(filp); | ||
381 | + ret = binder_ioctl_set_ctx_mgr(filp, NULL); | ||
382 | if (ret) | ||
383 | goto err; | ||
384 | break; | ||
385 | diff --git a/drivers/base/dd.c b/drivers/base/dd.c | ||
386 | index 8ac10af17c004..d62487d024559 100644 | ||
387 | --- a/drivers/base/dd.c | ||
388 | +++ b/drivers/base/dd.c | ||
389 | @@ -968,9 +968,9 @@ static void __device_release_driver(struct device *dev, struct device *parent) | ||
390 | drv->remove(dev); | ||
391 | |||
392 | device_links_driver_cleanup(dev); | ||
393 | - arch_teardown_dma_ops(dev); | ||
394 | |||
395 | devres_release_all(dev); | ||
396 | + arch_teardown_dma_ops(dev); | ||
397 | dev->driver = NULL; | ||
398 | dev_set_drvdata(dev, NULL); | ||
399 | if (dev->pm_domain && dev->pm_domain->dismiss) | ||
400 | diff --git a/drivers/bluetooth/btrtl.c b/drivers/bluetooth/btrtl.c | ||
401 | index 41405de27d665..c91bba00df4e4 100644 | ||
402 | --- a/drivers/bluetooth/btrtl.c | ||
403 | +++ b/drivers/bluetooth/btrtl.c | ||
404 | @@ -552,10 +552,9 @@ struct btrtl_device_info *btrtl_initialize(struct hci_dev *hdev, | ||
405 | hdev->bus); | ||
406 | |||
407 | if (!btrtl_dev->ic_info) { | ||
408 | - rtl_dev_err(hdev, "rtl: unknown IC info, lmp subver %04x, hci rev %04x, hci ver %04x", | ||
409 | + rtl_dev_info(hdev, "rtl: unknown IC info, lmp subver %04x, hci rev %04x, hci ver %04x", | ||
410 | lmp_subver, hci_rev, hci_ver); | ||
411 | - ret = -EINVAL; | ||
412 | - goto err_free; | ||
413 | + return btrtl_dev; | ||
414 | } | ||
415 | |||
416 | if (btrtl_dev->ic_info->has_rom_version) { | ||
417 | @@ -610,6 +609,11 @@ int btrtl_download_firmware(struct hci_dev *hdev, | ||
418 | * standard btusb. Once that firmware is uploaded, the subver changes | ||
419 | * to a different value. | ||
420 | */ | ||
421 | + if (!btrtl_dev->ic_info) { | ||
422 | + rtl_dev_info(hdev, "rtl: assuming no firmware upload needed\n"); | ||
423 | + return 0; | ||
424 | + } | ||
425 | + | ||
426 | switch (btrtl_dev->ic_info->lmp_subver) { | ||
427 | case RTL_ROM_LMP_8723A: | ||
428 | case RTL_ROM_LMP_3499: | ||
429 | diff --git a/drivers/char/applicom.c b/drivers/char/applicom.c | ||
430 | index c0a5b1f3a9863..4ccc39e00ced3 100644 | ||
431 | --- a/drivers/char/applicom.c | ||
432 | +++ b/drivers/char/applicom.c | ||
433 | @@ -32,6 +32,7 @@ | ||
434 | #include <linux/wait.h> | ||
435 | #include <linux/init.h> | ||
436 | #include <linux/fs.h> | ||
437 | +#include <linux/nospec.h> | ||
438 | |||
439 | #include <asm/io.h> | ||
440 | #include <linux/uaccess.h> | ||
441 | @@ -386,7 +387,11 @@ static ssize_t ac_write(struct file *file, const char __user *buf, size_t count, | ||
442 | TicCard = st_loc.tic_des_from_pc; /* tic number to send */ | ||
443 | IndexCard = NumCard - 1; | ||
444 | |||
445 | - if((NumCard < 1) || (NumCard > MAX_BOARD) || !apbs[IndexCard].RamIO) | ||
446 | + if (IndexCard >= MAX_BOARD) | ||
447 | + return -EINVAL; | ||
448 | + IndexCard = array_index_nospec(IndexCard, MAX_BOARD); | ||
449 | + | ||
450 | + if (!apbs[IndexCard].RamIO) | ||
451 | return -EINVAL; | ||
452 | |||
453 | #ifdef DEBUG | ||
454 | @@ -697,6 +702,7 @@ static long ac_ioctl(struct file *file, unsigned int cmd, unsigned long arg) | ||
455 | unsigned char IndexCard; | ||
456 | void __iomem *pmem; | ||
457 | int ret = 0; | ||
458 | + static int warncount = 10; | ||
459 | volatile unsigned char byte_reset_it; | ||
460 | struct st_ram_io *adgl; | ||
461 | void __user *argp = (void __user *)arg; | ||
462 | @@ -711,16 +717,12 @@ static long ac_ioctl(struct file *file, unsigned int cmd, unsigned long arg) | ||
463 | mutex_lock(&ac_mutex); | ||
464 | IndexCard = adgl->num_card-1; | ||
465 | |||
466 | - if(cmd != 6 && ((IndexCard >= MAX_BOARD) || !apbs[IndexCard].RamIO)) { | ||
467 | - static int warncount = 10; | ||
468 | - if (warncount) { | ||
469 | - printk( KERN_WARNING "APPLICOM driver IOCTL, bad board number %d\n",(int)IndexCard+1); | ||
470 | - warncount--; | ||
471 | - } | ||
472 | - kfree(adgl); | ||
473 | - mutex_unlock(&ac_mutex); | ||
474 | - return -EINVAL; | ||
475 | - } | ||
476 | + if (cmd != 6 && IndexCard >= MAX_BOARD) | ||
477 | + goto err; | ||
478 | + IndexCard = array_index_nospec(IndexCard, MAX_BOARD); | ||
479 | + | ||
480 | + if (cmd != 6 && !apbs[IndexCard].RamIO) | ||
481 | + goto err; | ||
482 | |||
483 | switch (cmd) { | ||
484 | |||
485 | @@ -838,5 +840,16 @@ static long ac_ioctl(struct file *file, unsigned int cmd, unsigned long arg) | ||
486 | kfree(adgl); | ||
487 | mutex_unlock(&ac_mutex); | ||
488 | return 0; | ||
489 | + | ||
490 | +err: | ||
491 | + if (warncount) { | ||
492 | + pr_warn("APPLICOM driver IOCTL, bad board number %d\n", | ||
493 | + (int)IndexCard + 1); | ||
494 | + warncount--; | ||
495 | + } | ||
496 | + kfree(adgl); | ||
497 | + mutex_unlock(&ac_mutex); | ||
498 | + return -EINVAL; | ||
499 | + | ||
500 | } | ||
501 | |||
502 | diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c | ||
503 | index e35a886e00bcf..ef0e33e21b988 100644 | ||
504 | --- a/drivers/cpufreq/cpufreq.c | ||
505 | +++ b/drivers/cpufreq/cpufreq.c | ||
506 | @@ -545,13 +545,13 @@ EXPORT_SYMBOL_GPL(cpufreq_policy_transition_delay_us); | ||
507 | * SYSFS INTERFACE * | ||
508 | *********************************************************************/ | ||
509 | static ssize_t show_boost(struct kobject *kobj, | ||
510 | - struct attribute *attr, char *buf) | ||
511 | + struct kobj_attribute *attr, char *buf) | ||
512 | { | ||
513 | return sprintf(buf, "%d\n", cpufreq_driver->boost_enabled); | ||
514 | } | ||
515 | |||
516 | -static ssize_t store_boost(struct kobject *kobj, struct attribute *attr, | ||
517 | - const char *buf, size_t count) | ||
518 | +static ssize_t store_boost(struct kobject *kobj, struct kobj_attribute *attr, | ||
519 | + const char *buf, size_t count) | ||
520 | { | ||
521 | int ret, enable; | ||
522 | |||
523 | diff --git a/drivers/cpufreq/intel_pstate.c b/drivers/cpufreq/intel_pstate.c | ||
524 | index dd66decf2087c..5ab6a4fe93aa6 100644 | ||
525 | --- a/drivers/cpufreq/intel_pstate.c | ||
526 | +++ b/drivers/cpufreq/intel_pstate.c | ||
527 | @@ -895,7 +895,7 @@ static void intel_pstate_update_policies(void) | ||
528 | /************************** sysfs begin ************************/ | ||
529 | #define show_one(file_name, object) \ | ||
530 | static ssize_t show_##file_name \ | ||
531 | - (struct kobject *kobj, struct attribute *attr, char *buf) \ | ||
532 | + (struct kobject *kobj, struct kobj_attribute *attr, char *buf) \ | ||
533 | { \ | ||
534 | return sprintf(buf, "%u\n", global.object); \ | ||
535 | } | ||
536 | @@ -904,7 +904,7 @@ static ssize_t intel_pstate_show_status(char *buf); | ||
537 | static int intel_pstate_update_status(const char *buf, size_t size); | ||
538 | |||
539 | static ssize_t show_status(struct kobject *kobj, | ||
540 | - struct attribute *attr, char *buf) | ||
541 | + struct kobj_attribute *attr, char *buf) | ||
542 | { | ||
543 | ssize_t ret; | ||
544 | |||
545 | @@ -915,7 +915,7 @@ static ssize_t show_status(struct kobject *kobj, | ||
546 | return ret; | ||
547 | } | ||
548 | |||
549 | -static ssize_t store_status(struct kobject *a, struct attribute *b, | ||
550 | +static ssize_t store_status(struct kobject *a, struct kobj_attribute *b, | ||
551 | const char *buf, size_t count) | ||
552 | { | ||
553 | char *p = memchr(buf, '\n', count); | ||
554 | @@ -929,7 +929,7 @@ static ssize_t store_status(struct kobject *a, struct attribute *b, | ||
555 | } | ||
556 | |||
557 | static ssize_t show_turbo_pct(struct kobject *kobj, | ||
558 | - struct attribute *attr, char *buf) | ||
559 | + struct kobj_attribute *attr, char *buf) | ||
560 | { | ||
561 | struct cpudata *cpu; | ||
562 | int total, no_turbo, turbo_pct; | ||
563 | @@ -955,7 +955,7 @@ static ssize_t show_turbo_pct(struct kobject *kobj, | ||
564 | } | ||
565 | |||
566 | static ssize_t show_num_pstates(struct kobject *kobj, | ||
567 | - struct attribute *attr, char *buf) | ||
568 | + struct kobj_attribute *attr, char *buf) | ||
569 | { | ||
570 | struct cpudata *cpu; | ||
571 | int total; | ||
572 | @@ -976,7 +976,7 @@ static ssize_t show_num_pstates(struct kobject *kobj, | ||
573 | } | ||
574 | |||
575 | static ssize_t show_no_turbo(struct kobject *kobj, | ||
576 | - struct attribute *attr, char *buf) | ||
577 | + struct kobj_attribute *attr, char *buf) | ||
578 | { | ||
579 | ssize_t ret; | ||
580 | |||
581 | @@ -998,7 +998,7 @@ static ssize_t show_no_turbo(struct kobject *kobj, | ||
582 | return ret; | ||
583 | } | ||
584 | |||
585 | -static ssize_t store_no_turbo(struct kobject *a, struct attribute *b, | ||
586 | +static ssize_t store_no_turbo(struct kobject *a, struct kobj_attribute *b, | ||
587 | const char *buf, size_t count) | ||
588 | { | ||
589 | unsigned int input; | ||
590 | @@ -1045,7 +1045,7 @@ static ssize_t store_no_turbo(struct kobject *a, struct attribute *b, | ||
591 | return count; | ||
592 | } | ||
593 | |||
594 | -static ssize_t store_max_perf_pct(struct kobject *a, struct attribute *b, | ||
595 | +static ssize_t store_max_perf_pct(struct kobject *a, struct kobj_attribute *b, | ||
596 | const char *buf, size_t count) | ||
597 | { | ||
598 | unsigned int input; | ||
599 | @@ -1075,7 +1075,7 @@ static ssize_t store_max_perf_pct(struct kobject *a, struct attribute *b, | ||
600 | return count; | ||
601 | } | ||
602 | |||
603 | -static ssize_t store_min_perf_pct(struct kobject *a, struct attribute *b, | ||
604 | +static ssize_t store_min_perf_pct(struct kobject *a, struct kobj_attribute *b, | ||
605 | const char *buf, size_t count) | ||
606 | { | ||
607 | unsigned int input; | ||
608 | @@ -1107,12 +1107,13 @@ static ssize_t store_min_perf_pct(struct kobject *a, struct attribute *b, | ||
609 | } | ||
610 | |||
611 | static ssize_t show_hwp_dynamic_boost(struct kobject *kobj, | ||
612 | - struct attribute *attr, char *buf) | ||
613 | + struct kobj_attribute *attr, char *buf) | ||
614 | { | ||
615 | return sprintf(buf, "%u\n", hwp_boost); | ||
616 | } | ||
617 | |||
618 | -static ssize_t store_hwp_dynamic_boost(struct kobject *a, struct attribute *b, | ||
619 | +static ssize_t store_hwp_dynamic_boost(struct kobject *a, | ||
620 | + struct kobj_attribute *b, | ||
621 | const char *buf, size_t count) | ||
622 | { | ||
623 | unsigned int input; | ||
624 | diff --git a/drivers/gnss/sirf.c b/drivers/gnss/sirf.c | ||
625 | index 226f6e6fe01bc..8e3f6a776e02e 100644 | ||
626 | --- a/drivers/gnss/sirf.c | ||
627 | +++ b/drivers/gnss/sirf.c | ||
628 | @@ -310,30 +310,26 @@ static int sirf_probe(struct serdev_device *serdev) | ||
629 | ret = -ENODEV; | ||
630 | goto err_put_device; | ||
631 | } | ||
632 | + | ||
633 | + ret = regulator_enable(data->vcc); | ||
634 | + if (ret) | ||
635 | + goto err_put_device; | ||
636 | + | ||
637 | + /* Wait for chip to boot into hibernate mode. */ | ||
638 | + msleep(SIRF_BOOT_DELAY); | ||
639 | } | ||
640 | |||
641 | if (data->wakeup) { | ||
642 | ret = gpiod_to_irq(data->wakeup); | ||
643 | if (ret < 0) | ||
644 | - goto err_put_device; | ||
645 | - | ||
646 | + goto err_disable_vcc; | ||
647 | data->irq = ret; | ||
648 | |||
649 | - ret = devm_request_threaded_irq(dev, data->irq, NULL, | ||
650 | - sirf_wakeup_handler, | ||
651 | + ret = request_threaded_irq(data->irq, NULL, sirf_wakeup_handler, | ||
652 | IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING | IRQF_ONESHOT, | ||
653 | "wakeup", data); | ||
654 | if (ret) | ||
655 | - goto err_put_device; | ||
656 | - } | ||
657 | - | ||
658 | - if (data->on_off) { | ||
659 | - ret = regulator_enable(data->vcc); | ||
660 | - if (ret) | ||
661 | - goto err_put_device; | ||
662 | - | ||
663 | - /* Wait for chip to boot into hibernate mode */ | ||
664 | - msleep(SIRF_BOOT_DELAY); | ||
665 | + goto err_disable_vcc; | ||
666 | } | ||
667 | |||
668 | if (IS_ENABLED(CONFIG_PM)) { | ||
669 | @@ -342,7 +338,7 @@ static int sirf_probe(struct serdev_device *serdev) | ||
670 | } else { | ||
671 | ret = sirf_runtime_resume(dev); | ||
672 | if (ret < 0) | ||
673 | - goto err_disable_vcc; | ||
674 | + goto err_free_irq; | ||
675 | } | ||
676 | |||
677 | ret = gnss_register_device(gdev); | ||
678 | @@ -356,6 +352,9 @@ err_disable_rpm: | ||
679 | pm_runtime_disable(dev); | ||
680 | else | ||
681 | sirf_runtime_suspend(dev); | ||
682 | +err_free_irq: | ||
683 | + if (data->wakeup) | ||
684 | + free_irq(data->irq, data); | ||
685 | err_disable_vcc: | ||
686 | if (data->on_off) | ||
687 | regulator_disable(data->vcc); | ||
688 | @@ -376,6 +375,9 @@ static void sirf_remove(struct serdev_device *serdev) | ||
689 | else | ||
690 | sirf_runtime_suspend(&serdev->dev); | ||
691 | |||
692 | + if (data->wakeup) | ||
693 | + free_irq(data->irq, data); | ||
694 | + | ||
695 | if (data->on_off) | ||
696 | regulator_disable(data->vcc); | ||
697 | |||
698 | diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c | ||
699 | index 7e3c00bd9532a..76cc163b3cf15 100644 | ||
700 | --- a/drivers/net/dsa/mv88e6xxx/chip.c | ||
701 | +++ b/drivers/net/dsa/mv88e6xxx/chip.c | ||
702 | @@ -4222,7 +4222,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = { | ||
703 | .name = "Marvell 88E6190", | ||
704 | .num_databases = 4096, | ||
705 | .num_ports = 11, /* 10 + Z80 */ | ||
706 | - .num_internal_phys = 11, | ||
707 | + .num_internal_phys = 9, | ||
708 | .num_gpio = 16, | ||
709 | .max_vid = 8191, | ||
710 | .port_base_addr = 0x0, | ||
711 | @@ -4245,7 +4245,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = { | ||
712 | .name = "Marvell 88E6190X", | ||
713 | .num_databases = 4096, | ||
714 | .num_ports = 11, /* 10 + Z80 */ | ||
715 | - .num_internal_phys = 11, | ||
716 | + .num_internal_phys = 9, | ||
717 | .num_gpio = 16, | ||
718 | .max_vid = 8191, | ||
719 | .port_base_addr = 0x0, | ||
720 | @@ -4268,7 +4268,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = { | ||
721 | .name = "Marvell 88E6191", | ||
722 | .num_databases = 4096, | ||
723 | .num_ports = 11, /* 10 + Z80 */ | ||
724 | - .num_internal_phys = 11, | ||
725 | + .num_internal_phys = 9, | ||
726 | .max_vid = 8191, | ||
727 | .port_base_addr = 0x0, | ||
728 | .phy_base_addr = 0x0, | ||
729 | @@ -4315,7 +4315,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = { | ||
730 | .name = "Marvell 88E6290", | ||
731 | .num_databases = 4096, | ||
732 | .num_ports = 11, /* 10 + Z80 */ | ||
733 | - .num_internal_phys = 11, | ||
734 | + .num_internal_phys = 9, | ||
735 | .num_gpio = 16, | ||
736 | .max_vid = 8191, | ||
737 | .port_base_addr = 0x0, | ||
738 | @@ -4477,7 +4477,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = { | ||
739 | .name = "Marvell 88E6390", | ||
740 | .num_databases = 4096, | ||
741 | .num_ports = 11, /* 10 + Z80 */ | ||
742 | - .num_internal_phys = 11, | ||
743 | + .num_internal_phys = 9, | ||
744 | .num_gpio = 16, | ||
745 | .max_vid = 8191, | ||
746 | .port_base_addr = 0x0, | ||
747 | @@ -4500,7 +4500,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = { | ||
748 | .name = "Marvell 88E6390X", | ||
749 | .num_databases = 4096, | ||
750 | .num_ports = 11, /* 10 + Z80 */ | ||
751 | - .num_internal_phys = 11, | ||
752 | + .num_internal_phys = 9, | ||
753 | .num_gpio = 16, | ||
754 | .max_vid = 8191, | ||
755 | .port_base_addr = 0x0, | ||
756 | @@ -4847,6 +4847,7 @@ static int mv88e6xxx_probe(struct mdio_device *mdiodev) | ||
757 | if (err) | ||
758 | goto out; | ||
759 | |||
760 | + mv88e6xxx_ports_cmode_init(chip); | ||
761 | mv88e6xxx_phy_init(chip); | ||
762 | |||
763 | if (chip->info->ops->get_eeprom) { | ||
764 | diff --git a/drivers/net/dsa/mv88e6xxx/port.c b/drivers/net/dsa/mv88e6xxx/port.c | ||
765 | index 79ab51e69aee4..184c2b1b31159 100644 | ||
766 | --- a/drivers/net/dsa/mv88e6xxx/port.c | ||
767 | +++ b/drivers/net/dsa/mv88e6xxx/port.c | ||
768 | @@ -190,7 +190,7 @@ int mv88e6xxx_port_set_duplex(struct mv88e6xxx_chip *chip, int port, int dup) | ||
769 | /* normal duplex detection */ | ||
770 | break; | ||
771 | default: | ||
772 | - return -EINVAL; | ||
773 | + return -EOPNOTSUPP; | ||
774 | } | ||
775 | |||
776 | err = mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_MAC_CTL, reg); | ||
777 | diff --git a/drivers/net/ethernet/marvell/sky2.c b/drivers/net/ethernet/marvell/sky2.c | ||
778 | index 57727fe1501ee..8b3495ee2b6eb 100644 | ||
779 | --- a/drivers/net/ethernet/marvell/sky2.c | ||
780 | +++ b/drivers/net/ethernet/marvell/sky2.c | ||
781 | @@ -46,6 +46,7 @@ | ||
782 | #include <linux/mii.h> | ||
783 | #include <linux/of_device.h> | ||
784 | #include <linux/of_net.h> | ||
785 | +#include <linux/dmi.h> | ||
786 | |||
787 | #include <asm/irq.h> | ||
788 | |||
789 | @@ -93,7 +94,7 @@ static int copybreak __read_mostly = 128; | ||
790 | module_param(copybreak, int, 0); | ||
791 | MODULE_PARM_DESC(copybreak, "Receive copy threshold"); | ||
792 | |||
793 | -static int disable_msi = 0; | ||
794 | +static int disable_msi = -1; | ||
795 | module_param(disable_msi, int, 0); | ||
796 | MODULE_PARM_DESC(disable_msi, "Disable Message Signaled Interrupt (MSI)"); | ||
797 | |||
798 | @@ -4917,6 +4918,24 @@ static const char *sky2_name(u8 chipid, char *buf, int sz) | ||
799 | return buf; | ||
800 | } | ||
801 | |||
802 | +static const struct dmi_system_id msi_blacklist[] = { | ||
803 | + { | ||
804 | + .ident = "Dell Inspiron 1545", | ||
805 | + .matches = { | ||
806 | + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
807 | + DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron 1545"), | ||
808 | + }, | ||
809 | + }, | ||
810 | + { | ||
811 | + .ident = "Gateway P-79", | ||
812 | + .matches = { | ||
813 | + DMI_MATCH(DMI_SYS_VENDOR, "Gateway"), | ||
814 | + DMI_MATCH(DMI_PRODUCT_NAME, "P-79"), | ||
815 | + }, | ||
816 | + }, | ||
817 | + {} | ||
818 | +}; | ||
819 | + | ||
820 | static int sky2_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | ||
821 | { | ||
822 | struct net_device *dev, *dev1; | ||
823 | @@ -5028,6 +5047,9 @@ static int sky2_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | ||
824 | goto err_out_free_pci; | ||
825 | } | ||
826 | |||
827 | + if (disable_msi == -1) | ||
828 | + disable_msi = !!dmi_check_system(msi_blacklist); | ||
829 | + | ||
830 | if (!disable_msi && pci_enable_msi(pdev) == 0) { | ||
831 | err = sky2_test_msi(hw); | ||
832 | if (err) { | ||
833 | diff --git a/drivers/net/ethernet/mscc/ocelot_board.c b/drivers/net/ethernet/mscc/ocelot_board.c | ||
834 | index ca3ea2fbfcd08..80d87798c62b8 100644 | ||
835 | --- a/drivers/net/ethernet/mscc/ocelot_board.c | ||
836 | +++ b/drivers/net/ethernet/mscc/ocelot_board.c | ||
837 | @@ -267,6 +267,7 @@ static int mscc_ocelot_probe(struct platform_device *pdev) | ||
838 | struct phy *serdes; | ||
839 | void __iomem *regs; | ||
840 | char res_name[8]; | ||
841 | + int phy_mode; | ||
842 | u32 port; | ||
843 | |||
844 | if (of_property_read_u32(portnp, "reg", &port)) | ||
845 | @@ -292,11 +293,11 @@ static int mscc_ocelot_probe(struct platform_device *pdev) | ||
846 | if (err) | ||
847 | return err; | ||
848 | |||
849 | - err = of_get_phy_mode(portnp); | ||
850 | - if (err < 0) | ||
851 | + phy_mode = of_get_phy_mode(portnp); | ||
852 | + if (phy_mode < 0) | ||
853 | ocelot->ports[port]->phy_mode = PHY_INTERFACE_MODE_NA; | ||
854 | else | ||
855 | - ocelot->ports[port]->phy_mode = err; | ||
856 | + ocelot->ports[port]->phy_mode = phy_mode; | ||
857 | |||
858 | switch (ocelot->ports[port]->phy_mode) { | ||
859 | case PHY_INTERFACE_MODE_NA: | ||
860 | @@ -304,6 +305,13 @@ static int mscc_ocelot_probe(struct platform_device *pdev) | ||
861 | case PHY_INTERFACE_MODE_SGMII: | ||
862 | break; | ||
863 | case PHY_INTERFACE_MODE_QSGMII: | ||
864 | + /* Ensure clock signals and speed is set on all | ||
865 | + * QSGMII links | ||
866 | + */ | ||
867 | + ocelot_port_writel(ocelot->ports[port], | ||
868 | + DEV_CLOCK_CFG_LINK_SPEED | ||
869 | + (OCELOT_SPEED_1000), | ||
870 | + DEV_CLOCK_CFG); | ||
871 | break; | ||
872 | default: | ||
873 | dev_err(ocelot->dev, | ||
874 | diff --git a/drivers/net/team/team_mode_loadbalance.c b/drivers/net/team/team_mode_loadbalance.c | ||
875 | index a5ef97010eb34..5541e1c19936c 100644 | ||
876 | --- a/drivers/net/team/team_mode_loadbalance.c | ||
877 | +++ b/drivers/net/team/team_mode_loadbalance.c | ||
878 | @@ -325,6 +325,20 @@ static int lb_bpf_func_set(struct team *team, struct team_gsetter_ctx *ctx) | ||
879 | return 0; | ||
880 | } | ||
881 | |||
882 | +static void lb_bpf_func_free(struct team *team) | ||
883 | +{ | ||
884 | + struct lb_priv *lb_priv = get_lb_priv(team); | ||
885 | + struct bpf_prog *fp; | ||
886 | + | ||
887 | + if (!lb_priv->ex->orig_fprog) | ||
888 | + return; | ||
889 | + | ||
890 | + __fprog_destroy(lb_priv->ex->orig_fprog); | ||
891 | + fp = rcu_dereference_protected(lb_priv->fp, | ||
892 | + lockdep_is_held(&team->lock)); | ||
893 | + bpf_prog_destroy(fp); | ||
894 | +} | ||
895 | + | ||
896 | static int lb_tx_method_get(struct team *team, struct team_gsetter_ctx *ctx) | ||
897 | { | ||
898 | struct lb_priv *lb_priv = get_lb_priv(team); | ||
899 | @@ -639,6 +653,7 @@ static void lb_exit(struct team *team) | ||
900 | |||
901 | team_options_unregister(team, lb_options, | ||
902 | ARRAY_SIZE(lb_options)); | ||
903 | + lb_bpf_func_free(team); | ||
904 | cancel_delayed_work_sync(&lb_priv->ex->stats.refresh_dw); | ||
905 | free_percpu(lb_priv->pcpu_stats); | ||
906 | kfree(lb_priv->ex); | ||
907 | diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c | ||
908 | index 18af2f8eee96a..74bebbdb4b158 100644 | ||
909 | --- a/drivers/net/usb/qmi_wwan.c | ||
910 | +++ b/drivers/net/usb/qmi_wwan.c | ||
911 | @@ -976,6 +976,13 @@ static const struct usb_device_id products[] = { | ||
912 | 0xff), | ||
913 | .driver_info = (unsigned long)&qmi_wwan_info_quirk_dtr, | ||
914 | }, | ||
915 | + { /* Quectel EG12/EM12 */ | ||
916 | + USB_DEVICE_AND_INTERFACE_INFO(0x2c7c, 0x0512, | ||
917 | + USB_CLASS_VENDOR_SPEC, | ||
918 | + USB_SUBCLASS_VENDOR_SPEC, | ||
919 | + 0xff), | ||
920 | + .driver_info = (unsigned long)&qmi_wwan_info_quirk_dtr, | ||
921 | + }, | ||
922 | |||
923 | /* 3. Combined interface devices matching on interface number */ | ||
924 | {QMI_FIXED_INTF(0x0408, 0xea42, 4)}, /* Yota / Megafon M100-1 */ | ||
925 | @@ -1343,17 +1350,20 @@ static bool quectel_ec20_detected(struct usb_interface *intf) | ||
926 | return false; | ||
927 | } | ||
928 | |||
929 | -static bool quectel_ep06_diag_detected(struct usb_interface *intf) | ||
930 | +static bool quectel_diag_detected(struct usb_interface *intf) | ||
931 | { | ||
932 | struct usb_device *dev = interface_to_usbdev(intf); | ||
933 | struct usb_interface_descriptor intf_desc = intf->cur_altsetting->desc; | ||
934 | + u16 id_vendor = le16_to_cpu(dev->descriptor.idVendor); | ||
935 | + u16 id_product = le16_to_cpu(dev->descriptor.idProduct); | ||
936 | |||
937 | - if (le16_to_cpu(dev->descriptor.idVendor) == 0x2c7c && | ||
938 | - le16_to_cpu(dev->descriptor.idProduct) == 0x0306 && | ||
939 | - intf_desc.bNumEndpoints == 2) | ||
940 | - return true; | ||
941 | + if (id_vendor != 0x2c7c || intf_desc.bNumEndpoints != 2) | ||
942 | + return false; | ||
943 | |||
944 | - return false; | ||
945 | + if (id_product == 0x0306 || id_product == 0x0512) | ||
946 | + return true; | ||
947 | + else | ||
948 | + return false; | ||
949 | } | ||
950 | |||
951 | static int qmi_wwan_probe(struct usb_interface *intf, | ||
952 | @@ -1390,13 +1400,13 @@ static int qmi_wwan_probe(struct usb_interface *intf, | ||
953 | return -ENODEV; | ||
954 | } | ||
955 | |||
956 | - /* Quectel EP06/EM06/EG06 supports dynamic interface configuration, so | ||
957 | + /* Several Quectel modems supports dynamic interface configuration, so | ||
958 | * we need to match on class/subclass/protocol. These values are | ||
959 | * identical for the diagnostic- and QMI-interface, but bNumEndpoints is | ||
960 | * different. Ignore the current interface if the number of endpoints | ||
961 | * the number for the diag interface (two). | ||
962 | */ | ||
963 | - if (quectel_ep06_diag_detected(intf)) | ||
964 | + if (quectel_diag_detected(intf)) | ||
965 | return -ENODEV; | ||
966 | |||
967 | return usbnet_probe(intf, id); | ||
968 | diff --git a/drivers/staging/android/ashmem.c b/drivers/staging/android/ashmem.c | ||
969 | index 90a8a9f1ac7d8..910826df4a316 100644 | ||
970 | --- a/drivers/staging/android/ashmem.c | ||
971 | +++ b/drivers/staging/android/ashmem.c | ||
972 | @@ -75,6 +75,9 @@ struct ashmem_range { | ||
973 | /* LRU list of unpinned pages, protected by ashmem_mutex */ | ||
974 | static LIST_HEAD(ashmem_lru_list); | ||
975 | |||
976 | +static atomic_t ashmem_shrink_inflight = ATOMIC_INIT(0); | ||
977 | +static DECLARE_WAIT_QUEUE_HEAD(ashmem_shrink_wait); | ||
978 | + | ||
979 | /* | ||
980 | * long lru_count - The count of pages on our LRU list. | ||
981 | * | ||
982 | @@ -168,19 +171,15 @@ static inline void lru_del(struct ashmem_range *range) | ||
983 | * @end: The ending page (inclusive) | ||
984 | * | ||
985 | * This function is protected by ashmem_mutex. | ||
986 | - * | ||
987 | - * Return: 0 if successful, or -ENOMEM if there is an error | ||
988 | */ | ||
989 | -static int range_alloc(struct ashmem_area *asma, | ||
990 | - struct ashmem_range *prev_range, unsigned int purged, | ||
991 | - size_t start, size_t end) | ||
992 | +static void range_alloc(struct ashmem_area *asma, | ||
993 | + struct ashmem_range *prev_range, unsigned int purged, | ||
994 | + size_t start, size_t end, | ||
995 | + struct ashmem_range **new_range) | ||
996 | { | ||
997 | - struct ashmem_range *range; | ||
998 | - | ||
999 | - range = kmem_cache_zalloc(ashmem_range_cachep, GFP_KERNEL); | ||
1000 | - if (!range) | ||
1001 | - return -ENOMEM; | ||
1002 | + struct ashmem_range *range = *new_range; | ||
1003 | |||
1004 | + *new_range = NULL; | ||
1005 | range->asma = asma; | ||
1006 | range->pgstart = start; | ||
1007 | range->pgend = end; | ||
1008 | @@ -190,8 +189,6 @@ static int range_alloc(struct ashmem_area *asma, | ||
1009 | |||
1010 | if (range_on_lru(range)) | ||
1011 | lru_add(range); | ||
1012 | - | ||
1013 | - return 0; | ||
1014 | } | ||
1015 | |||
1016 | /** | ||
1017 | @@ -438,7 +435,6 @@ out: | ||
1018 | static unsigned long | ||
1019 | ashmem_shrink_scan(struct shrinker *shrink, struct shrink_control *sc) | ||
1020 | { | ||
1021 | - struct ashmem_range *range, *next; | ||
1022 | unsigned long freed = 0; | ||
1023 | |||
1024 | /* We might recurse into filesystem code, so bail out if necessary */ | ||
1025 | @@ -448,21 +444,33 @@ ashmem_shrink_scan(struct shrinker *shrink, struct shrink_control *sc) | ||
1026 | if (!mutex_trylock(&ashmem_mutex)) | ||
1027 | return -1; | ||
1028 | |||
1029 | - list_for_each_entry_safe(range, next, &ashmem_lru_list, lru) { | ||
1030 | + while (!list_empty(&ashmem_lru_list)) { | ||
1031 | + struct ashmem_range *range = | ||
1032 | + list_first_entry(&ashmem_lru_list, typeof(*range), lru); | ||
1033 | loff_t start = range->pgstart * PAGE_SIZE; | ||
1034 | loff_t end = (range->pgend + 1) * PAGE_SIZE; | ||
1035 | + struct file *f = range->asma->file; | ||
1036 | |||
1037 | - range->asma->file->f_op->fallocate(range->asma->file, | ||
1038 | - FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE, | ||
1039 | - start, end - start); | ||
1040 | + get_file(f); | ||
1041 | + atomic_inc(&ashmem_shrink_inflight); | ||
1042 | range->purged = ASHMEM_WAS_PURGED; | ||
1043 | lru_del(range); | ||
1044 | |||
1045 | freed += range_size(range); | ||
1046 | + mutex_unlock(&ashmem_mutex); | ||
1047 | + f->f_op->fallocate(f, | ||
1048 | + FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE, | ||
1049 | + start, end - start); | ||
1050 | + fput(f); | ||
1051 | + if (atomic_dec_and_test(&ashmem_shrink_inflight)) | ||
1052 | + wake_up_all(&ashmem_shrink_wait); | ||
1053 | + if (!mutex_trylock(&ashmem_mutex)) | ||
1054 | + goto out; | ||
1055 | if (--sc->nr_to_scan <= 0) | ||
1056 | break; | ||
1057 | } | ||
1058 | mutex_unlock(&ashmem_mutex); | ||
1059 | +out: | ||
1060 | return freed; | ||
1061 | } | ||
1062 | |||
1063 | @@ -582,7 +590,8 @@ static int get_name(struct ashmem_area *asma, void __user *name) | ||
1064 | * | ||
1065 | * Caller must hold ashmem_mutex. | ||
1066 | */ | ||
1067 | -static int ashmem_pin(struct ashmem_area *asma, size_t pgstart, size_t pgend) | ||
1068 | +static int ashmem_pin(struct ashmem_area *asma, size_t pgstart, size_t pgend, | ||
1069 | + struct ashmem_range **new_range) | ||
1070 | { | ||
1071 | struct ashmem_range *range, *next; | ||
1072 | int ret = ASHMEM_NOT_PURGED; | ||
1073 | @@ -635,7 +644,7 @@ static int ashmem_pin(struct ashmem_area *asma, size_t pgstart, size_t pgend) | ||
1074 | * second half and adjust the first chunk's endpoint. | ||
1075 | */ | ||
1076 | range_alloc(asma, range, range->purged, | ||
1077 | - pgend + 1, range->pgend); | ||
1078 | + pgend + 1, range->pgend, new_range); | ||
1079 | range_shrink(range, range->pgstart, pgstart - 1); | ||
1080 | break; | ||
1081 | } | ||
1082 | @@ -649,7 +658,8 @@ static int ashmem_pin(struct ashmem_area *asma, size_t pgstart, size_t pgend) | ||
1083 | * | ||
1084 | * Caller must hold ashmem_mutex. | ||
1085 | */ | ||
1086 | -static int ashmem_unpin(struct ashmem_area *asma, size_t pgstart, size_t pgend) | ||
1087 | +static int ashmem_unpin(struct ashmem_area *asma, size_t pgstart, size_t pgend, | ||
1088 | + struct ashmem_range **new_range) | ||
1089 | { | ||
1090 | struct ashmem_range *range, *next; | ||
1091 | unsigned int purged = ASHMEM_NOT_PURGED; | ||
1092 | @@ -675,7 +685,8 @@ restart: | ||
1093 | } | ||
1094 | } | ||
1095 | |||
1096 | - return range_alloc(asma, range, purged, pgstart, pgend); | ||
1097 | + range_alloc(asma, range, purged, pgstart, pgend, new_range); | ||
1098 | + return 0; | ||
1099 | } | ||
1100 | |||
1101 | /* | ||
1102 | @@ -708,11 +719,19 @@ static int ashmem_pin_unpin(struct ashmem_area *asma, unsigned long cmd, | ||
1103 | struct ashmem_pin pin; | ||
1104 | size_t pgstart, pgend; | ||
1105 | int ret = -EINVAL; | ||
1106 | + struct ashmem_range *range = NULL; | ||
1107 | |||
1108 | if (copy_from_user(&pin, p, sizeof(pin))) | ||
1109 | return -EFAULT; | ||
1110 | |||
1111 | + if (cmd == ASHMEM_PIN || cmd == ASHMEM_UNPIN) { | ||
1112 | + range = kmem_cache_zalloc(ashmem_range_cachep, GFP_KERNEL); | ||
1113 | + if (!range) | ||
1114 | + return -ENOMEM; | ||
1115 | + } | ||
1116 | + | ||
1117 | mutex_lock(&ashmem_mutex); | ||
1118 | + wait_event(ashmem_shrink_wait, !atomic_read(&ashmem_shrink_inflight)); | ||
1119 | |||
1120 | if (!asma->file) | ||
1121 | goto out_unlock; | ||
1122 | @@ -735,10 +754,10 @@ static int ashmem_pin_unpin(struct ashmem_area *asma, unsigned long cmd, | ||
1123 | |||
1124 | switch (cmd) { | ||
1125 | case ASHMEM_PIN: | ||
1126 | - ret = ashmem_pin(asma, pgstart, pgend); | ||
1127 | + ret = ashmem_pin(asma, pgstart, pgend, &range); | ||
1128 | break; | ||
1129 | case ASHMEM_UNPIN: | ||
1130 | - ret = ashmem_unpin(asma, pgstart, pgend); | ||
1131 | + ret = ashmem_unpin(asma, pgstart, pgend, &range); | ||
1132 | break; | ||
1133 | case ASHMEM_GET_PIN_STATUS: | ||
1134 | ret = ashmem_get_pin_status(asma, pgstart, pgend); | ||
1135 | @@ -747,6 +766,8 @@ static int ashmem_pin_unpin(struct ashmem_area *asma, unsigned long cmd, | ||
1136 | |||
1137 | out_unlock: | ||
1138 | mutex_unlock(&ashmem_mutex); | ||
1139 | + if (range) | ||
1140 | + kmem_cache_free(ashmem_range_cachep, range); | ||
1141 | |||
1142 | return ret; | ||
1143 | } | ||
1144 | diff --git a/drivers/staging/android/ion/ion_system_heap.c b/drivers/staging/android/ion/ion_system_heap.c | ||
1145 | index 0383f7548d48e..20f2103a4ebfb 100644 | ||
1146 | --- a/drivers/staging/android/ion/ion_system_heap.c | ||
1147 | +++ b/drivers/staging/android/ion/ion_system_heap.c | ||
1148 | @@ -223,10 +223,10 @@ static void ion_system_heap_destroy_pools(struct ion_page_pool **pools) | ||
1149 | static int ion_system_heap_create_pools(struct ion_page_pool **pools) | ||
1150 | { | ||
1151 | int i; | ||
1152 | - gfp_t gfp_flags = low_order_gfp_flags; | ||
1153 | |||
1154 | for (i = 0; i < NUM_ORDERS; i++) { | ||
1155 | struct ion_page_pool *pool; | ||
1156 | + gfp_t gfp_flags = low_order_gfp_flags; | ||
1157 | |||
1158 | if (orders[i] > 4) | ||
1159 | gfp_flags = high_order_gfp_flags; | ||
1160 | diff --git a/drivers/staging/comedi/drivers/ni_660x.c b/drivers/staging/comedi/drivers/ni_660x.c | ||
1161 | index e70a461e723f8..405573e927cfc 100644 | ||
1162 | --- a/drivers/staging/comedi/drivers/ni_660x.c | ||
1163 | +++ b/drivers/staging/comedi/drivers/ni_660x.c | ||
1164 | @@ -656,6 +656,7 @@ static int ni_660x_set_pfi_routing(struct comedi_device *dev, | ||
1165 | case NI_660X_PFI_OUTPUT_DIO: | ||
1166 | if (chan > 31) | ||
1167 | return -EINVAL; | ||
1168 | + break; | ||
1169 | default: | ||
1170 | return -EINVAL; | ||
1171 | } | ||
1172 | diff --git a/drivers/staging/erofs/inode.c b/drivers/staging/erofs/inode.c | ||
1173 | index d7fbf5f4600f3..f99954dbfdb58 100644 | ||
1174 | --- a/drivers/staging/erofs/inode.c | ||
1175 | +++ b/drivers/staging/erofs/inode.c | ||
1176 | @@ -185,16 +185,16 @@ static int fill_inode(struct inode *inode, int isdir) | ||
1177 | /* setup the new inode */ | ||
1178 | if (S_ISREG(inode->i_mode)) { | ||
1179 | #ifdef CONFIG_EROFS_FS_XATTR | ||
1180 | - if (vi->xattr_isize) | ||
1181 | - inode->i_op = &erofs_generic_xattr_iops; | ||
1182 | + inode->i_op = &erofs_generic_xattr_iops; | ||
1183 | #endif | ||
1184 | inode->i_fop = &generic_ro_fops; | ||
1185 | } else if (S_ISDIR(inode->i_mode)) { | ||
1186 | inode->i_op = | ||
1187 | #ifdef CONFIG_EROFS_FS_XATTR | ||
1188 | - vi->xattr_isize ? &erofs_dir_xattr_iops : | ||
1189 | -#endif | ||
1190 | + &erofs_dir_xattr_iops; | ||
1191 | +#else | ||
1192 | &erofs_dir_iops; | ||
1193 | +#endif | ||
1194 | inode->i_fop = &erofs_dir_fops; | ||
1195 | } else if (S_ISLNK(inode->i_mode)) { | ||
1196 | /* by default, page_get_link is used for symlink */ | ||
1197 | diff --git a/drivers/staging/erofs/internal.h b/drivers/staging/erofs/internal.h | ||
1198 | index e049d00c087a0..16249d7f08953 100644 | ||
1199 | --- a/drivers/staging/erofs/internal.h | ||
1200 | +++ b/drivers/staging/erofs/internal.h | ||
1201 | @@ -354,12 +354,17 @@ static inline erofs_off_t iloc(struct erofs_sb_info *sbi, erofs_nid_t nid) | ||
1202 | return blknr_to_addr(sbi->meta_blkaddr) + (nid << sbi->islotbits); | ||
1203 | } | ||
1204 | |||
1205 | -#define inode_set_inited_xattr(inode) (EROFS_V(inode)->flags |= 1) | ||
1206 | -#define inode_has_inited_xattr(inode) (EROFS_V(inode)->flags & 1) | ||
1207 | +/* atomic flag definitions */ | ||
1208 | +#define EROFS_V_EA_INITED_BIT 0 | ||
1209 | + | ||
1210 | +/* bitlock definitions (arranged in reverse order) */ | ||
1211 | +#define EROFS_V_BL_XATTR_BIT (BITS_PER_LONG - 1) | ||
1212 | |||
1213 | struct erofs_vnode { | ||
1214 | erofs_nid_t nid; | ||
1215 | - unsigned int flags; | ||
1216 | + | ||
1217 | + /* atomic flags (including bitlocks) */ | ||
1218 | + unsigned long flags; | ||
1219 | |||
1220 | unsigned char data_mapping_mode; | ||
1221 | /* inline size in bytes */ | ||
1222 | diff --git a/drivers/staging/erofs/unzip_vle.c b/drivers/staging/erofs/unzip_vle.c | ||
1223 | index 4ac1099a39c6c..ca2e8fd789591 100644 | ||
1224 | --- a/drivers/staging/erofs/unzip_vle.c | ||
1225 | +++ b/drivers/staging/erofs/unzip_vle.c | ||
1226 | @@ -107,15 +107,30 @@ enum z_erofs_vle_work_role { | ||
1227 | Z_EROFS_VLE_WORK_SECONDARY, | ||
1228 | Z_EROFS_VLE_WORK_PRIMARY, | ||
1229 | /* | ||
1230 | - * The current work has at least been linked with the following | ||
1231 | - * processed chained works, which means if the processing page | ||
1232 | - * is the tail partial page of the work, the current work can | ||
1233 | - * safely use the whole page, as illustrated below: | ||
1234 | - * +--------------+-------------------------------------------+ | ||
1235 | - * | tail page | head page (of the previous work) | | ||
1236 | - * +--------------+-------------------------------------------+ | ||
1237 | - * /\ which belongs to the current work | ||
1238 | - * [ (*) this page can be used for the current work itself. ] | ||
1239 | + * The current work was the tail of an exist chain, and the previous | ||
1240 | + * processed chained works are all decided to be hooked up to it. | ||
1241 | + * A new chain should be created for the remaining unprocessed works, | ||
1242 | + * therefore different from Z_EROFS_VLE_WORK_PRIMARY_FOLLOWED, | ||
1243 | + * the next work cannot reuse the whole page in the following scenario: | ||
1244 | + * ________________________________________________________________ | ||
1245 | + * | tail (partial) page | head (partial) page | | ||
1246 | + * | (belongs to the next work) | (belongs to the current work) | | ||
1247 | + * |_______PRIMARY_FOLLOWED_______|________PRIMARY_HOOKED___________| | ||
1248 | + */ | ||
1249 | + Z_EROFS_VLE_WORK_PRIMARY_HOOKED, | ||
1250 | + /* | ||
1251 | + * The current work has been linked with the processed chained works, | ||
1252 | + * and could be also linked with the potential remaining works, which | ||
1253 | + * means if the processing page is the tail partial page of the work, | ||
1254 | + * the current work can safely use the whole page (since the next work | ||
1255 | + * is under control) for in-place decompression, as illustrated below: | ||
1256 | + * ________________________________________________________________ | ||
1257 | + * | tail (partial) page | head (partial) page | | ||
1258 | + * | (of the current work) | (of the previous work) | | ||
1259 | + * | PRIMARY_FOLLOWED or | | | ||
1260 | + * |_____PRIMARY_HOOKED____|____________PRIMARY_FOLLOWED____________| | ||
1261 | + * | ||
1262 | + * [ (*) the above page can be used for the current work itself. ] | ||
1263 | */ | ||
1264 | Z_EROFS_VLE_WORK_PRIMARY_FOLLOWED, | ||
1265 | Z_EROFS_VLE_WORK_MAX | ||
1266 | @@ -315,10 +330,10 @@ static int z_erofs_vle_work_add_page( | ||
1267 | return ret ? 0 : -EAGAIN; | ||
1268 | } | ||
1269 | |||
1270 | -static inline bool try_to_claim_workgroup( | ||
1271 | - struct z_erofs_vle_workgroup *grp, | ||
1272 | - z_erofs_vle_owned_workgrp_t *owned_head, | ||
1273 | - bool *hosted) | ||
1274 | +static enum z_erofs_vle_work_role | ||
1275 | +try_to_claim_workgroup(struct z_erofs_vle_workgroup *grp, | ||
1276 | + z_erofs_vle_owned_workgrp_t *owned_head, | ||
1277 | + bool *hosted) | ||
1278 | { | ||
1279 | DBG_BUGON(*hosted == true); | ||
1280 | |||
1281 | @@ -332,6 +347,9 @@ retry: | ||
1282 | |||
1283 | *owned_head = &grp->next; | ||
1284 | *hosted = true; | ||
1285 | + /* lucky, I am the followee :) */ | ||
1286 | + return Z_EROFS_VLE_WORK_PRIMARY_FOLLOWED; | ||
1287 | + | ||
1288 | } else if (grp->next == Z_EROFS_VLE_WORKGRP_TAIL) { | ||
1289 | /* | ||
1290 | * type 2, link to the end of a existing open chain, | ||
1291 | @@ -341,12 +359,11 @@ retry: | ||
1292 | if (cmpxchg(&grp->next, Z_EROFS_VLE_WORKGRP_TAIL, | ||
1293 | *owned_head) != Z_EROFS_VLE_WORKGRP_TAIL) | ||
1294 | goto retry; | ||
1295 | - | ||
1296 | *owned_head = Z_EROFS_VLE_WORKGRP_TAIL; | ||
1297 | - } else | ||
1298 | - return false; /* :( better luck next time */ | ||
1299 | + return Z_EROFS_VLE_WORK_PRIMARY_HOOKED; | ||
1300 | + } | ||
1301 | |||
1302 | - return true; /* lucky, I am the followee :) */ | ||
1303 | + return Z_EROFS_VLE_WORK_PRIMARY; /* :( better luck next time */ | ||
1304 | } | ||
1305 | |||
1306 | struct z_erofs_vle_work_finder { | ||
1307 | @@ -424,12 +441,9 @@ z_erofs_vle_work_lookup(const struct z_erofs_vle_work_finder *f) | ||
1308 | *f->hosted = false; | ||
1309 | if (!primary) | ||
1310 | *f->role = Z_EROFS_VLE_WORK_SECONDARY; | ||
1311 | - /* claim the workgroup if possible */ | ||
1312 | - else if (try_to_claim_workgroup(grp, f->owned_head, f->hosted)) | ||
1313 | - *f->role = Z_EROFS_VLE_WORK_PRIMARY_FOLLOWED; | ||
1314 | - else | ||
1315 | - *f->role = Z_EROFS_VLE_WORK_PRIMARY; | ||
1316 | - | ||
1317 | + else /* claim the workgroup if possible */ | ||
1318 | + *f->role = try_to_claim_workgroup(grp, f->owned_head, | ||
1319 | + f->hosted); | ||
1320 | return work; | ||
1321 | } | ||
1322 | |||
1323 | @@ -493,6 +507,9 @@ z_erofs_vle_work_register(const struct z_erofs_vle_work_finder *f, | ||
1324 | return work; | ||
1325 | } | ||
1326 | |||
1327 | +#define builder_is_hooked(builder) \ | ||
1328 | + ((builder)->role >= Z_EROFS_VLE_WORK_PRIMARY_HOOKED) | ||
1329 | + | ||
1330 | #define builder_is_followed(builder) \ | ||
1331 | ((builder)->role >= Z_EROFS_VLE_WORK_PRIMARY_FOLLOWED) | ||
1332 | |||
1333 | @@ -686,7 +703,7 @@ static int z_erofs_do_read_page(struct z_erofs_vle_frontend *fe, | ||
1334 | struct z_erofs_vle_work_builder *const builder = &fe->builder; | ||
1335 | const loff_t offset = page_offset(page); | ||
1336 | |||
1337 | - bool tight = builder_is_followed(builder); | ||
1338 | + bool tight = builder_is_hooked(builder); | ||
1339 | struct z_erofs_vle_work *work = builder->work; | ||
1340 | |||
1341 | enum z_erofs_cache_alloctype cache_strategy; | ||
1342 | @@ -704,8 +721,12 @@ repeat: | ||
1343 | |||
1344 | /* lucky, within the range of the current map_blocks */ | ||
1345 | if (offset + cur >= map->m_la && | ||
1346 | - offset + cur < map->m_la + map->m_llen) | ||
1347 | + offset + cur < map->m_la + map->m_llen) { | ||
1348 | + /* didn't get a valid unzip work previously (very rare) */ | ||
1349 | + if (!builder->work) | ||
1350 | + goto restart_now; | ||
1351 | goto hitted; | ||
1352 | + } | ||
1353 | |||
1354 | /* go ahead the next map_blocks */ | ||
1355 | debugln("%s: [out-of-range] pos %llu", __func__, offset + cur); | ||
1356 | @@ -719,6 +740,7 @@ repeat: | ||
1357 | if (unlikely(err)) | ||
1358 | goto err_out; | ||
1359 | |||
1360 | +restart_now: | ||
1361 | if (unlikely(!(map->m_flags & EROFS_MAP_MAPPED))) | ||
1362 | goto hitted; | ||
1363 | |||
1364 | @@ -740,7 +762,7 @@ repeat: | ||
1365 | map->m_plen / PAGE_SIZE, | ||
1366 | cache_strategy, page_pool, GFP_KERNEL); | ||
1367 | |||
1368 | - tight &= builder_is_followed(builder); | ||
1369 | + tight &= builder_is_hooked(builder); | ||
1370 | work = builder->work; | ||
1371 | hitted: | ||
1372 | cur = end - min_t(unsigned int, offset + end - map->m_la, end); | ||
1373 | @@ -755,6 +777,9 @@ hitted: | ||
1374 | (tight ? Z_EROFS_PAGE_TYPE_EXCLUSIVE : | ||
1375 | Z_EROFS_VLE_PAGE_TYPE_TAIL_SHARED)); | ||
1376 | |||
1377 | + if (cur) | ||
1378 | + tight &= builder_is_followed(builder); | ||
1379 | + | ||
1380 | retry: | ||
1381 | err = z_erofs_vle_work_add_page(builder, page, page_type); | ||
1382 | /* should allocate an additional staging page for pagevec */ | ||
1383 | diff --git a/drivers/staging/erofs/xattr.c b/drivers/staging/erofs/xattr.c | ||
1384 | index 80dca6a4adbe2..6cb05ae312338 100644 | ||
1385 | --- a/drivers/staging/erofs/xattr.c | ||
1386 | +++ b/drivers/staging/erofs/xattr.c | ||
1387 | @@ -44,19 +44,48 @@ static inline void xattr_iter_end_final(struct xattr_iter *it) | ||
1388 | |||
1389 | static int init_inode_xattrs(struct inode *inode) | ||
1390 | { | ||
1391 | + struct erofs_vnode *const vi = EROFS_V(inode); | ||
1392 | struct xattr_iter it; | ||
1393 | unsigned int i; | ||
1394 | struct erofs_xattr_ibody_header *ih; | ||
1395 | struct super_block *sb; | ||
1396 | struct erofs_sb_info *sbi; | ||
1397 | - struct erofs_vnode *vi; | ||
1398 | bool atomic_map; | ||
1399 | + int ret = 0; | ||
1400 | |||
1401 | - if (likely(inode_has_inited_xattr(inode))) | ||
1402 | + /* the most case is that xattrs of this inode are initialized. */ | ||
1403 | + if (test_bit(EROFS_V_EA_INITED_BIT, &vi->flags)) | ||
1404 | return 0; | ||
1405 | |||
1406 | - vi = EROFS_V(inode); | ||
1407 | - BUG_ON(!vi->xattr_isize); | ||
1408 | + if (wait_on_bit_lock(&vi->flags, EROFS_V_BL_XATTR_BIT, TASK_KILLABLE)) | ||
1409 | + return -ERESTARTSYS; | ||
1410 | + | ||
1411 | + /* someone has initialized xattrs for us? */ | ||
1412 | + if (test_bit(EROFS_V_EA_INITED_BIT, &vi->flags)) | ||
1413 | + goto out_unlock; | ||
1414 | + | ||
1415 | + /* | ||
1416 | + * bypass all xattr operations if ->xattr_isize is not greater than | ||
1417 | + * sizeof(struct erofs_xattr_ibody_header), in detail: | ||
1418 | + * 1) it is not enough to contain erofs_xattr_ibody_header then | ||
1419 | + * ->xattr_isize should be 0 (it means no xattr); | ||
1420 | + * 2) it is just to contain erofs_xattr_ibody_header, which is on-disk | ||
1421 | + * undefined right now (maybe use later with some new sb feature). | ||
1422 | + */ | ||
1423 | + if (vi->xattr_isize == sizeof(struct erofs_xattr_ibody_header)) { | ||
1424 | + errln("xattr_isize %d of nid %llu is not supported yet", | ||
1425 | + vi->xattr_isize, vi->nid); | ||
1426 | + ret = -ENOTSUPP; | ||
1427 | + goto out_unlock; | ||
1428 | + } else if (vi->xattr_isize < sizeof(struct erofs_xattr_ibody_header)) { | ||
1429 | + if (unlikely(vi->xattr_isize)) { | ||
1430 | + DBG_BUGON(1); | ||
1431 | + ret = -EIO; | ||
1432 | + goto out_unlock; /* xattr ondisk layout error */ | ||
1433 | + } | ||
1434 | + ret = -ENOATTR; | ||
1435 | + goto out_unlock; | ||
1436 | + } | ||
1437 | |||
1438 | sb = inode->i_sb; | ||
1439 | sbi = EROFS_SB(sb); | ||
1440 | @@ -64,8 +93,10 @@ static int init_inode_xattrs(struct inode *inode) | ||
1441 | it.ofs = erofs_blkoff(iloc(sbi, vi->nid) + vi->inode_isize); | ||
1442 | |||
1443 | it.page = erofs_get_inline_page(inode, it.blkaddr); | ||
1444 | - if (IS_ERR(it.page)) | ||
1445 | - return PTR_ERR(it.page); | ||
1446 | + if (IS_ERR(it.page)) { | ||
1447 | + ret = PTR_ERR(it.page); | ||
1448 | + goto out_unlock; | ||
1449 | + } | ||
1450 | |||
1451 | /* read in shared xattr array (non-atomic, see kmalloc below) */ | ||
1452 | it.kaddr = kmap(it.page); | ||
1453 | @@ -78,7 +109,8 @@ static int init_inode_xattrs(struct inode *inode) | ||
1454 | sizeof(uint), GFP_KERNEL); | ||
1455 | if (vi->xattr_shared_xattrs == NULL) { | ||
1456 | xattr_iter_end(&it, atomic_map); | ||
1457 | - return -ENOMEM; | ||
1458 | + ret = -ENOMEM; | ||
1459 | + goto out_unlock; | ||
1460 | } | ||
1461 | |||
1462 | /* let's skip ibody header */ | ||
1463 | @@ -92,8 +124,12 @@ static int init_inode_xattrs(struct inode *inode) | ||
1464 | |||
1465 | it.page = erofs_get_meta_page(sb, | ||
1466 | ++it.blkaddr, S_ISDIR(inode->i_mode)); | ||
1467 | - if (IS_ERR(it.page)) | ||
1468 | - return PTR_ERR(it.page); | ||
1469 | + if (IS_ERR(it.page)) { | ||
1470 | + kfree(vi->xattr_shared_xattrs); | ||
1471 | + vi->xattr_shared_xattrs = NULL; | ||
1472 | + ret = PTR_ERR(it.page); | ||
1473 | + goto out_unlock; | ||
1474 | + } | ||
1475 | |||
1476 | it.kaddr = kmap_atomic(it.page); | ||
1477 | atomic_map = true; | ||
1478 | @@ -105,8 +141,11 @@ static int init_inode_xattrs(struct inode *inode) | ||
1479 | } | ||
1480 | xattr_iter_end(&it, atomic_map); | ||
1481 | |||
1482 | - inode_set_inited_xattr(inode); | ||
1483 | - return 0; | ||
1484 | + set_bit(EROFS_V_EA_INITED_BIT, &vi->flags); | ||
1485 | + | ||
1486 | +out_unlock: | ||
1487 | + clear_and_wake_up_bit(EROFS_V_BL_XATTR_BIT, &vi->flags); | ||
1488 | + return ret; | ||
1489 | } | ||
1490 | |||
1491 | /* | ||
1492 | @@ -422,7 +461,6 @@ static int erofs_xattr_generic_get(const struct xattr_handler *handler, | ||
1493 | struct dentry *unused, struct inode *inode, | ||
1494 | const char *name, void *buffer, size_t size) | ||
1495 | { | ||
1496 | - struct erofs_vnode *const vi = EROFS_V(inode); | ||
1497 | struct erofs_sb_info *const sbi = EROFS_I_SB(inode); | ||
1498 | |||
1499 | switch (handler->flags) { | ||
1500 | @@ -440,9 +478,6 @@ static int erofs_xattr_generic_get(const struct xattr_handler *handler, | ||
1501 | return -EINVAL; | ||
1502 | } | ||
1503 | |||
1504 | - if (!vi->xattr_isize) | ||
1505 | - return -ENOATTR; | ||
1506 | - | ||
1507 | return erofs_getxattr(inode, handler->flags, name, buffer, size); | ||
1508 | } | ||
1509 | |||
1510 | diff --git a/drivers/staging/wilc1000/linux_wlan.c b/drivers/staging/wilc1000/linux_wlan.c | ||
1511 | index 721689048648e..5e5149c9a92d9 100644 | ||
1512 | --- a/drivers/staging/wilc1000/linux_wlan.c | ||
1513 | +++ b/drivers/staging/wilc1000/linux_wlan.c | ||
1514 | @@ -1086,8 +1086,8 @@ int wilc_netdev_init(struct wilc **wilc, struct device *dev, int io_type, | ||
1515 | vif->wilc = *wilc; | ||
1516 | vif->ndev = ndev; | ||
1517 | wl->vif[i] = vif; | ||
1518 | - wl->vif_num = i; | ||
1519 | - vif->idx = wl->vif_num; | ||
1520 | + wl->vif_num = i + 1; | ||
1521 | + vif->idx = i; | ||
1522 | |||
1523 | ndev->netdev_ops = &wilc_netdev_ops; | ||
1524 | |||
1525 | diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c | ||
1526 | index a9ec7051f2864..c2fe218e051f0 100644 | ||
1527 | --- a/drivers/usb/host/xhci-pci.c | ||
1528 | +++ b/drivers/usb/host/xhci-pci.c | ||
1529 | @@ -194,6 +194,7 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci) | ||
1530 | xhci->quirks |= XHCI_SSIC_PORT_UNUSED; | ||
1531 | if (pdev->vendor == PCI_VENDOR_ID_INTEL && | ||
1532 | (pdev->device == PCI_DEVICE_ID_INTEL_CHERRYVIEW_XHCI || | ||
1533 | + pdev->device == PCI_DEVICE_ID_INTEL_SUNRISEPOINT_LP_XHCI || | ||
1534 | pdev->device == PCI_DEVICE_ID_INTEL_APL_XHCI)) | ||
1535 | xhci->quirks |= XHCI_INTEL_USB_ROLE_SW; | ||
1536 | if (pdev->vendor == PCI_VENDOR_ID_INTEL && | ||
1537 | diff --git a/drivers/usb/host/xhci-tegra.c b/drivers/usb/host/xhci-tegra.c | ||
1538 | index 938ff06c03495..efb0cad8710e3 100644 | ||
1539 | --- a/drivers/usb/host/xhci-tegra.c | ||
1540 | +++ b/drivers/usb/host/xhci-tegra.c | ||
1541 | @@ -941,9 +941,9 @@ static void tegra_xusb_powerdomain_remove(struct device *dev, | ||
1542 | device_link_del(tegra->genpd_dl_ss); | ||
1543 | if (tegra->genpd_dl_host) | ||
1544 | device_link_del(tegra->genpd_dl_host); | ||
1545 | - if (tegra->genpd_dev_ss) | ||
1546 | + if (!IS_ERR_OR_NULL(tegra->genpd_dev_ss)) | ||
1547 | dev_pm_domain_detach(tegra->genpd_dev_ss, true); | ||
1548 | - if (tegra->genpd_dev_host) | ||
1549 | + if (!IS_ERR_OR_NULL(tegra->genpd_dev_host)) | ||
1550 | dev_pm_domain_detach(tegra->genpd_dev_host, true); | ||
1551 | } | ||
1552 | |||
1553 | diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c | ||
1554 | index c0777a374a88f..4c66edf533fe9 100644 | ||
1555 | --- a/drivers/usb/serial/cp210x.c | ||
1556 | +++ b/drivers/usb/serial/cp210x.c | ||
1557 | @@ -61,6 +61,7 @@ static const struct usb_device_id id_table[] = { | ||
1558 | { USB_DEVICE(0x08e6, 0x5501) }, /* Gemalto Prox-PU/CU contactless smartcard reader */ | ||
1559 | { USB_DEVICE(0x08FD, 0x000A) }, /* Digianswer A/S , ZigBee/802.15.4 MAC Device */ | ||
1560 | { USB_DEVICE(0x0908, 0x01FF) }, /* Siemens RUGGEDCOM USB Serial Console */ | ||
1561 | + { USB_DEVICE(0x0B00, 0x3070) }, /* Ingenico 3070 */ | ||
1562 | { USB_DEVICE(0x0BED, 0x1100) }, /* MEI (TM) Cashflow-SC Bill/Voucher Acceptor */ | ||
1563 | { USB_DEVICE(0x0BED, 0x1101) }, /* MEI series 2000 Combo Acceptor */ | ||
1564 | { USB_DEVICE(0x0FCF, 0x1003) }, /* Dynastream ANT development board */ | ||
1565 | @@ -1353,8 +1354,13 @@ static int cp210x_gpio_get(struct gpio_chip *gc, unsigned int gpio) | ||
1566 | if (priv->partnum == CP210X_PARTNUM_CP2105) | ||
1567 | req_type = REQTYPE_INTERFACE_TO_HOST; | ||
1568 | |||
1569 | + result = usb_autopm_get_interface(serial->interface); | ||
1570 | + if (result) | ||
1571 | + return result; | ||
1572 | + | ||
1573 | result = cp210x_read_vendor_block(serial, req_type, | ||
1574 | CP210X_READ_LATCH, &buf, sizeof(buf)); | ||
1575 | + usb_autopm_put_interface(serial->interface); | ||
1576 | if (result < 0) | ||
1577 | return result; | ||
1578 | |||
1579 | @@ -1375,6 +1381,10 @@ static void cp210x_gpio_set(struct gpio_chip *gc, unsigned int gpio, int value) | ||
1580 | |||
1581 | buf.mask = BIT(gpio); | ||
1582 | |||
1583 | + result = usb_autopm_get_interface(serial->interface); | ||
1584 | + if (result) | ||
1585 | + goto out; | ||
1586 | + | ||
1587 | if (priv->partnum == CP210X_PARTNUM_CP2105) { | ||
1588 | result = cp210x_write_vendor_block(serial, | ||
1589 | REQTYPE_HOST_TO_INTERFACE, | ||
1590 | @@ -1392,6 +1402,8 @@ static void cp210x_gpio_set(struct gpio_chip *gc, unsigned int gpio, int value) | ||
1591 | NULL, 0, USB_CTRL_SET_TIMEOUT); | ||
1592 | } | ||
1593 | |||
1594 | + usb_autopm_put_interface(serial->interface); | ||
1595 | +out: | ||
1596 | if (result < 0) { | ||
1597 | dev_err(&serial->interface->dev, "failed to set GPIO value: %d\n", | ||
1598 | result); | ||
1599 | diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c | ||
1600 | index 77ef4c481f3ce..8f5b174717594 100644 | ||
1601 | --- a/drivers/usb/serial/ftdi_sio.c | ||
1602 | +++ b/drivers/usb/serial/ftdi_sio.c | ||
1603 | @@ -1025,6 +1025,8 @@ static const struct usb_device_id id_table_combined[] = { | ||
1604 | { USB_DEVICE(CYPRESS_VID, CYPRESS_WICED_BT_USB_PID) }, | ||
1605 | { USB_DEVICE(CYPRESS_VID, CYPRESS_WICED_WL_USB_PID) }, | ||
1606 | { USB_DEVICE(AIRBUS_DS_VID, AIRBUS_DS_P8GR) }, | ||
1607 | + /* EZPrototypes devices */ | ||
1608 | + { USB_DEVICE(EZPROTOTYPES_VID, HJELMSLUND_USB485_ISO_PID) }, | ||
1609 | { } /* Terminating entry */ | ||
1610 | }; | ||
1611 | |||
1612 | diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h | ||
1613 | index 975d02666c5a0..b863bedb55a13 100644 | ||
1614 | --- a/drivers/usb/serial/ftdi_sio_ids.h | ||
1615 | +++ b/drivers/usb/serial/ftdi_sio_ids.h | ||
1616 | @@ -1308,6 +1308,12 @@ | ||
1617 | #define IONICS_VID 0x1c0c | ||
1618 | #define IONICS_PLUGCOMPUTER_PID 0x0102 | ||
1619 | |||
1620 | +/* | ||
1621 | + * EZPrototypes (PID reseller) | ||
1622 | + */ | ||
1623 | +#define EZPROTOTYPES_VID 0x1c40 | ||
1624 | +#define HJELMSLUND_USB485_ISO_PID 0x0477 | ||
1625 | + | ||
1626 | /* | ||
1627 | * Dresden Elektronik Sensor Terminal Board | ||
1628 | */ | ||
1629 | diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c | ||
1630 | index aef15497ff31f..11b21d9410f35 100644 | ||
1631 | --- a/drivers/usb/serial/option.c | ||
1632 | +++ b/drivers/usb/serial/option.c | ||
1633 | @@ -1148,6 +1148,8 @@ static const struct usb_device_id option_ids[] = { | ||
1634 | .driver_info = NCTRL(0) | RSVD(1) | RSVD(3) }, | ||
1635 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_ME910_DUAL_MODEM), | ||
1636 | .driver_info = NCTRL(0) | RSVD(3) }, | ||
1637 | + { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1102, 0xff), /* Telit ME910 (ECM) */ | ||
1638 | + .driver_info = NCTRL(0) }, | ||
1639 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE910), | ||
1640 | .driver_info = NCTRL(0) | RSVD(1) | RSVD(2) }, | ||
1641 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE910_USBCFG4), | ||
1642 | diff --git a/fs/aio.c b/fs/aio.c | ||
1643 | index aaaaf4d12c739..528d03680526f 100644 | ||
1644 | --- a/fs/aio.c | ||
1645 | +++ b/fs/aio.c | ||
1646 | @@ -1680,6 +1680,7 @@ static int aio_poll_wake(struct wait_queue_entry *wait, unsigned mode, int sync, | ||
1647 | struct poll_iocb *req = container_of(wait, struct poll_iocb, wait); | ||
1648 | struct aio_kiocb *iocb = container_of(req, struct aio_kiocb, poll); | ||
1649 | __poll_t mask = key_to_poll(key); | ||
1650 | + unsigned long flags; | ||
1651 | |||
1652 | req->woken = true; | ||
1653 | |||
1654 | @@ -1688,10 +1689,15 @@ static int aio_poll_wake(struct wait_queue_entry *wait, unsigned mode, int sync, | ||
1655 | if (!(mask & req->events)) | ||
1656 | return 0; | ||
1657 | |||
1658 | - /* try to complete the iocb inline if we can: */ | ||
1659 | - if (spin_trylock(&iocb->ki_ctx->ctx_lock)) { | ||
1660 | + /* | ||
1661 | + * Try to complete the iocb inline if we can. Use | ||
1662 | + * irqsave/irqrestore because not all filesystems (e.g. fuse) | ||
1663 | + * call this function with IRQs disabled and because IRQs | ||
1664 | + * have to be disabled before ctx_lock is obtained. | ||
1665 | + */ | ||
1666 | + if (spin_trylock_irqsave(&iocb->ki_ctx->ctx_lock, flags)) { | ||
1667 | list_del(&iocb->ki_list); | ||
1668 | - spin_unlock(&iocb->ki_ctx->ctx_lock); | ||
1669 | + spin_unlock_irqrestore(&iocb->ki_ctx->ctx_lock, flags); | ||
1670 | |||
1671 | list_del_init(&req->wait.entry); | ||
1672 | aio_poll_complete(iocb, mask); | ||
1673 | diff --git a/fs/exec.c b/fs/exec.c | ||
1674 | index fb72d36f7823e..bcf383730bea9 100644 | ||
1675 | --- a/fs/exec.c | ||
1676 | +++ b/fs/exec.c | ||
1677 | @@ -932,7 +932,7 @@ int kernel_read_file(struct file *file, void **buf, loff_t *size, | ||
1678 | bytes = kernel_read(file, *buf + pos, i_size - pos, &pos); | ||
1679 | if (bytes < 0) { | ||
1680 | ret = bytes; | ||
1681 | - goto out; | ||
1682 | + goto out_free; | ||
1683 | } | ||
1684 | |||
1685 | if (bytes == 0) | ||
1686 | diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h | ||
1687 | index c86d6d8bdfed2..0b427d5df0fea 100644 | ||
1688 | --- a/include/linux/cpufreq.h | ||
1689 | +++ b/include/linux/cpufreq.h | ||
1690 | @@ -254,20 +254,12 @@ __ATTR(_name, 0644, show_##_name, store_##_name) | ||
1691 | static struct freq_attr _name = \ | ||
1692 | __ATTR(_name, 0200, NULL, store_##_name) | ||
1693 | |||
1694 | -struct global_attr { | ||
1695 | - struct attribute attr; | ||
1696 | - ssize_t (*show)(struct kobject *kobj, | ||
1697 | - struct attribute *attr, char *buf); | ||
1698 | - ssize_t (*store)(struct kobject *a, struct attribute *b, | ||
1699 | - const char *c, size_t count); | ||
1700 | -}; | ||
1701 | - | ||
1702 | #define define_one_global_ro(_name) \ | ||
1703 | -static struct global_attr _name = \ | ||
1704 | +static struct kobj_attribute _name = \ | ||
1705 | __ATTR(_name, 0444, show_##_name, NULL) | ||
1706 | |||
1707 | #define define_one_global_rw(_name) \ | ||
1708 | -static struct global_attr _name = \ | ||
1709 | +static struct kobj_attribute _name = \ | ||
1710 | __ATTR(_name, 0644, show_##_name, store_##_name) | ||
1711 | |||
1712 | |||
1713 | diff --git a/include/net/bluetooth/bluetooth.h b/include/net/bluetooth/bluetooth.h | ||
1714 | index ec9d6bc658559..fabee6db0abb7 100644 | ||
1715 | --- a/include/net/bluetooth/bluetooth.h | ||
1716 | +++ b/include/net/bluetooth/bluetooth.h | ||
1717 | @@ -276,7 +276,7 @@ int bt_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg); | ||
1718 | int bt_sock_wait_state(struct sock *sk, int state, unsigned long timeo); | ||
1719 | int bt_sock_wait_ready(struct sock *sk, unsigned long flags); | ||
1720 | |||
1721 | -void bt_accept_enqueue(struct sock *parent, struct sock *sk); | ||
1722 | +void bt_accept_enqueue(struct sock *parent, struct sock *sk, bool bh); | ||
1723 | void bt_accept_unlink(struct sock *sk); | ||
1724 | struct sock *bt_accept_dequeue(struct sock *parent, struct socket *newsock); | ||
1725 | |||
1726 | diff --git a/include/net/sch_generic.h b/include/net/sch_generic.h | ||
1727 | index 9481f2c142e26..e7eb4aa6ccc94 100644 | ||
1728 | --- a/include/net/sch_generic.h | ||
1729 | +++ b/include/net/sch_generic.h | ||
1730 | @@ -51,7 +51,10 @@ struct qdisc_size_table { | ||
1731 | struct qdisc_skb_head { | ||
1732 | struct sk_buff *head; | ||
1733 | struct sk_buff *tail; | ||
1734 | - __u32 qlen; | ||
1735 | + union { | ||
1736 | + u32 qlen; | ||
1737 | + atomic_t atomic_qlen; | ||
1738 | + }; | ||
1739 | spinlock_t lock; | ||
1740 | }; | ||
1741 | |||
1742 | @@ -408,27 +411,19 @@ static inline void qdisc_cb_private_validate(const struct sk_buff *skb, int sz) | ||
1743 | BUILD_BUG_ON(sizeof(qcb->data) < sz); | ||
1744 | } | ||
1745 | |||
1746 | -static inline int qdisc_qlen_cpu(const struct Qdisc *q) | ||
1747 | -{ | ||
1748 | - return this_cpu_ptr(q->cpu_qstats)->qlen; | ||
1749 | -} | ||
1750 | - | ||
1751 | static inline int qdisc_qlen(const struct Qdisc *q) | ||
1752 | { | ||
1753 | return q->q.qlen; | ||
1754 | } | ||
1755 | |||
1756 | -static inline int qdisc_qlen_sum(const struct Qdisc *q) | ||
1757 | +static inline u32 qdisc_qlen_sum(const struct Qdisc *q) | ||
1758 | { | ||
1759 | - __u32 qlen = q->qstats.qlen; | ||
1760 | - int i; | ||
1761 | + u32 qlen = q->qstats.qlen; | ||
1762 | |||
1763 | - if (q->flags & TCQ_F_NOLOCK) { | ||
1764 | - for_each_possible_cpu(i) | ||
1765 | - qlen += per_cpu_ptr(q->cpu_qstats, i)->qlen; | ||
1766 | - } else { | ||
1767 | + if (q->flags & TCQ_F_NOLOCK) | ||
1768 | + qlen += atomic_read(&q->q.atomic_qlen); | ||
1769 | + else | ||
1770 | qlen += q->q.qlen; | ||
1771 | - } | ||
1772 | |||
1773 | return qlen; | ||
1774 | } | ||
1775 | @@ -825,14 +820,14 @@ static inline void qdisc_qstats_cpu_backlog_inc(struct Qdisc *sch, | ||
1776 | this_cpu_add(sch->cpu_qstats->backlog, qdisc_pkt_len(skb)); | ||
1777 | } | ||
1778 | |||
1779 | -static inline void qdisc_qstats_cpu_qlen_inc(struct Qdisc *sch) | ||
1780 | +static inline void qdisc_qstats_atomic_qlen_inc(struct Qdisc *sch) | ||
1781 | { | ||
1782 | - this_cpu_inc(sch->cpu_qstats->qlen); | ||
1783 | + atomic_inc(&sch->q.atomic_qlen); | ||
1784 | } | ||
1785 | |||
1786 | -static inline void qdisc_qstats_cpu_qlen_dec(struct Qdisc *sch) | ||
1787 | +static inline void qdisc_qstats_atomic_qlen_dec(struct Qdisc *sch) | ||
1788 | { | ||
1789 | - this_cpu_dec(sch->cpu_qstats->qlen); | ||
1790 | + atomic_dec(&sch->q.atomic_qlen); | ||
1791 | } | ||
1792 | |||
1793 | static inline void qdisc_qstats_cpu_requeues_inc(struct Qdisc *sch) | ||
1794 | diff --git a/include/uapi/linux/android/binder.h b/include/uapi/linux/android/binder.h | ||
1795 | index b9ba520f7e4bb..2832134e53971 100644 | ||
1796 | --- a/include/uapi/linux/android/binder.h | ||
1797 | +++ b/include/uapi/linux/android/binder.h | ||
1798 | @@ -41,6 +41,14 @@ enum { | ||
1799 | enum { | ||
1800 | FLAT_BINDER_FLAG_PRIORITY_MASK = 0xff, | ||
1801 | FLAT_BINDER_FLAG_ACCEPTS_FDS = 0x100, | ||
1802 | + | ||
1803 | + /** | ||
1804 | + * @FLAT_BINDER_FLAG_TXN_SECURITY_CTX: request security contexts | ||
1805 | + * | ||
1806 | + * Only when set, causes senders to include their security | ||
1807 | + * context | ||
1808 | + */ | ||
1809 | + FLAT_BINDER_FLAG_TXN_SECURITY_CTX = 0x1000, | ||
1810 | }; | ||
1811 | |||
1812 | #ifdef BINDER_IPC_32BIT | ||
1813 | @@ -218,6 +226,7 @@ struct binder_node_info_for_ref { | ||
1814 | #define BINDER_VERSION _IOWR('b', 9, struct binder_version) | ||
1815 | #define BINDER_GET_NODE_DEBUG_INFO _IOWR('b', 11, struct binder_node_debug_info) | ||
1816 | #define BINDER_GET_NODE_INFO_FOR_REF _IOWR('b', 12, struct binder_node_info_for_ref) | ||
1817 | +#define BINDER_SET_CONTEXT_MGR_EXT _IOW('b', 13, struct flat_binder_object) | ||
1818 | |||
1819 | /* | ||
1820 | * NOTE: Two special error codes you should check for when calling | ||
1821 | @@ -276,6 +285,11 @@ struct binder_transaction_data { | ||
1822 | } data; | ||
1823 | }; | ||
1824 | |||
1825 | +struct binder_transaction_data_secctx { | ||
1826 | + struct binder_transaction_data transaction_data; | ||
1827 | + binder_uintptr_t secctx; | ||
1828 | +}; | ||
1829 | + | ||
1830 | struct binder_transaction_data_sg { | ||
1831 | struct binder_transaction_data transaction_data; | ||
1832 | binder_size_t buffers_size; | ||
1833 | @@ -311,6 +325,11 @@ enum binder_driver_return_protocol { | ||
1834 | BR_OK = _IO('r', 1), | ||
1835 | /* No parameters! */ | ||
1836 | |||
1837 | + BR_TRANSACTION_SEC_CTX = _IOR('r', 2, | ||
1838 | + struct binder_transaction_data_secctx), | ||
1839 | + /* | ||
1840 | + * binder_transaction_data_secctx: the received command. | ||
1841 | + */ | ||
1842 | BR_TRANSACTION = _IOR('r', 2, struct binder_transaction_data), | ||
1843 | BR_REPLY = _IOR('r', 3, struct binder_transaction_data), | ||
1844 | /* | ||
1845 | diff --git a/kernel/trace/trace_events_filter.c b/kernel/trace/trace_events_filter.c | ||
1846 | index 27821480105e6..217ef481fbbb6 100644 | ||
1847 | --- a/kernel/trace/trace_events_filter.c | ||
1848 | +++ b/kernel/trace/trace_events_filter.c | ||
1849 | @@ -1301,7 +1301,7 @@ static int parse_pred(const char *str, void *data, | ||
1850 | /* go past the last quote */ | ||
1851 | i++; | ||
1852 | |||
1853 | - } else if (isdigit(str[i])) { | ||
1854 | + } else if (isdigit(str[i]) || str[i] == '-') { | ||
1855 | |||
1856 | /* Make sure the field is not a string */ | ||
1857 | if (is_string_field(field)) { | ||
1858 | @@ -1314,6 +1314,9 @@ static int parse_pred(const char *str, void *data, | ||
1859 | goto err_free; | ||
1860 | } | ||
1861 | |||
1862 | + if (str[i] == '-') | ||
1863 | + i++; | ||
1864 | + | ||
1865 | /* We allow 0xDEADBEEF */ | ||
1866 | while (isalnum(str[i])) | ||
1867 | i++; | ||
1868 | diff --git a/net/bluetooth/af_bluetooth.c b/net/bluetooth/af_bluetooth.c | ||
1869 | index deacc52d7ff18..8d12198eaa949 100644 | ||
1870 | --- a/net/bluetooth/af_bluetooth.c | ||
1871 | +++ b/net/bluetooth/af_bluetooth.c | ||
1872 | @@ -154,15 +154,25 @@ void bt_sock_unlink(struct bt_sock_list *l, struct sock *sk) | ||
1873 | } | ||
1874 | EXPORT_SYMBOL(bt_sock_unlink); | ||
1875 | |||
1876 | -void bt_accept_enqueue(struct sock *parent, struct sock *sk) | ||
1877 | +void bt_accept_enqueue(struct sock *parent, struct sock *sk, bool bh) | ||
1878 | { | ||
1879 | BT_DBG("parent %p, sk %p", parent, sk); | ||
1880 | |||
1881 | sock_hold(sk); | ||
1882 | - lock_sock_nested(sk, SINGLE_DEPTH_NESTING); | ||
1883 | + | ||
1884 | + if (bh) | ||
1885 | + bh_lock_sock_nested(sk); | ||
1886 | + else | ||
1887 | + lock_sock_nested(sk, SINGLE_DEPTH_NESTING); | ||
1888 | + | ||
1889 | list_add_tail(&bt_sk(sk)->accept_q, &bt_sk(parent)->accept_q); | ||
1890 | bt_sk(sk)->parent = parent; | ||
1891 | - release_sock(sk); | ||
1892 | + | ||
1893 | + if (bh) | ||
1894 | + bh_unlock_sock(sk); | ||
1895 | + else | ||
1896 | + release_sock(sk); | ||
1897 | + | ||
1898 | parent->sk_ack_backlog++; | ||
1899 | } | ||
1900 | EXPORT_SYMBOL(bt_accept_enqueue); | ||
1901 | diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c | ||
1902 | index 686bdc6b35b03..a3a2cd55e23a9 100644 | ||
1903 | --- a/net/bluetooth/l2cap_sock.c | ||
1904 | +++ b/net/bluetooth/l2cap_sock.c | ||
1905 | @@ -1252,7 +1252,7 @@ static struct l2cap_chan *l2cap_sock_new_connection_cb(struct l2cap_chan *chan) | ||
1906 | |||
1907 | l2cap_sock_init(sk, parent); | ||
1908 | |||
1909 | - bt_accept_enqueue(parent, sk); | ||
1910 | + bt_accept_enqueue(parent, sk, false); | ||
1911 | |||
1912 | release_sock(parent); | ||
1913 | |||
1914 | diff --git a/net/bluetooth/rfcomm/sock.c b/net/bluetooth/rfcomm/sock.c | ||
1915 | index aa0db1d1bd9b4..b1f49fcc04780 100644 | ||
1916 | --- a/net/bluetooth/rfcomm/sock.c | ||
1917 | +++ b/net/bluetooth/rfcomm/sock.c | ||
1918 | @@ -988,7 +988,7 @@ int rfcomm_connect_ind(struct rfcomm_session *s, u8 channel, struct rfcomm_dlc * | ||
1919 | rfcomm_pi(sk)->channel = channel; | ||
1920 | |||
1921 | sk->sk_state = BT_CONFIG; | ||
1922 | - bt_accept_enqueue(parent, sk); | ||
1923 | + bt_accept_enqueue(parent, sk, true); | ||
1924 | |||
1925 | /* Accept connection and return socket DLC */ | ||
1926 | *d = rfcomm_pi(sk)->dlc; | ||
1927 | diff --git a/net/bluetooth/sco.c b/net/bluetooth/sco.c | ||
1928 | index 529b38996d8bc..9a580999ca57e 100644 | ||
1929 | --- a/net/bluetooth/sco.c | ||
1930 | +++ b/net/bluetooth/sco.c | ||
1931 | @@ -193,7 +193,7 @@ static void __sco_chan_add(struct sco_conn *conn, struct sock *sk, | ||
1932 | conn->sk = sk; | ||
1933 | |||
1934 | if (parent) | ||
1935 | - bt_accept_enqueue(parent, sk); | ||
1936 | + bt_accept_enqueue(parent, sk, true); | ||
1937 | } | ||
1938 | |||
1939 | static int sco_chan_add(struct sco_conn *conn, struct sock *sk, | ||
1940 | diff --git a/net/core/gen_stats.c b/net/core/gen_stats.c | ||
1941 | index 9bf1b9ad17806..ac679f74ba475 100644 | ||
1942 | --- a/net/core/gen_stats.c | ||
1943 | +++ b/net/core/gen_stats.c | ||
1944 | @@ -291,7 +291,6 @@ __gnet_stats_copy_queue_cpu(struct gnet_stats_queue *qstats, | ||
1945 | for_each_possible_cpu(i) { | ||
1946 | const struct gnet_stats_queue *qcpu = per_cpu_ptr(q, i); | ||
1947 | |||
1948 | - qstats->qlen = 0; | ||
1949 | qstats->backlog += qcpu->backlog; | ||
1950 | qstats->drops += qcpu->drops; | ||
1951 | qstats->requeues += qcpu->requeues; | ||
1952 | @@ -307,7 +306,6 @@ void __gnet_stats_copy_queue(struct gnet_stats_queue *qstats, | ||
1953 | if (cpu) { | ||
1954 | __gnet_stats_copy_queue_cpu(qstats, cpu); | ||
1955 | } else { | ||
1956 | - qstats->qlen = q->qlen; | ||
1957 | qstats->backlog = q->backlog; | ||
1958 | qstats->drops = q->drops; | ||
1959 | qstats->requeues = q->requeues; | ||
1960 | diff --git a/net/core/net-sysfs.c b/net/core/net-sysfs.c | ||
1961 | index ff9fd2bb4ce43..73ad7607dcd1a 100644 | ||
1962 | --- a/net/core/net-sysfs.c | ||
1963 | +++ b/net/core/net-sysfs.c | ||
1964 | @@ -1547,6 +1547,9 @@ static int register_queue_kobjects(struct net_device *dev) | ||
1965 | error: | ||
1966 | netdev_queue_update_kobjects(dev, txq, 0); | ||
1967 | net_rx_queue_update_kobjects(dev, rxq, 0); | ||
1968 | +#ifdef CONFIG_SYSFS | ||
1969 | + kset_unregister(dev->queues_kset); | ||
1970 | +#endif | ||
1971 | return error; | ||
1972 | } | ||
1973 | |||
1974 | diff --git a/net/ipv6/ip6mr.c b/net/ipv6/ip6mr.c | ||
1975 | index cc01aa3f2b5e3..af91a1a402f13 100644 | ||
1976 | --- a/net/ipv6/ip6mr.c | ||
1977 | +++ b/net/ipv6/ip6mr.c | ||
1978 | @@ -1964,10 +1964,10 @@ int ip6mr_compat_ioctl(struct sock *sk, unsigned int cmd, void __user *arg) | ||
1979 | |||
1980 | static inline int ip6mr_forward2_finish(struct net *net, struct sock *sk, struct sk_buff *skb) | ||
1981 | { | ||
1982 | - __IP6_INC_STATS(net, ip6_dst_idev(skb_dst(skb)), | ||
1983 | - IPSTATS_MIB_OUTFORWDATAGRAMS); | ||
1984 | - __IP6_ADD_STATS(net, ip6_dst_idev(skb_dst(skb)), | ||
1985 | - IPSTATS_MIB_OUTOCTETS, skb->len); | ||
1986 | + IP6_INC_STATS(net, ip6_dst_idev(skb_dst(skb)), | ||
1987 | + IPSTATS_MIB_OUTFORWDATAGRAMS); | ||
1988 | + IP6_ADD_STATS(net, ip6_dst_idev(skb_dst(skb)), | ||
1989 | + IPSTATS_MIB_OUTOCTETS, skb->len); | ||
1990 | return dst_output(net, sk, skb); | ||
1991 | } | ||
1992 | |||
1993 | diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c | ||
1994 | index 968a85fe4d4a9..de31f2f3b9730 100644 | ||
1995 | --- a/net/sched/sch_generic.c | ||
1996 | +++ b/net/sched/sch_generic.c | ||
1997 | @@ -68,7 +68,7 @@ static inline struct sk_buff *__skb_dequeue_bad_txq(struct Qdisc *q) | ||
1998 | skb = __skb_dequeue(&q->skb_bad_txq); | ||
1999 | if (qdisc_is_percpu_stats(q)) { | ||
2000 | qdisc_qstats_cpu_backlog_dec(q, skb); | ||
2001 | - qdisc_qstats_cpu_qlen_dec(q); | ||
2002 | + qdisc_qstats_atomic_qlen_dec(q); | ||
2003 | } else { | ||
2004 | qdisc_qstats_backlog_dec(q, skb); | ||
2005 | q->q.qlen--; | ||
2006 | @@ -108,7 +108,7 @@ static inline void qdisc_enqueue_skb_bad_txq(struct Qdisc *q, | ||
2007 | |||
2008 | if (qdisc_is_percpu_stats(q)) { | ||
2009 | qdisc_qstats_cpu_backlog_inc(q, skb); | ||
2010 | - qdisc_qstats_cpu_qlen_inc(q); | ||
2011 | + qdisc_qstats_atomic_qlen_inc(q); | ||
2012 | } else { | ||
2013 | qdisc_qstats_backlog_inc(q, skb); | ||
2014 | q->q.qlen++; | ||
2015 | @@ -147,7 +147,7 @@ static inline int dev_requeue_skb_locked(struct sk_buff *skb, struct Qdisc *q) | ||
2016 | |||
2017 | qdisc_qstats_cpu_requeues_inc(q); | ||
2018 | qdisc_qstats_cpu_backlog_inc(q, skb); | ||
2019 | - qdisc_qstats_cpu_qlen_inc(q); | ||
2020 | + qdisc_qstats_atomic_qlen_inc(q); | ||
2021 | |||
2022 | skb = next; | ||
2023 | } | ||
2024 | @@ -252,7 +252,7 @@ static struct sk_buff *dequeue_skb(struct Qdisc *q, bool *validate, | ||
2025 | skb = __skb_dequeue(&q->gso_skb); | ||
2026 | if (qdisc_is_percpu_stats(q)) { | ||
2027 | qdisc_qstats_cpu_backlog_dec(q, skb); | ||
2028 | - qdisc_qstats_cpu_qlen_dec(q); | ||
2029 | + qdisc_qstats_atomic_qlen_dec(q); | ||
2030 | } else { | ||
2031 | qdisc_qstats_backlog_dec(q, skb); | ||
2032 | q->q.qlen--; | ||
2033 | @@ -645,7 +645,7 @@ static int pfifo_fast_enqueue(struct sk_buff *skb, struct Qdisc *qdisc, | ||
2034 | if (unlikely(err)) | ||
2035 | return qdisc_drop_cpu(skb, qdisc, to_free); | ||
2036 | |||
2037 | - qdisc_qstats_cpu_qlen_inc(qdisc); | ||
2038 | + qdisc_qstats_atomic_qlen_inc(qdisc); | ||
2039 | /* Note: skb can not be used after skb_array_produce(), | ||
2040 | * so we better not use qdisc_qstats_cpu_backlog_inc() | ||
2041 | */ | ||
2042 | @@ -670,7 +670,7 @@ static struct sk_buff *pfifo_fast_dequeue(struct Qdisc *qdisc) | ||
2043 | if (likely(skb)) { | ||
2044 | qdisc_qstats_cpu_backlog_dec(qdisc, skb); | ||
2045 | qdisc_bstats_cpu_update(qdisc, skb); | ||
2046 | - qdisc_qstats_cpu_qlen_dec(qdisc); | ||
2047 | + qdisc_qstats_atomic_qlen_dec(qdisc); | ||
2048 | } | ||
2049 | |||
2050 | return skb; | ||
2051 | @@ -714,7 +714,6 @@ static void pfifo_fast_reset(struct Qdisc *qdisc) | ||
2052 | struct gnet_stats_queue *q = per_cpu_ptr(qdisc->cpu_qstats, i); | ||
2053 | |||
2054 | q->backlog = 0; | ||
2055 | - q->qlen = 0; | ||
2056 | } | ||
2057 | } | ||
2058 | |||
2059 | diff --git a/net/sctp/socket.c b/net/sctp/socket.c | ||
2060 | index 65d6d04546aee..a2771b3b3c148 100644 | ||
2061 | --- a/net/sctp/socket.c | ||
2062 | +++ b/net/sctp/socket.c | ||
2063 | @@ -1866,6 +1866,7 @@ static int sctp_sendmsg_check_sflags(struct sctp_association *asoc, | ||
2064 | |||
2065 | pr_debug("%s: aborting association:%p\n", __func__, asoc); | ||
2066 | sctp_primitive_ABORT(net, asoc, chunk); | ||
2067 | + iov_iter_revert(&msg->msg_iter, msg_len); | ||
2068 | |||
2069 | return 0; | ||
2070 | } | ||
2071 | diff --git a/net/tipc/socket.c b/net/tipc/socket.c | ||
2072 | index 70343ac448b18..139694f2c576c 100644 | ||
2073 | --- a/net/tipc/socket.c | ||
2074 | +++ b/net/tipc/socket.c | ||
2075 | @@ -1333,7 +1333,7 @@ static int __tipc_sendmsg(struct socket *sock, struct msghdr *m, size_t dlen) | ||
2076 | |||
2077 | if (unlikely(!dest)) { | ||
2078 | dest = &tsk->peer; | ||
2079 | - if (!syn || dest->family != AF_TIPC) | ||
2080 | + if (!syn && dest->family != AF_TIPC) | ||
2081 | return -EDESTADDRREQ; | ||
2082 | } | ||
2083 | |||
2084 | diff --git a/tools/testing/selftests/firmware/config b/tools/testing/selftests/firmware/config | ||
2085 | index 913a25a4a32be..bf634dda07201 100644 | ||
2086 | --- a/tools/testing/selftests/firmware/config | ||
2087 | +++ b/tools/testing/selftests/firmware/config | ||
2088 | @@ -1,6 +1,5 @@ | ||
2089 | CONFIG_TEST_FIRMWARE=y | ||
2090 | CONFIG_FW_LOADER=y | ||
2091 | CONFIG_FW_LOADER_USER_HELPER=y | ||
2092 | -CONFIG_FW_LOADER_USER_HELPER_FALLBACK=y | ||
2093 | CONFIG_IKCONFIG=y | ||
2094 | CONFIG_IKCONFIG_PROC=y | ||
2095 | diff --git a/tools/testing/selftests/firmware/fw_filesystem.sh b/tools/testing/selftests/firmware/fw_filesystem.sh | ||
2096 | index 466cf2f91ba01..a4320c4b44dc9 100755 | ||
2097 | --- a/tools/testing/selftests/firmware/fw_filesystem.sh | ||
2098 | +++ b/tools/testing/selftests/firmware/fw_filesystem.sh | ||
2099 | @@ -155,8 +155,11 @@ read_firmwares() | ||
2100 | { | ||
2101 | for i in $(seq 0 3); do | ||
2102 | config_set_read_fw_idx $i | ||
2103 | - # Verify the contents match | ||
2104 | - if ! diff -q "$FW" $DIR/read_firmware 2>/dev/null ; then | ||
2105 | + # Verify the contents are what we expect. | ||
2106 | + # -Z required for now -- check for yourself, md5sum | ||
2107 | + # on $FW and DIR/read_firmware will yield the same. Even | ||
2108 | + # cmp agrees, so something is off. | ||
2109 | + if ! diff -q -Z "$FW" $DIR/read_firmware 2>/dev/null ; then | ||
2110 | echo "request #$i: firmware was not loaded" >&2 | ||
2111 | exit 1 | ||
2112 | fi | ||
2113 | @@ -168,7 +171,7 @@ read_firmwares_expect_nofile() | ||
2114 | for i in $(seq 0 3); do | ||
2115 | config_set_read_fw_idx $i | ||
2116 | # Ensures contents differ | ||
2117 | - if diff -q "$FW" $DIR/read_firmware 2>/dev/null ; then | ||
2118 | + if diff -q -Z "$FW" $DIR/read_firmware 2>/dev/null ; then | ||
2119 | echo "request $i: file was not expected to match" >&2 | ||
2120 | exit 1 | ||
2121 | fi | ||
2122 | diff --git a/tools/testing/selftests/firmware/fw_lib.sh b/tools/testing/selftests/firmware/fw_lib.sh | ||
2123 | index 6c5f1b2ffb745..1cbb12e284a68 100755 | ||
2124 | --- a/tools/testing/selftests/firmware/fw_lib.sh | ||
2125 | +++ b/tools/testing/selftests/firmware/fw_lib.sh | ||
2126 | @@ -91,7 +91,7 @@ verify_reqs() | ||
2127 | if [ "$TEST_REQS_FW_SYSFS_FALLBACK" = "yes" ]; then | ||
2128 | if [ ! "$HAS_FW_LOADER_USER_HELPER" = "yes" ]; then | ||
2129 | echo "usermode helper disabled so ignoring test" | ||
2130 | - exit $ksft_skip | ||
2131 | + exit 0 | ||
2132 | fi | ||
2133 | fi | ||
2134 | } |