[PATCH 2/2] ASoC: topology: remove the redundant pass checks

Keyon Jie yang.jie at linux.intel.com
Mon May 18 11:40:08 CEST 2020



On 5/13/20 10:36 AM, Keyon Jie wrote:
> 
> 
> On 5/13/20 3:40 AM, Pierre-Louis Bossart wrote:
>>
>>
>> On 5/12/20 1:23 PM, Keyon Jie wrote:
>>> As we have check the 'pass' in the soc_elem_pass_load(), so no need to
>>> check it again in each specific elem_load function, at the same time,
>>> the tplg->pos will be reset to the next header base when the pass is
>>> mismatched, so the increasing of the tplg->pos in these cases made no
>>> sense. Here remove all of them.
>>
>> Sorry Keyon, I am not comfortable with the changes. This started as a 
>> removal of a debug log and we ended-up changing the execution flow in 
>> one of the more complex parts of the ASoC framework.
>> I spent 30mn looking at the code and I don't have a feeling all corner 
>> cases are covered. The bar for core changes is higher, it'd help to 
>> have additional explanations or evidence that your proposal was tested 
>> extensively. You may be right but we should be careful with topology 
>> changes.
> 
> Maybe I should send these 2 patches separately, this 2nd one is actually 
> fix for a long existed issue and it is exposed to me when writing the 
> 1st commit:
> 1. the check of "if (tplg->pass != SOC_TPLG_PASS_xxx" was good and it 
> acted as the correct filter of the pass, but
> 2. the increment "tplg->pos += le32_to_cpu(hdr->size) + 
> le32_to_cpu(hdr->payload_size);" was actually wrong when it the pass is 
> unmatched in #1, it should be "tplg->pos += 
> le32_to_cpu(hdr->payload_size);" as the "hdr->size" was already 
> calculated in the upper layer in soc_tplg_load_header():
> "tplg->pos = tplg->hdr_pos + sizeof(struct snd_soc_tplg_hdr);".
> 3. the exited mistake described in #2 didn't triggered any real problems 
> as the "tplg->pos" will be reset to new value in soc_tplg_load_header() 
> when the next header comes, so increasing the "tplg->pos" here at the 
> end of the current header check actually make no sense, we can just 
> remove them.
> 
> The code changes here might make you nervous but the logic here is not 
> that complicated, if you rule out the issue I mentioned above in #2 and 
> #3, the remained changes here is only removing the checks "if 
> (tplg->pass != SOC_TPLG_PASS_xxx" as they are already covered by the 1st 
> commit.
> 
> I have tested these changes with 3 typical SOF topology files (nocodec, 
> tgl i2s + dsm, hda-generic) and it works all fine there and the correct 
> header information are logged with the changes, agree we should test 
> more extensively and widely, so tests on SST driver are very welcomed.

+ Cezary from the SST driver side.

Hi Cezary, can you help to check this from the SST driver side?

Thanks,
~Keyon

> 
> So in short, I did these changes together since I am already here, but 
> if you and Mark preferred, I can split out the fix for the "tplg->pos" 
> increment and send it ahead.
> 
> Thanks,
> ~Keyon
> 
>>
>>>
>>> Signed-off-by: Keyon Jie <yang.jie at linux.intel.com>
>>> ---
>>>   sound/soc/soc-topology.c | 46 ++--------------------------------------
>>>   1 file changed, 2 insertions(+), 44 deletions(-)
>>>
>>> diff --git a/sound/soc/soc-topology.c b/sound/soc/soc-topology.c
>>> index b3dae319c108..682ffaa85e9e 100644
>>> --- a/sound/soc/soc-topology.c
>>> +++ b/sound/soc/soc-topology.c
>>> @@ -246,8 +246,8 @@ static inline void soc_control_err(struct 
>>> soc_tplg *tplg,
>>>   }
>>>   /* pass vendor data to component driver for processing */
>>> -static int soc_tplg_vendor_load_(struct soc_tplg *tplg,
>>> -    struct snd_soc_tplg_hdr *hdr)
>>> +static int soc_tplg_vendor_load(struct soc_tplg *tplg,
>>> +                struct snd_soc_tplg_hdr *hdr)
>>>   {
>>>       int ret = 0;
>>> @@ -268,16 +268,6 @@ static int soc_tplg_vendor_load_(struct soc_tplg 
>>> *tplg,
>>>       return ret;
>>>   }
>>> -/* pass vendor data to component driver for processing */
>>> -static int soc_tplg_vendor_load(struct soc_tplg *tplg,
>>> -    struct snd_soc_tplg_hdr *hdr)
>>> -{
>>> -    if (tplg->pass != SOC_TPLG_PASS_VENDOR)
>>> -        return 0;
>>> -
>>> -    return soc_tplg_vendor_load_(tplg, hdr);
>>> -}
>>> -
>>>   /* optionally pass new dynamic widget to component driver. This is 
>>> mainly for
>>>    * external widgets where we can assign private data/ops */
>>>   static int soc_tplg_widget_load(struct soc_tplg *tplg,
>>> @@ -1127,12 +1117,6 @@ static int soc_tplg_kcontrol_elems_load(struct 
>>> soc_tplg *tplg,
>>>       int ret;
>>>       int i;
>>> -    if (tplg->pass != SOC_TPLG_PASS_MIXER) {
>>> -        tplg->pos += le32_to_cpu(hdr->size) +
>>> -            le32_to_cpu(hdr->payload_size);
>>> -        return 0;
>>> -    }
>>> -
>>>       dev_dbg(tplg->dev, "ASoC: adding %d kcontrols at 0x%lx\n", 
>>> hdr->count,
>>>           soc_tplg_get_offset(tplg));
>>> @@ -1204,14 +1188,6 @@ static int 
>>> soc_tplg_dapm_graph_elems_load(struct soc_tplg *tplg,
>>>       count = le32_to_cpu(hdr->count);
>>> -    if (tplg->pass != SOC_TPLG_PASS_GRAPH) {
>>> -        tplg->pos +=
>>> -            le32_to_cpu(hdr->size) +
>>> -            le32_to_cpu(hdr->payload_size);
>>> -
>>> -        return 0;
>>> -    }
>>> -
>>>       if (soc_tplg_check_elem_count(tplg,
>>>           sizeof(struct snd_soc_tplg_dapm_graph_elem),
>>>           count, le32_to_cpu(hdr->payload_size), "graph")) {
>>> @@ -1741,9 +1717,6 @@ static int 
>>> soc_tplg_dapm_widget_elems_load(struct soc_tplg *tplg,
>>>       count = le32_to_cpu(hdr->count);
>>> -    if (tplg->pass != SOC_TPLG_PASS_WIDGET)
>>> -        return 0;
>>> -
>>>       dev_dbg(tplg->dev, "ASoC: adding %d DAPM widgets\n", count);
>>>       for (i = 0; i < count; i++) {
>>> @@ -2101,9 +2074,6 @@ static int soc_tplg_pcm_elems_load(struct 
>>> soc_tplg *tplg,
>>>       count = le32_to_cpu(hdr->count);
>>> -    if (tplg->pass != SOC_TPLG_PASS_PCM_DAI)
>>> -        return 0;
>>> -
>>>       /* check the element size and count */
>>>       pcm = (struct snd_soc_tplg_pcm *)tplg->pos;
>>>       size = le32_to_cpu(pcm->size);
>>> @@ -2386,12 +2356,6 @@ static int soc_tplg_link_elems_load(struct 
>>> soc_tplg *tplg,
>>>       count = le32_to_cpu(hdr->count);
>>> -    if (tplg->pass != SOC_TPLG_PASS_LINK) {
>>> -        tplg->pos += le32_to_cpu(hdr->size) +
>>> -            le32_to_cpu(hdr->payload_size);
>>> -        return 0;
>>> -    }
>>> -
>>>       /* check the element size and count */
>>>       link = (struct snd_soc_tplg_link_config *)tplg->pos;
>>>       size = le32_to_cpu(link->size);
>>> @@ -2528,9 +2492,6 @@ static int soc_tplg_dai_elems_load(struct 
>>> soc_tplg *tplg,
>>>       count = le32_to_cpu(hdr->count);
>>> -    if (tplg->pass != SOC_TPLG_PASS_BE_DAI)
>>> -        return 0;
>>> -
>>>       /* config the existing BE DAIs */
>>>       for (i = 0; i < count; i++) {
>>>           dai = (struct snd_soc_tplg_dai *)tplg->pos;
>>> @@ -2610,9 +2571,6 @@ static int soc_tplg_manifest_load(struct 
>>> soc_tplg *tplg,
>>>       bool abi_match;
>>>       int ret = 0;
>>> -    if (tplg->pass != SOC_TPLG_PASS_MANIFEST)
>>> -        return 0;
>>> -
>>>       manifest = (struct snd_soc_tplg_manifest *)tplg->pos;
>>>       /* check ABI version by size, create a new manifest if abi not 
>>> match */
>>>


More information about the Alsa-devel mailing list