All of lore.kernel.org
 help / color / mirror / Atom feed
From: Javi Merino <javi.merino@arm.com>
To: Thomas Abraham <thomas.abraham@linaro.org>
Cc: "linux-arm-kernel@lists.infradead.org"
	<linux-arm-kernel@lists.infradead.org>,
	"jassisinghbrar@gmail.com" <jassisinghbrar@gmail.com>,
	Jassi Brar <jassi.brar@samsung.com>,
	linux-samsung-soc <linux-samsung-soc@vger.kernel.org>
Subject: Re: [PATCH v2] ARM: pl330: Fix a race condition
Date: Mon, 07 Nov 2011 10:48:58 +0000	[thread overview]
Message-ID: <4EB7B79A.2020004@arm.com> (raw)
In-Reply-To: <CAJuYYwTXf-XU0fdGT0+sggN-MEY3v7UHkfjNkM4+QUW464J9Ew@mail.gmail.com>

On 05/11/11 19:05, Thomas Abraham wrote:
> Hi Javi,
> 
> On 6 October 2011 05:10, Javi Merino <javi.merino@arm.com> wrote:
>> If two requests have been submitted and one of them is running, if you
>> call pl330_chan_ctrl(ch_id, PL330_OP_START), there's a window of time
>> between the spin_lock_irqsave() and the _state() check in which the
>> running transaction may finish.  In that case, we don't receive the
>> interrupt (because they are disabled), but _start() sees that the DMA
>> is stopped, so it starts it.  The problem is that it sends the
>> transaction that has just finished again, because pl330_update()
>> hasn't mark it as done yet.
>>
>> This patch fixes this race condition by not calling _start() if the
>> DMA is already executing transactions.  When interrupts are reenabled,
>> pl330_update() will call _start().
>>
>> Signed-off-by: Javi Merino <javi.merino@arm.com>
>> Acked-by: Jassi Brar <jassi.brar@samsung.com>
>> ---
>>  arch/arm/common/pl330.c |    2 +-
>>  1 files changed, 1 insertions(+), 1 deletions(-)
>>
>> diff --git a/arch/arm/common/pl330.c b/arch/arm/common/pl330.c
>> index 97912fa..7129cfb 100644
>> --- a/arch/arm/common/pl330.c
>> +++ b/arch/arm/common/pl330.c
>> @@ -1546,7 +1546,7 @@ int pl330_chan_ctrl(void *ch_id, enum pl330_chan_op op)
>>
>>                /* Start the next */
>>        case PL330_OP_START:
>> -               if (!_start(thrd))
>> +               if (!_thrd_active(thrd) && !_start(thrd))
>>                        ret = -EIO;
>>                break;
> 
> On Samsung's Exynos4 platform, while testing audio playback with i2s
> interface, the above change causes the playback to freeze. The
> _thrd_active(thrd) call always returns '1' and hence _start(thrd) is
> not getting called.

If _thrd_active(thrd) returns '1', that means there is an active
transfer still running or, if it has finished, you haven't called
pl330_update() to acknowledge that.  pl330_update() calls _start() as
soon as it can.

drivers/dma/pl330.c registers the irq handler in pl330_probe(), so when
the transaction finishes, pl330_update() should clear it and call
_start().  If there is any outstanding transaction, it should start
straight away. If there isn't, it would mark the channel as free, so
_thrd_active() should return '0'.  If _thrd_active() is still '1', then
something has gone wrong in the way.

Does this shed some light?

Cheers,
Javi

WARNING: multiple messages have this Message-ID (diff)
From: javi.merino@arm.com (Javi Merino)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v2] ARM: pl330: Fix a race condition
Date: Mon, 07 Nov 2011 10:48:58 +0000	[thread overview]
Message-ID: <4EB7B79A.2020004@arm.com> (raw)
In-Reply-To: <CAJuYYwTXf-XU0fdGT0+sggN-MEY3v7UHkfjNkM4+QUW464J9Ew@mail.gmail.com>

On 05/11/11 19:05, Thomas Abraham wrote:
> Hi Javi,
> 
> On 6 October 2011 05:10, Javi Merino <javi.merino@arm.com> wrote:
>> If two requests have been submitted and one of them is running, if you
>> call pl330_chan_ctrl(ch_id, PL330_OP_START), there's a window of time
>> between the spin_lock_irqsave() and the _state() check in which the
>> running transaction may finish.  In that case, we don't receive the
>> interrupt (because they are disabled), but _start() sees that the DMA
>> is stopped, so it starts it.  The problem is that it sends the
>> transaction that has just finished again, because pl330_update()
>> hasn't mark it as done yet.
>>
>> This patch fixes this race condition by not calling _start() if the
>> DMA is already executing transactions.  When interrupts are reenabled,
>> pl330_update() will call _start().
>>
>> Signed-off-by: Javi Merino <javi.merino@arm.com>
>> Acked-by: Jassi Brar <jassi.brar@samsung.com>
>> ---
>>  arch/arm/common/pl330.c |    2 +-
>>  1 files changed, 1 insertions(+), 1 deletions(-)
>>
>> diff --git a/arch/arm/common/pl330.c b/arch/arm/common/pl330.c
>> index 97912fa..7129cfb 100644
>> --- a/arch/arm/common/pl330.c
>> +++ b/arch/arm/common/pl330.c
>> @@ -1546,7 +1546,7 @@ int pl330_chan_ctrl(void *ch_id, enum pl330_chan_op op)
>>
>>                /* Start the next */
>>        case PL330_OP_START:
>> -               if (!_start(thrd))
>> +               if (!_thrd_active(thrd) && !_start(thrd))
>>                        ret = -EIO;
>>                break;
> 
> On Samsung's Exynos4 platform, while testing audio playback with i2s
> interface, the above change causes the playback to freeze. The
> _thrd_active(thrd) call always returns '1' and hence _start(thrd) is
> not getting called.

If _thrd_active(thrd) returns '1', that means there is an active
transfer still running or, if it has finished, you haven't called
pl330_update() to acknowledge that.  pl330_update() calls _start() as
soon as it can.

drivers/dma/pl330.c registers the irq handler in pl330_probe(), so when
the transaction finishes, pl330_update() should clear it and call
_start().  If there is any outstanding transaction, it should start
straight away. If there isn't, it would mark the channel as free, so
_thrd_active() should return '0'.  If _thrd_active() is still '1', then
something has gone wrong in the way.

Does this shed some light?

Cheers,
Javi

  reply	other threads:[~2011-11-07 10:49 UTC|newest]

Thread overview: 57+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-09-19 17:11 [PATCH] ARM: pl330: Fix a race condition Javi Merino
2011-09-19 18:07 ` Jassi Brar
2011-09-20 13:36   ` Javi Merino
2011-10-05 12:57     ` Javi Merino
2011-10-06  9:10       ` [PATCH v2] " Javi Merino
2011-11-05 19:05         ` Thomas Abraham
2011-11-05 19:05           ` Thomas Abraham
2011-11-07 10:48           ` Javi Merino [this message]
2011-11-07 10:48             ` Javi Merino
2011-11-07 11:03             ` Thomas Abraham
2011-11-07 11:03               ` Thomas Abraham
2011-11-28  8:23             ` Boojin Kim
2011-11-28  8:23               ` Boojin Kim
2011-11-28 16:36               ` Javi Merino
2011-11-28 16:36                 ` Javi Merino
2011-11-29  3:41                 ` Boojin Kim
2011-11-29  3:41                   ` Boojin Kim
2011-11-29  9:53                   ` Javi Merino
2011-11-29  9:53                     ` Javi Merino
2011-11-29 10:37                     ` Jassi Brar
2011-11-29 10:37                       ` Jassi Brar
2011-12-07  7:52                       ` Kukjin Kim
2011-12-07  7:52                         ` Kukjin Kim
2011-12-07 10:01                         ` Javi Merino
2011-12-07 10:01                           ` Javi Merino
2011-12-07 20:54                           ` Javi Merino
2011-12-07 20:54                             ` Javi Merino
2011-12-09 11:58                             ` Javi Merino
2011-12-09 11:58                               ` Javi Merino
2011-12-09 13:04                               ` Jassi Brar
2011-12-09 13:04                                 ` Jassi Brar
2011-12-09 13:41                                 ` Javi Merino
2011-12-09 13:41                                   ` Javi Merino
2011-12-09 14:15                                   ` Jassi Brar
2011-12-09 14:15                                     ` Jassi Brar
2011-12-09 14:52                                     ` Javi Merino
2011-12-09 14:52                                       ` Javi Merino
2011-12-09 16:50                                       ` Jassi Brar
2011-12-09 16:50                                         ` Jassi Brar
2011-12-09 19:50                                         ` Javi Merino
2011-12-09 19:50                                           ` Javi Merino
2011-12-11 10:51                                           ` Jassi Brar
2011-12-11 10:51                                             ` Jassi Brar
2011-12-11 15:09                                             ` Javi Merino
2011-12-11 15:09                                               ` Javi Merino
2011-12-11 17:10                                               ` Jassi Brar
2011-12-11 17:10                                                 ` Jassi Brar
2011-12-11 17:42                                                 ` Javi Merino
2011-12-11 17:42                                                   ` Javi Merino
2011-12-11 19:27                                                   ` [PATCH] ARM: PL330: Fix driver freeze Javi Merino
2011-12-11 19:27                                                     ` Javi Merino
2011-12-15 17:48                                                     ` Javi Merino
2011-12-15 17:48                                                       ` Javi Merino
2011-12-16  9:01                                                       ` Tushar Behera
2011-12-16  9:01                                                         ` Tushar Behera
2011-12-16  6:27                                                     ` Jassi Brar
2011-12-16  6:27                                                       ` Jassi Brar

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4EB7B79A.2020004@arm.com \
    --to=javi.merino@arm.com \
    --cc=jassi.brar@samsung.com \
    --cc=jassisinghbrar@gmail.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-samsung-soc@vger.kernel.org \
    --cc=thomas.abraham@linaro.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.