Messages in this thread Patch in this message | | | From | Sebastian Andrzej Siewior <> | Subject | [PATCH 20/21] blk: mq: cpu-notif: Convert to hotplug state machine | Date | Tue, 6 Sep 2016 19:04:56 +0200 |
| |
Install the callbacks via the state machine. The only currently handled callback is CPU_DEAD and this one is converted.
Cc: Jens Axboe <axboe@kernel.dk> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> --- This patch against linux-next to take the block changes into account. It depends on "blk: mq: reserve hotplug ID states for block"
block/blk-mq-cpu.c | 15 +++++++-------- block/blk-mq.c | 17 ++++------------- block/blk-mq.h | 2 +- include/linux/blk-mq.h | 2 +- 4 files changed, 13 insertions(+), 23 deletions(-)
--- a/block/blk-mq-cpu.c +++ b/block/blk-mq-cpu.c @@ -18,18 +18,16 @@ static LIST_HEAD(blk_mq_cpu_notify_list); static DEFINE_RAW_SPINLOCK(blk_mq_cpu_notify_lock); -static int blk_mq_main_cpu_notify(struct notifier_block *self, - unsigned long action, void *hcpu) +static int blk_mq_main_cpu_dead(unsigned int cpu) { - unsigned int cpu = (unsigned long) hcpu; struct blk_mq_cpu_notifier *notify; - int ret = NOTIFY_OK; + int ret; raw_spin_lock(&blk_mq_cpu_notify_lock); list_for_each_entry(notify, &blk_mq_cpu_notify_list, list) { - ret = notify->notify(notify->data, action, cpu); - if (ret != NOTIFY_OK) + ret = notify->notify(notify->data, cpu); + if (ret) break; } @@ -54,7 +52,7 @@ void blk_mq_unregister_cpu_notifier(stru } void blk_mq_init_cpu_notifier(struct blk_mq_cpu_notifier *notifier, - int (*fn)(void *, unsigned long, unsigned int), + int (*fn)(void *, unsigned int), void *data) { notifier->notify = fn; @@ -63,5 +61,6 @@ void blk_mq_init_cpu_notifier(struct blk void __init blk_mq_cpu_init(void) { - hotcpu_notifier(blk_mq_main_cpu_notify, 0); + cpuhp_setup_state_nocalls(CPUHP_BLKMQ_DEAD, "block/mq:dead", NULL, + blk_mq_main_cpu_dead); } --- a/block/blk-mq.c +++ b/block/blk-mq.c @@ -1649,7 +1649,7 @@ static int blk_mq_hctx_cpu_offline(struc spin_unlock(&ctx->lock); if (list_empty(&tmp)) - return NOTIFY_OK; + return 0; ctx = blk_mq_get_ctx(q); spin_lock(&ctx->lock); @@ -1669,23 +1669,14 @@ static int blk_mq_hctx_cpu_offline(struc blk_mq_run_hw_queue(hctx, true); blk_mq_put_ctx(ctx); - return NOTIFY_OK; + return 0; } -static int blk_mq_hctx_notify(void *data, unsigned long action, - unsigned int cpu) +static int blk_mq_hctx_notify(void *data, unsigned int cpu) { struct blk_mq_hw_ctx *hctx = data; - if (action == CPU_DEAD || action == CPU_DEAD_FROZEN) - return blk_mq_hctx_cpu_offline(hctx, cpu); - - /* - * In case of CPU online, tags may be reallocated - * in blk_mq_map_swqueue() after mapping is updated. - */ - - return NOTIFY_OK; + return blk_mq_hctx_cpu_offline(hctx, cpu); } /* hctx->ctxs will be freed in queue's release handler */ --- a/block/blk-mq.h +++ b/block/blk-mq.h @@ -36,7 +36,7 @@ void blk_mq_wake_waiters(struct request_ */ struct blk_mq_cpu_notifier; void blk_mq_init_cpu_notifier(struct blk_mq_cpu_notifier *notifier, - int (*fn)(void *, unsigned long, unsigned int), + int (*fn)(void *, unsigned int), void *data); void blk_mq_register_cpu_notifier(struct blk_mq_cpu_notifier *notifier); void blk_mq_unregister_cpu_notifier(struct blk_mq_cpu_notifier *notifier); --- a/include/linux/blk-mq.h +++ b/include/linux/blk-mq.h @@ -9,7 +9,7 @@ struct blk_flush_queue; struct blk_mq_cpu_notifier { struct list_head list; void *data; - int (*notify)(void *data, unsigned long action, unsigned int cpu); + int (*notify)(void *data, unsigned int cpu); }; struct blk_mq_ctxmap {
| |