From patchwork Fri Dec 8 14:52:36 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Roman Gushchin X-Patchwork-Id: 846299 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="eFtwEvqq"; dkim=pass (1024-bit key; unprotected) header.d=fb.onmicrosoft.com header.i=@fb.onmicrosoft.com header.b="k370BZ6S"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3ytb2v6Hm4z9t8c for ; Sat, 9 Dec 2017 01:53:59 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754170AbdLHOx6 (ORCPT ); Fri, 8 Dec 2017 09:53:58 -0500 Received: from mx0a-00082601.pphosted.com ([67.231.145.42]:48700 "EHLO mx0a-00082601.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754133AbdLHOxs (ORCPT ); Fri, 8 Dec 2017 09:53:48 -0500 Received: from pps.filterd (m0044010.ppops.net [127.0.0.1]) by mx0a-00082601.pphosted.com (8.16.0.21/8.16.0.21) with SMTP id vB8EoH3c008350; Fri, 8 Dec 2017 06:53:30 -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=QBTNvEk+kaMeWBO9zC3xhq7XXEjRLYs0NFK3czbQHFk=; b=eFtwEvqqPaJpzpLWevwz0MZZiUpFL2etBrczxccmRNi1Q3W5VFpa64SyI5AuNXmvCxtx e7W4GmOhkCAQpF3N3DwN4qIPvUHcmILonD62gxW0fnvwzqv+9OwqSgXu/AIxVIB9CWlz wMNHktakuZLxPwT3PO22AHua/JzV14TxrDM= Received: from mail.thefacebook.com ([199.201.64.23]) by mx0a-00082601.pphosted.com with ESMTP id 2equ61g9hm-3 (version=TLSv1 cipher=ECDHE-RSA-AES256-SHA bits=256 verify=NOT); Fri, 08 Dec 2017 06:53:30 -0800 Received: from NAM03-CO1-obe.outbound.protection.outlook.com (192.168.54.28) by o365-in.thefacebook.com (192.168.16.22) with Microsoft SMTP Server (TLS) id 14.3.319.2; Fri, 8 Dec 2017 06:53:29 -0800 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=QBTNvEk+kaMeWBO9zC3xhq7XXEjRLYs0NFK3czbQHFk=; b=k370BZ6SE9J7hqDy5yqDjAXK/bCNTY9Tl2Xyrg0XDJIlXUWJHqDYYtv8vhYv4acsXn/SyyeBfcHE/NjC9thnQ1OVQBt4S0A4a7Nbh8KnwcGYR0p1Vhd6GBWgPcmcNsoe6D8wwf+IGIGLG7pFnVb0jid2qE1KC8OH3CJHe+fZGBU= Received: from castle.thefacebook.com (2620:10d:c092:180::1:b43a) by CO1PR15MB1078.namprd15.prod.outlook.com (2a01:111:e400:7b66::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.302.9; Fri, 8 Dec 2017 14:53:20 +0000 From: Roman Gushchin To: CC: , , , , , , , Quentin Monnet , David Ahern Subject: [PATCH v3 net-next 4/4] bpftool: implement cgroup bpf operations Date: Fri, 8 Dec 2017 14:52:36 +0000 Message-ID: <20171208145236.12635-5-guro@fb.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20171208145236.12635-1-guro@fb.com> References: <20171208145236.12635-1-guro@fb.com> MIME-Version: 1.0 X-Originating-IP: [2620:10d:c092:180::1:b43a] X-ClientProxiedBy: VI1PR0102CA0086.eurprd01.prod.exchangelabs.com (2603:10a6:803:15::27) To CO1PR15MB1078.namprd15.prod.outlook.com (2a01:111:e400:7b66::8) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 315f86b7-adc5-43ba-5ef3-08d53e4b6e10 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(4534020)(4602075)(4627115)(201703031133081)(201702281549075)(5600026)(4604075)(2017052603307); SRVR:CO1PR15MB1078; X-Microsoft-Exchange-Diagnostics: 1; CO1PR15MB1078; 3:kVfvAcXQMmNO/VqBAv/jF31S8I4DCHCPjy1Stx4I7tdPBaykZvmOE7Km9uK6ruWRX6CEs7+Fo5m87Nb6kFyluHP7NCqh53wDkClhJrbhcQ5Gc29w4Y/GnZXoJQ+z3C7qO0sc2+mL3xgF1iJQ6QFaawZGny8FVlI9SUapIHqp7kxeeAwj6BCnxqiqFfPEAku6zWYQ88q82/K32q1vVGi+nGQSUVQu7H8Y0rN+tdROQZIqMyn8bGOfG8Vj9kebKVrP; 25:XS4FM0Vjb3Xi3nF5W0Xzbo5AVBDXC1J+4rDBbuS3YodGAhJli08dHtkdG0b0ttf+GNJdcrwg9JUJKY9IF98S6r/GleY9g5+EzROfQkVotwM6MMGZUvWS5PyzRD5DQTdDkksk65xaexV8HkR59eDZx6cDcnBTSV1iBuXDyjFbXc34KJS9dVpdWiaWL0/5w342mFCfY57TLRoUzMjoTV8O5d4xllqRyz10KYcx7z1e3JvEcdrLNHbZMoARrXLJbiO3M0QJiXZ7RTFKEAZYq/DXtEcDC3iaWc7/cK9Unah1qQj0luPVfKFFxWZc+0Ne4VT5TJCDHojzwtC6K/LOhNsviw==; 31:jhGE9DM8ctyCzX3/mz6QnOvAiqeuAWjXPiP3W4TbF2AZDH8ddIo6gHkYBDXGBUwpZ0rgt4Xy8b3daPOUIbXRn1Cvm4yRncEtG7//xGMLQJuCIzxwNe+a4DXO+Ypvzm65csYk4qP2NgqnZmxVRGQ9svqfQlD130/l8GinGrrC2zYkgbjwKePNnTufjZBU7WW2UPgm9522OQHgFQvOz8ZubE06XbxfK4Gb2Go5XqpE8Kc= X-MS-TrafficTypeDiagnostic: CO1PR15MB1078: X-Microsoft-Exchange-Diagnostics: 1; CO1PR15MB1078; 20:UHMDiWFQxkjYgCnDN/QcWLWAnRw53biqm7DmKjUYzNjyBMKJ/0Tsq+5lFUtT51O6I3haLreVhjcxlX6HJTAVj3OhLJmlClom1DqDKzIxeE3GK91xUaY1uQ/5VzYRaA5KFJPv2wsl535XSZ87zhyZLFlLi5sNzbO2u5/mDHtmu4YBbi51W54JsEREo3lzUTJM5wy1icBCzOlZ6NGvzxAi6DgIpokIx363IQ7AIkxNbowjJbuYH3I013uuaaLBFUPu61inASrXJaNND5GtFD2TFD7SZ7hurkIWVEnGOfpfjOU/l2/8ryKNVxe43fP+RzlAgJ73Bu0Qet8xYgvbHJ3hvgHcGQuXLw/8hny/C6p6hZZt2ZfJkro7K0XuvCou/xPUOw6Hj622RnQOeMZVit1gyi9EfFZns2vnXMRfyEge6RIMHCbGjBxmdC2u2EcBWURiXk9Iki0X5/VtnzB8dftuSDvt+lz8w7CpTtK4nb1VsbzyN+tvBnRE1l7iKNUKROvB; 4:PP3h80e0ZgZb5gfB0Ev0eD7uZU92IJ0DyWHy6qPCPQ9GGDA0J1ZMsKk/v5fYPG0xjx/X08+rfR/UQTOnIwG+5gu/cuKJXoZsntG51FK0u8KoT2BgKBzHjMVfcP+68/BT8dDUE6rhKpC6zSmVYfEe17qoq6QBuegpHjkdRXvvKLSBXvACL32wS5s5QqxIM+ndWTA7eHoPBmx9heepyMt9ERrwNGhcSy4f0ZtiQlD1ax9qTUNz9/Tq4Up9reIXJBu9fL0TgpPvk5CztmQc+JA6Zi4Zh8GB+dEXbuPGVd3w9KJuIqU5lC8/tUmqhkYiLzZAVO1kaIox2ZxzUd6JlxJUrRh7TK488XjG9qGQfmytuTw= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(67672495146484)(81227570615382); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(11241501159)(6040450)(2401047)(8121501046)(5005006)(93006095)(93001095)(3002001)(10201501046)(3231022)(6041248)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123562025)(20161123564025)(20161123558100)(20161123560025)(20161123555025)(6072148)(201708071742011); SRVR:CO1PR15MB1078; BCL:0; PCL:0; RULEID:(100000803101)(100110400095); SRVR:CO1PR15MB1078; X-Forefront-PRVS: 0515208626 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(366004)(376002)(346002)(189003)(199004)(7736002)(68736007)(6116002)(86362001)(575784001)(1076002)(105586002)(48376002)(106356001)(33646002)(2351001)(50226002)(2361001)(305945005)(2906002)(53416004)(2950100002)(6666003)(8936002)(81166006)(50466002)(8676002)(6916009)(81156014)(5890100001)(5660300001)(52116002)(51416003)(69596002)(6506006)(478600001)(53936002)(52396003)(16586007)(316002)(6486002)(39060400002)(4326008)(36756003)(6512007)(76176011)(25786009)(47776003)(97736004)(54906003)(42262002); DIR:OUT; SFP:1102; SCL:1; SRVR:CO1PR15MB1078; H:castle.thefacebook.com; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A:1; LANG:en; Received-SPF: None (protection.outlook.com: fb.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: 1; CO1PR15MB1078; 23:S2iPCjWRgkBHDK+fQ83WPTZf/8bipvGhICjKK0Lc3bv2pRExaUcUBUBLbS6cWasE+SZG7JXDIllnBMHiBzJMJTeUATbNHhUcOJVYls42Y8QH9nlgbjY43rna/KDFELGriycmHoe3xK8ZcVi1aJoVWqK+Xs2w+OaokC3L9jfbY2RQ/wconUQVlU/mCLsTNqDPz4QKB01EbV6GHaXuMp6uTB5Giv1B/HNkIkimm/FQjvrQpcsZqSH+4B5amxA6QRTFQWy6bBa1ebKQxbk+laj4t/dhPwXEN960tx9K+Hf3TpiTw+1p7hL3xyCQ6IXQpRvqEMKQZx3Y+VHU9nTvVmRElmuJimoyHK0Gwa5EoDWeCWJixHoT+hlO0C0FHNcbjI0s2kMbNcb+AeIG4FLp1Y1kJRsVLzOOw+Y8zarakbVuqKERdsd0vKuXsXehfoFqqnpGR2voNkKl9FNvTzBwV9rMeM5B/x+9TudTkcetI0NgujQt8AJSEMwVHHoLuXdoi9cULQnAgIQPZTr984cPVZhK8Mf0LIo2Fvq9WJcAvPIQPi9BlAhg6fI745VW+m+NDONHH6Ywos+NTMfvsqNQ0QxWKTv3WoVlx+Y1OnSu53pIBo8dJdyslGOCvoh5VnCPm3gWRHiMxaMnHQSVWoBZW5HAj8IafKLNq5t4AhxG7EQ3NTStqsBFYRQgifHusY+uVe/P1L9hU3nmlwERTlsm8GVMHWH2sldsH7HBocNaGAwALEZhxeVAxbUM8vCzDduCBKOYwdpamE/TlmWfy/wzhocDoUmGCeWa+rgi5Iey5+CpSc6n4dZOtrqqmZlTfITXoQRJgAu4AhA9eLoKWesGHoQBCj1JRsfmZsdVwGJr+EM/5RGggQb7dShc2JrQ7wwsUm2WPrT6gluyn4S0canSAMtN6ciKhGuRXTcKzSfzauDS5dDABVFWZaOO6xHa/ax7K9gScEEhr0qjTbemnl9YDOloz++0NrTTbKhmD5fDI7g6Zu0Ys7aDJTA/3iz005/WwQqziQpsJC5L9Nbw3tKr9xDtVmgejv5YZINPfrdt2+7nlEwjNpK8thr7WanvzmQapKrzh/tlVuSIclV1Qc9JAA4Fefg80AcEncTO8Vqlc+j+0WCCxJKuLSDBdkoxlwzNlKdYCM+/ea3qeK2H6KirY3zBXeSyI72bFVZ0HayDCrYk+L4= X-Microsoft-Exchange-Diagnostics: 1; CO1PR15MB1078; 6:zb7sIubU17YUmqC5nO0xn/75fyzY7ttds62UmjBgaFyKb2NdP35JShBZDpPTdrgNheIC8wJ33WSNsHr1aem5LO3KL7DYRSmiS5r90JDHv/9bsLgJkq1J/3EVAH8D19VsUrLD6EroyE8ed8wGPUstVRpt+YDAKwkeSe6UsKntxWSlQyXQKxOj3GgvMEkdbaojNK8jNGoZSUviO1b6plUihSMdbPXpfvsAXrgaX4ATMO5p7Z62j4L1j5QO95IAg/9MoU04KhvRcl4ZW00s1HO4pHboMEPbbUXcfr3DUdfeKmYbTC8M/ApLOLxxprtfZIS/66ZgfXZ/TGa0hei2+h/pbXEj+jznMgH2l0pLHCiCY3o=; 5:pLxDB4t+CBFr9i5bo83xMrIoN5jAFIAv+JcFO4aUZn/KWtKawn0aHhELbDqLy2VV3lO10U3xvWUMe+9402yQB9CNTqDR5q6PxowatwsXBSmft2cjBaHhiPrlGHCEOI2pvjHIZYrAljmwTfoU5VgMAgT6zGF0zItVt4XJm8emBVQ=; 24:qalIa7cHrM7Z0j+R2YrZ8fON2aBKID3ncqzhVBPfylIlVrQm3ipXP4vZ2nKK7aQt5y56q/NL1jSwBi+uI9Ak9sfQQYqDSgivUyXLLVaQWrE=; 7:XuEyJDHXb/WkOgXVgzUSiqUw40PU/H7vRW8MN1A/NlPg0VmVpXNDvHSSnhawCH6Lht/OJhx9zfONkOpmmIWnoWHtv9v3Eppm07NEwXSS1a+/lS4SHC1/Tv7xWmrEJHuVi9cRjpG/2rmDYFi+EWbXewepc2iatRVxmfh6ERKw3GiIPsFjltxLMcjmBkOm5IV2CfaWlYE8nYp+c9tGOtV79VUrrKOC2/PRftkSsFa9B+berY4dlit+wsDFZhIKvmuv SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; CO1PR15MB1078; 20:9+Ryg5P0XbuTfGB8qFfEt/twBi3J58PWBuX8pN3px+24fMzkReU6VYg72ZqTRKJ3dz8k9JDPJDtOqbkAOkrBYhf5vkXaMq7xZ0UOsNNvryxhRMPaw26ORRGoMF/XwMVVo1T84XyPV2s5w1yEjM3bg8Cw5ZD0n6XYleel+f/QYYc= X-MS-Exchange-CrossTenant-OriginalArrivalTime: 08 Dec 2017 14:53:20.2515 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 315f86b7-adc5-43ba-5ef3-08d53e4b6e10 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 8ae927fe-1255-47a7-a2af-5f3a069daaa2 X-MS-Exchange-Transport-CrossTenantHeadersStamped: CO1PR15MB1078 X-OriginatorOrg: fb.com X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:, , definitions=2017-12-08_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 This patch adds basic cgroup bpf operations to bpftool: cgroup list, attach and detach commands. Usage is described in the corresponding man pages, and examples are provided. Syntax: $ bpftool cgroup list CGROUP $ bpftool cgroup attach CGROUP ATTACH_TYPE PROG [ATTACH_FLAGS] $ bpftool cgroup detach CGROUP ATTACH_TYPE PROG Signed-off-by: Roman Gushchin Cc: Alexei Starovoitov Cc: Daniel Borkmann Cc: Jakub Kicinski Cc: Martin KaFai Lau Cc: Quentin Monnet Reviewed-by: David Ahern --- tools/bpf/bpftool/Documentation/bpftool-cgroup.rst | 92 +++++++ tools/bpf/bpftool/Documentation/bpftool-map.rst | 2 +- tools/bpf/bpftool/Documentation/bpftool-prog.rst | 2 +- tools/bpf/bpftool/Documentation/bpftool.rst | 6 +- tools/bpf/bpftool/cgroup.c | 300 +++++++++++++++++++++ tools/bpf/bpftool/main.c | 3 +- tools/bpf/bpftool/main.h | 1 + 7 files changed, 401 insertions(+), 5 deletions(-) create mode 100644 tools/bpf/bpftool/Documentation/bpftool-cgroup.rst create mode 100644 tools/bpf/bpftool/cgroup.c diff --git a/tools/bpf/bpftool/Documentation/bpftool-cgroup.rst b/tools/bpf/bpftool/Documentation/bpftool-cgroup.rst new file mode 100644 index 000000000000..61ded613aee1 --- /dev/null +++ b/tools/bpf/bpftool/Documentation/bpftool-cgroup.rst @@ -0,0 +1,92 @@ +================ +bpftool-cgroup +================ +------------------------------------------------------------------------------- +tool for inspection and simple manipulation of eBPF progs +------------------------------------------------------------------------------- + +:Manual section: 8 + +SYNOPSIS +======== + + **bpftool** [*OPTIONS*] **cgroup** *COMMAND* + + *OPTIONS* := { { **-j** | **--json** } [{ **-p** | **--pretty** }] | { **-f** | **--bpffs** } } + + *COMMANDS* := + { **list** | **attach** | **detach** | **help** } + +MAP COMMANDS +============= + +| **bpftool** **cgroup list** *CGROUP* +| **bpftool** **cgroup attach** *CGROUP* *ATTACH_TYPE* *PROG* [*ATTACH_FLAGS*] +| **bpftool** **cgroup detach** *CGROUP* *ATTACH_TYPE* *PROG* +| **bpftool** **cgroup help** +| +| *PROG* := { **id** *PROG_ID* | **pinned** *FILE* | **tag** *PROG_TAG* } + +DESCRIPTION +=========== + **bpftool cgroup list** *CGROUP* + List all programs attached to the cgroup *CGROUP*. + + Output will start with program ID followed by attach type, + attach flags and program name. + + **bpftool cgroup attach** *CGROUP* *ATTACH_TYPE* *PROG* [*ATTACH_FLAGS*] + Attach program *PROG* to the cgroup *CGROUP* with attach type + *ATTACH_TYPE* and optional *ATTACH_FLAGS*. + + **bpftool cgroup detach** *CGROUP* *ATTACH_TYPE* *PROG* + Detach *PROG* from the cgroup *CGROUP* and attach type + *ATTACH_TYPE*. + + **bpftool prog help** + Print short help message. + +OPTIONS +======= + -h, --help + Print short generic help message (similar to **bpftool help**). + + -v, --version + Print version number (similar to **bpftool version**). + + -j, --json + Generate JSON output. For commands that cannot produce JSON, this + option has no effect. + + -p, --pretty + Generate human-readable JSON output. Implies **-j**. + + -f, --bpffs + Show file names of pinned programs. + +EXAMPLES +======== +| +| **# mount -t bpf none /sys/fs/bpf/** +| **# mkdir /sys/fs/cgroup/test.slice** +| **# bpftool prog load ./device_cgroup.o /sys/fs/bpf/prog** +| **# bpftool cgroup attach /sys/fs/cgroup/test.slice/ device id 1 allow_multi** + +**# bpftool cgroup list /sys/fs/cgroup/test.slice/** + +:: + + ID AttachType AttachFlags Name + 1 device allow_multi bpf_prog1 + +| +| **# bpftool cgroup detach /sys/fs/cgroup/test.slice/ device id 1** +| **# bpftool cgroup list /sys/fs/cgroup/test.slice/** + +:: + + ID AttachType AttachFlags Name + +SEE ALSO +======== + **bpftool**\ (8), **bpftool-prog**\ (8), **bpftool-map**\ (8) diff --git a/tools/bpf/bpftool/Documentation/bpftool-map.rst b/tools/bpf/bpftool/Documentation/bpftool-map.rst index 9f51a268eb06..421cabc417e6 100644 --- a/tools/bpf/bpftool/Documentation/bpftool-map.rst +++ b/tools/bpf/bpftool/Documentation/bpftool-map.rst @@ -128,4 +128,4 @@ EXAMPLES SEE ALSO ======== - **bpftool**\ (8), **bpftool-prog**\ (8) + **bpftool**\ (8), **bpftool-prog**\ (8), **bpftool-cgroup**\ (8) diff --git a/tools/bpf/bpftool/Documentation/bpftool-prog.rst b/tools/bpf/bpftool/Documentation/bpftool-prog.rst index ffdb20e8280f..81c97c0e9b67 100644 --- a/tools/bpf/bpftool/Documentation/bpftool-prog.rst +++ b/tools/bpf/bpftool/Documentation/bpftool-prog.rst @@ -155,4 +155,4 @@ EXAMPLES SEE ALSO ======== - **bpftool**\ (8), **bpftool-map**\ (8) + **bpftool**\ (8), **bpftool-map**\ (8), **bpftool-cgroup**\ (8) diff --git a/tools/bpf/bpftool/Documentation/bpftool.rst b/tools/bpf/bpftool/Documentation/bpftool.rst index f547a0c0aa34..6732a5a617e4 100644 --- a/tools/bpf/bpftool/Documentation/bpftool.rst +++ b/tools/bpf/bpftool/Documentation/bpftool.rst @@ -16,7 +16,7 @@ SYNOPSIS **bpftool** **version** - *OBJECT* := { **map** | **program** } + *OBJECT* := { **map** | **program** | **cgroup** } *OPTIONS* := { { **-V** | **--version** } | { **-h** | **--help** } | { **-j** | **--json** } [{ **-p** | **--pretty** }] } @@ -28,6 +28,8 @@ SYNOPSIS *PROG-COMMANDS* := { **show** | **dump jited** | **dump xlated** | **pin** | **load** | **help** } + *CGROUP-COMMANDS* := { **list** | **attach** | **detach** | **help** } + DESCRIPTION =========== *bpftool* allows for inspection and simple modification of BPF objects @@ -53,4 +55,4 @@ OPTIONS SEE ALSO ======== - **bpftool-map**\ (8), **bpftool-prog**\ (8) + **bpftool-map**\ (8), **bpftool-prog**\ (8), **bpftool-cgroup**\ (8) diff --git a/tools/bpf/bpftool/cgroup.c b/tools/bpf/bpftool/cgroup.c new file mode 100644 index 000000000000..8116d58699af --- /dev/null +++ b/tools/bpf/bpftool/cgroup.c @@ -0,0 +1,300 @@ +// SPDX-License-Identifier: GPL-2.0+ +// Copyright (C) 2017 Facebook +// Author: Roman Gushchin + +#include +#include +#include +#include +#include +#include + +#include + +#include "main.h" + +static const char * const attach_type_strings[] = { + [BPF_CGROUP_INET_INGRESS] = "ingress", + [BPF_CGROUP_INET_EGRESS] = "egress", + [BPF_CGROUP_INET_SOCK_CREATE] = "sock_create", + [BPF_CGROUP_SOCK_OPS] = "sock_ops", + [BPF_CGROUP_DEVICE] = "device", + [__MAX_BPF_ATTACH_TYPE] = NULL, +}; + +static enum bpf_attach_type parse_attach_type(const char *str) +{ + enum bpf_attach_type type; + + for (type = 0; type < __MAX_BPF_ATTACH_TYPE; type++) { + if (attach_type_strings[type] && + is_prefix(str, attach_type_strings[type])) + return type; + } + + return __MAX_BPF_ATTACH_TYPE; +} + +static int list_bpf_prog(int id, const char *attach_type_str, + const char *attach_flags_str) +{ + struct bpf_prog_info info = {}; + __u32 info_len = sizeof(info); + int prog_fd; + + prog_fd = bpf_prog_get_fd_by_id(id); + if (prog_fd < 0) + return -1; + + if (bpf_obj_get_info_by_fd(prog_fd, &info, &info_len)) { + close(prog_fd); + return -1; + } + + if (json_output) { + jsonw_start_object(json_wtr); + jsonw_uint_field(json_wtr, "id", info.id); + jsonw_string_field(json_wtr, "attach_type", + attach_type_str); + jsonw_string_field(json_wtr, "attach_flags", + attach_flags_str); + jsonw_string_field(json_wtr, "name", info.name); + jsonw_end_object(json_wtr); + } else { + printf("%-8u %-15s %-15s %-15s\n", info.id, + attach_type_str, + attach_flags_str, + info.name); + } + + close(prog_fd); + return 0; +} + +static int list_attached_bpf_progs(int cgroup_fd, enum bpf_attach_type type) +{ + __u32 prog_ids[1024] = {0}; + char *attach_flags_str; + __u32 prog_cnt, iter; + __u32 attach_flags; + char buf[16]; + int ret; + + prog_cnt = ARRAY_SIZE(prog_ids); + ret = bpf_prog_query(cgroup_fd, type, 0, &attach_flags, prog_ids, + &prog_cnt); + if (ret) + return ret; + + if (prog_cnt == 0) + return 0; + + switch (attach_flags) { + case BPF_F_ALLOW_MULTI: + attach_flags_str = "allow_multi"; + break; + case BPF_F_ALLOW_OVERRIDE: + attach_flags_str = "allow_override"; + break; + case 0: + attach_flags_str = ""; + break; + default: + snprintf(buf, sizeof(buf), "unknown(%x)", attach_flags); + attach_flags_str = buf; + } + + for (iter = 0; iter < prog_cnt; iter++) + list_bpf_prog(prog_ids[iter], attach_type_strings[type], + attach_flags_str); + + return 0; +} + +static int do_list(int argc, char **argv) +{ + enum bpf_attach_type type; + int cgroup_fd; + int ret = -1; + + if (argc < 1) { + p_err("too few parameters for cgroup list\n"); + goto exit; + } else if (argc > 1) { + p_err("too many parameters for cgroup list\n"); + goto exit; + } + + cgroup_fd = open(argv[0], O_RDONLY); + if (cgroup_fd < 0) { + p_err("can't open cgroup %s\n", argv[1]); + goto exit; + } + + if (json_output) + jsonw_start_array(json_wtr); + else + printf("%-8s %-15s %-15s %-15s\n", "ID", "AttachType", + "AttachFlags", "Name"); + + for (type = 0; type < __MAX_BPF_ATTACH_TYPE; type++) { + /* + * Not all attach types may be supported, so it's expected, + * that some requests will fail. + * If we were able to get the list for at least one + * attach type, let's return 0. + */ + if (list_attached_bpf_progs(cgroup_fd, type) == 0) + ret = 0; + } + + if (json_output) + jsonw_end_array(json_wtr); + + close(cgroup_fd); +exit: + return ret; +} + +static int do_attach(int argc, char **argv) +{ + int cgroup_fd, prog_fd; + enum bpf_attach_type attach_type; + int attach_flags = 0; + int i; + int ret = -1; + + if (argc < 4) { + p_err("too few parameters for cgroup attach\n"); + goto exit; + } + + cgroup_fd = open(argv[0], O_RDONLY); + if (cgroup_fd < 0) { + p_err("can't open cgroup %s\n", argv[1]); + goto exit; + } + + attach_type = parse_attach_type(argv[1]); + if (attach_type == __MAX_BPF_ATTACH_TYPE) { + p_err("invalid attach type\n"); + goto exit_cgroup; + } + + argc -= 2; + argv = &argv[2]; + prog_fd = prog_parse_fd(&argc, &argv); + if (prog_fd < 0) + goto exit_cgroup; + + for (i = 0; i < argc; i++) { + if (strcmp(argv[i], "allow_multi") == 0) { + attach_flags |= BPF_F_ALLOW_MULTI; + } else if (strcmp(argv[i], "allow_override") == 0) { + attach_flags |= BPF_F_ALLOW_OVERRIDE; + } else { + p_err("unknown option: %s\n", argv[i]); + goto exit_cgroup; + } + } + + if (bpf_prog_attach(prog_fd, cgroup_fd, attach_type, attach_flags)) { + p_err("failed to attach program"); + goto exit_prog; + } + + if (json_output) + jsonw_null(json_wtr); + + ret = 0; + +exit_prog: + close(prog_fd); +exit_cgroup: + close(cgroup_fd); +exit: + return ret; +} + +static int do_detach(int argc, char **argv) +{ + int prog_fd, cgroup_fd; + enum bpf_attach_type attach_type; + int ret = -1; + + if (argc < 4) { + p_err("too few parameters for cgroup detach\n"); + goto exit; + } + + cgroup_fd = open(argv[0], O_RDONLY); + if (cgroup_fd < 0) { + p_err("can't open cgroup %s\n", argv[1]); + goto exit; + } + + attach_type = parse_attach_type(argv[1]); + if (attach_type == __MAX_BPF_ATTACH_TYPE) { + p_err("invalid attach type"); + goto exit_cgroup; + } + + argc -= 2; + argv = &argv[2]; + prog_fd = prog_parse_fd(&argc, &argv); + if (prog_fd < 0) + goto exit_cgroup; + + if (bpf_prog_detach2(prog_fd, cgroup_fd, attach_type)) { + p_err("failed to detach program"); + goto exit_prog; + } + + if (json_output) + jsonw_null(json_wtr); + + ret = 0; + +exit_prog: + close(prog_fd); +exit_cgroup: + close(cgroup_fd); +exit: + return ret; +} + +static int do_help(int argc, char **argv) +{ + if (json_output) { + jsonw_null(json_wtr); + return 0; + } + + fprintf(stderr, + "Usage: %s %s list CGROUP\n" + " %s %s attach CGROUP TYPE PROG [ATTACH_FLAGS]\n" + " %s %s detach CGROUP TYPE PROG\n" + " %s %s help\n" + "\n" + " ATTACH_FLAGS := { allow_multi | allow_override }" + " " HELP_SPEC_PROGRAM "\n" + " " HELP_SPEC_OPTIONS "\n" + "", + bin_name, argv[-2], bin_name, argv[-2], + bin_name, argv[-2], bin_name, argv[-2]); + + return 0; +} + +static const struct cmd cmds[] = { + { "list", do_list }, + { "attach", do_attach }, + { "detach", do_detach }, + { "help", do_help }, + { 0 } +}; + +int do_cgroup(int argc, char **argv) +{ + return cmd_select(cmds, argc, argv, do_help); +} diff --git a/tools/bpf/bpftool/main.c b/tools/bpf/bpftool/main.c index d294bc8168be..ecd53ccf1239 100644 --- a/tools/bpf/bpftool/main.c +++ b/tools/bpf/bpftool/main.c @@ -85,7 +85,7 @@ static int do_help(int argc, char **argv) " %s batch file FILE\n" " %s version\n" "\n" - " OBJECT := { prog | map }\n" + " OBJECT := { prog | map | cgroup }\n" " " HELP_SPEC_OPTIONS "\n" "", bin_name, bin_name, bin_name); @@ -173,6 +173,7 @@ static const struct cmd cmds[] = { { "batch", do_batch }, { "prog", do_prog }, { "map", do_map }, + { "cgroup", do_cgroup }, { "version", do_version }, { 0 } }; diff --git a/tools/bpf/bpftool/main.h b/tools/bpf/bpftool/main.h index bec1ccbb49c7..8f6d3cac0347 100644 --- a/tools/bpf/bpftool/main.h +++ b/tools/bpf/bpftool/main.h @@ -115,6 +115,7 @@ int do_pin_fd(int fd, const char *name); int do_prog(int argc, char **arg); int do_map(int argc, char **arg); +int do_cgroup(int argc, char **arg); int prog_parse_fd(int *argc, char ***argv);