Commit bf319721 authored by André Almeida's avatar André Almeida Committed by Thomas Zimmermann
Browse files

drm: drm_auth: Convert mutex usage to guard(mutex)



Replace open-coded mutex handling with cleanup.h guard(mutex). This
simplifies the code and removes the "goto unlock" pattern.

Tested with igt tests core_auth and core_setmaster.

Signed-off-by: default avatarAndré Almeida <andrealmeid@igalia.com>
Reviewed-by: default avatarThomas Zimmermann <tzimmermann@suse.de>
Signed-off-by: default avatarThomas Zimmermann <tzimmermann@suse.de>
Link: https://lore.kernel.org/r/20250509142627.639419-1-andrealmeid@igalia.com
parent 1f957fbb
Loading
Loading
Loading
Loading
+23 −41
Original line number Diff line number Diff line
@@ -95,7 +95,7 @@ int drm_getmagic(struct drm_device *dev, void *data, struct drm_file *file_priv)
	struct drm_auth *auth = data;
	int ret = 0;

	mutex_lock(&dev->master_mutex);
	guard(mutex)(&dev->master_mutex);
	if (!file_priv->magic) {
		ret = idr_alloc(&file_priv->master->magic_map, file_priv,
				1, 0, GFP_KERNEL);
@@ -103,7 +103,6 @@ int drm_getmagic(struct drm_device *dev, void *data, struct drm_file *file_priv)
			file_priv->magic = ret;
	}
	auth->magic = file_priv->magic;
	mutex_unlock(&dev->master_mutex);

	drm_dbg_core(dev, "%u\n", auth->magic);

@@ -118,13 +117,12 @@ int drm_authmagic(struct drm_device *dev, void *data,

	drm_dbg_core(dev, "%u\n", auth->magic);

	mutex_lock(&dev->master_mutex);
	guard(mutex)(&dev->master_mutex);
	file = idr_find(&file_priv->master->magic_map, auth->magic);
	if (file) {
		file->authenticated = 1;
		idr_replace(&file_priv->master->magic_map, NULL, auth->magic);
	}
	mutex_unlock(&dev->master_mutex);

	return file ? 0 : -EINVAL;
}
@@ -248,41 +246,33 @@ int drm_setmaster_ioctl(struct drm_device *dev, void *data,
{
	int ret;

	mutex_lock(&dev->master_mutex);
	guard(mutex)(&dev->master_mutex);

	ret = drm_master_check_perm(dev, file_priv);
	if (ret)
		goto out_unlock;
		return ret;

	if (drm_is_current_master_locked(file_priv))
		goto out_unlock;
		return ret;

	if (dev->master) {
		ret = -EBUSY;
		goto out_unlock;
	}
	if (dev->master)
		return -EBUSY;

	if (!file_priv->master) {
		ret = -EINVAL;
		goto out_unlock;
	}
	if (!file_priv->master)
		return -EINVAL;

	if (!file_priv->is_master) {
		ret = drm_new_set_master(dev, file_priv);
		goto out_unlock;
	}
	if (!file_priv->is_master)
		return drm_new_set_master(dev, file_priv);

	if (file_priv->master->lessor != NULL) {
		drm_dbg_lease(dev,
			      "Attempt to set lessee %d as master\n",
			      file_priv->master->lessee_id);
		ret = -EINVAL;
		goto out_unlock;
		return -EINVAL;
	}

	drm_set_master(dev, file_priv, false);
out_unlock:
	mutex_unlock(&dev->master_mutex);

	return ret;
}

@@ -299,33 +289,27 @@ int drm_dropmaster_ioctl(struct drm_device *dev, void *data,
{
	int ret;

	mutex_lock(&dev->master_mutex);
	guard(mutex)(&dev->master_mutex);

	ret = drm_master_check_perm(dev, file_priv);
	if (ret)
		goto out_unlock;
		return ret;

	if (!drm_is_current_master_locked(file_priv)) {
		ret = -EINVAL;
		goto out_unlock;
	}
	if (!drm_is_current_master_locked(file_priv))
		return -EINVAL;

	if (!dev->master) {
		ret = -EINVAL;
		goto out_unlock;
	}
	if (!dev->master)
		return -EINVAL;

	if (file_priv->master->lessor != NULL) {
		drm_dbg_lease(dev,
			      "Attempt to drop lessee %d as master\n",
			      file_priv->master->lessee_id);
		ret = -EINVAL;
		goto out_unlock;
		return -EINVAL;
	}

	drm_drop_master(dev, file_priv);
out_unlock:
	mutex_unlock(&dev->master_mutex);

	return ret;
}

@@ -337,7 +321,7 @@ int drm_master_open(struct drm_file *file_priv)
	/* if there is no current master make this fd it, but do not create
	 * any master object for render clients
	 */
	mutex_lock(&dev->master_mutex);
	guard(mutex)(&dev->master_mutex);
	if (!dev->master) {
		ret = drm_new_set_master(dev, file_priv);
	} else {
@@ -345,7 +329,6 @@ int drm_master_open(struct drm_file *file_priv)
		file_priv->master = drm_master_get(dev->master);
		spin_unlock(&file_priv->master_lookup_lock);
	}
	mutex_unlock(&dev->master_mutex);

	return ret;
}
@@ -355,7 +338,7 @@ void drm_master_release(struct drm_file *file_priv)
	struct drm_device *dev = file_priv->minor->dev;
	struct drm_master *master;

	mutex_lock(&dev->master_mutex);
	guard(mutex)(&dev->master_mutex);
	master = file_priv->master;
	if (file_priv->magic)
		idr_remove(&file_priv->master->magic_map, file_priv->magic);
@@ -376,7 +359,6 @@ void drm_master_release(struct drm_file *file_priv)
	/* drop the master reference held by the file priv */
	if (file_priv->master)
		drm_master_put(&file_priv->master);
	mutex_unlock(&dev->master_mutex);
}

/**