Annotation of /trunk/kernel-magellan/patches-3.11/0106-3.11.7-all-fixes.patch
Parent Directory | Revision Log
Revision 2317 -
(hide annotations)
(download)
Mon Nov 18 11:55:25 2013 UTC (10 years, 7 months ago) by niro
File size: 79622 byte(s)
Mon Nov 18 11:55:25 2013 UTC (10 years, 7 months ago) by niro
File size: 79622 byte(s)
-linux-3.11.7
1 | niro | 2317 | diff --git a/Documentation/networking/ip-sysctl.txt b/Documentation/networking/ip-sysctl.txt |
2 | index 10742902146f..b522883a5a84 100644 | ||
3 | --- a/Documentation/networking/ip-sysctl.txt | ||
4 | +++ b/Documentation/networking/ip-sysctl.txt | ||
5 | @@ -478,6 +478,15 @@ tcp_syn_retries - INTEGER | ||
6 | tcp_timestamps - BOOLEAN | ||
7 | Enable timestamps as defined in RFC1323. | ||
8 | |||
9 | +tcp_min_tso_segs - INTEGER | ||
10 | + Minimal number of segments per TSO frame. | ||
11 | + Since linux-3.12, TCP does an automatic sizing of TSO frames, | ||
12 | + depending on flow rate, instead of filling 64Kbytes packets. | ||
13 | + For specific usages, it's possible to force TCP to build big | ||
14 | + TSO frames. Note that TCP stack might split too big TSO packets | ||
15 | + if available window is too small. | ||
16 | + Default: 2 | ||
17 | + | ||
18 | tcp_tso_win_divisor - INTEGER | ||
19 | This allows control over what percentage of the congestion window | ||
20 | can be consumed by a single TSO frame. | ||
21 | diff --git a/Makefile b/Makefile | ||
22 | index e87ba831bd2d..686adf7f2035 100644 | ||
23 | --- a/Makefile | ||
24 | +++ b/Makefile | ||
25 | @@ -1,6 +1,6 @@ | ||
26 | VERSION = 3 | ||
27 | PATCHLEVEL = 11 | ||
28 | -SUBLEVEL = 6 | ||
29 | +SUBLEVEL = 7 | ||
30 | EXTRAVERSION = | ||
31 | NAME = Linux for Workgroups | ||
32 | |||
33 | diff --git a/arch/arm/boot/dts/integratorcp.dts b/arch/arm/boot/dts/integratorcp.dts | ||
34 | index ff1aea0ee043..72693a69f830 100644 | ||
35 | --- a/arch/arm/boot/dts/integratorcp.dts | ||
36 | +++ b/arch/arm/boot/dts/integratorcp.dts | ||
37 | @@ -9,11 +9,6 @@ | ||
38 | model = "ARM Integrator/CP"; | ||
39 | compatible = "arm,integrator-cp"; | ||
40 | |||
41 | - aliases { | ||
42 | - arm,timer-primary = &timer2; | ||
43 | - arm,timer-secondary = &timer1; | ||
44 | - }; | ||
45 | - | ||
46 | chosen { | ||
47 | bootargs = "root=/dev/ram0 console=ttyAMA0,38400n8 earlyprintk"; | ||
48 | }; | ||
49 | @@ -24,14 +19,18 @@ | ||
50 | }; | ||
51 | |||
52 | timer0: timer@13000000 { | ||
53 | + /* TIMER0 runs @ 25MHz */ | ||
54 | compatible = "arm,integrator-cp-timer"; | ||
55 | + status = "disabled"; | ||
56 | }; | ||
57 | |||
58 | timer1: timer@13000100 { | ||
59 | + /* TIMER1 runs @ 1MHz */ | ||
60 | compatible = "arm,integrator-cp-timer"; | ||
61 | }; | ||
62 | |||
63 | timer2: timer@13000200 { | ||
64 | + /* TIMER2 runs @ 1MHz */ | ||
65 | compatible = "arm,integrator-cp-timer"; | ||
66 | }; | ||
67 | |||
68 | diff --git a/arch/arm/include/asm/syscall.h b/arch/arm/include/asm/syscall.h | ||
69 | index f1d96d4e8092..73ddd7239b33 100644 | ||
70 | --- a/arch/arm/include/asm/syscall.h | ||
71 | +++ b/arch/arm/include/asm/syscall.h | ||
72 | @@ -57,6 +57,9 @@ static inline void syscall_get_arguments(struct task_struct *task, | ||
73 | unsigned int i, unsigned int n, | ||
74 | unsigned long *args) | ||
75 | { | ||
76 | + if (n == 0) | ||
77 | + return; | ||
78 | + | ||
79 | if (i + n > SYSCALL_MAX_ARGS) { | ||
80 | unsigned long *args_bad = args + SYSCALL_MAX_ARGS - i; | ||
81 | unsigned int n_bad = n + i - SYSCALL_MAX_ARGS; | ||
82 | @@ -81,6 +84,9 @@ static inline void syscall_set_arguments(struct task_struct *task, | ||
83 | unsigned int i, unsigned int n, | ||
84 | const unsigned long *args) | ||
85 | { | ||
86 | + if (n == 0) | ||
87 | + return; | ||
88 | + | ||
89 | if (i + n > SYSCALL_MAX_ARGS) { | ||
90 | pr_warning("%s called with max args %d, handling only %d\n", | ||
91 | __func__, i + n, SYSCALL_MAX_ARGS); | ||
92 | diff --git a/drivers/connector/cn_proc.c b/drivers/connector/cn_proc.c | ||
93 | index 08ae128cce9b..c73fc2b74de2 100644 | ||
94 | --- a/drivers/connector/cn_proc.c | ||
95 | +++ b/drivers/connector/cn_proc.c | ||
96 | @@ -65,6 +65,7 @@ void proc_fork_connector(struct task_struct *task) | ||
97 | |||
98 | msg = (struct cn_msg *)buffer; | ||
99 | ev = (struct proc_event *)msg->data; | ||
100 | + memset(&ev->event_data, 0, sizeof(ev->event_data)); | ||
101 | get_seq(&msg->seq, &ev->cpu); | ||
102 | ktime_get_ts(&ts); /* get high res monotonic timestamp */ | ||
103 | put_unaligned(timespec_to_ns(&ts), (__u64 *)&ev->timestamp_ns); | ||
104 | @@ -80,6 +81,7 @@ void proc_fork_connector(struct task_struct *task) | ||
105 | memcpy(&msg->id, &cn_proc_event_id, sizeof(msg->id)); | ||
106 | msg->ack = 0; /* not used */ | ||
107 | msg->len = sizeof(*ev); | ||
108 | + msg->flags = 0; /* not used */ | ||
109 | /* If cn_netlink_send() failed, the data is not sent */ | ||
110 | cn_netlink_send(msg, CN_IDX_PROC, GFP_KERNEL); | ||
111 | } | ||
112 | @@ -96,6 +98,7 @@ void proc_exec_connector(struct task_struct *task) | ||
113 | |||
114 | msg = (struct cn_msg *)buffer; | ||
115 | ev = (struct proc_event *)msg->data; | ||
116 | + memset(&ev->event_data, 0, sizeof(ev->event_data)); | ||
117 | get_seq(&msg->seq, &ev->cpu); | ||
118 | ktime_get_ts(&ts); /* get high res monotonic timestamp */ | ||
119 | put_unaligned(timespec_to_ns(&ts), (__u64 *)&ev->timestamp_ns); | ||
120 | @@ -106,6 +109,7 @@ void proc_exec_connector(struct task_struct *task) | ||
121 | memcpy(&msg->id, &cn_proc_event_id, sizeof(msg->id)); | ||
122 | msg->ack = 0; /* not used */ | ||
123 | msg->len = sizeof(*ev); | ||
124 | + msg->flags = 0; /* not used */ | ||
125 | cn_netlink_send(msg, CN_IDX_PROC, GFP_KERNEL); | ||
126 | } | ||
127 | |||
128 | @@ -122,6 +126,7 @@ void proc_id_connector(struct task_struct *task, int which_id) | ||
129 | |||
130 | msg = (struct cn_msg *)buffer; | ||
131 | ev = (struct proc_event *)msg->data; | ||
132 | + memset(&ev->event_data, 0, sizeof(ev->event_data)); | ||
133 | ev->what = which_id; | ||
134 | ev->event_data.id.process_pid = task->pid; | ||
135 | ev->event_data.id.process_tgid = task->tgid; | ||
136 | @@ -145,6 +150,7 @@ void proc_id_connector(struct task_struct *task, int which_id) | ||
137 | memcpy(&msg->id, &cn_proc_event_id, sizeof(msg->id)); | ||
138 | msg->ack = 0; /* not used */ | ||
139 | msg->len = sizeof(*ev); | ||
140 | + msg->flags = 0; /* not used */ | ||
141 | cn_netlink_send(msg, CN_IDX_PROC, GFP_KERNEL); | ||
142 | } | ||
143 | |||
144 | @@ -160,6 +166,7 @@ void proc_sid_connector(struct task_struct *task) | ||
145 | |||
146 | msg = (struct cn_msg *)buffer; | ||
147 | ev = (struct proc_event *)msg->data; | ||
148 | + memset(&ev->event_data, 0, sizeof(ev->event_data)); | ||
149 | get_seq(&msg->seq, &ev->cpu); | ||
150 | ktime_get_ts(&ts); /* get high res monotonic timestamp */ | ||
151 | put_unaligned(timespec_to_ns(&ts), (__u64 *)&ev->timestamp_ns); | ||
152 | @@ -170,6 +177,7 @@ void proc_sid_connector(struct task_struct *task) | ||
153 | memcpy(&msg->id, &cn_proc_event_id, sizeof(msg->id)); | ||
154 | msg->ack = 0; /* not used */ | ||
155 | msg->len = sizeof(*ev); | ||
156 | + msg->flags = 0; /* not used */ | ||
157 | cn_netlink_send(msg, CN_IDX_PROC, GFP_KERNEL); | ||
158 | } | ||
159 | |||
160 | @@ -185,6 +193,7 @@ void proc_ptrace_connector(struct task_struct *task, int ptrace_id) | ||
161 | |||
162 | msg = (struct cn_msg *)buffer; | ||
163 | ev = (struct proc_event *)msg->data; | ||
164 | + memset(&ev->event_data, 0, sizeof(ev->event_data)); | ||
165 | get_seq(&msg->seq, &ev->cpu); | ||
166 | ktime_get_ts(&ts); /* get high res monotonic timestamp */ | ||
167 | put_unaligned(timespec_to_ns(&ts), (__u64 *)&ev->timestamp_ns); | ||
168 | @@ -203,6 +212,7 @@ void proc_ptrace_connector(struct task_struct *task, int ptrace_id) | ||
169 | memcpy(&msg->id, &cn_proc_event_id, sizeof(msg->id)); | ||
170 | msg->ack = 0; /* not used */ | ||
171 | msg->len = sizeof(*ev); | ||
172 | + msg->flags = 0; /* not used */ | ||
173 | cn_netlink_send(msg, CN_IDX_PROC, GFP_KERNEL); | ||
174 | } | ||
175 | |||
176 | @@ -218,6 +228,7 @@ void proc_comm_connector(struct task_struct *task) | ||
177 | |||
178 | msg = (struct cn_msg *)buffer; | ||
179 | ev = (struct proc_event *)msg->data; | ||
180 | + memset(&ev->event_data, 0, sizeof(ev->event_data)); | ||
181 | get_seq(&msg->seq, &ev->cpu); | ||
182 | ktime_get_ts(&ts); /* get high res monotonic timestamp */ | ||
183 | put_unaligned(timespec_to_ns(&ts), (__u64 *)&ev->timestamp_ns); | ||
184 | @@ -229,6 +240,7 @@ void proc_comm_connector(struct task_struct *task) | ||
185 | memcpy(&msg->id, &cn_proc_event_id, sizeof(msg->id)); | ||
186 | msg->ack = 0; /* not used */ | ||
187 | msg->len = sizeof(*ev); | ||
188 | + msg->flags = 0; /* not used */ | ||
189 | cn_netlink_send(msg, CN_IDX_PROC, GFP_KERNEL); | ||
190 | } | ||
191 | |||
192 | @@ -244,6 +256,7 @@ void proc_coredump_connector(struct task_struct *task) | ||
193 | |||
194 | msg = (struct cn_msg *)buffer; | ||
195 | ev = (struct proc_event *)msg->data; | ||
196 | + memset(&ev->event_data, 0, sizeof(ev->event_data)); | ||
197 | get_seq(&msg->seq, &ev->cpu); | ||
198 | ktime_get_ts(&ts); /* get high res monotonic timestamp */ | ||
199 | put_unaligned(timespec_to_ns(&ts), (__u64 *)&ev->timestamp_ns); | ||
200 | @@ -254,6 +267,7 @@ void proc_coredump_connector(struct task_struct *task) | ||
201 | memcpy(&msg->id, &cn_proc_event_id, sizeof(msg->id)); | ||
202 | msg->ack = 0; /* not used */ | ||
203 | msg->len = sizeof(*ev); | ||
204 | + msg->flags = 0; /* not used */ | ||
205 | cn_netlink_send(msg, CN_IDX_PROC, GFP_KERNEL); | ||
206 | } | ||
207 | |||
208 | @@ -269,6 +283,7 @@ void proc_exit_connector(struct task_struct *task) | ||
209 | |||
210 | msg = (struct cn_msg *)buffer; | ||
211 | ev = (struct proc_event *)msg->data; | ||
212 | + memset(&ev->event_data, 0, sizeof(ev->event_data)); | ||
213 | get_seq(&msg->seq, &ev->cpu); | ||
214 | ktime_get_ts(&ts); /* get high res monotonic timestamp */ | ||
215 | put_unaligned(timespec_to_ns(&ts), (__u64 *)&ev->timestamp_ns); | ||
216 | @@ -281,6 +296,7 @@ void proc_exit_connector(struct task_struct *task) | ||
217 | memcpy(&msg->id, &cn_proc_event_id, sizeof(msg->id)); | ||
218 | msg->ack = 0; /* not used */ | ||
219 | msg->len = sizeof(*ev); | ||
220 | + msg->flags = 0; /* not used */ | ||
221 | cn_netlink_send(msg, CN_IDX_PROC, GFP_KERNEL); | ||
222 | } | ||
223 | |||
224 | @@ -304,6 +320,7 @@ static void cn_proc_ack(int err, int rcvd_seq, int rcvd_ack) | ||
225 | |||
226 | msg = (struct cn_msg *)buffer; | ||
227 | ev = (struct proc_event *)msg->data; | ||
228 | + memset(&ev->event_data, 0, sizeof(ev->event_data)); | ||
229 | msg->seq = rcvd_seq; | ||
230 | ktime_get_ts(&ts); /* get high res monotonic timestamp */ | ||
231 | put_unaligned(timespec_to_ns(&ts), (__u64 *)&ev->timestamp_ns); | ||
232 | @@ -313,6 +330,7 @@ static void cn_proc_ack(int err, int rcvd_seq, int rcvd_ack) | ||
233 | memcpy(&msg->id, &cn_proc_event_id, sizeof(msg->id)); | ||
234 | msg->ack = rcvd_ack + 1; | ||
235 | msg->len = sizeof(*ev); | ||
236 | + msg->flags = 0; /* not used */ | ||
237 | cn_netlink_send(msg, CN_IDX_PROC, GFP_KERNEL); | ||
238 | } | ||
239 | |||
240 | diff --git a/drivers/connector/connector.c b/drivers/connector/connector.c | ||
241 | index 6ecfa758942c..0daa11e418b1 100644 | ||
242 | --- a/drivers/connector/connector.c | ||
243 | +++ b/drivers/connector/connector.c | ||
244 | @@ -157,17 +157,18 @@ static int cn_call_callback(struct sk_buff *skb) | ||
245 | static void cn_rx_skb(struct sk_buff *__skb) | ||
246 | { | ||
247 | struct nlmsghdr *nlh; | ||
248 | - int err; | ||
249 | struct sk_buff *skb; | ||
250 | + int len, err; | ||
251 | |||
252 | skb = skb_get(__skb); | ||
253 | |||
254 | if (skb->len >= NLMSG_HDRLEN) { | ||
255 | nlh = nlmsg_hdr(skb); | ||
256 | + len = nlmsg_len(nlh); | ||
257 | |||
258 | - if (nlh->nlmsg_len < sizeof(struct cn_msg) || | ||
259 | + if (len < (int)sizeof(struct cn_msg) || | ||
260 | skb->len < nlh->nlmsg_len || | ||
261 | - nlh->nlmsg_len > CONNECTOR_MAX_MSG_SIZE) { | ||
262 | + len > CONNECTOR_MAX_MSG_SIZE) { | ||
263 | kfree_skb(skb); | ||
264 | return; | ||
265 | } | ||
266 | diff --git a/drivers/gpio/gpio-lynxpoint.c b/drivers/gpio/gpio-lynxpoint.c | ||
267 | index 761c4705dfbb..baf301f36b42 100644 | ||
268 | --- a/drivers/gpio/gpio-lynxpoint.c | ||
269 | +++ b/drivers/gpio/gpio-lynxpoint.c | ||
270 | @@ -248,14 +248,15 @@ static void lp_gpio_irq_handler(unsigned irq, struct irq_desc *desc) | ||
271 | struct lp_gpio *lg = irq_data_get_irq_handler_data(data); | ||
272 | struct irq_chip *chip = irq_data_get_irq_chip(data); | ||
273 | u32 base, pin, mask; | ||
274 | - unsigned long reg, pending; | ||
275 | + unsigned long reg, ena, pending; | ||
276 | unsigned virq; | ||
277 | |||
278 | /* check from GPIO controller which pin triggered the interrupt */ | ||
279 | for (base = 0; base < lg->chip.ngpio; base += 32) { | ||
280 | reg = lp_gpio_reg(&lg->chip, base, LP_INT_STAT); | ||
281 | + ena = lp_gpio_reg(&lg->chip, base, LP_INT_ENABLE); | ||
282 | |||
283 | - while ((pending = inl(reg))) { | ||
284 | + while ((pending = (inl(reg) & inl(ena)))) { | ||
285 | pin = __ffs(pending); | ||
286 | mask = BIT(pin); | ||
287 | /* Clear before handling so we don't lose an edge */ | ||
288 | diff --git a/drivers/i2c/busses/i2c-ismt.c b/drivers/i2c/busses/i2c-ismt.c | ||
289 | index cd82eb44e4c4..7c9f053556f2 100644 | ||
290 | --- a/drivers/i2c/busses/i2c-ismt.c | ||
291 | +++ b/drivers/i2c/busses/i2c-ismt.c | ||
292 | @@ -393,6 +393,9 @@ static int ismt_access(struct i2c_adapter *adap, u16 addr, | ||
293 | |||
294 | desc = &priv->hw[priv->head]; | ||
295 | |||
296 | + /* Initialize the DMA buffer */ | ||
297 | + memset(priv->dma_buffer, 0, sizeof(priv->dma_buffer)); | ||
298 | + | ||
299 | /* Initialize the descriptor */ | ||
300 | memset(desc, 0, sizeof(struct ismt_desc)); | ||
301 | desc->tgtaddr_rw = ISMT_DESC_ADDR_RW(addr, read_write); | ||
302 | diff --git a/drivers/md/dm-snap-persistent.c b/drivers/md/dm-snap-persistent.c | ||
303 | index 4caa8e6d59d7..2d2b1b7588d7 100644 | ||
304 | --- a/drivers/md/dm-snap-persistent.c | ||
305 | +++ b/drivers/md/dm-snap-persistent.c | ||
306 | @@ -269,6 +269,14 @@ static chunk_t area_location(struct pstore *ps, chunk_t area) | ||
307 | return NUM_SNAPSHOT_HDR_CHUNKS + ((ps->exceptions_per_area + 1) * area); | ||
308 | } | ||
309 | |||
310 | +static void skip_metadata(struct pstore *ps) | ||
311 | +{ | ||
312 | + uint32_t stride = ps->exceptions_per_area + 1; | ||
313 | + chunk_t next_free = ps->next_free; | ||
314 | + if (sector_div(next_free, stride) == NUM_SNAPSHOT_HDR_CHUNKS) | ||
315 | + ps->next_free++; | ||
316 | +} | ||
317 | + | ||
318 | /* | ||
319 | * Read or write a metadata area. Remembering to skip the first | ||
320 | * chunk which holds the header. | ||
321 | @@ -502,6 +510,8 @@ static int read_exceptions(struct pstore *ps, | ||
322 | |||
323 | ps->current_area--; | ||
324 | |||
325 | + skip_metadata(ps); | ||
326 | + | ||
327 | return 0; | ||
328 | } | ||
329 | |||
330 | @@ -616,8 +626,6 @@ static int persistent_prepare_exception(struct dm_exception_store *store, | ||
331 | struct dm_exception *e) | ||
332 | { | ||
333 | struct pstore *ps = get_info(store); | ||
334 | - uint32_t stride; | ||
335 | - chunk_t next_free; | ||
336 | sector_t size = get_dev_size(dm_snap_cow(store->snap)->bdev); | ||
337 | |||
338 | /* Is there enough room ? */ | ||
339 | @@ -630,10 +638,8 @@ static int persistent_prepare_exception(struct dm_exception_store *store, | ||
340 | * Move onto the next free pending, making sure to take | ||
341 | * into account the location of the metadata chunks. | ||
342 | */ | ||
343 | - stride = (ps->exceptions_per_area + 1); | ||
344 | - next_free = ++ps->next_free; | ||
345 | - if (sector_div(next_free, stride) == 1) | ||
346 | - ps->next_free++; | ||
347 | + ps->next_free++; | ||
348 | + skip_metadata(ps); | ||
349 | |||
350 | atomic_inc(&ps->pending_count); | ||
351 | return 0; | ||
352 | diff --git a/drivers/net/can/dev.c b/drivers/net/can/dev.c | ||
353 | index f9cba4123c66..1870c4731a57 100644 | ||
354 | --- a/drivers/net/can/dev.c | ||
355 | +++ b/drivers/net/can/dev.c | ||
356 | @@ -705,14 +705,14 @@ static size_t can_get_size(const struct net_device *dev) | ||
357 | size_t size; | ||
358 | |||
359 | size = nla_total_size(sizeof(u32)); /* IFLA_CAN_STATE */ | ||
360 | - size += sizeof(struct can_ctrlmode); /* IFLA_CAN_CTRLMODE */ | ||
361 | + size += nla_total_size(sizeof(struct can_ctrlmode)); /* IFLA_CAN_CTRLMODE */ | ||
362 | size += nla_total_size(sizeof(u32)); /* IFLA_CAN_RESTART_MS */ | ||
363 | - size += sizeof(struct can_bittiming); /* IFLA_CAN_BITTIMING */ | ||
364 | - size += sizeof(struct can_clock); /* IFLA_CAN_CLOCK */ | ||
365 | + size += nla_total_size(sizeof(struct can_bittiming)); /* IFLA_CAN_BITTIMING */ | ||
366 | + size += nla_total_size(sizeof(struct can_clock)); /* IFLA_CAN_CLOCK */ | ||
367 | if (priv->do_get_berr_counter) /* IFLA_CAN_BERR_COUNTER */ | ||
368 | - size += sizeof(struct can_berr_counter); | ||
369 | + size += nla_total_size(sizeof(struct can_berr_counter)); | ||
370 | if (priv->bittiming_const) /* IFLA_CAN_BITTIMING_CONST */ | ||
371 | - size += sizeof(struct can_bittiming_const); | ||
372 | + size += nla_total_size(sizeof(struct can_bittiming_const)); | ||
373 | |||
374 | return size; | ||
375 | } | ||
376 | diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c | ||
377 | index 0cc26110868d..4b0877e68653 100644 | ||
378 | --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c | ||
379 | +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c | ||
380 | @@ -676,6 +676,7 @@ static void bnx2x_gro_receive(struct bnx2x *bp, struct bnx2x_fastpath *fp, | ||
381 | } | ||
382 | } | ||
383 | #endif | ||
384 | + skb_record_rx_queue(skb, fp->rx_queue); | ||
385 | napi_gro_receive(&fp->napi, skb); | ||
386 | } | ||
387 | |||
388 | diff --git a/drivers/net/ethernet/emulex/benet/be_cmds.c b/drivers/net/ethernet/emulex/benet/be_cmds.c | ||
389 | index 8ec5d74ad44d..13ac104bbf4b 100644 | ||
390 | --- a/drivers/net/ethernet/emulex/benet/be_cmds.c | ||
391 | +++ b/drivers/net/ethernet/emulex/benet/be_cmds.c | ||
392 | @@ -1150,7 +1150,6 @@ int be_cmd_txq_create(struct be_adapter *adapter, struct be_tx_obj *txo) | ||
393 | |||
394 | if (lancer_chip(adapter)) { | ||
395 | req->hdr.version = 1; | ||
396 | - req->if_id = cpu_to_le16(adapter->if_handle); | ||
397 | } else if (BEx_chip(adapter)) { | ||
398 | if (adapter->function_caps & BE_FUNCTION_CAPS_SUPER_NIC) | ||
399 | req->hdr.version = 2; | ||
400 | @@ -1158,6 +1157,8 @@ int be_cmd_txq_create(struct be_adapter *adapter, struct be_tx_obj *txo) | ||
401 | req->hdr.version = 2; | ||
402 | } | ||
403 | |||
404 | + if (req->hdr.version > 0) | ||
405 | + req->if_id = cpu_to_le16(adapter->if_handle); | ||
406 | req->num_pages = PAGES_4K_SPANNED(q_mem->va, q_mem->size); | ||
407 | req->ulp_num = BE_ULP1_NUM; | ||
408 | req->type = BE_ETH_TX_RING_TYPE_STANDARD; | ||
409 | diff --git a/drivers/net/ethernet/marvell/mv643xx_eth.c b/drivers/net/ethernet/marvell/mv643xx_eth.c | ||
410 | index c35db735958f..39334d428891 100644 | ||
411 | --- a/drivers/net/ethernet/marvell/mv643xx_eth.c | ||
412 | +++ b/drivers/net/ethernet/marvell/mv643xx_eth.c | ||
413 | @@ -1131,15 +1131,13 @@ static void mib_counters_update(struct mv643xx_eth_private *mp) | ||
414 | p->rx_discard += rdlp(mp, RX_DISCARD_FRAME_CNT); | ||
415 | p->rx_overrun += rdlp(mp, RX_OVERRUN_FRAME_CNT); | ||
416 | spin_unlock_bh(&mp->mib_counters_lock); | ||
417 | - | ||
418 | - mod_timer(&mp->mib_counters_timer, jiffies + 30 * HZ); | ||
419 | } | ||
420 | |||
421 | static void mib_counters_timer_wrapper(unsigned long _mp) | ||
422 | { | ||
423 | struct mv643xx_eth_private *mp = (void *)_mp; | ||
424 | - | ||
425 | mib_counters_update(mp); | ||
426 | + mod_timer(&mp->mib_counters_timer, jiffies + 30 * HZ); | ||
427 | } | ||
428 | |||
429 | |||
430 | @@ -2237,6 +2235,7 @@ static int mv643xx_eth_open(struct net_device *dev) | ||
431 | mp->int_mask |= INT_TX_END_0 << i; | ||
432 | } | ||
433 | |||
434 | + add_timer(&mp->mib_counters_timer); | ||
435 | port_start(mp); | ||
436 | |||
437 | wrlp(mp, INT_MASK_EXT, INT_EXT_LINK_PHY | INT_EXT_TX); | ||
438 | @@ -2916,7 +2915,6 @@ static int mv643xx_eth_probe(struct platform_device *pdev) | ||
439 | mp->mib_counters_timer.data = (unsigned long)mp; | ||
440 | mp->mib_counters_timer.function = mib_counters_timer_wrapper; | ||
441 | mp->mib_counters_timer.expires = jiffies + 30 * HZ; | ||
442 | - add_timer(&mp->mib_counters_timer); | ||
443 | |||
444 | spin_lock_init(&mp->mib_counters_lock); | ||
445 | |||
446 | diff --git a/drivers/net/ethernet/mellanox/mlx4/en_rx.c b/drivers/net/ethernet/mellanox/mlx4/en_rx.c | ||
447 | index dec455c8f627..afe2efa69c86 100644 | ||
448 | --- a/drivers/net/ethernet/mellanox/mlx4/en_rx.c | ||
449 | +++ b/drivers/net/ethernet/mellanox/mlx4/en_rx.c | ||
450 | @@ -70,14 +70,15 @@ static int mlx4_alloc_pages(struct mlx4_en_priv *priv, | ||
451 | put_page(page); | ||
452 | return -ENOMEM; | ||
453 | } | ||
454 | - page_alloc->size = PAGE_SIZE << order; | ||
455 | + page_alloc->page_size = PAGE_SIZE << order; | ||
456 | page_alloc->page = page; | ||
457 | page_alloc->dma = dma; | ||
458 | - page_alloc->offset = frag_info->frag_align; | ||
459 | + page_alloc->page_offset = frag_info->frag_align; | ||
460 | /* Not doing get_page() for each frag is a big win | ||
461 | * on asymetric workloads. | ||
462 | */ | ||
463 | - atomic_set(&page->_count, page_alloc->size / frag_info->frag_stride); | ||
464 | + atomic_set(&page->_count, | ||
465 | + page_alloc->page_size / frag_info->frag_stride); | ||
466 | return 0; | ||
467 | } | ||
468 | |||
469 | @@ -96,16 +97,19 @@ static int mlx4_en_alloc_frags(struct mlx4_en_priv *priv, | ||
470 | for (i = 0; i < priv->num_frags; i++) { | ||
471 | frag_info = &priv->frag_info[i]; | ||
472 | page_alloc[i] = ring_alloc[i]; | ||
473 | - page_alloc[i].offset += frag_info->frag_stride; | ||
474 | - if (page_alloc[i].offset + frag_info->frag_stride <= ring_alloc[i].size) | ||
475 | + page_alloc[i].page_offset += frag_info->frag_stride; | ||
476 | + | ||
477 | + if (page_alloc[i].page_offset + frag_info->frag_stride <= | ||
478 | + ring_alloc[i].page_size) | ||
479 | continue; | ||
480 | + | ||
481 | if (mlx4_alloc_pages(priv, &page_alloc[i], frag_info, gfp)) | ||
482 | goto out; | ||
483 | } | ||
484 | |||
485 | for (i = 0; i < priv->num_frags; i++) { | ||
486 | frags[i] = ring_alloc[i]; | ||
487 | - dma = ring_alloc[i].dma + ring_alloc[i].offset; | ||
488 | + dma = ring_alloc[i].dma + ring_alloc[i].page_offset; | ||
489 | ring_alloc[i] = page_alloc[i]; | ||
490 | rx_desc->data[i].addr = cpu_to_be64(dma); | ||
491 | } | ||
492 | @@ -117,7 +121,7 @@ out: | ||
493 | frag_info = &priv->frag_info[i]; | ||
494 | if (page_alloc[i].page != ring_alloc[i].page) { | ||
495 | dma_unmap_page(priv->ddev, page_alloc[i].dma, | ||
496 | - page_alloc[i].size, PCI_DMA_FROMDEVICE); | ||
497 | + page_alloc[i].page_size, PCI_DMA_FROMDEVICE); | ||
498 | page = page_alloc[i].page; | ||
499 | atomic_set(&page->_count, 1); | ||
500 | put_page(page); | ||
501 | @@ -131,10 +135,12 @@ static void mlx4_en_free_frag(struct mlx4_en_priv *priv, | ||
502 | int i) | ||
503 | { | ||
504 | const struct mlx4_en_frag_info *frag_info = &priv->frag_info[i]; | ||
505 | + u32 next_frag_end = frags[i].page_offset + 2 * frag_info->frag_stride; | ||
506 | + | ||
507 | |||
508 | - if (frags[i].offset + frag_info->frag_stride > frags[i].size) | ||
509 | - dma_unmap_page(priv->ddev, frags[i].dma, frags[i].size, | ||
510 | - PCI_DMA_FROMDEVICE); | ||
511 | + if (next_frag_end > frags[i].page_size) | ||
512 | + dma_unmap_page(priv->ddev, frags[i].dma, frags[i].page_size, | ||
513 | + PCI_DMA_FROMDEVICE); | ||
514 | |||
515 | if (frags[i].page) | ||
516 | put_page(frags[i].page); | ||
517 | @@ -161,7 +167,7 @@ out: | ||
518 | |||
519 | page_alloc = &ring->page_alloc[i]; | ||
520 | dma_unmap_page(priv->ddev, page_alloc->dma, | ||
521 | - page_alloc->size, PCI_DMA_FROMDEVICE); | ||
522 | + page_alloc->page_size, PCI_DMA_FROMDEVICE); | ||
523 | page = page_alloc->page; | ||
524 | atomic_set(&page->_count, 1); | ||
525 | put_page(page); | ||
526 | @@ -184,10 +190,11 @@ static void mlx4_en_destroy_allocator(struct mlx4_en_priv *priv, | ||
527 | i, page_count(page_alloc->page)); | ||
528 | |||
529 | dma_unmap_page(priv->ddev, page_alloc->dma, | ||
530 | - page_alloc->size, PCI_DMA_FROMDEVICE); | ||
531 | - while (page_alloc->offset + frag_info->frag_stride < page_alloc->size) { | ||
532 | + page_alloc->page_size, PCI_DMA_FROMDEVICE); | ||
533 | + while (page_alloc->page_offset + frag_info->frag_stride < | ||
534 | + page_alloc->page_size) { | ||
535 | put_page(page_alloc->page); | ||
536 | - page_alloc->offset += frag_info->frag_stride; | ||
537 | + page_alloc->page_offset += frag_info->frag_stride; | ||
538 | } | ||
539 | page_alloc->page = NULL; | ||
540 | } | ||
541 | @@ -478,7 +485,7 @@ static int mlx4_en_complete_rx_desc(struct mlx4_en_priv *priv, | ||
542 | /* Save page reference in skb */ | ||
543 | __skb_frag_set_page(&skb_frags_rx[nr], frags[nr].page); | ||
544 | skb_frag_size_set(&skb_frags_rx[nr], frag_info->frag_size); | ||
545 | - skb_frags_rx[nr].page_offset = frags[nr].offset; | ||
546 | + skb_frags_rx[nr].page_offset = frags[nr].page_offset; | ||
547 | skb->truesize += frag_info->frag_stride; | ||
548 | frags[nr].page = NULL; | ||
549 | } | ||
550 | @@ -517,7 +524,7 @@ static struct sk_buff *mlx4_en_rx_skb(struct mlx4_en_priv *priv, | ||
551 | |||
552 | /* Get pointer to first fragment so we could copy the headers into the | ||
553 | * (linear part of the) skb */ | ||
554 | - va = page_address(frags[0].page) + frags[0].offset; | ||
555 | + va = page_address(frags[0].page) + frags[0].page_offset; | ||
556 | |||
557 | if (length <= SMALL_PACKET_SIZE) { | ||
558 | /* We are copying all relevant data to the skb - temporarily | ||
559 | @@ -645,7 +652,7 @@ int mlx4_en_process_rx_cq(struct net_device *dev, struct mlx4_en_cq *cq, int bud | ||
560 | dma_sync_single_for_cpu(priv->ddev, dma, sizeof(*ethh), | ||
561 | DMA_FROM_DEVICE); | ||
562 | ethh = (struct ethhdr *)(page_address(frags[0].page) + | ||
563 | - frags[0].offset); | ||
564 | + frags[0].page_offset); | ||
565 | |||
566 | if (is_multicast_ether_addr(ethh->h_dest)) { | ||
567 | struct mlx4_mac_entry *entry; | ||
568 | diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h | ||
569 | index 5e0aa569306a..bf06e3610d27 100644 | ||
570 | --- a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h | ||
571 | +++ b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h | ||
572 | @@ -237,8 +237,8 @@ struct mlx4_en_tx_desc { | ||
573 | struct mlx4_en_rx_alloc { | ||
574 | struct page *page; | ||
575 | dma_addr_t dma; | ||
576 | - u32 offset; | ||
577 | - u32 size; | ||
578 | + u32 page_offset; | ||
579 | + u32 page_size; | ||
580 | }; | ||
581 | |||
582 | struct mlx4_en_tx_ring { | ||
583 | diff --git a/drivers/net/ethernet/ti/davinci_emac.c b/drivers/net/ethernet/ti/davinci_emac.c | ||
584 | index 1a222bce4bd7..45c167fc96c5 100644 | ||
585 | --- a/drivers/net/ethernet/ti/davinci_emac.c | ||
586 | +++ b/drivers/net/ethernet/ti/davinci_emac.c | ||
587 | @@ -876,8 +876,7 @@ static void emac_dev_mcast_set(struct net_device *ndev) | ||
588 | netdev_mc_count(ndev) > EMAC_DEF_MAX_MULTICAST_ADDRESSES) { | ||
589 | mbp_enable = (mbp_enable | EMAC_MBP_RXMCAST); | ||
590 | emac_add_mcast(priv, EMAC_ALL_MULTI_SET, NULL); | ||
591 | - } | ||
592 | - if (!netdev_mc_empty(ndev)) { | ||
593 | + } else if (!netdev_mc_empty(ndev)) { | ||
594 | struct netdev_hw_addr *ha; | ||
595 | |||
596 | mbp_enable = (mbp_enable | EMAC_MBP_RXMCAST); | ||
597 | diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c | ||
598 | index 3d2a90a62649..1d01534c2020 100644 | ||
599 | --- a/drivers/net/virtio_net.c | ||
600 | +++ b/drivers/net/virtio_net.c | ||
601 | @@ -916,7 +916,9 @@ static int virtnet_set_queues(struct virtnet_info *vi, u16 queue_pairs) | ||
602 | return -EINVAL; | ||
603 | } else { | ||
604 | vi->curr_queue_pairs = queue_pairs; | ||
605 | - schedule_delayed_work(&vi->refill, 0); | ||
606 | + /* virtnet_open() will refill when device is going to up. */ | ||
607 | + if (dev->flags & IFF_UP) | ||
608 | + schedule_delayed_work(&vi->refill, 0); | ||
609 | } | ||
610 | |||
611 | return 0; | ||
612 | @@ -1094,6 +1096,11 @@ static int virtnet_cpu_callback(struct notifier_block *nfb, | ||
613 | { | ||
614 | struct virtnet_info *vi = container_of(nfb, struct virtnet_info, nb); | ||
615 | |||
616 | + mutex_lock(&vi->config_lock); | ||
617 | + | ||
618 | + if (!vi->config_enable) | ||
619 | + goto done; | ||
620 | + | ||
621 | switch(action & ~CPU_TASKS_FROZEN) { | ||
622 | case CPU_ONLINE: | ||
623 | case CPU_DOWN_FAILED: | ||
624 | @@ -1106,6 +1113,9 @@ static int virtnet_cpu_callback(struct notifier_block *nfb, | ||
625 | default: | ||
626 | break; | ||
627 | } | ||
628 | + | ||
629 | +done: | ||
630 | + mutex_unlock(&vi->config_lock); | ||
631 | return NOTIFY_OK; | ||
632 | } | ||
633 | |||
634 | @@ -1706,7 +1716,9 @@ static int virtnet_restore(struct virtio_device *vdev) | ||
635 | vi->config_enable = true; | ||
636 | mutex_unlock(&vi->config_lock); | ||
637 | |||
638 | + rtnl_lock(); | ||
639 | virtnet_set_queues(vi, vi->curr_queue_pairs); | ||
640 | + rtnl_unlock(); | ||
641 | |||
642 | return 0; | ||
643 | } | ||
644 | diff --git a/drivers/net/wan/farsync.c b/drivers/net/wan/farsync.c | ||
645 | index 3f0c4f268751..bcfff0d62de4 100644 | ||
646 | --- a/drivers/net/wan/farsync.c | ||
647 | +++ b/drivers/net/wan/farsync.c | ||
648 | @@ -1972,6 +1972,7 @@ fst_get_iface(struct fst_card_info *card, struct fst_port_info *port, | ||
649 | } | ||
650 | |||
651 | i = port->index; | ||
652 | + memset(&sync, 0, sizeof(sync)); | ||
653 | sync.clock_rate = FST_RDL(card, portConfig[i].lineSpeed); | ||
654 | /* Lucky card and linux use same encoding here */ | ||
655 | sync.clock_type = FST_RDB(card, portConfig[i].internalClock) == | ||
656 | diff --git a/drivers/net/wan/wanxl.c b/drivers/net/wan/wanxl.c | ||
657 | index 6a24a5a70cc7..4c0a69779b89 100644 | ||
658 | --- a/drivers/net/wan/wanxl.c | ||
659 | +++ b/drivers/net/wan/wanxl.c | ||
660 | @@ -355,6 +355,7 @@ static int wanxl_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) | ||
661 | ifr->ifr_settings.size = size; /* data size wanted */ | ||
662 | return -ENOBUFS; | ||
663 | } | ||
664 | + memset(&line, 0, sizeof(line)); | ||
665 | line.clock_type = get_status(port)->clocking; | ||
666 | line.clock_rate = 0; | ||
667 | line.loopback = 0; | ||
668 | diff --git a/drivers/net/wireless/cw1200/cw1200_spi.c b/drivers/net/wireless/cw1200/cw1200_spi.c | ||
669 | index 899cad34ccd3..755a0c8edfe1 100644 | ||
670 | --- a/drivers/net/wireless/cw1200/cw1200_spi.c | ||
671 | +++ b/drivers/net/wireless/cw1200/cw1200_spi.c | ||
672 | @@ -237,7 +237,9 @@ static irqreturn_t cw1200_spi_irq_handler(int irq, void *dev_id) | ||
673 | struct hwbus_priv *self = dev_id; | ||
674 | |||
675 | if (self->core) { | ||
676 | + cw1200_spi_lock(self); | ||
677 | cw1200_irq_handler(self->core); | ||
678 | + cw1200_spi_unlock(self); | ||
679 | return IRQ_HANDLED; | ||
680 | } else { | ||
681 | return IRQ_NONE; | ||
682 | diff --git a/drivers/net/xen-netback/common.h b/drivers/net/xen-netback/common.h | ||
683 | index 8a4d77ee9c5b..4d9a5e70c992 100644 | ||
684 | --- a/drivers/net/xen-netback/common.h | ||
685 | +++ b/drivers/net/xen-netback/common.h | ||
686 | @@ -120,6 +120,7 @@ int xenvif_connect(struct xenvif *vif, unsigned long tx_ring_ref, | ||
687 | unsigned long rx_ring_ref, unsigned int tx_evtchn, | ||
688 | unsigned int rx_evtchn); | ||
689 | void xenvif_disconnect(struct xenvif *vif); | ||
690 | +void xenvif_free(struct xenvif *vif); | ||
691 | |||
692 | void xenvif_get(struct xenvif *vif); | ||
693 | void xenvif_put(struct xenvif *vif); | ||
694 | diff --git a/drivers/net/xen-netback/interface.c b/drivers/net/xen-netback/interface.c | ||
695 | index 087d2db0389d..73336c144d92 100644 | ||
696 | --- a/drivers/net/xen-netback/interface.c | ||
697 | +++ b/drivers/net/xen-netback/interface.c | ||
698 | @@ -326,6 +326,9 @@ struct xenvif *xenvif_alloc(struct device *parent, domid_t domid, | ||
699 | } | ||
700 | |||
701 | netdev_dbg(dev, "Successfully created xenvif\n"); | ||
702 | + | ||
703 | + __module_get(THIS_MODULE); | ||
704 | + | ||
705 | return vif; | ||
706 | } | ||
707 | |||
708 | @@ -413,12 +416,6 @@ void xenvif_carrier_off(struct xenvif *vif) | ||
709 | |||
710 | void xenvif_disconnect(struct xenvif *vif) | ||
711 | { | ||
712 | - /* Disconnect funtion might get called by generic framework | ||
713 | - * even before vif connects, so we need to check if we really | ||
714 | - * need to do a module_put. | ||
715 | - */ | ||
716 | - int need_module_put = 0; | ||
717 | - | ||
718 | if (netif_carrier_ok(vif->dev)) | ||
719 | xenvif_carrier_off(vif); | ||
720 | |||
721 | @@ -432,18 +429,16 @@ void xenvif_disconnect(struct xenvif *vif) | ||
722 | unbind_from_irqhandler(vif->tx_irq, vif); | ||
723 | unbind_from_irqhandler(vif->rx_irq, vif); | ||
724 | } | ||
725 | - /* vif->irq is valid, we had a module_get in | ||
726 | - * xenvif_connect. | ||
727 | - */ | ||
728 | - need_module_put = 1; | ||
729 | } | ||
730 | |||
731 | - unregister_netdev(vif->dev); | ||
732 | - | ||
733 | xen_netbk_unmap_frontend_rings(vif); | ||
734 | +} | ||
735 | + | ||
736 | +void xenvif_free(struct xenvif *vif) | ||
737 | +{ | ||
738 | + unregister_netdev(vif->dev); | ||
739 | |||
740 | free_netdev(vif->dev); | ||
741 | |||
742 | - if (need_module_put) | ||
743 | - module_put(THIS_MODULE); | ||
744 | + module_put(THIS_MODULE); | ||
745 | } | ||
746 | diff --git a/drivers/net/xen-netback/xenbus.c b/drivers/net/xen-netback/xenbus.c | ||
747 | index 1fe48fe364ed..a53782ef1540 100644 | ||
748 | --- a/drivers/net/xen-netback/xenbus.c | ||
749 | +++ b/drivers/net/xen-netback/xenbus.c | ||
750 | @@ -42,7 +42,7 @@ static int netback_remove(struct xenbus_device *dev) | ||
751 | if (be->vif) { | ||
752 | kobject_uevent(&dev->dev.kobj, KOBJ_OFFLINE); | ||
753 | xenbus_rm(XBT_NIL, dev->nodename, "hotplug-status"); | ||
754 | - xenvif_disconnect(be->vif); | ||
755 | + xenvif_free(be->vif); | ||
756 | be->vif = NULL; | ||
757 | } | ||
758 | kfree(be); | ||
759 | @@ -213,9 +213,18 @@ static void disconnect_backend(struct xenbus_device *dev) | ||
760 | { | ||
761 | struct backend_info *be = dev_get_drvdata(&dev->dev); | ||
762 | |||
763 | + if (be->vif) | ||
764 | + xenvif_disconnect(be->vif); | ||
765 | +} | ||
766 | + | ||
767 | +static void destroy_backend(struct xenbus_device *dev) | ||
768 | +{ | ||
769 | + struct backend_info *be = dev_get_drvdata(&dev->dev); | ||
770 | + | ||
771 | if (be->vif) { | ||
772 | + kobject_uevent(&dev->dev.kobj, KOBJ_OFFLINE); | ||
773 | xenbus_rm(XBT_NIL, dev->nodename, "hotplug-status"); | ||
774 | - xenvif_disconnect(be->vif); | ||
775 | + xenvif_free(be->vif); | ||
776 | be->vif = NULL; | ||
777 | } | ||
778 | } | ||
779 | @@ -246,14 +255,11 @@ static void frontend_changed(struct xenbus_device *dev, | ||
780 | case XenbusStateConnected: | ||
781 | if (dev->state == XenbusStateConnected) | ||
782 | break; | ||
783 | - backend_create_xenvif(be); | ||
784 | if (be->vif) | ||
785 | connect(be); | ||
786 | break; | ||
787 | |||
788 | case XenbusStateClosing: | ||
789 | - if (be->vif) | ||
790 | - kobject_uevent(&dev->dev.kobj, KOBJ_OFFLINE); | ||
791 | disconnect_backend(dev); | ||
792 | xenbus_switch_state(dev, XenbusStateClosing); | ||
793 | break; | ||
794 | @@ -262,6 +268,7 @@ static void frontend_changed(struct xenbus_device *dev, | ||
795 | xenbus_switch_state(dev, XenbusStateClosed); | ||
796 | if (xenbus_dev_is_online(dev)) | ||
797 | break; | ||
798 | + destroy_backend(dev); | ||
799 | /* fall through if not online */ | ||
800 | case XenbusStateUnknown: | ||
801 | device_unregister(&dev->dev); | ||
802 | diff --git a/drivers/tty/serial/vt8500_serial.c b/drivers/tty/serial/vt8500_serial.c | ||
803 | index 48af43de3467..007c2c1ee8c0 100644 | ||
804 | --- a/drivers/tty/serial/vt8500_serial.c | ||
805 | +++ b/drivers/tty/serial/vt8500_serial.c | ||
806 | @@ -559,12 +559,13 @@ static int vt8500_serial_probe(struct platform_device *pdev) | ||
807 | if (!mmres || !irqres) | ||
808 | return -ENODEV; | ||
809 | |||
810 | - if (np) | ||
811 | + if (np) { | ||
812 | port = of_alias_get_id(np, "serial"); | ||
813 | if (port >= VT8500_MAX_PORTS) | ||
814 | port = -1; | ||
815 | - else | ||
816 | + } else { | ||
817 | port = -1; | ||
818 | + } | ||
819 | |||
820 | if (port < 0) { | ||
821 | /* calculate the port id */ | ||
822 | diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c | ||
823 | index 80a7104d5ddb..f1507c052a2e 100644 | ||
824 | --- a/drivers/usb/serial/option.c | ||
825 | +++ b/drivers/usb/serial/option.c | ||
826 | @@ -451,6 +451,10 @@ static void option_instat_callback(struct urb *urb); | ||
827 | #define CHANGHONG_VENDOR_ID 0x2077 | ||
828 | #define CHANGHONG_PRODUCT_CH690 0x7001 | ||
829 | |||
830 | +/* Inovia */ | ||
831 | +#define INOVIA_VENDOR_ID 0x20a6 | ||
832 | +#define INOVIA_SEW858 0x1105 | ||
833 | + | ||
834 | /* some devices interfaces need special handling due to a number of reasons */ | ||
835 | enum option_blacklist_reason { | ||
836 | OPTION_BLACKLIST_NONE = 0, | ||
837 | @@ -1257,7 +1261,9 @@ static const struct usb_device_id option_ids[] = { | ||
838 | |||
839 | { USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD100) }, | ||
840 | { USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD145) }, | ||
841 | - { USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD200) }, | ||
842 | + { USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD200), | ||
843 | + .driver_info = (kernel_ulong_t)&net_intf6_blacklist | ||
844 | + }, | ||
845 | { USB_DEVICE(CELOT_VENDOR_ID, CELOT_PRODUCT_CT680M) }, /* CT-650 CDMA 450 1xEVDO modem */ | ||
846 | { USB_DEVICE_AND_INTERFACE_INFO(SAMSUNG_VENDOR_ID, SAMSUNG_PRODUCT_GT_B3730, USB_CLASS_CDC_DATA, 0x00, 0x00) }, /* Samsung GT-B3730 LTE USB modem.*/ | ||
847 | { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CEM600) }, | ||
848 | @@ -1345,6 +1351,7 @@ static const struct usb_device_id option_ids[] = { | ||
849 | { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x7d03, 0xff, 0x00, 0x00) }, | ||
850 | { USB_DEVICE_AND_INTERFACE_INFO(0x07d1, 0x3e01, 0xff, 0xff, 0xff) }, /* D-Link DWM-152/C1 */ | ||
851 | { USB_DEVICE_AND_INTERFACE_INFO(0x07d1, 0x3e02, 0xff, 0xff, 0xff) }, /* D-Link DWM-156/C1 */ | ||
852 | + { USB_DEVICE(INOVIA_VENDOR_ID, INOVIA_SEW858) }, | ||
853 | { } /* Terminating entry */ | ||
854 | }; | ||
855 | MODULE_DEVICE_TABLE(usb, option_ids); | ||
856 | diff --git a/drivers/usb/serial/ti_usb_3410_5052.c b/drivers/usb/serial/ti_usb_3410_5052.c | ||
857 | index 5c9f9b1d7736..4ced88ebcecb 100644 | ||
858 | --- a/drivers/usb/serial/ti_usb_3410_5052.c | ||
859 | +++ b/drivers/usb/serial/ti_usb_3410_5052.c | ||
860 | @@ -203,6 +203,7 @@ static struct usb_device_id ti_id_table_combined[19+2*TI_EXTRA_VID_PID_COUNT+1] | ||
861 | { USB_DEVICE(IBM_VENDOR_ID, IBM_454B_PRODUCT_ID) }, | ||
862 | { USB_DEVICE(IBM_VENDOR_ID, IBM_454C_PRODUCT_ID) }, | ||
863 | { USB_DEVICE(ABBOTT_VENDOR_ID, ABBOTT_PRODUCT_ID) }, | ||
864 | + { USB_DEVICE(ABBOTT_VENDOR_ID, ABBOTT_STRIP_PORT_ID) }, | ||
865 | { USB_DEVICE(TI_VENDOR_ID, FRI2_PRODUCT_ID) }, | ||
866 | { } | ||
867 | }; | ||
868 | diff --git a/drivers/w1/w1.c b/drivers/w1/w1.c | ||
869 | index 0459df843c58..15a6ddf7f3ca 100644 | ||
870 | --- a/drivers/w1/w1.c | ||
871 | +++ b/drivers/w1/w1.c | ||
872 | @@ -680,7 +680,10 @@ static int w1_attach_slave_device(struct w1_master *dev, struct w1_reg_num *rn) | ||
873 | atomic_set(&sl->refcnt, 0); | ||
874 | init_completion(&sl->released); | ||
875 | |||
876 | + /* slave modules need to be loaded in a context with unlocked mutex */ | ||
877 | + mutex_unlock(&dev->mutex); | ||
878 | request_module("w1-family-0x%0x", rn->family); | ||
879 | + mutex_lock(&dev->mutex); | ||
880 | |||
881 | spin_lock(&w1_flock); | ||
882 | f = w1_family_registered(rn->family); | ||
883 | diff --git a/fs/ext3/namei.c b/fs/ext3/namei.c | ||
884 | index 1194b1f0f839..f8cde46de9cd 100644 | ||
885 | --- a/fs/ext3/namei.c | ||
886 | +++ b/fs/ext3/namei.c | ||
887 | @@ -1783,7 +1783,7 @@ retry: | ||
888 | d_tmpfile(dentry, inode); | ||
889 | err = ext3_orphan_add(handle, inode); | ||
890 | if (err) | ||
891 | - goto err_drop_inode; | ||
892 | + goto err_unlock_inode; | ||
893 | mark_inode_dirty(inode); | ||
894 | unlock_new_inode(inode); | ||
895 | } | ||
896 | @@ -1791,10 +1791,9 @@ retry: | ||
897 | if (err == -ENOSPC && ext3_should_retry_alloc(dir->i_sb, &retries)) | ||
898 | goto retry; | ||
899 | return err; | ||
900 | -err_drop_inode: | ||
901 | +err_unlock_inode: | ||
902 | ext3_journal_stop(handle); | ||
903 | unlock_new_inode(inode); | ||
904 | - iput(inode); | ||
905 | return err; | ||
906 | } | ||
907 | |||
908 | diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c | ||
909 | index 35f55a0dbc4b..b53cbc6966a2 100644 | ||
910 | --- a/fs/ext4/namei.c | ||
911 | +++ b/fs/ext4/namei.c | ||
912 | @@ -2319,7 +2319,7 @@ retry: | ||
913 | d_tmpfile(dentry, inode); | ||
914 | err = ext4_orphan_add(handle, inode); | ||
915 | if (err) | ||
916 | - goto err_drop_inode; | ||
917 | + goto err_unlock_inode; | ||
918 | mark_inode_dirty(inode); | ||
919 | unlock_new_inode(inode); | ||
920 | } | ||
921 | @@ -2328,10 +2328,9 @@ retry: | ||
922 | if (err == -ENOSPC && ext4_should_retry_alloc(dir->i_sb, &retries)) | ||
923 | goto retry; | ||
924 | return err; | ||
925 | -err_drop_inode: | ||
926 | +err_unlock_inode: | ||
927 | ext4_journal_stop(handle); | ||
928 | unlock_new_inode(inode); | ||
929 | - iput(inode); | ||
930 | return err; | ||
931 | } | ||
932 | |||
933 | diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h | ||
934 | index 3b71a4e83642..6bd165be52e3 100644 | ||
935 | --- a/include/linux/skbuff.h | ||
936 | +++ b/include/linux/skbuff.h | ||
937 | @@ -1316,6 +1316,11 @@ static inline int skb_pagelen(const struct sk_buff *skb) | ||
938 | return len + skb_headlen(skb); | ||
939 | } | ||
940 | |||
941 | +static inline bool skb_has_frags(const struct sk_buff *skb) | ||
942 | +{ | ||
943 | + return skb_shinfo(skb)->nr_frags; | ||
944 | +} | ||
945 | + | ||
946 | /** | ||
947 | * __skb_fill_page_desc - initialise a paged fragment in an skb | ||
948 | * @skb: buffer containing fragment to be initialised | ||
949 | diff --git a/include/net/cipso_ipv4.h b/include/net/cipso_ipv4.h | ||
950 | index a7a683e30b64..a8c2ef6d3b93 100644 | ||
951 | --- a/include/net/cipso_ipv4.h | ||
952 | +++ b/include/net/cipso_ipv4.h | ||
953 | @@ -290,6 +290,7 @@ static inline int cipso_v4_validate(const struct sk_buff *skb, | ||
954 | unsigned char err_offset = 0; | ||
955 | u8 opt_len = opt[1]; | ||
956 | u8 opt_iter; | ||
957 | + u8 tag_len; | ||
958 | |||
959 | if (opt_len < 8) { | ||
960 | err_offset = 1; | ||
961 | @@ -302,11 +303,12 @@ static inline int cipso_v4_validate(const struct sk_buff *skb, | ||
962 | } | ||
963 | |||
964 | for (opt_iter = 6; opt_iter < opt_len;) { | ||
965 | - if (opt[opt_iter + 1] > (opt_len - opt_iter)) { | ||
966 | + tag_len = opt[opt_iter + 1]; | ||
967 | + if ((tag_len == 0) || (opt[opt_iter + 1] > (opt_len - opt_iter))) { | ||
968 | err_offset = opt_iter + 1; | ||
969 | goto out; | ||
970 | } | ||
971 | - opt_iter += opt[opt_iter + 1]; | ||
972 | + opt_iter += tag_len; | ||
973 | } | ||
974 | |||
975 | out: | ||
976 | diff --git a/include/net/dst.h b/include/net/dst.h | ||
977 | index 1f8fd109e225..e0c97f5a57cf 100644 | ||
978 | --- a/include/net/dst.h | ||
979 | +++ b/include/net/dst.h | ||
980 | @@ -477,10 +477,22 @@ static inline struct dst_entry *xfrm_lookup(struct net *net, | ||
981 | { | ||
982 | return dst_orig; | ||
983 | } | ||
984 | + | ||
985 | +static inline struct xfrm_state *dst_xfrm(const struct dst_entry *dst) | ||
986 | +{ | ||
987 | + return NULL; | ||
988 | +} | ||
989 | + | ||
990 | #else | ||
991 | extern struct dst_entry *xfrm_lookup(struct net *net, struct dst_entry *dst_orig, | ||
992 | const struct flowi *fl, struct sock *sk, | ||
993 | int flags); | ||
994 | + | ||
995 | +/* skb attached with this dst needs transformation if dst->xfrm is valid */ | ||
996 | +static inline struct xfrm_state *dst_xfrm(const struct dst_entry *dst) | ||
997 | +{ | ||
998 | + return dst->xfrm; | ||
999 | +} | ||
1000 | #endif | ||
1001 | |||
1002 | #endif /* _NET_DST_H */ | ||
1003 | diff --git a/include/net/ip6_route.h b/include/net/ip6_route.h | ||
1004 | index f667248202b6..c7b8860f29fd 100644 | ||
1005 | --- a/include/net/ip6_route.h | ||
1006 | +++ b/include/net/ip6_route.h | ||
1007 | @@ -196,11 +196,9 @@ static inline int ip6_skb_dst_mtu(struct sk_buff *skb) | ||
1008 | skb_dst(skb)->dev->mtu : dst_mtu(skb_dst(skb)); | ||
1009 | } | ||
1010 | |||
1011 | -static inline struct in6_addr *rt6_nexthop(struct rt6_info *rt, struct in6_addr *dest) | ||
1012 | +static inline struct in6_addr *rt6_nexthop(struct rt6_info *rt) | ||
1013 | { | ||
1014 | - if (rt->rt6i_flags & RTF_GATEWAY) | ||
1015 | - return &rt->rt6i_gateway; | ||
1016 | - return dest; | ||
1017 | + return &rt->rt6i_gateway; | ||
1018 | } | ||
1019 | |||
1020 | #endif | ||
1021 | diff --git a/include/net/sock.h b/include/net/sock.h | ||
1022 | index 31d5cfbb51ec..04e148f45277 100644 | ||
1023 | --- a/include/net/sock.h | ||
1024 | +++ b/include/net/sock.h | ||
1025 | @@ -232,6 +232,7 @@ struct cg_proto; | ||
1026 | * @sk_napi_id: id of the last napi context to receive data for sk | ||
1027 | * @sk_ll_usec: usecs to busypoll when there is no data | ||
1028 | * @sk_allocation: allocation mode | ||
1029 | + * @sk_pacing_rate: Pacing rate (if supported by transport/packet scheduler) | ||
1030 | * @sk_sndbuf: size of send buffer in bytes | ||
1031 | * @sk_flags: %SO_LINGER (l_onoff), %SO_BROADCAST, %SO_KEEPALIVE, | ||
1032 | * %SO_OOBINLINE settings, %SO_TIMESTAMPING settings | ||
1033 | @@ -361,6 +362,7 @@ struct sock { | ||
1034 | kmemcheck_bitfield_end(flags); | ||
1035 | int sk_wmem_queued; | ||
1036 | gfp_t sk_allocation; | ||
1037 | + u32 sk_pacing_rate; /* bytes per second */ | ||
1038 | netdev_features_t sk_route_caps; | ||
1039 | netdev_features_t sk_route_nocaps; | ||
1040 | int sk_gso_type; | ||
1041 | diff --git a/include/net/tcp.h b/include/net/tcp.h | ||
1042 | index d1980054ec75..46cb8a406b8f 100644 | ||
1043 | --- a/include/net/tcp.h | ||
1044 | +++ b/include/net/tcp.h | ||
1045 | @@ -284,6 +284,7 @@ extern int sysctl_tcp_thin_dupack; | ||
1046 | extern int sysctl_tcp_early_retrans; | ||
1047 | extern int sysctl_tcp_limit_output_bytes; | ||
1048 | extern int sysctl_tcp_challenge_ack_limit; | ||
1049 | +extern int sysctl_tcp_min_tso_segs; | ||
1050 | |||
1051 | extern atomic_long_t tcp_memory_allocated; | ||
1052 | extern struct percpu_counter tcp_sockets_allocated; | ||
1053 | diff --git a/mm/huge_memory.c b/mm/huge_memory.c | ||
1054 | index f2820fbf67c9..70861a1fdd64 100644 | ||
1055 | --- a/mm/huge_memory.c | ||
1056 | +++ b/mm/huge_memory.c | ||
1057 | @@ -2709,6 +2709,7 @@ void __split_huge_page_pmd(struct vm_area_struct *vma, unsigned long address, | ||
1058 | |||
1059 | mmun_start = haddr; | ||
1060 | mmun_end = haddr + HPAGE_PMD_SIZE; | ||
1061 | +again: | ||
1062 | mmu_notifier_invalidate_range_start(mm, mmun_start, mmun_end); | ||
1063 | spin_lock(&mm->page_table_lock); | ||
1064 | if (unlikely(!pmd_trans_huge(*pmd))) { | ||
1065 | @@ -2731,7 +2732,14 @@ void __split_huge_page_pmd(struct vm_area_struct *vma, unsigned long address, | ||
1066 | split_huge_page(page); | ||
1067 | |||
1068 | put_page(page); | ||
1069 | - BUG_ON(pmd_trans_huge(*pmd)); | ||
1070 | + | ||
1071 | + /* | ||
1072 | + * We don't always have down_write of mmap_sem here: a racing | ||
1073 | + * do_huge_pmd_wp_page() might have copied-on-write to another | ||
1074 | + * huge page before our split_huge_page() got the anon_vma lock. | ||
1075 | + */ | ||
1076 | + if (unlikely(pmd_trans_huge(*pmd))) | ||
1077 | + goto again; | ||
1078 | } | ||
1079 | |||
1080 | void split_huge_page_pmd_mm(struct mm_struct *mm, unsigned long address, | ||
1081 | diff --git a/mm/memory.c b/mm/memory.c | ||
1082 | index af84bc0ec17c..440986e57218 100644 | ||
1083 | --- a/mm/memory.c | ||
1084 | +++ b/mm/memory.c | ||
1085 | @@ -861,6 +861,8 @@ copy_one_pte(struct mm_struct *dst_mm, struct mm_struct *src_mm, | ||
1086 | */ | ||
1087 | make_migration_entry_read(&entry); | ||
1088 | pte = swp_entry_to_pte(entry); | ||
1089 | + if (pte_swp_soft_dirty(*src_pte)) | ||
1090 | + pte = pte_swp_mksoft_dirty(pte); | ||
1091 | set_pte_at(src_mm, addr, src_pte, pte); | ||
1092 | } | ||
1093 | } | ||
1094 | diff --git a/mm/migrate.c b/mm/migrate.c | ||
1095 | index 25ca7caf9092..81af4e678101 100644 | ||
1096 | --- a/mm/migrate.c | ||
1097 | +++ b/mm/migrate.c | ||
1098 | @@ -157,6 +157,8 @@ static int remove_migration_pte(struct page *new, struct vm_area_struct *vma, | ||
1099 | |||
1100 | get_page(new); | ||
1101 | pte = pte_mkold(mk_pte(new, vma->vm_page_prot)); | ||
1102 | + if (pte_swp_soft_dirty(*ptep)) | ||
1103 | + pte = pte_mksoft_dirty(pte); | ||
1104 | if (is_write_migration_entry(entry)) | ||
1105 | pte = pte_mkwrite(pte); | ||
1106 | #ifdef CONFIG_HUGETLB_PAGE | ||
1107 | diff --git a/mm/mprotect.c b/mm/mprotect.c | ||
1108 | index 94722a4d6b43..a3af058f68e4 100644 | ||
1109 | --- a/mm/mprotect.c | ||
1110 | +++ b/mm/mprotect.c | ||
1111 | @@ -94,13 +94,16 @@ static unsigned long change_pte_range(struct vm_area_struct *vma, pmd_t *pmd, | ||
1112 | swp_entry_t entry = pte_to_swp_entry(oldpte); | ||
1113 | |||
1114 | if (is_write_migration_entry(entry)) { | ||
1115 | + pte_t newpte; | ||
1116 | /* | ||
1117 | * A protection check is difficult so | ||
1118 | * just be safe and disable write | ||
1119 | */ | ||
1120 | make_migration_entry_read(&entry); | ||
1121 | - set_pte_at(mm, addr, pte, | ||
1122 | - swp_entry_to_pte(entry)); | ||
1123 | + newpte = swp_entry_to_pte(entry); | ||
1124 | + if (pte_swp_soft_dirty(oldpte)) | ||
1125 | + newpte = pte_swp_mksoft_dirty(newpte); | ||
1126 | + set_pte_at(mm, addr, pte, newpte); | ||
1127 | } | ||
1128 | pages++; | ||
1129 | } | ||
1130 | diff --git a/mm/page-writeback.c b/mm/page-writeback.c | ||
1131 | index 3f0c895c71fe..241a746f864c 100644 | ||
1132 | --- a/mm/page-writeback.c | ||
1133 | +++ b/mm/page-writeback.c | ||
1134 | @@ -1104,11 +1104,11 @@ static unsigned long dirty_poll_interval(unsigned long dirty, | ||
1135 | return 1; | ||
1136 | } | ||
1137 | |||
1138 | -static long bdi_max_pause(struct backing_dev_info *bdi, | ||
1139 | - unsigned long bdi_dirty) | ||
1140 | +static unsigned long bdi_max_pause(struct backing_dev_info *bdi, | ||
1141 | + unsigned long bdi_dirty) | ||
1142 | { | ||
1143 | - long bw = bdi->avg_write_bandwidth; | ||
1144 | - long t; | ||
1145 | + unsigned long bw = bdi->avg_write_bandwidth; | ||
1146 | + unsigned long t; | ||
1147 | |||
1148 | /* | ||
1149 | * Limit pause time for small memory systems. If sleeping for too long | ||
1150 | @@ -1120,7 +1120,7 @@ static long bdi_max_pause(struct backing_dev_info *bdi, | ||
1151 | t = bdi_dirty / (1 + bw / roundup_pow_of_two(1 + HZ / 8)); | ||
1152 | t++; | ||
1153 | |||
1154 | - return min_t(long, t, MAX_PAUSE); | ||
1155 | + return min_t(unsigned long, t, MAX_PAUSE); | ||
1156 | } | ||
1157 | |||
1158 | static long bdi_min_pause(struct backing_dev_info *bdi, | ||
1159 | diff --git a/mm/zswap.c b/mm/zswap.c | ||
1160 | index deda2b671e12..cbd9578c1e88 100644 | ||
1161 | --- a/mm/zswap.c | ||
1162 | +++ b/mm/zswap.c | ||
1163 | @@ -816,6 +816,10 @@ static void zswap_frontswap_invalidate_area(unsigned type) | ||
1164 | } | ||
1165 | tree->rbroot = RB_ROOT; | ||
1166 | spin_unlock(&tree->lock); | ||
1167 | + | ||
1168 | + zbud_destroy_pool(tree->pool); | ||
1169 | + kfree(tree); | ||
1170 | + zswap_trees[type] = NULL; | ||
1171 | } | ||
1172 | |||
1173 | static struct zbud_ops zswap_zbud_ops = { | ||
1174 | diff --git a/net/8021q/vlan_netlink.c b/net/8021q/vlan_netlink.c | ||
1175 | index 309129732285..c7e634af8516 100644 | ||
1176 | --- a/net/8021q/vlan_netlink.c | ||
1177 | +++ b/net/8021q/vlan_netlink.c | ||
1178 | @@ -171,7 +171,7 @@ static size_t vlan_get_size(const struct net_device *dev) | ||
1179 | |||
1180 | return nla_total_size(2) + /* IFLA_VLAN_PROTOCOL */ | ||
1181 | nla_total_size(2) + /* IFLA_VLAN_ID */ | ||
1182 | - sizeof(struct ifla_vlan_flags) + /* IFLA_VLAN_FLAGS */ | ||
1183 | + nla_total_size(sizeof(struct ifla_vlan_flags)) + /* IFLA_VLAN_FLAGS */ | ||
1184 | vlan_qos_map_size(vlan->nr_ingress_mappings) + | ||
1185 | vlan_qos_map_size(vlan->nr_egress_mappings); | ||
1186 | } | ||
1187 | diff --git a/net/batman-adv/main.c b/net/batman-adv/main.c | ||
1188 | index 08125f3f6064..c8e0671422a3 100644 | ||
1189 | --- a/net/batman-adv/main.c | ||
1190 | +++ b/net/batman-adv/main.c | ||
1191 | @@ -61,6 +61,7 @@ static int __init batadv_init(void) | ||
1192 | batadv_recv_handler_init(); | ||
1193 | |||
1194 | batadv_iv_init(); | ||
1195 | + batadv_nc_init(); | ||
1196 | |||
1197 | batadv_event_workqueue = create_singlethread_workqueue("bat_events"); | ||
1198 | |||
1199 | @@ -138,7 +139,7 @@ int batadv_mesh_init(struct net_device *soft_iface) | ||
1200 | if (ret < 0) | ||
1201 | goto err; | ||
1202 | |||
1203 | - ret = batadv_nc_init(bat_priv); | ||
1204 | + ret = batadv_nc_mesh_init(bat_priv); | ||
1205 | if (ret < 0) | ||
1206 | goto err; | ||
1207 | |||
1208 | @@ -163,7 +164,7 @@ void batadv_mesh_free(struct net_device *soft_iface) | ||
1209 | batadv_vis_quit(bat_priv); | ||
1210 | |||
1211 | batadv_gw_node_purge(bat_priv); | ||
1212 | - batadv_nc_free(bat_priv); | ||
1213 | + batadv_nc_mesh_free(bat_priv); | ||
1214 | batadv_dat_free(bat_priv); | ||
1215 | batadv_bla_free(bat_priv); | ||
1216 | |||
1217 | diff --git a/net/batman-adv/network-coding.c b/net/batman-adv/network-coding.c | ||
1218 | index a487d46e0aec..4ecc0b6bf8ab 100644 | ||
1219 | --- a/net/batman-adv/network-coding.c | ||
1220 | +++ b/net/batman-adv/network-coding.c | ||
1221 | @@ -35,6 +35,20 @@ static int batadv_nc_recv_coded_packet(struct sk_buff *skb, | ||
1222 | struct batadv_hard_iface *recv_if); | ||
1223 | |||
1224 | /** | ||
1225 | + * batadv_nc_init - one-time initialization for network coding | ||
1226 | + */ | ||
1227 | +int __init batadv_nc_init(void) | ||
1228 | +{ | ||
1229 | + int ret; | ||
1230 | + | ||
1231 | + /* Register our packet type */ | ||
1232 | + ret = batadv_recv_handler_register(BATADV_CODED, | ||
1233 | + batadv_nc_recv_coded_packet); | ||
1234 | + | ||
1235 | + return ret; | ||
1236 | +} | ||
1237 | + | ||
1238 | +/** | ||
1239 | * batadv_nc_start_timer - initialise the nc periodic worker | ||
1240 | * @bat_priv: the bat priv with all the soft interface information | ||
1241 | */ | ||
1242 | @@ -45,10 +59,10 @@ static void batadv_nc_start_timer(struct batadv_priv *bat_priv) | ||
1243 | } | ||
1244 | |||
1245 | /** | ||
1246 | - * batadv_nc_init - initialise coding hash table and start house keeping | ||
1247 | + * batadv_nc_mesh_init - initialise coding hash table and start house keeping | ||
1248 | * @bat_priv: the bat priv with all the soft interface information | ||
1249 | */ | ||
1250 | -int batadv_nc_init(struct batadv_priv *bat_priv) | ||
1251 | +int batadv_nc_mesh_init(struct batadv_priv *bat_priv) | ||
1252 | { | ||
1253 | bat_priv->nc.timestamp_fwd_flush = jiffies; | ||
1254 | bat_priv->nc.timestamp_sniffed_purge = jiffies; | ||
1255 | @@ -70,11 +84,6 @@ int batadv_nc_init(struct batadv_priv *bat_priv) | ||
1256 | batadv_hash_set_lock_class(bat_priv->nc.coding_hash, | ||
1257 | &batadv_nc_decoding_hash_lock_class_key); | ||
1258 | |||
1259 | - /* Register our packet type */ | ||
1260 | - if (batadv_recv_handler_register(BATADV_CODED, | ||
1261 | - batadv_nc_recv_coded_packet) < 0) | ||
1262 | - goto err; | ||
1263 | - | ||
1264 | INIT_DELAYED_WORK(&bat_priv->nc.work, batadv_nc_worker); | ||
1265 | batadv_nc_start_timer(bat_priv); | ||
1266 | |||
1267 | @@ -1721,12 +1730,11 @@ free_nc_packet: | ||
1268 | } | ||
1269 | |||
1270 | /** | ||
1271 | - * batadv_nc_free - clean up network coding memory | ||
1272 | + * batadv_nc_mesh_free - clean up network coding memory | ||
1273 | * @bat_priv: the bat priv with all the soft interface information | ||
1274 | */ | ||
1275 | -void batadv_nc_free(struct batadv_priv *bat_priv) | ||
1276 | +void batadv_nc_mesh_free(struct batadv_priv *bat_priv) | ||
1277 | { | ||
1278 | - batadv_recv_handler_unregister(BATADV_CODED); | ||
1279 | cancel_delayed_work_sync(&bat_priv->nc.work); | ||
1280 | |||
1281 | batadv_nc_purge_paths(bat_priv, bat_priv->nc.coding_hash, NULL); | ||
1282 | diff --git a/net/batman-adv/network-coding.h b/net/batman-adv/network-coding.h | ||
1283 | index 85a4ec81ad50..ddfa618e80bf 100644 | ||
1284 | --- a/net/batman-adv/network-coding.h | ||
1285 | +++ b/net/batman-adv/network-coding.h | ||
1286 | @@ -22,8 +22,9 @@ | ||
1287 | |||
1288 | #ifdef CONFIG_BATMAN_ADV_NC | ||
1289 | |||
1290 | -int batadv_nc_init(struct batadv_priv *bat_priv); | ||
1291 | -void batadv_nc_free(struct batadv_priv *bat_priv); | ||
1292 | +int batadv_nc_init(void); | ||
1293 | +int batadv_nc_mesh_init(struct batadv_priv *bat_priv); | ||
1294 | +void batadv_nc_mesh_free(struct batadv_priv *bat_priv); | ||
1295 | void batadv_nc_update_nc_node(struct batadv_priv *bat_priv, | ||
1296 | struct batadv_orig_node *orig_node, | ||
1297 | struct batadv_orig_node *orig_neigh_node, | ||
1298 | @@ -46,12 +47,17 @@ int batadv_nc_init_debugfs(struct batadv_priv *bat_priv); | ||
1299 | |||
1300 | #else /* ifdef CONFIG_BATMAN_ADV_NC */ | ||
1301 | |||
1302 | -static inline int batadv_nc_init(struct batadv_priv *bat_priv) | ||
1303 | +static inline int batadv_nc_init(void) | ||
1304 | { | ||
1305 | return 0; | ||
1306 | } | ||
1307 | |||
1308 | -static inline void batadv_nc_free(struct batadv_priv *bat_priv) | ||
1309 | +static inline int batadv_nc_mesh_init(struct batadv_priv *bat_priv) | ||
1310 | +{ | ||
1311 | + return 0; | ||
1312 | +} | ||
1313 | + | ||
1314 | +static inline void batadv_nc_mesh_free(struct batadv_priv *bat_priv) | ||
1315 | { | ||
1316 | return; | ||
1317 | } | ||
1318 | diff --git a/net/bridge/br_mdb.c b/net/bridge/br_mdb.c | ||
1319 | index 6319c4333c39..de3a0e76ab75 100644 | ||
1320 | --- a/net/bridge/br_mdb.c | ||
1321 | +++ b/net/bridge/br_mdb.c | ||
1322 | @@ -451,7 +451,7 @@ static int __br_mdb_del(struct net_bridge *br, struct br_mdb_entry *entry) | ||
1323 | call_rcu_bh(&p->rcu, br_multicast_free_pg); | ||
1324 | err = 0; | ||
1325 | |||
1326 | - if (!mp->ports && !mp->mglist && mp->timer_armed && | ||
1327 | + if (!mp->ports && !mp->mglist && | ||
1328 | netif_running(br->dev)) | ||
1329 | mod_timer(&mp->timer, jiffies); | ||
1330 | break; | ||
1331 | diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c | ||
1332 | index bbcb43582496..fbad619c70b7 100644 | ||
1333 | --- a/net/bridge/br_multicast.c | ||
1334 | +++ b/net/bridge/br_multicast.c | ||
1335 | @@ -271,7 +271,7 @@ static void br_multicast_del_pg(struct net_bridge *br, | ||
1336 | del_timer(&p->timer); | ||
1337 | call_rcu_bh(&p->rcu, br_multicast_free_pg); | ||
1338 | |||
1339 | - if (!mp->ports && !mp->mglist && mp->timer_armed && | ||
1340 | + if (!mp->ports && !mp->mglist && | ||
1341 | netif_running(br->dev)) | ||
1342 | mod_timer(&mp->timer, jiffies); | ||
1343 | |||
1344 | @@ -619,7 +619,6 @@ rehash: | ||
1345 | |||
1346 | mp->br = br; | ||
1347 | mp->addr = *group; | ||
1348 | - | ||
1349 | setup_timer(&mp->timer, br_multicast_group_expired, | ||
1350 | (unsigned long)mp); | ||
1351 | |||
1352 | @@ -659,6 +658,7 @@ static int br_multicast_add_group(struct net_bridge *br, | ||
1353 | struct net_bridge_mdb_entry *mp; | ||
1354 | struct net_bridge_port_group *p; | ||
1355 | struct net_bridge_port_group __rcu **pp; | ||
1356 | + unsigned long now = jiffies; | ||
1357 | int err; | ||
1358 | |||
1359 | spin_lock(&br->multicast_lock); | ||
1360 | @@ -673,6 +673,7 @@ static int br_multicast_add_group(struct net_bridge *br, | ||
1361 | |||
1362 | if (!port) { | ||
1363 | mp->mglist = true; | ||
1364 | + mod_timer(&mp->timer, now + br->multicast_membership_interval); | ||
1365 | goto out; | ||
1366 | } | ||
1367 | |||
1368 | @@ -680,7 +681,7 @@ static int br_multicast_add_group(struct net_bridge *br, | ||
1369 | (p = mlock_dereference(*pp, br)) != NULL; | ||
1370 | pp = &p->next) { | ||
1371 | if (p->port == port) | ||
1372 | - goto out; | ||
1373 | + goto found; | ||
1374 | if ((unsigned long)p->port < (unsigned long)port) | ||
1375 | break; | ||
1376 | } | ||
1377 | @@ -691,6 +692,8 @@ static int br_multicast_add_group(struct net_bridge *br, | ||
1378 | rcu_assign_pointer(*pp, p); | ||
1379 | br_mdb_notify(br->dev, port, group, RTM_NEWMDB); | ||
1380 | |||
1381 | +found: | ||
1382 | + mod_timer(&p->timer, now + br->multicast_membership_interval); | ||
1383 | out: | ||
1384 | err = 0; | ||
1385 | |||
1386 | @@ -1190,9 +1193,6 @@ static int br_ip4_multicast_query(struct net_bridge *br, | ||
1387 | if (!mp) | ||
1388 | goto out; | ||
1389 | |||
1390 | - mod_timer(&mp->timer, now + br->multicast_membership_interval); | ||
1391 | - mp->timer_armed = true; | ||
1392 | - | ||
1393 | max_delay *= br->multicast_last_member_count; | ||
1394 | |||
1395 | if (mp->mglist && | ||
1396 | @@ -1269,9 +1269,6 @@ static int br_ip6_multicast_query(struct net_bridge *br, | ||
1397 | if (!mp) | ||
1398 | goto out; | ||
1399 | |||
1400 | - mod_timer(&mp->timer, now + br->multicast_membership_interval); | ||
1401 | - mp->timer_armed = true; | ||
1402 | - | ||
1403 | max_delay *= br->multicast_last_member_count; | ||
1404 | if (mp->mglist && | ||
1405 | (timer_pending(&mp->timer) ? | ||
1406 | @@ -1357,7 +1354,7 @@ static void br_multicast_leave_group(struct net_bridge *br, | ||
1407 | call_rcu_bh(&p->rcu, br_multicast_free_pg); | ||
1408 | br_mdb_notify(br->dev, port, group, RTM_DELMDB); | ||
1409 | |||
1410 | - if (!mp->ports && !mp->mglist && mp->timer_armed && | ||
1411 | + if (!mp->ports && !mp->mglist && | ||
1412 | netif_running(br->dev)) | ||
1413 | mod_timer(&mp->timer, jiffies); | ||
1414 | } | ||
1415 | @@ -1369,12 +1366,30 @@ static void br_multicast_leave_group(struct net_bridge *br, | ||
1416 | br->multicast_last_member_interval; | ||
1417 | |||
1418 | if (!port) { | ||
1419 | - if (mp->mglist && mp->timer_armed && | ||
1420 | + if (mp->mglist && | ||
1421 | (timer_pending(&mp->timer) ? | ||
1422 | time_after(mp->timer.expires, time) : | ||
1423 | try_to_del_timer_sync(&mp->timer) >= 0)) { | ||
1424 | mod_timer(&mp->timer, time); | ||
1425 | } | ||
1426 | + | ||
1427 | + goto out; | ||
1428 | + } | ||
1429 | + | ||
1430 | + for (p = mlock_dereference(mp->ports, br); | ||
1431 | + p != NULL; | ||
1432 | + p = mlock_dereference(p->next, br)) { | ||
1433 | + if (p->port != port) | ||
1434 | + continue; | ||
1435 | + | ||
1436 | + if (!hlist_unhashed(&p->mglist) && | ||
1437 | + (timer_pending(&p->timer) ? | ||
1438 | + time_after(p->timer.expires, time) : | ||
1439 | + try_to_del_timer_sync(&p->timer) >= 0)) { | ||
1440 | + mod_timer(&p->timer, time); | ||
1441 | + } | ||
1442 | + | ||
1443 | + break; | ||
1444 | } | ||
1445 | out: | ||
1446 | spin_unlock(&br->multicast_lock); | ||
1447 | @@ -1791,7 +1806,6 @@ void br_multicast_stop(struct net_bridge *br) | ||
1448 | hlist_for_each_entry_safe(mp, n, &mdb->mhash[i], | ||
1449 | hlist[ver]) { | ||
1450 | del_timer(&mp->timer); | ||
1451 | - mp->timer_armed = false; | ||
1452 | call_rcu_bh(&mp->rcu, br_multicast_free_group); | ||
1453 | } | ||
1454 | } | ||
1455 | diff --git a/net/bridge/br_private.h b/net/bridge/br_private.h | ||
1456 | index cde1eb14d9a2..aa05bd80e9bb 100644 | ||
1457 | --- a/net/bridge/br_private.h | ||
1458 | +++ b/net/bridge/br_private.h | ||
1459 | @@ -126,7 +126,6 @@ struct net_bridge_mdb_entry | ||
1460 | struct timer_list timer; | ||
1461 | struct br_ip addr; | ||
1462 | bool mglist; | ||
1463 | - bool timer_armed; | ||
1464 | }; | ||
1465 | |||
1466 | struct net_bridge_mdb_htable | ||
1467 | diff --git a/net/bridge/br_stp_if.c b/net/bridge/br_stp_if.c | ||
1468 | index 108084a04671..656a6f3e40de 100644 | ||
1469 | --- a/net/bridge/br_stp_if.c | ||
1470 | +++ b/net/bridge/br_stp_if.c | ||
1471 | @@ -134,7 +134,7 @@ static void br_stp_start(struct net_bridge *br) | ||
1472 | |||
1473 | if (br->bridge_forward_delay < BR_MIN_FORWARD_DELAY) | ||
1474 | __br_set_forward_delay(br, BR_MIN_FORWARD_DELAY); | ||
1475 | - else if (br->bridge_forward_delay < BR_MAX_FORWARD_DELAY) | ||
1476 | + else if (br->bridge_forward_delay > BR_MAX_FORWARD_DELAY) | ||
1477 | __br_set_forward_delay(br, BR_MAX_FORWARD_DELAY); | ||
1478 | |||
1479 | if (r == 0) { | ||
1480 | diff --git a/net/compat.c b/net/compat.c | ||
1481 | index f0a1ba6c8086..89032580bd1d 100644 | ||
1482 | --- a/net/compat.c | ||
1483 | +++ b/net/compat.c | ||
1484 | @@ -71,6 +71,8 @@ int get_compat_msghdr(struct msghdr *kmsg, struct compat_msghdr __user *umsg) | ||
1485 | __get_user(kmsg->msg_controllen, &umsg->msg_controllen) || | ||
1486 | __get_user(kmsg->msg_flags, &umsg->msg_flags)) | ||
1487 | return -EFAULT; | ||
1488 | + if (kmsg->msg_namelen > sizeof(struct sockaddr_storage)) | ||
1489 | + return -EINVAL; | ||
1490 | kmsg->msg_name = compat_ptr(tmp1); | ||
1491 | kmsg->msg_iov = compat_ptr(tmp2); | ||
1492 | kmsg->msg_control = compat_ptr(tmp3); | ||
1493 | diff --git a/net/core/secure_seq.c b/net/core/secure_seq.c | ||
1494 | index 3f1ec1586ae1..8d9d05edd2eb 100644 | ||
1495 | --- a/net/core/secure_seq.c | ||
1496 | +++ b/net/core/secure_seq.c | ||
1497 | @@ -10,6 +10,7 @@ | ||
1498 | |||
1499 | #include <net/secure_seq.h> | ||
1500 | |||
1501 | +#if IS_ENABLED(CONFIG_IPV6) || IS_ENABLED(CONFIG_INET) | ||
1502 | #define NET_SECRET_SIZE (MD5_MESSAGE_BYTES / 4) | ||
1503 | |||
1504 | static u32 net_secret[NET_SECRET_SIZE] ____cacheline_aligned; | ||
1505 | @@ -29,6 +30,7 @@ static void net_secret_init(void) | ||
1506 | cmpxchg(&net_secret[--i], 0, tmp); | ||
1507 | } | ||
1508 | } | ||
1509 | +#endif | ||
1510 | |||
1511 | #ifdef CONFIG_INET | ||
1512 | static u32 seq_scale(u32 seq) | ||
1513 | diff --git a/net/core/sock.c b/net/core/sock.c | ||
1514 | index 2c097c5a35dd..8729d9135790 100644 | ||
1515 | --- a/net/core/sock.c | ||
1516 | +++ b/net/core/sock.c | ||
1517 | @@ -2297,6 +2297,7 @@ void sock_init_data(struct socket *sock, struct sock *sk) | ||
1518 | sk->sk_ll_usec = sysctl_net_busy_read; | ||
1519 | #endif | ||
1520 | |||
1521 | + sk->sk_pacing_rate = ~0U; | ||
1522 | /* | ||
1523 | * Before updating sk_refcnt, we must commit prior changes to memory | ||
1524 | * (Documentation/RCU/rculist_nulls.txt for details) | ||
1525 | diff --git a/net/ipv4/inet_hashtables.c b/net/ipv4/inet_hashtables.c | ||
1526 | index 7bd8983dbfcf..96da9c77deca 100644 | ||
1527 | --- a/net/ipv4/inet_hashtables.c | ||
1528 | +++ b/net/ipv4/inet_hashtables.c | ||
1529 | @@ -287,7 +287,7 @@ begintw: | ||
1530 | if (unlikely(!INET_TW_MATCH(sk, net, acookie, | ||
1531 | saddr, daddr, ports, | ||
1532 | dif))) { | ||
1533 | - sock_put(sk); | ||
1534 | + inet_twsk_put(inet_twsk(sk)); | ||
1535 | goto begintw; | ||
1536 | } | ||
1537 | goto out; | ||
1538 | diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c | ||
1539 | index a04d872c54f9..7f4ab5d31c16 100644 | ||
1540 | --- a/net/ipv4/ip_output.c | ||
1541 | +++ b/net/ipv4/ip_output.c | ||
1542 | @@ -836,7 +836,7 @@ static int __ip_append_data(struct sock *sk, | ||
1543 | csummode = CHECKSUM_PARTIAL; | ||
1544 | |||
1545 | cork->length += length; | ||
1546 | - if (((length > mtu) || (skb && skb_is_gso(skb))) && | ||
1547 | + if (((length > mtu) || (skb && skb_has_frags(skb))) && | ||
1548 | (sk->sk_protocol == IPPROTO_UDP) && | ||
1549 | (rt->dst.dev->features & NETIF_F_UFO) && !rt->dst.header_len) { | ||
1550 | err = ip_ufo_append_data(sk, queue, getfrag, from, length, | ||
1551 | diff --git a/net/ipv4/ip_vti.c b/net/ipv4/ip_vti.c | ||
1552 | index 17cc0ffa8c0d..065604127418 100644 | ||
1553 | --- a/net/ipv4/ip_vti.c | ||
1554 | +++ b/net/ipv4/ip_vti.c | ||
1555 | @@ -285,8 +285,17 @@ static int vti_rcv(struct sk_buff *skb) | ||
1556 | tunnel = vti_tunnel_lookup(dev_net(skb->dev), iph->saddr, iph->daddr); | ||
1557 | if (tunnel != NULL) { | ||
1558 | struct pcpu_tstats *tstats; | ||
1559 | + u32 oldmark = skb->mark; | ||
1560 | + int ret; | ||
1561 | |||
1562 | - if (!xfrm4_policy_check(NULL, XFRM_POLICY_IN, skb)) | ||
1563 | + | ||
1564 | + /* temporarily mark the skb with the tunnel o_key, to | ||
1565 | + * only match policies with this mark. | ||
1566 | + */ | ||
1567 | + skb->mark = be32_to_cpu(tunnel->parms.o_key); | ||
1568 | + ret = xfrm4_policy_check(NULL, XFRM_POLICY_IN, skb); | ||
1569 | + skb->mark = oldmark; | ||
1570 | + if (!ret) | ||
1571 | return -1; | ||
1572 | |||
1573 | tstats = this_cpu_ptr(tunnel->dev->tstats); | ||
1574 | @@ -295,7 +304,6 @@ static int vti_rcv(struct sk_buff *skb) | ||
1575 | tstats->rx_bytes += skb->len; | ||
1576 | u64_stats_update_end(&tstats->syncp); | ||
1577 | |||
1578 | - skb->mark = 0; | ||
1579 | secpath_reset(skb); | ||
1580 | skb->dev = tunnel->dev; | ||
1581 | return 1; | ||
1582 | @@ -327,7 +335,7 @@ static netdev_tx_t vti_tunnel_xmit(struct sk_buff *skb, struct net_device *dev) | ||
1583 | |||
1584 | memset(&fl4, 0, sizeof(fl4)); | ||
1585 | flowi4_init_output(&fl4, tunnel->parms.link, | ||
1586 | - be32_to_cpu(tunnel->parms.i_key), RT_TOS(tos), | ||
1587 | + be32_to_cpu(tunnel->parms.o_key), RT_TOS(tos), | ||
1588 | RT_SCOPE_UNIVERSE, | ||
1589 | IPPROTO_IPIP, 0, | ||
1590 | dst, tiph->saddr, 0, 0); | ||
1591 | diff --git a/net/ipv4/route.c b/net/ipv4/route.c | ||
1592 | index a9a54a236832..2de16d940528 100644 | ||
1593 | --- a/net/ipv4/route.c | ||
1594 | +++ b/net/ipv4/route.c | ||
1595 | @@ -2074,7 +2074,7 @@ struct rtable *__ip_route_output_key(struct net *net, struct flowi4 *fl4) | ||
1596 | RT_SCOPE_LINK); | ||
1597 | goto make_route; | ||
1598 | } | ||
1599 | - if (fl4->saddr) { | ||
1600 | + if (!fl4->saddr) { | ||
1601 | if (ipv4_is_multicast(fl4->daddr)) | ||
1602 | fl4->saddr = inet_select_addr(dev_out, 0, | ||
1603 | fl4->flowi4_scope); | ||
1604 | diff --git a/net/ipv4/sysctl_net_ipv4.c b/net/ipv4/sysctl_net_ipv4.c | ||
1605 | index 610e324348d1..6900b8b97d93 100644 | ||
1606 | --- a/net/ipv4/sysctl_net_ipv4.c | ||
1607 | +++ b/net/ipv4/sysctl_net_ipv4.c | ||
1608 | @@ -29,6 +29,7 @@ | ||
1609 | static int zero; | ||
1610 | static int one = 1; | ||
1611 | static int four = 4; | ||
1612 | +static int gso_max_segs = GSO_MAX_SEGS; | ||
1613 | static int tcp_retr1_max = 255; | ||
1614 | static int ip_local_port_range_min[] = { 1, 1 }; | ||
1615 | static int ip_local_port_range_max[] = { 65535, 65535 }; | ||
1616 | @@ -754,6 +755,15 @@ static struct ctl_table ipv4_table[] = { | ||
1617 | .extra2 = &four, | ||
1618 | }, | ||
1619 | { | ||
1620 | + .procname = "tcp_min_tso_segs", | ||
1621 | + .data = &sysctl_tcp_min_tso_segs, | ||
1622 | + .maxlen = sizeof(int), | ||
1623 | + .mode = 0644, | ||
1624 | + .proc_handler = proc_dointvec_minmax, | ||
1625 | + .extra1 = &zero, | ||
1626 | + .extra2 = &gso_max_segs, | ||
1627 | + }, | ||
1628 | + { | ||
1629 | .procname = "udp_mem", | ||
1630 | .data = &sysctl_udp_mem, | ||
1631 | .maxlen = sizeof(sysctl_udp_mem), | ||
1632 | diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c | ||
1633 | index 95544e4028c0..ec586e553361 100644 | ||
1634 | --- a/net/ipv4/tcp.c | ||
1635 | +++ b/net/ipv4/tcp.c | ||
1636 | @@ -283,6 +283,8 @@ | ||
1637 | |||
1638 | int sysctl_tcp_fin_timeout __read_mostly = TCP_FIN_TIMEOUT; | ||
1639 | |||
1640 | +int sysctl_tcp_min_tso_segs __read_mostly = 2; | ||
1641 | + | ||
1642 | struct percpu_counter tcp_orphan_count; | ||
1643 | EXPORT_SYMBOL_GPL(tcp_orphan_count); | ||
1644 | |||
1645 | @@ -789,12 +791,28 @@ static unsigned int tcp_xmit_size_goal(struct sock *sk, u32 mss_now, | ||
1646 | xmit_size_goal = mss_now; | ||
1647 | |||
1648 | if (large_allowed && sk_can_gso(sk)) { | ||
1649 | - xmit_size_goal = ((sk->sk_gso_max_size - 1) - | ||
1650 | - inet_csk(sk)->icsk_af_ops->net_header_len - | ||
1651 | - inet_csk(sk)->icsk_ext_hdr_len - | ||
1652 | - tp->tcp_header_len); | ||
1653 | + u32 gso_size, hlen; | ||
1654 | + | ||
1655 | + /* Maybe we should/could use sk->sk_prot->max_header here ? */ | ||
1656 | + hlen = inet_csk(sk)->icsk_af_ops->net_header_len + | ||
1657 | + inet_csk(sk)->icsk_ext_hdr_len + | ||
1658 | + tp->tcp_header_len; | ||
1659 | + | ||
1660 | + /* Goal is to send at least one packet per ms, | ||
1661 | + * not one big TSO packet every 100 ms. | ||
1662 | + * This preserves ACK clocking and is consistent | ||
1663 | + * with tcp_tso_should_defer() heuristic. | ||
1664 | + */ | ||
1665 | + gso_size = sk->sk_pacing_rate / (2 * MSEC_PER_SEC); | ||
1666 | + gso_size = max_t(u32, gso_size, | ||
1667 | + sysctl_tcp_min_tso_segs * mss_now); | ||
1668 | + | ||
1669 | + xmit_size_goal = min_t(u32, gso_size, | ||
1670 | + sk->sk_gso_max_size - 1 - hlen); | ||
1671 | |||
1672 | - /* TSQ : try to have two TSO segments in flight */ | ||
1673 | + /* TSQ : try to have at least two segments in flight | ||
1674 | + * (one in NIC TX ring, another in Qdisc) | ||
1675 | + */ | ||
1676 | xmit_size_goal = min_t(u32, xmit_size_goal, | ||
1677 | sysctl_tcp_limit_output_bytes >> 1); | ||
1678 | |||
1679 | diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c | ||
1680 | index 3ca2139a130b..723951aec07e 100644 | ||
1681 | --- a/net/ipv4/tcp_input.c | ||
1682 | +++ b/net/ipv4/tcp_input.c | ||
1683 | @@ -688,6 +688,34 @@ static void tcp_rtt_estimator(struct sock *sk, const __u32 mrtt) | ||
1684 | } | ||
1685 | } | ||
1686 | |||
1687 | +/* Set the sk_pacing_rate to allow proper sizing of TSO packets. | ||
1688 | + * Note: TCP stack does not yet implement pacing. | ||
1689 | + * FQ packet scheduler can be used to implement cheap but effective | ||
1690 | + * TCP pacing, to smooth the burst on large writes when packets | ||
1691 | + * in flight is significantly lower than cwnd (or rwin) | ||
1692 | + */ | ||
1693 | +static void tcp_update_pacing_rate(struct sock *sk) | ||
1694 | +{ | ||
1695 | + const struct tcp_sock *tp = tcp_sk(sk); | ||
1696 | + u64 rate; | ||
1697 | + | ||
1698 | + /* set sk_pacing_rate to 200 % of current rate (mss * cwnd / srtt) */ | ||
1699 | + rate = (u64)tp->mss_cache * 2 * (HZ << 3); | ||
1700 | + | ||
1701 | + rate *= max(tp->snd_cwnd, tp->packets_out); | ||
1702 | + | ||
1703 | + /* Correction for small srtt : minimum srtt being 8 (1 jiffy << 3), | ||
1704 | + * be conservative and assume srtt = 1 (125 us instead of 1.25 ms) | ||
1705 | + * We probably need usec resolution in the future. | ||
1706 | + * Note: This also takes care of possible srtt=0 case, | ||
1707 | + * when tcp_rtt_estimator() was not yet called. | ||
1708 | + */ | ||
1709 | + if (tp->srtt > 8 + 2) | ||
1710 | + do_div(rate, tp->srtt); | ||
1711 | + | ||
1712 | + sk->sk_pacing_rate = min_t(u64, rate, ~0U); | ||
1713 | +} | ||
1714 | + | ||
1715 | /* Calculate rto without backoff. This is the second half of Van Jacobson's | ||
1716 | * routine referred to above. | ||
1717 | */ | ||
1718 | @@ -1251,7 +1279,10 @@ static bool tcp_shifted_skb(struct sock *sk, struct sk_buff *skb, | ||
1719 | tp->lost_cnt_hint -= tcp_skb_pcount(prev); | ||
1720 | } | ||
1721 | |||
1722 | - TCP_SKB_CB(skb)->tcp_flags |= TCP_SKB_CB(prev)->tcp_flags; | ||
1723 | + TCP_SKB_CB(prev)->tcp_flags |= TCP_SKB_CB(skb)->tcp_flags; | ||
1724 | + if (TCP_SKB_CB(skb)->tcp_flags & TCPHDR_FIN) | ||
1725 | + TCP_SKB_CB(prev)->end_seq++; | ||
1726 | + | ||
1727 | if (skb == tcp_highest_sack(sk)) | ||
1728 | tcp_advance_highest_sack(sk, skb); | ||
1729 | |||
1730 | @@ -3253,7 +3284,7 @@ static void tcp_process_tlp_ack(struct sock *sk, u32 ack, int flag) | ||
1731 | tcp_init_cwnd_reduction(sk, true); | ||
1732 | tcp_set_ca_state(sk, TCP_CA_CWR); | ||
1733 | tcp_end_cwnd_reduction(sk); | ||
1734 | - tcp_set_ca_state(sk, TCP_CA_Open); | ||
1735 | + tcp_try_keep_open(sk); | ||
1736 | NET_INC_STATS_BH(sock_net(sk), | ||
1737 | LINUX_MIB_TCPLOSSPROBERECOVERY); | ||
1738 | } | ||
1739 | @@ -3269,7 +3300,7 @@ static int tcp_ack(struct sock *sk, const struct sk_buff *skb, int flag) | ||
1740 | u32 ack_seq = TCP_SKB_CB(skb)->seq; | ||
1741 | u32 ack = TCP_SKB_CB(skb)->ack_seq; | ||
1742 | bool is_dupack = false; | ||
1743 | - u32 prior_in_flight; | ||
1744 | + u32 prior_in_flight, prior_cwnd = tp->snd_cwnd, prior_rtt = tp->srtt; | ||
1745 | u32 prior_fackets; | ||
1746 | int prior_packets = tp->packets_out; | ||
1747 | const int prior_unsacked = tp->packets_out - tp->sacked_out; | ||
1748 | @@ -3375,6 +3406,8 @@ static int tcp_ack(struct sock *sk, const struct sk_buff *skb, int flag) | ||
1749 | |||
1750 | if (icsk->icsk_pending == ICSK_TIME_RETRANS) | ||
1751 | tcp_schedule_loss_probe(sk); | ||
1752 | + if (tp->srtt != prior_rtt || tp->snd_cwnd != prior_cwnd) | ||
1753 | + tcp_update_pacing_rate(sk); | ||
1754 | return 1; | ||
1755 | |||
1756 | no_queue: | ||
1757 | @@ -5671,6 +5704,8 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb, | ||
1758 | } else | ||
1759 | tcp_init_metrics(sk); | ||
1760 | |||
1761 | + tcp_update_pacing_rate(sk); | ||
1762 | + | ||
1763 | /* Prevent spurious tcp_cwnd_restart() on first data packet */ | ||
1764 | tp->lsndtime = tcp_time_stamp; | ||
1765 | |||
1766 | diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c | ||
1767 | index 170737a9d56d..28c0d6a00d96 100644 | ||
1768 | --- a/net/ipv4/tcp_output.c | ||
1769 | +++ b/net/ipv4/tcp_output.c | ||
1770 | @@ -892,8 +892,7 @@ static int tcp_transmit_skb(struct sock *sk, struct sk_buff *skb, int clone_it, | ||
1771 | |||
1772 | skb_orphan(skb); | ||
1773 | skb->sk = sk; | ||
1774 | - skb->destructor = (sysctl_tcp_limit_output_bytes > 0) ? | ||
1775 | - tcp_wfree : sock_wfree; | ||
1776 | + skb->destructor = tcp_wfree; | ||
1777 | atomic_add(skb->truesize, &sk->sk_wmem_alloc); | ||
1778 | |||
1779 | /* Build TCP header and checksum it. */ | ||
1780 | @@ -982,6 +981,9 @@ static void tcp_queue_skb(struct sock *sk, struct sk_buff *skb) | ||
1781 | static void tcp_set_skb_tso_segs(const struct sock *sk, struct sk_buff *skb, | ||
1782 | unsigned int mss_now) | ||
1783 | { | ||
1784 | + /* Make sure we own this skb before messing gso_size/gso_segs */ | ||
1785 | + WARN_ON_ONCE(skb_cloned(skb)); | ||
1786 | + | ||
1787 | if (skb->len <= mss_now || !sk_can_gso(sk) || | ||
1788 | skb->ip_summed == CHECKSUM_NONE) { | ||
1789 | /* Avoid the costly divide in the normal | ||
1790 | @@ -1063,9 +1065,7 @@ int tcp_fragment(struct sock *sk, struct sk_buff *skb, u32 len, | ||
1791 | if (nsize < 0) | ||
1792 | nsize = 0; | ||
1793 | |||
1794 | - if (skb_cloned(skb) && | ||
1795 | - skb_is_nonlinear(skb) && | ||
1796 | - pskb_expand_head(skb, 0, 0, GFP_ATOMIC)) | ||
1797 | + if (skb_unclone(skb, GFP_ATOMIC)) | ||
1798 | return -ENOMEM; | ||
1799 | |||
1800 | /* Get a new skb... force flag on. */ | ||
1801 | @@ -1628,7 +1628,7 @@ static bool tcp_tso_should_defer(struct sock *sk, struct sk_buff *skb) | ||
1802 | |||
1803 | /* If a full-sized TSO skb can be sent, do it. */ | ||
1804 | if (limit >= min_t(unsigned int, sk->sk_gso_max_size, | ||
1805 | - sk->sk_gso_max_segs * tp->mss_cache)) | ||
1806 | + tp->xmit_size_goal_segs * tp->mss_cache)) | ||
1807 | goto send_now; | ||
1808 | |||
1809 | /* Middle in queue won't get any more data, full sendable already? */ | ||
1810 | @@ -1837,7 +1837,6 @@ static bool tcp_write_xmit(struct sock *sk, unsigned int mss_now, int nonagle, | ||
1811 | while ((skb = tcp_send_head(sk))) { | ||
1812 | unsigned int limit; | ||
1813 | |||
1814 | - | ||
1815 | tso_segs = tcp_init_tso_segs(sk, skb, mss_now); | ||
1816 | BUG_ON(!tso_segs); | ||
1817 | |||
1818 | @@ -1866,13 +1865,20 @@ static bool tcp_write_xmit(struct sock *sk, unsigned int mss_now, int nonagle, | ||
1819 | break; | ||
1820 | } | ||
1821 | |||
1822 | - /* TSQ : sk_wmem_alloc accounts skb truesize, | ||
1823 | - * including skb overhead. But thats OK. | ||
1824 | + /* TCP Small Queues : | ||
1825 | + * Control number of packets in qdisc/devices to two packets / or ~1 ms. | ||
1826 | + * This allows for : | ||
1827 | + * - better RTT estimation and ACK scheduling | ||
1828 | + * - faster recovery | ||
1829 | + * - high rates | ||
1830 | */ | ||
1831 | - if (atomic_read(&sk->sk_wmem_alloc) >= sysctl_tcp_limit_output_bytes) { | ||
1832 | + limit = max(skb->truesize, sk->sk_pacing_rate >> 10); | ||
1833 | + | ||
1834 | + if (atomic_read(&sk->sk_wmem_alloc) > limit) { | ||
1835 | set_bit(TSQ_THROTTLED, &tp->tsq_flags); | ||
1836 | break; | ||
1837 | } | ||
1838 | + | ||
1839 | limit = mss_now; | ||
1840 | if (tso_segs > 1 && !tcp_urg_mode(tp)) | ||
1841 | limit = tcp_mss_split_point(sk, skb, mss_now, | ||
1842 | @@ -2334,6 +2340,8 @@ int __tcp_retransmit_skb(struct sock *sk, struct sk_buff *skb) | ||
1843 | int oldpcount = tcp_skb_pcount(skb); | ||
1844 | |||
1845 | if (unlikely(oldpcount > 1)) { | ||
1846 | + if (skb_unclone(skb, GFP_ATOMIC)) | ||
1847 | + return -ENOMEM; | ||
1848 | tcp_init_tso_segs(sk, skb, cur_mss); | ||
1849 | tcp_adjust_pcount(sk, skb, oldpcount - tcp_skb_pcount(skb)); | ||
1850 | } | ||
1851 | diff --git a/net/ipv6/inet6_hashtables.c b/net/ipv6/inet6_hashtables.c | ||
1852 | index 32b4a1675d82..066640e0ba8e 100644 | ||
1853 | --- a/net/ipv6/inet6_hashtables.c | ||
1854 | +++ b/net/ipv6/inet6_hashtables.c | ||
1855 | @@ -116,7 +116,7 @@ begintw: | ||
1856 | } | ||
1857 | if (unlikely(!INET6_TW_MATCH(sk, net, saddr, daddr, | ||
1858 | ports, dif))) { | ||
1859 | - sock_put(sk); | ||
1860 | + inet_twsk_put(inet_twsk(sk)); | ||
1861 | goto begintw; | ||
1862 | } | ||
1863 | goto out; | ||
1864 | diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c | ||
1865 | index 44df1c92a0d6..5b25f850faf9 100644 | ||
1866 | --- a/net/ipv6/ip6_output.c | ||
1867 | +++ b/net/ipv6/ip6_output.c | ||
1868 | @@ -130,7 +130,7 @@ static int ip6_finish_output2(struct sk_buff *skb) | ||
1869 | } | ||
1870 | |||
1871 | rcu_read_lock_bh(); | ||
1872 | - nexthop = rt6_nexthop((struct rt6_info *)dst, &ipv6_hdr(skb)->daddr); | ||
1873 | + nexthop = rt6_nexthop((struct rt6_info *)dst); | ||
1874 | neigh = __ipv6_neigh_lookup_noref(dst->dev, nexthop); | ||
1875 | if (unlikely(!neigh)) | ||
1876 | neigh = __neigh_create(&nd_tbl, nexthop, dst->dev, false); | ||
1877 | @@ -899,7 +899,7 @@ static int ip6_dst_lookup_tail(struct sock *sk, | ||
1878 | */ | ||
1879 | rt = (struct rt6_info *) *dst; | ||
1880 | rcu_read_lock_bh(); | ||
1881 | - n = __ipv6_neigh_lookup_noref(rt->dst.dev, rt6_nexthop(rt, &fl6->daddr)); | ||
1882 | + n = __ipv6_neigh_lookup_noref(rt->dst.dev, rt6_nexthop(rt)); | ||
1883 | err = n && !(n->nud_state & NUD_VALID) ? -EINVAL : 0; | ||
1884 | rcu_read_unlock_bh(); | ||
1885 | |||
1886 | @@ -1252,7 +1252,7 @@ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to, | ||
1887 | skb = skb_peek_tail(&sk->sk_write_queue); | ||
1888 | cork->length += length; | ||
1889 | if (((length > mtu) || | ||
1890 | - (skb && skb_is_gso(skb))) && | ||
1891 | + (skb && skb_has_frags(skb))) && | ||
1892 | (sk->sk_protocol == IPPROTO_UDP) && | ||
1893 | (rt->dst.dev->features & NETIF_F_UFO)) { | ||
1894 | err = ip6_ufo_append_data(sk, getfrag, from, length, | ||
1895 | diff --git a/net/ipv6/route.c b/net/ipv6/route.c | ||
1896 | index 8d9a93ed9c59..1e32d5c0b615 100644 | ||
1897 | --- a/net/ipv6/route.c | ||
1898 | +++ b/net/ipv6/route.c | ||
1899 | @@ -477,6 +477,24 @@ out: | ||
1900 | } | ||
1901 | |||
1902 | #ifdef CONFIG_IPV6_ROUTER_PREF | ||
1903 | +struct __rt6_probe_work { | ||
1904 | + struct work_struct work; | ||
1905 | + struct in6_addr target; | ||
1906 | + struct net_device *dev; | ||
1907 | +}; | ||
1908 | + | ||
1909 | +static void rt6_probe_deferred(struct work_struct *w) | ||
1910 | +{ | ||
1911 | + struct in6_addr mcaddr; | ||
1912 | + struct __rt6_probe_work *work = | ||
1913 | + container_of(w, struct __rt6_probe_work, work); | ||
1914 | + | ||
1915 | + addrconf_addr_solict_mult(&work->target, &mcaddr); | ||
1916 | + ndisc_send_ns(work->dev, NULL, &work->target, &mcaddr, NULL); | ||
1917 | + dev_put(work->dev); | ||
1918 | + kfree(w); | ||
1919 | +} | ||
1920 | + | ||
1921 | static void rt6_probe(struct rt6_info *rt) | ||
1922 | { | ||
1923 | struct neighbour *neigh; | ||
1924 | @@ -500,17 +518,23 @@ static void rt6_probe(struct rt6_info *rt) | ||
1925 | |||
1926 | if (!neigh || | ||
1927 | time_after(jiffies, neigh->updated + rt->rt6i_idev->cnf.rtr_probe_interval)) { | ||
1928 | - struct in6_addr mcaddr; | ||
1929 | - struct in6_addr *target; | ||
1930 | + struct __rt6_probe_work *work; | ||
1931 | |||
1932 | - if (neigh) { | ||
1933 | + work = kmalloc(sizeof(*work), GFP_ATOMIC); | ||
1934 | + | ||
1935 | + if (neigh && work) | ||
1936 | neigh->updated = jiffies; | ||
1937 | + | ||
1938 | + if (neigh) | ||
1939 | write_unlock(&neigh->lock); | ||
1940 | - } | ||
1941 | |||
1942 | - target = (struct in6_addr *)&rt->rt6i_gateway; | ||
1943 | - addrconf_addr_solict_mult(target, &mcaddr); | ||
1944 | - ndisc_send_ns(rt->dst.dev, NULL, target, &mcaddr, NULL); | ||
1945 | + if (work) { | ||
1946 | + INIT_WORK(&work->work, rt6_probe_deferred); | ||
1947 | + work->target = rt->rt6i_gateway; | ||
1948 | + dev_hold(rt->dst.dev); | ||
1949 | + work->dev = rt->dst.dev; | ||
1950 | + schedule_work(&work->work); | ||
1951 | + } | ||
1952 | } else { | ||
1953 | out: | ||
1954 | write_unlock(&neigh->lock); | ||
1955 | @@ -852,7 +876,6 @@ static struct rt6_info *rt6_alloc_cow(struct rt6_info *ort, | ||
1956 | if (ort->rt6i_dst.plen != 128 && | ||
1957 | ipv6_addr_equal(&ort->rt6i_dst.addr, daddr)) | ||
1958 | rt->rt6i_flags |= RTF_ANYCAST; | ||
1959 | - rt->rt6i_gateway = *daddr; | ||
1960 | } | ||
1961 | |||
1962 | rt->rt6i_flags |= RTF_CACHE; | ||
1963 | @@ -1270,6 +1293,7 @@ struct dst_entry *icmp6_dst_alloc(struct net_device *dev, | ||
1964 | rt->dst.flags |= DST_HOST; | ||
1965 | rt->dst.output = ip6_output; | ||
1966 | atomic_set(&rt->dst.__refcnt, 1); | ||
1967 | + rt->rt6i_gateway = fl6->daddr; | ||
1968 | rt->rt6i_dst.addr = fl6->daddr; | ||
1969 | rt->rt6i_dst.plen = 128; | ||
1970 | rt->rt6i_idev = idev; | ||
1971 | @@ -1824,7 +1848,10 @@ static struct rt6_info *ip6_rt_copy(struct rt6_info *ort, | ||
1972 | in6_dev_hold(rt->rt6i_idev); | ||
1973 | rt->dst.lastuse = jiffies; | ||
1974 | |||
1975 | - rt->rt6i_gateway = ort->rt6i_gateway; | ||
1976 | + if (ort->rt6i_flags & RTF_GATEWAY) | ||
1977 | + rt->rt6i_gateway = ort->rt6i_gateway; | ||
1978 | + else | ||
1979 | + rt->rt6i_gateway = *dest; | ||
1980 | rt->rt6i_flags = ort->rt6i_flags; | ||
1981 | if ((ort->rt6i_flags & (RTF_DEFAULT | RTF_ADDRCONF)) == | ||
1982 | (RTF_DEFAULT | RTF_ADDRCONF)) | ||
1983 | @@ -2111,6 +2138,7 @@ struct rt6_info *addrconf_dst_alloc(struct inet6_dev *idev, | ||
1984 | else | ||
1985 | rt->rt6i_flags |= RTF_LOCAL; | ||
1986 | |||
1987 | + rt->rt6i_gateway = *addr; | ||
1988 | rt->rt6i_dst.addr = *addr; | ||
1989 | rt->rt6i_dst.plen = 128; | ||
1990 | rt->rt6i_table = fib6_get_table(net, RT6_TABLE_LOCAL); | ||
1991 | diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c | ||
1992 | index 86f639ba5407..a51ad079ee58 100644 | ||
1993 | --- a/net/ipv6/sit.c | ||
1994 | +++ b/net/ipv6/sit.c | ||
1995 | @@ -1708,7 +1708,6 @@ static void __net_exit sit_exit_net(struct net *net) | ||
1996 | |||
1997 | rtnl_lock(); | ||
1998 | sit_destroy_tunnels(sitn, &list); | ||
1999 | - unregister_netdevice_queue(sitn->fb_tunnel_dev, &list); | ||
2000 | unregister_netdevice_many(&list); | ||
2001 | rtnl_unlock(); | ||
2002 | } | ||
2003 | diff --git a/net/l2tp/l2tp_core.c b/net/l2tp/l2tp_core.c | ||
2004 | index feae495a0a30..b076e8309bc2 100644 | ||
2005 | --- a/net/l2tp/l2tp_core.c | ||
2006 | +++ b/net/l2tp/l2tp_core.c | ||
2007 | @@ -115,6 +115,11 @@ struct l2tp_net { | ||
2008 | static void l2tp_session_set_header_len(struct l2tp_session *session, int version); | ||
2009 | static void l2tp_tunnel_free(struct l2tp_tunnel *tunnel); | ||
2010 | |||
2011 | +static inline struct l2tp_tunnel *l2tp_tunnel(struct sock *sk) | ||
2012 | +{ | ||
2013 | + return sk->sk_user_data; | ||
2014 | +} | ||
2015 | + | ||
2016 | static inline struct l2tp_net *l2tp_pernet(struct net *net) | ||
2017 | { | ||
2018 | BUG_ON(!net); | ||
2019 | @@ -504,7 +509,7 @@ static inline int l2tp_verify_udp_checksum(struct sock *sk, | ||
2020 | return 0; | ||
2021 | |||
2022 | #if IS_ENABLED(CONFIG_IPV6) | ||
2023 | - if (sk->sk_family == PF_INET6) { | ||
2024 | + if (sk->sk_family == PF_INET6 && !l2tp_tunnel(sk)->v4mapped) { | ||
2025 | if (!uh->check) { | ||
2026 | LIMIT_NETDEBUG(KERN_INFO "L2TP: IPv6: checksum is 0\n"); | ||
2027 | return 1; | ||
2028 | @@ -1128,7 +1133,7 @@ static int l2tp_xmit_core(struct l2tp_session *session, struct sk_buff *skb, | ||
2029 | /* Queue the packet to IP for output */ | ||
2030 | skb->local_df = 1; | ||
2031 | #if IS_ENABLED(CONFIG_IPV6) | ||
2032 | - if (skb->sk->sk_family == PF_INET6) | ||
2033 | + if (skb->sk->sk_family == PF_INET6 && !tunnel->v4mapped) | ||
2034 | error = inet6_csk_xmit(skb, NULL); | ||
2035 | else | ||
2036 | #endif | ||
2037 | @@ -1255,7 +1260,7 @@ int l2tp_xmit_skb(struct l2tp_session *session, struct sk_buff *skb, int hdr_len | ||
2038 | |||
2039 | /* Calculate UDP checksum if configured to do so */ | ||
2040 | #if IS_ENABLED(CONFIG_IPV6) | ||
2041 | - if (sk->sk_family == PF_INET6) | ||
2042 | + if (sk->sk_family == PF_INET6 && !tunnel->v4mapped) | ||
2043 | l2tp_xmit_ipv6_csum(sk, skb, udp_len); | ||
2044 | else | ||
2045 | #endif | ||
2046 | @@ -1304,10 +1309,9 @@ EXPORT_SYMBOL_GPL(l2tp_xmit_skb); | ||
2047 | */ | ||
2048 | static void l2tp_tunnel_destruct(struct sock *sk) | ||
2049 | { | ||
2050 | - struct l2tp_tunnel *tunnel; | ||
2051 | + struct l2tp_tunnel *tunnel = l2tp_tunnel(sk); | ||
2052 | struct l2tp_net *pn; | ||
2053 | |||
2054 | - tunnel = sk->sk_user_data; | ||
2055 | if (tunnel == NULL) | ||
2056 | goto end; | ||
2057 | |||
2058 | @@ -1675,7 +1679,7 @@ int l2tp_tunnel_create(struct net *net, int fd, int version, u32 tunnel_id, u32 | ||
2059 | } | ||
2060 | |||
2061 | /* Check if this socket has already been prepped */ | ||
2062 | - tunnel = (struct l2tp_tunnel *)sk->sk_user_data; | ||
2063 | + tunnel = l2tp_tunnel(sk); | ||
2064 | if (tunnel != NULL) { | ||
2065 | /* This socket has already been prepped */ | ||
2066 | err = -EBUSY; | ||
2067 | @@ -1704,6 +1708,24 @@ int l2tp_tunnel_create(struct net *net, int fd, int version, u32 tunnel_id, u32 | ||
2068 | if (cfg != NULL) | ||
2069 | tunnel->debug = cfg->debug; | ||
2070 | |||
2071 | +#if IS_ENABLED(CONFIG_IPV6) | ||
2072 | + if (sk->sk_family == PF_INET6) { | ||
2073 | + struct ipv6_pinfo *np = inet6_sk(sk); | ||
2074 | + | ||
2075 | + if (ipv6_addr_v4mapped(&np->saddr) && | ||
2076 | + ipv6_addr_v4mapped(&np->daddr)) { | ||
2077 | + struct inet_sock *inet = inet_sk(sk); | ||
2078 | + | ||
2079 | + tunnel->v4mapped = true; | ||
2080 | + inet->inet_saddr = np->saddr.s6_addr32[3]; | ||
2081 | + inet->inet_rcv_saddr = np->rcv_saddr.s6_addr32[3]; | ||
2082 | + inet->inet_daddr = np->daddr.s6_addr32[3]; | ||
2083 | + } else { | ||
2084 | + tunnel->v4mapped = false; | ||
2085 | + } | ||
2086 | + } | ||
2087 | +#endif | ||
2088 | + | ||
2089 | /* Mark socket as an encapsulation socket. See net/ipv4/udp.c */ | ||
2090 | tunnel->encap = encap; | ||
2091 | if (encap == L2TP_ENCAPTYPE_UDP) { | ||
2092 | @@ -1712,7 +1734,7 @@ int l2tp_tunnel_create(struct net *net, int fd, int version, u32 tunnel_id, u32 | ||
2093 | udp_sk(sk)->encap_rcv = l2tp_udp_encap_recv; | ||
2094 | udp_sk(sk)->encap_destroy = l2tp_udp_encap_destroy; | ||
2095 | #if IS_ENABLED(CONFIG_IPV6) | ||
2096 | - if (sk->sk_family == PF_INET6) | ||
2097 | + if (sk->sk_family == PF_INET6 && !tunnel->v4mapped) | ||
2098 | udpv6_encap_enable(); | ||
2099 | else | ||
2100 | #endif | ||
2101 | diff --git a/net/l2tp/l2tp_core.h b/net/l2tp/l2tp_core.h | ||
2102 | index 66a559b104b6..6f251cbc2ed7 100644 | ||
2103 | --- a/net/l2tp/l2tp_core.h | ||
2104 | +++ b/net/l2tp/l2tp_core.h | ||
2105 | @@ -194,6 +194,9 @@ struct l2tp_tunnel { | ||
2106 | struct sock *sock; /* Parent socket */ | ||
2107 | int fd; /* Parent fd, if tunnel socket | ||
2108 | * was created by userspace */ | ||
2109 | +#if IS_ENABLED(CONFIG_IPV6) | ||
2110 | + bool v4mapped; | ||
2111 | +#endif | ||
2112 | |||
2113 | struct work_struct del_work; | ||
2114 | |||
2115 | diff --git a/net/l2tp/l2tp_ppp.c b/net/l2tp/l2tp_ppp.c | ||
2116 | index 5ebee2ded9e9..8c46b271064a 100644 | ||
2117 | --- a/net/l2tp/l2tp_ppp.c | ||
2118 | +++ b/net/l2tp/l2tp_ppp.c | ||
2119 | @@ -353,7 +353,9 @@ static int pppol2tp_sendmsg(struct kiocb *iocb, struct socket *sock, struct msgh | ||
2120 | goto error_put_sess_tun; | ||
2121 | } | ||
2122 | |||
2123 | + local_bh_disable(); | ||
2124 | l2tp_xmit_skb(session, skb, session->hdr_len); | ||
2125 | + local_bh_enable(); | ||
2126 | |||
2127 | sock_put(ps->tunnel_sock); | ||
2128 | sock_put(sk); | ||
2129 | @@ -422,7 +424,9 @@ static int pppol2tp_xmit(struct ppp_channel *chan, struct sk_buff *skb) | ||
2130 | skb->data[0] = ppph[0]; | ||
2131 | skb->data[1] = ppph[1]; | ||
2132 | |||
2133 | + local_bh_disable(); | ||
2134 | l2tp_xmit_skb(session, skb, session->hdr_len); | ||
2135 | + local_bh_enable(); | ||
2136 | |||
2137 | sock_put(sk_tun); | ||
2138 | sock_put(sk); | ||
2139 | diff --git a/net/netfilter/nf_conntrack_h323_main.c b/net/netfilter/nf_conntrack_h323_main.c | ||
2140 | index bdebd03bc8cd..70866d192efc 100644 | ||
2141 | --- a/net/netfilter/nf_conntrack_h323_main.c | ||
2142 | +++ b/net/netfilter/nf_conntrack_h323_main.c | ||
2143 | @@ -778,8 +778,8 @@ static int callforward_do_filter(const union nf_inet_addr *src, | ||
2144 | flowi6_to_flowi(&fl1), false)) { | ||
2145 | if (!afinfo->route(&init_net, (struct dst_entry **)&rt2, | ||
2146 | flowi6_to_flowi(&fl2), false)) { | ||
2147 | - if (!memcmp(&rt1->rt6i_gateway, &rt2->rt6i_gateway, | ||
2148 | - sizeof(rt1->rt6i_gateway)) && | ||
2149 | + if (ipv6_addr_equal(rt6_nexthop(rt1), | ||
2150 | + rt6_nexthop(rt2)) && | ||
2151 | rt1->dst.dev == rt2->dst.dev) | ||
2152 | ret = 1; | ||
2153 | dst_release(&rt2->dst); | ||
2154 | diff --git a/net/sched/sch_netem.c b/net/sched/sch_netem.c | ||
2155 | index 82f6016d89ab..3626010e8f0b 100644 | ||
2156 | --- a/net/sched/sch_netem.c | ||
2157 | +++ b/net/sched/sch_netem.c | ||
2158 | @@ -358,6 +358,21 @@ static psched_time_t packet_len_2_sched_time(unsigned int len, struct netem_sche | ||
2159 | return PSCHED_NS2TICKS(ticks); | ||
2160 | } | ||
2161 | |||
2162 | +static void tfifo_reset(struct Qdisc *sch) | ||
2163 | +{ | ||
2164 | + struct netem_sched_data *q = qdisc_priv(sch); | ||
2165 | + struct rb_node *p; | ||
2166 | + | ||
2167 | + while ((p = rb_first(&q->t_root))) { | ||
2168 | + struct sk_buff *skb = netem_rb_to_skb(p); | ||
2169 | + | ||
2170 | + rb_erase(p, &q->t_root); | ||
2171 | + skb->next = NULL; | ||
2172 | + skb->prev = NULL; | ||
2173 | + kfree_skb(skb); | ||
2174 | + } | ||
2175 | +} | ||
2176 | + | ||
2177 | static void tfifo_enqueue(struct sk_buff *nskb, struct Qdisc *sch) | ||
2178 | { | ||
2179 | struct netem_sched_data *q = qdisc_priv(sch); | ||
2180 | @@ -523,6 +538,7 @@ static unsigned int netem_drop(struct Qdisc *sch) | ||
2181 | skb->next = NULL; | ||
2182 | skb->prev = NULL; | ||
2183 | len = qdisc_pkt_len(skb); | ||
2184 | + sch->qstats.backlog -= len; | ||
2185 | kfree_skb(skb); | ||
2186 | } | ||
2187 | } | ||
2188 | @@ -612,6 +628,7 @@ static void netem_reset(struct Qdisc *sch) | ||
2189 | struct netem_sched_data *q = qdisc_priv(sch); | ||
2190 | |||
2191 | qdisc_reset_queue(sch); | ||
2192 | + tfifo_reset(sch); | ||
2193 | if (q->qdisc) | ||
2194 | qdisc_reset(q->qdisc); | ||
2195 | qdisc_watchdog_cancel(&q->watchdog); | ||
2196 | diff --git a/net/sctp/output.c b/net/sctp/output.c | ||
2197 | index a46d1eb41762..013a07d9c454 100644 | ||
2198 | --- a/net/sctp/output.c | ||
2199 | +++ b/net/sctp/output.c | ||
2200 | @@ -542,7 +542,8 @@ int sctp_packet_transmit(struct sctp_packet *packet) | ||
2201 | * by CRC32-C as described in <draft-ietf-tsvwg-sctpcsum-02.txt>. | ||
2202 | */ | ||
2203 | if (!sctp_checksum_disable) { | ||
2204 | - if (!(dst->dev->features & NETIF_F_SCTP_CSUM)) { | ||
2205 | + if (!(dst->dev->features & NETIF_F_SCTP_CSUM) || | ||
2206 | + (dst_xfrm(dst) != NULL) || packet->ipfragok) { | ||
2207 | __u32 crc32 = sctp_start_cksum((__u8 *)sh, cksum_buf_len); | ||
2208 | |||
2209 | /* 3) Put the resultant value into the checksum field in the | ||
2210 | diff --git a/net/socket.c b/net/socket.c | ||
2211 | index b2d7c629eeb9..4b946438d560 100644 | ||
2212 | --- a/net/socket.c | ||
2213 | +++ b/net/socket.c | ||
2214 | @@ -1973,6 +1973,16 @@ struct used_address { | ||
2215 | unsigned int name_len; | ||
2216 | }; | ||
2217 | |||
2218 | +static int copy_msghdr_from_user(struct msghdr *kmsg, | ||
2219 | + struct msghdr __user *umsg) | ||
2220 | +{ | ||
2221 | + if (copy_from_user(kmsg, umsg, sizeof(struct msghdr))) | ||
2222 | + return -EFAULT; | ||
2223 | + if (kmsg->msg_namelen > sizeof(struct sockaddr_storage)) | ||
2224 | + return -EINVAL; | ||
2225 | + return 0; | ||
2226 | +} | ||
2227 | + | ||
2228 | static int ___sys_sendmsg(struct socket *sock, struct msghdr __user *msg, | ||
2229 | struct msghdr *msg_sys, unsigned int flags, | ||
2230 | struct used_address *used_address) | ||
2231 | @@ -1991,8 +2001,11 @@ static int ___sys_sendmsg(struct socket *sock, struct msghdr __user *msg, | ||
2232 | if (MSG_CMSG_COMPAT & flags) { | ||
2233 | if (get_compat_msghdr(msg_sys, msg_compat)) | ||
2234 | return -EFAULT; | ||
2235 | - } else if (copy_from_user(msg_sys, msg, sizeof(struct msghdr))) | ||
2236 | - return -EFAULT; | ||
2237 | + } else { | ||
2238 | + err = copy_msghdr_from_user(msg_sys, msg); | ||
2239 | + if (err) | ||
2240 | + return err; | ||
2241 | + } | ||
2242 | |||
2243 | if (msg_sys->msg_iovlen > UIO_FASTIOV) { | ||
2244 | err = -EMSGSIZE; | ||
2245 | @@ -2200,8 +2213,11 @@ static int ___sys_recvmsg(struct socket *sock, struct msghdr __user *msg, | ||
2246 | if (MSG_CMSG_COMPAT & flags) { | ||
2247 | if (get_compat_msghdr(msg_sys, msg_compat)) | ||
2248 | return -EFAULT; | ||
2249 | - } else if (copy_from_user(msg_sys, msg, sizeof(struct msghdr))) | ||
2250 | - return -EFAULT; | ||
2251 | + } else { | ||
2252 | + err = copy_msghdr_from_user(msg_sys, msg); | ||
2253 | + if (err) | ||
2254 | + return err; | ||
2255 | + } | ||
2256 | |||
2257 | if (msg_sys->msg_iovlen > UIO_FASTIOV) { | ||
2258 | err = -EMSGSIZE; | ||
2259 | diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c | ||
2260 | index c4ce243824bb..e64bbcf5fb2c 100644 | ||
2261 | --- a/net/unix/af_unix.c | ||
2262 | +++ b/net/unix/af_unix.c | ||
2263 | @@ -1246,6 +1246,15 @@ static int unix_socketpair(struct socket *socka, struct socket *sockb) | ||
2264 | return 0; | ||
2265 | } | ||
2266 | |||
2267 | +static void unix_sock_inherit_flags(const struct socket *old, | ||
2268 | + struct socket *new) | ||
2269 | +{ | ||
2270 | + if (test_bit(SOCK_PASSCRED, &old->flags)) | ||
2271 | + set_bit(SOCK_PASSCRED, &new->flags); | ||
2272 | + if (test_bit(SOCK_PASSSEC, &old->flags)) | ||
2273 | + set_bit(SOCK_PASSSEC, &new->flags); | ||
2274 | +} | ||
2275 | + | ||
2276 | static int unix_accept(struct socket *sock, struct socket *newsock, int flags) | ||
2277 | { | ||
2278 | struct sock *sk = sock->sk; | ||
2279 | @@ -1280,6 +1289,7 @@ static int unix_accept(struct socket *sock, struct socket *newsock, int flags) | ||
2280 | /* attach accepted sock to socket */ | ||
2281 | unix_state_lock(tsk); | ||
2282 | newsock->state = SS_CONNECTED; | ||
2283 | + unix_sock_inherit_flags(sock, newsock); | ||
2284 | sock_graft(tsk, newsock); | ||
2285 | unix_state_unlock(tsk); | ||
2286 | return 0; | ||
2287 | diff --git a/net/unix/diag.c b/net/unix/diag.c | ||
2288 | index d591091603bf..86fa0f3b2caf 100644 | ||
2289 | --- a/net/unix/diag.c | ||
2290 | +++ b/net/unix/diag.c | ||
2291 | @@ -124,6 +124,7 @@ static int sk_diag_fill(struct sock *sk, struct sk_buff *skb, struct unix_diag_r | ||
2292 | rep->udiag_family = AF_UNIX; | ||
2293 | rep->udiag_type = sk->sk_type; | ||
2294 | rep->udiag_state = sk->sk_state; | ||
2295 | + rep->pad = 0; | ||
2296 | rep->udiag_ino = sk_ino; | ||
2297 | sock_diag_save_cookie(sk, rep->udiag_cookie); | ||
2298 | |||
2299 | diff --git a/net/wireless/radiotap.c b/net/wireless/radiotap.c | ||
2300 | index 7d604c06c3dc..a271c27fac77 100644 | ||
2301 | --- a/net/wireless/radiotap.c | ||
2302 | +++ b/net/wireless/radiotap.c | ||
2303 | @@ -97,6 +97,10 @@ int ieee80211_radiotap_iterator_init( | ||
2304 | struct ieee80211_radiotap_header *radiotap_header, | ||
2305 | int max_length, const struct ieee80211_radiotap_vendor_namespaces *vns) | ||
2306 | { | ||
2307 | + /* check the radiotap header can actually be present */ | ||
2308 | + if (max_length < sizeof(struct ieee80211_radiotap_header)) | ||
2309 | + return -EINVAL; | ||
2310 | + | ||
2311 | /* Linux only supports version 0 radiotap format */ | ||
2312 | if (radiotap_header->it_version) | ||
2313 | return -EINVAL; | ||
2314 | @@ -131,7 +135,8 @@ int ieee80211_radiotap_iterator_init( | ||
2315 | */ | ||
2316 | |||
2317 | if ((unsigned long)iterator->_arg - | ||
2318 | - (unsigned long)iterator->_rtheader > | ||
2319 | + (unsigned long)iterator->_rtheader + | ||
2320 | + sizeof(uint32_t) > | ||
2321 | (unsigned long)iterator->_max_length) | ||
2322 | return -EINVAL; | ||
2323 | } | ||
2324 | diff --git a/sound/pci/hda/hda_generic.c b/sound/pci/hda/hda_generic.c | ||
2325 | index e3c7ba8d7582..adabdeb7b15d 100644 | ||
2326 | --- a/sound/pci/hda/hda_generic.c | ||
2327 | +++ b/sound/pci/hda/hda_generic.c | ||
2328 | @@ -3505,7 +3505,7 @@ static int create_capture_mixers(struct hda_codec *codec) | ||
2329 | if (!multi) | ||
2330 | err = create_single_cap_vol_ctl(codec, n, vol, sw, | ||
2331 | inv_dmic); | ||
2332 | - else if (!multi_cap_vol) | ||
2333 | + else if (!multi_cap_vol && !inv_dmic) | ||
2334 | err = create_bind_cap_vol_ctl(codec, n, vol, sw); | ||
2335 | else | ||
2336 | err = create_multi_cap_vol_ctl(codec); | ||
2337 | diff --git a/sound/usb/usx2y/us122l.c b/sound/usb/usx2y/us122l.c | ||
2338 | index d0323a693ba2..999550bbad40 100644 | ||
2339 | --- a/sound/usb/usx2y/us122l.c | ||
2340 | +++ b/sound/usb/usx2y/us122l.c | ||
2341 | @@ -262,7 +262,9 @@ static int usb_stream_hwdep_mmap(struct snd_hwdep *hw, | ||
2342 | } | ||
2343 | |||
2344 | area->vm_ops = &usb_stream_hwdep_vm_ops; | ||
2345 | - area->vm_flags |= VM_DONTEXPAND | VM_DONTDUMP; | ||
2346 | + area->vm_flags |= VM_DONTDUMP; | ||
2347 | + if (!read) | ||
2348 | + area->vm_flags |= VM_DONTEXPAND; | ||
2349 | area->vm_private_data = us122l; | ||
2350 | atomic_inc(&us122l->mmap_count); | ||
2351 | out: |