The format like this:
<vhost-user-blk-pci type='unix'>
<source type='bind' path='/tmp/vhost-blk.sock'>
<reconnect enabled='yes' timeout='5' />
</source>
<queue num='4'/>
</vhost-user-blk-pci>
Signed-off-by: Li Feng <fengli(a)smartx.com>
---
src/conf/device_conf.h | 5 +++++
src/conf/domain_conf.c | 14 ++++++++++++++
src/qemu/qemu_command.c | 7 +++++++
tests/qemuxml2argvdata/vhost-user-blk.x86_64-latest.args | 2 +-
tests/qemuxml2argvdata/vhost-user-blk.xml | 1 +
5 files changed, 28 insertions(+), 1 deletion(-)
diff --git a/src/conf/device_conf.h b/src/conf/device_conf.h
index d0854925e3..c3c722edd3 100644
--- a/src/conf/device_conf.h
+++ b/src/conf/device_conf.h
@@ -179,6 +179,11 @@ struct _virDomainDeviceInfo {
* cases we might want to prevent that from happening by
* locking the isolation group */
bool isolationGroupLocked;
+
+ /* vhost-user-scsi/blk/nvme support multiqueue, parse the queue
+ * num from xml.
+ */
+ unsigned int num_queues;
};
void virDomainDeviceInfoClear(virDomainDeviceInfoPtr info);
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index fd53fab271..eeed88e41e 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -7483,10 +7483,12 @@ virDomainDeviceInfoParseXML(virDomainXMLOptionPtr xmlopt
ATTRIBUTE_UNUSED,
xmlNodePtr alias = NULL;
xmlNodePtr boot = NULL;
xmlNodePtr rom = NULL;
+ xmlNodePtr queue = NULL;
int ret = -1;
VIR_AUTOFREE(char *) romenabled = NULL;
VIR_AUTOFREE(char *) rombar = NULL;
VIR_AUTOFREE(char *) aliasStr = NULL;
+ VIR_AUTOFREE(char *) queueStr = NULL;
virDomainDeviceInfoClear(info);
@@ -7510,6 +7512,9 @@ virDomainDeviceInfoParseXML(virDomainXMLOptionPtr xmlopt
ATTRIBUTE_UNUSED,
(flags & VIR_DOMAIN_DEF_PARSE_ALLOW_ROM) &&
virXMLNodeNameEqual(cur, "rom")) {
rom = cur;
+ } else if (queue == NULL &&
+ virXMLNodeNameEqual(cur, "queue")) {
+ queue = cur;
}
}
cur = cur->next;
@@ -7563,6 +7568,15 @@ virDomainDeviceInfoParseXML(virDomainXMLOptionPtr xmlopt
ATTRIBUTE_UNUSED,
virDomainDeviceAddressParseXML(address, info) < 0)
goto cleanup;
+ if (queue) {
+ queueStr = virXMLPropString(queue, "num");
+ if (virStrToLong_uip(queueStr, NULL, 10, &info->num_queues) < 0) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("Cannot parse <queue> 'num' attribute
'%s'"), queueStr);
+
+ goto cleanup;
+ }
+ }
ret = 0;
cleanup:
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 336ca3f729..7a3c695ac1 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -10737,6 +10737,13 @@ qemuBuildVhostUserChrDeviceStr(char **deviceStr,
virBufferAsprintf(&buf, "%s,chardev=char%s,id=%s",
device_type,
vhostuser->info.alias, vhostuser->info.alias);
+ if (vhostuser->info.num_queues > 0) {
+ if ((virDomainChrDeviceType)vhostuser->deviceType ==
VIR_DOMAIN_CHR_DEVICE_TYPE_VHOST_USER_SCSI) {
+ virBufferAsprintf(&buf, ",num_queues=%d",
vhostuser->info.num_queues);
+ } else if ((virDomainChrDeviceType)vhostuser->deviceType ==
VIR_DOMAIN_CHR_DEVICE_TYPE_VHOST_USER_BLK) {
+ virBufferAsprintf(&buf, ",num-queues=%d",
vhostuser->info.num_queues);
+ }
+ }
if (qemuBuildDeviceAddressStr(&buf, def, &vhostuser->info, qemuCaps) <
0)
return -1;
diff --git a/tests/qemuxml2argvdata/vhost-user-blk.x86_64-latest.args
b/tests/qemuxml2argvdata/vhost-user-blk.x86_64-latest.args
index 4c67be1863..ea99f5949d 100644
--- a/tests/qemuxml2argvdata/vhost-user-blk.x86_64-latest.args
+++ b/tests/qemuxml2argvdata/vhost-user-blk.x86_64-latest.args
@@ -31,7 +31,7 @@ file=/tmp/lib/domain--1-test/master-key.aes \
-chardev socket,id=charvhost-user-blk-disk0,path=/tmp/vhost-blk.sock,\
reconnect=1 \
-device vhost-user-blk-pci,chardev=charvhost-user-blk-disk0,\
-id=vhost-user-blk-disk0 \
+id=vhost-user-blk-disk0,num-queues=4 \
-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\
resourcecontrol=deny \
-msg timestamp=on
diff --git a/tests/qemuxml2argvdata/vhost-user-blk.xml
b/tests/qemuxml2argvdata/vhost-user-blk.xml
index c9ff7650cb..276fea14b5 100644
--- a/tests/qemuxml2argvdata/vhost-user-blk.xml
+++ b/tests/qemuxml2argvdata/vhost-user-blk.xml
@@ -32,6 +32,7 @@
<source type='bind' path='/tmp/vhost-blk.sock'>
<reconnect enabled='yes' timeout='1' />
</source>
+ <queue num='4'/>
</vhost-user-blk-pci>
</devices>
</domain>
--
2.11.0
--
The SmartX email address is only for business purpose. Any sent message
that is not related to the business is not authorized or permitted by
SmartX.
本邮箱为北京志凌海纳科技有限公司(SmartX)工作邮箱. 如本邮箱发出的邮件与工作无关,该邮件未得到本公司任何的明示或默示的授权.