M ip/devip.c => ip/devip.c +1 -0
@@ 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);
M ip/il.c => ip/il.c +18 -2
@@ 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;
M ip/ip.h => ip/ip.h +1 -0
@@ 240,6 240,7 @@ struct IProuter {
struct Fs
{
RWlock;
+ int dev;
int np;
Proto* p[Maxproto+1]; /* list of supported protocols */
M ip/rudp.c => ip/rudp.c +23 -3
@@ 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);
-
}
/*********************************************/
M ip/tcp.c => ip/tcp.c +14 -2
@@ 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);
}
M pc/memory.c => pc/memory.c +14 -6
@@ 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);
}