diff options
author | Shaohua Li <shli@kernel.org> | 2013-08-29 15:40:32 +0800 |
---|---|---|
committer | NeilBrown <neilb@suse.de> | 2013-09-02 10:31:29 +1000 |
commit | bfc90cb0936f5b972706625f38f72c7cb726c20a (patch) | |
tree | 131194fdf489b6dd9eb3e165e6cd1c68bb4c629e /drivers/md/raid5.h | |
parent | 4d77e3ba88d085836f1e8e475e3131844dd89d04 (diff) |
raid5: only wakeup necessary threads
If there are not enough stripes to handle, we'd better not always
queue all available work_structs. If one worker can only handle small
or even none stripes, it will impact request merge and create lock
contention.
With this patch, the number of work_struct running will depend on
pending stripes number. Note: some statistics info used in the patch
are accessed without locking protection. This should doesn't matter,
we just try best to avoid queue unnecessary work_struct.
Signed-off-by: Shaohua Li <shli@fusionio.com>
Signed-off-by: NeilBrown <neilb@suse.de>
Diffstat (limited to 'drivers/md/raid5.h')
-rw-r--r-- | drivers/md/raid5.h | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/drivers/md/raid5.h b/drivers/md/raid5.h index 435b12d58165..2113ffa82c7a 100644 --- a/drivers/md/raid5.h +++ b/drivers/md/raid5.h @@ -213,6 +213,7 @@ struct stripe_head { enum reconstruct_states reconstruct_state; spinlock_t stripe_lock; int cpu; + struct r5worker_group *group; /** * struct stripe_operations * @target - STRIPE_OP_COMPUTE_BLK target @@ -369,12 +370,14 @@ struct disk_info { struct r5worker { struct work_struct work; struct r5worker_group *group; + bool working; }; struct r5worker_group { struct list_head handle_list; struct r5conf *conf; struct r5worker *workers; + int stripes_cnt; }; struct r5conf { |