Btrfs: avoid IO stalls behind congested devices in a multi-device FS
authorChris Mason <chris.mason@oracle.com>
Tue, 9 Jun 2009 19:59:22 +0000 (15:59 -0400)
committerChris Mason <chris.mason@oracle.com>
Wed, 10 Jun 2009 15:29:49 +0000 (11:29 -0400)
commitd644d8a1e30b88a93bcfb63cada2ae628462ddba
tree0037b0282390f5bced029d0a2973e5a03777ca12
parentd84275c938e1a5e2dc5b89eb9b878e0ddb2c55e0
Btrfs: avoid IO stalls behind congested devices in a multi-device FS

The btrfs IO submission threads try to service a bunch of devices with a small
number of threads.  They do a congestion check to try and avoid waiting
on requests for a busy device.

The checks make sure we've sent a few requests down to a given device just so
that we aren't bouncing between busy devices without actually sending down
any IO.  The counter used to decide if we can switch to the next device
is somewhat overloaded.  It is also being used to decide if we've done
a good batch of requests between the WRITE_SYNC or regular priority lists.
It may get reset to zero often, leaving us hammering on a busy device
instead of moving on to another disk.

This commit adds a new counter for the number of bios sent while
servicing a device.  It doesn't get reset or fiddled with.  On
multi-device filesystems, this fixes IO stalls in streaming
write workloads.

Signed-off-by: Chris Mason <chris.mason@oracle.com>
fs/btrfs/volumes.c