WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

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