Re: [PATCH bpf] bpftool: Fix regression of "bpftool cgroup tree" EINVAL on older kernels

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, May 1, 2025 at 1:04 PM Quentin Monnet <qmo@xxxxxxxxxx> wrote:
>
> 2025-05-01 10:54 UTC-0700 ~ Andrii Nakryiko <andrii.nakryiko@xxxxxxxxx>
> > On Mon, Apr 28, 2025 at 2:15 PM YiFei Zhu <zhuyifei@xxxxxxxxxx> wrote:
> >>
> >> If cgroup_has_attached_progs queries an attach type not supported
> >> by the running kernel, due to the kernel being older than the bpftool
> >> build, it would encounter an -EINVAL from BPF_PROG_QUERY syscall.
> >>
> >> Prior to commit 98b303c9bf05 ("bpftool: Query only cgroup-related
> >> attach types"), this EINVAL would be ignored by the function, allowing
> >> the function to only consider supported attach types. The commit
> >> changed so that, instead of querying all attach types, only attach
> >> types from the array `cgroup_attach_types` is queried. The assumption
> >> is that because these are only cgroup attach types, they should all
> >> be supported. Unfortunately this assumption may be false when the
> >> kernel is older than the bpftool build, where the attach types queried
> >> by bpftool is not yet implemented in the kernel. This would result in
> >> errors such as:
> >>
> >>   $ bpftool cgroup tree
> >>   CgroupPath
> >>   ID       AttachType      AttachFlags     Name
> >>   Error: can't query bpf programs attached to /sys/fs/cgroup: Invalid argument
> >>
> >> This patch restores the logic of ignoring EINVAL from prior to that patch.
> >>
> >> Fixes: 98b303c9bf05 ("bpftool: Query only cgroup-related attach types")
> >> Reported-by: Sagarika Sharma <sharmasagarika@xxxxxxxxxx>
> >> Reported-by: Minh-Anh Nguyen <minhanhdn@xxxxxxxxxx>
> >> Signed-off-by: YiFei Zhu <zhuyifei@xxxxxxxxxx>
> >> ---
> >>  tools/bpf/bpftool/cgroup.c | 2 +-
> >>  1 file changed, 1 insertion(+), 1 deletion(-)
> >>
> >> diff --git a/tools/bpf/bpftool/cgroup.c b/tools/bpf/bpftool/cgroup.c
> >> index 93b139bfb9880..3f1d6be512151 100644
> >> --- a/tools/bpf/bpftool/cgroup.c
> >> +++ b/tools/bpf/bpftool/cgroup.c
> >> @@ -221,7 +221,7 @@ static int cgroup_has_attached_progs(int cgroup_fd)
> >>         for (i = 0; i < ARRAY_SIZE(cgroup_attach_types); i++) {
> >>                 int count = count_attached_bpf_progs(cgroup_fd, cgroup_attach_types[i]);
> >>
> >> -               if (count < 0)
> >> +               if (count < 0 && errno != EINVAL)
> >>                         return -1;
> >
> > let's maybe change count_attached_bpf_progs() to return error directly
> > as returned by bpf_prog_query(), instead of translating that to -1 and
> > then requiring relying on errno?
> >
> > so just
> >
> > if (ret)
> >     return ret;
> >
> > and then just
> >
> > if (count < 0 && count != -EINVAL)
> >     return /* well whatever, I'd return error probably instead of -1 again */
> >
> > Thoughts?
>
> It feels maybe slightly less intuitive to me to compare "count" - rather
> than "errno" - with "-EINVAL", but I don't mind really. It does make
> sense to check the return code from the function. Looks OK from my side.

Hmm. I'm not strongly against it, but consider the current
cgroup_has_attached_progs. If I see

    int count = count_attached_bpf_progs(cgroup_fd, type);
    if (count < 0 && errno != EINVAL)
        return -1;

I know "negative is error, error number is propagated though errno".
If instead, I see

    int count = count_attached_bpf_progs(cgroup_fd, type);
    if (count < 0 && count != -EINVAL)
        return count;

I know "negative is error, error number is propagated though return
value". So I would expect the caller to do

    has_attached_progs = cgroup_has_attached_progs(cgroup_fd);
    if (has_attached_progs < 0) {
        p_err("can't query bpf programs attached to %s: %s",
              path, strerror(-has_attached_progs));

(strerror(-has_attached_progs) rather than strerror(errno)). While I'm
fine with such a change, it looks a bit extraneous for what was a
simple one-line bug fix, and feels like it should be on a separate
patch and probably on bpf-next and not bpf. Wdyt?

YiFei Zhu

> Thanks,
> Quentin





[Index of Archives]     [Linux Samsung SoC]     [Linux Rockchip SoC]     [Linux Actions SoC]     [Linux for Synopsys ARC Processors]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]


  Powered by Linux