bpftool: add pinmaps argument to the load/loadall
authorStanislav Fomichev <sdf@google.com>
Fri, 9 Nov 2018 16:21:45 +0000 (08:21 -0800)
committerAlexei Starovoitov <ast@kernel.org>
Sat, 10 Nov 2018 23:56:11 +0000 (15:56 -0800)
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>
tools/bpf/bpftool/Documentation/bpftool-prog.rst
tools/bpf/bpftool/bash-completion/bpftool
tools/bpf/bpftool/prog.c

index 984d125c507af11865a9fde1325a1fcbfee3fbdb..15e9172f7e55d015a96028a02504a83141c368c4 100644 (file)
@@ -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
index 780ebafb756a5bf0f4037ab39a1ec66e77af0e7b..a05d0071f39f19417e6a491b94788b73785fc1e7 100644 (file)
@@ -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
index 97d930042cd5414c144d3889c53a05fbeee87122..c2ce4220bbca073cb59f193c75803493c332dfc9 100644 (file)
@@ -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"