Annotation of /trunk/kernel-alx/patches-4.9/0262-4.9.163-all-fixes.patch
Parent Directory | Revision Log
Revision 3322 -
(hide annotations)
(download)
Thu Mar 14 15:04:22 2019 UTC (5 years, 6 months ago) by niro
File size: 118013 byte(s)
Thu Mar 14 15:04:22 2019 UTC (5 years, 6 months ago) by niro
File size: 118013 byte(s)
-linux-4.9.163
1 | niro | 3322 | diff --git a/Makefile b/Makefile |
2 | index fce163d09139..8a5330e279ad 100644 | ||
3 | --- a/Makefile | ||
4 | +++ b/Makefile | ||
5 | @@ -1,6 +1,6 @@ | ||
6 | VERSION = 4 | ||
7 | PATCHLEVEL = 9 | ||
8 | -SUBLEVEL = 162 | ||
9 | +SUBLEVEL = 163 | ||
10 | EXTRAVERSION = | ||
11 | NAME = Roaring Lionus | ||
12 | |||
13 | diff --git a/arch/arm/boot/dts/exynos3250.dtsi b/arch/arm/boot/dts/exynos3250.dtsi | ||
14 | index 2a531beef4c7..51dbd8cb91cb 100644 | ||
15 | --- a/arch/arm/boot/dts/exynos3250.dtsi | ||
16 | +++ b/arch/arm/boot/dts/exynos3250.dtsi | ||
17 | @@ -170,6 +170,9 @@ | ||
18 | interrupt-controller; | ||
19 | #interrupt-cells = <3>; | ||
20 | interrupt-parent = <&gic>; | ||
21 | + clock-names = "clkout8"; | ||
22 | + clocks = <&cmu CLK_FIN_PLL>; | ||
23 | + #clock-cells = <1>; | ||
24 | }; | ||
25 | |||
26 | mipi_phy: video-phy { | ||
27 | diff --git a/arch/arm/boot/dts/exynos4412-odroid-common.dtsi b/arch/arm/boot/dts/exynos4412-odroid-common.dtsi | ||
28 | index 5282d69e55bd..2d83cbf672b2 100644 | ||
29 | --- a/arch/arm/boot/dts/exynos4412-odroid-common.dtsi | ||
30 | +++ b/arch/arm/boot/dts/exynos4412-odroid-common.dtsi | ||
31 | @@ -70,7 +70,7 @@ | ||
32 | }; | ||
33 | |||
34 | emmc_pwrseq: pwrseq { | ||
35 | - pinctrl-0 = <&sd1_cd>; | ||
36 | + pinctrl-0 = <&emmc_rstn>; | ||
37 | pinctrl-names = "default"; | ||
38 | compatible = "mmc-pwrseq-emmc"; | ||
39 | reset-gpios = <&gpk1 2 GPIO_ACTIVE_LOW>; | ||
40 | @@ -161,12 +161,6 @@ | ||
41 | cpu0-supply = <&buck2_reg>; | ||
42 | }; | ||
43 | |||
44 | -/* RSTN signal for eMMC */ | ||
45 | -&sd1_cd { | ||
46 | - samsung,pin-pud = <EXYNOS_PIN_PULL_NONE>; | ||
47 | - samsung,pin-drv = <EXYNOS4_PIN_DRV_LV1>; | ||
48 | -}; | ||
49 | - | ||
50 | &pinctrl_1 { | ||
51 | gpio_power_key: power_key { | ||
52 | samsung,pins = "gpx1-3"; | ||
53 | @@ -184,6 +178,11 @@ | ||
54 | samsung,pins = "gpx3-7"; | ||
55 | samsung,pin-pud = <EXYNOS_PIN_PULL_DOWN>; | ||
56 | }; | ||
57 | + | ||
58 | + emmc_rstn: emmc-rstn { | ||
59 | + samsung,pins = "gpk1-2"; | ||
60 | + samsung,pin-pud = <EXYNOS_PIN_PULL_NONE>; | ||
61 | + }; | ||
62 | }; | ||
63 | |||
64 | &ehci { | ||
65 | diff --git a/arch/arm/boot/dts/exynos5420-tmu-sensor-conf.dtsi b/arch/arm/boot/dts/exynos5420-tmu-sensor-conf.dtsi | ||
66 | new file mode 100644 | ||
67 | index 000000000000..c8771c660550 | ||
68 | --- /dev/null | ||
69 | +++ b/arch/arm/boot/dts/exynos5420-tmu-sensor-conf.dtsi | ||
70 | @@ -0,0 +1,25 @@ | ||
71 | +/* | ||
72 | + * Device tree sources for Exynos5420 TMU sensor configuration | ||
73 | + * | ||
74 | + * Copyright (c) 2014 Lukasz Majewski <l.majewski@samsung.com> | ||
75 | + * Copyright (c) 2017 Krzysztof Kozlowski <krzk@kernel.org> | ||
76 | + * | ||
77 | + * This program is free software; you can redistribute it and/or modify | ||
78 | + * it under the terms of the GNU General Public License version 2 as | ||
79 | + * published by the Free Software Foundation. | ||
80 | + * | ||
81 | + */ | ||
82 | + | ||
83 | +#include <dt-bindings/thermal/thermal_exynos.h> | ||
84 | + | ||
85 | +#thermal-sensor-cells = <0>; | ||
86 | +samsung,tmu_gain = <8>; | ||
87 | +samsung,tmu_reference_voltage = <16>; | ||
88 | +samsung,tmu_noise_cancel_mode = <4>; | ||
89 | +samsung,tmu_efuse_value = <55>; | ||
90 | +samsung,tmu_min_efuse_value = <0>; | ||
91 | +samsung,tmu_max_efuse_value = <100>; | ||
92 | +samsung,tmu_first_point_trim = <25>; | ||
93 | +samsung,tmu_second_point_trim = <85>; | ||
94 | +samsung,tmu_default_temp_offset = <50>; | ||
95 | +samsung,tmu_cal_type = <TYPE_ONE_POINT_TRIMMING>; | ||
96 | diff --git a/arch/arm/boot/dts/exynos5420.dtsi b/arch/arm/boot/dts/exynos5420.dtsi | ||
97 | index 00c4cfa54839..52f3d911f67f 100644 | ||
98 | --- a/arch/arm/boot/dts/exynos5420.dtsi | ||
99 | +++ b/arch/arm/boot/dts/exynos5420.dtsi | ||
100 | @@ -694,7 +694,7 @@ | ||
101 | interrupts = <0 65 0>; | ||
102 | clocks = <&clock CLK_TMU>; | ||
103 | clock-names = "tmu_apbif"; | ||
104 | - #include "exynos4412-tmu-sensor-conf.dtsi" | ||
105 | + #include "exynos5420-tmu-sensor-conf.dtsi" | ||
106 | }; | ||
107 | |||
108 | tmu_cpu1: tmu@10064000 { | ||
109 | @@ -703,7 +703,7 @@ | ||
110 | interrupts = <0 183 0>; | ||
111 | clocks = <&clock CLK_TMU>; | ||
112 | clock-names = "tmu_apbif"; | ||
113 | - #include "exynos4412-tmu-sensor-conf.dtsi" | ||
114 | + #include "exynos5420-tmu-sensor-conf.dtsi" | ||
115 | }; | ||
116 | |||
117 | tmu_cpu2: tmu@10068000 { | ||
118 | @@ -712,7 +712,7 @@ | ||
119 | interrupts = <0 184 0>; | ||
120 | clocks = <&clock CLK_TMU>, <&clock CLK_TMU>; | ||
121 | clock-names = "tmu_apbif", "tmu_triminfo_apbif"; | ||
122 | - #include "exynos4412-tmu-sensor-conf.dtsi" | ||
123 | + #include "exynos5420-tmu-sensor-conf.dtsi" | ||
124 | }; | ||
125 | |||
126 | tmu_cpu3: tmu@1006c000 { | ||
127 | @@ -721,7 +721,7 @@ | ||
128 | interrupts = <0 185 0>; | ||
129 | clocks = <&clock CLK_TMU>, <&clock CLK_TMU_GPU>; | ||
130 | clock-names = "tmu_apbif", "tmu_triminfo_apbif"; | ||
131 | - #include "exynos4412-tmu-sensor-conf.dtsi" | ||
132 | + #include "exynos5420-tmu-sensor-conf.dtsi" | ||
133 | }; | ||
134 | |||
135 | tmu_gpu: tmu@100a0000 { | ||
136 | @@ -730,7 +730,7 @@ | ||
137 | interrupts = <0 215 0>; | ||
138 | clocks = <&clock CLK_TMU_GPU>, <&clock CLK_TMU>; | ||
139 | clock-names = "tmu_apbif", "tmu_triminfo_apbif"; | ||
140 | - #include "exynos4412-tmu-sensor-conf.dtsi" | ||
141 | + #include "exynos5420-tmu-sensor-conf.dtsi" | ||
142 | }; | ||
143 | |||
144 | sysmmu_g2dr: sysmmu@0x10A60000 { | ||
145 | diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S | ||
146 | index 56be67ecf0fa..d69adfb3d79e 100644 | ||
147 | --- a/arch/arm/kernel/entry-common.S | ||
148 | +++ b/arch/arm/kernel/entry-common.S | ||
149 | @@ -32,6 +32,7 @@ | ||
150 | * features make this path too inefficient. | ||
151 | */ | ||
152 | ret_fast_syscall: | ||
153 | +__ret_fast_syscall: | ||
154 | UNWIND(.fnstart ) | ||
155 | UNWIND(.cantunwind ) | ||
156 | disable_irq_notrace @ disable interrupts | ||
157 | @@ -57,6 +58,7 @@ fast_work_pending: | ||
158 | * r0 first to avoid needing to save registers around each C function call. | ||
159 | */ | ||
160 | ret_fast_syscall: | ||
161 | +__ret_fast_syscall: | ||
162 | UNWIND(.fnstart ) | ||
163 | UNWIND(.cantunwind ) | ||
164 | str r0, [sp, #S_R0 + S_OFF]! @ save returned r0 | ||
165 | @@ -223,7 +225,7 @@ local_restart: | ||
166 | tst r10, #_TIF_SYSCALL_WORK @ are we tracing syscalls? | ||
167 | bne __sys_trace | ||
168 | |||
169 | - invoke_syscall tbl, scno, r10, ret_fast_syscall | ||
170 | + invoke_syscall tbl, scno, r10, __ret_fast_syscall | ||
171 | |||
172 | add r1, sp, #S_OFF | ||
173 | 2: cmp scno, #(__ARM_NR_BASE - __NR_SYSCALL_BASE) | ||
174 | diff --git a/arch/arm/plat-pxa/ssp.c b/arch/arm/plat-pxa/ssp.c | ||
175 | index ba13f793fbce..b92673efffff 100644 | ||
176 | --- a/arch/arm/plat-pxa/ssp.c | ||
177 | +++ b/arch/arm/plat-pxa/ssp.c | ||
178 | @@ -237,8 +237,6 @@ static int pxa_ssp_remove(struct platform_device *pdev) | ||
179 | if (ssp == NULL) | ||
180 | return -ENODEV; | ||
181 | |||
182 | - iounmap(ssp->mmio_base); | ||
183 | - | ||
184 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
185 | release_mem_region(res->start, resource_size(res)); | ||
186 | |||
187 | @@ -248,7 +246,6 @@ static int pxa_ssp_remove(struct platform_device *pdev) | ||
188 | list_del(&ssp->node); | ||
189 | mutex_unlock(&ssp_lock); | ||
190 | |||
191 | - kfree(ssp); | ||
192 | return 0; | ||
193 | } | ||
194 | |||
195 | diff --git a/arch/arm64/boot/dts/qcom/msm8996.dtsi b/arch/arm64/boot/dts/qcom/msm8996.dtsi | ||
196 | index 2c93de7fffe5..bdea2d6fde94 100644 | ||
197 | --- a/arch/arm64/boot/dts/qcom/msm8996.dtsi | ||
198 | +++ b/arch/arm64/boot/dts/qcom/msm8996.dtsi | ||
199 | @@ -219,7 +219,7 @@ | ||
200 | compatible = "simple-bus"; | ||
201 | |||
202 | intc: interrupt-controller@9bc0000 { | ||
203 | - compatible = "arm,gic-v3"; | ||
204 | + compatible = "qcom,msm8996-gic-v3", "arm,gic-v3"; | ||
205 | #interrupt-cells = <3>; | ||
206 | interrupt-controller; | ||
207 | #redistributor-regions = <1>; | ||
208 | diff --git a/arch/arm64/kernel/probes/kprobes.c b/arch/arm64/kernel/probes/kprobes.c | ||
209 | index 30bcae0aef2a..d2b1b624ddc3 100644 | ||
210 | --- a/arch/arm64/kernel/probes/kprobes.c | ||
211 | +++ b/arch/arm64/kernel/probes/kprobes.c | ||
212 | @@ -546,13 +546,13 @@ bool arch_within_kprobe_blacklist(unsigned long addr) | ||
213 | addr < (unsigned long)__entry_text_end) || | ||
214 | (addr >= (unsigned long)__idmap_text_start && | ||
215 | addr < (unsigned long)__idmap_text_end) || | ||
216 | + (addr >= (unsigned long)__hyp_text_start && | ||
217 | + addr < (unsigned long)__hyp_text_end) || | ||
218 | !!search_exception_tables(addr)) | ||
219 | return true; | ||
220 | |||
221 | if (!is_kernel_in_hyp_mode()) { | ||
222 | - if ((addr >= (unsigned long)__hyp_text_start && | ||
223 | - addr < (unsigned long)__hyp_text_end) || | ||
224 | - (addr >= (unsigned long)__hyp_idmap_text_start && | ||
225 | + if ((addr >= (unsigned long)__hyp_idmap_text_start && | ||
226 | addr < (unsigned long)__hyp_idmap_text_end)) | ||
227 | return true; | ||
228 | } | ||
229 | diff --git a/arch/mips/kernel/irq.c b/arch/mips/kernel/irq.c | ||
230 | index 2b0a371b42af..24444ed456c8 100644 | ||
231 | --- a/arch/mips/kernel/irq.c | ||
232 | +++ b/arch/mips/kernel/irq.c | ||
233 | @@ -52,6 +52,7 @@ asmlinkage void spurious_interrupt(void) | ||
234 | void __init init_IRQ(void) | ||
235 | { | ||
236 | int i; | ||
237 | + unsigned int order = get_order(IRQ_STACK_SIZE); | ||
238 | |||
239 | for (i = 0; i < NR_IRQS; i++) | ||
240 | irq_set_noprobe(i); | ||
241 | @@ -62,8 +63,7 @@ void __init init_IRQ(void) | ||
242 | arch_init_irq(); | ||
243 | |||
244 | for_each_possible_cpu(i) { | ||
245 | - int irq_pages = IRQ_STACK_SIZE / PAGE_SIZE; | ||
246 | - void *s = (void *)__get_free_pages(GFP_KERNEL, irq_pages); | ||
247 | + void *s = (void *)__get_free_pages(GFP_KERNEL, order); | ||
248 | |||
249 | irq_stack[i] = s; | ||
250 | pr_debug("CPU%d IRQ stack at 0x%p - 0x%p\n", i, | ||
251 | diff --git a/arch/mips/kernel/process.c b/arch/mips/kernel/process.c | ||
252 | index 1cc133e7026f..fffd031dc6b6 100644 | ||
253 | --- a/arch/mips/kernel/process.c | ||
254 | +++ b/arch/mips/kernel/process.c | ||
255 | @@ -344,7 +344,7 @@ static inline int is_sp_move_ins(union mips_instruction *ip) | ||
256 | static int get_frame_info(struct mips_frame_info *info) | ||
257 | { | ||
258 | bool is_mmips = IS_ENABLED(CONFIG_CPU_MICROMIPS); | ||
259 | - union mips_instruction insn, *ip, *ip_end; | ||
260 | + union mips_instruction insn, *ip; | ||
261 | const unsigned int max_insns = 128; | ||
262 | unsigned int last_insn_size = 0; | ||
263 | unsigned int i; | ||
264 | @@ -356,10 +356,9 @@ static int get_frame_info(struct mips_frame_info *info) | ||
265 | if (!ip) | ||
266 | goto err; | ||
267 | |||
268 | - ip_end = (void *)ip + info->func_size; | ||
269 | - | ||
270 | - for (i = 0; i < max_insns && ip < ip_end; i++) { | ||
271 | + for (i = 0; i < max_insns; i++) { | ||
272 | ip = (void *)ip + last_insn_size; | ||
273 | + | ||
274 | if (is_mmips && mm_insn_16bit(ip->halfword[0])) { | ||
275 | insn.halfword[0] = 0; | ||
276 | insn.halfword[1] = ip->halfword[0]; | ||
277 | diff --git a/arch/x86/events/core.c b/arch/x86/events/core.c | ||
278 | index ab04751a12b6..1e9f610d36a4 100644 | ||
279 | --- a/arch/x86/events/core.c | ||
280 | +++ b/arch/x86/events/core.c | ||
281 | @@ -1942,7 +1942,7 @@ static int x86_pmu_commit_txn(struct pmu *pmu) | ||
282 | */ | ||
283 | static void free_fake_cpuc(struct cpu_hw_events *cpuc) | ||
284 | { | ||
285 | - kfree(cpuc->shared_regs); | ||
286 | + intel_cpuc_finish(cpuc); | ||
287 | kfree(cpuc); | ||
288 | } | ||
289 | |||
290 | @@ -1954,14 +1954,11 @@ static struct cpu_hw_events *allocate_fake_cpuc(void) | ||
291 | cpuc = kzalloc(sizeof(*cpuc), GFP_KERNEL); | ||
292 | if (!cpuc) | ||
293 | return ERR_PTR(-ENOMEM); | ||
294 | - | ||
295 | - /* only needed, if we have extra_regs */ | ||
296 | - if (x86_pmu.extra_regs) { | ||
297 | - cpuc->shared_regs = allocate_shared_regs(cpu); | ||
298 | - if (!cpuc->shared_regs) | ||
299 | - goto error; | ||
300 | - } | ||
301 | cpuc->is_fake = 1; | ||
302 | + | ||
303 | + if (intel_cpuc_prepare(cpuc, cpu)) | ||
304 | + goto error; | ||
305 | + | ||
306 | return cpuc; | ||
307 | error: | ||
308 | free_fake_cpuc(cpuc); | ||
309 | diff --git a/arch/x86/events/intel/core.c b/arch/x86/events/intel/core.c | ||
310 | index f0639c8ebcb6..098ab775135f 100644 | ||
311 | --- a/arch/x86/events/intel/core.c | ||
312 | +++ b/arch/x86/events/intel/core.c | ||
313 | @@ -2492,6 +2492,35 @@ intel_stop_scheduling(struct cpu_hw_events *cpuc) | ||
314 | raw_spin_unlock(&excl_cntrs->lock); | ||
315 | } | ||
316 | |||
317 | +static struct event_constraint * | ||
318 | +dyn_constraint(struct cpu_hw_events *cpuc, struct event_constraint *c, int idx) | ||
319 | +{ | ||
320 | + WARN_ON_ONCE(!cpuc->constraint_list); | ||
321 | + | ||
322 | + if (!(c->flags & PERF_X86_EVENT_DYNAMIC)) { | ||
323 | + struct event_constraint *cx; | ||
324 | + | ||
325 | + /* | ||
326 | + * grab pre-allocated constraint entry | ||
327 | + */ | ||
328 | + cx = &cpuc->constraint_list[idx]; | ||
329 | + | ||
330 | + /* | ||
331 | + * initialize dynamic constraint | ||
332 | + * with static constraint | ||
333 | + */ | ||
334 | + *cx = *c; | ||
335 | + | ||
336 | + /* | ||
337 | + * mark constraint as dynamic | ||
338 | + */ | ||
339 | + cx->flags |= PERF_X86_EVENT_DYNAMIC; | ||
340 | + c = cx; | ||
341 | + } | ||
342 | + | ||
343 | + return c; | ||
344 | +} | ||
345 | + | ||
346 | static struct event_constraint * | ||
347 | intel_get_excl_constraints(struct cpu_hw_events *cpuc, struct perf_event *event, | ||
348 | int idx, struct event_constraint *c) | ||
349 | @@ -2522,27 +2551,7 @@ intel_get_excl_constraints(struct cpu_hw_events *cpuc, struct perf_event *event, | ||
350 | * only needed when constraint has not yet | ||
351 | * been cloned (marked dynamic) | ||
352 | */ | ||
353 | - if (!(c->flags & PERF_X86_EVENT_DYNAMIC)) { | ||
354 | - struct event_constraint *cx; | ||
355 | - | ||
356 | - /* | ||
357 | - * grab pre-allocated constraint entry | ||
358 | - */ | ||
359 | - cx = &cpuc->constraint_list[idx]; | ||
360 | - | ||
361 | - /* | ||
362 | - * initialize dynamic constraint | ||
363 | - * with static constraint | ||
364 | - */ | ||
365 | - *cx = *c; | ||
366 | - | ||
367 | - /* | ||
368 | - * mark constraint as dynamic, so we | ||
369 | - * can free it later on | ||
370 | - */ | ||
371 | - cx->flags |= PERF_X86_EVENT_DYNAMIC; | ||
372 | - c = cx; | ||
373 | - } | ||
374 | + c = dyn_constraint(cpuc, c, idx); | ||
375 | |||
376 | /* | ||
377 | * From here on, the constraint is dynamic. | ||
378 | @@ -3093,7 +3102,7 @@ ssize_t intel_event_sysfs_show(char *page, u64 config) | ||
379 | return x86_event_sysfs_show(page, config, event); | ||
380 | } | ||
381 | |||
382 | -struct intel_shared_regs *allocate_shared_regs(int cpu) | ||
383 | +static struct intel_shared_regs *allocate_shared_regs(int cpu) | ||
384 | { | ||
385 | struct intel_shared_regs *regs; | ||
386 | int i; | ||
387 | @@ -3125,10 +3134,9 @@ static struct intel_excl_cntrs *allocate_excl_cntrs(int cpu) | ||
388 | return c; | ||
389 | } | ||
390 | |||
391 | -static int intel_pmu_cpu_prepare(int cpu) | ||
392 | -{ | ||
393 | - struct cpu_hw_events *cpuc = &per_cpu(cpu_hw_events, cpu); | ||
394 | |||
395 | +int intel_cpuc_prepare(struct cpu_hw_events *cpuc, int cpu) | ||
396 | +{ | ||
397 | if (x86_pmu.extra_regs || x86_pmu.lbr_sel_map) { | ||
398 | cpuc->shared_regs = allocate_shared_regs(cpu); | ||
399 | if (!cpuc->shared_regs) | ||
400 | @@ -3138,7 +3146,7 @@ static int intel_pmu_cpu_prepare(int cpu) | ||
401 | if (x86_pmu.flags & PMU_FL_EXCL_CNTRS) { | ||
402 | size_t sz = X86_PMC_IDX_MAX * sizeof(struct event_constraint); | ||
403 | |||
404 | - cpuc->constraint_list = kzalloc(sz, GFP_KERNEL); | ||
405 | + cpuc->constraint_list = kzalloc_node(sz, GFP_KERNEL, cpu_to_node(cpu)); | ||
406 | if (!cpuc->constraint_list) | ||
407 | goto err_shared_regs; | ||
408 | |||
409 | @@ -3163,6 +3171,11 @@ err: | ||
410 | return -ENOMEM; | ||
411 | } | ||
412 | |||
413 | +static int intel_pmu_cpu_prepare(int cpu) | ||
414 | +{ | ||
415 | + return intel_cpuc_prepare(&per_cpu(cpu_hw_events, cpu), cpu); | ||
416 | +} | ||
417 | + | ||
418 | static void intel_pmu_cpu_starting(int cpu) | ||
419 | { | ||
420 | struct cpu_hw_events *cpuc = &per_cpu(cpu_hw_events, cpu); | ||
421 | @@ -3218,9 +3231,8 @@ static void intel_pmu_cpu_starting(int cpu) | ||
422 | } | ||
423 | } | ||
424 | |||
425 | -static void free_excl_cntrs(int cpu) | ||
426 | +static void free_excl_cntrs(struct cpu_hw_events *cpuc) | ||
427 | { | ||
428 | - struct cpu_hw_events *cpuc = &per_cpu(cpu_hw_events, cpu); | ||
429 | struct intel_excl_cntrs *c; | ||
430 | |||
431 | c = cpuc->excl_cntrs; | ||
432 | @@ -3238,9 +3250,8 @@ static void intel_pmu_cpu_dying(int cpu) | ||
433 | fini_debug_store_on_cpu(cpu); | ||
434 | } | ||
435 | |||
436 | -static void intel_pmu_cpu_dead(int cpu) | ||
437 | +void intel_cpuc_finish(struct cpu_hw_events *cpuc) | ||
438 | { | ||
439 | - struct cpu_hw_events *cpuc = &per_cpu(cpu_hw_events, cpu); | ||
440 | struct intel_shared_regs *pc; | ||
441 | |||
442 | pc = cpuc->shared_regs; | ||
443 | @@ -3250,7 +3261,12 @@ static void intel_pmu_cpu_dead(int cpu) | ||
444 | cpuc->shared_regs = NULL; | ||
445 | } | ||
446 | |||
447 | - free_excl_cntrs(cpu); | ||
448 | + free_excl_cntrs(cpuc); | ||
449 | +} | ||
450 | + | ||
451 | +static void intel_pmu_cpu_dead(int cpu) | ||
452 | +{ | ||
453 | + intel_cpuc_finish(&per_cpu(cpu_hw_events, cpu)); | ||
454 | } | ||
455 | |||
456 | static void intel_pmu_sched_task(struct perf_event_context *ctx, | ||
457 | @@ -4132,7 +4148,7 @@ static __init int fixup_ht_bug(void) | ||
458 | get_online_cpus(); | ||
459 | |||
460 | for_each_online_cpu(c) { | ||
461 | - free_excl_cntrs(c); | ||
462 | + free_excl_cntrs(&per_cpu(cpu_hw_events, c)); | ||
463 | } | ||
464 | |||
465 | put_online_cpus(); | ||
466 | diff --git a/arch/x86/events/perf_event.h b/arch/x86/events/perf_event.h | ||
467 | index 5c21680b0a69..1ce6ae35f6a2 100644 | ||
468 | --- a/arch/x86/events/perf_event.h | ||
469 | +++ b/arch/x86/events/perf_event.h | ||
470 | @@ -865,7 +865,8 @@ struct event_constraint * | ||
471 | x86_get_event_constraints(struct cpu_hw_events *cpuc, int idx, | ||
472 | struct perf_event *event); | ||
473 | |||
474 | -struct intel_shared_regs *allocate_shared_regs(int cpu); | ||
475 | +extern int intel_cpuc_prepare(struct cpu_hw_events *cpuc, int cpu); | ||
476 | +extern void intel_cpuc_finish(struct cpu_hw_events *cpuc); | ||
477 | |||
478 | int intel_pmu_init(void); | ||
479 | |||
480 | @@ -995,9 +996,13 @@ static inline int intel_pmu_init(void) | ||
481 | return 0; | ||
482 | } | ||
483 | |||
484 | -static inline struct intel_shared_regs *allocate_shared_regs(int cpu) | ||
485 | +static inline int intel_cpuc_prepare(struct cpu_hw_event *cpuc, int cpu) | ||
486 | +{ | ||
487 | + return 0; | ||
488 | +} | ||
489 | + | ||
490 | +static inline void intel_cpuc_finish(struct cpu_hw_event *cpuc) | ||
491 | { | ||
492 | - return NULL; | ||
493 | } | ||
494 | |||
495 | static inline int is_ht_workaround_enabled(void) | ||
496 | diff --git a/arch/x86/include/asm/cpufeatures.h b/arch/x86/include/asm/cpufeatures.h | ||
497 | index c56c24347f15..98444b77fbe3 100644 | ||
498 | --- a/arch/x86/include/asm/cpufeatures.h | ||
499 | +++ b/arch/x86/include/asm/cpufeatures.h | ||
500 | @@ -314,6 +314,7 @@ | ||
501 | /* Intel-defined CPU features, CPUID level 0x00000007:0 (EDX), word 18 */ | ||
502 | #define X86_FEATURE_AVX512_4VNNIW (18*32+ 2) /* AVX-512 Neural Network Instructions */ | ||
503 | #define X86_FEATURE_AVX512_4FMAPS (18*32+ 3) /* AVX-512 Multiply Accumulation Single precision */ | ||
504 | +#define X86_FEATURE_TSX_FORCE_ABORT (18*32+13) /* "" TSX_FORCE_ABORT */ | ||
505 | #define X86_FEATURE_PCONFIG (18*32+18) /* Intel PCONFIG */ | ||
506 | #define X86_FEATURE_SPEC_CTRL (18*32+26) /* "" Speculation Control (IBRS + IBPB) */ | ||
507 | #define X86_FEATURE_INTEL_STIBP (18*32+27) /* "" Single Thread Indirect Branch Predictors */ | ||
508 | diff --git a/arch/x86/include/asm/msr-index.h b/arch/x86/include/asm/msr-index.h | ||
509 | index bbbb9b14ade1..9963e21ac443 100644 | ||
510 | --- a/arch/x86/include/asm/msr-index.h | ||
511 | +++ b/arch/x86/include/asm/msr-index.h | ||
512 | @@ -575,6 +575,12 @@ | ||
513 | |||
514 | #define MSR_IA32_TSC_DEADLINE 0x000006E0 | ||
515 | |||
516 | + | ||
517 | +#define MSR_TSX_FORCE_ABORT 0x0000010F | ||
518 | + | ||
519 | +#define MSR_TFA_RTM_FORCE_ABORT_BIT 0 | ||
520 | +#define MSR_TFA_RTM_FORCE_ABORT BIT_ULL(MSR_TFA_RTM_FORCE_ABORT_BIT) | ||
521 | + | ||
522 | /* P4/Xeon+ specific */ | ||
523 | #define MSR_IA32_MCG_EAX 0x00000180 | ||
524 | #define MSR_IA32_MCG_EBX 0x00000181 | ||
525 | diff --git a/arch/x86/include/asm/page_64_types.h b/arch/x86/include/asm/page_64_types.h | ||
526 | index 9215e0527647..390fdd39e0e2 100644 | ||
527 | --- a/arch/x86/include/asm/page_64_types.h | ||
528 | +++ b/arch/x86/include/asm/page_64_types.h | ||
529 | @@ -6,7 +6,11 @@ | ||
530 | #endif | ||
531 | |||
532 | #ifdef CONFIG_KASAN | ||
533 | +#ifdef CONFIG_KASAN_EXTRA | ||
534 | +#define KASAN_STACK_ORDER 2 | ||
535 | +#else | ||
536 | #define KASAN_STACK_ORDER 1 | ||
537 | +#endif | ||
538 | #else | ||
539 | #define KASAN_STACK_ORDER 0 | ||
540 | #endif | ||
541 | diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c | ||
542 | index 4c2648b96c9a..be6d0543e626 100644 | ||
543 | --- a/arch/x86/kernel/cpu/amd.c | ||
544 | +++ b/arch/x86/kernel/cpu/amd.c | ||
545 | @@ -765,11 +765,9 @@ static void init_amd_bd(struct cpuinfo_x86 *c) | ||
546 | static void init_amd_zn(struct cpuinfo_x86 *c) | ||
547 | { | ||
548 | set_cpu_cap(c, X86_FEATURE_ZEN); | ||
549 | - /* | ||
550 | - * Fix erratum 1076: CPB feature bit not being set in CPUID. It affects | ||
551 | - * all up to and including B1. | ||
552 | - */ | ||
553 | - if (c->x86_model <= 1 && c->x86_stepping <= 1) | ||
554 | + | ||
555 | + /* Fix erratum 1076: CPB feature bit not being set in CPUID. */ | ||
556 | + if (!cpu_has(c, X86_FEATURE_CPB)) | ||
557 | set_cpu_cap(c, X86_FEATURE_CPB); | ||
558 | } | ||
559 | |||
560 | diff --git a/arch/x86/kernel/kexec-bzimage64.c b/arch/x86/kernel/kexec-bzimage64.c | ||
561 | index 490f9be3fda2..167ecc270ca5 100644 | ||
562 | --- a/arch/x86/kernel/kexec-bzimage64.c | ||
563 | +++ b/arch/x86/kernel/kexec-bzimage64.c | ||
564 | @@ -167,6 +167,9 @@ setup_efi_state(struct boot_params *params, unsigned long params_load_addr, | ||
565 | struct efi_info *current_ei = &boot_params.efi_info; | ||
566 | struct efi_info *ei = ¶ms->efi_info; | ||
567 | |||
568 | + if (!efi_enabled(EFI_RUNTIME_SERVICES)) | ||
569 | + return 0; | ||
570 | + | ||
571 | if (!current_ei->efi_memmap_size) | ||
572 | return 0; | ||
573 | |||
574 | diff --git a/arch/xtensa/configs/smp_lx200_defconfig b/arch/xtensa/configs/smp_lx200_defconfig | ||
575 | index 14e3ca353ac8..5035b86a2e49 100644 | ||
576 | --- a/arch/xtensa/configs/smp_lx200_defconfig | ||
577 | +++ b/arch/xtensa/configs/smp_lx200_defconfig | ||
578 | @@ -34,6 +34,7 @@ CONFIG_SMP=y | ||
579 | CONFIG_HOTPLUG_CPU=y | ||
580 | # CONFIG_INITIALIZE_XTENSA_MMU_INSIDE_VMLINUX is not set | ||
581 | # CONFIG_PCI is not set | ||
582 | +CONFIG_VECTORS_OFFSET=0x00002000 | ||
583 | CONFIG_XTENSA_PLATFORM_XTFPGA=y | ||
584 | CONFIG_CMDLINE_BOOL=y | ||
585 | CONFIG_CMDLINE="earlycon=uart8250,mmio32native,0xfd050020,115200n8 console=ttyS0,115200n8 ip=dhcp root=/dev/nfs rw debug memmap=96M@0" | ||
586 | diff --git a/arch/xtensa/kernel/head.S b/arch/xtensa/kernel/head.S | ||
587 | index 27c8e07ace43..29f445b410b3 100644 | ||
588 | --- a/arch/xtensa/kernel/head.S | ||
589 | +++ b/arch/xtensa/kernel/head.S | ||
590 | @@ -281,12 +281,13 @@ should_never_return: | ||
591 | |||
592 | movi a2, cpu_start_ccount | ||
593 | 1: | ||
594 | + memw | ||
595 | l32i a3, a2, 0 | ||
596 | beqi a3, 0, 1b | ||
597 | movi a3, 0 | ||
598 | s32i a3, a2, 0 | ||
599 | - memw | ||
600 | 1: | ||
601 | + memw | ||
602 | l32i a3, a2, 0 | ||
603 | beqi a3, 0, 1b | ||
604 | wsr a3, ccount | ||
605 | @@ -323,11 +324,13 @@ ENTRY(cpu_restart) | ||
606 | rsr a0, prid | ||
607 | neg a2, a0 | ||
608 | movi a3, cpu_start_id | ||
609 | + memw | ||
610 | s32i a2, a3, 0 | ||
611 | #if XCHAL_DCACHE_IS_WRITEBACK | ||
612 | dhwbi a3, 0 | ||
613 | #endif | ||
614 | 1: | ||
615 | + memw | ||
616 | l32i a2, a3, 0 | ||
617 | dhi a3, 0 | ||
618 | bne a2, a0, 1b | ||
619 | diff --git a/arch/xtensa/kernel/smp.c b/arch/xtensa/kernel/smp.c | ||
620 | index fc4ad21a5ed4..44805673a250 100644 | ||
621 | --- a/arch/xtensa/kernel/smp.c | ||
622 | +++ b/arch/xtensa/kernel/smp.c | ||
623 | @@ -80,7 +80,7 @@ void __init smp_prepare_cpus(unsigned int max_cpus) | ||
624 | { | ||
625 | unsigned i; | ||
626 | |||
627 | - for (i = 0; i < max_cpus; ++i) | ||
628 | + for_each_possible_cpu(i) | ||
629 | set_cpu_present(i, true); | ||
630 | } | ||
631 | |||
632 | @@ -93,6 +93,11 @@ void __init smp_init_cpus(void) | ||
633 | pr_info("%s: Core Count = %d\n", __func__, ncpus); | ||
634 | pr_info("%s: Core Id = %d\n", __func__, core_id); | ||
635 | |||
636 | + if (ncpus > NR_CPUS) { | ||
637 | + ncpus = NR_CPUS; | ||
638 | + pr_info("%s: limiting core count by %d\n", __func__, ncpus); | ||
639 | + } | ||
640 | + | ||
641 | for (i = 0; i < ncpus; ++i) | ||
642 | set_cpu_possible(i, true); | ||
643 | } | ||
644 | @@ -192,9 +197,11 @@ static int boot_secondary(unsigned int cpu, struct task_struct *ts) | ||
645 | int i; | ||
646 | |||
647 | #ifdef CONFIG_HOTPLUG_CPU | ||
648 | - cpu_start_id = cpu; | ||
649 | - system_flush_invalidate_dcache_range( | ||
650 | - (unsigned long)&cpu_start_id, sizeof(cpu_start_id)); | ||
651 | + WRITE_ONCE(cpu_start_id, cpu); | ||
652 | + /* Pairs with the third memw in the cpu_restart */ | ||
653 | + mb(); | ||
654 | + system_flush_invalidate_dcache_range((unsigned long)&cpu_start_id, | ||
655 | + sizeof(cpu_start_id)); | ||
656 | #endif | ||
657 | smp_call_function_single(0, mx_cpu_start, (void *)cpu, 1); | ||
658 | |||
659 | @@ -203,18 +210,21 @@ static int boot_secondary(unsigned int cpu, struct task_struct *ts) | ||
660 | ccount = get_ccount(); | ||
661 | while (!ccount); | ||
662 | |||
663 | - cpu_start_ccount = ccount; | ||
664 | + WRITE_ONCE(cpu_start_ccount, ccount); | ||
665 | |||
666 | - while (time_before(jiffies, timeout)) { | ||
667 | + do { | ||
668 | + /* | ||
669 | + * Pairs with the first two memws in the | ||
670 | + * .Lboot_secondary. | ||
671 | + */ | ||
672 | mb(); | ||
673 | - if (!cpu_start_ccount) | ||
674 | - break; | ||
675 | - } | ||
676 | + ccount = READ_ONCE(cpu_start_ccount); | ||
677 | + } while (ccount && time_before(jiffies, timeout)); | ||
678 | |||
679 | - if (cpu_start_ccount) { | ||
680 | + if (ccount) { | ||
681 | smp_call_function_single(0, mx_cpu_stop, | ||
682 | - (void *)cpu, 1); | ||
683 | - cpu_start_ccount = 0; | ||
684 | + (void *)cpu, 1); | ||
685 | + WRITE_ONCE(cpu_start_ccount, 0); | ||
686 | return -EIO; | ||
687 | } | ||
688 | } | ||
689 | @@ -234,6 +244,7 @@ int __cpu_up(unsigned int cpu, struct task_struct *idle) | ||
690 | pr_debug("%s: Calling wakeup_secondary(cpu:%d, idle:%p, sp: %08lx)\n", | ||
691 | __func__, cpu, idle, start_info.stack); | ||
692 | |||
693 | + init_completion(&cpu_running); | ||
694 | ret = boot_secondary(cpu, idle); | ||
695 | if (ret == 0) { | ||
696 | wait_for_completion_timeout(&cpu_running, | ||
697 | @@ -295,8 +306,10 @@ void __cpu_die(unsigned int cpu) | ||
698 | unsigned long timeout = jiffies + msecs_to_jiffies(1000); | ||
699 | while (time_before(jiffies, timeout)) { | ||
700 | system_invalidate_dcache_range((unsigned long)&cpu_start_id, | ||
701 | - sizeof(cpu_start_id)); | ||
702 | - if (cpu_start_id == -cpu) { | ||
703 | + sizeof(cpu_start_id)); | ||
704 | + /* Pairs with the second memw in the cpu_restart */ | ||
705 | + mb(); | ||
706 | + if (READ_ONCE(cpu_start_id) == -cpu) { | ||
707 | platform_cpu_kill(cpu); | ||
708 | return; | ||
709 | } | ||
710 | diff --git a/arch/xtensa/kernel/time.c b/arch/xtensa/kernel/time.c | ||
711 | index be81e69b25bc..2251a6e0973a 100644 | ||
712 | --- a/arch/xtensa/kernel/time.c | ||
713 | +++ b/arch/xtensa/kernel/time.c | ||
714 | @@ -89,7 +89,7 @@ static int ccount_timer_shutdown(struct clock_event_device *evt) | ||
715 | container_of(evt, struct ccount_timer, evt); | ||
716 | |||
717 | if (timer->irq_enabled) { | ||
718 | - disable_irq(evt->irq); | ||
719 | + disable_irq_nosync(evt->irq); | ||
720 | timer->irq_enabled = 0; | ||
721 | } | ||
722 | return 0; | ||
723 | diff --git a/drivers/char/applicom.c b/drivers/char/applicom.c | ||
724 | index 14790304b84b..9fcd51095d13 100644 | ||
725 | --- a/drivers/char/applicom.c | ||
726 | +++ b/drivers/char/applicom.c | ||
727 | @@ -32,6 +32,7 @@ | ||
728 | #include <linux/wait.h> | ||
729 | #include <linux/init.h> | ||
730 | #include <linux/fs.h> | ||
731 | +#include <linux/nospec.h> | ||
732 | |||
733 | #include <asm/io.h> | ||
734 | #include <asm/uaccess.h> | ||
735 | @@ -386,7 +387,11 @@ static ssize_t ac_write(struct file *file, const char __user *buf, size_t count, | ||
736 | TicCard = st_loc.tic_des_from_pc; /* tic number to send */ | ||
737 | IndexCard = NumCard - 1; | ||
738 | |||
739 | - if((NumCard < 1) || (NumCard > MAX_BOARD) || !apbs[IndexCard].RamIO) | ||
740 | + if (IndexCard >= MAX_BOARD) | ||
741 | + return -EINVAL; | ||
742 | + IndexCard = array_index_nospec(IndexCard, MAX_BOARD); | ||
743 | + | ||
744 | + if (!apbs[IndexCard].RamIO) | ||
745 | return -EINVAL; | ||
746 | |||
747 | #ifdef DEBUG | ||
748 | @@ -697,6 +702,7 @@ static long ac_ioctl(struct file *file, unsigned int cmd, unsigned long arg) | ||
749 | unsigned char IndexCard; | ||
750 | void __iomem *pmem; | ||
751 | int ret = 0; | ||
752 | + static int warncount = 10; | ||
753 | volatile unsigned char byte_reset_it; | ||
754 | struct st_ram_io *adgl; | ||
755 | void __user *argp = (void __user *)arg; | ||
756 | @@ -711,16 +717,12 @@ static long ac_ioctl(struct file *file, unsigned int cmd, unsigned long arg) | ||
757 | mutex_lock(&ac_mutex); | ||
758 | IndexCard = adgl->num_card-1; | ||
759 | |||
760 | - if(cmd != 6 && ((IndexCard >= MAX_BOARD) || !apbs[IndexCard].RamIO)) { | ||
761 | - static int warncount = 10; | ||
762 | - if (warncount) { | ||
763 | - printk( KERN_WARNING "APPLICOM driver IOCTL, bad board number %d\n",(int)IndexCard+1); | ||
764 | - warncount--; | ||
765 | - } | ||
766 | - kfree(adgl); | ||
767 | - mutex_unlock(&ac_mutex); | ||
768 | - return -EINVAL; | ||
769 | - } | ||
770 | + if (cmd != 6 && IndexCard >= MAX_BOARD) | ||
771 | + goto err; | ||
772 | + IndexCard = array_index_nospec(IndexCard, MAX_BOARD); | ||
773 | + | ||
774 | + if (cmd != 6 && !apbs[IndexCard].RamIO) | ||
775 | + goto err; | ||
776 | |||
777 | switch (cmd) { | ||
778 | |||
779 | @@ -838,5 +840,16 @@ static long ac_ioctl(struct file *file, unsigned int cmd, unsigned long arg) | ||
780 | kfree(adgl); | ||
781 | mutex_unlock(&ac_mutex); | ||
782 | return 0; | ||
783 | + | ||
784 | +err: | ||
785 | + if (warncount) { | ||
786 | + pr_warn("APPLICOM driver IOCTL, bad board number %d\n", | ||
787 | + (int)IndexCard + 1); | ||
788 | + warncount--; | ||
789 | + } | ||
790 | + kfree(adgl); | ||
791 | + mutex_unlock(&ac_mutex); | ||
792 | + return -EINVAL; | ||
793 | + | ||
794 | } | ||
795 | |||
796 | diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c | ||
797 | index 61fe4bbc6dc0..a38a23f0b3f4 100644 | ||
798 | --- a/drivers/cpufreq/cpufreq.c | ||
799 | +++ b/drivers/cpufreq/cpufreq.c | ||
800 | @@ -528,13 +528,13 @@ EXPORT_SYMBOL_GPL(cpufreq_driver_resolve_freq); | ||
801 | * SYSFS INTERFACE * | ||
802 | *********************************************************************/ | ||
803 | static ssize_t show_boost(struct kobject *kobj, | ||
804 | - struct attribute *attr, char *buf) | ||
805 | + struct kobj_attribute *attr, char *buf) | ||
806 | { | ||
807 | return sprintf(buf, "%d\n", cpufreq_driver->boost_enabled); | ||
808 | } | ||
809 | |||
810 | -static ssize_t store_boost(struct kobject *kobj, struct attribute *attr, | ||
811 | - const char *buf, size_t count) | ||
812 | +static ssize_t store_boost(struct kobject *kobj, struct kobj_attribute *attr, | ||
813 | + const char *buf, size_t count) | ||
814 | { | ||
815 | int ret, enable; | ||
816 | |||
817 | diff --git a/drivers/cpufreq/intel_pstate.c b/drivers/cpufreq/intel_pstate.c | ||
818 | index a59ae8e24d3d..f690085b1ad9 100644 | ||
819 | --- a/drivers/cpufreq/intel_pstate.c | ||
820 | +++ b/drivers/cpufreq/intel_pstate.c | ||
821 | @@ -659,13 +659,13 @@ static void __init intel_pstate_debug_expose_params(void) | ||
822 | /************************** sysfs begin ************************/ | ||
823 | #define show_one(file_name, object) \ | ||
824 | static ssize_t show_##file_name \ | ||
825 | - (struct kobject *kobj, struct attribute *attr, char *buf) \ | ||
826 | + (struct kobject *kobj, struct kobj_attribute *attr, char *buf) \ | ||
827 | { \ | ||
828 | return sprintf(buf, "%u\n", limits->object); \ | ||
829 | } | ||
830 | |||
831 | static ssize_t show_turbo_pct(struct kobject *kobj, | ||
832 | - struct attribute *attr, char *buf) | ||
833 | + struct kobj_attribute *attr, char *buf) | ||
834 | { | ||
835 | struct cpudata *cpu; | ||
836 | int total, no_turbo, turbo_pct; | ||
837 | @@ -681,7 +681,7 @@ static ssize_t show_turbo_pct(struct kobject *kobj, | ||
838 | } | ||
839 | |||
840 | static ssize_t show_num_pstates(struct kobject *kobj, | ||
841 | - struct attribute *attr, char *buf) | ||
842 | + struct kobj_attribute *attr, char *buf) | ||
843 | { | ||
844 | struct cpudata *cpu; | ||
845 | int total; | ||
846 | @@ -692,7 +692,7 @@ static ssize_t show_num_pstates(struct kobject *kobj, | ||
847 | } | ||
848 | |||
849 | static ssize_t show_no_turbo(struct kobject *kobj, | ||
850 | - struct attribute *attr, char *buf) | ||
851 | + struct kobj_attribute *attr, char *buf) | ||
852 | { | ||
853 | ssize_t ret; | ||
854 | |||
855 | @@ -705,7 +705,7 @@ static ssize_t show_no_turbo(struct kobject *kobj, | ||
856 | return ret; | ||
857 | } | ||
858 | |||
859 | -static ssize_t store_no_turbo(struct kobject *a, struct attribute *b, | ||
860 | +static ssize_t store_no_turbo(struct kobject *a, struct kobj_attribute *b, | ||
861 | const char *buf, size_t count) | ||
862 | { | ||
863 | unsigned int input; | ||
864 | @@ -729,7 +729,7 @@ static ssize_t store_no_turbo(struct kobject *a, struct attribute *b, | ||
865 | return count; | ||
866 | } | ||
867 | |||
868 | -static ssize_t store_max_perf_pct(struct kobject *a, struct attribute *b, | ||
869 | +static ssize_t store_max_perf_pct(struct kobject *a, struct kobj_attribute *b, | ||
870 | const char *buf, size_t count) | ||
871 | { | ||
872 | unsigned int input; | ||
873 | @@ -753,7 +753,7 @@ static ssize_t store_max_perf_pct(struct kobject *a, struct attribute *b, | ||
874 | return count; | ||
875 | } | ||
876 | |||
877 | -static ssize_t store_min_perf_pct(struct kobject *a, struct attribute *b, | ||
878 | +static ssize_t store_min_perf_pct(struct kobject *a, struct kobj_attribute *b, | ||
879 | const char *buf, size_t count) | ||
880 | { | ||
881 | unsigned int input; | ||
882 | diff --git a/drivers/dma/at_xdmac.c b/drivers/dma/at_xdmac.c | ||
883 | index ee7b48d5243c..b222dd7afe8e 100644 | ||
884 | --- a/drivers/dma/at_xdmac.c | ||
885 | +++ b/drivers/dma/at_xdmac.c | ||
886 | @@ -203,6 +203,7 @@ struct at_xdmac_chan { | ||
887 | u32 save_cim; | ||
888 | u32 save_cnda; | ||
889 | u32 save_cndc; | ||
890 | + u32 irq_status; | ||
891 | unsigned long status; | ||
892 | struct tasklet_struct tasklet; | ||
893 | struct dma_slave_config sconfig; | ||
894 | @@ -1582,8 +1583,8 @@ static void at_xdmac_tasklet(unsigned long data) | ||
895 | struct at_xdmac_desc *desc; | ||
896 | u32 error_mask; | ||
897 | |||
898 | - dev_dbg(chan2dev(&atchan->chan), "%s: status=0x%08lx\n", | ||
899 | - __func__, atchan->status); | ||
900 | + dev_dbg(chan2dev(&atchan->chan), "%s: status=0x%08x\n", | ||
901 | + __func__, atchan->irq_status); | ||
902 | |||
903 | error_mask = AT_XDMAC_CIS_RBEIS | ||
904 | | AT_XDMAC_CIS_WBEIS | ||
905 | @@ -1591,15 +1592,15 @@ static void at_xdmac_tasklet(unsigned long data) | ||
906 | |||
907 | if (at_xdmac_chan_is_cyclic(atchan)) { | ||
908 | at_xdmac_handle_cyclic(atchan); | ||
909 | - } else if ((atchan->status & AT_XDMAC_CIS_LIS) | ||
910 | - || (atchan->status & error_mask)) { | ||
911 | + } else if ((atchan->irq_status & AT_XDMAC_CIS_LIS) | ||
912 | + || (atchan->irq_status & error_mask)) { | ||
913 | struct dma_async_tx_descriptor *txd; | ||
914 | |||
915 | - if (atchan->status & AT_XDMAC_CIS_RBEIS) | ||
916 | + if (atchan->irq_status & AT_XDMAC_CIS_RBEIS) | ||
917 | dev_err(chan2dev(&atchan->chan), "read bus error!!!"); | ||
918 | - if (atchan->status & AT_XDMAC_CIS_WBEIS) | ||
919 | + if (atchan->irq_status & AT_XDMAC_CIS_WBEIS) | ||
920 | dev_err(chan2dev(&atchan->chan), "write bus error!!!"); | ||
921 | - if (atchan->status & AT_XDMAC_CIS_ROIS) | ||
922 | + if (atchan->irq_status & AT_XDMAC_CIS_ROIS) | ||
923 | dev_err(chan2dev(&atchan->chan), "request overflow error!!!"); | ||
924 | |||
925 | spin_lock_bh(&atchan->lock); | ||
926 | @@ -1654,7 +1655,7 @@ static irqreturn_t at_xdmac_interrupt(int irq, void *dev_id) | ||
927 | atchan = &atxdmac->chan[i]; | ||
928 | chan_imr = at_xdmac_chan_read(atchan, AT_XDMAC_CIM); | ||
929 | chan_status = at_xdmac_chan_read(atchan, AT_XDMAC_CIS); | ||
930 | - atchan->status = chan_status & chan_imr; | ||
931 | + atchan->irq_status = chan_status & chan_imr; | ||
932 | dev_vdbg(atxdmac->dma.dev, | ||
933 | "%s: chan%d: imr=0x%x, status=0x%x\n", | ||
934 | __func__, i, chan_imr, chan_status); | ||
935 | @@ -1668,7 +1669,7 @@ static irqreturn_t at_xdmac_interrupt(int irq, void *dev_id) | ||
936 | at_xdmac_chan_read(atchan, AT_XDMAC_CDA), | ||
937 | at_xdmac_chan_read(atchan, AT_XDMAC_CUBC)); | ||
938 | |||
939 | - if (atchan->status & (AT_XDMAC_CIS_RBEIS | AT_XDMAC_CIS_WBEIS)) | ||
940 | + if (atchan->irq_status & (AT_XDMAC_CIS_RBEIS | AT_XDMAC_CIS_WBEIS)) | ||
941 | at_xdmac_write(atxdmac, AT_XDMAC_GD, atchan->mask); | ||
942 | |||
943 | tasklet_schedule(&atchan->tasklet); | ||
944 | diff --git a/drivers/dma/dmatest.c b/drivers/dma/dmatest.c | ||
945 | index ebe72a466587..7dd46cf5ed84 100644 | ||
946 | --- a/drivers/dma/dmatest.c | ||
947 | +++ b/drivers/dma/dmatest.c | ||
948 | @@ -583,11 +583,9 @@ static int dmatest_func(void *data) | ||
949 | srcs[i] = um->addr[i] + src_off; | ||
950 | ret = dma_mapping_error(dev->dev, um->addr[i]); | ||
951 | if (ret) { | ||
952 | - dmaengine_unmap_put(um); | ||
953 | result("src mapping error", total_tests, | ||
954 | src_off, dst_off, len, ret); | ||
955 | - failed_tests++; | ||
956 | - continue; | ||
957 | + goto error_unmap_continue; | ||
958 | } | ||
959 | um->to_cnt++; | ||
960 | } | ||
961 | @@ -602,11 +600,9 @@ static int dmatest_func(void *data) | ||
962 | DMA_BIDIRECTIONAL); | ||
963 | ret = dma_mapping_error(dev->dev, dsts[i]); | ||
964 | if (ret) { | ||
965 | - dmaengine_unmap_put(um); | ||
966 | result("dst mapping error", total_tests, | ||
967 | src_off, dst_off, len, ret); | ||
968 | - failed_tests++; | ||
969 | - continue; | ||
970 | + goto error_unmap_continue; | ||
971 | } | ||
972 | um->bidi_cnt++; | ||
973 | } | ||
974 | @@ -643,12 +639,10 @@ static int dmatest_func(void *data) | ||
975 | } | ||
976 | |||
977 | if (!tx) { | ||
978 | - dmaengine_unmap_put(um); | ||
979 | result("prep error", total_tests, src_off, | ||
980 | dst_off, len, ret); | ||
981 | msleep(100); | ||
982 | - failed_tests++; | ||
983 | - continue; | ||
984 | + goto error_unmap_continue; | ||
985 | } | ||
986 | |||
987 | done->done = false; | ||
988 | @@ -657,12 +651,10 @@ static int dmatest_func(void *data) | ||
989 | cookie = tx->tx_submit(tx); | ||
990 | |||
991 | if (dma_submit_error(cookie)) { | ||
992 | - dmaengine_unmap_put(um); | ||
993 | result("submit error", total_tests, src_off, | ||
994 | dst_off, len, ret); | ||
995 | msleep(100); | ||
996 | - failed_tests++; | ||
997 | - continue; | ||
998 | + goto error_unmap_continue; | ||
999 | } | ||
1000 | dma_async_issue_pending(chan); | ||
1001 | |||
1002 | @@ -675,16 +667,14 @@ static int dmatest_func(void *data) | ||
1003 | dmaengine_unmap_put(um); | ||
1004 | result("test timed out", total_tests, src_off, dst_off, | ||
1005 | len, 0); | ||
1006 | - failed_tests++; | ||
1007 | - continue; | ||
1008 | + goto error_unmap_continue; | ||
1009 | } else if (status != DMA_COMPLETE) { | ||
1010 | dmaengine_unmap_put(um); | ||
1011 | result(status == DMA_ERROR ? | ||
1012 | "completion error status" : | ||
1013 | "completion busy status", total_tests, src_off, | ||
1014 | dst_off, len, ret); | ||
1015 | - failed_tests++; | ||
1016 | - continue; | ||
1017 | + goto error_unmap_continue; | ||
1018 | } | ||
1019 | |||
1020 | dmaengine_unmap_put(um); | ||
1021 | @@ -727,6 +717,12 @@ static int dmatest_func(void *data) | ||
1022 | verbose_result("test passed", total_tests, src_off, | ||
1023 | dst_off, len, 0); | ||
1024 | } | ||
1025 | + | ||
1026 | + continue; | ||
1027 | + | ||
1028 | +error_unmap_continue: | ||
1029 | + dmaengine_unmap_put(um); | ||
1030 | + failed_tests++; | ||
1031 | } | ||
1032 | ktime = ktime_sub(ktime_get(), ktime); | ||
1033 | ktime = ktime_sub(ktime, comparetime); | ||
1034 | diff --git a/drivers/firmware/iscsi_ibft.c b/drivers/firmware/iscsi_ibft.c | ||
1035 | index 14042a64bdd5..132b9bae4b6a 100644 | ||
1036 | --- a/drivers/firmware/iscsi_ibft.c | ||
1037 | +++ b/drivers/firmware/iscsi_ibft.c | ||
1038 | @@ -542,6 +542,7 @@ static umode_t __init ibft_check_tgt_for(void *data, int type) | ||
1039 | case ISCSI_BOOT_TGT_NIC_ASSOC: | ||
1040 | case ISCSI_BOOT_TGT_CHAP_TYPE: | ||
1041 | rc = S_IRUGO; | ||
1042 | + break; | ||
1043 | case ISCSI_BOOT_TGT_NAME: | ||
1044 | if (tgt->tgt_name_len) | ||
1045 | rc = S_IRUGO; | ||
1046 | diff --git a/drivers/gpio/gpio-vf610.c b/drivers/gpio/gpio-vf610.c | ||
1047 | index 3edb09cb9ee0..1f599bc08237 100644 | ||
1048 | --- a/drivers/gpio/gpio-vf610.c | ||
1049 | +++ b/drivers/gpio/gpio-vf610.c | ||
1050 | @@ -221,6 +221,7 @@ static int vf610_gpio_probe(struct platform_device *pdev) | ||
1051 | struct vf610_gpio_port *port; | ||
1052 | struct resource *iores; | ||
1053 | struct gpio_chip *gc; | ||
1054 | + int i; | ||
1055 | int ret; | ||
1056 | |||
1057 | port = devm_kzalloc(&pdev->dev, sizeof(*port), GFP_KERNEL); | ||
1058 | @@ -259,6 +260,10 @@ static int vf610_gpio_probe(struct platform_device *pdev) | ||
1059 | if (ret < 0) | ||
1060 | return ret; | ||
1061 | |||
1062 | + /* Mask all GPIO interrupts */ | ||
1063 | + for (i = 0; i < gc->ngpio; i++) | ||
1064 | + vf610_gpio_writel(0, port->base + PORT_PCR(i)); | ||
1065 | + | ||
1066 | /* Clear the interrupt status register for all GPIO's */ | ||
1067 | vf610_gpio_writel(~0, port->base + PORT_ISFR); | ||
1068 | |||
1069 | diff --git a/drivers/gpu/drm/sun4i/sun4i_tcon.c b/drivers/gpu/drm/sun4i/sun4i_tcon.c | ||
1070 | index f2975a1525be..2796fea70a42 100644 | ||
1071 | --- a/drivers/gpu/drm/sun4i/sun4i_tcon.c | ||
1072 | +++ b/drivers/gpu/drm/sun4i/sun4i_tcon.c | ||
1073 | @@ -327,6 +327,7 @@ static int sun4i_tcon_init_clocks(struct device *dev, | ||
1074 | dev_err(dev, "Couldn't get the TCON channel 0 clock\n"); | ||
1075 | return PTR_ERR(tcon->sclk0); | ||
1076 | } | ||
1077 | + clk_prepare_enable(tcon->sclk0); | ||
1078 | |||
1079 | if (tcon->quirks->has_channel_1) { | ||
1080 | tcon->sclk1 = devm_clk_get(dev, "tcon-ch1"); | ||
1081 | @@ -341,6 +342,7 @@ static int sun4i_tcon_init_clocks(struct device *dev, | ||
1082 | |||
1083 | static void sun4i_tcon_free_clocks(struct sun4i_tcon *tcon) | ||
1084 | { | ||
1085 | + clk_disable_unprepare(tcon->sclk0); | ||
1086 | clk_disable_unprepare(tcon->clk); | ||
1087 | } | ||
1088 | |||
1089 | diff --git a/drivers/infiniband/hw/hfi1/ud.c b/drivers/infiniband/hw/hfi1/ud.c | ||
1090 | index 1a7ce1d740ce..292d7b6a0536 100644 | ||
1091 | --- a/drivers/infiniband/hw/hfi1/ud.c | ||
1092 | +++ b/drivers/infiniband/hw/hfi1/ud.c | ||
1093 | @@ -772,7 +772,6 @@ void hfi1_ud_rcv(struct hfi1_packet *packet) | ||
1094 | opcode == IB_OPCODE_UD_SEND_ONLY_WITH_IMMEDIATE) { | ||
1095 | wc.ex.imm_data = ohdr->u.ud.imm_data; | ||
1096 | wc.wc_flags = IB_WC_WITH_IMM; | ||
1097 | - tlen -= sizeof(u32); | ||
1098 | } else if (opcode == IB_OPCODE_UD_SEND_ONLY) { | ||
1099 | wc.ex.imm_data = 0; | ||
1100 | wc.wc_flags = 0; | ||
1101 | diff --git a/drivers/infiniband/hw/qib/qib_ud.c b/drivers/infiniband/hw/qib/qib_ud.c | ||
1102 | index f45cad1198b0..93012fba287d 100644 | ||
1103 | --- a/drivers/infiniband/hw/qib/qib_ud.c | ||
1104 | +++ b/drivers/infiniband/hw/qib/qib_ud.c | ||
1105 | @@ -525,7 +525,6 @@ void qib_ud_rcv(struct qib_ibport *ibp, struct ib_header *hdr, | ||
1106 | opcode == IB_OPCODE_UD_SEND_ONLY_WITH_IMMEDIATE) { | ||
1107 | wc.ex.imm_data = ohdr->u.ud.imm_data; | ||
1108 | wc.wc_flags = IB_WC_WITH_IMM; | ||
1109 | - tlen -= sizeof(u32); | ||
1110 | } else if (opcode == IB_OPCODE_UD_SEND_ONLY) { | ||
1111 | wc.ex.imm_data = 0; | ||
1112 | wc.wc_flags = 0; | ||
1113 | diff --git a/drivers/input/mouse/elan_i2c_core.c b/drivers/input/mouse/elan_i2c_core.c | ||
1114 | index 25ce9047b682..16f5d5660053 100644 | ||
1115 | --- a/drivers/input/mouse/elan_i2c_core.c | ||
1116 | +++ b/drivers/input/mouse/elan_i2c_core.c | ||
1117 | @@ -1241,6 +1241,7 @@ static const struct acpi_device_id elan_acpi_id[] = { | ||
1118 | { "ELAN0000", 0 }, | ||
1119 | { "ELAN0100", 0 }, | ||
1120 | { "ELAN0600", 0 }, | ||
1121 | + { "ELAN0601", 0 }, | ||
1122 | { "ELAN0602", 0 }, | ||
1123 | { "ELAN0605", 0 }, | ||
1124 | { "ELAN0608", 0 }, | ||
1125 | diff --git a/drivers/input/tablet/wacom_serial4.c b/drivers/input/tablet/wacom_serial4.c | ||
1126 | index 20ab802461e7..1d46b763aae6 100644 | ||
1127 | --- a/drivers/input/tablet/wacom_serial4.c | ||
1128 | +++ b/drivers/input/tablet/wacom_serial4.c | ||
1129 | @@ -187,6 +187,7 @@ enum { | ||
1130 | MODEL_DIGITIZER_II = 0x5544, /* UD */ | ||
1131 | MODEL_GRAPHIRE = 0x4554, /* ET */ | ||
1132 | MODEL_PENPARTNER = 0x4354, /* CT */ | ||
1133 | + MODEL_ARTPAD_II = 0x4B54, /* KT */ | ||
1134 | }; | ||
1135 | |||
1136 | static void wacom_handle_model_response(struct wacom *wacom) | ||
1137 | @@ -245,6 +246,7 @@ static void wacom_handle_model_response(struct wacom *wacom) | ||
1138 | wacom->flags = F_HAS_STYLUS2 | F_HAS_SCROLLWHEEL; | ||
1139 | break; | ||
1140 | |||
1141 | + case MODEL_ARTPAD_II: | ||
1142 | case MODEL_DIGITIZER_II: | ||
1143 | wacom->dev->name = "Wacom Digitizer II"; | ||
1144 | wacom->dev->id.version = MODEL_DIGITIZER_II; | ||
1145 | diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c | ||
1146 | index e984418ffa2a..ca22483d253f 100644 | ||
1147 | --- a/drivers/iommu/amd_iommu.c | ||
1148 | +++ b/drivers/iommu/amd_iommu.c | ||
1149 | @@ -1896,6 +1896,7 @@ static void do_attach(struct iommu_dev_data *dev_data, | ||
1150 | |||
1151 | static void do_detach(struct iommu_dev_data *dev_data) | ||
1152 | { | ||
1153 | + struct protection_domain *domain = dev_data->domain; | ||
1154 | struct amd_iommu *iommu; | ||
1155 | u16 alias; | ||
1156 | |||
1157 | @@ -1911,10 +1912,6 @@ static void do_detach(struct iommu_dev_data *dev_data) | ||
1158 | iommu = amd_iommu_rlookup_table[dev_data->devid]; | ||
1159 | alias = dev_data->alias; | ||
1160 | |||
1161 | - /* decrease reference counters */ | ||
1162 | - dev_data->domain->dev_iommu[iommu->index] -= 1; | ||
1163 | - dev_data->domain->dev_cnt -= 1; | ||
1164 | - | ||
1165 | /* Update data structures */ | ||
1166 | dev_data->domain = NULL; | ||
1167 | list_del(&dev_data->list); | ||
1168 | @@ -1924,6 +1921,16 @@ static void do_detach(struct iommu_dev_data *dev_data) | ||
1169 | |||
1170 | /* Flush the DTE entry */ | ||
1171 | device_flush_dte(dev_data); | ||
1172 | + | ||
1173 | + /* Flush IOTLB */ | ||
1174 | + domain_flush_tlb_pde(domain); | ||
1175 | + | ||
1176 | + /* Wait for the flushes to finish */ | ||
1177 | + domain_flush_complete(domain); | ||
1178 | + | ||
1179 | + /* decrease reference counters - needs to happen after the flushes */ | ||
1180 | + domain->dev_iommu[iommu->index] -= 1; | ||
1181 | + domain->dev_cnt -= 1; | ||
1182 | } | ||
1183 | |||
1184 | /* | ||
1185 | @@ -2611,13 +2618,13 @@ out_unmap: | ||
1186 | bus_addr = address + s->dma_address + (j << PAGE_SHIFT); | ||
1187 | iommu_unmap_page(domain, bus_addr, PAGE_SIZE); | ||
1188 | |||
1189 | - if (--mapped_pages) | ||
1190 | + if (--mapped_pages == 0) | ||
1191 | goto out_free_iova; | ||
1192 | } | ||
1193 | } | ||
1194 | |||
1195 | out_free_iova: | ||
1196 | - free_iova_fast(&dma_dom->iovad, address, npages); | ||
1197 | + free_iova_fast(&dma_dom->iovad, address >> PAGE_SHIFT, npages); | ||
1198 | |||
1199 | out_err: | ||
1200 | return 0; | ||
1201 | diff --git a/drivers/irqchip/irq-mmp.c b/drivers/irqchip/irq-mmp.c | ||
1202 | index 013fc9659a84..2fe2bcb63a71 100644 | ||
1203 | --- a/drivers/irqchip/irq-mmp.c | ||
1204 | +++ b/drivers/irqchip/irq-mmp.c | ||
1205 | @@ -34,6 +34,9 @@ | ||
1206 | #define SEL_INT_PENDING (1 << 6) | ||
1207 | #define SEL_INT_NUM_MASK 0x3f | ||
1208 | |||
1209 | +#define MMP2_ICU_INT_ROUTE_PJ4_IRQ (1 << 5) | ||
1210 | +#define MMP2_ICU_INT_ROUTE_PJ4_FIQ (1 << 6) | ||
1211 | + | ||
1212 | struct icu_chip_data { | ||
1213 | int nr_irqs; | ||
1214 | unsigned int virq_base; | ||
1215 | @@ -190,7 +193,8 @@ static struct mmp_intc_conf mmp_conf = { | ||
1216 | static struct mmp_intc_conf mmp2_conf = { | ||
1217 | .conf_enable = 0x20, | ||
1218 | .conf_disable = 0x0, | ||
1219 | - .conf_mask = 0x7f, | ||
1220 | + .conf_mask = MMP2_ICU_INT_ROUTE_PJ4_IRQ | | ||
1221 | + MMP2_ICU_INT_ROUTE_PJ4_FIQ, | ||
1222 | }; | ||
1223 | |||
1224 | static void __exception_irq_entry mmp_handle_irq(struct pt_regs *regs) | ||
1225 | diff --git a/drivers/isdn/i4l/isdn_tty.c b/drivers/isdn/i4l/isdn_tty.c | ||
1226 | index d4e0d1602c80..6b7eed722e43 100644 | ||
1227 | --- a/drivers/isdn/i4l/isdn_tty.c | ||
1228 | +++ b/drivers/isdn/i4l/isdn_tty.c | ||
1229 | @@ -786,7 +786,7 @@ isdn_tty_suspend(char *id, modem_info *info, atemu *m) | ||
1230 | cmd.parm.cmsg.para[3] = 4; /* 16 bit 0x0004 Suspend */ | ||
1231 | cmd.parm.cmsg.para[4] = 0; | ||
1232 | cmd.parm.cmsg.para[5] = l; | ||
1233 | - strncpy(&cmd.parm.cmsg.para[6], id, l); | ||
1234 | + strscpy(&cmd.parm.cmsg.para[6], id, l); | ||
1235 | cmd.command = CAPI_PUT_MESSAGE; | ||
1236 | cmd.driver = info->isdn_driver; | ||
1237 | cmd.arg = info->isdn_channel; | ||
1238 | diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc_driver.c | ||
1239 | index cde43b63c3da..c630a9f8e356 100644 | ||
1240 | --- a/drivers/media/usb/uvc/uvc_driver.c | ||
1241 | +++ b/drivers/media/usb/uvc/uvc_driver.c | ||
1242 | @@ -1019,11 +1019,19 @@ static int uvc_parse_standard_control(struct uvc_device *dev, | ||
1243 | return -EINVAL; | ||
1244 | } | ||
1245 | |||
1246 | - /* Make sure the terminal type MSB is not null, otherwise it | ||
1247 | - * could be confused with a unit. | ||
1248 | + /* | ||
1249 | + * Reject invalid terminal types that would cause issues: | ||
1250 | + * | ||
1251 | + * - The high byte must be non-zero, otherwise it would be | ||
1252 | + * confused with a unit. | ||
1253 | + * | ||
1254 | + * - Bit 15 must be 0, as we use it internally as a terminal | ||
1255 | + * direction flag. | ||
1256 | + * | ||
1257 | + * Other unknown types are accepted. | ||
1258 | */ | ||
1259 | type = get_unaligned_le16(&buffer[4]); | ||
1260 | - if ((type & 0xff00) == 0) { | ||
1261 | + if ((type & 0x7f00) == 0 || (type & 0x8000) != 0) { | ||
1262 | uvc_trace(UVC_TRACE_DESCR, "device %d videocontrol " | ||
1263 | "interface %d INPUT_TERMINAL %d has invalid " | ||
1264 | "type 0x%04x, skipping\n", udev->devnum, | ||
1265 | diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c | ||
1266 | index 883fd9809dd2..7cee3e5db56c 100644 | ||
1267 | --- a/drivers/net/dsa/mv88e6xxx/chip.c | ||
1268 | +++ b/drivers/net/dsa/mv88e6xxx/chip.c | ||
1269 | @@ -798,7 +798,7 @@ static uint64_t _mv88e6xxx_get_ethtool_stat(struct mv88e6xxx_chip *chip, | ||
1270 | if (s->sizeof_stat == 8) | ||
1271 | _mv88e6xxx_stats_read(chip, s->reg + 1, &high); | ||
1272 | } | ||
1273 | - value = (((u64)high) << 16) | low; | ||
1274 | + value = (((u64)high) << 32) | low; | ||
1275 | return value; | ||
1276 | } | ||
1277 | |||
1278 | diff --git a/drivers/net/ethernet/altera/altera_msgdma.c b/drivers/net/ethernet/altera/altera_msgdma.c | ||
1279 | index 0fb986ba3290..0ae723f75341 100644 | ||
1280 | --- a/drivers/net/ethernet/altera/altera_msgdma.c | ||
1281 | +++ b/drivers/net/ethernet/altera/altera_msgdma.c | ||
1282 | @@ -145,7 +145,8 @@ u32 msgdma_tx_completions(struct altera_tse_private *priv) | ||
1283 | & 0xffff; | ||
1284 | |||
1285 | if (inuse) { /* Tx FIFO is not empty */ | ||
1286 | - ready = priv->tx_prod - priv->tx_cons - inuse - 1; | ||
1287 | + ready = max_t(int, | ||
1288 | + priv->tx_prod - priv->tx_cons - inuse - 1, 0); | ||
1289 | } else { | ||
1290 | /* Check for buffered last packet */ | ||
1291 | status = csrrd32(priv->tx_dma_csr, msgdma_csroffs(status)); | ||
1292 | diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c | ||
1293 | index a036f7039d76..737f0f6f4075 100644 | ||
1294 | --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c | ||
1295 | +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c | ||
1296 | @@ -428,6 +428,12 @@ normal_tx: | ||
1297 | } | ||
1298 | |||
1299 | length >>= 9; | ||
1300 | + if (unlikely(length >= ARRAY_SIZE(bnxt_lhint_arr))) { | ||
1301 | + dev_warn_ratelimited(&pdev->dev, "Dropped oversize %d bytes TX packet.\n", | ||
1302 | + skb->len); | ||
1303 | + i = 0; | ||
1304 | + goto tx_dma_error; | ||
1305 | + } | ||
1306 | flags |= bnxt_lhint_arr[length]; | ||
1307 | txbd->tx_bd_len_flags_type = cpu_to_le32(flags); | ||
1308 | |||
1309 | diff --git a/drivers/net/ethernet/hisilicon/hns/hns_enet.c b/drivers/net/ethernet/hisilicon/hns/hns_enet.c | ||
1310 | index a2f7d0834071..ad8681cf5ef0 100644 | ||
1311 | --- a/drivers/net/ethernet/hisilicon/hns/hns_enet.c | ||
1312 | +++ b/drivers/net/ethernet/hisilicon/hns/hns_enet.c | ||
1313 | @@ -2078,6 +2078,8 @@ static int hns_nic_dev_probe(struct platform_device *pdev) | ||
1314 | out_notify_fail: | ||
1315 | (void)cancel_work_sync(&priv->service_task); | ||
1316 | out_read_prop_fail: | ||
1317 | + /* safe for ACPI FW */ | ||
1318 | + of_node_put(to_of_node(priv->fwnode)); | ||
1319 | free_netdev(ndev); | ||
1320 | return ret; | ||
1321 | } | ||
1322 | @@ -2107,6 +2109,9 @@ static int hns_nic_dev_remove(struct platform_device *pdev) | ||
1323 | set_bit(NIC_STATE_REMOVING, &priv->state); | ||
1324 | (void)cancel_work_sync(&priv->service_task); | ||
1325 | |||
1326 | + /* safe for ACPI FW */ | ||
1327 | + of_node_put(to_of_node(priv->fwnode)); | ||
1328 | + | ||
1329 | free_netdev(ndev); | ||
1330 | return 0; | ||
1331 | } | ||
1332 | diff --git a/drivers/net/ethernet/hisilicon/hns_mdio.c b/drivers/net/ethernet/hisilicon/hns_mdio.c | ||
1333 | index 501eb2090ca6..de23a0ead5d7 100644 | ||
1334 | --- a/drivers/net/ethernet/hisilicon/hns_mdio.c | ||
1335 | +++ b/drivers/net/ethernet/hisilicon/hns_mdio.c | ||
1336 | @@ -329,7 +329,7 @@ static int hns_mdio_read(struct mii_bus *bus, int phy_id, int regnum) | ||
1337 | } | ||
1338 | |||
1339 | hns_mdio_cmd_write(mdio_dev, is_c45, | ||
1340 | - MDIO_C45_WRITE_ADDR, phy_id, devad); | ||
1341 | + MDIO_C45_READ, phy_id, devad); | ||
1342 | } | ||
1343 | |||
1344 | /* Step 5: waitting for MDIO_COMMAND_REG 's mdio_start==0,*/ | ||
1345 | diff --git a/drivers/net/ethernet/marvell/sky2.c b/drivers/net/ethernet/marvell/sky2.c | ||
1346 | index af11781fe5f9..4ac023a37936 100644 | ||
1347 | --- a/drivers/net/ethernet/marvell/sky2.c | ||
1348 | +++ b/drivers/net/ethernet/marvell/sky2.c | ||
1349 | @@ -46,6 +46,7 @@ | ||
1350 | #include <linux/mii.h> | ||
1351 | #include <linux/of_device.h> | ||
1352 | #include <linux/of_net.h> | ||
1353 | +#include <linux/dmi.h> | ||
1354 | |||
1355 | #include <asm/irq.h> | ||
1356 | |||
1357 | @@ -93,7 +94,7 @@ static int copybreak __read_mostly = 128; | ||
1358 | module_param(copybreak, int, 0); | ||
1359 | MODULE_PARM_DESC(copybreak, "Receive copy threshold"); | ||
1360 | |||
1361 | -static int disable_msi = 0; | ||
1362 | +static int disable_msi = -1; | ||
1363 | module_param(disable_msi, int, 0); | ||
1364 | MODULE_PARM_DESC(disable_msi, "Disable Message Signaled Interrupt (MSI)"); | ||
1365 | |||
1366 | @@ -4923,6 +4924,24 @@ static const char *sky2_name(u8 chipid, char *buf, int sz) | ||
1367 | return buf; | ||
1368 | } | ||
1369 | |||
1370 | +static const struct dmi_system_id msi_blacklist[] = { | ||
1371 | + { | ||
1372 | + .ident = "Dell Inspiron 1545", | ||
1373 | + .matches = { | ||
1374 | + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
1375 | + DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron 1545"), | ||
1376 | + }, | ||
1377 | + }, | ||
1378 | + { | ||
1379 | + .ident = "Gateway P-79", | ||
1380 | + .matches = { | ||
1381 | + DMI_MATCH(DMI_SYS_VENDOR, "Gateway"), | ||
1382 | + DMI_MATCH(DMI_PRODUCT_NAME, "P-79"), | ||
1383 | + }, | ||
1384 | + }, | ||
1385 | + {} | ||
1386 | +}; | ||
1387 | + | ||
1388 | static int sky2_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | ||
1389 | { | ||
1390 | struct net_device *dev, *dev1; | ||
1391 | @@ -5034,6 +5053,9 @@ static int sky2_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | ||
1392 | goto err_out_free_pci; | ||
1393 | } | ||
1394 | |||
1395 | + if (disable_msi == -1) | ||
1396 | + disable_msi = !!dmi_check_system(msi_blacklist); | ||
1397 | + | ||
1398 | if (!disable_msi && pci_enable_msi(pdev) == 0) { | ||
1399 | err = sky2_test_msi(hw); | ||
1400 | if (err) { | ||
1401 | diff --git a/drivers/net/ethernet/qlogic/qed/qed_vf.c b/drivers/net/ethernet/qlogic/qed/qed_vf.c | ||
1402 | index 9cc02b94328a..cf34908ec8e1 100644 | ||
1403 | --- a/drivers/net/ethernet/qlogic/qed/qed_vf.c | ||
1404 | +++ b/drivers/net/ethernet/qlogic/qed/qed_vf.c | ||
1405 | @@ -158,6 +158,7 @@ static int qed_vf_pf_acquire(struct qed_hwfn *p_hwfn) | ||
1406 | struct pfvf_acquire_resp_tlv *resp = &p_iov->pf2vf_reply->acquire_resp; | ||
1407 | struct pf_vf_pfdev_info *pfdev_info = &resp->pfdev_info; | ||
1408 | struct vf_pf_resc_request *p_resc; | ||
1409 | + u8 retry_cnt = VF_ACQUIRE_THRESH; | ||
1410 | bool resources_acquired = false; | ||
1411 | struct vfpf_acquire_tlv *req; | ||
1412 | int rc = 0, attempts = 0; | ||
1413 | @@ -203,6 +204,15 @@ static int qed_vf_pf_acquire(struct qed_hwfn *p_hwfn) | ||
1414 | |||
1415 | /* send acquire request */ | ||
1416 | rc = qed_send_msg2pf(p_hwfn, &resp->hdr.status, sizeof(*resp)); | ||
1417 | + | ||
1418 | + /* Re-try acquire in case of vf-pf hw channel timeout */ | ||
1419 | + if (retry_cnt && rc == -EBUSY) { | ||
1420 | + DP_VERBOSE(p_hwfn, QED_MSG_IOV, | ||
1421 | + "VF retrying to acquire due to VPC timeout\n"); | ||
1422 | + retry_cnt--; | ||
1423 | + continue; | ||
1424 | + } | ||
1425 | + | ||
1426 | if (rc) | ||
1427 | goto exit; | ||
1428 | |||
1429 | diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c | ||
1430 | index d80c88bd2bba..6e61bccc90b3 100644 | ||
1431 | --- a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c | ||
1432 | +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c | ||
1433 | @@ -877,8 +877,10 @@ static int rk_gmac_powerup(struct rk_priv_data *bsp_priv) | ||
1434 | } | ||
1435 | |||
1436 | ret = phy_power_on(bsp_priv, true); | ||
1437 | - if (ret) | ||
1438 | + if (ret) { | ||
1439 | + gmac_clk_enable(bsp_priv, false); | ||
1440 | return ret; | ||
1441 | + } | ||
1442 | |||
1443 | ret = gmac_clk_enable(bsp_priv, true); | ||
1444 | if (ret) | ||
1445 | diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c | ||
1446 | index 53602fdf5b47..06f77ec44a15 100644 | ||
1447 | --- a/drivers/net/hyperv/netvsc_drv.c | ||
1448 | +++ b/drivers/net/hyperv/netvsc_drv.c | ||
1449 | @@ -593,6 +593,14 @@ void netvsc_linkstatus_callback(struct hv_device *device_obj, | ||
1450 | schedule_delayed_work(&ndev_ctx->dwork, 0); | ||
1451 | } | ||
1452 | |||
1453 | +static void netvsc_comp_ipcsum(struct sk_buff *skb) | ||
1454 | +{ | ||
1455 | + struct iphdr *iph = (struct iphdr *)skb->data; | ||
1456 | + | ||
1457 | + iph->check = 0; | ||
1458 | + iph->check = ip_fast_csum(iph, iph->ihl); | ||
1459 | +} | ||
1460 | + | ||
1461 | static struct sk_buff *netvsc_alloc_recv_skb(struct net_device *net, | ||
1462 | struct hv_netvsc_packet *packet, | ||
1463 | struct ndis_tcp_ip_checksum_info *csum_info, | ||
1464 | @@ -616,9 +624,17 @@ static struct sk_buff *netvsc_alloc_recv_skb(struct net_device *net, | ||
1465 | /* skb is already created with CHECKSUM_NONE */ | ||
1466 | skb_checksum_none_assert(skb); | ||
1467 | |||
1468 | - /* | ||
1469 | - * In Linux, the IP checksum is always checked. | ||
1470 | - * Do L4 checksum offload if enabled and present. | ||
1471 | + /* Incoming packets may have IP header checksum verified by the host. | ||
1472 | + * They may not have IP header checksum computed after coalescing. | ||
1473 | + * We compute it here if the flags are set, because on Linux, the IP | ||
1474 | + * checksum is always checked. | ||
1475 | + */ | ||
1476 | + if (csum_info && csum_info->receive.ip_checksum_value_invalid && | ||
1477 | + csum_info->receive.ip_checksum_succeeded && | ||
1478 | + skb->protocol == htons(ETH_P_IP)) | ||
1479 | + netvsc_comp_ipcsum(skb); | ||
1480 | + | ||
1481 | + /* Do L4 checksum offload if enabled and present. | ||
1482 | */ | ||
1483 | if (csum_info && (net->features & NETIF_F_RXCSUM)) { | ||
1484 | if (csum_info->receive.tcp_checksum_succeeded || | ||
1485 | diff --git a/drivers/net/phy/micrel.c b/drivers/net/phy/micrel.c | ||
1486 | index 707190d3ada0..16f074408813 100644 | ||
1487 | --- a/drivers/net/phy/micrel.c | ||
1488 | +++ b/drivers/net/phy/micrel.c | ||
1489 | @@ -341,6 +341,17 @@ static int ksz8041_config_aneg(struct phy_device *phydev) | ||
1490 | return genphy_config_aneg(phydev); | ||
1491 | } | ||
1492 | |||
1493 | +static int ksz8061_config_init(struct phy_device *phydev) | ||
1494 | +{ | ||
1495 | + int ret; | ||
1496 | + | ||
1497 | + ret = phy_write_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_DEVID1, 0xB61A); | ||
1498 | + if (ret) | ||
1499 | + return ret; | ||
1500 | + | ||
1501 | + return kszphy_config_init(phydev); | ||
1502 | +} | ||
1503 | + | ||
1504 | static int ksz9021_load_values_from_of(struct phy_device *phydev, | ||
1505 | const struct device_node *of_node, | ||
1506 | u16 reg, | ||
1507 | @@ -940,7 +951,7 @@ static struct phy_driver ksphy_driver[] = { | ||
1508 | .phy_id_mask = MICREL_PHY_ID_MASK, | ||
1509 | .features = (PHY_BASIC_FEATURES | SUPPORTED_Pause), | ||
1510 | .flags = PHY_HAS_MAGICANEG | PHY_HAS_INTERRUPT, | ||
1511 | - .config_init = kszphy_config_init, | ||
1512 | + .config_init = ksz8061_config_init, | ||
1513 | .config_aneg = genphy_config_aneg, | ||
1514 | .read_status = genphy_read_status, | ||
1515 | .ack_interrupt = kszphy_ack_interrupt, | ||
1516 | diff --git a/drivers/net/team/team_mode_loadbalance.c b/drivers/net/team/team_mode_loadbalance.c | ||
1517 | index b228bea7931f..de2530830d93 100644 | ||
1518 | --- a/drivers/net/team/team_mode_loadbalance.c | ||
1519 | +++ b/drivers/net/team/team_mode_loadbalance.c | ||
1520 | @@ -319,6 +319,20 @@ static int lb_bpf_func_set(struct team *team, struct team_gsetter_ctx *ctx) | ||
1521 | return 0; | ||
1522 | } | ||
1523 | |||
1524 | +static void lb_bpf_func_free(struct team *team) | ||
1525 | +{ | ||
1526 | + struct lb_priv *lb_priv = get_lb_priv(team); | ||
1527 | + struct bpf_prog *fp; | ||
1528 | + | ||
1529 | + if (!lb_priv->ex->orig_fprog) | ||
1530 | + return; | ||
1531 | + | ||
1532 | + __fprog_destroy(lb_priv->ex->orig_fprog); | ||
1533 | + fp = rcu_dereference_protected(lb_priv->fp, | ||
1534 | + lockdep_is_held(&team->lock)); | ||
1535 | + bpf_prog_destroy(fp); | ||
1536 | +} | ||
1537 | + | ||
1538 | static int lb_tx_method_get(struct team *team, struct team_gsetter_ctx *ctx) | ||
1539 | { | ||
1540 | struct lb_priv *lb_priv = get_lb_priv(team); | ||
1541 | @@ -633,6 +647,7 @@ static void lb_exit(struct team *team) | ||
1542 | |||
1543 | team_options_unregister(team, lb_options, | ||
1544 | ARRAY_SIZE(lb_options)); | ||
1545 | + lb_bpf_func_free(team); | ||
1546 | cancel_delayed_work_sync(&lb_priv->ex->stats.refresh_dw); | ||
1547 | free_percpu(lb_priv->pcpu_stats); | ||
1548 | kfree(lb_priv->ex); | ||
1549 | diff --git a/drivers/net/tun.c b/drivers/net/tun.c | ||
1550 | index 7a0d5e928bec..24cc94453d38 100644 | ||
1551 | --- a/drivers/net/tun.c | ||
1552 | +++ b/drivers/net/tun.c | ||
1553 | @@ -1471,9 +1471,9 @@ static struct sk_buff *tun_ring_recv(struct tun_file *tfile, int noblock, | ||
1554 | } | ||
1555 | |||
1556 | add_wait_queue(&tfile->wq.wait, &wait); | ||
1557 | - current->state = TASK_INTERRUPTIBLE; | ||
1558 | |||
1559 | while (1) { | ||
1560 | + set_current_state(TASK_INTERRUPTIBLE); | ||
1561 | skb = skb_array_consume(&tfile->tx_array); | ||
1562 | if (skb) | ||
1563 | break; | ||
1564 | @@ -1489,7 +1489,7 @@ static struct sk_buff *tun_ring_recv(struct tun_file *tfile, int noblock, | ||
1565 | schedule(); | ||
1566 | } | ||
1567 | |||
1568 | - current->state = TASK_RUNNING; | ||
1569 | + __set_current_state(TASK_RUNNING); | ||
1570 | remove_wait_queue(&tfile->wq.wait, &wait); | ||
1571 | |||
1572 | out: | ||
1573 | diff --git a/drivers/net/xen-netback/hash.c b/drivers/net/xen-netback/hash.c | ||
1574 | index 3b6fb5b3bdb2..6414cc6b9032 100644 | ||
1575 | --- a/drivers/net/xen-netback/hash.c | ||
1576 | +++ b/drivers/net/xen-netback/hash.c | ||
1577 | @@ -435,6 +435,8 @@ void xenvif_init_hash(struct xenvif *vif) | ||
1578 | if (xenvif_hash_cache_size == 0) | ||
1579 | return; | ||
1580 | |||
1581 | + BUG_ON(vif->hash.cache.count); | ||
1582 | + | ||
1583 | spin_lock_init(&vif->hash.cache.lock); | ||
1584 | INIT_LIST_HEAD(&vif->hash.cache.list); | ||
1585 | } | ||
1586 | diff --git a/drivers/net/xen-netback/interface.c b/drivers/net/xen-netback/interface.c | ||
1587 | index 618013e7f87b..cae691486105 100644 | ||
1588 | --- a/drivers/net/xen-netback/interface.c | ||
1589 | +++ b/drivers/net/xen-netback/interface.c | ||
1590 | @@ -152,6 +152,13 @@ static u16 xenvif_select_queue(struct net_device *dev, struct sk_buff *skb, | ||
1591 | { | ||
1592 | struct xenvif *vif = netdev_priv(dev); | ||
1593 | unsigned int size = vif->hash.size; | ||
1594 | + unsigned int num_queues; | ||
1595 | + | ||
1596 | + /* If queues are not set up internally - always return 0 | ||
1597 | + * as the packet going to be dropped anyway */ | ||
1598 | + num_queues = READ_ONCE(vif->num_queues); | ||
1599 | + if (num_queues < 1) | ||
1600 | + return 0; | ||
1601 | |||
1602 | if (vif->hash.alg == XEN_NETIF_CTRL_HASH_ALGORITHM_NONE) | ||
1603 | return fallback(dev, skb) % dev->real_num_tx_queues; | ||
1604 | diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c | ||
1605 | index a7bdb1ffac2e..f57815befc90 100644 | ||
1606 | --- a/drivers/net/xen-netback/netback.c | ||
1607 | +++ b/drivers/net/xen-netback/netback.c | ||
1608 | @@ -1074,11 +1074,6 @@ static int xenvif_handle_frag_list(struct xenvif_queue *queue, struct sk_buff *s | ||
1609 | skb_frag_size_set(&frags[i], len); | ||
1610 | } | ||
1611 | |||
1612 | - /* Copied all the bits from the frag list -- free it. */ | ||
1613 | - skb_frag_list_init(skb); | ||
1614 | - xenvif_skb_zerocopy_prepare(queue, nskb); | ||
1615 | - kfree_skb(nskb); | ||
1616 | - | ||
1617 | /* Release all the original (foreign) frags. */ | ||
1618 | for (f = 0; f < skb_shinfo(skb)->nr_frags; f++) | ||
1619 | skb_frag_unref(skb, f); | ||
1620 | @@ -1147,6 +1142,8 @@ static int xenvif_tx_submit(struct xenvif_queue *queue) | ||
1621 | xenvif_fill_frags(queue, skb); | ||
1622 | |||
1623 | if (unlikely(skb_has_frag_list(skb))) { | ||
1624 | + struct sk_buff *nskb = skb_shinfo(skb)->frag_list; | ||
1625 | + xenvif_skb_zerocopy_prepare(queue, nskb); | ||
1626 | if (xenvif_handle_frag_list(queue, skb)) { | ||
1627 | if (net_ratelimit()) | ||
1628 | netdev_err(queue->vif->dev, | ||
1629 | @@ -1155,6 +1152,9 @@ static int xenvif_tx_submit(struct xenvif_queue *queue) | ||
1630 | kfree_skb(skb); | ||
1631 | continue; | ||
1632 | } | ||
1633 | + /* Copied all the bits from the frag list -- free it. */ | ||
1634 | + skb_frag_list_init(skb); | ||
1635 | + kfree_skb(nskb); | ||
1636 | } | ||
1637 | |||
1638 | skb->dev = queue->vif->dev; | ||
1639 | diff --git a/drivers/platform/x86/Kconfig b/drivers/platform/x86/Kconfig | ||
1640 | index b8a21d7b25d4..1d81149c9ea4 100644 | ||
1641 | --- a/drivers/platform/x86/Kconfig | ||
1642 | +++ b/drivers/platform/x86/Kconfig | ||
1643 | @@ -945,6 +945,7 @@ config INTEL_OAKTRAIL | ||
1644 | config SAMSUNG_Q10 | ||
1645 | tristate "Samsung Q10 Extras" | ||
1646 | depends on ACPI | ||
1647 | + depends on BACKLIGHT_LCD_SUPPORT | ||
1648 | select BACKLIGHT_CLASS_DEVICE | ||
1649 | ---help--- | ||
1650 | This driver provides support for backlight control on Samsung Q10 | ||
1651 | diff --git a/drivers/s390/net/qeth_core_main.c b/drivers/s390/net/qeth_core_main.c | ||
1652 | index 8f77fc0630ce..86a02592b982 100644 | ||
1653 | --- a/drivers/s390/net/qeth_core_main.c | ||
1654 | +++ b/drivers/s390/net/qeth_core_main.c | ||
1655 | @@ -2449,11 +2449,12 @@ out: | ||
1656 | return rc; | ||
1657 | } | ||
1658 | |||
1659 | -static void qeth_free_qdio_out_buf(struct qeth_qdio_out_q *q) | ||
1660 | +static void qeth_free_output_queue(struct qeth_qdio_out_q *q) | ||
1661 | { | ||
1662 | if (!q) | ||
1663 | return; | ||
1664 | |||
1665 | + qeth_clear_outq_buffers(q, 1); | ||
1666 | qdio_free_buffers(q->qdio_bufs, QDIO_MAX_BUFFERS_PER_Q); | ||
1667 | kfree(q); | ||
1668 | } | ||
1669 | @@ -2526,10 +2527,8 @@ out_freeoutqbufs: | ||
1670 | card->qdio.out_qs[i]->bufs[j] = NULL; | ||
1671 | } | ||
1672 | out_freeoutq: | ||
1673 | - while (i > 0) { | ||
1674 | - qeth_free_qdio_out_buf(card->qdio.out_qs[--i]); | ||
1675 | - qeth_clear_outq_buffers(card->qdio.out_qs[i], 1); | ||
1676 | - } | ||
1677 | + while (i > 0) | ||
1678 | + qeth_free_output_queue(card->qdio.out_qs[--i]); | ||
1679 | kfree(card->qdio.out_qs); | ||
1680 | card->qdio.out_qs = NULL; | ||
1681 | out_freepool: | ||
1682 | @@ -2562,10 +2561,8 @@ static void qeth_free_qdio_buffers(struct qeth_card *card) | ||
1683 | qeth_free_buffer_pool(card); | ||
1684 | /* free outbound qdio_qs */ | ||
1685 | if (card->qdio.out_qs) { | ||
1686 | - for (i = 0; i < card->qdio.no_out_queues; ++i) { | ||
1687 | - qeth_clear_outq_buffers(card->qdio.out_qs[i], 1); | ||
1688 | - qeth_free_qdio_out_buf(card->qdio.out_qs[i]); | ||
1689 | - } | ||
1690 | + for (i = 0; i < card->qdio.no_out_queues; i++) | ||
1691 | + qeth_free_output_queue(card->qdio.out_qs[i]); | ||
1692 | kfree(card->qdio.out_qs); | ||
1693 | card->qdio.out_qs = NULL; | ||
1694 | } | ||
1695 | diff --git a/drivers/scsi/aacraid/commsup.c b/drivers/scsi/aacraid/commsup.c | ||
1696 | index fe670b696251..2d9696b3d432 100644 | ||
1697 | --- a/drivers/scsi/aacraid/commsup.c | ||
1698 | +++ b/drivers/scsi/aacraid/commsup.c | ||
1699 | @@ -1179,8 +1179,9 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr) | ||
1700 | ADD : DELETE; | ||
1701 | break; | ||
1702 | } | ||
1703 | - case AifBuManagerEvent: | ||
1704 | - aac_handle_aif_bu(dev, aifcmd); | ||
1705 | + break; | ||
1706 | + case AifBuManagerEvent: | ||
1707 | + aac_handle_aif_bu(dev, aifcmd); | ||
1708 | break; | ||
1709 | } | ||
1710 | |||
1711 | diff --git a/drivers/scsi/libfc/fc_lport.c b/drivers/scsi/libfc/fc_lport.c | ||
1712 | index 50c71678a156..ae93f45f9cd8 100644 | ||
1713 | --- a/drivers/scsi/libfc/fc_lport.c | ||
1714 | +++ b/drivers/scsi/libfc/fc_lport.c | ||
1715 | @@ -1736,14 +1736,14 @@ void fc_lport_flogi_resp(struct fc_seq *sp, struct fc_frame *fp, | ||
1716 | fc_frame_payload_op(fp) != ELS_LS_ACC) { | ||
1717 | FC_LPORT_DBG(lport, "FLOGI not accepted or bad response\n"); | ||
1718 | fc_lport_error(lport, fp); | ||
1719 | - goto err; | ||
1720 | + goto out; | ||
1721 | } | ||
1722 | |||
1723 | flp = fc_frame_payload_get(fp, sizeof(*flp)); | ||
1724 | if (!flp) { | ||
1725 | FC_LPORT_DBG(lport, "FLOGI bad response\n"); | ||
1726 | fc_lport_error(lport, fp); | ||
1727 | - goto err; | ||
1728 | + goto out; | ||
1729 | } | ||
1730 | |||
1731 | mfs = ntohs(flp->fl_csp.sp_bb_data) & | ||
1732 | @@ -1753,7 +1753,7 @@ void fc_lport_flogi_resp(struct fc_seq *sp, struct fc_frame *fp, | ||
1733 | FC_LPORT_DBG(lport, "FLOGI bad mfs:%hu response, " | ||
1734 | "lport->mfs:%hu\n", mfs, lport->mfs); | ||
1735 | fc_lport_error(lport, fp); | ||
1736 | - goto err; | ||
1737 | + goto out; | ||
1738 | } | ||
1739 | |||
1740 | if (mfs <= lport->mfs) { | ||
1741 | diff --git a/drivers/soc/fsl/qbman/qman.c b/drivers/soc/fsl/qbman/qman.c | ||
1742 | index 2cc82ed6433a..91f5c951850f 100644 | ||
1743 | --- a/drivers/soc/fsl/qbman/qman.c | ||
1744 | +++ b/drivers/soc/fsl/qbman/qman.c | ||
1745 | @@ -1073,18 +1073,19 @@ static void qm_mr_process_task(struct work_struct *work); | ||
1746 | static irqreturn_t portal_isr(int irq, void *ptr) | ||
1747 | { | ||
1748 | struct qman_portal *p = ptr; | ||
1749 | - | ||
1750 | - u32 clear = QM_DQAVAIL_MASK | p->irq_sources; | ||
1751 | u32 is = qm_in(&p->p, QM_REG_ISR) & p->irq_sources; | ||
1752 | + u32 clear = 0; | ||
1753 | |||
1754 | if (unlikely(!is)) | ||
1755 | return IRQ_NONE; | ||
1756 | |||
1757 | /* DQRR-handling if it's interrupt-driven */ | ||
1758 | - if (is & QM_PIRQ_DQRI) | ||
1759 | + if (is & QM_PIRQ_DQRI) { | ||
1760 | __poll_portal_fast(p, QMAN_POLL_LIMIT); | ||
1761 | + clear = QM_DQAVAIL_MASK | QM_PIRQ_DQRI; | ||
1762 | + } | ||
1763 | /* Handling of anything else that's interrupt-driven */ | ||
1764 | - clear |= __poll_portal_slow(p, is); | ||
1765 | + clear |= __poll_portal_slow(p, is) & QM_PIRQ_SLOW; | ||
1766 | qm_out(&p->p, QM_REG_ISR, clear); | ||
1767 | return IRQ_HANDLED; | ||
1768 | } | ||
1769 | diff --git a/drivers/staging/android/ion/ion_system_heap.c b/drivers/staging/android/ion/ion_system_heap.c | ||
1770 | index d270a424ecac..22c481f2ae4f 100644 | ||
1771 | --- a/drivers/staging/android/ion/ion_system_heap.c | ||
1772 | +++ b/drivers/staging/android/ion/ion_system_heap.c | ||
1773 | @@ -307,10 +307,10 @@ static int ion_system_heap_create_pools(struct ion_page_pool **pools, | ||
1774 | bool cached) | ||
1775 | { | ||
1776 | int i; | ||
1777 | - gfp_t gfp_flags = low_order_gfp_flags; | ||
1778 | |||
1779 | for (i = 0; i < NUM_ORDERS; i++) { | ||
1780 | struct ion_page_pool *pool; | ||
1781 | + gfp_t gfp_flags = low_order_gfp_flags; | ||
1782 | |||
1783 | if (orders[i] > 4) | ||
1784 | gfp_flags = high_order_gfp_flags; | ||
1785 | diff --git a/drivers/staging/comedi/drivers/ni_660x.c b/drivers/staging/comedi/drivers/ni_660x.c | ||
1786 | index 0dcb826a9f1f..723bdd2c2c74 100644 | ||
1787 | --- a/drivers/staging/comedi/drivers/ni_660x.c | ||
1788 | +++ b/drivers/staging/comedi/drivers/ni_660x.c | ||
1789 | @@ -606,6 +606,7 @@ static int ni_660x_set_pfi_routing(struct comedi_device *dev, | ||
1790 | case NI_660X_PFI_OUTPUT_DIO: | ||
1791 | if (chan > 31) | ||
1792 | return -EINVAL; | ||
1793 | + break; | ||
1794 | default: | ||
1795 | return -EINVAL; | ||
1796 | } | ||
1797 | diff --git a/drivers/staging/wilc1000/linux_wlan.c b/drivers/staging/wilc1000/linux_wlan.c | ||
1798 | index 2e5e3b368532..b7203867ea9d 100644 | ||
1799 | --- a/drivers/staging/wilc1000/linux_wlan.c | ||
1800 | +++ b/drivers/staging/wilc1000/linux_wlan.c | ||
1801 | @@ -1263,8 +1263,8 @@ int wilc_netdev_init(struct wilc **wilc, struct device *dev, int io_type, | ||
1802 | vif->wilc = *wilc; | ||
1803 | vif->ndev = ndev; | ||
1804 | wl->vif[i] = vif; | ||
1805 | - wl->vif_num = i; | ||
1806 | - vif->idx = wl->vif_num; | ||
1807 | + wl->vif_num = i + 1; | ||
1808 | + vif->idx = i; | ||
1809 | |||
1810 | ndev->netdev_ops = &wilc_netdev_ops; | ||
1811 | |||
1812 | diff --git a/drivers/usb/phy/Kconfig b/drivers/usb/phy/Kconfig | ||
1813 | index 125cea1c3c8d..19ce615455c1 100644 | ||
1814 | --- a/drivers/usb/phy/Kconfig | ||
1815 | +++ b/drivers/usb/phy/Kconfig | ||
1816 | @@ -20,7 +20,7 @@ config AB8500_USB | ||
1817 | |||
1818 | config FSL_USB2_OTG | ||
1819 | bool "Freescale USB OTG Transceiver Driver" | ||
1820 | - depends on USB_EHCI_FSL && USB_FSL_USB2 && USB_OTG_FSM && PM | ||
1821 | + depends on USB_EHCI_FSL && USB_FSL_USB2 && USB_OTG_FSM=y && PM | ||
1822 | depends on USB_GADGET || !USB_GADGET # if USB_GADGET=m, this can't be 'y' | ||
1823 | select USB_PHY | ||
1824 | help | ||
1825 | diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c | ||
1826 | index c2b120021443..7bbf2ca73f68 100644 | ||
1827 | --- a/drivers/usb/serial/cp210x.c | ||
1828 | +++ b/drivers/usb/serial/cp210x.c | ||
1829 | @@ -58,6 +58,7 @@ static const struct usb_device_id id_table[] = { | ||
1830 | { USB_DEVICE(0x08e6, 0x5501) }, /* Gemalto Prox-PU/CU contactless smartcard reader */ | ||
1831 | { USB_DEVICE(0x08FD, 0x000A) }, /* Digianswer A/S , ZigBee/802.15.4 MAC Device */ | ||
1832 | { USB_DEVICE(0x0908, 0x01FF) }, /* Siemens RUGGEDCOM USB Serial Console */ | ||
1833 | + { USB_DEVICE(0x0B00, 0x3070) }, /* Ingenico 3070 */ | ||
1834 | { USB_DEVICE(0x0BED, 0x1100) }, /* MEI (TM) Cashflow-SC Bill/Voucher Acceptor */ | ||
1835 | { USB_DEVICE(0x0BED, 0x1101) }, /* MEI series 2000 Combo Acceptor */ | ||
1836 | { USB_DEVICE(0x0FCF, 0x1003) }, /* Dynastream ANT development board */ | ||
1837 | diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c | ||
1838 | index 2e2f736384ab..b88a72220acd 100644 | ||
1839 | --- a/drivers/usb/serial/ftdi_sio.c | ||
1840 | +++ b/drivers/usb/serial/ftdi_sio.c | ||
1841 | @@ -1020,6 +1020,8 @@ static const struct usb_device_id id_table_combined[] = { | ||
1842 | { USB_DEVICE(CYPRESS_VID, CYPRESS_WICED_BT_USB_PID) }, | ||
1843 | { USB_DEVICE(CYPRESS_VID, CYPRESS_WICED_WL_USB_PID) }, | ||
1844 | { USB_DEVICE(AIRBUS_DS_VID, AIRBUS_DS_P8GR) }, | ||
1845 | + /* EZPrototypes devices */ | ||
1846 | + { USB_DEVICE(EZPROTOTYPES_VID, HJELMSLUND_USB485_ISO_PID) }, | ||
1847 | { } /* Terminating entry */ | ||
1848 | }; | ||
1849 | |||
1850 | diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h | ||
1851 | index 76a10b222ff9..ddf5ab983dc9 100644 | ||
1852 | --- a/drivers/usb/serial/ftdi_sio_ids.h | ||
1853 | +++ b/drivers/usb/serial/ftdi_sio_ids.h | ||
1854 | @@ -1307,6 +1307,12 @@ | ||
1855 | #define IONICS_VID 0x1c0c | ||
1856 | #define IONICS_PLUGCOMPUTER_PID 0x0102 | ||
1857 | |||
1858 | +/* | ||
1859 | + * EZPrototypes (PID reseller) | ||
1860 | + */ | ||
1861 | +#define EZPROTOTYPES_VID 0x1c40 | ||
1862 | +#define HJELMSLUND_USB485_ISO_PID 0x0477 | ||
1863 | + | ||
1864 | /* | ||
1865 | * Dresden Elektronik Sensor Terminal Board | ||
1866 | */ | ||
1867 | diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c | ||
1868 | index 7bc2c9fef605..b2b7c12e5c86 100644 | ||
1869 | --- a/drivers/usb/serial/option.c | ||
1870 | +++ b/drivers/usb/serial/option.c | ||
1871 | @@ -1147,6 +1147,8 @@ static const struct usb_device_id option_ids[] = { | ||
1872 | .driver_info = NCTRL(0) | RSVD(1) | RSVD(3) }, | ||
1873 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_ME910_DUAL_MODEM), | ||
1874 | .driver_info = NCTRL(0) | RSVD(3) }, | ||
1875 | + { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1102, 0xff), /* Telit ME910 (ECM) */ | ||
1876 | + .driver_info = NCTRL(0) }, | ||
1877 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE910), | ||
1878 | .driver_info = NCTRL(0) | RSVD(1) | RSVD(2) }, | ||
1879 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE910_USBCFG4), | ||
1880 | diff --git a/fs/autofs4/expire.c b/fs/autofs4/expire.c | ||
1881 | index d8e6d421c27f..2e1f50e467f1 100644 | ||
1882 | --- a/fs/autofs4/expire.c | ||
1883 | +++ b/fs/autofs4/expire.c | ||
1884 | @@ -563,7 +563,6 @@ int autofs4_expire_run(struct super_block *sb, | ||
1885 | pkt.len = dentry->d_name.len; | ||
1886 | memcpy(pkt.name, dentry->d_name.name, pkt.len); | ||
1887 | pkt.name[pkt.len] = '\0'; | ||
1888 | - dput(dentry); | ||
1889 | |||
1890 | if (copy_to_user(pkt_p, &pkt, sizeof(struct autofs_packet_expire))) | ||
1891 | ret = -EFAULT; | ||
1892 | @@ -576,6 +575,8 @@ int autofs4_expire_run(struct super_block *sb, | ||
1893 | complete_all(&ino->expire_complete); | ||
1894 | spin_unlock(&sbi->fs_lock); | ||
1895 | |||
1896 | + dput(dentry); | ||
1897 | + | ||
1898 | return ret; | ||
1899 | } | ||
1900 | |||
1901 | diff --git a/fs/autofs4/inode.c b/fs/autofs4/inode.c | ||
1902 | index ce0c6ea96a87..d9a3264909d0 100644 | ||
1903 | --- a/fs/autofs4/inode.c | ||
1904 | +++ b/fs/autofs4/inode.c | ||
1905 | @@ -259,8 +259,10 @@ int autofs4_fill_super(struct super_block *s, void *data, int silent) | ||
1906 | } | ||
1907 | root_inode = autofs4_get_inode(s, S_IFDIR | 0755); | ||
1908 | root = d_make_root(root_inode); | ||
1909 | - if (!root) | ||
1910 | + if (!root) { | ||
1911 | + ret = -ENOMEM; | ||
1912 | goto fail_ino; | ||
1913 | + } | ||
1914 | pipe = NULL; | ||
1915 | |||
1916 | root->d_fsdata = ino; | ||
1917 | diff --git a/fs/buffer.c b/fs/buffer.c | ||
1918 | index 5d8f496d624e..e0d46d47e358 100644 | ||
1919 | --- a/fs/buffer.c | ||
1920 | +++ b/fs/buffer.c | ||
1921 | @@ -207,6 +207,7 @@ __find_get_block_slow(struct block_device *bdev, sector_t block) | ||
1922 | struct buffer_head *head; | ||
1923 | struct page *page; | ||
1924 | int all_mapped = 1; | ||
1925 | + static DEFINE_RATELIMIT_STATE(last_warned, HZ, 1); | ||
1926 | |||
1927 | index = block >> (PAGE_SHIFT - bd_inode->i_blkbits); | ||
1928 | page = find_get_page_flags(bd_mapping, index, FGP_ACCESSED); | ||
1929 | @@ -234,15 +235,15 @@ __find_get_block_slow(struct block_device *bdev, sector_t block) | ||
1930 | * file io on the block device and getblk. It gets dealt with | ||
1931 | * elsewhere, don't buffer_error if we had some unmapped buffers | ||
1932 | */ | ||
1933 | - if (all_mapped) { | ||
1934 | - printk("__find_get_block_slow() failed. " | ||
1935 | - "block=%llu, b_blocknr=%llu\n", | ||
1936 | - (unsigned long long)block, | ||
1937 | - (unsigned long long)bh->b_blocknr); | ||
1938 | - printk("b_state=0x%08lx, b_size=%zu\n", | ||
1939 | - bh->b_state, bh->b_size); | ||
1940 | - printk("device %pg blocksize: %d\n", bdev, | ||
1941 | - 1 << bd_inode->i_blkbits); | ||
1942 | + ratelimit_set_flags(&last_warned, RATELIMIT_MSG_ON_RELEASE); | ||
1943 | + if (all_mapped && __ratelimit(&last_warned)) { | ||
1944 | + printk("__find_get_block_slow() failed. block=%llu, " | ||
1945 | + "b_blocknr=%llu, b_state=0x%08lx, b_size=%zu, " | ||
1946 | + "device %pg blocksize: %d\n", | ||
1947 | + (unsigned long long)block, | ||
1948 | + (unsigned long long)bh->b_blocknr, | ||
1949 | + bh->b_state, bh->b_size, bdev, | ||
1950 | + 1 << bd_inode->i_blkbits); | ||
1951 | } | ||
1952 | out_unlock: | ||
1953 | spin_unlock(&bd_mapping->private_lock); | ||
1954 | diff --git a/fs/cifs/smb2pdu.h b/fs/cifs/smb2pdu.h | ||
1955 | index 1e1449ad00e8..1af7afae3ad1 100644 | ||
1956 | --- a/fs/cifs/smb2pdu.h | ||
1957 | +++ b/fs/cifs/smb2pdu.h | ||
1958 | @@ -84,8 +84,8 @@ | ||
1959 | |||
1960 | #define NUMBER_OF_SMB2_COMMANDS 0x0013 | ||
1961 | |||
1962 | -/* 4 len + 52 transform hdr + 64 hdr + 56 create rsp */ | ||
1963 | -#define MAX_SMB2_HDR_SIZE 0x00b0 | ||
1964 | +/* 52 transform hdr + 64 hdr + 88 create rsp */ | ||
1965 | +#define MAX_SMB2_HDR_SIZE 204 | ||
1966 | |||
1967 | #define SMB2_PROTO_NUMBER cpu_to_le32(0x424d53fe) | ||
1968 | #define SMB2_TRANSFORM_PROTO_NUM cpu_to_le32(0x424d53fd) | ||
1969 | diff --git a/fs/drop_caches.c b/fs/drop_caches.c | ||
1970 | index d72d52b90433..280460fef066 100644 | ||
1971 | --- a/fs/drop_caches.c | ||
1972 | +++ b/fs/drop_caches.c | ||
1973 | @@ -20,8 +20,13 @@ static void drop_pagecache_sb(struct super_block *sb, void *unused) | ||
1974 | spin_lock(&sb->s_inode_list_lock); | ||
1975 | list_for_each_entry(inode, &sb->s_inodes, i_sb_list) { | ||
1976 | spin_lock(&inode->i_lock); | ||
1977 | + /* | ||
1978 | + * We must skip inodes in unusual state. We may also skip | ||
1979 | + * inodes without pages but we deliberately won't in case | ||
1980 | + * we need to reschedule to avoid softlockups. | ||
1981 | + */ | ||
1982 | if ((inode->i_state & (I_FREEING|I_WILL_FREE|I_NEW)) || | ||
1983 | - (inode->i_mapping->nrpages == 0)) { | ||
1984 | + (inode->i_mapping->nrpages == 0 && !need_resched())) { | ||
1985 | spin_unlock(&inode->i_lock); | ||
1986 | continue; | ||
1987 | } | ||
1988 | @@ -29,6 +34,7 @@ static void drop_pagecache_sb(struct super_block *sb, void *unused) | ||
1989 | spin_unlock(&inode->i_lock); | ||
1990 | spin_unlock(&sb->s_inode_list_lock); | ||
1991 | |||
1992 | + cond_resched(); | ||
1993 | invalidate_mapping_pages(inode->i_mapping, 0, -1); | ||
1994 | iput(toput_inode); | ||
1995 | toput_inode = inode; | ||
1996 | diff --git a/fs/exec.c b/fs/exec.c | ||
1997 | index fcd8642ef2d2..81477116035d 100644 | ||
1998 | --- a/fs/exec.c | ||
1999 | +++ b/fs/exec.c | ||
2000 | @@ -938,7 +938,7 @@ int kernel_read_file(struct file *file, void **buf, loff_t *size, | ||
2001 | i_size - pos); | ||
2002 | if (bytes < 0) { | ||
2003 | ret = bytes; | ||
2004 | - goto out; | ||
2005 | + goto out_free; | ||
2006 | } | ||
2007 | |||
2008 | if (bytes == 0) | ||
2009 | diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c | ||
2010 | index f53c139c312e..001487b230b5 100644 | ||
2011 | --- a/fs/hugetlbfs/inode.c | ||
2012 | +++ b/fs/hugetlbfs/inode.c | ||
2013 | @@ -861,6 +861,18 @@ static int hugetlbfs_migrate_page(struct address_space *mapping, | ||
2014 | rc = migrate_huge_page_move_mapping(mapping, newpage, page); | ||
2015 | if (rc != MIGRATEPAGE_SUCCESS) | ||
2016 | return rc; | ||
2017 | + | ||
2018 | + /* | ||
2019 | + * page_private is subpool pointer in hugetlb pages. Transfer to | ||
2020 | + * new page. PagePrivate is not associated with page_private for | ||
2021 | + * hugetlb pages and can not be set here as only page_huge_active | ||
2022 | + * pages can be migrated. | ||
2023 | + */ | ||
2024 | + if (page_private(page)) { | ||
2025 | + set_page_private(newpage, page_private(page)); | ||
2026 | + set_page_private(page, 0); | ||
2027 | + } | ||
2028 | + | ||
2029 | migrate_page_copy(newpage, page); | ||
2030 | |||
2031 | return MIGRATEPAGE_SUCCESS; | ||
2032 | diff --git a/fs/ncpfs/ioctl.c b/fs/ncpfs/ioctl.c | ||
2033 | index 0a3f9b594602..37779ed3f790 100644 | ||
2034 | --- a/fs/ncpfs/ioctl.c | ||
2035 | +++ b/fs/ncpfs/ioctl.c | ||
2036 | @@ -233,7 +233,7 @@ ncp_get_charsets(struct ncp_server* server, struct ncp_nls_ioctl __user *arg) | ||
2037 | len = strlen(server->nls_vol->charset); | ||
2038 | if (len > NCP_IOCSNAME_LEN) | ||
2039 | len = NCP_IOCSNAME_LEN; | ||
2040 | - strncpy(user.codepage, server->nls_vol->charset, len); | ||
2041 | + strscpy(user.codepage, server->nls_vol->charset, NCP_IOCSNAME_LEN); | ||
2042 | user.codepage[len] = 0; | ||
2043 | } | ||
2044 | |||
2045 | @@ -243,7 +243,7 @@ ncp_get_charsets(struct ncp_server* server, struct ncp_nls_ioctl __user *arg) | ||
2046 | len = strlen(server->nls_io->charset); | ||
2047 | if (len > NCP_IOCSNAME_LEN) | ||
2048 | len = NCP_IOCSNAME_LEN; | ||
2049 | - strncpy(user.iocharset, server->nls_io->charset, len); | ||
2050 | + strscpy(user.iocharset, server->nls_io->charset, NCP_IOCSNAME_LEN); | ||
2051 | user.iocharset[len] = 0; | ||
2052 | } | ||
2053 | mutex_unlock(&server->root_setup_lock); | ||
2054 | diff --git a/fs/nfs/super.c b/fs/nfs/super.c | ||
2055 | index 35aef192a13f..659ad12e33ba 100644 | ||
2056 | --- a/fs/nfs/super.c | ||
2057 | +++ b/fs/nfs/super.c | ||
2058 | @@ -1904,6 +1904,11 @@ static int nfs_parse_devname(const char *dev_name, | ||
2059 | size_t len; | ||
2060 | char *end; | ||
2061 | |||
2062 | + if (unlikely(!dev_name || !*dev_name)) { | ||
2063 | + dfprintk(MOUNT, "NFS: device name not specified\n"); | ||
2064 | + return -EINVAL; | ||
2065 | + } | ||
2066 | + | ||
2067 | /* Is the host name protected with square brakcets? */ | ||
2068 | if (*dev_name == '[') { | ||
2069 | end = strchr(++dev_name, ']'); | ||
2070 | diff --git a/include/drm/drm_cache.h b/include/drm/drm_cache.h | ||
2071 | index cebecff536a3..c5fb6f871930 100644 | ||
2072 | --- a/include/drm/drm_cache.h | ||
2073 | +++ b/include/drm/drm_cache.h | ||
2074 | @@ -41,6 +41,24 @@ static inline bool drm_arch_can_wc_memory(void) | ||
2075 | return false; | ||
2076 | #elif defined(CONFIG_MIPS) && defined(CONFIG_CPU_LOONGSON3) | ||
2077 | return false; | ||
2078 | +#elif defined(CONFIG_ARM) || defined(CONFIG_ARM64) | ||
2079 | + /* | ||
2080 | + * The DRM driver stack is designed to work with cache coherent devices | ||
2081 | + * only, but permits an optimization to be enabled in some cases, where | ||
2082 | + * for some buffers, both the CPU and the GPU use uncached mappings, | ||
2083 | + * removing the need for DMA snooping and allocation in the CPU caches. | ||
2084 | + * | ||
2085 | + * The use of uncached GPU mappings relies on the correct implementation | ||
2086 | + * of the PCIe NoSnoop TLP attribute by the platform, otherwise the GPU | ||
2087 | + * will use cached mappings nonetheless. On x86 platforms, this does not | ||
2088 | + * seem to matter, as uncached CPU mappings will snoop the caches in any | ||
2089 | + * case. However, on ARM and arm64, enabling this optimization on a | ||
2090 | + * platform where NoSnoop is ignored results in loss of coherency, which | ||
2091 | + * breaks correct operation of the device. Since we have no way of | ||
2092 | + * detecting whether NoSnoop works or not, just disable this | ||
2093 | + * optimization entirely for ARM and arm64. | ||
2094 | + */ | ||
2095 | + return false; | ||
2096 | #else | ||
2097 | return true; | ||
2098 | #endif | ||
2099 | diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h | ||
2100 | index 32dc0cbd51ca..9d9e0b54f831 100644 | ||
2101 | --- a/include/linux/cpufreq.h | ||
2102 | +++ b/include/linux/cpufreq.h | ||
2103 | @@ -234,20 +234,12 @@ __ATTR(_name, _perm, show_##_name, NULL) | ||
2104 | static struct freq_attr _name = \ | ||
2105 | __ATTR(_name, 0644, show_##_name, store_##_name) | ||
2106 | |||
2107 | -struct global_attr { | ||
2108 | - struct attribute attr; | ||
2109 | - ssize_t (*show)(struct kobject *kobj, | ||
2110 | - struct attribute *attr, char *buf); | ||
2111 | - ssize_t (*store)(struct kobject *a, struct attribute *b, | ||
2112 | - const char *c, size_t count); | ||
2113 | -}; | ||
2114 | - | ||
2115 | #define define_one_global_ro(_name) \ | ||
2116 | -static struct global_attr _name = \ | ||
2117 | +static struct kobj_attribute _name = \ | ||
2118 | __ATTR(_name, 0444, show_##_name, NULL) | ||
2119 | |||
2120 | #define define_one_global_rw(_name) \ | ||
2121 | -static struct global_attr _name = \ | ||
2122 | +static struct kobj_attribute _name = \ | ||
2123 | __ATTR(_name, 0644, show_##_name, store_##_name) | ||
2124 | |||
2125 | |||
2126 | diff --git a/include/net/icmp.h b/include/net/icmp.h | ||
2127 | index 3ef2743a8eec..8665bf24e3b7 100644 | ||
2128 | --- a/include/net/icmp.h | ||
2129 | +++ b/include/net/icmp.h | ||
2130 | @@ -22,6 +22,7 @@ | ||
2131 | |||
2132 | #include <net/inet_sock.h> | ||
2133 | #include <net/snmp.h> | ||
2134 | +#include <net/ip.h> | ||
2135 | |||
2136 | struct icmp_err { | ||
2137 | int errno; | ||
2138 | @@ -39,7 +40,13 @@ struct net_proto_family; | ||
2139 | struct sk_buff; | ||
2140 | struct net; | ||
2141 | |||
2142 | -void icmp_send(struct sk_buff *skb_in, int type, int code, __be32 info); | ||
2143 | +void __icmp_send(struct sk_buff *skb_in, int type, int code, __be32 info, | ||
2144 | + const struct ip_options *opt); | ||
2145 | +static inline void icmp_send(struct sk_buff *skb_in, int type, int code, __be32 info) | ||
2146 | +{ | ||
2147 | + __icmp_send(skb_in, type, code, info, &IPCB(skb_in)->opt); | ||
2148 | +} | ||
2149 | + | ||
2150 | int icmp_rcv(struct sk_buff *skb); | ||
2151 | void icmp_err(struct sk_buff *skb, u32 info); | ||
2152 | int icmp_init(void); | ||
2153 | diff --git a/include/net/ip.h b/include/net/ip.h | ||
2154 | index 8646da034851..f06cd30bb44c 100644 | ||
2155 | --- a/include/net/ip.h | ||
2156 | +++ b/include/net/ip.h | ||
2157 | @@ -570,6 +570,8 @@ static inline int ip_options_echo(struct ip_options *dopt, struct sk_buff *skb) | ||
2158 | } | ||
2159 | |||
2160 | void ip_options_fragment(struct sk_buff *skb); | ||
2161 | +int __ip_options_compile(struct net *net, struct ip_options *opt, | ||
2162 | + struct sk_buff *skb, __be32 *info); | ||
2163 | int ip_options_compile(struct net *net, struct ip_options *opt, | ||
2164 | struct sk_buff *skb); | ||
2165 | int ip_options_get(struct net *net, struct ip_options_rcu **optp, | ||
2166 | diff --git a/kernel/events/core.c b/kernel/events/core.c | ||
2167 | index 17339506f9f8..5cbb2eda80b5 100644 | ||
2168 | --- a/kernel/events/core.c | ||
2169 | +++ b/kernel/events/core.c | ||
2170 | @@ -428,18 +428,18 @@ int perf_proc_update_handler(struct ctl_table *table, int write, | ||
2171 | void __user *buffer, size_t *lenp, | ||
2172 | loff_t *ppos) | ||
2173 | { | ||
2174 | - int ret = proc_dointvec_minmax(table, write, buffer, lenp, ppos); | ||
2175 | - | ||
2176 | - if (ret || !write) | ||
2177 | - return ret; | ||
2178 | - | ||
2179 | + int ret; | ||
2180 | + int perf_cpu = sysctl_perf_cpu_time_max_percent; | ||
2181 | /* | ||
2182 | * If throttling is disabled don't allow the write: | ||
2183 | */ | ||
2184 | - if (sysctl_perf_cpu_time_max_percent == 100 || | ||
2185 | - sysctl_perf_cpu_time_max_percent == 0) | ||
2186 | + if (write && (perf_cpu == 100 || perf_cpu == 0)) | ||
2187 | return -EINVAL; | ||
2188 | |||
2189 | + ret = proc_dointvec_minmax(table, write, buffer, lenp, ppos); | ||
2190 | + if (ret || !write) | ||
2191 | + return ret; | ||
2192 | + | ||
2193 | max_samples_per_tick = DIV_ROUND_UP(sysctl_perf_event_sample_rate, HZ); | ||
2194 | perf_sample_period_ns = NSEC_PER_SEC / sysctl_perf_event_sample_rate; | ||
2195 | update_perf_cpu_limits(); | ||
2196 | diff --git a/kernel/futex.c b/kernel/futex.c | ||
2197 | index 053d7be08be5..30fe0432c46d 100644 | ||
2198 | --- a/kernel/futex.c | ||
2199 | +++ b/kernel/futex.c | ||
2200 | @@ -2966,10 +2966,13 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags, | ||
2201 | */ | ||
2202 | WARN_ON(!q.pi_state); | ||
2203 | pi_mutex = &q.pi_state->pi_mutex; | ||
2204 | - ret = rt_mutex_finish_proxy_lock(pi_mutex, to, &rt_waiter); | ||
2205 | - debug_rt_mutex_free_waiter(&rt_waiter); | ||
2206 | + ret = rt_mutex_wait_proxy_lock(pi_mutex, to, &rt_waiter); | ||
2207 | |||
2208 | spin_lock(q.lock_ptr); | ||
2209 | + if (ret && !rt_mutex_cleanup_proxy_lock(pi_mutex, &rt_waiter)) | ||
2210 | + ret = 0; | ||
2211 | + | ||
2212 | + debug_rt_mutex_free_waiter(&rt_waiter); | ||
2213 | /* | ||
2214 | * Fixup the pi_state owner and possibly acquire the lock if we | ||
2215 | * haven't already. | ||
2216 | diff --git a/kernel/locking/rtmutex.c b/kernel/locking/rtmutex.c | ||
2217 | index 196cc460e38d..7615e7722258 100644 | ||
2218 | --- a/kernel/locking/rtmutex.c | ||
2219 | +++ b/kernel/locking/rtmutex.c | ||
2220 | @@ -1746,21 +1746,23 @@ struct task_struct *rt_mutex_next_owner(struct rt_mutex *lock) | ||
2221 | } | ||
2222 | |||
2223 | /** | ||
2224 | - * rt_mutex_finish_proxy_lock() - Complete lock acquisition | ||
2225 | + * rt_mutex_wait_proxy_lock() - Wait for lock acquisition | ||
2226 | * @lock: the rt_mutex we were woken on | ||
2227 | * @to: the timeout, null if none. hrtimer should already have | ||
2228 | * been started. | ||
2229 | * @waiter: the pre-initialized rt_mutex_waiter | ||
2230 | * | ||
2231 | - * Complete the lock acquisition started our behalf by another thread. | ||
2232 | + * Wait for the the lock acquisition started on our behalf by | ||
2233 | + * rt_mutex_start_proxy_lock(). Upon failure, the caller must call | ||
2234 | + * rt_mutex_cleanup_proxy_lock(). | ||
2235 | * | ||
2236 | * Returns: | ||
2237 | * 0 - success | ||
2238 | * <0 - error, one of -EINTR, -ETIMEDOUT | ||
2239 | * | ||
2240 | - * Special API call for PI-futex requeue support | ||
2241 | + * Special API call for PI-futex support | ||
2242 | */ | ||
2243 | -int rt_mutex_finish_proxy_lock(struct rt_mutex *lock, | ||
2244 | +int rt_mutex_wait_proxy_lock(struct rt_mutex *lock, | ||
2245 | struct hrtimer_sleeper *to, | ||
2246 | struct rt_mutex_waiter *waiter) | ||
2247 | { | ||
2248 | @@ -1773,9 +1775,6 @@ int rt_mutex_finish_proxy_lock(struct rt_mutex *lock, | ||
2249 | /* sleep on the mutex */ | ||
2250 | ret = __rt_mutex_slowlock(lock, TASK_INTERRUPTIBLE, to, waiter); | ||
2251 | |||
2252 | - if (unlikely(ret)) | ||
2253 | - remove_waiter(lock, waiter); | ||
2254 | - | ||
2255 | /* | ||
2256 | * try_to_take_rt_mutex() sets the waiter bit unconditionally. We might | ||
2257 | * have to fix that up. | ||
2258 | @@ -1786,3 +1785,42 @@ int rt_mutex_finish_proxy_lock(struct rt_mutex *lock, | ||
2259 | |||
2260 | return ret; | ||
2261 | } | ||
2262 | + | ||
2263 | +/** | ||
2264 | + * rt_mutex_cleanup_proxy_lock() - Cleanup failed lock acquisition | ||
2265 | + * @lock: the rt_mutex we were woken on | ||
2266 | + * @waiter: the pre-initialized rt_mutex_waiter | ||
2267 | + * | ||
2268 | + * Attempt to clean up after a failed rt_mutex_wait_proxy_lock(). | ||
2269 | + * | ||
2270 | + * Unless we acquired the lock; we're still enqueued on the wait-list and can | ||
2271 | + * in fact still be granted ownership until we're removed. Therefore we can | ||
2272 | + * find we are in fact the owner and must disregard the | ||
2273 | + * rt_mutex_wait_proxy_lock() failure. | ||
2274 | + * | ||
2275 | + * Returns: | ||
2276 | + * true - did the cleanup, we done. | ||
2277 | + * false - we acquired the lock after rt_mutex_wait_proxy_lock() returned, | ||
2278 | + * caller should disregards its return value. | ||
2279 | + * | ||
2280 | + * Special API call for PI-futex support | ||
2281 | + */ | ||
2282 | +bool rt_mutex_cleanup_proxy_lock(struct rt_mutex *lock, | ||
2283 | + struct rt_mutex_waiter *waiter) | ||
2284 | +{ | ||
2285 | + bool cleanup = false; | ||
2286 | + | ||
2287 | + raw_spin_lock_irq(&lock->wait_lock); | ||
2288 | + /* | ||
2289 | + * Unless we're the owner; we're still enqueued on the wait_list. | ||
2290 | + * So check if we became owner, if not, take us off the wait_list. | ||
2291 | + */ | ||
2292 | + if (rt_mutex_owner(lock) != current) { | ||
2293 | + remove_waiter(lock, waiter); | ||
2294 | + fixup_rt_mutex_waiters(lock); | ||
2295 | + cleanup = true; | ||
2296 | + } | ||
2297 | + raw_spin_unlock_irq(&lock->wait_lock); | ||
2298 | + | ||
2299 | + return cleanup; | ||
2300 | +} | ||
2301 | diff --git a/kernel/locking/rtmutex_common.h b/kernel/locking/rtmutex_common.h | ||
2302 | index 50848b460851..14cbafed0014 100644 | ||
2303 | --- a/kernel/locking/rtmutex_common.h | ||
2304 | +++ b/kernel/locking/rtmutex_common.h | ||
2305 | @@ -107,9 +107,11 @@ extern void rt_mutex_proxy_unlock(struct rt_mutex *lock, | ||
2306 | extern int rt_mutex_start_proxy_lock(struct rt_mutex *lock, | ||
2307 | struct rt_mutex_waiter *waiter, | ||
2308 | struct task_struct *task); | ||
2309 | -extern int rt_mutex_finish_proxy_lock(struct rt_mutex *lock, | ||
2310 | - struct hrtimer_sleeper *to, | ||
2311 | - struct rt_mutex_waiter *waiter); | ||
2312 | +extern int rt_mutex_wait_proxy_lock(struct rt_mutex *lock, | ||
2313 | + struct hrtimer_sleeper *to, | ||
2314 | + struct rt_mutex_waiter *waiter); | ||
2315 | +extern bool rt_mutex_cleanup_proxy_lock(struct rt_mutex *lock, | ||
2316 | + struct rt_mutex_waiter *waiter); | ||
2317 | extern int rt_mutex_timed_futex_lock(struct rt_mutex *l, struct hrtimer_sleeper *to); | ||
2318 | extern bool rt_mutex_futex_unlock(struct rt_mutex *lock, | ||
2319 | struct wake_q_head *wqh); | ||
2320 | diff --git a/mm/hugetlb.c b/mm/hugetlb.c | ||
2321 | index 3e50fcfe6ad8..8b682da98d95 100644 | ||
2322 | --- a/mm/hugetlb.c | ||
2323 | +++ b/mm/hugetlb.c | ||
2324 | @@ -3579,7 +3579,6 @@ retry_avoidcopy: | ||
2325 | copy_user_huge_page(new_page, old_page, address, vma, | ||
2326 | pages_per_huge_page(h)); | ||
2327 | __SetPageUptodate(new_page); | ||
2328 | - set_page_huge_active(new_page); | ||
2329 | |||
2330 | mmun_start = address & huge_page_mask(h); | ||
2331 | mmun_end = mmun_start + huge_page_size(h); | ||
2332 | @@ -3601,6 +3600,7 @@ retry_avoidcopy: | ||
2333 | make_huge_pte(vma, new_page, 1)); | ||
2334 | page_remove_rmap(old_page, true); | ||
2335 | hugepage_add_new_anon_rmap(new_page, vma, address); | ||
2336 | + set_page_huge_active(new_page); | ||
2337 | /* Make the old page be freed below */ | ||
2338 | new_page = old_page; | ||
2339 | } | ||
2340 | @@ -3683,6 +3683,7 @@ static int hugetlb_no_page(struct mm_struct *mm, struct vm_area_struct *vma, | ||
2341 | struct page *page; | ||
2342 | pte_t new_pte; | ||
2343 | spinlock_t *ptl; | ||
2344 | + bool new_page = false; | ||
2345 | |||
2346 | /* | ||
2347 | * Currently, we are forced to kill the process in the event the | ||
2348 | @@ -3716,7 +3717,7 @@ retry: | ||
2349 | } | ||
2350 | clear_huge_page(page, address, pages_per_huge_page(h)); | ||
2351 | __SetPageUptodate(page); | ||
2352 | - set_page_huge_active(page); | ||
2353 | + new_page = true; | ||
2354 | |||
2355 | if (vma->vm_flags & VM_MAYSHARE) { | ||
2356 | int err = huge_add_to_page_cache(page, mapping, idx); | ||
2357 | @@ -3788,6 +3789,15 @@ retry: | ||
2358 | } | ||
2359 | |||
2360 | spin_unlock(ptl); | ||
2361 | + | ||
2362 | + /* | ||
2363 | + * Only make newly allocated pages active. Existing pages found | ||
2364 | + * in the pagecache could be !page_huge_active() if they have been | ||
2365 | + * isolated for migration. | ||
2366 | + */ | ||
2367 | + if (new_page) | ||
2368 | + set_page_huge_active(page); | ||
2369 | + | ||
2370 | unlock_page(page); | ||
2371 | out: | ||
2372 | return ret; | ||
2373 | diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c | ||
2374 | index e4c271298074..b4c8d7b9ab82 100644 | ||
2375 | --- a/mm/memory_hotplug.c | ||
2376 | +++ b/mm/memory_hotplug.c | ||
2377 | @@ -1471,7 +1471,8 @@ static struct page *next_active_pageblock(struct page *page) | ||
2378 | bool is_mem_section_removable(unsigned long start_pfn, unsigned long nr_pages) | ||
2379 | { | ||
2380 | struct page *page = pfn_to_page(start_pfn); | ||
2381 | - struct page *end_page = page + nr_pages; | ||
2382 | + unsigned long end_pfn = min(start_pfn + nr_pages, zone_end_pfn(page_zone(page))); | ||
2383 | + struct page *end_page = pfn_to_page(end_pfn); | ||
2384 | |||
2385 | /* Check the starting page of each pageblock within the range */ | ||
2386 | for (; page < end_page; page = next_active_pageblock(page)) { | ||
2387 | @@ -1511,6 +1512,9 @@ int test_pages_in_a_zone(unsigned long start_pfn, unsigned long end_pfn, | ||
2388 | i++; | ||
2389 | if (i == MAX_ORDER_NR_PAGES || pfn + i >= end_pfn) | ||
2390 | continue; | ||
2391 | + /* Check if we got outside of the zone */ | ||
2392 | + if (zone && !zone_spans_pfn(zone, pfn + i)) | ||
2393 | + return 0; | ||
2394 | page = pfn_to_page(pfn + i); | ||
2395 | if (zone && page_zone(page) != zone) | ||
2396 | return 0; | ||
2397 | diff --git a/mm/migrate.c b/mm/migrate.c | ||
2398 | index b08c1a4a1c22..b810ac1359f0 100644 | ||
2399 | --- a/mm/migrate.c | ||
2400 | +++ b/mm/migrate.c | ||
2401 | @@ -1234,6 +1234,16 @@ static int unmap_and_move_huge_page(new_page_t get_new_page, | ||
2402 | lock_page(hpage); | ||
2403 | } | ||
2404 | |||
2405 | + /* | ||
2406 | + * Check for pages which are in the process of being freed. Without | ||
2407 | + * page_mapping() set, hugetlbfs specific move page routine will not | ||
2408 | + * be called and we could leak usage counts for subpools. | ||
2409 | + */ | ||
2410 | + if (page_private(hpage) && !page_mapping(hpage)) { | ||
2411 | + rc = -EBUSY; | ||
2412 | + goto out_unlock; | ||
2413 | + } | ||
2414 | + | ||
2415 | if (PageAnon(hpage)) | ||
2416 | anon_vma = page_get_anon_vma(hpage); | ||
2417 | |||
2418 | @@ -1265,6 +1275,7 @@ put_anon: | ||
2419 | set_page_owner_migrate_reason(new_hpage, reason); | ||
2420 | } | ||
2421 | |||
2422 | +out_unlock: | ||
2423 | unlock_page(hpage); | ||
2424 | out: | ||
2425 | if (rc != -EAGAIN) | ||
2426 | diff --git a/net/core/net-sysfs.c b/net/core/net-sysfs.c | ||
2427 | index 6e4f34721080..3333693d8052 100644 | ||
2428 | --- a/net/core/net-sysfs.c | ||
2429 | +++ b/net/core/net-sysfs.c | ||
2430 | @@ -1380,6 +1380,9 @@ static int register_queue_kobjects(struct net_device *dev) | ||
2431 | error: | ||
2432 | netdev_queue_update_kobjects(dev, txq, 0); | ||
2433 | net_rx_queue_update_kobjects(dev, rxq, 0); | ||
2434 | +#ifdef CONFIG_SYSFS | ||
2435 | + kset_unregister(dev->queues_kset); | ||
2436 | +#endif | ||
2437 | return error; | ||
2438 | } | ||
2439 | |||
2440 | diff --git a/net/ipv4/cipso_ipv4.c b/net/ipv4/cipso_ipv4.c | ||
2441 | index 571d079e262f..71bcab94c5c7 100644 | ||
2442 | --- a/net/ipv4/cipso_ipv4.c | ||
2443 | +++ b/net/ipv4/cipso_ipv4.c | ||
2444 | @@ -667,7 +667,8 @@ static int cipso_v4_map_lvl_valid(const struct cipso_v4_doi *doi_def, u8 level) | ||
2445 | case CIPSO_V4_MAP_PASS: | ||
2446 | return 0; | ||
2447 | case CIPSO_V4_MAP_TRANS: | ||
2448 | - if (doi_def->map.std->lvl.cipso[level] < CIPSO_V4_INV_LVL) | ||
2449 | + if ((level < doi_def->map.std->lvl.cipso_size) && | ||
2450 | + (doi_def->map.std->lvl.cipso[level] < CIPSO_V4_INV_LVL)) | ||
2451 | return 0; | ||
2452 | break; | ||
2453 | } | ||
2454 | @@ -1735,13 +1736,26 @@ validate_return: | ||
2455 | */ | ||
2456 | void cipso_v4_error(struct sk_buff *skb, int error, u32 gateway) | ||
2457 | { | ||
2458 | + unsigned char optbuf[sizeof(struct ip_options) + 40]; | ||
2459 | + struct ip_options *opt = (struct ip_options *)optbuf; | ||
2460 | + | ||
2461 | if (ip_hdr(skb)->protocol == IPPROTO_ICMP || error != -EACCES) | ||
2462 | return; | ||
2463 | |||
2464 | + /* | ||
2465 | + * We might be called above the IP layer, | ||
2466 | + * so we can not use icmp_send and IPCB here. | ||
2467 | + */ | ||
2468 | + | ||
2469 | + memset(opt, 0, sizeof(struct ip_options)); | ||
2470 | + opt->optlen = ip_hdr(skb)->ihl*4 - sizeof(struct iphdr); | ||
2471 | + if (__ip_options_compile(dev_net(skb->dev), opt, skb, NULL)) | ||
2472 | + return; | ||
2473 | + | ||
2474 | if (gateway) | ||
2475 | - icmp_send(skb, ICMP_DEST_UNREACH, ICMP_NET_ANO, 0); | ||
2476 | + __icmp_send(skb, ICMP_DEST_UNREACH, ICMP_NET_ANO, 0, opt); | ||
2477 | else | ||
2478 | - icmp_send(skb, ICMP_DEST_UNREACH, ICMP_HOST_ANO, 0); | ||
2479 | + __icmp_send(skb, ICMP_DEST_UNREACH, ICMP_HOST_ANO, 0, opt); | ||
2480 | } | ||
2481 | |||
2482 | /** | ||
2483 | diff --git a/net/ipv4/icmp.c b/net/ipv4/icmp.c | ||
2484 | index 31f17f0bbd1c..172d3dfed0c4 100644 | ||
2485 | --- a/net/ipv4/icmp.c | ||
2486 | +++ b/net/ipv4/icmp.c | ||
2487 | @@ -565,7 +565,8 @@ relookup_failed: | ||
2488 | * MUST reply to only the first fragment. | ||
2489 | */ | ||
2490 | |||
2491 | -void icmp_send(struct sk_buff *skb_in, int type, int code, __be32 info) | ||
2492 | +void __icmp_send(struct sk_buff *skb_in, int type, int code, __be32 info, | ||
2493 | + const struct ip_options *opt) | ||
2494 | { | ||
2495 | struct iphdr *iph; | ||
2496 | int room; | ||
2497 | @@ -679,7 +680,7 @@ void icmp_send(struct sk_buff *skb_in, int type, int code, __be32 info) | ||
2498 | iph->tos; | ||
2499 | mark = IP4_REPLY_MARK(net, skb_in->mark); | ||
2500 | |||
2501 | - if (ip_options_echo(&icmp_param->replyopts.opt.opt, skb_in)) | ||
2502 | + if (__ip_options_echo(&icmp_param->replyopts.opt.opt, skb_in, opt)) | ||
2503 | goto out_unlock; | ||
2504 | |||
2505 | |||
2506 | @@ -731,7 +732,7 @@ out_free: | ||
2507 | kfree(icmp_param); | ||
2508 | out:; | ||
2509 | } | ||
2510 | -EXPORT_SYMBOL(icmp_send); | ||
2511 | +EXPORT_SYMBOL(__icmp_send); | ||
2512 | |||
2513 | |||
2514 | static void icmp_socket_deliver(struct sk_buff *skb, u32 info) | ||
2515 | diff --git a/net/ipv4/ip_options.c b/net/ipv4/ip_options.c | ||
2516 | index 4d158ff1def1..4cd3b5ad9cee 100644 | ||
2517 | --- a/net/ipv4/ip_options.c | ||
2518 | +++ b/net/ipv4/ip_options.c | ||
2519 | @@ -253,8 +253,9 @@ static void spec_dst_fill(__be32 *spec_dst, struct sk_buff *skb) | ||
2520 | * If opt == NULL, then skb->data should point to IP header. | ||
2521 | */ | ||
2522 | |||
2523 | -int ip_options_compile(struct net *net, | ||
2524 | - struct ip_options *opt, struct sk_buff *skb) | ||
2525 | +int __ip_options_compile(struct net *net, | ||
2526 | + struct ip_options *opt, struct sk_buff *skb, | ||
2527 | + __be32 *info) | ||
2528 | { | ||
2529 | __be32 spec_dst = htonl(INADDR_ANY); | ||
2530 | unsigned char *pp_ptr = NULL; | ||
2531 | @@ -470,11 +471,22 @@ eol: | ||
2532 | return 0; | ||
2533 | |||
2534 | error: | ||
2535 | - if (skb) { | ||
2536 | - icmp_send(skb, ICMP_PARAMETERPROB, 0, htonl((pp_ptr-iph)<<24)); | ||
2537 | - } | ||
2538 | + if (info) | ||
2539 | + *info = htonl((pp_ptr-iph)<<24); | ||
2540 | return -EINVAL; | ||
2541 | } | ||
2542 | + | ||
2543 | +int ip_options_compile(struct net *net, | ||
2544 | + struct ip_options *opt, struct sk_buff *skb) | ||
2545 | +{ | ||
2546 | + int ret; | ||
2547 | + __be32 info; | ||
2548 | + | ||
2549 | + ret = __ip_options_compile(net, opt, skb, &info); | ||
2550 | + if (ret != 0 && skb) | ||
2551 | + icmp_send(skb, ICMP_PARAMETERPROB, 0, info); | ||
2552 | + return ret; | ||
2553 | +} | ||
2554 | EXPORT_SYMBOL(ip_options_compile); | ||
2555 | |||
2556 | /* | ||
2557 | diff --git a/net/ipv4/ip_vti.c b/net/ipv4/ip_vti.c | ||
2558 | index cbff0d6ff1ac..270e79f4d40e 100644 | ||
2559 | --- a/net/ipv4/ip_vti.c | ||
2560 | +++ b/net/ipv4/ip_vti.c | ||
2561 | @@ -74,6 +74,33 @@ drop: | ||
2562 | return 0; | ||
2563 | } | ||
2564 | |||
2565 | +static int vti_input_ipip(struct sk_buff *skb, int nexthdr, __be32 spi, | ||
2566 | + int encap_type) | ||
2567 | +{ | ||
2568 | + struct ip_tunnel *tunnel; | ||
2569 | + const struct iphdr *iph = ip_hdr(skb); | ||
2570 | + struct net *net = dev_net(skb->dev); | ||
2571 | + struct ip_tunnel_net *itn = net_generic(net, vti_net_id); | ||
2572 | + | ||
2573 | + tunnel = ip_tunnel_lookup(itn, skb->dev->ifindex, TUNNEL_NO_KEY, | ||
2574 | + iph->saddr, iph->daddr, 0); | ||
2575 | + if (tunnel) { | ||
2576 | + if (!xfrm4_policy_check(NULL, XFRM_POLICY_IN, skb)) | ||
2577 | + goto drop; | ||
2578 | + | ||
2579 | + XFRM_TUNNEL_SKB_CB(skb)->tunnel.ip4 = tunnel; | ||
2580 | + | ||
2581 | + skb->dev = tunnel->dev; | ||
2582 | + | ||
2583 | + return xfrm_input(skb, nexthdr, spi, encap_type); | ||
2584 | + } | ||
2585 | + | ||
2586 | + return -EINVAL; | ||
2587 | +drop: | ||
2588 | + kfree_skb(skb); | ||
2589 | + return 0; | ||
2590 | +} | ||
2591 | + | ||
2592 | static int vti_rcv(struct sk_buff *skb) | ||
2593 | { | ||
2594 | XFRM_SPI_SKB_CB(skb)->family = AF_INET; | ||
2595 | @@ -82,6 +109,14 @@ static int vti_rcv(struct sk_buff *skb) | ||
2596 | return vti_input(skb, ip_hdr(skb)->protocol, 0, 0); | ||
2597 | } | ||
2598 | |||
2599 | +static int vti_rcv_ipip(struct sk_buff *skb) | ||
2600 | +{ | ||
2601 | + XFRM_SPI_SKB_CB(skb)->family = AF_INET; | ||
2602 | + XFRM_SPI_SKB_CB(skb)->daddroff = offsetof(struct iphdr, daddr); | ||
2603 | + | ||
2604 | + return vti_input_ipip(skb, ip_hdr(skb)->protocol, ip_hdr(skb)->saddr, 0); | ||
2605 | +} | ||
2606 | + | ||
2607 | static int vti_rcv_cb(struct sk_buff *skb, int err) | ||
2608 | { | ||
2609 | unsigned short family; | ||
2610 | @@ -439,6 +474,12 @@ static struct xfrm4_protocol vti_ipcomp4_protocol __read_mostly = { | ||
2611 | .priority = 100, | ||
2612 | }; | ||
2613 | |||
2614 | +static struct xfrm_tunnel ipip_handler __read_mostly = { | ||
2615 | + .handler = vti_rcv_ipip, | ||
2616 | + .err_handler = vti4_err, | ||
2617 | + .priority = 0, | ||
2618 | +}; | ||
2619 | + | ||
2620 | static int __net_init vti_init_net(struct net *net) | ||
2621 | { | ||
2622 | int err; | ||
2623 | @@ -622,6 +663,13 @@ static int __init vti_init(void) | ||
2624 | if (err < 0) | ||
2625 | goto xfrm_proto_comp_failed; | ||
2626 | |||
2627 | + msg = "ipip tunnel"; | ||
2628 | + err = xfrm4_tunnel_register(&ipip_handler, AF_INET); | ||
2629 | + if (err < 0) { | ||
2630 | + pr_info("%s: cant't register tunnel\n",__func__); | ||
2631 | + goto xfrm_tunnel_failed; | ||
2632 | + } | ||
2633 | + | ||
2634 | msg = "netlink interface"; | ||
2635 | err = rtnl_link_register(&vti_link_ops); | ||
2636 | if (err < 0) | ||
2637 | @@ -631,6 +679,8 @@ static int __init vti_init(void) | ||
2638 | |||
2639 | rtnl_link_failed: | ||
2640 | xfrm4_protocol_deregister(&vti_ipcomp4_protocol, IPPROTO_COMP); | ||
2641 | +xfrm_tunnel_failed: | ||
2642 | + xfrm4_tunnel_deregister(&ipip_handler, AF_INET); | ||
2643 | xfrm_proto_comp_failed: | ||
2644 | xfrm4_protocol_deregister(&vti_ah4_protocol, IPPROTO_AH); | ||
2645 | xfrm_proto_ah_failed: | ||
2646 | diff --git a/net/ipv6/ip6mr.c b/net/ipv6/ip6mr.c | ||
2647 | index ad597b4b22a0..41f67629ae59 100644 | ||
2648 | --- a/net/ipv6/ip6mr.c | ||
2649 | +++ b/net/ipv6/ip6mr.c | ||
2650 | @@ -1992,10 +1992,10 @@ int ip6mr_compat_ioctl(struct sock *sk, unsigned int cmd, void __user *arg) | ||
2651 | |||
2652 | static inline int ip6mr_forward2_finish(struct net *net, struct sock *sk, struct sk_buff *skb) | ||
2653 | { | ||
2654 | - __IP6_INC_STATS(net, ip6_dst_idev(skb_dst(skb)), | ||
2655 | - IPSTATS_MIB_OUTFORWDATAGRAMS); | ||
2656 | - __IP6_ADD_STATS(net, ip6_dst_idev(skb_dst(skb)), | ||
2657 | - IPSTATS_MIB_OUTOCTETS, skb->len); | ||
2658 | + IP6_INC_STATS(net, ip6_dst_idev(skb_dst(skb)), | ||
2659 | + IPSTATS_MIB_OUTFORWDATAGRAMS); | ||
2660 | + IP6_ADD_STATS(net, ip6_dst_idev(skb_dst(skb)), | ||
2661 | + IPSTATS_MIB_OUTOCTETS, skb->len); | ||
2662 | return dst_output(net, sk, skb); | ||
2663 | } | ||
2664 | |||
2665 | diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c | ||
2666 | index 4381ea53fa91..75de3dd8b862 100644 | ||
2667 | --- a/net/ipv6/sit.c | ||
2668 | +++ b/net/ipv6/sit.c | ||
2669 | @@ -1851,6 +1851,7 @@ static int __net_init sit_init_net(struct net *net) | ||
2670 | |||
2671 | err_reg_dev: | ||
2672 | ipip6_dev_free(sitn->fb_tunnel_dev); | ||
2673 | + free_netdev(sitn->fb_tunnel_dev); | ||
2674 | err_alloc_dev: | ||
2675 | return err; | ||
2676 | } | ||
2677 | diff --git a/net/netfilter/ipvs/ip_vs_ctl.c b/net/netfilter/ipvs/ip_vs_ctl.c | ||
2678 | index 8382b7880b24..8037b25ddb76 100644 | ||
2679 | --- a/net/netfilter/ipvs/ip_vs_ctl.c | ||
2680 | +++ b/net/netfilter/ipvs/ip_vs_ctl.c | ||
2681 | @@ -2258,6 +2258,18 @@ static int ip_vs_set_timeout(struct netns_ipvs *ipvs, struct ip_vs_timeout_user | ||
2682 | u->tcp_fin_timeout, | ||
2683 | u->udp_timeout); | ||
2684 | |||
2685 | +#ifdef CONFIG_IP_VS_PROTO_TCP | ||
2686 | + if (u->tcp_timeout < 0 || u->tcp_timeout > (INT_MAX / HZ) || | ||
2687 | + u->tcp_fin_timeout < 0 || u->tcp_fin_timeout > (INT_MAX / HZ)) { | ||
2688 | + return -EINVAL; | ||
2689 | + } | ||
2690 | +#endif | ||
2691 | + | ||
2692 | +#ifdef CONFIG_IP_VS_PROTO_UDP | ||
2693 | + if (u->udp_timeout < 0 || u->udp_timeout > (INT_MAX / HZ)) | ||
2694 | + return -EINVAL; | ||
2695 | +#endif | ||
2696 | + | ||
2697 | #ifdef CONFIG_IP_VS_PROTO_TCP | ||
2698 | if (u->tcp_timeout) { | ||
2699 | pd = ip_vs_proto_data_get(ipvs, IPPROTO_TCP); | ||
2700 | diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c | ||
2701 | index 19b3f4fbea52..df1d5618b008 100644 | ||
2702 | --- a/net/netfilter/nf_conntrack_core.c | ||
2703 | +++ b/net/netfilter/nf_conntrack_core.c | ||
2704 | @@ -855,6 +855,22 @@ nf_conntrack_tuple_taken(const struct nf_conntrack_tuple *tuple, | ||
2705 | } | ||
2706 | |||
2707 | if (nf_ct_key_equal(h, tuple, zone, net)) { | ||
2708 | + /* Tuple is taken already, so caller will need to find | ||
2709 | + * a new source port to use. | ||
2710 | + * | ||
2711 | + * Only exception: | ||
2712 | + * If the *original tuples* are identical, then both | ||
2713 | + * conntracks refer to the same flow. | ||
2714 | + * This is a rare situation, it can occur e.g. when | ||
2715 | + * more than one UDP packet is sent from same socket | ||
2716 | + * in different threads. | ||
2717 | + * | ||
2718 | + * Let nf_ct_resolve_clash() deal with this later. | ||
2719 | + */ | ||
2720 | + if (nf_ct_tuple_equal(&ignored_conntrack->tuplehash[IP_CT_DIR_ORIGINAL].tuple, | ||
2721 | + &ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple)) | ||
2722 | + continue; | ||
2723 | + | ||
2724 | NF_CT_STAT_INC_ATOMIC(net, found); | ||
2725 | rcu_read_unlock(); | ||
2726 | return 1; | ||
2727 | diff --git a/net/netlabel/netlabel_kapi.c b/net/netlabel/netlabel_kapi.c | ||
2728 | index 28c56b95fb7f..cb9d1d1210cb 100644 | ||
2729 | --- a/net/netlabel/netlabel_kapi.c | ||
2730 | +++ b/net/netlabel/netlabel_kapi.c | ||
2731 | @@ -903,7 +903,8 @@ int netlbl_bitmap_walk(const unsigned char *bitmap, u32 bitmap_len, | ||
2732 | (state == 0 && (byte & bitmask) == 0)) | ||
2733 | return bit_spot; | ||
2734 | |||
2735 | - bit_spot++; | ||
2736 | + if (++bit_spot >= bitmap_len) | ||
2737 | + return -1; | ||
2738 | bitmask >>= 1; | ||
2739 | if (bitmask == 0) { | ||
2740 | byte = bitmap[++byte_offset]; | ||
2741 | diff --git a/net/nfc/llcp_commands.c b/net/nfc/llcp_commands.c | ||
2742 | index 04759a0c3273..6ba829f2df91 100644 | ||
2743 | --- a/net/nfc/llcp_commands.c | ||
2744 | +++ b/net/nfc/llcp_commands.c | ||
2745 | @@ -419,6 +419,10 @@ int nfc_llcp_send_connect(struct nfc_llcp_sock *sock) | ||
2746 | sock->service_name, | ||
2747 | sock->service_name_len, | ||
2748 | &service_name_tlv_length); | ||
2749 | + if (!service_name_tlv) { | ||
2750 | + err = -ENOMEM; | ||
2751 | + goto error_tlv; | ||
2752 | + } | ||
2753 | size += service_name_tlv_length; | ||
2754 | } | ||
2755 | |||
2756 | @@ -429,9 +433,17 @@ int nfc_llcp_send_connect(struct nfc_llcp_sock *sock) | ||
2757 | |||
2758 | miux_tlv = nfc_llcp_build_tlv(LLCP_TLV_MIUX, (u8 *)&miux, 0, | ||
2759 | &miux_tlv_length); | ||
2760 | + if (!miux_tlv) { | ||
2761 | + err = -ENOMEM; | ||
2762 | + goto error_tlv; | ||
2763 | + } | ||
2764 | size += miux_tlv_length; | ||
2765 | |||
2766 | rw_tlv = nfc_llcp_build_tlv(LLCP_TLV_RW, &rw, 0, &rw_tlv_length); | ||
2767 | + if (!rw_tlv) { | ||
2768 | + err = -ENOMEM; | ||
2769 | + goto error_tlv; | ||
2770 | + } | ||
2771 | size += rw_tlv_length; | ||
2772 | |||
2773 | pr_debug("SKB size %d SN length %zu\n", size, sock->service_name_len); | ||
2774 | @@ -484,9 +496,17 @@ int nfc_llcp_send_cc(struct nfc_llcp_sock *sock) | ||
2775 | |||
2776 | miux_tlv = nfc_llcp_build_tlv(LLCP_TLV_MIUX, (u8 *)&miux, 0, | ||
2777 | &miux_tlv_length); | ||
2778 | + if (!miux_tlv) { | ||
2779 | + err = -ENOMEM; | ||
2780 | + goto error_tlv; | ||
2781 | + } | ||
2782 | size += miux_tlv_length; | ||
2783 | |||
2784 | rw_tlv = nfc_llcp_build_tlv(LLCP_TLV_RW, &rw, 0, &rw_tlv_length); | ||
2785 | + if (!rw_tlv) { | ||
2786 | + err = -ENOMEM; | ||
2787 | + goto error_tlv; | ||
2788 | + } | ||
2789 | size += rw_tlv_length; | ||
2790 | |||
2791 | skb = llcp_allocate_pdu(sock, LLCP_PDU_CC, size); | ||
2792 | diff --git a/net/nfc/llcp_core.c b/net/nfc/llcp_core.c | ||
2793 | index e69786c6804c..a121d796fa51 100644 | ||
2794 | --- a/net/nfc/llcp_core.c | ||
2795 | +++ b/net/nfc/llcp_core.c | ||
2796 | @@ -532,10 +532,10 @@ static u8 nfc_llcp_reserve_sdp_ssap(struct nfc_llcp_local *local) | ||
2797 | |||
2798 | static int nfc_llcp_build_gb(struct nfc_llcp_local *local) | ||
2799 | { | ||
2800 | - u8 *gb_cur, *version_tlv, version, version_length; | ||
2801 | - u8 *lto_tlv, lto_length; | ||
2802 | - u8 *wks_tlv, wks_length; | ||
2803 | - u8 *miux_tlv, miux_length; | ||
2804 | + u8 *gb_cur, version, version_length; | ||
2805 | + u8 lto_length, wks_length, miux_length; | ||
2806 | + u8 *version_tlv = NULL, *lto_tlv = NULL, | ||
2807 | + *wks_tlv = NULL, *miux_tlv = NULL; | ||
2808 | __be16 wks = cpu_to_be16(local->local_wks); | ||
2809 | u8 gb_len = 0; | ||
2810 | int ret = 0; | ||
2811 | @@ -543,17 +543,33 @@ static int nfc_llcp_build_gb(struct nfc_llcp_local *local) | ||
2812 | version = LLCP_VERSION_11; | ||
2813 | version_tlv = nfc_llcp_build_tlv(LLCP_TLV_VERSION, &version, | ||
2814 | 1, &version_length); | ||
2815 | + if (!version_tlv) { | ||
2816 | + ret = -ENOMEM; | ||
2817 | + goto out; | ||
2818 | + } | ||
2819 | gb_len += version_length; | ||
2820 | |||
2821 | lto_tlv = nfc_llcp_build_tlv(LLCP_TLV_LTO, &local->lto, 1, <o_length); | ||
2822 | + if (!lto_tlv) { | ||
2823 | + ret = -ENOMEM; | ||
2824 | + goto out; | ||
2825 | + } | ||
2826 | gb_len += lto_length; | ||
2827 | |||
2828 | pr_debug("Local wks 0x%lx\n", local->local_wks); | ||
2829 | wks_tlv = nfc_llcp_build_tlv(LLCP_TLV_WKS, (u8 *)&wks, 2, &wks_length); | ||
2830 | + if (!wks_tlv) { | ||
2831 | + ret = -ENOMEM; | ||
2832 | + goto out; | ||
2833 | + } | ||
2834 | gb_len += wks_length; | ||
2835 | |||
2836 | miux_tlv = nfc_llcp_build_tlv(LLCP_TLV_MIUX, (u8 *)&local->miux, 0, | ||
2837 | &miux_length); | ||
2838 | + if (!miux_tlv) { | ||
2839 | + ret = -ENOMEM; | ||
2840 | + goto out; | ||
2841 | + } | ||
2842 | gb_len += miux_length; | ||
2843 | |||
2844 | gb_len += ARRAY_SIZE(llcp_magic); | ||
2845 | diff --git a/net/sched/sch_netem.c b/net/sched/sch_netem.c | ||
2846 | index 2e417c907a28..e9812e21dbc9 100644 | ||
2847 | --- a/net/sched/sch_netem.c | ||
2848 | +++ b/net/sched/sch_netem.c | ||
2849 | @@ -441,6 +441,7 @@ static int netem_enqueue(struct sk_buff *skb, struct Qdisc *sch, | ||
2850 | int nb = 0; | ||
2851 | int count = 1; | ||
2852 | int rc = NET_XMIT_SUCCESS; | ||
2853 | + int rc_drop = NET_XMIT_DROP; | ||
2854 | |||
2855 | /* Do not fool qdisc_drop_all() */ | ||
2856 | skb->prev = NULL; | ||
2857 | @@ -480,6 +481,7 @@ static int netem_enqueue(struct sk_buff *skb, struct Qdisc *sch, | ||
2858 | q->duplicate = 0; | ||
2859 | rootq->enqueue(skb2, rootq, to_free); | ||
2860 | q->duplicate = dupsave; | ||
2861 | + rc_drop = NET_XMIT_SUCCESS; | ||
2862 | } | ||
2863 | |||
2864 | /* | ||
2865 | @@ -492,7 +494,7 @@ static int netem_enqueue(struct sk_buff *skb, struct Qdisc *sch, | ||
2866 | if (skb_is_gso(skb)) { | ||
2867 | segs = netem_segment(skb, sch, to_free); | ||
2868 | if (!segs) | ||
2869 | - return NET_XMIT_DROP; | ||
2870 | + return rc_drop; | ||
2871 | } else { | ||
2872 | segs = skb; | ||
2873 | } | ||
2874 | @@ -515,8 +517,10 @@ static int netem_enqueue(struct sk_buff *skb, struct Qdisc *sch, | ||
2875 | 1<<(prandom_u32() % 8); | ||
2876 | } | ||
2877 | |||
2878 | - if (unlikely(sch->q.qlen >= sch->limit)) | ||
2879 | - return qdisc_drop_all(skb, sch, to_free); | ||
2880 | + if (unlikely(sch->q.qlen >= sch->limit)) { | ||
2881 | + qdisc_drop_all(skb, sch, to_free); | ||
2882 | + return rc_drop; | ||
2883 | + } | ||
2884 | |||
2885 | qdisc_qstats_backlog_inc(sch, skb); | ||
2886 | |||
2887 | diff --git a/net/vmw_vsock/virtio_transport.c b/net/vmw_vsock/virtio_transport.c | ||
2888 | index 936d7eee62d0..f66a6010ae07 100644 | ||
2889 | --- a/net/vmw_vsock/virtio_transport.c | ||
2890 | +++ b/net/vmw_vsock/virtio_transport.c | ||
2891 | @@ -71,6 +71,9 @@ static u32 virtio_transport_get_local_cid(void) | ||
2892 | { | ||
2893 | struct virtio_vsock *vsock = virtio_vsock_get(); | ||
2894 | |||
2895 | + if (!vsock) | ||
2896 | + return VMADDR_CID_ANY; | ||
2897 | + | ||
2898 | return vsock->guest_cid; | ||
2899 | } | ||
2900 | |||
2901 | @@ -495,10 +498,6 @@ static int virtio_vsock_probe(struct virtio_device *vdev) | ||
2902 | |||
2903 | virtio_vsock_update_guest_cid(vsock); | ||
2904 | |||
2905 | - ret = vsock_core_init(&virtio_transport.transport); | ||
2906 | - if (ret < 0) | ||
2907 | - goto out_vqs; | ||
2908 | - | ||
2909 | vsock->rx_buf_nr = 0; | ||
2910 | vsock->rx_buf_max_nr = 0; | ||
2911 | atomic_set(&vsock->queued_replies, 0); | ||
2912 | @@ -526,8 +525,6 @@ static int virtio_vsock_probe(struct virtio_device *vdev) | ||
2913 | mutex_unlock(&the_virtio_vsock_mutex); | ||
2914 | return 0; | ||
2915 | |||
2916 | -out_vqs: | ||
2917 | - vsock->vdev->config->del_vqs(vsock->vdev); | ||
2918 | out: | ||
2919 | kfree(vsock); | ||
2920 | mutex_unlock(&the_virtio_vsock_mutex); | ||
2921 | @@ -544,6 +541,9 @@ static void virtio_vsock_remove(struct virtio_device *vdev) | ||
2922 | flush_work(&vsock->event_work); | ||
2923 | flush_work(&vsock->send_pkt_work); | ||
2924 | |||
2925 | + /* Reset all connected sockets when the device disappear */ | ||
2926 | + vsock_for_each_connected_socket(virtio_vsock_reset_sock); | ||
2927 | + | ||
2928 | vdev->config->reset(vdev); | ||
2929 | |||
2930 | mutex_lock(&vsock->rx_lock); | ||
2931 | @@ -567,7 +567,6 @@ static void virtio_vsock_remove(struct virtio_device *vdev) | ||
2932 | |||
2933 | mutex_lock(&the_virtio_vsock_mutex); | ||
2934 | the_virtio_vsock = NULL; | ||
2935 | - vsock_core_exit(); | ||
2936 | mutex_unlock(&the_virtio_vsock_mutex); | ||
2937 | |||
2938 | vdev->config->del_vqs(vdev); | ||
2939 | @@ -600,14 +599,28 @@ static int __init virtio_vsock_init(void) | ||
2940 | virtio_vsock_workqueue = alloc_workqueue("virtio_vsock", 0, 0); | ||
2941 | if (!virtio_vsock_workqueue) | ||
2942 | return -ENOMEM; | ||
2943 | + | ||
2944 | ret = register_virtio_driver(&virtio_vsock_driver); | ||
2945 | if (ret) | ||
2946 | - destroy_workqueue(virtio_vsock_workqueue); | ||
2947 | + goto out_wq; | ||
2948 | + | ||
2949 | + ret = vsock_core_init(&virtio_transport.transport); | ||
2950 | + if (ret) | ||
2951 | + goto out_vdr; | ||
2952 | + | ||
2953 | + return 0; | ||
2954 | + | ||
2955 | +out_vdr: | ||
2956 | + unregister_virtio_driver(&virtio_vsock_driver); | ||
2957 | +out_wq: | ||
2958 | + destroy_workqueue(virtio_vsock_workqueue); | ||
2959 | return ret; | ||
2960 | + | ||
2961 | } | ||
2962 | |||
2963 | static void __exit virtio_vsock_exit(void) | ||
2964 | { | ||
2965 | + vsock_core_exit(); | ||
2966 | unregister_virtio_driver(&virtio_vsock_driver); | ||
2967 | destroy_workqueue(virtio_vsock_workqueue); | ||
2968 | } | ||
2969 | diff --git a/tools/perf/util/cpumap.c b/tools/perf/util/cpumap.c | ||
2970 | index 2c0b52264a46..a625cb1500f9 100644 | ||
2971 | --- a/tools/perf/util/cpumap.c | ||
2972 | +++ b/tools/perf/util/cpumap.c | ||
2973 | @@ -129,7 +129,12 @@ struct cpu_map *cpu_map__new(const char *cpu_list) | ||
2974 | if (!cpu_list) | ||
2975 | return cpu_map__read_all_cpu_map(); | ||
2976 | |||
2977 | - if (!isdigit(*cpu_list)) | ||
2978 | + /* | ||
2979 | + * must handle the case of empty cpumap to cover | ||
2980 | + * TOPOLOGY header for NUMA nodes with no CPU | ||
2981 | + * ( e.g., because of CPU hotplug) | ||
2982 | + */ | ||
2983 | + if (!isdigit(*cpu_list) && *cpu_list != '\0') | ||
2984 | goto out; | ||
2985 | |||
2986 | while (isdigit(*cpu_list)) { | ||
2987 | @@ -176,8 +181,10 @@ struct cpu_map *cpu_map__new(const char *cpu_list) | ||
2988 | |||
2989 | if (nr_cpus > 0) | ||
2990 | cpus = cpu_map__trim_new(nr_cpus, tmp_cpus); | ||
2991 | - else | ||
2992 | + else if (*cpu_list != '\0') | ||
2993 | cpus = cpu_map__default_new(); | ||
2994 | + else | ||
2995 | + cpus = cpu_map__dummy_new(); | ||
2996 | invalid: | ||
2997 | free(tmp_cpus); | ||
2998 | out: | ||
2999 | diff --git a/tools/perf/util/symbol-elf.c b/tools/perf/util/symbol-elf.c | ||
3000 | index adbc6c02c3aa..20ba5a9aeae4 100644 | ||
3001 | --- a/tools/perf/util/symbol-elf.c | ||
3002 | +++ b/tools/perf/util/symbol-elf.c | ||
3003 | @@ -85,6 +85,11 @@ static inline uint8_t elf_sym__type(const GElf_Sym *sym) | ||
3004 | return GELF_ST_TYPE(sym->st_info); | ||
3005 | } | ||
3006 | |||
3007 | +static inline uint8_t elf_sym__visibility(const GElf_Sym *sym) | ||
3008 | +{ | ||
3009 | + return GELF_ST_VISIBILITY(sym->st_other); | ||
3010 | +} | ||
3011 | + | ||
3012 | #ifndef STT_GNU_IFUNC | ||
3013 | #define STT_GNU_IFUNC 10 | ||
3014 | #endif | ||
3015 | @@ -109,7 +114,9 @@ static inline int elf_sym__is_label(const GElf_Sym *sym) | ||
3016 | return elf_sym__type(sym) == STT_NOTYPE && | ||
3017 | sym->st_name != 0 && | ||
3018 | sym->st_shndx != SHN_UNDEF && | ||
3019 | - sym->st_shndx != SHN_ABS; | ||
3020 | + sym->st_shndx != SHN_ABS && | ||
3021 | + elf_sym__visibility(sym) != STV_HIDDEN && | ||
3022 | + elf_sym__visibility(sym) != STV_INTERNAL; | ||
3023 | } | ||
3024 | |||
3025 | static bool elf_sym__is_a(GElf_Sym *sym, enum map_type type) | ||
3026 | diff --git a/tools/testing/selftests/netfilter/Makefile b/tools/testing/selftests/netfilter/Makefile | ||
3027 | index 47ed6cef93fb..c9ff2b47bd1c 100644 | ||
3028 | --- a/tools/testing/selftests/netfilter/Makefile | ||
3029 | +++ b/tools/testing/selftests/netfilter/Makefile | ||
3030 | @@ -1,6 +1,6 @@ | ||
3031 | # SPDX-License-Identifier: GPL-2.0 | ||
3032 | # Makefile for netfilter selftests | ||
3033 | |||
3034 | -TEST_PROGS := nft_trans_stress.sh | ||
3035 | +TEST_PROGS := nft_trans_stress.sh nft_nat.sh | ||
3036 | |||
3037 | include ../lib.mk | ||
3038 | diff --git a/tools/testing/selftests/netfilter/config b/tools/testing/selftests/netfilter/config | ||
3039 | index 1017313e41a8..59caa8f71cd8 100644 | ||
3040 | --- a/tools/testing/selftests/netfilter/config | ||
3041 | +++ b/tools/testing/selftests/netfilter/config | ||
3042 | @@ -1,2 +1,2 @@ | ||
3043 | CONFIG_NET_NS=y | ||
3044 | -NF_TABLES_INET=y | ||
3045 | +CONFIG_NF_TABLES_INET=y | ||
3046 | diff --git a/tools/testing/selftests/netfilter/nft_nat.sh b/tools/testing/selftests/netfilter/nft_nat.sh | ||
3047 | new file mode 100755 | ||
3048 | index 000000000000..8ec76681605c | ||
3049 | --- /dev/null | ||
3050 | +++ b/tools/testing/selftests/netfilter/nft_nat.sh | ||
3051 | @@ -0,0 +1,762 @@ | ||
3052 | +#!/bin/bash | ||
3053 | +# | ||
3054 | +# This test is for basic NAT functionality: snat, dnat, redirect, masquerade. | ||
3055 | +# | ||
3056 | + | ||
3057 | +# Kselftest framework requirement - SKIP code is 4. | ||
3058 | +ksft_skip=4 | ||
3059 | +ret=0 | ||
3060 | + | ||
3061 | +nft --version > /dev/null 2>&1 | ||
3062 | +if [ $? -ne 0 ];then | ||
3063 | + echo "SKIP: Could not run test without nft tool" | ||
3064 | + exit $ksft_skip | ||
3065 | +fi | ||
3066 | + | ||
3067 | +ip -Version > /dev/null 2>&1 | ||
3068 | +if [ $? -ne 0 ];then | ||
3069 | + echo "SKIP: Could not run test without ip tool" | ||
3070 | + exit $ksft_skip | ||
3071 | +fi | ||
3072 | + | ||
3073 | +ip netns add ns0 | ||
3074 | +ip netns add ns1 | ||
3075 | +ip netns add ns2 | ||
3076 | + | ||
3077 | +ip link add veth0 netns ns0 type veth peer name eth0 netns ns1 | ||
3078 | +ip link add veth1 netns ns0 type veth peer name eth0 netns ns2 | ||
3079 | + | ||
3080 | +ip -net ns0 link set lo up | ||
3081 | +ip -net ns0 link set veth0 up | ||
3082 | +ip -net ns0 addr add 10.0.1.1/24 dev veth0 | ||
3083 | +ip -net ns0 addr add dead:1::1/64 dev veth0 | ||
3084 | + | ||
3085 | +ip -net ns0 link set veth1 up | ||
3086 | +ip -net ns0 addr add 10.0.2.1/24 dev veth1 | ||
3087 | +ip -net ns0 addr add dead:2::1/64 dev veth1 | ||
3088 | + | ||
3089 | +for i in 1 2; do | ||
3090 | + ip -net ns$i link set lo up | ||
3091 | + ip -net ns$i link set eth0 up | ||
3092 | + ip -net ns$i addr add 10.0.$i.99/24 dev eth0 | ||
3093 | + ip -net ns$i route add default via 10.0.$i.1 | ||
3094 | + ip -net ns$i addr add dead:$i::99/64 dev eth0 | ||
3095 | + ip -net ns$i route add default via dead:$i::1 | ||
3096 | +done | ||
3097 | + | ||
3098 | +bad_counter() | ||
3099 | +{ | ||
3100 | + local ns=$1 | ||
3101 | + local counter=$2 | ||
3102 | + local expect=$3 | ||
3103 | + | ||
3104 | + echo "ERROR: $counter counter in $ns has unexpected value (expected $expect)" 1>&2 | ||
3105 | + ip netns exec $ns nft list counter inet filter $counter 1>&2 | ||
3106 | +} | ||
3107 | + | ||
3108 | +check_counters() | ||
3109 | +{ | ||
3110 | + ns=$1 | ||
3111 | + local lret=0 | ||
3112 | + | ||
3113 | + cnt=$(ip netns exec $ns nft list counter inet filter ns0in | grep -q "packets 1 bytes 84") | ||
3114 | + if [ $? -ne 0 ]; then | ||
3115 | + bad_counter $ns ns0in "packets 1 bytes 84" | ||
3116 | + lret=1 | ||
3117 | + fi | ||
3118 | + cnt=$(ip netns exec $ns nft list counter inet filter ns0out | grep -q "packets 1 bytes 84") | ||
3119 | + if [ $? -ne 0 ]; then | ||
3120 | + bad_counter $ns ns0out "packets 1 bytes 84" | ||
3121 | + lret=1 | ||
3122 | + fi | ||
3123 | + | ||
3124 | + expect="packets 1 bytes 104" | ||
3125 | + cnt=$(ip netns exec $ns nft list counter inet filter ns0in6 | grep -q "$expect") | ||
3126 | + if [ $? -ne 0 ]; then | ||
3127 | + bad_counter $ns ns0in6 "$expect" | ||
3128 | + lret=1 | ||
3129 | + fi | ||
3130 | + cnt=$(ip netns exec $ns nft list counter inet filter ns0out6 | grep -q "$expect") | ||
3131 | + if [ $? -ne 0 ]; then | ||
3132 | + bad_counter $ns ns0out6 "$expect" | ||
3133 | + lret=1 | ||
3134 | + fi | ||
3135 | + | ||
3136 | + return $lret | ||
3137 | +} | ||
3138 | + | ||
3139 | +check_ns0_counters() | ||
3140 | +{ | ||
3141 | + local ns=$1 | ||
3142 | + local lret=0 | ||
3143 | + | ||
3144 | + cnt=$(ip netns exec ns0 nft list counter inet filter ns0in | grep -q "packets 0 bytes 0") | ||
3145 | + if [ $? -ne 0 ]; then | ||
3146 | + bad_counter ns0 ns0in "packets 0 bytes 0" | ||
3147 | + lret=1 | ||
3148 | + fi | ||
3149 | + | ||
3150 | + cnt=$(ip netns exec ns0 nft list counter inet filter ns0in6 | grep -q "packets 0 bytes 0") | ||
3151 | + if [ $? -ne 0 ]; then | ||
3152 | + bad_counter ns0 ns0in6 "packets 0 bytes 0" | ||
3153 | + lret=1 | ||
3154 | + fi | ||
3155 | + | ||
3156 | + cnt=$(ip netns exec ns0 nft list counter inet filter ns0out | grep -q "packets 0 bytes 0") | ||
3157 | + if [ $? -ne 0 ]; then | ||
3158 | + bad_counter ns0 ns0out "packets 0 bytes 0" | ||
3159 | + lret=1 | ||
3160 | + fi | ||
3161 | + cnt=$(ip netns exec ns0 nft list counter inet filter ns0out6 | grep -q "packets 0 bytes 0") | ||
3162 | + if [ $? -ne 0 ]; then | ||
3163 | + bad_counter ns0 ns0out6 "packets 0 bytes 0" | ||
3164 | + lret=1 | ||
3165 | + fi | ||
3166 | + | ||
3167 | + for dir in "in" "out" ; do | ||
3168 | + expect="packets 1 bytes 84" | ||
3169 | + cnt=$(ip netns exec ns0 nft list counter inet filter ${ns}${dir} | grep -q "$expect") | ||
3170 | + if [ $? -ne 0 ]; then | ||
3171 | + bad_counter ns0 $ns$dir "$expect" | ||
3172 | + lret=1 | ||
3173 | + fi | ||
3174 | + | ||
3175 | + expect="packets 1 bytes 104" | ||
3176 | + cnt=$(ip netns exec ns0 nft list counter inet filter ${ns}${dir}6 | grep -q "$expect") | ||
3177 | + if [ $? -ne 0 ]; then | ||
3178 | + bad_counter ns0 $ns$dir6 "$expect" | ||
3179 | + lret=1 | ||
3180 | + fi | ||
3181 | + done | ||
3182 | + | ||
3183 | + return $lret | ||
3184 | +} | ||
3185 | + | ||
3186 | +reset_counters() | ||
3187 | +{ | ||
3188 | + for i in 0 1 2;do | ||
3189 | + ip netns exec ns$i nft reset counters inet > /dev/null | ||
3190 | + done | ||
3191 | +} | ||
3192 | + | ||
3193 | +test_local_dnat6() | ||
3194 | +{ | ||
3195 | + local lret=0 | ||
3196 | +ip netns exec ns0 nft -f - <<EOF | ||
3197 | +table ip6 nat { | ||
3198 | + chain output { | ||
3199 | + type nat hook output priority 0; policy accept; | ||
3200 | + ip6 daddr dead:1::99 dnat to dead:2::99 | ||
3201 | + } | ||
3202 | +} | ||
3203 | +EOF | ||
3204 | + if [ $? -ne 0 ]; then | ||
3205 | + echo "SKIP: Could not add add ip6 dnat hook" | ||
3206 | + return $ksft_skip | ||
3207 | + fi | ||
3208 | + | ||
3209 | + # ping netns1, expect rewrite to netns2 | ||
3210 | + ip netns exec ns0 ping -q -c 1 dead:1::99 > /dev/null | ||
3211 | + if [ $? -ne 0 ]; then | ||
3212 | + lret=1 | ||
3213 | + echo "ERROR: ping6 failed" | ||
3214 | + return $lret | ||
3215 | + fi | ||
3216 | + | ||
3217 | + expect="packets 0 bytes 0" | ||
3218 | + for dir in "in6" "out6" ; do | ||
3219 | + cnt=$(ip netns exec ns0 nft list counter inet filter ns1${dir} | grep -q "$expect") | ||
3220 | + if [ $? -ne 0 ]; then | ||
3221 | + bad_counter ns0 ns1$dir "$expect" | ||
3222 | + lret=1 | ||
3223 | + fi | ||
3224 | + done | ||
3225 | + | ||
3226 | + expect="packets 1 bytes 104" | ||
3227 | + for dir in "in6" "out6" ; do | ||
3228 | + cnt=$(ip netns exec ns0 nft list counter inet filter ns2${dir} | grep -q "$expect") | ||
3229 | + if [ $? -ne 0 ]; then | ||
3230 | + bad_counter ns0 ns2$dir "$expect" | ||
3231 | + lret=1 | ||
3232 | + fi | ||
3233 | + done | ||
3234 | + | ||
3235 | + # expect 0 count in ns1 | ||
3236 | + expect="packets 0 bytes 0" | ||
3237 | + for dir in "in6" "out6" ; do | ||
3238 | + cnt=$(ip netns exec ns1 nft list counter inet filter ns0${dir} | grep -q "$expect") | ||
3239 | + if [ $? -ne 0 ]; then | ||
3240 | + bad_counter ns1 ns0$dir "$expect" | ||
3241 | + lret=1 | ||
3242 | + fi | ||
3243 | + done | ||
3244 | + | ||
3245 | + # expect 1 packet in ns2 | ||
3246 | + expect="packets 1 bytes 104" | ||
3247 | + for dir in "in6" "out6" ; do | ||
3248 | + cnt=$(ip netns exec ns2 nft list counter inet filter ns0${dir} | grep -q "$expect") | ||
3249 | + if [ $? -ne 0 ]; then | ||
3250 | + bad_counter ns2 ns0$dir "$expect" | ||
3251 | + lret=1 | ||
3252 | + fi | ||
3253 | + done | ||
3254 | + | ||
3255 | + test $lret -eq 0 && echo "PASS: ipv6 ping to ns1 was NATted to ns2" | ||
3256 | + ip netns exec ns0 nft flush chain ip6 nat output | ||
3257 | + | ||
3258 | + return $lret | ||
3259 | +} | ||
3260 | + | ||
3261 | +test_local_dnat() | ||
3262 | +{ | ||
3263 | + local lret=0 | ||
3264 | +ip netns exec ns0 nft -f - <<EOF | ||
3265 | +table ip nat { | ||
3266 | + chain output { | ||
3267 | + type nat hook output priority 0; policy accept; | ||
3268 | + ip daddr 10.0.1.99 dnat to 10.0.2.99 | ||
3269 | + } | ||
3270 | +} | ||
3271 | +EOF | ||
3272 | + # ping netns1, expect rewrite to netns2 | ||
3273 | + ip netns exec ns0 ping -q -c 1 10.0.1.99 > /dev/null | ||
3274 | + if [ $? -ne 0 ]; then | ||
3275 | + lret=1 | ||
3276 | + echo "ERROR: ping failed" | ||
3277 | + return $lret | ||
3278 | + fi | ||
3279 | + | ||
3280 | + expect="packets 0 bytes 0" | ||
3281 | + for dir in "in" "out" ; do | ||
3282 | + cnt=$(ip netns exec ns0 nft list counter inet filter ns1${dir} | grep -q "$expect") | ||
3283 | + if [ $? -ne 0 ]; then | ||
3284 | + bad_counter ns0 ns1$dir "$expect" | ||
3285 | + lret=1 | ||
3286 | + fi | ||
3287 | + done | ||
3288 | + | ||
3289 | + expect="packets 1 bytes 84" | ||
3290 | + for dir in "in" "out" ; do | ||
3291 | + cnt=$(ip netns exec ns0 nft list counter inet filter ns2${dir} | grep -q "$expect") | ||
3292 | + if [ $? -ne 0 ]; then | ||
3293 | + bad_counter ns0 ns2$dir "$expect" | ||
3294 | + lret=1 | ||
3295 | + fi | ||
3296 | + done | ||
3297 | + | ||
3298 | + # expect 0 count in ns1 | ||
3299 | + expect="packets 0 bytes 0" | ||
3300 | + for dir in "in" "out" ; do | ||
3301 | + cnt=$(ip netns exec ns1 nft list counter inet filter ns0${dir} | grep -q "$expect") | ||
3302 | + if [ $? -ne 0 ]; then | ||
3303 | + bad_counter ns1 ns0$dir "$expect" | ||
3304 | + lret=1 | ||
3305 | + fi | ||
3306 | + done | ||
3307 | + | ||
3308 | + # expect 1 packet in ns2 | ||
3309 | + expect="packets 1 bytes 84" | ||
3310 | + for dir in "in" "out" ; do | ||
3311 | + cnt=$(ip netns exec ns2 nft list counter inet filter ns0${dir} | grep -q "$expect") | ||
3312 | + if [ $? -ne 0 ]; then | ||
3313 | + bad_counter ns2 ns0$dir "$expect" | ||
3314 | + lret=1 | ||
3315 | + fi | ||
3316 | + done | ||
3317 | + | ||
3318 | + test $lret -eq 0 && echo "PASS: ping to ns1 was NATted to ns2" | ||
3319 | + | ||
3320 | + ip netns exec ns0 nft flush chain ip nat output | ||
3321 | + | ||
3322 | + reset_counters | ||
3323 | + ip netns exec ns0 ping -q -c 1 10.0.1.99 > /dev/null | ||
3324 | + if [ $? -ne 0 ]; then | ||
3325 | + lret=1 | ||
3326 | + echo "ERROR: ping failed" | ||
3327 | + return $lret | ||
3328 | + fi | ||
3329 | + | ||
3330 | + expect="packets 1 bytes 84" | ||
3331 | + for dir in "in" "out" ; do | ||
3332 | + cnt=$(ip netns exec ns0 nft list counter inet filter ns1${dir} | grep -q "$expect") | ||
3333 | + if [ $? -ne 0 ]; then | ||
3334 | + bad_counter ns1 ns1$dir "$expect" | ||
3335 | + lret=1 | ||
3336 | + fi | ||
3337 | + done | ||
3338 | + expect="packets 0 bytes 0" | ||
3339 | + for dir in "in" "out" ; do | ||
3340 | + cnt=$(ip netns exec ns0 nft list counter inet filter ns2${dir} | grep -q "$expect") | ||
3341 | + if [ $? -ne 0 ]; then | ||
3342 | + bad_counter ns0 ns2$dir "$expect" | ||
3343 | + lret=1 | ||
3344 | + fi | ||
3345 | + done | ||
3346 | + | ||
3347 | + # expect 1 count in ns1 | ||
3348 | + expect="packets 1 bytes 84" | ||
3349 | + for dir in "in" "out" ; do | ||
3350 | + cnt=$(ip netns exec ns1 nft list counter inet filter ns0${dir} | grep -q "$expect") | ||
3351 | + if [ $? -ne 0 ]; then | ||
3352 | + bad_counter ns0 ns0$dir "$expect" | ||
3353 | + lret=1 | ||
3354 | + fi | ||
3355 | + done | ||
3356 | + | ||
3357 | + # expect 0 packet in ns2 | ||
3358 | + expect="packets 0 bytes 0" | ||
3359 | + for dir in "in" "out" ; do | ||
3360 | + cnt=$(ip netns exec ns2 nft list counter inet filter ns0${dir} | grep -q "$expect") | ||
3361 | + if [ $? -ne 0 ]; then | ||
3362 | + bad_counter ns2 ns2$dir "$expect" | ||
3363 | + lret=1 | ||
3364 | + fi | ||
3365 | + done | ||
3366 | + | ||
3367 | + test $lret -eq 0 && echo "PASS: ping to ns1 OK after nat output chain flush" | ||
3368 | + | ||
3369 | + return $lret | ||
3370 | +} | ||
3371 | + | ||
3372 | + | ||
3373 | +test_masquerade6() | ||
3374 | +{ | ||
3375 | + local lret=0 | ||
3376 | + | ||
3377 | + ip netns exec ns0 sysctl net.ipv6.conf.all.forwarding=1 > /dev/null | ||
3378 | + | ||
3379 | + ip netns exec ns2 ping -q -c 1 dead:1::99 > /dev/null # ping ns2->ns1 | ||
3380 | + if [ $? -ne 0 ] ; then | ||
3381 | + echo "ERROR: cannot ping ns1 from ns2 via ipv6" | ||
3382 | + return 1 | ||
3383 | + lret=1 | ||
3384 | + fi | ||
3385 | + | ||
3386 | + expect="packets 1 bytes 104" | ||
3387 | + for dir in "in6" "out6" ; do | ||
3388 | + cnt=$(ip netns exec ns1 nft list counter inet filter ns2${dir} | grep -q "$expect") | ||
3389 | + if [ $? -ne 0 ]; then | ||
3390 | + bad_counter ns1 ns2$dir "$expect" | ||
3391 | + lret=1 | ||
3392 | + fi | ||
3393 | + | ||
3394 | + cnt=$(ip netns exec ns2 nft list counter inet filter ns1${dir} | grep -q "$expect") | ||
3395 | + if [ $? -ne 0 ]; then | ||
3396 | + bad_counter ns2 ns1$dir "$expect" | ||
3397 | + lret=1 | ||
3398 | + fi | ||
3399 | + done | ||
3400 | + | ||
3401 | + reset_counters | ||
3402 | + | ||
3403 | +# add masquerading rule | ||
3404 | +ip netns exec ns0 nft -f - <<EOF | ||
3405 | +table ip6 nat { | ||
3406 | + chain postrouting { | ||
3407 | + type nat hook postrouting priority 0; policy accept; | ||
3408 | + meta oif veth0 masquerade | ||
3409 | + } | ||
3410 | +} | ||
3411 | +EOF | ||
3412 | + ip netns exec ns2 ping -q -c 1 dead:1::99 > /dev/null # ping ns2->ns1 | ||
3413 | + if [ $? -ne 0 ] ; then | ||
3414 | + echo "ERROR: cannot ping ns1 from ns2 with active ipv6 masquerading" | ||
3415 | + lret=1 | ||
3416 | + fi | ||
3417 | + | ||
3418 | + # ns1 should have seen packets from ns0, due to masquerade | ||
3419 | + expect="packets 1 bytes 104" | ||
3420 | + for dir in "in6" "out6" ; do | ||
3421 | + | ||
3422 | + cnt=$(ip netns exec ns1 nft list counter inet filter ns0${dir} | grep -q "$expect") | ||
3423 | + if [ $? -ne 0 ]; then | ||
3424 | + bad_counter ns1 ns0$dir "$expect" | ||
3425 | + lret=1 | ||
3426 | + fi | ||
3427 | + | ||
3428 | + cnt=$(ip netns exec ns2 nft list counter inet filter ns1${dir} | grep -q "$expect") | ||
3429 | + if [ $? -ne 0 ]; then | ||
3430 | + bad_counter ns2 ns1$dir "$expect" | ||
3431 | + lret=1 | ||
3432 | + fi | ||
3433 | + done | ||
3434 | + | ||
3435 | + # ns1 should not have seen packets from ns2, due to masquerade | ||
3436 | + expect="packets 0 bytes 0" | ||
3437 | + for dir in "in6" "out6" ; do | ||
3438 | + cnt=$(ip netns exec ns1 nft list counter inet filter ns2${dir} | grep -q "$expect") | ||
3439 | + if [ $? -ne 0 ]; then | ||
3440 | + bad_counter ns1 ns0$dir "$expect" | ||
3441 | + lret=1 | ||
3442 | + fi | ||
3443 | + | ||
3444 | + cnt=$(ip netns exec ns1 nft list counter inet filter ns2${dir} | grep -q "$expect") | ||
3445 | + if [ $? -ne 0 ]; then | ||
3446 | + bad_counter ns2 ns1$dir "$expect" | ||
3447 | + lret=1 | ||
3448 | + fi | ||
3449 | + done | ||
3450 | + | ||
3451 | + ip netns exec ns0 nft flush chain ip6 nat postrouting | ||
3452 | + if [ $? -ne 0 ]; then | ||
3453 | + echo "ERROR: Could not flush ip6 nat postrouting" 1>&2 | ||
3454 | + lret=1 | ||
3455 | + fi | ||
3456 | + | ||
3457 | + test $lret -eq 0 && echo "PASS: IPv6 masquerade for ns2" | ||
3458 | + | ||
3459 | + return $lret | ||
3460 | +} | ||
3461 | + | ||
3462 | +test_masquerade() | ||
3463 | +{ | ||
3464 | + local lret=0 | ||
3465 | + | ||
3466 | + ip netns exec ns0 sysctl net.ipv4.conf.veth0.forwarding=1 > /dev/null | ||
3467 | + ip netns exec ns0 sysctl net.ipv4.conf.veth1.forwarding=1 > /dev/null | ||
3468 | + | ||
3469 | + ip netns exec ns2 ping -q -c 1 10.0.1.99 > /dev/null # ping ns2->ns1 | ||
3470 | + if [ $? -ne 0 ] ; then | ||
3471 | + echo "ERROR: canot ping ns1 from ns2" | ||
3472 | + lret=1 | ||
3473 | + fi | ||
3474 | + | ||
3475 | + expect="packets 1 bytes 84" | ||
3476 | + for dir in "in" "out" ; do | ||
3477 | + cnt=$(ip netns exec ns1 nft list counter inet filter ns2${dir} | grep -q "$expect") | ||
3478 | + if [ $? -ne 0 ]; then | ||
3479 | + bad_counter ns1 ns2$dir "$expect" | ||
3480 | + lret=1 | ||
3481 | + fi | ||
3482 | + | ||
3483 | + cnt=$(ip netns exec ns2 nft list counter inet filter ns1${dir} | grep -q "$expect") | ||
3484 | + if [ $? -ne 0 ]; then | ||
3485 | + bad_counter ns2 ns1$dir "$expect" | ||
3486 | + lret=1 | ||
3487 | + fi | ||
3488 | + done | ||
3489 | + | ||
3490 | + reset_counters | ||
3491 | + | ||
3492 | +# add masquerading rule | ||
3493 | +ip netns exec ns0 nft -f - <<EOF | ||
3494 | +table ip nat { | ||
3495 | + chain postrouting { | ||
3496 | + type nat hook postrouting priority 0; policy accept; | ||
3497 | + meta oif veth0 masquerade | ||
3498 | + } | ||
3499 | +} | ||
3500 | +EOF | ||
3501 | + ip netns exec ns2 ping -q -c 1 10.0.1.99 > /dev/null # ping ns2->ns1 | ||
3502 | + if [ $? -ne 0 ] ; then | ||
3503 | + echo "ERROR: cannot ping ns1 from ns2 with active ip masquerading" | ||
3504 | + lret=1 | ||
3505 | + fi | ||
3506 | + | ||
3507 | + # ns1 should have seen packets from ns0, due to masquerade | ||
3508 | + expect="packets 1 bytes 84" | ||
3509 | + for dir in "in" "out" ; do | ||
3510 | + cnt=$(ip netns exec ns1 nft list counter inet filter ns0${dir} | grep -q "$expect") | ||
3511 | + if [ $? -ne 0 ]; then | ||
3512 | + bad_counter ns1 ns0$dir "$expect" | ||
3513 | + lret=1 | ||
3514 | + fi | ||
3515 | + | ||
3516 | + cnt=$(ip netns exec ns2 nft list counter inet filter ns1${dir} | grep -q "$expect") | ||
3517 | + if [ $? -ne 0 ]; then | ||
3518 | + bad_counter ns2 ns1$dir "$expect" | ||
3519 | + lret=1 | ||
3520 | + fi | ||
3521 | + done | ||
3522 | + | ||
3523 | + # ns1 should not have seen packets from ns2, due to masquerade | ||
3524 | + expect="packets 0 bytes 0" | ||
3525 | + for dir in "in" "out" ; do | ||
3526 | + cnt=$(ip netns exec ns1 nft list counter inet filter ns2${dir} | grep -q "$expect") | ||
3527 | + if [ $? -ne 0 ]; then | ||
3528 | + bad_counter ns1 ns0$dir "$expect" | ||
3529 | + lret=1 | ||
3530 | + fi | ||
3531 | + | ||
3532 | + cnt=$(ip netns exec ns1 nft list counter inet filter ns2${dir} | grep -q "$expect") | ||
3533 | + if [ $? -ne 0 ]; then | ||
3534 | + bad_counter ns2 ns1$dir "$expect" | ||
3535 | + lret=1 | ||
3536 | + fi | ||
3537 | + done | ||
3538 | + | ||
3539 | + ip netns exec ns0 nft flush chain ip nat postrouting | ||
3540 | + if [ $? -ne 0 ]; then | ||
3541 | + echo "ERROR: Could not flush nat postrouting" 1>&2 | ||
3542 | + lret=1 | ||
3543 | + fi | ||
3544 | + | ||
3545 | + test $lret -eq 0 && echo "PASS: IP masquerade for ns2" | ||
3546 | + | ||
3547 | + return $lret | ||
3548 | +} | ||
3549 | + | ||
3550 | +test_redirect6() | ||
3551 | +{ | ||
3552 | + local lret=0 | ||
3553 | + | ||
3554 | + ip netns exec ns0 sysctl net.ipv6.conf.all.forwarding=1 > /dev/null | ||
3555 | + | ||
3556 | + ip netns exec ns2 ping -q -c 1 dead:1::99 > /dev/null # ping ns2->ns1 | ||
3557 | + if [ $? -ne 0 ] ; then | ||
3558 | + echo "ERROR: cannnot ping ns1 from ns2 via ipv6" | ||
3559 | + lret=1 | ||
3560 | + fi | ||
3561 | + | ||
3562 | + expect="packets 1 bytes 104" | ||
3563 | + for dir in "in6" "out6" ; do | ||
3564 | + cnt=$(ip netns exec ns1 nft list counter inet filter ns2${dir} | grep -q "$expect") | ||
3565 | + if [ $? -ne 0 ]; then | ||
3566 | + bad_counter ns1 ns2$dir "$expect" | ||
3567 | + lret=1 | ||
3568 | + fi | ||
3569 | + | ||
3570 | + cnt=$(ip netns exec ns2 nft list counter inet filter ns1${dir} | grep -q "$expect") | ||
3571 | + if [ $? -ne 0 ]; then | ||
3572 | + bad_counter ns2 ns1$dir "$expect" | ||
3573 | + lret=1 | ||
3574 | + fi | ||
3575 | + done | ||
3576 | + | ||
3577 | + reset_counters | ||
3578 | + | ||
3579 | +# add redirect rule | ||
3580 | +ip netns exec ns0 nft -f - <<EOF | ||
3581 | +table ip6 nat { | ||
3582 | + chain prerouting { | ||
3583 | + type nat hook prerouting priority 0; policy accept; | ||
3584 | + meta iif veth1 meta l4proto icmpv6 ip6 saddr dead:2::99 ip6 daddr dead:1::99 redirect | ||
3585 | + } | ||
3586 | +} | ||
3587 | +EOF | ||
3588 | + ip netns exec ns2 ping -q -c 1 dead:1::99 > /dev/null # ping ns2->ns1 | ||
3589 | + if [ $? -ne 0 ] ; then | ||
3590 | + echo "ERROR: cannot ping ns1 from ns2 with active ip6 redirect" | ||
3591 | + lret=1 | ||
3592 | + fi | ||
3593 | + | ||
3594 | + # ns1 should have seen no packets from ns2, due to redirection | ||
3595 | + expect="packets 0 bytes 0" | ||
3596 | + for dir in "in6" "out6" ; do | ||
3597 | + cnt=$(ip netns exec ns1 nft list counter inet filter ns2${dir} | grep -q "$expect") | ||
3598 | + if [ $? -ne 0 ]; then | ||
3599 | + bad_counter ns1 ns0$dir "$expect" | ||
3600 | + lret=1 | ||
3601 | + fi | ||
3602 | + done | ||
3603 | + | ||
3604 | + # ns0 should have seen packets from ns2, due to masquerade | ||
3605 | + expect="packets 1 bytes 104" | ||
3606 | + for dir in "in6" "out6" ; do | ||
3607 | + cnt=$(ip netns exec ns0 nft list counter inet filter ns2${dir} | grep -q "$expect") | ||
3608 | + if [ $? -ne 0 ]; then | ||
3609 | + bad_counter ns1 ns0$dir "$expect" | ||
3610 | + lret=1 | ||
3611 | + fi | ||
3612 | + done | ||
3613 | + | ||
3614 | + ip netns exec ns0 nft delete table ip6 nat | ||
3615 | + if [ $? -ne 0 ]; then | ||
3616 | + echo "ERROR: Could not delete ip6 nat table" 1>&2 | ||
3617 | + lret=1 | ||
3618 | + fi | ||
3619 | + | ||
3620 | + test $lret -eq 0 && echo "PASS: IPv6 redirection for ns2" | ||
3621 | + | ||
3622 | + return $lret | ||
3623 | +} | ||
3624 | + | ||
3625 | +test_redirect() | ||
3626 | +{ | ||
3627 | + local lret=0 | ||
3628 | + | ||
3629 | + ip netns exec ns0 sysctl net.ipv4.conf.veth0.forwarding=1 > /dev/null | ||
3630 | + ip netns exec ns0 sysctl net.ipv4.conf.veth1.forwarding=1 > /dev/null | ||
3631 | + | ||
3632 | + ip netns exec ns2 ping -q -c 1 10.0.1.99 > /dev/null # ping ns2->ns1 | ||
3633 | + if [ $? -ne 0 ] ; then | ||
3634 | + echo "ERROR: cannot ping ns1 from ns2" | ||
3635 | + lret=1 | ||
3636 | + fi | ||
3637 | + | ||
3638 | + expect="packets 1 bytes 84" | ||
3639 | + for dir in "in" "out" ; do | ||
3640 | + cnt=$(ip netns exec ns1 nft list counter inet filter ns2${dir} | grep -q "$expect") | ||
3641 | + if [ $? -ne 0 ]; then | ||
3642 | + bad_counter ns1 ns2$dir "$expect" | ||
3643 | + lret=1 | ||
3644 | + fi | ||
3645 | + | ||
3646 | + cnt=$(ip netns exec ns2 nft list counter inet filter ns1${dir} | grep -q "$expect") | ||
3647 | + if [ $? -ne 0 ]; then | ||
3648 | + bad_counter ns2 ns1$dir "$expect" | ||
3649 | + lret=1 | ||
3650 | + fi | ||
3651 | + done | ||
3652 | + | ||
3653 | + reset_counters | ||
3654 | + | ||
3655 | +# add redirect rule | ||
3656 | +ip netns exec ns0 nft -f - <<EOF | ||
3657 | +table ip nat { | ||
3658 | + chain prerouting { | ||
3659 | + type nat hook prerouting priority 0; policy accept; | ||
3660 | + meta iif veth1 ip protocol icmp ip saddr 10.0.2.99 ip daddr 10.0.1.99 redirect | ||
3661 | + } | ||
3662 | +} | ||
3663 | +EOF | ||
3664 | + ip netns exec ns2 ping -q -c 1 10.0.1.99 > /dev/null # ping ns2->ns1 | ||
3665 | + if [ $? -ne 0 ] ; then | ||
3666 | + echo "ERROR: cannot ping ns1 from ns2 with active ip redirect" | ||
3667 | + lret=1 | ||
3668 | + fi | ||
3669 | + | ||
3670 | + # ns1 should have seen no packets from ns2, due to redirection | ||
3671 | + expect="packets 0 bytes 0" | ||
3672 | + for dir in "in" "out" ; do | ||
3673 | + | ||
3674 | + cnt=$(ip netns exec ns1 nft list counter inet filter ns2${dir} | grep -q "$expect") | ||
3675 | + if [ $? -ne 0 ]; then | ||
3676 | + bad_counter ns1 ns0$dir "$expect" | ||
3677 | + lret=1 | ||
3678 | + fi | ||
3679 | + done | ||
3680 | + | ||
3681 | + # ns0 should have seen packets from ns2, due to masquerade | ||
3682 | + expect="packets 1 bytes 84" | ||
3683 | + for dir in "in" "out" ; do | ||
3684 | + cnt=$(ip netns exec ns0 nft list counter inet filter ns2${dir} | grep -q "$expect") | ||
3685 | + if [ $? -ne 0 ]; then | ||
3686 | + bad_counter ns1 ns0$dir "$expect" | ||
3687 | + lret=1 | ||
3688 | + fi | ||
3689 | + done | ||
3690 | + | ||
3691 | + ip netns exec ns0 nft delete table ip nat | ||
3692 | + if [ $? -ne 0 ]; then | ||
3693 | + echo "ERROR: Could not delete nat table" 1>&2 | ||
3694 | + lret=1 | ||
3695 | + fi | ||
3696 | + | ||
3697 | + test $lret -eq 0 && echo "PASS: IP redirection for ns2" | ||
3698 | + | ||
3699 | + return $lret | ||
3700 | +} | ||
3701 | + | ||
3702 | + | ||
3703 | +# ip netns exec ns0 ping -c 1 -q 10.0.$i.99 | ||
3704 | +for i in 0 1 2; do | ||
3705 | +ip netns exec ns$i nft -f - <<EOF | ||
3706 | +table inet filter { | ||
3707 | + counter ns0in {} | ||
3708 | + counter ns1in {} | ||
3709 | + counter ns2in {} | ||
3710 | + | ||
3711 | + counter ns0out {} | ||
3712 | + counter ns1out {} | ||
3713 | + counter ns2out {} | ||
3714 | + | ||
3715 | + counter ns0in6 {} | ||
3716 | + counter ns1in6 {} | ||
3717 | + counter ns2in6 {} | ||
3718 | + | ||
3719 | + counter ns0out6 {} | ||
3720 | + counter ns1out6 {} | ||
3721 | + counter ns2out6 {} | ||
3722 | + | ||
3723 | + map nsincounter { | ||
3724 | + type ipv4_addr : counter | ||
3725 | + elements = { 10.0.1.1 : "ns0in", | ||
3726 | + 10.0.2.1 : "ns0in", | ||
3727 | + 10.0.1.99 : "ns1in", | ||
3728 | + 10.0.2.99 : "ns2in" } | ||
3729 | + } | ||
3730 | + | ||
3731 | + map nsincounter6 { | ||
3732 | + type ipv6_addr : counter | ||
3733 | + elements = { dead:1::1 : "ns0in6", | ||
3734 | + dead:2::1 : "ns0in6", | ||
3735 | + dead:1::99 : "ns1in6", | ||
3736 | + dead:2::99 : "ns2in6" } | ||
3737 | + } | ||
3738 | + | ||
3739 | + map nsoutcounter { | ||
3740 | + type ipv4_addr : counter | ||
3741 | + elements = { 10.0.1.1 : "ns0out", | ||
3742 | + 10.0.2.1 : "ns0out", | ||
3743 | + 10.0.1.99: "ns1out", | ||
3744 | + 10.0.2.99: "ns2out" } | ||
3745 | + } | ||
3746 | + | ||
3747 | + map nsoutcounter6 { | ||
3748 | + type ipv6_addr : counter | ||
3749 | + elements = { dead:1::1 : "ns0out6", | ||
3750 | + dead:2::1 : "ns0out6", | ||
3751 | + dead:1::99 : "ns1out6", | ||
3752 | + dead:2::99 : "ns2out6" } | ||
3753 | + } | ||
3754 | + | ||
3755 | + chain input { | ||
3756 | + type filter hook input priority 0; policy accept; | ||
3757 | + counter name ip saddr map @nsincounter | ||
3758 | + icmpv6 type { "echo-request", "echo-reply" } counter name ip6 saddr map @nsincounter6 | ||
3759 | + } | ||
3760 | + chain output { | ||
3761 | + type filter hook output priority 0; policy accept; | ||
3762 | + counter name ip daddr map @nsoutcounter | ||
3763 | + icmpv6 type { "echo-request", "echo-reply" } counter name ip6 daddr map @nsoutcounter6 | ||
3764 | + } | ||
3765 | +} | ||
3766 | +EOF | ||
3767 | +done | ||
3768 | + | ||
3769 | +sleep 3 | ||
3770 | +# test basic connectivity | ||
3771 | +for i in 1 2; do | ||
3772 | + ip netns exec ns0 ping -c 1 -q 10.0.$i.99 > /dev/null | ||
3773 | + if [ $? -ne 0 ];then | ||
3774 | + echo "ERROR: Could not reach other namespace(s)" 1>&2 | ||
3775 | + ret=1 | ||
3776 | + fi | ||
3777 | + | ||
3778 | + ip netns exec ns0 ping -c 1 -q dead:$i::99 > /dev/null | ||
3779 | + if [ $? -ne 0 ];then | ||
3780 | + echo "ERROR: Could not reach other namespace(s) via ipv6" 1>&2 | ||
3781 | + ret=1 | ||
3782 | + fi | ||
3783 | + check_counters ns$i | ||
3784 | + if [ $? -ne 0 ]; then | ||
3785 | + ret=1 | ||
3786 | + fi | ||
3787 | + | ||
3788 | + check_ns0_counters ns$i | ||
3789 | + if [ $? -ne 0 ]; then | ||
3790 | + ret=1 | ||
3791 | + fi | ||
3792 | + reset_counters | ||
3793 | +done | ||
3794 | + | ||
3795 | +if [ $ret -eq 0 ];then | ||
3796 | + echo "PASS: netns routing/connectivity: ns0 can reach ns1 and ns2" | ||
3797 | +fi | ||
3798 | + | ||
3799 | +reset_counters | ||
3800 | +test_local_dnat | ||
3801 | +test_local_dnat6 | ||
3802 | + | ||
3803 | +reset_counters | ||
3804 | +test_masquerade | ||
3805 | +test_masquerade6 | ||
3806 | + | ||
3807 | +reset_counters | ||
3808 | +test_redirect | ||
3809 | +test_redirect6 | ||
3810 | + | ||
3811 | +for i in 0 1 2; do ip netns del ns$i;done | ||
3812 | + | ||
3813 | +exit $ret |