The drivers below loop, but don't set TASK_{UN}INTERRUPTIBLE each time ...

thanks
john

--- drivers/char/drm/i810_dma.c Fri Aug 11 00:21:18 2000
+++ drivers/char/drm/i810_dma.c.new     Fri Sep  1 03:47:08 2000
@@ -1068,7 +1068,6 @@
                return;
        }
        atomic_set(&dev_priv->flush_done, 0);
-       current->state = TASK_INTERRUPTIBLE;
        add_wait_queue(&dev_priv->flush_queue, &entry);
        end = jiffies + (HZ*3);
    
@@ -1079,13 +1078,13 @@
                        DRM_ERROR("lockup\n");
                        break;
                }          
+               current->state = TASK_INTERRUPTIBLE;
                schedule_timeout(HZ*3);
                if (signal_pending(current)) {
                        break;
                }
        }
    
-       current->state = TASK_RUNNING;
        remove_wait_queue(&dev_priv->flush_queue, &entry);
    
        return;
--- drivers/char/ftape/lowlevel/ftape-io.c      Wed Sep 22 20:12:53 1999
+++ drivers/char/ftape/lowlevel/ftape-io.c.new  Fri Sep  1 03:49:20 2000
@@ -97,7 +97,6 @@
                timeout = ticks;
                save_flags(flags);
                sti();
-               set_current_state(TASK_INTERRUPTIBLE);
                do {
                        /*  Mmm. Isn't current->blocked == 0xffffffff ?
                         */
@@ -106,9 +105,9 @@
                                      "awoken by non-blocked signal :-(");
                                break;  /* exit on signal */
                        }
-                       while (current->state != TASK_RUNNING) {
-                               timeout = schedule_timeout(timeout);
-                       }
+ 
+                       set_current_state(TASK_INTERRUPTIBLE);
+                       timeout = schedule_timeout(timeout);
                } while (timeout);
                restore_flags(flags);
        }
--- drivers/char/ftape/lowlevel/fdc-io.c        Fri Dec  3 18:51:50 1999
+++ drivers/char/ftape/lowlevel/fdc-io.c.new    Fri Sep  1 03:56:35 2000
@@ -386,7 +386,6 @@
 int fdc_interrupt_wait(unsigned int time)
 {
        DECLARE_WAITQUEUE(wait,current);
-       sigset_t old_sigmask;   
        static int resetting = 0;
        long timeout;
 
@@ -404,23 +403,12 @@
        /* timeout time will be up to USPT microseconds too long ! */
        timeout = (1000 * time + FT_USPT - 1) / FT_USPT;
 
-       spin_lock_irq(&current->sigmask_lock);
-       old_sigmask = current->blocked;
-       sigfillset(&current->blocked);
-       recalc_sigpending(current);
-       spin_unlock_irq(&current->sigmask_lock);
-
-       current->state = TASK_INTERRUPTIBLE;
        add_wait_queue(&ftape_wait_intr, &wait);
-       while (!ft_interrupt_seen && (current->state == TASK_INTERRUPTIBLE)) {
+       while (!ft_interrupt_seen && timeout) {
+               current->state = TASK_UNINTERRUPTIBLE;
                timeout = schedule_timeout(timeout);
         }
 
-       spin_lock_irq(&current->sigmask_lock);
-       current->blocked = old_sigmask;
-       recalc_sigpending(current);
-       spin_unlock_irq(&current->sigmask_lock);
-       
        remove_wait_queue(&ftape_wait_intr, &wait);
        /*  the following IS necessary. True: as well
         *  wake_up_interruptible() as the schedule() set TASK_RUNNING
--- drivers/sound/cmpci.c       Sat Aug 26 16:26:46 2000
+++ drivers/sound/cmpci.c.new   Fri Sep  1 03:58:33 2000
@@ -1194,9 +1194,9 @@
 
        if (s->dma_dac.mapped || !s->dma_dac.ready)
                return 0;
-        current->state = TASK_INTERRUPTIBLE;
         add_wait_queue(&s->dma_dac.wait, &wait);
         for (;;) {
+               current->state = TASK_INTERRUPTIBLE;
                 spin_lock_irqsave(&s->lock, flags);
                count = s->dma_dac.count;
                 spin_unlock_irqrestore(&s->lock, flags);
@@ -2031,9 +2031,9 @@
 
        lock_kernel();
        if (file->f_mode & FMODE_WRITE) {
-               __set_current_state(TASK_INTERRUPTIBLE);
                add_wait_queue(&s->midi.owait, &wait);
                for (;;) {
+                       __set_current_state(TASK_INTERRUPTIBLE);
                        spin_lock_irqsave(&s->lock, flags);
                        count = s->midi.ocnt;
                        spin_unlock_irqrestore(&s->lock, flags);
--- drivers/sound/maestro.c     Sat Aug 26 16:26:50 2000
+++ drivers/sound/maestro.c.new Fri Sep  1 03:59:56 2000
@@ -2122,9 +2122,9 @@
 
        if (s->dma_dac.mapped || !s->dma_dac.ready)
                return 0;
-       current->state = TASK_INTERRUPTIBLE;
         add_wait_queue(&s->dma_dac.wait, &wait);
         for (;;) {
+               current->state = TASK_INTERRUPTIBLE;
                /* XXX uhm.. questionable locking*/
                 spin_lock_irqsave(&s->lock, flags);
                count = s->dma_dac.count;
@@ -2140,8 +2140,6 @@
                 }
                tmo = (count * HZ) / s->ratedac;
                tmo >>= sample_shift[(s->fmt >> ESS_DAC_SHIFT) & ESS_FMT_MASK];
-               /* XXX this is just broken.  someone is waking us up alot, or 
schedule_timeout is broken.
-                       or something.  who cares. - zach */
                if (!schedule_timeout(tmo ? tmo : 1) && tmo)
                        M_printk(KERN_DEBUG "maestro: dma timed out?? %ld\n",jiffies);
         }
--- drivers/isdn/isdnloop/isdnloop.c    Wed Nov 17 18:50:29 1999
+++ drivers/isdn/isdnloop/isdnloop.c.new        Fri Sep  1 04:03:34 2000
@@ -1196,8 +1196,10 @@
                                                if (!card->leased) {
                                                        card->leased = 1;
                                                        while (card->ptype == 
ISDN_PTYPE_UNKNOWN) {
+                                                               
+set_current_state(TASK_UNINTERRUPTIBLE);
                                                                schedule_timeout(10);
                                                        }
+                                                       
+set_current_state(TASK_UNINTERRUPTIBLE);
                                                        schedule_timeout(10);
                                                        sprintf(cbuf, 
"00;FV2ON\n01;EAZ1\n02;EAZ2\n");
                                                        i = isdnloop_writecmd(cbuf, 
strlen(cbuf), 0, card);
--- drivers/usb/devio.c Sat Aug 26 16:26:55 2000
+++ drivers/usb/devio.c.new     Fri Sep  1 04:04:43 2000
@@ -84,10 +84,10 @@
        add_wait_queue(&s.wait, &wait);
        urb->context = &s;
        urb->complete = sync_completed;
-       set_current_state(TASK_INTERRUPTIBLE);
        if ((ret = usb_submit_urb(urb)))
                goto out;
        while (urb->status == -EINPROGRESS) {
+               set_current_state(TASK_INTERRUPTIBLE);
                tmdiff = tm - jiffies;
                if (tmdiff <= 0) {
                        ret = -ETIMEDOUT;
--- drivers/usb/usb.c   Sat Aug 26 16:26:58 2000
+++ drivers/usb/usb.c.new       Fri Sep  1 04:10:47 2000
@@ -865,7 +865,6 @@
        awd.wakeup = &wqh;
        awd.handler = 0;
        init_waitqueue_head(&wqh);      
-       current->state = TASK_INTERRUPTIBLE;
        add_wait_queue(&wqh, &wait);
        urb->context = &awd;
        status = usb_submit_urb(urb);
@@ -877,8 +876,10 @@
        }
 
        if (urb->status == -EINPROGRESS) {
-               while (timeout && urb->status == -EINPROGRESS)
+               while (timeout && urb->status == -EINPROGRESS) {
+                       current->state = TASK_UNINTERRUPTIBLE;
                        status = timeout = schedule_timeout(timeout);
+               }
        } else
                status = 1;
 

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
Please read the FAQ at http://www.tux.org/lkml/

Reply via email to