| From 426dc0b53ee45b3baaf1fc0795a8e3582c8b2f8a Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 26 Aug 2020 08:33:12 +0200 |
| Subject: misc: fastrpc: fix common struct sg_table related issues |
| |
| From: Marek Szyprowski <m.szyprowski@samsung.com> |
| |
| [ Upstream commit 7cd7edb89437457ec36ffdbb970cc314d00c4aba ] |
| |
| The Documentation/DMA-API-HOWTO.txt states that the dma_map_sg() function |
| returns the number of the created entries in the DMA address space. |
| However the subsequent calls to the dma_sync_sg_for_{device,cpu}() and |
| dma_unmap_sg must be called with the original number of the entries |
| passed to the dma_map_sg(). |
| |
| struct sg_table is a common structure used for describing a non-contiguous |
| memory buffer, used commonly in the DRM and graphics subsystems. It |
| consists of a scatterlist with memory pages and DMA addresses (sgl entry), |
| as well as the number of scatterlist entries: CPU pages (orig_nents entry) |
| and DMA mapped pages (nents entry). |
| |
| It turned out that it was a common mistake to misuse nents and orig_nents |
| entries, calling DMA-mapping functions with a wrong number of entries or |
| ignoring the number of mapped entries returned by the dma_map_sg() |
| function. |
| |
| To avoid such issues, lets use a common dma-mapping wrappers operating |
| directly on the struct sg_table objects and use scatterlist page |
| iterators where possible. This, almost always, hides references to the |
| nents and orig_nents entries, making the code robust, easier to follow |
| and copy/paste safe. |
| |
| Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com> |
| Link: https://lore.kernel.org/r/20200826063316.23486-29-m.szyprowski@samsung.com |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/misc/fastrpc.c | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| diff --git a/drivers/misc/fastrpc.c b/drivers/misc/fastrpc.c |
| index 7939c55daceb2..9d68677493163 100644 |
| --- a/drivers/misc/fastrpc.c |
| +++ b/drivers/misc/fastrpc.c |
| @@ -518,7 +518,7 @@ fastrpc_map_dma_buf(struct dma_buf_attachment *attachment, |
| |
| table = &a->sgt; |
| |
| - if (!dma_map_sg(attachment->dev, table->sgl, table->nents, dir)) |
| + if (!dma_map_sgtable(attachment->dev, table, dir, 0)) |
| return ERR_PTR(-ENOMEM); |
| |
| return table; |
| @@ -528,7 +528,7 @@ static void fastrpc_unmap_dma_buf(struct dma_buf_attachment *attach, |
| struct sg_table *table, |
| enum dma_data_direction dir) |
| { |
| - dma_unmap_sg(attach->dev, table->sgl, table->nents, dir); |
| + dma_unmap_sgtable(attach->dev, table, dir, 0); |
| } |
| |
| static void fastrpc_release(struct dma_buf *dmabuf) |
| -- |
| 2.27.0 |
| |