aboutsummaryrefslogtreecommitdiffstats
path: root/tools/bpf/bpftool/prog.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/bpf/bpftool/prog.c')
-rw-r--r--tools/bpf/bpftool/prog.c27
1 files changed, 17 insertions, 10 deletions
diff --git a/tools/bpf/bpftool/prog.c b/tools/bpf/bpftool/prog.c
index 26336bad0442..1f209c80d906 100644
--- a/tools/bpf/bpftool/prog.c
+++ b/tools/bpf/bpftool/prog.c
@@ -750,10 +750,11 @@ static int do_detach(int argc, char **argv)
750 750
751static int load_with_options(int argc, char **argv, bool first_prog_only) 751static int load_with_options(int argc, char **argv, bool first_prog_only)
752{ 752{
753 enum bpf_attach_type expected_attach_type; 753 struct bpf_object_load_attr load_attr = { 0 };
754 struct bpf_object_open_attr attr = { 754 struct bpf_object_open_attr open_attr = {
755 .prog_type = BPF_PROG_TYPE_UNSPEC, 755 .prog_type = BPF_PROG_TYPE_UNSPEC,
756 }; 756 };
757 enum bpf_attach_type expected_attach_type;
757 struct map_replace *map_replace = NULL; 758 struct map_replace *map_replace = NULL;
758 struct bpf_program *prog = NULL, *pos; 759 struct bpf_program *prog = NULL, *pos;
759 unsigned int old_map_fds = 0; 760 unsigned int old_map_fds = 0;
@@ -767,7 +768,7 @@ static int load_with_options(int argc, char **argv, bool first_prog_only)
767 768
768 if (!REQ_ARGS(2)) 769 if (!REQ_ARGS(2))
769 return -1; 770 return -1;
770 attr.file = GET_ARG(); 771 open_attr.file = GET_ARG();
771 pinfile = GET_ARG(); 772 pinfile = GET_ARG();
772 773
773 while (argc) { 774 while (argc) {
@@ -776,7 +777,7 @@ static int load_with_options(int argc, char **argv, bool first_prog_only)
776 777
777 NEXT_ARG(); 778 NEXT_ARG();
778 779
779 if (attr.prog_type != BPF_PROG_TYPE_UNSPEC) { 780 if (open_attr.prog_type != BPF_PROG_TYPE_UNSPEC) {
780 p_err("program type already specified"); 781 p_err("program type already specified");
781 goto err_free_reuse_maps; 782 goto err_free_reuse_maps;
782 } 783 }
@@ -793,7 +794,8 @@ static int load_with_options(int argc, char **argv, bool first_prog_only)
793 strcat(type, *argv); 794 strcat(type, *argv);
794 strcat(type, "/"); 795 strcat(type, "/");
795 796
796 err = libbpf_prog_type_by_name(type, &attr.prog_type, 797 err = libbpf_prog_type_by_name(type,
798 &open_attr.prog_type,
797 &expected_attach_type); 799 &expected_attach_type);
798 free(type); 800 free(type);
799 if (err < 0) 801 if (err < 0)
@@ -881,16 +883,16 @@ static int load_with_options(int argc, char **argv, bool first_prog_only)
881 883
882 set_max_rlimit(); 884 set_max_rlimit();
883 885
884 obj = __bpf_object__open_xattr(&attr, bpf_flags); 886 obj = __bpf_object__open_xattr(&open_attr, bpf_flags);
885 if (IS_ERR_OR_NULL(obj)) { 887 if (IS_ERR_OR_NULL(obj)) {
886 p_err("failed to open object file"); 888 p_err("failed to open object file");
887 goto err_free_reuse_maps; 889 goto err_free_reuse_maps;
888 } 890 }
889 891
890 bpf_object__for_each_program(pos, obj) { 892 bpf_object__for_each_program(pos, obj) {
891 enum bpf_prog_type prog_type = attr.prog_type; 893 enum bpf_prog_type prog_type = open_attr.prog_type;
892 894
893 if (attr.prog_type == BPF_PROG_TYPE_UNSPEC) { 895 if (open_attr.prog_type == BPF_PROG_TYPE_UNSPEC) {
894 const char *sec_name = bpf_program__title(pos, false); 896 const char *sec_name = bpf_program__title(pos, false);
895 897
896 err = libbpf_prog_type_by_name(sec_name, &prog_type, 898 err = libbpf_prog_type_by_name(sec_name, &prog_type,
@@ -960,7 +962,12 @@ static int load_with_options(int argc, char **argv, bool first_prog_only)
960 goto err_close_obj; 962 goto err_close_obj;
961 } 963 }
962 964
963 err = bpf_object__load(obj); 965 load_attr.obj = obj;
966 if (verifier_logs)
967 /* log_level1 + log_level2 + stats, but not stable UAPI */
968 load_attr.log_level = 1 + 2 + 4;
969
970 err = bpf_object__load_xattr(&load_attr);
964 if (err) { 971 if (err) {
965 p_err("failed to load object file"); 972 p_err("failed to load object file");
966 goto err_close_obj; 973 goto err_close_obj;