linux_dsm_epyc7002/sound
Pierre-Louis Bossart b450b87847
ASoC: core: don't increase component module refcount unconditionally
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@plb-XPS-13-9350:~# lsmod | grep snd_soc_skl
snd_soc_skl           110592  1

root@plb-XPS-13-9350:~# rmmod snd_soc_skl
rmmod: ERROR: Module snd_soc_skl is in use

Increasing the reference count during the component probe is not
useful. If the PCI/ACPI module is removed, the card will be removed
anyway.

To avoid breaking existing platforms and allowing Intel platforms to
safely deal with module load/unload cases, this patch introduces a
flag which needs to be set during the component initialization. This
is a strictly opt-in capability that should only be used when the
handling of the component module does not require a reference count
increase to prevent removal during use.

Note that this solution is not directly applicable to the legacy
Atom/SST driver, which uses a different device hierarchy. There are
however additional refcount issues which prevent the ACPI driver from
being removed. This is a different issue which would need a different
patch.

Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
2019-02-08 18:00:20 +00:00
..
ac97
aoa cross-tree: phase out dma_zalloc_coherent() 2019-01-08 07:58:37 -05:00
arm ASoC: pxa: switch to new ac97 bus support 2018-09-10 18:47:58 +01:00
atmel
core ASoC: Fixes for v5.0 2019-01-18 15:17:17 +01:00
drivers
firewire ALSA: bebob: fix model-id of unit for Apogee Ensemble 2018-12-19 14:36:35 +01:00
hda ALSA: HDA: export process_unsol_events() 2018-12-19 18:07:18 +01:00
i2c ALSA: i2c/cs8427: Fix int to char conversion 2018-10-18 15:44:08 +02:00
isa Remove 'type' argument from access_ok() function 2019-01-03 18:57:57 -08:00
mips ALSA: mips: Cleanup indirect PCM helper usages 2018-09-04 12:13:46 +02:00
oss
parisc
pci ALSA: hda - Add mute LED support for HP ProBook 470 G5 2019-01-21 15:31:04 +01:00
pcmcia
ppc ALSA: aoa: Use of_node_name_eq for node name comparisons 2018-12-06 10:54:54 +01:00
sh
soc ASoC: core: don't increase component module refcount unconditionally 2019-02-08 18:00:20 +00:00
sparc cross-tree: phase out dma_zalloc_coherent() 2019-01-08 07:58:37 -05:00
spi
synth ALSA: emux: Fix potential Spectre v1 vulnerabilities 2018-12-13 09:13:04 +01:00
usb ALSA: usb-audio: fix CM6206 register definitions 2019-01-08 22:51:44 +01:00
x86 Merge drm/drm-next into drm-intel-next-queued 2018-11-20 13:14:08 +02:00
xen ALSA: xen-front: Use Xen common shared buffer implementation 2018-12-18 12:19:37 -05:00
ac97_bus.c
Kconfig
last.c
Makefile
sound_core.c