2014-01-09 18:54:27

by Muthu Kumar

[permalink] [raw]
Subject: [block:for-3.14/core] blk-mq: Compile fix for null_blk

Jens,

Compiling null_blk.ko failed with error that blk_mq_free_queue() was
defined implicitly. So, moved the declaration from block/blk-mq.h to
include/linux/blk-mq.h and exported it.

Signed-off-by: Muthukumar Ratty <[email protected]>

----------------------

block/blk-mq.c | 1 +
block/blk-mq.h | 1 -
include/linux/blk-mq.h | 1 +
3 files changed, 2 insertions(+), 1 deletions(-)

diff --git a/block/blk-mq.c b/block/blk-mq.c
index 57039fc..3e08b87 100644
--- a/block/blk-mq.c
+++ b/block/blk-mq.c
@@ -1422,6 +1422,7 @@ void blk_mq_free_queue(struct request_queue *q)
list_del_init(&q->all_q_node);
mutex_unlock(&all_q_mutex);
}
+EXPORT_SYMBOL(blk_mq_free_queue);

/* Basically redo blk_mq_init_queue with queue frozen */
static void blk_mq_queue_reinit(struct request_queue *q)
diff --git a/block/blk-mq.h b/block/blk-mq.h
index 5c39179..35ff4f7 100644
--- a/block/blk-mq.h
+++ b/block/blk-mq.h
@@ -28,7 +28,6 @@ void blk_mq_run_request(struct request *rq, bool
run_queue, bool async);
void blk_mq_run_hw_queue(struct blk_mq_hw_ctx *hctx, bool async);
void blk_mq_init_flush(struct request_queue *q);
void blk_mq_drain_queue(struct request_queue *q);
-void blk_mq_free_queue(struct request_queue *q);

/*
* CPU hotplug helpers
diff --git a/include/linux/blk-mq.h b/include/linux/blk-mq.h
index 851d34b..51109b8 100644
--- a/include/linux/blk-mq.h
+++ b/include/linux/blk-mq.h
@@ -113,6 +113,7 @@ enum {
};

struct request_queue *blk_mq_init_queue(struct blk_mq_reg *, void *);
+void blk_mq_free_queue(struct request_queue *q);
int blk_mq_register_disk(struct gendisk *);
void blk_mq_unregister_disk(struct gendisk *);
void blk_mq_init_commands(struct request_queue *, void (*init)(void
*data, struct blk_mq_hw_ctx *, struct request *, unsigned int), void
*data);

-------------------------------


2014-01-09 20:59:11

by Matias Bjørling

[permalink] [raw]
Subject: Re: [block:for-3.14/core] blk-mq: Compile fix for null_blk

On 01/09/2014 07:54 PM, Muthu Kumar wrote:
> Jens,
>
> Compiling null_blk.ko failed with error that blk_mq_free_queue() was
> defined implicitly. So, moved the declaration from block/blk-mq.h to
> include/linux/blk-mq.h and exported it.
>

The patch from Ming Lei is missing in -rc6

4af48694451676403188a62385dd1a2849fc05c5
block: null_blk: fix queue leak inside removing device

Its queued for -rc7. It removes the usage of blk_mq_free_queue in blk_null.

> Signed-off-by: Muthukumar Ratty <[email protected]>
>
> ----------------------
>
> block/blk-mq.c | 1 +
> block/blk-mq.h | 1 -
> include/linux/blk-mq.h | 1 +
> 3 files changed, 2 insertions(+), 1 deletions(-)
>
> diff --git a/block/blk-mq.c b/block/blk-mq.c
> index 57039fc..3e08b87 100644
> --- a/block/blk-mq.c
> +++ b/block/blk-mq.c
> @@ -1422,6 +1422,7 @@ void blk_mq_free_queue(struct request_queue *q)
> list_del_init(&q->all_q_node);
> mutex_unlock(&all_q_mutex);
> }
> +EXPORT_SYMBOL(blk_mq_free_queue);
>
> /* Basically redo blk_mq_init_queue with queue frozen */
> static void blk_mq_queue_reinit(struct request_queue *q)
> diff --git a/block/blk-mq.h b/block/blk-mq.h
> index 5c39179..35ff4f7 100644
> --- a/block/blk-mq.h
> +++ b/block/blk-mq.h
> @@ -28,7 +28,6 @@ void blk_mq_run_request(struct request *rq, bool
> run_queue, bool async);
> void blk_mq_run_hw_queue(struct blk_mq_hw_ctx *hctx, bool async);
> void blk_mq_init_flush(struct request_queue *q);
> void blk_mq_drain_queue(struct request_queue *q);
> -void blk_mq_free_queue(struct request_queue *q);
>
> /*
> * CPU hotplug helpers
> diff --git a/include/linux/blk-mq.h b/include/linux/blk-mq.h
> index 851d34b..51109b8 100644
> --- a/include/linux/blk-mq.h
> +++ b/include/linux/blk-mq.h
> @@ -113,6 +113,7 @@ enum {
> };
>
> struct request_queue *blk_mq_init_queue(struct blk_mq_reg *, void *);
> +void blk_mq_free_queue(struct request_queue *q);
> int blk_mq_register_disk(struct gendisk *);
> void blk_mq_unregister_disk(struct gendisk *);
> void blk_mq_init_commands(struct request_queue *, void (*init)(void
> *data, struct blk_mq_hw_ctx *, struct request *, unsigned int), void
> *data);
>

2014-01-09 21:34:06

by Muthu Kumar

[permalink] [raw]
Subject: Re: [block:for-3.14/core] blk-mq: Compile fix for null_blk

Thanks Matias. Yes, Ming Lei's 4th patch does make the function internal.

So, which branch has the laest patches... i am checking for-3.14/core...

Regards,
Muthu


On Thu, Jan 9, 2014 at 12:58 PM, Matias Bjorling <[email protected]> wrote:
> On 01/09/2014 07:54 PM, Muthu Kumar wrote:
>>
>> Jens,
>>
>> Compiling null_blk.ko failed with error that blk_mq_free_queue() was
>> defined implicitly. So, moved the declaration from block/blk-mq.h to
>> include/linux/blk-mq.h and exported it.
>>
>
> The patch from Ming Lei is missing in -rc6
>
> 4af48694451676403188a62385dd1a2849fc05c5
> block: null_blk: fix queue leak inside removing device
>
> Its queued for -rc7. It removes the usage of blk_mq_free_queue in blk_null.
>
>
>> Signed-off-by: Muthukumar Ratty <[email protected]>
>>
>> ----------------------
>>
>> block/blk-mq.c | 1 +
>> block/blk-mq.h | 1 -
>> include/linux/blk-mq.h | 1 +
>> 3 files changed, 2 insertions(+), 1 deletions(-)
>>
>> diff --git a/block/blk-mq.c b/block/blk-mq.c
>> index 57039fc..3e08b87 100644
>> --- a/block/blk-mq.c
>> +++ b/block/blk-mq.c
>> @@ -1422,6 +1422,7 @@ void blk_mq_free_queue(struct request_queue *q)
>> list_del_init(&q->all_q_node);
>> mutex_unlock(&all_q_mutex);
>> }
>> +EXPORT_SYMBOL(blk_mq_free_queue);
>>
>> /* Basically redo blk_mq_init_queue with queue frozen */
>> static void blk_mq_queue_reinit(struct request_queue *q)
>> diff --git a/block/blk-mq.h b/block/blk-mq.h
>> index 5c39179..35ff4f7 100644
>> --- a/block/blk-mq.h
>> +++ b/block/blk-mq.h
>> @@ -28,7 +28,6 @@ void blk_mq_run_request(struct request *rq, bool
>> run_queue, bool async);
>> void blk_mq_run_hw_queue(struct blk_mq_hw_ctx *hctx, bool async);
>> void blk_mq_init_flush(struct request_queue *q);
>> void blk_mq_drain_queue(struct request_queue *q);
>> -void blk_mq_free_queue(struct request_queue *q);
>>
>> /*
>> * CPU hotplug helpers
>> diff --git a/include/linux/blk-mq.h b/include/linux/blk-mq.h
>> index 851d34b..51109b8 100644
>> --- a/include/linux/blk-mq.h
>> +++ b/include/linux/blk-mq.h
>> @@ -113,6 +113,7 @@ enum {
>> };
>>
>> struct request_queue *blk_mq_init_queue(struct blk_mq_reg *, void *);
>> +void blk_mq_free_queue(struct request_queue *q);
>> int blk_mq_register_disk(struct gendisk *);
>> void blk_mq_unregister_disk(struct gendisk *);
>> void blk_mq_init_commands(struct request_queue *, void (*init)(void
>> *data, struct blk_mq_hw_ctx *, struct request *, unsigned int), void
>> *data);
>>
>

2014-01-09 21:55:39

by Matias Bjørling

[permalink] [raw]
Subject: Re: [block:for-3.14/core] blk-mq: Compile fix for null_blk

On 01/09/2014 10:33 PM, Muthu Kumar wrote:
> Thanks Matias. Yes, Ming Lei's 4th patch does make the function internal.
>
> So, which branch has the laest patches... i am checking for-3.14/core...
>

Depends on what you want to do. You may use the Jens' for-linus branch
for the latest including blk patches or just cherry pick Ming's patch to
get 3.14/core nullblk to compile. It will fix itself within a week or two.

> Regards,
> Muthu
>
<snip>

2014-01-11 08:24:42

by Linus Torvalds

[permalink] [raw]
Subject: Re: [block:for-3.14/core] blk-mq: Compile fix for null_blk

On Fri, Jan 10, 2014 at 3:58 AM, Matias Bjorling <[email protected]> wrote:
>
> The patch from Ming Lei is missing in -rc6
>
> 4af48694451676403188a62385dd1a2849fc05c5
> block: null_blk: fix queue leak inside removing device
>
> Its queued for -rc7. It removes the usage of blk_mq_free_queue in blk_null.

Jens? I'm going to do an rc8 tomorrow, and I haven't seen any pull requests..

Linus

2014-01-11 14:43:32

by Jens Axboe

[permalink] [raw]
Subject: Re: [block:for-3.14/core] blk-mq: Compile fix for null_blk

On Sat, Jan 11 2014, Linus Torvalds wrote:
> On Fri, Jan 10, 2014 at 3:58 AM, Matias Bjorling <[email protected]> wrote:
> >
> > The patch from Ming Lei is missing in -rc6
> >
> > 4af48694451676403188a62385dd1a2849fc05c5
> > block: null_blk: fix queue leak inside removing device
> >
> > Its queued for -rc7. It removes the usage of blk_mq_free_queue in blk_null.
>
> Jens? I'm going to do an rc8 tomorrow, and I haven't seen any pull requests..

Sorry, between jobs and houses, and the two other patches in there were
being evaluated. If you could just apply this one directly, then that'd
be great!

commit 4af48694451676403188a62385dd1a2849fc05c5
Author: Ming Lei <[email protected]>
Date: Thu Dec 26 21:31:37 2013 +0800

block: null_blk: fix queue leak inside removing device

When queue_mode is NULL_Q_MQ and null_blk is being removed,
blk_cleanup_queue() isn't called to cleanup queue, so the
queue allocated won't be freed.

This patch calls blk_cleanup_queue() for MQ to drain all
pending requests first and release the reference counter
of queue kobject, then blk_mq_free_queue() will be called
in queue kobject's release handler when queue kobject's
reference counter drops to zero.

Cc: Jens Axboe <[email protected]>
Signed-off-by: Ming Lei <[email protected]>
Signed-off-by: Jens Axboe <[email protected]>

diff --git a/drivers/block/null_blk.c b/drivers/block/null_blk.c
index a2e69d26266d..83a598ebb65a 100644
--- a/drivers/block/null_blk.c
+++ b/drivers/block/null_blk.c
@@ -425,10 +425,7 @@ static void null_del_dev(struct nullb *nullb)
list_del_init(&nullb->list);

del_gendisk(nullb->disk);
- if (queue_mode == NULL_Q_MQ)
- blk_mq_free_queue(nullb->q);
- else
- blk_cleanup_queue(nullb->q);
+ blk_cleanup_queue(nullb->q);
put_disk(nullb->disk);
kfree(nullb);
}
@@ -578,10 +575,7 @@ static int null_add_dev(void)
disk = nullb->disk = alloc_disk_node(1, home_node);
if (!disk) {
queue_fail:
- if (queue_mode == NULL_Q_MQ)
- blk_mq_free_queue(nullb->q);
- else
- blk_cleanup_queue(nullb->q);
+ blk_cleanup_queue(nullb->q);
cleanup_queues(nullb);
err:
kfree(nullb);

--
Jens Axboe