iser: eliminate unnecessary memory allocations

Allocate `iser_pdu` from small allocation pool.
Lifecycle of `iscsi_in_pdu` is inside the function in iSER transport. Allocate
it on stack.

Signed-off-by: wanghonghao <wanghonghao@bytedance.com>
This commit is contained in:
wanghonghao
2020-04-14 18:02:36 +08:00
parent 2b9b097c35
commit a22a9bb7db
+18 -23
View File
@@ -553,7 +553,7 @@ iscsi_iser_new_pdu(struct iscsi_context *iscsi, __attribute__((unused))size_t si
struct iscsi_pdu *pdu; struct iscsi_pdu *pdu;
struct iser_pdu *iser_pdu; struct iser_pdu *iser_pdu;
iser_pdu = iscsi_zmalloc(iscsi, sizeof(*iser_pdu)); iser_pdu = iscsi_szmalloc(iscsi, sizeof(*iser_pdu));
pdu = &iser_pdu->iscsi_pdu; pdu = &iser_pdu->iscsi_pdu;
pdu->indata.data = NULL; pdu->indata.data = NULL;
@@ -596,7 +596,7 @@ iscsi_iser_free_pdu(struct iscsi_context *iscsi, struct iscsi_pdu *pdu)
iscsi->outqueue_current = NULL; iscsi->outqueue_current = NULL;
} }
iscsi_free(iscsi, iser_pdu); iscsi_sfree(iscsi, iser_pdu);
} }
/** /**
@@ -1316,18 +1316,16 @@ static int
iser_rcv_completion(struct iser_rx_desc *rx_desc, iser_rcv_completion(struct iser_rx_desc *rx_desc,
struct iser_conn *iser_conn) struct iser_conn *iser_conn)
{ {
struct iscsi_in_pdu *in = NULL; struct iscsi_in_pdu in;
int empty, err; int empty, err;
struct iscsi_context *iscsi = iser_conn->cma_id->context; struct iscsi_context *iscsi = iser_conn->cma_id->context;
in = iscsi_malloc(iscsi, sizeof(*in)); in.hdr = (unsigned char*)rx_desc->iscsi_header;
in.data_pos = iscsi_get_pdu_data_size(&in.hdr[0]);
in.data = (unsigned char*)rx_desc->data;
in->hdr = (unsigned char*)rx_desc->iscsi_header; enum iscsi_opcode opcode = in.hdr[0] & 0x3f;
in->data_pos = iscsi_get_pdu_data_size(&in->hdr[0]); uint32_t itt = scsi_get_uint32(&in.hdr[16]);
in->data = (unsigned char*)rx_desc->data;
enum iscsi_opcode opcode = in->hdr[0] & 0x3f;
uint32_t itt = scsi_get_uint32(&in->hdr[16]);
if (opcode == ISCSI_PDU_NOP_IN && itt == 0xffffffff) if (opcode == ISCSI_PDU_NOP_IN && itt == 0xffffffff)
goto nop_target; goto nop_target;
@@ -1375,34 +1373,26 @@ nop_target:
if (empty >= iser_conn->min_posted_rx) { if (empty >= iser_conn->min_posted_rx) {
err = iser_post_recvm(iser_conn, empty); err = iser_post_recvm(iser_conn, empty);
if (err) { if (err) {
err = -1; return -1;
goto error;
} }
} }
} else if (iscsi->is_loggedin) { } else if (iscsi->is_loggedin) {
if(iser_alloc_rx_descriptors(iser_conn, 255)) { if(iser_alloc_rx_descriptors(iser_conn, 255)) {
iscsi_set_error(iscsi, "iser_alloc_rx_descriptors Failed\n"); iscsi_set_error(iscsi, "iser_alloc_rx_descriptors Failed\n");
err = -1; return -1;
goto error;
} }
err = iser_post_recvm(iser_conn, ISER_MIN_POSTED_RX); err = iser_post_recvm(iser_conn, ISER_MIN_POSTED_RX);
if (err) { if (err) {
err = -1; return -1;
goto error;
} }
} else { } else {
if (iser_post_recvl(iser_conn)) { if (iser_post_recvl(iser_conn)) {
iscsi_set_error(iscsi, "Failed Post Recv login"); iscsi_set_error(iscsi, "Failed Post Recv login");
err = -1; return -1;
goto error;
} }
} }
err = iscsi_process_pdu(iscsi, in); return iscsi_process_pdu(iscsi, &in);
error:
iscsi_free(iscsi, in);
return err;
} }
/** /**
@@ -1749,6 +1739,11 @@ void iscsi_init_iser_transport(struct iscsi_context *iscsi)
/* Update iSCSI params as per iSER transport */ /* Update iSCSI params as per iSER transport */
iscsi->initiator_max_recv_data_segment_length = ISCSI_DEF_MAX_RECV_SEG_LEN; iscsi->initiator_max_recv_data_segment_length = ISCSI_DEF_MAX_RECV_SEG_LEN;
iscsi->target_max_recv_data_segment_length = ISCSI_DEF_MAX_RECV_SEG_LEN; iscsi->target_max_recv_data_segment_length = ISCSI_DEF_MAX_RECV_SEG_LEN;
/* ensure smalloc_size is enough for iser_pdu */
while (iscsi->smalloc_size < sizeof(struct iser_pdu)) {
iscsi->smalloc_size <<= 1;
}
} }
#endif #endif