OSDN Git Service

bpf: Add alignment padding for "map_extra" + consolidate holes
authorJoanne Koong <joannekoong@fb.com>
Fri, 29 Oct 2021 22:49:08 +0000 (15:49 -0700)
committerAlexei Starovoitov <ast@kernel.org>
Mon, 1 Nov 2021 21:16:03 +0000 (14:16 -0700)
This patch makes 2 changes regarding alignment padding
for the "map_extra" field.

1) In the kernel header, "map_extra" and "btf_value_type_id"
are rearranged to consolidate the hole.

Before:
struct bpf_map {
...
        u32 max_entries; /*    36     4 */
        u32 map_flags; /*    40     4 */

        /* XXX 4 bytes hole, try to pack */

        u64 map_extra; /*    48     8 */
        int spin_lock_off; /*    56     4 */
        int timer_off; /*    60     4 */
        /* --- cacheline 1 boundary (64 bytes) --- */
        u32 id; /*    64     4 */
        int numa_node; /*    68     4 */
...
        bool frozen; /*   117     1 */

        /* XXX 10 bytes hole, try to pack */

        /* --- cacheline 2 boundary (128 bytes) --- */
...
        struct work_struct work; /*   144    72 */

        /* --- cacheline 3 boundary (192 bytes) was 24 bytes ago --- */
struct mutex freeze_mutex; /*   216   144  */

        /* --- cacheline 5 boundary (320 bytes) was 40 bytes ago --- */
        u64 writecnt;  /*   360     8 */

    /* size: 384, cachelines: 6, members: 26 */
    /* sum members: 354, holes: 2, sum holes: 14 */
    /* padding: 16 */
    /* forced alignments: 2, forced holes: 1, sum forced holes: 10 */

} __attribute__((__aligned__(64)));

After:
struct bpf_map {
...
        u32 max_entries; /*    36     4 */
        u64 map_extra; /*    40     8  */
        u32 map_flags; /*    48     4 */
        int spin_lock_off; /*    52     4 */
        int timer_off; /*    56     4 */
        u32 id; /*    60     4 */

        /* --- cacheline 1 boundary (64 bytes) --- */
        int numa_node; /*    64     4 */
...
bool frozen /*   113     1  */

        /* XXX 14 bytes hole, try to pack */

        /* --- cacheline 2 boundary (128 bytes) --- */
...
        struct work_struct work; /*   144    72 */

        /* --- cacheline 3 boundary (192 bytes) was 24 bytes ago --- */
        struct mutex freeze_mutex; /*   216   144 */

        /* --- cacheline 5 boundary (320 bytes) was 40 bytes ago --- */
        u64 writecnt;       /*   360     8 */

    /* size: 384, cachelines: 6, members: 26 */
    /* sum members: 354, holes: 1, sum holes: 14 */
    /* padding: 16 */
    /* forced alignments: 2, forced holes: 1, sum forced holes: 14 */

} __attribute__((__aligned__(64)));

2) Add alignment padding to the bpf_map_info struct
More details can be found in commit 36f9814a494a ("bpf: fix uapi hole
for 32 bit compat applications")

Signed-off-by: Joanne Koong <joannekoong@fb.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Acked-by: Yonghong Song <yhs@fb.com>
Link: https://lore.kernel.org/bpf/20211029224909.1721024-3-joannekoong@fb.com
include/linux/bpf.h
include/uapi/linux/bpf.h
tools/include/uapi/linux/bpf.h

index c098089..f6743d4 100644 (file)
@@ -168,23 +168,23 @@ struct bpf_map {
        u32 key_size;
        u32 value_size;
        u32 max_entries;
-       u32 map_flags;
        u64 map_extra; /* any per-map-type extra fields */
+       u32 map_flags;
        int spin_lock_off; /* >=0 valid offset, <0 error */
        int timer_off; /* >=0 valid offset, <0 error */
        u32 id;
        int numa_node;
        u32 btf_key_type_id;
        u32 btf_value_type_id;
+       u32 btf_vmlinux_value_type_id;
        struct btf *btf;
 #ifdef CONFIG_MEMCG_KMEM
        struct mem_cgroup *memcg;
 #endif
        char name[BPF_OBJ_NAME_LEN];
-       u32 btf_vmlinux_value_type_id;
        bool bypass_spec_v1;
        bool frozen; /* write-once; write-protected by freeze_mutex */
-       /* 22 bytes hole */
+       /* 14 bytes hole */
 
        /* The 3rd and 4th cacheline with misc members to avoid false sharing
         * particularly with refcounting.
index bd0c9f0..ba5af15 100644 (file)
@@ -5662,6 +5662,7 @@ struct bpf_map_info {
        __u32 btf_id;
        __u32 btf_key_type_id;
        __u32 btf_value_type_id;
+       __u32 :32;      /* alignment pad */
        __u64 map_extra;
 } __attribute__((aligned(8)));
 
index bd0c9f0..ba5af15 100644 (file)
@@ -5662,6 +5662,7 @@ struct bpf_map_info {
        __u32 btf_id;
        __u32 btf_key_type_id;
        __u32 btf_value_type_id;
+       __u32 :32;      /* alignment pad */
        __u64 map_extra;
 } __attribute__((aligned(8)));