diff mbox

[v2,6/8] blk-mq: Rework blk_mq_realloc_hw_ctxs()

Message ID 7459c980dd965b5f7b91e3bf1c3114d658535229.1475241231.git.agordeev@redhat.com (mailing list archive)
State New, archived
Headers show

Commit Message

Alexander Gordeev Sept. 30, 2016, 1:23 p.m. UTC
Rework blk_mq_realloc_hw_ctxs() so deallocation is done in order
reverse to allocation and indentation is bit more easy to read.

CC: linux-block@vger.kernel.org
Signed-off-by: Alexander Gordeev <agordeev@redhat.com>
---
 block/blk-mq.c | 40 ++++++++++++++++++++++------------------
 1 file changed, 22 insertions(+), 18 deletions(-)

Comments

Sagi Grimberg Oct. 5, 2016, 9:47 p.m. UTC | #1
> @@ -1908,33 +1909,36 @@ static void blk_mq_realloc_hw_ctxs(struct blk_mq_tag_set *set,
>  		if (node == NUMA_NO_NODE)
>  			node = set->numa_node;
>
> -		hctxs[i] = kzalloc_node(sizeof(struct blk_mq_hw_ctx),
> -					GFP_KERNEL, node);
> -		if (!hctxs[i])
> +		hctx = kzalloc_node(sizeof(*hctx), GFP_KERNEL, node);
> +		if (!hctx)
>  			break;
>
> -		if (blk_mq_init_hctx(q, set, hctxs[i], i, node)) {
> -			kfree(hctxs[i]);
> -			hctxs[i] = NULL;
> +		if (blk_mq_init_hctx(q, set, hctx, i, node)) {
> +			kfree(hctx);
>  			break;
>  		}
> -		blk_mq_hctx_kobj_init(hctxs[i]);
> +
> +		blk_mq_hctx_kobj_init(hctx);
> +		hctxs[i] = hctx;
>  	}
>  	for (j = i; j < q->nr_hw_queues; j++) {
> -		struct blk_mq_hw_ctx *hctx = hctxs[j];
> +		hctx = hctxs[i];

Didn't you mean hctx[j]?
--
To unsubscribe from this list: send the line "unsubscribe linux-block" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Alexander Gordeev Oct. 6, 2016, 8:25 a.m. UTC | #2
On Thu, Oct 06, 2016 at 12:47:26AM +0300, Sagi Grimberg wrote:
> 
> >@@ -1908,33 +1909,36 @@ static void blk_mq_realloc_hw_ctxs(struct blk_mq_tag_set *set,
> > 		if (node == NUMA_NO_NODE)
> > 			node = set->numa_node;
> >
> >-		hctxs[i] = kzalloc_node(sizeof(struct blk_mq_hw_ctx),
> >-					GFP_KERNEL, node);
> >-		if (!hctxs[i])
> >+		hctx = kzalloc_node(sizeof(*hctx), GFP_KERNEL, node);
> >+		if (!hctx)
> > 			break;
> >
> >-		if (blk_mq_init_hctx(q, set, hctxs[i], i, node)) {
> >-			kfree(hctxs[i]);
> >-			hctxs[i] = NULL;
> >+		if (blk_mq_init_hctx(q, set, hctx, i, node)) {
> >+			kfree(hctx);
> > 			break;
> > 		}
> >-		blk_mq_hctx_kobj_init(hctxs[i]);
> >+
> >+		blk_mq_hctx_kobj_init(hctx);
> >+		hctxs[i] = hctx;
> > 	}
> > 	for (j = i; j < q->nr_hw_queues; j++) {
> >-		struct blk_mq_hw_ctx *hctx = hctxs[j];
> >+		hctx = hctxs[i];
> 
> Didn't you mean hctx[j]?

Surely, I did.
Thanks!
--
To unsubscribe from this list: send the line "unsubscribe linux-block" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Sagi Grimberg Oct. 6, 2016, 10:11 a.m. UTC | #3
On 06/10/16 11:25, Alexander Gordeev wrote:
> On Thu, Oct 06, 2016 at 12:47:26AM +0300, Sagi Grimberg wrote:
>>
>>> @@ -1908,33 +1909,36 @@ static void blk_mq_realloc_hw_ctxs(struct blk_mq_tag_set *set,
>>> 		if (node == NUMA_NO_NODE)
>>> 			node = set->numa_node;
>>>
>>> -		hctxs[i] = kzalloc_node(sizeof(struct blk_mq_hw_ctx),
>>> -					GFP_KERNEL, node);
>>> -		if (!hctxs[i])
>>> +		hctx = kzalloc_node(sizeof(*hctx), GFP_KERNEL, node);
>>> +		if (!hctx)
>>> 			break;
>>>
>>> -		if (blk_mq_init_hctx(q, set, hctxs[i], i, node)) {
>>> -			kfree(hctxs[i]);
>>> -			hctxs[i] = NULL;
>>> +		if (blk_mq_init_hctx(q, set, hctx, i, node)) {
>>> +			kfree(hctx);
>>> 			break;
>>> 		}
>>> -		blk_mq_hctx_kobj_init(hctxs[i]);
>>> +
>>> +		blk_mq_hctx_kobj_init(hctx);
>>> +		hctxs[i] = hctx;
>>> 	}
>>> 	for (j = i; j < q->nr_hw_queues; j++) {
>>> -		struct blk_mq_hw_ctx *hctx = hctxs[j];
>>> +		hctx = hctxs[i];
>>
>> Didn't you mean hctx[j]?
>
> Surely, I did.
> Thanks!

Maybe it would be cleaner to do:

	while (--i >= 0) {
		hctx = hctxs[i];
		...
	}
--
To unsubscribe from this list: send the line "unsubscribe linux-block" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/block/blk-mq.c b/block/blk-mq.c
index 15c03c2..4b07901 100644
--- a/block/blk-mq.c
+++ b/block/blk-mq.c
@@ -1895,6 +1895,7 @@  static void blk_mq_realloc_hw_ctxs(struct blk_mq_tag_set *set,
 						struct request_queue *q)
 {
 	int i, j;
+	struct blk_mq_hw_ctx *hctx;
 	struct blk_mq_hw_ctx **hctxs = q->queue_hw_ctx;
 
 	blk_mq_sysfs_unregister(q);
@@ -1908,33 +1909,36 @@  static void blk_mq_realloc_hw_ctxs(struct blk_mq_tag_set *set,
 		if (node == NUMA_NO_NODE)
 			node = set->numa_node;
 
-		hctxs[i] = kzalloc_node(sizeof(struct blk_mq_hw_ctx),
-					GFP_KERNEL, node);
-		if (!hctxs[i])
+		hctx = kzalloc_node(sizeof(*hctx), GFP_KERNEL, node);
+		if (!hctx)
 			break;
 
-		if (blk_mq_init_hctx(q, set, hctxs[i], i, node)) {
-			kfree(hctxs[i]);
-			hctxs[i] = NULL;
+		if (blk_mq_init_hctx(q, set, hctx, i, node)) {
+			kfree(hctx);
 			break;
 		}
-		blk_mq_hctx_kobj_init(hctxs[i]);
+
+		blk_mq_hctx_kobj_init(hctx);
+		hctxs[i] = hctx;
 	}
 	for (j = i; j < q->nr_hw_queues; j++) {
-		struct blk_mq_hw_ctx *hctx = hctxs[j];
+		hctx = hctxs[i];
 
-		if (hctx) {
-			if (hctx->tags) {
-				blk_mq_free_rq_map(set, hctx->tags, j);
-				set->tags[j] = NULL;
-			}
-			blk_mq_exit_hctx(q, set, hctx, j);
-			kobject_put(&hctx->kobj);
-			kfree(hctx->ctxs);
-			kfree(hctx);
-			hctxs[j] = NULL;
+		if (!hctx)
+			continue;
 
+		hctxs[i] = NULL;
+		kobject_put(&hctx->kobj);
+
+		if (hctx->tags) {
+			blk_mq_free_rq_map(set, hctx->tags, j);
+			set->tags[j] = NULL;
 		}
+
+		blk_mq_exit_hctx(q, set, hctx, j);
+
+		kfree(hctx->ctxs);
+		kfree(hctx);
 	}
 	q->nr_hw_queues = i;
 	blk_mq_sysfs_register(q);