From acdeb53f4b52756ace9fb550269c921c436c4ead Mon Sep 17 00:00:00 2001 From: Shuhei Matsumoto Date: Mon, 15 Feb 2021 06:39:06 +0900 Subject: [PATCH] lib/iscsi: Increase buffer size to 64KB at most when more Data-OUT PDUs follow The following patches will want to aggregate multiple Data-OUT PDUs into the same data buffer, but it will be 64KB at most. Signed-off-by: Shuhei Matsumoto Change-Id: I72eabbeae0b027c2fbff2a5837d180b06b0a1b49 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/6418 Tested-by: SPDK CI Jenkins Community-CI: Mellanox Build Bot Reviewed-by: Changpeng Liu Reviewed-by: Ziye Yang Reviewed-by: Jim Harris --- lib/iscsi/iscsi.c | 14 ++++++++++++-- test/unit/lib/iscsi/iscsi.c/iscsi_ut.c | 1 + 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/lib/iscsi/iscsi.c b/lib/iscsi/iscsi.c index 1c7d3e7be..4e309a3cd 100644 --- a/lib/iscsi/iscsi.c +++ b/lib/iscsi/iscsi.c @@ -4247,6 +4247,15 @@ iscsi_pdu_hdr_op_data(struct spdk_iscsi_conn *conn, struct spdk_iscsi_pdu *pdu) pdu->dif_insert_or_strip = true; } + if (!F_bit && !pdu->dif_insert_or_strip) { + /* More Data-OUT PDUs will follow in this sequence. Increase the buffer size + * up to SPDK_ISCSI_MAX_RECV_DATA_SEGMENT_LENGTH to merge them into a single + * subtask. + */ + pdu->data_buf_len = spdk_min(task->desired_data_transfer_length, + SPDK_ISCSI_MAX_RECV_DATA_SEGMENT_LENGTH); + } + return 0; } @@ -4545,10 +4554,10 @@ iscsi_pdu_payload_read(struct spdk_iscsi_conn *conn, struct spdk_iscsi_pdu *pdu) data_len = pdu->data_segment_len; if (pdu->data == NULL) { - if (data_len <= iscsi_get_max_immediate_data_size()) { + if (pdu->data_buf_len <= iscsi_get_max_immediate_data_size()) { pool = g_iscsi.pdu_immediate_data_pool; pdu->data_buf_len = SPDK_BDEV_BUF_SIZE_WITH_MD(iscsi_get_max_immediate_data_size()); - } else if (data_len <= SPDK_ISCSI_MAX_RECV_DATA_SEGMENT_LENGTH) { + } else if (pdu->data_buf_len <= SPDK_ISCSI_MAX_RECV_DATA_SEGMENT_LENGTH) { pool = g_iscsi.pdu_data_out_pool; pdu->data_buf_len = SPDK_BDEV_BUF_SIZE_WITH_MD(SPDK_ISCSI_MAX_RECV_DATA_SEGMENT_LENGTH); } else { @@ -4663,6 +4672,7 @@ iscsi_read_pdu(struct spdk_iscsi_conn *conn) } pdu->data_segment_len = ISCSI_ALIGN(DGET24(pdu->bhs.data_segment_len)); + pdu->data_buf_len = pdu->data_segment_len; /* AHS */ ahs_len = pdu->bhs.total_ahs_len * 4; diff --git a/test/unit/lib/iscsi/iscsi.c/iscsi_ut.c b/test/unit/lib/iscsi/iscsi.c/iscsi_ut.c index 59b9d3c75..61288b7be 100644 --- a/test/unit/lib/iscsi/iscsi.c/iscsi_ut.c +++ b/test/unit/lib/iscsi/iscsi.c/iscsi_ut.c @@ -1967,6 +1967,7 @@ pdu_hdr_op_data_test(void) rc = iscsi_pdu_hdr_op_data(&conn, &pdu); CU_ASSERT(rc == 0); CU_ASSERT(!pdu.is_rejected); + CU_ASSERT(pdu.data_buf_len == SPDK_ISCSI_MAX_RECV_DATA_SEGMENT_LENGTH); pdu.task = NULL; /* Case 11 - SCSI Data-Out PDU is correct and processed. Its F bit is 1 and hence