libbpf: add bpf_object__load_xattr() API function to pass log_level
libbpf was recently made aware of the log_level attribute for programs, used to specify the level of information expected to be dumped by the verifier. Function bpf_prog_load_xattr() got support for this log_level parameter. But some applications using libbpf rely on another function to load programs, bpf_object__load(), which does accept any parameter for log level. Create an API function based on bpf_object__load(), but accepting an "attr" object as a parameter. Then add a log_level field to that object, so that applications calling the new bpf_object__load_xattr() can pick the desired log level. v3: - Rewrite commit log. v2: - We are in a new cycle, bump libbpf extraversion number. Signed-off-by: Quentin Monnet <quentin.monnet@netronome.com> Reviewed-by: Jakub Kicinski <jakub.kicinski@netronome.com> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
This commit is contained in:
parent
775bc8ada8
commit
60276f9849
@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
BPF_VERSION = 0
|
BPF_VERSION = 0
|
||||||
BPF_PATCHLEVEL = 0
|
BPF_PATCHLEVEL = 0
|
||||||
BPF_EXTRAVERSION = 3
|
BPF_EXTRAVERSION = 4
|
||||||
|
|
||||||
MAKEFLAGS += --no-print-directory
|
MAKEFLAGS += --no-print-directory
|
||||||
|
|
||||||
|
@ -2224,7 +2224,7 @@ static bool bpf_program__is_function_storage(struct bpf_program *prog,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
bpf_object__load_progs(struct bpf_object *obj)
|
bpf_object__load_progs(struct bpf_object *obj, int log_level)
|
||||||
{
|
{
|
||||||
size_t i;
|
size_t i;
|
||||||
int err;
|
int err;
|
||||||
@ -2232,6 +2232,7 @@ bpf_object__load_progs(struct bpf_object *obj)
|
|||||||
for (i = 0; i < obj->nr_programs; i++) {
|
for (i = 0; i < obj->nr_programs; i++) {
|
||||||
if (bpf_program__is_function_storage(&obj->programs[i], obj))
|
if (bpf_program__is_function_storage(&obj->programs[i], obj))
|
||||||
continue;
|
continue;
|
||||||
|
obj->programs[i].log_level = log_level;
|
||||||
err = bpf_program__load(&obj->programs[i],
|
err = bpf_program__load(&obj->programs[i],
|
||||||
obj->license,
|
obj->license,
|
||||||
obj->kern_version);
|
obj->kern_version);
|
||||||
@ -2383,10 +2384,14 @@ int bpf_object__unload(struct bpf_object *obj)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int bpf_object__load(struct bpf_object *obj)
|
int bpf_object__load_xattr(struct bpf_object_load_attr *attr)
|
||||||
{
|
{
|
||||||
|
struct bpf_object *obj;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
|
if (!attr)
|
||||||
|
return -EINVAL;
|
||||||
|
obj = attr->obj;
|
||||||
if (!obj)
|
if (!obj)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
@ -2399,7 +2404,7 @@ int bpf_object__load(struct bpf_object *obj)
|
|||||||
|
|
||||||
CHECK_ERR(bpf_object__create_maps(obj), err, out);
|
CHECK_ERR(bpf_object__create_maps(obj), err, out);
|
||||||
CHECK_ERR(bpf_object__relocate(obj), err, out);
|
CHECK_ERR(bpf_object__relocate(obj), err, out);
|
||||||
CHECK_ERR(bpf_object__load_progs(obj), err, out);
|
CHECK_ERR(bpf_object__load_progs(obj, attr->log_level), err, out);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
out:
|
out:
|
||||||
@ -2408,6 +2413,15 @@ out:
|
|||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int bpf_object__load(struct bpf_object *obj)
|
||||||
|
{
|
||||||
|
struct bpf_object_load_attr attr = {
|
||||||
|
.obj = obj,
|
||||||
|
};
|
||||||
|
|
||||||
|
return bpf_object__load_xattr(&attr);
|
||||||
|
}
|
||||||
|
|
||||||
static int check_path(const char *path)
|
static int check_path(const char *path)
|
||||||
{
|
{
|
||||||
char *cp, errmsg[STRERR_BUFSIZE];
|
char *cp, errmsg[STRERR_BUFSIZE];
|
||||||
|
@ -89,8 +89,14 @@ LIBBPF_API int bpf_object__unpin_programs(struct bpf_object *obj,
|
|||||||
LIBBPF_API int bpf_object__pin(struct bpf_object *object, const char *path);
|
LIBBPF_API int bpf_object__pin(struct bpf_object *object, const char *path);
|
||||||
LIBBPF_API void bpf_object__close(struct bpf_object *object);
|
LIBBPF_API void bpf_object__close(struct bpf_object *object);
|
||||||
|
|
||||||
|
struct bpf_object_load_attr {
|
||||||
|
struct bpf_object *obj;
|
||||||
|
int log_level;
|
||||||
|
};
|
||||||
|
|
||||||
/* Load/unload object into/from kernel */
|
/* Load/unload object into/from kernel */
|
||||||
LIBBPF_API int bpf_object__load(struct bpf_object *obj);
|
LIBBPF_API int bpf_object__load(struct bpf_object *obj);
|
||||||
|
LIBBPF_API int bpf_object__load_xattr(struct bpf_object_load_attr *attr);
|
||||||
LIBBPF_API int bpf_object__unload(struct bpf_object *obj);
|
LIBBPF_API int bpf_object__unload(struct bpf_object *obj);
|
||||||
LIBBPF_API const char *bpf_object__name(struct bpf_object *obj);
|
LIBBPF_API const char *bpf_object__name(struct bpf_object *obj);
|
||||||
LIBBPF_API unsigned int bpf_object__kversion(struct bpf_object *obj);
|
LIBBPF_API unsigned int bpf_object__kversion(struct bpf_object *obj);
|
||||||
|
@ -171,4 +171,5 @@ LIBBPF_0.0.4 {
|
|||||||
btf_dump__free;
|
btf_dump__free;
|
||||||
btf_dump__new;
|
btf_dump__new;
|
||||||
btf__parse_elf;
|
btf__parse_elf;
|
||||||
|
bpf_object__load_xattr;
|
||||||
} LIBBPF_0.0.3;
|
} LIBBPF_0.0.3;
|
||||||
|
Loading…
Reference in New Issue
Block a user