Module: xenomai-3
Branch: stable-3.0.x
Commit: d20344a0b42bf4b54a09c910900a31265d401777
URL:    
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=d20344a0b42bf4b54a09c910900a31265d401777

Author: Charles Kiorpes <ckior...@gmail.com>
Date:   Fri Nov  3 17:44:00 2017 +0100

copperplate/heapobj: tlsf: Fix unneeded pre-commit of memory pool when 
CONFIG_XENO_PSHARED set

When CONFIG_XENO_PSHARED is set, heapobj_pkg_init_private() was causing 
unneeded pages to be locked into memory by performing a temporary allocation of 
the size of the entire memory pool.

This patch reduces the size of this temporary allocation to a single page when 
CONFIG_XENO_PSHARED is set.

Signed-off-by: Charles Kiorpes <ckior...@gmail.com>

---

 lib/copperplate/heapobj-tlsf.c |   23 ++++++++++++++++++-----
 1 file changed, 18 insertions(+), 5 deletions(-)

diff --git a/lib/copperplate/heapobj-tlsf.c b/lib/copperplate/heapobj-tlsf.c
index e24db15..3709852 100644
--- a/lib/copperplate/heapobj-tlsf.c
+++ b/lib/copperplate/heapobj-tlsf.c
@@ -19,6 +19,7 @@
 #include <errno.h>
 #include <stdio.h>
 #include <stdint.h>
+#include <unistd.h>
 #include "boilerplate/tlsf/tlsf.h"
 #include "copperplate/heapobj.h"
 #include "copperplate/debug.h"
@@ -76,7 +77,12 @@ int heapobj_init_array_private(struct heapobj *hobj, const 
char *name,
 
 int heapobj_pkg_init_private(void)
 {
-       size_t size;
+       #ifdef CONFIG_XENO_PSHARED
+               size_t alloc_size = sysconf(_SC_PAGE_SIZE);
+       #else
+               size_t alloc_size = __copperplate_setup_data.mem_pool;
+       #endif
+       size_t available_size;
        void *mem;
 
        /*
@@ -88,14 +94,21 @@ int heapobj_pkg_init_private(void)
         * We include 1k of additional memory to cope with the
         * per-block overhead for an undefined number of individual
         * allocation requests. Ugly.
+        *
+        * CAUTION: in pshared mode, private heaps are subsidiary
+        * storage pools, so no need to pre-commit as much memory as
+        * we will be preallocating for the main shared pool,
+        * especially with memory locking in effect. In that case,
+        * creating a temporary single-page pool is enough to figure
+        * out the allocation overhead.
         */
-       mem = tlsf_malloc(__copperplate_setup_data.mem_pool);
-       size = init_memory_pool(__copperplate_setup_data.mem_pool, mem);
-       if (size == (size_t)-1)
+       mem = tlsf_malloc(alloc_size);
+       available_size = init_memory_pool(alloc_size, mem);
+       if (available_size == (size_t)-1)
                panic("cannot initialize TLSF memory manager");
 
        destroy_memory_pool(mem);
-       tlsf_pool_overhead = __copperplate_setup_data.mem_pool - size;
+       tlsf_pool_overhead = alloc_size - available_size;
        tlsf_pool_overhead = (tlsf_pool_overhead + 1024) & ~15;
        tlsf_free(mem);
 


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

Reply via email to