[alsa-devel] [PATCH] ASoC: dapm: fix module unload/reload failed issue by reset kcontrol's widget list
Takashi Iwai
tiwai at suse.de
Tue Jul 28 11:07:25 CEST 2015
On Tue, 28 Jul 2015 11:03:39 +0200,
Jie Yang wrote:
>
> We need reset the related kcontrol's widget list during the
> freeing of a widget, otherwise, the widget list may be outdated
> and reference to it may introduce errors(they usually occurs
> during driver modules unloading/reloading).
>
> Here adding a func dapm_update_kcontrols_of_freeing_widget and
> call it at dapm_update_kcontrols_of_freeing_widget, to fix those
> issues.
>
> Signed-off-by: Jie Yang <yang.jie at intel.com>
> ---
> sound/soc/soc-dapm.c | 31 +++++++++++++++++++++++++++++++
> 1 file changed, 31 insertions(+)
>
> diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c
> index aa327c9..1ad8144 100644
> --- a/sound/soc/soc-dapm.c
> +++ b/sound/soc/soc-dapm.c
> @@ -2305,6 +2305,35 @@ static void dapm_free_path(struct snd_soc_dapm_path *path)
> kfree(path);
> }
>
> +/* update all dapm kcontrols that related to a widget which being freed*/
> +static void dapm_update_kcontrols_of_freeing_widget(struct snd_soc_dapm_widget * w)
> +{
> + struct dapm_kcontrol_data *data = NULL;
> + int i, j, n;
> +
> + if (w && w->kcontrols) {
> + for (i = 0; i < w->num_kcontrols; i++) {
> + if (w->kcontrols[i] == NULL)
> + continue;
> + data = snd_kcontrol_chip(w->kcontrols[i]);
> + if (data == NULL)
> + continue;
> + for (j = 0, n = 0; j < data->wlist->num_widgets; j++) {
> + if (data->wlist->widgets[j] == w) {
> + data->wlist->widgets[j] = NULL;
> + n++;
> + }
> + }
> +
> + if (n) {
> + data->wlist->num_widgets -= n;
This looks buggy. You didn't rearrange widgets[] but just put a hole,
yet decreasing the number.
BTW, how does the reference occur while unloading? Or better to say:
isn't it the module refcount adjusted while accessing the resources?
thanks,
Takashi
More information about the Alsa-devel
mailing list