Annotation of /trunk/kernel-alx/patches-4.14/0106-4.14.7-all-fixes.patch
Parent Directory | Revision Log
Revision 3238 -
(hide annotations)
(download)
Fri Nov 9 12:14:58 2018 UTC (5 years, 10 months ago) by niro
File size: 79208 byte(s)
Fri Nov 9 12:14:58 2018 UTC (5 years, 10 months ago) by niro
File size: 79208 byte(s)
-added up to patches-4.14.79
1 | niro | 3238 | diff --git a/Makefile b/Makefile |
2 | index eabbd7748a24..39d7af0165a8 100644 | ||
3 | --- a/Makefile | ||
4 | +++ b/Makefile | ||
5 | @@ -1,7 +1,7 @@ | ||
6 | # SPDX-License-Identifier: GPL-2.0 | ||
7 | VERSION = 4 | ||
8 | PATCHLEVEL = 14 | ||
9 | -SUBLEVEL = 6 | ||
10 | +SUBLEVEL = 7 | ||
11 | EXTRAVERSION = | ||
12 | NAME = Petit Gorille | ||
13 | |||
14 | @@ -373,9 +373,6 @@ LDFLAGS_MODULE = | ||
15 | CFLAGS_KERNEL = | ||
16 | AFLAGS_KERNEL = | ||
17 | LDFLAGS_vmlinux = | ||
18 | -CFLAGS_GCOV := -fprofile-arcs -ftest-coverage -fno-tree-loop-im $(call cc-disable-warning,maybe-uninitialized,) | ||
19 | -CFLAGS_KCOV := $(call cc-option,-fsanitize-coverage=trace-pc,) | ||
20 | - | ||
21 | |||
22 | # Use USERINCLUDE when you must reference the UAPI directories only. | ||
23 | USERINCLUDE := \ | ||
24 | @@ -394,21 +391,19 @@ LINUXINCLUDE := \ | ||
25 | -I$(objtree)/include \ | ||
26 | $(USERINCLUDE) | ||
27 | |||
28 | -KBUILD_CPPFLAGS := -D__KERNEL__ | ||
29 | - | ||
30 | +KBUILD_AFLAGS := -D__ASSEMBLY__ | ||
31 | KBUILD_CFLAGS := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \ | ||
32 | -fno-strict-aliasing -fno-common -fshort-wchar \ | ||
33 | -Werror-implicit-function-declaration \ | ||
34 | -Wno-format-security \ | ||
35 | - -std=gnu89 $(call cc-option,-fno-PIE) | ||
36 | - | ||
37 | - | ||
38 | + -std=gnu89 | ||
39 | +KBUILD_CPPFLAGS := -D__KERNEL__ | ||
40 | KBUILD_AFLAGS_KERNEL := | ||
41 | KBUILD_CFLAGS_KERNEL := | ||
42 | -KBUILD_AFLAGS := -D__ASSEMBLY__ $(call cc-option,-fno-PIE) | ||
43 | KBUILD_AFLAGS_MODULE := -DMODULE | ||
44 | KBUILD_CFLAGS_MODULE := -DMODULE | ||
45 | KBUILD_LDFLAGS_MODULE := -T $(srctree)/scripts/module-common.lds | ||
46 | +GCC_PLUGINS_CFLAGS := | ||
47 | |||
48 | # Read KERNELRELEASE from include/config/kernel.release (if it exists) | ||
49 | KERNELRELEASE = $(shell cat include/config/kernel.release 2> /dev/null) | ||
50 | @@ -421,7 +416,7 @@ export MAKE AWK GENKSYMS INSTALLKERNEL PERL PYTHON UTS_MACHINE | ||
51 | export HOSTCXX HOSTCXXFLAGS LDFLAGS_MODULE CHECK CHECKFLAGS | ||
52 | |||
53 | export KBUILD_CPPFLAGS NOSTDINC_FLAGS LINUXINCLUDE OBJCOPYFLAGS LDFLAGS | ||
54 | -export KBUILD_CFLAGS CFLAGS_KERNEL CFLAGS_MODULE CFLAGS_GCOV CFLAGS_KCOV CFLAGS_KASAN CFLAGS_UBSAN | ||
55 | +export KBUILD_CFLAGS CFLAGS_KERNEL CFLAGS_MODULE CFLAGS_KASAN CFLAGS_UBSAN | ||
56 | export KBUILD_AFLAGS AFLAGS_KERNEL AFLAGS_MODULE | ||
57 | export KBUILD_AFLAGS_MODULE KBUILD_CFLAGS_MODULE KBUILD_LDFLAGS_MODULE | ||
58 | export KBUILD_AFLAGS_KERNEL KBUILD_CFLAGS_KERNEL | ||
59 | @@ -622,6 +617,12 @@ endif | ||
60 | # Defaults to vmlinux, but the arch makefile usually adds further targets | ||
61 | all: vmlinux | ||
62 | |||
63 | +KBUILD_CFLAGS += $(call cc-option,-fno-PIE) | ||
64 | +KBUILD_AFLAGS += $(call cc-option,-fno-PIE) | ||
65 | +CFLAGS_GCOV := -fprofile-arcs -ftest-coverage -fno-tree-loop-im $(call cc-disable-warning,maybe-uninitialized,) | ||
66 | +CFLAGS_KCOV := $(call cc-option,-fsanitize-coverage=trace-pc,) | ||
67 | +export CFLAGS_GCOV CFLAGS_KCOV | ||
68 | + | ||
69 | # The arch Makefile can set ARCH_{CPP,A,C}FLAGS to override the default | ||
70 | # values of the respective KBUILD_* variables | ||
71 | ARCH_CPPFLAGS := | ||
72 | diff --git a/arch/arm64/include/asm/compat.h b/arch/arm64/include/asm/compat.h | ||
73 | index e39d487bf724..a3c7f271ad4c 100644 | ||
74 | --- a/arch/arm64/include/asm/compat.h | ||
75 | +++ b/arch/arm64/include/asm/compat.h | ||
76 | @@ -215,7 +215,6 @@ typedef struct compat_siginfo { | ||
77 | } compat_siginfo_t; | ||
78 | |||
79 | #define COMPAT_OFF_T_MAX 0x7fffffff | ||
80 | -#define COMPAT_LOFF_T_MAX 0x7fffffffffffffffL | ||
81 | |||
82 | /* | ||
83 | * A pointer passed in from user mode. This should not | ||
84 | diff --git a/arch/mips/include/asm/compat.h b/arch/mips/include/asm/compat.h | ||
85 | index 8e2b5b556488..49691331ada4 100644 | ||
86 | --- a/arch/mips/include/asm/compat.h | ||
87 | +++ b/arch/mips/include/asm/compat.h | ||
88 | @@ -200,7 +200,6 @@ typedef struct compat_siginfo { | ||
89 | } compat_siginfo_t; | ||
90 | |||
91 | #define COMPAT_OFF_T_MAX 0x7fffffff | ||
92 | -#define COMPAT_LOFF_T_MAX 0x7fffffffffffffffL | ||
93 | |||
94 | /* | ||
95 | * A pointer passed in from user mode. This should not | ||
96 | diff --git a/arch/parisc/include/asm/compat.h b/arch/parisc/include/asm/compat.h | ||
97 | index 07f48827afda..acf8aa07cbe0 100644 | ||
98 | --- a/arch/parisc/include/asm/compat.h | ||
99 | +++ b/arch/parisc/include/asm/compat.h | ||
100 | @@ -195,7 +195,6 @@ typedef struct compat_siginfo { | ||
101 | } compat_siginfo_t; | ||
102 | |||
103 | #define COMPAT_OFF_T_MAX 0x7fffffff | ||
104 | -#define COMPAT_LOFF_T_MAX 0x7fffffffffffffffL | ||
105 | |||
106 | struct compat_ipc64_perm { | ||
107 | compat_key_t key; | ||
108 | diff --git a/arch/powerpc/include/asm/compat.h b/arch/powerpc/include/asm/compat.h | ||
109 | index a035b1e5dfa7..8a2aecfe9b02 100644 | ||
110 | --- a/arch/powerpc/include/asm/compat.h | ||
111 | +++ b/arch/powerpc/include/asm/compat.h | ||
112 | @@ -185,7 +185,6 @@ typedef struct compat_siginfo { | ||
113 | } compat_siginfo_t; | ||
114 | |||
115 | #define COMPAT_OFF_T_MAX 0x7fffffff | ||
116 | -#define COMPAT_LOFF_T_MAX 0x7fffffffffffffffL | ||
117 | |||
118 | /* | ||
119 | * A pointer passed in from user mode. This should not | ||
120 | diff --git a/arch/s390/include/asm/compat.h b/arch/s390/include/asm/compat.h | ||
121 | index 1b60eb3676d5..5e6a63641a5f 100644 | ||
122 | --- a/arch/s390/include/asm/compat.h | ||
123 | +++ b/arch/s390/include/asm/compat.h | ||
124 | @@ -263,7 +263,6 @@ typedef struct compat_siginfo { | ||
125 | #define si_overrun _sifields._timer._overrun | ||
126 | |||
127 | #define COMPAT_OFF_T_MAX 0x7fffffff | ||
128 | -#define COMPAT_LOFF_T_MAX 0x7fffffffffffffffL | ||
129 | |||
130 | /* | ||
131 | * A pointer passed in from user mode. This should not | ||
132 | diff --git a/arch/sparc/include/asm/compat.h b/arch/sparc/include/asm/compat.h | ||
133 | index 977c3f280ba1..fa38c78de0f0 100644 | ||
134 | --- a/arch/sparc/include/asm/compat.h | ||
135 | +++ b/arch/sparc/include/asm/compat.h | ||
136 | @@ -209,7 +209,6 @@ typedef struct compat_siginfo { | ||
137 | } compat_siginfo_t; | ||
138 | |||
139 | #define COMPAT_OFF_T_MAX 0x7fffffff | ||
140 | -#define COMPAT_LOFF_T_MAX 0x7fffffffffffffffL | ||
141 | |||
142 | /* | ||
143 | * A pointer passed in from user mode. This should not | ||
144 | diff --git a/arch/tile/include/asm/compat.h b/arch/tile/include/asm/compat.h | ||
145 | index c14e36f008c8..62a7b83025dd 100644 | ||
146 | --- a/arch/tile/include/asm/compat.h | ||
147 | +++ b/arch/tile/include/asm/compat.h | ||
148 | @@ -173,7 +173,6 @@ typedef struct compat_siginfo { | ||
149 | } compat_siginfo_t; | ||
150 | |||
151 | #define COMPAT_OFF_T_MAX 0x7fffffff | ||
152 | -#define COMPAT_LOFF_T_MAX 0x7fffffffffffffffL | ||
153 | |||
154 | struct compat_ipc64_perm { | ||
155 | compat_key_t key; | ||
156 | diff --git a/arch/x86/include/asm/compat.h b/arch/x86/include/asm/compat.h | ||
157 | index 9eef9cc64c68..70bc1df580b2 100644 | ||
158 | --- a/arch/x86/include/asm/compat.h | ||
159 | +++ b/arch/x86/include/asm/compat.h | ||
160 | @@ -209,7 +209,6 @@ typedef struct compat_siginfo { | ||
161 | } compat_siginfo_t; | ||
162 | |||
163 | #define COMPAT_OFF_T_MAX 0x7fffffff | ||
164 | -#define COMPAT_LOFF_T_MAX 0x7fffffffffffffffL | ||
165 | |||
166 | struct compat_ipc64_perm { | ||
167 | compat_key_t key; | ||
168 | diff --git a/arch/x86/kernel/cpu/intel_rdt_rdtgroup.c b/arch/x86/kernel/cpu/intel_rdt_rdtgroup.c | ||
169 | index 3d433af856a5..7be35b600299 100644 | ||
170 | --- a/arch/x86/kernel/cpu/intel_rdt_rdtgroup.c | ||
171 | +++ b/arch/x86/kernel/cpu/intel_rdt_rdtgroup.c | ||
172 | @@ -1297,9 +1297,7 @@ static void rmdir_all_sub(void) | ||
173 | kfree(rdtgrp); | ||
174 | } | ||
175 | /* Notify online CPUs to update per cpu storage and PQR_ASSOC MSR */ | ||
176 | - get_online_cpus(); | ||
177 | update_closid_rmid(cpu_online_mask, &rdtgroup_default); | ||
178 | - put_online_cpus(); | ||
179 | |||
180 | kernfs_remove(kn_info); | ||
181 | kernfs_remove(kn_mongrp); | ||
182 | @@ -1310,6 +1308,7 @@ static void rdt_kill_sb(struct super_block *sb) | ||
183 | { | ||
184 | struct rdt_resource *r; | ||
185 | |||
186 | + cpus_read_lock(); | ||
187 | mutex_lock(&rdtgroup_mutex); | ||
188 | |||
189 | /*Put everything back to default values. */ | ||
190 | @@ -1317,11 +1316,12 @@ static void rdt_kill_sb(struct super_block *sb) | ||
191 | reset_all_ctrls(r); | ||
192 | cdp_disable(); | ||
193 | rmdir_all_sub(); | ||
194 | - static_branch_disable(&rdt_alloc_enable_key); | ||
195 | - static_branch_disable(&rdt_mon_enable_key); | ||
196 | - static_branch_disable(&rdt_enable_key); | ||
197 | + static_branch_disable_cpuslocked(&rdt_alloc_enable_key); | ||
198 | + static_branch_disable_cpuslocked(&rdt_mon_enable_key); | ||
199 | + static_branch_disable_cpuslocked(&rdt_enable_key); | ||
200 | kernfs_kill_sb(sb); | ||
201 | mutex_unlock(&rdtgroup_mutex); | ||
202 | + cpus_read_unlock(); | ||
203 | } | ||
204 | |||
205 | static struct file_system_type rdt_fs_type = { | ||
206 | diff --git a/block/blk-core.c b/block/blk-core.c | ||
207 | index 516ce3174683..7b30bf10b1d4 100644 | ||
208 | --- a/block/blk-core.c | ||
209 | +++ b/block/blk-core.c | ||
210 | @@ -339,6 +339,7 @@ void blk_sync_queue(struct request_queue *q) | ||
211 | struct blk_mq_hw_ctx *hctx; | ||
212 | int i; | ||
213 | |||
214 | + cancel_delayed_work_sync(&q->requeue_work); | ||
215 | queue_for_each_hw_ctx(q, hctx, i) | ||
216 | cancel_delayed_work_sync(&hctx->run_work); | ||
217 | } else { | ||
218 | diff --git a/drivers/char/ipmi/ipmi_si_intf.c b/drivers/char/ipmi/ipmi_si_intf.c | ||
219 | index bc3984ffe867..c04aa11f0e21 100644 | ||
220 | --- a/drivers/char/ipmi/ipmi_si_intf.c | ||
221 | +++ b/drivers/char/ipmi/ipmi_si_intf.c | ||
222 | @@ -242,6 +242,9 @@ struct smi_info { | ||
223 | /* The timer for this si. */ | ||
224 | struct timer_list si_timer; | ||
225 | |||
226 | + /* This flag is set, if the timer can be set */ | ||
227 | + bool timer_can_start; | ||
228 | + | ||
229 | /* This flag is set, if the timer is running (timer_pending() isn't enough) */ | ||
230 | bool timer_running; | ||
231 | |||
232 | @@ -417,6 +420,8 @@ static enum si_sm_result start_next_msg(struct smi_info *smi_info) | ||
233 | |||
234 | static void smi_mod_timer(struct smi_info *smi_info, unsigned long new_val) | ||
235 | { | ||
236 | + if (!smi_info->timer_can_start) | ||
237 | + return; | ||
238 | smi_info->last_timeout_jiffies = jiffies; | ||
239 | mod_timer(&smi_info->si_timer, new_val); | ||
240 | smi_info->timer_running = true; | ||
241 | @@ -436,21 +441,18 @@ static void start_new_msg(struct smi_info *smi_info, unsigned char *msg, | ||
242 | smi_info->handlers->start_transaction(smi_info->si_sm, msg, size); | ||
243 | } | ||
244 | |||
245 | -static void start_check_enables(struct smi_info *smi_info, bool start_timer) | ||
246 | +static void start_check_enables(struct smi_info *smi_info) | ||
247 | { | ||
248 | unsigned char msg[2]; | ||
249 | |||
250 | msg[0] = (IPMI_NETFN_APP_REQUEST << 2); | ||
251 | msg[1] = IPMI_GET_BMC_GLOBAL_ENABLES_CMD; | ||
252 | |||
253 | - if (start_timer) | ||
254 | - start_new_msg(smi_info, msg, 2); | ||
255 | - else | ||
256 | - smi_info->handlers->start_transaction(smi_info->si_sm, msg, 2); | ||
257 | + start_new_msg(smi_info, msg, 2); | ||
258 | smi_info->si_state = SI_CHECKING_ENABLES; | ||
259 | } | ||
260 | |||
261 | -static void start_clear_flags(struct smi_info *smi_info, bool start_timer) | ||
262 | +static void start_clear_flags(struct smi_info *smi_info) | ||
263 | { | ||
264 | unsigned char msg[3]; | ||
265 | |||
266 | @@ -459,10 +461,7 @@ static void start_clear_flags(struct smi_info *smi_info, bool start_timer) | ||
267 | msg[1] = IPMI_CLEAR_MSG_FLAGS_CMD; | ||
268 | msg[2] = WDT_PRE_TIMEOUT_INT; | ||
269 | |||
270 | - if (start_timer) | ||
271 | - start_new_msg(smi_info, msg, 3); | ||
272 | - else | ||
273 | - smi_info->handlers->start_transaction(smi_info->si_sm, msg, 3); | ||
274 | + start_new_msg(smi_info, msg, 3); | ||
275 | smi_info->si_state = SI_CLEARING_FLAGS; | ||
276 | } | ||
277 | |||
278 | @@ -497,11 +496,11 @@ static void start_getting_events(struct smi_info *smi_info) | ||
279 | * Note that we cannot just use disable_irq(), since the interrupt may | ||
280 | * be shared. | ||
281 | */ | ||
282 | -static inline bool disable_si_irq(struct smi_info *smi_info, bool start_timer) | ||
283 | +static inline bool disable_si_irq(struct smi_info *smi_info) | ||
284 | { | ||
285 | if ((smi_info->irq) && (!smi_info->interrupt_disabled)) { | ||
286 | smi_info->interrupt_disabled = true; | ||
287 | - start_check_enables(smi_info, start_timer); | ||
288 | + start_check_enables(smi_info); | ||
289 | return true; | ||
290 | } | ||
291 | return false; | ||
292 | @@ -511,7 +510,7 @@ static inline bool enable_si_irq(struct smi_info *smi_info) | ||
293 | { | ||
294 | if ((smi_info->irq) && (smi_info->interrupt_disabled)) { | ||
295 | smi_info->interrupt_disabled = false; | ||
296 | - start_check_enables(smi_info, true); | ||
297 | + start_check_enables(smi_info); | ||
298 | return true; | ||
299 | } | ||
300 | return false; | ||
301 | @@ -529,7 +528,7 @@ static struct ipmi_smi_msg *alloc_msg_handle_irq(struct smi_info *smi_info) | ||
302 | |||
303 | msg = ipmi_alloc_smi_msg(); | ||
304 | if (!msg) { | ||
305 | - if (!disable_si_irq(smi_info, true)) | ||
306 | + if (!disable_si_irq(smi_info)) | ||
307 | smi_info->si_state = SI_NORMAL; | ||
308 | } else if (enable_si_irq(smi_info)) { | ||
309 | ipmi_free_smi_msg(msg); | ||
310 | @@ -545,7 +544,7 @@ static void handle_flags(struct smi_info *smi_info) | ||
311 | /* Watchdog pre-timeout */ | ||
312 | smi_inc_stat(smi_info, watchdog_pretimeouts); | ||
313 | |||
314 | - start_clear_flags(smi_info, true); | ||
315 | + start_clear_flags(smi_info); | ||
316 | smi_info->msg_flags &= ~WDT_PRE_TIMEOUT_INT; | ||
317 | if (smi_info->intf) | ||
318 | ipmi_smi_watchdog_pretimeout(smi_info->intf); | ||
319 | @@ -928,7 +927,7 @@ static enum si_sm_result smi_event_handler(struct smi_info *smi_info, | ||
320 | * disable and messages disabled. | ||
321 | */ | ||
322 | if (smi_info->supports_event_msg_buff || smi_info->irq) { | ||
323 | - start_check_enables(smi_info, true); | ||
324 | + start_check_enables(smi_info); | ||
325 | } else { | ||
326 | smi_info->curr_msg = alloc_msg_handle_irq(smi_info); | ||
327 | if (!smi_info->curr_msg) | ||
328 | @@ -1235,6 +1234,7 @@ static int smi_start_processing(void *send_info, | ||
329 | |||
330 | /* Set up the timer that drives the interface. */ | ||
331 | setup_timer(&new_smi->si_timer, smi_timeout, (long)new_smi); | ||
332 | + new_smi->timer_can_start = true; | ||
333 | smi_mod_timer(new_smi, jiffies + SI_TIMEOUT_JIFFIES); | ||
334 | |||
335 | /* Try to claim any interrupts. */ | ||
336 | @@ -3416,10 +3416,12 @@ static void check_for_broken_irqs(struct smi_info *smi_info) | ||
337 | check_set_rcv_irq(smi_info); | ||
338 | } | ||
339 | |||
340 | -static inline void wait_for_timer_and_thread(struct smi_info *smi_info) | ||
341 | +static inline void stop_timer_and_thread(struct smi_info *smi_info) | ||
342 | { | ||
343 | if (smi_info->thread != NULL) | ||
344 | kthread_stop(smi_info->thread); | ||
345 | + | ||
346 | + smi_info->timer_can_start = false; | ||
347 | if (smi_info->timer_running) | ||
348 | del_timer_sync(&smi_info->si_timer); | ||
349 | } | ||
350 | @@ -3605,7 +3607,7 @@ static int try_smi_init(struct smi_info *new_smi) | ||
351 | * Start clearing the flags before we enable interrupts or the | ||
352 | * timer to avoid racing with the timer. | ||
353 | */ | ||
354 | - start_clear_flags(new_smi, false); | ||
355 | + start_clear_flags(new_smi); | ||
356 | |||
357 | /* | ||
358 | * IRQ is defined to be set when non-zero. req_events will | ||
359 | @@ -3674,7 +3676,7 @@ static int try_smi_init(struct smi_info *new_smi) | ||
360 | return 0; | ||
361 | |||
362 | out_err_stop_timer: | ||
363 | - wait_for_timer_and_thread(new_smi); | ||
364 | + stop_timer_and_thread(new_smi); | ||
365 | |||
366 | out_err: | ||
367 | new_smi->interrupt_disabled = true; | ||
368 | @@ -3866,7 +3868,7 @@ static void cleanup_one_si(struct smi_info *to_clean) | ||
369 | */ | ||
370 | if (to_clean->irq_cleanup) | ||
371 | to_clean->irq_cleanup(to_clean); | ||
372 | - wait_for_timer_and_thread(to_clean); | ||
373 | + stop_timer_and_thread(to_clean); | ||
374 | |||
375 | /* | ||
376 | * Timeouts are stopped, now make sure the interrupts are off | ||
377 | @@ -3878,7 +3880,7 @@ static void cleanup_one_si(struct smi_info *to_clean) | ||
378 | schedule_timeout_uninterruptible(1); | ||
379 | } | ||
380 | if (to_clean->handlers) | ||
381 | - disable_si_irq(to_clean, false); | ||
382 | + disable_si_irq(to_clean); | ||
383 | while (to_clean->curr_msg || (to_clean->si_state != SI_NORMAL)) { | ||
384 | poll(to_clean); | ||
385 | schedule_timeout_uninterruptible(1); | ||
386 | diff --git a/drivers/cpuidle/cpuidle-powernv.c b/drivers/cpuidle/cpuidle-powernv.c | ||
387 | index ed6531f075c6..e06605b21841 100644 | ||
388 | --- a/drivers/cpuidle/cpuidle-powernv.c | ||
389 | +++ b/drivers/cpuidle/cpuidle-powernv.c | ||
390 | @@ -384,9 +384,9 @@ static int powernv_add_idle_states(void) | ||
391 | * Firmware passes residency and latency values in ns. | ||
392 | * cpuidle expects it in us. | ||
393 | */ | ||
394 | - exit_latency = latency_ns[i] / 1000; | ||
395 | + exit_latency = DIV_ROUND_UP(latency_ns[i], 1000); | ||
396 | if (!rc) | ||
397 | - target_residency = residency_ns[i] / 1000; | ||
398 | + target_residency = DIV_ROUND_UP(residency_ns[i], 1000); | ||
399 | else | ||
400 | target_residency = 0; | ||
401 | |||
402 | diff --git a/drivers/ide/ide-atapi.c b/drivers/ide/ide-atapi.c | ||
403 | index 14d1e7d9a1d6..0e6bc631a1ca 100644 | ||
404 | --- a/drivers/ide/ide-atapi.c | ||
405 | +++ b/drivers/ide/ide-atapi.c | ||
406 | @@ -282,7 +282,7 @@ int ide_cd_expiry(ide_drive_t *drive) | ||
407 | struct request *rq = drive->hwif->rq; | ||
408 | unsigned long wait = 0; | ||
409 | |||
410 | - debug_log("%s: rq->cmd[0]: 0x%x\n", __func__, rq->cmd[0]); | ||
411 | + debug_log("%s: scsi_req(rq)->cmd[0]: 0x%x\n", __func__, scsi_req(rq)->cmd[0]); | ||
412 | |||
413 | /* | ||
414 | * Some commands are *slow* and normally take a long time to complete. | ||
415 | @@ -463,7 +463,7 @@ static ide_startstop_t ide_pc_intr(ide_drive_t *drive) | ||
416 | return ide_do_reset(drive); | ||
417 | } | ||
418 | |||
419 | - debug_log("[cmd %x]: check condition\n", rq->cmd[0]); | ||
420 | + debug_log("[cmd %x]: check condition\n", scsi_req(rq)->cmd[0]); | ||
421 | |||
422 | /* Retry operation */ | ||
423 | ide_retry_pc(drive); | ||
424 | @@ -531,7 +531,7 @@ static ide_startstop_t ide_pc_intr(ide_drive_t *drive) | ||
425 | ide_pad_transfer(drive, write, bcount); | ||
426 | |||
427 | debug_log("[cmd %x] transferred %d bytes, padded %d bytes, resid: %u\n", | ||
428 | - rq->cmd[0], done, bcount, scsi_req(rq)->resid_len); | ||
429 | + scsi_req(rq)->cmd[0], done, bcount, scsi_req(rq)->resid_len); | ||
430 | |||
431 | /* And set the interrupt handler again */ | ||
432 | ide_set_handler(drive, ide_pc_intr, timeout); | ||
433 | diff --git a/drivers/infiniband/hw/cxgb4/t4fw_ri_api.h b/drivers/infiniband/hw/cxgb4/t4fw_ri_api.h | ||
434 | index 010c709ba3bb..58c531db4f4a 100644 | ||
435 | --- a/drivers/infiniband/hw/cxgb4/t4fw_ri_api.h | ||
436 | +++ b/drivers/infiniband/hw/cxgb4/t4fw_ri_api.h | ||
437 | @@ -675,8 +675,8 @@ struct fw_ri_fr_nsmr_tpte_wr { | ||
438 | __u16 wrid; | ||
439 | __u8 r1[3]; | ||
440 | __u8 len16; | ||
441 | - __u32 r2; | ||
442 | - __u32 stag; | ||
443 | + __be32 r2; | ||
444 | + __be32 stag; | ||
445 | struct fw_ri_tpte tpte; | ||
446 | __u64 pbl[2]; | ||
447 | }; | ||
448 | diff --git a/drivers/md/bitmap.c b/drivers/md/bitmap.c | ||
449 | index f425905c97fa..0cabf31fb163 100644 | ||
450 | --- a/drivers/md/bitmap.c | ||
451 | +++ b/drivers/md/bitmap.c | ||
452 | @@ -2158,6 +2158,7 @@ int bitmap_resize(struct bitmap *bitmap, sector_t blocks, | ||
453 | for (k = 0; k < page; k++) { | ||
454 | kfree(new_bp[k].map); | ||
455 | } | ||
456 | + kfree(new_bp); | ||
457 | |||
458 | /* restore some fields from old_counts */ | ||
459 | bitmap->counts.bp = old_counts.bp; | ||
460 | @@ -2208,6 +2209,14 @@ int bitmap_resize(struct bitmap *bitmap, sector_t blocks, | ||
461 | block += old_blocks; | ||
462 | } | ||
463 | |||
464 | + if (bitmap->counts.bp != old_counts.bp) { | ||
465 | + unsigned long k; | ||
466 | + for (k = 0; k < old_counts.pages; k++) | ||
467 | + if (!old_counts.bp[k].hijacked) | ||
468 | + kfree(old_counts.bp[k].map); | ||
469 | + kfree(old_counts.bp); | ||
470 | + } | ||
471 | + | ||
472 | if (!init) { | ||
473 | int i; | ||
474 | while (block < (chunks << chunkshift)) { | ||
475 | diff --git a/drivers/md/dm-raid.c b/drivers/md/dm-raid.c | ||
476 | index 2245d06d2045..a25eebd98996 100644 | ||
477 | --- a/drivers/md/dm-raid.c | ||
478 | +++ b/drivers/md/dm-raid.c | ||
479 | @@ -2143,13 +2143,6 @@ static int super_load(struct md_rdev *rdev, struct md_rdev *refdev) | ||
480 | struct dm_raid_superblock *refsb; | ||
481 | uint64_t events_sb, events_refsb; | ||
482 | |||
483 | - rdev->sb_start = 0; | ||
484 | - rdev->sb_size = bdev_logical_block_size(rdev->meta_bdev); | ||
485 | - if (rdev->sb_size < sizeof(*sb) || rdev->sb_size > PAGE_SIZE) { | ||
486 | - DMERR("superblock size of a logical block is no longer valid"); | ||
487 | - return -EINVAL; | ||
488 | - } | ||
489 | - | ||
490 | r = read_disk_sb(rdev, rdev->sb_size, false); | ||
491 | if (r) | ||
492 | return r; | ||
493 | @@ -2494,6 +2487,17 @@ static int analyse_superblocks(struct dm_target *ti, struct raid_set *rs) | ||
494 | if (test_bit(Journal, &rdev->flags)) | ||
495 | continue; | ||
496 | |||
497 | + if (!rdev->meta_bdev) | ||
498 | + continue; | ||
499 | + | ||
500 | + /* Set superblock offset/size for metadata device. */ | ||
501 | + rdev->sb_start = 0; | ||
502 | + rdev->sb_size = bdev_logical_block_size(rdev->meta_bdev); | ||
503 | + if (rdev->sb_size < sizeof(struct dm_raid_superblock) || rdev->sb_size > PAGE_SIZE) { | ||
504 | + DMERR("superblock size of a logical block is no longer valid"); | ||
505 | + return -EINVAL; | ||
506 | + } | ||
507 | + | ||
508 | /* | ||
509 | * Skipping super_load due to CTR_FLAG_SYNC will cause | ||
510 | * the array to undergo initialization again as | ||
511 | @@ -2506,9 +2510,6 @@ static int analyse_superblocks(struct dm_target *ti, struct raid_set *rs) | ||
512 | if (test_bit(__CTR_FLAG_SYNC, &rs->ctr_flags)) | ||
513 | continue; | ||
514 | |||
515 | - if (!rdev->meta_bdev) | ||
516 | - continue; | ||
517 | - | ||
518 | r = super_load(rdev, freshest); | ||
519 | |||
520 | switch (r) { | ||
521 | diff --git a/drivers/media/dvb-core/dvb_frontend.c b/drivers/media/dvb-core/dvb_frontend.c | ||
522 | index 9139d01ba7ed..33d844fe2e70 100644 | ||
523 | --- a/drivers/media/dvb-core/dvb_frontend.c | ||
524 | +++ b/drivers/media/dvb-core/dvb_frontend.c | ||
525 | @@ -145,15 +145,13 @@ static void __dvb_frontend_free(struct dvb_frontend *fe) | ||
526 | { | ||
527 | struct dvb_frontend_private *fepriv = fe->frontend_priv; | ||
528 | |||
529 | - if (!fepriv) | ||
530 | - return; | ||
531 | - | ||
532 | - dvb_free_device(fepriv->dvbdev); | ||
533 | + if (fepriv) | ||
534 | + dvb_free_device(fepriv->dvbdev); | ||
535 | |||
536 | dvb_frontend_invoke_release(fe, fe->ops.release); | ||
537 | |||
538 | - kfree(fepriv); | ||
539 | - fe->frontend_priv = NULL; | ||
540 | + if (fepriv) | ||
541 | + kfree(fepriv); | ||
542 | } | ||
543 | |||
544 | static void dvb_frontend_free(struct kref *ref) | ||
545 | diff --git a/drivers/net/ethernet/cavium/thunder/nicvf_queues.c b/drivers/net/ethernet/cavium/thunder/nicvf_queues.c | ||
546 | index d4496e9afcdf..a3d12dbde95b 100644 | ||
547 | --- a/drivers/net/ethernet/cavium/thunder/nicvf_queues.c | ||
548 | +++ b/drivers/net/ethernet/cavium/thunder/nicvf_queues.c | ||
549 | @@ -1355,7 +1355,8 @@ nicvf_sq_add_hdr_subdesc(struct nicvf *nic, struct snd_queue *sq, int qentry, | ||
550 | |||
551 | /* Offload checksum calculation to HW */ | ||
552 | if (skb->ip_summed == CHECKSUM_PARTIAL) { | ||
553 | - hdr->csum_l3 = 1; /* Enable IP csum calculation */ | ||
554 | + if (ip.v4->version == 4) | ||
555 | + hdr->csum_l3 = 1; /* Enable IP csum calculation */ | ||
556 | hdr->l3_offset = skb_network_offset(skb); | ||
557 | hdr->l4_offset = skb_transport_offset(skb); | ||
558 | |||
559 | diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c | ||
560 | index a3c949ea7d1a..9541465e43e9 100644 | ||
561 | --- a/drivers/net/ethernet/realtek/r8169.c | ||
562 | +++ b/drivers/net/ethernet/realtek/r8169.c | ||
563 | @@ -2025,21 +2025,6 @@ static int rtl8169_set_speed(struct net_device *dev, | ||
564 | return ret; | ||
565 | } | ||
566 | |||
567 | -static int rtl8169_set_settings(struct net_device *dev, struct ethtool_cmd *cmd) | ||
568 | -{ | ||
569 | - struct rtl8169_private *tp = netdev_priv(dev); | ||
570 | - int ret; | ||
571 | - | ||
572 | - del_timer_sync(&tp->timer); | ||
573 | - | ||
574 | - rtl_lock_work(tp); | ||
575 | - ret = rtl8169_set_speed(dev, cmd->autoneg, ethtool_cmd_speed(cmd), | ||
576 | - cmd->duplex, cmd->advertising); | ||
577 | - rtl_unlock_work(tp); | ||
578 | - | ||
579 | - return ret; | ||
580 | -} | ||
581 | - | ||
582 | static netdev_features_t rtl8169_fix_features(struct net_device *dev, | ||
583 | netdev_features_t features) | ||
584 | { | ||
585 | @@ -2166,6 +2151,27 @@ static int rtl8169_get_link_ksettings(struct net_device *dev, | ||
586 | return rc; | ||
587 | } | ||
588 | |||
589 | +static int rtl8169_set_link_ksettings(struct net_device *dev, | ||
590 | + const struct ethtool_link_ksettings *cmd) | ||
591 | +{ | ||
592 | + struct rtl8169_private *tp = netdev_priv(dev); | ||
593 | + int rc; | ||
594 | + u32 advertising; | ||
595 | + | ||
596 | + if (!ethtool_convert_link_mode_to_legacy_u32(&advertising, | ||
597 | + cmd->link_modes.advertising)) | ||
598 | + return -EINVAL; | ||
599 | + | ||
600 | + del_timer_sync(&tp->timer); | ||
601 | + | ||
602 | + rtl_lock_work(tp); | ||
603 | + rc = rtl8169_set_speed(dev, cmd->base.autoneg, cmd->base.speed, | ||
604 | + cmd->base.duplex, advertising); | ||
605 | + rtl_unlock_work(tp); | ||
606 | + | ||
607 | + return rc; | ||
608 | +} | ||
609 | + | ||
610 | static void rtl8169_get_regs(struct net_device *dev, struct ethtool_regs *regs, | ||
611 | void *p) | ||
612 | { | ||
613 | @@ -2367,7 +2373,6 @@ static const struct ethtool_ops rtl8169_ethtool_ops = { | ||
614 | .get_drvinfo = rtl8169_get_drvinfo, | ||
615 | .get_regs_len = rtl8169_get_regs_len, | ||
616 | .get_link = ethtool_op_get_link, | ||
617 | - .set_settings = rtl8169_set_settings, | ||
618 | .get_msglevel = rtl8169_get_msglevel, | ||
619 | .set_msglevel = rtl8169_set_msglevel, | ||
620 | .get_regs = rtl8169_get_regs, | ||
621 | @@ -2379,6 +2384,7 @@ static const struct ethtool_ops rtl8169_ethtool_ops = { | ||
622 | .get_ts_info = ethtool_op_get_ts_info, | ||
623 | .nway_reset = rtl8169_nway_reset, | ||
624 | .get_link_ksettings = rtl8169_get_link_ksettings, | ||
625 | + .set_link_ksettings = rtl8169_set_link_ksettings, | ||
626 | }; | ||
627 | |||
628 | static void rtl8169_get_mac_version(struct rtl8169_private *tp, | ||
629 | diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | ||
630 | index 16bd50929084..28c4d6fa096c 100644 | ||
631 | --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | ||
632 | +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | ||
633 | @@ -2564,6 +2564,7 @@ static int stmmac_open(struct net_device *dev) | ||
634 | |||
635 | priv->dma_buf_sz = STMMAC_ALIGN(buf_sz); | ||
636 | priv->rx_copybreak = STMMAC_RX_COPYBREAK; | ||
637 | + priv->mss = 0; | ||
638 | |||
639 | ret = alloc_dma_desc_resources(priv); | ||
640 | if (ret < 0) { | ||
641 | diff --git a/drivers/net/ipvlan/ipvlan_core.c b/drivers/net/ipvlan/ipvlan_core.c | ||
642 | index 1f3295e274d0..8feb84fd4ca7 100644 | ||
643 | --- a/drivers/net/ipvlan/ipvlan_core.c | ||
644 | +++ b/drivers/net/ipvlan/ipvlan_core.c | ||
645 | @@ -409,7 +409,7 @@ static int ipvlan_process_v6_outbound(struct sk_buff *skb) | ||
646 | struct dst_entry *dst; | ||
647 | int err, ret = NET_XMIT_DROP; | ||
648 | struct flowi6 fl6 = { | ||
649 | - .flowi6_iif = dev->ifindex, | ||
650 | + .flowi6_oif = dev->ifindex, | ||
651 | .daddr = ip6h->daddr, | ||
652 | .saddr = ip6h->saddr, | ||
653 | .flowi6_flags = FLOWI_FLAG_ANYSRC, | ||
654 | diff --git a/drivers/net/tap.c b/drivers/net/tap.c | ||
655 | index 6c0c84c33e1f..bfd4ded0a53f 100644 | ||
656 | --- a/drivers/net/tap.c | ||
657 | +++ b/drivers/net/tap.c | ||
658 | @@ -829,8 +829,11 @@ static ssize_t tap_do_read(struct tap_queue *q, | ||
659 | DEFINE_WAIT(wait); | ||
660 | ssize_t ret = 0; | ||
661 | |||
662 | - if (!iov_iter_count(to)) | ||
663 | + if (!iov_iter_count(to)) { | ||
664 | + if (skb) | ||
665 | + kfree_skb(skb); | ||
666 | return 0; | ||
667 | + } | ||
668 | |||
669 | if (skb) | ||
670 | goto put; | ||
671 | @@ -1077,7 +1080,7 @@ static long tap_ioctl(struct file *file, unsigned int cmd, | ||
672 | case TUNSETOFFLOAD: | ||
673 | /* let the user check for future flags */ | ||
674 | if (arg & ~(TUN_F_CSUM | TUN_F_TSO4 | TUN_F_TSO6 | | ||
675 | - TUN_F_TSO_ECN)) | ||
676 | + TUN_F_TSO_ECN | TUN_F_UFO)) | ||
677 | return -EINVAL; | ||
678 | |||
679 | rtnl_lock(); | ||
680 | @@ -1154,11 +1157,14 @@ static int tap_recvmsg(struct socket *sock, struct msghdr *m, | ||
681 | size_t total_len, int flags) | ||
682 | { | ||
683 | struct tap_queue *q = container_of(sock, struct tap_queue, sock); | ||
684 | + struct sk_buff *skb = m->msg_control; | ||
685 | int ret; | ||
686 | - if (flags & ~(MSG_DONTWAIT|MSG_TRUNC)) | ||
687 | + if (flags & ~(MSG_DONTWAIT|MSG_TRUNC)) { | ||
688 | + if (skb) | ||
689 | + kfree_skb(skb); | ||
690 | return -EINVAL; | ||
691 | - ret = tap_do_read(q, &m->msg_iter, flags & MSG_DONTWAIT, | ||
692 | - m->msg_control); | ||
693 | + } | ||
694 | + ret = tap_do_read(q, &m->msg_iter, flags & MSG_DONTWAIT, skb); | ||
695 | if (ret > total_len) { | ||
696 | m->msg_flags |= MSG_TRUNC; | ||
697 | ret = flags & MSG_TRUNC ? ret : total_len; | ||
698 | diff --git a/drivers/net/tun.c b/drivers/net/tun.c | ||
699 | index 42bb820a56c9..c91b110f2169 100644 | ||
700 | --- a/drivers/net/tun.c | ||
701 | +++ b/drivers/net/tun.c | ||
702 | @@ -1326,6 +1326,7 @@ static struct sk_buff *tun_build_skb(struct tun_struct *tun, | ||
703 | err = xdp_do_redirect(tun->dev, &xdp, xdp_prog); | ||
704 | if (err) | ||
705 | goto err_redirect; | ||
706 | + rcu_read_unlock(); | ||
707 | return NULL; | ||
708 | case XDP_TX: | ||
709 | xdp_xmit = true; | ||
710 | @@ -1358,7 +1359,7 @@ static struct sk_buff *tun_build_skb(struct tun_struct *tun, | ||
711 | if (xdp_xmit) { | ||
712 | skb->dev = tun->dev; | ||
713 | generic_xdp_tx(skb, xdp_prog); | ||
714 | - rcu_read_lock(); | ||
715 | + rcu_read_unlock(); | ||
716 | return NULL; | ||
717 | } | ||
718 | |||
719 | @@ -1734,8 +1735,11 @@ static ssize_t tun_do_read(struct tun_struct *tun, struct tun_file *tfile, | ||
720 | |||
721 | tun_debug(KERN_INFO, tun, "tun_do_read\n"); | ||
722 | |||
723 | - if (!iov_iter_count(to)) | ||
724 | + if (!iov_iter_count(to)) { | ||
725 | + if (skb) | ||
726 | + kfree_skb(skb); | ||
727 | return 0; | ||
728 | + } | ||
729 | |||
730 | if (!skb) { | ||
731 | /* Read frames from ring */ | ||
732 | @@ -1851,22 +1855,24 @@ static int tun_recvmsg(struct socket *sock, struct msghdr *m, size_t total_len, | ||
733 | { | ||
734 | struct tun_file *tfile = container_of(sock, struct tun_file, socket); | ||
735 | struct tun_struct *tun = __tun_get(tfile); | ||
736 | + struct sk_buff *skb = m->msg_control; | ||
737 | int ret; | ||
738 | |||
739 | - if (!tun) | ||
740 | - return -EBADFD; | ||
741 | + if (!tun) { | ||
742 | + ret = -EBADFD; | ||
743 | + goto out_free_skb; | ||
744 | + } | ||
745 | |||
746 | if (flags & ~(MSG_DONTWAIT|MSG_TRUNC|MSG_ERRQUEUE)) { | ||
747 | ret = -EINVAL; | ||
748 | - goto out; | ||
749 | + goto out_put_tun; | ||
750 | } | ||
751 | if (flags & MSG_ERRQUEUE) { | ||
752 | ret = sock_recv_errqueue(sock->sk, m, total_len, | ||
753 | SOL_PACKET, TUN_TX_TIMESTAMP); | ||
754 | goto out; | ||
755 | } | ||
756 | - ret = tun_do_read(tun, tfile, &m->msg_iter, flags & MSG_DONTWAIT, | ||
757 | - m->msg_control); | ||
758 | + ret = tun_do_read(tun, tfile, &m->msg_iter, flags & MSG_DONTWAIT, skb); | ||
759 | if (ret > (ssize_t)total_len) { | ||
760 | m->msg_flags |= MSG_TRUNC; | ||
761 | ret = flags & MSG_TRUNC ? ret : total_len; | ||
762 | @@ -1874,6 +1880,13 @@ static int tun_recvmsg(struct socket *sock, struct msghdr *m, size_t total_len, | ||
763 | out: | ||
764 | tun_put(tun); | ||
765 | return ret; | ||
766 | + | ||
767 | +out_put_tun: | ||
768 | + tun_put(tun); | ||
769 | +out_free_skb: | ||
770 | + if (skb) | ||
771 | + kfree_skb(skb); | ||
772 | + return ret; | ||
773 | } | ||
774 | |||
775 | static int tun_peek_len(struct socket *sock) | ||
776 | @@ -2144,6 +2157,8 @@ static int set_offload(struct tun_struct *tun, unsigned long arg) | ||
777 | features |= NETIF_F_TSO6; | ||
778 | arg &= ~(TUN_F_TSO4|TUN_F_TSO6); | ||
779 | } | ||
780 | + | ||
781 | + arg &= ~TUN_F_UFO; | ||
782 | } | ||
783 | |||
784 | /* This gives the user a way to test for new features in future by | ||
785 | diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c | ||
786 | index 8d4a6f7cba61..81394a4b2803 100644 | ||
787 | --- a/drivers/net/usb/qmi_wwan.c | ||
788 | +++ b/drivers/net/usb/qmi_wwan.c | ||
789 | @@ -261,9 +261,11 @@ static void qmi_wwan_netdev_setup(struct net_device *net) | ||
790 | net->hard_header_len = 0; | ||
791 | net->addr_len = 0; | ||
792 | net->flags = IFF_POINTOPOINT | IFF_NOARP | IFF_MULTICAST; | ||
793 | + set_bit(EVENT_NO_IP_ALIGN, &dev->flags); | ||
794 | netdev_dbg(net, "mode: raw IP\n"); | ||
795 | } else if (!net->header_ops) { /* don't bother if already set */ | ||
796 | ether_setup(net); | ||
797 | + clear_bit(EVENT_NO_IP_ALIGN, &dev->flags); | ||
798 | netdev_dbg(net, "mode: Ethernet\n"); | ||
799 | } | ||
800 | |||
801 | @@ -1239,6 +1241,7 @@ static const struct usb_device_id products[] = { | ||
802 | {QMI_FIXED_INTF(0x1e0e, 0x9001, 5)}, /* SIMCom 7230E */ | ||
803 | {QMI_QUIRK_SET_DTR(0x2c7c, 0x0125, 4)}, /* Quectel EC25, EC20 R2.0 Mini PCIe */ | ||
804 | {QMI_QUIRK_SET_DTR(0x2c7c, 0x0121, 4)}, /* Quectel EC21 Mini PCIe */ | ||
805 | + {QMI_FIXED_INTF(0x2c7c, 0x0296, 4)}, /* Quectel BG96 */ | ||
806 | |||
807 | /* 4. Gobi 1000 devices */ | ||
808 | {QMI_GOBI1K_DEVICE(0x05c6, 0x9212)}, /* Acer Gobi Modem Device */ | ||
809 | diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c | ||
810 | index 6510e5cc1817..42baad125a7d 100644 | ||
811 | --- a/drivers/net/usb/usbnet.c | ||
812 | +++ b/drivers/net/usb/usbnet.c | ||
813 | @@ -484,7 +484,10 @@ static int rx_submit (struct usbnet *dev, struct urb *urb, gfp_t flags) | ||
814 | return -ENOLINK; | ||
815 | } | ||
816 | |||
817 | - skb = __netdev_alloc_skb_ip_align(dev->net, size, flags); | ||
818 | + if (test_bit(EVENT_NO_IP_ALIGN, &dev->flags)) | ||
819 | + skb = __netdev_alloc_skb(dev->net, size, flags); | ||
820 | + else | ||
821 | + skb = __netdev_alloc_skb_ip_align(dev->net, size, flags); | ||
822 | if (!skb) { | ||
823 | netif_dbg(dev, rx_err, dev->net, "no rx skb\n"); | ||
824 | usbnet_defer_kevent (dev, EVENT_RX_MEMORY); | ||
825 | diff --git a/drivers/nvme/target/rdma.c b/drivers/nvme/target/rdma.c | ||
826 | index 76d2bb793afe..3333d417b248 100644 | ||
827 | --- a/drivers/nvme/target/rdma.c | ||
828 | +++ b/drivers/nvme/target/rdma.c | ||
829 | @@ -1512,15 +1512,17 @@ static struct nvmet_fabrics_ops nvmet_rdma_ops = { | ||
830 | |||
831 | static void nvmet_rdma_remove_one(struct ib_device *ib_device, void *client_data) | ||
832 | { | ||
833 | - struct nvmet_rdma_queue *queue; | ||
834 | + struct nvmet_rdma_queue *queue, *tmp; | ||
835 | |||
836 | /* Device is being removed, delete all queues using this device */ | ||
837 | mutex_lock(&nvmet_rdma_queue_mutex); | ||
838 | - list_for_each_entry(queue, &nvmet_rdma_queue_list, queue_list) { | ||
839 | + list_for_each_entry_safe(queue, tmp, &nvmet_rdma_queue_list, | ||
840 | + queue_list) { | ||
841 | if (queue->dev->device != ib_device) | ||
842 | continue; | ||
843 | |||
844 | pr_info("Removing queue %d\n", queue->idx); | ||
845 | + list_del_init(&queue->queue_list); | ||
846 | __nvmet_rdma_queue_disconnect(queue); | ||
847 | } | ||
848 | mutex_unlock(&nvmet_rdma_queue_mutex); | ||
849 | diff --git a/drivers/s390/net/qeth_core.h b/drivers/s390/net/qeth_core.h | ||
850 | index 47a13c5723c6..5340efc673a9 100644 | ||
851 | --- a/drivers/s390/net/qeth_core.h | ||
852 | +++ b/drivers/s390/net/qeth_core.h | ||
853 | @@ -985,6 +985,9 @@ struct qeth_cmd_buffer *qeth_get_setassparms_cmd(struct qeth_card *, | ||
854 | int qeth_set_features(struct net_device *, netdev_features_t); | ||
855 | int qeth_recover_features(struct net_device *); | ||
856 | netdev_features_t qeth_fix_features(struct net_device *, netdev_features_t); | ||
857 | +netdev_features_t qeth_features_check(struct sk_buff *skb, | ||
858 | + struct net_device *dev, | ||
859 | + netdev_features_t features); | ||
860 | int qeth_vm_request_mac(struct qeth_card *card); | ||
861 | int qeth_push_hdr(struct sk_buff *skb, struct qeth_hdr **hdr, unsigned int len); | ||
862 | |||
863 | diff --git a/drivers/s390/net/qeth_core_main.c b/drivers/s390/net/qeth_core_main.c | ||
864 | index bae7440abc01..330e5d3dadf3 100644 | ||
865 | --- a/drivers/s390/net/qeth_core_main.c | ||
866 | +++ b/drivers/s390/net/qeth_core_main.c | ||
867 | @@ -19,6 +19,11 @@ | ||
868 | #include <linux/mii.h> | ||
869 | #include <linux/kthread.h> | ||
870 | #include <linux/slab.h> | ||
871 | +#include <linux/if_vlan.h> | ||
872 | +#include <linux/netdevice.h> | ||
873 | +#include <linux/netdev_features.h> | ||
874 | +#include <linux/skbuff.h> | ||
875 | + | ||
876 | #include <net/iucv/af_iucv.h> | ||
877 | #include <net/dsfield.h> | ||
878 | |||
879 | @@ -6505,6 +6510,32 @@ netdev_features_t qeth_fix_features(struct net_device *dev, | ||
880 | } | ||
881 | EXPORT_SYMBOL_GPL(qeth_fix_features); | ||
882 | |||
883 | +netdev_features_t qeth_features_check(struct sk_buff *skb, | ||
884 | + struct net_device *dev, | ||
885 | + netdev_features_t features) | ||
886 | +{ | ||
887 | + /* GSO segmentation builds skbs with | ||
888 | + * a (small) linear part for the headers, and | ||
889 | + * page frags for the data. | ||
890 | + * Compared to a linear skb, the header-only part consumes an | ||
891 | + * additional buffer element. This reduces buffer utilization, and | ||
892 | + * hurts throughput. So compress small segments into one element. | ||
893 | + */ | ||
894 | + if (netif_needs_gso(skb, features)) { | ||
895 | + /* match skb_segment(): */ | ||
896 | + unsigned int doffset = skb->data - skb_mac_header(skb); | ||
897 | + unsigned int hsize = skb_shinfo(skb)->gso_size; | ||
898 | + unsigned int hroom = skb_headroom(skb); | ||
899 | + | ||
900 | + /* linearize only if resulting skb allocations are order-0: */ | ||
901 | + if (SKB_DATA_ALIGN(hroom + doffset + hsize) <= SKB_MAX_HEAD(0)) | ||
902 | + features &= ~NETIF_F_SG; | ||
903 | + } | ||
904 | + | ||
905 | + return vlan_features_check(skb, features); | ||
906 | +} | ||
907 | +EXPORT_SYMBOL_GPL(qeth_features_check); | ||
908 | + | ||
909 | static int __init qeth_core_init(void) | ||
910 | { | ||
911 | int rc; | ||
912 | diff --git a/drivers/s390/net/qeth_l2_main.c b/drivers/s390/net/qeth_l2_main.c | ||
913 | index 760b023eae95..5a973ebcb13c 100644 | ||
914 | --- a/drivers/s390/net/qeth_l2_main.c | ||
915 | +++ b/drivers/s390/net/qeth_l2_main.c | ||
916 | @@ -963,6 +963,7 @@ static const struct net_device_ops qeth_l2_netdev_ops = { | ||
917 | .ndo_stop = qeth_l2_stop, | ||
918 | .ndo_get_stats = qeth_get_stats, | ||
919 | .ndo_start_xmit = qeth_l2_hard_start_xmit, | ||
920 | + .ndo_features_check = qeth_features_check, | ||
921 | .ndo_validate_addr = eth_validate_addr, | ||
922 | .ndo_set_rx_mode = qeth_l2_set_rx_mode, | ||
923 | .ndo_do_ioctl = qeth_do_ioctl, | ||
924 | @@ -1009,6 +1010,7 @@ static int qeth_l2_setup_netdev(struct qeth_card *card) | ||
925 | if (card->info.type == QETH_CARD_TYPE_OSD && !card->info.guestlan) { | ||
926 | card->dev->hw_features = NETIF_F_SG; | ||
927 | card->dev->vlan_features = NETIF_F_SG; | ||
928 | + card->dev->features |= NETIF_F_SG; | ||
929 | /* OSA 3S and earlier has no RX/TX support */ | ||
930 | if (qeth_is_supported(card, IPA_OUTBOUND_CHECKSUM)) { | ||
931 | card->dev->hw_features |= NETIF_F_IP_CSUM; | ||
932 | @@ -1027,8 +1029,6 @@ static int qeth_l2_setup_netdev(struct qeth_card *card) | ||
933 | |||
934 | card->info.broadcast_capable = 1; | ||
935 | qeth_l2_request_initial_mac(card); | ||
936 | - card->dev->gso_max_size = (QETH_MAX_BUFFER_ELEMENTS(card) - 1) * | ||
937 | - PAGE_SIZE; | ||
938 | SET_NETDEV_DEV(card->dev, &card->gdev->dev); | ||
939 | netif_napi_add(card->dev, &card->napi, qeth_poll, QETH_NAPI_WEIGHT); | ||
940 | netif_carrier_off(card->dev); | ||
941 | diff --git a/drivers/s390/net/qeth_l3_main.c b/drivers/s390/net/qeth_l3_main.c | ||
942 | index ab661a431f7c..27185ab38136 100644 | ||
943 | --- a/drivers/s390/net/qeth_l3_main.c | ||
944 | +++ b/drivers/s390/net/qeth_l3_main.c | ||
945 | @@ -1376,6 +1376,7 @@ qeth_l3_add_mc_to_hash(struct qeth_card *card, struct in_device *in4_dev) | ||
946 | |||
947 | tmp->u.a4.addr = be32_to_cpu(im4->multiaddr); | ||
948 | memcpy(tmp->mac, buf, sizeof(tmp->mac)); | ||
949 | + tmp->is_multicast = 1; | ||
950 | |||
951 | ipm = qeth_l3_ip_from_hash(card, tmp); | ||
952 | if (ipm) { | ||
953 | @@ -1553,7 +1554,7 @@ static void qeth_l3_free_vlan_addresses4(struct qeth_card *card, | ||
954 | |||
955 | addr = qeth_l3_get_addr_buffer(QETH_PROT_IPV4); | ||
956 | if (!addr) | ||
957 | - return; | ||
958 | + goto out; | ||
959 | |||
960 | spin_lock_bh(&card->ip_lock); | ||
961 | |||
962 | @@ -1567,6 +1568,7 @@ static void qeth_l3_free_vlan_addresses4(struct qeth_card *card, | ||
963 | spin_unlock_bh(&card->ip_lock); | ||
964 | |||
965 | kfree(addr); | ||
966 | +out: | ||
967 | in_dev_put(in_dev); | ||
968 | } | ||
969 | |||
970 | @@ -1591,7 +1593,7 @@ static void qeth_l3_free_vlan_addresses6(struct qeth_card *card, | ||
971 | |||
972 | addr = qeth_l3_get_addr_buffer(QETH_PROT_IPV6); | ||
973 | if (!addr) | ||
974 | - return; | ||
975 | + goto out; | ||
976 | |||
977 | spin_lock_bh(&card->ip_lock); | ||
978 | |||
979 | @@ -1606,6 +1608,7 @@ static void qeth_l3_free_vlan_addresses6(struct qeth_card *card, | ||
980 | spin_unlock_bh(&card->ip_lock); | ||
981 | |||
982 | kfree(addr); | ||
983 | +out: | ||
984 | in6_dev_put(in6_dev); | ||
985 | #endif /* CONFIG_QETH_IPV6 */ | ||
986 | } | ||
987 | @@ -2920,6 +2923,7 @@ static const struct net_device_ops qeth_l3_osa_netdev_ops = { | ||
988 | .ndo_stop = qeth_l3_stop, | ||
989 | .ndo_get_stats = qeth_get_stats, | ||
990 | .ndo_start_xmit = qeth_l3_hard_start_xmit, | ||
991 | + .ndo_features_check = qeth_features_check, | ||
992 | .ndo_validate_addr = eth_validate_addr, | ||
993 | .ndo_set_rx_mode = qeth_l3_set_multicast_list, | ||
994 | .ndo_do_ioctl = qeth_do_ioctl, | ||
995 | @@ -2960,6 +2964,7 @@ static int qeth_l3_setup_netdev(struct qeth_card *card) | ||
996 | card->dev->vlan_features = NETIF_F_SG | | ||
997 | NETIF_F_RXCSUM | NETIF_F_IP_CSUM | | ||
998 | NETIF_F_TSO; | ||
999 | + card->dev->features |= NETIF_F_SG; | ||
1000 | } | ||
1001 | } | ||
1002 | } else if (card->info.type == QETH_CARD_TYPE_IQD) { | ||
1003 | @@ -2987,8 +2992,8 @@ static int qeth_l3_setup_netdev(struct qeth_card *card) | ||
1004 | NETIF_F_HW_VLAN_CTAG_RX | | ||
1005 | NETIF_F_HW_VLAN_CTAG_FILTER; | ||
1006 | netif_keep_dst(card->dev); | ||
1007 | - card->dev->gso_max_size = (QETH_MAX_BUFFER_ELEMENTS(card) - 1) * | ||
1008 | - PAGE_SIZE; | ||
1009 | + netif_set_gso_max_size(card->dev, (QETH_MAX_BUFFER_ELEMENTS(card) - 1) * | ||
1010 | + PAGE_SIZE); | ||
1011 | |||
1012 | SET_NETDEV_DEV(card->dev, &card->gdev->dev); | ||
1013 | netif_napi_add(card->dev, &card->napi, qeth_poll, QETH_NAPI_WEIGHT); | ||
1014 | diff --git a/drivers/usb/gadget/function/f_fs.c b/drivers/usb/gadget/function/f_fs.c | ||
1015 | index 0202e5132fa7..876cdbec1307 100644 | ||
1016 | --- a/drivers/usb/gadget/function/f_fs.c | ||
1017 | +++ b/drivers/usb/gadget/function/f_fs.c | ||
1018 | @@ -1016,7 +1016,7 @@ static ssize_t ffs_epfile_io(struct file *file, struct ffs_io_data *io_data) | ||
1019 | else | ||
1020 | ret = ep->status; | ||
1021 | goto error_mutex; | ||
1022 | - } else if (!(req = usb_ep_alloc_request(ep->ep, GFP_KERNEL))) { | ||
1023 | + } else if (!(req = usb_ep_alloc_request(ep->ep, GFP_ATOMIC))) { | ||
1024 | ret = -ENOMEM; | ||
1025 | } else { | ||
1026 | req->buf = data; | ||
1027 | diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c | ||
1028 | index 58585ec8699e..bd15309ac5f1 100644 | ||
1029 | --- a/drivers/vhost/net.c | ||
1030 | +++ b/drivers/vhost/net.c | ||
1031 | @@ -782,16 +782,6 @@ static void handle_rx(struct vhost_net *net) | ||
1032 | /* On error, stop handling until the next kick. */ | ||
1033 | if (unlikely(headcount < 0)) | ||
1034 | goto out; | ||
1035 | - if (nvq->rx_array) | ||
1036 | - msg.msg_control = vhost_net_buf_consume(&nvq->rxq); | ||
1037 | - /* On overrun, truncate and discard */ | ||
1038 | - if (unlikely(headcount > UIO_MAXIOV)) { | ||
1039 | - iov_iter_init(&msg.msg_iter, READ, vq->iov, 1, 1); | ||
1040 | - err = sock->ops->recvmsg(sock, &msg, | ||
1041 | - 1, MSG_DONTWAIT | MSG_TRUNC); | ||
1042 | - pr_debug("Discarded rx packet: len %zd\n", sock_len); | ||
1043 | - continue; | ||
1044 | - } | ||
1045 | /* OK, now we need to know about added descriptors. */ | ||
1046 | if (!headcount) { | ||
1047 | if (unlikely(vhost_enable_notify(&net->dev, vq))) { | ||
1048 | @@ -804,6 +794,16 @@ static void handle_rx(struct vhost_net *net) | ||
1049 | * they refilled. */ | ||
1050 | goto out; | ||
1051 | } | ||
1052 | + if (nvq->rx_array) | ||
1053 | + msg.msg_control = vhost_net_buf_consume(&nvq->rxq); | ||
1054 | + /* On overrun, truncate and discard */ | ||
1055 | + if (unlikely(headcount > UIO_MAXIOV)) { | ||
1056 | + iov_iter_init(&msg.msg_iter, READ, vq->iov, 1, 1); | ||
1057 | + err = sock->ops->recvmsg(sock, &msg, | ||
1058 | + 1, MSG_DONTWAIT | MSG_TRUNC); | ||
1059 | + pr_debug("Discarded rx packet: len %zd\n", sock_len); | ||
1060 | + continue; | ||
1061 | + } | ||
1062 | /* We don't need to be notified again. */ | ||
1063 | iov_iter_init(&msg.msg_iter, READ, vq->iov, in, vhost_len); | ||
1064 | fixup = msg.msg_iter; | ||
1065 | diff --git a/fs/fcntl.c b/fs/fcntl.c | ||
1066 | index 6fd311367efc..0345a46b8856 100644 | ||
1067 | --- a/fs/fcntl.c | ||
1068 | +++ b/fs/fcntl.c | ||
1069 | @@ -563,6 +563,9 @@ static int put_compat_flock64(const struct flock *kfl, struct compat_flock64 __u | ||
1070 | { | ||
1071 | struct compat_flock64 fl; | ||
1072 | |||
1073 | + BUILD_BUG_ON(sizeof(kfl->l_start) > sizeof(ufl->l_start)); | ||
1074 | + BUILD_BUG_ON(sizeof(kfl->l_len) > sizeof(ufl->l_len)); | ||
1075 | + | ||
1076 | memset(&fl, 0, sizeof(struct compat_flock64)); | ||
1077 | copy_flock_fields(&fl, kfl); | ||
1078 | if (copy_to_user(ufl, &fl, sizeof(struct compat_flock64))) | ||
1079 | @@ -641,12 +644,8 @@ COMPAT_SYSCALL_DEFINE3(fcntl64, unsigned int, fd, unsigned int, cmd, | ||
1080 | if (err) | ||
1081 | break; | ||
1082 | err = fcntl_getlk(f.file, convert_fcntl_cmd(cmd), &flock); | ||
1083 | - if (err) | ||
1084 | - break; | ||
1085 | - err = fixup_compat_flock(&flock); | ||
1086 | - if (err) | ||
1087 | - return err; | ||
1088 | - err = put_compat_flock64(&flock, compat_ptr(arg)); | ||
1089 | + if (!err) | ||
1090 | + err = put_compat_flock64(&flock, compat_ptr(arg)); | ||
1091 | break; | ||
1092 | case F_SETLK: | ||
1093 | case F_SETLKW: | ||
1094 | diff --git a/include/linux/netdev_features.h b/include/linux/netdev_features.h | ||
1095 | index dc8b4896b77b..b1b0ca7ccb2b 100644 | ||
1096 | --- a/include/linux/netdev_features.h | ||
1097 | +++ b/include/linux/netdev_features.h | ||
1098 | @@ -54,8 +54,9 @@ enum { | ||
1099 | NETIF_F_GSO_TUNNEL_REMCSUM_BIT, /* ... TUNNEL with TSO & REMCSUM */ | ||
1100 | NETIF_F_GSO_SCTP_BIT, /* ... SCTP fragmentation */ | ||
1101 | NETIF_F_GSO_ESP_BIT, /* ... ESP with TSO */ | ||
1102 | + NETIF_F_GSO_UDP_BIT, /* ... UFO, deprecated except tuntap */ | ||
1103 | /**/NETIF_F_GSO_LAST = /* last bit, see GSO_MASK */ | ||
1104 | - NETIF_F_GSO_ESP_BIT, | ||
1105 | + NETIF_F_GSO_UDP_BIT, | ||
1106 | |||
1107 | NETIF_F_FCOE_CRC_BIT, /* FCoE CRC32 */ | ||
1108 | NETIF_F_SCTP_CRC_BIT, /* SCTP checksum offload */ | ||
1109 | @@ -132,6 +133,7 @@ enum { | ||
1110 | #define NETIF_F_GSO_TUNNEL_REMCSUM __NETIF_F(GSO_TUNNEL_REMCSUM) | ||
1111 | #define NETIF_F_GSO_SCTP __NETIF_F(GSO_SCTP) | ||
1112 | #define NETIF_F_GSO_ESP __NETIF_F(GSO_ESP) | ||
1113 | +#define NETIF_F_GSO_UDP __NETIF_F(GSO_UDP) | ||
1114 | #define NETIF_F_HW_VLAN_STAG_FILTER __NETIF_F(HW_VLAN_STAG_FILTER) | ||
1115 | #define NETIF_F_HW_VLAN_STAG_RX __NETIF_F(HW_VLAN_STAG_RX) | ||
1116 | #define NETIF_F_HW_VLAN_STAG_TX __NETIF_F(HW_VLAN_STAG_TX) | ||
1117 | diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h | ||
1118 | index 2eaac7d75af4..46bf7cc7d5d5 100644 | ||
1119 | --- a/include/linux/netdevice.h | ||
1120 | +++ b/include/linux/netdevice.h | ||
1121 | @@ -4101,6 +4101,7 @@ static inline bool net_gso_ok(netdev_features_t features, int gso_type) | ||
1122 | BUILD_BUG_ON(SKB_GSO_TUNNEL_REMCSUM != (NETIF_F_GSO_TUNNEL_REMCSUM >> NETIF_F_GSO_SHIFT)); | ||
1123 | BUILD_BUG_ON(SKB_GSO_SCTP != (NETIF_F_GSO_SCTP >> NETIF_F_GSO_SHIFT)); | ||
1124 | BUILD_BUG_ON(SKB_GSO_ESP != (NETIF_F_GSO_ESP >> NETIF_F_GSO_SHIFT)); | ||
1125 | + BUILD_BUG_ON(SKB_GSO_UDP != (NETIF_F_GSO_UDP >> NETIF_F_GSO_SHIFT)); | ||
1126 | |||
1127 | return (features & feature) == feature; | ||
1128 | } | ||
1129 | diff --git a/include/linux/rculist_nulls.h b/include/linux/rculist_nulls.h | ||
1130 | index a328e8181e49..e4b257ff881b 100644 | ||
1131 | --- a/include/linux/rculist_nulls.h | ||
1132 | +++ b/include/linux/rculist_nulls.h | ||
1133 | @@ -100,44 +100,6 @@ static inline void hlist_nulls_add_head_rcu(struct hlist_nulls_node *n, | ||
1134 | first->pprev = &n->next; | ||
1135 | } | ||
1136 | |||
1137 | -/** | ||
1138 | - * hlist_nulls_add_tail_rcu | ||
1139 | - * @n: the element to add to the hash list. | ||
1140 | - * @h: the list to add to. | ||
1141 | - * | ||
1142 | - * Description: | ||
1143 | - * Adds the specified element to the end of the specified hlist_nulls, | ||
1144 | - * while permitting racing traversals. NOTE: tail insertion requires | ||
1145 | - * list traversal. | ||
1146 | - * | ||
1147 | - * The caller must take whatever precautions are necessary | ||
1148 | - * (such as holding appropriate locks) to avoid racing | ||
1149 | - * with another list-mutation primitive, such as hlist_nulls_add_head_rcu() | ||
1150 | - * or hlist_nulls_del_rcu(), running on this same list. | ||
1151 | - * However, it is perfectly legal to run concurrently with | ||
1152 | - * the _rcu list-traversal primitives, such as | ||
1153 | - * hlist_nulls_for_each_entry_rcu(), used to prevent memory-consistency | ||
1154 | - * problems on Alpha CPUs. Regardless of the type of CPU, the | ||
1155 | - * list-traversal primitive must be guarded by rcu_read_lock(). | ||
1156 | - */ | ||
1157 | -static inline void hlist_nulls_add_tail_rcu(struct hlist_nulls_node *n, | ||
1158 | - struct hlist_nulls_head *h) | ||
1159 | -{ | ||
1160 | - struct hlist_nulls_node *i, *last = NULL; | ||
1161 | - | ||
1162 | - for (i = hlist_nulls_first_rcu(h); !is_a_nulls(i); | ||
1163 | - i = hlist_nulls_next_rcu(i)) | ||
1164 | - last = i; | ||
1165 | - | ||
1166 | - if (last) { | ||
1167 | - n->next = last->next; | ||
1168 | - n->pprev = &last->next; | ||
1169 | - rcu_assign_pointer(hlist_nulls_next_rcu(last), n); | ||
1170 | - } else { | ||
1171 | - hlist_nulls_add_head_rcu(n, h); | ||
1172 | - } | ||
1173 | -} | ||
1174 | - | ||
1175 | /** | ||
1176 | * hlist_nulls_for_each_entry_rcu - iterate over rcu list of given type | ||
1177 | * @tpos: the type * to use as a loop cursor. | ||
1178 | diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h | ||
1179 | index d448a4804aea..051e0939ec19 100644 | ||
1180 | --- a/include/linux/skbuff.h | ||
1181 | +++ b/include/linux/skbuff.h | ||
1182 | @@ -569,6 +569,8 @@ enum { | ||
1183 | SKB_GSO_SCTP = 1 << 14, | ||
1184 | |||
1185 | SKB_GSO_ESP = 1 << 15, | ||
1186 | + | ||
1187 | + SKB_GSO_UDP = 1 << 16, | ||
1188 | }; | ||
1189 | |||
1190 | #if BITS_PER_LONG > 32 | ||
1191 | diff --git a/include/linux/usb/usbnet.h b/include/linux/usb/usbnet.h | ||
1192 | index 97116379db5f..e87a805cbfef 100644 | ||
1193 | --- a/include/linux/usb/usbnet.h | ||
1194 | +++ b/include/linux/usb/usbnet.h | ||
1195 | @@ -81,6 +81,7 @@ struct usbnet { | ||
1196 | # define EVENT_RX_KILL 10 | ||
1197 | # define EVENT_LINK_CHANGE 11 | ||
1198 | # define EVENT_SET_RX_MODE 12 | ||
1199 | +# define EVENT_NO_IP_ALIGN 13 | ||
1200 | }; | ||
1201 | |||
1202 | static inline struct usb_driver *driver_of(struct usb_interface *intf) | ||
1203 | diff --git a/include/linux/virtio_net.h b/include/linux/virtio_net.h | ||
1204 | index 210034c896e3..f144216febc6 100644 | ||
1205 | --- a/include/linux/virtio_net.h | ||
1206 | +++ b/include/linux/virtio_net.h | ||
1207 | @@ -9,7 +9,7 @@ static inline int virtio_net_hdr_to_skb(struct sk_buff *skb, | ||
1208 | const struct virtio_net_hdr *hdr, | ||
1209 | bool little_endian) | ||
1210 | { | ||
1211 | - unsigned short gso_type = 0; | ||
1212 | + unsigned int gso_type = 0; | ||
1213 | |||
1214 | if (hdr->gso_type != VIRTIO_NET_HDR_GSO_NONE) { | ||
1215 | switch (hdr->gso_type & ~VIRTIO_NET_HDR_GSO_ECN) { | ||
1216 | @@ -19,6 +19,9 @@ static inline int virtio_net_hdr_to_skb(struct sk_buff *skb, | ||
1217 | case VIRTIO_NET_HDR_GSO_TCPV6: | ||
1218 | gso_type = SKB_GSO_TCPV6; | ||
1219 | break; | ||
1220 | + case VIRTIO_NET_HDR_GSO_UDP: | ||
1221 | + gso_type = SKB_GSO_UDP; | ||
1222 | + break; | ||
1223 | default: | ||
1224 | return -EINVAL; | ||
1225 | } | ||
1226 | diff --git a/include/net/ipv6.h b/include/net/ipv6.h | ||
1227 | index 6eac5cf8f1e6..35e9dd2d18ba 100644 | ||
1228 | --- a/include/net/ipv6.h | ||
1229 | +++ b/include/net/ipv6.h | ||
1230 | @@ -727,7 +727,7 @@ static inline int ipv6_addr_diff(const struct in6_addr *a1, const struct in6_add | ||
1231 | __be32 ipv6_select_ident(struct net *net, | ||
1232 | const struct in6_addr *daddr, | ||
1233 | const struct in6_addr *saddr); | ||
1234 | -void ipv6_proxy_select_ident(struct net *net, struct sk_buff *skb); | ||
1235 | +__be32 ipv6_proxy_select_ident(struct net *net, struct sk_buff *skb); | ||
1236 | |||
1237 | int ip6_dst_hoplimit(struct dst_entry *dst); | ||
1238 | |||
1239 | diff --git a/include/net/sock.h b/include/net/sock.h | ||
1240 | index a6b9a8d1a6df..006580155a87 100644 | ||
1241 | --- a/include/net/sock.h | ||
1242 | +++ b/include/net/sock.h | ||
1243 | @@ -683,11 +683,7 @@ static inline void sk_add_node_rcu(struct sock *sk, struct hlist_head *list) | ||
1244 | |||
1245 | static inline void __sk_nulls_add_node_rcu(struct sock *sk, struct hlist_nulls_head *list) | ||
1246 | { | ||
1247 | - if (IS_ENABLED(CONFIG_IPV6) && sk->sk_reuseport && | ||
1248 | - sk->sk_family == AF_INET6) | ||
1249 | - hlist_nulls_add_tail_rcu(&sk->sk_nulls_node, list); | ||
1250 | - else | ||
1251 | - hlist_nulls_add_head_rcu(&sk->sk_nulls_node, list); | ||
1252 | + hlist_nulls_add_head_rcu(&sk->sk_nulls_node, list); | ||
1253 | } | ||
1254 | |||
1255 | static inline void sk_nulls_add_node_rcu(struct sock *sk, struct hlist_nulls_head *list) | ||
1256 | diff --git a/include/net/tcp.h b/include/net/tcp.h | ||
1257 | index e6d0002a1b0b..6ced69940f5c 100644 | ||
1258 | --- a/include/net/tcp.h | ||
1259 | +++ b/include/net/tcp.h | ||
1260 | @@ -563,7 +563,7 @@ void tcp_push_one(struct sock *, unsigned int mss_now); | ||
1261 | void tcp_send_ack(struct sock *sk); | ||
1262 | void tcp_send_delayed_ack(struct sock *sk); | ||
1263 | void tcp_send_loss_probe(struct sock *sk); | ||
1264 | -bool tcp_schedule_loss_probe(struct sock *sk); | ||
1265 | +bool tcp_schedule_loss_probe(struct sock *sk, bool advancing_rto); | ||
1266 | void tcp_skb_collapse_tstamp(struct sk_buff *skb, | ||
1267 | const struct sk_buff *next_skb); | ||
1268 | |||
1269 | @@ -874,12 +874,11 @@ static inline int tcp_v6_sdif(const struct sk_buff *skb) | ||
1270 | } | ||
1271 | #endif | ||
1272 | |||
1273 | -/* TCP_SKB_CB reference means this can not be used from early demux */ | ||
1274 | static inline bool inet_exact_dif_match(struct net *net, struct sk_buff *skb) | ||
1275 | { | ||
1276 | #if IS_ENABLED(CONFIG_NET_L3_MASTER_DEV) | ||
1277 | if (!net->ipv4.sysctl_tcp_l3mdev_accept && | ||
1278 | - skb && ipv4_l3mdev_skb(TCP_SKB_CB(skb)->header.h4.flags)) | ||
1279 | + skb && ipv4_l3mdev_skb(IPCB(skb)->flags)) | ||
1280 | return true; | ||
1281 | #endif | ||
1282 | return false; | ||
1283 | diff --git a/kernel/audit.c b/kernel/audit.c | ||
1284 | index be1c28fd4d57..5b34d3114af4 100644 | ||
1285 | --- a/kernel/audit.c | ||
1286 | +++ b/kernel/audit.c | ||
1287 | @@ -85,13 +85,13 @@ static int audit_initialized; | ||
1288 | #define AUDIT_OFF 0 | ||
1289 | #define AUDIT_ON 1 | ||
1290 | #define AUDIT_LOCKED 2 | ||
1291 | -u32 audit_enabled; | ||
1292 | -u32 audit_ever_enabled; | ||
1293 | +u32 audit_enabled = AUDIT_OFF; | ||
1294 | +u32 audit_ever_enabled = !!AUDIT_OFF; | ||
1295 | |||
1296 | EXPORT_SYMBOL_GPL(audit_enabled); | ||
1297 | |||
1298 | /* Default state when kernel boots without any parameters. */ | ||
1299 | -static u32 audit_default; | ||
1300 | +static u32 audit_default = AUDIT_OFF; | ||
1301 | |||
1302 | /* If auditing cannot proceed, audit_failure selects what happens. */ | ||
1303 | static u32 audit_failure = AUDIT_FAIL_PRINTK; | ||
1304 | @@ -1197,25 +1197,28 @@ static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh) | ||
1305 | pid_t auditd_pid; | ||
1306 | struct pid *req_pid = task_tgid(current); | ||
1307 | |||
1308 | - /* sanity check - PID values must match */ | ||
1309 | - if (new_pid != pid_vnr(req_pid)) | ||
1310 | + /* Sanity check - PID values must match. Setting | ||
1311 | + * pid to 0 is how auditd ends auditing. */ | ||
1312 | + if (new_pid && (new_pid != pid_vnr(req_pid))) | ||
1313 | return -EINVAL; | ||
1314 | |||
1315 | /* test the auditd connection */ | ||
1316 | audit_replace(req_pid); | ||
1317 | |||
1318 | auditd_pid = auditd_pid_vnr(); | ||
1319 | - /* only the current auditd can unregister itself */ | ||
1320 | - if ((!new_pid) && (new_pid != auditd_pid)) { | ||
1321 | - audit_log_config_change("audit_pid", new_pid, | ||
1322 | - auditd_pid, 0); | ||
1323 | - return -EACCES; | ||
1324 | - } | ||
1325 | - /* replacing a healthy auditd is not allowed */ | ||
1326 | - if (auditd_pid && new_pid) { | ||
1327 | - audit_log_config_change("audit_pid", new_pid, | ||
1328 | - auditd_pid, 0); | ||
1329 | - return -EEXIST; | ||
1330 | + if (auditd_pid) { | ||
1331 | + /* replacing a healthy auditd is not allowed */ | ||
1332 | + if (new_pid) { | ||
1333 | + audit_log_config_change("audit_pid", | ||
1334 | + new_pid, auditd_pid, 0); | ||
1335 | + return -EEXIST; | ||
1336 | + } | ||
1337 | + /* only current auditd can unregister itself */ | ||
1338 | + if (pid_vnr(req_pid) != auditd_pid) { | ||
1339 | + audit_log_config_change("audit_pid", | ||
1340 | + new_pid, auditd_pid, 0); | ||
1341 | + return -EACCES; | ||
1342 | + } | ||
1343 | } | ||
1344 | |||
1345 | if (new_pid) { | ||
1346 | @@ -1549,8 +1552,6 @@ static int __init audit_init(void) | ||
1347 | register_pernet_subsys(&audit_net_ops); | ||
1348 | |||
1349 | audit_initialized = AUDIT_INITIALIZED; | ||
1350 | - audit_enabled = audit_default; | ||
1351 | - audit_ever_enabled |= !!audit_default; | ||
1352 | |||
1353 | kauditd_task = kthread_run(kauditd_thread, NULL, "kauditd"); | ||
1354 | if (IS_ERR(kauditd_task)) { | ||
1355 | @@ -1572,6 +1573,8 @@ static int __init audit_enable(char *str) | ||
1356 | audit_default = !!simple_strtol(str, NULL, 0); | ||
1357 | if (!audit_default) | ||
1358 | audit_initialized = AUDIT_DISABLED; | ||
1359 | + audit_enabled = audit_default; | ||
1360 | + audit_ever_enabled = !!audit_enabled; | ||
1361 | |||
1362 | pr_info("%s\n", audit_default ? | ||
1363 | "enabled (after initialization)" : "disabled (until reboot)"); | ||
1364 | diff --git a/net/core/dev.c b/net/core/dev.c | ||
1365 | index 11596a302a26..27357fc1730b 100644 | ||
1366 | --- a/net/core/dev.c | ||
1367 | +++ b/net/core/dev.c | ||
1368 | @@ -2735,7 +2735,8 @@ EXPORT_SYMBOL(skb_mac_gso_segment); | ||
1369 | static inline bool skb_needs_check(struct sk_buff *skb, bool tx_path) | ||
1370 | { | ||
1371 | if (tx_path) | ||
1372 | - return skb->ip_summed != CHECKSUM_PARTIAL; | ||
1373 | + return skb->ip_summed != CHECKSUM_PARTIAL && | ||
1374 | + skb->ip_summed != CHECKSUM_UNNECESSARY; | ||
1375 | |||
1376 | return skb->ip_summed == CHECKSUM_NONE; | ||
1377 | } | ||
1378 | diff --git a/net/dccp/minisocks.c b/net/dccp/minisocks.c | ||
1379 | index abd07a443219..178bb9833311 100644 | ||
1380 | --- a/net/dccp/minisocks.c | ||
1381 | +++ b/net/dccp/minisocks.c | ||
1382 | @@ -57,10 +57,16 @@ void dccp_time_wait(struct sock *sk, int state, int timeo) | ||
1383 | if (state == DCCP_TIME_WAIT) | ||
1384 | timeo = DCCP_TIMEWAIT_LEN; | ||
1385 | |||
1386 | + /* tw_timer is pinned, so we need to make sure BH are disabled | ||
1387 | + * in following section, otherwise timer handler could run before | ||
1388 | + * we complete the initialization. | ||
1389 | + */ | ||
1390 | + local_bh_disable(); | ||
1391 | inet_twsk_schedule(tw, timeo); | ||
1392 | /* Linkage updates. */ | ||
1393 | __inet_twsk_hashdance(tw, sk, &dccp_hashinfo); | ||
1394 | inet_twsk_put(tw); | ||
1395 | + local_bh_enable(); | ||
1396 | } else { | ||
1397 | /* Sorry, if we're out of memory, just CLOSE this | ||
1398 | * socket up. We've got bigger problems than | ||
1399 | diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c | ||
1400 | index e31108e5ef79..b9d9a2b8792c 100644 | ||
1401 | --- a/net/ipv4/af_inet.c | ||
1402 | +++ b/net/ipv4/af_inet.c | ||
1403 | @@ -1221,9 +1221,10 @@ EXPORT_SYMBOL(inet_sk_rebuild_header); | ||
1404 | struct sk_buff *inet_gso_segment(struct sk_buff *skb, | ||
1405 | netdev_features_t features) | ||
1406 | { | ||
1407 | - bool fixedid = false, gso_partial, encap; | ||
1408 | + bool udpfrag = false, fixedid = false, gso_partial, encap; | ||
1409 | struct sk_buff *segs = ERR_PTR(-EINVAL); | ||
1410 | const struct net_offload *ops; | ||
1411 | + unsigned int offset = 0; | ||
1412 | struct iphdr *iph; | ||
1413 | int proto, tot_len; | ||
1414 | int nhoff; | ||
1415 | @@ -1258,6 +1259,7 @@ struct sk_buff *inet_gso_segment(struct sk_buff *skb, | ||
1416 | segs = ERR_PTR(-EPROTONOSUPPORT); | ||
1417 | |||
1418 | if (!skb->encapsulation || encap) { | ||
1419 | + udpfrag = !!(skb_shinfo(skb)->gso_type & SKB_GSO_UDP); | ||
1420 | fixedid = !!(skb_shinfo(skb)->gso_type & SKB_GSO_TCP_FIXEDID); | ||
1421 | |||
1422 | /* fixed ID is invalid if DF bit is not set */ | ||
1423 | @@ -1277,7 +1279,13 @@ struct sk_buff *inet_gso_segment(struct sk_buff *skb, | ||
1424 | skb = segs; | ||
1425 | do { | ||
1426 | iph = (struct iphdr *)(skb_mac_header(skb) + nhoff); | ||
1427 | - if (skb_is_gso(skb)) { | ||
1428 | + if (udpfrag) { | ||
1429 | + iph->frag_off = htons(offset >> 3); | ||
1430 | + if (skb->next) | ||
1431 | + iph->frag_off |= htons(IP_MF); | ||
1432 | + offset += skb->len - nhoff - ihl; | ||
1433 | + tot_len = skb->len - nhoff; | ||
1434 | + } else if (skb_is_gso(skb)) { | ||
1435 | if (!fixedid) { | ||
1436 | iph->id = htons(id); | ||
1437 | id += skb_shinfo(skb)->gso_segs; | ||
1438 | diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c | ||
1439 | index b6bb3cdfad09..c5447b9f8517 100644 | ||
1440 | --- a/net/ipv4/tcp_input.c | ||
1441 | +++ b/net/ipv4/tcp_input.c | ||
1442 | @@ -592,6 +592,7 @@ void tcp_rcv_space_adjust(struct sock *sk) | ||
1443 | int time; | ||
1444 | int copied; | ||
1445 | |||
1446 | + tcp_mstamp_refresh(tp); | ||
1447 | time = tcp_stamp_us_delta(tp->tcp_mstamp, tp->rcvq_space.time); | ||
1448 | if (time < (tp->rcv_rtt_est.rtt_us >> 3) || tp->rcv_rtt_est.rtt_us == 0) | ||
1449 | return; | ||
1450 | @@ -3020,7 +3021,7 @@ void tcp_rearm_rto(struct sock *sk) | ||
1451 | /* Try to schedule a loss probe; if that doesn't work, then schedule an RTO. */ | ||
1452 | static void tcp_set_xmit_timer(struct sock *sk) | ||
1453 | { | ||
1454 | - if (!tcp_schedule_loss_probe(sk)) | ||
1455 | + if (!tcp_schedule_loss_probe(sk, true)) | ||
1456 | tcp_rearm_rto(sk); | ||
1457 | } | ||
1458 | |||
1459 | diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c | ||
1460 | index 5b027c69cbc5..5a5ed4f14678 100644 | ||
1461 | --- a/net/ipv4/tcp_ipv4.c | ||
1462 | +++ b/net/ipv4/tcp_ipv4.c | ||
1463 | @@ -1587,6 +1587,34 @@ int tcp_filter(struct sock *sk, struct sk_buff *skb) | ||
1464 | } | ||
1465 | EXPORT_SYMBOL(tcp_filter); | ||
1466 | |||
1467 | +static void tcp_v4_restore_cb(struct sk_buff *skb) | ||
1468 | +{ | ||
1469 | + memmove(IPCB(skb), &TCP_SKB_CB(skb)->header.h4, | ||
1470 | + sizeof(struct inet_skb_parm)); | ||
1471 | +} | ||
1472 | + | ||
1473 | +static void tcp_v4_fill_cb(struct sk_buff *skb, const struct iphdr *iph, | ||
1474 | + const struct tcphdr *th) | ||
1475 | +{ | ||
1476 | + /* This is tricky : We move IPCB at its correct location into TCP_SKB_CB() | ||
1477 | + * barrier() makes sure compiler wont play fool^Waliasing games. | ||
1478 | + */ | ||
1479 | + memmove(&TCP_SKB_CB(skb)->header.h4, IPCB(skb), | ||
1480 | + sizeof(struct inet_skb_parm)); | ||
1481 | + barrier(); | ||
1482 | + | ||
1483 | + TCP_SKB_CB(skb)->seq = ntohl(th->seq); | ||
1484 | + TCP_SKB_CB(skb)->end_seq = (TCP_SKB_CB(skb)->seq + th->syn + th->fin + | ||
1485 | + skb->len - th->doff * 4); | ||
1486 | + TCP_SKB_CB(skb)->ack_seq = ntohl(th->ack_seq); | ||
1487 | + TCP_SKB_CB(skb)->tcp_flags = tcp_flag_byte(th); | ||
1488 | + TCP_SKB_CB(skb)->tcp_tw_isn = 0; | ||
1489 | + TCP_SKB_CB(skb)->ip_dsfield = ipv4_get_dsfield(iph); | ||
1490 | + TCP_SKB_CB(skb)->sacked = 0; | ||
1491 | + TCP_SKB_CB(skb)->has_rxtstamp = | ||
1492 | + skb->tstamp || skb_hwtstamps(skb)->hwtstamp; | ||
1493 | +} | ||
1494 | + | ||
1495 | /* | ||
1496 | * From tcp_input.c | ||
1497 | */ | ||
1498 | @@ -1627,24 +1655,6 @@ int tcp_v4_rcv(struct sk_buff *skb) | ||
1499 | |||
1500 | th = (const struct tcphdr *)skb->data; | ||
1501 | iph = ip_hdr(skb); | ||
1502 | - /* This is tricky : We move IPCB at its correct location into TCP_SKB_CB() | ||
1503 | - * barrier() makes sure compiler wont play fool^Waliasing games. | ||
1504 | - */ | ||
1505 | - memmove(&TCP_SKB_CB(skb)->header.h4, IPCB(skb), | ||
1506 | - sizeof(struct inet_skb_parm)); | ||
1507 | - barrier(); | ||
1508 | - | ||
1509 | - TCP_SKB_CB(skb)->seq = ntohl(th->seq); | ||
1510 | - TCP_SKB_CB(skb)->end_seq = (TCP_SKB_CB(skb)->seq + th->syn + th->fin + | ||
1511 | - skb->len - th->doff * 4); | ||
1512 | - TCP_SKB_CB(skb)->ack_seq = ntohl(th->ack_seq); | ||
1513 | - TCP_SKB_CB(skb)->tcp_flags = tcp_flag_byte(th); | ||
1514 | - TCP_SKB_CB(skb)->tcp_tw_isn = 0; | ||
1515 | - TCP_SKB_CB(skb)->ip_dsfield = ipv4_get_dsfield(iph); | ||
1516 | - TCP_SKB_CB(skb)->sacked = 0; | ||
1517 | - TCP_SKB_CB(skb)->has_rxtstamp = | ||
1518 | - skb->tstamp || skb_hwtstamps(skb)->hwtstamp; | ||
1519 | - | ||
1520 | lookup: | ||
1521 | sk = __inet_lookup_skb(&tcp_hashinfo, skb, __tcp_hdrlen(th), th->source, | ||
1522 | th->dest, sdif, &refcounted); | ||
1523 | @@ -1675,14 +1685,19 @@ int tcp_v4_rcv(struct sk_buff *skb) | ||
1524 | sock_hold(sk); | ||
1525 | refcounted = true; | ||
1526 | nsk = NULL; | ||
1527 | - if (!tcp_filter(sk, skb)) | ||
1528 | + if (!tcp_filter(sk, skb)) { | ||
1529 | + th = (const struct tcphdr *)skb->data; | ||
1530 | + iph = ip_hdr(skb); | ||
1531 | + tcp_v4_fill_cb(skb, iph, th); | ||
1532 | nsk = tcp_check_req(sk, skb, req, false); | ||
1533 | + } | ||
1534 | if (!nsk) { | ||
1535 | reqsk_put(req); | ||
1536 | goto discard_and_relse; | ||
1537 | } | ||
1538 | if (nsk == sk) { | ||
1539 | reqsk_put(req); | ||
1540 | + tcp_v4_restore_cb(skb); | ||
1541 | } else if (tcp_child_process(sk, nsk, skb)) { | ||
1542 | tcp_v4_send_reset(nsk, skb); | ||
1543 | goto discard_and_relse; | ||
1544 | @@ -1708,6 +1723,7 @@ int tcp_v4_rcv(struct sk_buff *skb) | ||
1545 | goto discard_and_relse; | ||
1546 | th = (const struct tcphdr *)skb->data; | ||
1547 | iph = ip_hdr(skb); | ||
1548 | + tcp_v4_fill_cb(skb, iph, th); | ||
1549 | |||
1550 | skb->dev = NULL; | ||
1551 | |||
1552 | @@ -1738,6 +1754,8 @@ int tcp_v4_rcv(struct sk_buff *skb) | ||
1553 | if (!xfrm4_policy_check(NULL, XFRM_POLICY_IN, skb)) | ||
1554 | goto discard_it; | ||
1555 | |||
1556 | + tcp_v4_fill_cb(skb, iph, th); | ||
1557 | + | ||
1558 | if (tcp_checksum_complete(skb)) { | ||
1559 | csum_error: | ||
1560 | __TCP_INC_STATS(net, TCP_MIB_CSUMERRORS); | ||
1561 | @@ -1764,6 +1782,8 @@ int tcp_v4_rcv(struct sk_buff *skb) | ||
1562 | goto discard_it; | ||
1563 | } | ||
1564 | |||
1565 | + tcp_v4_fill_cb(skb, iph, th); | ||
1566 | + | ||
1567 | if (tcp_checksum_complete(skb)) { | ||
1568 | inet_twsk_put(inet_twsk(sk)); | ||
1569 | goto csum_error; | ||
1570 | @@ -1780,6 +1800,7 @@ int tcp_v4_rcv(struct sk_buff *skb) | ||
1571 | if (sk2) { | ||
1572 | inet_twsk_deschedule_put(inet_twsk(sk)); | ||
1573 | sk = sk2; | ||
1574 | + tcp_v4_restore_cb(skb); | ||
1575 | refcounted = false; | ||
1576 | goto process; | ||
1577 | } | ||
1578 | diff --git a/net/ipv4/tcp_minisocks.c b/net/ipv4/tcp_minisocks.c | ||
1579 | index 188a6f31356d..420fecbb98fe 100644 | ||
1580 | --- a/net/ipv4/tcp_minisocks.c | ||
1581 | +++ b/net/ipv4/tcp_minisocks.c | ||
1582 | @@ -312,10 +312,16 @@ void tcp_time_wait(struct sock *sk, int state, int timeo) | ||
1583 | if (state == TCP_TIME_WAIT) | ||
1584 | timeo = TCP_TIMEWAIT_LEN; | ||
1585 | |||
1586 | + /* tw_timer is pinned, so we need to make sure BH are disabled | ||
1587 | + * in following section, otherwise timer handler could run before | ||
1588 | + * we complete the initialization. | ||
1589 | + */ | ||
1590 | + local_bh_disable(); | ||
1591 | inet_twsk_schedule(tw, timeo); | ||
1592 | /* Linkage updates. */ | ||
1593 | __inet_twsk_hashdance(tw, sk, &tcp_hashinfo); | ||
1594 | inet_twsk_put(tw); | ||
1595 | + local_bh_enable(); | ||
1596 | } else { | ||
1597 | /* Sorry, if we're out of memory, just CLOSE this | ||
1598 | * socket up. We've got bigger problems than | ||
1599 | diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c | ||
1600 | index 478909f4694d..cd3d60bb7cc8 100644 | ||
1601 | --- a/net/ipv4/tcp_output.c | ||
1602 | +++ b/net/ipv4/tcp_output.c | ||
1603 | @@ -2337,7 +2337,7 @@ static bool tcp_write_xmit(struct sock *sk, unsigned int mss_now, int nonagle, | ||
1604 | |||
1605 | /* Send one loss probe per tail loss episode. */ | ||
1606 | if (push_one != 2) | ||
1607 | - tcp_schedule_loss_probe(sk); | ||
1608 | + tcp_schedule_loss_probe(sk, false); | ||
1609 | is_cwnd_limited |= (tcp_packets_in_flight(tp) >= tp->snd_cwnd); | ||
1610 | tcp_cwnd_validate(sk, is_cwnd_limited); | ||
1611 | return false; | ||
1612 | @@ -2345,7 +2345,7 @@ static bool tcp_write_xmit(struct sock *sk, unsigned int mss_now, int nonagle, | ||
1613 | return !tp->packets_out && tcp_send_head(sk); | ||
1614 | } | ||
1615 | |||
1616 | -bool tcp_schedule_loss_probe(struct sock *sk) | ||
1617 | +bool tcp_schedule_loss_probe(struct sock *sk, bool advancing_rto) | ||
1618 | { | ||
1619 | struct inet_connection_sock *icsk = inet_csk(sk); | ||
1620 | struct tcp_sock *tp = tcp_sk(sk); | ||
1621 | @@ -2384,7 +2384,9 @@ bool tcp_schedule_loss_probe(struct sock *sk) | ||
1622 | } | ||
1623 | |||
1624 | /* If the RTO formula yields an earlier time, then use that time. */ | ||
1625 | - rto_delta_us = tcp_rto_delta_us(sk); /* How far in future is RTO? */ | ||
1626 | + rto_delta_us = advancing_rto ? | ||
1627 | + jiffies_to_usecs(inet_csk(sk)->icsk_rto) : | ||
1628 | + tcp_rto_delta_us(sk); /* How far in future is RTO? */ | ||
1629 | if (rto_delta_us > 0) | ||
1630 | timeout = min_t(u32, timeout, usecs_to_jiffies(rto_delta_us)); | ||
1631 | |||
1632 | diff --git a/net/ipv4/udp_offload.c b/net/ipv4/udp_offload.c | ||
1633 | index e360d55be555..01801b77bd0d 100644 | ||
1634 | --- a/net/ipv4/udp_offload.c | ||
1635 | +++ b/net/ipv4/udp_offload.c | ||
1636 | @@ -187,16 +187,57 @@ struct sk_buff *skb_udp_tunnel_segment(struct sk_buff *skb, | ||
1637 | } | ||
1638 | EXPORT_SYMBOL(skb_udp_tunnel_segment); | ||
1639 | |||
1640 | -static struct sk_buff *udp4_tunnel_segment(struct sk_buff *skb, | ||
1641 | - netdev_features_t features) | ||
1642 | +static struct sk_buff *udp4_ufo_fragment(struct sk_buff *skb, | ||
1643 | + netdev_features_t features) | ||
1644 | { | ||
1645 | struct sk_buff *segs = ERR_PTR(-EINVAL); | ||
1646 | + unsigned int mss; | ||
1647 | + __wsum csum; | ||
1648 | + struct udphdr *uh; | ||
1649 | + struct iphdr *iph; | ||
1650 | |||
1651 | if (skb->encapsulation && | ||
1652 | (skb_shinfo(skb)->gso_type & | ||
1653 | - (SKB_GSO_UDP_TUNNEL|SKB_GSO_UDP_TUNNEL_CSUM))) | ||
1654 | + (SKB_GSO_UDP_TUNNEL|SKB_GSO_UDP_TUNNEL_CSUM))) { | ||
1655 | segs = skb_udp_tunnel_segment(skb, features, false); | ||
1656 | + goto out; | ||
1657 | + } | ||
1658 | + | ||
1659 | + if (!pskb_may_pull(skb, sizeof(struct udphdr))) | ||
1660 | + goto out; | ||
1661 | + | ||
1662 | + mss = skb_shinfo(skb)->gso_size; | ||
1663 | + if (unlikely(skb->len <= mss)) | ||
1664 | + goto out; | ||
1665 | + | ||
1666 | + /* Do software UFO. Complete and fill in the UDP checksum as | ||
1667 | + * HW cannot do checksum of UDP packets sent as multiple | ||
1668 | + * IP fragments. | ||
1669 | + */ | ||
1670 | |||
1671 | + uh = udp_hdr(skb); | ||
1672 | + iph = ip_hdr(skb); | ||
1673 | + | ||
1674 | + uh->check = 0; | ||
1675 | + csum = skb_checksum(skb, 0, skb->len, 0); | ||
1676 | + uh->check = udp_v4_check(skb->len, iph->saddr, iph->daddr, csum); | ||
1677 | + if (uh->check == 0) | ||
1678 | + uh->check = CSUM_MANGLED_0; | ||
1679 | + | ||
1680 | + skb->ip_summed = CHECKSUM_UNNECESSARY; | ||
1681 | + | ||
1682 | + /* If there is no outer header we can fake a checksum offload | ||
1683 | + * due to the fact that we have already done the checksum in | ||
1684 | + * software prior to segmenting the frame. | ||
1685 | + */ | ||
1686 | + if (!skb->encap_hdr_csum) | ||
1687 | + features |= NETIF_F_HW_CSUM; | ||
1688 | + | ||
1689 | + /* Fragment the skb. IP headers of the fragments are updated in | ||
1690 | + * inet_gso_segment() | ||
1691 | + */ | ||
1692 | + segs = skb_segment(skb, features); | ||
1693 | +out: | ||
1694 | return segs; | ||
1695 | } | ||
1696 | |||
1697 | @@ -330,7 +371,7 @@ static int udp4_gro_complete(struct sk_buff *skb, int nhoff) | ||
1698 | |||
1699 | static const struct net_offload udpv4_offload = { | ||
1700 | .callbacks = { | ||
1701 | - .gso_segment = udp4_tunnel_segment, | ||
1702 | + .gso_segment = udp4_ufo_fragment, | ||
1703 | .gro_receive = udp4_gro_receive, | ||
1704 | .gro_complete = udp4_gro_complete, | ||
1705 | }, | ||
1706 | diff --git a/net/ipv6/output_core.c b/net/ipv6/output_core.c | ||
1707 | index a338bbc33cf3..4fe7c90962dd 100644 | ||
1708 | --- a/net/ipv6/output_core.c | ||
1709 | +++ b/net/ipv6/output_core.c | ||
1710 | @@ -39,7 +39,7 @@ static u32 __ipv6_select_ident(struct net *net, u32 hashrnd, | ||
1711 | * | ||
1712 | * The network header must be set before calling this. | ||
1713 | */ | ||
1714 | -void ipv6_proxy_select_ident(struct net *net, struct sk_buff *skb) | ||
1715 | +__be32 ipv6_proxy_select_ident(struct net *net, struct sk_buff *skb) | ||
1716 | { | ||
1717 | static u32 ip6_proxy_idents_hashrnd __read_mostly; | ||
1718 | struct in6_addr buf[2]; | ||
1719 | @@ -51,14 +51,14 @@ void ipv6_proxy_select_ident(struct net *net, struct sk_buff *skb) | ||
1720 | offsetof(struct ipv6hdr, saddr), | ||
1721 | sizeof(buf), buf); | ||
1722 | if (!addrs) | ||
1723 | - return; | ||
1724 | + return 0; | ||
1725 | |||
1726 | net_get_random_once(&ip6_proxy_idents_hashrnd, | ||
1727 | sizeof(ip6_proxy_idents_hashrnd)); | ||
1728 | |||
1729 | id = __ipv6_select_ident(net, ip6_proxy_idents_hashrnd, | ||
1730 | &addrs[1], &addrs[0]); | ||
1731 | - skb_shinfo(skb)->ip6_frag_id = htonl(id); | ||
1732 | + return htonl(id); | ||
1733 | } | ||
1734 | EXPORT_SYMBOL_GPL(ipv6_proxy_select_ident); | ||
1735 | |||
1736 | diff --git a/net/ipv6/route.c b/net/ipv6/route.c | ||
1737 | index a96d5b385d8f..598efa8cfe25 100644 | ||
1738 | --- a/net/ipv6/route.c | ||
1739 | +++ b/net/ipv6/route.c | ||
1740 | @@ -960,7 +960,7 @@ static struct net_device *ip6_rt_get_dev_rcu(struct rt6_info *rt) | ||
1741 | { | ||
1742 | struct net_device *dev = rt->dst.dev; | ||
1743 | |||
1744 | - if (rt->rt6i_flags & RTF_LOCAL) { | ||
1745 | + if (rt->rt6i_flags & (RTF_LOCAL | RTF_ANYCAST)) { | ||
1746 | /* for copies of local routes, dst->dev needs to be the | ||
1747 | * device if it is a master device, the master device if | ||
1748 | * device is enslaved, and the loopback as the default | ||
1749 | diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c | ||
1750 | index ac912bb21747..e79854cc5790 100644 | ||
1751 | --- a/net/ipv6/sit.c | ||
1752 | +++ b/net/ipv6/sit.c | ||
1753 | @@ -1087,6 +1087,7 @@ static void ipip6_tunnel_update(struct ip_tunnel *t, struct ip_tunnel_parm *p, | ||
1754 | ipip6_tunnel_link(sitn, t); | ||
1755 | t->parms.iph.ttl = p->iph.ttl; | ||
1756 | t->parms.iph.tos = p->iph.tos; | ||
1757 | + t->parms.iph.frag_off = p->iph.frag_off; | ||
1758 | if (t->parms.link != p->link || t->fwmark != fwmark) { | ||
1759 | t->parms.link = p->link; | ||
1760 | t->fwmark = fwmark; | ||
1761 | diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c | ||
1762 | index 64d94afa427f..32ded300633d 100644 | ||
1763 | --- a/net/ipv6/tcp_ipv6.c | ||
1764 | +++ b/net/ipv6/tcp_ipv6.c | ||
1765 | @@ -1448,7 +1448,6 @@ static int tcp_v6_rcv(struct sk_buff *skb) | ||
1766 | struct sock *nsk; | ||
1767 | |||
1768 | sk = req->rsk_listener; | ||
1769 | - tcp_v6_fill_cb(skb, hdr, th); | ||
1770 | if (tcp_v6_inbound_md5_hash(sk, skb)) { | ||
1771 | sk_drops_add(sk, skb); | ||
1772 | reqsk_put(req); | ||
1773 | @@ -1461,8 +1460,12 @@ static int tcp_v6_rcv(struct sk_buff *skb) | ||
1774 | sock_hold(sk); | ||
1775 | refcounted = true; | ||
1776 | nsk = NULL; | ||
1777 | - if (!tcp_filter(sk, skb)) | ||
1778 | + if (!tcp_filter(sk, skb)) { | ||
1779 | + th = (const struct tcphdr *)skb->data; | ||
1780 | + hdr = ipv6_hdr(skb); | ||
1781 | + tcp_v6_fill_cb(skb, hdr, th); | ||
1782 | nsk = tcp_check_req(sk, skb, req, false); | ||
1783 | + } | ||
1784 | if (!nsk) { | ||
1785 | reqsk_put(req); | ||
1786 | goto discard_and_relse; | ||
1787 | @@ -1486,8 +1489,6 @@ static int tcp_v6_rcv(struct sk_buff *skb) | ||
1788 | if (!xfrm6_policy_check(sk, XFRM_POLICY_IN, skb)) | ||
1789 | goto discard_and_relse; | ||
1790 | |||
1791 | - tcp_v6_fill_cb(skb, hdr, th); | ||
1792 | - | ||
1793 | if (tcp_v6_inbound_md5_hash(sk, skb)) | ||
1794 | goto discard_and_relse; | ||
1795 | |||
1796 | @@ -1495,6 +1496,7 @@ static int tcp_v6_rcv(struct sk_buff *skb) | ||
1797 | goto discard_and_relse; | ||
1798 | th = (const struct tcphdr *)skb->data; | ||
1799 | hdr = ipv6_hdr(skb); | ||
1800 | + tcp_v6_fill_cb(skb, hdr, th); | ||
1801 | |||
1802 | skb->dev = NULL; | ||
1803 | |||
1804 | @@ -1583,7 +1585,6 @@ static int tcp_v6_rcv(struct sk_buff *skb) | ||
1805 | tcp_v6_timewait_ack(sk, skb); | ||
1806 | break; | ||
1807 | case TCP_TW_RST: | ||
1808 | - tcp_v6_restore_cb(skb); | ||
1809 | tcp_v6_send_reset(sk, skb); | ||
1810 | inet_twsk_deschedule_put(inet_twsk(sk)); | ||
1811 | goto discard_it; | ||
1812 | diff --git a/net/ipv6/udp_offload.c b/net/ipv6/udp_offload.c | ||
1813 | index 455fd4e39333..a0f89ad76f9d 100644 | ||
1814 | --- a/net/ipv6/udp_offload.c | ||
1815 | +++ b/net/ipv6/udp_offload.c | ||
1816 | @@ -17,15 +17,94 @@ | ||
1817 | #include <net/ip6_checksum.h> | ||
1818 | #include "ip6_offload.h" | ||
1819 | |||
1820 | -static struct sk_buff *udp6_tunnel_segment(struct sk_buff *skb, | ||
1821 | - netdev_features_t features) | ||
1822 | +static struct sk_buff *udp6_ufo_fragment(struct sk_buff *skb, | ||
1823 | + netdev_features_t features) | ||
1824 | { | ||
1825 | struct sk_buff *segs = ERR_PTR(-EINVAL); | ||
1826 | + unsigned int mss; | ||
1827 | + unsigned int unfrag_ip6hlen, unfrag_len; | ||
1828 | + struct frag_hdr *fptr; | ||
1829 | + u8 *packet_start, *prevhdr; | ||
1830 | + u8 nexthdr; | ||
1831 | + u8 frag_hdr_sz = sizeof(struct frag_hdr); | ||
1832 | + __wsum csum; | ||
1833 | + int tnl_hlen; | ||
1834 | + int err; | ||
1835 | + | ||
1836 | + mss = skb_shinfo(skb)->gso_size; | ||
1837 | + if (unlikely(skb->len <= mss)) | ||
1838 | + goto out; | ||
1839 | |||
1840 | if (skb->encapsulation && skb_shinfo(skb)->gso_type & | ||
1841 | (SKB_GSO_UDP_TUNNEL|SKB_GSO_UDP_TUNNEL_CSUM)) | ||
1842 | segs = skb_udp_tunnel_segment(skb, features, true); | ||
1843 | + else { | ||
1844 | + const struct ipv6hdr *ipv6h; | ||
1845 | + struct udphdr *uh; | ||
1846 | + | ||
1847 | + if (!pskb_may_pull(skb, sizeof(struct udphdr))) | ||
1848 | + goto out; | ||
1849 | + | ||
1850 | + /* Do software UFO. Complete and fill in the UDP checksum as HW cannot | ||
1851 | + * do checksum of UDP packets sent as multiple IP fragments. | ||
1852 | + */ | ||
1853 | + | ||
1854 | + uh = udp_hdr(skb); | ||
1855 | + ipv6h = ipv6_hdr(skb); | ||
1856 | + | ||
1857 | + uh->check = 0; | ||
1858 | + csum = skb_checksum(skb, 0, skb->len, 0); | ||
1859 | + uh->check = udp_v6_check(skb->len, &ipv6h->saddr, | ||
1860 | + &ipv6h->daddr, csum); | ||
1861 | + if (uh->check == 0) | ||
1862 | + uh->check = CSUM_MANGLED_0; | ||
1863 | + | ||
1864 | + skb->ip_summed = CHECKSUM_UNNECESSARY; | ||
1865 | + | ||
1866 | + /* If there is no outer header we can fake a checksum offload | ||
1867 | + * due to the fact that we have already done the checksum in | ||
1868 | + * software prior to segmenting the frame. | ||
1869 | + */ | ||
1870 | + if (!skb->encap_hdr_csum) | ||
1871 | + features |= NETIF_F_HW_CSUM; | ||
1872 | + | ||
1873 | + /* Check if there is enough headroom to insert fragment header. */ | ||
1874 | + tnl_hlen = skb_tnl_header_len(skb); | ||
1875 | + if (skb->mac_header < (tnl_hlen + frag_hdr_sz)) { | ||
1876 | + if (gso_pskb_expand_head(skb, tnl_hlen + frag_hdr_sz)) | ||
1877 | + goto out; | ||
1878 | + } | ||
1879 | + | ||
1880 | + /* Find the unfragmentable header and shift it left by frag_hdr_sz | ||
1881 | + * bytes to insert fragment header. | ||
1882 | + */ | ||
1883 | + err = ip6_find_1stfragopt(skb, &prevhdr); | ||
1884 | + if (err < 0) | ||
1885 | + return ERR_PTR(err); | ||
1886 | + unfrag_ip6hlen = err; | ||
1887 | + nexthdr = *prevhdr; | ||
1888 | + *prevhdr = NEXTHDR_FRAGMENT; | ||
1889 | + unfrag_len = (skb_network_header(skb) - skb_mac_header(skb)) + | ||
1890 | + unfrag_ip6hlen + tnl_hlen; | ||
1891 | + packet_start = (u8 *) skb->head + SKB_GSO_CB(skb)->mac_offset; | ||
1892 | + memmove(packet_start-frag_hdr_sz, packet_start, unfrag_len); | ||
1893 | + | ||
1894 | + SKB_GSO_CB(skb)->mac_offset -= frag_hdr_sz; | ||
1895 | + skb->mac_header -= frag_hdr_sz; | ||
1896 | + skb->network_header -= frag_hdr_sz; | ||
1897 | + | ||
1898 | + fptr = (struct frag_hdr *)(skb_network_header(skb) + unfrag_ip6hlen); | ||
1899 | + fptr->nexthdr = nexthdr; | ||
1900 | + fptr->reserved = 0; | ||
1901 | + fptr->identification = ipv6_proxy_select_ident(dev_net(skb->dev), skb); | ||
1902 | + | ||
1903 | + /* Fragment the skb. ipv6 header and the remaining fields of the | ||
1904 | + * fragment header are updated in ipv6_gso_segment() | ||
1905 | + */ | ||
1906 | + segs = skb_segment(skb, features); | ||
1907 | + } | ||
1908 | |||
1909 | +out: | ||
1910 | return segs; | ||
1911 | } | ||
1912 | |||
1913 | @@ -75,7 +154,7 @@ static int udp6_gro_complete(struct sk_buff *skb, int nhoff) | ||
1914 | |||
1915 | static const struct net_offload udpv6_offload = { | ||
1916 | .callbacks = { | ||
1917 | - .gso_segment = udp6_tunnel_segment, | ||
1918 | + .gso_segment = udp6_ufo_fragment, | ||
1919 | .gro_receive = udp6_gro_receive, | ||
1920 | .gro_complete = udp6_gro_complete, | ||
1921 | }, | ||
1922 | diff --git a/net/kcm/kcmsock.c b/net/kcm/kcmsock.c | ||
1923 | index af4e76ac88ff..c5fa634e63ca 100644 | ||
1924 | --- a/net/kcm/kcmsock.c | ||
1925 | +++ b/net/kcm/kcmsock.c | ||
1926 | @@ -1625,60 +1625,35 @@ static struct proto kcm_proto = { | ||
1927 | }; | ||
1928 | |||
1929 | /* Clone a kcm socket. */ | ||
1930 | -static int kcm_clone(struct socket *osock, struct kcm_clone *info, | ||
1931 | - struct socket **newsockp) | ||
1932 | +static struct file *kcm_clone(struct socket *osock) | ||
1933 | { | ||
1934 | struct socket *newsock; | ||
1935 | struct sock *newsk; | ||
1936 | - struct file *newfile; | ||
1937 | - int err, newfd; | ||
1938 | + struct file *file; | ||
1939 | |||
1940 | - err = -ENFILE; | ||
1941 | newsock = sock_alloc(); | ||
1942 | if (!newsock) | ||
1943 | - goto out; | ||
1944 | + return ERR_PTR(-ENFILE); | ||
1945 | |||
1946 | newsock->type = osock->type; | ||
1947 | newsock->ops = osock->ops; | ||
1948 | |||
1949 | __module_get(newsock->ops->owner); | ||
1950 | |||
1951 | - newfd = get_unused_fd_flags(0); | ||
1952 | - if (unlikely(newfd < 0)) { | ||
1953 | - err = newfd; | ||
1954 | - goto out_fd_fail; | ||
1955 | - } | ||
1956 | - | ||
1957 | - newfile = sock_alloc_file(newsock, 0, osock->sk->sk_prot_creator->name); | ||
1958 | - if (unlikely(IS_ERR(newfile))) { | ||
1959 | - err = PTR_ERR(newfile); | ||
1960 | - goto out_sock_alloc_fail; | ||
1961 | - } | ||
1962 | - | ||
1963 | newsk = sk_alloc(sock_net(osock->sk), PF_KCM, GFP_KERNEL, | ||
1964 | &kcm_proto, true); | ||
1965 | if (!newsk) { | ||
1966 | - err = -ENOMEM; | ||
1967 | - goto out_sk_alloc_fail; | ||
1968 | + sock_release(newsock); | ||
1969 | + return ERR_PTR(-ENOMEM); | ||
1970 | } | ||
1971 | - | ||
1972 | sock_init_data(newsock, newsk); | ||
1973 | init_kcm_sock(kcm_sk(newsk), kcm_sk(osock->sk)->mux); | ||
1974 | |||
1975 | - fd_install(newfd, newfile); | ||
1976 | - *newsockp = newsock; | ||
1977 | - info->fd = newfd; | ||
1978 | - | ||
1979 | - return 0; | ||
1980 | + file = sock_alloc_file(newsock, 0, osock->sk->sk_prot_creator->name); | ||
1981 | + if (IS_ERR(file)) | ||
1982 | + sock_release(newsock); | ||
1983 | |||
1984 | -out_sk_alloc_fail: | ||
1985 | - fput(newfile); | ||
1986 | -out_sock_alloc_fail: | ||
1987 | - put_unused_fd(newfd); | ||
1988 | -out_fd_fail: | ||
1989 | - sock_release(newsock); | ||
1990 | -out: | ||
1991 | - return err; | ||
1992 | + return file; | ||
1993 | } | ||
1994 | |||
1995 | static int kcm_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) | ||
1996 | @@ -1708,17 +1683,25 @@ static int kcm_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) | ||
1997 | } | ||
1998 | case SIOCKCMCLONE: { | ||
1999 | struct kcm_clone info; | ||
2000 | - struct socket *newsock = NULL; | ||
2001 | - | ||
2002 | - err = kcm_clone(sock, &info, &newsock); | ||
2003 | - if (!err) { | ||
2004 | - if (copy_to_user((void __user *)arg, &info, | ||
2005 | - sizeof(info))) { | ||
2006 | - err = -EFAULT; | ||
2007 | - sys_close(info.fd); | ||
2008 | - } | ||
2009 | - } | ||
2010 | + struct file *file; | ||
2011 | + | ||
2012 | + info.fd = get_unused_fd_flags(0); | ||
2013 | + if (unlikely(info.fd < 0)) | ||
2014 | + return info.fd; | ||
2015 | |||
2016 | + file = kcm_clone(sock); | ||
2017 | + if (IS_ERR(file)) { | ||
2018 | + put_unused_fd(info.fd); | ||
2019 | + return PTR_ERR(file); | ||
2020 | + } | ||
2021 | + if (copy_to_user((void __user *)arg, &info, | ||
2022 | + sizeof(info))) { | ||
2023 | + put_unused_fd(info.fd); | ||
2024 | + fput(file); | ||
2025 | + return -EFAULT; | ||
2026 | + } | ||
2027 | + fd_install(info.fd, file); | ||
2028 | + err = 0; | ||
2029 | break; | ||
2030 | } | ||
2031 | default: | ||
2032 | diff --git a/net/openvswitch/datapath.c b/net/openvswitch/datapath.c | ||
2033 | index c3aec6227c91..363dd904733d 100644 | ||
2034 | --- a/net/openvswitch/datapath.c | ||
2035 | +++ b/net/openvswitch/datapath.c | ||
2036 | @@ -335,6 +335,8 @@ static int queue_gso_packets(struct datapath *dp, struct sk_buff *skb, | ||
2037 | const struct dp_upcall_info *upcall_info, | ||
2038 | uint32_t cutlen) | ||
2039 | { | ||
2040 | + unsigned int gso_type = skb_shinfo(skb)->gso_type; | ||
2041 | + struct sw_flow_key later_key; | ||
2042 | struct sk_buff *segs, *nskb; | ||
2043 | int err; | ||
2044 | |||
2045 | @@ -345,9 +347,21 @@ static int queue_gso_packets(struct datapath *dp, struct sk_buff *skb, | ||
2046 | if (segs == NULL) | ||
2047 | return -EINVAL; | ||
2048 | |||
2049 | + if (gso_type & SKB_GSO_UDP) { | ||
2050 | + /* The initial flow key extracted by ovs_flow_key_extract() | ||
2051 | + * in this case is for a first fragment, so we need to | ||
2052 | + * properly mark later fragments. | ||
2053 | + */ | ||
2054 | + later_key = *key; | ||
2055 | + later_key.ip.frag = OVS_FRAG_TYPE_LATER; | ||
2056 | + } | ||
2057 | + | ||
2058 | /* Queue all of the segments. */ | ||
2059 | skb = segs; | ||
2060 | do { | ||
2061 | + if (gso_type & SKB_GSO_UDP && skb != segs) | ||
2062 | + key = &later_key; | ||
2063 | + | ||
2064 | err = queue_userspace_packet(dp, skb, key, upcall_info, cutlen); | ||
2065 | if (err) | ||
2066 | break; | ||
2067 | diff --git a/net/openvswitch/flow.c b/net/openvswitch/flow.c | ||
2068 | index 8c94cef25a72..cfb652a4e007 100644 | ||
2069 | --- a/net/openvswitch/flow.c | ||
2070 | +++ b/net/openvswitch/flow.c | ||
2071 | @@ -584,7 +584,8 @@ static int key_extract(struct sk_buff *skb, struct sw_flow_key *key) | ||
2072 | key->ip.frag = OVS_FRAG_TYPE_LATER; | ||
2073 | return 0; | ||
2074 | } | ||
2075 | - if (nh->frag_off & htons(IP_MF)) | ||
2076 | + if (nh->frag_off & htons(IP_MF) || | ||
2077 | + skb_shinfo(skb)->gso_type & SKB_GSO_UDP) | ||
2078 | key->ip.frag = OVS_FRAG_TYPE_FIRST; | ||
2079 | else | ||
2080 | key->ip.frag = OVS_FRAG_TYPE_NONE; | ||
2081 | @@ -700,6 +701,9 @@ static int key_extract(struct sk_buff *skb, struct sw_flow_key *key) | ||
2082 | |||
2083 | if (key->ip.frag == OVS_FRAG_TYPE_LATER) | ||
2084 | return 0; | ||
2085 | + if (skb_shinfo(skb)->gso_type & SKB_GSO_UDP) | ||
2086 | + key->ip.frag = OVS_FRAG_TYPE_FIRST; | ||
2087 | + | ||
2088 | /* Transport layer. */ | ||
2089 | if (key->ip.proto == NEXTHDR_TCP) { | ||
2090 | if (tcphdr_ok(skb)) { | ||
2091 | diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c | ||
2092 | index 2986941164b1..f4a0587b7d5e 100644 | ||
2093 | --- a/net/packet/af_packet.c | ||
2094 | +++ b/net/packet/af_packet.c | ||
2095 | @@ -1697,7 +1697,6 @@ static int fanout_add(struct sock *sk, u16 id, u16 type_flags) | ||
2096 | atomic_long_set(&rollover->num, 0); | ||
2097 | atomic_long_set(&rollover->num_huge, 0); | ||
2098 | atomic_long_set(&rollover->num_failed, 0); | ||
2099 | - po->rollover = rollover; | ||
2100 | } | ||
2101 | |||
2102 | if (type_flags & PACKET_FANOUT_FLAG_UNIQUEID) { | ||
2103 | @@ -1755,6 +1754,8 @@ static int fanout_add(struct sock *sk, u16 id, u16 type_flags) | ||
2104 | if (refcount_read(&match->sk_ref) < PACKET_FANOUT_MAX) { | ||
2105 | __dev_remove_pack(&po->prot_hook); | ||
2106 | po->fanout = match; | ||
2107 | + po->rollover = rollover; | ||
2108 | + rollover = NULL; | ||
2109 | refcount_set(&match->sk_ref, refcount_read(&match->sk_ref) + 1); | ||
2110 | __fanout_link(sk, po); | ||
2111 | err = 0; | ||
2112 | @@ -1768,10 +1769,7 @@ static int fanout_add(struct sock *sk, u16 id, u16 type_flags) | ||
2113 | } | ||
2114 | |||
2115 | out: | ||
2116 | - if (err && rollover) { | ||
2117 | - kfree_rcu(rollover, rcu); | ||
2118 | - po->rollover = NULL; | ||
2119 | - } | ||
2120 | + kfree(rollover); | ||
2121 | mutex_unlock(&fanout_mutex); | ||
2122 | return err; | ||
2123 | } | ||
2124 | @@ -1795,11 +1793,6 @@ static struct packet_fanout *fanout_release(struct sock *sk) | ||
2125 | list_del(&f->list); | ||
2126 | else | ||
2127 | f = NULL; | ||
2128 | - | ||
2129 | - if (po->rollover) { | ||
2130 | - kfree_rcu(po->rollover, rcu); | ||
2131 | - po->rollover = NULL; | ||
2132 | - } | ||
2133 | } | ||
2134 | mutex_unlock(&fanout_mutex); | ||
2135 | |||
2136 | @@ -3039,6 +3032,7 @@ static int packet_release(struct socket *sock) | ||
2137 | synchronize_net(); | ||
2138 | |||
2139 | if (f) { | ||
2140 | + kfree(po->rollover); | ||
2141 | fanout_release_data(f); | ||
2142 | kfree(f); | ||
2143 | } | ||
2144 | @@ -3107,6 +3101,10 @@ static int packet_do_bind(struct sock *sk, const char *name, int ifindex, | ||
2145 | if (need_rehook) { | ||
2146 | if (po->running) { | ||
2147 | rcu_read_unlock(); | ||
2148 | + /* prevents packet_notifier() from calling | ||
2149 | + * register_prot_hook() | ||
2150 | + */ | ||
2151 | + po->num = 0; | ||
2152 | __unregister_prot_hook(sk, true); | ||
2153 | rcu_read_lock(); | ||
2154 | dev_curr = po->prot_hook.dev; | ||
2155 | @@ -3115,6 +3113,7 @@ static int packet_do_bind(struct sock *sk, const char *name, int ifindex, | ||
2156 | dev->ifindex); | ||
2157 | } | ||
2158 | |||
2159 | + BUG_ON(po->running); | ||
2160 | po->num = proto; | ||
2161 | po->prot_hook.type = proto; | ||
2162 | |||
2163 | @@ -3853,7 +3852,6 @@ static int packet_getsockopt(struct socket *sock, int level, int optname, | ||
2164 | void *data = &val; | ||
2165 | union tpacket_stats_u st; | ||
2166 | struct tpacket_rollover_stats rstats; | ||
2167 | - struct packet_rollover *rollover; | ||
2168 | |||
2169 | if (level != SOL_PACKET) | ||
2170 | return -ENOPROTOOPT; | ||
2171 | @@ -3932,18 +3930,13 @@ static int packet_getsockopt(struct socket *sock, int level, int optname, | ||
2172 | 0); | ||
2173 | break; | ||
2174 | case PACKET_ROLLOVER_STATS: | ||
2175 | - rcu_read_lock(); | ||
2176 | - rollover = rcu_dereference(po->rollover); | ||
2177 | - if (rollover) { | ||
2178 | - rstats.tp_all = atomic_long_read(&rollover->num); | ||
2179 | - rstats.tp_huge = atomic_long_read(&rollover->num_huge); | ||
2180 | - rstats.tp_failed = atomic_long_read(&rollover->num_failed); | ||
2181 | - data = &rstats; | ||
2182 | - lv = sizeof(rstats); | ||
2183 | - } | ||
2184 | - rcu_read_unlock(); | ||
2185 | - if (!rollover) | ||
2186 | + if (!po->rollover) | ||
2187 | return -EINVAL; | ||
2188 | + rstats.tp_all = atomic_long_read(&po->rollover->num); | ||
2189 | + rstats.tp_huge = atomic_long_read(&po->rollover->num_huge); | ||
2190 | + rstats.tp_failed = atomic_long_read(&po->rollover->num_failed); | ||
2191 | + data = &rstats; | ||
2192 | + lv = sizeof(rstats); | ||
2193 | break; | ||
2194 | case PACKET_TX_HAS_OFF: | ||
2195 | val = po->tp_tx_has_off; | ||
2196 | diff --git a/net/packet/internal.h b/net/packet/internal.h | ||
2197 | index 562fbc155006..a1d2b2319ae9 100644 | ||
2198 | --- a/net/packet/internal.h | ||
2199 | +++ b/net/packet/internal.h | ||
2200 | @@ -95,7 +95,6 @@ struct packet_fanout { | ||
2201 | |||
2202 | struct packet_rollover { | ||
2203 | int sock; | ||
2204 | - struct rcu_head rcu; | ||
2205 | atomic_long_t num; | ||
2206 | atomic_long_t num_huge; | ||
2207 | atomic_long_t num_failed; | ||
2208 | diff --git a/net/rds/rdma.c b/net/rds/rdma.c | ||
2209 | index 8886f15abe90..bc2f1e0977d6 100644 | ||
2210 | --- a/net/rds/rdma.c | ||
2211 | +++ b/net/rds/rdma.c | ||
2212 | @@ -183,7 +183,7 @@ static int __rds_rdma_map(struct rds_sock *rs, struct rds_get_mr_args *args, | ||
2213 | long i; | ||
2214 | int ret; | ||
2215 | |||
2216 | - if (rs->rs_bound_addr == 0) { | ||
2217 | + if (rs->rs_bound_addr == 0 || !rs->rs_transport) { | ||
2218 | ret = -ENOTCONN; /* XXX not a great errno */ | ||
2219 | goto out; | ||
2220 | } | ||
2221 | diff --git a/net/sched/act_csum.c b/net/sched/act_csum.c | ||
2222 | index 1c40caadcff9..d836f998117b 100644 | ||
2223 | --- a/net/sched/act_csum.c | ||
2224 | +++ b/net/sched/act_csum.c | ||
2225 | @@ -229,6 +229,9 @@ static int tcf_csum_ipv4_udp(struct sk_buff *skb, unsigned int ihl, | ||
2226 | const struct iphdr *iph; | ||
2227 | u16 ul; | ||
2228 | |||
2229 | + if (skb_is_gso(skb) && skb_shinfo(skb)->gso_type & SKB_GSO_UDP) | ||
2230 | + return 1; | ||
2231 | + | ||
2232 | /* | ||
2233 | * Support both UDP and UDPLITE checksum algorithms, Don't use | ||
2234 | * udph->len to get the real length without any protocol check, | ||
2235 | @@ -282,6 +285,9 @@ static int tcf_csum_ipv6_udp(struct sk_buff *skb, unsigned int ihl, | ||
2236 | const struct ipv6hdr *ip6h; | ||
2237 | u16 ul; | ||
2238 | |||
2239 | + if (skb_is_gso(skb) && skb_shinfo(skb)->gso_type & SKB_GSO_UDP) | ||
2240 | + return 1; | ||
2241 | + | ||
2242 | /* | ||
2243 | * Support both UDP and UDPLITE checksum algorithms, Don't use | ||
2244 | * udph->len to get the real length without any protocol check, | ||
2245 | diff --git a/net/sched/cls_bpf.c b/net/sched/cls_bpf.c | ||
2246 | index 990eb4d91d54..3a499530f321 100644 | ||
2247 | --- a/net/sched/cls_bpf.c | ||
2248 | +++ b/net/sched/cls_bpf.c | ||
2249 | @@ -246,11 +246,8 @@ static int cls_bpf_init(struct tcf_proto *tp) | ||
2250 | return 0; | ||
2251 | } | ||
2252 | |||
2253 | -static void __cls_bpf_delete_prog(struct cls_bpf_prog *prog) | ||
2254 | +static void cls_bpf_free_parms(struct cls_bpf_prog *prog) | ||
2255 | { | ||
2256 | - tcf_exts_destroy(&prog->exts); | ||
2257 | - tcf_exts_put_net(&prog->exts); | ||
2258 | - | ||
2259 | if (cls_bpf_is_ebpf(prog)) | ||
2260 | bpf_prog_put(prog->filter); | ||
2261 | else | ||
2262 | @@ -258,6 +255,14 @@ static void __cls_bpf_delete_prog(struct cls_bpf_prog *prog) | ||
2263 | |||
2264 | kfree(prog->bpf_name); | ||
2265 | kfree(prog->bpf_ops); | ||
2266 | +} | ||
2267 | + | ||
2268 | +static void __cls_bpf_delete_prog(struct cls_bpf_prog *prog) | ||
2269 | +{ | ||
2270 | + tcf_exts_destroy(&prog->exts); | ||
2271 | + tcf_exts_put_net(&prog->exts); | ||
2272 | + | ||
2273 | + cls_bpf_free_parms(prog); | ||
2274 | kfree(prog); | ||
2275 | } | ||
2276 | |||
2277 | @@ -509,10 +514,8 @@ static int cls_bpf_change(struct net *net, struct sk_buff *in_skb, | ||
2278 | goto errout; | ||
2279 | |||
2280 | ret = cls_bpf_offload(tp, prog, oldprog); | ||
2281 | - if (ret) { | ||
2282 | - __cls_bpf_delete_prog(prog); | ||
2283 | - return ret; | ||
2284 | - } | ||
2285 | + if (ret) | ||
2286 | + goto errout_parms; | ||
2287 | |||
2288 | if (!tc_in_hw(prog->gen_flags)) | ||
2289 | prog->gen_flags |= TCA_CLS_FLAGS_NOT_IN_HW; | ||
2290 | @@ -529,6 +532,8 @@ static int cls_bpf_change(struct net *net, struct sk_buff *in_skb, | ||
2291 | *arg = prog; | ||
2292 | return 0; | ||
2293 | |||
2294 | +errout_parms: | ||
2295 | + cls_bpf_free_parms(prog); | ||
2296 | errout: | ||
2297 | tcf_exts_destroy(&prog->exts); | ||
2298 | kfree(prog); | ||
2299 | diff --git a/net/sched/sch_cbq.c b/net/sched/sch_cbq.c | ||
2300 | index dcef97fa8047..aeffa320429d 100644 | ||
2301 | --- a/net/sched/sch_cbq.c | ||
2302 | +++ b/net/sched/sch_cbq.c | ||
2303 | @@ -1157,9 +1157,13 @@ static int cbq_init(struct Qdisc *sch, struct nlattr *opt) | ||
2304 | if ((q->link.R_tab = qdisc_get_rtab(r, tb[TCA_CBQ_RTAB])) == NULL) | ||
2305 | return -EINVAL; | ||
2306 | |||
2307 | + err = tcf_block_get(&q->link.block, &q->link.filter_list); | ||
2308 | + if (err) | ||
2309 | + goto put_rtab; | ||
2310 | + | ||
2311 | err = qdisc_class_hash_init(&q->clhash); | ||
2312 | if (err < 0) | ||
2313 | - goto put_rtab; | ||
2314 | + goto put_block; | ||
2315 | |||
2316 | q->link.sibling = &q->link; | ||
2317 | q->link.common.classid = sch->handle; | ||
2318 | @@ -1193,6 +1197,9 @@ static int cbq_init(struct Qdisc *sch, struct nlattr *opt) | ||
2319 | cbq_addprio(q, &q->link); | ||
2320 | return 0; | ||
2321 | |||
2322 | +put_block: | ||
2323 | + tcf_block_put(q->link.block); | ||
2324 | + | ||
2325 | put_rtab: | ||
2326 | qdisc_put_rtab(q->link.R_tab); | ||
2327 | return err; | ||
2328 | diff --git a/net/sctp/socket.c b/net/sctp/socket.c | ||
2329 | index 14c28fbfe6b8..d6163f7aefb1 100644 | ||
2330 | --- a/net/sctp/socket.c | ||
2331 | +++ b/net/sctp/socket.c | ||
2332 | @@ -187,13 +187,13 @@ static void sctp_for_each_tx_datachunk(struct sctp_association *asoc, | ||
2333 | list_for_each_entry(chunk, &t->transmitted, transmitted_list) | ||
2334 | cb(chunk); | ||
2335 | |||
2336 | - list_for_each_entry(chunk, &q->retransmit, list) | ||
2337 | + list_for_each_entry(chunk, &q->retransmit, transmitted_list) | ||
2338 | cb(chunk); | ||
2339 | |||
2340 | - list_for_each_entry(chunk, &q->sacked, list) | ||
2341 | + list_for_each_entry(chunk, &q->sacked, transmitted_list) | ||
2342 | cb(chunk); | ||
2343 | |||
2344 | - list_for_each_entry(chunk, &q->abandoned, list) | ||
2345 | + list_for_each_entry(chunk, &q->abandoned, transmitted_list) | ||
2346 | cb(chunk); | ||
2347 | |||
2348 | list_for_each_entry(chunk, &q->out_chunk_list, list) | ||
2349 | diff --git a/net/tipc/server.c b/net/tipc/server.c | ||
2350 | index 3cd6402e812c..f4c1b18c5fb0 100644 | ||
2351 | --- a/net/tipc/server.c | ||
2352 | +++ b/net/tipc/server.c | ||
2353 | @@ -313,6 +313,7 @@ static int tipc_accept_from_sock(struct tipc_conn *con) | ||
2354 | newcon->usr_data = s->tipc_conn_new(newcon->conid); | ||
2355 | if (!newcon->usr_data) { | ||
2356 | sock_release(newsock); | ||
2357 | + conn_put(newcon); | ||
2358 | return -ENOMEM; | ||
2359 | } | ||
2360 | |||
2361 | diff --git a/net/tipc/udp_media.c b/net/tipc/udp_media.c | ||
2362 | index ecca64fc6a6f..3deabcab4882 100644 | ||
2363 | --- a/net/tipc/udp_media.c | ||
2364 | +++ b/net/tipc/udp_media.c | ||
2365 | @@ -371,10 +371,6 @@ static int tipc_udp_recv(struct sock *sk, struct sk_buff *skb) | ||
2366 | goto rcu_out; | ||
2367 | } | ||
2368 | |||
2369 | - tipc_rcv(sock_net(sk), skb, b); | ||
2370 | - rcu_read_unlock(); | ||
2371 | - return 0; | ||
2372 | - | ||
2373 | rcu_out: | ||
2374 | rcu_read_unlock(); | ||
2375 | out: | ||
2376 | diff --git a/virt/kvm/arm/vgic/vgic-its.c b/virt/kvm/arm/vgic/vgic-its.c | ||
2377 | index 3108e07526af..59ce2fb49821 100644 | ||
2378 | --- a/virt/kvm/arm/vgic/vgic-its.c | ||
2379 | +++ b/virt/kvm/arm/vgic/vgic-its.c | ||
2380 | @@ -393,6 +393,7 @@ static int its_sync_lpi_pending_table(struct kvm_vcpu *vcpu) | ||
2381 | int ret = 0; | ||
2382 | u32 *intids; | ||
2383 | int nr_irqs, i; | ||
2384 | + u8 pendmask; | ||
2385 | |||
2386 | nr_irqs = vgic_copy_lpi_list(vcpu, &intids); | ||
2387 | if (nr_irqs < 0) | ||
2388 | @@ -400,7 +401,6 @@ static int its_sync_lpi_pending_table(struct kvm_vcpu *vcpu) | ||
2389 | |||
2390 | for (i = 0; i < nr_irqs; i++) { | ||
2391 | int byte_offset, bit_nr; | ||
2392 | - u8 pendmask; | ||
2393 | |||
2394 | byte_offset = intids[i] / BITS_PER_BYTE; | ||
2395 | bit_nr = intids[i] % BITS_PER_BYTE; |