[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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |