Commit f4f92db4 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
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()
  ...
parents f66b07c5 6c85d6b6
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
@@ -10786,7 +10786,7 @@ F: net/ieee802154/
F:	net/mac802154/
Intel VIRTIO DATA PATH ACCELERATOR
M:	Zhu Lingshan <lingshan.zhu@intel.com>
M:	Zhu Lingshan <lingshan.zhu@kernel.org>
L:	virtualization@lists.linux.dev
S:	Supported
F:	drivers/vdpa/ifcvf/
@@ -13611,6 +13611,11 @@ S: Supported
F:	Documentation/devicetree/bindings/mmc/marvell,xenon-sdhci.yaml
F:	drivers/mmc/host/sdhci-xenon*
MARVELL OCTEON ENDPOINT VIRTIO DATA PATH ACCELERATOR
R:	schalla@marvell.com
R:	vattunuru@marvell.com
F:	drivers/vdpa/octeon_ep/
MATROX FRAMEBUFFER DRIVER
L:	linux-fbdev@vger.kernel.org
S:	Orphan
+5 −3
Original line number Diff line number Diff line
@@ -567,12 +567,14 @@ struct device_node *pcibios_get_phb_of_node(struct pci_bus *bus)

static int um_pci_init_vqs(struct um_pci_device *dev)
{
	struct virtqueue_info vqs_info[] = {
		{ "cmd", um_pci_cmd_vq_cb },
		{ "irq", um_pci_irq_vq_cb },
	};
	struct virtqueue *vqs[2];
	static const char *const names[2] = { "cmd", "irq" };
	vq_callback_t *cbs[2] = { um_pci_cmd_vq_cb, um_pci_irq_vq_cb };
	int err, i;

	err = virtio_find_vqs(dev->vdev, 2, vqs, cbs, names, NULL);
	err = virtio_find_vqs(dev->vdev, 2, vqs, vqs_info, NULL);
	if (err)
		return err;

+7 −5
Original line number Diff line number Diff line
@@ -1014,8 +1014,8 @@ static struct virtqueue *vu_setup_vq(struct virtio_device *vdev,
}

static int vu_find_vqs(struct virtio_device *vdev, unsigned nvqs,
		       struct virtqueue *vqs[], vq_callback_t *callbacks[],
		       const char * const names[], const bool *ctx,
		       struct virtqueue *vqs[],
		       struct virtqueue_info vqs_info[],
		       struct irq_affinity *desc)
{
	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,
		return rc;

	for (i = 0; i < nvqs; ++i) {
		if (!names[i]) {
		struct virtqueue_info *vqi = &vqs_info[i];

		if (!vqi->name) {
			vqs[i] = NULL;
			continue;
		}

		vqs[i] = vu_setup_vq(vdev, queue_idx++, callbacks[i], names[i],
				     ctx ? ctx[i] : false);
		vqs[i] = vu_setup_vq(vdev, queue_idx++, vqi->callback,
				     vqi->name, vqi->ctx);
		if (IS_ERR(vqs[i])) {
			rc = PTR_ERR(vqs[i]);
			goto error_setup;
+8 −12
Original line number Diff line number Diff line
@@ -964,8 +964,7 @@ static int init_vq(struct virtio_blk *vblk)
{
	int err;
	unsigned short i;
	vq_callback_t **callbacks;
	const char **names;
	struct virtqueue_info *vqs_info;
	struct virtqueue **vqs;
	unsigned short num_vqs;
	unsigned short num_poll_vqs;
@@ -1002,28 +1001,26 @@ static int init_vq(struct virtio_blk *vblk)
	if (!vblk->vqs)
		return -ENOMEM;

	names = kmalloc_array(num_vqs, sizeof(*names), GFP_KERNEL);
	callbacks = kmalloc_array(num_vqs, sizeof(*callbacks), GFP_KERNEL);
	vqs_info = kcalloc(num_vqs, sizeof(*vqs_info), GFP_KERNEL);
	vqs = kmalloc_array(num_vqs, sizeof(*vqs), GFP_KERNEL);
	if (!names || !callbacks || !vqs) {
	if (!vqs_info || !vqs) {
		err = -ENOMEM;
		goto out;
	}

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

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

	/* Discover virtqueues and write information to configuration.  */
	err = virtio_find_vqs(vdev, num_vqs, vqs, callbacks, names, &desc);
	err = virtio_find_vqs(vdev, num_vqs, vqs, vqs_info, &desc);
	if (err)
		goto out;

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

out:
	kfree(vqs);
	kfree(callbacks);
	kfree(names);
	kfree(vqs_info);
	if (err)
		kfree(vblk->vqs);
	return err;
+4 −9
Original line number Diff line number Diff line
@@ -254,13 +254,9 @@ static void virtbt_rx_done(struct virtqueue *vq)

static int virtbt_probe(struct virtio_device *vdev)
{
	vq_callback_t *callbacks[VIRTBT_NUM_VQS] = {
		[VIRTBT_VQ_TX] = virtbt_tx_done,
		[VIRTBT_VQ_RX] = virtbt_rx_done,
	};
	const char *names[VIRTBT_NUM_VQS] = {
		[VIRTBT_VQ_TX] = "tx",
		[VIRTBT_VQ_RX] = "rx",
	struct virtqueue_info vqs_info[VIRTBT_NUM_VQS] = {
		[VIRTBT_VQ_TX] = { "tx", virtbt_tx_done },
		[VIRTBT_VQ_RX] = { "rx", virtbt_rx_done },
	};
	struct virtio_bluetooth *vbt;
	struct hci_dev *hdev;
@@ -288,8 +284,7 @@ static int virtbt_probe(struct virtio_device *vdev)

	INIT_WORK(&vbt->rx, virtbt_rx_work);

	err = virtio_find_vqs(vdev, VIRTBT_NUM_VQS, vbt->vqs, callbacks,
			      names, NULL);
	err = virtio_find_vqs(vdev, VIRTBT_NUM_VQS, vbt->vqs, vqs_info, NULL);
	if (err)
		return err;

Loading