[libvirt] [PATCH] virtio-scsi: Add virtqueue_size parameter for qemu

Klim Kireev posted 1 patch 6 years, 1 month ago
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/libvirt tags/patchew/20180228192028.6569-1-klim.kireev@virtuozzo.com
Test syntax-check passed
docs/formatdomain.html.in |  6 ++++++
src/conf/domain_conf.c    | 12 ++++++++++++
src/conf/domain_conf.h    |  1 +
src/qemu/qemu_command.c   |  3 +++
4 files changed, 22 insertions(+)
[libvirt] [PATCH] virtio-scsi: Add virtqueue_size parameter for qemu
Posted by Klim Kireev 6 years, 1 month ago
In QEMU commit 5c0919d02066c3d0eb896c33265ad90101a6a84a
adds new option virtqueue_size. This Patch allows this option
to be set in libvirt.
---
 docs/formatdomain.html.in |  6 ++++++
 src/conf/domain_conf.c    | 12 ++++++++++++
 src/conf/domain_conf.h    |  1 +
 src/qemu/qemu_command.c   |  3 +++
 4 files changed, 22 insertions(+)

diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index 6fd2189cd..2f33b5e70 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -3867,6 +3867,12 @@
         host.
         <span class="since">Since 1.2.7 (QEMU and KVM only)</span>
       </dd>
+      <dt><code>virtqueue_size</code></dt>
+      <dd>
+        The optional <code>virtqueue_size</code> attribute specifies the size of
+        virtio queue.
+        <span class="since">Since 3.7.0 (QEMU and KVM only)</span>
+      </dd>
       <dt><code>max_sectors</code></dt>
       <dd>
         The optional <code>max_sectors</code> attribute specifies the maximum
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index d96b012b9..36a4deea2 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -9976,6 +9976,7 @@ virDomainControllerDefParseXML(virDomainXMLOptionPtr xmlopt,
     char *model = NULL;
     char *queues = NULL;
     char *cmd_per_lun = NULL;
+    char *virtqueue_size = NULL;
     char *max_sectors = NULL;
     bool processedModel = false;
     char *modelName = NULL;
@@ -10035,6 +10036,7 @@ virDomainControllerDefParseXML(virDomainXMLOptionPtr xmlopt,
                 queues = virXMLPropString(cur, "queues");
                 cmd_per_lun = virXMLPropString(cur, "cmd_per_lun");
                 max_sectors = virXMLPropString(cur, "max_sectors");
+                virtqueue_size = virXMLPropString(cur, "virtqueue_size");
                 ioeventfd = virXMLPropString(cur, "ioeventfd");
                 iothread = virXMLPropString(cur, "iothread");
 
@@ -10089,6 +10091,12 @@ virDomainControllerDefParseXML(virDomainXMLOptionPtr xmlopt,
         goto error;
     }
 
+    if (virtqueue_size && virStrToLong_ui(virtqueue_size, NULL, 10, &def->virtqueue_size) < 0) {
+        virReportError(VIR_ERR_XML_ERROR,
+                       _("Malformed 'virtqueue_size' value '%s'"), virtqueue_size);
+        goto error;
+    }
+
     if (max_sectors && virStrToLong_ui(max_sectors, NULL, 10, &def->max_sectors) < 0) {
         virReportError(VIR_ERR_XML_ERROR,
                        _("Malformed 'max_sectors' value %s"), max_sectors);
@@ -10310,6 +10318,7 @@ virDomainControllerDefParseXML(virDomainXMLOptionPtr xmlopt,
     VIR_FREE(model);
     VIR_FREE(queues);
     VIR_FREE(cmd_per_lun);
+    VIR_FREE(virtqueue_size);
     VIR_FREE(max_sectors);
     VIR_FREE(modelName);
     VIR_FREE(chassisNr);
@@ -23293,6 +23302,9 @@ virDomainControllerDriverFormat(virBufferPtr buf,
     if (def->cmd_per_lun)
         virBufferAsprintf(&driverBuf, " cmd_per_lun='%u'", def->cmd_per_lun);
 
+    if (def->virtqueue_size)
+        virBufferAsprintf(&driverBuf, " virtqueue_size='%u'", def->virtqueue_size);
+
     if (def->max_sectors)
         virBufferAsprintf(&driverBuf, " max_sectors='%u'", def->max_sectors);
 
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 368f16f3f..141bd1aca 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -816,6 +816,7 @@ struct _virDomainControllerDef {
     int model; /* -1 == undef */
     unsigned int queues;
     unsigned int cmd_per_lun;
+    unsigned int virtqueue_size;
     unsigned int max_sectors;
     int ioeventfd; /* enum virTristateSwitch */
     unsigned int iothread; /* unused = 0, > 0 specific thread # */
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index fa0aa5d5c..9b1affd30 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -2808,6 +2808,9 @@ qemuBuildControllerDevStr(const virDomainDef *domainDef,
     if (def->queues)
         virBufferAsprintf(&buf, ",num_queues=%u", def->queues);
 
+    if (def->virtqueue_size)
+        virBufferAsprintf(&buf, ",virtqueue_size=%u", def->virtqueue_size);
+
     if (def->cmd_per_lun)
         virBufferAsprintf(&buf, ",cmd_per_lun=%u", def->cmd_per_lun);
 
-- 
2.16.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH] virtio-scsi: Add virtqueue_size parameter for qemu
Posted by Ján Tomko 6 years, 1 month ago
On Wed, Feb 28, 2018 at 10:20:28PM +0300, Klim Kireev wrote:
>In QEMU commit 5c0919d02066c3d0eb896c33265ad90101a6a84a
>adds new option virtqueue_size. This Patch allows this option
>to be set in libvirt.
>---
> docs/formatdomain.html.in |  6 ++++++
> src/conf/domain_conf.c    | 12 ++++++++++++
> src/conf/domain_conf.h    |  1 +
> src/qemu/qemu_command.c   |  3 +++
> 4 files changed, 22 insertions(+)
>

The XML parser/formatter and the QEMU command line formatter additions
can be easily tested by extending genericxml2xmltest and
qemuxml2argvtest.

>diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
>index 6fd2189cd..2f33b5e70 100644
>--- a/docs/formatdomain.html.in
>+++ b/docs/formatdomain.html.in
>@@ -3867,6 +3867,12 @@
>         host.
>         <span class="since">Since 1.2.7 (QEMU and KVM only)</span>
>       </dd>
>+      <dt><code>virtqueue_size</code></dt>
>+      <dd>
>+        The optional <code>virtqueue_size</code> attribute specifies the size of
>+        virtio queue.

Would be nice to mention why the user wants to set it (and to what
value).

Also, "queue_size" should be sufficient as the attribute name (and
increase the chance of us being able to reuse the attribute for
non-virtio controllers).

>+        <span class="since">Since 3.7.0 (QEMU and KVM only)</span>

Libvirt 4.1.0 is already frozen, so the next release where this can
be merged is 4.2.0.

>+      </dd>
>       <dt><code>max_sectors</code></dt>
>       <dd>
>         The optional <code>max_sectors</code> attribute specifies the maximum
>diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
>index d96b012b9..36a4deea2 100644
>--- a/src/conf/domain_conf.c
>+++ b/src/conf/domain_conf.c
>@@ -9976,6 +9976,7 @@ virDomainControllerDefParseXML(virDomainXMLOptionPtr xmlopt,
>     char *model = NULL;
>     char *queues = NULL;
>     char *cmd_per_lun = NULL;
>+    char *virtqueue_size = NULL;
>     char *max_sectors = NULL;
>     bool processedModel = false;
>     char *modelName = NULL;
>@@ -10035,6 +10036,7 @@ virDomainControllerDefParseXML(virDomainXMLOptionPtr xmlopt,
>                 queues = virXMLPropString(cur, "queues");
>                 cmd_per_lun = virXMLPropString(cur, "cmd_per_lun");
>                 max_sectors = virXMLPropString(cur, "max_sectors");
>+                virtqueue_size = virXMLPropString(cur, "virtqueue_size");
>                 ioeventfd = virXMLPropString(cur, "ioeventfd");
>                 iothread = virXMLPropString(cur, "iothread");
>
>@@ -10089,6 +10091,12 @@ virDomainControllerDefParseXML(virDomainXMLOptionPtr xmlopt,
>         goto error;
>     }
>
>+    if (virtqueue_size && virStrToLong_ui(virtqueue_size, NULL, 10, &def->virtqueue_size) < 0) {
>+        virReportError(VIR_ERR_XML_ERROR,
>+                       _("Malformed 'virtqueue_size' value '%s'"), virtqueue_size);
>+        goto error;
>+    }
>+
>     if (max_sectors && virStrToLong_ui(max_sectors, NULL, 10, &def->max_sectors) < 0) {
>         virReportError(VIR_ERR_XML_ERROR,
>                        _("Malformed 'max_sectors' value %s"), max_sectors);
>@@ -10310,6 +10318,7 @@ virDomainControllerDefParseXML(virDomainXMLOptionPtr xmlopt,
>     VIR_FREE(model);
>     VIR_FREE(queues);
>     VIR_FREE(cmd_per_lun);
>+    VIR_FREE(virtqueue_size);
>     VIR_FREE(max_sectors);
>     VIR_FREE(modelName);
>     VIR_FREE(chassisNr);
>@@ -23293,6 +23302,9 @@ virDomainControllerDriverFormat(virBufferPtr buf,
>     if (def->cmd_per_lun)
>         virBufferAsprintf(&driverBuf, " cmd_per_lun='%u'", def->cmd_per_lun);
>
>+    if (def->virtqueue_size)
>+        virBufferAsprintf(&driverBuf, " virtqueue_size='%u'", def->virtqueue_size);
>+
>     if (def->max_sectors)
>         virBufferAsprintf(&driverBuf, " max_sectors='%u'", def->max_sectors);
>
>diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
>index 368f16f3f..141bd1aca 100644
>--- a/src/conf/domain_conf.h
>+++ b/src/conf/domain_conf.h
>@@ -816,6 +816,7 @@ struct _virDomainControllerDef {
>     int model; /* -1 == undef */
>     unsigned int queues;
>     unsigned int cmd_per_lun;
>+    unsigned int virtqueue_size;
>     unsigned int max_sectors;
>     int ioeventfd; /* enum virTristateSwitch */
>     unsigned int iothread; /* unused = 0, > 0 specific thread # */
>diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
>index fa0aa5d5c..9b1affd30 100644
>--- a/src/qemu/qemu_command.c
>+++ b/src/qemu/qemu_command.c
>@@ -2808,6 +2808,9 @@ qemuBuildControllerDevStr(const virDomainDef *domainDef,
>     if (def->queues)
>         virBufferAsprintf(&buf, ",num_queues=%u", def->queues);
>
>+    if (def->virtqueue_size)
>+        virBufferAsprintf(&buf, ",virtqueue_size=%u", def->virtqueue_size);
>+

If this option is not supported by the QEMU binary, it would be nice to
report an error before trying to run the domain.

See src/qemu/qemu_capabilities.c and qemuDomainDeviceDefValidateController

Jan

>     if (def->cmd_per_lun)
>         virBufferAsprintf(&buf, ",cmd_per_lun=%u", def->cmd_per_lun);
>
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list