diff mbox series

[iproute2/master,03/11] bpf: allocate opcode table in struct bpf_cfg_in

Message ID 20171124021208.13419-4-jakub.kicinski@netronome.com
State Accepted, archived
Delegated to: stephen hemminger
Headers show
Series bpf: pass ifindex for bpf offload | expand

Commit Message

Jakub Kicinski Nov. 24, 2017, 2:12 a.m. UTC
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.kicinski@netronome.com>
Reviewed-by: Quentin Monnet <quentin.monnet@netronome.com>
Acked-by: Daniel Borkmann <daniel@iogearbox.net>
---
 include/bpf_util.h | 2 +-
 lib/bpf.c          | 7 ++-----
 2 files changed, 3 insertions(+), 6 deletions(-)
diff mbox series

Patch

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 ?