Commit ae528eb1 authored by Alexei Starovoitov's avatar Alexei Starovoitov Committed by Peng Zhang
Browse files

mm: Introduce vmap_page_range() to map pages in PCI address space

mainline inclusion
from mainline-v6.9-rc1
commit d7bca9199a27b8690ae1c71dc11f825154af7234
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/I9CHG1
CVE: NA

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=d7bca9199a27b8690ae1c71dc11f825154af7234



-------------------------------------------------

ioremap_page_range() should be used for ranges within vmalloc range only.
The vmalloc ranges are allocated by get_vm_area(). PCI has "resource"
allocator that manages PCI_IOBASE, IO_SPACE_LIMIT address range, hence
introduce vmap_page_range() to be used exclusively to map pages
in PCI address space.

Fixes: 3e49a866c9dc ("mm: Enforce VM_IOREMAP flag and range in ioremap_page_range.")
Reported-by: default avatarMiguel Ojeda <ojeda@kernel.org>
Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Tested-by: default avatarMiguel Ojeda <ojeda@kernel.org>
Link: https://lore.kernel.org/bpf/CANiq72ka4rir+RTN2FQoT=Vvprp_Ao-CvoYEkSNqtSY+RZj+AA@mail.gmail.com


(cherry picked from commit d7bca9199a27b8690ae1c71dc11f825154af7234)
Signed-off-by: default avatarKefeng Wang <wangkefeng.wang@huawei.com>
Signed-off-by: default avatarZhangPeng <zhangpeng362@huawei.com>
parent e1dbcfaa
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -110,7 +110,7 @@ void __init add_static_vm_early(struct static_vm *svm)
int ioremap_page(unsigned long virt, unsigned long phys,
		 const struct mem_type *mtype)
{
	return ioremap_page_range(virt, virt + PAGE_SIZE, phys,
	return vmap_page_range(virt, virt + PAGE_SIZE, phys,
			       __pgprot(mtype->prot_pte));
}
EXPORT_SYMBOL(ioremap_page);
@@ -466,7 +466,7 @@ int pci_remap_iospace(const struct resource *res, phys_addr_t phys_addr)
	if (res->end > IO_SPACE_LIMIT)
		return -EINVAL;

	return ioremap_page_range(vaddr, vaddr + resource_size(res), phys_addr,
	return vmap_page_range(vaddr, vaddr + resource_size(res), phys_addr,
			       __pgprot(get_mem_type(pci_ioremap_mem_type)->prot_pte));
}
EXPORT_SYMBOL(pci_remap_iospace);
+1 −1
Original line number Diff line number Diff line
@@ -591,7 +591,7 @@ static int __init add_legacy_isa_io(struct fwnode_handle *fwnode,
	}

	vaddr = (unsigned long)(PCI_IOBASE + range->io_start);
	ioremap_page_range(vaddr, vaddr + size, hw_start, pgprot_device(PAGE_KERNEL));
	vmap_page_range(vaddr, vaddr + size, hw_start, pgprot_device(PAGE_KERNEL));

	return 0;
}
+1 −1
Original line number Diff line number Diff line
@@ -177,7 +177,7 @@ static int __init add_legacy_isa_io(struct fwnode_handle *fwnode, resource_size_

	vaddr = PCI_IOBASE + range->io_start;

	ioremap_page_range(vaddr, vaddr + size, hw_start, pgprot_device(PAGE_KERNEL));
	vmap_page_range(vaddr, vaddr + size, hw_start, pgprot_device(PAGE_KERNEL));

	return 0;
}
+2 −2
Original line number Diff line number Diff line
@@ -46,7 +46,7 @@ static void remap_isa_base(phys_addr_t pa, unsigned long size)
	WARN_ON_ONCE(size & ~PAGE_MASK);

	if (slab_is_available()) {
		if (ioremap_page_range(ISA_IO_BASE, ISA_IO_BASE + size, pa,
		if (vmap_page_range(ISA_IO_BASE, ISA_IO_BASE + size, pa,
				    pgprot_noncached(PAGE_KERNEL)))
			vunmap_range(ISA_IO_BASE, ISA_IO_BASE + size);
	} else {
+2 −2
Original line number Diff line number Diff line
@@ -4279,7 +4279,7 @@ int pci_remap_iospace(const struct resource *res, phys_addr_t phys_addr)
	if (res->end > IO_SPACE_LIMIT)
		return -EINVAL;

	return ioremap_page_range(vaddr, vaddr + resource_size(res), phys_addr,
	return vmap_page_range(vaddr, vaddr + resource_size(res), phys_addr,
			       pgprot_device(PAGE_KERNEL));
#else
	/*
Loading