Re: [PATCH 3/3] md/raid5: per hash value and exclusive wait_for_stripe
From: NeilBrown <hidden>
Date: 2015-05-14 06:09:27
Also in:
lkml
Attachments
- (unnamed) [application/pgp-signature] 811 bytes
From: NeilBrown <hidden>
Date: 2015-05-14 06:09:27
Also in:
lkml
On Thu, 14 May 2015 13:55:08 +0800 Yuanhan Liu [off-list ref] wrote:
On Thu, May 14, 2015 at 03:45:11PM +1000, NeilBrown wrote:quoted
On Wed, 29 Apr 2015 10:48:55 +0800 Yuanhan Liu [off-list ref] wrote:quoted
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index 64d5bea..697d77a 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c@@ -344,7 +344,8 @@ static void release_inactive_stripe_list(struct r5conf *conf, int hash) { int size; - bool do_wakeup = false; + unsigned long do_wakeup = 0; + int i = 0; unsigned long flags; if (hash == NR_STRIPE_HASH_LOCKS) {@@ -365,15 +366,19 @@ static void release_inactive_stripe_list(struct r5conf *conf, !list_empty(list)) atomic_dec(&conf->empty_inactive_list_nr); list_splice_tail_init(list, conf->inactive_list + hash); - do_wakeup = true; + do_wakeup |= 1 << (size - 1); spin_unlock_irqrestore(conf->hash_locks + hash, flags); } size--; hash--; } + for (i = 0; i < NR_STRIPE_HASH_LOCKS; i++) { + if (do_wakeup & (1 << i)) + wake_up(&conf->wait_for_stripe[i]); + } +hi, I've been doing some testing and got a lock-up in resize_stripes, waiting on wait_for_stripe[]. Looking at the above code, I think do_wakeup |= 1 << (size - 1); should be do_wakeup |= 1 << hash; do you agree? Or am I missing something?Right. Sorry for the careless mistake.
Thanks for confirming. Mistakes happen - that's why we test :-) I've merged that fix into your patch. NeilBrown