[SCSI] libfc: fix statistics for FCP input/output megabytes
Joe Eykholt [Wed, 1 Dec 2010 00:20:18 +0000 (16:20 -0800)]
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 a8e0c0a..cdc06cd 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 b91a11e..c5a10f9 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 3eb3915..f53c8e3 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;
 };