lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <7133e9b4-c05a-4901-940e-de3e70bbbb1e@suse.de>
Date: Mon, 12 May 2025 08:52:56 +0200
From: Thomas Zimmermann <tzimmermann@...e.de>
To: André Almeida <andrealmeid@...lia.com>,
 Maarten Lankhorst <maarten.lankhorst@...ux.intel.com>,
 Maxime Ripard <mripard@...nel.org>, David Airlie <airlied@...il.com>,
 Simona Vetter <simona@...ll.ch>
Cc: dri-devel@...ts.freedesktop.org, linux-kernel@...r.kernel.org,
 kernel-dev@...lia.com, Kees Cook <keescook@...omium.org>,
 Tvrtko Ursulin <tvrtko.ursulin@...lia.com>
Subject: Re: [PATCH] drm: drm_auth: Convert mutex usage to guard(mutex)

Hi

Am 09.05.25 um 16:26 schrieb André Almeida:
> 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: André Almeida <andrealmeid@...lia.com>

Reviewed-by: Thomas Zimmermann <tzimmermann@...e.de>

but with questions below

> ---
>
> For more information about guard(mutex):
> https://www.kernel.org/doc/html/latest/core-api/cleanup.html

This page lists issues with guards, so conversion from manual locking 
should be decided on a case-by-case base IMHO.

> ---
>   drivers/gpu/drm/drm_auth.c | 64 ++++++++++++++------------------------
>   1 file changed, 23 insertions(+), 41 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_auth.c b/drivers/gpu/drm/drm_auth.c
> index 22aa015df387..d6bf605b4b90 100644
> --- a/drivers/gpu/drm/drm_auth.c
> +++ b/drivers/gpu/drm/drm_auth.c
> @@ -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);

These guard statements are hidden variable declarations. Shouldn't they 
rather go to the function top with the other declarations? This would 
also help to prevent the problem listed in cleanup.html to some extend.

Best regards
Thomas

>   	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);
>   }
>   
>   /**

-- 
--
Thomas Zimmermann
Graphics Driver Developer
SUSE Software Solutions Germany GmbH
Frankenstrasse 146, 90461 Nuernberg, Germany
GF: Ivo Totev, Andrew Myers, Andrew McDonald, Boudien Moerman
HRB 36809 (AG Nuernberg)


Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ