From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Subject: dmaengine: rcar-dmac: Check the done lists in rcar_dmac_chan_get_residue() From: Vinod Koul Message-Id: <20180305112945.GO15443@localhost> Date: Mon, 5 Mar 2018 16:59:45 +0530 To: Yoshihiro Shimoda Cc: dmaengine@vger.kernel.org, linux-renesas-soc@vger.kernel.org List-ID: T24gRnJpLCBGZWIgMDIsIDIwMTggYXQgMDc6MDU6MTVQTSArMDkwMCwgWW9zaGloaXJvIFNoaW1v ZGEgd3JvdGU6Cj4gVGhpcyBwYXRjaCBmaXhlcyBhbiBpc3N1ZSB0aGF0IGEgcmFjZSBjb25kaXRp b24gaGFwcGVucyBiZXR3ZWVuIGEgY2xpZW50Cj4gZHJpdmVyIGFuZCB0aGUgcmNhci1kbWFjIGRy aXZlcjoKPiAKPiAtIFRoZSByY2FyX2RtYWNfaXNyX3RyYW5zZmVyX2VuZCgpIGlzIGNhbGxlZC4K PiAgLSBUaGUgZG9uZSBsaXN0IGFwcGVhcnMsIGFuZCBkZXNjLnJ1bm5pbmcgaXMgdGhlIG5leHQg YWN0aXZlIGxpc3QuCj4gLSByY2FyX2RtYWNfY2hhbl9nZXRfcmVzaWR1ZSgpIGlzIGNhbGxlZCBi eSBhIGNsaWVudCBkcml2ZXIgYmVmb3JlCj4gICByY2FyX2RtYWNfaXNyX2NoYW5uZWxfdGhyZWFk KCkgaXMgY2FsbGVkLgo+ICAtIFRoZSByY2FyX2RtYWNfY2hhbl9nZXRfcmVzaWR1ZSgpIHdpbGwg bm90IGZpbmQgYW55IGRlc2NyaXB0b3JzLgo+ICAtIEFuZCwgdGhlIGZvbGxvd2luZyBXQVJOSU5H IGhhcHBlbnM6Cj4gCVdBUk4oMSwgIk5vIGRlc2NyaXB0b3IgZm9yIGNvb2tpZSEiKTsKPiAKPiBU aGUgc2gtc2NpIGRyaXZlciB3aXRoIEhTQ0lGICg5MjEsNjAwYnBzKSBvbiBSLUNhciBIMyBjYW4g Y2F1c2UgdGhpcwo+IHNpdHVhdGlvbi4KPiBTbywgdGhpcyBwYXRjaCBjaGVja3MgdGhlIGRvbmUg bGlzdHMgaW4gcmNhcl9kbWFjX2NoYW5fZ2V0X3Jlc2lkdWUoKQo+IGFuZCByZXR1cm5zIHplcm8g aWYgdGhlIGRvbmUgbGlzdHMgaGFzIHRoZSBhcmd1bWVudCBjb29raWUuCgpBcHBsaWVkLCB0aGFu a3MKCj4gCj4gVGVzdGVkLWJ5OiBOZ3V5ZW4gVmlldCBEdW5nIDxkdW5nLm5ndXllbi5hakByZW5l c2FzLmNvbT4KPiBTaWduZWQtb2ZmLWJ5OiBZb3NoaWhpcm8gU2hpbW9kYSA8eW9zaGloaXJvLnNo aW1vZGEudWhAcmVuZXNhcy5jb20+Cj4gLS0tCj4gIGRyaXZlcnMvZG1hL3NoL3JjYXItZG1hYy5j IHwgOSArKysrKysrKysKPiAgMSBmaWxlIGNoYW5nZWQsIDkgaW5zZXJ0aW9ucygrKQo+IAo+IGRp ZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9zaC9yY2FyLWRtYWMuYyBiL2RyaXZlcnMvZG1hL3NoL3Jj YXItZG1hYy5jCj4gaW5kZXggMmIyYzdkYi4uZjc0OGJlNiAxMDA2NDQKPiAtLS0gYS9kcml2ZXJz L2RtYS9zaC9yY2FyLWRtYWMuYwo+ICsrKyBiL2RyaXZlcnMvZG1hL3NoL3JjYXItZG1hYy5jCj4g QEAgLTEyNjQsOCArMTI2NCwxNyBAQCBzdGF0aWMgdW5zaWduZWQgaW50IHJjYXJfZG1hY19jaGFu X2dldF9yZXNpZHVlKHN0cnVjdCByY2FyX2RtYWNfY2hhbiAqY2hhbiwKPiAgCSAqIElmIHRoZSBj b29raWUgZG9lc24ndCBjb3JyZXNwb25kIHRvIHRoZSBjdXJyZW50bHkgcnVubmluZyB0cmFuc2Zl cgo+ICAJICogdGhlbiB0aGUgZGVzY3JpcHRvciBoYXNuJ3QgYmVlbiBwcm9jZXNzZWQgeWV0LCBh bmQgdGhlIHJlc2lkdWUgaXMKPiAgCSAqIGVxdWFsIHRvIHRoZSBmdWxsIGRlc2NyaXB0b3Igc2l6 ZS4KPiArCSAqIEFsc28sIGEgY2xpZW50IGRyaXZlciBpcyBwb3NzaWJsZSB0byBjYWxsIHRoaXMg ZnVuY3Rpb24gYmVmb3JlCj4gKwkgKiByY2FyX2RtYWNfaXNyX2NoYW5uZWxfdGhyZWFkKCkgcnVu cy4gSW4gdGhpcyBjYXNlLCB0aGUgImRlc2MucnVubmluZyIKPiArCSAqIHdpbGwgYmUgdGhlIG5l eHQgZGVzY3JpcHRvciwgYW5kIHRoZSBkb25lIGxpc3Qgd2lsbCBhcHBlYXIuIFNvLCBpZgo+ICsJ ICogdGhlIGFyZ3VtZW50IGNvb2tpZSBtYXRjaGVzIHRoZSBkb25lIGxpc3QncyBjb29raWUsIHdl IGNhbiBhc3N1bWUKPiArCSAqIHRoZSByZXNpZHVlIGlzIHplcm8uCj4gIAkgKi8KPiAgCWlmIChj b29raWUgIT0gZGVzYy0+YXN5bmNfdHguY29va2llKSB7Cj4gKwkJbGlzdF9mb3JfZWFjaF9lbnRy eShkZXNjLCAmY2hhbi0+ZGVzYy5kb25lLCBub2RlKSB7Cj4gKwkJCWlmIChjb29raWUgPT0gZGVz Yy0+YXN5bmNfdHguY29va2llKQo+ICsJCQkJcmV0dXJuIDA7Cj4gKwkJfQo+ICAJCWxpc3RfZm9y X2VhY2hfZW50cnkoZGVzYywgJmNoYW4tPmRlc2MucGVuZGluZywgbm9kZSkgewo+ICAJCQlpZiAo Y29va2llID09IGRlc2MtPmFzeW5jX3R4LmNvb2tpZSkKPiAgCQkJCXJldHVybiBkZXNjLT5zaXpl Owo+IC0tIAo+IDEuOS4xCj4K From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga03.intel.com ([134.134.136.65]:59168 "EHLO mga03.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932896AbeCELZw (ORCPT ); Mon, 5 Mar 2018 06:25:52 -0500 Date: Mon, 5 Mar 2018 16:59:45 +0530 From: Vinod Koul To: Yoshihiro Shimoda Cc: dmaengine@vger.kernel.org, linux-renesas-soc@vger.kernel.org Subject: Re: [PATCH] dmaengine: rcar-dmac: Check the done lists in rcar_dmac_chan_get_residue() Message-ID: <20180305112945.GO15443@localhost> References: <1517565915-14234-1-git-send-email-yoshihiro.shimoda.uh@renesas.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1517565915-14234-1-git-send-email-yoshihiro.shimoda.uh@renesas.com> Sender: linux-renesas-soc-owner@vger.kernel.org List-ID: On Fri, Feb 02, 2018 at 07:05:15PM +0900, Yoshihiro Shimoda wrote: > This patch fixes an issue that a race condition happens between a client > driver and the rcar-dmac driver: > > - The rcar_dmac_isr_transfer_end() is called. > - The done list appears, and desc.running is the next active list. > - rcar_dmac_chan_get_residue() is called by a client driver before > rcar_dmac_isr_channel_thread() is called. > - The rcar_dmac_chan_get_residue() will not find any descriptors. > - And, the following WARNING happens: > WARN(1, "No descriptor for cookie!"); > > The sh-sci driver with HSCIF (921,600bps) on R-Car H3 can cause this > situation. > So, this patch checks the done lists in rcar_dmac_chan_get_residue() > and returns zero if the done lists has the argument cookie. Applied, thanks > > Tested-by: Nguyen Viet Dung > Signed-off-by: Yoshihiro Shimoda > --- > drivers/dma/sh/rcar-dmac.c | 9 +++++++++ > 1 file changed, 9 insertions(+) > > diff --git a/drivers/dma/sh/rcar-dmac.c b/drivers/dma/sh/rcar-dmac.c > index 2b2c7db..f748be6 100644 > --- a/drivers/dma/sh/rcar-dmac.c > +++ b/drivers/dma/sh/rcar-dmac.c > @@ -1264,8 +1264,17 @@ static unsigned int rcar_dmac_chan_get_residue(struct rcar_dmac_chan *chan, > * If the cookie doesn't correspond to the currently running transfer > * then the descriptor hasn't been processed yet, and the residue is > * equal to the full descriptor size. > + * Also, a client driver is possible to call this function before > + * rcar_dmac_isr_channel_thread() runs. In this case, the "desc.running" > + * will be the next descriptor, and the done list will appear. So, if > + * the argument cookie matches the done list's cookie, we can assume > + * the residue is zero. > */ > if (cookie != desc->async_tx.cookie) { > + list_for_each_entry(desc, &chan->desc.done, node) { > + if (cookie == desc->async_tx.cookie) > + return 0; > + } > list_for_each_entry(desc, &chan->desc.pending, node) { > if (cookie == desc->async_tx.cookie) > return desc->size; > -- > 1.9.1 > -- ~Vinod