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@xxxxxxxxxxxxxxxxxx> wrote: > 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 > -- 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