From 41de9e1640c2921dd656a77ac10093e0540eccb0 Mon Sep 17 00:00:00 2001 From: Xiaojun Sang Date: Tue, 16 Oct 2018 15:12:47 +0800 Subject: [PATCH] dsp: afe: change lock sequence to avoid deadlock Lock sequence for afe_alloc_cal does not comply with others. To avoid deadlock, move afe_cmd_lock to the top caller in AFE. Change-Id: I4ce03034c642c8b5e7e9e5e2ff4c73644980484b Signed-off-by: Xiaojun Sang --- dsp/q6afe.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/dsp/q6afe.c b/dsp/q6afe.c index da8dc5a8033a..f71d72b810b0 100644 --- a/dsp/q6afe.c +++ b/dsp/q6afe.c @@ -7408,14 +7408,17 @@ int afe_alloc_cal(int32_t cal_type, size_t data_size, goto done; } + mutex_lock(&this_afe.afe_cmd_lock); ret = cal_utils_alloc_cal(data_size, data, this_afe.cal_data[cal_index], 0, NULL); if (ret < 0) { pr_err("%s: cal_utils_alloc_block failed, ret = %d, cal type = %d!\n", __func__, ret, cal_type); ret = -EINVAL; + mutex_unlock(&this_afe.afe_cmd_lock); goto done; } + mutex_unlock(&this_afe.afe_cmd_lock); done: return ret; } @@ -7799,8 +7802,6 @@ static int afe_map_cal_data(int32_t cal_type, goto done; } - - mutex_lock(&this_afe.afe_cmd_lock); atomic_set(&this_afe.mem_map_cal_index, cal_index); ret = afe_cmd_memory_map(cal_block->cal_data.paddr, cal_block->map_data.map_size); @@ -7813,12 +7814,10 @@ static int afe_map_cal_data(int32_t cal_type, __func__, &cal_block->cal_data.paddr, cal_block->map_data.map_size); - mutex_unlock(&this_afe.afe_cmd_lock); goto done; } cal_block->map_data.q6map_handle = atomic_read(&this_afe. mem_map_cal_handles[cal_index]); - mutex_unlock(&this_afe.afe_cmd_lock); done: return ret; }