diff options
author | Chao Yu <chao2.yu@samsung.com> | 2014-09-25 15:28:34 +0800 |
---|---|---|
committer | NeilBrown <neilb@suse.de> | 2014-10-14 13:08:28 +1100 |
commit | 50bd3774058137e687b41da8b31fdd3544f7d901 (patch) | |
tree | 73e3c10f5721e20064e6d48115ed295f9f447e43 /drivers/md | |
parent | 0638bb0e732fa2c839fceec93fc02e2347e0f596 (diff) | |
download | linux-50bd3774058137e687b41da8b31fdd3544f7d901.tar.gz linux-50bd3774058137e687b41da8b31fdd3544f7d901.tar.bz2 linux-50bd3774058137e687b41da8b31fdd3544f7d901.zip |
md: avoid potential long delay under pers_lock
printk may cause long time lapse if value of printk_delay in sysctl is
configured large by user. If register_md_personality takes long time to print in
spinlock pers_lock, we may encounter high CPU usage rate when there are other
pers_lock competitors who may be blocked to spin.
We can avoid this condition by moving printk out of coverage of pers_lock
spinlock.
Signed-off-by: Chao Yu <chao2.yu@samsung.com>
Signed-off-by: NeilBrown <neilb@suse.de>
Diffstat (limited to 'drivers/md')
-rw-r--r-- | drivers/md/md.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c index d96aa8094736..d3a33a95e527 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -7187,9 +7187,10 @@ static const struct file_operations md_seq_fops = { int register_md_personality(struct md_personality *p) { + printk(KERN_INFO "md: %s personality registered for level %d\n", + p->name, p->level); spin_lock(&pers_lock); list_add_tail(&p->list, &pers_list); - printk(KERN_INFO "md: %s personality registered for level %d\n", p->name, p->level); spin_unlock(&pers_lock); return 0; } |