Contents of /trunk/kernel-magellan/patches-4.16/0109-4.16.10-all-fixes.patch
Parent Directory | Revision Log
Revision 3113 -
(show annotations)
(download)
Tue May 22 11:46:30 2018 UTC (6 years, 4 months ago) by niro
File size: 61509 byte(s)
Tue May 22 11:46:30 2018 UTC (6 years, 4 months ago) by niro
File size: 61509 byte(s)
-linux-4.16.10
1 | diff --git a/Makefile b/Makefile |
2 | index ea3cb221d7c5..33f3c94f02ca 100644 |
3 | --- a/Makefile |
4 | +++ b/Makefile |
5 | @@ -1,7 +1,7 @@ |
6 | # SPDX-License-Identifier: GPL-2.0 |
7 | VERSION = 4 |
8 | PATCHLEVEL = 16 |
9 | -SUBLEVEL = 9 |
10 | +SUBLEVEL = 10 |
11 | EXTRAVERSION = |
12 | NAME = Fearless Coyote |
13 | |
14 | diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c |
15 | index 7f8bda3a2005..0881f7907848 100644 |
16 | --- a/drivers/infiniband/hw/mlx5/main.c |
17 | +++ b/drivers/infiniband/hw/mlx5/main.c |
18 | @@ -4303,7 +4303,7 @@ mlx5_ib_get_vector_affinity(struct ib_device *ibdev, int comp_vector) |
19 | { |
20 | struct mlx5_ib_dev *dev = to_mdev(ibdev); |
21 | |
22 | - return mlx5_get_vector_affinity(dev->mdev, comp_vector); |
23 | + return mlx5_get_vector_affinity_hint(dev->mdev, comp_vector); |
24 | } |
25 | |
26 | /* The mlx5_ib_multiport_mutex should be held when calling this function */ |
27 | diff --git a/drivers/net/bonding/bond_alb.c b/drivers/net/bonding/bond_alb.c |
28 | index 1ed9529e7bd1..5eb0df2e5464 100644 |
29 | --- a/drivers/net/bonding/bond_alb.c |
30 | +++ b/drivers/net/bonding/bond_alb.c |
31 | @@ -450,7 +450,7 @@ static void rlb_update_client(struct rlb_client_info *client_info) |
32 | { |
33 | int i; |
34 | |
35 | - if (!client_info->slave) |
36 | + if (!client_info->slave || !is_valid_ether_addr(client_info->mac_dst)) |
37 | return; |
38 | |
39 | for (i = 0; i < RLB_ARP_BURST_SIZE; i++) { |
40 | @@ -943,6 +943,10 @@ static void alb_send_lp_vid(struct slave *slave, u8 mac_addr[], |
41 | skb->priority = TC_PRIO_CONTROL; |
42 | skb->dev = slave->dev; |
43 | |
44 | + netdev_dbg(slave->bond->dev, |
45 | + "Send learning packet: dev %s mac %pM vlan %d\n", |
46 | + slave->dev->name, mac_addr, vid); |
47 | + |
48 | if (vid) |
49 | __vlan_hwaccel_put_tag(skb, vlan_proto, vid); |
50 | |
51 | @@ -965,14 +969,13 @@ static int alb_upper_dev_walk(struct net_device *upper, void *_data) |
52 | u8 *mac_addr = data->mac_addr; |
53 | struct bond_vlan_tag *tags; |
54 | |
55 | - if (is_vlan_dev(upper) && vlan_get_encap_level(upper) == 0) { |
56 | - if (strict_match && |
57 | - ether_addr_equal_64bits(mac_addr, |
58 | - upper->dev_addr)) { |
59 | + if (is_vlan_dev(upper) && |
60 | + bond->nest_level == vlan_get_encap_level(upper) - 1) { |
61 | + if (upper->addr_assign_type == NET_ADDR_STOLEN) { |
62 | alb_send_lp_vid(slave, mac_addr, |
63 | vlan_dev_vlan_proto(upper), |
64 | vlan_dev_vlan_id(upper)); |
65 | - } else if (!strict_match) { |
66 | + } else { |
67 | alb_send_lp_vid(slave, upper->dev_addr, |
68 | vlan_dev_vlan_proto(upper), |
69 | vlan_dev_vlan_id(upper)); |
70 | diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c |
71 | index 718e4914e3a0..1f1e97b26f95 100644 |
72 | --- a/drivers/net/bonding/bond_main.c |
73 | +++ b/drivers/net/bonding/bond_main.c |
74 | @@ -1738,6 +1738,8 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev, |
75 | if (bond_mode_uses_xmit_hash(bond)) |
76 | bond_update_slave_arr(bond, NULL); |
77 | |
78 | + bond->nest_level = dev_get_nest_level(bond_dev); |
79 | + |
80 | netdev_info(bond_dev, "Enslaving %s as %s interface with %s link\n", |
81 | slave_dev->name, |
82 | bond_is_active_slave(new_slave) ? "an active" : "a backup", |
83 | diff --git a/drivers/net/ethernet/broadcom/bcmsysport.c b/drivers/net/ethernet/broadcom/bcmsysport.c |
84 | index 3fc549b88c43..d61e51ebca51 100644 |
85 | --- a/drivers/net/ethernet/broadcom/bcmsysport.c |
86 | +++ b/drivers/net/ethernet/broadcom/bcmsysport.c |
87 | @@ -2052,14 +2052,21 @@ static const struct net_device_ops bcm_sysport_netdev_ops = { |
88 | .ndo_select_queue = bcm_sysport_select_queue, |
89 | }; |
90 | |
91 | -static int bcm_sysport_map_queues(struct net_device *dev, |
92 | +static int bcm_sysport_map_queues(struct notifier_block *nb, |
93 | struct dsa_notifier_register_info *info) |
94 | { |
95 | - struct bcm_sysport_priv *priv = netdev_priv(dev); |
96 | struct bcm_sysport_tx_ring *ring; |
97 | + struct bcm_sysport_priv *priv; |
98 | struct net_device *slave_dev; |
99 | unsigned int num_tx_queues; |
100 | unsigned int q, start, port; |
101 | + struct net_device *dev; |
102 | + |
103 | + priv = container_of(nb, struct bcm_sysport_priv, dsa_notifier); |
104 | + if (priv->netdev != info->master) |
105 | + return 0; |
106 | + |
107 | + dev = info->master; |
108 | |
109 | /* We can't be setting up queue inspection for non directly attached |
110 | * switches |
111 | @@ -2082,6 +2089,7 @@ static int bcm_sysport_map_queues(struct net_device *dev, |
112 | if (priv->is_lite) |
113 | netif_set_real_num_tx_queues(slave_dev, |
114 | slave_dev->num_tx_queues / 2); |
115 | + |
116 | num_tx_queues = slave_dev->real_num_tx_queues; |
117 | |
118 | if (priv->per_port_num_tx_queues && |
119 | @@ -2109,7 +2117,7 @@ static int bcm_sysport_map_queues(struct net_device *dev, |
120 | return 0; |
121 | } |
122 | |
123 | -static int bcm_sysport_dsa_notifier(struct notifier_block *unused, |
124 | +static int bcm_sysport_dsa_notifier(struct notifier_block *nb, |
125 | unsigned long event, void *ptr) |
126 | { |
127 | struct dsa_notifier_register_info *info; |
128 | @@ -2119,7 +2127,7 @@ static int bcm_sysport_dsa_notifier(struct notifier_block *unused, |
129 | |
130 | info = ptr; |
131 | |
132 | - return notifier_from_errno(bcm_sysport_map_queues(info->master, info)); |
133 | + return notifier_from_errno(bcm_sysport_map_queues(nb, info)); |
134 | } |
135 | |
136 | #define REV_FMT "v%2x.%02x" |
137 | diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c |
138 | index f2593978ae75..bde98a994e96 100644 |
139 | --- a/drivers/net/ethernet/broadcom/tg3.c |
140 | +++ b/drivers/net/ethernet/broadcom/tg3.c |
141 | @@ -8733,14 +8733,15 @@ static void tg3_free_consistent(struct tg3 *tp) |
142 | tg3_mem_rx_release(tp); |
143 | tg3_mem_tx_release(tp); |
144 | |
145 | - /* Protect tg3_get_stats64() from reading freed tp->hw_stats. */ |
146 | - tg3_full_lock(tp, 0); |
147 | + /* tp->hw_stats can be referenced safely: |
148 | + * 1. under rtnl_lock |
149 | + * 2. or under tp->lock if TG3_FLAG_INIT_COMPLETE is set. |
150 | + */ |
151 | if (tp->hw_stats) { |
152 | dma_free_coherent(&tp->pdev->dev, sizeof(struct tg3_hw_stats), |
153 | tp->hw_stats, tp->stats_mapping); |
154 | tp->hw_stats = NULL; |
155 | } |
156 | - tg3_full_unlock(tp); |
157 | } |
158 | |
159 | /* |
160 | @@ -14178,7 +14179,7 @@ static void tg3_get_stats64(struct net_device *dev, |
161 | struct tg3 *tp = netdev_priv(dev); |
162 | |
163 | spin_lock_bh(&tp->lock); |
164 | - if (!tp->hw_stats) { |
165 | + if (!tp->hw_stats || !tg3_flag(tp, INIT_COMPLETE)) { |
166 | *stats = tp->net_stats_prev; |
167 | spin_unlock_bh(&tp->lock); |
168 | return; |
169 | diff --git a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c |
170 | index f3302edba8b4..7f87db9734b8 100644 |
171 | --- a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c |
172 | +++ b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c |
173 | @@ -1013,6 +1013,22 @@ static int mlx4_en_set_coalesce(struct net_device *dev, |
174 | if (!coal->tx_max_coalesced_frames_irq) |
175 | return -EINVAL; |
176 | |
177 | + if (coal->tx_coalesce_usecs > MLX4_EN_MAX_COAL_TIME || |
178 | + coal->rx_coalesce_usecs > MLX4_EN_MAX_COAL_TIME || |
179 | + coal->rx_coalesce_usecs_low > MLX4_EN_MAX_COAL_TIME || |
180 | + coal->rx_coalesce_usecs_high > MLX4_EN_MAX_COAL_TIME) { |
181 | + netdev_info(dev, "%s: maximum coalesce time supported is %d usecs\n", |
182 | + __func__, MLX4_EN_MAX_COAL_TIME); |
183 | + return -ERANGE; |
184 | + } |
185 | + |
186 | + if (coal->tx_max_coalesced_frames > MLX4_EN_MAX_COAL_PKTS || |
187 | + coal->rx_max_coalesced_frames > MLX4_EN_MAX_COAL_PKTS) { |
188 | + netdev_info(dev, "%s: maximum coalesced frames supported is %d\n", |
189 | + __func__, MLX4_EN_MAX_COAL_PKTS); |
190 | + return -ERANGE; |
191 | + } |
192 | + |
193 | priv->rx_frames = (coal->rx_max_coalesced_frames == |
194 | MLX4_EN_AUTO_CONF) ? |
195 | MLX4_EN_RX_COAL_TARGET : |
196 | diff --git a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c |
197 | index 8fc51bc29003..41f8fbced11d 100644 |
198 | --- a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c |
199 | +++ b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c |
200 | @@ -3320,12 +3320,11 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port, |
201 | MAX_TX_RINGS, GFP_KERNEL); |
202 | if (!priv->tx_ring[t]) { |
203 | err = -ENOMEM; |
204 | - goto err_free_tx; |
205 | + goto out; |
206 | } |
207 | priv->tx_cq[t] = kzalloc(sizeof(struct mlx4_en_cq *) * |
208 | MAX_TX_RINGS, GFP_KERNEL); |
209 | if (!priv->tx_cq[t]) { |
210 | - kfree(priv->tx_ring[t]); |
211 | err = -ENOMEM; |
212 | goto out; |
213 | } |
214 | @@ -3578,11 +3577,6 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port, |
215 | |
216 | return 0; |
217 | |
218 | -err_free_tx: |
219 | - while (t--) { |
220 | - kfree(priv->tx_ring[t]); |
221 | - kfree(priv->tx_cq[t]); |
222 | - } |
223 | out: |
224 | mlx4_en_destroy_netdev(dev); |
225 | return err; |
226 | diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h |
227 | index f470ae37d937..4dabaf025b12 100644 |
228 | --- a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h |
229 | +++ b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h |
230 | @@ -132,6 +132,9 @@ |
231 | #define MLX4_EN_TX_COAL_PKTS 16 |
232 | #define MLX4_EN_TX_COAL_TIME 0x10 |
233 | |
234 | +#define MLX4_EN_MAX_COAL_PKTS U16_MAX |
235 | +#define MLX4_EN_MAX_COAL_TIME U16_MAX |
236 | + |
237 | #define MLX4_EN_RX_RATE_LOW 400000 |
238 | #define MLX4_EN_RX_COAL_TIME_LOW 0 |
239 | #define MLX4_EN_RX_RATE_HIGH 450000 |
240 | @@ -552,8 +555,8 @@ struct mlx4_en_priv { |
241 | u16 rx_usecs_low; |
242 | u32 pkt_rate_high; |
243 | u16 rx_usecs_high; |
244 | - u16 sample_interval; |
245 | - u16 adaptive_rx_coal; |
246 | + u32 sample_interval; |
247 | + u32 adaptive_rx_coal; |
248 | u32 msg_enable; |
249 | u32 loopback_ok; |
250 | u32 validate_loopback; |
251 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_dcbnl.c b/drivers/net/ethernet/mellanox/mlx5/core/en_dcbnl.c |
252 | index 3d46ef48d5b8..c641d5656b2d 100644 |
253 | --- a/drivers/net/ethernet/mellanox/mlx5/core/en_dcbnl.c |
254 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_dcbnl.c |
255 | @@ -1007,12 +1007,14 @@ static void mlx5e_trust_update_sq_inline_mode(struct mlx5e_priv *priv) |
256 | |
257 | mutex_lock(&priv->state_lock); |
258 | |
259 | - if (!test_bit(MLX5E_STATE_OPENED, &priv->state)) |
260 | - goto out; |
261 | - |
262 | new_channels.params = priv->channels.params; |
263 | mlx5e_trust_update_tx_min_inline_mode(priv, &new_channels.params); |
264 | |
265 | + if (!test_bit(MLX5E_STATE_OPENED, &priv->state)) { |
266 | + priv->channels.params = new_channels.params; |
267 | + goto out; |
268 | + } |
269 | + |
270 | /* Skip if tx_min_inline is the same */ |
271 | if (new_channels.params.tx_min_inline_mode == |
272 | priv->channels.params.tx_min_inline_mode) |
273 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c |
274 | index 43234cabf444..8665670fddbc 100644 |
275 | --- a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c |
276 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c |
277 | @@ -1260,6 +1260,10 @@ static int __parse_cls_flower(struct mlx5e_priv *priv, |
278 | f->mask); |
279 | addr_type = key->addr_type; |
280 | |
281 | + /* the HW doesn't support frag first/later */ |
282 | + if (mask->flags & FLOW_DIS_FIRST_FRAG) |
283 | + return -EOPNOTSUPP; |
284 | + |
285 | if (mask->flags & FLOW_DIS_IS_FRAGMENT) { |
286 | MLX5_SET(fte_match_set_lyr_2_4, headers_c, frag, 1); |
287 | MLX5_SET(fte_match_set_lyr_2_4, headers_v, frag, |
288 | @@ -1863,7 +1867,8 @@ static bool modify_header_match_supported(struct mlx5_flow_spec *spec, |
289 | } |
290 | |
291 | ip_proto = MLX5_GET(fte_match_set_lyr_2_4, headers_v, ip_protocol); |
292 | - if (modify_ip_header && ip_proto != IPPROTO_TCP && ip_proto != IPPROTO_UDP) { |
293 | + if (modify_ip_header && ip_proto != IPPROTO_TCP && |
294 | + ip_proto != IPPROTO_UDP && ip_proto != IPPROTO_ICMP) { |
295 | pr_info("can't offload re-write of ip proto %d\n", ip_proto); |
296 | return false; |
297 | } |
298 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c b/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c |
299 | index 11b4f1089d1c..ea725664f4f2 100644 |
300 | --- a/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c |
301 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c |
302 | @@ -255,7 +255,7 @@ mlx5e_txwqe_build_dsegs(struct mlx5e_txqsq *sq, struct sk_buff *skb, |
303 | dma_addr = dma_map_single(sq->pdev, skb_data, headlen, |
304 | DMA_TO_DEVICE); |
305 | if (unlikely(dma_mapping_error(sq->pdev, dma_addr))) |
306 | - return -ENOMEM; |
307 | + goto dma_unmap_wqe_err; |
308 | |
309 | dseg->addr = cpu_to_be64(dma_addr); |
310 | dseg->lkey = sq->mkey_be; |
311 | @@ -273,7 +273,7 @@ mlx5e_txwqe_build_dsegs(struct mlx5e_txqsq *sq, struct sk_buff *skb, |
312 | dma_addr = skb_frag_dma_map(sq->pdev, frag, 0, fsz, |
313 | DMA_TO_DEVICE); |
314 | if (unlikely(dma_mapping_error(sq->pdev, dma_addr))) |
315 | - return -ENOMEM; |
316 | + goto dma_unmap_wqe_err; |
317 | |
318 | dseg->addr = cpu_to_be64(dma_addr); |
319 | dseg->lkey = sq->mkey_be; |
320 | @@ -285,6 +285,10 @@ mlx5e_txwqe_build_dsegs(struct mlx5e_txqsq *sq, struct sk_buff *skb, |
321 | } |
322 | |
323 | return num_dma; |
324 | + |
325 | +dma_unmap_wqe_err: |
326 | + mlx5e_dma_unmap_wqe_err(sq, num_dma); |
327 | + return -ENOMEM; |
328 | } |
329 | |
330 | static inline void |
331 | @@ -380,17 +384,15 @@ static netdev_tx_t mlx5e_sq_xmit(struct mlx5e_txqsq *sq, struct sk_buff *skb, |
332 | num_dma = mlx5e_txwqe_build_dsegs(sq, skb, skb_data, headlen, |
333 | (struct mlx5_wqe_data_seg *)cseg + ds_cnt); |
334 | if (unlikely(num_dma < 0)) |
335 | - goto dma_unmap_wqe_err; |
336 | + goto err_drop; |
337 | |
338 | mlx5e_txwqe_complete(sq, skb, opcode, ds_cnt + num_dma, |
339 | num_bytes, num_dma, wi, cseg); |
340 | |
341 | return NETDEV_TX_OK; |
342 | |
343 | -dma_unmap_wqe_err: |
344 | +err_drop: |
345 | sq->stats.dropped++; |
346 | - mlx5e_dma_unmap_wqe_err(sq, wi->num_dma); |
347 | - |
348 | dev_kfree_skb_any(skb); |
349 | |
350 | return NETDEV_TX_OK; |
351 | @@ -620,17 +622,15 @@ netdev_tx_t mlx5i_sq_xmit(struct mlx5e_txqsq *sq, struct sk_buff *skb, |
352 | num_dma = mlx5e_txwqe_build_dsegs(sq, skb, skb_data, headlen, |
353 | (struct mlx5_wqe_data_seg *)cseg + ds_cnt); |
354 | if (unlikely(num_dma < 0)) |
355 | - goto dma_unmap_wqe_err; |
356 | + goto err_drop; |
357 | |
358 | mlx5e_txwqe_complete(sq, skb, opcode, ds_cnt + num_dma, |
359 | num_bytes, num_dma, wi, cseg); |
360 | |
361 | return NETDEV_TX_OK; |
362 | |
363 | -dma_unmap_wqe_err: |
364 | +err_drop: |
365 | sq->stats.dropped++; |
366 | - mlx5e_dma_unmap_wqe_err(sq, wi->num_dma); |
367 | - |
368 | dev_kfree_skb_any(skb); |
369 | |
370 | return NETDEV_TX_OK; |
371 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c |
372 | index c2b1d7d351fc..0f745df1506c 100644 |
373 | --- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c |
374 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c |
375 | @@ -2143,26 +2143,35 @@ int mlx5_eswitch_get_vport_stats(struct mlx5_eswitch *esw, |
376 | memset(vf_stats, 0, sizeof(*vf_stats)); |
377 | vf_stats->rx_packets = |
378 | MLX5_GET_CTR(out, received_eth_unicast.packets) + |
379 | + MLX5_GET_CTR(out, received_ib_unicast.packets) + |
380 | MLX5_GET_CTR(out, received_eth_multicast.packets) + |
381 | + MLX5_GET_CTR(out, received_ib_multicast.packets) + |
382 | MLX5_GET_CTR(out, received_eth_broadcast.packets); |
383 | |
384 | vf_stats->rx_bytes = |
385 | MLX5_GET_CTR(out, received_eth_unicast.octets) + |
386 | + MLX5_GET_CTR(out, received_ib_unicast.octets) + |
387 | MLX5_GET_CTR(out, received_eth_multicast.octets) + |
388 | + MLX5_GET_CTR(out, received_ib_multicast.octets) + |
389 | MLX5_GET_CTR(out, received_eth_broadcast.octets); |
390 | |
391 | vf_stats->tx_packets = |
392 | MLX5_GET_CTR(out, transmitted_eth_unicast.packets) + |
393 | + MLX5_GET_CTR(out, transmitted_ib_unicast.packets) + |
394 | MLX5_GET_CTR(out, transmitted_eth_multicast.packets) + |
395 | + MLX5_GET_CTR(out, transmitted_ib_multicast.packets) + |
396 | MLX5_GET_CTR(out, transmitted_eth_broadcast.packets); |
397 | |
398 | vf_stats->tx_bytes = |
399 | MLX5_GET_CTR(out, transmitted_eth_unicast.octets) + |
400 | + MLX5_GET_CTR(out, transmitted_ib_unicast.octets) + |
401 | MLX5_GET_CTR(out, transmitted_eth_multicast.octets) + |
402 | + MLX5_GET_CTR(out, transmitted_ib_multicast.octets) + |
403 | MLX5_GET_CTR(out, transmitted_eth_broadcast.octets); |
404 | |
405 | vf_stats->multicast = |
406 | - MLX5_GET_CTR(out, received_eth_multicast.packets); |
407 | + MLX5_GET_CTR(out, received_eth_multicast.packets) + |
408 | + MLX5_GET_CTR(out, received_ib_multicast.packets); |
409 | |
410 | vf_stats->broadcast = |
411 | MLX5_GET_CTR(out, received_eth_broadcast.packets); |
412 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c |
413 | index 31fc2cfac3b3..4d5b87e0d472 100644 |
414 | --- a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c |
415 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c |
416 | @@ -185,6 +185,7 @@ static void del_sw_ns(struct fs_node *node); |
417 | static void del_sw_hw_rule(struct fs_node *node); |
418 | static bool mlx5_flow_dests_cmp(struct mlx5_flow_destination *d1, |
419 | struct mlx5_flow_destination *d2); |
420 | +static void cleanup_root_ns(struct mlx5_flow_root_namespace *root_ns); |
421 | static struct mlx5_flow_rule * |
422 | find_flow_rule(struct fs_fte *fte, |
423 | struct mlx5_flow_destination *dest); |
424 | @@ -2329,23 +2330,27 @@ static int create_anchor_flow_table(struct mlx5_flow_steering *steering) |
425 | |
426 | static int init_root_ns(struct mlx5_flow_steering *steering) |
427 | { |
428 | + int err; |
429 | + |
430 | steering->root_ns = create_root_ns(steering, FS_FT_NIC_RX); |
431 | if (!steering->root_ns) |
432 | - goto cleanup; |
433 | + return -ENOMEM; |
434 | |
435 | - if (init_root_tree(steering, &root_fs, &steering->root_ns->ns.node)) |
436 | - goto cleanup; |
437 | + err = init_root_tree(steering, &root_fs, &steering->root_ns->ns.node); |
438 | + if (err) |
439 | + goto out_err; |
440 | |
441 | set_prio_attrs(steering->root_ns); |
442 | - |
443 | - if (create_anchor_flow_table(steering)) |
444 | - goto cleanup; |
445 | + err = create_anchor_flow_table(steering); |
446 | + if (err) |
447 | + goto out_err; |
448 | |
449 | return 0; |
450 | |
451 | -cleanup: |
452 | - mlx5_cleanup_fs(steering->dev); |
453 | - return -ENOMEM; |
454 | +out_err: |
455 | + cleanup_root_ns(steering->root_ns); |
456 | + steering->root_ns = NULL; |
457 | + return err; |
458 | } |
459 | |
460 | static void clean_tree(struct fs_node *node) |
461 | diff --git a/drivers/net/ethernet/mellanox/mlxsw/core.c b/drivers/net/ethernet/mellanox/mlxsw/core.c |
462 | index 3529b545675d..1c09a274c637 100644 |
463 | --- a/drivers/net/ethernet/mellanox/mlxsw/core.c |
464 | +++ b/drivers/net/ethernet/mellanox/mlxsw/core.c |
465 | @@ -1099,11 +1099,11 @@ int mlxsw_core_bus_device_register(const struct mlxsw_bus_info *mlxsw_bus_info, |
466 | err_alloc_lag_mapping: |
467 | mlxsw_ports_fini(mlxsw_core); |
468 | err_ports_init: |
469 | - mlxsw_bus->fini(bus_priv); |
470 | -err_bus_init: |
471 | if (!reload) |
472 | devlink_resources_unregister(devlink, NULL); |
473 | err_register_resources: |
474 | + mlxsw_bus->fini(bus_priv); |
475 | +err_bus_init: |
476 | if (!reload) |
477 | devlink_free(devlink); |
478 | err_devlink_alloc: |
479 | diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c |
480 | index 161bcdc012f0..fd6b86892595 100644 |
481 | --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c |
482 | +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c |
483 | @@ -1718,13 +1718,11 @@ __mlxsw_sp_port_mdb_del(struct mlxsw_sp_port *mlxsw_sp_port, |
484 | struct net_device *dev = mlxsw_sp_port->dev; |
485 | int err; |
486 | |
487 | - if (bridge_port->bridge_device->multicast_enabled) { |
488 | - if (bridge_port->bridge_device->multicast_enabled) { |
489 | - err = mlxsw_sp_port_smid_set(mlxsw_sp_port, mid->mid, |
490 | - false); |
491 | - if (err) |
492 | - netdev_err(dev, "Unable to remove port from SMID\n"); |
493 | - } |
494 | + if (bridge_port->bridge_device->multicast_enabled && |
495 | + !bridge_port->mrouter) { |
496 | + err = mlxsw_sp_port_smid_set(mlxsw_sp_port, mid->mid, false); |
497 | + if (err) |
498 | + netdev_err(dev, "Unable to remove port from SMID\n"); |
499 | } |
500 | |
501 | err = mlxsw_sp_port_remove_from_mid(mlxsw_sp_port, mid); |
502 | diff --git a/drivers/net/ethernet/netronome/nfp/flower/action.c b/drivers/net/ethernet/netronome/nfp/flower/action.c |
503 | index b3567a596fc1..80df9a5d4217 100644 |
504 | --- a/drivers/net/ethernet/netronome/nfp/flower/action.c |
505 | +++ b/drivers/net/ethernet/netronome/nfp/flower/action.c |
506 | @@ -183,17 +183,21 @@ static int |
507 | nfp_fl_set_ipv4_udp_tun(struct nfp_fl_set_ipv4_udp_tun *set_tun, |
508 | const struct tc_action *action, |
509 | struct nfp_fl_pre_tunnel *pre_tun, |
510 | - enum nfp_flower_tun_type tun_type) |
511 | + enum nfp_flower_tun_type tun_type, |
512 | + struct net_device *netdev) |
513 | { |
514 | size_t act_size = sizeof(struct nfp_fl_set_ipv4_udp_tun); |
515 | struct ip_tunnel_info *ip_tun = tcf_tunnel_info(action); |
516 | u32 tmp_set_ip_tun_type_index = 0; |
517 | /* Currently support one pre-tunnel so index is always 0. */ |
518 | int pretun_idx = 0; |
519 | + struct net *net; |
520 | |
521 | if (ip_tun->options_len) |
522 | return -EOPNOTSUPP; |
523 | |
524 | + net = dev_net(netdev); |
525 | + |
526 | set_tun->head.jump_id = NFP_FL_ACTION_OPCODE_SET_IPV4_TUNNEL; |
527 | set_tun->head.len_lw = act_size >> NFP_FL_LW_SIZ; |
528 | |
529 | @@ -204,6 +208,7 @@ nfp_fl_set_ipv4_udp_tun(struct nfp_fl_set_ipv4_udp_tun *set_tun, |
530 | |
531 | set_tun->tun_type_index = cpu_to_be32(tmp_set_ip_tun_type_index); |
532 | set_tun->tun_id = ip_tun->key.tun_id; |
533 | + set_tun->ttl = net->ipv4.sysctl_ip_default_ttl; |
534 | |
535 | /* Complete pre_tunnel action. */ |
536 | pre_tun->ipv4_dst = ip_tun->key.u.ipv4.dst; |
537 | @@ -511,7 +516,8 @@ nfp_flower_loop_action(const struct tc_action *a, |
538 | *a_len += sizeof(struct nfp_fl_pre_tunnel); |
539 | |
540 | set_tun = (void *)&nfp_fl->action_data[*a_len]; |
541 | - err = nfp_fl_set_ipv4_udp_tun(set_tun, a, pre_tun, *tun_type); |
542 | + err = nfp_fl_set_ipv4_udp_tun(set_tun, a, pre_tun, *tun_type, |
543 | + netdev); |
544 | if (err) |
545 | return err; |
546 | *a_len += sizeof(struct nfp_fl_set_ipv4_udp_tun); |
547 | diff --git a/drivers/net/ethernet/netronome/nfp/flower/cmsg.h b/drivers/net/ethernet/netronome/nfp/flower/cmsg.h |
548 | index adfe474c2cf0..329a9b6d453a 100644 |
549 | --- a/drivers/net/ethernet/netronome/nfp/flower/cmsg.h |
550 | +++ b/drivers/net/ethernet/netronome/nfp/flower/cmsg.h |
551 | @@ -178,7 +178,10 @@ struct nfp_fl_set_ipv4_udp_tun { |
552 | __be16 reserved; |
553 | __be64 tun_id __packed; |
554 | __be32 tun_type_index; |
555 | - __be32 extra[3]; |
556 | + __be16 reserved2; |
557 | + u8 ttl; |
558 | + u8 reserved3; |
559 | + __be32 extra[2]; |
560 | }; |
561 | |
562 | /* Metadata with L2 (1W/4B) |
563 | diff --git a/drivers/net/ethernet/realtek/8139too.c b/drivers/net/ethernet/realtek/8139too.c |
564 | index d24b47b8e0b2..d118da5a10a2 100644 |
565 | --- a/drivers/net/ethernet/realtek/8139too.c |
566 | +++ b/drivers/net/ethernet/realtek/8139too.c |
567 | @@ -2224,7 +2224,7 @@ static void rtl8139_poll_controller(struct net_device *dev) |
568 | struct rtl8139_private *tp = netdev_priv(dev); |
569 | const int irq = tp->pci_dev->irq; |
570 | |
571 | - disable_irq(irq); |
572 | + disable_irq_nosync(irq); |
573 | rtl8139_interrupt(irq, dev); |
574 | enable_irq(irq); |
575 | } |
576 | diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c |
577 | index b4779acb6b5c..18bb1e226e6d 100644 |
578 | --- a/drivers/net/ethernet/realtek/r8169.c |
579 | +++ b/drivers/net/ethernet/realtek/r8169.c |
580 | @@ -5087,6 +5087,9 @@ static void rtl_pll_power_down(struct rtl8169_private *tp) |
581 | static void rtl_pll_power_up(struct rtl8169_private *tp) |
582 | { |
583 | rtl_generic_op(tp, tp->pll_power_ops.up); |
584 | + |
585 | + /* give MAC/PHY some time to resume */ |
586 | + msleep(20); |
587 | } |
588 | |
589 | static void rtl_init_pll_power_ops(struct rtl8169_private *tp) |
590 | diff --git a/drivers/net/ethernet/sun/niu.c b/drivers/net/ethernet/sun/niu.c |
591 | index 8dd545fed30d..6c94af263be8 100644 |
592 | --- a/drivers/net/ethernet/sun/niu.c |
593 | +++ b/drivers/net/ethernet/sun/niu.c |
594 | @@ -3443,7 +3443,7 @@ static int niu_process_rx_pkt(struct napi_struct *napi, struct niu *np, |
595 | |
596 | len = (val & RCR_ENTRY_L2_LEN) >> |
597 | RCR_ENTRY_L2_LEN_SHIFT; |
598 | - len -= ETH_FCS_LEN; |
599 | + append_size = len + ETH_HLEN + ETH_FCS_LEN; |
600 | |
601 | addr = (val & RCR_ENTRY_PKT_BUF_ADDR) << |
602 | RCR_ENTRY_PKT_BUF_ADDR_SHIFT; |
603 | @@ -3453,7 +3453,6 @@ static int niu_process_rx_pkt(struct napi_struct *napi, struct niu *np, |
604 | RCR_ENTRY_PKTBUFSZ_SHIFT]; |
605 | |
606 | off = addr & ~PAGE_MASK; |
607 | - append_size = rcr_size; |
608 | if (num_rcr == 1) { |
609 | int ptype; |
610 | |
611 | @@ -3466,7 +3465,7 @@ static int niu_process_rx_pkt(struct napi_struct *napi, struct niu *np, |
612 | else |
613 | skb_checksum_none_assert(skb); |
614 | } else if (!(val & RCR_ENTRY_MULTI)) |
615 | - append_size = len - skb->len; |
616 | + append_size = append_size - skb->len; |
617 | |
618 | niu_rx_skb_append(skb, page, off, append_size, rcr_size); |
619 | if ((page->index + rp->rbr_block_size) - rcr_size == addr) { |
620 | diff --git a/drivers/net/ethernet/ti/cpsw.c b/drivers/net/ethernet/ti/cpsw.c |
621 | index 33c35b2df7d5..5490c7d09c16 100644 |
622 | --- a/drivers/net/ethernet/ti/cpsw.c |
623 | +++ b/drivers/net/ethernet/ti/cpsw.c |
624 | @@ -1278,6 +1278,8 @@ static inline void cpsw_add_dual_emac_def_ale_entries( |
625 | cpsw_ale_add_ucast(cpsw->ale, priv->mac_addr, |
626 | HOST_PORT_NUM, ALE_VLAN | |
627 | ALE_SECURE, slave->port_vlan); |
628 | + cpsw_ale_control_set(cpsw->ale, slave_port, |
629 | + ALE_PORT_DROP_UNKNOWN_VLAN, 1); |
630 | } |
631 | |
632 | static void soft_reset_slave(struct cpsw_slave *slave) |
633 | diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c |
634 | index f28c85d212ce..4774766fe20d 100644 |
635 | --- a/drivers/net/hyperv/netvsc_drv.c |
636 | +++ b/drivers/net/hyperv/netvsc_drv.c |
637 | @@ -1840,7 +1840,8 @@ static int netvsc_vf_join(struct net_device *vf_netdev, |
638 | goto rx_handler_failed; |
639 | } |
640 | |
641 | - ret = netdev_upper_dev_link(vf_netdev, ndev, NULL); |
642 | + ret = netdev_master_upper_dev_link(vf_netdev, ndev, |
643 | + NULL, NULL, NULL); |
644 | if (ret != 0) { |
645 | netdev_err(vf_netdev, |
646 | "can not set master device %s (err = %d)\n", |
647 | diff --git a/drivers/net/hyperv/rndis_filter.c b/drivers/net/hyperv/rndis_filter.c |
648 | index 465c42e30508..95846f0321f3 100644 |
649 | --- a/drivers/net/hyperv/rndis_filter.c |
650 | +++ b/drivers/net/hyperv/rndis_filter.c |
651 | @@ -1282,7 +1282,7 @@ struct netvsc_device *rndis_filter_device_add(struct hv_device *dev, |
652 | rndis_device->link_state ? "down" : "up"); |
653 | |
654 | if (net_device->nvsp_version < NVSP_PROTOCOL_VERSION_5) |
655 | - return net_device; |
656 | + goto out; |
657 | |
658 | rndis_filter_query_link_speed(rndis_device, net_device); |
659 | |
660 | diff --git a/drivers/net/phy/sfp-bus.c b/drivers/net/phy/sfp-bus.c |
661 | index 8961209ee949..a386138c7255 100644 |
662 | --- a/drivers/net/phy/sfp-bus.c |
663 | +++ b/drivers/net/phy/sfp-bus.c |
664 | @@ -190,7 +190,7 @@ void sfp_parse_support(struct sfp_bus *bus, const struct sfp_eeprom_id *id, |
665 | if (id->base.br_nominal) { |
666 | if (id->base.br_nominal != 255) { |
667 | br_nom = id->base.br_nominal * 100; |
668 | - br_min = br_nom + id->base.br_nominal * id->ext.br_min; |
669 | + br_min = br_nom - id->base.br_nominal * id->ext.br_min; |
670 | br_max = br_nom + id->base.br_nominal * id->ext.br_max; |
671 | } else if (id->ext.br_max) { |
672 | br_nom = 250 * id->ext.br_max; |
673 | diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c |
674 | index 51c68fc416fa..42565dd33aa6 100644 |
675 | --- a/drivers/net/usb/qmi_wwan.c |
676 | +++ b/drivers/net/usb/qmi_wwan.c |
677 | @@ -1344,6 +1344,18 @@ static int qmi_wwan_probe(struct usb_interface *intf, |
678 | id->driver_info = (unsigned long)&qmi_wwan_info; |
679 | } |
680 | |
681 | + /* There are devices where the same interface number can be |
682 | + * configured as different functions. We should only bind to |
683 | + * vendor specific functions when matching on interface number |
684 | + */ |
685 | + if (id->match_flags & USB_DEVICE_ID_MATCH_INT_NUMBER && |
686 | + desc->bInterfaceClass != USB_CLASS_VENDOR_SPEC) { |
687 | + dev_dbg(&intf->dev, |
688 | + "Rejecting interface number match for class %02x\n", |
689 | + desc->bInterfaceClass); |
690 | + return -ENODEV; |
691 | + } |
692 | + |
693 | /* Quectel EC20 quirk where we've QMI on interface 4 instead of 0 */ |
694 | if (quectel_ec20_detected(intf) && desc->bInterfaceNumber == 0) { |
695 | dev_dbg(&intf->dev, "Quectel EC20 quirk, skipping interface 0\n"); |
696 | diff --git a/drivers/scsi/aacraid/commsup.c b/drivers/scsi/aacraid/commsup.c |
697 | index 84858d5c8257..d9f2229664ad 100644 |
698 | --- a/drivers/scsi/aacraid/commsup.c |
699 | +++ b/drivers/scsi/aacraid/commsup.c |
700 | @@ -724,6 +724,8 @@ int aac_hba_send(u8 command, struct fib *fibptr, fib_callback callback, |
701 | int wait; |
702 | unsigned long flags = 0; |
703 | unsigned long mflags = 0; |
704 | + struct aac_hba_cmd_req *hbacmd = (struct aac_hba_cmd_req *) |
705 | + fibptr->hw_fib_va; |
706 | |
707 | fibptr->flags = (FIB_CONTEXT_FLAG | FIB_CONTEXT_FLAG_NATIVE_HBA); |
708 | if (callback) { |
709 | @@ -734,11 +736,9 @@ int aac_hba_send(u8 command, struct fib *fibptr, fib_callback callback, |
710 | wait = 1; |
711 | |
712 | |
713 | - if (command == HBA_IU_TYPE_SCSI_CMD_REQ) { |
714 | - struct aac_hba_cmd_req *hbacmd = |
715 | - (struct aac_hba_cmd_req *)fibptr->hw_fib_va; |
716 | + hbacmd->iu_type = command; |
717 | |
718 | - hbacmd->iu_type = command; |
719 | + if (command == HBA_IU_TYPE_SCSI_CMD_REQ) { |
720 | /* bit1 of request_id must be 0 */ |
721 | hbacmd->request_id = |
722 | cpu_to_le32((((u32)(fibptr - dev->fibs)) << 2) + 1); |
723 | diff --git a/fs/proc/base.c b/fs/proc/base.c |
724 | index 9298324325ed..f034eccd8616 100644 |
725 | --- a/fs/proc/base.c |
726 | +++ b/fs/proc/base.c |
727 | @@ -264,7 +264,7 @@ static ssize_t proc_pid_cmdline_read(struct file *file, char __user *buf, |
728 | * Inherently racy -- command line shares address space |
729 | * with code and data. |
730 | */ |
731 | - rv = access_remote_vm(mm, arg_end - 1, &c, 1, 0); |
732 | + rv = access_remote_vm(mm, arg_end - 1, &c, 1, FOLL_ANON); |
733 | if (rv <= 0) |
734 | goto out_free_page; |
735 | |
736 | @@ -282,7 +282,7 @@ static ssize_t proc_pid_cmdline_read(struct file *file, char __user *buf, |
737 | int nr_read; |
738 | |
739 | _count = min3(count, len, PAGE_SIZE); |
740 | - nr_read = access_remote_vm(mm, p, page, _count, 0); |
741 | + nr_read = access_remote_vm(mm, p, page, _count, FOLL_ANON); |
742 | if (nr_read < 0) |
743 | rv = nr_read; |
744 | if (nr_read <= 0) |
745 | @@ -328,7 +328,7 @@ static ssize_t proc_pid_cmdline_read(struct file *file, char __user *buf, |
746 | bool final; |
747 | |
748 | _count = min3(count, len, PAGE_SIZE); |
749 | - nr_read = access_remote_vm(mm, p, page, _count, 0); |
750 | + nr_read = access_remote_vm(mm, p, page, _count, FOLL_ANON); |
751 | if (nr_read < 0) |
752 | rv = nr_read; |
753 | if (nr_read <= 0) |
754 | @@ -946,7 +946,7 @@ static ssize_t environ_read(struct file *file, char __user *buf, |
755 | max_len = min_t(size_t, PAGE_SIZE, count); |
756 | this_len = min(max_len, this_len); |
757 | |
758 | - retval = access_remote_vm(mm, (env_start + src), page, this_len, 0); |
759 | + retval = access_remote_vm(mm, (env_start + src), page, this_len, FOLL_ANON); |
760 | |
761 | if (retval <= 0) { |
762 | ret = retval; |
763 | diff --git a/include/linux/mlx5/driver.h b/include/linux/mlx5/driver.h |
764 | index 9d3a03364e6e..1352b1b990a7 100644 |
765 | --- a/include/linux/mlx5/driver.h |
766 | +++ b/include/linux/mlx5/driver.h |
767 | @@ -1269,25 +1269,19 @@ enum { |
768 | }; |
769 | |
770 | static inline const struct cpumask * |
771 | -mlx5_get_vector_affinity(struct mlx5_core_dev *dev, int vector) |
772 | +mlx5_get_vector_affinity_hint(struct mlx5_core_dev *dev, int vector) |
773 | { |
774 | - const struct cpumask *mask; |
775 | struct irq_desc *desc; |
776 | unsigned int irq; |
777 | int eqn; |
778 | int err; |
779 | |
780 | - err = mlx5_vector2eqn(dev, MLX5_EQ_VEC_COMP_BASE + vector, &eqn, &irq); |
781 | + err = mlx5_vector2eqn(dev, vector, &eqn, &irq); |
782 | if (err) |
783 | return NULL; |
784 | |
785 | desc = irq_to_desc(irq); |
786 | -#ifdef CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK |
787 | - mask = irq_data_get_effective_affinity_mask(&desc->irq_data); |
788 | -#else |
789 | - mask = desc->irq_common_data.affinity; |
790 | -#endif |
791 | - return mask; |
792 | + return desc->affinity_hint; |
793 | } |
794 | |
795 | #endif /* MLX5_DRIVER_H */ |
796 | diff --git a/include/linux/mm.h b/include/linux/mm.h |
797 | index 95a2d748e978..a4e9bdbec490 100644 |
798 | --- a/include/linux/mm.h |
799 | +++ b/include/linux/mm.h |
800 | @@ -2441,6 +2441,7 @@ static inline struct page *follow_page(struct vm_area_struct *vma, |
801 | #define FOLL_MLOCK 0x1000 /* lock present pages */ |
802 | #define FOLL_REMOTE 0x2000 /* we are working on non-current tsk/mm */ |
803 | #define FOLL_COW 0x4000 /* internal GUP flag */ |
804 | +#define FOLL_ANON 0x8000 /* don't do file mappings */ |
805 | |
806 | static inline int vm_fault_to_errno(int vm_fault, int foll_flags) |
807 | { |
808 | diff --git a/include/net/bonding.h b/include/net/bonding.h |
809 | index f801fc940b29..b52235158836 100644 |
810 | --- a/include/net/bonding.h |
811 | +++ b/include/net/bonding.h |
812 | @@ -198,6 +198,7 @@ struct bonding { |
813 | struct slave __rcu *primary_slave; |
814 | struct bond_up_slave __rcu *slave_arr; /* Array of usable slaves */ |
815 | bool force_primary; |
816 | + u32 nest_level; |
817 | s32 slave_cnt; /* never change this value outside the attach/detach wrappers */ |
818 | int (*recv_probe)(const struct sk_buff *, struct bonding *, |
819 | struct slave *); |
820 | diff --git a/include/net/tls.h b/include/net/tls.h |
821 | index 4913430ab807..f5c928a76994 100644 |
822 | --- a/include/net/tls.h |
823 | +++ b/include/net/tls.h |
824 | @@ -102,6 +102,7 @@ struct tls_context { |
825 | struct scatterlist *partially_sent_record; |
826 | u16 partially_sent_offset; |
827 | unsigned long flags; |
828 | + bool in_tcp_sendpages; |
829 | |
830 | u16 pending_open_record_frags; |
831 | int (*push_pending_record)(struct sock *sk, int flags); |
832 | diff --git a/mm/gup.c b/mm/gup.c |
833 | index 8f3a06408e28..f5f83c2e6c83 100644 |
834 | --- a/mm/gup.c |
835 | +++ b/mm/gup.c |
836 | @@ -544,6 +544,9 @@ static int check_vma_flags(struct vm_area_struct *vma, unsigned long gup_flags) |
837 | if (vm_flags & (VM_IO | VM_PFNMAP)) |
838 | return -EFAULT; |
839 | |
840 | + if (gup_flags & FOLL_ANON && !vma_is_anonymous(vma)) |
841 | + return -EFAULT; |
842 | + |
843 | if (write) { |
844 | if (!(vm_flags & VM_WRITE)) { |
845 | if (!(gup_flags & FOLL_FORCE)) |
846 | diff --git a/net/bridge/br_if.c b/net/bridge/br_if.c |
847 | index 9ba4ed65c52b..4be5335407c5 100644 |
848 | --- a/net/bridge/br_if.c |
849 | +++ b/net/bridge/br_if.c |
850 | @@ -509,8 +509,8 @@ int br_add_if(struct net_bridge *br, struct net_device *dev, |
851 | return -ELOOP; |
852 | } |
853 | |
854 | - /* Device is already being bridged */ |
855 | - if (br_port_exists(dev)) |
856 | + /* Device has master upper dev */ |
857 | + if (netdev_master_upper_dev_get(dev)) |
858 | return -EBUSY; |
859 | |
860 | /* No bridging devices that dislike that (e.g. wireless) */ |
861 | diff --git a/net/compat.c b/net/compat.c |
862 | index 22381719718c..32ed993588d6 100644 |
863 | --- a/net/compat.c |
864 | +++ b/net/compat.c |
865 | @@ -377,7 +377,8 @@ static int compat_sock_setsockopt(struct socket *sock, int level, int optname, |
866 | optname == SO_ATTACH_REUSEPORT_CBPF) |
867 | return do_set_attach_filter(sock, level, optname, |
868 | optval, optlen); |
869 | - if (optname == SO_RCVTIMEO || optname == SO_SNDTIMEO) |
870 | + if (!COMPAT_USE_64BIT_TIME && |
871 | + (optname == SO_RCVTIMEO || optname == SO_SNDTIMEO)) |
872 | return do_set_sock_timeout(sock, level, optname, optval, optlen); |
873 | |
874 | return sock_setsockopt(sock, level, optname, optval, optlen); |
875 | @@ -442,7 +443,8 @@ static int do_get_sock_timeout(struct socket *sock, int level, int optname, |
876 | static int compat_sock_getsockopt(struct socket *sock, int level, int optname, |
877 | char __user *optval, int __user *optlen) |
878 | { |
879 | - if (optname == SO_RCVTIMEO || optname == SO_SNDTIMEO) |
880 | + if (!COMPAT_USE_64BIT_TIME && |
881 | + (optname == SO_RCVTIMEO || optname == SO_SNDTIMEO)) |
882 | return do_get_sock_timeout(sock, level, optname, optval, optlen); |
883 | return sock_getsockopt(sock, level, optname, optval, optlen); |
884 | } |
885 | diff --git a/net/dccp/ccids/ccid2.c b/net/dccp/ccids/ccid2.c |
886 | index 92d016e87816..385f153fe031 100644 |
887 | --- a/net/dccp/ccids/ccid2.c |
888 | +++ b/net/dccp/ccids/ccid2.c |
889 | @@ -126,6 +126,16 @@ static void ccid2_change_l_seq_window(struct sock *sk, u64 val) |
890 | DCCPF_SEQ_WMAX)); |
891 | } |
892 | |
893 | +static void dccp_tasklet_schedule(struct sock *sk) |
894 | +{ |
895 | + struct tasklet_struct *t = &dccp_sk(sk)->dccps_xmitlet; |
896 | + |
897 | + if (!test_and_set_bit(TASKLET_STATE_SCHED, &t->state)) { |
898 | + sock_hold(sk); |
899 | + __tasklet_schedule(t); |
900 | + } |
901 | +} |
902 | + |
903 | static void ccid2_hc_tx_rto_expire(struct timer_list *t) |
904 | { |
905 | struct ccid2_hc_tx_sock *hc = from_timer(hc, t, tx_rtotimer); |
906 | @@ -166,7 +176,7 @@ static void ccid2_hc_tx_rto_expire(struct timer_list *t) |
907 | |
908 | /* if we were blocked before, we may now send cwnd=1 packet */ |
909 | if (sender_was_blocked) |
910 | - tasklet_schedule(&dccp_sk(sk)->dccps_xmitlet); |
911 | + dccp_tasklet_schedule(sk); |
912 | /* restart backed-off timer */ |
913 | sk_reset_timer(sk, &hc->tx_rtotimer, jiffies + hc->tx_rto); |
914 | out: |
915 | @@ -706,7 +716,7 @@ static void ccid2_hc_tx_packet_recv(struct sock *sk, struct sk_buff *skb) |
916 | done: |
917 | /* check if incoming Acks allow pending packets to be sent */ |
918 | if (sender_was_blocked && !ccid2_cwnd_network_limited(hc)) |
919 | - tasklet_schedule(&dccp_sk(sk)->dccps_xmitlet); |
920 | + dccp_tasklet_schedule(sk); |
921 | dccp_ackvec_parsed_cleanup(&hc->tx_av_chunks); |
922 | } |
923 | |
924 | diff --git a/net/dccp/timer.c b/net/dccp/timer.c |
925 | index b50a8732ff43..1501a20a94ca 100644 |
926 | --- a/net/dccp/timer.c |
927 | +++ b/net/dccp/timer.c |
928 | @@ -232,6 +232,7 @@ static void dccp_write_xmitlet(unsigned long data) |
929 | else |
930 | dccp_write_xmit(sk); |
931 | bh_unlock_sock(sk); |
932 | + sock_put(sk); |
933 | } |
934 | |
935 | static void dccp_write_xmit_timer(struct timer_list *t) |
936 | @@ -240,7 +241,6 @@ static void dccp_write_xmit_timer(struct timer_list *t) |
937 | struct sock *sk = &dp->dccps_inet_connection.icsk_inet.sk; |
938 | |
939 | dccp_write_xmitlet((unsigned long)sk); |
940 | - sock_put(sk); |
941 | } |
942 | |
943 | void dccp_init_xmit_timers(struct sock *sk) |
944 | diff --git a/net/ipv4/ping.c b/net/ipv4/ping.c |
945 | index b8f0db54b197..16226d49263d 100644 |
946 | --- a/net/ipv4/ping.c |
947 | +++ b/net/ipv4/ping.c |
948 | @@ -775,8 +775,10 @@ static int ping_v4_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) |
949 | ipc.addr = faddr = daddr; |
950 | |
951 | if (ipc.opt && ipc.opt->opt.srr) { |
952 | - if (!daddr) |
953 | - return -EINVAL; |
954 | + if (!daddr) { |
955 | + err = -EINVAL; |
956 | + goto out_free; |
957 | + } |
958 | faddr = ipc.opt->opt.faddr; |
959 | } |
960 | tos = get_rttos(&ipc, inet); |
961 | @@ -842,6 +844,7 @@ static int ping_v4_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) |
962 | |
963 | out: |
964 | ip_rt_put(rt); |
965 | +out_free: |
966 | if (free) |
967 | kfree(ipc.opt); |
968 | if (!err) { |
969 | diff --git a/net/ipv4/route.c b/net/ipv4/route.c |
970 | index 9d9b8358a898..df1c04d75f93 100644 |
971 | --- a/net/ipv4/route.c |
972 | +++ b/net/ipv4/route.c |
973 | @@ -710,7 +710,7 @@ static void update_or_create_fnhe(struct fib_nh *nh, __be32 daddr, __be32 gw, |
974 | fnhe->fnhe_gw = gw; |
975 | fnhe->fnhe_pmtu = pmtu; |
976 | fnhe->fnhe_mtu_locked = lock; |
977 | - fnhe->fnhe_expires = expires; |
978 | + fnhe->fnhe_expires = max(1UL, expires); |
979 | |
980 | /* Exception created; mark the cached routes for the nexthop |
981 | * stale, so anyone caching it rechecks if this exception |
982 | @@ -1298,6 +1298,36 @@ static unsigned int ipv4_mtu(const struct dst_entry *dst) |
983 | return mtu - lwtunnel_headroom(dst->lwtstate, mtu); |
984 | } |
985 | |
986 | +static void ip_del_fnhe(struct fib_nh *nh, __be32 daddr) |
987 | +{ |
988 | + struct fnhe_hash_bucket *hash; |
989 | + struct fib_nh_exception *fnhe, __rcu **fnhe_p; |
990 | + u32 hval = fnhe_hashfun(daddr); |
991 | + |
992 | + spin_lock_bh(&fnhe_lock); |
993 | + |
994 | + hash = rcu_dereference_protected(nh->nh_exceptions, |
995 | + lockdep_is_held(&fnhe_lock)); |
996 | + hash += hval; |
997 | + |
998 | + fnhe_p = &hash->chain; |
999 | + fnhe = rcu_dereference_protected(*fnhe_p, lockdep_is_held(&fnhe_lock)); |
1000 | + while (fnhe) { |
1001 | + if (fnhe->fnhe_daddr == daddr) { |
1002 | + rcu_assign_pointer(*fnhe_p, rcu_dereference_protected( |
1003 | + fnhe->fnhe_next, lockdep_is_held(&fnhe_lock))); |
1004 | + fnhe_flush_routes(fnhe); |
1005 | + kfree_rcu(fnhe, rcu); |
1006 | + break; |
1007 | + } |
1008 | + fnhe_p = &fnhe->fnhe_next; |
1009 | + fnhe = rcu_dereference_protected(fnhe->fnhe_next, |
1010 | + lockdep_is_held(&fnhe_lock)); |
1011 | + } |
1012 | + |
1013 | + spin_unlock_bh(&fnhe_lock); |
1014 | +} |
1015 | + |
1016 | static struct fib_nh_exception *find_exception(struct fib_nh *nh, __be32 daddr) |
1017 | { |
1018 | struct fnhe_hash_bucket *hash = rcu_dereference(nh->nh_exceptions); |
1019 | @@ -1311,8 +1341,14 @@ static struct fib_nh_exception *find_exception(struct fib_nh *nh, __be32 daddr) |
1020 | |
1021 | for (fnhe = rcu_dereference(hash[hval].chain); fnhe; |
1022 | fnhe = rcu_dereference(fnhe->fnhe_next)) { |
1023 | - if (fnhe->fnhe_daddr == daddr) |
1024 | + if (fnhe->fnhe_daddr == daddr) { |
1025 | + if (fnhe->fnhe_expires && |
1026 | + time_after(jiffies, fnhe->fnhe_expires)) { |
1027 | + ip_del_fnhe(nh, daddr); |
1028 | + break; |
1029 | + } |
1030 | return fnhe; |
1031 | + } |
1032 | } |
1033 | return NULL; |
1034 | } |
1035 | @@ -1340,6 +1376,7 @@ static bool rt_bind_exception(struct rtable *rt, struct fib_nh_exception *fnhe, |
1036 | fnhe->fnhe_gw = 0; |
1037 | fnhe->fnhe_pmtu = 0; |
1038 | fnhe->fnhe_expires = 0; |
1039 | + fnhe->fnhe_mtu_locked = false; |
1040 | fnhe_flush_routes(fnhe); |
1041 | orig = NULL; |
1042 | } |
1043 | @@ -1638,36 +1675,6 @@ static void ip_handle_martian_source(struct net_device *dev, |
1044 | #endif |
1045 | } |
1046 | |
1047 | -static void ip_del_fnhe(struct fib_nh *nh, __be32 daddr) |
1048 | -{ |
1049 | - struct fnhe_hash_bucket *hash; |
1050 | - struct fib_nh_exception *fnhe, __rcu **fnhe_p; |
1051 | - u32 hval = fnhe_hashfun(daddr); |
1052 | - |
1053 | - spin_lock_bh(&fnhe_lock); |
1054 | - |
1055 | - hash = rcu_dereference_protected(nh->nh_exceptions, |
1056 | - lockdep_is_held(&fnhe_lock)); |
1057 | - hash += hval; |
1058 | - |
1059 | - fnhe_p = &hash->chain; |
1060 | - fnhe = rcu_dereference_protected(*fnhe_p, lockdep_is_held(&fnhe_lock)); |
1061 | - while (fnhe) { |
1062 | - if (fnhe->fnhe_daddr == daddr) { |
1063 | - rcu_assign_pointer(*fnhe_p, rcu_dereference_protected( |
1064 | - fnhe->fnhe_next, lockdep_is_held(&fnhe_lock))); |
1065 | - fnhe_flush_routes(fnhe); |
1066 | - kfree_rcu(fnhe, rcu); |
1067 | - break; |
1068 | - } |
1069 | - fnhe_p = &fnhe->fnhe_next; |
1070 | - fnhe = rcu_dereference_protected(fnhe->fnhe_next, |
1071 | - lockdep_is_held(&fnhe_lock)); |
1072 | - } |
1073 | - |
1074 | - spin_unlock_bh(&fnhe_lock); |
1075 | -} |
1076 | - |
1077 | static void set_lwt_redirect(struct rtable *rth) |
1078 | { |
1079 | if (lwtunnel_output_redirect(rth->dst.lwtstate)) { |
1080 | @@ -1734,20 +1741,10 @@ static int __mkroute_input(struct sk_buff *skb, |
1081 | |
1082 | fnhe = find_exception(&FIB_RES_NH(*res), daddr); |
1083 | if (do_cache) { |
1084 | - if (fnhe) { |
1085 | + if (fnhe) |
1086 | rth = rcu_dereference(fnhe->fnhe_rth_input); |
1087 | - if (rth && rth->dst.expires && |
1088 | - time_after(jiffies, rth->dst.expires)) { |
1089 | - ip_del_fnhe(&FIB_RES_NH(*res), daddr); |
1090 | - fnhe = NULL; |
1091 | - } else { |
1092 | - goto rt_cache; |
1093 | - } |
1094 | - } |
1095 | - |
1096 | - rth = rcu_dereference(FIB_RES_NH(*res).nh_rth_input); |
1097 | - |
1098 | -rt_cache: |
1099 | + else |
1100 | + rth = rcu_dereference(FIB_RES_NH(*res).nh_rth_input); |
1101 | if (rt_cache_valid(rth)) { |
1102 | skb_dst_set_noref(skb, &rth->dst); |
1103 | goto out; |
1104 | @@ -2224,39 +2221,31 @@ static struct rtable *__mkroute_output(const struct fib_result *res, |
1105 | * the loopback interface and the IP_PKTINFO ipi_ifindex will |
1106 | * be set to the loopback interface as well. |
1107 | */ |
1108 | - fi = NULL; |
1109 | + do_cache = false; |
1110 | } |
1111 | |
1112 | fnhe = NULL; |
1113 | do_cache &= fi != NULL; |
1114 | - if (do_cache) { |
1115 | + if (fi) { |
1116 | struct rtable __rcu **prth; |
1117 | struct fib_nh *nh = &FIB_RES_NH(*res); |
1118 | |
1119 | fnhe = find_exception(nh, fl4->daddr); |
1120 | + if (!do_cache) |
1121 | + goto add; |
1122 | if (fnhe) { |
1123 | prth = &fnhe->fnhe_rth_output; |
1124 | - rth = rcu_dereference(*prth); |
1125 | - if (rth && rth->dst.expires && |
1126 | - time_after(jiffies, rth->dst.expires)) { |
1127 | - ip_del_fnhe(nh, fl4->daddr); |
1128 | - fnhe = NULL; |
1129 | - } else { |
1130 | - goto rt_cache; |
1131 | + } else { |
1132 | + if (unlikely(fl4->flowi4_flags & |
1133 | + FLOWI_FLAG_KNOWN_NH && |
1134 | + !(nh->nh_gw && |
1135 | + nh->nh_scope == RT_SCOPE_LINK))) { |
1136 | + do_cache = false; |
1137 | + goto add; |
1138 | } |
1139 | + prth = raw_cpu_ptr(nh->nh_pcpu_rth_output); |
1140 | } |
1141 | - |
1142 | - if (unlikely(fl4->flowi4_flags & |
1143 | - FLOWI_FLAG_KNOWN_NH && |
1144 | - !(nh->nh_gw && |
1145 | - nh->nh_scope == RT_SCOPE_LINK))) { |
1146 | - do_cache = false; |
1147 | - goto add; |
1148 | - } |
1149 | - prth = raw_cpu_ptr(nh->nh_pcpu_rth_output); |
1150 | rth = rcu_dereference(*prth); |
1151 | - |
1152 | -rt_cache: |
1153 | if (rt_cache_valid(rth) && dst_hold_safe(&rth->dst)) |
1154 | return rth; |
1155 | } |
1156 | diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c |
1157 | index c92fd253fc46..80e39d9a0423 100644 |
1158 | --- a/net/ipv4/tcp.c |
1159 | +++ b/net/ipv4/tcp.c |
1160 | @@ -688,7 +688,7 @@ static bool tcp_should_autocork(struct sock *sk, struct sk_buff *skb, |
1161 | { |
1162 | return skb->len < size_goal && |
1163 | sock_net(sk)->ipv4.sysctl_tcp_autocorking && |
1164 | - skb != tcp_write_queue_head(sk) && |
1165 | + !tcp_rtx_queue_empty(sk) && |
1166 | refcount_read(&sk->sk_wmem_alloc) > skb->truesize; |
1167 | } |
1168 | |
1169 | @@ -1210,7 +1210,8 @@ int tcp_sendmsg_locked(struct sock *sk, struct msghdr *msg, size_t size) |
1170 | uarg->zerocopy = 0; |
1171 | } |
1172 | |
1173 | - if (unlikely(flags & MSG_FASTOPEN || inet_sk(sk)->defer_connect)) { |
1174 | + if (unlikely(flags & MSG_FASTOPEN || inet_sk(sk)->defer_connect) && |
1175 | + !tp->repair) { |
1176 | err = tcp_sendmsg_fastopen(sk, msg, &copied_syn, size); |
1177 | if (err == -EINPROGRESS && copied_syn > 0) |
1178 | goto out; |
1179 | diff --git a/net/ipv4/tcp_bbr.c b/net/ipv4/tcp_bbr.c |
1180 | index a471f696e13c..29478454b527 100644 |
1181 | --- a/net/ipv4/tcp_bbr.c |
1182 | +++ b/net/ipv4/tcp_bbr.c |
1183 | @@ -803,7 +803,9 @@ static void bbr_update_min_rtt(struct sock *sk, const struct rate_sample *rs) |
1184 | } |
1185 | } |
1186 | } |
1187 | - bbr->idle_restart = 0; |
1188 | + /* Restart after idle ends only once we process a new S/ACK for data */ |
1189 | + if (rs->delivered > 0) |
1190 | + bbr->idle_restart = 0; |
1191 | } |
1192 | |
1193 | static void bbr_update_model(struct sock *sk, const struct rate_sample *rs) |
1194 | diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c |
1195 | index e5ef7c38c934..b6ba51536b37 100644 |
1196 | --- a/net/ipv4/udp.c |
1197 | +++ b/net/ipv4/udp.c |
1198 | @@ -407,9 +407,9 @@ static int compute_score(struct sock *sk, struct net *net, |
1199 | bool dev_match = (sk->sk_bound_dev_if == dif || |
1200 | sk->sk_bound_dev_if == sdif); |
1201 | |
1202 | - if (exact_dif && !dev_match) |
1203 | + if (!dev_match) |
1204 | return -1; |
1205 | - if (sk->sk_bound_dev_if && dev_match) |
1206 | + if (sk->sk_bound_dev_if) |
1207 | score += 4; |
1208 | } |
1209 | |
1210 | @@ -958,8 +958,10 @@ int udp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) |
1211 | sock_tx_timestamp(sk, ipc.sockc.tsflags, &ipc.tx_flags); |
1212 | |
1213 | if (ipc.opt && ipc.opt->opt.srr) { |
1214 | - if (!daddr) |
1215 | - return -EINVAL; |
1216 | + if (!daddr) { |
1217 | + err = -EINVAL; |
1218 | + goto out_free; |
1219 | + } |
1220 | faddr = ipc.opt->opt.faddr; |
1221 | connected = 0; |
1222 | } |
1223 | @@ -1080,6 +1082,7 @@ int udp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) |
1224 | |
1225 | out: |
1226 | ip_rt_put(rt); |
1227 | +out_free: |
1228 | if (free) |
1229 | kfree(ipc.opt); |
1230 | if (!err) |
1231 | diff --git a/net/ipv6/route.c b/net/ipv6/route.c |
1232 | index 74a2e37412b2..1aee1a537cb1 100644 |
1233 | --- a/net/ipv6/route.c |
1234 | +++ b/net/ipv6/route.c |
1235 | @@ -1822,11 +1822,16 @@ static void ip6_multipath_l3_keys(const struct sk_buff *skb, |
1236 | const struct ipv6hdr *inner_iph; |
1237 | const struct icmp6hdr *icmph; |
1238 | struct ipv6hdr _inner_iph; |
1239 | + struct icmp6hdr _icmph; |
1240 | |
1241 | if (likely(outer_iph->nexthdr != IPPROTO_ICMPV6)) |
1242 | goto out; |
1243 | |
1244 | - icmph = icmp6_hdr(skb); |
1245 | + icmph = skb_header_pointer(skb, skb_transport_offset(skb), |
1246 | + sizeof(_icmph), &_icmph); |
1247 | + if (!icmph) |
1248 | + goto out; |
1249 | + |
1250 | if (icmph->icmp6_type != ICMPV6_DEST_UNREACH && |
1251 | icmph->icmp6_type != ICMPV6_PKT_TOOBIG && |
1252 | icmph->icmp6_type != ICMPV6_TIME_EXCEED && |
1253 | diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c |
1254 | index 52e3ea0e6f50..68d589f8d2b2 100644 |
1255 | --- a/net/ipv6/udp.c |
1256 | +++ b/net/ipv6/udp.c |
1257 | @@ -148,9 +148,9 @@ static int compute_score(struct sock *sk, struct net *net, |
1258 | bool dev_match = (sk->sk_bound_dev_if == dif || |
1259 | sk->sk_bound_dev_if == sdif); |
1260 | |
1261 | - if (exact_dif && !dev_match) |
1262 | + if (!dev_match) |
1263 | return -1; |
1264 | - if (sk->sk_bound_dev_if && dev_match) |
1265 | + if (sk->sk_bound_dev_if) |
1266 | score++; |
1267 | } |
1268 | |
1269 | diff --git a/net/llc/af_llc.c b/net/llc/af_llc.c |
1270 | index cf41d9b4a0b8..b49f5afab405 100644 |
1271 | --- a/net/llc/af_llc.c |
1272 | +++ b/net/llc/af_llc.c |
1273 | @@ -930,6 +930,9 @@ static int llc_ui_sendmsg(struct socket *sock, struct msghdr *msg, size_t len) |
1274 | if (size > llc->dev->mtu) |
1275 | size = llc->dev->mtu; |
1276 | copied = size - hdrlen; |
1277 | + rc = -EINVAL; |
1278 | + if (copied < 0) |
1279 | + goto release; |
1280 | release_sock(sk); |
1281 | skb = sock_alloc_send_skb(sk, size, noblock, &rc); |
1282 | lock_sock(sk); |
1283 | diff --git a/net/nsh/nsh.c b/net/nsh/nsh.c |
1284 | index d7da99a0b0b8..9696ef96b719 100644 |
1285 | --- a/net/nsh/nsh.c |
1286 | +++ b/net/nsh/nsh.c |
1287 | @@ -57,6 +57,8 @@ int nsh_pop(struct sk_buff *skb) |
1288 | return -ENOMEM; |
1289 | nh = (struct nshhdr *)(skb->data); |
1290 | length = nsh_hdr_len(nh); |
1291 | + if (length < NSH_BASE_HDR_LEN) |
1292 | + return -EINVAL; |
1293 | inner_proto = tun_p_to_eth_p(nh->np); |
1294 | if (!pskb_may_pull(skb, length)) |
1295 | return -ENOMEM; |
1296 | @@ -90,6 +92,8 @@ static struct sk_buff *nsh_gso_segment(struct sk_buff *skb, |
1297 | if (unlikely(!pskb_may_pull(skb, NSH_BASE_HDR_LEN))) |
1298 | goto out; |
1299 | nsh_len = nsh_hdr_len(nsh_hdr(skb)); |
1300 | + if (nsh_len < NSH_BASE_HDR_LEN) |
1301 | + goto out; |
1302 | if (unlikely(!pskb_may_pull(skb, nsh_len))) |
1303 | goto out; |
1304 | |
1305 | diff --git a/net/openvswitch/flow_netlink.c b/net/openvswitch/flow_netlink.c |
1306 | index 7322aa1e382e..492ab0c36f7c 100644 |
1307 | --- a/net/openvswitch/flow_netlink.c |
1308 | +++ b/net/openvswitch/flow_netlink.c |
1309 | @@ -1712,13 +1712,10 @@ static void nlattr_set(struct nlattr *attr, u8 val, |
1310 | |
1311 | /* The nlattr stream should already have been validated */ |
1312 | nla_for_each_nested(nla, attr, rem) { |
1313 | - if (tbl[nla_type(nla)].len == OVS_ATTR_NESTED) { |
1314 | - if (tbl[nla_type(nla)].next) |
1315 | - tbl = tbl[nla_type(nla)].next; |
1316 | - nlattr_set(nla, val, tbl); |
1317 | - } else { |
1318 | + if (tbl[nla_type(nla)].len == OVS_ATTR_NESTED) |
1319 | + nlattr_set(nla, val, tbl[nla_type(nla)].next ? : tbl); |
1320 | + else |
1321 | memset(nla_data(nla), val, nla_len(nla)); |
1322 | - } |
1323 | |
1324 | if (nla_type(nla) == OVS_KEY_ATTR_CT_STATE) |
1325 | *(u32 *)nla_data(nla) &= CT_SUPPORTED_MASK; |
1326 | diff --git a/net/rds/recv.c b/net/rds/recv.c |
1327 | index b25bcfe411ca..555f07ccf0dc 100644 |
1328 | --- a/net/rds/recv.c |
1329 | +++ b/net/rds/recv.c |
1330 | @@ -558,6 +558,7 @@ static int rds_cmsg_recv(struct rds_incoming *inc, struct msghdr *msg, |
1331 | struct rds_cmsg_rx_trace t; |
1332 | int i, j; |
1333 | |
1334 | + memset(&t, 0, sizeof(t)); |
1335 | inc->i_rx_lat_trace[RDS_MSG_RX_CMSG] = local_clock(); |
1336 | t.rx_traces = rs->rs_rx_traces; |
1337 | for (i = 0; i < rs->rs_rx_traces; i++) { |
1338 | diff --git a/net/sched/act_skbmod.c b/net/sched/act_skbmod.c |
1339 | index 7b0700f52b50..d87b611046bb 100644 |
1340 | --- a/net/sched/act_skbmod.c |
1341 | +++ b/net/sched/act_skbmod.c |
1342 | @@ -131,8 +131,11 @@ static int tcf_skbmod_init(struct net *net, struct nlattr *nla, |
1343 | if (exists && bind) |
1344 | return 0; |
1345 | |
1346 | - if (!lflags) |
1347 | + if (!lflags) { |
1348 | + if (exists) |
1349 | + tcf_idr_release(*a, bind); |
1350 | return -EINVAL; |
1351 | + } |
1352 | |
1353 | if (!exists) { |
1354 | ret = tcf_idr_create(tn, parm->index, est, a, |
1355 | diff --git a/net/sched/cls_api.c b/net/sched/cls_api.c |
1356 | index 247b7cc20c13..c2c732aad87c 100644 |
1357 | --- a/net/sched/cls_api.c |
1358 | +++ b/net/sched/cls_api.c |
1359 | @@ -152,8 +152,8 @@ static struct tcf_proto *tcf_proto_create(const char *kind, u32 protocol, |
1360 | NL_SET_ERR_MSG(extack, "TC classifier not found"); |
1361 | err = -ENOENT; |
1362 | } |
1363 | - goto errout; |
1364 | #endif |
1365 | + goto errout; |
1366 | } |
1367 | tp->classify = tp->ops->classify; |
1368 | tp->protocol = protocol; |
1369 | diff --git a/net/sched/sch_fq.c b/net/sched/sch_fq.c |
1370 | index a366e4c9413a..4808713c73b9 100644 |
1371 | --- a/net/sched/sch_fq.c |
1372 | +++ b/net/sched/sch_fq.c |
1373 | @@ -128,6 +128,28 @@ static bool fq_flow_is_detached(const struct fq_flow *f) |
1374 | return f->next == &detached; |
1375 | } |
1376 | |
1377 | +static bool fq_flow_is_throttled(const struct fq_flow *f) |
1378 | +{ |
1379 | + return f->next == &throttled; |
1380 | +} |
1381 | + |
1382 | +static void fq_flow_add_tail(struct fq_flow_head *head, struct fq_flow *flow) |
1383 | +{ |
1384 | + if (head->first) |
1385 | + head->last->next = flow; |
1386 | + else |
1387 | + head->first = flow; |
1388 | + head->last = flow; |
1389 | + flow->next = NULL; |
1390 | +} |
1391 | + |
1392 | +static void fq_flow_unset_throttled(struct fq_sched_data *q, struct fq_flow *f) |
1393 | +{ |
1394 | + rb_erase(&f->rate_node, &q->delayed); |
1395 | + q->throttled_flows--; |
1396 | + fq_flow_add_tail(&q->old_flows, f); |
1397 | +} |
1398 | + |
1399 | static void fq_flow_set_throttled(struct fq_sched_data *q, struct fq_flow *f) |
1400 | { |
1401 | struct rb_node **p = &q->delayed.rb_node, *parent = NULL; |
1402 | @@ -155,15 +177,6 @@ static void fq_flow_set_throttled(struct fq_sched_data *q, struct fq_flow *f) |
1403 | |
1404 | static struct kmem_cache *fq_flow_cachep __read_mostly; |
1405 | |
1406 | -static void fq_flow_add_tail(struct fq_flow_head *head, struct fq_flow *flow) |
1407 | -{ |
1408 | - if (head->first) |
1409 | - head->last->next = flow; |
1410 | - else |
1411 | - head->first = flow; |
1412 | - head->last = flow; |
1413 | - flow->next = NULL; |
1414 | -} |
1415 | |
1416 | /* limit number of collected flows per round */ |
1417 | #define FQ_GC_MAX 8 |
1418 | @@ -267,6 +280,8 @@ static struct fq_flow *fq_classify(struct sk_buff *skb, struct fq_sched_data *q) |
1419 | f->socket_hash != sk->sk_hash)) { |
1420 | f->credit = q->initial_quantum; |
1421 | f->socket_hash = sk->sk_hash; |
1422 | + if (fq_flow_is_throttled(f)) |
1423 | + fq_flow_unset_throttled(q, f); |
1424 | f->time_next_packet = 0ULL; |
1425 | } |
1426 | return f; |
1427 | @@ -438,9 +453,7 @@ static void fq_check_throttled(struct fq_sched_data *q, u64 now) |
1428 | q->time_next_delayed_flow = f->time_next_packet; |
1429 | break; |
1430 | } |
1431 | - rb_erase(p, &q->delayed); |
1432 | - q->throttled_flows--; |
1433 | - fq_flow_add_tail(&q->old_flows, f); |
1434 | + fq_flow_unset_throttled(q, f); |
1435 | } |
1436 | } |
1437 | |
1438 | diff --git a/net/sctp/associola.c b/net/sctp/associola.c |
1439 | index 837806dd5799..a47179da24e6 100644 |
1440 | --- a/net/sctp/associola.c |
1441 | +++ b/net/sctp/associola.c |
1442 | @@ -1024,8 +1024,9 @@ static void sctp_assoc_bh_rcv(struct work_struct *work) |
1443 | struct sctp_endpoint *ep; |
1444 | struct sctp_chunk *chunk; |
1445 | struct sctp_inq *inqueue; |
1446 | - int state; |
1447 | + int first_time = 1; /* is this the first time through the loop */ |
1448 | int error = 0; |
1449 | + int state; |
1450 | |
1451 | /* The association should be held so we should be safe. */ |
1452 | ep = asoc->ep; |
1453 | @@ -1036,6 +1037,30 @@ static void sctp_assoc_bh_rcv(struct work_struct *work) |
1454 | state = asoc->state; |
1455 | subtype = SCTP_ST_CHUNK(chunk->chunk_hdr->type); |
1456 | |
1457 | + /* If the first chunk in the packet is AUTH, do special |
1458 | + * processing specified in Section 6.3 of SCTP-AUTH spec |
1459 | + */ |
1460 | + if (first_time && subtype.chunk == SCTP_CID_AUTH) { |
1461 | + struct sctp_chunkhdr *next_hdr; |
1462 | + |
1463 | + next_hdr = sctp_inq_peek(inqueue); |
1464 | + if (!next_hdr) |
1465 | + goto normal; |
1466 | + |
1467 | + /* If the next chunk is COOKIE-ECHO, skip the AUTH |
1468 | + * chunk while saving a pointer to it so we can do |
1469 | + * Authentication later (during cookie-echo |
1470 | + * processing). |
1471 | + */ |
1472 | + if (next_hdr->type == SCTP_CID_COOKIE_ECHO) { |
1473 | + chunk->auth_chunk = skb_clone(chunk->skb, |
1474 | + GFP_ATOMIC); |
1475 | + chunk->auth = 1; |
1476 | + continue; |
1477 | + } |
1478 | + } |
1479 | + |
1480 | +normal: |
1481 | /* SCTP-AUTH, Section 6.3: |
1482 | * The receiver has a list of chunk types which it expects |
1483 | * to be received only after an AUTH-chunk. This list has |
1484 | @@ -1074,6 +1099,9 @@ static void sctp_assoc_bh_rcv(struct work_struct *work) |
1485 | /* If there is an error on chunk, discard this packet. */ |
1486 | if (error && chunk) |
1487 | chunk->pdiscard = 1; |
1488 | + |
1489 | + if (first_time) |
1490 | + first_time = 0; |
1491 | } |
1492 | sctp_association_put(asoc); |
1493 | } |
1494 | diff --git a/net/sctp/inqueue.c b/net/sctp/inqueue.c |
1495 | index 23ebc5318edc..eb93ffe2408b 100644 |
1496 | --- a/net/sctp/inqueue.c |
1497 | +++ b/net/sctp/inqueue.c |
1498 | @@ -217,7 +217,7 @@ struct sctp_chunk *sctp_inq_pop(struct sctp_inq *queue) |
1499 | skb_pull(chunk->skb, sizeof(*ch)); |
1500 | chunk->subh.v = NULL; /* Subheader is no longer valid. */ |
1501 | |
1502 | - if (chunk->chunk_end + sizeof(*ch) < skb_tail_pointer(chunk->skb)) { |
1503 | + if (chunk->chunk_end + sizeof(*ch) <= skb_tail_pointer(chunk->skb)) { |
1504 | /* This is not a singleton */ |
1505 | chunk->singleton = 0; |
1506 | } else if (chunk->chunk_end > skb_tail_pointer(chunk->skb)) { |
1507 | diff --git a/net/sctp/ipv6.c b/net/sctp/ipv6.c |
1508 | index 07b64719d1bc..351e80c59211 100644 |
1509 | --- a/net/sctp/ipv6.c |
1510 | +++ b/net/sctp/ipv6.c |
1511 | @@ -866,6 +866,9 @@ static int sctp_inet6_cmp_addr(const union sctp_addr *addr1, |
1512 | if (sctp_is_any(sk, addr1) || sctp_is_any(sk, addr2)) |
1513 | return 1; |
1514 | |
1515 | + if (addr1->sa.sa_family == AF_INET && addr2->sa.sa_family == AF_INET) |
1516 | + return addr1->v4.sin_addr.s_addr == addr2->v4.sin_addr.s_addr; |
1517 | + |
1518 | return __sctp_v6_cmp_addr(addr1, addr2); |
1519 | } |
1520 | |
1521 | diff --git a/net/sctp/sm_statefuns.c b/net/sctp/sm_statefuns.c |
1522 | index eb7905ffe5f2..88573c57e106 100644 |
1523 | --- a/net/sctp/sm_statefuns.c |
1524 | +++ b/net/sctp/sm_statefuns.c |
1525 | @@ -153,10 +153,7 @@ static enum sctp_disposition sctp_sf_violation_chunk( |
1526 | struct sctp_cmd_seq *commands); |
1527 | |
1528 | static enum sctp_ierror sctp_sf_authenticate( |
1529 | - struct net *net, |
1530 | - const struct sctp_endpoint *ep, |
1531 | const struct sctp_association *asoc, |
1532 | - const union sctp_subtype type, |
1533 | struct sctp_chunk *chunk); |
1534 | |
1535 | static enum sctp_disposition __sctp_sf_do_9_1_abort( |
1536 | @@ -621,6 +618,38 @@ enum sctp_disposition sctp_sf_do_5_1C_ack(struct net *net, |
1537 | return SCTP_DISPOSITION_CONSUME; |
1538 | } |
1539 | |
1540 | +static bool sctp_auth_chunk_verify(struct net *net, struct sctp_chunk *chunk, |
1541 | + const struct sctp_association *asoc) |
1542 | +{ |
1543 | + struct sctp_chunk auth; |
1544 | + |
1545 | + if (!chunk->auth_chunk) |
1546 | + return true; |
1547 | + |
1548 | + /* SCTP-AUTH: auth_chunk pointer is only set when the cookie-echo |
1549 | + * is supposed to be authenticated and we have to do delayed |
1550 | + * authentication. We've just recreated the association using |
1551 | + * the information in the cookie and now it's much easier to |
1552 | + * do the authentication. |
1553 | + */ |
1554 | + |
1555 | + /* Make sure that we and the peer are AUTH capable */ |
1556 | + if (!net->sctp.auth_enable || !asoc->peer.auth_capable) |
1557 | + return false; |
1558 | + |
1559 | + /* set-up our fake chunk so that we can process it */ |
1560 | + auth.skb = chunk->auth_chunk; |
1561 | + auth.asoc = chunk->asoc; |
1562 | + auth.sctp_hdr = chunk->sctp_hdr; |
1563 | + auth.chunk_hdr = (struct sctp_chunkhdr *) |
1564 | + skb_push(chunk->auth_chunk, |
1565 | + sizeof(struct sctp_chunkhdr)); |
1566 | + skb_pull(chunk->auth_chunk, sizeof(struct sctp_chunkhdr)); |
1567 | + auth.transport = chunk->transport; |
1568 | + |
1569 | + return sctp_sf_authenticate(asoc, &auth) == SCTP_IERROR_NO_ERROR; |
1570 | +} |
1571 | + |
1572 | /* |
1573 | * Respond to a normal COOKIE ECHO chunk. |
1574 | * We are the side that is being asked for an association. |
1575 | @@ -758,37 +787,9 @@ enum sctp_disposition sctp_sf_do_5_1D_ce(struct net *net, |
1576 | if (error) |
1577 | goto nomem_init; |
1578 | |
1579 | - /* SCTP-AUTH: auth_chunk pointer is only set when the cookie-echo |
1580 | - * is supposed to be authenticated and we have to do delayed |
1581 | - * authentication. We've just recreated the association using |
1582 | - * the information in the cookie and now it's much easier to |
1583 | - * do the authentication. |
1584 | - */ |
1585 | - if (chunk->auth_chunk) { |
1586 | - struct sctp_chunk auth; |
1587 | - enum sctp_ierror ret; |
1588 | - |
1589 | - /* Make sure that we and the peer are AUTH capable */ |
1590 | - if (!net->sctp.auth_enable || !new_asoc->peer.auth_capable) { |
1591 | - sctp_association_free(new_asoc); |
1592 | - return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands); |
1593 | - } |
1594 | - |
1595 | - /* set-up our fake chunk so that we can process it */ |
1596 | - auth.skb = chunk->auth_chunk; |
1597 | - auth.asoc = chunk->asoc; |
1598 | - auth.sctp_hdr = chunk->sctp_hdr; |
1599 | - auth.chunk_hdr = (struct sctp_chunkhdr *) |
1600 | - skb_push(chunk->auth_chunk, |
1601 | - sizeof(struct sctp_chunkhdr)); |
1602 | - skb_pull(chunk->auth_chunk, sizeof(struct sctp_chunkhdr)); |
1603 | - auth.transport = chunk->transport; |
1604 | - |
1605 | - ret = sctp_sf_authenticate(net, ep, new_asoc, type, &auth); |
1606 | - if (ret != SCTP_IERROR_NO_ERROR) { |
1607 | - sctp_association_free(new_asoc); |
1608 | - return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands); |
1609 | - } |
1610 | + if (!sctp_auth_chunk_verify(net, chunk, new_asoc)) { |
1611 | + sctp_association_free(new_asoc); |
1612 | + return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands); |
1613 | } |
1614 | |
1615 | repl = sctp_make_cookie_ack(new_asoc, chunk); |
1616 | @@ -1758,13 +1759,15 @@ static enum sctp_disposition sctp_sf_do_dupcook_a( |
1617 | GFP_ATOMIC)) |
1618 | goto nomem; |
1619 | |
1620 | + if (!sctp_auth_chunk_verify(net, chunk, new_asoc)) |
1621 | + return SCTP_DISPOSITION_DISCARD; |
1622 | + |
1623 | /* Make sure no new addresses are being added during the |
1624 | * restart. Though this is a pretty complicated attack |
1625 | * since you'd have to get inside the cookie. |
1626 | */ |
1627 | - if (!sctp_sf_check_restart_addrs(new_asoc, asoc, chunk, commands)) { |
1628 | + if (!sctp_sf_check_restart_addrs(new_asoc, asoc, chunk, commands)) |
1629 | return SCTP_DISPOSITION_CONSUME; |
1630 | - } |
1631 | |
1632 | /* If the endpoint is in the SHUTDOWN-ACK-SENT state and recognizes |
1633 | * the peer has restarted (Action A), it MUST NOT setup a new |
1634 | @@ -1870,6 +1873,9 @@ static enum sctp_disposition sctp_sf_do_dupcook_b( |
1635 | GFP_ATOMIC)) |
1636 | goto nomem; |
1637 | |
1638 | + if (!sctp_auth_chunk_verify(net, chunk, new_asoc)) |
1639 | + return SCTP_DISPOSITION_DISCARD; |
1640 | + |
1641 | /* Update the content of current association. */ |
1642 | sctp_add_cmd_sf(commands, SCTP_CMD_UPDATE_ASSOC, SCTP_ASOC(new_asoc)); |
1643 | sctp_add_cmd_sf(commands, SCTP_CMD_NEW_STATE, |
1644 | @@ -1964,6 +1970,9 @@ static enum sctp_disposition sctp_sf_do_dupcook_d( |
1645 | * a COOKIE ACK. |
1646 | */ |
1647 | |
1648 | + if (!sctp_auth_chunk_verify(net, chunk, asoc)) |
1649 | + return SCTP_DISPOSITION_DISCARD; |
1650 | + |
1651 | /* Don't accidentally move back into established state. */ |
1652 | if (asoc->state < SCTP_STATE_ESTABLISHED) { |
1653 | sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_STOP, |
1654 | @@ -2003,7 +2012,7 @@ static enum sctp_disposition sctp_sf_do_dupcook_d( |
1655 | } |
1656 | } |
1657 | |
1658 | - repl = sctp_make_cookie_ack(new_asoc, chunk); |
1659 | + repl = sctp_make_cookie_ack(asoc, chunk); |
1660 | if (!repl) |
1661 | goto nomem; |
1662 | |
1663 | @@ -4108,10 +4117,7 @@ enum sctp_disposition sctp_sf_eat_fwd_tsn_fast( |
1664 | * The return value is the disposition of the chunk. |
1665 | */ |
1666 | static enum sctp_ierror sctp_sf_authenticate( |
1667 | - struct net *net, |
1668 | - const struct sctp_endpoint *ep, |
1669 | const struct sctp_association *asoc, |
1670 | - const union sctp_subtype type, |
1671 | struct sctp_chunk *chunk) |
1672 | { |
1673 | struct sctp_authhdr *auth_hdr; |
1674 | @@ -4209,7 +4215,7 @@ enum sctp_disposition sctp_sf_eat_auth(struct net *net, |
1675 | commands); |
1676 | |
1677 | auth_hdr = (struct sctp_authhdr *)chunk->skb->data; |
1678 | - error = sctp_sf_authenticate(net, ep, asoc, type, chunk); |
1679 | + error = sctp_sf_authenticate(asoc, chunk); |
1680 | switch (error) { |
1681 | case SCTP_IERROR_AUTH_BAD_HMAC: |
1682 | /* Generate the ERROR chunk and discard the rest |
1683 | diff --git a/net/sctp/stream.c b/net/sctp/stream.c |
1684 | index f799043abec9..f1f1d1b232ba 100644 |
1685 | --- a/net/sctp/stream.c |
1686 | +++ b/net/sctp/stream.c |
1687 | @@ -240,6 +240,8 @@ void sctp_stream_update(struct sctp_stream *stream, struct sctp_stream *new) |
1688 | |
1689 | new->out = NULL; |
1690 | new->in = NULL; |
1691 | + new->outcnt = 0; |
1692 | + new->incnt = 0; |
1693 | } |
1694 | |
1695 | static int sctp_send_reconf(struct sctp_association *asoc, |
1696 | diff --git a/net/sctp/ulpevent.c b/net/sctp/ulpevent.c |
1697 | index 84207ad33e8e..8cb7d9858270 100644 |
1698 | --- a/net/sctp/ulpevent.c |
1699 | +++ b/net/sctp/ulpevent.c |
1700 | @@ -715,7 +715,6 @@ struct sctp_ulpevent *sctp_ulpevent_make_rcvmsg(struct sctp_association *asoc, |
1701 | return event; |
1702 | |
1703 | fail_mark: |
1704 | - sctp_chunk_put(chunk); |
1705 | kfree_skb(skb); |
1706 | fail: |
1707 | return NULL; |
1708 | diff --git a/net/smc/af_smc.c b/net/smc/af_smc.c |
1709 | index afd5a935bbcb..5a983c9bea53 100644 |
1710 | --- a/net/smc/af_smc.c |
1711 | +++ b/net/smc/af_smc.c |
1712 | @@ -973,10 +973,6 @@ static void smc_tcp_listen_work(struct work_struct *work) |
1713 | } |
1714 | |
1715 | out: |
1716 | - if (lsmc->clcsock) { |
1717 | - sock_release(lsmc->clcsock); |
1718 | - lsmc->clcsock = NULL; |
1719 | - } |
1720 | release_sock(lsk); |
1721 | sock_put(&lsmc->sk); /* sock_hold in smc_listen */ |
1722 | } |
1723 | @@ -1165,13 +1161,15 @@ static __poll_t smc_poll(struct file *file, struct socket *sock, |
1724 | /* delegate to CLC child sock */ |
1725 | release_sock(sk); |
1726 | mask = smc->clcsock->ops->poll(file, smc->clcsock, wait); |
1727 | - /* if non-blocking connect finished ... */ |
1728 | lock_sock(sk); |
1729 | - if ((sk->sk_state == SMC_INIT) && (mask & EPOLLOUT)) { |
1730 | - sk->sk_err = smc->clcsock->sk->sk_err; |
1731 | - if (sk->sk_err) { |
1732 | - mask |= EPOLLERR; |
1733 | - } else { |
1734 | + sk->sk_err = smc->clcsock->sk->sk_err; |
1735 | + if (sk->sk_err) { |
1736 | + mask |= EPOLLERR; |
1737 | + } else { |
1738 | + /* if non-blocking connect finished ... */ |
1739 | + if (sk->sk_state == SMC_INIT && |
1740 | + mask & EPOLLOUT && |
1741 | + smc->clcsock->sk->sk_state != TCP_CLOSE) { |
1742 | rc = smc_connect_rdma(smc); |
1743 | if (rc < 0) |
1744 | mask |= EPOLLERR; |
1745 | diff --git a/net/tipc/socket.c b/net/tipc/socket.c |
1746 | index 7dfa9fc99ec3..df4f504b1fef 100644 |
1747 | --- a/net/tipc/socket.c |
1748 | +++ b/net/tipc/socket.c |
1749 | @@ -1518,10 +1518,10 @@ static void tipc_sk_set_orig_addr(struct msghdr *m, struct sk_buff *skb) |
1750 | |
1751 | srcaddr->sock.family = AF_TIPC; |
1752 | srcaddr->sock.addrtype = TIPC_ADDR_ID; |
1753 | + srcaddr->sock.scope = 0; |
1754 | srcaddr->sock.addr.id.ref = msg_origport(hdr); |
1755 | srcaddr->sock.addr.id.node = msg_orignode(hdr); |
1756 | srcaddr->sock.addr.name.domain = 0; |
1757 | - srcaddr->sock.scope = 0; |
1758 | m->msg_namelen = sizeof(struct sockaddr_tipc); |
1759 | |
1760 | if (!msg_in_group(hdr)) |
1761 | @@ -1530,6 +1530,7 @@ static void tipc_sk_set_orig_addr(struct msghdr *m, struct sk_buff *skb) |
1762 | /* Group message users may also want to know sending member's id */ |
1763 | srcaddr->member.family = AF_TIPC; |
1764 | srcaddr->member.addrtype = TIPC_ADDR_NAME; |
1765 | + srcaddr->member.scope = 0; |
1766 | srcaddr->member.addr.name.name.type = msg_nametype(hdr); |
1767 | srcaddr->member.addr.name.name.instance = TIPC_SKB_CB(skb)->orig_member; |
1768 | srcaddr->member.addr.name.domain = 0; |
1769 | diff --git a/net/tls/tls_main.c b/net/tls/tls_main.c |
1770 | index d824d548447e..b51180c1479a 100644 |
1771 | --- a/net/tls/tls_main.c |
1772 | +++ b/net/tls/tls_main.c |
1773 | @@ -107,6 +107,7 @@ int tls_push_sg(struct sock *sk, |
1774 | size = sg->length - offset; |
1775 | offset += sg->offset; |
1776 | |
1777 | + ctx->in_tcp_sendpages = true; |
1778 | while (1) { |
1779 | if (sg_is_last(sg)) |
1780 | sendpage_flags = flags; |
1781 | @@ -127,6 +128,7 @@ int tls_push_sg(struct sock *sk, |
1782 | offset -= sg->offset; |
1783 | ctx->partially_sent_offset = offset; |
1784 | ctx->partially_sent_record = (void *)sg; |
1785 | + ctx->in_tcp_sendpages = false; |
1786 | return ret; |
1787 | } |
1788 | |
1789 | @@ -141,6 +143,8 @@ int tls_push_sg(struct sock *sk, |
1790 | } |
1791 | |
1792 | clear_bit(TLS_PENDING_CLOSED_RECORD, &ctx->flags); |
1793 | + ctx->in_tcp_sendpages = false; |
1794 | + ctx->sk_write_space(sk); |
1795 | |
1796 | return 0; |
1797 | } |
1798 | @@ -210,6 +214,10 @@ static void tls_write_space(struct sock *sk) |
1799 | { |
1800 | struct tls_context *ctx = tls_get_ctx(sk); |
1801 | |
1802 | + /* We are already sending pages, ignore notification */ |
1803 | + if (ctx->in_tcp_sendpages) |
1804 | + return; |
1805 | + |
1806 | if (!sk->sk_write_pending && tls_is_pending_closed_record(ctx)) { |
1807 | gfp_t sk_allocation = sk->sk_allocation; |
1808 | int rc; |