Lines Matching refs:kvm
44 static void kvm_s390_clear_pv_state(struct kvm *kvm) in kvm_s390_clear_pv_state() argument
46 kvm->arch.pv.handle = 0; in kvm_s390_clear_pv_state()
47 kvm->arch.pv.guest_len = 0; in kvm_s390_clear_pv_state()
48 kvm->arch.pv.stor_base = 0; in kvm_s390_clear_pv_state()
49 kvm->arch.pv.stor_var = NULL; in kvm_s390_clear_pv_state()
61 KVM_UV_EVENT(vcpu->kvm, 3, "PROTVIRT DESTROY VCPU %d: rc %x rrc %x", in kvm_s390_pv_destroy_cpu()
104 uvcb.guest_handle = kvm_s390_pv_get_handle(vcpu->kvm); in kvm_s390_pv_create_cpu()
121 KVM_UV_EVENT(vcpu->kvm, 3, in kvm_s390_pv_create_cpu()
136 vcpu->arch.sie_block->pv_handle_config = kvm_s390_pv_get_handle(vcpu->kvm); in kvm_s390_pv_create_cpu()
143 static void kvm_s390_pv_dealloc_vm(struct kvm *kvm) in kvm_s390_pv_dealloc_vm() argument
145 vfree(kvm->arch.pv.stor_var); in kvm_s390_pv_dealloc_vm()
146 free_pages(kvm->arch.pv.stor_base, in kvm_s390_pv_dealloc_vm()
148 kvm_s390_clear_pv_state(kvm); in kvm_s390_pv_dealloc_vm()
151 static int kvm_s390_pv_alloc_vm(struct kvm *kvm) in kvm_s390_pv_alloc_vm() argument
157 kvm->arch.pv.stor_var = NULL; in kvm_s390_pv_alloc_vm()
158 kvm->arch.pv.stor_base = __get_free_pages(GFP_KERNEL_ACCOUNT, get_order(base)); in kvm_s390_pv_alloc_vm()
159 if (!kvm->arch.pv.stor_base) in kvm_s390_pv_alloc_vm()
168 mutex_lock(&kvm->slots_lock); in kvm_s390_pv_alloc_vm()
169 npages = kvm_s390_get_gfn_end(kvm_memslots(kvm)); in kvm_s390_pv_alloc_vm()
170 mutex_unlock(&kvm->slots_lock); in kvm_s390_pv_alloc_vm()
172 kvm->arch.pv.guest_len = npages * PAGE_SIZE; in kvm_s390_pv_alloc_vm()
177 kvm->arch.pv.stor_var = vzalloc(vlen); in kvm_s390_pv_alloc_vm()
178 if (!kvm->arch.pv.stor_var) in kvm_s390_pv_alloc_vm()
183 kvm_s390_pv_dealloc_vm(kvm); in kvm_s390_pv_alloc_vm()
200 static int kvm_s390_pv_dispose_one_leftover(struct kvm *kvm, in kvm_s390_pv_dispose_one_leftover() argument
210 KVM_UV_EVENT(kvm, 3, "PROTVIRT DESTROY LEFTOVER VM: rc %x rrc %x", *rc, *rrc); in kvm_s390_pv_dispose_one_leftover()
224 atomic_dec(&kvm->mm->context.protected_count); in kvm_s390_pv_dispose_one_leftover()
235 static void kvm_s390_destroy_lower_2g(struct kvm *kvm) in kvm_s390_destroy_lower_2g() argument
242 srcu_idx = srcu_read_lock(&kvm->srcu); in kvm_s390_destroy_lower_2g()
245 slot = gfn_to_memslot(kvm, 0); in kvm_s390_destroy_lower_2g()
249 s390_uv_destroy_range(kvm->mm, slot->userspace_addr, slot->userspace_addr + len); in kvm_s390_destroy_lower_2g()
251 slot = gfn_to_memslot(kvm, slot->base_gfn + slot->npages); in kvm_s390_destroy_lower_2g()
254 srcu_read_unlock(&kvm->srcu, srcu_idx); in kvm_s390_destroy_lower_2g()
257 static int kvm_s390_pv_deinit_vm_fast(struct kvm *kvm, u16 *rc, u16 *rrc) in kvm_s390_pv_deinit_vm_fast() argument
262 .handle = kvm_s390_pv_get_handle(kvm), in kvm_s390_pv_deinit_vm_fast()
271 WRITE_ONCE(kvm->arch.gmap->guest_handle, 0); in kvm_s390_pv_deinit_vm_fast()
272 KVM_UV_EVENT(kvm, 3, "PROTVIRT DESTROY VM FAST: rc %x rrc %x", in kvm_s390_pv_deinit_vm_fast()
275 kvm_s390_pv_get_handle(kvm), uvcb.header.rc, uvcb.header.rrc); in kvm_s390_pv_deinit_vm_fast()
278 kvm_s390_pv_dealloc_vm(kvm); in kvm_s390_pv_deinit_vm_fast()
305 int kvm_s390_pv_set_aside(struct kvm *kvm, u16 *rc, u16 *rrc) in kvm_s390_pv_set_aside() argument
310 lockdep_assert_held(&kvm->lock); in kvm_s390_pv_set_aside()
315 if (kvm->arch.pv.set_aside) in kvm_s390_pv_set_aside()
322 res = kvm_s390_pv_deinit_vm_fast(kvm, rc, rrc); in kvm_s390_pv_set_aside()
324 priv->stor_var = kvm->arch.pv.stor_var; in kvm_s390_pv_set_aside()
325 priv->stor_base = kvm->arch.pv.stor_base; in kvm_s390_pv_set_aside()
326 priv->handle = kvm_s390_pv_get_handle(kvm); in kvm_s390_pv_set_aside()
327 priv->old_gmap_table = (unsigned long)kvm->arch.gmap->table; in kvm_s390_pv_set_aside()
328 WRITE_ONCE(kvm->arch.gmap->guest_handle, 0); in kvm_s390_pv_set_aside()
329 if (s390_replace_asce(kvm->arch.gmap)) in kvm_s390_pv_set_aside()
338 kvm_s390_destroy_lower_2g(kvm); in kvm_s390_pv_set_aside()
339 kvm_s390_clear_pv_state(kvm); in kvm_s390_pv_set_aside()
340 kvm->arch.pv.set_aside = priv; in kvm_s390_pv_set_aside()
366 int kvm_s390_pv_deinit_vm(struct kvm *kvm, u16 *rc, u16 *rrc) in kvm_s390_pv_deinit_vm() argument
370 cc = uv_cmd_nodata(kvm_s390_pv_get_handle(kvm), in kvm_s390_pv_deinit_vm()
372 WRITE_ONCE(kvm->arch.gmap->guest_handle, 0); in kvm_s390_pv_deinit_vm()
374 atomic_dec(&kvm->mm->context.protected_count); in kvm_s390_pv_deinit_vm()
375 kvm_s390_pv_dealloc_vm(kvm); in kvm_s390_pv_deinit_vm()
378 s390_replace_asce(kvm->arch.gmap); in kvm_s390_pv_deinit_vm()
380 KVM_UV_EVENT(kvm, 3, "PROTVIRT DESTROY VM: rc %x rrc %x", *rc, *rrc); in kvm_s390_pv_deinit_vm()
402 int kvm_s390_pv_deinit_cleanup_all(struct kvm *kvm, u16 *rc, u16 *rrc) in kvm_s390_pv_deinit_cleanup_all() argument
410 atomic_inc(&kvm->mm->context.protected_count); in kvm_s390_pv_deinit_cleanup_all()
414 if (kvm_s390_pv_get_handle(kvm)) { in kvm_s390_pv_deinit_cleanup_all()
415 cc = kvm_s390_pv_deinit_vm(kvm, rc, rrc); in kvm_s390_pv_deinit_cleanup_all()
420 if (kvm->arch.pv.set_aside) { in kvm_s390_pv_deinit_cleanup_all()
421 list_add(kvm->arch.pv.set_aside, &kvm->arch.pv.need_cleanup); in kvm_s390_pv_deinit_cleanup_all()
422 kvm->arch.pv.set_aside = NULL; in kvm_s390_pv_deinit_cleanup_all()
426 while (!list_empty(&kvm->arch.pv.need_cleanup)) { in kvm_s390_pv_deinit_cleanup_all()
427 cur = list_first_entry(&kvm->arch.pv.need_cleanup, typeof(*cur), list); in kvm_s390_pv_deinit_cleanup_all()
429 if (kvm_s390_pv_dispose_one_leftover(kvm, cur, &_rc, &_rrc)) { in kvm_s390_pv_deinit_cleanup_all()
450 if (need_zap && mmget_not_zero(kvm->mm)) { in kvm_s390_pv_deinit_cleanup_all()
451 s390_uv_destroy_range(kvm->mm, 0, TASK_SIZE); in kvm_s390_pv_deinit_cleanup_all()
452 mmput(kvm->mm); in kvm_s390_pv_deinit_cleanup_all()
456 atomic_dec(&kvm->mm->context.protected_count); in kvm_s390_pv_deinit_cleanup_all()
475 int kvm_s390_pv_deinit_aside_vm(struct kvm *kvm, u16 *rc, u16 *rrc) in kvm_s390_pv_deinit_aside_vm() argument
480 lockdep_assert_not_held(&kvm->lock); in kvm_s390_pv_deinit_aside_vm()
481 mutex_lock(&kvm->lock); in kvm_s390_pv_deinit_aside_vm()
482 p = kvm->arch.pv.set_aside; in kvm_s390_pv_deinit_aside_vm()
483 kvm->arch.pv.set_aside = NULL; in kvm_s390_pv_deinit_aside_vm()
484 mutex_unlock(&kvm->lock); in kvm_s390_pv_deinit_aside_vm()
489 if (s390_uv_destroy_range_interruptible(kvm->mm, 0, TASK_SIZE_MAX)) in kvm_s390_pv_deinit_aside_vm()
491 if (kvm_s390_pv_dispose_one_leftover(kvm, p, rc, rrc)) in kvm_s390_pv_deinit_aside_vm()
501 mutex_lock(&kvm->lock); in kvm_s390_pv_deinit_aside_vm()
502 list_add(&p->list, &kvm->arch.pv.need_cleanup); in kvm_s390_pv_deinit_aside_vm()
503 mutex_unlock(&kvm->lock); in kvm_s390_pv_deinit_aside_vm()
514 struct kvm *kvm = container_of(subscription, struct kvm, arch.pv.mmu_notifier); in kvm_s390_pv_mmu_notifier_release() local
525 r = kvm_s390_cpus_from_pv(kvm, &dummy, &dummy); in kvm_s390_pv_mmu_notifier_release()
526 if (!r && is_destroy_fast_available() && kvm_s390_pv_get_handle(kvm)) in kvm_s390_pv_mmu_notifier_release()
527 kvm_s390_pv_deinit_vm_fast(kvm, &dummy, &dummy); in kvm_s390_pv_mmu_notifier_release()
534 int kvm_s390_pv_init_vm(struct kvm *kvm, u16 *rc, u16 *rrc) in kvm_s390_pv_init_vm() argument
543 ret = kvm_s390_pv_alloc_vm(kvm); in kvm_s390_pv_init_vm()
549 uvcb.guest_stor_len = kvm->arch.pv.guest_len; in kvm_s390_pv_init_vm()
550 uvcb.guest_asce = kvm->arch.gmap->asce; in kvm_s390_pv_init_vm()
551 uvcb.guest_sca = virt_to_phys(kvm->arch.sca); in kvm_s390_pv_init_vm()
553 virt_to_phys((void *)kvm->arch.pv.stor_base); in kvm_s390_pv_init_vm()
554 uvcb.conf_virt_stor_origin = (u64)kvm->arch.pv.stor_var; in kvm_s390_pv_init_vm()
559 KVM_UV_EVENT(kvm, 3, "PROTVIRT CREATE VM: handle %llx len %llx rc %x rrc %x", in kvm_s390_pv_init_vm()
563 kvm->arch.pv.handle = uvcb.guest_handle; in kvm_s390_pv_init_vm()
565 atomic_inc(&kvm->mm->context.protected_count); in kvm_s390_pv_init_vm()
568 kvm_s390_pv_deinit_vm(kvm, &dummy, &dummy); in kvm_s390_pv_init_vm()
570 atomic_dec(&kvm->mm->context.protected_count); in kvm_s390_pv_init_vm()
571 kvm_s390_pv_dealloc_vm(kvm); in kvm_s390_pv_init_vm()
575 kvm->arch.gmap->guest_handle = uvcb.guest_handle; in kvm_s390_pv_init_vm()
577 if (kvm->arch.pv.mmu_notifier.ops != &kvm_s390_pv_mmu_notifier_ops) { in kvm_s390_pv_init_vm()
578 kvm->arch.pv.mmu_notifier.ops = &kvm_s390_pv_mmu_notifier_ops; in kvm_s390_pv_init_vm()
579 mmu_notifier_register(&kvm->arch.pv.mmu_notifier, kvm->mm); in kvm_s390_pv_init_vm()
584 int kvm_s390_pv_set_sec_parms(struct kvm *kvm, void *hdr, u64 length, u16 *rc, in kvm_s390_pv_set_sec_parms() argument
592 .guest_handle = kvm_s390_pv_get_handle(kvm), in kvm_s390_pv_set_sec_parms()
598 KVM_UV_EVENT(kvm, 3, "PROTVIRT VM SET PARMS: rc %x rrc %x", in kvm_s390_pv_set_sec_parms()
603 static int unpack_one(struct kvm *kvm, unsigned long addr, u64 tweak, in unpack_one() argument
609 .guest_handle = kvm_s390_pv_get_handle(kvm), in unpack_one()
614 int ret = gmap_make_secure(kvm->arch.gmap, addr, &uvcb); in unpack_one()
620 KVM_UV_EVENT(kvm, 3, "PROTVIRT VM UNPACK: failed addr %llx with rc %x rrc %x", in unpack_one()
625 int kvm_s390_pv_unpack(struct kvm *kvm, unsigned long addr, unsigned long size, in kvm_s390_pv_unpack() argument
634 KVM_UV_EVENT(kvm, 3, "PROTVIRT VM UNPACK: start addr %lx size %lx", in kvm_s390_pv_unpack()
638 ret = unpack_one(kvm, addr, tweak, offset, rc, rrc); in kvm_s390_pv_unpack()
651 KVM_UV_EVENT(kvm, 3, "%s", "PROTVIRT VM UNPACK: successful"); in kvm_s390_pv_unpack()
666 KVM_UV_EVENT(vcpu->kvm, 3, "PROTVIRT SET CPU %d STATE %d rc %x rrc %x", in kvm_s390_pv_set_cpu_state()
720 int kvm_s390_pv_dump_stor_state(struct kvm *kvm, void __user *buff_user, in kvm_s390_pv_dump_stor_state() argument
726 .config_handle = kvm->arch.pv.handle, in kvm_s390_pv_dump_stor_state()
799 KVM_UV_EVENT(kvm, 3, in kvm_s390_pv_dump_stor_state()
828 int kvm_s390_pv_dump_complete(struct kvm *kvm, void __user *buff_user, in kvm_s390_pv_dump_complete() argument
834 .config_handle = kvm_s390_pv_get_handle(kvm), in kvm_s390_pv_dump_complete()
848 KVM_UV_EVENT(kvm, 3, "PROTVIRT DUMP COMPLETE: rc %x rrc %x", in kvm_s390_pv_dump_complete()
857 kvm->arch.pv.dumping = false; in kvm_s390_pv_dump_complete()
858 kvm_s390_vcpu_unblock_all(kvm); in kvm_s390_pv_dump_complete()