From: Mat Martineau <mathew.j.martineau@xxxxxxxxxxxxxxx> Date: Thu, 9 Jan 2020 07:59:15 -0800 > Match the 16-bit width of skbuff->protocol. Fills an 8-bit hole so > sizeof(struct sock) does not change. > > Also take care of BPF field access for sk_type/sk_protocol. Both of them > are now outside the bitfield, so we can use load instructions without > further shifting/masking. > > v5 -> v6: > - update eBPF accessors, too (Intel's kbuild test robot) > v2 -> v3: > - keep 'sk_type' 2 bytes aligned (Eric) > v1 -> v2: > - preserve sk_pacing_shift as bit field (Eric) > > Cc: Alexei Starovoitov <ast@xxxxxxxxxx> > Cc: Daniel Borkmann <daniel@xxxxxxxxxxxxx> > Cc: bpf@xxxxxxxxxxxxxxx > Co-developed-by: Paolo Abeni <pabeni@xxxxxxxxxx> > Signed-off-by: Paolo Abeni <pabeni@xxxxxxxxxx> > Co-developed-by: Matthieu Baerts <matthieu.baerts@xxxxxxxxxxxx> > Signed-off-by: Matthieu Baerts <matthieu.baerts@xxxxxxxxxxxx> > Signed-off-by: Mat Martineau <mathew.j.martineau@xxxxxxxxxxxxxxx> This is worrisome for me. We have lots of places that now are going to be assigning sk->sk_protocol into a u8 somewhere else. A lot of them are ok because limits are enforced in various places, but for example: net/ipv6/udp.c: fl6.flowi6_proto = sk->sk_protocol; net/l2tp/l2tp_ip6.c: fl6.flowi6_proto = sk->sk_protocol; net/ipv6/inet6_connection_sock.c: fl6->flowi6_proto = sk->sk_protocol; net/ipv6/af_inet6.c: fl6.flowi6_proto = sk->sk_protocol; net/ipv6/datagram.c: fl6->flowi6_proto = sk->sk_protocol; This is one just one small example situation, where flowi6_proto is a u8.