git: 9front

Download patch

ref: 48163f55cf94bbc07d2253d546c7b9bcab434abc
parent: afee3e668d7b3a16f8805dea1ac7a58eb02849f5
author: cinap_lenrek <cinap_lenrek@gmx.de>
date: Sat Jul 27 08:39:34 EDT 2013

ether82598, etherigbe: remove receive buffer pool optimization

--- a/sys/src/9/pc/ether82598.c
+++ b/sys/src/9/pc/ether82598.c
@@ -268,7 +268,6 @@
 	uchar	flag;
 	int	nrd;
 	int	ntd;
-	int	nrb;
 	int	rbsz;
 	Lock	slock;
 	Lock	alock;
@@ -309,8 +308,6 @@
 
 static	Ctlr	*ctlrtab[4];
 static	int	nctlr;
-static	Lock	rblock;
-static	Block	*rbpool;
 
 static void
 readstats(Ctlr *c)
@@ -400,32 +397,6 @@
 	return -1;
 }
 
-static Block*
-rballoc(void)
-{
-	Block *bp;
-
-	ilock(&rblock);
-	if((bp = rbpool) != nil){
-		rbpool = bp->next;
-		bp->next = 0;
-		_xinc(&bp->ref);	/* prevent bp from being freed */
-	}
-	iunlock(&rblock);
-	return bp;
-}
-
-void
-rbfree(Block *b)
-{
-	b->rp = b->wp = (uchar*)PGROUND((uintptr)b->base);
- 	b->flag &= ~(Bipck | Budpck | Btcpck | Bpktck);
-	ilock(&rblock);
-	b->next = rbpool;
-	rbpool = b;
-	iunlock(&rblock);
-}
-
 #define Next(x, m)	(((x)+1) & (m))
 
 static int
@@ -545,12 +516,11 @@
 	m = c->nrd - 1;
 	i = 0;
 	for(rdt = c->rdt; Next(rdt, m) != rdh; rdt = Next(rdt, m)){
-		r = c->rdba + rdt;
-		if(!(b = rballoc())){
-			print("82598: no buffers\n");
-			break;
-		}
+		b = allocb(c->rbsz+BY2PG);
+		b->rp = (uchar*)PGROUND((uintptr)b->base);
+		b->wp = b->rp;
 		c->rb[rdt] = b;
+		r = c->rdba + rdt;
 		r->addr[0] = PCIWADDR(b->rp);
 		r->status = 0;
 		c->rdfree++;
@@ -796,7 +766,6 @@
 static void
 attach(Ether *e)
 {
-	Block *b;
 	Ctlr *c;
 	int t;
 	char buf[KNAMELEN];
@@ -823,23 +792,6 @@
 	c->tdba = (Td*)ROUNDUP((uintptr)(c->rdba + c->nrd), 256);
 	c->rb = (Block**)(c->tdba + c->ntd);
 	c->tb = (Block**)(c->rb + c->nrd);
-
-	if(waserror()){
-		while(b = rballoc()){
-			b->free = 0;
-			freeb(b);
-		}
-		free(c->alloc);
-		c->alloc = nil;
-		nexterror();
-	}
-	for(c->nrb = 0; c->nrb < 2*Nrb; c->nrb++){
-		if(!(b = allocb(c->rbsz+BY2PG)))
-			error(Enomem);
-		b->free = rbfree;
-		freeb(b);
-	}
-	poperror();
 
 	rxinit(c);
 	txinit(c);
--- a/sys/src/9/pc/etherigbe.c
+++ b/sys/src/9/pc/etherigbe.c
@@ -466,7 +466,6 @@
 	void*	alloc;			/* receive/transmit descriptors */
 	int	nrd;
 	int	ntd;
-	int	nrb;			/* how many this Ctlr has in the pool */
 
 	int*	nic;
 	Lock	imlock;
@@ -521,9 +520,6 @@
 static Ctlr* igbectlrhead;
 static Ctlr* igbectlrtail;
 
-static Lock igberblock;		/* free receive Blocks */
-static Block* igberbpool;	/* receive Blocks for all igbe controllers */
-
 static char* statistics[Nstatistics] = {
 	"CRC Error",
 	"Alignment Error",
@@ -761,36 +757,7 @@
 	csr32w(ctlr, Mta+x*4, ctlr->mta[x]);
 }
 
-static Block*
-igberballoc(void)
-{
-	Block *bp;
-
-	ilock(&igberblock);
-	if((bp = igberbpool) != nil){
-		igberbpool = bp->next;
-		bp->next = nil;
-		_xinc(&bp->ref);	/* prevent bp from being freed */
-	}
-	iunlock(&igberblock);
-
-	return bp;
-}
-
 static void
-igberbfree(Block* bp)
-{
-	bp->rp = bp->lim - Rbsz;
-	bp->wp = bp->rp;
- 	bp->flag &= ~(Bipck | Budpck | Btcpck | Bpktck);
-
-	ilock(&igberblock);
-	bp->next = igberbpool;
-	igberbpool = bp;
-	iunlock(&igberblock);
-}
-
-static void
 igbeim(Ctlr* ctlr, int im)
 {
 	ilock(&ctlr->imlock);
@@ -1036,12 +1003,9 @@
 	while(NEXT(rdt, ctlr->nrd) != ctlr->rdh){
 		rd = &ctlr->rdba[rdt];
 		if(ctlr->rb[rdt] == nil){
-			bp = igberballoc();
-			if(bp == nil){
-				iprint("#l%d: igbereplenish: no available buffers\n",
-					ctlr->edev->ctlrno);
-				break;
-			}
+			bp = allocb(Rbsz);
+			bp->rp = bp->lim - Rbsz;
+			bp->wp = bp->rp;
 			ctlr->rb[rdt] = bp;
 			rd->addr[0] = PCIWADDR(bp->rp);
 			rd->addr[1] = 0;
@@ -1195,7 +1159,6 @@
 static void
 igbeattach(Ether* edev)
 {
-	Block *bp;
 	Ctlr *ctlr;
 	char name[KNAMELEN];
 
@@ -1227,12 +1190,6 @@
 	}
 
 	if(waserror()){
-		while(ctlr->nrb > 0){
-			bp = igberballoc();
-			bp->free = nil;
-			freeb(bp);
-			ctlr->nrb--;
-		}
 		free(ctlr->tb);
 		ctlr->tb = nil;
 		free(ctlr->rb);
@@ -1241,13 +1198,6 @@
 		ctlr->alloc = nil;
 		qunlock(&ctlr->alock);
 		nexterror();
-	}
-
-	for(ctlr->nrb = 0; ctlr->nrb < Nrb; ctlr->nrb++){
-		if((bp = allocb(Rbsz)) == nil)
-			break;
-		bp->free = igberbfree;
-		freeb(bp);
 	}
 
 	snprint(name, KNAMELEN, "#l%dlproc", edev->ctlrno);
--