Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753809AbdLDNWt (ORCPT ); Mon, 4 Dec 2017 08:22:49 -0500 Received: from mx0b-00082601.pphosted.com ([67.231.153.30]:47948 "EHLO mx0a-00082601.pphosted.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752488AbdLDNWo (ORCPT ); Mon, 4 Dec 2017 08:22:44 -0500 Date: Mon, 4 Dec 2017 13:22:03 +0000 From: Roman Gushchin To: Quentin Monnet CC: Jakub Kicinski , , , , , , Subject: Re: [PATCH net-next 1/5] libbpf: add ability to guess program type based on section name Message-ID: <20171204132155.GA8165@castle.DHCP.thefacebook.com> References: <20171130134302.2840-1-guro@fb.com> <20171130134302.2840-2-guro@fb.com> <614dc433-9445-52df-a202-f7cb1cb79ca1@netronome.com> <20171201144606.5ddd0272@cakuba.netronome.com> <20171204123430.GA6644@castle.DHCP.thefacebook.com> <1ff6b535-067b-26b1-7c37-f0211749af99@netronome.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <1ff6b535-067b-26b1-7c37-f0211749af99@netronome.com> User-Agent: Mutt/1.9.1 (2017-09-22) X-Originating-IP: [2620:10d:c092:200::1:e0fc] X-ClientProxiedBy: VI1PR0502CA0009.eurprd05.prod.outlook.com (2603:10a6:803:1::22) To CO1PR15MB1077.namprd15.prod.outlook.com (2a01:111:e400:7b66::7) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: b7607422-5d63-454b-4a8f-08d53b1a0a9c X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(4534020)(4602075)(4627115)(201703031133081)(201702281549075)(5600026)(4604075)(2017052603286);SRVR:CO1PR15MB1077; X-Microsoft-Exchange-Diagnostics: 1;CO1PR15MB1077;3:c+5dxgcIBo59RWD2btN6pYFGOSzBh8gKa6UeFInbURFv1rz7Suq8icA0NsF9/JhHIBeKBD5Xo9JiuWLcDN1HV+jU67y8ZWlnfasrhe82L8LzurqOuHjFC5thZLeyLc0v6rH1qGtuJCEDBaOSDDKNRjgiIjmb+Wb1Z5YQrNS8lhGxip6Zz++Vw3N/ouMhtdgCn8zravGk1eyuoedhvIJZUiyNvAauE1wjsZFTi9FAUF3qfoPSKs17mtkEErNP7690;25:ogTiIZTI9azCMvdmJyoCeQUTuMPJ7jjn+9Wum3/t6DJrwLyHotIQrNhAyr8vP3D35QD4ReD/pZyAHPtlaBA/gVMWCbytWAGuQo7u3j4lBdpguwMcKuQo5/fRlpbL7czZAn++TNCWPN24WY/T08M7ahq2moMR8U5lg4R86jTw38MyiSicGGlpxRJ+oJc51uWQAMQ9zV95Ezgy3hou8/ee2A0mwj8oe1qyJoa+72sZuZbSR5oo+rQfO9jAJ575B8pRAihM3NmhtLU9sZvAG2Ij6q2dQwrj4M+IIrGxRZPEjbl1upfvDVPcDbB0qK8D+GBTp/YlYAcPN/wLI3IZKV34fQ==;31:KCrWf8xa4IXnhN4+DH9wAHRu5BxvDelDJnWLqv8BztBLWSyodkaKpcbMhg6dMxdXWLtVbSMyrKdM7FD8MwwVtohDd+JNKvpAKm2gJWjGnnOVyntuWiBDP6zMQ0hv9FFJfkA9R5ZaRKsUW8vpPGpGTGLsGneWD6+D/YeqwU+oAFnwW2ca605v+B1Ul5lZhka06581i1BfVqBzkBwjQDOBJ3GC+bYO/IZIF70AzXsd0aY= X-MS-TrafficTypeDiagnostic: CO1PR15MB1077: X-Microsoft-Exchange-Diagnostics: 1;CO1PR15MB1077;20:boUR0wt8v3B/uLZ1gm22XKv+nsiJ1ZAE/2LcQv6VSNvDaRo0eEU56nr7u/fwxo9O6FmpYRwxQu9k/OV2dvlTljGxkXudIctPkWYhHULPLby2FUIdFFF/ncMcfFfVH4ok8+jXavl8C+JJHnTPsUa29O5piePSuXnx73kohTCBsuNGwceeLSpdMcpmee8h02DbrYcBrbyXZsC1os9lKrPyxjSdXjZ54i1pHAop0Ix4rP+k4Up3NISiNfhX+ovMpvBvxZ36TTNuqueszjSBWB98qOOZb1mwRb5SIZqzmj0h/9YUa+Jvivr3lJr3e/Vod50GLZa8JcRxnztwRGjSxVNU30orAJIvGq1H7rO1qYAZZhjc9n+YDNSa17Evi5L4798XTBUpGwV6MC9sUC29X3hqNHqUmCnIS2Pc2GjGlFSNsNxvjcCJ6pYvZCRRM+f/gbGh3VRjXwUp86AjvOlDxrRaC7/SQHNuvxjIVUswEb7ZCE8amVyskqKiYblyzYEKF4id;4:MZsOCtRyK4WmSWsaaUHDoMkEV1J/Lahnf7DXD6t505C/riNxrHDIiAPINOjsE5Wi2cPzQRobTu7Bj1rEhHLGw23rz56P6L9z1riqLkHnZ5U73nSGjJr0HVprGkqaB9kKmmmCgt1VolzkrTIAEBdSxiNd0exC6CZLNZpIacWOo692OM1Lp+S3ZYPdzDgLir1TcFcHUBtTjJY2a8St4uXv0CGxN+r3ABlqEu49maP1oA6R0L0MB8RJYFS0RoLmvaAjswqjtLwiUS0exbBZAKEiLLhJnIUiyIrw60OeqUzwBNx3Q/Kl/lwoJo6OuXogdblo01WCiLGr7wY247+AqATtYeNe7YhrkbD0swj4gBs7mSQ= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(67672495146484)(17755550239193); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(11241501159)(6040450)(2401047)(5005006)(8121501046)(10201501046)(3231022)(3002001)(93006095)(93001095)(6041248)(20161123555025)(20161123560025)(20161123562025)(20161123564025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123558100)(6072148)(201708071742011);SRVR:CO1PR15MB1077;BCL:0;PCL:0;RULEID:(100000803101)(100110400095);SRVR:CO1PR15MB1077; X-Forefront-PRVS: 051158ECBB X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(6009001)(366004)(376002)(346002)(189002)(24454002)(199003)(377424004)(1076002)(7696005)(52146003)(23676004)(229853002)(2906002)(81166006)(81156014)(101416001)(53936002)(2486003)(6666003)(2870700001)(4326008)(6916009)(2950100002)(8676002)(52396003)(6506006)(97736004)(4001150100001)(6246003)(76176011)(106356001)(105586002)(33656002)(52116002)(39060400002)(25786009)(7736002)(54356011)(68736007)(5660300001)(305945005)(478600001)(83506002)(86362001)(55016002)(8936002)(189998001)(58126008)(93886005)(47776003)(50466002)(6116002)(9686003)(316002)(18370500001)(42262002);DIR:OUT;SFP:1102;SCL:1;SRVR:CO1PR15MB1077;H:castle.DHCP.thefacebook.com;FPR:;SPF:None;PTR:InfoNoRecords;MX:3;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtDTzFQUjE1TUIxMDc3OzIzOnh4bkFSRGFlcWY1cXhGdG1QMU9YQ2FlQmtN?= =?utf-8?B?Mm1DUUd4N2M5RFVZaEQrNXBVUlBabjltTUJXWS9FWEdFT3k1eDJoajNHWGJI?= =?utf-8?B?NE5NdytQSk1yMWtBWlVMdUExVWFPdDhRUW5WaWpJaHRNOXFOQkZvbHJBWU5x?= =?utf-8?B?cXZCM2xvdEV0aE90TDVIK2xjYUR6UjlhUTNyT2RWMG9tbkljdGtOSmRDZFhr?= =?utf-8?B?Wm1WTFE3eHNVWWVBc3lTRVhwbkRadGJvOWx5Y05tUC9QU1d3ZkJLREpmL0Vk?= =?utf-8?B?bnFiZit4WWZiaGQ2VUMyTlFvTFM0OTdSdnNkS0huMDBmZ1R4bUZvdVZXdmtS?= =?utf-8?B?dUM2a3NXUXVlaWR0ekpHSm9QTXhGTFg3VVlIQzBveWlxa21lZ3grZEo3eWFN?= =?utf-8?B?UlkxVzB0aVJuNnpUNERJeW9yNlZrU3lZWlVYN05ENGo0UGU1cmdxa3ZjWXhP?= =?utf-8?B?bG1ESkJpSXZPN2pmMXZ5Y2pSWHpNNCtmanNicE9BeS9hQWg2MHFlS1Y2QTYw?= =?utf-8?B?c2NqZDZqa0pIQldYQW1KMWFiWTF3ZkF6dnRTd3V3MGFleGlRMTIzVUdlRExv?= =?utf-8?B?TitKcTgxYk1wVTlnNFZucmVyeVk5TXJFeTVDVTlSNjBGdFhRQWlhVWU4c28y?= =?utf-8?B?QnhzS1VCVmFoazVFdjMxWU93VkpRdFloNjFyY2NtMjU5alF4NnVMeFk0YmNZ?= =?utf-8?B?N2JnOG9pMDVzWjl1MHlVbTJMVHNJdURnc25WVWJ3ZjZwZThTVEZkYW1qRjZl?= =?utf-8?B?M0JCQk5QcHpvaTRyN1ZJR3F2WmlVaEV2TWlWWXZucmRhWkhqVks1ZnBrb3U1?= =?utf-8?B?WWpKQmxycW5aOVlKL3FEeXVSb2tnL2ZYL0VEZG5zRzBkcU5mUGxtOStVL3lw?= =?utf-8?B?RkxZcE5vVGVRZjl3WWpyMi95a0tLbkFRS1ZQUzRVYlByRVNSaFpSa1BhamMx?= =?utf-8?B?eVY2cWc3akZSVFhLSDhIb2lCSWJ6aGNuTjl3bjdKWlZsSTBmc3BFcXRjYUlJ?= =?utf-8?B?NjB2ckRja0FsTlVVbERTM3RlK3lKUTZML25ZQk9SV0dsRjR0elZVV2dRYXZo?= =?utf-8?B?eVJwQTQ5QXVhS1FLZXZIeDR4QXNxY09NYnNlalI0YUU3UHdGWjRaMmdmK3VF?= =?utf-8?B?YlBBZ0FjK1YxNTNVRkVMalZuYWdYeEZXVlUzcE9WQW4yUFNtd3IyM0gwaDFH?= =?utf-8?B?eHNEN1MvaVYwSDZZSytTakZGZk03Y1lFbWhWQkVJZDluSElBbjVFdUR1UkY0?= =?utf-8?B?c1hWMEpDeFlBb25MNGVXUU04cktmaEplY1FTOUEyQllveUpyTk9GTThDRlRt?= =?utf-8?B?bERZV0JlMUoybUp3SUhBejNWd2R3SFRKVzBjZE1rMi9CMzhUZm94Y2V4ZHZC?= =?utf-8?B?NzAyZmNJZFZzR1RjTzB5OGZNSWk1eXpDejBQcldVS0s5MkhRRy9VSjh6aStD?= =?utf-8?B?ZFVvdjZmcVBzVDVLblBaQ3Z3OHJNb09mLzlzZkY3MExLM054U00rRERoK1Rz?= =?utf-8?B?UWpReFd2c3oxYzVtU2dxcWVpakRyUkJIQW5zbVYyVnFBSHB3bFNQSkhYeXk0?= =?utf-8?B?M211Snp3WjBrQVptRGFtNnZhdmNZcEtIdklqRVhtUFVVN3pvV0hGNlZMR252?= =?utf-8?B?dFVaNXB3S2RVYmdOamlJV21lajczL0Q5N2lHbmx5d1NNaVpFdCtKMWhOZkRQ?= =?utf-8?B?MEgvQ29PTTBNeEY4Ti9HcjRUVFJDRTFvZkQyakVUTjlJSlpnR2M5b1psWU9i?= =?utf-8?B?aXFtV0U0M0NabDdQblRCZWErZjY0WFpmc3lLODZSS3hVUmhFQm44UVRqYW43?= =?utf-8?Q?VGoiLAMd+sRQ6?= X-Microsoft-Exchange-Diagnostics: 1;CO1PR15MB1077;6:xKKp2RF/16S+pCHYKx7GKXkN+D2yMojQ2/iBrgKihtfx82bixIbTanxw87VehzDyo3fPHbmtLKQJ0fv4YU+66cqSiqkT0oPjixKapV7/ZfJqCEghjCjL1dvfJUXQG8IwPSsOHHVuaSSdEn4ijw5DoDGprqy3ytp9SWY1ofTwSlS34IKSsL7sNg7SW2UgPHia+qJ6SZZfxFn24WIeY4DwIMsFRaZNc98nks7xuRXda7p4prjo3VSCkqDVN/HQwessP/OZ8zazgR1TxZ6UjgmcbQNIm1+j32CS+NLj9bKnjAs81OvdvlZUaf9Atlipa2aUTffX6kFl+WcdKBnftuYNtNZ1d8TGOQD9cfi8x2IYE9k=;5:Z5Oh+66RxSfYYmhonYxCZigO9Z+67FPIeFhzc1f/zjawZ4fHsttVrQQBVl4ye2viOlfTHAZej9ZWs08Y9LT0JefBb4sMpPQxgN+cq2p9yCYu1N/ZMx2afx65yeff7lD0gD6wtd2j7dHLebm+TZtoMkkjc1P2XNfL0bPoTCkB57Y=;24:isTN6/YtfHCKrvQ02aAzIHvneig3ppE0bnp2S52RAgLd/VTkVd9mzmZorvre5MV8EkkAGUjvhoGQoOy/xwHsPq57amKbV6+EGoNeM8aFLPQ=;7:HmEuLof5FzuvynZzRZ9zoR4t70JCYaFzalizmnuF81IKgdH3+zBAXnzW32tAYcjdU6t9gFms8jgU58g8fSGjbmw21AcsgAyYMIvyBF+6XkIvOc7zKgjbtDSbX1NyY9AwcU0v/CyyUFN9zgn+S5l6k1jxJbVTIT30Fp9ez5i1K905jE4tqAvYbgKXH748Zl+HNQk0sEgvoBQK5YAtVTmX3lnErIHncw1K5NCN8HL5k/Pn4lvMLX8SwZUMV9u/Bvpb SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;CO1PR15MB1077;20:HdrhE3/fjocHQJ6fY9voQhFgMmAy973ZXG5tcch5w9IefAYgxXIUujzGOmf9YQgsHbsCJIQIyZvp0G3qwUTSqGQNCzpYM3Hjje/yqD7bj2WdIFTTPGEpVECJU/vvrZLqZvFk0wfOWuMCrwHjh7N1VlxkeisQFzKyQt/RCvLjcX4= X-MS-Exchange-CrossTenant-OriginalArrivalTime: 04 Dec 2017 13:22:15.5682 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: b7607422-5d63-454b-4a8f-08d53b1a0a9c X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 8ae927fe-1255-47a7-a2af-5f3a069daaa2 X-MS-Exchange-Transport-CrossTenantHeadersStamped: CO1PR15MB1077 X-OriginatorOrg: fb.com X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:,, definitions=2017-12-04_03:,, 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: 5064 Lines: 116 On Mon, Dec 04, 2017 at 01:12:33PM +0000, Quentin Monnet wrote: > 2017-12-04 12:34 UTC+0000 ~ Roman Gushchin > > On Fri, Dec 01, 2017 at 02:46:06PM -0800, Jakub Kicinski wrote: > >> On Fri, 1 Dec 2017 10:22:57 +0000, Quentin Monnet wrote: > >>> Thanks Roman! > >>> One comment in-line. > >>> > >>> 2017-11-30 13:42 UTC+0000 ~ Roman Gushchin > >>>> The bpf_prog_load() function will guess program type if it's not > >>>> specified explicitly. This functionality will be used to implement > >>>> loading of different programs without asking a user to specify > >>>> the program type. In first order it will be used by bpftool. > >>>> > >>>> Signed-off-by: Roman Gushchin > >>>> Cc: Alexei Starovoitov > >>>> Cc: Daniel Borkmann > >>>> Cc: Jakub Kicinski > >>>> --- > >>>> tools/lib/bpf/libbpf.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++ > >>>> 1 file changed, 47 insertions(+) > >>>> > >>>> diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c > >>>> index 5aa45f89da93..9f2410beaa18 100644 > >>>> --- a/tools/lib/bpf/libbpf.c > >>>> +++ b/tools/lib/bpf/libbpf.c > >>>> @@ -1721,6 +1721,41 @@ BPF_PROG_TYPE_FNS(tracepoint, BPF_PROG_TYPE_TRACEPOINT); > >>>> BPF_PROG_TYPE_FNS(xdp, BPF_PROG_TYPE_XDP); > >>>> BPF_PROG_TYPE_FNS(perf_event, BPF_PROG_TYPE_PERF_EVENT); > >>>> > >>>> +static enum bpf_prog_type bpf_program__guess_type(struct bpf_program *prog) > >>>> +{ > >>>> + if (!prog->section_name) > >>>> + goto err; > >>>> + > >>>> + if (strncmp(prog->section_name, "socket", 6) == 0) > >>>> + return BPF_PROG_TYPE_SOCKET_FILTER; > >>>> + if (strncmp(prog->section_name, "kprobe/", 7) == 0) > >>>> + return BPF_PROG_TYPE_KPROBE; > >>>> + if (strncmp(prog->section_name, "kretprobe/", 10) == 0) > >>>> + return BPF_PROG_TYPE_KPROBE; > >>>> + if (strncmp(prog->section_name, "tracepoint/", 11) == 0) > >>>> + return BPF_PROG_TYPE_TRACEPOINT; > >>>> + if (strncmp(prog->section_name, "xdp", 3) == 0) > >>>> + return BPF_PROG_TYPE_XDP; > >>>> + if (strncmp(prog->section_name, "perf_event", 10) == 0) > >>>> + return BPF_PROG_TYPE_PERF_EVENT; > >>>> + if (strncmp(prog->section_name, "cgroup/skb", 10) == 0) > >>>> + return BPF_PROG_TYPE_CGROUP_SKB; > >>>> + if (strncmp(prog->section_name, "cgroup/sock", 11) == 0) > >>>> + return BPF_PROG_TYPE_CGROUP_SOCK; > >>>> + if (strncmp(prog->section_name, "cgroup/dev", 10) == 0) > >>>> + return BPF_PROG_TYPE_CGROUP_DEVICE; > >>>> + if (strncmp(prog->section_name, "sockops", 7) == 0) > >>>> + return BPF_PROG_TYPE_SOCK_OPS; > >>>> + if (strncmp(prog->section_name, "sk_skb", 6) == 0) > >>>> + return BPF_PROG_TYPE_SK_SKB; > >>> > >>> I do not really like these hard-coded lengths, maybe we could work out > >>> something nicer with a bit of pre-processing work? Perhaps something like: > >>> > >>> #define SOCKET_FILTER_SEC_PREFIX "socket" > >>> #define KPROBE_SEC_PREFIX "kprobe/" > >>> […] > >>> > >>> #define TRY_TYPE(string, __TYPE) \ > >>> do { \ > >>> if (!strncmp(string, __TYPE ## _SEC_PREFIX, \ > >>> sizeof(__TYPE ## _SEC_PREFIX))) \ > >>> return BPF_PROG_TYPE_ ## __TYPE; \ > >>> } while(0); > >> > >> I like the suggestion, but I think return and goto statements hiding > >> inside macros are slightly frowned upon in the netdev. Perhaps just > >> a macro that wraps the strncmp() with sizeof would be enough? Without > >> the return inside? > > > > Hm, I'm not sure that using macroses here makes the code much easier to read. > > Maybe we can use just strcmp() instead? > > As we compare with hardcoded strings, there is no real difference. > > Something like this: > > > > if (!strcmp("socket", prog->section_name)) > > return BPF_PROG_TYPE_SOCKET_FILTER; > > if (!strcmp("kprobe/", prog->section_name)) > > return BPF_PROG_TYPE_KPROBE; > > if (!strcmp("kretprobe/", prog->section_name)) > > return BPF_PROG_TYPE_KPROBE; > > if (!strcmp("tracepoint/", prog->section_name)) > > return BPF_PROG_TYPE_TRACEPOINT; > > if (!strcmp("xdp", prog->section_name)) > > return BPF_PROG_TYPE_XDP; > > if (!strcmp("perf_event", prog->section_name)) > > return BPF_PROG_TYPE_PERF_EVENT; > > if (!strcmp("cgroup/skb", prog->section_name)) > > return BPF_PROG_TYPE_CGROUP_SKB; > > if (!strcmp("cgroup/sock", prog->section_name)) > > return BPF_PROG_TYPE_CGROUP_SOCK; > > if (!strcmp("cgroup/dev", prog->section_name)) > > return BPF_PROG_TYPE_CGROUP_DEVICE; > > if (!strcmp("sockops", prog->section_name)) > > return BPF_PROG_TYPE_SOCK_OPS; > > if (!strcmp("sk_skb", prog->section_name)) > > return BPF_PROG_TYPE_SK_SKB; > > > > Thanks! > > > > I do not believe this works. For kprobes for example, the idea was to > compare "kprobe/" with only the beginning of prog->section_name, right? > The string prog->section_name is supposed to be longer than this (e.g. > "kprobe/sys_write"), and strcmp() will not detect a match in this case. Ah, true, I've missed this part. Ok, I'll try to master something with macroses. Thanks!