From 6e934725ec3abb63247a0cb4cd455fff3c009ef5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A1ssio=20Gabriel?= Date: Mon, 27 Apr 2026 19:13:28 -0300 Subject: [PATCH] sound: oss: dmasound: kick queued output before extending tail fragment MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- sound/oss/dmasound/dmasound_core.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/sound/oss/dmasound/dmasound_core.c b/sound/oss/dmasound/dmasound_core.c index a718b75bb6a0..e80f730d0803 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];