From: Cássio Gabriel Date: Mon, 27 Apr 2026 22:13:28 +0000 (-0300) Subject: sound: oss: dmasound: kick queued output before extending tail fragment X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6e934725ec3abb63247a0cb4cd455fff3c009ef5;p=thirdparty%2Flinux.git sound: oss: dmasound: kick queued output before extending tail fragment sq_write() currently clears POST and then immediately appends to the current rear fragment. If the queue already contains complete fragments ahead of that incomplete tail, playback is not kicked until the queue-full wait path or the final sq_play() at the end of the write. That wastes the slack those queued samples would otherwise provide while the driver spends more time copying and translating more data into the tail fragment. All in-tree dmasound playback backends still refuse to queue an incomplete last fragment while !syncing, but they can start earlier complete fragments. Call sq_play() immediately after clearing POST and before extending the rear fragment so already-queued complete output can start earlier. Signed-off-by: Cássio Gabriel Link: https://patch.msgid.link/20260427-dmasound-sq-play-v1-1-28bbeb8509b1@gmail.com Signed-off-by: Takashi Iwai --- diff --git a/sound/oss/dmasound/dmasound_core.c b/sound/oss/dmasound/dmasound_core.c index a718b75bb6a09..e80f730d08038 100644 --- a/sound/oss/dmasound/dmasound_core.c +++ b/sound/oss/dmasound/dmasound_core.c @@ -574,11 +574,6 @@ static ssize_t sq_write(struct file *file, const char __user *src, size_t uLeft, uWritten = 0 ; } -/* FIXME: I think that this may be the wrong behaviour when we get strapped - for time and the cpu is close to being (or actually) behind in sending data. - - because we've lost the time that the N samples, already in the buffer, - would have given us to get here with the next lot from the user. -*/ /* The interrupt doesn't start to play the last, incomplete frame. * Thus we can append to it without disabling the interrupts! (Note * also that write_sq.rear isn't affected by the interrupt.) @@ -598,6 +593,11 @@ static ssize_t sq_write(struct file *file, const char __user *src, size_t uLeft, write_sq.syncing &= ~2 ; /* take out POST status */ spin_unlock_irqrestore(&dmasound.lock, flags); + /* Start any already-complete fragments before we spend + * more time extending the incomplete tail fragment. + */ + sq_play(); + if (write_sq.count > 0 && (bLeft = write_sq.block_size-write_sq.rear_size) > 0) { dest = write_sq.buffers[write_sq.rear];