diff options
Diffstat (limited to 'drivers/gpu/drm/drm_debugfs.c')
-rw-r--r-- | drivers/gpu/drm/drm_debugfs.c | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/drivers/gpu/drm/drm_debugfs.c b/drivers/gpu/drm/drm_debugfs.c index 9d2668a50872..1c7a1c0d3edd 100644 --- a/drivers/gpu/drm/drm_debugfs.c +++ b/drivers/gpu/drm/drm_debugfs.c | |||
@@ -33,6 +33,7 @@ | |||
33 | #include <linux/debugfs.h> | 33 | #include <linux/debugfs.h> |
34 | #include <linux/seq_file.h> | 34 | #include <linux/seq_file.h> |
35 | #include <linux/slab.h> | 35 | #include <linux/slab.h> |
36 | #include <linux/export.h> | ||
36 | #include "drmP.h" | 37 | #include "drmP.h" |
37 | 38 | ||
38 | #if defined(CONFIG_DEBUG_FS) | 39 | #if defined(CONFIG_DEBUG_FS) |
@@ -107,11 +108,8 @@ int drm_debugfs_create_files(struct drm_info_list *files, int count, | |||
107 | ent = debugfs_create_file(files[i].name, S_IFREG | S_IRUGO, | 108 | ent = debugfs_create_file(files[i].name, S_IFREG | S_IRUGO, |
108 | root, tmp, &drm_debugfs_fops); | 109 | root, tmp, &drm_debugfs_fops); |
109 | if (!ent) { | 110 | if (!ent) { |
110 | char name[64]; | ||
111 | strncpy(name, root->d_name.name, | ||
112 | min(root->d_name.len, 64U)); | ||
113 | DRM_ERROR("Cannot create /sys/kernel/debug/dri/%s/%s\n", | 111 | DRM_ERROR("Cannot create /sys/kernel/debug/dri/%s/%s\n", |
114 | name, files[i].name); | 112 | root->d_name.name, files[i].name); |
115 | kfree(tmp); | 113 | kfree(tmp); |
116 | ret = -1; | 114 | ret = -1; |
117 | goto fail; | 115 | goto fail; |
@@ -120,7 +118,10 @@ int drm_debugfs_create_files(struct drm_info_list *files, int count, | |||
120 | tmp->minor = minor; | 118 | tmp->minor = minor; |
121 | tmp->dent = ent; | 119 | tmp->dent = ent; |
122 | tmp->info_ent = &files[i]; | 120 | tmp->info_ent = &files[i]; |
123 | list_add(&(tmp->list), &(minor->debugfs_nodes.list)); | 121 | |
122 | mutex_lock(&minor->debugfs_lock); | ||
123 | list_add(&tmp->list, &minor->debugfs_list); | ||
124 | mutex_unlock(&minor->debugfs_lock); | ||
124 | } | 125 | } |
125 | return 0; | 126 | return 0; |
126 | 127 | ||
@@ -148,7 +149,8 @@ int drm_debugfs_init(struct drm_minor *minor, int minor_id, | |||
148 | char name[64]; | 149 | char name[64]; |
149 | int ret; | 150 | int ret; |
150 | 151 | ||
151 | INIT_LIST_HEAD(&minor->debugfs_nodes.list); | 152 | INIT_LIST_HEAD(&minor->debugfs_list); |
153 | mutex_init(&minor->debugfs_lock); | ||
152 | sprintf(name, "%d", minor_id); | 154 | sprintf(name, "%d", minor_id); |
153 | minor->debugfs_root = debugfs_create_dir(name, root); | 155 | minor->debugfs_root = debugfs_create_dir(name, root); |
154 | if (!minor->debugfs_root) { | 156 | if (!minor->debugfs_root) { |
@@ -194,8 +196,9 @@ int drm_debugfs_remove_files(struct drm_info_list *files, int count, | |||
194 | struct drm_info_node *tmp; | 196 | struct drm_info_node *tmp; |
195 | int i; | 197 | int i; |
196 | 198 | ||
199 | mutex_lock(&minor->debugfs_lock); | ||
197 | for (i = 0; i < count; i++) { | 200 | for (i = 0; i < count; i++) { |
198 | list_for_each_safe(pos, q, &minor->debugfs_nodes.list) { | 201 | list_for_each_safe(pos, q, &minor->debugfs_list) { |
199 | tmp = list_entry(pos, struct drm_info_node, list); | 202 | tmp = list_entry(pos, struct drm_info_node, list); |
200 | if (tmp->info_ent == &files[i]) { | 203 | if (tmp->info_ent == &files[i]) { |
201 | debugfs_remove(tmp->dent); | 204 | debugfs_remove(tmp->dent); |
@@ -204,6 +207,7 @@ int drm_debugfs_remove_files(struct drm_info_list *files, int count, | |||
204 | } | 207 | } |
205 | } | 208 | } |
206 | } | 209 | } |
210 | mutex_unlock(&minor->debugfs_lock); | ||
207 | return 0; | 211 | return 0; |
208 | } | 212 | } |
209 | EXPORT_SYMBOL(drm_debugfs_remove_files); | 213 | EXPORT_SYMBOL(drm_debugfs_remove_files); |