Skip to contentSkip to conversation

FAILED: patch "[PATCH] media: cedrus: Fix watchdog race condition" failed to apply to 5.19-stable tree

PATCH [email protected] 1 participant 1 message Oct 16, 2022

Subsystems (5)
lore
Share & tools
lore

[email protected]

author maintainer
#0 lore raw

The patch below does not apply to the 5.19-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.

Possible dependencies:

fe8b81fde69a ("media: cedrus: Fix watchdog race condition") 4af46bcc4915 ("media: cedrus: Add error handling for failed setup") f1a413902aa7 ("media: cedrus: h265: Fix logic for not low delay flag") 104a70e1d0bc ("media: cedrus: h265: Fix flag name")

thanks,

greg k-h

------------------ original commit in Linus's tree ------------------

From fe8b81fde69acfcbb5af9e85328e5b9549999fdb Mon Sep 17 00:00:00 2001
From: Nicolas Dufresne <[email protected]>
Date: Thu, 18 Aug 2022 22:33:06 +0200
Subject: [PATCH] media: cedrus: Fix watchdog race condition

The watchdog needs to be scheduled before we trigger the decode operation, otherwise there is a risk that the decoder IRQ will be called before we have schedule the watchdog. As a side effect, the watchdog would never be cancelled and its function would be called at an inappropriate time.

This was observed while running Fluster with GStreamer as a backend. Some programming error would cause the decoder IRQ to be call very quickly after the trigger. Later calls into the driver would deadlock due to the unbalanced state.

Fixes 7c38a551bda1 ("media: cedrus: Add watchdog for job completion")
drivers/staging/media/sunxi/cedrus/cedrus_dec.c +2 -2
index 3b6aa78a2985..e7f7602a5ab4 100644
@@ -106,11 +106,11 @@ void cedrus_device_run(void *priv)
 
 	/* Trigger decoding if setup went well, bail out otherwise. */
 	if (!error) {
-		dev->dec_ops[ctx->current_codec]->trigger(ctx);
-
 		/* Start the watchdog timer. */
 		schedule_delayed_work(&dev->watchdog_work,
 				      msecs_to_jiffies(2000));
+
+		dev->dec_ops[ctx->current_codec]->trigger(ctx);
 	} else {
 		v4l2_m2m_buf_done_and_job_finish(ctx->dev->m2m_dev,
 						 ctx->fh.m2m_ctx,