cxgb4: Freelist starving threshold varies from adapter to adapter
authorHariprasad Shenai <hariprasad@chelsio.com>
Tue, 14 Apr 2015 20:32:31 +0000 (02:02 +0530)
committerDavid S. Miller <davem@davemloft.net>
Tue, 14 Apr 2015 19:08:51 +0000 (15:08 -0400)
fl_starv_thres could be different from adapter to adapter, don't use
hardcoded values

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

index 900c642..e0cfce8 100644 (file)
  */
 #define NOMEM_TMR_IDX (SGE_NTIMERS - 1)
 
-/*
- * An FL with <= FL_STARVE_THRES buffers is starving and a periodic timer will
- * attempt to refill it.
- */
-#define FL_STARVE_THRES 4
-
 /*
  * Suspend an Ethernet Tx queue with fewer available descriptors than this.
  * This is the same as calc_tx_descs() for a TSO packet with
@@ -248,9 +242,21 @@ static inline unsigned int fl_cap(const struct sge_fl *fl)
        return fl->size - 8;   /* 1 descriptor = 8 buffers */
 }
 
-static inline bool fl_starving(const struct sge_fl *fl)
+/**
+ *     fl_starving - return whether a Free List is starving.
+ *     @adapter: pointer to the adapter
+ *     @fl: the Free List
+ *
+ *     Tests specified Free List to see whether the number of buffers
+ *     available to the hardware has falled below our "starvation"
+ *     threshold.
+ */
+static inline bool fl_starving(const struct adapter *adapter,
+                              const struct sge_fl *fl)
 {
-       return fl->avail - fl->pend_cred <= FL_STARVE_THRES;
+       const struct sge *s = &adapter->sge;
+
+       return fl->avail - fl->pend_cred <= s->fl_starve_thres;
 }
 
 static int map_skb(struct device *dev, const struct sk_buff *skb,
@@ -655,7 +661,7 @@ out:        cred = q->avail - cred;
        q->pend_cred += cred;
        ring_fl_db(adap, q);
 
-       if (unlikely(fl_starving(q))) {
+       if (unlikely(fl_starving(adap, q))) {
                smp_wmb();
                set_bit(q->cntxt_id - adap->sge.egr_start,
                        adap->sge.starving_fl);
@@ -2248,7 +2254,7 @@ static void sge_rx_timer_cb(unsigned long data)
                        clear_bit(id, s->starving_fl);
                        smp_mb__after_atomic();
 
-                       if (fl_starving(fl)) {
+                       if (fl_starving(adap, fl)) {
                                rxq = container_of(fl, struct sge_eth_rxq, fl);
                                if (napi_reschedule(&rxq->rspq.napi))
                                        fl->starving++;