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:
@@ -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)
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user