Breno Leitao wrote:
Add a basic selftest for the netpoll polling mechanism, specifically targeting the netpoll poll() side.
The test creates a scenario where network transmission is running at maximum speed, and netpoll needs to poll the NIC. This is achieved by:
- Configuring a single RX/TX queue to create contention
- Generating background traffic to saturate the interface
- Sending netconsole messages to trigger netpoll polling
- Using dynamic netconsole targets via configfs
- Delete and create new netconsole targets after some messages
- Start a bpftrace in parallel to make sure netpoll_poll_dev() is called
- If bpftrace exists and netpoll_poll_dev() was called, stop.
The test validates a critical netpoll code path by monitoring traffic flow and ensuring netpoll_poll_dev() is called when the normal TX path is blocked.
This addresses a gap in netpoll test coverage for a path that is tricky for the network stack.
Signed-off-by: Breno Leitao leitao@debian.org
Reviewed-by: Willem de Bruijn willemb@google.com
+def test_netpoll(cfg: NetDrvEpEnv) -> None:
- """
- Test netpoll by sending traffic to the interface and then sending
- netconsole messages to trigger a poll
- """
- target_name = netcons_generate_random_target_name()
- ifname = cfg.dev["ifname"]
- traffic = None
- original_queues = ethtool_read_rx_tx_queue(ifname)
- try:
# Set RX/TX queues to 1 to force congestion
ethtool_set_rx_tx_queue(ifname, 1, 1)
traffic = GenerateTraffic(cfg)
do_netpoll_flush_monitored(cfg, ifname, target_name)
- finally:
if traffic:
traffic.stop()
# Revert RX/TX queues
ethtool_set_rx_tx_queue(ifname, original_queues[0], original_queues[1])
netcons_delete_target(target_name)
bpftrace_stop()
One risk with stateful tests is that the state is not reset if the test exists (or crashes) before reaching the cleanup logic. There are ways around it. Jakub added defer for this purpose, for one.