[SLOF] [PATCH] Improve SLOF_alloc_mem_aligned()
Thomas Huth
thuth at redhat.com
Mon Sep 5 19:28:23 AEST 2016
When loading a file via the spapr-vlan network interface, SLOF
currently leaks quite a lot of memory, about 12kB each time.
This happens mainly because veth_init() uses for example
SLOF_alloc_mem_aligned(8192, 4096) and similar calls to get
the memory, but the space for the additional alignment is never
returned anymore later. An easy way to ease this situation is to
improve SLOF_alloc_mem_aligned() a little bit. We normally get memory
from SLOF_alloc_mem() which is aligned pretty well already, thanks to
the buddy allocator in SLOF. So we can try to first get a memory
block with the exact size first, and only do the alignment dance
if the first allocation was not aligned yet.
Signed-off-by: Thomas Huth <thuth at redhat.com>
---
slof/helpers.c | 11 ++++++++---
1 file changed, 8 insertions(+), 3 deletions(-)
diff --git a/slof/helpers.c b/slof/helpers.c
index 48c34a6..b049141 100644
--- a/slof/helpers.c
+++ b/slof/helpers.c
@@ -69,9 +69,14 @@ void *SLOF_alloc_mem(long size)
void *SLOF_alloc_mem_aligned(long size, long align)
{
- unsigned long addr = (unsigned long)SLOF_alloc_mem(size + align - 1);
- addr = addr + align - 1;
- addr = addr & ~(align - 1);
+ unsigned long addr = (unsigned long)SLOF_alloc_mem(size);
+
+ if (addr % align) {
+ SLOF_free_mem((void *)addr, size);
+ addr = (unsigned long)SLOF_alloc_mem(size + align - 1);
+ addr = addr + align - 1;
+ addr = addr & ~(align - 1);
+ }
return (void *)addr;
}
--
1.8.3.1
More information about the SLOF
mailing list