Skip to content

Commit 04aaf55

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 e187f92 commit 04aaf55

File tree

1 file changed

+6
-16
lines changed

1 file changed

+6
-16
lines changed

src/audio/chain_dma.c

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -284,15 +284,12 @@ static int chain_task_start(struct comp_dev *dev)
284284
{
285285
struct comp_driver_list *drivers = comp_drivers_get();
286286
struct chain_dma_data *cd = comp_get_drvdata(dev);
287-
k_spinlock_key_t key;
288287
int ret;
289288

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

292-
key = k_spin_lock(&drivers->lock);
293291
switch (cd->chain_task.state) {
294292
case SOF_TASK_STATE_QUEUED:
295-
k_spin_unlock(&drivers->lock, key);
296293
return 0;
297294
case SOF_TASK_STATE_COMPLETED:
298295
break;
@@ -302,27 +299,26 @@ static int chain_task_start(struct comp_dev *dev)
302299
break;
303300
default:
304301
comp_err(dev, "bad state transition");
305-
ret = -EINVAL;
306-
goto error;
302+
return -EINVAL;
307303
}
308304

309305
if (cd->stream_direction == SOF_IPC_STREAM_PLAYBACK) {
310306
ret = chain_host_start(dev);
311307
if (ret)
312-
goto error;
308+
return ret;
313309
ret = chain_link_start(dev);
314310
if (ret) {
315311
chain_host_stop(dev);
316-
goto error;
312+
return ret;
317313
}
318314
} else {
319315
ret = chain_link_start(dev);
320316
if (ret)
321-
goto error;
317+
return ret;
322318
ret = chain_host_start(dev);
323319
if (ret) {
324320
chain_link_stop(dev);
325-
goto error;
321+
return ret;
326322
}
327323
}
328324

@@ -342,29 +338,25 @@ static int chain_task_start(struct comp_dev *dev)
342338
}
343339

344340
pm_policy_state_lock_get(PM_STATE_RUNTIME_IDLE, PM_ALL_SUBSTATES);
345-
k_spin_unlock(&drivers->lock, key);
346341

347342
return 0;
348343

349344
error_task:
350345
chain_host_stop(dev);
351346
chain_link_stop(dev);
352-
error:
353-
k_spin_unlock(&drivers->lock, key);
347+
354348
return ret;
355349
}
356350

357351
static int chain_task_pause(struct comp_dev *dev)
358352
{
359353
struct comp_driver_list *drivers = comp_drivers_get();
360354
struct chain_dma_data *cd = comp_get_drvdata(dev);
361-
k_spinlock_key_t key;
362355
int ret, ret2;
363356

364357
if (cd->chain_task.state == SOF_TASK_STATE_FREE)
365358
return 0;
366359

367-
key = k_spin_lock(&drivers->lock);
368360
cd->first_data_received = false;
369361
if (cd->stream_direction == SOF_IPC_STREAM_PLAYBACK) {
370362
ret = chain_host_stop(dev);
@@ -376,8 +368,6 @@ static int chain_task_pause(struct comp_dev *dev)
376368
if (!ret)
377369
ret = ret2;
378370

379-
k_spin_unlock(&drivers->lock, key);
380-
381371
schedule_task_free(&cd->chain_task);
382372
pm_policy_state_lock_put(PM_STATE_RUNTIME_IDLE, PM_ALL_SUBSTATES);
383373

0 commit comments

Comments
 (0)