[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