shithub: riscv

Download patch

ref: be3a5a6dc372870c9c6cb3b039228fab89db07b5
parent: 9ee3095553844b91e92f69efb44335c850f05c65
author: cinap_lenrek <[email protected]>
date: Sat Jun 7 20:19:33 EDT 2014

kernel: remove Block refcounting (thanks erik)

--- a/sys/src/9/ip/gre.c
+++ b/sys/src/9/ip/gre.c
@@ -65,7 +65,7 @@
 typedef struct GREpriv GREpriv;
 struct GREpriv{
 	/* non-MIB stats */
-	ulong	lenerr;			/* short packet */
+	uvlong	lenerr;			/* short packet */
 };
 
 typedef struct Bring	Bring;
@@ -135,8 +135,8 @@
 static void grekick(void *x, Block *bp);
 static char *gresetup(Conv *, char *, char *, char *);
 
-ulong grepdin, grepdout, grebdin, grebdout;
-ulong grepuin, grepuout, grebuin, grebuout;
+uvlong grepdin, grepdout, grebdin, grebdout;
+uvlong grepuin, grepuout, grebuin, grebuout;
 
 static Block *
 getring(Bring *r)
@@ -437,13 +437,7 @@
 	memmove(gre->src, grec->coa, sizeof gre->dst);
 	memmove(gre->dst, grec->south, sizeof gre->dst);
 
-	/*
-	 * 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);
+	ipoput4(c->p->f, copyblock(bp, BLEN(bp)), 0, gre->ttl - 1, gre->tos, nil);
 	grepdout++;
 	grebdout += BLEN(bp);
 
@@ -673,7 +667,7 @@
 
 	gpriv = gre->priv;
 	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,
 		grebdin, grebdout, grebuin, grebuout, gpriv->lenerr);
 }
@@ -800,14 +794,8 @@
 		gre = (GREhdr *)bp->rp;
 		qunlock(&grec->lock);
 
-		/*
-		 * Make sure the packet does not go away.
-		 */
-		_xinc(&bp->ref);
-		assert(bp->ref == 2);
+		ipoput4(c->p->f, copyblock(bp, BLEN(bp)), 0, gre->ttl - 1, gre->tos, nil);
 
-		ipoput4(c->p->f, bp, 0, gre->ttl - 1, gre->tos, nil);
-
 		qlock(&grec->lock);
 		addring(&grec->dlpending, bp);
 	}
@@ -841,8 +829,7 @@
 static char *
 grectlforward(Conv *c, int, char **argv)
 {
-	int len;
-	Block *bp, *nbp;
+	Block *bp;
 	GREconv *grec;
 	GREhdr *gre;
 	Metablock *m;
@@ -866,22 +853,7 @@
 		m = (Metablock *)bp->base;
 		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;
 		memmove(gre->src, grec->coa, sizeof gre->dst);
--- a/sys/src/9/kw/ether1116.c
+++ b/sys/src/9/kw/ether1116.c
@@ -484,8 +484,6 @@
 static void
 rxfreeb(Block *b)
 {
-	/* freeb(b) will have previously decremented b->ref to 0; raise to 1 */
-	_xinc(&b->ref);
 	b->wp = b->rp =
 		(uchar*)((uintptr)(b->lim - Rxblklen) & ~(Bufalign - 1));
 	assert(((uintptr)b->rp & (Bufalign - 1)) == 0);
@@ -1413,7 +1411,6 @@
 			iprint("ether1116: no memory for rx buffers\n");
 			break;
 		}
-		assert(b->ref == 1);
 		b->wp = b->rp = (uchar*)
 			((uintptr)(b->lim - Rxblklen) & ~(Bufalign - 1));
 		assert(((uintptr)b->rp & (Bufalign - 1)) == 0);
--- a/sys/src/9/pc/ether82543gc.c
+++ b/sys/src/9/pc/ether82543gc.c
@@ -758,7 +758,6 @@
 	if((bp = *(ctlr->freehead)) != nil){
 		*(ctlr->freehead) = bp->next;
 		bp->next = nil;
-		_xinc(&bp->ref);	/* prevent bp from being freed */
 	}
 	iunlock(&freelistlock);
 	return bp;
--- a/sys/src/9/pc/etherdp83820.c
+++ b/sys/src/9/pc/etherdp83820.c
@@ -511,7 +511,6 @@
 		}
 		dp83820rbpool = bp->next;
 		bp->next = nil;
-		_xinc(&bp->ref);	/* prevent bp from being freed */
 		iunlock(&dp83820rblock);
 	
 		desc->bufptr = PCIWADDR(bp->rp);
--- a/sys/src/9/pc/etheriwl.c
+++ b/sys/src/9/pc/etheriwl.c
@@ -1346,7 +1346,7 @@
 					continue;
 				if((b = ctlr->calib.cmd[i]) == nil)
 					continue;
-				b->ref++;	/* dont free on command completion */
+				b = copyblock(b, BLEN(b));
 				if((err = qcmd(ctlr, 4, 176, nil, 0, b)) != nil){
 					freeb(b);
 					return err;
--- a/sys/src/9/pc/etherm10g.c
+++ b/sys/src/9/pc/etherm10g.c
@@ -864,7 +864,6 @@
 	if((bp = rx->pool->head) != nil){
 		rx->pool->head = bp->next;
 		bp->next = nil;
-		_xinc(&bp->ref);	/* prevent bp from being freed */
 		rx->pool->n--;
 	}
 	iunlock(rx->pool);
--- a/sys/src/9/pc/ethervt6105m.c
+++ b/sys/src/9/pc/ethervt6105m.c
@@ -597,7 +597,6 @@
 	if((bp = vt6105Mrbpool) != nil){
 		vt6105Mrbpool = bp->next;
 		bp->next = nil;
-		_xinc(&bp->ref);	/* prevent bp from being freed */
 	}
 	iunlock(&vt6105Mrblock);
 
--- a/sys/src/9/port/allocb.c
+++ b/sys/src/9/port/allocb.c
@@ -30,8 +30,6 @@
 	b->list = nil;
 	b->free = 0;
 	b->flag = 0;
-	b->ref = 0;
-	_xinc(&b->ref);
 
 	/* align start of data portion by rounding up */
 	addr = (uintptr)b;
@@ -123,15 +121,9 @@
 freeb(Block *b)
 {
 	void *dead = (void*)Bdead;
-	long ref;
 
-	if(b == nil || (ref = _xdec(&b->ref)) > 0)
+	if(b == nil)
 		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
--- a/sys/src/9/port/portdat.h
+++ b/sys/src/9/port/portdat.h
@@ -135,7 +135,6 @@
 
 struct Block
 {
-	long	ref;
 	Block*	next;
 	Block*	list;
 	uchar*	rp;			/* first unconsumed byte */
--- a/sys/src/9/port/qio.c
+++ b/sys/src/9/port/qio.c
@@ -77,8 +77,7 @@
 
 	for(; b != 0; b = next){
 		next = b->next;
-		if(b->ref == 1)
-			b->next = nil;
+		b->next = nil;
 		freeb(b);
 	}
 }
--- a/sys/src/9/port/ucallocb.c
+++ b/sys/src/9/port/ucallocb.c
@@ -33,8 +33,6 @@
 	b->list = nil;
 	b->free = 0;
 	b->flag = 0;
-	b->ref = 0;
-	_xinc(&b->ref);
 
 	/* align start of data portion by rounding up */
 	addr = (ulong)b;
@@ -117,15 +115,9 @@
 ucfreeb(Block *b)
 {
 	void *dead = (void*)Bdead;
-	long ref;
 
-	if(b == nil || (ref = _xdec(&b->ref)) > 0)
+	if(b == nil)
 		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
--- a/sys/src/9/teg2/ether8169.c
+++ b/sys/src/9/teg2/ether8169.c
@@ -462,7 +462,6 @@
 	if((bp = rbpool) != nil){
 		rbpool = bp->next;
 		bp->next = nil;
-		_xinc(&bp->ref);	/* prevent bp from being freed */
 	}
 	iunlock(&rblock);
 	return bp;