ChangeSet 1.811.2.1, 2002/12/16 11:18:15-08:00, [EMAIL PROTECTED]
[PATCH] USB pwc deadlock fixes
diff -Nru a/drivers/usb/pwc-if.c b/drivers/usb/pwc-if.c
--- a/drivers/usb/pwc-if.c Mon Dec 16 16:33:57 2002
+++ b/drivers/usb/pwc-if.c Mon Dec 16 16:33:57 2002
@@ -1131,6 +1131,7 @@
if (pdev->image_read_pos == 0) {
/* Do wait queueing according to the (doc)book */
add_wait_queue(&pdev->frameq, &wait);
+ set_current_state(TASK_INTERRUPTIBLE);
while (pdev->full_frames == NULL) {
if (noblock) {
remove_wait_queue(&pdev->frameq, &wait);
@@ -1483,6 +1484,7 @@
frameq is safe now.
*/
add_wait_queue(&pdev->frameq, &wait);
+ set_current_state(TASK_INTERRUPTIBLE);
while (pdev->full_frames == NULL) {
if (pdev->unplugged) {
remove_wait_queue(&pdev->frameq, &wait);
@@ -1868,6 +1870,8 @@
pdev->unplugged = 1;
if (pdev->vdev != NULL) {
+ add_wait_queue(&pdev->remove_ok, &wait);
+ set_current_state(TASK_UNINTERRUPTIBLE);
if (pdev->vopen) {
Info("Disconnected while device/video is open!\n");
@@ -1883,12 +1887,8 @@
*/
Trace(TRACE_PROBE, "Sleeping on remove_ok.\n");
- add_wait_queue(&pdev->remove_ok, &wait);
- set_current_state(TASK_UNINTERRUPTIBLE);
/* ... wait ... */
schedule();
- remove_wait_queue(&pdev->remove_ok, &wait);
- set_current_state(TASK_RUNNING);
Trace(TRACE_PROBE, "Done sleeping.\n");
set_mem_leak(pdev->vdev);
pdev->vdev = NULL;
@@ -1900,6 +1900,8 @@
kfree(pdev->vdev);
pdev->vdev = NULL;
}
+ remove_wait_queue(&pdev->remove_ok, &wait);
+ set_current_state(TASK_RUNNING);
}
/* search device_hint[] table if we occupy a slot, by any chance */
-------------------------------------------------------
This sf.net email is sponsored by:
With Great Power, Comes Great Responsibility
Learn to use your power at OSDN's High Performance Computing Channel
http://hpc.devchannel.org/
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel