Skip to content

Commit 13a3dbb

Browse files
checkupupJun Lai
authored andcommitted
dax: fix race condition on the tuning buffer
While the tuning buffer is being updated, it may also be being used simultaneously in the process thread. Signed-off-by: Jun Lai <jun.lai@dolby.com>
1 parent 9fd06e9 commit 13a3dbb

2 files changed

Lines changed: 30 additions & 12 deletions

File tree

src/audio/module_adapter/module/dolby/dax.c

Lines changed: 29 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ SOF_DEFINE_REG_UUID(dolby_dax_audio_processing);
2525
#define DAX_CP_MASK 0x8
2626
#define DAX_VOLUME_MASK 0x10
2727
#define DAX_CTC_MASK 0x20
28+
#define DAX_TUNING_FILE_MASK 0x40
2829
#define DAX_PROCESSING_MASK 0x10000
2930
#define DAX_RESET_MASK 0x20000
3031
#define DAX_FREE_MASK 0x40000
@@ -241,24 +242,21 @@ static bool is_enabled(struct processing_module *mod)
241242
return dax_ctx->enable && dax_ctx->p_dax;
242243
}
243244

244-
static int set_tuning_file(struct processing_module *mod, void *value, uint32_t size)
245+
static int set_tuning_file(struct processing_module *mod)
245246
{
246-
int ret = 0;
247+
int ret = -EINVAL;
247248
struct comp_dev *dev = mod->dev;
248249
struct dax_adapter_data *adapter_data = module_get_private_data(mod);
249250
struct sof_dax *dax_ctx = &adapter_data->dax_ctx;
250251

251-
if (dax_buffer_alloc(mod, &dax_ctx->tuning_file_buffer, size) != 0) {
252-
comp_err(dev, "allocate %u bytes failed for tuning file", size);
253-
ret = -ENOMEM;
254-
} else {
255-
memcpy_s(dax_ctx->tuning_file_buffer.addr,
256-
dax_ctx->tuning_file_buffer.free,
257-
value,
258-
size);
252+
if (adapter_data->tmp_tuning_buf.addr && adapter_data->tmp_tuning_buf.size > 0) {
253+
dax_buffer_release(mod, &dax_ctx->tuning_file_buffer);
254+
dax_ctx->tuning_file_buffer = adapter_data->tmp_tuning_buf;
255+
memset(&adapter_data->tmp_tuning_buf, 0, sizeof(adapter_data->tmp_tuning_buf));
256+
ret = 0;
259257
}
260258

261-
comp_info(dev, "allocated: tuning %u, ret %d", dax_ctx->tuning_file_buffer.size, ret);
259+
comp_info(dev, "apply tuning %p, ret %d", dax_ctx->tuning_file_buffer.addr, ret);
262260
return ret;
263261
}
264262

@@ -367,7 +365,19 @@ static int dax_set_param_wrapper(struct processing_module *mod,
367365

368366
switch (id) {
369367
case DAX_PARAM_ID_TUNING_FILE:
370-
set_tuning_file(mod, value, size);
368+
if (dax_buffer_alloc(mod, &adapter_data->tmp_tuning_buf, size) != 0) {
369+
comp_err(dev, "allocate %u bytes failed for tuning file", size);
370+
ret = -ENOMEM;
371+
} else {
372+
memcpy_s(adapter_data->tmp_tuning_buf.addr,
373+
adapter_data->tmp_tuning_buf.free,
374+
value,
375+
size);
376+
flag_process(adapter_data, DAX_TUNING_FILE_MASK, DAX_FLAG_SET);
377+
comp_info(dev, "allocated: tuning %p, size %u",
378+
adapter_data->tmp_tuning_buf.addr,
379+
adapter_data->tmp_tuning_buf.size);
380+
}
371381
break;
372382
case DAX_PARAM_ID_ENABLE:
373383
tmp_val = *((int32_t *)value);
@@ -488,6 +498,12 @@ static void check_and_update_settings(struct processing_module *mod)
488498
if (!is_enabled(mod))
489499
return;
490500

501+
if (flag_process(adapter_data, DAX_TUNING_FILE_MASK, DAX_FLAG_READ_AND_CLEAR)) {
502+
set_tuning_file(mod);
503+
flag_process(adapter_data, DAX_DEVICE_MASK, DAX_FLAG_SET);
504+
flag_process(adapter_data, DAX_VOLUME_MASK, DAX_FLAG_SET);
505+
}
506+
491507
if (flag_process(adapter_data, DAX_DEVICE_MASK, DAX_FLAG_READ_AND_CLEAR)) {
492508
set_device(mod, dax_ctx->out_device);
493509
set_tuning_device(mod, dax_ctx->tuning_device);
@@ -547,6 +563,7 @@ static int sof_dax_free(struct processing_module *mod)
547563
dax_buffer_release(mod, &dax_ctx->tuning_file_buffer);
548564
mod_data_blob_handler_free(mod, dax_ctx->blob_handler);
549565
dax_ctx->blob_handler = NULL;
566+
dax_buffer_release(mod, &adapter_data->tmp_tuning_buf);
550567
mod_free(mod, adapter_data);
551568
module_set_private_data(mod, NULL);
552569
}

src/audio/module_adapter/module/dolby/dax.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ struct dax_adapter_data {
2424
atomic_t proc_flags;
2525
uint32_t comp_id;
2626
int32_t priority;
27+
struct dax_buffer tmp_tuning_buf;
2728
};
2829

2930
/**

0 commit comments

Comments
 (0)