Contents of /trunk/kernel-alx-legacy/patches-4.9/0273-4.9.174-all-fixes.patch
Parent Directory | Revision Log
Revision 3608 -
(show annotations)
(download)
Fri Aug 14 07:34:29 2020 UTC (4 years, 1 month ago) by niro
File size: 83462 byte(s)
Fri Aug 14 07:34:29 2020 UTC (4 years, 1 month ago) by niro
File size: 83462 byte(s)
-added kerenl-alx-legacy pkg
1 | diff --git a/Documentation/usb/power-management.txt b/Documentation/usb/power-management.txt |
2 | index 0a94ffe17ab6..b13e031beaa6 100644 |
3 | --- a/Documentation/usb/power-management.txt |
4 | +++ b/Documentation/usb/power-management.txt |
5 | @@ -365,11 +365,15 @@ autosuspend the interface's device. When the usage counter is = 0 |
6 | then the interface is considered to be idle, and the kernel may |
7 | autosuspend the device. |
8 | |
9 | -Drivers need not be concerned about balancing changes to the usage |
10 | -counter; the USB core will undo any remaining "get"s when a driver |
11 | -is unbound from its interface. As a corollary, drivers must not call |
12 | -any of the usb_autopm_* functions after their disconnect() routine has |
13 | -returned. |
14 | +Drivers must be careful to balance their overall changes to the usage |
15 | +counter. Unbalanced "get"s will remain in effect when a driver is |
16 | +unbound from its interface, preventing the device from going into |
17 | +runtime suspend should the interface be bound to a driver again. On |
18 | +the other hand, drivers are allowed to achieve this balance by calling |
19 | +the ``usb_autopm_*`` functions even after their ``disconnect`` routine |
20 | +has returned -- say from within a work-queue routine -- provided they |
21 | +retain an active reference to the interface (via ``usb_get_intf`` and |
22 | +``usb_put_intf``). |
23 | |
24 | Drivers using the async routines are responsible for their own |
25 | synchronization and mutual exclusion. |
26 | diff --git a/Makefile b/Makefile |
27 | index a4e35453f9e4..f5836837df15 100644 |
28 | --- a/Makefile |
29 | +++ b/Makefile |
30 | @@ -1,6 +1,6 @@ |
31 | VERSION = 4 |
32 | PATCHLEVEL = 9 |
33 | -SUBLEVEL = 173 |
34 | +SUBLEVEL = 174 |
35 | EXTRAVERSION = |
36 | NAME = Roaring Lionus |
37 | |
38 | diff --git a/arch/arm/mach-iop13xx/setup.c b/arch/arm/mach-iop13xx/setup.c |
39 | index 53c316f7301e..fe4932fda01d 100644 |
40 | --- a/arch/arm/mach-iop13xx/setup.c |
41 | +++ b/arch/arm/mach-iop13xx/setup.c |
42 | @@ -300,7 +300,7 @@ static struct resource iop13xx_adma_2_resources[] = { |
43 | } |
44 | }; |
45 | |
46 | -static u64 iop13xx_adma_dmamask = DMA_BIT_MASK(64); |
47 | +static u64 iop13xx_adma_dmamask = DMA_BIT_MASK(32); |
48 | static struct iop_adma_platform_data iop13xx_adma_0_data = { |
49 | .hw_id = 0, |
50 | .pool_size = PAGE_SIZE, |
51 | @@ -324,7 +324,7 @@ static struct platform_device iop13xx_adma_0_channel = { |
52 | .resource = iop13xx_adma_0_resources, |
53 | .dev = { |
54 | .dma_mask = &iop13xx_adma_dmamask, |
55 | - .coherent_dma_mask = DMA_BIT_MASK(64), |
56 | + .coherent_dma_mask = DMA_BIT_MASK(32), |
57 | .platform_data = (void *) &iop13xx_adma_0_data, |
58 | }, |
59 | }; |
60 | @@ -336,7 +336,7 @@ static struct platform_device iop13xx_adma_1_channel = { |
61 | .resource = iop13xx_adma_1_resources, |
62 | .dev = { |
63 | .dma_mask = &iop13xx_adma_dmamask, |
64 | - .coherent_dma_mask = DMA_BIT_MASK(64), |
65 | + .coherent_dma_mask = DMA_BIT_MASK(32), |
66 | .platform_data = (void *) &iop13xx_adma_1_data, |
67 | }, |
68 | }; |
69 | @@ -348,7 +348,7 @@ static struct platform_device iop13xx_adma_2_channel = { |
70 | .resource = iop13xx_adma_2_resources, |
71 | .dev = { |
72 | .dma_mask = &iop13xx_adma_dmamask, |
73 | - .coherent_dma_mask = DMA_BIT_MASK(64), |
74 | + .coherent_dma_mask = DMA_BIT_MASK(32), |
75 | .platform_data = (void *) &iop13xx_adma_2_data, |
76 | }, |
77 | }; |
78 | diff --git a/arch/arm/mach-iop13xx/tpmi.c b/arch/arm/mach-iop13xx/tpmi.c |
79 | index db511ec2b1df..116feb6b261e 100644 |
80 | --- a/arch/arm/mach-iop13xx/tpmi.c |
81 | +++ b/arch/arm/mach-iop13xx/tpmi.c |
82 | @@ -152,7 +152,7 @@ static struct resource iop13xx_tpmi_3_resources[] = { |
83 | } |
84 | }; |
85 | |
86 | -u64 iop13xx_tpmi_mask = DMA_BIT_MASK(64); |
87 | +u64 iop13xx_tpmi_mask = DMA_BIT_MASK(32); |
88 | static struct platform_device iop13xx_tpmi_0_device = { |
89 | .name = "iop-tpmi", |
90 | .id = 0, |
91 | @@ -160,7 +160,7 @@ static struct platform_device iop13xx_tpmi_0_device = { |
92 | .resource = iop13xx_tpmi_0_resources, |
93 | .dev = { |
94 | .dma_mask = &iop13xx_tpmi_mask, |
95 | - .coherent_dma_mask = DMA_BIT_MASK(64), |
96 | + .coherent_dma_mask = DMA_BIT_MASK(32), |
97 | }, |
98 | }; |
99 | |
100 | @@ -171,7 +171,7 @@ static struct platform_device iop13xx_tpmi_1_device = { |
101 | .resource = iop13xx_tpmi_1_resources, |
102 | .dev = { |
103 | .dma_mask = &iop13xx_tpmi_mask, |
104 | - .coherent_dma_mask = DMA_BIT_MASK(64), |
105 | + .coherent_dma_mask = DMA_BIT_MASK(32), |
106 | }, |
107 | }; |
108 | |
109 | @@ -182,7 +182,7 @@ static struct platform_device iop13xx_tpmi_2_device = { |
110 | .resource = iop13xx_tpmi_2_resources, |
111 | .dev = { |
112 | .dma_mask = &iop13xx_tpmi_mask, |
113 | - .coherent_dma_mask = DMA_BIT_MASK(64), |
114 | + .coherent_dma_mask = DMA_BIT_MASK(32), |
115 | }, |
116 | }; |
117 | |
118 | @@ -193,7 +193,7 @@ static struct platform_device iop13xx_tpmi_3_device = { |
119 | .resource = iop13xx_tpmi_3_resources, |
120 | .dev = { |
121 | .dma_mask = &iop13xx_tpmi_mask, |
122 | - .coherent_dma_mask = DMA_BIT_MASK(64), |
123 | + .coherent_dma_mask = DMA_BIT_MASK(32), |
124 | }, |
125 | }; |
126 | |
127 | diff --git a/arch/arm/plat-iop/adma.c b/arch/arm/plat-iop/adma.c |
128 | index a4d1f8de3b5b..d9612221e484 100644 |
129 | --- a/arch/arm/plat-iop/adma.c |
130 | +++ b/arch/arm/plat-iop/adma.c |
131 | @@ -143,7 +143,7 @@ struct platform_device iop3xx_dma_0_channel = { |
132 | .resource = iop3xx_dma_0_resources, |
133 | .dev = { |
134 | .dma_mask = &iop3xx_adma_dmamask, |
135 | - .coherent_dma_mask = DMA_BIT_MASK(64), |
136 | + .coherent_dma_mask = DMA_BIT_MASK(32), |
137 | .platform_data = (void *) &iop3xx_dma_0_data, |
138 | }, |
139 | }; |
140 | @@ -155,7 +155,7 @@ struct platform_device iop3xx_dma_1_channel = { |
141 | .resource = iop3xx_dma_1_resources, |
142 | .dev = { |
143 | .dma_mask = &iop3xx_adma_dmamask, |
144 | - .coherent_dma_mask = DMA_BIT_MASK(64), |
145 | + .coherent_dma_mask = DMA_BIT_MASK(32), |
146 | .platform_data = (void *) &iop3xx_dma_1_data, |
147 | }, |
148 | }; |
149 | @@ -167,7 +167,7 @@ struct platform_device iop3xx_aau_channel = { |
150 | .resource = iop3xx_aau_resources, |
151 | .dev = { |
152 | .dma_mask = &iop3xx_adma_dmamask, |
153 | - .coherent_dma_mask = DMA_BIT_MASK(64), |
154 | + .coherent_dma_mask = DMA_BIT_MASK(32), |
155 | .platform_data = (void *) &iop3xx_aau_data, |
156 | }, |
157 | }; |
158 | diff --git a/arch/arm/plat-orion/common.c b/arch/arm/plat-orion/common.c |
159 | index 272f49b2c68f..bb29e6ebdc0d 100644 |
160 | --- a/arch/arm/plat-orion/common.c |
161 | +++ b/arch/arm/plat-orion/common.c |
162 | @@ -605,7 +605,7 @@ static struct platform_device orion_xor0_shared = { |
163 | .resource = orion_xor0_shared_resources, |
164 | .dev = { |
165 | .dma_mask = &orion_xor_dmamask, |
166 | - .coherent_dma_mask = DMA_BIT_MASK(64), |
167 | + .coherent_dma_mask = DMA_BIT_MASK(32), |
168 | .platform_data = &orion_xor0_pdata, |
169 | }, |
170 | }; |
171 | @@ -666,7 +666,7 @@ static struct platform_device orion_xor1_shared = { |
172 | .resource = orion_xor1_shared_resources, |
173 | .dev = { |
174 | .dma_mask = &orion_xor_dmamask, |
175 | - .coherent_dma_mask = DMA_BIT_MASK(64), |
176 | + .coherent_dma_mask = DMA_BIT_MASK(32), |
177 | .platform_data = &orion_xor1_pdata, |
178 | }, |
179 | }; |
180 | diff --git a/arch/arm64/include/asm/system_misc.h b/arch/arm64/include/asm/system_misc.h |
181 | index bc812435bc76..d0beefeb6d25 100644 |
182 | --- a/arch/arm64/include/asm/system_misc.h |
183 | +++ b/arch/arm64/include/asm/system_misc.h |
184 | @@ -40,7 +40,7 @@ void hook_debug_fault_code(int nr, int (*fn)(unsigned long, unsigned int, |
185 | int sig, int code, const char *name); |
186 | |
187 | struct mm_struct; |
188 | -extern void show_pte(struct mm_struct *mm, unsigned long addr); |
189 | +extern void show_pte(unsigned long addr); |
190 | extern void __show_regs(struct pt_regs *); |
191 | |
192 | extern void (*arm_pm_restart)(enum reboot_mode reboot_mode, const char *cmd); |
193 | diff --git a/arch/arm64/mm/fault.c b/arch/arm64/mm/fault.c |
194 | index 051b32084776..575c11a6f9b6 100644 |
195 | --- a/arch/arm64/mm/fault.c |
196 | +++ b/arch/arm64/mm/fault.c |
197 | @@ -79,18 +79,33 @@ static inline int notify_page_fault(struct pt_regs *regs, unsigned int esr) |
198 | #endif |
199 | |
200 | /* |
201 | - * Dump out the page tables associated with 'addr' in mm 'mm'. |
202 | + * Dump out the page tables associated with 'addr' in the currently active mm. |
203 | */ |
204 | -void show_pte(struct mm_struct *mm, unsigned long addr) |
205 | +void show_pte(unsigned long addr) |
206 | { |
207 | + struct mm_struct *mm; |
208 | pgd_t *pgd; |
209 | |
210 | - if (!mm) |
211 | + if (addr < TASK_SIZE) { |
212 | + /* TTBR0 */ |
213 | + mm = current->active_mm; |
214 | + if (mm == &init_mm) { |
215 | + pr_alert("[%016lx] user address but active_mm is swapper\n", |
216 | + addr); |
217 | + return; |
218 | + } |
219 | + } else if (addr >= VA_START) { |
220 | + /* TTBR1 */ |
221 | mm = &init_mm; |
222 | + } else { |
223 | + pr_alert("[%016lx] address between user and kernel address ranges\n", |
224 | + addr); |
225 | + return; |
226 | + } |
227 | |
228 | pr_alert("pgd = %p\n", mm->pgd); |
229 | pgd = pgd_offset(mm, addr); |
230 | - pr_alert("[%08lx] *pgd=%016llx", addr, pgd_val(*pgd)); |
231 | + pr_alert("[%016lx] *pgd=%016llx", addr, pgd_val(*pgd)); |
232 | |
233 | do { |
234 | pud_t *pud; |
235 | @@ -176,8 +191,8 @@ static bool is_el1_instruction_abort(unsigned int esr) |
236 | /* |
237 | * The kernel tried to access some page that wasn't present. |
238 | */ |
239 | -static void __do_kernel_fault(struct mm_struct *mm, unsigned long addr, |
240 | - unsigned int esr, struct pt_regs *regs) |
241 | +static void __do_kernel_fault(unsigned long addr, unsigned int esr, |
242 | + struct pt_regs *regs) |
243 | { |
244 | /* |
245 | * Are we prepared to handle this kernel fault? |
246 | @@ -194,7 +209,7 @@ static void __do_kernel_fault(struct mm_struct *mm, unsigned long addr, |
247 | (addr < PAGE_SIZE) ? "NULL pointer dereference" : |
248 | "paging request", addr); |
249 | |
250 | - show_pte(mm, addr); |
251 | + show_pte(addr); |
252 | die("Oops", regs, esr); |
253 | bust_spinlocks(0); |
254 | do_exit(SIGKILL); |
255 | @@ -216,7 +231,6 @@ static void __do_user_fault(struct task_struct *tsk, unsigned long addr, |
256 | pr_info("%s[%d]: unhandled %s (%d) at 0x%08lx, esr 0x%03x\n", |
257 | tsk->comm, task_pid_nr(tsk), inf->name, sig, |
258 | addr, esr); |
259 | - show_pte(tsk->mm, addr); |
260 | show_regs(regs); |
261 | } |
262 | |
263 | @@ -232,7 +246,6 @@ static void __do_user_fault(struct task_struct *tsk, unsigned long addr, |
264 | static void do_bad_area(unsigned long addr, unsigned int esr, struct pt_regs *regs) |
265 | { |
266 | struct task_struct *tsk = current; |
267 | - struct mm_struct *mm = tsk->active_mm; |
268 | const struct fault_info *inf; |
269 | |
270 | /* |
271 | @@ -243,7 +256,7 @@ static void do_bad_area(unsigned long addr, unsigned int esr, struct pt_regs *re |
272 | inf = esr_to_fault_info(esr); |
273 | __do_user_fault(tsk, addr, esr, inf->sig, inf->code, regs); |
274 | } else |
275 | - __do_kernel_fault(mm, addr, esr, regs); |
276 | + __do_kernel_fault(addr, esr, regs); |
277 | } |
278 | |
279 | #define VM_FAULT_BADMAP 0x010000 |
280 | @@ -454,7 +467,7 @@ retry: |
281 | return 0; |
282 | |
283 | no_context: |
284 | - __do_kernel_fault(mm, addr, esr, regs); |
285 | + __do_kernel_fault(addr, esr, regs); |
286 | return 0; |
287 | } |
288 | |
289 | diff --git a/arch/arm64/mm/kasan_init.c b/arch/arm64/mm/kasan_init.c |
290 | index 757009daa9ed..ff43da269fe8 100644 |
291 | --- a/arch/arm64/mm/kasan_init.c |
292 | +++ b/arch/arm64/mm/kasan_init.c |
293 | @@ -153,7 +153,7 @@ void __init kasan_init(void) |
294 | clear_pgds(KASAN_SHADOW_START, KASAN_SHADOW_END); |
295 | |
296 | vmemmap_populate(kimg_shadow_start, kimg_shadow_end, |
297 | - pfn_to_nid(virt_to_pfn(_text))); |
298 | + pfn_to_nid(virt_to_pfn(lm_alias(_text)))); |
299 | |
300 | /* |
301 | * vmemmap_populate() has populated the shadow region that covers the |
302 | diff --git a/arch/arm64/mm/proc.S b/arch/arm64/mm/proc.S |
303 | index 18d96d349a8b..f5fde8d389c9 100644 |
304 | --- a/arch/arm64/mm/proc.S |
305 | +++ b/arch/arm64/mm/proc.S |
306 | @@ -181,7 +181,8 @@ ENDPROC(idmap_cpu_replace_ttbr1) |
307 | dc cvac, cur_\()\type\()p // Ensure any existing dirty |
308 | dmb sy // lines are written back before |
309 | ldr \type, [cur_\()\type\()p] // loading the entry |
310 | - tbz \type, #0, next_\()\type // Skip invalid entries |
311 | + tbz \type, #0, skip_\()\type // Skip invalid and |
312 | + tbnz \type, #11, skip_\()\type // non-global entries |
313 | .endm |
314 | |
315 | .macro __idmap_kpti_put_pgtable_ent_ng, type |
316 | @@ -241,8 +242,9 @@ ENTRY(idmap_kpti_install_ng_mappings) |
317 | add end_pgdp, cur_pgdp, #(PTRS_PER_PGD * 8) |
318 | do_pgd: __idmap_kpti_get_pgtable_ent pgd |
319 | tbnz pgd, #1, walk_puds |
320 | - __idmap_kpti_put_pgtable_ent_ng pgd |
321 | next_pgd: |
322 | + __idmap_kpti_put_pgtable_ent_ng pgd |
323 | +skip_pgd: |
324 | add cur_pgdp, cur_pgdp, #8 |
325 | cmp cur_pgdp, end_pgdp |
326 | b.ne do_pgd |
327 | @@ -270,8 +272,9 @@ walk_puds: |
328 | add end_pudp, cur_pudp, #(PTRS_PER_PUD * 8) |
329 | do_pud: __idmap_kpti_get_pgtable_ent pud |
330 | tbnz pud, #1, walk_pmds |
331 | - __idmap_kpti_put_pgtable_ent_ng pud |
332 | next_pud: |
333 | + __idmap_kpti_put_pgtable_ent_ng pud |
334 | +skip_pud: |
335 | add cur_pudp, cur_pudp, 8 |
336 | cmp cur_pudp, end_pudp |
337 | b.ne do_pud |
338 | @@ -290,8 +293,9 @@ walk_pmds: |
339 | add end_pmdp, cur_pmdp, #(PTRS_PER_PMD * 8) |
340 | do_pmd: __idmap_kpti_get_pgtable_ent pmd |
341 | tbnz pmd, #1, walk_ptes |
342 | - __idmap_kpti_put_pgtable_ent_ng pmd |
343 | next_pmd: |
344 | + __idmap_kpti_put_pgtable_ent_ng pmd |
345 | +skip_pmd: |
346 | add cur_pmdp, cur_pmdp, #8 |
347 | cmp cur_pmdp, end_pmdp |
348 | b.ne do_pmd |
349 | @@ -309,7 +313,7 @@ walk_ptes: |
350 | add end_ptep, cur_ptep, #(PTRS_PER_PTE * 8) |
351 | do_pte: __idmap_kpti_get_pgtable_ent pte |
352 | __idmap_kpti_put_pgtable_ent_ng pte |
353 | -next_pte: |
354 | +skip_pte: |
355 | add cur_ptep, cur_ptep, #8 |
356 | cmp cur_ptep, end_ptep |
357 | b.ne do_pte |
358 | diff --git a/arch/sh/boards/of-generic.c b/arch/sh/boards/of-generic.c |
359 | index 1fb6d5714bae..fd00566677c9 100644 |
360 | --- a/arch/sh/boards/of-generic.c |
361 | +++ b/arch/sh/boards/of-generic.c |
362 | @@ -180,10 +180,10 @@ static struct sh_machine_vector __initmv sh_of_generic_mv = { |
363 | |
364 | struct sh_clk_ops; |
365 | |
366 | -void __init arch_init_clk_ops(struct sh_clk_ops **ops, int idx) |
367 | +void __init __weak arch_init_clk_ops(struct sh_clk_ops **ops, int idx) |
368 | { |
369 | } |
370 | |
371 | -void __init plat_irq_setup(void) |
372 | +void __init __weak plat_irq_setup(void) |
373 | { |
374 | } |
375 | diff --git a/arch/x86/events/amd/core.c b/arch/x86/events/amd/core.c |
376 | index de050d5a4506..00b56cc69d37 100644 |
377 | --- a/arch/x86/events/amd/core.c |
378 | +++ b/arch/x86/events/amd/core.c |
379 | @@ -112,6 +112,110 @@ static __initconst const u64 amd_hw_cache_event_ids |
380 | }, |
381 | }; |
382 | |
383 | +static __initconst const u64 amd_hw_cache_event_ids_f17h |
384 | + [PERF_COUNT_HW_CACHE_MAX] |
385 | + [PERF_COUNT_HW_CACHE_OP_MAX] |
386 | + [PERF_COUNT_HW_CACHE_RESULT_MAX] = { |
387 | +[C(L1D)] = { |
388 | + [C(OP_READ)] = { |
389 | + [C(RESULT_ACCESS)] = 0x0040, /* Data Cache Accesses */ |
390 | + [C(RESULT_MISS)] = 0xc860, /* L2$ access from DC Miss */ |
391 | + }, |
392 | + [C(OP_WRITE)] = { |
393 | + [C(RESULT_ACCESS)] = 0, |
394 | + [C(RESULT_MISS)] = 0, |
395 | + }, |
396 | + [C(OP_PREFETCH)] = { |
397 | + [C(RESULT_ACCESS)] = 0xff5a, /* h/w prefetch DC Fills */ |
398 | + [C(RESULT_MISS)] = 0, |
399 | + }, |
400 | +}, |
401 | +[C(L1I)] = { |
402 | + [C(OP_READ)] = { |
403 | + [C(RESULT_ACCESS)] = 0x0080, /* Instruction cache fetches */ |
404 | + [C(RESULT_MISS)] = 0x0081, /* Instruction cache misses */ |
405 | + }, |
406 | + [C(OP_WRITE)] = { |
407 | + [C(RESULT_ACCESS)] = -1, |
408 | + [C(RESULT_MISS)] = -1, |
409 | + }, |
410 | + [C(OP_PREFETCH)] = { |
411 | + [C(RESULT_ACCESS)] = 0, |
412 | + [C(RESULT_MISS)] = 0, |
413 | + }, |
414 | +}, |
415 | +[C(LL)] = { |
416 | + [C(OP_READ)] = { |
417 | + [C(RESULT_ACCESS)] = 0, |
418 | + [C(RESULT_MISS)] = 0, |
419 | + }, |
420 | + [C(OP_WRITE)] = { |
421 | + [C(RESULT_ACCESS)] = 0, |
422 | + [C(RESULT_MISS)] = 0, |
423 | + }, |
424 | + [C(OP_PREFETCH)] = { |
425 | + [C(RESULT_ACCESS)] = 0, |
426 | + [C(RESULT_MISS)] = 0, |
427 | + }, |
428 | +}, |
429 | +[C(DTLB)] = { |
430 | + [C(OP_READ)] = { |
431 | + [C(RESULT_ACCESS)] = 0xff45, /* All L2 DTLB accesses */ |
432 | + [C(RESULT_MISS)] = 0xf045, /* L2 DTLB misses (PT walks) */ |
433 | + }, |
434 | + [C(OP_WRITE)] = { |
435 | + [C(RESULT_ACCESS)] = 0, |
436 | + [C(RESULT_MISS)] = 0, |
437 | + }, |
438 | + [C(OP_PREFETCH)] = { |
439 | + [C(RESULT_ACCESS)] = 0, |
440 | + [C(RESULT_MISS)] = 0, |
441 | + }, |
442 | +}, |
443 | +[C(ITLB)] = { |
444 | + [C(OP_READ)] = { |
445 | + [C(RESULT_ACCESS)] = 0x0084, /* L1 ITLB misses, L2 ITLB hits */ |
446 | + [C(RESULT_MISS)] = 0xff85, /* L1 ITLB misses, L2 misses */ |
447 | + }, |
448 | + [C(OP_WRITE)] = { |
449 | + [C(RESULT_ACCESS)] = -1, |
450 | + [C(RESULT_MISS)] = -1, |
451 | + }, |
452 | + [C(OP_PREFETCH)] = { |
453 | + [C(RESULT_ACCESS)] = -1, |
454 | + [C(RESULT_MISS)] = -1, |
455 | + }, |
456 | +}, |
457 | +[C(BPU)] = { |
458 | + [C(OP_READ)] = { |
459 | + [C(RESULT_ACCESS)] = 0x00c2, /* Retired Branch Instr. */ |
460 | + [C(RESULT_MISS)] = 0x00c3, /* Retired Mispredicted BI */ |
461 | + }, |
462 | + [C(OP_WRITE)] = { |
463 | + [C(RESULT_ACCESS)] = -1, |
464 | + [C(RESULT_MISS)] = -1, |
465 | + }, |
466 | + [C(OP_PREFETCH)] = { |
467 | + [C(RESULT_ACCESS)] = -1, |
468 | + [C(RESULT_MISS)] = -1, |
469 | + }, |
470 | +}, |
471 | +[C(NODE)] = { |
472 | + [C(OP_READ)] = { |
473 | + [C(RESULT_ACCESS)] = 0, |
474 | + [C(RESULT_MISS)] = 0, |
475 | + }, |
476 | + [C(OP_WRITE)] = { |
477 | + [C(RESULT_ACCESS)] = -1, |
478 | + [C(RESULT_MISS)] = -1, |
479 | + }, |
480 | + [C(OP_PREFETCH)] = { |
481 | + [C(RESULT_ACCESS)] = -1, |
482 | + [C(RESULT_MISS)] = -1, |
483 | + }, |
484 | +}, |
485 | +}; |
486 | + |
487 | /* |
488 | * AMD Performance Monitor K7 and later, up to and including Family 16h: |
489 | */ |
490 | @@ -731,9 +835,10 @@ __init int amd_pmu_init(void) |
491 | x86_pmu.amd_nb_constraints = 0; |
492 | } |
493 | |
494 | - /* Events are common for all AMDs */ |
495 | - memcpy(hw_cache_event_ids, amd_hw_cache_event_ids, |
496 | - sizeof(hw_cache_event_ids)); |
497 | + if (boot_cpu_data.x86 >= 0x17) |
498 | + memcpy(hw_cache_event_ids, amd_hw_cache_event_ids_f17h, sizeof(hw_cache_event_ids)); |
499 | + else |
500 | + memcpy(hw_cache_event_ids, amd_hw_cache_event_ids, sizeof(hw_cache_event_ids)); |
501 | |
502 | return 0; |
503 | } |
504 | diff --git a/arch/x86/include/asm/stacktrace.h b/arch/x86/include/asm/stacktrace.h |
505 | index 37f2e0b377ad..4141ead86879 100644 |
506 | --- a/arch/x86/include/asm/stacktrace.h |
507 | +++ b/arch/x86/include/asm/stacktrace.h |
508 | @@ -55,13 +55,16 @@ extern int kstack_depth_to_print; |
509 | static inline unsigned long * |
510 | get_frame_pointer(struct task_struct *task, struct pt_regs *regs) |
511 | { |
512 | + struct inactive_task_frame *frame; |
513 | + |
514 | if (regs) |
515 | return (unsigned long *)regs->bp; |
516 | |
517 | if (task == current) |
518 | return __builtin_frame_address(0); |
519 | |
520 | - return (unsigned long *)((struct inactive_task_frame *)task->thread.sp)->bp; |
521 | + frame = (struct inactive_task_frame *)task->thread.sp; |
522 | + return (unsigned long *)READ_ONCE_NOCHECK(frame->bp); |
523 | } |
524 | #else |
525 | static inline unsigned long * |
526 | diff --git a/arch/x86/kernel/acpi/wakeup_64.S b/arch/x86/kernel/acpi/wakeup_64.S |
527 | index 169963f471bb..50b8ed0317a3 100644 |
528 | --- a/arch/x86/kernel/acpi/wakeup_64.S |
529 | +++ b/arch/x86/kernel/acpi/wakeup_64.S |
530 | @@ -109,6 +109,15 @@ ENTRY(do_suspend_lowlevel) |
531 | movq pt_regs_r14(%rax), %r14 |
532 | movq pt_regs_r15(%rax), %r15 |
533 | |
534 | +#ifdef CONFIG_KASAN |
535 | + /* |
536 | + * The suspend path may have poisoned some areas deeper in the stack, |
537 | + * which we now need to unpoison. |
538 | + */ |
539 | + movq %rsp, %rdi |
540 | + call kasan_unpoison_task_stack_below |
541 | +#endif |
542 | + |
543 | xorl %eax, %eax |
544 | addq $8, %rsp |
545 | FRAME_END |
546 | diff --git a/arch/x86/kernel/cpu/mcheck/mce-severity.c b/arch/x86/kernel/cpu/mcheck/mce-severity.c |
547 | index 3e0199ee5a2f..0372913e0134 100644 |
548 | --- a/arch/x86/kernel/cpu/mcheck/mce-severity.c |
549 | +++ b/arch/x86/kernel/cpu/mcheck/mce-severity.c |
550 | @@ -148,6 +148,11 @@ static struct severity { |
551 | SER, MASK(MCI_STATUS_OVER|MCI_UC_SAR|MCI_ADDR|MCACOD, MCI_UC_SAR|MCI_ADDR|MCACOD_DATA), |
552 | KERNEL |
553 | ), |
554 | + MCESEV( |
555 | + PANIC, "Instruction fetch error in kernel", |
556 | + SER, MASK(MCI_STATUS_OVER|MCI_UC_SAR|MCI_ADDR|MCACOD, MCI_UC_SAR|MCI_ADDR|MCACOD_INSTR), |
557 | + KERNEL |
558 | + ), |
559 | #endif |
560 | MCESEV( |
561 | PANIC, "Action required: unknown MCACOD", |
562 | diff --git a/arch/x86/kernel/unwind_frame.c b/arch/x86/kernel/unwind_frame.c |
563 | index a2456d4d286a..9b8b3cb2e934 100644 |
564 | --- a/arch/x86/kernel/unwind_frame.c |
565 | +++ b/arch/x86/kernel/unwind_frame.c |
566 | @@ -6,6 +6,21 @@ |
567 | |
568 | #define FRAME_HEADER_SIZE (sizeof(long) * 2) |
569 | |
570 | +/* |
571 | + * This disables KASAN checking when reading a value from another task's stack, |
572 | + * since the other task could be running on another CPU and could have poisoned |
573 | + * the stack in the meantime. |
574 | + */ |
575 | +#define READ_ONCE_TASK_STACK(task, x) \ |
576 | +({ \ |
577 | + unsigned long val; \ |
578 | + if (task == current) \ |
579 | + val = READ_ONCE(x); \ |
580 | + else \ |
581 | + val = READ_ONCE_NOCHECK(x); \ |
582 | + val; \ |
583 | +}) |
584 | + |
585 | unsigned long unwind_get_return_address(struct unwind_state *state) |
586 | { |
587 | unsigned long addr; |
588 | @@ -14,7 +29,8 @@ unsigned long unwind_get_return_address(struct unwind_state *state) |
589 | if (unwind_done(state)) |
590 | return 0; |
591 | |
592 | - addr = ftrace_graph_ret_addr(state->task, &state->graph_idx, *addr_p, |
593 | + addr = READ_ONCE_TASK_STACK(state->task, *addr_p); |
594 | + addr = ftrace_graph_ret_addr(state->task, &state->graph_idx, addr, |
595 | addr_p); |
596 | |
597 | return __kernel_text_address(addr) ? addr : 0; |
598 | @@ -48,7 +64,7 @@ bool unwind_next_frame(struct unwind_state *state) |
599 | if (unwind_done(state)) |
600 | return false; |
601 | |
602 | - next_bp = (unsigned long *)*state->bp; |
603 | + next_bp = (unsigned long *)READ_ONCE_TASK_STACK(state->task,*state->bp); |
604 | |
605 | /* make sure the next frame's data is accessible */ |
606 | if (!update_stack_state(state, next_bp, FRAME_HEADER_SIZE)) |
607 | diff --git a/drivers/block/xsysace.c b/drivers/block/xsysace.c |
608 | index c4328d9d9981..f838119d12b2 100644 |
609 | --- a/drivers/block/xsysace.c |
610 | +++ b/drivers/block/xsysace.c |
611 | @@ -1062,6 +1062,8 @@ static int ace_setup(struct ace_device *ace) |
612 | return 0; |
613 | |
614 | err_read: |
615 | + /* prevent double queue cleanup */ |
616 | + ace->gd->queue = NULL; |
617 | put_disk(ace->gd); |
618 | err_alloc_disk: |
619 | blk_cleanup_queue(ace->queue); |
620 | diff --git a/drivers/hid/hid-debug.c b/drivers/hid/hid-debug.c |
621 | index d7179dd3c9ef..3cafa1d28fed 100644 |
622 | --- a/drivers/hid/hid-debug.c |
623 | +++ b/drivers/hid/hid-debug.c |
624 | @@ -1058,10 +1058,15 @@ static int hid_debug_rdesc_show(struct seq_file *f, void *p) |
625 | seq_printf(f, "\n\n"); |
626 | |
627 | /* dump parsed data and input mappings */ |
628 | + if (down_interruptible(&hdev->driver_input_lock)) |
629 | + return 0; |
630 | + |
631 | hid_dump_device(hdev, f); |
632 | seq_printf(f, "\n"); |
633 | hid_dump_input_mapping(hdev, f); |
634 | |
635 | + up(&hdev->driver_input_lock); |
636 | + |
637 | return 0; |
638 | } |
639 | |
640 | diff --git a/drivers/hid/hid-logitech-hidpp.c b/drivers/hid/hid-logitech-hidpp.c |
641 | index 2e2515a4c070..3198faf5cff4 100644 |
642 | --- a/drivers/hid/hid-logitech-hidpp.c |
643 | +++ b/drivers/hid/hid-logitech-hidpp.c |
644 | @@ -1282,6 +1282,13 @@ static int hidpp_ff_init(struct hidpp_device *hidpp, u8 feature_index) |
645 | kfree(data); |
646 | return -ENOMEM; |
647 | } |
648 | + data->wq = create_singlethread_workqueue("hidpp-ff-sendqueue"); |
649 | + if (!data->wq) { |
650 | + kfree(data->effect_ids); |
651 | + kfree(data); |
652 | + return -ENOMEM; |
653 | + } |
654 | + |
655 | data->hidpp = hidpp; |
656 | data->feature_index = feature_index; |
657 | data->version = version; |
658 | @@ -1326,7 +1333,6 @@ static int hidpp_ff_init(struct hidpp_device *hidpp, u8 feature_index) |
659 | /* ignore boost value at response.fap.params[2] */ |
660 | |
661 | /* init the hardware command queue */ |
662 | - data->wq = create_singlethread_workqueue("hidpp-ff-sendqueue"); |
663 | atomic_set(&data->workqueue_size, 0); |
664 | |
665 | /* initialize with zero autocenter to get wheel in usable state */ |
666 | diff --git a/drivers/infiniband/ulp/srpt/ib_srpt.c b/drivers/infiniband/ulp/srpt/ib_srpt.c |
667 | index 2a44a2c3e859..6914cc18b4a1 100644 |
668 | --- a/drivers/infiniband/ulp/srpt/ib_srpt.c |
669 | +++ b/drivers/infiniband/ulp/srpt/ib_srpt.c |
670 | @@ -2368,8 +2368,19 @@ static void srpt_queue_tm_rsp(struct se_cmd *cmd) |
671 | srpt_queue_response(cmd); |
672 | } |
673 | |
674 | +/* |
675 | + * This function is called for aborted commands if no response is sent to the |
676 | + * initiator. Make sure that the credits freed by aborting a command are |
677 | + * returned to the initiator the next time a response is sent by incrementing |
678 | + * ch->req_lim_delta. |
679 | + */ |
680 | static void srpt_aborted_task(struct se_cmd *cmd) |
681 | { |
682 | + struct srpt_send_ioctx *ioctx = container_of(cmd, |
683 | + struct srpt_send_ioctx, cmd); |
684 | + struct srpt_rdma_ch *ch = ioctx->ch; |
685 | + |
686 | + atomic_inc(&ch->req_lim_delta); |
687 | } |
688 | |
689 | static int srpt_queue_status(struct se_cmd *cmd) |
690 | diff --git a/drivers/input/keyboard/snvs_pwrkey.c b/drivers/input/keyboard/snvs_pwrkey.c |
691 | index 7544888c4749..b8dbde746b4e 100644 |
692 | --- a/drivers/input/keyboard/snvs_pwrkey.c |
693 | +++ b/drivers/input/keyboard/snvs_pwrkey.c |
694 | @@ -156,6 +156,9 @@ static int imx_snvs_pwrkey_probe(struct platform_device *pdev) |
695 | return error; |
696 | } |
697 | |
698 | + pdata->input = input; |
699 | + platform_set_drvdata(pdev, pdata); |
700 | + |
701 | error = devm_request_irq(&pdev->dev, pdata->irq, |
702 | imx_snvs_pwrkey_interrupt, |
703 | 0, pdev->name, pdev); |
704 | @@ -171,9 +174,6 @@ static int imx_snvs_pwrkey_probe(struct platform_device *pdev) |
705 | return error; |
706 | } |
707 | |
708 | - pdata->input = input; |
709 | - platform_set_drvdata(pdev, pdata); |
710 | - |
711 | device_init_wakeup(&pdev->dev, pdata->wakeup); |
712 | |
713 | return 0; |
714 | diff --git a/drivers/media/i2c/ov7670.c b/drivers/media/i2c/ov7670.c |
715 | index 56cfb5ca9c95..0a72228734ae 100644 |
716 | --- a/drivers/media/i2c/ov7670.c |
717 | +++ b/drivers/media/i2c/ov7670.c |
718 | @@ -155,10 +155,10 @@ MODULE_PARM_DESC(debug, "Debug level (0-1)"); |
719 | #define REG_GFIX 0x69 /* Fix gain control */ |
720 | |
721 | #define REG_DBLV 0x6b /* PLL control an debugging */ |
722 | -#define DBLV_BYPASS 0x00 /* Bypass PLL */ |
723 | -#define DBLV_X4 0x01 /* clock x4 */ |
724 | -#define DBLV_X6 0x10 /* clock x6 */ |
725 | -#define DBLV_X8 0x11 /* clock x8 */ |
726 | +#define DBLV_BYPASS 0x0a /* Bypass PLL */ |
727 | +#define DBLV_X4 0x4a /* clock x4 */ |
728 | +#define DBLV_X6 0x8a /* clock x6 */ |
729 | +#define DBLV_X8 0xca /* clock x8 */ |
730 | |
731 | #define REG_REG76 0x76 /* OV's name */ |
732 | #define R76_BLKPCOR 0x80 /* Black pixel correction enable */ |
733 | @@ -833,7 +833,7 @@ static int ov7675_set_framerate(struct v4l2_subdev *sd, |
734 | if (ret < 0) |
735 | return ret; |
736 | |
737 | - return ov7670_write(sd, REG_DBLV, DBLV_X4); |
738 | + return 0; |
739 | } |
740 | |
741 | static void ov7670_get_framerate_legacy(struct v4l2_subdev *sd, |
742 | @@ -1578,11 +1578,7 @@ static int ov7670_probe(struct i2c_client *client, |
743 | if (config->clock_speed) |
744 | info->clock_speed = config->clock_speed; |
745 | |
746 | - /* |
747 | - * It should be allowed for ov7670 too when it is migrated to |
748 | - * the new frame rate formula. |
749 | - */ |
750 | - if (config->pll_bypass && id->driver_data != MODEL_OV7670) |
751 | + if (config->pll_bypass) |
752 | info->pll_bypass = true; |
753 | |
754 | if (config->pclk_hb_disable) |
755 | diff --git a/drivers/net/bonding/bond_sysfs_slave.c b/drivers/net/bonding/bond_sysfs_slave.c |
756 | index 7d16c51e6913..641a532b67cb 100644 |
757 | --- a/drivers/net/bonding/bond_sysfs_slave.c |
758 | +++ b/drivers/net/bonding/bond_sysfs_slave.c |
759 | @@ -55,7 +55,9 @@ static SLAVE_ATTR_RO(link_failure_count); |
760 | |
761 | static ssize_t perm_hwaddr_show(struct slave *slave, char *buf) |
762 | { |
763 | - return sprintf(buf, "%pM\n", slave->perm_hwaddr); |
764 | + return sprintf(buf, "%*phC\n", |
765 | + slave->dev->addr_len, |
766 | + slave->perm_hwaddr); |
767 | } |
768 | static SLAVE_ATTR_RO(perm_hwaddr); |
769 | |
770 | diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c |
771 | index 45ea2718c65d..620a470eb4c8 100644 |
772 | --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c |
773 | +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c |
774 | @@ -5954,8 +5954,15 @@ static int bnxt_cfg_rx_mode(struct bnxt *bp) |
775 | |
776 | skip_uc: |
777 | rc = bnxt_hwrm_cfa_l2_set_rx_mask(bp, 0); |
778 | + if (rc && vnic->mc_list_count) { |
779 | + netdev_info(bp->dev, "Failed setting MC filters rc: %d, turning on ALL_MCAST mode\n", |
780 | + rc); |
781 | + vnic->rx_mask |= CFA_L2_SET_RX_MASK_REQ_MASK_ALL_MCAST; |
782 | + vnic->mc_list_count = 0; |
783 | + rc = bnxt_hwrm_cfa_l2_set_rx_mask(bp, 0); |
784 | + } |
785 | if (rc) |
786 | - netdev_err(bp->dev, "HWRM cfa l2 rx mask failure rc: %x\n", |
787 | + netdev_err(bp->dev, "HWRM cfa l2 rx mask failure rc: %d\n", |
788 | rc); |
789 | |
790 | return rc; |
791 | diff --git a/drivers/net/ethernet/hisilicon/hns/hnae.c b/drivers/net/ethernet/hisilicon/hns/hnae.c |
792 | index 06bc8638501e..66e7a5fd4249 100644 |
793 | --- a/drivers/net/ethernet/hisilicon/hns/hnae.c |
794 | +++ b/drivers/net/ethernet/hisilicon/hns/hnae.c |
795 | @@ -146,7 +146,6 @@ out_buffer_fail: |
796 | /* free desc along with its attached buffer */ |
797 | static void hnae_free_desc(struct hnae_ring *ring) |
798 | { |
799 | - hnae_free_buffers(ring); |
800 | dma_unmap_single(ring_to_dev(ring), ring->desc_dma_addr, |
801 | ring->desc_num * sizeof(ring->desc[0]), |
802 | ring_to_dma_dir(ring)); |
803 | @@ -179,6 +178,9 @@ static int hnae_alloc_desc(struct hnae_ring *ring) |
804 | /* fini ring, also free the buffer for the ring */ |
805 | static void hnae_fini_ring(struct hnae_ring *ring) |
806 | { |
807 | + if (is_rx_ring(ring)) |
808 | + hnae_free_buffers(ring); |
809 | + |
810 | hnae_free_desc(ring); |
811 | kfree(ring->desc_cb); |
812 | ring->desc_cb = NULL; |
813 | diff --git a/drivers/net/ethernet/hisilicon/hns/hns_enet.c b/drivers/net/ethernet/hisilicon/hns/hns_enet.c |
814 | index ad8681cf5ef0..24a815997ec5 100644 |
815 | --- a/drivers/net/ethernet/hisilicon/hns/hns_enet.c |
816 | +++ b/drivers/net/ethernet/hisilicon/hns/hns_enet.c |
817 | @@ -28,9 +28,6 @@ |
818 | |
819 | #define SERVICE_TIMER_HZ (1 * HZ) |
820 | |
821 | -#define NIC_TX_CLEAN_MAX_NUM 256 |
822 | -#define NIC_RX_CLEAN_MAX_NUM 64 |
823 | - |
824 | #define RCB_IRQ_NOT_INITED 0 |
825 | #define RCB_IRQ_INITED 1 |
826 | #define HNS_BUFFER_SIZE_2048 2048 |
827 | @@ -375,8 +372,6 @@ netdev_tx_t hns_nic_net_xmit_hw(struct net_device *ndev, |
828 | wmb(); /* commit all data before submit */ |
829 | assert(skb->queue_mapping < priv->ae_handle->q_num); |
830 | hnae_queue_xmit(priv->ae_handle->qs[skb->queue_mapping], buf_num); |
831 | - ring->stats.tx_pkts++; |
832 | - ring->stats.tx_bytes += skb->len; |
833 | |
834 | return NETDEV_TX_OK; |
835 | |
836 | @@ -916,6 +911,9 @@ static int hns_nic_tx_poll_one(struct hns_nic_ring_data *ring_data, |
837 | /* issue prefetch for next Tx descriptor */ |
838 | prefetch(&ring->desc_cb[ring->next_to_clean]); |
839 | } |
840 | + /* update tx ring statistics. */ |
841 | + ring->stats.tx_pkts += pkts; |
842 | + ring->stats.tx_bytes += bytes; |
843 | |
844 | NETIF_TX_UNLOCK(ndev); |
845 | |
846 | @@ -1821,7 +1819,7 @@ static int hns_nic_init_ring_data(struct hns_nic_priv *priv) |
847 | hns_nic_tx_fini_pro_v2; |
848 | |
849 | netif_napi_add(priv->netdev, &rd->napi, |
850 | - hns_nic_common_poll, NIC_TX_CLEAN_MAX_NUM); |
851 | + hns_nic_common_poll, NAPI_POLL_WEIGHT); |
852 | rd->ring->irq_init_flag = RCB_IRQ_NOT_INITED; |
853 | } |
854 | for (i = h->q_num; i < h->q_num * 2; i++) { |
855 | @@ -1834,7 +1832,7 @@ static int hns_nic_init_ring_data(struct hns_nic_priv *priv) |
856 | hns_nic_rx_fini_pro_v2; |
857 | |
858 | netif_napi_add(priv->netdev, &rd->napi, |
859 | - hns_nic_common_poll, NIC_RX_CLEAN_MAX_NUM); |
860 | + hns_nic_common_poll, NAPI_POLL_WEIGHT); |
861 | rd->ring->irq_init_flag = RCB_IRQ_NOT_INITED; |
862 | } |
863 | |
864 | diff --git a/drivers/net/ethernet/intel/igb/e1000_defines.h b/drivers/net/ethernet/intel/igb/e1000_defines.h |
865 | index 2688180a7acd..f948eec7b35f 100644 |
866 | --- a/drivers/net/ethernet/intel/igb/e1000_defines.h |
867 | +++ b/drivers/net/ethernet/intel/igb/e1000_defines.h |
868 | @@ -193,6 +193,8 @@ |
869 | /* enable link status from external LINK_0 and LINK_1 pins */ |
870 | #define E1000_CTRL_SWDPIN0 0x00040000 /* SWDPIN 0 value */ |
871 | #define E1000_CTRL_SWDPIN1 0x00080000 /* SWDPIN 1 value */ |
872 | +#define E1000_CTRL_ADVD3WUC 0x00100000 /* D3 WUC */ |
873 | +#define E1000_CTRL_EN_PHY_PWR_MGMT 0x00200000 /* PHY PM enable */ |
874 | #define E1000_CTRL_SDP0_DIR 0x00400000 /* SDP0 Data direction */ |
875 | #define E1000_CTRL_SDP1_DIR 0x00800000 /* SDP1 Data direction */ |
876 | #define E1000_CTRL_RST 0x04000000 /* Global reset */ |
877 | diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c |
878 | index 82e48e355fb9..7956176c2c73 100644 |
879 | --- a/drivers/net/ethernet/intel/igb/igb_main.c |
880 | +++ b/drivers/net/ethernet/intel/igb/igb_main.c |
881 | @@ -7548,9 +7548,7 @@ static int __igb_shutdown(struct pci_dev *pdev, bool *enable_wake, |
882 | struct e1000_hw *hw = &adapter->hw; |
883 | u32 ctrl, rctl, status; |
884 | u32 wufc = runtime ? E1000_WUFC_LNKC : adapter->wol; |
885 | -#ifdef CONFIG_PM |
886 | - int retval = 0; |
887 | -#endif |
888 | + bool wake; |
889 | |
890 | rtnl_lock(); |
891 | netif_device_detach(netdev); |
892 | @@ -7563,14 +7561,6 @@ static int __igb_shutdown(struct pci_dev *pdev, bool *enable_wake, |
893 | igb_clear_interrupt_scheme(adapter); |
894 | rtnl_unlock(); |
895 | |
896 | -#ifdef CONFIG_PM |
897 | - if (!runtime) { |
898 | - retval = pci_save_state(pdev); |
899 | - if (retval) |
900 | - return retval; |
901 | - } |
902 | -#endif |
903 | - |
904 | status = rd32(E1000_STATUS); |
905 | if (status & E1000_STATUS_LU) |
906 | wufc &= ~E1000_WUFC_LNKC; |
907 | @@ -7587,10 +7577,6 @@ static int __igb_shutdown(struct pci_dev *pdev, bool *enable_wake, |
908 | } |
909 | |
910 | ctrl = rd32(E1000_CTRL); |
911 | - /* advertise wake from D3Cold */ |
912 | - #define E1000_CTRL_ADVD3WUC 0x00100000 |
913 | - /* phy power management enable */ |
914 | - #define E1000_CTRL_EN_PHY_PWR_MGMT 0x00200000 |
915 | ctrl |= E1000_CTRL_ADVD3WUC; |
916 | wr32(E1000_CTRL, ctrl); |
917 | |
918 | @@ -7604,12 +7590,15 @@ static int __igb_shutdown(struct pci_dev *pdev, bool *enable_wake, |
919 | wr32(E1000_WUFC, 0); |
920 | } |
921 | |
922 | - *enable_wake = wufc || adapter->en_mng_pt; |
923 | - if (!*enable_wake) |
924 | + wake = wufc || adapter->en_mng_pt; |
925 | + if (!wake) |
926 | igb_power_down_link(adapter); |
927 | else |
928 | igb_power_up_link(adapter); |
929 | |
930 | + if (enable_wake) |
931 | + *enable_wake = wake; |
932 | + |
933 | /* Release control of h/w to f/w. If f/w is AMT enabled, this |
934 | * would have already happened in close and is redundant. |
935 | */ |
936 | @@ -7624,22 +7613,7 @@ static int __igb_shutdown(struct pci_dev *pdev, bool *enable_wake, |
937 | #ifdef CONFIG_PM_SLEEP |
938 | static int igb_suspend(struct device *dev) |
939 | { |
940 | - int retval; |
941 | - bool wake; |
942 | - struct pci_dev *pdev = to_pci_dev(dev); |
943 | - |
944 | - retval = __igb_shutdown(pdev, &wake, 0); |
945 | - if (retval) |
946 | - return retval; |
947 | - |
948 | - if (wake) { |
949 | - pci_prepare_to_sleep(pdev); |
950 | - } else { |
951 | - pci_wake_from_d3(pdev, false); |
952 | - pci_set_power_state(pdev, PCI_D3hot); |
953 | - } |
954 | - |
955 | - return 0; |
956 | + return __igb_shutdown(to_pci_dev(dev), NULL, 0); |
957 | } |
958 | #endif /* CONFIG_PM_SLEEP */ |
959 | |
960 | @@ -7707,22 +7681,7 @@ static int igb_runtime_idle(struct device *dev) |
961 | |
962 | static int igb_runtime_suspend(struct device *dev) |
963 | { |
964 | - struct pci_dev *pdev = to_pci_dev(dev); |
965 | - int retval; |
966 | - bool wake; |
967 | - |
968 | - retval = __igb_shutdown(pdev, &wake, 1); |
969 | - if (retval) |
970 | - return retval; |
971 | - |
972 | - if (wake) { |
973 | - pci_prepare_to_sleep(pdev); |
974 | - } else { |
975 | - pci_wake_from_d3(pdev, false); |
976 | - pci_set_power_state(pdev, PCI_D3hot); |
977 | - } |
978 | - |
979 | - return 0; |
980 | + return __igb_shutdown(to_pci_dev(dev), NULL, 1); |
981 | } |
982 | |
983 | static int igb_runtime_resume(struct device *dev) |
984 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c |
985 | index da9246f6c31e..d1a3a35ba87b 100644 |
986 | --- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c |
987 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c |
988 | @@ -92,8 +92,7 @@ static int arm_vport_context_events_cmd(struct mlx5_core_dev *dev, u16 vport, |
989 | opcode, MLX5_CMD_OP_MODIFY_NIC_VPORT_CONTEXT); |
990 | MLX5_SET(modify_nic_vport_context_in, in, field_select.change_event, 1); |
991 | MLX5_SET(modify_nic_vport_context_in, in, vport_number, vport); |
992 | - if (vport) |
993 | - MLX5_SET(modify_nic_vport_context_in, in, other_vport, 1); |
994 | + MLX5_SET(modify_nic_vport_context_in, in, other_vport, 1); |
995 | nic_vport_ctx = MLX5_ADDR_OF(modify_nic_vport_context_in, |
996 | in, nic_vport_context); |
997 | |
998 | @@ -121,8 +120,7 @@ static int modify_esw_vport_context_cmd(struct mlx5_core_dev *dev, u16 vport, |
999 | MLX5_SET(modify_esw_vport_context_in, in, opcode, |
1000 | MLX5_CMD_OP_MODIFY_ESW_VPORT_CONTEXT); |
1001 | MLX5_SET(modify_esw_vport_context_in, in, vport_number, vport); |
1002 | - if (vport) |
1003 | - MLX5_SET(modify_esw_vport_context_in, in, other_vport, 1); |
1004 | + MLX5_SET(modify_esw_vport_context_in, in, other_vport, 1); |
1005 | return mlx5_cmd_exec(dev, in, inlen, out, sizeof(out)); |
1006 | } |
1007 | |
1008 | diff --git a/drivers/net/ethernet/stmicro/stmmac/enh_desc.c b/drivers/net/ethernet/stmicro/stmmac/enh_desc.c |
1009 | index ce97e522566a..77dc5842bd0b 100644 |
1010 | --- a/drivers/net/ethernet/stmicro/stmmac/enh_desc.c |
1011 | +++ b/drivers/net/ethernet/stmicro/stmmac/enh_desc.c |
1012 | @@ -205,6 +205,11 @@ static int enh_desc_get_rx_status(void *data, struct stmmac_extra_stats *x, |
1013 | if (unlikely(rdes0 & RDES0_OWN)) |
1014 | return dma_own; |
1015 | |
1016 | + if (unlikely(!(rdes0 & RDES0_LAST_DESCRIPTOR))) { |
1017 | + stats->rx_length_errors++; |
1018 | + return discard_frame; |
1019 | + } |
1020 | + |
1021 | if (unlikely(rdes0 & RDES0_ERROR_SUMMARY)) { |
1022 | if (unlikely(rdes0 & RDES0_DESCRIPTOR_ERROR)) { |
1023 | x->rx_desc++; |
1024 | @@ -235,9 +240,10 @@ static int enh_desc_get_rx_status(void *data, struct stmmac_extra_stats *x, |
1025 | * It doesn't match with the information reported into the databook. |
1026 | * At any rate, we need to understand if the CSUM hw computation is ok |
1027 | * and report this info to the upper layers. */ |
1028 | - ret = enh_desc_coe_rdes0(!!(rdes0 & RDES0_IPC_CSUM_ERROR), |
1029 | - !!(rdes0 & RDES0_FRAME_TYPE), |
1030 | - !!(rdes0 & ERDES0_RX_MAC_ADDR)); |
1031 | + if (likely(ret == good_frame)) |
1032 | + ret = enh_desc_coe_rdes0(!!(rdes0 & RDES0_IPC_CSUM_ERROR), |
1033 | + !!(rdes0 & RDES0_FRAME_TYPE), |
1034 | + !!(rdes0 & ERDES0_RX_MAC_ADDR)); |
1035 | |
1036 | if (unlikely(rdes0 & RDES0_DRIBBLING)) |
1037 | x->dribbling_bit++; |
1038 | diff --git a/drivers/net/ethernet/stmicro/stmmac/norm_desc.c b/drivers/net/ethernet/stmicro/stmmac/norm_desc.c |
1039 | index fd78406e2e9a..01f8f2e94c0f 100644 |
1040 | --- a/drivers/net/ethernet/stmicro/stmmac/norm_desc.c |
1041 | +++ b/drivers/net/ethernet/stmicro/stmmac/norm_desc.c |
1042 | @@ -95,8 +95,6 @@ static int ndesc_get_rx_status(void *data, struct stmmac_extra_stats *x, |
1043 | return dma_own; |
1044 | |
1045 | if (unlikely(!(rdes0 & RDES0_LAST_DESCRIPTOR))) { |
1046 | - pr_warn("%s: Oversized frame spanned multiple buffers\n", |
1047 | - __func__); |
1048 | stats->rx_length_errors++; |
1049 | return discard_frame; |
1050 | } |
1051 | diff --git a/drivers/net/phy/marvell.c b/drivers/net/phy/marvell.c |
1052 | index 520352327104..77357b07f6c9 100644 |
1053 | --- a/drivers/net/phy/marvell.c |
1054 | +++ b/drivers/net/phy/marvell.c |
1055 | @@ -1429,9 +1429,10 @@ static int marvell_get_sset_count(struct phy_device *phydev) |
1056 | |
1057 | static void marvell_get_strings(struct phy_device *phydev, u8 *data) |
1058 | { |
1059 | + int count = marvell_get_sset_count(phydev); |
1060 | int i; |
1061 | |
1062 | - for (i = 0; i < ARRAY_SIZE(marvell_hw_stats); i++) { |
1063 | + for (i = 0; i < count; i++) { |
1064 | memcpy(data + i * ETH_GSTRING_LEN, |
1065 | marvell_hw_stats[i].string, ETH_GSTRING_LEN); |
1066 | } |
1067 | @@ -1470,9 +1471,10 @@ static u64 marvell_get_stat(struct phy_device *phydev, int i) |
1068 | static void marvell_get_stats(struct phy_device *phydev, |
1069 | struct ethtool_stats *stats, u64 *data) |
1070 | { |
1071 | + int count = marvell_get_sset_count(phydev); |
1072 | int i; |
1073 | |
1074 | - for (i = 0; i < ARRAY_SIZE(marvell_hw_stats); i++) |
1075 | + for (i = 0; i < count; i++) |
1076 | data[i] = marvell_get_stat(phydev, i); |
1077 | } |
1078 | |
1079 | diff --git a/drivers/nvme/target/core.c b/drivers/nvme/target/core.c |
1080 | index f12753eb3216..96ea6c76be6e 100644 |
1081 | --- a/drivers/nvme/target/core.c |
1082 | +++ b/drivers/nvme/target/core.c |
1083 | @@ -709,6 +709,15 @@ bool nvmet_host_allowed(struct nvmet_req *req, struct nvmet_subsys *subsys, |
1084 | return __nvmet_host_allowed(subsys, hostnqn); |
1085 | } |
1086 | |
1087 | +static void nvmet_fatal_error_handler(struct work_struct *work) |
1088 | +{ |
1089 | + struct nvmet_ctrl *ctrl = |
1090 | + container_of(work, struct nvmet_ctrl, fatal_err_work); |
1091 | + |
1092 | + pr_err("ctrl %d fatal error occurred!\n", ctrl->cntlid); |
1093 | + ctrl->ops->delete_ctrl(ctrl); |
1094 | +} |
1095 | + |
1096 | u16 nvmet_alloc_ctrl(const char *subsysnqn, const char *hostnqn, |
1097 | struct nvmet_req *req, u32 kato, struct nvmet_ctrl **ctrlp) |
1098 | { |
1099 | @@ -747,6 +756,7 @@ u16 nvmet_alloc_ctrl(const char *subsysnqn, const char *hostnqn, |
1100 | |
1101 | INIT_WORK(&ctrl->async_event_work, nvmet_async_event_work); |
1102 | INIT_LIST_HEAD(&ctrl->async_events); |
1103 | + INIT_WORK(&ctrl->fatal_err_work, nvmet_fatal_error_handler); |
1104 | |
1105 | memcpy(ctrl->subsysnqn, subsysnqn, NVMF_NQN_SIZE); |
1106 | memcpy(ctrl->hostnqn, hostnqn, NVMF_NQN_SIZE); |
1107 | @@ -849,21 +859,11 @@ void nvmet_ctrl_put(struct nvmet_ctrl *ctrl) |
1108 | kref_put(&ctrl->ref, nvmet_ctrl_free); |
1109 | } |
1110 | |
1111 | -static void nvmet_fatal_error_handler(struct work_struct *work) |
1112 | -{ |
1113 | - struct nvmet_ctrl *ctrl = |
1114 | - container_of(work, struct nvmet_ctrl, fatal_err_work); |
1115 | - |
1116 | - pr_err("ctrl %d fatal error occurred!\n", ctrl->cntlid); |
1117 | - ctrl->ops->delete_ctrl(ctrl); |
1118 | -} |
1119 | - |
1120 | void nvmet_ctrl_fatal_error(struct nvmet_ctrl *ctrl) |
1121 | { |
1122 | mutex_lock(&ctrl->lock); |
1123 | if (!(ctrl->csts & NVME_CSTS_CFS)) { |
1124 | ctrl->csts |= NVME_CSTS_CFS; |
1125 | - INIT_WORK(&ctrl->fatal_err_work, nvmet_fatal_error_handler); |
1126 | schedule_work(&ctrl->fatal_err_work); |
1127 | } |
1128 | mutex_unlock(&ctrl->lock); |
1129 | diff --git a/drivers/rtc/rtc-da9063.c b/drivers/rtc/rtc-da9063.c |
1130 | index f85cae240f12..7e92e491c2e7 100644 |
1131 | --- a/drivers/rtc/rtc-da9063.c |
1132 | +++ b/drivers/rtc/rtc-da9063.c |
1133 | @@ -480,6 +480,13 @@ static int da9063_rtc_probe(struct platform_device *pdev) |
1134 | da9063_data_to_tm(data, &rtc->alarm_time, rtc); |
1135 | rtc->rtc_sync = false; |
1136 | |
1137 | + /* |
1138 | + * TODO: some models have alarms on a minute boundary but still support |
1139 | + * real hardware interrupts. Add this once the core supports it. |
1140 | + */ |
1141 | + if (config->rtc_data_start != RTC_SEC) |
1142 | + rtc->rtc_dev->uie_unsupported = 1; |
1143 | + |
1144 | irq_alarm = platform_get_irq_byname(pdev, "ALARM"); |
1145 | ret = devm_request_threaded_irq(&pdev->dev, irq_alarm, NULL, |
1146 | da9063_alarm_event, |
1147 | diff --git a/drivers/rtc/rtc-sh.c b/drivers/rtc/rtc-sh.c |
1148 | index 17b6235d67a5..600fb7f93939 100644 |
1149 | --- a/drivers/rtc/rtc-sh.c |
1150 | +++ b/drivers/rtc/rtc-sh.c |
1151 | @@ -454,7 +454,7 @@ static int sh_rtc_set_time(struct device *dev, struct rtc_time *tm) |
1152 | static inline int sh_rtc_read_alarm_value(struct sh_rtc *rtc, int reg_off) |
1153 | { |
1154 | unsigned int byte; |
1155 | - int value = 0xff; /* return 0xff for ignored values */ |
1156 | + int value = -1; /* return -1 for ignored values */ |
1157 | |
1158 | byte = readb(rtc->regbase + reg_off); |
1159 | if (byte & AR_ENB) { |
1160 | diff --git a/drivers/scsi/scsi_devinfo.c b/drivers/scsi/scsi_devinfo.c |
1161 | index 282ea00d0f87..9d555b63d2e2 100644 |
1162 | --- a/drivers/scsi/scsi_devinfo.c |
1163 | +++ b/drivers/scsi/scsi_devinfo.c |
1164 | @@ -249,6 +249,7 @@ static struct { |
1165 | {"NETAPP", "Universal Xport", "*", BLIST_NO_ULD_ATTACH}, |
1166 | {"LSI", "Universal Xport", "*", BLIST_NO_ULD_ATTACH}, |
1167 | {"ENGENIO", "Universal Xport", "*", BLIST_NO_ULD_ATTACH}, |
1168 | + {"LENOVO", "Universal Xport", "*", BLIST_NO_ULD_ATTACH}, |
1169 | {"SMSC", "USB 2 HS-CF", NULL, BLIST_SPARSELUN | BLIST_INQUIRY_36}, |
1170 | {"SONY", "CD-ROM CDU-8001", NULL, BLIST_BORKEN}, |
1171 | {"SONY", "TSL", NULL, BLIST_FORCELUN}, /* DDS3 & DDS4 autoloaders */ |
1172 | diff --git a/drivers/scsi/scsi_dh.c b/drivers/scsi/scsi_dh.c |
1173 | index 375cede0c534..c9bc6f058424 100644 |
1174 | --- a/drivers/scsi/scsi_dh.c |
1175 | +++ b/drivers/scsi/scsi_dh.c |
1176 | @@ -75,6 +75,7 @@ static const struct scsi_dh_blist scsi_dh_blist[] = { |
1177 | {"NETAPP", "INF-01-00", "rdac", }, |
1178 | {"LSI", "INF-01-00", "rdac", }, |
1179 | {"ENGENIO", "INF-01-00", "rdac", }, |
1180 | + {"LENOVO", "DE_Series", "rdac", }, |
1181 | {NULL, NULL, NULL }, |
1182 | }; |
1183 | |
1184 | diff --git a/drivers/scsi/storvsc_drv.c b/drivers/scsi/storvsc_drv.c |
1185 | index d92b2808d191..6df34d68737f 100644 |
1186 | --- a/drivers/scsi/storvsc_drv.c |
1187 | +++ b/drivers/scsi/storvsc_drv.c |
1188 | @@ -641,13 +641,22 @@ static void handle_sc_creation(struct vmbus_channel *new_sc) |
1189 | static void handle_multichannel_storage(struct hv_device *device, int max_chns) |
1190 | { |
1191 | struct storvsc_device *stor_device; |
1192 | - int num_cpus = num_online_cpus(); |
1193 | int num_sc; |
1194 | struct storvsc_cmd_request *request; |
1195 | struct vstor_packet *vstor_packet; |
1196 | int ret, t; |
1197 | |
1198 | - num_sc = ((max_chns > num_cpus) ? num_cpus : max_chns); |
1199 | + /* |
1200 | + * If the number of CPUs is artificially restricted, such as |
1201 | + * with maxcpus=1 on the kernel boot line, Hyper-V could offer |
1202 | + * sub-channels >= the number of CPUs. These sub-channels |
1203 | + * should not be created. The primary channel is already created |
1204 | + * and assigned to one CPU, so check against # CPUs - 1. |
1205 | + */ |
1206 | + num_sc = min((int)(num_online_cpus() - 1), max_chns); |
1207 | + if (!num_sc) |
1208 | + return; |
1209 | + |
1210 | stor_device = get_out_stor_device(device); |
1211 | if (!stor_device) |
1212 | return; |
1213 | diff --git a/drivers/staging/iio/addac/adt7316.c b/drivers/staging/iio/addac/adt7316.c |
1214 | index 3faffe59c933..95f5be1cd498 100644 |
1215 | --- a/drivers/staging/iio/addac/adt7316.c |
1216 | +++ b/drivers/staging/iio/addac/adt7316.c |
1217 | @@ -47,6 +47,8 @@ |
1218 | #define ADT7516_MSB_AIN3 0xA |
1219 | #define ADT7516_MSB_AIN4 0xB |
1220 | #define ADT7316_DA_DATA_BASE 0x10 |
1221 | +#define ADT7316_DA_10_BIT_LSB_SHIFT 6 |
1222 | +#define ADT7316_DA_12_BIT_LSB_SHIFT 4 |
1223 | #define ADT7316_DA_MSB_DATA_REGS 4 |
1224 | #define ADT7316_LSB_DAC_A 0x10 |
1225 | #define ADT7316_MSB_DAC_A 0x11 |
1226 | @@ -1089,7 +1091,7 @@ static ssize_t adt7316_store_DAC_internal_Vref(struct device *dev, |
1227 | ldac_config = chip->ldac_config & (~ADT7516_DAC_IN_VREF_MASK); |
1228 | if (data & 0x1) |
1229 | ldac_config |= ADT7516_DAC_AB_IN_VREF; |
1230 | - else if (data & 0x2) |
1231 | + if (data & 0x2) |
1232 | ldac_config |= ADT7516_DAC_CD_IN_VREF; |
1233 | } else { |
1234 | ret = kstrtou8(buf, 16, &data); |
1235 | @@ -1411,7 +1413,7 @@ static IIO_DEVICE_ATTR(ex_analog_temp_offset, S_IRUGO | S_IWUSR, |
1236 | static ssize_t adt7316_show_DAC(struct adt7316_chip_info *chip, |
1237 | int channel, char *buf) |
1238 | { |
1239 | - u16 data; |
1240 | + u16 data = 0; |
1241 | u8 msb, lsb, offset; |
1242 | int ret; |
1243 | |
1244 | @@ -1436,7 +1438,11 @@ static ssize_t adt7316_show_DAC(struct adt7316_chip_info *chip, |
1245 | if (ret) |
1246 | return -EIO; |
1247 | |
1248 | - data = (msb << offset) + (lsb & ((1 << offset) - 1)); |
1249 | + if (chip->dac_bits == 12) |
1250 | + data = lsb >> ADT7316_DA_12_BIT_LSB_SHIFT; |
1251 | + else if (chip->dac_bits == 10) |
1252 | + data = lsb >> ADT7316_DA_10_BIT_LSB_SHIFT; |
1253 | + data |= msb << offset; |
1254 | |
1255 | return sprintf(buf, "%d\n", data); |
1256 | } |
1257 | @@ -1444,7 +1450,7 @@ static ssize_t adt7316_show_DAC(struct adt7316_chip_info *chip, |
1258 | static ssize_t adt7316_store_DAC(struct adt7316_chip_info *chip, |
1259 | int channel, const char *buf, size_t len) |
1260 | { |
1261 | - u8 msb, lsb, offset; |
1262 | + u8 msb, lsb, lsb_reg, offset; |
1263 | u16 data; |
1264 | int ret; |
1265 | |
1266 | @@ -1462,9 +1468,13 @@ static ssize_t adt7316_store_DAC(struct adt7316_chip_info *chip, |
1267 | return -EINVAL; |
1268 | |
1269 | if (chip->dac_bits > 8) { |
1270 | - lsb = data & (1 << offset); |
1271 | + lsb = data & ((1 << offset) - 1); |
1272 | + if (chip->dac_bits == 12) |
1273 | + lsb_reg = lsb << ADT7316_DA_12_BIT_LSB_SHIFT; |
1274 | + else |
1275 | + lsb_reg = lsb << ADT7316_DA_10_BIT_LSB_SHIFT; |
1276 | ret = chip->bus.write(chip->bus.client, |
1277 | - ADT7316_DA_DATA_BASE + channel * 2, lsb); |
1278 | + ADT7316_DA_DATA_BASE + channel * 2, lsb_reg); |
1279 | if (ret) |
1280 | return -EIO; |
1281 | } |
1282 | diff --git a/drivers/usb/core/driver.c b/drivers/usb/core/driver.c |
1283 | index c17b254e4f64..654199c6a36c 100644 |
1284 | --- a/drivers/usb/core/driver.c |
1285 | +++ b/drivers/usb/core/driver.c |
1286 | @@ -470,11 +470,6 @@ static int usb_unbind_interface(struct device *dev) |
1287 | pm_runtime_disable(dev); |
1288 | pm_runtime_set_suspended(dev); |
1289 | |
1290 | - /* Undo any residual pm_autopm_get_interface_* calls */ |
1291 | - for (r = atomic_read(&intf->pm_usage_cnt); r > 0; --r) |
1292 | - usb_autopm_put_interface_no_suspend(intf); |
1293 | - atomic_set(&intf->pm_usage_cnt, 0); |
1294 | - |
1295 | if (!error) |
1296 | usb_autosuspend_device(udev); |
1297 | |
1298 | @@ -1625,7 +1620,6 @@ void usb_autopm_put_interface(struct usb_interface *intf) |
1299 | int status; |
1300 | |
1301 | usb_mark_last_busy(udev); |
1302 | - atomic_dec(&intf->pm_usage_cnt); |
1303 | status = pm_runtime_put_sync(&intf->dev); |
1304 | dev_vdbg(&intf->dev, "%s: cnt %d -> %d\n", |
1305 | __func__, atomic_read(&intf->dev.power.usage_count), |
1306 | @@ -1654,7 +1648,6 @@ void usb_autopm_put_interface_async(struct usb_interface *intf) |
1307 | int status; |
1308 | |
1309 | usb_mark_last_busy(udev); |
1310 | - atomic_dec(&intf->pm_usage_cnt); |
1311 | status = pm_runtime_put(&intf->dev); |
1312 | dev_vdbg(&intf->dev, "%s: cnt %d -> %d\n", |
1313 | __func__, atomic_read(&intf->dev.power.usage_count), |
1314 | @@ -1676,7 +1669,6 @@ void usb_autopm_put_interface_no_suspend(struct usb_interface *intf) |
1315 | struct usb_device *udev = interface_to_usbdev(intf); |
1316 | |
1317 | usb_mark_last_busy(udev); |
1318 | - atomic_dec(&intf->pm_usage_cnt); |
1319 | pm_runtime_put_noidle(&intf->dev); |
1320 | } |
1321 | EXPORT_SYMBOL_GPL(usb_autopm_put_interface_no_suspend); |
1322 | @@ -1707,8 +1699,6 @@ int usb_autopm_get_interface(struct usb_interface *intf) |
1323 | status = pm_runtime_get_sync(&intf->dev); |
1324 | if (status < 0) |
1325 | pm_runtime_put_sync(&intf->dev); |
1326 | - else |
1327 | - atomic_inc(&intf->pm_usage_cnt); |
1328 | dev_vdbg(&intf->dev, "%s: cnt %d -> %d\n", |
1329 | __func__, atomic_read(&intf->dev.power.usage_count), |
1330 | status); |
1331 | @@ -1742,8 +1732,6 @@ int usb_autopm_get_interface_async(struct usb_interface *intf) |
1332 | status = pm_runtime_get(&intf->dev); |
1333 | if (status < 0 && status != -EINPROGRESS) |
1334 | pm_runtime_put_noidle(&intf->dev); |
1335 | - else |
1336 | - atomic_inc(&intf->pm_usage_cnt); |
1337 | dev_vdbg(&intf->dev, "%s: cnt %d -> %d\n", |
1338 | __func__, atomic_read(&intf->dev.power.usage_count), |
1339 | status); |
1340 | @@ -1767,7 +1755,6 @@ void usb_autopm_get_interface_no_resume(struct usb_interface *intf) |
1341 | struct usb_device *udev = interface_to_usbdev(intf); |
1342 | |
1343 | usb_mark_last_busy(udev); |
1344 | - atomic_inc(&intf->pm_usage_cnt); |
1345 | pm_runtime_get_noresume(&intf->dev); |
1346 | } |
1347 | EXPORT_SYMBOL_GPL(usb_autopm_get_interface_no_resume); |
1348 | diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c |
1349 | index 0e6ab0a17c08..955cd6552e95 100644 |
1350 | --- a/drivers/usb/core/message.c |
1351 | +++ b/drivers/usb/core/message.c |
1352 | @@ -817,9 +817,11 @@ int usb_string(struct usb_device *dev, int index, char *buf, size_t size) |
1353 | |
1354 | if (dev->state == USB_STATE_SUSPENDED) |
1355 | return -EHOSTUNREACH; |
1356 | - if (size <= 0 || !buf || !index) |
1357 | + if (size <= 0 || !buf) |
1358 | return -EINVAL; |
1359 | buf[0] = 0; |
1360 | + if (index <= 0 || index >= 256) |
1361 | + return -EINVAL; |
1362 | tbuf = kmalloc(256, GFP_NOIO); |
1363 | if (!tbuf) |
1364 | return -ENOMEM; |
1365 | diff --git a/drivers/usb/misc/yurex.c b/drivers/usb/misc/yurex.c |
1366 | index 1e672343bcd6..efa3c86bd262 100644 |
1367 | --- a/drivers/usb/misc/yurex.c |
1368 | +++ b/drivers/usb/misc/yurex.c |
1369 | @@ -324,6 +324,7 @@ static void yurex_disconnect(struct usb_interface *interface) |
1370 | usb_deregister_dev(interface, &yurex_class); |
1371 | |
1372 | /* prevent more I/O from starting */ |
1373 | + usb_poison_urb(dev->urb); |
1374 | mutex_lock(&dev->io_mutex); |
1375 | dev->interface = NULL; |
1376 | mutex_unlock(&dev->io_mutex); |
1377 | diff --git a/drivers/usb/storage/realtek_cr.c b/drivers/usb/storage/realtek_cr.c |
1378 | index 4176d1af9bf2..fac3447021b2 100644 |
1379 | --- a/drivers/usb/storage/realtek_cr.c |
1380 | +++ b/drivers/usb/storage/realtek_cr.c |
1381 | @@ -776,18 +776,16 @@ static void rts51x_suspend_timer_fn(unsigned long data) |
1382 | break; |
1383 | case RTS51X_STAT_IDLE: |
1384 | case RTS51X_STAT_SS: |
1385 | - usb_stor_dbg(us, "RTS51X_STAT_SS, intf->pm_usage_cnt:%d, power.usage:%d\n", |
1386 | - atomic_read(&us->pusb_intf->pm_usage_cnt), |
1387 | + usb_stor_dbg(us, "RTS51X_STAT_SS, power.usage:%d\n", |
1388 | atomic_read(&us->pusb_intf->dev.power.usage_count)); |
1389 | |
1390 | - if (atomic_read(&us->pusb_intf->pm_usage_cnt) > 0) { |
1391 | + if (atomic_read(&us->pusb_intf->dev.power.usage_count) > 0) { |
1392 | usb_stor_dbg(us, "Ready to enter SS state\n"); |
1393 | rts51x_set_stat(chip, RTS51X_STAT_SS); |
1394 | /* ignore mass storage interface's children */ |
1395 | pm_suspend_ignore_children(&us->pusb_intf->dev, true); |
1396 | usb_autopm_put_interface_async(us->pusb_intf); |
1397 | - usb_stor_dbg(us, "RTS51X_STAT_SS 01, intf->pm_usage_cnt:%d, power.usage:%d\n", |
1398 | - atomic_read(&us->pusb_intf->pm_usage_cnt), |
1399 | + usb_stor_dbg(us, "RTS51X_STAT_SS 01, power.usage:%d\n", |
1400 | atomic_read(&us->pusb_intf->dev.power.usage_count)); |
1401 | } |
1402 | break; |
1403 | @@ -820,11 +818,10 @@ static void rts51x_invoke_transport(struct scsi_cmnd *srb, struct us_data *us) |
1404 | int ret; |
1405 | |
1406 | if (working_scsi(srb)) { |
1407 | - usb_stor_dbg(us, "working scsi, intf->pm_usage_cnt:%d, power.usage:%d\n", |
1408 | - atomic_read(&us->pusb_intf->pm_usage_cnt), |
1409 | + usb_stor_dbg(us, "working scsi, power.usage:%d\n", |
1410 | atomic_read(&us->pusb_intf->dev.power.usage_count)); |
1411 | |
1412 | - if (atomic_read(&us->pusb_intf->pm_usage_cnt) <= 0) { |
1413 | + if (atomic_read(&us->pusb_intf->dev.power.usage_count) <= 0) { |
1414 | ret = usb_autopm_get_interface(us->pusb_intf); |
1415 | usb_stor_dbg(us, "working scsi, ret=%d\n", ret); |
1416 | } |
1417 | diff --git a/drivers/usb/usbip/stub_rx.c b/drivers/usb/usbip/stub_rx.c |
1418 | index 5b807185f79e..777a4058c407 100644 |
1419 | --- a/drivers/usb/usbip/stub_rx.c |
1420 | +++ b/drivers/usb/usbip/stub_rx.c |
1421 | @@ -383,16 +383,10 @@ static int get_pipe(struct stub_device *sdev, struct usbip_header *pdu) |
1422 | } |
1423 | |
1424 | if (usb_endpoint_xfer_isoc(epd)) { |
1425 | - /* validate packet size and number of packets */ |
1426 | - unsigned int maxp, packets, bytes; |
1427 | - |
1428 | - maxp = usb_endpoint_maxp(epd); |
1429 | - maxp *= usb_endpoint_maxp_mult(epd); |
1430 | - bytes = pdu->u.cmd_submit.transfer_buffer_length; |
1431 | - packets = DIV_ROUND_UP(bytes, maxp); |
1432 | - |
1433 | + /* validate number of packets */ |
1434 | if (pdu->u.cmd_submit.number_of_packets < 0 || |
1435 | - pdu->u.cmd_submit.number_of_packets > packets) { |
1436 | + pdu->u.cmd_submit.number_of_packets > |
1437 | + USBIP_MAX_ISO_PACKETS) { |
1438 | dev_err(&sdev->udev->dev, |
1439 | "CMD_SUBMIT: isoc invalid num packets %d\n", |
1440 | pdu->u.cmd_submit.number_of_packets); |
1441 | diff --git a/drivers/usb/usbip/usbip_common.h b/drivers/usb/usbip/usbip_common.h |
1442 | index 109e65ba01a0..0b199a2664c0 100644 |
1443 | --- a/drivers/usb/usbip/usbip_common.h |
1444 | +++ b/drivers/usb/usbip/usbip_common.h |
1445 | @@ -136,6 +136,13 @@ extern struct device_attribute dev_attr_usbip_debug; |
1446 | #define USBIP_DIR_OUT 0x00 |
1447 | #define USBIP_DIR_IN 0x01 |
1448 | |
1449 | +/* |
1450 | + * Arbitrary limit for the maximum number of isochronous packets in an URB, |
1451 | + * compare for example the uhci_submit_isochronous function in |
1452 | + * drivers/usb/host/uhci-q.c |
1453 | + */ |
1454 | +#define USBIP_MAX_ISO_PACKETS 1024 |
1455 | + |
1456 | /** |
1457 | * struct usbip_header_basic - data pertinent to every request |
1458 | * @command: the usbip request type |
1459 | diff --git a/drivers/vfio/pci/vfio_pci.c b/drivers/vfio/pci/vfio_pci.c |
1460 | index 7338e43faa17..f9a75df2d22d 100644 |
1461 | --- a/drivers/vfio/pci/vfio_pci.c |
1462 | +++ b/drivers/vfio/pci/vfio_pci.c |
1463 | @@ -1467,11 +1467,11 @@ static void __init vfio_pci_fill_ids(void) |
1464 | rc = pci_add_dynid(&vfio_pci_driver, vendor, device, |
1465 | subvendor, subdevice, class, class_mask, 0); |
1466 | if (rc) |
1467 | - pr_warn("failed to add dynamic id [%04hx:%04hx[%04hx:%04hx]] class %#08x/%08x (%d)\n", |
1468 | + pr_warn("failed to add dynamic id [%04x:%04x[%04x:%04x]] class %#08x/%08x (%d)\n", |
1469 | vendor, device, subvendor, subdevice, |
1470 | class, class_mask, rc); |
1471 | else |
1472 | - pr_info("add [%04hx:%04hx[%04hx:%04hx]] class %#08x/%08x\n", |
1473 | + pr_info("add [%04x:%04x[%04x:%04x]] class %#08x/%08x\n", |
1474 | vendor, device, subvendor, subdevice, |
1475 | class, class_mask); |
1476 | } |
1477 | diff --git a/drivers/w1/masters/ds2490.c b/drivers/w1/masters/ds2490.c |
1478 | index 59d74d1b47a8..2287e1be0e55 100644 |
1479 | --- a/drivers/w1/masters/ds2490.c |
1480 | +++ b/drivers/w1/masters/ds2490.c |
1481 | @@ -1039,15 +1039,15 @@ static int ds_probe(struct usb_interface *intf, |
1482 | /* alternative 3, 1ms interrupt (greatly speeds search), 64 byte bulk */ |
1483 | alt = 3; |
1484 | err = usb_set_interface(dev->udev, |
1485 | - intf->altsetting[alt].desc.bInterfaceNumber, alt); |
1486 | + intf->cur_altsetting->desc.bInterfaceNumber, alt); |
1487 | if (err) { |
1488 | dev_err(&dev->udev->dev, "Failed to set alternative setting %d " |
1489 | "for %d interface: err=%d.\n", alt, |
1490 | - intf->altsetting[alt].desc.bInterfaceNumber, err); |
1491 | + intf->cur_altsetting->desc.bInterfaceNumber, err); |
1492 | goto err_out_clear; |
1493 | } |
1494 | |
1495 | - iface_desc = &intf->altsetting[alt]; |
1496 | + iface_desc = intf->cur_altsetting; |
1497 | if (iface_desc->desc.bNumEndpoints != NUM_EP-1) { |
1498 | pr_info("Num endpoints=%d. It is not DS9490R.\n", |
1499 | iface_desc->desc.bNumEndpoints); |
1500 | diff --git a/fs/debugfs/inode.c b/fs/debugfs/inode.c |
1501 | index 77e9cd7a0137..20ee612017bf 100644 |
1502 | --- a/fs/debugfs/inode.c |
1503 | +++ b/fs/debugfs/inode.c |
1504 | @@ -170,19 +170,24 @@ static int debugfs_show_options(struct seq_file *m, struct dentry *root) |
1505 | return 0; |
1506 | } |
1507 | |
1508 | -static void debugfs_evict_inode(struct inode *inode) |
1509 | +static void debugfs_i_callback(struct rcu_head *head) |
1510 | { |
1511 | - truncate_inode_pages_final(&inode->i_data); |
1512 | - clear_inode(inode); |
1513 | + struct inode *inode = container_of(head, struct inode, i_rcu); |
1514 | if (S_ISLNK(inode->i_mode)) |
1515 | kfree(inode->i_link); |
1516 | + free_inode_nonrcu(inode); |
1517 | +} |
1518 | + |
1519 | +static void debugfs_destroy_inode(struct inode *inode) |
1520 | +{ |
1521 | + call_rcu(&inode->i_rcu, debugfs_i_callback); |
1522 | } |
1523 | |
1524 | static const struct super_operations debugfs_super_operations = { |
1525 | .statfs = simple_statfs, |
1526 | .remount_fs = debugfs_remount, |
1527 | .show_options = debugfs_show_options, |
1528 | - .evict_inode = debugfs_evict_inode, |
1529 | + .destroy_inode = debugfs_destroy_inode, |
1530 | }; |
1531 | |
1532 | static struct vfsmount *debugfs_automount(struct path *path) |
1533 | diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c |
1534 | index 001487b230b5..4acc677ac8fb 100644 |
1535 | --- a/fs/hugetlbfs/inode.c |
1536 | +++ b/fs/hugetlbfs/inode.c |
1537 | @@ -746,11 +746,17 @@ static struct inode *hugetlbfs_get_inode(struct super_block *sb, |
1538 | umode_t mode, dev_t dev) |
1539 | { |
1540 | struct inode *inode; |
1541 | - struct resv_map *resv_map; |
1542 | + struct resv_map *resv_map = NULL; |
1543 | |
1544 | - resv_map = resv_map_alloc(); |
1545 | - if (!resv_map) |
1546 | - return NULL; |
1547 | + /* |
1548 | + * Reserve maps are only needed for inodes that can have associated |
1549 | + * page allocations. |
1550 | + */ |
1551 | + if (S_ISREG(mode) || S_ISLNK(mode)) { |
1552 | + resv_map = resv_map_alloc(); |
1553 | + if (!resv_map) |
1554 | + return NULL; |
1555 | + } |
1556 | |
1557 | inode = new_inode(sb); |
1558 | if (inode) { |
1559 | @@ -782,8 +788,10 @@ static struct inode *hugetlbfs_get_inode(struct super_block *sb, |
1560 | break; |
1561 | } |
1562 | lockdep_annotate_inode_mutex_key(inode); |
1563 | - } else |
1564 | - kref_put(&resv_map->refs, resv_map_release); |
1565 | + } else { |
1566 | + if (resv_map) |
1567 | + kref_put(&resv_map->refs, resv_map_release); |
1568 | + } |
1569 | |
1570 | return inode; |
1571 | } |
1572 | diff --git a/fs/jffs2/readinode.c b/fs/jffs2/readinode.c |
1573 | index 06a71dbd4833..2f236cca6095 100644 |
1574 | --- a/fs/jffs2/readinode.c |
1575 | +++ b/fs/jffs2/readinode.c |
1576 | @@ -1414,11 +1414,6 @@ void jffs2_do_clear_inode(struct jffs2_sb_info *c, struct jffs2_inode_info *f) |
1577 | |
1578 | jffs2_kill_fragtree(&f->fragtree, deleted?c:NULL); |
1579 | |
1580 | - if (f->target) { |
1581 | - kfree(f->target); |
1582 | - f->target = NULL; |
1583 | - } |
1584 | - |
1585 | fds = f->dents; |
1586 | while(fds) { |
1587 | fd = fds; |
1588 | diff --git a/fs/jffs2/super.c b/fs/jffs2/super.c |
1589 | index 226640563df3..76aedbc97773 100644 |
1590 | --- a/fs/jffs2/super.c |
1591 | +++ b/fs/jffs2/super.c |
1592 | @@ -47,7 +47,10 @@ static struct inode *jffs2_alloc_inode(struct super_block *sb) |
1593 | static void jffs2_i_callback(struct rcu_head *head) |
1594 | { |
1595 | struct inode *inode = container_of(head, struct inode, i_rcu); |
1596 | - kmem_cache_free(jffs2_inode_cachep, JFFS2_INODE_INFO(inode)); |
1597 | + struct jffs2_inode_info *f = JFFS2_INODE_INFO(inode); |
1598 | + |
1599 | + kfree(f->target); |
1600 | + kmem_cache_free(jffs2_inode_cachep, f); |
1601 | } |
1602 | |
1603 | static void jffs2_destroy_inode(struct inode *inode) |
1604 | diff --git a/include/linux/kasan.h b/include/linux/kasan.h |
1605 | index 820c0ad54a01..c9df9e180610 100644 |
1606 | --- a/include/linux/kasan.h |
1607 | +++ b/include/linux/kasan.h |
1608 | @@ -7,6 +7,7 @@ |
1609 | struct kmem_cache; |
1610 | struct page; |
1611 | struct vm_struct; |
1612 | +struct task_struct; |
1613 | |
1614 | #ifdef CONFIG_KASAN |
1615 | |
1616 | diff --git a/include/linux/usb.h b/include/linux/usb.h |
1617 | index 346665a0c49d..9b5ca59271d9 100644 |
1618 | --- a/include/linux/usb.h |
1619 | +++ b/include/linux/usb.h |
1620 | @@ -129,7 +129,6 @@ enum usb_interface_condition { |
1621 | * @dev: driver model's view of this device |
1622 | * @usb_dev: if an interface is bound to the USB major, this will point |
1623 | * to the sysfs representation for that device. |
1624 | - * @pm_usage_cnt: PM usage counter for this interface |
1625 | * @reset_ws: Used for scheduling resets from atomic context. |
1626 | * @resetting_device: USB core reset the device, so use alt setting 0 as |
1627 | * current; needs bandwidth alloc after reset. |
1628 | @@ -186,7 +185,6 @@ struct usb_interface { |
1629 | |
1630 | struct device dev; /* interface specific device info */ |
1631 | struct device *usb_dev; |
1632 | - atomic_t pm_usage_cnt; /* usage counter for autosuspend */ |
1633 | struct work_struct reset_ws; /* for resets in atomic context */ |
1634 | }; |
1635 | #define to_usb_interface(d) container_of(d, struct usb_interface, dev) |
1636 | diff --git a/include/net/caif/cfpkt.h b/include/net/caif/cfpkt.h |
1637 | index fe328c52c46b..801489bb14c3 100644 |
1638 | --- a/include/net/caif/cfpkt.h |
1639 | +++ b/include/net/caif/cfpkt.h |
1640 | @@ -32,6 +32,33 @@ void cfpkt_destroy(struct cfpkt *pkt); |
1641 | */ |
1642 | int cfpkt_extr_head(struct cfpkt *pkt, void *data, u16 len); |
1643 | |
1644 | +static inline u8 cfpkt_extr_head_u8(struct cfpkt *pkt) |
1645 | +{ |
1646 | + u8 tmp; |
1647 | + |
1648 | + cfpkt_extr_head(pkt, &tmp, 1); |
1649 | + |
1650 | + return tmp; |
1651 | +} |
1652 | + |
1653 | +static inline u16 cfpkt_extr_head_u16(struct cfpkt *pkt) |
1654 | +{ |
1655 | + __le16 tmp; |
1656 | + |
1657 | + cfpkt_extr_head(pkt, &tmp, 2); |
1658 | + |
1659 | + return le16_to_cpu(tmp); |
1660 | +} |
1661 | + |
1662 | +static inline u32 cfpkt_extr_head_u32(struct cfpkt *pkt) |
1663 | +{ |
1664 | + __le32 tmp; |
1665 | + |
1666 | + cfpkt_extr_head(pkt, &tmp, 4); |
1667 | + |
1668 | + return le32_to_cpu(tmp); |
1669 | +} |
1670 | + |
1671 | /* |
1672 | * Peek header from packet. |
1673 | * Reads data from packet without changing packet. |
1674 | diff --git a/lib/Makefile b/lib/Makefile |
1675 | index 50144a3aeebd..2447a218fff8 100644 |
1676 | --- a/lib/Makefile |
1677 | +++ b/lib/Makefile |
1678 | @@ -46,6 +46,7 @@ obj-$(CONFIG_TEST_BPF) += test_bpf.o |
1679 | obj-$(CONFIG_TEST_FIRMWARE) += test_firmware.o |
1680 | obj-$(CONFIG_TEST_HASH) += test_hash.o |
1681 | obj-$(CONFIG_TEST_KASAN) += test_kasan.o |
1682 | +CFLAGS_test_kasan.o += -fno-builtin |
1683 | obj-$(CONFIG_TEST_KSTRTOX) += test-kstrtox.o |
1684 | obj-$(CONFIG_TEST_LKM) += test_module.o |
1685 | obj-$(CONFIG_TEST_RHASHTABLE) += test_rhashtable.o |
1686 | diff --git a/lib/test_kasan.c b/lib/test_kasan.c |
1687 | index fbdf87920093..4ba4cbe169a8 100644 |
1688 | --- a/lib/test_kasan.c |
1689 | +++ b/lib/test_kasan.c |
1690 | @@ -355,7 +355,7 @@ static noinline void __init kasan_stack_oob(void) |
1691 | static noinline void __init ksize_unpoisons_memory(void) |
1692 | { |
1693 | char *ptr; |
1694 | - size_t size = 123, real_size = size; |
1695 | + size_t size = 123, real_size; |
1696 | |
1697 | pr_info("ksize() unpoisons the whole allocated chunk\n"); |
1698 | ptr = kmalloc(size, GFP_KERNEL); |
1699 | diff --git a/mm/kasan/kasan.c b/mm/kasan/kasan.c |
1700 | index 4ce386c44cf1..1169c1fe941f 100644 |
1701 | --- a/mm/kasan/kasan.c |
1702 | +++ b/mm/kasan/kasan.c |
1703 | @@ -80,7 +80,14 @@ void kasan_unpoison_task_stack(struct task_struct *task) |
1704 | /* Unpoison the stack for the current task beyond a watermark sp value. */ |
1705 | asmlinkage void kasan_unpoison_task_stack_below(const void *watermark) |
1706 | { |
1707 | - __kasan_unpoison_stack(current, watermark); |
1708 | + /* |
1709 | + * Calculate the task stack base address. Avoid using 'current' |
1710 | + * because this function is called by early resume code which hasn't |
1711 | + * yet set up the percpu register (%gs). |
1712 | + */ |
1713 | + void *base = (void *)((unsigned long)watermark & ~(THREAD_SIZE - 1)); |
1714 | + |
1715 | + kasan_unpoison_shadow(base, watermark - base); |
1716 | } |
1717 | |
1718 | /* |
1719 | diff --git a/mm/kasan/kasan_init.c b/mm/kasan/kasan_init.c |
1720 | index 3f9a41cf0ac6..31238dad85fb 100644 |
1721 | --- a/mm/kasan/kasan_init.c |
1722 | +++ b/mm/kasan/kasan_init.c |
1723 | @@ -15,6 +15,7 @@ |
1724 | #include <linux/kasan.h> |
1725 | #include <linux/kernel.h> |
1726 | #include <linux/memblock.h> |
1727 | +#include <linux/mm.h> |
1728 | #include <linux/pfn.h> |
1729 | |
1730 | #include <asm/page.h> |
1731 | @@ -49,7 +50,7 @@ static void __init zero_pte_populate(pmd_t *pmd, unsigned long addr, |
1732 | pte_t *pte = pte_offset_kernel(pmd, addr); |
1733 | pte_t zero_pte; |
1734 | |
1735 | - zero_pte = pfn_pte(PFN_DOWN(__pa(kasan_zero_page)), PAGE_KERNEL); |
1736 | + zero_pte = pfn_pte(PFN_DOWN(__pa_symbol(kasan_zero_page)), PAGE_KERNEL); |
1737 | zero_pte = pte_wrprotect(zero_pte); |
1738 | |
1739 | while (addr + PAGE_SIZE <= end) { |
1740 | @@ -69,7 +70,7 @@ static void __init zero_pmd_populate(pud_t *pud, unsigned long addr, |
1741 | next = pmd_addr_end(addr, end); |
1742 | |
1743 | if (IS_ALIGNED(addr, PMD_SIZE) && end - addr >= PMD_SIZE) { |
1744 | - pmd_populate_kernel(&init_mm, pmd, kasan_zero_pte); |
1745 | + pmd_populate_kernel(&init_mm, pmd, lm_alias(kasan_zero_pte)); |
1746 | continue; |
1747 | } |
1748 | |
1749 | @@ -92,9 +93,9 @@ static void __init zero_pud_populate(pgd_t *pgd, unsigned long addr, |
1750 | if (IS_ALIGNED(addr, PUD_SIZE) && end - addr >= PUD_SIZE) { |
1751 | pmd_t *pmd; |
1752 | |
1753 | - pud_populate(&init_mm, pud, kasan_zero_pmd); |
1754 | + pud_populate(&init_mm, pud, lm_alias(kasan_zero_pmd)); |
1755 | pmd = pmd_offset(pud, addr); |
1756 | - pmd_populate_kernel(&init_mm, pmd, kasan_zero_pte); |
1757 | + pmd_populate_kernel(&init_mm, pmd, lm_alias(kasan_zero_pte)); |
1758 | continue; |
1759 | } |
1760 | |
1761 | @@ -135,11 +136,11 @@ void __init kasan_populate_zero_shadow(const void *shadow_start, |
1762 | * puds,pmds, so pgd_populate(), pud_populate() |
1763 | * is noops. |
1764 | */ |
1765 | - pgd_populate(&init_mm, pgd, kasan_zero_pud); |
1766 | + pgd_populate(&init_mm, pgd, lm_alias(kasan_zero_pud)); |
1767 | pud = pud_offset(pgd, addr); |
1768 | - pud_populate(&init_mm, pud, kasan_zero_pmd); |
1769 | + pud_populate(&init_mm, pud, lm_alias(kasan_zero_pmd)); |
1770 | pmd = pmd_offset(pud, addr); |
1771 | - pmd_populate_kernel(&init_mm, pmd, kasan_zero_pte); |
1772 | + pmd_populate_kernel(&init_mm, pmd, lm_alias(kasan_zero_pte)); |
1773 | continue; |
1774 | } |
1775 | |
1776 | diff --git a/mm/kasan/report.c b/mm/kasan/report.c |
1777 | index 8ca412aebcf1..c505ac5b2d46 100644 |
1778 | --- a/mm/kasan/report.c |
1779 | +++ b/mm/kasan/report.c |
1780 | @@ -302,6 +302,7 @@ void kasan_report(unsigned long addr, size_t size, |
1781 | disable_trace_on_warning(); |
1782 | |
1783 | info.access_addr = (void *)addr; |
1784 | + info.first_bad_addr = (void *)addr; |
1785 | info.access_size = size; |
1786 | info.is_write = is_write; |
1787 | info.ip = ip; |
1788 | diff --git a/net/batman-adv/bridge_loop_avoidance.c b/net/batman-adv/bridge_loop_avoidance.c |
1789 | index 8b6f654bc85d..00123064eb26 100644 |
1790 | --- a/net/batman-adv/bridge_loop_avoidance.c |
1791 | +++ b/net/batman-adv/bridge_loop_avoidance.c |
1792 | @@ -802,6 +802,8 @@ static void batadv_bla_del_claim(struct batadv_priv *bat_priv, |
1793 | const u8 *mac, const unsigned short vid) |
1794 | { |
1795 | struct batadv_bla_claim search_claim, *claim; |
1796 | + struct batadv_bla_claim *claim_removed_entry; |
1797 | + struct hlist_node *claim_removed_node; |
1798 | |
1799 | ether_addr_copy(search_claim.addr, mac); |
1800 | search_claim.vid = vid; |
1801 | @@ -812,10 +814,18 @@ static void batadv_bla_del_claim(struct batadv_priv *bat_priv, |
1802 | batadv_dbg(BATADV_DBG_BLA, bat_priv, "bla_del_claim(): %pM, vid %d\n", |
1803 | mac, BATADV_PRINT_VID(vid)); |
1804 | |
1805 | - batadv_hash_remove(bat_priv->bla.claim_hash, batadv_compare_claim, |
1806 | - batadv_choose_claim, claim); |
1807 | - batadv_claim_put(claim); /* reference from the hash is gone */ |
1808 | + claim_removed_node = batadv_hash_remove(bat_priv->bla.claim_hash, |
1809 | + batadv_compare_claim, |
1810 | + batadv_choose_claim, claim); |
1811 | + if (!claim_removed_node) |
1812 | + goto free_claim; |
1813 | |
1814 | + /* reference from the hash is gone */ |
1815 | + claim_removed_entry = hlist_entry(claim_removed_node, |
1816 | + struct batadv_bla_claim, hash_entry); |
1817 | + batadv_claim_put(claim_removed_entry); |
1818 | + |
1819 | +free_claim: |
1820 | /* don't need the reference from hash_find() anymore */ |
1821 | batadv_claim_put(claim); |
1822 | } |
1823 | diff --git a/net/batman-adv/translation-table.c b/net/batman-adv/translation-table.c |
1824 | index b9f9a310eb78..af4a02ad8503 100644 |
1825 | --- a/net/batman-adv/translation-table.c |
1826 | +++ b/net/batman-adv/translation-table.c |
1827 | @@ -615,14 +615,26 @@ static void batadv_tt_global_free(struct batadv_priv *bat_priv, |
1828 | struct batadv_tt_global_entry *tt_global, |
1829 | const char *message) |
1830 | { |
1831 | + struct batadv_tt_global_entry *tt_removed_entry; |
1832 | + struct hlist_node *tt_removed_node; |
1833 | + |
1834 | batadv_dbg(BATADV_DBG_TT, bat_priv, |
1835 | "Deleting global tt entry %pM (vid: %d): %s\n", |
1836 | tt_global->common.addr, |
1837 | BATADV_PRINT_VID(tt_global->common.vid), message); |
1838 | |
1839 | - batadv_hash_remove(bat_priv->tt.global_hash, batadv_compare_tt, |
1840 | - batadv_choose_tt, &tt_global->common); |
1841 | - batadv_tt_global_entry_put(tt_global); |
1842 | + tt_removed_node = batadv_hash_remove(bat_priv->tt.global_hash, |
1843 | + batadv_compare_tt, |
1844 | + batadv_choose_tt, |
1845 | + &tt_global->common); |
1846 | + if (!tt_removed_node) |
1847 | + return; |
1848 | + |
1849 | + /* drop reference of remove hash entry */ |
1850 | + tt_removed_entry = hlist_entry(tt_removed_node, |
1851 | + struct batadv_tt_global_entry, |
1852 | + common.hash_entry); |
1853 | + batadv_tt_global_entry_put(tt_removed_entry); |
1854 | } |
1855 | |
1856 | /** |
1857 | @@ -1308,9 +1320,10 @@ u16 batadv_tt_local_remove(struct batadv_priv *bat_priv, const u8 *addr, |
1858 | unsigned short vid, const char *message, |
1859 | bool roaming) |
1860 | { |
1861 | + struct batadv_tt_local_entry *tt_removed_entry; |
1862 | struct batadv_tt_local_entry *tt_local_entry; |
1863 | u16 flags, curr_flags = BATADV_NO_FLAGS; |
1864 | - void *tt_entry_exists; |
1865 | + struct hlist_node *tt_removed_node; |
1866 | |
1867 | tt_local_entry = batadv_tt_local_hash_find(bat_priv, addr, vid); |
1868 | if (!tt_local_entry) |
1869 | @@ -1339,15 +1352,18 @@ u16 batadv_tt_local_remove(struct batadv_priv *bat_priv, const u8 *addr, |
1870 | */ |
1871 | batadv_tt_local_event(bat_priv, tt_local_entry, BATADV_TT_CLIENT_DEL); |
1872 | |
1873 | - tt_entry_exists = batadv_hash_remove(bat_priv->tt.local_hash, |
1874 | + tt_removed_node = batadv_hash_remove(bat_priv->tt.local_hash, |
1875 | batadv_compare_tt, |
1876 | batadv_choose_tt, |
1877 | &tt_local_entry->common); |
1878 | - if (!tt_entry_exists) |
1879 | + if (!tt_removed_node) |
1880 | goto out; |
1881 | |
1882 | - /* extra call to free the local tt entry */ |
1883 | - batadv_tt_local_entry_put(tt_local_entry); |
1884 | + /* drop reference of remove hash entry */ |
1885 | + tt_removed_entry = hlist_entry(tt_removed_node, |
1886 | + struct batadv_tt_local_entry, |
1887 | + common.hash_entry); |
1888 | + batadv_tt_local_entry_put(tt_removed_entry); |
1889 | |
1890 | out: |
1891 | if (tt_local_entry) |
1892 | diff --git a/net/caif/cfctrl.c b/net/caif/cfctrl.c |
1893 | index f5afda1abc76..4dc82e9a855d 100644 |
1894 | --- a/net/caif/cfctrl.c |
1895 | +++ b/net/caif/cfctrl.c |
1896 | @@ -352,15 +352,14 @@ static int cfctrl_recv(struct cflayer *layer, struct cfpkt *pkt) |
1897 | u8 cmdrsp; |
1898 | u8 cmd; |
1899 | int ret = -1; |
1900 | - u16 tmp16; |
1901 | u8 len; |
1902 | u8 param[255]; |
1903 | - u8 linkid; |
1904 | + u8 linkid = 0; |
1905 | struct cfctrl *cfctrl = container_obj(layer); |
1906 | struct cfctrl_request_info rsp, *req; |
1907 | |
1908 | |
1909 | - cfpkt_extr_head(pkt, &cmdrsp, 1); |
1910 | + cmdrsp = cfpkt_extr_head_u8(pkt); |
1911 | cmd = cmdrsp & CFCTRL_CMD_MASK; |
1912 | if (cmd != CFCTRL_CMD_LINK_ERR |
1913 | && CFCTRL_RSP_BIT != (CFCTRL_RSP_BIT & cmdrsp) |
1914 | @@ -378,13 +377,12 @@ static int cfctrl_recv(struct cflayer *layer, struct cfpkt *pkt) |
1915 | u8 physlinkid; |
1916 | u8 prio; |
1917 | u8 tmp; |
1918 | - u32 tmp32; |
1919 | u8 *cp; |
1920 | int i; |
1921 | struct cfctrl_link_param linkparam; |
1922 | memset(&linkparam, 0, sizeof(linkparam)); |
1923 | |
1924 | - cfpkt_extr_head(pkt, &tmp, 1); |
1925 | + tmp = cfpkt_extr_head_u8(pkt); |
1926 | |
1927 | serv = tmp & CFCTRL_SRV_MASK; |
1928 | linkparam.linktype = serv; |
1929 | @@ -392,13 +390,13 @@ static int cfctrl_recv(struct cflayer *layer, struct cfpkt *pkt) |
1930 | servtype = tmp >> 4; |
1931 | linkparam.chtype = servtype; |
1932 | |
1933 | - cfpkt_extr_head(pkt, &tmp, 1); |
1934 | + tmp = cfpkt_extr_head_u8(pkt); |
1935 | physlinkid = tmp & 0x07; |
1936 | prio = tmp >> 3; |
1937 | |
1938 | linkparam.priority = prio; |
1939 | linkparam.phyid = physlinkid; |
1940 | - cfpkt_extr_head(pkt, &endpoint, 1); |
1941 | + endpoint = cfpkt_extr_head_u8(pkt); |
1942 | linkparam.endpoint = endpoint & 0x03; |
1943 | |
1944 | switch (serv) { |
1945 | @@ -407,45 +405,43 @@ static int cfctrl_recv(struct cflayer *layer, struct cfpkt *pkt) |
1946 | if (CFCTRL_ERR_BIT & cmdrsp) |
1947 | break; |
1948 | /* Link ID */ |
1949 | - cfpkt_extr_head(pkt, &linkid, 1); |
1950 | + linkid = cfpkt_extr_head_u8(pkt); |
1951 | break; |
1952 | case CFCTRL_SRV_VIDEO: |
1953 | - cfpkt_extr_head(pkt, &tmp, 1); |
1954 | + tmp = cfpkt_extr_head_u8(pkt); |
1955 | linkparam.u.video.connid = tmp; |
1956 | if (CFCTRL_ERR_BIT & cmdrsp) |
1957 | break; |
1958 | /* Link ID */ |
1959 | - cfpkt_extr_head(pkt, &linkid, 1); |
1960 | + linkid = cfpkt_extr_head_u8(pkt); |
1961 | break; |
1962 | |
1963 | case CFCTRL_SRV_DATAGRAM: |
1964 | - cfpkt_extr_head(pkt, &tmp32, 4); |
1965 | linkparam.u.datagram.connid = |
1966 | - le32_to_cpu(tmp32); |
1967 | + cfpkt_extr_head_u32(pkt); |
1968 | if (CFCTRL_ERR_BIT & cmdrsp) |
1969 | break; |
1970 | /* Link ID */ |
1971 | - cfpkt_extr_head(pkt, &linkid, 1); |
1972 | + linkid = cfpkt_extr_head_u8(pkt); |
1973 | break; |
1974 | case CFCTRL_SRV_RFM: |
1975 | /* Construct a frame, convert |
1976 | * DatagramConnectionID |
1977 | * to network format long and copy it out... |
1978 | */ |
1979 | - cfpkt_extr_head(pkt, &tmp32, 4); |
1980 | linkparam.u.rfm.connid = |
1981 | - le32_to_cpu(tmp32); |
1982 | + cfpkt_extr_head_u32(pkt); |
1983 | cp = (u8 *) linkparam.u.rfm.volume; |
1984 | - for (cfpkt_extr_head(pkt, &tmp, 1); |
1985 | + for (tmp = cfpkt_extr_head_u8(pkt); |
1986 | cfpkt_more(pkt) && tmp != '\0'; |
1987 | - cfpkt_extr_head(pkt, &tmp, 1)) |
1988 | + tmp = cfpkt_extr_head_u8(pkt)) |
1989 | *cp++ = tmp; |
1990 | *cp = '\0'; |
1991 | |
1992 | if (CFCTRL_ERR_BIT & cmdrsp) |
1993 | break; |
1994 | /* Link ID */ |
1995 | - cfpkt_extr_head(pkt, &linkid, 1); |
1996 | + linkid = cfpkt_extr_head_u8(pkt); |
1997 | |
1998 | break; |
1999 | case CFCTRL_SRV_UTIL: |
2000 | @@ -454,13 +450,11 @@ static int cfctrl_recv(struct cflayer *layer, struct cfpkt *pkt) |
2001 | * to network format long and copy it out... |
2002 | */ |
2003 | /* Fifosize KB */ |
2004 | - cfpkt_extr_head(pkt, &tmp16, 2); |
2005 | linkparam.u.utility.fifosize_kb = |
2006 | - le16_to_cpu(tmp16); |
2007 | + cfpkt_extr_head_u16(pkt); |
2008 | /* Fifosize bufs */ |
2009 | - cfpkt_extr_head(pkt, &tmp16, 2); |
2010 | linkparam.u.utility.fifosize_bufs = |
2011 | - le16_to_cpu(tmp16); |
2012 | + cfpkt_extr_head_u16(pkt); |
2013 | /* name */ |
2014 | cp = (u8 *) linkparam.u.utility.name; |
2015 | caif_assert(sizeof(linkparam.u.utility.name) |
2016 | @@ -468,24 +462,24 @@ static int cfctrl_recv(struct cflayer *layer, struct cfpkt *pkt) |
2017 | for (i = 0; |
2018 | i < UTILITY_NAME_LENGTH |
2019 | && cfpkt_more(pkt); i++) { |
2020 | - cfpkt_extr_head(pkt, &tmp, 1); |
2021 | + tmp = cfpkt_extr_head_u8(pkt); |
2022 | *cp++ = tmp; |
2023 | } |
2024 | /* Length */ |
2025 | - cfpkt_extr_head(pkt, &len, 1); |
2026 | + len = cfpkt_extr_head_u8(pkt); |
2027 | linkparam.u.utility.paramlen = len; |
2028 | /* Param Data */ |
2029 | cp = linkparam.u.utility.params; |
2030 | while (cfpkt_more(pkt) && len--) { |
2031 | - cfpkt_extr_head(pkt, &tmp, 1); |
2032 | + tmp = cfpkt_extr_head_u8(pkt); |
2033 | *cp++ = tmp; |
2034 | } |
2035 | if (CFCTRL_ERR_BIT & cmdrsp) |
2036 | break; |
2037 | /* Link ID */ |
2038 | - cfpkt_extr_head(pkt, &linkid, 1); |
2039 | + linkid = cfpkt_extr_head_u8(pkt); |
2040 | /* Length */ |
2041 | - cfpkt_extr_head(pkt, &len, 1); |
2042 | + len = cfpkt_extr_head_u8(pkt); |
2043 | /* Param Data */ |
2044 | cfpkt_extr_head(pkt, ¶m, len); |
2045 | break; |
2046 | @@ -522,7 +516,7 @@ static int cfctrl_recv(struct cflayer *layer, struct cfpkt *pkt) |
2047 | } |
2048 | break; |
2049 | case CFCTRL_CMD_LINK_DESTROY: |
2050 | - cfpkt_extr_head(pkt, &linkid, 1); |
2051 | + linkid = cfpkt_extr_head_u8(pkt); |
2052 | cfctrl->res.linkdestroy_rsp(cfctrl->serv.layer.up, linkid); |
2053 | break; |
2054 | case CFCTRL_CMD_LINK_ERR: |
2055 | diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c |
2056 | index 100c86f1f547..7f1a85c6a614 100644 |
2057 | --- a/net/ipv4/ip_output.c |
2058 | +++ b/net/ipv4/ip_output.c |
2059 | @@ -492,6 +492,7 @@ static void ip_copy_metadata(struct sk_buff *to, struct sk_buff *from) |
2060 | to->pkt_type = from->pkt_type; |
2061 | to->priority = from->priority; |
2062 | to->protocol = from->protocol; |
2063 | + to->skb_iif = from->skb_iif; |
2064 | skb_dst_drop(to); |
2065 | skb_dst_copy(to, from); |
2066 | to->dev = from->dev; |
2067 | diff --git a/net/ipv6/ip6_flowlabel.c b/net/ipv6/ip6_flowlabel.c |
2068 | index b82e439804d1..8c2f9aedc2af 100644 |
2069 | --- a/net/ipv6/ip6_flowlabel.c |
2070 | +++ b/net/ipv6/ip6_flowlabel.c |
2071 | @@ -94,15 +94,21 @@ static struct ip6_flowlabel *fl_lookup(struct net *net, __be32 label) |
2072 | return fl; |
2073 | } |
2074 | |
2075 | +static void fl_free_rcu(struct rcu_head *head) |
2076 | +{ |
2077 | + struct ip6_flowlabel *fl = container_of(head, struct ip6_flowlabel, rcu); |
2078 | + |
2079 | + if (fl->share == IPV6_FL_S_PROCESS) |
2080 | + put_pid(fl->owner.pid); |
2081 | + kfree(fl->opt); |
2082 | + kfree(fl); |
2083 | +} |
2084 | + |
2085 | |
2086 | static void fl_free(struct ip6_flowlabel *fl) |
2087 | { |
2088 | - if (fl) { |
2089 | - if (fl->share == IPV6_FL_S_PROCESS) |
2090 | - put_pid(fl->owner.pid); |
2091 | - kfree(fl->opt); |
2092 | - kfree_rcu(fl, rcu); |
2093 | - } |
2094 | + if (fl) |
2095 | + call_rcu(&fl->rcu, fl_free_rcu); |
2096 | } |
2097 | |
2098 | static void fl_release(struct ip6_flowlabel *fl) |
2099 | @@ -634,9 +640,9 @@ recheck: |
2100 | if (fl1->share == IPV6_FL_S_EXCL || |
2101 | fl1->share != fl->share || |
2102 | ((fl1->share == IPV6_FL_S_PROCESS) && |
2103 | - (fl1->owner.pid == fl->owner.pid)) || |
2104 | + (fl1->owner.pid != fl->owner.pid)) || |
2105 | ((fl1->share == IPV6_FL_S_USER) && |
2106 | - uid_eq(fl1->owner.uid, fl->owner.uid))) |
2107 | + !uid_eq(fl1->owner.uid, fl->owner.uid))) |
2108 | goto release; |
2109 | |
2110 | err = -ENOMEM; |
2111 | diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c |
2112 | index 522d4ca715c9..ea37160d5ae2 100644 |
2113 | --- a/net/packet/af_packet.c |
2114 | +++ b/net/packet/af_packet.c |
2115 | @@ -2638,8 +2638,8 @@ static int tpacket_snd(struct packet_sock *po, struct msghdr *msg) |
2116 | void *ph; |
2117 | DECLARE_SOCKADDR(struct sockaddr_ll *, saddr, msg->msg_name); |
2118 | bool need_wait = !(msg->msg_flags & MSG_DONTWAIT); |
2119 | + unsigned char *addr = NULL; |
2120 | int tp_len, size_max; |
2121 | - unsigned char *addr; |
2122 | void *data; |
2123 | int len_sum = 0; |
2124 | int status = TP_STATUS_AVAILABLE; |
2125 | @@ -2650,7 +2650,6 @@ static int tpacket_snd(struct packet_sock *po, struct msghdr *msg) |
2126 | if (likely(saddr == NULL)) { |
2127 | dev = packet_cached_dev_get(po); |
2128 | proto = po->num; |
2129 | - addr = NULL; |
2130 | } else { |
2131 | err = -EINVAL; |
2132 | if (msg->msg_namelen < sizeof(struct sockaddr_ll)) |
2133 | @@ -2660,10 +2659,13 @@ static int tpacket_snd(struct packet_sock *po, struct msghdr *msg) |
2134 | sll_addr))) |
2135 | goto out; |
2136 | proto = saddr->sll_protocol; |
2137 | - addr = saddr->sll_halen ? saddr->sll_addr : NULL; |
2138 | dev = dev_get_by_index(sock_net(&po->sk), saddr->sll_ifindex); |
2139 | - if (addr && dev && saddr->sll_halen < dev->addr_len) |
2140 | - goto out_put; |
2141 | + if (po->sk.sk_socket->type == SOCK_DGRAM) { |
2142 | + if (dev && msg->msg_namelen < dev->addr_len + |
2143 | + offsetof(struct sockaddr_ll, sll_addr)) |
2144 | + goto out_put; |
2145 | + addr = saddr->sll_addr; |
2146 | + } |
2147 | } |
2148 | |
2149 | err = -ENXIO; |
2150 | @@ -2834,7 +2836,7 @@ static int packet_snd(struct socket *sock, struct msghdr *msg, size_t len) |
2151 | struct sk_buff *skb; |
2152 | struct net_device *dev; |
2153 | __be16 proto; |
2154 | - unsigned char *addr; |
2155 | + unsigned char *addr = NULL; |
2156 | int err, reserve = 0; |
2157 | struct sockcm_cookie sockc; |
2158 | struct virtio_net_hdr vnet_hdr = { 0 }; |
2159 | @@ -2851,7 +2853,6 @@ static int packet_snd(struct socket *sock, struct msghdr *msg, size_t len) |
2160 | if (likely(saddr == NULL)) { |
2161 | dev = packet_cached_dev_get(po); |
2162 | proto = po->num; |
2163 | - addr = NULL; |
2164 | } else { |
2165 | err = -EINVAL; |
2166 | if (msg->msg_namelen < sizeof(struct sockaddr_ll)) |
2167 | @@ -2859,10 +2860,13 @@ static int packet_snd(struct socket *sock, struct msghdr *msg, size_t len) |
2168 | if (msg->msg_namelen < (saddr->sll_halen + offsetof(struct sockaddr_ll, sll_addr))) |
2169 | goto out; |
2170 | proto = saddr->sll_protocol; |
2171 | - addr = saddr->sll_halen ? saddr->sll_addr : NULL; |
2172 | dev = dev_get_by_index(sock_net(sk), saddr->sll_ifindex); |
2173 | - if (addr && dev && saddr->sll_halen < dev->addr_len) |
2174 | - goto out_unlock; |
2175 | + if (sock->type == SOCK_DGRAM) { |
2176 | + if (dev && msg->msg_namelen < dev->addr_len + |
2177 | + offsetof(struct sockaddr_ll, sll_addr)) |
2178 | + goto out_unlock; |
2179 | + addr = saddr->sll_addr; |
2180 | + } |
2181 | } |
2182 | |
2183 | err = -ENXIO; |
2184 | diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c |
2185 | index 9bd6f97ccd21..772df402c495 100644 |
2186 | --- a/security/selinux/hooks.c |
2187 | +++ b/security/selinux/hooks.c |
2188 | @@ -467,21 +467,43 @@ static int may_context_mount_inode_relabel(u32 sid, |
2189 | return rc; |
2190 | } |
2191 | |
2192 | -static int selinux_is_sblabel_mnt(struct super_block *sb) |
2193 | +static int selinux_is_genfs_special_handling(struct super_block *sb) |
2194 | { |
2195 | - struct superblock_security_struct *sbsec = sb->s_security; |
2196 | - |
2197 | - return sbsec->behavior == SECURITY_FS_USE_XATTR || |
2198 | - sbsec->behavior == SECURITY_FS_USE_TRANS || |
2199 | - sbsec->behavior == SECURITY_FS_USE_TASK || |
2200 | - sbsec->behavior == SECURITY_FS_USE_NATIVE || |
2201 | - /* Special handling. Genfs but also in-core setxattr handler */ |
2202 | - !strcmp(sb->s_type->name, "sysfs") || |
2203 | + /* Special handling. Genfs but also in-core setxattr handler */ |
2204 | + return !strcmp(sb->s_type->name, "sysfs") || |
2205 | !strcmp(sb->s_type->name, "pstore") || |
2206 | !strcmp(sb->s_type->name, "debugfs") || |
2207 | !strcmp(sb->s_type->name, "rootfs"); |
2208 | } |
2209 | |
2210 | +static int selinux_is_sblabel_mnt(struct super_block *sb) |
2211 | +{ |
2212 | + struct superblock_security_struct *sbsec = sb->s_security; |
2213 | + |
2214 | + /* |
2215 | + * IMPORTANT: Double-check logic in this function when adding a new |
2216 | + * SECURITY_FS_USE_* definition! |
2217 | + */ |
2218 | + BUILD_BUG_ON(SECURITY_FS_USE_MAX != 7); |
2219 | + |
2220 | + switch (sbsec->behavior) { |
2221 | + case SECURITY_FS_USE_XATTR: |
2222 | + case SECURITY_FS_USE_TRANS: |
2223 | + case SECURITY_FS_USE_TASK: |
2224 | + case SECURITY_FS_USE_NATIVE: |
2225 | + return 1; |
2226 | + |
2227 | + case SECURITY_FS_USE_GENFS: |
2228 | + return selinux_is_genfs_special_handling(sb); |
2229 | + |
2230 | + /* Never allow relabeling on context mounts */ |
2231 | + case SECURITY_FS_USE_MNTPOINT: |
2232 | + case SECURITY_FS_USE_NONE: |
2233 | + default: |
2234 | + return 0; |
2235 | + } |
2236 | +} |
2237 | + |
2238 | static int sb_finish_set_opts(struct super_block *sb) |
2239 | { |
2240 | struct superblock_security_struct *sbsec = sb->s_security; |
2241 | diff --git a/sound/usb/line6/driver.c b/sound/usb/line6/driver.c |
2242 | index 58d624938a9f..09189249d0d1 100644 |
2243 | --- a/sound/usb/line6/driver.c |
2244 | +++ b/sound/usb/line6/driver.c |
2245 | @@ -337,12 +337,16 @@ int line6_read_data(struct usb_line6 *line6, unsigned address, void *data, |
2246 | { |
2247 | struct usb_device *usbdev = line6->usbdev; |
2248 | int ret; |
2249 | - unsigned char len; |
2250 | + unsigned char *len; |
2251 | unsigned count; |
2252 | |
2253 | if (address > 0xffff || datalen > 0xff) |
2254 | return -EINVAL; |
2255 | |
2256 | + len = kmalloc(sizeof(*len), GFP_KERNEL); |
2257 | + if (!len) |
2258 | + return -ENOMEM; |
2259 | + |
2260 | /* query the serial number: */ |
2261 | ret = usb_control_msg(usbdev, usb_sndctrlpipe(usbdev, 0), 0x67, |
2262 | USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT, |
2263 | @@ -351,7 +355,7 @@ int line6_read_data(struct usb_line6 *line6, unsigned address, void *data, |
2264 | |
2265 | if (ret < 0) { |
2266 | dev_err(line6->ifcdev, "read request failed (error %d)\n", ret); |
2267 | - return ret; |
2268 | + goto exit; |
2269 | } |
2270 | |
2271 | /* Wait for data length. We'll get 0xff until length arrives. */ |
2272 | @@ -361,28 +365,29 @@ int line6_read_data(struct usb_line6 *line6, unsigned address, void *data, |
2273 | ret = usb_control_msg(usbdev, usb_rcvctrlpipe(usbdev, 0), 0x67, |
2274 | USB_TYPE_VENDOR | USB_RECIP_DEVICE | |
2275 | USB_DIR_IN, |
2276 | - 0x0012, 0x0000, &len, 1, |
2277 | + 0x0012, 0x0000, len, 1, |
2278 | LINE6_TIMEOUT * HZ); |
2279 | if (ret < 0) { |
2280 | dev_err(line6->ifcdev, |
2281 | "receive length failed (error %d)\n", ret); |
2282 | - return ret; |
2283 | + goto exit; |
2284 | } |
2285 | |
2286 | - if (len != 0xff) |
2287 | + if (*len != 0xff) |
2288 | break; |
2289 | } |
2290 | |
2291 | - if (len == 0xff) { |
2292 | + ret = -EIO; |
2293 | + if (*len == 0xff) { |
2294 | dev_err(line6->ifcdev, "read failed after %d retries\n", |
2295 | count); |
2296 | - return -EIO; |
2297 | - } else if (len != datalen) { |
2298 | + goto exit; |
2299 | + } else if (*len != datalen) { |
2300 | /* should be equal or something went wrong */ |
2301 | dev_err(line6->ifcdev, |
2302 | "length mismatch (expected %d, got %d)\n", |
2303 | - (int)datalen, (int)len); |
2304 | - return -EIO; |
2305 | + (int)datalen, (int)*len); |
2306 | + goto exit; |
2307 | } |
2308 | |
2309 | /* receive the result: */ |
2310 | @@ -391,12 +396,12 @@ int line6_read_data(struct usb_line6 *line6, unsigned address, void *data, |
2311 | 0x0013, 0x0000, data, datalen, |
2312 | LINE6_TIMEOUT * HZ); |
2313 | |
2314 | - if (ret < 0) { |
2315 | + if (ret < 0) |
2316 | dev_err(line6->ifcdev, "read failed (error %d)\n", ret); |
2317 | - return ret; |
2318 | - } |
2319 | |
2320 | - return 0; |
2321 | +exit: |
2322 | + kfree(len); |
2323 | + return ret; |
2324 | } |
2325 | EXPORT_SYMBOL_GPL(line6_read_data); |
2326 | |
2327 | @@ -408,12 +413,16 @@ int line6_write_data(struct usb_line6 *line6, unsigned address, void *data, |
2328 | { |
2329 | struct usb_device *usbdev = line6->usbdev; |
2330 | int ret; |
2331 | - unsigned char status; |
2332 | + unsigned char *status; |
2333 | int count; |
2334 | |
2335 | if (address > 0xffff || datalen > 0xffff) |
2336 | return -EINVAL; |
2337 | |
2338 | + status = kmalloc(sizeof(*status), GFP_KERNEL); |
2339 | + if (!status) |
2340 | + return -ENOMEM; |
2341 | + |
2342 | ret = usb_control_msg(usbdev, usb_sndctrlpipe(usbdev, 0), 0x67, |
2343 | USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT, |
2344 | 0x0022, address, data, datalen, |
2345 | @@ -422,7 +431,7 @@ int line6_write_data(struct usb_line6 *line6, unsigned address, void *data, |
2346 | if (ret < 0) { |
2347 | dev_err(line6->ifcdev, |
2348 | "write request failed (error %d)\n", ret); |
2349 | - return ret; |
2350 | + goto exit; |
2351 | } |
2352 | |
2353 | for (count = 0; count < LINE6_READ_WRITE_MAX_RETRIES; count++) { |
2354 | @@ -433,28 +442,29 @@ int line6_write_data(struct usb_line6 *line6, unsigned address, void *data, |
2355 | USB_TYPE_VENDOR | USB_RECIP_DEVICE | |
2356 | USB_DIR_IN, |
2357 | 0x0012, 0x0000, |
2358 | - &status, 1, LINE6_TIMEOUT * HZ); |
2359 | + status, 1, LINE6_TIMEOUT * HZ); |
2360 | |
2361 | if (ret < 0) { |
2362 | dev_err(line6->ifcdev, |
2363 | "receiving status failed (error %d)\n", ret); |
2364 | - return ret; |
2365 | + goto exit; |
2366 | } |
2367 | |
2368 | - if (status != 0xff) |
2369 | + if (*status != 0xff) |
2370 | break; |
2371 | } |
2372 | |
2373 | - if (status == 0xff) { |
2374 | + if (*status == 0xff) { |
2375 | dev_err(line6->ifcdev, "write failed after %d retries\n", |
2376 | count); |
2377 | - return -EIO; |
2378 | - } else if (status != 0) { |
2379 | + ret = -EIO; |
2380 | + } else if (*status != 0) { |
2381 | dev_err(line6->ifcdev, "write failed (error %d)\n", ret); |
2382 | - return -EIO; |
2383 | + ret = -EIO; |
2384 | } |
2385 | - |
2386 | - return 0; |
2387 | +exit: |
2388 | + kfree(status); |
2389 | + return ret; |
2390 | } |
2391 | EXPORT_SYMBOL_GPL(line6_write_data); |
2392 | |
2393 | diff --git a/sound/usb/line6/podhd.c b/sound/usb/line6/podhd.c |
2394 | index 5ab9e0c89211..c0b6733c0623 100644 |
2395 | --- a/sound/usb/line6/podhd.c |
2396 | +++ b/sound/usb/line6/podhd.c |
2397 | @@ -221,28 +221,32 @@ static void podhd_startup_start_workqueue(unsigned long data) |
2398 | static int podhd_dev_start(struct usb_line6_podhd *pod) |
2399 | { |
2400 | int ret; |
2401 | - u8 init_bytes[8]; |
2402 | + u8 *init_bytes; |
2403 | int i; |
2404 | struct usb_device *usbdev = pod->line6.usbdev; |
2405 | |
2406 | + init_bytes = kmalloc(8, GFP_KERNEL); |
2407 | + if (!init_bytes) |
2408 | + return -ENOMEM; |
2409 | + |
2410 | ret = usb_control_msg(usbdev, usb_sndctrlpipe(usbdev, 0), |
2411 | 0x67, USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT, |
2412 | 0x11, 0, |
2413 | NULL, 0, LINE6_TIMEOUT * HZ); |
2414 | if (ret < 0) { |
2415 | dev_err(pod->line6.ifcdev, "read request failed (error %d)\n", ret); |
2416 | - return ret; |
2417 | + goto exit; |
2418 | } |
2419 | |
2420 | /* NOTE: looks like some kind of ping message */ |
2421 | ret = usb_control_msg(usbdev, usb_rcvctrlpipe(usbdev, 0), 0x67, |
2422 | USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN, |
2423 | 0x11, 0x0, |
2424 | - &init_bytes, 3, LINE6_TIMEOUT * HZ); |
2425 | + init_bytes, 3, LINE6_TIMEOUT * HZ); |
2426 | if (ret < 0) { |
2427 | dev_err(pod->line6.ifcdev, |
2428 | "receive length failed (error %d)\n", ret); |
2429 | - return ret; |
2430 | + goto exit; |
2431 | } |
2432 | |
2433 | pod->firmware_version = |
2434 | @@ -251,7 +255,7 @@ static int podhd_dev_start(struct usb_line6_podhd *pod) |
2435 | for (i = 0; i <= 16; i++) { |
2436 | ret = line6_read_data(&pod->line6, 0xf000 + 0x08 * i, init_bytes, 8); |
2437 | if (ret < 0) |
2438 | - return ret; |
2439 | + goto exit; |
2440 | } |
2441 | |
2442 | ret = usb_control_msg(usbdev, usb_sndctrlpipe(usbdev, 0), |
2443 | @@ -259,10 +263,9 @@ static int podhd_dev_start(struct usb_line6_podhd *pod) |
2444 | USB_TYPE_STANDARD | USB_RECIP_DEVICE | USB_DIR_OUT, |
2445 | 1, 0, |
2446 | NULL, 0, LINE6_TIMEOUT * HZ); |
2447 | - if (ret < 0) |
2448 | - return ret; |
2449 | - |
2450 | - return 0; |
2451 | +exit: |
2452 | + kfree(init_bytes); |
2453 | + return ret; |
2454 | } |
2455 | |
2456 | static void podhd_startup_workqueue(struct work_struct *work) |
2457 | diff --git a/sound/usb/line6/toneport.c b/sound/usb/line6/toneport.c |
2458 | index 8e22f430d700..d3871d99ade4 100644 |
2459 | --- a/sound/usb/line6/toneport.c |
2460 | +++ b/sound/usb/line6/toneport.c |
2461 | @@ -365,15 +365,20 @@ static bool toneport_has_source_select(struct usb_line6_toneport *toneport) |
2462 | /* |
2463 | Setup Toneport device. |
2464 | */ |
2465 | -static void toneport_setup(struct usb_line6_toneport *toneport) |
2466 | +static int toneport_setup(struct usb_line6_toneport *toneport) |
2467 | { |
2468 | - int ticks; |
2469 | + int *ticks; |
2470 | struct usb_line6 *line6 = &toneport->line6; |
2471 | struct usb_device *usbdev = line6->usbdev; |
2472 | |
2473 | + ticks = kmalloc(sizeof(*ticks), GFP_KERNEL); |
2474 | + if (!ticks) |
2475 | + return -ENOMEM; |
2476 | + |
2477 | /* sync time on device with host: */ |
2478 | - ticks = (int)get_seconds(); |
2479 | - line6_write_data(line6, 0x80c6, &ticks, 4); |
2480 | + *ticks = (int)get_seconds(); |
2481 | + line6_write_data(line6, 0x80c6, ticks, 4); |
2482 | + kfree(ticks); |
2483 | |
2484 | /* enable device: */ |
2485 | toneport_send_cmd(usbdev, 0x0301, 0x0000); |
2486 | @@ -388,6 +393,7 @@ static void toneport_setup(struct usb_line6_toneport *toneport) |
2487 | toneport_update_led(toneport); |
2488 | |
2489 | mod_timer(&toneport->timer, jiffies + TONEPORT_PCM_DELAY * HZ); |
2490 | + return 0; |
2491 | } |
2492 | |
2493 | /* |
2494 | @@ -451,7 +457,9 @@ static int toneport_init(struct usb_line6 *line6, |
2495 | return err; |
2496 | } |
2497 | |
2498 | - toneport_setup(toneport); |
2499 | + err = toneport_setup(toneport); |
2500 | + if (err) |
2501 | + return err; |
2502 | |
2503 | /* register audio system: */ |
2504 | return snd_card_register(line6->card); |
2505 | @@ -463,7 +471,11 @@ static int toneport_init(struct usb_line6 *line6, |
2506 | */ |
2507 | static int toneport_reset_resume(struct usb_interface *interface) |
2508 | { |
2509 | - toneport_setup(usb_get_intfdata(interface)); |
2510 | + int err; |
2511 | + |
2512 | + err = toneport_setup(usb_get_intfdata(interface)); |
2513 | + if (err) |
2514 | + return err; |
2515 | return line6_resume(interface); |
2516 | } |
2517 | #endif |