struct bpf_cfg_in already carries a pointer to sock_filter ops.
It's currently set to a local variable in bpf_parse_opt_tbl(),
shared between parsing and loading stages.  Move the array
entirely to struct bpf_cfg_in, this will allow us to split
parsing and loading.

Signed-off-by: Jakub Kicinski <jakub.kicin...@netronome.com>
Reviewed-by: Quentin Monnet <quentin.mon...@netronome.com>
Acked-by: Daniel Borkmann <dan...@iogearbox.net>
---
 include/bpf_util.h | 2 +-
 lib/bpf.c          | 7 ++-----
 2 files changed, 3 insertions(+), 6 deletions(-)

diff --git a/include/bpf_util.h b/include/bpf_util.h
index a6f4eeb5fe01..638721f6315a 100644
--- a/include/bpf_util.h
+++ b/include/bpf_util.h
@@ -72,7 +72,7 @@ struct bpf_cfg_in {
        enum bpf_mode mode;
        int argc;
        char **argv;
-       struct sock_filter *ops;
+       struct sock_filter opcodes[BPF_MAXINSNS];
 };
 
 /* ALU ops on registers, bpf_add|sub|...: dst_reg += src_reg */
diff --git a/lib/bpf.c b/lib/bpf.c
index 33c92d6c8a69..7493595ab1d6 100644
--- a/lib/bpf.c
+++ b/lib/bpf.c
@@ -894,7 +894,7 @@ static int bpf_parse(struct bpf_cfg_in *cfg, const bool 
*opt_tbl)
        }
 
        if (cfg->mode == CBPF_BYTECODE || cfg->mode == CBPF_FILE)
-               ret = bpf_ops_parse(argc, argv, cfg->ops,
+               ret = bpf_ops_parse(argc, argv, cfg->opcodes,
                                    cfg->mode == CBPF_FILE);
        else if (cfg->mode == EBPF_OBJECT)
                ret = bpf_obj_open(file, cfg->type, section, verbose);
@@ -916,18 +916,15 @@ static int bpf_parse_opt_tbl(struct bpf_cfg_in *cfg,
                             const struct bpf_cfg_ops *ops, void *nl,
                             const bool *opt_tbl)
 {
-       struct sock_filter opcodes[BPF_MAXINSNS];
        char annotation[256];
        int ret;
 
-       cfg->ops = opcodes;
        ret = bpf_parse(cfg, opt_tbl);
-       cfg->ops = NULL;
        if (ret < 0)
                return ret;
 
        if (cfg->mode == CBPF_BYTECODE || cfg->mode == CBPF_FILE)
-               ops->cbpf_cb(nl, opcodes, ret);
+               ops->cbpf_cb(nl, cfg->opcodes, ret);
        if (cfg->mode == EBPF_OBJECT || cfg->mode == EBPF_PINNED) {
                snprintf(annotation, sizeof(annotation), "%s:[%s]",
                         basename(cfg->object), cfg->mode == EBPF_PINNED ?
-- 
2.14.1

Reply via email to