shithub: riscv

Download patch

ref: 90601f6e472ad42140ded78ab116a6b214cd871f
parent: a41b74059bcb40e7fc37f3da72758b89cde4c437
parent: 3cfa8326b878e3eacce5595f6b839b4650c61621
author: Ori Bernstein <ori@eigenstate.org>
date: Sat Oct 17 15:04:17 EDT 2020

merge

--- a/sys/man/8/ndb
+++ b/sys/man/8/ndb
@@ -97,7 +97,7 @@
 .br
 .B ndb/dnsdebug
 [
-.B -rx
+.B -rxc
 ] [
 .B -f
 .I dbfile
@@ -758,6 +758,9 @@
 interface and
 .B /lib/ndb/external
 database file.
+The
+.B -c
+option enables caching which is handy for debugging the dns code.
 .PP
 .I Ndb/dnsgetip
 resolves and prints A and AAAA records without consulting
--- a/sys/src/9/pc/etheriwl.c
+++ b/sys/src/9/pc/etheriwl.c
@@ -3513,7 +3513,6 @@
 	if((err = qcmd(ctlr, 4, code, data, size, nil)) != nil
 	|| (err = flushq(ctlr, 4)) != nil){
 		print("#l%d: cmd %ud: %s\n", ctlr->edev->ctlrno, code, err);
-		ctlr->broken = 1;
 		return err;
 	}
 	return nil;
--- a/sys/src/9/pc/sdnvme.c
+++ b/sys/src/9/pc/sdnvme.c
@@ -41,6 +41,7 @@
 	u32int	*base;
 	WS	**wait;
 	Ctlr	*ctlr;
+	Lock;
 };
 
 struct Ctlr
@@ -63,6 +64,8 @@
 	u32int	mpsshift;
 	u32int	dstrd;
 
+	u32int	nsq;
+
 	CQ	cq[1+1];
 	SQ	sq[1+MAXMACH];
 
@@ -99,7 +102,9 @@
 	if(!adm){
 	Retry:
 		splhi();
-		sq = &ctlr->sq[1+m->machno];
+		sq = &ctlr->sq[1+(m->machno % ctlr->nsq)];
+		if(conf.nmach > ctlr->nsq)
+			lock(sq);
 	} else {
 		qlock(ctlr);
 		sq = &ctlr->sq[0];
@@ -207,7 +212,9 @@
 	coherence();
 	ctlr->reg[DBell + ((sq-ctlr->sq)*2+0 << ctlr->dstrd)] = sq->tail & sq->mask;
 	if(sq > ctlr->sq) {
-		assert(sq == &ctlr->sq[1+m->machno]);
+		assert(sq == &ctlr->sq[1+(m->machno % ctlr->nsq)]);
+		if(conf.nmach > ctlr->nsq)
+			unlock(sq);
 		spllo();
 	} else
 		qunlock(sq->ctlr);
@@ -381,7 +388,7 @@
 static void
 setupqueues(Ctlr *ctlr)
 {
-	u32int lgsize, *e;
+	u32int lgsize, st, *e;
 	CQ *cq;
 	SQ *sq;
 	WS ws;
@@ -400,6 +407,8 @@
 	e[11] = 3; /* IEN | PC */
 	checkstatus(wcmd(&ws), "create completion queue");
 
+	st = 0;
+
 	/* SQID[1..nmach]: submission queue per cpu */
 	for(i=1; i<=conf.nmach; i++){
 		sq = &ctlr->sq[i];
@@ -407,8 +416,19 @@
 		e = qcmd(&ws, ctlr, 1, 0x01, 0, nil, sq->base, 0x1000);
 		e[10] = i | sq->mask<<16;
 		e[11] = (cq - ctlr->cq)<<16 | 1;	/* CQID<<16 | PC */
-		checkstatus(wcmd(&ws), "create submission queue");
+
+		st = wcmd(&ws);
+		if(st != 0){
+			free(sq->base);
+			free(sq->wait);
+			memset(sq, 0, sizeof(*sq));
+			break;
+		}
 	}
+	
+	ctlr->nsq = i - 1;
+	if(ctlr->nsq < 1)
+		checkstatus(st, "create submission queues");
 
 	ilock(&ctlr->intr);
 	ctlr->ints |= 1<<(cq - ctlr->cq);
@@ -544,7 +564,7 @@
 Ready:
 	identify(ctlr);
 	setupqueues(ctlr);
-
+	print("%s: using %d submit queues\n", name, ctlr->nsq);
 	poperror();
 
 	return 1;
--- a/sys/src/cmd/ndb/dn.c
+++ b/sys/src/cmd/ndb/dn.c
@@ -641,7 +641,8 @@
 						if(rp->ttl < minttl)
 							rp->ttl = minttl;
 						rp->auth = 1;
-					}
+					} else if(rp->type == Tns && inmyarea(rp->host->name))
+						rp->auth = 1;
 				}
 				l = &rp->next;
 			}
--- a/sys/src/cmd/ndb/dnarea.c
+++ b/sys/src/cmd/ndb/dnarea.c
@@ -7,6 +7,21 @@
 
 Area *owned, *delegated;
 
+static Area*
+nameinarea(char *name, Area *s)
+{
+	int len;
+	
+	for(len = strlen(name); s != nil; s = s->next){
+		if(s->len > len)
+			continue;
+		if(cistrcmp(s->soarr->owner->name, name + len - s->len) == 0)
+			if(len == s->len || name[len - s->len - 1] == '.')
+				return s;
+	}
+	return nil;
+}
+
 /*
  *  true if a name is in our area
  */
@@ -13,30 +28,15 @@
 Area*
 inmyarea(char *name)
 {
-	int len;
 	Area *s, *d;
 
-	len = strlen(name);
-	for(s = owned; s; s = s->next){
-		if(s->len > len)
-			continue;
-		if(cistrcmp(s->soarr->owner->name, name + len - s->len) == 0)
-			if(len == s->len || name[len - s->len - 1] == '.')
-				break;
-	}
+	s = nameinarea(name, owned);
 	if(s == nil)
 		return nil;
-
-	/* name is in area `s' */
-	for(d = delegated; d; d = d->next){
-		if(d->len > len)
-			continue;
-		if(cistrcmp(d->soarr->owner->name, name + len - d->len) == 0)
-			if(len == d->len || name[len - d->len - 1] == '.')
-				return nil; /* name is in a delegated subarea */
-	}
-
-	return s;	/* name is in area `s' and not in a delegated subarea */
+	d = nameinarea(name, delegated);
+	if(d && d->len > s->len)
+		return nil;
+	return s;	/* name is in owned area `s' and not in a delegated subarea */
 }
 
 /*
@@ -48,7 +48,10 @@
 {
 	Area *s;
 	Area **l;
+	int len;
 
+	len = strlen(dp->name);
+
 	lock(&dnlock);
 	if(t->val[0])
 		l = &delegated;
@@ -55,11 +58,14 @@
 	else
 		l = &owned;
 
-	for (s = *l; s != nil; s = s->next)
+	for (s = *l; s != nil; l = &s->next, s = s->next){
+		if(s->len < len)
+			break;
 		if(s->soarr->owner == dp) {
 			unlock(&dnlock);
 			return;		/* we've already got one */
 		}
+	}
 
 	/*
 	 *  The area contains a copy of the soa rr that created it.
@@ -67,7 +73,7 @@
 	 *  as the area does.
 	 */
 	s = emalloc(sizeof(*s));
-	s->len = strlen(dp->name);
+	s->len = len;
 	rrcopy(rp, &s->soarr);
 	s->soarr->owner = dp;
 	s->soarr->db = 1;
--- a/sys/src/cmd/ndb/dnsdebug.c
+++ b/sys/src/cmd/ndb/dnsdebug.c
@@ -56,9 +56,16 @@
 	case 'f':
 		dbfile = EARGF(usage());
 		break;
+	case 'c':
+		cfg.cachedb = 1;
+		break;
 	case 'r':
 		cfg.resolver = 1;
 		break;
+	case 'd':
+		debug = 1;
+		traceactivity = 1;
+		break;
 	case 'x':
 		dbfile = "/lib/ndb/external";
 		strcpy(mntpt, "/net.alt");
@@ -73,6 +80,7 @@
 	fmtinstall('R', prettyrrfmt);
 	opendatabase();
 	srand(truerand());
+	db2cache(1);
 
 	if(cfg.resolver)
 		squirrelserveraddrs();
@@ -89,7 +97,6 @@
 		p[Blinelen(&in)-1] = 0;
 		n = tokenize(p, f, 3);
 		if(n>=1) {
-			dnpurge();		/* flush the cache */
 			docmd(n, f);
 		}
 	}
@@ -457,6 +464,12 @@
 	name = type = nil;
 	tmpsrv = 0;
 
+	if(strcmp(f[0], "refresh") == 0){
+		db2cache(1);
+		dnageall(0);
+		return;
+	}
+
 	if(*f[0] == '@') {
 		if(setserver(f[0]+1) < 0)
 			return;
@@ -483,6 +496,7 @@
 	if(name == nil)
 		return;
 
+	if(!cfg.cachedb) dnpurge();		/* flush the cache */
 	doquery(name, type);
 
 	if(tmpsrv)
--- a/sys/src/games/nes/nes.c
+++ b/sys/src/games/nes/nes.c
@@ -85,7 +85,7 @@
 		chr = malloc(nchr * CHRSZ);
 		if(chr == nil)
 			sysfatal("malloc: %r");
-		if(readn(fd, chr, nchr * CHRSZ) < nchr * CHRSZ)
+		if(readn(fd, chr, nchr * CHRSZ) < 1)
 			sysfatal("read: %r");
 	}else{
 		nchr = 1;
--