[SCSI] libfc: update fcp and exch stats
authorVasu Dev <vasu.dev@intel.com>
Fri, 25 May 2012 17:26:54 +0000 (10:26 -0700)
committerJames Bottomley <JBottomley@Parallels.com>
Fri, 20 Jul 2012 07:31:48 +0000 (08:31 +0100)
Updates newly added stats from fc_get_host_stats,
added new function fc_exch_update_stats to
update exches related stats from fc_exch.c
by going thru internal ema_list elements.

Signed-off-by: Vasu Dev <vasu.dev@intel.com>
Acked-by : Robert Love <robert.w.love@intel.com>
Tested-by: Ross Brattain <ross.b.brattain@intel.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
drivers/scsi/libfc/fc_exch.c
drivers/scsi/libfc/fc_lport.c
include/scsi/libfc.h

index 1d0334f83f78c674b68a6904120ad2ab9c7a0b04..10a6a2a7bfc51f64acf5484935d2db183408c32e 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
index 3e8c48dfa42f811d089d67faa5a1ae20e4942606..ca278d4b0f66854ebbb24c6e79e48e235afa892c 100644 (file)
@@ -329,6 +329,9 @@ struct fc_host_statistics *fc_get_host_stats(struct Scsi_Host *shost)
                fc_stats->fcp_control_requests += stats->ControlRequests;
                fcp_in_bytes += stats->InputBytes;
                fcp_out_bytes += stats->OutputBytes;
+               fc_stats->fcp_packet_alloc_failures += stats->FcpPktAllocFails;
+               fc_stats->fcp_packet_aborts += stats->FcpPktAborts;
+               fc_stats->fcp_frame_alloc_failures += stats->FcpFrameAllocFails;
                fc_stats->link_failure_count += stats->LinkFailureCount;
        }
        fc_stats->fcp_input_megabytes = div_u64(fcp_in_bytes, 1000000);
@@ -339,6 +342,10 @@ struct fc_host_statistics *fc_get_host_stats(struct Scsi_Host *shost)
        fc_stats->loss_of_signal_count = -1;
        fc_stats->prim_seq_protocol_err_count = -1;
        fc_stats->dumped_frames = -1;
+
+       /* update exches stats */
+       fc_exch_update_stats(lport);
+
        return fc_stats;
 }
 EXPORT_SYMBOL(fc_get_host_stats);
index f257a74e6de4b2fa909f66740b03b0702bd2f2d5..399162b50a8d3479e68183f63f8e227f8db5f6c5 100644 (file)
@@ -1121,6 +1121,7 @@ void fc_fill_hdr(struct fc_frame *, const struct fc_frame *,
  * EXCHANGE MANAGER LAYER
  *****************************/
 int fc_exch_init(struct fc_lport *);
+void fc_exch_update_stats(struct fc_lport *lport);
 struct fc_exch_mgr_anchor *fc_exch_mgr_add(struct fc_lport *,
                                           struct fc_exch_mgr *,
                                           bool (*match)(struct fc_frame *));