lib/iscsi: Add data_len to mobj and use mobj to create write subtask
The following patches will aggregate multiple Data-OUT PDUs into a single SCSI write up to 64KB. Any variable to accumulate data length is necessary. Hence add data_len to mobj and accumulate read data length into mobj->data_len, and then refer mobj instead of pdu->data and pdu->data_segment_len to submit write subtask. Signed-off-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com> Change-Id: I6354534769e67c0fd995bbc3c2b4a80d21a23915 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/6422 Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Community-CI: Mellanox Build Bot Reviewed-by: Changpeng Liu <changpeng.liu@intel.com> Reviewed-by: Ziye Yang <ziye.yang@intel.com> Reviewed-by: Jim Harris <james.r.harris@intel.com>
This commit is contained in:
parent
7a783b5b38
commit
00508c8ef1
@ -4273,6 +4273,7 @@ iscsi_pdu_payload_op_data(struct spdk_iscsi_conn *conn, struct spdk_iscsi_pdu *p
|
|||||||
{
|
{
|
||||||
struct spdk_iscsi_task *task, *subtask;
|
struct spdk_iscsi_task *task, *subtask;
|
||||||
struct iscsi_bhs_data_out *reqh;
|
struct iscsi_bhs_data_out *reqh;
|
||||||
|
struct spdk_mobj *mobj;
|
||||||
uint32_t transfer_tag;
|
uint32_t transfer_tag;
|
||||||
uint32_t buffer_offset;
|
uint32_t buffer_offset;
|
||||||
|
|
||||||
@ -4292,19 +4293,22 @@ iscsi_pdu_payload_op_data(struct spdk_iscsi_conn *conn, struct spdk_iscsi_pdu *p
|
|||||||
return iscsi_reject(conn, pdu, ISCSI_REASON_PROTOCOL_ERROR);
|
return iscsi_reject(conn, pdu, ISCSI_REASON_PROTOCOL_ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mobj = pdu->mobj;
|
||||||
|
assert(mobj != NULL);
|
||||||
|
|
||||||
subtask = iscsi_task_get(conn, task, iscsi_task_cpl);
|
subtask = iscsi_task_get(conn, task, iscsi_task_cpl);
|
||||||
if (subtask == NULL) {
|
if (subtask == NULL) {
|
||||||
SPDK_ERRLOG("Unable to acquire subtask\n");
|
SPDK_ERRLOG("Unable to acquire subtask\n");
|
||||||
return SPDK_ISCSI_CONNECTION_FATAL;
|
return SPDK_ISCSI_CONNECTION_FATAL;
|
||||||
}
|
}
|
||||||
subtask->scsi.offset = buffer_offset;
|
subtask->scsi.offset = buffer_offset;
|
||||||
subtask->scsi.length = pdu->data_segment_len;
|
subtask->scsi.length = mobj->data_len;
|
||||||
iscsi_task_associate_pdu(subtask, pdu);
|
iscsi_task_associate_pdu(subtask, pdu);
|
||||||
|
|
||||||
if (spdk_likely(!pdu->dif_insert_or_strip)) {
|
if (spdk_likely(!pdu->dif_insert_or_strip)) {
|
||||||
spdk_scsi_task_set_data(&subtask->scsi, pdu->data, pdu->data_segment_len);
|
spdk_scsi_task_set_data(&subtask->scsi, mobj->buf, mobj->data_len);
|
||||||
} else {
|
} else {
|
||||||
spdk_scsi_task_set_data(&subtask->scsi, pdu->data, pdu->data_buf_len);
|
spdk_scsi_task_set_data(&subtask->scsi, mobj->buf, pdu->data_buf_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
iscsi_queue_task(conn, subtask);
|
iscsi_queue_task(conn, subtask);
|
||||||
@ -4592,6 +4596,7 @@ iscsi_pdu_payload_read(struct spdk_iscsi_conn *conn, struct spdk_iscsi_pdu *pdu)
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pdu->mobj->data_len += rc;
|
||||||
pdu->data_valid_bytes += rc;
|
pdu->data_valid_bytes += rc;
|
||||||
if (pdu->data_valid_bytes < data_len) {
|
if (pdu->data_valid_bytes < data_len) {
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -147,6 +147,7 @@
|
|||||||
struct spdk_mobj {
|
struct spdk_mobj {
|
||||||
struct spdk_mempool *mp;
|
struct spdk_mempool *mp;
|
||||||
void *buf;
|
void *buf;
|
||||||
|
uint32_t data_len;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -465,6 +466,7 @@ iscsi_datapool_put(struct spdk_mobj *mobj)
|
|||||||
{
|
{
|
||||||
assert(mobj != NULL);
|
assert(mobj != NULL);
|
||||||
|
|
||||||
|
mobj->data_len = 0;
|
||||||
spdk_mempool_put(mobj->mp, (void *)mobj);
|
spdk_mempool_put(mobj->mp, (void *)mobj);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user