Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754427AbcJEOvk (ORCPT ); Wed, 5 Oct 2016 10:51:40 -0400 Received: from bes.se.axis.com ([195.60.68.10]:49560 "EHLO bes.se.axis.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752257AbcJEOvj (ORCPT ); Wed, 5 Oct 2016 10:51:39 -0400 Date: Wed, 5 Oct 2016 16:51:32 +0200 From: Jesper Nilsson To: Dan Williams , Vinod Koul , dmaengine@vger.kernel.org, Guennadi Liakhovetski , linux-kernel@vger.kernel.org Subject: [PATCH] DMA: nbpfaxi: check for errors from dma_map_single Message-ID: <20161005145131.GJ30704@axis.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.23 (2014-03-12) X-TM-AS-GCONF: 00 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1614 Lines: 54 Check for error return from dma_map_single. Move the addition of the node to the list to after we check for error, so we can reuse the list in unmapping. Found by enabling CONFIG_DMA_API_DEBUG. Signed-off-by: Jesper Nilsson --- drivers/dma/nbpfaxi.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/drivers/dma/nbpfaxi.c b/drivers/dma/nbpfaxi.c index 42ac2ff..4f5dd2e 100644 --- a/drivers/dma/nbpfaxi.c +++ b/drivers/dma/nbpfaxi.c @@ -731,10 +731,15 @@ static int __nbpf_desc_page_alloc(struct nbpf_channel *chan, gfp_t gfp) i < ARRAY_SIZE(dpage->ldesc); i++, ldesc++, hwdesc++) { ldesc->hwdesc = hwdesc; - list_add_tail(&ldesc->node, &lhead); ldesc->hwdesc_dma_addr = dma_map_single(dchan->device->dev, hwdesc, sizeof(*hwdesc), DMA_TO_DEVICE); + if (dma_mapping_error(dchan->device->dev, + ldesc->hwdesc_dma_addr)) { + goto unmap_err; + } + list_add_tail(&ldesc->node, &lhead); + dev_dbg(dev, "%s(): mapped 0x%p to %pad\n", __func__, hwdesc, &ldesc->hwdesc_dma_addr); } @@ -754,6 +759,14 @@ static int __nbpf_desc_page_alloc(struct nbpf_channel *chan, gfp_t gfp) list_add(&dpage->node, &chan->desc_page); return ARRAY_SIZE(dpage->desc); +unmap_err: + list_for_each_entry(ldesc, &lhead, node) { + dma_unmap_single(dchan->device->dev, + ldesc->hwdesc_dma_addr, + sizeof(*ldesc->hwdesc), + DMA_TO_DEVICE); + } + return -ENOMEM; } static void __nbpf_desc_put(struct nbpf_desc *desc) -- 2.1.4 /^JN - Jesper Nilsson -- Jesper Nilsson -- jesper.nilsson@axis.com