diff mbox series

iio: buffer-dmaengine: adjust `bytes_used` with residue info

Message ID 20200826052011.13348-1-lars@metafoo.de
State New
Headers show
Series iio: buffer-dmaengine: adjust `bytes_used` with residue info | expand

Commit Message

Lars-Peter Clausen Aug. 26, 2020, 5:20 a.m. UTC
From: Alexandru Ardelean <alexandru.ardelean@analog.com>

A transfer may fall shorter than the bytes in the block.
This information is available in the residue from the DMA engine, so we can
compute actual `bytes_used` with that by subtracting the residue.

Signed-off-by: Alexandru Ardelean <alexandru.ardelean@analog.com>
Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
---
 drivers/iio/buffer/industrialio-buffer-dmaengine.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

Comments

Alexandru Ardelean Aug. 26, 2020, 6:36 a.m. UTC | #1
On Wed, Aug 26, 2020 at 8:22 AM Lars-Peter Clausen <lars@metafoo.de> wrote:
>
> From: Alexandru Ardelean <alexandru.ardelean@analog.com>
>
> A transfer may fall shorter than the bytes in the block.
> This information is available in the residue from the DMA engine, so we can
> compute actual `bytes_used` with that by subtracting the residue.
>

This was in my pipeline as well [obviously].
Thanks :)

> Signed-off-by: Alexandru Ardelean <alexandru.ardelean@analog.com>
> Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
> ---
>  drivers/iio/buffer/industrialio-buffer-dmaengine.c | 6 ++++--
>  1 file changed, 4 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/iio/buffer/industrialio-buffer-dmaengine.c b/drivers/iio/buffer/industrialio-buffer-dmaengine.c
> index 6dedf12b69a4..5789bda0745b 100644
> --- a/drivers/iio/buffer/industrialio-buffer-dmaengine.c
> +++ b/drivers/iio/buffer/industrialio-buffer-dmaengine.c
> @@ -45,7 +45,8 @@ static struct dmaengine_buffer *iio_buffer_to_dmaengine_buffer(
>         return container_of(buffer, struct dmaengine_buffer, queue.buffer);
>  }
>
> -static void iio_dmaengine_buffer_block_done(void *data)
> +static void iio_dmaengine_buffer_block_done(void *data,
> +               const struct dmaengine_result *result)
>  {
>         struct iio_dma_buffer_block *block = data;
>         unsigned long flags;
> @@ -53,6 +54,7 @@ static void iio_dmaengine_buffer_block_done(void *data)
>         spin_lock_irqsave(&block->queue->list_lock, flags);
>         list_del(&block->head);
>         spin_unlock_irqrestore(&block->queue->list_lock, flags);
> +       block->bytes_used -= result->residue;
>         iio_dma_buffer_block_done(block);
>  }
>
> @@ -74,7 +76,7 @@ static int iio_dmaengine_buffer_submit_block(struct iio_dma_buffer_queue *queue,
>         if (!desc)
>                 return -ENOMEM;
>
> -       desc->callback = iio_dmaengine_buffer_block_done;
> +       desc->callback_result = iio_dmaengine_buffer_block_done;
>         desc->callback_param = block;
>
>         cookie = dmaengine_submit(desc);
> --
> 2.20.1
>
Jonathan Cameron Aug. 29, 2020, 3:51 p.m. UTC | #2
On Wed, 26 Aug 2020 09:36:39 +0300
Alexandru Ardelean <ardeleanalex@gmail.com> wrote:

> On Wed, Aug 26, 2020 at 8:22 AM Lars-Peter Clausen <lars@metafoo.de> wrote:
> >
> > From: Alexandru Ardelean <alexandru.ardelean@analog.com>
> >
> > A transfer may fall shorter than the bytes in the block.
> > This information is available in the residue from the DMA engine, so we can
> > compute actual `bytes_used` with that by subtracting the residue.
> >  
> 
> This was in my pipeline as well [obviously].
> Thanks :)
> 
> > Signed-off-by: Alexandru Ardelean <alexandru.ardelean@analog.com>
> > Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>

"smells" like a fix.  Is it?  Or are we looking at something that
only matters for some future hardware, or an optmization?

If it's a fix, where is the fixes tag?

Thanks, 

Jonathan

> > ---
> >  drivers/iio/buffer/industrialio-buffer-dmaengine.c | 6 ++++--
> >  1 file changed, 4 insertions(+), 2 deletions(-)
> >
> > diff --git a/drivers/iio/buffer/industrialio-buffer-dmaengine.c b/drivers/iio/buffer/industrialio-buffer-dmaengine.c
> > index 6dedf12b69a4..5789bda0745b 100644
> > --- a/drivers/iio/buffer/industrialio-buffer-dmaengine.c
> > +++ b/drivers/iio/buffer/industrialio-buffer-dmaengine.c
> > @@ -45,7 +45,8 @@ static struct dmaengine_buffer *iio_buffer_to_dmaengine_buffer(
> >         return container_of(buffer, struct dmaengine_buffer, queue.buffer);
> >  }
> >
> > -static void iio_dmaengine_buffer_block_done(void *data)
> > +static void iio_dmaengine_buffer_block_done(void *data,
> > +               const struct dmaengine_result *result)
> >  {
> >         struct iio_dma_buffer_block *block = data;
> >         unsigned long flags;
> > @@ -53,6 +54,7 @@ static void iio_dmaengine_buffer_block_done(void *data)
> >         spin_lock_irqsave(&block->queue->list_lock, flags);
> >         list_del(&block->head);
> >         spin_unlock_irqrestore(&block->queue->list_lock, flags);
> > +       block->bytes_used -= result->residue;
> >         iio_dma_buffer_block_done(block);
> >  }
> >
> > @@ -74,7 +76,7 @@ static int iio_dmaengine_buffer_submit_block(struct iio_dma_buffer_queue *queue,
> >         if (!desc)
> >                 return -ENOMEM;
> >
> > -       desc->callback = iio_dmaengine_buffer_block_done;
> > +       desc->callback_result = iio_dmaengine_buffer_block_done;
> >         desc->callback_param = block;
> >
> >         cookie = dmaengine_submit(desc);
> > --
> > 2.20.1
> >
Lars-Peter Clausen Aug. 29, 2020, 6:30 p.m. UTC | #3
On 8/29/20 5:51 PM, Jonathan Cameron wrote:
> On Wed, 26 Aug 2020 09:36:39 +0300
> Alexandru Ardelean <ardeleanalex@gmail.com> wrote:
>
>> On Wed, Aug 26, 2020 at 8:22 AM Lars-Peter Clausen <lars@metafoo.de> wrote:
>>> From: Alexandru Ardelean <alexandru.ardelean@analog.com>
>>>
>>> A transfer may fall shorter than the bytes in the block.
>>> This information is available in the residue from the DMA engine, so we can
>>> compute actual `bytes_used` with that by subtracting the residue.
>>>   
>> This was in my pipeline as well [obviously].
>> Thanks :)
>>
>>> Signed-off-by: Alexandru Ardelean <alexandru.ardelean@analog.com>
>>> Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
> "smells" like a fix.  Is it?  Or are we looking at something that
> only matters for some future hardware, or an optmization?
>
> If it's a fix, where is the fixes tag?

It's a feature :)

When we first added the IIO DMA buffer support this API did not exist in 
dmaengine. So for the longest time most DMA drivers did not have the 
ability to report short transfers. Primarily because in many cases the 
hardware doesn't even support it.

Now with this patch the IIO DMA buffer implementation supports systems 
where the DMA can generate short transfers.

- Lars
Jonathan Cameron Aug. 30, 2020, 11:10 a.m. UTC | #4
On Sat, 29 Aug 2020 20:30:04 +0200
Lars-Peter Clausen <lars@metafoo.de> wrote:

> On 8/29/20 5:51 PM, Jonathan Cameron wrote:
> > On Wed, 26 Aug 2020 09:36:39 +0300
> > Alexandru Ardelean <ardeleanalex@gmail.com> wrote:
> >  
> >> On Wed, Aug 26, 2020 at 8:22 AM Lars-Peter Clausen <lars@metafoo.de> wrote:  
> >>> From: Alexandru Ardelean <alexandru.ardelean@analog.com>
> >>>
> >>> A transfer may fall shorter than the bytes in the block.
> >>> This information is available in the residue from the DMA engine, so we can
> >>> compute actual `bytes_used` with that by subtracting the residue.
> >>>     
> >> This was in my pipeline as well [obviously].
> >> Thanks :)
> >>  
> >>> Signed-off-by: Alexandru Ardelean <alexandru.ardelean@analog.com>
> >>> Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>  
> > "smells" like a fix.  Is it?  Or are we looking at something that
> > only matters for some future hardware, or an optmization?
> >
> > If it's a fix, where is the fixes tag?  
> 
> It's a feature :)
> 
> When we first added the IIO DMA buffer support this API did not exist in 
> dmaengine. So for the longest time most DMA drivers did not have the 
> ability to report short transfers. Primarily because in many cases the 
> hardware doesn't even support it.
> 
> Now with this patch the IIO DMA buffer implementation supports systems 
> where the DMA can generate short transfers.
Applied to the togreg branch of iio.git and pushed out as testing for
the autobuilders to play with it.

Thanks,

Jonathan

> 
> - Lars
>
diff mbox series

Patch

diff --git a/drivers/iio/buffer/industrialio-buffer-dmaengine.c b/drivers/iio/buffer/industrialio-buffer-dmaengine.c
index 6dedf12b69a4..5789bda0745b 100644
--- a/drivers/iio/buffer/industrialio-buffer-dmaengine.c
+++ b/drivers/iio/buffer/industrialio-buffer-dmaengine.c
@@ -45,7 +45,8 @@  static struct dmaengine_buffer *iio_buffer_to_dmaengine_buffer(
 	return container_of(buffer, struct dmaengine_buffer, queue.buffer);
 }
 
-static void iio_dmaengine_buffer_block_done(void *data)
+static void iio_dmaengine_buffer_block_done(void *data,
+		const struct dmaengine_result *result)
 {
 	struct iio_dma_buffer_block *block = data;
 	unsigned long flags;
@@ -53,6 +54,7 @@  static void iio_dmaengine_buffer_block_done(void *data)
 	spin_lock_irqsave(&block->queue->list_lock, flags);
 	list_del(&block->head);
 	spin_unlock_irqrestore(&block->queue->list_lock, flags);
+	block->bytes_used -= result->residue;
 	iio_dma_buffer_block_done(block);
 }
 
@@ -74,7 +76,7 @@  static int iio_dmaengine_buffer_submit_block(struct iio_dma_buffer_queue *queue,
 	if (!desc)
 		return -ENOMEM;
 
-	desc->callback = iio_dmaengine_buffer_block_done;
+	desc->callback_result = iio_dmaengine_buffer_block_done;
 	desc->callback_param = block;
 
 	cookie = dmaengine_submit(desc);