Merge branch 'for-3.20/drivers' of git://git.kernel.dk/linux-block
Pull block driver changes from Jens Axboe:
"This contains:
- The 4k/partition fixes for brd from Boaz/Matthew.
- A few xen front/back block fixes from David Vrabel and Roger Pau
Monne.
- Floppy changes from Takashi, cleaning the device file creation.
- Switching libata to use the new blk-mq tagging policy, removing
code (and a suboptimal implementation) from libata. This will
throw you a merge conflict, since a bug in the original libata
tagging code was fixed since this code was branched. Trivial.
From Shaohua.
- Conversion of loop to blk-mq, from Ming Lei.
- Cleanup of the io_schedule() handling in bsg from Peter Zijlstra.
He claims it improves on unreadable code, which will cost him a
beer.
- Maintainer update or NDB, now handled by Markus Pargmann.
- NVMe:
- Optimization from me that avoids a kmalloc/kfree per IO for
smaller (<= 8KB) IO. This cuts about 1% of high IOPS CPU
overhead.
- Removal of (now) dead RCU code, a relic from before NVMe was
converted to blk-mq"
* 'for-3.20/drivers' of git://git.kernel.dk/linux-block:
xen-blkback: default to X86_32 ABI on x86
xen-blkfront: fix accounting of reqs when migrating
xen-blkback,xen-blkfront: add myself as maintainer
block: Simplify bsg complete all
floppy: Avoid manual call of device_create_file()
NVMe: avoid kmalloc/kfree for smaller IO
MAINTAINERS: Update NBD maintainer
libata: make sata_sil24 use fifo tag allocator
libata: move sas ata tag allocation to libata-scsi.c
libata: use blk taging
NVMe: within nvme_free_queues(), delete RCU sychro/deferred free
null_blk: suppress invalid partition info
brd: Request from fdisk 4k alignment
brd: Fix all partitions BUGs
axonram: Fix bug in direct_access
loop: add blk-mq.h include
block: loop: don't handle REQ_FUA explicitly
block: loop: introduce lo_discard() and lo_req_flush()
block: loop: say goodby to bio
block: loop: improve performance via blk-mq
This commit is contained in:
+25
-47
@@ -136,42 +136,6 @@ static inline struct hlist_head *bsg_dev_idx_hash(int index)
|
||||
return &bsg_device_list[index & (BSG_LIST_ARRAY_SIZE - 1)];
|
||||
}
|
||||
|
||||
static int bsg_io_schedule(struct bsg_device *bd)
|
||||
{
|
||||
DEFINE_WAIT(wait);
|
||||
int ret = 0;
|
||||
|
||||
spin_lock_irq(&bd->lock);
|
||||
|
||||
BUG_ON(bd->done_cmds > bd->queued_cmds);
|
||||
|
||||
/*
|
||||
* -ENOSPC or -ENODATA? I'm going for -ENODATA, meaning "I have no
|
||||
* work to do", even though we return -ENOSPC after this same test
|
||||
* during bsg_write() -- there, it means our buffer can't have more
|
||||
* bsg_commands added to it, thus has no space left.
|
||||
*/
|
||||
if (bd->done_cmds == bd->queued_cmds) {
|
||||
ret = -ENODATA;
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
if (!test_bit(BSG_F_BLOCK, &bd->flags)) {
|
||||
ret = -EAGAIN;
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
prepare_to_wait(&bd->wq_done, &wait, TASK_UNINTERRUPTIBLE);
|
||||
spin_unlock_irq(&bd->lock);
|
||||
io_schedule();
|
||||
finish_wait(&bd->wq_done, &wait);
|
||||
|
||||
return ret;
|
||||
unlock:
|
||||
spin_unlock_irq(&bd->lock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int blk_fill_sgv4_hdr_rq(struct request_queue *q, struct request *rq,
|
||||
struct sg_io_v4 *hdr, struct bsg_device *bd,
|
||||
fmode_t has_write_perm)
|
||||
@@ -482,6 +446,30 @@ static int blk_complete_sgv4_hdr_rq(struct request *rq, struct sg_io_v4 *hdr,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static bool bsg_complete(struct bsg_device *bd)
|
||||
{
|
||||
bool ret = false;
|
||||
bool spin;
|
||||
|
||||
do {
|
||||
spin_lock_irq(&bd->lock);
|
||||
|
||||
BUG_ON(bd->done_cmds > bd->queued_cmds);
|
||||
|
||||
/*
|
||||
* All commands consumed.
|
||||
*/
|
||||
if (bd->done_cmds == bd->queued_cmds)
|
||||
ret = true;
|
||||
|
||||
spin = !test_bit(BSG_F_BLOCK, &bd->flags);
|
||||
|
||||
spin_unlock_irq(&bd->lock);
|
||||
} while (!ret && spin);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int bsg_complete_all_commands(struct bsg_device *bd)
|
||||
{
|
||||
struct bsg_command *bc;
|
||||
@@ -492,17 +480,7 @@ static int bsg_complete_all_commands(struct bsg_device *bd)
|
||||
/*
|
||||
* wait for all commands to complete
|
||||
*/
|
||||
ret = 0;
|
||||
do {
|
||||
ret = bsg_io_schedule(bd);
|
||||
/*
|
||||
* look for -ENODATA specifically -- we'll sometimes get
|
||||
* -ERESTARTSYS when we've taken a signal, but we can't
|
||||
* return until we're done freeing the queue, so ignore
|
||||
* it. The signal will get handled when we're done freeing
|
||||
* the bsg_device.
|
||||
*/
|
||||
} while (ret != -ENODATA);
|
||||
io_wait_event(bd->wq_done, bsg_complete(bd));
|
||||
|
||||
/*
|
||||
* discard done commands
|
||||
|
||||
Reference in New Issue
Block a user