On Fri, Nov 16, 2018 at 02:11:07PM +0800, jianchao.wang wrote:
On 11/16/18 11:28 AM, Ming Lei wrote: ...
+struct blk_mq_kobj {
- struct kobject kobj;
 +};
static void blk_mq_sysfs_release(struct kobject *kobj) {
- struct blk_mq_kobj *mq_kobj = container_of(kobj, struct blk_mq_kobj,
 kobj);- kfree(mq_kobj);
 +}
...
-void blk_mq_sysfs_init(struct request_queue *q) +int blk_mq_sysfs_init(struct request_queue *q) { struct blk_mq_ctx *ctx; int cpu;
- struct blk_mq_kobj *mq_kobj;
 - mq_kobj = kzalloc(sizeof(struct blk_mq_kobj), GFP_KERNEL);
 - if (!mq_kobj)
 return -ENOMEM;
- kobject_init(&q->mq_kobj, &blk_mq_ktype);
 
- kobject_init(&mq_kobj->kobj, &blk_mq_ktype);
 for_each_possible_cpu(cpu) {
ctx = per_cpu_ptr(q->queue_ctx, cpu);
ctx = kzalloc_node(sizeof(*ctx), GFP_KERNEL, cpu_to_node(cpu));if (!ctx)goto fail; kobject_init(&ctx->kobj, &blk_mq_ctx_ktype); }*per_cpu_ptr(q->queue_ctx, cpu) = ctx;- q->mq_kobj = &mq_kobj->kobj;
 - return 0;
 - fail:
 - for_each_possible_cpu(cpu) {
 ctx = *per_cpu_ptr(q->queue_ctx, cpu);if (ctx)kobject_put(&ctx->kobj);- }
 - kobject_put(&mq_kobj->kobj);
 - return -ENOMEM;
 }
blk_mq_kobj looks meaningless, why do we need it, or do I miss something ?
Right, it should have been allocated directly.
And maybe we should allocate ctx in blk_mq_init_allocated_queue.
Looks either way is fine.
Thanks, Ming