From 7053e4af7b88cf2db6ef9346a4b5968ab16e5418 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Wed, 30 May 2001 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 2001-05-30 --- bitsy/devuda1341.c | 4 ++-- ip/tcp.c | 38 ++++++++++++++++++++------------- ip/udp.c | 2 -- port/cache.c | 8 +++---- port/chan.c | 3 ++- port/devloopback.c | 52 +++++++++++++++++++++++++--------------------- 6 files changed, 59 insertions(+), 48 deletions(-) diff --git a/bitsy/devuda1341.c b/bitsy/devuda1341.c index d25ff00eff32df3a2efb67144bbe4492d0a2b83a..ee9d415380628b63b2616174c832263bd9d45a13 100644 --- a/bitsy/devuda1341.c +++ b/bitsy/devuda1341.c @@ -115,8 +115,8 @@ enum Vinvert, Nvol, - Bufsize = 4* 1024, /* 46 ms each */ - Nbuf = 10, /* 1.5 seconds total */ + Bufsize = 4* 1024, /* 23 ms each */ + Nbuf = 10, /* 230 ms total */ Speed = 44100, Ncmd = 50, /* max volume command words */ diff --git a/ip/tcp.c b/ip/tcp.c index 70f51eecbc8c78ad671a3921338dd935d431ae2a..589c8a867f1f6c16b83b24e75359e79b71dc40a1 100644 --- a/ip/tcp.c +++ b/ip/tcp.c @@ -20,7 +20,7 @@ enum TimerON = 1, TimerDONE = 2, MAX_TIME = (1<<20), /* Forever */ - TCP_ACK = 50, /* Timed ack sequence in ms */ + TCP_ACK = 200, /* Timed ack sequence in ms */ URG = 0x20, /* Data marked urgent */ ACK = 0x10, /* Acknowledge is valid */ @@ -270,6 +270,7 @@ void tcpacktimer(void*); void tcpkeepalive(void*); void tcpsetkacounter(Tcpctl*); void tcprxmit(Conv*); +void tcpsettimer(Tcpctl*); void tcpsetstate(Conv *s, uchar newstate) @@ -1206,6 +1207,7 @@ update(Conv *s, Tcp *seg) if(tcb->mdev <= 0) tcb->mdev = 1; } + tcpsettimer(tcb); } } @@ -1637,7 +1639,6 @@ raise: void tcpoutput(Conv *s) { - int x; Tcp seg; int msgs; Tcpctl *tcb; @@ -1787,19 +1788,6 @@ tcpoutput(Conv *s) * expect acknowledges */ if(ssize != 0){ - /* round trip depenency */ - x = backoff(tcb->backoff) * - (tcb->mdev + (tcb->srtt>>LOGAGAIN) + MSPTICK) / MSPTICK; - - /* take into account delayed ack */ - if(sent <= 2*tcb->mss) - x += TCP_ACK/MSPTICK; - - /* sanity check */ - if(x > (10000/MSPTICK)) - x = 10000/MSPTICK; - tcb->timer.start = x; - if(tcb->timer.state != TimerON) tcpgo(tpriv, &tcb->timer); @@ -1991,6 +1979,7 @@ tcptimeout(void *arg) localclose(s, Etimedout); break; } + tcpsettimer(tcb); netlog(s->p->f, Logtcp, "timeout rexmit 0x%lux\n", tcb->snd.una); tcprxmit(s); tpriv->stats[RetransTimeouts]++; @@ -2287,6 +2276,25 @@ tcpgc(Proto *tcp) return n; } +void +tcpsettimer(Tcpctl *tcb) +{ + int x; + + /* round trip depenency */ + x = backoff(tcb->backoff) * + (tcb->mdev + (tcb->srtt>>LOGAGAIN) + MSPTICK) / MSPTICK; + + /* take into account delayed ack */ + if((tcb->snd.ptr - tcb->snd.una) <= 2*tcb->mss) + x += TCP_ACK/MSPTICK; + + /* sanity check */ + if(x > (10000/MSPTICK)) + x = 10000/MSPTICK; + tcb->timer.start = x; +} + void tcpinit(Fs *fs) { diff --git a/ip/udp.c b/ip/udp.c index 299491e223fc9866c137c4ee6c3eabace6a60e7e..bfd438b3f5df08b98c46192e6de94f8e95858182 100644 --- a/ip/udp.c +++ b/ip/udp.c @@ -142,8 +142,6 @@ udpclose(Conv *c) ucb = (Udpcb*)c->ptcl; ucb->headers = 0; - - qunlock(c); } void diff --git a/port/cache.c b/port/cache.c index 41c6056d6b555685e88abe1f03016a6866d9999e..79274858189b4c7625ca44f01d81b64590bf1270 100644 --- a/port/cache.c +++ b/port/cache.c @@ -111,10 +111,10 @@ cinit(void) m = cache.head; /* a better algorithm would be nice */ - if(conf.npage*BY2PG > 200*MB) - maxcache = 10*MAXCACHE; - if(conf.npage*BY2PG > 400*MB) - maxcache = 50*MAXCACHE; +// if(conf.npage*BY2PG > 200*MB) +// maxcache = 10*MAXCACHE; +// if(conf.npage*BY2PG > 400*MB) +// maxcache = 50*MAXCACHE; for(i = 0; i < NFILE-1; i++) { m->next = m+1; diff --git a/port/chan.c b/port/chan.c index 4df227000f2e92684d17eb4aee5c3cf59cac3d8e..599f5b676cbc6bd3c16a65b0fa16a8afb411cc44 100644 --- a/port/chan.c +++ b/port/chan.c @@ -802,8 +802,9 @@ if(chandebug) print("\ttry chan: qid %.8llux devchar %C dev %lud ->\n", c->qid.p if(dotdot) { assert(wq->nqid == 1); assert(wq->clone != nil); -if(chandebug) print("undo."); +if(chandebug) print("undo wq->clone->name %s cname %s...", wq->clone->name->s, cname->s); nc = undomount(wq->clone, cname); +if(chandebug) print("undidmount nc %s...", nc->name->s); n = 1; } else { nc = nil; diff --git a/port/devloopback.c b/port/devloopback.c index 94ae98af44ff930c0904dcda16c07caa2cc6cfbe..bb113e4d0f0d11ff457f669212f99fe3839eb77b 100644 --- a/port/devloopback.c +++ b/port/devloopback.c @@ -92,9 +92,9 @@ static Loop loopbacks[Nloopbacks]; static uvlong fasthz; -#define TYPE(x) ((x)&0xff) -#define ID(x) (((x)&~CHDIR)>>8) -#define QID(x,y) (((x)<<8)|(y)) +#define TYPE(x) (((ulong)(x))&0xff) +#define ID(x) (((ulong)(x))>>8) +#define QID(x,y) ((((ulong)(x))<<8)|((ulong)(y))) #define NS2FASTHZ(t) ((fasthz*(t))/1000000000); @@ -179,7 +179,7 @@ loopbackattach(char *spec) poperror(); qunlock(lb); - c->qid = (Qid){CHDIR|QID(0, Qtopdir), 0}; + mkqid(&c->qid, QID(0, Qtopdir), 0, QTDIR); c->aux = lb; c->dev = dev; return c; @@ -201,24 +201,26 @@ loopbackclone(Chan *c, Chan *nc) } static int -loopbackgen(Chan *c, Dirtab*, int, int i, Dir *dp) +loopbackgen(Chan *c, char*, Dirtab*, int, int i, Dir *dp) { Loop *lb; Dirtab *tab; - char buf[NAMELEN]; int len, type; + Qid qid; type = TYPE(c->qid.path); if(i == DEVDOTDOT){ switch(type){ case Qtopdir: case Qloopdir: - snprint(buf, sizeof(buf), "#X%ld", c->dev); - devdir(c, (Qid){CHDIR|QID(0, Qtopdir), 0}, buf, 0, eve, 0555, dp); + snprint(up->genbuf, sizeof(up->genbuf), "#X%ld", c->dev); + mkqid(&qid, QID(0, Qtopdir), 0, QTDIR); + devdir(c, qid, up->genbuf, 0, eve, 0555, dp); break; case Qportdir: - snprint(buf, sizeof(buf), "loopback%ld", c->dev); - devdir(c, (Qid){CHDIR|QID(0, Qloopdir), 0}, buf, 0, eve, 0555, dp); + snprint(up->genbuf, sizeof(up->genbuf), "loopback%ld", c->dev); + mkqid(&qid, QID(0, Qloopdir), 0, QTDIR); + devdir(c, qid, up->genbuf, 0, eve, 0555, dp); break; default: panic("loopbackgen %lux", c->qid.path); @@ -230,24 +232,27 @@ loopbackgen(Chan *c, Dirtab*, int, int i, Dir *dp) case Qtopdir: if(i != 0) return -1; - snprint(buf, sizeof(buf), "loopback%ld", c->dev); - devdir(c, (Qid){QID(0, Qloopdir) | CHDIR, 0}, buf, 0, eve, 0555, dp); + snprint(up->genbuf, sizeof(up->genbuf), "loopback%ld", c->dev); + mkqid(&qid, QID(0, Qloopdir), 0, QTDIR); + devdir(c, qid, up->genbuf, 0, eve, 0555, dp); return 1; case Qloopdir: if(i >= 2) return -1; - snprint(buf, sizeof(buf), "%d", i); - devdir(c, (Qid){QID(i, QID(0, Qportdir)) | CHDIR, 0}, buf, 0, eve, 0555, dp); + snprint(up->genbuf, sizeof(up->genbuf), "%d", i); + mkqid(&qid, QID(i, QID(0, Qportdir)), 0, QTDIR); + devdir(c, qid, up->genbuf, 0, eve, 0555, dp); return 1; case Qportdir: if(i >= nelem(loopportdir)) return -1; tab = &loopportdir[i]; - devdir(c, (Qid){QID(ID(c->qid.path), tab->qid.path), 0}, tab->name, tab->length, eve, tab->perm, dp); + mkqid(&qid, QID(ID(c->qid.path), tab->qid.path), 0, QTDIR); + devdir(c, qid, tab->name, tab->length, eve, tab->perm, dp); return 1; default: /* non directory entries end up here; must be in lowest level */ - if(c->qid.path & CHDIR) + if(c->qid.type & QTDIR) panic("loopbackgen: unexpected directory"); if(i != 0) return -1; @@ -265,16 +270,16 @@ loopbackgen(Chan *c, Dirtab*, int, int i, Dir *dp) } -static int -loopbackwalk(Chan *c, char *name) +static Walkqid* +loopbackwalk(Chan *c, Chan *nc, char **name, int nname) { - return devwalk(c, name, nil, 0, loopbackgen); + return devwalk(c, nc, name, nname, nil, 0, loopbackgen); } -static void -loopbackstat(Chan *c, char *db) +static int +loopbackstat(Chan *c, uchar *db, int n) { - devstat(c, db, nil, 0, loopbackgen); + return devstat(c, db, n, nil, 0, loopbackgen); } /* @@ -285,7 +290,7 @@ loopbackopen(Chan *c, int omode) { Loop *lb; - if(c->qid.path & CHDIR){ + if(c->qid.type & QTDIR){ if(omode != OREAD) error(Ebadarg); c->mode = omode; @@ -745,7 +750,6 @@ Dev loopbackdevtab = { devreset, loopbackinit, loopbackattach, - loopbackclone, loopbackwalk, loopbackstat, loopbackopen,