On 14.11.2011, at 18:22, Scott Wood <[email protected]> wrote:
> On 11/14/2011 07:13 AM, Alexander Graf wrote:
>> On 11/09/2011 01:23 AM, Scott Wood wrote:
>>> +/* Check pending exceptions and deliver one, if possible. */
>>> +void kvmppc_core_prepare_to_enter(struct kvm_vcpu *vcpu)
>>> +{
>>> + WARN_ON_ONCE(!irqs_disabled());
>>> +
>>> + kvmppc_core_check_exceptions(vcpu);
>>> +
>>> + if (vcpu->arch.shared->msr& MSR_WE) {
>>> + local_irq_enable();
>>> + kvm_vcpu_block(vcpu);
>>> + local_irq_disable();
>>
>> Hrm. This specific irq enable/disable part isn't pretty but I can't
>> think of a cleaner way either. Unless you move it out of the prepare
>> function, since I don't see a way it could race with an interrupt.
>
> kvmppc_core_check_exceptions can clear MSR_WE, so we need to check after
> that. We can't enable interrupts after kvmppc_core_check_exceptions (or
> rather, if we do, we need to check again once interrupts are
> re-disabled, as in the MSR_WE case) because otherwise we could have an
> exception delivered afterward and receive the resched IPI at just the
> wrong time to take any action on it (just like the signal check).
Well, but if you enable interrupts here you're basically rendering code that
runs earlier in disabled-interrupt mode racy.
How does this align with the signal handling? We could receive a signal here
and not handle it the same as the race you fixed earlier, no?
Alex
>
>>> +
>>> + kvmppc_set_exit_type(vcpu, EMULATED_MTMSRWE_EXITS);
>>> + kvmppc_core_check_exceptions(vcpu);
>>
>> Shouldn't
>>
>> if (msr & MSR_WE) {
>> ...
>> }
>>
>> core_check_exceptions(vcpu);
>>
>>
>> work just as well?
>
> That would have us pointlessly checking the exceptions twice in the
> non-WE case -- unless you mean only check after, which as described
> above means you'll fail to wake up.
>
> -Scott
>
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html