vmx-io-events.patch
PATCH RESEND 1/1 vmx-io-events.patch
- Handle the case where the VMX domains get events from ports other than IOPACKET_PORT (because of paravirtualized drivers)
- Use clear_bit() to operate on evtchn_upcall_pending
Signed-off-by Xiaofeng Ling <[email protected]>
Signed-off-by Kevin Tian <[email protected]>
Signed-off-by Arun Sharma <[email protected]>
xen/arch/x86/vmx_io.c +8 -2
@@ -282,7 +282,7 @@/* Note: VMX domains may need upcalls as well */ if (!ed->vcpu_info->evtchn_pending_sel) - ed->vcpu_info->evtchn_upcall_pending =0 ; +clear_bit (0 , &ed->vcpu_info->evtchn_upcall_pending);/* clear the pending bit for IOPACKET_PORT */ return test_and_clear_bit(IOPACKET_PORT,
@@ -310,10 +310,16 @@extern void do_block ();do { -do_block (); +if (!test_bit (IOPACKET_PORT , + ¤t->domain->shared_info->evtchn_pending[0 ])) +do_block ();vmx_check_events (current);if (!test_bit (ARCH_VMX_IO_WAIT , ¤t->arch.arch_vmx.flags))break ; +/* Events other than IOPACKET_PORT might have woken us up. In that +case, safely go back to sleep. */ +clear_bit (IOPACKET_PORT >>5 , ¤t->vcpu_info->evtchn_pending_sel); +clear_bit (0 , ¤t->vcpu_info->evtchn_upcall_pending); }while (1 ); }
This patch doesn't apply cleanly.
-- Keir
Quoted 43 lines · Arun Sharma
- Handle the case where the VMX domains get events from ports other than
IOPACKET_PORT(because of paravirtualized drivers)- Use
clear_bit()to operate onevtchn_upcall_pendingSigned-off-by Xiaofeng Ling <[email protected]>Signed-off-by Kevin Tian <[email protected]>Signed-off-by Arun Sharma <[email protected]>xen/arch/x86/vmx_io.c +5
-2@@ -282,7 +282,7 @@/* Note: VMX domains may need upcalls as well */ if (!ed->vcpu_info->evtchn_pending_sel) - ed->vcpu_info->evtchn_upcall_pending =0 ; +clear_bit (0 , &ed->vcpu_info->evtchn_upcall_pending);/* clear the pending bit for IOPACKET_PORT */ return test_and_clear_bit(IOPACKET_PORT,@@ -310,10 +310,16 @@extern void do_block (); do { - do_block(); + if(!test_bit(IOPACKET_PORT, + ¤t->domain->shared_info->evtchn_pending[0])) + do_block(); vmx_check_events(current); if (!test_bit(ARCH_VMX_IO_WAIT, ¤t->arch.arch_vmx.flags)) break; + /* Events other than IOPACKET_PORT might have woken us up. Inthat
xen/arch/x86/vmx_io.c +2
-0+case, safely go back to sleep. */ + clear_bit(IOPACKET_PORT>>5,
¤t->vcpu_info->evtchn_pending_sel);+ clear_bit(0, ¤t->vcpu_info->evtchn_upcall_pending); } while(1);}