aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Mason <chris.mason@oracle.com>2009-01-22 09:23:10 -0500
committerChris Mason <chris.mason@oracle.com>2009-01-22 09:23:10 -0500
commita717531942f488209dded30f6bc648167bcefa72 (patch)
treef4e0c852d4462574ade5e965585647e7a253abe3
parent1506fcc8189cdd4b95e06df7845a09f18b4526a6 (diff)
Btrfs: do less aggressive btree readahead
Just before reading a leaf, btrfs scans the node for blocks that are close by and reads them too. It tries to build up a large window of IO looking for blocks that are within a max distance from the top and bottom of the IO window. This patch changes things to just look for blocks within 64k of the target block. It will trigger less IO and make for lower latencies on the read size. Signed-off-by: Chris Mason <chris.mason@oracle.com>
-rw-r--r--fs/btrfs/ctree.c21
1 files changed, 5 insertions, 16 deletions
diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c
index 9e46c0776816..2603ee539b7a 100644
--- a/fs/btrfs/ctree.c
+++ b/fs/btrfs/ctree.c
@@ -1210,8 +1210,7 @@ static noinline void reada_for_search(struct btrfs_root *root,
1210 struct btrfs_disk_key disk_key; 1210 struct btrfs_disk_key disk_key;
1211 u32 nritems; 1211 u32 nritems;
1212 u64 search; 1212 u64 search;
1213 u64 lowest_read; 1213 u64 target;
1214 u64 highest_read;
1215 u64 nread = 0; 1214 u64 nread = 0;
1216 int direction = path->reada; 1215 int direction = path->reada;
1217 struct extent_buffer *eb; 1216 struct extent_buffer *eb;
@@ -1235,8 +1234,7 @@ static noinline void reada_for_search(struct btrfs_root *root,
1235 return; 1234 return;
1236 } 1235 }
1237 1236
1238 highest_read = search; 1237 target = search;
1239 lowest_read = search;
1240 1238
1241 nritems = btrfs_header_nritems(node); 1239 nritems = btrfs_header_nritems(node);
1242 nr = slot; 1240 nr = slot;
@@ -1256,24 +1254,15 @@ static noinline void reada_for_search(struct btrfs_root *root,
1256 break; 1254 break;
1257 } 1255 }
1258 search = btrfs_node_blockptr(node, nr); 1256 search = btrfs_node_blockptr(node, nr);
1259 if ((search >= lowest_read && search <= highest_read) || 1257 if ((search <= target && target - search <= 65536) ||
1260 (search < lowest_read && lowest_read - search <= 16384) || 1258 (search > target && search - target <= 65536)) {
1261 (search > highest_read && search - highest_read <= 16384)) {
1262 readahead_tree_block(root, search, blocksize, 1259 readahead_tree_block(root, search, blocksize,
1263 btrfs_node_ptr_generation(node, nr)); 1260 btrfs_node_ptr_generation(node, nr));
1264 nread += blocksize; 1261 nread += blocksize;
1265 } 1262 }
1266 nscan++; 1263 nscan++;
1267 if (path->reada < 2 && (nread > (64 * 1024) || nscan > 32)) 1264 if ((nread > 65536 || nscan > 32))
1268 break; 1265 break;
1269
1270 if (nread > (256 * 1024) || nscan > 128)
1271 break;
1272
1273 if (search < lowest_read)
1274 lowest_read = search;
1275 if (search > highest_read)
1276 highest_read = search;
1277 } 1266 }
1278} 1267}
1279 1268