On 2022-10-27 10:58 AM, Cezary Rojewski wrote:
Flows leading to link->init() and link->exit() are not symmetric. Currently the relevant part of card probe sequence goes as:
for_each_card_rtds(card, rtd) for_each_rtd_components(rtd, i, component) component->probe() for_each_card_rtds(card, rtd) for_each_rtd_dais(rtd, i, dai) dai->probe() for_each_card_rtds(card, rtd) rtd->init()
On the other side, equivalent remove sequence goes as:
for_each_card_rtds(card, rtd) for_each_rtd_dais(rtd, i, dai) dai->remove() for_each_card_rtds(card, rtd) for_each_rtd_components(rtd, i, component) component->remove() for_each_card_rtds(card, rtd) rtd->exit()
what can lead to errors as link->exit() may still operate on resources owned by its components despite the probability of them being freed during the component->remove().
This change modifies the remove sequence to:
for_each_card_rtds(card, rtd) rtd->exit() for_each_card_rtds(card, rtd) for_each_rtd_dais(rtd, i, dai) dai->remove() for_each_card_rtds(card, rtd) for_each_rtd_components(rtd, i, component) component->remove()
so code found in link->exit() is safe to touch any component stuff as component->remove() has not been called yet.
As this is connected (and is a dependency) for some jack-handler refactoring in Intel boards, perhaps it will be better if I send this patch as part of a series? Lacks some context.
Regards, Czarek