Patch "dmaengine: dw: disable BLOCK IRQs for non-cyclic xfer" has been added to the 4.4-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
dmaengine: dw: disable BLOCK IRQs for non-cyclic xfer
to the 4.4-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
dmaengine-dw-disable-block-irqs-for-non-cyclic-xfer.patch
and it can be found in the queue-4.4 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
ee1cdcdae59563535485a5f56ee72c894ab7d7adMon Sep 17 00:00:00 2001
From: Andy Shevchenko <[email protected]>
Date: Wed, 10 Feb 2016 15:59:42 +0200
Subject: dmaengine: dw: disable BLOCK IRQs for non-cyclic xfer
From: Andy Shevchenko <[email protected]>
commit ee1cdcdae59563535485a5f56ee72c894ab7d7ad upstream.
The commit 2895b2cad6e7 ("dmaengine: dw: fix cyclic transfer callbacks") re-enabled BLOCK interrupts with regard to make cyclic transfers work. However, this change becomes a regression for non-cyclic transfers as interrupt counters under stress test had been grown enormously (approximately per 4-5 bytes in the UART loop back test).
Taking into consideration above enable BLOCK interrupts if and only if channel is programmed to perform cyclic transfer.
--- drivers/dma/dw/core.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-)
drivers/dma/dw/core.c +10 -5
@@ -156,7 +156,6 @@ static void dwc_initialize(struct dw_dma/* Enable interrupts */ channel_set_bit (dw,MASK .XFER, dwc->mask); -channel_set_bit (dw,MASK .BLOCK, dwc->mask);channel_set_bit (dw,MASK .ERROR, dwc->mask); dwc->initialized = true;
@@ -588,6 +587,9 @@ static void dwc_handle_cyclic(struct dw_spin_unlock_irqrestore (&dwc->lock, flags); } + +/* Re-enable interrupts */ +channel_set_bit (dw,MASK .BLOCK, dwc->mask); }/* ------------------------------------------------------------------------- */
@@ -618,11 +620,8 @@ static void dw_dma_tasklet(unsigned longdwc_scan_descriptors (dw, dwc); } -/* -* Re-enable interrupts. -*/ +/* Re-enable interrupts */ channel_set_bit (dw,MASK .XFER, dw->all_chan_mask); -channel_set_bit (dw,MASK .BLOCK, dw->all_chan_mask);channel_set_bit (dw,MASK .ERROR, dw->all_chan_mask); }
@@ -1256,6 +1255,7 @@ static void dwc_free_chan_resources(struint dw_dma_cyclic_start (struct dma_chan *chan) {struct dw_dma_chan *dwc =to_dw_dma_chan (chan); +struct dw_dma *dw =to_dw_dma (chan->device);unsigned long flags;if (!test_bit (DW_DMA_IS_CYCLIC , &dwc->flags)) {
@@ -1264,7 +1264,12 @@ int dw_dma_cyclic_start(struct dma_chan }spin_lock_irqsave (&dwc->lock, flags); + +/* Enable interrupts to perform cyclic transfer */ +channel_set_bit (dw,MASK .BLOCK, dwc->mask); +dwc_dostart (dwc, dwc->cdesc->desc[0 ]); +spin_unlock_irqrestore (&dwc->lock, flags);return 0 ;
Patches currently in stable-queue which might be from [email protected] are
queue-4.4/dmaengine-dw-disable-block-irqs-for-non-cyclic-xfer.patch