Commit 999df205 authored by David Woodhouse's avatar David Woodhouse Committed by Ben Hutchings

PCI: Only allow WC mmap on prefetchable resources

commit cef4d023 upstream.

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>
Signed-off-by: default avatarBen Hutchings <ben@decadent.org.uk>
parent 077b04d6
...@@ -249,7 +249,7 @@ static int proc_bus_pci_mmap(struct file *file, struct vm_area_struct *vma) ...@@ -249,7 +249,7 @@ static int proc_bus_pci_mmap(struct file *file, struct vm_area_struct *vma)
const struct proc_dir_entry *dp = PDE(inode); const struct proc_dir_entry *dp = PDE(inode);
struct pci_dev *dev = dp->data; struct pci_dev *dev = dp->data;
struct pci_filp_private *fpriv = file->private_data; 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)) if (!capable(CAP_SYS_RAWIO))
return -EPERM; return -EPERM;
...@@ -269,10 +269,13 @@ static int proc_bus_pci_mmap(struct file *file, struct vm_area_struct *vma) ...@@ -269,10 +269,13 @@ static int proc_bus_pci_mmap(struct file *file, struct vm_area_struct *vma)
if (i >= PCI_ROM_RESOURCE) if (i >= PCI_ROM_RESOURCE)
return -ENODEV; return -ENODEV;
if (fpriv->mmap_state == pci_mmap_mem) if (fpriv->mmap_state == pci_mmap_mem &&
write_combine = fpriv->write_combine; fpriv->write_combine) {
else if (dev->resource[i].flags & IORESOURCE_PREFETCH)
write_combine = 0; write_combine = 1;
else
return -EINVAL;
}
ret = pci_mmap_page_range(dev, vma, ret = pci_mmap_page_range(dev, vma,
fpriv->mmap_state, write_combine); fpriv->mmap_state, write_combine);
if (ret < 0) if (ret < 0)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment