On 09/07/2011 10:09 PM, Jeremy Fitzhardinge wrote:
On 09/07/2011 10:41 AM, Avi Kivity wrote: >> Hm, I'm interested to know what you're thinking in more detail. Can you >> leave an NMI pending before you block in the same way you can with >> "sti;halt" with normal interrupts? > > > Nope. But you can do > > if (regs->rip in critical section) > regs->rip = after_halt; > > and effectively emulate it. The critical section is something like > > critical_section_start: > if (woken_up) > goto critical_section_end; > hlt > critical_section_end: Hm. It's a pity you have to deliver an actual interrupt to implement the kick though.
I don't think it's that expensive, especially compared to the double-context-switch and vmexit of the spinner going to sleep. On AMD we do have to take an extra vmexit (on IRET) though.
>> >> I was thinking you might want to do something with monitor/mwait to >> implement the blocking/kick ops. (Handwave) >> > > monitor/mwait are incredibly expensive to virtualize since they > require write-protecting a page, IPIs flying everywhere and flushing > tlbs, not to mention my lovely hugepages being broken up mercilessly. Or what about a futex-like hypercall?
Well we could have a specialized sleep/wakeup hypercall pair like Xen, but I'd like to avoid it if at all possible.
-- I have a truly marvellous patch that fixes the bug which this signature is too narrow to contain. -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html