|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] IO-APIC interrupts getting stuck
El 16/12/14 a les 18.59, Andrew Cooper ha escrit:
> On 16/12/14 17:34, Roger Pau Monnà wrote:
>> Hello,
>>
>> While working on the FreeBSD PVH Dom0 port I've realized that IO-APIC
>> interrupts get stuck in a very strange state very easily with the
>> current PIRQ implementation that I'm using on FreeBSD.
>>
>> Since I'm not sure what is going on, I would like to ask for some
>> feedback and possible solutions, because at this point I'm running out
>> of ideas of what's happening.
>>
>> In this case I'm going to use IRQ 17 as an example, which is shared
>> between an Intel(R) PRO/1000 nic, a Broadcom NetXtreme Gigabit nic and
>> an Intel 82801JI (ICH10) USB controller.
>>
>> Usually during the boot process, or very shortly after it, Dom0 looses
>> interrupts from IRQ 17, dumping IRQ information from Xen ('i' key),
>> gives the following output:
>>
>> (XEN) IRQ: 17 affinity:00000001 vec:a8 type=IO-APIC-level
>> status=00000010 in-flight=0 domain-list=0: 17(---),
>> ...
>> (XEN) IRQ 17 Vec168:
>> (XEN) Apic 0x00, Pin 17: vec=a8 delivery=LoPri dest=L status=1
>> polarity=1 irr=1 trig=L mask=0 dest_id:1
>>
>> I've also added some event channel debug functions to the FreeBSD
>> in-kernel debugger in order to print the status of event channels:
>>
>> Port 15 Type: PIRQ
>> Pirq: 17 ActiveHi: 0 EdgeTrigger: 0 NeedsEOI: 1
>> Masked: 0 Pending: 0
>> Per-CPU Masks: cpu#0: 0 cpu#1: 0 cpu#2: 1 cpu#3: 0 cpu#4: 0 cpu#5: 0
>> cpu#6: 0 cpu#7: 0
>>
>> And the corresponding line from the Xen 'e' debug key:
>>
>> (XEN) 15 [0/0/1]: s=4 n=2 x=0 p=17 i=17
>>
>> This makes me thing that the FreeBSD kernel is failing to EOI the
>> vector (because of the irr=1 in the Xen IRQ debug info), so I've also
>> added a function to the debugger that allows me to EOI a vector from
>> it. But even after issuing a PHYSDEVOP_eoi hypercall on the affected
>> PIRQ (17), the status is exactly the same, because pirq->masked == 0,
>> so desc_guest_eoi fails to EOI the vector (see xen/arch/x86/irq.c:1433).
>>
>> So now I'm wondering, how can I "unstuck" this IRQ, and how did it get
>> into this strange state?
>>
>> Roger.
>
> Do you have a xen dmesg with full debugging? According to the first
> line from 'i', Xen believes that the irq in question is not in need of
> an EOI, which is clearly contrary to the IOAPICs view of the world.
>
> Some random suggestions: does altering interrupt remapping make a
> difference? does altering the ioapic_ack_mode make a difference?
I've also added the following patch to Xen, and it reliably triggers on
FreeBSD, while it seems to work fine on Linux:
diff --git a/xen/arch/x86/io_apic.c b/xen/arch/x86/io_apic.c
index 6f8f62c..70977dc 100644
--- a/xen/arch/x86/io_apic.c
+++ b/xen/arch/x86/io_apic.c
@@ -1729,6 +1729,8 @@ static void end_level_ioapic_irq_new(struct irq_desc
*desc, u8 vector)
* The idea is from Manfred Spraul. --macro
*/
unsigned int v, i = desc->arch.vector;
+ struct IO_APIC_route_entry rte;
+ struct irq_pin_list *entry = irq_2_pin + desc->irq;
/* Manually EOI the old vector if we are moving to the new */
if ( vector && i != vector )
@@ -1751,6 +1753,9 @@ static void end_level_ioapic_irq_new(struct irq_desc
*desc, u8 vector)
__unmask_IO_APIC_irq(desc->irq);
spin_unlock(&ioapic_lock);
}
+
+ rte = ioapic_read_entry(entry->apic, entry->pin, 0);
+ ASSERT(rte.irr == 0 || rte.mask != 0);
}
/*
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |