Commit 97a3b814 authored by Dariusz Stojaczyk's avatar Dariusz Stojaczyk Committed by Daniel Verkamp
Browse files

rte_virtio: fix vdev->max_queues



We interpeted max request queue
count as number of all queues.
It did not take into account
eventq and controlq.

This patch also fixes overall
max_queues negotiation for
modern PCI devices.

Fixes 8b0a4a3c ("bdev_virtio: implement multiqueue")

Change-Id: I834cb973772ca5946ac26d18bd3eeb2783f48ea9
Signed-off-by: default avatarDariusz Stojaczyk <dariuszx.stojaczyk@intel.com>
Reviewed-on: https://review.gerrithub.io/382816


Tested-by: default avatarSPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Reviewed-by: default avatarDaniel Verkamp <daniel.verkamp@intel.com>
parent 4df57e99
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -875,7 +875,8 @@ bdev_virtio_process_config(void)
			num_queues = 1;
		}

		vdev = virtio_user_dev_init(path, num_queues + 2, 512);
		vdev = virtio_user_dev_init(path, num_queues, 512,
					    SPDK_VIRTIO_SCSI_QUEUE_NUM_FIXED);
		if (vdev == NULL) {
			rc = -1;
			goto out;
+11 −6
Original line number Diff line number Diff line
@@ -617,6 +617,15 @@ next:
	return 0;
}

static void
virtio_dev_pci_init(struct virtio_dev *vdev)
{
	vtpci_read_dev_config(vdev, offsetof(struct virtio_scsi_config, num_queues),
			      &vdev->max_queues, sizeof(vdev->max_queues));
	vdev->max_queues += SPDK_VIRTIO_SCSI_QUEUE_NUM_FIXED;
	TAILQ_INSERT_TAIL(&g_virtio_driver.init_ctrlrs, vdev, tailq);
}

static int
pci_enum_virtio_probe_cb(void *ctx, struct spdk_pci_device *pci_dev)
{
@@ -661,7 +670,7 @@ pci_enum_virtio_probe_cb(void *ctx, struct spdk_pci_device *pci_dev)
			goto err;
		}
		vdev->modern = 1;
		TAILQ_INSERT_TAIL(&g_virtio_driver.init_ctrlrs, vdev, tailq);
		virtio_dev_pci_init(vdev);
		return 0;
	}

@@ -685,11 +694,7 @@ pci_enum_virtio_probe_cb(void *ctx, struct spdk_pci_device *pci_dev)
		goto err;
	}
	vdev->modern = 0;

	vtpci_read_dev_config(vdev, offsetof(struct virtio_scsi_config, num_queues),
			      &vdev->max_queues, sizeof(vdev->max_queues));

	TAILQ_INSERT_TAIL(&g_virtio_driver.init_ctrlrs, vdev, tailq);
	virtio_dev_pci_init(vdev);
	return 0;

err:
+3 −0
Original line number Diff line number Diff line
@@ -50,6 +50,9 @@ struct virtqueue;
/* Extra status define for readability */
#define VIRTIO_CONFIG_S_RESET 0

/* Number of non-request queues - eventq and controlq */
#define SPDK_VIRTIO_SCSI_QUEUE_NUM_FIXED 2

struct virtio_pci_ops {
	void (*read_dev_cfg)(struct virtio_dev *hw, size_t offset,
			     void *dst, int len);
+4 −3
Original line number Diff line number Diff line
@@ -176,7 +176,8 @@ virtio_user_dev_setup(struct virtio_user_dev *dev)
}

struct virtio_dev *
virtio_user_dev_init(char *path, uint16_t requested_queues, uint32_t queue_size)
virtio_user_dev_init(char *path, uint16_t requested_queues,
		     uint32_t queue_size, uint16_t fixed_queue_num)
{
	struct virtio_dev *vdev;
	struct virtio_user_dev *dev;
@@ -211,12 +212,12 @@ virtio_user_dev_init(char *path, uint16_t requested_queues, uint32_t queue_size)
	}

	if (requested_queues > max_queues) {
		SPDK_ERRLOG("requested %"PRIu16" queues but only %"PRIu64" available\n",
		SPDK_ERRLOG("requested %"PRIu16" request queues but only %"PRIu64" available\n",
			     requested_queues, max_queues);
		goto err;
	}

	vdev->max_queues = requested_queues;
	vdev->max_queues = fixed_queue_num + requested_queues;

	if (dev->ops->send_request(dev, VHOST_USER_SET_OWNER, NULL) < 0) {
		spdk_strerror_r(errno, err_str, sizeof(err_str));
+15 −1
Original line number Diff line number Diff line
@@ -62,7 +62,21 @@ struct virtio_user_dev {

int virtio_user_start_device(struct virtio_user_dev *dev);
int virtio_user_stop_device(struct virtio_user_dev *dev);
struct virtio_dev *virtio_user_dev_init(char *path,  uint16_t requested_queues, uint32_t queue_size);

/**
 * Connect to a vhost-user device and create corresponding virtio_dev.
 *
 * \param path path to the Unix domain socket of the vhost-user device
 * \param requested_queues maximum number of request queues that this
 * device will support
 * \param queue_size size of each of the queues
 * \param fixed_queue_num number of queues preceeding the first
 * request queue. For Virtio-SCSI this is equal to 2, as there are
 * additional event and control queues.
 * \return virtio device
 */
struct virtio_dev *virtio_user_dev_init(char *path, uint16_t requested_queues,
					uint32_t queue_size, uint16_t fixed_queue_num);
void virtio_user_dev_uninit(struct virtio_user_dev *dev);

#endif