mirror of
https://github.com/raspberrypi/linux.git
synced 2025-12-27 12:32:50 +00:00
ALSA: pcm: Use guard() for locking
We can simplify the code gracefully with new guard() macro and co for automatic cleanup of locks. Only the code refactoring, and no functional changes. Signed-off-by: Takashi Iwai <tiwai@suse.de> Link: https://lore.kernel.org/r/20240227085306.9764-22-tiwai@suse.de
This commit is contained in:
@@ -91,9 +91,8 @@ static int snd_pcm_control_ioctl(struct snd_card *card,
|
||||
|
||||
if (get_user(device, (int __user *)arg))
|
||||
return -EFAULT;
|
||||
mutex_lock(®ister_mutex);
|
||||
device = snd_pcm_next(card, device);
|
||||
mutex_unlock(®ister_mutex);
|
||||
scoped_guard(mutex, ®ister_mutex)
|
||||
device = snd_pcm_next(card, device);
|
||||
if (put_user(device, (int __user *)arg))
|
||||
return -EFAULT;
|
||||
return 0;
|
||||
@@ -106,7 +105,6 @@ static int snd_pcm_control_ioctl(struct snd_card *card,
|
||||
struct snd_pcm *pcm;
|
||||
struct snd_pcm_str *pstr;
|
||||
struct snd_pcm_substream *substream;
|
||||
int err;
|
||||
|
||||
info = (struct snd_pcm_info __user *)arg;
|
||||
if (get_user(device, &info->device))
|
||||
@@ -118,35 +116,23 @@ static int snd_pcm_control_ioctl(struct snd_card *card,
|
||||
stream = array_index_nospec(stream, 2);
|
||||
if (get_user(subdevice, &info->subdevice))
|
||||
return -EFAULT;
|
||||
mutex_lock(®ister_mutex);
|
||||
guard(mutex)(®ister_mutex);
|
||||
pcm = snd_pcm_get(card, device);
|
||||
if (pcm == NULL) {
|
||||
err = -ENXIO;
|
||||
goto _error;
|
||||
}
|
||||
if (pcm == NULL)
|
||||
return -ENXIO;
|
||||
pstr = &pcm->streams[stream];
|
||||
if (pstr->substream_count == 0) {
|
||||
err = -ENOENT;
|
||||
goto _error;
|
||||
}
|
||||
if (subdevice >= pstr->substream_count) {
|
||||
err = -ENXIO;
|
||||
goto _error;
|
||||
}
|
||||
if (pstr->substream_count == 0)
|
||||
return -ENOENT;
|
||||
if (subdevice >= pstr->substream_count)
|
||||
return -ENXIO;
|
||||
for (substream = pstr->substream; substream;
|
||||
substream = substream->next)
|
||||
if (substream->number == (int)subdevice)
|
||||
break;
|
||||
if (substream == NULL) {
|
||||
err = -ENXIO;
|
||||
goto _error;
|
||||
}
|
||||
mutex_lock(&pcm->open_mutex);
|
||||
err = snd_pcm_info_user(substream, info);
|
||||
mutex_unlock(&pcm->open_mutex);
|
||||
_error:
|
||||
mutex_unlock(®ister_mutex);
|
||||
return err;
|
||||
if (substream == NULL)
|
||||
return -ENXIO;
|
||||
guard(mutex)(&pcm->open_mutex);
|
||||
return snd_pcm_info_user(substream, info);
|
||||
}
|
||||
case SNDRV_CTL_IOCTL_PCM_PREFER_SUBDEVICE:
|
||||
{
|
||||
@@ -389,15 +375,15 @@ static void snd_pcm_substream_proc_hw_params_read(struct snd_info_entry *entry,
|
||||
struct snd_pcm_substream *substream = entry->private_data;
|
||||
struct snd_pcm_runtime *runtime;
|
||||
|
||||
mutex_lock(&substream->pcm->open_mutex);
|
||||
guard(mutex)(&substream->pcm->open_mutex);
|
||||
runtime = substream->runtime;
|
||||
if (!runtime) {
|
||||
snd_iprintf(buffer, "closed\n");
|
||||
goto unlock;
|
||||
return;
|
||||
}
|
||||
if (runtime->state == SNDRV_PCM_STATE_OPEN) {
|
||||
snd_iprintf(buffer, "no setup\n");
|
||||
goto unlock;
|
||||
return;
|
||||
}
|
||||
snd_iprintf(buffer, "access: %s\n", snd_pcm_access_name(runtime->access));
|
||||
snd_iprintf(buffer, "format: %s\n", snd_pcm_format_name(runtime->format));
|
||||
@@ -416,8 +402,6 @@ static void snd_pcm_substream_proc_hw_params_read(struct snd_info_entry *entry,
|
||||
snd_iprintf(buffer, "OSS period frames: %lu\n", (unsigned long)runtime->oss.period_frames);
|
||||
}
|
||||
#endif
|
||||
unlock:
|
||||
mutex_unlock(&substream->pcm->open_mutex);
|
||||
}
|
||||
|
||||
static void snd_pcm_substream_proc_sw_params_read(struct snd_info_entry *entry,
|
||||
@@ -426,15 +410,15 @@ static void snd_pcm_substream_proc_sw_params_read(struct snd_info_entry *entry,
|
||||
struct snd_pcm_substream *substream = entry->private_data;
|
||||
struct snd_pcm_runtime *runtime;
|
||||
|
||||
mutex_lock(&substream->pcm->open_mutex);
|
||||
guard(mutex)(&substream->pcm->open_mutex);
|
||||
runtime = substream->runtime;
|
||||
if (!runtime) {
|
||||
snd_iprintf(buffer, "closed\n");
|
||||
goto unlock;
|
||||
return;
|
||||
}
|
||||
if (runtime->state == SNDRV_PCM_STATE_OPEN) {
|
||||
snd_iprintf(buffer, "no setup\n");
|
||||
goto unlock;
|
||||
return;
|
||||
}
|
||||
snd_iprintf(buffer, "tstamp_mode: %s\n", snd_pcm_tstamp_mode_name(runtime->tstamp_mode));
|
||||
snd_iprintf(buffer, "period_step: %u\n", runtime->period_step);
|
||||
@@ -444,8 +428,6 @@ static void snd_pcm_substream_proc_sw_params_read(struct snd_info_entry *entry,
|
||||
snd_iprintf(buffer, "silence_threshold: %lu\n", runtime->silence_threshold);
|
||||
snd_iprintf(buffer, "silence_size: %lu\n", runtime->silence_size);
|
||||
snd_iprintf(buffer, "boundary: %lu\n", runtime->boundary);
|
||||
unlock:
|
||||
mutex_unlock(&substream->pcm->open_mutex);
|
||||
}
|
||||
|
||||
static void snd_pcm_substream_proc_status_read(struct snd_info_entry *entry,
|
||||
@@ -456,17 +438,17 @@ static void snd_pcm_substream_proc_status_read(struct snd_info_entry *entry,
|
||||
struct snd_pcm_status64 status;
|
||||
int err;
|
||||
|
||||
mutex_lock(&substream->pcm->open_mutex);
|
||||
guard(mutex)(&substream->pcm->open_mutex);
|
||||
runtime = substream->runtime;
|
||||
if (!runtime) {
|
||||
snd_iprintf(buffer, "closed\n");
|
||||
goto unlock;
|
||||
return;
|
||||
}
|
||||
memset(&status, 0, sizeof(status));
|
||||
err = snd_pcm_status64(substream, &status);
|
||||
if (err < 0) {
|
||||
snd_iprintf(buffer, "error %d\n", err);
|
||||
goto unlock;
|
||||
return;
|
||||
}
|
||||
snd_iprintf(buffer, "state: %s\n", snd_pcm_state_name(status.state));
|
||||
snd_iprintf(buffer, "owner_pid : %d\n", pid_vnr(substream->pid));
|
||||
@@ -480,8 +462,6 @@ static void snd_pcm_substream_proc_status_read(struct snd_info_entry *entry,
|
||||
snd_iprintf(buffer, "-----\n");
|
||||
snd_iprintf(buffer, "hw_ptr : %ld\n", runtime->status->hw_ptr);
|
||||
snd_iprintf(buffer, "appl_ptr : %ld\n", runtime->control->appl_ptr);
|
||||
unlock:
|
||||
mutex_unlock(&substream->pcm->open_mutex);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SND_PCM_XRUN_DEBUG
|
||||
@@ -1009,9 +989,8 @@ void snd_pcm_detach_substream(struct snd_pcm_substream *substream)
|
||||
kfree(runtime->hw_constraints.rules);
|
||||
/* Avoid concurrent access to runtime via PCM timer interface */
|
||||
if (substream->timer) {
|
||||
spin_lock_irq(&substream->timer->lock);
|
||||
substream->runtime = NULL;
|
||||
spin_unlock_irq(&substream->timer->lock);
|
||||
scoped_guard(spinlock_irq, &substream->timer->lock)
|
||||
substream->runtime = NULL;
|
||||
} else {
|
||||
substream->runtime = NULL;
|
||||
}
|
||||
@@ -1068,10 +1047,10 @@ static int snd_pcm_dev_register(struct snd_device *device)
|
||||
return -ENXIO;
|
||||
pcm = device->device_data;
|
||||
|
||||
mutex_lock(®ister_mutex);
|
||||
guard(mutex)(®ister_mutex);
|
||||
err = snd_pcm_add(pcm);
|
||||
if (err)
|
||||
goto unlock;
|
||||
return err;
|
||||
for (cidx = 0; cidx < 2; cidx++) {
|
||||
int devtype = -1;
|
||||
if (pcm->streams[cidx].substream == NULL)
|
||||
@@ -1090,7 +1069,7 @@ static int snd_pcm_dev_register(struct snd_device *device)
|
||||
pcm->streams[cidx].dev);
|
||||
if (err < 0) {
|
||||
list_del_init(&pcm->list);
|
||||
goto unlock;
|
||||
return err;
|
||||
}
|
||||
|
||||
for (substream = pcm->streams[cidx].substream; substream; substream = substream->next)
|
||||
@@ -1098,9 +1077,6 @@ static int snd_pcm_dev_register(struct snd_device *device)
|
||||
}
|
||||
|
||||
pcm_call_notify(pcm, n_register);
|
||||
|
||||
unlock:
|
||||
mutex_unlock(®ister_mutex);
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -1110,8 +1086,8 @@ static int snd_pcm_dev_disconnect(struct snd_device *device)
|
||||
struct snd_pcm_substream *substream;
|
||||
int cidx;
|
||||
|
||||
mutex_lock(®ister_mutex);
|
||||
mutex_lock(&pcm->open_mutex);
|
||||
guard(mutex)(®ister_mutex);
|
||||
guard(mutex)(&pcm->open_mutex);
|
||||
wake_up(&pcm->open_wait);
|
||||
list_del_init(&pcm->list);
|
||||
|
||||
@@ -1138,8 +1114,6 @@ static int snd_pcm_dev_disconnect(struct snd_device *device)
|
||||
snd_unregister_device(pcm->streams[cidx].dev);
|
||||
free_chmap(&pcm->streams[cidx]);
|
||||
}
|
||||
mutex_unlock(&pcm->open_mutex);
|
||||
mutex_unlock(®ister_mutex);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1164,7 +1138,7 @@ int snd_pcm_notify(struct snd_pcm_notify *notify, int nfree)
|
||||
!notify->n_unregister ||
|
||||
!notify->n_disconnect))
|
||||
return -EINVAL;
|
||||
mutex_lock(®ister_mutex);
|
||||
guard(mutex)(®ister_mutex);
|
||||
if (nfree) {
|
||||
list_del(¬ify->list);
|
||||
list_for_each_entry(pcm, &snd_pcm_devices, list)
|
||||
@@ -1174,7 +1148,6 @@ int snd_pcm_notify(struct snd_pcm_notify *notify, int nfree)
|
||||
list_for_each_entry(pcm, &snd_pcm_devices, list)
|
||||
notify->n_register(pcm);
|
||||
}
|
||||
mutex_unlock(®ister_mutex);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(snd_pcm_notify);
|
||||
@@ -1190,7 +1163,7 @@ static void snd_pcm_proc_read(struct snd_info_entry *entry,
|
||||
{
|
||||
struct snd_pcm *pcm;
|
||||
|
||||
mutex_lock(®ister_mutex);
|
||||
guard(mutex)(®ister_mutex);
|
||||
list_for_each_entry(pcm, &snd_pcm_devices, list) {
|
||||
snd_iprintf(buffer, "%02i-%02i: %s : %s",
|
||||
pcm->card->number, pcm->device, pcm->id, pcm->name);
|
||||
@@ -1202,7 +1175,6 @@ static void snd_pcm_proc_read(struct snd_info_entry *entry,
|
||||
pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream_count);
|
||||
snd_iprintf(buffer, "\n");
|
||||
}
|
||||
mutex_unlock(®ister_mutex);
|
||||
}
|
||||
|
||||
static struct snd_info_entry *snd_pcm_proc_entry;
|
||||
|
||||
Reference in New Issue
Block a user