mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 11:11:45 -04:00
Merge branch 'for-linus' of git://git.kernel.dk/linux-block
Pull more block updates from Jens Axboe:
"This is a followup for block changes, that didn't make the initial
pull request. It's a bit of a mixed bag, this contains:
- A followup pull request from Sagi for NVMe. Outside of fixups for
NVMe, it also includes a series for ensuring that we properly
quiesce hardware queues when browsing live tags.
- Set of integrity fixes from Dmitry (mostly), fixing various issues
for folks using DIF/DIX.
- Fix for a bug introduced in cciss, with the req init changes. From
Christoph.
- Fix for a bug in BFQ, from Paolo.
- Two followup fixes for lightnvm/pblk from Javier.
- Depth fix from Ming for blk-mq-sched.
- Also from Ming, performance fix for mtip32xx that was introduced
with the dynamic initialization of commands"
* 'for-linus' of git://git.kernel.dk/linux-block: (44 commits)
block: call bio_uninit in bio_endio
nvmet: avoid unneeded assignment of submit_bio return value
nvme-pci: add module parameter for io queue depth
nvme-pci: compile warnings in nvme_alloc_host_mem()
nvmet_fc: Accept variable pad lengths on Create Association LS
nvme_fc/nvmet_fc: revise Create Association descriptor length
lightnvm: pblk: remove unnecessary checks
lightnvm: pblk: control I/O flow also on tear down
cciss: initialize struct scsi_req
null_blk: fix error flow for shared tags during module_init
block: Fix __blkdev_issue_zeroout loop
nvme-rdma: unconditionally recycle the request mr
nvme: split nvme_uninit_ctrl into stop and uninit
virtio_blk: quiesce/unquiesce live IO when entering PM states
mtip32xx: quiesce request queues to make sure no submissions are inflight
nbd: quiesce request queues to make sure no submissions are inflight
nvme: kick requeue list when requeueing a request instead of when starting the queues
nvme-pci: quiesce/unquiesce admin_q instead of start/stop its hw queues
nvme-loop: quiesce/unquiesce admin_q instead of start/stop its hw queues
nvme-fc: quiesce/unquiesce admin_q instead of start/stop its hw queues
...
This commit is contained in:
commit
130568d5ea
40 changed files with 600 additions and 440 deletions
|
|
@ -1944,6 +1944,13 @@ static void cciss_get_serial_no(ctlr_info_t *h, int logvol,
|
|||
return;
|
||||
}
|
||||
|
||||
static void cciss_initialize_rq(struct request *rq)
|
||||
{
|
||||
struct scsi_request *sreq = blk_mq_rq_to_pdu(rq);
|
||||
|
||||
scsi_req_init(sreq);
|
||||
}
|
||||
|
||||
/*
|
||||
* cciss_add_disk sets up the block device queue for a logical drive
|
||||
*/
|
||||
|
|
@ -1956,6 +1963,7 @@ static int cciss_add_disk(ctlr_info_t *h, struct gendisk *disk,
|
|||
|
||||
disk->queue->cmd_size = sizeof(struct scsi_request);
|
||||
disk->queue->request_fn = do_cciss_request;
|
||||
disk->queue->initialize_rq_fn = cciss_initialize_rq;
|
||||
disk->queue->queue_lock = &h->lock;
|
||||
queue_flag_set_unlocked(QUEUE_FLAG_SCSI_PASSTHROUGH, disk->queue);
|
||||
if (blk_init_allocated_queue(disk->queue) < 0)
|
||||
|
|
|
|||
|
|
@ -174,7 +174,6 @@ static void mtip_init_cmd_header(struct request *rq)
|
|||
{
|
||||
struct driver_data *dd = rq->q->queuedata;
|
||||
struct mtip_cmd *cmd = blk_mq_rq_to_pdu(rq);
|
||||
u32 host_cap_64 = readl(dd->mmio + HOST_CAP) & HOST_CAP_64;
|
||||
|
||||
/* Point the command headers at the command tables. */
|
||||
cmd->command_header = dd->port->command_list +
|
||||
|
|
@ -182,7 +181,7 @@ static void mtip_init_cmd_header(struct request *rq)
|
|||
cmd->command_header_dma = dd->port->command_list_dma +
|
||||
(sizeof(struct mtip_cmd_hdr) * rq->tag);
|
||||
|
||||
if (host_cap_64)
|
||||
if (test_bit(MTIP_PF_HOST_CAP_64, &dd->port->flags))
|
||||
cmd->command_header->ctbau = __force_bit2int cpu_to_le32((cmd->command_dma >> 16) >> 16);
|
||||
|
||||
cmd->command_header->ctba = __force_bit2int cpu_to_le32(cmd->command_dma & 0xFFFFFFFF);
|
||||
|
|
@ -386,6 +385,7 @@ static void mtip_init_port(struct mtip_port *port)
|
|||
port->mmio + PORT_LST_ADDR_HI);
|
||||
writel((port->rxfis_dma >> 16) >> 16,
|
||||
port->mmio + PORT_FIS_ADDR_HI);
|
||||
set_bit(MTIP_PF_HOST_CAP_64, &port->flags);
|
||||
}
|
||||
|
||||
writel(port->command_list_dma & 0xFFFFFFFF,
|
||||
|
|
@ -950,7 +950,7 @@ static int mtip_quiesce_io(struct mtip_port *port, unsigned long timeout)
|
|||
unsigned long to;
|
||||
bool active = true;
|
||||
|
||||
blk_mq_stop_hw_queues(port->dd->queue);
|
||||
blk_mq_quiesce_queue(port->dd->queue);
|
||||
|
||||
to = jiffies + msecs_to_jiffies(timeout);
|
||||
do {
|
||||
|
|
@ -970,10 +970,10 @@ static int mtip_quiesce_io(struct mtip_port *port, unsigned long timeout)
|
|||
break;
|
||||
} while (time_before(jiffies, to));
|
||||
|
||||
blk_mq_start_stopped_hw_queues(port->dd->queue, true);
|
||||
blk_mq_unquiesce_queue(port->dd->queue);
|
||||
return active ? -EBUSY : 0;
|
||||
err_fault:
|
||||
blk_mq_start_stopped_hw_queues(port->dd->queue, true);
|
||||
blk_mq_unquiesce_queue(port->dd->queue);
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
|
|
@ -2737,6 +2737,9 @@ static void mtip_abort_cmd(struct request *req, void *data,
|
|||
struct mtip_cmd *cmd = blk_mq_rq_to_pdu(req);
|
||||
struct driver_data *dd = data;
|
||||
|
||||
if (!blk_mq_request_started(req))
|
||||
return;
|
||||
|
||||
dbg_printk(MTIP_DRV_NAME " Aborting request, tag = %d\n", req->tag);
|
||||
|
||||
clear_bit(req->tag, dd->port->cmds_to_issue);
|
||||
|
|
@ -2749,6 +2752,9 @@ static void mtip_queue_cmd(struct request *req, void *data,
|
|||
{
|
||||
struct driver_data *dd = data;
|
||||
|
||||
if (!blk_mq_request_started(req))
|
||||
return;
|
||||
|
||||
set_bit(req->tag, dd->port->cmds_to_issue);
|
||||
blk_abort_request(req);
|
||||
}
|
||||
|
|
@ -2814,6 +2820,8 @@ restart_eh:
|
|||
dev_warn(&dd->pdev->dev,
|
||||
"Completion workers still active!");
|
||||
|
||||
blk_mq_quiesce_queue(dd->queue);
|
||||
|
||||
spin_lock(dd->queue->queue_lock);
|
||||
blk_mq_tagset_busy_iter(&dd->tags,
|
||||
mtip_queue_cmd, dd);
|
||||
|
|
@ -2826,6 +2834,8 @@ restart_eh:
|
|||
mtip_abort_cmd, dd);
|
||||
|
||||
clear_bit(MTIP_PF_TO_ACTIVE_BIT, &dd->port->flags);
|
||||
|
||||
blk_mq_unquiesce_queue(dd->queue);
|
||||
}
|
||||
|
||||
if (test_bit(MTIP_PF_ISSUE_CMDS_BIT, &port->flags)) {
|
||||
|
|
@ -3995,8 +4005,9 @@ static int mtip_block_remove(struct driver_data *dd)
|
|||
dd->disk->disk_name);
|
||||
|
||||
blk_freeze_queue_start(dd->queue);
|
||||
blk_mq_stop_hw_queues(dd->queue);
|
||||
blk_mq_quiesce_queue(dd->queue);
|
||||
blk_mq_tagset_busy_iter(&dd->tags, mtip_no_dev_cleanup, dd);
|
||||
blk_mq_unquiesce_queue(dd->queue);
|
||||
|
||||
/*
|
||||
* Delete our gendisk structure. This also removes the device
|
||||
|
|
|
|||
|
|
@ -140,6 +140,7 @@ enum {
|
|||
(1 << MTIP_PF_SE_ACTIVE_BIT) |
|
||||
(1 << MTIP_PF_DM_ACTIVE_BIT) |
|
||||
(1 << MTIP_PF_TO_ACTIVE_BIT)),
|
||||
MTIP_PF_HOST_CAP_64 = 10, /* cache HOST_CAP_64 */
|
||||
|
||||
MTIP_PF_SVC_THD_ACTIVE_BIT = 4,
|
||||
MTIP_PF_ISSUE_CMDS_BIT = 5,
|
||||
|
|
|
|||
|
|
@ -661,9 +661,9 @@ static void nbd_clear_req(struct request *req, void *data, bool reserved)
|
|||
|
||||
static void nbd_clear_que(struct nbd_device *nbd)
|
||||
{
|
||||
blk_mq_stop_hw_queues(nbd->disk->queue);
|
||||
blk_mq_quiesce_queue(nbd->disk->queue);
|
||||
blk_mq_tagset_busy_iter(&nbd->tag_set, nbd_clear_req, NULL);
|
||||
blk_mq_start_hw_queues(nbd->disk->queue);
|
||||
blk_mq_unquiesce_queue(nbd->disk->queue);
|
||||
dev_dbg(disk_to_dev(nbd->disk), "queue cleared\n");
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -844,9 +844,6 @@ static int __init null_init(void)
|
|||
queue_mode = NULL_Q_MQ;
|
||||
}
|
||||
|
||||
if (queue_mode == NULL_Q_MQ && shared_tags)
|
||||
null_init_tag_set(&tag_set);
|
||||
|
||||
if (queue_mode == NULL_Q_MQ && use_per_node_hctx) {
|
||||
if (submit_queues < nr_online_nodes) {
|
||||
pr_warn("null_blk: submit_queues param is set to %u.",
|
||||
|
|
@ -858,11 +855,19 @@ static int __init null_init(void)
|
|||
else if (!submit_queues)
|
||||
submit_queues = 1;
|
||||
|
||||
if (queue_mode == NULL_Q_MQ && shared_tags) {
|
||||
ret = null_init_tag_set(&tag_set);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
mutex_init(&lock);
|
||||
|
||||
null_major = register_blkdev(0, "nullb");
|
||||
if (null_major < 0)
|
||||
return null_major;
|
||||
if (null_major < 0) {
|
||||
ret = null_major;
|
||||
goto err_tagset;
|
||||
}
|
||||
|
||||
if (use_lightnvm) {
|
||||
ppa_cache = kmem_cache_create("ppa_cache", 64 * sizeof(u64),
|
||||
|
|
@ -891,6 +896,9 @@ err_dev:
|
|||
kmem_cache_destroy(ppa_cache);
|
||||
err_ppa:
|
||||
unregister_blkdev(null_major, "nullb");
|
||||
err_tagset:
|
||||
if (queue_mode == NULL_Q_MQ && shared_tags)
|
||||
blk_mq_free_tag_set(&tag_set);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -840,7 +840,7 @@ static int virtblk_freeze(struct virtio_device *vdev)
|
|||
/* Make sure no work handler is accessing the device. */
|
||||
flush_work(&vblk->config_work);
|
||||
|
||||
blk_mq_stop_hw_queues(vblk->disk->queue);
|
||||
blk_mq_quiesce_queue(vblk->disk->queue);
|
||||
|
||||
vdev->config->del_vqs(vdev);
|
||||
return 0;
|
||||
|
|
@ -857,7 +857,7 @@ static int virtblk_restore(struct virtio_device *vdev)
|
|||
|
||||
virtio_device_ready(vdev);
|
||||
|
||||
blk_mq_start_stopped_hw_queues(vblk->disk->queue, true);
|
||||
blk_mq_unquiesce_queue(vblk->disk->queue);
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Reference in a new issue