Loading arch/s390/kvm/interrupt.c +11 −4 Original line number Diff line number Diff line Loading @@ -2778,12 +2778,19 @@ static unsigned long get_ind_bit(__u64 addr, unsigned long bit_nr, bool swap) static struct page *get_map_page(struct kvm *kvm, u64 uaddr) { struct mm_struct *mm = kvm->mm; struct page *page = NULL; int locked = 1; if (mmget_not_zero(mm)) { mmap_read_lock(mm); get_user_pages_remote(mm, uaddr, 1, FOLL_WRITE, &page, &locked); if (locked) mmap_read_unlock(mm); mmput(mm); } mmap_read_lock(kvm->mm); get_user_pages_remote(kvm->mm, uaddr, 1, FOLL_WRITE, &page, NULL); mmap_read_unlock(kvm->mm); return page; } Loading arch/s390/kvm/kvm-s390.c +12 −12 Original line number Diff line number Diff line Loading @@ -4864,12 +4864,12 @@ static void kvm_s390_assert_primary_as(struct kvm_vcpu *vcpu) * @vcpu: the vCPU whose gmap is to be fixed up * @gfn: the guest frame number used for memslots (including fake memslots) * @gaddr: the gmap address, does not have to match @gfn for ucontrol gmaps * @flags: FOLL_* flags * @foll: FOLL_* flags * * Return: 0 on success, < 0 in case of error. * Context: The mm lock must not be held before calling. May sleep. */ int __kvm_s390_handle_dat_fault(struct kvm_vcpu *vcpu, gfn_t gfn, gpa_t gaddr, unsigned int flags) int __kvm_s390_handle_dat_fault(struct kvm_vcpu *vcpu, gfn_t gfn, gpa_t gaddr, unsigned int foll) { struct kvm_memory_slot *slot; unsigned int fault_flags; Loading @@ -4883,13 +4883,13 @@ int __kvm_s390_handle_dat_fault(struct kvm_vcpu *vcpu, gfn_t gfn, gpa_t gaddr, u if (!slot || slot->flags & KVM_MEMSLOT_INVALID) return vcpu_post_run_addressing_exception(vcpu); fault_flags = flags & FOLL_WRITE ? FAULT_FLAG_WRITE : 0; fault_flags = foll & FOLL_WRITE ? FAULT_FLAG_WRITE : 0; if (vcpu->arch.gmap->pfault_enabled) flags |= FOLL_NOWAIT; foll |= FOLL_NOWAIT; vmaddr = __gfn_to_hva_memslot(slot, gfn); try_again: pfn = __kvm_faultin_pfn(slot, gfn, flags, &writable, &page); pfn = __kvm_faultin_pfn(slot, gfn, foll, &writable, &page); /* Access outside memory, inject addressing exception */ if (is_noslot_pfn(pfn)) Loading @@ -4905,7 +4905,7 @@ int __kvm_s390_handle_dat_fault(struct kvm_vcpu *vcpu, gfn_t gfn, gpa_t gaddr, u return 0; vcpu->stat.pfault_sync++; /* Could not setup async pfault, try again synchronously */ flags &= ~FOLL_NOWAIT; foll &= ~FOLL_NOWAIT; goto try_again; } /* Any other error */ Loading @@ -4925,7 +4925,7 @@ int __kvm_s390_handle_dat_fault(struct kvm_vcpu *vcpu, gfn_t gfn, gpa_t gaddr, u return rc; } static int vcpu_dat_fault_handler(struct kvm_vcpu *vcpu, unsigned long gaddr, unsigned int flags) static int vcpu_dat_fault_handler(struct kvm_vcpu *vcpu, unsigned long gaddr, unsigned int foll) { unsigned long gaddr_tmp; gfn_t gfn; Loading @@ -4950,18 +4950,18 @@ static int vcpu_dat_fault_handler(struct kvm_vcpu *vcpu, unsigned long gaddr, un } gfn = gpa_to_gfn(gaddr_tmp); } return __kvm_s390_handle_dat_fault(vcpu, gfn, gaddr, flags); return __kvm_s390_handle_dat_fault(vcpu, gfn, gaddr, foll); } static int vcpu_post_run_handle_fault(struct kvm_vcpu *vcpu) { unsigned int flags = 0; unsigned int foll = 0; unsigned long gaddr; int rc; gaddr = current->thread.gmap_teid.addr * PAGE_SIZE; if (kvm_s390_cur_gmap_fault_is_write()) flags = FAULT_FLAG_WRITE; foll = FOLL_WRITE; switch (current->thread.gmap_int_code & PGM_INT_CODE_MASK) { case 0: Loading Loading @@ -5003,7 +5003,7 @@ static int vcpu_post_run_handle_fault(struct kvm_vcpu *vcpu) send_sig(SIGSEGV, current, 0); if (rc != -ENXIO) break; flags = FAULT_FLAG_WRITE; foll = FOLL_WRITE; fallthrough; case PGM_PROTECTION: case PGM_SEGMENT_TRANSLATION: Loading @@ -5013,7 +5013,7 @@ static int vcpu_post_run_handle_fault(struct kvm_vcpu *vcpu) case PGM_REGION_SECOND_TRANS: case PGM_REGION_THIRD_TRANS: kvm_s390_assert_primary_as(vcpu); return vcpu_dat_fault_handler(vcpu, gaddr, flags); return vcpu_dat_fault_handler(vcpu, gaddr, foll); default: KVM_BUG(1, vcpu->kvm, "Unexpected program interrupt 0x%x, TEID 0x%016lx", current->thread.gmap_int_code, current->thread.gmap_teid.val); Loading arch/s390/kvm/pv.c +11 −5 Original line number Diff line number Diff line Loading @@ -624,6 +624,17 @@ int kvm_s390_pv_init_vm(struct kvm *kvm, u16 *rc, u16 *rrc) int cc, ret; u16 dummy; /* Add the notifier only once. No races because we hold kvm->lock */ if (kvm->arch.pv.mmu_notifier.ops != &kvm_s390_pv_mmu_notifier_ops) { /* The notifier will be unregistered when the VM is destroyed */ kvm->arch.pv.mmu_notifier.ops = &kvm_s390_pv_mmu_notifier_ops; ret = mmu_notifier_register(&kvm->arch.pv.mmu_notifier, kvm->mm); if (ret) { kvm->arch.pv.mmu_notifier.ops = NULL; return ret; } } ret = kvm_s390_pv_alloc_vm(kvm); if (ret) return ret; Loading Loading @@ -659,11 +670,6 @@ int kvm_s390_pv_init_vm(struct kvm *kvm, u16 *rc, u16 *rrc) return -EIO; } kvm->arch.gmap->guest_handle = uvcb.guest_handle; /* Add the notifier only once. No races because we hold kvm->lock */ if (kvm->arch.pv.mmu_notifier.ops != &kvm_s390_pv_mmu_notifier_ops) { kvm->arch.pv.mmu_notifier.ops = &kvm_s390_pv_mmu_notifier_ops; mmu_notifier_register(&kvm->arch.pv.mmu_notifier, kvm->mm); } return 0; } Loading Loading
arch/s390/kvm/interrupt.c +11 −4 Original line number Diff line number Diff line Loading @@ -2778,12 +2778,19 @@ static unsigned long get_ind_bit(__u64 addr, unsigned long bit_nr, bool swap) static struct page *get_map_page(struct kvm *kvm, u64 uaddr) { struct mm_struct *mm = kvm->mm; struct page *page = NULL; int locked = 1; if (mmget_not_zero(mm)) { mmap_read_lock(mm); get_user_pages_remote(mm, uaddr, 1, FOLL_WRITE, &page, &locked); if (locked) mmap_read_unlock(mm); mmput(mm); } mmap_read_lock(kvm->mm); get_user_pages_remote(kvm->mm, uaddr, 1, FOLL_WRITE, &page, NULL); mmap_read_unlock(kvm->mm); return page; } Loading
arch/s390/kvm/kvm-s390.c +12 −12 Original line number Diff line number Diff line Loading @@ -4864,12 +4864,12 @@ static void kvm_s390_assert_primary_as(struct kvm_vcpu *vcpu) * @vcpu: the vCPU whose gmap is to be fixed up * @gfn: the guest frame number used for memslots (including fake memslots) * @gaddr: the gmap address, does not have to match @gfn for ucontrol gmaps * @flags: FOLL_* flags * @foll: FOLL_* flags * * Return: 0 on success, < 0 in case of error. * Context: The mm lock must not be held before calling. May sleep. */ int __kvm_s390_handle_dat_fault(struct kvm_vcpu *vcpu, gfn_t gfn, gpa_t gaddr, unsigned int flags) int __kvm_s390_handle_dat_fault(struct kvm_vcpu *vcpu, gfn_t gfn, gpa_t gaddr, unsigned int foll) { struct kvm_memory_slot *slot; unsigned int fault_flags; Loading @@ -4883,13 +4883,13 @@ int __kvm_s390_handle_dat_fault(struct kvm_vcpu *vcpu, gfn_t gfn, gpa_t gaddr, u if (!slot || slot->flags & KVM_MEMSLOT_INVALID) return vcpu_post_run_addressing_exception(vcpu); fault_flags = flags & FOLL_WRITE ? FAULT_FLAG_WRITE : 0; fault_flags = foll & FOLL_WRITE ? FAULT_FLAG_WRITE : 0; if (vcpu->arch.gmap->pfault_enabled) flags |= FOLL_NOWAIT; foll |= FOLL_NOWAIT; vmaddr = __gfn_to_hva_memslot(slot, gfn); try_again: pfn = __kvm_faultin_pfn(slot, gfn, flags, &writable, &page); pfn = __kvm_faultin_pfn(slot, gfn, foll, &writable, &page); /* Access outside memory, inject addressing exception */ if (is_noslot_pfn(pfn)) Loading @@ -4905,7 +4905,7 @@ int __kvm_s390_handle_dat_fault(struct kvm_vcpu *vcpu, gfn_t gfn, gpa_t gaddr, u return 0; vcpu->stat.pfault_sync++; /* Could not setup async pfault, try again synchronously */ flags &= ~FOLL_NOWAIT; foll &= ~FOLL_NOWAIT; goto try_again; } /* Any other error */ Loading @@ -4925,7 +4925,7 @@ int __kvm_s390_handle_dat_fault(struct kvm_vcpu *vcpu, gfn_t gfn, gpa_t gaddr, u return rc; } static int vcpu_dat_fault_handler(struct kvm_vcpu *vcpu, unsigned long gaddr, unsigned int flags) static int vcpu_dat_fault_handler(struct kvm_vcpu *vcpu, unsigned long gaddr, unsigned int foll) { unsigned long gaddr_tmp; gfn_t gfn; Loading @@ -4950,18 +4950,18 @@ static int vcpu_dat_fault_handler(struct kvm_vcpu *vcpu, unsigned long gaddr, un } gfn = gpa_to_gfn(gaddr_tmp); } return __kvm_s390_handle_dat_fault(vcpu, gfn, gaddr, flags); return __kvm_s390_handle_dat_fault(vcpu, gfn, gaddr, foll); } static int vcpu_post_run_handle_fault(struct kvm_vcpu *vcpu) { unsigned int flags = 0; unsigned int foll = 0; unsigned long gaddr; int rc; gaddr = current->thread.gmap_teid.addr * PAGE_SIZE; if (kvm_s390_cur_gmap_fault_is_write()) flags = FAULT_FLAG_WRITE; foll = FOLL_WRITE; switch (current->thread.gmap_int_code & PGM_INT_CODE_MASK) { case 0: Loading Loading @@ -5003,7 +5003,7 @@ static int vcpu_post_run_handle_fault(struct kvm_vcpu *vcpu) send_sig(SIGSEGV, current, 0); if (rc != -ENXIO) break; flags = FAULT_FLAG_WRITE; foll = FOLL_WRITE; fallthrough; case PGM_PROTECTION: case PGM_SEGMENT_TRANSLATION: Loading @@ -5013,7 +5013,7 @@ static int vcpu_post_run_handle_fault(struct kvm_vcpu *vcpu) case PGM_REGION_SECOND_TRANS: case PGM_REGION_THIRD_TRANS: kvm_s390_assert_primary_as(vcpu); return vcpu_dat_fault_handler(vcpu, gaddr, flags); return vcpu_dat_fault_handler(vcpu, gaddr, foll); default: KVM_BUG(1, vcpu->kvm, "Unexpected program interrupt 0x%x, TEID 0x%016lx", current->thread.gmap_int_code, current->thread.gmap_teid.val); Loading
arch/s390/kvm/pv.c +11 −5 Original line number Diff line number Diff line Loading @@ -624,6 +624,17 @@ int kvm_s390_pv_init_vm(struct kvm *kvm, u16 *rc, u16 *rrc) int cc, ret; u16 dummy; /* Add the notifier only once. No races because we hold kvm->lock */ if (kvm->arch.pv.mmu_notifier.ops != &kvm_s390_pv_mmu_notifier_ops) { /* The notifier will be unregistered when the VM is destroyed */ kvm->arch.pv.mmu_notifier.ops = &kvm_s390_pv_mmu_notifier_ops; ret = mmu_notifier_register(&kvm->arch.pv.mmu_notifier, kvm->mm); if (ret) { kvm->arch.pv.mmu_notifier.ops = NULL; return ret; } } ret = kvm_s390_pv_alloc_vm(kvm); if (ret) return ret; Loading Loading @@ -659,11 +670,6 @@ int kvm_s390_pv_init_vm(struct kvm *kvm, u16 *rc, u16 *rrc) return -EIO; } kvm->arch.gmap->guest_handle = uvcb.guest_handle; /* Add the notifier only once. No races because we hold kvm->lock */ if (kvm->arch.pv.mmu_notifier.ops != &kvm_s390_pv_mmu_notifier_ops) { kvm->arch.pv.mmu_notifier.ops = &kvm_s390_pv_mmu_notifier_ops; mmu_notifier_register(&kvm->arch.pv.mmu_notifier, kvm->mm); } return 0; } Loading