ASoC: SOF: sof-audio: flag errors on pipeline teardown
authorPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Thu, 21 Apr 2022 20:31:55 +0000 (15:31 -0500)
committerMark Brown <broonie@kernel.org>
Mon, 25 Apr 2022 12:58:31 +0000 (13:58 +0100)
Before suspending, walk through all the widgets to make sure all
refcounts are zero. If not, the resume will not work and random errors
will be reported. Adding this paranoia check will help identify leaks
and broken sequences.

Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: Rander Wang <rander.wang@intel.com>
Reviewed-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
Reviewed-by: Péter Ujfalusi <peter.ujfalusi@linux.intel.com>
Reviewed-by: Bard Liao <yung-chuan.liao@linux.intel.com>
Link: https://lore.kernel.org/r/20220421203201.1550328-9-pierre-louis.bossart@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sof/ipc3-topology.c

index 572bcbfdb35664ce187bb776cb393ebd6f387324..3d00d371fbf312ee994441211a0097c517cccbf6 100644 (file)
@@ -2247,6 +2247,18 @@ static int sof_ipc3_tear_down_all_pipelines(struct snd_sof_dev *sdev, bool verif
        list_for_each_entry(sroute, &sdev->route_list, list)
                sroute->setup = false;
 
+       /*
+        * before suspending, make sure the refcounts are all zeroed out. There's no way
+        * to recover at this point but this will help root cause bad sequences leading to
+        * more issues on resume
+        */
+       list_for_each_entry(swidget, &sdev->widget_list, list) {
+               if (swidget->use_count != 0) {
+                       dev_err(sdev->dev, "%s: widget %s is still in use: count %d\n",
+                               __func__, swidget->widget->name, swidget->use_count);
+               }
+       }
+
        return 0;
 }