summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Morton <akpm@osdl.org>2004-03-15 15:20:41 -0800
committerLinus Torvalds <torvalds@ppc970.osdl.org>2004-03-15 15:20:41 -0800
commit83e830d0e625adebde491e9a7b35b7b99a2c2f8f (patch)
tree2cd2e8d4bf4a74cf6c5d4927db2e62a751516bdd
parent82106056fd15a6cff965ff4cba5558596f3bb4e7 (diff)
[PATCH] resierfs: scheduling latency improvements
From: Chris Mason <mason@suse.com> Add conditional schedules to reiserfs to help lower latencies. Bits of this orginated long ago in code akpm sent me.
-rw-r--r--fs/reiserfs/stree.c13
-rw-r--r--include/linux/reiserfs_fs.h3
2 files changed, 8 insertions, 8 deletions
diff --git a/fs/reiserfs/stree.c b/fs/reiserfs/stree.c
index e632940e1e8c..c3402e5519be 100644
--- a/fs/reiserfs/stree.c
+++ b/fs/reiserfs/stree.c
@@ -652,8 +652,8 @@ int search_by_key (struct super_block * p_s_sb,
stop at leaf level - set to
DISK_LEAF_NODE_LEVEL */
) {
- int n_block_number = SB_ROOT_BLOCK (p_s_sb),
- expected_level = SB_TREE_HEIGHT (p_s_sb);
+ int n_block_number;
+ int expected_level;
struct buffer_head * p_s_bh;
struct path_element * p_s_last_element;
int n_node_level, n_retval;
@@ -677,6 +677,8 @@ int search_by_key (struct super_block * p_s_sb,
/* With each iteration of this loop we search through the items in the
current node, and calculate the next current node(next path element)
for the next iteration of this loop.. */
+ n_block_number = SB_ROOT_BLOCK (p_s_sb);
+ expected_level = SB_TREE_HEIGHT (p_s_sb);
while ( 1 ) {
#ifdef CONFIG_REISERFS_CHECK
@@ -706,16 +708,12 @@ int search_by_key (struct super_block * p_s_sb,
return IO_ERROR;
}
- if( fs_changed (fs_gen, p_s_sb) ) {
- PROC_INFO_INC( p_s_sb, search_by_key_fs_changed );
- PROC_INFO_INC( p_s_sb, sbk_fs_changed[ expected_level - 1 ] );
- }
-
/* It is possible that schedule occurred. We must check whether the key
to search is still in the tree rooted from the current buffer. If
not then repeat search from the root. */
if ( fs_changed (fs_gen, p_s_sb) &&
(!B_IS_IN_TREE (p_s_bh) || !key_in_buffer(p_s_search_path, p_s_key, p_s_sb)) ) {
+ PROC_INFO_INC( p_s_sb, search_by_key_fs_changed );
PROC_INFO_INC( p_s_sb, search_by_key_restarted );
PROC_INFO_INC( p_s_sb, sbk_restarted[ expected_level - 1 ] );
decrement_counters_in_path(p_s_search_path);
@@ -1103,6 +1101,7 @@ static char prepare_for_delete_or_cut(
for (n_counter = *p_n_removed;
n_counter < n_unfm_number; n_counter++, p_n_unfm_pointer-- ) {
+ cond_resched();
if (item_moved (&s_ih, p_s_path)) {
need_research = 1 ;
break;
diff --git a/include/linux/reiserfs_fs.h b/include/linux/reiserfs_fs.h
index f05d63a025c4..5525a2228a83 100644
--- a/include/linux/reiserfs_fs.h
+++ b/include/linux/reiserfs_fs.h
@@ -1335,7 +1335,8 @@ static inline loff_t max_reiserfs_offset (struct inode * inode)
#define fs_generation(s) (REISERFS_SB(s)->s_generation_counter)
#define get_generation(s) atomic_read (&fs_generation(s))
#define FILESYSTEM_CHANGED_TB(tb) (get_generation((tb)->tb_sb) != (tb)->fs_gen)
-#define fs_changed(gen,s) (gen != get_generation (s))
+#define __fs_changed(gen,s) (gen != get_generation (s))
+#define fs_changed(gen,s) ({cond_resched(); __fs_changed(gen, s);})
/***************************************************************************/