[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2] x86/apicv: enhance posted-interrupt processing
On February 28, 2017 11:08 PM, Jan Beulich wrote: >>>> On 27.02.17 at 11:53, <xuquan8@xxxxxxxxxx> wrote: >> If guest is already in non-root mode, an posted interrupt will be >> directly delivered to guest (leaving softirq being set without >> actually incurring a VM-Exit - breaking desired softirq behavior). > >This is irritating - are you describing a problem you mean to fix with this >patch, >without making clear what the fix is? Or are you describing state after this >patch (which the code below suggests), in which case I have to say no, we >certainly don't want this. > Sorry. I knew you would not like any assumption in patch description.. But I think this one really help community understand what the problem is( this is also valuable). Also, as you know, I am a clumsy in patch description and always open to your suggestion. :) please don't be irritated.. if you have a better description, I am always open to it. >> Then further posted interrupts will skip the IPI, stay in PIR and not >> noted until another VM-Exit happens. >> >> When target vCPU is in non-root mode and running on remote CPU, posted >> way is triggered to inject interrupt without VM-Exit. >> Otherwise, set VCPU_KICK_SOFTIRQ bit to inject interrupt until another >> VM-Entry as a best effort. > >Furthermore you talking about non-root mode here doesn't fit with the code >change, as you can't find out whether the guest is in non-root mode. > Reply in below.. >> --- a/xen/arch/x86/hvm/vmx/vmx.c >> +++ b/xen/arch/x86/hvm/vmx/vmx.c >> @@ -1839,17 +1839,14 @@ static void vmx_process_isr(int isr, struct >> vcpu *v) >> >> static void __vmx_deliver_posted_interrupt(struct vcpu *v) { >> - bool_t running = v->is_running; >> + unsigned int cpu = v->processor; >> >> vcpu_unblock(v); >> - if ( running && (in_irq() || (v != current)) ) >> - { >> - unsigned int cpu = v->processor; >> - >> - if ( !test_and_set_bit(VCPU_KICK_SOFTIRQ, >&softirq_pending(cpu)) >> - && (cpu != smp_processor_id()) ) >> - send_IPI_mask(cpumask_of(cpu), posted_intr_vector); >> - } >> + if ( v->is_running && (in_irq() || (v != current)) && >> + (cpu != smp_processor_id()) ) >> + send_IPI_mask(cpumask_of(cpu), posted_intr_vector); >> + else >> + set_bit(VCPU_KICK_SOFTIRQ, &softirq_pending(cpu)); > >Why don't you simply call raise_softirq() here? > raise_softirq() is a better wrapper, but I didn't get it until you told me. >Plus, if we already want to fix this and _eliminate_ (rather than >shrink) any time windows, is namely looking at v->is_running really useful >here? By the time you do the next part of the conditional (or call into >send_IPI_mask()) that may already have changed. So far, I can't find a better one to check whether the vcpu is in non-root or not. Any suggestion? I am afraid we could not eliminate any time windows, but try our best. >Similarly, while this isn't >something you change, I don't really understand the relevance of using in_irq() >here. Hence at the very least a code comment should be added imo, clarifying >what all this magic is about. > Gone through the code, in_irq() means that the cpu is dispatching an interrupt.. I am really hesitated whether to drop ' (in_irq() || (v != current)) ' or not in v2, but I found there is a same one in vcpu_kick().. So I leave it as is for further discussion. Now I tend to drop it. -Quan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |