* [PATCH v1 0/3] blk-mq: misc changes
@ 2014-05-27 15:35 Ming Lei
2014-05-27 15:35 ` [PATCH v1 1/3] blk-mq: fix leak of hctx->ctx_map Ming Lei
` (3 more replies)
0 siblings, 4 replies; 5+ messages in thread
From: Ming Lei @ 2014-05-27 15:35 UTC (permalink / raw)
To: Jens Axboe, linux-kernel
Hi,
Misc changes, and the v1 is against the latest for-next
branch of block tree.
Thanks,
--
Ming Lei
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v1 1/3] blk-mq: fix leak of hctx->ctx_map
2014-05-27 15:35 [PATCH v1 0/3] blk-mq: misc changes Ming Lei
@ 2014-05-27 15:35 ` Ming Lei
2014-05-27 15:35 ` [PATCH v1 2/3] blk-mq: avoid code duplication Ming Lei
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: Ming Lei @ 2014-05-27 15:35 UTC (permalink / raw)
To: Jens Axboe, linux-kernel; +Cc: Ming Lei
hctx->ctx_map should have been freed inside blk_mq_free_queue().
Signed-off-by: Ming Lei <tom.leiming@gmail.com>
---
block/blk-mq.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/block/blk-mq.c b/block/blk-mq.c
index 62082c5..dad22a9 100644
--- a/block/blk-mq.c
+++ b/block/blk-mq.c
@@ -1846,6 +1846,7 @@ void blk_mq_free_queue(struct request_queue *q)
queue_for_each_hw_ctx(q, hctx, i) {
blk_mq_tag_idle(hctx);
kfree(hctx->ctxs);
+ blk_mq_free_bitmap(&hctx->ctx_map);
blk_mq_unregister_cpu_notifier(&hctx->cpu_notifier);
if (q->mq_ops->exit_hctx)
q->mq_ops->exit_hctx(hctx, i);
--
1.7.9.5
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH v1 2/3] blk-mq: avoid code duplication
2014-05-27 15:35 [PATCH v1 0/3] blk-mq: misc changes Ming Lei
2014-05-27 15:35 ` [PATCH v1 1/3] blk-mq: fix leak of hctx->ctx_map Ming Lei
@ 2014-05-27 15:35 ` Ming Lei
2014-05-27 15:35 ` [PATCH v1 3/3] block: only allocate/free mq_usage_counter in blk-mq Ming Lei
2014-05-27 15:41 ` [PATCH v1 0/3] blk-mq: misc changes Jens Axboe
3 siblings, 0 replies; 5+ messages in thread
From: Ming Lei @ 2014-05-27 15:35 UTC (permalink / raw)
To: Jens Axboe, linux-kernel; +Cc: Ming Lei
blk_mq_exit_hw_queues() and blk_mq_free_hw_queues()
are introduced to avoid code duplication.
Signed-off-by: Ming Lei <tom.leiming@gmail.com>
---
block/blk-mq.c | 61 ++++++++++++++++++++++++++++++++++----------------------
1 file changed, 37 insertions(+), 24 deletions(-)
diff --git a/block/blk-mq.c b/block/blk-mq.c
index dad22a9..0785175 100644
--- a/block/blk-mq.c
+++ b/block/blk-mq.c
@@ -1523,11 +1523,43 @@ static int blk_mq_hctx_notify(void *data, unsigned long action,
return NOTIFY_OK;
}
+static void blk_mq_exit_hw_queues(struct request_queue *q,
+ struct blk_mq_tag_set *set, int nr_queue)
+{
+ struct blk_mq_hw_ctx *hctx;
+ unsigned int i;
+
+ queue_for_each_hw_ctx(q, hctx, i) {
+ if (i == nr_queue)
+ break;
+
+ if (set->ops->exit_hctx)
+ set->ops->exit_hctx(hctx, i);
+
+ blk_mq_unregister_cpu_notifier(&hctx->cpu_notifier);
+ kfree(hctx->ctxs);
+ blk_mq_free_bitmap(&hctx->ctx_map);
+ }
+
+}
+
+static void blk_mq_free_hw_queues(struct request_queue *q,
+ struct blk_mq_tag_set *set)
+{
+ struct blk_mq_hw_ctx *hctx;
+ unsigned int i;
+
+ queue_for_each_hw_ctx(q, hctx, i) {
+ free_cpumask_var(hctx->cpumask);
+ set->ops->free_hctx(hctx, i);
+ }
+}
+
static int blk_mq_init_hw_queues(struct request_queue *q,
struct blk_mq_tag_set *set)
{
struct blk_mq_hw_ctx *hctx;
- unsigned int i, j;
+ unsigned int i;
/*
* Initialize hardware queues
@@ -1579,17 +1611,7 @@ static int blk_mq_init_hw_queues(struct request_queue *q,
/*
* Init failed
*/
- queue_for_each_hw_ctx(q, hctx, j) {
- if (i == j)
- break;
-
- if (set->ops->exit_hctx)
- set->ops->exit_hctx(hctx, j);
-
- blk_mq_unregister_cpu_notifier(&hctx->cpu_notifier);
- kfree(hctx->ctxs);
- blk_mq_free_bitmap(&hctx->ctx_map);
- }
+ blk_mq_exit_hw_queues(q, set, i);
return 1;
}
@@ -1838,21 +1860,12 @@ EXPORT_SYMBOL(blk_mq_init_queue);
void blk_mq_free_queue(struct request_queue *q)
{
- struct blk_mq_hw_ctx *hctx;
- int i;
+ struct blk_mq_tag_set *set = q->tag_set;
blk_mq_del_queue_tag_set(q);
- queue_for_each_hw_ctx(q, hctx, i) {
- blk_mq_tag_idle(hctx);
- kfree(hctx->ctxs);
- blk_mq_free_bitmap(&hctx->ctx_map);
- blk_mq_unregister_cpu_notifier(&hctx->cpu_notifier);
- if (q->mq_ops->exit_hctx)
- q->mq_ops->exit_hctx(hctx, i);
- free_cpumask_var(hctx->cpumask);
- q->mq_ops->free_hctx(hctx, i);
- }
+ blk_mq_exit_hw_queues(q, set, set->nr_hw_queues);
+ blk_mq_free_hw_queues(q, set);
free_percpu(q->queue_ctx);
kfree(q->queue_hw_ctx);
--
1.7.9.5
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH v1 3/3] block: only allocate/free mq_usage_counter in blk-mq
2014-05-27 15:35 [PATCH v1 0/3] blk-mq: misc changes Ming Lei
2014-05-27 15:35 ` [PATCH v1 1/3] blk-mq: fix leak of hctx->ctx_map Ming Lei
2014-05-27 15:35 ` [PATCH v1 2/3] blk-mq: avoid code duplication Ming Lei
@ 2014-05-27 15:35 ` Ming Lei
2014-05-27 15:41 ` [PATCH v1 0/3] blk-mq: misc changes Jens Axboe
3 siblings, 0 replies; 5+ messages in thread
From: Ming Lei @ 2014-05-27 15:35 UTC (permalink / raw)
To: Jens Axboe, linux-kernel; +Cc: Ming Lei
The percpu counter is only used for blk-mq, so move
its allocation and free inside blk-mq, and don't
allocate it for legacy queue device.
Signed-off-by: Ming Lei <tom.leiming@gmail.com>
---
block/blk-core.c | 7 +------
block/blk-mq.c | 5 +++++
block/blk-sysfs.c | 2 --
3 files changed, 6 insertions(+), 8 deletions(-)
diff --git a/block/blk-core.c b/block/blk-core.c
index 5b6f768..29d5fba 100644
--- a/block/blk-core.c
+++ b/block/blk-core.c
@@ -576,12 +576,9 @@ struct request_queue *blk_alloc_queue_node(gfp_t gfp_mask, int node_id)
if (!q)
return NULL;
- if (percpu_counter_init(&q->mq_usage_counter, 0))
- goto fail_q;
-
q->id = ida_simple_get(&blk_queue_ida, 0, 0, gfp_mask);
if (q->id < 0)
- goto fail_c;
+ goto fail_q;
q->backing_dev_info.ra_pages =
(VM_MAX_READAHEAD * 1024) / PAGE_CACHE_SIZE;
@@ -639,8 +636,6 @@ fail_bdi:
bdi_destroy(&q->backing_dev_info);
fail_id:
ida_simple_remove(&blk_queue_ida, q->id);
-fail_c:
- percpu_counter_destroy(&q->mq_usage_counter);
fail_q:
kmem_cache_free(blk_requestq_cachep, q);
return NULL;
diff --git a/block/blk-mq.c b/block/blk-mq.c
index 0785175..e8b5f74 100644
--- a/block/blk-mq.c
+++ b/block/blk-mq.c
@@ -1781,6 +1781,9 @@ struct request_queue *blk_mq_init_queue(struct blk_mq_tag_set *set)
if (!q)
goto err_hctxs;
+ if (percpu_counter_init(&q->mq_usage_counter, 0))
+ goto err_map;
+
q->mq_map = blk_mq_make_queue_map(set);
if (!q->mq_map)
goto err_map;
@@ -1867,6 +1870,8 @@ void blk_mq_free_queue(struct request_queue *q)
blk_mq_exit_hw_queues(q, set, set->nr_hw_queues);
blk_mq_free_hw_queues(q, set);
+ percpu_counter_destroy(&q->mq_usage_counter);
+
free_percpu(q->queue_ctx);
kfree(q->queue_hw_ctx);
kfree(q->mq_map);
diff --git a/block/blk-sysfs.c b/block/blk-sysfs.c
index 4d6811a..23321fb 100644
--- a/block/blk-sysfs.c
+++ b/block/blk-sysfs.c
@@ -517,8 +517,6 @@ static void blk_release_queue(struct kobject *kobj)
if (q->queue_tags)
__blk_queue_free_tags(q);
- percpu_counter_destroy(&q->mq_usage_counter);
-
if (q->mq_ops)
blk_mq_free_queue(q);
--
1.7.9.5
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH v1 0/3] blk-mq: misc changes
2014-05-27 15:35 [PATCH v1 0/3] blk-mq: misc changes Ming Lei
` (2 preceding siblings ...)
2014-05-27 15:35 ` [PATCH v1 3/3] block: only allocate/free mq_usage_counter in blk-mq Ming Lei
@ 2014-05-27 15:41 ` Jens Axboe
3 siblings, 0 replies; 5+ messages in thread
From: Jens Axboe @ 2014-05-27 15:41 UTC (permalink / raw)
To: Ming Lei, linux-kernel
On 2014-05-27 09:35, Ming Lei wrote:
> Hi,
>
> Misc changes, and the v1 is against the latest for-next
> branch of block tree.
Applied 2+3 (1 I already hand applied). Thanks Ming! I really appreciate
you finding and fixing these issues.
--
Jens Axboe
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2014-05-27 15:41 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-05-27 15:35 [PATCH v1 0/3] blk-mq: misc changes Ming Lei
2014-05-27 15:35 ` [PATCH v1 1/3] blk-mq: fix leak of hctx->ctx_map Ming Lei
2014-05-27 15:35 ` [PATCH v1 2/3] blk-mq: avoid code duplication Ming Lei
2014-05-27 15:35 ` [PATCH v1 3/3] block: only allocate/free mq_usage_counter in blk-mq Ming Lei
2014-05-27 15:41 ` [PATCH v1 0/3] blk-mq: misc changes Jens Axboe
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.