Re: [PATCH v4 bpf-next 3/9] bpf, xdp: extract common XDP program attachment logic
From: Andrii Nakryiko <hidden>
Date: 2020-08-12 02:19:37
Also in:
bpf
On Tue, Aug 11, 2020 at 11:14 AM [off-list ref] wrote:
On 07/21, Andrii Nakryiko wrote:quoted
Further refactor XDP attachment code. dev_change_xdp_fd() is split into two parts: getting bpf_progs from FDs and attachment logic, working with bpf_progs. This makes attachment logic a bit more straightforward and prepares code for bpf_xdp_link inclusion, which will share the common logic.It looks like this patch breaks xdp tests for me: * test_xdping.sh * test_xdp_vlan.sh Can you please verify on your side? Looking at tools/testing/selftests/bpf/xdping.c I see it has: static __u32 xdp_flags = XDP_FLAGS_UPDATE_IF_NOEXIST; And it attaches program two times in the same net namespace, so I don't see how it could've worked before the change :-/ (unless, of coarse, the previous code was buggy).
Ok, so according to the old logic, XDP_FLAGS_UPDATE_IF_NOEXIST flag is
only checked if new program fd is not -1. So if we are installing a
new program and specify XDP_FLAGS_UPDATE_IF_NOEXIST, we'll be allowed
to do this only if there is no BPF program already attached. But we
are uninstalling program, then XDP_FLAGS_UPDATE_IF_NOEXIST is ignored
and we are allowed to uninstall any BPF program.
I can easily fix this by moving the XDP_FLAGS_UPDATE_IF_NOEXIST check
inside `if (new_prog) {}` section. I'm not sure which semantics was
actually originally intended. Maybe XDP folks can chime in here?