From: Ingo Molnar The attached patch fixes long scheduling latencies in select_parent() and prune_dcache(). The prune_dcache() lock-break is easy, but for select_parent() the only viable solution i found was to break out if there's a resched necessary - the reordering is not necessary and the dcache scanning/shrinking will later on do it anyway. This patch has been in the -VP patchset for weeks. Signed-off-by: Ingo Molnar Signed-off-by: Andrew Morton --- 25-akpm/fs/dcache.c | 11 +++++++++++ 1 files changed, 11 insertions(+) diff -puN fs/dcache.c~sched-vfs-fix-scheduling-latencies-in-prune_dcache-and-select_parent fs/dcache.c --- 25/fs/dcache.c~sched-vfs-fix-scheduling-latencies-in-prune_dcache-and-select_parent 2004-11-15 20:01:45.921695800 -0800 +++ 25-akpm/fs/dcache.c 2004-11-15 20:01:45.927694888 -0800 @@ -392,6 +392,8 @@ static void prune_dcache(int count) struct dentry *dentry; struct list_head *tmp; + cond_resched_lock(&dcache_lock); + tmp = dentry_unused.prev; if (tmp == &dentry_unused) break; @@ -564,6 +566,14 @@ resume: struct dentry *dentry = list_entry(tmp, struct dentry, d_child); next = tmp->next; + /* + * select_parent() is a performance optimization, it is + * not necessary to complete it. Abort if a reschedule is + * pending: + */ + if (need_resched()) + goto out; + if (!list_empty(&dentry->d_lru)) { dentry_stat.nr_unused--; list_del_init(&dentry->d_lru); @@ -601,6 +611,7 @@ this_parent->d_parent->d_name.name, this #endif goto resume; } +out: spin_unlock(&dcache_lock); return found; } _