2009-02-17 20:08:49 -05:00
/**
* \ file drm_info . c
* DRM info file implementations
*
* \ author Ben Gamari < bgamari @ gmail . com >
*/
/*
* Created : Sun Dec 21 13 : 09 : 50 2008 by bgamari @ gmail . com
*
* Copyright 1999 Precision Insight , Inc . , Cedar Park , Texas .
* Copyright 2000 VA Linux Systems , Inc . , Sunnyvale , California .
* Copyright 2008 Ben Gamari < bgamari @ gmail . com >
* All Rights Reserved .
*
* Permission is hereby granted , free of charge , to any person obtaining a
* copy of this software and associated documentation files ( the " Software " ) ,
* to deal in the Software without restriction , including without limitation
* the rights to use , copy , modify , merge , publish , distribute , sublicense ,
* and / or sell copies of the Software , and to permit persons to whom the
* Software is furnished to do so , subject to the following conditions :
*
* The above copyright notice and this permission notice ( including the next
* paragraph ) shall be included in all copies or substantial portions of the
* Software .
*
* THE SOFTWARE IS PROVIDED " AS IS " , WITHOUT WARRANTY OF ANY KIND , EXPRESS OR
* IMPLIED , INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY ,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT . IN NO EVENT SHALL
* VA LINUX SYSTEMS AND / OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM , DAMAGES OR
* OTHER LIABILITY , WHETHER IN AN ACTION OF CONTRACT , TORT OR OTHERWISE ,
* ARISING FROM , OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE .
*/
# include <linux/seq_file.h>
2012-10-02 18:01:07 +01:00
# include <drm/drmP.h>
2014-09-23 15:46:53 +02:00
# include <drm/drm_gem.h>
2015-03-13 14:51:25 +02:00
# include "drm_internal.h"
2014-09-11 07:43:25 +02:00
# include "drm_legacy.h"
2009-02-17 20:08:49 -05:00
/**
* Called when " /proc/dri/.../name " is read .
*
* Prints the device name together with the bus id if available .
*/
int drm_name_info ( struct seq_file * m , void * data )
{
struct drm_info_node * node = ( struct drm_info_node * ) m - > private ;
struct drm_minor * minor = node - > minor ;
struct drm_device * dev = minor - > dev ;
2016-06-21 10:54:12 +02:00
struct drm_master * master ;
mutex_lock ( & dev - > master_mutex ) ;
master = dev - > master ;
2016-06-20 19:53:33 +01:00
seq_printf ( m , " %s " , dev - > driver - > name ) ;
if ( dev - > dev )
seq_printf ( m , " dev=%s " , dev_name ( dev - > dev ) ) ;
if ( master & & master - > unique )
seq_printf ( m , " master=%s " , master - > unique ) ;
if ( dev - > unique )
seq_printf ( m , " unique=%s " , dev - > unique ) ;
seq_printf ( m , " \n " ) ;
2016-06-21 10:54:12 +02:00
mutex_unlock ( & dev - > master_mutex ) ;
2016-06-20 19:53:33 +01:00
2009-02-17 20:08:49 -05:00
return 0 ;
}
/**
* Called when " /proc/dri/.../clients " is read .
*
*/
int drm_clients_info ( struct seq_file * m , void * data )
{
struct drm_info_node * node = ( struct drm_info_node * ) m - > private ;
struct drm_device * dev = node - > minor - > dev ;
struct drm_file * priv ;
2016-09-01 14:48:32 +02:00
kuid_t uid ;
2009-02-17 20:08:49 -05:00
2014-09-02 08:03:22 +01:00
seq_printf ( m ,
" %20s %5s %3s master a %5s %10s \n " ,
" command " ,
" pid " ,
" dev " ,
" uid " ,
" magic " ) ;
/* dev->filelist is sorted youngest first, but we want to present
* oldest first ( i . e . kernel , servers , clients ) , so walk backwardss .
*/
2016-04-26 19:29:41 +02:00
mutex_lock ( & dev - > filelist_mutex ) ;
2014-09-02 08:03:22 +01:00
list_for_each_entry_reverse ( priv , & dev - > filelist , lhead ) {
struct task_struct * task ;
rcu_read_lock ( ) ; /* locks pid_task()->comm */
task = pid_task ( priv - > pid , PIDTYPE_PID ) ;
2016-09-01 14:48:32 +02:00
uid = task ? __task_cred ( task ) - > euid : GLOBAL_ROOT_UID ;
2014-09-02 08:03:22 +01:00
seq_printf ( m , " %20s %5d %3d %c %c %5d %10u \n " ,
task ? task - > comm : " <unknown> " ,
2012-02-07 16:47:26 -08:00
pid_vnr ( priv - > pid ) ,
2014-09-02 08:03:22 +01:00
priv - > minor - > index ,
2016-06-21 10:54:20 +02:00
drm_is_current_master ( priv ) ? ' y ' : ' n ' ,
2014-09-02 08:03:22 +01:00
priv - > authenticated ? ' y ' : ' n ' ,
2016-09-01 14:48:32 +02:00
from_kuid_munged ( seq_user_ns ( m ) , uid ) ,
2013-12-11 11:35:09 +01:00
priv - > magic ) ;
2014-09-02 08:03:22 +01:00
rcu_read_unlock ( ) ;
2009-02-17 20:08:49 -05:00
}
2016-04-26 19:29:41 +02:00
mutex_unlock ( & dev - > filelist_mutex ) ;
2009-02-17 20:08:49 -05:00
return 0 ;
}
2012-06-18 11:09:56 +05:30
static int drm_gem_one_name_info ( int id , void * ptr , void * data )
2009-02-17 20:08:49 -05:00
{
struct drm_gem_object * obj = ptr ;
struct seq_file * m = data ;
seq_printf ( m , " %6d %8zd %7d %8d \n " ,
obj - > name , obj - > size ,
2013-08-15 00:02:37 +02:00
obj - > handle_count ,
2016-11-14 17:29:48 +01:00
kref_read ( & obj - > refcount ) ) ;
2009-02-17 20:08:49 -05:00
return 0 ;
}
int drm_gem_name_info ( struct seq_file * m , void * data )
{
struct drm_info_node * node = ( struct drm_info_node * ) m - > private ;
struct drm_device * dev = node - > minor - > dev ;
seq_printf ( m , " name size handles refcount \n " ) ;
2013-08-08 15:41:33 +02:00
2013-08-15 00:02:44 +02:00
mutex_lock ( & dev - > object_name_lock ) ;
2009-02-17 20:08:49 -05:00
idr_for_each ( & dev - > object_name_idr , drm_gem_one_name_info , m ) ;
2013-08-15 00:02:44 +02:00
mutex_unlock ( & dev - > object_name_lock ) ;
2013-08-08 15:41:33 +02:00
2009-02-17 20:08:49 -05:00
return 0 ;
}