Commit 2bfd3358 authored by Tudor Ambarus's avatar Tudor Ambarus Committed by sanglipeng
Browse files

dmaengine: at_hdmac: Free the memset buf without holding the chan lock

stable inclusion
from stable-v5.10.155
commit 0f603bf553a70af22ced122d706feeae2bb6ed76
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/I7M5F4

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=0f603bf553a70af22ced122d706feeae2bb6ed76



--------------------------------

commit 6ba826cb upstream.

There's no need to hold the channel lock when freeing the memset buf, as
the operation has already completed. Free the memset buf without holding
the channel lock.

Fixes: 4d112426 ("dmaengine: hdmac: Add memset capabilities")
Signed-off-by: default avatarTudor Ambarus <tudor.ambarus@microchip.com>
Cc: stable@vger.kernel.org
Acked-by: default avatarNicolas Ferre <nicolas.ferre@microchip.com>
Link: https://lore.kernel.org/r/20221025090306.297886-1-tudor.ambarus@microchip.com
Link: https://lore.kernel.org/r/20221025090306.297886-10-tudor.ambarus@microchip.com


Signed-off-by: default avatarVinod Koul <vkoul@kernel.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: default avatarsanglipeng <sanglipeng1@jd.com>
parent 8023eac8
Loading
Loading
Loading
Loading
+7 −7
Original line number Diff line number Diff line
@@ -443,13 +443,6 @@ atc_chain_complete(struct at_dma_chan *atchan, struct at_desc *desc)
	if (!atc_chan_is_cyclic(atchan))
		dma_cookie_complete(txd);

	/* If the transfer was a memset, free our temporary buffer */
	if (desc->memset_buffer) {
		dma_pool_free(atdma->memset_pool, desc->memset_vaddr,
			      desc->memset_paddr);
		desc->memset_buffer = false;
	}

	/* Remove transfer node from the active list. */
	list_del_init(&desc->desc_node);
	spin_unlock_irqrestore(&atchan->lock, flags);
@@ -468,6 +461,13 @@ atc_chain_complete(struct at_dma_chan *atchan, struct at_desc *desc)
	/* add myself to free_list */
	list_add(&desc->desc_node, &atchan->free_list);
	spin_unlock_irqrestore(&atchan->lock, flags);

	/* If the transfer was a memset, free our temporary buffer */
	if (desc->memset_buffer) {
		dma_pool_free(atdma->memset_pool, desc->memset_vaddr,
			      desc->memset_paddr);
		desc->memset_buffer = false;
	}
}

/**