On 02/07/15 13:04, Dario Faggioli wrote: > On Thu, 2015-07-02 at 11:30 +0100, Andrew Cooper wrote: >> On 02/07/15 09:30, Dario Faggioli wrote: >>> It is, therefore, not effective in making sure that, even with only one >>> notification, you only kick the interested vcpu. >>> >>> This is the third time that I ask: >>> (1) whether it is possible to have more vcpus queued on one pcpu PI >>> blocked list with desc.on (I really believe it is); >>> (2) if yes, whether it is TheRightThing(TM) to kick all of them, as >>> soon as any notification arrives, instead that putting together a >>> mechanism for kicking only a specific one. >> We will receive one NV for every time the hardware managed to >> successfully set desc.on >> > Right, I see it now, thanks. > >> If multiple stack up and we proactively drain the list, we will >> subsequently search the list to completion for all remaining NV's, due >> to finding no appropriate entries. >> >> I can't currently decide whether this will be quicker or slower overall, >> or (most likely) it will even out to equal in the general case. >> > Well, given the thing works as you (two) just described, I think > draining the list is the only thing we can do. > > In fact, AFAICT, since we can't know for what vcpu a particular > notification is intended, we don't have alternatives to waking them all, > do we?
Perhaps you misunderstand. Every single vcpu has a PI descriptor which is shared memory with hardware. A NV is delivered strictly when hardware atomically changes desc.on from 0 to 1. i.e. the first time that an oustanding notification arrives. (iirc, desc.on is later cleared by hardware when the vcpu is scheduled and the vector(s) actually injected.) Part of the scheduling modifications alter when a vcpu is eligible to have NV's delivered on its behalf. non-scheduled vcpus get NV's while scheduled vcpus have direct injection instead. Therefore, in the case that an NV arrives, we know for certain that one of the NV-eligible vcpus has had desc.on set by hardware, and we can uniquely identify it by searching for the vcpu for which desc.on is set. In the case of stacked NV's, we cannot associate which specific vcpu caused which NV, but we know that we will get one NV per vcpu needing kicking. ~Andrew _______________________________________________ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel