kernel - limit running io writes during fsync
authorMatthew Dillon <dillon@apollo.backplane.com>
Fri, 20 Aug 2010 05:33:35 +0000 (22:33 -0700)
committerMatthew Dillon <dillon@apollo.backplane.com>
Fri, 20 Aug 2010 05:33:35 +0000 (22:33 -0700)
* The fsync code was queueing an unlimited number of BUF/BIOs while
  flushing a file, which creates a very large write burden on the
  system, read stalls due to locked buffers, and can also blow out
  things like dm_target_crypt which must allocate side-buffers for
  the data.

* Fixes kmalloc exhaustion panics with dm_crypt.

* Improves read performance under heavy write loads (e.g. blogbench).

sys/kern/vfs_bio.c
sys/kern/vfs_subr.c
sys/sys/buf.h

index 0c25b03..0bb9198 100644 (file)
@@ -298,7 +298,7 @@ bufcountwakeup(void)
  * B_LOCKED dirty buffers, so also wait for at least one running buffer
  * to complete.
  */
-static __inline void
+void
 waitrunningbufspace(void)
 {
        int limit = hirunningspace * 2 / 3;
index 2ca81a8..6d0efe3 100644 (file)
@@ -813,6 +813,7 @@ vfsync_bp(struct buf *bp, void *data)
                        bremfree(bp);
                        bawrite(bp);
                }
+               waitrunningbufspace();
                if (info->lazylimit && info->lazycount >= info->lazylimit)
                        error = 1;
                else
index 23a9de3..3064ed0 100644 (file)
@@ -394,6 +394,7 @@ struct uio;
 void   bufinit (void);
 int    bd_heatup (void);
 void   bd_wait (int count);
+void   waitrunningbufspace(void);
 int    buf_dirty_count_severe (void);
 int    buf_runningbufspace_severe (void);
 void   initbufbio(struct buf *);