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>
This commit is contained in:
@@ -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 {
|
||||
|
Reference in New Issue
Block a user