Skip to content

Commit 8c0ae77

Browse files
committed
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>
1 parent 85c2566 commit 8c0ae77

File tree

1 file changed

+5
-20
lines changed

1 file changed

+5
-20
lines changed

sound/core/init.c

Lines changed: 5 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1111,29 +1111,14 @@ EXPORT_SYMBOL(snd_card_file_remove);
11111111
*/
11121112
int snd_power_ref_and_wait(struct snd_card *card)
11131113
{
1114-
wait_queue_entry_t wait;
1115-
int result = 0;
1116-
11171114
snd_power_ref(card);
1118-
/* fastpath */
11191115
if (snd_power_get_state(card) == SNDRV_CTL_POWER_D0)
11201116
return 0;
1121-
init_waitqueue_entry(&wait, current);
1122-
add_wait_queue(&card->power_sleep, &wait);
1123-
while (1) {
1124-
if (card->shutdown) {
1125-
result = -ENODEV;
1126-
break;
1127-
}
1128-
if (snd_power_get_state(card) == SNDRV_CTL_POWER_D0)
1129-
break;
1130-
snd_power_unref(card);
1131-
set_current_state(TASK_UNINTERRUPTIBLE);
1132-
schedule_timeout(30 * HZ);
1133-
snd_power_ref(card);
1134-
}
1135-
remove_wait_queue(&card->power_sleep, &wait);
1136-
return result;
1117+
wait_event_cmd(card->power_sleep,
1118+
card->shutdown ||
1119+
snd_power_get_state(card) == SNDRV_CTL_POWER_D0,
1120+
snd_power_unref(card), snd_power_ref(card));
1121+
return card->shutdown ? -ENODEV : 0;
11371122
}
11381123
EXPORT_SYMBOL_GPL(snd_power_ref_and_wait);
11391124

0 commit comments

Comments
 (0)