mirror of
https://gitlab.nic.cz/labs/bird.git
synced 2024-11-09 12:48:43 +00:00
Linpool flush drops all the allocated pages but one
When a linpool is used to allocate a one-off big load of memory, it makes no sense to keep that amount of memory for future use inside the linpool. Contrary to previous implementations where the memory was directly free()d, we now use the page allocator which has an internal cache which keeps the released pages for us and subsequent allocations simply get these released pages back. And even if the page cleanup routine kicks in inbetween, the pages get only madvise()d, not munmap()ed so performance aspects are negligible. This may fix some memory usage peaks in extreme cases.
This commit is contained in:
parent
913ec57f27
commit
6c058ae40c
@ -187,11 +187,18 @@ lp_flush(linpool *m)
|
|||||||
{
|
{
|
||||||
struct lp_chunk *c;
|
struct lp_chunk *c;
|
||||||
|
|
||||||
/* Move ptr to the first chunk and free all large chunks */
|
/* Move ptr to the first chunk and free all other chunks */
|
||||||
m->current = c = m->first;
|
m->current = c = m->first;
|
||||||
m->ptr = c ? c->data : NULL;
|
m->ptr = c ? c->data : NULL;
|
||||||
m->end = c ? c->data + LP_DATA_SIZE : NULL;
|
m->end = c ? c->data + LP_DATA_SIZE : NULL;
|
||||||
|
|
||||||
|
while (c && c->next)
|
||||||
|
{
|
||||||
|
struct lp_chunk *d = c->next;
|
||||||
|
c->next = d->next;
|
||||||
|
free_page(d);
|
||||||
|
}
|
||||||
|
|
||||||
while (c = m->first_large)
|
while (c = m->first_large)
|
||||||
{
|
{
|
||||||
m->first_large = c->next;
|
m->first_large = c->next;
|
||||||
|
Loading…
Reference in New Issue
Block a user