summaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorCorrado Zoccolo <czoccolo@gmail.com>2010-09-20 15:24:50 +0200
committerJens Axboe <jaxboe@fusionio.com>2010-09-20 15:24:50 +0200
commit749ef9f8423054e326f3a246327ed2db4b6d395f (patch)
tree388df763e4e731f5d9b4d8dcaedca641521571e3 /fs
parent6d0aed7a38d06284db2a0e46c0a072b0c1c3299b (diff)
downloadlinux-stable-749ef9f8423054e326f3a246327ed2db4b6d395f.tar.gz
linux-stable-749ef9f8423054e326f3a246327ed2db4b6d395f.tar.bz2
linux-stable-749ef9f8423054e326f3a246327ed2db4b6d395f.zip
cfq: improve fsync performance for small files
Fsync performance for small files achieved by cfq on high-end disks is lower than what deadline can achieve, due to idling introduced between the sync write happening in process context and the journal commit. Moreover, when competing with a sequential reader, a process writing small files and fsync-ing them is starved. This patch fixes the two problems by: - marking journal commits as WRITE_SYNC, so that they get the REQ_NOIDLE flag set, - force all queues that have REQ_NOIDLE requests to be put in the noidle tree. Having the queue associated to the fsync-ing process and the one associated to journal commits in the noidle tree allows: - switching between them without idling, - fairness vs. competing idling queues, since they will be serviced only after the noidle tree expires its slice. Acked-by: Vivek Goyal <vgoyal@redhat.com> Reviewed-by: Jeff Moyer <jmoyer@redhat.com> Tested-by: Jeff Moyer <jmoyer@redhat.com> Signed-off-by: Corrado Zoccolo <czoccolo@gmail.com> Signed-off-by: Jens Axboe <jaxboe@fusionio.com>
Diffstat (limited to 'fs')
-rw-r--r--fs/jbd/commit.c2
-rw-r--r--fs/jbd2/commit.c2
2 files changed, 2 insertions, 2 deletions
diff --git a/fs/jbd/commit.c b/fs/jbd/commit.c
index 95d8c11c929e..3f030e9efea6 100644
--- a/fs/jbd/commit.c
+++ b/fs/jbd/commit.c
@@ -318,7 +318,7 @@ void journal_commit_transaction(journal_t *journal)
int first_tag = 0;
int tag_flag;
int i;
- int write_op = WRITE;
+ int write_op = WRITE_SYNC;
/*
* First job: lock down the current transaction and wait for
diff --git a/fs/jbd2/commit.c b/fs/jbd2/commit.c
index 7c068c189d80..80910f51d4b4 100644
--- a/fs/jbd2/commit.c
+++ b/fs/jbd2/commit.c
@@ -360,7 +360,7 @@ void jbd2_journal_commit_transaction(journal_t *journal)
int tag_bytes = journal_tag_bytes(journal);
struct buffer_head *cbh = NULL; /* For transactional checksums */
__u32 crc32_sum = ~0;
- int write_op = WRITE;
+ int write_op = WRITE_SYNC;
/*
* First job: lock down the current transaction and wait for