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;
> > +           *per_cpu_ptr(q->queue_ctx, cpu) = ctx;
> >             kobject_init(&ctx->kobj, &blk_mq_ctx_ktype);
> >     }
> > +   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

Reply via email to