Skip to content

Commit 9f8c662

Browse files
committed
tgupdate: merge t/DO-NOT-MERGE-mptcp-enabled-by-default into t/upstream base
2 parents 33dbb90 + 116549d commit 9f8c662

File tree

8 files changed

+188
-10
lines changed

8 files changed

+188
-10
lines changed

drivers/net/netdevsim/ethtool.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,9 +184,11 @@ static const struct ethtool_ops nsim_ethtool_ops = {
184184

185185
static void nsim_ethtool_ring_init(struct netdevsim *ns)
186186
{
187+
ns->ethtool.ring.rx_pending = 512;
187188
ns->ethtool.ring.rx_max_pending = 4096;
188189
ns->ethtool.ring.rx_jumbo_max_pending = 4096;
189190
ns->ethtool.ring.rx_mini_max_pending = 4096;
191+
ns->ethtool.ring.tx_pending = 512;
190192
ns->ethtool.ring.tx_max_pending = 4096;
191193
}
192194

net/ethtool/common.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include <linux/rtnetlink.h>
77
#include <linux/ptp_clock_kernel.h>
88
#include <linux/phy_link_topology.h>
9+
#include <net/netdev_queues.h>
910

1011
#include "netlink.h"
1112
#include "common.h"
@@ -813,6 +814,21 @@ int ethtool_check_ops(const struct ethtool_ops *ops)
813814
return 0;
814815
}
815816

817+
void ethtool_ringparam_get_cfg(struct net_device *dev,
818+
struct ethtool_ringparam *param,
819+
struct kernel_ethtool_ringparam *kparam,
820+
struct netlink_ext_ack *extack)
821+
{
822+
memset(param, 0, sizeof(*param));
823+
memset(kparam, 0, sizeof(*kparam));
824+
825+
param->cmd = ETHTOOL_GRINGPARAM;
826+
dev->ethtool_ops->get_ringparam(dev, param, kparam, extack);
827+
828+
/* Driver gives us current state, we want to return current config */
829+
kparam->tcp_data_split = dev->cfg->hds_config;
830+
}
831+
816832
static void ethtool_init_tsinfo(struct kernel_ethtool_ts_info *info)
817833
{
818834
memset(info, 0, sizeof(*info));

net/ethtool/common.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,12 @@ int ethtool_check_max_channel(struct net_device *dev,
5151
struct ethtool_channels channels,
5252
struct genl_info *info);
5353
int ethtool_check_rss_ctx_busy(struct net_device *dev, u32 rss_context);
54+
55+
void ethtool_ringparam_get_cfg(struct net_device *dev,
56+
struct ethtool_ringparam *param,
57+
struct kernel_ethtool_ringparam *kparam,
58+
struct netlink_ext_ack *extack);
59+
5460
int __ethtool_get_ts_info(struct net_device *dev, struct kernel_ethtool_ts_info *info);
5561
int ethtool_get_ts_info_by_phc(struct net_device *dev,
5662
struct kernel_ethtool_ts_info *info,

net/ethtool/ioctl.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2065,8 +2065,8 @@ static int ethtool_get_ringparam(struct net_device *dev, void __user *useraddr)
20652065

20662066
static int ethtool_set_ringparam(struct net_device *dev, void __user *useraddr)
20672067
{
2068-
struct ethtool_ringparam ringparam, max = { .cmd = ETHTOOL_GRINGPARAM };
20692068
struct kernel_ethtool_ringparam kernel_ringparam;
2069+
struct ethtool_ringparam ringparam, max;
20702070
int ret;
20712071

20722072
if (!dev->ethtool_ops->set_ringparam || !dev->ethtool_ops->get_ringparam)
@@ -2075,7 +2075,7 @@ static int ethtool_set_ringparam(struct net_device *dev, void __user *useraddr)
20752075
if (copy_from_user(&ringparam, useraddr, sizeof(ringparam)))
20762076
return -EFAULT;
20772077

2078-
dev->ethtool_ops->get_ringparam(dev, &max, &kernel_ringparam, NULL);
2078+
ethtool_ringparam_get_cfg(dev, &max, &kernel_ringparam, NULL);
20792079

20802080
/* ensure new ring parameters are within the maximums */
20812081
if (ringparam.rx_pending > max.rx_max_pending ||

net/ethtool/rings.c

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -215,17 +215,16 @@ ethnl_set_rings_validate(struct ethnl_req_info *req_info,
215215
static int
216216
ethnl_set_rings(struct ethnl_req_info *req_info, struct genl_info *info)
217217
{
218-
struct kernel_ethtool_ringparam kernel_ringparam = {};
219-
struct ethtool_ringparam ringparam = {};
218+
struct kernel_ethtool_ringparam kernel_ringparam;
220219
struct net_device *dev = req_info->dev;
220+
struct ethtool_ringparam ringparam;
221221
struct nlattr **tb = info->attrs;
222222
const struct nlattr *err_attr;
223223
bool mod = false;
224224
int ret;
225225

226-
dev->ethtool_ops->get_ringparam(dev, &ringparam,
227-
&kernel_ringparam, info->extack);
228-
kernel_ringparam.tcp_data_split = dev->cfg->hds_config;
226+
ethtool_ringparam_get_cfg(dev, &ringparam, &kernel_ringparam,
227+
info->extack);
229228

230229
ethnl_update_u32(&ringparam.rx_pending, tb[ETHTOOL_A_RINGS_RX], &mod);
231230
ethnl_update_u32(&ringparam.rx_mini_pending,

tools/testing/selftests/drivers/net/hds.py

Lines changed: 142 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,54 @@
22
# SPDX-License-Identifier: GPL-2.0
33

44
import errno
5+
import os
56
from lib.py import ksft_run, ksft_exit, ksft_eq, ksft_raises, KsftSkipEx
6-
from lib.py import EthtoolFamily, NlError
7+
from lib.py import CmdExitFailure, EthtoolFamily, NlError
78
from lib.py import NetDrvEnv
9+
from lib.py import defer, ethtool, ip
810

9-
def get_hds(cfg, netnl) -> None:
11+
12+
def _get_hds_mode(cfg, netnl) -> str:
1013
try:
1114
rings = netnl.rings_get({'header': {'dev-index': cfg.ifindex}})
1215
except NlError as e:
1316
raise KsftSkipEx('ring-get not supported by device')
1417
if 'tcp-data-split' not in rings:
1518
raise KsftSkipEx('tcp-data-split not supported by device')
19+
return rings['tcp-data-split']
20+
21+
22+
def _xdp_onoff(cfg):
23+
test_dir = os.path.dirname(os.path.realpath(__file__))
24+
prog = test_dir + "/../../net/lib/xdp_dummy.bpf.o"
25+
ip("link set dev %s xdp obj %s sec xdp" %
26+
(cfg.ifname, prog))
27+
ip("link set dev %s xdp off" % cfg.ifname)
28+
29+
30+
def _ioctl_ringparam_modify(cfg, netnl) -> None:
31+
"""
32+
Helper for performing a hopefully unimportant IOCTL SET.
33+
IOCTL does not support HDS, so it should not affect the HDS config.
34+
"""
35+
try:
36+
rings = netnl.rings_get({'header': {'dev-index': cfg.ifindex}})
37+
except NlError as e:
38+
raise KsftSkipEx('ring-get not supported by device')
39+
40+
if 'tx' not in rings:
41+
raise KsftSkipEx('setting Tx ring size not supported')
42+
43+
try:
44+
ethtool(f"--disable-netlink -G {cfg.ifname} tx {rings['tx'] // 2}")
45+
except CmdExitFailure as e:
46+
ethtool(f"--disable-netlink -G {cfg.ifname} tx {rings['tx'] * 2}")
47+
defer(ethtool, f"-G {cfg.ifname} tx {rings['tx']}")
48+
49+
50+
def get_hds(cfg, netnl) -> None:
51+
_get_hds_mode(cfg, netnl)
52+
1653

1754
def get_hds_thresh(cfg, netnl) -> None:
1855
try:
@@ -104,6 +141,103 @@ def set_hds_thresh_gt(cfg, netnl) -> None:
104141
netnl.rings_set({'header': {'dev-index': cfg.ifindex}, 'hds-thresh': hds_gt})
105142
ksft_eq(e.exception.nl_msg.error, -errno.EINVAL)
106143

144+
145+
def set_xdp(cfg, netnl) -> None:
146+
"""
147+
Enable single-buffer XDP on the device.
148+
When HDS is in "auto" / UNKNOWN mode, XDP installation should work.
149+
"""
150+
mode = _get_hds_mode(cfg, netnl)
151+
if mode == 'enabled':
152+
netnl.rings_set({'header': {'dev-index': cfg.ifindex},
153+
'tcp-data-split': 'unknown'})
154+
155+
_xdp_onoff(cfg)
156+
157+
158+
def enabled_set_xdp(cfg, netnl) -> None:
159+
"""
160+
Enable single-buffer XDP on the device.
161+
When HDS is in "enabled" mode, XDP installation should not work.
162+
"""
163+
_get_hds_mode(cfg, netnl)
164+
netnl.rings_set({'header': {'dev-index': cfg.ifindex},
165+
'tcp-data-split': 'enabled'})
166+
167+
defer(netnl.rings_set, {'header': {'dev-index': cfg.ifindex},
168+
'tcp-data-split': 'unknown'})
169+
170+
with ksft_raises(CmdExitFailure) as e:
171+
_xdp_onoff(cfg)
172+
173+
174+
def set_xdp(cfg, netnl) -> None:
175+
"""
176+
Enable single-buffer XDP on the device.
177+
When HDS is in "auto" / UNKNOWN mode, XDP installation should work.
178+
"""
179+
mode = _get_hds_mode(cfg, netnl)
180+
if mode == 'enabled':
181+
netnl.rings_set({'header': {'dev-index': cfg.ifindex},
182+
'tcp-data-split': 'unknown'})
183+
184+
_xdp_onoff(cfg)
185+
186+
187+
def enabled_set_xdp(cfg, netnl) -> None:
188+
"""
189+
Enable single-buffer XDP on the device.
190+
When HDS is in "enabled" mode, XDP installation should not work.
191+
"""
192+
_get_hds_mode(cfg, netnl) # Trigger skip if not supported
193+
194+
netnl.rings_set({'header': {'dev-index': cfg.ifindex},
195+
'tcp-data-split': 'enabled'})
196+
defer(netnl.rings_set, {'header': {'dev-index': cfg.ifindex},
197+
'tcp-data-split': 'unknown'})
198+
199+
with ksft_raises(CmdExitFailure) as e:
200+
_xdp_onoff(cfg)
201+
202+
203+
def ioctl(cfg, netnl) -> None:
204+
mode1 = _get_hds_mode(cfg, netnl)
205+
_ioctl_ringparam_modify(cfg, netnl)
206+
mode2 = _get_hds_mode(cfg, netnl)
207+
208+
ksft_eq(mode1, mode2)
209+
210+
211+
def ioctl_set_xdp(cfg, netnl) -> None:
212+
"""
213+
Like set_xdp(), but we perturb the settings via the legacy ioctl.
214+
"""
215+
mode = _get_hds_mode(cfg, netnl)
216+
if mode == 'enabled':
217+
netnl.rings_set({'header': {'dev-index': cfg.ifindex},
218+
'tcp-data-split': 'unknown'})
219+
220+
_ioctl_ringparam_modify(cfg, netnl)
221+
222+
_xdp_onoff(cfg)
223+
224+
225+
def ioctl_enabled_set_xdp(cfg, netnl) -> None:
226+
"""
227+
Enable single-buffer XDP on the device.
228+
When HDS is in "enabled" mode, XDP installation should not work.
229+
"""
230+
_get_hds_mode(cfg, netnl) # Trigger skip if not supported
231+
232+
netnl.rings_set({'header': {'dev-index': cfg.ifindex},
233+
'tcp-data-split': 'enabled'})
234+
defer(netnl.rings_set, {'header': {'dev-index': cfg.ifindex},
235+
'tcp-data-split': 'unknown'})
236+
237+
with ksft_raises(CmdExitFailure) as e:
238+
_xdp_onoff(cfg)
239+
240+
107241
def main() -> None:
108242
with NetDrvEnv(__file__, queue_count=3) as cfg:
109243
ksft_run([get_hds,
@@ -112,7 +246,12 @@ def main() -> None:
112246
set_hds_enable,
113247
set_hds_thresh_zero,
114248
set_hds_thresh_max,
115-
set_hds_thresh_gt],
249+
set_hds_thresh_gt,
250+
set_xdp,
251+
enabled_set_xdp,
252+
ioctl,
253+
ioctl_set_xdp,
254+
ioctl_enabled_set_xdp],
116255
args=(cfg, EthtoolFamily()))
117256
ksft_exit()
118257

tools/testing/selftests/net/lib/Makefile

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@ TEST_FILES := ../../../../../Documentation/netlink/specs
99
TEST_FILES += ../../../../net/ynl
1010

1111
TEST_GEN_FILES += csum
12+
TEST_GEN_FILES += $(patsubst %.c,%.o,$(wildcard *.bpf.c))
1213

1314
TEST_INCLUDES := $(wildcard py/*.py sh/*.sh)
1415

1516
include ../../lib.mk
17+
18+
include ../bpf.mk
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
// SPDX-License-Identifier: GPL-2.0
2+
3+
#define KBUILD_MODNAME "xdp_dummy"
4+
#include <linux/bpf.h>
5+
#include <bpf/bpf_helpers.h>
6+
7+
SEC("xdp")
8+
int xdp_dummy_prog(struct xdp_md *ctx)
9+
{
10+
return XDP_PASS;
11+
}
12+
13+
char _license[] SEC("license") = "GPL";

0 commit comments

Comments
 (0)