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 C4688C43387 for ; Wed, 16 Jan 2019 19:10:13 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 8B1E820840 for ; Wed, 16 Jan 2019 19:10:13 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="txE8mUIj" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730223AbfAPTKM (ORCPT ); Wed, 16 Jan 2019 14:10:12 -0500 Received: from mail-qt1-f202.google.com ([209.85.160.202]:52828 "EHLO mail-qt1-f202.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730036AbfAPTKM (ORCPT ); Wed, 16 Jan 2019 14:10:12 -0500 Received: by mail-qt1-f202.google.com with SMTP id w15so6611393qtk.19 for ; Wed, 16 Jan 2019 11:10:11 -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=txE8mUIjfqYZ6tck6DsYHr8FWNVZtz4hYwCz/YUrr+YRKZnNepDBzLfaYvxwH1dpBv RV0v6RQMPm2AHfJ9gzu3/Z6wyynRlLojleJGevQPDf1HC+GAeS7L15iQNFlNGIQvXOQL Q+nCivwXwAa3OhG1u3L7bPgnv5XFvQIAnu3ACx7l2r8oQiHb7amwlufcITIxLHQfC43g IowgpHE7WiD03tuRj0Ga7hqmoqWvRXw0+fQwDSKhXisqS90qV0hRMISELgd8ni5v8x3X 8Ig2OKRmH2i3oeEl/Z37lSobjBh9BuhEchjCfkjv2Q/+lowKn6WfvdDTyaNyT1m2eZ/i D3sA== 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=P617qevQSrjWBsrJkdExAENiiXRJNscauIavgVSb0NZWoC0MXXz8HYF7gvZs0/rKu8 YlKeCK8nDWuCtJMyYQIEyZjP6Kx+eBUdRR86equQFisfuEhNO6mG0c5ACEXMZhB5cAVI L3L6WyQ/Hxm5q+V9W1LADxih29GjjkwlB3tzw9BNCtHLuzO0FwHegoaadgN4Vt3IlNNm L2VidDpLgfcV/wXpTEMYoiXp9c+FGVlIexczYaWnhgCaWYTOsQVLY5aGssgqvFUUb66D kyycbmYfHmNQ1FJweA1gFxSH6XCpBsUFN4CchIuWgTNPLXeh4LXBkBRz6LE2eExT0jBy qU4g== X-Gm-Message-State: AJcUukctXILX44swYH2DBPKcSftz47B/xlF6wYYDDYOyXOlIjYFMbE+7 cE4eAp1onwrkkzmoiEyL33zyZ5qXskqyPQvRAWZs5Ldcz9beX3CtGzL6ejJFC/x9JcrfCBhKSt9 dcAX32y9kHL/SwfUf6ciiOf+HaCjjpjFqZ2B/NnP73HJDedPljJqIzg== X-Google-Smtp-Source: ALg8bN72fzjEjwQaJoTKP3KJDshEsz3X+neBJjtsy5VdfnlkdsYPLiB+Ys5fWWHx/SD3fi+mlGSwEKY= X-Received: by 2002:a0c:9219:: with SMTP id a25mr5754785qva.39.1547665810875; Wed, 16 Jan 2019 11:10:10 -0800 (PST) Date: Wed, 16 Jan 2019 11:09:59 -0800 In-Reply-To: <20190116191005.164355-1-sdf@google.com> Message-Id: <20190116191005.164355-2-sdf@google.com> Mime-Version: 1.0 References: <20190116191005.164355-1-sdf@google.com> X-Mailer: git-send-email 2.20.1.97.g81188d93c3-goog Subject: [PATCH bpf-next v2 1/7] 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