Hi Greg, I made a mistake fixing that driver. Here's the fix. Please apply soon.
Regards Oliver You can import this changeset into BK by piping this whole message to: '| bk receive [path to repository]' or apply the patch as usual. =================================================================== [EMAIL PROTECTED], 2004-05-15 13:12:57+02:00, [EMAIL PROTECTED] - fix race condition leading to busy waiting mdc800.c | 33 +++++++++++++++++---------------- 1 files changed, 17 insertions(+), 16 deletions(-) diff -Nru a/drivers/usb/image/mdc800.c b/drivers/usb/image/mdc800.c --- a/drivers/usb/image/mdc800.c Sat May 15 13:14:27 2004 +++ b/drivers/usb/image/mdc800.c Sat May 15 13:14:27 2004 @@ -33,7 +33,7 @@ * Fix: mdc800 used sleep_on and slept with io_lock held. * Converted sleep_on to waitqueues with schedule_timeout and made io_lock * a semaphore from a spinlock. - * by Oliver Neukum <[EMAIL PROTECTED]> + * by Oliver Neukum <[EMAIL PROTECTED]> * (02/12/2001) * * Identify version on module load. @@ -41,7 +41,7 @@ * * version 0.7.5 * Fixed potential SMP races with Spinlocks. - * Thanks to Oliver Neukum <[EMAIL PROTECTED]> who + * Thanks to Oliver Neukum <[EMAIL PROTECTED]> who * noticed the race conditions. * (30/10/2000) * @@ -312,16 +312,17 @@ static int mdc800_usb_waitForIRQ (int mode, int msec) { DECLARE_WAITQUEUE(wait, current); + long timeout; mdc800->camera_request_ready=1+mode; add_wait_queue(&mdc800->irq_wait, &wait); set_current_state(TASK_INTERRUPTIBLE); - if (!mdc800->irq_woken) + timeout = msec*HZ/1000; + while (!mdc800->irq_woken && timeout) { - long timeout = msec*HZ/1000; - while(timeout) - timeout = schedule_timeout (timeout); + set_current_state(TASK_UNINTERRUPTIBLE); + timeout = schedule_timeout (timeout); } remove_wait_queue(&mdc800->irq_wait, &wait); set_current_state(TASK_RUNNING); @@ -670,6 +671,7 @@ { size_t left=len, sts=len; /* single transfer size */ char* ptr=buf; + long timeout; DECLARE_WAITQUEUE(wait, current); down (&mdc800->io_lock); @@ -717,12 +719,11 @@ return len-left; } add_wait_queue(&mdc800->download_wait, &wait); - set_current_state(TASK_INTERRUPTIBLE); - if (!mdc800->downloaded) + timeout = TO_DOWNLOAD_GET_READY*HZ/1000; + while (!mdc800->downloaded && timeout) { - long timeout = TO_DOWNLOAD_GET_READY*HZ/1000; - while(timeout) - timeout = schedule_timeout (timeout); + set_current_state(TASK_UNINTERRUPTIBLE); + timeout = schedule_timeout (timeout); } set_current_state(TASK_RUNNING); remove_wait_queue(&mdc800->download_wait, &wait); @@ -823,6 +824,7 @@ if (mdc800->in_count == 8) { int answersize; + long timeout; if (mdc800_usb_waitForIRQ (0,TO_GET_READY)) { @@ -843,12 +845,11 @@ return -EIO; } add_wait_queue(&mdc800->write_wait, &wait); - set_current_state(TASK_INTERRUPTIBLE); - if (!mdc800->written) + timeout = TO_WRITE_GET_READY*HZ/1000; + while (!mdc800->written && timeout) { - long timeout = TO_WRITE_GET_READY*HZ/1000; - while(timeout) - timeout = schedule_timeout (timeout); + set_current_state(TASK_UNINTERRUPTIBLE); + timeout = schedule_timeout (timeout); } set_current_state(TASK_RUNNING); remove_wait_queue(&mdc800->write_wait, &wait); =================================================================== This BitKeeper patch contains the following changesets: 1.1627 ## Wrapped with gzip_uu ## M'XL( )/[I4 \V5;V_3,!#&7\>?XA 2&J VMN,XH:,38ZU8Q;1.I1,"A"K7 M,6VT)!ZQLS(I'QXGW;\.QC;$"]PJE6S?<_=[[J(^A6.CRIZGL_1,E>@I[&MC M>UXNY%S99;=0U4F5=W6Y<$<3K=V1O]2Y\M?W_6FIE/&SM*@,#9&[<R2L7(([ M,CV/=(.K'7M^JGK>9/CN^&[EMAIL PROTECTED]"_#WM+42S4!V6AWT=6EV<B2\P;89>9+KJV M%(7)E15=J?/ZZFI-,:;N$Y(HP"&O"<<LJB5)"!&,J 13%G-VK79Z*E]%N*M- MDC4,FT+,R828$\*".J"<<S0 TB6<1H"9CT.?A$""'J&],'J):0]C6%._^=4= M>$F@@]%;^+<@>TA"![ZE/Z 44H'419+:5!>0*9&DQ<[EMAIL PROTECTED]'ZQ0.\A MH#$)T=&UO:CSR(40%ACMW(.2E(T5QJ_,W,\3&6/<E3>H&"91S5G PSI1\3?! MYT0F220Y9W>[N"&:YF*A-J3;AA&W&*D9C3!NY^CNF/L'Z^\AT 7$=?%?%J5: M?'T J%!$ 6\#F)&:#MS =^<.-)CY $3%T&'\/]AYM;-&$.G7+5?-T-'?^C+ [EMAIL PROTECTED]/@]68["I&K'[EMAIL PROTECTED] EJGRYHZHPX,4WY]\?" M:JG!Y2--K.=,==AIKG1EMUTM%+?%N!^*O(M]Z$-NE'RQ_]DG&.-MY*V6::9@ MZ\D:N[.3EM]G*WVB"GCV[%+M>:-&(6C46*/F&65GLBI+5=B9L<*JK>GNA_>S MX\/1X70XF1P?34=O#X;/G?Z-S$8N55)E:G:YM76IOXU&/[EMAIL PROTECTED]:ZD<1)6W: MFVK3\6PP_GAX,-X=S-X-I[/)<'?PZ0:86[?9$KTJ,BT2E6S"131HX"(:7F1Y M#)_W8,38Z9,FXA9DS'@#&;-HG7Z#\>-D-!W> 7B;;U6FUM[N7,Q>-7!Q>&GA >H]@>AG;U!^KNR!-3Y?TXI(1*][[]!,<F/NV[!P ------------------------------------------------------- This SF.Net email is sponsored by: SourceForge.net Broadband Sign-up now for SourceForge Broadband and get the fastest 6.0/768 connection for only $19.95/mo for the first 3 months! http://ads.osdn.com/?ad_id=2562&alloc_id=6184&op=click _______________________________________________ [EMAIL PROTECTED] To unsubscribe, use the last form field at: https://lists.sourceforge.net/lists/listinfo/linux-usb-devel