aboutsummaryrefslogtreecommitdiffstats
path: root/block
diff options
context:
space:
mode:
authorJens Axboe <axboe@fb.com>2014-05-21 15:59:08 -0400
committerJens Axboe <axboe@fb.com>2014-05-21 15:59:08 -0400
commite814e71ba4a6e1d7509b0f4b1928365ea650cace (patch)
tree0db6c8a94340addf1f8cab4c4b761bca8df9ab11 /block
parentda41a589f52464e24ddefe76814ee35bfb07950c (diff)
blk-mq: allow the hctx cpu hotplug notifier to return errors
Prepare this for the next patch which adds more smarts in the plugging logic, so that we can save some memory. Signed-off-by: Jens Axboe <axboe@fb.com>
Diffstat (limited to 'block')
-rw-r--r--block/blk-mq-cpu.c12
-rw-r--r--block/blk-mq.c9
-rw-r--r--block/blk-mq.h2
3 files changed, 14 insertions, 9 deletions
diff --git a/block/blk-mq-cpu.c b/block/blk-mq-cpu.c
index 136ef8643bba..d2c253f71b86 100644
--- a/block/blk-mq-cpu.c
+++ b/block/blk-mq-cpu.c
@@ -18,14 +18,18 @@ static int blk_mq_main_cpu_notify(struct notifier_block *self,
18{ 18{
19 unsigned int cpu = (unsigned long) hcpu; 19 unsigned int cpu = (unsigned long) hcpu;
20 struct blk_mq_cpu_notifier *notify; 20 struct blk_mq_cpu_notifier *notify;
21 int ret = NOTIFY_OK;
21 22
22 raw_spin_lock(&blk_mq_cpu_notify_lock); 23 raw_spin_lock(&blk_mq_cpu_notify_lock);
23 24
24 list_for_each_entry(notify, &blk_mq_cpu_notify_list, list) 25 list_for_each_entry(notify, &blk_mq_cpu_notify_list, list) {
25 notify->notify(notify->data, action, cpu); 26 ret = notify->notify(notify->data, action, cpu);
27 if (ret != NOTIFY_OK)
28 break;
29 }
26 30
27 raw_spin_unlock(&blk_mq_cpu_notify_lock); 31 raw_spin_unlock(&blk_mq_cpu_notify_lock);
28 return NOTIFY_OK; 32 return ret;
29} 33}
30 34
31void blk_mq_register_cpu_notifier(struct blk_mq_cpu_notifier *notifier) 35void blk_mq_register_cpu_notifier(struct blk_mq_cpu_notifier *notifier)
@@ -45,7 +49,7 @@ void blk_mq_unregister_cpu_notifier(struct blk_mq_cpu_notifier *notifier)
45} 49}
46 50
47void blk_mq_init_cpu_notifier(struct blk_mq_cpu_notifier *notifier, 51void blk_mq_init_cpu_notifier(struct blk_mq_cpu_notifier *notifier,
48 void (*fn)(void *, unsigned long, unsigned int), 52 int (*fn)(void *, unsigned long, unsigned int),
49 void *data) 53 void *data)
50{ 54{
51 notifier->notify = fn; 55 notifier->notify = fn;
diff --git a/block/blk-mq.c b/block/blk-mq.c
index ef7ed5e95d6d..5a3683fc5bdb 100644
--- a/block/blk-mq.c
+++ b/block/blk-mq.c
@@ -1196,8 +1196,8 @@ void blk_mq_free_single_hw_queue(struct blk_mq_hw_ctx *hctx,
1196} 1196}
1197EXPORT_SYMBOL(blk_mq_free_single_hw_queue); 1197EXPORT_SYMBOL(blk_mq_free_single_hw_queue);
1198 1198
1199static void blk_mq_hctx_notify(void *data, unsigned long action, 1199static int blk_mq_hctx_notify(void *data, unsigned long action,
1200 unsigned int cpu) 1200 unsigned int cpu)
1201{ 1201{
1202 struct blk_mq_hw_ctx *hctx = data; 1202 struct blk_mq_hw_ctx *hctx = data;
1203 struct request_queue *q = hctx->queue; 1203 struct request_queue *q = hctx->queue;
@@ -1205,7 +1205,7 @@ static void blk_mq_hctx_notify(void *data, unsigned long action,
1205 LIST_HEAD(tmp); 1205 LIST_HEAD(tmp);
1206 1206
1207 if (action != CPU_DEAD && action != CPU_DEAD_FROZEN) 1207 if (action != CPU_DEAD && action != CPU_DEAD_FROZEN)
1208 return; 1208 return NOTIFY_OK;
1209 1209
1210 /* 1210 /*
1211 * Move ctx entries to new CPU, if this one is going away. 1211 * Move ctx entries to new CPU, if this one is going away.
@@ -1220,7 +1220,7 @@ static void blk_mq_hctx_notify(void *data, unsigned long action,
1220 spin_unlock(&ctx->lock); 1220 spin_unlock(&ctx->lock);
1221 1221
1222 if (list_empty(&tmp)) 1222 if (list_empty(&tmp))
1223 return; 1223 return NOTIFY_OK;
1224 1224
1225 ctx = blk_mq_get_ctx(q); 1225 ctx = blk_mq_get_ctx(q);
1226 spin_lock(&ctx->lock); 1226 spin_lock(&ctx->lock);
@@ -1240,6 +1240,7 @@ static void blk_mq_hctx_notify(void *data, unsigned long action,
1240 1240
1241 blk_mq_run_hw_queue(hctx, true); 1241 blk_mq_run_hw_queue(hctx, true);
1242 blk_mq_put_ctx(ctx); 1242 blk_mq_put_ctx(ctx);
1243 return NOTIFY_OK;
1243} 1244}
1244 1245
1245static void blk_mq_free_rq_map(struct blk_mq_tag_set *set, 1246static void blk_mq_free_rq_map(struct blk_mq_tag_set *set,
diff --git a/block/blk-mq.h b/block/blk-mq.h
index 7db4fe4bd002..491dbd4e93f5 100644
--- a/block/blk-mq.h
+++ b/block/blk-mq.h
@@ -39,7 +39,7 @@ int blk_mq_update_nr_requests(struct request_queue *q, unsigned int nr);
39 */ 39 */
40struct blk_mq_cpu_notifier; 40struct blk_mq_cpu_notifier;
41void blk_mq_init_cpu_notifier(struct blk_mq_cpu_notifier *notifier, 41void blk_mq_init_cpu_notifier(struct blk_mq_cpu_notifier *notifier,
42 void (*fn)(void *, unsigned long, unsigned int), 42 int (*fn)(void *, unsigned long, unsigned int),
43 void *data); 43 void *data);
44void blk_mq_register_cpu_notifier(struct blk_mq_cpu_notifier *notifier); 44void blk_mq_register_cpu_notifier(struct blk_mq_cpu_notifier *notifier);
45void blk_mq_unregister_cpu_notifier(struct blk_mq_cpu_notifier *notifier); 45void blk_mq_unregister_cpu_notifier(struct blk_mq_cpu_notifier *notifier);