Module: xenomai-forge
Branch: master
Commit: 3b77ed2afc00a00893770efe4f094a273c3b0782
URL:    
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=3b77ed2afc00a00893770efe4f094a273c3b0782

Author: Philippe Gerum <r...@xenomai.org>
Date:   Wed Jun 19 18:51:34 2013 +0200

cobalt/kernel/heap: turn kheapq into regular kernel list

---

 include/cobalt/kernel/heap.h |   44 ++++++++++++++-------------
 kernel/cobalt/heap.c         |   67 +++++++++++++++++++++--------------------
 2 files changed, 57 insertions(+), 54 deletions(-)

diff --git a/include/cobalt/kernel/heap.h b/include/cobalt/kernel/heap.h
index 1aa02d6..871d8c2 100644
--- a/include/cobalt/kernel/heap.h
+++ b/include/cobalt/kernel/heap.h
@@ -44,8 +44,7 @@
 
 #ifdef __KERNEL__
 
-#include <linux/mm.h>
-#include <cobalt/kernel/queue.h>
+#include <cobalt/kernel/lock.h>
 #include <cobalt/kernel/list.h>
 
 #define XNHEAP_PAGE_SIZE       512 /* A reasonable value for the xnheap page 
size */
@@ -84,16 +83,14 @@ struct xnextent {
 };
 
 struct xnheap {
-
-       xnholder_t link;
-
-       u_long extentsize,
-               pagesize,
-               pageshift,
-               hdrsize,
-               npages,         /* Number of pages per extent */
-               ubytes,
-               maxcont;
+       unsigned long extentsize;
+       unsigned long pagesize;
+       unsigned long pageshift;
+       unsigned long hdrsize;
+       /** Number of pages per extent */
+       unsigned long npages;
+       unsigned long ubytes;
+       unsigned long maxcont;
 
        struct list_head extents;
        int nrextents;
@@ -105,7 +102,7 @@ struct xnheap {
                int fcount;
        } buckets[XNHEAP_NBUCKETS];
 
-       xnholder_t *idleq[NR_CPUS];
+       struct list_head *idleq[NR_CPUS];
 
        /* # of active user-space mappings. */
        unsigned long numaps;
@@ -116,10 +113,13 @@ struct xnheap {
        /* Callback upon last munmap. */
        void (*release)(struct xnheap *heap);
 
-       /** Link in heapq */
+       /** heapq */
        struct list_head stat_link;
 
        char label[XNOBJECT_NAME_LEN+16];
+
+       /** kheap */
+       struct list_head link;
 };
 
 extern struct xnheap kheap;
@@ -189,7 +189,7 @@ void xnheap_init_proc(void);
 void xnheap_cleanup_proc(void);
 
 int xnheap_init_mapped(struct xnheap *heap,
-                      u_long heapsize,
+                      unsigned long heapsize,
                       int memflags);
 
 void xnheap_destroy_mapped(struct xnheap *heap,
@@ -214,24 +214,24 @@ void xnheap_destroy_mapped(struct xnheap *heap,
 
 int xnheap_init(struct xnheap *heap,
                void *heapaddr,
-               u_long heapsize,
-               u_long pagesize);
+               unsigned long heapsize,
+               unsigned long pagesize);
 
 void xnheap_set_label(struct xnheap *heap, const char *name, ...);
 
 void xnheap_destroy(struct xnheap *heap,
                    void (*flushfn)(struct xnheap *heap,
                                    void *extaddr,
-                                   u_long extsize,
+                                   unsigned long extsize,
                                    void *cookie),
                    void *cookie);
 
 int xnheap_extend(struct xnheap *heap,
                  void *extaddr,
-                 u_long extsize);
+                 unsigned long extsize);
 
 void *xnheap_alloc(struct xnheap *heap,
-                  u_long size);
+                  unsigned long size);
 
 int xnheap_test_and_free(struct xnheap *heap,
                         void *block,
@@ -242,7 +242,7 @@ int xnheap_free(struct xnheap *heap,
 
 void xnheap_schedule_free(struct xnheap *heap,
                          void *block,
-                         xnholder_t *link);
+                         struct list_head *link);
 
 void xnheap_finalize_free_inner(struct xnheap *heap,
                                int cpu);
@@ -265,6 +265,8 @@ int xnheap_check_block(struct xnheap *heap,
 int xnheap_remap_vm_page(struct vm_area_struct *vma,
                         unsigned long from, unsigned long to);
 
+struct vm_area_struct;
+
 int xnheap_remap_io_page_range(struct file *filp,
                               struct vm_area_struct *vma,
                               unsigned long from, phys_addr_t to,
diff --git a/kernel/cobalt/heap.c b/kernel/cobalt/heap.c
index b21fde5..b98428c 100644
--- a/kernel/cobalt/heap.c
+++ b/kernel/cobalt/heap.c
@@ -207,7 +207,7 @@ static void init_extent(struct xnheap *heap, struct 
xnextent *extent)
  */
 
 /*!
- * \fn xnheap_init(struct xnheap *heap,void *heapaddr,u_long heapsize,u_long 
pagesize)
+ * \fn xnheap_init(struct xnheap *heap,void *heapaddr,unsigned long 
heapsize,unsigned long pagesize)
  * \brief Initialize a memory heap.
  *
  * Initializes a memory heap suitable for time-bounded allocation
@@ -261,9 +261,9 @@ static void init_extent(struct xnheap *heap, struct 
xnextent *extent)
  */
 
 int xnheap_init(struct xnheap *heap,
-               void *heapaddr, u_long heapsize, u_long pagesize)
+               void *heapaddr, unsigned long heapsize, unsigned long pagesize)
 {
-       u_long hdrsize, shiftsize, pageshift;
+       unsigned long hdrsize, shiftsize, pageshift;
        struct xnextent *extent;
        unsigned int cpu;
        spl_t s;
@@ -320,9 +320,10 @@ int xnheap_init(struct xnheap *heap,
 
        heap->ubytes = 0;
        heap->maxcont = heap->npages * pagesize;
+
        for_each_online_cpu(cpu)
                heap->idleq[cpu] = NULL;
-       inith(&heap->link);
+
        INIT_LIST_HEAD(&heap->extents);
        heap->nrextents = 1;
        xnlock_init(&heap->lock);
@@ -386,7 +387,7 @@ void xnheap_set_label(struct xnheap *heap, const char 
*label, ...)
 EXPORT_SYMBOL_GPL(xnheap_set_label);
 
 /*!
- * \fn void xnheap_destroy(struct xnheap *heap, void (*flushfn)(struct xnheap 
*heap, void *extaddr, u_long extsize, void *cookie), void *cookie)
+ * \fn void xnheap_destroy(struct xnheap *heap, void (*flushfn)(struct xnheap 
*heap, void *extaddr, unsigned long extsize, void *cookie), void *cookie)
  * \brief Destroys a memory heap.
  *
  * Destroys a memory heap.
@@ -414,7 +415,7 @@ EXPORT_SYMBOL_GPL(xnheap_set_label);
 void xnheap_destroy(struct xnheap *heap,
                    void (*flushfn)(struct xnheap *heap,
                                    void *extaddr,
-                                   u_long extsize, void *cookie),
+                                   unsigned long extsize, void *cookie),
                    void *cookie)
 {
        struct xnextent *p, *tmp;
@@ -452,10 +453,10 @@ EXPORT_SYMBOL_GPL(xnheap_destroy);
  * acquired the heap lock.
  */
 
-static caddr_t get_free_range(struct xnheap *heap, u_long bsize, int log2size)
+static caddr_t get_free_range(struct xnheap *heap, unsigned long bsize, int 
log2size)
 {
        caddr_t block, eblock, freepage, lastpage, headpage, freehead = NULL;
-       u_long pagenum, pagecont, freecont;
+       unsigned long pagenum, pagecont, freecont;
        struct xnextent *extent;
 
        if (list_empty(&heap->extents))
@@ -546,7 +547,7 @@ splitpage:
 }
 
 /*!
- * \fn void *xnheap_alloc(struct xnheap *heap, u_long size)
+ * \fn void *xnheap_alloc(struct xnheap *heap, unsigned long size)
  * \brief Allocate a memory block from a memory heap.
  *
  * Allocates a contiguous region of memory from an active memory heap.
@@ -577,13 +578,12 @@ splitpage:
  * Rescheduling: never.
  */
 
-void *xnheap_alloc(struct xnheap *heap, u_long size)
+void *xnheap_alloc(struct xnheap *heap, unsigned long size)
 {
+       unsigned long pagenum, bsize;
        struct xnextent *extent;
        int log2size, ilog;
-       u_long pagenum;
        caddr_t block;
-       u_long bsize;
        spl_t s;
 
        if (size == 0)
@@ -724,7 +724,7 @@ int xnheap_test_and_free(struct xnheap *heap, void *block, 
int (*ckfn) (void *bl
 {
        caddr_t freepage, lastpage, nextpage, tailpage, freeptr, *tailptr;
        int log2size, npages, ret, nblocks, xpage, ilog;
-       u_long pagenum, pagecont, boffset, bsize;
+       unsigned long pagenum, pagecont, boffset, bsize;
        struct xnextent *extent;
        spl_t s;
 
@@ -942,7 +942,7 @@ int xnheap_free(struct xnheap *heap, void *block)
 EXPORT_SYMBOL_GPL(xnheap_free);
 
 /*!
- * \fn int xnheap_extend(struct xnheap *heap, void *extaddr, u_long extsize)
+ * \fn int xnheap_extend(struct xnheap *heap, void *extaddr, unsigned long 
extsize)
  * \brief Extend a memory heap.
  *
  * Add a new extent to an existing memory heap.
@@ -970,7 +970,7 @@ EXPORT_SYMBOL_GPL(xnheap_free);
  * Rescheduling: never.
  */
 
-int xnheap_extend(struct xnheap *heap, void *extaddr, u_long extsize)
+int xnheap_extend(struct xnheap *heap, void *extaddr, unsigned long extsize)
 {
        struct xnextent *extent = extaddr;
        spl_t s;
@@ -989,10 +989,10 @@ int xnheap_extend(struct xnheap *heap, void *extaddr, 
u_long extsize)
 EXPORT_SYMBOL_GPL(xnheap_extend);
 
 /*!
- * \fn int xnheap_schedule_free(struct xnheap *heap, void *block, xnholder_t 
*link)
+ * \fn int xnheap_schedule_free(struct xnheap *heap, void *block, struct 
list_head *link)
  * \brief Schedule a memory block for release.
  *
- * This routine records a block for later release by
+ * This routine schedules a block for release by
  * xnheap_finalize_free(). This service is useful to lazily free
  * blocks of heap memory when immediate release is not an option,
  * e.g. when active references are still pending on the object for a
@@ -1021,9 +1021,9 @@ EXPORT_SYMBOL_GPL(xnheap_extend);
  * Rescheduling: never.
  */
 
-void xnheap_schedule_free(struct xnheap *heap, void *block, xnholder_t *link)
+void xnheap_schedule_free(struct xnheap *heap, void *block, struct list_head 
*link)
 {
-       unsigned cpu;
+       unsigned int cpu;
        spl_t s;
 
        xnlock_get_irqsave(&heap->lock, s);
@@ -1034,7 +1034,7 @@ void xnheap_schedule_free(struct xnheap *heap, void 
*block, xnholder_t *link)
         * freed memory.
         */
        cpu = ipipe_processor_id();
-       link->last = (xnholder_t *)block;
+       link->prev = block;
        link->next = heap->idleq[cpu];
        heap->idleq[cpu] = link;
        xnlock_put_irqrestore(&heap->lock, s);
@@ -1043,20 +1043,20 @@ EXPORT_SYMBOL_GPL(xnheap_schedule_free);
 
 void xnheap_finalize_free_inner(struct xnheap *heap, int cpu)
 {
-       xnholder_t *holder;
+       struct list_head *link;
 
-       while ((holder = heap->idleq[cpu]) != NULL) {
-               heap->idleq[cpu] = holder->next;
-               xnheap_free(heap, holder->last);
+       while ((link = heap->idleq[cpu]) != NULL) {
+               heap->idleq[cpu] = link->next;
+               xnheap_free(heap, link->prev);
        }
 }
 EXPORT_SYMBOL_GPL(xnheap_finalize_free_inner);
 
 int xnheap_check_block(struct xnheap *heap, void *block)
 {
+       unsigned long pagenum, boffset;
        int ptype, ret = -EINVAL;
        struct xnextent *extent;
-       u_long pagenum, boffset;
        spl_t s;
 
        xnlock_get_irqsave(&heap->lock, s);
@@ -1100,7 +1100,7 @@ EXPORT_SYMBOL_GPL(xnheap_check_block);
 #include <linux/fs.h>
 #include <linux/spinlock.h>
 
-static DEFINE_XNQUEUE(kheapq); /* Shared heap queue. */
+static LIST_HEAD(kheapq);      /* Shared heap queue. */
 static DEFINE_SPINLOCK(kheapq_lock);
 
 static inline void *__alloc_and_reserve_heap(size_t size, int kmflags)
@@ -1184,7 +1184,7 @@ static void xnheap_vmclose(struct vm_area_struct *vma)
        spin_lock(&kheapq_lock);
 
        if (--heap->numaps == 0 && heap->release) {
-               removeq(&kheapq, &heap->link);
+               list_del(&heap->link);
                spin_unlock(&kheapq_lock);
                __unreserve_and_free_heap(heap->heapbase,
                                          xnheap_extentsize(heap),
@@ -1210,10 +1210,11 @@ static int xnheap_open(struct inode *inode, struct file 
*file)
 static inline struct xnheap *__validate_heap_addr(void *addr)
 {
        struct xnheap *heap;
-       struct xnholder *h;
 
-       for (h = getheadq(&kheapq); h; h = nextq(&kheapq, h)) {
-               heap = container_of(h, struct xnheap, link);
+       if (list_empty(&kheapq))
+               return NULL;
+
+       list_for_each_entry(heap, &kheapq, link) {
                if (heap == addr && heap->release == NULL)
                        return heap;
        }
@@ -1356,7 +1357,7 @@ fail:
 #define xnheap_get_unmapped_area  NULL
 #endif /* CONFIG_MMU */
 
-int xnheap_init_mapped(struct xnheap *heap, u_long heapsize, int memflags)
+int xnheap_init_mapped(struct xnheap *heap, unsigned long heapsize, int 
memflags)
 {
        void *heapbase;
        int err;
@@ -1382,7 +1383,7 @@ int xnheap_init_mapped(struct xnheap *heap, u_long 
heapsize, int memflags)
        heap->heapbase = heapbase;
 
        spin_lock(&kheapq_lock);
-       appendq(&kheapq, &heap->link);
+       list_add_tail(&heap->link, &kheapq);
        spin_unlock(&kheapq_lock);
 
        return 0;
@@ -1451,7 +1452,7 @@ void xnheap_destroy_mapped(struct xnheap *heap,
         * been removed, because __validate_heap_addr() will deny
         * access to heaps pending a release.
         */
-       removeq(&kheapq, &heap->link);
+       list_del(&heap->link);
 
        spin_unlock(&kheapq_lock);
 


_______________________________________________
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git

Reply via email to