303b0b7
From: Takashi Iwai <tiwai@suse.de>
303b0b7
Date: Wed, 10 Dec 2014 16:38:30 +0100
303b0b7
Subject: [PATCH] blk-mq: Fix uninitialized kobject at CPU hotplugging
303b0b7
303b0b7
When a CPU is hotplugged, the current blk-mq spews a warning like:
303b0b7
303b0b7
  kobject '(null)' (ffffe8ffffc8b5d8): tried to add an uninitialized object, something is seriously wrong.
303b0b7
  CPU: 1 PID: 1386 Comm: systemd-udevd Not tainted 3.18.0-rc7-2.g088d59b-default #1
303b0b7
  Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.7.5-20140531_171129-lamiak 04/01/2014
303b0b7
   0000000000000000 0000000000000002 ffffffff81605f07 ffffe8ffffc8b5d8
303b0b7
   ffffffff8132c7a0 ffff88023341d370 0000000000000020 ffff8800bb05bd58
303b0b7
   ffff8800bb05bd08 000000000000a0a0 000000003f441940 0000000000000007
303b0b7
  Call Trace:
303b0b7
   [<ffffffff81005306>] dump_trace+0x86/0x330
303b0b7
   [<ffffffff81005644>] show_stack_log_lvl+0x94/0x170
303b0b7
   [<ffffffff81006d21>] show_stack+0x21/0x50
303b0b7
   [<ffffffff81605f07>] dump_stack+0x41/0x51
303b0b7
   [<ffffffff8132c7a0>] kobject_add+0xa0/0xb0
303b0b7
   [<ffffffff8130aee1>] blk_mq_register_hctx+0x91/0xb0
303b0b7
   [<ffffffff8130b82e>] blk_mq_sysfs_register+0x3e/0x60
303b0b7
   [<ffffffff81309298>] blk_mq_queue_reinit_notify+0xf8/0x190
303b0b7
   [<ffffffff8107cfdc>] notifier_call_chain+0x4c/0x70
303b0b7
   [<ffffffff8105fd23>] cpu_notify+0x23/0x50
303b0b7
   [<ffffffff81060037>] _cpu_up+0x157/0x170
303b0b7
   [<ffffffff810600d9>] cpu_up+0x89/0xb0
303b0b7
   [<ffffffff815fa5b5>] cpu_subsys_online+0x35/0x80
303b0b7
   [<ffffffff814323cd>] device_online+0x5d/0xa0
303b0b7
   [<ffffffff81432485>] online_store+0x75/0x80
303b0b7
   [<ffffffff81236a5a>] kernfs_fop_write+0xda/0x150
303b0b7
   [<ffffffff811c5532>] vfs_write+0xb2/0x1f0
303b0b7
   [<ffffffff811c5f42>] SyS_write+0x42/0xb0
303b0b7
   [<ffffffff8160c4ed>] system_call_fastpath+0x16/0x1b
303b0b7
   [<00007f0132fb24e0>] 0x7f0132fb24e0
303b0b7
303b0b7
This is indeed because of an uninitialized kobject for blk_mq_ctx.
303b0b7
The blk_mq_ctx kobjects are initialized in blk_mq_sysfs_init(), but it
303b0b7
goes loop over hctx_for_each_ctx(), i.e. it initializes only for
303b0b7
online CPUs.  Thus, when a CPU is hotplugged, the ctx for the newly
303b0b7
onlined CPU is registered without initialization.
303b0b7
303b0b7
This patch fixes the issue by initializing the all ctx kobjects
303b0b7
belonging to each queue.
303b0b7
303b0b7
Bugzilla: https://bugzilla.novell.com/show_bug.cgi?id=908794
303b0b7
Cc: <stable@vger.kernel.org>
303b0b7
Signed-off-by: Takashi Iwai <tiwai@suse.de>
303b0b7
Signed-off-by: Jens Axboe <axboe@fb.com>
303b0b7
---
303b0b7
 block/blk-mq-sysfs.c | 9 ++++-----
303b0b7
 1 file changed, 4 insertions(+), 5 deletions(-)
303b0b7
303b0b7
diff --git a/block/blk-mq-sysfs.c b/block/blk-mq-sysfs.c
303b0b7
index ed5217867555..e0fb3f4a628f 100644
303b0b7
--- a/block/blk-mq-sysfs.c
303b0b7
+++ b/block/blk-mq-sysfs.c
303b0b7
@@ -390,16 +390,15 @@ static void blk_mq_sysfs_init(struct request_queue *q)
303b0b7
 {
303b0b7
 	struct blk_mq_hw_ctx *hctx;
303b0b7
 	struct blk_mq_ctx *ctx;
303b0b7
-	int i, j;
303b0b7
+	int i;
303b0b7
 
303b0b7
 	kobject_init(&q->mq_kobj, &blk_mq_ktype);
303b0b7
 
303b0b7
-	queue_for_each_hw_ctx(q, hctx, i) {
303b0b7
+	queue_for_each_hw_ctx(q, hctx, i)
303b0b7
 		kobject_init(&hctx->kobj, &blk_mq_hw_ktype);
303b0b7
 
303b0b7
-		hctx_for_each_ctx(hctx, ctx, j)
303b0b7
-			kobject_init(&ctx->kobj, &blk_mq_ctx_ktype);
303b0b7
-	}
303b0b7
+	queue_for_each_ctx(q, ctx, i)
303b0b7
+		kobject_init(&ctx->kobj, &blk_mq_ctx_ktype);
303b0b7
 }
303b0b7
 
303b0b7
 int blk_mq_register_disk(struct gendisk *disk)
303b0b7
-- 
303b0b7
2.1.0
303b0b7