static LIST_HEAD(mdev_head);
 /* A global mutex that protects vdpa management device and device level operations. */
-static DEFINE_MUTEX(vdpa_dev_mutex);
+static DECLARE_RWSEM(vdpa_dev_lock);
 static DEFINE_IDA(vdpa_index_ida);
 
 void vdpa_set_status(struct vdpa_device *vdev, u8 status)
 
        vdev->nvqs = nvqs;
 
-       lockdep_assert_held(&vdpa_dev_mutex);
+       lockdep_assert_held(&vdpa_dev_lock);
        dev = bus_find_device(&vdpa_bus, NULL, dev_name(&vdev->dev), vdpa_name_match);
        if (dev) {
                put_device(dev);
 {
        int err;
 
-       mutex_lock(&vdpa_dev_mutex);
+       down_write(&vdpa_dev_lock);
        err = __vdpa_register_device(vdev, nvqs);
-       mutex_unlock(&vdpa_dev_mutex);
+       up_write(&vdpa_dev_lock);
        return err;
 }
 EXPORT_SYMBOL_GPL(vdpa_register_device);
  */
 void _vdpa_unregister_device(struct vdpa_device *vdev)
 {
-       lockdep_assert_held(&vdpa_dev_mutex);
+       lockdep_assert_held(&vdpa_dev_lock);
        WARN_ON(!vdev->mdev);
        device_unregister(&vdev->dev);
 }
  */
 void vdpa_unregister_device(struct vdpa_device *vdev)
 {
-       mutex_lock(&vdpa_dev_mutex);
+       down_write(&vdpa_dev_lock);
        device_unregister(&vdev->dev);
-       mutex_unlock(&vdpa_dev_mutex);
+       up_write(&vdpa_dev_lock);
 }
 EXPORT_SYMBOL_GPL(vdpa_unregister_device);
 
                return -EINVAL;
 
        INIT_LIST_HEAD(&mdev->list);
-       mutex_lock(&vdpa_dev_mutex);
+       down_write(&vdpa_dev_lock);
        list_add_tail(&mdev->list, &mdev_head);
-       mutex_unlock(&vdpa_dev_mutex);
+       up_write(&vdpa_dev_lock);
        return 0;
 }
 EXPORT_SYMBOL_GPL(vdpa_mgmtdev_register);
 
 void vdpa_mgmtdev_unregister(struct vdpa_mgmt_dev *mdev)
 {
-       mutex_lock(&vdpa_dev_mutex);
+       down_write(&vdpa_dev_lock);
 
        list_del(&mdev->list);
 
        /* Filter out all the entries belong to this management device and delete it. */
        bus_for_each_dev(&vdpa_bus, NULL, mdev, vdpa_match_remove);
 
-       mutex_unlock(&vdpa_dev_mutex);
+       up_write(&vdpa_dev_lock);
 }
 EXPORT_SYMBOL_GPL(vdpa_mgmtdev_unregister);
 
        if (!msg)
                return -ENOMEM;
 
-       mutex_lock(&vdpa_dev_mutex);
+       down_read(&vdpa_dev_lock);
        mdev = vdpa_mgmtdev_get_from_attr(info->attrs);
        if (IS_ERR(mdev)) {
-               mutex_unlock(&vdpa_dev_mutex);
+               up_read(&vdpa_dev_lock);
                NL_SET_ERR_MSG_MOD(info->extack, "Fail to find the specified mgmt device");
                err = PTR_ERR(mdev);
                goto out;
        }
 
        err = vdpa_mgmtdev_fill(mdev, msg, info->snd_portid, info->snd_seq, 0);
-       mutex_unlock(&vdpa_dev_mutex);
+       up_read(&vdpa_dev_lock);
        if (err)
                goto out;
        err = genlmsg_reply(msg, info);
        int idx = 0;
        int err;
 
-       mutex_lock(&vdpa_dev_mutex);
+       down_read(&vdpa_dev_lock);
        list_for_each_entry(mdev, &mdev_head, list) {
                if (idx < start) {
                        idx++;
                idx++;
        }
 out:
-       mutex_unlock(&vdpa_dev_mutex);
+       up_read(&vdpa_dev_lock);
        cb->args[0] = idx;
        return msg->len;
 }
            !netlink_capable(skb, CAP_NET_ADMIN))
                return -EPERM;
 
-       mutex_lock(&vdpa_dev_mutex);
+       down_write(&vdpa_dev_lock);
        mdev = vdpa_mgmtdev_get_from_attr(info->attrs);
        if (IS_ERR(mdev)) {
                NL_SET_ERR_MSG_MOD(info->extack, "Fail to find the specified management device");
 
        err = mdev->ops->dev_add(mdev, name, &config);
 err:
-       mutex_unlock(&vdpa_dev_mutex);
+       up_write(&vdpa_dev_lock);
        return err;
 }
 
                return -EINVAL;
        name = nla_data(info->attrs[VDPA_ATTR_DEV_NAME]);
 
-       mutex_lock(&vdpa_dev_mutex);
+       down_write(&vdpa_dev_lock);
        dev = bus_find_device(&vdpa_bus, NULL, name, vdpa_name_match);
        if (!dev) {
                NL_SET_ERR_MSG_MOD(info->extack, "device not found");
 mdev_err:
        put_device(dev);
 dev_err:
-       mutex_unlock(&vdpa_dev_mutex);
+       up_write(&vdpa_dev_lock);
        return err;
 }
 
        if (!msg)
                return -ENOMEM;
 
-       mutex_lock(&vdpa_dev_mutex);
+       down_read(&vdpa_dev_lock);
        dev = bus_find_device(&vdpa_bus, NULL, devname, vdpa_name_match);
        if (!dev) {
                NL_SET_ERR_MSG_MOD(info->extack, "device not found");
 
        err = genlmsg_reply(msg, info);
        put_device(dev);
-       mutex_unlock(&vdpa_dev_mutex);
+       up_read(&vdpa_dev_lock);
        return err;
 
 mdev_err:
        put_device(dev);
 err:
-       mutex_unlock(&vdpa_dev_mutex);
+       up_read(&vdpa_dev_lock);
        nlmsg_free(msg);
        return err;
 }
        info.start_idx = cb->args[0];
        info.idx = 0;
 
-       mutex_lock(&vdpa_dev_mutex);
+       down_read(&vdpa_dev_lock);
        bus_for_each_dev(&vdpa_bus, NULL, &info, vdpa_dev_dump);
-       mutex_unlock(&vdpa_dev_mutex);
+       up_read(&vdpa_dev_lock);
        cb->args[0] = info.idx;
        return msg->len;
 }
        if (!msg)
                return -ENOMEM;
 
-       mutex_lock(&vdpa_dev_mutex);
+       down_read(&vdpa_dev_lock);
        dev = bus_find_device(&vdpa_bus, NULL, devname, vdpa_name_match);
        if (!dev) {
                NL_SET_ERR_MSG_MOD(info->extack, "device not found");
 mdev_err:
        put_device(dev);
 dev_err:
-       mutex_unlock(&vdpa_dev_mutex);
+       up_read(&vdpa_dev_lock);
        if (err)
                nlmsg_free(msg);
        return err;
        info.start_idx = cb->args[0];
        info.idx = 0;
 
-       mutex_lock(&vdpa_dev_mutex);
+       down_read(&vdpa_dev_lock);
        bus_for_each_dev(&vdpa_bus, NULL, &info, vdpa_dev_config_dump);
-       mutex_unlock(&vdpa_dev_mutex);
+       up_read(&vdpa_dev_lock);
        cb->args[0] = info.idx;
        return msg->len;
 }
                return -ENOMEM;
 
        index = nla_get_u32(info->attrs[VDPA_ATTR_DEV_QUEUE_INDEX]);
-       mutex_lock(&vdpa_dev_mutex);
+       down_read(&vdpa_dev_lock);
        dev = bus_find_device(&vdpa_bus, NULL, devname, vdpa_name_match);
        if (!dev) {
                NL_SET_ERR_MSG_MOD(info->extack, "device not found");
        err = genlmsg_reply(msg, info);
 
        put_device(dev);
-       mutex_unlock(&vdpa_dev_mutex);
+       up_read(&vdpa_dev_lock);
 
        return err;
 
        put_device(dev);
 dev_err:
        nlmsg_free(msg);
-       mutex_unlock(&vdpa_dev_mutex);
+       up_read(&vdpa_dev_lock);
        return err;
 }