From patchwork Wed Jan 16 19:09:59 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stanislav Fomichev X-Patchwork-Id: 1026128 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=google.com header.i=@google.com header.b="txE8mUIj"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43fxc54Rbsz9sD4 for ; Thu, 17 Jan 2019 06:10:13 +1100 (AEDT) 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 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" From patchwork Wed Jan 16 19:10:00 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stanislav Fomichev X-Patchwork-Id: 1026129 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=google.com header.i=@google.com header.b="Wuj0SIqD"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43fxc85HNbz9sD4 for ; Thu, 17 Jan 2019 06:10:16 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730236AbfAPTKP (ORCPT ); Wed, 16 Jan 2019 14:10:15 -0500 Received: from mail-yw1-f74.google.com ([209.85.161.74]:34360 "EHLO mail-yw1-f74.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730036AbfAPTKP (ORCPT ); Wed, 16 Jan 2019 14:10:15 -0500 Received: by mail-yw1-f74.google.com with SMTP id i2so3554994ywb.1 for ; Wed, 16 Jan 2019 11:10:14 -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=9b2Fb0a+6/g5BWAt6FeVPnh0E88TqgNa8+4JD52ycww=; b=Wuj0SIqDXJz2gNIaLWFo6jdbpdAeu+R7s3jLMRZxaSd8LZdKV179ytbzgcXA/gpCWg q1K/TNkGQ8lgTxPB5/Yenbh2gQJxQ5h6S6yCUMy45M7VdCLnztS6uKJdRjhNc5pgQNUr 7rkLX6hFEyAOtu4q2IA8SYxOrXW5pYAQOU2Lqs28Bf9csB+r85WUOUSyLDmT9YRduPxz eHAoSHrMJAZXhN1FRzYEN25A4Odf0NidpQG1beKYfXJMChThxdUC3BhKXPMGfH7C7DLE CnFAI10GE4nTg2lnjZgpf9A5Bm3evnGLlzIiWI/ZkyA66yCM1ih9mHUNKRO1fua5r9Re D6qg== 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=9b2Fb0a+6/g5BWAt6FeVPnh0E88TqgNa8+4JD52ycww=; b=jMU4ghaEFZo2wRQjTUdOMQLzqNB89Ni1FUliVbxcSpBZ/RthAzLOlwbfn9WgB5Y72u 9hg7x0dHnF3y2aWWBayYCSVhR0KlRulAg+Q4hWiI8WGjIBtJ5jOCnuKNoL6bLHVCv6Ir wZmJi8hhxv5PnqG3fYpzTNfM3UdgBtIlAaTX3RNnHMiL6pZEjZLQAH1qGxZpl8zVXqp6 YSdKy44k/Ua+0+hYRMn44T3eIY3yu+nhoGqZinEzkvYXh3n2Al/XNSllM42vHBUyWO5E FkfFIISzrWBr+LzOmZWbM490PmT9IQToTbGd9xffotflQoVc+OZr5fCkmfj5GBEmfQOe XBJg== X-Gm-Message-State: AJcUukdeEN5+QNmjwwZRceE5S7f0vQZB5KJQvl0zdnZjZy7ZXtGkdaGc MpiGdJPKZSsM10SbFSaPukV8IK83hBHWSDUmgrfCkRUrWZ1h0HMrKUdlQTi0m4rRQ79R9KxQQXD hPFPI45nk9kat1bjMY08wi0ctXDYGcJyDXy/ELi6Sbbcbu32pUDR75Q== X-Google-Smtp-Source: ALg8bN6uI6tQxGCMc2h/0n1WStbIGJG6v47DfurCt+76CdaWp2/EpJfz/xg0YD0GOZ04zFpKN9q3Ltg= X-Received: by 2002:a0d:ec8b:: with SMTP id v133mr4565441ywe.2.1547665813673; Wed, 16 Jan 2019 11:10:13 -0800 (PST) Date: Wed, 16 Jan 2019 11:10:00 -0800 In-Reply-To: <20190116191005.164355-1-sdf@google.com> Message-Id: <20190116191005.164355-3-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 2/7] bpftool: make key optional in lookup 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 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Bpftool expects key for 'lookup' operations. For some map types, key should not be specified. Support looking up 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 bpftool map lookup pinned /sys/fs/bpf/q 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 bpftool map lookup pinned /sys/fs/bpf/q key: value: 00 01 02 03 Signed-off-by: Stanislav Fomichev --- tools/bpf/bpftool/Documentation/bpftool-map.rst | 4 ++-- tools/bpf/bpftool/map.c | 10 +++------- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/tools/bpf/bpftool/Documentation/bpftool-map.rst b/tools/bpf/bpftool/Documentation/bpftool-map.rst index 1f1dfe06e66d..f34cace771bd 100644 --- a/tools/bpf/bpftool/Documentation/bpftool-map.rst +++ b/tools/bpf/bpftool/Documentation/bpftool-map.rst @@ -26,7 +26,7 @@ MAP COMMANDS | **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 lookup** *MAP* **key** *DATA* +| **bpftool** **map lookup** *MAP* [**key** *DATA*] | **bpftool** **map getnext** *MAP* [**key** *DATA*] | **bpftool** **map delete** *MAP* **key** *DATA* | **bpftool** **map pin** *MAP* *FILE* @@ -75,7 +75,7 @@ DESCRIPTION the bytes are parsed as decimal values, unless a "0x" prefix (for hexadecimal) or a "0" prefix (for octal) is provided. - **bpftool map lookup** *MAP* **key** *DATA* + **bpftool map lookup** *MAP* [**key** *DATA*] Lookup **key** in the map. **bpftool map getnext** *MAP* [**key** *DATA*] diff --git a/tools/bpf/bpftool/map.c b/tools/bpf/bpftool/map.c index 61453a1ba6e1..4256842f9664 100644 --- a/tools/bpf/bpftool/map.c +++ b/tools/bpf/bpftool/map.c @@ -865,13 +865,9 @@ static int do_lookup(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, NULL, info.key_size, 0, NULL, NULL); if (err) @@ -1158,7 +1154,7 @@ static int do_help(int argc, char **argv) " [dev NAME]\n" " %s %s dump MAP\n" " %s %s update MAP [key DATA] [value VALUE] [UPDATE_FLAGS]\n" - " %s %s lookup MAP key DATA\n" + " %s %s lookup MAP [key DATA]\n" " %s %s getnext MAP [key DATA]\n" " %s %s delete MAP key DATA\n" " %s %s pin MAP FILE\n" From patchwork Wed Jan 16 19:10:01 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stanislav Fomichev X-Patchwork-Id: 1026130 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=google.com header.i=@google.com header.b="PlDimB79"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43fxcC0xM2z9sD4 for ; Thu, 17 Jan 2019 06:10:19 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730249AbfAPTKS (ORCPT ); Wed, 16 Jan 2019 14:10:18 -0500 Received: from mail-pl1-f201.google.com ([209.85.214.201]:40616 "EHLO mail-pl1-f201.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730036AbfAPTKR (ORCPT ); Wed, 16 Jan 2019 14:10:17 -0500 Received: by mail-pl1-f201.google.com with SMTP id l9so4400443plt.7 for ; Wed, 16 Jan 2019 11:10:17 -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=mKso/xF4+cbOtsDisT4E8AJzKIZkeen6l+Y9XEEaqoc=; b=PlDimB79hTUthZx+qrvMilQ6DGa2AiAsSyq2hwwT6iNi+E5uRQiAL/eNSSDYIYkWhB pkyrv5q0UeXYE7bXJYQHHWhtuYxVKQSTvKx85p4zAOW/pX0O2gco6alr5Raq8nSDQAsX kV1YWXHCEbaK5PuUk5IizTHa8mg8DpVd4s1c55O7QovU4vo19k2+zUfR51i8uhkJS+TV yRVSNnhcS1thzkQAAdm1kGPpWMJYycNYiH7ZRK9oTXYy7bfSWo2IU6vKkZBExB3zcYtq q3Wks7Th2rTQoeoUfyA3p9iiBZyiKwg6GBxgfUynLUyUS5F3FSUgdT39mngdiy+0MdTC UcDQ== 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=mKso/xF4+cbOtsDisT4E8AJzKIZkeen6l+Y9XEEaqoc=; b=OodRtcHECSSnzYIvo9L2ROL3ATHJ+lLocc/woZSM8O18doPfxuy6DuqIra9T0/uxTR X3jEi0ozpspKUfShvKPDCD+HvzSjB4s6AZrl4FM8rwsBYZWxMJx+IWUcZRaYuLuz1JI/ SYnN01XoUV4pDQaEla7jEgAOxdzNnqty+didU8yjFu2TkV0v7T9S3M7PD4kvZb8oNslM dA04geK9ezkGc1DhCKHmhC7NsxTdZwkj0w3YgZyB8jnjTRTDwxA+38mfY2gBgpYkCNym NJp6eYVrfSS3z6Ufeh6FDLmTc8+rg0hJTQdXLwC7myFiuoYM1Wxymd+arV3kL7xsu8n2 ZzHQ== X-Gm-Message-State: AJcUukefyYNRmqaU0O9dLNTIZH6gnJNaUTIPxO+zg4mckd9N326FFD+v IaqIwookVVd+8Tmw6SvOLG25aM5Mkk8JlMxIJrG3nSfNP2vehiPt6+2+GaqnDdhQT94P4JVIcuS 5mq03dWzXXWVmpAp+HFrlf3uNukMo5dc2+dFO4qc3aHGkVMamjG5aaw== X-Google-Smtp-Source: ALg8bN44US/vh9SjwDRvL2wnozHpBoN7/tklwPjv1f6Fej1730qM4KMgClcB/CZpmI5+cUcXuK6oeVU= X-Received: by 2002:a17:902:ba90:: with SMTP id k16mr470072pls.141.1547665816386; Wed, 16 Jan 2019 11:10:16 -0800 (PST) Date: Wed, 16 Jan 2019 11:10:01 -0800 In-Reply-To: <20190116191005.164355-1-sdf@google.com> Message-Id: <20190116191005.164355-4-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 3/7] bpftool: don't print empty key/value for maps 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 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org When doing dump or lookup, don't print key if key_size == 0 or value if value_size == 0. The initial usecase is queue and stack, where we have only values. This is for regular output only, json still has all the fields. 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 bpftool map lookup pinned /sys/fs/bpf/q key: value: 00 01 02 03 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 bpftool map lookup pinned /sys/fs/bpf/q value: 00 01 02 03 Signed-off-by: Stanislav Fomichev --- tools/bpf/bpftool/map.c | 47 ++++++++++++++++++++++++----------------- 1 file changed, 28 insertions(+), 19 deletions(-) diff --git a/tools/bpf/bpftool/map.c b/tools/bpf/bpftool/map.c index 4256842f9664..3f599399913b 100644 --- a/tools/bpf/bpftool/map.c +++ b/tools/bpf/bpftool/map.c @@ -285,16 +285,21 @@ static void print_entry_plain(struct bpf_map_info *info, unsigned char *key, single_line = info->key_size + info->value_size <= 24 && !break_names; - printf("key:%c", break_names ? '\n' : ' '); - fprint_hex(stdout, key, info->key_size, " "); + if (info->key_size) { + printf("key:%c", break_names ? '\n' : ' '); + fprint_hex(stdout, key, info->key_size, " "); - printf(single_line ? " " : "\n"); + printf(single_line ? " " : "\n"); + } - printf("value:%c", break_names ? '\n' : ' '); - if (value) - fprint_hex(stdout, value, info->value_size, " "); - else - printf(""); + if (info->value_size) { + printf("value:%c", break_names ? '\n' : ' '); + if (value) + fprint_hex(stdout, value, info->value_size, + " "); + else + printf(""); + } printf("\n"); } else { @@ -303,19 +308,23 @@ static void print_entry_plain(struct bpf_map_info *info, unsigned char *key, n = get_possible_cpus(); step = round_up(info->value_size, 8); - printf("key:\n"); - fprint_hex(stdout, key, info->key_size, " "); - printf("\n"); - for (i = 0; i < n; i++) { - printf("value (CPU %02d):%c", - i, info->value_size > 16 ? '\n' : ' '); - if (value) - fprint_hex(stdout, value + i * step, - info->value_size, " "); - else - printf(""); + if (info->key_size) { + printf("key:\n"); + fprint_hex(stdout, key, info->key_size, " "); printf("\n"); } + if (info->value_size) { + for (i = 0; i < n; i++) { + printf("value (CPU %02d):%c", + i, info->value_size > 16 ? '\n' : ' '); + if (value) + fprint_hex(stdout, value + i * step, + info->value_size, " "); + else + printf(""); + printf("\n"); + } + } } } From patchwork Wed Jan 16 19:10:02 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stanislav Fomichev X-Patchwork-Id: 1026131 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=google.com header.i=@google.com header.b="nA20prlB"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43fxcG1N0tz9sD4 for ; Thu, 17 Jan 2019 06:10:22 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730263AbfAPTKV (ORCPT ); Wed, 16 Jan 2019 14:10:21 -0500 Received: from mail-pf1-f202.google.com ([209.85.210.202]:49466 "EHLO mail-pf1-f202.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730036AbfAPTKU (ORCPT ); Wed, 16 Jan 2019 14:10:20 -0500 Received: by mail-pf1-f202.google.com with SMTP id x67so5358937pfk.16 for ; Wed, 16 Jan 2019 11:10:19 -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=CnNLesP3ke3NN3GB2F8nbWuEwf9VJU9k0UtFbQPDvm8=; b=nA20prlB+48C8mbQyIk5MTErQhpELto/w/HDS8WodadPG3l76sWYdo9neT/WUWm3ji vqXvtfKHRboX6AqDXUQBXqcUVxayQvlFhZ7+AXgFsucAz3zrh0Q529D1E4b/2kbKu1KV HySL9DgNYkrRqyjdMHpY6EBRP1WeAOQXJEIvKGymM0T26IR9PLbTk1wd5Nd8/0dhFOhL ZMd8KOrHI7rnEUiZvTRHWedhwpjVe2MIwXpFT8T+nn808zWlvlBQv9/4eDAzY4+peLEn sQ8rGlq302xoYM/EqAssFfHqGduJbbz2hlicKi027GAqPagXfITu+yU6CiBZW3u4FjPi EdOw== 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=CnNLesP3ke3NN3GB2F8nbWuEwf9VJU9k0UtFbQPDvm8=; b=NP6u6u62W3rgRWs3PJn+MdRrxxzReU4arTlqAJ6uUdiHK0EAa+35MdRJC+IYcomc2u Y3dklR+ijJsriZKCmjDZsQ02utzPajuEEXDfyD4vOuRRLWnn4vLUr0rUIkvDk6wGbyTh yN+zjt/ILtZ4AJAy9QdzlZQmGffFHSMWEBUPhK6EeNS1n74AUkl0eNj/l/o2AcrW9B1k hUIRS3RuiYfpWDa6LCYB9TkYyvtun6bbT6uwkYCnWLKmYrmPRU1EcQQQ2MspBSctyZ+7 Yep/OhJjoNtbH5mKTC06Nd184ByLgXS5mFpCvcOmBu+9so3nwcA2wXd+NFqUBhUGYCAE Y9cQ== X-Gm-Message-State: AJcUukcdtUD226adHf4ZA0n4w/oZInQ5VNhxZxO7jaNb1a1qMYjXSAim dek37TnT2kbgi030UtSMGwGrujxharxH+eneZ4k/xWKzmq8kEZKviGj7+sGhxkh49TUnOefGmBO sgXldAgA8qJZt3+JbcajVgbWjHsZ7TA8c7R5snmuow2utg+OvEDezWg== X-Google-Smtp-Source: ALg8bN5QvH8bo95M818Lry9LgYrNQ5SOPNlw8cKsbPzfns9LnqRywPrVgQJ98Amr3a4SO8asQB36pXA= X-Received: by 2002:a17:902:59d9:: with SMTP id d25mr3250533plj.13.1547665819125; Wed, 16 Jan 2019 11:10:19 -0800 (PST) Date: Wed, 16 Jan 2019 11:10:02 -0800 In-Reply-To: <20190116191005.164355-1-sdf@google.com> Message-Id: <20190116191005.164355-5-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 4/7] bpftool: add peek 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 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org This is intended to be used with queues and stacks and be more user-friendly than 'lookup' without key/value. Example: 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 bpftool map peek pinned /sys/fs/bpf/q value: 00 01 02 03 Signed-off-by: Stanislav Fomichev --- tools/bpf/bpftool/Documentation/bpftool-map.rst | 4 ++++ tools/bpf/bpftool/map.c | 4 +++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/tools/bpf/bpftool/Documentation/bpftool-map.rst b/tools/bpf/bpftool/Documentation/bpftool-map.rst index f34cace771bd..b79da683da88 100644 --- a/tools/bpf/bpftool/Documentation/bpftool-map.rst +++ b/tools/bpf/bpftool/Documentation/bpftool-map.rst @@ -31,6 +31,7 @@ MAP COMMANDS | **bpftool** **map delete** *MAP* **key** *DATA* | **bpftool** **map pin** *MAP* *FILE* | **bpftool** **map event_pipe** *MAP* [**cpu** *N* **index** *M*] +| **bpftool** **map peek** *MAP* | **bpftool** **map help** | | *MAP* := { **id** *MAP_ID* | **pinned** *FILE* } @@ -107,6 +108,9 @@ DESCRIPTION replace any existing ring. Any other application will stop receiving events if it installed its rings earlier. + **bpftool map peek** *MAP* + Peek next **value** in the queue or stack. + **bpftool map help** Print short help message. diff --git a/tools/bpf/bpftool/map.c b/tools/bpf/bpftool/map.c index 3f599399913b..d7344fcd2089 100644 --- a/tools/bpf/bpftool/map.c +++ b/tools/bpf/bpftool/map.c @@ -1168,6 +1168,7 @@ static int do_help(int argc, char **argv) " %s %s delete MAP key DATA\n" " %s %s pin MAP FILE\n" " %s %s event_pipe MAP [cpu N index M]\n" + " %s %s peek MAP\n" " %s %s help\n" "\n" " " HELP_SPEC_MAP "\n" @@ -1185,7 +1186,7 @@ static int do_help(int argc, char **argv) bin_name, argv[-2], bin_name, argv[-2], bin_name, argv[-2], bin_name, argv[-2], bin_name, argv[-2], bin_name, argv[-2], bin_name, argv[-2], bin_name, argv[-2], bin_name, argv[-2], - bin_name, argv[-2]); + bin_name, argv[-2], bin_name, argv[-2]); return 0; } @@ -1202,6 +1203,7 @@ static const struct cmd cmds[] = { { "pin", do_pin }, { "event_pipe", do_event_pipe }, { "create", do_create }, + { "peek", do_lookup }, { 0 } }; From patchwork Wed Jan 16 19:10:03 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stanislav Fomichev X-Patchwork-Id: 1026132 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=google.com header.i=@google.com header.b="G6YrjAJc"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43fxcK1xhhz9sD4 for ; Thu, 17 Jan 2019 06:10:25 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730274AbfAPTKY (ORCPT ); Wed, 16 Jan 2019 14:10:24 -0500 Received: from mail-oi1-f201.google.com ([209.85.167.201]:46591 "EHLO mail-oi1-f201.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730036AbfAPTKW (ORCPT ); Wed, 16 Jan 2019 14:10:22 -0500 Received: by mail-oi1-f201.google.com with SMTP id k76so2127004oih.13 for ; Wed, 16 Jan 2019 11:10:22 -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=nOLrJb9+rUI3f4oIy6Jgvv7/VTwYgVp0ZIENbMFtb8w=; b=G6YrjAJc2vCn43RufzoB3RR9ANF5NRnmgf8DJcEbV31f4tmh7EDIbc85Z2K5un7hGS WZ16c8OEuz7Vwt1XxMlKOW6yp4idvhUTU95hVCtpjBuLq83JyHPxmKdz6XpTn7pjgI8N WxIxrevfjNpmGNk1Ij/an2jQqzlWxVVAnLDCMcHQf7A7mJkq8GQCLp2au9BAE+uUHOT9 ap6s5mBGqITvK1+0rdCzdkoM6XOJCrR+Ek39+xSvP9jWv5IRK671zeIyVVLpuDZ9oy0o GsInbhjuttMcCZ1Zl43sucLNvmtaD2urT16QhktHTm667Do3fMCZ8FSahvutqorjSdVr hGdg== 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=nOLrJb9+rUI3f4oIy6Jgvv7/VTwYgVp0ZIENbMFtb8w=; b=cGTZJjpJwnA3VdB8d1i50O3ki046/1tiXmOe6uWSxdXByXYCGd6NtQJgVEzC+aGLSB 4BOWXmNQKq80UHQaun4BW1uJ8tbr+0uERudwwg2VXRnDHIM7+SyPE6pmw3RKOqAfdR/v hLR2WhfMZSvMpnAa2zhMLBfvvkp9fas3e9zIvcL7Wp5NII94Z9Y4kdpRXQ+bOUgm3rYO QLoR6MWce+WEaEEPXIKNe65koeLrbiRW0A+r3VWv7mV7RrwCLQtrIa139f5tIYMa3Bl5 CQqAo/HfmkzbI1GwKvXjVztLCaIZxfqP+bkjMJE5exZatVGsIlz9UgDVxdiJPXK+vvs+ Q0Mw== X-Gm-Message-State: AJcUukdwzxW89POddTqQGI03tOgh+xxnolbhZzMM44ok1+rE3wS3FNNM es/3/jaigvH9YtmEpy3NX0yVMwUiIVqkBRyd+90iiuuMREd3EU/pWeZHfJZv40vj0MFiJ16Wk8/ /5AqTJkNdhBDUQPIDCK9PoVYCAVeWvWID4dGQA+YSvbMZ2f2IPfCDsQ== X-Google-Smtp-Source: ALg8bN6hJzGPinq+Mzx1qsXB4O7LgfBquzFSJ7XsUNbiSA8msv8STWhN4N627W1eNMWGAa7e89APi7E= X-Received: by 2002:a05:6830:d4:: with SMTP id x20mr6140130oto.38.1547665821985; Wed, 16 Jan 2019 11:10:21 -0800 (PST) Date: Wed, 16 Jan 2019 11:10:03 -0800 In-Reply-To: <20190116191005.164355-1-sdf@google.com> Message-Id: <20190116191005.164355-6-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 5/7] bpftool: add push and enqueue commands 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 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org This is intended to be used with queues and stacks and be more user-friendly than 'update' without the key. Example: bpftool map create /sys/fs/bpf/q type queue value 4 entries 10 name q bpftool map push pinned /sys/fs/bpf/q value 0 1 2 3 bpftool map peek pinned /sys/fs/bpf/q value: 00 01 02 03 bpftool map create /sys/fs/bpf/s type stack value 4 entries 10 name s bpftool map enqueue pinned /sys/fs/bpf/s value 0 1 2 3 bpftool map peek pinned /sys/fs/bpf/s value: 00 01 02 03 Signed-off-by: Stanislav Fomichev --- tools/bpf/bpftool/Documentation/bpftool-map.rst | 8 ++++++++ tools/bpf/bpftool/map.c | 7 ++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/tools/bpf/bpftool/Documentation/bpftool-map.rst b/tools/bpf/bpftool/Documentation/bpftool-map.rst index b79da683da88..435a79d2eed5 100644 --- a/tools/bpf/bpftool/Documentation/bpftool-map.rst +++ b/tools/bpf/bpftool/Documentation/bpftool-map.rst @@ -32,6 +32,8 @@ MAP COMMANDS | **bpftool** **map pin** *MAP* *FILE* | **bpftool** **map event_pipe** *MAP* [**cpu** *N* **index** *M*] | **bpftool** **map peek** *MAP* +| **bpftool** **map push** *MAP* **value** *VALUE* +| **bpftool** **map enqueue** *MAP* **value** *VALUE* | **bpftool** **map help** | | *MAP* := { **id** *MAP_ID* | **pinned** *FILE* } @@ -111,6 +113,12 @@ DESCRIPTION **bpftool map peek** *MAP* Peek next **value** in the queue or stack. + **bpftool map push** *MAP* **value** *VALUE* + Push **value** onto the stack. + + **bpftool map enqueue** *MAP* **value** *VALUE* + Enqueue **value** into the queue. + **bpftool map help** Print short help message. diff --git a/tools/bpf/bpftool/map.c b/tools/bpf/bpftool/map.c index d7344fcd2089..6b5fcbe2d9d4 100644 --- a/tools/bpf/bpftool/map.c +++ b/tools/bpf/bpftool/map.c @@ -1169,6 +1169,8 @@ static int do_help(int argc, char **argv) " %s %s pin MAP FILE\n" " %s %s event_pipe MAP [cpu N index M]\n" " %s %s peek MAP\n" + " %s %s push MAP value VALUE\n" + " %s %s enqueue MAP value VALUE\n" " %s %s help\n" "\n" " " HELP_SPEC_MAP "\n" @@ -1186,7 +1188,8 @@ static int do_help(int argc, char **argv) bin_name, argv[-2], bin_name, argv[-2], bin_name, argv[-2], bin_name, argv[-2], bin_name, argv[-2], bin_name, argv[-2], bin_name, argv[-2], bin_name, argv[-2], bin_name, argv[-2], - bin_name, argv[-2], bin_name, argv[-2]); + bin_name, argv[-2], bin_name, argv[-2], bin_name, argv[-2], + bin_name, argv[-2]); return 0; } @@ -1204,6 +1207,8 @@ static const struct cmd cmds[] = { { "event_pipe", do_event_pipe }, { "create", do_create }, { "peek", do_lookup }, + { "push", do_update }, + { "enqueue", do_update }, { 0 } }; From patchwork Wed Jan 16 19:10:04 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stanislav Fomichev X-Patchwork-Id: 1026133 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=google.com header.i=@google.com header.b="Js2osezM"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43fxcM4d0dz9sD4 for ; Thu, 17 Jan 2019 06:10:27 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730301AbfAPTK0 (ORCPT ); Wed, 16 Jan 2019 14:10:26 -0500 Received: from mail-io1-f74.google.com ([209.85.166.74]:40494 "EHLO mail-io1-f74.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730036AbfAPTKZ (ORCPT ); Wed, 16 Jan 2019 14:10:25 -0500 Received: by mail-io1-f74.google.com with SMTP id u2so5421252iob.7 for ; Wed, 16 Jan 2019 11:10:25 -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=3w52EOFhQ5EgGr1O0B3MNMtHJSrvGqaOzBsn40qXhTM=; b=Js2osezM8dCnVxXeV4KkRuKTZM7BHvD6EJkjsFmd3vTiH0YTW9yvDpKX5zhW/SKKRJ 97blmkqPP6VZD9+bjD9YJOwQ7J4ZEKYHq3Jmyda2t+u4Qd8dukR172AQ1qCtImVO/UJC v7hdaHOc59sy8NHtZwlXSJ5b3lffLJAHLUjHQxIpN45qd3FkQyW3O7tNpU66W4csfEhq pZxxNZ2AZPVc/e0VbrAbNHgnxEzUX7s8al6h/3ItcozT9v5VR+NXdHx4n+NZyO88hpC7 DANn42pmu79/UKiD44gMqqLf0IEoVFzYuwAdI1CL+mkXNUNsBIN5aD0Yd5MfWIYyFVGF +LTQ== 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=3w52EOFhQ5EgGr1O0B3MNMtHJSrvGqaOzBsn40qXhTM=; b=SJAqfY4usBrBKbEH4KOJc7IYZcPeinFAfphp2EzuY3em7tkkUgvTBbWPqXMOMmOGLz loYbioyt12AG3Zw1HalQD8pU7IW8WYKGuJHh4yRGqEEy2uiCmp1E+4RdSrtzGH/ckKxQ Wlun33pzsNiPK+0/pvDQz6cl7axWlwE/1+eD2Htn3hXKwjhE1j+A8Tedgpgt3ocIXoeG L+cxpJncqfySYJetLGUwMdlTjgNzQRdHdKFVoKIHZ7pH8szlLJkRY81Hsi7L+4R+Ep18 yYmhwYsvCW23BEa4rsF42vH4K30LY9X3b8opI5wIGig3we0BO0Cc3ifqFqap2P28stPp mooA== X-Gm-Message-State: AJcUukffUKaKt+R81XUZYFVM2/lJjiA32iOAlVbeMLklYQ7ZadhfGFmI 3j9opkDB6/2ByMHZt1pHYjmbMk/ewXpvqOv3j9RV6rtCyHS6QNKhY0Uq9IEgqHfzsLG9N42XP8h pmhkBM5JTcumFwddwWrJpCYDCXCJBk8psyv99nLcCF87f4HRI5M07vw== X-Google-Smtp-Source: ALg8bN6X0Rqn/smy0CDtkGWdjLM+iheaWXzR+9SHpOMyCl12zbGIMKH+jMER20e0DBVC7EsYbqOY3R8= X-Received: by 2002:a24:655:: with SMTP id 82mr6325254itv.24.1547665824624; Wed, 16 Jan 2019 11:10:24 -0800 (PST) Date: Wed, 16 Jan 2019 11:10:04 -0800 In-Reply-To: <20190116191005.164355-1-sdf@google.com> Message-Id: <20190116191005.164355-7-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 6/7] bpftool: add pop and dequeue commands 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 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org This is intended to be used with queues and stacks, it pops and prints the last element via bpf_map_lookup_and_delete_elem. Example: bpftool map create /sys/fs/bpf/q type queue value 4 entries 10 name q bpftool map push pinned /sys/fs/bpf/q value 0 1 2 3 bpftool map pop pinned /sys/fs/bpf/q value: 00 01 02 03 bpftool map pop pinned /sys/fs/bpf/q Error: empty map bpftool map create /sys/fs/bpf/s type stack value 4 entries 10 name s bpftool map enqueue pinned /sys/fs/bpf/s value 0 1 2 3 bpftool map dequeue pinned /sys/fs/bpf/s value: 00 01 02 03 bpftool map dequeue pinned /sys/fs/bpf/s Error: empty map Signed-off-by: Stanislav Fomichev --- .../bpf/bpftool/Documentation/bpftool-map.rst | 8 ++ tools/bpf/bpftool/map.c | 125 +++++++++++++----- 2 files changed, 98 insertions(+), 35 deletions(-) diff --git a/tools/bpf/bpftool/Documentation/bpftool-map.rst b/tools/bpf/bpftool/Documentation/bpftool-map.rst index 435a79d2eed5..0584c31d3fe2 100644 --- a/tools/bpf/bpftool/Documentation/bpftool-map.rst +++ b/tools/bpf/bpftool/Documentation/bpftool-map.rst @@ -33,7 +33,9 @@ MAP COMMANDS | **bpftool** **map event_pipe** *MAP* [**cpu** *N* **index** *M*] | **bpftool** **map peek** *MAP* | **bpftool** **map push** *MAP* **value** *VALUE* +| **bpftool** **map pop** *MAP* | **bpftool** **map enqueue** *MAP* **value** *VALUE* +| **bpftool** **map dequeue** *MAP* | **bpftool** **map help** | | *MAP* := { **id** *MAP_ID* | **pinned** *FILE* } @@ -116,9 +118,15 @@ DESCRIPTION **bpftool map push** *MAP* **value** *VALUE* Push **value** onto the stack. + **bpftool map pop** *MAP* + Pop and print **value** from the stack. + **bpftool map enqueue** *MAP* **value** *VALUE* Enqueue **value** into the queue. + **bpftool map dequeue** *MAP* + Dequeue and print **value** from the queue. + **bpftool map help** Print short help message. diff --git a/tools/bpf/bpftool/map.c b/tools/bpf/bpftool/map.c index 6b5fcbe2d9d4..850c99ac980f 100644 --- a/tools/bpf/bpftool/map.c +++ b/tools/bpf/bpftool/map.c @@ -857,12 +857,51 @@ static int do_update(int argc, char **argv) return err; } +static void print_key_value(struct bpf_map_info *info, void *key, + void *value) +{ + json_writer_t *btf_wtr; + struct btf *btf = NULL; + int err; + + err = btf__get_from_id(info->btf_id, &btf); + if (err) { + p_err("failed to get btf"); + return; + } + + if (json_output) { + print_entry_json(info, key, value, btf); + } else if (btf) { + /* if here json_wtr wouldn't have been initialised, + * so let's create separate writer for btf + */ + btf_wtr = get_btf_writer(); + if (!btf_wtr) { + p_info("failed to create json writer for btf. falling back to plain output"); + btf__free(btf); + btf = NULL; + print_entry_plain(info, key, value); + } else { + struct btf_dumper d = { + .btf = btf, + .jw = btf_wtr, + .is_plain_text = true, + }; + + do_dump_btf(&d, info, key, value); + jsonw_destroy(&btf_wtr); + } + } else { + print_entry_plain(info, key, value); + } + btf__free(btf); +} + static int do_lookup(int argc, char **argv) { struct bpf_map_info info = {}; __u32 len = sizeof(info); - json_writer_t *btf_wtr; - struct btf *btf = NULL; void *key, *value; int err; int fd; @@ -900,43 +939,12 @@ static int do_lookup(int argc, char **argv) } /* here means bpf_map_lookup_elem() succeeded */ - err = btf__get_from_id(info.btf_id, &btf); - if (err) { - p_err("failed to get btf"); - goto exit_free; - } - - if (json_output) { - print_entry_json(&info, key, value, btf); - } else if (btf) { - /* if here json_wtr wouldn't have been initialised, - * so let's create separate writer for btf - */ - btf_wtr = get_btf_writer(); - if (!btf_wtr) { - p_info("failed to create json writer for btf. falling back to plain output"); - btf__free(btf); - btf = NULL; - print_entry_plain(&info, key, value); - } else { - struct btf_dumper d = { - .btf = btf, - .jw = btf_wtr, - .is_plain_text = true, - }; - - do_dump_btf(&d, &info, key, value); - jsonw_destroy(&btf_wtr); - } - } else { - print_entry_plain(&info, key, value); - } + print_key_value(&info, key, value); exit_free: free(key); free(value); close(fd); - btf__free(btf); return err; } @@ -1149,6 +1157,49 @@ static int do_create(int argc, char **argv) return 0; } +static int do_pop_dequeue(int argc, char **argv) +{ + struct bpf_map_info info = {}; + __u32 len = sizeof(info); + void *key, *value; + int err; + int fd; + + if (argc < 2) + usage(); + + fd = map_parse_fd_and_info(&argc, &argv, &info, &len); + if (fd < 0) + return -1; + + err = alloc_key_value(&info, &key, &value); + if (err) + goto exit_free; + + err = bpf_map_lookup_and_delete_elem(fd, key, value); + if (err) { + if (errno == ENOENT) { + if (json_output) + jsonw_null(json_wtr); + else + printf("Error: empty map\n"); + } else { + p_err("pop failed: %s", strerror(errno)); + } + + goto exit_free; + } + + print_key_value(&info, key, value); + +exit_free: + free(key); + free(value); + close(fd); + + return err; +} + static int do_help(int argc, char **argv) { if (json_output) { @@ -1170,7 +1221,9 @@ static int do_help(int argc, char **argv) " %s %s event_pipe MAP [cpu N index M]\n" " %s %s peek MAP\n" " %s %s push MAP value VALUE\n" + " %s %s pop MAP\n" " %s %s enqueue MAP value VALUE\n" + " %s %s dequeue MAP\n" " %s %s help\n" "\n" " " HELP_SPEC_MAP "\n" @@ -1189,7 +1242,7 @@ static int do_help(int argc, char **argv) bin_name, argv[-2], bin_name, argv[-2], bin_name, argv[-2], bin_name, argv[-2], bin_name, argv[-2], bin_name, argv[-2], bin_name, argv[-2], bin_name, argv[-2], bin_name, argv[-2], - bin_name, argv[-2]); + bin_name, argv[-2], bin_name, argv[-2], bin_name, argv[-2]); return 0; } @@ -1209,6 +1262,8 @@ static const struct cmd cmds[] = { { "peek", do_lookup }, { "push", do_update }, { "enqueue", do_update }, + { "pop", do_pop_dequeue }, + { "dequeue", do_pop_dequeue }, { 0 } }; From patchwork Wed Jan 16 19:10:05 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stanislav Fomichev X-Patchwork-Id: 1026134 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=google.com header.i=@google.com header.b="T9ZcBQjo"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43fxcQ6ChKz9sDP for ; Thu, 17 Jan 2019 06:10:30 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730319AbfAPTK3 (ORCPT ); Wed, 16 Jan 2019 14:10:29 -0500 Received: from mail-pf1-f202.google.com ([209.85.210.202]:56008 "EHLO mail-pf1-f202.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730036AbfAPTK2 (ORCPT ); Wed, 16 Jan 2019 14:10:28 -0500 Received: by mail-pf1-f202.google.com with SMTP id s71so5334518pfi.22 for ; Wed, 16 Jan 2019 11:10:27 -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=wn6DoMeKEVe1e7lFX64iYTRDDGIq0sr3zamlR5la+7U=; b=T9ZcBQjov6YVBXJRjB8tYnZSOE9cjTHNlp6Nr53NNxkaLK6jEKjYB+KfDHztxDiovq ETv25pET2+MlzgIgdAsUtf09tOaP8x/6nZ0Sf77CJzGB7PLmxl90+G/mNgjOO/xR0mU2 W2KAPf1M/b9uYKoTif+NmGM4SclRoMi2Xw4suYNOBcDOC8UoczD3UosZubYf1JtJFc1X eZap4cSm1LPx8j7yUHEuMCE8rcTM13KuwNw7wBG+rKTIBX8h9gDCd4EMBl2XDl7Z5in6 4F+VURSWSNI6JXNu9lhoTyPjC2gmlI4mirpsf621X4Ssd/Q/1gstW8QiZ/OITwIBsgVN wqaw== 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=wn6DoMeKEVe1e7lFX64iYTRDDGIq0sr3zamlR5la+7U=; b=mafWnq1xzJUe1q2+PWFjDfB2JEUwJGYGgBoECtH2CwIkbkOVZq5rRNWvX5wFPgLVfM 9eiQoWsVIojSiExSV6vQN9PSB4YTzwDLTOfw8fcwkvc11oQO+pu0894M+AJrSFY7gn+F uJ5wAZxxh8P7PZAMfJB+a4yNbNTg9y9miHNs4M9WKt+hPNonE78B3mXq06pb96c2owq2 hyBBtCdbZ/RA93utE6oyK8d/sMsZFcu70FuqcM+sHMJPgNi17v+7KAYYglE5TW707182 3NV6RCzisuKntiG3r6rtHFrMRUKQYcVEcaIRTy7c2Ro7XZRsB/Hco+3i/Wu0EdFJKjYW KU8w== X-Gm-Message-State: AJcUukdTzld7G4n2/QLI7kOaw+n9eakeAcaikoEdxPLwZSB73VkXRGGi VvBiDpLHyljHg8wJxwdjSg3sofJgsWjAEkgN1e1sS3VSu9AVGGtrGbwECWshFvsNJsi1BNHP3Om AximO32pYzz+7WeiLFHQmoruGDI16qk/3lPfkmwlctJPHKBv0ltWUxw== X-Google-Smtp-Source: ALg8bN5XEPzESi2rl4boys0jrYdu3NkoZSWuatPIatzU/OY2mXMxQVpLqdTJEteF093oXjL4afT2/kY= X-Received: by 2002:a17:902:5e3:: with SMTP id f90mr3185480plf.51.1547665827443; Wed, 16 Jan 2019 11:10:27 -0800 (PST) Date: Wed, 16 Jan 2019 11:10:05 -0800 In-Reply-To: <20190116191005.164355-1-sdf@google.com> Message-Id: <20190116191005.164355-8-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 7/7] bpftool: add bash completion for peek/push/enqueue/pop/dequeue 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 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org bpftool map peek id - suggests only queue and stack map ids bpftool map pop id - suggests only stack map ids bpftool map dequeue id - suggests only queue map ids bpftool map push id - suggests only stack map ids bpftool map enqueue id - suggests only queue map ids bpftool map push id 1 - suggests 'value', not 'key' bpftool map enqueue id 2 - suggests 'value', not 'key' bpftool map update id - suggests 'value', not 'key' bpftool map lookup id - suggests nothing Signed-off-by: Stanislav Fomichev --- tools/bpf/bpftool/bash-completion/bpftool | 91 ++++++++++++++++++----- 1 file changed, 73 insertions(+), 18 deletions(-) diff --git a/tools/bpf/bpftool/bash-completion/bpftool b/tools/bpf/bpftool/bash-completion/bpftool index e4e4fab1b8c7..47143d793b33 100644 --- a/tools/bpf/bpftool/bash-completion/bpftool +++ b/tools/bpf/bpftool/bash-completion/bpftool @@ -50,14 +50,15 @@ _bpftool_get_map_ids() command sed -n 's/.*"id": \(.*\),$/\1/p' )" -- "$cur" ) ) } -_bpftool_get_perf_map_ids() +# Takes map type and adds matching map ids to the list of suggestions. +_bpftool_get_map_ids_for_type() { + local type="$1" COMPREPLY+=( $( compgen -W "$( bpftool -jp map 2>&1 | \ - command grep -C2 perf_event_array | \ + command grep -C2 "$type" | \ command sed -n 's/.*"id": \(.*\),$/\1/p' )" -- "$cur" ) ) } - _bpftool_get_prog_ids() { COMPREPLY+=( $( compgen -W "$( bpftool -jp prog 2>&1 | \ @@ -99,15 +100,25 @@ _sysfs_get_netdevs() "$cur" ) ) } -# For bpftool map update: retrieve type of the map to update. -_bpftool_map_update_map_type() +# Retrieve type of the map that we are operating on. +_bpftool_map_guess_map_type() { local keyword ref for (( idx=3; idx < ${#words[@]}-1; idx++ )); do - if [[ ${words[$((idx-2))]} == "update" ]]; then - keyword=${words[$((idx-1))]} - ref=${words[$((idx))]} - fi + case "${words[$((idx-2))]}" in + lookup|update) + keyword=${words[$((idx-1))]} + ref=${words[$((idx))]} + ;; + push) + printf "stack" + return 0 + ;; + enqueue) + printf "queue" + return 0 + ;; + esac done [[ -z $ref ]] && return 0 @@ -119,6 +130,8 @@ _bpftool_map_update_map_type() _bpftool_map_update_get_id() { + local command="$1" + # Is it the map to update, or a map to insert into the map to update? # Search for "value" keyword. local idx value @@ -128,11 +141,24 @@ _bpftool_map_update_get_id() break fi done - [[ $value -eq 0 ]] && _bpftool_get_map_ids && return 0 + if [[ $value -eq 0 ]]; then + case "$command" in + push) + _bpftool_get_map_ids_for_type stack + ;; + enqueue) + _bpftool_get_map_ids_for_type queue + ;; + *) + _bpftool_get_map_ids + ;; + esac + return 0 + fi # Id to complete is for a value. It can be either prog id or map id. This # depends on the type of the map to update. - local type=$(_bpftool_map_update_map_type) + local type=$(_bpftool_map_guess_map_type) case $type in array_of_maps|hash_of_maps) _bpftool_get_map_ids @@ -382,14 +408,28 @@ _bpftool() map) local MAP_TYPE='id pinned' case $command in - show|list|dump) + show|list|dump|peek|pop|dequeue) case $prev in $command) COMPREPLY=( $( compgen -W "$MAP_TYPE" -- "$cur" ) ) return 0 ;; id) - _bpftool_get_map_ids + case "$command" in + peek) + _bpftool_get_map_ids_for_type stack + _bpftool_get_map_ids_for_type queue + ;; + pop) + _bpftool_get_map_ids_for_type stack + ;; + dequeue) + _bpftool_get_map_ids_for_type queue + ;; + *) + _bpftool_get_map_ids + ;; + esac return 0 ;; *) @@ -447,19 +487,25 @@ _bpftool() COMPREPLY+=( $( compgen -W 'hex' -- "$cur" ) ) ;; *) + case $(_bpftool_map_guess_map_type) in + queue|stack) + return 0 + ;; + esac + _bpftool_once_attr 'key' return 0 ;; esac ;; - update) + update|push|enqueue) case $prev in $command) COMPREPLY=( $( compgen -W "$MAP_TYPE" -- "$cur" ) ) return 0 ;; id) - _bpftool_map_update_get_id + _bpftool_map_update_get_id $command return 0 ;; key) @@ -468,7 +514,7 @@ _bpftool() value) # We can have bytes, or references to a prog or a # map, depending on the type of the map to update. - case $(_bpftool_map_update_map_type) in + case "$(_bpftool_map_guess_map_type)" in array_of_maps|hash_of_maps) local MAP_TYPE='id pinned' COMPREPLY+=( $( compgen -W "$MAP_TYPE" \ @@ -490,6 +536,13 @@ _bpftool() return 0 ;; *) + case $(_bpftool_map_guess_map_type) in + queue|stack) + _bpftool_once_attr 'value' + return 0; + ;; + esac + _bpftool_once_attr 'key' local UPDATE_FLAGS='any exist noexist' for (( idx=3; idx < ${#words[@]}-1; idx++ )); do @@ -508,6 +561,7 @@ _bpftool() return 0 fi done + return 0 ;; esac @@ -527,7 +581,7 @@ _bpftool() return 0 ;; id) - _bpftool_get_perf_map_ids + _bpftool_get_map_ids_for_type perf_event_array return 0 ;; cpu) @@ -546,7 +600,8 @@ _bpftool() *) [[ $prev == $object ]] && \ COMPREPLY=( $( compgen -W 'delete dump getnext help \ - lookup pin event_pipe show list update create' -- \ + lookup pin event_pipe show list update create \ + peek push enqueue pop dequeue' -- \ "$cur" ) ) ;; esac