#define DEVLINK_NL_FLAG_NEED_PORT              BIT(0)
 #define DEVLINK_NL_FLAG_NEED_DEVLINK_OR_PORT   BIT(1)
+#define DEVLINK_NL_FLAG_NEED_DEV_LOCK          BIT(2)
 
 static const struct genl_multicast_group devlink_nl_mcgrps[] = {
        [DEVLINK_MCGRP_CONFIG] = { .name = DEVLINK_GENL_MCGRP_CONFIG_NAME },
 }
 
 struct devlink *
-devlink_get_from_attrs_lock(struct net *net, struct nlattr **attrs)
+devlink_get_from_attrs_lock(struct net *net, struct nlattr **attrs,
+                           bool dev_lock)
 {
        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);
+               devl_dev_lock(devlink, dev_lock);
                if (devl_is_registered(devlink) &&
                    strcmp(devlink->dev->bus->name, busname) == 0 &&
                    strcmp(dev_name(devlink->dev), devname) == 0)
                        return devlink;
-               devl_unlock(devlink);
+               devl_dev_unlock(devlink, dev_lock);
                devlink_put(devlink);
        }
 
 static int __devlink_nl_pre_doit(struct sk_buff *skb, struct genl_info *info,
                                 u8 flags)
 {
+       bool dev_lock = flags & DEVLINK_NL_FLAG_NEED_DEV_LOCK;
        struct devlink_port *devlink_port;
        struct devlink *devlink;
        int err;
 
-       devlink = devlink_get_from_attrs_lock(genl_info_net(info), info->attrs);
+       devlink = devlink_get_from_attrs_lock(genl_info_net(info), info->attrs,
+                                             dev_lock);
        if (IS_ERR(devlink))
                return PTR_ERR(devlink);
 
        return 0;
 
 unlock:
-       devl_unlock(devlink);
+       devl_dev_unlock(devlink, dev_lock);
        devlink_put(devlink);
        return err;
 }
 static void __devlink_nl_post_doit(struct sk_buff *skb, struct genl_info *info,
                                   u8 flags)
 {
+       bool dev_lock = flags & DEVLINK_NL_FLAG_NEED_DEV_LOCK;
        struct devlink *devlink;
 
        devlink = info->user_ptr[0];
-       devl_unlock(devlink);
+       devl_dev_unlock(devlink, dev_lock);
        devlink_put(devlink);
 }
 
        struct devlink *devlink;
        int err;
 
-       devlink = devlink_get_from_attrs_lock(sock_net(msg->sk), attrs);
+       devlink = devlink_get_from_attrs_lock(sock_net(msg->sk), attrs, false);
        if (IS_ERR(devlink))
                return PTR_ERR(devlink);
        err = dump_one(msg, devlink, cb, flags | NLM_F_DUMP_FILTERED);