OSDN Git Service

libbpf: Pass number of prog load attempts explicitly
authorAndrii Nakryiko <andrii@kernel.org>
Wed, 3 Nov 2021 22:08:35 +0000 (15:08 -0700)
committerAlexei Starovoitov <ast@kernel.org>
Sun, 7 Nov 2021 16:34:23 +0000 (08:34 -0800)
Allow to control number of BPF_PROG_LOAD attempts from outside the
sys_bpf_prog_load() helper.

Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Acked-by: Dave Marchevsky <davemarchevsky@fb.com>
Link: https://lore.kernel.org/bpf/20211103220845.2676888-3-andrii@kernel.org
tools/lib/bpf/bpf.c

index c09cbb8..8e6a23c 100644 (file)
@@ -74,14 +74,15 @@ static inline int sys_bpf_fd(enum bpf_cmd cmd, union bpf_attr *attr,
        return ensure_good_fd(fd);
 }
 
-static inline int sys_bpf_prog_load(union bpf_attr *attr, unsigned int size)
+#define PROG_LOAD_ATTEMPTS 5
+
+static inline int sys_bpf_prog_load(union bpf_attr *attr, unsigned int size, int attempts)
 {
-       int retries = 5;
        int fd;
 
        do {
                fd = sys_bpf_fd(BPF_PROG_LOAD, attr, size);
-       } while (fd < 0 && errno == EAGAIN && retries-- > 0);
+       } while (fd < 0 && errno == EAGAIN && --attempts > 0);
 
        return fd;
 }
@@ -304,7 +305,7 @@ int libbpf__bpf_prog_load(const struct bpf_prog_load_params *load_attr)
                memcpy(attr.prog_name, load_attr->name,
                       min(strlen(load_attr->name), (size_t)BPF_OBJ_NAME_LEN - 1));
 
-       fd = sys_bpf_prog_load(&attr, sizeof(attr));
+       fd = sys_bpf_prog_load(&attr, sizeof(attr), PROG_LOAD_ATTEMPTS);
        if (fd >= 0)
                return fd;
 
@@ -345,7 +346,7 @@ int libbpf__bpf_prog_load(const struct bpf_prog_load_params *load_attr)
                        break;
                }
 
-               fd = sys_bpf_prog_load(&attr, sizeof(attr));
+               fd = sys_bpf_prog_load(&attr, sizeof(attr), PROG_LOAD_ATTEMPTS);
                if (fd >= 0)
                        goto done;
        }
@@ -359,7 +360,7 @@ int libbpf__bpf_prog_load(const struct bpf_prog_load_params *load_attr)
        attr.log_level = 1;
        load_attr->log_buf[0] = 0;
 
-       fd = sys_bpf_prog_load(&attr, sizeof(attr));
+       fd = sys_bpf_prog_load(&attr, sizeof(attr), PROG_LOAD_ATTEMPTS);
 done:
        /* free() doesn't affect errno, so we don't need to restore it */
        free(finfo);
@@ -449,7 +450,7 @@ int bpf_verify_program(enum bpf_prog_type type, const struct bpf_insn *insns,
        attr.kern_version = kern_version;
        attr.prog_flags = prog_flags;
 
-       fd = sys_bpf_prog_load(&attr, sizeof(attr));
+       fd = sys_bpf_prog_load(&attr, sizeof(attr), PROG_LOAD_ATTEMPTS);
        return libbpf_err_errno(fd);
 }