aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/fnic/fnic_fcs.c
diff options
context:
space:
mode:
authorHiral Patel <hiralpat@cisco.com>2013-09-12 20:45:42 -0400
committerJames Bottomley <JBottomley@Parallels.com>2013-10-25 04:57:57 -0400
commit67125b0287a9e6506c4f5afca7376667bf6dab5b (patch)
tree2a6e4e38136649cc82762b521248a361919c2a54 /drivers/scsi/fnic/fnic_fcs.c
parent441fbd25954c30d821187203f7dc941bf7b6d792 (diff)
[SCSI] fnic: Fnic Statistics Collection
This feature gathers active and cumulative per fnic stats for io, abort, terminate, reset, vlan discovery path and it also includes various important stats for debugging issues. It also provided debugfs and ioctl interface for user to retrieve these stats. It also provides functionality to reset cumulative stats through user interface. Signed-off-by: Hiral Patel <hiralpat@cisco.com> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
Diffstat (limited to 'drivers/scsi/fnic/fnic_fcs.c')
-rw-r--r--drivers/scsi/fnic/fnic_fcs.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/drivers/scsi/fnic/fnic_fcs.c b/drivers/scsi/fnic/fnic_fcs.c
index 006fa92a02df..60a1c50aa68f 100644
--- a/drivers/scsi/fnic/fnic_fcs.c
+++ b/drivers/scsi/fnic/fnic_fcs.c
@@ -302,6 +302,7 @@ static inline int is_fnic_fip_flogi_reject(struct fcoe_ctlr *fip,
302static void fnic_fcoe_send_vlan_req(struct fnic *fnic) 302static void fnic_fcoe_send_vlan_req(struct fnic *fnic)
303{ 303{
304 struct fcoe_ctlr *fip = &fnic->ctlr; 304 struct fcoe_ctlr *fip = &fnic->ctlr;
305 struct fnic_stats *fnic_stats = &fnic->fnic_stats;
305 struct sk_buff *skb; 306 struct sk_buff *skb;
306 char *eth_fr; 307 char *eth_fr;
307 int fr_len; 308 int fr_len;
@@ -337,6 +338,7 @@ static void fnic_fcoe_send_vlan_req(struct fnic *fnic)
337 vlan->desc.wwnn.fd_desc.fip_dtype = FIP_DT_NAME; 338 vlan->desc.wwnn.fd_desc.fip_dtype = FIP_DT_NAME;
338 vlan->desc.wwnn.fd_desc.fip_dlen = sizeof(vlan->desc.wwnn) / FIP_BPW; 339 vlan->desc.wwnn.fd_desc.fip_dlen = sizeof(vlan->desc.wwnn) / FIP_BPW;
339 put_unaligned_be64(fip->lp->wwnn, &vlan->desc.wwnn.fd_wwn); 340 put_unaligned_be64(fip->lp->wwnn, &vlan->desc.wwnn.fd_wwn);
341 atomic64_inc(&fnic_stats->vlan_stats.vlan_disc_reqs);
340 342
341 skb_put(skb, sizeof(*vlan)); 343 skb_put(skb, sizeof(*vlan));
342 skb->protocol = htons(ETH_P_FIP); 344 skb->protocol = htons(ETH_P_FIP);
@@ -354,6 +356,7 @@ static void fnic_fcoe_process_vlan_resp(struct fnic *fnic, struct sk_buff *skb)
354 struct fcoe_ctlr *fip = &fnic->ctlr; 356 struct fcoe_ctlr *fip = &fnic->ctlr;
355 struct fip_header *fiph; 357 struct fip_header *fiph;
356 struct fip_desc *desc; 358 struct fip_desc *desc;
359 struct fnic_stats *fnic_stats = &fnic->fnic_stats;
357 u16 vid; 360 u16 vid;
358 size_t rlen; 361 size_t rlen;
359 size_t dlen; 362 size_t dlen;
@@ -402,6 +405,7 @@ static void fnic_fcoe_process_vlan_resp(struct fnic *fnic, struct sk_buff *skb)
402 /* any VLAN descriptors present ? */ 405 /* any VLAN descriptors present ? */
403 if (list_empty(&fnic->vlans)) { 406 if (list_empty(&fnic->vlans)) {
404 /* retry from timer */ 407 /* retry from timer */
408 atomic64_inc(&fnic_stats->vlan_stats.resp_withno_vlanID);
405 FNIC_FCS_DBG(KERN_INFO, fnic->lport->host, 409 FNIC_FCS_DBG(KERN_INFO, fnic->lport->host,
406 "No VLAN descriptors in FIP VLAN response\n"); 410 "No VLAN descriptors in FIP VLAN response\n");
407 spin_unlock_irqrestore(&fnic->vlans_lock, flags); 411 spin_unlock_irqrestore(&fnic->vlans_lock, flags);
@@ -533,6 +537,7 @@ drop:
533void fnic_handle_fip_frame(struct work_struct *work) 537void fnic_handle_fip_frame(struct work_struct *work)
534{ 538{
535 struct fnic *fnic = container_of(work, struct fnic, fip_frame_work); 539 struct fnic *fnic = container_of(work, struct fnic, fip_frame_work);
540 struct fnic_stats *fnic_stats = &fnic->fnic_stats;
536 unsigned long flags; 541 unsigned long flags;
537 struct sk_buff *skb; 542 struct sk_buff *skb;
538 struct ethhdr *eh; 543 struct ethhdr *eh;
@@ -567,6 +572,8 @@ void fnic_handle_fip_frame(struct work_struct *work)
567 * fcf's & restart from scratch 572 * fcf's & restart from scratch
568 */ 573 */
569 if (is_fnic_fip_flogi_reject(&fnic->ctlr, skb)) { 574 if (is_fnic_fip_flogi_reject(&fnic->ctlr, skb)) {
575 atomic64_inc(
576 &fnic_stats->vlan_stats.flogi_rejects);
570 shost_printk(KERN_INFO, fnic->lport->host, 577 shost_printk(KERN_INFO, fnic->lport->host,
571 "Trigger a Link down - VLAN Disc\n"); 578 "Trigger a Link down - VLAN Disc\n");
572 fcoe_ctlr_link_down(&fnic->ctlr); 579 fcoe_ctlr_link_down(&fnic->ctlr);
@@ -753,6 +760,7 @@ static void fnic_rq_cmpl_frame_recv(struct vnic_rq *rq, struct cq_desc
753 struct fnic *fnic = vnic_dev_priv(rq->vdev); 760 struct fnic *fnic = vnic_dev_priv(rq->vdev);
754 struct sk_buff *skb; 761 struct sk_buff *skb;
755 struct fc_frame *fp; 762 struct fc_frame *fp;
763 struct fnic_stats *fnic_stats = &fnic->fnic_stats;
756 unsigned int eth_hdrs_stripped; 764 unsigned int eth_hdrs_stripped;
757 u8 type, color, eop, sop, ingress_port, vlan_stripped; 765 u8 type, color, eop, sop, ingress_port, vlan_stripped;
758 u8 fcoe = 0, fcoe_sof, fcoe_eof; 766 u8 fcoe = 0, fcoe_sof, fcoe_eof;
@@ -803,6 +811,7 @@ static void fnic_rq_cmpl_frame_recv(struct vnic_rq *rq, struct cq_desc
803 eth_hdrs_stripped = 0; 811 eth_hdrs_stripped = 0;
804 skb_trim(skb, bytes_written); 812 skb_trim(skb, bytes_written);
805 if (!fcs_ok) { 813 if (!fcs_ok) {
814 atomic64_inc(&fnic_stats->misc_stats.frame_errors);
806 FNIC_FCS_DBG(KERN_DEBUG, fnic->lport->host, 815 FNIC_FCS_DBG(KERN_DEBUG, fnic->lport->host,
807 "fcs error. dropping packet.\n"); 816 "fcs error. dropping packet.\n");
808 goto drop; 817 goto drop;
@@ -818,6 +827,7 @@ static void fnic_rq_cmpl_frame_recv(struct vnic_rq *rq, struct cq_desc
818 } 827 }
819 828
820 if (!fcs_ok || packet_error || !fcoe_fc_crc_ok || fcoe_enc_error) { 829 if (!fcs_ok || packet_error || !fcoe_fc_crc_ok || fcoe_enc_error) {
830 atomic64_inc(&fnic_stats->misc_stats.frame_errors);
821 FNIC_FCS_DBG(KERN_DEBUG, fnic->lport->host, 831 FNIC_FCS_DBG(KERN_DEBUG, fnic->lport->host,
822 "fnic rq_cmpl fcoe x%x fcsok x%x" 832 "fnic rq_cmpl fcoe x%x fcsok x%x"
823 " pkterr x%x fcoe_fc_crc_ok x%x, fcoe_enc_err" 833 " pkterr x%x fcoe_fc_crc_ok x%x, fcoe_enc_err"
@@ -1205,6 +1215,7 @@ void fnic_handle_fip_timer(struct fnic *fnic)
1205{ 1215{
1206 unsigned long flags; 1216 unsigned long flags;
1207 struct fcoe_vlan *vlan; 1217 struct fcoe_vlan *vlan;
1218 struct fnic_stats *fnic_stats = &fnic->fnic_stats;
1208 u64 sol_time; 1219 u64 sol_time;
1209 1220
1210 spin_lock_irqsave(&fnic->fnic_lock, flags); 1221 spin_lock_irqsave(&fnic->fnic_lock, flags);
@@ -1273,6 +1284,7 @@ void fnic_handle_fip_timer(struct fnic *fnic)
1273 vlan->state = FIP_VLAN_SENT; /* sent now */ 1284 vlan->state = FIP_VLAN_SENT; /* sent now */
1274 } 1285 }
1275 spin_unlock_irqrestore(&fnic->vlans_lock, flags); 1286 spin_unlock_irqrestore(&fnic->vlans_lock, flags);
1287 atomic64_inc(&fnic_stats->vlan_stats.sol_expiry_count);
1276 vlan->sol_count++; 1288 vlan->sol_count++;
1277 sol_time = jiffies + msecs_to_jiffies 1289 sol_time = jiffies + msecs_to_jiffies
1278 (FCOE_CTLR_START_DELAY); 1290 (FCOE_CTLR_START_DELAY);