lib/iscsi: Rename current_datain_offset of task by current_data_offset

The following patches will aggregate multiple Data-OUT PDUs into a
single write subtask and we will not be able to use reqh->buffer_offset
to track the current offset of large write I/O to submit write subtasks.

On the other hand, each iscsi_task or iscsi_subtask is only read or write

Hence rename current_datain_offset of iscsi_task by current_data_offset
in this patch.

The next patch will use it to track the current offset of large write I/O

Signed-off-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Change-Id: I922582c5b9474a3c512f81d0f0425158a38a9a8d
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/6423
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Community-CI: Mellanox Build Bot
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Changpeng Liu <changpeng.liu@intel.com>
This commit is contained in:
Shuhei Matsumoto 2021-02-16 12:06:20 +09:00 committed by Tomasz Zawadzki
parent 00508c8ef1
commit 6d573781b5
4 changed files with 33 additions and 33 deletions

View File

@ -964,16 +964,16 @@ _iscsi_conn_abort_queued_datain_task(struct spdk_iscsi_conn *conn,
return -1; return -1;
} }
assert(task->current_datain_offset <= task->scsi.transfer_len); assert(task->current_data_offset <= task->scsi.transfer_len);
/* Stop split and abort read I/O for remaining data. */ /* Stop split and abort read I/O for remaining data. */
if (task->current_datain_offset < task->scsi.transfer_len) { if (task->current_data_offset < task->scsi.transfer_len) {
remaining_size = task->scsi.transfer_len - task->current_datain_offset; remaining_size = task->scsi.transfer_len - task->current_data_offset;
subtask = iscsi_task_get(conn, task, iscsi_task_cpl); subtask = iscsi_task_get(conn, task, iscsi_task_cpl);
assert(subtask != NULL); assert(subtask != NULL);
subtask->scsi.offset = task->current_datain_offset; subtask->scsi.offset = task->current_data_offset;
subtask->scsi.length = remaining_size; subtask->scsi.length = remaining_size;
spdk_scsi_task_set_data(&subtask->scsi, NULL, 0); spdk_scsi_task_set_data(&subtask->scsi, NULL, 0);
task->current_datain_offset += subtask->scsi.length; task->current_data_offset += subtask->scsi.length;
subtask->scsi.transfer_len = subtask->scsi.length; subtask->scsi.transfer_len = subtask->scsi.length;
spdk_scsi_task_process_abort(&subtask->scsi); spdk_scsi_task_process_abort(&subtask->scsi);
@ -983,7 +983,7 @@ _iscsi_conn_abort_queued_datain_task(struct spdk_iscsi_conn *conn,
/* Remove the primary task from the list because all subtasks are submitted /* Remove the primary task from the list because all subtasks are submitted
* or aborted. * or aborted.
*/ */
assert(task->current_datain_offset == task->scsi.transfer_len); assert(task->current_data_offset == task->scsi.transfer_len);
TAILQ_REMOVE(&conn->queued_datain_tasks, task, link); TAILQ_REMOVE(&conn->queued_datain_tasks, task, link);
return 0; return 0;
} }
@ -1034,22 +1034,22 @@ iscsi_conn_handle_queued_datain_tasks(struct spdk_iscsi_conn *conn)
while (!TAILQ_EMPTY(&conn->queued_datain_tasks) && while (!TAILQ_EMPTY(&conn->queued_datain_tasks) &&
conn->data_in_cnt < g_iscsi.MaxLargeDataInPerConnection) { conn->data_in_cnt < g_iscsi.MaxLargeDataInPerConnection) {
task = TAILQ_FIRST(&conn->queued_datain_tasks); task = TAILQ_FIRST(&conn->queued_datain_tasks);
assert(task->current_datain_offset <= task->scsi.transfer_len); assert(task->current_data_offset <= task->scsi.transfer_len);
if (task->current_datain_offset < task->scsi.transfer_len) { if (task->current_data_offset < task->scsi.transfer_len) {
struct spdk_iscsi_task *subtask; struct spdk_iscsi_task *subtask;
uint32_t remaining_size = 0; uint32_t remaining_size = 0;
remaining_size = task->scsi.transfer_len - task->current_datain_offset; remaining_size = task->scsi.transfer_len - task->current_data_offset;
subtask = iscsi_task_get(conn, task, iscsi_task_cpl); subtask = iscsi_task_get(conn, task, iscsi_task_cpl);
assert(subtask != NULL); assert(subtask != NULL);
subtask->scsi.offset = task->current_datain_offset; subtask->scsi.offset = task->current_data_offset;
spdk_scsi_task_set_data(&subtask->scsi, NULL, 0); spdk_scsi_task_set_data(&subtask->scsi, NULL, 0);
if (spdk_scsi_dev_get_lun(conn->dev, task->lun_id) == NULL) { if (spdk_scsi_dev_get_lun(conn->dev, task->lun_id) == NULL) {
/* Stop submitting split read I/Os for remaining data. */ /* Stop submitting split read I/Os for remaining data. */
TAILQ_REMOVE(&conn->queued_datain_tasks, task, link); TAILQ_REMOVE(&conn->queued_datain_tasks, task, link);
task->current_datain_offset += remaining_size; task->current_data_offset += remaining_size;
assert(task->current_datain_offset == task->scsi.transfer_len); assert(task->current_data_offset == task->scsi.transfer_len);
subtask->scsi.transfer_len = remaining_size; subtask->scsi.transfer_len = remaining_size;
spdk_scsi_task_process_null_lun(&subtask->scsi); spdk_scsi_task_process_null_lun(&subtask->scsi);
iscsi_task_cpl(&subtask->scsi); iscsi_task_cpl(&subtask->scsi);
@ -1057,10 +1057,10 @@ iscsi_conn_handle_queued_datain_tasks(struct spdk_iscsi_conn *conn)
} }
subtask->scsi.length = spdk_min(SPDK_BDEV_LARGE_BUF_MAX_SIZE, remaining_size); subtask->scsi.length = spdk_min(SPDK_BDEV_LARGE_BUF_MAX_SIZE, remaining_size);
task->current_datain_offset += subtask->scsi.length; task->current_data_offset += subtask->scsi.length;
iscsi_queue_task(conn, subtask); iscsi_queue_task(conn, subtask);
} }
if (task->current_datain_offset == task->scsi.transfer_len) { if (task->current_data_offset == task->scsi.transfer_len) {
TAILQ_REMOVE(&conn->queued_datain_tasks, task, link); TAILQ_REMOVE(&conn->queued_datain_tasks, task, link);
} }
} }

View File

@ -3252,7 +3252,7 @@ iscsi_pdu_payload_op_scsi_read(struct spdk_iscsi_conn *conn, struct spdk_iscsi_t
return 0; return 0;
} else { } else {
TAILQ_INIT(&task->subtask_list); TAILQ_INIT(&task->subtask_list);
task->current_datain_offset = 0; task->current_data_offset = 0;
TAILQ_INSERT_TAIL(&conn->queued_datain_tasks, task, link); TAILQ_INSERT_TAIL(&conn->queued_datain_tasks, task, link);
return iscsi_conn_handle_queued_datain_tasks(conn); return iscsi_conn_handle_queued_datain_tasks(conn);

View File

@ -56,9 +56,9 @@ struct spdk_iscsi_task {
uint32_t data_out_cnt; uint32_t data_out_cnt;
/* /*
* Tracks the current offset of large read io. * Tracks the current offset of large read or write io.
*/ */
uint32_t current_datain_offset; uint32_t current_data_offset;
/* /*
* next_expected_r2t_offset is used when we receive * next_expected_r2t_offset is used when we receive

View File

@ -283,21 +283,21 @@ ut_conn_create_read_tasks(struct spdk_iscsi_task *primary)
uint32_t remaining_size = 0; uint32_t remaining_size = 0;
while (1) { while (1) {
if (primary->current_datain_offset < primary->scsi.transfer_len) { if (primary->current_data_offset < primary->scsi.transfer_len) {
remaining_size = primary->scsi.transfer_len - primary->current_datain_offset; remaining_size = primary->scsi.transfer_len - primary->current_data_offset;
subtask = ut_conn_task_get(primary); subtask = ut_conn_task_get(primary);
subtask->scsi.offset = primary->current_datain_offset; subtask->scsi.offset = primary->current_data_offset;
subtask->scsi.length = spdk_min(SPDK_BDEV_LARGE_BUF_MAX_SIZE, remaining_size); subtask->scsi.length = spdk_min(SPDK_BDEV_LARGE_BUF_MAX_SIZE, remaining_size);
subtask->scsi.status = SPDK_SCSI_STATUS_GOOD; subtask->scsi.status = SPDK_SCSI_STATUS_GOOD;
primary->current_datain_offset += subtask->scsi.length; primary->current_data_offset += subtask->scsi.length;
TAILQ_INSERT_TAIL(&g_ut_read_tasks, subtask, link); TAILQ_INSERT_TAIL(&g_ut_read_tasks, subtask, link);
} }
if (primary->current_datain_offset == primary->scsi.transfer_len) { if (primary->current_data_offset == primary->scsi.transfer_len) {
break; break;
} }
} }
@ -316,7 +316,7 @@ read_task_split_in_order_case(void)
primary.scsi.transfer_len = SPDK_BDEV_LARGE_BUF_MAX_SIZE * 8; primary.scsi.transfer_len = SPDK_BDEV_LARGE_BUF_MAX_SIZE * 8;
TAILQ_INIT(&primary.subtask_list); TAILQ_INIT(&primary.subtask_list);
primary.current_datain_offset = 0; primary.current_data_offset = 0;
primary.bytes_completed = 0; primary.bytes_completed = 0;
primary.scsi.ref = 1; primary.scsi.ref = 1;
@ -352,7 +352,7 @@ read_task_split_reverse_order_case(void)
primary.scsi.transfer_len = SPDK_BDEV_LARGE_BUF_MAX_SIZE * 8; primary.scsi.transfer_len = SPDK_BDEV_LARGE_BUF_MAX_SIZE * 8;
TAILQ_INIT(&primary.subtask_list); TAILQ_INIT(&primary.subtask_list);
primary.current_datain_offset = 0; primary.current_data_offset = 0;
primary.bytes_completed = 0; primary.bytes_completed = 0;
primary.scsi.ref = 1; primary.scsi.ref = 1;
@ -756,7 +756,7 @@ abort_queued_datain_task_test(void)
rc = _iscsi_conn_abort_queued_datain_task(&conn, &task); rc = _iscsi_conn_abort_queued_datain_task(&conn, &task);
CU_ASSERT(rc == 0); CU_ASSERT(rc == 0);
CU_ASSERT(TAILQ_EMPTY(&conn.queued_datain_tasks)); CU_ASSERT(TAILQ_EMPTY(&conn.queued_datain_tasks));
CU_ASSERT(task.current_datain_offset == SPDK_BDEV_LARGE_BUF_MAX_SIZE * 3); CU_ASSERT(task.current_data_offset == SPDK_BDEV_LARGE_BUF_MAX_SIZE * 3);
CU_ASSERT(task.scsi.ref == 0); CU_ASSERT(task.scsi.ref == 0);
CU_ASSERT(subtask.scsi.offset == 0); CU_ASSERT(subtask.scsi.offset == 0);
CU_ASSERT(subtask.scsi.length == SPDK_BDEV_LARGE_BUF_MAX_SIZE * 3); CU_ASSERT(subtask.scsi.length == SPDK_BDEV_LARGE_BUF_MAX_SIZE * 3);
@ -765,7 +765,7 @@ abort_queued_datain_task_test(void)
/* Case2: Queue one task, and this task is partially executed */ /* Case2: Queue one task, and this task is partially executed */
task.scsi.ref = 1; task.scsi.ref = 1;
task.scsi.transfer_len = SPDK_BDEV_LARGE_BUF_MAX_SIZE * 3; task.scsi.transfer_len = SPDK_BDEV_LARGE_BUF_MAX_SIZE * 3;
task.current_datain_offset = SPDK_BDEV_LARGE_BUF_MAX_SIZE; task.current_data_offset = SPDK_BDEV_LARGE_BUF_MAX_SIZE;
TAILQ_INSERT_TAIL(&conn.queued_datain_tasks, &task, link); TAILQ_INSERT_TAIL(&conn.queued_datain_tasks, &task, link);
/* No slots for sub read tasks */ /* No slots for sub read tasks */
@ -778,7 +778,7 @@ abort_queued_datain_task_test(void)
conn.data_in_cnt = 0; conn.data_in_cnt = 0;
rc = _iscsi_conn_abort_queued_datain_task(&conn, &task); rc = _iscsi_conn_abort_queued_datain_task(&conn, &task);
CU_ASSERT(rc == 0); CU_ASSERT(rc == 0);
CU_ASSERT(task.current_datain_offset == SPDK_BDEV_LARGE_BUF_MAX_SIZE * 3); CU_ASSERT(task.current_data_offset == SPDK_BDEV_LARGE_BUF_MAX_SIZE * 3);
CU_ASSERT(task.scsi.ref == 2); CU_ASSERT(task.scsi.ref == 2);
CU_ASSERT(TAILQ_FIRST(&task.subtask_list) == &subtask); CU_ASSERT(TAILQ_FIRST(&task.subtask_list) == &subtask);
CU_ASSERT(subtask.scsi.offset == SPDK_BDEV_LARGE_BUF_MAX_SIZE); CU_ASSERT(subtask.scsi.offset == SPDK_BDEV_LARGE_BUF_MAX_SIZE);
@ -830,7 +830,7 @@ abort_queued_datain_tasks_test(void)
scsi_req = (struct iscsi_bhs_scsi_req *)&pdu1.bhs; scsi_req = (struct iscsi_bhs_scsi_req *)&pdu1.bhs;
scsi_req->read_bit = 1; scsi_req->read_bit = 1;
task1.scsi.ref = 1; task1.scsi.ref = 1;
task1.current_datain_offset = 0; task1.current_data_offset = 0;
task1.scsi.transfer_len = 512; task1.scsi.transfer_len = 512;
task1.scsi.lun = &lun1; task1.scsi.lun = &lun1;
iscsi_task_set_pdu(&task1, &pdu1); iscsi_task_set_pdu(&task1, &pdu1);
@ -841,7 +841,7 @@ abort_queued_datain_tasks_test(void)
scsi_req = (struct iscsi_bhs_scsi_req *)&pdu2.bhs; scsi_req = (struct iscsi_bhs_scsi_req *)&pdu2.bhs;
scsi_req->read_bit = 1; scsi_req->read_bit = 1;
task2.scsi.ref = 1; task2.scsi.ref = 1;
task2.current_datain_offset = 0; task2.current_data_offset = 0;
task2.scsi.transfer_len = 512; task2.scsi.transfer_len = 512;
task2.scsi.lun = &lun2; task2.scsi.lun = &lun2;
iscsi_task_set_pdu(&task2, &pdu2); iscsi_task_set_pdu(&task2, &pdu2);
@ -855,7 +855,7 @@ abort_queued_datain_tasks_test(void)
scsi_req = (struct iscsi_bhs_scsi_req *)&pdu3.bhs; scsi_req = (struct iscsi_bhs_scsi_req *)&pdu3.bhs;
scsi_req->read_bit = 1; scsi_req->read_bit = 1;
task3.scsi.ref = 1; task3.scsi.ref = 1;
task3.current_datain_offset = 0; task3.current_data_offset = 0;
task3.scsi.transfer_len = 512; task3.scsi.transfer_len = 512;
task3.scsi.lun = &lun1; task3.scsi.lun = &lun1;
iscsi_task_set_pdu(&task3, &pdu3); iscsi_task_set_pdu(&task3, &pdu3);
@ -866,7 +866,7 @@ abort_queued_datain_tasks_test(void)
scsi_req = (struct iscsi_bhs_scsi_req *)&pdu4.bhs; scsi_req = (struct iscsi_bhs_scsi_req *)&pdu4.bhs;
scsi_req->read_bit = 1; scsi_req->read_bit = 1;
task4.scsi.ref = 1; task4.scsi.ref = 1;
task4.current_datain_offset = 0; task4.current_data_offset = 0;
task4.scsi.transfer_len = 512; task4.scsi.transfer_len = 512;
task4.scsi.lun = &lun2; task4.scsi.lun = &lun2;
iscsi_task_set_pdu(&task4, &pdu4); iscsi_task_set_pdu(&task4, &pdu4);
@ -877,7 +877,7 @@ abort_queued_datain_tasks_test(void)
scsi_req = (struct iscsi_bhs_scsi_req *)&pdu5.bhs; scsi_req = (struct iscsi_bhs_scsi_req *)&pdu5.bhs;
scsi_req->read_bit = 1; scsi_req->read_bit = 1;
task5.scsi.ref = 1; task5.scsi.ref = 1;
task5.current_datain_offset = 0; task5.current_data_offset = 0;
task5.scsi.transfer_len = 512; task5.scsi.transfer_len = 512;
task5.scsi.lun = &lun1; task5.scsi.lun = &lun1;
iscsi_task_set_pdu(&task5, &pdu5); iscsi_task_set_pdu(&task5, &pdu5);
@ -891,7 +891,7 @@ abort_queued_datain_tasks_test(void)
scsi_req = (struct iscsi_bhs_scsi_req *)&pdu6.bhs; scsi_req = (struct iscsi_bhs_scsi_req *)&pdu6.bhs;
scsi_req->read_bit = 1; scsi_req->read_bit = 1;
task6.scsi.ref = 1; task6.scsi.ref = 1;
task6.current_datain_offset = 0; task6.current_data_offset = 0;
task6.scsi.transfer_len = 512; task6.scsi.transfer_len = 512;
task6.scsi.lun = &lun2; task6.scsi.lun = &lun2;
iscsi_task_set_pdu(&task6, &pdu6); iscsi_task_set_pdu(&task6, &pdu6);