From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 2F493C433EF for ; Sun, 6 Feb 2022 13:10:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:Cc:To:Subject:Message-ID:Date:From: In-Reply-To:References:MIME-Version:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=8wlMuK7FCjqNH9VG6iv0kW6fHUn+jkCe2HPqmaaM1KI=; b=4/LgnD906gACqU Y8b1LjY8O3z7qL1uU0jGB1YyrKssG2+7FEt/dKKKj5i/7UvLrcFpulJTViJLkvSTAWqi5S4Jcw16N UNNEIGb2hDUJyM3YT8CuDRmrmGokXvKQVRSEbm5Zh0SnKJNY+3w+IOTtXwaQ6QbnnFfwL/IT5HcO0 wsxbSETKwrIu39CrI4ro5T9/9T4h1YYv3krNOgKh6u1wy1VmxgIRbuLEYiilDbERoKAqyj3TXE0LK 8QUJP5ZDaCWbwCfI84OZ0zcH09XgOY20fkHQECpVYv9IEtqq6QR7a+wS8N5DRh31EN2JmtSA92h4D v0e2NebAdvci1ahmVDDg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1nGhIP-008Cyf-MT; Sun, 06 Feb 2022 13:09:37 +0000 Received: from mail-ed1-x52d.google.com ([2a00:1450:4864:20::52d]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1nGhIH-008CuP-TS for linux-arm-kernel@lists.infradead.org; Sun, 06 Feb 2022 13:09:34 +0000 Received: by mail-ed1-x52d.google.com with SMTP id l5so24179998edv.3 for ; Sun, 06 Feb 2022 05:09:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=vanguardiasur-com-ar.20210112.gappssmtp.com; s=20210112; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=MHIz3Dwre4tP6Q9bEyDnouvCJsPoMkCD31ljHi1figY=; b=n4em8JyzX1Xmca5wj9Ex2hf6ab5VBqAE25+S/+kRckovgV+6/U2epazWCx43iWv9cR aYDRm2UNdFB3lDdMZ/ECBez5QZgn48O5vx3i90N+sjYAt+RsD7/xHRWAZs6GDtZsENeU wKgXB0gG8CnR1ZwL63F4/oB6nfNTM3MD4PMZ9E90zbQlp9XkQ4b6jzgVEodLrl7yy5op a3h6ep2+ZYf07EVsa2eBQsz20wUqmHvl+VVoF2orEgIuwe6rWh/+ukf9aNTog3YXEzDv g12lqmS0M3+b3z6drByy6kZPBZLngY1vT3W4k/9h2izHFNbhSCzcWeNQjmqTxfTCU1ws kvmg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=MHIz3Dwre4tP6Q9bEyDnouvCJsPoMkCD31ljHi1figY=; b=fXFEGIfb0+UEYSWCylJrLu6fToeJtQ+zSInj1+Km02dQ3bDauuZ6ka355pVa8lIxob XD77VtQI8qKtz4Ad8RmBuxRJp89f9Zz/B6M6m4tW58TLuNFU7Hm0p6xNHKS7CLfgfREc k/7sbIWrS+38lG5n68gkO/pNLpRO9HNCH0LasRw5UGL8mr2JaZB609T/KxrVZiuibj51 bYHwpV69b2pdmYgs03K3awMd/okaGMz2mnzS2xxsnu82kzQgT+rMkQmxATDzojwFhYLr 0EetaoeZVn2LOXfx3fbJF0lYINEPZYBJDQiyfh8f0LuKkJqe+YXmbj0sqNjBfz3BoDrK vfLw== X-Gm-Message-State: AOAM5307+T0wSrPFMBvgxi19ndlFtChoEd7dqQPqr5D21MV6lkfs5vrt wTzPYKwKOg+uMQ+c07/2V2Vy24xsi0LCXeOozpHJIg== X-Google-Smtp-Source: ABdhPJzIGdBf/BwLMf3qdRE5GZYN+c8/w4PVd7M5MgrPgzYMrAWBQIf/AaIXvRrJOY+pnPtpOYwtHhAfQprBX/EXA/o= X-Received: by 2002:a05:6402:84a:: with SMTP id b10mr8849389edz.143.1644152964025; Sun, 06 Feb 2022 05:09:24 -0800 (PST) MIME-Version: 1.0 References: <20220201183324.493542-1-jernej.skrabec@gmail.com> In-Reply-To: <20220201183324.493542-1-jernej.skrabec@gmail.com> From: Ezequiel Garcia Date: Sun, 6 Feb 2022 10:09:11 -0300 Message-ID: Subject: Re: [PATCH] media: cedrus: Add watchdog for job completion To: Jernej Skrabec Cc: Maxime Ripard , Paul Kocialkowski , Mauro Carvalho Chehab , Chen-Yu Tsai , linux-media , "open list:STAGING SUBSYSTEM" , linux-arm-kernel , linux-sunxi@lists.linux.dev, Linux Kernel Mailing List X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220206_050930_104213_095B3B9F X-CRM114-Status: GOOD ( 24.12 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Hello, On Tue, 1 Feb 2022 at 15:34, Jernej Skrabec wrote: > > Currently, if job is not completed for whatever reason, userspace > application can hang on ioctl and thus become unkillable. > > In order to prevent that, implement watchdog, which will complete job > after 2 seconds with error state. > > Concept is borrowed from hantro driver. > > Signed-off-by: Jernej Skrabec This has been very useful developing Hantro, to get some indication of hardware being programmed wrongly: Patch looks correct. Reviewed-by: Ezequiel Garcia > --- > drivers/staging/media/sunxi/cedrus/cedrus.c | 2 ++ > drivers/staging/media/sunxi/cedrus/cedrus.h | 3 +++ > .../staging/media/sunxi/cedrus/cedrus_dec.c | 4 +++ > .../staging/media/sunxi/cedrus/cedrus_hw.c | 25 +++++++++++++++++++ > .../staging/media/sunxi/cedrus/cedrus_hw.h | 2 ++ > 5 files changed, 36 insertions(+) > > diff --git a/drivers/staging/media/sunxi/cedrus/cedrus.c b/drivers/staging/media/sunxi/cedrus/cedrus.c > index 4a4b714b0f26..68b3dcdb5df3 100644 > --- a/drivers/staging/media/sunxi/cedrus/cedrus.c > +++ b/drivers/staging/media/sunxi/cedrus/cedrus.c > @@ -439,6 +439,8 @@ static int cedrus_probe(struct platform_device *pdev) > > mutex_init(&dev->dev_mutex); > > + INIT_DELAYED_WORK(&dev->watchdog_work, cedrus_watchdog); > + > ret = v4l2_device_register(&pdev->dev, &dev->v4l2_dev); > if (ret) { > dev_err(&pdev->dev, "Failed to register V4L2 device\n"); > diff --git a/drivers/staging/media/sunxi/cedrus/cedrus.h b/drivers/staging/media/sunxi/cedrus/cedrus.h > index c345f2984041..3bc094eb497f 100644 > --- a/drivers/staging/media/sunxi/cedrus/cedrus.h > +++ b/drivers/staging/media/sunxi/cedrus/cedrus.h > @@ -24,6 +24,7 @@ > > #include > #include > +#include > > #define CEDRUS_NAME "cedrus" > > @@ -194,6 +195,8 @@ struct cedrus_dev { > struct reset_control *rstc; > > unsigned int capabilities; > + > + struct delayed_work watchdog_work; > }; > > extern struct cedrus_dec_ops cedrus_dec_ops_mpeg2; > diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_dec.c b/drivers/staging/media/sunxi/cedrus/cedrus_dec.c > index a16c1422558f..9c7200299465 100644 > --- a/drivers/staging/media/sunxi/cedrus/cedrus_dec.c > +++ b/drivers/staging/media/sunxi/cedrus/cedrus_dec.c > @@ -97,4 +97,8 @@ void cedrus_device_run(void *priv) > v4l2_ctrl_request_complete(src_req, &ctx->hdl); > > dev->dec_ops[ctx->current_codec]->trigger(ctx); > + > + /* Start the watchdog timer. */ > + schedule_delayed_work(&dev->watchdog_work, > + msecs_to_jiffies(2000)); > } > diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_hw.c b/drivers/staging/media/sunxi/cedrus/cedrus_hw.c > index 2d7663726467..a6470a89851e 100644 > --- a/drivers/staging/media/sunxi/cedrus/cedrus_hw.c > +++ b/drivers/staging/media/sunxi/cedrus/cedrus_hw.c > @@ -118,6 +118,13 @@ static irqreturn_t cedrus_irq(int irq, void *data) > enum vb2_buffer_state state; > enum cedrus_irq_status status; > > + /* > + * If cancel_delayed_work returns false it means watchdog already > + * executed and finished the job. > + */ > + if (!cancel_delayed_work(&dev->watchdog_work)) > + return IRQ_HANDLED; > + > ctx = v4l2_m2m_get_curr_priv(dev->m2m_dev); > if (!ctx) { > v4l2_err(&dev->v4l2_dev, > @@ -143,6 +150,24 @@ static irqreturn_t cedrus_irq(int irq, void *data) > return IRQ_HANDLED; > } > > +void cedrus_watchdog(struct work_struct *work) > +{ > + struct cedrus_dev *dev; > + struct cedrus_ctx *ctx; > + > + dev = container_of(to_delayed_work(work), > + struct cedrus_dev, watchdog_work); > + > + ctx = v4l2_m2m_get_curr_priv(dev->m2m_dev); > + if (!ctx) > + return; > + > + v4l2_err(&dev->v4l2_dev, "frame processing timed out!\n"); > + reset_control_reset(dev->rstc); > + v4l2_m2m_buf_done_and_job_finish(ctx->dev->m2m_dev, ctx->fh.m2m_ctx, > + VB2_BUF_STATE_ERROR); > +} > + > int cedrus_hw_suspend(struct device *device) > { > struct cedrus_dev *dev = dev_get_drvdata(device); > diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_hw.h b/drivers/staging/media/sunxi/cedrus/cedrus_hw.h > index 45f641f0bfa2..7c92f00e36da 100644 > --- a/drivers/staging/media/sunxi/cedrus/cedrus_hw.h > +++ b/drivers/staging/media/sunxi/cedrus/cedrus_hw.h > @@ -28,4 +28,6 @@ int cedrus_hw_resume(struct device *device); > int cedrus_hw_probe(struct cedrus_dev *dev); > void cedrus_hw_remove(struct cedrus_dev *dev); > > +void cedrus_watchdog(struct work_struct *work); > + > #endif > -- > 2.35.1 > _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel