linux/arch
Dave Hansen 45221ab668 KVM: create aggregate kvm_total_used_mmu_pages value
Of slab shrinkers, the VM code says:

 * Note that 'shrink' will be passed nr_to_scan == 0 when the VM is
 * querying the cache size, so a fastpath for that case is appropriate.

and it *means* it.  Look at how it calls the shrinkers:

    nr_before = (*shrinker->shrink)(0, gfp_mask);
    shrink_ret = (*shrinker->shrink)(this_scan, gfp_mask);

So, if you do anything stupid in your shrinker, the VM will doubly
punish you.

The mmu_shrink() function takes the global kvm_lock, then acquires
every VM's kvm->mmu_lock in sequence.  If we have 100 VMs, then
we're going to take 101 locks.  We do it twice, so each call takes
202 locks.  If we're under memory pressure, we can have each cpu
trying to do this.  It can get really hairy, and we've seen lock
spinning in mmu_shrink() be the dominant entry in profiles.

This is guaranteed to optimize at least half of those lock
aquisitions away.  It removes the need to take any of the locks
when simply trying to count objects.

A 'percpu_counter' can be a large object, but we only have one
of these for the entire system.  There are not any better
alternatives at the moment, especially ones that handle CPU
hotplug.

Signed-off-by: Dave Hansen <dave@linux.vnet.ibm.com>
Signed-off-by: Tim Pepper <lnxninja@linux.vnet.ibm.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
2010-10-24 10:51:19 +02:00
..
alpha Fix up more fallout form alpha signal cleanups 2010-09-30 08:37:38 -07:00
arm Merge master.kernel.org:/home/rmk/linux-2.6-arm 2010-10-13 16:35:33 -07:00
avr32 modules: Fix module_bug_list list corruption race 2010-10-05 11:29:27 -07:00
blackfin Blackfin: bf52x/bf54x boards: drop unused nand page size 2010-08-27 16:08:43 -04:00
cris Make do_execve() take a const filename pointer 2010-08-17 18:07:43 -07:00
frv frv: double syscall restarts, syscall restart in sigreturn() 2010-09-20 10:44:38 -07:00
h8300 modules: Fix module_bug_list list corruption race 2010-10-05 11:29:27 -07:00
ia64 Merge branch 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/aegl/linux-2.6 2010-09-16 12:58:44 -07:00
m32r m32r: test __LITTLE_ENDIAN__ instead of __LITTLE_ENDIAN 2010-10-15 19:37:50 -07:00
m68k arch/m68k/mac/macboing.c: use unsigned long for irqflags 2010-10-01 10:50:58 -07:00
m68knommu m68k,m68knommu: Wire up fanotify_init, fanotify_mark, and prlimit64 2010-09-13 20:28:45 +02:00
microblaze Merge branch 'merge-devicetree' of git://git.secretlab.ca/git/linux-2.6 2010-08-18 09:26:17 -07:00
mips Merge branch 'upstream' of git://git.linux-mips.org/pub/scm/upstream-linus 2010-10-18 13:10:36 -07:00
mn10300 modules: Fix module_bug_list list corruption race 2010-10-05 11:29:27 -07:00
parisc modules: Fix module_bug_list list corruption race 2010-10-05 11:29:27 -07:00
powerpc KVM: PPC: fix leakage of error page in kvmppc_patch_dcbz() 2010-10-24 10:51:05 +02:00
s390 modules: Fix module_bug_list list corruption race 2010-10-05 11:29:27 -07:00
score Make do_execve() take a const filename pointer 2010-08-17 18:07:43 -07:00
sh modules: Fix module_bug_list list corruption race 2010-10-05 11:29:27 -07:00
sparc Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-2.6 2010-09-22 12:09:46 -07:00
tile Merge branch 'stable' of git://git.kernel.org/pub/scm/linux/kernel/git/cmetcalf/linux-tile 2010-09-24 19:08:39 -07:00
um uml: fix build 2010-10-15 14:42:24 -07:00
x86 KVM: create aggregate kvm_total_used_mmu_pages value 2010-10-24 10:51:19 +02:00
xtensa Make do_execve() take a const filename pointer 2010-08-17 18:07:43 -07:00
.gitignore
Kconfig kprobes: Fix Kconfig dependency 2010-09-13 20:41:31 +02:00