Make freeb() and freeblist() return the old size
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 30 Mar 2016 03:08:58 +0000 (23:08 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 31 Mar 2016 20:53:42 +0000 (16:53 -0400)
A few functions like to know this.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/include/ns.h
kern/src/ns/allocb.c
kern/src/ns/qio.c

index 8deffaa..aadb2a0 100644 (file)
@@ -740,10 +740,9 @@ int export(int unused_int, char *unused_char_p_t, int);
 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 *);
+size_t freeb(struct block *b);
+size_t freeblist(struct block *b);
 void freeskey(struct signerkey *);
 void getcolor(uint32_t, uint32_t *, uint32_t *, uint32_t *);
 uint32_t getmalloctag(void *);
index 3d96ec3..5e5bfd0 100644 (file)
@@ -179,13 +179,15 @@ void free_block_extra(struct block *b)
        b->extra_data = 0;              /* in case the block is reused by a free override */
 }
 
-void freeb(struct block *b)
+/* Frees a block, returning its size (len, not alloc) */
+size_t freeb(struct block *b)
 {
        void *dead = (void *)Bdead;
+       size_t ret;
 
        if (b == NULL)
-               return;
-
+               return 0;
+       ret = BLEN(b);
        free_block_extra(b);
        /*
         * drivers which perform non cache coherent DMA manage their own buffer
@@ -193,17 +195,30 @@ void freeb(struct block *b)
         */
        if (b->free) {
                b->free(b);
-               return;
+               return ret;
        }
-
        /* poison the block in case someone is still holding onto it */
        b->next = dead;
        b->rp = dead;
        b->wp = dead;
        b->lim = dead;
        b->base = dead;
-
        kfree(b);
+       return ret;
+}
+
+/* Free a list of blocks, returning their total size. */
+size_t freeblist(struct block *b)
+{
+       struct block *next;
+       size_t ret = 0;
+
+       for (; b != 0; b = next) {
+               next = b->next;
+               b->next = 0;
+               ret += freeb(b);
+       }
+       return ret;
 }
 
 void checkb(struct block *b, char *msg)
index a9d34d0..33af779 100644 (file)
@@ -118,20 +118,6 @@ void ixsummary(void)
 }
 
 /*
- *  free a list of blocks
- */
-void freeblist(struct block *b)
-{
-       struct block *next;
-
-       for (; b != 0; b = next) {
-               next = b->next;
-               b->next = 0;
-               freeb(b);
-       }
-}
-
-/*
  *  pad a block to the front (or the back if size is negative)
  */
 struct block *padblock(struct block *bp, int size)