Replace current->mm by kvm->mm on powerpc/kvm
Subsystems (2)
v3 cover Replace current->mm by kvm->mm on powerpc/kvm
Replace current->mm by kvm->mm on powerpc/kvm
By replacing, we would reduce the use of 'global' current on code, relying more in the contents of kvm struct.
On code, I found that in kvm_create_vm() there is:kvm->mm = current->mm;
And that on every kvm_*_ioctl we have tests like that:
if (kvm->mm != current->mm)
return -EIO;
So this change would be safe.
---
Changes since v2:
- Rebased on torvalds/master and updated the remaining patches.
Changes since v1:
- Fixes possible 'use after free' on kvm_spapr_tce_release (from v1)
- Fixes possible 'use after free' on kvm_vm_ioctl_create_spapr_tce
- Fixes undeclared variable error
Leonardo Bras (2):
powerpc/kvm/book3s: Replace current->mm by kvm->mm powerpc/kvm/book3e: Replace current->mm by kvm->mm
arch/powerpc/kvm/book3s_64_mmu_hv.c | 4 ++-- arch/powerpc/kvm/book3s_64_vio.c | 10 ++++++---- arch/powerpc/kvm/book3s_hv.c | 10 +++++----- arch/powerpc/kvm/booke.c | 2 +- 4 files changed, 14 insertions(+), 12 deletions(-)
Signature · 1 line
2.23.0
PATCH v3 1/2 powerpc/kvm/book3s: Replace current->mm by kvm->mm
Given that in kvm_create_vm() there is:kvm->mm = current->mm;
And that on every kvm_*_ioctl we have:
if (kvm->mm != current->mm)
return -EIO;
I see no reason to keep using current->mm instead of kvm->mm.
By doing so, we would reduce the use of 'global' variables on code, relying more in the contents of kvm struct.
--- arch/powerpc/kvm/book3s_64_mmu_hv.c | 4 ++-- arch/powerpc/kvm/book3s_64_vio.c | 10 ++++++---- arch/powerpc/kvm/book3s_hv.c | 10 +++++----- 3 files changed, 13 insertions(+), 11 deletions(-)
arch/powerpc/kvm/book3s_64_mmu_hv.c +2 -2
@@ -284,7 +284,7 @@ static long kvmppc_virtmode_do_h_enter(struct kvm *kvm, unsigned long flags,/* Protect linux PTE lookup from page table destruction */ rcu_read_lock_sched ();/* this disables preemption too */ ret =kvmppc_do_h_enter (kvm, flags, pte_index, pteh, ptel, - current->mm->pgd, false, pte_idx_ret); + kvm->mm->pgd, false, pte_idx_ret);rcu_read_unlock_sched ();if (ret =H_TOO_HARD ) {/* this can't happen */
@@ -573,7 +573,7 @@ int kvmppc_book3s_hv_page_fault(struct kvm_run *run, struct kvm_vcpu *vcpu, is_ci = false; pfn =0 ; page =NULL ; - mm = current->mm; + mm = kvm->mm; pte_size =PAGE_SIZE ; writing = (dsisr &DSISR_ISSTORE ) !=0 ;/* If writing != 0, then the HPTE must allow writing, if we get here */
arch/powerpc/kvm/book3s_64_vio.c +6 -4
@@ -253,10 +253,11 @@ static int kvm_spapr_tce_release(struct inode *inode, struct file *filp) } } +account_locked_vm (kvm->mm, +kvmppc_stt_pages (kvmppc_tce_pages (stt->size)), false); +kvm_put_kvm (stt->kvm); -account_locked_vm (current->mm, -kvmppc_stt_pages (kvmppc_tce_pages (stt->size)), false);call_rcu (&stt->rcu, release_spapr_tce_table);return 0 ;
@@ -272,6 +273,7 @@ long kvm_vm_ioctl_create_spapr_tce(struct kvm *kvm, {struct kvmppc_spapr_tce_table *stt =NULL ;struct kvmppc_spapr_tce_table *siter; +struct mm_struct *mm = kvm->mm;unsigned long npages, size = args->size;int ret = -ENOMEM ;
@@ -280,7 +282,7 @@ long kvm_vm_ioctl_create_spapr_tce(struct kvm *kvm,return -EINVAL ; npages =kvmppc_tce_pages (size); - ret =account_locked_vm (current->mm,kvmppc_stt_pages (npages), true); + ret =account_locked_vm (mm,kvmppc_stt_pages (npages), true);if (ret)return ret;
@@ -326,7 +328,7 @@ long kvm_vm_ioctl_create_spapr_tce(struct kvm *kvm,kfree (stt); fail_acct: -account_locked_vm (current->mm,kvmppc_stt_pages (npages), false); +account_locked_vm (mm,kvmppc_stt_pages (npages), false);return ret; }
arch/powerpc/kvm/book3s_hv.c +5 -5
@@ -4263,7 +4263,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 {
@@ -4595,14 +4595,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 (¤t->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 (¤t->mm->mmap_sem); +up_read (&kvm->mm->mmap_sem);/* We can handle 4k, 64k or 16M pages in the VRMA */ if (psize >=0x1000000 )
@@ -4635,7 +4635,7 @@ static int kvmppc_hv_setup_htab_rma(struct kvm_vcpu *vcpu)return err; up_out: -up_read (¤t->mm->mmap_sem); +up_read (&kvm->mm->mmap_sem); goto out_srcu; }
Signature · 1 line
2.23.0
PATCH v3 2/2 powerpc/kvm/book3e: Replace current->mm by kvm->mm
In reply to Leonardo BrasGiven that in kvm_create_vm() there is:kvm->mm = current->mm;
And that on every kvm_*_ioctl we have:
if (kvm->mm != current->mm)
return -EIO;
I see no reason to keep using current->mm instead of kvm->mm.
By doing so, we would reduce the use of 'global' variables on code, relying more in the contents of kvm struct.
--- arch/powerpc/kvm/booke.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/powerpc/kvm/booke.c +1 -1
@@ -775,7 +775,7 @@ int kvmppc_vcpu_run(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu) debug = current->thread.debug; current->thread.debug = vcpu->arch.dbg_reg; - vcpu->arch.pgdir = current->mm->pgd; + vcpu->arch.pgdir = vcpu->kvm->mm->pgd;kvmppc_fix_ee_before_entry (); ret =__kvmppc_vcpu_run (kvm_run, vcpu);
Signature · 1 line
2.23.0
Result of Travis-CI testing the change:
https://travis-ci.org/LeoBras/linux-ppc/builds/617712012