diff options
author | Sebastian Ott <sebott@linux.vnet.ibm.com> | 2013-12-12 11:53:59 -0500 |
---|---|---|
committer | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2013-12-16 08:37:56 -0500 |
commit | f7038b7c3f4924b18390c51c1ec1e49287cc87db (patch) | |
tree | 1d2db04d9d8ed0497694dc1fee5ae95b4de8d946 /arch/s390/pci | |
parent | 0c0c2776926018e7560b99e921467aea1115d03b (diff) |
s390/pci/dma: fix accounting of allocated_pages
allocated_pages sometimes are increased even if s390_dma_alloc fails
also this value is never decreased even if s390_dma_free is called.
This patch fixes these bugs.
Also remove the atomic64_t casts (the members are already of this type).
Reviewed-by: Gerald Schaefer <gerald.schaefer@de.ibm.com>
Signed-off-by: Sebastian Ott <sebott@linux.vnet.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'arch/s390/pci')
-rw-r--r-- | arch/s390/pci/pci_dma.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/arch/s390/pci/pci_dma.c b/arch/s390/pci/pci_dma.c index 9b83d080902d..60c11a629d96 100644 --- a/arch/s390/pci/pci_dma.c +++ b/arch/s390/pci/pci_dma.c | |||
@@ -285,7 +285,7 @@ static dma_addr_t s390_dma_map_pages(struct device *dev, struct page *page, | |||
285 | flags |= ZPCI_TABLE_PROTECTED; | 285 | flags |= ZPCI_TABLE_PROTECTED; |
286 | 286 | ||
287 | if (!dma_update_trans(zdev, pa, dma_addr, size, flags)) { | 287 | if (!dma_update_trans(zdev, pa, dma_addr, size, flags)) { |
288 | atomic64_add(nr_pages, (atomic64_t *) &zdev->fmb->mapped_pages); | 288 | atomic64_add(nr_pages, &zdev->fmb->mapped_pages); |
289 | return dma_addr + (offset & ~PAGE_MASK); | 289 | return dma_addr + (offset & ~PAGE_MASK); |
290 | } | 290 | } |
291 | 291 | ||
@@ -313,7 +313,7 @@ static void s390_dma_unmap_pages(struct device *dev, dma_addr_t dma_addr, | |||
313 | zpci_err_hex(&dma_addr, sizeof(dma_addr)); | 313 | zpci_err_hex(&dma_addr, sizeof(dma_addr)); |
314 | } | 314 | } |
315 | 315 | ||
316 | atomic64_add(npages, (atomic64_t *) &zdev->fmb->unmapped_pages); | 316 | atomic64_add(npages, &zdev->fmb->unmapped_pages); |
317 | iommu_page_index = (dma_addr - zdev->start_dma) >> PAGE_SHIFT; | 317 | iommu_page_index = (dma_addr - zdev->start_dma) >> PAGE_SHIFT; |
318 | dma_free_iommu(zdev, iommu_page_index, npages); | 318 | dma_free_iommu(zdev, iommu_page_index, npages); |
319 | } | 319 | } |
@@ -332,7 +332,6 @@ static void *s390_dma_alloc(struct device *dev, size_t size, | |||
332 | if (!page) | 332 | if (!page) |
333 | return NULL; | 333 | return NULL; |
334 | 334 | ||
335 | atomic64_add(size / PAGE_SIZE, (atomic64_t *) &zdev->fmb->allocated_pages); | ||
336 | pa = page_to_phys(page); | 335 | pa = page_to_phys(page); |
337 | memset((void *) pa, 0, size); | 336 | memset((void *) pa, 0, size); |
338 | 337 | ||
@@ -343,6 +342,7 @@ static void *s390_dma_alloc(struct device *dev, size_t size, | |||
343 | return NULL; | 342 | return NULL; |
344 | } | 343 | } |
345 | 344 | ||
345 | atomic64_add(size / PAGE_SIZE, &zdev->fmb->allocated_pages); | ||
346 | if (dma_handle) | 346 | if (dma_handle) |
347 | *dma_handle = map; | 347 | *dma_handle = map; |
348 | return (void *) pa; | 348 | return (void *) pa; |
@@ -352,8 +352,11 @@ static void s390_dma_free(struct device *dev, size_t size, | |||
352 | void *pa, dma_addr_t dma_handle, | 352 | void *pa, dma_addr_t dma_handle, |
353 | struct dma_attrs *attrs) | 353 | struct dma_attrs *attrs) |
354 | { | 354 | { |
355 | s390_dma_unmap_pages(dev, dma_handle, PAGE_ALIGN(size), | 355 | struct zpci_dev *zdev = get_zdev(to_pci_dev(dev)); |
356 | DMA_BIDIRECTIONAL, NULL); | 356 | |
357 | size = PAGE_ALIGN(size); | ||
358 | atomic64_sub(size / PAGE_SIZE, &zdev->fmb->allocated_pages); | ||
359 | s390_dma_unmap_pages(dev, dma_handle, size, DMA_BIDIRECTIONAL, NULL); | ||
357 | free_pages((unsigned long) pa, get_order(size)); | 360 | free_pages((unsigned long) pa, get_order(size)); |
358 | } | 361 | } |
359 | 362 | ||