bpf: sock_ops: Change some members of sock_ops_kern from u32 to u8
authorMartin KaFai Lau <kafai@fb.com>
Thu, 20 Aug 2020 19:00:58 +0000 (12:00 -0700)
committerAlexei Starovoitov <ast@kernel.org>
Mon, 24 Aug 2020 21:35:00 +0000 (14:35 -0700)
A later patch needs to add a few pointers and a few u8 to
sock_ops_kern.  Hence, this patch saves some spaces by moving
some of the existing members from u32 to u8 so that the later
patch can still fit everything in a cacheline.

Signed-off-by: Martin KaFai Lau <kafai@fb.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Link: https://lore.kernel.org/bpf/20200820190058.2885640-1-kafai@fb.com
include/linux/filter.h
net/core/filter.c

index 0a355b005bf458dadcec078d3ca2a94e75054f0c..c427dfa5f908e1071bbe0df9725ebbb224fb8574 100644 (file)
@@ -1236,13 +1236,13 @@ struct bpf_sock_addr_kern {
 
 struct bpf_sock_ops_kern {
        struct  sock *sk;
-       u32     op;
        union {
                u32 args[4];
                u32 reply;
                u32 replylong[4];
        };
-       u32     is_fullsock;
+       u8      op;
+       u8      is_fullsock;
        u64     temp;                   /* temp and everything after is not
                                         * initialized to 0 before calling
                                         * the BPF program. New fields that
index 075ab71b985c4ab2b5485f8670b7b2dee637ebe0..1608f4b3987f3771e7b7a4cef70c1423710bf0e0 100644 (file)
@@ -8465,17 +8465,22 @@ static u32 sock_ops_convert_ctx_access(enum bpf_access_type type,
                return insn - insn_buf;
 
        switch (si->off) {
-       case offsetof(struct bpf_sock_ops, op) ...
+       case offsetof(struct bpf_sock_ops, op):
+               *insn++ = BPF_LDX_MEM(BPF_FIELD_SIZEOF(struct bpf_sock_ops_kern,
+                                                      op),
+                                     si->dst_reg, si->src_reg,
+                                     offsetof(struct bpf_sock_ops_kern, op));
+               break;
+
+       case offsetof(struct bpf_sock_ops, replylong[0]) ...
             offsetof(struct bpf_sock_ops, replylong[3]):
-               BUILD_BUG_ON(sizeof_field(struct bpf_sock_ops, op) !=
-                            sizeof_field(struct bpf_sock_ops_kern, op));
                BUILD_BUG_ON(sizeof_field(struct bpf_sock_ops, reply) !=
                             sizeof_field(struct bpf_sock_ops_kern, reply));
                BUILD_BUG_ON(sizeof_field(struct bpf_sock_ops, replylong) !=
                             sizeof_field(struct bpf_sock_ops_kern, replylong));
                off = si->off;
-               off -= offsetof(struct bpf_sock_ops, op);
-               off += offsetof(struct bpf_sock_ops_kern, op);
+               off -= offsetof(struct bpf_sock_ops, replylong[0]);
+               off += offsetof(struct bpf_sock_ops_kern, replylong[0]);
                if (type == BPF_WRITE)
                        *insn++ = BPF_STX_MEM(BPF_W, si->dst_reg, si->src_reg,
                                              off);