summaryrefslogtreecommitdiffstats
path: root/drivers/md/md.c
diff options
context:
space:
mode:
authorChao Yu2014-09-25 09:28:34 +0200
committerNeilBrown2014-10-14 04:08:28 +0200
commit50bd3774058137e687b41da8b31fdd3544f7d901 (patch)
tree73e3c10f5721e20064e6d48115ed295f9f447e43 /drivers/md/md.c
parentmd: simplify export_array() (diff)
downloadkernel-qcow2-linux-50bd3774058137e687b41da8b31fdd3544f7d901.tar.gz
kernel-qcow2-linux-50bd3774058137e687b41da8b31fdd3544f7d901.tar.xz
kernel-qcow2-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/md.c')
-rw-r--r--drivers/md/md.c3
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;
}