Received: by 2002:a05:6358:4e97:b0:b3:742d:4702 with SMTP id ce23csp3349713rwb; Tue, 16 Aug 2022 00:57:54 -0700 (PDT) X-Google-Smtp-Source: AA6agR5eT2U+lyB+tDceWD/1XBlcRIwsH14XFB0XIfZBj0Q3My4bBJemnJHp+141tiMWiQmTjLLk X-Received: by 2002:a17:90b:33d1:b0:1f5:4fc5:3d72 with SMTP id lk17-20020a17090b33d100b001f54fc53d72mr22170263pjb.60.1660636673816; Tue, 16 Aug 2022 00:57:53 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1660636673; cv=none; d=google.com; s=arc-20160816; b=HoIMrLx23Gq5iW/LPiW6VzDuWvAMzx1NAID5FSyCfIx3JdwcXrjraKweHAJQVxt7iP /M2rXwMSv+HPkYhE7NhoSJRA8a2TnhEy8xZ+PiG+gGqawLpwRr69R5cMQZjXa7zaoLZI uKLJqrS3Wr7GHyzSw6+PpFmzFMtaS3o27LkZOpo//Hftj/nYucEuWHnQPItLyLLaBAMU /ATfcGE62iBOHZD05pQVmGpRmi1AVtu0NRM3bNw/s7g9NY48WWGkq3nzqcu3ws+HxK5h eWJcvUzfflqFEPQfDyRTLo1h/0PH3SJFx4G/0W94Pv67brxig/jKT4vLoFNTO70FOxAO 350w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:subject:message-id:date:from:in-reply-to :references:mime-version:dkim-signature; bh=E36fWmPh7uE8eC/oxj202Sk4LfbNCTfTw1OCIdIjfv8=; b=CGm/wnZQ1xKWiWATGPo0ZrePcKGOZO6ZBxivb3xoArQFgVo9C3Re6vVlcXfDG35EGz 7O0zNCd+VUW+HUuYTIgpvav4Iae2xVbP958f31xslFGxViiOEBcXnuQT2+KTBlrk4cxR AiYx4Jc0Ojx/2H12qO1I7sE4ua5EyPZXSobqqAdqdkDIw7GJHbwbzcOvNxi4oFbXTKg+ yl+fC9VLzuwP/C+SRO7D4jNYpVds3BINhdVsrSilCTx/XTxtLpmRDCs170/N3khwcGj8 QyeQrAQp8QaD2ZNilvVM56YAkuoHVCQfnFHUAz4SanARxDGiWi0nMKAklXYyxrXpOpeD KzSQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20210112 header.b="BH3/pf1h"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 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 out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id mw16-20020a17090b4d1000b001f73f7589f4si16300945pjb.120.2022.08.16.00.57.42; Tue, 16 Aug 2022 00:57:53 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20210112 header.b="BH3/pf1h"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 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 S232250AbiHPHee (ORCPT + 99 others); Tue, 16 Aug 2022 03:34:34 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41578 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231913AbiHPHeM (ORCPT ); Tue, 16 Aug 2022 03:34:12 -0400 Received: from mail-ej1-x629.google.com (mail-ej1-x629.google.com [IPv6:2a00:1450:4864:20::629]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2193E7FFAF; Mon, 15 Aug 2022 21:13:09 -0700 (PDT) Received: by mail-ej1-x629.google.com with SMTP id tl27so16783660ejc.1; Mon, 15 Aug 2022 21:13:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc; bh=E36fWmPh7uE8eC/oxj202Sk4LfbNCTfTw1OCIdIjfv8=; b=BH3/pf1hjF6ZCJlhrBlccHek4xDpGK3/GD7Qh+FbJLIN1Hx43Rp8H2062fM5AzCLMT 3HIMe5qvf/Fd1poqRcJQOQuVV0LLdzLsa+9LpYXMm/K1R6UXcxClZPAN7BwafKIRpUR2 oKwLXpF/A+mPi+OhwEDDmCnhrFf0EZvpRZBejXX0oeE6QFPp3ji3eKHeAiqfcrs37rXk L9FuX4lUkX6Qg6bnbfN8bsNMMXkTiRwCn8+cwu7upMDAPdZ1Tq+BwrVfJdeOSsCleyT7 jWfo75P5sV74NsHX91p5qC3TbDc1bNZVE/fOzoJ61I86L1+axvpucGpy1pFAaGAxCyOB 88Fw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc; bh=E36fWmPh7uE8eC/oxj202Sk4LfbNCTfTw1OCIdIjfv8=; b=PI4oa6YN3/hrB+kaZkZjeyiWLIhfwwmU5E16uOq4Sod58WYC9/jOlfBdSQ2UZ/kHIA XaZTNRucuwEHMjbzjtZb3UamRybX8WPxvbt9qfjvJCZ/uWkih1i9sug+f/qAxvuv6j73 vamNicksCbpX1x/TYxMtYL369U8+km2N5BAgSDgPfT2uskhZZeqVy621dC1hiU/3l4KD GlL9/IO1iutx4EuzAe2/TmMaLn8Rm9ybeimNjVHnJms5BB0zN2Dy7cVf/CVa6Dyja0xg cCyr0/SwPd5b8N+3D8+KFIWEUFGwnPiJUfjWg5oXylzzzs/n8uE71e/ho93Yoi92O4Nr gLKw== X-Gm-Message-State: ACgBeo0azZ1k/+Q+e5uQkWf5b8VXPZLKB0djsC6JGoyMPx88LNeNEM3k LZZoonqsaVm6PdBuiOUcYB3xdGXzjt1sU5STkSQ= X-Received: by 2002:a17:907:6e22:b0:731:152:2504 with SMTP id sd34-20020a1709076e2200b0073101522504mr12575234ejc.545.1660623187547; Mon, 15 Aug 2022 21:13:07 -0700 (PDT) MIME-Version: 1.0 References: <20220805214821.1058337-1-haoluo@google.com> <20220805214821.1058337-5-haoluo@google.com> <20220809162325.hwgvys5n3rivuz7a@MacBook-Pro-3.local.dhcp.thefacebook.com> In-Reply-To: From: Andrii Nakryiko Date: Mon, 15 Aug 2022 21:12:56 -0700 Message-ID: Subject: Re: [PATCH bpf-next v7 4/8] bpf: Introduce cgroup iter To: Yosry Ahmed Cc: Hao Luo , Alexei Starovoitov , Linux Kernel Mailing List , bpf , Cgroups , Networking , Alexei Starovoitov , Andrii Nakryiko , Daniel Borkmann , Martin KaFai Lau , Song Liu , Yonghong Song , Tejun Heo , Zefan Li , KP Singh , Johannes Weiner , Michal Hocko , Benjamin Tissoires , John Fastabend , Michal Koutny , Roman Gushchin , David Rientjes , Stanislav Fomichev , Shakeel Butt Content-Type: text/plain; charset="UTF-8" X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM, RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu, Aug 11, 2022 at 7:10 AM Yosry Ahmed wrote: > > On Wed, Aug 10, 2022 at 8:10 PM Hao Luo wrote: > > > > On Tue, Aug 9, 2022 at 11:38 AM Hao Luo wrote: > > > > > > On Tue, Aug 9, 2022 at 9:23 AM Alexei Starovoitov > > > wrote: > > > > > > > > On Mon, Aug 08, 2022 at 05:56:57PM -0700, Hao Luo wrote: > > > > > On Mon, Aug 8, 2022 at 5:19 PM Andrii Nakryiko > > > > > wrote: > > > > > > > > > > > > On Fri, Aug 5, 2022 at 2:49 PM Hao Luo wrote: > > > > > > > > > > > > > > Cgroup_iter is a type of bpf_iter. It walks over cgroups in four modes: > > > > > > > > > > > > > > - walking a cgroup's descendants in pre-order. > > > > > > > - walking a cgroup's descendants in post-order. > > > > > > > - walking a cgroup's ancestors. > > > > > > > - process only the given cgroup. > > > > > > > > > > [...] > > > > > > > diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h > > > > > > > index 59a217ca2dfd..4d758b2e70d6 100644 > > > > > > > --- a/include/uapi/linux/bpf.h > > > > > > > +++ b/include/uapi/linux/bpf.h > > > > > > > @@ -87,10 +87,37 @@ struct bpf_cgroup_storage_key { > > > > > > > __u32 attach_type; /* program attach type (enum bpf_attach_type) */ > > > > > > > }; > > > > > > > > > > > > > > +enum bpf_iter_order { > > > > > > > + BPF_ITER_ORDER_DEFAULT = 0, /* default order. */ > > > > > > > > > > > > why is this default order necessary? It just adds confusion (I had to > > > > > > look up source code to know what is default order). I might have > > > > > > missed some discussion, so if there is some very good reason, then > > > > > > please document this in commit message. But I'd rather not do some > > > > > > magical default order instead. We can set 0 to mean invalid and error > > > > > > out, or just do SELF as the very first value (and if user forgot to > > > > > > specify more fancy mode, they hopefully will quickly discover this in > > > > > > their testing). > > > > > > > > > > > > > > > > PRE/POST/UP are tree-specific orders. SELF applies on all iters and > > > > > yields only a single object. How does task_iter express a non-self > > > > > order? By non-self, I mean something like "I don't care about the > > > > > order, just scan _all_ the objects". And this "don't care" order, IMO, > > > > > may be the common case. I don't think everyone cares about walking > > > > > order for tasks. The DEFAULT is intentionally put at the first value, > > > > > so that if users don't care about order, they don't have to specify > > > > > this field. > > > > > > > > > > If that sounds valid, maybe using "UNSPEC" instead of "DEFAULT" is better? > > > > > > > > I agree with Andrii. > > > > This: > > > > + if (order == BPF_ITER_ORDER_DEFAULT) > > > > + order = BPF_ITER_DESCENDANTS_PRE; > > > > > > > > looks like an arbitrary choice. > > > > imo > > > > BPF_ITER_DESCENDANTS_PRE = 0, > > > > would have been more obvious. No need to dig into definition of "default". > > > > > > > > UNSPEC = 0 > > > > is fine too if we want user to always be conscious about the order > > > > and the kernel will error if that field is not initialized. > > > > That would be my preference, since it will match the rest of uapi/bpf.h > > > > > > > > > > Sounds good. In the next version, will use > > > > > > enum bpf_iter_order { > > > BPF_ITER_ORDER_UNSPEC = 0, > > > BPF_ITER_SELF_ONLY, /* process only a single object. */ > > > BPF_ITER_DESCENDANTS_PRE, /* walk descendants in pre-order. */ > > > BPF_ITER_DESCENDANTS_POST, /* walk descendants in post-order. */ > > > BPF_ITER_ANCESTORS_UP, /* walk ancestors upward. */ > > > }; > > > > > > > Sigh, I find that having UNSPEC=0 and erroring out when seeing UNSPEC > > doesn't work. Basically, if we have a non-iter prog and a cgroup_iter > > prog written in the same source file, I can't use > > bpf_object__attach_skeleton to attach them. Because the default > > prog_attach_fn for iter initializes `order` to 0 (that is, UNSPEC), > > which is going to be rejected by the kernel. In order to make > > bpf_object__attach_skeleton work on cgroup_iter, I think I need to use > > the following > > > > enum bpf_iter_order { so first of all, this can't be called "bpf_iter_order" as it doesn't apply to BPF iterators in general. I think this should be called bpf_iter_cgroup_order (or maybe bpf_cgroup_iter_order) and if/when we add ability to iterate tasks within cgroups then we'll just reuse enum bpf_iter_cgroup_order as an extra parameter for task iterator. And with that future case in mind I do think that we should have 0 being "UNSPEC" case. > > BPF_ITER_DESCENDANTS_PRE, /* walk descendants in pre-order. */ > > BPF_ITER_DESCENDANTS_POST, /* walk descendants in post-order. */ > > BPF_ITER_ANCESTORS_UP, /* walk ancestors upward. */ > > BPF_ITER_SELF_ONLY, /* process only a single object. */ > > }; > > > > So that when calling bpf_object__attach_skeleton() on cgroup_iter, a > > link can be generated and the generated link defaults to pre-order > > walk on the whole hierarchy. Is there a better solution? > > I was actually surprised that we specify these additional parameters at attach (LINK_CREATE) time, and not at bpf_iter_create() call time. It seems more appropriate to allow to specify such runtime parameters very late, when we create a specific instance of seq_file. But I guess this was done because one of the initial motivations for iterators was to be pinned in BPFFS and read as a file, so it was more convenient to store such parameters upfront at link creation time to keep BPF_OBJ_PIN simpler. I guess it makes sense, worst case you'll need to create multiple bpf_link files, one for each cgroup hierarchy you'd like to query with the same single BPF program. But I digress. As for not being able to auto-attach cgroup iterator. I think that's sort of expected and is in line with not being able to auto-attach cgroup programs, as you need cgroup FD at runtime. So even if you had some reasonable default order, you still would need to specify target cgroup (either through FD or ID). So... either don't do skeleton auto-attach, or let's teach libbpf code to not auto-attach some iter types? Alternatively, we could teach libbpf to parse some sort of cgroup iterator spec, like: SEC("iter/cgroup:/path/to/cgroup:descendants_pre") But this approach won't work for a bunch of other parameterized iterators (e.g., task iter, or map elem iter), so I'm hesitant about adding this to libbpf as a generic functionality. > > I think this can be handled by userspace? We can attach the > cgroup_iter separately first (and maybe we will need to set prog->link > as well) so that bpf_object__attach_skeleton() doesn't try to attach > it? I am following this pattern in the selftest in the final patch, > although I think I might be missing setting prog->link, so I am > wondering why there are no issues in that selftest which has the same > scenario that you are talking about. > > I think such a pattern will need to be used anyway if the users need > to set any non-default arguments for the cgroup_iter prog (like the > selftest), right? The only case we are discussing here is the case > where the user wants to attach the cgroup_iter with all default > options (in which case the default order will fail). > I agree that it might be inconvenient if the default/uninitialized > options don't work for cgroup_iter, but Alexei pointed out that this > matches other bpf uapis. > > My concern is that in the future we try to reuse enum bpf_iter_order > to set ordering for other iterators, and then the > default/uninitialized value (BPF_ITER_DESCENDANTS_PRE) doesn't make > sense for that iterator (e.g. not a tree). In this case, the same > problem that we are avoiding for cgroup_iter here will show up for > that iterator, and we can't easily change it at this point because > it's uapi. Yep, valid concern, I agree. > > > > > and explicitly list the values acceptable by cgroup_iter, error out if > > > UNSPEC is detected. > > > > > > Also, following Andrii's comments, will change BPF_ITER_SELF to > > > BPF_ITER_SELF_ONLY, which does seem a little bit explicit in > > > comparison. > > > > > > > I applied the first 3 patches to ease respin. > > > > > > Thanks! This helps! > > > > > > > Thanks!