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

Re: [Xen-devel] [PATCH 9/25] Tools/libacpi: Add a user configurable parameter to control vIOMMU attributes



Title is wrong. Should be tagged "tools".

On Thu, Jun 29, 2017 at 01:50:41AM -0400, Lan Tianyu wrote:
> From: Chao Gao <chao.gao@xxxxxxxxx>
> 
> a field, viommu_info, is added to struct libxl_domain_build_info. Several

Capitalise "a" please.

> attributes can be specified by guest configuration file for the DMAR table
> building and vIOMMU creation.
> 
> In domain creation process, a new logic is added to build ACPI DMAR table in
> tool stack according VM configuration and to pass though it to hvmloader via
> xenstore ACPI PT channel. If there are ACPI tables needed to pass through, we
> joint the tables.
> 
> Signed-off-by: Chao Gao <chao.gao@xxxxxxxxx>
> Signed-off-by: Lan Tianyu <tianyu.lan@xxxxxxxxx>
> ---
>  docs/man/xl.cfg.pod.5.in    | 34 +++++++++++++++++-
>  tools/libacpi/build.c       |  5 +++
>  tools/libacpi/libacpi.h     |  1 +

Can the changes to libacpi be split out to a separate patch?

>  tools/libxl/libxl_dom.c     | 87 
> +++++++++++++++++++++++++++++++++++++++++++++
>  tools/libxl/libxl_types.idl | 10 ++++++
>  tools/xl/xl_parse.c         | 64 +++++++++++++++++++++++++++++++++
>  6 files changed, 200 insertions(+), 1 deletion(-)
> 
> diff --git a/docs/man/xl.cfg.pod.5.in b/docs/man/xl.cfg.pod.5.in
> index 38084c7..874f3f2 100644
> --- a/docs/man/xl.cfg.pod.5.in
> +++ b/docs/man/xl.cfg.pod.5.in
[...]
> diff --git a/tools/libacpi/libacpi.h b/tools/libacpi/libacpi.h
> index 6a4e1cf..0a58d6f 100644
> --- a/tools/libacpi/libacpi.h
> +++ b/tools/libacpi/libacpi.h
> @@ -109,6 +109,7 @@ struct acpi_config {
>  #define DMAR_X2APIC_OPT_OUT 0x2
>  struct acpi_dmar *construct_dmar(struct acpi_ctxt *ctxt,
>                                   const struct acpi_config *config);
> +uint32_t acpi_get_table_size(struct acpi_header * header);
>  int acpi_build_tables(struct acpi_ctxt *ctxt, struct acpi_config *config);
>  
>  #endif /* __LIBACPI_H__ */
> diff --git a/tools/libxl/libxl_dom.c b/tools/libxl/libxl_dom.c
> index 5d914a5..f8d61c2 100644
> --- a/tools/libxl/libxl_dom.c
> +++ b/tools/libxl/libxl_dom.c
> @@ -19,11 +19,13 @@
>  
>  #include "libxl_internal.h"
>  #include "libxl_arch.h"
> +#include "libacpi/libacpi.h"
>  
>  #include <xc_dom.h>
>  #include <xen/hvm/hvm_info_table.h>
>  #include <xen/hvm/hvm_xs_strings.h>
>  #include <xen/hvm/e820.h>
> +#include <xen/viommu.h>
>  
>  #include "_paths.h"
>  
> @@ -925,6 +927,43 @@ out:
>      return rc;
>  }
>  
> +static unsigned long acpi_v2p(struct acpi_ctxt *ctxt, void *v)
> +{
> +    return (unsigned long)v;
> +}
> +
> +static void *acpi_mem_alloc(struct acpi_ctxt *ctxt,
> +                            uint32_t size, uint32_t align)
> +{
> +    return aligned_alloc(align, size);

posix_memalign please.

aligned_alloc is in C11. We support C99.

> +}
> +
> +static void acpi_mem_free(struct acpi_ctxt *ctxt,
> +                          void *v, uint32_t size)
> +{
> +    /* ACPI builder currently doesn't free memory so this is just a stub */
> +}
> +
> +static int libxl__acpi_build_dmar(libxl__gc *gc,
> +                                  struct acpi_config *config,
> +                                  void **data_r, int *datalen_r)

This should probably go to libxl_x86_acpi.

It seems that you should be able to use a lot of code there instead of
writing your own.

In any case, I don't think having two places to construct acpi tables
for guest is a good idea.

> +{
> +    struct acpi_ctxt ctxt;
> +    void *table;
> +
> +    ctxt.mem_ops.alloc = acpi_mem_alloc;
> +    ctxt.mem_ops.free = acpi_mem_free;
> +    ctxt.mem_ops.v2p = acpi_v2p;
> +
> +    table = construct_dmar(&ctxt, config);
> +    if ( !table )
> +        return ERROR_FAIL;
> +
> +    *data_r = table;
> +    *datalen_r = acpi_get_table_size((struct acpi_header *)table);
> +    return 0;
> +}
> +
>  static int libxl__domain_firmware(libxl__gc *gc,
>                                    libxl_domain_build_info *info,
>                                    struct xc_dom_image *dom)
> @@ -1045,6 +1084,54 @@ static int libxl__domain_firmware(libxl__gc *gc,
>          }
>      }
>  
> +    /* build DMAR table according guest configuration and joint it with other
> +     * apci tables specified by acpi_modules */
> +    if ((info->u.hvm.viommu.type == VIOMMU_TYPE_INTEL_VTD) &&
> +        !libxl_defbool_is_default(info->u.hvm.viommu.intremap) &&
> +        info->device_model_version == LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN) {
> +        struct acpi_config config;
> +
> +        memset(&config, 0, sizeof(config));
> +        if (libxl_defbool_val(info->u.hvm.viommu.intremap)) {
> +            config.table_flags |= ACPI_HAS_DMAR;
> +            config.dmar_flag = DMAR_INTR_REMAP;
> +            if (!libxl_defbool_is_default(info->u.hvm.viommu.x2apic)
> +                && !libxl_defbool_val(info->u.hvm.viommu.x2apic))
> +                config.dmar_flag |= DMAR_X2APIC_OPT_OUT;
> +
> +            config.viommu_base_addr = info->u.hvm.viommu.base_addr;
> +            data = NULL;
> +            e = libxl__acpi_build_dmar(gc, &config, &data, &datalen);
> +            if (e) {
> +                LOGE(ERROR, "failed to build DMAR table");
> +                rc = ERROR_FAIL;
> +                goto out;
> +            }
> +
> +            libxl__ptr_add(gc, data);
> +            if (datalen) {
> +                if (!dom->acpi_modules[0].data) {
> +                    dom->acpi_modules[0].data = data;
> +                    dom->acpi_modules[0].length = (uint32_t)datalen;
> +                } else {
> +                    /* joint tables */
> +                    void *newdata;
> +                    newdata = malloc(datalen + dom->acpi_modules[0].length);
> +                    if (!newdata) {
> +                        LOGE(ERROR, "failed to joint DMAR table to acpi 
> modules");
> +                        rc = ERROR_FAIL;
> +                        goto out;
> +                    }
> +                    memcpy(newdata, dom->acpi_modules[0].data,
> +                           dom->acpi_modules[0].length);
> +                    memcpy(newdata + dom->acpi_modules[0].length, data, 
> datalen);
> +                    dom->acpi_modules[0].data = newdata;
> +                    dom->acpi_modules[0].length += (uint32_t)datalen;
> +                }
> +            }
> +        }
> +    }
> +

This seems to clash badly with the code in libxl__dom_load_acpi which
also writes to modules[0].

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.