1
linux/fs/ocfs2
Nick Piggin fa0d7e3de6 fs: icache RCU free inodes
RCU free the struct inode. This will allow:

- Subsequent store-free path walking patch. The inode must be consulted for
  permissions when walking, so an RCU inode reference is a must.
- sb_inode_list_lock to be moved inside i_lock because sb list walkers who want
  to take i_lock no longer need to take sb_inode_list_lock to walk the list in
  the first place. This will simplify and optimize locking.
- Could remove some nested trylock loops in dcache code
- Could potentially simplify things a bit in VM land. Do not need to take the
  page lock to follow page->mapping.

The downsides of this is the performance cost of using RCU. In a simple
creat/unlink microbenchmark, performance drops by about 10% due to inability to
reuse cache-hot slab objects. As iterations increase and RCU freeing starts
kicking over, this increases to about 20%.

In cases where inode lifetimes are longer (ie. many inodes may be allocated
during the average life span of a single inode), a lot of this cache reuse is
not applicable, so the regression caused by this patch is smaller.

The cache-hot regression could largely be avoided by using SLAB_DESTROY_BY_RCU,
however this adds some complexity to list walking and store-free path walking,
so I prefer to implement this at a later date, if it is shown to be a win in
real situations. I haven't found a regression in any non-micro benchmark so I
doubt it will be a problem.

Signed-off-by: Nick Piggin <npiggin@kernel.dk>
2011-01-07 17:50:26 +11:00
..
cluster Merge branch 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jlbec/ocfs2 2010-12-23 16:36:48 -08:00
dlm Merge branch 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jlbec/ocfs2 2010-12-23 16:36:48 -08:00
dlmfs fs: icache RCU free inodes 2011-01-07 17:50:26 +11:00
acl.c ocfs2: update ctime when changing the file's permission by setfacl 2010-09-23 14:16:21 -07:00
acl.h
alloc.c ocfs2: Fix deadlock when allocating page 2010-09-08 14:25:57 +08:00
alloc.h
aops.c Ocfs2: Teach 'coherency=full' O_DIRECT writes to correctly up_read i_alloc_sem. 2010-12-09 15:36:48 -08:00
aops.h Ocfs2: Teach 'coherency=full' O_DIRECT writes to correctly up_read i_alloc_sem. 2010-12-09 15:36:48 -08:00
blockcheck.c ocfs2: Fix metaecc error messages 2010-09-08 14:25:53 +08:00
blockcheck.h
buffer_head_io.c
buffer_head_io.h
dcache.c fs: dcache rationalise dget variants 2011-01-07 17:50:24 +11:00
dcache.h Track negative entries v3 2010-09-10 09:18:15 -07:00
dir.c ocfs2: Hold ip_lock when set/clear flags for indexed dir. 2010-12-16 00:36:15 -08:00
dir.h
dlmglue.c Track negative entries v3 2010-09-10 09:18:15 -07:00
dlmglue.h ocfs2: Fix lockdep warning in reflink. 2010-09-10 09:19:06 -07:00
export.c
export.h
extent_map.c
extent_map.h
file.c Ocfs2: Teach 'coherency=full' O_DIRECT writes to correctly up_read i_alloc_sem. 2010-12-09 15:36:48 -08:00
file.h ocfs2: Zero the tail cluster when extending past i_size. 2010-07-08 13:25:35 -07:00
heartbeat.c
heartbeat.h
inode.c Track negative entries v3 2010-09-10 09:18:15 -07:00
inode.h Track negative entries v3 2010-09-10 09:18:15 -07:00
ioctl.c Ocfs2: Add new OCFS2_IOC_INFO ioctl for ocfs2 v8. 2010-09-10 08:35:41 -07:00
ioctl.h
journal.c ocfs2: Remove obsolete comments before ocfs2_start_trans. 2010-09-10 08:40:18 -07:00
journal.h Reorganize data elements to reduce struct sizes 2010-09-10 08:39:27 -07:00
Kconfig
localalloc.c
localalloc.h
locks.c
locks.h
Makefile
mmap.c Merge branch 'cow_readahead' of git://oss.oracle.com/git/tma/linux-2.6 into merge-2 2010-09-10 08:41:04 -07:00
mmap.h
namei.c new helper: ihold() 2010-10-25 21:26:11 -04:00
namei.h
ocfs1_fs_compat.h
ocfs2_fs.h ocfs2: Fix system inodes cache overflow. 2010-12-22 02:35:36 -08:00
ocfs2_ioctl.h Merge branch 'globalheartbeat-2' of git://oss.oracle.com/git/smushran/linux-2.6 into ocfs2-merge-window 2010-10-15 13:03:09 -07:00
ocfs2_lockid.h
ocfs2_lockingver.h
ocfs2.h ocfs2: char is not always signed 2010-11-18 14:10:56 -08:00
quota_global.c ocfs2: Zero the tail cluster when extending past i_size. 2010-07-08 13:25:35 -07:00
quota_local.c ocfs2: Zero the tail cluster when extending past i_size. 2010-07-08 13:25:35 -07:00
quota.h
refcounttree.c Merge branch 'globalheartbeat-2' of git://oss.oracle.com/git/smushran/linux-2.6 into ocfs2-merge-window 2010-10-15 13:03:09 -07:00
refcounttree.h Merge branch 'cow_readahead' of git://oss.oracle.com/git/tma/linux-2.6 into merge-2 2010-09-10 08:41:04 -07:00
reservations.c ocfs2: Move 'wanted' into parens of ocfs2_resmap_resv_bits. 2010-09-23 14:16:47 -07:00
reservations.h
resize.c
resize.h
slot_map.c When I tried to compile I got the following warning: 2010-10-11 13:45:52 -07:00
slot_map.h
stack_o2cb.c ocfs2: Print message if user mounts without starting global heartbeat 2010-10-06 17:55:29 -07:00
stack_user.c ocfs2_connection_find() returns pointer to bad structure 2010-11-18 15:41:41 -08:00
stackglue.c
stackglue.h
suballoc.c Merge branch 'globalheartbeat-2' of git://oss.oracle.com/git/smushran/linux-2.6 into ocfs2-merge-window 2010-10-15 13:03:09 -07:00
suballoc.h ocfs2: allow return of new inode block location before allocation of the inode 2010-09-08 14:25:59 +08:00
super.c fs: icache RCU free inodes 2011-01-07 17:50:26 +11:00
super.h
symlink.c ocfs2: Don't walk off the end of fast symlinks. 2010-09-29 17:33:05 -07:00
symlink.h
sysfile.c ocfs2: Cache system inodes of other slots. 2010-09-10 08:56:24 -07:00
sysfile.h
uptodate.c
uptodate.h
ver.c
ver.h
xattr.c ocfs2: Avoid to evaluate xattr block flags again. 2010-10-15 13:03:43 -07:00
xattr.h