Skip to content

Commit 7347342

Browse files
Christoph Hellwigmstsirkin
authored andcommitted
blk-mq: provide a default queue mapping for virtio device
Similar to the PCI version, just calling into virtio instead. Signed-off-by: Christoph Hellwig <[email protected]> Signed-off-by: Michael S. Tsirkin <[email protected]>
1 parent bbaba47 commit 7347342

File tree

4 files changed

+70
-0
lines changed

4 files changed

+70
-0
lines changed

block/Kconfig

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,4 +165,9 @@ config BLK_MQ_PCI
165165
depends on BLOCK && PCI
166166
default y
167167

168+
config BLK_MQ_VIRTIO
169+
bool
170+
depends on BLOCK && VIRTIO
171+
default y
172+
168173
source block/Kconfig.iosched

block/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,5 +23,6 @@ obj-$(CONFIG_BLOCK_COMPAT) += compat_ioctl.o
2323
obj-$(CONFIG_BLK_CMDLINE_PARSER) += cmdline-parser.o
2424
obj-$(CONFIG_BLK_DEV_INTEGRITY) += bio-integrity.o blk-integrity.o t10-pi.o
2525
obj-$(CONFIG_BLK_MQ_PCI) += blk-mq-pci.o
26+
obj-$(CONFIG_BLK_MQ_VIRTIO) += blk-mq-virtio.o
2627
obj-$(CONFIG_BLK_DEV_ZONED) += blk-zoned.o
2728
obj-$(CONFIG_BLK_WBT) += blk-wbt.o

block/blk-mq-virtio.c

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
/*
2+
* Copyright (c) 2016 Christoph Hellwig.
3+
*
4+
* This program is free software; you can redistribute it and/or modify it
5+
* under the terms and conditions of the GNU General Public License,
6+
* version 2, as published by the Free Software Foundation.
7+
*
8+
* This program is distributed in the hope it will be useful, but WITHOUT
9+
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10+
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
11+
* more details.
12+
*/
13+
#include <linux/device.h>
14+
#include <linux/blk-mq.h>
15+
#include <linux/blk-mq-virtio.h>
16+
#include <linux/virtio_config.h>
17+
#include <linux/module.h>
18+
#include "blk-mq.h"
19+
20+
/**
21+
* blk_mq_virtio_map_queues - provide a default queue mapping for virtio device
22+
* @set: tagset to provide the mapping for
23+
* @vdev: virtio device associated with @set.
24+
* @first_vec: first interrupt vectors to use for queues (usually 0)
25+
*
26+
* This function assumes the virtio device @vdev has at least as many available
27+
* interrupt vetors as @set has queues. It will then queuery the vector
28+
* corresponding to each queue for it's affinity mask and built queue mapping
29+
* that maps a queue to the CPUs that have irq affinity for the corresponding
30+
* vector.
31+
*/
32+
int blk_mq_virtio_map_queues(struct blk_mq_tag_set *set,
33+
struct virtio_device *vdev, int first_vec)
34+
{
35+
const struct cpumask *mask;
36+
unsigned int queue, cpu;
37+
38+
if (!vdev->config->get_vq_affinity)
39+
goto fallback;
40+
41+
for (queue = 0; queue < set->nr_hw_queues; queue++) {
42+
mask = vdev->config->get_vq_affinity(vdev, first_vec + queue);
43+
if (!mask)
44+
goto fallback;
45+
46+
for_each_cpu(cpu, mask)
47+
set->mq_map[cpu] = queue;
48+
}
49+
50+
return 0;
51+
fallback:
52+
return blk_mq_map_queues(set);
53+
}
54+
EXPORT_SYMBOL_GPL(blk_mq_virtio_map_queues);

include/linux/blk-mq-virtio.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
#ifndef _LINUX_BLK_MQ_VIRTIO_H
2+
#define _LINUX_BLK_MQ_VIRTIO_H
3+
4+
struct blk_mq_tag_set;
5+
struct virtio_device;
6+
7+
int blk_mq_virtio_map_queues(struct blk_mq_tag_set *set,
8+
struct virtio_device *vdev, int first_vec);
9+
10+
#endif /* _LINUX_BLK_MQ_VIRTIO_H */

0 commit comments

Comments
 (0)