[alsa-devel] [RFC PATCH 1/2] ASoC: core: don't increase component module refcount unconditionally
Pierre-Louis Bossart
pierre-louis.bossart at linux.intel.com
Tue Feb 5 16:09:19 CET 2019
On 2/4/19 10:25 PM, Vinod Koul wrote:
> On 01-02-19, 12:07, Ranjani Sridharan wrote:
>> On Fri, 2019-02-01 at 23:42 +0530, Vinod Koul wrote:
>>> On 01-02-19, 11:22, Pierre-Louis Bossart wrote:
>>>> The ASoC core has for the longest time increased the module
>>>> reference
>>>> counts, even before the transition to the component model. This is
>>>> probably fine on most platforms, but it introduces a deadlock case
>>>> on
>>>> Intel devices with the Skylake and SOF drivers which cannot be
>>>> removed
>>>> due to their reference counts being modified by the core.
>>>>
>>>> In these 2 cases, the PCI or ACPI driver .probe creates a platform
>>>> device to let the machine driver .probe register the audio
>>>> card. Conversely the PCI or ACPI driver .remove will unregister the
>>>> platform device which results in the card being removed by the
>>>> machine
>>>> driver .remove.
>>>>
>>>> With ascii art, this can be represented as
>>>>
>>>> modprobe
>>>> snd_soc_skl/
>>>> soc-pci-dev/sof-acpci-dev ----------> pci/acpi probe
>>>> ^ |
>>>> | ---------------|
>>>> | | |
>>>> | V V
>>>> increase register register machine
>>>> refcount component platform_device
>>>> ^ |
>>>> | |
>>>> | V
>>>> component <---- register card <---- probe
>>>> probe
>>>>
>>>> The issue is that by playing with the component's module reference
>>>> counts during the card registration, it's no longer possible to
>>>> remove
>>>> the module which controls the component. This can be shown, e.g.
>>>> with
>>>> the following error:
>>>>
>>>> root at plb-XPS-13-9350:~# lsmod | grep snd_soc_skl
>>>> snd_soc_skl 110592 1
>>>>
>>>> root at plb-XPS-13-9350:~# rmmod snd_soc_skl
>>>> rmmod: ERROR: Module snd_soc_skl is in use
>>> Yup, that would be correct, the inuse is due to the fact the sound
>>> card
>>> is up and someone needs to unload the sound card to remove the
>>> reference.
>>>
>>> That can be done by doing the rmmod of machine driver first and IIRC
>>> that would remove the sound card and drop the reference and then
>>> snd_soc_skl can be unloaded.
>> This doesnt seem to be the case though. The machine driver module
>> cannot be removed either because its refcnt is also > 0.
> At least this used to be the case when I used to try removal of modules
> on skl, doing the reverse of load order seemed to work for me back then.
Unfortunately module unload is broken with the skylake driver (kernel
oops left and right), so there's no way of verifying your
assertion...Other folks are trying to restore the capability but it's
not been working for a very long time.
Beyond the conceptual issue with the reference count, my other worry is
that the topology is created by the Skylake driver driver but freed when
you remove the card, so you end-up with non-sensical data structures and
configurations when you remove the skl driver. it's *really* recommended
to remove the component which instantiated the topology first before
removing the card.
More information about the Alsa-devel
mailing list