2014-04-17 15:49:57

by Ming Lei

[permalink] [raw]
Subject: [PATCH next 0/4] blk-mq: misc changes

Hi,

Three are fixes, and another one is cleanup.

Thanks,
--
Ming Lei


2014-04-17 15:50:11

by Ming Lei

[permalink] [raw]
Subject: [PATCH next 1/4] blk-mq: free hctx->ctx_map when init failed

Avoid memory leak in the failure path.

Signed-off-by: Ming Lei <[email protected]>
---
block/blk-mq.c | 1 +
1 file changed, 1 insertion(+)

diff --git a/block/blk-mq.c b/block/blk-mq.c
index ee225cc..5fbbb22 100644
--- a/block/blk-mq.c
+++ b/block/blk-mq.c
@@ -1289,6 +1289,7 @@ static int blk_mq_init_hw_queues(struct request_queue *q,

blk_mq_unregister_cpu_notifier(&hctx->cpu_notifier);
kfree(hctx->ctxs);
+ kfree(hctx->ctx_map);
}

return 1;
--
1.7.9.5

2014-04-17 15:50:27

by Ming Lei

[permalink] [raw]
Subject: [PATCH next 3/4] blk-mq: user (1 << order) to implement order_to_size()

Signed-off-by: Ming Lei <[email protected]>
---
block/blk-mq.c | 7 +------
1 file changed, 1 insertion(+), 6 deletions(-)

diff --git a/block/blk-mq.c b/block/blk-mq.c
index baff2d0..1eff3d9 100644
--- a/block/blk-mq.c
+++ b/block/blk-mq.c
@@ -1130,12 +1130,7 @@ static void blk_mq_free_rq_map(struct blk_mq_tag_set *set,

static size_t order_to_size(unsigned int order)
{
- size_t ret = PAGE_SIZE;
-
- while (order--)
- ret *= 2;
-
- return ret;
+ return (1 << order) * PAGE_SIZE;
}

static struct blk_mq_tags *blk_mq_init_rq_map(struct blk_mq_tag_set *set,
--
1.7.9.5

2014-04-17 15:50:36

by Ming Lei

[permalink] [raw]
Subject: [PATCH next 4/4] blk-mq: initialize req->q in allocation

The patch basically reverts the patch of(blk-mq:
initialize request on allocation) in Jens's tree(already
in -next), and only initialize req->q in allocation
for two reasons:

- presumed cache hotness on completion
- blk_rq_tagged(rq) depends on reset of req->mq_ctx

Signed-off-by: Ming Lei <[email protected]>
---
block/blk-mq.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/block/blk-mq.c b/block/blk-mq.c
index 1eff3d9..b7a51ed 100644
--- a/block/blk-mq.c
+++ b/block/blk-mq.c
@@ -82,7 +82,6 @@ static struct request *__blk_mq_alloc_request(struct blk_mq_hw_ctx *hctx,
tag = blk_mq_get_tag(hctx->tags, gfp, reserved);
if (tag != BLK_MQ_TAG_FAIL) {
rq = hctx->tags->rqs[tag];
- blk_rq_init(hctx->queue, rq);
rq->tag = tag;

return rq;
@@ -187,6 +186,7 @@ static void blk_mq_rq_ctx_init(struct request_queue *q, struct blk_mq_ctx *ctx,
if (blk_queue_io_stat(q))
rw_flags |= REQ_IO_STAT;

+ rq->q = q;
rq->mq_ctx = ctx;
rq->cmd_flags = rw_flags;
rq->start_time = jiffies;
@@ -258,6 +258,7 @@ static void __blk_mq_free_request(struct blk_mq_hw_ctx *hctx,
const int tag = rq->tag;
struct request_queue *q = rq->q;

+ blk_rq_init(hctx->queue, rq);
blk_mq_put_tag(hctx->tags, tag);
blk_mq_queue_exit(q);
}
@@ -1194,6 +1195,7 @@ static struct blk_mq_tags *blk_mq_init_rq_map(struct blk_mq_tag_set *set,
left -= to_do * rq_size;
for (j = 0; j < to_do; j++) {
tags->rqs[i] = p;
+ blk_rq_init(NULL, tags->rqs[i]);
if (set->ops->init_request) {
if (set->ops->init_request(set->driver_data,
tags->rqs[i], hctx_idx, i,
--
1.7.9.5

2014-04-17 15:53:13

by Ming Lei

[permalink] [raw]
Subject: [PATCH next 2/4] blk-mq: fix allocation of set->tags

type of set->tags is struct blk_mq_tags **.

Signed-off-by: Ming Lei <[email protected]>
---
block/blk-mq.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/block/blk-mq.c b/block/blk-mq.c
index 5fbbb22..baff2d0 100644
--- a/block/blk-mq.c
+++ b/block/blk-mq.c
@@ -1537,7 +1537,7 @@ int blk_mq_alloc_tag_set(struct blk_mq_tag_set *set)
return -EINVAL;


- set->tags = kmalloc_node(set->nr_hw_queues * sizeof(struct blk_mq_tags),
+ set->tags = kmalloc_node(set->nr_hw_queues * sizeof(struct blk_mq_tags *),
GFP_KERNEL, set->numa_node);
if (!set->tags)
goto out;
--
1.7.9.5

2014-04-17 19:03:44

by Jörg-Volker Peetz

[permalink] [raw]
Subject: Re: [PATCH next 3/4] blk-mq: user (1 << order) to implement order_to_size()

Ming Lei wrote, on 04/17/2014 17:49:
> Signed-off-by: Ming Lei <[email protected]>
> ---
> block/blk-mq.c | 7 +------
> 1 file changed, 1 insertion(+), 6 deletions(-)
>
> diff --git a/block/blk-mq.c b/block/blk-mq.c
> index baff2d0..1eff3d9 100644
> --- a/block/blk-mq.c
> +++ b/block/blk-mq.c
> @@ -1130,12 +1130,7 @@ static void blk_mq_free_rq_map(struct blk_mq_tag_set *set,
>
> static size_t order_to_size(unsigned int order)
> {
> - size_t ret = PAGE_SIZE;
> -
> - while (order--)
> - ret *= 2;
> -
> - return ret;
> + return (1 << order) * PAGE_SIZE;

Shouldn't this be

return ((size_t)1 << order) * PAGE_SIZE;

?
> }
>
> static struct blk_mq_tags *blk_mq_init_rq_map(struct blk_mq_tag_set *set,
>

Regards,
jvp.

2014-04-17 19:13:14

by Max Filippov

[permalink] [raw]
Subject: Re: [PATCH next 3/4] blk-mq: user (1 << order) to implement order_to_size()

On Thu, Apr 17, 2014 at 11:03 PM, Jörg-Volker Peetz <[email protected]> wrote:
> Ming Lei wrote, on 04/17/2014 17:49:
>> Signed-off-by: Ming Lei <[email protected]>
>> ---
>> block/blk-mq.c | 7 +------
>> 1 file changed, 1 insertion(+), 6 deletions(-)
>>
>> diff --git a/block/blk-mq.c b/block/blk-mq.c
>> index baff2d0..1eff3d9 100644
>> --- a/block/blk-mq.c
>> +++ b/block/blk-mq.c
>> @@ -1130,12 +1130,7 @@ static void blk_mq_free_rq_map(struct blk_mq_tag_set *set,
>>
>> static size_t order_to_size(unsigned int order)
>> {
>> - size_t ret = PAGE_SIZE;
>> -
>> - while (order--)
>> - ret *= 2;
>> -
>> - return ret;
>> + return (1 << order) * PAGE_SIZE;
>
> Shouldn't this be
>
> return ((size_t)1 << order) * PAGE_SIZE;
>
> ?

Maybe even

return (size_t)PAGE_SIZE << order;

?

--
Thanks.
-- Max

2014-04-18 14:21:27

by Christoph Hellwig

[permalink] [raw]
Subject: Re: [PATCH next 1/4] blk-mq: free hctx->ctx_map when init failed

On Thu, Apr 17, 2014 at 11:49:35PM +0800, Ming Lei wrote:
> Avoid memory leak in the failure path.

Looks good,

Reviewed-by: Christoph Hellwig <[email protected]>

2014-04-18 14:22:03

by Christoph Hellwig

[permalink] [raw]
Subject: Re: [PATCH next 2/4] blk-mq: fix allocation of set->tags

On Thu, Apr 17, 2014 at 11:49:36PM +0800, Ming Lei wrote:
> type of set->tags is struct blk_mq_tags **.
>
> Signed-off-by: Ming Lei <[email protected]>

Looks good, but you're now overflowing 80 character per line and need a line
break.

Reviewed-by: Christoph Hellwig <[email protected]>

2014-04-18 15:47:54

by Ming Lei

[permalink] [raw]
Subject: Re: [PATCH next 3/4] blk-mq: user (1 << order) to implement order_to_size()

On Fri, Apr 18, 2014 at 3:03 AM, Jörg-Volker Peetz <[email protected]> wrote:
> Ming Lei wrote, on 04/17/2014 17:49:
>> Signed-off-by: Ming Lei <[email protected]>
>> ---
>> block/blk-mq.c | 7 +------
>> 1 file changed, 1 insertion(+), 6 deletions(-)
>>
>> diff --git a/block/blk-mq.c b/block/blk-mq.c
>> index baff2d0..1eff3d9 100644
>> --- a/block/blk-mq.c
>> +++ b/block/blk-mq.c
>> @@ -1130,12 +1130,7 @@ static void blk_mq_free_rq_map(struct blk_mq_tag_set *set,
>>
>> static size_t order_to_size(unsigned int order)
>> {
>> - size_t ret = PAGE_SIZE;
>> -
>> - while (order--)
>> - ret *= 2;
>> -
>> - return ret;
>> + return (1 << order) * PAGE_SIZE;
>
> Shouldn't this be
>
> return ((size_t)1 << order) * PAGE_SIZE;
>
> ?

IMO, it isn't necessary since compiler will cast type
of 1 and the expression to size_t automatically.


Thanks,
--
Ming Lei

2014-04-18 19:23:59

by Jörg-Volker Peetz

[permalink] [raw]
Subject: Re: [PATCH next 3/4] blk-mq: user (1 << order) to implement order_to_size()

Ming Lei wrote, on 04/18/2014 17:47:
> On Fri, Apr 18, 2014 at 3:03 AM, Jörg-Volker Peetz <[email protected]> wrote:
>> Ming Lei wrote, on 04/17/2014 17:49:
>>> Signed-off-by: Ming Lei <[email protected]>
>>> ---
>>> block/blk-mq.c | 7 +------
>>> 1 file changed, 1 insertion(+), 6 deletions(-)
>>>
>>> diff --git a/block/blk-mq.c b/block/blk-mq.c
>>> index baff2d0..1eff3d9 100644
>>> --- a/block/blk-mq.c
>>> +++ b/block/blk-mq.c
>>> @@ -1130,12 +1130,7 @@ static void blk_mq_free_rq_map(struct blk_mq_tag_set *set,
>>>
>>> static size_t order_to_size(unsigned int order)
>>> {
>>> - size_t ret = PAGE_SIZE;
>>> -
>>> - while (order--)
>>> - ret *= 2;
>>> -
>>> - return ret;
>>> + return (1 << order) * PAGE_SIZE;
>>
>> Shouldn't this be
>>
>> return ((size_t)1 << order) * PAGE_SIZE;
>>
>> ?
>
> IMO, it isn't necessary since compiler will cast type
> of 1 and the expression to size_t automatically.
>
>
> Thanks,

Testing this with gcc 4.8.2 with order > 30 confirms that the automatic casting
is done operator-wise and the explicit casting is necessary.

Regards,
jvp.

2014-04-19 03:17:25

by Ming Lei

[permalink] [raw]
Subject: Re: [PATCH next 3/4] blk-mq: user (1 << order) to implement order_to_size()

On Sat, Apr 19, 2014 at 3:23 AM, Jörg-Volker Peetz <[email protected]> wrote:
>
> Testing this with gcc 4.8.2 with order > 30 confirms that the automatic casting
> is done operator-wise and the explicit casting is necessary.

My gcc 4.8.2 doesn't complain the change, see below:

ming@ming:~/ming/linux$ gcc --version
gcc (Ubuntu/Linaro 4.8.2-19ubuntu1) 4.8.2

ming@ming:~/ming/linux$
ming@ming:~/ming/linux$ vim block/blk-mq.c
ming@ming:~/ming/linux$ ./build
CHK include/config/kernel.release
CHK include/generated/uapi/linux/version.h
CHK include/generated/utsrelease.h
CALL scripts/checksyscalls.sh
CHK include/generated/compile.h
CC block/blk-mq.o
CHK kernel/config_data.h
LD block/built-in.o
LINK vmlinux
LD vmlinux.o
MODPOST vmlinux.o



Thanks,
--
Ming Lei

2014-04-19 05:05:10

by Jens Axboe

[permalink] [raw]
Subject: Re: [PATCH next 3/4] blk-mq: user (1 << order) to implement order_to_size()

On Apr 18, 2014, at 8:17 PM, Ming Lei <[email protected]> wrote:
>
>> On Sat, Apr 19, 2014 at 3:23 AM, Jörg-Volker Peetz <[email protected]> wrote:
>>
>> Testing this with gcc 4.8.2 with order > 30 confirms that the automatic casting
>> is done operator-wise and the explicit casting is necessary.
>
> My gcc 4.8.2 doesn't complain the change, see below:

It won't complain, but that doesn't mean that it won't get it wrong. The cast is necessary.