Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753713AbdLDMfQ (ORCPT ); Mon, 4 Dec 2017 07:35:16 -0500 Received: from mx0a-00082601.pphosted.com ([67.231.145.42]:58978 "EHLO mx0a-00082601.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751821AbdLDMfM (ORCPT ); Mon, 4 Dec 2017 07:35:12 -0500 Date: Mon, 4 Dec 2017 12:34:37 +0000 From: Roman Gushchin To: Jakub Kicinski CC: Quentin Monnet , , , , , , Subject: Re: [PATCH net-next 1/5] libbpf: add ability to guess program type based on section name Message-ID: <20171204123430.GA6644@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> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20171201144606.5ddd0272@cakuba.netronome.com> User-Agent: Mutt/1.9.1 (2017-09-22) X-Originating-IP: [2620:10d:c092:200::1:893e] X-ClientProxiedBy: HE1PR05CA0205.eurprd05.prod.outlook.com (2603:10a6:3:f9::29) To DM3PR15MB1083.namprd15.prod.outlook.com (2603:10b6:0:12::9) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 717ae0aa-06c3-4052-ea7f-08d53b136b1f X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(5600026)(4604075)(4534020)(4602075)(4627115)(201703031133081)(201702281549075)(2017052603286);SRVR:DM3PR15MB1083; X-Microsoft-Exchange-Diagnostics: 1;DM3PR15MB1083;3:yJHROQaAK0LhmZ6JD32DSKYdnhUoCvhh3/9ASZwZYihT1UiOwjHAtlF6TiMerEEDJAntpa/m3HlKKpfZDqJXgtwJHGBtpuZRoZ79m+8RRug9ZVC1yiDvgPscg07rr14gz7dluHmINkZY2AMZ2PUiBGpCz8iDhNx+5FFCbaDN0ZJ/g9EbYTI0JOGtUYUcwL4mJzY1JvFfrGcFMCVHzQm7Th3suOc3v1fGVWpTZcddzUGYxscq3XlzgI3pAU5XxqHS;25:nP8iXFs8w9aCI1KFp1EH2aRsfZsSoepzKar7DqOI2MFrSU+7QFByag1LHDITiNgi9ckpVy/DM0y4zxMUH3iQLKwAxAUo13rbv5ZbBk0pA3F1HQF/IF+tLI5O80BqzX9S5pdX35dgaBXvTgkYRtGRM4wI6hO9TjbGeEW0HRQgN4mJOPCJYEDYfDaxWDtQyrfpeSmnw4vVPtI8oZ+lUJdmsxSPUGIRRKwCCCbily/4T2Uj9zwjG8heghLiDDGNmqu6eBUl51+SWjsyI0FIcagrIOoMZNXBT6XDQzzy2xDKoYuHRthjnrpVKOGl3TWZzr0N0ypAVIpFuKk/X541dX8tag==;31:bAsAAGs5M48v9HS2vQUaf6//FSHL94TaPN+9lhv1lj/bBg8Mfkea6l0SKUSd6lB9CeAgLGOOlS0HHB/YFCAF3KseAtQsfuCuRebl74Bz6HZ77lH4/2kRwc2qJFcv1TFSswBv+WboBfgCghCsyxOaPsuw04aBzvPEy4ZWGJEq9Ha35aSvedkpkoTn8QOsLd3WzdMZ1BLLsWbfjcN+LwbqZojMepEIZzp3I1qnBZPOboQ= X-MS-TrafficTypeDiagnostic: DM3PR15MB1083: X-Microsoft-Exchange-Diagnostics: 1;DM3PR15MB1083;20:bWW/oe6s+oT0ztqwOr/nURHe6N0kTVNB0JnSgq7rQB92MmM0OQgyWSWoj6rCpTTcQLYfb3CGUeQ5mHa7g+5+ZwyakHqsGoT4W7oKf3c4JF+PGRg6wdNhpybodNTRnUHOoDY4rVHuvHMCadzFZgiFc9/6+G7RNgV8qN7vTkTMzzT8BeItwaEy8ecz+sKG+ru00PM42ja0Cicyah4R5NhXEkgv722Y7e+6aswZfMygvF2Sen+kAO/GZxvcEL4417fmNws09BRVwfrNGkr0AxBG0Bytrvbyf40KUPezTsv7QxMjgLIli5ofTwnwc33bpzxrLwcSb/DoymHnyJrk4aWEnhrTjm8JMy9bc/bTusy+nU9f5gqSWBOIxqEmbIU3oEWR3Jj3G1AFiO75s6kZakb2rDJeAE8y3bHFTs0ok2YXHeCb6IfO2OU1HEq4dAsbZGXo8MyQU9Jaz6w6nt0PE60TZduzDJrJ6VMRy3LfHhB8Z1bGeIYPDV4+/zyP073HtoMa;4:PyAllt8ZosHUY0Ld9EcF33Y9BU43plOY7G2/yyFv7G/zrIngHQ0rOM1Qb75k9/Snr6orppVSwvGlwhF6ypOLswz4tauCJR3yk03nbg9MA4RLiuZXrlNwuB1jCqKIBi5fleqC7YBDKhq8zfhbyb6xAioUoAnMsf6Rdk3ZNGiXdfrvQ+awqWsZ5Egoals9ufMOsQkZ8TTGW18oXteH6GhRfatGCvotAersp52Kz3ClvzpUeCTRv0iQBdrpJhcnHkAbpOvwQ/S0IOVED8Kgyspa+DY1MHz8eg0HxJK9c57RTZPy4HjNaD/IVaH3bENx2/4ySm2uMcxBWCVNdcMGXfhcGzOP6w5mUVXcWsTcwKrPf30= 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)(8121501046)(5005006)(3231022)(10201501046)(93006095)(93001095)(3002001)(6041248)(20161123560025)(20161123562025)(20161123555025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123558100)(20161123564025)(6072148)(201708071742011);SRVR:DM3PR15MB1083;BCL:0;PCL:0;RULEID:(100000803101)(100110400095);SRVR:DM3PR15MB1083; X-Forefront-PRVS: 051158ECBB X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(6009001)(376002)(366004)(346002)(189002)(24454002)(199003)(377424004)(52396003)(6916009)(1076002)(2870700001)(97736004)(6666003)(2950100002)(53936002)(25786009)(4326008)(39060400002)(50466002)(55016002)(6116002)(52146003)(47776003)(4001150100001)(23676004)(76176011)(316002)(2486003)(54356011)(305945005)(68736007)(2906002)(9686003)(83506002)(58126008)(7736002)(52116002)(7696005)(81156014)(478600001)(93886005)(81166006)(189998001)(5660300001)(229853002)(8676002)(8936002)(6246003)(6506006)(33656002)(105586002)(106356001)(86362001)(101416001)(18370500001)(42262002);DIR:OUT;SFP:1102;SCL:1;SRVR:DM3PR15MB1083;H:castle.DHCP.thefacebook.com;FPR:;SPF:None;PTR:InfoNoRecords;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtETTNQUjE1TUIxMDgzOzIzOmN0WXdmWE5vVEs5ZWtNWWRWbFJPeFNxWm1L?= =?utf-8?B?RjQ3bjRUV09NR1JvMEJhQ0loZmVGbk5GL0V6SzhzK0NIR3N1YXUzU2QydVps?= =?utf-8?B?dWVWMWEzWmhhMzU1QkhMMkpjWFZac2dPS1MxdlFhR25PSFZUVTVLRyt5TVZF?= =?utf-8?B?VUFHbmFEcUNDY3VKamdERGRuSWFtMXgvM2hvblBLNFYrWGp6TXphaVlQT0JC?= =?utf-8?B?eXFQd2ZqOFQ1WUxUeUFzY1RzL0pCL2F1RlVDdDBmSVJvbEhwRzREbkhLWkI2?= =?utf-8?B?RnNZaTcyZGRDaGxJT0U1bjNLSVMrb28vdXpJS2V1aWMzbzhjaWZBSXVSUnZx?= =?utf-8?B?OXFTNWd6MFlya3NDY1VObnJ0Z0FKUWJJQWVsNHA1NmR5QVliRjdTMndHZjdP?= =?utf-8?B?SCtQY3ZJOFpaclNoY2hVaXNXN3RXS3JDQjJkUHo2d0dZcGRGbWtQS1VQSXlZ?= =?utf-8?B?SVdmZlEwZmxBb1JwR0NEWlFNUWZ5U2ZHMUsxNTV0ZzFSZE0ySUlGVXZQdjNO?= =?utf-8?B?c3pBRDUyQXpoN0tyamg0bmxBKy9Oc2tnaTBQYVcwZGZPS013NktKU3hWNkcx?= =?utf-8?B?REpFYkFRSEFDR2lKSFdpNUszdzdxVzE1UjBkMWtzWGxYVW9IQlVUVGtuQVpN?= =?utf-8?B?QjZsR0Jjd1A4SmFWbHRwRXdMQlI3TFJFLytIUWtmMmx2b3dCYlNNUUU4bDZK?= =?utf-8?B?RFgyVUlZbDFkVXlQNTEzQTVmVjdIcDErcDY0L2hJdXEzRERlMGdiVE44TlZP?= =?utf-8?B?NTN5a01iVSsyKzFubVhLVnRZN3RYSWtCcHJmNnNiT0xYbTA5QjdjbmFkSVkx?= =?utf-8?B?N2txc1dMUlBDYzBTWTZzNWI0Sk9ZdW1GWXZ5bllFaHdMRlArRlVoN3ZQODgv?= =?utf-8?B?MExYQ2I5QkhURFlOb3M3YkJzSDI3Ri92UGxabkVPZEFxWFpJM0NuN09DUS9B?= =?utf-8?B?WHY4am1PMkpoRko2VjN2R1RWd1JtR1RmWUpvQVpKdmwxQk00czk3K0xoYm1P?= =?utf-8?B?NnRsR2xkT3VPbm1DNUNlQUtxMmtLYTI4SlF2eHVZM2M0SmZRNDJMWktsTVJN?= =?utf-8?B?ZHZPdk9yaitnUkZDcHZJM3h2RGdnU1MvUTQxbC8rNXFJRStnZURyTHZRTmsy?= =?utf-8?B?RzhKbHY1RUhLZVhnWHA5NkZtQ2YwL2d4THd5SUxxMVg5MUErQWw4d2xPMmZ6?= =?utf-8?B?VXpRbHBvR0hyNXdsWTVneDdVTW1lei96Ump6dGlENlBaTllFOEtwQllLdjly?= =?utf-8?B?Skg0T2FUYjlmVThPSnY0RkFyU1lVQ1RKaHRDNnZ6V05zeGEyWCs3bGw0MXV4?= =?utf-8?B?cnFLSm5KZUxKWHQycDl2Q3ZwVFdTUlkvZXAvU3p0bDhJMForb0x4VlpoOGVl?= =?utf-8?B?UmVUQ3BITDBGMjdZV1ZHdWZpUlpIMWNibGFhN3hJV21yUHBWTjZ6MjhCRGk0?= =?utf-8?B?MEdnOUlIbVN3c2NsdDFCSEFZYlc0Nm5WN2h6R21TeEJxL1hiSTN6NmU4cXU1?= =?utf-8?B?TGtJREg2SCsyUXNyUlMrN3ZYc2hIOVE1dWlYT2NpWFJmazdRaFBVR2lOaVlY?= =?utf-8?B?NFlXWU96aEJHT0RxZjM4eS8yWTBqM3JOVDVGeTlDSTdMNkVoV2JCY3FTdHh0?= =?utf-8?B?R09wTkhpMmx4bkEzeERNMGFWZVkyb082VHRnazViOXBFMWVMWEpMWUY1Z2F3?= =?utf-8?B?ODNUdHI2d1hMVFRmZUxZMFBwNjRKdzIxT0FydDZmZDZZb0xqbmdhN0JWczkx?= =?utf-8?B?SkN5amxqcDdqbkFrU2Z2VFRLRnlxaXF2RVZndUt1K2Q5Zm5FZzlHUTJHUEVr?= =?utf-8?Q?d8RVi2FOuCrwP?= X-Microsoft-Exchange-Diagnostics: 1;DM3PR15MB1083;6:YVAJwavilhxS3VEe49UVsV8plCmlKg/XExIKm6w7OlrIboo2u8mlxrsZevS5/GK0ygi4WiXPP/6WzIUAJHf7JbSIiShMMWVCWBWWKh3PXgDSHo+x3tBK4JhROHEUTsnFXglln2JI0HdeGgwZGhMvU//Tt56tksHdv5IWn69G2OOEX/f4pPqwQ6DEBUDFE5r0FZfjX5SMtAWKP62HZyhxbxfzDhU7FhTHwGpBR8DcdPzVHnYVLTPq+OZfLQPIpX7MqV3GFBP8xuq7v3VD23Z7OTVl4cz+H8HM5GNR2CVwvEzhFzshH6Ltl+K1JzYI1KpEr9MSgsxn82Dz4hBj9gwcKq5dTAXFkWmwH5+xqKCsYIw=;5:3qNMtfqpS9KZlb57yrO3g/Jm31I0Go8dCIlyeoaB3CWdO3xw5Fg/y4ApOG1DVtD05IPwbifHXdcB/WJ9hDC5xBnPxQ45L1+i4Z5YqAbHnA9PSxTeOqUO0YXbAOi8DaowJZ+SgArQHN2KfMrHwepjNMzt5xRu4vSQ45epG0kUz7s=;24:aQZMq7LyAmRI+lhcZahrR3lWEMrdIQbFeNxLDm0CF56jzAyJ6/qaDCmiMS14QhP4n/2Zr7xC4sQp54vvqV0xjqTwIG48qLOHF3EKlIPPk9w=;7:+KaD0ToAuMyZzNlnrOgPrma3fPllblA34lPMQWV4IXPe/pC2SoGQitd6mePAlyiW/kV0VvWS4p2YEdxRJO4BcNMRrcYkRi1vfZVscU53RePzCLIaeJz+9Wb3FbQA+faepISC/Xl+paxx3fRsKv/6yvdroRyXXxak9Rq/VR4GwFBi8XFmlc+9tWAB6f0IUjaJ6ffH2FxVJdDkjS45B/W5fcba9Vvm7bfQboPQQO3Kd1uoXjFDVnWj9DlIkJXnIylB SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;DM3PR15MB1083;20:+qvY692LA5d7UoEf+inEIQyopGYbQC9+1mQn1HlhC1jpR4gEF0Nd/jg03O0DhcyWekNReVcBMxsZU9UJwDkG8JHxhI5385Zf/aHxfLELIfoqps50XFy+/AArLuLLHSo8aox8hcJ9fyYxDEeizXiaujs5AWSX1CuKU7TvtE4eQqo= X-MS-Exchange-CrossTenant-OriginalArrivalTime: 04 Dec 2017 12:34:51.1557 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 717ae0aa-06c3-4052-ea7f-08d53b136b1f X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 8ae927fe-1255-47a7-a2af-5f3a069daaa2 X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM3PR15MB1083 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: 4330 Lines: 103 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!