RDMA/srp: Apply the __packed attribute to members instead of structures

Applying the __packed attribute to an entire data structure results in
suboptimal code on architectures that do not support unaligned accesses.
Hence apply the __packed attribute only to those data members that are
not naturally aligned.

Link: https://lore.kernel.org/r/20210524041211.9480-4-bvanassche@acm.org
Cc: Nicolas Morey-Chaisemartin <nmoreychaisemartin@suse.com>
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
This commit is contained in:
Bart Van Assche 2021-05-23 21:12:09 -07:00 committed by Jason Gunthorpe
parent c838de1af1
commit 6dc26498e1

View File

@ -107,10 +107,10 @@ struct srp_direct_buf {
* having the 20-byte structure padded to 24 bytes on 64-bit architectures. * having the 20-byte structure padded to 24 bytes on 64-bit architectures.
*/ */
struct srp_indirect_buf { struct srp_indirect_buf {
struct srp_direct_buf table_desc; struct srp_direct_buf table_desc __packed __aligned(4);
__be32 len; __be32 len;
struct srp_direct_buf desc_list[]; struct srp_direct_buf desc_list[] __packed __aligned(4);
} __attribute__((packed)); };
/* Immediate data buffer descriptor as defined in SRP2. */ /* Immediate data buffer descriptor as defined in SRP2. */
struct srp_imm_buf { struct srp_imm_buf {
@ -175,13 +175,13 @@ struct srp_login_rsp {
u8 opcode; u8 opcode;
u8 reserved1[3]; u8 reserved1[3];
__be32 req_lim_delta; __be32 req_lim_delta;
u64 tag; u64 tag __packed __aligned(4);
__be32 max_it_iu_len; __be32 max_it_iu_len;
__be32 max_ti_iu_len; __be32 max_ti_iu_len;
__be16 buf_fmt; __be16 buf_fmt;
u8 rsp_flags; u8 rsp_flags;
u8 reserved2[25]; u8 reserved2[25];
} __attribute__((packed)); };
struct srp_login_rej { struct srp_login_rej {
u8 opcode; u8 opcode;
@ -207,10 +207,6 @@ struct srp_t_logout {
u64 tag; u64 tag;
}; };
/*
* We need the packed attribute because the SRP spec only aligns the
* 8-byte LUN field to 4 bytes.
*/
struct srp_tsk_mgmt { struct srp_tsk_mgmt {
u8 opcode; u8 opcode;
u8 sol_not; u8 sol_not;
@ -225,10 +221,6 @@ struct srp_tsk_mgmt {
u8 reserved5[8]; u8 reserved5[8];
}; };
/*
* We need the packed attribute because the SRP spec only aligns the
* 8-byte LUN field to 4 bytes.
*/
struct srp_cmd { struct srp_cmd {
u8 opcode; u8 opcode;
u8 sol_not; u8 sol_not;
@ -266,7 +258,7 @@ struct srp_rsp {
u8 sol_not; u8 sol_not;
u8 reserved1[2]; u8 reserved1[2];
__be32 req_lim_delta; __be32 req_lim_delta;
u64 tag; u64 tag __packed __aligned(4);
u8 reserved2[2]; u8 reserved2[2];
u8 flags; u8 flags;
u8 status; u8 status;
@ -275,7 +267,7 @@ struct srp_rsp {
__be32 sense_data_len; __be32 sense_data_len;
__be32 resp_data_len; __be32 resp_data_len;
u8 data[]; u8 data[];
} __attribute__((packed)); };
struct srp_cred_req { struct srp_cred_req {
u8 opcode; u8 opcode;
@ -301,13 +293,13 @@ struct srp_aer_req {
u8 sol_not; u8 sol_not;
u8 reserved[2]; u8 reserved[2];
__be32 req_lim_delta; __be32 req_lim_delta;
u64 tag; u64 tag __packed __aligned(4);
u32 reserved2; u32 reserved2;
struct scsi_lun lun; struct scsi_lun lun;
__be32 sense_data_len; __be32 sense_data_len;
u32 reserved3; u32 reserved3;
u8 sense_data[]; u8 sense_data[];
} __attribute__((packed)); };
struct srp_aer_rsp { struct srp_aer_rsp {
u8 opcode; u8 opcode;