bpf: Refactor to provide aux info to bpf_iter_init_seq_priv_t
authorYonghong Song <yhs@fb.com>
Thu, 23 Jul 2020 18:41:10 +0000 (11:41 -0700)
committerAlexei Starovoitov <ast@kernel.org>
Sun, 26 Jul 2020 03:16:32 +0000 (20:16 -0700)
This patch refactored target bpf_iter_init_seq_priv_t callback
function to accept additional information. This will be needed
in later patches for map element targets since a particular
map should be passed to traverse elements for that particular
map. In the future, other information may be passed to target
as well, e.g., pid, cgroup id, etc. to customize the iterator.

Signed-off-by: Yonghong Song <yhs@fb.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Link: https://lore.kernel.org/bpf/20200723184110.590156-1-yhs@fb.com
fs/proc/proc_net.c
include/linux/bpf.h
include/linux/proc_fs.h
kernel/bpf/bpf_iter.c
kernel/bpf/task_iter.c
net/ipv4/tcp_ipv4.c
net/ipv4/udp.c

index dba63b2429f05f21a4cca98af64203fd4e3e9724..ed8a6306990c43cd61b5c53cd4a607926805b858 100644 (file)
@@ -98,7 +98,7 @@ static const struct proc_ops proc_net_seq_ops = {
        .proc_release   = seq_release_net,
 };
 
-int bpf_iter_init_seq_net(void *priv_data)
+int bpf_iter_init_seq_net(void *priv_data, struct bpf_iter_aux_info *aux)
 {
 #ifdef CONFIG_NET_NS
        struct seq_net_private *p = priv_data;
index 127067f71fd49465a2bc22d2ada26cd48a07c333..ef52717336cfb7bdfdc76165f0ba29d662183cda 100644 (file)
@@ -33,11 +33,13 @@ struct btf;
 struct btf_type;
 struct exception_table_entry;
 struct seq_operations;
+struct bpf_iter_aux_info;
 
 extern struct idr btf_idr;
 extern spinlock_t btf_idr_lock;
 
-typedef int (*bpf_iter_init_seq_priv_t)(void *private_data);
+typedef int (*bpf_iter_init_seq_priv_t)(void *private_data,
+                                       struct bpf_iter_aux_info *aux);
 typedef void (*bpf_iter_fini_seq_priv_t)(void *private_data);
 struct bpf_iter_seq_info {
        const struct seq_operations *seq_ops;
@@ -1198,6 +1200,9 @@ int bpf_obj_get_user(const char __user *pathname, int flags);
        extern int bpf_iter_ ## target(args);                   \
        int __init bpf_iter_ ## target(args) { return 0; }
 
+struct bpf_iter_aux_info {
+};
+
 #define BPF_ITER_CTX_ARG_MAX 2
 struct bpf_iter_reg {
        const char *target;
index d1eed1b436517224526fd26d6dabeeb0320cb837..2df965cd09742da05b5f3ee7613ce32199391b14 100644 (file)
@@ -133,7 +133,8 @@ struct proc_dir_entry *proc_create_net_single_write(const char *name, umode_t mo
                                                    void *data);
 extern struct pid *tgid_pidfd_to_pid(const struct file *file);
 
-extern int bpf_iter_init_seq_net(void *priv_data);
+struct bpf_iter_aux_info;
+extern int bpf_iter_init_seq_net(void *priv_data, struct bpf_iter_aux_info *aux);
 extern void bpf_iter_fini_seq_net(void *priv_data);
 
 #ifdef CONFIG_PROC_PID_ARCH_STATUS
index 5b2387d6aa1ffcbfad477083c345071233a5a0f9..8fa94cb1b5a0687290891ca1ff2c5a0611e34bd7 100644 (file)
@@ -442,7 +442,7 @@ static int prepare_seq_file(struct file *file, struct bpf_iter_link *link)
        }
 
        if (tinfo->reg_info->seq_info->init_seq_private) {
-               err = tinfo->reg_info->seq_info->init_seq_private(priv_data->target_private);
+               err = tinfo->reg_info->seq_info->init_seq_private(priv_data->target_private, NULL);
                if (err)
                        goto release_seq_file;
        }
index 6d9cd23869bf6627013a4d313bdd6ab4ebf7bf0d..232df29793e962201aa4875d39b8cbcc4d295a16 100644 (file)
@@ -293,7 +293,7 @@ static void task_file_seq_stop(struct seq_file *seq, void *v)
        }
 }
 
-static int init_seq_pidns(void *priv_data)
+static int init_seq_pidns(void *priv_data, struct bpf_iter_aux_info *aux)
 {
        struct bpf_iter_seq_task_common *common = priv_data;
 
index cb288fdcf2caec99c0d2b9625ae4318823cf5de5..5084333b5ab647ca8ed296235a1ed6573693b250 100644 (file)
@@ -2921,7 +2921,7 @@ static struct pernet_operations __net_initdata tcp_sk_ops = {
 DEFINE_BPF_ITER_FUNC(tcp, struct bpf_iter_meta *meta,
                     struct sock_common *sk_common, uid_t uid)
 
-static int bpf_iter_init_tcp(void *priv_data)
+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;
@@ -2933,7 +2933,7 @@ static int bpf_iter_init_tcp(void *priv_data)
 
        afinfo->family = AF_UNSPEC;
        st->bpf_seq_afinfo = afinfo;
-       ret = bpf_iter_init_seq_net(priv_data);
+       ret = bpf_iter_init_seq_net(priv_data, aux);
        if (ret)
                kfree(afinfo);
        return ret;
index 1bc50ec2caefbdef55deaf220acad83407b817a8..7ce31beccfc2d5557c8b7106d5ad07812c1fc2c4 100644 (file)
@@ -3181,7 +3181,7 @@ static struct pernet_operations __net_initdata udp_sysctl_ops = {
 DEFINE_BPF_ITER_FUNC(udp, struct bpf_iter_meta *meta,
                     struct udp_sock *udp_sk, uid_t uid, int bucket)
 
-static int bpf_iter_init_udp(void *priv_data)
+static int bpf_iter_init_udp(void *priv_data, struct bpf_iter_aux_info *aux)
 {
        struct udp_iter_state *st = priv_data;
        struct udp_seq_afinfo *afinfo;
@@ -3194,7 +3194,7 @@ static int bpf_iter_init_udp(void *priv_data)
        afinfo->family = AF_UNSPEC;
        afinfo->udp_table = &udp_table;
        st->bpf_seq_afinfo = afinfo;
-       ret = bpf_iter_init_seq_net(priv_data);
+       ret = bpf_iter_init_seq_net(priv_data, aux);
        if (ret)
                kfree(afinfo);
        return ret;