The patch number 8505 was added via Hans Verkuil <[EMAIL PROTECTED]>
to http://linuxtv.org/hg/v4l-dvb master development tree.

Kernel patches in this development tree may be modified to be backward
compatible with older kernels. Compatibility modifications will be
removed before inclusion into the mainstream Kernel

If anyone has any objections, please let us know by sending a message to:
        [EMAIL PROTECTED]

------

From: Hans Verkuil  <[EMAIL PROTECTED]>
saa7134-empress.c: fix deadlock


ts_release() locked a mutex that videobuf_stop() also tried to obtain.
But ts_release() shouldn't hold that mutex at all.

Make empress_users atomic as well to prevent possible race condition.

Signed-off-by: Hans Verkuil <[EMAIL PROTECTED]>


---

 linux/drivers/media/video/saa7134/saa7134-empress.c |   12 ++++--------
 linux/drivers/media/video/saa7134/saa7134.h         |    2 +-
 2 files changed, 5 insertions(+), 9 deletions(-)

diff -r 5a829e462c87 -r 36481120006f 
linux/drivers/media/video/saa7134/saa7134-empress.c
--- a/linux/drivers/media/video/saa7134/saa7134-empress.c       Fri Jul 25 
12:39:54 2008 +0200
+++ b/linux/drivers/media/video/saa7134/saa7134-empress.c       Sat Jul 26 
14:01:24 2008 +0200
@@ -89,14 +89,14 @@ static int ts_open(struct inode *inode, 
        err = -EBUSY;
        if (!mutex_trylock(&dev->empress_tsq.vb_lock))
                goto done;
-       if (dev->empress_users)
+       if (atomic_read(&dev->empress_users))
                goto done_up;
 
        /* Unmute audio */
        saa_writeb(SAA7134_AUDIO_MUTE_CTRL,
                saa_readb(SAA7134_AUDIO_MUTE_CTRL) & ~(1 << 6));
 
-       dev->empress_users++;
+       atomic_inc(&dev->empress_users);
        file->private_data = dev;
        err = 0;
 
@@ -110,8 +110,6 @@ static int ts_release(struct inode *inod
 {
        struct saa7134_dev *dev = file->private_data;
 
-       mutex_lock(&dev->empress_tsq.vb_lock);
-
        videobuf_stop(&dev->empress_tsq);
        videobuf_mmap_free(&dev->empress_tsq);
 
@@ -122,9 +120,7 @@ static int ts_release(struct inode *inod
        saa_writeb(SAA7134_AUDIO_MUTE_CTRL,
                saa_readb(SAA7134_AUDIO_MUTE_CTRL) | (1 << 6));
 
-       dev->empress_users--;
-
-       mutex_unlock(&dev->empress_tsq.vb_lock);
+       atomic_dec(&dev->empress_users);
 
        return 0;
 }
@@ -455,7 +451,7 @@ static void empress_signal_update(struct
                ts_reset_encoder(dev);
        } else {
                dprintk("video signal acquired\n");
-               if (dev->empress_users)
+               if (atomic_read(&dev->empress_users))
                        ts_init_encoder(dev);
        }
 }
diff -r 5a829e462c87 -r 36481120006f linux/drivers/media/video/saa7134/saa7134.h
--- a/linux/drivers/media/video/saa7134/saa7134.h       Fri Jul 25 12:39:54 
2008 +0200
+++ b/linux/drivers/media/video/saa7134/saa7134.h       Sat Jul 26 14:01:24 
2008 +0200
@@ -566,7 +566,7 @@ struct saa7134_dev {
        /* SAA7134_MPEG_EMPRESS only */
        struct video_device        *empress_dev;
        struct videobuf_queue      empress_tsq;
-       unsigned int               empress_users;
+       atomic_t                   empress_users;
        struct work_struct         empress_workqueue;
        int                        empress_started;
 


---

Patch is available at: 
http://linuxtv.org/hg/v4l-dvb/rev/36481120006fffd8a170919022de4da6e2c4a1cb

_______________________________________________
linuxtv-commits mailing list
linuxtv-commits@linuxtv.org
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linuxtv-commits

Reply via email to