mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 08:38:45 +02:00 
			
		
		
		
	bpftool: add pinmaps argument to the load/loadall
This new additional argument lets users pin all maps from the object at specified path. Signed-off-by: Stanislav Fomichev <sdf@google.com> Acked-by: Jakub Kicinski <jakub.kicinski@netronome.com> Signed-off-by: Alexei Starovoitov <ast@kernel.org>
This commit is contained in:
		
							parent
							
								
									77380998d9
								
							
						
					
					
						commit
						3767a94b32
					
				
					 3 changed files with 28 additions and 3 deletions
				
			
		|  | @ -80,7 +80,7 @@ DESCRIPTION | |||
| 		  contain a dot character ('.'), which is reserved for future | ||||
| 		  extensions of *bpffs*. | ||||
| 
 | ||||
| 	**bpftool prog { load | loadall }** *OBJ* *PATH* [**type** *TYPE*] [**map** {**idx** *IDX* | **name** *NAME*} *MAP*] [**dev** *NAME*] | ||||
| 	**bpftool prog { load | loadall }** *OBJ* *PATH* [**type** *TYPE*] [**map** {**idx** *IDX* | **name** *NAME*} *MAP*] [**dev** *NAME*] [**pinmaps** *MAP_DIR*] | ||||
| 		  Load bpf program(s) from binary *OBJ* and pin as *PATH*. | ||||
| 		  **bpftool prog load** pins only the first program from the | ||||
| 		  *OBJ* as *PATH*. **bpftool prog loadall** pins all programs | ||||
|  | @ -96,6 +96,8 @@ DESCRIPTION | |||
| 		  use, referring to it by **id** or through a **pinned** file. | ||||
| 		  If **dev** *NAME* is specified program will be loaded onto | ||||
| 		  given networking device (offload). | ||||
| 		  Optional **pinmaps** argument can be provided to pin all | ||||
| 		  maps under *MAP_DIR* directory. | ||||
| 
 | ||||
| 		  Note: *PATH* must be located in *bpffs* mount. It must not | ||||
| 		  contain a dot character ('.'), which is reserved for future | ||||
|  |  | |||
|  | @ -346,7 +346,7 @@ _bpftool() | |||
|                             _bpftool_get_map_ids | ||||
|                             return 0 | ||||
|                             ;; | ||||
|                         pinned) | ||||
|                         pinned|pinmaps) | ||||
|                             _filedir | ||||
|                             return 0 | ||||
|                             ;; | ||||
|  | @ -358,6 +358,7 @@ _bpftool() | |||
|                             COMPREPLY=( $( compgen -W "map" -- "$cur" ) ) | ||||
|                             _bpftool_once_attr 'type' | ||||
|                             _bpftool_once_attr 'dev' | ||||
|                             _bpftool_once_attr 'pinmaps' | ||||
|                             return 0 | ||||
|                             ;; | ||||
|                     esac | ||||
|  |  | |||
|  | @ -802,6 +802,7 @@ static int load_with_options(int argc, char **argv, bool first_prog_only) | |||
| 	struct map_replace *map_replace = NULL; | ||||
| 	struct bpf_program *prog = NULL, *pos; | ||||
| 	unsigned int old_map_fds = 0; | ||||
| 	const char *pinmaps = NULL; | ||||
| 	struct bpf_object *obj; | ||||
| 	struct bpf_map *map; | ||||
| 	const char *pinfile; | ||||
|  | @ -906,6 +907,13 @@ static int load_with_options(int argc, char **argv, bool first_prog_only) | |||
| 				goto err_free_reuse_maps; | ||||
| 			} | ||||
| 			NEXT_ARG(); | ||||
| 		} else if (is_prefix(*argv, "pinmaps")) { | ||||
| 			NEXT_ARG(); | ||||
| 
 | ||||
| 			if (!REQ_ARGS(1)) | ||||
| 				goto err_free_reuse_maps; | ||||
| 
 | ||||
| 			pinmaps = GET_ARG(); | ||||
| 		} else { | ||||
| 			p_err("expected no more arguments, 'type', 'map' or 'dev', got: '%s'?", | ||||
| 			      *argv); | ||||
|  | @ -1028,6 +1036,14 @@ static int load_with_options(int argc, char **argv, bool first_prog_only) | |||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if (pinmaps) { | ||||
| 		err = bpf_object__pin_maps(obj, pinmaps); | ||||
| 		if (err) { | ||||
| 			p_err("failed to pin all maps"); | ||||
| 			goto err_unpin; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if (json_output) | ||||
| 		jsonw_null(json_wtr); | ||||
| 
 | ||||
|  | @ -1038,6 +1054,11 @@ static int load_with_options(int argc, char **argv, bool first_prog_only) | |||
| 
 | ||||
| 	return 0; | ||||
| 
 | ||||
| err_unpin: | ||||
| 	if (first_prog_only) | ||||
| 		unlink(pinfile); | ||||
| 	else | ||||
| 		bpf_object__unpin_programs(obj, pinfile); | ||||
| err_close_obj: | ||||
| 	bpf_object__close(obj); | ||||
| err_free_reuse_maps: | ||||
|  | @ -1071,7 +1092,8 @@ static int do_help(int argc, char **argv) | |||
| 		"       %s %s pin   PROG FILE\n" | ||||
| 		"       %s %s { load | loadall } OBJ  PATH \\\n" | ||||
| 		"                         [type TYPE] [dev NAME] \\\n" | ||||
| 		"                         [map { idx IDX | name NAME } MAP]\n" | ||||
| 		"                         [map { idx IDX | name NAME } MAP]\\\n" | ||||
| 		"                         [pinmaps MAP_DIR]\n" | ||||
| 		"       %s %s attach PROG ATTACH_TYPE MAP\n" | ||||
| 		"       %s %s detach PROG ATTACH_TYPE MAP\n" | ||||
| 		"       %s %s help\n" | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Stanislav Fomichev
						Stanislav Fomichev