@@ -677,12 +677,20 @@ static int virtblk_init_request(struct blk_mq_tag_set *set, struct request *rq,
return 0;
}
+static const struct cpumask *virtblk_get_vq_affinity(void *dev_data,
+ int offset, int queue)
+{
+ struct virtio_device *vdev = dev_data;
+
+ return virtio_get_vq_affinity(vdev, offset + queue);
+}
+
static int virtblk_map_queues(struct blk_mq_tag_set *set)
{
struct virtio_blk *vblk = set->driver_data;
- return blk_mq_virtio_map_queues(&set->map[HCTX_TYPE_DEFAULT],
- vblk->vdev, 0);
+ return blk_mq_dev_map_queues(&set->map[HCTX_TYPE_DEFAULT], vblk->vdev,
+ 0, virtblk_get_vq_affinity, true, true);
}
static const struct blk_mq_ops virtio_mq_ops = {
@@ -712,12 +712,21 @@ static int virtscsi_abort(struct scsi_cmnd *sc)
return virtscsi_tmf(vscsi, cmd);
}
+static const struct cpumask *virtscsi_get_vq_affinity(void *dev_data,
+ int offset, int queue)
+{
+ struct virtio_device *vdev = dev_data;
+
+ return virtio_get_vq_affinity(vdev, offset + queue);
+}
+
static int virtscsi_map_queues(struct Scsi_Host *shost)
{
struct virtio_scsi *vscsi = shost_priv(shost);
struct blk_mq_queue_map *qmap = &shost->tag_set.map[HCTX_TYPE_DEFAULT];
- return blk_mq_virtio_map_queues(qmap, vscsi->vdev, 2);
+ return blk_mq_dev_map_queues(qmap, vscsi->vdev, 2,
+ virtscsi_get_vq_affinity, true, true);
}
static void virtscsi_commit_rqs(struct Scsi_Host *shost, u16 hwq)
Replace blk_mq_virtio_map_queues with blk_mq_dev_map_queues which is more generic from blk-mq viewpoint, so we can unify all map queue implementation. Meantime we can pass 'use_manage_irq' info to blk-mq via blk_mq_dev_map_queues(), this info needn't be 100% accurate, and what we need is that true has to be passed in if the hba really uses managed irq. Signed-off-by: Ming Lei <ming.lei@redhat.com> --- drivers/block/virtio_blk.c | 12 ++++++++++-- drivers/scsi/virtio_scsi.c | 11 ++++++++++- 2 files changed, 20 insertions(+), 3 deletions(-)