The vcpu won't be wakened for a long time

From: Longpeng (Mike, Cloud Infrastructure Service Product Dept.)
Date: Tue Dec 14 2021 - 08:55:43 EST


Hi guys,

We find a problem in kvm_vcpu_block().

The testcase is:
- VM configured with 1 vcpu and 1 VF (using vfio-pci passthrough)
- the vfio interrupt and the vcpu are bound to the same pcpu
- using remapped mode IRTE, NOT posted mode

The bug was triggered when the vcpu executed HLT instruction:

kvm_vcpu_block:
prepare_to_rcuwait(&vcpu->wait);
for (;;) {
set_current_state(TASK_INTERRUPTIBLE);

if (kvm_vcpu_check_block(vcpu) < 0)
break;
<------------ (*)
waited = true;
schedule();
}
finish_rcuwait(&vcpu->wait);

The vcpu will go to sleep even if an interrupt from the VF is fired at (*) and
the PIR and ON bit will be set ( in vmx_deliver_posted_interrupt ), so the vcpu
won't be wakened by subsequent interrupts.

Any suggestions ? Thanks.