remarkable-linux/fs/btrfs
Chris Mason b4ce94de9b Btrfs: Change btree locking to use explicit blocking points
Most of the btrfs metadata operations can be protected by a spinlock,
but some operations still need to schedule.

So far, btrfs has been using a mutex along with a trylock loop,
most of the time it is able to avoid going for the full mutex, so
the trylock loop is a big performance gain.

This commit is step one for getting rid of the blocking locks entirely.
btrfs_tree_lock takes a spinlock, and the code explicitly switches
to a blocking lock when it starts an operation that can schedule.

We'll be able get rid of the blocking locks in smaller pieces over time.
Tracing allows us to find the most common cause of blocking, so we
can start with the hot spots first.

The basic idea is:

btrfs_tree_lock() returns with the spin lock held

btrfs_set_lock_blocking() sets the EXTENT_BUFFER_BLOCKING bit in
the extent buffer flags, and then drops the spin lock.  The buffer is
still considered locked by all of the btrfs code.

If btrfs_tree_lock gets the spinlock but finds the blocking bit set, it drops
the spin lock and waits on a wait queue for the blocking bit to go away.

Much of the code that needs to set the blocking bit finishes without actually
blocking a good percentage of the time.  So, an adaptive spin is still
used against the blocking bit to avoid very high context switch rates.

btrfs_clear_lock_blocking() clears the blocking bit and returns
with the spinlock held again.

btrfs_tree_unlock() can be called on either blocking or spinning locks,
it does the right thing based on the blocking bit.

ctree.c has a helper function to set/clear all the locked buffers in a
path as blocking.

Signed-off-by: Chris Mason <chris.mason@oracle.com>
2009-02-04 09:25:08 -05:00
..
acl.c Btrfs: Fix checkpatch.pl warnings 2009-01-05 21:25:51 -05:00
async-thread.c Btrfs: async threads should try harder to find work 2009-02-04 09:23:24 -05:00
async-thread.h Btrfs: Add ordered async work queues 2008-11-06 22:03:00 -05:00
btrfs_inode.h Btrfs: fix leaking block group on balance 2008-12-11 16:30:39 -05:00
compat.h Btrfs: drop remaining LINUX_KERNEL_VERSION checks and compat code 2009-01-06 09:38:55 -05:00
compression.c Btrfs: removed unused #include <version.h>'s 2009-01-21 10:49:16 -05:00
compression.h Btrfs: Add zlib compression support 2008-10-29 14:49:59 -04:00
crc32c.h Btrfs: Drop the hardware crc32c asm code 2009-01-07 19:56:59 -05:00
ctree.c Btrfs: Change btree locking to use explicit blocking points 2009-02-04 09:25:08 -05:00
ctree.h Btrfs: Change btree locking to use explicit blocking points 2009-02-04 09:25:08 -05:00
dir-item.c Btrfs: Fix checkpatch.pl warnings 2009-01-05 21:25:51 -05:00
disk-io.c Btrfs: Change btree locking to use explicit blocking points 2009-02-04 09:25:08 -05:00
disk-io.h Btrfs: fix tree logs parallel sync 2009-01-21 12:54:03 -05:00
export.c Btrfs: Fix checkpatch.pl warnings 2009-01-05 21:25:51 -05:00
export.h NFS support for btrfs - v3 2008-09-25 11:04:06 -04:00
extent-tree.c Btrfs: Change btree locking to use explicit blocking points 2009-02-04 09:25:08 -05:00
extent_io.c Btrfs: Change btree locking to use explicit blocking points 2009-02-04 09:25:08 -05:00
extent_io.h Btrfs: Change btree locking to use explicit blocking points 2009-02-04 09:25:08 -05:00
extent_map.c Btrfs: removed unused #include <version.h>'s 2009-01-21 10:49:16 -05:00
extent_map.h Btrfs: Fix csum error for compressed data 2008-11-10 07:34:43 -05:00
file-item.c Btrfs: tree logging checksum fixes 2009-01-06 11:42:00 -05:00
file.c Btrfs: fix tree logs parallel sync 2009-01-21 12:54:03 -05:00
free-space-cache.c Btrfs: Fix checkpatch.pl warnings 2009-01-05 21:25:51 -05:00
hash.h Switch btrfs_name_hash() to crc32c 2008-09-25 11:04:06 -04:00
inode-item.c Btrfs: make things static and include the right headers 2008-12-02 09:54:17 -05:00
inode-map.c Btrfs: Fix checkpatch.pl warnings 2009-01-05 21:25:51 -05:00
inode.c Btrfs: Change btree locking to use explicit blocking points 2009-02-04 09:25:08 -05:00
ioctl.c Btrfs: removed unused #include <version.h>'s 2009-01-21 10:49:16 -05:00
ioctl.h Btrfs: fix ioctl arg size (userland incompatible change!) 2009-01-16 11:59:08 -05:00
Kconfig Btrfs: make btrfs acls selectable 2009-02-04 09:28:28 -05:00
locking.c Btrfs: Change btree locking to use explicit blocking points 2009-02-04 09:25:08 -05:00
locking.h Btrfs: Change btree locking to use explicit blocking points 2009-02-04 09:25:08 -05:00
Makefile Btrfs: Add zlib compression support 2008-10-29 14:49:59 -04:00
ordered-data.c Btrfs: simplify iteration codes 2009-01-21 10:59:08 -05:00
ordered-data.h Btrfs: move data checksumming into a dedicated tree 2008-12-08 16:58:54 -05:00
orphan.c Btrfs: Create orphan inode records to prevent lost files after a crash 2008-09-25 11:04:05 -04:00
print-tree.c Btrfs: Fix checkpatch.pl warnings 2009-01-05 21:25:51 -05:00
print-tree.h Btrfs: Create extent_buffer interface for large blocksizes 2008-09-25 11:03:56 -04:00
ref-cache.c Btrfs: Fix checkpatch.pl warnings 2009-01-05 21:25:51 -05:00
ref-cache.h Btrfs: add and improve comments 2008-09-29 15:18:18 -04:00
root-tree.c Btrfs: Fix checkpatch.pl warnings 2009-01-05 21:25:51 -05:00
struct-funcs.c Btrfs: Fix checkpatch.pl warnings 2009-01-05 21:25:51 -05:00
super.c Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/mason/btrfs-unstable 2009-01-28 20:29:43 -05:00
sysfs.c Btrfs: Fix checkpatch.pl warnings 2009-01-05 21:25:51 -05:00
transaction.c Btrfs: simplify iteration codes 2009-01-21 10:59:08 -05:00
transaction.h Btrfs: Fix checkpatch.pl warnings 2009-01-05 21:25:51 -05:00
tree-defrag.c Btrfs: Change btree locking to use explicit blocking points 2009-02-04 09:25:08 -05:00
tree-log.c Btrfs: Change btree locking to use explicit blocking points 2009-02-04 09:25:08 -05:00
tree-log.h Btrfs: Add a write ahead tree log to optimize synchronous operations 2008-09-25 11:04:07 -04:00
version.h Update Btrfs files for in-kernel usage 2008-09-25 15:41:59 -04:00
version.sh Btrfs: Fixes for 2.6.28-rc API changes 2008-11-19 21:17:22 -05:00
volumes.c Btrfs: Catch missed bios in the async bio submission thread 2009-02-04 09:19:41 -05:00
volumes.h Btrfs: shared seed device 2008-12-12 10:03:26 -05:00
xattr.c Btrfs: selinux support 2009-02-04 09:29:13 -05:00
xattr.h Btrfs: selinux support 2009-02-04 09:29:13 -05:00
zlib.c Btrfs: Fix checkpatch.pl warnings 2009-01-05 21:25:51 -05:00