mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-15 16:24:13 +08:00
ALSA: firewire-lib: optimize packet flushing
Trying to flush completed packets is pointless when the pointer callback was called from the packet completion callback; avoid it. Signed-off-by: Clemens Ladisch <clemens@ladisch.de> Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
e9148dddc3
commit
92b862c7d6
@ -178,6 +178,7 @@ void amdtp_out_stream_pcm_prepare(struct amdtp_out_stream *s)
|
|||||||
tasklet_kill(&s->period_tasklet);
|
tasklet_kill(&s->period_tasklet);
|
||||||
s->pcm_buffer_pointer = 0;
|
s->pcm_buffer_pointer = 0;
|
||||||
s->pcm_period_pointer = 0;
|
s->pcm_period_pointer = 0;
|
||||||
|
s->pointer_flush = true;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(amdtp_out_stream_pcm_prepare);
|
EXPORT_SYMBOL(amdtp_out_stream_pcm_prepare);
|
||||||
|
|
||||||
@ -393,6 +394,7 @@ static void queue_out_packet(struct amdtp_out_stream *s, unsigned int cycle)
|
|||||||
s->pcm_period_pointer += data_blocks;
|
s->pcm_period_pointer += data_blocks;
|
||||||
if (s->pcm_period_pointer >= pcm->runtime->period_size) {
|
if (s->pcm_period_pointer >= pcm->runtime->period_size) {
|
||||||
s->pcm_period_pointer -= pcm->runtime->period_size;
|
s->pcm_period_pointer -= pcm->runtime->period_size;
|
||||||
|
s->pointer_flush = false;
|
||||||
tasklet_hi_schedule(&s->period_tasklet);
|
tasklet_hi_schedule(&s->period_tasklet);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -539,7 +541,11 @@ EXPORT_SYMBOL(amdtp_out_stream_start);
|
|||||||
*/
|
*/
|
||||||
unsigned long amdtp_out_stream_pcm_pointer(struct amdtp_out_stream *s)
|
unsigned long amdtp_out_stream_pcm_pointer(struct amdtp_out_stream *s)
|
||||||
{
|
{
|
||||||
|
/* this optimization is allowed to be racy */
|
||||||
|
if (s->pointer_flush)
|
||||||
fw_iso_context_flush_completions(s->context);
|
fw_iso_context_flush_completions(s->context);
|
||||||
|
else
|
||||||
|
s->pointer_flush = true;
|
||||||
|
|
||||||
return ACCESS_ONCE(s->pcm_buffer_pointer);
|
return ACCESS_ONCE(s->pcm_buffer_pointer);
|
||||||
}
|
}
|
||||||
|
@ -68,6 +68,7 @@ struct amdtp_out_stream {
|
|||||||
|
|
||||||
unsigned int pcm_buffer_pointer;
|
unsigned int pcm_buffer_pointer;
|
||||||
unsigned int pcm_period_pointer;
|
unsigned int pcm_period_pointer;
|
||||||
|
bool pointer_flush;
|
||||||
};
|
};
|
||||||
|
|
||||||
int amdtp_out_stream_init(struct amdtp_out_stream *s, struct fw_unit *unit,
|
int amdtp_out_stream_init(struct amdtp_out_stream *s, struct fw_unit *unit,
|
||||||
|
Loading…
Reference in New Issue
Block a user