Add sized_kzmalloc()
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 7 Sep 2016 16:27:15 +0000 (12:27 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Wed, 7 Sep 2016 16:38:17 +0000 (12:38 -0400)
Synthetic drivers often need to generate some text, based on some command,
and then let read()s copy parts of that buffer out.  Those drivers know the
size too, and would like an easy way to manage their memory.  Enter the
sized_allloc.

It's just a buffer and a size, which is sufficient for drivers.  Free the
whole thing with kfree.

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

index 88766d3..9c90a25 100644 (file)
@@ -59,3 +59,12 @@ struct kmalloc_tag {
        uint32_t canary;
        int flags;
 };
+
+/* This is aligned so that the buf is aligned to the usual kmalloc alignment. */
+struct sized_alloc {
+       void                                            *buf;
+       size_t                                          size;
+} __attribute__((aligned(KMALLOC_ALIGNMENT)));
+
+/* Allocate a sized_alloc, big enough to hold size bytes.  Free with kfree. */
+struct sized_alloc *sized_kzmalloc(size_t size, int flags);
index 48a19e6..44dfca7 100644 (file)
@@ -241,3 +241,15 @@ void kmalloc_canary_check(char *str)
        if (tag->canary != KMALLOC_CANARY)
                panic("\t\t KMALLOC CANARY CHECK FAILED %s\n", str);
 }
+
+struct sized_alloc *sized_kzmalloc(size_t size, int flags)
+{
+       struct sized_alloc *sza;
+
+       sza = kzmalloc(sizeof(struct sized_alloc) + size, flags);
+       if (!sza)
+               return NULL;
+       sza->buf = sza + 1;
+       sza->size = size;
+       return sza;
+}