Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 'net-6.15-rc0' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net

Pull networking fixes from Jakub Kicinski:
"Rather tiny pull request, mostly so that we can get into our trees
your fix to the x86 Makefile.

Current release - regressions:

- Revert "tcp: avoid atomic operations on sk->sk_rmem_alloc", error
queue accounting was missed

Current release - new code bugs:

- 5 fixes for the netdevice instance locking work

Previous releases - regressions:

- usbnet: restore usb%d name exception for local mac addresses

Previous releases - always broken:

- rtnetlink: allocate vfinfo size for VF GUIDs when supported, avoid
spurious GET_LINK failures

- eth: mana: Switch to page pool for jumbo frames

- phy: broadcom: Correct BCM5221 PHY model detection

Misc:

- selftests: drv-net: replace helpers for referring to other files"

* tag 'net-6.15-rc0' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net: (22 commits)
Revert "tcp: avoid atomic operations on sk->sk_rmem_alloc"
bnxt_en: bring back rtnl lock in bnxt_shutdown
eth: gve: add missing netdev locks on reset and shutdown paths
selftests: mptcp: ignore mptcp_diag binary
selftests: mptcp: close fd_in before returning in main_loop
selftests: mptcp: fix incorrect fd checks in main_loop
mptcp: fix NULL pointer in can_accept_new_subflow
octeontx2-af: Free NIX_AF_INT_VEC_GEN irq
octeontx2-af: Fix mbox INTR handler when num VFs > 64
net: fix use-after-free in the netdev_nl_sock_priv_destroy()
selftests: net: use Path helpers in ping
selftests: net: use the dummy bpf from net/lib
selftests: drv-net: replace the rpath helper with Path objects
net: lapbether: use netdev_lockdep_set_classes() helper
net: phy: broadcom: Correct BCM5221 PHY model detection
net: usb: usbnet: restore usb%d name exception for local mac addresses
net/mlx5e: SHAMPO, Make reserved size independent of page size
net: mana: Switch to page pool for jumbo frames
MAINTAINERS: Add dedicated entries for phy_link_topology
net: move replay logic to tc_modify_qdisc
...

+141 -205
+7
MAINTAINERS
··· 16806 16806 F: tools/testing/selftests/drivers/net/hw/ethtool_mm.sh 16807 16807 K: ethtool_mm 16808 16808 16809 + NETWORKING [ETHTOOL PHY TOPOLOGY] 16810 + M: Maxime Chevallier <maxime.chevallier@bootlin.com> 16811 + F: Documentation/networking/phy-link-topology.rst 16812 + F: drivers/net/phy/phy_link_topology.c 16813 + F: include/linux/phy_link_topology.h 16814 + F: net/ethtool/phy.c 16815 + 16809 16816 NETWORKING [GENERAL] 16810 16817 M: "David S. Miller" <davem@davemloft.net> 16811 16818 M: Eric Dumazet <edumazet@google.com>
+2
drivers/net/ethernet/broadcom/bnxt/bnxt.c
··· 16698 16698 if (!dev) 16699 16699 return; 16700 16700 16701 + rtnl_lock(); 16701 16702 netdev_lock(dev); 16702 16703 bp = netdev_priv(dev); 16703 16704 if (!bp) ··· 16718 16717 16719 16718 shutdown_exit: 16720 16719 netdev_unlock(dev); 16720 + rtnl_unlock(); 16721 16721 } 16722 16722 16723 16723 #ifdef CONFIG_PM_SLEEP
+4
drivers/net/ethernet/google/gve/gve_main.c
··· 2077 2077 2078 2078 if (gve_get_do_reset(priv)) { 2079 2079 rtnl_lock(); 2080 + netdev_lock(priv->dev); 2080 2081 gve_reset(priv, false); 2082 + netdev_unlock(priv->dev); 2081 2083 rtnl_unlock(); 2082 2084 } 2083 2085 } ··· 2716 2714 bool was_up = netif_running(priv->dev); 2717 2715 2718 2716 rtnl_lock(); 2717 + netdev_lock(netdev); 2719 2718 if (was_up && gve_close(priv->dev)) { 2720 2719 /* If the dev was up, attempt to close, if close fails, reset */ 2721 2720 gve_reset_and_teardown(priv, was_up); ··· 2724 2721 /* If the dev wasn't up or close worked, finish tearing down */ 2725 2722 gve_teardown_priv_resources(priv); 2726 2723 } 2724 + netdev_unlock(netdev); 2727 2725 rtnl_unlock(); 2728 2726 } 2729 2727
+1 -1
drivers/net/ethernet/marvell/octeontx2/af/rvu.c
··· 2634 2634 rvupf_write64(rvu, RVU_PF_VFPF_MBOX_INTX(1), intr); 2635 2635 2636 2636 rvu_queue_work(&rvu->afvf_wq_info, 64, vfs, intr); 2637 - vfs -= 64; 2637 + vfs = 64; 2638 2638 } 2639 2639 2640 2640 intr = rvupf_read64(rvu, RVU_PF_VFPF_MBOX_INTX(0));
+1 -1
drivers/net/ethernet/marvell/octeontx2/af/rvu_devlink.c
··· 207 207 rvu->irq_allocated[offs + NIX_AF_INT_VEC_RVU] = false; 208 208 } 209 209 210 - for (i = NIX_AF_INT_VEC_AF_ERR; i < NIX_AF_INT_VEC_CNT; i++) 210 + for (i = NIX_AF_INT_VEC_GEN; i < NIX_AF_INT_VEC_CNT; i++) 211 211 if (rvu->irq_allocated[offs + i]) { 212 212 free_irq(pci_irq_vector(rvu->pdev, offs + i), rvu_dl); 213 213 rvu->irq_allocated[offs + i] = false;
+5 -3
drivers/net/ethernet/mellanox/mlx5/core/en/params.c
··· 430 430 struct mlx5e_params *params) 431 431 { 432 432 u32 resrv_size = BIT(mlx5e_shampo_get_log_rsrv_size(mdev, params)) * 433 - PAGE_SIZE; 433 + MLX5E_SHAMPO_WQ_BASE_RESRV_SIZE; 434 434 435 435 return order_base_2(DIV_ROUND_UP(resrv_size, params->sw_mtu)); 436 436 } ··· 834 834 struct mlx5e_params *params, 835 835 struct mlx5e_xsk_param *xsk) 836 836 { 837 - int rsrv_size = BIT(mlx5e_shampo_get_log_rsrv_size(mdev, params)) * PAGE_SIZE; 837 + int rsrv_size = BIT(mlx5e_shampo_get_log_rsrv_size(mdev, params)) * 838 + MLX5E_SHAMPO_WQ_BASE_RESRV_SIZE; 838 839 u16 num_strides = BIT(mlx5e_mpwqe_get_log_num_strides(mdev, params, xsk)); 839 840 int pkt_per_rsrv = BIT(mlx5e_shampo_get_log_pkt_per_rsrv(mdev, params)); 840 841 u8 log_stride_sz = mlx5e_mpwqe_get_log_stride_size(mdev, params, xsk); ··· 1044 1043 struct mlx5e_params *params, 1045 1044 struct mlx5e_rq_param *rq_param) 1046 1045 { 1047 - int resv_size = BIT(mlx5e_shampo_get_log_rsrv_size(mdev, params)) * PAGE_SIZE; 1046 + int resv_size = BIT(mlx5e_shampo_get_log_rsrv_size(mdev, params)) * 1047 + MLX5E_SHAMPO_WQ_BASE_RESRV_SIZE; 1048 1048 u16 num_strides = BIT(mlx5e_mpwqe_get_log_num_strides(mdev, params, NULL)); 1049 1049 int pkt_per_resv = BIT(mlx5e_shampo_get_log_pkt_per_rsrv(mdev, params)); 1050 1050 u8 log_stride_sz = mlx5e_mpwqe_get_log_stride_size(mdev, params, NULL);
+9 -37
drivers/net/ethernet/microsoft/mana/mana_en.c
··· 661 661 mpc->rxbpre_total = 0; 662 662 663 663 for (i = 0; i < num_rxb; i++) { 664 - if (mpc->rxbpre_alloc_size > PAGE_SIZE) { 665 - va = netdev_alloc_frag(mpc->rxbpre_alloc_size); 666 - if (!va) 667 - goto error; 664 + page = dev_alloc_pages(get_order(mpc->rxbpre_alloc_size)); 665 + if (!page) 666 + goto error; 668 667 669 - page = virt_to_head_page(va); 670 - /* Check if the frag falls back to single page */ 671 - if (compound_order(page) < 672 - get_order(mpc->rxbpre_alloc_size)) { 673 - put_page(page); 674 - goto error; 675 - } 676 - } else { 677 - page = dev_alloc_page(); 678 - if (!page) 679 - goto error; 680 - 681 - va = page_to_virt(page); 682 - } 668 + va = page_to_virt(page); 683 669 684 670 da = dma_map_single(dev, va + mpc->rxbpre_headroom, 685 671 mpc->rxbpre_datasize, DMA_FROM_DEVICE); 686 672 if (dma_mapping_error(dev, da)) { 687 - put_page(virt_to_head_page(va)); 673 + put_page(page); 688 674 goto error; 689 675 } 690 676 ··· 1662 1676 } 1663 1677 1664 1678 static void *mana_get_rxfrag(struct mana_rxq *rxq, struct device *dev, 1665 - dma_addr_t *da, bool *from_pool, bool is_napi) 1679 + dma_addr_t *da, bool *from_pool) 1666 1680 { 1667 1681 struct page *page; 1668 1682 void *va; ··· 1673 1687 if (rxq->xdp_save_va) { 1674 1688 va = rxq->xdp_save_va; 1675 1689 rxq->xdp_save_va = NULL; 1676 - } else if (rxq->alloc_size > PAGE_SIZE) { 1677 - if (is_napi) 1678 - va = napi_alloc_frag(rxq->alloc_size); 1679 - else 1680 - va = netdev_alloc_frag(rxq->alloc_size); 1681 - 1682 - if (!va) 1683 - return NULL; 1684 - 1685 - page = virt_to_head_page(va); 1686 - /* Check if the frag falls back to single page */ 1687 - if (compound_order(page) < get_order(rxq->alloc_size)) { 1688 - put_page(page); 1689 - return NULL; 1690 - } 1691 1690 } else { 1692 1691 page = page_pool_dev_alloc_pages(rxq->page_pool); 1693 1692 if (!page) ··· 1705 1734 dma_addr_t da; 1706 1735 void *va; 1707 1736 1708 - va = mana_get_rxfrag(rxq, dev, &da, &from_pool, true); 1737 + va = mana_get_rxfrag(rxq, dev, &da, &from_pool); 1709 1738 if (!va) 1710 1739 return; 1711 1740 ··· 2147 2176 if (mpc->rxbufs_pre) 2148 2177 va = mana_get_rxbuf_pre(rxq, &da); 2149 2178 else 2150 - va = mana_get_rxfrag(rxq, dev, &da, &from_pool, false); 2179 + va = mana_get_rxfrag(rxq, dev, &da, &from_pool); 2151 2180 2152 2181 if (!va) 2153 2182 return -ENOMEM; ··· 2233 2262 pprm.nid = gc->numa_node; 2234 2263 pprm.napi = &rxq->rx_cq.napi; 2235 2264 pprm.netdev = rxq->ndev; 2265 + pprm.order = get_order(rxq->alloc_size); 2236 2266 2237 2267 rxq->page_pool = page_pool_create(&pprm); 2238 2268
+3 -3
drivers/net/phy/broadcom.c
··· 859 859 return reg; 860 860 861 861 /* Unmask events we are interested in and mask interrupts globally. */ 862 - if (phydev->phy_id == PHY_ID_BCM5221) 862 + if (phydev->drv->phy_id == PHY_ID_BCM5221) 863 863 reg = MII_BRCM_FET_IR_ENABLE | 864 864 MII_BRCM_FET_IR_MASK; 865 865 else ··· 888 888 return err; 889 889 } 890 890 891 - if (phydev->phy_id != PHY_ID_BCM5221) { 891 + if (phydev->drv->phy_id != PHY_ID_BCM5221) { 892 892 /* Set the LED mode */ 893 893 reg = __phy_read(phydev, MII_BRCM_FET_SHDW_AUXMODE4); 894 894 if (reg < 0) { ··· 1009 1009 return err; 1010 1010 } 1011 1011 1012 - if (phydev->phy_id == PHY_ID_BCM5221) 1012 + if (phydev->drv->phy_id == PHY_ID_BCM5221) 1013 1013 /* Force Low Power Mode with clock enabled */ 1014 1014 reg = BCM5221_SHDW_AM4_EN_CLK_LPM | BCM5221_SHDW_AM4_FORCE_LPM; 1015 1015 else
+14 -2
drivers/net/usb/rndis_host.c
··· 630 630 .tx_fixup = rndis_tx_fixup, 631 631 }; 632 632 633 + static const struct driver_info wwan_rndis_info = { 634 + .description = "Mobile Broadband RNDIS device", 635 + .flags = FLAG_WWAN | FLAG_POINTTOPOINT | FLAG_FRAMING_RN | FLAG_NO_SETINT, 636 + .bind = rndis_bind, 637 + .unbind = rndis_unbind, 638 + .status = rndis_status, 639 + .rx_fixup = rndis_rx_fixup, 640 + .tx_fixup = rndis_tx_fixup, 641 + }; 642 + 633 643 /*-------------------------------------------------------------------------*/ 634 644 635 645 static const struct usb_device_id products [] = { ··· 676 666 USB_INTERFACE_INFO(USB_CLASS_WIRELESS_CONTROLLER, 1, 3), 677 667 .driver_info = (unsigned long) &rndis_info, 678 668 }, { 679 - /* Novatel Verizon USB730L */ 669 + /* Mobile Broadband Modem, seen in Novatel Verizon USB730L and 670 + * Telit FN990A (RNDIS) 671 + */ 680 672 USB_INTERFACE_INFO(USB_CLASS_MISC, 4, 1), 681 - .driver_info = (unsigned long) &rndis_info, 673 + .driver_info = (unsigned long)&wwan_rndis_info, 682 674 }, 683 675 { }, // END 684 676 };
+15 -6
drivers/net/usb/usbnet.c
··· 178 178 } 179 179 EXPORT_SYMBOL_GPL(usbnet_get_ethernet_addr); 180 180 181 + static bool usbnet_needs_usb_name_format(struct usbnet *dev, struct net_device *net) 182 + { 183 + /* Point to point devices which don't have a real MAC address 184 + * (or report a fake local one) have historically used the usb%d 185 + * naming. Preserve this.. 186 + */ 187 + return (dev->driver_info->flags & FLAG_POINTTOPOINT) != 0 && 188 + (is_zero_ether_addr(net->dev_addr) || 189 + is_local_ether_addr(net->dev_addr)); 190 + } 191 + 181 192 static void intr_complete (struct urb *urb) 182 193 { 183 194 struct usbnet *dev = urb->context; ··· 1773 1762 if (status < 0) 1774 1763 goto out1; 1775 1764 1776 - // heuristic: "usb%d" for links we know are two-host, 1777 - // else "eth%d" when there's reasonable doubt. userspace 1778 - // can rename the link if it knows better. 1765 + /* heuristic: rename to "eth%d" if we are not sure this link 1766 + * is two-host (these links keep "usb%d") 1767 + */ 1779 1768 if ((dev->driver_info->flags & FLAG_ETHER) != 0 && 1780 - ((dev->driver_info->flags & FLAG_POINTTOPOINT) == 0 || 1781 - /* somebody touched it*/ 1782 - !is_zero_ether_addr(net->dev_addr))) 1769 + !usbnet_needs_usb_name_format(dev, net)) 1783 1770 strscpy(net->name, "eth%d", sizeof(net->name)); 1784 1771 /* WLAN devices should always be named "wlan%d" */ 1785 1772 if ((dev->driver_info->flags & FLAG_WLAN) != 0)
+2
drivers/net/wan/lapbether.c
··· 39 39 #include <linux/lapb.h> 40 40 #include <linux/init.h> 41 41 42 + #include <net/netdev_lock.h> 42 43 #include <net/x25device.h> 43 44 44 45 static const u8 bcast_addr[6] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; ··· 367 366 368 367 static void lapbeth_setup(struct net_device *dev) 369 368 { 369 + netdev_lockdep_set_classes(dev); 370 370 dev->netdev_ops = &lapbeth_netdev_ops; 371 371 dev->needs_free_netdev = true; 372 372 dev->type = ARPHRD_X25;
-15
include/net/tcp.h
··· 779 779 780 780 /* tcp.c */ 781 781 void tcp_get_info(struct sock *, struct tcp_info *); 782 - void tcp_sock_rfree(struct sk_buff *skb); 783 782 784 783 /* Read 'sendfile()'-style from a TCP socket */ 785 784 int tcp_read_sock(struct sock *sk, read_descriptor_t *desc, ··· 2897 2898 const struct request_sock *req, const struct sk_buff *skb, 2898 2899 const void *saddr, const void *daddr, 2899 2900 int family, int dif, int sdif); 2900 - 2901 - /* version of skb_set_owner_r() avoiding one atomic_add() */ 2902 - static inline void tcp_skb_set_owner_r(struct sk_buff *skb, struct sock *sk) 2903 - { 2904 - skb_orphan(skb); 2905 - skb->sk = sk; 2906 - skb->destructor = tcp_sock_rfree; 2907 - 2908 - sock_owned_by_me(sk); 2909 - atomic_set(&sk->sk_rmem_alloc, 2910 - atomic_read(&sk->sk_rmem_alloc) + skb->truesize); 2911 - 2912 - sk_forward_alloc_add(sk, -skb->truesize); 2913 - } 2914 2901 2915 2902 #endif /* _TCP_H */
+4 -2
net/core/netdev-genl.c
··· 951 951 { 952 952 struct net_devmem_dmabuf_binding *binding; 953 953 struct net_devmem_dmabuf_binding *temp; 954 + struct net_device *dev; 954 955 955 956 mutex_lock(&priv->lock); 956 957 list_for_each_entry_safe(binding, temp, &priv->bindings, list) { 957 - netdev_lock(binding->dev); 958 + dev = binding->dev; 959 + netdev_lock(dev); 958 960 net_devmem_unbind_dmabuf(binding); 959 - netdev_unlock(binding->dev); 961 + netdev_unlock(dev); 960 962 } 961 963 mutex_unlock(&priv->lock); 962 964 }
+3
net/core/rtnetlink.c
··· 1177 1177 /* IFLA_VF_STATS_TX_DROPPED */ 1178 1178 nla_total_size_64bit(sizeof(__u64))); 1179 1179 } 1180 + if (dev->netdev_ops->ndo_get_vf_guid) 1181 + size += num_vfs * 2 * 1182 + nla_total_size(sizeof(struct ifla_vf_guid)); 1180 1183 return size; 1181 1184 } else 1182 1185 return 0;
+2 -16
net/ipv4/tcp.c
··· 1525 1525 __tcp_cleanup_rbuf(sk, copied); 1526 1526 } 1527 1527 1528 - /* private version of sock_rfree() avoiding one atomic_sub() */ 1529 - void tcp_sock_rfree(struct sk_buff *skb) 1530 - { 1531 - struct sock *sk = skb->sk; 1532 - unsigned int len = skb->truesize; 1533 - 1534 - sock_owned_by_me(sk); 1535 - atomic_set(&sk->sk_rmem_alloc, 1536 - atomic_read(&sk->sk_rmem_alloc) - len); 1537 - 1538 - sk_forward_alloc_add(sk, len); 1539 - sk_mem_reclaim(sk); 1540 - } 1541 - 1542 1528 static void tcp_eat_recv_skb(struct sock *sk, struct sk_buff *skb) 1543 1529 { 1544 1530 __skb_unlink(skb, &sk->sk_receive_queue); 1545 - if (likely(skb->destructor == tcp_sock_rfree)) { 1546 - tcp_sock_rfree(skb); 1531 + if (likely(skb->destructor == sock_rfree)) { 1532 + sock_rfree(skb); 1547 1533 skb->destructor = NULL; 1548 1534 skb->sk = NULL; 1549 1535 return skb_attempt_defer_free(skb);
+1 -1
net/ipv4/tcp_fastopen.c
··· 189 189 tcp_segs_in(tp, skb); 190 190 __skb_pull(skb, tcp_hdrlen(skb)); 191 191 sk_forced_mem_schedule(sk, skb->truesize); 192 - tcp_skb_set_owner_r(skb, sk); 192 + skb_set_owner_r(skb, sk); 193 193 194 194 TCP_SKB_CB(skb)->seq++; 195 195 TCP_SKB_CB(skb)->tcp_flags &= ~TCPHDR_SYN;
+3 -3
net/ipv4/tcp_input.c
··· 5171 5171 if (tcp_is_sack(tp)) 5172 5172 tcp_grow_window(sk, skb, false); 5173 5173 skb_condense(skb); 5174 - tcp_skb_set_owner_r(skb, sk); 5174 + skb_set_owner_r(skb, sk); 5175 5175 } 5176 5176 } 5177 5177 ··· 5187 5187 tcp_rcv_nxt_update(tcp_sk(sk), TCP_SKB_CB(skb)->end_seq); 5188 5188 if (!eaten) { 5189 5189 tcp_add_receive_queue(sk, skb); 5190 - tcp_skb_set_owner_r(skb, sk); 5190 + skb_set_owner_r(skb, sk); 5191 5191 } 5192 5192 return eaten; 5193 5193 } ··· 5504 5504 __skb_queue_before(list, skb, nskb); 5505 5505 else 5506 5506 __skb_queue_tail(&tmp, nskb); /* defer rbtree insertion */ 5507 - tcp_skb_set_owner_r(nskb, sk); 5507 + skb_set_owner_r(nskb, sk); 5508 5508 mptcp_skb_ext_move(nskb, skb); 5509 5509 5510 5510 /* Copy data, releasing collapsed skbs. */
+8 -7
net/mptcp/subflow.c
··· 754 754 755 755 subflow_req = mptcp_subflow_rsk(req); 756 756 msk = subflow_req->msk; 757 - if (!msk) 758 - return false; 759 757 760 758 subflow_generate_hmac(READ_ONCE(msk->remote_key), 761 759 READ_ONCE(msk->local_key), ··· 848 850 849 851 } else if (subflow_req->mp_join) { 850 852 mptcp_get_options(skb, &mp_opt); 851 - if (!(mp_opt.suboptions & OPTION_MPTCP_MPJ_ACK) || 852 - !subflow_hmac_valid(req, &mp_opt) || 853 - !mptcp_can_accept_new_subflow(subflow_req->msk)) { 854 - SUBFLOW_REQ_INC_STATS(req, MPTCP_MIB_JOINACKMAC); 853 + if (!(mp_opt.suboptions & OPTION_MPTCP_MPJ_ACK)) 855 854 fallback = true; 856 - } 857 855 } 858 856 859 857 create_child: ··· 895 901 } else if (ctx->mp_join) { 896 902 owner = subflow_req->msk; 897 903 if (!owner) { 904 + subflow_add_reset_reason(skb, MPTCP_RST_EPROHIBIT); 905 + goto dispose_child; 906 + } 907 + 908 + if (!subflow_hmac_valid(req, &mp_opt) || 909 + !mptcp_can_accept_new_subflow(subflow_req->msk)) { 910 + SUBFLOW_REQ_INC_STATS(req, MPTCP_MIB_JOINACKMAC); 898 911 subflow_add_reset_reason(skb, MPTCP_RST_EPROHIBIT); 899 912 goto dispose_child; 900 913 }
+27 -46
net/sched/sch_api.c
··· 1267 1267 struct qdisc_size_table *stab; 1268 1268 1269 1269 ops = qdisc_lookup_ops(kind); 1270 - #ifdef CONFIG_MODULES 1271 - if (ops == NULL && kind != NULL) { 1272 - char name[IFNAMSIZ]; 1273 - if (nla_strscpy(name, kind, IFNAMSIZ) >= 0) { 1274 - /* We dropped the RTNL semaphore in order to 1275 - * perform the module load. So, even if we 1276 - * succeeded in loading the module we have to 1277 - * tell the caller to replay the request. We 1278 - * indicate this using -EAGAIN. 1279 - * We replay the request because the device may 1280 - * go away in the mean time. 1281 - */ 1282 - netdev_unlock_ops(dev); 1283 - rtnl_unlock(); 1284 - request_module(NET_SCH_ALIAS_PREFIX "%s", name); 1285 - rtnl_lock(); 1286 - netdev_lock_ops(dev); 1287 - ops = qdisc_lookup_ops(kind); 1288 - if (ops != NULL) { 1289 - /* We will try again qdisc_lookup_ops, 1290 - * so don't keep a reference. 1291 - */ 1292 - module_put(ops->owner); 1293 - err = -EAGAIN; 1294 - goto err_out; 1295 - } 1296 - } 1297 - } 1298 - #endif 1299 - 1300 - err = -ENOENT; 1301 1270 if (!ops) { 1271 + err = -ENOENT; 1302 1272 NL_SET_ERR_MSG(extack, "Specified qdisc kind is unknown"); 1303 1273 goto err_out; 1304 1274 } ··· 1593 1623 struct netlink_ext_ack *extack, 1594 1624 struct net_device *dev, 1595 1625 struct nlattr *tca[TCA_MAX + 1], 1596 - struct tcmsg *tcm, 1597 - bool *replay) 1626 + struct tcmsg *tcm) 1598 1627 { 1599 1628 struct Qdisc *q = NULL; 1600 1629 struct Qdisc *p = NULL; ··· 1758 1789 tcm->tcm_parent, tcm->tcm_handle, 1759 1790 tca, &err, extack); 1760 1791 } 1761 - if (q == NULL) { 1762 - if (err == -EAGAIN) { 1763 - *replay = true; 1764 - return 0; 1765 - } 1792 + if (!q) 1766 1793 return err; 1767 - } 1768 1794 1769 1795 graft: 1770 1796 err = qdisc_graft(dev, p, skb, n, clid, q, NULL, extack); ··· 1772 1808 return 0; 1773 1809 } 1774 1810 1811 + static void request_qdisc_module(struct nlattr *kind) 1812 + { 1813 + struct Qdisc_ops *ops; 1814 + char name[IFNAMSIZ]; 1815 + 1816 + if (!kind) 1817 + return; 1818 + 1819 + ops = qdisc_lookup_ops(kind); 1820 + if (ops) { 1821 + module_put(ops->owner); 1822 + return; 1823 + } 1824 + 1825 + if (nla_strscpy(name, kind, IFNAMSIZ) >= 0) { 1826 + rtnl_unlock(); 1827 + request_module(NET_SCH_ALIAS_PREFIX "%s", name); 1828 + rtnl_lock(); 1829 + } 1830 + } 1831 + 1775 1832 /* 1776 1833 * Create/change qdisc. 1777 1834 */ ··· 1803 1818 struct nlattr *tca[TCA_MAX + 1]; 1804 1819 struct net_device *dev; 1805 1820 struct tcmsg *tcm; 1806 - bool replay; 1807 1821 int err; 1808 1822 1809 - replay: 1810 - /* Reinit, just in case something touches this. */ 1811 1823 err = nlmsg_parse_deprecated(n, sizeof(*tcm), tca, TCA_MAX, 1812 1824 rtm_tca_policy, extack); 1813 1825 if (err < 0) 1814 1826 return err; 1827 + 1828 + request_qdisc_module(tca[TCA_KIND]); 1815 1829 1816 1830 tcm = nlmsg_data(n); 1817 1831 dev = __dev_get_by_index(net, tcm->tcm_ifindex); 1818 1832 if (!dev) 1819 1833 return -ENODEV; 1820 1834 1821 - replay = false; 1822 1835 netdev_lock_ops(dev); 1823 - err = __tc_modify_qdisc(skb, n, extack, dev, tca, tcm, &replay); 1836 + err = __tc_modify_qdisc(skb, n, extack, dev, tca, tcm); 1824 1837 netdev_unlock_ops(dev); 1825 - if (replay) 1826 - goto replay; 1827 1838 1828 1839 return err; 1829 1840 }
+1 -1
tools/testing/selftests/drivers/net/hds.py
··· 20 20 21 21 22 22 def _xdp_onoff(cfg): 23 - prog = cfg.rpath("../../net/lib/xdp_dummy.bpf.o") 23 + prog = cfg.net_lib_dir / "xdp_dummy.bpf.o" 24 24 ip("link set dev %s xdp obj %s sec xdp" % 25 25 (cfg.ifname, prog)) 26 26 ip("link set dev %s xdp off" % cfg.ifname)
+1 -1
tools/testing/selftests/drivers/net/hw/csum.py
··· 88 88 with NetDrvEpEnv(__file__, nsim_test=False) as cfg: 89 89 check_nic_features(cfg) 90 90 91 - cfg.bin_local = cfg.rpath("../../../net/lib/csum") 91 + cfg.bin_local = cfg.net_lib_dir / "csum" 92 92 cfg.bin_remote = cfg.remote.deploy(cfg.bin_local) 93 93 94 94 cases = []
+1 -1
tools/testing/selftests/drivers/net/hw/irq.py
··· 69 69 def check_reconfig_xdp(cfg) -> None: 70 70 def reconfig(cfg) -> None: 71 71 ip(f"link set dev %s xdp obj %s sec xdp" % 72 - (cfg.ifname, cfg.rpath("xdp_dummy.bpf.o"))) 72 + (cfg.ifname, cfg.net_lib_dir / "xdp_dummy.bpf.o")) 73 73 ip(f"link set dev %s xdp off" % cfg.ifname) 74 74 75 75 _check_reconfig(cfg, reconfig)
-13
tools/testing/selftests/drivers/net/hw/xdp_dummy.bpf.c
··· 1 - // SPDX-License-Identifier: GPL-2.0 2 - 3 - #define KBUILD_MODNAME "xdp_dummy" 4 - #include <linux/bpf.h> 5 - #include <bpf/bpf_helpers.h> 6 - 7 - SEC("xdp") 8 - int xdp_dummy_prog(struct xdp_md *ctx) 9 - { 10 - return XDP_PASS; 11 - } 12 - 13 - char _license[] SEC("license") = "GPL";
+8 -13
tools/testing/selftests/drivers/net/lib/py/env.py
··· 13 13 class NetDrvEnvBase: 14 14 """ 15 15 Base class for a NIC / host envirnoments 16 + 17 + Attributes: 18 + test_dir: Path to the source directory of the test 19 + net_lib_dir: Path to the net/lib directory 16 20 """ 17 21 def __init__(self, src_path): 18 - self.src_path = src_path 22 + self.src_path = Path(src_path) 23 + self.test_dir = self.src_path.parent.resolve() 24 + self.net_lib_dir = (Path(__file__).parent / "../../../../net/lib").resolve() 25 + 19 26 self.env = self._load_env_file() 20 - 21 - def rpath(self, path): 22 - """ 23 - Get an absolute path to a file based on a path relative to the directory 24 - containing the test which constructed env. 25 - 26 - For example, if the test.py is in the same directory as 27 - a binary (built from helper.c), the test can use env.rpath("helper") 28 - to get the absolute path to the binary 29 - """ 30 - src_dir = Path(self.src_path).parent.resolve() 31 - return (src_dir / path).as_posix() 32 27 33 28 def _load_env_file(self): 34 29 env = os.environ.copy()
+5 -10
tools/testing/selftests/drivers/net/ping.py
··· 56 56 return 57 57 58 58 def _set_xdp_generic_sb_on(cfg) -> None: 59 - test_dir = os.path.dirname(os.path.realpath(__file__)) 60 - prog = test_dir + "/../../net/lib/xdp_dummy.bpf.o" 59 + prog = cfg.net_lib_dir / "xdp_dummy.bpf.o" 61 60 cmd(f"ip link set dev {remote_ifname} mtu 1500", shell=True, host=cfg.remote) 62 61 cmd(f"ip link set dev {cfg.ifname} mtu 1500 xdpgeneric obj {prog} sec xdp", shell=True) 63 62 defer(cmd, f"ip link set dev {cfg.ifname} xdpgeneric off") ··· 65 66 time.sleep(10) 66 67 67 68 def _set_xdp_generic_mb_on(cfg) -> None: 68 - test_dir = os.path.dirname(os.path.realpath(__file__)) 69 - prog = test_dir + "/../../net/lib/xdp_dummy.bpf.o" 69 + prog = cfg.net_lib_dir / "xdp_dummy.bpf.o" 70 70 cmd(f"ip link set dev {remote_ifname} mtu 9000", shell=True, host=cfg.remote) 71 71 defer(ip, f"link set dev {remote_ifname} mtu 1500", host=cfg.remote) 72 72 ip("link set dev %s mtu 9000 xdpgeneric obj %s sec xdp.frags" % (cfg.ifname, prog)) ··· 75 77 time.sleep(10) 76 78 77 79 def _set_xdp_native_sb_on(cfg) -> None: 78 - test_dir = os.path.dirname(os.path.realpath(__file__)) 79 - prog = test_dir + "/../../net/lib/xdp_dummy.bpf.o" 80 + prog = cfg.net_lib_dir / "xdp_dummy.bpf.o" 80 81 cmd(f"ip link set dev {remote_ifname} mtu 1500", shell=True, host=cfg.remote) 81 82 cmd(f"ip -j link set dev {cfg.ifname} mtu 1500 xdp obj {prog} sec xdp", shell=True) 82 83 defer(ip, f"link set dev {cfg.ifname} mtu 1500 xdp off") ··· 92 95 time.sleep(10) 93 96 94 97 def _set_xdp_native_mb_on(cfg) -> None: 95 - test_dir = os.path.dirname(os.path.realpath(__file__)) 96 - prog = test_dir + "/../../net/lib/xdp_dummy.bpf.o" 98 + prog = cfg.net_lib_dir / "xdp_dummy.bpf.o" 97 99 cmd(f"ip link set dev {remote_ifname} mtu 9000", shell=True, host=cfg.remote) 98 100 defer(ip, f"link set dev {remote_ifname} mtu 1500", host=cfg.remote) 99 101 try: ··· 105 109 time.sleep(10) 106 110 107 111 def _set_xdp_offload_on(cfg) -> None: 108 - test_dir = os.path.dirname(os.path.realpath(__file__)) 109 - prog = test_dir + "/../../net/lib/xdp_dummy.bpf.o" 112 + prog = cfg.net_lib_dir / "xdp_dummy.bpf.o" 110 113 cmd(f"ip link set dev {cfg.ifname} mtu 1500", shell=True) 111 114 try: 112 115 cmd(f"ip link set dev {cfg.ifname} xdpoffload obj {prog} sec xdp", shell=True)
+2 -2
tools/testing/selftests/drivers/net/queues.py
··· 26 26 27 27 def check_xsk(cfg, nl, xdp_queue_id=0) -> None: 28 28 # Probe for support 29 - xdp = cmd(cfg.rpath("xdp_helper") + ' - -', fail=False) 29 + xdp = cmd(f'{cfg.test_dir / "xdp_helper"} - -', fail=False) 30 30 if xdp.ret == 255: 31 31 raise KsftSkipEx('AF_XDP unsupported') 32 32 elif xdp.ret > 0: 33 33 raise KsftFailEx('unable to create AF_XDP socket') 34 34 35 - with bkg(f'{cfg.rpath("xdp_helper")} {cfg.ifindex} {xdp_queue_id}', 35 + with bkg(f'{cfg.test_dir / "xdp_helper"} {cfg.ifindex} {xdp_queue_id}', 36 36 ksft_wait=3): 37 37 38 38 rx = tx = False
+1
tools/testing/selftests/net/mptcp/.gitignore
··· 1 1 # SPDX-License-Identifier: GPL-2.0-only 2 2 mptcp_connect 3 + mptcp_diag 3 4 mptcp_inq 4 5 mptcp_sockopt 5 6 pm_nl_ctl
+7 -4
tools/testing/selftests/net/mptcp/mptcp_connect.c
··· 1270 1270 1271 1271 if (cfg_input && cfg_sockopt_types.mptfo) { 1272 1272 fd_in = open(cfg_input, O_RDONLY); 1273 - if (fd < 0) 1273 + if (fd_in < 0) 1274 1274 xerror("can't open %s:%d", cfg_input, errno); 1275 1275 } 1276 1276 ··· 1293 1293 1294 1294 if (cfg_input && !cfg_sockopt_types.mptfo) { 1295 1295 fd_in = open(cfg_input, O_RDONLY); 1296 - if (fd < 0) 1296 + if (fd_in < 0) 1297 1297 xerror("can't open %s:%d", cfg_input, errno); 1298 1298 } 1299 1299 1300 1300 ret = copyfd_io(fd_in, fd, 1, 0, &winfo); 1301 1301 if (ret) 1302 - return ret; 1302 + goto out; 1303 1303 1304 1304 if (cfg_truncate > 0) { 1305 1305 shutdown(fd, SHUT_WR); ··· 1320 1320 close(fd); 1321 1321 } 1322 1322 1323 - return 0; 1323 + out: 1324 + if (cfg_input) 1325 + close(fd_in); 1326 + return ret; 1324 1327 } 1325 1328 1326 1329 int parse_proto(const char *proto)
+1 -1
tools/testing/selftests/net/udpgro_bench.sh
··· 7 7 8 8 readonly PEER_NS="ns-peer-$(mktemp -u XXXXXX)" 9 9 10 - BPF_FILE="xdp_dummy.bpf.o" 10 + BPF_FILE="lib/xdp_dummy.bpf.o" 11 11 12 12 cleanup() { 13 13 local -r jobs="$(jobs -p)"
+1 -1
tools/testing/selftests/net/udpgro_frglist.sh
··· 7 7 8 8 readonly PEER_NS="ns-peer-$(mktemp -u XXXXXX)" 9 9 10 - BPF_FILE="xdp_dummy.bpf.o" 10 + BPF_FILE="lib/xdp_dummy.bpf.o" 11 11 12 12 cleanup() { 13 13 local -r jobs="$(jobs -p)"
+1 -1
tools/testing/selftests/net/udpgro_fwd.sh
··· 3 3 4 4 source net_helper.sh 5 5 6 - BPF_FILE="xdp_dummy.bpf.o" 6 + BPF_FILE="lib/xdp_dummy.bpf.o" 7 7 readonly BASE="ns-$(mktemp -u XXXXXX)" 8 8 readonly SRC=2 9 9 readonly DST=1
+1 -1
tools/testing/selftests/net/veth.sh
··· 1 1 #!/bin/sh 2 2 # SPDX-License-Identifier: GPL-2.0 3 3 4 - BPF_FILE="xdp_dummy.bpf.o" 4 + BPF_FILE="lib/xdp_dummy.bpf.o" 5 5 readonly STATS="$(mktemp -p /tmp ns-XXXXXX)" 6 6 readonly BASE=`basename $STATS` 7 7 readonly SRC=2
-13
tools/testing/selftests/net/xdp_dummy.bpf.c
··· 1 - // SPDX-License-Identifier: GPL-2.0 2 - 3 - #define KBUILD_MODNAME "xdp_dummy" 4 - #include <linux/bpf.h> 5 - #include <bpf/bpf_helpers.h> 6 - 7 - SEC("xdp") 8 - int xdp_dummy_prog(struct xdp_md *ctx) 9 - { 10 - return XDP_PASS; 11 - } 12 - 13 - char _license[] SEC("license") = "GPL";