Skip to content

Commit

Permalink
blk-mq: make lifetime consistent between hctx and its kobject
Browse files Browse the repository at this point in the history
This patch removes kobject_put() over hctx in __blk_mq_unregister_dev(),
and trys to keep lifetime consistent between hctx and hctx's kobject.

Now blk_mq_sysfs_register() and blk_mq_sysfs_unregister() become
totally symmetrical, and kobject's refcounter drops to zero just
when the hctx is freed.

Signed-off-by: Ming Lei <[email protected]>
Tested-by: Peter Zijlstra (Intel) <[email protected]>
Signed-off-by: Jens Axboe <[email protected]>
  • Loading branch information
ming1 authored and axboe committed Mar 8, 2017
1 parent 7ea5fe3 commit 6c8b232
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 9 deletions.
15 changes: 10 additions & 5 deletions block/blk-mq-sysfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,14 @@ static void blk_mq_sysfs_release(struct kobject *kobj)
{
}

static void blk_mq_hw_sysfs_release(struct kobject *kobj)
{
struct blk_mq_hw_ctx *hctx = container_of(kobj, struct blk_mq_hw_ctx,
kobj);
kfree(hctx->ctxs);
kfree(hctx);
}

struct blk_mq_ctx_sysfs_entry {
struct attribute attr;
ssize_t (*show)(struct blk_mq_ctx *, char *);
Expand Down Expand Up @@ -200,7 +208,7 @@ static struct kobj_type blk_mq_ctx_ktype = {
static struct kobj_type blk_mq_hw_ktype = {
.sysfs_ops = &blk_mq_hw_sysfs_ops,
.default_attrs = default_hw_ctx_attrs,
.release = blk_mq_sysfs_release,
.release = blk_mq_hw_sysfs_release,
};

static void blk_mq_unregister_hctx(struct blk_mq_hw_ctx *hctx)
Expand Down Expand Up @@ -244,12 +252,9 @@ static void __blk_mq_unregister_dev(struct device *dev, struct request_queue *q)
struct blk_mq_hw_ctx *hctx;
int i;

queue_for_each_hw_ctx(q, hctx, i) {
queue_for_each_hw_ctx(q, hctx, i)
blk_mq_unregister_hctx(hctx);

kobject_put(&hctx->kobj);
}

blk_mq_debugfs_unregister_hctxs(q);

kobject_uevent(&q->mq_kobj, KOBJ_REMOVE);
Expand Down
5 changes: 1 addition & 4 deletions block/blk-mq.c
Original file line number Diff line number Diff line change
Expand Up @@ -2256,8 +2256,7 @@ void blk_mq_release(struct request_queue *q)
queue_for_each_hw_ctx(q, hctx, i) {
if (!hctx)
continue;
kfree(hctx->ctxs);
kfree(hctx);
kobject_put(&hctx->kobj);
}

q->mq_map = NULL;
Expand Down Expand Up @@ -2336,8 +2335,6 @@ static void blk_mq_realloc_hw_ctxs(struct blk_mq_tag_set *set,
blk_mq_exit_hctx(q, set, hctx, j);
free_cpumask_var(hctx->cpumask);
kobject_put(&hctx->kobj);
kfree(hctx->ctxs);
kfree(hctx);
hctxs[j] = NULL;

}
Expand Down

0 comments on commit 6c8b232

Please sign in to comment.