* [RFCv2 PATCH net-next 0/2] net-next: ethool: add support to get/set tx push by ethtool -G/g @ 2022-03-26 8:51 Jie Wang 2022-03-26 8:51 ` [RFCv2 PATCH net-next 1/2] net-next: ethtool: extend ringparam set/get APIs for tx_push Jie Wang 2022-03-26 8:51 ` [RFCv2 PATCH net-next 2/2] net-next: hn3: add tx push support in hns3 ring param process Jie Wang 0 siblings, 2 replies; 6+ messages in thread From: Jie Wang @ 2022-03-26 8:51 UTC (permalink / raw) To: mkubecek, davem, kuba, wangjie125 Cc: netdev, huangguangbin2, lipeng321, shenjian15, moyufeng, linyunsheng, salil.mehta, chenhao288 These two patches add tx push in ring parms and adapt the set and get APIs of ring params The former discussion please see [1]. [1]:https://lore.kernel.org/netdev/20220315032108.57228-1-wangjie125@huawei.com/ ChangeLog: V1->V2 extend tx push param in ringparam, suggested by Jakub Kicinski. Jie Wang (2): net-next: ethtool: extend ringparam set/get APIs for tx_push net-next: hn3: add tx push support in hns3 ring param process .../ethernet/hisilicon/hns3/hns3_ethtool.c | 30 +++++++++++++++++++ include/linux/ethtool.h | 3 ++ include/uapi/linux/ethtool_netlink.h | 1 + net/ethtool/netlink.h | 2 +- net/ethtool/rings.c | 9 ++++-- 5 files changed, 42 insertions(+), 3 deletions(-) -- 2.33.0 ^ permalink raw reply [flat|nested] 6+ messages in thread
* [RFCv2 PATCH net-next 1/2] net-next: ethtool: extend ringparam set/get APIs for tx_push 2022-03-26 8:51 [RFCv2 PATCH net-next 0/2] net-next: ethool: add support to get/set tx push by ethtool -G/g Jie Wang @ 2022-03-26 8:51 ` Jie Wang 2022-03-26 19:50 ` Jakub Kicinski 2022-03-26 8:51 ` [RFCv2 PATCH net-next 2/2] net-next: hn3: add tx push support in hns3 ring param process Jie Wang 1 sibling, 1 reply; 6+ messages in thread From: Jie Wang @ 2022-03-26 8:51 UTC (permalink / raw) To: mkubecek, davem, kuba, wangjie125 Cc: netdev, huangguangbin2, lipeng321, shenjian15, moyufeng, linyunsheng, salil.mehta, chenhao288 Currently tx push is a standard driver feature which controls use of a fast path descriptor push. So this patch extends the ringparam APIs and data structures to support set/get tx push by ethtool -G/g. Signed-off-by: Jie Wang <wangjie125@huawei.com> --- include/linux/ethtool.h | 3 +++ include/uapi/linux/ethtool_netlink.h | 1 + net/ethtool/netlink.h | 2 +- net/ethtool/rings.c | 9 +++++++-- 4 files changed, 12 insertions(+), 3 deletions(-) diff --git a/include/linux/ethtool.h b/include/linux/ethtool.h index 4af58459a1e7..096771ee8586 100644 --- a/include/linux/ethtool.h +++ b/include/linux/ethtool.h @@ -72,11 +72,13 @@ enum { * @rx_buf_len: Current length of buffers on the rx ring. * @tcp_data_split: Scatter packet headers and data to separate buffers * @cqe_size: Size of TX/RX completion queue event + * @tx_push: The flag of tx push mode */ struct kernel_ethtool_ringparam { u32 rx_buf_len; u8 tcp_data_split; u32 cqe_size; + u32 tx_push; }; /** @@ -87,6 +89,7 @@ struct kernel_ethtool_ringparam { enum ethtool_supported_ring_param { ETHTOOL_RING_USE_RX_BUF_LEN = BIT(0), ETHTOOL_RING_USE_CQE_SIZE = BIT(1), + ETHTOOL_RING_USE_TX_PUSH = BIT(2), }; #define __ETH_RSS_HASH_BIT(bit) ((u32)1 << (bit)) diff --git a/include/uapi/linux/ethtool_netlink.h b/include/uapi/linux/ethtool_netlink.h index 979850221b8d..d2fb4f7be61b 100644 --- a/include/uapi/linux/ethtool_netlink.h +++ b/include/uapi/linux/ethtool_netlink.h @@ -338,6 +338,7 @@ enum { ETHTOOL_A_RINGS_RX_BUF_LEN, /* u32 */ ETHTOOL_A_RINGS_TCP_DATA_SPLIT, /* u8 */ ETHTOOL_A_RINGS_CQE_SIZE, /* u32 */ + ETHTOOL_A_RINGS_TX_PUSH, /* u8 */ /* add new constants above here */ __ETHTOOL_A_RINGS_CNT, diff --git a/net/ethtool/netlink.h b/net/ethtool/netlink.h index 29d01662a48b..7919ddb2371c 100644 --- a/net/ethtool/netlink.h +++ b/net/ethtool/netlink.h @@ -363,7 +363,7 @@ extern const struct nla_policy ethnl_features_set_policy[ETHTOOL_A_FEATURES_WANT extern const struct nla_policy ethnl_privflags_get_policy[ETHTOOL_A_PRIVFLAGS_HEADER + 1]; extern const struct nla_policy ethnl_privflags_set_policy[ETHTOOL_A_PRIVFLAGS_FLAGS + 1]; extern const struct nla_policy ethnl_rings_get_policy[ETHTOOL_A_RINGS_HEADER + 1]; -extern const struct nla_policy ethnl_rings_set_policy[ETHTOOL_A_RINGS_CQE_SIZE + 1]; +extern const struct nla_policy ethnl_rings_set_policy[ETHTOOL_A_RINGS_TX_PUSH + 1]; extern const struct nla_policy ethnl_channels_get_policy[ETHTOOL_A_CHANNELS_HEADER + 1]; extern const struct nla_policy ethnl_channels_set_policy[ETHTOOL_A_CHANNELS_COMBINED_COUNT + 1]; extern const struct nla_policy ethnl_coalesce_get_policy[ETHTOOL_A_COALESCE_HEADER + 1]; diff --git a/net/ethtool/rings.c b/net/ethtool/rings.c index 9f33c9689b56..10f8c99ff17e 100644 --- a/net/ethtool/rings.c +++ b/net/ethtool/rings.c @@ -55,7 +55,8 @@ static int rings_reply_size(const struct ethnl_req_info *req_base, nla_total_size(sizeof(u32)) + /* _RINGS_TX */ nla_total_size(sizeof(u32)) + /* _RINGS_RX_BUF_LEN */ nla_total_size(sizeof(u8)) + /* _RINGS_TCP_DATA_SPLIT */ - nla_total_size(sizeof(u32)); /* _RINGS_CQE_SIZE */ + nla_total_size(sizeof(u32) + /* _RINGS_CQE_SIZE */ + nla_total_size(sizeof(u8))); /* _RINGS_TX_PUSH */ } static int rings_fill_reply(struct sk_buff *skb, @@ -94,7 +95,8 @@ static int rings_fill_reply(struct sk_buff *skb, (nla_put_u8(skb, ETHTOOL_A_RINGS_TCP_DATA_SPLIT, kr->tcp_data_split))) || (kr->cqe_size && - (nla_put_u32(skb, ETHTOOL_A_RINGS_CQE_SIZE, kr->cqe_size)))) + (nla_put_u32(skb, ETHTOOL_A_RINGS_CQE_SIZE, kr->cqe_size))) || + nla_put_u8(skb, ETHTOOL_A_RINGS_TX_PUSH, !!kr->tx_push)) return -EMSGSIZE; return 0; @@ -123,6 +125,7 @@ const struct nla_policy ethnl_rings_set_policy[] = { [ETHTOOL_A_RINGS_TX] = { .type = NLA_U32 }, [ETHTOOL_A_RINGS_RX_BUF_LEN] = NLA_POLICY_MIN(NLA_U32, 1), [ETHTOOL_A_RINGS_CQE_SIZE] = NLA_POLICY_MIN(NLA_U32, 1), + [ETHTOOL_A_RINGS_TX_PUSH] = { .type = NLA_U8 }, }; int ethnl_set_rings(struct sk_buff *skb, struct genl_info *info) @@ -165,6 +168,8 @@ int ethnl_set_rings(struct sk_buff *skb, struct genl_info *info) tb[ETHTOOL_A_RINGS_RX_BUF_LEN], &mod); ethnl_update_u32(&kernel_ringparam.cqe_size, tb[ETHTOOL_A_RINGS_CQE_SIZE], &mod); + ethnl_update_bool32(&kernel_ringparam.tx_push, + tb[ETHTOOL_A_RINGS_TX_PUSH], &mod); ret = 0; if (!mod) goto out_ops; -- 2.33.0 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [RFCv2 PATCH net-next 1/2] net-next: ethtool: extend ringparam set/get APIs for tx_push 2022-03-26 8:51 ` [RFCv2 PATCH net-next 1/2] net-next: ethtool: extend ringparam set/get APIs for tx_push Jie Wang @ 2022-03-26 19:50 ` Jakub Kicinski 2022-03-28 3:05 ` wangjie (L) 0 siblings, 1 reply; 6+ messages in thread From: Jakub Kicinski @ 2022-03-26 19:50 UTC (permalink / raw) To: Jie Wang Cc: mkubecek, davem, netdev, huangguangbin2, lipeng321, shenjian15, moyufeng, linyunsheng, salil.mehta, chenhao288 On Sat, 26 Mar 2022 16:51:01 +0800 Jie Wang wrote: > Currently tx push is a standard driver feature which controls use of a fast > path descriptor push. So this patch extends the ringparam APIs and data > structures to support set/get tx push by ethtool -G/g. > > Signed-off-by: Jie Wang <wangjie125@huawei.com> > --- > include/linux/ethtool.h | 3 +++ > include/uapi/linux/ethtool_netlink.h | 1 + > net/ethtool/netlink.h | 2 +- > net/ethtool/rings.c | 9 +++++++-- You need to add documentation in: Documentation/networking/ethtool-netlink.rst > diff --git a/include/linux/ethtool.h b/include/linux/ethtool.h > index 4af58459a1e7..096771ee8586 100644 > --- a/include/linux/ethtool.h > +++ b/include/linux/ethtool.h > @@ -72,11 +72,13 @@ enum { > * @rx_buf_len: Current length of buffers on the rx ring. > * @tcp_data_split: Scatter packet headers and data to separate buffers > * @cqe_size: Size of TX/RX completion queue event > + * @tx_push: The flag of tx push mode > */ > struct kernel_ethtool_ringparam { > u32 rx_buf_len; > u8 tcp_data_split; > u32 cqe_size; > + u32 tx_push; Can we make this a u8 and move it up above cqe_size? u8 should be enough. You can use ethnl_update_u8(). > }; > > /** > @@ -87,6 +89,7 @@ struct kernel_ethtool_ringparam { > enum ethtool_supported_ring_param { > ETHTOOL_RING_USE_RX_BUF_LEN = BIT(0), > ETHTOOL_RING_USE_CQE_SIZE = BIT(1), > + ETHTOOL_RING_USE_TX_PUSH = BIT(2), You need to actually use this constant to reject the setting for drivers which don't support the feature. > }; > > #define __ETH_RSS_HASH_BIT(bit) ((u32)1 << (bit)) > @@ -94,7 +95,8 @@ static int rings_fill_reply(struct sk_buff *skb, > (nla_put_u8(skb, ETHTOOL_A_RINGS_TCP_DATA_SPLIT, > kr->tcp_data_split))) || > (kr->cqe_size && > - (nla_put_u32(skb, ETHTOOL_A_RINGS_CQE_SIZE, kr->cqe_size)))) > + (nla_put_u32(skb, ETHTOOL_A_RINGS_CQE_SIZE, kr->cqe_size))) || > + nla_put_u8(skb, ETHTOOL_A_RINGS_TX_PUSH, !!kr->tx_push)) > > return -EMSGSIZE; > > return 0; > @@ -123,6 +125,7 @@ const struct nla_policy ethnl_rings_set_policy[] = { > [ETHTOOL_A_RINGS_TX] = { .type = NLA_U32 }, > [ETHTOOL_A_RINGS_RX_BUF_LEN] = NLA_POLICY_MIN(NLA_U32, 1), > [ETHTOOL_A_RINGS_CQE_SIZE] = NLA_POLICY_MIN(NLA_U32, 1), > + [ETHTOOL_A_RINGS_TX_PUSH] = { .type = NLA_U8 }, This can only be 0 and 1, right? Set a policy to to that effect please. > }; > > int ethnl_set_rings(struct sk_buff *skb, struct genl_info *info) > @@ -165,6 +168,8 @@ int ethnl_set_rings(struct sk_buff *skb, struct genl_info *info) > tb[ETHTOOL_A_RINGS_RX_BUF_LEN], &mod); > ethnl_update_u32(&kernel_ringparam.cqe_size, > tb[ETHTOOL_A_RINGS_CQE_SIZE], &mod); > + ethnl_update_bool32(&kernel_ringparam.tx_push, > + tb[ETHTOOL_A_RINGS_TX_PUSH], &mod); > ret = 0; > if (!mod) > goto out_ops; ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [RFCv2 PATCH net-next 1/2] net-next: ethtool: extend ringparam set/get APIs for tx_push 2022-03-26 19:50 ` Jakub Kicinski @ 2022-03-28 3:05 ` wangjie (L) 2022-03-28 17:35 ` Jakub Kicinski 0 siblings, 1 reply; 6+ messages in thread From: wangjie (L) @ 2022-03-28 3:05 UTC (permalink / raw) To: Jakub Kicinski Cc: mkubecek, davem, netdev, huangguangbin2, lipeng321, shenjian15, moyufeng, linyunsheng, salil.mehta, chenhao288 On 2022/3/27 3:50, Jakub Kicinski wrote: > On Sat, 26 Mar 2022 16:51:01 +0800 Jie Wang wrote: >> Currently tx push is a standard driver feature which controls use of a fast >> path descriptor push. So this patch extends the ringparam APIs and data >> structures to support set/get tx push by ethtool -G/g. >> >> Signed-off-by: Jie Wang <wangjie125@huawei.com> >> --- >> include/linux/ethtool.h | 3 +++ >> include/uapi/linux/ethtool_netlink.h | 1 + >> net/ethtool/netlink.h | 2 +- >> net/ethtool/rings.c | 9 +++++++-- > > You need to add documentation in: > Documentation/networking/ethtool-netlink.rst > OK, i will add it in next version RFC version. >> diff --git a/include/linux/ethtool.h b/include/linux/ethtool.h >> index 4af58459a1e7..096771ee8586 100644 >> --- a/include/linux/ethtool.h >> +++ b/include/linux/ethtool.h >> @@ -72,11 +72,13 @@ enum { >> * @rx_buf_len: Current length of buffers on the rx ring. >> * @tcp_data_split: Scatter packet headers and data to separate buffers >> * @cqe_size: Size of TX/RX completion queue event >> + * @tx_push: The flag of tx push mode >> */ >> struct kernel_ethtool_ringparam { >> u32 rx_buf_len; >> u8 tcp_data_split; >> u32 cqe_size; >> + u32 tx_push; > > Can we make this a u8 and move it up above cqe_size? > u8 should be enough. You can use ethnl_update_u8(). > yes, u8 is enough, next RFC version i will change it. >> }; >> >> /** >> @@ -87,6 +89,7 @@ struct kernel_ethtool_ringparam { >> enum ethtool_supported_ring_param { >> ETHTOOL_RING_USE_RX_BUF_LEN = BIT(0), >> ETHTOOL_RING_USE_CQE_SIZE = BIT(1), >> + ETHTOOL_RING_USE_TX_PUSH = BIT(2), > > You need to actually use this constant to reject the setting for > drivers which don't support the feature. > I will use this constant next version. >> }; >> >> #define __ETH_RSS_HASH_BIT(bit) ((u32)1 << (bit)) > >> @@ -94,7 +95,8 @@ static int rings_fill_reply(struct sk_buff *skb, >> (nla_put_u8(skb, ETHTOOL_A_RINGS_TCP_DATA_SPLIT, >> kr->tcp_data_split))) || >> (kr->cqe_size && >> - (nla_put_u32(skb, ETHTOOL_A_RINGS_CQE_SIZE, kr->cqe_size)))) >> + (nla_put_u32(skb, ETHTOOL_A_RINGS_CQE_SIZE, kr->cqe_size))) || >> + nla_put_u8(skb, ETHTOOL_A_RINGS_TX_PUSH, !!kr->tx_push)) >> >> return -EMSGSIZE; >> >> return 0; >> @@ -123,6 +125,7 @@ const struct nla_policy ethnl_rings_set_policy[] = { >> [ETHTOOL_A_RINGS_TX] = { .type = NLA_U32 }, >> [ETHTOOL_A_RINGS_RX_BUF_LEN] = NLA_POLICY_MIN(NLA_U32, 1), >> [ETHTOOL_A_RINGS_CQE_SIZE] = NLA_POLICY_MIN(NLA_U32, 1), >> + [ETHTOOL_A_RINGS_TX_PUSH] = { .type = NLA_U8 }, > > This can only be 0 and 1, right? Set a policy to to that effect please. > I will use NLA_POLICY_MAX(NLA_U8, 1), is this ok? >> }; >> >> int ethnl_set_rings(struct sk_buff *skb, struct genl_info *info) >> @@ -165,6 +168,8 @@ int ethnl_set_rings(struct sk_buff *skb, struct genl_info *info) >> tb[ETHTOOL_A_RINGS_RX_BUF_LEN], &mod); >> ethnl_update_u32(&kernel_ringparam.cqe_size, >> tb[ETHTOOL_A_RINGS_CQE_SIZE], &mod); >> + ethnl_update_bool32(&kernel_ringparam.tx_push, >> + tb[ETHTOOL_A_RINGS_TX_PUSH], &mod); >> ret = 0; >> if (!mod) >> goto out_ops; > > > . > ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [RFCv2 PATCH net-next 1/2] net-next: ethtool: extend ringparam set/get APIs for tx_push 2022-03-28 3:05 ` wangjie (L) @ 2022-03-28 17:35 ` Jakub Kicinski 0 siblings, 0 replies; 6+ messages in thread From: Jakub Kicinski @ 2022-03-28 17:35 UTC (permalink / raw) To: wangjie (L) Cc: mkubecek, davem, netdev, huangguangbin2, lipeng321, shenjian15, moyufeng, linyunsheng, salil.mehta, chenhao288 On Mon, 28 Mar 2022 11:05:26 +0800 wangjie (L) wrote: > > This can only be 0 and 1, right? Set a policy to to that effect please. > > > I will use NLA_POLICY_MAX(NLA_U8, 1), is this ok? Yes, that looks right! ^ permalink raw reply [flat|nested] 6+ messages in thread
* [RFCv2 PATCH net-next 2/2] net-next: hn3: add tx push support in hns3 ring param process 2022-03-26 8:51 [RFCv2 PATCH net-next 0/2] net-next: ethool: add support to get/set tx push by ethtool -G/g Jie Wang 2022-03-26 8:51 ` [RFCv2 PATCH net-next 1/2] net-next: ethtool: extend ringparam set/get APIs for tx_push Jie Wang @ 2022-03-26 8:51 ` Jie Wang 1 sibling, 0 replies; 6+ messages in thread From: Jie Wang @ 2022-03-26 8:51 UTC (permalink / raw) To: mkubecek, davem, kuba, wangjie125 Cc: netdev, huangguangbin2, lipeng321, shenjian15, moyufeng, linyunsheng, salil.mehta, chenhao288 This patch adds tx push param to hns3 ring param and adapts the set and get API of ring params. So users can set it by cmd ethtool -G and get it by cmd ethtool -g. Signed-off-by: Jie Wang <wangjie125@huawei.com> --- .../ethernet/hisilicon/hns3/hns3_ethtool.c | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c index 6469238ae090..845a56b93075 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c +++ b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c @@ -664,6 +664,8 @@ static void hns3_get_ringparam(struct net_device *netdev, param->tx_pending = priv->ring[0].desc_num; param->rx_pending = priv->ring[rx_queue_index].desc_num; kernel_param->rx_buf_len = priv->ring[rx_queue_index].buf_size; + kernel_param->tx_push = test_bit(HNS3_NIC_STATE_TX_PUSH_ENABLE, + &priv->state); } static void hns3_get_pauseparam(struct net_device *netdev, @@ -1114,6 +1116,30 @@ static int hns3_change_rx_buf_len(struct net_device *ndev, u32 rx_buf_len) return 0; } +static int hns3_set_tx_push(struct net_device *netdev, u32 tx_push) +{ + struct hns3_nic_priv *priv = netdev_priv(netdev); + struct hnae3_handle *h = hns3_get_handle(netdev); + struct hnae3_ae_dev *ae_dev = pci_get_drvdata(h->pdev); + u32 old_state = test_bit(HNS3_NIC_STATE_TX_PUSH_ENABLE, &priv->state); + + if (!test_bit(HNAE3_DEV_SUPPORT_TX_PUSH_B, ae_dev->caps) && tx_push) + return -EOPNOTSUPP; + + if (tx_push == old_state) + return 0; + + netdev_info(netdev, "Changing tx push from %s to %s\n", + old_state ? "on" : "off", tx_push ? "on" : "off"); + + if (tx_push) + set_bit(HNS3_NIC_STATE_TX_PUSH_ENABLE, &priv->state); + else + clear_bit(HNS3_NIC_STATE_TX_PUSH_ENABLE, &priv->state); + + return 0; +} + static int hns3_set_ringparam(struct net_device *ndev, struct ethtool_ringparam *param, struct kernel_ethtool_ringparam *kernel_param, @@ -1133,6 +1159,10 @@ static int hns3_set_ringparam(struct net_device *ndev, if (ret) return ret; + ret = hns3_set_tx_push(ndev, kernel_param->tx_push); + if (ret) + return ret; + /* Hardware requires that its descriptors must be multiple of eight */ new_tx_desc_num = ALIGN(param->tx_pending, HNS3_RING_BD_MULTIPLE); new_rx_desc_num = ALIGN(param->rx_pending, HNS3_RING_BD_MULTIPLE); -- 2.33.0 ^ permalink raw reply related [flat|nested] 6+ messages in thread
end of thread, other threads:[~2022-03-28 17:35 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2022-03-26 8:51 [RFCv2 PATCH net-next 0/2] net-next: ethool: add support to get/set tx push by ethtool -G/g Jie Wang 2022-03-26 8:51 ` [RFCv2 PATCH net-next 1/2] net-next: ethtool: extend ringparam set/get APIs for tx_push Jie Wang 2022-03-26 19:50 ` Jakub Kicinski 2022-03-28 3:05 ` wangjie (L) 2022-03-28 17:35 ` Jakub Kicinski 2022-03-26 8:51 ` [RFCv2 PATCH net-next 2/2] net-next: hn3: add tx push support in hns3 ring param process Jie Wang
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.