summaryrefslogtreecommitdiffstats
path: root/mm/slob.c
diff options
context:
space:
mode:
authorMatt Mackall2008-02-05 07:29:37 +0100
committerLinus Torvalds2008-02-05 18:44:19 +0100
commit679299b32dbf9bac4bdaedc850fb95d0f81b4963 (patch)
tree1dc7edbdaf67611958273345b24d271f188371a8 /mm/slob.c
parentwriteback: speed up writeback of big dirty files (diff)
downloadkernel-qcow2-linux-679299b32dbf9bac4bdaedc850fb95d0f81b4963.tar.gz
kernel-qcow2-linux-679299b32dbf9bac4bdaedc850fb95d0f81b4963.tar.xz
kernel-qcow2-linux-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 {