Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cef4d023 authored by David Woodhouse's avatar David Woodhouse Committed by Bjorn Helgaas
Browse files

PCI: Only allow WC mmap on prefetchable resources



The /proc/bus/pci mmap interface allows the user to specify whether they
want WC or not.  Don't let them do so on non-prefetchable BARs.

Signed-off-by: default avatarDavid Woodhouse <dwmw@amazon.co.uk>
Signed-off-by: default avatarBjorn Helgaas <bhelgaas@google.com>
Cc: stable@vger.kernel.org
parent 17caf567
Loading
Loading
Loading
Loading
+8 −5
Original line number Diff line number Diff line
@@ -231,7 +231,7 @@ static int proc_bus_pci_mmap(struct file *file, struct vm_area_struct *vma)
{
	struct pci_dev *dev = PDE_DATA(file_inode(file));
	struct pci_filp_private *fpriv = file->private_data;
	int i, ret, write_combine, res_bit;
	int i, ret, write_combine = 0, res_bit;

	if (!capable(CAP_SYS_RAWIO))
		return -EPERM;
@@ -251,10 +251,13 @@ static int proc_bus_pci_mmap(struct file *file, struct vm_area_struct *vma)
	if (i >= PCI_ROM_RESOURCE)
		return -ENODEV;

	if (fpriv->mmap_state == pci_mmap_mem)
		write_combine = fpriv->write_combine;
	if (fpriv->mmap_state == pci_mmap_mem &&
	    fpriv->write_combine) {
		if (dev->resource[i].flags & IORESOURCE_PREFETCH)
			write_combine = 1;
		else
		write_combine = 0;
			return -EINVAL;
	}
	ret = pci_mmap_page_range(dev, vma,
				  fpriv->mmap_state, write_combine);
	if (ret < 0)