Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c034a177 authored by John Fastabend's avatar John Fastabend Committed by Alexei Starovoitov
Browse files

bpf: bpftool, add flag to allow non-compat map definitions



Multiple map definition structures exist and user may have non-zero
fields in their definition that are not recognized by bpftool and
libbpf. The normal behavior is to then fail loading the map. Although
this is a good default behavior users may still want to load the map
for debugging or other reasons. This patch adds a --mapcompat flag
that can be used to override the default behavior and allow loading
the map even when it has additional non-zero fields.

For now the only user is 'bpftool prog' we can switch over other
subcommands as needed. The library exposes an API that consumes
a flags field now but I kept the original API around also in case
users of the API don't want to expose this. The flags field is an
int in case we need more control over how the API call handles
errors/features/etc in the future.

Signed-off-by: default avatarJohn Fastabend <john.fastabend@gmail.com>
Acked-by: default avatarJakub Kicinski <jakub.kicinski@netronome.com>
Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
parent b7d3826c
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -57,6 +57,10 @@ OPTIONS
	-p, --pretty
		  Generate human-readable JSON output. Implies **-j**.

	-m, --mapcompat
		  Allow loading maps with unknown map definitions.


SEE ALSO
========
	**bpftool-map**\ (8), **bpftool-prog**\ (8), **bpftool-cgroup**\ (8)
+1 −1
Original line number Diff line number Diff line
@@ -184,7 +184,7 @@ _bpftool()

    # Deal with options
    if [[ ${words[cword]} == -* ]]; then
        local c='--version --json --pretty --bpffs'
        local c='--version --json --pretty --bpffs --mapcompat'
        COMPREPLY=( $( compgen -W "$c" -- "$cur" ) )
        return 0
    fi
+6 −1
Original line number Diff line number Diff line
@@ -55,6 +55,7 @@ json_writer_t *json_wtr;
bool pretty_output;
bool json_output;
bool show_pinned;
int bpf_flags;
struct pinned_obj_table prog_table;
struct pinned_obj_table map_table;

@@ -341,6 +342,7 @@ int main(int argc, char **argv)
		{ "pretty",	no_argument,	NULL,	'p' },
		{ "version",	no_argument,	NULL,	'V' },
		{ "bpffs",	no_argument,	NULL,	'f' },
		{ "mapcompat",	no_argument,	NULL,	'm' },
		{ 0 }
	};
	int opt, ret;
@@ -355,7 +357,7 @@ int main(int argc, char **argv)
	hash_init(map_table.table);

	opterr = 0;
	while ((opt = getopt_long(argc, argv, "Vhpjf",
	while ((opt = getopt_long(argc, argv, "Vhpjfm",
				  options, NULL)) >= 0) {
		switch (opt) {
		case 'V':
@@ -379,6 +381,9 @@ int main(int argc, char **argv)
		case 'f':
			show_pinned = true;
			break;
		case 'm':
			bpf_flags = MAPS_RELAX_COMPAT;
			break;
		default:
			p_err("unrecognized option '%s'", argv[optind - 1]);
			if (json_output)
+2 −1
Original line number Diff line number Diff line
@@ -74,7 +74,7 @@
#define HELP_SPEC_PROGRAM						\
	"PROG := { id PROG_ID | pinned FILE | tag PROG_TAG }"
#define HELP_SPEC_OPTIONS						\
	"OPTIONS := { {-j|--json} [{-p|--pretty}] | {-f|--bpffs} }"
	"OPTIONS := { {-j|--json} [{-p|--pretty}] | {-f|--bpffs} | {-m|--mapcompat}"
#define HELP_SPEC_MAP							\
	"MAP := { id MAP_ID | pinned FILE }"

@@ -89,6 +89,7 @@ extern const char *bin_name;
extern json_writer_t *json_wtr;
extern bool json_output;
extern bool show_pinned;
extern int bpf_flags;
extern struct pinned_obj_table prog_table;
extern struct pinned_obj_table map_table;

+1 −1
Original line number Diff line number Diff line
@@ -908,7 +908,7 @@ static int do_load(int argc, char **argv)
		}
	}

	obj = bpf_object__open_xattr(&attr);
	obj = __bpf_object__open_xattr(&attr, bpf_flags);
	if (IS_ERR_OR_NULL(obj)) {
		p_err("failed to open object file");
		goto err_free_reuse_maps;
Loading