Isaku Yamahata wrote:
> 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?
>
>
>> maddr = ((maddr & _PAGE_PPN_MASK) & PAGE_MASK) | (paddr &
>> ~PAGE_MASK);
>> diff -r e1ed3e5cd001 xen/arch/ia64/xen/domain.c
>> --- a/xen/arch/ia64/xen/domain.c Tue Oct 21 18:55:22 2008 +0800
>> +++ b/xen/arch/ia64/xen/domain.c Tue Oct 21 19:13:45 2008 +0800
>> @@ -569,6 +569,7 @@ if (is_idle_domain(d))
>> return 0;
>>
>> + INIT_LIST_HEAD(&d->arch.pdev_list);
>> foreign_p2m_init(d);
>> #ifdef CONFIG_XEN_IA64_PERVCPU_VHPT
>> d->arch.has_pervcpu_vhpt = opt_pervcpu_vhpt;
>
> This hunk shoundn't be included in this patch.
Agree
>
>
>> @@ -601,6 +602,9 @@
>> if ((d->arch.mm.pgd = pgd_alloc(&d->arch.mm)) == NULL)
>> goto fail_nomem;
>>
>> + if(iommu_domain_init(d) != 0)
>> + goto fail_iommu;
>> +
>> /*
>> * grant_table_create() can't fully initialize grant table for
>> domain
>> * because it is called before arch_domain_create(). @@ -617,6
>> +621,8 @@ dprintk(XENLOG_DEBUG, "arch_domain_create:
>> domain=%p\n", d); return 0;
>>
>> +fail_iommu:
>> + iommu_domain_destroy(d);
>> fail_nomem:
>> tlb_track_destroy(d);
>> fail_nomem1:
>> @@ -635,6 +641,10 @@
>> if (d->shared_info != NULL)
>> free_xenheap_pages(d->shared_info,
>> get_order_from_shift(XSI_SHIFT)); +
>> + pci_release_devices(d);
>> + if( !is_idle_domain(d))
>> + iommu_domain_destroy(d);
>>
>> tlb_track_destroy(d);
>>
>> diff -r e1ed3e5cd001 xen/arch/ia64/xen/irq.c
>> --- a/xen/arch/ia64/xen/irq.c Tue Oct 21 18:55:22 2008 +0800
>> +++ b/xen/arch/ia64/xen/irq.c Tue Oct 21 19:13:45 2008 +0800 @@
>> -312,12 +312,25 @@ struct domain *guest[IRQ_MAX_GUESTS];
>> } irq_guest_action_t;
>>
>> +static struct timer irq_guest_eoi_timer[NR_IRQS];
>> +static void irq_guest_eoi_timer_fn(void *data)
>> +{
>> + irq_desc_t *desc = data;
>> + unsigned vector = desc - irq_desc;
>> + unsigned long flags;
>> +
>> + spin_lock_irqsave(&desc->lock, flags);
>> + desc->status &= ~IRQ_INPROGRESS;
>> + desc->handler->enable(vector);
>> + spin_unlock_irqrestore(&desc->lock, flags);
>> +}
>> +
>> void __do_IRQ_guest(int irq)
>> {
>> irq_desc_t *desc = &irq_desc[irq];
>> irq_guest_action_t *action = (irq_guest_action_t
>> *)desc->action; struct domain *d; - int
>> i; + int i, already_pending = 0;
>>
>> for ( i = 0; i < action->nr_guests; i++ )
>> {
>> @@ -325,8 +338,29 @@
>> if ( (action->ack_type != ACKTYPE_NONE) &&
>> !test_and_set_bit(irq, &d->pirq_mask) )
>> action->in_flight++;
>> - send_guest_pirq(d, irq);
>> - }
>> + if ( hvm_do_IRQ_dpci(d, irq) )
>> + {
>> + if ( action->ack_type == ACKTYPE_NONE ) +
>> { + already_pending += !!(desc->status &
>> IRQ_INPROGRESS); + desc->status |=
>> IRQ_INPROGRESS; /* cleared during hvm eoi */ + }
>> + } + else if ( send_guest_pirq(d, irq) &&
>> + (action->ack_type == ACKTYPE_NONE) ) +
>> { + already_pending++;
>> + }
>> + }
>> +
>> + if ( already_pending == action->nr_guests )
>> + {
>> + desc->handler->disable(irq);
>> + stop_timer(&irq_guest_eoi_timer[irq]);
>> + init_timer(&irq_guest_eoi_timer[irq],
>> + irq_guest_eoi_timer_fn, desc,
>> smp_processor_id()); +
>> set_timer(&irq_guest_eoi_timer[irq], NOW() + MILLISECS(1)); + }
>> }
>>
>> int pirq_acktype(int irq)
>
> Is those hunk for interrupt storm avoidance as 17963:1db0b09b290e?
> If so, please split it out and send it as another patch.
It is different,
17963 is used to prevent interrupt storm of host MSI, xen/ia64 don't support
MSI so far.
This code segment is used to handle interrupt sharing between multiple domain.
>
>
>> diff -r e1ed3e5cd001 xen/arch/ia64/xen/mm.c
>> --- a/xen/arch/ia64/xen/mm.c Tue Oct 21 18:55:22 2008 +0800
>> +++ b/xen/arch/ia64/xen/mm.c Tue Oct 21 19:13:45 2008 +0800 @@
>> -189,6 +189,10 @@
>>
>> static void __xencomm_mark_dirty(struct domain *d,
>> unsigned long addr, unsigned int
>> len); + +static void
>> +zap_domain_page_one(struct domain *d, unsigned long mpaddr,
>> + int clear_PGC_allocate, unsigned long mfn);
>>
>> extern unsigned long ia64_iobase;
>>
>> @@ -908,20 +912,21 @@
>> unsigned long flags)
>> {
>> volatile pte_t *pte;
>> - pte_t old_pte;
>> pte_t new_pte;
>> pte_t ret_pte;
>> unsigned long prot = flags_to_prot(flags);
>>
>> pte = lookup_alloc_domain_pte(d, mpaddr);
>> + new_pte = pfn_pte(physaddr >> PAGE_SHIFT, __pgprot(prot));
>> + if(pte_val(new_pte) == pte_val(*pte))
>> + return 0;
>>
>> - old_pte = __pte(0);
>> - new_pte = pfn_pte(physaddr >> PAGE_SHIFT, __pgprot(prot));
>> - ret_pte = ptep_cmpxchg_rel(&d->arch.mm, mpaddr, pte, old_pte,
>> new_pte);
>> - if (pte_val(ret_pte) == pte_val(old_pte)) {
>> - smp_mb();
>> - return 0;
>> - }
>> + /* for assigned MMIO, the old pte may be set to _PAGE_IO
>> attribute, + * so zap it first, then set up it.
>> + */
>> +
>> + zap_domain_page_one(d, mpaddr, 1, INVALID_MFN);
>> + ret_pte = ptep_xchg(&d->arch.mm, mpaddr, pte, new_pte);
>>
>> // dom0 tries to map real machine's I/O region, but failed.
>> // It is very likely that dom0 doesn't boot correctly because
>
> Hmmm, are you really sure that the above is SMP-safe?
> We are touching p2m table locklessly so we must be extremely
> careful. The above hunk split the atomic operation into two phase
> and makes the following logic not make sense.
>
>
Yes, it is not SMP-safe there is lock for p2m.
Modifying p2m is not a frequent operation, why not add a lock for it?
>> 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;
>> @@ -1461,6 +1468,7 @@
>> if(!mfn_valid(mfn))
>> return;
>>
>> + iommu_unmap_page(d, mpaddr>>PAGE_SHIFT);
>Isn't PAGE_SHIFT_4K loop necessary?
Good catch!
Thanks
Anthony
_______________________________________________
Xen-ia64-devel mailing list
Xen-ia64-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ia64-devel
|