* [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
* [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
* 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
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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).