public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Russell King - ARM Linux <linux@arm.linux.org.uk>
To: Linus Walleij <linus.ml.walleij@gmail.com>
Cc: Dan Williams <dan.j.williams@intel.com>,
	Viresh Kumar <viresh.kumar@st.com>,
	Kukjin Kim <kgene.kim@samsung.com>,
	yuanyabin1978@sina.com, linux-kernel@vger.kernel.org,
	Ben Dooks <ben-linux@fluff.org>,
	Peter Pearse <peter.pearse@arm.com>,
	linux-arm-kernel@lists.infradead.org,
	Alessandro Rubini <rubini@unipv.it>
Subject: Re: [PATCH 06/13] DMAENGINE: driver for the ARM PL080/PL081 PrimeCells
Date: Thu, 23 Dec 2010 12:30:28 +0000	[thread overview]
Message-ID: <20101223123028.GI3636@n2100.arm.linux.org.uk> (raw)
In-Reply-To: <AANLkTinOMOkY6AUW8Z6FWMMWU9u0_sNjA2r_31u9-A8v@mail.gmail.com>

On Thu, Dec 23, 2010 at 09:17:07AM +0100, Linus Walleij wrote:
> 2010/12/23 Dan Williams <dan.j.williams@intel.com>:
> > It looks like this driver needs a full scrub
> > which seems unreasonable to complete and test over the holidays before
> > .37 lands.  Linus we either need to mark this "depends on BROKEN" or
> > revert it.
> 
> Isn't it really as simple as to release the spinlock during callbacks?
> That lock is only intended to protect the plchan variables, not to block
> anyone from queueing new stuff during the callback (as happens now).
> 
> It can release that lock, make a callback where a new descriptor
> gets queued, and then take it again and start looking at the queue,
> at which point it discovers the new desc and process it.

Is it actually safe to do this?  The answer seems to be no - if we happen
to terminate all transfers (as your PL011 uart code does) when we fail to
setup a new DMA transaction, then bad stuff happens due to this:

                /*
                 * Device callbacks should NOT clear
                 * the current transaction on the channel
                 * Linus: sometimes they should?
                 */
                if (!plchan->at)
                        BUG();

We really need a saner approach here - maybe the list approach described
by Jassie.

> diff --git a/drivers/dma/amba-pl08x.c b/drivers/dma/amba-pl08x.c
> index b605cc9..7879a22 100644
> --- a/drivers/dma/amba-pl08x.c
> +++ b/drivers/dma/amba-pl08x.c
> @@ -1651,8 +1651,11 @@ static void pl08x_tasklet(unsigned long data)
>  		/*
>  		 * Callback to signal completion
>  		 */
> -		if (callback)
> -			callback(callback_param);
> +		if (callback) {
> +                        spin_unlock(&plchan->lock);
> +                        callback(callback_param);
> +                        spin_lock(&plchan->lock);

Plus, of course, that tasklets run with IRQs enabled.  This means we're
taking this spinlock in an interruptible context.  If we have some other
path which also takes this lock from an IRQ context, then we're asking
for deadlock.  See my previous mails on this subject.

I'm currently splitting my dirty patch, and attacking this driver to
clean up some of it into a more reasonable shape, so this is one area
which I'm going to be sorting out.

Patches later.

  parent reply	other threads:[~2010-12-23 12:31 UTC|newest]

Thread overview: 48+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-06-11 15:27 [PATCH 06/13] DMAENGINE: driver for the ARM PL080/PL081 PrimeCells Linus Walleij
2010-06-14  6:02 ` Viresh KUMAR
2010-06-14 13:39   ` Linus Walleij
2010-06-15  5:25     ` Viresh KUMAR
2010-06-15 20:14       ` Linus WALLEIJ
2010-06-16  3:59         ` Viresh KUMAR
2010-06-16  6:38           ` Linus Walleij
2010-06-15 10:25 ` Kukjin Kim
2010-06-15 10:45   ` Jassi Brar
2010-06-15 11:17     ` Maurus Cuelenaere
2010-06-15 11:39       ` Jassi Brar
2010-06-15 12:04         ` Maurus Cuelenaere
2010-06-15 20:55     ` Linus WALLEIJ
2010-12-21 18:20 ` Russell King - ARM Linux
2010-12-21 22:25   ` Russell King - ARM Linux
2010-12-22 12:22   ` Russell King - ARM Linux
2010-12-22 12:29   ` Russell King - ARM Linux
2010-12-22 23:45     ` Dan Williams
2010-12-22 23:54       ` Russell King - ARM Linux
2010-12-23  0:53         ` Dan Williams
2010-12-23  0:10       ` Russell King - ARM Linux
2010-12-23  1:11         ` Dan Williams
2010-12-23  1:31           ` Dan Williams
2010-12-31 21:50             ` Russell King - ARM Linux
2011-01-02  9:42               ` Dan Williams
2011-01-02 11:22                 ` Russell King - ARM Linux
2011-01-02 20:33               ` Linus Walleij
2011-01-03 11:14                 ` Russell King - ARM Linux
2010-12-23  9:18           ` Russell King - ARM Linux
2010-12-23  8:17       ` Linus Walleij
2010-12-23  8:30         ` Jassi Brar
2010-12-23 12:30         ` Russell King - ARM Linux [this message]
2010-12-28  0:33           ` Linus Walleij
2011-01-01 15:15       ` Russell King - ARM Linux
2011-01-02 20:29         ` Linus Walleij
2014-03-10 13:56         ` David Woodhouse
2014-03-10 14:11           ` Arnd Bergmann
2014-03-10 14:27             ` David Woodhouse
2014-03-10 14:40               ` Arnd Bergmann
2014-03-10 14:32           ` Russell King - ARM Linux
2014-03-10 14:52             ` David Woodhouse
2014-03-13  8:17               ` Linus Walleij
2014-03-13  8:52                 ` Arnd Bergmann
2014-03-13 14:35                   ` Linus Walleij
2011-01-01 15:36       ` Russell King - ARM Linux
2011-01-03 15:19       ` Russell King - ARM Linux
2011-01-04  0:41         ` Jassi Brar
2011-01-04 10:47         ` Linus Walleij

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=20101223123028.GI3636@n2100.arm.linux.org.uk \
    --to=linux@arm.linux.org.uk \
    --cc=ben-linux@fluff.org \
    --cc=dan.j.williams@intel.com \
    --cc=kgene.kim@samsung.com \
    --cc=linus.ml.walleij@gmail.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=peter.pearse@arm.com \
    --cc=rubini@unipv.it \
    --cc=viresh.kumar@st.com \
    --cc=yuanyabin1978@sina.com \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox