diff options
author | Stefan Roese <sr@denx.de> | 2016-06-01 06:43:32 -0400 |
---|---|---|
committer | Vinod Koul <vinod.koul@intel.com> | 2016-06-07 03:14:23 -0400 |
commit | 5156463588c3999b630d9ffc6061a54962f3c2d9 (patch) | |
tree | fa3d42f206446c6c36cb43367fdbba2f44018a81 /drivers/dma/mv_xor.c | |
parent | 9295c41d77ca93aac79cfca6fa09fa1ca5cab66f (diff) |
dmaengine: mv_xor: Fix incorrect offset in dma_map_page()
Upon booting, I occasionally spotted some BUGs triggered by the internal
DMA test routine executed upon driver probing. This was detected by
SLUB_DEBUG ("Freechain corrupt" or "Redzone overwritten"). Tracking
this down located a problem in passing 0 as offset in dma_map_page().
As kmalloc, especially when used with SLUB_DEBUG, may return a non page
aligned address.
This patch fixes this issue by passing the correct offset in
dma_map_page().
Tested on a custom Armada XP board.
Signed-off-by: Stefan Roese <sr@denx.de>
Cc: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
Cc: Gregory CLEMENT <gregory.clement@free-electrons.com>
Cc: Marcin Wojtas <mw@semihalf.com>
Signed-off-by: Vinod Koul <vinod.koul@intel.com>
Diffstat (limited to 'drivers/dma/mv_xor.c')
-rw-r--r-- | drivers/dma/mv_xor.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/drivers/dma/mv_xor.c b/drivers/dma/mv_xor.c index 25d1dadcddd1..d0446a75990a 100644 --- a/drivers/dma/mv_xor.c +++ b/drivers/dma/mv_xor.c | |||
@@ -703,8 +703,9 @@ static int mv_chan_memcpy_self_test(struct mv_xor_chan *mv_chan) | |||
703 | goto free_resources; | 703 | goto free_resources; |
704 | } | 704 | } |
705 | 705 | ||
706 | src_dma = dma_map_page(dma_chan->device->dev, virt_to_page(src), 0, | 706 | src_dma = dma_map_page(dma_chan->device->dev, virt_to_page(src), |
707 | PAGE_SIZE, DMA_TO_DEVICE); | 707 | (size_t)src & ~PAGE_MASK, PAGE_SIZE, |
708 | DMA_TO_DEVICE); | ||
708 | unmap->addr[0] = src_dma; | 709 | unmap->addr[0] = src_dma; |
709 | 710 | ||
710 | ret = dma_mapping_error(dma_chan->device->dev, src_dma); | 711 | ret = dma_mapping_error(dma_chan->device->dev, src_dma); |
@@ -714,8 +715,9 @@ static int mv_chan_memcpy_self_test(struct mv_xor_chan *mv_chan) | |||
714 | } | 715 | } |
715 | unmap->to_cnt = 1; | 716 | unmap->to_cnt = 1; |
716 | 717 | ||
717 | dest_dma = dma_map_page(dma_chan->device->dev, virt_to_page(dest), 0, | 718 | dest_dma = dma_map_page(dma_chan->device->dev, virt_to_page(dest), |
718 | PAGE_SIZE, DMA_FROM_DEVICE); | 719 | (size_t)dest & ~PAGE_MASK, PAGE_SIZE, |
720 | DMA_FROM_DEVICE); | ||
719 | unmap->addr[1] = dest_dma; | 721 | unmap->addr[1] = dest_dma; |
720 | 722 | ||
721 | ret = dma_mapping_error(dma_chan->device->dev, dest_dma); | 723 | ret = dma_mapping_error(dma_chan->device->dev, dest_dma); |