[PATCH 36/39] drm: hollow-out GET_CLIENT ioctl

Daniel Vetter daniel at ffwll.ch
Tue Jul 16 05:33:53 PDT 2013


On Wed, Jul 10, 2013 at 02:12:10PM +0200, Daniel Vetter wrote:
> We not only have debugfs files to do pretty much the equivalent of
> lsof, we also have an ioctl. Not that compared to lsof this dumps a
> wee bit more information, but we can still get at that from debugfs
> easily.
> 
> I've dug around in mesa, libdrm and ddx histories and the only users
> seem to be drm/tests/dristat.c and drm/tests/getclients.c. The later
> is a testcase for the ioctl itself since up to
> 
> commit b018fcdaa5e8b4eabb8cffda687d00004a3c4785
> Author: Eric Anholt <eric at anholt.net>
> Date:   Thu Nov 22 18:46:54 2007 +1000
> 
>     drm: Make DRM_IOCTL_GET_CLIENT return EINVAL when it can't find client #idx
> 
> there was actually no way at all for userspace to enumerate all
> clients since the kernel just wouldn't tell it when to stop. Which
> completely broke it's only user, dristat -c.
> 
> So obviously that ioctl wasn't much use for debugging. Hence I don't
> see any point in keeping support for a tool which was pretty obviously
> never really used, and while we have good replacements in the form of
> equivalent debugfs files.
> 
> Still, to keep dristat -c from looping forever again stop it early by
> returning an unconditional -EINVAL. Also add a comment in the code
> about why.
> 
> Cc: Eric Anholt <eric at anholt.net>
> Signed-off-by: Daniel Vetter <daniel.vetter at ffwll.ch>

libva for the rescue (or not)! Thanks to a patch floating by on libva I've
noticed that libva's dri loader used the GET_CLIENT ioctl to

*drumroll*

check whether it's authenticated. I can't even grasp that part, but in any
case this patch here just died in it's current form :(

I'll figure out whether there's some fun way to keep the hollowed-out
ioclt without breaking existing userspace, but probably not worth the
fuzz.
-Daniel

> ---
>  drivers/gpu/drm/drm_ioctl.c | 27 ++++-----------------------
>  1 file changed, 4 insertions(+), 23 deletions(-)
> 
> diff --git a/drivers/gpu/drm/drm_ioctl.c b/drivers/gpu/drm/drm_ioctl.c
> index 0acf080..5159fa0 100644
> --- a/drivers/gpu/drm/drm_ioctl.c
> +++ b/drivers/gpu/drm/drm_ioctl.c
> @@ -216,29 +216,10 @@ int drm_getmap(struct drm_device *dev, void *data,
>  int drm_getclient(struct drm_device *dev, void *data,
>  		  struct drm_file *file_priv)
>  {
> -	struct drm_client *client = data;
> -	struct drm_file *pt;
> -	int idx;
> -	int i;
> -
> -	idx = client->idx;
> -	i = 0;
> -
> -	mutex_lock(&dev->struct_mutex);
> -	list_for_each_entry(pt, &dev->filelist, lhead) {
> -		if (i++ >= idx) {
> -			client->auth = pt->authenticated;
> -			client->pid = pid_vnr(pt->pid);
> -			client->uid = from_kuid_munged(current_user_ns(), pt->uid);
> -			client->magic = pt->magic;
> -			client->iocs = pt->ioctl_count;
> -			mutex_unlock(&dev->struct_mutex);
> -
> -			return 0;
> -		}
> -	}
> -	mutex_unlock(&dev->struct_mutex);
> -
> +	/* Hollowed-out getclient ioctl to keep some dead old drm tests/tools
> +	 * not breaking completely. Userspace tools stop enumerating one they
> +	 * get -EINVAL, hence this is the return value we need to hand back for
> +	 * no clients tracked. */
>  	return -EINVAL;
>  }
>  
> -- 
> 1.8.3.2
> 

-- 
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch


More information about the dri-devel mailing list