aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2018-04-09 20:04:10 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2018-04-09 20:04:10 -0400
commitc18bb396d3d261ebbb4efbc05129c5d354c541e4 (patch)
tree058a1413dd34fe4e1d9a998a43d56f3358b93e36
parentfd3b36d275660c905da9900b078eea341847d5e4 (diff)
parenta2ac99905f1ea8b15997a6ec39af69aa28a3653b (diff)
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Pull networking fixes from David Miller: 1) The sockmap code has to free socket memory on close if there is corked data, from John Fastabend. 2) Tunnel names coming from userspace need to be length validated. From Eric Dumazet. 3) arp_filter() has to take VRFs properly into account, from Miguel Fadon Perlines. 4) Fix oops in error path of tcf_bpf_init(), from Davide Caratti. 5) Missing idr_remove() in u32_delete_key(), from Cong Wang. 6) More syzbot stuff. Several use of uninitialized value fixes all over, from Eric Dumazet. 7) Do not leak kernel memory to userspace in sctp, also from Eric Dumazet. 8) Discard frames from unused ports in DSA, from Andrew Lunn. 9) Fix DMA mapping and reset/failover problems in ibmvnic, from Thomas Falcon. 10) Do not access dp83640 PHY registers prematurely after reset, from Esben Haabendal. * git://git.kernel.org/pub/scm/linux/kernel/git/davem/net: (46 commits) vhost-net: set packet weight of tx polling to 2 * vq size net: thunderx: rework mac addresses list to u64 array inetpeer: fix uninit-value in inet_getpeer dp83640: Ensure against premature access to PHY registers after reset devlink: convert occ_get op to separate registration ARM: dts: ls1021a: Specify TBIPA register address net/fsl_pq_mdio: Allow explicit speficition of TBIPA address ibmvnic: Do not reset CRQ for Mobility driver resets ibmvnic: Fix failover case for non-redundant configuration ibmvnic: Fix reset scheduler error handling ibmvnic: Zero used TX descriptor counter on reset ibmvnic: Fix DMA mapping mistakes tipc: use the right skb in tipc_sk_fill_sock_diag() sctp: sctp_sockaddr_af must check minimal addr length for AF_INET6 net: dsa: Discard frames from unused ports sctp: do not leak kernel memory to user space soreuseport: initialise timewait reuseport field ipv4: fix uninit-value in ip_route_output_key_hash_rcu() dccp: initialize ireq->ir_mark net: fix uninit-value in __hw_addr_add_ex() ...
-rw-r--r--Documentation/devicetree/bindings/net/fsl-tsec-phy.txt6
-rw-r--r--arch/arm/boot/dts/ls1021a.dtsi3
-rw-r--r--crypto/af_alg.c8
-rw-r--r--drivers/net/ethernet/cavium/thunder/nic.h7
-rw-r--r--drivers/net/ethernet/cavium/thunder/nicvf_main.c28
-rw-r--r--drivers/net/ethernet/freescale/fsl_pq_mdio.c50
-rw-r--r--drivers/net/ethernet/ibm/ibmvnic.c146
-rw-r--r--drivers/net/ethernet/ibm/ibmvnic.h1
-rw-r--r--drivers/net/ethernet/intel/ice/ice_common.c4
-rw-r--r--drivers/net/ethernet/intel/ice/ice_ethtool.c4
-rw-r--r--drivers/net/ethernet/marvell/mvpp2.c2
-rw-r--r--drivers/net/ethernet/mellanox/mlxsw/spectrum.c24
-rw-r--r--drivers/net/ethernet/mellanox/mlxsw/spectrum.h1
-rw-r--r--drivers/net/ethernet/mellanox/mlxsw/spectrum_kvdl.c67
-rw-r--r--drivers/net/hyperv/netvsc.c60
-rw-r--r--drivers/net/netdevsim/devlink.c65
-rw-r--r--drivers/net/phy/dp83640.c18
-rw-r--r--drivers/net/phy/marvell.c20
-rw-r--r--drivers/vhost/net.c8
-rw-r--r--include/net/bluetooth/hci_core.h2
-rw-r--r--include/net/devlink.h40
-rw-r--r--include/net/inet_timewait_sock.h1
-rw-r--r--include/net/nexthop.h2
-rw-r--r--kernel/bpf/sockmap.c12
-rw-r--r--kernel/bpf/syscall.c24
-rw-r--r--net/bluetooth/hci_conn.c29
-rw-r--r--net/bluetooth/hci_event.c15
-rw-r--r--net/bluetooth/l2cap_core.c2
-rw-r--r--net/core/dev.c2
-rw-r--r--net/core/dev_addr_lists.c4
-rw-r--r--net/core/devlink.c74
-rw-r--r--net/core/skbuff.c1
-rw-r--r--net/dccp/ipv4.c1
-rw-r--r--net/dccp/ipv6.c1
-rw-r--r--net/dsa/dsa_priv.h8
-rw-r--r--net/ipv4/arp.c2
-rw-r--r--net/ipv4/inet_timewait_sock.c1
-rw-r--r--net/ipv4/inetpeer.c1
-rw-r--r--net/ipv4/ip_tunnel.c11
-rw-r--r--net/ipv4/route.c11
-rw-r--r--net/ipv6/ip6_gre.c8
-rw-r--r--net/ipv6/ip6_output.c7
-rw-r--r--net/ipv6/ip6_tunnel.c11
-rw-r--r--net/ipv6/ip6_vti.c7
-rw-r--r--net/ipv6/sit.c8
-rw-r--r--net/netlink/af_netlink.c2
-rw-r--r--net/sched/act_bpf.c12
-rw-r--r--net/sched/cls_u32.c1
-rw-r--r--net/sctp/ipv6.c4
-rw-r--r--net/sctp/socket.c13
-rw-r--r--net/tipc/diag.c2
-rw-r--r--net/tipc/socket.c6
-rw-r--r--net/tipc/socket.h4
53 files changed, 553 insertions, 298 deletions
diff --git a/Documentation/devicetree/bindings/net/fsl-tsec-phy.txt b/Documentation/devicetree/bindings/net/fsl-tsec-phy.txt
index 594982c6b9f9..79bf352e659c 100644
--- a/Documentation/devicetree/bindings/net/fsl-tsec-phy.txt
+++ b/Documentation/devicetree/bindings/net/fsl-tsec-phy.txt
@@ -6,7 +6,11 @@ the definition of the PHY node in booting-without-of.txt for an example
6of how to define a PHY. 6of how to define a PHY.
7 7
8Required properties: 8Required properties:
9 - reg : Offset and length of the register set for the device 9 - reg : Offset and length of the register set for the device, and optionally
10 the offset and length of the TBIPA register (TBI PHY address
11 register). If TBIPA register is not specified, the driver will
12 attempt to infer it from the register set specified (your mileage may
13 vary).
10 - compatible : Should define the compatible device type for the 14 - compatible : Should define the compatible device type for the
11 mdio. Currently supported strings/devices are: 15 mdio. Currently supported strings/devices are:
12 - "fsl,gianfar-tbi" 16 - "fsl,gianfar-tbi"
diff --git a/arch/arm/boot/dts/ls1021a.dtsi b/arch/arm/boot/dts/ls1021a.dtsi
index fbd2897566c3..c55d479971cc 100644
--- a/arch/arm/boot/dts/ls1021a.dtsi
+++ b/arch/arm/boot/dts/ls1021a.dtsi
@@ -587,7 +587,8 @@
587 device_type = "mdio"; 587 device_type = "mdio";
588 #address-cells = <1>; 588 #address-cells = <1>;
589 #size-cells = <0>; 589 #size-cells = <0>;
590 reg = <0x0 0x2d24000 0x0 0x4000>; 590 reg = <0x0 0x2d24000 0x0 0x4000>,
591 <0x0 0x2d10030 0x0 0x4>;
591 }; 592 };
592 593
593 ptp_clock@2d10e00 { 594 ptp_clock@2d10e00 {
diff --git a/crypto/af_alg.c b/crypto/af_alg.c
index c49766b03165..7846c0c20cfe 100644
--- a/crypto/af_alg.c
+++ b/crypto/af_alg.c
@@ -158,16 +158,16 @@ static int alg_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
158 void *private; 158 void *private;
159 int err; 159 int err;
160 160
161 /* If caller uses non-allowed flag, return error. */
162 if ((sa->salg_feat & ~allowed) || (sa->salg_mask & ~allowed))
163 return -EINVAL;
164
165 if (sock->state == SS_CONNECTED) 161 if (sock->state == SS_CONNECTED)
166 return -EINVAL; 162 return -EINVAL;
167 163
168 if (addr_len < sizeof(*sa)) 164 if (addr_len < sizeof(*sa))
169 return -EINVAL; 165 return -EINVAL;
170 166
167 /* If caller uses non-allowed flag, return error. */
168 if ((sa->salg_feat & ~allowed) || (sa->salg_mask & ~allowed))
169 return -EINVAL;
170
171 sa->salg_type[sizeof(sa->salg_type) - 1] = 0; 171 sa->salg_type[sizeof(sa->salg_type) - 1] = 0;
172 sa->salg_name[sizeof(sa->salg_name) + addr_len - sizeof(*sa) - 1] = 0; 172 sa->salg_name[sizeof(sa->salg_name) + addr_len - sizeof(*sa) - 1] = 0;
173 173
diff --git a/drivers/net/ethernet/cavium/thunder/nic.h b/drivers/net/ethernet/cavium/thunder/nic.h
index 5fc46c5a4f36..448d1fafc827 100644
--- a/drivers/net/ethernet/cavium/thunder/nic.h
+++ b/drivers/net/ethernet/cavium/thunder/nic.h
@@ -265,14 +265,9 @@ struct nicvf_drv_stats {
265 265
266struct cavium_ptp; 266struct cavium_ptp;
267 267
268struct xcast_addr {
269 struct list_head list;
270 u64 addr;
271};
272
273struct xcast_addr_list { 268struct xcast_addr_list {
274 struct list_head list;
275 int count; 269 int count;
270 u64 mc[];
276}; 271};
277 272
278struct nicvf_work { 273struct nicvf_work {
diff --git a/drivers/net/ethernet/cavium/thunder/nicvf_main.c b/drivers/net/ethernet/cavium/thunder/nicvf_main.c
index 1e9a31fef729..707db3304396 100644
--- a/drivers/net/ethernet/cavium/thunder/nicvf_main.c
+++ b/drivers/net/ethernet/cavium/thunder/nicvf_main.c
@@ -1929,7 +1929,7 @@ static void nicvf_set_rx_mode_task(struct work_struct *work_arg)
1929 work.work); 1929 work.work);
1930 struct nicvf *nic = container_of(vf_work, struct nicvf, rx_mode_work); 1930 struct nicvf *nic = container_of(vf_work, struct nicvf, rx_mode_work);
1931 union nic_mbx mbx = {}; 1931 union nic_mbx mbx = {};
1932 struct xcast_addr *xaddr, *next; 1932 int idx;
1933 1933
1934 if (!vf_work) 1934 if (!vf_work)
1935 return; 1935 return;
@@ -1956,16 +1956,10 @@ static void nicvf_set_rx_mode_task(struct work_struct *work_arg)
1956 /* check if we have any specific MACs to be added to PF DMAC filter */ 1956 /* check if we have any specific MACs to be added to PF DMAC filter */
1957 if (vf_work->mc) { 1957 if (vf_work->mc) {
1958 /* now go through kernel list of MACs and add them one by one */ 1958 /* now go through kernel list of MACs and add them one by one */
1959 list_for_each_entry_safe(xaddr, next, 1959 for (idx = 0; idx < vf_work->mc->count; idx++) {
1960 &vf_work->mc->list, list) {
1961 mbx.xcast.msg = NIC_MBOX_MSG_ADD_MCAST; 1960 mbx.xcast.msg = NIC_MBOX_MSG_ADD_MCAST;
1962 mbx.xcast.data.mac = xaddr->addr; 1961 mbx.xcast.data.mac = vf_work->mc->mc[idx];
1963 nicvf_send_msg_to_pf(nic, &mbx); 1962 nicvf_send_msg_to_pf(nic, &mbx);
1964
1965 /* after receiving ACK from PF release memory */
1966 list_del(&xaddr->list);
1967 kfree(xaddr);
1968 vf_work->mc->count--;
1969 } 1963 }
1970 kfree(vf_work->mc); 1964 kfree(vf_work->mc);
1971 } 1965 }
@@ -1996,17 +1990,15 @@ static void nicvf_set_rx_mode(struct net_device *netdev)
1996 mode |= BGX_XCAST_MCAST_FILTER; 1990 mode |= BGX_XCAST_MCAST_FILTER;
1997 /* here we need to copy mc addrs */ 1991 /* here we need to copy mc addrs */
1998 if (netdev_mc_count(netdev)) { 1992 if (netdev_mc_count(netdev)) {
1999 struct xcast_addr *xaddr; 1993 mc_list = kmalloc(offsetof(typeof(*mc_list),
2000 1994 mc[netdev_mc_count(netdev)]),
2001 mc_list = kmalloc(sizeof(*mc_list), GFP_ATOMIC); 1995 GFP_ATOMIC);
2002 INIT_LIST_HEAD(&mc_list->list); 1996 if (unlikely(!mc_list))
1997 return;
1998 mc_list->count = 0;
2003 netdev_hw_addr_list_for_each(ha, &netdev->mc) { 1999 netdev_hw_addr_list_for_each(ha, &netdev->mc) {
2004 xaddr = kmalloc(sizeof(*xaddr), 2000 mc_list->mc[mc_list->count] =
2005 GFP_ATOMIC);
2006 xaddr->addr =
2007 ether_addr_to_u64(ha->addr); 2001 ether_addr_to_u64(ha->addr);
2008 list_add_tail(&xaddr->list,
2009 &mc_list->list);
2010 mc_list->count++; 2002 mc_list->count++;
2011 } 2003 }
2012 } 2004 }
diff --git a/drivers/net/ethernet/freescale/fsl_pq_mdio.c b/drivers/net/ethernet/freescale/fsl_pq_mdio.c
index 80ad16acf0f1..ac2c3f6a12bc 100644
--- a/drivers/net/ethernet/freescale/fsl_pq_mdio.c
+++ b/drivers/net/ethernet/freescale/fsl_pq_mdio.c
@@ -377,6 +377,38 @@ static const struct of_device_id fsl_pq_mdio_match[] = {
377}; 377};
378MODULE_DEVICE_TABLE(of, fsl_pq_mdio_match); 378MODULE_DEVICE_TABLE(of, fsl_pq_mdio_match);
379 379
380static void set_tbipa(const u32 tbipa_val, struct platform_device *pdev,
381 uint32_t __iomem * (*get_tbipa)(void __iomem *),
382 void __iomem *reg_map, struct resource *reg_res)
383{
384 struct device_node *np = pdev->dev.of_node;
385 uint32_t __iomem *tbipa;
386 bool tbipa_mapped;
387
388 tbipa = of_iomap(np, 1);
389 if (tbipa) {
390 tbipa_mapped = true;
391 } else {
392 tbipa_mapped = false;
393 tbipa = (*get_tbipa)(reg_map);
394
395 /*
396 * Add consistency check to make sure TBI is contained within
397 * the mapped range (not because we would get a segfault,
398 * rather to catch bugs in computing TBI address). Print error
399 * message but continue anyway.
400 */
401 if ((void *)tbipa > reg_map + resource_size(reg_res) - 4)
402 dev_err(&pdev->dev, "invalid register map (should be at least 0x%04zx to contain TBI address)\n",
403 ((void *)tbipa - reg_map) + 4);
404 }
405
406 iowrite32be(be32_to_cpu(tbipa_val), tbipa);
407
408 if (tbipa_mapped)
409 iounmap(tbipa);
410}
411
380static int fsl_pq_mdio_probe(struct platform_device *pdev) 412static int fsl_pq_mdio_probe(struct platform_device *pdev)
381{ 413{
382 const struct of_device_id *id = 414 const struct of_device_id *id =
@@ -450,8 +482,6 @@ static int fsl_pq_mdio_probe(struct platform_device *pdev)
450 482
451 if (tbi) { 483 if (tbi) {
452 const u32 *prop = of_get_property(tbi, "reg", NULL); 484 const u32 *prop = of_get_property(tbi, "reg", NULL);
453 uint32_t __iomem *tbipa;
454
455 if (!prop) { 485 if (!prop) {
456 dev_err(&pdev->dev, 486 dev_err(&pdev->dev,
457 "missing 'reg' property in node %pOF\n", 487 "missing 'reg' property in node %pOF\n",
@@ -459,20 +489,8 @@ static int fsl_pq_mdio_probe(struct platform_device *pdev)
459 err = -EBUSY; 489 err = -EBUSY;
460 goto error; 490 goto error;
461 } 491 }
462 492 set_tbipa(*prop, pdev,
463 tbipa = data->get_tbipa(priv->map); 493 data->get_tbipa, priv->map, &res);
464
465 /*
466 * Add consistency check to make sure TBI is contained
467 * within the mapped range (not because we would get a
468 * segfault, rather to catch bugs in computing TBI
469 * address). Print error message but continue anyway.
470 */
471 if ((void *)tbipa > priv->map + resource_size(&res) - 4)
472 dev_err(&pdev->dev, "invalid register map (should be at least 0x%04zx to contain TBI address)\n",
473 ((void *)tbipa - priv->map) + 4);
474
475 iowrite32be(be32_to_cpup(prop), tbipa);
476 } 494 }
477 } 495 }
478 496
diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c
index b492af6affc3..aad5658d79d5 100644
--- a/drivers/net/ethernet/ibm/ibmvnic.c
+++ b/drivers/net/ethernet/ibm/ibmvnic.c
@@ -118,6 +118,7 @@ static int init_sub_crq_irqs(struct ibmvnic_adapter *adapter);
118static int ibmvnic_init(struct ibmvnic_adapter *); 118static int ibmvnic_init(struct ibmvnic_adapter *);
119static void release_crq_queue(struct ibmvnic_adapter *); 119static void release_crq_queue(struct ibmvnic_adapter *);
120static int __ibmvnic_set_mac(struct net_device *netdev, struct sockaddr *p); 120static int __ibmvnic_set_mac(struct net_device *netdev, struct sockaddr *p);
121static int init_crq_queue(struct ibmvnic_adapter *adapter);
121 122
122struct ibmvnic_stat { 123struct ibmvnic_stat {
123 char name[ETH_GSTRING_LEN]; 124 char name[ETH_GSTRING_LEN];
@@ -320,18 +321,16 @@ failure:
320 dev_info(dev, "replenish pools failure\n"); 321 dev_info(dev, "replenish pools failure\n");
321 pool->free_map[pool->next_free] = index; 322 pool->free_map[pool->next_free] = index;
322 pool->rx_buff[index].skb = NULL; 323 pool->rx_buff[index].skb = NULL;
323 if (!dma_mapping_error(dev, dma_addr))
324 dma_unmap_single(dev, dma_addr, pool->buff_size,
325 DMA_FROM_DEVICE);
326 324
327 dev_kfree_skb_any(skb); 325 dev_kfree_skb_any(skb);
328 adapter->replenish_add_buff_failure++; 326 adapter->replenish_add_buff_failure++;
329 atomic_add(buffers_added, &pool->available); 327 atomic_add(buffers_added, &pool->available);
330 328
331 if (lpar_rc == H_CLOSED) { 329 if (lpar_rc == H_CLOSED || adapter->failover_pending) {
332 /* Disable buffer pool replenishment and report carrier off if 330 /* Disable buffer pool replenishment and report carrier off if
333 * queue is closed. Firmware guarantees that a signal will 331 * queue is closed or pending failover.
334 * be sent to the driver, triggering a reset. 332 * Firmware guarantees that a signal will be sent to the
333 * driver, triggering a reset.
335 */ 334 */
336 deactivate_rx_pools(adapter); 335 deactivate_rx_pools(adapter);
337 netif_carrier_off(adapter->netdev); 336 netif_carrier_off(adapter->netdev);
@@ -1071,6 +1070,14 @@ static int ibmvnic_open(struct net_device *netdev)
1071 struct ibmvnic_adapter *adapter = netdev_priv(netdev); 1070 struct ibmvnic_adapter *adapter = netdev_priv(netdev);
1072 int rc; 1071 int rc;
1073 1072
1073 /* If device failover is pending, just set device state and return.
1074 * Device operation will be handled by reset routine.
1075 */
1076 if (adapter->failover_pending) {
1077 adapter->state = VNIC_OPEN;
1078 return 0;
1079 }
1080
1074 mutex_lock(&adapter->reset_lock); 1081 mutex_lock(&adapter->reset_lock);
1075 1082
1076 if (adapter->state != VNIC_CLOSED) { 1083 if (adapter->state != VNIC_CLOSED) {
@@ -1218,7 +1225,6 @@ static int __ibmvnic_close(struct net_device *netdev)
1218 rc = set_link_state(adapter, IBMVNIC_LOGICAL_LNK_DN); 1225 rc = set_link_state(adapter, IBMVNIC_LOGICAL_LNK_DN);
1219 if (rc) 1226 if (rc)
1220 return rc; 1227 return rc;
1221 ibmvnic_cleanup(netdev);
1222 adapter->state = VNIC_CLOSED; 1228 adapter->state = VNIC_CLOSED;
1223 return 0; 1229 return 0;
1224} 1230}
@@ -1228,8 +1234,17 @@ static int ibmvnic_close(struct net_device *netdev)
1228 struct ibmvnic_adapter *adapter = netdev_priv(netdev); 1234 struct ibmvnic_adapter *adapter = netdev_priv(netdev);
1229 int rc; 1235 int rc;
1230 1236
1237 /* If device failover is pending, just set device state and return.
1238 * Device operation will be handled by reset routine.
1239 */
1240 if (adapter->failover_pending) {
1241 adapter->state = VNIC_CLOSED;
1242 return 0;
1243 }
1244
1231 mutex_lock(&adapter->reset_lock); 1245 mutex_lock(&adapter->reset_lock);
1232 rc = __ibmvnic_close(netdev); 1246 rc = __ibmvnic_close(netdev);
1247 ibmvnic_cleanup(netdev);
1233 mutex_unlock(&adapter->reset_lock); 1248 mutex_unlock(&adapter->reset_lock);
1234 1249
1235 return rc; 1250 return rc;
@@ -1562,8 +1577,9 @@ static int ibmvnic_xmit(struct sk_buff *skb, struct net_device *netdev)
1562 dev_kfree_skb_any(skb); 1577 dev_kfree_skb_any(skb);
1563 tx_buff->skb = NULL; 1578 tx_buff->skb = NULL;
1564 1579
1565 if (lpar_rc == H_CLOSED) { 1580 if (lpar_rc == H_CLOSED || adapter->failover_pending) {
1566 /* Disable TX and report carrier off if queue is closed. 1581 /* Disable TX and report carrier off if queue is closed
1582 * or pending failover.
1567 * Firmware guarantees that a signal will be sent to the 1583 * Firmware guarantees that a signal will be sent to the
1568 * driver, triggering a reset or some other action. 1584 * driver, triggering a reset or some other action.
1569 */ 1585 */
@@ -1711,14 +1727,10 @@ static int do_reset(struct ibmvnic_adapter *adapter,
1711 old_num_rx_queues = adapter->req_rx_queues; 1727 old_num_rx_queues = adapter->req_rx_queues;
1712 old_num_tx_queues = adapter->req_tx_queues; 1728 old_num_tx_queues = adapter->req_tx_queues;
1713 1729
1714 if (rwi->reset_reason == VNIC_RESET_MOBILITY) { 1730 ibmvnic_cleanup(netdev);
1715 rc = ibmvnic_reenable_crq_queue(adapter); 1731
1716 if (rc) 1732 if (adapter->reset_reason != VNIC_RESET_MOBILITY &&
1717 return 0; 1733 adapter->reset_reason != VNIC_RESET_FAILOVER) {
1718 ibmvnic_cleanup(netdev);
1719 } else if (rwi->reset_reason == VNIC_RESET_FAILOVER) {
1720 ibmvnic_cleanup(netdev);
1721 } else {
1722 rc = __ibmvnic_close(netdev); 1734 rc = __ibmvnic_close(netdev);
1723 if (rc) 1735 if (rc)
1724 return rc; 1736 return rc;
@@ -1737,6 +1749,23 @@ static int do_reset(struct ibmvnic_adapter *adapter,
1737 */ 1749 */
1738 adapter->state = VNIC_PROBED; 1750 adapter->state = VNIC_PROBED;
1739 1751
1752 if (adapter->wait_for_reset) {
1753 rc = init_crq_queue(adapter);
1754 } else if (adapter->reset_reason == VNIC_RESET_MOBILITY) {
1755 rc = ibmvnic_reenable_crq_queue(adapter);
1756 release_sub_crqs(adapter, 1);
1757 } else {
1758 rc = ibmvnic_reset_crq(adapter);
1759 if (!rc)
1760 rc = vio_enable_interrupts(adapter->vdev);
1761 }
1762
1763 if (rc) {
1764 netdev_err(adapter->netdev,
1765 "Couldn't initialize crq. rc=%d\n", rc);
1766 return rc;
1767 }
1768
1740 rc = ibmvnic_init(adapter); 1769 rc = ibmvnic_init(adapter);
1741 if (rc) 1770 if (rc)
1742 return IBMVNIC_INIT_FAILED; 1771 return IBMVNIC_INIT_FAILED;
@@ -1878,23 +1907,26 @@ static void __ibmvnic_reset(struct work_struct *work)
1878 mutex_unlock(&adapter->reset_lock); 1907 mutex_unlock(&adapter->reset_lock);
1879} 1908}
1880 1909
1881static void ibmvnic_reset(struct ibmvnic_adapter *adapter, 1910static int ibmvnic_reset(struct ibmvnic_adapter *adapter,
1882 enum ibmvnic_reset_reason reason) 1911 enum ibmvnic_reset_reason reason)
1883{ 1912{
1884 struct ibmvnic_rwi *rwi, *tmp; 1913 struct ibmvnic_rwi *rwi, *tmp;
1885 struct net_device *netdev = adapter->netdev; 1914 struct net_device *netdev = adapter->netdev;
1886 struct list_head *entry; 1915 struct list_head *entry;
1916 int ret;
1887 1917
1888 if (adapter->state == VNIC_REMOVING || 1918 if (adapter->state == VNIC_REMOVING ||
1889 adapter->state == VNIC_REMOVED) { 1919 adapter->state == VNIC_REMOVED ||
1890 netdev_dbg(netdev, "Adapter removing, skipping reset\n"); 1920 adapter->failover_pending) {
1891 return; 1921 ret = EBUSY;
1922 netdev_dbg(netdev, "Adapter removing or pending failover, skipping reset\n");
1923 goto err;
1892 } 1924 }
1893 1925
1894 if (adapter->state == VNIC_PROBING) { 1926 if (adapter->state == VNIC_PROBING) {
1895 netdev_warn(netdev, "Adapter reset during probe\n"); 1927 netdev_warn(netdev, "Adapter reset during probe\n");
1896 adapter->init_done_rc = EAGAIN; 1928 ret = adapter->init_done_rc = EAGAIN;
1897 return; 1929 goto err;
1898 } 1930 }
1899 1931
1900 mutex_lock(&adapter->rwi_lock); 1932 mutex_lock(&adapter->rwi_lock);
@@ -1904,7 +1936,8 @@ static void ibmvnic_reset(struct ibmvnic_adapter *adapter,
1904 if (tmp->reset_reason == reason) { 1936 if (tmp->reset_reason == reason) {
1905 netdev_dbg(netdev, "Skipping matching reset\n"); 1937 netdev_dbg(netdev, "Skipping matching reset\n");
1906 mutex_unlock(&adapter->rwi_lock); 1938 mutex_unlock(&adapter->rwi_lock);
1907 return; 1939 ret = EBUSY;
1940 goto err;
1908 } 1941 }
1909 } 1942 }
1910 1943
@@ -1912,7 +1945,8 @@ static void ibmvnic_reset(struct ibmvnic_adapter *adapter,
1912 if (!rwi) { 1945 if (!rwi) {
1913 mutex_unlock(&adapter->rwi_lock); 1946 mutex_unlock(&adapter->rwi_lock);
1914 ibmvnic_close(netdev); 1947 ibmvnic_close(netdev);
1915 return; 1948 ret = ENOMEM;
1949 goto err;
1916 } 1950 }
1917 1951
1918 rwi->reset_reason = reason; 1952 rwi->reset_reason = reason;
@@ -1921,6 +1955,12 @@ static void ibmvnic_reset(struct ibmvnic_adapter *adapter,
1921 1955
1922 netdev_dbg(adapter->netdev, "Scheduling reset (reason %d)\n", reason); 1956 netdev_dbg(adapter->netdev, "Scheduling reset (reason %d)\n", reason);
1923 schedule_work(&adapter->ibmvnic_reset); 1957 schedule_work(&adapter->ibmvnic_reset);
1958
1959 return 0;
1960err:
1961 if (adapter->wait_for_reset)
1962 adapter->wait_for_reset = false;
1963 return -ret;
1924} 1964}
1925 1965
1926static void ibmvnic_tx_timeout(struct net_device *dev) 1966static void ibmvnic_tx_timeout(struct net_device *dev)
@@ -2055,6 +2095,8 @@ static void ibmvnic_netpoll_controller(struct net_device *dev)
2055 2095
2056static int wait_for_reset(struct ibmvnic_adapter *adapter) 2096static int wait_for_reset(struct ibmvnic_adapter *adapter)
2057{ 2097{
2098 int rc, ret;
2099
2058 adapter->fallback.mtu = adapter->req_mtu; 2100 adapter->fallback.mtu = adapter->req_mtu;
2059 adapter->fallback.rx_queues = adapter->req_rx_queues; 2101 adapter->fallback.rx_queues = adapter->req_rx_queues;
2060 adapter->fallback.tx_queues = adapter->req_tx_queues; 2102 adapter->fallback.tx_queues = adapter->req_tx_queues;
@@ -2062,11 +2104,15 @@ static int wait_for_reset(struct ibmvnic_adapter *adapter)
2062 adapter->fallback.tx_entries = adapter->req_tx_entries_per_subcrq; 2104 adapter->fallback.tx_entries = adapter->req_tx_entries_per_subcrq;
2063 2105
2064 init_completion(&adapter->reset_done); 2106 init_completion(&adapter->reset_done);
2065 ibmvnic_reset(adapter, VNIC_RESET_CHANGE_PARAM);
2066 adapter->wait_for_reset = true; 2107 adapter->wait_for_reset = true;
2108 rc = ibmvnic_reset(adapter, VNIC_RESET_CHANGE_PARAM);
2109 if (rc)
2110 return rc;
2067 wait_for_completion(&adapter->reset_done); 2111 wait_for_completion(&adapter->reset_done);
2068 2112
2113 ret = 0;
2069 if (adapter->reset_done_rc) { 2114 if (adapter->reset_done_rc) {
2115 ret = -EIO;
2070 adapter->desired.mtu = adapter->fallback.mtu; 2116 adapter->desired.mtu = adapter->fallback.mtu;
2071 adapter->desired.rx_queues = adapter->fallback.rx_queues; 2117 adapter->desired.rx_queues = adapter->fallback.rx_queues;
2072 adapter->desired.tx_queues = adapter->fallback.tx_queues; 2118 adapter->desired.tx_queues = adapter->fallback.tx_queues;
@@ -2074,12 +2120,15 @@ static int wait_for_reset(struct ibmvnic_adapter *adapter)
2074 adapter->desired.tx_entries = adapter->fallback.tx_entries; 2120 adapter->desired.tx_entries = adapter->fallback.tx_entries;
2075 2121
2076 init_completion(&adapter->reset_done); 2122 init_completion(&adapter->reset_done);
2077 ibmvnic_reset(adapter, VNIC_RESET_CHANGE_PARAM); 2123 adapter->wait_for_reset = true;
2124 rc = ibmvnic_reset(adapter, VNIC_RESET_CHANGE_PARAM);
2125 if (rc)
2126 return ret;
2078 wait_for_completion(&adapter->reset_done); 2127 wait_for_completion(&adapter->reset_done);
2079 } 2128 }
2080 adapter->wait_for_reset = false; 2129 adapter->wait_for_reset = false;
2081 2130
2082 return adapter->reset_done_rc; 2131 return ret;
2083} 2132}
2084 2133
2085static int ibmvnic_change_mtu(struct net_device *netdev, int new_mtu) 2134static int ibmvnic_change_mtu(struct net_device *netdev, int new_mtu)
@@ -2364,6 +2413,7 @@ static int reset_one_sub_crq_queue(struct ibmvnic_adapter *adapter,
2364 } 2413 }
2365 2414
2366 memset(scrq->msgs, 0, 4 * PAGE_SIZE); 2415 memset(scrq->msgs, 0, 4 * PAGE_SIZE);
2416 atomic_set(&scrq->used, 0);
2367 scrq->cur = 0; 2417 scrq->cur = 0;
2368 2418
2369 rc = h_reg_sub_crq(adapter->vdev->unit_address, scrq->msg_token, 2419 rc = h_reg_sub_crq(adapter->vdev->unit_address, scrq->msg_token,
@@ -2574,7 +2624,7 @@ static int ibmvnic_complete_tx(struct ibmvnic_adapter *adapter,
2574 union sub_crq *next; 2624 union sub_crq *next;
2575 int index; 2625 int index;
2576 int i, j; 2626 int i, j;
2577 u8 first; 2627 u8 *first;
2578 2628
2579restart_loop: 2629restart_loop:
2580 while (pending_scrq(adapter, scrq)) { 2630 while (pending_scrq(adapter, scrq)) {
@@ -2605,11 +2655,12 @@ restart_loop:
2605 txbuff->data_dma[j] = 0; 2655 txbuff->data_dma[j] = 0;
2606 } 2656 }
2607 /* if sub_crq was sent indirectly */ 2657 /* if sub_crq was sent indirectly */
2608 first = txbuff->indir_arr[0].generic.first; 2658 first = &txbuff->indir_arr[0].generic.first;
2609 if (first == IBMVNIC_CRQ_CMD) { 2659 if (*first == IBMVNIC_CRQ_CMD) {
2610 dma_unmap_single(dev, txbuff->indir_dma, 2660 dma_unmap_single(dev, txbuff->indir_dma,
2611 sizeof(txbuff->indir_arr), 2661 sizeof(txbuff->indir_arr),
2612 DMA_TO_DEVICE); 2662 DMA_TO_DEVICE);
2663 *first = 0;
2613 } 2664 }
2614 2665
2615 if (txbuff->last_frag) { 2666 if (txbuff->last_frag) {
@@ -3882,9 +3933,9 @@ static int handle_login_rsp(union ibmvnic_crq *login_rsp_crq,
3882 int i; 3933 int i;
3883 3934
3884 dma_unmap_single(dev, adapter->login_buf_token, adapter->login_buf_sz, 3935 dma_unmap_single(dev, adapter->login_buf_token, adapter->login_buf_sz,
3885 DMA_BIDIRECTIONAL); 3936 DMA_TO_DEVICE);
3886 dma_unmap_single(dev, adapter->login_rsp_buf_token, 3937 dma_unmap_single(dev, adapter->login_rsp_buf_token,
3887 adapter->login_rsp_buf_sz, DMA_BIDIRECTIONAL); 3938 adapter->login_rsp_buf_sz, DMA_FROM_DEVICE);
3888 3939
3889 /* If the number of queues requested can't be allocated by the 3940 /* If the number of queues requested can't be allocated by the
3890 * server, the login response will return with code 1. We will need 3941 * server, the login response will return with code 1. We will need
@@ -4144,7 +4195,9 @@ static void ibmvnic_handle_crq(union ibmvnic_crq *crq,
4144 case IBMVNIC_CRQ_INIT: 4195 case IBMVNIC_CRQ_INIT:
4145 dev_info(dev, "Partner initialized\n"); 4196 dev_info(dev, "Partner initialized\n");
4146 adapter->from_passive_init = true; 4197 adapter->from_passive_init = true;
4198 adapter->failover_pending = false;
4147 complete(&adapter->init_done); 4199 complete(&adapter->init_done);
4200 ibmvnic_reset(adapter, VNIC_RESET_FAILOVER);
4148 break; 4201 break;
4149 case IBMVNIC_CRQ_INIT_COMPLETE: 4202 case IBMVNIC_CRQ_INIT_COMPLETE:
4150 dev_info(dev, "Partner initialization complete\n"); 4203 dev_info(dev, "Partner initialization complete\n");
@@ -4161,7 +4214,7 @@ static void ibmvnic_handle_crq(union ibmvnic_crq *crq,
4161 ibmvnic_reset(adapter, VNIC_RESET_MOBILITY); 4214 ibmvnic_reset(adapter, VNIC_RESET_MOBILITY);
4162 } else if (gen_crq->cmd == IBMVNIC_DEVICE_FAILOVER) { 4215 } else if (gen_crq->cmd == IBMVNIC_DEVICE_FAILOVER) {
4163 dev_info(dev, "Backing device failover detected\n"); 4216 dev_info(dev, "Backing device failover detected\n");
4164 ibmvnic_reset(adapter, VNIC_RESET_FAILOVER); 4217 adapter->failover_pending = true;
4165 } else { 4218 } else {
4166 /* The adapter lost the connection */ 4219 /* The adapter lost the connection */
4167 dev_err(dev, "Virtual Adapter failed (rc=%d)\n", 4220 dev_err(dev, "Virtual Adapter failed (rc=%d)\n",
@@ -4461,19 +4514,6 @@ static int ibmvnic_init(struct ibmvnic_adapter *adapter)
4461 u64 old_num_rx_queues, old_num_tx_queues; 4514 u64 old_num_rx_queues, old_num_tx_queues;
4462 int rc; 4515 int rc;
4463 4516
4464 if (adapter->resetting && !adapter->wait_for_reset) {
4465 rc = ibmvnic_reset_crq(adapter);
4466 if (!rc)
4467 rc = vio_enable_interrupts(adapter->vdev);
4468 } else {
4469 rc = init_crq_queue(adapter);
4470 }
4471
4472 if (rc) {
4473 dev_err(dev, "Couldn't initialize crq. rc=%d\n", rc);
4474 return rc;
4475 }
4476
4477 adapter->from_passive_init = false; 4517 adapter->from_passive_init = false;
4478 4518
4479 old_num_rx_queues = adapter->req_rx_queues; 4519 old_num_rx_queues = adapter->req_rx_queues;
@@ -4498,7 +4538,8 @@ static int ibmvnic_init(struct ibmvnic_adapter *adapter)
4498 return -1; 4538 return -1;
4499 } 4539 }
4500 4540
4501 if (adapter->resetting && !adapter->wait_for_reset) { 4541 if (adapter->resetting && !adapter->wait_for_reset &&
4542 adapter->reset_reason != VNIC_RESET_MOBILITY) {
4502 if (adapter->req_rx_queues != old_num_rx_queues || 4543 if (adapter->req_rx_queues != old_num_rx_queues ||
4503 adapter->req_tx_queues != old_num_tx_queues) { 4544 adapter->req_tx_queues != old_num_tx_queues) {
4504 release_sub_crqs(adapter, 0); 4545 release_sub_crqs(adapter, 0);
@@ -4586,6 +4627,13 @@ static int ibmvnic_probe(struct vio_dev *dev, const struct vio_device_id *id)
4586 adapter->mac_change_pending = false; 4627 adapter->mac_change_pending = false;
4587 4628
4588 do { 4629 do {
4630 rc = init_crq_queue(adapter);
4631 if (rc) {
4632 dev_err(&dev->dev, "Couldn't initialize crq. rc=%d\n",
4633 rc);
4634 goto ibmvnic_init_fail;
4635 }
4636
4589 rc = ibmvnic_init(adapter); 4637 rc = ibmvnic_init(adapter);
4590 if (rc && rc != EAGAIN) 4638 if (rc && rc != EAGAIN)
4591 goto ibmvnic_init_fail; 4639 goto ibmvnic_init_fail;
diff --git a/drivers/net/ethernet/ibm/ibmvnic.h b/drivers/net/ethernet/ibm/ibmvnic.h
index 89efe700eafe..99c0b58c2c39 100644
--- a/drivers/net/ethernet/ibm/ibmvnic.h
+++ b/drivers/net/ethernet/ibm/ibmvnic.h
@@ -1108,6 +1108,7 @@ struct ibmvnic_adapter {
1108 bool napi_enabled, from_passive_init; 1108 bool napi_enabled, from_passive_init;
1109 1109
1110 bool mac_change_pending; 1110 bool mac_change_pending;
1111 bool failover_pending;
1111 1112
1112 struct ibmvnic_tunables desired; 1113 struct ibmvnic_tunables desired;
1113 struct ibmvnic_tunables fallback; 1114 struct ibmvnic_tunables fallback;
diff --git a/drivers/net/ethernet/intel/ice/ice_common.c b/drivers/net/ethernet/intel/ice/ice_common.c
index 385f5d425d19..21977ec984c4 100644
--- a/drivers/net/ethernet/intel/ice/ice_common.c
+++ b/drivers/net/ethernet/intel/ice/ice_common.c
@@ -468,8 +468,10 @@ enum ice_status ice_init_hw(struct ice_hw *hw)
468 mac_buf_len = sizeof(struct ice_aqc_manage_mac_read_resp); 468 mac_buf_len = sizeof(struct ice_aqc_manage_mac_read_resp);
469 mac_buf = devm_kzalloc(ice_hw_to_dev(hw), mac_buf_len, GFP_KERNEL); 469 mac_buf = devm_kzalloc(ice_hw_to_dev(hw), mac_buf_len, GFP_KERNEL);
470 470
471 if (!mac_buf) 471 if (!mac_buf) {
472 status = ICE_ERR_NO_MEMORY;
472 goto err_unroll_fltr_mgmt_struct; 473 goto err_unroll_fltr_mgmt_struct;
474 }
473 475
474 status = ice_aq_manage_mac_read(hw, mac_buf, mac_buf_len, NULL); 476 status = ice_aq_manage_mac_read(hw, mac_buf, mac_buf_len, NULL);
475 devm_kfree(ice_hw_to_dev(hw), mac_buf); 477 devm_kfree(ice_hw_to_dev(hw), mac_buf);
diff --git a/drivers/net/ethernet/intel/ice/ice_ethtool.c b/drivers/net/ethernet/intel/ice/ice_ethtool.c
index 186764a5c263..1db304c01d10 100644
--- a/drivers/net/ethernet/intel/ice/ice_ethtool.c
+++ b/drivers/net/ethernet/intel/ice/ice_ethtool.c
@@ -156,7 +156,7 @@ ice_get_drvinfo(struct net_device *netdev, struct ethtool_drvinfo *drvinfo)
156 156
157static int ice_get_regs_len(struct net_device __always_unused *netdev) 157static int ice_get_regs_len(struct net_device __always_unused *netdev)
158{ 158{
159 return ARRAY_SIZE(ice_regs_dump_list); 159 return sizeof(ice_regs_dump_list);
160} 160}
161 161
162static void 162static void
@@ -170,7 +170,7 @@ ice_get_regs(struct net_device *netdev, struct ethtool_regs *regs, void *p)
170 170
171 regs->version = 1; 171 regs->version = 1;
172 172
173 for (i = 0; i < ARRAY_SIZE(ice_regs_dump_list) / sizeof(u32); ++i) 173 for (i = 0; i < ARRAY_SIZE(ice_regs_dump_list); ++i)
174 regs_buf[i] = rd32(hw, ice_regs_dump_list[i]); 174 regs_buf[i] = rd32(hw, ice_regs_dump_list[i]);
175} 175}
176 176
diff --git a/drivers/net/ethernet/marvell/mvpp2.c b/drivers/net/ethernet/marvell/mvpp2.c
index 7fc1bbf51c44..54a038943c06 100644
--- a/drivers/net/ethernet/marvell/mvpp2.c
+++ b/drivers/net/ethernet/marvell/mvpp2.c
@@ -1604,7 +1604,7 @@ static int mvpp2_prs_init_from_hw(struct mvpp2 *priv,
1604{ 1604{
1605 int i; 1605 int i;
1606 1606
1607 if (pe->index > MVPP2_PRS_TCAM_SRAM_SIZE - 1) 1607 if (tid > MVPP2_PRS_TCAM_SRAM_SIZE - 1)
1608 return -EINVAL; 1608 return -EINVAL;
1609 1609
1610 memset(pe, 0, sizeof(*pe)); 1610 memset(pe, 0, sizeof(*pe));
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
index 53fffd09d133..ca38a30fbe91 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
@@ -3805,18 +3805,6 @@ static const struct mlxsw_config_profile mlxsw_sp_config_profile = {
3805 }, 3805 },
3806}; 3806};
3807 3807
3808static u64 mlxsw_sp_resource_kvd_linear_occ_get(struct devlink *devlink)
3809{
3810 struct mlxsw_core *mlxsw_core = devlink_priv(devlink);
3811 struct mlxsw_sp *mlxsw_sp = mlxsw_core_driver_priv(mlxsw_core);
3812
3813 return mlxsw_sp_kvdl_occ_get(mlxsw_sp);
3814}
3815
3816static const struct devlink_resource_ops mlxsw_sp_resource_kvd_linear_ops = {
3817 .occ_get = mlxsw_sp_resource_kvd_linear_occ_get,
3818};
3819
3820static void 3808static void
3821mlxsw_sp_resource_size_params_prepare(struct mlxsw_core *mlxsw_core, 3809mlxsw_sp_resource_size_params_prepare(struct mlxsw_core *mlxsw_core,
3822 struct devlink_resource_size_params *kvd_size_params, 3810 struct devlink_resource_size_params *kvd_size_params,
@@ -3877,8 +3865,7 @@ static int mlxsw_sp_resources_register(struct mlxsw_core *mlxsw_core)
3877 err = devlink_resource_register(devlink, MLXSW_SP_RESOURCE_NAME_KVD, 3865 err = devlink_resource_register(devlink, MLXSW_SP_RESOURCE_NAME_KVD,
3878 kvd_size, MLXSW_SP_RESOURCE_KVD, 3866 kvd_size, MLXSW_SP_RESOURCE_KVD,
3879 DEVLINK_RESOURCE_ID_PARENT_TOP, 3867 DEVLINK_RESOURCE_ID_PARENT_TOP,
3880 &kvd_size_params, 3868 &kvd_size_params);
3881 NULL);
3882 if (err) 3869 if (err)
3883 return err; 3870 return err;
3884 3871
@@ -3887,8 +3874,7 @@ static int mlxsw_sp_resources_register(struct mlxsw_core *mlxsw_core)
3887 linear_size, 3874 linear_size,
3888 MLXSW_SP_RESOURCE_KVD_LINEAR, 3875 MLXSW_SP_RESOURCE_KVD_LINEAR,
3889 MLXSW_SP_RESOURCE_KVD, 3876 MLXSW_SP_RESOURCE_KVD,
3890 &linear_size_params, 3877 &linear_size_params);
3891 &mlxsw_sp_resource_kvd_linear_ops);
3892 if (err) 3878 if (err)
3893 return err; 3879 return err;
3894 3880
@@ -3905,8 +3891,7 @@ static int mlxsw_sp_resources_register(struct mlxsw_core *mlxsw_core)
3905 double_size, 3891 double_size,
3906 MLXSW_SP_RESOURCE_KVD_HASH_DOUBLE, 3892 MLXSW_SP_RESOURCE_KVD_HASH_DOUBLE,
3907 MLXSW_SP_RESOURCE_KVD, 3893 MLXSW_SP_RESOURCE_KVD,
3908 &hash_double_size_params, 3894 &hash_double_size_params);
3909 NULL);
3910 if (err) 3895 if (err)
3911 return err; 3896 return err;
3912 3897
@@ -3915,8 +3900,7 @@ static int mlxsw_sp_resources_register(struct mlxsw_core *mlxsw_core)
3915 single_size, 3900 single_size,
3916 MLXSW_SP_RESOURCE_KVD_HASH_SINGLE, 3901 MLXSW_SP_RESOURCE_KVD_HASH_SINGLE,
3917 MLXSW_SP_RESOURCE_KVD, 3902 MLXSW_SP_RESOURCE_KVD,
3918 &hash_single_size_params, 3903 &hash_single_size_params);
3919 NULL);
3920 if (err) 3904 if (err)
3921 return err; 3905 return err;
3922 3906
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.h b/drivers/net/ethernet/mellanox/mlxsw/spectrum.h
index 82820ba43728..804d4d2c8031 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.h
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.h
@@ -442,7 +442,6 @@ void mlxsw_sp_kvdl_free(struct mlxsw_sp *mlxsw_sp, int entry_index);
442int mlxsw_sp_kvdl_alloc_size_query(struct mlxsw_sp *mlxsw_sp, 442int mlxsw_sp_kvdl_alloc_size_query(struct mlxsw_sp *mlxsw_sp,
443 unsigned int entry_count, 443 unsigned int entry_count,
444 unsigned int *p_alloc_size); 444 unsigned int *p_alloc_size);
445u64 mlxsw_sp_kvdl_occ_get(const struct mlxsw_sp *mlxsw_sp);
446int mlxsw_sp_kvdl_resources_register(struct mlxsw_core *mlxsw_core); 445int mlxsw_sp_kvdl_resources_register(struct mlxsw_core *mlxsw_core);
447 446
448struct mlxsw_sp_acl_rule_info { 447struct mlxsw_sp_acl_rule_info {
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_kvdl.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_kvdl.c
index 8796db44dcc3..fe4327f547d2 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_kvdl.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_kvdl.c
@@ -315,8 +315,9 @@ static u64 mlxsw_sp_kvdl_part_occ(struct mlxsw_sp_kvdl_part *part)
315 return occ; 315 return occ;
316} 316}
317 317
318u64 mlxsw_sp_kvdl_occ_get(const struct mlxsw_sp *mlxsw_sp) 318static u64 mlxsw_sp_kvdl_occ_get(void *priv)
319{ 319{
320 const struct mlxsw_sp *mlxsw_sp = priv;
320 u64 occ = 0; 321 u64 occ = 0;
321 int i; 322 int i;
322 323
@@ -326,48 +327,33 @@ u64 mlxsw_sp_kvdl_occ_get(const struct mlxsw_sp *mlxsw_sp)
326 return occ; 327 return occ;
327} 328}
328 329
329static u64 mlxsw_sp_kvdl_single_occ_get(struct devlink *devlink) 330static u64 mlxsw_sp_kvdl_single_occ_get(void *priv)
330{ 331{
331 struct mlxsw_core *mlxsw_core = devlink_priv(devlink); 332 const struct mlxsw_sp *mlxsw_sp = priv;
332 struct mlxsw_sp *mlxsw_sp = mlxsw_core_driver_priv(mlxsw_core);
333 struct mlxsw_sp_kvdl_part *part; 333 struct mlxsw_sp_kvdl_part *part;
334 334
335 part = mlxsw_sp->kvdl->parts[MLXSW_SP_KVDL_PART_ID_SINGLE]; 335 part = mlxsw_sp->kvdl->parts[MLXSW_SP_KVDL_PART_ID_SINGLE];
336 return mlxsw_sp_kvdl_part_occ(part); 336 return mlxsw_sp_kvdl_part_occ(part);
337} 337}
338 338
339static u64 mlxsw_sp_kvdl_chunks_occ_get(struct devlink *devlink) 339static u64 mlxsw_sp_kvdl_chunks_occ_get(void *priv)
340{ 340{
341 struct mlxsw_core *mlxsw_core = devlink_priv(devlink); 341 const struct mlxsw_sp *mlxsw_sp = priv;
342 struct mlxsw_sp *mlxsw_sp = mlxsw_core_driver_priv(mlxsw_core);
343 struct mlxsw_sp_kvdl_part *part; 342 struct mlxsw_sp_kvdl_part *part;
344 343
345 part = mlxsw_sp->kvdl->parts[MLXSW_SP_KVDL_PART_ID_CHUNKS]; 344 part = mlxsw_sp->kvdl->parts[MLXSW_SP_KVDL_PART_ID_CHUNKS];
346 return mlxsw_sp_kvdl_part_occ(part); 345 return mlxsw_sp_kvdl_part_occ(part);
347} 346}
348 347
349static u64 mlxsw_sp_kvdl_large_chunks_occ_get(struct devlink *devlink) 348static u64 mlxsw_sp_kvdl_large_chunks_occ_get(void *priv)
350{ 349{
351 struct mlxsw_core *mlxsw_core = devlink_priv(devlink); 350 const struct mlxsw_sp *mlxsw_sp = priv;
352 struct mlxsw_sp *mlxsw_sp = mlxsw_core_driver_priv(mlxsw_core);
353 struct mlxsw_sp_kvdl_part *part; 351 struct mlxsw_sp_kvdl_part *part;
354 352
355 part = mlxsw_sp->kvdl->parts[MLXSW_SP_KVDL_PART_ID_LARGE_CHUNKS]; 353 part = mlxsw_sp->kvdl->parts[MLXSW_SP_KVDL_PART_ID_LARGE_CHUNKS];
356 return mlxsw_sp_kvdl_part_occ(part); 354 return mlxsw_sp_kvdl_part_occ(part);
357} 355}
358 356
359static const struct devlink_resource_ops mlxsw_sp_kvdl_single_ops = {
360 .occ_get = mlxsw_sp_kvdl_single_occ_get,
361};
362
363static const struct devlink_resource_ops mlxsw_sp_kvdl_chunks_ops = {
364 .occ_get = mlxsw_sp_kvdl_chunks_occ_get,
365};
366
367static const struct devlink_resource_ops mlxsw_sp_kvdl_chunks_large_ops = {
368 .occ_get = mlxsw_sp_kvdl_large_chunks_occ_get,
369};
370
371int mlxsw_sp_kvdl_resources_register(struct mlxsw_core *mlxsw_core) 357int mlxsw_sp_kvdl_resources_register(struct mlxsw_core *mlxsw_core)
372{ 358{
373 struct devlink *devlink = priv_to_devlink(mlxsw_core); 359 struct devlink *devlink = priv_to_devlink(mlxsw_core);
@@ -386,8 +372,7 @@ int mlxsw_sp_kvdl_resources_register(struct mlxsw_core *mlxsw_core)
386 MLXSW_SP_KVDL_SINGLE_SIZE, 372 MLXSW_SP_KVDL_SINGLE_SIZE,
387 MLXSW_SP_RESOURCE_KVD_LINEAR_SINGLE, 373 MLXSW_SP_RESOURCE_KVD_LINEAR_SINGLE,
388 MLXSW_SP_RESOURCE_KVD_LINEAR, 374 MLXSW_SP_RESOURCE_KVD_LINEAR,
389 &size_params, 375 &size_params);
390 &mlxsw_sp_kvdl_single_ops);
391 if (err) 376 if (err)
392 return err; 377 return err;
393 378
@@ -398,8 +383,7 @@ int mlxsw_sp_kvdl_resources_register(struct mlxsw_core *mlxsw_core)
398 MLXSW_SP_KVDL_CHUNKS_SIZE, 383 MLXSW_SP_KVDL_CHUNKS_SIZE,
399 MLXSW_SP_RESOURCE_KVD_LINEAR_CHUNKS, 384 MLXSW_SP_RESOURCE_KVD_LINEAR_CHUNKS,
400 MLXSW_SP_RESOURCE_KVD_LINEAR, 385 MLXSW_SP_RESOURCE_KVD_LINEAR,
401 &size_params, 386 &size_params);
402 &mlxsw_sp_kvdl_chunks_ops);
403 if (err) 387 if (err)
404 return err; 388 return err;
405 389
@@ -410,13 +394,13 @@ int mlxsw_sp_kvdl_resources_register(struct mlxsw_core *mlxsw_core)
410 MLXSW_SP_KVDL_LARGE_CHUNKS_SIZE, 394 MLXSW_SP_KVDL_LARGE_CHUNKS_SIZE,
411 MLXSW_SP_RESOURCE_KVD_LINEAR_LARGE_CHUNKS, 395 MLXSW_SP_RESOURCE_KVD_LINEAR_LARGE_CHUNKS,
412 MLXSW_SP_RESOURCE_KVD_LINEAR, 396 MLXSW_SP_RESOURCE_KVD_LINEAR,
413 &size_params, 397 &size_params);
414 &mlxsw_sp_kvdl_chunks_large_ops);
415 return err; 398 return err;
416} 399}
417 400
418int mlxsw_sp_kvdl_init(struct mlxsw_sp *mlxsw_sp) 401int mlxsw_sp_kvdl_init(struct mlxsw_sp *mlxsw_sp)
419{ 402{
403 struct devlink *devlink = priv_to_devlink(mlxsw_sp->core);
420 struct mlxsw_sp_kvdl *kvdl; 404 struct mlxsw_sp_kvdl *kvdl;
421 int err; 405 int err;
422 406
@@ -429,6 +413,23 @@ int mlxsw_sp_kvdl_init(struct mlxsw_sp *mlxsw_sp)
429 if (err) 413 if (err)
430 goto err_kvdl_parts_init; 414 goto err_kvdl_parts_init;
431 415
416 devlink_resource_occ_get_register(devlink,
417 MLXSW_SP_RESOURCE_KVD_LINEAR,
418 mlxsw_sp_kvdl_occ_get,
419 mlxsw_sp);
420 devlink_resource_occ_get_register(devlink,
421 MLXSW_SP_RESOURCE_KVD_LINEAR_SINGLE,
422 mlxsw_sp_kvdl_single_occ_get,
423 mlxsw_sp);
424 devlink_resource_occ_get_register(devlink,
425 MLXSW_SP_RESOURCE_KVD_LINEAR_CHUNKS,
426 mlxsw_sp_kvdl_chunks_occ_get,
427 mlxsw_sp);
428 devlink_resource_occ_get_register(devlink,
429 MLXSW_SP_RESOURCE_KVD_LINEAR_LARGE_CHUNKS,
430 mlxsw_sp_kvdl_large_chunks_occ_get,
431 mlxsw_sp);
432
432 return 0; 433 return 0;
433 434
434err_kvdl_parts_init: 435err_kvdl_parts_init:
@@ -438,6 +439,16 @@ err_kvdl_parts_init:
438 439
439void mlxsw_sp_kvdl_fini(struct mlxsw_sp *mlxsw_sp) 440void mlxsw_sp_kvdl_fini(struct mlxsw_sp *mlxsw_sp)
440{ 441{
442 struct devlink *devlink = priv_to_devlink(mlxsw_sp->core);
443
444 devlink_resource_occ_get_unregister(devlink,
445 MLXSW_SP_RESOURCE_KVD_LINEAR_LARGE_CHUNKS);
446 devlink_resource_occ_get_unregister(devlink,
447 MLXSW_SP_RESOURCE_KVD_LINEAR_CHUNKS);
448 devlink_resource_occ_get_unregister(devlink,
449 MLXSW_SP_RESOURCE_KVD_LINEAR_SINGLE);
450 devlink_resource_occ_get_unregister(devlink,
451 MLXSW_SP_RESOURCE_KVD_LINEAR);
441 mlxsw_sp_kvdl_parts_fini(mlxsw_sp); 452 mlxsw_sp_kvdl_parts_fini(mlxsw_sp);
442 kfree(mlxsw_sp->kvdl); 453 kfree(mlxsw_sp->kvdl);
443} 454}
diff --git a/drivers/net/hyperv/netvsc.c b/drivers/net/hyperv/netvsc.c
index c9910c33e671..04f611e6f678 100644
--- a/drivers/net/hyperv/netvsc.c
+++ b/drivers/net/hyperv/netvsc.c
@@ -109,11 +109,11 @@ static void free_netvsc_device_rcu(struct netvsc_device *nvdev)
109 call_rcu(&nvdev->rcu, free_netvsc_device); 109 call_rcu(&nvdev->rcu, free_netvsc_device);
110} 110}
111 111
112static void netvsc_revoke_buf(struct hv_device *device, 112static void netvsc_revoke_recv_buf(struct hv_device *device,
113 struct netvsc_device *net_device) 113 struct netvsc_device *net_device,
114 struct net_device *ndev)
114{ 115{
115 struct nvsp_message *revoke_packet; 116 struct nvsp_message *revoke_packet;
116 struct net_device *ndev = hv_get_drvdata(device);
117 int ret; 117 int ret;
118 118
119 /* 119 /*
@@ -157,6 +157,14 @@ static void netvsc_revoke_buf(struct hv_device *device,
157 } 157 }
158 net_device->recv_section_cnt = 0; 158 net_device->recv_section_cnt = 0;
159 } 159 }
160}
161
162static void netvsc_revoke_send_buf(struct hv_device *device,
163 struct netvsc_device *net_device,
164 struct net_device *ndev)
165{
166 struct nvsp_message *revoke_packet;
167 int ret;
160 168
161 /* Deal with the send buffer we may have setup. 169 /* Deal with the send buffer we may have setup.
162 * If we got a send section size, it means we received a 170 * If we got a send section size, it means we received a
@@ -202,10 +210,10 @@ static void netvsc_revoke_buf(struct hv_device *device,
202 } 210 }
203} 211}
204 212
205static void netvsc_teardown_gpadl(struct hv_device *device, 213static void netvsc_teardown_recv_gpadl(struct hv_device *device,
206 struct netvsc_device *net_device) 214 struct netvsc_device *net_device,
215 struct net_device *ndev)
207{ 216{
208 struct net_device *ndev = hv_get_drvdata(device);
209 int ret; 217 int ret;
210 218
211 if (net_device->recv_buf_gpadl_handle) { 219 if (net_device->recv_buf_gpadl_handle) {
@@ -222,6 +230,13 @@ static void netvsc_teardown_gpadl(struct hv_device *device,
222 } 230 }
223 net_device->recv_buf_gpadl_handle = 0; 231 net_device->recv_buf_gpadl_handle = 0;
224 } 232 }
233}
234
235static void netvsc_teardown_send_gpadl(struct hv_device *device,
236 struct netvsc_device *net_device,
237 struct net_device *ndev)
238{
239 int ret;
225 240
226 if (net_device->send_buf_gpadl_handle) { 241 if (net_device->send_buf_gpadl_handle) {
227 ret = vmbus_teardown_gpadl(device->channel, 242 ret = vmbus_teardown_gpadl(device->channel,
@@ -437,8 +452,10 @@ static int netvsc_init_buf(struct hv_device *device,
437 goto exit; 452 goto exit;
438 453
439cleanup: 454cleanup:
440 netvsc_revoke_buf(device, net_device); 455 netvsc_revoke_recv_buf(device, net_device, ndev);
441 netvsc_teardown_gpadl(device, net_device); 456 netvsc_revoke_send_buf(device, net_device, ndev);
457 netvsc_teardown_recv_gpadl(device, net_device, ndev);
458 netvsc_teardown_send_gpadl(device, net_device, ndev);
442 459
443exit: 460exit:
444 return ret; 461 return ret;
@@ -457,7 +474,6 @@ static int negotiate_nvsp_ver(struct hv_device *device,
457 init_packet->hdr.msg_type = NVSP_MSG_TYPE_INIT; 474 init_packet->hdr.msg_type = NVSP_MSG_TYPE_INIT;
458 init_packet->msg.init_msg.init.min_protocol_ver = nvsp_ver; 475 init_packet->msg.init_msg.init.min_protocol_ver = nvsp_ver;
459 init_packet->msg.init_msg.init.max_protocol_ver = nvsp_ver; 476 init_packet->msg.init_msg.init.max_protocol_ver = nvsp_ver;
460
461 trace_nvsp_send(ndev, init_packet); 477 trace_nvsp_send(ndev, init_packet);
462 478
463 /* Send the init request */ 479 /* Send the init request */
@@ -575,7 +591,17 @@ void netvsc_device_remove(struct hv_device *device)
575 = rtnl_dereference(net_device_ctx->nvdev); 591 = rtnl_dereference(net_device_ctx->nvdev);
576 int i; 592 int i;
577 593
578 netvsc_revoke_buf(device, net_device); 594 /*
595 * Revoke receive buffer. If host is pre-Win2016 then tear down
596 * receive buffer GPADL. Do the same for send buffer.
597 */
598 netvsc_revoke_recv_buf(device, net_device, ndev);
599 if (vmbus_proto_version < VERSION_WIN10)
600 netvsc_teardown_recv_gpadl(device, net_device, ndev);
601
602 netvsc_revoke_send_buf(device, net_device, ndev);
603 if (vmbus_proto_version < VERSION_WIN10)
604 netvsc_teardown_send_gpadl(device, net_device, ndev);
579 605
580 RCU_INIT_POINTER(net_device_ctx->nvdev, NULL); 606 RCU_INIT_POINTER(net_device_ctx->nvdev, NULL);
581 607
@@ -589,15 +615,17 @@ void netvsc_device_remove(struct hv_device *device)
589 */ 615 */
590 netdev_dbg(ndev, "net device safe to remove\n"); 616 netdev_dbg(ndev, "net device safe to remove\n");
591 617
592 /* older versions require that buffer be revoked before close */
593 if (net_device->nvsp_version < NVSP_PROTOCOL_VERSION_4)
594 netvsc_teardown_gpadl(device, net_device);
595
596 /* Now, we can close the channel safely */ 618 /* Now, we can close the channel safely */
597 vmbus_close(device->channel); 619 vmbus_close(device->channel);
598 620
599 if (net_device->nvsp_version >= NVSP_PROTOCOL_VERSION_4) 621 /*
600 netvsc_teardown_gpadl(device, net_device); 622 * If host is Win2016 or higher then we do the GPADL tear down
623 * here after VMBus is closed.
624 */
625 if (vmbus_proto_version >= VERSION_WIN10) {
626 netvsc_teardown_recv_gpadl(device, net_device, ndev);
627 netvsc_teardown_send_gpadl(device, net_device, ndev);
628 }
601 629
602 /* Release all resources */ 630 /* Release all resources */
603 free_netvsc_device_rcu(net_device); 631 free_netvsc_device_rcu(net_device);
diff --git a/drivers/net/netdevsim/devlink.c b/drivers/net/netdevsim/devlink.c
index 1dba47936456..bef7db5d129a 100644
--- a/drivers/net/netdevsim/devlink.c
+++ b/drivers/net/netdevsim/devlink.c
@@ -30,52 +30,36 @@ static struct net *nsim_devlink_net(struct devlink *devlink)
30 30
31/* IPv4 31/* IPv4
32 */ 32 */
33static u64 nsim_ipv4_fib_resource_occ_get(struct devlink *devlink) 33static u64 nsim_ipv4_fib_resource_occ_get(void *priv)
34{ 34{
35 struct net *net = nsim_devlink_net(devlink); 35 struct net *net = priv;
36 36
37 return nsim_fib_get_val(net, NSIM_RESOURCE_IPV4_FIB, false); 37 return nsim_fib_get_val(net, NSIM_RESOURCE_IPV4_FIB, false);
38} 38}
39 39
40static struct devlink_resource_ops nsim_ipv4_fib_res_ops = { 40static u64 nsim_ipv4_fib_rules_res_occ_get(void *priv)
41 .occ_get = nsim_ipv4_fib_resource_occ_get,
42};
43
44static u64 nsim_ipv4_fib_rules_res_occ_get(struct devlink *devlink)
45{ 41{
46 struct net *net = nsim_devlink_net(devlink); 42 struct net *net = priv;
47 43
48 return nsim_fib_get_val(net, NSIM_RESOURCE_IPV4_FIB_RULES, false); 44 return nsim_fib_get_val(net, NSIM_RESOURCE_IPV4_FIB_RULES, false);
49} 45}
50 46
51static struct devlink_resource_ops nsim_ipv4_fib_rules_res_ops = {
52 .occ_get = nsim_ipv4_fib_rules_res_occ_get,
53};
54
55/* IPv6 47/* IPv6
56 */ 48 */
57static u64 nsim_ipv6_fib_resource_occ_get(struct devlink *devlink) 49static u64 nsim_ipv6_fib_resource_occ_get(void *priv)
58{ 50{
59 struct net *net = nsim_devlink_net(devlink); 51 struct net *net = priv;
60 52
61 return nsim_fib_get_val(net, NSIM_RESOURCE_IPV6_FIB, false); 53 return nsim_fib_get_val(net, NSIM_RESOURCE_IPV6_FIB, false);
62} 54}
63 55
64static struct devlink_resource_ops nsim_ipv6_fib_res_ops = { 56static u64 nsim_ipv6_fib_rules_res_occ_get(void *priv)
65 .occ_get = nsim_ipv6_fib_resource_occ_get,
66};
67
68static u64 nsim_ipv6_fib_rules_res_occ_get(struct devlink *devlink)
69{ 57{
70 struct net *net = nsim_devlink_net(devlink); 58 struct net *net = priv;
71 59
72 return nsim_fib_get_val(net, NSIM_RESOURCE_IPV6_FIB_RULES, false); 60 return nsim_fib_get_val(net, NSIM_RESOURCE_IPV6_FIB_RULES, false);
73} 61}
74 62
75static struct devlink_resource_ops nsim_ipv6_fib_rules_res_ops = {
76 .occ_get = nsim_ipv6_fib_rules_res_occ_get,
77};
78
79static int devlink_resources_register(struct devlink *devlink) 63static int devlink_resources_register(struct devlink *devlink)
80{ 64{
81 struct devlink_resource_size_params params = { 65 struct devlink_resource_size_params params = {
@@ -91,7 +75,7 @@ static int devlink_resources_register(struct devlink *devlink)
91 err = devlink_resource_register(devlink, "IPv4", (u64)-1, 75 err = devlink_resource_register(devlink, "IPv4", (u64)-1,
92 NSIM_RESOURCE_IPV4, 76 NSIM_RESOURCE_IPV4,
93 DEVLINK_RESOURCE_ID_PARENT_TOP, 77 DEVLINK_RESOURCE_ID_PARENT_TOP,
94 &params, NULL); 78 &params);
95 if (err) { 79 if (err) {
96 pr_err("Failed to register IPv4 top resource\n"); 80 pr_err("Failed to register IPv4 top resource\n");
97 goto out; 81 goto out;
@@ -100,8 +84,7 @@ static int devlink_resources_register(struct devlink *devlink)
100 n = nsim_fib_get_val(net, NSIM_RESOURCE_IPV4_FIB, true); 84 n = nsim_fib_get_val(net, NSIM_RESOURCE_IPV4_FIB, true);
101 err = devlink_resource_register(devlink, "fib", n, 85 err = devlink_resource_register(devlink, "fib", n,
102 NSIM_RESOURCE_IPV4_FIB, 86 NSIM_RESOURCE_IPV4_FIB,
103 NSIM_RESOURCE_IPV4, 87 NSIM_RESOURCE_IPV4, &params);
104 &params, &nsim_ipv4_fib_res_ops);
105 if (err) { 88 if (err) {
106 pr_err("Failed to register IPv4 FIB resource\n"); 89 pr_err("Failed to register IPv4 FIB resource\n");
107 return err; 90 return err;
@@ -110,8 +93,7 @@ static int devlink_resources_register(struct devlink *devlink)
110 n = nsim_fib_get_val(net, NSIM_RESOURCE_IPV4_FIB_RULES, true); 93 n = nsim_fib_get_val(net, NSIM_RESOURCE_IPV4_FIB_RULES, true);
111 err = devlink_resource_register(devlink, "fib-rules", n, 94 err = devlink_resource_register(devlink, "fib-rules", n,
112 NSIM_RESOURCE_IPV4_FIB_RULES, 95 NSIM_RESOURCE_IPV4_FIB_RULES,
113 NSIM_RESOURCE_IPV4, 96 NSIM_RESOURCE_IPV4, &params);
114 &params, &nsim_ipv4_fib_rules_res_ops);
115 if (err) { 97 if (err) {
116 pr_err("Failed to register IPv4 FIB rules resource\n"); 98 pr_err("Failed to register IPv4 FIB rules resource\n");
117 return err; 99 return err;
@@ -121,7 +103,7 @@ static int devlink_resources_register(struct devlink *devlink)
121 err = devlink_resource_register(devlink, "IPv6", (u64)-1, 103 err = devlink_resource_register(devlink, "IPv6", (u64)-1,
122 NSIM_RESOURCE_IPV6, 104 NSIM_RESOURCE_IPV6,
123 DEVLINK_RESOURCE_ID_PARENT_TOP, 105 DEVLINK_RESOURCE_ID_PARENT_TOP,
124 &params, NULL); 106 &params);
125 if (err) { 107 if (err) {
126 pr_err("Failed to register IPv6 top resource\n"); 108 pr_err("Failed to register IPv6 top resource\n");
127 goto out; 109 goto out;
@@ -130,8 +112,7 @@ static int devlink_resources_register(struct devlink *devlink)
130 n = nsim_fib_get_val(net, NSIM_RESOURCE_IPV6_FIB, true); 112 n = nsim_fib_get_val(net, NSIM_RESOURCE_IPV6_FIB, true);
131 err = devlink_resource_register(devlink, "fib", n, 113 err = devlink_resource_register(devlink, "fib", n,
132 NSIM_RESOURCE_IPV6_FIB, 114 NSIM_RESOURCE_IPV6_FIB,
133 NSIM_RESOURCE_IPV6, 115 NSIM_RESOURCE_IPV6, &params);
134 &params, &nsim_ipv6_fib_res_ops);
135 if (err) { 116 if (err) {
136 pr_err("Failed to register IPv6 FIB resource\n"); 117 pr_err("Failed to register IPv6 FIB resource\n");
137 return err; 118 return err;
@@ -140,12 +121,28 @@ static int devlink_resources_register(struct devlink *devlink)
140 n = nsim_fib_get_val(net, NSIM_RESOURCE_IPV6_FIB_RULES, true); 121 n = nsim_fib_get_val(net, NSIM_RESOURCE_IPV6_FIB_RULES, true);
141 err = devlink_resource_register(devlink, "fib-rules", n, 122 err = devlink_resource_register(devlink, "fib-rules", n,
142 NSIM_RESOURCE_IPV6_FIB_RULES, 123 NSIM_RESOURCE_IPV6_FIB_RULES,
143 NSIM_RESOURCE_IPV6, 124 NSIM_RESOURCE_IPV6, &params);
144 &params, &nsim_ipv6_fib_rules_res_ops);
145 if (err) { 125 if (err) {
146 pr_err("Failed to register IPv6 FIB rules resource\n"); 126 pr_err("Failed to register IPv6 FIB rules resource\n");
147 return err; 127 return err;
148 } 128 }
129
130 devlink_resource_occ_get_register(devlink,
131 NSIM_RESOURCE_IPV4_FIB,
132 nsim_ipv4_fib_resource_occ_get,
133 net);
134 devlink_resource_occ_get_register(devlink,
135 NSIM_RESOURCE_IPV4_FIB_RULES,
136 nsim_ipv4_fib_rules_res_occ_get,
137 net);
138 devlink_resource_occ_get_register(devlink,
139 NSIM_RESOURCE_IPV6_FIB,
140 nsim_ipv6_fib_resource_occ_get,
141 net);
142 devlink_resource_occ_get_register(devlink,
143 NSIM_RESOURCE_IPV6_FIB_RULES,
144 nsim_ipv6_fib_rules_res_occ_get,
145 net);
149out: 146out:
150 return err; 147 return err;
151} 148}
diff --git a/drivers/net/phy/dp83640.c b/drivers/net/phy/dp83640.c
index 654f42d00092..a6c87793d899 100644
--- a/drivers/net/phy/dp83640.c
+++ b/drivers/net/phy/dp83640.c
@@ -1207,6 +1207,23 @@ static void dp83640_remove(struct phy_device *phydev)
1207 kfree(dp83640); 1207 kfree(dp83640);
1208} 1208}
1209 1209
1210static int dp83640_soft_reset(struct phy_device *phydev)
1211{
1212 int ret;
1213
1214 ret = genphy_soft_reset(phydev);
1215 if (ret < 0)
1216 return ret;
1217
1218 /* From DP83640 datasheet: "Software driver code must wait 3 us
1219 * following a software reset before allowing further serial MII
1220 * operations with the DP83640."
1221 */
1222 udelay(10); /* Taking udelay inaccuracy into account */
1223
1224 return 0;
1225}
1226
1210static int dp83640_config_init(struct phy_device *phydev) 1227static int dp83640_config_init(struct phy_device *phydev)
1211{ 1228{
1212 struct dp83640_private *dp83640 = phydev->priv; 1229 struct dp83640_private *dp83640 = phydev->priv;
@@ -1501,6 +1518,7 @@ static struct phy_driver dp83640_driver = {
1501 .flags = PHY_HAS_INTERRUPT, 1518 .flags = PHY_HAS_INTERRUPT,
1502 .probe = dp83640_probe, 1519 .probe = dp83640_probe,
1503 .remove = dp83640_remove, 1520 .remove = dp83640_remove,
1521 .soft_reset = dp83640_soft_reset,
1504 .config_init = dp83640_config_init, 1522 .config_init = dp83640_config_init,
1505 .ack_interrupt = dp83640_ack_interrupt, 1523 .ack_interrupt = dp83640_ack_interrupt,
1506 .config_intr = dp83640_config_intr, 1524 .config_intr = dp83640_config_intr,
diff --git a/drivers/net/phy/marvell.c b/drivers/net/phy/marvell.c
index a75c511950c3..c22e8e383247 100644
--- a/drivers/net/phy/marvell.c
+++ b/drivers/net/phy/marvell.c
@@ -828,6 +828,22 @@ static int m88e1121_config_init(struct phy_device *phydev)
828 return marvell_config_init(phydev); 828 return marvell_config_init(phydev);
829} 829}
830 830
831static int m88e1318_config_init(struct phy_device *phydev)
832{
833 if (phy_interrupt_is_valid(phydev)) {
834 int err = phy_modify_paged(
835 phydev, MII_MARVELL_LED_PAGE,
836 MII_88E1318S_PHY_LED_TCR,
837 MII_88E1318S_PHY_LED_TCR_FORCE_INT,
838 MII_88E1318S_PHY_LED_TCR_INTn_ENABLE |
839 MII_88E1318S_PHY_LED_TCR_INT_ACTIVE_LOW);
840 if (err < 0)
841 return err;
842 }
843
844 return m88e1121_config_init(phydev);
845}
846
831static int m88e1510_config_init(struct phy_device *phydev) 847static int m88e1510_config_init(struct phy_device *phydev)
832{ 848{
833 int err; 849 int err;
@@ -870,7 +886,7 @@ static int m88e1510_config_init(struct phy_device *phydev)
870 phydev->advertising &= ~pause; 886 phydev->advertising &= ~pause;
871 } 887 }
872 888
873 return m88e1121_config_init(phydev); 889 return m88e1318_config_init(phydev);
874} 890}
875 891
876static int m88e1118_config_aneg(struct phy_device *phydev) 892static int m88e1118_config_aneg(struct phy_device *phydev)
@@ -2086,7 +2102,7 @@ static struct phy_driver marvell_drivers[] = {
2086 .features = PHY_GBIT_FEATURES, 2102 .features = PHY_GBIT_FEATURES,
2087 .flags = PHY_HAS_INTERRUPT, 2103 .flags = PHY_HAS_INTERRUPT,
2088 .probe = marvell_probe, 2104 .probe = marvell_probe,
2089 .config_init = &m88e1121_config_init, 2105 .config_init = &m88e1318_config_init,
2090 .config_aneg = &m88e1318_config_aneg, 2106 .config_aneg = &m88e1318_config_aneg,
2091 .read_status = &marvell_read_status, 2107 .read_status = &marvell_read_status,
2092 .ack_interrupt = &marvell_ack_interrupt, 2108 .ack_interrupt = &marvell_ack_interrupt,
diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c
index edc6fec9ad84..986058a57917 100644
--- a/drivers/vhost/net.c
+++ b/drivers/vhost/net.c
@@ -44,6 +44,10 @@ MODULE_PARM_DESC(experimental_zcopytx, "Enable Zero Copy TX;"
44 * Using this limit prevents one virtqueue from starving others. */ 44 * Using this limit prevents one virtqueue from starving others. */
45#define VHOST_NET_WEIGHT 0x80000 45#define VHOST_NET_WEIGHT 0x80000
46 46
47/* Max number of packets transferred before requeueing the job.
48 * Using this limit prevents one virtqueue from starving rx. */
49#define VHOST_NET_PKT_WEIGHT(vq) ((vq)->num * 2)
50
47/* MAX number of TX used buffers for outstanding zerocopy */ 51/* MAX number of TX used buffers for outstanding zerocopy */
48#define VHOST_MAX_PEND 128 52#define VHOST_MAX_PEND 128
49#define VHOST_GOODCOPY_LEN 256 53#define VHOST_GOODCOPY_LEN 256
@@ -473,6 +477,7 @@ static void handle_tx(struct vhost_net *net)
473 struct socket *sock; 477 struct socket *sock;
474 struct vhost_net_ubuf_ref *uninitialized_var(ubufs); 478 struct vhost_net_ubuf_ref *uninitialized_var(ubufs);
475 bool zcopy, zcopy_used; 479 bool zcopy, zcopy_used;
480 int sent_pkts = 0;
476 481
477 mutex_lock(&vq->mutex); 482 mutex_lock(&vq->mutex);
478 sock = vq->private_data; 483 sock = vq->private_data;
@@ -580,7 +585,8 @@ static void handle_tx(struct vhost_net *net)
580 else 585 else
581 vhost_zerocopy_signal_used(net, vq); 586 vhost_zerocopy_signal_used(net, vq);
582 vhost_net_tx_packet(net); 587 vhost_net_tx_packet(net);
583 if (unlikely(total_len >= VHOST_NET_WEIGHT)) { 588 if (unlikely(total_len >= VHOST_NET_WEIGHT) ||
589 unlikely(++sent_pkts >= VHOST_NET_PKT_WEIGHT(vq))) {
584 vhost_poll_queue(&vq->poll); 590 vhost_poll_queue(&vq->poll);
585 break; 591 break;
586 } 592 }
diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h
index 95ccc1eef558..b619a190ff12 100644
--- a/include/net/bluetooth/hci_core.h
+++ b/include/net/bluetooth/hci_core.h
@@ -895,7 +895,7 @@ struct hci_conn *hci_connect_le_scan(struct hci_dev *hdev, bdaddr_t *dst,
895 u16 conn_timeout); 895 u16 conn_timeout);
896struct hci_conn *hci_connect_le(struct hci_dev *hdev, bdaddr_t *dst, 896struct hci_conn *hci_connect_le(struct hci_dev *hdev, bdaddr_t *dst,
897 u8 dst_type, u8 sec_level, u16 conn_timeout, 897 u8 dst_type, u8 sec_level, u16 conn_timeout,
898 u8 role); 898 u8 role, bdaddr_t *direct_rpa);
899struct hci_conn *hci_connect_acl(struct hci_dev *hdev, bdaddr_t *dst, 899struct hci_conn *hci_connect_acl(struct hci_dev *hdev, bdaddr_t *dst,
900 u8 sec_level, u8 auth_type); 900 u8 sec_level, u8 auth_type);
901struct hci_conn *hci_connect_sco(struct hci_dev *hdev, int type, bdaddr_t *dst, 901struct hci_conn *hci_connect_sco(struct hci_dev *hdev, int type, bdaddr_t *dst,
diff --git a/include/net/devlink.h b/include/net/devlink.h
index e21d8cadd480..2e4f71e16e95 100644
--- a/include/net/devlink.h
+++ b/include/net/devlink.h
@@ -232,14 +232,6 @@ struct devlink_dpipe_headers {
232}; 232};
233 233
234/** 234/**
235 * struct devlink_resource_ops - resource ops
236 * @occ_get: get the occupied size
237 */
238struct devlink_resource_ops {
239 u64 (*occ_get)(struct devlink *devlink);
240};
241
242/**
243 * struct devlink_resource_size_params - resource's size parameters 235 * struct devlink_resource_size_params - resource's size parameters
244 * @size_min: minimum size which can be set 236 * @size_min: minimum size which can be set
245 * @size_max: maximum size which can be set 237 * @size_max: maximum size which can be set
@@ -265,6 +257,8 @@ devlink_resource_size_params_init(struct devlink_resource_size_params *size_para
265 size_params->unit = unit; 257 size_params->unit = unit;
266} 258}
267 259
260typedef u64 devlink_resource_occ_get_t(void *priv);
261
268/** 262/**
269 * struct devlink_resource - devlink resource 263 * struct devlink_resource - devlink resource
270 * @name: name of the resource 264 * @name: name of the resource
@@ -277,7 +271,6 @@ devlink_resource_size_params_init(struct devlink_resource_size_params *size_para
277 * @size_params: size parameters 271 * @size_params: size parameters
278 * @list: parent list 272 * @list: parent list
279 * @resource_list: list of child resources 273 * @resource_list: list of child resources
280 * @resource_ops: resource ops
281 */ 274 */
282struct devlink_resource { 275struct devlink_resource {
283 const char *name; 276 const char *name;
@@ -289,7 +282,8 @@ struct devlink_resource {
289 struct devlink_resource_size_params size_params; 282 struct devlink_resource_size_params size_params;
290 struct list_head list; 283 struct list_head list;
291 struct list_head resource_list; 284 struct list_head resource_list;
292 const struct devlink_resource_ops *resource_ops; 285 devlink_resource_occ_get_t *occ_get;
286 void *occ_get_priv;
293}; 287};
294 288
295#define DEVLINK_RESOURCE_ID_PARENT_TOP 0 289#define DEVLINK_RESOURCE_ID_PARENT_TOP 0
@@ -409,8 +403,7 @@ int devlink_resource_register(struct devlink *devlink,
409 u64 resource_size, 403 u64 resource_size,
410 u64 resource_id, 404 u64 resource_id,
411 u64 parent_resource_id, 405 u64 parent_resource_id,
412 const struct devlink_resource_size_params *size_params, 406 const struct devlink_resource_size_params *size_params);
413 const struct devlink_resource_ops *resource_ops);
414void devlink_resources_unregister(struct devlink *devlink, 407void devlink_resources_unregister(struct devlink *devlink,
415 struct devlink_resource *resource); 408 struct devlink_resource *resource);
416int devlink_resource_size_get(struct devlink *devlink, 409int devlink_resource_size_get(struct devlink *devlink,
@@ -419,6 +412,12 @@ int devlink_resource_size_get(struct devlink *devlink,
419int devlink_dpipe_table_resource_set(struct devlink *devlink, 412int devlink_dpipe_table_resource_set(struct devlink *devlink,
420 const char *table_name, u64 resource_id, 413 const char *table_name, u64 resource_id,
421 u64 resource_units); 414 u64 resource_units);
415void devlink_resource_occ_get_register(struct devlink *devlink,
416 u64 resource_id,
417 devlink_resource_occ_get_t *occ_get,
418 void *occ_get_priv);
419void devlink_resource_occ_get_unregister(struct devlink *devlink,
420 u64 resource_id);
422 421
423#else 422#else
424 423
@@ -562,8 +561,7 @@ devlink_resource_register(struct devlink *devlink,
562 u64 resource_size, 561 u64 resource_size,
563 u64 resource_id, 562 u64 resource_id,
564 u64 parent_resource_id, 563 u64 parent_resource_id,
565 const struct devlink_resource_size_params *size_params, 564 const struct devlink_resource_size_params *size_params)
566 const struct devlink_resource_ops *resource_ops)
567{ 565{
568 return 0; 566 return 0;
569} 567}
@@ -589,6 +587,20 @@ devlink_dpipe_table_resource_set(struct devlink *devlink,
589 return -EOPNOTSUPP; 587 return -EOPNOTSUPP;
590} 588}
591 589
590static inline void
591devlink_resource_occ_get_register(struct devlink *devlink,
592 u64 resource_id,
593 devlink_resource_occ_get_t *occ_get,
594 void *occ_get_priv)
595{
596}
597
598static inline void
599devlink_resource_occ_get_unregister(struct devlink *devlink,
600 u64 resource_id)
601{
602}
603
592#endif 604#endif
593 605
594#endif /* _NET_DEVLINK_H_ */ 606#endif /* _NET_DEVLINK_H_ */
diff --git a/include/net/inet_timewait_sock.h b/include/net/inet_timewait_sock.h
index 899495589a7e..c7be1ca8e562 100644
--- a/include/net/inet_timewait_sock.h
+++ b/include/net/inet_timewait_sock.h
@@ -43,6 +43,7 @@ struct inet_timewait_sock {
43#define tw_family __tw_common.skc_family 43#define tw_family __tw_common.skc_family
44#define tw_state __tw_common.skc_state 44#define tw_state __tw_common.skc_state
45#define tw_reuse __tw_common.skc_reuse 45#define tw_reuse __tw_common.skc_reuse
46#define tw_reuseport __tw_common.skc_reuseport
46#define tw_ipv6only __tw_common.skc_ipv6only 47#define tw_ipv6only __tw_common.skc_ipv6only
47#define tw_bound_dev_if __tw_common.skc_bound_dev_if 48#define tw_bound_dev_if __tw_common.skc_bound_dev_if
48#define tw_node __tw_common.skc_nulls_node 49#define tw_node __tw_common.skc_nulls_node
diff --git a/include/net/nexthop.h b/include/net/nexthop.h
index 36bb794f5cd6..902ff382a6dc 100644
--- a/include/net/nexthop.h
+++ b/include/net/nexthop.h
@@ -7,7 +7,7 @@
7 7
8static inline int rtnh_ok(const struct rtnexthop *rtnh, int remaining) 8static inline int rtnh_ok(const struct rtnexthop *rtnh, int remaining)
9{ 9{
10 return remaining >= sizeof(*rtnh) && 10 return remaining >= (int)sizeof(*rtnh) &&
11 rtnh->rtnh_len >= sizeof(*rtnh) && 11 rtnh->rtnh_len >= sizeof(*rtnh) &&
12 rtnh->rtnh_len <= remaining; 12 rtnh->rtnh_len <= remaining;
13} 13}
diff --git a/kernel/bpf/sockmap.c b/kernel/bpf/sockmap.c
index d2bda5aa25d7..8dd9210d7db7 100644
--- a/kernel/bpf/sockmap.c
+++ b/kernel/bpf/sockmap.c
@@ -182,8 +182,10 @@ static void bpf_tcp_release(struct sock *sk)
182 psock->cork = NULL; 182 psock->cork = NULL;
183 } 183 }
184 184
185 sk->sk_prot = psock->sk_proto; 185 if (psock->sk_proto) {
186 psock->sk_proto = NULL; 186 sk->sk_prot = psock->sk_proto;
187 psock->sk_proto = NULL;
188 }
187out: 189out:
188 rcu_read_unlock(); 190 rcu_read_unlock();
189} 191}
@@ -211,6 +213,12 @@ static void bpf_tcp_close(struct sock *sk, long timeout)
211 close_fun = psock->save_close; 213 close_fun = psock->save_close;
212 214
213 write_lock_bh(&sk->sk_callback_lock); 215 write_lock_bh(&sk->sk_callback_lock);
216 if (psock->cork) {
217 free_start_sg(psock->sock, psock->cork);
218 kfree(psock->cork);
219 psock->cork = NULL;
220 }
221
214 list_for_each_entry_safe(md, mtmp, &psock->ingress, list) { 222 list_for_each_entry_safe(md, mtmp, &psock->ingress, list) {
215 list_del(&md->list); 223 list_del(&md->list);
216 free_start_sg(psock->sock, md); 224 free_start_sg(psock->sock, md);
diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c
index 0244973ee544..4ca46df19c9a 100644
--- a/kernel/bpf/syscall.c
+++ b/kernel/bpf/syscall.c
@@ -1226,18 +1226,6 @@ bpf_prog_load_check_attach_type(enum bpf_prog_type prog_type,
1226 } 1226 }
1227} 1227}
1228 1228
1229static int bpf_prog_attach_check_attach_type(const struct bpf_prog *prog,
1230 enum bpf_attach_type attach_type)
1231{
1232 switch (prog->type) {
1233 case BPF_PROG_TYPE_CGROUP_SOCK:
1234 case BPF_PROG_TYPE_CGROUP_SOCK_ADDR:
1235 return attach_type == prog->expected_attach_type ? 0 : -EINVAL;
1236 default:
1237 return 0;
1238 }
1239}
1240
1241/* last field in 'union bpf_attr' used by this command */ 1229/* last field in 'union bpf_attr' used by this command */
1242#define BPF_PROG_LOAD_LAST_FIELD expected_attach_type 1230#define BPF_PROG_LOAD_LAST_FIELD expected_attach_type
1243 1231
@@ -1465,6 +1453,18 @@ out_free_tp:
1465 1453
1466#ifdef CONFIG_CGROUP_BPF 1454#ifdef CONFIG_CGROUP_BPF
1467 1455
1456static int bpf_prog_attach_check_attach_type(const struct bpf_prog *prog,
1457 enum bpf_attach_type attach_type)
1458{
1459 switch (prog->type) {
1460 case BPF_PROG_TYPE_CGROUP_SOCK:
1461 case BPF_PROG_TYPE_CGROUP_SOCK_ADDR:
1462 return attach_type == prog->expected_attach_type ? 0 : -EINVAL;
1463 default:
1464 return 0;
1465 }
1466}
1467
1468#define BPF_PROG_ATTACH_LAST_FIELD attach_flags 1468#define BPF_PROG_ATTACH_LAST_FIELD attach_flags
1469 1469
1470static int sockmap_get_from_fd(const union bpf_attr *attr, 1470static int sockmap_get_from_fd(const union bpf_attr *attr,
diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c
index a9682534c377..45ff5dc124cc 100644
--- a/net/bluetooth/hci_conn.c
+++ b/net/bluetooth/hci_conn.c
@@ -749,18 +749,31 @@ static bool conn_use_rpa(struct hci_conn *conn)
749} 749}
750 750
751static void hci_req_add_le_create_conn(struct hci_request *req, 751static void hci_req_add_le_create_conn(struct hci_request *req,
752 struct hci_conn *conn) 752 struct hci_conn *conn,
753 bdaddr_t *direct_rpa)
753{ 754{
754 struct hci_cp_le_create_conn cp; 755 struct hci_cp_le_create_conn cp;
755 struct hci_dev *hdev = conn->hdev; 756 struct hci_dev *hdev = conn->hdev;
756 u8 own_addr_type; 757 u8 own_addr_type;
757 758
758 /* Update random address, but set require_privacy to false so 759 /* If direct address was provided we use it instead of current
759 * that we never connect with an non-resolvable address. 760 * address.
760 */ 761 */
761 if (hci_update_random_address(req, false, conn_use_rpa(conn), 762 if (direct_rpa) {
762 &own_addr_type)) 763 if (bacmp(&req->hdev->random_addr, direct_rpa))
763 return; 764 hci_req_add(req, HCI_OP_LE_SET_RANDOM_ADDR, 6,
765 direct_rpa);
766
767 /* direct address is always RPA */
768 own_addr_type = ADDR_LE_DEV_RANDOM;
769 } else {
770 /* Update random address, but set require_privacy to false so
771 * that we never connect with an non-resolvable address.
772 */
773 if (hci_update_random_address(req, false, conn_use_rpa(conn),
774 &own_addr_type))
775 return;
776 }
764 777
765 memset(&cp, 0, sizeof(cp)); 778 memset(&cp, 0, sizeof(cp));
766 779
@@ -825,7 +838,7 @@ static void hci_req_directed_advertising(struct hci_request *req,
825 838
826struct hci_conn *hci_connect_le(struct hci_dev *hdev, bdaddr_t *dst, 839struct hci_conn *hci_connect_le(struct hci_dev *hdev, bdaddr_t *dst,
827 u8 dst_type, u8 sec_level, u16 conn_timeout, 840 u8 dst_type, u8 sec_level, u16 conn_timeout,
828 u8 role) 841 u8 role, bdaddr_t *direct_rpa)
829{ 842{
830 struct hci_conn_params *params; 843 struct hci_conn_params *params;
831 struct hci_conn *conn; 844 struct hci_conn *conn;
@@ -940,7 +953,7 @@ struct hci_conn *hci_connect_le(struct hci_dev *hdev, bdaddr_t *dst,
940 hci_dev_set_flag(hdev, HCI_LE_SCAN_INTERRUPTED); 953 hci_dev_set_flag(hdev, HCI_LE_SCAN_INTERRUPTED);
941 } 954 }
942 955
943 hci_req_add_le_create_conn(&req, conn); 956 hci_req_add_le_create_conn(&req, conn, direct_rpa);
944 957
945create_conn: 958create_conn:
946 err = hci_req_run(&req, create_le_conn_complete); 959 err = hci_req_run(&req, create_le_conn_complete);
diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c
index cd3bbb766c24..139707cd9d35 100644
--- a/net/bluetooth/hci_event.c
+++ b/net/bluetooth/hci_event.c
@@ -4648,7 +4648,8 @@ static void hci_le_conn_update_complete_evt(struct hci_dev *hdev,
4648/* This function requires the caller holds hdev->lock */ 4648/* This function requires the caller holds hdev->lock */
4649static struct hci_conn *check_pending_le_conn(struct hci_dev *hdev, 4649static struct hci_conn *check_pending_le_conn(struct hci_dev *hdev,
4650 bdaddr_t *addr, 4650 bdaddr_t *addr,
4651 u8 addr_type, u8 adv_type) 4651 u8 addr_type, u8 adv_type,
4652 bdaddr_t *direct_rpa)
4652{ 4653{
4653 struct hci_conn *conn; 4654 struct hci_conn *conn;
4654 struct hci_conn_params *params; 4655 struct hci_conn_params *params;
@@ -4699,7 +4700,8 @@ static struct hci_conn *check_pending_le_conn(struct hci_dev *hdev,
4699 } 4700 }
4700 4701
4701 conn = hci_connect_le(hdev, addr, addr_type, BT_SECURITY_LOW, 4702 conn = hci_connect_le(hdev, addr, addr_type, BT_SECURITY_LOW,
4702 HCI_LE_AUTOCONN_TIMEOUT, HCI_ROLE_MASTER); 4703 HCI_LE_AUTOCONN_TIMEOUT, HCI_ROLE_MASTER,
4704 direct_rpa);
4703 if (!IS_ERR(conn)) { 4705 if (!IS_ERR(conn)) {
4704 /* If HCI_AUTO_CONN_EXPLICIT is set, conn is already owned 4706 /* If HCI_AUTO_CONN_EXPLICIT is set, conn is already owned
4705 * by higher layer that tried to connect, if no then 4707 * by higher layer that tried to connect, if no then
@@ -4808,8 +4810,13 @@ static void process_adv_report(struct hci_dev *hdev, u8 type, bdaddr_t *bdaddr,
4808 bdaddr_type = irk->addr_type; 4810 bdaddr_type = irk->addr_type;
4809 } 4811 }
4810 4812
4811 /* Check if we have been requested to connect to this device */ 4813 /* Check if we have been requested to connect to this device.
4812 conn = check_pending_le_conn(hdev, bdaddr, bdaddr_type, type); 4814 *
4815 * direct_addr is set only for directed advertising reports (it is NULL
4816 * for advertising reports) and is already verified to be RPA above.
4817 */
4818 conn = check_pending_le_conn(hdev, bdaddr, bdaddr_type, type,
4819 direct_addr);
4813 if (conn && type == LE_ADV_IND) { 4820 if (conn && type == LE_ADV_IND) {
4814 /* Store report for later inclusion by 4821 /* Store report for later inclusion by
4815 * mgmt_device_connected 4822 * mgmt_device_connected
diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c
index fc6615d59165..9b7907ebfa01 100644
--- a/net/bluetooth/l2cap_core.c
+++ b/net/bluetooth/l2cap_core.c
@@ -7156,7 +7156,7 @@ int l2cap_chan_connect(struct l2cap_chan *chan, __le16 psm, u16 cid,
7156 hcon = hci_connect_le(hdev, dst, dst_type, 7156 hcon = hci_connect_le(hdev, dst, dst_type,
7157 chan->sec_level, 7157 chan->sec_level,
7158 HCI_LE_CONN_TIMEOUT, 7158 HCI_LE_CONN_TIMEOUT,
7159 HCI_ROLE_SLAVE); 7159 HCI_ROLE_SLAVE, NULL);
7160 else 7160 else
7161 hcon = hci_connect_le_scan(hdev, dst, dst_type, 7161 hcon = hci_connect_le_scan(hdev, dst, dst_type,
7162 chan->sec_level, 7162 chan->sec_level,
diff --git a/net/core/dev.c b/net/core/dev.c
index 9b04a9fd1dfd..969462ebb296 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -1027,7 +1027,7 @@ bool dev_valid_name(const char *name)
1027{ 1027{
1028 if (*name == '\0') 1028 if (*name == '\0')
1029 return false; 1029 return false;
1030 if (strlen(name) >= IFNAMSIZ) 1030 if (strnlen(name, IFNAMSIZ) == IFNAMSIZ)
1031 return false; 1031 return false;
1032 if (!strcmp(name, ".") || !strcmp(name, "..")) 1032 if (!strcmp(name, ".") || !strcmp(name, ".."))
1033 return false; 1033 return false;
diff --git a/net/core/dev_addr_lists.c b/net/core/dev_addr_lists.c
index c0548d268e1a..e3e6a3e2ca22 100644
--- a/net/core/dev_addr_lists.c
+++ b/net/core/dev_addr_lists.c
@@ -57,8 +57,8 @@ static int __hw_addr_add_ex(struct netdev_hw_addr_list *list,
57 return -EINVAL; 57 return -EINVAL;
58 58
59 list_for_each_entry(ha, &list->list, list) { 59 list_for_each_entry(ha, &list->list, list) {
60 if (!memcmp(ha->addr, addr, addr_len) && 60 if (ha->type == addr_type &&
61 ha->type == addr_type) { 61 !memcmp(ha->addr, addr, addr_len)) {
62 if (global) { 62 if (global) {
63 /* check if addr is already used as global */ 63 /* check if addr is already used as global */
64 if (ha->global_use) 64 if (ha->global_use)
diff --git a/net/core/devlink.c b/net/core/devlink.c
index 9236e421bd62..ad1317376798 100644
--- a/net/core/devlink.c
+++ b/net/core/devlink.c
@@ -2405,6 +2405,16 @@ devlink_resource_size_params_put(struct devlink_resource *resource,
2405 return 0; 2405 return 0;
2406} 2406}
2407 2407
2408static int devlink_resource_occ_put(struct devlink_resource *resource,
2409 struct sk_buff *skb)
2410{
2411 if (!resource->occ_get)
2412 return 0;
2413 return nla_put_u64_64bit(skb, DEVLINK_ATTR_RESOURCE_OCC,
2414 resource->occ_get(resource->occ_get_priv),
2415 DEVLINK_ATTR_PAD);
2416}
2417
2408static int devlink_resource_put(struct devlink *devlink, struct sk_buff *skb, 2418static int devlink_resource_put(struct devlink *devlink, struct sk_buff *skb,
2409 struct devlink_resource *resource) 2419 struct devlink_resource *resource)
2410{ 2420{
@@ -2425,11 +2435,8 @@ static int devlink_resource_put(struct devlink *devlink, struct sk_buff *skb,
2425 if (resource->size != resource->size_new) 2435 if (resource->size != resource->size_new)
2426 nla_put_u64_64bit(skb, DEVLINK_ATTR_RESOURCE_SIZE_NEW, 2436 nla_put_u64_64bit(skb, DEVLINK_ATTR_RESOURCE_SIZE_NEW,
2427 resource->size_new, DEVLINK_ATTR_PAD); 2437 resource->size_new, DEVLINK_ATTR_PAD);
2428 if (resource->resource_ops && resource->resource_ops->occ_get) 2438 if (devlink_resource_occ_put(resource, skb))
2429 if (nla_put_u64_64bit(skb, DEVLINK_ATTR_RESOURCE_OCC, 2439 goto nla_put_failure;
2430 resource->resource_ops->occ_get(devlink),
2431 DEVLINK_ATTR_PAD))
2432 goto nla_put_failure;
2433 if (devlink_resource_size_params_put(resource, skb)) 2440 if (devlink_resource_size_params_put(resource, skb))
2434 goto nla_put_failure; 2441 goto nla_put_failure;
2435 if (list_empty(&resource->resource_list)) 2442 if (list_empty(&resource->resource_list))
@@ -3162,15 +3169,13 @@ EXPORT_SYMBOL_GPL(devlink_dpipe_table_unregister);
3162 * @resource_id: resource's id 3169 * @resource_id: resource's id
3163 * @parent_reosurce_id: resource's parent id 3170 * @parent_reosurce_id: resource's parent id
3164 * @size params: size parameters 3171 * @size params: size parameters
3165 * @resource_ops: resource ops
3166 */ 3172 */
3167int devlink_resource_register(struct devlink *devlink, 3173int devlink_resource_register(struct devlink *devlink,
3168 const char *resource_name, 3174 const char *resource_name,
3169 u64 resource_size, 3175 u64 resource_size,
3170 u64 resource_id, 3176 u64 resource_id,
3171 u64 parent_resource_id, 3177 u64 parent_resource_id,
3172 const struct devlink_resource_size_params *size_params, 3178 const struct devlink_resource_size_params *size_params)
3173 const struct devlink_resource_ops *resource_ops)
3174{ 3179{
3175 struct devlink_resource *resource; 3180 struct devlink_resource *resource;
3176 struct list_head *resource_list; 3181 struct list_head *resource_list;
@@ -3213,7 +3218,6 @@ int devlink_resource_register(struct devlink *devlink,
3213 resource->size = resource_size; 3218 resource->size = resource_size;
3214 resource->size_new = resource_size; 3219 resource->size_new = resource_size;
3215 resource->id = resource_id; 3220 resource->id = resource_id;
3216 resource->resource_ops = resource_ops;
3217 resource->size_valid = true; 3221 resource->size_valid = true;
3218 memcpy(&resource->size_params, size_params, 3222 memcpy(&resource->size_params, size_params,
3219 sizeof(resource->size_params)); 3223 sizeof(resource->size_params));
@@ -3315,6 +3319,58 @@ out:
3315} 3319}
3316EXPORT_SYMBOL_GPL(devlink_dpipe_table_resource_set); 3320EXPORT_SYMBOL_GPL(devlink_dpipe_table_resource_set);
3317 3321
3322/**
3323 * devlink_resource_occ_get_register - register occupancy getter
3324 *
3325 * @devlink: devlink
3326 * @resource_id: resource id
3327 * @occ_get: occupancy getter callback
3328 * @occ_get_priv: occupancy getter callback priv
3329 */
3330void devlink_resource_occ_get_register(struct devlink *devlink,
3331 u64 resource_id,
3332 devlink_resource_occ_get_t *occ_get,
3333 void *occ_get_priv)
3334{
3335 struct devlink_resource *resource;
3336
3337 mutex_lock(&devlink->lock);
3338 resource = devlink_resource_find(devlink, NULL, resource_id);
3339 if (WARN_ON(!resource))
3340 goto out;
3341 WARN_ON(resource->occ_get);
3342
3343 resource->occ_get = occ_get;
3344 resource->occ_get_priv = occ_get_priv;
3345out:
3346 mutex_unlock(&devlink->lock);
3347}
3348EXPORT_SYMBOL_GPL(devlink_resource_occ_get_register);
3349
3350/**
3351 * devlink_resource_occ_get_unregister - unregister occupancy getter
3352 *
3353 * @devlink: devlink
3354 * @resource_id: resource id
3355 */
3356void devlink_resource_occ_get_unregister(struct devlink *devlink,
3357 u64 resource_id)
3358{
3359 struct devlink_resource *resource;
3360
3361 mutex_lock(&devlink->lock);
3362 resource = devlink_resource_find(devlink, NULL, resource_id);
3363 if (WARN_ON(!resource))
3364 goto out;
3365 WARN_ON(!resource->occ_get);
3366
3367 resource->occ_get = NULL;
3368 resource->occ_get_priv = NULL;
3369out:
3370 mutex_unlock(&devlink->lock);
3371}
3372EXPORT_SYMBOL_GPL(devlink_resource_occ_get_unregister);
3373
3318static int __init devlink_module_init(void) 3374static int __init devlink_module_init(void)
3319{ 3375{
3320 return genl_register_family(&devlink_nl_family); 3376 return genl_register_family(&devlink_nl_family);
diff --git a/net/core/skbuff.c b/net/core/skbuff.c
index 1bca1e0fc8f7..345b51837ca8 100644
--- a/net/core/skbuff.c
+++ b/net/core/skbuff.c
@@ -857,6 +857,7 @@ static struct sk_buff *__skb_clone(struct sk_buff *n, struct sk_buff *skb)
857 n->hdr_len = skb->nohdr ? skb_headroom(skb) : skb->hdr_len; 857 n->hdr_len = skb->nohdr ? skb_headroom(skb) : skb->hdr_len;
858 n->cloned = 1; 858 n->cloned = 1;
859 n->nohdr = 0; 859 n->nohdr = 0;
860 n->peeked = 0;
860 n->destructor = NULL; 861 n->destructor = NULL;
861 C(tail); 862 C(tail);
862 C(end); 863 C(end);
diff --git a/net/dccp/ipv4.c b/net/dccp/ipv4.c
index e65fcb45c3f6..b08feb219b44 100644
--- a/net/dccp/ipv4.c
+++ b/net/dccp/ipv4.c
@@ -614,6 +614,7 @@ int dccp_v4_conn_request(struct sock *sk, struct sk_buff *skb)
614 ireq = inet_rsk(req); 614 ireq = inet_rsk(req);
615 sk_rcv_saddr_set(req_to_sk(req), ip_hdr(skb)->daddr); 615 sk_rcv_saddr_set(req_to_sk(req), ip_hdr(skb)->daddr);
616 sk_daddr_set(req_to_sk(req), ip_hdr(skb)->saddr); 616 sk_daddr_set(req_to_sk(req), ip_hdr(skb)->saddr);
617 ireq->ir_mark = inet_request_mark(sk, skb);
617 ireq->ireq_family = AF_INET; 618 ireq->ireq_family = AF_INET;
618 ireq->ir_iif = sk->sk_bound_dev_if; 619 ireq->ir_iif = sk->sk_bound_dev_if;
619 620
diff --git a/net/dccp/ipv6.c b/net/dccp/ipv6.c
index 5df7857fc0f3..6344f1b18a6a 100644
--- a/net/dccp/ipv6.c
+++ b/net/dccp/ipv6.c
@@ -351,6 +351,7 @@ static int dccp_v6_conn_request(struct sock *sk, struct sk_buff *skb)
351 ireq->ir_v6_rmt_addr = ipv6_hdr(skb)->saddr; 351 ireq->ir_v6_rmt_addr = ipv6_hdr(skb)->saddr;
352 ireq->ir_v6_loc_addr = ipv6_hdr(skb)->daddr; 352 ireq->ir_v6_loc_addr = ipv6_hdr(skb)->daddr;
353 ireq->ireq_family = AF_INET6; 353 ireq->ireq_family = AF_INET6;
354 ireq->ir_mark = inet_request_mark(sk, skb);
354 355
355 if (ipv6_opt_accepted(sk, skb, IP6CB(skb)) || 356 if (ipv6_opt_accepted(sk, skb, IP6CB(skb)) ||
356 np->rxopt.bits.rxinfo || np->rxopt.bits.rxoinfo || 357 np->rxopt.bits.rxinfo || np->rxopt.bits.rxoinfo ||
diff --git a/net/dsa/dsa_priv.h b/net/dsa/dsa_priv.h
index 70de7895e5b8..053731473c99 100644
--- a/net/dsa/dsa_priv.h
+++ b/net/dsa/dsa_priv.h
@@ -126,6 +126,7 @@ static inline struct net_device *dsa_master_find_slave(struct net_device *dev,
126 struct dsa_port *cpu_dp = dev->dsa_ptr; 126 struct dsa_port *cpu_dp = dev->dsa_ptr;
127 struct dsa_switch_tree *dst = cpu_dp->dst; 127 struct dsa_switch_tree *dst = cpu_dp->dst;
128 struct dsa_switch *ds; 128 struct dsa_switch *ds;
129 struct dsa_port *slave_port;
129 130
130 if (device < 0 || device >= DSA_MAX_SWITCHES) 131 if (device < 0 || device >= DSA_MAX_SWITCHES)
131 return NULL; 132 return NULL;
@@ -137,7 +138,12 @@ static inline struct net_device *dsa_master_find_slave(struct net_device *dev,
137 if (port < 0 || port >= ds->num_ports) 138 if (port < 0 || port >= ds->num_ports)
138 return NULL; 139 return NULL;
139 140
140 return ds->ports[port].slave; 141 slave_port = &ds->ports[port];
142
143 if (unlikely(slave_port->type != DSA_PORT_TYPE_USER))
144 return NULL;
145
146 return slave_port->slave;
141} 147}
142 148
143/* port.c */ 149/* port.c */
diff --git a/net/ipv4/arp.c b/net/ipv4/arp.c
index be4c595edccb..bf6c2d4d4fdc 100644
--- a/net/ipv4/arp.c
+++ b/net/ipv4/arp.c
@@ -437,7 +437,7 @@ static int arp_filter(__be32 sip, __be32 tip, struct net_device *dev)
437 /*unsigned long now; */ 437 /*unsigned long now; */
438 struct net *net = dev_net(dev); 438 struct net *net = dev_net(dev);
439 439
440 rt = ip_route_output(net, sip, tip, 0, 0); 440 rt = ip_route_output(net, sip, tip, 0, l3mdev_master_ifindex_rcu(dev));
441 if (IS_ERR(rt)) 441 if (IS_ERR(rt))
442 return 1; 442 return 1;
443 if (rt->dst.dev != dev) { 443 if (rt->dst.dev != dev) {
diff --git a/net/ipv4/inet_timewait_sock.c b/net/ipv4/inet_timewait_sock.c
index c3ea4906d237..88c5069b5d20 100644
--- a/net/ipv4/inet_timewait_sock.c
+++ b/net/ipv4/inet_timewait_sock.c
@@ -178,6 +178,7 @@ struct inet_timewait_sock *inet_twsk_alloc(const struct sock *sk,
178 tw->tw_dport = inet->inet_dport; 178 tw->tw_dport = inet->inet_dport;
179 tw->tw_family = sk->sk_family; 179 tw->tw_family = sk->sk_family;
180 tw->tw_reuse = sk->sk_reuse; 180 tw->tw_reuse = sk->sk_reuse;
181 tw->tw_reuseport = sk->sk_reuseport;
181 tw->tw_hash = sk->sk_hash; 182 tw->tw_hash = sk->sk_hash;
182 tw->tw_ipv6only = 0; 183 tw->tw_ipv6only = 0;
183 tw->tw_transparent = inet->transparent; 184 tw->tw_transparent = inet->transparent;
diff --git a/net/ipv4/inetpeer.c b/net/ipv4/inetpeer.c
index 1f04bd91fc2e..d757b9642d0d 100644
--- a/net/ipv4/inetpeer.c
+++ b/net/ipv4/inetpeer.c
@@ -211,6 +211,7 @@ struct inet_peer *inet_getpeer(struct inet_peer_base *base,
211 p = kmem_cache_alloc(peer_cachep, GFP_ATOMIC); 211 p = kmem_cache_alloc(peer_cachep, GFP_ATOMIC);
212 if (p) { 212 if (p) {
213 p->daddr = *daddr; 213 p->daddr = *daddr;
214 p->dtime = (__u32)jiffies;
214 refcount_set(&p->refcnt, 2); 215 refcount_set(&p->refcnt, 2);
215 atomic_set(&p->rid, 0); 216 atomic_set(&p->rid, 0);
216 p->metrics[RTAX_LOCK-1] = INETPEER_METRICS_NEW; 217 p->metrics[RTAX_LOCK-1] = INETPEER_METRICS_NEW;
diff --git a/net/ipv4/ip_tunnel.c b/net/ipv4/ip_tunnel.c
index de6d94482fe7..6b0e362cc99b 100644
--- a/net/ipv4/ip_tunnel.c
+++ b/net/ipv4/ip_tunnel.c
@@ -253,13 +253,14 @@ static struct net_device *__ip_tunnel_create(struct net *net,
253 struct net_device *dev; 253 struct net_device *dev;
254 char name[IFNAMSIZ]; 254 char name[IFNAMSIZ];
255 255
256 if (parms->name[0]) 256 err = -E2BIG;
257 if (parms->name[0]) {
258 if (!dev_valid_name(parms->name))
259 goto failed;
257 strlcpy(name, parms->name, IFNAMSIZ); 260 strlcpy(name, parms->name, IFNAMSIZ);
258 else { 261 } else {
259 if (strlen(ops->kind) > (IFNAMSIZ - 3)) { 262 if (strlen(ops->kind) > (IFNAMSIZ - 3))
260 err = -E2BIG;
261 goto failed; 263 goto failed;
262 }
263 strlcpy(name, ops->kind, IFNAMSIZ); 264 strlcpy(name, ops->kind, IFNAMSIZ);
264 strncat(name, "%d", 2); 265 strncat(name, "%d", 2);
265 } 266 }
diff --git a/net/ipv4/route.c b/net/ipv4/route.c
index 594a1c605c92..ccb25d80f679 100644
--- a/net/ipv4/route.c
+++ b/net/ipv4/route.c
@@ -2296,13 +2296,14 @@ struct rtable *ip_route_output_key_hash(struct net *net, struct flowi4 *fl4,
2296 const struct sk_buff *skb) 2296 const struct sk_buff *skb)
2297{ 2297{
2298 __u8 tos = RT_FL_TOS(fl4); 2298 __u8 tos = RT_FL_TOS(fl4);
2299 struct fib_result res; 2299 struct fib_result res = {
2300 .type = RTN_UNSPEC,
2301 .fi = NULL,
2302 .table = NULL,
2303 .tclassid = 0,
2304 };
2300 struct rtable *rth; 2305 struct rtable *rth;
2301 2306
2302 res.tclassid = 0;
2303 res.fi = NULL;
2304 res.table = NULL;
2305
2306 fl4->flowi4_iif = LOOPBACK_IFINDEX; 2307 fl4->flowi4_iif = LOOPBACK_IFINDEX;
2307 fl4->flowi4_tos = tos & IPTOS_RT_MASK; 2308 fl4->flowi4_tos = tos & IPTOS_RT_MASK;
2308 fl4->flowi4_scope = ((tos & RTO_ONLINK) ? 2309 fl4->flowi4_scope = ((tos & RTO_ONLINK) ?
diff --git a/net/ipv6/ip6_gre.c b/net/ipv6/ip6_gre.c
index f8a103bdbd60..69727bc168cb 100644
--- a/net/ipv6/ip6_gre.c
+++ b/net/ipv6/ip6_gre.c
@@ -335,11 +335,13 @@ static struct ip6_tnl *ip6gre_tunnel_locate(struct net *net,
335 if (t || !create) 335 if (t || !create)
336 return t; 336 return t;
337 337
338 if (parms->name[0]) 338 if (parms->name[0]) {
339 if (!dev_valid_name(parms->name))
340 return NULL;
339 strlcpy(name, parms->name, IFNAMSIZ); 341 strlcpy(name, parms->name, IFNAMSIZ);
340 else 342 } else {
341 strcpy(name, "ip6gre%d"); 343 strcpy(name, "ip6gre%d");
342 344 }
343 dev = alloc_netdev(sizeof(*t), name, NET_NAME_UNKNOWN, 345 dev = alloc_netdev(sizeof(*t), name, NET_NAME_UNKNOWN,
344 ip6gre_tunnel_setup); 346 ip6gre_tunnel_setup);
345 if (!dev) 347 if (!dev)
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c
index b8ee50e94af3..2e891d2c30ef 100644
--- a/net/ipv6/ip6_output.c
+++ b/net/ipv6/ip6_output.c
@@ -375,6 +375,11 @@ static int ip6_forward_proxy_check(struct sk_buff *skb)
375static inline int ip6_forward_finish(struct net *net, struct sock *sk, 375static inline int ip6_forward_finish(struct net *net, struct sock *sk,
376 struct sk_buff *skb) 376 struct sk_buff *skb)
377{ 377{
378 struct dst_entry *dst = skb_dst(skb);
379
380 __IP6_INC_STATS(net, ip6_dst_idev(dst), IPSTATS_MIB_OUTFORWDATAGRAMS);
381 __IP6_ADD_STATS(net, ip6_dst_idev(dst), IPSTATS_MIB_OUTOCTETS, skb->len);
382
378 return dst_output(net, sk, skb); 383 return dst_output(net, sk, skb);
379} 384}
380 385
@@ -569,8 +574,6 @@ int ip6_forward(struct sk_buff *skb)
569 574
570 hdr->hop_limit--; 575 hdr->hop_limit--;
571 576
572 __IP6_INC_STATS(net, ip6_dst_idev(dst), IPSTATS_MIB_OUTFORWDATAGRAMS);
573 __IP6_ADD_STATS(net, ip6_dst_idev(dst), IPSTATS_MIB_OUTOCTETS, skb->len);
574 return NF_HOOK(NFPROTO_IPV6, NF_INET_FORWARD, 577 return NF_HOOK(NFPROTO_IPV6, NF_INET_FORWARD,
575 net, NULL, skb, skb->dev, dst->dev, 578 net, NULL, skb, skb->dev, dst->dev,
576 ip6_forward_finish); 579 ip6_forward_finish);
diff --git a/net/ipv6/ip6_tunnel.c b/net/ipv6/ip6_tunnel.c
index df4c29f7d59f..da66aaac51ce 100644
--- a/net/ipv6/ip6_tunnel.c
+++ b/net/ipv6/ip6_tunnel.c
@@ -297,13 +297,16 @@ static struct ip6_tnl *ip6_tnl_create(struct net *net, struct __ip6_tnl_parm *p)
297 struct net_device *dev; 297 struct net_device *dev;
298 struct ip6_tnl *t; 298 struct ip6_tnl *t;
299 char name[IFNAMSIZ]; 299 char name[IFNAMSIZ];
300 int err = -ENOMEM; 300 int err = -E2BIG;
301 301
302 if (p->name[0]) 302 if (p->name[0]) {
303 if (!dev_valid_name(p->name))
304 goto failed;
303 strlcpy(name, p->name, IFNAMSIZ); 305 strlcpy(name, p->name, IFNAMSIZ);
304 else 306 } else {
305 sprintf(name, "ip6tnl%%d"); 307 sprintf(name, "ip6tnl%%d");
306 308 }
309 err = -ENOMEM;
307 dev = alloc_netdev(sizeof(*t), name, NET_NAME_UNKNOWN, 310 dev = alloc_netdev(sizeof(*t), name, NET_NAME_UNKNOWN,
308 ip6_tnl_dev_setup); 311 ip6_tnl_dev_setup);
309 if (!dev) 312 if (!dev)
diff --git a/net/ipv6/ip6_vti.c b/net/ipv6/ip6_vti.c
index 6ebb2e8777f4..c214ffec02f0 100644
--- a/net/ipv6/ip6_vti.c
+++ b/net/ipv6/ip6_vti.c
@@ -212,10 +212,13 @@ static struct ip6_tnl *vti6_tnl_create(struct net *net, struct __ip6_tnl_parm *p
212 char name[IFNAMSIZ]; 212 char name[IFNAMSIZ];
213 int err; 213 int err;
214 214
215 if (p->name[0]) 215 if (p->name[0]) {
216 if (!dev_valid_name(p->name))
217 goto failed;
216 strlcpy(name, p->name, IFNAMSIZ); 218 strlcpy(name, p->name, IFNAMSIZ);
217 else 219 } else {
218 sprintf(name, "ip6_vti%%d"); 220 sprintf(name, "ip6_vti%%d");
221 }
219 222
220 dev = alloc_netdev(sizeof(*t), name, NET_NAME_UNKNOWN, vti6_dev_setup); 223 dev = alloc_netdev(sizeof(*t), name, NET_NAME_UNKNOWN, vti6_dev_setup);
221 if (!dev) 224 if (!dev)
diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c
index 1522bcfd253f..2afce37a7177 100644
--- a/net/ipv6/sit.c
+++ b/net/ipv6/sit.c
@@ -250,11 +250,13 @@ static struct ip_tunnel *ipip6_tunnel_locate(struct net *net,
250 if (!create) 250 if (!create)
251 goto failed; 251 goto failed;
252 252
253 if (parms->name[0]) 253 if (parms->name[0]) {
254 if (!dev_valid_name(parms->name))
255 goto failed;
254 strlcpy(name, parms->name, IFNAMSIZ); 256 strlcpy(name, parms->name, IFNAMSIZ);
255 else 257 } else {
256 strcpy(name, "sit%d"); 258 strcpy(name, "sit%d");
257 259 }
258 dev = alloc_netdev(sizeof(*t), name, NET_NAME_UNKNOWN, 260 dev = alloc_netdev(sizeof(*t), name, NET_NAME_UNKNOWN,
259 ipip6_tunnel_setup); 261 ipip6_tunnel_setup);
260 if (!dev) 262 if (!dev)
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c
index fa556fdef57d..55342c4d5cec 100644
--- a/net/netlink/af_netlink.c
+++ b/net/netlink/af_netlink.c
@@ -1844,6 +1844,8 @@ static int netlink_sendmsg(struct socket *sock, struct msghdr *msg, size_t len)
1844 1844
1845 if (msg->msg_namelen) { 1845 if (msg->msg_namelen) {
1846 err = -EINVAL; 1846 err = -EINVAL;
1847 if (msg->msg_namelen < sizeof(struct sockaddr_nl))
1848 goto out;
1847 if (addr->nl_family != AF_NETLINK) 1849 if (addr->nl_family != AF_NETLINK)
1848 goto out; 1850 goto out;
1849 dst_portid = addr->nl_pid; 1851 dst_portid = addr->nl_pid;
diff --git a/net/sched/act_bpf.c b/net/sched/act_bpf.c
index 9092531d45d8..18089c02e557 100644
--- a/net/sched/act_bpf.c
+++ b/net/sched/act_bpf.c
@@ -248,10 +248,14 @@ static int tcf_bpf_init_from_efd(struct nlattr **tb, struct tcf_bpf_cfg *cfg)
248 248
249static void tcf_bpf_cfg_cleanup(const struct tcf_bpf_cfg *cfg) 249static void tcf_bpf_cfg_cleanup(const struct tcf_bpf_cfg *cfg)
250{ 250{
251 if (cfg->is_ebpf) 251 struct bpf_prog *filter = cfg->filter;
252 bpf_prog_put(cfg->filter); 252
253 else 253 if (filter) {
254 bpf_prog_destroy(cfg->filter); 254 if (cfg->is_ebpf)
255 bpf_prog_put(filter);
256 else
257 bpf_prog_destroy(filter);
258 }
255 259
256 kfree(cfg->bpf_ops); 260 kfree(cfg->bpf_ops);
257 kfree(cfg->bpf_name); 261 kfree(cfg->bpf_name);
diff --git a/net/sched/cls_u32.c b/net/sched/cls_u32.c
index ed8b6a24b9e9..bac47b5d18fd 100644
--- a/net/sched/cls_u32.c
+++ b/net/sched/cls_u32.c
@@ -489,6 +489,7 @@ static int u32_delete_key(struct tcf_proto *tp, struct tc_u_knode *key)
489 RCU_INIT_POINTER(*kp, key->next); 489 RCU_INIT_POINTER(*kp, key->next);
490 490
491 tcf_unbind_filter(tp, &key->res); 491 tcf_unbind_filter(tp, &key->res);
492 idr_remove(&ht->handle_idr, key->handle);
492 tcf_exts_get_net(&key->exts); 493 tcf_exts_get_net(&key->exts);
493 call_rcu(&key->rcu, u32_delete_key_freepf_rcu); 494 call_rcu(&key->rcu, u32_delete_key_freepf_rcu);
494 return 0; 495 return 0;
diff --git a/net/sctp/ipv6.c b/net/sctp/ipv6.c
index 6dd976c8ab61..31083b5035ec 100644
--- a/net/sctp/ipv6.c
+++ b/net/sctp/ipv6.c
@@ -757,8 +757,10 @@ static int sctp_v6_addr_to_user(struct sctp_sock *sp, union sctp_addr *addr)
757 sctp_v6_map_v4(addr); 757 sctp_v6_map_v4(addr);
758 } 758 }
759 759
760 if (addr->sa.sa_family == AF_INET) 760 if (addr->sa.sa_family == AF_INET) {
761 memset(addr->v4.sin_zero, 0, sizeof(addr->v4.sin_zero));
761 return sizeof(struct sockaddr_in); 762 return sizeof(struct sockaddr_in);
763 }
762 return sizeof(struct sockaddr_in6); 764 return sizeof(struct sockaddr_in6);
763} 765}
764 766
diff --git a/net/sctp/socket.c b/net/sctp/socket.c
index 2a2e094560de..80835ac26d2c 100644
--- a/net/sctp/socket.c
+++ b/net/sctp/socket.c
@@ -357,11 +357,14 @@ static struct sctp_af *sctp_sockaddr_af(struct sctp_sock *opt,
357 if (!opt->pf->af_supported(addr->sa.sa_family, opt)) 357 if (!opt->pf->af_supported(addr->sa.sa_family, opt))
358 return NULL; 358 return NULL;
359 359
360 /* V4 mapped address are really of AF_INET family */ 360 if (addr->sa.sa_family == AF_INET6) {
361 if (addr->sa.sa_family == AF_INET6 && 361 if (len < SIN6_LEN_RFC2133)
362 ipv6_addr_v4mapped(&addr->v6.sin6_addr) && 362 return NULL;
363 !opt->pf->af_supported(AF_INET, opt)) 363 /* V4 mapped address are really of AF_INET family */
364 return NULL; 364 if (ipv6_addr_v4mapped(&addr->v6.sin6_addr) &&
365 !opt->pf->af_supported(AF_INET, opt))
366 return NULL;
367 }
365 368
366 /* If we get this far, af is valid. */ 369 /* If we get this far, af is valid. */
367 af = sctp_get_af_specific(addr->sa.sa_family); 370 af = sctp_get_af_specific(addr->sa.sa_family);
diff --git a/net/tipc/diag.c b/net/tipc/diag.c
index 46d9cd62f781..aaabb0b776dd 100644
--- a/net/tipc/diag.c
+++ b/net/tipc/diag.c
@@ -59,7 +59,7 @@ static int __tipc_add_sock_diag(struct sk_buff *skb,
59 if (!nlh) 59 if (!nlh)
60 return -EMSGSIZE; 60 return -EMSGSIZE;
61 61
62 err = tipc_sk_fill_sock_diag(skb, tsk, req->tidiag_states, 62 err = tipc_sk_fill_sock_diag(skb, cb, tsk, req->tidiag_states,
63 __tipc_diag_gen_cookie); 63 __tipc_diag_gen_cookie);
64 if (err) 64 if (err)
65 return err; 65 return err;
diff --git a/net/tipc/socket.c b/net/tipc/socket.c
index cee6674a3bf4..1fd1c8b5ce03 100644
--- a/net/tipc/socket.c
+++ b/net/tipc/socket.c
@@ -3257,8 +3257,8 @@ out:
3257} 3257}
3258EXPORT_SYMBOL(tipc_nl_sk_walk); 3258EXPORT_SYMBOL(tipc_nl_sk_walk);
3259 3259
3260int tipc_sk_fill_sock_diag(struct sk_buff *skb, struct tipc_sock *tsk, 3260int tipc_sk_fill_sock_diag(struct sk_buff *skb, struct netlink_callback *cb,
3261 u32 sk_filter_state, 3261 struct tipc_sock *tsk, u32 sk_filter_state,
3262 u64 (*tipc_diag_gen_cookie)(struct sock *sk)) 3262 u64 (*tipc_diag_gen_cookie)(struct sock *sk))
3263{ 3263{
3264 struct sock *sk = &tsk->sk; 3264 struct sock *sk = &tsk->sk;
@@ -3280,7 +3280,7 @@ int tipc_sk_fill_sock_diag(struct sk_buff *skb, struct tipc_sock *tsk,
3280 nla_put_u32(skb, TIPC_NLA_SOCK_TIPC_STATE, (u32)sk->sk_state) || 3280 nla_put_u32(skb, TIPC_NLA_SOCK_TIPC_STATE, (u32)sk->sk_state) ||
3281 nla_put_u32(skb, TIPC_NLA_SOCK_INO, sock_i_ino(sk)) || 3281 nla_put_u32(skb, TIPC_NLA_SOCK_INO, sock_i_ino(sk)) ||
3282 nla_put_u32(skb, TIPC_NLA_SOCK_UID, 3282 nla_put_u32(skb, TIPC_NLA_SOCK_UID,
3283 from_kuid_munged(sk_user_ns(NETLINK_CB(skb).sk), 3283 from_kuid_munged(sk_user_ns(NETLINK_CB(cb->skb).sk),
3284 sock_i_uid(sk))) || 3284 sock_i_uid(sk))) ||
3285 nla_put_u64_64bit(skb, TIPC_NLA_SOCK_COOKIE, 3285 nla_put_u64_64bit(skb, TIPC_NLA_SOCK_COOKIE,
3286 tipc_diag_gen_cookie(sk), 3286 tipc_diag_gen_cookie(sk),
diff --git a/net/tipc/socket.h b/net/tipc/socket.h
index aae3fd4cd06c..aff9b2ae5a1f 100644
--- a/net/tipc/socket.h
+++ b/net/tipc/socket.h
@@ -61,8 +61,8 @@ int tipc_sk_rht_init(struct net *net);
61void tipc_sk_rht_destroy(struct net *net); 61void tipc_sk_rht_destroy(struct net *net);
62int tipc_nl_sk_dump(struct sk_buff *skb, struct netlink_callback *cb); 62int tipc_nl_sk_dump(struct sk_buff *skb, struct netlink_callback *cb);
63int tipc_nl_publ_dump(struct sk_buff *skb, struct netlink_callback *cb); 63int tipc_nl_publ_dump(struct sk_buff *skb, struct netlink_callback *cb);
64int tipc_sk_fill_sock_diag(struct sk_buff *skb, struct tipc_sock *tsk, 64int tipc_sk_fill_sock_diag(struct sk_buff *skb, struct netlink_callback *cb,
65 u32 sk_filter_state, 65 struct tipc_sock *tsk, u32 sk_filter_state,
66 u64 (*tipc_diag_gen_cookie)(struct sock *sk)); 66 u64 (*tipc_diag_gen_cookie)(struct sock *sk));
67int tipc_nl_sk_walk(struct sk_buff *skb, struct netlink_callback *cb, 67int tipc_nl_sk_walk(struct sk_buff *skb, struct netlink_callback *cb,
68 int (*skb_handler)(struct sk_buff *skb, 68 int (*skb_handler)(struct sk_buff *skb,