|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v4 4/4] x86/iommu: add reserved dom0-iommu option to map reserved memory ranges
On Thu, Aug 09, 2018 at 01:36:57AM -0600, Jan Beulich wrote:
> >>> On 08.08.18 at 18:18, <roger.pau@xxxxxxxxxx> wrote:
> > On Wed, Aug 08, 2018 at 07:15:54AM -0600, Jan Beulich wrote:
> >> >>> On 08.08.18 at 12:07, <roger.pau@xxxxxxxxxx> wrote:
> >> > @@ -134,13 +135,67 @@ void arch_iommu_domain_destroy(struct domain *d)
> >> > {
> >> > }
> >> >
> >> > +static bool __hwdom_init hwdom_iommu_map(const struct domain *d,
> >> > unsigned long pfn,
> >> > + unsigned long max_pfn)
> >> > +{
> >> > + unsigned int i;
> >> > +
> >> > + /*
> >> > + * Ignore any address below 1MB, that's already identity mapped by
> >> > the
> >> > + * domain builder for HVM.
> >> > + */
> >> > + if ( (is_hvm_domain(d) && pfn < PFN_DOWN(MB(1))) ||
> >>
> >> Careful again here with the distinction between Dom0 and hwdom:
> >> The domain builder you refer to is - aiui - the in-Xen one, i.e. the
> >> one _only_ dealing with Dom0.
> >
> > So this should instead be:
> >
> > if ( (is_control_domain(d) && is_hvm_domain(d) && pfn < PFN_DOWN(MB(1))) ||
>
> From an abstract perspective (long term plans) is_control_domain()
> can be true for multiple domains, none of which may be Dom0 or
> hwdom. So no, I don't think the addition would help in any way.
> With the reference to the in-Xen domain builder, I think you really
> mean Dom0 here.
OK, I will check against the domid then.
> >> > + /*
> >> > + * If dom0-strict mode is enabled or the guest type is PVH/HVM then
> >> > exclude
> >> > + * conventional RAM and let the common code map dom0's pages.
> >> > + */
> >> > + if ( page_is_ram_type(pfn, RAM_TYPE_CONVENTIONAL) &&
> >> > + (iommu_dom0_strict || is_hvm_domain(d)) )
> >> > + return false;
> >> > + if ( page_is_ram_type(pfn, RAM_TYPE_RESERVED) &&
> >> > + !iommu_dom0_reserved && !iommu_dom0_inclusive )
> >> > + return false;
> >> > + if ( !page_is_ram_type(pfn, RAM_TYPE_UNUSABLE) &&
> >> > + !page_is_ram_type(pfn, RAM_TYPE_RESERVED) &&
> >> > + !page_is_ram_type(pfn, RAM_TYPE_CONVENTIONAL) &&
> >> > + (!iommu_dom0_inclusive || pfn > max_pfn) )
> >> > + return false;
> >>
> >> As page_is_ram_type() is, especially on systems with many E820
> >> entries, not really cheap, I think at least a minimum amount of
> >> optimization is on order here - after all you do this for every
> >> single page of the system. Hence minimally the result of the first
> >> CONVENTIONAL and RESERVED queries should be latched and
> >> re-used (or "else" be used suitably). Ideally an approach would
> >> be used which involved just a single iteration through the E820
> >> map, but I realize this may be more than is feasible here.
> >
> > This would be quite better if I could just fetch the type, then I
> > could add a switch (type) { ... and it would be better IMO.
>
> Except that, as said, there's no "the" type for an entire page.
> Only a single byte can have an exact type.
Right, I don0t think the original code was much better in that regard
anyway, neither I'm sure about how to handle this any better.
> >> Furthermore I'm unconvinced the !page_is_ram_type() uses
> >> are really what you want: The function returning false means
> >> "don't know", not "no". Perhaps the function needs to be made
> >> return a tristate (yes, no, or part of it).
> >
> > Right, that's why I have three different !page_is_ram_type checks in
> > the last branch of the if, so that I can make sure it's not one of the
> > previous types and also account for holes.
>
> I'm afraid I don't understand. Take the example of a single
> page being split in an unusable and a reserved part. Both
> respective function invocations will return false. Yet you
> want to exclude both unusable and reserved types when
> !iommu_dom0_inclusive, and hence your goal would be to
> exclude that page here.
Right, but I'm not sure how to fix this given the current interfaces.
I plan to introduce something like page_get_type() that returns the
whole type for a page in a similar fashion to what page_is_ram_type
currently does, but this is not going to solve the issue of a page
having different types.
> As to unusable - don't you break original behavior here
> anyway? Shouldn't the function return false when
> page_is_ram_type(pfn, RAM_TYPE_UNUSABLE), effectively
> independent of any command line options?
Yes, I think so, will fix it in the next version.
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |