Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753532AbdLMPU2 (ORCPT ); Wed, 13 Dec 2017 10:20:28 -0500 Received: from mx0b-00082601.pphosted.com ([67.231.153.30]:40921 "EHLO mx0a-00082601.pphosted.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1753247AbdLMPTq (ORCPT ); Wed, 13 Dec 2017 10:19:46 -0500 From: Roman Gushchin To: CC: , , , , , , , Quentin Monnet , David Ahern Subject: [PATCH v4 net-next 3/4] bpftool: implement prog load command Date: Wed, 13 Dec 2017 15:18:53 +0000 Message-ID: <20171213151854.21960-4-guro@fb.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20171213151854.21960-1-guro@fb.com> References: <20171213151854.21960-1-guro@fb.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [2620:10d:c092:180::1:f726] X-ClientProxiedBy: DB6PR07CA0138.eurprd07.prod.outlook.com (2603:10a6:6:16::31) To BL2PR15MB1075.namprd15.prod.outlook.com (2603:10b6:201:17::9) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: fed15413-af19-41b8-74a1-08d5423ce334 X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(4534020)(4602075)(4627115)(201703031133081)(201702281549075)(5600026)(4604075)(2017052603307);SRVR:BL2PR15MB1075; X-Microsoft-Exchange-Diagnostics: 1;BL2PR15MB1075;3:8UR0ntA57hfZCGy8e224xMDZfHT74m5uQjO+XFpXxwr1nMTylKiW4b1j7fTBUr9WljVMLe3GigJJ9S7s+FCR5ngTrqiBuhF0JQzdsWkViRUflg2PJmazF9Cg6Tbf0icuOYxmwwa/zdmoDsi+1k2xP7BHX4SRX3YAfZg6HvUSQAHFqo2ENsG/YnxYlYjQfCtOwVnMucw+UGtMdnpilxRfvfJedMSWU9DbgbBz2Zn+q9nvHzzhcYTNQaBMB4VuffrD;25:CN2u9SAM8nYxgGVtvHfnzzp/16+JUeU6jFw67liOSFm+o862E4uvH3VKvteilu3S7PPtfNH5UJhBxBLbdMw1MxBjxUJ10r82nemg4dHWqzTtDITlFCHogcdL4hu4Iu/AoZYG3Iylft3DfcRrKCuuM45nsbmAnkcW65+sO9uIzUS64jSKpi92hS6mcqrpJWdEwTNw9S48shSf7pLDIE8XVwq6V0impbPRKR5c6Av/pMVKN9KjtdDpH6CKqpf90Oyig2Mww1BBQ5T33wWkTcbZ8/6Bb6GmnFNjr45sa23DL0g+WDseIfQcEKEGPc4W/69MSa17e39PidHWPWLHuzvVeg==;31:4DEGsbYWGAjiP2MiIXo/2E4w86KgBmX8TeeqxyCbfeF5vG7cp1YWN3nm01oz+QPn/3VmWnXRmADvt6fbfX9PO8HXYzL1J7oUmK0CubqhDepJhttIH6creeYyw3UtjQJzcimjLx8Sp5RXEC7bKhjxcNBL4pSl71euZO+livS5DSqhkYG60WAt9YeM495M+g2AXzznOkxzIeb8GFa5gQS2UOBrZp9HvBM+YZ5llPGiKHA= X-MS-TrafficTypeDiagnostic: BL2PR15MB1075: X-Microsoft-Exchange-Diagnostics: 1;BL2PR15MB1075;20:2mH+l3BbG1qCw06PxVeNkr0mdE2ic03sRwnQZTSez6hP9Vsce6L7eODC+9aYlDV9R9Os+HCyFcvRc/Cry4vetPgBR5MT3IP3gZsoJTtUpYr6T9H4tHKVyQttKDObTruqfuBwGuMzF6mRRkL9k4hg9Jx7mbrUHYpkYeCYTS+qS0ldvvfDx01KW4gDZ4L3Rdm6HkyT9BUrKYXT796vOdz8qq7wySFIe7UqhTFPQWIBT0qWXKMlbnri4jAOBZwWRpkl+eHqt37FYl3fRW1MPyaO68nIx+gvNOTCQbHiwwFgwloqE0GcGC1AZUECG4BOoSB9kWW72sSvFJFl2B2A335dMTB9g/OWY1HWzHmQ22jdz4yGexJMv2lkzluSyGCQpa7UsDcz68zIv1fGsbDlCqidfp2c9DzpraF+JHdqr//FNq0lsor9aqUU2OeTfA2FOtHnzvncs9IAkLcnbvYCG56tkGo5zs9GhOUklZWjKVW+QBpR41U1xxuci8OLnZodReIW;4:+lOeDnVyLFJ1SOrq2aHnNVKJD5krl+w8933wFb7BHEUPu0YZj2YrvMIcCkd8Mi2iIxCh7CJeLLlZdiMIs1Ln7AUy6BRfILwXK5xWrz+YEgAwwyaCOP8w2Gcb0vCrwu8uBEMztFMTcdQ36p0yo3i6Wi6dnPZqWZBPVNolelsFDn2JQ5nPPkf5IfLeIPXKkAYC1Gw7i+jla2i084GykGzrwi1v7DPFdPFHcgTNENtt7h/Y8lDGLTCCMZ8sVOU+v27eSI7uBamoCD1L8q2LxBhzD0AUIMFeb9jCG126XkNPHyrYQMOHXrJHYta1EoEQbMF7 X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(67672495146484); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040450)(2401047)(5005006)(8121501046)(3002001)(10201501046)(3231023)(11241501184)(93006095)(93001095)(6041248)(20161123564025)(20161123555025)(20161123558100)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123560025)(20161123562025)(6072148)(201708071742011);SRVR:BL2PR15MB1075;BCL:0;PCL:0;RULEID:(100000803101)(100110400095);SRVR:BL2PR15MB1075; X-Forefront-PRVS: 052017CAF1 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(346002)(39860400002)(376002)(366004)(199004)(189003)(48376002)(7736002)(52116002)(6512007)(6116002)(1076002)(305945005)(5660300001)(53936002)(52396003)(68736007)(39060400002)(50226002)(4326008)(51416003)(8936002)(386003)(6506007)(8676002)(25786009)(81156014)(575784001)(478600001)(2950100002)(6916009)(2351001)(2361001)(316002)(59450400001)(81166006)(86362001)(6666003)(50466002)(54906003)(16586007)(69596002)(47776003)(97736004)(36756003)(76176011)(106356001)(6486002)(2906002)(53416004)(105586002)(42262002);DIR:OUT;SFP:1102;SCL:1;SRVR:BL2PR15MB1075;H:castle.thefacebook.com;FPR:;SPF:None;PTR:InfoNoRecords;A:1;MX:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;BL2PR15MB1075;23:ohbWHa8mw5/wOVY2Yfe69Bw8u+OMjIc7yAp+xzKsZ?= =?us-ascii?Q?OClpaOuejIIyqnCGy1pWqyF8DxPQWiuwiJcsKKJf+iTaY61HLW7pOziEEM01?= =?us-ascii?Q?r7oSO6/zQ5JYNSOF3lSSGl8V5RmRxvy8Up/3jdyNJhFZnnjOrTLlzd9NtG79?= =?us-ascii?Q?KMx3foNdSvx8SOUHmSD71Bq93YrBL2Yu8/BFGIDg1Tm/keK8Zt7R4HXSCPFX?= =?us-ascii?Q?J91smZxXQBIQ194WXm9iqNq8KYWVBzOBiKCxjTO1k7lnaQNxZ/SM8nRfOsXD?= =?us-ascii?Q?OnEAZor0JdOjq46rcgexR+eQ+L/sCxvvv/A6tuSUQRw5P4x51YYgpRpDnoOf?= =?us-ascii?Q?Qlm8UbvcVKPNsBFS/H14YWmxLDKlpiG2QCTSXjlew/HvHnqDW4nRzIbfKHQY?= =?us-ascii?Q?RpQiSa1jN4pScMgt4CFH3d3ACO0kG3S5i8Mb88ixjX2/db3hR8QzXJ7UEXmh?= =?us-ascii?Q?Wefc+CJ3oQkeRfzAnK1ebKKUmWYvjVWHBrqUtiKoo674WQfU0Jd6Oxhc6MpM?= =?us-ascii?Q?GpT47R3tVKLLIyLRFNZh49tb8jdliDcU1QdzR7w1V62IpEqZv345Jbox1yTO?= =?us-ascii?Q?YBjQP/5YmeDYvIWDGQbljvcOLnVcnNIRFj8YV170n85QjHA1BOiAOJCBQ89G?= =?us-ascii?Q?RQP+/dBI2T6O115ggrWgT0XAMtPh05p3FkjrZhAuDCtf7f4+S7OVRrQp7cJg?= =?us-ascii?Q?Gbyvjk0Oanda8B8Ouut5EUfF3JVLxv+ufRudUoiDrFvzKkJ/7GM71jouqy7J?= =?us-ascii?Q?8AU2HS4DANWhNcDjfpwv8fjYvrpKhEUEeOuUhUQvTO+VFVAKey28b1tuCQNs?= =?us-ascii?Q?K1RqmPIz3loBkhI2GBym9uP82n/bjSi3tLj7jM45I0NzF0rBjVszWw/Fh9PR?= =?us-ascii?Q?4RI6iOmXbLTu3DJ2sHgTqt7g7kjD/WMg2O3EPR3l6zPTzfTtYv/c7i2KhbH3?= =?us-ascii?Q?k5fBV+SGMa2gizl7ddEVcp+FR5ifrYo5oDdnMH65rnY4mnwW5PfK776pUJ3T?= =?us-ascii?Q?diIFIFblMdZLhiPUpBlXjoybx5Rl4z91hPm2b/qUVhRp4YV7uDwIk+fhXYko?= =?us-ascii?Q?jvOmYKB0tdc8qRN27DltKkivdNmO3zjEDyOQvPKZWwh6TH36VYs6WbfDsVpf?= =?us-ascii?Q?WMsiprIJAjbNliqOPMObYJ37n4zBOwR7xRKnwh1/wOog15s4PKgf0GfzyzCf?= =?us-ascii?Q?z/v5pOYoqq4lswKl+8B1XFx5bDdUUkoReru?= X-Microsoft-Exchange-Diagnostics: 1;BL2PR15MB1075;6:neS9l+c125ec7XFXBCWCxKUEgm70xEqNKJFGbfMfFKXzJgmzG/81C3w8T/z0N4ujPgynVi035k/LDTvD4RLExkIrfVACnhhct0fPuxSdPc9n4c01eAN1J1chvkTmW3v1oJ3YoEoNhxBOsAK/iWGtNyv0JH5BdVD4PP+woFS6SvodHbr7+AN/OTWd+R4/xiOKzH6XyeROgImZfKc3hp+na3c6SgDzoYmvNtmtOXuLg0mSNU6S7bIw5Ij/YDPxrGv49fgOdWSaZziXB2wkVjKHkb+VL1Y3uhuMKMrHb48uOVddGwc7pfZ06ZUu1LLIHfFQe+3Y+BOhiCX62Erl+QPLARX0via2i3ZzB/MPKd6q1FM=;5:eEwcDVTv11LvVeptrayGGJmQpyT0gvsDn8rt/YWAZ4bf1gNxHmtt5PoX3uvrAGXKBM5HnC1wt4KTT7qtYgO03fffo8TrFzo9z9U8KjkFofGRrf9SscoasHEdWvTI29ZU7Fl2FRakFygZeyl6Qts98JOUWQ9BWGBCeuJV70hFmRw=;24:bqlUYU6axRN270uXUg7mInSQCswcBW/OFsKk3CFQ5W3LDifv/eqagVmMBzI9i0wDtaX6xs13aZJXJpHTWhNDgPRWW2JHJiSYkHMoMBnvUWo=;7:BXuI7N0/H1s7jvA5Lje8agxcNHqCc98szmiYfOo66wbn32hDY9z2IH8Y8VMuwxobrbWy7sOqTZBFVaDFPFIyNw1ZgKxsB3y7p7j/+/ZiPif1KAs23FJoZtIbL8tngbfcRZfclBbRx0Ce+h3HI4Zvla9NQZE7LvM4qjFu4K73N/n1URQiOhLBiZ/3F2YWBoSyLiitJ/YllSvYdJAHgt+M7pTNlabv9GZDXci7A8rtPdMfnsO9CoCA8g3OOYwEawol SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;BL2PR15MB1075;20:jEQTVCVnZjPla9FTx6lFyNvEUD5QHmab8RkO5ZtEJ7kZAQ20VoxvhjxoP4aeuwV05+8lx3bl9eML2fVpoXyxOjmNvTjera26I7lgzwI6W1nUr0AL/BDTHmCt7gzSQaXp+lg3MZyqOu1LiZM7CIvUJNYWGIknLmoprj756G4PgPM= X-MS-Exchange-CrossTenant-OriginalArrivalTime: 13 Dec 2017 15:19:20.3879 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: fed15413-af19-41b8-74a1-08d5423ce334 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 8ae927fe-1255-47a7-a2af-5f3a069daaa2 X-MS-Exchange-Transport-CrossTenantHeadersStamped: BL2PR15MB1075 X-OriginatorOrg: fb.com X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:,, definitions=2017-12-13_07:,, signatures=0 X-Proofpoint-Spam-Reason: safe X-FB-Internal: Safe Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 7290 Lines: 258 Add the prog load command to load a bpf program from a specified binary file and pin it to bpffs. Usage description and examples are given in the corresponding man page. Syntax: $ bpftool prog load OBJ FILE FILE is a non-existing file on bpffs. Signed-off-by: Roman Gushchin Cc: Alexei Starovoitov Cc: Daniel Borkmann Reviewed-by: Jakub Kicinski Cc: Martin KaFai Lau Cc: Quentin Monnet Cc: David Ahern --- tools/bpf/bpftool/Documentation/bpftool-prog.rst | 10 +++- tools/bpf/bpftool/Documentation/bpftool.rst | 2 +- tools/bpf/bpftool/common.c | 71 +++++++++++++----------- tools/bpf/bpftool/main.h | 1 + tools/bpf/bpftool/prog.c | 29 +++++++++- 5 files changed, 79 insertions(+), 34 deletions(-) diff --git a/tools/bpf/bpftool/Documentation/bpftool-prog.rst b/tools/bpf/bpftool/Documentation/bpftool-prog.rst index 36e8d1c3c40d..ffdb20e8280f 100644 --- a/tools/bpf/bpftool/Documentation/bpftool-prog.rst +++ b/tools/bpf/bpftool/Documentation/bpftool-prog.rst @@ -15,7 +15,7 @@ SYNOPSIS *OPTIONS* := { { **-j** | **--json** } [{ **-p** | **--pretty** }] | { **-f** | **--bpffs** } } *COMMANDS* := - { **show** | **dump xlated** | **dump jited** | **pin** | **help** } + { **show** | **dump xlated** | **dump jited** | **pin** | **load** | **help** } MAP COMMANDS ============= @@ -24,6 +24,7 @@ MAP COMMANDS | **bpftool** **prog dump xlated** *PROG* [{**file** *FILE* | **opcodes**}] | **bpftool** **prog dump jited** *PROG* [{**file** *FILE* | **opcodes**}] | **bpftool** **prog pin** *PROG* *FILE* +| **bpftool** **prog load** *OBJ* *FILE* | **bpftool** **prog help** | | *PROG* := { **id** *PROG_ID* | **pinned** *FILE* | **tag** *PROG_TAG* } @@ -57,6 +58,11 @@ DESCRIPTION Note: *FILE* must be located in *bpffs* mount. + **bpftool prog load** *OBJ* *FILE* + Load bpf program from binary *OBJ* and pin as *FILE*. + + Note: *FILE* must be located in *bpffs* mount. + **bpftool prog help** Print short help message. @@ -126,8 +132,10 @@ EXAMPLES | | **# mount -t bpf none /sys/fs/bpf/** | **# bpftool prog pin id 10 /sys/fs/bpf/prog** +| **# bpftool prog load ./my_prog.o /sys/fs/bpf/prog2** | **# ls -l /sys/fs/bpf/** | -rw------- 1 root root 0 Jul 22 01:43 prog +| -rw------- 1 root root 0 Jul 22 01:44 prog2 **# bpftool prog dum jited pinned /sys/fs/bpf/prog opcodes** diff --git a/tools/bpf/bpftool/Documentation/bpftool.rst b/tools/bpf/bpftool/Documentation/bpftool.rst index 926c03d5a8da..f547a0c0aa34 100644 --- a/tools/bpf/bpftool/Documentation/bpftool.rst +++ b/tools/bpf/bpftool/Documentation/bpftool.rst @@ -26,7 +26,7 @@ SYNOPSIS | **pin** | **help** } *PROG-COMMANDS* := { **show** | **dump jited** | **dump xlated** | **pin** - | **help** } + | **load** | **help** } DESCRIPTION =========== diff --git a/tools/bpf/bpftool/common.c b/tools/bpf/bpftool/common.c index 2bd3b280e6dd..b62c94e3997a 100644 --- a/tools/bpf/bpftool/common.c +++ b/tools/bpf/bpftool/common.c @@ -163,13 +163,49 @@ int open_obj_pinned_any(char *path, enum bpf_obj_type exp_type) return fd; } -int do_pin_any(int argc, char **argv, int (*get_fd_by_id)(__u32)) +int do_pin_fd(int fd, const char *name) { char err_str[ERR_MAX_LEN]; - unsigned int id; - char *endptr; char *file; char *dir; + int err = 0; + + err = bpf_obj_pin(fd, name); + if (!err) + goto out; + + file = malloc(strlen(name) + 1); + strcpy(file, name); + dir = dirname(file); + + if (errno != EPERM || is_bpffs(dir)) { + p_err("can't pin the object (%s): %s", name, strerror(errno)); + goto out_free; + } + + /* Attempt to mount bpffs, then retry pinning. */ + err = mnt_bpffs(dir, err_str, ERR_MAX_LEN); + if (!err) { + err = bpf_obj_pin(fd, name); + if (err) + p_err("can't pin the object (%s): %s", name, + strerror(errno)); + } else { + err_str[ERR_MAX_LEN - 1] = '\0'; + p_err("can't mount BPF file system to pin the object (%s): %s", + name, err_str); + } + +out_free: + free(file); +out: + return err; +} + +int do_pin_any(int argc, char **argv, int (*get_fd_by_id)(__u32)) +{ + unsigned int id; + char *endptr; int err; int fd; @@ -195,35 +231,8 @@ int do_pin_any(int argc, char **argv, int (*get_fd_by_id)(__u32)) return -1; } - err = bpf_obj_pin(fd, *argv); - if (!err) - goto out_close; - - file = malloc(strlen(*argv) + 1); - strcpy(file, *argv); - dir = dirname(file); - - if (errno != EPERM || is_bpffs(dir)) { - p_err("can't pin the object (%s): %s", *argv, strerror(errno)); - goto out_free; - } + err = do_pin_fd(fd, *argv); - /* Attempt to mount bpffs, then retry pinning. */ - err = mnt_bpffs(dir, err_str, ERR_MAX_LEN); - if (!err) { - err = bpf_obj_pin(fd, *argv); - if (err) - p_err("can't pin the object (%s): %s", *argv, - strerror(errno)); - } else { - err_str[ERR_MAX_LEN - 1] = '\0'; - p_err("can't mount BPF file system to pin the object (%s): %s", - *argv, err_str); - } - -out_free: - free(file); -out_close: close(fd); return err; } diff --git a/tools/bpf/bpftool/main.h b/tools/bpf/bpftool/main.h index bff330b49791..bec1ccbb49c7 100644 --- a/tools/bpf/bpftool/main.h +++ b/tools/bpf/bpftool/main.h @@ -111,6 +111,7 @@ char *get_fdinfo(int fd, const char *key); int open_obj_pinned(char *path); int open_obj_pinned_any(char *path, enum bpf_obj_type exp_type); int do_pin_any(int argc, char **argv, int (*get_fd_by_id)(__u32)); +int do_pin_fd(int fd, const char *name); int do_prog(int argc, char **arg); int do_map(int argc, char **arg); diff --git a/tools/bpf/bpftool/prog.c b/tools/bpf/bpftool/prog.c index ad619b96c276..037484ceaeaf 100644 --- a/tools/bpf/bpftool/prog.c +++ b/tools/bpf/bpftool/prog.c @@ -45,6 +45,7 @@ #include #include +#include #include "main.h" #include "disasm.h" @@ -635,6 +636,30 @@ static int do_pin(int argc, char **argv) return err; } +static int do_load(int argc, char **argv) +{ + struct bpf_object *obj; + int prog_fd; + + if (argc != 2) + usage(); + + if (bpf_prog_load(argv[0], BPF_PROG_TYPE_UNSPEC, &obj, &prog_fd)) { + p_err("failed to load program\n"); + return -1; + } + + if (do_pin_fd(prog_fd, argv[1])) { + p_err("failed to pin program\n"); + return -1; + } + + if (json_output) + jsonw_null(json_wtr); + + return 0; +} + static int do_help(int argc, char **argv) { if (json_output) { @@ -647,13 +672,14 @@ static int do_help(int argc, char **argv) " %s %s dump xlated PROG [{ file FILE | opcodes }]\n" " %s %s dump jited PROG [{ file FILE | opcodes }]\n" " %s %s pin PROG FILE\n" + " %s %s load OBJ FILE\n" " %s %s help\n" "\n" " " HELP_SPEC_PROGRAM "\n" " " HELP_SPEC_OPTIONS "\n" "", 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; } @@ -663,6 +689,7 @@ static const struct cmd cmds[] = { { "help", do_help }, { "dump", do_dump }, { "pin", do_pin }, + { "load", do_load }, { 0 } }; -- 2.14.3