Message ID | 20211014113943.16231-2-huangguangbin2@huawei.com (mailing list archive) |
---|---|
State | Changes Requested |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | ethtool: add support to set/get tx copybreak buf size and rx buf len | expand |
On 10/14/21 4:39 AM, Guangbin Huang wrote: > From: Hao Chen <chenhao288@hisilicon.com> > > Add support for ethtool to set/get tx copybreak buf size. What is the unit ? Frankly, having to size the 'buffer' based on number of slots in TX ring buffer is not good. What happens later when/if ethtool -G tx xxxxx' is trying to change number of slots ? The 'tx copybreak' should instead give a number of bytes per TX ring slot. Eg, 128 or 256 bytes. This is very similar to what drivers using net/core/tso.c do. They usually use TSO_HEADER_SIZE for this. > > Signed-off-by: Hao Chen <chenhao288@hisilicon.com> > Signed-off-by: Guangbin Huang <huangguangbin2@huawei.com> > --- > include/uapi/linux/ethtool.h | 1 + > net/ethtool/common.c | 1 + > net/ethtool/ioctl.c | 1 + > 3 files changed, 3 insertions(+) > > diff --git a/include/uapi/linux/ethtool.h b/include/uapi/linux/ethtool.h > index a2223b685451..7bc4b8def12c 100644 > --- a/include/uapi/linux/ethtool.h > +++ b/include/uapi/linux/ethtool.h > @@ -231,6 +231,7 @@ enum tunable_id { > ETHTOOL_RX_COPYBREAK, > ETHTOOL_TX_COPYBREAK, > ETHTOOL_PFC_PREVENTION_TOUT, /* timeout in msecs */ > + ETHTOOL_TX_COPYBREAK_BUF_SIZE, > /* > * Add your fresh new tunable attribute above and remember to update > * tunable_strings[] in net/ethtool/common.c > diff --git a/net/ethtool/common.c b/net/ethtool/common.c > index c63e0739dc6a..0c5210015911 100644 > --- a/net/ethtool/common.c > +++ b/net/ethtool/common.c > @@ -89,6 +89,7 @@ tunable_strings[__ETHTOOL_TUNABLE_COUNT][ETH_GSTRING_LEN] = { > [ETHTOOL_RX_COPYBREAK] = "rx-copybreak", > [ETHTOOL_TX_COPYBREAK] = "tx-copybreak", > [ETHTOOL_PFC_PREVENTION_TOUT] = "pfc-prevention-tout", > + [ETHTOOL_TX_COPYBREAK_BUF_SIZE] = "tx-copybreak-buf-size", > }; > > const char > diff --git a/net/ethtool/ioctl.c b/net/ethtool/ioctl.c > index bf6e8c2f9bf7..617ebc4183d9 100644 > --- a/net/ethtool/ioctl.c > +++ b/net/ethtool/ioctl.c > @@ -2383,6 +2383,7 @@ static int ethtool_tunable_valid(const struct ethtool_tunable *tuna) > switch (tuna->id) { > case ETHTOOL_RX_COPYBREAK: > case ETHTOOL_TX_COPYBREAK: > + case ETHTOOL_TX_COPYBREAK_BUF_SIZE: > if (tuna->len != sizeof(u32) || > tuna->type_id != ETHTOOL_TUNABLE_U32) > return -EINVAL; >
On 2021/10/14 21:58, Eric Dumazet wrote: > > > On 10/14/21 4:39 AM, Guangbin Huang wrote: >> From: Hao Chen <chenhao288@hisilicon.com> >> >> Add support for ethtool to set/get tx copybreak buf size. > > What is the unit ? > > Frankly, having to size the 'buffer' based on number of slots in TX ring buffer > is not good. > > What happens later when/if ethtool -G tx xxxxx' is trying > to change number of slots ? > > The 'tx copybreak' should instead give a number of bytes per TX ring slot. > > Eg, 128 or 256 bytes. > > This is very similar to what drivers using net/core/tso.c do. > > They usually use TSO_HEADER_SIZE for this. > Hi Eric, The unit is bytes. Tx copybreak buf is a queue based tx shared bounce buffer and it is allocated based on page size, not based on slot numbers. When the len of xmitted skb is below tx_copybreak, tx copybreak buf will share buffer of specific size(slot size) for tx to memcpy the small packet. So, what you mentioned seems not related to this patch. >> >> Signed-off-by: Hao Chen <chenhao288@hisilicon.com> >> Signed-off-by: Guangbin Huang <huangguangbin2@huawei.com> >> --- >> include/uapi/linux/ethtool.h | 1 + >> net/ethtool/common.c | 1 + >> net/ethtool/ioctl.c | 1 + >> 3 files changed, 3 insertions(+) >> >> diff --git a/include/uapi/linux/ethtool.h b/include/uapi/linux/ethtool.h >> index a2223b685451..7bc4b8def12c 100644 >> --- a/include/uapi/linux/ethtool.h >> +++ b/include/uapi/linux/ethtool.h >> @@ -231,6 +231,7 @@ enum tunable_id { >> ETHTOOL_RX_COPYBREAK, >> ETHTOOL_TX_COPYBREAK, >> ETHTOOL_PFC_PREVENTION_TOUT, /* timeout in msecs */ >> + ETHTOOL_TX_COPYBREAK_BUF_SIZE, >> /* >> * Add your fresh new tunable attribute above and remember to update >> * tunable_strings[] in net/ethtool/common.c >> diff --git a/net/ethtool/common.c b/net/ethtool/common.c >> index c63e0739dc6a..0c5210015911 100644 >> --- a/net/ethtool/common.c >> +++ b/net/ethtool/common.c >> @@ -89,6 +89,7 @@ tunable_strings[__ETHTOOL_TUNABLE_COUNT][ETH_GSTRING_LEN] = { >> [ETHTOOL_RX_COPYBREAK] = "rx-copybreak", >> [ETHTOOL_TX_COPYBREAK] = "tx-copybreak", >> [ETHTOOL_PFC_PREVENTION_TOUT] = "pfc-prevention-tout", >> + [ETHTOOL_TX_COPYBREAK_BUF_SIZE] = "tx-copybreak-buf-size", >> }; >> >> const char >> diff --git a/net/ethtool/ioctl.c b/net/ethtool/ioctl.c >> index bf6e8c2f9bf7..617ebc4183d9 100644 >> --- a/net/ethtool/ioctl.c >> +++ b/net/ethtool/ioctl.c >> @@ -2383,6 +2383,7 @@ static int ethtool_tunable_valid(const struct ethtool_tunable *tuna) >> switch (tuna->id) { >> case ETHTOOL_RX_COPYBREAK: >> case ETHTOOL_TX_COPYBREAK: >> + case ETHTOOL_TX_COPYBREAK_BUF_SIZE: >> if (tuna->len != sizeof(u32) || >> tuna->type_id != ETHTOOL_TUNABLE_U32) >> return -EINVAL; >> > . >
diff --git a/include/uapi/linux/ethtool.h b/include/uapi/linux/ethtool.h index a2223b685451..7bc4b8def12c 100644 --- a/include/uapi/linux/ethtool.h +++ b/include/uapi/linux/ethtool.h @@ -231,6 +231,7 @@ enum tunable_id { ETHTOOL_RX_COPYBREAK, ETHTOOL_TX_COPYBREAK, ETHTOOL_PFC_PREVENTION_TOUT, /* timeout in msecs */ + ETHTOOL_TX_COPYBREAK_BUF_SIZE, /* * Add your fresh new tunable attribute above and remember to update * tunable_strings[] in net/ethtool/common.c diff --git a/net/ethtool/common.c b/net/ethtool/common.c index c63e0739dc6a..0c5210015911 100644 --- a/net/ethtool/common.c +++ b/net/ethtool/common.c @@ -89,6 +89,7 @@ tunable_strings[__ETHTOOL_TUNABLE_COUNT][ETH_GSTRING_LEN] = { [ETHTOOL_RX_COPYBREAK] = "rx-copybreak", [ETHTOOL_TX_COPYBREAK] = "tx-copybreak", [ETHTOOL_PFC_PREVENTION_TOUT] = "pfc-prevention-tout", + [ETHTOOL_TX_COPYBREAK_BUF_SIZE] = "tx-copybreak-buf-size", }; const char diff --git a/net/ethtool/ioctl.c b/net/ethtool/ioctl.c index bf6e8c2f9bf7..617ebc4183d9 100644 --- a/net/ethtool/ioctl.c +++ b/net/ethtool/ioctl.c @@ -2383,6 +2383,7 @@ static int ethtool_tunable_valid(const struct ethtool_tunable *tuna) switch (tuna->id) { case ETHTOOL_RX_COPYBREAK: case ETHTOOL_TX_COPYBREAK: + case ETHTOOL_TX_COPYBREAK_BUF_SIZE: if (tuna->len != sizeof(u32) || tuna->type_id != ETHTOOL_TUNABLE_U32) return -EINVAL;