[libvirt] [PATCH V2] libxl: support domainReset

Jim Fehlig jfehlig at suse.com
Fri Jun 26 20:40:35 UTC 2015


On 05/27/2015 01:46 PM, Jim Fehlig wrote:
> Currently, libxl does not provide a reset function, but domainReset
> can be implemented in the libxl driver by forcibly destroying the
> domain and starting it again.
>
> Signed-off-by: Jim Fehlig <jfehlig at suse.com>
> ---
>
> This is essentially a V2 of a patch submitted quite some time ago
>
> https://www.redhat.com/archives/libvir-list/2014-August/msg00077.html
>
> The idea of implmenting domainReset in the libxl driver by forcibly
> destroying the domain and starting it again was ACK'ed in principle
> by Ian Campbell
>
> https://www.redhat.com/archives/libvir-list/2014-August/msg00109.html
>
> I never pushed the patch since it was not ACK'ed by a libvirt
> maintainer and stumbled across it while cleaning up some of my
> old branches.  The only change here is rebase against current
> libvirt.git master.

Any comments on this, beyond my self-comment below?

>
>   src/libxl/libxl_driver.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++++
>   1 file changed, 59 insertions(+)
>
> diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c
> index 12be816..671d336 100644
> --- a/src/libxl/libxl_driver.c
> +++ b/src/libxl/libxl_driver.c
> @@ -1237,6 +1237,64 @@ libxlDomainReboot(virDomainPtr dom, unsigned int flags)
>   }
>   
>   static int
> +libxlDomainReset(virDomainPtr dom, unsigned int flags)
> +{
> +    libxlDriverPrivatePtr driver = dom->conn->privateData;
> +    libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver);
> +    virDomainObjPtr vm;
> +    int ret = -1;
> +
> +    virCheckFlags(0, -1);
> +
> +    if (!(vm = libxlDomObjFromDomain(dom)))
> +        goto cleanup;
> +
> +    if (virDomainResetEnsureACL(dom->conn, vm->def) < 0)
> +        goto cleanup;
> +
> +    if (libxlDomainObjBeginJob(driver, vm, LIBXL_JOB_MODIFY) < 0)
> +        goto cleanup;
> +
> +    if (!virDomainObjIsActive(vm)) {
> +        virReportError(VIR_ERR_OPERATION_INVALID,
> +                       "%s", _("Domain is not running"));
> +        goto endjob;
> +    }
> +
> +    /*
> +     * The semantics of reset can be achieved by forcibly destroying
> +     * the domain and starting it again.
> +     */
> +    if (libxl_domain_destroy(cfg->ctx, vm->def->id, NULL) < 0) {
> +        virReportError(VIR_ERR_INTERNAL_ERROR,
> +                       _("Failed to destroy domain '%d' before reset"),
> +                       vm->def->id);
> +        goto endjob;
> +    }
> +
> +    libxlDomainCleanup(driver, vm, VIR_DOMAIN_SHUTOFF_DESTROYED);
> +
> +    if (libxlDomainStart(driver, vm, false, -1) < 0) {
> +        virReportError(VIR_ERR_INTERNAL_ERROR,
> +                       _("Failed to start domain '%d' after reset"),
> +                       vm->def->id);
> +        goto endjob;
> +    }
> +
> +    ret = 0;
> +
> + endjob:
> +    if (!libxlDomainObjEndJob(driver, vm))
> +        vm = NULL;
> +
> + cleanup:
> +    if (vm)
> +        virObjectUnlock(vm);
> +    virObjectUnref(cfg);
> +    return ret;
> +}
> +
> +static int
>   libxlDomainDestroyFlags(virDomainPtr dom,
>                           unsigned int flags)
>   {
> @@ -5066,6 +5124,7 @@ static virHypervisorDriver libxlHypervisorDriver = {
>       .domainShutdown = libxlDomainShutdown, /* 0.9.0 */
>       .domainShutdownFlags = libxlDomainShutdownFlags, /* 0.9.10 */
>       .domainReboot = libxlDomainReboot, /* 0.9.0 */
> +    .domainReset = libxlDomainReset, /* 1.2.8 */

Needs to be updated to 1.2.17? 1.3.0? (I'm behind on my libvirt mail and not 
sure about the outcome of the version discussion.)

Regards,
Jim




More information about the libvir-list mailing list