Skip to content

Commit c4aea0b

Browse files
committed
audio: chain_dma: don't abuse driver list lock
comp_drivers_get()->lock is guarding the global list of component drivers, no need for the chain DMA driver to take it. Signed-off-by: Guennadi Liakhovetski <guennadi.liakhovetski@linux.intel.com>
1 parent 4d5c687 commit c4aea0b

File tree

1 file changed

+6
-18
lines changed

1 file changed

+6
-18
lines changed

src/audio/chain_dma.c

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -282,17 +282,13 @@ static enum task_state chain_task_run(void *data)
282282

283283
static int chain_task_start(struct comp_dev *dev)
284284
{
285-
struct comp_driver_list *drivers = comp_drivers_get();
286285
struct chain_dma_data *cd = comp_get_drvdata(dev);
287-
k_spinlock_key_t key;
288286
int ret;
289287

290288
comp_info(dev, "host_dma_id = 0x%08x", cd->host_connector_node_id.dw);
291289

292-
key = k_spin_lock(&drivers->lock);
293290
switch (cd->chain_task.state) {
294291
case SOF_TASK_STATE_QUEUED:
295-
k_spin_unlock(&drivers->lock, key);
296292
return 0;
297293
case SOF_TASK_STATE_COMPLETED:
298294
break;
@@ -302,27 +298,26 @@ static int chain_task_start(struct comp_dev *dev)
302298
break;
303299
default:
304300
comp_err(dev, "bad state transition");
305-
ret = -EINVAL;
306-
goto error;
301+
return -EINVAL;
307302
}
308303

309304
if (cd->stream_direction == SOF_IPC_STREAM_PLAYBACK) {
310305
ret = chain_host_start(dev);
311306
if (ret)
312-
goto error;
307+
return ret;
313308
ret = chain_link_start(dev);
314309
if (ret) {
315310
chain_host_stop(dev);
316-
goto error;
311+
return ret;
317312
}
318313
} else {
319314
ret = chain_link_start(dev);
320315
if (ret)
321-
goto error;
316+
return ret;
322317
ret = chain_host_start(dev);
323318
if (ret) {
324319
chain_link_stop(dev);
325-
goto error;
320+
return ret;
326321
}
327322
}
328323

@@ -342,29 +337,24 @@ static int chain_task_start(struct comp_dev *dev)
342337
}
343338

344339
pm_policy_state_lock_get(PM_STATE_RUNTIME_IDLE, PM_ALL_SUBSTATES);
345-
k_spin_unlock(&drivers->lock, key);
346340

347341
return 0;
348342

349343
error_task:
350344
chain_host_stop(dev);
351345
chain_link_stop(dev);
352-
error:
353-
k_spin_unlock(&drivers->lock, key);
346+
354347
return ret;
355348
}
356349

357350
static int chain_task_pause(struct comp_dev *dev)
358351
{
359-
struct comp_driver_list *drivers = comp_drivers_get();
360352
struct chain_dma_data *cd = comp_get_drvdata(dev);
361-
k_spinlock_key_t key;
362353
int ret, ret2;
363354

364355
if (cd->chain_task.state == SOF_TASK_STATE_FREE)
365356
return 0;
366357

367-
key = k_spin_lock(&drivers->lock);
368358
cd->first_data_received = false;
369359
if (cd->stream_direction == SOF_IPC_STREAM_PLAYBACK) {
370360
ret = chain_host_stop(dev);
@@ -376,8 +366,6 @@ static int chain_task_pause(struct comp_dev *dev)
376366
if (!ret)
377367
ret = ret2;
378368

379-
k_spin_unlock(&drivers->lock, key);
380-
381369
schedule_task_free(&cd->chain_task);
382370
pm_policy_state_lock_put(PM_STATE_RUNTIME_IDLE, PM_ALL_SUBSTATES);
383371

0 commit comments

Comments
 (0)