Improve iser_rx_desc alignment

Align iscsi_header[] and data[] on an 8-byte boundary instead of on a 4-byte
boundary. With this patch applied pahole produces the following output:

struct iser_rx_desc {
        struct iser_hdr    iser_header;                  /*     0    28 */
        char                       pad1[4];              /*    28     4 */
        char                       iscsi_header[48];     /*    32    48 */
        /* --- cacheline 1 boundary (64 bytes) was 16 bytes ago --- */
        char                       data[128];            /*    80   128 */
        /* --- cacheline 3 boundary (192 bytes) was 16 bytes ago --- */
        struct ibv_sge     rx_sg;                        /*   208    16 */
        struct ibv_mr *            hdr_mr;               /*   224     8 */
        char                       pad2[24];             /*   232    24 */

        /* size: 256, cachelines: 4, members: 7 */
};

Additionally, this patch fixes the following build errors:

iser.c: In function 'iser_alloc_rx_descriptors':
iser.c:916:11: error: taking address of packed member of 'struct iser_rx_desc' may result in an unaligned pointer value [-Werror=address-of-packed-member]
  916 |   rx_sg = &rx_desc->rx_sg;
      |           ^~~~~~~~~~~~~~~
iser.c: In function 'iser_post_recvm':
iser.c:955:20: error: taking address of packed member of 'struct iser_rx_desc' may result in an unaligned pointer value [-Werror=address-of-packed-member]
  955 |   rx_wr->sg_list = &rx_desc->rx_sg;
      |                    ^~~~~~~~~~~~~~~

Signed-off-by: Bart Van Assche <bvanassche@acm.org>
This commit is contained in:
Bart Van Assche
2019-10-31 13:10:05 -07:00
parent 30fc526c6e
commit a55f11ee68
2 changed files with 8 additions and 5 deletions

View File

@@ -85,9 +85,6 @@ enum data_dir{
#define ISER_MIN_POSTED_RX (ISER_DEF_XMIT_CMDS_MAX >> 2)
#define ISER_RX_PAD_SIZE (256 - (ISER_RX_PAYLOAD_SIZE + \
sizeof(struct ibv_mr*) + sizeof(struct ibv_sge)))
/**
* struct iser_hdr - iSER header
*
@@ -121,13 +118,15 @@ struct iser_hdr {
struct iser_rx_desc {
struct iser_hdr iser_header;
char pad1[4];
char iscsi_header[ISCSI_RAW_HEADER_SIZE];
char data[ISER_RECV_DATA_SEG_LEN];
struct ibv_sge rx_sg;
struct ibv_mr *hdr_mr;
char pad[ISER_RX_PAD_SIZE];
} __attribute__((packed));
char pad2[24];
};
static_assert(sizeof(struct iser_rx_desc) == 256, "iser_rx_desc size != 256");
/**
* struct iser_tx_desc - iSER TX descriptor (for send wr_id)

View File

@@ -30,6 +30,10 @@
extern "C" {
#endif
#ifndef static_assert
#define static_assert(e, m) extern char unused_array[1 - 2 * !(e)]
#endif
#define SCSI_CDB_MAX_SIZE 16
enum scsi_opcode {