From: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
To: Ricardo Ribalda <ribalda@chromium.org>
Cc: Mauro Carvalho Chehab <mchehab@kernel.org>,
linux-media@vger.kernel.org, linux-kernel@vger.kernel.org,
Hans Verkuil <hverkuil-cisco@xs4all.nl>
Subject: Re: [PATCH v2 2/2] media: drivers/media/dvb-core: Refactor dvb_frontend_open locking
Date: Fri, 16 Aug 2024 10:16:51 +0200 [thread overview]
Message-ID: <20240816101642.5ef4e461@foz.lan> (raw)
In-Reply-To: <20240814-coccinelle-followup-v2-2-88b4e4a9af56@chromium.org>
Em Wed, 14 Aug 2024 14:10:23 +0000
Ricardo Ribalda <ribalda@chromium.org> escreveu:
> Split out the wait function, and introduce some new toys: guard and
> lockdep.
>
> This fixes the following cocci warnings:
> drivers/media/dvb-core/dvb_frontend.c:2897:1-7: preceding lock on line 2776
> drivers/media/dvb-core/dvb_frontend.c:2897:1-7: preceding lock on line 2786
> drivers/media/dvb-core/dvb_frontend.c:2897:1-7: preceding lock on line 2809
Hi Ricardo,
Every time someone tries to fix this lock, we end having regression reports,
because of the diversity of devices, and the way they registers there.
That's specially true for devices with multiple frontends and custom
zigzag methods.
On what devices have you tested this patch?
Regards,
Mauro
>
> Signed-off-by: Ricardo Ribalda <ribalda@chromium.org>
> ---
> drivers/media/dvb-core/dvb_frontend.c | 58 ++++++++++++++++++++++-------------
> 1 file changed, 37 insertions(+), 21 deletions(-)
>
> diff --git a/drivers/media/dvb-core/dvb_frontend.c b/drivers/media/dvb-core/dvb_frontend.c
> index e81b9996530e..7f5d0c297464 100644
> --- a/drivers/media/dvb-core/dvb_frontend.c
> +++ b/drivers/media/dvb-core/dvb_frontend.c
> @@ -30,6 +30,7 @@
> #include <linux/kthread.h>
> #include <linux/ktime.h>
> #include <linux/compat.h>
> +#include <linux/lockdep.h>
> #include <asm/processor.h>
>
> #include <media/dvb_frontend.h>
> @@ -2826,6 +2827,34 @@ static int __dvb_frontend_open(struct inode *inode, struct file *file)
> return ret;
> }
>
> +static int wait_dvb_frontend(struct dvb_adapter *adapter,
> + struct dvb_device *mfedev)
> +{
> + struct dvb_frontend *mfe = mfedev->priv;
> + struct dvb_frontend_private *mfepriv = mfe->frontend_priv;
> + int mferetry = (dvb_mfe_wait_time << 1);
> + int ret = 0;
> +
> + lockdep_assert_held(&adapter->mfe_lock);
> +
> + if (mfedev->users == -1 && !mfepriv->thread)
> + return 0;
> +
> + mutex_unlock(&adapter->mfe_lock);
> +
> + while (mferetry-- && (mfedev->users != -1 || mfepriv->thread)) {
> + if (msleep_interruptible(500))
> + if (signal_pending(current)) {
> + ret = -EINTR;
> + break;
> + }
> + }
> +
> + mutex_lock(&adapter->mfe_lock);
> +
> + return ret;
> +}
> +
> static int dvb_frontend_open(struct inode *inode, struct file *file)
> {
> struct dvb_device *dvbdev = file->private_data;
> @@ -2840,19 +2869,16 @@ static int dvb_frontend_open(struct inode *inode, struct file *file)
> if (!adapter->mfe_shared)
> return __dvb_frontend_open(inode, file);
>
> + guard(mutex)(&adapter->mfe_lock);
> +
> if (adapter->mfe_shared == 2) {
> - mutex_lock(&adapter->mfe_lock);
> if ((file->f_flags & O_ACCMODE) != O_RDONLY) {
> if (adapter->mfe_dvbdev &&
> - !adapter->mfe_dvbdev->writers) {
> - mutex_unlock(&adapter->mfe_lock);
> + !adapter->mfe_dvbdev->writers)
> return -EBUSY;
> - }
> adapter->mfe_dvbdev = dvbdev;
> }
> } else {
> - mutex_lock(&adapter->mfe_lock);
> -
> if (!adapter->mfe_dvbdev) {
> adapter->mfe_dvbdev = dvbdev;
> } else if (adapter->mfe_dvbdev != dvbdev) {
> @@ -2862,34 +2888,24 @@ static int dvb_frontend_open(struct inode *inode, struct file *file)
> *mfe = mfedev->priv;
> struct dvb_frontend_private
> *mfepriv = mfe->frontend_priv;
> - int mferetry = (dvb_mfe_wait_time << 1);
> -
> - mutex_unlock(&adapter->mfe_lock);
> - while (mferetry-- && (mfedev->users != -1 ||
> - mfepriv->thread)) {
> - if (msleep_interruptible(500)) {
> - if (signal_pending(current))
> - return -EINTR;
> - }
> - }
>
> - mutex_lock(&adapter->mfe_lock);
> + ret = wait_dvb_frontend(adapter, mfedev);
> + if (ret)
> + return ret;
> +
> if (adapter->mfe_dvbdev != dvbdev) {
> mfedev = adapter->mfe_dvbdev;
> mfe = mfedev->priv;
> mfepriv = mfe->frontend_priv;
> if (mfedev->users != -1 ||
> - mfepriv->thread) {
> - mutex_unlock(&adapter->mfe_lock);
> + mfepriv->thread)
> return -EBUSY;
> - }
> adapter->mfe_dvbdev = dvbdev;
> }
> }
> }
>
> ret = __dvb_frontend_open(inode, file);
> - mutex_unlock(&adapter->mfe_lock);
>
> return ret;
> }
>
Thanks,
Mauro
next prev parent reply other threads:[~2024-08-16 8:16 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-08-14 14:10 [PATCH v2 0/2] media: Follow-up for coccinelle lock fixes patchset Ricardo Ribalda
2024-08-14 14:10 ` [PATCH v2 1/2] media: drivers/media/dvb-core: Split dvb_frontend_open() Ricardo Ribalda
2024-08-16 12:30 ` Ricardo Ribalda
2024-08-14 14:10 ` [PATCH v2 2/2] media: drivers/media/dvb-core: Refactor dvb_frontend_open locking Ricardo Ribalda
2024-08-16 8:16 ` Mauro Carvalho Chehab [this message]
2024-08-16 8:20 ` Ricardo Ribalda
2024-08-16 10:16 ` Mauro Carvalho Chehab
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240816101642.5ef4e461@foz.lan \
--to=mchehab+huawei@kernel.org \
--cc=hverkuil-cisco@xs4all.nl \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-media@vger.kernel.org \
--cc=mchehab@kernel.org \
--cc=ribalda@chromium.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox