[PATCH] inotify: lock avoidance with parent watch status in dentry
authorNick Piggin <nickpiggin@yahoo.com.au>
Sat, 25 Mar 2006 11:07:09 +0000 (03:07 -0800)
committerLinus Torvalds <torvalds@g5.osdl.org>
Sat, 25 Mar 2006 16:22:53 +0000 (08:22 -0800)
commitc32ccd87bfd1414b0aabfcd8dbc7539ad23bcbaa
tree612dc637976cbe36e8b72924a1f7bd76e75463fd
parentbf36b9011e3c5b2739f9da2f6de8a6fa3edded32
[PATCH] inotify: lock avoidance with parent watch status in dentry

Previous inotify work avoidance is good when inotify is completely unused,
but it breaks down if even a single watch is in place anywhere in the
system.  Robin Holt notices that udev is one such culprit - it slows down a
512-thread application on a 512 CPU system from 6 seconds to 22 minutes.

Solve this by adding a flag in the dentry that tells inotify whether or not
its parent inode has a watch on it.  Event queueing to parent will skip
taking locks if this flag is cleared.  Setting and clearing of this flag on
all child dentries versus event delivery: this is no in terms of race
cases, and that was shown to be equivalent to always performing the check.

The essential behaviour is that activity occuring _after_ a watch has been
added and _before_ it has been removed, will generate events.

Signed-off-by: Nick Piggin <npiggin@suse.de>
Cc: Robert Love <rml@novell.com>
Cc: John McCutchan <ttb@tentacle.dhs.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
fs/dcache.c
fs/inotify.c
include/linux/dcache.h
include/linux/fsnotify.h
include/linux/inotify.h