Re: [patch 2/2] KVM: fix kvm_vcpu_kick vs __vcpu_run race

Avi Kivity
2008-04-13T16:35:44Z

Avi Kivity wrote:
> Avi Kivity wrote:
>>
>>> @@ -3944,11 +3950,13 @@ static void vcpu_kick_intr(void *info)
>>> void kvm_vcpu_kick(struct kvm_vcpu *vcpu)
>>> {
>>> int ipi_pcpu = vcpu->cpu;
>>> + int cpu = get_cpu();
>>>
>>> if (waitqueue_active(&vcpu->wq)) {
>>> wake_up_interruptible(&vcpu->wq);
>>> ++vcpu->stat.halt_wakeup;
>>> }
>>> - if (vcpu->guest_mode)
>>> + if (vcpu->guest_mode && vcpu->cpu != cpu)
>>> smp_call_function_single(ipi_pcpu, vcpu_kick_intr, vcpu, 0,
>>> 0);
>>> + put_cpu();
>>> }
>>>
>>
>> Looks like a no-op now, as vcpu_kick_intr() does nothing and
>> smp_call_function_single() won't force an exit if vcpu->cpu == cpu,
>> so I dropped this hunk.
>>
>
> Oh, I see the reason now: the irq stuff now happens with irqs disabled
> which annoys smp_call_function_single(). Well, I'd like to avoid all
> this irq-disabled processing, so I'm looking at an alternate fix using
> a new KVM_REQ_EVAL_IRQ.
>

!@%$#@%, we can't move guest irq processing out of the critical section
since we can't commit to irq delivery (we may have to deliver an
exception instead).

I'll apply your patch as is, and will look at disentangling this later.

--
error compiling committee.c: too many arguments to function