All qlocks are initialized
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 9 Oct 2013 01:08:20 +0000 (18:08 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Sat, 18 Jan 2014 20:45:27 +0000 (12:45 -0800)
Or at least those I could find.  We'll probably need to make other
newconv() methods for all the protocols to do other initialization.

I also initted similar sync variables when I saw them.

15 files changed:
kern/drivers/dev/cons.c
kern/include/ip.h
kern/include/ns.h
kern/src/net/arp.c
kern/src/net/devip.c
kern/src/net/icmp6.c
kern/src/net/ip.c
kern/src/net/ipifc.c
kern/src/net/netlog.c
kern/src/net/tcp.c
kern/src/net/udp.c
kern/src/ns/chan.c
kern/src/ns/pgrp.c
kern/src/ns/qio.c
kern/src/ns/random.c

index af87be2..62a52e0 100644 (file)
@@ -1246,6 +1246,7 @@ truerand(void)
        return x;
 }
 
+/* TODO: qlock_init this, if you ever use this */
 qlock_t grandomlk;
 
 void
index 390d05e..c8eef0c 100644 (file)
@@ -280,6 +280,7 @@ struct Proto
        int             (*remote)(struct conv*, char *unused_char_p_t, int);
        int             (*inuse)(struct conv*);
        int             (*gc)(struct Proto*);   /* returns true if any conversations are freed */
+       void    (*newconv)(struct Proto *udp, struct conv *conv);
 
        struct Fs               *f;             /* file system this proto is part of */
        struct conv             **conv;         /* array of conversations */
index f83c407..f24ee1c 100644 (file)
@@ -796,7 +796,6 @@ void                qhangup(struct queue*, char *unused_char_p_t);
 int            qisclosed(struct queue*);
 int            qiwrite(struct queue*, void*, int);
 int            qlen(struct queue*);
-void           qlock(qlock_t*);
 void           qnoblock(struct queue*, int);
 struct queue*          qopen( int unused_int, int, void (*)(void*), void*);
 int            qpass(struct queue*, struct block*);
index 8171202..e676fc6 100644 (file)
@@ -58,7 +58,9 @@ static void   rxmitproc(void *v);
 void
 arpinit(struct Fs *f)
 {
-       f->arp = kzmalloc(sizeof(struct arp), 0);
+       f->arp = kzmalloc(sizeof(struct arp), KMALLOC_WAIT);
+       qlock_init(&f->arp->qlock);
+       rendez_init(&f->arp->rxmtq);
        f->arp->f = f;
        f->arp->rxmt = NULL;
        f->arp->dropf = f->arp->dropl = NULL;
index 77cd1db..1e6d9f6 100644 (file)
@@ -259,6 +259,7 @@ ipgen(struct chan *c, char *unused_char_p_t, struct dirtab*d, int unused_int, in
 static void
 ipreset(void)
 {
+       qlock_init(&fslock);
        nullmediumlink();
        pktmediumlink();
 /* if only
@@ -282,7 +283,9 @@ ipgetfs(int dev)
 
        qlock(&fslock);
        if(ipfs[dev] == NULL){
-               f = kzmalloc(sizeof(struct Fs), 0);
+               f = kzmalloc(sizeof(struct Fs), KMALLOC_WAIT);
+               rwinit(&f->rwlock);
+               qlock_init(&f->iprouter.qlock);
                ip_init(f);
                arpinit(f);
                netloginit(f);
@@ -1227,6 +1230,7 @@ Fsproto(struct Fs *f, struct Proto *p)
        if(f->np >= Maxproto)
                return -1;
 
+       qlock_init(&p->qlock);
        p->f = f;
 
        if(p->ipproto > 0){
@@ -1276,6 +1280,10 @@ retry:
                        c = kzmalloc(sizeof(struct conv), 0);
                        if(c == NULL)
                                error(Enomem);
+                       qlock_init(&c->qlock);
+                       qlock_init(&c->listenq);
+                       rendez_init(&c->cr);
+                       rendez_init(&c->listenr);
                        qlock(&c->qlock);
                        c->p = p;
                        c->x = pp - p->conv;
index ed536e2..f0de349 100644 (file)
@@ -943,6 +943,14 @@ extern char*       icmpannounce(struct conv *c, char **argv, int argc);
 extern char*   icmpconnect(struct conv *c, char **argv, int argc);
 extern void    icmpclose(struct conv *c);
 
+void icmp6newconv(struct Proto *icmp6, struct conv *conv)
+{   
+       /* Fsprotoclone alloc'd our priv struct and attached it to conv already.
+        * Now we need to init it */
+       struct Icmpcb6 *icb = (struct Icmpcb6*)conv->ptcl;
+       qlock_init(&icb->qlock);
+}   
+
 void
 icmp6init(struct Fs *fs)
 {
@@ -959,6 +967,7 @@ icmp6init(struct Fs *fs)
        icmp6->stats = icmpstats6;
        icmp6->ctl = icmpctl6;
        icmp6->advise = icmpadvise6;
+       icmp6->newconv = icmp6newconv;
        icmp6->gc = NULL;
        icmp6->ipproto = ICMPv6;
        icmp6->nc = 16;
index aef3e3d..cfb8b35 100644 (file)
@@ -226,6 +226,8 @@ ip_init(struct Fs *f)
        struct IP *ip;
 
        ip = kzmalloc(sizeof(struct IP), 0);
+       qlock_init(&ip->fraglock4);
+       qlock_init(&ip->fraglock6);
        initfrag(ip, 100);
        f->ip = ip;
 
index 7797c71..11e2203 100644 (file)
@@ -877,6 +877,7 @@ ipifcinit(struct Fs *f)
 
        f->ipifc = ipifc;                       /* hack for ipifcremroute, findipifc, ... */
        f->self = kzmalloc(sizeof(struct Ipselftab), 0);        /* hack for ipforme */
+       qlock_init(&f->self->qlock);
 
        Fsproto(f, ipifc);
 }
index d63b9e1..3e6e8db 100644 (file)
@@ -81,6 +81,9 @@ void
 netloginit(struct Fs *f)
 {
        f->alog = kzmalloc(sizeof(struct Netlog), 0);
+       spinlock_init(&f->alog->lock);
+       qlock_init(&f->alog->qlock);
+       rendez_init(&f->alog->r);
 }
 
 void
index 274ccc2..1d19041 100644 (file)
@@ -3190,6 +3190,8 @@ tcpinit(struct Fs *fs)
 
        tcp = kzmalloc(sizeof(struct Proto), 0);
        tpriv = tcp->priv = kzmalloc(sizeof(struct tcppriv), 0);
+       qlock_init(&tpriv->tl);
+       qlock_init(&tpriv->apl);
        tcp->name = "tcp";
        tcp->connect = tcpconnect;
        tcp->announce = tcpannounce;
index fa266e0..c9b5ff2 100644 (file)
@@ -644,6 +644,14 @@ udpstats(struct Proto *udp, char *buf, int len)
                upriv->ustats.udpOutDatagrams);
 }
 
+void udpnewconv(struct Proto *udp, struct conv *conv)
+{
+       /* Fsprotoclone alloc'd our priv struct and attached it to conv already.
+        * Now we need to init it */
+       struct Udpcb *ucb = (struct Udpcb*)conv->ptcl;
+       qlock_init(&ucb->qlock);
+}
+
 void
 udpinit(struct Fs *fs)
 {
@@ -663,6 +671,7 @@ udpinit(struct Fs *fs)
        udp->stats = udpstats;
        udp->ipproto = IP_UDPPROTO;
        udp->nc = Nchans;
+       udp->newconv = udpnewconv;
        udp->ptclsize = sizeof(Udpcb);
 
        Fsproto(fs, udp);
index a0da9d0..f7d28d2 100644 (file)
@@ -155,6 +155,8 @@ newchan(void)
                c->link = chanalloc.list;
                chanalloc.list = c;
                spin_unlock(&(&chanalloc)->lock);
+               spinlock_init(&c->lock);
+               qlock_init(&c->umqlock);
        }
 
        /* if you get an error before associating with a dev,
index 9cab980..1ed6ab3 100644 (file)
@@ -56,10 +56,12 @@ newpgrp(void)
 {
        struct pgrp *p;
 
-       p = kzmalloc(sizeof(struct pgrp), 0);
+       p = kzmalloc(sizeof(struct pgrp), KMALLOC_WAIT);
        kref_init(&p->ref, freepgrp, 1);
        p->pgrpid = NEXT_ID(pgrpid);
        p->progmode = 0644;
+       qlock_init(&p->debug);
+       qlock_init(&p->nsh);
        return p;
 }
 
@@ -185,6 +187,7 @@ newfgrp(void)
 
        new = kzmalloc(sizeof(struct fgrp), 0);
        kref_init(&new->ref, freefgrp, 1);
+       spinlock_init(&new->lock);
        n = DELTAFD;
        new->nfd = n;
        new->fd = kzmalloc(n * sizeof(struct chan *), 0);
index 9014fae..35a8992 100644 (file)
@@ -798,6 +798,15 @@ qcopy(struct queue *q, int len, uint32_t offset)
        return nb;
 }
 
+static void qinit_common(struct queue *q)
+{
+       spinlock_init(&q->lock);
+       qlock_init(&q->rlock);
+       qlock_init(&q->wlock);
+       rendez_init(&q->rr);
+       rendez_init(&q->wr);
+}
+
 /*
  *  called by non-interrupt code
  */
@@ -809,6 +818,7 @@ qopen(int limit, int msg, void (*kick)(void*), void *arg)
        q = kzmalloc(sizeof(struct queue), 0);
        if(q == 0)
                return 0;
+       qinit_common(q);
 
        q->limit = q->iNULLim = limit;
        q->kick = kick;
@@ -830,6 +840,7 @@ qbypass(void (*bypass)(void*, struct block*), void *arg)
        q = kzmalloc(sizeof(struct queue), 0);
        if(q == 0)
                return 0;
+       qinit_common(q);
 
        q->limit = 0;
        q->arg = arg;
index 2bbee4b..eaabae4 100644 (file)
@@ -103,6 +103,9 @@ randomclock(void)
 void
 randominit(void)
 {
+       qlock_init(&rb.qlock);
+       rendez_init(&rb.producer);
+       rendez_init(&rb.consumer);
        /* Frequency close but not equal to HZ */
        //addclock0link(randomclock, 13);
        rb.target = 16;