On Tue, 23 Nov 2021 10:33:13 +0200 Leon Romanovsky wrote: > > > You can do it with my approach too. We incremented reference counter > > > of devlink instance when devlink_nl_cmd_port_split_doit() was called, > > > and we can safely take devlink->port_list_lock lock before returning > > > from pre_doit. > > > > Wait, I thought you'd hold devlink->lock around split/unsplit. > > I'm holding. > > 519 static int devlink_nl_pre_doit(const struct genl_ops *ops, > 520 struct sk_buff *skb, struct genl_info *info) > 521 { > ... > 529 > 530 mutex_lock(&devlink->lock); Then I'm confused why you said you need to hold a ref count on devlink. Is it devlink_unregister() that's not taking devlink->lock? > > Please look at the port splitting case, mlx5 doesn't implement it > > but it's an important feature. > > I'll, but please don't forget that it was RFC, just to present that > devlink can be changed internally without exposing internals. > > > Either way, IDK how ref count on devlink helps with lifetime of a > > subobject. You must assume the sub-objects can only be created outside > > of the time devlink instance is visible or under devlink->lock? > > The devlink lifetime is: > stages: I II III > devlink_alloc -> devlink_register -> devlink_unregister -> devlink_free. > > All sub-objects should be created between devlink_alloc and devlink_free. > It will ensure that ->devlink pointer is always valid. > > Stage I: > * There is no need to hold any devlink locks or increase reference counter. > If driver doesn't do anything crazy during its init, nothing in devlink > land will run in parallel. > Stage II: > * There is a need to hold devlink->lock and/or play with reference counter > and/or use fine-grained locks. Users can issue "devlink ..." commands. So sub-objects can (dis)appear only in I/III or under devlink->lock. Why did you add the per-sub object list locks, then?