[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