android_kernel_google_msm/drivers/block
Asias He 374d3a4168 virtio-blk: Use block layer provided spinlock
commit 2c95a32909 upstream.

Block layer will allocate a spinlock for the queue if the driver does
not provide one in blk_init_queue().

The reason to use the internal spinlock is that blk_cleanup_queue() will
switch to use the internal spinlock in the cleanup code path.

        if (q->queue_lock != &q->__queue_lock)
                q->queue_lock = &q->__queue_lock;

However, processes which are in D state might have taken the driver
provided spinlock, when the processes wake up, they would release the
block provided spinlock.

=====================================
[ BUG: bad unlock balance detected! ]
3.4.0-rc7+ #238 Not tainted
-------------------------------------
fio/3587 is trying to release lock (&(&q->__queue_lock)->rlock) at:
[<ffffffff813274d2>] blk_queue_bio+0x2a2/0x380
but there are no more locks to release!

other info that might help us debug this:
1 lock held by fio/3587:
 #0:  (&(&vblk->lock)->rlock){......}, at:
[<ffffffff8132661a>] get_request_wait+0x19a/0x250

Other drivers use block layer provided spinlock as well, e.g. SCSI.

Switching to the block layer provided spinlock saves a bit of memory and
does not increase lock contention. Performance test shows no real
difference is observed before and after this patch.

Changes in v2: Improve commit log as Michael suggested.

Cc: virtualization@lists.linux-foundation.org
Cc: kvm@vger.kernel.org
Signed-off-by: Asias He <asias@redhat.com>
Acked-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
[bwh: Backported to 3.2: adjust context]
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
Cc: Li Zefan <lizefan@huawei.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2014-02-20 10:45:33 -08:00
..
aoe aoe: reserve enough headroom on skbs 2013-04-05 10:04:40 -07:00
drbd drbd: fix for deadlock when using automatic split-brain-recovery 2013-05-19 10:54:48 -07:00
mtip32xx mtip32xx: release the semaphore on an error path 2012-05-11 16:42:14 +02:00
paride
xen-blkback xen/blkback: fix reference counting 2013-12-04 10:50:30 -08:00
amiflop.c
ataflop.c
brd.c block: fix a probe argument to blk_register_region 2013-11-29 10:50:36 -08:00
cciss.c cciss: fix info leak in cciss_ioctl32_passthru() 2013-10-13 15:42:47 -07:00
cciss.h
cciss_cmd.h
cciss_scsi.c cciss: fix handling of protocol error 2012-10-02 10:29:50 -07:00
cciss_scsi.h
cpqarray.c cpqarray: fix info leak in ida_locked_ioctl() 2013-10-13 15:42:47 -07:00
cpqarray.h
cryptoloop.c
DAC960.c dac960: Remove unused variables from DAC960_CreateProcEntries() 2012-05-11 16:42:14 +02:00
DAC960.h
floppy.c floppy: do put_disk on current dr if blk_init_queue fails 2012-11-05 09:50:41 +01:00
hd.c Remove all #inclusions of asm/system.h 2012-03-28 18:30:03 +01:00
ida_cmd.h
ida_ioctl.h
Kconfig
loop.c loop: fix crash if blk_alloc_queue fails 2013-12-04 10:50:28 -08:00
Makefile
mg_disk.c
nbd.c block: do not pass disk names as format strings 2013-07-13 11:03:41 -07:00
nvme.c NVMe: Fix uninitialized iod compiler warning 2012-12-03 11:46:36 -08:00
osdblk.c
pktcdvd.c
ps3disk.c
ps3vram.c
rbd.c rbd: do not allow remove of mounted-on image 2013-01-17 08:51:21 -08:00
rbd_types.h rbd: small changes 2012-03-22 10:47:50 -05:00
smart1,2.h
sunvdc.c sunvdc: Fix off-by-one in generic_request(). 2013-02-28 06:59:02 -08:00
swim.c
swim3.c
swim_asm.S
sx8.c
ub.c
umem.c umem: fix up unplugging 2012-07-16 09:04:08 -07:00
umem.h
virtio_blk.c virtio-blk: Use block layer provided spinlock 2014-02-20 10:45:33 -08:00
xd.c Remove all #inclusions of asm/system.h 2012-03-28 18:30:03 +01:00
xd.h
xen-blkfront.c Merge branch 'for-3.4/drivers' of git://git.kernel.dk/linux-block 2012-04-13 18:45:13 -07:00
xsysace.c
z2ram.c