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

Re: [Xen-devel] [PATCH v12 8/9] mm / iommu: include need_iommu() test in iommu_use_hap_pt()



> -----Original Message-----
> From: Julien Grall [mailto:julien.grall@xxxxxxx]
> Sent: 01 October 2018 11:37
> To: Paul Durrant <Paul.Durrant@xxxxxxxxxx>; xen-devel@xxxxxxxxxxxxxxxxxxxx
> Cc: Jun Nakajima <jun.nakajima@xxxxxxxxx>; George Dunlap
> <George.Dunlap@xxxxxxxxxx>; Jan Beulich <jbeulich@xxxxxxxx>; Andrew Cooper
> <Andrew.Cooper3@xxxxxxxxxx>; Stefano Stabellini <sstabellini@xxxxxxxxxx>
> Subject: Re: [PATCH v12 8/9] mm / iommu: include need_iommu() test in
> iommu_use_hap_pt()
> 
> Hi Paul,
> 
> On 09/27/2018 03:33 PM, Paul Durrant wrote:
> > The name 'iommu_use_hap_pt' suggests that that P2M table is in use as
> the
> > domain's IOMMU pagetable which, prior to this patch, is not strictly
> true
> > since the macro did not test whether the domain actually has IOMMU
> > mappings.
> 
> Well, I think we assume that iommu_use_hap_pt() will only be called when
> need_iommu(d) == 1.

Yes.

> At the end, you will still need to check
> need_iommu(d) outside because iommu_use_hap_pt() may now return 0 for
> domain without IOMMU or for domain not sharing p2m with the IOMMU.
> 
> Do you expect an improvement in long-term?
> 

Yes. The ultimate goal is the patch to split up need_iommu() into separate 
macros for 'domain has IOMMU pt' and 'domain needs explicit sync of IOMMU pt' 
and this seems like a logical step. For 'need explicit sync of IOMMU pt' to 
true then 'has IOMMU pt' clearly needs to be true, so I wanted the macro for 
'sharing IOMMU pt' to have the same predicate.

  Paul

> Cheers,
> 
> >
> > Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx>
> > Reviewed-by: Kevin Tian <kevin.tian@xxxxxxxxx>
> > ---
> > Cc: Jun Nakajima <jun.nakajima@xxxxxxxxx>
> > Cc: George Dunlap <george.dunlap@xxxxxxxxxxxxx>
> > Cc: Jan Beulich <jbeulich@xxxxxxxx>
> > Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
> > Cc: Stefano Stabellini <sstabellini@xxxxxxxxxx>
> > Cc: Julien Grall <julien.grall@xxxxxxx>
> >
> > v11:
> >   - Pulled in from v6 of the full PV-IOMMU series.
> >
> > v4:
> >   - New in v4.
> > ---
> >   xen/arch/x86/mm/p2m-ept.c       | 6 +++---
> >   xen/arch/x86/mm/p2m-pt.c        | 6 +++---
> >   xen/arch/x86/mm/p2m.c           | 2 +-
> >   xen/drivers/passthrough/iommu.c | 2 +-
> >   xen/include/asm-arm/iommu.h     | 2 +-
> >   xen/include/asm-x86/iommu.h     | 5 +++--
> >   6 files changed, 12 insertions(+), 11 deletions(-)
> >
> > diff --git a/xen/arch/x86/mm/p2m-ept.c b/xen/arch/x86/mm/p2m-ept.c
> > index af7674f7e1..f0d93856f2 100644
> > --- a/xen/arch/x86/mm/p2m-ept.c
> > +++ b/xen/arch/x86/mm/p2m-ept.c
> > @@ -863,12 +863,12 @@ out:
> >           ept_sync_domain(p2m);
> >
> >       /* For host p2m, may need to change VT-d page table.*/
> > -    if ( rc == 0 && p2m_is_hostp2m(p2m) && need_iommu(d) &&
> > +    if ( rc == 0 && p2m_is_hostp2m(p2m) &&
> >            need_modify_vtd_table )
> >       {
> > -        if ( iommu_hap_pt_share )
> > +        if ( iommu_use_hap_pt(d) )
> >               rc = iommu_pte_flush(d, gfn, &ept_entry->epte, order,
> vtd_pte_present);
> > -        else
> > +        else if ( need_iommu(d) )
> >           {
> >               dfn_t dfn = _dfn(gfn);
> >
> > diff --git a/xen/arch/x86/mm/p2m-pt.c b/xen/arch/x86/mm/p2m-pt.c
> > index 607046f31b..6b30337f62 100644
> > --- a/xen/arch/x86/mm/p2m-pt.c
> > +++ b/xen/arch/x86/mm/p2m-pt.c
> > @@ -677,8 +677,8 @@ p2m_pt_set_entry(struct p2m_domain *p2m, gfn_t gfn_,
> mfn_t mfn,
> >            && (gfn + (1UL << page_order) - 1 > p2m->max_mapped_pfn) )
> >           p2m->max_mapped_pfn = gfn + (1UL << page_order) - 1;
> >
> > -    if ( iommu_enabled && need_iommu(p2m->domain) &&
> > -         (iommu_old_flags != iommu_pte_flags || old_mfn != mfn_x(mfn))
> )
> > +    if ( iommu_enabled && (iommu_old_flags != iommu_pte_flags ||
> > +                           old_mfn != mfn_x(mfn)) )
> >       {
> >           ASSERT(rc == 0);
> >
> > @@ -687,7 +687,7 @@ p2m_pt_set_entry(struct p2m_domain *p2m, gfn_t gfn_,
> mfn_t mfn,
> >               if ( iommu_old_flags )
> >                   amd_iommu_flush_pages(p2m->domain, gfn, page_order);
> >           }
> > -        else
> > +        else if ( need_iommu(p2m->domain) )
> >           {
> >               dfn_t dfn = _dfn(gfn);
> >
> > diff --git a/xen/arch/x86/mm/p2m.c b/xen/arch/x86/mm/p2m.c
> > index 537add65bb..97bb3feacc 100644
> > --- a/xen/arch/x86/mm/p2m.c
> > +++ b/xen/arch/x86/mm/p2m.c
> > @@ -2091,7 +2091,7 @@ static unsigned int mmio_order(const struct domain
> *d,
> >        * - exclude PV guests, should execution reach this code for such.
> >        * So be careful when altering this.
> >        */
> > -    if ( !need_iommu(d) || !iommu_use_hap_pt(d) ||
> > +    if ( !iommu_use_hap_pt(d) ||
> >            (start_fn & ((1UL << PAGE_ORDER_2M) - 1)) || !(nr >>
> PAGE_ORDER_2M) )
> >           return PAGE_ORDER_4K;
> >
> > diff --git a/xen/drivers/passthrough/iommu.c
> b/xen/drivers/passthrough/iommu.c
> > index 9cb1793144..ea7ccbace7 100644
> > --- a/xen/drivers/passthrough/iommu.c
> > +++ b/xen/drivers/passthrough/iommu.c
> > @@ -475,7 +475,7 @@ int iommu_do_domctl(
> >
> >   void iommu_share_p2m_table(struct domain* d)
> >   {
> > -    if ( iommu_enabled && iommu_use_hap_pt(d) )
> > +    if ( iommu_use_hap_pt(d) )
> >           iommu_get_ops()->share_p2m(d);
> >   }
> >
> > diff --git a/xen/include/asm-arm/iommu.h b/xen/include/asm-arm/iommu.h
> > index 57d9b1e14a..8d1506c6f7 100644
> > --- a/xen/include/asm-arm/iommu.h
> > +++ b/xen/include/asm-arm/iommu.h
> > @@ -21,7 +21,7 @@ struct arch_iommu
> >   };
> >
> >   /* Always share P2M Table between the CPU and the IOMMU */
> > -#define iommu_use_hap_pt(d) (1)
> > +#define iommu_use_hap_pt(d) (need_iommu(d))
> >
> >   const struct iommu_ops *iommu_get_ops(void);
> >   void __init iommu_set_ops(const struct iommu_ops *ops);
> > diff --git a/xen/include/asm-x86/iommu.h b/xen/include/asm-x86/iommu.h
> > index 0ed4a9e86d..7c3187c8ec 100644
> > --- a/xen/include/asm-x86/iommu.h
> > +++ b/xen/include/asm-x86/iommu.h
> > @@ -89,8 +89,9 @@ static inline int iommu_hardware_setup(void)
> >       return -ENODEV;
> >   }
> >
> > -/* Does this domain have a P2M table we can use as its IOMMU pagetable?
> */
> > -#define iommu_use_hap_pt(d) (hap_enabled(d) && iommu_hap_pt_share)
> > +/* Are we using the domain P2M table as its IOMMU pagetable? */
> > +#define iommu_use_hap_pt(d) \
> > +    (hap_enabled(d) && need_iommu(d) && iommu_hap_pt_share)
> >
> >   void iommu_update_ire_from_apic(unsigned int apic, unsigned int reg,
> unsigned int value);
> >   unsigned int iommu_read_apic_from_ire(unsigned int apic, unsigned int
> reg);
> >
> 
> --
> Julien Grall
_______________________________________________
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®.