On Wed, Mar 22, 2023 at 12:47:54PM -0700, JP Kobryn wrote: > This patch changes the return types of bpf_map_ops functions to long, where > previously int was returned. Using long allows for bpf programs to maintain > the sign bit in the absence of sign extension during situations where > inlined bpf helper funcs make calls to the bpf_map_ops funcs and a negative > error is returned. > > The definitions of the helper funcs are generated from comments in the bpf > uapi header at `include/uapi/linux/bpf.h`. The return type of these > helpers was previously changed from int to long in commit bdb7b79b4ce8. For > any case where one of the map helpers call the bpf_map_ops funcs that are > still returning 32-bit int, a compiler might not include sign extension > instructions to properly convert the 32-bit negative value a 64-bit > negative value. > > For example: > bpf assembly excerpt of an inlined helper calling a kernel function and > checking for a specific error: > > ; err = bpf_map_update_elem(&mymap, &key, &val, BPF_NOEXIST); > ... > 46: call 0xffffffffe103291c ; htab_map_update_elem > ; if (err && err != -EEXIST) { > 4b: cmp $0xffffffffffffffef,%rax ; cmp -EEXIST,%rax > > kernel function assembly excerpt of return value from > `htab_map_update_elem` returning 32-bit int: > > movl $0xffffffef, %r9d > ... > movl %r9d, %eax > > ...results in the comparison: > cmp $0xffffffffffffffef, $0x00000000ffffffef > > Fixes: bdb7b79b4ce8 (bpf: Switch most helper return values from 32-bit int > to 64-bit long) please don't break Fixes tag into multiple lines. Also keep "". I fixed it this time while applying.