All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andy Green <andy@warmcat.com>
To: John Stultz <john.stultz@linaro.org>, zhangfei <zhangfei.gao@linaro.org>
Cc: lkml <linux-kernel@vger.kernel.org>,
	Jingoo Han <jg1.han@samsung.com>,
	Krzysztof Kozlowski <k.kozlowski@samsung.com>,
	Maxime Ripard <maxime.ripard@free-electrons.com>,
	Vinod Koul <vinod.koul@intel.com>,
	Dan Williams <dan.j.williams@intel.com>,
	Mark Brown <broonie@kernel.org>
Subject: Re: [PATCH 6/7] k3dma: Fix occasional DMA ERR issue by using proper dma api
Date: Thu, 21 Jul 2016 14:27:02 +0800	[thread overview]
Message-ID: <B261DC34-8E64-4B49-B826-B425799B94D9@warmcat.com> (raw)
In-Reply-To: <CALAqxLW5wg7Jcyw70+PChrY26Ydfy++K3oq_6ZoxSjqM_CKqsw@mail.gmail.com>



On July 21, 2016 1:22:02 PM GMT+08:00, John Stultz <john.stultz@linaro.org> wrote:
>On Wed, Jul 20, 2016 at 9:26 PM, zhangfei <zhangfei.gao@linaro.org>
>wrote:
>>
>>
>> On 07/21/2016 11:53 AM, John Stultz wrote:
>>>
>>> After lots of debugging on an occasional DMA ERR issue, I realized
>>> that the desc structures which we point the dma hardware are being
>>> allocated out of regular memory. This means when we fill the desc
>>> structures, that data doesn't always get flushed out to memory by
>>> the time we start the dma transfer, resulting in the dma engine
>getting
>>> some null values, resulting in a DMA ERR on the first irq.
>>
>>
>> How about using wmb() flush before start dma to sync desc?
>
>So I'm not going to pretend to be an expert here, but my understanding
>is that wmb() syncrhonizes cpu write ordering operations across cpus,

IIUI what the memory barrier does is tell the *compiler* to actually do any writes that the code asked for, but which otherwise might actually be deferred past that point.  The compiler doesn't know that buffer area has other hardware snooping it, so by default it feels it can play tricks with what seems to it like just generally deferring spilling registers to memory.  wmb makes sure the compiler's pending writes actually happen right there.  (writel() etc definitions have one built-in, so they always do what you asked when you asked).

That can be of interest when syncing with other cores but also to other IPs that intend to use the written-to area immediately, which is what's happening here.  Without the barrier the write may not be issued anywhere, even to local cpu cache, until after the hw is asked to go read the buffer, corrupting what the hw sees.

>so the cpus see all the changes before the wmb() before they see any
>changes after.  But I'm not sure what effect wmb() has across cpu
>cache to device ordering.   I don't think it works as a cache flush to
>memory.
>
>Andy's patch introducing the cyclic support actually had a wmb() in it
>that I removed as I couldn't understand clearly why it was there (and
>there wasn't a comment explaining, as required by checkpatch :).   But
>even with that wmb(), the DMA ERR was still seen.

The rule about the comment is there partially because there's a general tendancy for throwing voodoo smbs on broken things in case it helps.  But writing out memory descriptors that other hw is going to read is a legit use for it I think.  If the compiler you use wasn't deferring the write, you won't notice any difference removing it, but that doesn't mean it shouldn't be there.

>Only with these two new changes have I gotten to the point where I
>can't seem to trigger the DMA error.

Sounds good...

-Andy

>thanks
>-john

  reply	other threads:[~2016-07-21  6:27 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-07-21  3:53 [PATCH 0/7 v3] K3DMA fixes for HiKey HDMI audio John Stultz
2016-07-21  3:53 ` [PATCH 1/7] k3dma: Fix hisi burst clipping John Stultz
2016-07-24  7:25   ` Vinod Koul
2016-07-29 22:40     ` John Stultz
2016-08-04 13:08       ` Vinod Koul
2016-08-04 17:36         ` John Stultz
2016-08-05  3:36           ` Vinod Koul
2016-07-21  3:53 ` [PATCH 2/7] k3dma: Fix dma err offsets John Stultz
2016-07-21  3:53 ` [PATCH 3/7] k3dma: Fix "nobody cared" message seen on any error John Stultz
2016-07-21  3:53 ` [PATCH 4/7] k3dma: Add cyclic mode for audio John Stultz
2016-07-24  7:31   ` Vinod Koul
2016-07-29 22:38     ` John Stultz
2016-07-21  3:53 ` [PATCH 5/7] k3dma: Fix memory handling with cyclic mode John Stultz
2016-07-21  3:53 ` [PATCH 6/7] k3dma: Fix occasional DMA ERR issue by using proper dma api John Stultz
2016-07-21  4:26   ` zhangfei
2016-07-21  5:22     ` John Stultz
2016-07-21  6:27       ` Andy Green [this message]
2016-07-21 10:40         ` Mark Brown
2016-07-21 13:12           ` Andy Green
2016-07-21 16:18         ` John Stultz
2016-07-21 19:57           ` Andy Green
2016-07-21 16:08       ` zhangfei
2016-07-21  3:53 ` [PATCH 7/7] Kconfig: Allow k3dma driver to be selected for more then HISI3xx platforms John Stultz
2016-07-22  6:56   ` kbuild test robot

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=B261DC34-8E64-4B49-B826-B425799B94D9@warmcat.com \
    --to=andy@warmcat.com \
    --cc=broonie@kernel.org \
    --cc=dan.j.williams@intel.com \
    --cc=jg1.han@samsung.com \
    --cc=john.stultz@linaro.org \
    --cc=k.kozlowski@samsung.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=maxime.ripard@free-electrons.com \
    --cc=vinod.koul@intel.com \
    --cc=zhangfei.gao@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.