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:
parent
4df57e999a
commit
97a3b814e0
@ -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;
|
||||
|
@ -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:
|
||||
|
@ -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);
|
||||
|
@ -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));
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user