From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jiong Wang Subject: [RFC bpf-next 06/10] bpf: cfg: move find_subprog/add_subprog to cfg.c Date: Mon, 7 May 2018 06:22:42 -0400 Message-ID: <1525688567-19618-7-git-send-email-jiong.wang@netronome.com> References: <1525688567-19618-1-git-send-email-jiong.wang@netronome.com> Cc: john.fastabend@gmail.com, netdev@vger.kernel.org, oss-drivers@netronome.com, Jiong Wang To: alexei.starovoitov@gmail.com, daniel@iogearbox.net Return-path: Received: from mail-wm0-f65.google.com ([74.125.82.65]:53847 "EHLO mail-wm0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752051AbeEGKXL (ORCPT ); Mon, 7 May 2018 06:23:11 -0400 Received: by mail-wm0-f65.google.com with SMTP id a67so12477254wmf.3 for ; Mon, 07 May 2018 03:23:11 -0700 (PDT) In-Reply-To: <1525688567-19618-1-git-send-email-jiong.wang@netronome.com> Sender: netdev-owner@vger.kernel.org List-ID: This patch centre find_subprog and add_subprog to cfg.c. Signed-off-by: Jiong Wang --- kernel/bpf/cfg.c | 41 +++++++++++++++++++++++++++++++++++++++++ kernel/bpf/cfg.h | 2 ++ kernel/bpf/verifier.c | 42 ------------------------------------------ 3 files changed, 43 insertions(+), 42 deletions(-) diff --git a/kernel/bpf/cfg.c b/kernel/bpf/cfg.c index 7ce1472..a34a95c 100644 --- a/kernel/bpf/cfg.c +++ b/kernel/bpf/cfg.c @@ -6,8 +6,10 @@ */ #include +#include #include #include +#include #include "cfg.h" @@ -611,6 +613,45 @@ bool subprog_has_loop(struct bpf_subprog_info *subprog) return false; } +static int cmp_subprogs(const void *a, const void *b) +{ + return ((struct bpf_subprog_info *)a)->start - + ((struct bpf_subprog_info *)b)->start; +} + +int find_subprog(struct bpf_verifier_env *env, int off) +{ + struct bpf_subprog_info *p; + + p = bsearch(&off, env->subprog_info, env->subprog_cnt, + sizeof(env->subprog_info[0]), cmp_subprogs); + if (!p) + return -ENOENT; + return p - env->subprog_info; +} + +int add_subprog(struct bpf_verifier_env *env, int off) +{ + int insn_cnt = env->prog->len; + int ret; + + if (off >= insn_cnt || off < 0) { + bpf_verifier_log_write(env, "call to invalid destination\n"); + return -EINVAL; + } + ret = find_subprog(env, off); + if (ret >= 0) + return 0; + if (env->subprog_cnt >= BPF_MAX_SUBPROGS) { + bpf_verifier_log_write(env, "too many subprograms\n"); + return -E2BIG; + } + env->subprog_info[env->subprog_cnt++].start = off; + sort(env->subprog_info, env->subprog_cnt, + sizeof(env->subprog_info[0]), cmp_subprogs, NULL); + return 0; +} + static void subprog_free_edge(struct bb_node *bb) { struct list_head *succs = &bb->e_succs; diff --git a/kernel/bpf/cfg.h b/kernel/bpf/cfg.h index 02729a9..57eab9b 100644 --- a/kernel/bpf/cfg.h +++ b/kernel/bpf/cfg.h @@ -8,6 +8,8 @@ #ifndef __BPF_CFG_H__ #define __BPF_CFG_H__ +int add_subprog(struct bpf_verifier_env *env, int off); +int find_subprog(struct bpf_verifier_env *env, int off); int subprog_add_bb_edges(struct bpf_insn *insns, struct list_head *bb_list); int subprog_append_bb(struct list_head *bb_list, int head); int subprog_build_dom_info(struct bpf_verifier_env *env, diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c index 46d5eae..72bda84 100644 --- a/kernel/bpf/verifier.c +++ b/kernel/bpf/verifier.c @@ -20,8 +20,6 @@ #include #include #include -#include -#include #include "cfg.h" #include "disasm.h" @@ -737,46 +735,6 @@ enum reg_arg_type { DST_OP_NO_MARK /* same as above, check only, don't mark */ }; -static int cmp_subprogs(const void *a, const void *b) -{ - return ((struct bpf_subprog_info *)a)->start - - ((struct bpf_subprog_info *)b)->start; -} - -static int find_subprog(struct bpf_verifier_env *env, int off) -{ - struct bpf_subprog_info *p; - - p = bsearch(&off, env->subprog_info, env->subprog_cnt, - sizeof(env->subprog_info[0]), cmp_subprogs); - if (!p) - return -ENOENT; - return p - env->subprog_info; - -} - -static int add_subprog(struct bpf_verifier_env *env, int off) -{ - int insn_cnt = env->prog->len; - int ret; - - if (off >= insn_cnt || off < 0) { - verbose(env, "call to invalid destination\n"); - return -EINVAL; - } - ret = find_subprog(env, off); - if (ret >= 0) - return 0; - if (env->subprog_cnt >= BPF_MAX_SUBPROGS) { - verbose(env, "too many subprograms\n"); - return -E2BIG; - } - env->subprog_info[env->subprog_cnt++].start = off; - sort(env->subprog_info, env->subprog_cnt, - sizeof(env->subprog_info[0]), cmp_subprogs, NULL); - return 0; -} - static int check_subprogs(struct bpf_verifier_env *env) { int i, ret, subprog_start, subprog_end, off, cur_subprog = 0; -- 2.7.4