]> git.hungrycats.org Git - linux/commitdiff
[XFS] Stop using sleep_on
authorChristoph Hellwig <hch@sgi.com>
Sat, 31 Jan 2004 01:33:34 +0000 (12:33 +1100)
committerChristoph Hellwig <hch@sgi.com>
Sat, 31 Jan 2004 01:33:34 +0000 (12:33 +1100)
SGI Modid: xfs-linux:xfs-kern:165673a

fs/xfs/linux/xfs_buf.c

index 07edfd52478510f2c23aebe0a02edab872764c40..4805c2e4318a7061a239c33b58d26b4c3bb6cbb7 100644 (file)
@@ -81,7 +81,7 @@
  */
 
 STATIC kmem_cache_t *pagebuf_cache;
-STATIC void pagebuf_daemon_wakeup(int);
+STATIC void pagebuf_daemon_wakeup(void);
 STATIC void pagebuf_delwri_queue(page_buf_t *, int);
 STATIC struct workqueue_struct *pagebuf_logio_workqueue;
 STATIC struct workqueue_struct *pagebuf_dataio_workqueue;
@@ -516,7 +516,7 @@ _pagebuf_lookup_pages(
                        if (!page) {
                                if (--retry_count > 0) {
                                        PB_STATS_INC(pb_page_retries);
-                                       pagebuf_daemon_wakeup(1);
+                                       pagebuf_daemon_wakeup();
                                        current->state = TASK_UNINTERRUPTIBLE;
                                        schedule_timeout(10);
                                        goto retry;
@@ -1646,7 +1646,6 @@ pagebuf_iomove(
  * Pagebuf delayed write buffer handling
  */
 
-STATIC int pbd_active = 1;
 STATIC LIST_HEAD(pbd_delwrite_queue);
 STATIC spinlock_t pbd_delwrite_lock = SPIN_LOCK_UNLOCKED;
 
@@ -1693,21 +1692,19 @@ pagebuf_runall_queues(
 }
 
 /* Defines for pagebuf daemon */
-DECLARE_WAIT_QUEUE_HEAD(pbd_waitq);
+STATIC DECLARE_COMPLETION(pagebuf_daemon_done);
+STATIC struct task_struct *pagebuf_daemon_task;
+STATIC int pagebuf_daemon_active;
 STATIC int force_flush;
 
 STATIC void
-pagebuf_daemon_wakeup(
-       int                     flag)
+pagebuf_daemon_wakeup(void)
 {
-       force_flush = flag;
-       if (waitqueue_active(&pbd_waitq)) {
-               wake_up_interruptible(&pbd_waitq);
-       }
+       force_flush = 1;
+       barrier();
+       wake_up_process(pagebuf_daemon_task);
 }
 
-typedef void (*timeout_fn)(unsigned long);
-
 STATIC int
 pagebuf_daemon(
        void                    *data)
@@ -1715,29 +1712,23 @@ pagebuf_daemon(
        int                     count;
        page_buf_t              *pb;
        struct list_head        *curr, *next, tmp;
-       struct timer_list       pb_daemon_timer =
-               TIMER_INITIALIZER((timeout_fn)pagebuf_daemon_wakeup, 0, 0);
 
        /*  Set up the thread  */
        daemonize("pagebufd");
-
        current->flags |= PF_MEMALLOC;
 
+       pagebuf_daemon_task = current;
+       pagebuf_daemon_active = 1;
+       barrier();
+
        INIT_LIST_HEAD(&tmp);
        do {
                /* swsusp */
                if (current->flags & PF_FREEZE)
                        refrigerator(PF_IOTHREAD);
 
-               if (pbd_active == 1) {
-                       mod_timer(&pb_daemon_timer,
-                                 jiffies + pb_params.flush_interval.val);
-                       interruptible_sleep_on(&pbd_waitq);
-               }
-
-               if (pbd_active == 0) {
-                       del_timer_sync(&pb_daemon_timer);
-               }
+               set_current_state(TASK_INTERRUPTIBLE);
+               schedule_timeout(pb_params.flush_interval.val);
 
                spin_lock(&pbd_delwrite_lock);
 
@@ -1781,12 +1772,9 @@ pagebuf_daemon(
                        blk_run_queues();
 
                force_flush = 0;
-       } while (pbd_active == 1);
-
-       pbd_active = -1;
-       wake_up_interruptible(&pbd_waitq);
+       } while (pagebuf_daemon_active);
 
-       return 0;
+       complete_and_exit(&pagebuf_daemon_done, 0);
 }
 
 void
@@ -1896,9 +1884,10 @@ pagebuf_daemon_start(void)
 STATIC void
 pagebuf_daemon_stop(void)
 {
-       pbd_active = 0;
-       wake_up_interruptible(&pbd_waitq);
-       wait_event_interruptible(pbd_waitq, pbd_active);
+       pagebuf_daemon_active = 0;
+       barrier();
+       wait_for_completion(&pagebuf_daemon_done);
+
        destroy_workqueue(pagebuf_logio_workqueue);
        destroy_workqueue(pagebuf_dataio_workqueue);
 }