Received: by 2002:a05:6a10:a0d1:0:0:0:0 with SMTP id j17csp262245pxa; Tue, 4 Aug 2020 23:56:59 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwqKZWzfWUD20IN7zPi92+DU3it7ps4+hvxm2Ln+rWO86N295xmDz4Zl6oFhIjOPCgbTpLg X-Received: by 2002:a17:906:b6c3:: with SMTP id ec3mr1752026ejb.101.1596610619168; Tue, 04 Aug 2020 23:56:59 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1596610619; cv=none; d=google.com; s=arc-20160816; b=Iapo5zHzpZbi2RSzoQcWOu35xvzzGgX7hkN+oHdmguZdQhiV7+47r5qm/nub4AGTgZ 0mdl88bnAnF8Uzj45t8T1V8xfXQsBfH9Y5LkbCwcoxS/TJIt7cHBhAGCzjEtpQCHbeuu /chdftQwSMxEcRxdJSl1uIME0E+/eZPGCFZJu7e5xicFuOIOZCwbMdhTuD8W2EyMd3Y/ fPN3vbe4YIJ+CE+M0HVZ/GemAMPpY1hDCtqO16Gzmf4+1S6Q2e3OZ3WihHWiZjaiICch JYPkw3niICF5CxMpn5Dzf8OlDMaSFAWh9OelVhmVa5y741aUTHRJ1c0HMVfd2XUEja3b uoaw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:dkim-signature; bh=xTEd3nRic+QB5ggRL63Pqwitnac1w25gtRmCK8xAnw4=; b=x0eMRXBDyk5qONM5mvL1fnVdKOLKWf+PBrvVqkkTaqhrG3UXEgX1eyIquTpT18CbuA xNWfHh/wETEXYAVZRd9CpW4ZfgRxoMHsBHFn3r3KtzXE63nkmZMXKJrQH1JSXtYvXlPS RH0mwEBDGpr/2N78EGmgPmuRIAYf6PmO2L0c2rdWQXVqtDb58EqzCeg+RcjcRu4QeOBE APHsmpxqKX7UDWdkpsPjndT3lBaj2xpwGGowIp/R60c8nJSaOMej3T4ukvPaBSBoRBOH 7UJJimd5qAtFmdeGWwln7hkXqkRWFlM0iKD1pm5woo8Uar5IvPROwwLu02k4/G+QTBPY hYaA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=ebgdB1vq; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id l8si131452edj.442.2020.08.04.23.56.36; Tue, 04 Aug 2020 23:56:59 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=ebgdB1vq; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728042AbgHEGya (ORCPT + 99 others); Wed, 5 Aug 2020 02:54:30 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:39508 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725920AbgHEGya (ORCPT ); Wed, 5 Aug 2020 02:54:30 -0400 Received: from mail-yb1-xb42.google.com (mail-yb1-xb42.google.com [IPv6:2607:f8b0:4864:20::b42]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 35E72C06174A; Tue, 4 Aug 2020 23:54:29 -0700 (PDT) Received: by mail-yb1-xb42.google.com with SMTP id x2so3103762ybf.12; Tue, 04 Aug 2020 23:54:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=xTEd3nRic+QB5ggRL63Pqwitnac1w25gtRmCK8xAnw4=; b=ebgdB1vqchfAykMJvcS6HR3qnKAXivBJAkoLEAsfzModXNNyJ/DnIVqUt0Oc6aCLmx yj6yHtZgJWyYDcjJsOZdWBVK74iijBWtRf/03km7fc8af+BSAeGP4K5Iak/Lf2DozuvR w2gFFyP999cB36wVrrboDChhrQiITWFRfVvFczX+Wf+UwsSvjNEXEpNUB0yaa196Nocq lGDpiPbs31+nLEW/N34LICSvf26cds8iAkvV6rmINARkA5P2IbVuLLA06JeMQJY0g9zK H3uPF+RVLpQh2JPZTqWj+1EjJw1LJyAXHcJno4bmor0OjCOtrNyAIlmS5Fro32l6TrlG vhwA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=xTEd3nRic+QB5ggRL63Pqwitnac1w25gtRmCK8xAnw4=; b=KGeQSLD8Pxl7g7IfJrf0w3ow5VAHC7tu9A4yQa4zxyduFsyIoY8kvfTexYWCnivsch Vo2WUCMkDoWbpXuUxiCfzRa3RP3THqrCA3auXH7GvLA9g7mz0iYH1wZ97OzCpeXB7+Rc YDL2KObiCgjsbitDJilnDh/EfV9PPnuf/0ZETHhE37W0u4+9QGn2tGSEQIvHNVQQVvDg GmHg/pOBMk3TuB4A7P6DoK6EYvUVlOAAaD2fjhNvDtwJgUhIGuiIyqcIfdOLxjQRZiCT OV5SIirUceVdX1CtO0dw2bo6H4QlozanHAj8zSJAxblamNYb5wYju0gfdWWLKmQzgh5+ qcTA== X-Gm-Message-State: AOAM531kCfdwNqmJNcTM/g8Zsi6be++lGH9mDyruSKB+zfuNZIw7Mc4U dSm33udDUFT5mLN/zgc8fmYlBVfO8J8RANS5tSw= X-Received: by 2002:a25:2ad3:: with SMTP id q202mr2539928ybq.27.1596610468393; Tue, 04 Aug 2020 23:54:28 -0700 (PDT) MIME-Version: 1.0 References: <20200801084721.1812607-1-songliubraving@fb.com> <20200801084721.1812607-3-songliubraving@fb.com> <9C1285C1-ECD6-46BD-BA95-3E9E81C00EF0@fb.com> <5BC1D7AD-32C1-4CDC-BA99-F4DABE61EEA3@fb.com> <4DB698F2-BC51-4E96-BC3B-F478BE9AE106@fb.com> In-Reply-To: <4DB698F2-BC51-4E96-BC3B-F478BE9AE106@fb.com> From: Andrii Nakryiko Date: Tue, 4 Aug 2020 23:54:16 -0700 Message-ID: Subject: Re: [PATCH bpf-next 2/5] libbpf: support BPF_PROG_TYPE_USER programs To: Song Liu Cc: open list , bpf , Networking , Alexei Starovoitov , Daniel Borkmann , Kernel Team , john fastabend , KP Singh , Jesper Dangaard Brouer , Daniel Xu Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, Aug 4, 2020 at 11:26 PM Song Liu wrote: > > > > > On Aug 4, 2020, at 10:32 PM, Andrii Nakryiko wrote: > > > > On Tue, Aug 4, 2020 at 8:59 PM Song Liu wrote: > >> > >> > >> > >>> On Aug 4, 2020, at 6:38 PM, Andrii Nakryiko wrote: > >>> > >>> On Mon, Aug 3, 2020 at 6:18 PM Song Liu wrote: > >>>> > >>>> > >>>> > >>>>> On Aug 2, 2020, at 6:40 PM, Andrii Nakryiko wrote: > >>>>> > >>>>> On Sat, Aug 1, 2020 at 1:50 AM Song Liu wrote: > >>>>>> > >>>> > >>>> [...] > >>>> > >>>>> > >>>>>> }; > >>>>>> > >>>>>> LIBBPF_API int bpf_prog_test_run_xattr(struct bpf_prog_test_run_attr *test_attr); > >>>>>> diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c > >>>>>> index b9f11f854985b..9ce175a486214 100644 > >>>>>> --- a/tools/lib/bpf/libbpf.c > >>>>>> +++ b/tools/lib/bpf/libbpf.c > >>>>>> @@ -6922,6 +6922,7 @@ static const struct bpf_sec_def section_defs[] = { > >>>>>> BPF_PROG_SEC("lwt_out", BPF_PROG_TYPE_LWT_OUT), > >>>>>> BPF_PROG_SEC("lwt_xmit", BPF_PROG_TYPE_LWT_XMIT), > >>>>>> BPF_PROG_SEC("lwt_seg6local", BPF_PROG_TYPE_LWT_SEG6LOCAL), > >>>>>> + BPF_PROG_SEC("user", BPF_PROG_TYPE_USER), > >>>>> > >>>>> let's do "user/" for consistency with most other prog types (and nice > >>>>> separation between prog type and custom user name) > >>>> > >>>> About "user" vs. "user/", I still think "user" is better. > >>>> > >>>> Unlike kprobe and tracepoint, user prog doesn't use the part after "/". > >>>> This is similar to "perf_event" for BPF_PROG_TYPE_PERF_EVENT, "xdl" for > >>>> BPF_PROG_TYPE_XDP, etc. If we specify "user" here, "user/" and "user/xxx" > >>>> would also work. However, if we specify "user/" here, programs that used > >>>> "user" by accident will fail to load, with a message like: > >>>> > >>>> libbpf: failed to load program 'user' > >>>> > >>>> which is confusing. > >>> > >>> xdp, perf_event and a bunch of others don't enforce it, that's true, > >>> they are a bit of a legacy, > >> > >> I don't see w/o "/" is a legacy thing. BPF_PROG_TYPE_STRUCT_OPS just uses > >> "struct_ops". > >> > >>> unfortunately. But all the recent ones do, > >>> and we explicitly did that for xdp_dev/xdp_cpu, for instance. > >>> Specifying just "user" in the spec would allow something nonsensical > >>> like "userargh", for instance, due to this being treated as a prefix. > >>> There is no harm to require users to do "user/my_prog", though. > >> > >> I don't see why allowing "userargh" is a problem. Failing "user" is > >> more confusing. We can probably improve that by a hint like: > >> > >> libbpf: failed to load program 'user', do you mean "user/"? > >> > >> But it is pretty silly. "user/something_never_used" also looks weird. > > > > "userargh" is terrible, IMO. It's a different identifier that just > > happens to have the first 4 letters matching "user" program type. > > There must be either a standardized separator (which happens to be > > '/') or none. See the suggestion below. > > We have no problem deal with "a different identifier that just happens > to have the first letters matching", like xdp vs. xdp_devmap and > xdp_cpumap, right? > xdp vs xdp_devmap is an entirely different thing. We deal with it by checking xdp_devmap first. What I'm saying is that user can do "xdpomg" and libbpf would be happy (today). And I don't think that's good. But further, if someone does something like "xdp_devmap_omg", guess which program type will be inferred? Hint: not xdp_devmap and libbpf won't report an error either. All because "xdp" is so lax today. > >> > >>> Alternatively, we could introduce a new convention in the spec, > >>> something like "user?", which would accept either "user" or > >>> "user/something", but not "user/" nor "userblah". We can try that as > >>> well. > >> > >> Again, I don't really understand why allowing "userblah" is a problem. > >> We already have "xdp", "xdp_devmap/", and "xdp_cpumap/", they all work > >> fine so far. > > > > Right, we have "xdp_devmap/" and "xdp_cpumap/", as you say. I haven't > > seen so much pushback against trailing forward slash with those ;) > > I haven't seen any issue with old "perf_event", "xdp" and new "struct_ops" > either. > > > > > But anyways, as part of deprecating APIs and preparing libbpf for 1.0 > > release over this half, I think I'm going to emit warnings for names > > like "prog_type_whatever" or "prog_typeevenworse", etc. And asking > > users to normalize section names to either "prog_type" or > > "prog_type/something/here", whichever makes sense for a specific > > program type. > > Exactly, "user" makes sense here; while "kprobe/__set_task_comm" makes > sense for kprobe. Right, but "userblah" doesn't. It would be great if you could help make what I described above become true. But at least don't make it worse by allowing unrestricted "user" prefix. I'm OK with strict "user" or "user/blah", I'm not OK with "userblah", I'm sorry. > > > Right now libbpf doesn't allow two separate BPF programs > > with the same section name, so enforcing strict "user" is limiting to > > users. We are going to lift that restriction pretty soon, though. But > > for now, please stick with what we've been doing lately and mark it as > > "user/", later we'll allow just "user" as well. > > Since we would allow "user" later, why we have to reject it for now? Because libbpf is dumb in that regard today? And instead of migrating users later, I want to prevent users making bad choices right now. Then relax it, if necessary. Alternatively, we can fix up libbpf logic before the USER program type lands. > Imagine the user just compiled and booted into a new kernel with user > program support; and then got the following message: > > libbpf: failed to load program 'user' > > If I were the user, I would definitely question whether the kernel was > correct... That's also bad, and again, we can make libbpf better. I think moving forward any non-recognized BPF program type should be reported by libbpf as an error. But we can't do it right now, we have to have a period in which users will get a chance to update their BPF programs. This will have to happen over few libbpf releases at least. So please join in on the fun of fixing stuff like this.