[stgt] [PATCH 1/1] iscsi: Initial iscsi statistics for stgt.
ronnie sahlberg
ronniesahlberg at gmail.com
Sun Oct 10 08:16:53 CEST 2010
Hi Daniel,
Very nice!
Can you add something to the manpage for this too?
regards
ronnie sahlberg
On Sat, Oct 9, 2010 at 1:40 AM, Daniel Henrique Debonzi
<debonzi at linux.vnet.ibm.com> wrote:
> 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
>
--
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