Contents of /trunk/kernel-alx/patches-4.9/0135-4.9.36-all-fixes.patch
Parent Directory | Revision Log
Revision 2956 -
(show annotations)
(download)
Mon Jul 24 12:03:46 2017 UTC (7 years, 2 months ago) by niro
File size: 211990 byte(s)
Mon Jul 24 12:03:46 2017 UTC (7 years, 2 months ago) by niro
File size: 211990 byte(s)
-added patches-4.9
1 | diff --git a/Documentation/devicetree/bindings/net/mediatek-net.txt b/Documentation/devicetree/bindings/net/mediatek-net.txt |
2 | index c010fafc66a8..c7194e87d5f4 100644 |
3 | --- a/Documentation/devicetree/bindings/net/mediatek-net.txt |
4 | +++ b/Documentation/devicetree/bindings/net/mediatek-net.txt |
5 | @@ -7,7 +7,7 @@ have dual GMAC each represented by a child node.. |
6 | * Ethernet controller node |
7 | |
8 | Required properties: |
9 | -- compatible: Should be "mediatek,mt7623-eth" |
10 | +- compatible: Should be "mediatek,mt2701-eth" |
11 | - reg: Address and length of the register set for the device |
12 | - interrupts: Should contain the three frame engines interrupts in numeric |
13 | order. These are fe_int0, fe_int1 and fe_int2. |
14 | diff --git a/Documentation/devicetree/bindings/net/phy.txt b/Documentation/devicetree/bindings/net/phy.txt |
15 | index bc1c3c8bf8fa..62bdc5f2bf16 100644 |
16 | --- a/Documentation/devicetree/bindings/net/phy.txt |
17 | +++ b/Documentation/devicetree/bindings/net/phy.txt |
18 | @@ -35,6 +35,15 @@ Optional Properties: |
19 | - broken-turn-around: If set, indicates the PHY device does not correctly |
20 | release the turn around line low at the end of a MDIO transaction. |
21 | |
22 | +- eee-broken-100tx: |
23 | +- eee-broken-1000t: |
24 | +- eee-broken-10gt: |
25 | +- eee-broken-1000kx: |
26 | +- eee-broken-10gkx4: |
27 | +- eee-broken-10gkr: |
28 | + Mark the corresponding energy efficient ethernet mode as broken and |
29 | + request the ethernet to stop advertising it. |
30 | + |
31 | Example: |
32 | |
33 | ethernet-phy@0 { |
34 | diff --git a/Documentation/devicetree/bindings/net/ti,dp83867.txt b/Documentation/devicetree/bindings/net/ti,dp83867.txt |
35 | index 5d21141a68b5..75bcaa355880 100644 |
36 | --- a/Documentation/devicetree/bindings/net/ti,dp83867.txt |
37 | +++ b/Documentation/devicetree/bindings/net/ti,dp83867.txt |
38 | @@ -3,9 +3,11 @@ |
39 | Required properties: |
40 | - reg - The ID number for the phy, usually a small integer |
41 | - ti,rx-internal-delay - RGMII Receive Clock Delay - see dt-bindings/net/ti-dp83867.h |
42 | - for applicable values |
43 | + for applicable values. Required only if interface type is |
44 | + PHY_INTERFACE_MODE_RGMII_ID or PHY_INTERFACE_MODE_RGMII_RXID |
45 | - ti,tx-internal-delay - RGMII Transmit Clock Delay - see dt-bindings/net/ti-dp83867.h |
46 | - for applicable values |
47 | + for applicable values. Required only if interface type is |
48 | + PHY_INTERFACE_MODE_RGMII_ID or PHY_INTERFACE_MODE_RGMII_TXID |
49 | - ti,fifo-depth - Transmitt FIFO depth- see dt-bindings/net/ti-dp83867.h |
50 | for applicable values |
51 | |
52 | diff --git a/Makefile b/Makefile |
53 | index 0a8d47465f97..4263dca12f07 100644 |
54 | --- a/Makefile |
55 | +++ b/Makefile |
56 | @@ -1,6 +1,6 @@ |
57 | VERSION = 4 |
58 | PATCHLEVEL = 9 |
59 | -SUBLEVEL = 35 |
60 | +SUBLEVEL = 36 |
61 | EXTRAVERSION = |
62 | NAME = Roaring Lionus |
63 | |
64 | diff --git a/arch/arm/boot/dts/logicpd-torpedo-som.dtsi b/arch/arm/boot/dts/logicpd-torpedo-som.dtsi |
65 | index 8f9a69ca818c..efe53998c961 100644 |
66 | --- a/arch/arm/boot/dts/logicpd-torpedo-som.dtsi |
67 | +++ b/arch/arm/boot/dts/logicpd-torpedo-som.dtsi |
68 | @@ -121,7 +121,7 @@ |
69 | &i2c3 { |
70 | clock-frequency = <400000>; |
71 | at24@50 { |
72 | - compatible = "at24,24c02"; |
73 | + compatible = "atmel,24c64"; |
74 | readonly; |
75 | reg = <0x50>; |
76 | }; |
77 | diff --git a/arch/arm/mach-omap2/omap_device.c b/arch/arm/mach-omap2/omap_device.c |
78 | index e920dd83e443..f989145480c8 100644 |
79 | --- a/arch/arm/mach-omap2/omap_device.c |
80 | +++ b/arch/arm/mach-omap2/omap_device.c |
81 | @@ -222,6 +222,14 @@ static int _omap_device_notifier_call(struct notifier_block *nb, |
82 | dev_err(dev, "failed to idle\n"); |
83 | } |
84 | break; |
85 | + case BUS_NOTIFY_BIND_DRIVER: |
86 | + od = to_omap_device(pdev); |
87 | + if (od && (od->_state == OMAP_DEVICE_STATE_ENABLED) && |
88 | + pm_runtime_status_suspended(dev)) { |
89 | + od->_driver_status = BUS_NOTIFY_BIND_DRIVER; |
90 | + pm_runtime_set_active(dev); |
91 | + } |
92 | + break; |
93 | case BUS_NOTIFY_ADD_DEVICE: |
94 | if (pdev->dev.of_node) |
95 | omap_device_build_from_dt(pdev); |
96 | diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c |
97 | index 5cbfd9f86412..f7c741358f37 100644 |
98 | --- a/arch/arm/mm/mmu.c |
99 | +++ b/arch/arm/mm/mmu.c |
100 | @@ -1211,15 +1211,15 @@ void __init adjust_lowmem_bounds(void) |
101 | |
102 | high_memory = __va(arm_lowmem_limit - 1) + 1; |
103 | |
104 | + if (!memblock_limit) |
105 | + memblock_limit = arm_lowmem_limit; |
106 | + |
107 | /* |
108 | * Round the memblock limit down to a pmd size. This |
109 | * helps to ensure that we will allocate memory from the |
110 | * last full pmd, which should be mapped. |
111 | */ |
112 | - if (memblock_limit) |
113 | - memblock_limit = round_down(memblock_limit, PMD_SIZE); |
114 | - if (!memblock_limit) |
115 | - memblock_limit = arm_lowmem_limit; |
116 | + memblock_limit = round_down(memblock_limit, PMD_SIZE); |
117 | |
118 | if (!IS_ENABLED(CONFIG_HIGHMEM) || cache_is_vipt_aliasing()) { |
119 | if (memblock_end_of_DRAM() > arm_lowmem_limit) { |
120 | diff --git a/arch/arm64/boot/dts/amlogic/meson-gxbb-odroidc2.dts b/arch/arm64/boot/dts/amlogic/meson-gxbb-odroidc2.dts |
121 | index e6e3491d48a5..f150a4c63efe 100644 |
122 | --- a/arch/arm64/boot/dts/amlogic/meson-gxbb-odroidc2.dts |
123 | +++ b/arch/arm64/boot/dts/amlogic/meson-gxbb-odroidc2.dts |
124 | @@ -85,6 +85,18 @@ |
125 | status = "okay"; |
126 | pinctrl-0 = <ð_pins>; |
127 | pinctrl-names = "default"; |
128 | + phy-handle = <ð_phy0>; |
129 | + |
130 | + mdio { |
131 | + compatible = "snps,dwmac-mdio"; |
132 | + #address-cells = <1>; |
133 | + #size-cells = <0>; |
134 | + |
135 | + eth_phy0: ethernet-phy@0 { |
136 | + reg = <0>; |
137 | + eee-broken-1000t; |
138 | + }; |
139 | + }; |
140 | }; |
141 | |
142 | &ir { |
143 | diff --git a/arch/arm64/include/asm/acpi.h b/arch/arm64/include/asm/acpi.h |
144 | index e517088d635f..de04879bc8b8 100644 |
145 | --- a/arch/arm64/include/asm/acpi.h |
146 | +++ b/arch/arm64/include/asm/acpi.h |
147 | @@ -22,9 +22,9 @@ |
148 | #define ACPI_MADT_GICC_LENGTH \ |
149 | (acpi_gbl_FADT.header.revision < 6 ? 76 : 80) |
150 | |
151 | -#define BAD_MADT_GICC_ENTRY(entry, end) \ |
152 | - (!(entry) || (unsigned long)(entry) + sizeof(*(entry)) > (end) || \ |
153 | - (entry)->header.length != ACPI_MADT_GICC_LENGTH) |
154 | +#define BAD_MADT_GICC_ENTRY(entry, end) \ |
155 | + (!(entry) || (entry)->header.length != ACPI_MADT_GICC_LENGTH || \ |
156 | + (unsigned long)(entry) + ACPI_MADT_GICC_LENGTH > (end)) |
157 | |
158 | /* Basic configuration for ACPI */ |
159 | #ifdef CONFIG_ACPI |
160 | diff --git a/arch/arm64/include/asm/assembler.h b/arch/arm64/include/asm/assembler.h |
161 | index 28bfe6132eb6..851290d2bfe3 100644 |
162 | --- a/arch/arm64/include/asm/assembler.h |
163 | +++ b/arch/arm64/include/asm/assembler.h |
164 | @@ -155,22 +155,25 @@ lr .req x30 // link register |
165 | |
166 | /* |
167 | * Pseudo-ops for PC-relative adr/ldr/str <reg>, <symbol> where |
168 | - * <symbol> is within the range +/- 4 GB of the PC. |
169 | + * <symbol> is within the range +/- 4 GB of the PC when running |
170 | + * in core kernel context. In module context, a movz/movk sequence |
171 | + * is used, since modules may be loaded far away from the kernel |
172 | + * when KASLR is in effect. |
173 | */ |
174 | /* |
175 | * @dst: destination register (64 bit wide) |
176 | * @sym: name of the symbol |
177 | - * @tmp: optional scratch register to be used if <dst> == sp, which |
178 | - * is not allowed in an adrp instruction |
179 | */ |
180 | - .macro adr_l, dst, sym, tmp= |
181 | - .ifb \tmp |
182 | + .macro adr_l, dst, sym |
183 | +#ifndef MODULE |
184 | adrp \dst, \sym |
185 | add \dst, \dst, :lo12:\sym |
186 | - .else |
187 | - adrp \tmp, \sym |
188 | - add \dst, \tmp, :lo12:\sym |
189 | - .endif |
190 | +#else |
191 | + movz \dst, #:abs_g3:\sym |
192 | + movk \dst, #:abs_g2_nc:\sym |
193 | + movk \dst, #:abs_g1_nc:\sym |
194 | + movk \dst, #:abs_g0_nc:\sym |
195 | +#endif |
196 | .endm |
197 | |
198 | /* |
199 | @@ -181,6 +184,7 @@ lr .req x30 // link register |
200 | * the address |
201 | */ |
202 | .macro ldr_l, dst, sym, tmp= |
203 | +#ifndef MODULE |
204 | .ifb \tmp |
205 | adrp \dst, \sym |
206 | ldr \dst, [\dst, :lo12:\sym] |
207 | @@ -188,6 +192,15 @@ lr .req x30 // link register |
208 | adrp \tmp, \sym |
209 | ldr \dst, [\tmp, :lo12:\sym] |
210 | .endif |
211 | +#else |
212 | + .ifb \tmp |
213 | + adr_l \dst, \sym |
214 | + ldr \dst, [\dst] |
215 | + .else |
216 | + adr_l \tmp, \sym |
217 | + ldr \dst, [\tmp] |
218 | + .endif |
219 | +#endif |
220 | .endm |
221 | |
222 | /* |
223 | @@ -197,8 +210,13 @@ lr .req x30 // link register |
224 | * while <src> needs to be preserved. |
225 | */ |
226 | .macro str_l, src, sym, tmp |
227 | +#ifndef MODULE |
228 | adrp \tmp, \sym |
229 | str \src, [\tmp, :lo12:\sym] |
230 | +#else |
231 | + adr_l \tmp, \sym |
232 | + str \src, [\tmp] |
233 | +#endif |
234 | .endm |
235 | |
236 | /* |
237 | diff --git a/arch/arm64/kernel/smp.c b/arch/arm64/kernel/smp.c |
238 | index 8507703dabe4..a70f7d3361c4 100644 |
239 | --- a/arch/arm64/kernel/smp.c |
240 | +++ b/arch/arm64/kernel/smp.c |
241 | @@ -934,7 +934,7 @@ static bool have_cpu_die(void) |
242 | #ifdef CONFIG_HOTPLUG_CPU |
243 | int any_cpu = raw_smp_processor_id(); |
244 | |
245 | - if (cpu_ops[any_cpu]->cpu_die) |
246 | + if (cpu_ops[any_cpu] && cpu_ops[any_cpu]->cpu_die) |
247 | return true; |
248 | #endif |
249 | return false; |
250 | diff --git a/arch/mips/kernel/entry.S b/arch/mips/kernel/entry.S |
251 | index 7791840cf22c..db07793f7b43 100644 |
252 | --- a/arch/mips/kernel/entry.S |
253 | +++ b/arch/mips/kernel/entry.S |
254 | @@ -11,6 +11,7 @@ |
255 | #include <asm/asm.h> |
256 | #include <asm/asmmacro.h> |
257 | #include <asm/compiler.h> |
258 | +#include <asm/irqflags.h> |
259 | #include <asm/regdef.h> |
260 | #include <asm/mipsregs.h> |
261 | #include <asm/stackframe.h> |
262 | @@ -137,6 +138,7 @@ work_pending: |
263 | andi t0, a2, _TIF_NEED_RESCHED # a2 is preloaded with TI_FLAGS |
264 | beqz t0, work_notifysig |
265 | work_resched: |
266 | + TRACE_IRQS_OFF |
267 | jal schedule |
268 | |
269 | local_irq_disable # make sure need_resched and |
270 | @@ -173,6 +175,7 @@ syscall_exit_work: |
271 | beqz t0, work_pending # trace bit set? |
272 | local_irq_enable # could let syscall_trace_leave() |
273 | # call schedule() instead |
274 | + TRACE_IRQS_ON |
275 | move a0, sp |
276 | jal syscall_trace_leave |
277 | b resume_userspace |
278 | diff --git a/arch/mips/kernel/head.S b/arch/mips/kernel/head.S |
279 | index cf052204eb0a..d1bb506adc10 100644 |
280 | --- a/arch/mips/kernel/head.S |
281 | +++ b/arch/mips/kernel/head.S |
282 | @@ -106,8 +106,8 @@ NESTED(kernel_entry, 16, sp) # kernel entry point |
283 | beq t0, t1, dtb_found |
284 | #endif |
285 | li t1, -2 |
286 | - beq a0, t1, dtb_found |
287 | move t2, a1 |
288 | + beq a0, t1, dtb_found |
289 | |
290 | li t2, 0 |
291 | dtb_found: |
292 | diff --git a/arch/mips/kernel/pm-cps.c b/arch/mips/kernel/pm-cps.c |
293 | index 7cf653e21423..60c4d4599639 100644 |
294 | --- a/arch/mips/kernel/pm-cps.c |
295 | +++ b/arch/mips/kernel/pm-cps.c |
296 | @@ -56,7 +56,6 @@ DECLARE_BITMAP(state_support, CPS_PM_STATE_COUNT); |
297 | * state. Actually per-core rather than per-CPU. |
298 | */ |
299 | static DEFINE_PER_CPU_ALIGNED(u32*, ready_count); |
300 | -static DEFINE_PER_CPU_ALIGNED(void*, ready_count_alloc); |
301 | |
302 | /* Indicates online CPUs coupled with the current CPU */ |
303 | static DEFINE_PER_CPU_ALIGNED(cpumask_t, online_coupled); |
304 | @@ -642,7 +641,6 @@ static int cps_pm_online_cpu(unsigned int cpu) |
305 | { |
306 | enum cps_pm_state state; |
307 | unsigned core = cpu_data[cpu].core; |
308 | - unsigned dlinesz = cpu_data[cpu].dcache.linesz; |
309 | void *entry_fn, *core_rc; |
310 | |
311 | for (state = CPS_PM_NC_WAIT; state < CPS_PM_STATE_COUNT; state++) { |
312 | @@ -662,16 +660,11 @@ static int cps_pm_online_cpu(unsigned int cpu) |
313 | } |
314 | |
315 | if (!per_cpu(ready_count, core)) { |
316 | - core_rc = kmalloc(dlinesz * 2, GFP_KERNEL); |
317 | + core_rc = kmalloc(sizeof(u32), GFP_KERNEL); |
318 | if (!core_rc) { |
319 | pr_err("Failed allocate core %u ready_count\n", core); |
320 | return -ENOMEM; |
321 | } |
322 | - per_cpu(ready_count_alloc, core) = core_rc; |
323 | - |
324 | - /* Ensure ready_count is aligned to a cacheline boundary */ |
325 | - core_rc += dlinesz - 1; |
326 | - core_rc = (void *)((unsigned long)core_rc & ~(dlinesz - 1)); |
327 | per_cpu(ready_count, core) = core_rc; |
328 | } |
329 | |
330 | diff --git a/arch/mips/kernel/traps.c b/arch/mips/kernel/traps.c |
331 | index ec87ef93267b..b0b29cb6f3d8 100644 |
332 | --- a/arch/mips/kernel/traps.c |
333 | +++ b/arch/mips/kernel/traps.c |
334 | @@ -199,6 +199,8 @@ void show_stack(struct task_struct *task, unsigned long *sp) |
335 | { |
336 | struct pt_regs regs; |
337 | mm_segment_t old_fs = get_fs(); |
338 | + |
339 | + regs.cp0_status = KSU_KERNEL; |
340 | if (sp) { |
341 | regs.regs[29] = (unsigned long)sp; |
342 | regs.regs[31] = 0; |
343 | diff --git a/arch/powerpc/kernel/eeh.c b/arch/powerpc/kernel/eeh.c |
344 | index f25731627d7f..e5bfbf62827a 100644 |
345 | --- a/arch/powerpc/kernel/eeh.c |
346 | +++ b/arch/powerpc/kernel/eeh.c |
347 | @@ -298,9 +298,17 @@ void eeh_slot_error_detail(struct eeh_pe *pe, int severity) |
348 | * |
349 | * For pHyp, we have to enable IO for log retrieval. Otherwise, |
350 | * 0xFF's is always returned from PCI config space. |
351 | + * |
352 | + * When the @severity is EEH_LOG_PERM, the PE is going to be |
353 | + * removed. Prior to that, the drivers for devices included in |
354 | + * the PE will be closed. The drivers rely on working IO path |
355 | + * to bring the devices to quiet state. Otherwise, PCI traffic |
356 | + * from those devices after they are removed is like to cause |
357 | + * another unexpected EEH error. |
358 | */ |
359 | if (!(pe->type & EEH_PE_PHB)) { |
360 | - if (eeh_has_flag(EEH_ENABLE_IO_FOR_LOG)) |
361 | + if (eeh_has_flag(EEH_ENABLE_IO_FOR_LOG) || |
362 | + severity == EEH_LOG_PERM) |
363 | eeh_pci_enable(pe, EEH_OPT_THAW_MMIO); |
364 | |
365 | /* |
366 | diff --git a/arch/s390/include/asm/ctl_reg.h b/arch/s390/include/asm/ctl_reg.h |
367 | index d7697ab802f6..8e136b88cdf4 100644 |
368 | --- a/arch/s390/include/asm/ctl_reg.h |
369 | +++ b/arch/s390/include/asm/ctl_reg.h |
370 | @@ -15,7 +15,9 @@ |
371 | BUILD_BUG_ON(sizeof(addrtype) != (high - low + 1) * sizeof(long));\ |
372 | asm volatile( \ |
373 | " lctlg %1,%2,%0\n" \ |
374 | - : : "Q" (*(addrtype *)(&array)), "i" (low), "i" (high));\ |
375 | + : \ |
376 | + : "Q" (*(addrtype *)(&array)), "i" (low), "i" (high) \ |
377 | + : "memory"); \ |
378 | } |
379 | |
380 | #define __ctl_store(array, low, high) { \ |
381 | diff --git a/arch/sparc/kernel/irq_64.c b/arch/sparc/kernel/irq_64.c |
382 | index e1b1ce63a328..5cbf03c14981 100644 |
383 | --- a/arch/sparc/kernel/irq_64.c |
384 | +++ b/arch/sparc/kernel/irq_64.c |
385 | @@ -1021,7 +1021,7 @@ static void __init alloc_one_queue(unsigned long *pa_ptr, unsigned long qmask) |
386 | unsigned long order = get_order(size); |
387 | unsigned long p; |
388 | |
389 | - p = __get_free_pages(GFP_KERNEL, order); |
390 | + p = __get_free_pages(GFP_KERNEL | __GFP_ZERO, order); |
391 | if (!p) { |
392 | prom_printf("SUN4V: Error, cannot allocate queue.\n"); |
393 | prom_halt(); |
394 | diff --git a/arch/sparc/kernel/traps_64.c b/arch/sparc/kernel/traps_64.c |
395 | index 496fa926e1e0..d44fb806bbd7 100644 |
396 | --- a/arch/sparc/kernel/traps_64.c |
397 | +++ b/arch/sparc/kernel/traps_64.c |
398 | @@ -2051,6 +2051,73 @@ void sun4v_resum_overflow(struct pt_regs *regs) |
399 | atomic_inc(&sun4v_resum_oflow_cnt); |
400 | } |
401 | |
402 | +/* Given a set of registers, get the virtual addressi that was being accessed |
403 | + * by the faulting instructions at tpc. |
404 | + */ |
405 | +static unsigned long sun4v_get_vaddr(struct pt_regs *regs) |
406 | +{ |
407 | + unsigned int insn; |
408 | + |
409 | + if (!copy_from_user(&insn, (void __user *)regs->tpc, 4)) { |
410 | + return compute_effective_address(regs, insn, |
411 | + (insn >> 25) & 0x1f); |
412 | + } |
413 | + return 0; |
414 | +} |
415 | + |
416 | +/* Attempt to handle non-resumable errors generated from userspace. |
417 | + * Returns true if the signal was handled, false otherwise. |
418 | + */ |
419 | +bool sun4v_nonresum_error_user_handled(struct pt_regs *regs, |
420 | + struct sun4v_error_entry *ent) { |
421 | + |
422 | + unsigned int attrs = ent->err_attrs; |
423 | + |
424 | + if (attrs & SUN4V_ERR_ATTRS_MEMORY) { |
425 | + unsigned long addr = ent->err_raddr; |
426 | + siginfo_t info; |
427 | + |
428 | + if (addr == ~(u64)0) { |
429 | + /* This seems highly unlikely to ever occur */ |
430 | + pr_emerg("SUN4V NON-RECOVERABLE ERROR: Memory error detected in unknown location!\n"); |
431 | + } else { |
432 | + unsigned long page_cnt = DIV_ROUND_UP(ent->err_size, |
433 | + PAGE_SIZE); |
434 | + |
435 | + /* Break the unfortunate news. */ |
436 | + pr_emerg("SUN4V NON-RECOVERABLE ERROR: Memory failed at %016lX\n", |
437 | + addr); |
438 | + pr_emerg("SUN4V NON-RECOVERABLE ERROR: Claiming %lu ages.\n", |
439 | + page_cnt); |
440 | + |
441 | + while (page_cnt-- > 0) { |
442 | + if (pfn_valid(addr >> PAGE_SHIFT)) |
443 | + get_page(pfn_to_page(addr >> PAGE_SHIFT)); |
444 | + addr += PAGE_SIZE; |
445 | + } |
446 | + } |
447 | + info.si_signo = SIGKILL; |
448 | + info.si_errno = 0; |
449 | + info.si_trapno = 0; |
450 | + force_sig_info(info.si_signo, &info, current); |
451 | + |
452 | + return true; |
453 | + } |
454 | + if (attrs & SUN4V_ERR_ATTRS_PIO) { |
455 | + siginfo_t info; |
456 | + |
457 | + info.si_signo = SIGBUS; |
458 | + info.si_code = BUS_ADRERR; |
459 | + info.si_addr = (void __user *)sun4v_get_vaddr(regs); |
460 | + force_sig_info(info.si_signo, &info, current); |
461 | + |
462 | + return true; |
463 | + } |
464 | + |
465 | + /* Default to doing nothing */ |
466 | + return false; |
467 | +} |
468 | + |
469 | /* We run with %pil set to PIL_NORMAL_MAX and PSTATE_IE enabled in %pstate. |
470 | * Log the event, clear the first word of the entry, and die. |
471 | */ |
472 | @@ -2075,6 +2142,12 @@ void sun4v_nonresum_error(struct pt_regs *regs, unsigned long offset) |
473 | |
474 | put_cpu(); |
475 | |
476 | + if (!(regs->tstate & TSTATE_PRIV) && |
477 | + sun4v_nonresum_error_user_handled(regs, &local_copy)) { |
478 | + /* DON'T PANIC: This userspace error was handled. */ |
479 | + return; |
480 | + } |
481 | + |
482 | #ifdef CONFIG_PCI |
483 | /* Check for the special PCI poke sequence. */ |
484 | if (pci_poke_in_progress && pci_poke_cpu == cpu) { |
485 | diff --git a/arch/x86/boot/compressed/kaslr.c b/arch/x86/boot/compressed/kaslr.c |
486 | index a66854d99ee1..6de58f1bd7ec 100644 |
487 | --- a/arch/x86/boot/compressed/kaslr.c |
488 | +++ b/arch/x86/boot/compressed/kaslr.c |
489 | @@ -430,9 +430,6 @@ void choose_random_location(unsigned long input, |
490 | { |
491 | unsigned long random_addr, min_addr; |
492 | |
493 | - /* By default, keep output position unchanged. */ |
494 | - *virt_addr = *output; |
495 | - |
496 | if (cmdline_find_option_bool("nokaslr")) { |
497 | warn("KASLR disabled: 'nokaslr' on cmdline."); |
498 | return; |
499 | diff --git a/arch/x86/boot/compressed/misc.c b/arch/x86/boot/compressed/misc.c |
500 | index b3c5a5f030ce..c945acd8fa33 100644 |
501 | --- a/arch/x86/boot/compressed/misc.c |
502 | +++ b/arch/x86/boot/compressed/misc.c |
503 | @@ -338,7 +338,7 @@ asmlinkage __visible void *extract_kernel(void *rmode, memptr heap, |
504 | unsigned long output_len) |
505 | { |
506 | const unsigned long kernel_total_size = VO__end - VO__text; |
507 | - unsigned long virt_addr = (unsigned long)output; |
508 | + unsigned long virt_addr = LOAD_PHYSICAL_ADDR; |
509 | |
510 | /* Retain x86 boot parameters pointer passed from startup_32/64. */ |
511 | boot_params = rmode; |
512 | @@ -397,7 +397,7 @@ asmlinkage __visible void *extract_kernel(void *rmode, memptr heap, |
513 | #ifndef CONFIG_RELOCATABLE |
514 | if ((unsigned long)output != LOAD_PHYSICAL_ADDR) |
515 | error("Destination address does not match LOAD_PHYSICAL_ADDR"); |
516 | - if ((unsigned long)output != virt_addr) |
517 | + if (virt_addr != LOAD_PHYSICAL_ADDR) |
518 | error("Destination virtual address changed when not relocatable"); |
519 | #endif |
520 | |
521 | diff --git a/arch/x86/boot/compressed/misc.h b/arch/x86/boot/compressed/misc.h |
522 | index 1c8355eadbd1..766a5211f827 100644 |
523 | --- a/arch/x86/boot/compressed/misc.h |
524 | +++ b/arch/x86/boot/compressed/misc.h |
525 | @@ -81,8 +81,6 @@ static inline void choose_random_location(unsigned long input, |
526 | unsigned long output_size, |
527 | unsigned long *virt_addr) |
528 | { |
529 | - /* No change from existing output location. */ |
530 | - *virt_addr = *output; |
531 | } |
532 | #endif |
533 | |
534 | diff --git a/arch/x86/events/core.c b/arch/x86/events/core.c |
535 | index 38623e219816..9604b2574d6c 100644 |
536 | --- a/arch/x86/events/core.c |
537 | +++ b/arch/x86/events/core.c |
538 | @@ -505,6 +505,10 @@ int x86_pmu_hw_config(struct perf_event *event) |
539 | |
540 | if (event->attr.precise_ip > precise) |
541 | return -EOPNOTSUPP; |
542 | + |
543 | + /* There's no sense in having PEBS for non sampling events: */ |
544 | + if (!is_sampling_event(event)) |
545 | + return -EINVAL; |
546 | } |
547 | /* |
548 | * check that PEBS LBR correction does not conflict with |
549 | diff --git a/arch/x86/events/intel/core.c b/arch/x86/events/intel/core.c |
550 | index 3bdb917716b1..f0f197f459b5 100644 |
551 | --- a/arch/x86/events/intel/core.c |
552 | +++ b/arch/x86/events/intel/core.c |
553 | @@ -3164,13 +3164,16 @@ static void intel_pmu_cpu_starting(int cpu) |
554 | |
555 | if (x86_pmu.flags & PMU_FL_EXCL_CNTRS) { |
556 | for_each_cpu(i, topology_sibling_cpumask(cpu)) { |
557 | + struct cpu_hw_events *sibling; |
558 | struct intel_excl_cntrs *c; |
559 | |
560 | - c = per_cpu(cpu_hw_events, i).excl_cntrs; |
561 | + sibling = &per_cpu(cpu_hw_events, i); |
562 | + c = sibling->excl_cntrs; |
563 | if (c && c->core_id == core_id) { |
564 | cpuc->kfree_on_online[1] = cpuc->excl_cntrs; |
565 | cpuc->excl_cntrs = c; |
566 | - cpuc->excl_thread_id = 1; |
567 | + if (!sibling->excl_thread_id) |
568 | + cpuc->excl_thread_id = 1; |
569 | break; |
570 | } |
571 | } |
572 | @@ -3975,7 +3978,7 @@ __init int intel_pmu_init(void) |
573 | x86_pmu.num_counters, INTEL_PMC_MAX_GENERIC); |
574 | x86_pmu.num_counters = INTEL_PMC_MAX_GENERIC; |
575 | } |
576 | - x86_pmu.intel_ctrl = (1 << x86_pmu.num_counters) - 1; |
577 | + x86_pmu.intel_ctrl = (1ULL << x86_pmu.num_counters) - 1; |
578 | |
579 | if (x86_pmu.num_counters_fixed > INTEL_PMC_MAX_FIXED) { |
580 | WARN(1, KERN_ERR "hw perf events fixed %d > max(%d), clipping!", |
581 | diff --git a/arch/x86/events/intel/uncore_snbep.c b/arch/x86/events/intel/uncore_snbep.c |
582 | index 272427700d48..afe8024e9e95 100644 |
583 | --- a/arch/x86/events/intel/uncore_snbep.c |
584 | +++ b/arch/x86/events/intel/uncore_snbep.c |
585 | @@ -2686,7 +2686,7 @@ static struct intel_uncore_type *hswep_msr_uncores[] = { |
586 | |
587 | void hswep_uncore_cpu_init(void) |
588 | { |
589 | - int pkg = topology_phys_to_logical_pkg(0); |
590 | + int pkg = boot_cpu_data.logical_proc_id; |
591 | |
592 | if (hswep_uncore_cbox.num_boxes > boot_cpu_data.x86_max_cores) |
593 | hswep_uncore_cbox.num_boxes = boot_cpu_data.x86_max_cores; |
594 | diff --git a/arch/x86/include/asm/kvm_emulate.h b/arch/x86/include/asm/kvm_emulate.h |
595 | index e9cd7befcb76..19d14ac23ef9 100644 |
596 | --- a/arch/x86/include/asm/kvm_emulate.h |
597 | +++ b/arch/x86/include/asm/kvm_emulate.h |
598 | @@ -221,6 +221,9 @@ struct x86_emulate_ops { |
599 | void (*get_cpuid)(struct x86_emulate_ctxt *ctxt, |
600 | u32 *eax, u32 *ebx, u32 *ecx, u32 *edx); |
601 | void (*set_nmi_mask)(struct x86_emulate_ctxt *ctxt, bool masked); |
602 | + |
603 | + unsigned (*get_hflags)(struct x86_emulate_ctxt *ctxt); |
604 | + void (*set_hflags)(struct x86_emulate_ctxt *ctxt, unsigned hflags); |
605 | }; |
606 | |
607 | typedef u32 __attribute__((vector_size(16))) sse128_t; |
608 | @@ -290,7 +293,6 @@ struct x86_emulate_ctxt { |
609 | |
610 | /* interruptibility state, as a result of execution of STI or MOV SS */ |
611 | int interruptibility; |
612 | - int emul_flags; |
613 | |
614 | bool perm_ok; /* do not check permissions if true */ |
615 | bool ud; /* inject an #UD if host doesn't support insn */ |
616 | diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c |
617 | index eea88fe5d969..6e57edf33d75 100644 |
618 | --- a/arch/x86/kernel/tsc.c |
619 | +++ b/arch/x86/kernel/tsc.c |
620 | @@ -694,6 +694,7 @@ unsigned long native_calibrate_tsc(void) |
621 | crystal_khz = 24000; /* 24.0 MHz */ |
622 | break; |
623 | case INTEL_FAM6_SKYLAKE_X: |
624 | + case INTEL_FAM6_ATOM_DENVERTON: |
625 | crystal_khz = 25000; /* 25.0 MHz */ |
626 | break; |
627 | case INTEL_FAM6_ATOM_GOLDMONT: |
628 | diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c |
629 | index 9f676adcdfc2..de36660751b5 100644 |
630 | --- a/arch/x86/kvm/emulate.c |
631 | +++ b/arch/x86/kvm/emulate.c |
632 | @@ -2543,7 +2543,7 @@ static int em_rsm(struct x86_emulate_ctxt *ctxt) |
633 | u64 smbase; |
634 | int ret; |
635 | |
636 | - if ((ctxt->emul_flags & X86EMUL_SMM_MASK) == 0) |
637 | + if ((ctxt->ops->get_hflags(ctxt) & X86EMUL_SMM_MASK) == 0) |
638 | return emulate_ud(ctxt); |
639 | |
640 | /* |
641 | @@ -2592,11 +2592,11 @@ static int em_rsm(struct x86_emulate_ctxt *ctxt) |
642 | return X86EMUL_UNHANDLEABLE; |
643 | } |
644 | |
645 | - if ((ctxt->emul_flags & X86EMUL_SMM_INSIDE_NMI_MASK) == 0) |
646 | + if ((ctxt->ops->get_hflags(ctxt) & X86EMUL_SMM_INSIDE_NMI_MASK) == 0) |
647 | ctxt->ops->set_nmi_mask(ctxt, false); |
648 | |
649 | - ctxt->emul_flags &= ~X86EMUL_SMM_INSIDE_NMI_MASK; |
650 | - ctxt->emul_flags &= ~X86EMUL_SMM_MASK; |
651 | + ctxt->ops->set_hflags(ctxt, ctxt->ops->get_hflags(ctxt) & |
652 | + ~(X86EMUL_SMM_INSIDE_NMI_MASK | X86EMUL_SMM_MASK)); |
653 | return X86EMUL_CONTINUE; |
654 | } |
655 | |
656 | @@ -5312,6 +5312,7 @@ int x86_emulate_insn(struct x86_emulate_ctxt *ctxt) |
657 | const struct x86_emulate_ops *ops = ctxt->ops; |
658 | int rc = X86EMUL_CONTINUE; |
659 | int saved_dst_type = ctxt->dst.type; |
660 | + unsigned emul_flags; |
661 | |
662 | ctxt->mem_read.pos = 0; |
663 | |
664 | @@ -5326,6 +5327,7 @@ int x86_emulate_insn(struct x86_emulate_ctxt *ctxt) |
665 | goto done; |
666 | } |
667 | |
668 | + emul_flags = ctxt->ops->get_hflags(ctxt); |
669 | if (unlikely(ctxt->d & |
670 | (No64|Undefined|Sse|Mmx|Intercept|CheckPerm|Priv|Prot|String))) { |
671 | if ((ctxt->mode == X86EMUL_MODE_PROT64 && (ctxt->d & No64)) || |
672 | @@ -5359,7 +5361,7 @@ int x86_emulate_insn(struct x86_emulate_ctxt *ctxt) |
673 | fetch_possible_mmx_operand(ctxt, &ctxt->dst); |
674 | } |
675 | |
676 | - if (unlikely(ctxt->emul_flags & X86EMUL_GUEST_MASK) && ctxt->intercept) { |
677 | + if (unlikely(emul_flags & X86EMUL_GUEST_MASK) && ctxt->intercept) { |
678 | rc = emulator_check_intercept(ctxt, ctxt->intercept, |
679 | X86_ICPT_PRE_EXCEPT); |
680 | if (rc != X86EMUL_CONTINUE) |
681 | @@ -5388,7 +5390,7 @@ int x86_emulate_insn(struct x86_emulate_ctxt *ctxt) |
682 | goto done; |
683 | } |
684 | |
685 | - if (unlikely(ctxt->emul_flags & X86EMUL_GUEST_MASK) && (ctxt->d & Intercept)) { |
686 | + if (unlikely(emul_flags & X86EMUL_GUEST_MASK) && (ctxt->d & Intercept)) { |
687 | rc = emulator_check_intercept(ctxt, ctxt->intercept, |
688 | X86_ICPT_POST_EXCEPT); |
689 | if (rc != X86EMUL_CONTINUE) |
690 | @@ -5442,7 +5444,7 @@ int x86_emulate_insn(struct x86_emulate_ctxt *ctxt) |
691 | |
692 | special_insn: |
693 | |
694 | - if (unlikely(ctxt->emul_flags & X86EMUL_GUEST_MASK) && (ctxt->d & Intercept)) { |
695 | + if (unlikely(emul_flags & X86EMUL_GUEST_MASK) && (ctxt->d & Intercept)) { |
696 | rc = emulator_check_intercept(ctxt, ctxt->intercept, |
697 | X86_ICPT_POST_MEMACCESS); |
698 | if (rc != X86EMUL_CONTINUE) |
699 | diff --git a/arch/x86/kvm/pmu_intel.c b/arch/x86/kvm/pmu_intel.c |
700 | index 9d4a8504a95a..5ab4a364348e 100644 |
701 | --- a/arch/x86/kvm/pmu_intel.c |
702 | +++ b/arch/x86/kvm/pmu_intel.c |
703 | @@ -294,7 +294,7 @@ static void intel_pmu_refresh(struct kvm_vcpu *vcpu) |
704 | ((u64)1 << edx.split.bit_width_fixed) - 1; |
705 | } |
706 | |
707 | - pmu->global_ctrl = ((1 << pmu->nr_arch_gp_counters) - 1) | |
708 | + pmu->global_ctrl = ((1ull << pmu->nr_arch_gp_counters) - 1) | |
709 | (((1ull << pmu->nr_arch_fixed_counters) - 1) << INTEL_PMC_IDX_FIXED); |
710 | pmu->global_ctrl_mask = ~pmu->global_ctrl; |
711 | |
712 | diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c |
713 | index 89b98e07211f..04e6bbbd8736 100644 |
714 | --- a/arch/x86/kvm/vmx.c |
715 | +++ b/arch/x86/kvm/vmx.c |
716 | @@ -2455,7 +2455,7 @@ static int nested_vmx_check_exception(struct kvm_vcpu *vcpu, unsigned nr) |
717 | if (!(vmcs12->exception_bitmap & (1u << nr))) |
718 | return 0; |
719 | |
720 | - nested_vmx_vmexit(vcpu, to_vmx(vcpu)->exit_reason, |
721 | + nested_vmx_vmexit(vcpu, EXIT_REASON_EXCEPTION_NMI, |
722 | vmcs_read32(VM_EXIT_INTR_INFO), |
723 | vmcs_readl(EXIT_QUALIFICATION)); |
724 | return 1; |
725 | diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c |
726 | index 62cde4f67c72..3dbcb09c19cf 100644 |
727 | --- a/arch/x86/kvm/x86.c |
728 | +++ b/arch/x86/kvm/x86.c |
729 | @@ -4999,6 +4999,8 @@ static bool emulator_get_segment(struct x86_emulate_ctxt *ctxt, u16 *selector, |
730 | |
731 | if (var.unusable) { |
732 | memset(desc, 0, sizeof(*desc)); |
733 | + if (base3) |
734 | + *base3 = 0; |
735 | return false; |
736 | } |
737 | |
738 | @@ -5154,6 +5156,16 @@ static void emulator_set_nmi_mask(struct x86_emulate_ctxt *ctxt, bool masked) |
739 | kvm_x86_ops->set_nmi_mask(emul_to_vcpu(ctxt), masked); |
740 | } |
741 | |
742 | +static unsigned emulator_get_hflags(struct x86_emulate_ctxt *ctxt) |
743 | +{ |
744 | + return emul_to_vcpu(ctxt)->arch.hflags; |
745 | +} |
746 | + |
747 | +static void emulator_set_hflags(struct x86_emulate_ctxt *ctxt, unsigned emul_flags) |
748 | +{ |
749 | + kvm_set_hflags(emul_to_vcpu(ctxt), emul_flags); |
750 | +} |
751 | + |
752 | static const struct x86_emulate_ops emulate_ops = { |
753 | .read_gpr = emulator_read_gpr, |
754 | .write_gpr = emulator_write_gpr, |
755 | @@ -5193,6 +5205,8 @@ static const struct x86_emulate_ops emulate_ops = { |
756 | .intercept = emulator_intercept, |
757 | .get_cpuid = emulator_get_cpuid, |
758 | .set_nmi_mask = emulator_set_nmi_mask, |
759 | + .get_hflags = emulator_get_hflags, |
760 | + .set_hflags = emulator_set_hflags, |
761 | }; |
762 | |
763 | static void toggle_interruptibility(struct kvm_vcpu *vcpu, u32 mask) |
764 | @@ -5245,7 +5259,6 @@ static void init_emulate_ctxt(struct kvm_vcpu *vcpu) |
765 | BUILD_BUG_ON(HF_GUEST_MASK != X86EMUL_GUEST_MASK); |
766 | BUILD_BUG_ON(HF_SMM_MASK != X86EMUL_SMM_MASK); |
767 | BUILD_BUG_ON(HF_SMM_INSIDE_NMI_MASK != X86EMUL_SMM_INSIDE_NMI_MASK); |
768 | - ctxt->emul_flags = vcpu->arch.hflags; |
769 | |
770 | init_decode_cache(ctxt); |
771 | vcpu->arch.emulate_regs_need_sync_from_vcpu = false; |
772 | @@ -5636,8 +5649,6 @@ int x86_emulate_instruction(struct kvm_vcpu *vcpu, |
773 | unsigned long rflags = kvm_x86_ops->get_rflags(vcpu); |
774 | toggle_interruptibility(vcpu, ctxt->interruptibility); |
775 | vcpu->arch.emulate_regs_need_sync_to_vcpu = false; |
776 | - if (vcpu->arch.hflags != ctxt->emul_flags) |
777 | - kvm_set_hflags(vcpu, ctxt->emul_flags); |
778 | kvm_rip_write(vcpu, ctxt->eip); |
779 | if (r == EMULATE_DONE) |
780 | kvm_vcpu_check_singlestep(vcpu, rflags, &r); |
781 | @@ -6111,7 +6122,8 @@ static int emulator_fix_hypercall(struct x86_emulate_ctxt *ctxt) |
782 | |
783 | kvm_x86_ops->patch_hypercall(vcpu, instruction); |
784 | |
785 | - return emulator_write_emulated(ctxt, rip, instruction, 3, NULL); |
786 | + return emulator_write_emulated(ctxt, rip, instruction, 3, |
787 | + &ctxt->exception); |
788 | } |
789 | |
790 | static int dm_request_for_irq_injection(struct kvm_vcpu *vcpu) |
791 | diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c |
792 | index 14b9dd71d9e8..9a324fc8bed8 100644 |
793 | --- a/arch/x86/mm/init_64.c |
794 | +++ b/arch/x86/mm/init_64.c |
795 | @@ -94,10 +94,10 @@ __setup("noexec32=", nonx32_setup); |
796 | */ |
797 | void sync_global_pgds(unsigned long start, unsigned long end, int removed) |
798 | { |
799 | - unsigned long address; |
800 | + unsigned long addr; |
801 | |
802 | - for (address = start; address <= end; address += PGDIR_SIZE) { |
803 | - const pgd_t *pgd_ref = pgd_offset_k(address); |
804 | + for (addr = start; addr <= end; addr = ALIGN(addr + 1, PGDIR_SIZE)) { |
805 | + const pgd_t *pgd_ref = pgd_offset_k(addr); |
806 | struct page *page; |
807 | |
808 | /* |
809 | @@ -113,7 +113,7 @@ void sync_global_pgds(unsigned long start, unsigned long end, int removed) |
810 | pgd_t *pgd; |
811 | spinlock_t *pgt_lock; |
812 | |
813 | - pgd = (pgd_t *)page_address(page) + pgd_index(address); |
814 | + pgd = (pgd_t *)page_address(page) + pgd_index(addr); |
815 | /* the pgt_lock only for Xen */ |
816 | pgt_lock = &pgd_page_get_mm(page)->page_table_lock; |
817 | spin_lock(pgt_lock); |
818 | diff --git a/arch/x86/mm/mpx.c b/arch/x86/mm/mpx.c |
819 | index e4f800999b32..a75103e7f963 100644 |
820 | --- a/arch/x86/mm/mpx.c |
821 | +++ b/arch/x86/mm/mpx.c |
822 | @@ -293,7 +293,7 @@ siginfo_t *mpx_generate_siginfo(struct pt_regs *regs) |
823 | * We were not able to extract an address from the instruction, |
824 | * probably because there was something invalid in it. |
825 | */ |
826 | - if (info->si_addr == (void *)-1) { |
827 | + if (info->si_addr == (void __user *)-1) { |
828 | err = -EINVAL; |
829 | goto err_out; |
830 | } |
831 | @@ -525,15 +525,7 @@ int mpx_handle_bd_fault(void) |
832 | if (!kernel_managing_mpx_tables(current->mm)) |
833 | return -EINVAL; |
834 | |
835 | - if (do_mpx_bt_fault()) { |
836 | - force_sig(SIGSEGV, current); |
837 | - /* |
838 | - * The force_sig() is essentially "handling" this |
839 | - * exception, so we do not pass up the error |
840 | - * from do_mpx_bt_fault(). |
841 | - */ |
842 | - } |
843 | - return 0; |
844 | + return do_mpx_bt_fault(); |
845 | } |
846 | |
847 | /* |
848 | diff --git a/arch/x86/mm/tlb.c b/arch/x86/mm/tlb.c |
849 | index a7655f6caf7d..75fb01109f94 100644 |
850 | --- a/arch/x86/mm/tlb.c |
851 | +++ b/arch/x86/mm/tlb.c |
852 | @@ -263,8 +263,6 @@ void native_flush_tlb_others(const struct cpumask *cpumask, |
853 | { |
854 | struct flush_tlb_info info; |
855 | |
856 | - if (end == 0) |
857 | - end = start + PAGE_SIZE; |
858 | info.flush_mm = mm; |
859 | info.flush_start = start; |
860 | info.flush_end = end; |
861 | @@ -393,7 +391,7 @@ void flush_tlb_page(struct vm_area_struct *vma, unsigned long start) |
862 | } |
863 | |
864 | if (cpumask_any_but(mm_cpumask(mm), smp_processor_id()) < nr_cpu_ids) |
865 | - flush_tlb_others(mm_cpumask(mm), mm, start, 0UL); |
866 | + flush_tlb_others(mm_cpumask(mm), mm, start, start + PAGE_SIZE); |
867 | |
868 | preempt_enable(); |
869 | } |
870 | diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen-blkback/blkback.c |
871 | index c42202d63567..d6eaaa25d1cc 100644 |
872 | --- a/drivers/block/xen-blkback/blkback.c |
873 | +++ b/drivers/block/xen-blkback/blkback.c |
874 | @@ -609,8 +609,6 @@ int xen_blkif_schedule(void *arg) |
875 | unsigned long timeout; |
876 | int ret; |
877 | |
878 | - xen_blkif_get(blkif); |
879 | - |
880 | set_freezable(); |
881 | while (!kthread_should_stop()) { |
882 | if (try_to_freeze()) |
883 | @@ -665,7 +663,6 @@ int xen_blkif_schedule(void *arg) |
884 | print_stats(ring); |
885 | |
886 | ring->xenblkd = NULL; |
887 | - xen_blkif_put(blkif); |
888 | |
889 | return 0; |
890 | } |
891 | diff --git a/drivers/block/xen-blkback/xenbus.c b/drivers/block/xen-blkback/xenbus.c |
892 | index 9b69fe410c08..5dfe6e8af140 100644 |
893 | --- a/drivers/block/xen-blkback/xenbus.c |
894 | +++ b/drivers/block/xen-blkback/xenbus.c |
895 | @@ -255,7 +255,6 @@ static int xen_blkif_disconnect(struct xen_blkif *blkif) |
896 | if (ring->xenblkd) { |
897 | kthread_stop(ring->xenblkd); |
898 | wake_up(&ring->shutdown_wq); |
899 | - ring->xenblkd = NULL; |
900 | } |
901 | |
902 | /* The above kthread_stop() guarantees that at this point we |
903 | @@ -316,8 +315,10 @@ static int xen_blkif_disconnect(struct xen_blkif *blkif) |
904 | static void xen_blkif_free(struct xen_blkif *blkif) |
905 | { |
906 | |
907 | - xen_blkif_disconnect(blkif); |
908 | + WARN_ON(xen_blkif_disconnect(blkif)); |
909 | xen_vbd_free(&blkif->vbd); |
910 | + kfree(blkif->be->mode); |
911 | + kfree(blkif->be); |
912 | |
913 | /* Make sure everything is drained before shutting down */ |
914 | kmem_cache_free(xen_blkif_cachep, blkif); |
915 | @@ -512,8 +513,6 @@ static int xen_blkbk_remove(struct xenbus_device *dev) |
916 | |
917 | /* Put the reference we set in xen_blkif_alloc(). */ |
918 | xen_blkif_put(be->blkif); |
919 | - kfree(be->mode); |
920 | - kfree(be); |
921 | return 0; |
922 | } |
923 | |
924 | diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c |
925 | index 471a301d63e3..8f890c1aca57 100644 |
926 | --- a/drivers/char/virtio_console.c |
927 | +++ b/drivers/char/virtio_console.c |
928 | @@ -1870,7 +1870,7 @@ static void config_work_handler(struct work_struct *work) |
929 | { |
930 | struct ports_device *portdev; |
931 | |
932 | - portdev = container_of(work, struct ports_device, control_work); |
933 | + portdev = container_of(work, struct ports_device, config_work); |
934 | if (!use_multiport(portdev)) { |
935 | struct virtio_device *vdev; |
936 | struct port *port; |
937 | diff --git a/drivers/clk/clk-scpi.c b/drivers/clk/clk-scpi.c |
938 | index 2a3e9d8e88b0..96d37175d0ad 100644 |
939 | --- a/drivers/clk/clk-scpi.c |
940 | +++ b/drivers/clk/clk-scpi.c |
941 | @@ -290,13 +290,15 @@ static int scpi_clocks_probe(struct platform_device *pdev) |
942 | of_node_put(child); |
943 | return ret; |
944 | } |
945 | - } |
946 | - /* Add the virtual cpufreq device */ |
947 | - cpufreq_dev = platform_device_register_simple("scpi-cpufreq", |
948 | - -1, NULL, 0); |
949 | - if (IS_ERR(cpufreq_dev)) |
950 | - pr_warn("unable to register cpufreq device"); |
951 | |
952 | + if (match->data != &scpi_dvfs_ops) |
953 | + continue; |
954 | + /* Add the virtual cpufreq device if it's DVFS clock provider */ |
955 | + cpufreq_dev = platform_device_register_simple("scpi-cpufreq", |
956 | + -1, NULL, 0); |
957 | + if (IS_ERR(cpufreq_dev)) |
958 | + pr_warn("unable to register cpufreq device"); |
959 | + } |
960 | return 0; |
961 | } |
962 | |
963 | diff --git a/drivers/cpufreq/s3c2416-cpufreq.c b/drivers/cpufreq/s3c2416-cpufreq.c |
964 | index d6d425773fa4..5b2db3c6568f 100644 |
965 | --- a/drivers/cpufreq/s3c2416-cpufreq.c |
966 | +++ b/drivers/cpufreq/s3c2416-cpufreq.c |
967 | @@ -400,7 +400,6 @@ static int s3c2416_cpufreq_driver_init(struct cpufreq_policy *policy) |
968 | rate = clk_get_rate(s3c_freq->hclk); |
969 | if (rate < 133 * 1000 * 1000) { |
970 | pr_err("cpufreq: HCLK not at 133MHz\n"); |
971 | - clk_put(s3c_freq->hclk); |
972 | ret = -EINVAL; |
973 | goto err_armclk; |
974 | } |
975 | diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c |
976 | index 92159313361b..f2bb5122d2c2 100644 |
977 | --- a/drivers/gpio/gpiolib.c |
978 | +++ b/drivers/gpio/gpiolib.c |
979 | @@ -707,7 +707,8 @@ static irqreturn_t lineevent_irq_thread(int irq, void *p) |
980 | |
981 | ge.timestamp = ktime_get_real_ns(); |
982 | |
983 | - if (le->eflags & GPIOEVENT_REQUEST_BOTH_EDGES) { |
984 | + if (le->eflags & GPIOEVENT_REQUEST_RISING_EDGE |
985 | + && le->eflags & GPIOEVENT_REQUEST_FALLING_EDGE) { |
986 | int level = gpiod_get_value_cansleep(le->desc); |
987 | |
988 | if (level) |
989 | diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c |
990 | index 82dc8d20e28a..bfb4b91869e7 100644 |
991 | --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c |
992 | +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c |
993 | @@ -83,6 +83,13 @@ int amdgpu_cs_get_ring(struct amdgpu_device *adev, u32 ip_type, |
994 | } |
995 | break; |
996 | } |
997 | + |
998 | + if (!(*out_ring && (*out_ring)->adev)) { |
999 | + DRM_ERROR("Ring %d is not initialized on IP %d\n", |
1000 | + ring, ip_type); |
1001 | + return -EINVAL; |
1002 | + } |
1003 | + |
1004 | return 0; |
1005 | } |
1006 | |
1007 | diff --git a/drivers/gpu/drm/amd/amdgpu/si_dpm.c b/drivers/gpu/drm/amd/amdgpu/si_dpm.c |
1008 | index 6f3c89178b6a..4cb347e88cf0 100644 |
1009 | --- a/drivers/gpu/drm/amd/amdgpu/si_dpm.c |
1010 | +++ b/drivers/gpu/drm/amd/amdgpu/si_dpm.c |
1011 | @@ -64,6 +64,7 @@ MODULE_FIRMWARE("radeon/oland_smc.bin"); |
1012 | MODULE_FIRMWARE("radeon/oland_k_smc.bin"); |
1013 | MODULE_FIRMWARE("radeon/hainan_smc.bin"); |
1014 | MODULE_FIRMWARE("radeon/hainan_k_smc.bin"); |
1015 | +MODULE_FIRMWARE("radeon/banks_k_2_smc.bin"); |
1016 | |
1017 | union power_info { |
1018 | struct _ATOM_POWERPLAY_INFO info; |
1019 | @@ -7721,10 +7722,11 @@ static int si_dpm_init_microcode(struct amdgpu_device *adev) |
1020 | ((adev->pdev->device == 0x6660) || |
1021 | (adev->pdev->device == 0x6663) || |
1022 | (adev->pdev->device == 0x6665) || |
1023 | - (adev->pdev->device == 0x6667))) || |
1024 | - ((adev->pdev->revision == 0xc3) && |
1025 | - (adev->pdev->device == 0x6665))) |
1026 | + (adev->pdev->device == 0x6667)))) |
1027 | chip_name = "hainan_k"; |
1028 | + else if ((adev->pdev->revision == 0xc3) && |
1029 | + (adev->pdev->device == 0x6665)) |
1030 | + chip_name = "banks_k_2"; |
1031 | else |
1032 | chip_name = "hainan"; |
1033 | break; |
1034 | diff --git a/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c b/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c |
1035 | index 6feed726e299..50f0cf2788b7 100644 |
1036 | --- a/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c |
1037 | +++ b/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c |
1038 | @@ -43,9 +43,13 @@ |
1039 | |
1040 | #define GRBM_GFX_INDEX__VCE_INSTANCE__SHIFT 0x04 |
1041 | #define GRBM_GFX_INDEX__VCE_INSTANCE_MASK 0x10 |
1042 | +#define GRBM_GFX_INDEX__VCE_ALL_PIPE 0x07 |
1043 | + |
1044 | #define mmVCE_LMI_VCPU_CACHE_40BIT_BAR0 0x8616 |
1045 | #define mmVCE_LMI_VCPU_CACHE_40BIT_BAR1 0x8617 |
1046 | #define mmVCE_LMI_VCPU_CACHE_40BIT_BAR2 0x8618 |
1047 | +#define mmGRBM_GFX_INDEX_DEFAULT 0xE0000000 |
1048 | + |
1049 | #define VCE_STATUS_VCPU_REPORT_FW_LOADED_MASK 0x02 |
1050 | |
1051 | #define VCE_V3_0_FW_SIZE (384 * 1024) |
1052 | @@ -54,6 +58,9 @@ |
1053 | |
1054 | #define FW_52_8_3 ((52 << 24) | (8 << 16) | (3 << 8)) |
1055 | |
1056 | +#define GET_VCE_INSTANCE(i) ((i) << GRBM_GFX_INDEX__VCE_INSTANCE__SHIFT \ |
1057 | + | GRBM_GFX_INDEX__VCE_ALL_PIPE) |
1058 | + |
1059 | static void vce_v3_0_mc_resume(struct amdgpu_device *adev, int idx); |
1060 | static void vce_v3_0_set_ring_funcs(struct amdgpu_device *adev); |
1061 | static void vce_v3_0_set_irq_funcs(struct amdgpu_device *adev); |
1062 | @@ -249,7 +256,7 @@ static int vce_v3_0_start(struct amdgpu_device *adev) |
1063 | if (adev->vce.harvest_config & (1 << idx)) |
1064 | continue; |
1065 | |
1066 | - WREG32_FIELD(GRBM_GFX_INDEX, VCE_INSTANCE, idx); |
1067 | + WREG32(mmGRBM_GFX_INDEX, GET_VCE_INSTANCE(idx)); |
1068 | vce_v3_0_mc_resume(adev, idx); |
1069 | WREG32_FIELD(VCE_STATUS, JOB_BUSY, 1); |
1070 | |
1071 | @@ -273,7 +280,7 @@ static int vce_v3_0_start(struct amdgpu_device *adev) |
1072 | } |
1073 | } |
1074 | |
1075 | - WREG32_FIELD(GRBM_GFX_INDEX, VCE_INSTANCE, 0); |
1076 | + WREG32(mmGRBM_GFX_INDEX, mmGRBM_GFX_INDEX_DEFAULT); |
1077 | mutex_unlock(&adev->grbm_idx_mutex); |
1078 | |
1079 | return 0; |
1080 | @@ -288,7 +295,7 @@ static int vce_v3_0_stop(struct amdgpu_device *adev) |
1081 | if (adev->vce.harvest_config & (1 << idx)) |
1082 | continue; |
1083 | |
1084 | - WREG32_FIELD(GRBM_GFX_INDEX, VCE_INSTANCE, idx); |
1085 | + WREG32(mmGRBM_GFX_INDEX, GET_VCE_INSTANCE(idx)); |
1086 | |
1087 | if (adev->asic_type >= CHIP_STONEY) |
1088 | WREG32_P(mmVCE_VCPU_CNTL, 0, ~0x200001); |
1089 | @@ -306,7 +313,7 @@ static int vce_v3_0_stop(struct amdgpu_device *adev) |
1090 | vce_v3_0_set_vce_sw_clock_gating(adev, false); |
1091 | } |
1092 | |
1093 | - WREG32_FIELD(GRBM_GFX_INDEX, VCE_INSTANCE, 0); |
1094 | + WREG32(mmGRBM_GFX_INDEX, mmGRBM_GFX_INDEX_DEFAULT); |
1095 | mutex_unlock(&adev->grbm_idx_mutex); |
1096 | |
1097 | return 0; |
1098 | @@ -586,17 +593,17 @@ static bool vce_v3_0_check_soft_reset(void *handle) |
1099 | * VCE team suggest use bit 3--bit 6 for busy status check |
1100 | */ |
1101 | mutex_lock(&adev->grbm_idx_mutex); |
1102 | - WREG32_FIELD(GRBM_GFX_INDEX, INSTANCE_INDEX, 0); |
1103 | + WREG32(mmGRBM_GFX_INDEX, GET_VCE_INSTANCE(0)); |
1104 | if (RREG32(mmVCE_STATUS) & AMDGPU_VCE_STATUS_BUSY_MASK) { |
1105 | srbm_soft_reset = REG_SET_FIELD(srbm_soft_reset, SRBM_SOFT_RESET, SOFT_RESET_VCE0, 1); |
1106 | srbm_soft_reset = REG_SET_FIELD(srbm_soft_reset, SRBM_SOFT_RESET, SOFT_RESET_VCE1, 1); |
1107 | } |
1108 | - WREG32_FIELD(GRBM_GFX_INDEX, INSTANCE_INDEX, 0x10); |
1109 | + WREG32(mmGRBM_GFX_INDEX, GET_VCE_INSTANCE(1)); |
1110 | if (RREG32(mmVCE_STATUS) & AMDGPU_VCE_STATUS_BUSY_MASK) { |
1111 | srbm_soft_reset = REG_SET_FIELD(srbm_soft_reset, SRBM_SOFT_RESET, SOFT_RESET_VCE0, 1); |
1112 | srbm_soft_reset = REG_SET_FIELD(srbm_soft_reset, SRBM_SOFT_RESET, SOFT_RESET_VCE1, 1); |
1113 | } |
1114 | - WREG32_FIELD(GRBM_GFX_INDEX, INSTANCE_INDEX, 0); |
1115 | + WREG32(mmGRBM_GFX_INDEX, GET_VCE_INSTANCE(0)); |
1116 | mutex_unlock(&adev->grbm_idx_mutex); |
1117 | |
1118 | if (srbm_soft_reset) { |
1119 | @@ -734,7 +741,7 @@ static int vce_v3_0_set_clockgating_state(void *handle, |
1120 | if (adev->vce.harvest_config & (1 << i)) |
1121 | continue; |
1122 | |
1123 | - WREG32_FIELD(GRBM_GFX_INDEX, VCE_INSTANCE, i); |
1124 | + WREG32(mmGRBM_GFX_INDEX, GET_VCE_INSTANCE(i)); |
1125 | |
1126 | if (enable) { |
1127 | /* initialize VCE_CLOCK_GATING_A: Clock ON/OFF delay */ |
1128 | @@ -753,7 +760,7 @@ static int vce_v3_0_set_clockgating_state(void *handle, |
1129 | vce_v3_0_set_vce_sw_clock_gating(adev, enable); |
1130 | } |
1131 | |
1132 | - WREG32_FIELD(GRBM_GFX_INDEX, VCE_INSTANCE, 0); |
1133 | + WREG32(mmGRBM_GFX_INDEX, mmGRBM_GFX_INDEX_DEFAULT); |
1134 | mutex_unlock(&adev->grbm_idx_mutex); |
1135 | |
1136 | return 0; |
1137 | diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/cz_clockpowergating.c b/drivers/gpu/drm/amd/powerplay/hwmgr/cz_clockpowergating.c |
1138 | index 2028980f1ed4..5b261c1dcc9f 100644 |
1139 | --- a/drivers/gpu/drm/amd/powerplay/hwmgr/cz_clockpowergating.c |
1140 | +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/cz_clockpowergating.c |
1141 | @@ -200,7 +200,7 @@ int cz_dpm_powergate_vce(struct pp_hwmgr *hwmgr, bool bgate) |
1142 | cgs_set_clockgating_state( |
1143 | hwmgr->device, |
1144 | AMD_IP_BLOCK_TYPE_VCE, |
1145 | - AMD_CG_STATE_UNGATE); |
1146 | + AMD_CG_STATE_GATE); |
1147 | cgs_set_powergating_state( |
1148 | hwmgr->device, |
1149 | AMD_IP_BLOCK_TYPE_VCE, |
1150 | @@ -218,7 +218,7 @@ int cz_dpm_powergate_vce(struct pp_hwmgr *hwmgr, bool bgate) |
1151 | cgs_set_clockgating_state( |
1152 | hwmgr->device, |
1153 | AMD_IP_BLOCK_TYPE_VCE, |
1154 | - AMD_PG_STATE_GATE); |
1155 | + AMD_PG_STATE_UNGATE); |
1156 | cz_dpm_update_vce_dpm(hwmgr); |
1157 | cz_enable_disable_vce_dpm(hwmgr, true); |
1158 | return 0; |
1159 | diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/cz_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/cz_hwmgr.c |
1160 | index 960424913496..189ec94c6ff9 100644 |
1161 | --- a/drivers/gpu/drm/amd/powerplay/hwmgr/cz_hwmgr.c |
1162 | +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/cz_hwmgr.c |
1163 | @@ -1402,14 +1402,22 @@ int cz_dpm_update_vce_dpm(struct pp_hwmgr *hwmgr) |
1164 | cz_hwmgr->vce_dpm.hard_min_clk, |
1165 | PPSMC_MSG_SetEclkHardMin)); |
1166 | } else { |
1167 | - /*EPR# 419220 -HW limitation to to */ |
1168 | - cz_hwmgr->vce_dpm.hard_min_clk = hwmgr->vce_arbiter.ecclk; |
1169 | - smum_send_msg_to_smc_with_parameter(hwmgr->smumgr, |
1170 | - PPSMC_MSG_SetEclkHardMin, |
1171 | - cz_get_eclk_level(hwmgr, |
1172 | - cz_hwmgr->vce_dpm.hard_min_clk, |
1173 | - PPSMC_MSG_SetEclkHardMin)); |
1174 | - |
1175 | + /*Program HardMin based on the vce_arbiter.ecclk */ |
1176 | + if (hwmgr->vce_arbiter.ecclk == 0) { |
1177 | + smum_send_msg_to_smc_with_parameter(hwmgr->smumgr, |
1178 | + PPSMC_MSG_SetEclkHardMin, 0); |
1179 | + /* disable ECLK DPM 0. Otherwise VCE could hang if |
1180 | + * switching SCLK from DPM 0 to 6/7 */ |
1181 | + smum_send_msg_to_smc_with_parameter(hwmgr->smumgr, |
1182 | + PPSMC_MSG_SetEclkSoftMin, 1); |
1183 | + } else { |
1184 | + cz_hwmgr->vce_dpm.hard_min_clk = hwmgr->vce_arbiter.ecclk; |
1185 | + smum_send_msg_to_smc_with_parameter(hwmgr->smumgr, |
1186 | + PPSMC_MSG_SetEclkHardMin, |
1187 | + cz_get_eclk_level(hwmgr, |
1188 | + cz_hwmgr->vce_dpm.hard_min_clk, |
1189 | + PPSMC_MSG_SetEclkHardMin)); |
1190 | + } |
1191 | } |
1192 | return 0; |
1193 | } |
1194 | diff --git a/drivers/gpu/drm/ast/ast_drv.h b/drivers/gpu/drm/ast/ast_drv.h |
1195 | index 7abda94fc2cf..3bedcf7ddd2a 100644 |
1196 | --- a/drivers/gpu/drm/ast/ast_drv.h |
1197 | +++ b/drivers/gpu/drm/ast/ast_drv.h |
1198 | @@ -113,7 +113,11 @@ struct ast_private { |
1199 | struct ttm_bo_kmap_obj cache_kmap; |
1200 | int next_cursor; |
1201 | bool support_wide_screen; |
1202 | - bool DisableP2A; |
1203 | + enum { |
1204 | + ast_use_p2a, |
1205 | + ast_use_dt, |
1206 | + ast_use_defaults |
1207 | + } config_mode; |
1208 | |
1209 | enum ast_tx_chip tx_chip_type; |
1210 | u8 dp501_maxclk; |
1211 | diff --git a/drivers/gpu/drm/ast/ast_main.c b/drivers/gpu/drm/ast/ast_main.c |
1212 | index 533e762d036d..fb9976254224 100644 |
1213 | --- a/drivers/gpu/drm/ast/ast_main.c |
1214 | +++ b/drivers/gpu/drm/ast/ast_main.c |
1215 | @@ -62,13 +62,84 @@ uint8_t ast_get_index_reg_mask(struct ast_private *ast, |
1216 | return ret; |
1217 | } |
1218 | |
1219 | +static void ast_detect_config_mode(struct drm_device *dev, u32 *scu_rev) |
1220 | +{ |
1221 | + struct device_node *np = dev->pdev->dev.of_node; |
1222 | + struct ast_private *ast = dev->dev_private; |
1223 | + uint32_t data, jregd0, jregd1; |
1224 | + |
1225 | + /* Defaults */ |
1226 | + ast->config_mode = ast_use_defaults; |
1227 | + *scu_rev = 0xffffffff; |
1228 | + |
1229 | + /* Check if we have device-tree properties */ |
1230 | + if (np && !of_property_read_u32(np, "aspeed,scu-revision-id", |
1231 | + scu_rev)) { |
1232 | + /* We do, disable P2A access */ |
1233 | + ast->config_mode = ast_use_dt; |
1234 | + DRM_INFO("Using device-tree for configuration\n"); |
1235 | + return; |
1236 | + } |
1237 | + |
1238 | + /* Not all families have a P2A bridge */ |
1239 | + if (dev->pdev->device != PCI_CHIP_AST2000) |
1240 | + return; |
1241 | + |
1242 | + /* |
1243 | + * The BMC will set SCU 0x40 D[12] to 1 if the P2 bridge |
1244 | + * is disabled. We force using P2A if VGA only mode bit |
1245 | + * is set D[7] |
1246 | + */ |
1247 | + jregd0 = ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xd0, 0xff); |
1248 | + jregd1 = ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xd1, 0xff); |
1249 | + if (!(jregd0 & 0x80) || !(jregd1 & 0x10)) { |
1250 | + /* Double check it's actually working */ |
1251 | + data = ast_read32(ast, 0xf004); |
1252 | + if (data != 0xFFFFFFFF) { |
1253 | + /* P2A works, grab silicon revision */ |
1254 | + ast->config_mode = ast_use_p2a; |
1255 | + |
1256 | + DRM_INFO("Using P2A bridge for configuration\n"); |
1257 | + |
1258 | + /* Read SCU7c (silicon revision register) */ |
1259 | + ast_write32(ast, 0xf004, 0x1e6e0000); |
1260 | + ast_write32(ast, 0xf000, 0x1); |
1261 | + *scu_rev = ast_read32(ast, 0x1207c); |
1262 | + return; |
1263 | + } |
1264 | + } |
1265 | + |
1266 | + /* We have a P2A bridge but it's disabled */ |
1267 | + DRM_INFO("P2A bridge disabled, using default configuration\n"); |
1268 | +} |
1269 | |
1270 | static int ast_detect_chip(struct drm_device *dev, bool *need_post) |
1271 | { |
1272 | struct ast_private *ast = dev->dev_private; |
1273 | - uint32_t data, jreg; |
1274 | + uint32_t jreg, scu_rev; |
1275 | + |
1276 | + /* |
1277 | + * If VGA isn't enabled, we need to enable now or subsequent |
1278 | + * access to the scratch registers will fail. We also inform |
1279 | + * our caller that it needs to POST the chip |
1280 | + * (Assumption: VGA not enabled -> need to POST) |
1281 | + */ |
1282 | + if (!ast_is_vga_enabled(dev)) { |
1283 | + ast_enable_vga(dev); |
1284 | + DRM_INFO("VGA not enabled on entry, requesting chip POST\n"); |
1285 | + *need_post = true; |
1286 | + } else |
1287 | + *need_post = false; |
1288 | + |
1289 | + |
1290 | + /* Enable extended register access */ |
1291 | + ast_enable_mmio(dev); |
1292 | ast_open_key(ast); |
1293 | |
1294 | + /* Find out whether P2A works or whether to use device-tree */ |
1295 | + ast_detect_config_mode(dev, &scu_rev); |
1296 | + |
1297 | + /* Identify chipset */ |
1298 | if (dev->pdev->device == PCI_CHIP_AST1180) { |
1299 | ast->chip = AST1100; |
1300 | DRM_INFO("AST 1180 detected\n"); |
1301 | @@ -80,12 +151,7 @@ static int ast_detect_chip(struct drm_device *dev, bool *need_post) |
1302 | ast->chip = AST2300; |
1303 | DRM_INFO("AST 2300 detected\n"); |
1304 | } else if (dev->pdev->revision >= 0x10) { |
1305 | - uint32_t data; |
1306 | - ast_write32(ast, 0xf004, 0x1e6e0000); |
1307 | - ast_write32(ast, 0xf000, 0x1); |
1308 | - |
1309 | - data = ast_read32(ast, 0x1207c); |
1310 | - switch (data & 0x0300) { |
1311 | + switch (scu_rev & 0x0300) { |
1312 | case 0x0200: |
1313 | ast->chip = AST1100; |
1314 | DRM_INFO("AST 1100 detected\n"); |
1315 | @@ -110,26 +176,6 @@ static int ast_detect_chip(struct drm_device *dev, bool *need_post) |
1316 | } |
1317 | } |
1318 | |
1319 | - /* |
1320 | - * If VGA isn't enabled, we need to enable now or subsequent |
1321 | - * access to the scratch registers will fail. We also inform |
1322 | - * our caller that it needs to POST the chip |
1323 | - * (Assumption: VGA not enabled -> need to POST) |
1324 | - */ |
1325 | - if (!ast_is_vga_enabled(dev)) { |
1326 | - ast_enable_vga(dev); |
1327 | - ast_enable_mmio(dev); |
1328 | - DRM_INFO("VGA not enabled on entry, requesting chip POST\n"); |
1329 | - *need_post = true; |
1330 | - } else |
1331 | - *need_post = false; |
1332 | - |
1333 | - /* Check P2A Access */ |
1334 | - ast->DisableP2A = true; |
1335 | - data = ast_read32(ast, 0xf004); |
1336 | - if (data != 0xFFFFFFFF) |
1337 | - ast->DisableP2A = false; |
1338 | - |
1339 | /* Check if we support wide screen */ |
1340 | switch (ast->chip) { |
1341 | case AST1180: |
1342 | @@ -146,17 +192,12 @@ static int ast_detect_chip(struct drm_device *dev, bool *need_post) |
1343 | ast->support_wide_screen = true; |
1344 | else { |
1345 | ast->support_wide_screen = false; |
1346 | - if (ast->DisableP2A == false) { |
1347 | - /* Read SCU7c (silicon revision register) */ |
1348 | - ast_write32(ast, 0xf004, 0x1e6e0000); |
1349 | - ast_write32(ast, 0xf000, 0x1); |
1350 | - data = ast_read32(ast, 0x1207c); |
1351 | - data &= 0x300; |
1352 | - if (ast->chip == AST2300 && data == 0x0) /* ast1300 */ |
1353 | - ast->support_wide_screen = true; |
1354 | - if (ast->chip == AST2400 && data == 0x100) /* ast1400 */ |
1355 | - ast->support_wide_screen = true; |
1356 | - } |
1357 | + if (ast->chip == AST2300 && |
1358 | + (scu_rev & 0x300) == 0x0) /* ast1300 */ |
1359 | + ast->support_wide_screen = true; |
1360 | + if (ast->chip == AST2400 && |
1361 | + (scu_rev & 0x300) == 0x100) /* ast1400 */ |
1362 | + ast->support_wide_screen = true; |
1363 | } |
1364 | break; |
1365 | } |
1366 | @@ -220,85 +261,102 @@ static int ast_detect_chip(struct drm_device *dev, bool *need_post) |
1367 | |
1368 | static int ast_get_dram_info(struct drm_device *dev) |
1369 | { |
1370 | + struct device_node *np = dev->pdev->dev.of_node; |
1371 | struct ast_private *ast = dev->dev_private; |
1372 | - uint32_t data, data2; |
1373 | - uint32_t denum, num, div, ref_pll; |
1374 | + uint32_t mcr_cfg, mcr_scu_mpll, mcr_scu_strap; |
1375 | + uint32_t denum, num, div, ref_pll, dsel; |
1376 | |
1377 | - if (ast->DisableP2A) |
1378 | - { |
1379 | + switch (ast->config_mode) { |
1380 | + case ast_use_dt: |
1381 | + /* |
1382 | + * If some properties are missing, use reasonable |
1383 | + * defaults for AST2400 |
1384 | + */ |
1385 | + if (of_property_read_u32(np, "aspeed,mcr-configuration", |
1386 | + &mcr_cfg)) |
1387 | + mcr_cfg = 0x00000577; |
1388 | + if (of_property_read_u32(np, "aspeed,mcr-scu-mpll", |
1389 | + &mcr_scu_mpll)) |
1390 | + mcr_scu_mpll = 0x000050C0; |
1391 | + if (of_property_read_u32(np, "aspeed,mcr-scu-strap", |
1392 | + &mcr_scu_strap)) |
1393 | + mcr_scu_strap = 0; |
1394 | + break; |
1395 | + case ast_use_p2a: |
1396 | + ast_write32(ast, 0xf004, 0x1e6e0000); |
1397 | + ast_write32(ast, 0xf000, 0x1); |
1398 | + mcr_cfg = ast_read32(ast, 0x10004); |
1399 | + mcr_scu_mpll = ast_read32(ast, 0x10120); |
1400 | + mcr_scu_strap = ast_read32(ast, 0x10170); |
1401 | + break; |
1402 | + case ast_use_defaults: |
1403 | + default: |
1404 | ast->dram_bus_width = 16; |
1405 | ast->dram_type = AST_DRAM_1Gx16; |
1406 | ast->mclk = 396; |
1407 | + return 0; |
1408 | } |
1409 | - else |
1410 | - { |
1411 | - ast_write32(ast, 0xf004, 0x1e6e0000); |
1412 | - ast_write32(ast, 0xf000, 0x1); |
1413 | - data = ast_read32(ast, 0x10004); |
1414 | - |
1415 | - if (data & 0x40) |
1416 | - ast->dram_bus_width = 16; |
1417 | - else |
1418 | - ast->dram_bus_width = 32; |
1419 | |
1420 | - if (ast->chip == AST2300 || ast->chip == AST2400) { |
1421 | - switch (data & 0x03) { |
1422 | - case 0: |
1423 | - ast->dram_type = AST_DRAM_512Mx16; |
1424 | - break; |
1425 | - default: |
1426 | - case 1: |
1427 | - ast->dram_type = AST_DRAM_1Gx16; |
1428 | - break; |
1429 | - case 2: |
1430 | - ast->dram_type = AST_DRAM_2Gx16; |
1431 | - break; |
1432 | - case 3: |
1433 | - ast->dram_type = AST_DRAM_4Gx16; |
1434 | - break; |
1435 | - } |
1436 | - } else { |
1437 | - switch (data & 0x0c) { |
1438 | - case 0: |
1439 | - case 4: |
1440 | - ast->dram_type = AST_DRAM_512Mx16; |
1441 | - break; |
1442 | - case 8: |
1443 | - if (data & 0x40) |
1444 | - ast->dram_type = AST_DRAM_1Gx16; |
1445 | - else |
1446 | - ast->dram_type = AST_DRAM_512Mx32; |
1447 | - break; |
1448 | - case 0xc: |
1449 | - ast->dram_type = AST_DRAM_1Gx32; |
1450 | - break; |
1451 | - } |
1452 | - } |
1453 | + if (mcr_cfg & 0x40) |
1454 | + ast->dram_bus_width = 16; |
1455 | + else |
1456 | + ast->dram_bus_width = 32; |
1457 | |
1458 | - data = ast_read32(ast, 0x10120); |
1459 | - data2 = ast_read32(ast, 0x10170); |
1460 | - if (data2 & 0x2000) |
1461 | - ref_pll = 14318; |
1462 | - else |
1463 | - ref_pll = 12000; |
1464 | - |
1465 | - denum = data & 0x1f; |
1466 | - num = (data & 0x3fe0) >> 5; |
1467 | - data = (data & 0xc000) >> 14; |
1468 | - switch (data) { |
1469 | - case 3: |
1470 | - div = 0x4; |
1471 | + if (ast->chip == AST2300 || ast->chip == AST2400) { |
1472 | + switch (mcr_cfg & 0x03) { |
1473 | + case 0: |
1474 | + ast->dram_type = AST_DRAM_512Mx16; |
1475 | break; |
1476 | - case 2: |
1477 | + default: |
1478 | case 1: |
1479 | - div = 0x2; |
1480 | + ast->dram_type = AST_DRAM_1Gx16; |
1481 | break; |
1482 | - default: |
1483 | - div = 0x1; |
1484 | + case 2: |
1485 | + ast->dram_type = AST_DRAM_2Gx16; |
1486 | + break; |
1487 | + case 3: |
1488 | + ast->dram_type = AST_DRAM_4Gx16; |
1489 | + break; |
1490 | + } |
1491 | + } else { |
1492 | + switch (mcr_cfg & 0x0c) { |
1493 | + case 0: |
1494 | + case 4: |
1495 | + ast->dram_type = AST_DRAM_512Mx16; |
1496 | + break; |
1497 | + case 8: |
1498 | + if (mcr_cfg & 0x40) |
1499 | + ast->dram_type = AST_DRAM_1Gx16; |
1500 | + else |
1501 | + ast->dram_type = AST_DRAM_512Mx32; |
1502 | + break; |
1503 | + case 0xc: |
1504 | + ast->dram_type = AST_DRAM_1Gx32; |
1505 | break; |
1506 | } |
1507 | - ast->mclk = ref_pll * (num + 2) / (denum + 2) * (div * 1000); |
1508 | } |
1509 | + |
1510 | + if (mcr_scu_strap & 0x2000) |
1511 | + ref_pll = 14318; |
1512 | + else |
1513 | + ref_pll = 12000; |
1514 | + |
1515 | + denum = mcr_scu_mpll & 0x1f; |
1516 | + num = (mcr_scu_mpll & 0x3fe0) >> 5; |
1517 | + dsel = (mcr_scu_mpll & 0xc000) >> 14; |
1518 | + switch (dsel) { |
1519 | + case 3: |
1520 | + div = 0x4; |
1521 | + break; |
1522 | + case 2: |
1523 | + case 1: |
1524 | + div = 0x2; |
1525 | + break; |
1526 | + default: |
1527 | + div = 0x1; |
1528 | + break; |
1529 | + } |
1530 | + ast->mclk = ref_pll * (num + 2) / (denum + 2) * (div * 1000); |
1531 | return 0; |
1532 | } |
1533 | |
1534 | diff --git a/drivers/gpu/drm/ast/ast_post.c b/drivers/gpu/drm/ast/ast_post.c |
1535 | index 270e8fb2803f..c7c58becb25d 100644 |
1536 | --- a/drivers/gpu/drm/ast/ast_post.c |
1537 | +++ b/drivers/gpu/drm/ast/ast_post.c |
1538 | @@ -375,17 +375,14 @@ void ast_post_gpu(struct drm_device *dev) |
1539 | ast_enable_mmio(dev); |
1540 | ast_set_def_ext_reg(dev); |
1541 | |
1542 | - if (ast->DisableP2A == false) |
1543 | - { |
1544 | + if (ast->config_mode == ast_use_p2a) { |
1545 | if (ast->chip == AST2300 || ast->chip == AST2400) |
1546 | ast_init_dram_2300(dev); |
1547 | else |
1548 | ast_init_dram_reg(dev); |
1549 | |
1550 | ast_init_3rdtx(dev); |
1551 | - } |
1552 | - else |
1553 | - { |
1554 | + } else { |
1555 | if (ast->tx_chip_type != AST_TX_NONE) |
1556 | ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xa3, 0xcf, 0x80); /* Enable DVO */ |
1557 | } |
1558 | diff --git a/drivers/gpu/drm/etnaviv/etnaviv_mmu.c b/drivers/gpu/drm/etnaviv/etnaviv_mmu.c |
1559 | index 169ac96e8f08..fe0e85b41310 100644 |
1560 | --- a/drivers/gpu/drm/etnaviv/etnaviv_mmu.c |
1561 | +++ b/drivers/gpu/drm/etnaviv/etnaviv_mmu.c |
1562 | @@ -116,9 +116,14 @@ static int etnaviv_iommu_find_iova(struct etnaviv_iommu *mmu, |
1563 | struct list_head list; |
1564 | bool found; |
1565 | |
1566 | + /* |
1567 | + * XXX: The DRM_MM_SEARCH_BELOW is really a hack to trick |
1568 | + * drm_mm into giving out a low IOVA after address space |
1569 | + * rollover. This needs a proper fix. |
1570 | + */ |
1571 | ret = drm_mm_insert_node_in_range(&mmu->mm, node, |
1572 | size, 0, mmu->last_iova, ~0UL, |
1573 | - DRM_MM_SEARCH_DEFAULT); |
1574 | + mmu->last_iova ? DRM_MM_SEARCH_DEFAULT : DRM_MM_SEARCH_BELOW); |
1575 | |
1576 | if (ret != -ENOSPC) |
1577 | break; |
1578 | diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c |
1579 | index 3333e8a45933..b75d809c292e 100644 |
1580 | --- a/drivers/gpu/drm/radeon/si.c |
1581 | +++ b/drivers/gpu/drm/radeon/si.c |
1582 | @@ -115,6 +115,8 @@ MODULE_FIRMWARE("radeon/hainan_rlc.bin"); |
1583 | MODULE_FIRMWARE("radeon/hainan_smc.bin"); |
1584 | MODULE_FIRMWARE("radeon/hainan_k_smc.bin"); |
1585 | |
1586 | +MODULE_FIRMWARE("radeon/si58_mc.bin"); |
1587 | + |
1588 | static u32 si_get_cu_active_bitmap(struct radeon_device *rdev, u32 se, u32 sh); |
1589 | static void si_pcie_gen3_enable(struct radeon_device *rdev); |
1590 | static void si_program_aspm(struct radeon_device *rdev); |
1591 | @@ -1650,6 +1652,7 @@ static int si_init_microcode(struct radeon_device *rdev) |
1592 | int err; |
1593 | int new_fw = 0; |
1594 | bool new_smc = false; |
1595 | + bool si58_fw = false; |
1596 | |
1597 | DRM_DEBUG("\n"); |
1598 | |
1599 | @@ -1742,6 +1745,10 @@ static int si_init_microcode(struct radeon_device *rdev) |
1600 | default: BUG(); |
1601 | } |
1602 | |
1603 | + /* this memory configuration requires special firmware */ |
1604 | + if (((RREG32(MC_SEQ_MISC0) & 0xff000000) >> 24) == 0x58) |
1605 | + si58_fw = true; |
1606 | + |
1607 | DRM_INFO("Loading %s Microcode\n", new_chip_name); |
1608 | |
1609 | snprintf(fw_name, sizeof(fw_name), "radeon/%s_pfp.bin", new_chip_name); |
1610 | @@ -1845,7 +1852,10 @@ static int si_init_microcode(struct radeon_device *rdev) |
1611 | } |
1612 | } |
1613 | |
1614 | - snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", new_chip_name); |
1615 | + if (si58_fw) |
1616 | + snprintf(fw_name, sizeof(fw_name), "radeon/si58_mc.bin"); |
1617 | + else |
1618 | + snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", new_chip_name); |
1619 | err = request_firmware(&rdev->mc_fw, fw_name, rdev->dev); |
1620 | if (err) { |
1621 | snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc2.bin", chip_name); |
1622 | diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf_res.c b/drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf_res.c |
1623 | index 13db8a2851ed..1f013d45c9e9 100644 |
1624 | --- a/drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf_res.c |
1625 | +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf_res.c |
1626 | @@ -321,6 +321,7 @@ void vmw_cmdbuf_res_man_destroy(struct vmw_cmdbuf_res_manager *man) |
1627 | list_for_each_entry_safe(entry, next, &man->list, head) |
1628 | vmw_cmdbuf_res_free(man, entry); |
1629 | |
1630 | + drm_ht_remove(&man->resources); |
1631 | kfree(man); |
1632 | } |
1633 | |
1634 | diff --git a/drivers/hid/i2c-hid/i2c-hid.c b/drivers/hid/i2c-hid/i2c-hid.c |
1635 | index b1bce804fe97..8008e06b7efe 100644 |
1636 | --- a/drivers/hid/i2c-hid/i2c-hid.c |
1637 | +++ b/drivers/hid/i2c-hid/i2c-hid.c |
1638 | @@ -427,6 +427,15 @@ static int i2c_hid_hwreset(struct i2c_client *client) |
1639 | if (ret) |
1640 | goto out_unlock; |
1641 | |
1642 | + /* |
1643 | + * The HID over I2C specification states that if a DEVICE needs time |
1644 | + * after the PWR_ON request, it should utilise CLOCK stretching. |
1645 | + * However, it has been observered that the Windows driver provides a |
1646 | + * 1ms sleep between the PWR_ON and RESET requests and that some devices |
1647 | + * rely on this. |
1648 | + */ |
1649 | + usleep_range(1000, 5000); |
1650 | + |
1651 | i2c_hid_dbg(ihid, "resetting...\n"); |
1652 | |
1653 | ret = i2c_hid_command(client, &hid_reset_cmd, NULL, 0); |
1654 | diff --git a/drivers/i2c/busses/i2c-brcmstb.c b/drivers/i2c/busses/i2c-brcmstb.c |
1655 | index 0652281662a8..78792b4d6437 100644 |
1656 | --- a/drivers/i2c/busses/i2c-brcmstb.c |
1657 | +++ b/drivers/i2c/busses/i2c-brcmstb.c |
1658 | @@ -465,6 +465,7 @@ static int brcmstb_i2c_xfer(struct i2c_adapter *adapter, |
1659 | u8 *tmp_buf; |
1660 | int len = 0; |
1661 | int xfersz = brcmstb_i2c_get_xfersz(dev); |
1662 | + u32 cond, cond_per_msg; |
1663 | |
1664 | if (dev->is_suspended) |
1665 | return -EBUSY; |
1666 | @@ -481,10 +482,11 @@ static int brcmstb_i2c_xfer(struct i2c_adapter *adapter, |
1667 | pmsg->buf ? pmsg->buf[0] : '0', pmsg->len); |
1668 | |
1669 | if (i < (num - 1) && (msgs[i + 1].flags & I2C_M_NOSTART)) |
1670 | - brcmstb_set_i2c_start_stop(dev, ~(COND_START_STOP)); |
1671 | + cond = ~COND_START_STOP; |
1672 | else |
1673 | - brcmstb_set_i2c_start_stop(dev, |
1674 | - COND_RESTART | COND_NOSTOP); |
1675 | + cond = COND_RESTART | COND_NOSTOP; |
1676 | + |
1677 | + brcmstb_set_i2c_start_stop(dev, cond); |
1678 | |
1679 | /* Send slave address */ |
1680 | if (!(pmsg->flags & I2C_M_NOSTART)) { |
1681 | @@ -497,13 +499,24 @@ static int brcmstb_i2c_xfer(struct i2c_adapter *adapter, |
1682 | } |
1683 | } |
1684 | |
1685 | + cond_per_msg = cond; |
1686 | + |
1687 | /* Perform data transfer */ |
1688 | while (len) { |
1689 | bytes_to_xfer = min(len, xfersz); |
1690 | |
1691 | - if (len <= xfersz && i == (num - 1)) |
1692 | - brcmstb_set_i2c_start_stop(dev, |
1693 | - ~(COND_START_STOP)); |
1694 | + if (len <= xfersz) { |
1695 | + if (i == (num - 1)) |
1696 | + cond_per_msg = cond_per_msg & |
1697 | + ~(COND_RESTART | COND_NOSTOP); |
1698 | + else |
1699 | + cond_per_msg = cond; |
1700 | + } else { |
1701 | + cond_per_msg = (cond_per_msg & ~COND_RESTART) | |
1702 | + COND_NOSTOP; |
1703 | + } |
1704 | + |
1705 | + brcmstb_set_i2c_start_stop(dev, cond_per_msg); |
1706 | |
1707 | rc = brcmstb_i2c_xfer_bsc_data(dev, tmp_buf, |
1708 | bytes_to_xfer, pmsg); |
1709 | @@ -512,6 +525,8 @@ static int brcmstb_i2c_xfer(struct i2c_adapter *adapter, |
1710 | |
1711 | len -= bytes_to_xfer; |
1712 | tmp_buf += bytes_to_xfer; |
1713 | + |
1714 | + cond_per_msg = COND_NOSTART | COND_NOSTOP; |
1715 | } |
1716 | } |
1717 | |
1718 | diff --git a/drivers/infiniband/hw/hns/hns_roce_hw_v1.c b/drivers/infiniband/hw/hns/hns_roce_hw_v1.c |
1719 | index 71232e5fabf6..20ec34761b39 100644 |
1720 | --- a/drivers/infiniband/hw/hns/hns_roce_hw_v1.c |
1721 | +++ b/drivers/infiniband/hw/hns/hns_roce_hw_v1.c |
1722 | @@ -1267,6 +1267,7 @@ void hns_roce_v1_cq_set_ci(struct hns_roce_cq *hr_cq, u32 cons_index) |
1723 | u32 doorbell[2]; |
1724 | |
1725 | doorbell[0] = cons_index & ((hr_cq->cq_depth << 1) - 1); |
1726 | + doorbell[1] = 0; |
1727 | roce_set_bit(doorbell[1], ROCEE_DB_OTHERS_H_ROCEE_DB_OTH_HW_SYNS_S, 1); |
1728 | roce_set_field(doorbell[1], ROCEE_DB_OTHERS_H_ROCEE_DB_OTH_CMD_M, |
1729 | ROCEE_DB_OTHERS_H_ROCEE_DB_OTH_CMD_S, 3); |
1730 | diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c |
1731 | index 11a13b5be73a..41800b6d492e 100644 |
1732 | --- a/drivers/iommu/amd_iommu.c |
1733 | +++ b/drivers/iommu/amd_iommu.c |
1734 | @@ -3857,11 +3857,9 @@ static void irte_ga_prepare(void *entry, |
1735 | u8 vector, u32 dest_apicid, int devid) |
1736 | { |
1737 | struct irte_ga *irte = (struct irte_ga *) entry; |
1738 | - struct iommu_dev_data *dev_data = search_dev_data(devid); |
1739 | |
1740 | irte->lo.val = 0; |
1741 | irte->hi.val = 0; |
1742 | - irte->lo.fields_remap.guest_mode = dev_data ? dev_data->use_vapic : 0; |
1743 | irte->lo.fields_remap.int_type = delivery_mode; |
1744 | irte->lo.fields_remap.dm = dest_mode; |
1745 | irte->hi.fields.vector = vector; |
1746 | @@ -3917,10 +3915,10 @@ static void irte_ga_set_affinity(void *entry, u16 devid, u16 index, |
1747 | struct irte_ga *irte = (struct irte_ga *) entry; |
1748 | struct iommu_dev_data *dev_data = search_dev_data(devid); |
1749 | |
1750 | - if (!dev_data || !dev_data->use_vapic) { |
1751 | + if (!dev_data || !dev_data->use_vapic || |
1752 | + !irte->lo.fields_remap.guest_mode) { |
1753 | irte->hi.fields.vector = vector; |
1754 | irte->lo.fields_remap.destination = dest_apicid; |
1755 | - irte->lo.fields_remap.guest_mode = 0; |
1756 | modify_irte_ga(devid, index, irte, NULL); |
1757 | } |
1758 | } |
1759 | diff --git a/drivers/iommu/amd_iommu_v2.c b/drivers/iommu/amd_iommu_v2.c |
1760 | index f8ed8c95b685..a0b4ac64b9ff 100644 |
1761 | --- a/drivers/iommu/amd_iommu_v2.c |
1762 | +++ b/drivers/iommu/amd_iommu_v2.c |
1763 | @@ -695,9 +695,9 @@ int amd_iommu_bind_pasid(struct pci_dev *pdev, int pasid, |
1764 | |
1765 | out_unregister: |
1766 | mmu_notifier_unregister(&pasid_state->mn, mm); |
1767 | + mmput(mm); |
1768 | |
1769 | out_free: |
1770 | - mmput(mm); |
1771 | free_pasid_state(pasid_state); |
1772 | |
1773 | out: |
1774 | diff --git a/drivers/iommu/dma-iommu.c b/drivers/iommu/dma-iommu.c |
1775 | index c5ab8667e6f2..1520e7f02c2f 100644 |
1776 | --- a/drivers/iommu/dma-iommu.c |
1777 | +++ b/drivers/iommu/dma-iommu.c |
1778 | @@ -112,8 +112,7 @@ static void iova_reserve_pci_windows(struct pci_dev *dev, |
1779 | unsigned long lo, hi; |
1780 | |
1781 | resource_list_for_each_entry(window, &bridge->windows) { |
1782 | - if (resource_type(window->res) != IORESOURCE_MEM && |
1783 | - resource_type(window->res) != IORESOURCE_IO) |
1784 | + if (resource_type(window->res) != IORESOURCE_MEM) |
1785 | continue; |
1786 | |
1787 | lo = iova_pfn(iovad, window->res->start - window->offset); |
1788 | diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c |
1789 | index 87fcbf71b85a..002f8a421efa 100644 |
1790 | --- a/drivers/iommu/intel-iommu.c |
1791 | +++ b/drivers/iommu/intel-iommu.c |
1792 | @@ -1144,7 +1144,7 @@ static void dma_pte_free_level(struct dmar_domain *domain, int level, |
1793 | if (!dma_pte_present(pte) || dma_pte_superpage(pte)) |
1794 | goto next; |
1795 | |
1796 | - level_pfn = pfn & level_mask(level - 1); |
1797 | + level_pfn = pfn & level_mask(level); |
1798 | level_pte = phys_to_virt(dma_pte_addr(pte)); |
1799 | |
1800 | if (level > 2) |
1801 | diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c |
1802 | index 9a2f1960873b..87d3060f8609 100644 |
1803 | --- a/drivers/iommu/iommu.c |
1804 | +++ b/drivers/iommu/iommu.c |
1805 | @@ -383,36 +383,30 @@ int iommu_group_add_device(struct iommu_group *group, struct device *dev) |
1806 | device->dev = dev; |
1807 | |
1808 | ret = sysfs_create_link(&dev->kobj, &group->kobj, "iommu_group"); |
1809 | - if (ret) { |
1810 | - kfree(device); |
1811 | - return ret; |
1812 | - } |
1813 | + if (ret) |
1814 | + goto err_free_device; |
1815 | |
1816 | device->name = kasprintf(GFP_KERNEL, "%s", kobject_name(&dev->kobj)); |
1817 | rename: |
1818 | if (!device->name) { |
1819 | - sysfs_remove_link(&dev->kobj, "iommu_group"); |
1820 | - kfree(device); |
1821 | - return -ENOMEM; |
1822 | + ret = -ENOMEM; |
1823 | + goto err_remove_link; |
1824 | } |
1825 | |
1826 | ret = sysfs_create_link_nowarn(group->devices_kobj, |
1827 | &dev->kobj, device->name); |
1828 | if (ret) { |
1829 | - kfree(device->name); |
1830 | if (ret == -EEXIST && i >= 0) { |
1831 | /* |
1832 | * Account for the slim chance of collision |
1833 | * and append an instance to the name. |
1834 | */ |
1835 | + kfree(device->name); |
1836 | device->name = kasprintf(GFP_KERNEL, "%s.%d", |
1837 | kobject_name(&dev->kobj), i++); |
1838 | goto rename; |
1839 | } |
1840 | - |
1841 | - sysfs_remove_link(&dev->kobj, "iommu_group"); |
1842 | - kfree(device); |
1843 | - return ret; |
1844 | + goto err_free_name; |
1845 | } |
1846 | |
1847 | kobject_get(group->devices_kobj); |
1848 | @@ -424,8 +418,10 @@ int iommu_group_add_device(struct iommu_group *group, struct device *dev) |
1849 | mutex_lock(&group->mutex); |
1850 | list_add_tail(&device->list, &group->devices); |
1851 | if (group->domain) |
1852 | - __iommu_attach_device(group->domain, dev); |
1853 | + ret = __iommu_attach_device(group->domain, dev); |
1854 | mutex_unlock(&group->mutex); |
1855 | + if (ret) |
1856 | + goto err_put_group; |
1857 | |
1858 | /* Notify any listeners about change to group. */ |
1859 | blocking_notifier_call_chain(&group->notifier, |
1860 | @@ -436,6 +432,21 @@ int iommu_group_add_device(struct iommu_group *group, struct device *dev) |
1861 | pr_info("Adding device %s to group %d\n", dev_name(dev), group->id); |
1862 | |
1863 | return 0; |
1864 | + |
1865 | +err_put_group: |
1866 | + mutex_lock(&group->mutex); |
1867 | + list_del(&device->list); |
1868 | + mutex_unlock(&group->mutex); |
1869 | + dev->iommu_group = NULL; |
1870 | + kobject_put(group->devices_kobj); |
1871 | +err_free_name: |
1872 | + kfree(device->name); |
1873 | +err_remove_link: |
1874 | + sysfs_remove_link(&dev->kobj, "iommu_group"); |
1875 | +err_free_device: |
1876 | + kfree(device); |
1877 | + pr_err("Failed to add device %s to group %d: %d\n", dev_name(dev), group->id, ret); |
1878 | + return ret; |
1879 | } |
1880 | EXPORT_SYMBOL_GPL(iommu_group_add_device); |
1881 | |
1882 | diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c |
1883 | index be869a990e38..0b678b5da4c4 100644 |
1884 | --- a/drivers/md/dm-thin.c |
1885 | +++ b/drivers/md/dm-thin.c |
1886 | @@ -1095,6 +1095,19 @@ static void process_prepared_discard_passdown_pt1(struct dm_thin_new_mapping *m) |
1887 | return; |
1888 | } |
1889 | |
1890 | + /* |
1891 | + * Increment the unmapped blocks. This prevents a race between the |
1892 | + * passdown io and reallocation of freed blocks. |
1893 | + */ |
1894 | + r = dm_pool_inc_data_range(pool->pmd, m->data_block, data_end); |
1895 | + if (r) { |
1896 | + metadata_operation_failed(pool, "dm_pool_inc_data_range", r); |
1897 | + bio_io_error(m->bio); |
1898 | + cell_defer_no_holder(tc, m->cell); |
1899 | + mempool_free(m, pool->mapping_pool); |
1900 | + return; |
1901 | + } |
1902 | + |
1903 | discard_parent = bio_alloc(GFP_NOIO, 1); |
1904 | if (!discard_parent) { |
1905 | DMWARN("%s: unable to allocate top level discard bio for passdown. Skipping passdown.", |
1906 | @@ -1115,19 +1128,6 @@ static void process_prepared_discard_passdown_pt1(struct dm_thin_new_mapping *m) |
1907 | end_discard(&op, r); |
1908 | } |
1909 | } |
1910 | - |
1911 | - /* |
1912 | - * Increment the unmapped blocks. This prevents a race between the |
1913 | - * passdown io and reallocation of freed blocks. |
1914 | - */ |
1915 | - r = dm_pool_inc_data_range(pool->pmd, m->data_block, data_end); |
1916 | - if (r) { |
1917 | - metadata_operation_failed(pool, "dm_pool_inc_data_range", r); |
1918 | - bio_io_error(m->bio); |
1919 | - cell_defer_no_holder(tc, m->cell); |
1920 | - mempool_free(m, pool->mapping_pool); |
1921 | - return; |
1922 | - } |
1923 | } |
1924 | |
1925 | static void process_prepared_discard_passdown_pt2(struct dm_thin_new_mapping *m) |
1926 | diff --git a/drivers/mtd/nand/brcmnand/brcmnand.c b/drivers/mtd/nand/brcmnand/brcmnand.c |
1927 | index 9d2424bfdbf5..d9fab2222eb3 100644 |
1928 | --- a/drivers/mtd/nand/brcmnand/brcmnand.c |
1929 | +++ b/drivers/mtd/nand/brcmnand/brcmnand.c |
1930 | @@ -101,6 +101,9 @@ struct brcm_nand_dma_desc { |
1931 | #define BRCMNAND_MIN_BLOCKSIZE (8 * 1024) |
1932 | #define BRCMNAND_MIN_DEVSIZE (4ULL * 1024 * 1024) |
1933 | |
1934 | +#define NAND_CTRL_RDY (INTFC_CTLR_READY | INTFC_FLASH_READY) |
1935 | +#define NAND_POLL_STATUS_TIMEOUT_MS 100 |
1936 | + |
1937 | /* Controller feature flags */ |
1938 | enum { |
1939 | BRCMNAND_HAS_1K_SECTORS = BIT(0), |
1940 | @@ -765,6 +768,31 @@ enum { |
1941 | CS_SELECT_AUTO_DEVICE_ID_CFG = BIT(30), |
1942 | }; |
1943 | |
1944 | +static int bcmnand_ctrl_poll_status(struct brcmnand_controller *ctrl, |
1945 | + u32 mask, u32 expected_val, |
1946 | + unsigned long timeout_ms) |
1947 | +{ |
1948 | + unsigned long limit; |
1949 | + u32 val; |
1950 | + |
1951 | + if (!timeout_ms) |
1952 | + timeout_ms = NAND_POLL_STATUS_TIMEOUT_MS; |
1953 | + |
1954 | + limit = jiffies + msecs_to_jiffies(timeout_ms); |
1955 | + do { |
1956 | + val = brcmnand_read_reg(ctrl, BRCMNAND_INTFC_STATUS); |
1957 | + if ((val & mask) == expected_val) |
1958 | + return 0; |
1959 | + |
1960 | + cpu_relax(); |
1961 | + } while (time_after(limit, jiffies)); |
1962 | + |
1963 | + dev_warn(ctrl->dev, "timeout on status poll (expected %x got %x)\n", |
1964 | + expected_val, val & mask); |
1965 | + |
1966 | + return -ETIMEDOUT; |
1967 | +} |
1968 | + |
1969 | static inline void brcmnand_set_wp(struct brcmnand_controller *ctrl, bool en) |
1970 | { |
1971 | u32 val = en ? CS_SELECT_NAND_WP : 0; |
1972 | @@ -1024,12 +1052,39 @@ static void brcmnand_wp(struct mtd_info *mtd, int wp) |
1973 | |
1974 | if ((ctrl->features & BRCMNAND_HAS_WP) && wp_on == 1) { |
1975 | static int old_wp = -1; |
1976 | + int ret; |
1977 | |
1978 | if (old_wp != wp) { |
1979 | dev_dbg(ctrl->dev, "WP %s\n", wp ? "on" : "off"); |
1980 | old_wp = wp; |
1981 | } |
1982 | + |
1983 | + /* |
1984 | + * make sure ctrl/flash ready before and after |
1985 | + * changing state of #WP pin |
1986 | + */ |
1987 | + ret = bcmnand_ctrl_poll_status(ctrl, NAND_CTRL_RDY | |
1988 | + NAND_STATUS_READY, |
1989 | + NAND_CTRL_RDY | |
1990 | + NAND_STATUS_READY, 0); |
1991 | + if (ret) |
1992 | + return; |
1993 | + |
1994 | brcmnand_set_wp(ctrl, wp); |
1995 | + chip->cmdfunc(mtd, NAND_CMD_STATUS, -1, -1); |
1996 | + /* NAND_STATUS_WP 0x00 = protected, 0x80 = not protected */ |
1997 | + ret = bcmnand_ctrl_poll_status(ctrl, |
1998 | + NAND_CTRL_RDY | |
1999 | + NAND_STATUS_READY | |
2000 | + NAND_STATUS_WP, |
2001 | + NAND_CTRL_RDY | |
2002 | + NAND_STATUS_READY | |
2003 | + (wp ? 0 : NAND_STATUS_WP), 0); |
2004 | + |
2005 | + if (ret) |
2006 | + dev_err_ratelimited(&host->pdev->dev, |
2007 | + "nand #WP expected %s\n", |
2008 | + wp ? "on" : "off"); |
2009 | } |
2010 | } |
2011 | |
2012 | @@ -1157,15 +1212,15 @@ static irqreturn_t brcmnand_dma_irq(int irq, void *data) |
2013 | static void brcmnand_send_cmd(struct brcmnand_host *host, int cmd) |
2014 | { |
2015 | struct brcmnand_controller *ctrl = host->ctrl; |
2016 | - u32 intfc; |
2017 | + int ret; |
2018 | |
2019 | dev_dbg(ctrl->dev, "send native cmd %d addr_lo 0x%x\n", cmd, |
2020 | brcmnand_read_reg(ctrl, BRCMNAND_CMD_ADDRESS)); |
2021 | BUG_ON(ctrl->cmd_pending != 0); |
2022 | ctrl->cmd_pending = cmd; |
2023 | |
2024 | - intfc = brcmnand_read_reg(ctrl, BRCMNAND_INTFC_STATUS); |
2025 | - WARN_ON(!(intfc & INTFC_CTLR_READY)); |
2026 | + ret = bcmnand_ctrl_poll_status(ctrl, NAND_CTRL_RDY, NAND_CTRL_RDY, 0); |
2027 | + WARN_ON(ret); |
2028 | |
2029 | mb(); /* flush previous writes */ |
2030 | brcmnand_write_reg(ctrl, BRCMNAND_CMD_START, |
2031 | diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-dev.c b/drivers/net/ethernet/amd/xgbe/xgbe-dev.c |
2032 | index ca106d4275cc..3424435a39dd 100644 |
2033 | --- a/drivers/net/ethernet/amd/xgbe/xgbe-dev.c |
2034 | +++ b/drivers/net/ethernet/amd/xgbe/xgbe-dev.c |
2035 | @@ -2825,8 +2825,10 @@ static int xgbe_init(struct xgbe_prv_data *pdata) |
2036 | |
2037 | /* Flush Tx queues */ |
2038 | ret = xgbe_flush_tx_queues(pdata); |
2039 | - if (ret) |
2040 | + if (ret) { |
2041 | + netdev_err(pdata->netdev, "error flushing TX queues\n"); |
2042 | return ret; |
2043 | + } |
2044 | |
2045 | /* |
2046 | * Initialize DMA related features |
2047 | diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-drv.c b/drivers/net/ethernet/amd/xgbe/xgbe-drv.c |
2048 | index 0f0f30149e5a..1e4e8b245cd5 100644 |
2049 | --- a/drivers/net/ethernet/amd/xgbe/xgbe-drv.c |
2050 | +++ b/drivers/net/ethernet/amd/xgbe/xgbe-drv.c |
2051 | @@ -877,7 +877,9 @@ static int xgbe_start(struct xgbe_prv_data *pdata) |
2052 | |
2053 | DBGPR("-->xgbe_start\n"); |
2054 | |
2055 | - hw_if->init(pdata); |
2056 | + ret = hw_if->init(pdata); |
2057 | + if (ret) |
2058 | + return ret; |
2059 | |
2060 | ret = phy_if->phy_start(pdata); |
2061 | if (ret) |
2062 | diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c |
2063 | index 5cc0f8cfec87..20e569bd978a 100644 |
2064 | --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c |
2065 | +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c |
2066 | @@ -1097,7 +1097,7 @@ static struct sk_buff *bnxt_gro_func_5730x(struct bnxt_tpa_info *tpa_info, |
2067 | { |
2068 | #ifdef CONFIG_INET |
2069 | struct tcphdr *th; |
2070 | - int len, nw_off, tcp_opt_len; |
2071 | + int len, nw_off, tcp_opt_len = 0; |
2072 | |
2073 | if (tcp_ts) |
2074 | tcp_opt_len = 12; |
2075 | diff --git a/drivers/net/ethernet/cavium/thunder/thunder_bgx.c b/drivers/net/ethernet/cavium/thunder/thunder_bgx.c |
2076 | index 679679a4ccb2..e858b1af788d 100644 |
2077 | --- a/drivers/net/ethernet/cavium/thunder/thunder_bgx.c |
2078 | +++ b/drivers/net/ethernet/cavium/thunder/thunder_bgx.c |
2079 | @@ -48,8 +48,9 @@ struct lmac { |
2080 | struct bgx { |
2081 | u8 bgx_id; |
2082 | struct lmac lmac[MAX_LMAC_PER_BGX]; |
2083 | - int lmac_count; |
2084 | + u8 lmac_count; |
2085 | u8 max_lmac; |
2086 | + u8 acpi_lmac_idx; |
2087 | void __iomem *reg_base; |
2088 | struct pci_dev *pdev; |
2089 | bool is_dlm; |
2090 | @@ -1159,13 +1160,13 @@ static acpi_status bgx_acpi_register_phy(acpi_handle handle, |
2091 | if (acpi_bus_get_device(handle, &adev)) |
2092 | goto out; |
2093 | |
2094 | - acpi_get_mac_address(dev, adev, bgx->lmac[bgx->lmac_count].mac); |
2095 | + acpi_get_mac_address(dev, adev, bgx->lmac[bgx->acpi_lmac_idx].mac); |
2096 | |
2097 | - SET_NETDEV_DEV(&bgx->lmac[bgx->lmac_count].netdev, dev); |
2098 | + SET_NETDEV_DEV(&bgx->lmac[bgx->acpi_lmac_idx].netdev, dev); |
2099 | |
2100 | - bgx->lmac[bgx->lmac_count].lmacid = bgx->lmac_count; |
2101 | + bgx->lmac[bgx->acpi_lmac_idx].lmacid = bgx->acpi_lmac_idx; |
2102 | + bgx->acpi_lmac_idx++; /* move to next LMAC */ |
2103 | out: |
2104 | - bgx->lmac_count++; |
2105 | return AE_OK; |
2106 | } |
2107 | |
2108 | diff --git a/drivers/net/ethernet/emulex/benet/be_cmds.c b/drivers/net/ethernet/emulex/benet/be_cmds.c |
2109 | index 0e74529a4209..30e855004c57 100644 |
2110 | --- a/drivers/net/ethernet/emulex/benet/be_cmds.c |
2111 | +++ b/drivers/net/ethernet/emulex/benet/be_cmds.c |
2112 | @@ -1118,7 +1118,7 @@ int be_cmd_pmac_add(struct be_adapter *adapter, u8 *mac_addr, |
2113 | err: |
2114 | mutex_unlock(&adapter->mcc_lock); |
2115 | |
2116 | - if (status == MCC_STATUS_UNAUTHORIZED_REQUEST) |
2117 | + if (base_status(status) == MCC_STATUS_UNAUTHORIZED_REQUEST) |
2118 | status = -EPERM; |
2119 | |
2120 | return status; |
2121 | diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c |
2122 | index 9711ca4510fa..b3c9cbef766e 100644 |
2123 | --- a/drivers/net/ethernet/emulex/benet/be_main.c |
2124 | +++ b/drivers/net/ethernet/emulex/benet/be_main.c |
2125 | @@ -319,6 +319,13 @@ static int be_mac_addr_set(struct net_device *netdev, void *p) |
2126 | if (ether_addr_equal(addr->sa_data, adapter->dev_mac)) |
2127 | return 0; |
2128 | |
2129 | + /* BE3 VFs without FILTMGMT privilege are not allowed to set its MAC |
2130 | + * address |
2131 | + */ |
2132 | + if (BEx_chip(adapter) && be_virtfn(adapter) && |
2133 | + !check_privilege(adapter, BE_PRIV_FILTMGMT)) |
2134 | + return -EPERM; |
2135 | + |
2136 | /* if device is not running, copy MAC to netdev->dev_addr */ |
2137 | if (!netif_running(netdev)) |
2138 | goto done; |
2139 | @@ -3630,7 +3637,11 @@ static void be_rx_qs_destroy(struct be_adapter *adapter) |
2140 | |
2141 | static void be_disable_if_filters(struct be_adapter *adapter) |
2142 | { |
2143 | - be_dev_mac_del(adapter, adapter->pmac_id[0]); |
2144 | + /* Don't delete MAC on BE3 VFs without FILTMGMT privilege */ |
2145 | + if (!BEx_chip(adapter) || !be_virtfn(adapter) || |
2146 | + check_privilege(adapter, BE_PRIV_FILTMGMT)) |
2147 | + be_dev_mac_del(adapter, adapter->pmac_id[0]); |
2148 | + |
2149 | be_clear_uc_list(adapter); |
2150 | be_clear_mc_list(adapter); |
2151 | |
2152 | @@ -3783,8 +3794,9 @@ static int be_enable_if_filters(struct be_adapter *adapter) |
2153 | if (status) |
2154 | return status; |
2155 | |
2156 | - /* For BE3 VFs, the PF programs the initial MAC address */ |
2157 | - if (!(BEx_chip(adapter) && be_virtfn(adapter))) { |
2158 | + /* Don't add MAC on BE3 VFs without FILTMGMT privilege */ |
2159 | + if (!BEx_chip(adapter) || !be_virtfn(adapter) || |
2160 | + check_privilege(adapter, BE_PRIV_FILTMGMT)) { |
2161 | status = be_dev_mac_add(adapter, adapter->netdev->dev_addr); |
2162 | if (status) |
2163 | return status; |
2164 | diff --git a/drivers/net/ethernet/freescale/gianfar.c b/drivers/net/ethernet/freescale/gianfar.c |
2165 | index d391beebe591..3f4e71148808 100644 |
2166 | --- a/drivers/net/ethernet/freescale/gianfar.c |
2167 | +++ b/drivers/net/ethernet/freescale/gianfar.c |
2168 | @@ -2951,7 +2951,7 @@ static bool gfar_add_rx_frag(struct gfar_rx_buff *rxb, u32 lstatus, |
2169 | } |
2170 | |
2171 | /* try reuse page */ |
2172 | - if (unlikely(page_count(page) != 1)) |
2173 | + if (unlikely(page_count(page) != 1 || page_is_pfmemalloc(page))) |
2174 | return false; |
2175 | |
2176 | /* change offset to the other half */ |
2177 | diff --git a/drivers/net/ethernet/ibm/ibmveth.c b/drivers/net/ethernet/ibm/ibmveth.c |
2178 | index 03dca732e4c6..b375ae9f98ef 100644 |
2179 | --- a/drivers/net/ethernet/ibm/ibmveth.c |
2180 | +++ b/drivers/net/ethernet/ibm/ibmveth.c |
2181 | @@ -1604,8 +1604,11 @@ static int ibmveth_probe(struct vio_dev *dev, const struct vio_device_id *id) |
2182 | netdev->netdev_ops = &ibmveth_netdev_ops; |
2183 | netdev->ethtool_ops = &netdev_ethtool_ops; |
2184 | SET_NETDEV_DEV(netdev, &dev->dev); |
2185 | - netdev->hw_features = NETIF_F_SG | NETIF_F_RXCSUM | |
2186 | - NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM; |
2187 | + netdev->hw_features = NETIF_F_SG; |
2188 | + if (vio_get_attribute(dev, "ibm,illan-options", NULL) != NULL) { |
2189 | + netdev->hw_features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | |
2190 | + NETIF_F_RXCSUM; |
2191 | + } |
2192 | |
2193 | netdev->features |= netdev->hw_features; |
2194 | |
2195 | diff --git a/drivers/net/ethernet/korina.c b/drivers/net/ethernet/korina.c |
2196 | index 1799fe1415df..c051987aab83 100644 |
2197 | --- a/drivers/net/ethernet/korina.c |
2198 | +++ b/drivers/net/ethernet/korina.c |
2199 | @@ -900,10 +900,10 @@ static void korina_restart_task(struct work_struct *work) |
2200 | DMA_STAT_DONE | DMA_STAT_HALT | DMA_STAT_ERR, |
2201 | &lp->rx_dma_regs->dmasm); |
2202 | |
2203 | - korina_free_ring(dev); |
2204 | - |
2205 | napi_disable(&lp->napi); |
2206 | |
2207 | + korina_free_ring(dev); |
2208 | + |
2209 | if (korina_init(dev) < 0) { |
2210 | printk(KERN_ERR "%s: cannot restart device\n", dev->name); |
2211 | return; |
2212 | @@ -1064,12 +1064,12 @@ static int korina_close(struct net_device *dev) |
2213 | tmp = tmp | DMA_STAT_DONE | DMA_STAT_HALT | DMA_STAT_ERR; |
2214 | writel(tmp, &lp->rx_dma_regs->dmasm); |
2215 | |
2216 | - korina_free_ring(dev); |
2217 | - |
2218 | napi_disable(&lp->napi); |
2219 | |
2220 | cancel_work_sync(&lp->restart_task); |
2221 | |
2222 | + korina_free_ring(dev); |
2223 | + |
2224 | free_irq(lp->rx_irq, dev); |
2225 | free_irq(lp->tx_irq, dev); |
2226 | free_irq(lp->ovr_irq, dev); |
2227 | diff --git a/drivers/net/ethernet/mellanox/mlx4/eq.c b/drivers/net/ethernet/mellanox/mlx4/eq.c |
2228 | index cd3638e6fe25..0509996957d9 100644 |
2229 | --- a/drivers/net/ethernet/mellanox/mlx4/eq.c |
2230 | +++ b/drivers/net/ethernet/mellanox/mlx4/eq.c |
2231 | @@ -554,8 +554,9 @@ static int mlx4_eq_int(struct mlx4_dev *dev, struct mlx4_eq *eq) |
2232 | break; |
2233 | |
2234 | case MLX4_EVENT_TYPE_SRQ_LIMIT: |
2235 | - mlx4_dbg(dev, "%s: MLX4_EVENT_TYPE_SRQ_LIMIT\n", |
2236 | - __func__); |
2237 | + mlx4_dbg(dev, "%s: MLX4_EVENT_TYPE_SRQ_LIMIT. srq_no=0x%x, eq 0x%x\n", |
2238 | + __func__, be32_to_cpu(eqe->event.srq.srqn), |
2239 | + eq->eqn); |
2240 | case MLX4_EVENT_TYPE_SRQ_CATAS_ERROR: |
2241 | if (mlx4_is_master(dev)) { |
2242 | /* forward only to slave owning the SRQ */ |
2243 | @@ -570,15 +571,19 @@ static int mlx4_eq_int(struct mlx4_dev *dev, struct mlx4_eq *eq) |
2244 | eq->eqn, eq->cons_index, ret); |
2245 | break; |
2246 | } |
2247 | - mlx4_warn(dev, "%s: slave:%d, srq_no:0x%x, event: %02x(%02x)\n", |
2248 | - __func__, slave, |
2249 | - be32_to_cpu(eqe->event.srq.srqn), |
2250 | - eqe->type, eqe->subtype); |
2251 | + if (eqe->type == |
2252 | + MLX4_EVENT_TYPE_SRQ_CATAS_ERROR) |
2253 | + mlx4_warn(dev, "%s: slave:%d, srq_no:0x%x, event: %02x(%02x)\n", |
2254 | + __func__, slave, |
2255 | + be32_to_cpu(eqe->event.srq.srqn), |
2256 | + eqe->type, eqe->subtype); |
2257 | |
2258 | if (!ret && slave != dev->caps.function) { |
2259 | - mlx4_warn(dev, "%s: sending event %02x(%02x) to slave:%d\n", |
2260 | - __func__, eqe->type, |
2261 | - eqe->subtype, slave); |
2262 | + if (eqe->type == |
2263 | + MLX4_EVENT_TYPE_SRQ_CATAS_ERROR) |
2264 | + mlx4_warn(dev, "%s: sending event %02x(%02x) to slave:%d\n", |
2265 | + __func__, eqe->type, |
2266 | + eqe->subtype, slave); |
2267 | mlx4_slave_event(dev, slave, eqe); |
2268 | break; |
2269 | } |
2270 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en.h b/drivers/net/ethernet/mellanox/mlx5/core/en.h |
2271 | index 21ce0b701143..6180ad45be18 100644 |
2272 | --- a/drivers/net/ethernet/mellanox/mlx5/core/en.h |
2273 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/en.h |
2274 | @@ -283,13 +283,15 @@ struct mlx5e_dma_info { |
2275 | |
2276 | struct mlx5e_rx_am_stats { |
2277 | int ppms; /* packets per msec */ |
2278 | + int bpms; /* bytes per msec */ |
2279 | int epms; /* events per msec */ |
2280 | }; |
2281 | |
2282 | struct mlx5e_rx_am_sample { |
2283 | - ktime_t time; |
2284 | - unsigned int pkt_ctr; |
2285 | - u16 event_ctr; |
2286 | + ktime_t time; |
2287 | + u32 pkt_ctr; |
2288 | + u32 byte_ctr; |
2289 | + u16 event_ctr; |
2290 | }; |
2291 | |
2292 | struct mlx5e_rx_am { /* Adaptive Moderation */ |
2293 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c b/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c |
2294 | index 3744e2f79ecf..da1d73fe1a81 100644 |
2295 | --- a/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c |
2296 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c |
2297 | @@ -1183,11 +1183,11 @@ static int mlx5e_get_ts_info(struct net_device *dev, |
2298 | SOF_TIMESTAMPING_RX_HARDWARE | |
2299 | SOF_TIMESTAMPING_RAW_HARDWARE; |
2300 | |
2301 | - info->tx_types = (BIT(1) << HWTSTAMP_TX_OFF) | |
2302 | - (BIT(1) << HWTSTAMP_TX_ON); |
2303 | + info->tx_types = BIT(HWTSTAMP_TX_OFF) | |
2304 | + BIT(HWTSTAMP_TX_ON); |
2305 | |
2306 | - info->rx_filters = (BIT(1) << HWTSTAMP_FILTER_NONE) | |
2307 | - (BIT(1) << HWTSTAMP_FILTER_ALL); |
2308 | + info->rx_filters = BIT(HWTSTAMP_FILTER_NONE) | |
2309 | + BIT(HWTSTAMP_FILTER_ALL); |
2310 | |
2311 | return 0; |
2312 | } |
2313 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c |
2314 | index d4fa851ced2a..ea582342dd8f 100644 |
2315 | --- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c |
2316 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c |
2317 | @@ -3846,7 +3846,8 @@ struct net_device *mlx5e_create_netdev(struct mlx5_core_dev *mdev, |
2318 | return netdev; |
2319 | |
2320 | err_cleanup_nic: |
2321 | - profile->cleanup(priv); |
2322 | + if (profile->cleanup) |
2323 | + profile->cleanup(priv); |
2324 | free_netdev(netdev); |
2325 | |
2326 | return NULL; |
2327 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_rx_am.c b/drivers/net/ethernet/mellanox/mlx5/core/en_rx_am.c |
2328 | index cbfac06b7ffd..23ccec4cb7f5 100644 |
2329 | --- a/drivers/net/ethernet/mellanox/mlx5/core/en_rx_am.c |
2330 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_rx_am.c |
2331 | @@ -183,28 +183,27 @@ static void mlx5e_am_exit_parking(struct mlx5e_rx_am *am) |
2332 | mlx5e_am_step(am); |
2333 | } |
2334 | |
2335 | +#define IS_SIGNIFICANT_DIFF(val, ref) \ |
2336 | + (((100 * abs((val) - (ref))) / (ref)) > 10) /* more than 10% difference */ |
2337 | + |
2338 | static int mlx5e_am_stats_compare(struct mlx5e_rx_am_stats *curr, |
2339 | struct mlx5e_rx_am_stats *prev) |
2340 | { |
2341 | - int diff; |
2342 | - |
2343 | - if (!prev->ppms) |
2344 | - return curr->ppms ? MLX5E_AM_STATS_BETTER : |
2345 | + if (!prev->bpms) |
2346 | + return curr->bpms ? MLX5E_AM_STATS_BETTER : |
2347 | MLX5E_AM_STATS_SAME; |
2348 | |
2349 | - diff = curr->ppms - prev->ppms; |
2350 | - if (((100 * abs(diff)) / prev->ppms) > 10) /* more than 10% diff */ |
2351 | - return (diff > 0) ? MLX5E_AM_STATS_BETTER : |
2352 | - MLX5E_AM_STATS_WORSE; |
2353 | + if (IS_SIGNIFICANT_DIFF(curr->bpms, prev->bpms)) |
2354 | + return (curr->bpms > prev->bpms) ? MLX5E_AM_STATS_BETTER : |
2355 | + MLX5E_AM_STATS_WORSE; |
2356 | |
2357 | - if (!prev->epms) |
2358 | - return curr->epms ? MLX5E_AM_STATS_WORSE : |
2359 | - MLX5E_AM_STATS_SAME; |
2360 | + if (IS_SIGNIFICANT_DIFF(curr->ppms, prev->ppms)) |
2361 | + return (curr->ppms > prev->ppms) ? MLX5E_AM_STATS_BETTER : |
2362 | + MLX5E_AM_STATS_WORSE; |
2363 | |
2364 | - diff = curr->epms - prev->epms; |
2365 | - if (((100 * abs(diff)) / prev->epms) > 10) /* more than 10% diff */ |
2366 | - return (diff < 0) ? MLX5E_AM_STATS_BETTER : |
2367 | - MLX5E_AM_STATS_WORSE; |
2368 | + if (IS_SIGNIFICANT_DIFF(curr->epms, prev->epms)) |
2369 | + return (curr->epms < prev->epms) ? MLX5E_AM_STATS_BETTER : |
2370 | + MLX5E_AM_STATS_WORSE; |
2371 | |
2372 | return MLX5E_AM_STATS_SAME; |
2373 | } |
2374 | @@ -266,10 +265,13 @@ static void mlx5e_am_sample(struct mlx5e_rq *rq, |
2375 | { |
2376 | s->time = ktime_get(); |
2377 | s->pkt_ctr = rq->stats.packets; |
2378 | + s->byte_ctr = rq->stats.bytes; |
2379 | s->event_ctr = rq->cq.event_ctr; |
2380 | } |
2381 | |
2382 | #define MLX5E_AM_NEVENTS 64 |
2383 | +#define BITS_PER_TYPE(type) (sizeof(type) * BITS_PER_BYTE) |
2384 | +#define BIT_GAP(bits, end, start) ((((end) - (start)) + BIT_ULL(bits)) & (BIT_ULL(bits) - 1)) |
2385 | |
2386 | static void mlx5e_am_calc_stats(struct mlx5e_rx_am_sample *start, |
2387 | struct mlx5e_rx_am_sample *end, |
2388 | @@ -277,13 +279,17 @@ static void mlx5e_am_calc_stats(struct mlx5e_rx_am_sample *start, |
2389 | { |
2390 | /* u32 holds up to 71 minutes, should be enough */ |
2391 | u32 delta_us = ktime_us_delta(end->time, start->time); |
2392 | - unsigned int npkts = end->pkt_ctr - start->pkt_ctr; |
2393 | + u32 npkts = BIT_GAP(BITS_PER_TYPE(u32), end->pkt_ctr, start->pkt_ctr); |
2394 | + u32 nbytes = BIT_GAP(BITS_PER_TYPE(u32), end->byte_ctr, |
2395 | + start->byte_ctr); |
2396 | |
2397 | if (!delta_us) |
2398 | return; |
2399 | |
2400 | - curr_stats->ppms = (npkts * USEC_PER_MSEC) / delta_us; |
2401 | - curr_stats->epms = (MLX5E_AM_NEVENTS * USEC_PER_MSEC) / delta_us; |
2402 | + curr_stats->ppms = DIV_ROUND_UP(npkts * USEC_PER_MSEC, delta_us); |
2403 | + curr_stats->bpms = DIV_ROUND_UP(nbytes * USEC_PER_MSEC, delta_us); |
2404 | + curr_stats->epms = DIV_ROUND_UP(MLX5E_AM_NEVENTS * USEC_PER_MSEC, |
2405 | + delta_us); |
2406 | } |
2407 | |
2408 | void mlx5e_rx_am_work(struct work_struct *work) |
2409 | @@ -308,7 +314,8 @@ void mlx5e_rx_am(struct mlx5e_rq *rq) |
2410 | |
2411 | switch (am->state) { |
2412 | case MLX5E_AM_MEASURE_IN_PROGRESS: |
2413 | - nevents = rq->cq.event_ctr - am->start_sample.event_ctr; |
2414 | + nevents = BIT_GAP(BITS_PER_TYPE(u16), rq->cq.event_ctr, |
2415 | + am->start_sample.event_ctr); |
2416 | if (nevents < MLX5E_AM_NEVENTS) |
2417 | break; |
2418 | mlx5e_am_sample(rq, &end_sample); |
2419 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/main.c b/drivers/net/ethernet/mellanox/mlx5/core/main.c |
2420 | index d776db79e325..5bea0bf2b484 100644 |
2421 | --- a/drivers/net/ethernet/mellanox/mlx5/core/main.c |
2422 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/main.c |
2423 | @@ -155,8 +155,9 @@ static struct mlx5_profile profile[] = { |
2424 | }, |
2425 | }; |
2426 | |
2427 | -#define FW_INIT_TIMEOUT_MILI 2000 |
2428 | -#define FW_INIT_WAIT_MS 2 |
2429 | +#define FW_INIT_TIMEOUT_MILI 2000 |
2430 | +#define FW_INIT_WAIT_MS 2 |
2431 | +#define FW_PRE_INIT_TIMEOUT_MILI 10000 |
2432 | |
2433 | static int wait_fw_init(struct mlx5_core_dev *dev, u32 max_wait_mili) |
2434 | { |
2435 | @@ -956,6 +957,15 @@ static int mlx5_load_one(struct mlx5_core_dev *dev, struct mlx5_priv *priv, |
2436 | */ |
2437 | dev->state = MLX5_DEVICE_STATE_UP; |
2438 | |
2439 | + /* wait for firmware to accept initialization segments configurations |
2440 | + */ |
2441 | + err = wait_fw_init(dev, FW_PRE_INIT_TIMEOUT_MILI); |
2442 | + if (err) { |
2443 | + dev_err(&dev->pdev->dev, "Firmware over %d MS in pre-initializing state, aborting\n", |
2444 | + FW_PRE_INIT_TIMEOUT_MILI); |
2445 | + goto out; |
2446 | + } |
2447 | + |
2448 | err = mlx5_cmd_init(dev); |
2449 | if (err) { |
2450 | dev_err(&pdev->dev, "Failed initializing command interface, aborting\n"); |
2451 | diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c |
2452 | index 690563099313..9e31a3390154 100644 |
2453 | --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c |
2454 | +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c |
2455 | @@ -1178,7 +1178,8 @@ static int mlxsw_sp_nexthop_mac_update(struct mlxsw_sp *mlxsw_sp, u32 adj_index, |
2456 | |
2457 | static int |
2458 | mlxsw_sp_nexthop_group_mac_update(struct mlxsw_sp *mlxsw_sp, |
2459 | - struct mlxsw_sp_nexthop_group *nh_grp) |
2460 | + struct mlxsw_sp_nexthop_group *nh_grp, |
2461 | + bool reallocate) |
2462 | { |
2463 | u32 adj_index = nh_grp->adj_index; /* base */ |
2464 | struct mlxsw_sp_nexthop *nh; |
2465 | @@ -1193,7 +1194,7 @@ mlxsw_sp_nexthop_group_mac_update(struct mlxsw_sp *mlxsw_sp, |
2466 | continue; |
2467 | } |
2468 | |
2469 | - if (nh->update) { |
2470 | + if (nh->update || reallocate) { |
2471 | err = mlxsw_sp_nexthop_mac_update(mlxsw_sp, |
2472 | adj_index, nh); |
2473 | if (err) |
2474 | @@ -1254,7 +1255,8 @@ mlxsw_sp_nexthop_group_refresh(struct mlxsw_sp *mlxsw_sp, |
2475 | /* Nothing was added or removed, so no need to reallocate. Just |
2476 | * update MAC on existing adjacency indexes. |
2477 | */ |
2478 | - err = mlxsw_sp_nexthop_group_mac_update(mlxsw_sp, nh_grp); |
2479 | + err = mlxsw_sp_nexthop_group_mac_update(mlxsw_sp, nh_grp, |
2480 | + false); |
2481 | if (err) { |
2482 | dev_warn(mlxsw_sp->bus_info->dev, "Failed to update neigh MAC in adjacency table.\n"); |
2483 | goto set_trap; |
2484 | @@ -1282,7 +1284,7 @@ mlxsw_sp_nexthop_group_refresh(struct mlxsw_sp *mlxsw_sp, |
2485 | nh_grp->adj_index_valid = 1; |
2486 | nh_grp->adj_index = adj_index; |
2487 | nh_grp->ecmp_size = ecmp_size; |
2488 | - err = mlxsw_sp_nexthop_group_mac_update(mlxsw_sp, nh_grp); |
2489 | + err = mlxsw_sp_nexthop_group_mac_update(mlxsw_sp, nh_grp, true); |
2490 | if (err) { |
2491 | dev_warn(mlxsw_sp->bus_info->dev, "Failed to update neigh MAC in adjacency table.\n"); |
2492 | goto set_trap; |
2493 | diff --git a/drivers/net/ethernet/renesas/ravb_main.c b/drivers/net/ethernet/renesas/ravb_main.c |
2494 | index 510ff62584d6..11623aad0e8e 100644 |
2495 | --- a/drivers/net/ethernet/renesas/ravb_main.c |
2496 | +++ b/drivers/net/ethernet/renesas/ravb_main.c |
2497 | @@ -229,18 +229,6 @@ static void ravb_ring_free(struct net_device *ndev, int q) |
2498 | int ring_size; |
2499 | int i; |
2500 | |
2501 | - /* Free RX skb ringbuffer */ |
2502 | - if (priv->rx_skb[q]) { |
2503 | - for (i = 0; i < priv->num_rx_ring[q]; i++) |
2504 | - dev_kfree_skb(priv->rx_skb[q][i]); |
2505 | - } |
2506 | - kfree(priv->rx_skb[q]); |
2507 | - priv->rx_skb[q] = NULL; |
2508 | - |
2509 | - /* Free aligned TX buffers */ |
2510 | - kfree(priv->tx_align[q]); |
2511 | - priv->tx_align[q] = NULL; |
2512 | - |
2513 | if (priv->rx_ring[q]) { |
2514 | for (i = 0; i < priv->num_rx_ring[q]; i++) { |
2515 | struct ravb_ex_rx_desc *desc = &priv->rx_ring[q][i]; |
2516 | @@ -269,6 +257,18 @@ static void ravb_ring_free(struct net_device *ndev, int q) |
2517 | priv->tx_ring[q] = NULL; |
2518 | } |
2519 | |
2520 | + /* Free RX skb ringbuffer */ |
2521 | + if (priv->rx_skb[q]) { |
2522 | + for (i = 0; i < priv->num_rx_ring[q]; i++) |
2523 | + dev_kfree_skb(priv->rx_skb[q][i]); |
2524 | + } |
2525 | + kfree(priv->rx_skb[q]); |
2526 | + priv->rx_skb[q] = NULL; |
2527 | + |
2528 | + /* Free aligned TX buffers */ |
2529 | + kfree(priv->tx_align[q]); |
2530 | + priv->tx_align[q] = NULL; |
2531 | + |
2532 | /* Free TX skb ringbuffer. |
2533 | * SKBs are freed by ravb_tx_free() call above. |
2534 | */ |
2535 | diff --git a/drivers/net/ethernet/sfc/falcon.c b/drivers/net/ethernet/sfc/falcon.c |
2536 | index 1a7092602aec..1bfb21465ace 100644 |
2537 | --- a/drivers/net/ethernet/sfc/falcon.c |
2538 | +++ b/drivers/net/ethernet/sfc/falcon.c |
2539 | @@ -2801,6 +2801,11 @@ const struct efx_nic_type falcon_a1_nic_type = { |
2540 | .timer_period_max = 1 << FRF_AB_TC_TIMER_VAL_WIDTH, |
2541 | .offload_features = NETIF_F_IP_CSUM, |
2542 | .mcdi_max_ver = -1, |
2543 | +#ifdef CONFIG_SFC_SRIOV |
2544 | + .vswitching_probe = efx_port_dummy_op_int, |
2545 | + .vswitching_restore = efx_port_dummy_op_int, |
2546 | + .vswitching_remove = efx_port_dummy_op_void, |
2547 | +#endif |
2548 | }; |
2549 | |
2550 | const struct efx_nic_type falcon_b0_nic_type = { |
2551 | @@ -2902,4 +2907,9 @@ const struct efx_nic_type falcon_b0_nic_type = { |
2552 | .offload_features = NETIF_F_IP_CSUM | NETIF_F_RXHASH | NETIF_F_NTUPLE, |
2553 | .mcdi_max_ver = -1, |
2554 | .max_rx_ip_filters = FR_BZ_RX_FILTER_TBL0_ROWS, |
2555 | +#ifdef CONFIG_SFC_SRIOV |
2556 | + .vswitching_probe = efx_port_dummy_op_int, |
2557 | + .vswitching_restore = efx_port_dummy_op_int, |
2558 | + .vswitching_remove = efx_port_dummy_op_void, |
2559 | +#endif |
2560 | }; |
2561 | diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c |
2562 | index ac3d39c69509..890e4b083f4f 100644 |
2563 | --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c |
2564 | +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c |
2565 | @@ -346,6 +346,7 @@ void stmmac_remove_config_dt(struct platform_device *pdev, |
2566 | if (of_phy_is_fixed_link(np)) |
2567 | of_phy_deregister_fixed_link(np); |
2568 | of_node_put(plat->phy_node); |
2569 | + of_node_put(plat->mdio_node); |
2570 | } |
2571 | #else |
2572 | struct plat_stmmacenet_data * |
2573 | diff --git a/drivers/net/phy/dp83848.c b/drivers/net/phy/dp83848.c |
2574 | index 800b39f06279..a10d0e7fc5f7 100644 |
2575 | --- a/drivers/net/phy/dp83848.c |
2576 | +++ b/drivers/net/phy/dp83848.c |
2577 | @@ -17,6 +17,7 @@ |
2578 | #include <linux/phy.h> |
2579 | |
2580 | #define TI_DP83848C_PHY_ID 0x20005ca0 |
2581 | +#define TI_DP83620_PHY_ID 0x20005ce0 |
2582 | #define NS_DP83848C_PHY_ID 0x20005c90 |
2583 | #define TLK10X_PHY_ID 0x2000a210 |
2584 | #define TI_DP83822_PHY_ID 0x2000a240 |
2585 | @@ -77,6 +78,7 @@ static int dp83848_config_intr(struct phy_device *phydev) |
2586 | static struct mdio_device_id __maybe_unused dp83848_tbl[] = { |
2587 | { TI_DP83848C_PHY_ID, 0xfffffff0 }, |
2588 | { NS_DP83848C_PHY_ID, 0xfffffff0 }, |
2589 | + { TI_DP83620_PHY_ID, 0xfffffff0 }, |
2590 | { TLK10X_PHY_ID, 0xfffffff0 }, |
2591 | { TI_DP83822_PHY_ID, 0xfffffff0 }, |
2592 | { } |
2593 | @@ -106,6 +108,7 @@ MODULE_DEVICE_TABLE(mdio, dp83848_tbl); |
2594 | static struct phy_driver dp83848_driver[] = { |
2595 | DP83848_PHY_DRIVER(TI_DP83848C_PHY_ID, "TI DP83848C 10/100 Mbps PHY"), |
2596 | DP83848_PHY_DRIVER(NS_DP83848C_PHY_ID, "NS DP83848C 10/100 Mbps PHY"), |
2597 | + DP83848_PHY_DRIVER(TI_DP83620_PHY_ID, "TI DP83620 10/100 Mbps PHY"), |
2598 | DP83848_PHY_DRIVER(TLK10X_PHY_ID, "TI TLK10X 10/100 Mbps PHY"), |
2599 | DP83848_PHY_DRIVER(TI_DP83822_PHY_ID, "TI DP83822 10/100 Mbps PHY"), |
2600 | }; |
2601 | diff --git a/drivers/net/phy/dp83867.c b/drivers/net/phy/dp83867.c |
2602 | index 91177a4a32ad..4cad95552cf1 100644 |
2603 | --- a/drivers/net/phy/dp83867.c |
2604 | +++ b/drivers/net/phy/dp83867.c |
2605 | @@ -113,12 +113,16 @@ static int dp83867_of_init(struct phy_device *phydev) |
2606 | |
2607 | ret = of_property_read_u32(of_node, "ti,rx-internal-delay", |
2608 | &dp83867->rx_id_delay); |
2609 | - if (ret) |
2610 | + if (ret && |
2611 | + (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID || |
2612 | + phydev->interface == PHY_INTERFACE_MODE_RGMII_RXID)) |
2613 | return ret; |
2614 | |
2615 | ret = of_property_read_u32(of_node, "ti,tx-internal-delay", |
2616 | &dp83867->tx_id_delay); |
2617 | - if (ret) |
2618 | + if (ret && |
2619 | + (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID || |
2620 | + phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID)) |
2621 | return ret; |
2622 | |
2623 | return of_property_read_u32(of_node, "ti,fifo-depth", |
2624 | diff --git a/drivers/net/phy/marvell.c b/drivers/net/phy/marvell.c |
2625 | index 2f70f80de27f..c60c147708c4 100644 |
2626 | --- a/drivers/net/phy/marvell.c |
2627 | +++ b/drivers/net/phy/marvell.c |
2628 | @@ -1200,7 +1200,8 @@ static int marvell_read_status(struct phy_device *phydev) |
2629 | int err; |
2630 | |
2631 | /* Check the fiber mode first */ |
2632 | - if (phydev->supported & SUPPORTED_FIBRE) { |
2633 | + if (phydev->supported & SUPPORTED_FIBRE && |
2634 | + phydev->interface != PHY_INTERFACE_MODE_SGMII) { |
2635 | err = phy_write(phydev, MII_MARVELL_PHY_PAGE, MII_M1111_FIBER); |
2636 | if (err < 0) |
2637 | goto error; |
2638 | diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c |
2639 | index a9be26f1f677..edd30ebbf275 100644 |
2640 | --- a/drivers/net/phy/phy.c |
2641 | +++ b/drivers/net/phy/phy.c |
2642 | @@ -1384,6 +1384,9 @@ int phy_ethtool_set_eee(struct phy_device *phydev, struct ethtool_eee *data) |
2643 | { |
2644 | int val = ethtool_adv_to_mmd_eee_adv_t(data->advertised); |
2645 | |
2646 | + /* Mask prohibited EEE modes */ |
2647 | + val &= ~phydev->eee_broken_modes; |
2648 | + |
2649 | phy_write_mmd_indirect(phydev, MDIO_AN_EEE_ADV, MDIO_MMD_AN, val); |
2650 | |
2651 | return 0; |
2652 | diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c |
2653 | index 14d57d0d1c04..32b555a72e13 100644 |
2654 | --- a/drivers/net/phy/phy_device.c |
2655 | +++ b/drivers/net/phy/phy_device.c |
2656 | @@ -1146,6 +1146,43 @@ static int genphy_config_advert(struct phy_device *phydev) |
2657 | } |
2658 | |
2659 | /** |
2660 | + * genphy_config_eee_advert - disable unwanted eee mode advertisement |
2661 | + * @phydev: target phy_device struct |
2662 | + * |
2663 | + * Description: Writes MDIO_AN_EEE_ADV after disabling unsupported energy |
2664 | + * efficent ethernet modes. Returns 0 if the PHY's advertisement hasn't |
2665 | + * changed, and 1 if it has changed. |
2666 | + */ |
2667 | +static int genphy_config_eee_advert(struct phy_device *phydev) |
2668 | +{ |
2669 | + int broken = phydev->eee_broken_modes; |
2670 | + int old_adv, adv; |
2671 | + |
2672 | + /* Nothing to disable */ |
2673 | + if (!broken) |
2674 | + return 0; |
2675 | + |
2676 | + /* If the following call fails, we assume that EEE is not |
2677 | + * supported by the phy. If we read 0, EEE is not advertised |
2678 | + * In both case, we don't need to continue |
2679 | + */ |
2680 | + adv = phy_read_mmd_indirect(phydev, MDIO_AN_EEE_ADV, MDIO_MMD_AN); |
2681 | + if (adv <= 0) |
2682 | + return 0; |
2683 | + |
2684 | + old_adv = adv; |
2685 | + adv &= ~broken; |
2686 | + |
2687 | + /* Advertising remains unchanged with the broken mask */ |
2688 | + if (old_adv == adv) |
2689 | + return 0; |
2690 | + |
2691 | + phy_write_mmd_indirect(phydev, MDIO_AN_EEE_ADV, MDIO_MMD_AN, adv); |
2692 | + |
2693 | + return 1; |
2694 | +} |
2695 | + |
2696 | +/** |
2697 | * genphy_setup_forced - configures/forces speed/duplex from @phydev |
2698 | * @phydev: target phy_device struct |
2699 | * |
2700 | @@ -1203,15 +1240,20 @@ EXPORT_SYMBOL(genphy_restart_aneg); |
2701 | */ |
2702 | int genphy_config_aneg(struct phy_device *phydev) |
2703 | { |
2704 | - int result; |
2705 | + int err, changed; |
2706 | + |
2707 | + changed = genphy_config_eee_advert(phydev); |
2708 | |
2709 | if (AUTONEG_ENABLE != phydev->autoneg) |
2710 | return genphy_setup_forced(phydev); |
2711 | |
2712 | - result = genphy_config_advert(phydev); |
2713 | - if (result < 0) /* error */ |
2714 | - return result; |
2715 | - if (result == 0) { |
2716 | + err = genphy_config_advert(phydev); |
2717 | + if (err < 0) /* error */ |
2718 | + return err; |
2719 | + |
2720 | + changed |= err; |
2721 | + |
2722 | + if (changed == 0) { |
2723 | /* Advertisement hasn't changed, but maybe aneg was never on to |
2724 | * begin with? Or maybe phy was isolated? |
2725 | */ |
2726 | @@ -1221,16 +1263,16 @@ int genphy_config_aneg(struct phy_device *phydev) |
2727 | return ctl; |
2728 | |
2729 | if (!(ctl & BMCR_ANENABLE) || (ctl & BMCR_ISOLATE)) |
2730 | - result = 1; /* do restart aneg */ |
2731 | + changed = 1; /* do restart aneg */ |
2732 | } |
2733 | |
2734 | /* Only restart aneg if we are advertising something different |
2735 | * than we were before. |
2736 | */ |
2737 | - if (result > 0) |
2738 | - result = genphy_restart_aneg(phydev); |
2739 | + if (changed > 0) |
2740 | + return genphy_restart_aneg(phydev); |
2741 | |
2742 | - return result; |
2743 | + return 0; |
2744 | } |
2745 | EXPORT_SYMBOL(genphy_config_aneg); |
2746 | |
2747 | @@ -1588,6 +1630,33 @@ static void of_set_phy_supported(struct phy_device *phydev) |
2748 | __set_phy_supported(phydev, max_speed); |
2749 | } |
2750 | |
2751 | +static void of_set_phy_eee_broken(struct phy_device *phydev) |
2752 | +{ |
2753 | + struct device_node *node = phydev->mdio.dev.of_node; |
2754 | + u32 broken = 0; |
2755 | + |
2756 | + if (!IS_ENABLED(CONFIG_OF_MDIO)) |
2757 | + return; |
2758 | + |
2759 | + if (!node) |
2760 | + return; |
2761 | + |
2762 | + if (of_property_read_bool(node, "eee-broken-100tx")) |
2763 | + broken |= MDIO_EEE_100TX; |
2764 | + if (of_property_read_bool(node, "eee-broken-1000t")) |
2765 | + broken |= MDIO_EEE_1000T; |
2766 | + if (of_property_read_bool(node, "eee-broken-10gt")) |
2767 | + broken |= MDIO_EEE_10GT; |
2768 | + if (of_property_read_bool(node, "eee-broken-1000kx")) |
2769 | + broken |= MDIO_EEE_1000KX; |
2770 | + if (of_property_read_bool(node, "eee-broken-10gkx4")) |
2771 | + broken |= MDIO_EEE_10GKX4; |
2772 | + if (of_property_read_bool(node, "eee-broken-10gkr")) |
2773 | + broken |= MDIO_EEE_10GKR; |
2774 | + |
2775 | + phydev->eee_broken_modes = broken; |
2776 | +} |
2777 | + |
2778 | /** |
2779 | * phy_probe - probe and init a PHY device |
2780 | * @dev: device to probe and init |
2781 | @@ -1625,6 +1694,11 @@ static int phy_probe(struct device *dev) |
2782 | of_set_phy_supported(phydev); |
2783 | phydev->advertising = phydev->supported; |
2784 | |
2785 | + /* Get the EEE modes we want to prohibit. We will ask |
2786 | + * the PHY stop advertising these mode later on |
2787 | + */ |
2788 | + of_set_phy_eee_broken(phydev); |
2789 | + |
2790 | /* Set the state to READY by default */ |
2791 | phydev->state = PHY_READY; |
2792 | |
2793 | diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c |
2794 | index 7ca99899972e..1568aedddfc9 100644 |
2795 | --- a/drivers/net/virtio_net.c |
2796 | +++ b/drivers/net/virtio_net.c |
2797 | @@ -47,8 +47,16 @@ module_param(gso, bool, 0444); |
2798 | */ |
2799 | DECLARE_EWMA(pkt_len, 1, 64) |
2800 | |
2801 | +/* With mergeable buffers we align buffer address and use the low bits to |
2802 | + * encode its true size. Buffer size is up to 1 page so we need to align to |
2803 | + * square root of page size to ensure we reserve enough bits to encode the true |
2804 | + * size. |
2805 | + */ |
2806 | +#define MERGEABLE_BUFFER_MIN_ALIGN_SHIFT ((PAGE_SHIFT + 1) / 2) |
2807 | + |
2808 | /* Minimum alignment for mergeable packet buffers. */ |
2809 | -#define MERGEABLE_BUFFER_ALIGN max(L1_CACHE_BYTES, 256) |
2810 | +#define MERGEABLE_BUFFER_ALIGN max(L1_CACHE_BYTES, \ |
2811 | + 1 << MERGEABLE_BUFFER_MIN_ALIGN_SHIFT) |
2812 | |
2813 | #define VIRTNET_DRIVER_VERSION "1.0.0" |
2814 | |
2815 | diff --git a/drivers/net/vrf.c b/drivers/net/vrf.c |
2816 | index ee02605a0f89..642df9391193 100644 |
2817 | --- a/drivers/net/vrf.c |
2818 | +++ b/drivers/net/vrf.c |
2819 | @@ -36,12 +36,14 @@ |
2820 | #include <net/addrconf.h> |
2821 | #include <net/l3mdev.h> |
2822 | #include <net/fib_rules.h> |
2823 | +#include <net/netns/generic.h> |
2824 | |
2825 | #define DRV_NAME "vrf" |
2826 | #define DRV_VERSION "1.0" |
2827 | |
2828 | #define FIB_RULE_PREF 1000 /* default preference for FIB rules */ |
2829 | -static bool add_fib_rules = true; |
2830 | + |
2831 | +static unsigned int vrf_net_id; |
2832 | |
2833 | struct net_vrf { |
2834 | struct rtable __rcu *rth; |
2835 | @@ -1237,6 +1239,8 @@ static int vrf_newlink(struct net *src_net, struct net_device *dev, |
2836 | struct nlattr *tb[], struct nlattr *data[]) |
2837 | { |
2838 | struct net_vrf *vrf = netdev_priv(dev); |
2839 | + bool *add_fib_rules; |
2840 | + struct net *net; |
2841 | int err; |
2842 | |
2843 | if (!data || !data[IFLA_VRF_TABLE]) |
2844 | @@ -1252,13 +1256,15 @@ static int vrf_newlink(struct net *src_net, struct net_device *dev, |
2845 | if (err) |
2846 | goto out; |
2847 | |
2848 | - if (add_fib_rules) { |
2849 | + net = dev_net(dev); |
2850 | + add_fib_rules = net_generic(net, vrf_net_id); |
2851 | + if (*add_fib_rules) { |
2852 | err = vrf_add_fib_rules(dev); |
2853 | if (err) { |
2854 | unregister_netdevice(dev); |
2855 | goto out; |
2856 | } |
2857 | - add_fib_rules = false; |
2858 | + *add_fib_rules = false; |
2859 | } |
2860 | |
2861 | out: |
2862 | @@ -1341,16 +1347,38 @@ static struct notifier_block vrf_notifier_block __read_mostly = { |
2863 | .notifier_call = vrf_device_event, |
2864 | }; |
2865 | |
2866 | +/* Initialize per network namespace state */ |
2867 | +static int __net_init vrf_netns_init(struct net *net) |
2868 | +{ |
2869 | + bool *add_fib_rules = net_generic(net, vrf_net_id); |
2870 | + |
2871 | + *add_fib_rules = true; |
2872 | + |
2873 | + return 0; |
2874 | +} |
2875 | + |
2876 | +static struct pernet_operations vrf_net_ops __net_initdata = { |
2877 | + .init = vrf_netns_init, |
2878 | + .id = &vrf_net_id, |
2879 | + .size = sizeof(bool), |
2880 | +}; |
2881 | + |
2882 | static int __init vrf_init_module(void) |
2883 | { |
2884 | int rc; |
2885 | |
2886 | register_netdevice_notifier(&vrf_notifier_block); |
2887 | |
2888 | - rc = rtnl_link_register(&vrf_link_ops); |
2889 | + rc = register_pernet_subsys(&vrf_net_ops); |
2890 | if (rc < 0) |
2891 | goto error; |
2892 | |
2893 | + rc = rtnl_link_register(&vrf_link_ops); |
2894 | + if (rc < 0) { |
2895 | + unregister_pernet_subsys(&vrf_net_ops); |
2896 | + goto error; |
2897 | + } |
2898 | + |
2899 | return 0; |
2900 | |
2901 | error: |
2902 | diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c |
2903 | index 55c4408892be..963e5339a4d7 100644 |
2904 | --- a/drivers/net/vxlan.c |
2905 | +++ b/drivers/net/vxlan.c |
2906 | @@ -2285,7 +2285,7 @@ static void vxlan_cleanup(unsigned long arg) |
2907 | = container_of(p, struct vxlan_fdb, hlist); |
2908 | unsigned long timeout; |
2909 | |
2910 | - if (f->state & NUD_PERMANENT) |
2911 | + if (f->state & (NUD_PERMANENT | NUD_NOARP)) |
2912 | continue; |
2913 | |
2914 | timeout = f->used + vxlan->cfg.age_interval * HZ; |
2915 | diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c |
2916 | index 78d9966a3957..0f5dde1f2248 100644 |
2917 | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c |
2918 | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c |
2919 | @@ -5913,7 +5913,6 @@ static int brcmf_construct_chaninfo(struct brcmf_cfg80211_info *cfg, |
2920 | u32 i, j; |
2921 | u32 total; |
2922 | u32 chaninfo; |
2923 | - u32 index; |
2924 | |
2925 | pbuf = kzalloc(BRCMF_DCMD_MEDLEN, GFP_KERNEL); |
2926 | |
2927 | @@ -5961,33 +5960,36 @@ static int brcmf_construct_chaninfo(struct brcmf_cfg80211_info *cfg, |
2928 | ch.bw == BRCMU_CHAN_BW_80) |
2929 | continue; |
2930 | |
2931 | - channel = band->channels; |
2932 | - index = band->n_channels; |
2933 | + channel = NULL; |
2934 | for (j = 0; j < band->n_channels; j++) { |
2935 | - if (channel[j].hw_value == ch.control_ch_num) { |
2936 | - index = j; |
2937 | + if (band->channels[j].hw_value == ch.control_ch_num) { |
2938 | + channel = &band->channels[j]; |
2939 | break; |
2940 | } |
2941 | } |
2942 | - channel[index].center_freq = |
2943 | - ieee80211_channel_to_frequency(ch.control_ch_num, |
2944 | - band->band); |
2945 | - channel[index].hw_value = ch.control_ch_num; |
2946 | + if (!channel) { |
2947 | + /* It seems firmware supports some channel we never |
2948 | + * considered. Something new in IEEE standard? |
2949 | + */ |
2950 | + brcmf_err("Ignoring unexpected firmware channel %d\n", |
2951 | + ch.control_ch_num); |
2952 | + continue; |
2953 | + } |
2954 | |
2955 | /* assuming the chanspecs order is HT20, |
2956 | * HT40 upper, HT40 lower, and VHT80. |
2957 | */ |
2958 | if (ch.bw == BRCMU_CHAN_BW_80) { |
2959 | - channel[index].flags &= ~IEEE80211_CHAN_NO_80MHZ; |
2960 | + channel->flags &= ~IEEE80211_CHAN_NO_80MHZ; |
2961 | } else if (ch.bw == BRCMU_CHAN_BW_40) { |
2962 | - brcmf_update_bw40_channel_flag(&channel[index], &ch); |
2963 | + brcmf_update_bw40_channel_flag(channel, &ch); |
2964 | } else { |
2965 | /* enable the channel and disable other bandwidths |
2966 | * for now as mentioned order assure they are enabled |
2967 | * for subsequent chanspecs. |
2968 | */ |
2969 | - channel[index].flags = IEEE80211_CHAN_NO_HT40 | |
2970 | - IEEE80211_CHAN_NO_80MHZ; |
2971 | + channel->flags = IEEE80211_CHAN_NO_HT40 | |
2972 | + IEEE80211_CHAN_NO_80MHZ; |
2973 | ch.bw = BRCMU_CHAN_BW_20; |
2974 | cfg->d11inf.encchspec(&ch); |
2975 | chaninfo = ch.chspec; |
2976 | @@ -5995,11 +5997,11 @@ static int brcmf_construct_chaninfo(struct brcmf_cfg80211_info *cfg, |
2977 | &chaninfo); |
2978 | if (!err) { |
2979 | if (chaninfo & WL_CHAN_RADAR) |
2980 | - channel[index].flags |= |
2981 | + channel->flags |= |
2982 | (IEEE80211_CHAN_RADAR | |
2983 | IEEE80211_CHAN_NO_IR); |
2984 | if (chaninfo & WL_CHAN_PASSIVE) |
2985 | - channel[index].flags |= |
2986 | + channel->flags |= |
2987 | IEEE80211_CHAN_NO_IR; |
2988 | } |
2989 | } |
2990 | diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/tt.c b/drivers/net/wireless/intel/iwlwifi/mvm/tt.c |
2991 | index 63a051be832e..bec7d9c46087 100644 |
2992 | --- a/drivers/net/wireless/intel/iwlwifi/mvm/tt.c |
2993 | +++ b/drivers/net/wireless/intel/iwlwifi/mvm/tt.c |
2994 | @@ -843,8 +843,10 @@ static void iwl_mvm_thermal_zone_unregister(struct iwl_mvm *mvm) |
2995 | return; |
2996 | |
2997 | IWL_DEBUG_TEMP(mvm, "Thermal zone device unregister\n"); |
2998 | - thermal_zone_device_unregister(mvm->tz_device.tzone); |
2999 | - mvm->tz_device.tzone = NULL; |
3000 | + if (mvm->tz_device.tzone) { |
3001 | + thermal_zone_device_unregister(mvm->tz_device.tzone); |
3002 | + mvm->tz_device.tzone = NULL; |
3003 | + } |
3004 | } |
3005 | |
3006 | static void iwl_mvm_cooling_device_unregister(struct iwl_mvm *mvm) |
3007 | @@ -853,8 +855,10 @@ static void iwl_mvm_cooling_device_unregister(struct iwl_mvm *mvm) |
3008 | return; |
3009 | |
3010 | IWL_DEBUG_TEMP(mvm, "Cooling device unregister\n"); |
3011 | - thermal_cooling_device_unregister(mvm->cooling_dev.cdev); |
3012 | - mvm->cooling_dev.cdev = NULL; |
3013 | + if (mvm->cooling_dev.cdev) { |
3014 | + thermal_cooling_device_unregister(mvm->cooling_dev.cdev); |
3015 | + mvm->cooling_dev.cdev = NULL; |
3016 | + } |
3017 | } |
3018 | #endif /* CONFIG_THERMAL */ |
3019 | |
3020 | diff --git a/drivers/net/xen-netback/interface.c b/drivers/net/xen-netback/interface.c |
3021 | index 74dc2bf71428..b009d7966b46 100644 |
3022 | --- a/drivers/net/xen-netback/interface.c |
3023 | +++ b/drivers/net/xen-netback/interface.c |
3024 | @@ -221,18 +221,18 @@ static struct net_device_stats *xenvif_get_stats(struct net_device *dev) |
3025 | { |
3026 | struct xenvif *vif = netdev_priv(dev); |
3027 | struct xenvif_queue *queue = NULL; |
3028 | - unsigned int num_queues = vif->num_queues; |
3029 | unsigned long rx_bytes = 0; |
3030 | unsigned long rx_packets = 0; |
3031 | unsigned long tx_bytes = 0; |
3032 | unsigned long tx_packets = 0; |
3033 | unsigned int index; |
3034 | |
3035 | + spin_lock(&vif->lock); |
3036 | if (vif->queues == NULL) |
3037 | goto out; |
3038 | |
3039 | /* Aggregate tx and rx stats from each queue */ |
3040 | - for (index = 0; index < num_queues; ++index) { |
3041 | + for (index = 0; index < vif->num_queues; ++index) { |
3042 | queue = &vif->queues[index]; |
3043 | rx_bytes += queue->stats.rx_bytes; |
3044 | rx_packets += queue->stats.rx_packets; |
3045 | @@ -241,6 +241,8 @@ static struct net_device_stats *xenvif_get_stats(struct net_device *dev) |
3046 | } |
3047 | |
3048 | out: |
3049 | + spin_unlock(&vif->lock); |
3050 | + |
3051 | vif->dev->stats.rx_bytes = rx_bytes; |
3052 | vif->dev->stats.rx_packets = rx_packets; |
3053 | vif->dev->stats.tx_bytes = tx_bytes; |
3054 | diff --git a/drivers/net/xen-netback/xenbus.c b/drivers/net/xen-netback/xenbus.c |
3055 | index 8674e188b697..b44f37fff890 100644 |
3056 | --- a/drivers/net/xen-netback/xenbus.c |
3057 | +++ b/drivers/net/xen-netback/xenbus.c |
3058 | @@ -493,11 +493,22 @@ static int backend_create_xenvif(struct backend_info *be) |
3059 | static void backend_disconnect(struct backend_info *be) |
3060 | { |
3061 | if (be->vif) { |
3062 | + unsigned int queue_index; |
3063 | + |
3064 | xen_unregister_watchers(be->vif); |
3065 | #ifdef CONFIG_DEBUG_FS |
3066 | xenvif_debugfs_delif(be->vif); |
3067 | #endif /* CONFIG_DEBUG_FS */ |
3068 | xenvif_disconnect_data(be->vif); |
3069 | + for (queue_index = 0; queue_index < be->vif->num_queues; ++queue_index) |
3070 | + xenvif_deinit_queue(&be->vif->queues[queue_index]); |
3071 | + |
3072 | + spin_lock(&be->vif->lock); |
3073 | + vfree(be->vif->queues); |
3074 | + be->vif->num_queues = 0; |
3075 | + be->vif->queues = NULL; |
3076 | + spin_unlock(&be->vif->lock); |
3077 | + |
3078 | xenvif_disconnect_ctrl(be->vif); |
3079 | } |
3080 | } |
3081 | @@ -1040,6 +1051,8 @@ static void connect(struct backend_info *be) |
3082 | err: |
3083 | if (be->vif->num_queues > 0) |
3084 | xenvif_disconnect_data(be->vif); /* Clean up existing queues */ |
3085 | + for (queue_index = 0; queue_index < be->vif->num_queues; ++queue_index) |
3086 | + xenvif_deinit_queue(&be->vif->queues[queue_index]); |
3087 | vfree(be->vif->queues); |
3088 | be->vif->queues = NULL; |
3089 | be->vif->num_queues = 0; |
3090 | diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c |
3091 | index 0cdcb2169083..599cf5090030 100644 |
3092 | --- a/drivers/net/xen-netfront.c |
3093 | +++ b/drivers/net/xen-netfront.c |
3094 | @@ -321,7 +321,7 @@ static void xennet_alloc_rx_buffers(struct netfront_queue *queue) |
3095 | queue->rx.req_prod_pvt = req_prod; |
3096 | |
3097 | /* Not enough requests? Try again later. */ |
3098 | - if (req_prod - queue->rx.rsp_cons < NET_RX_SLOTS_MIN) { |
3099 | + if (req_prod - queue->rx.sring->req_prod < NET_RX_SLOTS_MIN) { |
3100 | mod_timer(&queue->rx_refill_timer, jiffies + (HZ/10)); |
3101 | return; |
3102 | } |
3103 | diff --git a/drivers/nvdimm/pmem.c b/drivers/nvdimm/pmem.c |
3104 | index b4808590870c..3456f532077c 100644 |
3105 | --- a/drivers/nvdimm/pmem.c |
3106 | +++ b/drivers/nvdimm/pmem.c |
3107 | @@ -87,7 +87,9 @@ static int read_pmem(struct page *page, unsigned int off, |
3108 | |
3109 | rc = memcpy_from_pmem(mem + off, pmem_addr, len); |
3110 | kunmap_atomic(mem); |
3111 | - return rc; |
3112 | + if (rc) |
3113 | + return -EIO; |
3114 | + return 0; |
3115 | } |
3116 | |
3117 | static int pmem_do_bvec(struct pmem_device *pmem, struct page *page, |
3118 | diff --git a/drivers/pinctrl/intel/pinctrl-intel.c b/drivers/pinctrl/intel/pinctrl-intel.c |
3119 | index 01443762e570..b40a074822cf 100644 |
3120 | --- a/drivers/pinctrl/intel/pinctrl-intel.c |
3121 | +++ b/drivers/pinctrl/intel/pinctrl-intel.c |
3122 | @@ -353,6 +353,21 @@ static int intel_pinmux_set_mux(struct pinctrl_dev *pctldev, unsigned function, |
3123 | return 0; |
3124 | } |
3125 | |
3126 | +static void __intel_gpio_set_direction(void __iomem *padcfg0, bool input) |
3127 | +{ |
3128 | + u32 value; |
3129 | + |
3130 | + value = readl(padcfg0); |
3131 | + if (input) { |
3132 | + value &= ~PADCFG0_GPIORXDIS; |
3133 | + value |= PADCFG0_GPIOTXDIS; |
3134 | + } else { |
3135 | + value &= ~PADCFG0_GPIOTXDIS; |
3136 | + value |= PADCFG0_GPIORXDIS; |
3137 | + } |
3138 | + writel(value, padcfg0); |
3139 | +} |
3140 | + |
3141 | static int intel_gpio_request_enable(struct pinctrl_dev *pctldev, |
3142 | struct pinctrl_gpio_range *range, |
3143 | unsigned pin) |
3144 | @@ -375,11 +390,11 @@ static int intel_gpio_request_enable(struct pinctrl_dev *pctldev, |
3145 | /* Disable SCI/SMI/NMI generation */ |
3146 | value &= ~(PADCFG0_GPIROUTIOXAPIC | PADCFG0_GPIROUTSCI); |
3147 | value &= ~(PADCFG0_GPIROUTSMI | PADCFG0_GPIROUTNMI); |
3148 | - /* Disable TX buffer and enable RX (this will be input) */ |
3149 | - value &= ~PADCFG0_GPIORXDIS; |
3150 | - value |= PADCFG0_GPIOTXDIS; |
3151 | writel(value, padcfg0); |
3152 | |
3153 | + /* Disable TX buffer and enable RX (this will be input) */ |
3154 | + __intel_gpio_set_direction(padcfg0, true); |
3155 | + |
3156 | raw_spin_unlock_irqrestore(&pctrl->lock, flags); |
3157 | |
3158 | return 0; |
3159 | @@ -392,18 +407,11 @@ static int intel_gpio_set_direction(struct pinctrl_dev *pctldev, |
3160 | struct intel_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev); |
3161 | void __iomem *padcfg0; |
3162 | unsigned long flags; |
3163 | - u32 value; |
3164 | |
3165 | raw_spin_lock_irqsave(&pctrl->lock, flags); |
3166 | |
3167 | padcfg0 = intel_get_padcfg(pctrl, pin, PADCFG0); |
3168 | - |
3169 | - value = readl(padcfg0); |
3170 | - if (input) |
3171 | - value |= PADCFG0_GPIOTXDIS; |
3172 | - else |
3173 | - value &= ~PADCFG0_GPIOTXDIS; |
3174 | - writel(value, padcfg0); |
3175 | + __intel_gpio_set_direction(padcfg0, input); |
3176 | |
3177 | raw_spin_unlock_irqrestore(&pctrl->lock, flags); |
3178 | |
3179 | diff --git a/drivers/platform/x86/ideapad-laptop.c b/drivers/platform/x86/ideapad-laptop.c |
3180 | index a7614fc542b5..2f1615e00cb4 100644 |
3181 | --- a/drivers/platform/x86/ideapad-laptop.c |
3182 | +++ b/drivers/platform/x86/ideapad-laptop.c |
3183 | @@ -813,6 +813,7 @@ static void ideapad_acpi_notify(acpi_handle handle, u32 event, void *data) |
3184 | case 8: |
3185 | case 7: |
3186 | case 6: |
3187 | + case 1: |
3188 | ideapad_input_report(priv, vpc_bit); |
3189 | break; |
3190 | case 5: |
3191 | diff --git a/drivers/regulator/tps65086-regulator.c b/drivers/regulator/tps65086-regulator.c |
3192 | index caf174ffa316..6dbf3cf3951e 100644 |
3193 | --- a/drivers/regulator/tps65086-regulator.c |
3194 | +++ b/drivers/regulator/tps65086-regulator.c |
3195 | @@ -156,19 +156,19 @@ static struct tps65086_regulator regulators[] = { |
3196 | VDOA23_VID_MASK, TPS65086_LDOA3CTRL, BIT(0), |
3197 | tps65086_ldoa23_ranges, 0, 0), |
3198 | TPS65086_SWITCH("SWA1", "swa1", SWA1, TPS65086_SWVTT_EN, BIT(5)), |
3199 | - TPS65086_SWITCH("SWB1", "swa2", SWB1, TPS65086_SWVTT_EN, BIT(6)), |
3200 | - TPS65086_SWITCH("SWB2", "swa3", SWB2, TPS65086_SWVTT_EN, BIT(7)), |
3201 | + TPS65086_SWITCH("SWB1", "swb1", SWB1, TPS65086_SWVTT_EN, BIT(6)), |
3202 | + TPS65086_SWITCH("SWB2", "swb2", SWB2, TPS65086_SWVTT_EN, BIT(7)), |
3203 | TPS65086_SWITCH("VTT", "vtt", VTT, TPS65086_SWVTT_EN, BIT(4)), |
3204 | }; |
3205 | |
3206 | -static int tps65086_of_parse_cb(struct device_node *dev, |
3207 | +static int tps65086_of_parse_cb(struct device_node *node, |
3208 | const struct regulator_desc *desc, |
3209 | struct regulator_config *config) |
3210 | { |
3211 | int ret; |
3212 | |
3213 | /* Check for 25mV step mode */ |
3214 | - if (of_property_read_bool(config->of_node, "ti,regulator-step-size-25mv")) { |
3215 | + if (of_property_read_bool(node, "ti,regulator-step-size-25mv")) { |
3216 | switch (desc->id) { |
3217 | case BUCK1: |
3218 | case BUCK2: |
3219 | @@ -192,7 +192,7 @@ static int tps65086_of_parse_cb(struct device_node *dev, |
3220 | } |
3221 | |
3222 | /* Check for decay mode */ |
3223 | - if (desc->id <= BUCK6 && of_property_read_bool(config->of_node, "ti,regulator-decay")) { |
3224 | + if (desc->id <= BUCK6 && of_property_read_bool(node, "ti,regulator-decay")) { |
3225 | ret = regmap_write_bits(config->regmap, |
3226 | regulators[desc->id].decay_reg, |
3227 | regulators[desc->id].decay_mask, |
3228 | diff --git a/drivers/scsi/lpfc/lpfc_els.c b/drivers/scsi/lpfc/lpfc_els.c |
3229 | index b7d54bfb1df9..7b696d108112 100644 |
3230 | --- a/drivers/scsi/lpfc/lpfc_els.c |
3231 | +++ b/drivers/scsi/lpfc/lpfc_els.c |
3232 | @@ -3590,12 +3590,14 @@ lpfc_els_free_iocb(struct lpfc_hba *phba, struct lpfc_iocbq *elsiocb) |
3233 | } else { |
3234 | buf_ptr1 = (struct lpfc_dmabuf *) elsiocb->context2; |
3235 | lpfc_els_free_data(phba, buf_ptr1); |
3236 | + elsiocb->context2 = NULL; |
3237 | } |
3238 | } |
3239 | |
3240 | if (elsiocb->context3) { |
3241 | buf_ptr = (struct lpfc_dmabuf *) elsiocb->context3; |
3242 | lpfc_els_free_bpl(phba, buf_ptr); |
3243 | + elsiocb->context3 = NULL; |
3244 | } |
3245 | lpfc_sli_release_iocbq(phba, elsiocb); |
3246 | return 0; |
3247 | diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c |
3248 | index 49b4c798de18..2d4f4b58dcfa 100644 |
3249 | --- a/drivers/scsi/lpfc/lpfc_sli.c |
3250 | +++ b/drivers/scsi/lpfc/lpfc_sli.c |
3251 | @@ -5951,18 +5951,25 @@ lpfc_sli4_alloc_resource_identifiers(struct lpfc_hba *phba) |
3252 | |
3253 | free_vfi_bmask: |
3254 | kfree(phba->sli4_hba.vfi_bmask); |
3255 | + phba->sli4_hba.vfi_bmask = NULL; |
3256 | free_xri_ids: |
3257 | kfree(phba->sli4_hba.xri_ids); |
3258 | + phba->sli4_hba.xri_ids = NULL; |
3259 | free_xri_bmask: |
3260 | kfree(phba->sli4_hba.xri_bmask); |
3261 | + phba->sli4_hba.xri_bmask = NULL; |
3262 | free_vpi_ids: |
3263 | kfree(phba->vpi_ids); |
3264 | + phba->vpi_ids = NULL; |
3265 | free_vpi_bmask: |
3266 | kfree(phba->vpi_bmask); |
3267 | + phba->vpi_bmask = NULL; |
3268 | free_rpi_ids: |
3269 | kfree(phba->sli4_hba.rpi_ids); |
3270 | + phba->sli4_hba.rpi_ids = NULL; |
3271 | free_rpi_bmask: |
3272 | kfree(phba->sli4_hba.rpi_bmask); |
3273 | + phba->sli4_hba.rpi_bmask = NULL; |
3274 | err_exit: |
3275 | return rc; |
3276 | } |
3277 | diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h |
3278 | index 8e63a7b90277..91ec0689c714 100644 |
3279 | --- a/drivers/scsi/qla2xxx/qla_def.h |
3280 | +++ b/drivers/scsi/qla2xxx/qla_def.h |
3281 | @@ -1555,7 +1555,8 @@ typedef struct { |
3282 | struct atio { |
3283 | uint8_t entry_type; /* Entry type. */ |
3284 | uint8_t entry_count; /* Entry count. */ |
3285 | - uint8_t data[58]; |
3286 | + __le16 attr_n_length; |
3287 | + uint8_t data[56]; |
3288 | uint32_t signature; |
3289 | #define ATIO_PROCESSED 0xDEADDEAD /* Signature */ |
3290 | }; |
3291 | diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c |
3292 | index 068c4e47fac9..bddaabb288d4 100644 |
3293 | --- a/drivers/scsi/qla2xxx/qla_isr.c |
3294 | +++ b/drivers/scsi/qla2xxx/qla_isr.c |
3295 | @@ -2487,6 +2487,10 @@ qla2x00_error_entry(scsi_qla_host_t *vha, struct rsp_que *rsp, sts_entry_t *pkt) |
3296 | if (pkt->entry_status & RF_BUSY) |
3297 | res = DID_BUS_BUSY << 16; |
3298 | |
3299 | + if (pkt->entry_type == NOTIFY_ACK_TYPE && |
3300 | + pkt->handle == QLA_TGT_SKIP_HANDLE) |
3301 | + return; |
3302 | + |
3303 | sp = qla2x00_get_sp_from_handle(vha, func, req, pkt); |
3304 | if (sp) { |
3305 | sp->done(ha, sp, res); |
3306 | diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c |
3307 | index feab7ea8e823..91f5f55a8a9b 100644 |
3308 | --- a/drivers/scsi/qla2xxx/qla_target.c |
3309 | +++ b/drivers/scsi/qla2xxx/qla_target.c |
3310 | @@ -3067,7 +3067,7 @@ static int __qlt_send_term_imm_notif(struct scsi_qla_host *vha, |
3311 | |
3312 | pkt->entry_type = NOTIFY_ACK_TYPE; |
3313 | pkt->entry_count = 1; |
3314 | - pkt->handle = QLA_TGT_SKIP_HANDLE | CTIO_COMPLETION_HANDLE_MARK; |
3315 | + pkt->handle = QLA_TGT_SKIP_HANDLE; |
3316 | |
3317 | nack = (struct nack_to_isp *)pkt; |
3318 | nack->ox_id = ntfy->ox_id; |
3319 | @@ -6463,12 +6463,29 @@ qlt_24xx_process_atio_queue(struct scsi_qla_host *vha, uint8_t ha_locked) |
3320 | if (!vha->flags.online) |
3321 | return; |
3322 | |
3323 | - while (ha->tgt.atio_ring_ptr->signature != ATIO_PROCESSED) { |
3324 | + while ((ha->tgt.atio_ring_ptr->signature != ATIO_PROCESSED) || |
3325 | + fcpcmd_is_corrupted(ha->tgt.atio_ring_ptr)) { |
3326 | pkt = (struct atio_from_isp *)ha->tgt.atio_ring_ptr; |
3327 | cnt = pkt->u.raw.entry_count; |
3328 | |
3329 | - qlt_24xx_atio_pkt_all_vps(vha, (struct atio_from_isp *)pkt, |
3330 | - ha_locked); |
3331 | + if (unlikely(fcpcmd_is_corrupted(ha->tgt.atio_ring_ptr))) { |
3332 | + /* |
3333 | + * This packet is corrupted. The header + payload |
3334 | + * can not be trusted. There is no point in passing |
3335 | + * it further up. |
3336 | + */ |
3337 | + ql_log(ql_log_warn, vha, 0xffff, |
3338 | + "corrupted fcp frame SID[%3phN] OXID[%04x] EXCG[%x] %64phN\n", |
3339 | + pkt->u.isp24.fcp_hdr.s_id, |
3340 | + be16_to_cpu(pkt->u.isp24.fcp_hdr.ox_id), |
3341 | + le32_to_cpu(pkt->u.isp24.exchange_addr), pkt); |
3342 | + |
3343 | + adjust_corrupted_atio(pkt); |
3344 | + qlt_send_term_exchange(vha, NULL, pkt, ha_locked, 0); |
3345 | + } else { |
3346 | + qlt_24xx_atio_pkt_all_vps(vha, |
3347 | + (struct atio_from_isp *)pkt, ha_locked); |
3348 | + } |
3349 | |
3350 | for (i = 0; i < cnt; i++) { |
3351 | ha->tgt.atio_ring_index++; |
3352 | diff --git a/drivers/scsi/qla2xxx/qla_target.h b/drivers/scsi/qla2xxx/qla_target.h |
3353 | index f26c5f60eedd..0824a8164a24 100644 |
3354 | --- a/drivers/scsi/qla2xxx/qla_target.h |
3355 | +++ b/drivers/scsi/qla2xxx/qla_target.h |
3356 | @@ -427,13 +427,33 @@ struct atio_from_isp { |
3357 | struct { |
3358 | uint8_t entry_type; /* Entry type. */ |
3359 | uint8_t entry_count; /* Entry count. */ |
3360 | - uint8_t data[58]; |
3361 | + __le16 attr_n_length; |
3362 | +#define FCP_CMD_LENGTH_MASK 0x0fff |
3363 | +#define FCP_CMD_LENGTH_MIN 0x38 |
3364 | + uint8_t data[56]; |
3365 | uint32_t signature; |
3366 | #define ATIO_PROCESSED 0xDEADDEAD /* Signature */ |
3367 | } raw; |
3368 | } u; |
3369 | } __packed; |
3370 | |
3371 | +static inline int fcpcmd_is_corrupted(struct atio *atio) |
3372 | +{ |
3373 | + if (atio->entry_type == ATIO_TYPE7 && |
3374 | + (le16_to_cpu(atio->attr_n_length & FCP_CMD_LENGTH_MASK) < |
3375 | + FCP_CMD_LENGTH_MIN)) |
3376 | + return 1; |
3377 | + else |
3378 | + return 0; |
3379 | +} |
3380 | + |
3381 | +/* adjust corrupted atio so we won't trip over the same entry again. */ |
3382 | +static inline void adjust_corrupted_atio(struct atio_from_isp *atio) |
3383 | +{ |
3384 | + atio->u.raw.attr_n_length = cpu_to_le16(FCP_CMD_LENGTH_MIN); |
3385 | + atio->u.isp24.fcp_cmnd.add_cdb_len = 0; |
3386 | +} |
3387 | + |
3388 | #define CTIO_TYPE7 0x12 /* Continue target I/O entry (for 24xx) */ |
3389 | |
3390 | /* |
3391 | diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c |
3392 | index 931af0793951..13ac7e57a35d 100644 |
3393 | --- a/drivers/scsi/sd.c |
3394 | +++ b/drivers/scsi/sd.c |
3395 | @@ -2572,7 +2572,8 @@ sd_read_cache_type(struct scsi_disk *sdkp, unsigned char *buffer) |
3396 | if (sdp->broken_fua) { |
3397 | sd_first_printk(KERN_NOTICE, sdkp, "Disabling FUA\n"); |
3398 | sdkp->DPOFUA = 0; |
3399 | - } else if (sdkp->DPOFUA && !sdkp->device->use_10_for_rw) { |
3400 | + } else if (sdkp->DPOFUA && !sdkp->device->use_10_for_rw && |
3401 | + !sdkp->device->use_16_for_rw) { |
3402 | sd_first_printk(KERN_NOTICE, sdkp, |
3403 | "Uses READ/WRITE(6), disabling FUA\n"); |
3404 | sdkp->DPOFUA = 0; |
3405 | diff --git a/drivers/scsi/virtio_scsi.c b/drivers/scsi/virtio_scsi.c |
3406 | index ec91bd07f00a..c680d7641311 100644 |
3407 | --- a/drivers/scsi/virtio_scsi.c |
3408 | +++ b/drivers/scsi/virtio_scsi.c |
3409 | @@ -534,7 +534,9 @@ static int virtscsi_queuecommand(struct virtio_scsi *vscsi, |
3410 | { |
3411 | struct Scsi_Host *shost = virtio_scsi_host(vscsi->vdev); |
3412 | struct virtio_scsi_cmd *cmd = scsi_cmd_priv(sc); |
3413 | + unsigned long flags; |
3414 | int req_size; |
3415 | + int ret; |
3416 | |
3417 | BUG_ON(scsi_sg_count(sc) > shost->sg_tablesize); |
3418 | |
3419 | @@ -562,8 +564,15 @@ static int virtscsi_queuecommand(struct virtio_scsi *vscsi, |
3420 | req_size = sizeof(cmd->req.cmd); |
3421 | } |
3422 | |
3423 | - if (virtscsi_kick_cmd(req_vq, cmd, req_size, sizeof(cmd->resp.cmd)) != 0) |
3424 | + ret = virtscsi_kick_cmd(req_vq, cmd, req_size, sizeof(cmd->resp.cmd)); |
3425 | + if (ret == -EIO) { |
3426 | + cmd->resp.cmd.response = VIRTIO_SCSI_S_BAD_TARGET; |
3427 | + spin_lock_irqsave(&req_vq->vq_lock, flags); |
3428 | + virtscsi_complete_cmd(vscsi, cmd); |
3429 | + spin_unlock_irqrestore(&req_vq->vq_lock, flags); |
3430 | + } else if (ret != 0) { |
3431 | return SCSI_MLQUEUE_HOST_BUSY; |
3432 | + } |
3433 | return 0; |
3434 | } |
3435 | |
3436 | diff --git a/drivers/spi/spi-davinci.c b/drivers/spi/spi-davinci.c |
3437 | index d36c11b73a35..02fb96797ac8 100644 |
3438 | --- a/drivers/spi/spi-davinci.c |
3439 | +++ b/drivers/spi/spi-davinci.c |
3440 | @@ -646,7 +646,7 @@ static int davinci_spi_bufs(struct spi_device *spi, struct spi_transfer *t) |
3441 | buf = t->rx_buf; |
3442 | t->rx_dma = dma_map_single(&spi->dev, buf, |
3443 | t->len, DMA_FROM_DEVICE); |
3444 | - if (!t->rx_dma) { |
3445 | + if (dma_mapping_error(&spi->dev, !t->rx_dma)) { |
3446 | ret = -EFAULT; |
3447 | goto err_rx_map; |
3448 | } |
3449 | @@ -660,7 +660,7 @@ static int davinci_spi_bufs(struct spi_device *spi, struct spi_transfer *t) |
3450 | buf = (void *)t->tx_buf; |
3451 | t->tx_dma = dma_map_single(&spi->dev, buf, |
3452 | t->len, DMA_TO_DEVICE); |
3453 | - if (!t->tx_dma) { |
3454 | + if (dma_mapping_error(&spi->dev, t->tx_dma)) { |
3455 | ret = -EFAULT; |
3456 | goto err_tx_map; |
3457 | } |
3458 | diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c |
3459 | index 24d4492d0168..6db80635ace8 100644 |
3460 | --- a/drivers/spi/spi.c |
3461 | +++ b/drivers/spi/spi.c |
3462 | @@ -621,8 +621,10 @@ void spi_unregister_device(struct spi_device *spi) |
3463 | if (!spi) |
3464 | return; |
3465 | |
3466 | - if (spi->dev.of_node) |
3467 | + if (spi->dev.of_node) { |
3468 | of_node_clear_flag(spi->dev.of_node, OF_POPULATED); |
3469 | + of_node_put(spi->dev.of_node); |
3470 | + } |
3471 | if (ACPI_COMPANION(&spi->dev)) |
3472 | acpi_device_clear_enumerated(ACPI_COMPANION(&spi->dev)); |
3473 | device_unregister(&spi->dev); |
3474 | @@ -797,12 +799,12 @@ static int __spi_map_msg(struct spi_master *master, struct spi_message *msg) |
3475 | if (master->dma_tx) |
3476 | tx_dev = master->dma_tx->device->dev; |
3477 | else |
3478 | - tx_dev = &master->dev; |
3479 | + tx_dev = master->dev.parent; |
3480 | |
3481 | if (master->dma_rx) |
3482 | rx_dev = master->dma_rx->device->dev; |
3483 | else |
3484 | - rx_dev = &master->dev; |
3485 | + rx_dev = master->dev.parent; |
3486 | |
3487 | list_for_each_entry(xfer, &msg->transfers, transfer_list) { |
3488 | if (!master->can_dma(master, msg->spi, xfer)) |
3489 | @@ -844,12 +846,12 @@ static int __spi_unmap_msg(struct spi_master *master, struct spi_message *msg) |
3490 | if (master->dma_tx) |
3491 | tx_dev = master->dma_tx->device->dev; |
3492 | else |
3493 | - tx_dev = &master->dev; |
3494 | + tx_dev = master->dev.parent; |
3495 | |
3496 | if (master->dma_rx) |
3497 | rx_dev = master->dma_rx->device->dev; |
3498 | else |
3499 | - rx_dev = &master->dev; |
3500 | + rx_dev = master->dev.parent; |
3501 | |
3502 | list_for_each_entry(xfer, &msg->transfers, transfer_list) { |
3503 | if (!master->can_dma(master, msg->spi, xfer)) |
3504 | @@ -1589,11 +1591,13 @@ of_register_spi_device(struct spi_master *master, struct device_node *nc) |
3505 | if (rc) { |
3506 | dev_err(&master->dev, "spi_device register error %s\n", |
3507 | nc->full_name); |
3508 | - goto err_out; |
3509 | + goto err_of_node_put; |
3510 | } |
3511 | |
3512 | return spi; |
3513 | |
3514 | +err_of_node_put: |
3515 | + of_node_put(nc); |
3516 | err_out: |
3517 | spi_dev_put(spi); |
3518 | return ERR_PTR(rc); |
3519 | diff --git a/drivers/usb/dwc2/gadget.c b/drivers/usb/dwc2/gadget.c |
3520 | index 24fbebc9b409..cfdd5c3da236 100644 |
3521 | --- a/drivers/usb/dwc2/gadget.c |
3522 | +++ b/drivers/usb/dwc2/gadget.c |
3523 | @@ -2532,7 +2532,7 @@ void dwc2_hsotg_core_init_disconnected(struct dwc2_hsotg *hsotg, |
3524 | /* keep other bits untouched (so e.g. forced modes are not lost) */ |
3525 | usbcfg = dwc2_readl(hsotg->regs + GUSBCFG); |
3526 | usbcfg &= ~(GUSBCFG_TOUTCAL_MASK | GUSBCFG_PHYIF16 | GUSBCFG_SRPCAP | |
3527 | - GUSBCFG_HNPCAP); |
3528 | + GUSBCFG_HNPCAP | GUSBCFG_USBTRDTIM_MASK); |
3529 | |
3530 | /* set the PLL on, remove the HNP/SRP and set the PHY */ |
3531 | val = (hsotg->phyif == GUSBCFG_PHYIF8) ? 9 : 5; |
3532 | @@ -3403,7 +3403,7 @@ static void dwc2_hsotg_init(struct dwc2_hsotg *hsotg) |
3533 | /* keep other bits untouched (so e.g. forced modes are not lost) */ |
3534 | usbcfg = dwc2_readl(hsotg->regs + GUSBCFG); |
3535 | usbcfg &= ~(GUSBCFG_TOUTCAL_MASK | GUSBCFG_PHYIF16 | GUSBCFG_SRPCAP | |
3536 | - GUSBCFG_HNPCAP); |
3537 | + GUSBCFG_HNPCAP | GUSBCFG_USBTRDTIM_MASK); |
3538 | |
3539 | /* set the PLL on, remove the HNP/SRP and set the PHY */ |
3540 | trdtim = (hsotg->phyif == GUSBCFG_PHYIF8) ? 9 : 5; |
3541 | diff --git a/drivers/usb/gadget/function/f_fs.c b/drivers/usb/gadget/function/f_fs.c |
3542 | index 04ffd7640c33..f9c99803a43d 100644 |
3543 | --- a/drivers/usb/gadget/function/f_fs.c |
3544 | +++ b/drivers/usb/gadget/function/f_fs.c |
3545 | @@ -3688,6 +3688,7 @@ static void ffs_closed(struct ffs_data *ffs) |
3546 | { |
3547 | struct ffs_dev *ffs_obj; |
3548 | struct f_fs_opts *opts; |
3549 | + struct config_item *ci; |
3550 | |
3551 | ENTER(); |
3552 | ffs_dev_lock(); |
3553 | @@ -3711,8 +3712,11 @@ static void ffs_closed(struct ffs_data *ffs) |
3554 | || !atomic_read(&opts->func_inst.group.cg_item.ci_kref.refcount)) |
3555 | goto done; |
3556 | |
3557 | - unregister_gadget_item(ffs_obj->opts-> |
3558 | - func_inst.group.cg_item.ci_parent->ci_parent); |
3559 | + ci = opts->func_inst.group.cg_item.ci_parent->ci_parent; |
3560 | + ffs_dev_unlock(); |
3561 | + |
3562 | + unregister_gadget_item(ci); |
3563 | + return; |
3564 | done: |
3565 | ffs_dev_unlock(); |
3566 | } |
3567 | diff --git a/drivers/vfio/vfio_iommu_spapr_tce.c b/drivers/vfio/vfio_iommu_spapr_tce.c |
3568 | index 79ddcb05d126..85d3e648bdea 100644 |
3569 | --- a/drivers/vfio/vfio_iommu_spapr_tce.c |
3570 | +++ b/drivers/vfio/vfio_iommu_spapr_tce.c |
3571 | @@ -1292,6 +1292,10 @@ static int tce_iommu_attach_group(void *iommu_data, |
3572 | /* pr_debug("tce_vfio: Attaching group #%u to iommu %p\n", |
3573 | iommu_group_id(iommu_group), iommu_group); */ |
3574 | table_group = iommu_group_get_iommudata(iommu_group); |
3575 | + if (!table_group) { |
3576 | + ret = -ENODEV; |
3577 | + goto unlock_exit; |
3578 | + } |
3579 | |
3580 | if (tce_groups_attached(container) && (!table_group->ops || |
3581 | !table_group->ops->take_ownership || |
3582 | diff --git a/drivers/watchdog/bcm_kona_wdt.c b/drivers/watchdog/bcm_kona_wdt.c |
3583 | index e0c98423f2c9..11a72bc2c71b 100644 |
3584 | --- a/drivers/watchdog/bcm_kona_wdt.c |
3585 | +++ b/drivers/watchdog/bcm_kona_wdt.c |
3586 | @@ -304,6 +304,8 @@ static int bcm_kona_wdt_probe(struct platform_device *pdev) |
3587 | if (!wdt) |
3588 | return -ENOMEM; |
3589 | |
3590 | + spin_lock_init(&wdt->lock); |
3591 | + |
3592 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
3593 | wdt->base = devm_ioremap_resource(dev, res); |
3594 | if (IS_ERR(wdt->base)) |
3595 | @@ -316,7 +318,6 @@ static int bcm_kona_wdt_probe(struct platform_device *pdev) |
3596 | return ret; |
3597 | } |
3598 | |
3599 | - spin_lock_init(&wdt->lock); |
3600 | platform_set_drvdata(pdev, wdt); |
3601 | watchdog_set_drvdata(&bcm_kona_wdt_wdd, wdt); |
3602 | bcm_kona_wdt_wdd.parent = &pdev->dev; |
3603 | diff --git a/drivers/xen/swiotlb-xen.c b/drivers/xen/swiotlb-xen.c |
3604 | index 8e7a3d646531..679f79f68182 100644 |
3605 | --- a/drivers/xen/swiotlb-xen.c |
3606 | +++ b/drivers/xen/swiotlb-xen.c |
3607 | @@ -409,9 +409,9 @@ dma_addr_t xen_swiotlb_map_page(struct device *dev, struct page *page, |
3608 | if (map == SWIOTLB_MAP_ERROR) |
3609 | return DMA_ERROR_CODE; |
3610 | |
3611 | + dev_addr = xen_phys_to_bus(map); |
3612 | xen_dma_map_page(dev, pfn_to_page(map >> PAGE_SHIFT), |
3613 | dev_addr, map & ~PAGE_MASK, size, dir, attrs); |
3614 | - dev_addr = xen_phys_to_bus(map); |
3615 | |
3616 | /* |
3617 | * Ensure that the address returned is DMA'ble |
3618 | @@ -567,13 +567,14 @@ xen_swiotlb_map_sg_attrs(struct device *hwdev, struct scatterlist *sgl, |
3619 | sg_dma_len(sgl) = 0; |
3620 | return 0; |
3621 | } |
3622 | + dev_addr = xen_phys_to_bus(map); |
3623 | xen_dma_map_page(hwdev, pfn_to_page(map >> PAGE_SHIFT), |
3624 | dev_addr, |
3625 | map & ~PAGE_MASK, |
3626 | sg->length, |
3627 | dir, |
3628 | attrs); |
3629 | - sg->dma_address = xen_phys_to_bus(map); |
3630 | + sg->dma_address = dev_addr; |
3631 | } else { |
3632 | /* we are not interested in the dma_addr returned by |
3633 | * xen_dma_map_page, only in the potential cache flushes executed |
3634 | diff --git a/fs/aio.c b/fs/aio.c |
3635 | index 428484f2f841..0fcb49ad67d4 100644 |
3636 | --- a/fs/aio.c |
3637 | +++ b/fs/aio.c |
3638 | @@ -1085,7 +1085,8 @@ static void aio_complete(struct kiocb *kiocb, long res, long res2) |
3639 | * Tell lockdep we inherited freeze protection from submission |
3640 | * thread. |
3641 | */ |
3642 | - __sb_writers_acquired(file_inode(file)->i_sb, SB_FREEZE_WRITE); |
3643 | + if (S_ISREG(file_inode(file)->i_mode)) |
3644 | + __sb_writers_acquired(file_inode(file)->i_sb, SB_FREEZE_WRITE); |
3645 | file_end_write(file); |
3646 | } |
3647 | |
3648 | @@ -1492,7 +1493,8 @@ static ssize_t aio_write(struct kiocb *req, struct iocb *iocb, bool vectored, |
3649 | * by telling it the lock got released so that it doesn't |
3650 | * complain about held lock when we return to userspace. |
3651 | */ |
3652 | - __sb_writers_release(file_inode(file)->i_sb, SB_FREEZE_WRITE); |
3653 | + if (S_ISREG(file_inode(file)->i_mode)) |
3654 | + __sb_writers_release(file_inode(file)->i_sb, SB_FREEZE_WRITE); |
3655 | } |
3656 | kfree(iovec); |
3657 | return ret; |
3658 | diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c |
3659 | index 2472af2798c7..cfd724f98332 100644 |
3660 | --- a/fs/binfmt_elf.c |
3661 | +++ b/fs/binfmt_elf.c |
3662 | @@ -2296,6 +2296,7 @@ static int elf_core_dump(struct coredump_params *cprm) |
3663 | goto end_coredump; |
3664 | } |
3665 | } |
3666 | + dump_truncate(cprm); |
3667 | |
3668 | if (!elf_core_write_extra_data(cprm)) |
3669 | goto end_coredump; |
3670 | diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c |
3671 | index bddbae796941..a2a014b19f18 100644 |
3672 | --- a/fs/btrfs/inode.c |
3673 | +++ b/fs/btrfs/inode.c |
3674 | @@ -4480,8 +4480,19 @@ int btrfs_truncate_inode_items(struct btrfs_trans_handle *trans, |
3675 | if (found_type > min_type) { |
3676 | del_item = 1; |
3677 | } else { |
3678 | - if (item_end < new_size) |
3679 | + if (item_end < new_size) { |
3680 | + /* |
3681 | + * With NO_HOLES mode, for the following mapping |
3682 | + * |
3683 | + * [0-4k][hole][8k-12k] |
3684 | + * |
3685 | + * if truncating isize down to 6k, it ends up |
3686 | + * isize being 8k. |
3687 | + */ |
3688 | + if (btrfs_fs_incompat(root->fs_info, NO_HOLES)) |
3689 | + last_size = new_size; |
3690 | break; |
3691 | + } |
3692 | if (found_key.offset >= new_size) |
3693 | del_item = 1; |
3694 | else |
3695 | @@ -7235,7 +7246,6 @@ static struct extent_map *btrfs_create_dio_extent(struct inode *inode, |
3696 | struct extent_map *em = NULL; |
3697 | int ret; |
3698 | |
3699 | - down_read(&BTRFS_I(inode)->dio_sem); |
3700 | if (type != BTRFS_ORDERED_NOCOW) { |
3701 | em = create_pinned_em(inode, start, len, orig_start, |
3702 | block_start, block_len, orig_block_len, |
3703 | @@ -7254,7 +7264,6 @@ static struct extent_map *btrfs_create_dio_extent(struct inode *inode, |
3704 | em = ERR_PTR(ret); |
3705 | } |
3706 | out: |
3707 | - up_read(&BTRFS_I(inode)->dio_sem); |
3708 | |
3709 | return em; |
3710 | } |
3711 | @@ -8707,6 +8716,7 @@ static ssize_t btrfs_direct_IO(struct kiocb *iocb, struct iov_iter *iter) |
3712 | dio_data.unsubmitted_oe_range_start = (u64)offset; |
3713 | dio_data.unsubmitted_oe_range_end = (u64)offset; |
3714 | current->journal_info = &dio_data; |
3715 | + down_read(&BTRFS_I(inode)->dio_sem); |
3716 | } else if (test_bit(BTRFS_INODE_READDIO_NEED_LOCK, |
3717 | &BTRFS_I(inode)->runtime_flags)) { |
3718 | inode_dio_end(inode); |
3719 | @@ -8719,6 +8729,7 @@ static ssize_t btrfs_direct_IO(struct kiocb *iocb, struct iov_iter *iter) |
3720 | iter, btrfs_get_blocks_direct, NULL, |
3721 | btrfs_submit_direct, flags); |
3722 | if (iov_iter_rw(iter) == WRITE) { |
3723 | + up_read(&BTRFS_I(inode)->dio_sem); |
3724 | current->journal_info = NULL; |
3725 | if (ret < 0 && ret != -EIOCBQUEUED) { |
3726 | if (dio_data.reserve) |
3727 | diff --git a/fs/coredump.c b/fs/coredump.c |
3728 | index eb9c92c9b20f..4407e27beca9 100644 |
3729 | --- a/fs/coredump.c |
3730 | +++ b/fs/coredump.c |
3731 | @@ -833,3 +833,21 @@ int dump_align(struct coredump_params *cprm, int align) |
3732 | return mod ? dump_skip(cprm, align - mod) : 1; |
3733 | } |
3734 | EXPORT_SYMBOL(dump_align); |
3735 | + |
3736 | +/* |
3737 | + * Ensures that file size is big enough to contain the current file |
3738 | + * postion. This prevents gdb from complaining about a truncated file |
3739 | + * if the last "write" to the file was dump_skip. |
3740 | + */ |
3741 | +void dump_truncate(struct coredump_params *cprm) |
3742 | +{ |
3743 | + struct file *file = cprm->file; |
3744 | + loff_t offset; |
3745 | + |
3746 | + if (file->f_op->llseek && file->f_op->llseek != no_llseek) { |
3747 | + offset = file->f_op->llseek(file, 0, SEEK_CUR); |
3748 | + if (i_size_read(file->f_mapping->host) < offset) |
3749 | + do_truncate(file->f_path.dentry, offset, 0, file); |
3750 | + } |
3751 | +} |
3752 | +EXPORT_SYMBOL(dump_truncate); |
3753 | diff --git a/fs/nfs/callback.c b/fs/nfs/callback.c |
3754 | index 484bebc20bca..0a2115084c3f 100644 |
3755 | --- a/fs/nfs/callback.c |
3756 | +++ b/fs/nfs/callback.c |
3757 | @@ -279,7 +279,7 @@ static struct svc_serv *nfs_callback_create_svc(int minorversion) |
3758 | printk(KERN_WARNING "nfs_callback_create_svc: no kthread, %d users??\n", |
3759 | cb_info->users); |
3760 | |
3761 | - serv = svc_create(&nfs4_callback_program, NFS4_CALLBACK_BUFSIZE, sv_ops); |
3762 | + serv = svc_create_pooled(&nfs4_callback_program, NFS4_CALLBACK_BUFSIZE, sv_ops); |
3763 | if (!serv) { |
3764 | printk(KERN_ERR "nfs_callback_create_svc: create service failed\n"); |
3765 | return ERR_PTR(-ENOMEM); |
3766 | diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c |
3767 | index fc9b04941739..401ea6e4cab8 100644 |
3768 | --- a/fs/nfs/nfs4proc.c |
3769 | +++ b/fs/nfs/nfs4proc.c |
3770 | @@ -2343,8 +2343,6 @@ static int nfs4_opendata_access(struct rpc_cred *cred, |
3771 | if ((mask & ~cache.mask & (MAY_READ | MAY_EXEC)) == 0) |
3772 | return 0; |
3773 | |
3774 | - /* even though OPEN succeeded, access is denied. Close the file */ |
3775 | - nfs4_close_state(state, fmode); |
3776 | return -EACCES; |
3777 | } |
3778 | |
3779 | @@ -8431,6 +8429,7 @@ static void nfs4_layoutget_release(void *calldata) |
3780 | size_t max_pages = max_response_pages(server); |
3781 | |
3782 | dprintk("--> %s\n", __func__); |
3783 | + nfs4_sequence_free_slot(&lgp->res.seq_res); |
3784 | nfs4_free_pages(lgp->args.layout.pages, max_pages); |
3785 | pnfs_put_layout_hdr(NFS_I(inode)->layout); |
3786 | put_nfs_open_context(lgp->args.ctx); |
3787 | @@ -8505,7 +8504,6 @@ nfs4_proc_layoutget(struct nfs4_layoutget *lgp, long *timeout, gfp_t gfp_flags) |
3788 | /* if layoutp->len is 0, nfs4_layoutget_prepare called rpc_exit */ |
3789 | if (status == 0 && lgp->res.layoutp->len) |
3790 | lseg = pnfs_layout_process(lgp); |
3791 | - nfs4_sequence_free_slot(&lgp->res.seq_res); |
3792 | rpc_put_task(task); |
3793 | dprintk("<-- %s status=%d\n", __func__, status); |
3794 | if (status) |
3795 | diff --git a/fs/ocfs2/cluster/heartbeat.c b/fs/ocfs2/cluster/heartbeat.c |
3796 | index 636abcbd4650..5e8709aa1e7e 100644 |
3797 | --- a/fs/ocfs2/cluster/heartbeat.c |
3798 | +++ b/fs/ocfs2/cluster/heartbeat.c |
3799 | @@ -2242,13 +2242,13 @@ static void o2hb_heartbeat_group_drop_item(struct config_group *group, |
3800 | spin_unlock(&o2hb_live_lock); |
3801 | } |
3802 | |
3803 | -static ssize_t o2hb_heartbeat_group_threshold_show(struct config_item *item, |
3804 | +static ssize_t o2hb_heartbeat_group_dead_threshold_show(struct config_item *item, |
3805 | char *page) |
3806 | { |
3807 | return sprintf(page, "%u\n", o2hb_dead_threshold); |
3808 | } |
3809 | |
3810 | -static ssize_t o2hb_heartbeat_group_threshold_store(struct config_item *item, |
3811 | +static ssize_t o2hb_heartbeat_group_dead_threshold_store(struct config_item *item, |
3812 | const char *page, size_t count) |
3813 | { |
3814 | unsigned long tmp; |
3815 | @@ -2297,11 +2297,11 @@ static ssize_t o2hb_heartbeat_group_mode_store(struct config_item *item, |
3816 | |
3817 | } |
3818 | |
3819 | -CONFIGFS_ATTR(o2hb_heartbeat_group_, threshold); |
3820 | +CONFIGFS_ATTR(o2hb_heartbeat_group_, dead_threshold); |
3821 | CONFIGFS_ATTR(o2hb_heartbeat_group_, mode); |
3822 | |
3823 | static struct configfs_attribute *o2hb_heartbeat_group_attrs[] = { |
3824 | - &o2hb_heartbeat_group_attr_threshold, |
3825 | + &o2hb_heartbeat_group_attr_dead_threshold, |
3826 | &o2hb_heartbeat_group_attr_mode, |
3827 | NULL, |
3828 | }; |
3829 | diff --git a/include/linux/bpf.h b/include/linux/bpf.h |
3830 | index c201017b5730..97498be2ca2e 100644 |
3831 | --- a/include/linux/bpf.h |
3832 | +++ b/include/linux/bpf.h |
3833 | @@ -243,6 +243,8 @@ struct bpf_map *bpf_map_inc(struct bpf_map *map, bool uref); |
3834 | void bpf_map_put_with_uref(struct bpf_map *map); |
3835 | void bpf_map_put(struct bpf_map *map); |
3836 | int bpf_map_precharge_memlock(u32 pages); |
3837 | +void *bpf_map_area_alloc(size_t size); |
3838 | +void bpf_map_area_free(void *base); |
3839 | |
3840 | extern int sysctl_unprivileged_bpf_disabled; |
3841 | |
3842 | diff --git a/include/linux/coredump.h b/include/linux/coredump.h |
3843 | index d016a121a8c4..28ffa94aed6b 100644 |
3844 | --- a/include/linux/coredump.h |
3845 | +++ b/include/linux/coredump.h |
3846 | @@ -14,6 +14,7 @@ struct coredump_params; |
3847 | extern int dump_skip(struct coredump_params *cprm, size_t nr); |
3848 | extern int dump_emit(struct coredump_params *cprm, const void *addr, int nr); |
3849 | extern int dump_align(struct coredump_params *cprm, int align); |
3850 | +extern void dump_truncate(struct coredump_params *cprm); |
3851 | #ifdef CONFIG_COREDUMP |
3852 | extern void do_coredump(const siginfo_t *siginfo); |
3853 | #else |
3854 | diff --git a/include/linux/phy.h b/include/linux/phy.h |
3855 | index bd22670e2182..6c9b1e0006ee 100644 |
3856 | --- a/include/linux/phy.h |
3857 | +++ b/include/linux/phy.h |
3858 | @@ -401,6 +401,9 @@ struct phy_device { |
3859 | u32 advertising; |
3860 | u32 lp_advertising; |
3861 | |
3862 | + /* Energy efficient ethernet modes which should be prohibited */ |
3863 | + u32 eee_broken_modes; |
3864 | + |
3865 | int autoneg; |
3866 | |
3867 | int link_timeout; |
3868 | diff --git a/include/net/xfrm.h b/include/net/xfrm.h |
3869 | index 31947b9c21d6..835c30e491c8 100644 |
3870 | --- a/include/net/xfrm.h |
3871 | +++ b/include/net/xfrm.h |
3872 | @@ -944,10 +944,6 @@ struct xfrm_dst { |
3873 | struct flow_cache_object flo; |
3874 | struct xfrm_policy *pols[XFRM_POLICY_TYPE_MAX]; |
3875 | int num_pols, num_xfrms; |
3876 | -#ifdef CONFIG_XFRM_SUB_POLICY |
3877 | - struct flowi *origin; |
3878 | - struct xfrm_selector *partner; |
3879 | -#endif |
3880 | u32 xfrm_genid; |
3881 | u32 policy_genid; |
3882 | u32 route_mtu_cached; |
3883 | @@ -963,12 +959,6 @@ static inline void xfrm_dst_destroy(struct xfrm_dst *xdst) |
3884 | dst_release(xdst->route); |
3885 | if (likely(xdst->u.dst.xfrm)) |
3886 | xfrm_state_put(xdst->u.dst.xfrm); |
3887 | -#ifdef CONFIG_XFRM_SUB_POLICY |
3888 | - kfree(xdst->origin); |
3889 | - xdst->origin = NULL; |
3890 | - kfree(xdst->partner); |
3891 | - xdst->partner = NULL; |
3892 | -#endif |
3893 | } |
3894 | #endif |
3895 | |
3896 | diff --git a/include/uapi/linux/ethtool.h b/include/uapi/linux/ethtool.h |
3897 | index 8e547231c1b7..5c22e8cab24b 100644 |
3898 | --- a/include/uapi/linux/ethtool.h |
3899 | +++ b/include/uapi/linux/ethtool.h |
3900 | @@ -1368,6 +1368,8 @@ enum ethtool_link_mode_bit_indices { |
3901 | ETHTOOL_LINK_MODE_10000baseLR_Full_BIT = 44, |
3902 | ETHTOOL_LINK_MODE_10000baseLRM_Full_BIT = 45, |
3903 | ETHTOOL_LINK_MODE_10000baseER_Full_BIT = 46, |
3904 | + ETHTOOL_LINK_MODE_2500baseT_Full_BIT = 47, |
3905 | + ETHTOOL_LINK_MODE_5000baseT_Full_BIT = 48, |
3906 | |
3907 | |
3908 | /* Last allowed bit for __ETHTOOL_LINK_MODE_LEGACY_MASK is bit |
3909 | @@ -1377,7 +1379,7 @@ enum ethtool_link_mode_bit_indices { |
3910 | */ |
3911 | |
3912 | __ETHTOOL_LINK_MODE_LAST |
3913 | - = ETHTOOL_LINK_MODE_10000baseER_Full_BIT, |
3914 | + = ETHTOOL_LINK_MODE_5000baseT_Full_BIT, |
3915 | }; |
3916 | |
3917 | #define __ETHTOOL_LINK_MODE_LEGACY_MASK(base_name) \ |
3918 | diff --git a/kernel/bpf/arraymap.c b/kernel/bpf/arraymap.c |
3919 | index a2ac051c342f..f3721e150d94 100644 |
3920 | --- a/kernel/bpf/arraymap.c |
3921 | +++ b/kernel/bpf/arraymap.c |
3922 | @@ -11,7 +11,6 @@ |
3923 | */ |
3924 | #include <linux/bpf.h> |
3925 | #include <linux/err.h> |
3926 | -#include <linux/vmalloc.h> |
3927 | #include <linux/slab.h> |
3928 | #include <linux/mm.h> |
3929 | #include <linux/filter.h> |
3930 | @@ -74,14 +73,10 @@ static struct bpf_map *array_map_alloc(union bpf_attr *attr) |
3931 | if (array_size >= U32_MAX - PAGE_SIZE) |
3932 | return ERR_PTR(-ENOMEM); |
3933 | |
3934 | - |
3935 | /* allocate all map elements and zero-initialize them */ |
3936 | - array = kzalloc(array_size, GFP_USER | __GFP_NOWARN); |
3937 | - if (!array) { |
3938 | - array = vzalloc(array_size); |
3939 | - if (!array) |
3940 | - return ERR_PTR(-ENOMEM); |
3941 | - } |
3942 | + array = bpf_map_area_alloc(array_size); |
3943 | + if (!array) |
3944 | + return ERR_PTR(-ENOMEM); |
3945 | |
3946 | /* copy mandatory map attributes */ |
3947 | array->map.map_type = attr->map_type; |
3948 | @@ -97,7 +92,7 @@ static struct bpf_map *array_map_alloc(union bpf_attr *attr) |
3949 | |
3950 | if (array_size >= U32_MAX - PAGE_SIZE || |
3951 | elem_size > PCPU_MIN_UNIT_SIZE || bpf_array_alloc_percpu(array)) { |
3952 | - kvfree(array); |
3953 | + bpf_map_area_free(array); |
3954 | return ERR_PTR(-ENOMEM); |
3955 | } |
3956 | out: |
3957 | @@ -262,7 +257,7 @@ static void array_map_free(struct bpf_map *map) |
3958 | if (array->map.map_type == BPF_MAP_TYPE_PERCPU_ARRAY) |
3959 | bpf_array_free_percpu(array); |
3960 | |
3961 | - kvfree(array); |
3962 | + bpf_map_area_free(array); |
3963 | } |
3964 | |
3965 | static const struct bpf_map_ops array_ops = { |
3966 | @@ -319,7 +314,8 @@ static void fd_array_map_free(struct bpf_map *map) |
3967 | /* make sure it's empty */ |
3968 | for (i = 0; i < array->map.max_entries; i++) |
3969 | BUG_ON(array->ptrs[i] != NULL); |
3970 | - kvfree(array); |
3971 | + |
3972 | + bpf_map_area_free(array); |
3973 | } |
3974 | |
3975 | static void *fd_array_map_lookup_elem(struct bpf_map *map, void *key) |
3976 | diff --git a/kernel/bpf/hashtab.c b/kernel/bpf/hashtab.c |
3977 | index ad1bc67aff1b..ad2f0ed75471 100644 |
3978 | --- a/kernel/bpf/hashtab.c |
3979 | +++ b/kernel/bpf/hashtab.c |
3980 | @@ -13,7 +13,6 @@ |
3981 | #include <linux/bpf.h> |
3982 | #include <linux/jhash.h> |
3983 | #include <linux/filter.h> |
3984 | -#include <linux/vmalloc.h> |
3985 | #include "percpu_freelist.h" |
3986 | |
3987 | struct bucket { |
3988 | @@ -84,14 +83,15 @@ static void htab_free_elems(struct bpf_htab *htab) |
3989 | free_percpu(pptr); |
3990 | } |
3991 | free_elems: |
3992 | - vfree(htab->elems); |
3993 | + bpf_map_area_free(htab->elems); |
3994 | } |
3995 | |
3996 | static int prealloc_elems_and_freelist(struct bpf_htab *htab) |
3997 | { |
3998 | int err = -ENOMEM, i; |
3999 | |
4000 | - htab->elems = vzalloc(htab->elem_size * htab->map.max_entries); |
4001 | + htab->elems = bpf_map_area_alloc(htab->elem_size * |
4002 | + htab->map.max_entries); |
4003 | if (!htab->elems) |
4004 | return -ENOMEM; |
4005 | |
4006 | @@ -227,14 +227,10 @@ static struct bpf_map *htab_map_alloc(union bpf_attr *attr) |
4007 | goto free_htab; |
4008 | |
4009 | err = -ENOMEM; |
4010 | - htab->buckets = kmalloc_array(htab->n_buckets, sizeof(struct bucket), |
4011 | - GFP_USER | __GFP_NOWARN); |
4012 | - |
4013 | - if (!htab->buckets) { |
4014 | - htab->buckets = vmalloc(htab->n_buckets * sizeof(struct bucket)); |
4015 | - if (!htab->buckets) |
4016 | - goto free_htab; |
4017 | - } |
4018 | + htab->buckets = bpf_map_area_alloc(htab->n_buckets * |
4019 | + sizeof(struct bucket)); |
4020 | + if (!htab->buckets) |
4021 | + goto free_htab; |
4022 | |
4023 | for (i = 0; i < htab->n_buckets; i++) { |
4024 | INIT_HLIST_HEAD(&htab->buckets[i].head); |
4025 | @@ -258,7 +254,7 @@ static struct bpf_map *htab_map_alloc(union bpf_attr *attr) |
4026 | free_extra_elems: |
4027 | free_percpu(htab->extra_elems); |
4028 | free_buckets: |
4029 | - kvfree(htab->buckets); |
4030 | + bpf_map_area_free(htab->buckets); |
4031 | free_htab: |
4032 | kfree(htab); |
4033 | return ERR_PTR(err); |
4034 | @@ -715,7 +711,7 @@ static void htab_map_free(struct bpf_map *map) |
4035 | pcpu_freelist_destroy(&htab->freelist); |
4036 | } |
4037 | free_percpu(htab->extra_elems); |
4038 | - kvfree(htab->buckets); |
4039 | + bpf_map_area_free(htab->buckets); |
4040 | kfree(htab); |
4041 | } |
4042 | |
4043 | diff --git a/kernel/bpf/stackmap.c b/kernel/bpf/stackmap.c |
4044 | index 732ae16d12b7..be8519148c25 100644 |
4045 | --- a/kernel/bpf/stackmap.c |
4046 | +++ b/kernel/bpf/stackmap.c |
4047 | @@ -7,7 +7,6 @@ |
4048 | #include <linux/bpf.h> |
4049 | #include <linux/jhash.h> |
4050 | #include <linux/filter.h> |
4051 | -#include <linux/vmalloc.h> |
4052 | #include <linux/stacktrace.h> |
4053 | #include <linux/perf_event.h> |
4054 | #include "percpu_freelist.h" |
4055 | @@ -32,7 +31,7 @@ static int prealloc_elems_and_freelist(struct bpf_stack_map *smap) |
4056 | u32 elem_size = sizeof(struct stack_map_bucket) + smap->map.value_size; |
4057 | int err; |
4058 | |
4059 | - smap->elems = vzalloc(elem_size * smap->map.max_entries); |
4060 | + smap->elems = bpf_map_area_alloc(elem_size * smap->map.max_entries); |
4061 | if (!smap->elems) |
4062 | return -ENOMEM; |
4063 | |
4064 | @@ -45,7 +44,7 @@ static int prealloc_elems_and_freelist(struct bpf_stack_map *smap) |
4065 | return 0; |
4066 | |
4067 | free_elems: |
4068 | - vfree(smap->elems); |
4069 | + bpf_map_area_free(smap->elems); |
4070 | return err; |
4071 | } |
4072 | |
4073 | @@ -76,12 +75,9 @@ static struct bpf_map *stack_map_alloc(union bpf_attr *attr) |
4074 | if (cost >= U32_MAX - PAGE_SIZE) |
4075 | return ERR_PTR(-E2BIG); |
4076 | |
4077 | - smap = kzalloc(cost, GFP_USER | __GFP_NOWARN); |
4078 | - if (!smap) { |
4079 | - smap = vzalloc(cost); |
4080 | - if (!smap) |
4081 | - return ERR_PTR(-ENOMEM); |
4082 | - } |
4083 | + smap = bpf_map_area_alloc(cost); |
4084 | + if (!smap) |
4085 | + return ERR_PTR(-ENOMEM); |
4086 | |
4087 | err = -E2BIG; |
4088 | cost += n_buckets * (value_size + sizeof(struct stack_map_bucket)); |
4089 | @@ -112,7 +108,7 @@ static struct bpf_map *stack_map_alloc(union bpf_attr *attr) |
4090 | put_buffers: |
4091 | put_callchain_buffers(); |
4092 | free_smap: |
4093 | - kvfree(smap); |
4094 | + bpf_map_area_free(smap); |
4095 | return ERR_PTR(err); |
4096 | } |
4097 | |
4098 | @@ -262,9 +258,9 @@ static void stack_map_free(struct bpf_map *map) |
4099 | /* wait for bpf programs to complete before freeing stack map */ |
4100 | synchronize_rcu(); |
4101 | |
4102 | - vfree(smap->elems); |
4103 | + bpf_map_area_free(smap->elems); |
4104 | pcpu_freelist_destroy(&smap->freelist); |
4105 | - kvfree(smap); |
4106 | + bpf_map_area_free(smap); |
4107 | put_callchain_buffers(); |
4108 | } |
4109 | |
4110 | diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c |
4111 | index 237f3d6a7ddc..72ea91df71c9 100644 |
4112 | --- a/kernel/bpf/syscall.c |
4113 | +++ b/kernel/bpf/syscall.c |
4114 | @@ -12,6 +12,8 @@ |
4115 | #include <linux/bpf.h> |
4116 | #include <linux/syscalls.h> |
4117 | #include <linux/slab.h> |
4118 | +#include <linux/vmalloc.h> |
4119 | +#include <linux/mmzone.h> |
4120 | #include <linux/anon_inodes.h> |
4121 | #include <linux/file.h> |
4122 | #include <linux/license.h> |
4123 | @@ -48,6 +50,30 @@ void bpf_register_map_type(struct bpf_map_type_list *tl) |
4124 | list_add(&tl->list_node, &bpf_map_types); |
4125 | } |
4126 | |
4127 | +void *bpf_map_area_alloc(size_t size) |
4128 | +{ |
4129 | + /* We definitely need __GFP_NORETRY, so OOM killer doesn't |
4130 | + * trigger under memory pressure as we really just want to |
4131 | + * fail instead. |
4132 | + */ |
4133 | + const gfp_t flags = __GFP_NOWARN | __GFP_NORETRY | __GFP_ZERO; |
4134 | + void *area; |
4135 | + |
4136 | + if (size <= (PAGE_SIZE << PAGE_ALLOC_COSTLY_ORDER)) { |
4137 | + area = kmalloc(size, GFP_USER | flags); |
4138 | + if (area != NULL) |
4139 | + return area; |
4140 | + } |
4141 | + |
4142 | + return __vmalloc(size, GFP_KERNEL | __GFP_HIGHMEM | flags, |
4143 | + PAGE_KERNEL); |
4144 | +} |
4145 | + |
4146 | +void bpf_map_area_free(void *area) |
4147 | +{ |
4148 | + kvfree(area); |
4149 | +} |
4150 | + |
4151 | int bpf_map_precharge_memlock(u32 pages) |
4152 | { |
4153 | struct user_struct *user = get_current_user(); |
4154 | diff --git a/kernel/events/core.c b/kernel/events/core.c |
4155 | index 11cc1d83c770..30ccc7029d18 100644 |
4156 | --- a/kernel/events/core.c |
4157 | +++ b/kernel/events/core.c |
4158 | @@ -2272,7 +2272,7 @@ static int __perf_install_in_context(void *info) |
4159 | struct perf_event_context *ctx = event->ctx; |
4160 | struct perf_cpu_context *cpuctx = __get_cpu_context(ctx); |
4161 | struct perf_event_context *task_ctx = cpuctx->task_ctx; |
4162 | - bool activate = true; |
4163 | + bool reprogram = true; |
4164 | int ret = 0; |
4165 | |
4166 | raw_spin_lock(&cpuctx->ctx.lock); |
4167 | @@ -2280,27 +2280,26 @@ static int __perf_install_in_context(void *info) |
4168 | raw_spin_lock(&ctx->lock); |
4169 | task_ctx = ctx; |
4170 | |
4171 | - /* If we're on the wrong CPU, try again */ |
4172 | - if (task_cpu(ctx->task) != smp_processor_id()) { |
4173 | - ret = -ESRCH; |
4174 | - goto unlock; |
4175 | - } |
4176 | + reprogram = (ctx->task == current); |
4177 | |
4178 | /* |
4179 | - * If we're on the right CPU, see if the task we target is |
4180 | - * current, if not we don't have to activate the ctx, a future |
4181 | - * context switch will do that for us. |
4182 | + * If the task is running, it must be running on this CPU, |
4183 | + * otherwise we cannot reprogram things. |
4184 | + * |
4185 | + * If its not running, we don't care, ctx->lock will |
4186 | + * serialize against it becoming runnable. |
4187 | */ |
4188 | - if (ctx->task != current) |
4189 | - activate = false; |
4190 | - else |
4191 | - WARN_ON_ONCE(cpuctx->task_ctx && cpuctx->task_ctx != ctx); |
4192 | + if (task_curr(ctx->task) && !reprogram) { |
4193 | + ret = -ESRCH; |
4194 | + goto unlock; |
4195 | + } |
4196 | |
4197 | + WARN_ON_ONCE(reprogram && cpuctx->task_ctx && cpuctx->task_ctx != ctx); |
4198 | } else if (task_ctx) { |
4199 | raw_spin_lock(&task_ctx->lock); |
4200 | } |
4201 | |
4202 | - if (activate) { |
4203 | + if (reprogram) { |
4204 | ctx_sched_out(ctx, cpuctx, EVENT_TIME); |
4205 | add_event_to_ctx(event, ctx); |
4206 | ctx_resched(cpuctx, task_ctx); |
4207 | @@ -2351,13 +2350,36 @@ perf_install_in_context(struct perf_event_context *ctx, |
4208 | /* |
4209 | * Installing events is tricky because we cannot rely on ctx->is_active |
4210 | * to be set in case this is the nr_events 0 -> 1 transition. |
4211 | + * |
4212 | + * Instead we use task_curr(), which tells us if the task is running. |
4213 | + * However, since we use task_curr() outside of rq::lock, we can race |
4214 | + * against the actual state. This means the result can be wrong. |
4215 | + * |
4216 | + * If we get a false positive, we retry, this is harmless. |
4217 | + * |
4218 | + * If we get a false negative, things are complicated. If we are after |
4219 | + * perf_event_context_sched_in() ctx::lock will serialize us, and the |
4220 | + * value must be correct. If we're before, it doesn't matter since |
4221 | + * perf_event_context_sched_in() will program the counter. |
4222 | + * |
4223 | + * However, this hinges on the remote context switch having observed |
4224 | + * our task->perf_event_ctxp[] store, such that it will in fact take |
4225 | + * ctx::lock in perf_event_context_sched_in(). |
4226 | + * |
4227 | + * We do this by task_function_call(), if the IPI fails to hit the task |
4228 | + * we know any future context switch of task must see the |
4229 | + * perf_event_ctpx[] store. |
4230 | */ |
4231 | -again: |
4232 | + |
4233 | /* |
4234 | - * Cannot use task_function_call() because we need to run on the task's |
4235 | - * CPU regardless of whether its current or not. |
4236 | + * This smp_mb() orders the task->perf_event_ctxp[] store with the |
4237 | + * task_cpu() load, such that if the IPI then does not find the task |
4238 | + * running, a future context switch of that task must observe the |
4239 | + * store. |
4240 | */ |
4241 | - if (!cpu_function_call(task_cpu(task), __perf_install_in_context, event)) |
4242 | + smp_mb(); |
4243 | +again: |
4244 | + if (!task_function_call(task, __perf_install_in_context, event)) |
4245 | return; |
4246 | |
4247 | raw_spin_lock_irq(&ctx->lock); |
4248 | @@ -2371,12 +2393,16 @@ perf_install_in_context(struct perf_event_context *ctx, |
4249 | raw_spin_unlock_irq(&ctx->lock); |
4250 | return; |
4251 | } |
4252 | - raw_spin_unlock_irq(&ctx->lock); |
4253 | /* |
4254 | - * Since !ctx->is_active doesn't mean anything, we must IPI |
4255 | - * unconditionally. |
4256 | + * If the task is not running, ctx->lock will avoid it becoming so, |
4257 | + * thus we can safely install the event. |
4258 | */ |
4259 | - goto again; |
4260 | + if (task_curr(task)) { |
4261 | + raw_spin_unlock_irq(&ctx->lock); |
4262 | + goto again; |
4263 | + } |
4264 | + add_event_to_ctx(event, ctx); |
4265 | + raw_spin_unlock_irq(&ctx->lock); |
4266 | } |
4267 | |
4268 | /* |
4269 | diff --git a/kernel/panic.c b/kernel/panic.c |
4270 | index e6480e20379e..dbec387099b1 100644 |
4271 | --- a/kernel/panic.c |
4272 | +++ b/kernel/panic.c |
4273 | @@ -249,7 +249,7 @@ void panic(const char *fmt, ...) |
4274 | * Delay timeout seconds before rebooting the machine. |
4275 | * We can't use the "normal" timers since we just panicked. |
4276 | */ |
4277 | - pr_emerg("Rebooting in %d seconds..", panic_timeout); |
4278 | + pr_emerg("Rebooting in %d seconds..\n", panic_timeout); |
4279 | |
4280 | for (i = 0; i < panic_timeout * 1000; i += PANIC_TIMER_STEP) { |
4281 | touch_nmi_watchdog(); |
4282 | diff --git a/kernel/sched/loadavg.c b/kernel/sched/loadavg.c |
4283 | index a2d6eb71f06b..ec91fcc09bfe 100644 |
4284 | --- a/kernel/sched/loadavg.c |
4285 | +++ b/kernel/sched/loadavg.c |
4286 | @@ -201,8 +201,9 @@ void calc_load_exit_idle(void) |
4287 | struct rq *this_rq = this_rq(); |
4288 | |
4289 | /* |
4290 | - * If we're still before the sample window, we're done. |
4291 | + * If we're still before the pending sample window, we're done. |
4292 | */ |
4293 | + this_rq->calc_load_update = calc_load_update; |
4294 | if (time_before(jiffies, this_rq->calc_load_update)) |
4295 | return; |
4296 | |
4297 | @@ -211,7 +212,6 @@ void calc_load_exit_idle(void) |
4298 | * accounted through the nohz accounting, so skip the entire deal and |
4299 | * sync up for the next window. |
4300 | */ |
4301 | - this_rq->calc_load_update = calc_load_update; |
4302 | if (time_before(jiffies, this_rq->calc_load_update + 10)) |
4303 | this_rq->calc_load_update += LOAD_FREQ; |
4304 | } |
4305 | diff --git a/lib/swiotlb.c b/lib/swiotlb.c |
4306 | index ad1d2962d129..b7812df04437 100644 |
4307 | --- a/lib/swiotlb.c |
4308 | +++ b/lib/swiotlb.c |
4309 | @@ -456,11 +456,11 @@ phys_addr_t swiotlb_tbl_map_single(struct device *hwdev, |
4310 | : 1UL << (BITS_PER_LONG - IO_TLB_SHIFT); |
4311 | |
4312 | /* |
4313 | - * For mappings greater than a page, we limit the stride (and |
4314 | - * hence alignment) to a page size. |
4315 | + * For mappings greater than or equal to a page, we limit the stride |
4316 | + * (and hence alignment) to a page size. |
4317 | */ |
4318 | nslots = ALIGN(size, 1 << IO_TLB_SHIFT) >> IO_TLB_SHIFT; |
4319 | - if (size > PAGE_SIZE) |
4320 | + if (size >= PAGE_SIZE) |
4321 | stride = (1 << (PAGE_SHIFT - IO_TLB_SHIFT)); |
4322 | else |
4323 | stride = 1; |
4324 | diff --git a/mm/huge_memory.c b/mm/huge_memory.c |
4325 | index d5b2b759f76f..e7d5db958538 100644 |
4326 | --- a/mm/huge_memory.c |
4327 | +++ b/mm/huge_memory.c |
4328 | @@ -1227,8 +1227,11 @@ int do_huge_pmd_numa_page(struct fault_env *fe, pmd_t pmd) |
4329 | */ |
4330 | if (unlikely(pmd_trans_migrating(*fe->pmd))) { |
4331 | page = pmd_page(*fe->pmd); |
4332 | + if (!get_page_unless_zero(page)) |
4333 | + goto out_unlock; |
4334 | spin_unlock(fe->ptl); |
4335 | wait_on_page_locked(page); |
4336 | + put_page(page); |
4337 | goto out; |
4338 | } |
4339 | |
4340 | @@ -1260,8 +1263,11 @@ int do_huge_pmd_numa_page(struct fault_env *fe, pmd_t pmd) |
4341 | |
4342 | /* Migration could have started since the pmd_trans_migrating check */ |
4343 | if (!page_locked) { |
4344 | + if (!get_page_unless_zero(page)) |
4345 | + goto out_unlock; |
4346 | spin_unlock(fe->ptl); |
4347 | wait_on_page_locked(page); |
4348 | + put_page(page); |
4349 | page_nid = -1; |
4350 | goto out; |
4351 | } |
4352 | diff --git a/mm/swap_cgroup.c b/mm/swap_cgroup.c |
4353 | index 454d6d7509ed..3405b4ee1757 100644 |
4354 | --- a/mm/swap_cgroup.c |
4355 | +++ b/mm/swap_cgroup.c |
4356 | @@ -204,6 +204,8 @@ void swap_cgroup_swapoff(int type) |
4357 | struct page *page = map[i]; |
4358 | if (page) |
4359 | __free_page(page); |
4360 | + if (!(i % SWAP_CLUSTER_MAX)) |
4361 | + cond_resched(); |
4362 | } |
4363 | vfree(map); |
4364 | } |
4365 | diff --git a/mm/vmalloc.c b/mm/vmalloc.c |
4366 | index f2481cb4e6b2..195de42bea1f 100644 |
4367 | --- a/mm/vmalloc.c |
4368 | +++ b/mm/vmalloc.c |
4369 | @@ -244,11 +244,21 @@ struct page *vmalloc_to_page(const void *vmalloc_addr) |
4370 | */ |
4371 | VIRTUAL_BUG_ON(!is_vmalloc_or_module_addr(vmalloc_addr)); |
4372 | |
4373 | + /* |
4374 | + * Don't dereference bad PUD or PMD (below) entries. This will also |
4375 | + * identify huge mappings, which we may encounter on architectures |
4376 | + * that define CONFIG_HAVE_ARCH_HUGE_VMAP=y. Such regions will be |
4377 | + * identified as vmalloc addresses by is_vmalloc_addr(), but are |
4378 | + * not [unambiguously] associated with a struct page, so there is |
4379 | + * no correct value to return for them. |
4380 | + */ |
4381 | if (!pgd_none(*pgd)) { |
4382 | pud_t *pud = pud_offset(pgd, addr); |
4383 | - if (!pud_none(*pud)) { |
4384 | + WARN_ON_ONCE(pud_bad(*pud)); |
4385 | + if (!pud_none(*pud) && !pud_bad(*pud)) { |
4386 | pmd_t *pmd = pmd_offset(pud, addr); |
4387 | - if (!pmd_none(*pmd)) { |
4388 | + WARN_ON_ONCE(pmd_bad(*pmd)); |
4389 | + if (!pmd_none(*pmd) && !pmd_bad(*pmd)) { |
4390 | pte_t *ptep, pte; |
4391 | |
4392 | ptep = pte_offset_map(pmd, addr); |
4393 | diff --git a/net/8021q/vlan.c b/net/8021q/vlan.c |
4394 | index f2531ad66b68..8d213f974448 100644 |
4395 | --- a/net/8021q/vlan.c |
4396 | +++ b/net/8021q/vlan.c |
4397 | @@ -277,7 +277,8 @@ static int register_vlan_device(struct net_device *real_dev, u16 vlan_id) |
4398 | return 0; |
4399 | |
4400 | out_free_newdev: |
4401 | - free_netdev(new_dev); |
4402 | + if (new_dev->reg_state == NETREG_UNINITIALIZED) |
4403 | + free_netdev(new_dev); |
4404 | return err; |
4405 | } |
4406 | |
4407 | diff --git a/net/caif/cfpkt_skbuff.c b/net/caif/cfpkt_skbuff.c |
4408 | index 59ce1fcc220c..71b6ab240dea 100644 |
4409 | --- a/net/caif/cfpkt_skbuff.c |
4410 | +++ b/net/caif/cfpkt_skbuff.c |
4411 | @@ -81,11 +81,7 @@ static struct cfpkt *cfpkt_create_pfx(u16 len, u16 pfx) |
4412 | { |
4413 | struct sk_buff *skb; |
4414 | |
4415 | - if (likely(in_interrupt())) |
4416 | - skb = alloc_skb(len + pfx, GFP_ATOMIC); |
4417 | - else |
4418 | - skb = alloc_skb(len + pfx, GFP_KERNEL); |
4419 | - |
4420 | + skb = alloc_skb(len + pfx, GFP_ATOMIC); |
4421 | if (unlikely(skb == NULL)) |
4422 | return NULL; |
4423 | |
4424 | diff --git a/net/core/dev.c b/net/core/dev.c |
4425 | index 2e04fd188081..97f806116ae9 100644 |
4426 | --- a/net/core/dev.c |
4427 | +++ b/net/core/dev.c |
4428 | @@ -1250,8 +1250,9 @@ int dev_set_alias(struct net_device *dev, const char *alias, size_t len) |
4429 | if (!new_ifalias) |
4430 | return -ENOMEM; |
4431 | dev->ifalias = new_ifalias; |
4432 | + memcpy(dev->ifalias, alias, len); |
4433 | + dev->ifalias[len] = 0; |
4434 | |
4435 | - strlcpy(dev->ifalias, alias, len+1); |
4436 | return len; |
4437 | } |
4438 | |
4439 | diff --git a/net/core/dst.c b/net/core/dst.c |
4440 | index 656b70d39690..39cc11968cf9 100644 |
4441 | --- a/net/core/dst.c |
4442 | +++ b/net/core/dst.c |
4443 | @@ -470,6 +470,20 @@ static int dst_dev_event(struct notifier_block *this, unsigned long event, |
4444 | spin_lock_bh(&dst_garbage.lock); |
4445 | dst = dst_garbage.list; |
4446 | dst_garbage.list = NULL; |
4447 | + /* The code in dst_ifdown places a hold on the loopback device. |
4448 | + * If the gc entry processing is set to expire after a lengthy |
4449 | + * interval, this hold can cause netdev_wait_allrefs() to hang |
4450 | + * out and wait for a long time -- until the the loopback |
4451 | + * interface is released. If we're really unlucky, it'll emit |
4452 | + * pr_emerg messages to console too. Reset the interval here, |
4453 | + * so dst cleanups occur in a more timely fashion. |
4454 | + */ |
4455 | + if (dst_garbage.timer_inc > DST_GC_INC) { |
4456 | + dst_garbage.timer_inc = DST_GC_INC; |
4457 | + dst_garbage.timer_expires = DST_GC_MIN; |
4458 | + mod_delayed_work(system_wq, &dst_gc_work, |
4459 | + dst_garbage.timer_expires); |
4460 | + } |
4461 | spin_unlock_bh(&dst_garbage.lock); |
4462 | |
4463 | if (last) |
4464 | diff --git a/net/core/ethtool.c b/net/core/ethtool.c |
4465 | index 072c1f4998c9..e9989b835a66 100644 |
4466 | --- a/net/core/ethtool.c |
4467 | +++ b/net/core/ethtool.c |
4468 | @@ -1704,7 +1704,7 @@ static noinline_for_stack int ethtool_get_channels(struct net_device *dev, |
4469 | static noinline_for_stack int ethtool_set_channels(struct net_device *dev, |
4470 | void __user *useraddr) |
4471 | { |
4472 | - struct ethtool_channels channels, max; |
4473 | + struct ethtool_channels channels, max = { .cmd = ETHTOOL_GCHANNELS }; |
4474 | u32 max_rx_in_use = 0; |
4475 | |
4476 | if (!dev->ethtool_ops->set_channels || !dev->ethtool_ops->get_channels) |
4477 | diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c |
4478 | index 1d9160794e55..9c6fd7f83a4a 100644 |
4479 | --- a/net/core/rtnetlink.c |
4480 | +++ b/net/core/rtnetlink.c |
4481 | @@ -937,6 +937,7 @@ static noinline size_t if_nlmsg_size(const struct net_device *dev, |
4482 | + nla_total_size(1) /* IFLA_LINKMODE */ |
4483 | + nla_total_size(4) /* IFLA_CARRIER_CHANGES */ |
4484 | + nla_total_size(4) /* IFLA_LINK_NETNSID */ |
4485 | + + nla_total_size(4) /* IFLA_GROUP */ |
4486 | + nla_total_size(ext_filter_mask |
4487 | & RTEXT_FILTER_VF ? 4 : 0) /* IFLA_NUM_VF */ |
4488 | + rtnl_vfinfo_size(dev, ext_filter_mask) /* IFLA_VFINFO_LIST */ |
4489 | @@ -1130,6 +1131,8 @@ static noinline_for_stack int rtnl_fill_vfinfo(struct sk_buff *skb, |
4490 | struct ifla_vf_mac vf_mac; |
4491 | struct ifla_vf_info ivi; |
4492 | |
4493 | + memset(&ivi, 0, sizeof(ivi)); |
4494 | + |
4495 | /* Not all SR-IOV capable drivers support the |
4496 | * spoofcheck and "RSS query enable" query. Preset to |
4497 | * -1 so the user space tool can detect that the driver |
4498 | @@ -1138,7 +1141,6 @@ static noinline_for_stack int rtnl_fill_vfinfo(struct sk_buff *skb, |
4499 | ivi.spoofchk = -1; |
4500 | ivi.rss_query_en = -1; |
4501 | ivi.trusted = -1; |
4502 | - memset(ivi.mac, 0, sizeof(ivi.mac)); |
4503 | /* The default value for VF link state is "auto" |
4504 | * IFLA_VF_LINK_STATE_AUTO which equals zero |
4505 | */ |
4506 | @@ -1464,6 +1466,7 @@ static const struct nla_policy ifla_policy[IFLA_MAX+1] = { |
4507 | [IFLA_LINK_NETNSID] = { .type = NLA_S32 }, |
4508 | [IFLA_PROTO_DOWN] = { .type = NLA_U8 }, |
4509 | [IFLA_XDP] = { .type = NLA_NESTED }, |
4510 | + [IFLA_GROUP] = { .type = NLA_U32 }, |
4511 | }; |
4512 | |
4513 | static const struct nla_policy ifla_info_policy[IFLA_INFO_MAX+1] = { |
4514 | diff --git a/net/decnet/dn_route.c b/net/decnet/dn_route.c |
4515 | index b1dc096d22f8..403593bd2b83 100644 |
4516 | --- a/net/decnet/dn_route.c |
4517 | +++ b/net/decnet/dn_route.c |
4518 | @@ -188,12 +188,6 @@ static inline void dnrt_free(struct dn_route *rt) |
4519 | call_rcu_bh(&rt->dst.rcu_head, dst_rcu_free); |
4520 | } |
4521 | |
4522 | -static inline void dnrt_drop(struct dn_route *rt) |
4523 | -{ |
4524 | - dst_release(&rt->dst); |
4525 | - call_rcu_bh(&rt->dst.rcu_head, dst_rcu_free); |
4526 | -} |
4527 | - |
4528 | static void dn_dst_check_expire(unsigned long dummy) |
4529 | { |
4530 | int i; |
4531 | @@ -248,7 +242,7 @@ static int dn_dst_gc(struct dst_ops *ops) |
4532 | } |
4533 | *rtp = rt->dst.dn_next; |
4534 | rt->dst.dn_next = NULL; |
4535 | - dnrt_drop(rt); |
4536 | + dnrt_free(rt); |
4537 | break; |
4538 | } |
4539 | spin_unlock_bh(&dn_rt_hash_table[i].lock); |
4540 | @@ -350,7 +344,7 @@ static int dn_insert_route(struct dn_route *rt, unsigned int hash, struct dn_rou |
4541 | dst_use(&rth->dst, now); |
4542 | spin_unlock_bh(&dn_rt_hash_table[hash].lock); |
4543 | |
4544 | - dnrt_drop(rt); |
4545 | + dst_free(&rt->dst); |
4546 | *rp = rth; |
4547 | return 0; |
4548 | } |
4549 | @@ -380,7 +374,7 @@ static void dn_run_flush(unsigned long dummy) |
4550 | for(; rt; rt = next) { |
4551 | next = rcu_dereference_raw(rt->dst.dn_next); |
4552 | RCU_INIT_POINTER(rt->dst.dn_next, NULL); |
4553 | - dst_free((struct dst_entry *)rt); |
4554 | + dnrt_free(rt); |
4555 | } |
4556 | |
4557 | nothing_to_declare: |
4558 | @@ -1187,7 +1181,7 @@ static int dn_route_output_slow(struct dst_entry **pprt, const struct flowidn *o |
4559 | if (dev_out->flags & IFF_LOOPBACK) |
4560 | flags |= RTCF_LOCAL; |
4561 | |
4562 | - rt = dst_alloc(&dn_dst_ops, dev_out, 1, DST_OBSOLETE_NONE, DST_HOST); |
4563 | + rt = dst_alloc(&dn_dst_ops, dev_out, 0, DST_OBSOLETE_NONE, DST_HOST); |
4564 | if (rt == NULL) |
4565 | goto e_nobufs; |
4566 | |
4567 | diff --git a/net/decnet/netfilter/dn_rtmsg.c b/net/decnet/netfilter/dn_rtmsg.c |
4568 | index 85f2fdc360c2..29246bc9a7b4 100644 |
4569 | --- a/net/decnet/netfilter/dn_rtmsg.c |
4570 | +++ b/net/decnet/netfilter/dn_rtmsg.c |
4571 | @@ -102,7 +102,9 @@ static inline void dnrmg_receive_user_skb(struct sk_buff *skb) |
4572 | { |
4573 | struct nlmsghdr *nlh = nlmsg_hdr(skb); |
4574 | |
4575 | - if (nlh->nlmsg_len < sizeof(*nlh) || skb->len < nlh->nlmsg_len) |
4576 | + if (skb->len < sizeof(*nlh) || |
4577 | + nlh->nlmsg_len < sizeof(*nlh) || |
4578 | + skb->len < nlh->nlmsg_len) |
4579 | return; |
4580 | |
4581 | if (!netlink_capable(skb, CAP_NET_ADMIN)) |
4582 | diff --git a/net/dsa/slave.c b/net/dsa/slave.c |
4583 | index 3ff9d97cf56b..079d76bc204c 100644 |
4584 | --- a/net/dsa/slave.c |
4585 | +++ b/net/dsa/slave.c |
4586 | @@ -1103,10 +1103,8 @@ static int dsa_slave_phy_connect(struct dsa_slave_priv *p, |
4587 | /* Use already configured phy mode */ |
4588 | if (p->phy_interface == PHY_INTERFACE_MODE_NA) |
4589 | p->phy_interface = p->phy->interface; |
4590 | - phy_connect_direct(slave_dev, p->phy, dsa_slave_adjust_link, |
4591 | - p->phy_interface); |
4592 | - |
4593 | - return 0; |
4594 | + return phy_connect_direct(slave_dev, p->phy, dsa_slave_adjust_link, |
4595 | + p->phy_interface); |
4596 | } |
4597 | |
4598 | static int dsa_slave_phy_setup(struct dsa_slave_priv *p, |
4599 | diff --git a/net/ipv4/igmp.c b/net/ipv4/igmp.c |
4600 | index 1bc623d7f754..19930da56b0a 100644 |
4601 | --- a/net/ipv4/igmp.c |
4602 | +++ b/net/ipv4/igmp.c |
4603 | @@ -1112,6 +1112,7 @@ static void igmpv3_add_delrec(struct in_device *in_dev, struct ip_mc_list *im) |
4604 | pmc = kzalloc(sizeof(*pmc), GFP_KERNEL); |
4605 | if (!pmc) |
4606 | return; |
4607 | + spin_lock_init(&pmc->lock); |
4608 | spin_lock_bh(&im->lock); |
4609 | pmc->interface = im->interface; |
4610 | in_dev_hold(in_dev); |
4611 | @@ -2071,21 +2072,26 @@ static int ip_mc_add_src(struct in_device *in_dev, __be32 *pmca, int sfmode, |
4612 | |
4613 | static void ip_mc_clear_src(struct ip_mc_list *pmc) |
4614 | { |
4615 | - struct ip_sf_list *psf, *nextpsf; |
4616 | + struct ip_sf_list *psf, *nextpsf, *tomb, *sources; |
4617 | |
4618 | - for (psf = pmc->tomb; psf; psf = nextpsf) { |
4619 | + spin_lock_bh(&pmc->lock); |
4620 | + tomb = pmc->tomb; |
4621 | + pmc->tomb = NULL; |
4622 | + sources = pmc->sources; |
4623 | + pmc->sources = NULL; |
4624 | + pmc->sfmode = MCAST_EXCLUDE; |
4625 | + pmc->sfcount[MCAST_INCLUDE] = 0; |
4626 | + pmc->sfcount[MCAST_EXCLUDE] = 1; |
4627 | + spin_unlock_bh(&pmc->lock); |
4628 | + |
4629 | + for (psf = tomb; psf; psf = nextpsf) { |
4630 | nextpsf = psf->sf_next; |
4631 | kfree(psf); |
4632 | } |
4633 | - pmc->tomb = NULL; |
4634 | - for (psf = pmc->sources; psf; psf = nextpsf) { |
4635 | + for (psf = sources; psf; psf = nextpsf) { |
4636 | nextpsf = psf->sf_next; |
4637 | kfree(psf); |
4638 | } |
4639 | - pmc->sources = NULL; |
4640 | - pmc->sfmode = MCAST_EXCLUDE; |
4641 | - pmc->sfcount[MCAST_INCLUDE] = 0; |
4642 | - pmc->sfcount[MCAST_EXCLUDE] = 1; |
4643 | } |
4644 | |
4645 | /* Join a multicast group |
4646 | diff --git a/net/ipv4/netfilter.c b/net/ipv4/netfilter.c |
4647 | index b3cc1335adbc..c0cc6aa8cfaa 100644 |
4648 | --- a/net/ipv4/netfilter.c |
4649 | +++ b/net/ipv4/netfilter.c |
4650 | @@ -23,7 +23,8 @@ int ip_route_me_harder(struct net *net, struct sk_buff *skb, unsigned int addr_t |
4651 | struct rtable *rt; |
4652 | struct flowi4 fl4 = {}; |
4653 | __be32 saddr = iph->saddr; |
4654 | - __u8 flags = skb->sk ? inet_sk_flowi_flags(skb->sk) : 0; |
4655 | + const struct sock *sk = skb_to_full_sk(skb); |
4656 | + __u8 flags = sk ? inet_sk_flowi_flags(sk) : 0; |
4657 | struct net_device *dev = skb_dst(skb)->dev; |
4658 | unsigned int hh_len; |
4659 | |
4660 | @@ -40,7 +41,7 @@ int ip_route_me_harder(struct net *net, struct sk_buff *skb, unsigned int addr_t |
4661 | fl4.daddr = iph->daddr; |
4662 | fl4.saddr = saddr; |
4663 | fl4.flowi4_tos = RT_TOS(iph->tos); |
4664 | - fl4.flowi4_oif = skb->sk ? skb->sk->sk_bound_dev_if : 0; |
4665 | + fl4.flowi4_oif = sk ? sk->sk_bound_dev_if : 0; |
4666 | if (!fl4.flowi4_oif) |
4667 | fl4.flowi4_oif = l3mdev_master_ifindex(dev); |
4668 | fl4.flowi4_mark = skb->mark; |
4669 | @@ -61,7 +62,7 @@ int ip_route_me_harder(struct net *net, struct sk_buff *skb, unsigned int addr_t |
4670 | xfrm_decode_session(skb, flowi4_to_flowi(&fl4), AF_INET) == 0) { |
4671 | struct dst_entry *dst = skb_dst(skb); |
4672 | skb_dst_set(skb, NULL); |
4673 | - dst = xfrm_lookup(net, dst, flowi4_to_flowi(&fl4), skb->sk, 0); |
4674 | + dst = xfrm_lookup(net, dst, flowi4_to_flowi(&fl4), sk, 0); |
4675 | if (IS_ERR(dst)) |
4676 | return PTR_ERR(dst); |
4677 | skb_dst_set(skb, dst); |
4678 | diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c |
4679 | index 045738319e8b..b6f4c42cc8ce 100644 |
4680 | --- a/net/ipv6/addrconf.c |
4681 | +++ b/net/ipv6/addrconf.c |
4682 | @@ -315,9 +315,9 @@ static void addrconf_mod_rs_timer(struct inet6_dev *idev, |
4683 | static void addrconf_mod_dad_work(struct inet6_ifaddr *ifp, |
4684 | unsigned long delay) |
4685 | { |
4686 | - if (!delayed_work_pending(&ifp->dad_work)) |
4687 | - in6_ifa_hold(ifp); |
4688 | - mod_delayed_work(addrconf_wq, &ifp->dad_work, delay); |
4689 | + in6_ifa_hold(ifp); |
4690 | + if (mod_delayed_work(addrconf_wq, &ifp->dad_work, delay)) |
4691 | + in6_ifa_put(ifp); |
4692 | } |
4693 | |
4694 | static int snmp6_alloc_dev(struct inet6_dev *idev) |
4695 | diff --git a/net/ipv6/fib6_rules.c b/net/ipv6/fib6_rules.c |
4696 | index eea23b57c6a5..ec849d88a662 100644 |
4697 | --- a/net/ipv6/fib6_rules.c |
4698 | +++ b/net/ipv6/fib6_rules.c |
4699 | @@ -32,7 +32,6 @@ struct fib6_rule { |
4700 | struct dst_entry *fib6_rule_lookup(struct net *net, struct flowi6 *fl6, |
4701 | int flags, pol_lookup_t lookup) |
4702 | { |
4703 | - struct rt6_info *rt; |
4704 | struct fib_lookup_arg arg = { |
4705 | .lookup_ptr = lookup, |
4706 | .flags = FIB_LOOKUP_NOREF, |
4707 | @@ -44,21 +43,11 @@ struct dst_entry *fib6_rule_lookup(struct net *net, struct flowi6 *fl6, |
4708 | fib_rules_lookup(net->ipv6.fib6_rules_ops, |
4709 | flowi6_to_flowi(fl6), flags, &arg); |
4710 | |
4711 | - rt = arg.result; |
4712 | + if (arg.result) |
4713 | + return arg.result; |
4714 | |
4715 | - if (!rt) { |
4716 | - dst_hold(&net->ipv6.ip6_null_entry->dst); |
4717 | - return &net->ipv6.ip6_null_entry->dst; |
4718 | - } |
4719 | - |
4720 | - if (rt->rt6i_flags & RTF_REJECT && |
4721 | - rt->dst.error == -EAGAIN) { |
4722 | - ip6_rt_put(rt); |
4723 | - rt = net->ipv6.ip6_null_entry; |
4724 | - dst_hold(&rt->dst); |
4725 | - } |
4726 | - |
4727 | - return &rt->dst; |
4728 | + dst_hold(&net->ipv6.ip6_null_entry->dst); |
4729 | + return &net->ipv6.ip6_null_entry->dst; |
4730 | } |
4731 | |
4732 | static int fib6_rule_action(struct fib_rule *rule, struct flowi *flp, |
4733 | @@ -121,7 +110,8 @@ static int fib6_rule_action(struct fib_rule *rule, struct flowi *flp, |
4734 | flp6->saddr = saddr; |
4735 | } |
4736 | err = rt->dst.error; |
4737 | - goto out; |
4738 | + if (err != -EAGAIN) |
4739 | + goto out; |
4740 | } |
4741 | again: |
4742 | ip6_rt_put(rt); |
4743 | diff --git a/net/ipv6/ip6_fib.c b/net/ipv6/ip6_fib.c |
4744 | index 8c88a37392d0..636d4d893085 100644 |
4745 | --- a/net/ipv6/ip6_fib.c |
4746 | +++ b/net/ipv6/ip6_fib.c |
4747 | @@ -289,8 +289,7 @@ struct dst_entry *fib6_rule_lookup(struct net *net, struct flowi6 *fl6, |
4748 | struct rt6_info *rt; |
4749 | |
4750 | rt = lookup(net, net->ipv6.fib6_main_tbl, fl6, flags); |
4751 | - if (rt->rt6i_flags & RTF_REJECT && |
4752 | - rt->dst.error == -EAGAIN) { |
4753 | + if (rt->dst.error == -EAGAIN) { |
4754 | ip6_rt_put(rt); |
4755 | rt = net->ipv6.ip6_null_entry; |
4756 | dst_hold(&rt->dst); |
4757 | diff --git a/net/ipv6/ip6_gre.c b/net/ipv6/ip6_gre.c |
4758 | index 0a5922055da2..d2844ee469cb 100644 |
4759 | --- a/net/ipv6/ip6_gre.c |
4760 | +++ b/net/ipv6/ip6_gre.c |
4761 | @@ -542,11 +542,10 @@ static inline int ip6gre_xmit_ipv4(struct sk_buff *skb, struct net_device *dev) |
4762 | |
4763 | memcpy(&fl6, &t->fl.u.ip6, sizeof(fl6)); |
4764 | |
4765 | - dsfield = ipv4_get_dsfield(iph); |
4766 | - |
4767 | if (t->parms.flags & IP6_TNL_F_USE_ORIG_TCLASS) |
4768 | - fl6.flowlabel |= htonl((__u32)iph->tos << IPV6_TCLASS_SHIFT) |
4769 | - & IPV6_TCLASS_MASK; |
4770 | + dsfield = ipv4_get_dsfield(iph); |
4771 | + else |
4772 | + dsfield = ip6_tclass(t->parms.flowinfo); |
4773 | if (t->parms.flags & IP6_TNL_F_USE_ORIG_FWMARK) |
4774 | fl6.flowi6_mark = skb->mark; |
4775 | |
4776 | @@ -582,6 +581,9 @@ static inline int ip6gre_xmit_ipv6(struct sk_buff *skb, struct net_device *dev) |
4777 | return -1; |
4778 | |
4779 | offset = ip6_tnl_parse_tlv_enc_lim(skb, skb_network_header(skb)); |
4780 | + /* ip6_tnl_parse_tlv_enc_lim() might have reallocated skb->head */ |
4781 | + ipv6h = ipv6_hdr(skb); |
4782 | + |
4783 | if (offset > 0) { |
4784 | struct ipv6_tlv_tnl_enc_lim *tel; |
4785 | tel = (struct ipv6_tlv_tnl_enc_lim *)&skb_network_header(skb)[offset]; |
4786 | @@ -596,9 +598,11 @@ static inline int ip6gre_xmit_ipv6(struct sk_buff *skb, struct net_device *dev) |
4787 | |
4788 | memcpy(&fl6, &t->fl.u.ip6, sizeof(fl6)); |
4789 | |
4790 | - dsfield = ipv6_get_dsfield(ipv6h); |
4791 | if (t->parms.flags & IP6_TNL_F_USE_ORIG_TCLASS) |
4792 | - fl6.flowlabel |= (*(__be32 *) ipv6h & IPV6_TCLASS_MASK); |
4793 | + dsfield = ipv6_get_dsfield(ipv6h); |
4794 | + else |
4795 | + dsfield = ip6_tclass(t->parms.flowinfo); |
4796 | + |
4797 | if (t->parms.flags & IP6_TNL_F_USE_ORIG_FLOWLABEL) |
4798 | fl6.flowlabel |= ip6_flowlabel(ipv6h); |
4799 | if (t->parms.flags & IP6_TNL_F_USE_ORIG_FWMARK) |
4800 | diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c |
4801 | index 3ab32ac57ccd..fd649599620e 100644 |
4802 | --- a/net/ipv6/ip6_output.c |
4803 | +++ b/net/ipv6/ip6_output.c |
4804 | @@ -1020,8 +1020,10 @@ static int ip6_dst_lookup_tail(struct net *net, const struct sock *sk, |
4805 | } |
4806 | #endif |
4807 | if (ipv6_addr_v4mapped(&fl6->saddr) && |
4808 | - !(ipv6_addr_v4mapped(&fl6->daddr) || ipv6_addr_any(&fl6->daddr))) |
4809 | - return -EAFNOSUPPORT; |
4810 | + !(ipv6_addr_v4mapped(&fl6->daddr) || ipv6_addr_any(&fl6->daddr))) { |
4811 | + err = -EAFNOSUPPORT; |
4812 | + goto out_err_release; |
4813 | + } |
4814 | |
4815 | return 0; |
4816 | |
4817 | diff --git a/net/ipv6/ip6_tunnel.c b/net/ipv6/ip6_tunnel.c |
4818 | index 116b4da06820..1fc9daa7b1d6 100644 |
4819 | --- a/net/ipv6/ip6_tunnel.c |
4820 | +++ b/net/ipv6/ip6_tunnel.c |
4821 | @@ -1196,7 +1196,7 @@ int ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev, __u8 dsfield, |
4822 | skb_push(skb, sizeof(struct ipv6hdr)); |
4823 | skb_reset_network_header(skb); |
4824 | ipv6h = ipv6_hdr(skb); |
4825 | - ip6_flow_hdr(ipv6h, INET_ECN_encapsulate(0, dsfield), |
4826 | + ip6_flow_hdr(ipv6h, dsfield, |
4827 | ip6_make_flowlabel(net, skb, fl6->flowlabel, true, fl6)); |
4828 | ipv6h->hop_limit = hop_limit; |
4829 | ipv6h->nexthdr = proto; |
4830 | @@ -1231,8 +1231,6 @@ ip4ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev) |
4831 | if (tproto != IPPROTO_IPIP && tproto != 0) |
4832 | return -1; |
4833 | |
4834 | - dsfield = ipv4_get_dsfield(iph); |
4835 | - |
4836 | if (t->parms.collect_md) { |
4837 | struct ip_tunnel_info *tun_info; |
4838 | const struct ip_tunnel_key *key; |
4839 | @@ -1246,6 +1244,7 @@ ip4ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev) |
4840 | fl6.flowi6_proto = IPPROTO_IPIP; |
4841 | fl6.daddr = key->u.ipv6.dst; |
4842 | fl6.flowlabel = key->label; |
4843 | + dsfield = ip6_tclass(key->label); |
4844 | } else { |
4845 | if (!(t->parms.flags & IP6_TNL_F_IGN_ENCAP_LIMIT)) |
4846 | encap_limit = t->parms.encap_limit; |
4847 | @@ -1254,8 +1253,9 @@ ip4ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev) |
4848 | fl6.flowi6_proto = IPPROTO_IPIP; |
4849 | |
4850 | if (t->parms.flags & IP6_TNL_F_USE_ORIG_TCLASS) |
4851 | - fl6.flowlabel |= htonl((__u32)iph->tos << IPV6_TCLASS_SHIFT) |
4852 | - & IPV6_TCLASS_MASK; |
4853 | + dsfield = ipv4_get_dsfield(iph); |
4854 | + else |
4855 | + dsfield = ip6_tclass(t->parms.flowinfo); |
4856 | if (t->parms.flags & IP6_TNL_F_USE_ORIG_FWMARK) |
4857 | fl6.flowi6_mark = skb->mark; |
4858 | } |
4859 | @@ -1263,6 +1263,8 @@ ip4ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev) |
4860 | if (iptunnel_handle_offloads(skb, SKB_GSO_IPXIP6)) |
4861 | return -1; |
4862 | |
4863 | + dsfield = INET_ECN_encapsulate(dsfield, ipv4_get_dsfield(iph)); |
4864 | + |
4865 | skb_set_inner_ipproto(skb, IPPROTO_IPIP); |
4866 | |
4867 | err = ip6_tnl_xmit(skb, dev, dsfield, &fl6, encap_limit, &mtu, |
4868 | @@ -1296,8 +1298,6 @@ ip6ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev) |
4869 | ip6_tnl_addr_conflict(t, ipv6h)) |
4870 | return -1; |
4871 | |
4872 | - dsfield = ipv6_get_dsfield(ipv6h); |
4873 | - |
4874 | if (t->parms.collect_md) { |
4875 | struct ip_tunnel_info *tun_info; |
4876 | const struct ip_tunnel_key *key; |
4877 | @@ -1311,8 +1311,11 @@ ip6ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev) |
4878 | fl6.flowi6_proto = IPPROTO_IPV6; |
4879 | fl6.daddr = key->u.ipv6.dst; |
4880 | fl6.flowlabel = key->label; |
4881 | + dsfield = ip6_tclass(key->label); |
4882 | } else { |
4883 | offset = ip6_tnl_parse_tlv_enc_lim(skb, skb_network_header(skb)); |
4884 | + /* ip6_tnl_parse_tlv_enc_lim() might have reallocated skb->head */ |
4885 | + ipv6h = ipv6_hdr(skb); |
4886 | if (offset > 0) { |
4887 | struct ipv6_tlv_tnl_enc_lim *tel; |
4888 | |
4889 | @@ -1331,7 +1334,9 @@ ip6ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev) |
4890 | fl6.flowi6_proto = IPPROTO_IPV6; |
4891 | |
4892 | if (t->parms.flags & IP6_TNL_F_USE_ORIG_TCLASS) |
4893 | - fl6.flowlabel |= (*(__be32 *)ipv6h & IPV6_TCLASS_MASK); |
4894 | + dsfield = ipv6_get_dsfield(ipv6h); |
4895 | + else |
4896 | + dsfield = ip6_tclass(t->parms.flowinfo); |
4897 | if (t->parms.flags & IP6_TNL_F_USE_ORIG_FLOWLABEL) |
4898 | fl6.flowlabel |= ip6_flowlabel(ipv6h); |
4899 | if (t->parms.flags & IP6_TNL_F_USE_ORIG_FWMARK) |
4900 | @@ -1341,6 +1346,8 @@ ip6ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev) |
4901 | if (iptunnel_handle_offloads(skb, SKB_GSO_IPXIP6)) |
4902 | return -1; |
4903 | |
4904 | + dsfield = INET_ECN_encapsulate(dsfield, ipv6_get_dsfield(ipv6h)); |
4905 | + |
4906 | skb_set_inner_ipproto(skb, IPPROTO_IPV6); |
4907 | |
4908 | err = ip6_tnl_xmit(skb, dev, dsfield, &fl6, encap_limit, &mtu, |
4909 | diff --git a/net/ipv6/proc.c b/net/ipv6/proc.c |
4910 | index cc8e3ae9ca73..e88bcb8ff0fd 100644 |
4911 | --- a/net/ipv6/proc.c |
4912 | +++ b/net/ipv6/proc.c |
4913 | @@ -219,7 +219,7 @@ static void snmp6_seq_show_item64(struct seq_file *seq, void __percpu *mib, |
4914 | u64 buff64[SNMP_MIB_MAX]; |
4915 | int i; |
4916 | |
4917 | - memset(buff64, 0, sizeof(unsigned long) * SNMP_MIB_MAX); |
4918 | + memset(buff64, 0, sizeof(u64) * SNMP_MIB_MAX); |
4919 | |
4920 | snmp_get_cpu_field64_batch(buff64, itemlist, mib, syncpoff); |
4921 | for (i = 0; itemlist[i].name; i++) |
4922 | diff --git a/net/key/af_key.c b/net/key/af_key.c |
4923 | index f9c9ecb0cdd3..e67c28e614b9 100644 |
4924 | --- a/net/key/af_key.c |
4925 | +++ b/net/key/af_key.c |
4926 | @@ -1135,6 +1135,7 @@ static struct xfrm_state * pfkey_msg2xfrm_state(struct net *net, |
4927 | goto out; |
4928 | } |
4929 | |
4930 | + err = -ENOBUFS; |
4931 | key = ext_hdrs[SADB_EXT_KEY_AUTH - 1]; |
4932 | if (sa->sadb_sa_auth) { |
4933 | int keysize = 0; |
4934 | @@ -1146,8 +1147,10 @@ static struct xfrm_state * pfkey_msg2xfrm_state(struct net *net, |
4935 | if (key) |
4936 | keysize = (key->sadb_key_bits + 7) / 8; |
4937 | x->aalg = kmalloc(sizeof(*x->aalg) + keysize, GFP_KERNEL); |
4938 | - if (!x->aalg) |
4939 | + if (!x->aalg) { |
4940 | + err = -ENOMEM; |
4941 | goto out; |
4942 | + } |
4943 | strcpy(x->aalg->alg_name, a->name); |
4944 | x->aalg->alg_key_len = 0; |
4945 | if (key) { |
4946 | @@ -1166,8 +1169,10 @@ static struct xfrm_state * pfkey_msg2xfrm_state(struct net *net, |
4947 | goto out; |
4948 | } |
4949 | x->calg = kmalloc(sizeof(*x->calg), GFP_KERNEL); |
4950 | - if (!x->calg) |
4951 | + if (!x->calg) { |
4952 | + err = -ENOMEM; |
4953 | goto out; |
4954 | + } |
4955 | strcpy(x->calg->alg_name, a->name); |
4956 | x->props.calgo = sa->sadb_sa_encrypt; |
4957 | } else { |
4958 | @@ -1181,8 +1186,10 @@ static struct xfrm_state * pfkey_msg2xfrm_state(struct net *net, |
4959 | if (key) |
4960 | keysize = (key->sadb_key_bits + 7) / 8; |
4961 | x->ealg = kmalloc(sizeof(*x->ealg) + keysize, GFP_KERNEL); |
4962 | - if (!x->ealg) |
4963 | + if (!x->ealg) { |
4964 | + err = -ENOMEM; |
4965 | goto out; |
4966 | + } |
4967 | strcpy(x->ealg->alg_name, a->name); |
4968 | x->ealg->alg_key_len = 0; |
4969 | if (key) { |
4970 | @@ -1227,8 +1234,10 @@ static struct xfrm_state * pfkey_msg2xfrm_state(struct net *net, |
4971 | struct xfrm_encap_tmpl *natt; |
4972 | |
4973 | x->encap = kmalloc(sizeof(*x->encap), GFP_KERNEL); |
4974 | - if (!x->encap) |
4975 | + if (!x->encap) { |
4976 | + err = -ENOMEM; |
4977 | goto out; |
4978 | + } |
4979 | |
4980 | natt = x->encap; |
4981 | n_type = ext_hdrs[SADB_X_EXT_NAT_T_TYPE-1]; |
4982 | diff --git a/net/l2tp/l2tp_core.c b/net/l2tp/l2tp_core.c |
4983 | index e702cb95b89b..3bce65183c95 100644 |
4984 | --- a/net/l2tp/l2tp_core.c |
4985 | +++ b/net/l2tp/l2tp_core.c |
4986 | @@ -278,6 +278,55 @@ struct l2tp_session *l2tp_session_find(struct net *net, struct l2tp_tunnel *tunn |
4987 | } |
4988 | EXPORT_SYMBOL_GPL(l2tp_session_find); |
4989 | |
4990 | +/* Like l2tp_session_find() but takes a reference on the returned session. |
4991 | + * Optionally calls session->ref() too if do_ref is true. |
4992 | + */ |
4993 | +struct l2tp_session *l2tp_session_get(struct net *net, |
4994 | + struct l2tp_tunnel *tunnel, |
4995 | + u32 session_id, bool do_ref) |
4996 | +{ |
4997 | + struct hlist_head *session_list; |
4998 | + struct l2tp_session *session; |
4999 | + |
5000 | + if (!tunnel) { |
5001 | + struct l2tp_net *pn = l2tp_pernet(net); |
5002 | + |
5003 | + session_list = l2tp_session_id_hash_2(pn, session_id); |
5004 | + |
5005 | + rcu_read_lock_bh(); |
5006 | + hlist_for_each_entry_rcu(session, session_list, global_hlist) { |
5007 | + if (session->session_id == session_id) { |
5008 | + l2tp_session_inc_refcount(session); |
5009 | + if (do_ref && session->ref) |
5010 | + session->ref(session); |
5011 | + rcu_read_unlock_bh(); |
5012 | + |
5013 | + return session; |
5014 | + } |
5015 | + } |
5016 | + rcu_read_unlock_bh(); |
5017 | + |
5018 | + return NULL; |
5019 | + } |
5020 | + |
5021 | + session_list = l2tp_session_id_hash(tunnel, session_id); |
5022 | + read_lock_bh(&tunnel->hlist_lock); |
5023 | + hlist_for_each_entry(session, session_list, hlist) { |
5024 | + if (session->session_id == session_id) { |
5025 | + l2tp_session_inc_refcount(session); |
5026 | + if (do_ref && session->ref) |
5027 | + session->ref(session); |
5028 | + read_unlock_bh(&tunnel->hlist_lock); |
5029 | + |
5030 | + return session; |
5031 | + } |
5032 | + } |
5033 | + read_unlock_bh(&tunnel->hlist_lock); |
5034 | + |
5035 | + return NULL; |
5036 | +} |
5037 | +EXPORT_SYMBOL_GPL(l2tp_session_get); |
5038 | + |
5039 | struct l2tp_session *l2tp_session_get_nth(struct l2tp_tunnel *tunnel, int nth, |
5040 | bool do_ref) |
5041 | { |
5042 | @@ -307,7 +356,8 @@ EXPORT_SYMBOL_GPL(l2tp_session_get_nth); |
5043 | /* Lookup a session by interface name. |
5044 | * This is very inefficient but is only used by management interfaces. |
5045 | */ |
5046 | -struct l2tp_session *l2tp_session_find_by_ifname(struct net *net, char *ifname) |
5047 | +struct l2tp_session *l2tp_session_get_by_ifname(struct net *net, char *ifname, |
5048 | + bool do_ref) |
5049 | { |
5050 | struct l2tp_net *pn = l2tp_pernet(net); |
5051 | int hash; |
5052 | @@ -317,7 +367,11 @@ struct l2tp_session *l2tp_session_find_by_ifname(struct net *net, char *ifname) |
5053 | for (hash = 0; hash < L2TP_HASH_SIZE_2; hash++) { |
5054 | hlist_for_each_entry_rcu(session, &pn->l2tp_session_hlist[hash], global_hlist) { |
5055 | if (!strcmp(session->ifname, ifname)) { |
5056 | + l2tp_session_inc_refcount(session); |
5057 | + if (do_ref && session->ref) |
5058 | + session->ref(session); |
5059 | rcu_read_unlock_bh(); |
5060 | + |
5061 | return session; |
5062 | } |
5063 | } |
5064 | @@ -327,7 +381,49 @@ struct l2tp_session *l2tp_session_find_by_ifname(struct net *net, char *ifname) |
5065 | |
5066 | return NULL; |
5067 | } |
5068 | -EXPORT_SYMBOL_GPL(l2tp_session_find_by_ifname); |
5069 | +EXPORT_SYMBOL_GPL(l2tp_session_get_by_ifname); |
5070 | + |
5071 | +static int l2tp_session_add_to_tunnel(struct l2tp_tunnel *tunnel, |
5072 | + struct l2tp_session *session) |
5073 | +{ |
5074 | + struct l2tp_session *session_walk; |
5075 | + struct hlist_head *g_head; |
5076 | + struct hlist_head *head; |
5077 | + struct l2tp_net *pn; |
5078 | + |
5079 | + head = l2tp_session_id_hash(tunnel, session->session_id); |
5080 | + |
5081 | + write_lock_bh(&tunnel->hlist_lock); |
5082 | + hlist_for_each_entry(session_walk, head, hlist) |
5083 | + if (session_walk->session_id == session->session_id) |
5084 | + goto exist; |
5085 | + |
5086 | + if (tunnel->version == L2TP_HDR_VER_3) { |
5087 | + pn = l2tp_pernet(tunnel->l2tp_net); |
5088 | + g_head = l2tp_session_id_hash_2(l2tp_pernet(tunnel->l2tp_net), |
5089 | + session->session_id); |
5090 | + |
5091 | + spin_lock_bh(&pn->l2tp_session_hlist_lock); |
5092 | + hlist_for_each_entry(session_walk, g_head, global_hlist) |
5093 | + if (session_walk->session_id == session->session_id) |
5094 | + goto exist_glob; |
5095 | + |
5096 | + hlist_add_head_rcu(&session->global_hlist, g_head); |
5097 | + spin_unlock_bh(&pn->l2tp_session_hlist_lock); |
5098 | + } |
5099 | + |
5100 | + hlist_add_head(&session->hlist, head); |
5101 | + write_unlock_bh(&tunnel->hlist_lock); |
5102 | + |
5103 | + return 0; |
5104 | + |
5105 | +exist_glob: |
5106 | + spin_unlock_bh(&pn->l2tp_session_hlist_lock); |
5107 | +exist: |
5108 | + write_unlock_bh(&tunnel->hlist_lock); |
5109 | + |
5110 | + return -EEXIST; |
5111 | +} |
5112 | |
5113 | /* Lookup a tunnel by id |
5114 | */ |
5115 | @@ -637,6 +733,9 @@ static int l2tp_recv_data_seq(struct l2tp_session *session, struct sk_buff *skb) |
5116 | * a data (not control) frame before coming here. Fields up to the |
5117 | * session-id have already been parsed and ptr points to the data |
5118 | * after the session-id. |
5119 | + * |
5120 | + * session->ref() must have been called prior to l2tp_recv_common(). |
5121 | + * session->deref() will be called automatically after skb is processed. |
5122 | */ |
5123 | void l2tp_recv_common(struct l2tp_session *session, struct sk_buff *skb, |
5124 | unsigned char *ptr, unsigned char *optr, u16 hdrflags, |
5125 | @@ -646,14 +745,6 @@ void l2tp_recv_common(struct l2tp_session *session, struct sk_buff *skb, |
5126 | int offset; |
5127 | u32 ns, nr; |
5128 | |
5129 | - /* The ref count is increased since we now hold a pointer to |
5130 | - * the session. Take care to decrement the refcnt when exiting |
5131 | - * this function from now on... |
5132 | - */ |
5133 | - l2tp_session_inc_refcount(session); |
5134 | - if (session->ref) |
5135 | - (*session->ref)(session); |
5136 | - |
5137 | /* Parse and check optional cookie */ |
5138 | if (session->peer_cookie_len > 0) { |
5139 | if (memcmp(ptr, &session->peer_cookie[0], session->peer_cookie_len)) { |
5140 | @@ -806,8 +897,6 @@ void l2tp_recv_common(struct l2tp_session *session, struct sk_buff *skb, |
5141 | /* Try to dequeue as many skbs from reorder_q as we can. */ |
5142 | l2tp_recv_dequeue(session); |
5143 | |
5144 | - l2tp_session_dec_refcount(session); |
5145 | - |
5146 | return; |
5147 | |
5148 | discard: |
5149 | @@ -816,8 +905,6 @@ void l2tp_recv_common(struct l2tp_session *session, struct sk_buff *skb, |
5150 | |
5151 | if (session->deref) |
5152 | (*session->deref)(session); |
5153 | - |
5154 | - l2tp_session_dec_refcount(session); |
5155 | } |
5156 | EXPORT_SYMBOL(l2tp_recv_common); |
5157 | |
5158 | @@ -924,8 +1011,14 @@ static int l2tp_udp_recv_core(struct l2tp_tunnel *tunnel, struct sk_buff *skb, |
5159 | } |
5160 | |
5161 | /* Find the session context */ |
5162 | - session = l2tp_session_find(tunnel->l2tp_net, tunnel, session_id); |
5163 | + session = l2tp_session_get(tunnel->l2tp_net, tunnel, session_id, true); |
5164 | if (!session || !session->recv_skb) { |
5165 | + if (session) { |
5166 | + if (session->deref) |
5167 | + session->deref(session); |
5168 | + l2tp_session_dec_refcount(session); |
5169 | + } |
5170 | + |
5171 | /* Not found? Pass to userspace to deal with */ |
5172 | l2tp_info(tunnel, L2TP_MSG_DATA, |
5173 | "%s: no session found (%u/%u). Passing up.\n", |
5174 | @@ -934,6 +1027,7 @@ static int l2tp_udp_recv_core(struct l2tp_tunnel *tunnel, struct sk_buff *skb, |
5175 | } |
5176 | |
5177 | l2tp_recv_common(session, skb, ptr, optr, hdrflags, length, payload_hook); |
5178 | + l2tp_session_dec_refcount(session); |
5179 | |
5180 | return 0; |
5181 | |
5182 | @@ -1740,6 +1834,7 @@ EXPORT_SYMBOL_GPL(l2tp_session_set_header_len); |
5183 | struct l2tp_session *l2tp_session_create(int priv_size, struct l2tp_tunnel *tunnel, u32 session_id, u32 peer_session_id, struct l2tp_session_cfg *cfg) |
5184 | { |
5185 | struct l2tp_session *session; |
5186 | + int err; |
5187 | |
5188 | session = kzalloc(sizeof(struct l2tp_session) + priv_size, GFP_KERNEL); |
5189 | if (session != NULL) { |
5190 | @@ -1795,6 +1890,13 @@ struct l2tp_session *l2tp_session_create(int priv_size, struct l2tp_tunnel *tunn |
5191 | |
5192 | l2tp_session_set_header_len(session, tunnel->version); |
5193 | |
5194 | + err = l2tp_session_add_to_tunnel(tunnel, session); |
5195 | + if (err) { |
5196 | + kfree(session); |
5197 | + |
5198 | + return ERR_PTR(err); |
5199 | + } |
5200 | + |
5201 | /* Bump the reference count. The session context is deleted |
5202 | * only when this drops to zero. |
5203 | */ |
5204 | @@ -1804,28 +1906,14 @@ struct l2tp_session *l2tp_session_create(int priv_size, struct l2tp_tunnel *tunn |
5205 | /* Ensure tunnel socket isn't deleted */ |
5206 | sock_hold(tunnel->sock); |
5207 | |
5208 | - /* Add session to the tunnel's hash list */ |
5209 | - write_lock_bh(&tunnel->hlist_lock); |
5210 | - hlist_add_head(&session->hlist, |
5211 | - l2tp_session_id_hash(tunnel, session_id)); |
5212 | - write_unlock_bh(&tunnel->hlist_lock); |
5213 | - |
5214 | - /* And to the global session list if L2TPv3 */ |
5215 | - if (tunnel->version != L2TP_HDR_VER_2) { |
5216 | - struct l2tp_net *pn = l2tp_pernet(tunnel->l2tp_net); |
5217 | - |
5218 | - spin_lock_bh(&pn->l2tp_session_hlist_lock); |
5219 | - hlist_add_head_rcu(&session->global_hlist, |
5220 | - l2tp_session_id_hash_2(pn, session_id)); |
5221 | - spin_unlock_bh(&pn->l2tp_session_hlist_lock); |
5222 | - } |
5223 | - |
5224 | /* Ignore management session in session count value */ |
5225 | if (session->session_id != 0) |
5226 | atomic_inc(&l2tp_session_count); |
5227 | + |
5228 | + return session; |
5229 | } |
5230 | |
5231 | - return session; |
5232 | + return ERR_PTR(-ENOMEM); |
5233 | } |
5234 | EXPORT_SYMBOL_GPL(l2tp_session_create); |
5235 | |
5236 | diff --git a/net/l2tp/l2tp_core.h b/net/l2tp/l2tp_core.h |
5237 | index e7233bad65e0..0095012509ac 100644 |
5238 | --- a/net/l2tp/l2tp_core.h |
5239 | +++ b/net/l2tp/l2tp_core.h |
5240 | @@ -240,12 +240,16 @@ static inline struct l2tp_tunnel *l2tp_sock_to_tunnel(struct sock *sk) |
5241 | return tunnel; |
5242 | } |
5243 | |
5244 | +struct l2tp_session *l2tp_session_get(struct net *net, |
5245 | + struct l2tp_tunnel *tunnel, |
5246 | + u32 session_id, bool do_ref); |
5247 | struct l2tp_session *l2tp_session_find(struct net *net, |
5248 | struct l2tp_tunnel *tunnel, |
5249 | u32 session_id); |
5250 | struct l2tp_session *l2tp_session_get_nth(struct l2tp_tunnel *tunnel, int nth, |
5251 | bool do_ref); |
5252 | -struct l2tp_session *l2tp_session_find_by_ifname(struct net *net, char *ifname); |
5253 | +struct l2tp_session *l2tp_session_get_by_ifname(struct net *net, char *ifname, |
5254 | + bool do_ref); |
5255 | struct l2tp_tunnel *l2tp_tunnel_find(struct net *net, u32 tunnel_id); |
5256 | struct l2tp_tunnel *l2tp_tunnel_find_nth(struct net *net, int nth); |
5257 | |
5258 | diff --git a/net/l2tp/l2tp_eth.c b/net/l2tp/l2tp_eth.c |
5259 | index 965f7e344cef..eecc64e138de 100644 |
5260 | --- a/net/l2tp/l2tp_eth.c |
5261 | +++ b/net/l2tp/l2tp_eth.c |
5262 | @@ -223,12 +223,6 @@ static int l2tp_eth_create(struct net *net, u32 tunnel_id, u32 session_id, u32 p |
5263 | goto out; |
5264 | } |
5265 | |
5266 | - session = l2tp_session_find(net, tunnel, session_id); |
5267 | - if (session) { |
5268 | - rc = -EEXIST; |
5269 | - goto out; |
5270 | - } |
5271 | - |
5272 | if (cfg->ifname) { |
5273 | dev = dev_get_by_name(net, cfg->ifname); |
5274 | if (dev) { |
5275 | @@ -242,8 +236,8 @@ static int l2tp_eth_create(struct net *net, u32 tunnel_id, u32 session_id, u32 p |
5276 | |
5277 | session = l2tp_session_create(sizeof(*spriv), tunnel, session_id, |
5278 | peer_session_id, cfg); |
5279 | - if (!session) { |
5280 | - rc = -ENOMEM; |
5281 | + if (IS_ERR(session)) { |
5282 | + rc = PTR_ERR(session); |
5283 | goto out; |
5284 | } |
5285 | |
5286 | diff --git a/net/l2tp/l2tp_ip.c b/net/l2tp/l2tp_ip.c |
5287 | index 20669537816e..3468d5635d0a 100644 |
5288 | --- a/net/l2tp/l2tp_ip.c |
5289 | +++ b/net/l2tp/l2tp_ip.c |
5290 | @@ -143,19 +143,19 @@ static int l2tp_ip_recv(struct sk_buff *skb) |
5291 | } |
5292 | |
5293 | /* Ok, this is a data packet. Lookup the session. */ |
5294 | - session = l2tp_session_find(net, NULL, session_id); |
5295 | - if (session == NULL) |
5296 | + session = l2tp_session_get(net, NULL, session_id, true); |
5297 | + if (!session) |
5298 | goto discard; |
5299 | |
5300 | tunnel = session->tunnel; |
5301 | - if (tunnel == NULL) |
5302 | - goto discard; |
5303 | + if (!tunnel) |
5304 | + goto discard_sess; |
5305 | |
5306 | /* Trace packet contents, if enabled */ |
5307 | if (tunnel->debug & L2TP_MSG_DATA) { |
5308 | length = min(32u, skb->len); |
5309 | if (!pskb_may_pull(skb, length)) |
5310 | - goto discard; |
5311 | + goto discard_sess; |
5312 | |
5313 | /* Point to L2TP header */ |
5314 | optr = ptr = skb->data; |
5315 | @@ -165,6 +165,7 @@ static int l2tp_ip_recv(struct sk_buff *skb) |
5316 | } |
5317 | |
5318 | l2tp_recv_common(session, skb, ptr, optr, 0, skb->len, tunnel->recv_payload_hook); |
5319 | + l2tp_session_dec_refcount(session); |
5320 | |
5321 | return 0; |
5322 | |
5323 | @@ -203,6 +204,12 @@ static int l2tp_ip_recv(struct sk_buff *skb) |
5324 | |
5325 | return sk_receive_skb(sk, skb, 1); |
5326 | |
5327 | +discard_sess: |
5328 | + if (session->deref) |
5329 | + session->deref(session); |
5330 | + l2tp_session_dec_refcount(session); |
5331 | + goto discard; |
5332 | + |
5333 | discard_put: |
5334 | sock_put(sk); |
5335 | |
5336 | diff --git a/net/l2tp/l2tp_ip6.c b/net/l2tp/l2tp_ip6.c |
5337 | index a4b0c9232bf1..b10abef6b0a0 100644 |
5338 | --- a/net/l2tp/l2tp_ip6.c |
5339 | +++ b/net/l2tp/l2tp_ip6.c |
5340 | @@ -156,19 +156,19 @@ static int l2tp_ip6_recv(struct sk_buff *skb) |
5341 | } |
5342 | |
5343 | /* Ok, this is a data packet. Lookup the session. */ |
5344 | - session = l2tp_session_find(net, NULL, session_id); |
5345 | - if (session == NULL) |
5346 | + session = l2tp_session_get(net, NULL, session_id, true); |
5347 | + if (!session) |
5348 | goto discard; |
5349 | |
5350 | tunnel = session->tunnel; |
5351 | - if (tunnel == NULL) |
5352 | - goto discard; |
5353 | + if (!tunnel) |
5354 | + goto discard_sess; |
5355 | |
5356 | /* Trace packet contents, if enabled */ |
5357 | if (tunnel->debug & L2TP_MSG_DATA) { |
5358 | length = min(32u, skb->len); |
5359 | if (!pskb_may_pull(skb, length)) |
5360 | - goto discard; |
5361 | + goto discard_sess; |
5362 | |
5363 | /* Point to L2TP header */ |
5364 | optr = ptr = skb->data; |
5365 | @@ -179,6 +179,8 @@ static int l2tp_ip6_recv(struct sk_buff *skb) |
5366 | |
5367 | l2tp_recv_common(session, skb, ptr, optr, 0, skb->len, |
5368 | tunnel->recv_payload_hook); |
5369 | + l2tp_session_dec_refcount(session); |
5370 | + |
5371 | return 0; |
5372 | |
5373 | pass_up: |
5374 | @@ -216,6 +218,12 @@ static int l2tp_ip6_recv(struct sk_buff *skb) |
5375 | |
5376 | return sk_receive_skb(sk, skb, 1); |
5377 | |
5378 | +discard_sess: |
5379 | + if (session->deref) |
5380 | + session->deref(session); |
5381 | + l2tp_session_dec_refcount(session); |
5382 | + goto discard; |
5383 | + |
5384 | discard_put: |
5385 | sock_put(sk); |
5386 | |
5387 | diff --git a/net/l2tp/l2tp_netlink.c b/net/l2tp/l2tp_netlink.c |
5388 | index 9f66272b163b..1ccd310d01a5 100644 |
5389 | --- a/net/l2tp/l2tp_netlink.c |
5390 | +++ b/net/l2tp/l2tp_netlink.c |
5391 | @@ -55,7 +55,8 @@ static int l2tp_nl_session_send(struct sk_buff *skb, u32 portid, u32 seq, |
5392 | /* Accessed under genl lock */ |
5393 | static const struct l2tp_nl_cmd_ops *l2tp_nl_cmd_ops[__L2TP_PWTYPE_MAX]; |
5394 | |
5395 | -static struct l2tp_session *l2tp_nl_session_find(struct genl_info *info) |
5396 | +static struct l2tp_session *l2tp_nl_session_get(struct genl_info *info, |
5397 | + bool do_ref) |
5398 | { |
5399 | u32 tunnel_id; |
5400 | u32 session_id; |
5401 | @@ -66,14 +67,15 @@ static struct l2tp_session *l2tp_nl_session_find(struct genl_info *info) |
5402 | |
5403 | if (info->attrs[L2TP_ATTR_IFNAME]) { |
5404 | ifname = nla_data(info->attrs[L2TP_ATTR_IFNAME]); |
5405 | - session = l2tp_session_find_by_ifname(net, ifname); |
5406 | + session = l2tp_session_get_by_ifname(net, ifname, do_ref); |
5407 | } else if ((info->attrs[L2TP_ATTR_SESSION_ID]) && |
5408 | (info->attrs[L2TP_ATTR_CONN_ID])) { |
5409 | tunnel_id = nla_get_u32(info->attrs[L2TP_ATTR_CONN_ID]); |
5410 | session_id = nla_get_u32(info->attrs[L2TP_ATTR_SESSION_ID]); |
5411 | tunnel = l2tp_tunnel_find(net, tunnel_id); |
5412 | if (tunnel) |
5413 | - session = l2tp_session_find(net, tunnel, session_id); |
5414 | + session = l2tp_session_get(net, tunnel, session_id, |
5415 | + do_ref); |
5416 | } |
5417 | |
5418 | return session; |
5419 | @@ -634,10 +636,12 @@ static int l2tp_nl_cmd_session_create(struct sk_buff *skb, struct genl_info *inf |
5420 | session_id, peer_session_id, &cfg); |
5421 | |
5422 | if (ret >= 0) { |
5423 | - session = l2tp_session_find(net, tunnel, session_id); |
5424 | - if (session) |
5425 | + session = l2tp_session_get(net, tunnel, session_id, false); |
5426 | + if (session) { |
5427 | ret = l2tp_session_notify(&l2tp_nl_family, info, session, |
5428 | L2TP_CMD_SESSION_CREATE); |
5429 | + l2tp_session_dec_refcount(session); |
5430 | + } |
5431 | } |
5432 | |
5433 | out: |
5434 | @@ -650,7 +654,7 @@ static int l2tp_nl_cmd_session_delete(struct sk_buff *skb, struct genl_info *inf |
5435 | struct l2tp_session *session; |
5436 | u16 pw_type; |
5437 | |
5438 | - session = l2tp_nl_session_find(info); |
5439 | + session = l2tp_nl_session_get(info, true); |
5440 | if (session == NULL) { |
5441 | ret = -ENODEV; |
5442 | goto out; |
5443 | @@ -664,6 +668,10 @@ static int l2tp_nl_cmd_session_delete(struct sk_buff *skb, struct genl_info *inf |
5444 | if (l2tp_nl_cmd_ops[pw_type] && l2tp_nl_cmd_ops[pw_type]->session_delete) |
5445 | ret = (*l2tp_nl_cmd_ops[pw_type]->session_delete)(session); |
5446 | |
5447 | + if (session->deref) |
5448 | + session->deref(session); |
5449 | + l2tp_session_dec_refcount(session); |
5450 | + |
5451 | out: |
5452 | return ret; |
5453 | } |
5454 | @@ -673,7 +681,7 @@ static int l2tp_nl_cmd_session_modify(struct sk_buff *skb, struct genl_info *inf |
5455 | int ret = 0; |
5456 | struct l2tp_session *session; |
5457 | |
5458 | - session = l2tp_nl_session_find(info); |
5459 | + session = l2tp_nl_session_get(info, false); |
5460 | if (session == NULL) { |
5461 | ret = -ENODEV; |
5462 | goto out; |
5463 | @@ -708,6 +716,8 @@ static int l2tp_nl_cmd_session_modify(struct sk_buff *skb, struct genl_info *inf |
5464 | ret = l2tp_session_notify(&l2tp_nl_family, info, |
5465 | session, L2TP_CMD_SESSION_MODIFY); |
5466 | |
5467 | + l2tp_session_dec_refcount(session); |
5468 | + |
5469 | out: |
5470 | return ret; |
5471 | } |
5472 | @@ -803,29 +813,34 @@ static int l2tp_nl_cmd_session_get(struct sk_buff *skb, struct genl_info *info) |
5473 | struct sk_buff *msg; |
5474 | int ret; |
5475 | |
5476 | - session = l2tp_nl_session_find(info); |
5477 | + session = l2tp_nl_session_get(info, false); |
5478 | if (session == NULL) { |
5479 | ret = -ENODEV; |
5480 | - goto out; |
5481 | + goto err; |
5482 | } |
5483 | |
5484 | msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); |
5485 | if (!msg) { |
5486 | ret = -ENOMEM; |
5487 | - goto out; |
5488 | + goto err_ref; |
5489 | } |
5490 | |
5491 | ret = l2tp_nl_session_send(msg, info->snd_portid, info->snd_seq, |
5492 | 0, session, L2TP_CMD_SESSION_GET); |
5493 | if (ret < 0) |
5494 | - goto err_out; |
5495 | + goto err_ref_msg; |
5496 | |
5497 | - return genlmsg_unicast(genl_info_net(info), msg, info->snd_portid); |
5498 | + ret = genlmsg_unicast(genl_info_net(info), msg, info->snd_portid); |
5499 | |
5500 | -err_out: |
5501 | - nlmsg_free(msg); |
5502 | + l2tp_session_dec_refcount(session); |
5503 | |
5504 | -out: |
5505 | + return ret; |
5506 | + |
5507 | +err_ref_msg: |
5508 | + nlmsg_free(msg); |
5509 | +err_ref: |
5510 | + l2tp_session_dec_refcount(session); |
5511 | +err: |
5512 | return ret; |
5513 | } |
5514 | |
5515 | diff --git a/net/l2tp/l2tp_ppp.c b/net/l2tp/l2tp_ppp.c |
5516 | index 1387f547a09e..1696f1fd5877 100644 |
5517 | --- a/net/l2tp/l2tp_ppp.c |
5518 | +++ b/net/l2tp/l2tp_ppp.c |
5519 | @@ -583,6 +583,7 @@ static int pppol2tp_connect(struct socket *sock, struct sockaddr *uservaddr, |
5520 | int error = 0; |
5521 | u32 tunnel_id, peer_tunnel_id; |
5522 | u32 session_id, peer_session_id; |
5523 | + bool drop_refcnt = false; |
5524 | int ver = 2; |
5525 | int fd; |
5526 | |
5527 | @@ -684,36 +685,36 @@ static int pppol2tp_connect(struct socket *sock, struct sockaddr *uservaddr, |
5528 | if (tunnel->peer_tunnel_id == 0) |
5529 | tunnel->peer_tunnel_id = peer_tunnel_id; |
5530 | |
5531 | - /* Create session if it doesn't already exist. We handle the |
5532 | - * case where a session was previously created by the netlink |
5533 | - * interface by checking that the session doesn't already have |
5534 | - * a socket and its tunnel socket are what we expect. If any |
5535 | - * of those checks fail, return EEXIST to the caller. |
5536 | - */ |
5537 | - session = l2tp_session_find(sock_net(sk), tunnel, session_id); |
5538 | - if (session == NULL) { |
5539 | - /* Default MTU must allow space for UDP/L2TP/PPP |
5540 | - * headers. |
5541 | + session = l2tp_session_get(sock_net(sk), tunnel, session_id, false); |
5542 | + if (session) { |
5543 | + drop_refcnt = true; |
5544 | + ps = l2tp_session_priv(session); |
5545 | + |
5546 | + /* Using a pre-existing session is fine as long as it hasn't |
5547 | + * been connected yet. |
5548 | */ |
5549 | - cfg.mtu = cfg.mru = 1500 - PPPOL2TP_HEADER_OVERHEAD; |
5550 | + if (ps->sock) { |
5551 | + error = -EEXIST; |
5552 | + goto end; |
5553 | + } |
5554 | |
5555 | - /* Allocate and initialize a new session context. */ |
5556 | - session = l2tp_session_create(sizeof(struct pppol2tp_session), |
5557 | - tunnel, session_id, |
5558 | - peer_session_id, &cfg); |
5559 | - if (session == NULL) { |
5560 | - error = -ENOMEM; |
5561 | + /* consistency checks */ |
5562 | + if (ps->tunnel_sock != tunnel->sock) { |
5563 | + error = -EEXIST; |
5564 | goto end; |
5565 | } |
5566 | } else { |
5567 | - ps = l2tp_session_priv(session); |
5568 | - error = -EEXIST; |
5569 | - if (ps->sock != NULL) |
5570 | - goto end; |
5571 | + /* Default MTU must allow space for UDP/L2TP/PPP headers */ |
5572 | + cfg.mtu = 1500 - PPPOL2TP_HEADER_OVERHEAD; |
5573 | + cfg.mru = cfg.mtu; |
5574 | |
5575 | - /* consistency checks */ |
5576 | - if (ps->tunnel_sock != tunnel->sock) |
5577 | + session = l2tp_session_create(sizeof(struct pppol2tp_session), |
5578 | + tunnel, session_id, |
5579 | + peer_session_id, &cfg); |
5580 | + if (IS_ERR(session)) { |
5581 | + error = PTR_ERR(session); |
5582 | goto end; |
5583 | + } |
5584 | } |
5585 | |
5586 | /* Associate session with its PPPoL2TP socket */ |
5587 | @@ -778,6 +779,8 @@ static int pppol2tp_connect(struct socket *sock, struct sockaddr *uservaddr, |
5588 | session->name); |
5589 | |
5590 | end: |
5591 | + if (drop_refcnt) |
5592 | + l2tp_session_dec_refcount(session); |
5593 | release_sock(sk); |
5594 | |
5595 | return error; |
5596 | @@ -805,12 +808,6 @@ static int pppol2tp_session_create(struct net *net, u32 tunnel_id, u32 session_i |
5597 | if (tunnel->sock == NULL) |
5598 | goto out; |
5599 | |
5600 | - /* Check that this session doesn't already exist */ |
5601 | - error = -EEXIST; |
5602 | - session = l2tp_session_find(net, tunnel, session_id); |
5603 | - if (session != NULL) |
5604 | - goto out; |
5605 | - |
5606 | /* Default MTU values. */ |
5607 | if (cfg->mtu == 0) |
5608 | cfg->mtu = 1500 - PPPOL2TP_HEADER_OVERHEAD; |
5609 | @@ -818,12 +815,13 @@ static int pppol2tp_session_create(struct net *net, u32 tunnel_id, u32 session_i |
5610 | cfg->mru = cfg->mtu; |
5611 | |
5612 | /* Allocate and initialize a new session context. */ |
5613 | - error = -ENOMEM; |
5614 | session = l2tp_session_create(sizeof(struct pppol2tp_session), |
5615 | tunnel, session_id, |
5616 | peer_session_id, cfg); |
5617 | - if (session == NULL) |
5618 | + if (IS_ERR(session)) { |
5619 | + error = PTR_ERR(session); |
5620 | goto out; |
5621 | + } |
5622 | |
5623 | ps = l2tp_session_priv(session); |
5624 | ps->tunnel_sock = tunnel->sock; |
5625 | @@ -1141,11 +1139,18 @@ static int pppol2tp_tunnel_ioctl(struct l2tp_tunnel *tunnel, |
5626 | if (stats.session_id != 0) { |
5627 | /* resend to session ioctl handler */ |
5628 | struct l2tp_session *session = |
5629 | - l2tp_session_find(sock_net(sk), tunnel, stats.session_id); |
5630 | - if (session != NULL) |
5631 | - err = pppol2tp_session_ioctl(session, cmd, arg); |
5632 | - else |
5633 | + l2tp_session_get(sock_net(sk), tunnel, |
5634 | + stats.session_id, true); |
5635 | + |
5636 | + if (session) { |
5637 | + err = pppol2tp_session_ioctl(session, cmd, |
5638 | + arg); |
5639 | + if (session->deref) |
5640 | + session->deref(session); |
5641 | + l2tp_session_dec_refcount(session); |
5642 | + } else { |
5643 | err = -EBADR; |
5644 | + } |
5645 | break; |
5646 | } |
5647 | #ifdef CONFIG_XFRM |
5648 | diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c |
5649 | index 8d7747e98fdb..37bec0f864b7 100644 |
5650 | --- a/net/mac80211/iface.c |
5651 | +++ b/net/mac80211/iface.c |
5652 | @@ -6,6 +6,7 @@ |
5653 | * Copyright (c) 2006 Jiri Benc <jbenc@suse.cz> |
5654 | * Copyright 2008, Johannes Berg <johannes@sipsolutions.net> |
5655 | * Copyright 2013-2014 Intel Mobile Communications GmbH |
5656 | + * Copyright (c) 2016 Intel Deutschland GmbH |
5657 | * |
5658 | * This program is free software; you can redistribute it and/or modify |
5659 | * it under the terms of the GNU General Public License version 2 as |
5660 | @@ -1307,6 +1308,26 @@ static void ieee80211_iface_work(struct work_struct *work) |
5661 | } else if (ieee80211_is_action(mgmt->frame_control) && |
5662 | mgmt->u.action.category == WLAN_CATEGORY_VHT) { |
5663 | switch (mgmt->u.action.u.vht_group_notif.action_code) { |
5664 | + case WLAN_VHT_ACTION_OPMODE_NOTIF: { |
5665 | + struct ieee80211_rx_status *status; |
5666 | + enum nl80211_band band; |
5667 | + u8 opmode; |
5668 | + |
5669 | + status = IEEE80211_SKB_RXCB(skb); |
5670 | + band = status->band; |
5671 | + opmode = mgmt->u.action.u.vht_opmode_notif.operating_mode; |
5672 | + |
5673 | + mutex_lock(&local->sta_mtx); |
5674 | + sta = sta_info_get_bss(sdata, mgmt->sa); |
5675 | + |
5676 | + if (sta) |
5677 | + ieee80211_vht_handle_opmode(sdata, sta, |
5678 | + opmode, |
5679 | + band); |
5680 | + |
5681 | + mutex_unlock(&local->sta_mtx); |
5682 | + break; |
5683 | + } |
5684 | case WLAN_VHT_ACTION_GROUPID_MGMT: |
5685 | ieee80211_process_mu_groups(sdata, mgmt); |
5686 | break; |
5687 | diff --git a/net/mac80211/main.c b/net/mac80211/main.c |
5688 | index 1075ac24c8c5..2bb6899854d4 100644 |
5689 | --- a/net/mac80211/main.c |
5690 | +++ b/net/mac80211/main.c |
5691 | @@ -908,12 +908,17 @@ int ieee80211_register_hw(struct ieee80211_hw *hw) |
5692 | supp_ht = supp_ht || sband->ht_cap.ht_supported; |
5693 | supp_vht = supp_vht || sband->vht_cap.vht_supported; |
5694 | |
5695 | - if (sband->ht_cap.ht_supported) |
5696 | - local->rx_chains = |
5697 | - max(ieee80211_mcs_to_chains(&sband->ht_cap.mcs), |
5698 | - local->rx_chains); |
5699 | + if (!sband->ht_cap.ht_supported) |
5700 | + continue; |
5701 | |
5702 | /* TODO: consider VHT for RX chains, hopefully it's the same */ |
5703 | + local->rx_chains = |
5704 | + max(ieee80211_mcs_to_chains(&sband->ht_cap.mcs), |
5705 | + local->rx_chains); |
5706 | + |
5707 | + /* no need to mask, SM_PS_DISABLED has all bits set */ |
5708 | + sband->ht_cap.cap |= WLAN_HT_CAP_SM_PS_DISABLED << |
5709 | + IEEE80211_HT_CAP_SM_PS_SHIFT; |
5710 | } |
5711 | |
5712 | /* if low-level driver supports AP, we also support VLAN */ |
5713 | diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c |
5714 | index c45a0fcfb3e7..439e597fd374 100644 |
5715 | --- a/net/mac80211/rx.c |
5716 | +++ b/net/mac80211/rx.c |
5717 | @@ -2923,17 +2923,10 @@ ieee80211_rx_h_action(struct ieee80211_rx_data *rx) |
5718 | |
5719 | switch (mgmt->u.action.u.vht_opmode_notif.action_code) { |
5720 | case WLAN_VHT_ACTION_OPMODE_NOTIF: { |
5721 | - u8 opmode; |
5722 | - |
5723 | /* verify opmode is present */ |
5724 | if (len < IEEE80211_MIN_ACTION_SIZE + 2) |
5725 | goto invalid; |
5726 | - |
5727 | - opmode = mgmt->u.action.u.vht_opmode_notif.operating_mode; |
5728 | - |
5729 | - ieee80211_vht_handle_opmode(rx->sdata, rx->sta, |
5730 | - opmode, status->band); |
5731 | - goto handled; |
5732 | + goto queue; |
5733 | } |
5734 | case WLAN_VHT_ACTION_GROUPID_MGMT: { |
5735 | if (len < IEEE80211_MIN_ACTION_SIZE + 25) |
5736 | diff --git a/net/mac80211/vht.c b/net/mac80211/vht.c |
5737 | index 6832bf6ab69f..43e45bb660bc 100644 |
5738 | --- a/net/mac80211/vht.c |
5739 | +++ b/net/mac80211/vht.c |
5740 | @@ -527,8 +527,10 @@ void ieee80211_vht_handle_opmode(struct ieee80211_sub_if_data *sdata, |
5741 | |
5742 | u32 changed = __ieee80211_vht_handle_opmode(sdata, sta, opmode, band); |
5743 | |
5744 | - if (changed > 0) |
5745 | + if (changed > 0) { |
5746 | + ieee80211_recalc_min_chandef(sdata); |
5747 | rate_control_rate_update(local, sband, sta, changed); |
5748 | + } |
5749 | } |
5750 | |
5751 | void ieee80211_get_vht_mask_from_cap(__le16 vht_cap, |
5752 | diff --git a/net/netfilter/nf_conntrack_netlink.c b/net/netfilter/nf_conntrack_netlink.c |
5753 | index 27540455dc62..04111c1c3988 100644 |
5754 | --- a/net/netfilter/nf_conntrack_netlink.c |
5755 | +++ b/net/netfilter/nf_conntrack_netlink.c |
5756 | @@ -45,6 +45,8 @@ |
5757 | #include <net/netfilter/nf_conntrack_zones.h> |
5758 | #include <net/netfilter/nf_conntrack_timestamp.h> |
5759 | #include <net/netfilter/nf_conntrack_labels.h> |
5760 | +#include <net/netfilter/nf_conntrack_seqadj.h> |
5761 | +#include <net/netfilter/nf_conntrack_synproxy.h> |
5762 | #ifdef CONFIG_NF_NAT_NEEDED |
5763 | #include <net/netfilter/nf_nat_core.h> |
5764 | #include <net/netfilter/nf_nat_l4proto.h> |
5765 | @@ -1800,6 +1802,8 @@ ctnetlink_create_conntrack(struct net *net, |
5766 | nf_ct_tstamp_ext_add(ct, GFP_ATOMIC); |
5767 | nf_ct_ecache_ext_add(ct, 0, 0, GFP_ATOMIC); |
5768 | nf_ct_labels_ext_add(ct); |
5769 | + nfct_seqadj_ext_add(ct); |
5770 | + nfct_synproxy_ext_add(ct); |
5771 | |
5772 | /* we must add conntrack extensions before confirmation. */ |
5773 | ct->status |= IPS_CONFIRMED; |
5774 | diff --git a/net/netfilter/xt_TCPMSS.c b/net/netfilter/xt_TCPMSS.c |
5775 | index 872db2d0e2a9..119e51fdcebc 100644 |
5776 | --- a/net/netfilter/xt_TCPMSS.c |
5777 | +++ b/net/netfilter/xt_TCPMSS.c |
5778 | @@ -104,7 +104,7 @@ tcpmss_mangle_packet(struct sk_buff *skb, |
5779 | tcph = (struct tcphdr *)(skb_network_header(skb) + tcphoff); |
5780 | tcp_hdrlen = tcph->doff * 4; |
5781 | |
5782 | - if (len < tcp_hdrlen) |
5783 | + if (len < tcp_hdrlen || tcp_hdrlen < sizeof(struct tcphdr)) |
5784 | return -1; |
5785 | |
5786 | if (info->mss == XT_TCPMSS_CLAMP_PMTU) { |
5787 | @@ -152,6 +152,10 @@ tcpmss_mangle_packet(struct sk_buff *skb, |
5788 | if (len > tcp_hdrlen) |
5789 | return 0; |
5790 | |
5791 | + /* tcph->doff has 4 bits, do not wrap it to 0 */ |
5792 | + if (tcp_hdrlen >= 15 * 4) |
5793 | + return 0; |
5794 | + |
5795 | /* |
5796 | * MSS Option not found ?! add it.. |
5797 | */ |
5798 | diff --git a/net/sctp/socket.c b/net/sctp/socket.c |
5799 | index e1719c695174..9647e314d4fc 100644 |
5800 | --- a/net/sctp/socket.c |
5801 | +++ b/net/sctp/socket.c |
5802 | @@ -239,7 +239,7 @@ static struct sctp_transport *sctp_addr_id2transport(struct sock *sk, |
5803 | union sctp_addr *laddr = (union sctp_addr *)addr; |
5804 | struct sctp_transport *transport; |
5805 | |
5806 | - if (sctp_verify_addr(sk, laddr, af->sockaddr_len)) |
5807 | + if (!af || sctp_verify_addr(sk, laddr, af->sockaddr_len)) |
5808 | return NULL; |
5809 | |
5810 | addr_asoc = sctp_endpoint_lookup_assoc(sctp_sk(sk)->ep, |
5811 | @@ -4460,13 +4460,13 @@ int sctp_for_each_endpoint(int (*cb)(struct sctp_endpoint *, void *), |
5812 | |
5813 | for (head = sctp_ep_hashtable; hash < sctp_ep_hashsize; |
5814 | hash++, head++) { |
5815 | - read_lock(&head->lock); |
5816 | + read_lock_bh(&head->lock); |
5817 | sctp_for_each_hentry(epb, &head->chain) { |
5818 | err = cb(sctp_ep(epb), p); |
5819 | if (err) |
5820 | break; |
5821 | } |
5822 | - read_unlock(&head->lock); |
5823 | + read_unlock_bh(&head->lock); |
5824 | } |
5825 | |
5826 | return err; |
5827 | @@ -4506,9 +4506,8 @@ int sctp_for_each_transport(int (*cb)(struct sctp_transport *, void *), |
5828 | if (err) |
5829 | return err; |
5830 | |
5831 | - sctp_transport_get_idx(net, &hti, pos); |
5832 | - obj = sctp_transport_get_next(net, &hti); |
5833 | - for (; obj && !IS_ERR(obj); obj = sctp_transport_get_next(net, &hti)) { |
5834 | + obj = sctp_transport_get_idx(net, &hti, pos + 1); |
5835 | + for (; !IS_ERR_OR_NULL(obj); obj = sctp_transport_get_next(net, &hti)) { |
5836 | struct sctp_transport *transport = obj; |
5837 | |
5838 | if (!sctp_transport_hold(transport)) |
5839 | diff --git a/net/tipc/discover.c b/net/tipc/discover.c |
5840 | index 6b109a808d4c..02462d67d191 100644 |
5841 | --- a/net/tipc/discover.c |
5842 | +++ b/net/tipc/discover.c |
5843 | @@ -169,7 +169,7 @@ void tipc_disc_rcv(struct net *net, struct sk_buff *skb, |
5844 | |
5845 | /* Send response, if necessary */ |
5846 | if (respond && (mtyp == DSC_REQ_MSG)) { |
5847 | - rskb = tipc_buf_acquire(MAX_H_SIZE); |
5848 | + rskb = tipc_buf_acquire(MAX_H_SIZE, GFP_ATOMIC); |
5849 | if (!rskb) |
5850 | return; |
5851 | tipc_disc_init_msg(net, rskb, DSC_RESP_MSG, bearer); |
5852 | @@ -278,7 +278,7 @@ int tipc_disc_create(struct net *net, struct tipc_bearer *b, |
5853 | req = kmalloc(sizeof(*req), GFP_ATOMIC); |
5854 | if (!req) |
5855 | return -ENOMEM; |
5856 | - req->buf = tipc_buf_acquire(MAX_H_SIZE); |
5857 | + req->buf = tipc_buf_acquire(MAX_H_SIZE, GFP_ATOMIC); |
5858 | if (!req->buf) { |
5859 | kfree(req); |
5860 | return -ENOMEM; |
5861 | diff --git a/net/tipc/link.c b/net/tipc/link.c |
5862 | index bda89bf9f4ff..4e8647aef01c 100644 |
5863 | --- a/net/tipc/link.c |
5864 | +++ b/net/tipc/link.c |
5865 | @@ -1395,7 +1395,7 @@ void tipc_link_tnl_prepare(struct tipc_link *l, struct tipc_link *tnl, |
5866 | msg_set_seqno(hdr, seqno++); |
5867 | pktlen = msg_size(hdr); |
5868 | msg_set_size(&tnlhdr, pktlen + INT_H_SIZE); |
5869 | - tnlskb = tipc_buf_acquire(pktlen + INT_H_SIZE); |
5870 | + tnlskb = tipc_buf_acquire(pktlen + INT_H_SIZE, GFP_ATOMIC); |
5871 | if (!tnlskb) { |
5872 | pr_warn("%sunable to send packet\n", link_co_err); |
5873 | return; |
5874 | diff --git a/net/tipc/msg.c b/net/tipc/msg.c |
5875 | index 17201aa8423d..56ea0adcd285 100644 |
5876 | --- a/net/tipc/msg.c |
5877 | +++ b/net/tipc/msg.c |
5878 | @@ -58,12 +58,12 @@ static unsigned int align(unsigned int i) |
5879 | * NOTE: Headroom is reserved to allow prepending of a data link header. |
5880 | * There may also be unrequested tailroom present at the buffer's end. |
5881 | */ |
5882 | -struct sk_buff *tipc_buf_acquire(u32 size) |
5883 | +struct sk_buff *tipc_buf_acquire(u32 size, gfp_t gfp) |
5884 | { |
5885 | struct sk_buff *skb; |
5886 | unsigned int buf_size = (BUF_HEADROOM + size + 3) & ~3u; |
5887 | |
5888 | - skb = alloc_skb_fclone(buf_size, GFP_ATOMIC); |
5889 | + skb = alloc_skb_fclone(buf_size, gfp); |
5890 | if (skb) { |
5891 | skb_reserve(skb, BUF_HEADROOM); |
5892 | skb_put(skb, size); |
5893 | @@ -95,7 +95,7 @@ struct sk_buff *tipc_msg_create(uint user, uint type, |
5894 | struct tipc_msg *msg; |
5895 | struct sk_buff *buf; |
5896 | |
5897 | - buf = tipc_buf_acquire(hdr_sz + data_sz); |
5898 | + buf = tipc_buf_acquire(hdr_sz + data_sz, GFP_ATOMIC); |
5899 | if (unlikely(!buf)) |
5900 | return NULL; |
5901 | |
5902 | @@ -261,7 +261,7 @@ int tipc_msg_build(struct tipc_msg *mhdr, struct msghdr *m, |
5903 | |
5904 | /* No fragmentation needed? */ |
5905 | if (likely(msz <= pktmax)) { |
5906 | - skb = tipc_buf_acquire(msz); |
5907 | + skb = tipc_buf_acquire(msz, GFP_KERNEL); |
5908 | if (unlikely(!skb)) |
5909 | return -ENOMEM; |
5910 | skb_orphan(skb); |
5911 | @@ -282,7 +282,7 @@ int tipc_msg_build(struct tipc_msg *mhdr, struct msghdr *m, |
5912 | msg_set_importance(&pkthdr, msg_importance(mhdr)); |
5913 | |
5914 | /* Prepare first fragment */ |
5915 | - skb = tipc_buf_acquire(pktmax); |
5916 | + skb = tipc_buf_acquire(pktmax, GFP_KERNEL); |
5917 | if (!skb) |
5918 | return -ENOMEM; |
5919 | skb_orphan(skb); |
5920 | @@ -313,7 +313,7 @@ int tipc_msg_build(struct tipc_msg *mhdr, struct msghdr *m, |
5921 | pktsz = drem + INT_H_SIZE; |
5922 | else |
5923 | pktsz = pktmax; |
5924 | - skb = tipc_buf_acquire(pktsz); |
5925 | + skb = tipc_buf_acquire(pktsz, GFP_KERNEL); |
5926 | if (!skb) { |
5927 | rc = -ENOMEM; |
5928 | goto error; |
5929 | @@ -448,7 +448,7 @@ bool tipc_msg_make_bundle(struct sk_buff **skb, struct tipc_msg *msg, |
5930 | if (msz > (max / 2)) |
5931 | return false; |
5932 | |
5933 | - _skb = tipc_buf_acquire(max); |
5934 | + _skb = tipc_buf_acquire(max, GFP_ATOMIC); |
5935 | if (!_skb) |
5936 | return false; |
5937 | |
5938 | @@ -496,7 +496,7 @@ bool tipc_msg_reverse(u32 own_node, struct sk_buff **skb, int err) |
5939 | |
5940 | /* Never return SHORT header; expand by replacing buffer if necessary */ |
5941 | if (msg_short(hdr)) { |
5942 | - *skb = tipc_buf_acquire(BASIC_H_SIZE + dlen); |
5943 | + *skb = tipc_buf_acquire(BASIC_H_SIZE + dlen, GFP_ATOMIC); |
5944 | if (!*skb) |
5945 | goto exit; |
5946 | memcpy((*skb)->data + BASIC_H_SIZE, msg_data(hdr), dlen); |
5947 | @@ -508,7 +508,7 @@ bool tipc_msg_reverse(u32 own_node, struct sk_buff **skb, int err) |
5948 | } |
5949 | |
5950 | if (skb_cloned(_skb) && |
5951 | - pskb_expand_head(_skb, BUF_HEADROOM, BUF_TAILROOM, GFP_KERNEL)) |
5952 | + pskb_expand_head(_skb, BUF_HEADROOM, BUF_TAILROOM, GFP_ATOMIC)) |
5953 | goto exit; |
5954 | |
5955 | /* Now reverse the concerned fields */ |
5956 | diff --git a/net/tipc/msg.h b/net/tipc/msg.h |
5957 | index 50a739860d37..6c0455caf302 100644 |
5958 | --- a/net/tipc/msg.h |
5959 | +++ b/net/tipc/msg.h |
5960 | @@ -820,7 +820,7 @@ static inline bool msg_is_reset(struct tipc_msg *hdr) |
5961 | return (msg_user(hdr) == LINK_PROTOCOL) && (msg_type(hdr) == RESET_MSG); |
5962 | } |
5963 | |
5964 | -struct sk_buff *tipc_buf_acquire(u32 size); |
5965 | +struct sk_buff *tipc_buf_acquire(u32 size, gfp_t gfp); |
5966 | bool tipc_msg_validate(struct sk_buff *skb); |
5967 | bool tipc_msg_reverse(u32 own_addr, struct sk_buff **skb, int err); |
5968 | void tipc_msg_init(u32 own_addr, struct tipc_msg *m, u32 user, u32 type, |
5969 | diff --git a/net/tipc/name_distr.c b/net/tipc/name_distr.c |
5970 | index c1cfd92de17a..23f8899e0f8c 100644 |
5971 | --- a/net/tipc/name_distr.c |
5972 | +++ b/net/tipc/name_distr.c |
5973 | @@ -69,7 +69,7 @@ static struct sk_buff *named_prepare_buf(struct net *net, u32 type, u32 size, |
5974 | u32 dest) |
5975 | { |
5976 | struct tipc_net *tn = net_generic(net, tipc_net_id); |
5977 | - struct sk_buff *buf = tipc_buf_acquire(INT_H_SIZE + size); |
5978 | + struct sk_buff *buf = tipc_buf_acquire(INT_H_SIZE + size, GFP_ATOMIC); |
5979 | struct tipc_msg *msg; |
5980 | |
5981 | if (buf != NULL) { |
5982 | diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c |
5983 | index 2d03d5bcb5b9..915abe98174e 100644 |
5984 | --- a/net/unix/af_unix.c |
5985 | +++ b/net/unix/af_unix.c |
5986 | @@ -998,7 +998,8 @@ static int unix_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) |
5987 | struct path path = { NULL, NULL }; |
5988 | |
5989 | err = -EINVAL; |
5990 | - if (sunaddr->sun_family != AF_UNIX) |
5991 | + if (addr_len < offsetofend(struct sockaddr_un, sun_family) || |
5992 | + sunaddr->sun_family != AF_UNIX) |
5993 | goto out; |
5994 | |
5995 | if (addr_len == sizeof(short)) { |
5996 | @@ -1109,6 +1110,10 @@ static int unix_dgram_connect(struct socket *sock, struct sockaddr *addr, |
5997 | unsigned int hash; |
5998 | int err; |
5999 | |
6000 | + err = -EINVAL; |
6001 | + if (alen < offsetofend(struct sockaddr, sa_family)) |
6002 | + goto out; |
6003 | + |
6004 | if (addr->sa_family != AF_UNSPEC) { |
6005 | err = unix_mkname(sunaddr, alen, &hash); |
6006 | if (err < 0) |
6007 | diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c |
6008 | index e0437a7aa1a2..8da67f7c9c5a 100644 |
6009 | --- a/net/xfrm/xfrm_policy.c |
6010 | +++ b/net/xfrm/xfrm_policy.c |
6011 | @@ -1808,43 +1808,6 @@ static struct dst_entry *xfrm_bundle_create(struct xfrm_policy *policy, |
6012 | goto out; |
6013 | } |
6014 | |
6015 | -#ifdef CONFIG_XFRM_SUB_POLICY |
6016 | -static int xfrm_dst_alloc_copy(void **target, const void *src, int size) |
6017 | -{ |
6018 | - if (!*target) { |
6019 | - *target = kmalloc(size, GFP_ATOMIC); |
6020 | - if (!*target) |
6021 | - return -ENOMEM; |
6022 | - } |
6023 | - |
6024 | - memcpy(*target, src, size); |
6025 | - return 0; |
6026 | -} |
6027 | -#endif |
6028 | - |
6029 | -static int xfrm_dst_update_parent(struct dst_entry *dst, |
6030 | - const struct xfrm_selector *sel) |
6031 | -{ |
6032 | -#ifdef CONFIG_XFRM_SUB_POLICY |
6033 | - struct xfrm_dst *xdst = (struct xfrm_dst *)dst; |
6034 | - return xfrm_dst_alloc_copy((void **)&(xdst->partner), |
6035 | - sel, sizeof(*sel)); |
6036 | -#else |
6037 | - return 0; |
6038 | -#endif |
6039 | -} |
6040 | - |
6041 | -static int xfrm_dst_update_origin(struct dst_entry *dst, |
6042 | - const struct flowi *fl) |
6043 | -{ |
6044 | -#ifdef CONFIG_XFRM_SUB_POLICY |
6045 | - struct xfrm_dst *xdst = (struct xfrm_dst *)dst; |
6046 | - return xfrm_dst_alloc_copy((void **)&(xdst->origin), fl, sizeof(*fl)); |
6047 | -#else |
6048 | - return 0; |
6049 | -#endif |
6050 | -} |
6051 | - |
6052 | static int xfrm_expand_policies(const struct flowi *fl, u16 family, |
6053 | struct xfrm_policy **pols, |
6054 | int *num_pols, int *num_xfrms) |
6055 | @@ -1916,16 +1879,6 @@ xfrm_resolve_and_create_bundle(struct xfrm_policy **pols, int num_pols, |
6056 | |
6057 | xdst = (struct xfrm_dst *)dst; |
6058 | xdst->num_xfrms = err; |
6059 | - if (num_pols > 1) |
6060 | - err = xfrm_dst_update_parent(dst, &pols[1]->selector); |
6061 | - else |
6062 | - err = xfrm_dst_update_origin(dst, fl); |
6063 | - if (unlikely(err)) { |
6064 | - dst_free(dst); |
6065 | - XFRM_INC_STATS(net, LINUX_MIB_XFRMOUTBUNDLECHECKERROR); |
6066 | - return ERR_PTR(err); |
6067 | - } |
6068 | - |
6069 | xdst->num_pols = num_pols; |
6070 | memcpy(xdst->pols, pols, sizeof(struct xfrm_policy *) * num_pols); |
6071 | xdst->policy_genid = atomic_read(&pols[0]->genid); |
6072 | diff --git a/sound/pci/hda/hda_codec.h b/sound/pci/hda/hda_codec.h |
6073 | index 373fcad840ea..776dffa88aee 100644 |
6074 | --- a/sound/pci/hda/hda_codec.h |
6075 | +++ b/sound/pci/hda/hda_codec.h |
6076 | @@ -294,6 +294,8 @@ struct hda_codec { |
6077 | |
6078 | #define list_for_each_codec(c, bus) \ |
6079 | list_for_each_entry(c, &(bus)->core.codec_list, core.list) |
6080 | +#define list_for_each_codec_safe(c, n, bus) \ |
6081 | + list_for_each_entry_safe(c, n, &(bus)->core.codec_list, core.list) |
6082 | |
6083 | /* snd_hda_codec_read/write optional flags */ |
6084 | #define HDA_RW_NO_RESPONSE_FALLBACK (1 << 0) |
6085 | diff --git a/sound/pci/hda/hda_controller.c b/sound/pci/hda/hda_controller.c |
6086 | index 500878556578..0af1132a869e 100644 |
6087 | --- a/sound/pci/hda/hda_controller.c |
6088 | +++ b/sound/pci/hda/hda_controller.c |
6089 | @@ -1333,8 +1333,12 @@ EXPORT_SYMBOL_GPL(azx_probe_codecs); |
6090 | /* configure each codec instance */ |
6091 | int azx_codec_configure(struct azx *chip) |
6092 | { |
6093 | - struct hda_codec *codec; |
6094 | - list_for_each_codec(codec, &chip->bus) { |
6095 | + struct hda_codec *codec, *next; |
6096 | + |
6097 | + /* use _safe version here since snd_hda_codec_configure() deregisters |
6098 | + * the device upon error and deletes itself from the bus list. |
6099 | + */ |
6100 | + list_for_each_codec_safe(codec, next, &chip->bus) { |
6101 | snd_hda_codec_configure(codec); |
6102 | } |
6103 | return 0; |
6104 | diff --git a/sound/pci/hda/hda_generic.c b/sound/pci/hda/hda_generic.c |
6105 | index e7c8f4f076d5..b0bd29003b5d 100644 |
6106 | --- a/sound/pci/hda/hda_generic.c |
6107 | +++ b/sound/pci/hda/hda_generic.c |
6108 | @@ -3169,6 +3169,7 @@ static int check_dyn_adc_switch(struct hda_codec *codec) |
6109 | spec->input_paths[i][nums]); |
6110 | spec->input_paths[i][nums] = |
6111 | spec->input_paths[i][n]; |
6112 | + spec->input_paths[i][n] = 0; |
6113 | } |
6114 | } |
6115 | nums++; |
6116 | diff --git a/tools/arch/x86/lib/memcpy_64.S b/tools/arch/x86/lib/memcpy_64.S |
6117 | index 49e6ebac7e73..98dcc112b363 100644 |
6118 | --- a/tools/arch/x86/lib/memcpy_64.S |
6119 | +++ b/tools/arch/x86/lib/memcpy_64.S |
6120 | @@ -286,7 +286,7 @@ ENDPROC(memcpy_mcsafe_unrolled) |
6121 | _ASM_EXTABLE_FAULT(.L_copy_leading_bytes, .L_memcpy_mcsafe_fail) |
6122 | _ASM_EXTABLE_FAULT(.L_cache_w0, .L_memcpy_mcsafe_fail) |
6123 | _ASM_EXTABLE_FAULT(.L_cache_w1, .L_memcpy_mcsafe_fail) |
6124 | - _ASM_EXTABLE_FAULT(.L_cache_w3, .L_memcpy_mcsafe_fail) |
6125 | + _ASM_EXTABLE_FAULT(.L_cache_w2, .L_memcpy_mcsafe_fail) |
6126 | _ASM_EXTABLE_FAULT(.L_cache_w3, .L_memcpy_mcsafe_fail) |
6127 | _ASM_EXTABLE_FAULT(.L_cache_w4, .L_memcpy_mcsafe_fail) |
6128 | _ASM_EXTABLE_FAULT(.L_cache_w5, .L_memcpy_mcsafe_fail) |
6129 | diff --git a/tools/objtool/arch/x86/decode.c b/tools/objtool/arch/x86/decode.c |
6130 | index 5e0dea2cdc01..039636ffb6c8 100644 |
6131 | --- a/tools/objtool/arch/x86/decode.c |
6132 | +++ b/tools/objtool/arch/x86/decode.c |
6133 | @@ -150,9 +150,9 @@ int arch_decode_instruction(struct elf *elf, struct section *sec, |
6134 | *type = INSN_RETURN; |
6135 | break; |
6136 | |
6137 | - case 0xc5: /* iret */ |
6138 | case 0xca: /* retf */ |
6139 | case 0xcb: /* retf */ |
6140 | + case 0xcf: /* iret */ |
6141 | *type = INSN_CONTEXT_SWITCH; |
6142 | break; |
6143 | |
6144 | diff --git a/tools/objtool/builtin-check.c b/tools/objtool/builtin-check.c |
6145 | index e8a1f699058a..b8dadb050d2b 100644 |
6146 | --- a/tools/objtool/builtin-check.c |
6147 | +++ b/tools/objtool/builtin-check.c |
6148 | @@ -757,11 +757,20 @@ static struct rela *find_switch_table(struct objtool_file *file, |
6149 | insn->jump_dest->offset > orig_insn->offset)) |
6150 | break; |
6151 | |
6152 | + /* look for a relocation which references .rodata */ |
6153 | text_rela = find_rela_by_dest_range(insn->sec, insn->offset, |
6154 | insn->len); |
6155 | - if (text_rela && text_rela->sym == file->rodata->sym) |
6156 | - return find_rela_by_dest(file->rodata, |
6157 | - text_rela->addend); |
6158 | + if (!text_rela || text_rela->sym != file->rodata->sym) |
6159 | + continue; |
6160 | + |
6161 | + /* |
6162 | + * Make sure the .rodata address isn't associated with a |
6163 | + * symbol. gcc jump tables are anonymous data. |
6164 | + */ |
6165 | + if (find_symbol_containing(file->rodata, text_rela->addend)) |
6166 | + continue; |
6167 | + |
6168 | + return find_rela_by_dest(file->rodata, text_rela->addend); |
6169 | } |
6170 | |
6171 | return NULL; |
6172 | diff --git a/tools/objtool/elf.c b/tools/objtool/elf.c |
6173 | index 0d7983ac63ef..d897702ce742 100644 |
6174 | --- a/tools/objtool/elf.c |
6175 | +++ b/tools/objtool/elf.c |
6176 | @@ -85,6 +85,18 @@ struct symbol *find_symbol_by_offset(struct section *sec, unsigned long offset) |
6177 | return NULL; |
6178 | } |
6179 | |
6180 | +struct symbol *find_symbol_containing(struct section *sec, unsigned long offset) |
6181 | +{ |
6182 | + struct symbol *sym; |
6183 | + |
6184 | + list_for_each_entry(sym, &sec->symbol_list, list) |
6185 | + if (sym->type != STT_SECTION && |
6186 | + offset >= sym->offset && offset < sym->offset + sym->len) |
6187 | + return sym; |
6188 | + |
6189 | + return NULL; |
6190 | +} |
6191 | + |
6192 | struct rela *find_rela_by_dest_range(struct section *sec, unsigned long offset, |
6193 | unsigned int len) |
6194 | { |
6195 | diff --git a/tools/objtool/elf.h b/tools/objtool/elf.h |
6196 | index aa1ff6596684..731973e1a3f5 100644 |
6197 | --- a/tools/objtool/elf.h |
6198 | +++ b/tools/objtool/elf.h |
6199 | @@ -79,6 +79,7 @@ struct elf { |
6200 | struct elf *elf_open(const char *name); |
6201 | struct section *find_section_by_name(struct elf *elf, const char *name); |
6202 | struct symbol *find_symbol_by_offset(struct section *sec, unsigned long offset); |
6203 | +struct symbol *find_symbol_containing(struct section *sec, unsigned long offset); |
6204 | struct rela *find_rela_by_dest(struct section *sec, unsigned long offset); |
6205 | struct rela *find_rela_by_dest_range(struct section *sec, unsigned long offset, |
6206 | unsigned int len); |
6207 | diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c |
6208 | index d281ae2b54e8..1d9c02bc00f1 100644 |
6209 | --- a/tools/perf/util/probe-event.c |
6210 | +++ b/tools/perf/util/probe-event.c |
6211 | @@ -645,18 +645,31 @@ static int add_exec_to_probe_trace_events(struct probe_trace_event *tevs, |
6212 | return ret; |
6213 | } |
6214 | |
6215 | -static int add_module_to_probe_trace_events(struct probe_trace_event *tevs, |
6216 | - int ntevs, const char *module) |
6217 | +static int |
6218 | +post_process_module_probe_trace_events(struct probe_trace_event *tevs, |
6219 | + int ntevs, const char *module, |
6220 | + struct debuginfo *dinfo) |
6221 | { |
6222 | + Dwarf_Addr text_offs = 0; |
6223 | int i, ret = 0; |
6224 | char *mod_name = NULL; |
6225 | + struct map *map; |
6226 | |
6227 | if (!module) |
6228 | return 0; |
6229 | |
6230 | - mod_name = find_module_name(module); |
6231 | + map = get_target_map(module, false); |
6232 | + if (!map || debuginfo__get_text_offset(dinfo, &text_offs, true) < 0) { |
6233 | + pr_warning("Failed to get ELF symbols for %s\n", module); |
6234 | + return -EINVAL; |
6235 | + } |
6236 | |
6237 | + mod_name = find_module_name(module); |
6238 | for (i = 0; i < ntevs; i++) { |
6239 | + ret = post_process_probe_trace_point(&tevs[i].point, |
6240 | + map, (unsigned long)text_offs); |
6241 | + if (ret < 0) |
6242 | + break; |
6243 | tevs[i].point.module = |
6244 | strdup(mod_name ? mod_name : module); |
6245 | if (!tevs[i].point.module) { |
6246 | @@ -666,6 +679,8 @@ static int add_module_to_probe_trace_events(struct probe_trace_event *tevs, |
6247 | } |
6248 | |
6249 | free(mod_name); |
6250 | + map__put(map); |
6251 | + |
6252 | return ret; |
6253 | } |
6254 | |
6255 | @@ -722,7 +737,7 @@ arch__post_process_probe_trace_events(struct perf_probe_event *pev __maybe_unuse |
6256 | static int post_process_probe_trace_events(struct perf_probe_event *pev, |
6257 | struct probe_trace_event *tevs, |
6258 | int ntevs, const char *module, |
6259 | - bool uprobe) |
6260 | + bool uprobe, struct debuginfo *dinfo) |
6261 | { |
6262 | int ret; |
6263 | |
6264 | @@ -730,7 +745,8 @@ static int post_process_probe_trace_events(struct perf_probe_event *pev, |
6265 | ret = add_exec_to_probe_trace_events(tevs, ntevs, module); |
6266 | else if (module) |
6267 | /* Currently ref_reloc_sym based probe is not for drivers */ |
6268 | - ret = add_module_to_probe_trace_events(tevs, ntevs, module); |
6269 | + ret = post_process_module_probe_trace_events(tevs, ntevs, |
6270 | + module, dinfo); |
6271 | else |
6272 | ret = post_process_kernel_probe_trace_events(tevs, ntevs); |
6273 | |
6274 | @@ -774,30 +790,27 @@ static int try_to_find_probe_trace_events(struct perf_probe_event *pev, |
6275 | } |
6276 | } |
6277 | |
6278 | - debuginfo__delete(dinfo); |
6279 | - |
6280 | if (ntevs > 0) { /* Succeeded to find trace events */ |
6281 | pr_debug("Found %d probe_trace_events.\n", ntevs); |
6282 | ret = post_process_probe_trace_events(pev, *tevs, ntevs, |
6283 | - pev->target, pev->uprobes); |
6284 | + pev->target, pev->uprobes, dinfo); |
6285 | if (ret < 0 || ret == ntevs) { |
6286 | + pr_debug("Post processing failed or all events are skipped. (%d)\n", ret); |
6287 | clear_probe_trace_events(*tevs, ntevs); |
6288 | zfree(tevs); |
6289 | + ntevs = 0; |
6290 | } |
6291 | - if (ret != ntevs) |
6292 | - return ret < 0 ? ret : ntevs; |
6293 | - ntevs = 0; |
6294 | - /* Fall through */ |
6295 | } |
6296 | |
6297 | + debuginfo__delete(dinfo); |
6298 | + |
6299 | if (ntevs == 0) { /* No error but failed to find probe point. */ |
6300 | pr_warning("Probe point '%s' not found.\n", |
6301 | synthesize_perf_probe_point(&pev->point)); |
6302 | return -ENOENT; |
6303 | - } |
6304 | - /* Error path : ntevs < 0 */ |
6305 | - pr_debug("An error occurred in debuginfo analysis (%d).\n", ntevs); |
6306 | - if (ntevs < 0) { |
6307 | + } else if (ntevs < 0) { |
6308 | + /* Error path : ntevs < 0 */ |
6309 | + pr_debug("An error occurred in debuginfo analysis (%d).\n", ntevs); |
6310 | if (ntevs == -EBADF) |
6311 | pr_warning("Warning: No dwarf info found in the vmlinux - " |
6312 | "please rebuild kernel with CONFIG_DEBUG_INFO=y.\n"); |
6313 | diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c |
6314 | index df4debe564da..0d9d6e0803b8 100644 |
6315 | --- a/tools/perf/util/probe-finder.c |
6316 | +++ b/tools/perf/util/probe-finder.c |
6317 | @@ -1501,7 +1501,8 @@ int debuginfo__find_available_vars_at(struct debuginfo *dbg, |
6318 | } |
6319 | |
6320 | /* For the kernel module, we need a special code to get a DIE */ |
6321 | -static int debuginfo__get_text_offset(struct debuginfo *dbg, Dwarf_Addr *offs) |
6322 | +int debuginfo__get_text_offset(struct debuginfo *dbg, Dwarf_Addr *offs, |
6323 | + bool adjust_offset) |
6324 | { |
6325 | int n, i; |
6326 | Elf32_Word shndx; |
6327 | @@ -1530,6 +1531,8 @@ static int debuginfo__get_text_offset(struct debuginfo *dbg, Dwarf_Addr *offs) |
6328 | if (!shdr) |
6329 | return -ENOENT; |
6330 | *offs = shdr->sh_addr; |
6331 | + if (adjust_offset) |
6332 | + *offs -= shdr->sh_offset; |
6333 | } |
6334 | } |
6335 | return 0; |
6336 | @@ -1543,16 +1546,12 @@ int debuginfo__find_probe_point(struct debuginfo *dbg, unsigned long addr, |
6337 | Dwarf_Addr _addr = 0, baseaddr = 0; |
6338 | const char *fname = NULL, *func = NULL, *basefunc = NULL, *tmp; |
6339 | int baseline = 0, lineno = 0, ret = 0; |
6340 | - bool reloc = false; |
6341 | |
6342 | -retry: |
6343 | + /* We always need to relocate the address for aranges */ |
6344 | + if (debuginfo__get_text_offset(dbg, &baseaddr, false) == 0) |
6345 | + addr += baseaddr; |
6346 | /* Find cu die */ |
6347 | if (!dwarf_addrdie(dbg->dbg, (Dwarf_Addr)addr, &cudie)) { |
6348 | - if (!reloc && debuginfo__get_text_offset(dbg, &baseaddr) == 0) { |
6349 | - addr += baseaddr; |
6350 | - reloc = true; |
6351 | - goto retry; |
6352 | - } |
6353 | pr_warning("Failed to find debug information for address %lx\n", |
6354 | addr); |
6355 | ret = -EINVAL; |
6356 | diff --git a/tools/perf/util/probe-finder.h b/tools/perf/util/probe-finder.h |
6357 | index f1d8558f498e..2956c5198652 100644 |
6358 | --- a/tools/perf/util/probe-finder.h |
6359 | +++ b/tools/perf/util/probe-finder.h |
6360 | @@ -46,6 +46,9 @@ int debuginfo__find_trace_events(struct debuginfo *dbg, |
6361 | int debuginfo__find_probe_point(struct debuginfo *dbg, unsigned long addr, |
6362 | struct perf_probe_point *ppt); |
6363 | |
6364 | +int debuginfo__get_text_offset(struct debuginfo *dbg, Dwarf_Addr *offs, |
6365 | + bool adjust_offset); |
6366 | + |
6367 | /* Find a line range */ |
6368 | int debuginfo__find_line_range(struct debuginfo *dbg, struct line_range *lr); |
6369 |