| From c2b804f75d2228f729cc6db68f8de78a99177b70 Mon Sep 17 00:00:00 2001 |
| From: Andy Shevchenko <andriy.shevchenko@linux.intel.com> |
| Date: Wed, 30 Jan 2019 21:48:44 +0200 |
| Subject: dmaengine: dmatest: Abort test in case of mapping error |
| |
| [ Upstream commit 6454368a804c4955ccd116236037536f81e5b1f1 ] |
| |
| In case of mapping error the DMA addresses are invalid and continuing |
| will screw system memory or potentially something else. |
| |
| [ 222.480310] dmatest: dma0chan7-copy0: summary 1 tests, 3 failures 6 iops 349 KB/s (0) |
| ... |
| [ 240.912725] check: Corrupted low memory at 00000000c7c75ac9 (2940 phys) = 5656000000000000 |
| [ 240.921998] check: Corrupted low memory at 000000005715a1cd (2948 phys) = 279f2aca5595ab2b |
| [ 240.931280] check: Corrupted low memory at 000000002f4024c0 (2950 phys) = 5e5624f349e793cf |
| ... |
| |
| Abort any test if mapping failed. |
| |
| Fixes: 4076e755dbec ("dmatest: convert to dmaengine_unmap_data") |
| Cc: Dan Williams <dan.j.williams@intel.com> |
| Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> |
| Signed-off-by: Vinod Koul <vkoul@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/dma/dmatest.c | 28 ++++++++++++---------------- |
| 1 file changed, 12 insertions(+), 16 deletions(-) |
| |
| diff --git a/drivers/dma/dmatest.c b/drivers/dma/dmatest.c |
| index aa1712beb0cc..7b7fba0c9253 100644 |
| --- a/drivers/dma/dmatest.c |
| +++ b/drivers/dma/dmatest.c |
| @@ -642,11 +642,9 @@ static int dmatest_func(void *data) |
| srcs[i] = um->addr[i] + src_off; |
| ret = dma_mapping_error(dev->dev, um->addr[i]); |
| if (ret) { |
| - dmaengine_unmap_put(um); |
| result("src mapping error", total_tests, |
| src_off, dst_off, len, ret); |
| - failed_tests++; |
| - continue; |
| + goto error_unmap_continue; |
| } |
| um->to_cnt++; |
| } |
| @@ -661,11 +659,9 @@ static int dmatest_func(void *data) |
| DMA_BIDIRECTIONAL); |
| ret = dma_mapping_error(dev->dev, dsts[i]); |
| if (ret) { |
| - dmaengine_unmap_put(um); |
| result("dst mapping error", total_tests, |
| src_off, dst_off, len, ret); |
| - failed_tests++; |
| - continue; |
| + goto error_unmap_continue; |
| } |
| um->bidi_cnt++; |
| } |
| @@ -693,12 +689,10 @@ static int dmatest_func(void *data) |
| } |
| |
| if (!tx) { |
| - dmaengine_unmap_put(um); |
| result("prep error", total_tests, src_off, |
| dst_off, len, ret); |
| msleep(100); |
| - failed_tests++; |
| - continue; |
| + goto error_unmap_continue; |
| } |
| |
| done->done = false; |
| @@ -707,12 +701,10 @@ static int dmatest_func(void *data) |
| cookie = tx->tx_submit(tx); |
| |
| if (dma_submit_error(cookie)) { |
| - dmaengine_unmap_put(um); |
| result("submit error", total_tests, src_off, |
| dst_off, len, ret); |
| msleep(100); |
| - failed_tests++; |
| - continue; |
| + goto error_unmap_continue; |
| } |
| dma_async_issue_pending(chan); |
| |
| @@ -725,16 +717,14 @@ static int dmatest_func(void *data) |
| dmaengine_unmap_put(um); |
| result("test timed out", total_tests, src_off, dst_off, |
| len, 0); |
| - failed_tests++; |
| - continue; |
| + goto error_unmap_continue; |
| } else if (status != DMA_COMPLETE) { |
| dmaengine_unmap_put(um); |
| result(status == DMA_ERROR ? |
| "completion error status" : |
| "completion busy status", total_tests, src_off, |
| dst_off, len, ret); |
| - failed_tests++; |
| - continue; |
| + goto error_unmap_continue; |
| } |
| |
| dmaengine_unmap_put(um); |
| @@ -779,6 +769,12 @@ static int dmatest_func(void *data) |
| verbose_result("test passed", total_tests, src_off, |
| dst_off, len, 0); |
| } |
| + |
| + continue; |
| + |
| +error_unmap_continue: |
| + dmaengine_unmap_put(um); |
| + failed_tests++; |
| } |
| ktime = ktime_sub(ktime_get(), ktime); |
| ktime = ktime_sub(ktime, comparetime); |
| -- |
| 2.19.1 |
| |