[libvirt] [PATCH v2] qemu: enable user-defined cache bypassing while invoking

Rudy Zhang rudyflyzhang at gmail.com
Fri Aug 26 09:48:10 UTC 2016



On 16/8/26 下午2:56, fuweiwei wrote:
> in the previous version, I mentioned the scenario of long-term pause while
> writing external memory checkpoints:
>
> v1: https://www.redhat.com/archives/libvir-list/2016-August/msg01194.html
>
> Daniel suggested not to hardcode the flag, but wire this upto the API. When
> the user invokes the snapshot they can request the
> VIR_DOMAIN_SAVE_BYPASS_CACHE flag explicitly. So in this version I
> introduce the --bypass-cache option in libvirt snapshot API. When invoking
> an external VM snapshots, we may use the command like this:
>
> virsh snapshot-create-as VM snap --memspec /path/to/memsnap --live
>  --bypass-cache
>
> The VM snapshot can be done with inapparent VM suspend now. Without
> "--bypass-cache" flag, one may experience long-term VM suspend (so that the
> implication of "--live" option is not significant), provided that the VM
> has a large amount of dirty pages to save.
>
> Signed-off-by: fuweiwei <fuweiwei2 at huawei.com>
> ---
>  include/libvirt/libvirt-domain-snapshot.h |  3 +++
>  src/qemu/qemu_driver.c                    | 20 ++++++++++++++++++--
>  tools/virsh-snapshot.c                    | 12 ++++++++++++
>  3 files changed, 33 insertions(+), 2 deletions(-)
>
> diff --git a/include/libvirt/libvirt-domain-snapshot.h b/include/libvirt/libvirt-domain-snapshot.h
> index 0f73f24..aeff665 100644
> --- a/include/libvirt/libvirt-domain-snapshot.h
> +++ b/include/libvirt/libvirt-domain-snapshot.h
> @@ -70,6 +70,9 @@ typedef enum {
>      VIR_DOMAIN_SNAPSHOT_CREATE_LIVE        = (1 << 8), /* create the snapshot
>                                                            while the guest is
>                                                            running */
> +    VIR_DOMAIN_SNAPSHOT_CREATE_BYPASS_CACHE   = (1 << 9), i/* Bypass cache

Delete 'i',otherwise it can't be compiled succefully.

> +                                                          while writing external
> +                                                          checkpoint files. */
>  } virDomainSnapshotCreateFlags;
>
>  /* Take a snapshot of the current VM state */
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 2089359..d5f441f 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -14036,6 +14036,7 @@ qemuDomainSnapshotCreateActiveExternal(virConnectPtr conn,
>      bool pmsuspended = false;
>      virQEMUDriverConfigPtr cfg = NULL;
>      int compressed = QEMU_SAVE_FORMAT_RAW;
> +    unsigned int save_memory_flag = 0;
>
>      /* If quiesce was requested, then issue a freeze command, and a
>       * counterpart thaw command when it is actually sent to agent.
> @@ -14116,8 +14117,12 @@ qemuDomainSnapshotCreateActiveExternal(virConnectPtr conn,
>          if (!(xml = qemuDomainDefFormatLive(driver, vm->def, true, true)))
>              goto cleanup;
>
> +        if (flags & VIR_DOMAIN_SNAPSHOT_CREATE_BYPASS_CACHE)
> +            save_memory_flag |= VIR_DOMAIN_SAVE_BYPASS_CACHE;
> +
>          if ((ret = qemuDomainSaveMemory(driver, vm, snap->def->file,
> -                                        xml, compressed, resume, 0,
> +                                        xml, compressed, resume,
> +                                        save_memory_flag,
>                                          QEMU_ASYNC_JOB_SNAPSHOT)) < 0)
>              goto cleanup;
>
> @@ -14224,7 +14229,8 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain,
>                    VIR_DOMAIN_SNAPSHOT_CREATE_REUSE_EXT |
>                    VIR_DOMAIN_SNAPSHOT_CREATE_QUIESCE |
>                    VIR_DOMAIN_SNAPSHOT_CREATE_ATOMIC |
> -                  VIR_DOMAIN_SNAPSHOT_CREATE_LIVE, NULL);
> +                  VIR_DOMAIN_SNAPSHOT_CREATE_LIVE |
> +                  VIR_DOMAIN_SNAPSHOT_CREATE_BYPASS_CACHE, NULL);
>
>      VIR_REQUIRE_FLAG_RET(VIR_DOMAIN_SNAPSHOT_CREATE_QUIESCE,
>                           VIR_DOMAIN_SNAPSHOT_CREATE_DISK_ONLY,
> @@ -14297,6 +14303,16 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain,
>          goto cleanup;
>      }
>
> +    /* the option of bypass cache is only supported for external checkpoints */
> +    if (flags & VIR_DOMAIN_SNAPSHOT_CREATE_BYPASS_CACHE &&
> +         (def->memory != VIR_DOMAIN_SNAPSHOT_LOCATION_EXTERNAL ||
> +         redefine)) {
> +        virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
> +                       _("only external memory snapshots support "
> +                         "cache bypass."));
> +        goto cleanup;
> +    }
> +
>      /* allow snapshots only in certain states */
>      switch ((virDomainState) vm->state.state) {
>          /* valid states */
> diff --git a/tools/virsh-snapshot.c b/tools/virsh-snapshot.c
> index f879e7a..0627baf 100644
> --- a/tools/virsh-snapshot.c
> +++ b/tools/virsh-snapshot.c
> @@ -160,6 +160,10 @@ static const vshCmdOptDef opts_snapshot_create[] = {
>       .type = VSH_OT_BOOL,
>       .help = N_("require atomic operation")
>      },
> +    {.name = "bypass-cache",
> +     .type = VSH_OT_BOOL,
> +     .help = N_("bypass system cache while writing external checkpoints")
> +    },
>      VIRSH_COMMON_OPT_LIVE(N_("take a live snapshot")),
>      {.name = NULL}
>  };
> @@ -191,6 +195,8 @@ cmdSnapshotCreate(vshControl *ctl, const vshCmd *cmd)
>          flags |= VIR_DOMAIN_SNAPSHOT_CREATE_ATOMIC;
>      if (vshCommandOptBool(cmd, "live"))
>          flags |= VIR_DOMAIN_SNAPSHOT_CREATE_LIVE;
> +    if (vshCommandOptBool(cmd, "bypass-cache"))
> +        flags |= VIR_DOMAIN_SNAPSHOT_CREATE_BYPASS_CACHE;
>
>      if (!(dom = virshCommandOptDomain(ctl, cmd, NULL)))
>          goto cleanup;
> @@ -358,6 +364,10 @@ static const vshCmdOptDef opts_snapshot_create_as[] = {
>       .type = VSH_OT_BOOL,
>       .help = N_("require atomic operation")
>      },
> +    {.name = "bypass-cache",
> +     .type = VSH_OT_BOOL,
> +     .help = N_("bypass system cache while writing external checkpoints")
> +    },
>      VIRSH_COMMON_OPT_LIVE(N_("take a live snapshot")),
>      {.name = "memspec",
>       .type = VSH_OT_STRING,
> @@ -404,6 +414,8 @@ cmdSnapshotCreateAs(vshControl *ctl, const vshCmd *cmd)
>          flags |= VIR_DOMAIN_SNAPSHOT_CREATE_ATOMIC;
>      if (vshCommandOptBool(cmd, "live"))
>          flags |= VIR_DOMAIN_SNAPSHOT_CREATE_LIVE;
> +    if (vshCommandOptBool(cmd, "bypass-cache"))
> +        flags |= VIR_DOMAIN_SNAPSHOT_CREATE_BYPASS_CACHE;
>
>      if (!(dom = virshCommandOptDomain(ctl, cmd, NULL)))
>          return false;
>

-- 
Best regards,
Rudy Zhang




More information about the libvir-list mailing list