linux-iio.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* at91-sama5d2_adc crash
@ 2020-09-14 11:30 Eugen.Hristev
  2020-09-14 12:37 ` Alexandru Ardelean
  0 siblings, 1 reply; 4+ messages in thread
From: Eugen.Hristev @ 2020-09-14 11:30 UTC (permalink / raw)
  To: alexandru.ardelean; +Cc: jic23, linux-iio

Hello Alex,

Sorry to disturb but we have issues again with this patch :



f3c034f61775 ("iio: at91-sama5d2_adc: adjust 
iio_triggered_buffer_{predisable,postenable} positions")

I recently discovered a crash when using buffered trigger with DMA with 
this driver:

# echo 100 > /sys/bus/iio/devices/iio\:device0/buffer/length
# echo 100 > /sys/bus/iio/devices/iio\:device0/buffer/watermark
# echo 1 > /sys/bus/iio/devices/iio\:device0/scan_elements/in_voltage4_en
# iio_generic_buffer -n fc030000.adc -t 
fc030000.adc-dev0-external_rising -c 5
iio device number being used is 0
iio trigger number being used is 0
/sys/bus/iio/devicii/iio:device0 fc030000.adc-dev0-external_risingo 
iio:device0: using dma0chan10 for rx DMA transfers

Division by zero in kernel.
CPU: 0 PID: 243 Comm: irq/182-fc03000 Not tainted 5.8.0-rc1 #1
Hardware name: Atmel SAMA5
[<c010caf0>] (unwind_backtrace) from [<c010a034>] (show_stack+0x10/0x14)
[<c010a034>] (show_stack) from [<c03a892c>] (Ldiv0+0x8/0x10)
[<c03a892c>] (Ldiv0) from [<c03a88fc>] (__aeabi_uidivmod+0x8/0x18)
[<c03a88fc>] (__aeabi_uidivmod) from [<c03592d4>] (div_s64_rem+0x3c/0xc4)
[<c03592d4>] (div_s64_rem) from [<c05ed344>] 
(at91_adc_trigger_handler+0xcc/0x494)
[<c05ed344>] (at91_adc_trigger_handler) from [<c014944c>] 
(irq_thread_fn+0x1c/0x78)
[<c014944c>] (irq_thread_fn) from [<c01496dc>] (irq_thread+0x124/0x1d0)
[<c01496dc>] (irq_thread) from [<c01325b4>] (kthread+0x138/0x140)
[<c01325b4>] (kthread) from [<c0100148>] (ret_from_fork+0x14/0x2c)
Exception stack(0xde49dfb0 to 0xde49dff8)
dfa0:                                     00000000 00000000 00000000 
00000000
dfc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
00000000
dfe0: 00000000 00000000 00000000 00000000 00000013 00000000
Division by zero in kernel.
CPU: 0 PID: 243 Comm: irq/182-fc03000 Not tainted 5.8.0-rc1 #1
Hardware name: Atmel SAMA5
[<c010caf0>] (unwind_backtrace) from [<c010a034>] (show_stack+0x10/0x14)
[<c010a034>] (show_stack) from [<c03a7e24>] (Ldiv0_64+0x8/0x18)
[<c03a7e24>] (Ldiv0_64) from [<c0359344>] (div_s64_rem+0xac/0xc4)
[<c0359344>] (div_s64_rem) from [<c05ed360>] 
(at91_adc_trigger_handler+0xe8/0x494)
[<c05ed360>] (at91_adc_trigger_handler) from [<c014944c>] 
(irq_thread_fn+0x1c/0x78)
[<c014944c>] (irq_thread_fn) from [<c01496dc>] (irq_thread+0x124/0x1d0)
[<c01496dc>] (irq_thread) from [<c01325b4>] (kthread+0x138/0x140)
[<c01325b4>] (kthread) from [<c0100148>] (ret_from_fork+0x14/0x2c)
Exception stack(0xde49dfb0 to 0xde49dff8)
dfa0:                                     00000000 00000000 00000000 
00000000
dfc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
00000000
dfe0: 00000000 00000000 00000000 00000000 00000013 00000000
sched: RT throttling activated


It looks like crash is there since 5.8-rc1 introduced by that patch

I looked in the code and it looks something is zero, probably the 
received buffer size. It is likely that the DMA starts too soon before 
the buffer is properly setup ?

Can you help with fixing this ? or you know how we can do it ?
Also could you remind me why we enable and start the DMA on pre-enable 
of the buffer instead of post-enable of the buffer ?
In pre-enable, do we have everything ready inside IIO to be able to 
start the DMA? Or it's better to have it at post-enable time ?

I know you want to ditch the post-enable and pre-disable hooks, but it 
looks this driver needs them, or we need to find a way to make it work 
properly

Thanks !
Eugen

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: at91-sama5d2_adc crash
  2020-09-14 11:30 at91-sama5d2_adc crash Eugen.Hristev
@ 2020-09-14 12:37 ` Alexandru Ardelean
  2020-09-15 16:30   ` Eugen.Hristev
  0 siblings, 1 reply; 4+ messages in thread
From: Alexandru Ardelean @ 2020-09-14 12:37 UTC (permalink / raw)
  To: Eugen.Hristev; +Cc: Alexandru Ardelean, Jonathan Cameron, linux-iio

On Mon, Sep 14, 2020 at 2:33 PM <Eugen.Hristev@microchip.com> wrote:
>
> Hello Alex,
>
> Sorry to disturb but we have issues again with this patch :
>
>

firstly, many apologies for the breakage;

>
> f3c034f61775 ("iio: at91-sama5d2_adc: adjust
> iio_triggered_buffer_{predisable,postenable} positions")
>
> I recently discovered a crash when using buffered trigger with DMA with
> this driver:
>
> # echo 100 > /sys/bus/iio/devices/iio\:device0/buffer/length
> # echo 100 > /sys/bus/iio/devices/iio\:device0/buffer/watermark
> # echo 1 > /sys/bus/iio/devices/iio\:device0/scan_elements/in_voltage4_en
> # iio_generic_buffer -n fc030000.adc -t
> fc030000.adc-dev0-external_rising -c 5
> iio device number being used is 0
> iio trigger number being used is 0
> /sys/bus/iio/devicii/iio:device0 fc030000.adc-dev0-external_risingo
> iio:device0: using dma0chan10 for rx DMA transfers
>
> Division by zero in kernel.
> CPU: 0 PID: 243 Comm: irq/182-fc03000 Not tainted 5.8.0-rc1 #1
> Hardware name: Atmel SAMA5
> [<c010caf0>] (unwind_backtrace) from [<c010a034>] (show_stack+0x10/0x14)
> [<c010a034>] (show_stack) from [<c03a892c>] (Ldiv0+0x8/0x10)
> [<c03a892c>] (Ldiv0) from [<c03a88fc>] (__aeabi_uidivmod+0x8/0x18)
> [<c03a88fc>] (__aeabi_uidivmod) from [<c03592d4>] (div_s64_rem+0x3c/0xc4)
> [<c03592d4>] (div_s64_rem) from [<c05ed344>]

which of these lines is the issue?

        sample_count = div_s64(transferred_len, sample_size);

        /*
         * interval between samples is total time since last transfer handling
         * divided by the number of samples (total size divided by sample size)
         */
        interval = div_s64((ns - st->dma_st.dma_ts), sample_count);

would a simple return like below make sense?
if (!sample_size)    // or  if (!sample_count)
    return;

Is at91_adc_dma_size_done() returning 0?
Or more closely, which variable is zero?

> (at91_adc_trigger_handler+0xcc/0x494)
> [<c05ed344>] (at91_adc_trigger_handler) from [<c014944c>]
> (irq_thread_fn+0x1c/0x78)
> [<c014944c>] (irq_thread_fn) from [<c01496dc>] (irq_thread+0x124/0x1d0)
> [<c01496dc>] (irq_thread) from [<c01325b4>] (kthread+0x138/0x140)
> [<c01325b4>] (kthread) from [<c0100148>] (ret_from_fork+0x14/0x2c)
> Exception stack(0xde49dfb0 to 0xde49dff8)
> dfa0:                                     00000000 00000000 00000000
> 00000000
> dfc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000
> 00000000
> dfe0: 00000000 00000000 00000000 00000000 00000013 00000000
> Division by zero in kernel.
> CPU: 0 PID: 243 Comm: irq/182-fc03000 Not tainted 5.8.0-rc1 #1
> Hardware name: Atmel SAMA5
> [<c010caf0>] (unwind_backtrace) from [<c010a034>] (show_stack+0x10/0x14)
> [<c010a034>] (show_stack) from [<c03a7e24>] (Ldiv0_64+0x8/0x18)
> [<c03a7e24>] (Ldiv0_64) from [<c0359344>] (div_s64_rem+0xac/0xc4)
> [<c0359344>] (div_s64_rem) from [<c05ed360>]
> (at91_adc_trigger_handler+0xe8/0x494)
> [<c05ed360>] (at91_adc_trigger_handler) from [<c014944c>]
> (irq_thread_fn+0x1c/0x78)
> [<c014944c>] (irq_thread_fn) from [<c01496dc>] (irq_thread+0x124/0x1d0)
> [<c01496dc>] (irq_thread) from [<c01325b4>] (kthread+0x138/0x140)
> [<c01325b4>] (kthread) from [<c0100148>] (ret_from_fork+0x14/0x2c)
> Exception stack(0xde49dfb0 to 0xde49dff8)
> dfa0:                                     00000000 00000000 00000000
> 00000000
> dfc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000
> 00000000
> dfe0: 00000000 00000000 00000000 00000000 00000013 00000000
> sched: RT throttling activated
>
>
> It looks like crash is there since 5.8-rc1 introduced by that patch
>
> I looked in the code and it looks something is zero, probably the
> received buffer size. It is likely that the DMA starts too soon before
> the buffer is properly setup ?

I am not sure about this. See [1]

>
> Can you help with fixing this ? or you know how we can do it ?
> Also could you remind me why we enable and start the DMA on pre-enable
> of the buffer instead of post-enable of the buffer ?

[1]
So, in iio_enable_buffers(), the order is:
preenable()
update_scan_mode()
hwfifo_set_watermark()
iio_buffer_enable()    <-  this can also enable the DMA buffer if
using the IIO DMA buffer framework
[2] IIO-core-now-attaches-pollfunc via iio_trigger_attach_poll_func()
(if current mode is INDIO_BUFFER_TRIGGERED)
postenable()

I could guess maybe that hwfifo_set_watermark() is called too late?
Ideally, the driver would use the IIO DMA buffer hook to enable the
buffer via iio_buffer_enable()
That would be the ideal way to do it, and not enable DMA in preenable.

Regarding [2] it was discussed that attach/detach should be done in
that order, and it should be done in IIO core.
So, all drivers were cleaned up to respect that order.
The idea is more in the lines that repetitive/duplicated things should
be done by the IIO framework, and attach/detach-of-pollfunc is one of
them.

> In pre-enable, do we have everything ready inside IIO to be able to
> start the DMA? Or it's better to have it at post-enable time ?

This really depends on each driver.

>
> I know you want to ditch the post-enable and pre-disable hooks, but it
> looks this driver needs them, or we need to find a way to make it work
> properly

These hooks have already been dropped in favor of the IIO core doing
attach/detach.
At this point, it may be a bit more difficult to go back, than to move forward.

I think this crash should be fixable to function with this IIO core change.

Again, apologies for the breakage.

Thanks
Alex

>
> Thanks !
> Eugen

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: at91-sama5d2_adc crash
  2020-09-14 12:37 ` Alexandru Ardelean
@ 2020-09-15 16:30   ` Eugen.Hristev
  2020-09-16  6:17     ` Alexandru Ardelean
  0 siblings, 1 reply; 4+ messages in thread
From: Eugen.Hristev @ 2020-09-15 16:30 UTC (permalink / raw)
  To: ardeleanalex; +Cc: alexandru.ardelean, jic23, linux-iio

On 14.09.2020 15:37, Alexandru Ardelean wrote:

> On Mon, Sep 14, 2020 at 2:33 PM <Eugen.Hristev@microchip.com> wrote:
>>
>> Hello Alex,
>>
>> Sorry to disturb but we have issues again with this patch :
>>
>>
> 
> firstly, many apologies for the breakage;
> 
>>
>> f3c034f61775 ("iio: at91-sama5d2_adc: adjust
>> iio_triggered_buffer_{predisable,postenable} positions")
>>
>> I recently discovered a crash when using buffered trigger with DMA with
>> this driver:
>>
>> # echo 100 > /sys/bus/iio/devices/iio\:device0/buffer/length
>> # echo 100 > /sys/bus/iio/devices/iio\:device0/buffer/watermark
>> # echo 1 > /sys/bus/iio/devices/iio\:device0/scan_elements/in_voltage4_en
>> # iio_generic_buffer -n fc030000.adc -t
>> fc030000.adc-dev0-external_rising -c 5
>> iio device number being used is 0
>> iio trigger number being used is 0
>> /sys/bus/iio/devicii/iio:device0 fc030000.adc-dev0-external_risingo
>> iio:device0: using dma0chan10 for rx DMA transfers
>>
>> Division by zero in kernel.
>> CPU: 0 PID: 243 Comm: irq/182-fc03000 Not tainted 5.8.0-rc1 #1
>> Hardware name: Atmel SAMA5
>> [<c010caf0>] (unwind_backtrace) from [<c010a034>] (show_stack+0x10/0x14)
>> [<c010a034>] (show_stack) from [<c03a892c>] (Ldiv0+0x8/0x10)
>> [<c03a892c>] (Ldiv0) from [<c03a88fc>] (__aeabi_uidivmod+0x8/0x18)
>> [<c03a88fc>] (__aeabi_uidivmod) from [<c03592d4>] (div_s64_rem+0x3c/0xc4)
>> [<c03592d4>] (div_s64_rem) from [<c05ed344>]
> 
> which of these lines is the issue?
> 
>          sample_count = div_s64(transferred_len, sample_size);
> 
>          /*
>           * interval between samples is total time since last transfer handling
>           * divided by the number of samples (total size divided by sample size)
>           */
>          interval = div_s64((ns - st->dma_st.dma_ts), sample_count);
> 
> would a simple return like below make sense?
> if (!sample_size)    // or  if (!sample_count)
>      return;
> 
> Is at91_adc_dma_size_done() returning 0?
> Or more closely, which variable is zero?
> 
>> (at91_adc_trigger_handler+0xcc/0x494)
>> [<c05ed344>] (at91_adc_trigger_handler) from [<c014944c>]
>> (irq_thread_fn+0x1c/0x78)
>> [<c014944c>] (irq_thread_fn) from [<c01496dc>] (irq_thread+0x124/0x1d0)
>> [<c01496dc>] (irq_thread) from [<c01325b4>] (kthread+0x138/0x140)
>> [<c01325b4>] (kthread) from [<c0100148>] (ret_from_fork+0x14/0x2c)
>> Exception stack(0xde49dfb0 to 0xde49dff8)
>> dfa0:                                     00000000 00000000 00000000
>> 00000000
>> dfc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000
>> 00000000
>> dfe0: 00000000 00000000 00000000 00000000 00000013 00000000
>> Division by zero in kernel.
>> CPU: 0 PID: 243 Comm: irq/182-fc03000 Not tainted 5.8.0-rc1 #1
>> Hardware name: Atmel SAMA5
>> [<c010caf0>] (unwind_backtrace) from [<c010a034>] (show_stack+0x10/0x14)
>> [<c010a034>] (show_stack) from [<c03a7e24>] (Ldiv0_64+0x8/0x18)
>> [<c03a7e24>] (Ldiv0_64) from [<c0359344>] (div_s64_rem+0xac/0xc4)
>> [<c0359344>] (div_s64_rem) from [<c05ed360>]
>> (at91_adc_trigger_handler+0xe8/0x494)
>> [<c05ed360>] (at91_adc_trigger_handler) from [<c014944c>]
>> (irq_thread_fn+0x1c/0x78)
>> [<c014944c>] (irq_thread_fn) from [<c01496dc>] (irq_thread+0x124/0x1d0)
>> [<c01496dc>] (irq_thread) from [<c01325b4>] (kthread+0x138/0x140)
>> [<c01325b4>] (kthread) from [<c0100148>] (ret_from_fork+0x14/0x2c)
>> Exception stack(0xde49dfb0 to 0xde49dff8)
>> dfa0:                                     00000000 00000000 00000000
>> 00000000
>> dfc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000
>> 00000000
>> dfe0: 00000000 00000000 00000000 00000000 00000013 00000000
>> sched: RT throttling activated
>>
>>
>> It looks like crash is there since 5.8-rc1 introduced by that patch
>>
>> I looked in the code and it looks something is zero, probably the
>> received buffer size. It is likely that the DMA starts too soon before
>> the buffer is properly setup ?
> 
> I am not sure about this. See [1]
> 
>>
>> Can you help with fixing this ? or you know how we can do it ?
>> Also could you remind me why we enable and start the DMA on pre-enable
>> of the buffer instead of post-enable of the buffer ?
> 
> [1]
> So, in iio_enable_buffers(), the order is:
> preenable()
> update_scan_mode()
> hwfifo_set_watermark()
> iio_buffer_enable()    <-  this can also enable the DMA buffer if
> using the IIO DMA buffer framework
> [2] IIO-core-now-attaches-pollfunc via iio_trigger_attach_poll_func()
> (if current mode is INDIO_BUFFER_TRIGGERED)
> postenable()
> 
> I could guess maybe that hwfifo_set_watermark() is called too late?
> Ideally, the driver would use the IIO DMA buffer hook to enable the
> buffer via iio_buffer_enable()
> That would be the ideal way to do it, and not enable DMA in preenable.

Hi,

you are correct. The set watermark is being set too late. And the 
dma_init is called when a watermark higher than 1 is being set. In 
consequence, DMA is not initialized at the moment of dma_start (which is 
now in preenable, which is before the set_watermark).

Do you have any suggestion about how to fix this ? Move the start dma to 
set_watermark maybe ?

Thanks,
Eugen
> 
> Regarding [2] it was discussed that attach/detach should be done in
> that order, and it should be done in IIO core.
> So, all drivers were cleaned up to respect that order.
> The idea is more in the lines that repetitive/duplicated things should
> be done by the IIO framework, and attach/detach-of-pollfunc is one of
> them.
> 
>> In pre-enable, do we have everything ready inside IIO to be able to
>> start the DMA? Or it's better to have it at post-enable time ?
> 
> This really depends on each driver.
> 
>>
>> I know you want to ditch the post-enable and pre-disable hooks, but it
>> looks this driver needs them, or we need to find a way to make it work
>> properly
> 
> These hooks have already been dropped in favor of the IIO core doing
> attach/detach.
> At this point, it may be a bit more difficult to go back, than to move forward.
> 
> I think this crash should be fixable to function with this IIO core change.
> 
> Again, apologies for the breakage.
> 
> Thanks
> Alex
> 
>>
>> Thanks !
>> Eugen


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: at91-sama5d2_adc crash
  2020-09-15 16:30   ` Eugen.Hristev
@ 2020-09-16  6:17     ` Alexandru Ardelean
  0 siblings, 0 replies; 4+ messages in thread
From: Alexandru Ardelean @ 2020-09-16  6:17 UTC (permalink / raw)
  To: Eugen.Hristev; +Cc: Alexandru Ardelean, Jonathan Cameron, linux-iio

On Tue, Sep 15, 2020 at 7:30 PM <Eugen.Hristev@microchip.com> wrote:
>
> On 14.09.2020 15:37, Alexandru Ardelean wrote:
>
> > On Mon, Sep 14, 2020 at 2:33 PM <Eugen.Hristev@microchip.com> wrote:
> >>
> >> Hello Alex,
> >>
> >> Sorry to disturb but we have issues again with this patch :
> >>
> >>
> >
> > firstly, many apologies for the breakage;
> >
> >>
> >> f3c034f61775 ("iio: at91-sama5d2_adc: adjust
> >> iio_triggered_buffer_{predisable,postenable} positions")
> >>
> >> I recently discovered a crash when using buffered trigger with DMA with
> >> this driver:
> >>
> >> # echo 100 > /sys/bus/iio/devices/iio\:device0/buffer/length
> >> # echo 100 > /sys/bus/iio/devices/iio\:device0/buffer/watermark
> >> # echo 1 > /sys/bus/iio/devices/iio\:device0/scan_elements/in_voltage4_en
> >> # iio_generic_buffer -n fc030000.adc -t
> >> fc030000.adc-dev0-external_rising -c 5
> >> iio device number being used is 0
> >> iio trigger number being used is 0
> >> /sys/bus/iio/devicii/iio:device0 fc030000.adc-dev0-external_risingo
> >> iio:device0: using dma0chan10 for rx DMA transfers
> >>
> >> Division by zero in kernel.
> >> CPU: 0 PID: 243 Comm: irq/182-fc03000 Not tainted 5.8.0-rc1 #1
> >> Hardware name: Atmel SAMA5
> >> [<c010caf0>] (unwind_backtrace) from [<c010a034>] (show_stack+0x10/0x14)
> >> [<c010a034>] (show_stack) from [<c03a892c>] (Ldiv0+0x8/0x10)
> >> [<c03a892c>] (Ldiv0) from [<c03a88fc>] (__aeabi_uidivmod+0x8/0x18)
> >> [<c03a88fc>] (__aeabi_uidivmod) from [<c03592d4>] (div_s64_rem+0x3c/0xc4)
> >> [<c03592d4>] (div_s64_rem) from [<c05ed344>]
> >
> > which of these lines is the issue?
> >
> >          sample_count = div_s64(transferred_len, sample_size);
> >
> >          /*
> >           * interval between samples is total time since last transfer handling
> >           * divided by the number of samples (total size divided by sample size)
> >           */
> >          interval = div_s64((ns - st->dma_st.dma_ts), sample_count);
> >
> > would a simple return like below make sense?
> > if (!sample_size)    // or  if (!sample_count)
> >      return;
> >
> > Is at91_adc_dma_size_done() returning 0?
> > Or more closely, which variable is zero?
> >
> >> (at91_adc_trigger_handler+0xcc/0x494)
> >> [<c05ed344>] (at91_adc_trigger_handler) from [<c014944c>]
> >> (irq_thread_fn+0x1c/0x78)
> >> [<c014944c>] (irq_thread_fn) from [<c01496dc>] (irq_thread+0x124/0x1d0)
> >> [<c01496dc>] (irq_thread) from [<c01325b4>] (kthread+0x138/0x140)
> >> [<c01325b4>] (kthread) from [<c0100148>] (ret_from_fork+0x14/0x2c)
> >> Exception stack(0xde49dfb0 to 0xde49dff8)
> >> dfa0:                                     00000000 00000000 00000000
> >> 00000000
> >> dfc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000
> >> 00000000
> >> dfe0: 00000000 00000000 00000000 00000000 00000013 00000000
> >> Division by zero in kernel.
> >> CPU: 0 PID: 243 Comm: irq/182-fc03000 Not tainted 5.8.0-rc1 #1
> >> Hardware name: Atmel SAMA5
> >> [<c010caf0>] (unwind_backtrace) from [<c010a034>] (show_stack+0x10/0x14)
> >> [<c010a034>] (show_stack) from [<c03a7e24>] (Ldiv0_64+0x8/0x18)
> >> [<c03a7e24>] (Ldiv0_64) from [<c0359344>] (div_s64_rem+0xac/0xc4)
> >> [<c0359344>] (div_s64_rem) from [<c05ed360>]
> >> (at91_adc_trigger_handler+0xe8/0x494)
> >> [<c05ed360>] (at91_adc_trigger_handler) from [<c014944c>]
> >> (irq_thread_fn+0x1c/0x78)
> >> [<c014944c>] (irq_thread_fn) from [<c01496dc>] (irq_thread+0x124/0x1d0)
> >> [<c01496dc>] (irq_thread) from [<c01325b4>] (kthread+0x138/0x140)
> >> [<c01325b4>] (kthread) from [<c0100148>] (ret_from_fork+0x14/0x2c)
> >> Exception stack(0xde49dfb0 to 0xde49dff8)
> >> dfa0:                                     00000000 00000000 00000000
> >> 00000000
> >> dfc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000
> >> 00000000
> >> dfe0: 00000000 00000000 00000000 00000000 00000013 00000000
> >> sched: RT throttling activated
> >>
> >>
> >> It looks like crash is there since 5.8-rc1 introduced by that patch
> >>
> >> I looked in the code and it looks something is zero, probably the
> >> received buffer size. It is likely that the DMA starts too soon before
> >> the buffer is properly setup ?
> >
> > I am not sure about this. See [1]
> >
> >>
> >> Can you help with fixing this ? or you know how we can do it ?
> >> Also could you remind me why we enable and start the DMA on pre-enable
> >> of the buffer instead of post-enable of the buffer ?
> >
> > [1]
> > So, in iio_enable_buffers(), the order is:
> > preenable()
> > update_scan_mode()
> > hwfifo_set_watermark()
> > iio_buffer_enable()    <-  this can also enable the DMA buffer if
> > using the IIO DMA buffer framework
> > [2] IIO-core-now-attaches-pollfunc via iio_trigger_attach_poll_func()
> > (if current mode is INDIO_BUFFER_TRIGGERED)
> > postenable()
> >
> > I could guess maybe that hwfifo_set_watermark() is called too late?
> > Ideally, the driver would use the IIO DMA buffer hook to enable the
> > buffer via iio_buffer_enable()
> > That would be the ideal way to do it, and not enable DMA in preenable.
>
> Hi,
>
> you are correct. The set watermark is being set too late. And the
> dma_init is called when a watermark higher than 1 is being set. In
> consequence, DMA is not initialized at the moment of dma_start (which is
> now in preenable, which is before the set_watermark).
>
> Do you have any suggestion about how to fix this ? Move the start dma to
> set_watermark maybe ?

I think as a quick fix, calling the preenable() in set_watermark()
could be an idea.
If this solves the issue, then I would do it now.
Long-term it may make sense to re-organize the hooks a bit, and
probably use the IIO DMA buffer framework.
I don't know if the current form for IIO DMA buffer is sufficient for
this driver, but extensions are always an idea.

>
> Thanks,
> Eugen
> >
> > Regarding [2] it was discussed that attach/detach should be done in
> > that order, and it should be done in IIO core.
> > So, all drivers were cleaned up to respect that order.
> > The idea is more in the lines that repetitive/duplicated things should
> > be done by the IIO framework, and attach/detach-of-pollfunc is one of
> > them.
> >
> >> In pre-enable, do we have everything ready inside IIO to be able to
> >> start the DMA? Or it's better to have it at post-enable time ?
> >
> > This really depends on each driver.
> >
> >>
> >> I know you want to ditch the post-enable and pre-disable hooks, but it
> >> looks this driver needs them, or we need to find a way to make it work
> >> properly
> >
> > These hooks have already been dropped in favor of the IIO core doing
> > attach/detach.
> > At this point, it may be a bit more difficult to go back, than to move forward.
> >
> > I think this crash should be fixable to function with this IIO core change.
> >
> > Again, apologies for the breakage.
> >
> > Thanks
> > Alex
> >
> >>
> >> Thanks !
> >> Eugen
>

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2020-09-16  6:17 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-09-14 11:30 at91-sama5d2_adc crash Eugen.Hristev
2020-09-14 12:37 ` Alexandru Ardelean
2020-09-15 16:30   ` Eugen.Hristev
2020-09-16  6:17     ` Alexandru Ardelean

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).