diff options
Diffstat (limited to 'drivers/block')
| -rw-r--r-- | drivers/block/null_blk.c | 16 | ||||
| -rw-r--r-- | drivers/block/virtio_blk.c | 5 | ||||
| -rw-r--r-- | drivers/block/xen-blkfront.c | 7 |
3 files changed, 17 insertions, 11 deletions
diff --git a/drivers/block/null_blk.c b/drivers/block/null_blk.c index b5d842370cc9..f370fc13aea5 100644 --- a/drivers/block/null_blk.c +++ b/drivers/block/null_blk.c | |||
| @@ -223,7 +223,7 @@ static void null_softirq_done_fn(struct request *rq) | |||
| 223 | blk_end_request_all(rq, 0); | 223 | blk_end_request_all(rq, 0); |
| 224 | } | 224 | } |
| 225 | 225 | ||
| 226 | #if defined(CONFIG_SMP) && defined(CONFIG_USE_GENERIC_SMP_HELPERS) | 226 | #ifdef CONFIG_SMP |
| 227 | 227 | ||
| 228 | static void null_ipi_cmd_end_io(void *data) | 228 | static void null_ipi_cmd_end_io(void *data) |
| 229 | { | 229 | { |
| @@ -260,7 +260,7 @@ static void null_cmd_end_ipi(struct nullb_cmd *cmd) | |||
| 260 | put_cpu(); | 260 | put_cpu(); |
| 261 | } | 261 | } |
| 262 | 262 | ||
| 263 | #endif /* CONFIG_SMP && CONFIG_USE_GENERIC_SMP_HELPERS */ | 263 | #endif /* CONFIG_SMP */ |
| 264 | 264 | ||
| 265 | static inline void null_handle_cmd(struct nullb_cmd *cmd) | 265 | static inline void null_handle_cmd(struct nullb_cmd *cmd) |
| 266 | { | 266 | { |
| @@ -270,7 +270,7 @@ static inline void null_handle_cmd(struct nullb_cmd *cmd) | |||
| 270 | end_cmd(cmd); | 270 | end_cmd(cmd); |
| 271 | break; | 271 | break; |
| 272 | case NULL_IRQ_SOFTIRQ: | 272 | case NULL_IRQ_SOFTIRQ: |
| 273 | #if defined(CONFIG_SMP) && defined(CONFIG_USE_GENERIC_SMP_HELPERS) | 273 | #ifdef CONFIG_SMP |
| 274 | null_cmd_end_ipi(cmd); | 274 | null_cmd_end_ipi(cmd); |
| 275 | #else | 275 | #else |
| 276 | end_cmd(cmd); | 276 | end_cmd(cmd); |
| @@ -495,23 +495,23 @@ static int null_add_dev(void) | |||
| 495 | 495 | ||
| 496 | spin_lock_init(&nullb->lock); | 496 | spin_lock_init(&nullb->lock); |
| 497 | 497 | ||
| 498 | if (queue_mode == NULL_Q_MQ && use_per_node_hctx) | ||
| 499 | submit_queues = nr_online_nodes; | ||
| 500 | |||
| 498 | if (setup_queues(nullb)) | 501 | if (setup_queues(nullb)) |
| 499 | goto err; | 502 | goto err; |
| 500 | 503 | ||
| 501 | if (queue_mode == NULL_Q_MQ) { | 504 | if (queue_mode == NULL_Q_MQ) { |
| 502 | null_mq_reg.numa_node = home_node; | 505 | null_mq_reg.numa_node = home_node; |
| 503 | null_mq_reg.queue_depth = hw_queue_depth; | 506 | null_mq_reg.queue_depth = hw_queue_depth; |
| 507 | null_mq_reg.nr_hw_queues = submit_queues; | ||
| 504 | 508 | ||
| 505 | if (use_per_node_hctx) { | 509 | if (use_per_node_hctx) { |
| 506 | null_mq_reg.ops->alloc_hctx = null_alloc_hctx; | 510 | null_mq_reg.ops->alloc_hctx = null_alloc_hctx; |
| 507 | null_mq_reg.ops->free_hctx = null_free_hctx; | 511 | null_mq_reg.ops->free_hctx = null_free_hctx; |
| 508 | |||
| 509 | null_mq_reg.nr_hw_queues = nr_online_nodes; | ||
| 510 | } else { | 512 | } else { |
| 511 | null_mq_reg.ops->alloc_hctx = blk_mq_alloc_single_hw_queue; | 513 | null_mq_reg.ops->alloc_hctx = blk_mq_alloc_single_hw_queue; |
| 512 | null_mq_reg.ops->free_hctx = blk_mq_free_single_hw_queue; | 514 | null_mq_reg.ops->free_hctx = blk_mq_free_single_hw_queue; |
| 513 | |||
| 514 | null_mq_reg.nr_hw_queues = submit_queues; | ||
| 515 | } | 515 | } |
| 516 | 516 | ||
| 517 | nullb->q = blk_mq_init_queue(&null_mq_reg, nullb); | 517 | nullb->q = blk_mq_init_queue(&null_mq_reg, nullb); |
| @@ -571,7 +571,7 @@ static int __init null_init(void) | |||
| 571 | { | 571 | { |
| 572 | unsigned int i; | 572 | unsigned int i; |
| 573 | 573 | ||
| 574 | #if !defined(CONFIG_SMP) || !defined(CONFIG_USE_GENERIC_SMP_HELPERS) | 574 | #if !defined(CONFIG_SMP) |
| 575 | if (irqmode == NULL_IRQ_SOFTIRQ) { | 575 | if (irqmode == NULL_IRQ_SOFTIRQ) { |
| 576 | pr_warn("null_blk: softirq completions not available.\n"); | 576 | pr_warn("null_blk: softirq completions not available.\n"); |
| 577 | pr_warn("null_blk: using direct completions.\n"); | 577 | pr_warn("null_blk: using direct completions.\n"); |
diff --git a/drivers/block/virtio_blk.c b/drivers/block/virtio_blk.c index 588479d58f52..6a680d4de7f1 100644 --- a/drivers/block/virtio_blk.c +++ b/drivers/block/virtio_blk.c | |||
| @@ -199,15 +199,16 @@ static int virtio_queue_rq(struct blk_mq_hw_ctx *hctx, struct request *req) | |||
| 199 | 199 | ||
| 200 | spin_lock_irqsave(&vblk->vq_lock, flags); | 200 | spin_lock_irqsave(&vblk->vq_lock, flags); |
| 201 | if (__virtblk_add_req(vblk->vq, vbr, vbr->sg, num) < 0) { | 201 | if (__virtblk_add_req(vblk->vq, vbr, vbr->sg, num) < 0) { |
| 202 | virtqueue_kick(vblk->vq); | ||
| 202 | spin_unlock_irqrestore(&vblk->vq_lock, flags); | 203 | spin_unlock_irqrestore(&vblk->vq_lock, flags); |
| 203 | blk_mq_stop_hw_queue(hctx); | 204 | blk_mq_stop_hw_queue(hctx); |
| 204 | virtqueue_kick(vblk->vq); | ||
| 205 | return BLK_MQ_RQ_QUEUE_BUSY; | 205 | return BLK_MQ_RQ_QUEUE_BUSY; |
| 206 | } | 206 | } |
| 207 | spin_unlock_irqrestore(&vblk->vq_lock, flags); | ||
| 208 | 207 | ||
| 209 | if (last) | 208 | if (last) |
| 210 | virtqueue_kick(vblk->vq); | 209 | virtqueue_kick(vblk->vq); |
| 210 | |||
| 211 | spin_unlock_irqrestore(&vblk->vq_lock, flags); | ||
| 211 | return BLK_MQ_RQ_QUEUE_OK; | 212 | return BLK_MQ_RQ_QUEUE_OK; |
| 212 | } | 213 | } |
| 213 | 214 | ||
diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c index 432db1b59b00..c4a4c9006288 100644 --- a/drivers/block/xen-blkfront.c +++ b/drivers/block/xen-blkfront.c | |||
| @@ -489,7 +489,7 @@ static int blkif_queue_request(struct request *req) | |||
| 489 | 489 | ||
| 490 | if ((ring_req->operation == BLKIF_OP_INDIRECT) && | 490 | if ((ring_req->operation == BLKIF_OP_INDIRECT) && |
| 491 | (i % SEGS_PER_INDIRECT_FRAME == 0)) { | 491 | (i % SEGS_PER_INDIRECT_FRAME == 0)) { |
| 492 | unsigned long pfn; | 492 | unsigned long uninitialized_var(pfn); |
| 493 | 493 | ||
| 494 | if (segments) | 494 | if (segments) |
| 495 | kunmap_atomic(segments); | 495 | kunmap_atomic(segments); |
| @@ -2011,6 +2011,10 @@ static void blkif_release(struct gendisk *disk, fmode_t mode) | |||
| 2011 | 2011 | ||
| 2012 | bdev = bdget_disk(disk, 0); | 2012 | bdev = bdget_disk(disk, 0); |
| 2013 | 2013 | ||
| 2014 | if (!bdev) { | ||
| 2015 | WARN(1, "Block device %s yanked out from us!\n", disk->disk_name); | ||
| 2016 | goto out_mutex; | ||
| 2017 | } | ||
| 2014 | if (bdev->bd_openers) | 2018 | if (bdev->bd_openers) |
| 2015 | goto out; | 2019 | goto out; |
| 2016 | 2020 | ||
| @@ -2041,6 +2045,7 @@ static void blkif_release(struct gendisk *disk, fmode_t mode) | |||
| 2041 | 2045 | ||
| 2042 | out: | 2046 | out: |
| 2043 | bdput(bdev); | 2047 | bdput(bdev); |
| 2048 | out_mutex: | ||
| 2044 | mutex_unlock(&blkfront_mutex); | 2049 | mutex_unlock(&blkfront_mutex); |
| 2045 | } | 2050 | } |
| 2046 | 2051 | ||
