summaryrefslogtreecommitdiffstats
path: root/fs/btrfs/async-thread.h
diff options
context:
space:
mode:
authorQu Wenruo <quwenruo@cn.fujitsu.com>2014-02-28 10:46:05 +0800
committerJosef Bacik <jbacik@fb.com>2014-03-10 15:17:04 -0400
commit0bd9289c28c3b6a38f5a05a812afae0274674fa2 (patch)
tree784a5bd81a9b6692f07f34604d83433b1ef8ff21 /fs/btrfs/async-thread.h
parent1ca08976ae94f3594dd7303584581cf8099ce47e (diff)
downloadlinux-0bd9289c28c3b6a38f5a05a812afae0274674fa2.tar.gz
linux-0bd9289c28c3b6a38f5a05a812afae0274674fa2.tar.bz2
linux-0bd9289c28c3b6a38f5a05a812afae0274674fa2.zip
btrfs: Add threshold workqueue based on kernel workqueue
The original btrfs_workers has thresholding functions to dynamically create or destroy kthreads. Though there is no such function in kernel workqueue because the worker is not created manually, we can still use the workqueue_set_max_active to simulated the behavior, mainly to achieve a better HDD performance by setting a high threshold on submit_workers. (Sadly, no resource can be saved) So in this patch, extra workqueue pending counters are introduced to dynamically change the max active of each btrfs_workqueue_struct, hoping to restore the behavior of the original thresholding function. Also, workqueue_set_max_active use a mutex to protect workqueue_struct, which is not meant to be called too frequently, so a new interval mechanism is applied, that will only call workqueue_set_max_active after a count of work is queued. Hoping to balance both the random and sequence performance on HDD. Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com> Tested-by: David Sterba <dsterba@suse.cz> Signed-off-by: Josef Bacik <jbacik@fb.com>
Diffstat (limited to 'fs/btrfs/async-thread.h')
-rw-r--r--fs/btrfs/async-thread.h3
1 files changed, 2 insertions, 1 deletions
diff --git a/fs/btrfs/async-thread.h b/fs/btrfs/async-thread.h
index fce623cfe3da..3129d8a6128b 100644
--- a/fs/btrfs/async-thread.h
+++ b/fs/btrfs/async-thread.h
@@ -138,7 +138,8 @@ struct btrfs_work_struct {
struct btrfs_workqueue_struct *btrfs_alloc_workqueue(char *name,
int flags,
- int max_active);
+ int max_active,
+ int thresh);
void btrfs_init_work(struct btrfs_work_struct *work,
void (*func)(struct btrfs_work_struct *),
void (*ordered_func)(struct btrfs_work_struct *),