ALSA: core: Simplify snd_power_ref_and_wait() with the standard macro
Use wait_event_cmd() macro and simplify snd_power_ref_wait() implementation. This may also cover possible races in the current open code, too. Reviewed-by: Jaroslav Kysela <perex@perex.cz> Link: https://lore.kernel.org/r/20220119091050.30125-1-tiwai@suse.de Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
Родитель
85c25662d1
Коммит
8c0ae778e2
|
@ -1111,29 +1111,14 @@ EXPORT_SYMBOL(snd_card_file_remove);
|
|||
*/
|
||||
int snd_power_ref_and_wait(struct snd_card *card)
|
||||
{
|
||||
wait_queue_entry_t wait;
|
||||
int result = 0;
|
||||
|
||||
snd_power_ref(card);
|
||||
/* fastpath */
|
||||
if (snd_power_get_state(card) == SNDRV_CTL_POWER_D0)
|
||||
return 0;
|
||||
init_waitqueue_entry(&wait, current);
|
||||
add_wait_queue(&card->power_sleep, &wait);
|
||||
while (1) {
|
||||
if (card->shutdown) {
|
||||
result = -ENODEV;
|
||||
break;
|
||||
}
|
||||
if (snd_power_get_state(card) == SNDRV_CTL_POWER_D0)
|
||||
break;
|
||||
snd_power_unref(card);
|
||||
set_current_state(TASK_UNINTERRUPTIBLE);
|
||||
schedule_timeout(30 * HZ);
|
||||
snd_power_ref(card);
|
||||
}
|
||||
remove_wait_queue(&card->power_sleep, &wait);
|
||||
return result;
|
||||
wait_event_cmd(card->power_sleep,
|
||||
card->shutdown ||
|
||||
snd_power_get_state(card) == SNDRV_CTL_POWER_D0,
|
||||
snd_power_unref(card), snd_power_ref(card));
|
||||
return card->shutdown ? -ENODEV : 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_power_ref_and_wait);
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче