diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2015-12-17 14:20:13 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2015-12-17 14:20:13 -0500 |
commit | d7637d01bef21848d156a219626b6541ccc0a734 (patch) | |
tree | 671ffa07e78f110cdeaab853127fc2b1359444ee | |
parent | a5e90b1b075f89f084047628d4ef181aded0bbfb (diff) | |
parent | 0354aec19ce3d355c6213b0434064efc25c9b22c (diff) |
Merge branch 'libnvdimm-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/nvdimm/nvdimm
Pull libnvdimm fixes from Dan Williams:
- Two bug fixes for misuse of PAGE_MASK in scatterlist and dma-debug.
These are tagged for -stable. The scatterlist impact is potentially
corrupted dma addresses on HIGHMEM enabled platforms.
- A minor locking fix for the NFIT hot-add implementation that is new
in 4.4-rc. This would only trigger in the case a hot-add raced
driver removal.
* 'libnvdimm-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/nvdimm/nvdimm:
dma-debug: Fix dma_debug_entry offset calculation
Revert "scatterlist: use sg_phys()"
nfit: acpi_nfit_notify(): Do not leave device locked
-rw-r--r-- | arch/arm/mm/dma-mapping.c | 2 | ||||
-rw-r--r-- | arch/microblaze/kernel/dma.c | 3 | ||||
-rw-r--r-- | drivers/acpi/nfit.c | 2 | ||||
-rw-r--r-- | drivers/iommu/intel-iommu.c | 4 | ||||
-rw-r--r-- | drivers/iommu/iommu.c | 2 | ||||
-rw-r--r-- | drivers/staging/android/ion/ion_chunk_heap.c | 4 | ||||
-rw-r--r-- | lib/dma-debug.c | 4 |
7 files changed, 11 insertions, 10 deletions
diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c index e62400e5fb99..534a60ae282e 100644 --- a/arch/arm/mm/dma-mapping.c +++ b/arch/arm/mm/dma-mapping.c | |||
@@ -1521,7 +1521,7 @@ static int __map_sg_chunk(struct device *dev, struct scatterlist *sg, | |||
1521 | return -ENOMEM; | 1521 | return -ENOMEM; |
1522 | 1522 | ||
1523 | for (count = 0, s = sg; count < (size >> PAGE_SHIFT); s = sg_next(s)) { | 1523 | for (count = 0, s = sg; count < (size >> PAGE_SHIFT); s = sg_next(s)) { |
1524 | phys_addr_t phys = sg_phys(s) & PAGE_MASK; | 1524 | phys_addr_t phys = page_to_phys(sg_page(s)); |
1525 | unsigned int len = PAGE_ALIGN(s->offset + s->length); | 1525 | unsigned int len = PAGE_ALIGN(s->offset + s->length); |
1526 | 1526 | ||
1527 | if (!is_coherent && | 1527 | if (!is_coherent && |
diff --git a/arch/microblaze/kernel/dma.c b/arch/microblaze/kernel/dma.c index c89da6312954..bf4dec229437 100644 --- a/arch/microblaze/kernel/dma.c +++ b/arch/microblaze/kernel/dma.c | |||
@@ -61,7 +61,8 @@ static int dma_direct_map_sg(struct device *dev, struct scatterlist *sgl, | |||
61 | /* FIXME this part of code is untested */ | 61 | /* FIXME this part of code is untested */ |
62 | for_each_sg(sgl, sg, nents, i) { | 62 | for_each_sg(sgl, sg, nents, i) { |
63 | sg->dma_address = sg_phys(sg); | 63 | sg->dma_address = sg_phys(sg); |
64 | __dma_sync(sg_phys(sg), sg->length, direction); | 64 | __dma_sync(page_to_phys(sg_page(sg)) + sg->offset, |
65 | sg->length, direction); | ||
65 | } | 66 | } |
66 | 67 | ||
67 | return nents; | 68 | return nents; |
diff --git a/drivers/acpi/nfit.c b/drivers/acpi/nfit.c index e7ed39bab97d..aa45d4802707 100644 --- a/drivers/acpi/nfit.c +++ b/drivers/acpi/nfit.c | |||
@@ -1810,7 +1810,7 @@ static void acpi_nfit_notify(struct acpi_device *adev, u32 event) | |||
1810 | if (!dev->driver) { | 1810 | if (!dev->driver) { |
1811 | /* dev->driver may be null if we're being removed */ | 1811 | /* dev->driver may be null if we're being removed */ |
1812 | dev_dbg(dev, "%s: no driver found for dev\n", __func__); | 1812 | dev_dbg(dev, "%s: no driver found for dev\n", __func__); |
1813 | return; | 1813 | goto out_unlock; |
1814 | } | 1814 | } |
1815 | 1815 | ||
1816 | if (!acpi_desc) { | 1816 | if (!acpi_desc) { |
diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c index f1042daef9ad..ac7387686ddc 100644 --- a/drivers/iommu/intel-iommu.c +++ b/drivers/iommu/intel-iommu.c | |||
@@ -2159,7 +2159,7 @@ static int __domain_mapping(struct dmar_domain *domain, unsigned long iov_pfn, | |||
2159 | sg_res = aligned_nrpages(sg->offset, sg->length); | 2159 | sg_res = aligned_nrpages(sg->offset, sg->length); |
2160 | sg->dma_address = ((dma_addr_t)iov_pfn << VTD_PAGE_SHIFT) + sg->offset; | 2160 | sg->dma_address = ((dma_addr_t)iov_pfn << VTD_PAGE_SHIFT) + sg->offset; |
2161 | sg->dma_length = sg->length; | 2161 | sg->dma_length = sg->length; |
2162 | pteval = (sg_phys(sg) & PAGE_MASK) | prot; | 2162 | pteval = page_to_phys(sg_page(sg)) | prot; |
2163 | phys_pfn = pteval >> VTD_PAGE_SHIFT; | 2163 | phys_pfn = pteval >> VTD_PAGE_SHIFT; |
2164 | } | 2164 | } |
2165 | 2165 | ||
@@ -3704,7 +3704,7 @@ static int intel_nontranslate_map_sg(struct device *hddev, | |||
3704 | 3704 | ||
3705 | for_each_sg(sglist, sg, nelems, i) { | 3705 | for_each_sg(sglist, sg, nelems, i) { |
3706 | BUG_ON(!sg_page(sg)); | 3706 | BUG_ON(!sg_page(sg)); |
3707 | sg->dma_address = sg_phys(sg); | 3707 | sg->dma_address = page_to_phys(sg_page(sg)) + sg->offset; |
3708 | sg->dma_length = sg->length; | 3708 | sg->dma_length = sg->length; |
3709 | } | 3709 | } |
3710 | return nelems; | 3710 | return nelems; |
diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c index abae363c7b9b..0e3b0092ec92 100644 --- a/drivers/iommu/iommu.c +++ b/drivers/iommu/iommu.c | |||
@@ -1430,7 +1430,7 @@ size_t default_iommu_map_sg(struct iommu_domain *domain, unsigned long iova, | |||
1430 | min_pagesz = 1 << __ffs(domain->ops->pgsize_bitmap); | 1430 | min_pagesz = 1 << __ffs(domain->ops->pgsize_bitmap); |
1431 | 1431 | ||
1432 | for_each_sg(sg, s, nents, i) { | 1432 | for_each_sg(sg, s, nents, i) { |
1433 | phys_addr_t phys = sg_phys(s); | 1433 | phys_addr_t phys = page_to_phys(sg_page(s)) + s->offset; |
1434 | 1434 | ||
1435 | /* | 1435 | /* |
1436 | * We are mapping on IOMMU page boundaries, so offset within | 1436 | * We are mapping on IOMMU page boundaries, so offset within |
diff --git a/drivers/staging/android/ion/ion_chunk_heap.c b/drivers/staging/android/ion/ion_chunk_heap.c index 195c41d7bd53..0813163f962f 100644 --- a/drivers/staging/android/ion/ion_chunk_heap.c +++ b/drivers/staging/android/ion/ion_chunk_heap.c | |||
@@ -81,7 +81,7 @@ static int ion_chunk_heap_allocate(struct ion_heap *heap, | |||
81 | err: | 81 | err: |
82 | sg = table->sgl; | 82 | sg = table->sgl; |
83 | for (i -= 1; i >= 0; i--) { | 83 | for (i -= 1; i >= 0; i--) { |
84 | gen_pool_free(chunk_heap->pool, sg_phys(sg) & PAGE_MASK, | 84 | gen_pool_free(chunk_heap->pool, page_to_phys(sg_page(sg)), |
85 | sg->length); | 85 | sg->length); |
86 | sg = sg_next(sg); | 86 | sg = sg_next(sg); |
87 | } | 87 | } |
@@ -109,7 +109,7 @@ static void ion_chunk_heap_free(struct ion_buffer *buffer) | |||
109 | DMA_BIDIRECTIONAL); | 109 | DMA_BIDIRECTIONAL); |
110 | 110 | ||
111 | for_each_sg(table->sgl, sg, table->nents, i) { | 111 | for_each_sg(table->sgl, sg, table->nents, i) { |
112 | gen_pool_free(chunk_heap->pool, sg_phys(sg) & PAGE_MASK, | 112 | gen_pool_free(chunk_heap->pool, page_to_phys(sg_page(sg)), |
113 | sg->length); | 113 | sg->length); |
114 | } | 114 | } |
115 | chunk_heap->allocated -= allocated_size; | 115 | chunk_heap->allocated -= allocated_size; |
diff --git a/lib/dma-debug.c b/lib/dma-debug.c index 8855f019ebe8..d34bd24c2c84 100644 --- a/lib/dma-debug.c +++ b/lib/dma-debug.c | |||
@@ -1464,7 +1464,7 @@ void debug_dma_alloc_coherent(struct device *dev, size_t size, | |||
1464 | entry->type = dma_debug_coherent; | 1464 | entry->type = dma_debug_coherent; |
1465 | entry->dev = dev; | 1465 | entry->dev = dev; |
1466 | entry->pfn = page_to_pfn(virt_to_page(virt)); | 1466 | entry->pfn = page_to_pfn(virt_to_page(virt)); |
1467 | entry->offset = (size_t) virt & PAGE_MASK; | 1467 | entry->offset = (size_t) virt & ~PAGE_MASK; |
1468 | entry->size = size; | 1468 | entry->size = size; |
1469 | entry->dev_addr = dma_addr; | 1469 | entry->dev_addr = dma_addr; |
1470 | entry->direction = DMA_BIDIRECTIONAL; | 1470 | entry->direction = DMA_BIDIRECTIONAL; |
@@ -1480,7 +1480,7 @@ void debug_dma_free_coherent(struct device *dev, size_t size, | |||
1480 | .type = dma_debug_coherent, | 1480 | .type = dma_debug_coherent, |
1481 | .dev = dev, | 1481 | .dev = dev, |
1482 | .pfn = page_to_pfn(virt_to_page(virt)), | 1482 | .pfn = page_to_pfn(virt_to_page(virt)), |
1483 | .offset = (size_t) virt & PAGE_MASK, | 1483 | .offset = (size_t) virt & ~PAGE_MASK, |
1484 | .dev_addr = addr, | 1484 | .dev_addr = addr, |
1485 | .size = size, | 1485 | .size = size, |
1486 | .direction = DMA_BIDIRECTIONAL, | 1486 | .direction = DMA_BIDIRECTIONAL, |