On Mon Jun 29 11:30:49 2026 +0000, Ricardo Ribalda wrote:
> 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
> 
> Signed-off-by: Ricardo Ribalda <[email protected]>
> Signed-off-by: Hans Verkuil <[email protected]>

Patch committed.

Thanks,
Hans Verkuil

 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 d99b0348df54..791834e088b6 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>
@@ -2841,6 +2842,34 @@ err1:
        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;
@@ -2855,19 +2884,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) {
@@ -2877,34 +2903,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;
 }
_______________________________________________
linuxtv-commits mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to