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

Re: [Xen-devel] [PATCH v2 2/5] iommu: introduce dom0-iommu option



> -----Original Message-----
> From: Xen-devel [mailto:xen-devel-bounces@xxxxxxxxxxxxxxxxxxxx] On Behalf
> Of Roger Pau Monne
> Sent: 01 August 2018 12:04
> To: xen-devel@xxxxxxxxxxxxxxxxxxxx
> Cc: Kevin Tian <kevin.tian@xxxxxxxxx>; Stefano Stabellini
> <sstabellini@xxxxxxxxxx>; Wei Liu <wei.liu2@xxxxxxxxxx>; Suravee
> Suthikulpanit <suravee.suthikulpanit@xxxxxxx>; George Dunlap
> <George.Dunlap@xxxxxxxxxx>; Andrew Cooper
> <Andrew.Cooper3@xxxxxxxxxx>; Ian Jackson <Ian.Jackson@xxxxxxxxxx>; Tim
> (Xen.org) <tim@xxxxxxx>; Julien Grall <julien.grall@xxxxxxx>; Jan Beulich
> <jbeulich@xxxxxxxx>; Brian Woods <brian.woods@xxxxxxx>; Roger Pau
> Monne <roger.pau@xxxxxxxxxx>
> Subject: [Xen-devel] [PATCH v2 2/5] iommu: introduce dom0-iommu option
> 
> To select the iommu configuration used by Dom0. This option supersedes
> iommu=dom0-strict|dom0-passthrough.
> 
> No functional change.
> 
> Signed-off-by: Roger Pau Monné <roger.pau@xxxxxxxxxx>

Reviewed-by: Paul Durrant <paul.durrant@xxxxxxxxxx>

> ---
> Changes since v1:
>  - New in this version.
> ---
> Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
> Cc: George Dunlap <George.Dunlap@xxxxxxxxxxxxx>
> Cc: Ian Jackson <ian.jackson@xxxxxxxxxxxxx>
> Cc: Jan Beulich <jbeulich@xxxxxxxx>
> Cc: Julien Grall <julien.grall@xxxxxxx>
> Cc: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx>
> Cc: Stefano Stabellini <sstabellini@xxxxxxxxxx>
> Cc: Tim Deegan <tim@xxxxxxx>
> Cc: Wei Liu <wei.liu2@xxxxxxxxxx>
> Cc: Suravee Suthikulpanit <suravee.suthikulpanit@xxxxxxx>
> Cc: Brian Woods <brian.woods@xxxxxxx>
> Cc: Kevin Tian <kevin.tian@xxxxxxxxx>
> ---
>  docs/misc/xen-command-line.markdown         | 32 ++++++++++++++
>  xen/arch/x86/x86_64/mm.c                    |  3 +-
>  xen/drivers/passthrough/amd/iommu_init.c    |  2 +-
>  xen/drivers/passthrough/amd/pci_amd_iommu.c |  4 +-
>  xen/drivers/passthrough/iommu.c             | 46 +++++++++++++++++----
>  xen/drivers/passthrough/vtd/iommu.c         | 16 +++----
>  xen/include/xen/iommu.h                     |  6 ++-
>  7 files changed, 88 insertions(+), 21 deletions(-)
> 
> diff --git a/docs/misc/xen-command-line.markdown b/docs/misc/xen-
> command-line.markdown
> index 65b4754418..a2a07cc6c8 100644
> --- a/docs/misc/xen-command-line.markdown
> +++ b/docs/misc/xen-command-line.markdown
> @@ -1150,12 +1150,18 @@ detection of systems known to misbehave upon
> accesses to that port.
> 
>  > `dom0-passthrough`
> 
> +> **WARNING: This command line option is deprecated, and superseded
> by
> +> _dom0-iommu=none_ - using both options in combination is
> undefined.**
> +
>  > Default: `false`
> 
>  >> Control whether to disable DMA remapping for Dom0.
> 
>  > `dom0-strict`
> 
> +> **WARNING: This command line option is deprecated, and superseded
> by
> +> _dom0-iommu=strict_ - using both options in combination is
> undefined.**
> +
>  > Default: `false`
> 
>  >> Control whether to set up DMA remapping only for the memory Dom0
> actually
> @@ -1198,6 +1204,32 @@ detection of systems known to misbehave upon
> accesses to that port.
> 
>  >> Enable IOMMU debugging code (implies `verbose`).
> 
> +### dom0-iommu
> +> `= List of [ none | strict | relaxed ]`
> +
> +> Sub-options are of boolean kind and can be prefixed with `no-` to effect
> the
> +> inverse meaning.
> +
> +> `none`
> +
> +> Default: `false`
> +
> +>> Control whether to disable DMA remapping for Dom0.
> +
> +> `strict`
> +
> +> Default: `false`
> +
> +>> Control whether to set up DMA remapping only for the memory Dom0
> actually
> +>> got assigned.
> +
> +> `relaxed`
> +
> +> Default: `true`
> +
> +>> Controls whether to setup DMA remappings for all the host RAM except
> regions
> +>> in use by Xen.
> +
>  ### iommu\_dev\_iotlb\_timeout
>  > `= <integer>`
> 
> diff --git a/xen/arch/x86/x86_64/mm.c b/xen/arch/x86/x86_64/mm.c
> index cca4ae926e..84226b3326 100644
> --- a/xen/arch/x86/x86_64/mm.c
> +++ b/xen/arch/x86/x86_64/mm.c
> @@ -1426,7 +1426,8 @@ int memory_add(unsigned long spfn, unsigned long
> epfn, unsigned int pxm)
>      if ( ret )
>          goto destroy_m2p;
> 
> -    if ( iommu_enabled && !iommu_passthrough &&
> !need_iommu(hardware_domain) )
> +    if ( iommu_enabled && !iommu_dom0_passthrough &&
> +         !need_iommu(hardware_domain) )
>      {
>          for ( i = spfn; i < epfn; i++ )
>              if ( iommu_map_page(hardware_domain, i, i,
> IOMMUF_readable|IOMMUF_writable) )
> diff --git a/xen/drivers/passthrough/amd/iommu_init.c
> b/xen/drivers/passthrough/amd/iommu_init.c
> index 474992a75a..ad8c48be1c 100644
> --- a/xen/drivers/passthrough/amd/iommu_init.c
> +++ b/xen/drivers/passthrough/amd/iommu_init.c
> @@ -1062,7 +1062,7 @@ static void __init amd_iommu_init_cleanup(void)
>      radix_tree_destroy(&ivrs_maps, xfree);
> 
>      iommu_enabled = 0;
> -    iommu_passthrough = 0;
> +    iommu_dom0_passthrough = false;
>      iommu_intremap = 0;
>      iommuv2_enabled = 0;
>  }
> diff --git a/xen/drivers/passthrough/amd/pci_amd_iommu.c
> b/xen/drivers/passthrough/amd/pci_amd_iommu.c
> index 12d2695b89..eeacf713e4 100644
> --- a/xen/drivers/passthrough/amd/pci_amd_iommu.c
> +++ b/xen/drivers/passthrough/amd/pci_amd_iommu.c
> @@ -121,7 +121,7 @@ static void amd_iommu_setup_domain_device(
>      BUG_ON( !hd->arch.root_table || !hd->arch.paging_mode ||
>              !iommu->dev_table.buffer );
> 
> -    if ( iommu_passthrough && is_hardware_domain(domain) )
> +    if ( iommu_dom0_passthrough && is_hardware_domain(domain) )
>          valid = 0;
> 
>      if ( ats_enabled )
> @@ -256,7 +256,7 @@ static void __hwdom_init
> amd_iommu_hwdom_init(struct domain *d)
>      if ( allocate_domain_resources(dom_iommu(d)) )
>          BUG();
> 
> -    if ( !iommu_passthrough && !need_iommu(d) )
> +    if ( !iommu_dom0_passthrough && !need_iommu(d) )
>      {
>          int rc = 0;
> 
> diff --git a/xen/drivers/passthrough/iommu.c
> b/xen/drivers/passthrough/iommu.c
> index 70d218f910..88e23bbd04 100644
> --- a/xen/drivers/passthrough/iommu.c
> +++ b/xen/drivers/passthrough/iommu.c
> @@ -22,6 +22,7 @@
>  #include <xsm/xsm.h>
> 
>  static int parse_iommu_param(const char *s);
> +static int parse_dom0_iommu_param(const char *s);
>  static void iommu_dump_p2m_table(unsigned char key);
> 
>  unsigned int __read_mostly iommu_dev_iotlb_timeout = 1000;
> @@ -52,11 +53,9 @@ custom_param("iommu", parse_iommu_param);
>  bool_t __initdata iommu_enable = 1;
>  bool_t __read_mostly iommu_enabled;
>  bool_t __read_mostly force_iommu;
> -bool_t __hwdom_initdata iommu_dom0_strict;
>  bool_t __read_mostly iommu_verbose;
>  bool_t __read_mostly iommu_workaround_bios_bug;
>  bool_t __read_mostly iommu_igfx = 1;
> -bool_t __read_mostly iommu_passthrough;
>  bool_t __read_mostly iommu_snoop = 1;
>  bool_t __read_mostly iommu_qinval = 1;
>  bool_t __read_mostly iommu_intremap = 1;
> @@ -72,6 +71,10 @@ bool_t __read_mostly iommu_hap_pt_share = 1;
>  bool_t __read_mostly iommu_debug;
>  bool_t __read_mostly amd_iommu_perdev_intremap = 1;
> 
> +custom_param("dom0-iommu", parse_dom0_iommu_param);
> +bool __hwdom_initdata iommu_dom0_strict;
> +bool __read_mostly iommu_dom0_passthrough;
> +
>  DEFINE_PER_CPU(bool_t, iommu_dont_flush_iotlb);
> 
>  DEFINE_SPINLOCK(iommu_pt_cleanup_lock);
> @@ -121,7 +124,7 @@ static int __init parse_iommu_param(const char *s)
>          else if ( !strncmp(s, "amd-iommu-perdev-intremap", ss - s) )
>              amd_iommu_perdev_intremap = val;
>          else if ( !strncmp(s, "dom0-passthrough", ss - s) )
> -            iommu_passthrough = val;
> +            iommu_dom0_passthrough = val;
>          else if ( !strncmp(s, "dom0-strict", ss - s) )
>              iommu_dom0_strict = val;
>          else if ( !strncmp(s, "sharept", ss - s) )
> @@ -135,6 +138,35 @@ static int __init parse_iommu_param(const char *s)
>      return rc;
>  }
> 
> +static int __init parse_dom0_iommu_param(const char *s)
> +{
> +    const char *ss;
> +    int val, rc = 0;
> +
> +    do {
> +        val = !!strncmp(s, "no-", 3);
> +        if ( !val )
> +            s += 3;
> +
> +        ss = strchr(s, ',');
> +        if ( !ss )
> +            ss = strchr(s, '\0');
> +
> +        if ( !strncmp(s, "none", ss - s) )
> +            iommu_dom0_passthrough = val;
> +        else if ( !strncmp(s, "strict", ss - s) )
> +            iommu_dom0_strict = val;
> +        else if ( !strncmp(s, "relaxed", ss - s) )
> +            iommu_dom0_strict = !val;
> +        else
> +            rc = -EINVAL;
> +
> +        s = ss + 1;
> +    } while ( *ss );
> +
> +    return rc;
> +}
> +
>  int iommu_domain_init(struct domain *d)
>  {
>      struct domain_iommu *hd = dom_iommu(d);
> @@ -158,7 +190,7 @@ static void __hwdom_init check_hwdom_reqs(struct
> domain *d)
> 
>      arch_iommu_check_autotranslated_hwdom(d);
> 
> -    if ( iommu_passthrough )
> +    if ( iommu_dom0_passthrough )
>          panic("Dom0 uses paging translated mode, dom0-passthrough must not
> be "
>                "enabled\n");
> 
> @@ -372,7 +404,7 @@ int __init iommu_setup(void)
>      bool_t force_intremap = force_iommu && iommu_intremap;
> 
>      if ( iommu_dom0_strict )
> -        iommu_passthrough = 0;
> +        iommu_dom0_passthrough = false;
> 
>      if ( iommu_enable )
>      {
> @@ -393,14 +425,14 @@ int __init iommu_setup(void)
>      if ( !iommu_enabled )
>      {
>          iommu_snoop = 0;
> -        iommu_passthrough = 0;
> +        iommu_dom0_passthrough = false;
>          iommu_dom0_strict = 0;
>      }
>      printk("I/O virtualisation %sabled\n", iommu_enabled ? "en" : "dis");
>      if ( iommu_enabled )
>      {
>          printk(" - Dom0 mode: %s\n",
> -               iommu_passthrough ? "Passthrough" :
> +               iommu_dom0_passthrough ? "Passthrough" :
>                 iommu_dom0_strict ? "Strict" : "Relaxed");
>          printk("Interrupt remapping %sabled\n", iommu_intremap ? "en" :
> "dis");
>          tasklet_init(&iommu_pt_cleanup_tasklet, iommu_free_pagetables, 0);
> diff --git a/xen/drivers/passthrough/vtd/iommu.c
> b/xen/drivers/passthrough/vtd/iommu.c
> index 1710256823..8ac774215b 100644
> --- a/xen/drivers/passthrough/vtd/iommu.c
> +++ b/xen/drivers/passthrough/vtd/iommu.c
> @@ -1304,7 +1304,7 @@ static void __hwdom_init
> intel_iommu_hwdom_init(struct domain *d)
>  {
>      struct acpi_drhd_unit *drhd;
> 
> -    if ( !iommu_passthrough && is_pv_domain(d) )
> +    if ( !iommu_dom0_passthrough && is_pv_domain(d) )
>      {
>          /* Set up 1:1 page table for hardware domain. */
>          vtd_set_hwdom_mapping(d);
> @@ -1391,7 +1391,7 @@ int domain_context_mapping_one(
>          return res;
>      }
> 
> -    if ( iommu_passthrough && is_hardware_domain(domain) )
> +    if ( iommu_dom0_passthrough && is_hardware_domain(domain) )
>      {
>          context_set_translation_type(*context, CONTEXT_TT_PASS_THRU);
>          agaw = level_to_agaw(iommu->nr_pt_levels);
> @@ -1781,7 +1781,7 @@ static int __must_check
> intel_iommu_map_page(struct domain *d,
>          return 0;
> 
>      /* Do nothing if hardware domain and iommu supports pass thru. */
> -    if ( iommu_passthrough && is_hardware_domain(d) )
> +    if ( iommu_dom0_passthrough && is_hardware_domain(d) )
>          return 0;
> 
>      spin_lock(&hd->arch.mapping_lock);
> @@ -1826,7 +1826,7 @@ static int __must_check
> intel_iommu_unmap_page(struct domain *d,
>                                                 unsigned long gfn)
>  {
>      /* Do nothing if hardware domain and iommu supports pass thru. */
> -    if ( iommu_passthrough && is_hardware_domain(d) )
> +    if ( iommu_dom0_passthrough && is_hardware_domain(d) )
>          return 0;
> 
>      return dma_pte_clear_one(d, (paddr_t)gfn << PAGE_SHIFT_4K);
> @@ -2269,8 +2269,8 @@ int __init intel_vtd_setup(void)
>          if ( iommu_snoop && !ecap_snp_ctl(iommu->ecap) )
>              iommu_snoop = 0;
> 
> -        if ( iommu_passthrough && !ecap_pass_thru(iommu->ecap) )
> -            iommu_passthrough = 0;
> +        if ( iommu_dom0_passthrough && !ecap_pass_thru(iommu->ecap) )
> +            iommu_dom0_passthrough = false;
> 
>          if ( iommu_qinval && !ecap_queued_inval(iommu->ecap) )
>              iommu_qinval = 0;
> @@ -2308,7 +2308,7 @@ int __init intel_vtd_setup(void)
> 
>  #define P(p,s) printk("Intel VT-d %s %senabled.\n", s, (p)? "" : "not ")
>      P(iommu_snoop, "Snoop Control");
> -    P(iommu_passthrough, "Dom0 DMA Passthrough");
> +    P(iommu_dom0_passthrough, "Dom0 DMA Passthrough");
>      P(iommu_qinval, "Queued Invalidation");
>      P(iommu_intremap, "Interrupt Remapping");
>      P(iommu_intpost, "Posted Interrupt");
> @@ -2330,7 +2330,7 @@ int __init intel_vtd_setup(void)
>   error:
>      iommu_enabled = 0;
>      iommu_snoop = 0;
> -    iommu_passthrough = 0;
> +    iommu_dom0_passthrough = false;
>      iommu_qinval = 0;
>      iommu_intremap = 0;
>      iommu_intpost = 0;
> diff --git a/xen/include/xen/iommu.h b/xen/include/xen/iommu.h
> index 6b42e3b876..c0c6975ac4 100644
> --- a/xen/include/xen/iommu.h
> +++ b/xen/include/xen/iommu.h
> @@ -29,13 +29,15 @@
>  #include <asm/iommu.h>
> 
>  extern bool_t iommu_enable, iommu_enabled;
> -extern bool_t force_iommu, iommu_dom0_strict, iommu_verbose;
> -extern bool_t iommu_workaround_bios_bug, iommu_igfx,
> iommu_passthrough;
> +extern bool_t force_iommu, iommu_verbose;
> +extern bool_t iommu_workaround_bios_bug, iommu_igfx;
>  extern bool_t iommu_snoop, iommu_qinval, iommu_intremap,
> iommu_intpost;
>  extern bool_t iommu_hap_pt_share;
>  extern bool_t iommu_debug;
>  extern bool_t amd_iommu_perdev_intremap;
> 
> +extern bool iommu_dom0_strict, iommu_dom0_passthrough;
> +
>  extern unsigned int iommu_dev_iotlb_timeout;
> 
>  int iommu_setup(void);
> --
> 2.18.0
> 
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxxxxxxxxx
> https://lists.xenproject.org/mailman/listinfo/xen-devel
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel

 


Rackspace

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