Revision d7831a0bdf06b9f722b947bb0c205ff7d77cebd8 authored by Richard Kennedy on 30 June 2009, 18:41:35 UTC, committed by Linus Torvalds on 01 July 2009, 01:56:01 UTC
balance_dirty_pages can overreact and move all of the dirty pages to
writeback unnecessarily.

balance_dirty_pages makes its decision to throttle based on the number of
dirty plus writeback pages that are over the calculated limit,so it will
continue to move pages even when there are plenty of pages in writeback
and less than the threshold still dirty.

This allows it to overshoot its limits and move all the dirty pages to
writeback while waiting for the drives to catch up and empty the writeback
list.

A simple fio test easily demonstrates this problem.

fio --name=f1 --directory=/disk1 --size=2G -rw=write --name=f2 --directory=/disk2 --size=1G --rw=write --startdelay=10

This is the simplest fix I could find, but I'm not entirely sure that it
alone will be enough for all cases.  But it certainly is an improvement on
my desktop machine writing to 2 disks.

Do we need something more for machines with large arrays where
bdi_threshold * number_of_drives is greater than the dirty_ratio ?

Signed-off-by: Richard Kennedy <richard@rsk.demon.co.uk>
Acked-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Jens Axboe <jens.axboe@oracle.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
1 parent df279ca
Raw File
Kconfig.kmemcheck
config HAVE_ARCH_KMEMCHECK
	bool

menuconfig KMEMCHECK
	bool "kmemcheck: trap use of uninitialized memory"
	depends on DEBUG_KERNEL
	depends on !X86_USE_3DNOW
	depends on SLUB || SLAB
	depends on !CC_OPTIMIZE_FOR_SIZE
	depends on !FUNCTION_TRACER
	select FRAME_POINTER
	select STACKTRACE
	default n
	help
	  This option enables tracing of dynamically allocated kernel memory
	  to see if memory is used before it has been given an initial value.
	  Be aware that this requires half of your memory for bookkeeping and
	  will insert extra code at *every* read and write to tracked memory
	  thus slow down the kernel code (but user code is unaffected).

	  The kernel may be started with kmemcheck=0 or kmemcheck=1 to disable
	  or enable kmemcheck at boot-time. If the kernel is started with
	  kmemcheck=0, the large memory and CPU overhead is not incurred.

choice
	prompt "kmemcheck: default mode at boot"
	depends on KMEMCHECK
	default KMEMCHECK_ONESHOT_BY_DEFAULT
	help
	  This option controls the default behaviour of kmemcheck when the
	  kernel boots and no kmemcheck= parameter is given.

config KMEMCHECK_DISABLED_BY_DEFAULT
	bool "disabled"
	depends on KMEMCHECK

config KMEMCHECK_ENABLED_BY_DEFAULT
	bool "enabled"
	depends on KMEMCHECK

config KMEMCHECK_ONESHOT_BY_DEFAULT
	bool "one-shot"
	depends on KMEMCHECK
	help
	  In one-shot mode, only the first error detected is reported before
	  kmemcheck is disabled.

endchoice

config KMEMCHECK_QUEUE_SIZE
	int "kmemcheck: error queue size"
	depends on KMEMCHECK
	default 64
	help
	  Select the maximum number of errors to store in the queue. Since
	  errors can occur virtually anywhere and in any context, we need a
	  temporary storage area which is guarantueed not to generate any
	  other faults. The queue will be emptied as soon as a tasklet may
	  be scheduled. If the queue is full, new error reports will be
	  lost.

config KMEMCHECK_SHADOW_COPY_SHIFT
	int "kmemcheck: shadow copy size (5 => 32 bytes, 6 => 64 bytes)"
	depends on KMEMCHECK
	range 2 8
	default 5
	help
	  Select the number of shadow bytes to save along with each entry of
	  the queue. These bytes indicate what parts of an allocation are
	  initialized, uninitialized, etc. and will be displayed when an
	  error is detected to help the debugging of a particular problem.

config KMEMCHECK_PARTIAL_OK
	bool "kmemcheck: allow partially uninitialized memory"
	depends on KMEMCHECK
	default y
	help
	  This option works around certain GCC optimizations that produce
	  32-bit reads from 16-bit variables where the upper 16 bits are
	  thrown away afterwards. This may of course also hide some real
	  bugs.

config KMEMCHECK_BITOPS_OK
	bool "kmemcheck: allow bit-field manipulation"
	depends on KMEMCHECK
	default n
	help
	  This option silences warnings that would be generated for bit-field
	  accesses where not all the bits are initialized at the same time.
	  This may also hide some real bugs.

back to top