From 9e32061a8e77bf33d1d9955ca5acb3470935fd06 Mon Sep 17 00:00:00 2001 From: Anders Roxell Date: Mon, 30 Jun 2014 15:44:45 +0200 Subject: Changes since v3.14.2-rt2 - rwsem readers are now not allowed to nest. A patch rom Steven Rostedt. - a few bugs were fixed in the hotplug code which were made during the v3.14 port. Fixed by Mike Galbraith. - Mike Galbraith sent a patch which might fix lazy preempt on x86_64. Patch applied and my machine still explodes therefore lazy preempt remains off on x86_64. - Mike Galbraith sent a few patches to get cpu hoplug to work. This includes lg_global_trylock_relax(). - A few push downs of migrate_disable() (where we call migrate_disable() after the rt_mutex_trylock()) have been reverted. It seems hotplug is not too happy about this. A patch by Steven Rostedt and and Mike Galbraith - There was a complaint about a backrace from run_local_timers() in UP mode because a spin_try_lock() failed. _This_ particular case was not an error. This optimization was for FULL_NO_HZ which is pointless on UP because there is no spare CPU. Therefore, this optimization is disabled in UP mode and the backtrace is gone. Reported by Stanislav Meduna. - block-mq notifier uses now a spinlock and runs during CPU_POST_DEAD instead at CPU_DEAD time. lockdep complained about the sleeping ctx->lock within the rawlock (blk_mq_cpu_notify_lock) and CPU_DEAD runs with irqs off. Known issues: - bcache is disabled. - lazy preempt on x86_64 leads to a crash with some load. - CPU hotplug works in general. Steven's test script however deadlocks usually on the second invocation. Signed-off-by: Anders Roxell --- block/blk-mq.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'block') diff --git a/block/blk-mq.c b/block/blk-mq.c index 25afbcc3a742..5fb26f785320 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c @@ -48,9 +48,14 @@ static struct blk_mq_ctx *blk_mq_get_ctx(struct request_queue *q) return __blk_mq_get_ctx(q, get_cpu_light()); } -static void blk_mq_put_ctx(struct blk_mq_ctx *ctx) +static void __blk_mq_put_ctx(struct blk_mq_ctx *ctx) { spin_unlock(&ctx->cpu_lock); +} + +static void blk_mq_put_ctx(struct blk_mq_ctx *ctx) +{ + __blk_mq_put_ctx(ctx); put_cpu_light(); } @@ -980,6 +985,7 @@ static void blk_mq_hctx_notify(void *data, unsigned long action, clear_bit(ctx->index_hw, hctx->ctx_map); } spin_unlock(&ctx->lock); + __blk_mq_put_ctx(ctx); if (list_empty(&tmp)) return; -- cgit v1.2.3