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 branch 'net-common-feature-compute-for-upper-interface'

Hangbin Liu says:

====================
net: common feature compute for upper interface

Some high-level virtual drivers need to compute features from their
lower devices, but each currently has its own implementation and may
miss some feature computations. This patch set introduces a common function
to compute features for such devices.

Currently, bonding, team, and bridge have been updated to use the new
helper.
====================

Link: https://patch.msgid.link/20251017034155.61990-1-liuhangbin@gmail.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

+120 -191
+4 -95
drivers/net/bonding/bond_main.c
··· 1468 1468 return features; 1469 1469 } 1470 1470 1471 - #define BOND_VLAN_FEATURES (NETIF_F_HW_CSUM | NETIF_F_SG | \ 1472 - NETIF_F_FRAGLIST | NETIF_F_GSO_SOFTWARE | \ 1473 - NETIF_F_GSO_ENCAP_ALL | \ 1474 - NETIF_F_HIGHDMA | NETIF_F_LRO) 1475 - 1476 - #define BOND_ENC_FEATURES (NETIF_F_HW_CSUM | NETIF_F_SG | \ 1477 - NETIF_F_RXCSUM | NETIF_F_GSO_SOFTWARE | \ 1478 - NETIF_F_GSO_PARTIAL) 1479 - 1480 - #define BOND_MPLS_FEATURES (NETIF_F_HW_CSUM | NETIF_F_SG | \ 1481 - NETIF_F_GSO_SOFTWARE) 1482 - 1483 - #define BOND_GSO_PARTIAL_FEATURES (NETIF_F_GSO_ESP) 1484 - 1485 - 1486 - static void bond_compute_features(struct bonding *bond) 1487 - { 1488 - netdev_features_t gso_partial_features = BOND_GSO_PARTIAL_FEATURES; 1489 - unsigned int dst_release_flag = IFF_XMIT_DST_RELEASE | 1490 - IFF_XMIT_DST_RELEASE_PERM; 1491 - netdev_features_t vlan_features = BOND_VLAN_FEATURES; 1492 - netdev_features_t enc_features = BOND_ENC_FEATURES; 1493 - #ifdef CONFIG_XFRM_OFFLOAD 1494 - netdev_features_t xfrm_features = BOND_XFRM_FEATURES; 1495 - #endif /* CONFIG_XFRM_OFFLOAD */ 1496 - netdev_features_t mpls_features = BOND_MPLS_FEATURES; 1497 - struct net_device *bond_dev = bond->dev; 1498 - struct list_head *iter; 1499 - struct slave *slave; 1500 - unsigned short max_hard_header_len = ETH_HLEN; 1501 - unsigned int tso_max_size = TSO_MAX_SIZE; 1502 - u16 tso_max_segs = TSO_MAX_SEGS; 1503 - 1504 - if (!bond_has_slaves(bond)) 1505 - goto done; 1506 - 1507 - vlan_features = netdev_base_features(vlan_features); 1508 - mpls_features = netdev_base_features(mpls_features); 1509 - 1510 - bond_for_each_slave(bond, slave, iter) { 1511 - vlan_features = netdev_increment_features(vlan_features, 1512 - slave->dev->vlan_features, BOND_VLAN_FEATURES); 1513 - 1514 - enc_features = netdev_increment_features(enc_features, 1515 - slave->dev->hw_enc_features, 1516 - BOND_ENC_FEATURES); 1517 - 1518 - #ifdef CONFIG_XFRM_OFFLOAD 1519 - xfrm_features = netdev_increment_features(xfrm_features, 1520 - slave->dev->hw_enc_features, 1521 - BOND_XFRM_FEATURES); 1522 - #endif /* CONFIG_XFRM_OFFLOAD */ 1523 - 1524 - gso_partial_features = netdev_increment_features(gso_partial_features, 1525 - slave->dev->gso_partial_features, 1526 - BOND_GSO_PARTIAL_FEATURES); 1527 - 1528 - mpls_features = netdev_increment_features(mpls_features, 1529 - slave->dev->mpls_features, 1530 - BOND_MPLS_FEATURES); 1531 - 1532 - dst_release_flag &= slave->dev->priv_flags; 1533 - if (slave->dev->hard_header_len > max_hard_header_len) 1534 - max_hard_header_len = slave->dev->hard_header_len; 1535 - 1536 - tso_max_size = min(tso_max_size, slave->dev->tso_max_size); 1537 - tso_max_segs = min(tso_max_segs, slave->dev->tso_max_segs); 1538 - } 1539 - bond_dev->hard_header_len = max_hard_header_len; 1540 - 1541 - done: 1542 - bond_dev->gso_partial_features = gso_partial_features; 1543 - bond_dev->vlan_features = vlan_features; 1544 - bond_dev->hw_enc_features = enc_features | NETIF_F_GSO_ENCAP_ALL | 1545 - NETIF_F_HW_VLAN_CTAG_TX | 1546 - NETIF_F_HW_VLAN_STAG_TX; 1547 - #ifdef CONFIG_XFRM_OFFLOAD 1548 - bond_dev->hw_enc_features |= xfrm_features; 1549 - #endif /* CONFIG_XFRM_OFFLOAD */ 1550 - bond_dev->mpls_features = mpls_features; 1551 - netif_set_tso_max_segs(bond_dev, tso_max_segs); 1552 - netif_set_tso_max_size(bond_dev, tso_max_size); 1553 - 1554 - bond_dev->priv_flags &= ~IFF_XMIT_DST_RELEASE; 1555 - if ((bond_dev->priv_flags & IFF_XMIT_DST_RELEASE_PERM) && 1556 - dst_release_flag == (IFF_XMIT_DST_RELEASE | IFF_XMIT_DST_RELEASE_PERM)) 1557 - bond_dev->priv_flags |= IFF_XMIT_DST_RELEASE; 1558 - 1559 - netdev_change_features(bond_dev); 1560 - } 1561 - 1562 1471 static void bond_setup_by_slave(struct net_device *bond_dev, 1563 1472 struct net_device *slave_dev) 1564 1473 { ··· 2182 2273 } 2183 2274 2184 2275 bond->slave_cnt++; 2185 - bond_compute_features(bond); 2276 + netdev_compute_master_upper_features(bond->dev, true); 2186 2277 bond_set_carrier(bond); 2187 2278 2188 2279 /* Needs to be called before bond_select_active_slave(), which will ··· 2434 2525 call_netdevice_notifiers(NETDEV_RELEASE, bond->dev); 2435 2526 } 2436 2527 2437 - bond_compute_features(bond); 2528 + netdev_compute_master_upper_features(bond->dev, true); 2438 2529 if (!(bond_dev->features & NETIF_F_VLAN_CHALLENGED) && 2439 2530 (old_features & NETIF_F_VLAN_CHALLENGED)) 2440 2531 slave_info(bond_dev, slave_dev, "last VLAN challenged slave left bond - VLAN blocking is removed\n"); ··· 3937 4028 case NETDEV_FEAT_CHANGE: 3938 4029 if (!bond->notifier_ctx) { 3939 4030 bond->notifier_ctx = true; 3940 - bond_compute_features(bond); 4031 + netdev_compute_master_upper_features(bond->dev, true); 3941 4032 bond->notifier_ctx = false; 3942 4033 } 3943 4034 break; ··· 5920 6011 * capable 5921 6012 */ 5922 6013 5923 - bond_dev->hw_features = BOND_VLAN_FEATURES | 6014 + bond_dev->hw_features = MASTER_UPPER_DEV_VLAN_FEATURES | 5924 6015 NETIF_F_HW_VLAN_CTAG_RX | 5925 6016 NETIF_F_HW_VLAN_CTAG_FILTER | 5926 6017 NETIF_F_HW_VLAN_STAG_RX |
+6 -77
drivers/net/team/team_core.c
··· 982 982 team_lower_state_changed(port); 983 983 } 984 984 985 - #define TEAM_VLAN_FEATURES (NETIF_F_HW_CSUM | NETIF_F_SG | \ 986 - NETIF_F_FRAGLIST | NETIF_F_GSO_SOFTWARE | \ 987 - NETIF_F_HIGHDMA | NETIF_F_LRO | \ 988 - NETIF_F_GSO_ENCAP_ALL) 989 - 990 - #define TEAM_ENC_FEATURES (NETIF_F_HW_CSUM | NETIF_F_SG | \ 991 - NETIF_F_RXCSUM | NETIF_F_GSO_SOFTWARE) 992 - 993 - static void __team_compute_features(struct team *team) 994 - { 995 - struct team_port *port; 996 - netdev_features_t vlan_features = TEAM_VLAN_FEATURES; 997 - netdev_features_t enc_features = TEAM_ENC_FEATURES; 998 - unsigned short max_hard_header_len = ETH_HLEN; 999 - unsigned int dst_release_flag = IFF_XMIT_DST_RELEASE | 1000 - IFF_XMIT_DST_RELEASE_PERM; 1001 - 1002 - rcu_read_lock(); 1003 - if (list_empty(&team->port_list)) 1004 - goto done; 1005 - 1006 - vlan_features = netdev_base_features(vlan_features); 1007 - enc_features = netdev_base_features(enc_features); 1008 - 1009 - list_for_each_entry_rcu(port, &team->port_list, list) { 1010 - vlan_features = netdev_increment_features(vlan_features, 1011 - port->dev->vlan_features, 1012 - TEAM_VLAN_FEATURES); 1013 - enc_features = 1014 - netdev_increment_features(enc_features, 1015 - port->dev->hw_enc_features, 1016 - TEAM_ENC_FEATURES); 1017 - 1018 - dst_release_flag &= port->dev->priv_flags; 1019 - if (port->dev->hard_header_len > max_hard_header_len) 1020 - max_hard_header_len = port->dev->hard_header_len; 1021 - } 1022 - done: 1023 - rcu_read_unlock(); 1024 - 1025 - team->dev->vlan_features = vlan_features; 1026 - team->dev->hw_enc_features = enc_features | NETIF_F_GSO_ENCAP_ALL | 1027 - NETIF_F_HW_VLAN_CTAG_TX | 1028 - NETIF_F_HW_VLAN_STAG_TX; 1029 - team->dev->hard_header_len = max_hard_header_len; 1030 - 1031 - team->dev->priv_flags &= ~IFF_XMIT_DST_RELEASE; 1032 - if (dst_release_flag == (IFF_XMIT_DST_RELEASE | IFF_XMIT_DST_RELEASE_PERM)) 1033 - team->dev->priv_flags |= IFF_XMIT_DST_RELEASE; 1034 - } 1035 - 1036 - static void team_compute_features(struct team *team) 1037 - { 1038 - __team_compute_features(team); 1039 - netdev_change_features(team->dev); 1040 - } 1041 - 1042 985 static int team_port_enter(struct team *team, struct team_port *port) 1043 986 { 1044 987 int err = 0; ··· 1243 1300 port->index = -1; 1244 1301 list_add_tail_rcu(&port->list, &team->port_list); 1245 1302 team_port_enable(team, port); 1246 - __team_compute_features(team); 1303 + netdev_compute_master_upper_features(team->dev, true); 1247 1304 __team_port_change_port_added(port, !!netif_oper_up(port_dev)); 1248 1305 __team_options_change_check(team); 1249 1306 ··· 1325 1382 dev_set_mtu(port_dev, port->orig.mtu); 1326 1383 kfree_rcu(port, rcu); 1327 1384 netdev_info(dev, "Port device %s removed\n", portname); 1328 - __team_compute_features(team); 1385 + netdev_compute_master_upper_features(team->dev, true); 1329 1386 1330 1387 return 0; 1331 1388 } ··· 1913 1970 struct netlink_ext_ack *extack) 1914 1971 { 1915 1972 struct team *team = netdev_priv(dev); 1916 - int err; 1917 1973 1918 1974 ASSERT_RTNL(); 1919 1975 1920 - err = team_port_add(team, port_dev, extack); 1921 - 1922 - if (!err) 1923 - netdev_change_features(dev); 1924 - 1925 - return err; 1976 + return team_port_add(team, port_dev, extack); 1926 1977 } 1927 1978 1928 1979 static int team_del_slave(struct net_device *dev, struct net_device *port_dev) 1929 1980 { 1930 1981 struct team *team = netdev_priv(dev); 1931 - int err; 1932 1982 1933 1983 ASSERT_RTNL(); 1934 1984 1935 - err = team_port_del(team, port_dev); 1936 - 1937 - if (err) 1938 - return err; 1939 - 1940 - netdev_change_features(dev); 1941 - 1942 - return err; 1985 + return team_port_del(team, port_dev); 1943 1986 } 1944 1987 1945 1988 static netdev_features_t team_fix_features(struct net_device *dev, ··· 2119 2190 2120 2191 dev->features |= NETIF_F_GRO; 2121 2192 2122 - dev->hw_features = TEAM_VLAN_FEATURES | 2193 + dev->hw_features = MASTER_UPPER_DEV_VLAN_FEATURES | 2123 2194 NETIF_F_HW_VLAN_CTAG_RX | 2124 2195 NETIF_F_HW_VLAN_CTAG_FILTER | 2125 2196 NETIF_F_HW_VLAN_STAG_RX | ··· 2923 2994 case NETDEV_FEAT_CHANGE: 2924 2995 if (!port->team->notifier_ctx) { 2925 2996 port->team->notifier_ctx = true; 2926 - team_compute_features(port->team); 2997 + netdev_compute_master_upper_features(port->team->dev, true); 2927 2998 port->team->notifier_ctx = false; 2928 2999 } 2929 3000 break;
+18
include/linux/netdev_features.h
··· 255 255 NETIF_F_GSO_UDP_TUNNEL | \ 256 256 NETIF_F_GSO_UDP_TUNNEL_CSUM) 257 257 258 + /* virtual device features */ 259 + #define MASTER_UPPER_DEV_VLAN_FEATURES (NETIF_F_HW_CSUM | NETIF_F_SG | \ 260 + NETIF_F_FRAGLIST | NETIF_F_GSO_SOFTWARE | \ 261 + NETIF_F_GSO_ENCAP_ALL | \ 262 + NETIF_F_HIGHDMA | NETIF_F_LRO) 263 + 264 + #define MASTER_UPPER_DEV_ENC_FEATURES (NETIF_F_HW_CSUM | NETIF_F_SG | \ 265 + NETIF_F_RXCSUM | NETIF_F_GSO_SOFTWARE | \ 266 + NETIF_F_GSO_PARTIAL) 267 + 268 + #define MASTER_UPPER_DEV_MPLS_FEATURES (NETIF_F_HW_CSUM | NETIF_F_SG | \ 269 + NETIF_F_GSO_SOFTWARE) 270 + 271 + #define MASTER_UPPER_DEV_XFRM_FEATURES (NETIF_F_HW_ESP | NETIF_F_HW_ESP_TX_CSUM | \ 272 + NETIF_F_GSO_ESP) 273 + 274 + #define MASTER_UPPER_DEV_GSO_PARTIAL_FEATURES (NETIF_F_GSO_ESP) 275 + 258 276 static inline netdev_features_t netdev_base_features(netdev_features_t features) 259 277 { 260 278 features &= ~NETIF_F_ONE_FOR_ALL;
+1
include/linux/netdevice.h
··· 5304 5304 int __netdev_update_features(struct net_device *dev); 5305 5305 void netdev_update_features(struct net_device *dev); 5306 5306 void netdev_change_features(struct net_device *dev); 5307 + void netdev_compute_master_upper_features(struct net_device *dev, bool update_header); 5307 5308 5308 5309 void netif_stacked_transfer_operstate(const struct net_device *rootdev, 5309 5310 struct net_device *dev);
+3 -19
net/bridge/br_if.c
··· 525 525 br_opt_toggle(br, BROPT_MTU_SET_BY_USER, false); 526 526 } 527 527 528 - static void br_set_gso_limits(struct net_bridge *br) 529 - { 530 - unsigned int tso_max_size = TSO_MAX_SIZE; 531 - const struct net_bridge_port *p; 532 - u16 tso_max_segs = TSO_MAX_SEGS; 533 - 534 - list_for_each_entry(p, &br->port_list, list) { 535 - tso_max_size = min(tso_max_size, p->dev->tso_max_size); 536 - tso_max_segs = min(tso_max_segs, p->dev->tso_max_segs); 537 - } 538 - netif_set_tso_max_size(br->dev, tso_max_size); 539 - netif_set_tso_max_segs(br->dev, tso_max_segs); 540 - } 541 - 542 528 /* 543 529 * Recomputes features using slave's features 544 530 */ ··· 638 652 netdev_err(dev, "failed to sync bridge static fdb addresses to this port\n"); 639 653 } 640 654 641 - netdev_update_features(br->dev); 642 - 643 655 br_hr = br->dev->needed_headroom; 644 656 dev_hr = netdev_get_fwd_headroom(dev); 645 657 if (br_hr < dev_hr) ··· 678 694 call_netdevice_notifiers(NETDEV_CHANGEADDR, br->dev); 679 695 680 696 br_mtu_auto_adjust(br); 681 - br_set_gso_limits(br); 697 + 698 + netdev_compute_master_upper_features(br->dev, false); 682 699 683 700 kobject_uevent(&p->kobj, KOBJ_ADD); 684 701 ··· 725 740 del_nbp(p); 726 741 727 742 br_mtu_auto_adjust(br); 728 - br_set_gso_limits(br); 729 743 730 744 spin_lock_bh(&br->lock); 731 745 changed_addr = br_stp_recalculate_bridge_id(br); ··· 733 749 if (changed_addr) 734 750 call_netdevice_notifiers(NETDEV_CHANGEADDR, br->dev); 735 751 736 - netdev_update_features(br->dev); 752 + netdev_compute_master_upper_features(br->dev, false); 737 753 738 754 return 0; 739 755 }
+88
net/core/dev.c
··· 12693 12693 } 12694 12694 EXPORT_SYMBOL(netdev_increment_features); 12695 12695 12696 + /** 12697 + * netdev_compute_master_upper_features - compute feature from lowers 12698 + * @dev: the upper device 12699 + * @update_header: whether to update upper device's header_len/headroom/tailroom 12700 + * 12701 + * Recompute the upper device's feature based on all lower devices. 12702 + */ 12703 + void netdev_compute_master_upper_features(struct net_device *dev, bool update_header) 12704 + { 12705 + unsigned int dst_release_flag = IFF_XMIT_DST_RELEASE | IFF_XMIT_DST_RELEASE_PERM; 12706 + netdev_features_t gso_partial_features = MASTER_UPPER_DEV_GSO_PARTIAL_FEATURES; 12707 + netdev_features_t xfrm_features = MASTER_UPPER_DEV_XFRM_FEATURES; 12708 + netdev_features_t mpls_features = MASTER_UPPER_DEV_MPLS_FEATURES; 12709 + netdev_features_t vlan_features = MASTER_UPPER_DEV_VLAN_FEATURES; 12710 + netdev_features_t enc_features = MASTER_UPPER_DEV_ENC_FEATURES; 12711 + unsigned short max_header_len = ETH_HLEN; 12712 + unsigned int tso_max_size = TSO_MAX_SIZE; 12713 + unsigned short max_headroom = 0; 12714 + unsigned short max_tailroom = 0; 12715 + u16 tso_max_segs = TSO_MAX_SEGS; 12716 + struct net_device *lower_dev; 12717 + struct list_head *iter; 12718 + 12719 + mpls_features = netdev_base_features(mpls_features); 12720 + vlan_features = netdev_base_features(vlan_features); 12721 + enc_features = netdev_base_features(enc_features); 12722 + 12723 + netdev_for_each_lower_dev(dev, lower_dev, iter) { 12724 + gso_partial_features = netdev_increment_features(gso_partial_features, 12725 + lower_dev->gso_partial_features, 12726 + MASTER_UPPER_DEV_GSO_PARTIAL_FEATURES); 12727 + 12728 + vlan_features = netdev_increment_features(vlan_features, 12729 + lower_dev->vlan_features, 12730 + MASTER_UPPER_DEV_VLAN_FEATURES); 12731 + 12732 + enc_features = netdev_increment_features(enc_features, 12733 + lower_dev->hw_enc_features, 12734 + MASTER_UPPER_DEV_ENC_FEATURES); 12735 + 12736 + if (IS_ENABLED(CONFIG_XFRM_OFFLOAD)) 12737 + xfrm_features = netdev_increment_features(xfrm_features, 12738 + lower_dev->hw_enc_features, 12739 + MASTER_UPPER_DEV_XFRM_FEATURES); 12740 + 12741 + mpls_features = netdev_increment_features(mpls_features, 12742 + lower_dev->mpls_features, 12743 + MASTER_UPPER_DEV_MPLS_FEATURES); 12744 + 12745 + dst_release_flag &= lower_dev->priv_flags; 12746 + 12747 + if (update_header) { 12748 + max_header_len = max(max_header_len, lower_dev->hard_header_len); 12749 + max_headroom = max(max_headroom, lower_dev->needed_headroom); 12750 + max_tailroom = max(max_tailroom, lower_dev->needed_tailroom); 12751 + } 12752 + 12753 + tso_max_size = min(tso_max_size, lower_dev->tso_max_size); 12754 + tso_max_segs = min(tso_max_segs, lower_dev->tso_max_segs); 12755 + } 12756 + 12757 + dev->gso_partial_features = gso_partial_features; 12758 + dev->vlan_features = vlan_features; 12759 + dev->hw_enc_features = enc_features | NETIF_F_GSO_ENCAP_ALL | 12760 + NETIF_F_HW_VLAN_CTAG_TX | 12761 + NETIF_F_HW_VLAN_STAG_TX; 12762 + if (IS_ENABLED(CONFIG_XFRM_OFFLOAD)) 12763 + dev->hw_enc_features |= xfrm_features; 12764 + dev->mpls_features = mpls_features; 12765 + 12766 + dev->priv_flags &= ~IFF_XMIT_DST_RELEASE; 12767 + if ((dev->priv_flags & IFF_XMIT_DST_RELEASE_PERM) && 12768 + dst_release_flag == (IFF_XMIT_DST_RELEASE | IFF_XMIT_DST_RELEASE_PERM)) 12769 + dev->priv_flags |= IFF_XMIT_DST_RELEASE; 12770 + 12771 + if (update_header) { 12772 + dev->hard_header_len = max_header_len; 12773 + dev->needed_headroom = max_headroom; 12774 + dev->needed_tailroom = max_tailroom; 12775 + } 12776 + 12777 + netif_set_tso_max_segs(dev, tso_max_segs); 12778 + netif_set_tso_max_size(dev, tso_max_size); 12779 + 12780 + netdev_change_features(dev); 12781 + } 12782 + EXPORT_SYMBOL(netdev_compute_master_upper_features); 12783 + 12696 12784 static struct hlist_head * __net_init netdev_create_hash(void) 12697 12785 { 12698 12786 int i;