• Takashi Iwai's avatar
    ALSA: hda - Fix another race in runtime PM refcounting · c3aeda62
    Takashi Iwai authored
    Although some races in runtime PM refcount was fixed by the commit
    [664c7155: ALSA: hda - Work around races of power up/down with
    runtime PM], there is still a race in the following case:
    
    CPU0:                   CPU1 :
    runtime suspend:
      codec->in_pm = 1
                            snd_hdac_power_up_pm():
                              pm_runtime_get_sync() skipped
    suspend finished:
      codec->in_pm = 0
                            snd_hdac_power_down_pm():
                              pm_runtime_put_*() is called!
    
    For avoiding this situation, increment in_pm flag atomically when it's
    non-zero, and decrement accordingly, to ensure that in_pm is set
    consistently for the whole concurrent operations.
    
    Also, since atomic_inc_not_zero() and atomic_dec_if_positive() are
    lengthy inline functions, move snd_hdac_power_up_pm() and _down_pm()
    to sound/hda/hdac_device.c as no inline functions.
    Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
    c3aeda62
hdac_device.c 14.8 KB