From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.6 required=3.0 tests=DKIMWL_WL_MED,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_PASS,USER_AGENT_GIT,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id D90CAC43387 for ; Tue, 15 Jan 2019 23:23:01 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id A5C6020896 for ; Tue, 15 Jan 2019 23:23:01 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="DPxQnY/1" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2391402AbfAOXXA (ORCPT ); Tue, 15 Jan 2019 18:23:00 -0500 Received: from mail-yw1-f74.google.com ([209.85.161.74]:36174 "EHLO mail-yw1-f74.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727036AbfAOXXA (ORCPT ); Tue, 15 Jan 2019 18:23:00 -0500 Received: by mail-yw1-f74.google.com with SMTP id y65so2174471ywy.3 for ; Tue, 15 Jan 2019 15:22:59 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=HnP3IdQxzRRdYogHgWfwN9IleP6Ih12/W9+NsubRwpo=; b=DPxQnY/1louMWvNfv3S2oJp9rHf2RSraMGyYw4SC3UkghzYkbj2/9WrO0SJ8DQlR9X 1i8BK8kZZ69e8W10gdqQEA9MR4acNHWwXFtYyqwQ6+L3s1t17qU93CSGjc+QTITDF4O0 WdZYG/rBKlclA6784btCtl3mubWi68BGVW6h3XaRQcga0wStx9yiW3KNXEyBkHKA9V/8 EQ5KgRrOdu4IHYlHsBFgCihdHx8zk/dHXBW8syKEy15eq9+kQ5uuozPzi+cKa9nMmYD+ 3BFAZ+UEHcmJHFE/0Ic79G0vyYQ/WBaxJ6HFYovr6cCcH6KrW5AJNxtk0nt4NeCTtGIN dZAg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=HnP3IdQxzRRdYogHgWfwN9IleP6Ih12/W9+NsubRwpo=; b=bFwTqRIo2Lz0YTAbOhMPWpFiVrv7aU8JfzOG1HzebeQfdwFy9T3h8Hr9hPhoQsxSAG 2Zz4reA0iZLOaSebVt0Jg2Vy7cvhhvI8KcTQgaBAxolRN+tAVCwcSGFfYYI/yIpnc6jV VE9jYarNrNVVklfSERrXBs63a0abreL317hRNHdhQSI+sZhFTsMAAnW6QVifuAmqRwQB Xaoc/oYcCL+oSFZ4hWFo1R5UZs8SD3WhWsXPhtX8iTsHVuZfVUB2RMTPPH1S6SHoZ4od hQUi6YxrRMvkYDXKK0cpTM/kpothusBDlh5c4xJ9BJnEjSWRt4jCTGrKWnc5NrY3tPmk zUAg== X-Gm-Message-State: AJcUukfNXCjvYFoueMQfYBjt+FPvuC8elcx0ed6KnvJbgWI4s1bw5RzS RJLQ3rdTS9X1E052d+d1TdmpQMIF8VX39NyLK8/O9HKXYHndL1Mz+B2ytwQm40XeX2gbyHJ/cxp 71JTRRgJYfPvHs29ANx2E18Bjqt61UbYDyMy2TYPN4vXH4+RrLUhOhA== X-Google-Smtp-Source: ALg8bN6zrHzHaEPMOekwJtdnsm/m8fsdbcdgUhWR2XkR9SOu+h7Szzxtx8usXMzQ1FjhHS2Gv05QySE= X-Received: by 2002:a25:2596:: with SMTP id l144mr2735440ybl.26.1547594579237; Tue, 15 Jan 2019 15:22:59 -0800 (PST) Date: Tue, 15 Jan 2019 15:22:47 -0800 In-Reply-To: <20190115232252.5736-1-sdf@google.com> Message-Id: <20190115232252.5736-2-sdf@google.com> Mime-Version: 1.0 References: <20190115232252.5736-1-sdf@google.com> X-Mailer: git-send-email 2.20.1.97.g81188d93c3-goog Subject: [PATCH bpf-next 1/6] bpftool: make key and value optional in update command From: Stanislav Fomichev To: netdev@vger.kernel.org Cc: davem@davemloft.net, ast@kernel.org, daniel@iogearbox.net, jakub.kicinski@netronome.com, quentin.monnet@netronome.com, Stanislav Fomichev Content-Type: text/plain; charset="UTF-8" Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org 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 --- .../bpf/bpftool/Documentation/bpftool-map.rst | 4 +-- tools/bpf/bpftool/map.c | 36 +++++++++++++++---- 2 files changed, 31 insertions(+), 9 deletions(-) diff --git a/tools/bpf/bpftool/Documentation/bpftool-map.rst b/tools/bpf/bpftool/Documentation/bpftool-map.rst index 64b001b4f777..1f1dfe06e66d 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..61453a1ba6e1 100644 --- a/tools/bpf/bpftool/map.c +++ b/tools/bpf/bpftool/map.c @@ -779,6 +779,32 @@ static int do_dump(int argc, char **argv) return err; } +static int alloc_key_value(struct bpf_map_info *info, void **key, void **value) +{ + *key = NULL; + *value = NULL; + + if (info->key_size) { + *key = malloc(info->key_size); + if (!*key) { + p_err("key mem alloc failed"); + return -1; + } + } + + if (info->value_size) { + *value = alloc_value(info); + if (!*value) { + p_err("value mem alloc failed"); + free(*key); + *key = NULL; + return -1; + } + } + + return 0; +} + static int do_update(int argc, char **argv) { struct bpf_map_info info = {}; @@ -795,13 +821,9 @@ static int do_update(int argc, char **argv) if (fd < 0) return -1; - key = malloc(info.key_size); - value = alloc_value(&info); - if (!key || !value) { - p_err("mem alloc failed"); - err = -1; + err = alloc_key_value(&info, &key, &value); + if (err) goto exit_free; - } err = parse_elem(argv, &info, key, value, info.key_size, info.value_size, &flags, &value_fd); @@ -1135,7 +1157,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.97.g81188d93c3-goog