diff --git a/src/bpffeature.cpp b/src/bpffeature.cpp index 6dc471f9153c..540f2307cfec 100644 --- a/src/bpffeature.cpp +++ b/src/bpffeature.cpp @@ -358,6 +358,12 @@ bool BPFfeature::has_kprobe_multi() if (has_kprobe_multi_.has_value()) return *has_kprobe_multi_; + if (disable_feature_.find("kprobe_multi") != std::string::npos) + { + has_kprobe_multi_ = false; + return *has_kprobe_multi_; + } + const char* sym = "ksys_read"; DECLARE_LIBBPF_OPTS(bpf_link_create_opts, link_opts); int progfd, linkfd = -1; @@ -413,6 +419,12 @@ bool BPFfeature::has_uprobe_multi() if (has_uprobe_multi_.has_value()) return *has_uprobe_multi_; + if (disable_feature_.find("uprobe_multi") != std::string::npos) + { + has_uprobe_multi_ = false; + return *has_uprobe_multi_; + } + LIBBPF_OPTS(bpf_prog_load_opts, load_opts, .expected_attach_type = static_cast( diff --git a/src/bpffeature.h b/src/bpffeature.h index efd43c01d1c8..afdb8343e630 100644 --- a/src/bpffeature.h +++ b/src/bpffeature.h @@ -57,6 +57,7 @@ public: \ class BPFfeature { public: + BPFfeature(std::string disable_feature) : disable_feature_(disable_feature) { } BPFfeature() = default; virtual ~BPFfeature() = default; @@ -142,6 +143,8 @@ class BPFfeature int* outfd = nullptr); BTF btf_ = BTF({ "vmlinux" }); + + std::string disable_feature_; }; #undef DEFINE_PROG_TEST diff --git a/src/bpftrace.h b/src/bpftrace.h index c96b31d870ba..82d02bba4b99 100644 --- a/src/bpftrace.h +++ b/src/bpftrace.h @@ -93,9 +93,9 @@ class WildcardException : public std::exception class BPFtrace { public: - BPFtrace(std::unique_ptr o = std::make_unique(std::cout)) + BPFtrace(std::unique_ptr o = std::make_unique(std::cout), std::string disable_feature = "") : out_(std::move(o)), - feature_(std::make_unique()), + feature_(std::make_unique(disable_feature)), probe_matcher_(std::make_unique(this)), ncpus_(get_possible_cpus().size()) { diff --git a/src/main.cpp b/src/main.cpp index bf4920dd0b93..95ec0c4a3561 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -75,6 +75,7 @@ enum Options INCLUDE, EMIT_ELF, EMIT_LLVM, + DISABLE_FEATURE, }; } // namespace @@ -499,6 +500,7 @@ struct Args std::string output_elf; std::string output_llvm; std::string aot; + std::string disable_feature; OutputBufferConfig obc = OutputBufferConfig::UNSET; BuildMode build_mode = BuildMode::DYNAMIC; std::vector include_dirs; @@ -525,6 +527,7 @@ Args parse_args(int argc, char* argv[]) option{ "no-warnings", no_argument, nullptr, Options::NO_WARNING }, option{ "test", required_argument, nullptr, Options::TEST }, option{ "aot", required_argument, nullptr, Options::AOT }, + option{ "disable-feature", required_argument, nullptr, Options::DISABLE_FEATURE }, option{ nullptr, 0, nullptr, 0 }, // Must be last }; @@ -564,6 +567,9 @@ Args parse_args(int argc, char* argv[]) args.aot = optarg; args.build_mode = BuildMode::AHEAD_OF_TIME; break; + case Options::DISABLE_FEATURE: // --disable-feature + args.disable_feature = optarg; + break; case 'o': args.output_file = optarg; break; @@ -797,7 +803,7 @@ int main(int argc, char* argv[]) libbpf_set_print(libbpf_print); - BPFtrace bpftrace(std::move(output)); + BPFtrace bpftrace(std::move(output), args.disable_feature); bool verify_llvm_ir = false; if (!args.cmd_str.empty())