From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-ed1-x536.google.com (mail-ed1-x536.google.com [IPv6:2a00:1450:4864:20::536]) by mail.toke.dk (Postfix) with ESMTPS id 00E8285AA54 for ; Thu, 24 Jun 2021 17:11:48 +0200 (CEST) Authentication-Results: mail.toke.dk; dkim=pass (1024-bit key) header.d=riotgames.com header.i=@riotgames.com header.b=bnhFKcE/ Received: by mail-ed1-x536.google.com with SMTP id w13so3055748edc.0 for ; Thu, 24 Jun 2021 08:11:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=riotgames.com; s=riotgames; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=X+wkXAtQsHBDfmIg3aI8RsYXOMVy1xyy8S060DX48fE=; b=bnhFKcE/P7kpfoF4Kp+Em/I4Pw3NexpZ9kBgeHx4yjPTOOokO4k4lZvIDxHFO8ieXG sJLidrIZeQVzDb+B6h4hgIYvsl6RfkSftYDmyvQPgvG0jTluqX532/+3COEU7yOcW8X+ 02EimPO9o+GUYOxZQr4AC2nQ96695JfgAGgB4= 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:content-transfer-encoding; bh=X+wkXAtQsHBDfmIg3aI8RsYXOMVy1xyy8S060DX48fE=; b=hc3ubpy4YyjswYwzfN9iJiFjOsHIS24eyNaKvq+ZoCUIBALBBjkVcsny0Viv229T4a 9+iri+GrlFEfc99wvpeBmwGFAfKdAAl9jQKCvhIdYP8oatlTFYO2rR5oPt4v23z231Uw NnyEDLnV8dRbxYLdbD8iu6p+1mudN/GIUGtAPg4s2nTbE5sQy5+UCPkMOBlVwUPgwukh qkHvYzv5uewKTrkW0QBpyQzaIgaQLAyu4gu1XDMDCH7vMATezV/fgd0wawkIkbo01wmt bnVp+q1dWeEbdbRqHoXFgAxud9fX9irwb2jUQr6QnawIigs1e+dOzbItyTgir/CaaCnE snUA== X-Gm-Message-State: AOAM532hApf17C2wua1Fdtc9iZpVhzv+0yg7wIT8y/vyM5LQUiptnuSZ 1lMpFNW6MVoWuuUJUOjb2djXvgK4IOK5dplaGks3IA== X-Google-Smtp-Source: ABdhPJzQDEAm49zw6ly/j6RU+yQoY9xI0T1eVqcuugJGikXmE8gEzYFR2H2U5+K+0WZmOI3yp1+zdQR6V7AjHx2UDvo= X-Received: by 2002:aa7:cc87:: with SMTP id p7mr7810336edt.82.1624547507645; Thu, 24 Jun 2021 08:11:47 -0700 (PDT) MIME-Version: 1.0 References: <60b08442b18d5_1cf8208a0@john-XPS-13-9370.notmuch> <87fsy7gqv7.fsf@toke.dk> <60b0ffb63a21a_1cf82089e@john-XPS-13-9370.notmuch> <20210528180214.3b427837@carbon> <60b12897d2e3f_1cf820896@john-XPS-13-9370.notmuch> <8735u3dv2l.fsf@toke.dk> <60b6cf5b6505e_38d6d208d8@john-XPS-13-9370.notmuch> <20210602091837.65ec197a@kicinski-fedora-PC1C0HJN.hsd1.ca.comcast.net> <874kdqqfnm.fsf@toke.dk> <87mtrfmoyh.fsf@toke.dk> In-Reply-To: <87mtrfmoyh.fsf@toke.dk> From: Zvi Effron Date: Thu, 24 Jun 2021 08:11:36 -0700 Message-ID: Subject: Re: XDP-hints: Howto support multiple BTF types per packet basis? To: =?UTF-8?B?VG9rZSBIw7hpbGFuZC1Kw7hyZ2Vuc2Vu?= Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Message-ID-Hash: SFUVC7RZWCNEJP7YUET4YPRCAFP64L4W X-Message-ID-Hash: SFUVC7RZWCNEJP7YUET4YPRCAFP64L4W X-MailFrom: zeffron@riotgames.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: Michal Swiatkowski , Jakub Kicinski , John Fastabend , Jesper Dangaard Brouer , Andrii Nakryiko , BPF-dev-list , Magnus Karlsson , William Tu , xdp-hints@xdp-project.net X-Mailman-Version: 3.3.4 Precedence: list List-Id: XDP hardware hints design discussion Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: On Thu, Jun 24, 2021 at 5:23 AM Toke H=C3=B8iland-J=C3=B8rgensen wrote: > > Michal Swiatkowski writes: > > > On Tue, Jun 22, 2021 at 01:53:33PM +0200, Toke H=C3=B8iland-J=C3=B8rgen= sen wrote: > >> Michal Swiatkowski writes: > >> > >> > On Wed, Jun 02, 2021 at 09:18:37AM -0700, Jakub Kicinski wrote: > >> >> On Tue, 01 Jun 2021 17:22:51 -0700 John Fastabend wrote: > >> >> > > If we do this, the BPF program obviously needs to know which fi= elds are > >> >> > > valid and which are not. AFAICT you're proposing that this shou= ld be > >> >> > > done out-of-band (i.e., by the system administrator manually en= suring > >> >> > > BPF program config fits system config)? I think there are a cou= ple of > >> >> > > problems with this: > >> >> > > > >> >> > > - It requires the system admin to coordinate device config with= all of > >> >> > > their installed XDP applications. This is error-prone, especi= ally as > >> >> > > the number of applications grows (say if different containers= have > >> >> > > different XDP programs installed on their virtual devices). > >> >> > > >> >> > A complete "system" will need to be choerent. If I forward into a= veth > >> >> > device the orchestration component needs to ensure program sendin= g > >> >> > bits there is using the same format the program installed there e= xpects. > >> >> > > >> >> > If I tailcall/fentry into another program that program the callee= and > >> >> > caller need to agree on the metadata protocol. > >> >> > > >> >> > I don't see any way around this. Someone has to manage the networ= k. > >> >> > >> >> FWIW I'd like to +1 Toke's concerns. > >> >> > >> >> In large deployments there won't be a single arbiter. Saying there > >> >> is seems to contradict BPF maintainers' previous stand which lead > >> >> to addition of bpf_links for XDP. > >> >> > >> >> In practical terms person rolling out an NTP config change may not > >> >> be aware that in some part of the network some BPF program expects > >> >> descriptor not to contain time stamps. Besides features may depend > >> >> or conflict so the effects of feature changes may not be obvious > >> >> across multiple drivers in a heterogeneous environment. > >> >> > >> >> IMO guarding from obvious mis-configuration provides obvious value. > >> > > >> > Hi, > >> > > >> > Thanks for a lot of usefull information about CO-RE. I have read > >> > recommended articles, but still don't understand everything, so sorr= y if > >> > my questions are silly. > >> > > >> > As introduction, I wrote small XDP example using CO-RE (autogenerate= d > >> > vmlinux.h and getting rid of skeleton etc.) based on runqslower > >> > implementation. Offset reallocation of hints works great, I built CO= -RE > >> > application, added new field to hints struct, changed struct layout = and > >> > without rebuilding application everything still works fine. Is it wo= rth > >> > to add XDP sample using CO-RE in kernel or this isn't good place for > >> > this kind of sample? > >> > > >> > First question not stricte related to hints. How to get rid of #defi= ne > >> > and macro when I am using generated vmlinux.h? For example I wanted = to > >> > use htons macro and ethtype definition. They are located in headers = that > >> > also contains few struct definition. Because of that I have redefini= tion > >> > error when I am trying to include them (redefinition in vmlinux.h an= d > >> > this included file). What can I do with this besides coping definiti= ons > >> > to bpf code? > >> > >> One way is to only include the structs you actually need from vmlinux.= h. > >> You can even prune struct members, since CO-RE works just fine with > >> partial struct definitions as long as the member names match. > >> > >> Jesper has an example on how to handle this here: > >> https://github.com/netoptimizer/bpf-examples/blob/ktrace01-CO-RE.publi= c/headers/vmlinux_local.h > >> > > > > I see, thanks, I will take a look at other examples. > > > >> > I defined hints struct in driver code, is it right place for that? A= ll > >> > vendors will define their own hints struct or the idea is to have on= e > >> > big hints struct with flags informing about availability of each fie= lds? > >> > > >> > For me defining it in driver code was easier because I can have used > >> > module btf to generate vmlinux.h with hints struct inside. However t= his > >> > break portability if other vendors will have different struct name e= tc, > >> > am I right? > >> > >> I would expect the easiest is for drivers to just define their own > >> structs and maybe have some infrastructure in the core to let userspac= e > >> discover the right BTF IDs to use for a particular netdev. However, as > >> you say it's not going to work if every driver just invents their own > >> field names, so we'll need to coordinate somehow. We could do this by > >> convention, though, it'll need manual intervention to make sure the > >> semantics of identically-named fields match anyway. > >> > >> Cf the earlier discussion with how many BTF IDs each driver might > >> define, I think we *also* need a way to have flags that specify which > >> fields of a given BTF ID are currently used; and having some common > >> infrastructure for that would be good... > >> > > > > Sounds good. > > > > Sorry, but I feel that I don't fully understand the idea. Correct me if > > I am wrong: > > > > In building CO-RE application step we can defined big struct with > > all possible fields or even empty struct (?) and use > > bpf_core_field_exists. > > > > bpf_core_field_exists will be resolve before loading program by libbpf > > code. In normal case libbpf will look for btf with hints name in vmlinu= x > > of running kernel and do offset rewrite and exsistence check. But as th= e > > same hints struct will be define in multiple modules we want to add mor= e > > logic to libbpf to discover correct BTF ID based on netdev on which pro= gram > > will be loaded? > > I would expect that the program would decide ahead-of-time which BTF IDs > it supports, by something like including the relevant structs from > vmlinux.h. And then we need the BTF ID encoded into the packet metadata > as well, so that it is possible to check at run-time which driver the > packet came from (since a packet can be redirected, so you may end up > having to deal with multiple formats in the same XDP program). > > Which would allow you to write code like: > > if (ctx->has_driver_meta) { > /* this should be at a well-known position, like first (or last) in met= a area */ > __u32 *meta_btf_id =3D ctx->data_meta; > > if (*meta_btf_id =3D=3D BTF_ID_MLX5) { > struct meta_mlx5 *meta =3D ctx->data_meta; > /* do something with meta */ > } else if (meta_btf_id =3D=3D BTF_ID_I40E) { > struct meta_i40e *meta =3D ctx->data_meta; > /* do something with meta */ > } /* etc */ > } > > and libbpf could do relocations based on the different meta structs, > even removing the code for the ones that don't exist on the running > kernel. > > -Toke > How does putting the BTF ID and the driver metadata into the XDP metadata section interact with programs that are already using the metadata section for other purposes. For example, programs that use the XDP metadata to pass information through BPF tail calls? Would this break existing programs that aren't aware of the new driver metadata? Do we need to make driver metadata opt-in at XDP program load? --Zvi