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

Re: [PATCH v4 2/2] tools: don't expose XENFEAT_hvm_pirqs by default



On Thu, Jan 25, 2024 at 10:30:41AM +0100, Roger Pau Monne wrote:
> The HVM pirq feature allows routing interrupts from both physical and emulated
> devices over event channels, this was done a performance improvement.  However
> its usage is fully undocumented, and the only reference implementation is in
> Linux.  It defeats the purpose of local APIC hardware virtualization, because
> when using it interrupts avoid the usage of the local APIC altogether.
> 
> It has also been reported to not work properly with certain devices, at least
> when using some AMD GPUs Linux attempts to route interrupts over event
> channels, but Xen doesn't correctly detect such routing, which leads to the
> hypervisor complaining with:
> 
> (XEN) d15v0: Unsupported MSI delivery mode 7 for Dom15
> 
> When MSIs are attempted to be routed over event channels the entry delivery
> mode is set to ExtINT, but Xen doesn't detect such routing and attempts to
> inject the interrupt following the native MSI path, and the ExtINT delivery
> mode is not supported.
> 
> Disable HVM PIRQs by default and provide a per-domain option in xl.cfg to
> enable such feature.  Also for backwards compatibility keep the feature 
> enabled
> for any resumed domains that don't have an explicit selection.
> 
> Note that the only user of the feature (Linux) is also able to handle native
> interrupts fine, as the feature was already not used if Xen reported local 
> APIC
> hardware virtualization active.
> 
> Link: https://github.com/QubesOS/qubes-issues/issues/7971
> Signed-off-by: Roger Pau Monné <roger.pau@xxxxxxxxxx>
> Reviewed-by: Anthony PERARD <anthony.perard@xxxxxxxxxx>

For the python part - it's a bit unfortunate there is no knob to control
the value, but in practice I doubt it would be useful (and especially
for python bindings users), so:

Acked-by: Marek Marczykowski-Górecki <marmarek@xxxxxxxxxxxxxxxxxxxxxx>

> ---
> Changes since v2:
>  - Add changelog entry.
> 
> Changes since v1:
>  - Fix libxl for PV guests.
> ---
>  CHANGELOG.md                      |  2 ++
>  docs/man/xl.cfg.5.pod.in          |  7 +++++++
>  tools/include/libxl.h             |  7 +++++++
>  tools/libs/light/libxl_create.c   |  7 +++++--
>  tools/libs/light/libxl_types.idl  |  1 +
>  tools/libs/light/libxl_x86.c      | 12 +++++++++---
>  tools/python/xen/lowlevel/xc/xc.c |  4 +++-
>  tools/xl/xl_parse.c               |  1 +
>  8 files changed, 35 insertions(+), 6 deletions(-)
> 
> diff --git a/CHANGELOG.md b/CHANGELOG.md
> index 723d06425431..ddb3ab8db4e7 100644
> --- a/CHANGELOG.md
> +++ b/CHANGELOG.md
> @@ -9,6 +9,8 @@ The format is based on [Keep a 
> Changelog](https://keepachangelog.com/en/1.0.0/)
>  ### Changed
>   - Changed flexible array definitions in public I/O interface headers to not
>     use "1" as the number of array elements.
> + - On x86:
> +   - HVM PIRQs are disabled by default.
>  
>  ### Added
>   - On x86:
> diff --git a/docs/man/xl.cfg.5.pod.in b/docs/man/xl.cfg.5.pod.in
> index 2e234b450efb..ea8d41727d8e 100644
> --- a/docs/man/xl.cfg.5.pod.in
> +++ b/docs/man/xl.cfg.5.pod.in
> @@ -2460,6 +2460,13 @@ The viridian option can be specified as a boolean. A 
> value of true (1)
>  is equivalent to the list [ "defaults" ], and a value of false (0) is
>  equivalent to an empty list.
>  
> +=item B<hvm_pirq=BOOLEAN>
> +
> +Select whether the guest is allowed to route interrupts from devices (either
> +emulated or passed through) over event channels.
> +
> +This option is disabled by default.
> +
>  =back
>  
>  =head3 Emulated VGA Graphics Device
> diff --git a/tools/include/libxl.h b/tools/include/libxl.h
> index 907aa0a3303a..f1652b1664f0 100644
> --- a/tools/include/libxl.h
> +++ b/tools/include/libxl.h
> @@ -608,6 +608,13 @@
>   * executable in order to not run it as the same user as libxl.
>   */
>  
> +/*
> + * LIBXL_HAVE_HVM_PIRQ indicates the presence of the u.hvm.pirq filed in
> + * libxl_domain_build_info that signals whether an HVM guest has accesses to
> + * the XENFEAT_hvm_pirqs feature.
> + */
> +#define LIBXL_HAVE_HVM_PIRQ 1
> +
>  /*
>   * libxl memory management
>   *
> diff --git a/tools/libs/light/libxl_create.c b/tools/libs/light/libxl_create.c
> index ce1d43110336..0008fac607e3 100644
> --- a/tools/libs/light/libxl_create.c
> +++ b/tools/libs/light/libxl_create.c
> @@ -376,6 +376,7 @@ int libxl__domain_build_info_setdefault(libxl__gc *gc,
>          libxl_defbool_setdefault(&b_info->u.hvm.usb,                false);
>          libxl_defbool_setdefault(&b_info->u.hvm.vkb_device,         true);
>          libxl_defbool_setdefault(&b_info->u.hvm.xen_platform_pci,   true);
> +        libxl_defbool_setdefault(&b_info->u.hvm.pirq,               false);
>  
>          libxl_defbool_setdefault(&b_info->u.hvm.spice.enable, false);
>          if (!libxl_defbool_val(b_info->u.hvm.spice.enable) &&
> @@ -2375,10 +2376,12 @@ int libxl_domain_create_restore(libxl_ctx *ctx, 
> libxl_domain_config *d_config,
>  
>      /*
>       * When restoring (either from a save file or for a migration domain) set
> -     * the MSR relaxed mode for compatibility with older Xen versions if the
> -     * option is not set as part of the original configuration.
> +     * the MSR relaxed mode and HVM PIRQs for compatibility with older Xen
> +     * versions if the options are not set as part of the original
> +     * configuration.
>       */
>      libxl_defbool_setdefault(&d_config->b_info.arch_x86.msr_relaxed, true);
> +    libxl_defbool_setdefault(&d_config->b_info.u.hvm.pirq, true);
>  
>      return do_domain_create(ctx, d_config, domid, restore_fd, send_back_fd,
>                              params, ao_how, aop_console_how);
> diff --git a/tools/libs/light/libxl_types.idl 
> b/tools/libs/light/libxl_types.idl
> index 7d8bd5d21667..899ad3096926 100644
> --- a/tools/libs/light/libxl_types.idl
> +++ b/tools/libs/light/libxl_types.idl
> @@ -692,6 +692,7 @@ libxl_domain_build_info = Struct("domain_build_info",[
>                                         ("rdm", libxl_rdm_reserve),
>                                         ("rdm_mem_boundary_memkb", MemKB),
>                                         ("mca_caps",         uint64),
> +                                       ("pirq",             libxl_defbool),
>                                         ])),
>                   ("pv", Struct(None, [("kernel", string, {'deprecated_by': 
> 'kernel'}),
>                                        ("slack_memkb", MemKB),
> diff --git a/tools/libs/light/libxl_x86.c b/tools/libs/light/libxl_x86.c
> index d16573e72cd4..a50ec37eb3eb 100644
> --- a/tools/libs/light/libxl_x86.c
> +++ b/tools/libs/light/libxl_x86.c
> @@ -9,6 +9,8 @@ int libxl__arch_domain_prepare_config(libxl__gc *gc,
>      switch(d_config->c_info.type) {
>      case LIBXL_DOMAIN_TYPE_HVM:
>          config->arch.emulation_flags = (XEN_X86_EMU_ALL & ~XEN_X86_EMU_VPCI);
> +        if (!libxl_defbool_val(d_config->b_info.u.hvm.pirq))
> +            config->arch.emulation_flags &= ~XEN_X86_EMU_USE_PIRQ;
>          break;
>      case LIBXL_DOMAIN_TYPE_PVH:
>          config->arch.emulation_flags = XEN_X86_EMU_LAPIC;
> @@ -864,15 +866,19 @@ void libxl__arch_update_domain_config(libxl__gc *gc,
>                                        const libxl_domain_config *src)
>  {
>      /*
> -     * Force MSR relaxed to be set (either to true or false) so it's part of
> -     * the domain configuration when saving or performing a live-migration.
> +     * Force MSR relaxed and HVM pirq to be set (either to true or false) so
> +     * it's part of the domain configuration when saving or performing a
> +     * live-migration.
>       *
> -     * Doing so allows the recovery side to figure out whether the flag 
> should
> +     * Doing so allows the recovery side to figure out whether the flags 
> should
>       * be set to true in order to keep backwards compatibility with already
>       * started domains.
>       */
>      libxl_defbool_setdefault(&dst->b_info.arch_x86.msr_relaxed,
>                      libxl_defbool_val(src->b_info.arch_x86.msr_relaxed));
> +    if (src->c_info.type == LIBXL_DOMAIN_TYPE_HVM )
> +        libxl_defbool_setdefault(&dst->b_info.u.hvm.pirq,
> +                                 libxl_defbool_val(src->b_info.u.hvm.pirq));
>  }
>  
>  /*
> diff --git a/tools/python/xen/lowlevel/xc/xc.c 
> b/tools/python/xen/lowlevel/xc/xc.c
> index d3ea350e07b9..9feb12ae2b16 100644
> --- a/tools/python/xen/lowlevel/xc/xc.c
> +++ b/tools/python/xen/lowlevel/xc/xc.c
> @@ -159,7 +159,9 @@ static PyObject *pyxc_domain_create(XcObject *self,
>  
>  #if defined (__i386) || defined(__x86_64__)
>      if ( config.flags & XEN_DOMCTL_CDF_hvm )
> -        config.arch.emulation_flags = (XEN_X86_EMU_ALL & ~XEN_X86_EMU_VPCI);
> +        config.arch.emulation_flags = XEN_X86_EMU_ALL &
> +                                      ~(XEN_X86_EMU_VPCI |
> +                                        XEN_X86_EMU_USE_PIRQ);
>  #elif defined (__arm__) || defined(__aarch64__)
>      config.arch.gic_version = XEN_DOMCTL_CONFIG_GIC_NATIVE;
>  #else
> diff --git a/tools/xl/xl_parse.c b/tools/xl/xl_parse.c
> index ed983200c3f8..9b358f11b88e 100644
> --- a/tools/xl/xl_parse.c
> +++ b/tools/xl/xl_parse.c
> @@ -1801,6 +1801,7 @@ void parse_config_data(const char *config_source,
>          xlu_cfg_get_defbool(config, "hpet", &b_info->u.hvm.hpet, 0);
>          xlu_cfg_get_defbool(config, "vpt_align", &b_info->u.hvm.vpt_align, 
> 0);
>          xlu_cfg_get_defbool(config, "apic", &b_info->apic, 0);
> +        xlu_cfg_get_defbool(config, "hvm_pirq", &b_info->u.hvm.pirq, 0);
>  
>          switch (xlu_cfg_get_list(config, "viridian",
>                                   &viridian, &num_viridian, 1))
> -- 
> 2.43.0
> 

-- 
Best Regards,
Marek Marczykowski-Górecki
Invisible Things Lab

Attachment: signature.asc
Description: PGP signature


 


Rackspace

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