[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v7 15/17] vmx: VT-d posted-interrupt core logic handling
> -----Original Message----- > From: George Dunlap [mailto:george.dunlap@xxxxxxxxxx] > Sent: Monday, September 21, 2015 5:54 PM > To: Wu, Feng; George Dunlap; Dario Faggioli > Cc: Jan Beulich; Tian, Kevin; Keir Fraser; Andrew Cooper; > xen-devel@xxxxxxxxxxxxx > Subject: Re: [Xen-devel] [PATCH v7 15/17] vmx: VT-d posted-interrupt core > logic > handling > > On 09/21/2015 06:09 AM, Wu, Feng wrote: > > > > > >> -----Original Message----- > >> From: dunlapg@xxxxxxxxx [mailto:dunlapg@xxxxxxxxx] On Behalf Of > George > >> Dunlap > >> Sent: Friday, September 18, 2015 10:34 PM > >> To: Dario Faggioli > >> Cc: Jan Beulich; George Dunlap; Tian, Kevin; Keir Fraser; Andrew Cooper; > >> xen-devel@xxxxxxxxxxxxx; Wu, Feng > >> Subject: Re: [Xen-devel] [PATCH v7 15/17] vmx: VT-d posted-interrupt core > logic > >> handling > >> > >> On Fri, Sep 18, 2015 at 3:31 PM, George Dunlap > >> <George.Dunlap@xxxxxxxxxxxxx> wrote: > >>>> As said, me too. Perhaps we can go for option 1, which is simpler, > >>>> cleaner and more consistent, considering the current status of the > >>>> code. We can always investigate, in future, whether and how to > >>>> implement the optimization for all the blockings, if beneficial and fea > >>>> sible, or have them diverge, if deemed worthwhile. > >>> > >>> Sounds like a plan. > >> > >> Er, just in case that idiom wasn't clear: Option 1 sounds like a > >> *good* plan, so unless Feng disagrees, let's go with that. :-) > > > > Sorry for the late response, I was on leave last Friday. > > > > Thanks for your discussions and suggestions. I have one question about > > option > 1. > > I find that there are two places where '_VPF_blocked' can get set: > vcpu_block() > > and do_poll(). After putting the logic in vcpu_block(), do we need to care > about > > do_poll(). I don't know the purpose of do_poll() and the usage case of it. > > Dario/George, could you please share some knowledge about it? Thanks a lot! > > Yes, you'll need to make the callback everywhere _VPF_blocked is set. > > Normally you'd want to try to refactor both of those to share a commmon > codepath, but it looks like there are specific reasons why they have to > be different codepaths; so you'll just have to make the callback in both > places (after setting VPF_blocked). > > You also need to check that local_events_need_delivery() will return > "true" if you get an interrupt between that time and entering the > hypervisor. Will that happen automatically from > hvm_local_events_need_delivery() -> hvm_vcpu_has_pending_irq() -> > vlapic_has_pending_irq()? Or will you need to add a hook in > hvm_vcpu_has_pending_irq()? I think I don't need to add hook in hvm_vcpu_has_pending_irq(), what I need to do in vcpu_block() and do_poll() is as below: 1. set_bit(_VPF_blocked, &v->pause_flags); 2. ret = v->arch.arch_block(), in this hook, we can re-use the same logic in vmx_pre_ctx_switch_pi(), and check whether ON bit is set during updating posted-interrupt descriptor, can return 1 when ON is set, something like the following: do { old.control = new.control = pi_desc->control; /* Should not block the vCPU if an interrupt was posted for it. */ if ( pi_test_on(&old) ) { spin_unlock_irqrestore(&v->arch.hvm_vmx.pi_lock, flags); return 1; } /* * Change the 'NDST' field to v->arch.hvm_vmx.pi_block_cpu, * so when external interrupts from assigned deivces happen, * wakeup notifiction event will go to * v->arch.hvm_vmx.pi_block_cpu, then in pi_wakeup_interrupt() * we can find the vCPU in the right list to wake up. */ dest = cpu_physical_id(v->arch.hvm_vmx.pi_block_cpu); if ( x2apic_enabled ) new.ndst = dest; else new.ndst = MASK_INSR(dest, PI_xAPIC_NDST_MASK); pi_clear_sn(&new); new.nv = pi_wakeup_vector; } while ( cmpxchg(&pi_desc->control, old.control, new.control) != old.control ); 3. After returning from arch_block() we can simple check: if ( ret || local_events_need_delivery() ) Don't block the vCPU; Thanks, Feng > > -George _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |