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;
--
⑨