[PATCH] ASoC: soc-pcm: Revert "call snd_soc_component_open/close() once"
Kuninori Morimoto
kuninori.morimoto.gx at renesas.com
Fri Feb 28 01:46:51 CET 2020
Hi Kai
Thank you for feedback
> thanks for the longer explanation. It's true we have a lot of code with
> for_each_xxx() loops, and loop logic where errors can occur. It seems the
> most common approach is to store the index and use for_each_xxx_rollback()
> macros to clean up in case error happens. This does lead to the problem of
> essentially duplicated logic e.g. for soc_pcm_close() and error handling
> of snd_pcm_open().
Thank you for understanding my headache.
My opinion is that complex duplicated code never bring luck to us.
> And yeah, it's also a bit error prone as the logic is
> not exactly the same. E.g. I'm not convinced this is quite right in
> soc_pcm_open():
>
> » for_each_rtd_codec_dai(rtd, i, codec_dai) {
> » » ret = snd_soc_dai_startup(codec_dai, substream);
> » » if (ret < 0) {
> » » » dev_err(codec_dai->dev,
> » » » » "ASoC: can't open codec %s: %d\n",
> » » » » codec_dai->name, ret);
> » » » goto config_err;
> » » }
> ...
> config_err:
> » for_each_rtd_codec_dai(rtd, i, codec_dai)
> » » snd_soc_dai_shutdown(codec_dai, substream);
> » i = rtd->num_cpus;
Yeah indeed.
I think this is just one of the BUG.
I guess we can find similar issue everywhere.
> Having a single cleanup path would be easier, but I think in the end it
> comes down to how cleanly you can track the opened state. It seems biggest
> issue is how to cleanly track the component-substream pairs. Ideally we'd
> have a dedicated state object to represent an opened component-substream
> pair, but that's not how the APIs are defined now. But something to that
> effect is needed.
Yeah, I can understand your concern, but not 100% yet.
In my understanding, counting start vs stop is not enough but not so bad.
If my understanding was correct, your concern is
counting only is not enough, because wrong component-substream pair
can be used, like this ?
start(substream-A); <=
start(substream-B);
start(substream-C);
stop(substream-Z); <=
stop(substream-B);
stop(substream-C);
But I wonder is it really happen ?
If there is clear such case, yes, we need to consider
component-substream pair list, somehow.
If you are worry about some kind of BUG, I guess we need to solve
is such bug, not error handling method.
But how about step-by-step approach (I like it :) ?
At first, add counting method as 1st step. Indeed it is not enough,
but we can cleanup error handling.
If we found/noticed above not-enough-case,
start to consider about component-substream pair list ?
Thank you for your help !!
Best regards
---
Kuninori Morimoto
More information about the Alsa-devel
mailing list