selftests/net: Make NetDrvContEnv support queue leasing

Add a new parameter `lease` to NetDrvContEnv that sets up queue leasing
in the env.

The NETIF also has some ethtool parameters changed to support memory
provider tests. This is needed in NetDrvContEnv rather than individual
test cases since the cleanup to restore NETIF can't be done, until the
netns in the env is gone.

Signed-off-by: David Wei <dw@davidwei.uk>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: Stanislav Fomichev <sdf@fomichev.me>
Reviewed-by: Nikolay Aleksandrov <razor@blackwall.org>
Link: https://patch.msgid.link/20260115082603.219152-16-daniel@iogearbox.net
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
David Wei
2026-01-15 09:26:02 +01:00
committed by Paolo Abeni
parent 6be87fbb27
commit ab771c938d

View File

@@ -9,6 +9,7 @@ from lib.py import KsftSkipEx, KsftXfailEx
from lib.py import ksft_setup, wait_file
from lib.py import cmd, ethtool, ip, CmdExitFailure
from lib.py import NetNS, NetdevSimDev
from lib.py import NetdevFamily, EthtoolFamily
from .remote import Remote
from . import bpftool
@@ -300,7 +301,7 @@ class NetDrvContEnv(NetDrvEpEnv):
between the physical interface and a network namespace.
"""
def __init__(self, src_path, nk_rxqueues=1, **kwargs):
def __init__(self, src_path, lease=False, **kwargs):
super().__init__(src_path, **kwargs)
self.require_ipver("6")
@@ -308,6 +309,9 @@ class NetDrvContEnv(NetDrvEpEnv):
if not local_prefix:
raise KsftSkipEx("LOCAL_PREFIX_V6 required")
self.netdevnl = NetdevFamily()
self.ethnl = EthtoolFamily()
local_prefix = local_prefix.rstrip("/64").rstrip("::").rstrip(":")
self.ipv6_prefix = f"{local_prefix}::"
self.nk_host_ipv6 = f"{local_prefix}::2:1"
@@ -319,7 +323,11 @@ class NetDrvContEnv(NetDrvEpEnv):
self._tc_attached = False
self._bpf_prog_pref = None
self._bpf_prog_id = None
self._leased = False
nk_rxqueues = 1
if lease:
nk_rxqueues = 2
ip(f"link add type netkit mode l2 forward peer forward numrxqueues {nk_rxqueues}")
all_links = ip("-d link show", json=True)
@@ -336,6 +344,9 @@ class NetDrvContEnv(NetDrvEpEnv):
self.nk_host_ifindex = netkit_links[1]['ifindex']
self.nk_guest_ifindex = netkit_links[0]['ifindex']
if lease:
self._lease_queues()
self._setup_ns()
self._attach_bpf()
@@ -353,8 +364,42 @@ class NetDrvContEnv(NetDrvEpEnv):
del self.netns
self.netns = None
if self._leased:
self.ethnl.rings_set({'header': {'dev-index': self.ifindex},
'tcp-data-split': 'unknown',
'hds-thresh': self._hds_thresh,
'rx': self._rx_rings})
self._leased = False
super().__del__()
def _lease_queues(self):
channels = self.ethnl.channels_get({'header': {'dev-index': self.ifindex}})
channels = channels['combined-count']
if channels < 2:
raise KsftSkipEx('Test requires NETIF with at least 2 combined channels')
rings = self.ethnl.rings_get({'header': {'dev-index': self.ifindex}})
self._rx_rings = rings['rx']
self._hds_thresh = rings.get('hds-thresh', 0)
self.ethnl.rings_set({'header': {'dev-index': self.ifindex},
'tcp-data-split': 'enabled',
'hds-thresh': 0,
'rx': 64})
self.src_queue = channels - 1
bind_result = self.netdevnl.queue_create(
{
"ifindex": self.nk_guest_ifindex,
"type": "rx",
"lease": {
"ifindex": self.ifindex,
"queue": {"id": self.src_queue, "type": "rx"},
},
}
)
self.nk_queue = bind_result['id']
self._leased = True
def _setup_ns(self):
self.netns = NetNS()
ip(f"link set dev {self._nk_guest_ifname} netns {self.netns.name}")