x86: kvm: hyperv: simplify SynIC message delivery
authorRoman Kagan <rkagan@virtuozzo.com>
Mon, 10 Dec 2018 18:47:26 +0000 (18:47 +0000)
committerPaolo Bonzini <pbonzini@redhat.com>
Fri, 14 Dec 2018 16:59:51 +0000 (17:59 +0100)
commit3a0e7731724f6ac684129f1763eef4d2d3e7dec7
treec9703c6b051d56c8af3b5a3c71a1d4183e8a4432
parenteb1ff0a913ca092ae5a4e7c9277b0a634c645eee
x86: kvm: hyperv: simplify SynIC message delivery

SynIC message delivery is somewhat overengineered: it pretends to follow
the ordering rules when grabbing the message slot, using atomic
operations and all that, but does it incorrectly and unnecessarily.

The correct order would be to first set .msg_pending, then atomically
replace .message_type if it was zero, and then clear .msg_pending if
the previous step was successful.  But this all is done in vcpu context
so the whole update looks atomic to the guest (it's assumed to only
access the message page from this cpu), and therefore can be done in
whatever order is most convenient (and is also the reason why the
incorrect order didn't trigger any bugs so far).

While at this, also switch to kvm_vcpu_{read,write}_guest_page, and drop
the no longer needed synic_clear_sint_msg_pending.

Signed-off-by: Roman Kagan <rkagan@virtuozzo.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/kvm/hyperv.c