cxgb4: Add FL DMA mapping error and low counter
authorHariprasad Shenai <hariprasad@chelsio.com>
Tue, 8 Dec 2015 04:39:16 +0000 (10:09 +0530)
committerDavid S. Miller <davem@davemloft.net>
Wed, 9 Dec 2015 03:43:15 +0000 (22:43 -0500)
Add Free List DMA Mapping Errors to SGE Queue info for
Free Lists. Add Free List "Low" counter to count the number of times we
see the number of pointers that we _think_ the hardware sees in the
Free List below the Egress Threshold.

Signed-off-by: Hariprasad Shenai <hariprasad@chelsio.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/chelsio/cxgb4/cxgb4.h
drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c
drivers/net/ethernet/chelsio/cxgb4/sge.c

index d4076e8e2e0bb6783ccd140f9e06ac6cb4180cae..e01e7228f607db04c29737f52b358319e4a988c7 100644 (file)
@@ -483,6 +483,8 @@ struct sge_fl {                     /* SGE free-buffer queue state */
        unsigned int pidx;          /* producer index */
        unsigned long alloc_failed; /* # of times buffer allocation failed */
        unsigned long large_alloc_failed;
+       unsigned long mapping_err;  /* # of RX Buffer DMA Mapping failures */
+       unsigned long low;          /* # of times momentarily starving */
        unsigned long starving;
        /* RO fields */
        unsigned int cntxt_id;      /* SGE context id for the free list */
index 4269944c5db53b19840f1752793c70bbf6b19c70..0d579b192350e913d4b74002754a8d7e1c5d19af 100644 (file)
@@ -2325,6 +2325,8 @@ do { \
                TL("TxMapErr:", mapping_err);
                RL("FLAllocErr:", fl.alloc_failed);
                RL("FLLrgAlcErr:", fl.large_alloc_failed);
+               RL("FLMapErr:", fl.mapping_err);
+               RL("FLLow:", fl.low);
                RL("FLStarving:", fl.starving);
 
        } else if (iscsi_idx < iscsi_entries) {
@@ -2359,6 +2361,8 @@ do { \
                RL("RxNoMem:", stats.nomem);
                RL("FLAllocErr:", fl.alloc_failed);
                RL("FLLrgAlcErr:", fl.large_alloc_failed);
+               RL("FLMapErr:", fl.mapping_err);
+               RL("FLLow:", fl.low);
                RL("FLStarving:", fl.starving);
 
        } else if (rdma_idx < rdma_entries) {
@@ -2388,6 +2392,8 @@ do { \
                RL("RxNoMem:", stats.nomem);
                RL("FLAllocErr:", fl.alloc_failed);
                RL("FLLrgAlcErr:", fl.large_alloc_failed);
+               RL("FLMapErr:", fl.mapping_err);
+               RL("FLLow:", fl.low);
                RL("FLStarving:", fl.starving);
 
        } else if (ciq_idx < ciq_entries) {
index c72fe1e86029eb1b2345a0e2841fae986f51fbdf..8d35ce317f679cc3390cf6b8769f7dc8fa14a726 100644 (file)
@@ -613,6 +613,7 @@ static unsigned int refill_fl(struct adapter *adap, struct sge_fl *q, int n,
                                       PCI_DMA_FROMDEVICE);
                if (unlikely(dma_mapping_error(adap->pdev_dev, mapping))) {
                        __free_pages(pg, s->fl_pg_order);
+                       q->mapping_err++;
                        goto out;   /* do not try small pages for this error */
                }
                mapping |= RX_LARGE_PG_BUF;
@@ -642,6 +643,7 @@ alloc_small_pages:
                                       PCI_DMA_FROMDEVICE);
                if (unlikely(dma_mapping_error(adap->pdev_dev, mapping))) {
                        put_page(pg);
+                       q->mapping_err++;
                        goto out;
                }
                *d++ = cpu_to_be64(mapping);
@@ -663,6 +665,7 @@ out:        cred = q->avail - cred;
 
        if (unlikely(fl_starving(adap, q))) {
                smp_wmb();
+               q->low++;
                set_bit(q->cntxt_id - adap->sge.egr_start,
                        adap->sge.starving_fl);
        }