mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Russell King - ARM Linux <linux@arm.linux.org.uk>
To: Linus Walleij <linus.walleij@stericsson.com>
Cc: Dan Williams <dan.j.williams@intel.com>,
	linux-arm-kernel@lists.infradead.org, yuanyabin1978@sina.com,
	Viresh Kumar <viresh.kumar@st.com>,
	Kukjin Kim <kgene.kim@samsung.com>,
	linux-kernel@vger.kernel.org, Ben Dooks <ben-linux@fluff.org>,
	Peter Pearse <peter.pearse@arm.com>,
	Alessandro Rubini <rubini@unipv.it>
Subject: Re: [PATCH 06/13] DMAENGINE: driver for the ARM PL080/PL081 PrimeCells
Date: Tue, 21 Dec 2010 18:20:37 +0000	[thread overview]
Message-ID: <20101221182037.GA4783@n2100.arm.linux.org.uk> (raw)
In-Reply-To: <1276270031-1607-1-git-send-email-linus.walleij@stericsson.com>

Having just looked at this while trying to undo the DMA API abuses
in the PL011 UART driver, I'm getting rather frustrated with this
code.

What's wrong with the PL08x DMA engine driver?  Well, in the PL011
UART driver, you do this:

+static void pl011_dma_tx_callback(void *data)
+{
...
+       /* Refill the TX if the buffer is not empty */
+       if (!uart_circ_empty(xmit)) {
+               ret = pl011_dma_tx_refill(uap);
...
+static int pl011_dma_tx_refill(struct uart_amba_port *uap)
+{
...
+       /* Prepare the scatterlist */
+       desc = chan->device->device_prep_slave_sg(chan,
+                                                 &dmatx->scatter,
+                                                 1,
+                                                 DMA_TO_DEVICE,
+                                                 DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
...
+       /* Some data to go along to the callback */
+       desc->callback = pl011_dma_tx_callback;
+       desc->callback_param = uap;

Note that this calls the channel device_prep_slave_sg() from the
callback.  This seems reasonable.

Right, now let's look at this driver (from the latest kernel):

static void pl08x_tasklet(unsigned long data)
{
...
        spin_lock(&plchan->lock);
...
                dma_async_tx_callback callback =
                        plchan->at->tx.callback;
                void *callback_param =
                        plchan->at->tx.callback_param;
...
                /*
                 * Callback to signal completion
                 */
                if (callback)
                        callback(callback_param);

Note that the callback is called with the channel lock held.

struct dma_async_tx_descriptor *pl08x_prep_slave_sg(
                struct dma_chan *chan, struct scatterlist *sgl,
                unsigned int sg_len, enum dma_data_direction direction,
                unsigned long flags)
{
...
        ret = pl08x_prep_channel_resources(plchan, txd);
        if (ret)
                return NULL;
        /*
         * NB: the channel lock is held at this point so tx_submit()
         * must be called in direct succession.
         */

XXXXXXXX DEADLOCK XXXXXXXX

Has anyone reviewed the locking in the AMBA PL08x DMA driver?

It also seems to do nothing with the DMA_COMPL_* flags - it's unclear
whether it should, but if a user were to specify one of these flags
and the DMA engine driver ignored it, things would get stuffed as far
as the DMA API goes.

These seem to be some really basic errors - and as such I'm far from
happy with even attempting to use this driver to the point that I'm
thinking about starting again with it.

  parent reply	other threads:[~2010-12-21 18:21 UTC|newest]

Thread overview: 48+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-06-11 15:27 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 [this message]
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
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=20101221182037.GA4783@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.walleij@stericsson.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

all inboxes | Powered by JetHome®