Isaku Yamahata wrote:
>> In x86 side, only it is identity mapping, guest can access the port
>> directly.
>> If it is not identity mapping, guest can not access the port
>>  directly, at this situation, xen will intercept io port access
>> first, and xen access the corresponding physical port.
>>
>> In ia64 side, guest can acess all assigned port whenever it is
>> identity mapping or not. So we need to change the interface.
>
> Understood. x86 have io instructions.
> Okay, please split out ioports_permit_access(), then I'll take it.

Thanks,
I'll send out soon.

>> There is no page_info for mmio page, I didn't see reference count
>> issue.
>>
>> If VTD is enabled, in the life of guest, p2m can not be changed,
>> Because it VTD operation hit a page table miss, the DMA operation
>> can not be resumed.
>
> Hmm, it is possible for qemu-dm (or any tools stack in dom0) can
> issue racy hypercall, isn't it.
> Anyway __assgin_domain_page() isn't assumed to use for deassigning
> page. (Sorry, I have to admit those functions are somewhat
> confusing...) How about the following patch?  I did only compile
> test, though.
> With the following modification zap_domain_page_one() could be used
> by deassign_domain_mmio_page().
> Probably you may want to twist mfn_valid() with is_iomem_page() or
> something.
>
> thanks,



> +    perfc_incr(zap_domain_page_one);
> +    if (!mfn_valid(mfn))
> +        return;
> +

I think it is better to use is_iomem_page instead of mfn_valid(mfn).

mfn_valid can not check MMIO < max_page


Thanks,
Anthony


>
> diff -r 7db30bf36b0e xen/arch/ia64/xen/mm.c
> --- a/xen/arch/ia64/xen/mm.c    Fri Oct 17 15:33:03 2008 +0900
> +++ b/xen/arch/ia64/xen/mm.c    Fri Oct 17 16:58:34 2008 +0900
> @@ -1422,8 +1422,9 @@
>      again:
>          // memory_exchange() calls guest_physmap_remove_page() with
>          // a stealed page. i.e. page owner = NULL.
> -        BUG_ON(page_get_owner(mfn_to_page(mfn)) != d &&
> -               page_get_owner(mfn_to_page(mfn)) != NULL);
> +        BUG_ON(mfn_valid(mfn) &&
> +               (page_get_owner(mfn_to_page(mfn)) != d &&
> +                page_get_owner(mfn_to_page(mfn)) != NULL));
>          old_arflags = pte_val(*pte) & ~_PAGE_PPN_MASK;
>          old_pte = pfn_pte(mfn, __pgprot(old_arflags));
>          new_pte = __pte(0);
> @@ -1445,12 +1446,15 @@
>          BUG_ON(mfn != pte_pfn(ret_pte));
>      }
>
> +    perfc_incr(zap_domain_page_one);
> +    if (!mfn_valid(mfn))
> +        return;
> +
>      page = mfn_to_page(mfn);
>      BUG_ON((page->count_info & PGC_count_mask) == 0);
>
>      BUG_ON(clear_PGC_allocate && (page_get_owner(page) == NULL));
>      domain_put_page(d, mpaddr, pte, old_pte, clear_PGC_allocate);
> -    perfc_incr(zap_domain_page_one);
>  }
>
>  unsigned long

_______________________________________________
Xen-ia64-devel mailing list
Xen-ia64-devel@lists.xensource.com
http://lists.xensource.com/xen-ia64-devel

Reply via email to