[libvirt][PATCH RESEND v10 5/5] qemu: Add command-line to generate SGX EPC memory backend

Michal Prívozník mprivozn at redhat.com
Wed Feb 16 10:25:40 UTC 2022


On 2/8/22 06:21, Haibin Huang wrote:
> From: Lin Yang <lin.a.yang at intel.com>
> 
> According to the result parsing from xml, add the argument of
> SGX EPC memory backend into QEMU command line:
> 
>     #qemu-system-x86_64 \
>         ...... \
>         -object memory-backend-epc,id=mem1,size=64M,prealloc=on \
>         -object memory-backend-epc,id=mem2,size=28M \
>         -M sgx-epc.0.memdev=mem1,sgx-epc.1.memdev=mem2
> 
> Signed-off-by: Lin Yang <lin.a.yang at intel.com>
> ---
>  src/qemu/qemu_alias.c                         |  3 +-
>  src/qemu/qemu_command.c                       | 46 +++++++++++++++++--
>  .../sgx-epc.x86_64-6.2.0.args                 | 38 +++++++++++++++
>  tests/qemuxml2argvtest.c                      |  2 +
>  4 files changed, 84 insertions(+), 5 deletions(-)
>  create mode 100644 tests/qemuxml2argvdata/sgx-epc.x86_64-6.2.0.args
> 
> diff --git a/src/qemu/qemu_alias.c b/src/qemu/qemu_alias.c
> index e5a946cbed..03c79bcf0e 100644
> --- a/src/qemu/qemu_alias.c
> +++ b/src/qemu/qemu_alias.c
> @@ -467,7 +467,8 @@ qemuDeviceMemoryGetAliasID(virDomainDef *def,
>       * valid */
>      if (!oldAlias &&
>          mem->model != VIR_DOMAIN_MEMORY_MODEL_VIRTIO_PMEM &&
> -        mem->model != VIR_DOMAIN_MEMORY_MODEL_VIRTIO_MEM)
> +        mem->model != VIR_DOMAIN_MEMORY_MODEL_VIRTIO_MEM &&
> +        mem->model != VIR_DOMAIN_MEMORY_MODEL_SGX_EPC)
>          return mem->info.addr.dimm.slot;
>  
>      for (i = 0; i < def->nmems; i++) {
> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> index e6f29d878c..71804e659c 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c
> @@ -3815,6 +3815,10 @@ qemuBuildMemoryBackendProps(virJSONValue **backendProps,
>          if (systemMemory)
>              disableCanonicalPath = true;
>  
> +    } else if (mem->model == VIR_DOMAIN_MEMORY_MODEL_SGX_EPC) {
> +        backendType = "memory-backend-epc";
> +        if (!priv->memPrealloc)
> +            prealloc = true;
>      } else if (useHugepage || mem->nvdimmPath || memAccess ||
>          def->mem.source == VIR_DOMAIN_MEMORY_SOURCE_FILE) {
>  
> @@ -3972,6 +3976,12 @@ qemuBuildMemoryBackendProps(virJSONValue **backendProps,
>                             _("this qemu doesn't support the "
>                               "memory-backend-memfd object"));
>              return -1;
> +        } else if (STREQ(backendType, "memory-backend-epc") &&
> +                   !virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_SGX_EPC)) {
> +            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> +                           _("this qemu doesn't support the "
> +                             "memory-backend-epc object"));

Please put error messages onto a single line. They are extempt from the
80 chars rule. I know you just tried to mimic pre-existing code, but
that is wrong too.

> +            return -1;
>          }
>  
>          rc = 0;
> @@ -7800,6 +7810,8 @@ qemuBuildMemoryDeviceCommandLine(virCommand *cmd,
>                                   qemuDomainObjPrivate *priv)
>  {
>      size_t i;
> +    g_auto(virBuffer) epcBuf = VIR_BUFFER_INITIALIZER;
> +    int epcNum = 0;
>  
>      /* memory hotplug requires NUMA to be enabled - we already checked
>       * that memory devices are present only when NUMA is */
> @@ -7809,11 +7821,37 @@ qemuBuildMemoryDeviceCommandLine(virCommand *cmd,
>          if (qemuBuildMemoryDimmBackendStr(cmd, def->mems[i], def, cfg, priv) < 0)
>              return -1;
>  
> -        if (!(props = qemuBuildMemoryDeviceProps(cfg, priv, def, def->mems[i])))
> -            return -1;
> +        switch ((virDomainMemoryModel) def->mems[i]->model) {
> +        case VIR_DOMAIN_MEMORY_MODEL_NVDIMM:
> +        case VIR_DOMAIN_MEMORY_MODEL_DIMM:
> +        case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_PMEM:
> +        case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_MEM:
> +            if (!(props = qemuBuildMemoryDeviceProps(cfg, priv, def, def->mems[i])))
> +                return -1;
>  
> -        if (qemuBuildDeviceCommandlineFromJSON(cmd, props, priv->qemuCaps) < 0)
> -            return -1;
> +            if (qemuBuildDeviceCommandlineFromJSON(cmd, props, priv->qemuCaps) < 0)
> +                return -1;
> +
> +            break;
> +
> +        case VIR_DOMAIN_MEMORY_MODEL_SGX_EPC:
> +            if (virBufferUse(&epcBuf) > 0)
> +                virBufferAddChar(&epcBuf, ',');
> +
> +            virBufferAsprintf(&epcBuf, "sgx-epc.%d.memdev=mem%s", epcNum++,
> +                              def->mems[i]->info.alias);
> +
> +            break;
> +
> +        case VIR_DOMAIN_MEMORY_MODEL_NONE:
> +        case VIR_DOMAIN_MEMORY_MODEL_LAST:
> +            break;
> +        }
> +    }
> +
> +    if (virBufferUse(&epcBuf) > 0) {
> +        virCommandAddArg(cmd, "-M");
> +        virCommandAddArgBuffer(cmd, &epcBuf);
>      }
>  
>      return 0;
> diff --git a/tests/qemuxml2argvdata/sgx-epc.x86_64-6.2.0.args b/tests/qemuxml2argvdata/sgx-epc.x86_64-6.2.0.args
> new file mode 100644
> index 0000000000..e1aa274054
> --- /dev/null
> +++ b/tests/qemuxml2argvdata/sgx-epc.x86_64-6.2.0.args
> @@ -0,0 +1,38 @@
> +LC_ALL=C \
> +PATH=/bin \
> +HOME=/tmp/lib/domain--1-QEMUGuest1 \
> +USER=test \
> +LOGNAME=test \
> +XDG_DATA_HOME=/tmp/lib/domain--1-QEMUGuest1/.local/share \
> +XDG_CACHE_HOME=/tmp/lib/domain--1-QEMUGuest1/.cache \
> +XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \
> +/usr/bin/qemu-system-x86_64 \
> +-name guest=QEMUGuest1,debug-threads=on \
> +-S \
> +-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/tmp/lib/domain--1-QEMUGuest1/master-key.aes"}' \
> +-machine pc-q35-6.2,usb=off,dump-guest-core=off,memory-backend=pc.ram \
> +-accel tcg \
> +-cpu qemu64 \
> +-m 134 \
> +-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":140509184}' \
> +-overcommit mem-lock=off \
> +-smp 1,sockets=1,cores=1,threads=1 \
> +-object '{"qom-type":"memory-backend-epc","id":"memepc0","prealloc":true,"size":67108864}' \
> +-object '{"qom-type":"memory-backend-epc","id":"memepc1","prealloc":true,"size":16777216}' \
> +-M sgx-epc.0.memdev=memepc0,sgx-epc.1.memdev=memepc1 \

I don't think this is correct. IIUC, this can be passed to -machine
directly, e.g.:

-machine
pc-q35-6.2,usb=off,dump-guest-core=off,memory-backend=pc.ram,sgx-epc.0.memdev=memepc0,sgx-epc.1.memdev=memepc1

And when I try to do that, I get:

  qemu-system-x86_64: Parameter 'sgx-epc.0.node' is missing

Any idea, what's going on? I would much rather avoid using -M if we can
help it.

Michal




More information about the libvir-list mailing list