On Mon, 03 Apr 2017 08:29:34 +0200, Kuninori Morimoto wrote:
Hi Takashi-san
I think this is a good direction to at least start to mitigate these problems (which we really should be doing) and hopefully make it easier to do further improvements in future. There's obviously more places where we should be checking the flag (controls for example) but they can be added later. One thing I would like to see is instead of setting the flag directly when we see a problem call a function to do it. That way if we want to improve things in the future we can do that without having to update the callers again.
BTW, ALSA core has snd_card_disconnect() that does this kind of shut-up from user-space. It was introduced for hot-unplug, but basically unbinding is the software hot-unplug. So, if ASoC won't rebind a once-unbound component, you can simply call snd_card_disconnect() at the component unbinding time to assure that no further user actions can be done.
Thanks. I checked about snd_card_disconnect(), and it will be called from snd_card_free(). And it will be called from snd_soc_unregister_card()
Yes, snd_card_free() assures the disconnection at first, syncs the all settled down, then releases the resources.
So, we can call snd_soc_unregister_card() whenever CPU/Codec/Platform were unregsiterd.
In theory yes, but you should be careful to do so, e.g. make sure that it won't be called again by the removal/unbind of other components / drivers.
I suggested snd_card_disconnect() because it doesn't release resources by itself, but it just disconnects from the further accesses. So, double-free won't happen in this case. It makes the hotunplug safer as long as the drivers manage the resource releases properly.
Takashi
This method also solve random unbind/bind Oops too. Here, random unbind/bind example is that expected correct operation is unbind all CPU/Codec/Platfrom/Card, and then, bind all CPU/Codec/Platfrom/Card again. (here unbind order can be random) But this case, we will get Oops if unbind Codec -> bind Codec -> unbind Card. Using snd_soc_unregister_card() can solve this issue too.
Best regards
Kuninori Morimoto