On 2022-03-04 5:41 PM, Ranjani Sridharan wrote:
On Fri, 2022-03-04 at 15:57 +0100, Cezary Rojewski wrote:
/*
- struct avs_dev - Intel HD-Audio driver data
- @dev: PCI device
- @dsp_ba: DSP bar address
- @spec: platform-specific descriptor
- @fw_cfg: Firmware configuration, obtained through FW_CONFIG
message
- @hw_cfg: Hardware configuration, obtained through HW_CONFIG
message
- @mods_info: Available module-types, obtained through MODULES_INFO
message
- @mod_idas: Module instance ID pool, one per module-type
- @modres_mutex: For synchronizing any @mods_info updates
Is this mutex really necessary? Can you please elaborate under what circumstances your will have parallel module updates?
Yes, we believe modres_mutex is necessary. All information regarding modules exposed by the firmware are stored within ->mods_info cache.
That's just a snapshot though. When a new library gets loaded, new modules may be available for use and so the driver updates the ->mods_info cache to have the latest snapshot. As information found there is used when streaming (e.g.: instantiating modules), we enter a scenario when multiple threads could be reading/updating the ->mods_info at once. To prevent any unwanted behavior, mutex has been added.
+void avs_module_info_free(struct avs_dev *adev) +{
- mutex_lock(&adev->modres_mutex);
- avs_module_ida_destroy(adev);
- kfree(adev->mods_info);
- adev->mods_info = NULL;
- mutex_unlock(&adev->modres_mutex);
+}
+int avs_module_id_alloc(struct avs_dev *adev, u16 module_id) +{
- int ret, idx, max_id;
- mutex_lock(&adev->modres_mutex);
- idx = avs_module_id_entry_index(adev, module_id);
- if (idx == -ENOENT) {
Can you please help me understand when this can happen? If all modules required by the topology are already initialized, will this ever happen?
I want to help! Just not understanding the meaning of: "all modules required by the topology are already initialized".
Will answer best I can though: topology carries just patterns, it may happen that module found within topology file is not actually exposed by the firmware. In such case, we drop an error. This keeps recovery scenarios sane too - when recovering, libraries may have to be re-loaded, depending on the firmware generation and whether basefw recovery was successful or not.
Regards, Czarek