|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 1/2] amd-iommu: add flush iommu_ops
> -----Original Message-----
> From: Andrew Cooper
> Sent: 30 November 2018 13:04
> To: Paul Durrant <Paul.Durrant@xxxxxxxxxx>; xen-devel@xxxxxxxxxxxxxxxxxxxx
> Cc: Suravee Suthikulpanit <suravee.suthikulpanit@xxxxxxx>; Brian Woods
> <brian.woods@xxxxxxx>; Jan Beulich <jbeulich@xxxxxxxx>; Wei Liu
> <wei.liu2@xxxxxxxxxx>; Roger Pau Monne <roger.pau@xxxxxxxxxx>
> Subject: Re: [PATCH 1/2] amd-iommu: add flush iommu_ops
>
> On 30/11/2018 10:45, Paul Durrant wrote:
> > diff --git a/xen/drivers/passthrough/amd/iommu_map.c
> b/xen/drivers/passthrough/amd/iommu_map.c
> > index 04cb7b3182..c05b042821 100644
> > --- a/xen/drivers/passthrough/amd/iommu_map.c
> > +++ b/xen/drivers/passthrough/amd/iommu_map.c
> > @@ -631,6 +631,54 @@ int amd_iommu_unmap_page(struct domain *d, dfn_t
> dfn)
> > spin_unlock(&hd->arch.mapping_lock);
> >
> > amd_iommu_flush_pages(d, dfn_x(dfn), 0);
> > + return 0;
> > +}
> > +
> > +static unsigned long flush_count(dfn_t dfn, unsigned int page_count,
> > + unsigned int order)
> > +{
> > + unsigned long start = dfn_x(dfn) / (1u << order);
> > + unsigned long end = DIV_ROUND_UP(dfn_x(dfn) + page_count,
> > + (1u << order));
> > +
> > + ASSERT(end > start);
> > + return end - start;
> > +}
> > +
> > +int amd_iommu_flush_iotlb_pages(struct domain *d, dfn_t dfn,
> > + unsigned int page_count)
>
> What are the semantics here? Why page_count rather than order?
Because that's the way the iommu_ops method is declared in the header?
> Are we
> guaranteed to be actually flushing consecutive dfn's ?
I believe so. Looking at the wrapper code and its callers, that seems to be the
assumption.
>
> > +{
> > + /* Match VT-d semantics */
> > + if ( !page_count || dfn_eq(dfn, INVALID_DFN) ||
>
> Do we really have callers passing these? I'd argue that these should be
> invalid to pass (accepting that we might need to tolerate them until
> other cleanup can occur).
I could look at cleaning that up. There aren't many callers.
>
> > + dfn_lt(dfn_add(dfn, page_count), dfn) /* overflow */ )
>
> Given that all users of dfn here want it in unsigned long form, I'd make
> a local dfn_l and use that. I'm not sure that we want to start
> accumulating a sporadic set of binary operator functions for the
> typesafe variables.
>
Ok, I don't really mind. I thought it was neater this way though.
> > diff --git a/xen/include/xen/iommu.h b/xen/include/xen/iommu.h
> > index 3d78126801..da8294bac8 100644
> > --- a/xen/include/xen/iommu.h
> > +++ b/xen/include/xen/iommu.h
> > @@ -52,6 +52,11 @@ static inline bool_t dfn_eq(dfn_t x, dfn_t y)
> > return dfn_x(x) == dfn_x(y);
> > }
> >
> > +static inline bool_t dfn_lt(dfn_t x, dfn_t y)
>
> No new introductions of bool_t please. dfn_eq() shouldn't have been
> bool_t either.
Oops, yes. Cut'n'pasted the wrong thing.
Paul
>
> ~Andrew
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |