Refactor freeb to separate out free_block_extra
authorXiao Jia <stfairy@gmail.com>
Tue, 22 Sep 2015 23:43:25 +0000 (16:43 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 8 Oct 2015 14:35:55 +0000 (10:35 -0400)
Signed-off-by: Xiao Jia <stfairy@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/include/ns.h
kern/src/ns/allocb.c

index 693993e..8794860 100644 (file)
@@ -715,6 +715,7 @@ uint64_t fastticks(uint64_t *);
 uint64_t fastticks2ns(uint64_t);
 int findmount(struct chan **, struct mhead **, int unused_int, int, struct qid);
 void free(void *);
+void free_block_extra(struct block *);
 void freeb(struct block *);
 void freeblist(struct block *);
 void freeskey(struct signerkey *);
index 28879fc..7a2c0c7 100644 (file)
@@ -131,14 +131,10 @@ struct block *iallocb(int size)
        return b;
 }
 
-void freeb(struct block *b)
+void free_block_extra(struct block *b)
 {
-       void *dead = (void *)Bdead;
        struct extra_bdata *ebd;
 
-       if (b == NULL)
-               return;
-
        /* assuming our release method is kfree, which will change when we support
         * user buffers */
        for (int i = 0; i < b->nr_extra_bufs; i++) {
@@ -146,8 +142,20 @@ void freeb(struct block *b)
                if (ebd->base)
                        kfree((void*)ebd->base);
        }
+       b->extra_len = 0;
+       b->nr_extra_bufs = 0;
        kfree(b->extra_data);   /* harmless if it is 0 */
        b->extra_data = 0;              /* in case the block is reused by a free override */
+}
+
+void freeb(struct block *b)
+{
+       void *dead = (void *)Bdead;
+
+       if (b == NULL)
+               return;
+
+       free_block_extra(b);
        /*
         * drivers which perform non cache coherent DMA manage their own buffer
         * pool of uncached buffers and provide their own free routine.