extern const struct genl_small_ops devlink_nl_ops[56];
 
-struct devlink *devlink_get_from_attrs(struct net *net, struct nlattr **attrs);
+struct devlink *
+devlink_get_from_attrs_lock(struct net *net, struct nlattr **attrs);
 
 void devlink_notify_unregister(struct devlink *devlink);
 void devlink_notify_register(struct devlink *devlink);
 
 
        start_offset = state->start_offset;
 
-       devlink = devlink_get_from_attrs(sock_net(cb->skb->sk), attrs);
+       devlink = devlink_get_from_attrs_lock(sock_net(cb->skb->sk), attrs);
        if (IS_ERR(devlink))
                return PTR_ERR(devlink);
 
-       devl_lock(devlink);
-
        if (!attrs[DEVLINK_ATTR_REGION_NAME]) {
                NL_SET_ERR_MSG(cb->extack, "No region name provided");
                err = -EINVAL;
        struct nlattr **attrs = info->attrs;
        struct devlink *devlink;
 
-       devlink = devlink_get_from_attrs(sock_net(cb->skb->sk), attrs);
+       devlink = devlink_get_from_attrs_lock(sock_net(cb->skb->sk), attrs);
        if (IS_ERR(devlink))
                return NULL;
+       devl_unlock(devlink);
 
        reporter = devlink_health_reporter_get_from_attrs(devlink, attrs);
        devlink_put(devlink);
 
        [DEVLINK_ATTR_REGION_DIRECT] = { .type = NLA_FLAG },
 };
 
-struct devlink *devlink_get_from_attrs(struct net *net, struct nlattr **attrs)
+struct devlink *
+devlink_get_from_attrs_lock(struct net *net, struct nlattr **attrs)
 {
        struct devlink *devlink;
        unsigned long index;
        devname = nla_data(attrs[DEVLINK_ATTR_DEV_NAME]);
 
        devlinks_xa_for_each_registered_get(net, index, devlink) {
+               devl_lock(devlink);
                if (strcmp(devlink->dev->bus->name, busname) == 0 &&
                    strcmp(dev_name(devlink->dev), devname) == 0)
                        return devlink;
+               devl_unlock(devlink);
                devlink_put(devlink);
        }
 
        struct devlink *devlink;
        int err;
 
-       devlink = devlink_get_from_attrs(genl_info_net(info), info->attrs);
+       devlink = devlink_get_from_attrs_lock(genl_info_net(info), info->attrs);
        if (IS_ERR(devlink))
                return PTR_ERR(devlink);
-       devl_lock(devlink);
+
        info->user_ptr[0] = devlink;
        if (ops->internal_flags & DEVLINK_NL_FLAG_NEED_PORT) {
                devlink_port = devlink_port_get_from_info(devlink, info);