[PATCH 12/13] qemu: Implement support for iothread <-> virtqueue mapping for 'virtio-scsi' controllers

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Similarly to 'virtio-blk' users can map multiple iothreads and pin them
appropriately for 'virtio-scsi' controllers to ensure the best
performance.

Implement the validation and command line generation based on the
helpers we have for 'virtio-blk'.

Signed-off-by: Peter Krempa <pkrempa@xxxxxxxxxx>
---
 src/qemu/qemu_command.c  |  6 ++++++
 src/qemu/qemu_validate.c | 32 +++++++++++++++++++++++++-------
 2 files changed, 31 insertions(+), 7 deletions(-)

diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index b76fec27c5..ea98dee912 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -2510,6 +2510,7 @@ qemuBuildControllerSCSIDevProps(virDomainControllerDef *def,
                                 virQEMUCaps *qemuCaps)
 {
     g_autoptr(virJSONValue) props = NULL;
+    g_autoptr(virJSONValue) iothreadsMapping = NULL;
     g_autofree char *iothread = NULL;
     const char *driver = NULL;

@@ -2521,11 +2522,16 @@ qemuBuildControllerSCSIDevProps(virDomainControllerDef *def,
                                               qemuCaps)))
             return NULL;

+        if (def->iothreads &&
+            !(iothreadsMapping = qemuBuildIothreadMappingProps(def->iothreads)))
+            return NULL;
+
         if (def->iothread > 0)
             iothread = g_strdup_printf("iothread%u", def->iothread);

         if (virJSONValueObjectAdd(&props,
                                   "S:iothread", iothread,
+                                  "A:iothread-vq-mapping", &iothreadsMapping,
                                   "s:id", def->info.alias,
                                   "p:num_queues", def->queues,
                                   "p:cmd_per_lun", def->cmd_per_lun,
diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c
index 2185e31a27..617cf69f1e 100644
--- a/src/qemu/qemu_validate.c
+++ b/src/qemu/qemu_validate.c
@@ -3601,9 +3601,10 @@ qemuValidateDomainDeviceDefControllerIDE(const virDomainControllerDef *controlle
  */
 static int
 qemuValidateCheckSCSIControllerIOThreads(const virDomainControllerDef *controller,
-                                         const virDomainDef *def)
+                                         const virDomainDef *def,
+                                         virQEMUCaps *qemuCaps)
 {
-    if (!controller->iothread)
+    if (controller->iothread == 0 && !controller->iothreads)
         return 0;

     if (controller->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE &&
@@ -3614,8 +3615,22 @@ qemuValidateCheckSCSIControllerIOThreads(const virDomainControllerDef *controlle
        return -1;
     }

-    /* Can we find the controller iothread in the iothreadid list? */
-    if (!virDomainIOThreadIDFind(def, controller->iothread)) {
+    if (controller->iothreads) {
+        if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_SCSI_IOTHREAD_MAPPING)) {
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                           _("IOThread mapping for virtio-scsi controllers is not available with this QEMU binary"));
+            return -1;
+        }
+
+        /* The 'virtio-scsi' device has two extra internal queues 'ctrl' and
+         * 'event' with indices '0' and '1' which need to be covered by mapping */
+        if (qemuDomainValidateIothreadMapping(def, controller->iothreads,
+                                              controller->queues + 2) < 0)
+            return -1;
+    }
+
+    if (controller->iothread > 0 &&
+        !virDomainIOThreadIDFind(def, controller->iothread)) {
         virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
                        _("controller iothread '%1$u' not defined in iothreadid"),
                        controller->iothread);
@@ -3628,13 +3643,15 @@ qemuValidateCheckSCSIControllerIOThreads(const virDomainControllerDef *controlle

 static int
 qemuValidateDomainDeviceDefControllerSCSI(const virDomainControllerDef *controller,
-                                          const virDomainDef *def)
+                                          const virDomainDef *def,
+                                          virQEMUCaps *qemuCaps)
 {
     switch ((virDomainControllerModelSCSI) controller->model) {
         case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_VIRTIO_SCSI:
         case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_VIRTIO_TRANSITIONAL:
         case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_VIRTIO_NON_TRANSITIONAL:
-            if (qemuValidateCheckSCSIControllerIOThreads(controller, def) < 0)
+            if (qemuValidateCheckSCSIControllerIOThreads(controller, def,
+                                                         qemuCaps) < 0)
                 return -1;
             break;

@@ -4308,7 +4325,8 @@ qemuValidateDomainDeviceDefController(const virDomainControllerDef *controller,
         break;

     case VIR_DOMAIN_CONTROLLER_TYPE_SCSI:
-        ret = qemuValidateDomainDeviceDefControllerSCSI(controller, def);
+        ret = qemuValidateDomainDeviceDefControllerSCSI(controller, def,
+                                                        qemuCaps);
         break;

     case VIR_DOMAIN_CONTROLLER_TYPE_PCI:
-- 
2.48.1




[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]

  Powered by Linux