libbpf doesn't allow passing "prog_flags" during bpf program load in a
couple of load related APIs, "bpf_load_program_xattr", "load_program" and
"bpf_prog_load_xattr".

It makes sense to allow passing "prog_flags" which is useful for
customizing program loading.

Reviewed-by: Jakub Kicinski <jakub.kicin...@netronome.com>
Signed-off-by: Jiong Wang <jiong.w...@netronome.com>
---
 tools/lib/bpf/bpf.c    | 1 +
 tools/lib/bpf/bpf.h    | 1 +
 tools/lib/bpf/libbpf.c | 3 +++
 tools/lib/bpf/libbpf.h | 1 +
 4 files changed, 6 insertions(+)

diff --git a/tools/lib/bpf/bpf.c b/tools/lib/bpf/bpf.c
index 955191c..f79ec49 100644
--- a/tools/lib/bpf/bpf.c
+++ b/tools/lib/bpf/bpf.c
@@ -254,6 +254,7 @@ int bpf_load_program_xattr(const struct 
bpf_load_program_attr *load_attr,
        if (load_attr->name)
                memcpy(attr.prog_name, load_attr->name,
                       min(strlen(load_attr->name), BPF_OBJ_NAME_LEN - 1));
+       attr.prog_flags = load_attr->prog_flags;
 
        fd = sys_bpf_prog_load(&attr, sizeof(attr));
        if (fd >= 0)
diff --git a/tools/lib/bpf/bpf.h b/tools/lib/bpf/bpf.h
index bc30783..a983442 100644
--- a/tools/lib/bpf/bpf.h
+++ b/tools/lib/bpf/bpf.h
@@ -86,6 +86,7 @@ struct bpf_load_program_attr {
        const void *line_info;
        __u32 line_info_cnt;
        __u32 log_level;
+       __u32 prog_flags;
 };
 
 /* Flags to direct loading requirements */
diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c
index e5b77ad..e0affd0 100644
--- a/tools/lib/bpf/libbpf.c
+++ b/tools/lib/bpf/libbpf.c
@@ -182,6 +182,7 @@ struct bpf_program {
        void *line_info;
        __u32 line_info_rec_size;
        __u32 line_info_cnt;
+       __u32 prog_flags;
 };
 
 enum libbpf_map_type {
@@ -1876,6 +1877,7 @@ load_program(struct bpf_program *prog, struct bpf_insn 
*insns, int insns_cnt,
        load_attr.line_info_rec_size = prog->line_info_rec_size;
        load_attr.line_info_cnt = prog->line_info_cnt;
        load_attr.log_level = prog->log_level;
+       load_attr.prog_flags = prog->prog_flags;
        if (!load_attr.insns || !load_attr.insns_cnt)
                return -EINVAL;
 
@@ -3320,6 +3322,7 @@ int bpf_prog_load_xattr(const struct bpf_prog_load_attr 
*attr,
                                                      expected_attach_type);
 
                prog->log_level = attr->log_level;
+               prog->prog_flags = attr->prog_flags;
                if (!first_prog)
                        first_prog = prog;
        }
diff --git a/tools/lib/bpf/libbpf.h b/tools/lib/bpf/libbpf.h
index c5ff005..5abc237 100644
--- a/tools/lib/bpf/libbpf.h
+++ b/tools/lib/bpf/libbpf.h
@@ -320,6 +320,7 @@ struct bpf_prog_load_attr {
        enum bpf_attach_type expected_attach_type;
        int ifindex;
        int log_level;
+       int prog_flags;
 };
 
 LIBBPF_API int bpf_prog_load_xattr(const struct bpf_prog_load_attr *attr,
-- 
2.7.4

Reply via email to