From nobody Fri Oct 10 13:36:37 2025 Received: from linux.microsoft.com (linux.microsoft.com [13.77.154.182]) by smtp.subspace.kernel.org (Postfix) with ESMTP id A60E52D540C; Fri, 13 Jun 2025 11:20:30 +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=1749813632; cv=none; b=E3eSyEw6Fr9op1bX5wNQHIRFbQ5yTzmpIU0h5PL2jVugRJGdC6nGn0PHkmDKMEwyCabQ3nT3bN9q2LmeT9GqptxxNk2s+4j1zwoMRXaRnMwqDFiUFNsa1LaLtWKBs6ioyqPmfP+7PdG9zjjt3kNfHhteZL7RtECYvxrjfqjXvVY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749813632; c=relaxed/simple; bh=T8M8l/OSfqF6LAD2opiryZllIbiWH12cgjvJos95K/A=; h=From:To:Subject:Date:Message-Id:In-Reply-To:References; b=YYOxnP05Q1jpux4uYBBqSAeKcXO4PyhSxKaA7w8ljI28DLZccLckYnaz7I9k4FOwDGdceBH4ZGrSBi4dPn6oHcPNHt+Su+YkObEdDJ4eCoxgbxOAw/m0zwKfSrkfMNKyGvqaZooqU/FC38qMU3J18edGd1BHx+XkYrxt4HveziM= 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=rcj58bYi; 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="rcj58bYi" Received: by linux.microsoft.com (Postfix, from userid 1173) id 43663201C775; Fri, 13 Jun 2025 04:20:30 -0700 (PDT) DKIM-Filter: OpenDKIM Filter v2.11.0 linux.microsoft.com 43663201C775 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.microsoft.com; s=default; t=1749813630; bh=cP2o3EuJ+p3R1t0enkJckW1hpdqJe16ROT2UBloMEak=; h=From:To:Subject:Date:In-Reply-To:References:From; b=rcj58bYikfHixGsadDstumxnYOpQ2cczgQ3tPbZwypPNycE6iiYQASD14+rtR5Wxq 1INnpJ4W3DvFB4MjF9rkd6z4E3lQJlUfrhTkPAkViR8/nDALW7FoN/fnnsuUZaYGVJ fCtUEwxNuq+aG/kxvnMEMUBJs4AfjzPvpf5xXjIY= 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 v2 1/4] net: mana: Fix potential deadlocks in mana napi ops Date: Fri, 13 Jun 2025 04:20:24 -0700 Message-Id: <1749813627-8377-2-git-send-email-ernis@linux.microsoft.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1749813627-8377-1-git-send-email-ernis@linux.microsoft.com> References: <1749813627-8377-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 --- 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 | 30 +++++++++++++------ 1 file changed, 21 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..ca5e9c3d374b 100644 --- a/drivers/net/ethernet/microsoft/mana/mana_en.c +++ b/drivers/net/ethernet/microsoft/mana/mana_en.c @@ -1912,8 +1912,11 @@ 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 +2068,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 +2108,11 @@ 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 +2363,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 13:36:37 2025 Received: from linux.microsoft.com (linux.microsoft.com [13.77.154.182]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 8D7212D5C8C; Fri, 13 Jun 2025 11:20:31 +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=1749813633; cv=none; b=PUtvk9te9MnboOX0rhGBcEXzCooWRV00TRV15G1Rj5hzl0Ukoa6LBixaieKI7Xb+of8ao2wFb7mXv7V/pCt9X8zDrIRvAhC78Xsy/2sQ86VxJ0w9JUAtpZx4Lnr6JOQEd0EZygrlzHGcQZ7e2GR1VzovrxuvIBcnzE/DMHvfquA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749813633; c=relaxed/simple; bh=G0oeYoO5zh0MZIY+o1uefvAKwGbbqqD6PD6BXIp9CD8=; h=From:To:Subject:Date:Message-Id:In-Reply-To:References; b=dxvceWExNxQUQTPF3g0RvpcVb76jHDU1xWci6esYTKYkw9Cwgre08kgkQcTjKe/yTrU3Z5wKTVguN93Jt3FkruynvZb+wi7b2a5/EcdOcF1bHPvXuM6zvIvf8iJ5KAOGJHQ8u33y7Mf0t6KqmOXHyD3NW8IYVCwDJmZ1MXvQSVY= 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=IdPwk6vE; 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="IdPwk6vE" Received: by linux.microsoft.com (Postfix, from userid 1173) id 3BA102113A73; Fri, 13 Jun 2025 04:20:31 -0700 (PDT) DKIM-Filter: OpenDKIM Filter v2.11.0 linux.microsoft.com 3BA102113A73 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.microsoft.com; s=default; t=1749813631; bh=s0PEMM2zSlk/k5ztWfVZgDG0WnnnScL7Cy11uQzbLIE=; h=From:To:Subject:Date:In-Reply-To:References:From; b=IdPwk6vE8Jv322byJFyr8qHpIhaI4Oe04oyNlFy7EM17k3ps1W2MgUQKMORF/uMud J2zgmpXv/J5dYZxBUrEpB1uaSQ2eFVqCOXl3eGXkTralViIDgPbwaTuVN/OZlGJCZF Hm3kbXWQkbhnCoFNsOlk2DCFxu9gRk8mmM1GgQqI= 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 v2 2/4] net: mana: Add support for net_shaper_ops Date: Fri, 13 Jun 2025 04:20:25 -0700 Message-Id: <1749813627-8377-3-git-send-email-ernis@linux.microsoft.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1749813627-8377-1-git-send-email-ernis@linux.microsoft.com> References: <1749813627-8377-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 --- 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 ca5e9c3d374b..7e8bc2c6a194 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, @@ -3013,6 +3166,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 13:36:37 2025 Received: from linux.microsoft.com (linux.microsoft.com [13.77.154.182]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 8C17F2D8778; Fri, 13 Jun 2025 11:20:32 +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=1749813634; cv=none; b=aoeJtL+0EGM/YEmGm7KIVpdUFDki5rMv4uxJJZx5BuWH404zptfWNly5RHTbHQssAfI+c+s7IxpzGKLp2BmMz678gTZ9ecPOIc8PGcxymiYW0xcMDUUvV1SJC7fctL0HNsKHaPxYjWDLF+fw95PS2lSq5wuu7bvr9bCIx1L9MUQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749813634; c=relaxed/simple; bh=OBRSd7WT4BkXBIhKRy7/4sQyu81IXc/MtzNZy6JnjkU=; h=From:To:Subject:Date:Message-Id:In-Reply-To:References; b=UqlMp2wAYLJv8nip4hW5zHXLizqKgheDKplMja/ifb9S1fJ8Go8IxUkJ2AGv1FzrcpQDyqLsKdPnu/hVX1ajBA+Ubgrl3DQXZ40HQpUKoK7jPjDKvHLCwSDIA/xSPyNtGbpUKY21KSEC6bYrH2nbg608NNjVstfO04RhQC42ViQ= 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=fdBndOap; 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="fdBndOap" Received: by linux.microsoft.com (Postfix, from userid 1173) id 1CFCD2115189; Fri, 13 Jun 2025 04:20:32 -0700 (PDT) DKIM-Filter: OpenDKIM Filter v2.11.0 linux.microsoft.com 1CFCD2115189 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.microsoft.com; s=default; t=1749813632; bh=BqSBN+65YZJiSCSL/gtogSMXpS7OJBtQMStl9721njU=; h=From:To:Subject:Date:In-Reply-To:References:From; b=fdBndOapKxV3jXo7zfVJa5MhUBBNJlov+QsSwWJ4IH6AKizPaqZyjvJq2r010k91a CVeREEkf3ldgaDg3xOvghFKHOYeLpcpHxFJHzZoPgqoGUrukkNe+0JVZnVwtvBAbmC XGNBtwILCRLJ0flMjE4L0p0q+6/9vYDi7W/flqtE= 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 v2 3/4] net: mana: Add speed support in mana_get_link_ksettings Date: Fri, 13 Jun 2025 04:20:26 -0700 Message-Id: <1749813627-8377-4-git-send-email-ernis@linux.microsoft.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1749813627-8377-1-git-send-email-ernis@linux.microsoft.com> References: <1749813627-8377-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 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 7e8bc2c6a194..54a86c233948 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 13:36:37 2025 Received: from linux.microsoft.com (linux.microsoft.com [13.77.154.182]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 68CE72DECC7; Fri, 13 Jun 2025 11:20:33 +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=1749813634; cv=none; b=jFBPlbUD5uy/UlPiuXXKh8xHg4icuIm6qEW2bF0XT1o+bBu9s3ygxDgkLxMXqWFrIylswsfXGlNGGfiY90xmrz236KeTUc0CR7MnwSbV3qqxcX2C6TgALv+hg9tuwetjXsm8nsNMSVBARRxvQeNhT9NtieK+NI6mTY5ClhnkTJw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749813634; c=relaxed/simple; bh=5+dUxXBeTxzT+dImx+nunp7dvhoq71qj4IUSAoqj+nM=; h=From:To:Subject:Date:Message-Id:In-Reply-To:References; b=ZxYoxLtwDdhDHgFw9PRrR+kTwOzxi8xnxd8WexwIQE9d20k+sk6Q6/a1FFPg/dk80Ui0RjYlIyzSnXrmGcVQD7EauzkN+0lCBfV2iSiEC4U6QcVFK0O2bd+vqNqc1sWS5lPjGrN1M8QkvH6/i5V9l54YeK/wazDVI9T82ENhxNs= 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=OMRX2svp; 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="OMRX2svp" Received: by linux.microsoft.com (Postfix, from userid 1173) id 111862113A74; Fri, 13 Jun 2025 04:20:33 -0700 (PDT) DKIM-Filter: OpenDKIM Filter v2.11.0 linux.microsoft.com 111862113A74 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.microsoft.com; s=default; t=1749813633; bh=dWbk6Wcgu9Mw3tIUfMKWsdLrsOL+GBBGHi3425QsaNo=; h=From:To:Subject:Date:In-Reply-To:References:From; b=OMRX2svpuWY/iIIpOLi4mukGMq6zZVj0PJvpcP2yySV7IR1uirDTUOmdeahw4FzFe P0cTdNNE4T6pED87k5jwJ5GWjgECasSyi4x8dGO2IQ628qMDwuDum9TNaq/FuiMJny NZC5/DB+liN+l6U9Vp7cdxAn+ZWs3oN1WOXZr/xM= 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 v2 4/4] net: mana: Handle unsupported HWC commands Date: Fri, 13 Jun 2025 04:20:27 -0700 Message-Id: <1749813627-8377-5-git-send-email-ernis@linux.microsoft.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1749813627-8377-1-git-send-email-ernis@linux.microsoft.com> References: <1749813627-8377-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 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 54a86c233948..50a947859bd0 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 3ce56a816425..7752ab0a55cf 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