* [PATCH net 0/2] fix wrong hds-thresh value setting
@ 2025-04-03 6:04 Taehee Yoo
2025-04-03 6:04 ` [PATCH net 1/2] net: ethtool: fix ethtool_ringparam_get_cfg() returns a hds_thresh value always as 0 Taehee Yoo
2025-04-03 6:04 ` [PATCH net 2/2] selftests: drv-net: test random value for hds-thresh Taehee Yoo
0 siblings, 2 replies; 4+ messages in thread
From: Taehee Yoo @ 2025-04-03 6:04 UTC (permalink / raw)
To: davem, kuba, pabeni, edumazet, andrew+netdev, horms, shuah,
netdev, linux-kselftest
Cc: kory.maincent, willemb, aleksander.lobakin, ecree.xilinx,
almasrymina, daniel.zahka, jianbol, gal, michael.chan, ap420073
A hds-thresh value is not set correctly if input value is 0.
The cause is that ethtool_ringparam_get_cfg(), which is a internal
function that returns ringparameters from both ->get_ringparam() and
dev->cfg can't return a correct hds-thresh value.
The first patch fixes ethtool_ringparam_get_cfg() to set hds-thresh
value correcltly.
The second patch adds random test for hds-thresh value.
So that we can test 0 value for a hds-thresh properly.
Taehee Yoo (2):
net: ethtool: fix ethtool_ringparam_get_cfg() returns a hds_thresh
value always as 0.
selftests: drv-net: test random value for hds-thresh
net/ethtool/common.c | 1 +
tools/testing/selftests/drivers/net/hds.py | 28 +++++++++++++++++++++-
2 files changed, 28 insertions(+), 1 deletion(-)
--
2.34.1
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH net 1/2] net: ethtool: fix ethtool_ringparam_get_cfg() returns a hds_thresh value always as 0.
2025-04-03 6:04 [PATCH net 0/2] fix wrong hds-thresh value setting Taehee Yoo
@ 2025-04-03 6:04 ` Taehee Yoo
2025-04-03 6:04 ` [PATCH net 2/2] selftests: drv-net: test random value for hds-thresh Taehee Yoo
1 sibling, 0 replies; 4+ messages in thread
From: Taehee Yoo @ 2025-04-03 6:04 UTC (permalink / raw)
To: davem, kuba, pabeni, edumazet, andrew+netdev, horms, shuah,
netdev, linux-kselftest
Cc: kory.maincent, willemb, aleksander.lobakin, ecree.xilinx,
almasrymina, daniel.zahka, jianbol, gal, michael.chan, ap420073
When hds-thresh is configured, ethnl_set_rings() is called, and it calls
ethtool_ringparam_get_cfg() to get ringparameters from .get_ringparam()
callback and dev->cfg.
Both hds_config and hds_thresh values should be set from dev->cfg, not
from .get_ringparam().
But ethtool_ringparam_get_cfg() sets only hds_config from dev->cfg.
So, ethtool_ringparam_get_cfg() returns always a hds_thresh as 0.
If an input value of hds-thresh is 0, a hds_thresh value from
ethtool_ringparam_get_cfg() are same. So ethnl_set_rings() does
nothing and returns immediately.
It causes a bug that setting a hds-thresh value to 0 is not working.
Reproducer:
modprobe netdevsim
echo 1 > /sys/bus/netdevsim/new_device
ethtool -G eth0 hds-thresh 100
ethtool -G eth0 hds-thresh 0
ethtool -g eth0
#hds-thresh value should be 0, but it shows 100.
The tools/testing/selftests/drivers/net/hds.py can test it too with
applying a following patch for hds.py.
Fixes: 928459bbda19 ("net: ethtool: populate the default HDS params in the core")
Signed-off-by: Taehee Yoo <ap420073@gmail.com>
---
The ethtool command doesn't support hds-thresh option yet.
So, RFC[1] patch is needed to be applied.
net/ethtool/common.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/net/ethtool/common.c b/net/ethtool/common.c
index 0cb6da1f692a..49bea6b45bd5 100644
--- a/net/ethtool/common.c
+++ b/net/ethtool/common.c
@@ -830,6 +830,7 @@ void ethtool_ringparam_get_cfg(struct net_device *dev,
/* Driver gives us current state, we want to return current config */
kparam->tcp_data_split = dev->cfg->hds_config;
+ kparam->hds_thresh = dev->cfg->hds_thresh;
}
static void ethtool_init_tsinfo(struct kernel_ethtool_ts_info *info)
--
2.34.1
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH net 2/2] selftests: drv-net: test random value for hds-thresh
2025-04-03 6:04 [PATCH net 0/2] fix wrong hds-thresh value setting Taehee Yoo
2025-04-03 6:04 ` [PATCH net 1/2] net: ethtool: fix ethtool_ringparam_get_cfg() returns a hds_thresh value always as 0 Taehee Yoo
@ 2025-04-03 6:04 ` Taehee Yoo
2025-04-04 5:26 ` Taehee Yoo
1 sibling, 1 reply; 4+ messages in thread
From: Taehee Yoo @ 2025-04-03 6:04 UTC (permalink / raw)
To: davem, kuba, pabeni, edumazet, andrew+netdev, horms, shuah,
netdev, linux-kselftest
Cc: kory.maincent, willemb, aleksander.lobakin, ecree.xilinx,
almasrymina, daniel.zahka, jianbol, gal, michael.chan, ap420073
hds.py has been testing 0(set_hds_thresh_zero()),
MAX(set_hds_thresh_max()), GT(set_hds_thresh_gt()) values for hds-thresh.
However if a hds-thresh value was already 0, set_hds_thresh_zero()
can't test properly.
So, it tests random value first and then tests 0, MAX, GT values.
Testing bnxt:
TAP version 13
1..13
ok 1 hds.get_hds
ok 2 hds.get_hds_thresh
ok 3 hds.set_hds_disable # SKIP disabling of HDS not supported by
the device
ok 4 hds.set_hds_enable
ok 5 hds.set_hds_thresh_random
ok 6 hds.set_hds_thresh_zero
ok 7 hds.set_hds_thresh_max
ok 8 hds.set_hds_thresh_gt
ok 9 hds.set_xdp
ok 10 hds.enabled_set_xdp
ok 11 hds.ioctl
ok 12 hds.ioctl_set_xdp
ok 13 hds.ioctl_enabled_set_xdp
# Totals: pass:12 fail:0 xfail:0 xpass:0 skip:1 error:0
Testing lo:
TAP version 13
1..13
ok 1 hds.get_hds # SKIP tcp-data-split not supported by device
ok 2 hds.get_hds_thresh # SKIP hds-thresh not supported by device
ok 3 hds.set_hds_disable # SKIP ring-set not supported by the device
ok 4 hds.set_hds_enable # SKIP ring-set not supported by the device
ok 5 hds.set_hds_thresh_random # SKIP hds-thresh not supported by
device
ok 6 hds.set_hds_thresh_zero # SKIP ring-set not supported by the
device
ok 7 hds.set_hds_thresh_max # SKIP hds-thresh not supported by
device
ok 8 hds.set_hds_thresh_gt # SKIP hds-thresh not supported by device
ok 9 hds.set_xdp # SKIP tcp-data-split not supported by device
ok 10 hds.enabled_set_xdp # SKIP tcp-data-split not supported by
device
ok 11 hds.ioctl # SKIP tcp-data-split not supported by device
ok 12 hds.ioctl_set_xdp # SKIP tcp-data-split not supported by
device
ok 13 hds.ioctl_enabled_set_xdp # SKIP tcp-data-split not supported
by device
# Totals: pass:0 fail:0 xfail:0 xpass:0 skip:13 error:0
Signed-off-by: Taehee Yoo <ap420073@gmail.com>
---
tools/testing/selftests/drivers/net/hds.py | 28 +++++++++++++++++++++-
1 file changed, 27 insertions(+), 1 deletion(-)
diff --git a/tools/testing/selftests/drivers/net/hds.py b/tools/testing/selftests/drivers/net/hds.py
index 8b7f6acad15f..3ba8e4d69c4c 100755
--- a/tools/testing/selftests/drivers/net/hds.py
+++ b/tools/testing/selftests/drivers/net/hds.py
@@ -6,7 +6,7 @@ import os
from lib.py import ksft_run, ksft_exit, ksft_eq, ksft_raises, KsftSkipEx
from lib.py import CmdExitFailure, EthtoolFamily, NlError
from lib.py import NetDrvEnv
-from lib.py import defer, ethtool, ip
+from lib.py import defer, ethtool, ip, random
def _get_hds_mode(cfg, netnl) -> str:
@@ -109,6 +109,31 @@ def set_hds_thresh_zero(cfg, netnl) -> None:
ksft_eq(0, rings['hds-thresh'])
+def set_hds_thresh_random(cfg, netnl) -> None:
+ try:
+ rings = netnl.rings_get({'header': {'dev-index': cfg.ifindex}})
+ except NlError as e:
+ raise KsftSkipEx('ring-get not supported by device')
+ if 'hds-thresh' not in rings:
+ raise KsftSkipEx('hds-thresh not supported by device')
+ if 'hds-thresh-max' not in rings:
+ raise KsftSkipEx('hds-thresh-max not defined by device')
+
+ while True:
+ hds_thresh = random.randint(1, rings['hds-thresh-max'])
+ if hds_thresh != rings['hds-thresh']:
+ break
+
+ try:
+ netnl.rings_set({'header': {'dev-index': cfg.ifindex}, 'hds-thresh': hds_thresh})
+ except NlError as e:
+ if e.error == errno.EINVAL:
+ raise KsftSkipEx("hds-thresh-set not supported by the device")
+ elif e.error == errno.EOPNOTSUPP:
+ raise KsftSkipEx("ring-set not supported by the device")
+ rings = netnl.rings_get({'header': {'dev-index': cfg.ifindex}})
+ ksft_eq(hds_thresh, rings['hds-thresh'])
+
def set_hds_thresh_max(cfg, netnl) -> None:
try:
rings = netnl.rings_get({'header': {'dev-index': cfg.ifindex}})
@@ -243,6 +268,7 @@ def main() -> None:
get_hds_thresh,
set_hds_disable,
set_hds_enable,
+ set_hds_thresh_random,
set_hds_thresh_zero,
set_hds_thresh_max,
set_hds_thresh_gt,
--
2.34.1
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH net 2/2] selftests: drv-net: test random value for hds-thresh
2025-04-03 6:04 ` [PATCH net 2/2] selftests: drv-net: test random value for hds-thresh Taehee Yoo
@ 2025-04-04 5:26 ` Taehee Yoo
0 siblings, 0 replies; 4+ messages in thread
From: Taehee Yoo @ 2025-04-04 5:26 UTC (permalink / raw)
To: davem, kuba, pabeni, edumazet, andrew+netdev, horms, shuah,
netdev, linux-kselftest
Cc: kory.maincent, willemb, aleksander.lobakin, ecree.xilinx,
almasrymina, daniel.zahka, jianbol, gal, michael.chan
On Thu, Apr 3, 2025 at 3:04 PM Taehee Yoo <ap420073@gmail.com> wrote:
>
> hds.py has been testing 0(set_hds_thresh_zero()),
> MAX(set_hds_thresh_max()), GT(set_hds_thresh_gt()) values for hds-thresh.
> However if a hds-thresh value was already 0, set_hds_thresh_zero()
> can't test properly.
> So, it tests random value first and then tests 0, MAX, GT values.
>
> Testing bnxt:
> TAP version 13
> 1..13
> ok 1 hds.get_hds
> ok 2 hds.get_hds_thresh
> ok 3 hds.set_hds_disable # SKIP disabling of HDS not supported by
> the device
> ok 4 hds.set_hds_enable
> ok 5 hds.set_hds_thresh_random
> ok 6 hds.set_hds_thresh_zero
> ok 7 hds.set_hds_thresh_max
> ok 8 hds.set_hds_thresh_gt
> ok 9 hds.set_xdp
> ok 10 hds.enabled_set_xdp
> ok 11 hds.ioctl
> ok 12 hds.ioctl_set_xdp
> ok 13 hds.ioctl_enabled_set_xdp
> # Totals: pass:12 fail:0 xfail:0 xpass:0 skip:1 error:0
>
> Testing lo:
> TAP version 13
> 1..13
> ok 1 hds.get_hds # SKIP tcp-data-split not supported by device
> ok 2 hds.get_hds_thresh # SKIP hds-thresh not supported by device
> ok 3 hds.set_hds_disable # SKIP ring-set not supported by the device
> ok 4 hds.set_hds_enable # SKIP ring-set not supported by the device
> ok 5 hds.set_hds_thresh_random # SKIP hds-thresh not supported by
> device
> ok 6 hds.set_hds_thresh_zero # SKIP ring-set not supported by the
> device
> ok 7 hds.set_hds_thresh_max # SKIP hds-thresh not supported by
> device
> ok 8 hds.set_hds_thresh_gt # SKIP hds-thresh not supported by device
> ok 9 hds.set_xdp # SKIP tcp-data-split not supported by device
> ok 10 hds.enabled_set_xdp # SKIP tcp-data-split not supported by
> device
> ok 11 hds.ioctl # SKIP tcp-data-split not supported by device
> ok 12 hds.ioctl_set_xdp # SKIP tcp-data-split not supported by
> device
> ok 13 hds.ioctl_enabled_set_xdp # SKIP tcp-data-split not supported
> by device
> # Totals: pass:0 fail:0 xfail:0 xpass:0 skip:13 error:0
>
> Signed-off-by: Taehee Yoo <ap420073@gmail.com>
> ---
> tools/testing/selftests/drivers/net/hds.py | 28 +++++++++++++++++++++-
> 1 file changed, 27 insertions(+), 1 deletion(-)
>
> diff --git a/tools/testing/selftests/drivers/net/hds.py b/tools/testing/selftests/drivers/net/hds.py
> index 8b7f6acad15f..3ba8e4d69c4c 100755
> --- a/tools/testing/selftests/drivers/net/hds.py
> +++ b/tools/testing/selftests/drivers/net/hds.py
> @@ -6,7 +6,7 @@ import os
> from lib.py import ksft_run, ksft_exit, ksft_eq, ksft_raises, KsftSkipEx
> from lib.py import CmdExitFailure, EthtoolFamily, NlError
> from lib.py import NetDrvEnv
> -from lib.py import defer, ethtool, ip
> +from lib.py import defer, ethtool, ip, random
>
>
> def _get_hds_mode(cfg, netnl) -> str:
> @@ -109,6 +109,31 @@ def set_hds_thresh_zero(cfg, netnl) -> None:
>
> ksft_eq(0, rings['hds-thresh'])
>
> +def set_hds_thresh_random(cfg, netnl) -> None:
> + try:
> + rings = netnl.rings_get({'header': {'dev-index': cfg.ifindex}})
> + except NlError as e:
> + raise KsftSkipEx('ring-get not supported by device')
> + if 'hds-thresh' not in rings:
> + raise KsftSkipEx('hds-thresh not supported by device')
> + if 'hds-thresh-max' not in rings:
> + raise KsftSkipEx('hds-thresh-max not defined by device')
> +
> + while True:
> + hds_thresh = random.randint(1, rings['hds-thresh-max'])
If a hds-thresh-max value is too small, it will not work.
As far as I know, the gve's hds-thresh-max would be 0.
I will send a v2 patch to fix this.
Thanks!
Taehee Yoo
> + if hds_thresh != rings['hds-thresh']:
> + break
> +
> + try:
> + netnl.rings_set({'header': {'dev-index': cfg.ifindex}, 'hds-thresh': hds_thresh})
> + except NlError as e:
> + if e.error == errno.EINVAL:
> + raise KsftSkipEx("hds-thresh-set not supported by the device")
> + elif e.error == errno.EOPNOTSUPP:
> + raise KsftSkipEx("ring-set not supported by the device")
> + rings = netnl.rings_get({'header': {'dev-index': cfg.ifindex}})
> + ksft_eq(hds_thresh, rings['hds-thresh'])
> +
> def set_hds_thresh_max(cfg, netnl) -> None:
> try:
> rings = netnl.rings_get({'header': {'dev-index': cfg.ifindex}})
> @@ -243,6 +268,7 @@ def main() -> None:
> get_hds_thresh,
> set_hds_disable,
> set_hds_enable,
> + set_hds_thresh_random,
> set_hds_thresh_zero,
> set_hds_thresh_max,
> set_hds_thresh_gt,
> --
> 2.34.1
>
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2025-04-04 5:26 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-04-03 6:04 [PATCH net 0/2] fix wrong hds-thresh value setting Taehee Yoo
2025-04-03 6:04 ` [PATCH net 1/2] net: ethtool: fix ethtool_ringparam_get_cfg() returns a hds_thresh value always as 0 Taehee Yoo
2025-04-03 6:04 ` [PATCH net 2/2] selftests: drv-net: test random value for hds-thresh Taehee Yoo
2025-04-04 5:26 ` Taehee Yoo
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).