Contents of /trunk/kernel-magellan/patches-4.11/0108-4.11.9-all-fixes.patch
Parent Directory | Revision Log
Revision 2953 -
(show annotations)
(download)
Thu Jul 6 13:57:45 2017 UTC (7 years, 2 months ago) by niro
File size: 124593 byte(s)
Thu Jul 6 13:57:45 2017 UTC (7 years, 2 months ago) by niro
File size: 124593 byte(s)
-linux-4.11.9
1 | diff --git a/Makefile b/Makefile |
2 | index 8c5c94ca56d9..9db9095e0d7b 100644 |
3 | --- a/Makefile |
4 | +++ b/Makefile |
5 | @@ -1,6 +1,6 @@ |
6 | VERSION = 4 |
7 | PATCHLEVEL = 11 |
8 | -SUBLEVEL = 8 |
9 | +SUBLEVEL = 9 |
10 | EXTRAVERSION = |
11 | NAME = Fearless Coyote |
12 | |
13 | diff --git a/arch/arm/mach-davinci/pm.c b/arch/arm/mach-davinci/pm.c |
14 | index 0afd201ab980..28255af5f2d8 100644 |
15 | --- a/arch/arm/mach-davinci/pm.c |
16 | +++ b/arch/arm/mach-davinci/pm.c |
17 | @@ -154,7 +154,8 @@ int __init davinci_pm_init(void) |
18 | davinci_sram_suspend = sram_alloc(davinci_cpu_suspend_sz, NULL); |
19 | if (!davinci_sram_suspend) { |
20 | pr_err("PM: cannot allocate SRAM memory\n"); |
21 | - return -ENOMEM; |
22 | + ret = -ENOMEM; |
23 | + goto no_sram_mem; |
24 | } |
25 | |
26 | davinci_sram_push(davinci_sram_suspend, davinci_cpu_suspend, |
27 | @@ -162,6 +163,10 @@ int __init davinci_pm_init(void) |
28 | |
29 | suspend_set_ops(&davinci_pm_ops); |
30 | |
31 | + return 0; |
32 | + |
33 | +no_sram_mem: |
34 | + iounmap(pm_config.ddrpsc_reg_base); |
35 | no_ddrpsc_mem: |
36 | iounmap(pm_config.ddrpll_reg_base); |
37 | no_ddrpll_mem: |
38 | diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c |
39 | index 347cca965783..2a343349d4c4 100644 |
40 | --- a/arch/arm/mm/mmu.c |
41 | +++ b/arch/arm/mm/mmu.c |
42 | @@ -1216,15 +1216,15 @@ void __init adjust_lowmem_bounds(void) |
43 | |
44 | high_memory = __va(arm_lowmem_limit - 1) + 1; |
45 | |
46 | + if (!memblock_limit) |
47 | + memblock_limit = arm_lowmem_limit; |
48 | + |
49 | /* |
50 | * Round the memblock limit down to a pmd size. This |
51 | * helps to ensure that we will allocate memory from the |
52 | * last full pmd, which should be mapped. |
53 | */ |
54 | - if (memblock_limit) |
55 | - memblock_limit = round_down(memblock_limit, PMD_SIZE); |
56 | - if (!memblock_limit) |
57 | - memblock_limit = arm_lowmem_limit; |
58 | + memblock_limit = round_down(memblock_limit, PMD_SIZE); |
59 | |
60 | if (!IS_ENABLED(CONFIG_HIGHMEM) || cache_is_vipt_aliasing()) { |
61 | if (memblock_end_of_DRAM() > arm_lowmem_limit) { |
62 | diff --git a/arch/arm64/include/asm/acpi.h b/arch/arm64/include/asm/acpi.h |
63 | index c1976c0adca7..ae66f5ef11f1 100644 |
64 | --- a/arch/arm64/include/asm/acpi.h |
65 | +++ b/arch/arm64/include/asm/acpi.h |
66 | @@ -23,9 +23,9 @@ |
67 | #define ACPI_MADT_GICC_LENGTH \ |
68 | (acpi_gbl_FADT.header.revision < 6 ? 76 : 80) |
69 | |
70 | -#define BAD_MADT_GICC_ENTRY(entry, end) \ |
71 | - (!(entry) || (unsigned long)(entry) + sizeof(*(entry)) > (end) || \ |
72 | - (entry)->header.length != ACPI_MADT_GICC_LENGTH) |
73 | +#define BAD_MADT_GICC_ENTRY(entry, end) \ |
74 | + (!(entry) || (entry)->header.length != ACPI_MADT_GICC_LENGTH || \ |
75 | + (unsigned long)(entry) + ACPI_MADT_GICC_LENGTH > (end)) |
76 | |
77 | /* Basic configuration for ACPI */ |
78 | #ifdef CONFIG_ACPI |
79 | diff --git a/arch/arm64/kernel/pci.c b/arch/arm64/kernel/pci.c |
80 | index 4f0e3ebfea4b..c7e3e6387a49 100644 |
81 | --- a/arch/arm64/kernel/pci.c |
82 | +++ b/arch/arm64/kernel/pci.c |
83 | @@ -191,8 +191,10 @@ struct pci_bus *pci_acpi_scan_root(struct acpi_pci_root *root) |
84 | return NULL; |
85 | |
86 | root_ops = kzalloc_node(sizeof(*root_ops), GFP_KERNEL, node); |
87 | - if (!root_ops) |
88 | + if (!root_ops) { |
89 | + kfree(ri); |
90 | return NULL; |
91 | + } |
92 | |
93 | ri->cfg = pci_acpi_setup_ecam_mapping(root); |
94 | if (!ri->cfg) { |
95 | diff --git a/arch/mips/kernel/entry.S b/arch/mips/kernel/entry.S |
96 | index 8d83fc2a96b7..38a302919e6b 100644 |
97 | --- a/arch/mips/kernel/entry.S |
98 | +++ b/arch/mips/kernel/entry.S |
99 | @@ -11,6 +11,7 @@ |
100 | #include <asm/asm.h> |
101 | #include <asm/asmmacro.h> |
102 | #include <asm/compiler.h> |
103 | +#include <asm/irqflags.h> |
104 | #include <asm/regdef.h> |
105 | #include <asm/mipsregs.h> |
106 | #include <asm/stackframe.h> |
107 | @@ -119,6 +120,7 @@ work_pending: |
108 | andi t0, a2, _TIF_NEED_RESCHED # a2 is preloaded with TI_FLAGS |
109 | beqz t0, work_notifysig |
110 | work_resched: |
111 | + TRACE_IRQS_OFF |
112 | jal schedule |
113 | |
114 | local_irq_disable # make sure need_resched and |
115 | @@ -155,6 +157,7 @@ syscall_exit_work: |
116 | beqz t0, work_pending # trace bit set? |
117 | local_irq_enable # could let syscall_trace_leave() |
118 | # call schedule() instead |
119 | + TRACE_IRQS_ON |
120 | move a0, sp |
121 | jal syscall_trace_leave |
122 | b resume_userspace |
123 | diff --git a/arch/mips/kernel/head.S b/arch/mips/kernel/head.S |
124 | index cf052204eb0a..d1bb506adc10 100644 |
125 | --- a/arch/mips/kernel/head.S |
126 | +++ b/arch/mips/kernel/head.S |
127 | @@ -106,8 +106,8 @@ NESTED(kernel_entry, 16, sp) # kernel entry point |
128 | beq t0, t1, dtb_found |
129 | #endif |
130 | li t1, -2 |
131 | - beq a0, t1, dtb_found |
132 | move t2, a1 |
133 | + beq a0, t1, dtb_found |
134 | |
135 | li t2, 0 |
136 | dtb_found: |
137 | diff --git a/arch/mips/kernel/pm-cps.c b/arch/mips/kernel/pm-cps.c |
138 | index 5f928c34c148..d99416094ba9 100644 |
139 | --- a/arch/mips/kernel/pm-cps.c |
140 | +++ b/arch/mips/kernel/pm-cps.c |
141 | @@ -56,7 +56,6 @@ DECLARE_BITMAP(state_support, CPS_PM_STATE_COUNT); |
142 | * state. Actually per-core rather than per-CPU. |
143 | */ |
144 | static DEFINE_PER_CPU_ALIGNED(u32*, ready_count); |
145 | -static DEFINE_PER_CPU_ALIGNED(void*, ready_count_alloc); |
146 | |
147 | /* Indicates online CPUs coupled with the current CPU */ |
148 | static DEFINE_PER_CPU_ALIGNED(cpumask_t, online_coupled); |
149 | @@ -642,7 +641,6 @@ static int cps_pm_online_cpu(unsigned int cpu) |
150 | { |
151 | enum cps_pm_state state; |
152 | unsigned core = cpu_data[cpu].core; |
153 | - unsigned dlinesz = cpu_data[cpu].dcache.linesz; |
154 | void *entry_fn, *core_rc; |
155 | |
156 | for (state = CPS_PM_NC_WAIT; state < CPS_PM_STATE_COUNT; state++) { |
157 | @@ -662,16 +660,11 @@ static int cps_pm_online_cpu(unsigned int cpu) |
158 | } |
159 | |
160 | if (!per_cpu(ready_count, core)) { |
161 | - core_rc = kmalloc(dlinesz * 2, GFP_KERNEL); |
162 | + core_rc = kmalloc(sizeof(u32), GFP_KERNEL); |
163 | if (!core_rc) { |
164 | pr_err("Failed allocate core %u ready_count\n", core); |
165 | return -ENOMEM; |
166 | } |
167 | - per_cpu(ready_count_alloc, core) = core_rc; |
168 | - |
169 | - /* Ensure ready_count is aligned to a cacheline boundary */ |
170 | - core_rc += dlinesz - 1; |
171 | - core_rc = (void *)((unsigned long)core_rc & ~(dlinesz - 1)); |
172 | per_cpu(ready_count, core) = core_rc; |
173 | } |
174 | |
175 | diff --git a/arch/mips/kernel/traps.c b/arch/mips/kernel/traps.c |
176 | index b49e7bf9f950..0b675023b9c6 100644 |
177 | --- a/arch/mips/kernel/traps.c |
178 | +++ b/arch/mips/kernel/traps.c |
179 | @@ -201,6 +201,8 @@ void show_stack(struct task_struct *task, unsigned long *sp) |
180 | { |
181 | struct pt_regs regs; |
182 | mm_segment_t old_fs = get_fs(); |
183 | + |
184 | + regs.cp0_status = KSU_KERNEL; |
185 | if (sp) { |
186 | regs.regs[29] = (unsigned long)sp; |
187 | regs.regs[31] = 0; |
188 | diff --git a/arch/x86/boot/compressed/kaslr.c b/arch/x86/boot/compressed/kaslr.c |
189 | index 8b7c9e75edcb..8fad8a64d670 100644 |
190 | --- a/arch/x86/boot/compressed/kaslr.c |
191 | +++ b/arch/x86/boot/compressed/kaslr.c |
192 | @@ -564,9 +564,6 @@ void choose_random_location(unsigned long input, |
193 | { |
194 | unsigned long random_addr, min_addr; |
195 | |
196 | - /* By default, keep output position unchanged. */ |
197 | - *virt_addr = *output; |
198 | - |
199 | if (cmdline_find_option_bool("nokaslr")) { |
200 | warn("KASLR disabled: 'nokaslr' on cmdline."); |
201 | return; |
202 | diff --git a/arch/x86/boot/compressed/misc.c b/arch/x86/boot/compressed/misc.c |
203 | index b3c5a5f030ce..c945acd8fa33 100644 |
204 | --- a/arch/x86/boot/compressed/misc.c |
205 | +++ b/arch/x86/boot/compressed/misc.c |
206 | @@ -338,7 +338,7 @@ asmlinkage __visible void *extract_kernel(void *rmode, memptr heap, |
207 | unsigned long output_len) |
208 | { |
209 | const unsigned long kernel_total_size = VO__end - VO__text; |
210 | - unsigned long virt_addr = (unsigned long)output; |
211 | + unsigned long virt_addr = LOAD_PHYSICAL_ADDR; |
212 | |
213 | /* Retain x86 boot parameters pointer passed from startup_32/64. */ |
214 | boot_params = rmode; |
215 | @@ -397,7 +397,7 @@ asmlinkage __visible void *extract_kernel(void *rmode, memptr heap, |
216 | #ifndef CONFIG_RELOCATABLE |
217 | if ((unsigned long)output != LOAD_PHYSICAL_ADDR) |
218 | error("Destination address does not match LOAD_PHYSICAL_ADDR"); |
219 | - if ((unsigned long)output != virt_addr) |
220 | + if (virt_addr != LOAD_PHYSICAL_ADDR) |
221 | error("Destination virtual address changed when not relocatable"); |
222 | #endif |
223 | |
224 | diff --git a/arch/x86/boot/compressed/misc.h b/arch/x86/boot/compressed/misc.h |
225 | index 1c8355eadbd1..766a5211f827 100644 |
226 | --- a/arch/x86/boot/compressed/misc.h |
227 | +++ b/arch/x86/boot/compressed/misc.h |
228 | @@ -81,8 +81,6 @@ static inline void choose_random_location(unsigned long input, |
229 | unsigned long output_size, |
230 | unsigned long *virt_addr) |
231 | { |
232 | - /* No change from existing output location. */ |
233 | - *virt_addr = *output; |
234 | } |
235 | #endif |
236 | |
237 | diff --git a/arch/x86/entry/entry_32.S b/arch/x86/entry/entry_32.S |
238 | index 57f7ec35216e..701d29f8e4d3 100644 |
239 | --- a/arch/x86/entry/entry_32.S |
240 | +++ b/arch/x86/entry/entry_32.S |
241 | @@ -255,6 +255,23 @@ ENTRY(__switch_to_asm) |
242 | END(__switch_to_asm) |
243 | |
244 | /* |
245 | + * The unwinder expects the last frame on the stack to always be at the same |
246 | + * offset from the end of the page, which allows it to validate the stack. |
247 | + * Calling schedule_tail() directly would break that convention because its an |
248 | + * asmlinkage function so its argument has to be pushed on the stack. This |
249 | + * wrapper creates a proper "end of stack" frame header before the call. |
250 | + */ |
251 | +ENTRY(schedule_tail_wrapper) |
252 | + FRAME_BEGIN |
253 | + |
254 | + pushl %eax |
255 | + call schedule_tail |
256 | + popl %eax |
257 | + |
258 | + FRAME_END |
259 | + ret |
260 | +ENDPROC(schedule_tail_wrapper) |
261 | +/* |
262 | * A newly forked process directly context switches into this address. |
263 | * |
264 | * eax: prev task we switched from |
265 | @@ -262,24 +279,15 @@ END(__switch_to_asm) |
266 | * edi: kernel thread arg |
267 | */ |
268 | ENTRY(ret_from_fork) |
269 | - FRAME_BEGIN /* help unwinder find end of stack */ |
270 | - |
271 | - /* |
272 | - * schedule_tail() is asmlinkage so we have to put its 'prev' argument |
273 | - * on the stack. |
274 | - */ |
275 | - pushl %eax |
276 | - call schedule_tail |
277 | - popl %eax |
278 | + call schedule_tail_wrapper |
279 | |
280 | testl %ebx, %ebx |
281 | jnz 1f /* kernel threads are uncommon */ |
282 | |
283 | 2: |
284 | /* When we fork, we trace the syscall return in the child, too. */ |
285 | - leal FRAME_OFFSET(%esp), %eax |
286 | + movl %esp, %eax |
287 | call syscall_return_slowpath |
288 | - FRAME_END |
289 | jmp restore_all |
290 | |
291 | /* kernel thread */ |
292 | diff --git a/arch/x86/entry/entry_64.S b/arch/x86/entry/entry_64.S |
293 | index 044d18ebc43c..5b219707c2f2 100644 |
294 | --- a/arch/x86/entry/entry_64.S |
295 | +++ b/arch/x86/entry/entry_64.S |
296 | @@ -36,7 +36,6 @@ |
297 | #include <asm/smap.h> |
298 | #include <asm/pgtable_types.h> |
299 | #include <asm/export.h> |
300 | -#include <asm/frame.h> |
301 | #include <linux/err.h> |
302 | |
303 | .code64 |
304 | @@ -409,19 +408,17 @@ END(__switch_to_asm) |
305 | * r12: kernel thread arg |
306 | */ |
307 | ENTRY(ret_from_fork) |
308 | - FRAME_BEGIN /* help unwinder find end of stack */ |
309 | movq %rax, %rdi |
310 | - call schedule_tail /* rdi: 'prev' task parameter */ |
311 | + call schedule_tail /* rdi: 'prev' task parameter */ |
312 | |
313 | - testq %rbx, %rbx /* from kernel_thread? */ |
314 | - jnz 1f /* kernel threads are uncommon */ |
315 | + testq %rbx, %rbx /* from kernel_thread? */ |
316 | + jnz 1f /* kernel threads are uncommon */ |
317 | |
318 | 2: |
319 | - leaq FRAME_OFFSET(%rsp),%rdi /* pt_regs pointer */ |
320 | + movq %rsp, %rdi |
321 | call syscall_return_slowpath /* returns with IRQs disabled */ |
322 | TRACE_IRQS_ON /* user mode is traced as IRQS on */ |
323 | SWAPGS |
324 | - FRAME_END |
325 | jmp restore_regs_and_iret |
326 | |
327 | 1: |
328 | diff --git a/arch/x86/events/intel/core.c b/arch/x86/events/intel/core.c |
329 | index 65c2ca578556..78da7b646cd0 100644 |
330 | --- a/arch/x86/events/intel/core.c |
331 | +++ b/arch/x86/events/intel/core.c |
332 | @@ -2130,7 +2130,7 @@ static int intel_pmu_handle_irq(struct pt_regs *regs) |
333 | * counters from the GLOBAL_STATUS mask and we always process PEBS |
334 | * events via drain_pebs(). |
335 | */ |
336 | - status &= ~cpuc->pebs_enabled; |
337 | + status &= ~(cpuc->pebs_enabled & PEBS_COUNTER_MASK); |
338 | |
339 | /* |
340 | * PEBS overflow sets bit 62 in the global status register |
341 | diff --git a/arch/x86/events/intel/ds.c b/arch/x86/events/intel/ds.c |
342 | index 9dfeeeca0ea8..c6d23ffe422d 100644 |
343 | --- a/arch/x86/events/intel/ds.c |
344 | +++ b/arch/x86/events/intel/ds.c |
345 | @@ -1222,7 +1222,7 @@ get_next_pebs_record_by_bit(void *base, void *top, int bit) |
346 | |
347 | /* clear non-PEBS bit and re-check */ |
348 | pebs_status = p->status & cpuc->pebs_enabled; |
349 | - pebs_status &= (1ULL << MAX_PEBS_EVENTS) - 1; |
350 | + pebs_status &= PEBS_COUNTER_MASK; |
351 | if (pebs_status == (1 << bit)) |
352 | return at; |
353 | } |
354 | diff --git a/arch/x86/events/intel/uncore.c b/arch/x86/events/intel/uncore.c |
355 | index 758c1aa5009d..44ec523287f6 100644 |
356 | --- a/arch/x86/events/intel/uncore.c |
357 | +++ b/arch/x86/events/intel/uncore.c |
358 | @@ -1170,7 +1170,7 @@ static int uncore_event_cpu_online(unsigned int cpu) |
359 | pmu = type->pmus; |
360 | for (i = 0; i < type->num_boxes; i++, pmu++) { |
361 | box = pmu->boxes[pkg]; |
362 | - if (!box && atomic_inc_return(&box->refcnt) == 1) |
363 | + if (box && atomic_inc_return(&box->refcnt) == 1) |
364 | uncore_box_init(box); |
365 | } |
366 | } |
367 | diff --git a/arch/x86/events/perf_event.h b/arch/x86/events/perf_event.h |
368 | index bcbb1d2ae10b..be3d36254040 100644 |
369 | --- a/arch/x86/events/perf_event.h |
370 | +++ b/arch/x86/events/perf_event.h |
371 | @@ -79,6 +79,7 @@ struct amd_nb { |
372 | |
373 | /* The maximal number of PEBS events: */ |
374 | #define MAX_PEBS_EVENTS 8 |
375 | +#define PEBS_COUNTER_MASK ((1ULL << MAX_PEBS_EVENTS) - 1) |
376 | |
377 | /* |
378 | * Flags PEBS can handle without an PMI. |
379 | diff --git a/arch/x86/include/asm/kvm_emulate.h b/arch/x86/include/asm/kvm_emulate.h |
380 | index d5f83cda1dea..722d0e568863 100644 |
381 | --- a/arch/x86/include/asm/kvm_emulate.h |
382 | +++ b/arch/x86/include/asm/kvm_emulate.h |
383 | @@ -221,6 +221,9 @@ struct x86_emulate_ops { |
384 | void (*get_cpuid)(struct x86_emulate_ctxt *ctxt, |
385 | u32 *eax, u32 *ebx, u32 *ecx, u32 *edx); |
386 | void (*set_nmi_mask)(struct x86_emulate_ctxt *ctxt, bool masked); |
387 | + |
388 | + unsigned (*get_hflags)(struct x86_emulate_ctxt *ctxt); |
389 | + void (*set_hflags)(struct x86_emulate_ctxt *ctxt, unsigned hflags); |
390 | }; |
391 | |
392 | typedef u32 __attribute__((vector_size(16))) sse128_t; |
393 | @@ -290,7 +293,6 @@ struct x86_emulate_ctxt { |
394 | |
395 | /* interruptibility state, as a result of execution of STI or MOV SS */ |
396 | int interruptibility; |
397 | - int emul_flags; |
398 | |
399 | bool perm_ok; /* do not check permissions if true */ |
400 | bool ud; /* inject an #UD if host doesn't support insn */ |
401 | diff --git a/arch/x86/include/asm/mshyperv.h b/arch/x86/include/asm/mshyperv.h |
402 | index 7c9c895432a9..6a348b6f73a2 100644 |
403 | --- a/arch/x86/include/asm/mshyperv.h |
404 | +++ b/arch/x86/include/asm/mshyperv.h |
405 | @@ -2,8 +2,7 @@ |
406 | #define _ASM_X86_MSHYPER_H |
407 | |
408 | #include <linux/types.h> |
409 | -#include <linux/interrupt.h> |
410 | -#include <linux/clocksource.h> |
411 | +#include <linux/atomic.h> |
412 | #include <asm/hyperv.h> |
413 | |
414 | /* |
415 | diff --git a/arch/x86/kernel/cpu/intel_rdt_rdtgroup.c b/arch/x86/kernel/cpu/intel_rdt_rdtgroup.c |
416 | index 9ac2a5cdd9c2..e79fb6b3dffe 100644 |
417 | --- a/arch/x86/kernel/cpu/intel_rdt_rdtgroup.c |
418 | +++ b/arch/x86/kernel/cpu/intel_rdt_rdtgroup.c |
419 | @@ -767,11 +767,13 @@ static struct dentry *rdt_mount(struct file_system_type *fs_type, |
420 | dentry = kernfs_mount(fs_type, flags, rdt_root, |
421 | RDTGROUP_SUPER_MAGIC, NULL); |
422 | if (IS_ERR(dentry)) |
423 | - goto out_cdp; |
424 | + goto out_destroy; |
425 | |
426 | static_branch_enable(&rdt_enable_key); |
427 | goto out; |
428 | |
429 | +out_destroy: |
430 | + kernfs_remove(kn_info); |
431 | out_cdp: |
432 | cdp_disable(); |
433 | out: |
434 | diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c |
435 | index ce7f80baa664..0fca363787ff 100644 |
436 | --- a/arch/x86/kvm/emulate.c |
437 | +++ b/arch/x86/kvm/emulate.c |
438 | @@ -2547,7 +2547,7 @@ static int em_rsm(struct x86_emulate_ctxt *ctxt) |
439 | u64 smbase; |
440 | int ret; |
441 | |
442 | - if ((ctxt->emul_flags & X86EMUL_SMM_MASK) == 0) |
443 | + if ((ctxt->ops->get_hflags(ctxt) & X86EMUL_SMM_MASK) == 0) |
444 | return emulate_ud(ctxt); |
445 | |
446 | /* |
447 | @@ -2596,11 +2596,11 @@ static int em_rsm(struct x86_emulate_ctxt *ctxt) |
448 | return X86EMUL_UNHANDLEABLE; |
449 | } |
450 | |
451 | - if ((ctxt->emul_flags & X86EMUL_SMM_INSIDE_NMI_MASK) == 0) |
452 | + if ((ctxt->ops->get_hflags(ctxt) & X86EMUL_SMM_INSIDE_NMI_MASK) == 0) |
453 | ctxt->ops->set_nmi_mask(ctxt, false); |
454 | |
455 | - ctxt->emul_flags &= ~X86EMUL_SMM_INSIDE_NMI_MASK; |
456 | - ctxt->emul_flags &= ~X86EMUL_SMM_MASK; |
457 | + ctxt->ops->set_hflags(ctxt, ctxt->ops->get_hflags(ctxt) & |
458 | + ~(X86EMUL_SMM_INSIDE_NMI_MASK | X86EMUL_SMM_MASK)); |
459 | return X86EMUL_CONTINUE; |
460 | } |
461 | |
462 | @@ -5317,6 +5317,7 @@ int x86_emulate_insn(struct x86_emulate_ctxt *ctxt) |
463 | const struct x86_emulate_ops *ops = ctxt->ops; |
464 | int rc = X86EMUL_CONTINUE; |
465 | int saved_dst_type = ctxt->dst.type; |
466 | + unsigned emul_flags; |
467 | |
468 | ctxt->mem_read.pos = 0; |
469 | |
470 | @@ -5331,6 +5332,7 @@ int x86_emulate_insn(struct x86_emulate_ctxt *ctxt) |
471 | goto done; |
472 | } |
473 | |
474 | + emul_flags = ctxt->ops->get_hflags(ctxt); |
475 | if (unlikely(ctxt->d & |
476 | (No64|Undefined|Sse|Mmx|Intercept|CheckPerm|Priv|Prot|String))) { |
477 | if ((ctxt->mode == X86EMUL_MODE_PROT64 && (ctxt->d & No64)) || |
478 | @@ -5364,7 +5366,7 @@ int x86_emulate_insn(struct x86_emulate_ctxt *ctxt) |
479 | fetch_possible_mmx_operand(ctxt, &ctxt->dst); |
480 | } |
481 | |
482 | - if (unlikely(ctxt->emul_flags & X86EMUL_GUEST_MASK) && ctxt->intercept) { |
483 | + if (unlikely(emul_flags & X86EMUL_GUEST_MASK) && ctxt->intercept) { |
484 | rc = emulator_check_intercept(ctxt, ctxt->intercept, |
485 | X86_ICPT_PRE_EXCEPT); |
486 | if (rc != X86EMUL_CONTINUE) |
487 | @@ -5393,7 +5395,7 @@ int x86_emulate_insn(struct x86_emulate_ctxt *ctxt) |
488 | goto done; |
489 | } |
490 | |
491 | - if (unlikely(ctxt->emul_flags & X86EMUL_GUEST_MASK) && (ctxt->d & Intercept)) { |
492 | + if (unlikely(emul_flags & X86EMUL_GUEST_MASK) && (ctxt->d & Intercept)) { |
493 | rc = emulator_check_intercept(ctxt, ctxt->intercept, |
494 | X86_ICPT_POST_EXCEPT); |
495 | if (rc != X86EMUL_CONTINUE) |
496 | @@ -5447,7 +5449,7 @@ int x86_emulate_insn(struct x86_emulate_ctxt *ctxt) |
497 | |
498 | special_insn: |
499 | |
500 | - if (unlikely(ctxt->emul_flags & X86EMUL_GUEST_MASK) && (ctxt->d & Intercept)) { |
501 | + if (unlikely(emul_flags & X86EMUL_GUEST_MASK) && (ctxt->d & Intercept)) { |
502 | rc = emulator_check_intercept(ctxt, ctxt->intercept, |
503 | X86_ICPT_POST_MEMACCESS); |
504 | if (rc != X86EMUL_CONTINUE) |
505 | diff --git a/arch/x86/kvm/pmu_intel.c b/arch/x86/kvm/pmu_intel.c |
506 | index 9d4a8504a95a..5ab4a364348e 100644 |
507 | --- a/arch/x86/kvm/pmu_intel.c |
508 | +++ b/arch/x86/kvm/pmu_intel.c |
509 | @@ -294,7 +294,7 @@ static void intel_pmu_refresh(struct kvm_vcpu *vcpu) |
510 | ((u64)1 << edx.split.bit_width_fixed) - 1; |
511 | } |
512 | |
513 | - pmu->global_ctrl = ((1 << pmu->nr_arch_gp_counters) - 1) | |
514 | + pmu->global_ctrl = ((1ull << pmu->nr_arch_gp_counters) - 1) | |
515 | (((1ull << pmu->nr_arch_fixed_counters) - 1) << INTEL_PMC_IDX_FIXED); |
516 | pmu->global_ctrl_mask = ~pmu->global_ctrl; |
517 | |
518 | diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c |
519 | index 259e9b28ccf8..e06ec5333da1 100644 |
520 | --- a/arch/x86/kvm/vmx.c |
521 | +++ b/arch/x86/kvm/vmx.c |
522 | @@ -2436,7 +2436,7 @@ static int nested_vmx_check_exception(struct kvm_vcpu *vcpu, unsigned nr) |
523 | if (!(vmcs12->exception_bitmap & (1u << nr))) |
524 | return 0; |
525 | |
526 | - nested_vmx_vmexit(vcpu, to_vmx(vcpu)->exit_reason, |
527 | + nested_vmx_vmexit(vcpu, EXIT_REASON_EXCEPTION_NMI, |
528 | vmcs_read32(VM_EXIT_INTR_INFO), |
529 | vmcs_readl(EXIT_QUALIFICATION)); |
530 | return 1; |
531 | diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c |
532 | index dd1fe338c5f5..4e957185d5b3 100644 |
533 | --- a/arch/x86/kvm/x86.c |
534 | +++ b/arch/x86/kvm/x86.c |
535 | @@ -5098,6 +5098,8 @@ static bool emulator_get_segment(struct x86_emulate_ctxt *ctxt, u16 *selector, |
536 | |
537 | if (var.unusable) { |
538 | memset(desc, 0, sizeof(*desc)); |
539 | + if (base3) |
540 | + *base3 = 0; |
541 | return false; |
542 | } |
543 | |
544 | @@ -5248,6 +5250,16 @@ static void emulator_set_nmi_mask(struct x86_emulate_ctxt *ctxt, bool masked) |
545 | kvm_x86_ops->set_nmi_mask(emul_to_vcpu(ctxt), masked); |
546 | } |
547 | |
548 | +static unsigned emulator_get_hflags(struct x86_emulate_ctxt *ctxt) |
549 | +{ |
550 | + return emul_to_vcpu(ctxt)->arch.hflags; |
551 | +} |
552 | + |
553 | +static void emulator_set_hflags(struct x86_emulate_ctxt *ctxt, unsigned emul_flags) |
554 | +{ |
555 | + kvm_set_hflags(emul_to_vcpu(ctxt), emul_flags); |
556 | +} |
557 | + |
558 | static const struct x86_emulate_ops emulate_ops = { |
559 | .read_gpr = emulator_read_gpr, |
560 | .write_gpr = emulator_write_gpr, |
561 | @@ -5287,6 +5299,8 @@ static const struct x86_emulate_ops emulate_ops = { |
562 | .intercept = emulator_intercept, |
563 | .get_cpuid = emulator_get_cpuid, |
564 | .set_nmi_mask = emulator_set_nmi_mask, |
565 | + .get_hflags = emulator_get_hflags, |
566 | + .set_hflags = emulator_set_hflags, |
567 | }; |
568 | |
569 | static void toggle_interruptibility(struct kvm_vcpu *vcpu, u32 mask) |
570 | @@ -5341,7 +5355,6 @@ static void init_emulate_ctxt(struct kvm_vcpu *vcpu) |
571 | BUILD_BUG_ON(HF_GUEST_MASK != X86EMUL_GUEST_MASK); |
572 | BUILD_BUG_ON(HF_SMM_MASK != X86EMUL_SMM_MASK); |
573 | BUILD_BUG_ON(HF_SMM_INSIDE_NMI_MASK != X86EMUL_SMM_INSIDE_NMI_MASK); |
574 | - ctxt->emul_flags = vcpu->arch.hflags; |
575 | |
576 | init_decode_cache(ctxt); |
577 | vcpu->arch.emulate_regs_need_sync_from_vcpu = false; |
578 | @@ -5744,8 +5757,6 @@ int x86_emulate_instruction(struct kvm_vcpu *vcpu, |
579 | unsigned long rflags = kvm_x86_ops->get_rflags(vcpu); |
580 | toggle_interruptibility(vcpu, ctxt->interruptibility); |
581 | vcpu->arch.emulate_regs_need_sync_to_vcpu = false; |
582 | - if (vcpu->arch.hflags != ctxt->emul_flags) |
583 | - kvm_set_hflags(vcpu, ctxt->emul_flags); |
584 | kvm_rip_write(vcpu, ctxt->eip); |
585 | if (r == EMULATE_DONE && |
586 | (ctxt->tf || (vcpu->guest_debug & KVM_GUESTDBG_SINGLESTEP))) |
587 | diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c |
588 | index 15173d37f399..e1e3f7b4bdb0 100644 |
589 | --- a/arch/x86/mm/init_64.c |
590 | +++ b/arch/x86/mm/init_64.c |
591 | @@ -94,10 +94,10 @@ __setup("noexec32=", nonx32_setup); |
592 | */ |
593 | void sync_global_pgds(unsigned long start, unsigned long end) |
594 | { |
595 | - unsigned long address; |
596 | + unsigned long addr; |
597 | |
598 | - for (address = start; address <= end; address += PGDIR_SIZE) { |
599 | - const pgd_t *pgd_ref = pgd_offset_k(address); |
600 | + for (addr = start; addr <= end; addr = ALIGN(addr + 1, PGDIR_SIZE)) { |
601 | + const pgd_t *pgd_ref = pgd_offset_k(addr); |
602 | struct page *page; |
603 | |
604 | if (pgd_none(*pgd_ref)) |
605 | @@ -108,7 +108,7 @@ void sync_global_pgds(unsigned long start, unsigned long end) |
606 | pgd_t *pgd; |
607 | spinlock_t *pgt_lock; |
608 | |
609 | - pgd = (pgd_t *)page_address(page) + pgd_index(address); |
610 | + pgd = (pgd_t *)page_address(page) + pgd_index(addr); |
611 | /* the pgt_lock only for Xen */ |
612 | pgt_lock = &pgd_page_get_mm(page)->page_table_lock; |
613 | spin_lock(pgt_lock); |
614 | diff --git a/arch/x86/mm/mpx.c b/arch/x86/mm/mpx.c |
615 | index cd44ae727df7..1c34b767c84c 100644 |
616 | --- a/arch/x86/mm/mpx.c |
617 | +++ b/arch/x86/mm/mpx.c |
618 | @@ -526,15 +526,7 @@ int mpx_handle_bd_fault(void) |
619 | if (!kernel_managing_mpx_tables(current->mm)) |
620 | return -EINVAL; |
621 | |
622 | - if (do_mpx_bt_fault()) { |
623 | - force_sig(SIGSEGV, current); |
624 | - /* |
625 | - * The force_sig() is essentially "handling" this |
626 | - * exception, so we do not pass up the error |
627 | - * from do_mpx_bt_fault(). |
628 | - */ |
629 | - } |
630 | - return 0; |
631 | + return do_mpx_bt_fault(); |
632 | } |
633 | |
634 | /* |
635 | diff --git a/arch/x86/mm/tlb.c b/arch/x86/mm/tlb.c |
636 | index a7655f6caf7d..75fb01109f94 100644 |
637 | --- a/arch/x86/mm/tlb.c |
638 | +++ b/arch/x86/mm/tlb.c |
639 | @@ -263,8 +263,6 @@ void native_flush_tlb_others(const struct cpumask *cpumask, |
640 | { |
641 | struct flush_tlb_info info; |
642 | |
643 | - if (end == 0) |
644 | - end = start + PAGE_SIZE; |
645 | info.flush_mm = mm; |
646 | info.flush_start = start; |
647 | info.flush_end = end; |
648 | @@ -393,7 +391,7 @@ void flush_tlb_page(struct vm_area_struct *vma, unsigned long start) |
649 | } |
650 | |
651 | if (cpumask_any_but(mm_cpumask(mm), smp_processor_id()) < nr_cpu_ids) |
652 | - flush_tlb_others(mm_cpumask(mm), mm, start, 0UL); |
653 | + flush_tlb_others(mm_cpumask(mm), mm, start, start + PAGE_SIZE); |
654 | |
655 | preempt_enable(); |
656 | } |
657 | diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen-blkback/blkback.c |
658 | index fbe0dfdffc0d..0e824091a12f 100644 |
659 | --- a/drivers/block/xen-blkback/blkback.c |
660 | +++ b/drivers/block/xen-blkback/blkback.c |
661 | @@ -609,8 +609,6 @@ int xen_blkif_schedule(void *arg) |
662 | unsigned long timeout; |
663 | int ret; |
664 | |
665 | - xen_blkif_get(blkif); |
666 | - |
667 | set_freezable(); |
668 | while (!kthread_should_stop()) { |
669 | if (try_to_freeze()) |
670 | @@ -665,7 +663,6 @@ int xen_blkif_schedule(void *arg) |
671 | print_stats(ring); |
672 | |
673 | ring->xenblkd = NULL; |
674 | - xen_blkif_put(blkif); |
675 | |
676 | return 0; |
677 | } |
678 | diff --git a/drivers/block/xen-blkback/xenbus.c b/drivers/block/xen-blkback/xenbus.c |
679 | index dcabf52425ff..1ccb5a7bbdfe 100644 |
680 | --- a/drivers/block/xen-blkback/xenbus.c |
681 | +++ b/drivers/block/xen-blkback/xenbus.c |
682 | @@ -255,7 +255,6 @@ static int xen_blkif_disconnect(struct xen_blkif *blkif) |
683 | if (ring->xenblkd) { |
684 | kthread_stop(ring->xenblkd); |
685 | wake_up(&ring->shutdown_wq); |
686 | - ring->xenblkd = NULL; |
687 | } |
688 | |
689 | /* The above kthread_stop() guarantees that at this point we |
690 | @@ -316,8 +315,10 @@ static int xen_blkif_disconnect(struct xen_blkif *blkif) |
691 | static void xen_blkif_free(struct xen_blkif *blkif) |
692 | { |
693 | |
694 | - xen_blkif_disconnect(blkif); |
695 | + WARN_ON(xen_blkif_disconnect(blkif)); |
696 | xen_vbd_free(&blkif->vbd); |
697 | + kfree(blkif->be->mode); |
698 | + kfree(blkif->be); |
699 | |
700 | /* Make sure everything is drained before shutting down */ |
701 | kmem_cache_free(xen_blkif_cachep, blkif); |
702 | @@ -512,8 +513,6 @@ static int xen_blkbk_remove(struct xenbus_device *dev) |
703 | |
704 | /* Put the reference we set in xen_blkif_alloc(). */ |
705 | xen_blkif_put(be->blkif); |
706 | - kfree(be->mode); |
707 | - kfree(be); |
708 | return 0; |
709 | } |
710 | |
711 | diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c |
712 | index 8b4d721d6d63..b5a43d66878a 100644 |
713 | --- a/drivers/gpio/gpiolib.c |
714 | +++ b/drivers/gpio/gpiolib.c |
715 | @@ -708,7 +708,8 @@ static irqreturn_t lineevent_irq_thread(int irq, void *p) |
716 | |
717 | ge.timestamp = ktime_get_real_ns(); |
718 | |
719 | - if (le->eflags & GPIOEVENT_REQUEST_BOTH_EDGES) { |
720 | + if (le->eflags & GPIOEVENT_REQUEST_RISING_EDGE |
721 | + && le->eflags & GPIOEVENT_REQUEST_FALLING_EDGE) { |
722 | int level = gpiod_get_value_cansleep(le->desc); |
723 | |
724 | if (level) |
725 | diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf_res.c b/drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf_res.c |
726 | index 13db8a2851ed..1f013d45c9e9 100644 |
727 | --- a/drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf_res.c |
728 | +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf_res.c |
729 | @@ -321,6 +321,7 @@ void vmw_cmdbuf_res_man_destroy(struct vmw_cmdbuf_res_manager *man) |
730 | list_for_each_entry_safe(entry, next, &man->list, head) |
731 | vmw_cmdbuf_res_free(man, entry); |
732 | |
733 | + drm_ht_remove(&man->resources); |
734 | kfree(man); |
735 | } |
736 | |
737 | diff --git a/drivers/hsi/clients/ssi_protocol.c b/drivers/hsi/clients/ssi_protocol.c |
738 | index 7ef819680acd..8251fa2904b6 100644 |
739 | --- a/drivers/hsi/clients/ssi_protocol.c |
740 | +++ b/drivers/hsi/clients/ssi_protocol.c |
741 | @@ -1065,7 +1065,7 @@ static void ssip_pn_setup(struct net_device *dev) |
742 | dev->addr_len = 1; |
743 | dev->tx_queue_len = SSIP_TXQUEUE_LEN; |
744 | |
745 | - dev->destructor = free_netdev; |
746 | + dev->needs_free_netdev = true; |
747 | dev->header_ops = &phonet_header_ops; |
748 | } |
749 | |
750 | diff --git a/drivers/infiniband/hw/hns/hns_roce_hw_v1.c b/drivers/infiniband/hw/hns/hns_roce_hw_v1.c |
751 | index b8111b0c8877..d4b3ca3dd0e4 100644 |
752 | --- a/drivers/infiniband/hw/hns/hns_roce_hw_v1.c |
753 | +++ b/drivers/infiniband/hw/hns/hns_roce_hw_v1.c |
754 | @@ -1851,6 +1851,7 @@ void hns_roce_v1_cq_set_ci(struct hns_roce_cq *hr_cq, u32 cons_index) |
755 | u32 doorbell[2]; |
756 | |
757 | doorbell[0] = cons_index & ((hr_cq->cq_depth << 1) - 1); |
758 | + doorbell[1] = 0; |
759 | roce_set_bit(doorbell[1], ROCEE_DB_OTHERS_H_ROCEE_DB_OTH_HW_SYNS_S, 1); |
760 | roce_set_field(doorbell[1], ROCEE_DB_OTHERS_H_ROCEE_DB_OTH_CMD_M, |
761 | ROCEE_DB_OTHERS_H_ROCEE_DB_OTH_CMD_S, 3); |
762 | diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c |
763 | index b17536d6e69b..3f25d881b343 100644 |
764 | --- a/drivers/iommu/amd_iommu.c |
765 | +++ b/drivers/iommu/amd_iommu.c |
766 | @@ -3879,11 +3879,9 @@ static void irte_ga_prepare(void *entry, |
767 | u8 vector, u32 dest_apicid, int devid) |
768 | { |
769 | struct irte_ga *irte = (struct irte_ga *) entry; |
770 | - struct iommu_dev_data *dev_data = search_dev_data(devid); |
771 | |
772 | irte->lo.val = 0; |
773 | irte->hi.val = 0; |
774 | - irte->lo.fields_remap.guest_mode = dev_data ? dev_data->use_vapic : 0; |
775 | irte->lo.fields_remap.int_type = delivery_mode; |
776 | irte->lo.fields_remap.dm = dest_mode; |
777 | irte->hi.fields.vector = vector; |
778 | @@ -3939,10 +3937,10 @@ static void irte_ga_set_affinity(void *entry, u16 devid, u16 index, |
779 | struct irte_ga *irte = (struct irte_ga *) entry; |
780 | struct iommu_dev_data *dev_data = search_dev_data(devid); |
781 | |
782 | - if (!dev_data || !dev_data->use_vapic) { |
783 | + if (!dev_data || !dev_data->use_vapic || |
784 | + !irte->lo.fields_remap.guest_mode) { |
785 | irte->hi.fields.vector = vector; |
786 | irte->lo.fields_remap.destination = dest_apicid; |
787 | - irte->lo.fields_remap.guest_mode = 0; |
788 | modify_irte_ga(devid, index, irte, NULL); |
789 | } |
790 | } |
791 | diff --git a/drivers/iommu/amd_iommu_v2.c b/drivers/iommu/amd_iommu_v2.c |
792 | index 063343909b0d..6629c472eafd 100644 |
793 | --- a/drivers/iommu/amd_iommu_v2.c |
794 | +++ b/drivers/iommu/amd_iommu_v2.c |
795 | @@ -696,9 +696,9 @@ int amd_iommu_bind_pasid(struct pci_dev *pdev, int pasid, |
796 | |
797 | out_unregister: |
798 | mmu_notifier_unregister(&pasid_state->mn, mm); |
799 | + mmput(mm); |
800 | |
801 | out_free: |
802 | - mmput(mm); |
803 | free_pasid_state(pasid_state); |
804 | |
805 | out: |
806 | diff --git a/drivers/iommu/dma-iommu.c b/drivers/iommu/dma-iommu.c |
807 | index 48d36ce59efb..1e0983488a8d 100644 |
808 | --- a/drivers/iommu/dma-iommu.c |
809 | +++ b/drivers/iommu/dma-iommu.c |
810 | @@ -175,8 +175,7 @@ static void iova_reserve_pci_windows(struct pci_dev *dev, |
811 | unsigned long lo, hi; |
812 | |
813 | resource_list_for_each_entry(window, &bridge->windows) { |
814 | - if (resource_type(window->res) != IORESOURCE_MEM && |
815 | - resource_type(window->res) != IORESOURCE_IO) |
816 | + if (resource_type(window->res) != IORESOURCE_MEM) |
817 | continue; |
818 | |
819 | lo = iova_pfn(iovad, window->res->start - window->offset); |
820 | diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c |
821 | index 5742e5eb0704..f68e8c5ca386 100644 |
822 | --- a/drivers/md/dm-thin.c |
823 | +++ b/drivers/md/dm-thin.c |
824 | @@ -1094,6 +1094,19 @@ static void process_prepared_discard_passdown_pt1(struct dm_thin_new_mapping *m) |
825 | return; |
826 | } |
827 | |
828 | + /* |
829 | + * Increment the unmapped blocks. This prevents a race between the |
830 | + * passdown io and reallocation of freed blocks. |
831 | + */ |
832 | + r = dm_pool_inc_data_range(pool->pmd, m->data_block, data_end); |
833 | + if (r) { |
834 | + metadata_operation_failed(pool, "dm_pool_inc_data_range", r); |
835 | + bio_io_error(m->bio); |
836 | + cell_defer_no_holder(tc, m->cell); |
837 | + mempool_free(m, pool->mapping_pool); |
838 | + return; |
839 | + } |
840 | + |
841 | discard_parent = bio_alloc(GFP_NOIO, 1); |
842 | if (!discard_parent) { |
843 | DMWARN("%s: unable to allocate top level discard bio for passdown. Skipping passdown.", |
844 | @@ -1114,19 +1127,6 @@ static void process_prepared_discard_passdown_pt1(struct dm_thin_new_mapping *m) |
845 | end_discard(&op, r); |
846 | } |
847 | } |
848 | - |
849 | - /* |
850 | - * Increment the unmapped blocks. This prevents a race between the |
851 | - * passdown io and reallocation of freed blocks. |
852 | - */ |
853 | - r = dm_pool_inc_data_range(pool->pmd, m->data_block, data_end); |
854 | - if (r) { |
855 | - metadata_operation_failed(pool, "dm_pool_inc_data_range", r); |
856 | - bio_io_error(m->bio); |
857 | - cell_defer_no_holder(tc, m->cell); |
858 | - mempool_free(m, pool->mapping_pool); |
859 | - return; |
860 | - } |
861 | } |
862 | |
863 | static void process_prepared_discard_passdown_pt2(struct dm_thin_new_mapping *m) |
864 | diff --git a/drivers/mtd/nand/brcmnand/brcmnand.c b/drivers/mtd/nand/brcmnand/brcmnand.c |
865 | index 42ebd73f821d..7419c5ce63f8 100644 |
866 | --- a/drivers/mtd/nand/brcmnand/brcmnand.c |
867 | +++ b/drivers/mtd/nand/brcmnand/brcmnand.c |
868 | @@ -101,6 +101,9 @@ struct brcm_nand_dma_desc { |
869 | #define BRCMNAND_MIN_BLOCKSIZE (8 * 1024) |
870 | #define BRCMNAND_MIN_DEVSIZE (4ULL * 1024 * 1024) |
871 | |
872 | +#define NAND_CTRL_RDY (INTFC_CTLR_READY | INTFC_FLASH_READY) |
873 | +#define NAND_POLL_STATUS_TIMEOUT_MS 100 |
874 | + |
875 | /* Controller feature flags */ |
876 | enum { |
877 | BRCMNAND_HAS_1K_SECTORS = BIT(0), |
878 | @@ -765,6 +768,31 @@ enum { |
879 | CS_SELECT_AUTO_DEVICE_ID_CFG = BIT(30), |
880 | }; |
881 | |
882 | +static int bcmnand_ctrl_poll_status(struct brcmnand_controller *ctrl, |
883 | + u32 mask, u32 expected_val, |
884 | + unsigned long timeout_ms) |
885 | +{ |
886 | + unsigned long limit; |
887 | + u32 val; |
888 | + |
889 | + if (!timeout_ms) |
890 | + timeout_ms = NAND_POLL_STATUS_TIMEOUT_MS; |
891 | + |
892 | + limit = jiffies + msecs_to_jiffies(timeout_ms); |
893 | + do { |
894 | + val = brcmnand_read_reg(ctrl, BRCMNAND_INTFC_STATUS); |
895 | + if ((val & mask) == expected_val) |
896 | + return 0; |
897 | + |
898 | + cpu_relax(); |
899 | + } while (time_after(limit, jiffies)); |
900 | + |
901 | + dev_warn(ctrl->dev, "timeout on status poll (expected %x got %x)\n", |
902 | + expected_val, val & mask); |
903 | + |
904 | + return -ETIMEDOUT; |
905 | +} |
906 | + |
907 | static inline void brcmnand_set_wp(struct brcmnand_controller *ctrl, bool en) |
908 | { |
909 | u32 val = en ? CS_SELECT_NAND_WP : 0; |
910 | @@ -1024,12 +1052,39 @@ static void brcmnand_wp(struct mtd_info *mtd, int wp) |
911 | |
912 | if ((ctrl->features & BRCMNAND_HAS_WP) && wp_on == 1) { |
913 | static int old_wp = -1; |
914 | + int ret; |
915 | |
916 | if (old_wp != wp) { |
917 | dev_dbg(ctrl->dev, "WP %s\n", wp ? "on" : "off"); |
918 | old_wp = wp; |
919 | } |
920 | + |
921 | + /* |
922 | + * make sure ctrl/flash ready before and after |
923 | + * changing state of #WP pin |
924 | + */ |
925 | + ret = bcmnand_ctrl_poll_status(ctrl, NAND_CTRL_RDY | |
926 | + NAND_STATUS_READY, |
927 | + NAND_CTRL_RDY | |
928 | + NAND_STATUS_READY, 0); |
929 | + if (ret) |
930 | + return; |
931 | + |
932 | brcmnand_set_wp(ctrl, wp); |
933 | + chip->cmdfunc(mtd, NAND_CMD_STATUS, -1, -1); |
934 | + /* NAND_STATUS_WP 0x00 = protected, 0x80 = not protected */ |
935 | + ret = bcmnand_ctrl_poll_status(ctrl, |
936 | + NAND_CTRL_RDY | |
937 | + NAND_STATUS_READY | |
938 | + NAND_STATUS_WP, |
939 | + NAND_CTRL_RDY | |
940 | + NAND_STATUS_READY | |
941 | + (wp ? 0 : NAND_STATUS_WP), 0); |
942 | + |
943 | + if (ret) |
944 | + dev_err_ratelimited(&host->pdev->dev, |
945 | + "nand #WP expected %s\n", |
946 | + wp ? "on" : "off"); |
947 | } |
948 | } |
949 | |
950 | @@ -1157,15 +1212,15 @@ static irqreturn_t brcmnand_dma_irq(int irq, void *data) |
951 | static void brcmnand_send_cmd(struct brcmnand_host *host, int cmd) |
952 | { |
953 | struct brcmnand_controller *ctrl = host->ctrl; |
954 | - u32 intfc; |
955 | + int ret; |
956 | |
957 | dev_dbg(ctrl->dev, "send native cmd %d addr_lo 0x%x\n", cmd, |
958 | brcmnand_read_reg(ctrl, BRCMNAND_CMD_ADDRESS)); |
959 | BUG_ON(ctrl->cmd_pending != 0); |
960 | ctrl->cmd_pending = cmd; |
961 | |
962 | - intfc = brcmnand_read_reg(ctrl, BRCMNAND_INTFC_STATUS); |
963 | - WARN_ON(!(intfc & INTFC_CTLR_READY)); |
964 | + ret = bcmnand_ctrl_poll_status(ctrl, NAND_CTRL_RDY, NAND_CTRL_RDY, 0); |
965 | + WARN_ON(ret); |
966 | |
967 | mb(); /* flush previous writes */ |
968 | brcmnand_write_reg(ctrl, BRCMNAND_CMD_START, |
969 | diff --git a/drivers/mtd/nand/fsmc_nand.c b/drivers/mtd/nand/fsmc_nand.c |
970 | index bda1e4667138..66aece9cc2cc 100644 |
971 | --- a/drivers/mtd/nand/fsmc_nand.c |
972 | +++ b/drivers/mtd/nand/fsmc_nand.c |
973 | @@ -150,7 +150,6 @@ struct fsmc_nand_platform_data { |
974 | struct mtd_partition *partitions; |
975 | unsigned int nr_partitions; |
976 | unsigned int options; |
977 | - unsigned int width; |
978 | unsigned int bank; |
979 | |
980 | enum access_mode mode; |
981 | @@ -844,18 +843,19 @@ static int fsmc_nand_probe_config_dt(struct platform_device *pdev, |
982 | u32 val; |
983 | int ret; |
984 | |
985 | - /* Set default NAND width to 8 bits */ |
986 | - pdata->width = 8; |
987 | + pdata->options = 0; |
988 | + |
989 | if (!of_property_read_u32(np, "bank-width", &val)) { |
990 | if (val == 2) { |
991 | - pdata->width = 16; |
992 | + pdata->options |= NAND_BUSWIDTH_16; |
993 | } else if (val != 1) { |
994 | dev_err(&pdev->dev, "invalid bank-width %u\n", val); |
995 | return -EINVAL; |
996 | } |
997 | } |
998 | + |
999 | if (of_get_property(np, "nand-skip-bbtscan", NULL)) |
1000 | - pdata->options = NAND_SKIP_BBTSCAN; |
1001 | + pdata->options |= NAND_SKIP_BBTSCAN; |
1002 | |
1003 | pdata->nand_timings = devm_kzalloc(&pdev->dev, |
1004 | sizeof(*pdata->nand_timings), GFP_KERNEL); |
1005 | @@ -992,9 +992,6 @@ static int __init fsmc_nand_probe(struct platform_device *pdev) |
1006 | nand->badblockbits = 7; |
1007 | nand_set_flash_node(nand, np); |
1008 | |
1009 | - if (pdata->width == FSMC_NAND_BW16) |
1010 | - nand->options |= NAND_BUSWIDTH_16; |
1011 | - |
1012 | switch (host->mode) { |
1013 | case USE_DMA_ACCESS: |
1014 | dma_cap_zero(mask); |
1015 | diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c |
1016 | index 34481c9be1d1..6d80067e087f 100644 |
1017 | --- a/drivers/net/bonding/bond_main.c |
1018 | +++ b/drivers/net/bonding/bond_main.c |
1019 | @@ -4163,7 +4163,6 @@ static void bond_destructor(struct net_device *bond_dev) |
1020 | struct bonding *bond = netdev_priv(bond_dev); |
1021 | if (bond->wq) |
1022 | destroy_workqueue(bond->wq); |
1023 | - free_netdev(bond_dev); |
1024 | } |
1025 | |
1026 | void bond_setup(struct net_device *bond_dev) |
1027 | @@ -4183,7 +4182,8 @@ void bond_setup(struct net_device *bond_dev) |
1028 | bond_dev->netdev_ops = &bond_netdev_ops; |
1029 | bond_dev->ethtool_ops = &bond_ethtool_ops; |
1030 | |
1031 | - bond_dev->destructor = bond_destructor; |
1032 | + bond_dev->needs_free_netdev = true; |
1033 | + bond_dev->priv_destructor = bond_destructor; |
1034 | |
1035 | SET_NETDEV_DEVTYPE(bond_dev, &bond_type); |
1036 | |
1037 | @@ -4689,7 +4689,7 @@ int bond_create(struct net *net, const char *name) |
1038 | |
1039 | rtnl_unlock(); |
1040 | if (res < 0) |
1041 | - bond_destructor(bond_dev); |
1042 | + free_netdev(bond_dev); |
1043 | return res; |
1044 | } |
1045 | |
1046 | diff --git a/drivers/net/caif/caif_hsi.c b/drivers/net/caif/caif_hsi.c |
1047 | index ddabce759456..71a7c3b44fdd 100644 |
1048 | --- a/drivers/net/caif/caif_hsi.c |
1049 | +++ b/drivers/net/caif/caif_hsi.c |
1050 | @@ -1121,7 +1121,7 @@ static void cfhsi_setup(struct net_device *dev) |
1051 | dev->flags = IFF_POINTOPOINT | IFF_NOARP; |
1052 | dev->mtu = CFHSI_MAX_CAIF_FRAME_SZ; |
1053 | dev->priv_flags |= IFF_NO_QUEUE; |
1054 | - dev->destructor = free_netdev; |
1055 | + dev->needs_free_netdev = true; |
1056 | dev->netdev_ops = &cfhsi_netdevops; |
1057 | for (i = 0; i < CFHSI_PRIO_LAST; ++i) |
1058 | skb_queue_head_init(&cfhsi->qhead[i]); |
1059 | diff --git a/drivers/net/caif/caif_serial.c b/drivers/net/caif/caif_serial.c |
1060 | index c2dea4916e5d..76e1d3545105 100644 |
1061 | --- a/drivers/net/caif/caif_serial.c |
1062 | +++ b/drivers/net/caif/caif_serial.c |
1063 | @@ -428,7 +428,7 @@ static void caifdev_setup(struct net_device *dev) |
1064 | dev->flags = IFF_POINTOPOINT | IFF_NOARP; |
1065 | dev->mtu = CAIF_MAX_MTU; |
1066 | dev->priv_flags |= IFF_NO_QUEUE; |
1067 | - dev->destructor = free_netdev; |
1068 | + dev->needs_free_netdev = true; |
1069 | skb_queue_head_init(&serdev->head); |
1070 | serdev->common.link_select = CAIF_LINK_LOW_LATENCY; |
1071 | serdev->common.use_frag = true; |
1072 | diff --git a/drivers/net/caif/caif_spi.c b/drivers/net/caif/caif_spi.c |
1073 | index 3a529fbe539f..fc21afe852b9 100644 |
1074 | --- a/drivers/net/caif/caif_spi.c |
1075 | +++ b/drivers/net/caif/caif_spi.c |
1076 | @@ -712,7 +712,7 @@ static void cfspi_setup(struct net_device *dev) |
1077 | dev->flags = IFF_NOARP | IFF_POINTOPOINT; |
1078 | dev->priv_flags |= IFF_NO_QUEUE; |
1079 | dev->mtu = SPI_MAX_PAYLOAD_SIZE; |
1080 | - dev->destructor = free_netdev; |
1081 | + dev->needs_free_netdev = true; |
1082 | skb_queue_head_init(&cfspi->qhead); |
1083 | skb_queue_head_init(&cfspi->chead); |
1084 | cfspi->cfdev.link_select = CAIF_LINK_HIGH_BANDW; |
1085 | diff --git a/drivers/net/caif/caif_virtio.c b/drivers/net/caif/caif_virtio.c |
1086 | index bc0eb47eccee..8bffd251165c 100644 |
1087 | --- a/drivers/net/caif/caif_virtio.c |
1088 | +++ b/drivers/net/caif/caif_virtio.c |
1089 | @@ -617,7 +617,7 @@ static void cfv_netdev_setup(struct net_device *netdev) |
1090 | netdev->tx_queue_len = 100; |
1091 | netdev->flags = IFF_POINTOPOINT | IFF_NOARP; |
1092 | netdev->mtu = CFV_DEF_MTU_SIZE; |
1093 | - netdev->destructor = free_netdev; |
1094 | + netdev->needs_free_netdev = true; |
1095 | } |
1096 | |
1097 | /* Create debugfs counters for the device */ |
1098 | diff --git a/drivers/net/can/slcan.c b/drivers/net/can/slcan.c |
1099 | index eb7173713bbc..6a6e896e52fa 100644 |
1100 | --- a/drivers/net/can/slcan.c |
1101 | +++ b/drivers/net/can/slcan.c |
1102 | @@ -417,7 +417,7 @@ static int slc_open(struct net_device *dev) |
1103 | static void slc_free_netdev(struct net_device *dev) |
1104 | { |
1105 | int i = dev->base_addr; |
1106 | - free_netdev(dev); |
1107 | + |
1108 | slcan_devs[i] = NULL; |
1109 | } |
1110 | |
1111 | @@ -436,7 +436,8 @@ static const struct net_device_ops slc_netdev_ops = { |
1112 | static void slc_setup(struct net_device *dev) |
1113 | { |
1114 | dev->netdev_ops = &slc_netdev_ops; |
1115 | - dev->destructor = slc_free_netdev; |
1116 | + dev->needs_free_netdev = true; |
1117 | + dev->priv_destructor = slc_free_netdev; |
1118 | |
1119 | dev->hard_header_len = 0; |
1120 | dev->addr_len = 0; |
1121 | @@ -761,8 +762,6 @@ static void __exit slcan_exit(void) |
1122 | if (sl->tty) { |
1123 | printk(KERN_ERR "%s: tty discipline still running\n", |
1124 | dev->name); |
1125 | - /* Intentionally leak the control block. */ |
1126 | - dev->destructor = NULL; |
1127 | } |
1128 | |
1129 | unregister_netdev(dev); |
1130 | diff --git a/drivers/net/can/vcan.c b/drivers/net/can/vcan.c |
1131 | index 674f367087c5..25d12099593e 100644 |
1132 | --- a/drivers/net/can/vcan.c |
1133 | +++ b/drivers/net/can/vcan.c |
1134 | @@ -160,7 +160,7 @@ static void vcan_setup(struct net_device *dev) |
1135 | dev->flags |= IFF_ECHO; |
1136 | |
1137 | dev->netdev_ops = &vcan_netdev_ops; |
1138 | - dev->destructor = free_netdev; |
1139 | + dev->needs_free_netdev = true; |
1140 | } |
1141 | |
1142 | static struct rtnl_link_ops vcan_link_ops __read_mostly = { |
1143 | diff --git a/drivers/net/dummy.c b/drivers/net/dummy.c |
1144 | index 2c80611b94ae..b66fbe51ceb1 100644 |
1145 | --- a/drivers/net/dummy.c |
1146 | +++ b/drivers/net/dummy.c |
1147 | @@ -313,7 +313,6 @@ static void dummy_free_netdev(struct net_device *dev) |
1148 | struct dummy_priv *priv = netdev_priv(dev); |
1149 | |
1150 | kfree(priv->vfinfo); |
1151 | - free_netdev(dev); |
1152 | } |
1153 | |
1154 | static void dummy_setup(struct net_device *dev) |
1155 | @@ -323,7 +322,8 @@ static void dummy_setup(struct net_device *dev) |
1156 | /* Initialize the device structure. */ |
1157 | dev->netdev_ops = &dummy_netdev_ops; |
1158 | dev->ethtool_ops = &dummy_ethtool_ops; |
1159 | - dev->destructor = dummy_free_netdev; |
1160 | + dev->needs_free_netdev = true; |
1161 | + dev->priv_destructor = dummy_free_netdev; |
1162 | |
1163 | /* Fill in device structure with ethernet-generic values. */ |
1164 | dev->flags |= IFF_NOARP; |
1165 | diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c |
1166 | index 1238c4ec5215..fb0951929be9 100644 |
1167 | --- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c |
1168 | +++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c |
1169 | @@ -4530,7 +4530,7 @@ static void dummy_setup(struct net_device *dev) |
1170 | /* Initialize the device structure. */ |
1171 | dev->netdev_ops = &cxgb4_mgmt_netdev_ops; |
1172 | dev->ethtool_ops = &cxgb4_mgmt_ethtool_ops; |
1173 | - dev->destructor = free_netdev; |
1174 | + dev->needs_free_netdev = true; |
1175 | } |
1176 | |
1177 | static int config_mgmt_dev(struct pci_dev *pdev) |
1178 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en.h b/drivers/net/ethernet/mellanox/mlx5/core/en.h |
1179 | index 3d9490cd2db1..8f7108c94802 100644 |
1180 | --- a/drivers/net/ethernet/mellanox/mlx5/core/en.h |
1181 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/en.h |
1182 | @@ -313,13 +313,15 @@ struct mlx5e_dma_info { |
1183 | |
1184 | struct mlx5e_rx_am_stats { |
1185 | int ppms; /* packets per msec */ |
1186 | + int bpms; /* bytes per msec */ |
1187 | int epms; /* events per msec */ |
1188 | }; |
1189 | |
1190 | struct mlx5e_rx_am_sample { |
1191 | - ktime_t time; |
1192 | - unsigned int pkt_ctr; |
1193 | - u16 event_ctr; |
1194 | + ktime_t time; |
1195 | + u32 pkt_ctr; |
1196 | + u32 byte_ctr; |
1197 | + u16 event_ctr; |
1198 | }; |
1199 | |
1200 | struct mlx5e_rx_am { /* Adaptive Moderation */ |
1201 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c b/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c |
1202 | index 949fbadd7817..aae8b6c0edbd 100644 |
1203 | --- a/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c |
1204 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c |
1205 | @@ -1205,11 +1205,11 @@ static int mlx5e_get_ts_info(struct net_device *dev, |
1206 | SOF_TIMESTAMPING_RX_HARDWARE | |
1207 | SOF_TIMESTAMPING_RAW_HARDWARE; |
1208 | |
1209 | - info->tx_types = (BIT(1) << HWTSTAMP_TX_OFF) | |
1210 | - (BIT(1) << HWTSTAMP_TX_ON); |
1211 | + info->tx_types = BIT(HWTSTAMP_TX_OFF) | |
1212 | + BIT(HWTSTAMP_TX_ON); |
1213 | |
1214 | - info->rx_filters = (BIT(1) << HWTSTAMP_FILTER_NONE) | |
1215 | - (BIT(1) << HWTSTAMP_FILTER_ALL); |
1216 | + info->rx_filters = BIT(HWTSTAMP_FILTER_NONE) | |
1217 | + BIT(HWTSTAMP_FILTER_ALL); |
1218 | |
1219 | return 0; |
1220 | } |
1221 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c |
1222 | index 15cc7b469d2e..f778436a2d28 100644 |
1223 | --- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c |
1224 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c |
1225 | @@ -3885,7 +3885,8 @@ struct net_device *mlx5e_create_netdev(struct mlx5_core_dev *mdev, |
1226 | return netdev; |
1227 | |
1228 | err_cleanup_nic: |
1229 | - profile->cleanup(priv); |
1230 | + if (profile->cleanup) |
1231 | + profile->cleanup(priv); |
1232 | free_netdev(netdev); |
1233 | |
1234 | return NULL; |
1235 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c b/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c |
1236 | index f621373bd7a5..4be6b346f14a 100644 |
1237 | --- a/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c |
1238 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c |
1239 | @@ -424,6 +424,8 @@ static void mlx5e_build_rep_netdev_priv(struct mlx5_core_dev *mdev, |
1240 | priv->params.lro_wqe_sz = |
1241 | MLX5E_PARAMS_DEFAULT_LRO_WQE_SZ; |
1242 | |
1243 | + mlx5_query_min_inline(mdev, &priv->params.tx_min_inline_mode); |
1244 | + |
1245 | priv->mdev = mdev; |
1246 | priv->netdev = netdev; |
1247 | priv->params.num_channels = profile->max_nch(mdev); |
1248 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_rx_am.c b/drivers/net/ethernet/mellanox/mlx5/core/en_rx_am.c |
1249 | index cbfac06b7ffd..23ccec4cb7f5 100644 |
1250 | --- a/drivers/net/ethernet/mellanox/mlx5/core/en_rx_am.c |
1251 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_rx_am.c |
1252 | @@ -183,28 +183,27 @@ static void mlx5e_am_exit_parking(struct mlx5e_rx_am *am) |
1253 | mlx5e_am_step(am); |
1254 | } |
1255 | |
1256 | +#define IS_SIGNIFICANT_DIFF(val, ref) \ |
1257 | + (((100 * abs((val) - (ref))) / (ref)) > 10) /* more than 10% difference */ |
1258 | + |
1259 | static int mlx5e_am_stats_compare(struct mlx5e_rx_am_stats *curr, |
1260 | struct mlx5e_rx_am_stats *prev) |
1261 | { |
1262 | - int diff; |
1263 | - |
1264 | - if (!prev->ppms) |
1265 | - return curr->ppms ? MLX5E_AM_STATS_BETTER : |
1266 | + if (!prev->bpms) |
1267 | + return curr->bpms ? MLX5E_AM_STATS_BETTER : |
1268 | MLX5E_AM_STATS_SAME; |
1269 | |
1270 | - diff = curr->ppms - prev->ppms; |
1271 | - if (((100 * abs(diff)) / prev->ppms) > 10) /* more than 10% diff */ |
1272 | - return (diff > 0) ? MLX5E_AM_STATS_BETTER : |
1273 | - MLX5E_AM_STATS_WORSE; |
1274 | + if (IS_SIGNIFICANT_DIFF(curr->bpms, prev->bpms)) |
1275 | + return (curr->bpms > prev->bpms) ? MLX5E_AM_STATS_BETTER : |
1276 | + MLX5E_AM_STATS_WORSE; |
1277 | |
1278 | - if (!prev->epms) |
1279 | - return curr->epms ? MLX5E_AM_STATS_WORSE : |
1280 | - MLX5E_AM_STATS_SAME; |
1281 | + if (IS_SIGNIFICANT_DIFF(curr->ppms, prev->ppms)) |
1282 | + return (curr->ppms > prev->ppms) ? MLX5E_AM_STATS_BETTER : |
1283 | + MLX5E_AM_STATS_WORSE; |
1284 | |
1285 | - diff = curr->epms - prev->epms; |
1286 | - if (((100 * abs(diff)) / prev->epms) > 10) /* more than 10% diff */ |
1287 | - return (diff < 0) ? MLX5E_AM_STATS_BETTER : |
1288 | - MLX5E_AM_STATS_WORSE; |
1289 | + if (IS_SIGNIFICANT_DIFF(curr->epms, prev->epms)) |
1290 | + return (curr->epms < prev->epms) ? MLX5E_AM_STATS_BETTER : |
1291 | + MLX5E_AM_STATS_WORSE; |
1292 | |
1293 | return MLX5E_AM_STATS_SAME; |
1294 | } |
1295 | @@ -266,10 +265,13 @@ static void mlx5e_am_sample(struct mlx5e_rq *rq, |
1296 | { |
1297 | s->time = ktime_get(); |
1298 | s->pkt_ctr = rq->stats.packets; |
1299 | + s->byte_ctr = rq->stats.bytes; |
1300 | s->event_ctr = rq->cq.event_ctr; |
1301 | } |
1302 | |
1303 | #define MLX5E_AM_NEVENTS 64 |
1304 | +#define BITS_PER_TYPE(type) (sizeof(type) * BITS_PER_BYTE) |
1305 | +#define BIT_GAP(bits, end, start) ((((end) - (start)) + BIT_ULL(bits)) & (BIT_ULL(bits) - 1)) |
1306 | |
1307 | static void mlx5e_am_calc_stats(struct mlx5e_rx_am_sample *start, |
1308 | struct mlx5e_rx_am_sample *end, |
1309 | @@ -277,13 +279,17 @@ static void mlx5e_am_calc_stats(struct mlx5e_rx_am_sample *start, |
1310 | { |
1311 | /* u32 holds up to 71 minutes, should be enough */ |
1312 | u32 delta_us = ktime_us_delta(end->time, start->time); |
1313 | - unsigned int npkts = end->pkt_ctr - start->pkt_ctr; |
1314 | + u32 npkts = BIT_GAP(BITS_PER_TYPE(u32), end->pkt_ctr, start->pkt_ctr); |
1315 | + u32 nbytes = BIT_GAP(BITS_PER_TYPE(u32), end->byte_ctr, |
1316 | + start->byte_ctr); |
1317 | |
1318 | if (!delta_us) |
1319 | return; |
1320 | |
1321 | - curr_stats->ppms = (npkts * USEC_PER_MSEC) / delta_us; |
1322 | - curr_stats->epms = (MLX5E_AM_NEVENTS * USEC_PER_MSEC) / delta_us; |
1323 | + curr_stats->ppms = DIV_ROUND_UP(npkts * USEC_PER_MSEC, delta_us); |
1324 | + curr_stats->bpms = DIV_ROUND_UP(nbytes * USEC_PER_MSEC, delta_us); |
1325 | + curr_stats->epms = DIV_ROUND_UP(MLX5E_AM_NEVENTS * USEC_PER_MSEC, |
1326 | + delta_us); |
1327 | } |
1328 | |
1329 | void mlx5e_rx_am_work(struct work_struct *work) |
1330 | @@ -308,7 +314,8 @@ void mlx5e_rx_am(struct mlx5e_rq *rq) |
1331 | |
1332 | switch (am->state) { |
1333 | case MLX5E_AM_MEASURE_IN_PROGRESS: |
1334 | - nevents = rq->cq.event_ctr - am->start_sample.event_ctr; |
1335 | + nevents = BIT_GAP(BITS_PER_TYPE(u16), rq->cq.event_ctr, |
1336 | + am->start_sample.event_ctr); |
1337 | if (nevents < MLX5E_AM_NEVENTS) |
1338 | break; |
1339 | mlx5e_am_sample(rq, &end_sample); |
1340 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_stats.h b/drivers/net/ethernet/mellanox/mlx5/core/en_stats.h |
1341 | index 53e4992d6511..f81c3aa60b46 100644 |
1342 | --- a/drivers/net/ethernet/mellanox/mlx5/core/en_stats.h |
1343 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_stats.h |
1344 | @@ -417,20 +417,13 @@ struct mlx5e_stats { |
1345 | }; |
1346 | |
1347 | static const struct counter_desc mlx5e_pme_status_desc[] = { |
1348 | - { "module_plug", 0 }, |
1349 | { "module_unplug", 8 }, |
1350 | }; |
1351 | |
1352 | static const struct counter_desc mlx5e_pme_error_desc[] = { |
1353 | - { "module_pwr_budget_exd", 0 }, /* power budget exceed */ |
1354 | - { "module_long_range", 8 }, /* long range for non MLNX cable */ |
1355 | - { "module_bus_stuck", 16 }, /* bus stuck (I2C or data shorted) */ |
1356 | - { "module_no_eeprom", 24 }, /* no eeprom/retry time out */ |
1357 | - { "module_enforce_part", 32 }, /* enforce part number list */ |
1358 | - { "module_unknown_id", 40 }, /* unknown identifier */ |
1359 | - { "module_high_temp", 48 }, /* high temperature */ |
1360 | + { "module_bus_stuck", 16 }, /* bus stuck (I2C or data shorted) */ |
1361 | + { "module_high_temp", 48 }, /* high temperature */ |
1362 | { "module_bad_shorted", 56 }, /* bad or shorted cable/module */ |
1363 | - { "module_unknown_status", 64 }, |
1364 | }; |
1365 | |
1366 | #endif /* __MLX5_EN_STATS_H__ */ |
1367 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/main.c b/drivers/net/ethernet/mellanox/mlx5/core/main.c |
1368 | index 0ad66324247f..9862a741b32a 100644 |
1369 | --- a/drivers/net/ethernet/mellanox/mlx5/core/main.c |
1370 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/main.c |
1371 | @@ -175,8 +175,9 @@ static struct mlx5_profile profile[] = { |
1372 | }, |
1373 | }; |
1374 | |
1375 | -#define FW_INIT_TIMEOUT_MILI 2000 |
1376 | -#define FW_INIT_WAIT_MS 2 |
1377 | +#define FW_INIT_TIMEOUT_MILI 2000 |
1378 | +#define FW_INIT_WAIT_MS 2 |
1379 | +#define FW_PRE_INIT_TIMEOUT_MILI 10000 |
1380 | |
1381 | static int wait_fw_init(struct mlx5_core_dev *dev, u32 max_wait_mili) |
1382 | { |
1383 | @@ -537,8 +538,10 @@ static int handle_hca_cap(struct mlx5_core_dev *dev) |
1384 | /* disable cmdif checksum */ |
1385 | MLX5_SET(cmd_hca_cap, set_hca_cap, cmdif_checksum, 0); |
1386 | |
1387 | - /* If the HCA supports 4K UARs use it */ |
1388 | - if (MLX5_CAP_GEN_MAX(dev, uar_4k)) |
1389 | + /* Enable 4K UAR only when HCA supports it and page size is bigger |
1390 | + * than 4K. |
1391 | + */ |
1392 | + if (MLX5_CAP_GEN_MAX(dev, uar_4k) && PAGE_SIZE > 4096) |
1393 | MLX5_SET(cmd_hca_cap, set_hca_cap, uar_4k, 1); |
1394 | |
1395 | MLX5_SET(cmd_hca_cap, set_hca_cap, log_uar_page_sz, PAGE_SHIFT - 12); |
1396 | @@ -1019,6 +1022,15 @@ static int mlx5_load_one(struct mlx5_core_dev *dev, struct mlx5_priv *priv, |
1397 | */ |
1398 | dev->state = MLX5_DEVICE_STATE_UP; |
1399 | |
1400 | + /* wait for firmware to accept initialization segments configurations |
1401 | + */ |
1402 | + err = wait_fw_init(dev, FW_PRE_INIT_TIMEOUT_MILI); |
1403 | + if (err) { |
1404 | + dev_err(&dev->pdev->dev, "Firmware over %d MS in pre-initializing state, aborting\n", |
1405 | + FW_PRE_INIT_TIMEOUT_MILI); |
1406 | + goto out; |
1407 | + } |
1408 | + |
1409 | err = mlx5_cmd_init(dev); |
1410 | if (err) { |
1411 | dev_err(&pdev->dev, "Failed initializing command interface, aborting\n"); |
1412 | diff --git a/drivers/net/geneve.c b/drivers/net/geneve.c |
1413 | index 6ebb0f559a42..199459bd6961 100644 |
1414 | --- a/drivers/net/geneve.c |
1415 | +++ b/drivers/net/geneve.c |
1416 | @@ -1007,7 +1007,7 @@ static void geneve_setup(struct net_device *dev) |
1417 | |
1418 | dev->netdev_ops = &geneve_netdev_ops; |
1419 | dev->ethtool_ops = &geneve_ethtool_ops; |
1420 | - dev->destructor = free_netdev; |
1421 | + dev->needs_free_netdev = true; |
1422 | |
1423 | SET_NETDEV_DEVTYPE(dev, &geneve_type); |
1424 | |
1425 | diff --git a/drivers/net/gtp.c b/drivers/net/gtp.c |
1426 | index 89698741682f..429387083dce 100644 |
1427 | --- a/drivers/net/gtp.c |
1428 | +++ b/drivers/net/gtp.c |
1429 | @@ -618,7 +618,7 @@ static const struct net_device_ops gtp_netdev_ops = { |
1430 | static void gtp_link_setup(struct net_device *dev) |
1431 | { |
1432 | dev->netdev_ops = >p_netdev_ops; |
1433 | - dev->destructor = free_netdev; |
1434 | + dev->needs_free_netdev = true; |
1435 | |
1436 | dev->hard_header_len = 0; |
1437 | dev->addr_len = 0; |
1438 | diff --git a/drivers/net/hamradio/6pack.c b/drivers/net/hamradio/6pack.c |
1439 | index 922bf440e9f1..021a8ec411ab 100644 |
1440 | --- a/drivers/net/hamradio/6pack.c |
1441 | +++ b/drivers/net/hamradio/6pack.c |
1442 | @@ -311,7 +311,7 @@ static void sp_setup(struct net_device *dev) |
1443 | { |
1444 | /* Finish setting up the DEVICE info. */ |
1445 | dev->netdev_ops = &sp_netdev_ops; |
1446 | - dev->destructor = free_netdev; |
1447 | + dev->needs_free_netdev = true; |
1448 | dev->mtu = SIXP_MTU; |
1449 | dev->hard_header_len = AX25_MAX_HEADER_LEN; |
1450 | dev->header_ops = &ax25_header_ops; |
1451 | diff --git a/drivers/net/hamradio/bpqether.c b/drivers/net/hamradio/bpqether.c |
1452 | index f62e7f325cf9..78a6414c5fd9 100644 |
1453 | --- a/drivers/net/hamradio/bpqether.c |
1454 | +++ b/drivers/net/hamradio/bpqether.c |
1455 | @@ -476,7 +476,7 @@ static const struct net_device_ops bpq_netdev_ops = { |
1456 | static void bpq_setup(struct net_device *dev) |
1457 | { |
1458 | dev->netdev_ops = &bpq_netdev_ops; |
1459 | - dev->destructor = free_netdev; |
1460 | + dev->needs_free_netdev = true; |
1461 | |
1462 | memcpy(dev->broadcast, &ax25_bcast, AX25_ADDR_LEN); |
1463 | memcpy(dev->dev_addr, &ax25_defaddr, AX25_ADDR_LEN); |
1464 | diff --git a/drivers/net/ifb.c b/drivers/net/ifb.c |
1465 | index 312fce7302d3..144ea5ae8ab4 100644 |
1466 | --- a/drivers/net/ifb.c |
1467 | +++ b/drivers/net/ifb.c |
1468 | @@ -207,7 +207,6 @@ static void ifb_dev_free(struct net_device *dev) |
1469 | __skb_queue_purge(&txp->tq); |
1470 | } |
1471 | kfree(dp->tx_private); |
1472 | - free_netdev(dev); |
1473 | } |
1474 | |
1475 | static void ifb_setup(struct net_device *dev) |
1476 | @@ -230,7 +229,8 @@ static void ifb_setup(struct net_device *dev) |
1477 | dev->priv_flags &= ~IFF_TX_SKB_SHARING; |
1478 | netif_keep_dst(dev); |
1479 | eth_hw_addr_random(dev); |
1480 | - dev->destructor = ifb_dev_free; |
1481 | + dev->needs_free_netdev = true; |
1482 | + dev->priv_destructor = ifb_dev_free; |
1483 | } |
1484 | |
1485 | static netdev_tx_t ifb_xmit(struct sk_buff *skb, struct net_device *dev) |
1486 | diff --git a/drivers/net/ipvlan/ipvlan_main.c b/drivers/net/ipvlan/ipvlan_main.c |
1487 | index aa8575ccbce3..48e6c4e4914e 100644 |
1488 | --- a/drivers/net/ipvlan/ipvlan_main.c |
1489 | +++ b/drivers/net/ipvlan/ipvlan_main.c |
1490 | @@ -621,7 +621,7 @@ void ipvlan_link_setup(struct net_device *dev) |
1491 | dev->priv_flags &= ~(IFF_XMIT_DST_RELEASE | IFF_TX_SKB_SHARING); |
1492 | dev->priv_flags |= IFF_UNICAST_FLT | IFF_NO_QUEUE; |
1493 | dev->netdev_ops = &ipvlan_netdev_ops; |
1494 | - dev->destructor = free_netdev; |
1495 | + dev->needs_free_netdev = true; |
1496 | dev->header_ops = &ipvlan_header_ops; |
1497 | dev->ethtool_ops = &ipvlan_ethtool_ops; |
1498 | } |
1499 | diff --git a/drivers/net/loopback.c b/drivers/net/loopback.c |
1500 | index b23b71981fd5..80e3ace493cd 100644 |
1501 | --- a/drivers/net/loopback.c |
1502 | +++ b/drivers/net/loopback.c |
1503 | @@ -145,7 +145,6 @@ static void loopback_dev_free(struct net_device *dev) |
1504 | { |
1505 | dev_net(dev)->loopback_dev = NULL; |
1506 | free_percpu(dev->lstats); |
1507 | - free_netdev(dev); |
1508 | } |
1509 | |
1510 | static const struct net_device_ops loopback_ops = { |
1511 | @@ -183,7 +182,8 @@ static void loopback_setup(struct net_device *dev) |
1512 | dev->ethtool_ops = &loopback_ethtool_ops; |
1513 | dev->header_ops = ð_header_ops; |
1514 | dev->netdev_ops = &loopback_ops; |
1515 | - dev->destructor = loopback_dev_free; |
1516 | + dev->needs_free_netdev = true; |
1517 | + dev->priv_destructor = loopback_dev_free; |
1518 | } |
1519 | |
1520 | /* Setup and register the loopback device. */ |
1521 | diff --git a/drivers/net/macsec.c b/drivers/net/macsec.c |
1522 | index 49ce4e9f4a0f..43f3e1b2d3ca 100644 |
1523 | --- a/drivers/net/macsec.c |
1524 | +++ b/drivers/net/macsec.c |
1525 | @@ -2994,7 +2994,6 @@ static void macsec_free_netdev(struct net_device *dev) |
1526 | free_percpu(macsec->secy.tx_sc.stats); |
1527 | |
1528 | dev_put(real_dev); |
1529 | - free_netdev(dev); |
1530 | } |
1531 | |
1532 | static void macsec_setup(struct net_device *dev) |
1533 | @@ -3004,7 +3003,8 @@ static void macsec_setup(struct net_device *dev) |
1534 | dev->max_mtu = ETH_MAX_MTU; |
1535 | dev->priv_flags |= IFF_NO_QUEUE; |
1536 | dev->netdev_ops = &macsec_netdev_ops; |
1537 | - dev->destructor = macsec_free_netdev; |
1538 | + dev->needs_free_netdev = true; |
1539 | + dev->priv_destructor = macsec_free_netdev; |
1540 | SET_NETDEV_DEVTYPE(dev, &macsec_type); |
1541 | |
1542 | eth_zero_addr(dev->broadcast); |
1543 | diff --git a/drivers/net/macvlan.c b/drivers/net/macvlan.c |
1544 | index b34eaaae03fd..b8cec52547d7 100644 |
1545 | --- a/drivers/net/macvlan.c |
1546 | +++ b/drivers/net/macvlan.c |
1547 | @@ -1089,7 +1089,7 @@ void macvlan_common_setup(struct net_device *dev) |
1548 | netif_keep_dst(dev); |
1549 | dev->priv_flags |= IFF_UNICAST_FLT; |
1550 | dev->netdev_ops = &macvlan_netdev_ops; |
1551 | - dev->destructor = free_netdev; |
1552 | + dev->needs_free_netdev = true; |
1553 | dev->header_ops = &macvlan_hard_header_ops; |
1554 | dev->ethtool_ops = &macvlan_ethtool_ops; |
1555 | } |
1556 | diff --git a/drivers/net/nlmon.c b/drivers/net/nlmon.c |
1557 | index b91603835d26..c4b3362da4a2 100644 |
1558 | --- a/drivers/net/nlmon.c |
1559 | +++ b/drivers/net/nlmon.c |
1560 | @@ -113,7 +113,7 @@ static void nlmon_setup(struct net_device *dev) |
1561 | |
1562 | dev->netdev_ops = &nlmon_ops; |
1563 | dev->ethtool_ops = &nlmon_ethtool_ops; |
1564 | - dev->destructor = free_netdev; |
1565 | + dev->needs_free_netdev = true; |
1566 | |
1567 | dev->features = NETIF_F_SG | NETIF_F_FRAGLIST | |
1568 | NETIF_F_HIGHDMA | NETIF_F_LLTX; |
1569 | diff --git a/drivers/net/slip/slip.c b/drivers/net/slip/slip.c |
1570 | index 1da31dc47f86..74b907206aa7 100644 |
1571 | --- a/drivers/net/slip/slip.c |
1572 | +++ b/drivers/net/slip/slip.c |
1573 | @@ -629,7 +629,7 @@ static void sl_uninit(struct net_device *dev) |
1574 | static void sl_free_netdev(struct net_device *dev) |
1575 | { |
1576 | int i = dev->base_addr; |
1577 | - free_netdev(dev); |
1578 | + |
1579 | slip_devs[i] = NULL; |
1580 | } |
1581 | |
1582 | @@ -651,7 +651,8 @@ static const struct net_device_ops sl_netdev_ops = { |
1583 | static void sl_setup(struct net_device *dev) |
1584 | { |
1585 | dev->netdev_ops = &sl_netdev_ops; |
1586 | - dev->destructor = sl_free_netdev; |
1587 | + dev->needs_free_netdev = true; |
1588 | + dev->priv_destructor = sl_free_netdev; |
1589 | |
1590 | dev->hard_header_len = 0; |
1591 | dev->addr_len = 0; |
1592 | @@ -1369,8 +1370,6 @@ static void __exit slip_exit(void) |
1593 | if (sl->tty) { |
1594 | printk(KERN_ERR "%s: tty discipline still running\n", |
1595 | dev->name); |
1596 | - /* Intentionally leak the control block. */ |
1597 | - dev->destructor = NULL; |
1598 | } |
1599 | |
1600 | unregister_netdev(dev); |
1601 | diff --git a/drivers/net/team/team.c b/drivers/net/team/team.c |
1602 | index 85c01247f2e3..eaa6ee762230 100644 |
1603 | --- a/drivers/net/team/team.c |
1604 | +++ b/drivers/net/team/team.c |
1605 | @@ -1643,7 +1643,6 @@ static void team_destructor(struct net_device *dev) |
1606 | struct team *team = netdev_priv(dev); |
1607 | |
1608 | free_percpu(team->pcpu_stats); |
1609 | - free_netdev(dev); |
1610 | } |
1611 | |
1612 | static int team_open(struct net_device *dev) |
1613 | @@ -2079,7 +2078,8 @@ static void team_setup(struct net_device *dev) |
1614 | |
1615 | dev->netdev_ops = &team_netdev_ops; |
1616 | dev->ethtool_ops = &team_ethtool_ops; |
1617 | - dev->destructor = team_destructor; |
1618 | + dev->needs_free_netdev = true; |
1619 | + dev->priv_destructor = team_destructor; |
1620 | dev->priv_flags &= ~(IFF_XMIT_DST_RELEASE | IFF_TX_SKB_SHARING); |
1621 | dev->priv_flags |= IFF_NO_QUEUE; |
1622 | dev->priv_flags |= IFF_TEAM; |
1623 | diff --git a/drivers/net/tun.c b/drivers/net/tun.c |
1624 | index cc88cd7856f5..7f3db4963fdd 100644 |
1625 | --- a/drivers/net/tun.c |
1626 | +++ b/drivers/net/tun.c |
1627 | @@ -1560,7 +1560,6 @@ static void tun_free_netdev(struct net_device *dev) |
1628 | free_percpu(tun->pcpu_stats); |
1629 | tun_flow_uninit(tun); |
1630 | security_tun_dev_free_security(tun->security); |
1631 | - free_netdev(dev); |
1632 | } |
1633 | |
1634 | static void tun_setup(struct net_device *dev) |
1635 | @@ -1571,7 +1570,8 @@ static void tun_setup(struct net_device *dev) |
1636 | tun->group = INVALID_GID; |
1637 | |
1638 | dev->ethtool_ops = &tun_ethtool_ops; |
1639 | - dev->destructor = tun_free_netdev; |
1640 | + dev->needs_free_netdev = true; |
1641 | + dev->priv_destructor = tun_free_netdev; |
1642 | /* We prefer our own queue length */ |
1643 | dev->tx_queue_len = TUN_READQ_SIZE; |
1644 | } |
1645 | diff --git a/drivers/net/usb/cdc-phonet.c b/drivers/net/usb/cdc-phonet.c |
1646 | index eb52de8205f0..c7a350bbaaa7 100644 |
1647 | --- a/drivers/net/usb/cdc-phonet.c |
1648 | +++ b/drivers/net/usb/cdc-phonet.c |
1649 | @@ -298,7 +298,7 @@ static void usbpn_setup(struct net_device *dev) |
1650 | dev->addr_len = 1; |
1651 | dev->tx_queue_len = 3; |
1652 | |
1653 | - dev->destructor = free_netdev; |
1654 | + dev->needs_free_netdev = true; |
1655 | } |
1656 | |
1657 | /* |
1658 | diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c |
1659 | index 87746c2bc3d3..d4c8c96bc770 100644 |
1660 | --- a/drivers/net/usb/qmi_wwan.c |
1661 | +++ b/drivers/net/usb/qmi_wwan.c |
1662 | @@ -898,6 +898,8 @@ static const struct usb_device_id products[] = { |
1663 | {QMI_FIXED_INTF(0x1199, 0x9056, 8)}, /* Sierra Wireless Modem */ |
1664 | {QMI_FIXED_INTF(0x1199, 0x9057, 8)}, |
1665 | {QMI_FIXED_INTF(0x1199, 0x9061, 8)}, /* Sierra Wireless Modem */ |
1666 | + {QMI_FIXED_INTF(0x1199, 0x9063, 8)}, /* Sierra Wireless EM7305 */ |
1667 | + {QMI_FIXED_INTF(0x1199, 0x9063, 10)}, /* Sierra Wireless EM7305 */ |
1668 | {QMI_FIXED_INTF(0x1199, 0x9071, 8)}, /* Sierra Wireless MC74xx */ |
1669 | {QMI_FIXED_INTF(0x1199, 0x9071, 10)}, /* Sierra Wireless MC74xx */ |
1670 | {QMI_FIXED_INTF(0x1199, 0x9079, 8)}, /* Sierra Wireless EM74xx */ |
1671 | @@ -912,6 +914,8 @@ static const struct usb_device_id products[] = { |
1672 | {QMI_FIXED_INTF(0x1bc7, 0x1100, 3)}, /* Telit ME910 */ |
1673 | {QMI_FIXED_INTF(0x1bc7, 0x1200, 5)}, /* Telit LE920 */ |
1674 | {QMI_QUIRK_SET_DTR(0x1bc7, 0x1201, 2)}, /* Telit LE920, LE920A4 */ |
1675 | + {QMI_FIXED_INTF(0x1c9e, 0x9801, 3)}, /* Telewell TW-3G HSPA+ */ |
1676 | + {QMI_FIXED_INTF(0x1c9e, 0x9803, 4)}, /* Telewell TW-3G HSPA+ */ |
1677 | {QMI_FIXED_INTF(0x1c9e, 0x9b01, 3)}, /* XS Stick W100-2 from 4G Systems */ |
1678 | {QMI_FIXED_INTF(0x0b3c, 0xc000, 4)}, /* Olivetti Olicard 100 */ |
1679 | {QMI_FIXED_INTF(0x0b3c, 0xc001, 4)}, /* Olivetti Olicard 120 */ |
1680 | diff --git a/drivers/net/veth.c b/drivers/net/veth.c |
1681 | index 8c39d6d690e5..2efbe98d0c67 100644 |
1682 | --- a/drivers/net/veth.c |
1683 | +++ b/drivers/net/veth.c |
1684 | @@ -227,7 +227,6 @@ static int veth_dev_init(struct net_device *dev) |
1685 | static void veth_dev_free(struct net_device *dev) |
1686 | { |
1687 | free_percpu(dev->vstats); |
1688 | - free_netdev(dev); |
1689 | } |
1690 | |
1691 | #ifdef CONFIG_NET_POLL_CONTROLLER |
1692 | @@ -322,7 +321,8 @@ static void veth_setup(struct net_device *dev) |
1693 | NETIF_F_HW_VLAN_STAG_TX | |
1694 | NETIF_F_HW_VLAN_CTAG_RX | |
1695 | NETIF_F_HW_VLAN_STAG_RX); |
1696 | - dev->destructor = veth_dev_free; |
1697 | + dev->needs_free_netdev = true; |
1698 | + dev->priv_destructor = veth_dev_free; |
1699 | dev->max_mtu = ETH_MAX_MTU; |
1700 | |
1701 | dev->hw_features = VETH_FEATURES; |
1702 | diff --git a/drivers/net/vrf.c b/drivers/net/vrf.c |
1703 | index df74efcf237b..2e62c4d1b220 100644 |
1704 | --- a/drivers/net/vrf.c |
1705 | +++ b/drivers/net/vrf.c |
1706 | @@ -36,12 +36,14 @@ |
1707 | #include <net/addrconf.h> |
1708 | #include <net/l3mdev.h> |
1709 | #include <net/fib_rules.h> |
1710 | +#include <net/netns/generic.h> |
1711 | |
1712 | #define DRV_NAME "vrf" |
1713 | #define DRV_VERSION "1.0" |
1714 | |
1715 | #define FIB_RULE_PREF 1000 /* default preference for FIB rules */ |
1716 | -static bool add_fib_rules = true; |
1717 | + |
1718 | +static unsigned int vrf_net_id; |
1719 | |
1720 | struct net_vrf { |
1721 | struct rtable __rcu *rth; |
1722 | @@ -1206,7 +1208,7 @@ static void vrf_setup(struct net_device *dev) |
1723 | dev->netdev_ops = &vrf_netdev_ops; |
1724 | dev->l3mdev_ops = &vrf_l3mdev_ops; |
1725 | dev->ethtool_ops = &vrf_ethtool_ops; |
1726 | - dev->destructor = free_netdev; |
1727 | + dev->needs_free_netdev = true; |
1728 | |
1729 | /* Fill in device structure with ethernet-generic values. */ |
1730 | eth_hw_addr_random(dev); |
1731 | @@ -1252,6 +1254,8 @@ static int vrf_newlink(struct net *src_net, struct net_device *dev, |
1732 | struct nlattr *tb[], struct nlattr *data[]) |
1733 | { |
1734 | struct net_vrf *vrf = netdev_priv(dev); |
1735 | + bool *add_fib_rules; |
1736 | + struct net *net; |
1737 | int err; |
1738 | |
1739 | if (!data || !data[IFLA_VRF_TABLE]) |
1740 | @@ -1267,13 +1271,15 @@ static int vrf_newlink(struct net *src_net, struct net_device *dev, |
1741 | if (err) |
1742 | goto out; |
1743 | |
1744 | - if (add_fib_rules) { |
1745 | + net = dev_net(dev); |
1746 | + add_fib_rules = net_generic(net, vrf_net_id); |
1747 | + if (*add_fib_rules) { |
1748 | err = vrf_add_fib_rules(dev); |
1749 | if (err) { |
1750 | unregister_netdevice(dev); |
1751 | goto out; |
1752 | } |
1753 | - add_fib_rules = false; |
1754 | + *add_fib_rules = false; |
1755 | } |
1756 | |
1757 | out: |
1758 | @@ -1356,16 +1362,38 @@ static struct notifier_block vrf_notifier_block __read_mostly = { |
1759 | .notifier_call = vrf_device_event, |
1760 | }; |
1761 | |
1762 | +/* Initialize per network namespace state */ |
1763 | +static int __net_init vrf_netns_init(struct net *net) |
1764 | +{ |
1765 | + bool *add_fib_rules = net_generic(net, vrf_net_id); |
1766 | + |
1767 | + *add_fib_rules = true; |
1768 | + |
1769 | + return 0; |
1770 | +} |
1771 | + |
1772 | +static struct pernet_operations vrf_net_ops __net_initdata = { |
1773 | + .init = vrf_netns_init, |
1774 | + .id = &vrf_net_id, |
1775 | + .size = sizeof(bool), |
1776 | +}; |
1777 | + |
1778 | static int __init vrf_init_module(void) |
1779 | { |
1780 | int rc; |
1781 | |
1782 | register_netdevice_notifier(&vrf_notifier_block); |
1783 | |
1784 | - rc = rtnl_link_register(&vrf_link_ops); |
1785 | + rc = register_pernet_subsys(&vrf_net_ops); |
1786 | if (rc < 0) |
1787 | goto error; |
1788 | |
1789 | + rc = rtnl_link_register(&vrf_link_ops); |
1790 | + if (rc < 0) { |
1791 | + unregister_pernet_subsys(&vrf_net_ops); |
1792 | + goto error; |
1793 | + } |
1794 | + |
1795 | return 0; |
1796 | |
1797 | error: |
1798 | diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c |
1799 | index 70dbd5a48b6b..4574b95c7938 100644 |
1800 | --- a/drivers/net/vxlan.c |
1801 | +++ b/drivers/net/vxlan.c |
1802 | @@ -2607,7 +2607,7 @@ static void vxlan_setup(struct net_device *dev) |
1803 | eth_hw_addr_random(dev); |
1804 | ether_setup(dev); |
1805 | |
1806 | - dev->destructor = free_netdev; |
1807 | + dev->needs_free_netdev = true; |
1808 | SET_NETDEV_DEVTYPE(dev, &vxlan_type); |
1809 | |
1810 | dev->features |= NETIF_F_LLTX; |
1811 | diff --git a/drivers/net/wan/dlci.c b/drivers/net/wan/dlci.c |
1812 | index 65ee2a6f248c..a0d76f70c428 100644 |
1813 | --- a/drivers/net/wan/dlci.c |
1814 | +++ b/drivers/net/wan/dlci.c |
1815 | @@ -475,7 +475,7 @@ static void dlci_setup(struct net_device *dev) |
1816 | dev->flags = 0; |
1817 | dev->header_ops = &dlci_header_ops; |
1818 | dev->netdev_ops = &dlci_netdev_ops; |
1819 | - dev->destructor = free_netdev; |
1820 | + dev->needs_free_netdev = true; |
1821 | |
1822 | dlp->receive = dlci_receive; |
1823 | |
1824 | diff --git a/drivers/net/wan/hdlc_fr.c b/drivers/net/wan/hdlc_fr.c |
1825 | index eb915281197e..78596e42a3f3 100644 |
1826 | --- a/drivers/net/wan/hdlc_fr.c |
1827 | +++ b/drivers/net/wan/hdlc_fr.c |
1828 | @@ -1106,7 +1106,7 @@ static int fr_add_pvc(struct net_device *frad, unsigned int dlci, int type) |
1829 | return -EIO; |
1830 | } |
1831 | |
1832 | - dev->destructor = free_netdev; |
1833 | + dev->needs_free_netdev = true; |
1834 | *get_dev_p(pvc, type) = dev; |
1835 | if (!used) { |
1836 | state(hdlc)->dce_changed = 1; |
1837 | diff --git a/drivers/net/wan/lapbether.c b/drivers/net/wan/lapbether.c |
1838 | index 9df9ed62beff..63f749078a1f 100644 |
1839 | --- a/drivers/net/wan/lapbether.c |
1840 | +++ b/drivers/net/wan/lapbether.c |
1841 | @@ -306,7 +306,7 @@ static const struct net_device_ops lapbeth_netdev_ops = { |
1842 | static void lapbeth_setup(struct net_device *dev) |
1843 | { |
1844 | dev->netdev_ops = &lapbeth_netdev_ops; |
1845 | - dev->destructor = free_netdev; |
1846 | + dev->needs_free_netdev = true; |
1847 | dev->type = ARPHRD_X25; |
1848 | dev->hard_header_len = 3; |
1849 | dev->mtu = 1000; |
1850 | diff --git a/drivers/net/wireless/ath/ath6kl/main.c b/drivers/net/wireless/ath/ath6kl/main.c |
1851 | index 91ee542de3d7..b90c77ef792e 100644 |
1852 | --- a/drivers/net/wireless/ath/ath6kl/main.c |
1853 | +++ b/drivers/net/wireless/ath/ath6kl/main.c |
1854 | @@ -1287,7 +1287,7 @@ void init_netdev(struct net_device *dev) |
1855 | struct ath6kl *ar = ath6kl_priv(dev); |
1856 | |
1857 | dev->netdev_ops = &ath6kl_netdev_ops; |
1858 | - dev->destructor = free_netdev; |
1859 | + dev->needs_free_netdev = true; |
1860 | dev->watchdog_timeo = ATH6KL_TX_TIMEOUT; |
1861 | |
1862 | dev->needed_headroom = ETH_HLEN; |
1863 | diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c |
1864 | index 944b83cfc519..017e20b34304 100644 |
1865 | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c |
1866 | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c |
1867 | @@ -5209,7 +5209,6 @@ void brcmf_cfg80211_free_netdev(struct net_device *ndev) |
1868 | |
1869 | if (vif) |
1870 | brcmf_free_vif(vif); |
1871 | - free_netdev(ndev); |
1872 | } |
1873 | |
1874 | static bool brcmf_is_linkup(const struct brcmf_event_msg *e) |
1875 | diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c |
1876 | index f6b17fb58877..d02e7f6ec4e0 100644 |
1877 | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c |
1878 | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c |
1879 | @@ -652,7 +652,8 @@ struct brcmf_if *brcmf_add_if(struct brcmf_pub *drvr, s32 bsscfgidx, s32 ifidx, |
1880 | if (!ndev) |
1881 | return ERR_PTR(-ENOMEM); |
1882 | |
1883 | - ndev->destructor = brcmf_cfg80211_free_netdev; |
1884 | + ndev->needs_free_netdev = true; |
1885 | + ndev->priv_destructor = brcmf_cfg80211_free_netdev; |
1886 | ifp = netdev_priv(ndev); |
1887 | ifp->ndev = ndev; |
1888 | /* store mapping ifidx to bsscfgidx */ |
1889 | diff --git a/drivers/net/wireless/intersil/hostap/hostap_main.c b/drivers/net/wireless/intersil/hostap/hostap_main.c |
1890 | index 544fc09dcb62..1372b20f931e 100644 |
1891 | --- a/drivers/net/wireless/intersil/hostap/hostap_main.c |
1892 | +++ b/drivers/net/wireless/intersil/hostap/hostap_main.c |
1893 | @@ -73,7 +73,7 @@ struct net_device * hostap_add_interface(struct local_info *local, |
1894 | dev->mem_end = mdev->mem_end; |
1895 | |
1896 | hostap_setup_dev(dev, local, type); |
1897 | - dev->destructor = free_netdev; |
1898 | + dev->needs_free_netdev = true; |
1899 | |
1900 | sprintf(dev->name, "%s%s", prefix, name); |
1901 | if (!rtnl_locked) |
1902 | diff --git a/drivers/net/wireless/mac80211_hwsim.c b/drivers/net/wireless/mac80211_hwsim.c |
1903 | index 50c219fb1a52..2aa5cc6e34ef 100644 |
1904 | --- a/drivers/net/wireless/mac80211_hwsim.c |
1905 | +++ b/drivers/net/wireless/mac80211_hwsim.c |
1906 | @@ -2807,7 +2807,7 @@ static const struct net_device_ops hwsim_netdev_ops = { |
1907 | static void hwsim_mon_setup(struct net_device *dev) |
1908 | { |
1909 | dev->netdev_ops = &hwsim_netdev_ops; |
1910 | - dev->destructor = free_netdev; |
1911 | + dev->needs_free_netdev = true; |
1912 | ether_setup(dev); |
1913 | dev->priv_flags |= IFF_NO_QUEUE; |
1914 | dev->type = ARPHRD_IEEE80211_RADIOTAP; |
1915 | diff --git a/drivers/net/wireless/marvell/mwifiex/main.c b/drivers/net/wireless/marvell/mwifiex/main.c |
1916 | index b62e03d11c2e..46073bb554dd 100644 |
1917 | --- a/drivers/net/wireless/marvell/mwifiex/main.c |
1918 | +++ b/drivers/net/wireless/marvell/mwifiex/main.c |
1919 | @@ -1277,7 +1277,7 @@ void mwifiex_init_priv_params(struct mwifiex_private *priv, |
1920 | struct net_device *dev) |
1921 | { |
1922 | dev->netdev_ops = &mwifiex_netdev_ops; |
1923 | - dev->destructor = free_netdev; |
1924 | + dev->needs_free_netdev = true; |
1925 | /* Initialize private structure */ |
1926 | priv->current_key_index = 0; |
1927 | priv->media_connected = false; |
1928 | diff --git a/drivers/pinctrl/pinctrl-amd.c b/drivers/pinctrl/pinctrl-amd.c |
1929 | index d69e357a7a98..d8e81045cffe 100644 |
1930 | --- a/drivers/pinctrl/pinctrl-amd.c |
1931 | +++ b/drivers/pinctrl/pinctrl-amd.c |
1932 | @@ -495,64 +495,54 @@ static struct irq_chip amd_gpio_irqchip = { |
1933 | .flags = IRQCHIP_SKIP_SET_WAKE, |
1934 | }; |
1935 | |
1936 | -static void amd_gpio_irq_handler(struct irq_desc *desc) |
1937 | +#define PIN_IRQ_PENDING (BIT(INTERRUPT_STS_OFF) | BIT(WAKE_STS_OFF)) |
1938 | + |
1939 | +static irqreturn_t amd_gpio_irq_handler(int irq, void *dev_id) |
1940 | { |
1941 | - u32 i; |
1942 | - u32 off; |
1943 | - u32 reg; |
1944 | - u32 pin_reg; |
1945 | - u64 reg64; |
1946 | - int handled = 0; |
1947 | - unsigned int irq; |
1948 | + struct amd_gpio *gpio_dev = dev_id; |
1949 | + struct gpio_chip *gc = &gpio_dev->gc; |
1950 | + irqreturn_t ret = IRQ_NONE; |
1951 | + unsigned int i, irqnr; |
1952 | unsigned long flags; |
1953 | - struct irq_chip *chip = irq_desc_get_chip(desc); |
1954 | - struct gpio_chip *gc = irq_desc_get_handler_data(desc); |
1955 | - struct amd_gpio *gpio_dev = gpiochip_get_data(gc); |
1956 | + u32 *regs, regval; |
1957 | + u64 status, mask; |
1958 | |
1959 | - chained_irq_enter(chip, desc); |
1960 | - /*enable GPIO interrupt again*/ |
1961 | + /* Read the wake status */ |
1962 | spin_lock_irqsave(&gpio_dev->lock, flags); |
1963 | - reg = readl(gpio_dev->base + WAKE_INT_STATUS_REG1); |
1964 | - reg64 = reg; |
1965 | - reg64 = reg64 << 32; |
1966 | - |
1967 | - reg = readl(gpio_dev->base + WAKE_INT_STATUS_REG0); |
1968 | - reg64 |= reg; |
1969 | + status = readl(gpio_dev->base + WAKE_INT_STATUS_REG1); |
1970 | + status <<= 32; |
1971 | + status |= readl(gpio_dev->base + WAKE_INT_STATUS_REG0); |
1972 | spin_unlock_irqrestore(&gpio_dev->lock, flags); |
1973 | |
1974 | - /* |
1975 | - * first 46 bits indicates interrupt status. |
1976 | - * one bit represents four interrupt sources. |
1977 | - */ |
1978 | - for (off = 0; off < 46 ; off++) { |
1979 | - if (reg64 & BIT(off)) { |
1980 | - for (i = 0; i < 4; i++) { |
1981 | - pin_reg = readl(gpio_dev->base + |
1982 | - (off * 4 + i) * 4); |
1983 | - if ((pin_reg & BIT(INTERRUPT_STS_OFF)) || |
1984 | - (pin_reg & BIT(WAKE_STS_OFF))) { |
1985 | - irq = irq_find_mapping(gc->irqdomain, |
1986 | - off * 4 + i); |
1987 | - generic_handle_irq(irq); |
1988 | - writel(pin_reg, |
1989 | - gpio_dev->base |
1990 | - + (off * 4 + i) * 4); |
1991 | - handled++; |
1992 | - } |
1993 | - } |
1994 | + /* Bit 0-45 contain the relevant status bits */ |
1995 | + status &= (1ULL << 46) - 1; |
1996 | + regs = gpio_dev->base; |
1997 | + for (mask = 1, irqnr = 0; status; mask <<= 1, regs += 4, irqnr += 4) { |
1998 | + if (!(status & mask)) |
1999 | + continue; |
2000 | + status &= ~mask; |
2001 | + |
2002 | + /* Each status bit covers four pins */ |
2003 | + for (i = 0; i < 4; i++) { |
2004 | + regval = readl(regs + i); |
2005 | + if (!(regval & PIN_IRQ_PENDING)) |
2006 | + continue; |
2007 | + irq = irq_find_mapping(gc->irqdomain, irqnr + i); |
2008 | + generic_handle_irq(irq); |
2009 | + /* Clear interrupt */ |
2010 | + writel(regval, regs + i); |
2011 | + ret = IRQ_HANDLED; |
2012 | } |
2013 | } |
2014 | |
2015 | - if (handled == 0) |
2016 | - handle_bad_irq(desc); |
2017 | - |
2018 | + /* Signal EOI to the GPIO unit */ |
2019 | spin_lock_irqsave(&gpio_dev->lock, flags); |
2020 | - reg = readl(gpio_dev->base + WAKE_INT_MASTER_REG); |
2021 | - reg |= EOI_MASK; |
2022 | - writel(reg, gpio_dev->base + WAKE_INT_MASTER_REG); |
2023 | + regval = readl(gpio_dev->base + WAKE_INT_MASTER_REG); |
2024 | + regval |= EOI_MASK; |
2025 | + writel(regval, gpio_dev->base + WAKE_INT_MASTER_REG); |
2026 | spin_unlock_irqrestore(&gpio_dev->lock, flags); |
2027 | |
2028 | - chained_irq_exit(chip, desc); |
2029 | + return ret; |
2030 | } |
2031 | |
2032 | static int amd_get_groups_count(struct pinctrl_dev *pctldev) |
2033 | @@ -821,10 +811,11 @@ static int amd_gpio_probe(struct platform_device *pdev) |
2034 | goto out2; |
2035 | } |
2036 | |
2037 | - gpiochip_set_chained_irqchip(&gpio_dev->gc, |
2038 | - &amd_gpio_irqchip, |
2039 | - irq_base, |
2040 | - amd_gpio_irq_handler); |
2041 | + ret = devm_request_irq(&pdev->dev, irq_base, amd_gpio_irq_handler, 0, |
2042 | + KBUILD_MODNAME, gpio_dev); |
2043 | + if (ret) |
2044 | + goto out2; |
2045 | + |
2046 | platform_set_drvdata(pdev, gpio_dev); |
2047 | |
2048 | dev_dbg(&pdev->dev, "amd gpio driver loaded\n"); |
2049 | diff --git a/drivers/s390/net/netiucv.c b/drivers/s390/net/netiucv.c |
2050 | index 3f85b97ab8d2..6d3494ba84cf 100644 |
2051 | --- a/drivers/s390/net/netiucv.c |
2052 | +++ b/drivers/s390/net/netiucv.c |
2053 | @@ -1954,7 +1954,6 @@ static void netiucv_free_netdevice(struct net_device *dev) |
2054 | privptr->conn = NULL; privptr->fsm = NULL; |
2055 | /* privptr gets freed by free_netdev() */ |
2056 | } |
2057 | - free_netdev(dev); |
2058 | } |
2059 | |
2060 | /** |
2061 | @@ -1972,7 +1971,8 @@ static void netiucv_setup_netdevice(struct net_device *dev) |
2062 | dev->mtu = NETIUCV_MTU_DEFAULT; |
2063 | dev->min_mtu = 576; |
2064 | dev->max_mtu = NETIUCV_MTU_MAX; |
2065 | - dev->destructor = netiucv_free_netdevice; |
2066 | + dev->needs_free_netdev = true; |
2067 | + dev->priv_destructor = netiucv_free_netdevice; |
2068 | dev->hard_header_len = NETIUCV_HDRLEN; |
2069 | dev->addr_len = 0; |
2070 | dev->type = ARPHRD_SLIP; |
2071 | diff --git a/drivers/staging/rtl8188eu/os_dep/mon.c b/drivers/staging/rtl8188eu/os_dep/mon.c |
2072 | index cfe37eb026d6..859d0d6051cd 100644 |
2073 | --- a/drivers/staging/rtl8188eu/os_dep/mon.c |
2074 | +++ b/drivers/staging/rtl8188eu/os_dep/mon.c |
2075 | @@ -152,7 +152,7 @@ static const struct net_device_ops mon_netdev_ops = { |
2076 | static void mon_setup(struct net_device *dev) |
2077 | { |
2078 | dev->netdev_ops = &mon_netdev_ops; |
2079 | - dev->destructor = free_netdev; |
2080 | + dev->needs_free_netdev = true; |
2081 | ether_setup(dev); |
2082 | dev->priv_flags |= IFF_NO_QUEUE; |
2083 | dev->type = ARPHRD_IEEE80211; |
2084 | diff --git a/drivers/usb/gadget/function/f_phonet.c b/drivers/usb/gadget/function/f_phonet.c |
2085 | index b4058f0000e4..6a1ce6a55158 100644 |
2086 | --- a/drivers/usb/gadget/function/f_phonet.c |
2087 | +++ b/drivers/usb/gadget/function/f_phonet.c |
2088 | @@ -281,7 +281,7 @@ static void pn_net_setup(struct net_device *dev) |
2089 | dev->tx_queue_len = 1; |
2090 | |
2091 | dev->netdev_ops = &pn_netdev_ops; |
2092 | - dev->destructor = free_netdev; |
2093 | + dev->needs_free_netdev = true; |
2094 | dev->header_ops = &phonet_header_ops; |
2095 | } |
2096 | |
2097 | diff --git a/drivers/watchdog/bcm_kona_wdt.c b/drivers/watchdog/bcm_kona_wdt.c |
2098 | index 6fce17d5b9f1..a5775dfd8d5f 100644 |
2099 | --- a/drivers/watchdog/bcm_kona_wdt.c |
2100 | +++ b/drivers/watchdog/bcm_kona_wdt.c |
2101 | @@ -304,6 +304,8 @@ static int bcm_kona_wdt_probe(struct platform_device *pdev) |
2102 | if (!wdt) |
2103 | return -ENOMEM; |
2104 | |
2105 | + spin_lock_init(&wdt->lock); |
2106 | + |
2107 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
2108 | wdt->base = devm_ioremap_resource(dev, res); |
2109 | if (IS_ERR(wdt->base)) |
2110 | @@ -316,7 +318,6 @@ static int bcm_kona_wdt_probe(struct platform_device *pdev) |
2111 | return ret; |
2112 | } |
2113 | |
2114 | - spin_lock_init(&wdt->lock); |
2115 | platform_set_drvdata(pdev, wdt); |
2116 | watchdog_set_drvdata(&bcm_kona_wdt_wdd, wdt); |
2117 | bcm_kona_wdt_wdd.parent = &pdev->dev; |
2118 | diff --git a/fs/nfs/callback.c b/fs/nfs/callback.c |
2119 | index 773774531aff..c5e27ebd8da8 100644 |
2120 | --- a/fs/nfs/callback.c |
2121 | +++ b/fs/nfs/callback.c |
2122 | @@ -280,7 +280,7 @@ static struct svc_serv *nfs_callback_create_svc(int minorversion) |
2123 | printk(KERN_WARNING "nfs_callback_create_svc: no kthread, %d users??\n", |
2124 | cb_info->users); |
2125 | |
2126 | - serv = svc_create(&nfs4_callback_program, NFS4_CALLBACK_BUFSIZE, sv_ops); |
2127 | + serv = svc_create_pooled(&nfs4_callback_program, NFS4_CALLBACK_BUFSIZE, sv_ops); |
2128 | if (!serv) { |
2129 | printk(KERN_ERR "nfs_callback_create_svc: create service failed\n"); |
2130 | return ERR_PTR(-ENOMEM); |
2131 | diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c |
2132 | index f92ba8d6c556..66c743eddac9 100644 |
2133 | --- a/fs/nfs/dir.c |
2134 | +++ b/fs/nfs/dir.c |
2135 | @@ -2002,29 +2002,6 @@ nfs_link(struct dentry *old_dentry, struct inode *dir, struct dentry *dentry) |
2136 | } |
2137 | EXPORT_SYMBOL_GPL(nfs_link); |
2138 | |
2139 | -static void |
2140 | -nfs_complete_rename(struct rpc_task *task, struct nfs_renamedata *data) |
2141 | -{ |
2142 | - struct dentry *old_dentry = data->old_dentry; |
2143 | - struct dentry *new_dentry = data->new_dentry; |
2144 | - struct inode *old_inode = d_inode(old_dentry); |
2145 | - struct inode *new_inode = d_inode(new_dentry); |
2146 | - |
2147 | - nfs_mark_for_revalidate(old_inode); |
2148 | - |
2149 | - switch (task->tk_status) { |
2150 | - case 0: |
2151 | - if (new_inode != NULL) |
2152 | - nfs_drop_nlink(new_inode); |
2153 | - d_move(old_dentry, new_dentry); |
2154 | - nfs_set_verifier(new_dentry, |
2155 | - nfs_save_change_attribute(data->new_dir)); |
2156 | - break; |
2157 | - case -ENOENT: |
2158 | - nfs_dentry_handle_enoent(old_dentry); |
2159 | - } |
2160 | -} |
2161 | - |
2162 | /* |
2163 | * RENAME |
2164 | * FIXME: Some nfsds, like the Linux user space nfsd, may generate a |
2165 | @@ -2055,7 +2032,7 @@ int nfs_rename(struct inode *old_dir, struct dentry *old_dentry, |
2166 | { |
2167 | struct inode *old_inode = d_inode(old_dentry); |
2168 | struct inode *new_inode = d_inode(new_dentry); |
2169 | - struct dentry *dentry = NULL; |
2170 | + struct dentry *dentry = NULL, *rehash = NULL; |
2171 | struct rpc_task *task; |
2172 | int error = -EBUSY; |
2173 | |
2174 | @@ -2078,8 +2055,10 @@ int nfs_rename(struct inode *old_dir, struct dentry *old_dentry, |
2175 | * To prevent any new references to the target during the |
2176 | * rename, we unhash the dentry in advance. |
2177 | */ |
2178 | - if (!d_unhashed(new_dentry)) |
2179 | + if (!d_unhashed(new_dentry)) { |
2180 | d_drop(new_dentry); |
2181 | + rehash = new_dentry; |
2182 | + } |
2183 | |
2184 | if (d_count(new_dentry) > 2) { |
2185 | int err; |
2186 | @@ -2096,6 +2075,7 @@ int nfs_rename(struct inode *old_dir, struct dentry *old_dentry, |
2187 | goto out; |
2188 | |
2189 | new_dentry = dentry; |
2190 | + rehash = NULL; |
2191 | new_inode = NULL; |
2192 | } |
2193 | } |
2194 | @@ -2104,8 +2084,7 @@ int nfs_rename(struct inode *old_dir, struct dentry *old_dentry, |
2195 | if (new_inode != NULL) |
2196 | NFS_PROTO(new_inode)->return_delegation(new_inode); |
2197 | |
2198 | - task = nfs_async_rename(old_dir, new_dir, old_dentry, new_dentry, |
2199 | - nfs_complete_rename); |
2200 | + task = nfs_async_rename(old_dir, new_dir, old_dentry, new_dentry, NULL); |
2201 | if (IS_ERR(task)) { |
2202 | error = PTR_ERR(task); |
2203 | goto out; |
2204 | @@ -2115,9 +2094,27 @@ int nfs_rename(struct inode *old_dir, struct dentry *old_dentry, |
2205 | if (error == 0) |
2206 | error = task->tk_status; |
2207 | rpc_put_task(task); |
2208 | + nfs_mark_for_revalidate(old_inode); |
2209 | out: |
2210 | + if (rehash) |
2211 | + d_rehash(rehash); |
2212 | trace_nfs_rename_exit(old_dir, old_dentry, |
2213 | new_dir, new_dentry, error); |
2214 | + if (!error) { |
2215 | + if (new_inode != NULL) |
2216 | + nfs_drop_nlink(new_inode); |
2217 | + /* |
2218 | + * The d_move() should be here instead of in an async RPC completion |
2219 | + * handler because we need the proper locks to move the dentry. If |
2220 | + * we're interrupted by a signal, the async RPC completion handler |
2221 | + * should mark the directories for revalidation. |
2222 | + */ |
2223 | + d_move(old_dentry, new_dentry); |
2224 | + nfs_set_verifier(new_dentry, |
2225 | + nfs_save_change_attribute(new_dir)); |
2226 | + } else if (error == -ENOENT) |
2227 | + nfs_dentry_handle_enoent(old_dentry); |
2228 | + |
2229 | /* new dentry created? */ |
2230 | if (dentry) |
2231 | dput(dentry); |
2232 | diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c |
2233 | index 8ba6c0d4d499..932a1461758d 100644 |
2234 | --- a/fs/nfs/nfs4proc.c |
2235 | +++ b/fs/nfs/nfs4proc.c |
2236 | @@ -2588,7 +2588,8 @@ static inline void nfs4_exclusive_attrset(struct nfs4_opendata *opendata, |
2237 | |
2238 | /* Except MODE, it seems harmless of setting twice. */ |
2239 | if (opendata->o_arg.createmode != NFS4_CREATE_EXCLUSIVE && |
2240 | - attrset[1] & FATTR4_WORD1_MODE) |
2241 | + (attrset[1] & FATTR4_WORD1_MODE || |
2242 | + attrset[2] & FATTR4_WORD2_MODE_UMASK)) |
2243 | sattr->ia_valid &= ~ATTR_MODE; |
2244 | |
2245 | if (attrset[2] & FATTR4_WORD2_SECURITY_LABEL) |
2246 | @@ -8429,6 +8430,7 @@ static void nfs4_layoutget_release(void *calldata) |
2247 | size_t max_pages = max_response_pages(server); |
2248 | |
2249 | dprintk("--> %s\n", __func__); |
2250 | + nfs4_sequence_free_slot(&lgp->res.seq_res); |
2251 | nfs4_free_pages(lgp->args.layout.pages, max_pages); |
2252 | pnfs_put_layout_hdr(NFS_I(inode)->layout); |
2253 | put_nfs_open_context(lgp->args.ctx); |
2254 | @@ -8503,7 +8505,6 @@ nfs4_proc_layoutget(struct nfs4_layoutget *lgp, long *timeout, gfp_t gfp_flags) |
2255 | /* if layoutp->len is 0, nfs4_layoutget_prepare called rpc_exit */ |
2256 | if (status == 0 && lgp->res.layoutp->len) |
2257 | lseg = pnfs_layout_process(lgp); |
2258 | - nfs4_sequence_free_slot(&lgp->res.seq_res); |
2259 | rpc_put_task(task); |
2260 | dprintk("<-- %s status=%d\n", __func__, status); |
2261 | if (status) |
2262 | diff --git a/fs/ocfs2/cluster/heartbeat.c b/fs/ocfs2/cluster/heartbeat.c |
2263 | index f6e871760f8d..0da0332725aa 100644 |
2264 | --- a/fs/ocfs2/cluster/heartbeat.c |
2265 | +++ b/fs/ocfs2/cluster/heartbeat.c |
2266 | @@ -2242,13 +2242,13 @@ static void o2hb_heartbeat_group_drop_item(struct config_group *group, |
2267 | spin_unlock(&o2hb_live_lock); |
2268 | } |
2269 | |
2270 | -static ssize_t o2hb_heartbeat_group_threshold_show(struct config_item *item, |
2271 | +static ssize_t o2hb_heartbeat_group_dead_threshold_show(struct config_item *item, |
2272 | char *page) |
2273 | { |
2274 | return sprintf(page, "%u\n", o2hb_dead_threshold); |
2275 | } |
2276 | |
2277 | -static ssize_t o2hb_heartbeat_group_threshold_store(struct config_item *item, |
2278 | +static ssize_t o2hb_heartbeat_group_dead_threshold_store(struct config_item *item, |
2279 | const char *page, size_t count) |
2280 | { |
2281 | unsigned long tmp; |
2282 | @@ -2297,11 +2297,11 @@ static ssize_t o2hb_heartbeat_group_mode_store(struct config_item *item, |
2283 | |
2284 | } |
2285 | |
2286 | -CONFIGFS_ATTR(o2hb_heartbeat_group_, threshold); |
2287 | +CONFIGFS_ATTR(o2hb_heartbeat_group_, dead_threshold); |
2288 | CONFIGFS_ATTR(o2hb_heartbeat_group_, mode); |
2289 | |
2290 | static struct configfs_attribute *o2hb_heartbeat_group_attrs[] = { |
2291 | - &o2hb_heartbeat_group_attr_threshold, |
2292 | + &o2hb_heartbeat_group_attr_dead_threshold, |
2293 | &o2hb_heartbeat_group_attr_mode, |
2294 | NULL, |
2295 | }; |
2296 | diff --git a/fs/ocfs2/dlmglue.c b/fs/ocfs2/dlmglue.c |
2297 | index 3b7c937a36b5..4689940a953c 100644 |
2298 | --- a/fs/ocfs2/dlmglue.c |
2299 | +++ b/fs/ocfs2/dlmglue.c |
2300 | @@ -2591,6 +2591,10 @@ void ocfs2_inode_unlock_tracker(struct inode *inode, |
2301 | struct ocfs2_lock_res *lockres; |
2302 | |
2303 | lockres = &OCFS2_I(inode)->ip_inode_lockres; |
2304 | + /* had_lock means that the currect process already takes the cluster |
2305 | + * lock previously. If had_lock is 1, we have nothing to do here, and |
2306 | + * it will get unlocked where we got the lock. |
2307 | + */ |
2308 | if (!had_lock) { |
2309 | ocfs2_remove_holder(lockres, oh); |
2310 | ocfs2_inode_unlock(inode, ex); |
2311 | diff --git a/fs/ocfs2/xattr.c b/fs/ocfs2/xattr.c |
2312 | index 3c5384d9b3a5..f70c3778d600 100644 |
2313 | --- a/fs/ocfs2/xattr.c |
2314 | +++ b/fs/ocfs2/xattr.c |
2315 | @@ -1328,20 +1328,21 @@ static int ocfs2_xattr_get(struct inode *inode, |
2316 | void *buffer, |
2317 | size_t buffer_size) |
2318 | { |
2319 | - int ret; |
2320 | + int ret, had_lock; |
2321 | struct buffer_head *di_bh = NULL; |
2322 | + struct ocfs2_lock_holder oh; |
2323 | |
2324 | - ret = ocfs2_inode_lock(inode, &di_bh, 0); |
2325 | - if (ret < 0) { |
2326 | - mlog_errno(ret); |
2327 | - return ret; |
2328 | + had_lock = ocfs2_inode_lock_tracker(inode, &di_bh, 0, &oh); |
2329 | + if (had_lock < 0) { |
2330 | + mlog_errno(had_lock); |
2331 | + return had_lock; |
2332 | } |
2333 | down_read(&OCFS2_I(inode)->ip_xattr_sem); |
2334 | ret = ocfs2_xattr_get_nolock(inode, di_bh, name_index, |
2335 | name, buffer, buffer_size); |
2336 | up_read(&OCFS2_I(inode)->ip_xattr_sem); |
2337 | |
2338 | - ocfs2_inode_unlock(inode, 0); |
2339 | + ocfs2_inode_unlock_tracker(inode, 0, &oh, had_lock); |
2340 | |
2341 | brelse(di_bh); |
2342 | |
2343 | @@ -3537,11 +3538,12 @@ int ocfs2_xattr_set(struct inode *inode, |
2344 | { |
2345 | struct buffer_head *di_bh = NULL; |
2346 | struct ocfs2_dinode *di; |
2347 | - int ret, credits, ref_meta = 0, ref_credits = 0; |
2348 | + int ret, credits, had_lock, ref_meta = 0, ref_credits = 0; |
2349 | struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); |
2350 | struct inode *tl_inode = osb->osb_tl_inode; |
2351 | struct ocfs2_xattr_set_ctxt ctxt = { NULL, NULL, NULL, }; |
2352 | struct ocfs2_refcount_tree *ref_tree = NULL; |
2353 | + struct ocfs2_lock_holder oh; |
2354 | |
2355 | struct ocfs2_xattr_info xi = { |
2356 | .xi_name_index = name_index, |
2357 | @@ -3572,8 +3574,9 @@ int ocfs2_xattr_set(struct inode *inode, |
2358 | return -ENOMEM; |
2359 | } |
2360 | |
2361 | - ret = ocfs2_inode_lock(inode, &di_bh, 1); |
2362 | - if (ret < 0) { |
2363 | + had_lock = ocfs2_inode_lock_tracker(inode, &di_bh, 1, &oh); |
2364 | + if (had_lock < 0) { |
2365 | + ret = had_lock; |
2366 | mlog_errno(ret); |
2367 | goto cleanup_nolock; |
2368 | } |
2369 | @@ -3670,7 +3673,7 @@ int ocfs2_xattr_set(struct inode *inode, |
2370 | if (ret) |
2371 | mlog_errno(ret); |
2372 | } |
2373 | - ocfs2_inode_unlock(inode, 1); |
2374 | + ocfs2_inode_unlock_tracker(inode, 1, &oh, had_lock); |
2375 | cleanup_nolock: |
2376 | brelse(di_bh); |
2377 | brelse(xbs.xattr_bh); |
2378 | diff --git a/fs/overlayfs/copy_up.c b/fs/overlayfs/copy_up.c |
2379 | index 5b14c16d1b77..e83e2dc7ae0b 100644 |
2380 | --- a/fs/overlayfs/copy_up.c |
2381 | +++ b/fs/overlayfs/copy_up.c |
2382 | @@ -252,15 +252,9 @@ static int ovl_copy_up_locked(struct dentry *workdir, struct dentry *upperdir, |
2383 | .link = link |
2384 | }; |
2385 | |
2386 | - upper = lookup_one_len(dentry->d_name.name, upperdir, |
2387 | - dentry->d_name.len); |
2388 | - err = PTR_ERR(upper); |
2389 | - if (IS_ERR(upper)) |
2390 | - goto out; |
2391 | - |
2392 | err = security_inode_copy_up(dentry, &new_creds); |
2393 | if (err < 0) |
2394 | - goto out1; |
2395 | + goto out; |
2396 | |
2397 | if (new_creds) |
2398 | old_creds = override_creds(new_creds); |
2399 | @@ -284,7 +278,7 @@ static int ovl_copy_up_locked(struct dentry *workdir, struct dentry *upperdir, |
2400 | } |
2401 | |
2402 | if (err) |
2403 | - goto out2; |
2404 | + goto out; |
2405 | |
2406 | if (S_ISREG(stat->mode)) { |
2407 | struct path upperpath; |
2408 | @@ -317,6 +311,14 @@ static int ovl_copy_up_locked(struct dentry *workdir, struct dentry *upperdir, |
2409 | if (err) |
2410 | goto out_cleanup; |
2411 | |
2412 | + upper = lookup_one_len(dentry->d_name.name, upperdir, |
2413 | + dentry->d_name.len); |
2414 | + if (IS_ERR(upper)) { |
2415 | + err = PTR_ERR(upper); |
2416 | + upper = NULL; |
2417 | + goto out_cleanup; |
2418 | + } |
2419 | + |
2420 | if (tmpfile) |
2421 | err = ovl_do_link(temp, udir, upper, true); |
2422 | else |
2423 | @@ -330,17 +332,15 @@ static int ovl_copy_up_locked(struct dentry *workdir, struct dentry *upperdir, |
2424 | |
2425 | /* Restore timestamps on parent (best effort) */ |
2426 | ovl_set_timestamps(upperdir, pstat); |
2427 | -out2: |
2428 | +out: |
2429 | dput(temp); |
2430 | -out1: |
2431 | dput(upper); |
2432 | -out: |
2433 | return err; |
2434 | |
2435 | out_cleanup: |
2436 | if (!tmpfile) |
2437 | ovl_cleanup(wdir, temp); |
2438 | - goto out2; |
2439 | + goto out; |
2440 | } |
2441 | |
2442 | /* |
2443 | diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h |
2444 | index 97456b2539e4..aa38bb18c81c 100644 |
2445 | --- a/include/linux/netdevice.h |
2446 | +++ b/include/linux/netdevice.h |
2447 | @@ -1581,8 +1581,8 @@ enum netdev_priv_flags { |
2448 | * @rtnl_link_state: This enum represents the phases of creating |
2449 | * a new link |
2450 | * |
2451 | - * @destructor: Called from unregister, |
2452 | - * can be used to call free_netdev |
2453 | + * @needs_free_netdev: Should unregister perform free_netdev? |
2454 | + * @priv_destructor: Called from unregister |
2455 | * @npinfo: XXX: need comments on this one |
2456 | * @nd_net: Network namespace this network device is inside |
2457 | * |
2458 | @@ -1838,7 +1838,8 @@ struct net_device { |
2459 | RTNL_LINK_INITIALIZING, |
2460 | } rtnl_link_state:16; |
2461 | |
2462 | - void (*destructor)(struct net_device *dev); |
2463 | + bool needs_free_netdev; |
2464 | + void (*priv_destructor)(struct net_device *dev); |
2465 | |
2466 | #ifdef CONFIG_NETPOLL |
2467 | struct netpoll_info __rcu *npinfo; |
2468 | @@ -4231,6 +4232,11 @@ static inline const char *netdev_name(const struct net_device *dev) |
2469 | return dev->name; |
2470 | } |
2471 | |
2472 | +static inline bool netdev_unregistering(const struct net_device *dev) |
2473 | +{ |
2474 | + return dev->reg_state == NETREG_UNREGISTERING; |
2475 | +} |
2476 | + |
2477 | static inline const char *netdev_reg_state(const struct net_device *dev) |
2478 | { |
2479 | switch (dev->reg_state) { |
2480 | diff --git a/include/net/xfrm.h b/include/net/xfrm.h |
2481 | index 14d82bf16692..85bc8e7ade2e 100644 |
2482 | --- a/include/net/xfrm.h |
2483 | +++ b/include/net/xfrm.h |
2484 | @@ -945,10 +945,6 @@ struct xfrm_dst { |
2485 | struct flow_cache_object flo; |
2486 | struct xfrm_policy *pols[XFRM_POLICY_TYPE_MAX]; |
2487 | int num_pols, num_xfrms; |
2488 | -#ifdef CONFIG_XFRM_SUB_POLICY |
2489 | - struct flowi *origin; |
2490 | - struct xfrm_selector *partner; |
2491 | -#endif |
2492 | u32 xfrm_genid; |
2493 | u32 policy_genid; |
2494 | u32 route_mtu_cached; |
2495 | @@ -964,12 +960,6 @@ static inline void xfrm_dst_destroy(struct xfrm_dst *xdst) |
2496 | dst_release(xdst->route); |
2497 | if (likely(xdst->u.dst.xfrm)) |
2498 | xfrm_state_put(xdst->u.dst.xfrm); |
2499 | -#ifdef CONFIG_XFRM_SUB_POLICY |
2500 | - kfree(xdst->origin); |
2501 | - xdst->origin = NULL; |
2502 | - kfree(xdst->partner); |
2503 | - xdst->partner = NULL; |
2504 | -#endif |
2505 | } |
2506 | #endif |
2507 | |
2508 | diff --git a/mm/vmalloc.c b/mm/vmalloc.c |
2509 | index 0b057628a7ba..926ef9e8c71b 100644 |
2510 | --- a/mm/vmalloc.c |
2511 | +++ b/mm/vmalloc.c |
2512 | @@ -287,10 +287,21 @@ struct page *vmalloc_to_page(const void *vmalloc_addr) |
2513 | if (p4d_none(*p4d)) |
2514 | return NULL; |
2515 | pud = pud_offset(p4d, addr); |
2516 | - if (pud_none(*pud)) |
2517 | + |
2518 | + /* |
2519 | + * Don't dereference bad PUD or PMD (below) entries. This will also |
2520 | + * identify huge mappings, which we may encounter on architectures |
2521 | + * that define CONFIG_HAVE_ARCH_HUGE_VMAP=y. Such regions will be |
2522 | + * identified as vmalloc addresses by is_vmalloc_addr(), but are |
2523 | + * not [unambiguously] associated with a struct page, so there is |
2524 | + * no correct value to return for them. |
2525 | + */ |
2526 | + WARN_ON_ONCE(pud_bad(*pud)); |
2527 | + if (pud_none(*pud) || pud_bad(*pud)) |
2528 | return NULL; |
2529 | pmd = pmd_offset(pud, addr); |
2530 | - if (pmd_none(*pmd)) |
2531 | + WARN_ON_ONCE(pmd_bad(*pmd)); |
2532 | + if (pmd_none(*pmd) || pmd_bad(*pmd)) |
2533 | return NULL; |
2534 | |
2535 | ptep = pte_offset_map(pmd, addr); |
2536 | diff --git a/net/8021q/vlan.c b/net/8021q/vlan.c |
2537 | index 467069b73ce1..9649579b5b9f 100644 |
2538 | --- a/net/8021q/vlan.c |
2539 | +++ b/net/8021q/vlan.c |
2540 | @@ -277,7 +277,8 @@ static int register_vlan_device(struct net_device *real_dev, u16 vlan_id) |
2541 | return 0; |
2542 | |
2543 | out_free_newdev: |
2544 | - free_netdev(new_dev); |
2545 | + if (new_dev->reg_state == NETREG_UNINITIALIZED) |
2546 | + free_netdev(new_dev); |
2547 | return err; |
2548 | } |
2549 | |
2550 | diff --git a/net/8021q/vlan_dev.c b/net/8021q/vlan_dev.c |
2551 | index e97ab824e368..0064dfd328d4 100644 |
2552 | --- a/net/8021q/vlan_dev.c |
2553 | +++ b/net/8021q/vlan_dev.c |
2554 | @@ -807,7 +807,6 @@ static void vlan_dev_free(struct net_device *dev) |
2555 | |
2556 | free_percpu(vlan->vlan_pcpu_stats); |
2557 | vlan->vlan_pcpu_stats = NULL; |
2558 | - free_netdev(dev); |
2559 | } |
2560 | |
2561 | void vlan_setup(struct net_device *dev) |
2562 | @@ -820,7 +819,8 @@ void vlan_setup(struct net_device *dev) |
2563 | netif_keep_dst(dev); |
2564 | |
2565 | dev->netdev_ops = &vlan_netdev_ops; |
2566 | - dev->destructor = vlan_dev_free; |
2567 | + dev->needs_free_netdev = true; |
2568 | + dev->priv_destructor = vlan_dev_free; |
2569 | dev->ethtool_ops = &vlan_ethtool_ops; |
2570 | |
2571 | dev->min_mtu = 0; |
2572 | diff --git a/net/batman-adv/soft-interface.c b/net/batman-adv/soft-interface.c |
2573 | index d042c99af028..07ca0e8f30b2 100644 |
2574 | --- a/net/batman-adv/soft-interface.c |
2575 | +++ b/net/batman-adv/soft-interface.c |
2576 | @@ -961,8 +961,6 @@ static void batadv_softif_free(struct net_device *dev) |
2577 | * netdev and its private data (bat_priv) |
2578 | */ |
2579 | rcu_barrier(); |
2580 | - |
2581 | - free_netdev(dev); |
2582 | } |
2583 | |
2584 | /** |
2585 | @@ -976,7 +974,8 @@ static void batadv_softif_init_early(struct net_device *dev) |
2586 | ether_setup(dev); |
2587 | |
2588 | dev->netdev_ops = &batadv_netdev_ops; |
2589 | - dev->destructor = batadv_softif_free; |
2590 | + dev->needs_free_netdev = true; |
2591 | + dev->priv_destructor = batadv_softif_free; |
2592 | dev->features |= NETIF_F_HW_VLAN_CTAG_FILTER | NETIF_F_NETNS_LOCAL; |
2593 | dev->priv_flags |= IFF_NO_QUEUE; |
2594 | |
2595 | diff --git a/net/bluetooth/6lowpan.c b/net/bluetooth/6lowpan.c |
2596 | index d491529332f4..7ffeca72e928 100644 |
2597 | --- a/net/bluetooth/6lowpan.c |
2598 | +++ b/net/bluetooth/6lowpan.c |
2599 | @@ -653,7 +653,7 @@ static void netdev_setup(struct net_device *dev) |
2600 | |
2601 | dev->netdev_ops = &netdev_ops; |
2602 | dev->header_ops = &header_ops; |
2603 | - dev->destructor = free_netdev; |
2604 | + dev->needs_free_netdev = true; |
2605 | } |
2606 | |
2607 | static struct device_type bt_type = { |
2608 | diff --git a/net/bridge/br_device.c b/net/bridge/br_device.c |
2609 | index 430b53e7d941..f0f3447e8aa4 100644 |
2610 | --- a/net/bridge/br_device.c |
2611 | +++ b/net/bridge/br_device.c |
2612 | @@ -379,7 +379,7 @@ void br_dev_setup(struct net_device *dev) |
2613 | ether_setup(dev); |
2614 | |
2615 | dev->netdev_ops = &br_netdev_ops; |
2616 | - dev->destructor = free_netdev; |
2617 | + dev->needs_free_netdev = true; |
2618 | dev->ethtool_ops = &br_ethtool_ops; |
2619 | SET_NETDEV_DEVTYPE(dev, &br_type); |
2620 | dev->priv_flags = IFF_EBRIDGE | IFF_NO_QUEUE; |
2621 | diff --git a/net/caif/cfpkt_skbuff.c b/net/caif/cfpkt_skbuff.c |
2622 | index 59ce1fcc220c..71b6ab240dea 100644 |
2623 | --- a/net/caif/cfpkt_skbuff.c |
2624 | +++ b/net/caif/cfpkt_skbuff.c |
2625 | @@ -81,11 +81,7 @@ static struct cfpkt *cfpkt_create_pfx(u16 len, u16 pfx) |
2626 | { |
2627 | struct sk_buff *skb; |
2628 | |
2629 | - if (likely(in_interrupt())) |
2630 | - skb = alloc_skb(len + pfx, GFP_ATOMIC); |
2631 | - else |
2632 | - skb = alloc_skb(len + pfx, GFP_KERNEL); |
2633 | - |
2634 | + skb = alloc_skb(len + pfx, GFP_ATOMIC); |
2635 | if (unlikely(skb == NULL)) |
2636 | return NULL; |
2637 | |
2638 | diff --git a/net/caif/chnl_net.c b/net/caif/chnl_net.c |
2639 | index 1816fc9f1ee7..fe3c53efb949 100644 |
2640 | --- a/net/caif/chnl_net.c |
2641 | +++ b/net/caif/chnl_net.c |
2642 | @@ -392,14 +392,14 @@ static void chnl_net_destructor(struct net_device *dev) |
2643 | { |
2644 | struct chnl_net *priv = netdev_priv(dev); |
2645 | caif_free_client(&priv->chnl); |
2646 | - free_netdev(dev); |
2647 | } |
2648 | |
2649 | static void ipcaif_net_setup(struct net_device *dev) |
2650 | { |
2651 | struct chnl_net *priv; |
2652 | dev->netdev_ops = &netdev_ops; |
2653 | - dev->destructor = chnl_net_destructor; |
2654 | + dev->needs_free_netdev = true; |
2655 | + dev->priv_destructor = chnl_net_destructor; |
2656 | dev->flags |= IFF_NOARP; |
2657 | dev->flags |= IFF_POINTOPOINT; |
2658 | dev->mtu = GPRS_PDP_MTU; |
2659 | diff --git a/net/core/dev.c b/net/core/dev.c |
2660 | index 9b5875388c23..9debc1b26ce9 100644 |
2661 | --- a/net/core/dev.c |
2662 | +++ b/net/core/dev.c |
2663 | @@ -1251,8 +1251,9 @@ int dev_set_alias(struct net_device *dev, const char *alias, size_t len) |
2664 | if (!new_ifalias) |
2665 | return -ENOMEM; |
2666 | dev->ifalias = new_ifalias; |
2667 | + memcpy(dev->ifalias, alias, len); |
2668 | + dev->ifalias[len] = 0; |
2669 | |
2670 | - strlcpy(dev->ifalias, alias, len+1); |
2671 | return len; |
2672 | } |
2673 | |
2674 | @@ -7345,6 +7346,8 @@ int register_netdevice(struct net_device *dev) |
2675 | err_uninit: |
2676 | if (dev->netdev_ops->ndo_uninit) |
2677 | dev->netdev_ops->ndo_uninit(dev); |
2678 | + if (dev->priv_destructor) |
2679 | + dev->priv_destructor(dev); |
2680 | goto out; |
2681 | } |
2682 | EXPORT_SYMBOL(register_netdevice); |
2683 | @@ -7552,8 +7555,10 @@ void netdev_run_todo(void) |
2684 | WARN_ON(rcu_access_pointer(dev->ip6_ptr)); |
2685 | WARN_ON(dev->dn_ptr); |
2686 | |
2687 | - if (dev->destructor) |
2688 | - dev->destructor(dev); |
2689 | + if (dev->priv_destructor) |
2690 | + dev->priv_destructor(dev); |
2691 | + if (dev->needs_free_netdev) |
2692 | + free_netdev(dev); |
2693 | |
2694 | /* Report a network device has been unregistered */ |
2695 | rtnl_lock(); |
2696 | diff --git a/net/core/dst.c b/net/core/dst.c |
2697 | index 6192f11beec9..13ba4a090c41 100644 |
2698 | --- a/net/core/dst.c |
2699 | +++ b/net/core/dst.c |
2700 | @@ -469,6 +469,20 @@ static int dst_dev_event(struct notifier_block *this, unsigned long event, |
2701 | spin_lock_bh(&dst_garbage.lock); |
2702 | dst = dst_garbage.list; |
2703 | dst_garbage.list = NULL; |
2704 | + /* The code in dst_ifdown places a hold on the loopback device. |
2705 | + * If the gc entry processing is set to expire after a lengthy |
2706 | + * interval, this hold can cause netdev_wait_allrefs() to hang |
2707 | + * out and wait for a long time -- until the the loopback |
2708 | + * interface is released. If we're really unlucky, it'll emit |
2709 | + * pr_emerg messages to console too. Reset the interval here, |
2710 | + * so dst cleanups occur in a more timely fashion. |
2711 | + */ |
2712 | + if (dst_garbage.timer_inc > DST_GC_INC) { |
2713 | + dst_garbage.timer_inc = DST_GC_INC; |
2714 | + dst_garbage.timer_expires = DST_GC_MIN; |
2715 | + mod_delayed_work(system_wq, &dst_gc_work, |
2716 | + dst_garbage.timer_expires); |
2717 | + } |
2718 | spin_unlock_bh(&dst_garbage.lock); |
2719 | |
2720 | if (last) |
2721 | diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c |
2722 | index 8d4a185a8143..05436c02fb7b 100644 |
2723 | --- a/net/core/rtnetlink.c |
2724 | +++ b/net/core/rtnetlink.c |
2725 | @@ -934,6 +934,7 @@ static noinline size_t if_nlmsg_size(const struct net_device *dev, |
2726 | + nla_total_size(1) /* IFLA_LINKMODE */ |
2727 | + nla_total_size(4) /* IFLA_CARRIER_CHANGES */ |
2728 | + nla_total_size(4) /* IFLA_LINK_NETNSID */ |
2729 | + + nla_total_size(4) /* IFLA_GROUP */ |
2730 | + nla_total_size(ext_filter_mask |
2731 | & RTEXT_FILTER_VF ? 4 : 0) /* IFLA_NUM_VF */ |
2732 | + rtnl_vfinfo_size(dev, ext_filter_mask) /* IFLA_VFINFO_LIST */ |
2733 | @@ -1127,6 +1128,8 @@ static noinline_for_stack int rtnl_fill_vfinfo(struct sk_buff *skb, |
2734 | struct ifla_vf_mac vf_mac; |
2735 | struct ifla_vf_info ivi; |
2736 | |
2737 | + memset(&ivi, 0, sizeof(ivi)); |
2738 | + |
2739 | /* Not all SR-IOV capable drivers support the |
2740 | * spoofcheck and "RSS query enable" query. Preset to |
2741 | * -1 so the user space tool can detect that the driver |
2742 | @@ -1135,7 +1138,6 @@ static noinline_for_stack int rtnl_fill_vfinfo(struct sk_buff *skb, |
2743 | ivi.spoofchk = -1; |
2744 | ivi.rss_query_en = -1; |
2745 | ivi.trusted = -1; |
2746 | - memset(ivi.mac, 0, sizeof(ivi.mac)); |
2747 | /* The default value for VF link state is "auto" |
2748 | * IFLA_VF_LINK_STATE_AUTO which equals zero |
2749 | */ |
2750 | @@ -1461,6 +1463,7 @@ static const struct nla_policy ifla_policy[IFLA_MAX+1] = { |
2751 | [IFLA_LINK_NETNSID] = { .type = NLA_S32 }, |
2752 | [IFLA_PROTO_DOWN] = { .type = NLA_U8 }, |
2753 | [IFLA_XDP] = { .type = NLA_NESTED }, |
2754 | + [IFLA_GROUP] = { .type = NLA_U32 }, |
2755 | }; |
2756 | |
2757 | static const struct nla_policy ifla_info_policy[IFLA_INFO_MAX+1] = { |
2758 | diff --git a/net/decnet/dn_route.c b/net/decnet/dn_route.c |
2759 | index b1dc096d22f8..403593bd2b83 100644 |
2760 | --- a/net/decnet/dn_route.c |
2761 | +++ b/net/decnet/dn_route.c |
2762 | @@ -188,12 +188,6 @@ static inline void dnrt_free(struct dn_route *rt) |
2763 | call_rcu_bh(&rt->dst.rcu_head, dst_rcu_free); |
2764 | } |
2765 | |
2766 | -static inline void dnrt_drop(struct dn_route *rt) |
2767 | -{ |
2768 | - dst_release(&rt->dst); |
2769 | - call_rcu_bh(&rt->dst.rcu_head, dst_rcu_free); |
2770 | -} |
2771 | - |
2772 | static void dn_dst_check_expire(unsigned long dummy) |
2773 | { |
2774 | int i; |
2775 | @@ -248,7 +242,7 @@ static int dn_dst_gc(struct dst_ops *ops) |
2776 | } |
2777 | *rtp = rt->dst.dn_next; |
2778 | rt->dst.dn_next = NULL; |
2779 | - dnrt_drop(rt); |
2780 | + dnrt_free(rt); |
2781 | break; |
2782 | } |
2783 | spin_unlock_bh(&dn_rt_hash_table[i].lock); |
2784 | @@ -350,7 +344,7 @@ static int dn_insert_route(struct dn_route *rt, unsigned int hash, struct dn_rou |
2785 | dst_use(&rth->dst, now); |
2786 | spin_unlock_bh(&dn_rt_hash_table[hash].lock); |
2787 | |
2788 | - dnrt_drop(rt); |
2789 | + dst_free(&rt->dst); |
2790 | *rp = rth; |
2791 | return 0; |
2792 | } |
2793 | @@ -380,7 +374,7 @@ static void dn_run_flush(unsigned long dummy) |
2794 | for(; rt; rt = next) { |
2795 | next = rcu_dereference_raw(rt->dst.dn_next); |
2796 | RCU_INIT_POINTER(rt->dst.dn_next, NULL); |
2797 | - dst_free((struct dst_entry *)rt); |
2798 | + dnrt_free(rt); |
2799 | } |
2800 | |
2801 | nothing_to_declare: |
2802 | @@ -1187,7 +1181,7 @@ static int dn_route_output_slow(struct dst_entry **pprt, const struct flowidn *o |
2803 | if (dev_out->flags & IFF_LOOPBACK) |
2804 | flags |= RTCF_LOCAL; |
2805 | |
2806 | - rt = dst_alloc(&dn_dst_ops, dev_out, 1, DST_OBSOLETE_NONE, DST_HOST); |
2807 | + rt = dst_alloc(&dn_dst_ops, dev_out, 0, DST_OBSOLETE_NONE, DST_HOST); |
2808 | if (rt == NULL) |
2809 | goto e_nobufs; |
2810 | |
2811 | diff --git a/net/decnet/netfilter/dn_rtmsg.c b/net/decnet/netfilter/dn_rtmsg.c |
2812 | index 85f2fdc360c2..29246bc9a7b4 100644 |
2813 | --- a/net/decnet/netfilter/dn_rtmsg.c |
2814 | +++ b/net/decnet/netfilter/dn_rtmsg.c |
2815 | @@ -102,7 +102,9 @@ static inline void dnrmg_receive_user_skb(struct sk_buff *skb) |
2816 | { |
2817 | struct nlmsghdr *nlh = nlmsg_hdr(skb); |
2818 | |
2819 | - if (nlh->nlmsg_len < sizeof(*nlh) || skb->len < nlh->nlmsg_len) |
2820 | + if (skb->len < sizeof(*nlh) || |
2821 | + nlh->nlmsg_len < sizeof(*nlh) || |
2822 | + skb->len < nlh->nlmsg_len) |
2823 | return; |
2824 | |
2825 | if (!netlink_capable(skb, CAP_NET_ADMIN)) |
2826 | diff --git a/net/hsr/hsr_device.c b/net/hsr/hsr_device.c |
2827 | index c73160fb11e7..0a0a392dc2bd 100644 |
2828 | --- a/net/hsr/hsr_device.c |
2829 | +++ b/net/hsr/hsr_device.c |
2830 | @@ -378,7 +378,6 @@ static void hsr_dev_destroy(struct net_device *hsr_dev) |
2831 | del_timer_sync(&hsr->announce_timer); |
2832 | |
2833 | synchronize_rcu(); |
2834 | - free_netdev(hsr_dev); |
2835 | } |
2836 | |
2837 | static const struct net_device_ops hsr_device_ops = { |
2838 | @@ -404,7 +403,8 @@ void hsr_dev_setup(struct net_device *dev) |
2839 | SET_NETDEV_DEVTYPE(dev, &hsr_type); |
2840 | dev->priv_flags |= IFF_NO_QUEUE; |
2841 | |
2842 | - dev->destructor = hsr_dev_destroy; |
2843 | + dev->needs_free_netdev = true; |
2844 | + dev->priv_destructor = hsr_dev_destroy; |
2845 | |
2846 | dev->hw_features = NETIF_F_SG | NETIF_F_FRAGLIST | NETIF_F_HIGHDMA | |
2847 | NETIF_F_GSO_MASK | NETIF_F_HW_CSUM | |
2848 | diff --git a/net/ieee802154/6lowpan/core.c b/net/ieee802154/6lowpan/core.c |
2849 | index d7efbf0dad20..0a866f332290 100644 |
2850 | --- a/net/ieee802154/6lowpan/core.c |
2851 | +++ b/net/ieee802154/6lowpan/core.c |
2852 | @@ -107,7 +107,7 @@ static void lowpan_setup(struct net_device *ldev) |
2853 | |
2854 | ldev->netdev_ops = &lowpan_netdev_ops; |
2855 | ldev->header_ops = &lowpan_header_ops; |
2856 | - ldev->destructor = free_netdev; |
2857 | + ldev->needs_free_netdev = true; |
2858 | ldev->features |= NETIF_F_NETNS_LOCAL; |
2859 | } |
2860 | |
2861 | diff --git a/net/ipv4/esp4.c b/net/ipv4/esp4.c |
2862 | index b1e24446e297..9708a32b1f26 100644 |
2863 | --- a/net/ipv4/esp4.c |
2864 | +++ b/net/ipv4/esp4.c |
2865 | @@ -212,6 +212,7 @@ static int esp_output(struct xfrm_state *x, struct sk_buff *skb) |
2866 | u8 *iv; |
2867 | u8 *tail; |
2868 | u8 *vaddr; |
2869 | + int esph_offset; |
2870 | int blksize; |
2871 | int clen; |
2872 | int alen; |
2873 | @@ -392,12 +393,14 @@ static int esp_output(struct xfrm_state *x, struct sk_buff *skb) |
2874 | } |
2875 | |
2876 | cow: |
2877 | + esph_offset = (unsigned char *)esph - skb_transport_header(skb); |
2878 | + |
2879 | err = skb_cow_data(skb, tailen, &trailer); |
2880 | if (err < 0) |
2881 | goto error; |
2882 | nfrags = err; |
2883 | tail = skb_tail_pointer(trailer); |
2884 | - esph = ip_esp_hdr(skb); |
2885 | + esph = (struct ip_esp_hdr *)(skb_transport_header(skb) + esph_offset); |
2886 | |
2887 | skip_cow: |
2888 | esp_output_fill_trailer(tail, tfclen, plen, proto); |
2889 | diff --git a/net/ipv4/icmp.c b/net/ipv4/icmp.c |
2890 | index fc310db2708b..760311fd7c5b 100644 |
2891 | --- a/net/ipv4/icmp.c |
2892 | +++ b/net/ipv4/icmp.c |
2893 | @@ -674,8 +674,12 @@ void icmp_send(struct sk_buff *skb_in, int type, int code, __be32 info) |
2894 | /* Needed by both icmp_global_allow and icmp_xmit_lock */ |
2895 | local_bh_disable(); |
2896 | |
2897 | - /* Check global sysctl_icmp_msgs_per_sec ratelimit */ |
2898 | - if (!icmpv4_global_allow(net, type, code)) |
2899 | + /* Check global sysctl_icmp_msgs_per_sec ratelimit, unless |
2900 | + * incoming dev is loopback. If outgoing dev change to not be |
2901 | + * loopback, then peer ratelimit still work (in icmpv4_xrlim_allow) |
2902 | + */ |
2903 | + if (!(skb_in->dev && (skb_in->dev->flags&IFF_LOOPBACK)) && |
2904 | + !icmpv4_global_allow(net, type, code)) |
2905 | goto out_bh_enable; |
2906 | |
2907 | sk = icmp_xmit_lock(net); |
2908 | diff --git a/net/ipv4/igmp.c b/net/ipv4/igmp.c |
2909 | index 44fd86de2823..ec9a396fa466 100644 |
2910 | --- a/net/ipv4/igmp.c |
2911 | +++ b/net/ipv4/igmp.c |
2912 | @@ -1112,6 +1112,7 @@ static void igmpv3_add_delrec(struct in_device *in_dev, struct ip_mc_list *im) |
2913 | pmc = kzalloc(sizeof(*pmc), GFP_KERNEL); |
2914 | if (!pmc) |
2915 | return; |
2916 | + spin_lock_init(&pmc->lock); |
2917 | spin_lock_bh(&im->lock); |
2918 | pmc->interface = im->interface; |
2919 | in_dev_hold(in_dev); |
2920 | @@ -2071,21 +2072,26 @@ static int ip_mc_add_src(struct in_device *in_dev, __be32 *pmca, int sfmode, |
2921 | |
2922 | static void ip_mc_clear_src(struct ip_mc_list *pmc) |
2923 | { |
2924 | - struct ip_sf_list *psf, *nextpsf; |
2925 | + struct ip_sf_list *psf, *nextpsf, *tomb, *sources; |
2926 | |
2927 | - for (psf = pmc->tomb; psf; psf = nextpsf) { |
2928 | + spin_lock_bh(&pmc->lock); |
2929 | + tomb = pmc->tomb; |
2930 | + pmc->tomb = NULL; |
2931 | + sources = pmc->sources; |
2932 | + pmc->sources = NULL; |
2933 | + pmc->sfmode = MCAST_EXCLUDE; |
2934 | + pmc->sfcount[MCAST_INCLUDE] = 0; |
2935 | + pmc->sfcount[MCAST_EXCLUDE] = 1; |
2936 | + spin_unlock_bh(&pmc->lock); |
2937 | + |
2938 | + for (psf = tomb; psf; psf = nextpsf) { |
2939 | nextpsf = psf->sf_next; |
2940 | kfree(psf); |
2941 | } |
2942 | - pmc->tomb = NULL; |
2943 | - for (psf = pmc->sources; psf; psf = nextpsf) { |
2944 | + for (psf = sources; psf; psf = nextpsf) { |
2945 | nextpsf = psf->sf_next; |
2946 | kfree(psf); |
2947 | } |
2948 | - pmc->sources = NULL; |
2949 | - pmc->sfmode = MCAST_EXCLUDE; |
2950 | - pmc->sfcount[MCAST_INCLUDE] = 0; |
2951 | - pmc->sfcount[MCAST_EXCLUDE] = 1; |
2952 | } |
2953 | |
2954 | /* Join a multicast group |
2955 | diff --git a/net/ipv4/ip_tunnel.c b/net/ipv4/ip_tunnel.c |
2956 | index 823abaef006b..b2d1be55ca94 100644 |
2957 | --- a/net/ipv4/ip_tunnel.c |
2958 | +++ b/net/ipv4/ip_tunnel.c |
2959 | @@ -961,7 +961,6 @@ static void ip_tunnel_dev_free(struct net_device *dev) |
2960 | gro_cells_destroy(&tunnel->gro_cells); |
2961 | dst_cache_destroy(&tunnel->dst_cache); |
2962 | free_percpu(dev->tstats); |
2963 | - free_netdev(dev); |
2964 | } |
2965 | |
2966 | void ip_tunnel_dellink(struct net_device *dev, struct list_head *head) |
2967 | @@ -1148,7 +1147,8 @@ int ip_tunnel_init(struct net_device *dev) |
2968 | struct iphdr *iph = &tunnel->parms.iph; |
2969 | int err; |
2970 | |
2971 | - dev->destructor = ip_tunnel_dev_free; |
2972 | + dev->needs_free_netdev = true; |
2973 | + dev->priv_destructor = ip_tunnel_dev_free; |
2974 | dev->tstats = netdev_alloc_pcpu_stats(struct pcpu_sw_netstats); |
2975 | if (!dev->tstats) |
2976 | return -ENOMEM; |
2977 | diff --git a/net/ipv4/ipmr.c b/net/ipv4/ipmr.c |
2978 | index b036e85e093b..96c5681abb05 100644 |
2979 | --- a/net/ipv4/ipmr.c |
2980 | +++ b/net/ipv4/ipmr.c |
2981 | @@ -501,7 +501,7 @@ static void reg_vif_setup(struct net_device *dev) |
2982 | dev->mtu = ETH_DATA_LEN - sizeof(struct iphdr) - 8; |
2983 | dev->flags = IFF_NOARP; |
2984 | dev->netdev_ops = ®_vif_netdev_ops; |
2985 | - dev->destructor = free_netdev; |
2986 | + dev->needs_free_netdev = true; |
2987 | dev->features |= NETIF_F_NETNS_LOCAL; |
2988 | } |
2989 | |
2990 | diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c |
2991 | index 311f45641673..9725e8faf56d 100644 |
2992 | --- a/net/ipv6/addrconf.c |
2993 | +++ b/net/ipv6/addrconf.c |
2994 | @@ -328,9 +328,9 @@ static void addrconf_mod_rs_timer(struct inet6_dev *idev, |
2995 | static void addrconf_mod_dad_work(struct inet6_ifaddr *ifp, |
2996 | unsigned long delay) |
2997 | { |
2998 | - if (!delayed_work_pending(&ifp->dad_work)) |
2999 | - in6_ifa_hold(ifp); |
3000 | - mod_delayed_work(addrconf_wq, &ifp->dad_work, delay); |
3001 | + in6_ifa_hold(ifp); |
3002 | + if (mod_delayed_work(addrconf_wq, &ifp->dad_work, delay)) |
3003 | + in6_ifa_put(ifp); |
3004 | } |
3005 | |
3006 | static int snmp6_alloc_dev(struct inet6_dev *idev) |
3007 | diff --git a/net/ipv6/fib6_rules.c b/net/ipv6/fib6_rules.c |
3008 | index eea23b57c6a5..ec849d88a662 100644 |
3009 | --- a/net/ipv6/fib6_rules.c |
3010 | +++ b/net/ipv6/fib6_rules.c |
3011 | @@ -32,7 +32,6 @@ struct fib6_rule { |
3012 | struct dst_entry *fib6_rule_lookup(struct net *net, struct flowi6 *fl6, |
3013 | int flags, pol_lookup_t lookup) |
3014 | { |
3015 | - struct rt6_info *rt; |
3016 | struct fib_lookup_arg arg = { |
3017 | .lookup_ptr = lookup, |
3018 | .flags = FIB_LOOKUP_NOREF, |
3019 | @@ -44,21 +43,11 @@ struct dst_entry *fib6_rule_lookup(struct net *net, struct flowi6 *fl6, |
3020 | fib_rules_lookup(net->ipv6.fib6_rules_ops, |
3021 | flowi6_to_flowi(fl6), flags, &arg); |
3022 | |
3023 | - rt = arg.result; |
3024 | + if (arg.result) |
3025 | + return arg.result; |
3026 | |
3027 | - if (!rt) { |
3028 | - dst_hold(&net->ipv6.ip6_null_entry->dst); |
3029 | - return &net->ipv6.ip6_null_entry->dst; |
3030 | - } |
3031 | - |
3032 | - if (rt->rt6i_flags & RTF_REJECT && |
3033 | - rt->dst.error == -EAGAIN) { |
3034 | - ip6_rt_put(rt); |
3035 | - rt = net->ipv6.ip6_null_entry; |
3036 | - dst_hold(&rt->dst); |
3037 | - } |
3038 | - |
3039 | - return &rt->dst; |
3040 | + dst_hold(&net->ipv6.ip6_null_entry->dst); |
3041 | + return &net->ipv6.ip6_null_entry->dst; |
3042 | } |
3043 | |
3044 | static int fib6_rule_action(struct fib_rule *rule, struct flowi *flp, |
3045 | @@ -121,7 +110,8 @@ static int fib6_rule_action(struct fib_rule *rule, struct flowi *flp, |
3046 | flp6->saddr = saddr; |
3047 | } |
3048 | err = rt->dst.error; |
3049 | - goto out; |
3050 | + if (err != -EAGAIN) |
3051 | + goto out; |
3052 | } |
3053 | again: |
3054 | ip6_rt_put(rt); |
3055 | diff --git a/net/ipv6/icmp.c b/net/ipv6/icmp.c |
3056 | index 230b5aac9f03..8d7b113958b1 100644 |
3057 | --- a/net/ipv6/icmp.c |
3058 | +++ b/net/ipv6/icmp.c |
3059 | @@ -491,7 +491,7 @@ static void icmp6_send(struct sk_buff *skb, u8 type, u8 code, __u32 info, |
3060 | local_bh_disable(); |
3061 | |
3062 | /* Check global sysctl_icmp_msgs_per_sec ratelimit */ |
3063 | - if (!icmpv6_global_allow(type)) |
3064 | + if (!(skb->dev->flags&IFF_LOOPBACK) && !icmpv6_global_allow(type)) |
3065 | goto out_bh_enable; |
3066 | |
3067 | mip6_addr_swap(skb); |
3068 | diff --git a/net/ipv6/ip6_fib.c b/net/ipv6/ip6_fib.c |
3069 | index d4bf2c68a545..e6b78ba0e636 100644 |
3070 | --- a/net/ipv6/ip6_fib.c |
3071 | +++ b/net/ipv6/ip6_fib.c |
3072 | @@ -289,8 +289,7 @@ struct dst_entry *fib6_rule_lookup(struct net *net, struct flowi6 *fl6, |
3073 | struct rt6_info *rt; |
3074 | |
3075 | rt = lookup(net, net->ipv6.fib6_main_tbl, fl6, flags); |
3076 | - if (rt->rt6i_flags & RTF_REJECT && |
3077 | - rt->dst.error == -EAGAIN) { |
3078 | + if (rt->dst.error == -EAGAIN) { |
3079 | ip6_rt_put(rt); |
3080 | rt = net->ipv6.ip6_null_entry; |
3081 | dst_hold(&rt->dst); |
3082 | diff --git a/net/ipv6/ip6_gre.c b/net/ipv6/ip6_gre.c |
3083 | index 4d60164c17e2..0f1c24935b7a 100644 |
3084 | --- a/net/ipv6/ip6_gre.c |
3085 | +++ b/net/ipv6/ip6_gre.c |
3086 | @@ -986,13 +986,13 @@ static void ip6gre_dev_free(struct net_device *dev) |
3087 | |
3088 | dst_cache_destroy(&t->dst_cache); |
3089 | free_percpu(dev->tstats); |
3090 | - free_netdev(dev); |
3091 | } |
3092 | |
3093 | static void ip6gre_tunnel_setup(struct net_device *dev) |
3094 | { |
3095 | dev->netdev_ops = &ip6gre_netdev_ops; |
3096 | - dev->destructor = ip6gre_dev_free; |
3097 | + dev->needs_free_netdev = true; |
3098 | + dev->priv_destructor = ip6gre_dev_free; |
3099 | |
3100 | dev->type = ARPHRD_IP6GRE; |
3101 | |
3102 | @@ -1143,7 +1143,7 @@ static int __net_init ip6gre_init_net(struct net *net) |
3103 | return 0; |
3104 | |
3105 | err_reg_dev: |
3106 | - ip6gre_dev_free(ign->fb_tunnel_dev); |
3107 | + free_netdev(ign->fb_tunnel_dev); |
3108 | err_alloc_dev: |
3109 | return err; |
3110 | } |
3111 | @@ -1292,7 +1292,8 @@ static void ip6gre_tap_setup(struct net_device *dev) |
3112 | ether_setup(dev); |
3113 | |
3114 | dev->netdev_ops = &ip6gre_tap_netdev_ops; |
3115 | - dev->destructor = ip6gre_dev_free; |
3116 | + dev->needs_free_netdev = true; |
3117 | + dev->priv_destructor = ip6gre_dev_free; |
3118 | |
3119 | dev->features |= NETIF_F_NETNS_LOCAL; |
3120 | dev->priv_flags &= ~IFF_TX_SKB_SHARING; |
3121 | diff --git a/net/ipv6/ip6_tunnel.c b/net/ipv6/ip6_tunnel.c |
3122 | index e2d7867f3112..292f24c48c94 100644 |
3123 | --- a/net/ipv6/ip6_tunnel.c |
3124 | +++ b/net/ipv6/ip6_tunnel.c |
3125 | @@ -254,7 +254,6 @@ static void ip6_dev_free(struct net_device *dev) |
3126 | gro_cells_destroy(&t->gro_cells); |
3127 | dst_cache_destroy(&t->dst_cache); |
3128 | free_percpu(dev->tstats); |
3129 | - free_netdev(dev); |
3130 | } |
3131 | |
3132 | static int ip6_tnl_create2(struct net_device *dev) |
3133 | @@ -322,7 +321,7 @@ static struct ip6_tnl *ip6_tnl_create(struct net *net, struct __ip6_tnl_parm *p) |
3134 | return t; |
3135 | |
3136 | failed_free: |
3137 | - ip6_dev_free(dev); |
3138 | + free_netdev(dev); |
3139 | failed: |
3140 | return ERR_PTR(err); |
3141 | } |
3142 | @@ -1772,7 +1771,8 @@ static const struct net_device_ops ip6_tnl_netdev_ops = { |
3143 | static void ip6_tnl_dev_setup(struct net_device *dev) |
3144 | { |
3145 | dev->netdev_ops = &ip6_tnl_netdev_ops; |
3146 | - dev->destructor = ip6_dev_free; |
3147 | + dev->needs_free_netdev = true; |
3148 | + dev->priv_destructor = ip6_dev_free; |
3149 | |
3150 | dev->type = ARPHRD_TUNNEL6; |
3151 | dev->flags |= IFF_NOARP; |
3152 | @@ -2211,7 +2211,7 @@ static int __net_init ip6_tnl_init_net(struct net *net) |
3153 | return 0; |
3154 | |
3155 | err_register: |
3156 | - ip6_dev_free(ip6n->fb_tnl_dev); |
3157 | + free_netdev(ip6n->fb_tnl_dev); |
3158 | err_alloc_dev: |
3159 | return err; |
3160 | } |
3161 | diff --git a/net/ipv6/ip6_vti.c b/net/ipv6/ip6_vti.c |
3162 | index 3d8a3b63b4fd..5659f4a40f38 100644 |
3163 | --- a/net/ipv6/ip6_vti.c |
3164 | +++ b/net/ipv6/ip6_vti.c |
3165 | @@ -180,7 +180,6 @@ vti6_tnl_unlink(struct vti6_net *ip6n, struct ip6_tnl *t) |
3166 | static void vti6_dev_free(struct net_device *dev) |
3167 | { |
3168 | free_percpu(dev->tstats); |
3169 | - free_netdev(dev); |
3170 | } |
3171 | |
3172 | static int vti6_tnl_create2(struct net_device *dev) |
3173 | @@ -235,7 +234,7 @@ static struct ip6_tnl *vti6_tnl_create(struct net *net, struct __ip6_tnl_parm *p |
3174 | return t; |
3175 | |
3176 | failed_free: |
3177 | - vti6_dev_free(dev); |
3178 | + free_netdev(dev); |
3179 | failed: |
3180 | return NULL; |
3181 | } |
3182 | @@ -841,7 +840,8 @@ static const struct net_device_ops vti6_netdev_ops = { |
3183 | static void vti6_dev_setup(struct net_device *dev) |
3184 | { |
3185 | dev->netdev_ops = &vti6_netdev_ops; |
3186 | - dev->destructor = vti6_dev_free; |
3187 | + dev->needs_free_netdev = true; |
3188 | + dev->priv_destructor = vti6_dev_free; |
3189 | |
3190 | dev->type = ARPHRD_TUNNEL6; |
3191 | dev->hard_header_len = LL_MAX_HEADER + sizeof(struct ipv6hdr); |
3192 | @@ -1092,7 +1092,7 @@ static int __net_init vti6_init_net(struct net *net) |
3193 | return 0; |
3194 | |
3195 | err_register: |
3196 | - vti6_dev_free(ip6n->fb_tnl_dev); |
3197 | + free_netdev(ip6n->fb_tnl_dev); |
3198 | err_alloc_dev: |
3199 | return err; |
3200 | } |
3201 | diff --git a/net/ipv6/ip6mr.c b/net/ipv6/ip6mr.c |
3202 | index bf34d0950752..576fd9332235 100644 |
3203 | --- a/net/ipv6/ip6mr.c |
3204 | +++ b/net/ipv6/ip6mr.c |
3205 | @@ -733,7 +733,7 @@ static void reg_vif_setup(struct net_device *dev) |
3206 | dev->mtu = 1500 - sizeof(struct ipv6hdr) - 8; |
3207 | dev->flags = IFF_NOARP; |
3208 | dev->netdev_ops = ®_vif_netdev_ops; |
3209 | - dev->destructor = free_netdev; |
3210 | + dev->needs_free_netdev = true; |
3211 | dev->features |= NETIF_F_NETNS_LOCAL; |
3212 | } |
3213 | |
3214 | diff --git a/net/ipv6/proc.c b/net/ipv6/proc.c |
3215 | index cc8e3ae9ca73..e88bcb8ff0fd 100644 |
3216 | --- a/net/ipv6/proc.c |
3217 | +++ b/net/ipv6/proc.c |
3218 | @@ -219,7 +219,7 @@ static void snmp6_seq_show_item64(struct seq_file *seq, void __percpu *mib, |
3219 | u64 buff64[SNMP_MIB_MAX]; |
3220 | int i; |
3221 | |
3222 | - memset(buff64, 0, sizeof(unsigned long) * SNMP_MIB_MAX); |
3223 | + memset(buff64, 0, sizeof(u64) * SNMP_MIB_MAX); |
3224 | |
3225 | snmp_get_cpu_field64_batch(buff64, itemlist, mib, syncpoff); |
3226 | for (i = 0; itemlist[i].name; i++) |
3227 | diff --git a/net/ipv6/route.c b/net/ipv6/route.c |
3228 | index d316d00e11ab..1072fc189708 100644 |
3229 | --- a/net/ipv6/route.c |
3230 | +++ b/net/ipv6/route.c |
3231 | @@ -2804,6 +2804,7 @@ static int fib6_ifdown(struct rt6_info *rt, void *arg) |
3232 | if ((rt->dst.dev == dev || !dev) && |
3233 | rt != adn->net->ipv6.ip6_null_entry && |
3234 | (rt->rt6i_nsiblings == 0 || |
3235 | + (dev && netdev_unregistering(dev)) || |
3236 | !rt->rt6i_idev->cnf.ignore_routes_with_linkdown)) |
3237 | return -1; |
3238 | |
3239 | diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c |
3240 | index 99853c6e33a8..4f07a211ac2a 100644 |
3241 | --- a/net/ipv6/sit.c |
3242 | +++ b/net/ipv6/sit.c |
3243 | @@ -265,7 +265,7 @@ static struct ip_tunnel *ipip6_tunnel_locate(struct net *net, |
3244 | return nt; |
3245 | |
3246 | failed_free: |
3247 | - ipip6_dev_free(dev); |
3248 | + free_netdev(dev); |
3249 | failed: |
3250 | return NULL; |
3251 | } |
3252 | @@ -1333,7 +1333,6 @@ static void ipip6_dev_free(struct net_device *dev) |
3253 | |
3254 | dst_cache_destroy(&tunnel->dst_cache); |
3255 | free_percpu(dev->tstats); |
3256 | - free_netdev(dev); |
3257 | } |
3258 | |
3259 | #define SIT_FEATURES (NETIF_F_SG | \ |
3260 | @@ -1348,7 +1347,8 @@ static void ipip6_tunnel_setup(struct net_device *dev) |
3261 | int t_hlen = tunnel->hlen + sizeof(struct iphdr); |
3262 | |
3263 | dev->netdev_ops = &ipip6_netdev_ops; |
3264 | - dev->destructor = ipip6_dev_free; |
3265 | + dev->needs_free_netdev = true; |
3266 | + dev->priv_destructor = ipip6_dev_free; |
3267 | |
3268 | dev->type = ARPHRD_SIT; |
3269 | dev->hard_header_len = LL_MAX_HEADER + t_hlen; |
3270 | diff --git a/net/ipv6/xfrm6_input.c b/net/ipv6/xfrm6_input.c |
3271 | index 08a807b29298..3ef5d913e7a3 100644 |
3272 | --- a/net/ipv6/xfrm6_input.c |
3273 | +++ b/net/ipv6/xfrm6_input.c |
3274 | @@ -43,8 +43,8 @@ int xfrm6_transport_finish(struct sk_buff *skb, int async) |
3275 | return 1; |
3276 | #endif |
3277 | |
3278 | - ipv6_hdr(skb)->payload_len = htons(skb->len); |
3279 | __skb_push(skb, skb->data - skb_network_header(skb)); |
3280 | + ipv6_hdr(skb)->payload_len = htons(skb->len - sizeof(struct ipv6hdr)); |
3281 | |
3282 | if (xo && (xo->flags & XFRM_GRO)) { |
3283 | skb_mac_header_rebuild(skb); |
3284 | diff --git a/net/irda/irlan/irlan_eth.c b/net/irda/irlan/irlan_eth.c |
3285 | index 74d09f91709e..3be852808a9d 100644 |
3286 | --- a/net/irda/irlan/irlan_eth.c |
3287 | +++ b/net/irda/irlan/irlan_eth.c |
3288 | @@ -65,7 +65,7 @@ static void irlan_eth_setup(struct net_device *dev) |
3289 | ether_setup(dev); |
3290 | |
3291 | dev->netdev_ops = &irlan_eth_netdev_ops; |
3292 | - dev->destructor = free_netdev; |
3293 | + dev->needs_free_netdev = true; |
3294 | dev->min_mtu = 0; |
3295 | dev->max_mtu = ETH_MAX_MTU; |
3296 | |
3297 | diff --git a/net/key/af_key.c b/net/key/af_key.c |
3298 | index be8cecc65002..358175c83180 100644 |
3299 | --- a/net/key/af_key.c |
3300 | +++ b/net/key/af_key.c |
3301 | @@ -1157,6 +1157,7 @@ static struct xfrm_state * pfkey_msg2xfrm_state(struct net *net, |
3302 | goto out; |
3303 | } |
3304 | |
3305 | + err = -ENOBUFS; |
3306 | key = ext_hdrs[SADB_EXT_KEY_AUTH - 1]; |
3307 | if (sa->sadb_sa_auth) { |
3308 | int keysize = 0; |
3309 | @@ -1168,8 +1169,10 @@ static struct xfrm_state * pfkey_msg2xfrm_state(struct net *net, |
3310 | if (key) |
3311 | keysize = (key->sadb_key_bits + 7) / 8; |
3312 | x->aalg = kmalloc(sizeof(*x->aalg) + keysize, GFP_KERNEL); |
3313 | - if (!x->aalg) |
3314 | + if (!x->aalg) { |
3315 | + err = -ENOMEM; |
3316 | goto out; |
3317 | + } |
3318 | strcpy(x->aalg->alg_name, a->name); |
3319 | x->aalg->alg_key_len = 0; |
3320 | if (key) { |
3321 | @@ -1188,8 +1191,10 @@ static struct xfrm_state * pfkey_msg2xfrm_state(struct net *net, |
3322 | goto out; |
3323 | } |
3324 | x->calg = kmalloc(sizeof(*x->calg), GFP_KERNEL); |
3325 | - if (!x->calg) |
3326 | + if (!x->calg) { |
3327 | + err = -ENOMEM; |
3328 | goto out; |
3329 | + } |
3330 | strcpy(x->calg->alg_name, a->name); |
3331 | x->props.calgo = sa->sadb_sa_encrypt; |
3332 | } else { |
3333 | @@ -1203,8 +1208,10 @@ static struct xfrm_state * pfkey_msg2xfrm_state(struct net *net, |
3334 | if (key) |
3335 | keysize = (key->sadb_key_bits + 7) / 8; |
3336 | x->ealg = kmalloc(sizeof(*x->ealg) + keysize, GFP_KERNEL); |
3337 | - if (!x->ealg) |
3338 | + if (!x->ealg) { |
3339 | + err = -ENOMEM; |
3340 | goto out; |
3341 | + } |
3342 | strcpy(x->ealg->alg_name, a->name); |
3343 | x->ealg->alg_key_len = 0; |
3344 | if (key) { |
3345 | @@ -1249,8 +1256,10 @@ static struct xfrm_state * pfkey_msg2xfrm_state(struct net *net, |
3346 | struct xfrm_encap_tmpl *natt; |
3347 | |
3348 | x->encap = kmalloc(sizeof(*x->encap), GFP_KERNEL); |
3349 | - if (!x->encap) |
3350 | + if (!x->encap) { |
3351 | + err = -ENOMEM; |
3352 | goto out; |
3353 | + } |
3354 | |
3355 | natt = x->encap; |
3356 | n_type = ext_hdrs[SADB_X_EXT_NAT_T_TYPE-1]; |
3357 | @@ -2755,6 +2764,8 @@ static int pfkey_spdflush(struct sock *sk, struct sk_buff *skb, const struct sad |
3358 | int err, err2; |
3359 | |
3360 | err = xfrm_policy_flush(net, XFRM_POLICY_TYPE_MAIN, true); |
3361 | + if (!err) |
3362 | + xfrm_garbage_collect(net); |
3363 | err2 = unicast_flush_resp(sk, hdr); |
3364 | if (err || err2) { |
3365 | if (err == -ESRCH) /* empty table - old silent behavior */ |
3366 | diff --git a/net/l2tp/l2tp_eth.c b/net/l2tp/l2tp_eth.c |
3367 | index 6fd41d7afe1e..cafb667b3c85 100644 |
3368 | --- a/net/l2tp/l2tp_eth.c |
3369 | +++ b/net/l2tp/l2tp_eth.c |
3370 | @@ -133,7 +133,7 @@ static void l2tp_eth_dev_setup(struct net_device *dev) |
3371 | dev->priv_flags &= ~IFF_TX_SKB_SHARING; |
3372 | dev->features |= NETIF_F_LLTX; |
3373 | dev->netdev_ops = &l2tp_eth_netdev_ops; |
3374 | - dev->destructor = free_netdev; |
3375 | + dev->needs_free_netdev = true; |
3376 | } |
3377 | |
3378 | static void l2tp_eth_dev_recv(struct l2tp_session *session, struct sk_buff *skb, int data_len) |
3379 | diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c |
3380 | index 5bb0c5012819..8f783d527f29 100644 |
3381 | --- a/net/mac80211/iface.c |
3382 | +++ b/net/mac80211/iface.c |
3383 | @@ -1198,7 +1198,6 @@ static const struct net_device_ops ieee80211_monitorif_ops = { |
3384 | static void ieee80211_if_free(struct net_device *dev) |
3385 | { |
3386 | free_percpu(dev->tstats); |
3387 | - free_netdev(dev); |
3388 | } |
3389 | |
3390 | static void ieee80211_if_setup(struct net_device *dev) |
3391 | @@ -1206,7 +1205,8 @@ static void ieee80211_if_setup(struct net_device *dev) |
3392 | ether_setup(dev); |
3393 | dev->priv_flags &= ~IFF_TX_SKB_SHARING; |
3394 | dev->netdev_ops = &ieee80211_dataif_ops; |
3395 | - dev->destructor = ieee80211_if_free; |
3396 | + dev->needs_free_netdev = true; |
3397 | + dev->priv_destructor = ieee80211_if_free; |
3398 | } |
3399 | |
3400 | static void ieee80211_if_setup_no_queue(struct net_device *dev) |
3401 | @@ -1810,6 +1810,7 @@ int ieee80211_if_add(struct ieee80211_local *local, const char *name, |
3402 | ret = dev_alloc_name(ndev, ndev->name); |
3403 | if (ret < 0) { |
3404 | ieee80211_if_free(ndev); |
3405 | + free_netdev(ndev); |
3406 | return ret; |
3407 | } |
3408 | |
3409 | @@ -1899,7 +1900,7 @@ int ieee80211_if_add(struct ieee80211_local *local, const char *name, |
3410 | |
3411 | ret = register_netdevice(ndev); |
3412 | if (ret) { |
3413 | - ieee80211_if_free(ndev); |
3414 | + free_netdev(ndev); |
3415 | return ret; |
3416 | } |
3417 | } |
3418 | diff --git a/net/mac802154/iface.c b/net/mac802154/iface.c |
3419 | index 06019dba4b10..bd88a9b80773 100644 |
3420 | --- a/net/mac802154/iface.c |
3421 | +++ b/net/mac802154/iface.c |
3422 | @@ -526,8 +526,6 @@ static void mac802154_wpan_free(struct net_device *dev) |
3423 | struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev); |
3424 | |
3425 | mac802154_llsec_destroy(&sdata->sec); |
3426 | - |
3427 | - free_netdev(dev); |
3428 | } |
3429 | |
3430 | static void ieee802154_if_setup(struct net_device *dev) |
3431 | @@ -593,7 +591,8 @@ ieee802154_setup_sdata(struct ieee802154_sub_if_data *sdata, |
3432 | sdata->dev->dev_addr); |
3433 | |
3434 | sdata->dev->header_ops = &mac802154_header_ops; |
3435 | - sdata->dev->destructor = mac802154_wpan_free; |
3436 | + sdata->dev->needs_free_netdev = true; |
3437 | + sdata->dev->priv_destructor = mac802154_wpan_free; |
3438 | sdata->dev->netdev_ops = &mac802154_wpan_ops; |
3439 | sdata->dev->ml_priv = &mac802154_mlme_wpan; |
3440 | wpan_dev->promiscuous_mode = false; |
3441 | @@ -608,7 +607,7 @@ ieee802154_setup_sdata(struct ieee802154_sub_if_data *sdata, |
3442 | |
3443 | break; |
3444 | case NL802154_IFTYPE_MONITOR: |
3445 | - sdata->dev->destructor = free_netdev; |
3446 | + sdata->dev->needs_free_netdev = true; |
3447 | sdata->dev->netdev_ops = &mac802154_monitor_ops; |
3448 | wpan_dev->promiscuous_mode = true; |
3449 | break; |
3450 | diff --git a/net/netfilter/nf_conntrack_netlink.c b/net/netfilter/nf_conntrack_netlink.c |
3451 | index dc7dfd68fafe..8555659d2e07 100644 |
3452 | --- a/net/netfilter/nf_conntrack_netlink.c |
3453 | +++ b/net/netfilter/nf_conntrack_netlink.c |
3454 | @@ -45,6 +45,8 @@ |
3455 | #include <net/netfilter/nf_conntrack_zones.h> |
3456 | #include <net/netfilter/nf_conntrack_timestamp.h> |
3457 | #include <net/netfilter/nf_conntrack_labels.h> |
3458 | +#include <net/netfilter/nf_conntrack_seqadj.h> |
3459 | +#include <net/netfilter/nf_conntrack_synproxy.h> |
3460 | #ifdef CONFIG_NF_NAT_NEEDED |
3461 | #include <net/netfilter/nf_nat_core.h> |
3462 | #include <net/netfilter/nf_nat_l4proto.h> |
3463 | @@ -1814,6 +1816,8 @@ ctnetlink_create_conntrack(struct net *net, |
3464 | nf_ct_tstamp_ext_add(ct, GFP_ATOMIC); |
3465 | nf_ct_ecache_ext_add(ct, 0, 0, GFP_ATOMIC); |
3466 | nf_ct_labels_ext_add(ct); |
3467 | + nfct_seqadj_ext_add(ct); |
3468 | + nfct_synproxy_ext_add(ct); |
3469 | |
3470 | /* we must add conntrack extensions before confirmation. */ |
3471 | ct->status |= IPS_CONFIRMED; |
3472 | diff --git a/net/openvswitch/vport-internal_dev.c b/net/openvswitch/vport-internal_dev.c |
3473 | index 89193a634da4..04a3128adcf0 100644 |
3474 | --- a/net/openvswitch/vport-internal_dev.c |
3475 | +++ b/net/openvswitch/vport-internal_dev.c |
3476 | @@ -94,7 +94,6 @@ static void internal_dev_destructor(struct net_device *dev) |
3477 | struct vport *vport = ovs_internal_dev_get_vport(dev); |
3478 | |
3479 | ovs_vport_free(vport); |
3480 | - free_netdev(dev); |
3481 | } |
3482 | |
3483 | static void |
3484 | @@ -156,7 +155,8 @@ static void do_setup(struct net_device *netdev) |
3485 | netdev->priv_flags &= ~IFF_TX_SKB_SHARING; |
3486 | netdev->priv_flags |= IFF_LIVE_ADDR_CHANGE | IFF_OPENVSWITCH | |
3487 | IFF_PHONY_HEADROOM | IFF_NO_QUEUE; |
3488 | - netdev->destructor = internal_dev_destructor; |
3489 | + netdev->needs_free_netdev = true; |
3490 | + netdev->priv_destructor = internal_dev_destructor; |
3491 | netdev->ethtool_ops = &internal_dev_ethtool_ops; |
3492 | netdev->rtnl_link_ops = &internal_dev_link_ops; |
3493 | |
3494 | diff --git a/net/phonet/pep-gprs.c b/net/phonet/pep-gprs.c |
3495 | index 21c28b51be94..2c9337946e30 100644 |
3496 | --- a/net/phonet/pep-gprs.c |
3497 | +++ b/net/phonet/pep-gprs.c |
3498 | @@ -236,7 +236,7 @@ static void gprs_setup(struct net_device *dev) |
3499 | dev->tx_queue_len = 10; |
3500 | |
3501 | dev->netdev_ops = &gprs_netdev_ops; |
3502 | - dev->destructor = free_netdev; |
3503 | + dev->needs_free_netdev = true; |
3504 | } |
3505 | |
3506 | /* |
3507 | diff --git a/net/sctp/socket.c b/net/sctp/socket.c |
3508 | index d9d4c92e06b3..74f761022450 100644 |
3509 | --- a/net/sctp/socket.c |
3510 | +++ b/net/sctp/socket.c |
3511 | @@ -4586,13 +4586,13 @@ int sctp_for_each_endpoint(int (*cb)(struct sctp_endpoint *, void *), |
3512 | |
3513 | for (head = sctp_ep_hashtable; hash < sctp_ep_hashsize; |
3514 | hash++, head++) { |
3515 | - read_lock(&head->lock); |
3516 | + read_lock_bh(&head->lock); |
3517 | sctp_for_each_hentry(epb, &head->chain) { |
3518 | err = cb(sctp_ep(epb), p); |
3519 | if (err) |
3520 | break; |
3521 | } |
3522 | - read_unlock(&head->lock); |
3523 | + read_unlock_bh(&head->lock); |
3524 | } |
3525 | |
3526 | return err; |
3527 | @@ -4630,9 +4630,8 @@ int sctp_for_each_transport(int (*cb)(struct sctp_transport *, void *), |
3528 | if (err) |
3529 | return err; |
3530 | |
3531 | - sctp_transport_get_idx(net, &hti, pos); |
3532 | - obj = sctp_transport_get_next(net, &hti); |
3533 | - for (; obj && !IS_ERR(obj); obj = sctp_transport_get_next(net, &hti)) { |
3534 | + obj = sctp_transport_get_idx(net, &hti, pos + 1); |
3535 | + for (; !IS_ERR_OR_NULL(obj); obj = sctp_transport_get_next(net, &hti)) { |
3536 | struct sctp_transport *transport = obj; |
3537 | |
3538 | if (!sctp_transport_hold(transport)) |
3539 | diff --git a/net/tipc/msg.c b/net/tipc/msg.c |
3540 | index 312ef7de57d7..ab3087687a32 100644 |
3541 | --- a/net/tipc/msg.c |
3542 | +++ b/net/tipc/msg.c |
3543 | @@ -508,7 +508,7 @@ bool tipc_msg_reverse(u32 own_node, struct sk_buff **skb, int err) |
3544 | } |
3545 | |
3546 | if (skb_cloned(_skb) && |
3547 | - pskb_expand_head(_skb, BUF_HEADROOM, BUF_TAILROOM, GFP_KERNEL)) |
3548 | + pskb_expand_head(_skb, BUF_HEADROOM, BUF_TAILROOM, GFP_ATOMIC)) |
3549 | goto exit; |
3550 | |
3551 | /* Now reverse the concerned fields */ |
3552 | diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c |
3553 | index 928691c43408..475e1170597c 100644 |
3554 | --- a/net/unix/af_unix.c |
3555 | +++ b/net/unix/af_unix.c |
3556 | @@ -999,7 +999,8 @@ static int unix_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) |
3557 | struct path path = { NULL, NULL }; |
3558 | |
3559 | err = -EINVAL; |
3560 | - if (sunaddr->sun_family != AF_UNIX) |
3561 | + if (addr_len < offsetofend(struct sockaddr_un, sun_family) || |
3562 | + sunaddr->sun_family != AF_UNIX) |
3563 | goto out; |
3564 | |
3565 | if (addr_len == sizeof(short)) { |
3566 | @@ -1110,6 +1111,10 @@ static int unix_dgram_connect(struct socket *sock, struct sockaddr *addr, |
3567 | unsigned int hash; |
3568 | int err; |
3569 | |
3570 | + err = -EINVAL; |
3571 | + if (alen < offsetofend(struct sockaddr, sa_family)) |
3572 | + goto out; |
3573 | + |
3574 | if (addr->sa_family != AF_UNSPEC) { |
3575 | err = unix_mkname(sunaddr, alen, &hash); |
3576 | if (err < 0) |
3577 | diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c |
3578 | index dfc77b9c5e5a..56fba8f073f5 100644 |
3579 | --- a/net/xfrm/xfrm_policy.c |
3580 | +++ b/net/xfrm/xfrm_policy.c |
3581 | @@ -1006,10 +1006,6 @@ int xfrm_policy_flush(struct net *net, u8 type, bool task_valid) |
3582 | err = -ESRCH; |
3583 | out: |
3584 | spin_unlock_bh(&net->xfrm.xfrm_policy_lock); |
3585 | - |
3586 | - if (cnt) |
3587 | - xfrm_garbage_collect(net); |
3588 | - |
3589 | return err; |
3590 | } |
3591 | EXPORT_SYMBOL(xfrm_policy_flush); |
3592 | @@ -1797,43 +1793,6 @@ static struct dst_entry *xfrm_bundle_create(struct xfrm_policy *policy, |
3593 | goto out; |
3594 | } |
3595 | |
3596 | -#ifdef CONFIG_XFRM_SUB_POLICY |
3597 | -static int xfrm_dst_alloc_copy(void **target, const void *src, int size) |
3598 | -{ |
3599 | - if (!*target) { |
3600 | - *target = kmalloc(size, GFP_ATOMIC); |
3601 | - if (!*target) |
3602 | - return -ENOMEM; |
3603 | - } |
3604 | - |
3605 | - memcpy(*target, src, size); |
3606 | - return 0; |
3607 | -} |
3608 | -#endif |
3609 | - |
3610 | -static int xfrm_dst_update_parent(struct dst_entry *dst, |
3611 | - const struct xfrm_selector *sel) |
3612 | -{ |
3613 | -#ifdef CONFIG_XFRM_SUB_POLICY |
3614 | - struct xfrm_dst *xdst = (struct xfrm_dst *)dst; |
3615 | - return xfrm_dst_alloc_copy((void **)&(xdst->partner), |
3616 | - sel, sizeof(*sel)); |
3617 | -#else |
3618 | - return 0; |
3619 | -#endif |
3620 | -} |
3621 | - |
3622 | -static int xfrm_dst_update_origin(struct dst_entry *dst, |
3623 | - const struct flowi *fl) |
3624 | -{ |
3625 | -#ifdef CONFIG_XFRM_SUB_POLICY |
3626 | - struct xfrm_dst *xdst = (struct xfrm_dst *)dst; |
3627 | - return xfrm_dst_alloc_copy((void **)&(xdst->origin), fl, sizeof(*fl)); |
3628 | -#else |
3629 | - return 0; |
3630 | -#endif |
3631 | -} |
3632 | - |
3633 | static int xfrm_expand_policies(const struct flowi *fl, u16 family, |
3634 | struct xfrm_policy **pols, |
3635 | int *num_pols, int *num_xfrms) |
3636 | @@ -1905,16 +1864,6 @@ xfrm_resolve_and_create_bundle(struct xfrm_policy **pols, int num_pols, |
3637 | |
3638 | xdst = (struct xfrm_dst *)dst; |
3639 | xdst->num_xfrms = err; |
3640 | - if (num_pols > 1) |
3641 | - err = xfrm_dst_update_parent(dst, &pols[1]->selector); |
3642 | - else |
3643 | - err = xfrm_dst_update_origin(dst, fl); |
3644 | - if (unlikely(err)) { |
3645 | - dst_free(dst); |
3646 | - XFRM_INC_STATS(net, LINUX_MIB_XFRMOUTBUNDLECHECKERROR); |
3647 | - return ERR_PTR(err); |
3648 | - } |
3649 | - |
3650 | xdst->num_pols = num_pols; |
3651 | memcpy(xdst->pols, pols, sizeof(struct xfrm_policy *) * num_pols); |
3652 | xdst->policy_genid = atomic_read(&pols[0]->genid); |
3653 | diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c |
3654 | index 40a8aa39220d..66698552fbd6 100644 |
3655 | --- a/net/xfrm/xfrm_user.c |
3656 | +++ b/net/xfrm/xfrm_user.c |
3657 | @@ -1999,6 +1999,7 @@ static int xfrm_flush_policy(struct sk_buff *skb, struct nlmsghdr *nlh, |
3658 | return 0; |
3659 | return err; |
3660 | } |
3661 | + xfrm_garbage_collect(net); |
3662 | |
3663 | c.data.type = type; |
3664 | c.event = nlh->nlmsg_type; |
3665 | diff --git a/sound/pci/hda/hda_codec.h b/sound/pci/hda/hda_codec.h |
3666 | index f17f25245e52..a206320b8eea 100644 |
3667 | --- a/sound/pci/hda/hda_codec.h |
3668 | +++ b/sound/pci/hda/hda_codec.h |
3669 | @@ -294,6 +294,8 @@ struct hda_codec { |
3670 | |
3671 | #define list_for_each_codec(c, bus) \ |
3672 | list_for_each_entry(c, &(bus)->core.codec_list, core.list) |
3673 | +#define list_for_each_codec_safe(c, n, bus) \ |
3674 | + list_for_each_entry_safe(c, n, &(bus)->core.codec_list, core.list) |
3675 | |
3676 | /* snd_hda_codec_read/write optional flags */ |
3677 | #define HDA_RW_NO_RESPONSE_FALLBACK (1 << 0) |
3678 | diff --git a/sound/pci/hda/hda_controller.c b/sound/pci/hda/hda_controller.c |
3679 | index 3715a5725613..1c60beb5b70a 100644 |
3680 | --- a/sound/pci/hda/hda_controller.c |
3681 | +++ b/sound/pci/hda/hda_controller.c |
3682 | @@ -1337,8 +1337,12 @@ EXPORT_SYMBOL_GPL(azx_probe_codecs); |
3683 | /* configure each codec instance */ |
3684 | int azx_codec_configure(struct azx *chip) |
3685 | { |
3686 | - struct hda_codec *codec; |
3687 | - list_for_each_codec(codec, &chip->bus) { |
3688 | + struct hda_codec *codec, *next; |
3689 | + |
3690 | + /* use _safe version here since snd_hda_codec_configure() deregisters |
3691 | + * the device upon error and deletes itself from the bus list. |
3692 | + */ |
3693 | + list_for_each_codec_safe(codec, next, &chip->bus) { |
3694 | snd_hda_codec_configure(codec); |
3695 | } |
3696 | return 0; |
3697 | diff --git a/sound/pci/hda/hda_generic.c b/sound/pci/hda/hda_generic.c |
3698 | index e7c8f4f076d5..b0bd29003b5d 100644 |
3699 | --- a/sound/pci/hda/hda_generic.c |
3700 | +++ b/sound/pci/hda/hda_generic.c |
3701 | @@ -3169,6 +3169,7 @@ static int check_dyn_adc_switch(struct hda_codec *codec) |
3702 | spec->input_paths[i][nums]); |
3703 | spec->input_paths[i][nums] = |
3704 | spec->input_paths[i][n]; |
3705 | + spec->input_paths[i][n] = 0; |
3706 | } |
3707 | } |
3708 | nums++; |
3709 | diff --git a/tools/arch/x86/lib/memcpy_64.S b/tools/arch/x86/lib/memcpy_64.S |
3710 | index 49e6ebac7e73..98dcc112b363 100644 |
3711 | --- a/tools/arch/x86/lib/memcpy_64.S |
3712 | +++ b/tools/arch/x86/lib/memcpy_64.S |
3713 | @@ -286,7 +286,7 @@ ENDPROC(memcpy_mcsafe_unrolled) |
3714 | _ASM_EXTABLE_FAULT(.L_copy_leading_bytes, .L_memcpy_mcsafe_fail) |
3715 | _ASM_EXTABLE_FAULT(.L_cache_w0, .L_memcpy_mcsafe_fail) |
3716 | _ASM_EXTABLE_FAULT(.L_cache_w1, .L_memcpy_mcsafe_fail) |
3717 | - _ASM_EXTABLE_FAULT(.L_cache_w3, .L_memcpy_mcsafe_fail) |
3718 | + _ASM_EXTABLE_FAULT(.L_cache_w2, .L_memcpy_mcsafe_fail) |
3719 | _ASM_EXTABLE_FAULT(.L_cache_w3, .L_memcpy_mcsafe_fail) |
3720 | _ASM_EXTABLE_FAULT(.L_cache_w4, .L_memcpy_mcsafe_fail) |
3721 | _ASM_EXTABLE_FAULT(.L_cache_w5, .L_memcpy_mcsafe_fail) |