Hi Mark, again
From: Kuninori Morimoto kuninori.morimoto.gx@renesas.com
Current rtd, rtd->dev, rtd->codec_dais are created by normal kzalloc(), but we want to use devm_kzalloc() as much as possible.
Created rtd->dev is registered by device_register() at soc_new_pcm_runtime(), and it will be freed at soc_free_pcm_runtime() by device_unregister().
These aren't using devm_ because they are done at card init time and so might happen multiple times when other card components get removed and added. This shouldn't happen too much but if it does then it could end up consuming a noticeable amount of memory.
I see. Actually my local patch which is not yet posted can solve this multiple times issue. Mergeing these can be good solution. Please drop it so far.
Oops, it was alreay posted and accepted :)
d918a37610b1bf71faa86f589bd7604f71c1e05f ("ASoC: soc-core: tidyup soc_new_pcm_runtime() alloc order")
above rtd, rtd->codec_dais are devm_kzalloc() by original dev (which will be rtd->dev) instead of card/component dev.
It is registered by device_register() at soc_new_pcm_runtime(), and will be unregistered by device_unregister() at soc_free_pcm_runtime() when card was removed.
It is a little bit tricky, but these are chain-freed when card was removed. If my understanding was correct, we don't have memory leak by multiple times card/components remove. But, please double check.
user removed card -> snd_soc_unbind_card() -> soc_cleanup_card_resources() -> soc_remove_pcm_runtimes() -> soc_free_pcm_runtime() (*) -> device_unregister(rtd->dev);
rtd->dev will be kfree() by soc_release_rtd_dev at (*), then, rtd, rtd->codec_dais will be kfree() via devm_
Thank you for your help !! Best regards --- Kuninori Morimoto