|
|
|
|
|
|
|
|
|
|
xen-ia64-devel
Re: [Xen-ia64-devel] [PATCH] Fix some IPF Xen VT-d bugs
On Wed, Dec 24, 2008 at 01:11:03PM +0800, Cui, Dexuan wrote:
> Isaku Yamahata wrote:
> >> diff -r 008b68ff6095 xen/arch/ia64/xen/domain.c
> >> --- a/xen/arch/ia64/xen/domain.c Tue Nov 18 10:33:55 2008 +0900
> >> +++ b/xen/arch/ia64/xen/domain.c Mon Dec 15 18:41:52 2008 +0800
> >> @@ -602,10 +602,8 @@ int arch_domain_create(struct domain *d,
> >> if ((d->arch.mm.pgd = pgd_alloc(&d->arch.mm)) == NULL) goto
> >> fail_nomem;
> >>
> >> - if ( iommu_enabled && (is_hvm_domain(d) || need_iommu(d)) ){
> >> - if(iommu_domain_init(d) != 0)
> >> - goto fail_iommu;
> >> - }
> >> + if(iommu_domain_init(d) != 0)
> >> + goto fail_iommu;
> >>
> >> /*
> >> * grant_table_create() can't fully initialize grant table for
> >> domain
> >
> > Please don't drop is_hvm_domain(d) check.
> > At this moment ia64 doesn't support iommu for PV domain because
> Oh, thanks for the reminder. Here I neglected this.
>
> Do you mean this:
> if ( is_hvm_domain(d) )
> if(iommu_domain_init(d) != 0)
> goto fail_iommu;
> This is also not ok since we must ensure iommu_domain_init() is invoked for
> Dom0 -- we need the function invoked to enable DMA remapping.
>
> So how about changing the logic to:
> if ( (d->domain_id == 0) || is_hvm_domain(d) )
> if(iommu_domain_init(d) != 0)
> goto fail_iommu;
>
> If you agree this, I'll post a new patch.
Do you mean if ( d->domain_id == 0 ) clause in
he function, intel_iommu_domain_init()?
Is iommu map/unmap for dom0 is necessary?
intel_iommu_domain_init() maps all the pages excect ones xen uses
to dom0. I suppose this is what you want.
However later pages is mapped/unmapped even for dom0 because
need_iommu(dom0) returns true due ot iommu_domain_init(dom0).
Since dom0 is PV, so iommu mapping/unmapping causes race on ia64.
Only setting up iommu tables at the dom0 creation is necessary,
all "if ( iommu_enabled && (is_hvm_domain(d) || need_iommu(d)) )"
would be "if ( iommu_enabled && is_hvm_domain(d) && need_iommu(d)) )"
intel_iommu_domain_init() and dom0 memory size
calc_dom0_size() in xen/arch/ia64/domain.c calculates default dom0
memory size. You should take memory for iommu page table
into account because the memory size for iommu page table wouldn't
be neglectable.
probably iommu_pages = (max phys addr) / PTRS_PER_PTE_4K + (some spare)
where PTRS_PER_PTE_4K = (1 << (PAGE_SHIFT_4K - 3))
intel_iommu_domain_init() and sparse memory.
To be honest, I'm not sure how it matters in practice.
On ia64 memory might be located sparsely. So iommu page table
should also sparse instead of [0, max_page] - (xen page).
You want to use efi_memmap_walk() instead of for loop.
thanks,
--
yamahata
_______________________________________________
Xen-ia64-devel mailing list
Xen-ia64-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ia64-devel
|
|
|
|
|