summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@gmx.de>2013-07-27 12:39:34 +0200
committercinap_lenrek <cinap_lenrek@gmx.de>2013-07-27 12:39:34 +0200
commitc23715d2686823cc6821b218eb9e12691d9506fd (patch)
tree64e110a922748b545d2c2e5b87e8ebfa39f5e6a0
parent95b774541964aec1fcffa010ca6e50d37e5baa56 (diff)
downloadplan9front-c23715d2686823cc6821b218eb9e12691d9506fd.tar.xz
ether82598, etherigbe: remove receive buffer pool optimization
-rw-r--r--sys/src/9/pc/ether82598.c56
-rw-r--r--sys/src/9/pc/etherigbe.c56
2 files changed, 7 insertions, 105 deletions
diff --git a/sys/src/9/pc/ether82598.c b/sys/src/9/pc/ether82598.c
index b7f4682c5..eaba15e82 100644
--- a/sys/src/9/pc/ether82598.c
+++ b/sys/src/9/pc/ether82598.c
@@ -268,7 +268,6 @@ typedef struct {
uchar flag;
int nrd;
int ntd;
- int nrb;
int rbsz;
Lock slock;
Lock alock;
@@ -309,8 +308,6 @@ enum {
static Ctlr *ctlrtab[4];
static int nctlr;
-static Lock rblock;
-static Block *rbpool;
static void
readstats(Ctlr *c)
@@ -400,32 +397,6 @@ ctl(Ether *, void *, long)
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 @@ replenish(Ctlr *c, uint rdh)
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 @@ txinit(Ctlr *c)
static void
attach(Ether *e)
{
- Block *b;
Ctlr *c;
int t;
char buf[KNAMELEN];
@@ -824,23 +793,6 @@ attach(Ether *e)
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);
diff --git a/sys/src/9/pc/etherigbe.c b/sys/src/9/pc/etherigbe.c
index 8375e9663..0b82aad14 100644
--- a/sys/src/9/pc/etherigbe.c
+++ b/sys/src/9/pc/etherigbe.c
@@ -466,7 +466,6 @@ typedef struct Ctlr {
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 @@ typedef struct Ctlr {
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,35 +757,6 @@ igbemulticast(void* arg, uchar* addr, int add)
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)
{
@@ -1036,12 +1003,9 @@ igbereplenish(Ctlr* ctlr)
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 @@ igberproc(void* arg)
static void
igbeattach(Ether* edev)
{
- Block *bp;
Ctlr *ctlr;
char name[KNAMELEN];
@@ -1227,12 +1190,6 @@ igbeattach(Ether* edev)
}
if(waserror()){
- while(ctlr->nrb > 0){
- bp = igberballoc();
- bp->free = nil;
- freeb(bp);
- ctlr->nrb--;
- }
free(ctlr->tb);
ctlr->tb = nil;
free(ctlr->rb);
@@ -1243,13 +1200,6 @@ igbeattach(Ether* edev)
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);
kproc(name, igbelproc, edev);