From patchwork Thu Dec 7 18:39:08 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Roman Gushchin X-Patchwork-Id: 845764 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@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; dkim=pass (1024-bit key; unprotected) header.d=fb.com header.i=@fb.com header.b="e0796Zi2"; dkim=pass (1024-bit key; unprotected) header.d=fb.onmicrosoft.com header.i=@fb.onmicrosoft.com header.b="GK7SLyg6"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3yt47b3VTJz9s71 for ; Fri, 8 Dec 2017 05:41:15 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752844AbdLGSkg (ORCPT ); Thu, 7 Dec 2017 13:40:36 -0500 Received: from mx0b-00082601.pphosted.com ([67.231.153.30]:41334 "EHLO mx0a-00082601.pphosted.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752705AbdLGSkJ (ORCPT ); Thu, 7 Dec 2017 13:40:09 -0500 Received: from pps.filterd (m0001255.ppops.net [127.0.0.1]) by mx0b-00082601.pphosted.com (8.16.0.21/8.16.0.21) with SMTP id vB7Icoem011658; Thu, 7 Dec 2017 10:39:54 -0800 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=fb.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-type; s=facebook; bh=zAfH2tUirOiYMujsh301XcfLE+VfBBnZ+bXj0e+Jf0I=; b=e0796Zi2HRXCA6dvLJXHpzfHpXByoPRBuVTDZu9oVNJCMz3fvC4gbMbxPx5yekRnBAzr 2LP8Hhs7VMgcWRUEIhFSlgOl1+w5oSZ+Gj5JvDrvEeItgY7/j/+sV/zgwnhHqUfn9Nz9 Tnf+AFl2qhCLjz96bZUStFWUhtVGFbQDoLs= Received: from maileast.thefacebook.com ([199.201.65.23]) by mx0b-00082601.pphosted.com with ESMTP id 2eq8hhrqk4-3 (version=TLSv1 cipher=ECDHE-RSA-AES256-SHA bits=256 verify=NOT); Thu, 07 Dec 2017 10:39:53 -0800 Received: from NAM02-CY1-obe.outbound.protection.outlook.com (192.168.183.28) by o365-in.thefacebook.com (192.168.177.33) with Microsoft SMTP Server (TLS) id 14.3.361.1; Thu, 7 Dec 2017 13:39:52 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=fb.onmicrosoft.com; s=selector1-fb-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=zAfH2tUirOiYMujsh301XcfLE+VfBBnZ+bXj0e+Jf0I=; b=GK7SLyg6EjIwWmTc8mNyjHdF4kQEL1pGUVH863l4tGI51HZWL43bj8fyGHG2GZ7f/O38sO5eW5lMRYSxiU4OGbxfmXAv7hxruIm//77+ir3pN5EP0N8n1W7eZyYJ2vzs/rvjb3/1ct1uiXIKsbmI58LK9z3Up756Zo9ixzcqzkY= Received: from castle.thefacebook.com (2620:10d:c092:200::1:e273) by CO1PR15MB1079.namprd15.prod.outlook.com (2a01:111:e400:7b66::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.302.9; Thu, 7 Dec 2017 18:39:40 +0000 From: Roman Gushchin To: CC: , , , , , , , Quentin Monnet , David Ahern Subject: [PATCH v2 net-next 3/4] bpftool: implement prog load command Date: Thu, 7 Dec 2017 18:39:08 +0000 Message-ID: <20171207183909.16240-4-guro@fb.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20171207183909.16240-1-guro@fb.com> References: <20171207183909.16240-1-guro@fb.com> MIME-Version: 1.0 X-Originating-IP: [2620:10d:c092:200::1:e273] X-ClientProxiedBy: AM0PR0202CA0031.eurprd02.prod.outlook.com (2603:10a6:208:1::44) To CO1PR15MB1079.namprd15.prod.outlook.com (2a01:111:e400:7b66::9) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: d82131a0-b2c7-4494-439e-08d53da1e1d9 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(5600026)(4604075)(4534020)(4602075)(4627115)(201703031133081)(201702281549075)(2017052603286); SRVR:CO1PR15MB1079; X-Microsoft-Exchange-Diagnostics: 1; CO1PR15MB1079; 3:BjuXr9GKlpPxlz9At3MnBW+Me6OQxPRqw2i1gfMfSvnuVb+U15ygwu/J5zq2vpBDP4oQRm2qv10VbG/gbKjQeoz62qH66z8GZj1FQwDulICfC5eo4B9hGWsPu34qjfamSD+dN+trAigVAmXTcQDA+bE6wGehLuMOc5Of9Y//D1Q2w/lGMii9SNF9Z4qBUAGNzl9y/cE1hpotmxERP/VUhap63/T3KcrK2YrYxBFKJHD8EklbTefu2U4Yc2OMgvov; 25:MgetaA5T+FchB47FJKYLP2ZZOBeRUPyXoW/rZn7A7CX2sgyBWzqLq96lIBa0N8O0F51SeKs0YGDAIgQ2fVpiLgM7H676VmY6Hiris1qYSIoD06asy9zBXDGDNI6H3Iw6CjwyDpHTd1Jrj3feNaDbByKpQ3qv8pP9Lyyd5sWEPOvvtDDt2ceMIFObIpOtv1kJ6IIRMP1AbXNttjpyohdqq1WEzu/uxtuCQx5mBahfWqBpOVs0gx+bT2F8ZsGdRoYp9eIlOY/0yk47d3ffmp7Ot0StDLJgFjJIf2dyQaAUPUJ55BVs6Pd2U86cG3CjZ5faI5wAFHSYund3XkZ4VdK8zg==; 31:DGyopnCp1iR0Z/7drj8fj/3nad07lF/zT8L8CZZwYDaSXmDmXH/nhTLMj8J6vTfx1ZkSrdoNej0IHp92a8n+Eq2Vt59tL5/3ngctXbuMeMRJZTIkDXI82XXYoNOasjx3Q2e0EwYycrXjis3EszADM9+nKq+XW7YaFRqUTGzQGpCHv148K8VtNE5y+wqKgQcdJnmF9l1S4Sh3Vf8NoaIdoEjBhSqZzYfPlb3buahYycE= X-MS-TrafficTypeDiagnostic: CO1PR15MB1079: X-Microsoft-Exchange-Diagnostics: 1; CO1PR15MB1079; 20:u9V3/oxau5KTsnmmZrqc/pp091rrXYSL1jJooSsZ/vYMLmhaWyu57akdgnxAY9j2H84AQgG6XDMpbUvxkNCUf0XUWG/TdM+oveQEWfujQgfMhiS7q7rH2BMC/ir68sYJ4h9vvL7kmE1+hFw9wgGXC8of5PMMlWeeeRCcEmPGRWrM4CDZyVocutAUmtkGUnkLu6eq5ge8kMhgxjO7pBqDc5IOrKnnLdoV8doINqVGuNzZ6abfoChO4XoQL1DWtQNYs7qR9FkAH34AZ8VaNyq+aUFGe7OLA5m+Q/nFvCyX7C0+ZYFV6qRPpLSNXPKyg0vthub6phVmHUfD02ijLTyUdWPDeNVxAq0jxCWxiJcKeJzbgH/d+7PTe6SZ4mPxxqbYspq0doj6kvhMy25i8QLZ4lHJvzSAv7ariGgYMmH40QHmI2559HxCqXice2d3FF9usY6CWj9lonjOqjP18g+q6i8FeloWU5nd5D/DIFqTAoyYS1w6SWlvGd7SGe6ZNWJ4; 4:m6fqJe9o4OR8Pocxqrs79ykQt9W/IGIye8xiub1Zidjm+OxMbP4Ib0jqaP6hPgkdTBe8Mam5D2ofBXOXznOy95KQQOEjwfTDstRiLjVAwiNM3rP6xLL5cswmEOzeBA5SSnCsAmf1pt/74fBn9To4+zAWwIwz6asEka5e1kBdMMmcEXDHtuXoOHhh31ROmuzOd6dvWn1XmRuarHAq7oibDyBe0RqCuoOvuh+kATPT67momugxTD25rFN7qefH7d3ErcPKnYYuT+SCBojEGVh4Nx8bg2BFqmjgJMR37K4tN7YVSq3kRoGOhlfsZflhgLs0 X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(67672495146484); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(11241501159)(6040450)(2401047)(8121501046)(5005006)(93006095)(93001095)(10201501046)(3231022)(3002001)(6041248)(20161123560025)(20161123562025)(20161123555025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123564025)(20161123558100)(6072148)(201708071742011); SRVR:CO1PR15MB1079; BCL:0; PCL:0; RULEID:(100000803101)(100110400095); SRVR:CO1PR15MB1079; X-Forefront-PRVS: 05143A8241 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(39860400002)(366004)(346002)(376002)(199004)(189003)(101416001)(52116002)(6506006)(6486002)(8936002)(52396003)(478600001)(6512007)(97736004)(16586007)(316002)(36756003)(69596002)(6116002)(1076002)(5660300001)(6916009)(2950100002)(53416004)(54906003)(81166006)(81156014)(8676002)(305945005)(7736002)(105586002)(106356001)(33646002)(50226002)(76176011)(2361001)(68736007)(2351001)(25786009)(6666003)(50466002)(47776003)(48376002)(2906002)(4326008)(575784001)(51416003)(86362001)(39060400002)(53936002)(42262002); DIR:OUT; SFP:1102; SCL:1; SRVR:CO1PR15MB1079; H:castle.thefacebook.com; FPR:; SPF:None; PTR:InfoNoRecords; A:1; MX:1; LANG:en; Received-SPF: None (protection.outlook.com: fb.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: 1; CO1PR15MB1079; 23:98ttoaHyT2oHAv5dOyWJRKqpjL6B5NTgC/hsN1JSpy/uefq18WW60Q+5cbmI7dfMb8RFzZ679YnRhsVb9fs2UHHyCHCy1afsm/j518YEmWwmFn0UPVEydVNibVVLuQO9DDISQnz06t6icB0hLccOVGhPVHqyk1nK7plotJkyLtzPdrUhEQyfdbT3ScchVDVXdF0gqxfp09u1izI0HcZ/ekGhhqfJ0zxXy6XLdEiX1rLQFmmnhFCvz2p36TnY48MZ8cFiwfry9L6YD63reta46CrdvLrmFJR6tqBFqRT/QpV3EYdV1S4IIwiLADO270kEKzTrtzS9mpaFNKQaOBuQntGdZTGNW0GLpBjIq0F8w98LuVxM/9SUBExQM+MBQDGQNt4bUpkFxvzWrTeQK8ZrI2DvK+4KTQiiLN2bKVmkIv9plSZAU5Bz6b3d0mTTaaAQwgbLcW7gLC3x6Rx2qGF9JXYV9XH/HXNTm8g8vbIRQSdSwNNLlcUrvqZHPgf3rYMihpleMrNzPzjs5Y4UmIcRs6GQmWbVxQFLkvAsSRdHTQ0zdlhBN6mwapz2U8B+KSyAKlLHhu54CZQS1kk4RLDHgoM6PQfkpCL06U69wARYd3jSc8JYlUaI1MTFdSx81eXKpVzsg39+OI8CzcAi9wJaaQjlhWngq3WPFpRp/XT3oi77sJ2j5GRUxvJjlHy5xX3OXMdLd3SMWvBcrH/Y41DOl0w9ecsXSOT/8lb7kIYIbjWVoa/1d5uicMi4xgRTOrpC9Jt6kl4gTbXMTyOfkhO2ExQ7aF6cxi0ziKOLubTuETXGZF0ISrkC3dCyrfXX5/fBob4u41L2uMO0/9FB2S7P4GAw5lHH7B3utzCDI8hSEvtCE8XTxk2RqAfr6PmfLs+H72fRu18bsCk+pmbxMYClaBULQiOwnw1/mz9RF2Z4lV8xS/M594EUOsJRaBU3mAUbVbn2STKLcLnXNvTznAwcE2iURJ+BicabTjfy0OW0F9iqCD2SWm92xCID3WlKnHnJG4B+nNR+natWo2kqkJqCHyX9RGKak8QOMpqGjafAm7U+SukBOpxDXUVJs+vnMmdqNhdG4ik+zd9QyLB5WG3AgfxoTlZ9LRNHmjVEM1pZ/uxhck+BnssJZjBSYcATdG05qlKQacID2HATkoEeWapNp3r7cSzFcerlSaTVTwe6Qu5QdlXw5GQH3ddxIjlfsBJB X-Microsoft-Exchange-Diagnostics: 1; CO1PR15MB1079; 6:MgpM4GZS0znySUg50K979KG3nizMjdF4BpgBm/cjChi+wf3+Nt6TaY7rOgialsRZWNWbglkHanAcQLjQLgOfES5+NbZdV2jmEXbWiB7Ln3Sin3BwcJPt59jPK7EyIIQkcsQCzQYHBROZtsDsbhzkZKn66RC3ZloYYPpnzg/H6Pg+N0Hxe/eQYgflCbpDrRHLS7lNJqprGdvtd9uEI1YUoCUzTeyKinMy4tkUF4ijXe5QdEb8ZKx1LyRBgAxYS9GO+4U3D03FgGz8zlLyJ+q7dzN1KBKfl+9fgXUO54bgRMOhwsQ/Qr6KAoivOinjo0OyUu32KFPQKs2vUx1WFFm3jINNcWIdncpLHbryld7174I=; 5:CHtWt+bzsgy3rW1oPau7stwBN98gXWLkxc7nsuc1XrCgIiYQb6GcAdwBCy37dvVA3ne0UJ+yIx5uTxylyVpIC084FpLjpGS6ZUdRA+QFezx+V47bu3YxpjK0nD1lswrS7p3rc9JDdv73QlH7+YJr2lo6wacNY89rC/f1oBwrsLo=; 24:4oeZ0amJ6rhlfs+QBIK54Axx9K5vWL9mVe3m/JsbsbYcpxjI9DH3jrRLYZxRp4ab17neZ7Lb+As2hXN3UK8pbkN08579f4u0hoTXnmD5NP8=; 7:83eP8UZ4oENTqkqlCerm2eJDRPrVEls09E18JRYXVEAYklOfdxkptPPpQjZcW7p6iQN/DbOlKk85JNdTLQGBtA0ac5fAABp86Tpv47hWH+5GbYBr7q9ja6q5e+MDFEb7DuF2iquUcrAmcJIpCMnh66Re7X5zPljOMMfVyjXyVw/RVZ6ElfZu4zCQ8hP0DSFA6kk2W4TiaPLY0QqhsK17Wyo8FVrXdeNA4BWcNh4As8l/8Q2Ve9ixikHtmKtDaGCI SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; CO1PR15MB1079; 20:p8Wqn5y5pLet03K1fyl+a7bl39nPofgPHWOl2/+skk7ghrgq1b+8dKDHwNlG+VNZVqDWivrJcNimZoTcQyWDN/xROPn59Lyg1tzDV0RKb4f78zsdMXcsQjvcC7oKW7XY7rj1fIO80HULqJH7wNgpM0qSfaNWVUmqkfVSB2aonqo= X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 Dec 2017 18:39:40.9682 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: d82131a0-b2c7-4494-439e-08d53da1e1d9 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 8ae927fe-1255-47a7-a2af-5f3a069daaa2 X-MS-Exchange-Transport-CrossTenantHeadersStamped: CO1PR15MB1079 X-OriginatorOrg: fb.com X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:, , definitions=2017-12-07_08:, , signatures=0 X-Proofpoint-Spam-Reason: safe X-FB-Internal: Safe Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org 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 SOURCE_FILE FILE FILE is a non-existing file on bpffs. Signed-off-by: Roman Gushchin Cc: Alexei Starovoitov Cc: Daniel Borkmann Cc: Jakub Kicinski Cc: Martin KaFai Lau Cc: Quentin Monnet Cc: David Ahern Reviewed-by: Jakub Kicinski --- 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 | 31 ++++++++++- 5 files changed, 81 insertions(+), 34 deletions(-) diff --git a/tools/bpf/bpftool/Documentation/bpftool-prog.rst b/tools/bpf/bpftool/Documentation/bpftool-prog.rst index 36e8d1c3c40d..827b415f8ab6 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** *SRC* *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** *SRC* *FILE* + Load bpf program from binary *SRC* 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 Dec 07 17:23 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..bac5d81e2ff0 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,32 @@ 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(); + return -1; + } + + 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 +674,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 SRC 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 +691,7 @@ static const struct cmd cmds[] = { { "help", do_help }, { "dump", do_dump }, { "pin", do_pin }, + { "load", do_load }, { 0 } };