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@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@anholt.net Signed-off-by: Daniel Vetter daniel.vetter@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
return -EINVAL;* no clients tracked. */
}
-- 1.8.3.2