On Wed, Nov 17, 2021 at 08:49:56PM -0800, Jakub Kicinski wrote: > On Wed, 17 Nov 2021 20:26:21 +0200 Leon Romanovsky wrote: > > - top_hierarchy = parent_resource_id == DEVLINK_RESOURCE_ID_PARENT_TOP; > > - > > - mutex_lock(&devlink->lock); > > - resource = devlink_resource_find(devlink, NULL, resource_id); > > - if (resource) { > > - err = -EINVAL; > > - goto out; > > - } > > + WARN_ON(devlink_resource_find(devlink, NULL, resource_id)); > > This is not atomic with the add now. And it shouldn't. devlink_resource_find() will return valid resource only if there driver is completely bogus with races or incorrect allocations of resource_id. devlink_*_register(..) mutex_lock(&devlink->lock); if (devlink_*_find(...)) { mutex_unlock(&devlink->lock); return ....; } ..... It is almost always wrong from locking and layering perspective the pattern above, as it is racy by definition if not protected by top layer. There are exceptions from the rule above, but devlink is clearly not the one of such exceptions. Thanks