[stgt] [PATCH 3/3] collect isci conn stats for iser connections

nezhinsky at gmail.com nezhinsky at gmail.com
Wed Jul 18 00:31:09 CEST 2012


From: Alexander Nezhinsky <alexandern at mellanox.com>

implement iscsi stats update functions iscsi_update_conn_stats_{rx|tx}
common for iscsi and iser. In iser treat rdma-read as data-out pdu, and
rdma-write as data-out pdu for stat collection purposes.

Signed-off-by: Alexander Nezhinsky <alexandern at mellanox.com>
---
 usr/iscsi/conn.c   |   26 ++++++++++++++++++++++++++
 usr/iscsi/iscsid.c |   32 ++++++++------------------------
 usr/iscsi/iscsid.h |    2 ++
 usr/iscsi/iser.c   |   15 +++++++++++----
 4 files changed, 47 insertions(+), 28 deletions(-)

diff --git a/usr/iscsi/conn.c b/usr/iscsi/conn.c
index 6111566..17aa3e3 100644
--- a/usr/iscsi/conn.c
+++ b/usr/iscsi/conn.c
@@ -244,3 +244,29 @@ tgtadm_err conn_close_admin(uint32_t tid, uint64_t sid, uint32_t cid)
 
 	return sess_found ? TGTADM_NO_CONNECTION : TGTADM_NO_SESSION;
 }
+
+void iscsi_update_conn_stats_rx(struct iscsi_connection *conn, int size, int opcode)
+{
+	conn->stats.rxdata_octets += (uint64_t)size;
+
+	if (unlikely(opcode < 0))
+		return;
+
+	if (opcode == ISCSI_OP_SCSI_CMD)
+		conn->stats.scsicmd_pdus++;
+	else if (opcode == ISCSI_OP_SCSI_DATA_OUT)
+		conn->stats.dataout_pdus++;
+}
+
+void iscsi_update_conn_stats_tx(struct iscsi_connection *conn, int size, int opcode)
+{
+	conn->stats.txdata_octets += (uint64_t)size;
+
+	if (unlikely(opcode < 0))
+		return;
+
+	if (opcode == ISCSI_OP_SCSI_DATA_IN)
+		conn->stats.datain_pdus++;
+	else if (opcode == ISCSI_OP_SCSI_CMD_RSP)
+		conn->stats.scsirsp_pdus++;
+}
diff --git a/usr/iscsi/iscsid.c b/usr/iscsi/iscsid.c
index 4545018..96abbfc 100644
--- a/usr/iscsi/iscsid.c
+++ b/usr/iscsi/iscsid.c
@@ -1942,7 +1942,7 @@ nodata:
 
 static int do_recv(struct iscsi_connection *conn, int next_state)
 {
-	int ret;
+	int ret, opcode;
 
 	ret = conn->tp->ep_read(conn, conn->rx_buffer, conn->rx_size);
 	if (!ret) {
@@ -1955,20 +1955,12 @@ static int do_recv(struct iscsi_connection *conn, int next_state)
 			return -EIO;
 	}
 
-	conn->stats.rxdata_octets += ret;
 	conn->rx_size -= ret;
 	conn->rx_buffer += ret;
 
-	if (conn->rx_iostate == IOSTATE_RX_BHS) {
-		switch (conn->req.bhs.opcode & ISCSI_OPCODE_MASK) {
-		case ISCSI_OP_SCSI_CMD:
-			conn->stats.scsicmd_pdus++;
-			break;
-		case ISCSI_OP_SCSI_DATA_OUT:
-			conn->stats.dataout_pdus++;
-		}
-	}
-
+	opcode = (conn->rx_iostate == IOSTATE_RX_BHS) ?
+		(conn->req.bhs.opcode & ISCSI_OPCODE_MASK) : -1;
+	iscsi_update_conn_stats_rx(conn, ret, opcode);
 
 	if (!conn->rx_size)
 		conn->rx_iostate = next_state;
@@ -2140,7 +2132,7 @@ again:
 
 static int do_send(struct iscsi_connection *conn, int next_state)
 {
-	int ret;
+	int ret, opcode;
 again:
 	ret = conn->tp->ep_write_begin(conn, conn->tx_buffer, conn->tx_size);
 	if (ret < 0) {
@@ -2152,20 +2144,12 @@ again:
 		return -EIO;
 	}
 
-	conn->stats.txdata_octets += ret;
 	conn->tx_size -= ret;
 	conn->tx_buffer += ret;
 
-	if (conn->tx_iostate == IOSTATE_TX_BHS) {
-		switch (conn->rsp.bhs.opcode) {
-		case ISCSI_OP_SCSI_DATA_IN:
-			conn->stats.datain_pdus++;
-			break;
-		case ISCSI_OP_SCSI_CMD_RSP:
-			conn->stats.scsirsp_pdus++;
-			break;
-		}
-	}
+	opcode = (conn->tx_iostate == IOSTATE_TX_BHS) ?
+			(conn->req.bhs.opcode & ISCSI_OPCODE_MASK) : -1;
+	iscsi_update_conn_stats_tx(conn, ret, opcode);
 
 	if (conn->tx_size)
 		goto again;
diff --git a/usr/iscsi/iscsid.h b/usr/iscsi/iscsid.h
index f274857..444661b 100644
--- a/usr/iscsi/iscsid.h
+++ b/usr/iscsi/iscsid.h
@@ -317,6 +317,8 @@ extern int iscsi_transportid(int tid, uint64_t itn_id, char *buf, int size);
 extern int iscsi_add_portal(char *addr, int port, int tpgt);
 extern int iscsi_delete_portal(char *addr, int port);
 extern int iscsi_param_parse_portals(char *p, int do_add, int do_delete);
+extern void iscsi_update_conn_stats_rx(struct iscsi_connection *conn, int size, int opcode);
+extern void iscsi_update_conn_stats_tx(struct iscsi_connection *conn, int size, int opcode);
 
 /* iscsid.c iscsi_task */
 extern void iscsi_free_task(struct iscsi_task *task);
diff --git a/usr/iscsi/iser.c b/usr/iscsi/iser.c
index f864ff9..557bb85 100644
--- a/usr/iscsi/iser.c
+++ b/usr/iscsi/iser.c
@@ -2406,7 +2406,6 @@ static int iser_scsi_cmd_rx(struct iser_task *task)
 			task->unsol_remains = 0;
 			task->rdma_rd_sz = 0;
 			task->rdma_rd_remains = 0;
-
 		} else {
 			scsi_set_data_dir(&task->scmd, DATA_NONE);
 			task->out_len = 0;
@@ -2717,6 +2716,8 @@ static int iser_parse_req_headers(struct iser_task *task)
 	struct iser_conn *conn = task->conn;
 	struct iser_hdr *iser_hdr = task->pdu.iser_hdr;
 	struct iscsi_hdr *iscsi_hdr = task->pdu.bhs;
+	unsigned pdu_dlength = ntoh24(iscsi_hdr->dlength);
+	unsigned pdu_len = pdu_dlength + sizeof(struct iscsi_hdr);
 	int err = -1;
 
 	switch (iser_hdr->flags & 0xF0) {
@@ -2754,12 +2755,14 @@ static int iser_parse_req_headers(struct iser_task *task)
 
 	task->pdu.ahssize = iscsi_hdr->hlength * 4;
 	task->pdu.membuf.addr += task->pdu.ahssize;
-	task->pdu.membuf.size = ntoh24(iscsi_hdr->dlength);
+	pdu_len += task->pdu.ahssize;
+	task->pdu.membuf.size = pdu_dlength;
 	task->pdu.membuf.rdma = 0;
 
 	task->tag = iscsi_hdr->itt;
 	task->cmd_sn = be32_to_cpu(iscsi_hdr->statsn);
 	conn->h.exp_stat_sn = be32_to_cpu(iscsi_hdr->exp_statsn);
+	iscsi_update_conn_stats_rx(&conn->h, pdu_len, task->opcode);
 
 	return err;
 }
@@ -2884,9 +2887,11 @@ static void iser_tx_complete_handler(struct iser_work_req *txd)
 {
 	struct iser_task *task = txd->task;
 	struct iser_conn *conn = task->conn;
+	int opcode = task->pdu.bhs->opcode & ISCSI_OPCODE_MASK;
 
-	dprintf("conn:%p task:%p tag:0x%04"PRIx64 "\n",
-		&conn->h, task, task->tag);
+	iscsi_update_conn_stats_tx(&conn->h, txd->sge.length, opcode);
+	dprintf("conn:%p task:%p tag:0x%04"PRIx64 " opcode:0x%x\n",
+		&conn->h, task, task->tag, opcode);
 	iser_conn_put(conn);
 
 	list_del(&task->tx_list); /* remove from conn->sent_list */
@@ -2909,6 +2914,7 @@ static void iser_rdma_wr_complete_handler(struct iser_work_req *rdmad)
 	struct iser_task *task = rdmad->task;
 	struct iser_conn *conn = task->conn;
 
+	iscsi_update_conn_stats_tx(&conn->h, rdmad->sge.length, ISCSI_OP_SCSI_DATA_IN);
 	dprintf("conn:%p task:%p tag:0x%04"PRIx64 "\n",
 		&conn->h, task, task->tag);
 	iser_conn_put(conn);
@@ -2922,6 +2928,7 @@ static void iser_rdma_rd_complete_handler(struct iser_work_req *rdmad)
 	struct iser_task *task = rdmad->task;
 	struct iser_conn *conn = task->conn;
 
+	iscsi_update_conn_stats_rx(&conn->h, rdmad->sge.length, ISCSI_OP_SCSI_DATA_OUT);
 	task->rdma_rd_remains -= rdmad->sge.length;
 	dprintf("conn:%p task:%p tag:0x%04"PRIx64 ", rems rdma:%d unsol:%d\n",
 		&conn->h, task, task->tag, task->rdma_rd_remains,
-- 
1.7.9.5

--
To unsubscribe from this list: send the line "unsubscribe stgt" in
the body of a message to majordomo at vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html



More information about the stgt mailing list