summaryrefslogtreecommitdiffstats
path: root/tools/bpf
diff options
context:
space:
mode:
authorQuentin Monnet <quentin@isovalent.com>2023-04-05 14:21:17 +0100
committerAlexei Starovoitov <ast@kernel.org>2023-04-05 21:27:27 -0700
commit05a06be722896e51f65dbbb6a3610f85a8353d6b (patch)
treee4fb1ce5ea872be023e7a1d04be49d68c6238f53 /tools/bpf
parent9fd496848b1c4cd04fee5f152bb7bcec11e1b901 (diff)
downloadlinux-stable-05a06be722896e51f65dbbb6a3610f85a8353d6b.tar.gz
linux-stable-05a06be722896e51f65dbbb6a3610f85a8353d6b.tar.bz2
linux-stable-05a06be722896e51f65dbbb6a3610f85a8353d6b.zip
bpftool: Return an error on prog dumps if both CFG and JSON are required
We do not support JSON output for control flow graphs of programs with bpftool. So far, requiring both the CFG and JSON output would result in producing a null JSON object. It makes more sense to raise an error directly when parsing command line arguments and options, so that users know they won't get any output they might expect. If JSON is required for the graph, we leave it to Graphviz instead: # bpftool prog dump xlated <REF> visual | dot -Tjson Suggested-by: Eduard Zingerman <eddyz87@gmail.com> Signed-off-by: Quentin Monnet <quentin@isovalent.com> Link: https://lore.kernel.org/r/20230405132120.59886-5-quentin@isovalent.com Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Diffstat (limited to 'tools/bpf')
-rw-r--r--tools/bpf/bpftool/bash-completion/bpftool9
-rw-r--r--tools/bpf/bpftool/prog.c8
2 files changed, 11 insertions, 6 deletions
diff --git a/tools/bpf/bpftool/bash-completion/bpftool b/tools/bpf/bpftool/bash-completion/bpftool
index 35f26f7c1124..a3cb07172789 100644
--- a/tools/bpf/bpftool/bash-completion/bpftool
+++ b/tools/bpf/bpftool/bash-completion/bpftool
@@ -255,16 +255,19 @@ _bpftool_map_update_get_name()
_bpftool()
{
- local cur prev words objword
+ local cur prev words objword json=0
_init_completion || return
# Deal with options
if [[ ${words[cword]} == -* ]]; then
local c='--version --json --pretty --bpffs --mapcompat --debug \
- --use-loader --base-btf'
+ --use-loader --base-btf'
COMPREPLY=( $( compgen -W "$c" -- "$cur" ) )
return 0
fi
+ if _bpftool_search_list -j --json -p --pretty; then
+ json=1
+ fi
# Deal with simplest keywords
case $prev in
@@ -367,7 +370,7 @@ _bpftool()
;;
*)
_bpftool_once_attr 'file'
- if _bpftool_search_list 'xlated'; then
+ if _bpftool_search_list 'xlated' && [[ "$json" == 0 ]]; then
COMPREPLY+=( $( compgen -W 'opcodes visual linum' -- \
"$cur" ) )
else
diff --git a/tools/bpf/bpftool/prog.c b/tools/bpf/bpftool/prog.c
index d855118f0d96..736defc6e5d0 100644
--- a/tools/bpf/bpftool/prog.c
+++ b/tools/bpf/bpftool/prog.c
@@ -849,9 +849,7 @@ prog_dump(struct bpf_prog_info *info, enum dump_mode mode,
dd.finfo_rec_size = info->func_info_rec_size;
dd.prog_linfo = prog_linfo;
- if (json_output && visual)
- jsonw_null(json_wtr);
- else if (json_output)
+ if (json_output)
dump_xlated_json(&dd, buf, member_len, opcodes, linum);
else if (visual)
dump_xlated_cfg(&dd, buf, member_len);
@@ -940,6 +938,10 @@ static int do_dump(int argc, char **argv)
usage();
goto exit_close;
}
+ if (json_output && visual) {
+ p_err("'visual' is not compatible with JSON output");
+ goto exit_close;
+ }
if (json_output && nb_fds > 1)
jsonw_start_array(json_wtr); /* root array */