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 <ka...@fb.com>
---
 include/linux/filter.h |  4 ++--
 net/core/filter.c      | 15 ++++++++++-----
 2 files changed, 12 insertions(+), 7 deletions(-)

diff --git a/include/linux/filter.h b/include/linux/filter.h
index 0a355b005bf4..c427dfa5f908 100644
--- a/include/linux/filter.h
+++ b/include/linux/filter.h
@@ -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
diff --git a/net/core/filter.c b/net/core/filter.c
index 0a1bf520c55d..4adfc90b221e 100644
--- a/net/core/filter.c
+++ b/net/core/filter.c
@@ -8406,17 +8406,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);
-- 
2.24.1

Reply via email to