|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2 07/13] iommu: Make decision about needing IOMMU for hardware domains in advance
Hi, Jan.
On Wed, Dec 6, 2017 at 7:01 PM, Jan Beulich <JBeulich@xxxxxxxx> wrote:
>>>> On 25.07.17 at 19:26, <olekstysh@xxxxxxxxx> wrote:
>> From: Oleksandr Tyshchenko <oleksandr_tyshchenko@xxxxxxxx>
>>
>> The hardware domains require IOMMU to be used in the most cases and
>> a decision to use it is made at hardware domain construction time.
>> But, it is not the best moment for the non-shared IOMMUs due to
>> the necessity of retrieving all mapping which could happen in a period
>> of time between IOMMU per-domain initialization and this moment.
>
> Which mappings are you talking about here? Just like with the earlier
> patch - the reason for the change needs to be clear to someone
> reading just this commit message.
I am talking about the IOMMU mappings (gfn <-> mfn) which were skipped and
as the result they didn't reach IOMMU pagetable.
P2M code didn't invoke iommu_map_pages() since a "need_iommu" flag wasn't set.
So, iterating through the list of the pages we had to re-create lost
IOMMU mapping page by page.
I will clarify description.
>
>> @@ -141,6 +141,15 @@ int iommu_domain_init(struct domain *d, bool use_iommu)
>> if ( !iommu_enabled )
>> return 0;
>>
>> + if ( is_hardware_domain(d) )
>> + {
>> + if ( (paging_mode_translate(d) && !iommu_passthrough) ||
>> + iommu_dom0_strict )
>> + use_iommu = 1;
>> + else
>> + use_iommu = 0;
>
> I'd prefer if you used a simple assignment here, rather than if/else.
ok
>
>> @@ -175,37 +182,6 @@ void __hwdom_init iommu_hwdom_init(struct domain *d)
>> return;
>>
>> register_keyhandler('o', &iommu_dump_p2m_table, "dump iommu p2m table",
>> 0);
>> - d->need_iommu = !!iommu_dom0_strict;
>> - if ( need_iommu(d) && !iommu_use_hap_pt(d) )
>> - {
>> - struct page_info *page;
>> - unsigned int i = 0;
>> - int rc = 0;
>> -
>> - page_list_for_each ( page, &d->page_list )
>> - {
>> - unsigned long mfn = page_to_mfn(page);
>> - unsigned long gfn = mfn_to_gmfn(d, mfn);
>> - unsigned int mapping = IOMMUF_readable;
>> - int ret;
>> -
>> - if ( ((page->u.inuse.type_info & PGT_count_mask) == 0) ||
>> - ((page->u.inuse.type_info & PGT_type_mask)
>> - == PGT_writable_page) )
>> - mapping |= IOMMUF_writable;
>> -
>> - ret = hd->platform_ops->map_pages(d, gfn, mfn, 0, mapping);
>> - if ( !rc )
>> - rc = ret;
>> -
>> - if ( !(i++ & 0xfffff) )
>> - process_pending_softirqs();
>> - }
>> -
>> - if ( rc )
>> - printk(XENLOG_WARNING "d%d: IOMMU mapping failed: %d\n",
>> - d->domain_id, rc);
>> - }
>>
>> return hd->platform_ops->hwdom_init(d);
>> }
>
> Just to double check - this change was tested on x86 Dom0, at
> least PV (for PVH I'd at least expect that you've did some static
> code analysis to make sure this doesn't put in further roadblocks)?
I am afraid I didn't get the second part of this sentence.
>
> Jan
>
--
Regards,
Oleksandr Tyshchenko
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |