PATCH Re: Firewire locking problem

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, Oct 08, 2007 at 09:18:18AM -0400, Pat Kane wrote:
> While trying to use dvgrab to input DV from an ADVC-100 Firewire
> device on my DELL Inspiron 8600 laptop, I got the following
> console message:
> 
>   =============================================
>   [ INFO: possible recursive locking detected ]
>   2.6.23-0.222.rc9.git4.fc8 #1
>   ---------------------------------------------
>   X/2522 is trying to acquire lock:
>    (&q->lock){++..}, at: [<c042671c>] __wake_up+0x15/0x42
> 
>   but task is already holding lock:
>    (&q->lock){++..}, at: [<c042671c>] __wake_up+0x15/0x42
> 
>   other info that might help us debug this:
>   2 locks held by X/2522:
>    #0:  (&client->lock){.+..}, at: [<e0993f51>] queue_event+0x2b/0x68
> [firewire_core]
>    #1:  (&q->lock){++..}, at: [<c042671c>] __wake_up+0x15/0x42
> 
>   stack backtrace:
>    [<c0406463>] show_trace_log_lvl+0x1a/0x2f
>    [<c0406e4d>] show_trace+0x12/0x14
>    [<c0406e65>] dump_stack+0x16/0x18
>    [<c0449c56>] __lock_acquire+0x189/0xc67
>    [<c044abae>] lock_acquire+0x7b/0x9e
>    [<c0634712>] _spin_lock_irqsave+0x4a/0x77
>    [<c042671c>] __wake_up+0x15/0x42
>    [<c04aed7e>] ep_poll_safewake+0x86/0xa8
>    [<c04afa05>] ep_poll_callback+0x9f/0xaa
>    [<c042483e>] __wake_up_common+0x32/0x55
>    [<c0426738>] __wake_up+0x31/0x42
>    [<e0993f7d>] queue_event+0x57/0x68 [firewire_core]
>    [<e0994a5a>] handle_request+0xd8/0xe0 [firewire_core]
>    [<e099269a>] fw_core_handle_request+0x215/0x23c [firewire_core]
>    [<e0961c42>] handle_ar_packet+0xd7/0xeb [firewire_ohci]
>    [<e0962bac>] ar_context_tasklet+0xb6/0xc4 [firewire_ohci]
>    [<c0432b5b>] tasklet_action+0x68/0xd3
>    [<c0432a39>] __do_softirq+0x78/0xff
>    [<c04075d4>] do_softirq+0x74/0xf7
>    =======================
(snip)

I think this is caused by queue_event() calling
wake_up_interruptible(&client->wait) with client->lock still held.  I
don't see a compelling reason to do the wake_up... inside the lock, so
I propose the following patch.  I tested it out against
2.6.23-0.222.rc9.git4.fc8, which is the latest fedora rawhide kernel.
I never reproduced the original problem, but at least this doesn't
seem to introduce any regressions.

			-- JF


Signed-off-by: Jay Fenlason <fenlason@xxxxxxxxxx>

-----------------------------------------------------------------------------
--- ../vanilla/drivers/firewire/fw-cdev.c	2007-07-08 19:32:17.000000000 -0400
+++ drivers/firewire/fw-cdev.c	2007-10-08 11:21:53.000000000 -0400
@@ -140,11 +140,10 @@ static void queue_event(struct client *c
 	event->v[1].size = size1;
 
 	spin_lock_irqsave(&client->lock, flags);
-
 	list_add_tail(&event->link, &client->event_list);
-	wake_up_interruptible(&client->wait);
-
 	spin_unlock_irqrestore(&client->lock, flags);
+
+	wake_up_interruptible(&client->wait);
 }
 
 static int

-- 
fedora-test-list mailing list
fedora-test-list@xxxxxxxxxx
To unsubscribe: 
https://www.redhat.com/mailman/listinfo/fedora-test-list

[Index of Archives]     [Fedora Desktop]     [Fedora SELinux]     [Photo Sharing]     [Yosemite Forum]     [KDE Users]

  Powered by Linux