bpf: Use bpf_load_program() from the library
authorMickaël Salaün <mic@digikod.net>
Thu, 9 Feb 2017 23:21:38 +0000 (00:21 +0100)
committerDavid S. Miller <davem@davemloft.net>
Fri, 10 Feb 2017 20:56:06 +0000 (15:56 -0500)
Replace bpf_prog_load() with bpf_load_program() calls.

Signed-off-by: Mickaël Salaün <mic@digikod.net>
Cc: Alexei Starovoitov <ast@fb.com>
Cc: Daniel Borkmann <daniel@iogearbox.net>
Cc: Shuah Khan <shuah@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
tools/lib/bpf/bpf.c
tools/lib/bpf/bpf.h
tools/testing/selftests/bpf/Makefile
tools/testing/selftests/bpf/bpf_sys.h
tools/testing/selftests/bpf/test_tag.c
tools/testing/selftests/bpf/test_verifier.c

index 3ddb58a36d3c2534ce6207581a4fee1730c6e6a0..58ce252073faa754f2566e115e10d2e1a78f8d66 100644 (file)
@@ -42,7 +42,7 @@
 # endif
 #endif
 
-static __u64 ptr_to_u64(void *ptr)
+static __u64 ptr_to_u64(const void *ptr)
 {
        return (__u64) (unsigned long) ptr;
 }
@@ -69,8 +69,8 @@ int bpf_create_map(enum bpf_map_type map_type, int key_size,
        return sys_bpf(BPF_MAP_CREATE, &attr, sizeof(attr));
 }
 
-int bpf_load_program(enum bpf_prog_type type, struct bpf_insn *insns,
-                    size_t insns_cnt, char *license,
+int bpf_load_program(enum bpf_prog_type type, const struct bpf_insn *insns,
+                    size_t insns_cnt, const char *license,
                     __u32 kern_version, char *log_buf, size_t log_buf_sz)
 {
        int fd;
index a2f9853dd88259d810e6506ec5ac48d863bc074b..bc959a2de0234b5ac8f41b2a9257f792db5bad83 100644 (file)
@@ -28,8 +28,8 @@ int bpf_create_map(enum bpf_map_type map_type, int key_size, int value_size,
 
 /* Recommend log buffer size */
 #define BPF_LOG_BUF_SIZE 65536
-int bpf_load_program(enum bpf_prog_type type, struct bpf_insn *insns,
-                    size_t insns_cnt, char *license,
+int bpf_load_program(enum bpf_prog_type type, const struct bpf_insn *insns,
+                    size_t insns_cnt, const char *license,
                     __u32 kern_version, char *log_buf,
                     size_t log_buf_sz);
 
index f3d65ad53494e4dc5432cc22cbbd0a060cefb541..a35f564f66a10d96c536754642dc97de5d49eb3b 100644 (file)
@@ -1,4 +1,4 @@
-CFLAGS += -Wall -O2 -lcap -I../../../include/uapi
+CFLAGS += -Wall -O2 -lcap -I../../../include/uapi -I../../../lib
 
 test_objs = test_verifier test_tag test_maps test_lru_map test_lpm_map
 
@@ -7,6 +7,8 @@ TEST_FILES := $(test_objs)
 
 all: $(test_objs)
 
+$(test_objs): ../../../lib/bpf/bpf.o
+
 include ../lib.mk
 
 clean:
index 6b4565f2a3f250febf3ecee0a872b43e8c6753ed..e7bbe3e5402e398706fd14411a1cf4e3f78dec7e 100644 (file)
@@ -84,25 +84,4 @@ static inline int bpf_map_create(enum bpf_map_type type, uint32_t size_key,
        return bpf(BPF_MAP_CREATE, &attr, sizeof(attr));
 }
 
-static inline int bpf_prog_load(enum bpf_prog_type type,
-                               const struct bpf_insn *insns, size_t size_insns,
-                               const char *license, char *log, size_t size_log)
-{
-       union bpf_attr attr = {};
-
-       attr.prog_type = type;
-       attr.insns = bpf_ptr_to_u64(insns);
-       attr.insn_cnt = size_insns / sizeof(struct bpf_insn);
-       attr.license = bpf_ptr_to_u64(license);
-
-       if (size_log > 0) {
-               attr.log_buf = bpf_ptr_to_u64(log);
-               attr.log_size = size_log;
-               attr.log_level = 1;
-               log[0] = 0;
-       }
-
-       return bpf(BPF_PROG_LOAD, &attr, sizeof(attr));
-}
-
 #endif /* __BPF_SYS__ */
index 5f7c602f47d17b5c39f5ce97c6e6a1ddc2534f64..dc209721ffd5f45cf36298ea0d2ee81cd57ad974 100644 (file)
@@ -16,6 +16,8 @@
 #include <linux/bpf.h>
 #include <linux/if_alg.h>
 
+#include <bpf/bpf.h>
+
 #include "../../../include/linux/filter.h"
 
 #include "bpf_sys.h"
@@ -55,8 +57,8 @@ static int bpf_try_load_prog(int insns, int fd_map,
        int fd_prog;
 
        bpf_filler(insns, fd_map);
-       fd_prog = bpf_prog_load(BPF_PROG_TYPE_SCHED_CLS, prog, insns *
-                               sizeof(struct bpf_insn), "", NULL, 0);
+       fd_prog = bpf_load_program(BPF_PROG_TYPE_SCHED_CLS, prog, insns, "", 0,
+                                  NULL, 0);
        assert(fd_prog > 0);
        if (fd_map > 0)
                bpf_filler(insns, 0);
index 878bd60da376962ff448caedee44dd3acd9cd834..247830ecf68e0c5ffb7f798c8490c19fc8965575 100644 (file)
@@ -24,6 +24,8 @@
 #include <linux/bpf_perf_event.h>
 #include <linux/bpf.h>
 
+#include <bpf/bpf.h>
+
 #include "../../../include/linux/filter.h"
 
 #include "bpf_sys.h"
@@ -4535,9 +4537,9 @@ static void do_test_single(struct bpf_test *test, bool unpriv,
 
        do_test_fixup(test, prog, &fd_f1, &fd_f2, &fd_f3);
 
-       fd_prog = bpf_prog_load(prog_type ? : BPF_PROG_TYPE_SOCKET_FILTER,
-                               prog, prog_len * sizeof(struct bpf_insn),
-                               "GPL", bpf_vlog, sizeof(bpf_vlog));
+       fd_prog = bpf_load_program(prog_type ? : BPF_PROG_TYPE_SOCKET_FILTER,
+                                  prog, prog_len, "GPL", 0, bpf_vlog,
+                                  sizeof(bpf_vlog));
 
        expected_ret = unpriv && test->result_unpriv != UNDEF ?
                       test->result_unpriv : test->result;