question about the calculation of overload bytes in function add_extent()

孙世龙 sunshilong369 at gmail.com
Sun Apr 5 10:06:38 CEST 2020


Question about the calculation of overload memory in function add_extent()
in heapmem.c line:607(the source is listed below)
In the source code, notes that"overhead memory we need for storing our meta
data as calculated by HEAPMEM_ARENA_SIZE()".(The source of
HEAPMEM_ARENA_SIZE macro is also listed below.)
@@To simplify the problem,we ignore the alignment.@@
>From the HEAPMEM_ARENA_SIZE macro in code, we can draw the conclusion
HEAPMEM_ARENA_SIZE(size)=__size+sizeof(struct
heapmem_extent)+(__size/HEAPMEM_PAGE_SIZE)*HEAPMEM_PGMAP_BYTES
So, the overhead i think is:
overhead = HEAPMEM_ARENA_SIZE(size)-size = sizeof(struct
heapmem_extent)+(__size/HEAPMEM_PAGE_SIZE)*HEAPMEM_PGMAP_BYTES
If we use the representation explained in the source code, then
overhead = o = e+(a*p)/m
It's not equals to the calculation in the source, which is
        o = ((a * m + e * p) / (p + m))

@representation explained in source code(the whole source code is listed
below)
 * o = overhead
 * e = sizeof(heapmem_extent)
 * p = HEAPMEM_PAGE_SIZE
 * m = HEAPMEM_PGMAP_BYTES  =sizeof(struct heapmem_pgentry)



Note: "__size/HEAPMEM_PAGE_SIZE" equals to "__size>>
HEAPMEM_PAGE_SHIFT"(which is the orignal code)


@source code of macro HEAPMEM_ARENA_SIZE
#define __HEAPMEM_MAP_SIZE(__nrpages) \
((__nrpages) * HEAPMEM_PGMAP_BYTES)
/*note by myslef :(__size)>>HEAPMEM_PAGE_SHIFT is the number of pages of
memory pool
__HEAPMEM_MAP_SIZE((__size) >> HEAPMEM_PAGE_SHIFT)calculats the memory size
for storing the struct of heapmem_pgentry。*/
#define __HEAPMEM_ARENA_SIZE(__size) \
(__size + \
 __align_to(sizeof(struct heapmem_extent) + \
    __HEAPMEM_MAP_SIZE((__size) >> HEAPMEM_PAGE_SHIFT), \
    HEAPMEM_MIN_ALIGN))

/*
 * Calculate the minimal size of the memory arena needed to contain a
 * heap of __user_size bytes, including our meta data for managing it.


More information about the Xenomai mailing list