[stgt] [PATCH 1/1] iscsi: Initial iscsi statistics for stgt.

Daniel Henrique Debonzi debonzi at linux.vnet.ibm.com
Fri Oct 8 16:40:37 CEST 2010


From: Daniel Henrique Debonzi <debonzi at linux.vnet.ibm.com>

This patch implements some statistics information for the iscsi.

Signed-off-by: Daniel Henrique Debonzi <debonzi at linux.vnet.ibm.com>
---
 usr/iscsi/iscsid.c |   27 ++++++++++++++++++
 usr/iscsi/iscsid.h |    2 +
 usr/iscsi/target.c |   79 +++++++++++++++++++++++++++++++++++++++++++--------
 usr/tgtadm.c       |    2 +
 usr/tgtadm.h       |    1 +
 5 files changed, 98 insertions(+), 13 deletions(-)

diff --git a/usr/iscsi/iscsid.c b/usr/iscsi/iscsid.c
index 5b13d90..3a79d93 100644
--- a/usr/iscsi/iscsid.c
+++ b/usr/iscsi/iscsid.c
@@ -1917,8 +1917,21 @@ 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++;
+		}
+	}
+
+
 	if (!conn->rx_size)
 		conn->rx_iostate = next_state;
 
@@ -1930,6 +1943,7 @@ void iscsi_rx_handler(struct iscsi_connection *conn)
 	int ret = 0, hdigest, ddigest;
 	uint32_t crc;
 
+
 	if (conn->state == STATE_SCSI) {
 		struct param *p = conn->session_param;
 		hdigest = p[ISCSI_PARAM_HDRDGST_EN].val & DIGEST_CRC32C;
@@ -2085,8 +2099,21 @@ 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;
+		}
+	}
+
 	if (conn->tx_size)
 		goto again;
 	conn->tx_iostate = next_state;
diff --git a/usr/iscsi/iscsid.h b/usr/iscsi/iscsid.h
index 469a9d2..2a7a3f8 100644
--- a/usr/iscsi/iscsid.h
+++ b/usr/iscsi/iscsid.h
@@ -197,6 +197,8 @@ struct iscsi_connection {
 	} auth;
 
 	struct iscsi_transport *tp;
+
+	struct iscsi_stats stats;
 };
 
 #define STATE_FREE		0
diff --git a/usr/iscsi/target.c b/usr/iscsi/target.c
index b097a58..f4842c9 100644
--- a/usr/iscsi/target.c
+++ b/usr/iscsi/target.c
@@ -532,29 +532,78 @@ static int show_iscsi_param(char *buf, struct param *param, int rest)
 	return total;
 }
 
-static int iscsi_target_show_session(struct iscsi_target* target, uint64_t sid,
-				     char *buf, int rest)
+#define __buffer_check(buf, total, len, rest)	\
+({						\
+	buf += len;				\
+	total += len;				\
+	rest -= len;				\
+	if (!rest)				\
+		return total;			\
+})
+
+static struct iscsi_session *iscsi_target_find_session(
+	struct iscsi_target *target,
+	uint64_t sid)
 {
-	int len = 0, total = 0;
 	struct iscsi_session *session;
 
 	list_for_each_entry(session, &target->sessions_list, slist) {
 		if (session->tsih == sid)
-			len = show_iscsi_param(buf, session->session_param, rest);
-			buffer_check(buf, total, len, rest);
+			return session;
+	}
+
+	return NULL;
+
+}
+
+static int iscsi_target_show_session(struct iscsi_target *target, uint64_t sid,
+				     char *buf, int rest)
+{
+	int len = 0, total = 0;
+	struct iscsi_session *session;
+
+	session = iscsi_target_find_session(target, sid);
+
+	if (session) {
+		len = show_iscsi_param(buf, session->session_param, rest);
+		__buffer_check(buf, total, len, rest);
+
 	}
 
 	return total;
 }
 
-#define __buffer_check(buf, total, len, rest)	\
-({						\
-	buf += len;				\
-	total += len;				\
-	rest -= len;				\
-	if (!rest)				\
-		return total;			\
-})
+static int iscsi_target_show_stats(struct iscsi_target *target, uint64_t sid,
+				   char *buf, int rest)
+{
+	int len = 0, total = 0;
+	struct iscsi_session *session;
+	struct iscsi_connection *conn;
+
+	session = iscsi_target_find_session(target, sid);
+
+	if (session) {
+		list_for_each_entry(conn, &session->conn_list, clist) {
+			len = snprintf(buf, rest,
+				       "rxdata_octets: %" PRIu64 "\n"
+				       "txdata_octets: %" PRIu64 "\n"
+				       "dataout_pdus:  %d\n"
+				       "datain_pdus:   %d\n"
+				       "scsicmd_pdus:  %d\n"
+				       "scsirsp_pdus:  %d\n",
+				       conn->stats.rxdata_octets,
+				       conn->stats.txdata_octets,
+				       conn->stats.dataout_pdus,
+				       conn->stats.datain_pdus,
+				       conn->stats.scsicmd_pdus,
+				       conn->stats.scsirsp_pdus);
+			__buffer_check(buf, total, len, rest);
+		}
+	}
+
+	return total;
+
+}
 
 static int show_redirect_info(struct iscsi_target* target, char *buf, int rest)
 {
@@ -605,6 +654,10 @@ int iscsi_target_show(int mode, int tid, uint64_t sid, uint32_t cid, uint64_t lu
 		len = iscsi_target_show_session(target, sid, buf, rest);
 		total += len;
 		break;
+	case MODE_STATS:
+		len = iscsi_target_show_stats(target, sid, buf, rest);
+		total += len;
+		break;
 	default:
 		break;
 	}
diff --git a/usr/tgtadm.c b/usr/tgtadm.c
index c2ed6b4..149767e 100644
--- a/usr/tgtadm.c
+++ b/usr/tgtadm.c
@@ -372,6 +372,8 @@ static int str_to_mode(char *str)
 		return MODE_CONNECTION;
 	else if (!strcmp("account", str))
 		return MODE_ACCOUNT;
+	else if (!strcmp("stats", str))
+		return MODE_STATS;
 	else {
 		eprintf("unknown mode: %s\n", str);
 		exit(1);
diff --git a/usr/tgtadm.h b/usr/tgtadm.h
index 8e04a3c..53a9608 100644
--- a/usr/tgtadm.h
+++ b/usr/tgtadm.h
@@ -25,6 +25,7 @@ enum tgtadm_mode {
 	MODE_SESSION,
 	MODE_CONNECTION,
 	MODE_ACCOUNT,
+	MODE_STATS,
 };
 
 enum tgtadm_account_dir {
-- 
1.6.3.3

--
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