[RFC 17/37] ASoC: Intel: avs: Dynamic firmware resources management
Cezary Rojewski
cezary.rojewski at intel.com
Tue Dec 21 18:07:57 CET 2021
On 2021-12-21 3:40 PM, Mark Brown wrote:
> On Wed, Dec 08, 2021 at 12:12:41PM +0100, Cezary Rojewski wrote:
>
>> +int avs_dsp_get_core(struct avs_dev *adev, u32 core_id)
>> +{
>
> ...
>
>> + if (atomic_add_return(1, ref) == 1) {
>> + ret = avs_dsp_enable(adev, mask);
>> + if (ret)
>> + goto err_enable_dsp;
>> + }
>
>> +int avs_dsp_put_core(struct avs_dev *adev, u32 core_id)
>> +{
>
> ...
>
>> + ref = &adev->core_refs[core_id];
>> + if (atomic_dec_and_test(ref)) {
>> + ret = avs_dsp_disable(adev, mask);
>
> This looks wrong - there's nothing that ensures that we don't get
> a sequence like:
>
> CPU0 CPU1
> decrement
> increment
> enable DSP
> disable DSP
>
> that I can see here? Either there's a lock missing which ensures
> that the actual DSP management is in sync with the refcount or
> there's no need for the use of atomics since the wider lock will
> ensure that only one thing could be updating at once. In general
> I'd expect something heavier weight than atomics.
Keen eye, Mark. In fact, you're right in both statements:
- assuming there is no wider lock, existing usage of atomics won't
prevent possible race for enable/disable of DSP carried as a consequence
to ->core_refs manipulation
- there is a wider lock indeed, and that's why we haven't encountered
the problem I guess. It's ->path_mutex, a member of struct avs_dev. Said
mutex is introduced in:
[PATCH 19/37] ASoC: Intel: avs: Path management
along with its usage. By the usage I mean the following:
avs_dsp_put_core() and avs_dsp_get_core() are called only within
avs_dsp_init_module() and avs_dsp_delete_module(). The latter two are
part of 'struct avs_path *' instances creation and deletion procedure:
avs_path_create() and avs_path_free(). Both avs_path_create() and
avs_path_free() lock ->path_mutex before doing anything.
I admit that answer to question: "which approach fits best here?" will
probably need to wait for the Christmas break to be over. While myself
I'm in favour of synchronizing avs_dsp_put_core() and avs_dsp_get_core()
locally as it scales better into the future and we won't get caught
unprepared when avs_path_create() and avs_path_free() stop being the
only places for their usage, such decision need to be made by the team
as a whole.
One more thing came into my mind during this discussion:
avs_dsp_put_core() and avs_dsp_get_core() should probably be 'static' -
as it was said earlier, these are not used outside of the dsp.c file.
Once again, good finding Mark, thank you.
Regards,
Czarek
More information about the Alsa-devel
mailing list