All of lore.kernel.org
 help / color / mirror / Atom feed
From: Maciej Fijalkowski <maciej.fijalkowski@intel.com>
To: "Bastien Curutchet (eBPF Foundation)" <bastien.curutchet@bootlin.com>
Cc: "Björn Töpel" <bjorn@kernel.org>,
	"Magnus Karlsson" <magnus.karlsson@intel.com>,
	"Jonathan Lemon" <jonathan.lemon@gmail.com>,
	"Alexei Starovoitov" <ast@kernel.org>,
	"Daniel Borkmann" <daniel@iogearbox.net>,
	"Andrii Nakryiko" <andrii@kernel.org>,
	"Martin KaFai Lau" <martin.lau@linux.dev>,
	"Eduard Zingerman" <eddyz87@gmail.com>,
	"Song Liu" <song@kernel.org>,
	"Yonghong Song" <yonghong.song@linux.dev>,
	"John Fastabend" <john.fastabend@gmail.com>,
	"KP Singh" <kpsingh@kernel.org>,
	"Stanislav Fomichev" <sdf@fomichev.me>,
	"Hao Luo" <haoluo@google.com>, "Jiri Olsa" <jolsa@kernel.org>,
	"Mykola Lysenko" <mykolal@fb.com>,
	"Shuah Khan" <shuah@kernel.org>,
	"David S. Miller" <davem@davemloft.net>,
	"Jakub Kicinski" <kuba@kernel.org>,
	"Jesper Dangaard Brouer" <hawk@kernel.org>,
	"Thomas Petazzoni" <thomas.petazzoni@bootlin.com>,
	"Alexis Lothore" <alexis.lothore@bootlin.com>,
	netdev@vger.kernel.org, bpf@vger.kernel.org,
	linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH bpf-next v3 03/14] selftests/bpf: test_xsk: Fix memory leaks
Date: Tue, 16 Sep 2025 19:58:13 +0200	[thread overview]
Message-ID: <aMmlNc1z5ULnOjJY@boxer> (raw)
In-Reply-To: <20250904-xsk-v3-3-ce382e331485@bootlin.com>

On Thu, Sep 04, 2025 at 12:10:18PM +0200, Bastien Curutchet (eBPF Foundation) wrote:
> Some tests introduce memory leaks by not freeing all the pkt_stream
> objects they're creating.
> 
> Fix these memory leaks.

I would appreciate being more explicit here as I've been scratching my
head here.

From what I see the problem is with testapp_stats_rx_dropped() as it's the
one case that uses replace and receive half of pkt streams, both of which
overwrite the default pkt stream. So we lose a pointer to one of pkt
streams and leak it eventually.

Rest of cases should be ok with pkt_stream_restore_default() being called
after each ->test_func() in run_pkt_test().

Anyways let me hear more on your reasoning, thanks! I'm gonna have a
second look tomorrow, I might be missing something.

> 
> Signed-off-by: Bastien Curutchet (eBPF Foundation) <bastien.curutchet@bootlin.com>
> ---
>  tools/testing/selftests/bpf/test_xsk.c | 32 +++++++++++++++++++++++++++++++-
>  1 file changed, 31 insertions(+), 1 deletion(-)
> 
> diff --git a/tools/testing/selftests/bpf/test_xsk.c b/tools/testing/selftests/bpf/test_xsk.c
> index 37752b2dad651b36d155051931d7b3b902fac403..e4059c7d0a289449a6b73669fa87f7440b7f55c0 100644
> --- a/tools/testing/selftests/bpf/test_xsk.c
> +++ b/tools/testing/selftests/bpf/test_xsk.c
> @@ -546,6 +546,13 @@ static void pkt_stream_receive_half(struct test_spec *test)
>  	struct pkt_stream *pkt_stream = test->ifobj_tx->xsk->pkt_stream;
>  	u32 i;
>  
> +	if (test->ifobj_rx->xsk->pkt_stream != test->rx_pkt_stream_default)
> +		/* Packet stream has already been replaced so we have to release this one.
> +		 * The newly created one will be freed by the restore_default() at the
> +		 * end of the test
> +		 */
> +		pkt_stream_delete(test->ifobj_rx->xsk->pkt_stream);
> +
>  	test->ifobj_rx->xsk->pkt_stream = pkt_stream_generate(pkt_stream->nb_pkts,
>  							      pkt_stream->pkts[0].len);
>  	pkt_stream = test->ifobj_rx->xsk->pkt_stream;
> @@ -573,6 +580,22 @@ static void pkt_stream_even_odd_sequence(struct test_spec *test)
>  	}
>  }
>  
> +static void release_even_odd_sequence(struct test_spec *test)
> +{
> +	struct pkt_stream *later_free_tx = test->ifobj_tx->xsk->pkt_stream;
> +	struct pkt_stream *later_free_rx = test->ifobj_rx->xsk->pkt_stream;
> +	int i;
> +
> +	for (i = 0; i < test->nb_sockets; i++) {
> +		/* later_free_{rx/tx} will be freed by restore_default() */
> +		if (test->ifobj_tx->xsk_arr[i].pkt_stream != later_free_tx)
> +			pkt_stream_delete(test->ifobj_tx->xsk_arr[i].pkt_stream);
> +		if (test->ifobj_rx->xsk_arr[i].pkt_stream != later_free_rx)
> +			pkt_stream_delete(test->ifobj_rx->xsk_arr[i].pkt_stream);
> +	}
> +
> +}
> +
>  static u64 pkt_get_addr(struct pkt *pkt, struct xsk_umem_info *umem)
>  {
>  	if (!pkt->valid)
> @@ -1874,6 +1897,7 @@ int testapp_stats_tx_invalid_descs(struct test_spec *test)
>  int testapp_stats_rx_full(struct test_spec *test)
>  {
>  	pkt_stream_replace(test, DEFAULT_UMEM_BUFFERS + DEFAULT_UMEM_BUFFERS / 2, MIN_PKT_SIZE);
> +	pkt_stream_delete(test->ifobj_rx->xsk->pkt_stream);
>  	test->ifobj_rx->xsk->pkt_stream = pkt_stream_generate(DEFAULT_UMEM_BUFFERS, MIN_PKT_SIZE);
>  
>  	test->ifobj_rx->xsk->rxqsize = DEFAULT_UMEM_BUFFERS;
> @@ -1885,6 +1909,7 @@ int testapp_stats_rx_full(struct test_spec *test)
>  int testapp_stats_fill_empty(struct test_spec *test)
>  {
>  	pkt_stream_replace(test, DEFAULT_UMEM_BUFFERS + DEFAULT_UMEM_BUFFERS / 2, MIN_PKT_SIZE);
> +	pkt_stream_delete(test->ifobj_rx->xsk->pkt_stream);
>  	test->ifobj_rx->xsk->pkt_stream = pkt_stream_generate(DEFAULT_UMEM_BUFFERS, MIN_PKT_SIZE);
>  
>  	test->ifobj_rx->use_fill_ring = false;
> @@ -2043,6 +2068,7 @@ int testapp_xdp_shared_umem(struct test_spec *test)
>  {
>  	struct xsk_xdp_progs *skel_rx = test->ifobj_rx->xdp_progs;
>  	struct xsk_xdp_progs *skel_tx = test->ifobj_tx->xdp_progs;
> +	int ret;
>  
>  	test->total_steps = 1;
>  	test->nb_sockets = 2;
> @@ -2053,7 +2079,11 @@ int testapp_xdp_shared_umem(struct test_spec *test)
>  
>  	pkt_stream_even_odd_sequence(test);
>  
> -	return testapp_validate_traffic(test);
> +	ret = testapp_validate_traffic(test);
> +
> +	release_even_odd_sequence(test);
> +
> +	return ret;
>  }
>  
>  int testapp_poll_txq_tmout(struct test_spec *test)
> 
> -- 
> 2.50.1
> 

  reply	other threads:[~2025-09-16 17:58 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-09-04 10:10 [PATCH bpf-next v3 00/14] selftests/bpf: Integrate test_xsk.c to test_progs framework Bastien Curutchet (eBPF Foundation)
2025-09-04 10:10 ` [PATCH bpf-next v3 01/14] selftests/bpf: test_xsk: Split xskxceiver Bastien Curutchet (eBPF Foundation)
2025-09-16 14:21   ` Maciej Fijalkowski
2025-09-17 15:28     ` Bastien Curutchet
2025-09-04 10:10 ` [PATCH bpf-next v3 02/14] selftests/bpf: test_xsk: Initialize bitmap before use Bastien Curutchet (eBPF Foundation)
2025-09-04 10:10 ` [PATCH bpf-next v3 03/14] selftests/bpf: test_xsk: Fix memory leaks Bastien Curutchet (eBPF Foundation)
2025-09-16 17:58   ` Maciej Fijalkowski [this message]
2025-09-17 15:32     ` Bastien Curutchet
2025-09-17 18:33       ` Maciej Fijalkowski
2025-09-18  8:07         ` Bastien Curutchet
2025-09-04 10:10 ` [PATCH bpf-next v3 04/14] selftests/bpf: test_xsk: Wrap test clean-up in functions Bastien Curutchet (eBPF Foundation)
2025-09-04 10:10 ` [PATCH bpf-next v3 05/14] selftests/bpf: test_xsk: Release resources when swap fails Bastien Curutchet (eBPF Foundation)
2025-09-04 10:10 ` [PATCH bpf-next v3 06/14] selftests/bpf: test_xsk: Add return value to init_iface() Bastien Curutchet (eBPF Foundation)
2025-09-04 10:10 ` [PATCH bpf-next v3 07/14] selftests/bpf: test_xsk: Don't exit immediately when xsk_attach fails Bastien Curutchet (eBPF Foundation)
2025-09-04 10:10 ` [PATCH bpf-next v3 08/14] selftests/bpf: test_xsk: Don't exit immediately when gettimeofday fails Bastien Curutchet (eBPF Foundation)
2025-09-04 10:10 ` [PATCH bpf-next v3 09/14] selftests/bpf: test_xsk: Don't exit immediately when workers fail Bastien Curutchet (eBPF Foundation)
2025-09-04 10:10 ` [PATCH bpf-next v3 10/14] selftests/bpf: test_xsk: Don't exit immediately if validate_traffic fails Bastien Curutchet (eBPF Foundation)
2025-09-04 10:10 ` [PATCH bpf-next v3 11/14] selftests/bpf: test_xsk: Don't exit immediately on allocation failures Bastien Curutchet (eBPF Foundation)
2025-09-04 10:10 ` [PATCH bpf-next v3 12/14] selftests/bpf: test_xsk: Move exit_with_error to xskxceiver.c Bastien Curutchet (eBPF Foundation)
2025-09-04 10:10 ` [PATCH bpf-next v3 13/14] selftests/bpf: test_xsk: Isolate flaky tests Bastien Curutchet (eBPF Foundation)
2025-09-04 10:10 ` [PATCH bpf-next v3 14/14] selftests/bpf: test_xsk: Integrate test_xsk.c to test_progs framework Bastien Curutchet (eBPF Foundation)
2025-09-16 18:16   ` Maciej Fijalkowski
2025-09-17 15:37     ` Bastien Curutchet
2025-09-04 14:17 ` [PATCH bpf-next v3 00/14] selftests/bpf: " Maciej Fijalkowski
2025-09-04 14:50   ` Bastien Curutchet
2025-09-15 17:13   ` Alexei Starovoitov

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=aMmlNc1z5ULnOjJY@boxer \
    --to=maciej.fijalkowski@intel.com \
    --cc=alexis.lothore@bootlin.com \
    --cc=andrii@kernel.org \
    --cc=ast@kernel.org \
    --cc=bastien.curutchet@bootlin.com \
    --cc=bjorn@kernel.org \
    --cc=bpf@vger.kernel.org \
    --cc=daniel@iogearbox.net \
    --cc=davem@davemloft.net \
    --cc=eddyz87@gmail.com \
    --cc=haoluo@google.com \
    --cc=hawk@kernel.org \
    --cc=john.fastabend@gmail.com \
    --cc=jolsa@kernel.org \
    --cc=jonathan.lemon@gmail.com \
    --cc=kpsingh@kernel.org \
    --cc=kuba@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-kselftest@vger.kernel.org \
    --cc=magnus.karlsson@intel.com \
    --cc=martin.lau@linux.dev \
    --cc=mykolal@fb.com \
    --cc=netdev@vger.kernel.org \
    --cc=sdf@fomichev.me \
    --cc=shuah@kernel.org \
    --cc=song@kernel.org \
    --cc=thomas.petazzoni@bootlin.com \
    --cc=yonghong.song@linux.dev \
    /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.