iscsi: optimization for read process.

This patch aimed at avoid run out of large rbuf for read commands

Change-Id: Ibc42b2216e929f8dfa59cba1b32ae8d52a1a345e
Signed-off-by: Cunyin Chang <cunyin.chang@intel.com>
This commit is contained in:
Cunyin Chang 2016-09-26 13:33:23 +08:00 committed by Jim Harris
parent f07a666646
commit b7a5c653e7
3 changed files with 24 additions and 17 deletions

View File

@ -1100,13 +1100,13 @@ spdk_iscsi_conn_flush_pdus_internal(struct spdk_iscsi_conn *conn)
if (pdu->task->scsi.offset > 0) { if (pdu->task->scsi.offset > 0) {
conn->data_in_cnt--; conn->data_in_cnt--;
if (pdu->bhs.flags & ISCSI_DATAIN_STATUS) { if (pdu->bhs.flags & ISCSI_DATAIN_STATUS) {
/* Free the primary task after the last subtask done */
conn->data_in_cnt--;
spdk_iscsi_task_put(spdk_iscsi_task_get_primary(pdu->task)); spdk_iscsi_task_put(spdk_iscsi_task_get_primary(pdu->task));
} }
spdk_iscsi_conn_handle_queued_tasks(conn);
} }
spdk_iscsi_conn_handle_queued_datain(conn);
} }
spdk_iscsi_task_put(pdu->task); spdk_iscsi_task_put(pdu->task);
} }
spdk_put_pdu(pdu); spdk_put_pdu(pdu);

View File

@ -2838,15 +2838,21 @@ static void spdk_iscsi_queue_mgmt_task(struct spdk_iscsi_conn *conn,
spdk_scsi_dev_queue_mgmt_task(conn->dev, &task->scsi); spdk_scsi_dev_queue_mgmt_task(conn->dev, &task->scsi);
} }
int spdk_iscsi_conn_handle_queued_datain(struct spdk_iscsi_conn *conn) int spdk_iscsi_conn_handle_queued_tasks(struct spdk_iscsi_conn *conn)
{ {
struct spdk_iscsi_task *task; struct spdk_iscsi_task *task;
while (!TAILQ_EMPTY(&conn->queued_datain_tasks) && while (!TAILQ_EMPTY(&conn->queued_datain_tasks) &&
conn->data_in_cnt < MAX_EXTRA_DATAIN_PER_CONNECTION) { conn->data_in_cnt < MAX_LARGE_DATAIN_PER_CONNECTION) {
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_datain_offset <= task->scsi.transfer_len);
if (task->current_datain_offset == 0) {
task->current_datain_offset = task->scsi.length;
conn->data_in_cnt++;
spdk_iscsi_queue_task(conn, task);
continue;
}
if (task->current_datain_offset < task->scsi.transfer_len) { if (task->current_datain_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;
@ -2879,18 +2885,20 @@ static int spdk_iscsi_op_scsi_read(struct spdk_iscsi_conn *conn,
task->scsi.offset = 0; task->scsi.offset = 0;
task->scsi.length = DMIN32(SPDK_BDEV_LARGE_RBUF_MAX_SIZE, task->scsi.transfer_len); task->scsi.length = DMIN32(SPDK_BDEV_LARGE_RBUF_MAX_SIZE, task->scsi.transfer_len);
task->scsi.rbuf = NULL; task->scsi.rbuf = NULL;
spdk_iscsi_queue_task(conn, task);
remaining_size = task->scsi.transfer_len - task->scsi.length; remaining_size = task->scsi.transfer_len - task->scsi.length;
task->current_datain_offset = task->scsi.length; task->current_datain_offset = 0;
if (remaining_size > 0) { if (remaining_size == 0) {
TAILQ_INSERT_TAIL(&conn->queued_datain_tasks, task, link); spdk_iscsi_queue_task(conn, task);
return spdk_iscsi_conn_handle_queued_datain(conn);
}
return 0; return 0;
} }
TAILQ_INSERT_TAIL(&conn->queued_datain_tasks, task, link);
return spdk_iscsi_conn_handle_queued_tasks(conn);
}
static int static int
spdk_iscsi_op_scsi(struct spdk_iscsi_conn *conn, struct spdk_iscsi_pdu *pdu) spdk_iscsi_op_scsi(struct spdk_iscsi_conn *conn, struct spdk_iscsi_pdu *pdu)
{ {

View File

@ -107,13 +107,12 @@
/* /*
* Defines maximum number of data in buffers each connection can have in * Defines maximum number of data in buffers each connection can have in
* use at any given time. An "extra data in buffer" means any buffer after * use at any given time. So this limit does not affect I/O smaller than
* the first for the iSCSI I/O command. So this limit does not affect I/O * SPDK_BDEV_SMALL_RBUF_MAX_SIZE.
* smaller than SPDK_ISCSI_MAX_SEND_DATA_SEGMENT_LENGTH.
*/ */
#define MAX_EXTRA_DATAIN_PER_CONNECTION 64 #define MAX_LARGE_DATAIN_PER_CONNECTION 64
#define NUM_PDU_PER_CONNECTION (2 * (SPDK_ISCSI_MAX_QUEUE_DEPTH + MAX_EXTRA_DATAIN_PER_CONNECTION + 8)) #define NUM_PDU_PER_CONNECTION (2 * (SPDK_ISCSI_MAX_QUEUE_DEPTH + MAX_LARGE_DATAIN_PER_CONNECTION + 8))
#define SPDK_ISCSI_MAX_BURST_LENGTH \ #define SPDK_ISCSI_MAX_BURST_LENGTH \
(SPDK_ISCSI_MAX_RECV_DATA_SEGMENT_LENGTH * MAX_DATA_OUT_PER_CONNECTION) (SPDK_ISCSI_MAX_RECV_DATA_SEGMENT_LENGTH * MAX_DATA_OUT_PER_CONNECTION)
@ -358,7 +357,7 @@ void process_task_mgmt_completion(spdk_event_t event);
/* Memory management */ /* Memory management */
void spdk_put_pdu(struct spdk_iscsi_pdu *pdu); void spdk_put_pdu(struct spdk_iscsi_pdu *pdu);
struct spdk_iscsi_pdu *spdk_get_pdu(void); struct spdk_iscsi_pdu *spdk_get_pdu(void);
int spdk_iscsi_conn_handle_queued_datain(struct spdk_iscsi_conn *conn); int spdk_iscsi_conn_handle_queued_tasks(struct spdk_iscsi_conn *conn);
static inline int static inline int
spdk_get_immediate_data_buffer_size(void) spdk_get_immediate_data_buffer_size(void)