summaryrefslogtreecommitdiffstats
path: root/mm/slob.c
diff options
context:
space:
mode:
authorMatt Mackall <mpm@selenic.com>2008-02-04 22:29:37 -0800
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2008-02-05 09:44:19 -0800
commit679299b32dbf9bac4bdaedc850fb95d0f81b4963 (patch)
tree1dc7edbdaf67611958273345b24d271f188371a8 /mm/slob.c
parent8bc3be2751b4f74ab90a446da1912fd8204d53f7 (diff)
downloadlinux-stable-679299b32dbf9bac4bdaedc850fb95d0f81b4963.tar.gz
linux-stable-679299b32dbf9bac4bdaedc850fb95d0f81b4963.tar.bz2
linux-stable-679299b32dbf9bac4bdaedc850fb95d0f81b4963.zip
slob: fix free block merging at head of subpage
We weren't merging freed blocks at the beginning of the free list. Fixing this showed a 2.5% efficiency improvement in a userspace test harness. Signed-off-by: Matt Mackall <mpm@selenic.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm/slob.c')
-rw-r--r--mm/slob.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/mm/slob.c b/mm/slob.c
index 773a7aa80ab5..c56c5e57c192 100644
--- a/mm/slob.c
+++ b/mm/slob.c
@@ -398,6 +398,10 @@ static void slob_free(void *block, int size)
sp->units += units;
if (b < sp->free) {
+ if (b + units == sp->free) {
+ units += slob_units(sp->free);
+ sp->free = slob_next(sp->free);
+ }
set_slob(b, units, sp->free);
sp->free = b;
} else {