writeback: make balance_dirty_pages() gradually back more off
authorJens Axboe <jens.axboe@oracle.com>
Thu, 17 Sep 2009 17:59:14 +0000 (19:59 +0200)
committerJens Axboe <jens.axboe@oracle.com>
Mon, 21 Sep 2009 13:40:33 +0000 (15:40 +0200)
Currently it just sleeps for a very short time, just 1 jiffy. If
we keep looping in there, continually delay for a little longer
of up to 100msec in total. That was the old limit for congestion
wait.

Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
mm/page-writeback.c

index 2585349..d1ba464 100644 (file)
@@ -485,6 +485,7 @@ static void balance_dirty_pages(struct address_space *mapping)
        unsigned long bdi_thresh;
        unsigned long pages_written = 0;
        unsigned long write_chunk = sync_writeback_pages();
        unsigned long bdi_thresh;
        unsigned long pages_written = 0;
        unsigned long write_chunk = sync_writeback_pages();
+       unsigned long pause = 1;
 
        struct backing_dev_info *bdi = mapping->backing_dev_info;
 
 
        struct backing_dev_info *bdi = mapping->backing_dev_info;
 
@@ -561,7 +562,15 @@ static void balance_dirty_pages(struct address_space *mapping)
                if (pages_written >= write_chunk)
                        break;          /* We've done our duty */
 
                if (pages_written >= write_chunk)
                        break;          /* We've done our duty */
 
-               schedule_timeout_interruptible(1);
+               schedule_timeout_interruptible(pause);
+
+               /*
+                * Increase the delay for each loop, up to our previous
+                * default of taking a 100ms nap.
+                */
+               pause <<= 1;
+               if (pause > HZ / 10)
+                       pause = HZ / 10;
        }
 
        if (bdi_nr_reclaimable + bdi_nr_writeback < bdi_thresh &&
        }
 
        if (bdi_nr_reclaimable + bdi_nr_writeback < bdi_thresh &&