kernel: remove Block refcounting (thanks erik)
This commit is contained in:
parent
9ee3095553
commit
be3a5a6dc3
12 changed files with 12 additions and 66 deletions
|
@ -65,7 +65,7 @@ struct GREhdr{
|
||||||
typedef struct GREpriv GREpriv;
|
typedef struct GREpriv GREpriv;
|
||||||
struct GREpriv{
|
struct GREpriv{
|
||||||
/* non-MIB stats */
|
/* non-MIB stats */
|
||||||
ulong lenerr; /* short packet */
|
uvlong lenerr; /* short packet */
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct Bring Bring;
|
typedef struct Bring Bring;
|
||||||
|
@ -135,8 +135,8 @@ static char *sessend = "session end";
|
||||||
static void grekick(void *x, Block *bp);
|
static void grekick(void *x, Block *bp);
|
||||||
static char *gresetup(Conv *, char *, char *, char *);
|
static char *gresetup(Conv *, char *, char *, char *);
|
||||||
|
|
||||||
ulong grepdin, grepdout, grebdin, grebdout;
|
uvlong grepdin, grepdout, grebdin, grebdout;
|
||||||
ulong grepuin, grepuout, grebuin, grebuout;
|
uvlong grepuin, grepuout, grebuin, grebuout;
|
||||||
|
|
||||||
static Block *
|
static Block *
|
||||||
getring(Bring *r)
|
getring(Bring *r)
|
||||||
|
@ -437,13 +437,7 @@ restart:
|
||||||
memmove(gre->src, grec->coa, sizeof gre->dst);
|
memmove(gre->src, grec->coa, sizeof gre->dst);
|
||||||
memmove(gre->dst, grec->south, sizeof gre->dst);
|
memmove(gre->dst, grec->south, sizeof gre->dst);
|
||||||
|
|
||||||
/*
|
ipoput4(c->p->f, copyblock(bp, BLEN(bp)), 0, gre->ttl - 1, gre->tos, nil);
|
||||||
* Make sure the packet does not go away.
|
|
||||||
*/
|
|
||||||
_xinc(&bp->ref);
|
|
||||||
assert(bp->ref == 2);
|
|
||||||
|
|
||||||
ipoput4(c->p->f, bp, 0, gre->ttl - 1, gre->tos, nil);
|
|
||||||
grepdout++;
|
grepdout++;
|
||||||
grebdout += BLEN(bp);
|
grebdout += BLEN(bp);
|
||||||
|
|
||||||
|
@ -673,7 +667,7 @@ grestats(Proto *gre, char *buf, int len)
|
||||||
|
|
||||||
gpriv = gre->priv;
|
gpriv = gre->priv;
|
||||||
return snprint(buf, len,
|
return snprint(buf, len,
|
||||||
"gre: %lud %lud %lud %lud %lud %lud %lud %lud, lenerrs %lud\n",
|
"gre: %llud %llud %llud %llud %llud %llud %llud %llud, lenerrs %llud\n",
|
||||||
grepdin, grepdout, grepuin, grepuout,
|
grepdin, grepdout, grepuin, grepuout,
|
||||||
grebdin, grebdout, grebuin, grebuout, gpriv->lenerr);
|
grebdin, grebdout, grebuin, grebuout, gpriv->lenerr);
|
||||||
}
|
}
|
||||||
|
@ -800,13 +794,7 @@ grectldlresume(Conv *c, int, char **)
|
||||||
gre = (GREhdr *)bp->rp;
|
gre = (GREhdr *)bp->rp;
|
||||||
qunlock(&grec->lock);
|
qunlock(&grec->lock);
|
||||||
|
|
||||||
/*
|
ipoput4(c->p->f, copyblock(bp, BLEN(bp)), 0, gre->ttl - 1, gre->tos, nil);
|
||||||
* Make sure the packet does not go away.
|
|
||||||
*/
|
|
||||||
_xinc(&bp->ref);
|
|
||||||
assert(bp->ref == 2);
|
|
||||||
|
|
||||||
ipoput4(c->p->f, bp, 0, gre->ttl - 1, gre->tos, nil);
|
|
||||||
|
|
||||||
qlock(&grec->lock);
|
qlock(&grec->lock);
|
||||||
addring(&grec->dlpending, bp);
|
addring(&grec->dlpending, bp);
|
||||||
|
@ -841,8 +829,7 @@ grectlulresume(Conv *c, int, char **)
|
||||||
static char *
|
static char *
|
||||||
grectlforward(Conv *c, int, char **argv)
|
grectlforward(Conv *c, int, char **argv)
|
||||||
{
|
{
|
||||||
int len;
|
Block *bp;
|
||||||
Block *bp, *nbp;
|
|
||||||
GREconv *grec;
|
GREconv *grec;
|
||||||
GREhdr *gre;
|
GREhdr *gre;
|
||||||
Metablock *m;
|
Metablock *m;
|
||||||
|
@ -866,22 +853,7 @@ grectlforward(Conv *c, int, char **argv)
|
||||||
m = (Metablock *)bp->base;
|
m = (Metablock *)bp->base;
|
||||||
assert(m->rp >= bp->base && m->rp < bp->lim);
|
assert(m->rp >= bp->base && m->rp < bp->lim);
|
||||||
|
|
||||||
/*
|
|
||||||
* If the packet is still held inside the IP transmit
|
|
||||||
* system, make a copy of the packet first.
|
|
||||||
*/
|
|
||||||
if(bp->ref > 1){
|
|
||||||
len = bp->wp - m->rp;
|
|
||||||
nbp = allocb(len);
|
|
||||||
memmove(nbp->wp, m->rp, len);
|
|
||||||
nbp->wp += len;
|
|
||||||
freeb(bp);
|
|
||||||
bp = nbp;
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
/* Patch up rp */
|
|
||||||
bp->rp = m->rp;
|
bp->rp = m->rp;
|
||||||
}
|
|
||||||
|
|
||||||
gre = (GREhdr *)bp->rp;
|
gre = (GREhdr *)bp->rp;
|
||||||
memmove(gre->src, grec->coa, sizeof gre->dst);
|
memmove(gre->src, grec->coa, sizeof gre->dst);
|
||||||
|
|
|
@ -484,8 +484,6 @@ static void getmibstats(Ctlr *);
|
||||||
static void
|
static void
|
||||||
rxfreeb(Block *b)
|
rxfreeb(Block *b)
|
||||||
{
|
{
|
||||||
/* freeb(b) will have previously decremented b->ref to 0; raise to 1 */
|
|
||||||
_xinc(&b->ref);
|
|
||||||
b->wp = b->rp =
|
b->wp = b->rp =
|
||||||
(uchar*)((uintptr)(b->lim - Rxblklen) & ~(Bufalign - 1));
|
(uchar*)((uintptr)(b->lim - Rxblklen) & ~(Bufalign - 1));
|
||||||
assert(((uintptr)b->rp & (Bufalign - 1)) == 0);
|
assert(((uintptr)b->rp & (Bufalign - 1)) == 0);
|
||||||
|
@ -1413,7 +1411,6 @@ ctlralloc(Ctlr *ctlr)
|
||||||
iprint("ether1116: no memory for rx buffers\n");
|
iprint("ether1116: no memory for rx buffers\n");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
assert(b->ref == 1);
|
|
||||||
b->wp = b->rp = (uchar*)
|
b->wp = b->rp = (uchar*)
|
||||||
((uintptr)(b->lim - Rxblklen) & ~(Bufalign - 1));
|
((uintptr)(b->lim - Rxblklen) & ~(Bufalign - 1));
|
||||||
assert(((uintptr)b->rp & (Bufalign - 1)) == 0);
|
assert(((uintptr)b->rp & (Bufalign - 1)) == 0);
|
||||||
|
|
|
@ -758,7 +758,6 @@ gc82543allocb(Ctlr* ctlr)
|
||||||
if((bp = *(ctlr->freehead)) != nil){
|
if((bp = *(ctlr->freehead)) != nil){
|
||||||
*(ctlr->freehead) = bp->next;
|
*(ctlr->freehead) = bp->next;
|
||||||
bp->next = nil;
|
bp->next = nil;
|
||||||
_xinc(&bp->ref); /* prevent bp from being freed */
|
|
||||||
}
|
}
|
||||||
iunlock(&freelistlock);
|
iunlock(&freelistlock);
|
||||||
return bp;
|
return bp;
|
||||||
|
|
|
@ -511,7 +511,6 @@ dp83820rballoc(Desc* desc)
|
||||||
}
|
}
|
||||||
dp83820rbpool = bp->next;
|
dp83820rbpool = bp->next;
|
||||||
bp->next = nil;
|
bp->next = nil;
|
||||||
_xinc(&bp->ref); /* prevent bp from being freed */
|
|
||||||
iunlock(&dp83820rblock);
|
iunlock(&dp83820rblock);
|
||||||
|
|
||||||
desc->bufptr = PCIWADDR(bp->rp);
|
desc->bufptr = PCIWADDR(bp->rp);
|
||||||
|
|
|
@ -1346,7 +1346,7 @@ postboot(Ctlr *ctlr)
|
||||||
continue;
|
continue;
|
||||||
if((b = ctlr->calib.cmd[i]) == nil)
|
if((b = ctlr->calib.cmd[i]) == nil)
|
||||||
continue;
|
continue;
|
||||||
b->ref++; /* dont free on command completion */
|
b = copyblock(b, BLEN(b));
|
||||||
if((err = qcmd(ctlr, 4, 176, nil, 0, b)) != nil){
|
if((err = qcmd(ctlr, 4, 176, nil, 0, b)) != nil){
|
||||||
freeb(b);
|
freeb(b);
|
||||||
return err;
|
return err;
|
||||||
|
|
|
@ -864,7 +864,6 @@ balloc(Rx* rx)
|
||||||
if((bp = rx->pool->head) != nil){
|
if((bp = rx->pool->head) != nil){
|
||||||
rx->pool->head = bp->next;
|
rx->pool->head = bp->next;
|
||||||
bp->next = nil;
|
bp->next = nil;
|
||||||
_xinc(&bp->ref); /* prevent bp from being freed */
|
|
||||||
rx->pool->n--;
|
rx->pool->n--;
|
||||||
}
|
}
|
||||||
iunlock(rx->pool);
|
iunlock(rx->pool);
|
||||||
|
|
|
@ -597,7 +597,6 @@ vt6105Mrballoc(void)
|
||||||
if((bp = vt6105Mrbpool) != nil){
|
if((bp = vt6105Mrbpool) != nil){
|
||||||
vt6105Mrbpool = bp->next;
|
vt6105Mrbpool = bp->next;
|
||||||
bp->next = nil;
|
bp->next = nil;
|
||||||
_xinc(&bp->ref); /* prevent bp from being freed */
|
|
||||||
}
|
}
|
||||||
iunlock(&vt6105Mrblock);
|
iunlock(&vt6105Mrblock);
|
||||||
|
|
||||||
|
|
|
@ -30,8 +30,6 @@ _allocb(int size)
|
||||||
b->list = nil;
|
b->list = nil;
|
||||||
b->free = 0;
|
b->free = 0;
|
||||||
b->flag = 0;
|
b->flag = 0;
|
||||||
b->ref = 0;
|
|
||||||
_xinc(&b->ref);
|
|
||||||
|
|
||||||
/* align start of data portion by rounding up */
|
/* align start of data portion by rounding up */
|
||||||
addr = (uintptr)b;
|
addr = (uintptr)b;
|
||||||
|
@ -123,16 +121,10 @@ void
|
||||||
freeb(Block *b)
|
freeb(Block *b)
|
||||||
{
|
{
|
||||||
void *dead = (void*)Bdead;
|
void *dead = (void*)Bdead;
|
||||||
long ref;
|
|
||||||
|
|
||||||
if(b == nil || (ref = _xdec(&b->ref)) > 0)
|
if(b == nil)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if(ref < 0){
|
|
||||||
dumpstack();
|
|
||||||
panic("freeb: ref %ld; caller pc %#p", ref, getcallerpc(&b));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* drivers which perform non cache coherent DMA manage their own buffer
|
* drivers which perform non cache coherent DMA manage their own buffer
|
||||||
* pool of uncached buffers and provide their own free routine.
|
* pool of uncached buffers and provide their own free routine.
|
||||||
|
|
|
@ -135,7 +135,6 @@ enum
|
||||||
|
|
||||||
struct Block
|
struct Block
|
||||||
{
|
{
|
||||||
long ref;
|
|
||||||
Block* next;
|
Block* next;
|
||||||
Block* list;
|
Block* list;
|
||||||
uchar* rp; /* first unconsumed byte */
|
uchar* rp; /* first unconsumed byte */
|
||||||
|
|
|
@ -77,7 +77,6 @@ freeblist(Block *b)
|
||||||
|
|
||||||
for(; b != 0; b = next){
|
for(; b != 0; b = next){
|
||||||
next = b->next;
|
next = b->next;
|
||||||
if(b->ref == 1)
|
|
||||||
b->next = nil;
|
b->next = nil;
|
||||||
freeb(b);
|
freeb(b);
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,8 +33,6 @@ _ucallocb(int size)
|
||||||
b->list = nil;
|
b->list = nil;
|
||||||
b->free = 0;
|
b->free = 0;
|
||||||
b->flag = 0;
|
b->flag = 0;
|
||||||
b->ref = 0;
|
|
||||||
_xinc(&b->ref);
|
|
||||||
|
|
||||||
/* align start of data portion by rounding up */
|
/* align start of data portion by rounding up */
|
||||||
addr = (ulong)b;
|
addr = (ulong)b;
|
||||||
|
@ -117,16 +115,10 @@ void
|
||||||
ucfreeb(Block *b)
|
ucfreeb(Block *b)
|
||||||
{
|
{
|
||||||
void *dead = (void*)Bdead;
|
void *dead = (void*)Bdead;
|
||||||
long ref;
|
|
||||||
|
|
||||||
if(b == nil || (ref = _xdec(&b->ref)) > 0)
|
if(b == nil)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if(ref < 0){
|
|
||||||
dumpstack();
|
|
||||||
panic("ucfreeb: ref %ld; caller pc %#p", ref, getcallerpc(&b));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* drivers which perform non cache coherent DMA manage their own buffer
|
* drivers which perform non cache coherent DMA manage their own buffer
|
||||||
* pool of uncached buffers and provide their own free routine.
|
* pool of uncached buffers and provide their own free routine.
|
||||||
|
|
|
@ -462,7 +462,6 @@ rballoc(void)
|
||||||
if((bp = rbpool) != nil){
|
if((bp = rbpool) != nil){
|
||||||
rbpool = bp->next;
|
rbpool = bp->next;
|
||||||
bp->next = nil;
|
bp->next = nil;
|
||||||
_xinc(&bp->ref); /* prevent bp from being freed */
|
|
||||||
}
|
}
|
||||||
iunlock(&rblock);
|
iunlock(&rblock);
|
||||||
return bp;
|
return bp;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue