summaryrefslogtreecommitdiffstats
path: root/net/ipv4
diff options
context:
space:
mode:
authorMartin KaFai Lau <kafai@fb.com>2021-07-01 13:05:54 -0700
committerAndrii Nakryiko <andrii@kernel.org>2021-07-23 16:44:41 -0700
commit62001372c2b6cdf2346afb2cf94ed3d950eee64c (patch)
treeef12a6c8652a2000e09ad50d748d811cef758475 /net/ipv4
parentad2d61376a0517f19f49fc23de9e12d2b06484fc (diff)
downloadlinux-stable-62001372c2b6cdf2346afb2cf94ed3d950eee64c.tar.gz
linux-stable-62001372c2b6cdf2346afb2cf94ed3d950eee64c.tar.bz2
linux-stable-62001372c2b6cdf2346afb2cf94ed3d950eee64c.zip
bpf: tcp: seq_file: Remove bpf_seq_afinfo from tcp_iter_state
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
Diffstat (limited to 'net/ipv4')
-rw-r--r--net/ipv4/tcp_ipv4.c25
1 files changed, 5 insertions, 20 deletions
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c
index f2583c4699fd..665f99d14436 100644
--- a/net/ipv4/tcp_ipv4.c
+++ b/net/ipv4/tcp_ipv4.c
@@ -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);
}