Commit 5edef83d authored by Andrew Morton's avatar Andrew Morton Committed by Linus Torvalds

[PATCH] md: Don't allow raid5 rebuild to swamp raid5 stripe cache

From: NeilBrown <neilb@cse.unsw.edu.au>

raid5 rebuild takes stripes so agressively that other access cannot get a
look-in.

With this patch, the rebuild pauses slightly if there is a shortage of
stripes to let other processes have a chance.

akpm: I was worried about starvation due to the harsh semantics of yield() in
2.6.  But Neil has performed specific testing for that and things seem OK. 
If people do note CPU starvation problems we will need to replace the yield()
with a schedule_timeout(1).
parent 0b3e92bc
...@@ -1395,7 +1395,14 @@ static int sync_request (mddev_t *mddev, sector_t sector_nr, int go_faster) ...@@ -1395,7 +1395,14 @@ static int sync_request (mddev_t *mddev, sector_t sector_nr, int go_faster)
first_sector = raid5_compute_sector(stripe*data_disks*sectors_per_chunk first_sector = raid5_compute_sector(stripe*data_disks*sectors_per_chunk
+ chunk_offset, raid_disks, data_disks, &dd_idx, &pd_idx, conf); + chunk_offset, raid_disks, data_disks, &dd_idx, &pd_idx, conf);
sh = get_active_stripe(conf, sector_nr, pd_idx, 0); sh = get_active_stripe(conf, sector_nr, pd_idx, 1);
if (sh == NULL) {
sh = get_active_stripe(conf, sector_nr, pd_idx, 0);
/* make sure we don't swamp the stripe cache if someone else
* is trying to get access
*/
yield();
}
spin_lock(&sh->lock); spin_lock(&sh->lock);
set_bit(STRIPE_SYNCING, &sh->state); set_bit(STRIPE_SYNCING, &sh->state);
clear_bit(STRIPE_INSYNC, &sh->state); clear_bit(STRIPE_INSYNC, &sh->state);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment