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_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
|
* struct iser_hdr - iSER header
|
||||||
*
|
*
|
||||||
@@ -121,13 +118,15 @@ struct iser_hdr {
|
|||||||
|
|
||||||
struct iser_rx_desc {
|
struct iser_rx_desc {
|
||||||
struct iser_hdr iser_header;
|
struct iser_hdr iser_header;
|
||||||
|
char pad1[4];
|
||||||
char iscsi_header[ISCSI_RAW_HEADER_SIZE];
|
char iscsi_header[ISCSI_RAW_HEADER_SIZE];
|
||||||
char data[ISER_RECV_DATA_SEG_LEN];
|
char data[ISER_RECV_DATA_SEG_LEN];
|
||||||
struct ibv_sge rx_sg;
|
struct ibv_sge rx_sg;
|
||||||
struct ibv_mr *hdr_mr;
|
struct ibv_mr *hdr_mr;
|
||||||
char pad[ISER_RX_PAD_SIZE];
|
char pad2[24];
|
||||||
} __attribute__((packed));
|
};
|
||||||
|
|
||||||
|
static_assert(sizeof(struct iser_rx_desc) == 256, "iser_rx_desc size != 256");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* struct iser_tx_desc - iSER TX descriptor (for send wr_id)
|
* struct iser_tx_desc - iSER TX descriptor (for send wr_id)
|
||||||
|
|||||||
@@ -30,6 +30,10 @@
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef static_assert
|
||||||
|
#define static_assert(e, m) extern char unused_array[1 - 2 * !(e)]
|
||||||
|
#endif
|
||||||
|
|
||||||
#define SCSI_CDB_MAX_SIZE 16
|
#define SCSI_CDB_MAX_SIZE 16
|
||||||
|
|
||||||
enum scsi_opcode {
|
enum scsi_opcode {
|
||||||
|
|||||||
Reference in New Issue
Block a user