Messages in this thread | | | Date | Fri, 2 Sep 2022 15:13:58 +0800 | Subject | Re: [PATCH 3/3] dmaengine: Fix client_count is countered one more incorrectly. | From | Jie Hai <> |
| |
Hi, Koba Ko
Thanks for your patch.
I've had the same problem,see https://lore.kernel.org/all/20220716024453.1418259-1-haijie1@huawei.com/.
The two operations of updating client_count, that is, chan->client_count++; balance_ref_count(chan);
the order of which is modified by d2f4f99db3e9 ("dmaengine: Rework dma_chan_get").
I have complied and tested it on my arm64 and this patch does fix the problem.
For this patch, Reviewed-by: Jie Hai <haijie1@huawei.com> Test-by: Jie Hai <haijie1@huawei.com>
Best regards, Jie Hai
On 2022/8/30 17:32, Koba Ko wrote: > If the passed client_count is 0, > it would be incremented by balance_ref_count first > then increment one more. > This would cause client_count to 2. > > cat /sys/class/dma/dma0chan*/in_use > 2 > 2 > 2 > > Fixes: d2f4f99db3e9 ("dmaengine: Rework dma_chan_get") > Signed-off-by: Koba Ko <koba.ko@canonical.com> > --- > drivers/dma/dmaengine.c | 7 ++++--- > 1 file changed, 4 insertions(+), 3 deletions(-) > > diff --git a/drivers/dma/dmaengine.c b/drivers/dma/dmaengine.c > index 2cfa8458b51be..78f8a9f3ad825 100644 > --- a/drivers/dma/dmaengine.c > +++ b/drivers/dma/dmaengine.c > @@ -451,7 +451,8 @@ static int dma_chan_get(struct dma_chan *chan) > /* The channel is already in use, update client count */ > if (chan->client_count) { > __module_get(owner); > - goto out; > + chan->client_count++; > + return 0; > } > > if (!try_module_get(owner)) > @@ -470,11 +471,11 @@ static int dma_chan_get(struct dma_chan *chan) > goto err_out; > } > > + chan->client_count++; > + > if (!dma_has_cap(DMA_PRIVATE, chan->device->cap_mask)) > balance_ref_count(chan); > > -out: > - chan->client_count++; > return 0; > > err_out:
| |