[libvirt] [PATCH 3/7] qemu: Implement builtin rng backend

Han Han posted 7 patches 6 years, 1 month ago
[libvirt] [PATCH 3/7] qemu: Implement builtin rng backend
Posted by Han Han 6 years, 1 month ago
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/conf/domain_audit.c |  2 ++
 src/conf/domain_conf.c  |  9 +++++++++
 src/conf/domain_conf.h  |  1 +
 src/qemu/qemu_command.c | 15 +++++++++++++++
 src/qemu/qemu_domain.c  |  3 +++
 5 files changed, 30 insertions(+)

diff --git a/src/conf/domain_audit.c b/src/conf/domain_audit.c
index fdccc585..138f2701 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 afa072e1..76599806 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,
@@ -14821,6 +14822,7 @@ virDomainRNGDefParseXML(virDomainXMLOptionPtr xmlopt,
             goto error;
         break;
 
+    case VIR_DOMAIN_RNG_BACKEND_BUILTIN:
     case VIR_DOMAIN_RNG_BACKEND_LAST:
         break;
     }
@@ -17764,6 +17766,7 @@ virDomainRNGFind(virDomainDefPtr def,
                 continue;
             break;
 
+        case VIR_DOMAIN_RNG_BACKEND_BUILTIN:
         case VIR_DOMAIN_RNG_BACKEND_LAST:
             break;
         }
@@ -26443,6 +26446,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;
@@ -26474,6 +26482,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 e012975f..ac1db682 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;
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index a8137b3a..d372d289 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -5579,6 +5579,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;
@@ -5640,6 +5641,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 ff87720f..19636e6f 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -14807,6 +14807,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;
@@ -15786,6 +15787,7 @@ qemuDomainNamespaceSetupRNG(virDomainObjPtr vm,
         break;
 
     case VIR_DOMAIN_RNG_BACKEND_EGD:
+    case VIR_DOMAIN_RNG_BACKEND_BUILTIN:
     case VIR_DOMAIN_RNG_BACKEND_LAST:
         break;
     }
@@ -15809,6 +15811,7 @@ qemuDomainNamespaceTeardownRNG(virDomainObjPtr vm,
         break;
 
     case VIR_DOMAIN_RNG_BACKEND_EGD:
+    case VIR_DOMAIN_RNG_BACKEND_BUILTIN:
     case VIR_DOMAIN_RNG_BACKEND_LAST:
         break;
     }
-- 
2.23.0

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Re: [libvirt] [PATCH 3/7] qemu: Implement builtin rng backend
Posted by Peter Krempa 6 years, 1 month ago
On Wed, Jan 01, 2020 at 13:06:33 +0800, Han Han wrote:
> 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/conf/domain_audit.c |  2 ++
>  src/conf/domain_conf.c  |  9 +++++++++
>  src/conf/domain_conf.h  |  1 +
>  src/qemu/qemu_command.c | 15 +++++++++++++++
>  src/qemu/qemu_domain.c  |  3 +++
>  5 files changed, 30 insertions(+)

[...]

> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> index a8137b3a..d372d289 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c

[...]

> @@ -5640,6 +5641,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"));

The error message is misaligned, should be on a single line and also
should be in the validation code not in the formatter.

> +            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"));


This patch fails to pass make check:

$  ./tests/qemucapabilitiestest
TEST: qemucapabilitiestest
      ............!........................... 40
      ....!.......!........................... 80
      ....!...                                 88  FAIL


45) 4.2.0 (x86_64)                                                    ...
In '/home/pipo/libvirt/tests/qemucapabilitiesdata/caps_4.2.0.x86_64.xml':
Offset 7070
Expect [v]
Actual [flag name='rng-builtin'/>
  <v]
                                                                      ... FAILED

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Re: [libvirt] [PATCH 3/7] qemu: Implement builtin rng backend
Posted by Peter Krempa 6 years, 1 month ago
On Mon, Jan 06, 2020 at 11:11:01 +0100, Peter Krempa wrote:
> On Wed, Jan 01, 2020 at 13:06:33 +0800, Han Han wrote:
> > 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/conf/domain_audit.c |  2 ++
> >  src/conf/domain_conf.c  |  9 +++++++++
> >  src/conf/domain_conf.h  |  1 +

Additionally this patch mixes XML additions (the enum value addition and
corresponding conversion string and qemu implementation. We prefer if
it's not mixed.

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Re: [libvirt] [PATCH 3/7] qemu: Implement builtin rng backend
Posted by Han Han 6 years, 1 month ago
On Mon, Jan 6, 2020 at 6:22 PM Peter Krempa <pkrempa@redhat.com> wrote:

> On Mon, Jan 06, 2020 at 11:11:01 +0100, Peter Krempa wrote:
> > On Wed, Jan 01, 2020 at 13:06:33 +0800, Han Han wrote:
> > > 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/conf/domain_audit.c |  2 ++
> > >  src/conf/domain_conf.c  |  9 +++++++++
> > >  src/conf/domain_conf.h  |  1 +
>
> Additionally this patch mixes XML additions (the enum value addition and
> corresponding conversion string and qemu implementation. We prefer if
> it's not mixed.
>
> OK. I will split it into 2 patches.


-- 
Best regards,
-----------------------------------
Han Han
Quality Engineer
Redhat.

Email: hhan@redhat.com
Phone: +861065339333
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list