ether82598, etherigbe: remove receive buffer pool optimization
This commit is contained in:
parent
95b7745419
commit
c23715d268
2 changed files with 7 additions and 105 deletions
|
@ -268,7 +268,6 @@ typedef struct {
|
||||||
uchar flag;
|
uchar flag;
|
||||||
int nrd;
|
int nrd;
|
||||||
int ntd;
|
int ntd;
|
||||||
int nrb;
|
|
||||||
int rbsz;
|
int rbsz;
|
||||||
Lock slock;
|
Lock slock;
|
||||||
Lock alock;
|
Lock alock;
|
||||||
|
@ -309,8 +308,6 @@ enum {
|
||||||
|
|
||||||
static Ctlr *ctlrtab[4];
|
static Ctlr *ctlrtab[4];
|
||||||
static int nctlr;
|
static int nctlr;
|
||||||
static Lock rblock;
|
|
||||||
static Block *rbpool;
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
readstats(Ctlr *c)
|
readstats(Ctlr *c)
|
||||||
|
@ -400,32 +397,6 @@ ctl(Ether *, void *, long)
|
||||||
return -1;
|
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))
|
#define Next(x, m) (((x)+1) & (m))
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
@ -545,12 +516,11 @@ replenish(Ctlr *c, uint rdh)
|
||||||
m = c->nrd - 1;
|
m = c->nrd - 1;
|
||||||
i = 0;
|
i = 0;
|
||||||
for(rdt = c->rdt; Next(rdt, m) != rdh; rdt = Next(rdt, m)){
|
for(rdt = c->rdt; Next(rdt, m) != rdh; rdt = Next(rdt, m)){
|
||||||
r = c->rdba + rdt;
|
b = allocb(c->rbsz+BY2PG);
|
||||||
if(!(b = rballoc())){
|
b->rp = (uchar*)PGROUND((uintptr)b->base);
|
||||||
print("82598: no buffers\n");
|
b->wp = b->rp;
|
||||||
break;
|
|
||||||
}
|
|
||||||
c->rb[rdt] = b;
|
c->rb[rdt] = b;
|
||||||
|
r = c->rdba + rdt;
|
||||||
r->addr[0] = PCIWADDR(b->rp);
|
r->addr[0] = PCIWADDR(b->rp);
|
||||||
r->status = 0;
|
r->status = 0;
|
||||||
c->rdfree++;
|
c->rdfree++;
|
||||||
|
@ -796,7 +766,6 @@ txinit(Ctlr *c)
|
||||||
static void
|
static void
|
||||||
attach(Ether *e)
|
attach(Ether *e)
|
||||||
{
|
{
|
||||||
Block *b;
|
|
||||||
Ctlr *c;
|
Ctlr *c;
|
||||||
int t;
|
int t;
|
||||||
char buf[KNAMELEN];
|
char buf[KNAMELEN];
|
||||||
|
@ -824,23 +793,6 @@ attach(Ether *e)
|
||||||
c->rb = (Block**)(c->tdba + c->ntd);
|
c->rb = (Block**)(c->tdba + c->ntd);
|
||||||
c->tb = (Block**)(c->rb + c->nrd);
|
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);
|
rxinit(c);
|
||||||
txinit(c);
|
txinit(c);
|
||||||
|
|
||||||
|
|
|
@ -466,7 +466,6 @@ typedef struct Ctlr {
|
||||||
void* alloc; /* receive/transmit descriptors */
|
void* alloc; /* receive/transmit descriptors */
|
||||||
int nrd;
|
int nrd;
|
||||||
int ntd;
|
int ntd;
|
||||||
int nrb; /* how many this Ctlr has in the pool */
|
|
||||||
|
|
||||||
int* nic;
|
int* nic;
|
||||||
Lock imlock;
|
Lock imlock;
|
||||||
|
@ -521,9 +520,6 @@ typedef struct Ctlr {
|
||||||
static Ctlr* igbectlrhead;
|
static Ctlr* igbectlrhead;
|
||||||
static Ctlr* igbectlrtail;
|
static Ctlr* igbectlrtail;
|
||||||
|
|
||||||
static Lock igberblock; /* free receive Blocks */
|
|
||||||
static Block* igberbpool; /* receive Blocks for all igbe controllers */
|
|
||||||
|
|
||||||
static char* statistics[Nstatistics] = {
|
static char* statistics[Nstatistics] = {
|
||||||
"CRC Error",
|
"CRC Error",
|
||||||
"Alignment Error",
|
"Alignment Error",
|
||||||
|
@ -761,35 +757,6 @@ igbemulticast(void* arg, uchar* addr, int add)
|
||||||
csr32w(ctlr, Mta+x*4, ctlr->mta[x]);
|
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
|
static void
|
||||||
igbeim(Ctlr* ctlr, int im)
|
igbeim(Ctlr* ctlr, int im)
|
||||||
{
|
{
|
||||||
|
@ -1036,12 +1003,9 @@ igbereplenish(Ctlr* ctlr)
|
||||||
while(NEXT(rdt, ctlr->nrd) != ctlr->rdh){
|
while(NEXT(rdt, ctlr->nrd) != ctlr->rdh){
|
||||||
rd = &ctlr->rdba[rdt];
|
rd = &ctlr->rdba[rdt];
|
||||||
if(ctlr->rb[rdt] == nil){
|
if(ctlr->rb[rdt] == nil){
|
||||||
bp = igberballoc();
|
bp = allocb(Rbsz);
|
||||||
if(bp == nil){
|
bp->rp = bp->lim - Rbsz;
|
||||||
iprint("#l%d: igbereplenish: no available buffers\n",
|
bp->wp = bp->rp;
|
||||||
ctlr->edev->ctlrno);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
ctlr->rb[rdt] = bp;
|
ctlr->rb[rdt] = bp;
|
||||||
rd->addr[0] = PCIWADDR(bp->rp);
|
rd->addr[0] = PCIWADDR(bp->rp);
|
||||||
rd->addr[1] = 0;
|
rd->addr[1] = 0;
|
||||||
|
@ -1195,7 +1159,6 @@ igberproc(void* arg)
|
||||||
static void
|
static void
|
||||||
igbeattach(Ether* edev)
|
igbeattach(Ether* edev)
|
||||||
{
|
{
|
||||||
Block *bp;
|
|
||||||
Ctlr *ctlr;
|
Ctlr *ctlr;
|
||||||
char name[KNAMELEN];
|
char name[KNAMELEN];
|
||||||
|
|
||||||
|
@ -1227,12 +1190,6 @@ igbeattach(Ether* edev)
|
||||||
}
|
}
|
||||||
|
|
||||||
if(waserror()){
|
if(waserror()){
|
||||||
while(ctlr->nrb > 0){
|
|
||||||
bp = igberballoc();
|
|
||||||
bp->free = nil;
|
|
||||||
freeb(bp);
|
|
||||||
ctlr->nrb--;
|
|
||||||
}
|
|
||||||
free(ctlr->tb);
|
free(ctlr->tb);
|
||||||
ctlr->tb = nil;
|
ctlr->tb = nil;
|
||||||
free(ctlr->rb);
|
free(ctlr->rb);
|
||||||
|
@ -1243,13 +1200,6 @@ igbeattach(Ether* edev)
|
||||||
nexterror();
|
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);
|
snprint(name, KNAMELEN, "#l%dlproc", edev->ctlrno);
|
||||||
kproc(name, igbelproc, edev);
|
kproc(name, igbelproc, edev);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue