Re: [PATCH] iio: imu: inv_mpu6050: Support software triggers

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, May 27, 2016 at 6:15 PM, Crestez Dan Leonard
<leonard.crestez@xxxxxxxxx> wrote:
> On 05/26/2016 03:23 PM, Doru Gucea wrote:
>> In order to support software triggers (e.g.: hr-based trigger) the
>> operations from trigger enable/disable are moved to buffer enable/
>> disable.
>>
>> This also allows us to remove the mutex from inv_mpu6050_read_fifo:
>> inv_reset_fifo can't access in parallel shared fields because the
>> buffers must be enabled prior to reading data.
>>
>> A benefit of removing the mutex is that we avoid a deadlock at
>> buffer wqdisable time. The scenario was the following:
>> (1) at buffer disable time the indio_dev->mlock is acquired
>> (2) free_irq is called and waits for IRQs completion
>> (3) inv_mpu6050_read_fifo tries to acquire the indio_dev->mlock
>
> I'm not sure this is safe, it seems to me that inv_reset_fifo assumes
> mlock is taken and this needs to be assured. I think properly removing
> the irq disabling deadlock require either using something other than
> mlock or not calling inv_reset_fifo from the interrupt at all. The
> latter seems preferable to me. But this issue should be handled
> separately from software trigger support.
>

inv_reset_fifo still needs to be called: it might happen that we miss a
DATA_RDY interrupt in which case we'll have a mismatch between
time-stamps and bytes from the FIFO queues. The only way to recover
from such a situation is to flush the FIFO's and restart the interrupt.

Regarding the locking, before my patch, inv_reset_fifo could flush the
FIFO's (see inv_mpu_data_rdy_trigger_set_state) while
inv_mpu6050_read_fifo was reading data and the role of the mlock was
to avoid this situation. This situation is not possible anymore because
the operations from trigger enable/disable were moved to buffer
enable/disable: trigger state can't be changed while buffers are enabled.
Do you see another scenario?

I'll split the software trigger support and deadlock solution in two patches.

> Another issue is that the fifo is filled at the sampling frequency
> configured in device registers and this can be different from the
> sampling frequency configured on the software trigger. It seems to me
> that the user needs to manually ensure that they are identical.
>

A solution would be to hook the iio_hrtimer_info_store_sampling_frequency
method of the hrtimer for setting the sampling frequency together with
the timer frequency. I think this will require changes to the hrtimer for
exposing the above function to drivers. Daniel, what would be the right
approach?

> Even if they are identical the timer ticks might not match perfectly.
> When reading from the fifo all available samples are handled.
>
> If device frequency is set too high you will push multiple samples to
> userspace, all but one of them with bad timestamps. It's also possible
> to find zero samples if device frequency is set higher than timer frequency.
>

In case of timer ticks mismatch there will also be a mismatch between
time-stamps and bytes from the FIFO queues. I wonder if a clean recovery
from such a situation would be to call inv_reset_fifo together with resetting
the hrtimer.

> --
> Regards,
> Leonard
> --
> To unsubscribe from this list: send the line "unsubscribe linux-iio" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

Regards,
Doru
--
To unsubscribe from this list: send the line "unsubscribe linux-iio" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Input]     [Linux Kernel]     [Linux SCSI]     [X.org]

  Powered by Linux