Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v4.9 137 lines 4.2 kB view raw
1/** 2 * \file drm_info.c 3 * DRM info file implementations 4 * 5 * \author Ben Gamari <bgamari@gmail.com> 6 */ 7 8/* 9 * Created: Sun Dec 21 13:09:50 2008 by bgamari@gmail.com 10 * 11 * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas. 12 * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California. 13 * Copyright 2008 Ben Gamari <bgamari@gmail.com> 14 * All Rights Reserved. 15 * 16 * Permission is hereby granted, free of charge, to any person obtaining a 17 * copy of this software and associated documentation files (the "Software"), 18 * to deal in the Software without restriction, including without limitation 19 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 20 * and/or sell copies of the Software, and to permit persons to whom the 21 * Software is furnished to do so, subject to the following conditions: 22 * 23 * The above copyright notice and this permission notice (including the next 24 * paragraph) shall be included in all copies or substantial portions of the 25 * Software. 26 * 27 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 28 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 29 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 30 * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 31 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 32 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 33 * OTHER DEALINGS IN THE SOFTWARE. 34 */ 35 36#include <linux/seq_file.h> 37#include <drm/drmP.h> 38#include <drm/drm_gem.h> 39 40#include "drm_internal.h" 41#include "drm_legacy.h" 42 43/** 44 * Called when "/proc/dri/.../name" is read. 45 * 46 * Prints the device name together with the bus id if available. 47 */ 48int drm_name_info(struct seq_file *m, void *data) 49{ 50 struct drm_info_node *node = (struct drm_info_node *) m->private; 51 struct drm_minor *minor = node->minor; 52 struct drm_device *dev = minor->dev; 53 struct drm_master *master; 54 55 mutex_lock(&dev->master_mutex); 56 master = dev->master; 57 seq_printf(m, "%s", dev->driver->name); 58 if (dev->dev) 59 seq_printf(m, " dev=%s", dev_name(dev->dev)); 60 if (master && master->unique) 61 seq_printf(m, " master=%s", master->unique); 62 if (dev->unique) 63 seq_printf(m, " unique=%s", dev->unique); 64 seq_printf(m, "\n"); 65 mutex_unlock(&dev->master_mutex); 66 67 return 0; 68} 69 70/** 71 * Called when "/proc/dri/.../clients" is read. 72 * 73 */ 74int drm_clients_info(struct seq_file *m, void *data) 75{ 76 struct drm_info_node *node = (struct drm_info_node *) m->private; 77 struct drm_device *dev = node->minor->dev; 78 struct drm_file *priv; 79 kuid_t uid; 80 81 seq_printf(m, 82 "%20s %5s %3s master a %5s %10s\n", 83 "command", 84 "pid", 85 "dev", 86 "uid", 87 "magic"); 88 89 /* dev->filelist is sorted youngest first, but we want to present 90 * oldest first (i.e. kernel, servers, clients), so walk backwardss. 91 */ 92 mutex_lock(&dev->filelist_mutex); 93 list_for_each_entry_reverse(priv, &dev->filelist, lhead) { 94 struct task_struct *task; 95 96 rcu_read_lock(); /* locks pid_task()->comm */ 97 task = pid_task(priv->pid, PIDTYPE_PID); 98 uid = task ? __task_cred(task)->euid : GLOBAL_ROOT_UID; 99 seq_printf(m, "%20s %5d %3d %c %c %5d %10u\n", 100 task ? task->comm : "<unknown>", 101 pid_vnr(priv->pid), 102 priv->minor->index, 103 drm_is_current_master(priv) ? 'y' : 'n', 104 priv->authenticated ? 'y' : 'n', 105 from_kuid_munged(seq_user_ns(m), uid), 106 priv->magic); 107 rcu_read_unlock(); 108 } 109 mutex_unlock(&dev->filelist_mutex); 110 return 0; 111} 112 113static int drm_gem_one_name_info(int id, void *ptr, void *data) 114{ 115 struct drm_gem_object *obj = ptr; 116 struct seq_file *m = data; 117 118 seq_printf(m, "%6d %8zd %7d %8d\n", 119 obj->name, obj->size, 120 obj->handle_count, 121 atomic_read(&obj->refcount.refcount)); 122 return 0; 123} 124 125int drm_gem_name_info(struct seq_file *m, void *data) 126{ 127 struct drm_info_node *node = (struct drm_info_node *) m->private; 128 struct drm_device *dev = node->minor->dev; 129 130 seq_printf(m, " name size handles refcount\n"); 131 132 mutex_lock(&dev->object_name_lock); 133 idr_for_each(&dev->object_name_idr, drm_gem_one_name_info, m); 134 mutex_unlock(&dev->object_name_lock); 135 136 return 0; 137}