Magellan Linux

Contents of /trunk/kernel-alx/patches-3.12/0100-3.12.1-all-fixes.patch

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2423 - (show annotations) (download)
Tue Mar 25 12:29:50 2014 UTC (10 years, 1 month ago) by niro
File size: 20631 byte(s)
-added 3.12 branch
1 diff --git a/Makefile b/Makefile
2 index 67077ad6edbb..eb29ec754a9e 100644
3 --- a/Makefile
4 +++ b/Makefile
5 @@ -1,6 +1,6 @@
6 VERSION = 3
7 PATCHLEVEL = 12
8 -SUBLEVEL = 0
9 +SUBLEVEL = 1
10 EXTRAVERSION =
11 NAME = One Giant Leap for Frogkind
12
13 diff --git a/drivers/misc/atmel_pwm.c b/drivers/misc/atmel_pwm.c
14 index 494d0500bda6..a6dc56e1bc58 100644
15 --- a/drivers/misc/atmel_pwm.c
16 +++ b/drivers/misc/atmel_pwm.c
17 @@ -90,8 +90,10 @@ int pwm_channel_alloc(int index, struct pwm_channel *ch)
18 unsigned long flags;
19 int status = 0;
20
21 - /* insist on PWM init, with this signal pinned out */
22 - if (!pwm || !(pwm->mask & 1 << index))
23 + if (!pwm)
24 + return -EPROBE_DEFER;
25 +
26 + if (!(pwm->mask & 1 << index))
27 return -ENODEV;
28
29 if (index < 0 || index >= PWM_NCHAN || !ch)
30 diff --git a/drivers/net/ethernet/chelsio/cxgb3/sge.c b/drivers/net/ethernet/chelsio/cxgb3/sge.c
31 index 9c89dc8fe105..632b318eb38a 100644
32 --- a/drivers/net/ethernet/chelsio/cxgb3/sge.c
33 +++ b/drivers/net/ethernet/chelsio/cxgb3/sge.c
34 @@ -1599,7 +1599,8 @@ static void write_ofld_wr(struct adapter *adap, struct sk_buff *skb,
35 flits = skb_transport_offset(skb) / 8;
36 sgp = ndesc == 1 ? (struct sg_ent *)&d->flit[flits] : sgl;
37 sgl_flits = make_sgl(skb, sgp, skb_transport_header(skb),
38 - skb->tail - skb->transport_header,
39 + skb_tail_pointer(skb) -
40 + skb_transport_header(skb),
41 adap->pdev);
42 if (need_skb_unmap()) {
43 setup_deferred_unmapping(skb, adap->pdev, sgp, sgl_flits);
44 diff --git a/drivers/net/ethernet/mellanox/mlx4/cmd.c b/drivers/net/ethernet/mellanox/mlx4/cmd.c
45 index ea20182c6969..bb11624a1f39 100644
46 --- a/drivers/net/ethernet/mellanox/mlx4/cmd.c
47 +++ b/drivers/net/ethernet/mellanox/mlx4/cmd.c
48 @@ -1691,7 +1691,7 @@ static void mlx4_master_deactivate_admin_state(struct mlx4_priv *priv, int slave
49 vp_oper->vlan_idx = NO_INDX;
50 }
51 if (NO_INDX != vp_oper->mac_idx) {
52 - __mlx4_unregister_mac(&priv->dev, port, vp_oper->mac_idx);
53 + __mlx4_unregister_mac(&priv->dev, port, vp_oper->state.mac);
54 vp_oper->mac_idx = NO_INDX;
55 }
56 }
57 diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
58 index 9fbdfcd1e1a0..bbc9cb84ec1f 100644
59 --- a/drivers/net/virtio_net.c
60 +++ b/drivers/net/virtio_net.c
61 @@ -1118,11 +1118,6 @@ static int virtnet_cpu_callback(struct notifier_block *nfb,
62 {
63 struct virtnet_info *vi = container_of(nfb, struct virtnet_info, nb);
64
65 - mutex_lock(&vi->config_lock);
66 -
67 - if (!vi->config_enable)
68 - goto done;
69 -
70 switch(action & ~CPU_TASKS_FROZEN) {
71 case CPU_ONLINE:
72 case CPU_DOWN_FAILED:
73 @@ -1136,8 +1131,6 @@ static int virtnet_cpu_callback(struct notifier_block *nfb,
74 break;
75 }
76
77 -done:
78 - mutex_unlock(&vi->config_lock);
79 return NOTIFY_OK;
80 }
81
82 @@ -1699,6 +1692,8 @@ static int virtnet_freeze(struct virtio_device *vdev)
83 struct virtnet_info *vi = vdev->priv;
84 int i;
85
86 + unregister_hotcpu_notifier(&vi->nb);
87 +
88 /* Prevent config work handler from accessing the device */
89 mutex_lock(&vi->config_lock);
90 vi->config_enable = false;
91 @@ -1747,6 +1742,10 @@ static int virtnet_restore(struct virtio_device *vdev)
92 virtnet_set_queues(vi, vi->curr_queue_pairs);
93 rtnl_unlock();
94
95 + err = register_hotcpu_notifier(&vi->nb);
96 + if (err)
97 + return err;
98 +
99 return 0;
100 }
101 #endif
102 diff --git a/drivers/net/xen-netback/common.h b/drivers/net/xen-netback/common.h
103 index 5715318d6bab..400fea1de080 100644
104 --- a/drivers/net/xen-netback/common.h
105 +++ b/drivers/net/xen-netback/common.h
106 @@ -163,6 +163,7 @@ struct xenvif {
107 unsigned long credit_usec;
108 unsigned long remaining_credit;
109 struct timer_list credit_timeout;
110 + u64 credit_window_start;
111
112 /* Statistics */
113 unsigned long rx_gso_checksum_fixup;
114 diff --git a/drivers/net/xen-netback/interface.c b/drivers/net/xen-netback/interface.c
115 index 01bb854c7f62..459935a6bfae 100644
116 --- a/drivers/net/xen-netback/interface.c
117 +++ b/drivers/net/xen-netback/interface.c
118 @@ -312,8 +312,7 @@ struct xenvif *xenvif_alloc(struct device *parent, domid_t domid,
119 vif->credit_bytes = vif->remaining_credit = ~0UL;
120 vif->credit_usec = 0UL;
121 init_timer(&vif->credit_timeout);
122 - /* Initialize 'expires' now: it's used to track the credit window. */
123 - vif->credit_timeout.expires = jiffies;
124 + vif->credit_window_start = get_jiffies_64();
125
126 dev->netdev_ops = &xenvif_netdev_ops;
127 dev->hw_features = NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_TSO;
128 diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c
129 index f3e591c611de..900da4b243ad 100644
130 --- a/drivers/net/xen-netback/netback.c
131 +++ b/drivers/net/xen-netback/netback.c
132 @@ -1185,9 +1185,8 @@ out:
133
134 static bool tx_credit_exceeded(struct xenvif *vif, unsigned size)
135 {
136 - unsigned long now = jiffies;
137 - unsigned long next_credit =
138 - vif->credit_timeout.expires +
139 + u64 now = get_jiffies_64();
140 + u64 next_credit = vif->credit_window_start +
141 msecs_to_jiffies(vif->credit_usec / 1000);
142
143 /* Timer could already be pending in rare cases. */
144 @@ -1195,8 +1194,8 @@ static bool tx_credit_exceeded(struct xenvif *vif, unsigned size)
145 return true;
146
147 /* Passed the point where we can replenish credit? */
148 - if (time_after_eq(now, next_credit)) {
149 - vif->credit_timeout.expires = now;
150 + if (time_after_eq64(now, next_credit)) {
151 + vif->credit_window_start = now;
152 tx_add_credit(vif);
153 }
154
155 @@ -1208,6 +1207,7 @@ static bool tx_credit_exceeded(struct xenvif *vif, unsigned size)
156 tx_credit_callback;
157 mod_timer(&vif->credit_timeout,
158 next_credit);
159 + vif->credit_window_start = next_credit;
160
161 return true;
162 }
163 diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
164 index d6a8d23f047b..f20a04494e16 100644
165 --- a/drivers/usb/core/hcd.c
166 +++ b/drivers/usb/core/hcd.c
167 @@ -1033,6 +1033,7 @@ static int register_root_hub(struct usb_hcd *hcd)
168 dev_name(&usb_dev->dev), retval);
169 return retval;
170 }
171 + usb_dev->lpm_capable = usb_device_supports_lpm(usb_dev);
172 }
173
174 retval = usb_new_device (usb_dev);
175 diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
176 index e6b682c6c236..879651cb6b45 100644
177 --- a/drivers/usb/core/hub.c
178 +++ b/drivers/usb/core/hub.c
179 @@ -135,7 +135,7 @@ struct usb_hub *usb_hub_to_struct_hub(struct usb_device *hdev)
180 return usb_get_intfdata(hdev->actconfig->interface[0]);
181 }
182
183 -static int usb_device_supports_lpm(struct usb_device *udev)
184 +int usb_device_supports_lpm(struct usb_device *udev)
185 {
186 /* USB 2.1 (and greater) devices indicate LPM support through
187 * their USB 2.0 Extended Capabilities BOS descriptor.
188 @@ -156,6 +156,11 @@ static int usb_device_supports_lpm(struct usb_device *udev)
189 "Power management will be impacted.\n");
190 return 0;
191 }
192 +
193 + /* udev is root hub */
194 + if (!udev->parent)
195 + return 1;
196 +
197 if (udev->parent->lpm_capable)
198 return 1;
199
200 diff --git a/drivers/usb/core/usb.h b/drivers/usb/core/usb.h
201 index 823857767a16..c49383669cd8 100644
202 --- a/drivers/usb/core/usb.h
203 +++ b/drivers/usb/core/usb.h
204 @@ -35,6 +35,7 @@ extern int usb_get_device_descriptor(struct usb_device *dev,
205 unsigned int size);
206 extern int usb_get_bos_descriptor(struct usb_device *dev);
207 extern void usb_release_bos_descriptor(struct usb_device *dev);
208 +extern int usb_device_supports_lpm(struct usb_device *udev);
209 extern char *usb_cache_string(struct usb_device *udev, int index);
210 extern int usb_set_configuration(struct usb_device *dev, int configuration);
211 extern int usb_choose_configuration(struct usb_device *udev);
212 diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
213 index acaee066b99a..c3d94853b4ab 100644
214 --- a/drivers/usb/serial/option.c
215 +++ b/drivers/usb/serial/option.c
216 @@ -1376,6 +1376,23 @@ static const struct usb_device_id option_ids[] = {
217 .driver_info = (kernel_ulong_t)&net_intf2_blacklist },
218 { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1426, 0xff, 0xff, 0xff), /* ZTE MF91 */
219 .driver_info = (kernel_ulong_t)&net_intf2_blacklist },
220 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1533, 0xff, 0xff, 0xff) },
221 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1534, 0xff, 0xff, 0xff) },
222 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1535, 0xff, 0xff, 0xff) },
223 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1545, 0xff, 0xff, 0xff) },
224 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1546, 0xff, 0xff, 0xff) },
225 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1547, 0xff, 0xff, 0xff) },
226 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1565, 0xff, 0xff, 0xff) },
227 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1566, 0xff, 0xff, 0xff) },
228 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1567, 0xff, 0xff, 0xff) },
229 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1589, 0xff, 0xff, 0xff) },
230 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1590, 0xff, 0xff, 0xff) },
231 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1591, 0xff, 0xff, 0xff) },
232 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1592, 0xff, 0xff, 0xff) },
233 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1594, 0xff, 0xff, 0xff) },
234 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1596, 0xff, 0xff, 0xff) },
235 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1598, 0xff, 0xff, 0xff) },
236 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1600, 0xff, 0xff, 0xff) },
237 { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x2002, 0xff,
238 0xff, 0xff), .driver_info = (kernel_ulong_t)&zte_k3765_z_blacklist },
239 { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x2003, 0xff, 0xff, 0xff) },
240 diff --git a/drivers/video/backlight/atmel-pwm-bl.c b/drivers/video/backlight/atmel-pwm-bl.c
241 index 0393d827dd44..f7447f7004fb 100644
242 --- a/drivers/video/backlight/atmel-pwm-bl.c
243 +++ b/drivers/video/backlight/atmel-pwm-bl.c
244 @@ -118,7 +118,7 @@ static const struct backlight_ops atmel_pwm_bl_ops = {
245 .update_status = atmel_pwm_bl_set_intensity,
246 };
247
248 -static int __init atmel_pwm_bl_probe(struct platform_device *pdev)
249 +static int atmel_pwm_bl_probe(struct platform_device *pdev)
250 {
251 struct backlight_properties props;
252 const struct atmel_pwm_bl_platform_data *pdata;
253 @@ -202,7 +202,7 @@ err_free_mem:
254 return retval;
255 }
256
257 -static int __exit atmel_pwm_bl_remove(struct platform_device *pdev)
258 +static int atmel_pwm_bl_remove(struct platform_device *pdev)
259 {
260 struct atmel_pwm_bl *pwmbl = platform_get_drvdata(pdev);
261
262 @@ -220,10 +220,11 @@ static struct platform_driver atmel_pwm_bl_driver = {
263 .name = "atmel-pwm-bl",
264 },
265 /* REVISIT add suspend() and resume() */
266 - .remove = __exit_p(atmel_pwm_bl_remove),
267 + .probe = atmel_pwm_bl_probe,
268 + .remove = atmel_pwm_bl_remove,
269 };
270
271 -module_platform_driver_probe(atmel_pwm_bl_driver, atmel_pwm_bl_probe);
272 +module_platform_driver(atmel_pwm_bl_driver);
273
274 MODULE_AUTHOR("Hans-Christian egtvedt <hans-christian.egtvedt@atmel.com>");
275 MODULE_DESCRIPTION("Atmel PWM backlight driver");
276 diff --git a/drivers/video/hyperv_fb.c b/drivers/video/hyperv_fb.c
277 index 8ac99b87c07e..8d456dc449b8 100644
278 --- a/drivers/video/hyperv_fb.c
279 +++ b/drivers/video/hyperv_fb.c
280 @@ -795,12 +795,21 @@ static int hvfb_remove(struct hv_device *hdev)
281 }
282
283
284 +static DEFINE_PCI_DEVICE_TABLE(pci_stub_id_table) = {
285 + {
286 + .vendor = PCI_VENDOR_ID_MICROSOFT,
287 + .device = PCI_DEVICE_ID_HYPERV_VIDEO,
288 + },
289 + { /* end of list */ }
290 +};
291 +
292 static const struct hv_vmbus_device_id id_table[] = {
293 /* Synthetic Video Device GUID */
294 {HV_SYNTHVID_GUID},
295 {}
296 };
297
298 +MODULE_DEVICE_TABLE(pci, pci_stub_id_table);
299 MODULE_DEVICE_TABLE(vmbus, id_table);
300
301 static struct hv_driver hvfb_drv = {
302 @@ -810,14 +819,43 @@ static struct hv_driver hvfb_drv = {
303 .remove = hvfb_remove,
304 };
305
306 +static int hvfb_pci_stub_probe(struct pci_dev *pdev,
307 + const struct pci_device_id *ent)
308 +{
309 + return 0;
310 +}
311 +
312 +static void hvfb_pci_stub_remove(struct pci_dev *pdev)
313 +{
314 +}
315 +
316 +static struct pci_driver hvfb_pci_stub_driver = {
317 + .name = KBUILD_MODNAME,
318 + .id_table = pci_stub_id_table,
319 + .probe = hvfb_pci_stub_probe,
320 + .remove = hvfb_pci_stub_remove,
321 +};
322
323 static int __init hvfb_drv_init(void)
324 {
325 - return vmbus_driver_register(&hvfb_drv);
326 + int ret;
327 +
328 + ret = vmbus_driver_register(&hvfb_drv);
329 + if (ret != 0)
330 + return ret;
331 +
332 + ret = pci_register_driver(&hvfb_pci_stub_driver);
333 + if (ret != 0) {
334 + vmbus_driver_unregister(&hvfb_drv);
335 + return ret;
336 + }
337 +
338 + return 0;
339 }
340
341 static void __exit hvfb_drv_exit(void)
342 {
343 + pci_unregister_driver(&hvfb_pci_stub_driver);
344 vmbus_driver_unregister(&hvfb_drv);
345 }
346
347 diff --git a/include/net/ip6_fib.h b/include/net/ip6_fib.h
348 index 48ec25a7fcb6..5e661a979694 100644
349 --- a/include/net/ip6_fib.h
350 +++ b/include/net/ip6_fib.h
351 @@ -165,6 +165,7 @@ static inline struct inet6_dev *ip6_dst_idev(struct dst_entry *dst)
352 static inline void rt6_clean_expires(struct rt6_info *rt)
353 {
354 rt->rt6i_flags &= ~RTF_EXPIRES;
355 + rt->dst.expires = 0;
356 }
357
358 static inline void rt6_set_expires(struct rt6_info *rt, unsigned long expires)
359 diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
360 index 7974ba20557d..b778e96e02a1 100644
361 --- a/kernel/trace/trace.c
362 +++ b/kernel/trace/trace.c
363 @@ -843,9 +843,12 @@ int trace_get_user(struct trace_parser *parser, const char __user *ubuf,
364 if (isspace(ch)) {
365 parser->buffer[parser->idx] = 0;
366 parser->cont = false;
367 - } else {
368 + } else if (parser->idx < parser->size - 1) {
369 parser->cont = true;
370 parser->buffer[parser->idx++] = ch;
371 + } else {
372 + ret = -EINVAL;
373 + goto out;
374 }
375
376 *ppos += read;
377 diff --git a/net/core/flow_dissector.c b/net/core/flow_dissector.c
378 index 8d7d0dd72db2..143b6fdb9647 100644
379 --- a/net/core/flow_dissector.c
380 +++ b/net/core/flow_dissector.c
381 @@ -40,7 +40,7 @@ again:
382 struct iphdr _iph;
383 ip:
384 iph = skb_header_pointer(skb, nhoff, sizeof(_iph), &_iph);
385 - if (!iph)
386 + if (!iph || iph->ihl < 5)
387 return false;
388
389 if (ip_is_fragment(iph))
390 diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
391 index a16b01b537ba..068c8fb0d158 100644
392 --- a/net/ipv4/tcp_input.c
393 +++ b/net/ipv4/tcp_input.c
394 @@ -2856,7 +2856,8 @@ static inline bool tcp_ack_update_rtt(struct sock *sk, const int flag,
395 * left edge of the send window.
396 * See draft-ietf-tcplw-high-performance-00, section 3.3.
397 */
398 - if (seq_rtt < 0 && tp->rx_opt.saw_tstamp && tp->rx_opt.rcv_tsecr)
399 + if (seq_rtt < 0 && tp->rx_opt.saw_tstamp && tp->rx_opt.rcv_tsecr &&
400 + flag & FLAG_ACKED)
401 seq_rtt = tcp_time_stamp - tp->rx_opt.rcv_tsecr;
402
403 if (seq_rtt < 0)
404 @@ -2871,14 +2872,19 @@ static inline bool tcp_ack_update_rtt(struct sock *sk, const int flag,
405 }
406
407 /* Compute time elapsed between (last) SYNACK and the ACK completing 3WHS. */
408 -static void tcp_synack_rtt_meas(struct sock *sk, struct request_sock *req)
409 +static void tcp_synack_rtt_meas(struct sock *sk, const u32 synack_stamp)
410 {
411 struct tcp_sock *tp = tcp_sk(sk);
412 s32 seq_rtt = -1;
413
414 - if (tp->lsndtime && !tp->total_retrans)
415 - seq_rtt = tcp_time_stamp - tp->lsndtime;
416 - tcp_ack_update_rtt(sk, FLAG_SYN_ACKED, seq_rtt, -1);
417 + if (synack_stamp && !tp->total_retrans)
418 + seq_rtt = tcp_time_stamp - synack_stamp;
419 +
420 + /* If the ACK acks both the SYNACK and the (Fast Open'd) data packets
421 + * sent in SYN_RECV, SYNACK RTT is the smooth RTT computed in tcp_ack()
422 + */
423 + if (!tp->srtt)
424 + tcp_ack_update_rtt(sk, FLAG_SYN_ACKED, seq_rtt, -1);
425 }
426
427 static void tcp_cong_avoid(struct sock *sk, u32 ack, u32 in_flight)
428 @@ -2981,6 +2987,7 @@ static int tcp_clean_rtx_queue(struct sock *sk, int prior_fackets,
429 s32 seq_rtt = -1;
430 s32 ca_seq_rtt = -1;
431 ktime_t last_ackt = net_invalid_timestamp();
432 + bool rtt_update;
433
434 while ((skb = tcp_write_queue_head(sk)) && skb != tcp_send_head(sk)) {
435 struct tcp_skb_cb *scb = TCP_SKB_CB(skb);
436 @@ -3057,14 +3064,13 @@ static int tcp_clean_rtx_queue(struct sock *sk, int prior_fackets,
437 if (skb && (TCP_SKB_CB(skb)->sacked & TCPCB_SACKED_ACKED))
438 flag |= FLAG_SACK_RENEGING;
439
440 - if (tcp_ack_update_rtt(sk, flag, seq_rtt, sack_rtt) ||
441 - (flag & FLAG_ACKED))
442 - tcp_rearm_rto(sk);
443 + rtt_update = tcp_ack_update_rtt(sk, flag, seq_rtt, sack_rtt);
444
445 if (flag & FLAG_ACKED) {
446 const struct tcp_congestion_ops *ca_ops
447 = inet_csk(sk)->icsk_ca_ops;
448
449 + tcp_rearm_rto(sk);
450 if (unlikely(icsk->icsk_mtup.probe_size &&
451 !after(tp->mtu_probe.probe_seq_end, tp->snd_una))) {
452 tcp_mtup_probe_success(sk);
453 @@ -3103,6 +3109,13 @@ static int tcp_clean_rtx_queue(struct sock *sk, int prior_fackets,
454
455 ca_ops->pkts_acked(sk, pkts_acked, rtt_us);
456 }
457 + } else if (skb && rtt_update && sack_rtt >= 0 &&
458 + sack_rtt > (s32)(now - TCP_SKB_CB(skb)->when)) {
459 + /* Do not re-arm RTO if the sack RTT is measured from data sent
460 + * after when the head was last (re)transmitted. Otherwise the
461 + * timeout may continue to extend in loss recovery.
462 + */
463 + tcp_rearm_rto(sk);
464 }
465
466 #if FASTRETRANS_DEBUG > 0
467 @@ -5587,6 +5600,7 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb,
468 struct request_sock *req;
469 int queued = 0;
470 bool acceptable;
471 + u32 synack_stamp;
472
473 tp->rx_opt.saw_tstamp = 0;
474
475 @@ -5669,9 +5683,11 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb,
476 * so release it.
477 */
478 if (req) {
479 + synack_stamp = tcp_rsk(req)->snt_synack;
480 tp->total_retrans = req->num_retrans;
481 reqsk_fastopen_remove(sk, req, false);
482 } else {
483 + synack_stamp = tp->lsndtime;
484 /* Make sure socket is routed, for correct metrics. */
485 icsk->icsk_af_ops->rebuild_header(sk);
486 tcp_init_congestion_control(sk);
487 @@ -5694,7 +5710,7 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb,
488 tp->snd_una = TCP_SKB_CB(skb)->ack_seq;
489 tp->snd_wnd = ntohs(th->window) << tp->rx_opt.snd_wscale;
490 tcp_init_wl(tp, TCP_SKB_CB(skb)->seq);
491 - tcp_synack_rtt_meas(sk, req);
492 + tcp_synack_rtt_meas(sk, synack_stamp);
493
494 if (tp->rx_opt.tstamp_ok)
495 tp->advmss -= TCPOLEN_TSTAMP_ALIGNED;
496 diff --git a/net/ipv4/tcp_offload.c b/net/ipv4/tcp_offload.c
497 index 3a7525e6c086..533c58a5cfb7 100644
498 --- a/net/ipv4/tcp_offload.c
499 +++ b/net/ipv4/tcp_offload.c
500 @@ -18,6 +18,7 @@ struct sk_buff *tcp_tso_segment(struct sk_buff *skb,
501 netdev_features_t features)
502 {
503 struct sk_buff *segs = ERR_PTR(-EINVAL);
504 + unsigned int sum_truesize = 0;
505 struct tcphdr *th;
506 unsigned int thlen;
507 unsigned int seq;
508 @@ -102,13 +103,7 @@ struct sk_buff *tcp_tso_segment(struct sk_buff *skb,
509 if (copy_destructor) {
510 skb->destructor = gso_skb->destructor;
511 skb->sk = gso_skb->sk;
512 - /* {tcp|sock}_wfree() use exact truesize accounting :
513 - * sum(skb->truesize) MUST be exactly be gso_skb->truesize
514 - * So we account mss bytes of 'true size' for each segment.
515 - * The last segment will contain the remaining.
516 - */
517 - skb->truesize = mss;
518 - gso_skb->truesize -= mss;
519 + sum_truesize += skb->truesize;
520 }
521 skb = skb->next;
522 th = tcp_hdr(skb);
523 @@ -125,7 +120,9 @@ struct sk_buff *tcp_tso_segment(struct sk_buff *skb,
524 if (copy_destructor) {
525 swap(gso_skb->sk, skb->sk);
526 swap(gso_skb->destructor, skb->destructor);
527 - swap(gso_skb->truesize, skb->truesize);
528 + sum_truesize += skb->truesize;
529 + atomic_add(sum_truesize - gso_skb->truesize,
530 + &skb->sk->sk_wmem_alloc);
531 }
532
533 delta = htonl(oldlen + (skb_tail_pointer(skb) -
534 diff --git a/net/ipv6/route.c b/net/ipv6/route.c
535 index f54e3a101098..04e17b3309fb 100644
536 --- a/net/ipv6/route.c
537 +++ b/net/ipv6/route.c
538 @@ -1087,10 +1087,13 @@ static struct dst_entry *ip6_dst_check(struct dst_entry *dst, u32 cookie)
539 if (rt->rt6i_genid != rt_genid_ipv6(dev_net(rt->dst.dev)))
540 return NULL;
541
542 - if (rt->rt6i_node && (rt->rt6i_node->fn_sernum == cookie))
543 - return dst;
544 + if (!rt->rt6i_node || (rt->rt6i_node->fn_sernum != cookie))
545 + return NULL;
546
547 - return NULL;
548 + if (rt6_check_expired(rt))
549 + return NULL;
550 +
551 + return dst;
552 }
553
554 static struct dst_entry *ip6_negative_advice(struct dst_entry *dst)
555 diff --git a/net/sctp/sm_sideeffect.c b/net/sctp/sm_sideeffect.c
556 index 666c66842799..1a6eef39ab2f 100644
557 --- a/net/sctp/sm_sideeffect.c
558 +++ b/net/sctp/sm_sideeffect.c
559 @@ -860,7 +860,6 @@ static void sctp_cmd_delete_tcb(sctp_cmd_seq_t *cmds,
560 (!asoc->temp) && (sk->sk_shutdown != SHUTDOWN_MASK))
561 return;
562
563 - BUG_ON(asoc->peer.primary_path == NULL);
564 sctp_unhash_established(asoc);
565 sctp_association_free(asoc);
566 }
567 diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c
568 index 50173d412ac5..8d2d01b0cf86 100644
569 --- a/sound/pci/hda/patch_hdmi.c
570 +++ b/sound/pci/hda/patch_hdmi.c
571 @@ -740,9 +740,10 @@ static int hdmi_manual_setup_channel_mapping(struct hda_codec *codec,
572 static void hdmi_setup_fake_chmap(unsigned char *map, int ca)
573 {
574 int i;
575 + int ordered_ca = get_channel_allocation_order(ca);
576 for (i = 0; i < 8; i++) {
577 - if (i < channel_allocations[ca].channels)
578 - map[i] = from_cea_slot((hdmi_channel_mapping[ca][i] >> 4) & 0x0f);
579 + if (i < channel_allocations[ordered_ca].channels)
580 + map[i] = from_cea_slot(hdmi_channel_mapping[ca][i] & 0x0f);
581 else
582 map[i] = 0;
583 }