[alsa-devel] [PATCH v4 07/14] ASoC: SOF: Add DSP firmware logger support
Takashi Iwai
tiwai at suse.de
Thu Feb 14 14:19:08 CET 2019
On Wed, 13 Feb 2019 23:07:27 +0100,
Pierre-Louis Bossart wrote:
>
> +static size_t sof_wait_trace_avail(struct snd_sof_dev *sdev,
> + loff_t pos, size_t buffer_size)
> +{
> + wait_queue_entry_t wait;
> +
> + /*
> + * If host offset is less than local pos, it means write pointer of
> + * host DMA buffer has been wrapped. We should output the trace data
> + * at the end of host DMA buffer at first.
> + */
> + if (sdev->host_offset < pos)
> + return buffer_size - pos;
> +
> + /* If there is available trace data now, it is unnecessary to wait. */
> + if (sdev->host_offset > pos)
> + return sdev->host_offset - pos;
> +
> + /* wait for available trace data from FW */
> + init_waitqueue_entry(&wait, current);
> + set_current_state(TASK_INTERRUPTIBLE);
> + add_wait_queue(&sdev->trace_sleep, &wait);
> +
> + if (signal_pending(current)) {
> + remove_wait_queue(&sdev->trace_sleep, &wait);
> + } else {
> + /* set timeout to max value, no error code */
> + schedule_timeout(MAX_SCHEDULE_TIMEOUT);
> + remove_wait_queue(&sdev->trace_sleep, &wait);
> + }
Can be slightly optimized here, e.g. no need of two
remove_wait_queue() calls.
> +
> + /* return bytes available for copy */
> + if (sdev->host_offset < pos)
> + return buffer_size - pos;
> +
> + return sdev->host_offset - pos;
Are these sdev->host_offset accesses race-free?
If I understand correctly, snd_sof_trace_update_pos() can be called at
any time, and the offset might become inconsistent during these
multiple references.
thanks,
Takashi
More information about the Alsa-devel
mailing list