On Thu, 2010-11-04 at 10:16 +0200, Peter Ujfalusi wrote:
dapm_power_widgets can be called from different context. When two calls are happening at the same time both will try to change states/lists. This can lead to kernel crash.
A simple way to reproduce the problem:
while [ "1" = "1" ] ; do amixer sset -Dhw:0 -q 'Mixer for loopback' on amixer sset -Dhw:0 -q 'Mixer for loopback' off done &
while [ "1" = "1" ] ; do aplay -Dplughw:0 -fdat -d 3 /dev/urandom echo "Playback finished" sleep 6 done &
Add new card level mutex (dpw_mutex) to protect the dapm_power_widgets from race. The exisiting card->mutex can not be used for this purpose, since it has been taken in probe time in the snd_soc_instantiate_card function. Through probe calls from this function eventually dapm_power_widgets will be called, which will lead to dead lock.
Signed-off-by: Peter Ujfalusi peter.ujfalusi@nokia.com
Acked-by: Liam Girdwood lrg@slimlogic.co.uk