linux/arch/ia64/kernel
Nick Piggin b3e19d924b fs: scale mntget/mntput
The problem that this patch aims to fix is vfsmount refcounting scalability.
We need to take a reference on the vfsmount for every successful path lookup,
which often go to the same mount point.

The fundamental difficulty is that a "simple" reference count can never be made
scalable, because any time a reference is dropped, we must check whether that
was the last reference. To do that requires communication with all other CPUs
that may have taken a reference count.

We can make refcounts more scalable in a couple of ways, involving keeping
distributed counters, and checking for the global-zero condition less
frequently.

- check the global sum once every interval (this will delay zero detection
  for some interval, so it's probably a showstopper for vfsmounts).

- keep a local count and only taking the global sum when local reaches 0 (this
  is difficult for vfsmounts, because we can't hold preempt off for the life of
  a reference, so a counter would need to be per-thread or tied strongly to a
  particular CPU which requires more locking).

- keep a local difference of increments and decrements, which allows us to sum
  the total difference and hence find the refcount when summing all CPUs. Then,
  keep a single integer "long" refcount for slow and long lasting references,
  and only take the global sum of local counters when the long refcount is 0.

This last scheme is what I implemented here. Attached mounts and process root
and working directory references are "long" references, and everything else is
a short reference.

This allows scalable vfsmount references during path walking over mounted
subtrees and unattached (lazy umounted) mounts with processes still running
in them.

This results in one fewer atomic op in the fastpath: mntget is now just a
per-CPU inc, rather than an atomic inc; and mntput just requires a spinlock
and non-atomic decrement in the common case. However code is otherwise bigger
and heavier, so single threaded performance is basically a wash.

Signed-off-by: Nick Piggin <npiggin@kernel.dk>
2011-01-07 17:50:33 +11:00
..
cpufreq [IA64] Use set_cpus_allowed_ptr 2010-05-18 14:45:53 -07:00
.gitignore [IA64] Cleanup generated file not ignored by .gitignore 2008-08-04 11:06:16 -07:00
Makefile [IA64] Add CONFIG_STACKTRACE_SUPPORT 2010-09-23 13:52:07 -07:00
Makefile.gate Rename .data.gate to .data..gate. 2010-03-03 11:25:59 +01:00
acpi-ext.c include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h 2010-03-30 22:02:32 +09:00
acpi.c x86, acpi/irq: Introduce apci_isa_irq_to_gsi 2010-05-04 13:34:23 -07:00
asm-offsets.c ia64/pv_ops/xen: paravirtualize read/write ar.itc and ar.itm 2009-03-26 10:50:32 -07:00
audit.c [IA64] Remove COMPAT_IA32 support 2010-02-08 10:42:17 -08:00
brl_emu.c
crash.c sysctl: Drop & in front of every proc_handler. 2009-11-18 08:37:40 -08:00
crash_dump.c kdump: make elfcorehdr_addr independent of CONFIG_PROC_VMCORE 2008-10-20 08:52:39 -07:00
cyclone.c [IA64] Fix missing iounmap in error path in cyclone.c 2010-09-23 14:32:09 -07:00
dma-mapping.c [IA64] Fix warning in dma-mapping.c 2009-09-02 09:12:21 -07:00
efi.c include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h 2010-03-30 22:02:32 +09:00
efi_stub.S
elfcore.c elf coredump: add extended numbering support 2010-03-06 11:26:46 -08:00
entry.S [IA64] Add latest crop of syscalls 2010-08-13 20:55:51 -07:00
entry.h
err_inject.c sysdev: Pass the attribute to the low level sysdev show/store function 2008-07-21 21:55:02 -07:00
esi.c tree-wide: fix assorted typos all over the place 2009-12-04 15:39:55 +01:00
esi_stub.S
fsys.S [IA64] Optimize ticket spinlocks in fsys_rt_sigprocmask 2010-09-15 15:35:48 -07:00
fsyscall_gtod_data.h
ftrace.c ftrace, ia64: IA64 dynamic ftrace support 2009-01-14 12:11:31 +01:00
gate-data.S Rename .data.gate to .data..gate. 2010-03-03 11:25:59 +01:00
gate.S Rename .data..patch.XXX to .data..patch.XXX. 2010-03-03 11:25:59 +01:00
gate.lds.S Rename .data..patch.XXX to .data..patch.XXX. 2010-03-03 11:25:59 +01:00
head.S percpu: make percpu symbols in ia64 unique 2009-10-29 22:34:14 +09:00
ia64_ksyms.c percpu: remove per_cpu__ prefix. 2009-10-29 22:34:15 +09:00
init_task.c Rename .data.init_task to .data..init_task. 2010-03-03 11:25:58 +01:00
iosapic.c Merge branches 'release', 'drop_do_IRQ', 'fix_early_irq', 'misc-2.6.37', 'next-fixes', 'optimize-unwind', 'remove-compat-h' and 'stack_trace' into release 2010-10-12 15:06:59 -07:00
irq.c genirq: Convert irq_desc.lock to raw_spinlock 2009-12-14 23:55:33 +01:00
irq_ia64.c Merge branches 'release', 'drop_do_IRQ', 'fix_early_irq', 'misc-2.6.37', 'next-fixes', 'optimize-unwind', 'remove-compat-h' and 'stack_trace' into release 2010-10-12 15:06:59 -07:00
irq_lsapic.c [IA64] remove obsolete hw_interrupt_type 2009-06-15 14:35:10 -07:00
ivt.S Merge branch 'for-35' of git://repo.or.cz/linux-kbuild 2010-06-01 08:55:52 -07:00
jprobes.S [IA64] Move include/asm-ia64 to arch/ia64/include/asm 2008-08-01 10:21:21 -07:00
kprobes.c kprobes: Disable booster when CONFIG_PREEMPT=y 2010-02-04 09:36:18 +01:00
machine_kexec.c [IA64] kexec: Unregister MCA handler before kexec 2009-09-14 16:18:17 -07:00
machvec.c x86, ia64: convert to use generic dma_map_ops struct 2009-01-06 14:06:57 +01:00
mca.c [IA64] Cannot use register_percpu_irq() from ia64_mca_init() 2010-10-07 16:23:34 -07:00
mca_asm.S percpu: make percpu symbols in ia64 unique 2009-10-29 22:34:14 +09:00
mca_drv.c include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h 2010-03-30 22:02:32 +09:00
mca_drv.h
mca_drv_asm.S
minstate.h Rename .data..patch.XXX to .data..patch.XXX. 2010-03-03 11:25:59 +01:00
module.c [IA64] Convert ia64 to use int-ll64.h 2009-06-17 09:33:49 -07:00
msi_ia64.c dmar: Convert to new irq chip functions 2010-10-12 16:53:37 +02:00
nr-irqs.c ia64/pv_ops/xen: define the nubmer of irqs which xen needs. 2008-10-17 10:06:59 -07:00
numa.c
pal.S
palinfo.c [IA64] Use static const char * const in palinfo.c 2010-09-23 14:22:05 -07:00
paravirt.c ia64: remove some warnings. 2009-03-27 11:11:04 -07:00
paravirt_inst.h ia64/pv_ops: paravirtualized instruction checker. 2008-10-17 10:12:54 -07:00
paravirt_patch.c ia64/pv_op/binarypatch: add helper functions to support binary patching for paravirt_ops. 2009-03-26 11:02:31 -07:00
paravirt_patchlist.c [IA64] Fix build error in paravirt_patchlist.c 2009-06-17 09:04:40 -07:00
paravirt_patchlist.h ia64/pv_ops: gate page paravirtualization. 2009-03-26 10:51:02 -07:00
paravirtentry.S Rename .data.read_mostly to .data..read_mostly. 2010-03-03 11:26:00 +01:00
patch.c ia64: remove some warnings. 2009-03-27 11:11:04 -07:00
pci-dma.c Bug Fix arch/ia64/kernel/pci-dma.c: fix recursive dma_supported() call in iommu_dma_supported() 2009-08-11 14:52:10 -07:00
pci-swiotlb.c ia64: remove unnecessary sync_single_range_* in swiotlb_dma_ops 2010-05-27 09:12:52 -07:00
perfmon.c fs: scale mntget/mntput 2011-01-07 17:50:33 +11:00
perfmon_default_smpl.c
perfmon_generic.h
perfmon_itanium.h
perfmon_mckinley.h
perfmon_montecito.h
process.c Make do_execve() take a const filename pointer 2010-08-17 18:07:43 -07:00
ptrace.c ptrace: change signature of arch_ptrace() 2010-10-27 18:03:10 -07:00
relocate_kernel.S percpu: make percpu symbols in ia64 unique 2009-10-29 22:34:14 +09:00
sal.c [IA64] Update check_sal_cache_flush to use platform_send_ipi() 2008-06-11 16:40:33 -07:00
salinfo.c Merge branch 'llseek' of git://git.kernel.org/pub/scm/linux/kernel/git/arnd/bkl 2010-10-22 10:52:56 -07:00
setup.c [IA64] Initialize interrupts later (from init_IRQ()) 2010-10-05 15:41:25 -07:00
sigframe.h
signal.c [IA64] Remove COMPAT_IA32 support 2010-02-08 10:42:17 -08:00
smp.c ia64: convert last user of smp_call_function_mask 2009-09-24 09:34:40 +09:30
smpboot.c x86, ia64, smp: use workqueues unconditionally during do_boot_cpu() 2010-08-09 20:45:06 -07:00
stacktrace.c [IA64] Add CONFIG_STACKTRACE_SUPPORT 2010-09-23 13:52:07 -07:00
sys_ia64.c Get rid of open-coding in ia64_brk() 2009-12-11 06:44:58 -05:00
time.c timkeeping: Fix update_vsyscall to provide wall_to_monotonic offset 2010-07-27 12:40:54 +02:00
topology.c [IA64] Use set_cpus_allowed_ptr 2010-05-18 14:45:53 -07:00
traps.c [IA64] Remove COMPAT_IA32 support 2010-02-08 10:42:17 -08:00
unaligned.c [IA64] use __ratelimit 2010-05-18 14:45:54 -07:00
uncached.c include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h 2010-03-30 22:02:32 +09:00
unwind.c [IA64] unwind - optimise linked-list searches for modules 2010-09-14 13:35:39 -07:00
unwind_decoder.c
unwind_i.h
vmlinux.lds.S [IA64] beautify vmlinux.lds.h 2010-06-21 15:08:44 -07:00