diff options
author | Matt Mackall <mpm@selenic.com> | 2008-02-04 22:29:37 -0800 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2008-02-05 09:44:19 -0800 |
commit | 679299b32dbf9bac4bdaedc850fb95d0f81b4963 (patch) | |
tree | 1dc7edbdaf67611958273345b24d271f188371a8 | |
parent | 8bc3be2751b4f74ab90a446da1912fd8204d53f7 (diff) | |
download | linux-679299b32dbf9bac4bdaedc850fb95d0f81b4963.tar.gz linux-679299b32dbf9bac4bdaedc850fb95d0f81b4963.tar.bz2 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>
-rw-r--r-- | mm/slob.c | 4 |
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 { |