Merge tag 'microblaze-v5.6-rc1' of git://git.monstr.eu/linux-2.6-microblaze
[sfrench/cifs-2.6.git] / arch / powerpc / kvm / book3s_hv.c
index 6ff3f896d90816efa520657cb747be3a0ea0572d..2cefd071b84835000367aa2778db69784bdd163c 100644 (file)
@@ -1091,6 +1091,9 @@ int kvmppc_pseries_do_hcall(struct kvm_vcpu *vcpu)
        case H_SVM_INIT_DONE:
                ret = kvmppc_h_svm_init_done(vcpu->kvm);
                break;
+       case H_SVM_INIT_ABORT:
+               ret = kvmppc_h_svm_init_abort(vcpu->kvm);
+               break;
 
        default:
                return RESUME_HOST;
@@ -2271,22 +2274,16 @@ static void debugfs_vcpu_init(struct kvm_vcpu *vcpu, unsigned int id)
 }
 #endif /* CONFIG_KVM_BOOK3S_HV_EXIT_TIMING */
 
-static struct kvm_vcpu *kvmppc_core_vcpu_create_hv(struct kvm *kvm,
-                                                  unsigned int id)
+static int kvmppc_core_vcpu_create_hv(struct kvm_vcpu *vcpu)
 {
-       struct kvm_vcpu *vcpu;
        int err;
        int core;
        struct kvmppc_vcore *vcore;
+       struct kvm *kvm;
+       unsigned int id;
 
-       err = -ENOMEM;
-       vcpu = kmem_cache_zalloc(kvm_vcpu_cache, GFP_KERNEL);
-       if (!vcpu)
-               goto out;
-
-       err = kvm_vcpu_init(vcpu, kvm, id);
-       if (err)
-               goto free_vcpu;
+       kvm = vcpu->kvm;
+       id = vcpu->vcpu_id;
 
        vcpu->arch.shared = &vcpu->arch.shregs;
 #ifdef CONFIG_KVM_BOOK3S_PR_POSSIBLE
@@ -2368,7 +2365,7 @@ static struct kvm_vcpu *kvmppc_core_vcpu_create_hv(struct kvm *kvm,
        mutex_unlock(&kvm->lock);
 
        if (!vcore)
-               goto free_vcpu;
+               return err;
 
        spin_lock(&vcore->lock);
        ++vcore->num_threads;
@@ -2383,12 +2380,7 @@ static struct kvm_vcpu *kvmppc_core_vcpu_create_hv(struct kvm *kvm,
 
        debugfs_vcpu_init(vcpu, id);
 
-       return vcpu;
-
-free_vcpu:
-       kmem_cache_free(kvm_vcpu_cache, vcpu);
-out:
-       return ERR_PTR(err);
+       return 0;
 }
 
 static int kvmhv_set_smt_mode(struct kvm *kvm, unsigned long smt_mode,
@@ -2442,8 +2434,6 @@ static void kvmppc_core_vcpu_free_hv(struct kvm_vcpu *vcpu)
        unpin_vpa(vcpu->kvm, &vcpu->arch.slb_shadow);
        unpin_vpa(vcpu->kvm, &vcpu->arch.vpa);
        spin_unlock(&vcpu->arch.vpa_update_lock);
-       kvm_vcpu_uninit(vcpu);
-       kmem_cache_free(kvm_vcpu_cache, vcpu);
 }
 
 static int kvmppc_core_check_requests_hv(struct kvm_vcpu *vcpu)
@@ -4285,7 +4275,7 @@ static int kvmppc_vcpu_run_hv(struct kvm_run *run, struct kvm_vcpu *vcpu)
        user_vrsave = mfspr(SPRN_VRSAVE);
 
        vcpu->arch.wqp = &vcpu->arch.vcore->wq;
-       vcpu->arch.pgdir = current->mm->pgd;
+       vcpu->arch.pgdir = kvm->mm->pgd;
        vcpu->arch.state = KVMPPC_VCPU_BUSY_IN_HOST;
 
        do {
@@ -4640,14 +4630,14 @@ static int kvmppc_hv_setup_htab_rma(struct kvm_vcpu *vcpu)
 
        /* Look up the VMA for the start of this memory slot */
        hva = memslot->userspace_addr;
-       down_read(&current->mm->mmap_sem);
-       vma = find_vma(current->mm, hva);
+       down_read(&kvm->mm->mmap_sem);
+       vma = find_vma(kvm->mm, hva);
        if (!vma || vma->vm_start > hva || (vma->vm_flags & VM_IO))
                goto up_out;
 
        psize = vma_kernel_pagesize(vma);
 
-       up_read(&current->mm->mmap_sem);
+       up_read(&kvm->mm->mmap_sem);
 
        /* We can handle 4k, 64k or 16M pages in the VRMA */
        if (psize >= 0x1000000)
@@ -4680,7 +4670,7 @@ static int kvmppc_hv_setup_htab_rma(struct kvm_vcpu *vcpu)
        return err;
 
  up_out:
-       up_read(&current->mm->mmap_sem);
+       up_read(&kvm->mm->mmap_sem);
        goto out_srcu;
 }
 
@@ -5477,7 +5467,7 @@ static int kvmhv_svm_off(struct kvm *kvm)
                        continue;
 
                kvm_for_each_memslot(memslot, slots) {
-                       kvmppc_uvmem_drop_pages(memslot, kvm);
+                       kvmppc_uvmem_drop_pages(memslot, kvm, true);
                        uv_unregister_mem_slot(kvm->arch.lpid, memslot->id);
                }
        }