RE: [PATCH 6/9] net: avoid copies before linkmode_and()
flat view
From: Loktionov, Aleksandr <hidden>
Date: 2026-09-08 13:07:30
Also in:
intel-wired-lan, linux-usb, lkml
quoted hunk ↗ jump to hunk
-----Original Message----- From: Yury Norov <yury.norov@gmail.com> Sent: Monday, September 7, 2026 11:55 PM To: Andrew Lunn <andrew@lunn.ch>; Heiner Kallweit [off-list ref]; Russell King [off-list ref]; Raju Rangoju [off-list ref]; Prashanth Kumar K R [off-list ref]; Nguyen, Anthony L [off-list ref]; Kitszel, Przemyslaw [off-list ref]; Jian Shen [off-list ref]; Jijie Shao [off-list ref]; David S. Miller [off-list ref]; Eric Dumazet [off-list ref]; Jakub Kicinski [off-list ref]; Paolo Abeni [off-list ref]; linux- kernel@vger.kernel.org; netdev@vger.kernel.org; intel-wired- lan@lists.osuosl.org; linux-usb@vger.kernel.org Cc: Yury Norov <redacted>; Yury Norov <yury.norov@gmail.com>; Rasmus Villemoes [off-list ref]; Andrew Morton [off-list ref] Subject: [PATCH 6/9] net: avoid copies before linkmode_and() Avoid separate linkmode_copy() calls by passing the original source bitmap directly to linkmode_and(). In phy_ethtool_ksettings_set(), also use the return value of linkmode_and() when validating that the requested advertisement contains a supported link mode. Signed-off-by: Yury Norov <redacted> --- drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c | 5 ++--- drivers/net/phy/phy.c | 7 +++---- 2 files changed, 5 insertions(+), 7 deletions(-)diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.cb/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c index cf881108fa57..5801da6100b8 100644--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c@@ -205,7 +205,6 @@ int hclge_mac_connect_phy(struct hnae3_handle*handle) struct hclge_dev *hdev = vport->back; struct net_device *netdev = hdev->vport[0].nic.netdev; struct phy_device *phydev = hdev->hw.mac.phydev; - __ETHTOOL_DECLARE_LINK_MODE_MASK(mask) = { 0, }; int ret; if (!phydev)@@ -223,8 +222,8 @@ int hclge_mac_connect_phy(struct hnae3_handle*handle) return ret; } - linkmode_copy(mask, hdev->hw.mac.supported); - linkmode_and(phydev->supported, phydev->supported, mask); + linkmode_and(phydev->supported, phydev->supported, + hdev->hw.mac.supported); linkmode_copy(phydev->advertising, phydev->supported); /* supported flag is Pause and Asym Pause, but default advertising diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c index fce9bc7be330..cd71186cd842 100644--- a/drivers/net/phy/phy.c +++ b/drivers/net/phy/phy.c@@ -1160,6 +1160,7 @@ int phy_ethtool_ksettings_set(struct phy_device*phydev, const struct ethtool_link_ksettings *cmd) { __ETHTOOL_DECLARE_LINK_MODE_MASK(advertising); + bool has_advertising; u8 autoneg = cmd->base.autoneg; u8 duplex = cmd->base.duplex; u32 speed = cmd->base.speed;@@ -1167,17 +1168,15 @@ int phy_ethtool_ksettings_set(structphy_device *phydev, if (cmd->base.phy_address != phydev->mdio.addr) return -EINVAL; - linkmode_copy(advertising, cmd->link_modes.advertising); - /* We make sure that we don't pass unsupported values in to the PHY */ - linkmode_and(advertising, advertising, phydev->supported); + has_advertising = linkmode_and(advertising, +cmd->link_modes.advertising, phydev->supported); /* Verify the settings we care about. */ if (autoneg != AUTONEG_ENABLE && autoneg != AUTONEG_DISABLE) return -EINVAL; if (autoneg == AUTONEG_ENABLE && - (linkmode_empty(advertising) || + (!has_advertising || !linkmode_test_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, phydev->supported))) return -EINVAL; -- 2.53.0
Reviewed-by: Aleksandr Loktionov <redacted>