On Tue, Dec 12, 2017 at 01:17:23PM +0300, Roman Kagan wrote: > On Tue, Dec 12, 2017 at 10:37:31AM +0100, David Hildenbrand wrote: > > On 12.12.2017 10:02, Roman Kagan wrote: > > > On Mon, Dec 11, 2017 at 10:14:48PM +0100, David Hildenbrand wrote: > > >>> @@ -1226,6 +1227,54 @@ static int kvm_hv_hypercall_complete_userspace(struct kvm_vcpu *vcpu) > > >>> return 1; > > >>> } > > >>> > > >>> +static u16 hvcall_sigevent_param(struct kvm_vcpu *vcpu, gpa_t gpa, u64 *param) > > >>> +{ > > >>> + struct page *page; > > >>> + void *pg; > > >>> + u64 *msg; > > >>> + > > >>> + if ((gpa & (__alignof__(*msg) - 1)) || > > >>> + offset_in_page(gpa) + sizeof(*msg) > PAGE_SIZE) > > >>> + return HV_STATUS_INVALID_ALIGNMENT; > > >>> + > > >> > > >> Don't we also need srcu_read_lock(&vcpu->kvm->srcu) for > > >> kvm_vcpu_gfn_to_page? > > > > > > Seems so indeed. I also think I'll switch to using > > > kvm_vcpu_read_guest(). > > > > Probably better (because I think you also missed releasing the page) > > Hmm, I wonder where? (kvm_vcpu_read_guest ended up being more concise > so I'll stick with it but I'd like to learn from my errors anyway.) Nevermind, I screwed up my branches. The one I posted was missing kvm_release_page_clean() indeed. Thanks, Roman.