Quellcode durchsuchen

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>
Clemens Ladisch vor 13 Jahren
Ursprung
Commit
92b862c7d6
2 geänderte Dateien mit 8 neuen und 1 gelöschten Zeilen
  1. 7 1
      sound/firewire/amdtp.c
  2. 1 0
      sound/firewire/amdtp.h

+ 7 - 1
sound/firewire/amdtp.c

@@ -178,6 +178,7 @@ void amdtp_out_stream_pcm_prepare(struct amdtp_out_stream *s)
 	tasklet_kill(&s->period_tasklet);
 	s->pcm_buffer_pointer = 0;
 	s->pcm_period_pointer = 0;
+	s->pointer_flush = true;
 }
 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;
 		if (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);
 		}
 	}
@@ -539,7 +541,11 @@ EXPORT_SYMBOL(amdtp_out_stream_start);
  */
 unsigned long amdtp_out_stream_pcm_pointer(struct amdtp_out_stream *s)
 {
-	fw_iso_context_flush_completions(s->context);
+	/* this optimization is allowed to be racy */
+	if (s->pointer_flush)
+		fw_iso_context_flush_completions(s->context);
+	else
+		s->pointer_flush = true;
 
 	return ACCESS_ONCE(s->pcm_buffer_pointer);
 }

+ 1 - 0
sound/firewire/amdtp.h

@@ -68,6 +68,7 @@ struct amdtp_out_stream {
 
 	unsigned int pcm_buffer_pointer;
 	unsigned int pcm_period_pointer;
+	bool pointer_flush;
 };
 
 int amdtp_out_stream_init(struct amdtp_out_stream *s, struct fw_unit *unit,