From nobody Sat Oct 11 08:26:20 2025 Received: from linux.microsoft.com (linux.microsoft.com [13.77.154.182]) by smtp.subspace.kernel.org (Postfix) with ESMTP id CD2D62D543C; Wed, 11 Jun 2025 08:46:35 +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=1749631597; cv=none; b=KGD1mwea/5Fv4VQQ+I8CBw6f2wk3Lx663E7kaOzes14HVEZCaJ9yxL3dutdUyV2QCnQB8zpgmNQikMprmswkqGlYmDXBxsXvGVV9LGOHR/EdEPp90qR5r9rI+sekVIluGmqsgVoX2zDj0RiT2r2VbXfk8DG3ApPHgwZJN9wNbxs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749631597; c=relaxed/simple; bh=g2DXMg5rmDnhugpiHMmf1QfeOmclMqtPIujzWBitXX8=; h=From:To:Subject:Date:Message-Id:In-Reply-To:References; b=LayuUdDlQ8pM/s+7cU0w1q7GhFnkBalTkDhwlq4vaKCsVkHdqqqw/U7MoZBfaMxcTfjTgeHNrvVeUJprPUAvDwWKumiMNK6fHkxTOIwhANwG2+svPgbfjh+MmEgN5HBu9cCMX915ct++WbzjVyfv7mBgfpaVF7saAXue4eJXEmM= 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=f5kdgpoE; 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="f5kdgpoE" Received: by linux.microsoft.com (Postfix, from userid 1173) id 832F22115189; Wed, 11 Jun 2025 01:46:35 -0700 (PDT) DKIM-Filter: OpenDKIM Filter v2.11.0 linux.microsoft.com 832F22115189 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.microsoft.com; s=default; t=1749631595; bh=r+GqLCuBE+ClBIUMKxQZzaAOal17+iAyuCgNMG8+Nm0=; h=From:To:Subject:Date:In-Reply-To:References:From; b=f5kdgpoEK3sZJT0i3w+IW0E99j79V2CPaRqZXhQndQH38n1bdsQrTfXaB/pHbFzvP he0ZO8kEn1vSm0LaMm+Cld4Qw1mvbgu0HQ2G1kTiAgo+BiEcJzO8qk9c5IW29JRbXa 78/rwrfx36XOg2ZY+d+Eq10kI5mQQXXAgD14F5OA= 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, kotaranov@microsoft.com, longli@microsoft.com, horms@kernel.org, shirazsaleem@microsoft.com, leon@kernel.org, ernis@linux.microsoft.com, shradhagupta@linux.microsoft.com, schakrabarti@linux.microsoft.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 1/4] net: mana: Fix potential deadlocks in mana napi ops Date: Wed, 11 Jun 2025 01:46:13 -0700 Message-Id: <1749631576-2517-2-git-send-email-ernis@linux.microsoft.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1749631576-2517-1-git-send-email-ernis@linux.microsoft.com> References: <1749631576-2517-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. The netvsc sets up MANA VF via following call chain: netvsc_vf_setup() dev_change_flags() ... __dev_open() OR __dev_close() dev_change_flags() holds the netdev mutex via netdev_lock_ops. During this process, mana_create_txq() and mana_create_rxq() invoke netif_napi_add_tx(), netif_napi_add_weight(), and napi_enable(), all of which attempt to acquire the same lock, leading to a potential deadlock. Similarly, mana_destroy_txq() and mana_destroy_rxq() call netif_napi_disable() and netif_napi_del(), which also 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 Sengar --- drivers/net/ethernet/microsoft/mana/mana_en.c | 39 ++++++++++++++----- 1 file changed, 30 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 ccd2885c939e..3c879d8a39e3 100644 --- a/drivers/net/ethernet/microsoft/mana/mana_en.c +++ b/drivers/net/ethernet/microsoft/mana/mana_en.c @@ -1911,8 +1911,13 @@ 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); + if (netdev_need_ops_lock(napi->dev)) { + napi_disable_locked(napi); + netif_napi_del_locked(napi); + } else { + napi_disable(napi); + netif_napi_del(napi); + } apc->tx_qp[i].txq.napi_initialized =3D false; } mana_destroy_wq_obj(apc, GDMA_SQ, apc->tx_qp[i].tx_object); @@ -2064,8 +2069,14 @@ 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); + if (netdev_need_ops_lock(net)) { + set_bit(NAPI_STATE_NO_BUSY_POLL, &cq->napi.state); + netif_napi_add_locked(net, &cq->napi, mana_poll); + napi_enable_locked(&cq->napi); + } else { + netif_napi_add_tx(net, &cq->napi, mana_poll); + napi_enable(&cq->napi); + } txq->napi_initialized =3D true; =20 mana_gd_ring_cq(cq->gdma_cq, SET_ARM_BIT); @@ -2101,9 +2112,13 @@ 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); + if (netdev_need_ops_lock(napi->dev)) { + napi_disable_locked(napi); + netif_napi_del_locked(napi); + } else { + napi_disable(napi); + netif_napi_del(napi); + } } xdp_rxq_info_unreg(&rxq->xdp_rxq); =20 @@ -2354,14 +2369,20 @@ 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); + if (netdev_need_ops_lock(ndev)) + netif_napi_add_weight_locked(ndev, &cq->napi, mana_poll, 1); + else + netif_napi_add_weight(ndev, &cq->napi, mana_poll, 1); =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); + if (netdev_need_ops_lock(ndev)) + napi_enable_locked(&cq->napi); + else + napi_enable(&cq->napi); =20 mana_gd_ring_cq(cq->gdma_cq, SET_ARM_BIT); out: --=20 2.34.1 From nobody Sat Oct 11 08:26:20 2025 Received: from linux.microsoft.com (linux.microsoft.com [13.77.154.182]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 71C112417C3; Wed, 11 Jun 2025 08:46:37 +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=1749631599; cv=none; b=FWcRbLOj8+7q55kVEs2ySKt7xwF5L7OzN+1Z14WMSBev47Hutu3iYIResPbsgYEd0yjXgXaT7gg+4Xy7jQFC/gbbFrZU1RXeMiX9KWVwmpwgQPyJYnDtTjR1gWE2RGF9qdjrEGO+ue+hVuWm3NtAe6yfGz/r883cOSFUE7bc34I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749631599; c=relaxed/simple; bh=FKunBQHcsmHIGlOmqC1puDrj393kDj4B94DCGzikn+k=; h=From:To:Subject:Date:Message-Id:In-Reply-To:References; b=pTwsqBi/rYkYyJZLsvzFKdzSJ2/SXf4rxwMvO/PgiKmkeSAdVEk7WdlUL8WSFAodtegBSDG+wYIzVfjzOY3Dz71Lw9R1vNm/nFGB2BMZo2DFc0WrQmVjarQrVpbX9KXYAv0yGGWEHw7WAZhZeB7x2LhOh6TzcXtGHYbPnMH4yTU= 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=AxT/4B9U; 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="AxT/4B9U" Received: by linux.microsoft.com (Postfix, from userid 1173) id 10021203EE33; Wed, 11 Jun 2025 01:46:37 -0700 (PDT) DKIM-Filter: OpenDKIM Filter v2.11.0 linux.microsoft.com 10021203EE33 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.microsoft.com; s=default; t=1749631597; bh=eRtznUqeONE6kFm2AmSsVuxXMNuSUpILwuYIBSGdDR8=; h=From:To:Subject:Date:In-Reply-To:References:From; b=AxT/4B9UdFL0guo5/yvMZ2beDMiRImYrHl9s0ZGOEQMj700VjdXqp7imVZb1WRI4a YUwieIzqB3GjjcBphH1r9svTmAQAiA0pErDMmwddj8+WFITRwu7Qr2QGrJH0EycHKG eKH0Xzt94z2v7xUFiwVaMDKxHloK3N/4HTzHogN0= 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, kotaranov@microsoft.com, longli@microsoft.com, horms@kernel.org, shirazsaleem@microsoft.com, leon@kernel.org, ernis@linux.microsoft.com, shradhagupta@linux.microsoft.com, schakrabarti@linux.microsoft.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 2/4] net: mana: Add support for net_shaper_ops Date: Wed, 11 Jun 2025 01:46:14 -0700 Message-Id: <1749631576-2517-3-git-send-email-ernis@linux.microsoft.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1749631576-2517-1-git-send-email-ernis@linux.microsoft.com> References: <1749631576-2517-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 --- 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 3c879d8a39e3..b704dbc5e344 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) @@ -1161,6 +1234,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_err(ndev, "QoS is unconfigured\n"); + return -EINVAL; + } + + 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, @@ -2939,6 +3092,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 9abb66461211..0df84e51d541 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" @@ -467,7 +468,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 */ @@ -501,6 +507,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); 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); =20 @@ -527,6 +536,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, =20 /* Privileged commands for the PF mode */ MANA_REGISTER_FILTER =3D 0x28000, @@ -535,6 +546,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 Sat Oct 11 08:26:20 2025 Received: from linux.microsoft.com (linux.microsoft.com [13.77.154.182]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 98DAF244696; Wed, 11 Jun 2025 08:46:38 +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=1749631600; cv=none; b=MjJCyvvVDyzPD36+JAuWUUof0T65uwalJwjmbVUYxHXfTojHqQTxtn32qXtGW9KRHPE7zQlRpDlTeVvs/qTLDvF0udftynqnDswX2x62X5RvMcw4JsfauKFCh7cmWd42bWMimtZAsIeh3DqzhSGBi1PELfSD1iq9i6ys1esmaRU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749631600; c=relaxed/simple; bh=B5QcjUw1TVB/cgcJXO0yOq+qijZPDe2RgswZ2wz1BQ8=; h=From:To:Subject:Date:Message-Id:In-Reply-To:References; b=eNc5zuyBionyDjhVuzT7xGmg3HI0ZUq7Z+i2zf2cYzVgIGC3ol8f050OUwvsbOPEBkvTByu6ihRXECPbAtkToEvB0rQl4owdiD1+tX597ZEGFKl1vU7MI9XBbuFndlVddfn/71q2ov945tpVOfVHRfLzEph2jPL5cB5cN4N1UbM= 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=XGgjj2eQ; 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="XGgjj2eQ" Received: by linux.microsoft.com (Postfix, from userid 1173) id 4E060211518F; Wed, 11 Jun 2025 01:46:38 -0700 (PDT) DKIM-Filter: OpenDKIM Filter v2.11.0 linux.microsoft.com 4E060211518F DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.microsoft.com; s=default; t=1749631598; bh=I6vB1Wq27t0k520nUYZpKG2BNw+dELu8m+xor7KkEjI=; h=From:To:Subject:Date:In-Reply-To:References:From; b=XGgjj2eQDxSSGSxnN6VTn6LiUGdMAHblbeRDlk/8Ka8ziPJapig03AVbivZKtO4Df f+dI0vCdOoM0hr7ySIDsUfCUXNDdBmxMgIfb47azc4dkUTAzhQHMv3l6AvfSHqAiYN gYkuBpZm35oimOe/tLT/G65emXLvY2s4cvsAcz14= 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, kotaranov@microsoft.com, longli@microsoft.com, horms@kernel.org, shirazsaleem@microsoft.com, leon@kernel.org, ernis@linux.microsoft.com, shradhagupta@linux.microsoft.com, schakrabarti@linux.microsoft.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 3/4] net: mana: Add speed support in mana_get_link_ksettings Date: Wed, 11 Jun 2025 01:46:15 -0700 Message-Id: <1749631576-2517-4-git-send-email-ernis@linux.microsoft.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1749631576-2517-1-git-send-email-ernis@linux.microsoft.com> References: <1749631576-2517-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 ot that 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 --- 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 b704dbc5e344..d5644400e71f 100644 --- a/drivers/net/ethernet/microsoft/mana/mana_en.c +++ b/drivers/net/ethernet/microsoft/mana/mana_en.c @@ -1271,6 +1271,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 c419626073f5..1026b0b2b59f 100644 --- a/drivers/net/ethernet/microsoft/mana/mana_ethtool.c +++ b/drivers/net/ethernet/microsoft/mana/mana_ethtool.c @@ -427,6 +427,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 0df84e51d541..5f38dec04d31 100644 --- a/include/net/mana/mana.h +++ b/include/net/mana/mana.h @@ -474,6 +474,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 Sat Oct 11 08:26:20 2025 Received: from linux.microsoft.com (linux.microsoft.com [13.77.154.182]) by smtp.subspace.kernel.org (Postfix) with ESMTP id AE020246BB3; Wed, 11 Jun 2025 08:46: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=1749631601; cv=none; b=WZtNA6cRmjI6fS2DzBLfGgG90x7wC1SJENUazuIDm+9SbDJnyDwuFD4LoLJvU2TPCEV7/CqV5lubiTSNVAekdl9HtSv8RhOTBVeTMw8TBVXu28s4Ts4KQL485xKte/B1ilqxM9hmBXKsN+uw/n61ip8ZV5mgiX9/WpB8Mj90YMo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749631601; c=relaxed/simple; bh=oaCZKffoKTRaYLQaOQmKEatR6VZNaajk+LZ5gGTX9/I=; h=From:To:Subject:Date:Message-Id:In-Reply-To:References; b=aVxYI37RXmB84U0pzqXqSK5LOOK9UENkTt1nRcFfuskrg/eub+hjA7D0CeIbhlRqsEKDtAnNgzs/FMXosCeKuaGWn43ctE/J/+6Kc9VQIQyxF0kG+061hIDCp/4rex6YxYkdUBG5otukUH2WOw7GSy1z2f/wlNA4dwzJSXrUK+8= 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=IT9XsNVh; 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="IT9XsNVh" Received: by linux.microsoft.com (Postfix, from userid 1173) id 8AA74203EE33; Wed, 11 Jun 2025 01:46:39 -0700 (PDT) DKIM-Filter: OpenDKIM Filter v2.11.0 linux.microsoft.com 8AA74203EE33 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.microsoft.com; s=default; t=1749631599; bh=OGSFbFWlvID5n+uvvpGHPCf0P298GMnuBGj103nsKgk=; h=From:To:Subject:Date:In-Reply-To:References:From; b=IT9XsNVhUdwOhullceh//stg/VTqX6hASTpbI6H/bYh53wBAZ9z0PlXQlROx5B6ko ckffP9CydkxFrl+/Dshg0Bpi5jz9a1B44dMeZfN9ObP4tWaYG9vOCofAi9FIU5hWqW mWfHwNHT9rDhGISusRjINYwvkiioQw/wiqlzpjzg= 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, kotaranov@microsoft.com, longli@microsoft.com, horms@kernel.org, shirazsaleem@microsoft.com, leon@kernel.org, ernis@linux.microsoft.com, shradhagupta@linux.microsoft.com, schakrabarti@linux.microsoft.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 4/4] net: mana: Handle unsupported HWC commands Date: Wed, 11 Jun 2025 01:46:16 -0700 Message-Id: <1749631576-2517-5-git-send-email-ernis@linux.microsoft.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1749631576-2517-1-git-send-email-ernis@linux.microsoft.com> References: <1749631576-2517-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: Dipayaan Roy --- drivers/net/ethernet/microsoft/mana/hw_channel.c | 4 ++++ drivers/net/ethernet/microsoft/mana/mana_en.c | 11 +++++++++++ 2 files changed, 15 insertions(+) diff --git a/drivers/net/ethernet/microsoft/mana/hw_channel.c b/drivers/net= /ethernet/microsoft/mana/hw_channel.c index a8c4d8db75a5..70c3b57b1e75 100644 --- a/drivers/net/ethernet/microsoft/mana/hw_channel.c +++ b/drivers/net/ethernet/microsoft/mana/hw_channel.c @@ -890,6 +890,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 -1) { + err =3D -EOPNOTSUPP; + goto out; + } dev_err(hwc->dev, "HWC: Failed hw_channel req: 0x%x\n", ctx->status_code); err =3D -EPROTO; diff --git a/drivers/net/ethernet/microsoft/mana/mana_en.c b/drivers/net/et= hernet/microsoft/mana/mana_en.c index d5644400e71f..10e766c73fca 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; + dev_err(dev, "Failed to send mana message: %d, 0x%x\n", err, resp->status); return err ? err : -EPROTO; @@ -1251,6 +1254,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; } @@ -1293,6 +1300,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; --=20 2.34.1