[libvirt] [PATCH RFC 07/22] qemu_process: Use qemuProcess struct for a single process

Jiri Denemark jdenemar at redhat.com
Tue Nov 27 15:30:59 UTC 2018


On Sun, Nov 11, 2018 at 13:59:15 -0600, Chris Venteicher wrote:
> In new process code, move from model where qemuProcess struct can be
> used to activate a series of Qemu processes to model where one
> qemuProcess struct is used for one and only one Qemu process.
> 
> The forceTCG parameter (use / don't use KVM) will be passed when the
> qemuProcess struct is initialized since the qemuProcess struct won't be
> reused.
> 
> Signed-off-by: Chris Venteicher <cventeic at redhat.com>
> ---
>  src/qemu/qemu_capabilities.c | 16 ++++++++++++----
>  src/qemu/qemu_process.c      | 11 +++++++----
>  src/qemu/qemu_process.h      |  6 ++++--
>  3 files changed, 23 insertions(+), 10 deletions(-)
> 
> diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
> index 082874082b..a957c3bdbd 100644
> --- a/src/qemu/qemu_capabilities.c
> +++ b/src/qemu/qemu_capabilities.c
> @@ -4220,14 +4220,16 @@ virQEMUCapsInitQMP(virQEMUCapsPtr qemuCaps,
>                     char **qmperr)
>  {
>      qemuProcessPtr proc = NULL;
> +    qemuProcessPtr proc_kvm = NULL;

s/proc_kvm/procTCG/

The second QEMU process probes for TCG capabilities in case the first
reported KVM as enabled (otherwise the first one already reported TCG
capabilities).

>      int ret = -1;
>      int rc;
> +    bool forceTCG = false;

This variable does not make a lot of sense. You can just use false/true
directly when calling qemuProcessNew.

>  
>      if (!(proc = qemuProcessNew(qemuCaps->binary, libDir,
> -                                runUid, runGid, qmperr)))
> +                                runUid, runGid, qmperr, forceTCG)))
>          goto cleanup;
>  
> -    if ((rc = qemuProcessRun(proc, false)) != 0) {
> +    if ((rc = qemuProcessRun(proc)) != 0) {
>          if (rc == 1)
>              ret = 0;
>          goto cleanup;
> @@ -4238,13 +4240,17 @@ virQEMUCapsInitQMP(virQEMUCapsPtr qemuCaps,
>  
>      if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_KVM)) {
>          qemuProcessStopQmp(proc);
> -        if ((rc = qemuProcessRun(proc, true)) != 0) {
> +
> +        forceTCG = true;
> +        proc_kvm = qemuProcessNew(qemuCaps->binary, libDir, runUid, runGid, NULL, forceTCG);
> +
> +        if ((rc = qemuProcessRun(proc_kvm)) != 0) {
>              if (rc == 1)
>                  ret = 0;
>              goto cleanup;
>          }
>  
> -        if (virQEMUCapsInitQMPMonitorTCG(qemuCaps, proc->mon) < 0)
> +        if (virQEMUCapsInitQMPMonitorTCG(qemuCaps, proc_kvm->mon) < 0)
>              goto cleanup;
>      }
>  
> @@ -4252,7 +4258,9 @@ virQEMUCapsInitQMP(virQEMUCapsPtr qemuCaps,
>  
>   cleanup:
>      qemuProcessStopQmp(proc);
> +    qemuProcessStopQmp(proc_kvm);
>      qemuProcessFree(proc);
> +    qemuProcessFree(proc_kvm);
>      return ret;
>  }

After this patch virQEMUCapsInitQMP contains two almost identical parts.
It should be further refactored (in a follow up patch) to something like
(I was too lazy to come up with a good name for the function)

    virQEMUCapsInitQMP()
    {
        if (virQEMUCapsInitQMP...(..., false, err) < 0)
            return -1;

        if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_KVM) &&
            virQEMUCapsInitQMP...(..., true, NULL) < 0)
            return -1;

        return 0;
    }

>  
> diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
> index 2571024e8e..dda74d5b7a 100644
> --- a/src/qemu/qemu_process.c
> +++ b/src/qemu/qemu_process.c
> @@ -8100,7 +8100,8 @@ qemuProcessNew(const char *binary,
>                 const char *libDir,
>                 uid_t runUid,
>                 gid_t runGid,
> -               char **qmperr)
> +               char **qmperr,
> +               bool forceTCG)
>  {
>      qemuProcessPtr proc = NULL;
>  
> @@ -8110,10 +8111,13 @@ qemuProcessNew(const char *binary,
>      if (VIR_STRDUP(proc->binary, binary) < 0)
>          goto error;
>  
> +    proc->forceTCG = forceTCG;

I'd put this just after the "proc->qmperr = qmperr;" line with no empty
line separator to keep the order consistent with the order of function
parameters. But it's not a big deal.

> +
>      proc->runUid = runUid;
>      proc->runGid = runGid;
>      proc->qmperr = qmperr;
>  
> +

Please, delete the extra empty line.

>      /* the ".sock" sufix is important to avoid a possible clash with a qemu
>       * domain called "capabilities"
>       */

Jirka




More information about the libvir-list mailing list