diff options
author | Jaegeuk Kim <jaegeuk.kim@samsung.com> | 2013-04-29 03:58:39 -0400 |
---|---|---|
committer | Jaegeuk Kim <jaegeuk.kim@samsung.com> | 2013-04-29 23:07:32 -0400 |
commit | ac5d156c78a68b39955ee9b09498ba93831c77d7 (patch) | |
tree | 638245b8a39332d3bb2878c5a0a8574e518fcc37 /fs/f2fs/node.c | |
parent | b743ba78ae4c7c6a6e08e623af824b6208f58019 (diff) |
f2fs: modify the number of issued pages to merge IOs
When testing f2fs on an SSD, I found some 128 page IOs followed by 1 page IO
were issued by f2fs_write_node_pages.
This means that there were some mishandling flows which degrades performance.
Previous f2fs_write_node_pages determines the number of pages to be written,
nr_to_write, as follows.
1. The bio_get_nr_vecs returns 129 pages.
2. The bio_alloc makes a room for 128 pages.
3. The initial 128 pages go into one bio.
4. The existing bio is submitted, and a new bio is prepared for the last 1 page.
5. Finally, sync_node_pages submits the last 1 page bio.
The problem is from the use of bio_get_nr_vecs, so this patch replace it
with max_hw_blocks using queue_max_sectors.
Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
Diffstat (limited to 'fs/f2fs/node.c')
-rw-r--r-- | fs/f2fs/node.c | 6 |
1 files changed, 2 insertions, 4 deletions
diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c index f14eb7b8b2c4..7209d637f942 100644 --- a/fs/f2fs/node.c +++ b/fs/f2fs/node.c | |||
@@ -1171,7 +1171,6 @@ static int f2fs_write_node_pages(struct address_space *mapping, | |||
1171 | struct writeback_control *wbc) | 1171 | struct writeback_control *wbc) |
1172 | { | 1172 | { |
1173 | struct f2fs_sb_info *sbi = F2FS_SB(mapping->host->i_sb); | 1173 | struct f2fs_sb_info *sbi = F2FS_SB(mapping->host->i_sb); |
1174 | struct block_device *bdev = sbi->sb->s_bdev; | ||
1175 | long nr_to_write = wbc->nr_to_write; | 1174 | long nr_to_write = wbc->nr_to_write; |
1176 | 1175 | ||
1177 | /* First check balancing cached NAT entries */ | 1176 | /* First check balancing cached NAT entries */ |
@@ -1185,10 +1184,9 @@ static int f2fs_write_node_pages(struct address_space *mapping, | |||
1185 | return 0; | 1184 | return 0; |
1186 | 1185 | ||
1187 | /* if mounting is failed, skip writing node pages */ | 1186 | /* if mounting is failed, skip writing node pages */ |
1188 | wbc->nr_to_write = bio_get_nr_vecs(bdev); | 1187 | wbc->nr_to_write = max_hw_blocks(sbi); |
1189 | sync_node_pages(sbi, 0, wbc); | 1188 | sync_node_pages(sbi, 0, wbc); |
1190 | wbc->nr_to_write = nr_to_write - | 1189 | wbc->nr_to_write = nr_to_write - (max_hw_blocks(sbi) - wbc->nr_to_write); |
1191 | (bio_get_nr_vecs(bdev) - wbc->nr_to_write); | ||
1192 | return 0; | 1190 | return 0; |
1193 | } | 1191 | } |
1194 | 1192 | ||