aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/cxgb3/sge.c
diff options
context:
space:
mode:
authorDivy Le Ray <divy@chelsio.com>2009-03-12 17:13:43 -0400
committerDavid S. Miller <davem@davemloft.net>2009-03-13 14:30:43 -0400
commit26b3871d2c82b7c733a3b6d631a6e48c9ebf1c5a (patch)
tree301a4a1bca9cb85aa8e50bcaa223fa9772afbb90 /drivers/net/cxgb3/sge.c
parentff5e2b4732b8386d8354da2cdf7c146487f51736 (diff)
cxgb3: ring rx door bell less frequently
Ring free lists door bell less frequently, specifically every quarter of the active FL size. Signed-off-by: Divy Le Ray <divy@chelsio.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/cxgb3/sge.c')
-rw-r--r--drivers/net/cxgb3/sge.c32
1 files changed, 24 insertions, 8 deletions
diff --git a/drivers/net/cxgb3/sge.c b/drivers/net/cxgb3/sge.c
index 8205aa4ae94..882beafeb74 100644
--- a/drivers/net/cxgb3/sge.c
+++ b/drivers/net/cxgb3/sge.c
@@ -63,6 +63,10 @@
63#define SGE_RX_DROP_THRES 16 63#define SGE_RX_DROP_THRES 16
64 64
65/* 65/*
66 * Max number of Rx buffers we replenish at a time.
67 */
68#define MAX_RX_REFILL 16U
69/*
66 * Period of the Tx buffer reclaim timer. This timer does not need to run 70 * Period of the Tx buffer reclaim timer. This timer does not need to run
67 * frequently as Tx buffers are usually reclaimed by new Tx packets. 71 * frequently as Tx buffers are usually reclaimed by new Tx packets.
68 */ 72 */
@@ -423,6 +427,14 @@ static int alloc_pg_chunk(struct sge_fl *q, struct rx_sw_desc *sd, gfp_t gfp,
423 return 0; 427 return 0;
424} 428}
425 429
430static inline void ring_fl_db(struct adapter *adap, struct sge_fl *q)
431{
432 if (q->pend_cred >= q->credits / 4) {
433 q->pend_cred = 0;
434 t3_write_reg(adap, A_SG_KDOORBELL, V_EGRCNTX(q->cntxt_id));
435 }
436}
437
426/** 438/**
427 * refill_fl - refill an SGE free-buffer list 439 * refill_fl - refill an SGE free-buffer list
428 * @adapter: the adapter 440 * @adapter: the adapter
@@ -478,19 +490,19 @@ nomem: q->alloc_failed++;
478 sd = q->sdesc; 490 sd = q->sdesc;
479 d = q->desc; 491 d = q->desc;
480 } 492 }
481 q->credits++;
482 count++; 493 count++;
483 } 494 }
484 wmb(); 495
485 if (likely(count)) 496 q->credits += count;
486 t3_write_reg(adap, A_SG_KDOORBELL, V_EGRCNTX(q->cntxt_id)); 497 q->pend_cred += count;
498 ring_fl_db(adap, q);
487 499
488 return count; 500 return count;
489} 501}
490 502
491static inline void __refill_fl(struct adapter *adap, struct sge_fl *fl) 503static inline void __refill_fl(struct adapter *adap, struct sge_fl *fl)
492{ 504{
493 refill_fl(adap, fl, min(16U, fl->size - fl->credits), 505 refill_fl(adap, fl, min(MAX_RX_REFILL, fl->size - fl->credits),
494 GFP_ATOMIC | __GFP_COMP); 506 GFP_ATOMIC | __GFP_COMP);
495} 507}
496 508
@@ -515,13 +527,15 @@ static void recycle_rx_buf(struct adapter *adap, struct sge_fl *q,
515 wmb(); 527 wmb();
516 to->len_gen = cpu_to_be32(V_FLD_GEN1(q->gen)); 528 to->len_gen = cpu_to_be32(V_FLD_GEN1(q->gen));
517 to->gen2 = cpu_to_be32(V_FLD_GEN2(q->gen)); 529 to->gen2 = cpu_to_be32(V_FLD_GEN2(q->gen));
518 q->credits++;
519 530
520 if (++q->pidx == q->size) { 531 if (++q->pidx == q->size) {
521 q->pidx = 0; 532 q->pidx = 0;
522 q->gen ^= 1; 533 q->gen ^= 1;
523 } 534 }
524 t3_write_reg(adap, A_SG_KDOORBELL, V_EGRCNTX(q->cntxt_id)); 535
536 q->credits++;
537 q->pend_cred++;
538 ring_fl_db(adap, q);
525} 539}
526 540
527/** 541/**
@@ -732,7 +746,9 @@ recycle:
732 return skb; 746 return skb;
733 } 747 }
734 748
735 if (unlikely(fl->credits < drop_thres)) 749 if (unlikely(fl->credits < drop_thres) &&
750 refill_fl(adap, fl, min(MAX_RX_REFILL, fl->size - fl->credits - 1),
751 GFP_ATOMIC | __GFP_COMP) == 0)
736 goto recycle; 752 goto recycle;
737 753
738use_orig_buf: 754use_orig_buf: