From: Daniel Henrique Debonzi <debonzi@xxxxxxxxxxxxxxxxxx> This patch implements some statistics information for the iscsi. Signed-off-by: Daniel Henrique Debonzi <debonzi@xxxxxxxxxxxxxxxxxx> --- 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@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html