From patchwork Wed Mar 20 17:33:26 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alban Crequy X-Patchwork-Id: 1059421 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=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="gHRjaLc/"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 44PcVh40tkz9sNk for ; Thu, 21 Mar 2019 04:34:36 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727146AbfCTReb (ORCPT ); Wed, 20 Mar 2019 13:34:31 -0400 Received: from mail-ed1-f66.google.com ([209.85.208.66]:36378 "EHLO mail-ed1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726611AbfCTReb (ORCPT ); Wed, 20 Mar 2019 13:34:31 -0400 Received: by mail-ed1-f66.google.com with SMTP id e4so2733695edi.3; Wed, 20 Mar 2019 10:34:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=jAsNi26TKH9Dmlb5JIesmArjLcNt9Wble0Sl7/O3SC0=; b=gHRjaLc/BytrTpBoCzhr3Z9PDyaNhWcrAMAM+SCL3R+5NGjyIaCAiY0CnPTgcXDpVF 6rsi5Pbi07BPKRwGc9LCvp5ASLHpRWZ+BWQghMiU7Crww727lNhzh5+nCcHTzAb7i1gb ZV0A5+QKHBdnUPYw9qU7HAqOShWpyqqsPV/67eNlNqiEJp0Q5g5vBZaU/5ln1T3rnBOz PPyIZW7kixfHsjH/XYc52po2ne7ICkV09E3X01LRORfz8mgnXxen7ci2qG0L2odtoMMr bQfW/hgFbKWhvv61sb+iUqovaO9oRROVySEuxeDN8nww2Dg/dR04rv85p0VFy9w1elEF smDg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :mime-version:content-transfer-encoding; bh=jAsNi26TKH9Dmlb5JIesmArjLcNt9Wble0Sl7/O3SC0=; b=GGcVAI+eF3fZPjc54wOAu9SkMis25MJa9Q2pqLM8Mvt386OqPw0C1ITDFQGQ0VK2DC X2dWVtRbuutL4lufIonIG3hvDgK1gKqyeXzLfN4Cm47vNdOe2l0+e9aaN+XKnwHDoVn5 ZV2ab4ZtdFnbghFAtVfY5dKOvg2tTBNdaiVU2rLsy0FpzXZlwCNO59lGM9PUDtrA6SIQ j8aRBbRZqQ2xWxhjvXOhYR6l4r6M7uaGYNHZuJL5KqvILrGZXfvkPa1Y24s702C4vhm7 JLJcpXrq8oWdEYXB07EL5d9VAB50jLmkObwXQOpJSl7Iqft4mxiZsDotARdelJTvWkvB 2WFQ== X-Gm-Message-State: APjAAAVfIjbLyBAyBZf6YCUvecDn5JocMQu2TV/ObRSoWyrnzFHrmXS4 OOZI9N1E5QVGmOWhP7e2sG4= X-Google-Smtp-Source: APXvYqzey3gthv0iLLsO2d4clFYVqV7fv9yz5tuLFwNGq6hVdpUV7nVSFTRIZpu+tWxf9a8IxkQCEA== X-Received: by 2002:aa7:c1ce:: with SMTP id d14mr21226100edp.50.1553103269044; Wed, 20 Mar 2019 10:34:29 -0700 (PDT) Received: from neptune.fritz.box ([178.19.216.175]) by smtp.gmail.com with ESMTPSA id 5sm828606edp.50.2019.03.20.10.34.26 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Wed, 20 Mar 2019 10:34:28 -0700 (PDT) From: Alban Crequy X-Google-Original-From: Alban Crequy To: ast@kernel.org, daniel@iogearbox.net Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org, alban@kinvolk.io, iago@kinvolk.io Subject: [PATCH bpf-next v1 1/7] tools: bpftool: fix infinite loop Date: Wed, 20 Mar 2019 18:33:26 +0100 Message-Id: <20190320173332.18105-1-alban@kinvolk.io> X-Mailer: git-send-email 2.20.1 MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Alban Crequy Symptoms: when forgetting to type the keyword 'type' in front of 'hash': $ sudo bpftool map create /sys/fs/bpf/dir/foobar hash key 8 value 8 entries 128 (infinite loop, taking all the CPU) ^C Signed-off-by: Alban Crequy --- tools/bpf/bpftool/map.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tools/bpf/bpftool/map.c b/tools/bpf/bpftool/map.c index e0c650d91784..994a7e0d16fb 100644 --- a/tools/bpf/bpftool/map.c +++ b/tools/bpf/bpftool/map.c @@ -1151,6 +1151,9 @@ static int do_create(int argc, char **argv) return -1; } NEXT_ARG(); + } else { + p_err("unknown arg %s", *argv); + return -1; } } From patchwork Wed Mar 20 17:33:27 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alban Crequy X-Patchwork-Id: 1059422 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=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="c7QHHxEh"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 44PcW32yZRz9sNk for ; Thu, 21 Mar 2019 04:34:55 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727167AbfCTRet (ORCPT ); Wed, 20 Mar 2019 13:34:49 -0400 Received: from mail-ed1-f45.google.com ([209.85.208.45]:32978 "EHLO mail-ed1-f45.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726049AbfCTRet (ORCPT ); Wed, 20 Mar 2019 13:34:49 -0400 Received: by mail-ed1-f45.google.com with SMTP id q3so2749764edg.0; Wed, 20 Mar 2019 10:34:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=vyG0+IhSrvIsPBpMfBKUItVTc3RXjV8cpzg2PjTIN64=; b=c7QHHxEhCeiNhk11obJhX4GSRJWxbMQO/xGiNnzh/Mw2tGKYQQjbcXLwkDk9TSjFru J0IFtQJsg75DzV0iZSZyFdtP1Ryi363WWw7fvp9S/unqNiYb5ogMJiq/t+Y0R2oUhpse Zq9/ZlhOSV0mxcO5Sjug6ecchx+NBiOUWCl+tvSy2gMFM3F6KvHjEBS9EEb5q2xpns7e VYtGV3lhdu0kcpQghebFqOsqxsa0fw6pnX4zBhn/EhRumXsH9KGkbguqC9puPbg55IyJ YJNYwQncSlpaLQhJOwLbOh13wubinrJc4+kjbRG6ReTNB00TF6im68e5erHHSOwS536y PCNA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=vyG0+IhSrvIsPBpMfBKUItVTc3RXjV8cpzg2PjTIN64=; b=a0dPGcmozL6cdUL1tjv5mti6Nt8nfBNmncC/otnIxcQA9Rb9j3lrbj/+7/h/6vV3jv d5XrfjhuA7b+Zfd1cUKu3oFfZ5b/kzqCYHNxUoLowSl7XvZkBAwJAR4f3K1WC4Y0sv0w MdVvbOAGdL2rq9+15cDx81T0HI0pEy1pE7Pg01GmYTLrm9gQHNUwhK8YZX0nIf/WYSJz pmjvBAkCrs4cuZtdYwEzXW6+Rl/hCuvfZLqIdhK1rK5UmfcG496syASAlpJsiegCc3B2 fxFyJgb8OUYu+aDebw7yJZPmHGHxgnee9yMBzEF1YikLm994UwplVGSyYYwZXfJKatwN 4+DA== X-Gm-Message-State: APjAAAUBKqE159qONhclIWQP/LIoQqeluiV3FlGj+v3Lz2sIya2xHfuC Kk8y+sCRA4QSkYXiZvfKtLlq/71++TY= X-Google-Smtp-Source: APXvYqxMLVLVz9UbvTAbBuM5ZrJ+Sg/0Wxl4TgD4yHJeoLWq0fwexscWglxkPdC4dazbq2Z8NUnkZA== X-Received: by 2002:a17:906:2781:: with SMTP id j1mr17932233ejc.238.1553103286635; Wed, 20 Mar 2019 10:34:46 -0700 (PDT) Received: from neptune.fritz.box ([178.19.216.175]) by smtp.gmail.com with ESMTPSA id 5sm828606edp.50.2019.03.20.10.34.45 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Wed, 20 Mar 2019 10:34:45 -0700 (PDT) From: Alban Crequy X-Google-Original-From: Alban Crequy To: ast@kernel.org, daniel@iogearbox.net Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org, alban@kinvolk.io, iago@kinvolk.io Subject: [PATCH bpf-next v1 2/7] tools: bpftool: fix error message on invalid argument count Date: Wed, 20 Mar 2019 18:33:27 +0100 Message-Id: <20190320173332.18105-2-alban@kinvolk.io> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190320173332.18105-1-alban@kinvolk.io> References: <20190320173332.18105-1-alban@kinvolk.io> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Alban Crequy Symptoms: $ sudo bpftool map create /sys/fs/bpf/dir/foobar type hash key 8 value 8 entries Error: '8' needs at least 2 arguments, 1 found After this patch: $ sudo bpftool map create /sys/fs/bpf/dir/foobar type hash key 8 value 8 entries Error: can't parse max entries: missing argument Signed-off-by: Alban Crequy --- tools/bpf/bpftool/common.c | 5 +++++ tools/bpf/bpftool/main.h | 11 +++++++---- tools/bpf/bpftool/map.c | 15 ++++++++++++--- tools/bpf/bpftool/prog.c | 2 -- 4 files changed, 24 insertions(+), 9 deletions(-) diff --git a/tools/bpf/bpftool/common.c b/tools/bpf/bpftool/common.c index f7261fad45c1..e560cd8f66bc 100644 --- a/tools/bpf/bpftool/common.c +++ b/tools/bpf/bpftool/common.c @@ -627,6 +627,11 @@ int parse_u32_arg(int *argc, char ***argv, __u32 *val, const char *what) return -1; } + if (*argc == 0) { + p_err("can't parse %s: missing argument", what); + return -1; + } + *val = strtoul(**argv, &endptr, 0); if (*endptr) { p_err("can't parse %s as %s", **argv, what); diff --git a/tools/bpf/bpftool/main.h b/tools/bpf/bpftool/main.h index d7dd84d3c660..7fc2973446d0 100644 --- a/tools/bpf/bpftool/main.h +++ b/tools/bpf/bpftool/main.h @@ -22,14 +22,17 @@ #define NEXT_ARGP() ({ (*argc)--; (*argv)++; if (*argc < 0) usage(); }) #define BAD_ARG() ({ p_err("what is '%s'?", *argv); -1; }) #define GET_ARG() ({ argc--; *argv++; }) -#define REQ_ARGS(cnt) \ + +#define REQ_ARGS(cnt) REQ_ARGS_GENERIC(cnt, argc, argv) +#define REQ_ARGSP(cnt) REQ_ARGS_GENERIC(cnt, *argc, *argv) +#define REQ_ARGS_GENERIC(cnt, ARGC, ARGV) \ ({ \ int _cnt = (cnt); \ bool _res; \ \ - if (argc < _cnt) { \ - p_err("'%s' needs at least %d arguments, %d found", \ - argv[-1], _cnt, argc); \ + if ((ARGC) < _cnt) { \ + p_err("'%s' needs at least %d arguments, %d found", \ + (ARGV)[-1], _cnt, (ARGC)); \ _res = false; \ } else { \ _res = true; \ diff --git a/tools/bpf/bpftool/map.c b/tools/bpf/bpftool/map.c index 994a7e0d16fb..18f9bc3aed4f 100644 --- a/tools/bpf/bpftool/map.c +++ b/tools/bpf/bpftool/map.c @@ -98,6 +98,9 @@ int map_parse_fd(int *argc, char ***argv) char *endptr; NEXT_ARGP(); + if (!REQ_ARGSP(1)) { + return -1; + } id = strtoul(**argv, &endptr, 0); if (*endptr) { @@ -114,6 +117,9 @@ int map_parse_fd(int *argc, char ***argv) char *path; NEXT_ARGP(); + if (!REQ_ARGSP(1)) { + return -1; + } path = **argv; NEXT_ARGP(); @@ -1100,11 +1106,10 @@ static int do_create(int argc, char **argv) pinfile = GET_ARG(); while (argc) { - if (!REQ_ARGS(2)) - return -1; - if (is_prefix(*argv, "type")) { NEXT_ARG(); + if (!REQ_ARGS(1)) + return -1; if (attr.map_type) { p_err("map type already specified"); @@ -1119,6 +1124,8 @@ static int do_create(int argc, char **argv) NEXT_ARG(); } else if (is_prefix(*argv, "name")) { NEXT_ARG(); + if (!REQ_ARGS(1)) + return -1; attr.name = GET_ARG(); } else if (is_prefix(*argv, "key")) { if (parse_u32_arg(&argc, &argv, &attr.key_size, @@ -1138,6 +1145,8 @@ static int do_create(int argc, char **argv) return -1; } else if (is_prefix(*argv, "dev")) { NEXT_ARG(); + if (!REQ_ARGS(1)) + return -1; if (attr.map_ifindex) { p_err("offload device already specified"); diff --git a/tools/bpf/bpftool/prog.c b/tools/bpf/bpftool/prog.c index 8ef80d65a474..e0875ef5e444 100644 --- a/tools/bpf/bpftool/prog.c +++ b/tools/bpf/bpftool/prog.c @@ -836,8 +836,6 @@ static int parse_attach_detach_args(int argc, char **argv, int *progfd, } NEXT_ARG(); - if (!REQ_ARGS(2)) - return -EINVAL; *mapfd = map_parse_fd(&argc, &argv); if (*mapfd < 0) From patchwork Wed Mar 20 17:33:28 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alban Crequy X-Patchwork-Id: 1059423 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=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="tOCp8HA+"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 44PcWK2mkPz9sNj for ; Thu, 21 Mar 2019 04:35:09 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727271AbfCTRfE (ORCPT ); Wed, 20 Mar 2019 13:35:04 -0400 Received: from mail-ed1-f67.google.com ([209.85.208.67]:43888 "EHLO mail-ed1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726823AbfCTRfD (ORCPT ); Wed, 20 Mar 2019 13:35:03 -0400 Received: by mail-ed1-f67.google.com with SMTP id m35so2692025ede.10; Wed, 20 Mar 2019 10:35:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=sxtZeD7M2qA/5TNoThqyV7HsYvGEX92bNGAs8Nl5Zdk=; b=tOCp8HA+7fEbLW/BgnlIUikOY5cz/dAKDU2npUDamp5aSBnnQ8GQfC5szuTiMl3oQr gDbJF3jxuCgDQrDqJeSrBHzQPxRZlOS/F6zELACdZErgEhw/J5UDcuFu0AkO47qFqFDQ ZN3wD5zh5weJ3Pe6bGHp0QEmemz9GG57qaPnT51eTh3RKMO3YY3leM3F/Oti5ocrv9/w PvZnB81loOb1B+a3IZ4vYru9k7xzXcQHXB2o9bVKJGWuST4mIguuSJ5pTJhqNYDjkrZk 8QP2146Ecb5nqKfEEqkRcMqVmQpFX/X1bxpdSKeDYnLmUF8pnHNV864XeQrvpoZryrtM 1k0Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=sxtZeD7M2qA/5TNoThqyV7HsYvGEX92bNGAs8Nl5Zdk=; b=ZY9sVRsqs8qMOyBo3dcKdb12+SjzM8xH2Am4vILTY0mFhFlbBmjpwkrKgCJzq5CZ2d 8QyfPKInipfFbILcuQlB+je7QSvXtfxrJXZKJ+BHYcHCAS/7ZK9PegM7guJ+Npu1u7kj Kwta1Lr9i5UQoEzYidu9baw2MBwK1p80c34H0sT3kE0QGwGraa7DT5gxkqOfJU6ZSQqQ t4c8qy+OaQxyg31g49bLHZOJ0dz7mxbnGcIqGlRmGTWoOFA2lOw2MI/KmaZThmhxXDeq lC2PBPSOB0gjr5W5zLa/X0XuDoDWt94Gl8gHYEwl5CKNJkHT7fzASFZxu3rkhxqypY46 44/g== X-Gm-Message-State: APjAAAVuxjBhKC4hvydLiJ9x5F3OrRVvLDru6nwkXWejv5y+OiAZfX1m iywSshriP5VgbQ+PxFkZgt0= X-Google-Smtp-Source: APXvYqxCvkFLqLvoU+PJcTnVIB/q3p9HMzfwgecP4OCu9GGSJrRGaxfaLtbKLEU2kFk2XohNvx1dQw== X-Received: by 2002:a17:906:fd5:: with SMTP id c21mr17844911ejk.86.1553103301297; Wed, 20 Mar 2019 10:35:01 -0700 (PDT) Received: from neptune.fritz.box ([178.19.216.175]) by smtp.gmail.com with ESMTPSA id 5sm828606edp.50.2019.03.20.10.35.00 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Wed, 20 Mar 2019 10:35:00 -0700 (PDT) From: Alban Crequy X-Google-Original-From: Alban Crequy To: ast@kernel.org, daniel@iogearbox.net Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org, alban@kinvolk.io, iago@kinvolk.io Subject: [PATCH bpf-next v1 3/7] tools: bpftool: create map of maps Date: Wed, 20 Mar 2019 18:33:28 +0100 Message-Id: <20190320173332.18105-3-alban@kinvolk.io> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190320173332.18105-1-alban@kinvolk.io> References: <20190320173332.18105-1-alban@kinvolk.io> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Alban Crequy Before this patch, there was no way to fill attr.inner_map_fd, necessary for array_of_maps or hash_of_maps. This patch adds keyword 'innermap' to pass the innermap, either as an id or as a pinned map. Example of commands: $ sudo bpftool map create /sys/fs/bpf/innermap type hash \ key 8 value 8 entries 64 name innermap flags 1 $ sudo bpftool map create /sys/fs/bpf/outermap type hash_of_maps \ innermap pinned /sys/fs/bpf/innermap key 64 value 4 \ entries 64 name myoutermap flags 1 $ sudo bpftool map show pinned /sys/fs/bpf/outermap 47: hash_of_maps name myoutermap flags 0x1 key 64B value 4B max_entries 64 memlock 12288B Documentation and bash completion updated as well. Signed-off-by: Alban Crequy --- Previous version of this patch was sent while bpf-next was closed. https://marc.info/?l=linux-kernel&m=155180393501258&w=2 Since then, the following changes were done: - error management when calling map_parse_fd (review from Jakub) - fix documentation and bash completion (review from Quentin) --- .../bpf/bpftool/Documentation/bpftool-map.rst | 9 ++- tools/bpf/bpftool/bash-completion/bpftool | 9 +++ tools/bpf/bpftool/map.c | 75 +++++++++++++++++-- 3 files changed, 83 insertions(+), 10 deletions(-) diff --git a/tools/bpf/bpftool/Documentation/bpftool-map.rst b/tools/bpf/bpftool/Documentation/bpftool-map.rst index 5c984ffc9f01..b685641bfd74 100644 --- a/tools/bpf/bpftool/Documentation/bpftool-map.rst +++ b/tools/bpf/bpftool/Documentation/bpftool-map.rst @@ -23,7 +23,7 @@ MAP COMMANDS | **bpftool** **map { show | list }** [*MAP*] | **bpftool** **map create** *FILE* **type** *TYPE* **key** *KEY_SIZE* **value** *VALUE_SIZE* \ -| **entries** *MAX_ENTRIES* **name** *NAME* [**flags** *FLAGS*] [**dev** *NAME*] +| **entries** *MAX_ENTRIES* **name** *NAME* [**flags** *FLAGS*] [**dev** *NAME*] [**innermap** MAP] | **bpftool** **map dump** *MAP* | **bpftool** **map update** *MAP* [**key** *DATA*] [**value** *VALUE*] [*UPDATE_FLAGS*] | **bpftool** **map lookup** *MAP* [**key** *DATA*] @@ -60,10 +60,15 @@ DESCRIPTION Output will start with map ID followed by map type and zero or more named attributes (depending on kernel version). - **bpftool map create** *FILE* **type** *TYPE* **key** *KEY_SIZE* **value** *VALUE_SIZE* **entries** *MAX_ENTRIES* **name** *NAME* [**flags** *FLAGS*] [**dev** *NAME*] + **bpftool map create** *FILE* **type** *TYPE* **key** *KEY_SIZE* **value** *VALUE_SIZE* **entries** *MAX_ENTRIES* **name** *NAME* [**flags** *FLAGS*] [**dev** *NAME*] [**innermap** MAP] Create a new map with given parameters and pin it to *bpffs* as *FILE*. + To create a map of type **array_of_maps** or + **hash_of_maps**, the additional parameter **innermap** needs + to reference an existing map with the type and size of the + maps in the values. + **bpftool map dump** *MAP* Dump all entries in a given *MAP*. diff --git a/tools/bpf/bpftool/bash-completion/bpftool b/tools/bpf/bpftool/bash-completion/bpftool index b803827d01e8..9e37de8bb227 100644 --- a/tools/bpf/bpftool/bash-completion/bpftool +++ b/tools/bpf/bpftool/bash-completion/bpftool @@ -461,6 +461,14 @@ _bpftool() _sysfs_get_netdevs return 0 ;; + innermap) + COMPREPLY+=( $( compgen -W "id pinned" -- "$cur" ) ) + return 0 + ;; + id) + _bpftool_get_map_ids + return 0 + ;; *) _bpftool_once_attr 'type' _bpftool_once_attr 'key' @@ -469,6 +477,7 @@ _bpftool() _bpftool_once_attr 'name' _bpftool_once_attr 'flags' _bpftool_once_attr 'dev' + _bpftool_once_attr 'innermap' return 0 ;; esac diff --git a/tools/bpf/bpftool/map.c b/tools/bpf/bpftool/map.c index 18f9bc3aed4f..a576f2a019be 100644 --- a/tools/bpf/bpftool/map.c +++ b/tools/bpf/bpftool/map.c @@ -1100,6 +1100,7 @@ static int do_create(int argc, char **argv) struct bpf_create_map_attr attr = { NULL, }; const char *pinfile; int err, fd; + int inner_map_fd = -1; if (!REQ_ARGS(7)) return -1; @@ -1108,48 +1109,75 @@ static int do_create(int argc, char **argv) while (argc) { if (is_prefix(*argv, "type")) { NEXT_ARG(); - if (!REQ_ARGS(1)) + if (!REQ_ARGS(1)) { + if (inner_map_fd != -1) + close(inner_map_fd); return -1; + } if (attr.map_type) { p_err("map type already specified"); + if (inner_map_fd != -1) + close(inner_map_fd); return -1; } attr.map_type = map_type_from_str(*argv); if ((int)attr.map_type < 0) { p_err("unrecognized map type: %s", *argv); + if (inner_map_fd != -1) + close(inner_map_fd); return -1; } NEXT_ARG(); } else if (is_prefix(*argv, "name")) { NEXT_ARG(); - if (!REQ_ARGS(1)) + if (!REQ_ARGS(1)) { + if (inner_map_fd != -1) + close(inner_map_fd); return -1; + } attr.name = GET_ARG(); } else if (is_prefix(*argv, "key")) { if (parse_u32_arg(&argc, &argv, &attr.key_size, - "key size")) + "key size")) { + if (inner_map_fd != -1) + close(inner_map_fd); return -1; + } } else if (is_prefix(*argv, "value")) { if (parse_u32_arg(&argc, &argv, &attr.value_size, - "value size")) + "value size")) { + if (inner_map_fd != -1) + close(inner_map_fd); return -1; + } } else if (is_prefix(*argv, "entries")) { if (parse_u32_arg(&argc, &argv, &attr.max_entries, - "max entries")) + "max entries")) { + if (inner_map_fd != -1) + close(inner_map_fd); return -1; + } } else if (is_prefix(*argv, "flags")) { if (parse_u32_arg(&argc, &argv, &attr.map_flags, - "flags")) + "flags")) { + if (inner_map_fd != -1) + close(inner_map_fd); return -1; + } } else if (is_prefix(*argv, "dev")) { NEXT_ARG(); - if (!REQ_ARGS(1)) + if (!REQ_ARGS(1)) { + if (inner_map_fd != -1) + close(inner_map_fd); return -1; + } if (attr.map_ifindex) { p_err("offload device already specified"); + if (inner_map_fd != -1) + close(inner_map_fd); return -1; } @@ -1157,28 +1185,59 @@ static int do_create(int argc, char **argv) if (!attr.map_ifindex) { p_err("unrecognized netdevice '%s': %s", *argv, strerror(errno)); + if (inner_map_fd != -1) + close(inner_map_fd); return -1; } NEXT_ARG(); + } else if (is_prefix(*argv, "innermap")) { + NEXT_ARG(); + if (!REQ_ARGS(1)) { + if (inner_map_fd != -1) + close(inner_map_fd); + return -1; + } + + if (inner_map_fd != -1) { + close(inner_map_fd); + p_err("innermap already specified"); + return -1; + } + + inner_map_fd = map_parse_fd(&argc, &argv); + if (inner_map_fd < 0) + return -1; } else { p_err("unknown arg %s", *argv); + if (inner_map_fd != -1) + close(inner_map_fd); return -1; } } if (!attr.name) { p_err("map name not specified"); + if (inner_map_fd != -1) + close(inner_map_fd); return -1; } set_max_rlimit(); + if (inner_map_fd != -1) + attr.inner_map_fd = inner_map_fd; + fd = bpf_create_map_xattr(&attr); if (fd < 0) { p_err("map create failed: %s", strerror(errno)); + if (inner_map_fd != -1) + close(inner_map_fd); return -1; } + if (inner_map_fd != -1) + close(inner_map_fd); + err = do_pin_fd(fd, pinfile); close(fd); if (err) @@ -1243,7 +1302,7 @@ static int do_help(int argc, char **argv) "Usage: %s %s { show | list } [MAP]\n" " %s %s create FILE type TYPE key KEY_SIZE value VALUE_SIZE \\\n" " entries MAX_ENTRIES name NAME [flags FLAGS] \\\n" - " [dev NAME]\n" + " [dev NAME] [innermap MAP]\n" " %s %s dump MAP\n" " %s %s update MAP [key DATA] [value VALUE] [UPDATE_FLAGS]\n" " %s %s lookup MAP [key DATA]\n" From patchwork Wed Mar 20 17:33:29 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alban Crequy X-Patchwork-Id: 1059424 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=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="I5WcD+HR"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 44PcWW2Ygyz9sNj for ; Thu, 21 Mar 2019 04:35:19 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727380AbfCTRfO (ORCPT ); Wed, 20 Mar 2019 13:35:14 -0400 Received: from mail-ed1-f67.google.com ([209.85.208.67]:39830 "EHLO mail-ed1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726647AbfCTRfO (ORCPT ); Wed, 20 Mar 2019 13:35:14 -0400 Received: by mail-ed1-f67.google.com with SMTP id p27so2713914edc.6; Wed, 20 Mar 2019 10:35:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=+s8sbfNcKDfbAnsHt0EGDXc7Uh4rdT0A304olFMG7DE=; b=I5WcD+HROkuIQLnM+/p8I46lPjG9Chi0JMvxzJ6w7L11HNoR62X6AFmjWb+naSTySc pod0QELmz17wgKAK4/jdao+wvGLfOiHJpGvXO73Q/XcknCnj0sSpGI1KHQ7U1PAccWwe hjd6JzZr2bocrjV0YYBZMuoNQdRcqHCARoUT+Xs/d/PcnqeiG4lYOrkH8dLATTGfPajH AvSie5ZyQSt209b+bcGsYBm4jYehZULNPc97W1avWC4TIAK4W5l9nYKBDF4TicyzCr9z sMrNsWpYl1BH17DBI6aamU35Gtw800oiCCrOpLmbQDHxz0bK5iiVX/8EXHrNVoXoh5TQ 1vBA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=+s8sbfNcKDfbAnsHt0EGDXc7Uh4rdT0A304olFMG7DE=; b=S37BHTX07rhiaBoRrguc4Jas2H/E6Yo5Th+YaEKlPkRq9CQB6suj5iu3Wy1w7/G+ih fuqBjBn6rW0/NlEfvXdwZ+KFbENJCIIAauKqXm9DtNKqXmEj34jT/WjvvZHasXi+gTun kj1ASmt4ifyMpVl0J4vYoNX3Sh8LyrJrow+TPc5KRvRBfGsvPGfdHfOoLPsyj7jb5SdV /DA0qM03kHya6B0Dc20nxItBx10A80tfiM+YC1ITfEs2oRXusbmJKregnpW9aBHBAamm FMnypz3bRhjGYrPIzea4NhL3dgSnHYaNo14aOKkiX4sNTh9lY1CNqu6QKbuIt9rayZlv 6BsA== X-Gm-Message-State: APjAAAUEjvO1Qh4SSDB2iRSOdzOf324FgJJ0RFWlA6io4+LLXWTJ58Ea fKewsiNyElpfEvUZyg3PICU= X-Google-Smtp-Source: APXvYqx6Ya2fPu05woKxH0WYuioKRtmEcQ6GYeAbAiH9XlHc1L4YaKTPpIZpex0KFiHqkbMcN6pWgA== X-Received: by 2002:a17:906:405b:: with SMTP id y27mr17861156ejj.62.1553103311824; Wed, 20 Mar 2019 10:35:11 -0700 (PDT) Received: from neptune.fritz.box ([178.19.216.175]) by smtp.gmail.com with ESMTPSA id 5sm828606edp.50.2019.03.20.10.35.10 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Wed, 20 Mar 2019 10:35:11 -0700 (PDT) From: Alban Crequy X-Google-Original-From: Alban Crequy To: ast@kernel.org, daniel@iogearbox.net Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org, alban@kinvolk.io, iago@kinvolk.io Subject: [PATCH bpf-next v1 4/7] tools: bpftool: implement map exec command Date: Wed, 20 Mar 2019 18:33:29 +0100 Message-Id: <20190320173332.18105-4-alban@kinvolk.io> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190320173332.18105-1-alban@kinvolk.io> References: <20190320173332.18105-1-alban@kinvolk.io> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Alban Crequy The map exec commands allows to open an existing map and pass the file descriptor to a child process. This enables applications to use an existing BPF map even when they don't support bpffs. Example of usage: # bpftool map exec pinned /sys/fs/bpf/foo fd 99 cmd -- readlink /proc/self/fd/99 anon_inode:bpf-map Documentation and bash completion updated as well. Signed-off-by: Alban Crequy --- .../bpf/bpftool/Documentation/bpftool-map.rst | 11 ++++ tools/bpf/bpftool/bash-completion/bpftool | 22 +++++++- tools/bpf/bpftool/map.c | 53 +++++++++++++++++++ 3 files changed, 85 insertions(+), 1 deletion(-) diff --git a/tools/bpf/bpftool/Documentation/bpftool-map.rst b/tools/bpf/bpftool/Documentation/bpftool-map.rst index b685641bfd74..dfd8352fa453 100644 --- a/tools/bpf/bpftool/Documentation/bpftool-map.rst +++ b/tools/bpf/bpftool/Documentation/bpftool-map.rst @@ -30,6 +30,7 @@ MAP COMMANDS | **bpftool** **map getnext** *MAP* [**key** *DATA*] | **bpftool** **map delete** *MAP* **key** *DATA* | **bpftool** **map pin** *MAP* *FILE* +| **bpftool** **map exec** *MAP* **fd** *FD* **cmd** -- *CMD* | **bpftool** **map event_pipe** *MAP* [**cpu** *N* **index** *M*] | **bpftool** **map peek** *MAP* | **bpftool** **map push** *MAP* **value** *VALUE* @@ -101,6 +102,10 @@ DESCRIPTION contain a dot character ('.'), which is reserved for future extensions of *bpffs*. + **bpftool map exec** *MAP* **fd** *FD* **cmd** -- *CMD* + Load map and exec an external command, passing the file + descriptor. + **bpftool** **map event_pipe** *MAP* [**cpu** *N* **index** *M*] Read events from a BPF_MAP_TYPE_PERF_EVENT_ARRAY map. @@ -254,6 +259,12 @@ would be lost as soon as bpftool exits). key: 00 00 00 00 value: 22 02 00 00 Found 1 element +**# bpftool map exec pinned /sys/fs/bpf/foo fd 99 cmd -- readlink /proc/self/fd/99** + +:: + + anon_inode:bpf-map + SEE ALSO ======== **bpf**\ (2), diff --git a/tools/bpf/bpftool/bash-completion/bpftool b/tools/bpf/bpftool/bash-completion/bpftool index 9e37de8bb227..63cd53c4d3a7 100644 --- a/tools/bpf/bpftool/bash-completion/bpftool +++ b/tools/bpf/bpftool/bash-completion/bpftool @@ -583,6 +583,26 @@ _bpftool() fi return 0 ;; + exec) + case $prev in + $command) + COMPREPLY=( $( compgen -W "$MAP_TYPE" -- "$cur" ) ) + return 0 + ;; + fd) + return 0 + ;; + cmd) + COMPREPLY=( $(compgen -c -- "$cur" ) ) + return 0 + ;; + *) + _bpftool_once_attr 'fd' + _bpftool_once_attr 'cmd' + return 0 + ;; + esac + ;; event_pipe) case $prev in $command) @@ -610,7 +630,7 @@ _bpftool() [[ $prev == $object ]] && \ COMPREPLY=( $( compgen -W 'delete dump getnext help \ lookup pin event_pipe show list update create \ - peek push enqueue pop dequeue' -- \ + peek push enqueue pop dequeue exec' -- \ "$cur" ) ) ;; esac diff --git a/tools/bpf/bpftool/map.c b/tools/bpf/bpftool/map.c index a576f2a019be..768497364cee 100644 --- a/tools/bpf/bpftool/map.c +++ b/tools/bpf/bpftool/map.c @@ -883,6 +883,58 @@ static int do_update(int argc, char **argv) return err; } +static int do_exec(int argc, char **argv) +{ + struct bpf_map_info info = {}; + __u32 len = sizeof(info); + int fd, ret; + __u32 outfd = 0; + + if (argc < 2) + usage(); + + fd = map_parse_fd_and_info(&argc, &argv, &info, &len); + if (fd < 0) + return -1; + + while (argc) { + if (is_prefix(*argv, "fd")) { + if (parse_u32_arg(&argc, &argv, &outfd, + "out fd")) + return -1; + } else if (is_prefix(*argv, "cmd")){ + NEXT_ARG(); + if (!REQ_ARGS(1)) + return -1; + + break; + } else { + p_err("unknown arg %s", *argv); + return -1; + } + } + + if (outfd == 0) { + p_err("invalid fd"); + return -1; + } + if (*argv == NULL) { + p_err("empty command"); + return -1; + } + + + ret = dup2(fd, (int)outfd); + if (ret == -1) { + p_err("dup2 failed: %s", strerror(errno)); + return -1; + } + + execvp(argv[0], argv); + p_err("execvp failed: %s", strerror(errno)); + return -1; +} + static void print_key_value(struct bpf_map_info *info, void *key, void *value) { @@ -1355,6 +1407,7 @@ static const struct cmd cmds[] = { { "enqueue", do_update }, { "pop", do_pop_dequeue }, { "dequeue", do_pop_dequeue }, + { "exec", do_exec }, { 0 } }; From patchwork Wed Mar 20 17:33:30 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alban Crequy X-Patchwork-Id: 1059425 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=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="ATpSTJT0"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 44PcWz5KShz9sNN for ; Thu, 21 Mar 2019 04:35:43 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727402AbfCTRfd (ORCPT ); Wed, 20 Mar 2019 13:35:33 -0400 Received: from mail-ed1-f67.google.com ([209.85.208.67]:44709 "EHLO mail-ed1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726647AbfCTRfc (ORCPT ); Wed, 20 Mar 2019 13:35:32 -0400 Received: by mail-ed1-f67.google.com with SMTP id x10so2695218edh.11; Wed, 20 Mar 2019 10:35:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=3d4L7qgjXukp3nae2eWfDw2JFI933yOhfTDnPpdn0FI=; b=ATpSTJT0UXYTy91sNHIv2PtCjo+0TKF5BuCHnLUfRtVYwFCvkrQsLsQc9nNyw8tSYF C11V8HgLD04nR3UhCLgvzBNAO32i+yL/W2SSl4yWbBbQSK3lI6D4SJz4On9L5jtFIPdu 7JDg6jckDjXB5JTgCYN0o1ud9J6Y3lIry/PJsghmvZ+985l5EWOPeln8uCUhX3dbvjZm agunkDYUzOp4zSbfYSShIw/8/vnTd6kpneGAWwdWM9dPiTu57tO6wJnCM0RCg+HMt8xo /o3/hlmgVaJCB9R5A5N2i9u1wtZzWOEVqZ2okTjt84Cq5GZWWwjSMsi8h3ghG53qr5sa WTRw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=3d4L7qgjXukp3nae2eWfDw2JFI933yOhfTDnPpdn0FI=; b=UB5MaU0xTpo4uoCWE1A6mylKB1R3NjNa8nQ9yAUA6PmEi4/SutyogVe2xsfnPJAUr4 YB4OXhD2zBD2EuUccoUmE2fjQtHuJzcMEJfH4Lf5WfVc59MDWApj4Hp3sJD8l+yy/UeW UeuKl42Asj65Y5zb3zpGPCDyt1yEjsrSZbBCkUcECCxJwnz7YfzrxUu7tRIBil1CM3mX OGBW55BCDa14CGCtYjhJLoxg0JVVrcVxQ+Hv1bMz93nxkQ+E7htV8iTAEGB3W9Wg5rbn z4YRYBIpknY9iSqr0k9IWfHKoyBbEtV+basTtKlSZFMEtEPlxQOnzUcu0bBYdo04vxjJ F4Pw== X-Gm-Message-State: APjAAAXz3/mLKZhm4fGhB0evgNvj/ORGAfSth0ilDTl05Xd5IwfiRo68 dzVWCCkgslGa9LS9QEoh17Q= X-Google-Smtp-Source: APXvYqwUBX0YXl6+1hXKwliyZn3/rokWbPkW9YVsKAWfWmPwvRCp7UyN9U40+O3AT12SdsOYowNNHA== X-Received: by 2002:a17:906:828f:: with SMTP id h15mr10115535ejx.170.1553103330401; Wed, 20 Mar 2019 10:35:30 -0700 (PDT) Received: from neptune.fritz.box ([178.19.216.175]) by smtp.gmail.com with ESMTPSA id 5sm828606edp.50.2019.03.20.10.35.29 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Wed, 20 Mar 2019 10:35:29 -0700 (PDT) From: Alban Crequy X-Google-Original-From: Alban Crequy To: ast@kernel.org, daniel@iogearbox.net Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org, alban@kinvolk.io, iago@kinvolk.io Subject: [PATCH bpf-next v1 5/7] tools: bpftool: support loading map by fd from parent process Date: Wed, 20 Mar 2019 18:33:30 +0100 Message-Id: <20190320173332.18105-5-alban@kinvolk.io> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190320173332.18105-1-alban@kinvolk.io> References: <20190320173332.18105-1-alban@kinvolk.io> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Alban Crequy Using a file descriptor passed by the parent process enables applications to fork a bpftool command to inspect a map they know by file descriptor even when they don't support bpffs or map ids. Documentation and bash completion updated as well. Signed-off-by: Alban Crequy --- tools/bpf/bpftool/Documentation/bpftool-map.rst | 8 ++++++++ tools/bpf/bpftool/bash-completion/bpftool | 10 +++++----- tools/bpf/bpftool/map.c | 13 +++++++++++++ 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/tools/bpf/bpftool/Documentation/bpftool-map.rst b/tools/bpf/bpftool/Documentation/bpftool-map.rst index dfd8352fa453..658fe2fb8ecf 100644 --- a/tools/bpf/bpftool/Documentation/bpftool-map.rst +++ b/tools/bpf/bpftool/Documentation/bpftool-map.rst @@ -265,6 +265,14 @@ would be lost as soon as bpftool exits). anon_inode:bpf-map +**# bpftool map exec pinned /sys/fs/bpf/foo fd 99 cmd -- bpftool map show fd 99** + +:: + + 10: hash name some_map flags 0x0 + key 4B value 8B max_entries 2048 memlock 167936B + + SEE ALSO ======== **bpf**\ (2), diff --git a/tools/bpf/bpftool/bash-completion/bpftool b/tools/bpf/bpftool/bash-completion/bpftool index 63cd53c4d3a7..9ec1833bda1e 100644 --- a/tools/bpf/bpftool/bash-completion/bpftool +++ b/tools/bpf/bpftool/bash-completion/bpftool @@ -253,7 +253,7 @@ _bpftool() esac local PROG_TYPE='id pinned tag' - local MAP_TYPE='id pinned' + local MAP_TYPE='id pinned fd' case $command in show|list) [[ $prev != "$command" ]] && return 0 @@ -343,7 +343,7 @@ _bpftool() obj=${words[3]} if [[ ${words[-4]} == "map" ]]; then - COMPREPLY=( $( compgen -W "id pinned" -- "$cur" ) ) + COMPREPLY=( $( compgen -W "id pinned fd" -- "$cur" ) ) return 0 fi if [[ ${words[-3]} == "map" ]]; then @@ -406,7 +406,7 @@ _bpftool() esac ;; map) - local MAP_TYPE='id pinned' + local MAP_TYPE='id pinned fd' case $command in show|list|dump|peek|pop|dequeue) case $prev in @@ -462,7 +462,7 @@ _bpftool() return 0 ;; innermap) - COMPREPLY+=( $( compgen -W "id pinned" -- "$cur" ) ) + COMPREPLY+=( $( compgen -W "id pinned fd" -- "$cur" ) ) return 0 ;; id) @@ -525,7 +525,7 @@ _bpftool() # map, depending on the type of the map to update. case "$(_bpftool_map_guess_map_type)" in array_of_maps|hash_of_maps) - local MAP_TYPE='id pinned' + local MAP_TYPE='id pinned fd' COMPREPLY+=( $( compgen -W "$MAP_TYPE" \ -- "$cur" ) ) return 0 diff --git a/tools/bpf/bpftool/map.c b/tools/bpf/bpftool/map.c index 768497364cee..9befcabc299d 100644 --- a/tools/bpf/bpftool/map.c +++ b/tools/bpf/bpftool/map.c @@ -125,6 +125,19 @@ int map_parse_fd(int *argc, char ***argv) NEXT_ARGP(); return open_obj_pinned_any(path, BPF_OBJ_MAP); + } else if (is_prefix(**argv, "fd")) { + char *endptr; + + NEXT_ARGP(); + + fd = strtoul(**argv, &endptr, 0); + if (*endptr) { + p_err("can't parse %s as fd", **argv); + return -1; + } + NEXT_ARGP(); + + return dup(fd); } p_err("expected 'id' or 'pinned', got: '%s'?", **argv); From patchwork Wed Mar 20 17:33:31 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alban Crequy X-Patchwork-Id: 1059426 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=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="QnZWe4g7"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 44PcX757ygz9sNN for ; Thu, 21 Mar 2019 04:35:51 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727437AbfCTRfq (ORCPT ); Wed, 20 Mar 2019 13:35:46 -0400 Received: from mail-ed1-f66.google.com ([209.85.208.66]:36483 "EHLO mail-ed1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727018AbfCTRfq (ORCPT ); Wed, 20 Mar 2019 13:35:46 -0400 Received: by mail-ed1-f66.google.com with SMTP id e4so2736883edi.3; Wed, 20 Mar 2019 10:35:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=gOntEnwdVMv2nWTdNHFeAl7MkTJs/Nh4RmrIjAmjfx4=; b=QnZWe4g7WJ70DLHmylklns8+OWOZLWasrWklAi7FesEPF5iwnBUDuekFH79v3WnVw4 xQTyL8wXOLU3hsosu0bUSNntmPyxS0pi/fmu2Q1RkbsX81ALG5Ha/k4hJOptkMQ0SHFb tZFETcl7VxDa214o2Wdok4C7ikXsz8+LK0fl5ATqKFSRR7e0QdoRW9Pb6lJEdQDfbtPp d/TCfxnFxNskWsWKb9ggB687dlFNZ8/z7qQF64ecI43CdI5kTeoqap5XXXqn1vfIcgo+ KqDPUXtBnnuk0e6zB20GqhOe6SK3w7L7jn/aPhQMBip1I1BHb7ToFa8mS5ZcfYv1GVAd 7oHg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=gOntEnwdVMv2nWTdNHFeAl7MkTJs/Nh4RmrIjAmjfx4=; b=AF31AcAqoIA/sLnhRS041gJtN/vhcz3tj07LwZvBp6tCYsXKmcKgieI4jj2MKlFrP8 zcwWwZ9y1IR8ss1WxuW++GBORK047JCuocRhRdAwnHqQpDMt/wBz0sNBIWPH+nGiggqF UP92HVIjK0WuAWpZc137YI6O+R47Ltak2u7OIxNI21+we4VX0fMFkOazX1nBetTsEfXi XHSx2RvVO3bPA53O6to5V1wQaGnPsiS6uYZuWCV+m80PZokT3Xwu7FLKc2j0Ris5/zH/ 2kwe7oGYi5C+aDi0ryCts56MyLq8oBaNaGEMotzXtDbTP5EscnwL7AX2R1DuYF86gOgn /pzg== X-Gm-Message-State: APjAAAXa0z5EiDZzrcOhAinxl8wtr5NhUc5kZaV3BfVdDKKcIdRGGjSF s97EF98HpZyantmBwWAVvXE= X-Google-Smtp-Source: APXvYqwhffRHsxsCi4vtuPGs7X4i1FQaLCLd5IFApXDuOvvIt0jQv44VptL0+vO+CEEy5hCOWOHH6Q== X-Received: by 2002:a17:906:6d8f:: with SMTP id h15mr17786831ejt.107.1553103344214; Wed, 20 Mar 2019 10:35:44 -0700 (PDT) Received: from neptune.fritz.box ([178.19.216.175]) by smtp.gmail.com with ESMTPSA id 5sm828606edp.50.2019.03.20.10.35.43 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Wed, 20 Mar 2019 10:35:43 -0700 (PDT) From: Alban Crequy X-Google-Original-From: Alban Crequy To: ast@kernel.org, daniel@iogearbox.net Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org, alban@kinvolk.io, iago@kinvolk.io, Quentin Monnet Subject: [PATCH bpf-next v1 6/7] tools: bpftool: fix bpffs mount when pinning subdirectories Date: Wed, 20 Mar 2019 18:33:31 +0100 Message-Id: <20190320173332.18105-6-alban@kinvolk.io> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190320173332.18105-1-alban@kinvolk.io> References: <20190320173332.18105-1-alban@kinvolk.io> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Alban Crequy When trying to pin at a path such as /sys/fs/bpf/subdir/mymap while the bpffs is mounted at the standard path and the "subdir" directory didn't exist, bpftool was failing and attempting to mount the bpffs on /sys/fs/bpf/subdir/. The mount obviously failed, since "subdir" didn't exist. Commit 3fc27b71b894 ("tools: bpftool: try to mount bpffs if required for pinning objects") says: The code for mnt_bpffs() is a copy of function bpf_mnt_fs() from iproute2 package (under lib/bpf.c, taken at commit 4b73d52f8a81), with modifications regarding handling of error messages. However, the function bpf_mnt_fs() from iproute2 only works when its parameter is the root of the bpffs (e.g. "/sys/fs/bfs"). iproute2/tc actually only mounts at the standard path "/sys/fs/bfs" or at the path from the environment variable $TC_BPF_MNT. This patch implements a similar strategy but uses the environment variable name $BPFTOOL_BPF_MNT. This patch still will not do the mkdir automatically. But at least, there will be no error message about the mount. Fixes: 3fc27b71b894 ("tools: bpftool: try to mount bpffs if required for pinning objects") Cc: Quentin Monnet Signed-off-by: Alban Crequy --- tools/bpf/bpftool/common.c | 20 ++++++++++++++++---- tools/bpf/bpftool/main.h | 6 ++++++ 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/tools/bpf/bpftool/common.c b/tools/bpf/bpftool/common.c index e560cd8f66bc..4783cbbe8037 100644 --- a/tools/bpf/bpftool/common.c +++ b/tools/bpf/bpftool/common.c @@ -168,6 +168,8 @@ int mount_bpffs_for_pin(const char *name) char *file; char *dir; int err = 0; + const char *mnt_env = getenv(BPF_DIR_MNT_ENV); + static const char *mnt; file = malloc(strlen(name) + 1); strcpy(file, name); @@ -183,13 +185,23 @@ int mount_bpffs_for_pin(const char *name) goto out_free; } - err = mnt_fs(dir, "bpf", err_str, ERR_MAX_LEN); + mnt = mnt_env ? : BPF_DIR_MNT; + + // Don't try to mount if wrong prefix: we don't want a leftover mount that is + // not going to help. + if (!is_prefix(mnt, dir)) { + p_err("refuse to mount BPF file system (%s) to pin the object (%s): wrong directory", + mnt, name); + err = -1; + goto out_free; + } + + err = mnt_fs(mnt, "bpf", err_str, ERR_MAX_LEN); if (err) { err_str[ERR_MAX_LEN - 1] = '\0'; - p_err("can't mount BPF file system to pin the object (%s): %s", - name, err_str); + p_err("can't mount BPF file system (%s) to pin the object (%s): %s", + mnt, name, err_str); } - out_free: free(file); return err; diff --git a/tools/bpf/bpftool/main.h b/tools/bpf/bpftool/main.h index 7fc2973446d0..a2e28e600b72 100644 --- a/tools/bpf/bpftool/main.h +++ b/tools/bpf/bpftool/main.h @@ -18,6 +18,12 @@ #define ptr_to_u64(ptr) ((__u64)(unsigned long)(ptr)) +/* If bpffs is not mounted, it can be automatically mounted at this location. + * The location can be changed with the environment variable $BPFTOOL_BPF_MNT. + */ +#define BPF_DIR_MNT "/sys/fs/bpf" +#define BPF_DIR_MNT_ENV "BPFTOOL_BPF_MNT" + #define NEXT_ARG() ({ argc--; argv++; if (argc < 0) usage(); }) #define NEXT_ARGP() ({ (*argc)--; (*argv)++; if (*argc < 0) usage(); }) #define BAD_ARG() ({ p_err("what is '%s'?", *argv); -1; }) From patchwork Wed Mar 20 17:33:32 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alban Crequy X-Patchwork-Id: 1059427 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=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="LORM5MVW"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 44PcXM2ng7z9sNk for ; Thu, 21 Mar 2019 04:36:03 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727197AbfCTRf6 (ORCPT ); Wed, 20 Mar 2019 13:35:58 -0400 Received: from mail-ed1-f66.google.com ([209.85.208.66]:45267 "EHLO mail-ed1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726897AbfCTRf5 (ORCPT ); Wed, 20 Mar 2019 13:35:57 -0400 Received: by mail-ed1-f66.google.com with SMTP id m16so2692369edd.12; Wed, 20 Mar 2019 10:35:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=yxkFxOstgye8P+oM5yJDIcooGGf5Gy5OyQ9cdtrDtq4=; b=LORM5MVW4Ay6Ye/3qm3rR2RJ/oaoijM+bjZ1jrK8t6o5euW+5qEvyenxUgZAvXvgpI nvNowIUCkLTdtqepEF+UTlQioY5fnos47wpsrdeQN9bXh+YAxNM5hxtm6H1BCENvO2Ii kET9YS7QBPE/o6HvaQ5+RUvLadAUw9wkDLsRjSCImPHbfaMpcnFHgP70sB80UKpoBK3K 3wg3X6HfvpeQy+obHzRrAGQVSZx6ICkOO+SOqcQ7vwMLd2fDKhaEGgqsWbxXcHhL9hzR Q77q/3umw6HD1Qx8gVOsurBP2B5v3hxVd4qJv2oagknRHj+cAl3VYOu225QxjV0CHU25 fjbA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=yxkFxOstgye8P+oM5yJDIcooGGf5Gy5OyQ9cdtrDtq4=; b=GsIzGL65KGsfgGBnnxJ8m8A51KGngVlJ/F4CfZ+UeaPxMSnSbB21rZfxVMgIsuxIB4 MnOnZWE3fWrS4Ic69fVhES//XC4bCKwiBHite1sRoqOiN60np/HDwTXpTB96G1iD5LBu CcQ4kml3TtgHTi3O+il5gVwQXmCSjQ8iu40WRpPRUsAPOo9cURj2iMZItf0xnQrvFA7C bUCnEwJMnYiA4ErHNDF1yzgLa9RPSJVN8Y6gBofBeWC/O9kZ1GGIetF+Gnra4L8hOMYV +nydbuCrTtuAm18rhrBOSVMh9NLqk26yqqmrZNMt2+GwxJ2txnAFwS0O8Ihrn7RvTWsE MlAQ== X-Gm-Message-State: APjAAAXD03cfD5vXHX7GlVhZXDi4vKqZYsCst1wP3g0TPyPHVLnJ7s5e BTHy0N2S/bZhnoi+ycIQmsM= X-Google-Smtp-Source: APXvYqxfnpN6jzM92LPKcFqrTc0aQjMfs0y3c+5e7+ygniaCMzYTeVX8FxqSt2hBMtVu+8w9KUXDyA== X-Received: by 2002:a50:be05:: with SMTP id a5mr20795439edi.87.1553103355859; Wed, 20 Mar 2019 10:35:55 -0700 (PDT) Received: from neptune.fritz.box ([178.19.216.175]) by smtp.gmail.com with ESMTPSA id 5sm828606edp.50.2019.03.20.10.35.54 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Wed, 20 Mar 2019 10:35:54 -0700 (PDT) From: Alban Crequy X-Google-Original-From: Alban Crequy To: ast@kernel.org, daniel@iogearbox.net Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org, alban@kinvolk.io, iago@kinvolk.io Subject: [PATCH bpf-next v1 7/7] tools: bpftool: add error message on map pinning failure Date: Wed, 20 Mar 2019 18:33:32 +0100 Message-Id: <20190320173332.18105-7-alban@kinvolk.io> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190320173332.18105-1-alban@kinvolk.io> References: <20190320173332.18105-1-alban@kinvolk.io> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Alban Crequy Symptoms, when "dir" does not exist: $ sudo bpftool map create /sys/fs/bpf/dir/fooB type hash key 8 value 8 entries 8 name fooB flags 1 $ echo $? 255 This patch prints an error message when the map pinning fails. Signed-off-by: Alban Crequy --- tools/bpf/bpftool/map.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tools/bpf/bpftool/map.c b/tools/bpf/bpftool/map.c index 9befcabc299d..c825eb1bbf8f 100644 --- a/tools/bpf/bpftool/map.c +++ b/tools/bpf/bpftool/map.c @@ -1305,8 +1305,10 @@ static int do_create(int argc, char **argv) err = do_pin_fd(fd, pinfile); close(fd); - if (err) + if (err) { + p_err("failed to pin map to %s", pinfile); return err; + } if (json_output) jsonw_null(json_wtr);