DPDK-dev Archive on lore.kernel.org
 help / color / mirror / Atom feed
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

      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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox