From nobody Fri Oct 10 09:55:26 2025 Received: from linux.microsoft.com (linux.microsoft.com [13.77.154.182]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 42FA628C5CB; Tue, 17 Jun 2025 07:17:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=13.77.154.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750144660; cv=none; b=MpVBsNusT0Y8kldnmJ0nAA/rEFwW1hK+KgzaRlCEZA+ACM/qDxjvNufYsxtAy9rVd4yyuQ3w+TD00XPaKEz9O0PWGhAVvwmDDqRpgtrDW7pdkfJMv0qF3Laa2usfHuFmOTx0V8EQJzn42umeUAQouLKNS9CbSf3f6vh52UQm4wU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750144660; c=relaxed/simple; bh=jGZCaeYpcMFJPwLyNH+2UnoKra3q2DOb5dVDvFmFLCg=; h=From:To:Subject:Date:Message-Id:In-Reply-To:References; b=SaE9Mzqw5X+F28uAc00KdtHJ+6kzhgG+57G8yUvvBMjdegMzq8yXBo2IBtZAkGFYCN/Y+gf24nf/rKx8jkEjLmEH8farIixMmvlllL5EXiX8z70EO+FD4A+xlfU6fbAcjbBYOzpA2wra8Hk/DmELrm4uqU/1Afxu4Xkcw9WKNi8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.microsoft.com; spf=pass smtp.mailfrom=linux.microsoft.com; dkim=pass (1024-bit key) header.d=linux.microsoft.com header.i=@linux.microsoft.com header.b=NaqNIHDl; arc=none smtp.client-ip=13.77.154.182 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.microsoft.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.microsoft.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.microsoft.com header.i=@linux.microsoft.com header.b="NaqNIHDl" Received: by linux.microsoft.com (Postfix, from userid 1173) id D54B621176D9; Tue, 17 Jun 2025 00:17:38 -0700 (PDT) DKIM-Filter: OpenDKIM Filter v2.11.0 linux.microsoft.com D54B621176D9 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.microsoft.com; s=default; t=1750144658; bh=668496g8C4XCuLw1ut4WdZn3RjrZWGbw+16iVGDl2Po=; h=From:To:Subject:Date:In-Reply-To:References:From; b=NaqNIHDl67J7a0JJJiC7vc3xBoLZHP+oAISehlREl2VkisdWtVYkXJNCMfZrPRCuD CC8Q3jWn2ZbTBmZcWz+xxLNzIy5fWFSx9UKz/BIkHi9agV1USi+0AXMoDuEgmW2wMm cjHnh9PWOXp752lDTkOyKkbAWNPsPf9Yvb41LZnY= From: Erni Sri Satya Vennela To: kys@microsoft.com, haiyangz@microsoft.com, wei.liu@kernel.org, decui@microsoft.com, andrew+netdev@lunn.ch, davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, longli@microsoft.com, kotaranov@microsoft.com, horms@kernel.org, shirazsaleem@microsoft.com, leon@kernel.org, ernis@linux.microsoft.com, shradhagupta@linux.microsoft.com, schakrabarti@linux.microsoft.com, gerhard@engleder-embedded.com, rosenp@gmail.com, sdf@fomichev.me, linux-hyperv@vger.kernel.org, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org Subject: [PATCH net-next v3 1/4] net: mana: Fix potential deadlocks in mana napi ops Date: Tue, 17 Jun 2025 00:17:33 -0700 Message-Id: <1750144656-2021-2-git-send-email-ernis@linux.microsoft.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1750144656-2021-1-git-send-email-ernis@linux.microsoft.com> References: <1750144656-2021-1-git-send-email-ernis@linux.microsoft.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" When net_shaper_ops are enabled for MANA, netdev_ops_lock becomes active. MANA VF setup/teardown by netvsc follows this call chain: netvsc_vf_setup() dev_change_flags() ... __dev_open() OR __dev_close() dev_change_flags() holds the netdev mutex via netdev_lock_ops. Meanwhile, mana_create_txq() and mana_create_rxq() in mana_open() path call NAPI APIs (netif_napi_add_tx(), netif_napi_add_weight(), napi_enable()), which also try to acquire the same lock, risking deadlock. Similarly in the teardown path (mana_close()), netif_napi_disable() and netif_napi_del(), contend for the same lock. Switch to the _locked variants of these APIs to avoid deadlocks when the netdev_ops_lock is held. Fixes: d4c22ec680c8 ("net: hold netdev instance lock during ndo_open/ndo_st= op") Signed-off-by: Erni Sri Satya Vennela Reviewed-by: Haiyang Zhang Reviewed-by: Shradha Gupta Reviewed-by: Saurabh Singh Sengar Reviewed-by: Long Li --- Changes in v3: * Rebase to latest net-next branch. Changes in v2: * Use netdev_lock_ops_to_full() instead of if...else statements for napi APIs. * Edit commit message. --- drivers/net/ethernet/microsoft/mana/mana_en.c | 28 +++++++++++++------ 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/drivers/net/ethernet/microsoft/mana/mana_en.c b/drivers/net/et= hernet/microsoft/mana/mana_en.c index e68b8190bb7a..bcc33ea7aca3 100644 --- a/drivers/net/ethernet/microsoft/mana/mana_en.c +++ b/drivers/net/ethernet/microsoft/mana/mana_en.c @@ -1912,8 +1912,10 @@ static void mana_destroy_txq(struct mana_port_contex= t *apc) napi =3D &apc->tx_qp[i].tx_cq.napi; if (apc->tx_qp[i].txq.napi_initialized) { napi_synchronize(napi); - napi_disable(napi); - netif_napi_del(napi); + netdev_lock_ops_to_full(napi->dev); + napi_disable_locked(napi); + netif_napi_del_locked(napi); + netdev_unlock_full_to_ops(napi->dev); apc->tx_qp[i].txq.napi_initialized =3D false; } mana_destroy_wq_obj(apc, GDMA_SQ, apc->tx_qp[i].tx_object); @@ -2065,8 +2067,11 @@ static int mana_create_txq(struct mana_port_context = *apc, =20 mana_create_txq_debugfs(apc, i); =20 - netif_napi_add_tx(net, &cq->napi, mana_poll); - napi_enable(&cq->napi); + set_bit(NAPI_STATE_NO_BUSY_POLL, &cq->napi.state); + netdev_lock_ops_to_full(net); + netif_napi_add_locked(net, &cq->napi, mana_poll); + napi_enable_locked(&cq->napi); + netdev_unlock_full_to_ops(net); txq->napi_initialized =3D true; =20 mana_gd_ring_cq(cq->gdma_cq, SET_ARM_BIT); @@ -2102,9 +2107,10 @@ static void mana_destroy_rxq(struct mana_port_contex= t *apc, if (napi_initialized) { napi_synchronize(napi); =20 - napi_disable(napi); - - netif_napi_del(napi); + netdev_lock_ops_to_full(napi->dev); + napi_disable_locked(napi); + netif_napi_del_locked(napi); + netdev_unlock_full_to_ops(napi->dev); } xdp_rxq_info_unreg(&rxq->xdp_rxq); =20 @@ -2355,14 +2361,18 @@ static struct mana_rxq *mana_create_rxq(struct mana= _port_context *apc, =20 gc->cq_table[cq->gdma_id] =3D cq->gdma_cq; =20 - netif_napi_add_weight(ndev, &cq->napi, mana_poll, 1); + netdev_lock_ops_to_full(ndev); + netif_napi_add_weight_locked(ndev, &cq->napi, mana_poll, 1); + netdev_unlock_full_to_ops(ndev); =20 WARN_ON(xdp_rxq_info_reg(&rxq->xdp_rxq, ndev, rxq_idx, cq->napi.napi_id)); WARN_ON(xdp_rxq_info_reg_mem_model(&rxq->xdp_rxq, MEM_TYPE_PAGE_POOL, rxq->page_pool)); =20 - napi_enable(&cq->napi); + netdev_lock_ops_to_full(ndev); + napi_enable_locked(&cq->napi); + netdev_unlock_full_to_ops(ndev); =20 mana_gd_ring_cq(cq->gdma_cq, SET_ARM_BIT); out: --=20 2.34.1 From nobody Fri Oct 10 09:55:26 2025 Received: from linux.microsoft.com (linux.microsoft.com [13.77.154.182]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 21D7B28D85F; Tue, 17 Jun 2025 07:17:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=13.77.154.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750144661; cv=none; b=NniGItvggStPMSE+plSA8/hgOYcdVvWHPUCXh5LfqPSxJuD08Mi/ulePasLWLksOYnUhFvueLg9haMEeLaYOk7jtiTrDUn7GRT7IAvdNCcJfj/znpnnYtJ7dJn7hmKWFnpGHQQ/3OBg1ifJVdewOGnZX3M1vGjdR1oeK9gDyQQY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750144661; c=relaxed/simple; bh=Ct7FDrS3M3uAv+MZhiXEaaG8lFl/ycm5IWFUOcYtLp0=; h=From:To:Subject:Date:Message-Id:In-Reply-To:References; b=KOE8JAI+GklYXr1z9pLhXLFrIzLJ1y1P4BT9FjsFUzqIatSvJRza0+LDthFTGkWbwTdn6xmMtV8rHfrilfGlziRO++wfYifzX053Ckn0WfYzTYw/G1PTKu7XZpM/T+tNVF3iJNq8QsjOOdh3xMWc7bSJ8zyCDo/UopT8QbX+S7k= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.microsoft.com; spf=pass smtp.mailfrom=linux.microsoft.com; dkim=pass (1024-bit key) header.d=linux.microsoft.com header.i=@linux.microsoft.com header.b=dCbvP2vc; arc=none smtp.client-ip=13.77.154.182 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.microsoft.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.microsoft.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.microsoft.com header.i=@linux.microsoft.com header.b="dCbvP2vc" Received: by linux.microsoft.com (Postfix, from userid 1173) id C892321176DA; Tue, 17 Jun 2025 00:17:39 -0700 (PDT) DKIM-Filter: OpenDKIM Filter v2.11.0 linux.microsoft.com C892321176DA DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.microsoft.com; s=default; t=1750144659; bh=S+eb/WCveT3/EbB9nEUJwz1zEQAKiZsTsFJG8kvsRyY=; h=From:To:Subject:Date:In-Reply-To:References:From; b=dCbvP2vcaHCQ87FSNY56TjbF55q9dwHe8Z7GocUESrw4syWJ/SYsEKcjKoQ4Wn+lW rUgeDPjoBwbL8Zn/m5GtIN8sYusge3Qwjl2Jut/B7WZUM+zcNfmW5eJsL9TUV/EZdM UItLbWFmqcDC4tGfonQJ4NthQJvcY1E8j4qt+3zA= From: Erni Sri Satya Vennela To: kys@microsoft.com, haiyangz@microsoft.com, wei.liu@kernel.org, decui@microsoft.com, andrew+netdev@lunn.ch, davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, longli@microsoft.com, kotaranov@microsoft.com, horms@kernel.org, shirazsaleem@microsoft.com, leon@kernel.org, ernis@linux.microsoft.com, shradhagupta@linux.microsoft.com, schakrabarti@linux.microsoft.com, gerhard@engleder-embedded.com, rosenp@gmail.com, sdf@fomichev.me, linux-hyperv@vger.kernel.org, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org Subject: [PATCH net-next v3 2/4] net: mana: Add support for net_shaper_ops Date: Tue, 17 Jun 2025 00:17:34 -0700 Message-Id: <1750144656-2021-3-git-send-email-ernis@linux.microsoft.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1750144656-2021-1-git-send-email-ernis@linux.microsoft.com> References: <1750144656-2021-1-git-send-email-ernis@linux.microsoft.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Introduce support for net_shaper_ops in the MANA driver, enabling configuration of rate limiting on the MANA NIC. To apply rate limiting, the driver issues a HWC command via mana_set_bw_clamp() and updates the corresponding shaper object in the net_shaper cache. If an error occurs during this process, the driver restores the previous speed by querying the current link configuration using mana_query_link_cfg(). The minimum supported bandwidth is 100 Mbps, and only values that are exact multiples of 100 Mbps are allowed. Any other values are rejected. To remove a shaper, the driver resets the bandwidth to the maximum supported by the SKU using mana_set_bw_clamp() and clears the associated cache entry. If an error occurs during this process, the shaper details are retained. On the hardware that does not support these APIs, the net-shaper calls to set speed would fail. Set the speed: ./tools/net/ynl/pyynl/cli.py \ --spec Documentation/netlink/specs/net_shaper.yaml \ --do set --json '{"ifindex":'$IFINDEX', "handle":{"scope": "netdev", "id":'$ID' }, "bw-max": 200000000 }' Get the shaper details: ./tools/net/ynl/pyynl/cli.py \ --spec Documentation/netlink/specs/net_shaper.yaml \ --do get --json '{"ifindex":'$IFINDEX', "handle":{"scope": "netdev", "id":'$ID' }}' > {'bw-max': 200000000, > 'handle': {'scope': 'netdev'}, > 'ifindex': $IFINDEX, > 'metric': 'bps'} Delete the shaper object: ./tools/net/ynl/pyynl/cli.py \ --spec Documentation/netlink/specs/net_shaper.yaml \ --do delete --json '{"ifindex":'$IFINDEX', "handle":{"scope": "netdev","id":'$ID' }}' Signed-off-by: Erni Sri Satya Vennela Reviewed-by: Haiyang Zhang Reviewed-by: Shradha Gupta Reviewed-by: Saurabh Singh Sengar Reviewed-by: Long Li --- Changes in v3: * Rebase to latest net-next branch. Changes in v2: * No change. --- drivers/net/ethernet/microsoft/mana/mana_en.c | 155 ++++++++++++++++++ include/net/mana/mana.h | 40 +++++ 2 files changed, 195 insertions(+) diff --git a/drivers/net/ethernet/microsoft/mana/mana_en.c b/drivers/net/et= hernet/microsoft/mana/mana_en.c index bcc33ea7aca3..547dff450b6d 100644 --- a/drivers/net/ethernet/microsoft/mana/mana_en.c +++ b/drivers/net/ethernet/microsoft/mana/mana_en.c @@ -719,6 +719,78 @@ static int mana_change_mtu(struct net_device *ndev, in= t new_mtu) return err; } =20 +static int mana_shaper_set(struct net_shaper_binding *binding, + const struct net_shaper *shaper, + struct netlink_ext_ack *extack) +{ + struct mana_port_context *apc =3D netdev_priv(binding->netdev); + u32 old_speed, rate; + int err; + + if (shaper->handle.scope !=3D NET_SHAPER_SCOPE_NETDEV) { + NL_SET_ERR_MSG_MOD(extack, "net shaper scope should be netdev"); + return -EINVAL; + } + + if (apc->handle.id && shaper->handle.id !=3D apc->handle.id) { + NL_SET_ERR_MSG_MOD(extack, "Cannot create multiple shapers"); + return -EOPNOTSUPP; + } + + if (!shaper->bw_max || (shaper->bw_max % 100000000)) { + NL_SET_ERR_MSG_MOD(extack, "Please use multiples of 100Mbps for bandwidt= h"); + return -EINVAL; + } + + rate =3D div_u64(shaper->bw_max, 1000); /* Convert bps to Kbps */ + rate =3D div_u64(rate, 1000); /* Convert Kbps to Mbps */ + + /* Get current speed */ + err =3D mana_query_link_cfg(apc); + old_speed =3D (err) ? SPEED_UNKNOWN : apc->speed; + + if (!err) { + err =3D mana_set_bw_clamp(apc, rate, TRI_STATE_TRUE); + apc->speed =3D (err) ? old_speed : rate; + apc->handle =3D (err) ? apc->handle : shaper->handle; + } + + return err; +} + +static int mana_shaper_del(struct net_shaper_binding *binding, + const struct net_shaper_handle *handle, + struct netlink_ext_ack *extack) +{ + struct mana_port_context *apc =3D netdev_priv(binding->netdev); + int err; + + err =3D mana_set_bw_clamp(apc, 0, TRI_STATE_FALSE); + + if (!err) { + /* Reset mana port context parameters */ + apc->handle.id =3D 0; + apc->handle.scope =3D NET_SHAPER_SCOPE_UNSPEC; + apc->speed =3D 0; + } + + return err; +} + +static void mana_shaper_cap(struct net_shaper_binding *binding, + enum net_shaper_scope scope, + unsigned long *flags) +{ + *flags =3D BIT(NET_SHAPER_A_CAPS_SUPPORT_BW_MAX) | + BIT(NET_SHAPER_A_CAPS_SUPPORT_METRIC_BPS); +} + +static const struct net_shaper_ops mana_shaper_ops =3D { + .set =3D mana_shaper_set, + .delete =3D mana_shaper_del, + .capabilities =3D mana_shaper_cap, +}; + static const struct net_device_ops mana_devops =3D { .ndo_open =3D mana_open, .ndo_stop =3D mana_close, @@ -729,6 +801,7 @@ static const struct net_device_ops mana_devops =3D { .ndo_bpf =3D mana_bpf, .ndo_xdp_xmit =3D mana_xdp_xmit, .ndo_change_mtu =3D mana_change_mtu, + .net_shaper_ops =3D &mana_shaper_ops, }; =20 static void mana_cleanup_port_context(struct mana_port_context *apc) @@ -1162,6 +1235,86 @@ static int mana_cfg_vport_steering(struct mana_port_= context *apc, return err; } =20 +int mana_query_link_cfg(struct mana_port_context *apc) +{ + struct net_device *ndev =3D apc->ndev; + struct mana_query_link_config_resp resp =3D {}; + struct mana_query_link_config_req req =3D {}; + int err; + + mana_gd_init_req_hdr(&req.hdr, MANA_QUERY_LINK_CONFIG, + sizeof(req), sizeof(resp)); + + req.vport =3D apc->port_handle; + req.hdr.resp.msg_version =3D GDMA_MESSAGE_V2; + + err =3D mana_send_request(apc->ac, &req, sizeof(req), &resp, + sizeof(resp)); + + if (err) { + netdev_err(ndev, "Failed to query link config: %d\n", err); + return err; + } + + err =3D mana_verify_resp_hdr(&resp.hdr, MANA_QUERY_LINK_CONFIG, + sizeof(resp)); + + if (err || resp.hdr.status) { + netdev_err(ndev, "Failed to query link config: %d, 0x%x\n", err, + resp.hdr.status); + if (!err) + err =3D -EOPNOTSUPP; + return err; + } + + if (resp.qos_unconfigured) { + err =3D -EINVAL; + return err; + } + apc->speed =3D resp.link_speed_mbps; + return 0; +} + +int mana_set_bw_clamp(struct mana_port_context *apc, u32 speed, + int enable_clamping) +{ + struct mana_set_bw_clamp_resp resp =3D {}; + struct mana_set_bw_clamp_req req =3D {}; + struct net_device *ndev =3D apc->ndev; + int err; + + mana_gd_init_req_hdr(&req.hdr, MANA_SET_BW_CLAMP, + sizeof(req), sizeof(resp)); + req.vport =3D apc->port_handle; + req.link_speed_mbps =3D speed; + req.enable_clamping =3D enable_clamping; + + err =3D mana_send_request(apc->ac, &req, sizeof(req), &resp, + sizeof(resp)); + + if (err) { + netdev_err(ndev, "Failed to set bandwidth clamp for speed %u, err =3D %d= ", + speed, err); + return err; + } + + err =3D mana_verify_resp_hdr(&resp.hdr, MANA_SET_BW_CLAMP, + sizeof(resp)); + + if (err || resp.hdr.status) { + netdev_err(ndev, "Failed to set bandwidth clamp: %d, 0x%x\n", err, + resp.hdr.status); + if (!err) + err =3D -EOPNOTSUPP; + return err; + } + + if (resp.qos_unconfigured) + netdev_info(ndev, "QoS is unconfigured\n"); + + return 0; +} + int mana_create_wq_obj(struct mana_port_context *apc, mana_handle_t vport, u32 wq_type, struct mana_obj_spec *wq_spec, @@ -3011,6 +3164,8 @@ static int mana_probe_port(struct mana_context *ac, i= nt port_idx, goto free_indir; } =20 + debugfs_create_u32("current_speed", 0400, apc->mana_port_debugfs, &apc->s= peed); + return 0; =20 free_indir: diff --git a/include/net/mana/mana.h b/include/net/mana/mana.h index 4176edf1be71..038b18340e51 100644 --- a/include/net/mana/mana.h +++ b/include/net/mana/mana.h @@ -5,6 +5,7 @@ #define _MANA_H =20 #include +#include =20 #include "gdma.h" #include "hw_channel.h" @@ -526,7 +527,12 @@ struct mana_port_context { struct mutex vport_mutex; int vport_use_count; =20 + /* Net shaper handle*/ + struct net_shaper_handle handle; + u16 port_idx; + /* Currently configured speed (mbps) */ + u32 speed; =20 bool port_is_up; bool port_st_save; /* Saved port state */ @@ -562,6 +568,9 @@ struct bpf_prog *mana_xdp_get(struct mana_port_context = *apc); void mana_chn_setxdp(struct mana_port_context *apc, struct bpf_prog *prog); int mana_bpf(struct net_device *ndev, struct netdev_bpf *bpf); void mana_query_gf_stats(struct mana_port_context *apc); +int mana_query_link_cfg(struct mana_port_context *apc); +int mana_set_bw_clamp(struct mana_port_context *apc, u32 speed, + int enable_clamping); void mana_query_phy_stats(struct mana_port_context *apc); int mana_pre_alloc_rxbufs(struct mana_port_context *apc, int mtu, int num_= queues); void mana_pre_dealloc_rxbufs(struct mana_port_context *apc); @@ -589,6 +598,8 @@ enum mana_command_code { MANA_FENCE_RQ =3D 0x20006, MANA_CONFIG_VPORT_RX =3D 0x20007, MANA_QUERY_VPORT_CONFIG =3D 0x20008, + MANA_QUERY_LINK_CONFIG =3D 0x2000A, + MANA_SET_BW_CLAMP =3D 0x2000B, MANA_QUERY_PHY_STAT =3D 0x2000c, =20 /* Privileged commands for the PF mode */ @@ -598,6 +609,35 @@ enum mana_command_code { MANA_DEREGISTER_HW_PORT =3D 0x28004, }; =20 +/* Query Link Configuration*/ +struct mana_query_link_config_req { + struct gdma_req_hdr hdr; + mana_handle_t vport; +}; /* HW DATA */ + +struct mana_query_link_config_resp { + struct gdma_resp_hdr hdr; + u32 qos_speed_mbps; + u8 qos_unconfigured; + u8 reserved1[3]; + u32 link_speed_mbps; + u8 reserved2[4]; +}; /* HW DATA */ + +/* Set Bandwidth Clamp*/ +struct mana_set_bw_clamp_req { + struct gdma_req_hdr hdr; + mana_handle_t vport; + enum TRI_STATE enable_clamping; + u32 link_speed_mbps; +}; /* HW DATA */ + +struct mana_set_bw_clamp_resp { + struct gdma_resp_hdr hdr; + u8 qos_unconfigured; + u8 reserved[7]; +}; /* HW DATA */ + /* Query Device Configuration */ struct mana_query_device_cfg_req { struct gdma_req_hdr hdr; --=20 2.34.1 From nobody Fri Oct 10 09:55:26 2025 Received: from linux.microsoft.com (linux.microsoft.com [13.77.154.182]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 017E628DEE7; Tue, 17 Jun 2025 07:17:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=13.77.154.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750144662; cv=none; b=cU3RwsGwSCpgdMOa7ATymjiEHukBVWgzLjqk9mgujQSLzBgDI/yi5/BcFvfXxGCD1WJxU5O64tOmF3ZdgNtrTtVv1+yUGopxRAbNO3NDRdLutlbohOmY0Hi+tASyfuqd0UO5r0Ju21UBmhDDsh6ShvPQHfMcgLSIf1iARILg14o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750144662; c=relaxed/simple; bh=T9yd8H4YOedrDSVr6d4darIYXetU1jiE5huP6f7FyEY=; h=From:To:Subject:Date:Message-Id:In-Reply-To:References; b=Sni9Zty8W2mXfIcRjVYjclUEvfaH+jmdhFxqmXdFA6PYJbfKtlGzy1aroEq0cVYcISMuypbc0F0rJdZqVoFbUaV2eQSrLStqIFqdc9XWNPxYsDLNpkekSFEJjiaEBdRvfz90zHsgrAcz+AFFHWVb4GqEylZoM3CwN8OR68QRMcM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.microsoft.com; spf=pass smtp.mailfrom=linux.microsoft.com; dkim=pass (1024-bit key) header.d=linux.microsoft.com header.i=@linux.microsoft.com header.b=gTaIaXpn; arc=none smtp.client-ip=13.77.154.182 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.microsoft.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.microsoft.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.microsoft.com header.i=@linux.microsoft.com header.b="gTaIaXpn" Received: by linux.microsoft.com (Postfix, from userid 1173) id C6CF321176CF; Tue, 17 Jun 2025 00:17:40 -0700 (PDT) DKIM-Filter: OpenDKIM Filter v2.11.0 linux.microsoft.com C6CF321176CF DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.microsoft.com; s=default; t=1750144660; bh=nrlXlBoYW/LWTQTyysbIz35GJZffDR5Fc1lmm33ZF+M=; h=From:To:Subject:Date:In-Reply-To:References:From; b=gTaIaXpn1Le4u2RWPx2QKrMRW3cn+Q1dbaqm6y4X0GpQQQHtH+TSImV5KdE/CWKc6 KfF6B9eHOR7v5+eqdJ2AaCKA4NKdAvfS5aRlGLtnpL1faMh6aj9eukWMaDY7btPKBA qPb2jPGGDMJCK67osgJthgZSXRhQQOJZcyoVaUCw= From: Erni Sri Satya Vennela To: kys@microsoft.com, haiyangz@microsoft.com, wei.liu@kernel.org, decui@microsoft.com, andrew+netdev@lunn.ch, davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, longli@microsoft.com, kotaranov@microsoft.com, horms@kernel.org, shirazsaleem@microsoft.com, leon@kernel.org, ernis@linux.microsoft.com, shradhagupta@linux.microsoft.com, schakrabarti@linux.microsoft.com, gerhard@engleder-embedded.com, rosenp@gmail.com, sdf@fomichev.me, linux-hyperv@vger.kernel.org, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org Subject: [PATCH net-next v3 3/4] net: mana: Add speed support in mana_get_link_ksettings Date: Tue, 17 Jun 2025 00:17:35 -0700 Message-Id: <1750144656-2021-4-git-send-email-ernis@linux.microsoft.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1750144656-2021-1-git-send-email-ernis@linux.microsoft.com> References: <1750144656-2021-1-git-send-email-ernis@linux.microsoft.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Allow mana ethtool get_link_ksettings operation to report the maximum speed supported by the SKU in mbps. The driver retrieves this information by issuing a HWC command to the hardware via mana_query_link_cfg(), which retrieves the SKU's maximum supported speed. These APIs when invoked on hardware that are older/do not support these APIs, the speed would be reported as UNKNOWN. Before: $ethtool enP30832s1 > Settings for enP30832s1: Supported ports: [ ] Supported link modes: Not reported Supported pause frame use: No Supports auto-negotiation: No Supported FEC modes: Not reported Advertised link modes: Not reported Advertised pause frame use: No Advertised auto-negotiation: No Advertised FEC modes: Not reported Speed: Unknown! Duplex: Full Auto-negotiation: off Port: Other PHYAD: 0 Transceiver: internal Link detected: yes After: $ethtool enP30832s1 > Settings for enP30832s1: Supported ports: [ ] Supported link modes: Not reported Supported pause frame use: No Supports auto-negotiation: No Supported FEC modes: Not reported Advertised link modes: Not reported Advertised pause frame use: No Advertised auto-negotiation: No Advertised FEC modes: Not reported Speed: 16000Mb/s Duplex: Full Auto-negotiation: off Port: Other PHYAD: 0 Transceiver: internal Link detected: yes Signed-off-by: Erni Sri Satya Vennela Reviewed-by: Haiyang Zhang Reviewed-by: Shradha Gupta Reviewed-by: Saurabh Singh Sengar --- Changes in v3: * Rebase to latest net-next branch. Changes in v2: * No change. --- drivers/net/ethernet/microsoft/mana/mana_en.c | 1 + drivers/net/ethernet/microsoft/mana/mana_ethtool.c | 6 ++++++ include/net/mana/mana.h | 2 ++ 3 files changed, 9 insertions(+) diff --git a/drivers/net/ethernet/microsoft/mana/mana_en.c b/drivers/net/et= hernet/microsoft/mana/mana_en.c index 547dff450b6d..d7079e05dfb8 100644 --- a/drivers/net/ethernet/microsoft/mana/mana_en.c +++ b/drivers/net/ethernet/microsoft/mana/mana_en.c @@ -1272,6 +1272,7 @@ int mana_query_link_cfg(struct mana_port_context *apc) return err; } apc->speed =3D resp.link_speed_mbps; + apc->max_speed =3D resp.qos_speed_mbps; return 0; } =20 diff --git a/drivers/net/ethernet/microsoft/mana/mana_ethtool.c b/drivers/n= et/ethernet/microsoft/mana/mana_ethtool.c index 4fb3a04994a2..a1afa75a9463 100644 --- a/drivers/net/ethernet/microsoft/mana/mana_ethtool.c +++ b/drivers/net/ethernet/microsoft/mana/mana_ethtool.c @@ -495,6 +495,12 @@ static int mana_set_ringparam(struct net_device *ndev, static int mana_get_link_ksettings(struct net_device *ndev, struct ethtool_link_ksettings *cmd) { + struct mana_port_context *apc =3D netdev_priv(ndev); + int err; + + err =3D mana_query_link_cfg(apc); + cmd->base.speed =3D (err) ? SPEED_UNKNOWN : apc->max_speed; + cmd->base.duplex =3D DUPLEX_FULL; cmd->base.port =3D PORT_OTHER; =20 diff --git a/include/net/mana/mana.h b/include/net/mana/mana.h index 038b18340e51..e1030a7d2daa 100644 --- a/include/net/mana/mana.h +++ b/include/net/mana/mana.h @@ -533,6 +533,8 @@ struct mana_port_context { u16 port_idx; /* Currently configured speed (mbps) */ u32 speed; + /* Maximum speed supported by the SKU (mbps) */ + u32 max_speed; =20 bool port_is_up; bool port_st_save; /* Saved port state */ --=20 2.34.1 From nobody Fri Oct 10 09:55:26 2025 Received: from linux.microsoft.com (linux.microsoft.com [13.77.154.182]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 2B049290BC6; Tue, 17 Jun 2025 07:17:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=13.77.154.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750144666; cv=none; b=BSDcT1mib6y4EgXLU+uhvVHyEPcNBUxO5vU817a1Ew2HAaiWoruNek5/X0BTfzXHsPP1eT0nwOBsIyH6j7MuePDYm8XeFcAWX7wppUoeLyYo1LYMQhhdcBhceqkIDNbuxBwO7E1RyEZ1vusUcTsiTgs9Z3kM3ncO4wxyFbSWwac= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750144666; c=relaxed/simple; bh=F1gx+vQUf172w9LtF5/IcAONaJB4Rn6JW/DLAOvKpbs=; h=From:To:Subject:Date:Message-Id:In-Reply-To:References; b=Zzwb+owVW03jCDpbXy+agejn7x5FHJbN9ja16X+nqHrI+lv/zw8lmBuQy/Ew8uGnoTQnVsDm9z44zXgRt15N3wE7ElXKqYuB6xdWzh5UrdlJWlQPAdh5RSih9PWTlFP+6+yvp4IS+RTdInPNePTztv6KipcXqhxvFb+4CsTZLcs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.microsoft.com; spf=pass smtp.mailfrom=linux.microsoft.com; dkim=pass (1024-bit key) header.d=linux.microsoft.com header.i=@linux.microsoft.com header.b=YsOf1Xy5; arc=none smtp.client-ip=13.77.154.182 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.microsoft.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.microsoft.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.microsoft.com header.i=@linux.microsoft.com header.b="YsOf1Xy5" Received: by linux.microsoft.com (Postfix, from userid 1173) id C861921176DE; Tue, 17 Jun 2025 00:17:44 -0700 (PDT) DKIM-Filter: OpenDKIM Filter v2.11.0 linux.microsoft.com C861921176DE DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.microsoft.com; s=default; t=1750144664; bh=iuVu/Xa3ktHW/EAnoVfNYUcqYE9Q+71sMK3z+ize3FE=; h=From:To:Subject:Date:In-Reply-To:References:From; b=YsOf1Xy5hTI2oxbqUTFGo+722wGke5IoBpEN4NC/cooN7BGHR2TjeQijUIXjHjiaD S5BHvWSP4J00O+qvS9eDmR+RP1rZPzy6o7bk2ATLlltmL4a2QO/majA6EpHePT6n8Y 9C2qW8LXFKW7alWITmP5h+Gx6eVAxKjaboRndxQo= From: Erni Sri Satya Vennela To: kys@microsoft.com, haiyangz@microsoft.com, wei.liu@kernel.org, decui@microsoft.com, andrew+netdev@lunn.ch, davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, longli@microsoft.com, kotaranov@microsoft.com, horms@kernel.org, shirazsaleem@microsoft.com, leon@kernel.org, ernis@linux.microsoft.com, shradhagupta@linux.microsoft.com, schakrabarti@linux.microsoft.com, gerhard@engleder-embedded.com, rosenp@gmail.com, sdf@fomichev.me, linux-hyperv@vger.kernel.org, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org Subject: [PATCH net-next v3 4/4] net: mana: Handle unsupported HWC commands Date: Tue, 17 Jun 2025 00:17:36 -0700 Message-Id: <1750144656-2021-5-git-send-email-ernis@linux.microsoft.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1750144656-2021-1-git-send-email-ernis@linux.microsoft.com> References: <1750144656-2021-1-git-send-email-ernis@linux.microsoft.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" If any of the HWC commands are not recognized by the underlying hardware, the hardware returns the response header status of -1. Log the information using netdev_info_once to avoid multiple error logs in dmesg. Signed-off-by: Erni Sri Satya Vennela Reviewed-by: Haiyang Zhang Reviewed-by: Shradha Gupta Reviewed-by: Saurabh Singh Sengar Reviewed-by: Dipayaan Roy --- Changes in v3: * Rebase to latest net-next branch. Changes in v2: * Define GDMA_STATUS_CMD_UNSUPPORTED for unsupported HWC status code instead of using -1. --- drivers/net/ethernet/microsoft/mana/hw_channel.c | 4 ++++ drivers/net/ethernet/microsoft/mana/mana_en.c | 11 +++++++++++ include/net/mana/gdma.h | 1 + 3 files changed, 16 insertions(+) diff --git a/drivers/net/ethernet/microsoft/mana/hw_channel.c b/drivers/net= /ethernet/microsoft/mana/hw_channel.c index 3d3677c0d014..650d22654d49 100644 --- a/drivers/net/ethernet/microsoft/mana/hw_channel.c +++ b/drivers/net/ethernet/microsoft/mana/hw_channel.c @@ -891,6 +891,10 @@ int mana_hwc_send_request(struct hw_channel_context *h= wc, u32 req_len, } =20 if (ctx->status_code && ctx->status_code !=3D GDMA_STATUS_MORE_ENTRIES) { + if (ctx->status_code =3D=3D GDMA_STATUS_CMD_UNSUPPORTED) { + err =3D -EOPNOTSUPP; + goto out; + } if (req_msg->req.msg_type !=3D MANA_QUERY_PHY_STAT) dev_err(hwc->dev, "HWC: Failed hw_channel req: 0x%x\n", ctx->status_code); diff --git a/drivers/net/ethernet/microsoft/mana/mana_en.c b/drivers/net/et= hernet/microsoft/mana/mana_en.c index d7079e05dfb8..5aee7bda1504 100644 --- a/drivers/net/ethernet/microsoft/mana/mana_en.c +++ b/drivers/net/ethernet/microsoft/mana/mana_en.c @@ -847,6 +847,9 @@ static int mana_send_request(struct mana_context *ac, v= oid *in_buf, err =3D mana_gd_send_request(gc, in_len, in_buf, out_len, out_buf); if (err || resp->status) { + if (err =3D=3D -EOPNOTSUPP) + return err; + if (req->req.msg_type !=3D MANA_QUERY_PHY_STAT) dev_err(dev, "Failed to send mana message: %d, 0x%x\n", err, resp->status); @@ -1252,6 +1255,10 @@ int mana_query_link_cfg(struct mana_port_context *ap= c) sizeof(resp)); =20 if (err) { + if (err =3D=3D -EOPNOTSUPP) { + netdev_info_once(ndev, "MANA_QUERY_LINK_CONFIG not supported\n"); + return err; + } netdev_err(ndev, "Failed to query link config: %d\n", err); return err; } @@ -1294,6 +1301,10 @@ int mana_set_bw_clamp(struct mana_port_context *apc,= u32 speed, sizeof(resp)); =20 if (err) { + if (err =3D=3D -EOPNOTSUPP) { + netdev_info_once(ndev, "MANA_SET_BW_CLAMP not supported\n"); + return err; + } netdev_err(ndev, "Failed to set bandwidth clamp for speed %u, err =3D %d= ", speed, err); return err; diff --git a/include/net/mana/gdma.h b/include/net/mana/gdma.h index bfae59202669..fdf144988cec 100644 --- a/include/net/mana/gdma.h +++ b/include/net/mana/gdma.h @@ -10,6 +10,7 @@ #include "shm_channel.h" =20 #define GDMA_STATUS_MORE_ENTRIES 0x00000105 +#define GDMA_STATUS_CMD_UNSUPPORTED 0xffffffff =20 /* Structures labeled with "HW DATA" are exchanged with the hardware. All = of * them are naturally aligned and hence don't need __packed. --=20 2.34.1