linux/drivers
Shaohua Li b17459c050 raid5: add a per-stripe lock
Add a per-stripe lock to protect stripe specific data. The purpose is to reduce
lock contention of conf->device_lock.

stripe ->toread, ->towrite are protected by per-stripe lock.  Accessing bio
list of the stripe is always serialized by this lock, so adding bio to the
lists (add_stripe_bio()) and removing bio from the lists (like
ops_run_biofill()) not race.

If bio in ->read, ->written ... list are not shared by multiple stripes, we
don't need any lock to protect ->read, ->written, because STRIPE_ACTIVE will
protect them. If the bio are shared,  there are two protections:
1. bi_phys_segments acts as a reference count
2. traverse the list uses r5_next_bio, which makes traverse never access bio
not belonging to the stripe

Let's have an example:
|  stripe1 |  stripe2    |  stripe3  |
...bio1......|bio2|bio3|....bio4.....

stripe2 has 4 bios, when it's finished, it will decrement bi_phys_segments for
all bios, but only end_bio for bio2 and bio3. bio1->bi_next still points to
bio2, but this doesn't matter. When stripe1 is finished, it will not touch bio2
because of r5_next_bio check. Next time stripe1 will end_bio for bio1 and
stripe3 will end_bio bio4.

before add_stripe_bio() addes a bio to a stripe, we already increament the bio
bi_phys_segments, so don't worry other stripes release the bio.

Signed-off-by: Shaohua Li <shli@fusionio.com>
Signed-off-by: NeilBrown <neilb@suse.de>
2012-07-19 16:01:31 +10:00
..
accessibility
acpi Merge branch 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux 2012-07-14 12:44:26 -07:00
amba
ata Viresh has moved 2012-06-20 14:39:36 -07:00
atm
auxdisplay
base PM / Sleep: Prevent waiting forever on asynchronous suspend after abort 2012-06-24 23:31:09 +02:00
bcma bcma: fix null pointer in bcma_core_pci_irq_ctl 2012-06-08 13:47:07 -04:00
block blk: fix wrong idr_pre_get() error check in loop.c 2012-07-14 15:39:58 -07:00
bluetooth Bluetooth: btmrvl: Do not send vendor events to bluetooth stack 2012-06-19 00:19:11 -03:00
cdrom
char Merge git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6 2012-06-18 12:20:36 -07:00
clk clk: fix parent validation in __clk_set_parent() 2012-07-03 12:05:14 -07:00
clocksource clocksource: sh_tmu: Use clockevents_config_and_register(). 2012-06-11 17:10:16 +09:00
connector
cpufreq
cpuidle
crypto
dca
devfreq
dio
dma Merge branch 'fixes' of git://git.infradead.org/users/vkoul/slave-dma 2012-06-20 22:12:52 -07:00
edac edac: Do alignment logic properly in edac_align_ptr() 2012-06-11 12:43:16 -03:00
eisa
extcon extcon: max8997: Add missing kfree for info->edev in max8997_muic_remove() 2012-06-18 16:30:42 -07:00
firewire
firmware
gpio gpio/gpio-tps65910: gpio_chip.of_node referenced without CONFIG_OF_GPIO defined 2012-07-10 22:53:31 +02:00
gpu drm/i915: kick any firmware framebuffers before claiming the gtt 2012-07-03 11:18:48 +01:00
hid Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input 2012-07-13 10:33:18 -07:00
hsi
hv
hwmon hwmon: (it87) Preserve configuration register bits on init 2012-07-12 22:47:37 +02:00
hwspinlock hwspinlock/core: use global ID to register hwspinlocks on multiple devices 2012-07-07 22:35:30 +03:00
i2c i2c: Add generic I2C multiplexer using pinctrl API 2012-06-04 16:49:43 +02:00
ide drivers/ide/ide-cs.c: adjust suspicious bit operation 2012-06-12 15:51:41 -07:00
idle
ieee802154
iio iio: drop wrong reference from Kconfig 2012-06-14 17:28:46 -07:00
infiniband Merge branches 'cma' and 'ocrdma' into for-linus 2012-06-24 04:59:59 -07:00
input Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input 2012-07-13 10:33:18 -07:00
iommu iommu/amd: fix type bug in flush code 2012-07-02 12:11:40 +02:00
isdn
leds leds: heartbeat: fix bug on panic 2012-07-04 15:55:19 +08:00
lguest
macintosh
md raid5: add a per-stripe lock 2012-07-19 16:01:31 +10:00
media Merge branch 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media 2012-07-13 10:29:41 -07:00
memory
memstick
message Merge branch 'akpm' (Andrew's patch-bomb) 2012-05-31 18:10:18 -07:00
mfd mfd: Add missing hunk to change palmas irq to clear on read 2012-07-09 00:16:26 +02:00
misc Merge branch 'akpm' (Andrew's patch-bomb) 2012-07-11 16:06:54 -07:00
mmc mmc: cd-gpio: pass IRQF_ONESHOT to request_threaded_irq() 2012-07-10 23:03:57 -04:00
mtd Late MTD fixes for 3.5: 2012-07-13 09:56:26 -07:00
net e1000e: remove use of IP payload checksum 2012-07-01 00:25:32 -07:00
nfc
nubus
of ARM: SoC fixes for 3.5-rc 2012-07-11 12:44:25 -07:00
oprofile oprofile: perf: use NR_CPUS instead or nr_cpumask_bits for static array 2012-06-21 16:15:11 +02:00
parisc
parport
pci PCI: EHCI: fix crash during suspend on ASUS computers 2012-07-10 09:52:05 -07:00
pcmcia
pinctrl Merge branch 'akpm' (Andrew's patch-bomb) 2012-06-20 14:41:57 -07:00
platform drivers/platform/x86/acerhdf.c: correct Boris' mail address 2012-06-07 14:43:55 -07:00
pnp
power A bunch of fixes for v3.5, nothing extraordinary. 2012-05-31 12:10:15 -07:00
pps
ps3
ptp
rapidio rapidio/tsi721: add DMA engine support 2012-05-31 17:49:31 -07:00
regulator regulator: Fix recursive mutex lockdep warning 2012-07-03 20:25:58 +01:00
remoteproc remoteproc: fix missing CONFIG_FW_LOADER configurations 2012-07-04 11:01:12 +03:00
rpmsg rpmsg: make sure inflight messages don't invoke just-removed callbacks 2012-07-04 11:51:59 +03:00
rtc drivers/rtc/rtc-twl.c: fix threaded IRQ to use IRQF_ONESHOT 2012-07-11 16:04:48 -07:00
s390 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux 2012-05-31 10:51:10 -07:00
sbus
scsi [SCSI] bnx2i: Removed the reference to the netdev->base_addr 2012-07-08 09:52:03 +01:00
sfi
sh
sn
spi SPI: fix over-eager devm_xxx() conversion 2012-06-18 11:27:04 +01:00
ssb
staging Merge branch 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media 2012-06-25 14:53:09 -07:00
target tcm_fc: Resolve suspicious RCU usage warnings 2012-07-06 12:52:09 -07:00
tc
thermal
tty tty/hvc_opal: Fix debug function name 2012-07-10 19:16:25 +10:00
uio
usb MFD Fixes for 3.5 2012-07-13 09:54:26 -07:00
uwb
vhost vhost: use USER_DS in vhost_worker thread 2012-06-26 21:10:56 -07:00
video fbdev fixes for 3.5 2012-07-11 16:17:14 -07:00
virt
virtio virtio-balloon: fix add/get API use 2012-07-09 09:07:22 +09:30
vlynq
vme
w1
watchdog watchdog: core: fix WDIOC_GETSTATUS return value 2012-06-28 20:40:56 +02:00
xen Five bug-fixes: 2012-06-15 17:17:15 -07:00
zorro
Kconfig
Makefile