Commit 29ae7d96 authored by David Hildenbrand's avatar David Hildenbrand Committed by Andrew Morton
Browse files

mm: pass VMA instead of MM to follow_pte()

... and centralize the VM_IO/VM_PFNMAP sanity check in there. We'll
now also perform these sanity checks for direct follow_pte()
invocations.

For generic_access_phys(), we might now check multiple times: nothing to
worry about, really.

Link: https://lkml.kernel.org/r/20240410155527.474777-3-david@redhat.com


Signed-off-by: default avatarDavid Hildenbrand <david@redhat.com>
Acked-by: Sean Christopherson <seanjc@google.com>	[KVM]
Cc: Alex Williamson <alex.williamson@redhat.com>
Cc: Christoph Hellwig <hch@lst.de>
Cc: Fei Li <fei1.li@intel.com>
Cc: Gerald Schaefer <gerald.schaefer@linux.ibm.com>
Cc: Heiko Carstens <hca@linux.ibm.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: Yonghua Huang <yonghua.huang@intel.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
parent 3d658600
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -169,7 +169,7 @@ SYSCALL_DEFINE3(s390_pci_mmio_write, unsigned long, mmio_addr,
	if (!(vma->vm_flags & VM_WRITE))
		goto out_unlock_mmap;

	ret = follow_pte(vma->vm_mm, mmio_addr, &ptep, &ptl);
	ret = follow_pte(vma, mmio_addr, &ptep, &ptl);
	if (ret)
		goto out_unlock_mmap;

@@ -308,7 +308,7 @@ SYSCALL_DEFINE3(s390_pci_mmio_read, unsigned long, mmio_addr,
	if (!(vma->vm_flags & VM_WRITE))
		goto out_unlock_mmap;

	ret = follow_pte(vma->vm_mm, mmio_addr, &ptep, &ptl);
	ret = follow_pte(vma, mmio_addr, &ptep, &ptl);
	if (ret)
		goto out_unlock_mmap;

+1 −4
Original line number Diff line number Diff line
@@ -954,10 +954,7 @@ static int follow_phys(struct vm_area_struct *vma, unsigned long *prot,
	pte_t *ptep, pte;
	spinlock_t *ptl;

	if (!(vma->vm_flags & (VM_IO | VM_PFNMAP)))
		return -EINVAL;

	if (follow_pte(vma->vm_mm, vma->vm_start, &ptep, &ptl))
	if (follow_pte(vma, vma->vm_start, &ptep, &ptl))
		return -EINVAL;

	pte = ptep_get(ptep);
+2 −2
Original line number Diff line number Diff line
@@ -518,7 +518,7 @@ static int follow_fault_pfn(struct vm_area_struct *vma, struct mm_struct *mm,
	spinlock_t *ptl;
	int ret;

	ret = follow_pte(vma->vm_mm, vaddr, &ptep, &ptl);
	ret = follow_pte(vma, vaddr, &ptep, &ptl);
	if (ret) {
		bool unlocked = false;

@@ -532,7 +532,7 @@ static int follow_fault_pfn(struct vm_area_struct *vma, struct mm_struct *mm,
		if (ret)
			return ret;

		ret = follow_pte(vma->vm_mm, vaddr, &ptep, &ptl);
		ret = follow_pte(vma, vaddr, &ptep, &ptl);
		if (ret)
			return ret;
	}
+1 −2
Original line number Diff line number Diff line
@@ -187,8 +187,7 @@ int acrn_vm_ram_map(struct acrn_vm *vm, struct acrn_vm_memmap *memmap)
		}

		for (i = 0; i < nr_pages; i++) {
			ret = follow_pte(vma->vm_mm,
					 memmap->vma_base + i * PAGE_SIZE,
			ret = follow_pte(vma, memmap->vma_base + i * PAGE_SIZE,
					 &ptep, &ptl);
			if (ret)
				break;
+1 −1
Original line number Diff line number Diff line
@@ -2420,7 +2420,7 @@ void free_pgd_range(struct mmu_gather *tlb, unsigned long addr,
		unsigned long end, unsigned long floor, unsigned long ceiling);
int
copy_page_range(struct vm_area_struct *dst_vma, struct vm_area_struct *src_vma);
int follow_pte(struct mm_struct *mm, unsigned long address,
int follow_pte(struct vm_area_struct *vma, unsigned long address,
	       pte_t **ptepp, spinlock_t **ptlp);
int generic_access_phys(struct vm_area_struct *vma, unsigned long addr,
			void *buf, int len, int write);
Loading