From: Stephen Hemminger <stephen@networkplumber.org>
To: Sriram Yagnaraman <sriram.yagnaraman@ericsson.com>
Cc: <dev@dpdk.org>, Jakub Grajciar <jgrajcia@cisco.com>, <stable@dpdk.org>
Subject: Re: [PATCH 0/6] net/memif: lifecycle fixes and unit test
Date: Wed, 14 Oct 2026 20:09:25 -0700 [thread overview]
Message-ID: <20261014200925.6c35e94a@phoenix.local> (raw)
In-Reply-To: <20261014091257.1051190-1-sriram.yagnaraman@ericsson.com>
On Wed, 14 Oct 2026 11:12:51 +0200
Sriram Yagnaraman <sriram.yagnaraman@ericsson.com> wrote:
> This series fixes a set of error-path and lifecycle bugs in the memif
> PMD and adds a unit test for the driver.
>
> The first five patches are fixes:
>
> - guard eth_memif_tx() against an empty burst so a zero-count call
> returns before touching the burst or the ring;
> - close file descriptor 0 instead of leaking it (the close path
> tested for fd > 0 instead of fd >= 0);
> - free the MAC address allocated during probe when a later step
> fails, instead of leaking it;
> - unwind a partially-created device on failure in memif_create(),
> releasing the port and the process-private data rather than
> returning with them registered and leaked;
> - disconnect the device on close so queues and shared regions are
> torn down, and make memif_disconnect() safe to call on a device
> that was configured but never started.
>
> The last patch adds a memif PMD unit test (app/test, memif_pmd_autotest)
> that stands up a server/client vdev pair over a loopback socket and
> covers dev_info, link state, stats, single- and multi-segment loopback,
> stop/start reconnect, empty Tx burst, and close without stop.
>
> Verified: memif_pmd_autotest passes 9/9; check-git-log and checkpatch
> are clean across the series.
After walking through code when using bonding etc, sometimes apps
send 0 packets as keepalive time call.
AI did find some other things to address..
Series applies cleanly to main (2a58f6e) and builds at every commit
with -Dwerror=true. Not run. No errors; warnings below, so no
Reviewed-by yet.
[PATCH 1/6] net/memif: guard against empty Tx burst
Warning: wrong Fixes tag. The bufs[0]->pool read in the single-pool
check came in with the Tx fast path, not the original driver:
Fixes: b5613c8f9d0a ("net/memif: add a Tx fast path")
Info: put the check after the ring == NULL block, not before it. An
empty burst in a secondary process then still triggers the region
request through rte_eth_link_get(), as it does in zero-copy mode.
[PATCH 2/6] net/memif: close file descriptor zero
Warning: the zero-copy branch in memif_free_regions() closes an fd
the driver does not own. For i > 0 with ETH_MEMIF_FLAG_ZERO_COPY,
r->fd came from rte_memseg_get_fd() in memif_region_init_zc(), and
rte_memory.h says that fd is EAL internal and read-only. Every
zero-copy client disconnect closes EAL's hugepage fd; the next
connect passes the peer a stale (possibly reused) fd number.
Pre-existing, but this patch edits that exact line. Fix it in a
separate patch in this series instead of making it ">= 0":
if (i > 0 && (pmd->flags & ETH_MEMIF_FLAG_ZERO_COPY)) {
/* memseg fd is owned by EAL, do not close */
r->addr = NULL;
r->fd = -1;
}
Fixes: 43b815d88188 ("net/memif: support zero-copy slave")
[PATCH 3/6] net/memif: fix MAC address leak on probe failure
Info: the secondary-process "return -1" -> "return -ENOMEM" change
is not in the commit message. Mention it or drop it.
[PATCH 4/6] net/memif: unwind partial device on create failure
Info: the process_private leak came from multi-process support.
Add a second tag:
Fixes: c41a04958b09 ("net/memif: support multi-process")
[PATCH 5/6] net/memif: disconnect on device close
Warning: the commit message names the wrong trigger.
rte_eth_dev_close() rejects a started port, so close never runs
"without a preceding dev_stop" on a started device. The real leak:
memif_msg_receive_init() binds pmd->cc on a server without checking
dev_started, so a server port that is stopped or never started still
accepts a peer, and pmd->cc is live at close. Say that; it is what
stable maintainers need to judge the backport.
[PATCH 6/6] test/memif: add memif PMD unit test
Warning: add the test to MAINTAINERS under Memif PMD, as done for
the other PMD tests:
F: app/test/test_pmd_memif.c
Warning: test_memif_close_without_stop does not cover the fix it
claims to. The throwaway server never has a peer, so pmd->cc is
NULL and memif_disconnect() skips the control channel; only the
NULL queue skip is exercised. Connect a client to the unstarted
server before closing it so ASan catches a cc leak:
/* server: configure + queue setup, do NOT start */
ret = rte_vdev_init("net_memif_test_tmpc",
"role=client,id=1,socket-abstract=yes,"
"socket=memif-autotest-tmp");
cport = find_port("net_memif_test_tmpc");
TEST_ASSERT(configure_port(cport) == 0, "client start failed");
usleep(CONNECT_DELAY_US); /* server accepts, binds cc */
ret = rte_eth_dev_close(port); /* server, cc live */
Warning: test_memif_setup() returns TEST_SKIPPED when the server
fails to probe. memif on an abstract socket needs no privilege or
hardware, so a probe regression would be reported as a skip. Return
TEST_FAILED there, and in test_memif_close_without_stop().
Info: the Tx fast path is never exercised. Both ports use bsize=512,
which is below the mbuf data room (2048), so eth_memif_tx() always
takes the slow path and the single-pool copy loop is untested. Add a
single-segment loopback on a pair using the default bsize.
Info: stale comments in the multiseg test. BIG_PKT_LEN says
"> default pkt_buffer_size (2048)" but the pair runs bsize=512.
WRAP_PKTS is derived from RING_SIZE, which memif ignores
(nb_tx_desc is __rte_unused); the memif ring is rsize, default
2^10. It wraps only because each packet takes 8 descriptors. Make
it explicit:
#define MEMIF_LOG2_RING 8
/* add ",rsize=8" to both MEMIF_*_ARGS */
#define WRAP_PKTS ((1 << MEMIF_LOG2_RING) / 8 + 8)
Info: test_memif_send_receive checks only the first payload byte,
while the commit message says payload is verified. Check it all:
plen = PKT_LEN - sizeof(struct rte_ether_hdr);
for (k = 0; k < plen; k++)
if (p[k] != (uint8_t)(got + k))
break;
Not in this series, found while reading the Tx path:
eth_memif_tx_zc() returns uint16_t but does "return -1" when the
interrupt fd is invalid, so the caller sees 65535 packets sent after
ring->head has already been published. It is reachable:
memif_init_queues() only warns and continues with fd -1 when
eventfd() fails. Skip the kick instead, as eth_memif_tx() does:
if ((ring->flags & MEMIF_RING_FLAG_MASK_INT) == 0 &&
rte_intr_fd_get(mq->intr_handle) >= 0) {
uint64_t a = 1;
ssize_t size = write(rte_intr_fd_get(mq->intr_handle),
&a, sizeof(a));
...
}
Fixes: aedd054c5c2a ("drivers: check interrupt file descriptor validity")
Cc: stable@dpdk.org
prev parent reply other threads:[~2026-10-15 3:09 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-14 9:12 [PATCH 0/6] net/memif: lifecycle fixes and unit test Sriram Yagnaraman
2026-10-14 9:12 ` [PATCH 1/6] net/memif: guard against empty Tx burst Sriram Yagnaraman
2026-10-14 15:07 ` Stephen Hemminger
2026-10-14 9:12 ` [PATCH 2/6] net/memif: close file descriptor zero Sriram Yagnaraman
2026-10-14 9:12 ` [PATCH 3/6] net/memif: fix MAC address leak on probe failure Sriram Yagnaraman
2026-10-14 9:12 ` [PATCH 4/6] net/memif: unwind partial device on create failure Sriram Yagnaraman
2026-10-14 9:12 ` [PATCH 5/6] net/memif: disconnect on device close Sriram Yagnaraman
2026-10-14 9:12 ` [PATCH 6/6] test/memif: add memif PMD unit test Sriram Yagnaraman
2026-10-15 3:09 ` Stephen Hemminger [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20261014200925.6c35e94a@phoenix.local \
--to=stephen@networkplumber.org \
--cc=dev@dpdk.org \
--cc=jgrajcia@cisco.com \
--cc=sriram.yagnaraman@ericsson.com \
--cc=stable@dpdk.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.