MLK-20094: ASoC: fsl: dsp: Fix crash in compress cleanup path
authorDaniel Baluta <daniel.baluta@nxp.com>
Fri, 2 Nov 2018 15:20:53 +0000 (17:20 +0200)
committerLeonard Crestez <leonard.crestez@nxp.com>
Thu, 18 Apr 2019 00:00:38 +0000 (03:00 +0300)
commita514a33e6d0166938ba8513e0a2ea8a87b144613
tree28da18a1bc83b06023a641f26ad610eb68e216a1
parent312acbfd7a3759ff0585fe4df990589bbf1742fc
MLK-20094: ASoC: fsl: dsp: Fix crash in compress cleanup path

We must find a way to no longer touch resources after they are
cleand up.

Now, after a stress test we get the following crash:

[ 2156.863772] fsl-dsp 596e8000.dsp: xf_pool_alloc failed
[ 2156.869337] Unable to handle kernel NULL pointer dereference at
virtual address 00000060
[ 2157.148594] [<ffff000008d8839c>] _raw_spin_lock+0x14/0x48
[ 2157.153995] [<ffff000008b3e0b8>] xf_cmd_send_recv_complete+0x40/0xf0
[ 2157.160354] [<ffff000008b3e470>] xf_close+0x40/0x88
[ 2157.165239] [<ffff000008b3f7a4>] xaf_comp_delete+0x5c/0x70
[ 2157.170730] [<ffff000008b40530>] dsp_platform_compr_free+0xa0/0xe8
[ 2157.176917] [<ffff000008b287fc>] soc_compr_free_fe+0x144/0x1a0
[ 2157.182754] [<ffff000008b11b24>] snd_compr_free+0x64/0x98

This happens because:

1) dsp_platform_process work handler waits in a loop for
   messages to arrive.
2) when cplay process finishes it cleans up most of the
   resources.
3) when another cplay process starts it reinitializes the
  resources including queues for example.
4) a message will be generated and kernel will crash because
   dsp_platform_process uses the older queues.

A solution for this is to make sure dsp_platform_process work loop
is stopped at cleanup time.

We use is_active state and signal dsp_platform_process handler to
finish because we are on the cleanup path.

While at it replace cancel_work with cancel_work sync to be sure
that work handler ends before going on with the rest of the cleanup.

Reviewed-by: Cosmin-Gabriel Samoila <cosmin.samoila@nxp.com>
Signed-off-by: Daniel Baluta <daniel.baluta@nxp.com>
(cherry picked from commit c0f7ef8eaf096523e9ebe3acd818e5f67fdb639f)
sound/soc/fsl/fsl_dsp.c
sound/soc/fsl/fsl_dsp_platform_compress.c
sound/soc/fsl/fsl_dsp_proxy.c
sound/soc/fsl/fsl_dsp_proxy.h