On Wed, Oct 22, 2008 at 05:35:36PM +0800, Xu, Anthony wrote:
> The new one,
>
>
> >> - if (phy_pte.ma != VA_MATTR_NATPAGE)
> >> + /* if a device is assigned to a domain through VTD, the MMIO
> >> for this + * device needs to retain to UC attribute
> >> + */
> >> + if (phy_pte.ma == VA_MATTR_WC)
> >> phy_pte.ma = VA_MATTR_WB;
> >>
> >
> > Doesn't this break the intention of the c/s 15134:466f71b1e831?a
> > To be honest, I'm not sure. Kyouya or Akio, do you have any comments?
> >
> This section is not included, need kyouya or akio confirmation.
>
> Patches about mm.c is not inculded,
> I'll send out a separate patch.
Sounds good. the stuff in mm.c seems very tough.
However the following patch still touches mm.c.
Did you forget to remove it accidently?
I had given it consideration a bit.
I suppose the lockless implementation is possible.
In fact tlb insert case is handled by retry using the p2m entry
as change indicator. See ia64_do_page_fault(), vcpu_itc_i() and
vcpu_itc_d().
iommu case could be handled similary.
> diff -r 02c8733e2d91 xen/arch/ia64/vmx/viosapic.c
> --- a/xen/arch/ia64/vmx/viosapic.c Wed Oct 22 17:20:15 2008 +0900
> +++ b/xen/arch/ia64/vmx/viosapic.c Wed Oct 22 17:08:32 2008 +0800
> @@ -121,6 +121,13 @@
> redir_num, vector);
> return;
> }
> + if ( iommu_enabled )
> + {
> + spin_unlock(&viosapic->lock);
> + hvm_dpci_eoi(current->domain, redir_num,
> &viosapic->redirtbl[redir_num]);
> + spin_lock(&viosapic->lock);
> + }
> +
> service_iosapic(viosapic);
> spin_unlock(&viosapic->lock);
> }
viosapic->isr and irr must handled atomically.
So unlocking and locking again breaks the requirement.
(I haven't looked the viosapic code very closely, though.
So I may be wrong.)
> diff -r 02c8733e2d91 xen/arch/ia64/xen/mm.c
> --- a/xen/arch/ia64/xen/mm.c Wed Oct 22 17:20:15 2008 +0900
> +++ b/xen/arch/ia64/xen/mm.c Wed Oct 22 17:08:32 2008 +0800
> @@ -1427,6 +1427,8 @@
> if (mfn == INVALID_MFN) {
> // clear pte
> old_pte = ptep_get_and_clear(mm, mpaddr, pte);
> + if(!pte_mem(old_pte))
> + return;
> mfn = pte_pfn(old_pte);
> } else {
> unsigned long old_arflags;
> @@ -1463,6 +1465,13 @@
> perfc_incr(zap_domain_page_one);
> if(!mfn_valid(mfn))
> return;
> +
> + {
> + int i, j;
> + j = 1 << (PAGE_SHIFT-PAGE_SHIFT_4K);
> + for(i = 0 ; i < j; i++)
> + iommu_unmap_page(d, (mpaddr>>PAGE_SHIFT)*j + i);
> + }
>
> page = mfn_to_page(mfn);
> BUG_ON((page->count_info & PGC_count_mask) == 0);
> @@ -2844,10 +2853,16 @@
> __guest_physmap_add_page(struct domain *d, unsigned long gpfn,
> unsigned long mfn)
> {
> + int i, j;
> +
> set_gpfn_from_mfn(mfn, gpfn);
> smp_mb();
> assign_domain_page_replace(d, gpfn << PAGE_SHIFT, mfn,
> ASSIGN_writable | ASSIGN_pgc_allocated);
> + j = 1 << (PAGE_SHIFT-PAGE_SHIFT_4K);
> + for(i = 0 ; i < j; i++)
> + iommu_map_page(d, gpfn*j + i, mfn*j + i);
> +
> }
>
> int
The same loop logic. Introducing a helper function would help?
--
yamahata
_______________________________________________
Xen-ia64-devel mailing list
Xen-ia64-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ia64-devel
|