• Bodong Wang's avatar
    IB/core: Fix ib_wc structure size to remain in 64 bytes boundary · cd2a6e7d
    Bodong Wang authored
    The change of slid from u16 to u32 results in sizeof(struct ib_wc)
    cross 64B boundary, which causes more cache misses. This patch
    rearranges the fields and remain the size to 64B.
    
    Pahole output before this change:
    
    struct ib_wc {
            union {
                    u64                wr_id;                /*           8 */
                    struct ib_cqe *    wr_cqe;               /*           8 */
            };                                               /*     0     8 */
            enum ib_wc_status          status;               /*     8     4 */
            enum ib_wc_opcode          opcode;               /*    12     4 */
            u32                        vendor_err;           /*    16     4 */
            u32                        byte_len;             /*    20     4 */
            struct ib_qp *             qp;                   /*    24     8 */
            union {
                    __be32             imm_data;             /*           4 */
                    u32                invalidate_rkey;      /*           4 */
            } ex;                                            /*    32     4 */
            u32                        src_qp;               /*    36     4 */
            int                        wc_flags;             /*    40     4 */
            u16                        pkey_index;           /*    44     2 */
    
            /* XXX 2 bytes hole, try to pack */
    
            u32                        slid;                 /*    48     4 */
            u8                         sl;                   /*    52     1 */
            u8                         dlid_path_bits;       /*    53     1 */
            u8                         port_num;             /*    54     1 */
            u8                         smac[6];              /*    55     6 */
    
            /* XXX 1 byte hole, try to pack */
    
            u16                        vlan_id;              /*    62     2 */
            /* --- cacheline 1 boundary (64 bytes) --- */
            u8                         network_hdr_type;     /*    64     1 */
    
            /* size: 72, cachelines: 2, members: 17 */
            /* sum members: 62, holes: 2, sum holes: 3 */
            /* padding: 7 */
            /* last cacheline: 8 bytes */
    };
    
    Pahole output after this change:
    
    struct ib_wc {
            union {
                    u64                wr_id;                /*           8 */
                    struct ib_cqe *    wr_cqe;               /*           8 */
            };                                               /*     0     8 */
            enum ib_wc_status          status;               /*     8     4 */
            enum ib_wc_opcode          opcode;               /*    12     4 */
            u32                        vendor_err;           /*    16     4 */
            u32                        byte_len;             /*    20     4 */
            struct ib_qp *             qp;                   /*    24     8 */
            union {
                    __be32             imm_data;             /*           4 */
                    u32                invalidate_rkey;      /*           4 */
            } ex;                                            /*    32     4 */
            u32                        src_qp;               /*    36     4 */
            u32                        slid;                 /*    40     4 */
            int                        wc_flags;             /*    44     4 */
            u16                        pkey_index;           /*    48     2 */
            u8                         sl;                   /*    50     1 */
            u8                         dlid_path_bits;       /*    51     1 */
            u8                         port_num;             /*    52     1 */
            u8                         smac[6];              /*    53     6 */
    
            /* XXX 1 byte hole, try to pack */
    
            u16                        vlan_id;              /*    60     2 */
            u8                         network_hdr_type;     /*    62     1 */
    
            /* size: 64, cachelines: 1, members: 17 */
            /* sum members: 62, holes: 1, sum holes: 1 */
            /* padding: 1 */
    };
    
    Cc: <stable@vger.kernel.org> # v4.13
    Fixes: 7db20ecd ("IB/core: Change wc.slid from 16 to 32 bits")
    Signed-off-by: default avatarBodong Wang <bodong@mellanox.com>
    Reviewed-by: default avatarParav Pandit <parav@mellanox.com>
    Signed-off-by: default avatarLeon Romanovsky <leon@kernel.org>
    Signed-off-by: default avatarJason Gunthorpe <jgg@mellanox.com>
    cd2a6e7d
ib_verbs.h 109 KB