[SCSI] libfc: fix statistics for FCP input/output megabytes
authorJoe Eykholt <jeykholt@cisco.com>
Wed, 1 Dec 2010 00:20:18 +0000 (16:20 -0800)
committerJames Bottomley <James.Bottomley@suse.de>
Tue, 21 Dec 2010 18:24:34 +0000 (12:24 -0600)
The statistics for InputMegabytes and OutputMegabytes are
misnamed.  They're accumulating bytes, not megabytes.

The statistic returned via /sys must be in megabytes, however,
which is what the HBA-API wants.  The FCP code needs to accumulate
it in bytes and then divide by 1,000,000 (not 2^20) before it
presented via sysfs.

This affects fcoe.ko only, not fnic.  The fnic driver
correctly by accumulating bytes and then converts to megabytes.

I checked that libhbalinux is using the /sys file directly without
conversion.

BTW, qla2xxx does divide by 2^20, which I'm not fixing here.

Signed-off-by: Joe Eykholt <jeykholt@cisco.com>
Signed-off-by: Robert Love <robert.w.love@intel.com>
Signed-off-by: James Bottomley <James.Bottomley@suse.de>
drivers/scsi/libfc/fc_fcp.c
drivers/scsi/libfc/fc_lport.c
include/scsi/libfc.h

index a8e0c0acc736f40f8f2b5bf456ec9a2fe1d51d85..cdc06cda76e53bbf1252d79702cf0e94613e10b9 100644 (file)
@@ -1860,11 +1860,11 @@ static int fc_queuecommand_lck(struct scsi_cmnd *sc_cmd, void (*done)(struct scs
        if (sc_cmd->sc_data_direction == DMA_FROM_DEVICE) {
                fsp->req_flags = FC_SRB_READ;
                stats->InputRequests++;
-               stats->InputMegabytes += fsp->data_len;
+               stats->InputBytes += fsp->data_len;
        } else if (sc_cmd->sc_data_direction == DMA_TO_DEVICE) {
                fsp->req_flags = FC_SRB_WRITE;
                stats->OutputRequests++;
-               stats->OutputMegabytes += fsp->data_len;
+               stats->OutputBytes += fsp->data_len;
        } else {
                fsp->req_flags = 0;
                stats->ControlRequests++;
index b91a11e4fa06c210b4461279371ae5618c946bf1..c5a10f94f845bd938419e7094c3a58b936b712b1 100644 (file)
@@ -288,6 +288,8 @@ struct fc_host_statistics *fc_get_host_stats(struct Scsi_Host *shost)
        struct fc_lport *lport = shost_priv(shost);
        struct timespec v0, v1;
        unsigned int cpu;
+       u64 fcp_in_bytes = 0;
+       u64 fcp_out_bytes = 0;
 
        fcoe_stats = &lport->host_stats;
        memset(fcoe_stats, 0, sizeof(struct fc_host_statistics));
@@ -310,10 +312,12 @@ struct fc_host_statistics *fc_get_host_stats(struct Scsi_Host *shost)
                fcoe_stats->fcp_input_requests += stats->InputRequests;
                fcoe_stats->fcp_output_requests += stats->OutputRequests;
                fcoe_stats->fcp_control_requests += stats->ControlRequests;
-               fcoe_stats->fcp_input_megabytes += stats->InputMegabytes;
-               fcoe_stats->fcp_output_megabytes += stats->OutputMegabytes;
+               fcp_in_bytes += stats->InputBytes;
+               fcp_out_bytes += stats->OutputBytes;
                fcoe_stats->link_failure_count += stats->LinkFailureCount;
        }
+       fcoe_stats->fcp_input_megabytes = div_u64(fcp_in_bytes, 1000000);
+       fcoe_stats->fcp_output_megabytes = div_u64(fcp_out_bytes, 1000000);
        fcoe_stats->lip_count = -1;
        fcoe_stats->nos_count = -1;
        fcoe_stats->loss_of_sync_count = -1;
index 3eb3915eb557e6e2232bdf5150e2bce55bf645f8..f53c8e31d5fba1f3e5a59e0104fcaf5980319fde 100644 (file)
@@ -221,8 +221,8 @@ struct fc_rport_priv {
  * @InputRequests:         Number of input requests
  * @OutputRequests:        Number of output requests
  * @ControlRequests:       Number of control requests
- * @InputMegabytes:        Number of received megabytes
- * @OutputMegabytes:       Number of transmitted megabytes
+ * @InputBytes:            Number of received bytes
+ * @OutputBytes:           Number of transmitted bytes
  * @VLinkFailureCount:     Number of virtual link failures
  * @MissDiscAdvCount:      Number of missing FIP discovery advertisement
  */
@@ -241,8 +241,8 @@ struct fcoe_dev_stats {
        u64             InputRequests;
        u64             OutputRequests;
        u64             ControlRequests;
-       u64             InputMegabytes;
-       u64             OutputMegabytes;
+       u64             InputBytes;
+       u64             OutputBytes;
        u64             VLinkFailureCount;
        u64             MissDiscAdvCount;
 };