linux/arch/arm
Wolfgang Wander 1363c3cd86 [PATCH] Avoiding mmap fragmentation
Ingo recently introduced a great speedup for allocating new mmaps using the
free_area_cache pointer which boosts the specweb SSL benchmark by 4-5% and
causes huge performance increases in thread creation.

The downside of this patch is that it does lead to fragmentation in the
mmap-ed areas (visible via /proc/self/maps), such that some applications
that work fine under 2.4 kernels quickly run out of memory on any 2.6
kernel.

The problem is twofold:

  1) the free_area_cache is used to continue a search for memory where
     the last search ended.  Before the change new areas were always
     searched from the base address on.

     So now new small areas are cluttering holes of all sizes
     throughout the whole mmap-able region whereas before small holes
     tended to close holes near the base leaving holes far from the base
     large and available for larger requests.

  2) the free_area_cache also is set to the location of the last
     munmap-ed area so in scenarios where we allocate e.g.  five regions of
     1K each, then free regions 4 2 3 in this order the next request for 1K
     will be placed in the position of the old region 3, whereas before we
     appended it to the still active region 1, placing it at the location
     of the old region 2.  Before we had 1 free region of 2K, now we only
     get two free regions of 1K -> fragmentation.

The patch addresses thes issues by introducing yet another cache descriptor
cached_hole_size that contains the largest known hole size below the
current free_area_cache.  If a new request comes in the size is compared
against the cached_hole_size and if the request can be filled with a hole
below free_area_cache the search is started from the base instead.

The results look promising: Whereas 2.6.12-rc4 fragments quickly and my
(earlier posted) leakme.c test program terminates after 50000+ iterations
with 96 distinct and fragmented maps in /proc/self/maps it performs nicely
(as expected) with thread creation, Ingo's test_str02 with 20000 threads
requires 0.7s system time.

Taking out Ingo's patch (un-patch available per request) by basically
deleting all mentions of free_area_cache from the kernel and starting the
search for new memory always at the respective bases we observe: leakme
terminates successfully with 11 distinctive hardly fragmented areas in
/proc/self/maps but thread creating is gringdingly slow: 30+s(!) system
time for Ingo's test_str02 with 20000 threads.

Now - drumroll ;-) the appended patch works fine with leakme: it ends with
only 7 distinct areas in /proc/self/maps and also thread creation seems
sufficiently fast with 0.71s for 20000 threads.

Signed-off-by: Wolfgang Wander <wwc@rentec.com>
Credit-to: "Richard Purdie" <rpurdie@rpsys.net>
Signed-off-by: Ken Chen <kenneth.w.chen@intel.com>
Acked-by: Ingo Molnar <mingo@elte.hu> (partly)
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
2005-06-21 18:46:16 -07:00
..
boot [PATCH] ARM: 2700/1: Disable IXP2000 IRQs at bootup 2005-06-03 22:18:52 +01:00
common Merge master.kernel.org:/pub/scm/linux/kernel/git/gregkh/driver-2.6 2005-06-20 16:00:33 -07:00
configs [PATCH] ARM: 2719/1: enable module support in ixp2000 defconfigs by default 2005-06-20 18:51:08 +01:00
kernel Merge master.kernel.org:/pub/scm/linux/kernel/git/gregkh/driver-2.6 2005-06-20 16:00:33 -07:00
lib [PATCH] ARM: Lindent GCC helper functions 2005-06-20 16:45:32 +01:00
mach-aaec2000 [PATCH] ARM: 2686/2: AAEC-2000 Core support 2005-06-20 18:51:05 +01:00
mach-clps711x [PATCH] ARM: select PCI, ISA and ISA_DMA 2005-05-05 14:49:01 +01:00
mach-clps7500 Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
mach-ebsa110 Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
mach-epxa10db Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
mach-footbridge [PATCH] ARM: select PCI, ISA and ISA_DMA 2005-05-05 14:49:01 +01:00
mach-h720x Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
mach-imx [PATCH] ARM: select PCI, ISA and ISA_DMA 2005-05-05 14:49:01 +01:00
mach-integrator [PATCH] ARM: Remove nmi_tick() from Integrator. 2005-06-20 16:57:17 +01:00
mach-iop3xx Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
mach-ixp4xx [PATCH] PCI: drivers/pci/pci.c: remove pci_dac_set_dma_mask 2005-05-03 23:45:17 -07:00
mach-ixp2000 [PATCH] ARM: 2701/1: free up ixp2000 timer 4 for the watchdog 2005-06-20 18:51:07 +01:00
mach-l7200 Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
mach-lh7a40x Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
mach-omap Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
mach-pxa [PATCH] ARM SMP: Fix PXA/SA11x0 suspend resume crash 2005-06-19 18:39:33 +01:00
mach-rpc Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
mach-s3c2410 [PATCH] ARM: 2694/1: [s3c2410/dma] release irq properly to fix kernel oops 2005-06-03 20:52:26 +01:00
mach-sa1100 [PATCH] ARM SMP: Fix PXA/SA11x0 suspend resume crash 2005-06-19 18:39:33 +01:00
mach-shark Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
mach-versatile [PATCH] ARM: 2693/1: Add PCI support for Versatile/PB 2005-06-20 18:51:06 +01:00
mm [PATCH] Avoiding mmap fragmentation 2005-06-21 18:46:16 -07:00
nwfpe Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
oprofile Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
tools Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
vfp Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
Kconfig [PATCH] ARM: 2693/1: Add PCI support for Versatile/PB 2005-06-20 18:51:06 +01:00
Kconfig.debug Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
Makefile [PATCH] ARM: 2686/2: AAEC-2000 Core support 2005-06-20 18:51:05 +01:00