forked from mirrors/linux
		
	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
 | 
							  contain a dot character ('.'), which is reserved for future
 | 
				
			||||||
		  extensions of *bpffs*.
 | 
							  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*.
 | 
							  Load bpf program(s) from binary *OBJ* and pin as *PATH*.
 | 
				
			||||||
		  **bpftool prog load** pins only the first program from the
 | 
							  **bpftool prog load** pins only the first program from the
 | 
				
			||||||
		  *OBJ* as *PATH*. **bpftool prog loadall** pins all programs
 | 
							  *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.
 | 
							  use, referring to it by **id** or through a **pinned** file.
 | 
				
			||||||
		  If **dev** *NAME* is specified program will be loaded onto
 | 
							  If **dev** *NAME* is specified program will be loaded onto
 | 
				
			||||||
		  given networking device (offload).
 | 
							  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
 | 
							  Note: *PATH* must be located in *bpffs* mount. It must not
 | 
				
			||||||
		  contain a dot character ('.'), which is reserved for future
 | 
							  contain a dot character ('.'), which is reserved for future
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -346,7 +346,7 @@ _bpftool()
 | 
				
			||||||
                            _bpftool_get_map_ids
 | 
					                            _bpftool_get_map_ids
 | 
				
			||||||
                            return 0
 | 
					                            return 0
 | 
				
			||||||
                            ;;
 | 
					                            ;;
 | 
				
			||||||
                        pinned)
 | 
					                        pinned|pinmaps)
 | 
				
			||||||
                            _filedir
 | 
					                            _filedir
 | 
				
			||||||
                            return 0
 | 
					                            return 0
 | 
				
			||||||
                            ;;
 | 
					                            ;;
 | 
				
			||||||
| 
						 | 
					@ -358,6 +358,7 @@ _bpftool()
 | 
				
			||||||
                            COMPREPLY=( $( compgen -W "map" -- "$cur" ) )
 | 
					                            COMPREPLY=( $( compgen -W "map" -- "$cur" ) )
 | 
				
			||||||
                            _bpftool_once_attr 'type'
 | 
					                            _bpftool_once_attr 'type'
 | 
				
			||||||
                            _bpftool_once_attr 'dev'
 | 
					                            _bpftool_once_attr 'dev'
 | 
				
			||||||
 | 
					                            _bpftool_once_attr 'pinmaps'
 | 
				
			||||||
                            return 0
 | 
					                            return 0
 | 
				
			||||||
                            ;;
 | 
					                            ;;
 | 
				
			||||||
                    esac
 | 
					                    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 map_replace *map_replace = NULL;
 | 
				
			||||||
	struct bpf_program *prog = NULL, *pos;
 | 
						struct bpf_program *prog = NULL, *pos;
 | 
				
			||||||
	unsigned int old_map_fds = 0;
 | 
						unsigned int old_map_fds = 0;
 | 
				
			||||||
 | 
						const char *pinmaps = NULL;
 | 
				
			||||||
	struct bpf_object *obj;
 | 
						struct bpf_object *obj;
 | 
				
			||||||
	struct bpf_map *map;
 | 
						struct bpf_map *map;
 | 
				
			||||||
	const char *pinfile;
 | 
						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;
 | 
									goto err_free_reuse_maps;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			NEXT_ARG();
 | 
								NEXT_ARG();
 | 
				
			||||||
 | 
							} else if (is_prefix(*argv, "pinmaps")) {
 | 
				
			||||||
 | 
								NEXT_ARG();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (!REQ_ARGS(1))
 | 
				
			||||||
 | 
									goto err_free_reuse_maps;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								pinmaps = GET_ARG();
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			p_err("expected no more arguments, 'type', 'map' or 'dev', got: '%s'?",
 | 
								p_err("expected no more arguments, 'type', 'map' or 'dev', got: '%s'?",
 | 
				
			||||||
			      *argv);
 | 
								      *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)
 | 
						if (json_output)
 | 
				
			||||||
		jsonw_null(json_wtr);
 | 
							jsonw_null(json_wtr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1038,6 +1054,11 @@ static int load_with_options(int argc, char **argv, bool first_prog_only)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					err_unpin:
 | 
				
			||||||
 | 
						if (first_prog_only)
 | 
				
			||||||
 | 
							unlink(pinfile);
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							bpf_object__unpin_programs(obj, pinfile);
 | 
				
			||||||
err_close_obj:
 | 
					err_close_obj:
 | 
				
			||||||
	bpf_object__close(obj);
 | 
						bpf_object__close(obj);
 | 
				
			||||||
err_free_reuse_maps:
 | 
					err_free_reuse_maps:
 | 
				
			||||||
| 
						 | 
					@ -1071,7 +1092,8 @@ static int do_help(int argc, char **argv)
 | 
				
			||||||
		"       %s %s pin   PROG FILE\n"
 | 
							"       %s %s pin   PROG FILE\n"
 | 
				
			||||||
		"       %s %s { load | loadall } OBJ  PATH \\\n"
 | 
							"       %s %s { load | loadall } OBJ  PATH \\\n"
 | 
				
			||||||
		"                         [type TYPE] [dev NAME] \\\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 attach PROG ATTACH_TYPE MAP\n"
 | 
				
			||||||
		"       %s %s detach PROG ATTACH_TYPE MAP\n"
 | 
							"       %s %s detach PROG ATTACH_TYPE MAP\n"
 | 
				
			||||||
		"       %s %s help\n"
 | 
							"       %s %s help\n"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue