diff options
author | David Woodhouse <dwmw@amazon.co.uk> | 2017-04-12 08:25:50 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2017-05-25 09:44:47 -0400 |
commit | fa3bbb1c7f06e4e09f3c72ef42622ba260c77dc4 (patch) | |
tree | 448c9988c2786887d404de697993ef7eec124e76 | |
parent | 87e7dc97c8a0544553aacf8705c6772db55f6691 (diff) |
PCI: Fix pci_mmap_fits() for HAVE_PCI_RESOURCE_TO_USER platforms
commit 6bccc7f426abd640f08d8c75fb22f99483f201b4 upstream.
In the PCI_MMAP_PROCFS case when the address being passed by the user is a
'user visible' resource address based on the bus window, and not the actual
contents of the resource, that's what we need to be checking it against.
Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r-- | drivers/pci/pci-sysfs.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c index bcd10c795284..1b0786555394 100644 --- a/drivers/pci/pci-sysfs.c +++ b/drivers/pci/pci-sysfs.c | |||
@@ -974,15 +974,19 @@ void pci_remove_legacy_files(struct pci_bus *b) | |||
974 | int pci_mmap_fits(struct pci_dev *pdev, int resno, struct vm_area_struct *vma, | 974 | int pci_mmap_fits(struct pci_dev *pdev, int resno, struct vm_area_struct *vma, |
975 | enum pci_mmap_api mmap_api) | 975 | enum pci_mmap_api mmap_api) |
976 | { | 976 | { |
977 | unsigned long nr, start, size, pci_start; | 977 | unsigned long nr, start, size; |
978 | resource_size_t pci_start = 0, pci_end; | ||
978 | 979 | ||
979 | if (pci_resource_len(pdev, resno) == 0) | 980 | if (pci_resource_len(pdev, resno) == 0) |
980 | return 0; | 981 | return 0; |
981 | nr = vma_pages(vma); | 982 | nr = vma_pages(vma); |
982 | start = vma->vm_pgoff; | 983 | start = vma->vm_pgoff; |
983 | size = ((pci_resource_len(pdev, resno) - 1) >> PAGE_SHIFT) + 1; | 984 | size = ((pci_resource_len(pdev, resno) - 1) >> PAGE_SHIFT) + 1; |
984 | pci_start = (mmap_api == PCI_MMAP_PROCFS) ? | 985 | if (mmap_api == PCI_MMAP_PROCFS) { |
985 | pci_resource_start(pdev, resno) >> PAGE_SHIFT : 0; | 986 | pci_resource_to_user(pdev, resno, &pdev->resource[resno], |
987 | &pci_start, &pci_end); | ||
988 | pci_start >>= PAGE_SHIFT; | ||
989 | } | ||
986 | if (start >= pci_start && start < pci_start + size && | 990 | if (start >= pci_start && start < pci_start + size && |
987 | start + nr <= pci_start + size) | 991 | start + nr <= pci_start + size) |
988 | return 1; | 992 | return 1; |