Re: Possible deadlock in mpu6050 on buffer disable?

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

 



On 05/23/2016 12:33 PM, Crestez Dan Leonard wrote:
> Hello,
> 
> I've been poking at this driver and I get some occasional deadlocks when
> disabling buffering. Here is a snippet from the kernel task dump (via
> echo t > /proc/sysrq-trigger):
> 
> [   57.562487] irq/56-mpu6500_ D ffff88003d7fbd08 13632   771      2
> 0x00000000
> [   57.563081]  ffff88003d7fbd08 ffff88003da4a1c0 ffffffff81988ae0
> ffff880000000026
> [   57.563614]  ffff88003d7fc000 ffff88003da4a1c0 ffff88003d4aa304
> 00000000ffffffff
> [   57.564221]  ffff88003d4aa308 ffff88003d7fbd20 ffffffff8147f280
> ffff88003d4aa300
> [   57.565242] Call Trace:
> [   57.565462]  [<ffffffff8147f280>] schedule+0x30/0x80
> [   57.565789]  [<ffffffff8147f4f9>] schedule_preempt_disabled+0x9/0x10
> [   57.566303]  [<ffffffff81480c8a>] __mutex_lock_slowpath+0x8a/0x100
> [   57.566704]  [<ffffffff810875a0>] ? irq_forced_thread_fn+0x60/0x60
> [   57.567202]  [<ffffffff81480d1a>] mutex_lock+0x1a/0x30
> [   57.567541]  [<ffffffff813bc31e>] inv_mpu6050_read_fifo+0x6e/0x230
> [   57.567934]  [<ffffffff810737d6>] ? put_prev_task_rt+0x16/0xa0
> [   57.568428]  [<ffffffff8147ed1c>] ? __schedule+0x32c/0x860
> [   57.568789]  [<ffffffff810875a0>] ? irq_forced_thread_fn+0x60/0x60
> [   57.569289]  [<ffffffff810875bb>] irq_thread_fn+0x1b/0x50
> [   57.569646]  [<ffffffff81087851>] irq_thread+0x111/0x190
> [   57.569997]  [<ffffffff81087690>] ? wake_threads_waitq+0x30/0x30
> [   57.570505]  [<ffffffff81087740>] ? irq_thread_dtor+0xb0/0xb0
> [   57.570875]  [<ffffffff8105eae4>] kthread+0xc4/0xe0
> [   57.571308]  [<ffffffff81482a92>] ret_from_fork+0x22/0x40
> [   57.571663]  [<ffffffff8105ea20>] ? kthread_worker_fn+0x160/0x160
> 
> VERSUS:
> 
> [   57.587592] test-iio-buffer D ffff88003d1a3c08 13808   798    791
> 0x00000004
> [   57.588193]  ffff88003d1a3c08 ffff88003db02d00 ffff88003d1a3be8
> ffffffff81106abc
> [   57.588772]  ffff88003d1a4000 ffff88003d5b72d0 0000000000000038
> ffff88003d5b729c
> [   57.589388]  ffff88003d5b7200 ffff88003d1a3c20 ffffffff8147f280
> ffff88003d5b7200
> [   57.589963] Call Trace:
> [   57.590211]  [<ffffffff81106abc>] ? kfree+0xec/0xf0
> [   57.590537]  [<ffffffff8147f280>] schedule+0x30/0x80
> [   57.590904]  [<ffffffff81086d14>] synchronize_irq+0x54/0x90
> [   57.591600]  [<ffffffff810772c0>] ? wake_atomic_t_function+0x60/0x60
> [   57.592073]  [<ffffffff81087ba6>] __free_irq+0x136/0x270
> [   57.592430]  [<ffffffff81087d54>] free_irq+0x34/0x80
> [   57.592760]  [<ffffffff813b93b5>] iio_trigger_detach_poll_func+0x75/0xa0
> [   57.593267]  [<ffffffff813b93f7>]
> iio_triggered_buffer_predisable+0x17/0x20
> [   57.593711]  [<ffffffff813b73ca>] iio_disable_buffers+0x3a/0xf0
> [   57.594164]  [<ffffffff813b8202>] __iio_update_buffers+0x222/0x4e0
> [   57.594559]  [<ffffffff813b865b>] iio_buffer_store_enable+0xab/0xc0
> [   57.594973]  [<ffffffff81308a23>] dev_attr_store+0x13/0x20
> [   57.595388]  [<ffffffff8116ff72>] sysfs_kf_write+0x32/0x40
> [   57.595734]  [<ffffffff8116f565>] kernfs_fop_write+0x115/0x170
> [   57.596170]  [<ffffffff8110b093>] __vfs_write+0x23/0xe0
> [   57.596526]  [<ffffffff8112755f>] ? __fd_install+0x1f/0xc0
> [   57.596871]  [<ffffffff811273da>] ? __alloc_fd+0x3a/0x170
> [   57.597308]  [<ffffffff81078b3d>] ? percpu_down_read+0xd/0x50
> [   57.597667]  [<ffffffff8110bf74>] vfs_write+0xa4/0x1a0
> [   57.598023]  [<ffffffff81109241>] ? filp_close+0x51/0x70
> [   57.598396]  [<ffffffff8110d251>] SyS_write+0x41/0xa0
> [   57.598717]  [<ffffffff8148289b>] entry_SYSCALL_64_fastpath+0x13/0x8f
> 
> The problem seems to be that inv_mpu6050_read_fifo takes
> indio_dev->mlock, the same lock taken by the IIO core when disabling the
> interrupt.
> 
> Does anyone have any clever ideas for fixing this? One way to do it
> would be to skip taking mlock in inv_mpu6050_read_fifo because most of
> the code does not touch shared fields. Only when an error happens does
> it call inv_reset_fifo. I think that call should simply be removed.

Yes, that's probably the way to go.

> As a more general principle isn't it a bad idea to take mlock in driver
> code? It seems much saner for drivers to use their own locks for their
> private data.

There are a few places where it is safe to use the mlock, like the driver
{read,write}_raw() callbacks, but that's pretty mich it.

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