From e00228db899e3b5349686b9b6716f90754068c1e Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Thu, 24 Sep 1998 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1998-09-24 --- ip/devip.c | 1 + ip/il.c | 20 ++++++++++++++++++-- ip/ip.h | 1 + ip/rudp.c | 26 +++++++++++++++++++++++--- ip/tcp.c | 16 ++++++++++++++-- pc/memory.c | 20 ++++++++++++++------ 6 files changed, 71 insertions(+), 13 deletions(-) diff --git a/ip/devip.c b/ip/devip.c index 1e65311d254cadb7e9abf3a45e3f856f381c97b9..373246971d2cbcd4de80f7e8afcdb0b84f3caee5 100644 --- a/ip/devip.c +++ b/ip/devip.c @@ -250,6 +250,7 @@ ipgetfs(int dev) netloginit(f); for(i = 0; ipprotoinit[i]; i++) ipprotoinit[i](f); + f->dev = dev; ipfs[dev] = f; } qunlock(&fslock); diff --git a/ip/il.c b/ip/il.c index 847329c9548764c64eafae58942831003258bcaf..91f6f6542d2e2327f0c323678ba371b6e41dff60 100644 --- a/ip/il.c +++ b/ip/il.c @@ -136,6 +136,10 @@ struct Ilpriv ulong dupb; Rendez ilr; + + /* keeping track of the ack kproc */ + int ackprocstarted; + QLock apl; }; /* Always Acktime < Fasttime < Slowtime << Ackkeepalive */ @@ -385,8 +389,6 @@ ilinit(Fs *f) il->nc = Nchans; il->ptclsize = sizeof(Ilcb); Fsproto(f, il); - - kproc("ilack", ilackproc, il); } void @@ -1083,6 +1085,20 @@ ilstart(Conv *c, int type, int window) { char *e; Ilcb *ic; + Ilpriv *ipriv; + char kpname[NAMELEN]; + + ipriv = c->p->priv; + + if(ipriv->ackprocstarted == 0){ + qlock(&ipriv->apl); + if(ipriv->ackprocstarted == 0){ + sprint(kpname, "#I%dilack", c->p->f->dev); + kproc(kpname, ilackproc, c->p); + ipriv->ackprocstarted = 1; + } + qunlock(&ipriv->apl); + } ic = (Ilcb*)c->ptcl; ic->conv = c; diff --git a/ip/ip.h b/ip/ip.h index 6ecda9179299c8477acc85c135ea0f477fa42c03..4b9f00d7f96b16c9a6aa3a30cb8c713848f39a37 100644 --- a/ip/ip.h +++ b/ip/ip.h @@ -240,6 +240,7 @@ struct IProuter { struct Fs { RWlock; + int dev; int np; Proto* p[Maxproto+1]; /* list of supported protocols */ diff --git a/ip/rudp.c b/ip/rudp.c index 9d3a84f5148f4fa1ca761d93103b0b155e31a026..cf9428d9a62d0beb5b8b17c7c7f6b041fb859731 100644 --- a/ip/rudp.c +++ b/ip/rudp.c @@ -152,6 +152,9 @@ struct Rudppriv ulong rxmits; /* # of retransmissions */ ulong orders; /* # of out of order pkts */ + /* keeping track of the ack kproc */ + int ackprocstarted; + QLock apl; }; @@ -184,11 +187,30 @@ void relackq(Reliable *, Block *); void relhangup(Conv *, Reliable *); void relrexmit(Conv *, Reliable *); +static void +rudpstartackproc(Proto *rudp) +{ + Rudppriv *rpriv; + char kpname[NAMELEN]; + + rpriv = rudp->priv; + if(rpriv->ackprocstarted == 0){ + qlock(&rpriv->apl); + if(rpriv->ackprocstarted == 0){ + sprint(kpname, "#I%drudpack", rudp->f->dev); + kproc(kpname, relackproc, rudp); + rpriv->ackprocstarted = 1; + } + qunlock(&rpriv->apl); + } +} + static char* rudpconnect(Conv *c, char **argv, int argc) { char *e; + rudpstartackproc(c->p); e = Fsstdconnect(c, argv, argc); Fsconnected(c, e); @@ -217,6 +239,7 @@ rudpannounce(Conv *c, char** argv, int argc) { char *e; + rudpstartackproc(c->p); e = Fsstdannounce(c, argv, argc); if(e != nil) return e; @@ -644,9 +667,6 @@ rudpinit(Fs *fs) rudp->ptclsize = sizeof(Rudpcb); Fsproto(fs, rudp); - - kproc("relackproc", relackproc, rudp); - } /*********************************************/ diff --git a/ip/tcp.c b/ip/tcp.c index b0cf5abf975eaa0163bd43f09baad14c25c6bf84..1daeb26da4a597257ad17ab51677803c38bafae5 100644 --- a/ip/tcp.c +++ b/ip/tcp.c @@ -219,6 +219,9 @@ struct Tcppriv ulong lenerr; /* short packet */ ulong order; /* out of order */ + /* for keeping track of tcpackproc */ + int ackprocstarted; + QLock apl; }; void addreseq(Tcpctl*, Tcp*, Block*, ushort); @@ -622,9 +625,20 @@ tcpstart(Conv *s, int mode, ushort window) { Tcpctl *tcb; Tcppriv *tpriv; + char kpname[NAMELEN]; tpriv = s->p->priv; + if(tpriv->ackprocstarted == 0){ + qlock(&tpriv->apl); + if(tpriv->ackprocstarted == 0){ + sprint(kpname, "#I%dtcpack", s->p->f->dev); + kproc(kpname, tcpackproc, s->p); + tpriv->ackprocstarted = 1; + } + qunlock(&tpriv->apl); + } + tcb = (Tcpctl*)s->ptcl; inittcpctl(s); @@ -2038,6 +2052,4 @@ tcpinit(Fs *fs) tpriv->tstats.tcpMaxConn = Nchans; Fsproto(fs, tcp); - - kproc("tcpack", tcpackproc, tcp); } diff --git a/pc/memory.c b/pc/memory.c index fade67457eabed83c28619908e79d72da8d48cb0..691f0b8b67e7441732a0d07fae10115dc627f2b9 100644 --- a/pc/memory.c +++ b/pc/memory.c @@ -503,17 +503,25 @@ umbrwfree(ulong addr, int size) } ulong -upamalloc(ulong addr, int size, int align) +upamalloc(ulong pa, int size, int align) { ulong a, ae; - if(a = mapalloc(&xrmapupa, addr, size, align)) + if(a = mapalloc(&xrmapupa, pa, size, align)) return a; - if((a = mapalloc(&rmapupa, addr, size, align)) == 0) + if((a = mapalloc(&rmapupa, pa, size, align)) == 0){ + memdebug(); return 0; + } - ae = mmukmap(a, 0, size); + /* + * Upamalloc is a request to map a range of physical addresses. + * Therefore, if pa is 0 mapalloc will choose the base address. + * Note, however, mmukmap is always asked to give a 1-to-1 mapping + * of va to pa. + */ + ae = mmukmap(a, a, size); /* * Should check here that it was all delivered @@ -528,7 +536,7 @@ upamalloc(ulong addr, int size, int align) } void -upafree(ulong addr, int size) +upafree(ulong pa, int size) { - mapfree(&xrmapupa, addr, size); + mapfree(&xrmapupa, pa, size); }