All of lore.kernel.org
 help / color / mirror / Atom feed
From: Martin KaFai Lau <martin.lau@linux.dev>
To: Aditi Ghag <aditi.ghag@isovalent.com>
Cc: sdf@google.com, Martin KaFai Lau <martin.lau@kernel.org>,
	bpf@vger.kernel.org, Network Development <netdev@vger.kernel.org>
Subject: Re: [PATCH v9 bpf-next 5/9] bpf: udp: Implement batching for sockets iterator
Date: Tue, 19 Sep 2023 17:38:35 -0700	[thread overview]
Message-ID: <f85fbac6-a1d7-3f63-9d0f-8eaa261ddb26@linux.dev> (raw)
In-Reply-To: <20230519225157.760788-6-aditi.ghag@isovalent.com>

On 5/19/23 3:51 PM, Aditi Ghag wrote:
> +static struct sock *bpf_iter_udp_batch(struct seq_file *seq)
> +{
> +	struct bpf_udp_iter_state *iter = seq->private;
> +	struct udp_iter_state *state = &iter->state;
> +	struct net *net = seq_file_net(seq);
> +	struct udp_table *udptable;
> +	unsigned int batch_sks = 0;
> +	bool resized = false;
> +	struct sock *sk;
> +
> +	/* The current batch is done, so advance the bucket. */
> +	if (iter->st_bucket_done) {
> +		state->bucket++;
> +		iter->offset = 0;
> +	}
> +
> +	udptable = udp_get_table_seq(seq, net);
> +
> +again:
> +	/* New batch for the next bucket.
> +	 * Iterate over the hash table to find a bucket with sockets matching
> +	 * the iterator attributes, and return the first matching socket from
> +	 * the bucket. The remaining matched sockets from the bucket are batched
> +	 * before releasing the bucket lock. This allows BPF programs that are
> +	 * called in seq_show to acquire the bucket lock if needed.
> +	 */
> +	iter->cur_sk = 0;
> +	iter->end_sk = 0;
> +	iter->st_bucket_done = false;
> +	batch_sks = 0;
> +
> +	for (; state->bucket <= udptable->mask; state->bucket++) {
> +		struct udp_hslot *hslot2 = &udptable->hash2[state->bucket];
> +
> +		if (hlist_empty(&hslot2->head)) {
> +			iter->offset = 0;
> +			continue;
> +		}
> +
> +		spin_lock_bh(&hslot2->lock);
> +		udp_portaddr_for_each_entry(sk, &hslot2->head) {
> +			if (seq_sk_match(seq, sk)) {
> +				/* Resume from the last iterated socket at the
> +				 * offset in the bucket before iterator was stopped.
> +				 */
> +				if (iter->offset) {
> +					--iter->offset;

Hi Aditi, I think this part has a bug.

When I run './test_progs -t bpf_iter/udp6' in a machine with some udp 
so_reuseport sockets, this test is never finished.

A broken case I am seeing is when the bucket has >1 sockets and bpf_seq_read() 
can only get one sk at a time before it calls bpf_iter_udp_seq_stop().

I did not try the change yet. However, from looking at the code where 
iter->offset is changed, --iter->offset here is the most likely culprit and it 
will make backward progress for the same bucket (state->bucket). Other places 
touching iter->offset look fine.

It needs a local "int offset" variable for the zero test. Could you help to take 
a look, add (or modify) a test and fix it?

The progs/bpf_iter_udp[46].c test can be used to reproduce. The test_udp[46] in 
prog_tests/bpf_iter.c needs to be changed though to ensure there is multiple sk 
in the same bucket. Probably a few so_reuseport sk should do.

Thanks.

> +					continue;
> +				}
> +				if (iter->end_


  reply	other threads:[~2023-09-20  0:38 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-05-19 22:51 [PATCH v9 bpf-next 0/9] bpf: Add socket destroy capability Aditi Ghag
2023-05-19 22:51 ` [PATCH v9 bpf-next 1/9] bpf: tcp: Avoid taking fast sock lock in iterator Aditi Ghag
2023-05-19 22:51 ` [PATCH v9 bpf-next 2/9] udp: seq_file: Helper function to match socket attributes Aditi Ghag
2023-05-19 22:51 ` [PATCH v9 bpf-next 3/9] bpf: udp: Encapsulate logic to get udp table Aditi Ghag
2023-05-19 22:51 ` [PATCH v9 bpf-next 4/9] udp: seq_file: Remove bpf_seq_afinfo from udp_iter_state Aditi Ghag
2023-05-19 22:51 ` [PATCH v9 bpf-next 5/9] bpf: udp: Implement batching for sockets iterator Aditi Ghag
2023-09-20  0:38   ` Martin KaFai Lau [this message]
2023-09-20 17:16     ` Aditi Ghag
2023-09-25 23:34     ` Aditi Ghag
2023-09-26  5:02       ` Martin KaFai Lau
2023-09-26 16:07         ` Aditi Ghag
2023-10-24 22:50           ` Aditi Ghag
2023-09-26  5:07       ` Martin KaFai Lau
2023-05-19 22:51 ` [PATCH v9 bpf-next 6/9] bpf: Add kfunc filter function to 'struct btf_kfunc_id_set' Aditi Ghag
2023-05-19 22:51 ` [PATCH v9 bpf-next 7/9] bpf: Add bpf_sock_destroy kfunc Aditi Ghag
2023-05-19 22:51 ` [PATCH v9 bpf-next 8/9] selftests/bpf: Add helper to get port using getsockname Aditi Ghag
2023-05-19 22:51 ` [PATCH v9 bpf-next 9/9] selftests/bpf: Test bpf_sock_destroy Aditi Ghag
2023-05-20  6:00 ` [PATCH v9 bpf-next 0/9] bpf: Add socket destroy capability patchwork-bot+netdevbpf

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=f85fbac6-a1d7-3f63-9d0f-8eaa261ddb26@linux.dev \
    --to=martin.lau@linux.dev \
    --cc=aditi.ghag@isovalent.com \
    --cc=bpf@vger.kernel.org \
    --cc=martin.lau@kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=sdf@google.com \
    /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.