On 2019/4/23 3:13 下午, Hannes Reinecke wrote: > On 4/19/19 6:05 PM, Coly Li wrote: >> This patch tries to release mutex bch_register_lock early, to give >> chance to stop cache set and bcache device early. >> >> This patch also expends time out of stopping all bcache device from >> 2 seconds to 10 seconds, because stopping writeback rate update worker >> may delay for 5 seconds, 2 seconds is not enough. >> >> After this patch applied, stopping bcache devices during system reboot >> or shutdown is very hard to be observed any more. >> >> Signed-off-by: Coly Li <colyli@xxxxxxx> >> --- >> drivers/md/bcache/super.c | 6 ++++-- >> 1 file changed, 4 insertions(+), 2 deletions(-) >> >> diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c >> index e988e46a6479..2d377a4a182f 100644 >> --- a/drivers/md/bcache/super.c >> +++ b/drivers/md/bcache/super.c >> @@ -2453,10 +2453,13 @@ static int bcache_reboot(struct notifier_block >> *n, unsigned long code, void *x) >> list_for_each_entry_safe(dc, tdc, &uncached_devices, list) >> bcache_device_stop(&dc->disk); >> + mutex_unlock(&bch_register_lock); >> + >> /* What's a condition variable? */ >> while (1) { >> - long timeout = start + 2 * HZ - jiffies; >> + long timeout = start + 10 * HZ - jiffies; >> + mutex_lock(&bch_register_lock); >> stopped = list_empty(&bch_cache_sets) && >> list_empty(&uncached_devices); >> @@ -2468,7 +2471,6 @@ static int bcache_reboot(struct notifier_block >> *n, unsigned long code, void *x) >> mutex_unlock(&bch_register_lock); >> schedule_timeout(timeout); >> - mutex_lock(&bch_register_lock); >> } >> finish_wait(&unregister_wait, &wait); >> Maybe you should even call 'schedule()' after the first mutex_unlock() > to force execution of other tasks. > But anyway: > Hi Hannes, It makes sense for an explicit schedule(). I will add it in next version. Thanks. > Reviewed-by: Hannes Reinecke <hare@xxxxxxxx> > > Cheers, > > Hannes -- Coly Li