From: "Nuno Sá" <noname.nuno@gmail.com>
To: "David Lechner" <dlechner@baylibre.com>,
"Mark Brown" <broonie@kernel.org>,
"Jonathan Cameron" <jic23@kernel.org>,
"Rob Herring" <robh@kernel.org>,
"Krzysztof Kozlowski" <krzk+dt@kernel.org>,
"Conor Dooley" <conor+dt@kernel.org>,
"Nuno Sá" <nuno.sa@analog.com>,
"Uwe Kleine-König" <ukleinek@kernel.org>
Cc: Michael Hennerich <Michael.Hennerich@analog.com>,
Lars-Peter Clausen <lars@metafoo.de>,
David Jander <david@protonic.nl>,
Martin Sperl <kernel@martin.sperl.org>,
linux-spi@vger.kernel.org, devicetree@vger.kernel.org,
linux-kernel@vger.kernel.org, linux-iio@vger.kernel.org,
linux-pwm@vger.kernel.org
Subject: Re: [PATCH RFC v4 11/15] iio: buffer-dmaengine: add devm_iio_dmaengine_buffer_setup_ext2()
Date: Fri, 25 Oct 2024 15:24:58 +0200 [thread overview]
Message-ID: <1f4156e8c6c4da09fc5d72661d1e002ae6ee4f31.camel@gmail.com> (raw)
In-Reply-To: <20241023-dlech-mainline-spi-engine-offload-2-v4-11-f8125b99f5a1@baylibre.com>
I still need to look better at this but I do have one though already :)
On Wed, 2024-10-23 at 15:59 -0500, David Lechner wrote:
> Add a new devm_iio_dmaengine_buffer_setup_ext2() function to handle
> cases where the DMA channel is managed by the caller rather than being
> requested and released by the iio_dmaengine module.
>
> Signed-off-by: David Lechner <dlechner@baylibre.com>
> ---
>
> v4 changes:
> * This replaces "iio: buffer-dmaengine: generalize requesting DMA channel"
> ---
> drivers/iio/buffer/industrialio-buffer-dmaengine.c | 107 +++++++++++++++------
> include/linux/iio/buffer-dmaengine.h | 5 +
> 2 files changed, 81 insertions(+), 31 deletions(-)
>
> diff --git a/drivers/iio/buffer/industrialio-buffer-dmaengine.c
> b/drivers/iio/buffer/industrialio-buffer-dmaengine.c
> index 054af21dfa65..602cb2e147a6 100644
> --- a/drivers/iio/buffer/industrialio-buffer-dmaengine.c
> +++ b/drivers/iio/buffer/industrialio-buffer-dmaengine.c
> @@ -33,6 +33,7 @@ struct dmaengine_buffer {
> struct iio_dma_buffer_queue queue;
>
> struct dma_chan *chan;
> + bool owns_chan;
> struct list_head active;
>
> size_t align;
> @@ -216,28 +217,23 @@ static const struct iio_dev_attr
> *iio_dmaengine_buffer_attrs[] = {
> * Once done using the buffer iio_dmaengine_buffer_free() should be used to
> * release it.
> */
> -static struct iio_buffer *iio_dmaengine_buffer_alloc(struct device *dev,
> - const char *channel)
> +static struct iio_buffer *iio_dmaengine_buffer_alloc(struct dma_chan *chan,
> + bool owns_chan)
> {
> struct dmaengine_buffer *dmaengine_buffer;
> unsigned int width, src_width, dest_width;
> struct dma_slave_caps caps;
> - struct dma_chan *chan;
> int ret;
>
> dmaengine_buffer = kzalloc(sizeof(*dmaengine_buffer), GFP_KERNEL);
> - if (!dmaengine_buffer)
> - return ERR_PTR(-ENOMEM);
> -
> - chan = dma_request_chan(dev, channel);
> - if (IS_ERR(chan)) {
> - ret = PTR_ERR(chan);
> - goto err_free;
> + if (!dmaengine_buffer) {
> + ret = -ENOMEM;
> + goto err_release;
> }
>
> ret = dma_get_slave_caps(chan, &caps);
> if (ret < 0)
> - goto err_release;
> + goto err_free;
>
> /* Needs to be aligned to the maximum of the minimums */
> if (caps.src_addr_widths)
> @@ -252,6 +248,7 @@ static struct iio_buffer *iio_dmaengine_buffer_alloc(struct
> device *dev,
>
> INIT_LIST_HEAD(&dmaengine_buffer->active);
> dmaengine_buffer->chan = chan;
> + dmaengine_buffer->owns_chan = owns_chan;
> dmaengine_buffer->align = width;
> dmaengine_buffer->max_size = dma_get_max_seg_size(chan->device->dev);
>
> @@ -263,10 +260,12 @@ static struct iio_buffer *iio_dmaengine_buffer_alloc(struct
> device *dev,
>
> return &dmaengine_buffer->queue.buffer;
>
> -err_release:
> - dma_release_channel(chan);
> err_free:
> kfree(dmaengine_buffer);
> +err_release:
> + if (owns_chan)
> + dma_release_channel(chan);
> +
> return ERR_PTR(ret);
> }
>
> @@ -282,12 +281,38 @@ void iio_dmaengine_buffer_free(struct iio_buffer *buffer)
> iio_buffer_to_dmaengine_buffer(buffer);
>
> iio_dma_buffer_exit(&dmaengine_buffer->queue);
> - dma_release_channel(dmaengine_buffer->chan);
> -
> iio_buffer_put(buffer);
> +
> + if (dmaengine_buffer->owns_chan)
> + dma_release_channel(dmaengine_buffer->chan);
Not sure if I agree much with this owns_chan flag. The way I see it, we should always
handover the lifetime of the DMA channel to the IIO DMA framework. Note that even the
device you pass in for both requesting the channel of the spi_offload and for
setting up the DMA buffer is the same (and i suspect it will always be) so I would
not go with the trouble. And with this assumption we could simplify a bit more the
spi implementation.
And not even related but I even suspect the current implementation could be
problematic. Basically I'm suspecting that the lifetime of the DMA channel should be
attached to the lifetime of the iio_buffer. IOW, we should only release the channel
in iio_dmaengine_buffer_release() - in which case the current implementation with the
spi_offload would also be buggy.
But bah, the second point is completely theoretical and likely very hard to reproduce
in real life (if reproducible at all - for now it's only something I suspect)
- Nuno Sá
next prev parent reply other threads:[~2024-10-25 13:25 UTC|newest]
Thread overview: 59+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-10-23 20:59 [PATCH RFC v4 00/15] spi: axi-spi-engine: add offload support David Lechner
2024-10-23 20:59 ` [PATCH RFC v4 01/15] pwm: core: export pwm_get_state_hw() David Lechner
2024-10-29 8:05 ` Uwe Kleine-König
2024-10-29 15:30 ` David Lechner
2024-10-23 20:59 ` [PATCH RFC v4 02/15] spi: add basic support for SPI offloading David Lechner
2024-10-24 13:27 ` Nuno Sá
2024-10-24 14:49 ` David Lechner
2024-10-25 12:59 ` Nuno Sá
2024-10-25 16:39 ` Nuno Sá
2024-10-26 15:05 ` Jonathan Cameron
2024-11-11 17:14 ` David Lechner
2024-11-11 19:02 ` David Lechner
2024-10-30 15:55 ` Mark Brown
2024-10-23 20:59 ` [PATCH RFC v4 03/15] spi: offload: add support for hardware triggers David Lechner
2024-10-24 14:04 ` Nuno Sá
2024-10-24 15:02 ` David Lechner
2024-10-25 6:29 ` Nuno Sá
2024-10-26 15:14 ` Jonathan Cameron
2024-10-28 13:53 ` Nuno Sá
2024-10-23 20:59 ` [PATCH RFC v4 04/15] spi: dt-bindings: add trigger-source.yaml David Lechner
2024-10-23 20:59 ` [PATCH RFC v4 05/15] spi: dt-bindings: add PWM SPI offload trigger David Lechner
2024-10-26 15:18 ` Jonathan Cameron
2024-10-27 0:20 ` David Lechner
2024-10-27 20:24 ` Conor Dooley
2024-10-31 18:16 ` Conor Dooley
2024-11-11 17:31 ` David Lechner
2024-10-23 20:59 ` [PATCH RFC v4 06/15] spi: offload-trigger: add PWM trigger driver David Lechner
2024-10-25 12:07 ` Nuno Sá
2024-10-25 16:28 ` David Lechner
2024-10-28 13:47 ` Nuno Sá
2024-10-23 20:59 ` [PATCH RFC v4 07/15] spi: add offload TX/RX streaming APIs David Lechner
2024-10-25 12:24 ` Nuno Sá
2024-10-23 20:59 ` [PATCH RFC v4 08/15] spi: dt-bindings: axi-spi-engine: add SPI offload properties David Lechner
2024-10-25 12:26 ` Nuno Sá
2024-10-23 20:59 ` [PATCH RFC v4 09/15] spi: axi-spi-engine: implement offload support David Lechner
2024-10-25 13:09 ` Nuno Sá
2024-10-25 16:35 ` David Lechner
2024-10-23 20:59 ` [PATCH RFC v4 10/15] iio: buffer-dmaengine: document iio_dmaengine_buffer_setup_ext David Lechner
2024-10-26 15:29 ` Jonathan Cameron
2024-10-23 20:59 ` [PATCH RFC v4 11/15] iio: buffer-dmaengine: add devm_iio_dmaengine_buffer_setup_ext2() David Lechner
2024-10-25 13:24 ` Nuno Sá [this message]
2024-10-25 16:42 ` David Lechner
2024-10-23 20:59 ` [PATCH RFC v4 12/15] iio: adc: ad7944: don't use storagebits for sizing David Lechner
2024-10-23 20:59 ` [PATCH RFC v4 13/15] iio: adc: ad7944: add support for SPI offload David Lechner
2024-10-26 15:51 ` Jonathan Cameron
2024-10-23 20:59 ` [PATCH RFC v4 14/15] dt-bindings: iio: adc: adi,ad4695: add SPI offload properties David Lechner
2024-10-23 20:59 ` [PATCH RFC v4 15/15] iio: adc: ad4695: Add support for SPI offload David Lechner
2024-10-26 16:00 ` Jonathan Cameron
2024-10-27 0:01 ` David Lechner
2024-10-27 9:12 ` Jonathan Cameron
2024-10-27 19:52 ` David Lechner
2024-10-28 16:39 ` Jonathan Cameron
2024-10-27 0:05 ` David Lechner
2024-10-27 9:15 ` Jonathan Cameron
2024-10-24 14:12 ` [PATCH RFC v4 00/15] spi: axi-spi-engine: add offload support Nuno Sá
-- strict thread matches above, loose matches on Subject: below --
2024-10-25 18:40 [PATCH RFC v4 11/15] iio: buffer-dmaengine: add devm_iio_dmaengine_buffer_setup_ext2() Nuno Sá
2024-10-26 15:48 ` Jonathan Cameron
2024-10-28 11:08 ` Nuno Sá
2024-10-28 16:35 ` Jonathan Cameron
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=1f4156e8c6c4da09fc5d72661d1e002ae6ee4f31.camel@gmail.com \
--to=noname.nuno@gmail.com \
--cc=Michael.Hennerich@analog.com \
--cc=broonie@kernel.org \
--cc=conor+dt@kernel.org \
--cc=david@protonic.nl \
--cc=devicetree@vger.kernel.org \
--cc=dlechner@baylibre.com \
--cc=jic23@kernel.org \
--cc=kernel@martin.sperl.org \
--cc=krzk+dt@kernel.org \
--cc=lars@metafoo.de \
--cc=linux-iio@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pwm@vger.kernel.org \
--cc=linux-spi@vger.kernel.org \
--cc=nuno.sa@analog.com \
--cc=robh@kernel.org \
--cc=ukleinek@kernel.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).