• J
    bpf: Add alignment padding for "map_extra" + consolidate holes · 8845b468
    Joanne Koong 提交于
    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 36f9814a ("bpf: fix uapi hole
    for 32 bit compat applications")
    Signed-off-by: NJoanne Koong <joannekoong@fb.com>
    Signed-off-by: NAlexei Starovoitov <ast@kernel.org>
    Acked-by: NYonghong Song <yhs@fb.com>
    Link: https://lore.kernel.org/bpf/20211029224909.1721024-3-joannekoong@fb.com
    8845b468
bpf.h 71.3 KB