Currently the iSCSI driver only solicits MaxXmitDSL(!) bytes with each R2T, although it could solicit MaxBurstLength bytes. This was introduced with the iSER driver and a RDMA_TRANSFER_SIZE constant to limit the size of RDMA transfers. However, MaxBurstLength can and should be used for that. Signed-off-by: Arne Redlich <arne.redlich@xxxxxxxxxxxxxx> --- Only lightly tested / untested (iSER), so review and test feedback very much appreciated. usr/iscsi/conn.c | 2 -- usr/iscsi/iscsi_rdma.c | 14 ++------------ usr/iscsi/iscsid.c | 27 +++++++++++++-------------- usr/iscsi/iscsid.h | 1 - 4 files changed, 15 insertions(+), 29 deletions(-) diff --git a/usr/iscsi/conn.c b/usr/iscsi/conn.c index 915f76f..56ba2c4 100644 --- a/usr/iscsi/conn.c +++ b/usr/iscsi/conn.c @@ -57,8 +57,6 @@ int conn_init(struct iscsi_connection *conn) conn->refcount = 1; conn->state = STATE_FREE; param_set_defaults(conn->session_param, session_keys); - conn->data_inout_max_length = - conn->session_param[ISCSI_PARAM_MAX_XMIT_DLENGTH].val; INIT_LIST_HEAD(&conn->clist); INIT_LIST_HEAD(&conn->tx_clist); diff --git a/usr/iscsi/iscsi_rdma.c b/usr/iscsi/iscsi_rdma.c index 289b72d..b25abf7 100644 --- a/usr/iscsi/iscsi_rdma.c +++ b/usr/iscsi/iscsi_rdma.c @@ -241,7 +241,7 @@ static int waiting_rdma_slot; * per connection, but many tasks might be in progress on the connection. * Internal flow control stops tasks when there are no slots. * - * RDMA size tradeoffs: + * RDMA size tradeoffs (MaxBurstLength): * big RDMA operations are more efficient * small RDMA operations better for fairness with many clients * small RDMA operations allow better pipelining @@ -249,8 +249,6 @@ static int waiting_rdma_slot; * entire buffer to transport in one go */ #define RDMA_PER_CONN 20 -#define RDMA_TRANSFER_SIZE (512 * 1024) - #define MAX_POLL_WC 8 @@ -1244,17 +1242,9 @@ static int iscsi_rdma_login_complete(struct iscsi_connection *conn) ci->rsize = hdrsz + trdsl; ci->max_outst_pdu = outst_pdu; ret = iser_init_comm(ci); - if (ret) { + if (ret) eprintf("iser_init_comm failed\n"); - goto out; - } - /* - * How much data to grab in an RDMA operation, read or write. - */ - conn->data_inout_max_length = RDMA_TRANSFER_SIZE; - -out: return ret; } diff --git a/usr/iscsi/iscsid.c b/usr/iscsi/iscsid.c index 8e9876a..df7ce1f 100644 --- a/usr/iscsi/iscsid.c +++ b/usr/iscsi/iscsid.c @@ -528,13 +528,6 @@ static void login_finish(struct iscsi_connection *conn) switch (conn->session_type) { case SESSION_NORMAL: /* - * update based on negotiations (but ep_login_complete - * could override) - */ - conn->data_inout_max_length = - conn->session_param[ISCSI_PARAM_MAX_XMIT_DLENGTH].val; - - /* * Allocate transport resources for this connection. */ ret = conn->tp->ep_login_complete(conn); @@ -977,7 +970,7 @@ static int iscsi_data_rsp_build(struct iscsi_task *task) { struct iscsi_connection *conn = task->conn; struct iscsi_data_rsp *rsp = (struct iscsi_data_rsp *) &conn->rsp.bhs; - int datalen; + int datalen, maxdatalen; int result = scsi_get_result(&task->scmd); memset(rsp, 0, sizeof(*rsp)); @@ -991,10 +984,15 @@ static int iscsi_data_rsp_build(struct iscsi_task *task) datalen = min_t(uint32_t, scsi_get_in_length(&task->scmd), task->len); datalen -= task->offset; - dprintf("%d %d %d %d %x\n", datalen, scsi_get_in_length(&task->scmd), - task->len, conn->data_inout_max_length, rsp->itt); + maxdatalen = conn->tp->rdma ? + conn->session_param[ISCSI_PARAM_MAX_BURST].val : + conn->session_param[ISCSI_PARAM_MAX_XMIT_DLENGTH].val; + + dprintf("%d %d %d %" PRIu32 "%x\n", datalen, + scsi_get_in_length(&task->scmd), task->len, maxdatalen, + rsp->itt); - if (datalen <= conn->data_inout_max_length) { + if (datalen <= maxdatalen) { rsp->flags = ISCSI_FLAG_CMD_FINAL; /* collapse status into final packet if successful */ @@ -1007,7 +1005,7 @@ static int iscsi_data_rsp_build(struct iscsi_task *task) calc_residual((struct iscsi_cmd_rsp *) rsp, task); } } else - datalen = conn->data_inout_max_length; + datalen = maxdatalen; rsp->exp_cmdsn = cpu_to_be32(conn->session->exp_cmd_sn); rsp->max_cmdsn = cpu_to_be32(conn->session->exp_cmd_sn + MAX_QUEUE_CMD); @@ -1026,7 +1024,7 @@ static int iscsi_r2t_build(struct iscsi_task *task) { struct iscsi_connection *conn = task->conn; struct iscsi_r2t_rsp *rsp = (struct iscsi_r2t_rsp *) &conn->rsp.bhs; - int length; + uint32_t length; memset(rsp, 0, sizeof(*rsp)); @@ -1040,7 +1038,8 @@ static int iscsi_r2t_build(struct iscsi_task *task) /* return next statsn for this conn w/o advancing it */ rsp->statsn = cpu_to_be32(conn->stat_sn); rsp->ttt = (unsigned long) task; - length = min(task->r2t_count, conn->data_inout_max_length); + length = min_t(uint32_t, task->r2t_count, + conn->session_param[ISCSI_PARAM_MAX_BURST].val); rsp->data_length = cpu_to_be32(length); return 0; diff --git a/usr/iscsi/iscsid.h b/usr/iscsi/iscsid.h index 7897c41..b301c78 100644 --- a/usr/iscsi/iscsid.h +++ b/usr/iscsi/iscsid.h @@ -146,7 +146,6 @@ struct iscsi_connection { int tid; struct param session_param[ISCSI_PARAM_MAX]; - int data_inout_max_length; char *initiator; uint8_t isid[6]; -- 1.6.0.4 -- To unsubscribe from this list: send the line "unsubscribe stgt" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html