Bpftool expects both key and value for 'update' operations. For some
map types, key should not be specified. Support updating those map types.

Before:
bpftool map create /sys/fs/bpf/q type queue value 4 entries 10 name q
bpftool map update pinned /sys/fs/bpf/q value 0 1 2 3
Error: did not find key

After:
bpftool map create /sys/fs/bpf/q type queue value 4 entries 10 name q
bpftool map update pinned /sys/fs/bpf/q value 0 1 2 3

Signed-off-by: Stanislav Fomichev <s...@google.com>
---
 tools/bpf/bpftool/Documentation/bpftool-map.rst |  4 ++--
 tools/bpf/bpftool/map.c                         | 15 +++++++++++----
 2 files changed, 13 insertions(+), 6 deletions(-)

diff --git a/tools/bpf/bpftool/Documentation/bpftool-map.rst 
b/tools/bpf/bpftool/Documentation/bpftool-map.rst
index 64b001b4f777..81842fdf483d 100644
--- a/tools/bpf/bpftool/Documentation/bpftool-map.rst
+++ b/tools/bpf/bpftool/Documentation/bpftool-map.rst
@@ -25,7 +25,7 @@ MAP COMMANDS
 |      **bpftool** **map create**     *FILE* **type** *TYPE* **key** 
*KEY_SIZE* **value** *VALUE_SIZE* \
 |              **entries** *MAX_ENTRIES* **name** *NAME* [**flags** *FLAGS*] 
[**dev** *NAME*]
 |      **bpftool** **map dump**       *MAP*
-|      **bpftool** **map update**     *MAP*  **key** *DATA*   **value** 
*VALUE* [*UPDATE_FLAGS*]
+|      **bpftool** **map update**     *MAP* [**key** *DATA*]  **value** 
*VALUE* [*UPDATE_FLAGS*]
 |      **bpftool** **map lookup**     *MAP*  **key** *DATA*
 |      **bpftool** **map getnext**    *MAP* [**key** *DATA*]
 |      **bpftool** **map delete**     *MAP*  **key** *DATA*
@@ -62,7 +62,7 @@ DESCRIPTION
        **bpftool map dump**    *MAP*
                  Dump all entries in a given *MAP*.
 
-       **bpftool map update**  *MAP*  **key** *DATA*   **value** *VALUE* 
[*UPDATE_FLAGS*]
+       **bpftool map update**  *MAP* [**key** *DATA*]  **value** *VALUE* 
[*UPDATE_FLAGS*]
                  Update map entry for a given *KEY*.
 
                  *UPDATE_FLAGS* can be one of: **any** update existing entry
diff --git a/tools/bpf/bpftool/map.c b/tools/bpf/bpftool/map.c
index 2037e3dc864b..30b92715248d 100644
--- a/tools/bpf/bpftool/map.c
+++ b/tools/bpf/bpftool/map.c
@@ -781,11 +781,11 @@ static int do_dump(int argc, char **argv)
 
 static int do_update(int argc, char **argv)
 {
+       void *key = NULL, *value = NULL;
        struct bpf_map_info info = {};
        __u32 len = sizeof(info);
        __u32 *value_fd = NULL;
        __u32 flags = BPF_ANY;
-       void *key, *value;
        int fd, err;
 
        if (argc < 2)
@@ -795,9 +795,16 @@ static int do_update(int argc, char **argv)
        if (fd < 0)
                return -1;
 
-       key = malloc(info.key_size);
+       if (info.key_size) {
+               key = malloc(info.key_size);
+               if (!key) {
+                       p_err("mem alloc failed");
+                       err = -1;
+                       goto exit_free;
+               }
+       }
        value = alloc_value(&info);
-       if (!key || !value) {
+       if (!value) {
                p_err("mem alloc failed");
                err = -1;
                goto exit_free;
@@ -1135,7 +1142,7 @@ static int do_help(int argc, char **argv)
                "                              entries MAX_ENTRIES name NAME 
[flags FLAGS] \\\n"
                "                              [dev NAME]\n"
                "       %s %s dump       MAP\n"
-               "       %s %s update     MAP  key DATA value VALUE 
[UPDATE_FLAGS]\n"
+               "       %s %s update     MAP [key DATA] value VALUE 
[UPDATE_FLAGS]\n"
                "       %s %s lookup     MAP  key DATA\n"
                "       %s %s getnext    MAP [key DATA]\n"
                "       %s %s delete     MAP  key DATA\n"
-- 
2.20.1.415.g653613c723-goog

Reply via email to