bpf: tcp: seq_file: Remove bpf_seq_afinfo from tcp_iter_state
authorMartin KaFai Lau <kafai@fb.com>
Thu, 1 Jul 2021 20:05:54 +0000 (13:05 -0700)
committerAndrii Nakryiko <andrii@kernel.org>
Fri, 23 Jul 2021 23:44:41 +0000 (16:44 -0700)
A following patch will create a separate struct to store extra
bpf_iter state and it will embed the existing tcp_iter_state like this:
struct bpf_tcp_iter_state {
struct tcp_iter_state state;
/* More bpf_iter specific states here ... */
}

As a prep work, this patch removes the
"struct tcp_seq_afinfo *bpf_seq_afinfo" where its purpose is
to tell if it is iterating from bpf_iter instead of proc fs.
Currently, if "*bpf_seq_afinfo" is not NULL, it is iterating from
bpf_iter.  The kernel should not filter by the addr family and
leave this filtering decision to the bpf prog.

Instead of adding a "*bpf_seq_afinfo" pointer, this patch uses the
"seq->op == &bpf_iter_tcp_seq_ops" test to tell if it is iterating
from the bpf iter.

The bpf_iter_(init|fini)_tcp() is left here to prepare for
the change of a following patch.

Signed-off-by: Martin KaFai Lau <kafai@fb.com>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Reviewed-by: Eric Dumazet <edumazet@google.com>
Acked-by: Kuniyuki Iwashima <kuniyu@amazon.co.jp>
Acked-by: Yonghong Song <yhs@fb.com>
Link: https://lore.kernel.org/bpf/20210701200554.1034982-1-kafai@fb.com
include/net/tcp.h
net/ipv4/tcp_ipv4.c

index 17df9b047ee46dabed8797246f99e1a2fd39c243..ba3034123e1db294211d9231f32f727e5588a790 100644 (file)
@@ -1959,7 +1959,6 @@ struct tcp_iter_state {
        struct seq_net_private  p;
        enum tcp_seq_states     state;
        struct sock             *syn_wait_sk;
-       struct tcp_seq_afinfo   *bpf_seq_afinfo;
        int                     bucket, offset, sbucket, num;
        loff_t                  last_pos;
 };
index f2583c4699fd452c54b5a6716fa9701a64d0a36d..665f99d144367ea24a4611e1053197e650c8930a 100644 (file)
@@ -2735,12 +2735,13 @@ static const struct seq_operations bpf_iter_tcp_seq_ops = {
 #endif
 static unsigned short seq_file_family(const struct seq_file *seq)
 {
-       const struct tcp_iter_state *st = seq->private;
-       const struct tcp_seq_afinfo *afinfo = st->bpf_seq_afinfo;
+       const struct tcp_seq_afinfo *afinfo;
 
+#ifdef CONFIG_BPF_SYSCALL
        /* Iterated from bpf_iter.  Let the bpf prog to filter instead. */
-       if (afinfo)
+       if (seq->op == &bpf_iter_tcp_seq_ops)
                return AF_UNSPEC;
+#endif
 
        /* Iterated from proc fs */
        afinfo = PDE_DATA(file_inode(seq->file));
@@ -2998,27 +2999,11 @@ DEFINE_BPF_ITER_FUNC(tcp, struct bpf_iter_meta *meta,
 
 static int bpf_iter_init_tcp(void *priv_data, struct bpf_iter_aux_info *aux)
 {
-       struct tcp_iter_state *st = priv_data;
-       struct tcp_seq_afinfo *afinfo;
-       int ret;
-
-       afinfo = kmalloc(sizeof(*afinfo), GFP_USER | __GFP_NOWARN);
-       if (!afinfo)
-               return -ENOMEM;
-
-       afinfo->family = AF_UNSPEC;
-       st->bpf_seq_afinfo = afinfo;
-       ret = bpf_iter_init_seq_net(priv_data, aux);
-       if (ret)
-               kfree(afinfo);
-       return ret;
+       return bpf_iter_init_seq_net(priv_data, aux);
 }
 
 static void bpf_iter_fini_tcp(void *priv_data)
 {
-       struct tcp_iter_state *st = priv_data;
-
-       kfree(st->bpf_seq_afinfo);
        bpf_iter_fini_seq_net(priv_data);
 }