fs/shm/shmfs_alloc.c: Allocate zero-initialized memory in flat build
POSIX requires that the shm objects are zero-initialized. This has been broken
in some earlier commits (starting from 9af5fc5d09)
Also fix the flat build memory allocation to allocate both object data and payload
in the same chunk (as the comment also suggests). This saves allocations and memory
in a system with lots of shm objects.
Signed-off-by: Jukka Laitinen <jukkax@ssrc.tii.ae>
This commit is contained in:
parent
890cf4764f
commit
366977b767
1 changed files with 27 additions and 23 deletions
|
|
@ -51,24 +51,26 @@ FAR struct shmfs_object_s *shmfs_alloc_object(size_t length)
|
|||
* chunk in kernel heap
|
||||
*/
|
||||
|
||||
object = fs_heap_zalloc(sizeof(struct shmfs_object_s));
|
||||
size_t hdr_size = sizeof(struct shmfs_object_s);
|
||||
size_t alloc_size = length;
|
||||
size_t cachesize = up_get_dcache_linesize();
|
||||
|
||||
if (cachesize > 0)
|
||||
{
|
||||
hdr_size = ALIGN_UP(hdr_size, cachesize);
|
||||
alloc_size = ALIGN_UP(alloc_size, cachesize);
|
||||
object = fs_heap_memalign(cachesize, hdr_size + alloc_size);
|
||||
}
|
||||
else
|
||||
{
|
||||
object = fs_heap_malloc(hdr_size + alloc_size);
|
||||
}
|
||||
|
||||
if (object)
|
||||
{
|
||||
size_t cachesize = up_get_dcache_linesize();
|
||||
if (cachesize > 0)
|
||||
{
|
||||
object->paddr = fs_heap_memalign(cachesize,
|
||||
ALIGN_UP(length, cachesize));
|
||||
}
|
||||
else
|
||||
{
|
||||
object->paddr = fs_heap_malloc(length);
|
||||
}
|
||||
|
||||
if (object->paddr)
|
||||
{
|
||||
allocated = true;
|
||||
}
|
||||
memset(object, 0, hdr_size + alloc_size);
|
||||
object->paddr = (void *)((uintptr_t)object + hdr_size);
|
||||
allocated = true;
|
||||
}
|
||||
|
||||
#elif defined(CONFIG_BUILD_PROTECTED)
|
||||
|
|
@ -76,23 +78,27 @@ FAR struct shmfs_object_s *shmfs_alloc_object(size_t length)
|
|||
* memory in user heap
|
||||
*/
|
||||
|
||||
size_t alloc_size = length;
|
||||
|
||||
object = fs_heap_zalloc(sizeof(struct shmfs_object_s));
|
||||
if (object)
|
||||
{
|
||||
size_t cachesize = up_get_dcache_linesize();
|
||||
|
||||
if (cachesize > 0)
|
||||
{
|
||||
object->paddr = kumm_memalign(cachesize,
|
||||
ALIGN_UP(length, cachesize));
|
||||
alloc_size = ALIGN_UP(alloc_size, cachesize);
|
||||
object->paddr = kumm_memalign(cachesize, alloc_size);
|
||||
}
|
||||
else
|
||||
{
|
||||
object->paddr = kumm_malloc(length);
|
||||
object->paddr = kumm_malloc(alloc_size);
|
||||
}
|
||||
|
||||
if (object->paddr)
|
||||
{
|
||||
allocated = true;
|
||||
memset(object->paddr, 0, alloc_size);
|
||||
allocated = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -152,9 +158,7 @@ void shmfs_free_object(FAR struct shmfs_object_s *object)
|
|||
{
|
||||
if (object)
|
||||
{
|
||||
#if defined(CONFIG_BUILD_FLAT)
|
||||
fs_heap_free(object->paddr);
|
||||
#elif defined(CONFIG_BUILD_PROTECTED)
|
||||
#if defined(CONFIG_BUILD_PROTECTED)
|
||||
kumm_free(object->paddr);
|
||||
#elif defined(CONFIG_BUILD_KERNEL)
|
||||
size_t i;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue