mirror of https://gitee.com/openkylin/linux.git
ASoC: soc-pcm: move dpcm_path_put() to soc-pcm.c
dpcm_path_put() (A) is calling kfree(*list). The freed list is created by dapm_widget_list_create() (B) which is called from snd_soc_dapm_dai_get_connected_widgets() (C) which is called from dpcm_path_get() (D). (B) dapm_widget_list_create(**list, ...) { ... => *list = kzalloc(); ... } (C) snd_soc_dapm_dai_get_connected_widgets(..., **list, ...) { ... dapm_widget_list_create(list, ...); ... } (D) dpcm_path_get(..., **list) { ... snd_soc_dapm_dai_get_connected_widgets(..., list, ...); ... } (A) dpcm_path_put(**list) { => kfree(*list); } This kind of unbalance code is very difficult to read/understand. To avoid this issue, this patch adds each missing paired function dapm_widget_list_free() for dapm_widget_list_create() (B), and snd_soc_dapm_dai_free_widgets() for snd_soc_dapm_dai_get_connected_widgets() (C). This patch uses these, and moves dpcm_path_put() next to dpcm_path_get(). Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> Link: https://lore.kernel.org/r/87a75fjc9q.wl-kuninori.morimoto.gx@renesas.com Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
580dff3636
commit
52645e332d
|
@ -484,6 +484,7 @@ int snd_soc_dapm_dai_get_connected_widgets(struct snd_soc_dai *dai, int stream,
|
||||||
struct snd_soc_dapm_widget_list **list,
|
struct snd_soc_dapm_widget_list **list,
|
||||||
bool (*custom_stop_condition)(struct snd_soc_dapm_widget *,
|
bool (*custom_stop_condition)(struct snd_soc_dapm_widget *,
|
||||||
enum snd_soc_dapm_direction));
|
enum snd_soc_dapm_direction));
|
||||||
|
void snd_soc_dapm_dai_free_widgets(struct snd_soc_dapm_widget_list **list);
|
||||||
|
|
||||||
struct snd_soc_dapm_context *snd_soc_dapm_kcontrol_dapm(
|
struct snd_soc_dapm_context *snd_soc_dapm_kcontrol_dapm(
|
||||||
struct snd_kcontrol *kcontrol);
|
struct snd_kcontrol *kcontrol);
|
||||||
|
|
|
@ -145,6 +145,7 @@ static inline void soc_dpcm_debugfs_add(struct snd_soc_pcm_runtime *rtd)
|
||||||
|
|
||||||
int dpcm_path_get(struct snd_soc_pcm_runtime *fe,
|
int dpcm_path_get(struct snd_soc_pcm_runtime *fe,
|
||||||
int stream, struct snd_soc_dapm_widget_list **list_);
|
int stream, struct snd_soc_dapm_widget_list **list_);
|
||||||
|
void dpcm_path_put(struct snd_soc_dapm_widget_list **list);
|
||||||
int dpcm_process_paths(struct snd_soc_pcm_runtime *fe,
|
int dpcm_process_paths(struct snd_soc_pcm_runtime *fe,
|
||||||
int stream, struct snd_soc_dapm_widget_list **list, int new);
|
int stream, struct snd_soc_dapm_widget_list **list, int new);
|
||||||
int dpcm_be_dai_startup(struct snd_soc_pcm_runtime *fe, int stream);
|
int dpcm_be_dai_startup(struct snd_soc_pcm_runtime *fe, int stream);
|
||||||
|
@ -158,10 +159,4 @@ int dpcm_be_dai_prepare(struct snd_soc_pcm_runtime *fe, int stream);
|
||||||
int dpcm_dapm_stream_event(struct snd_soc_pcm_runtime *fe, int dir,
|
int dpcm_dapm_stream_event(struct snd_soc_pcm_runtime *fe, int dir,
|
||||||
int event);
|
int event);
|
||||||
|
|
||||||
static inline void dpcm_path_put(struct snd_soc_dapm_widget_list **list)
|
|
||||||
{
|
|
||||||
kfree(*list);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1105,6 +1105,11 @@ static int snd_soc_dapm_suspend_check(struct snd_soc_dapm_widget *widget)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void dapm_widget_list_free(struct snd_soc_dapm_widget_list **list)
|
||||||
|
{
|
||||||
|
kfree(*list);
|
||||||
|
}
|
||||||
|
|
||||||
static int dapm_widget_list_create(struct snd_soc_dapm_widget_list **list,
|
static int dapm_widget_list_create(struct snd_soc_dapm_widget_list **list,
|
||||||
struct list_head *widgets)
|
struct list_head *widgets)
|
||||||
{
|
{
|
||||||
|
@ -1310,6 +1315,11 @@ int snd_soc_dapm_dai_get_connected_widgets(struct snd_soc_dai *dai, int stream,
|
||||||
return paths;
|
return paths;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void snd_soc_dapm_dai_free_widgets(struct snd_soc_dapm_widget_list **list)
|
||||||
|
{
|
||||||
|
dapm_widget_list_free(list);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Handler for regulator supply widget.
|
* Handler for regulator supply widget.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -1302,6 +1302,11 @@ int dpcm_path_get(struct snd_soc_pcm_runtime *fe,
|
||||||
return paths;
|
return paths;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void dpcm_path_put(struct snd_soc_dapm_widget_list **list)
|
||||||
|
{
|
||||||
|
snd_soc_dapm_dai_free_widgets(list);
|
||||||
|
}
|
||||||
|
|
||||||
static int dpcm_prune_paths(struct snd_soc_pcm_runtime *fe, int stream,
|
static int dpcm_prune_paths(struct snd_soc_pcm_runtime *fe, int stream,
|
||||||
struct snd_soc_dapm_widget_list **list_)
|
struct snd_soc_dapm_widget_list **list_)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue