[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20171124021208.13419-4-jakub.kicinski@netronome.com>
Date: Thu, 23 Nov 2017 18:12:00 -0800
From: Jakub Kicinski <jakub.kicinski@...ronome.com>
To: netdev@...r.kernel.org
Cc: oss-drivers@...ronome.com, daniel@...earbox.net,
Jakub Kicinski <jakub.kicinski@...ronome.com>
Subject: [PATCH iproute2/master 03/11] bpf: allocate opcode table in struct bpf_cfg_in
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@...ronome.com>
Reviewed-by: Quentin Monnet <quentin.monnet@...ronome.com>
Acked-by: Daniel Borkmann <daniel@...earbox.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
Powered by blists - more mailing lists