]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
bpf: tcp: Get rid of st_bucket_done
authorJordan Rife <jordan@jrife.io>
Mon, 14 Jul 2025 18:09:07 +0000 (11:09 -0700)
committerMartin KaFai Lau <martin.lau@kernel.org>
Mon, 14 Jul 2025 19:09:09 +0000 (12:09 -0700)
Get rid of the st_bucket_done field to simplify TCP iterator state and
logic. Before, st_bucket_done could be false if bpf_iter_tcp_batch
returned a partial batch; however, with the last patch ("bpf: tcp: Make
sure iter->batch always contains a full bucket snapshot"),
st_bucket_done == true is equivalent to iter->cur_sk == iter->end_sk.

Signed-off-by: Jordan Rife <jordan@jrife.io>
Signed-off-by: Martin KaFai Lau <martin.lau@kernel.org>
Reviewed-by: Kuniyuki Iwashima <kuniyu@amazon.com>
Acked-by: Stanislav Fomichev <sdf@fomichev.me>
net/ipv4/tcp_ipv4.c

index 291b24508c2f2f0fb343568b866000d512590fef..1c88b537109f168e374b67147262efb17634ad86 100644 (file)
@@ -3020,7 +3020,6 @@ struct bpf_tcp_iter_state {
        unsigned int end_sk;
        unsigned int max_sk;
        struct sock **batch;
-       bool st_bucket_done;
 };
 
 struct bpf_iter__tcp {
@@ -3043,8 +3042,10 @@ static int tcp_prog_seq_show(struct bpf_prog *prog, struct bpf_iter_meta *meta,
 
 static void bpf_iter_tcp_put_batch(struct bpf_tcp_iter_state *iter)
 {
-       while (iter->cur_sk < iter->end_sk)
-               sock_gen_put(iter->batch[iter->cur_sk++]);
+       unsigned int cur_sk = iter->cur_sk;
+
+       while (cur_sk < iter->end_sk)
+               sock_gen_put(iter->batch[cur_sk++]);
 }
 
 static int bpf_iter_tcp_realloc_batch(struct bpf_tcp_iter_state *iter,
@@ -3161,7 +3162,7 @@ static struct sock *bpf_iter_tcp_batch(struct seq_file *seq)
         * one by one in the current bucket and eventually find out
         * it has to advance to the next bucket.
         */
-       if (iter->st_bucket_done) {
+       if (iter->end_sk && iter->cur_sk == iter->end_sk) {
                st->offset = 0;
                st->bucket++;
                if (st->state == TCP_SEQ_STATE_LISTENING &&
@@ -3173,7 +3174,6 @@ static struct sock *bpf_iter_tcp_batch(struct seq_file *seq)
 
        iter->cur_sk = 0;
        iter->end_sk = 0;
-       iter->st_bucket_done = true;
 
        sk = tcp_seek_last_pos(seq);
        if (!sk)
@@ -3321,10 +3321,8 @@ static void bpf_iter_tcp_seq_stop(struct seq_file *seq, void *v)
                        (void)tcp_prog_seq_show(prog, &meta, v, 0);
        }
 
-       if (iter->cur_sk < iter->end_sk) {
+       if (iter->cur_sk < iter->end_sk)
                bpf_iter_tcp_put_batch(iter);
-               iter->st_bucket_done = false;
-       }
 }
 
 static const struct seq_operations bpf_iter_tcp_seq_ops = {