[PATCH 4/5] nvmet: Reorder fields in 'struct nvme_dhchap_queue_context'

Christophe JAILLET
2023-05-01T14:49:39Z

Group some variables based on their sizes to reduce holes.
On x86_64, this shrinks the size of 'struct nvme_dhchap_queue_context' from
416 to 400 bytes.

This structure is kvcalloc()'ed in nvme_auth_init_ctrl(), so it is likely
that the allocation can be relatively big. Saving 16 bytes per structure
may might a slight difference.

Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
---
Using pahole

Before:
======
struct nvme_dhchap_queue_context {
struct list_head entry; /* 0 16 */
struct work_struct auth_work; /* 16 80 */
/* --- cacheline 1 boundary (64 bytes) was 32 bytes ago --- */
struct nvme_ctrl * ctrl; /* 96 8 */
struct crypto_shash * shash_tfm; /* 104 8 */
struct crypto_kpp * dh_tfm; /* 112 8 */
void * buf; /* 120 8 */
/* --- cacheline 2 boundary (128 bytes) --- */
int qid; /* 128 4 */
int error; /* 132 4 */
u32 s1; /* 136 4 */
u32 s2; /* 140 4 */
u16 transaction; /* 144 2 */
u8 status; /* 146 1 */
u8 hash_id; /* 147 1 */

/* XXX 4 bytes hole, try to pack */

size_t hash_len; /* 152 8 */
u8 dhgroup_id; /* 160 1 */
u8 c1[64]; /* 161 64 */
/* --- cacheline 3 boundary (192 bytes) was 33 bytes ago --- */
u8 c2[64]; /* 225 64 */
/* --- cacheline 4 boundary (256 bytes) was 33 bytes ago --- */
u8 response[64]; /* 289 64 */

/* XXX 7 bytes hole, try to pack */

/* --- cacheline 5 boundary (320 bytes) was 40 bytes ago --- */
u8 * host_response; /* 360 8 */
u8 * ctrl_key; /* 368 8 */
int ctrl_key_len; /* 376 4 */

/* XXX 4 bytes hole, try to pack */

/* --- cacheline 6 boundary (384 bytes) --- */
u8 * host_key; /* 384 8 */
int host_key_len; /* 392 4 */

/* XXX 4 bytes hole, try to pack */

u8 * sess_key; /* 400 8 */
int sess_key_len; /* 408 4 */

/* size: 416, cachelines: 7, members: 25 */
/* sum members: 393, holes: 4, sum holes: 19 */
/* padding: 4 */
/* last cacheline: 32 bytes */
};

After:
=====
struct nvme_dhchap_queue_context {
struct list_head entry; /* 0 16 */
struct work_struct auth_work; /* 16 80 */
/* --- cacheline 1 boundary (64 bytes) was 32 bytes ago --- */
struct nvme_ctrl * ctrl; /* 96 8 */
struct crypto_shash * shash_tfm; /* 104 8 */
struct crypto_kpp * dh_tfm; /* 112 8 */
void * buf; /* 120 8 */
/* --- cacheline 2 boundary (128 bytes) --- */
int qid; /* 128 4 */
int error; /* 132 4 */
u32 s1; /* 136 4 */
u32 s2; /* 140 4 */
u16 transaction; /* 144 2 */
u8 status; /* 146 1 */
u8 dhgroup_id; /* 147 1 */
u8 hash_id; /* 148 1 */

/* XXX 3 bytes hole, try to pack */

size_t hash_len; /* 152 8 */
u8 c1[64]; /* 160 64 */
/* --- cacheline 3 boundary (192 bytes) was 32 bytes ago --- */
u8 c2[64]; /* 224 64 */
/* --- cacheline 4 boundary (256 bytes) was 32 bytes ago --- */
u8 response[64]; /* 288 64 */
/* --- cacheline 5 boundary (320 bytes) was 32 bytes ago --- */
u8 * host_response; /* 352 8 */
u8 * ctrl_key; /* 360 8 */
u8 * host_key; /* 368 8 */
u8 * sess_key; /* 376 8 */
/* --- cacheline 6 boundary (384 bytes) --- */
int ctrl_key_len; /* 384 4 */
int host_key_len; /* 388 4 */
int sess_key_len; /* 392 4 */

/* size: 400, cachelines: 7, members: 25 */
/* sum members: 393, holes: 1, sum holes: 3 */
/* padding: 4 */
/* last cacheline: 16 bytes */
};
---
drivers/nvme/host/auth.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/nvme/host/auth.c b/drivers/nvme/host/auth.c
index ea16a0aba679..daf5d144a8ea 100644
--- a/drivers/nvme/host/auth.c
+++ b/drivers/nvme/host/auth.c
@@ -30,18 +30,18 @@ struct nvme_dhchap_queue_context {
u32 s2;
u16 transaction;
u8 status;
+ u8 dhgroup_id;
u8 hash_id;
size_t hash_len;
- u8 dhgroup_id;
u8 c1[64];
u8 c2[64];
u8 response[64];
u8 *host_response;
u8 *ctrl_key;
- int ctrl_key_len;
u8 *host_key;
- int host_key_len;
u8 *sess_key;
+ int ctrl_key_len;
+ int host_key_len;
int sess_key_len;
};

--
2.34.1