Re: [PATCH 2/3] src: convert drivers over to new virInhibitor APIs

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 12/17/24 12:15, Daniel P. Berrangé wrote:
> This initial conversion of the drivers switches them over to use
> the virInhibitor APIs in local daemon only mode. Communication to
> logind is still handled by the virNetDaemon class logic.
> 
> This mostly just replaces upto 3 fields in the driver state
> with a single new virInhibitor object, but otherwise should not
> change functionality besides replacing atomics with mutex protected
> APIs.
> 
> The exception is the LXC driver which has been trying to inhibit
> shutdown shutdown but silently failing to, since nothing ever
> remembered to set the 'inhibitCallback' pointer in the driver
> state struct.
> 
> Signed-off-by: Daniel P. Berrangé <berrange@xxxxxxxxxx>
> ---
>  src/libxl/libxl_conf.h           |  9 +++----
>  src/libxl/libxl_domain.c         |  6 ++---
>  src/libxl/libxl_driver.c         | 15 +++++++----
>  src/lxc/lxc_conf.h               |  9 +++----
>  src/lxc/lxc_driver.c             | 13 +++++++--
>  src/lxc/lxc_process.c            |  9 +++----
>  src/network/bridge_driver.c      | 20 +++++++-------
>  src/network/bridge_driver_conf.h |  9 +++----
>  src/qemu/qemu_conf.h             |  9 +++----
>  src/qemu/qemu_driver.c           | 12 ++++++---
>  src/qemu/qemu_process.c          |  9 +++----
>  src/secret/secret_driver.c       | 46 +++++++++++++-------------------
>  12 files changed, 80 insertions(+), 86 deletions(-)
> 
> diff --git a/src/libxl/libxl_conf.h b/src/libxl/libxl_conf.h
> index 7087b41079..0edcde079d 100644
> --- a/src/libxl/libxl_conf.h
> +++ b/src/libxl/libxl_conf.h
> @@ -35,6 +35,7 @@
>  #include "virfirmware.h"
>  #include "libxl_capabilities.h"
>  #include "libxl_logger.h"
> +#include "virinhibitor.h"
>  
>  #define LIBXL_DRIVER_EXTERNAL_NAME "Xen"
>  /*
> @@ -117,12 +118,8 @@ struct _libxlDriverPrivate {
>      /* pid file FD, ensures two copies of the driver can't use the same root */
>      int lockFD;
>  
> -    /* Atomic inc/dec only */
> -    unsigned int nactive;
> -
> -    /* Immutable pointers. Caller must provide locking */
> -    virStateInhibitCallback inhibitCallback;
> -    void *inhibitOpaque;
> +    /* Immutable pointer, self-locking APIs */
> +    virInhibitor *inhibitor;
>  
>      /* Immutable pointer, self-locking APIs */
>      virDomainObjList *domains;
> diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c
> index cad6c9ce42..a049cdb30f 100644
> --- a/src/libxl/libxl_domain.c
> +++ b/src/libxl/libxl_domain.c
> @@ -873,8 +873,7 @@ libxlDomainCleanup(libxlDriverPrivate *driver,
>          priv->deathW = NULL;
>      }
>  
> -    if (g_atomic_int_dec_and_test(&driver->nactive) && driver->inhibitCallback)
> -        driver->inhibitCallback(false, driver->inhibitOpaque);
> +    virInhibitorRelease(driver->inhibitor);
>  
>      /* Release auto-allocated graphics ports */
>      for (i = 0; i < vm->def->ngraphics; i++) {
> @@ -1421,8 +1420,7 @@ libxlDomainStart(libxlDriverPrivate *driver,
>          return -1;
>      }
>  
> -    if (g_atomic_int_add(&driver->nactive, 1) == 0 && driver->inhibitCallback)
> -        driver->inhibitCallback(true, driver->inhibitOpaque);
> +    virInhibitorHold(driver->inhibitor);
>  
>      event = virDomainEventLifecycleNewFromObj(vm, VIR_DOMAIN_EVENT_STARTED,
>                                                restore_fd < 0 ?
> diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c
> index e72553603d..eb293172f7 100644
> --- a/src/libxl/libxl_driver.c
> +++ b/src/libxl/libxl_driver.c
> @@ -437,8 +437,7 @@ libxlReconnectDomain(virDomainObj *vm,
>          virDomainObjSetState(vm, VIR_DOMAIN_RUNNING,
>                               VIR_DOMAIN_RUNNING_UNKNOWN);
>  
> -    if (g_atomic_int_add(&driver->nactive, 1) == 0 && driver->inhibitCallback)
> -        driver->inhibitCallback(true, driver->inhibitOpaque);
> +    virInhibitorHold(driver->inhibitor);
>  
>      /* Enable domain death events */
>      libxl_evenable_domain_death(cfg->ctx, vm->def->id, 0, &priv->deathW);
> @@ -514,6 +513,7 @@ libxlStateCleanup(void)
>  
>      virObjectUnref(libxl_driver->domainEventState);
>      virSysinfoDefFree(libxl_driver->hostsysinfo);
> +    virInhibitorFree(libxl_driver->inhibitor);
>  
>      if (libxl_driver->lockFD != -1)
>          virPidFileRelease(libxl_driver->config->stateDir, "driver", libxl_driver->lockFD);
> @@ -675,9 +675,6 @@ libxlStateInitialize(bool privileged,
>          return VIR_DRV_STATE_INIT_ERROR;
>      }
>  
> -    libxl_driver->inhibitCallback = callback;
> -    libxl_driver->inhibitOpaque = opaque;
> -
>      /* Allocate bitmap for vnc port reservation */
>      if (!(libxl_driver->reservedGraphicsPorts =
>            virPortAllocatorRangeNew(_("VNC"),
> @@ -709,6 +706,14 @@ libxlStateInitialize(bool privileged,
>      if (libxlDriverConfigLoadFile(cfg, driverConf) < 0)
>          goto error;
>  
> +    libxl_driver->inhibitor = virInhibitorNew(
> +        VIR_INHIBITOR_WHAT_NONE,
> +        _("Libvirt Xen"),
> +        _("Xen virtual machines are running"),
> +        VIR_INHIBITOR_MODE_DELAY,
> +        callback,
> +        opaque);

A bit funky formatting here and in the rest of the patch. But I can live
with that.

Michal




[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]

  Powered by Linux