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 8b0a4a3 ("bdev_virtio: implement multiqueue")

Change-Id: I834cb973772ca5946ac26d18bd3eeb2783f48ea9
Signed-off-by: Dariusz Stojaczyk <dariuszx.stojaczyk@intel.com>
Reviewed-on: https://review.gerrithub.io/382816
Tested-by: SPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Daniel Verkamp <daniel.verkamp@intel.com>
This commit is contained in:
Dariusz Stojaczyk 2017-10-17 17:51:48 +02:00 committed by Daniel Verkamp
parent 4df57e999a
commit 97a3b814e0
5 changed files with 35 additions and 11 deletions

View File

@ -875,7 +875,8 @@ bdev_virtio_process_config(void)
num_queues = 1; 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) { if (vdev == NULL) {
rc = -1; rc = -1;
goto out; goto out;

View File

@ -617,6 +617,15 @@ next:
return 0; 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 static int
pci_enum_virtio_probe_cb(void *ctx, struct spdk_pci_device *pci_dev) 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; goto err;
} }
vdev->modern = 1; vdev->modern = 1;
TAILQ_INSERT_TAIL(&g_virtio_driver.init_ctrlrs, vdev, tailq); virtio_dev_pci_init(vdev);
return 0; return 0;
} }
@ -685,11 +694,7 @@ pci_enum_virtio_probe_cb(void *ctx, struct spdk_pci_device *pci_dev)
goto err; goto err;
} }
vdev->modern = 0; vdev->modern = 0;
virtio_dev_pci_init(vdev);
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);
return 0; return 0;
err: err:

View File

@ -50,6 +50,9 @@ struct virtqueue;
/* Extra status define for readability */ /* Extra status define for readability */
#define VIRTIO_CONFIG_S_RESET 0 #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 { struct virtio_pci_ops {
void (*read_dev_cfg)(struct virtio_dev *hw, size_t offset, void (*read_dev_cfg)(struct virtio_dev *hw, size_t offset,
void *dst, int len); void *dst, int len);

View File

@ -176,7 +176,8 @@ virtio_user_dev_setup(struct virtio_user_dev *dev)
} }
struct virtio_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_dev *vdev;
struct virtio_user_dev *dev; 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) { 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); requested_queues, max_queues);
goto err; 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) { if (dev->ops->send_request(dev, VHOST_USER_SET_OWNER, NULL) < 0) {
spdk_strerror_r(errno, err_str, sizeof(err_str)); spdk_strerror_r(errno, err_str, sizeof(err_str));

View File

@ -62,7 +62,21 @@ struct virtio_user_dev {
int virtio_user_start_device(struct virtio_user_dev *dev); int virtio_user_start_device(struct virtio_user_dev *dev);
int virtio_user_stop_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); void virtio_user_dev_uninit(struct virtio_user_dev *dev);
#endif #endif