Greg:
        Hopefully, you are still online :-)
        I think you are talking about different thing, it is not just a simple
queue, SDM chapter 25.7.1.1 has the answer for 
how to handle IRQ injection failure. Per current V09, kvm_irqdevice_ack
will be invoked twice in case the previous injection fails and push/pop again 
for 
localirq. While for extirq, it is discarded if previous injection failed.
        In both case, the APIC or PIC is ackknowledged at former irq injection 
time, re-injection after failure (IDT_vectoring) is required for both extirq & 
localirq.

        
Eddie
        

Gregory Haskins wrote:
> Hi Eddie,
>  I think you are missing a key point here:  irq.deferred is
> emulating the atomic nature of an INTA (*) cycle.  Once an
> interrupt is acknowledged, it is atomically dispatched to the
> IDT (at least, this is my assumption..you intel guys can set
> me straight if this is not true).  There is no way to put a
> vector that was once obtained in the INTA "back".  However, on
> a vCPU there is the possibility for certain events to
> interrupt an injection operation.  For example: if an external
> interrupt causes a VMEXIT before the VMENTER/injection
> completes.  There is no equivalent of this on a pCPU.
> Therefore, we emulate an "in core" queuing mechanism
> (irq.deferred) to hold vectors that have been acked, but not
> yet injected.  We can only hold one.
> 
> Now here is the important part: When an interrupt is queued
> here, it is the highest priority interrupt in the system.  We
> dont care about re-evaluating ISR, TPR, PPR, or anything else
> for this matter.  Its sole purpose to to complete the atomic
> INTA->IDT, and therefore we want to inject this deferred
> vector next regardless of the current state of PPR, etc.
> 
> So no, during injection failure we would never go back to
> QEMU/8259, APIC/ISR etc.  The vector (regardless of whether it
> came from the APIC or the PIC) is queued in the irq.deferred
> "in core" holding pattern until the next window.  This is why
> I say that both APIC and EXTINT is covered here.
> 
> As I mentioned, there is a hole in my implementation related
> to allowing NMI/EXTINT interrupts to prioritize themselves
> higher than a queued deferred interrupt.  I will fix this.
> However, this is not the same issue that you are talking
> about.  Does this make sense?
> 
> Regards,
> -Greg
> 
> PS: I am on vacation this week, so I likely wont be able to
> answer more questions until next Monday.
> 
> (*) Note that I model both i8259s and LAPICs as having an INTA
> cycle, even though we software guys only explicitly see the
> INTA cycle on the 8259. But im sure there is something that
> closely resembles an INTA to the LAPIC buried inside the
> silicon so I think this analogy works.
> 
>>>> "Dong, Eddie" <[EMAIL PROTECTED]> 06/04/07 8:21 PM >>>
> 
> 
>> -----Original Message-----
>> From: Gregory Haskins [mailto:[EMAIL PROTECTED]
>> Sent: 2007年6月5日 1:23
>> To: Dong, Eddie; kvm-devel@lists.sourceforge.net
>> Subject: RE: [kvm-devel] [PATCH 3/9] KVM: Add irqdevice object
>> 
>>>>> "Dong, Eddie" <[EMAIL PROTECTED]> 06/04/07 3:13 AM >>>
>>> Greg:
>>>     Can you explain a bit why we need to distinguish
>>> kvm_irqpin_extint from kvm_irqpin_localint?
>> 
>> They are both "vectored interrupts", but localint means "I
>> have the vector" and extint means "someone else has the
>> vector".  They are closely analogous to the LAPICs notion of
>> FIXED and EXTINT interrupts respectfully.  The difference is I
>> named them more generally so that it would apply equally to
>> PICs of other types besides APICs (for abstraction purposes).
>> 
>>> I saw latest V09 has hole here such as handle_exception due to
>>> IRQ inject fail. I.e. IDT_VECTORING_INFO_FIELD only push localint
>>> back, but no extint.
>> 
>> Actually, I don't think this is really a hole.  Both
>> interrupts are of the same injection-class and both can be
>> equally deferred.  As explained earlier, the only difference
>> between them is the source of the vectoring data.  If an
>> injection operation fails (regardless of original pin type),
>> we push the vector into our irq.deferred queue and use it next time.
> 
> Then you will push the extint back to Qemu ? BTW, PIC is not in
> yet, and I see the patch didn't do push for extirq.
> 
>> 
>> One problem that I *can* see is related to inadvertent
>> reprioritization based on how irq.deferred gets grossly
>> classified as a localint.  The deferred vector should be the
>> highest priority interrupt in the system, since it technically
>> was already dispatched.  However, today (in v9 and earlier)
>> new extint or NMIs would be incorrectly prioritized over
>> irq.deferred.  I doubt this would happen very often (if ever)
>> and I doubt it would cause to many p>However, the fix should
> be pretty easy: there should probably
>> be something like an irqpin_deferred as the highest priority
>> pin in the system instead of overloading deferred on localint.
> 
> This is what I say. Push back an irq cause not only priority issue,
> but actually this irq is already blocked since ISR and TPR are all
> updated now. A higher irq definitely will happen too like you
> observed too. 
> 
> WHat I am proposing is to split IDT_VECTORING from APIC
> logic,do it in irq
> injecting logic.
> 
> 
>> 
>> 
>>> In Xen, when we implementing APIC patch, we simplify it by
>>> limiting a single IRQ can either be passed by PIC or APIC, we never
>>> handle the combination of both PIC and APIC servicing them in same
>>> time. I.e. If APIC is taking the IRQ, PIC must already mask the
>>> pin. That works fine so far.  I am just wondering if we should
>>> start from simple model and improve later if we find problem.  Same
>>> for NMI/SMI handling. 
>> 
>> With all due respect, I don't know if I would agree that that
>> approach is either simpler or superior.  Both Xen and QEMU
>> play games with the model w.r.t. APIC vs PIC interactions, and
>> to date, I don't think either one has got it quite right.  I
>> think they both got it "close enough" to work to some degree
>> (partially by luck), but its also (IMHO) a hacky way to do it.
>> What I tried to do was stay truer to the logical model of the
>> ISA architecture as presented by Bochs/QEMU.  So, yes, its
>> true that typically a guest would never enable both interrupts
>> in the PIC and the APIC.  However, if they *did*, my model
>> would work identically to the way real hardware would work.
>> The others would mis-emulate this.
> 
> If a guest OS *did* enable both PIC & APIC for a irq, both in
> the simplified
> approach (Xen) and V09 has same effect: exitirq get the
> priority and get
> injected. (BTW SDM doesn't explicitly say which one has priority).
> 
> Eddie

-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
kvm-devel mailing list
kvm-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/kvm-devel

Reply via email to