* Oleg Nesterov <[EMAIL PROTECTED]> wrote:

> Yes, I think cinergyt2 is buggy.

> cinergyt2_release() does flush_scheduled_work() under cinergyt2->sem. 
> flush_scheduled_work() hangs because cinergyt2_query_rc() waits for 
> the same cinergyt2->sem.
> 
> ->disconnect_pending is used without any locks/barriers, perhaps this 
> is the reason.
> 
> I'll try to look further tomorrow. In any case, cinergyT2 should not 
> use flush_scheduled_work() at all.

would the hack below be worth trying, to see whether there are any 
further problems?

        Ingo

Index: linux/drivers/media/dvb/cinergyT2/cinergyT2.c
===================================================================
--- linux.orig/drivers/media/dvb/cinergyT2/cinergyT2.c
+++ linux/drivers/media/dvb/cinergyT2/cinergyT2.c
@@ -523,7 +523,6 @@ static int cinergyt2_release (struct ino
 
        if (!cinergyt2->disconnect_pending && (file->f_flags & O_ACCMODE) != 
O_RDONLY) {
                cancel_delayed_work(&cinergyt2->query_work);
-               flush_scheduled_work();
                cinergyt2_sleep(cinergyt2, 1);
        }
 
@@ -974,8 +973,6 @@ static void cinergyt2_disconnect (struct
 {
        struct cinergyt2 *cinergyt2 = usb_get_intfdata (intf);
 
-       flush_scheduled_work();
-
        cinergyt2_unregister_rc(cinergyt2);
 
        cancel_delayed_work(&cinergyt2->query_work);
@@ -1002,7 +999,6 @@ static int cinergyt2_suspend (struct usb
                cancel_delayed_work(&cinergyt2->query_work);
                if (cinergyt2->streaming)
                        cinergyt2_stop_stream_xfer(cinergyt2);
-               flush_scheduled_work();
                cinergyt2_sleep(cinergyt2, 1);
        }
 
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to