mirror of
https://github.com/netdata/libbpf.git
synced 2026-04-05 08:09:07 +08:00
libbpf: Pass number of prog load attempts explicitly
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
This commit is contained in:
committed by
Andrii Nakryiko
parent
ea6c242fc6
commit
6b2db898cc
15
src/bpf.c
15
src/bpf.c
@@ -74,14 +74,15 @@ static inline int sys_bpf_fd(enum bpf_cmd cmd, union bpf_attr *attr,
|
|||||||
return ensure_good_fd(fd);
|
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;
|
int fd;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
fd = sys_bpf_fd(BPF_PROG_LOAD, attr, size);
|
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;
|
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,
|
memcpy(attr.prog_name, load_attr->name,
|
||||||
min(strlen(load_attr->name), (size_t)BPF_OBJ_NAME_LEN - 1));
|
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)
|
if (fd >= 0)
|
||||||
return fd;
|
return fd;
|
||||||
|
|
||||||
@@ -345,7 +346,7 @@ int libbpf__bpf_prog_load(const struct bpf_prog_load_params *load_attr)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
fd = sys_bpf_prog_load(&attr, sizeof(attr));
|
fd = sys_bpf_prog_load(&attr, sizeof(attr), PROG_LOAD_ATTEMPTS);
|
||||||
if (fd >= 0)
|
if (fd >= 0)
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
@@ -359,7 +360,7 @@ int libbpf__bpf_prog_load(const struct bpf_prog_load_params *load_attr)
|
|||||||
attr.log_level = 1;
|
attr.log_level = 1;
|
||||||
load_attr->log_buf[0] = 0;
|
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:
|
done:
|
||||||
/* free() doesn't affect errno, so we don't need to restore it */
|
/* free() doesn't affect errno, so we don't need to restore it */
|
||||||
free(finfo);
|
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.kern_version = kern_version;
|
||||||
attr.prog_flags = prog_flags;
|
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);
|
return libbpf_err_errno(fd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user