[SCSI] libfc: update fcp and exch stats
[cascardo/linux.git] / drivers / scsi / libfc / fc_exch.c
index 1d0334f..10a6a2a 100644 (file)
@@ -99,11 +99,6 @@ struct fc_exch_mgr {
        u16             max_xid;
        u16             pool_max_index;
 
-       /*
-        * currently exchange mgr stats are updated but not used.
-        * either stats can be expose via sysfs or remove them
-        * all together if not used XXX
-        */
        struct {
                atomic_t no_free_exch;
                atomic_t no_free_exch_xid;
@@ -2155,6 +2150,31 @@ out:
                fc_exch_release(ep);    /* drop hold from fc_exch_find */
 }
 
+/**
+ * fc_exch_update_stats() - update exches stats to lport
+ * @lport: The local port to update exchange manager stats
+ */
+void fc_exch_update_stats(struct fc_lport *lport)
+{
+       struct fc_host_statistics *st;
+       struct fc_exch_mgr_anchor *ema;
+       struct fc_exch_mgr *mp;
+
+       st = &lport->host_stats;
+
+       list_for_each_entry(ema, &lport->ema_list, ema_list) {
+               mp = ema->mp;
+               st->fc_no_free_exch += atomic_read(&mp->stats.no_free_exch);
+               st->fc_no_free_exch_xid +=
+                               atomic_read(&mp->stats.no_free_exch_xid);
+               st->fc_xid_not_found += atomic_read(&mp->stats.xid_not_found);
+               st->fc_xid_busy += atomic_read(&mp->stats.xid_busy);
+               st->fc_seq_not_found += atomic_read(&mp->stats.seq_not_found);
+               st->fc_non_bls_resp += atomic_read(&mp->stats.non_bls_resp);
+       }
+}
+EXPORT_SYMBOL(fc_exch_update_stats);
+
 /**
  * fc_exch_mgr_add() - Add an exchange manager to a local port's list of EMs
  * @lport: The local port to add the exchange manager to