[libvirt] [PATCH v2 0/5] Support rng backend model builtin

https://bugzilla.redhat.com/show_bug.cgi?id=1785091 Implement 'rng-builtin' backend from QEMU. This feature is introduced to QEMU since v4.2. It uses getrandom() to get random, no external random source needed. github repo: https://github.com/qiankehan/libvirt/tree/rng-builtin_v2 Changes from v1: - Fix failures in 'make check' and 'make syntax-check' - Adjust the structure of patches v1: https://www.redhat.com/archives/libvir-list/2020-January/msg00000.html Han Han (5): qemu_capabilities: Introduce QEMU_CAPS_OBJECT_RNG_BUILTIN util: Do not assume comma after object id conf: Add rng backend model builtin qemu: Implement builtin rng backend news: Update news for rng backend type builtin docs/formatdomain.html.in | 10 ++++++ docs/formatdomaincaps.html.in | 1 + docs/news.xml | 10 ++++++ docs/schemas/domaincommon.rng | 6 ++++ src/conf/domain_audit.c | 2 ++ src/conf/domain_conf.c | 9 +++++ src/conf/domain_conf.h | 1 + src/qemu/qemu_capabilities.c | 4 +++ src/qemu/qemu_capabilities.h | 1 + src/qemu/qemu_command.c | 15 ++++++++ src/qemu/qemu_domain.c | 3 ++ src/util/virqemu.c | 12 ++++--- .../domaincapsdata/qemu_4.2.0-q35.x86_64.xml | 1 + .../domaincapsdata/qemu_4.2.0-tcg.x86_64.xml | 1 + .../qemu_4.2.0-virt.aarch64.xml | 1 + tests/domaincapsdata/qemu_4.2.0.aarch64.xml | 1 + tests/domaincapsdata/qemu_4.2.0.ppc64.xml | 1 + tests/domaincapsdata/qemu_4.2.0.s390x.xml | 1 + tests/domaincapsdata/qemu_4.2.0.x86_64.xml | 1 + .../caps_4.2.0.aarch64.xml | 1 + .../qemucapabilitiesdata/caps_4.2.0.ppc64.xml | 1 + .../qemucapabilitiesdata/caps_4.2.0.s390x.xml | 1 + .../caps_4.2.0.x86_64.xml | 1 + .../virtio-rng-builtin.x86_64-latest.args | 35 +++++++++++++++++++ tests/qemuxml2argvdata/virtio-rng-builtin.xml | 26 ++++++++++++++ tests/qemuxml2argvtest.c | 1 + .../virtio-rng-builtin.x86_64-latest.xml | 31 ++++++++++++++++ tests/qemuxml2xmltest.c | 1 + 28 files changed, 174 insertions(+), 5 deletions(-) create mode 100644 tests/qemuxml2argvdata/virtio-rng-builtin.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/virtio-rng-builtin.xml create mode 100644 tests/qemuxml2xmloutdata/virtio-rng-builtin.x86_64-latest.xml -- 2.24.0.rc1

It is used to check if qemu is capable of rng-builtin object. This object is added since qemu-4.2.0-rc0, commit 6c4e9d48. Signed-off-by: Han Han <hhan@redhat.com> --- src/qemu/qemu_capabilities.c | 2 ++ src/qemu/qemu_capabilities.h | 1 + tests/qemucapabilitiesdata/caps_4.2.0.aarch64.xml | 1 + tests/qemucapabilitiesdata/caps_4.2.0.ppc64.xml | 1 + tests/qemucapabilitiesdata/caps_4.2.0.s390x.xml | 1 + tests/qemucapabilitiesdata/caps_4.2.0.x86_64.xml | 1 + 6 files changed, 7 insertions(+) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index da0c7a257f..8d7b9e368a 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -553,6 +553,7 @@ VIR_ENUM_IMPL(virQEMUCaps, "blockdev-file-dynamic-auto-read-only", "savevm-monitor-nodes", "drive-nvme", + "rng-builtin", ); @@ -1244,6 +1245,7 @@ struct virQEMUCapsStringFlags virQEMUCapsObjectTypes[] = { { "vhost-user-vga", QEMU_CAPS_DEVICE_VHOST_USER_VGA }, { "ramfb", QEMU_CAPS_DEVICE_RAMFB }, { "max-arm-cpu", QEMU_CAPS_ARM_MAX_CPU }, + { "rng-builtin", QEMU_CAPS_OBJECT_RNG_BUILTIN }, }; static struct virQEMUCapsStringFlags virQEMUCapsDevicePropsVirtioBalloon[] = { diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h index 193c19fc81..f25b60a2b3 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -534,6 +534,7 @@ typedef enum { /* virQEMUCapsFlags grouping marker for syntax-check */ QEMU_CAPS_BLOCK_FILE_AUTO_READONLY_DYNAMIC, /* the auto-read-only property of block backends for files is dynamic */ QEMU_CAPS_SAVEVM_MONITOR_NODES, /* 'savevm' handles monitor-owned nodes properly */ QEMU_CAPS_DRIVE_NVME, /* -drive file.driver=nvme */ + QEMU_CAPS_OBJECT_RNG_BUILTIN, /* -object rng-builtin */ QEMU_CAPS_LAST /* this must always be the last item */ } virQEMUCapsFlags; diff --git a/tests/qemucapabilitiesdata/caps_4.2.0.aarch64.xml b/tests/qemucapabilitiesdata/caps_4.2.0.aarch64.xml index a6469073fd..b436367068 100644 --- a/tests/qemucapabilitiesdata/caps_4.2.0.aarch64.xml +++ b/tests/qemucapabilitiesdata/caps_4.2.0.aarch64.xml @@ -175,6 +175,7 @@ <flag name='blockdev-file-dynamic-auto-read-only'/> <flag name='savevm-monitor-nodes'/> <flag name='drive-nvme'/> + <flag name='rng-builtin'/> <version>4001050</version> <kvmVersion>0</kvmVersion> <microcodeVersion>61700242</microcodeVersion> diff --git a/tests/qemucapabilitiesdata/caps_4.2.0.ppc64.xml b/tests/qemucapabilitiesdata/caps_4.2.0.ppc64.xml index ee9fb23640..9b22e3feb2 100644 --- a/tests/qemucapabilitiesdata/caps_4.2.0.ppc64.xml +++ b/tests/qemucapabilitiesdata/caps_4.2.0.ppc64.xml @@ -176,6 +176,7 @@ <flag name='machine.pseries.cap-ccf-assist'/> <flag name='blockdev-file-dynamic-auto-read-only'/> <flag name='drive-nvme'/> + <flag name='rng-builtin'/> <version>4001050</version> <kvmVersion>0</kvmVersion> <microcodeVersion>42900242</microcodeVersion> diff --git a/tests/qemucapabilitiesdata/caps_4.2.0.s390x.xml b/tests/qemucapabilitiesdata/caps_4.2.0.s390x.xml index fdf5cb4ce9..4c13f67262 100644 --- a/tests/qemucapabilitiesdata/caps_4.2.0.s390x.xml +++ b/tests/qemucapabilitiesdata/caps_4.2.0.s390x.xml @@ -135,6 +135,7 @@ <flag name='query-cpu-model-comparison'/> <flag name='blockdev-file-dynamic-auto-read-only'/> <flag name='drive-nvme'/> + <flag name='rng-builtin'/> <version>4001050</version> <kvmVersion>0</kvmVersion> <microcodeVersion>39100242</microcodeVersion> diff --git a/tests/qemucapabilitiesdata/caps_4.2.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_4.2.0.x86_64.xml index 4857e2f5a5..93de5c37e8 100644 --- a/tests/qemucapabilitiesdata/caps_4.2.0.x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_4.2.0.x86_64.xml @@ -218,6 +218,7 @@ <flag name='blockdev-file-dynamic-auto-read-only'/> <flag name='savevm-monitor-nodes'/> <flag name='drive-nvme'/> + <flag name='rng-builtin'/> <version>4002000</version> <kvmVersion>0</kvmVersion> <microcodeVersion>43100242</microcodeVersion> -- 2.24.0.rc1

For qemu object like rng-builtin, there are no properties after id property. We should always set comma after object id. Otherwise it will cause trailing comma on object: -object rng-builtin,id=ID, Signed-off-by: Han Han <hhan@redhat.com> --- src/util/virqemu.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/util/virqemu.c b/src/util/virqemu.c index f3a233af3d..8d0429625d 100644 --- a/src/util/virqemu.c +++ b/src/util/virqemu.c @@ -239,12 +239,14 @@ virQEMUBuildObjectCommandlineFromJSONInternal(virBufferPtr buf, return -1; } - virBufferAsprintf(buf, "%s,id=%s,", type, alias); + virBufferAsprintf(buf, "%s,id=%s", type, alias); - if (props && - virQEMUBuildCommandLineJSON(props, buf, - virQEMUBuildCommandLineJSONArrayBitmap) < 0) - return -1; + if (props) { + virBufferAddLit(buf, ","); + if (virQEMUBuildCommandLineJSON(props, buf, + virQEMUBuildCommandLineJSONArrayBitmap) < 0) + return -1; + } return 0; } -- 2.24.0.rc1

The 'builtin' rng backend model can be used as following: <rng model='virtio'> <backend model='builtin'/> </rng> Signed-off-by: Han Han <hhan@redhat.com> --- docs/formatdomain.html.in | 10 ++++++++++ docs/formatdomaincaps.html.in | 1 + docs/schemas/domaincommon.rng | 6 ++++++ src/conf/domain_audit.c | 2 ++ src/conf/domain_conf.c | 9 +++++++++ src/conf/domain_conf.h | 1 + 6 files changed, 29 insertions(+) diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in index 3040448df1..9621b5f120 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -8257,6 +8257,8 @@ qemu-kvm -net nic,model=? /dev/null <source mode='bind' service='1234'/> <source mode='connect' host='1.2.3.4' service='1234'/> </backend> + <!-- OR --> + <backend model='builtin'/> </rng> </devices> ... @@ -8321,6 +8323,14 @@ qemu-kvm -net nic,model=? /dev/null for more information. </p> </dd> + <dt><code>builtin</code></dt> + <dd> + <p> + This backend uses qemu builtin random generator, which uses + getrandom() syscall to generate random. + (<span class="since">Since 6.0.0 and QEMU 4.2</span>) + </p> + </dd> </dl> </dd> <dt><code>driver</code></dt> diff --git a/docs/formatdomaincaps.html.in b/docs/formatdomaincaps.html.in index 6bf7a1c17a..aa4dece220 100644 --- a/docs/formatdomaincaps.html.in +++ b/docs/formatdomaincaps.html.in @@ -481,6 +481,7 @@ <enum name='backendModel'> <value>random</value> <value>egd</value> + <value>builtin</value> </enum> </rng> ... diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index 9b555d6acb..bbcf6ce896 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -5681,6 +5681,12 @@ <ref name="qemucdevSrcType"/> <ref name="qemucdevSrcDef"/> </group> + <group> + <attribute name="model"> + <value>builtin</value> + </attribute> + <empty/> + </group> </choice> </element> </define> diff --git a/src/conf/domain_audit.c b/src/conf/domain_audit.c index fdccc585fb..138f270129 100644 --- a/src/conf/domain_audit.c +++ b/src/conf/domain_audit.c @@ -227,6 +227,7 @@ virDomainAuditRNG(virDomainObjPtr vm, newsrcpath = virDomainChrSourceDefGetPath(newDef->source.chardev); break; + case VIR_DOMAIN_RNG_BACKEND_BUILTIN: case VIR_DOMAIN_RNG_BACKEND_LAST: break; } @@ -242,6 +243,7 @@ virDomainAuditRNG(virDomainObjPtr vm, oldsrcpath = virDomainChrSourceDefGetPath(oldDef->source.chardev); break; + case VIR_DOMAIN_RNG_BACKEND_BUILTIN: case VIR_DOMAIN_RNG_BACKEND_LAST: break; } diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 6b05d06481..dc0c8997bc 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -1112,6 +1112,7 @@ VIR_ENUM_IMPL(virDomainRNGBackend, VIR_DOMAIN_RNG_BACKEND_LAST, "random", "egd", + "builtin", ); VIR_ENUM_IMPL(virDomainTPMModel, @@ -14783,6 +14784,7 @@ virDomainRNGDefParseXML(virDomainXMLOptionPtr xmlopt, goto error; break; + case VIR_DOMAIN_RNG_BACKEND_BUILTIN: case VIR_DOMAIN_RNG_BACKEND_LAST: break; } @@ -17709,6 +17711,7 @@ virDomainRNGFind(virDomainDefPtr def, continue; break; + case VIR_DOMAIN_RNG_BACKEND_BUILTIN: case VIR_DOMAIN_RNG_BACKEND_LAST: break; } @@ -26386,6 +26389,11 @@ virDomainRNGDefFormat(virBufferPtr buf, return -1; virBufferAdjustIndent(buf, -2); virBufferAddLit(buf, "</backend>\n"); + break; + + case VIR_DOMAIN_RNG_BACKEND_BUILTIN: + virBufferAddLit(buf, "/>\n"); + break; case VIR_DOMAIN_RNG_BACKEND_LAST: break; @@ -26417,6 +26425,7 @@ virDomainRNGDefFree(virDomainRNGDefPtr def) case VIR_DOMAIN_RNG_BACKEND_EGD: virObjectUnref(def->source.chardev); break; + case VIR_DOMAIN_RNG_BACKEND_BUILTIN: case VIR_DOMAIN_RNG_BACKEND_LAST: break; } diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index e6b06a8eba..17d7ad9229 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -2103,6 +2103,7 @@ typedef enum { typedef enum { VIR_DOMAIN_RNG_BACKEND_RANDOM, VIR_DOMAIN_RNG_BACKEND_EGD, + VIR_DOMAIN_RNG_BACKEND_BUILTIN, VIR_DOMAIN_RNG_BACKEND_LAST } virDomainRNGBackend; -- 2.24.0.rc1

On 1/9/20 9:00 AM, Han Han wrote:
The 'builtin' rng backend model can be used as following: <rng model='virtio'> <backend model='builtin'/> </rng>
Signed-off-by: Han Han <hhan@redhat.com> --- docs/formatdomain.html.in | 10 ++++++++++ docs/formatdomaincaps.html.in | 1 + docs/schemas/domaincommon.rng | 6 ++++++ src/conf/domain_audit.c | 2 ++ src/conf/domain_conf.c | 9 +++++++++ src/conf/domain_conf.h | 1 + 6 files changed, 29 insertions(+)
diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in index 3040448df1..9621b5f120 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -8257,6 +8257,8 @@ qemu-kvm -net nic,model=? /dev/null <source mode='bind' service='1234'/> <source mode='connect' host='1.2.3.4' service='1234'/> </backend> + <!-- OR --> + <backend model='builtin'/> </rng> </devices> ... @@ -8321,6 +8323,14 @@ qemu-kvm -net nic,model=? /dev/null for more information. </p> </dd> + <dt><code>builtin</code></dt> + <dd> + <p> + This backend uses qemu builtin random generator, which uses + getrandom() syscall to generate random. + (<span class="since">Since 6.0.0 and QEMU 4.2</span>)
I'm rewording this a bit. Also, sorry for missing this in 6.0.0.
+ </p> + </dd> </dl> </dd> <dt><code>driver</code></dt> diff --git a/docs/formatdomaincaps.html.in b/docs/formatdomaincaps.html.in index 6bf7a1c17a..aa4dece220 100644 --- a/docs/formatdomaincaps.html.in +++ b/docs/formatdomaincaps.html.in @@ -481,6 +481,7 @@ <enum name='backendModel'> <value>random</value> <value>egd</value> + <value>builtin</value> </enum> </rng> ... diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index 9b555d6acb..bbcf6ce896 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -5681,6 +5681,12 @@ <ref name="qemucdevSrcType"/> <ref name="qemucdevSrcDef"/> </group> + <group> + <attribute name="model"> + <value>builtin</value> + </attribute> + <empty/> + </group> </choice> </element> </define> diff --git a/src/conf/domain_audit.c b/src/conf/domain_audit.c index fdccc585fb..138f270129 100644 --- a/src/conf/domain_audit.c +++ b/src/conf/domain_audit.c @@ -227,6 +227,7 @@ virDomainAuditRNG(virDomainObjPtr vm, newsrcpath = virDomainChrSourceDefGetPath(newDef->source.chardev); break;
+ case VIR_DOMAIN_RNG_BACKEND_BUILTIN: case VIR_DOMAIN_RNG_BACKEND_LAST: break; }
There are more places that need this case. I'll fix it before pushing. Michal

Since v4.2-rc0, QEMU introduced a builtin rng backend that uses getrandom() syscall to generate random. Add it to libvirt with the backend model 'builtin'. https://bugzilla.redhat.com/show_bug.cgi?id=1785091 Signed-off-by: Han Han <hhan@redhat.com> --- src/qemu/qemu_capabilities.c | 2 ++ src/qemu/qemu_command.c | 15 ++++++++ src/qemu/qemu_domain.c | 3 ++ .../domaincapsdata/qemu_4.2.0-q35.x86_64.xml | 1 + .../domaincapsdata/qemu_4.2.0-tcg.x86_64.xml | 1 + .../qemu_4.2.0-virt.aarch64.xml | 1 + tests/domaincapsdata/qemu_4.2.0.aarch64.xml | 1 + tests/domaincapsdata/qemu_4.2.0.ppc64.xml | 1 + tests/domaincapsdata/qemu_4.2.0.s390x.xml | 1 + tests/domaincapsdata/qemu_4.2.0.x86_64.xml | 1 + .../virtio-rng-builtin.x86_64-latest.args | 35 +++++++++++++++++++ tests/qemuxml2argvdata/virtio-rng-builtin.xml | 26 ++++++++++++++ tests/qemuxml2argvtest.c | 1 + .../virtio-rng-builtin.x86_64-latest.xml | 31 ++++++++++++++++ tests/qemuxml2xmltest.c | 1 + 15 files changed, 121 insertions(+) create mode 100644 tests/qemuxml2argvdata/virtio-rng-builtin.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/virtio-rng-builtin.xml create mode 100644 tests/qemuxml2xmloutdata/virtio-rng-builtin.x86_64-latest.xml diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 8d7b9e368a..fe2122f320 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -5716,6 +5716,8 @@ virQEMUCapsFillDomainDeviceRNGCaps(virQEMUCapsPtr qemuCaps, VIR_DOMAIN_CAPS_ENUM_SET(rng->backendModel, VIR_DOMAIN_RNG_BACKEND_EGD); if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_RNG_RANDOM)) VIR_DOMAIN_CAPS_ENUM_SET(rng->backendModel, VIR_DOMAIN_RNG_BACKEND_RANDOM); + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_RNG_BUILTIN)) + VIR_DOMAIN_CAPS_ENUM_SET(rng->backendModel, VIR_DOMAIN_RNG_BACKEND_BUILTIN); } diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index d0b1f34058..84529af596 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -5569,6 +5569,7 @@ qemuBuildRNGBackendChrdevStr(virLogManagerPtr logManager, switch ((virDomainRNGBackend) rng->backend) { case VIR_DOMAIN_RNG_BACKEND_RANDOM: + case VIR_DOMAIN_RNG_BACKEND_BUILTIN: case VIR_DOMAIN_RNG_BACKEND_LAST: /* no chardev backend is needed */ return 0; @@ -5630,6 +5631,20 @@ qemuBuildRNGBackendProps(virDomainRNGDefPtr rng, break; + case VIR_DOMAIN_RNG_BACKEND_BUILTIN: + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_RNG_BUILTIN)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("this qemu doesn't support the rng-builtin " + "backend")); + return -1; + } + + if (qemuMonitorCreateObjectProps(props, "rng-builtin", objAlias, + NULL) < 0) + return -1; + + break; + case VIR_DOMAIN_RNG_BACKEND_LAST: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("unknown rng-random backend")); diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 2ec23bb52f..a5ca73e41f 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -14794,6 +14794,7 @@ qemuDomainSetupRNG(virQEMUDriverConfigPtr cfg G_GNUC_UNUSED, return -1; case VIR_DOMAIN_RNG_BACKEND_EGD: + case VIR_DOMAIN_RNG_BACKEND_BUILTIN: case VIR_DOMAIN_RNG_BACKEND_LAST: /* nada */ break; @@ -15773,6 +15774,7 @@ qemuDomainNamespaceSetupRNG(virDomainObjPtr vm, break; case VIR_DOMAIN_RNG_BACKEND_EGD: + case VIR_DOMAIN_RNG_BACKEND_BUILTIN: case VIR_DOMAIN_RNG_BACKEND_LAST: break; } @@ -15796,6 +15798,7 @@ qemuDomainNamespaceTeardownRNG(virDomainObjPtr vm, break; case VIR_DOMAIN_RNG_BACKEND_EGD: + case VIR_DOMAIN_RNG_BACKEND_BUILTIN: case VIR_DOMAIN_RNG_BACKEND_LAST: break; } diff --git a/tests/domaincapsdata/qemu_4.2.0-q35.x86_64.xml b/tests/domaincapsdata/qemu_4.2.0-q35.x86_64.xml index c4c6bfb564..eaa3b75695 100644 --- a/tests/domaincapsdata/qemu_4.2.0-q35.x86_64.xml +++ b/tests/domaincapsdata/qemu_4.2.0-q35.x86_64.xml @@ -167,6 +167,7 @@ <enum name='backendModel'> <value>random</value> <value>egd</value> + <value>builtin</value> </enum> </rng> </devices> diff --git a/tests/domaincapsdata/qemu_4.2.0-tcg.x86_64.xml b/tests/domaincapsdata/qemu_4.2.0-tcg.x86_64.xml index a7f8d9c5ee..af482e3821 100644 --- a/tests/domaincapsdata/qemu_4.2.0-tcg.x86_64.xml +++ b/tests/domaincapsdata/qemu_4.2.0-tcg.x86_64.xml @@ -178,6 +178,7 @@ <enum name='backendModel'> <value>random</value> <value>egd</value> + <value>builtin</value> </enum> </rng> </devices> diff --git a/tests/domaincapsdata/qemu_4.2.0-virt.aarch64.xml b/tests/domaincapsdata/qemu_4.2.0-virt.aarch64.xml index e5954717cc..908406bf11 100644 --- a/tests/domaincapsdata/qemu_4.2.0-virt.aarch64.xml +++ b/tests/domaincapsdata/qemu_4.2.0-virt.aarch64.xml @@ -136,6 +136,7 @@ <enum name='backendModel'> <value>random</value> <value>egd</value> + <value>builtin</value> </enum> </rng> </devices> diff --git a/tests/domaincapsdata/qemu_4.2.0.aarch64.xml b/tests/domaincapsdata/qemu_4.2.0.aarch64.xml index bb02b1d850..c66550cec5 100644 --- a/tests/domaincapsdata/qemu_4.2.0.aarch64.xml +++ b/tests/domaincapsdata/qemu_4.2.0.aarch64.xml @@ -134,6 +134,7 @@ <enum name='backendModel'> <value>random</value> <value>egd</value> + <value>builtin</value> </enum> </rng> </devices> diff --git a/tests/domaincapsdata/qemu_4.2.0.ppc64.xml b/tests/domaincapsdata/qemu_4.2.0.ppc64.xml index 6d3ada3735..7906482eee 100644 --- a/tests/domaincapsdata/qemu_4.2.0.ppc64.xml +++ b/tests/domaincapsdata/qemu_4.2.0.ppc64.xml @@ -100,6 +100,7 @@ <enum name='backendModel'> <value>random</value> <value>egd</value> + <value>builtin</value> </enum> </rng> </devices> diff --git a/tests/domaincapsdata/qemu_4.2.0.s390x.xml b/tests/domaincapsdata/qemu_4.2.0.s390x.xml index c6d92542c3..0cdfd4352e 100644 --- a/tests/domaincapsdata/qemu_4.2.0.s390x.xml +++ b/tests/domaincapsdata/qemu_4.2.0.s390x.xml @@ -191,6 +191,7 @@ <enum name='backendModel'> <value>random</value> <value>egd</value> + <value>builtin</value> </enum> </rng> </devices> diff --git a/tests/domaincapsdata/qemu_4.2.0.x86_64.xml b/tests/domaincapsdata/qemu_4.2.0.x86_64.xml index f0e0f182a4..c82d12d3ce 100644 --- a/tests/domaincapsdata/qemu_4.2.0.x86_64.xml +++ b/tests/domaincapsdata/qemu_4.2.0.x86_64.xml @@ -167,6 +167,7 @@ <enum name='backendModel'> <value>random</value> <value>egd</value> + <value>builtin</value> </enum> </rng> </devices> diff --git a/tests/qemuxml2argvdata/virtio-rng-builtin.x86_64-latest.args b/tests/qemuxml2argvdata/virtio-rng-builtin.x86_64-latest.args new file mode 100644 index 0000000000..e55117728c --- /dev/null +++ b/tests/qemuxml2argvdata/virtio-rng-builtin.x86_64-latest.args @@ -0,0 +1,35 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/tmp/lib/domain--1-QEMUGuest1 \ +USER=test \ +LOGNAME=test \ +XDG_DATA_HOME=/tmp/lib/domain--1-QEMUGuest1/.local/share \ +XDG_CACHE_HOME=/tmp/lib/domain--1-QEMUGuest1/.cache \ +XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \ +QEMU_AUDIO_DRV=none \ +/usr/bin/qemu-system-x86_64 \ +-name guest=QEMUGuest1,debug-threads=on \ +-S \ +-object secret,id=masterKey0,format=raw,\ +file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \ +-machine pc,accel=kvm,usb=off,dump-guest-core=off \ +-m 214 \ +-overcommit mem-lock=off \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server,nowait \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-no-acpi \ +-boot strict=on \ +-device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \ +-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x2 \ +-object rng-builtin,id=objrng0 \ +-device virtio-rng-pci,rng=objrng0,id=rng0,bus=pci.0,addr=0x3 \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\ +resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxml2argvdata/virtio-rng-builtin.xml b/tests/qemuxml2argvdata/virtio-rng-builtin.xml new file mode 100644 index 0000000000..0a03eafc4b --- /dev/null +++ b/tests/qemuxml2argvdata/virtio-rng-builtin.xml @@ -0,0 +1,26 @@ +<domain type='kvm'> + <name>QEMUGuest1</name> + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid> + <memory unit='KiB'>219100</memory> + <currentMemory unit='KiB'>219100</currentMemory> + <vcpu>1</vcpu> + <os> + <type arch='x86_64' machine='pc'>hvm</type> + <boot dev='hd'/> + </os> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <emulator>/usr/bin/qemu-system-x86_64</emulator> + <controller type='usb' index='0'/> + <controller type='pci' index='0' model='pci-root'/> + <input type='mouse' bus='ps2'/> + <input type='keyboard' bus='ps2'/> + <memballoon model='virtio'/> + <rng model='virtio'> + <backend model='builtin'/> + </rng> + </devices> +</domain> diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 8af2ba38d3..44c86a8938 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -2119,6 +2119,7 @@ mymain(void) DO_TEST("virtio-rng-egd", QEMU_CAPS_DEVICE_VIRTIO_RNG, QEMU_CAPS_OBJECT_RNG_EGD); + DO_TEST_CAPS_LATEST("virtio-rng-builtin"); DO_TEST_CAPS_VER("virtio-rng-egd-unix", "2.5.0"); DO_TEST_CAPS_LATEST("virtio-rng-egd-unix"); DO_TEST("virtio-rng-multiple", diff --git a/tests/qemuxml2xmloutdata/virtio-rng-builtin.x86_64-latest.xml b/tests/qemuxml2xmloutdata/virtio-rng-builtin.x86_64-latest.xml new file mode 100644 index 0000000000..9ff57c4ad6 --- /dev/null +++ b/tests/qemuxml2xmloutdata/virtio-rng-builtin.x86_64-latest.xml @@ -0,0 +1,31 @@ +<domain type='kvm'> + <name>QEMUGuest1</name> + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid> + <memory unit='KiB'>219100</memory> + <currentMemory unit='KiB'>219100</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='x86_64' machine='pc'>hvm</type> + <boot dev='hd'/> + </os> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <emulator>/usr/bin/qemu-system-x86_64</emulator> + <controller type='usb' index='0' model='piix3-uhci'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/> + </controller> + <controller type='pci' index='0' model='pci-root'/> + <input type='mouse' bus='ps2'/> + <input type='keyboard' bus='ps2'/> + <memballoon model='virtio'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/> + </memballoon> + <rng model='virtio'> + <backend model='builtin'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> + </rng> + </devices> +</domain> diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c index 262fc835f5..faa9c097fb 100644 --- a/tests/qemuxml2xmltest.c +++ b/tests/qemuxml2xmltest.c @@ -629,6 +629,7 @@ mymain(void) QEMU_CAPS_DEVICE_VIRTIO_RNG); DO_TEST("virtio-rng-egd", QEMU_CAPS_DEVICE_VIRTIO_RNG); + DO_TEST_CAPS_LATEST("virtio-rng-builtin"); DO_TEST("pseries-nvram", QEMU_CAPS_DEVICE_SPAPR_PCI_HOST_BRIDGE, -- 2.24.0.rc1

Signed-off-by: Han Han <hhan@redhat.com> --- docs/news.xml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/docs/news.xml b/docs/news.xml index 1af57f8af0..d10a8b7936 100644 --- a/docs/news.xml +++ b/docs/news.xml @@ -68,6 +68,16 @@ guest. </description> </change> + <change> + <summary> + qemu: new rng backend type: builtin + </summary> + <description> + It implements qemu builtin rng backend. That uses getrandom syscall + to generate random, no external rng source needed. Available since + QEMU 4.2. + </description> + </change> </section> <section title="Improvements"> <change> -- 2.24.0.rc1

On 1/9/20 9:00 AM, Han Han wrote:
https://bugzilla.redhat.com/show_bug.cgi?id=1785091
Implement 'rng-builtin' backend from QEMU. This feature is introduced to QEMU since v4.2. It uses getrandom() to get random, no external random source needed.
github repo: https://github.com/qiankehan/libvirt/tree/rng-builtin_v2 Changes from v1: - Fix failures in 'make check' and 'make syntax-check' - Adjust the structure of patches
v1: https://www.redhat.com/archives/libvir-list/2020-January/msg00000.html
Han Han (5): qemu_capabilities: Introduce QEMU_CAPS_OBJECT_RNG_BUILTIN util: Do not assume comma after object id conf: Add rng backend model builtin qemu: Implement builtin rng backend news: Update news for rng backend type builtin
docs/formatdomain.html.in | 10 ++++++ docs/formatdomaincaps.html.in | 1 + docs/news.xml | 10 ++++++ docs/schemas/domaincommon.rng | 6 ++++ src/conf/domain_audit.c | 2 ++ src/conf/domain_conf.c | 9 +++++ src/conf/domain_conf.h | 1 + src/qemu/qemu_capabilities.c | 4 +++ src/qemu/qemu_capabilities.h | 1 + src/qemu/qemu_command.c | 15 ++++++++ src/qemu/qemu_domain.c | 3 ++ src/util/virqemu.c | 12 ++++--- .../domaincapsdata/qemu_4.2.0-q35.x86_64.xml | 1 + .../domaincapsdata/qemu_4.2.0-tcg.x86_64.xml | 1 + .../qemu_4.2.0-virt.aarch64.xml | 1 + tests/domaincapsdata/qemu_4.2.0.aarch64.xml | 1 + tests/domaincapsdata/qemu_4.2.0.ppc64.xml | 1 + tests/domaincapsdata/qemu_4.2.0.s390x.xml | 1 + tests/domaincapsdata/qemu_4.2.0.x86_64.xml | 1 + .../caps_4.2.0.aarch64.xml | 1 + .../qemucapabilitiesdata/caps_4.2.0.ppc64.xml | 1 + .../qemucapabilitiesdata/caps_4.2.0.s390x.xml | 1 + .../caps_4.2.0.x86_64.xml | 1 + .../virtio-rng-builtin.x86_64-latest.args | 35 +++++++++++++++++++ tests/qemuxml2argvdata/virtio-rng-builtin.xml | 26 ++++++++++++++ tests/qemuxml2argvtest.c | 1 + .../virtio-rng-builtin.x86_64-latest.xml | 31 ++++++++++++++++ tests/qemuxml2xmltest.c | 1 + 28 files changed, 174 insertions(+), 5 deletions(-) create mode 100644 tests/qemuxml2argvdata/virtio-rng-builtin.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/virtio-rng-builtin.xml create mode 100644 tests/qemuxml2xmloutdata/virtio-rng-builtin.x86_64-latest.xml
Sorry for delayed response. I've rebased onto current master and pushed. Reviewed-by: Michal Privoznik <mprivozn@redhat.com> Michal
participants (2)
-
Han Han
-
Michal Privoznik