Skip to content

Commit f4f92db

Browse files
committed
Merge tag 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost
Pull virtio updates from Michael Tsirkin: "Several new features here: - Virtio find vqs API has been reworked (required to fix the scalability issue we have with adminq, which I hope to merge later in the cycle) - vDPA driver for Marvell OCTEON - virtio fs performance improvement - mlx5 migration speedups Fixes, cleanups all over the place" * tag 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost: (56 commits) virtio: rename virtio_find_vqs_info() to virtio_find_vqs() virtio: remove unused virtio_find_vqs() and virtio_find_vqs_ctx() helpers virtio: convert the rest virtio_find_vqs() users to virtio_find_vqs_info() virtio_balloon: convert to use virtio_find_vqs_info() virtiofs: convert to use virtio_find_vqs_info() scsi: virtio_scsi: convert to use virtio_find_vqs_info() virtio_net: convert to use virtio_find_vqs_info() virtio_crypto: convert to use virtio_find_vqs_info() virtio_console: convert to use virtio_find_vqs_info() virtio_blk: convert to use virtio_find_vqs_info() virtio: rename find_vqs_info() op to find_vqs() virtio: remove the original find_vqs() op virtio: call virtio_find_vqs_info() from virtio_find_single_vq() directly virtio: convert find_vqs() op implementations to find_vqs_info() virtio_pci: convert vp_*find_vqs() ops to find_vqs_info() virtio: introduce virtio_queue_info struct and find_vqs_info() config op virtio: make virtio_find_single_vq() call virtio_find_vqs() virtio: make virtio_find_vqs() call virtio_find_vqs_ctx() caif_virtio: use virtio_find_single_vq() for single virtqueue finding vdpa/mlx5: Don't enable non-active VQs in .set_vq_ready() ...
2 parents f66b07c + 6c85d6b commit f4f92db

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+2145
-543
lines changed

MAINTAINERS

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10786,7 +10786,7 @@ F: net/ieee802154/
1078610786
F: net/mac802154/
1078710787

1078810788
Intel VIRTIO DATA PATH ACCELERATOR
10789-
M: Zhu Lingshan <lingshan.zhu@intel.com>
10789+
M: Zhu Lingshan <lingshan.zhu@kernel.org>
1079010790
1079110791
S: Supported
1079210792
F: drivers/vdpa/ifcvf/
@@ -13611,6 +13611,11 @@ S: Supported
1361113611
F: Documentation/devicetree/bindings/mmc/marvell,xenon-sdhci.yaml
1361213612
F: drivers/mmc/host/sdhci-xenon*
1361313613

13614+
MARVELL OCTEON ENDPOINT VIRTIO DATA PATH ACCELERATOR
13615+
13616+
13617+
F: drivers/vdpa/octeon_ep/
13618+
1361413619
MATROX FRAMEBUFFER DRIVER
1361513620
1361613621
S: Orphan

arch/um/drivers/virt-pci.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -567,12 +567,14 @@ struct device_node *pcibios_get_phb_of_node(struct pci_bus *bus)
567567

568568
static int um_pci_init_vqs(struct um_pci_device *dev)
569569
{
570+
struct virtqueue_info vqs_info[] = {
571+
{ "cmd", um_pci_cmd_vq_cb },
572+
{ "irq", um_pci_irq_vq_cb },
573+
};
570574
struct virtqueue *vqs[2];
571-
static const char *const names[2] = { "cmd", "irq" };
572-
vq_callback_t *cbs[2] = { um_pci_cmd_vq_cb, um_pci_irq_vq_cb };
573575
int err, i;
574576

575-
err = virtio_find_vqs(dev->vdev, 2, vqs, cbs, names, NULL);
577+
err = virtio_find_vqs(dev->vdev, 2, vqs, vqs_info, NULL);
576578
if (err)
577579
return err;
578580

arch/um/drivers/virtio_uml.c

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1014,8 +1014,8 @@ static struct virtqueue *vu_setup_vq(struct virtio_device *vdev,
10141014
}
10151015

10161016
static int vu_find_vqs(struct virtio_device *vdev, unsigned nvqs,
1017-
struct virtqueue *vqs[], vq_callback_t *callbacks[],
1018-
const char * const names[], const bool *ctx,
1017+
struct virtqueue *vqs[],
1018+
struct virtqueue_info vqs_info[],
10191019
struct irq_affinity *desc)
10201020
{
10211021
struct virtio_uml_device *vu_dev = to_virtio_uml_device(vdev);
@@ -1031,13 +1031,15 @@ static int vu_find_vqs(struct virtio_device *vdev, unsigned nvqs,
10311031
return rc;
10321032

10331033
for (i = 0; i < nvqs; ++i) {
1034-
if (!names[i]) {
1034+
struct virtqueue_info *vqi = &vqs_info[i];
1035+
1036+
if (!vqi->name) {
10351037
vqs[i] = NULL;
10361038
continue;
10371039
}
10381040

1039-
vqs[i] = vu_setup_vq(vdev, queue_idx++, callbacks[i], names[i],
1040-
ctx ? ctx[i] : false);
1041+
vqs[i] = vu_setup_vq(vdev, queue_idx++, vqi->callback,
1042+
vqi->name, vqi->ctx);
10411043
if (IS_ERR(vqs[i])) {
10421044
rc = PTR_ERR(vqs[i]);
10431045
goto error_setup;

drivers/block/virtio_blk.c

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -964,8 +964,7 @@ static int init_vq(struct virtio_blk *vblk)
964964
{
965965
int err;
966966
unsigned short i;
967-
vq_callback_t **callbacks;
968-
const char **names;
967+
struct virtqueue_info *vqs_info;
969968
struct virtqueue **vqs;
970969
unsigned short num_vqs;
971970
unsigned short num_poll_vqs;
@@ -1002,28 +1001,26 @@ static int init_vq(struct virtio_blk *vblk)
10021001
if (!vblk->vqs)
10031002
return -ENOMEM;
10041003

1005-
names = kmalloc_array(num_vqs, sizeof(*names), GFP_KERNEL);
1006-
callbacks = kmalloc_array(num_vqs, sizeof(*callbacks), GFP_KERNEL);
1004+
vqs_info = kcalloc(num_vqs, sizeof(*vqs_info), GFP_KERNEL);
10071005
vqs = kmalloc_array(num_vqs, sizeof(*vqs), GFP_KERNEL);
1008-
if (!names || !callbacks || !vqs) {
1006+
if (!vqs_info || !vqs) {
10091007
err = -ENOMEM;
10101008
goto out;
10111009
}
10121010

10131011
for (i = 0; i < num_vqs - num_poll_vqs; i++) {
1014-
callbacks[i] = virtblk_done;
1012+
vqs_info[i].callback = virtblk_done;
10151013
snprintf(vblk->vqs[i].name, VQ_NAME_LEN, "req.%u", i);
1016-
names[i] = vblk->vqs[i].name;
1014+
vqs_info[i].name = vblk->vqs[i].name;
10171015
}
10181016

10191017
for (; i < num_vqs; i++) {
1020-
callbacks[i] = NULL;
10211018
snprintf(vblk->vqs[i].name, VQ_NAME_LEN, "req_poll.%u", i);
1022-
names[i] = vblk->vqs[i].name;
1019+
vqs_info[i].name = vblk->vqs[i].name;
10231020
}
10241021

10251022
/* Discover virtqueues and write information to configuration. */
1026-
err = virtio_find_vqs(vdev, num_vqs, vqs, callbacks, names, &desc);
1023+
err = virtio_find_vqs(vdev, num_vqs, vqs, vqs_info, &desc);
10271024
if (err)
10281025
goto out;
10291026

@@ -1035,8 +1032,7 @@ static int init_vq(struct virtio_blk *vblk)
10351032

10361033
out:
10371034
kfree(vqs);
1038-
kfree(callbacks);
1039-
kfree(names);
1035+
kfree(vqs_info);
10401036
if (err)
10411037
kfree(vblk->vqs);
10421038
return err;

drivers/bluetooth/virtio_bt.c

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -254,13 +254,9 @@ static void virtbt_rx_done(struct virtqueue *vq)
254254

255255
static int virtbt_probe(struct virtio_device *vdev)
256256
{
257-
vq_callback_t *callbacks[VIRTBT_NUM_VQS] = {
258-
[VIRTBT_VQ_TX] = virtbt_tx_done,
259-
[VIRTBT_VQ_RX] = virtbt_rx_done,
260-
};
261-
const char *names[VIRTBT_NUM_VQS] = {
262-
[VIRTBT_VQ_TX] = "tx",
263-
[VIRTBT_VQ_RX] = "rx",
257+
struct virtqueue_info vqs_info[VIRTBT_NUM_VQS] = {
258+
[VIRTBT_VQ_TX] = { "tx", virtbt_tx_done },
259+
[VIRTBT_VQ_RX] = { "rx", virtbt_rx_done },
264260
};
265261
struct virtio_bluetooth *vbt;
266262
struct hci_dev *hdev;
@@ -288,8 +284,7 @@ static int virtbt_probe(struct virtio_device *vdev)
288284

289285
INIT_WORK(&vbt->rx, virtbt_rx_work);
290286

291-
err = virtio_find_vqs(vdev, VIRTBT_NUM_VQS, vbt->vqs, callbacks,
292-
names, NULL);
287+
err = virtio_find_vqs(vdev, VIRTBT_NUM_VQS, vbt->vqs, vqs_info, NULL);
293288
if (err)
294289
return err;
295290

drivers/char/virtio_console.c

Lines changed: 17 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1804,8 +1804,7 @@ static void config_work_handler(struct work_struct *work)
18041804

18051805
static int init_vqs(struct ports_device *portdev)
18061806
{
1807-
vq_callback_t **io_callbacks;
1808-
char **io_names;
1807+
struct virtqueue_info *vqs_info;
18091808
struct virtqueue **vqs;
18101809
u32 i, j, nr_ports, nr_queues;
18111810
int err;
@@ -1814,15 +1813,12 @@ static int init_vqs(struct ports_device *portdev)
18141813
nr_queues = use_multiport(portdev) ? (nr_ports + 1) * 2 : 2;
18151814

18161815
vqs = kmalloc_array(nr_queues, sizeof(struct virtqueue *), GFP_KERNEL);
1817-
io_callbacks = kmalloc_array(nr_queues, sizeof(vq_callback_t *),
1818-
GFP_KERNEL);
1819-
io_names = kmalloc_array(nr_queues, sizeof(char *), GFP_KERNEL);
1816+
vqs_info = kcalloc(nr_queues, sizeof(*vqs_info), GFP_KERNEL);
18201817
portdev->in_vqs = kmalloc_array(nr_ports, sizeof(struct virtqueue *),
18211818
GFP_KERNEL);
18221819
portdev->out_vqs = kmalloc_array(nr_ports, sizeof(struct virtqueue *),
18231820
GFP_KERNEL);
1824-
if (!vqs || !io_callbacks || !io_names || !portdev->in_vqs ||
1825-
!portdev->out_vqs) {
1821+
if (!vqs || !vqs_info || !portdev->in_vqs || !portdev->out_vqs) {
18261822
err = -ENOMEM;
18271823
goto free;
18281824
}
@@ -1833,30 +1829,27 @@ static int init_vqs(struct ports_device *portdev)
18331829
* 0 before others.
18341830
*/
18351831
j = 0;
1836-
io_callbacks[j] = in_intr;
1837-
io_callbacks[j + 1] = out_intr;
1838-
io_names[j] = "input";
1839-
io_names[j + 1] = "output";
1832+
vqs_info[j].callback = in_intr;
1833+
vqs_info[j + 1].callback = out_intr;
1834+
vqs_info[j].name = "input";
1835+
vqs_info[j + 1].name = "output";
18401836
j += 2;
18411837

18421838
if (use_multiport(portdev)) {
1843-
io_callbacks[j] = control_intr;
1844-
io_callbacks[j + 1] = NULL;
1845-
io_names[j] = "control-i";
1846-
io_names[j + 1] = "control-o";
1839+
vqs_info[j].callback = control_intr;
1840+
vqs_info[j].name = "control-i";
1841+
vqs_info[j + 1].name = "control-o";
18471842

18481843
for (i = 1; i < nr_ports; i++) {
18491844
j += 2;
1850-
io_callbacks[j] = in_intr;
1851-
io_callbacks[j + 1] = out_intr;
1852-
io_names[j] = "input";
1853-
io_names[j + 1] = "output";
1845+
vqs_info[j].callback = in_intr;
1846+
vqs_info[j + 1].callback = out_intr;
1847+
vqs_info[j].name = "input";
1848+
vqs_info[j + 1].name = "output";
18541849
}
18551850
}
18561851
/* Find the queues. */
1857-
err = virtio_find_vqs(portdev->vdev, nr_queues, vqs,
1858-
io_callbacks,
1859-
(const char **)io_names, NULL);
1852+
err = virtio_find_vqs(portdev->vdev, nr_queues, vqs, vqs_info, NULL);
18601853
if (err)
18611854
goto free;
18621855

@@ -1874,17 +1867,15 @@ static int init_vqs(struct ports_device *portdev)
18741867
portdev->out_vqs[i] = vqs[j + 1];
18751868
}
18761869
}
1877-
kfree(io_names);
1878-
kfree(io_callbacks);
1870+
kfree(vqs_info);
18791871
kfree(vqs);
18801872

18811873
return 0;
18821874

18831875
free:
18841876
kfree(portdev->out_vqs);
18851877
kfree(portdev->in_vqs);
1886-
kfree(io_names);
1887-
kfree(io_callbacks);
1878+
kfree(vqs_info);
18881879
kfree(vqs);
18891880

18901881
return err;

drivers/crypto/virtio/virtio_crypto_core.c

Lines changed: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -96,11 +96,10 @@ static void virtcrypto_dataq_callback(struct virtqueue *vq)
9696

9797
static int virtcrypto_find_vqs(struct virtio_crypto *vi)
9898
{
99-
vq_callback_t **callbacks;
99+
struct virtqueue_info *vqs_info;
100100
struct virtqueue **vqs;
101101
int ret = -ENOMEM;
102102
int i, total_vqs;
103-
const char **names;
104103
struct device *dev = &vi->vdev->dev;
105104

106105
/*
@@ -114,26 +113,23 @@ static int virtcrypto_find_vqs(struct virtio_crypto *vi)
114113
vqs = kcalloc(total_vqs, sizeof(*vqs), GFP_KERNEL);
115114
if (!vqs)
116115
goto err_vq;
117-
callbacks = kcalloc(total_vqs, sizeof(*callbacks), GFP_KERNEL);
118-
if (!callbacks)
119-
goto err_callback;
120-
names = kcalloc(total_vqs, sizeof(*names), GFP_KERNEL);
121-
if (!names)
122-
goto err_names;
116+
vqs_info = kcalloc(total_vqs, sizeof(*vqs_info), GFP_KERNEL);
117+
if (!vqs_info)
118+
goto err_vqs_info;
123119

124120
/* Parameters for control virtqueue */
125-
callbacks[total_vqs - 1] = virtcrypto_ctrlq_callback;
126-
names[total_vqs - 1] = "controlq";
121+
vqs_info[total_vqs - 1].callback = virtcrypto_ctrlq_callback;
122+
vqs_info[total_vqs - 1].name = "controlq";
127123

128124
/* Allocate/initialize parameters for data virtqueues */
129125
for (i = 0; i < vi->max_data_queues; i++) {
130-
callbacks[i] = virtcrypto_dataq_callback;
126+
vqs_info[i].callback = virtcrypto_dataq_callback;
131127
snprintf(vi->data_vq[i].name, sizeof(vi->data_vq[i].name),
132128
"dataq.%d", i);
133-
names[i] = vi->data_vq[i].name;
129+
vqs_info[i].name = vi->data_vq[i].name;
134130
}
135131

136-
ret = virtio_find_vqs(vi->vdev, total_vqs, vqs, callbacks, names, NULL);
132+
ret = virtio_find_vqs(vi->vdev, total_vqs, vqs, vqs_info, NULL);
137133
if (ret)
138134
goto err_find;
139135

@@ -153,18 +149,15 @@ static int virtcrypto_find_vqs(struct virtio_crypto *vi)
153149
(unsigned long)&vi->data_vq[i]);
154150
}
155151

156-
kfree(names);
157-
kfree(callbacks);
152+
kfree(vqs_info);
158153
kfree(vqs);
159154

160155
return 0;
161156

162157
err_engine:
163158
err_find:
164-
kfree(names);
165-
err_names:
166-
kfree(callbacks);
167-
err_callback:
159+
kfree(vqs_info);
160+
err_vqs_info:
168161
kfree(vqs);
169162
err_vq:
170163
return ret;

drivers/firmware/arm_scmi/virtio.c

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -354,11 +354,9 @@ static void scmi_vio_deferred_tx_worker(struct work_struct *work)
354354
scmi_vio_channel_release(vioch);
355355
}
356356

357-
static const char *const scmi_vio_vqueue_names[] = { "tx", "rx" };
358-
359-
static vq_callback_t *scmi_vio_complete_callbacks[] = {
360-
scmi_vio_complete_cb,
361-
scmi_vio_complete_cb
357+
static struct virtqueue_info scmi_vio_vqs_info[] = {
358+
{ "tx", scmi_vio_complete_cb },
359+
{ "rx", scmi_vio_complete_cb },
362360
};
363361

364362
static unsigned int virtio_get_max_msg(struct scmi_chan_info *base_cinfo)
@@ -831,8 +829,7 @@ static int scmi_vio_probe(struct virtio_device *vdev)
831829
if (have_vq_rx)
832830
channels[VIRTIO_SCMI_VQ_RX].is_rx = true;
833831

834-
ret = virtio_find_vqs(vdev, vq_cnt, vqs, scmi_vio_complete_callbacks,
835-
scmi_vio_vqueue_names, NULL);
832+
ret = virtio_find_vqs(vdev, vq_cnt, vqs, scmi_vio_vqs_info, NULL);
836833
if (ret) {
837834
dev_err(dev, "Failed to get %d virtqueue(s)\n", vq_cnt);
838835
return ret;

drivers/gpio/gpio-virtio.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -457,15 +457,15 @@ static void virtio_gpio_free_vqs(struct virtio_device *vdev)
457457
static int virtio_gpio_alloc_vqs(struct virtio_gpio *vgpio,
458458
struct virtio_device *vdev)
459459
{
460-
const char * const names[] = { "requestq", "eventq" };
461-
vq_callback_t *cbs[] = {
462-
virtio_gpio_request_vq,
463-
virtio_gpio_event_vq,
460+
struct virtqueue_info vqs_info[] = {
461+
{ "requestq", virtio_gpio_request_vq },
462+
{ "eventq", virtio_gpio_event_vq },
464463
};
465464
struct virtqueue *vqs[2] = { NULL, NULL };
466465
int ret;
467466

468-
ret = virtio_find_vqs(vdev, vgpio->irq_lines ? 2 : 1, vqs, cbs, names, NULL);
467+
ret = virtio_find_vqs(vdev, vgpio->irq_lines ? 2 : 1, vqs,
468+
vqs_info, NULL);
469469
if (ret) {
470470
dev_err(&vdev->dev, "failed to find vqs: %d\n", ret);
471471
return ret;

drivers/gpu/drm/virtio/virtgpu_kms.c

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -116,11 +116,10 @@ static void virtio_gpu_get_capsets(struct virtio_gpu_device *vgdev,
116116

117117
int virtio_gpu_init(struct virtio_device *vdev, struct drm_device *dev)
118118
{
119-
static vq_callback_t *callbacks[] = {
120-
virtio_gpu_ctrl_ack, virtio_gpu_cursor_ack
119+
struct virtqueue_info vqs_info[] = {
120+
{ "control", virtio_gpu_ctrl_ack },
121+
{ "cursor", virtio_gpu_cursor_ack },
121122
};
122-
static const char * const names[] = { "control", "cursor" };
123-
124123
struct virtio_gpu_device *vgdev;
125124
/* this will expand later */
126125
struct virtqueue *vqs[2];
@@ -207,7 +206,7 @@ int virtio_gpu_init(struct virtio_device *vdev, struct drm_device *dev)
207206
DRM_INFO("features: %ccontext_init\n",
208207
vgdev->has_context_init ? '+' : '-');
209208

210-
ret = virtio_find_vqs(vgdev->vdev, 2, vqs, callbacks, names, NULL);
209+
ret = virtio_find_vqs(vgdev->vdev, 2, vqs, vqs_info, NULL);
211210
if (ret) {
212211
DRM_ERROR("failed to find virt queues\n");
213212
goto err_vqs;

0 commit comments

Comments
 (0)