summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAmadeusz Sławiński <amadeuszx.slawinski@linux.intel.com>2022-01-12 18:00:30 +0100
committerMark Brown <broonie@kernel.org>2022-01-24 13:31:23 +0000
commitcc44c7492bad811dcb89f3f33f5aaacb564e1dfc (patch)
tree7fa3554d2db731ebb5b7d80d9a895a7a8903cb61
parentfeb00b736af64875560f371fe7f58b0b7f239046 (diff)
ASoC: topology: Optimize soc_tplg_dapm_graph_elems_load behavior
Before commit "ASoC: topology: Change allocations to resource managed" soc_tplg_dapm_graph_elems_load() used to free routes on error. During migration to managed allocations the routes table was left as is, but looking at it again it is unnecessary, so remove routes table and just keep pointer to DAPM route currently being set up. Also remove outdated comments which keep describing old behavior of remove_route() freeing memory. While it still does some cleanup, it leaves freeing memory to framework. Fixes: ff9226224437 ("ASoC: topology: Change allocations to resource managed") Signed-off-by: Amadeusz Sławiński <amadeuszx.slawinski@linux.intel.com> Reviewed-by: Cezary Rojewski <cezary.rojewski@intel.com> Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> Link: https://lore.kernel.org/r/20220112170030.569712-4-amadeuszx.slawinski@linux.intel.com Signed-off-by: Mark Brown <broonie@kernel.org>
-rw-r--r--sound/soc/soc-topology.c56
1 files changed, 14 insertions, 42 deletions
diff --git a/sound/soc/soc-topology.c b/sound/soc/soc-topology.c
index a9a9c46d0316a..72e50df7052c3 100644
--- a/sound/soc/soc-topology.c
+++ b/sound/soc/soc-topology.c
@@ -1094,7 +1094,7 @@ static int soc_tplg_dapm_graph_elems_load(struct soc_tplg *tplg,
{
struct snd_soc_dapm_context *dapm = &tplg->comp->dapm;
struct snd_soc_tplg_dapm_graph_elem *elem;
- struct snd_soc_dapm_route **routes;
+ struct snd_soc_dapm_route *route;
int count, i;
int ret = 0;
@@ -1108,24 +1108,10 @@ static int soc_tplg_dapm_graph_elems_load(struct soc_tplg *tplg,
dev_dbg(tplg->dev, "ASoC: adding %d DAPM routes for index %d\n", count,
hdr->index);
- /* allocate memory for pointer to array of dapm routes */
- routes = kcalloc(count, sizeof(struct snd_soc_dapm_route *),
- GFP_KERNEL);
- if (!routes)
- return -ENOMEM;
-
- /*
- * allocate memory for each dapm route in the array.
- * This needs to be done individually so that
- * each route can be freed when it is removed in remove_route().
- */
for (i = 0; i < count; i++) {
- routes[i] = devm_kzalloc(tplg->dev, sizeof(*routes[i]), GFP_KERNEL);
- if (!routes[i])
+ route = devm_kzalloc(tplg->dev, sizeof(*route), GFP_KERNEL);
+ if (!route)
return -ENOMEM;
- }
-
- for (i = 0; i < count; i++) {
elem = (struct snd_soc_tplg_dapm_graph_elem *)tplg->pos;
tplg->pos += sizeof(struct snd_soc_tplg_dapm_graph_elem);
@@ -1146,46 +1132,32 @@ static int soc_tplg_dapm_graph_elems_load(struct soc_tplg *tplg,
break;
}
- routes[i]->source = elem->source;
- routes[i]->sink = elem->sink;
+ route->source = elem->source;
+ route->sink = elem->sink;
/* set to NULL atm for tplg users */
- routes[i]->connected = NULL;
+ route->connected = NULL;
if (strnlen(elem->control, SNDRV_CTL_ELEM_ID_NAME_MAXLEN) == 0)
- routes[i]->control = NULL;
+ route->control = NULL;
else
- routes[i]->control = elem->control;
+ route->control = elem->control;
/* add route dobj to dobj_list */
- routes[i]->dobj.type = SND_SOC_DOBJ_GRAPH;
- routes[i]->dobj.ops = tplg->ops;
- routes[i]->dobj.index = tplg->index;
- list_add(&routes[i]->dobj.list, &tplg->comp->dobj_list);
+ route->dobj.type = SND_SOC_DOBJ_GRAPH;
+ route->dobj.ops = tplg->ops;
+ route->dobj.index = tplg->index;
+ list_add(&route->dobj.list, &tplg->comp->dobj_list);
- ret = soc_tplg_add_route(tplg, routes[i]);
+ ret = soc_tplg_add_route(tplg, route);
if (ret < 0) {
dev_err(tplg->dev, "ASoC: topology: add_route failed: %d\n", ret);
- /*
- * this route was added to the list, it will
- * be freed in remove_route() so increment the
- * counter to skip it in the error handling
- * below.
- */
- i++;
break;
}
/* add route, but keep going if some fail */
- snd_soc_dapm_add_routes(dapm, routes[i], 1);
+ snd_soc_dapm_add_routes(dapm, route, 1);
}
- /*
- * free pointer to array of dapm routes as this is no longer needed.
- * The memory allocated for each dapm route will be freed
- * when it is removed in remove_route().
- */
- kfree(routes);
-
return ret;
}