Removes kref_next
authorBarret Rhoden <brho@cs.berkeley.edu>
Fri, 17 Jan 2014 21:05:52 +0000 (13:05 -0800)
committerBarret Rhoden <brho@cs.berkeley.edu>
Fri, 17 Jan 2014 21:05:52 +0000 (13:05 -0800)
They are using these as a source of integer IDs, not as references.

Plan9 does this all over the place too.  Here, just an increment of an
int is fine.  In places like #s, we'll need an ID service (same idea
behind PIDs).  Solaris had 'vmem' for this, and it was pretty cool.

kern/include/kref.h
kern/src/net/ip.c
kern/src/net/ipv6.c

index 1f841f2..15b5ae9 100644 (file)
@@ -81,9 +81,4 @@ static void fake_release(struct kref *kref)
        panic("Cleaning up this object is not supported!\n");
 }
 
-static long kref_next(struct kref *kref)
-{
-       kref_get(kref, 1);
-       return atomic_read(&kref->refcount);
-}
 #endif /* ROS_KERN_KREF_H */
index b68f155..c1efd51 100644 (file)
@@ -45,6 +45,7 @@ enum
 };
 
 #define BLKIPVER(xp)   (((struct Ip4hdr*)((xp)->rp))->vihl&0xF0)
+#define NEXT_ID(x) (__sync_add_and_fetch(&(x), 1))
 
 struct Ip4hdr
 {
@@ -120,12 +121,12 @@ struct IP
        qlock_t         fraglock4;
        struct fragment4*       flisthead4;
        struct fragment4*       fragfree4;
-       struct kref             id4;
+       int             id4;
 
        qlock_t         fraglock6;
        struct fragment6*       flisthead6;
        struct fragment6*       fragfree6;
-       struct kref             id6;
+       int             id6;
 
        int             iprouting;      /* true if we route like a gateway */
 };
@@ -322,7 +323,7 @@ ipoput4(struct Fs *f,
        medialen = ifc->maxtu - ifc->m->hsize;
        if(len <= medialen) {
                if(!gating)
-                       hnputs(eh->id, kref_next(&ip->id4));
+                       hnputs(eh->id, NEXT_ID(ip->id4));
                hnputs(eh->length, len);
                if(!gating){
                        eh->frag[0] = 0;
@@ -360,7 +361,7 @@ if((eh->frag[0] & (IP_DF>>8)) && !gating) printd("%V: DF set\n", eh->dst);
        if(gating)
                lid = nhgets(eh->id);
        else
-               lid = kref_next(&ip->id4);
+               lid = NEXT_ID(ip->id4);
 
        offset = IP4HDR;
        while(xp != NULL && offset && offset >= BLEN(xp)) {
index 71d8a22..7e202f9 100644 (file)
@@ -40,6 +40,7 @@ enum
 
 #define IPV6CLASS(hdr) ((hdr->vcf[0]&0x0F)<<2 | (hdr->vcf[1]&0xF0)>>2)
 #define BLKIPVER(xp)   (((struct ip6hdr*)((xp)->rp))->vcf[0]&0xF0)
+#define NEXT_ID(x) (__sync_add_and_fetch(&(x), 1))
 /*
  * This sleazy macro is stolen shamelessly from ip.c, see comment there.
  */
@@ -137,12 +138,12 @@ struct IP
        qlock_t         fraglock4;
        struct fragment4*       flisthead4;
        struct fragment4*       fragfree4;
-       struct kref             id4;
+       int             id4;
 
        qlock_t         fraglock6;
        struct fragment6*       flisthead6;
        struct fragment6*       fragfree6;
-       struct kref             id6;
+       int             id6;
 
        int             iprouting;      /* true if we route like a gateway */
 };
@@ -282,7 +283,7 @@ ipoput6(struct Fs *f,
                goto raise;
        }
 
-       lid = kref_next(&ip->id6);
+       lid = NEXT_ID(ip->id6);
        fraghdr.nexthdr = nexthdr;
        fraghdr.res = 0;
        hnputl(fraghdr.id, lid);