summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/dma-buf/sync_debug.c4
-rw-r--r--drivers/dma-buf/sync_file.c39
-rw-r--r--include/linux/sync_file.h11
3 files changed, 44 insertions, 10 deletions
diff --git a/drivers/dma-buf/sync_debug.c b/drivers/dma-buf/sync_debug.c
index a0d780ab68c3..82a6e7f6d37f 100644
--- a/drivers/dma-buf/sync_debug.c
+++ b/drivers/dma-buf/sync_debug.c
@@ -132,9 +132,11 @@ static void sync_print_obj(struct seq_file *s, struct sync_timeline *obj)
132static void sync_print_sync_file(struct seq_file *s, 132static void sync_print_sync_file(struct seq_file *s,
133 struct sync_file *sync_file) 133 struct sync_file *sync_file)
134{ 134{
135 char buf[128];
135 int i; 136 int i;
136 137
137 seq_printf(s, "[%p] %s: %s\n", sync_file, sync_file->name, 138 seq_printf(s, "[%p] %s: %s\n", sync_file,
139 sync_file_get_name(sync_file, buf, sizeof(buf)),
138 sync_status_str(dma_fence_get_status(sync_file->fence))); 140 sync_status_str(dma_fence_get_status(sync_file->fence)));
139 141
140 if (dma_fence_is_array(sync_file->fence)) { 142 if (dma_fence_is_array(sync_file->fence)) {
diff --git a/drivers/dma-buf/sync_file.c b/drivers/dma-buf/sync_file.c
index dc89b1d484e8..545e2c5c4815 100644
--- a/drivers/dma-buf/sync_file.c
+++ b/drivers/dma-buf/sync_file.c
@@ -80,11 +80,6 @@ struct sync_file *sync_file_create(struct dma_fence *fence)
80 80
81 sync_file->fence = dma_fence_get(fence); 81 sync_file->fence = dma_fence_get(fence);
82 82
83 snprintf(sync_file->name, sizeof(sync_file->name), "%s-%s%llu-%d",
84 fence->ops->get_driver_name(fence),
85 fence->ops->get_timeline_name(fence), fence->context,
86 fence->seqno);
87
88 return sync_file; 83 return sync_file;
89} 84}
90EXPORT_SYMBOL(sync_file_create); 85EXPORT_SYMBOL(sync_file_create);
@@ -129,6 +124,36 @@ struct dma_fence *sync_file_get_fence(int fd)
129} 124}
130EXPORT_SYMBOL(sync_file_get_fence); 125EXPORT_SYMBOL(sync_file_get_fence);
131 126
127/**
128 * sync_file_get_name - get the name of the sync_file
129 * @sync_file: sync_file to get the fence from
130 * @buf: destination buffer to copy sync_file name into
131 * @len: available size of destination buffer.
132 *
133 * Each sync_file may have a name assigned either by the user (when merging
134 * sync_files together) or created from the fence it contains. In the latter
135 * case construction of the name is deferred until use, and so requires
136 * sync_file_get_name().
137 *
138 * Returns: a string representing the name.
139 */
140char *sync_file_get_name(struct sync_file *sync_file, char *buf, int len)
141{
142 if (sync_file->user_name[0]) {
143 strlcpy(buf, sync_file->user_name, len);
144 } else {
145 struct dma_fence *fence = sync_file->fence;
146
147 snprintf(buf, len, "%s-%s%llu-%d",
148 fence->ops->get_driver_name(fence),
149 fence->ops->get_timeline_name(fence),
150 fence->context,
151 fence->seqno);
152 }
153
154 return buf;
155}
156
132static int sync_file_set_fence(struct sync_file *sync_file, 157static int sync_file_set_fence(struct sync_file *sync_file,
133 struct dma_fence **fences, int num_fences) 158 struct dma_fence **fences, int num_fences)
134{ 159{
@@ -266,7 +291,7 @@ static struct sync_file *sync_file_merge(const char *name, struct sync_file *a,
266 goto err; 291 goto err;
267 } 292 }
268 293
269 strlcpy(sync_file->name, name, sizeof(sync_file->name)); 294 strlcpy(sync_file->user_name, name, sizeof(sync_file->user_name));
270 return sync_file; 295 return sync_file;
271 296
272err: 297err:
@@ -413,7 +438,7 @@ static long sync_file_ioctl_fence_info(struct sync_file *sync_file,
413 } 438 }
414 439
415no_fences: 440no_fences:
416 strlcpy(info.name, sync_file->name, sizeof(info.name)); 441 sync_file_get_name(sync_file, info.name, sizeof(info.name));
417 info.status = dma_fence_is_signaled(sync_file->fence); 442 info.status = dma_fence_is_signaled(sync_file->fence);
418 info.num_fences = num_fences; 443 info.num_fences = num_fences;
419 444
diff --git a/include/linux/sync_file.h b/include/linux/sync_file.h
index d37beefdfbd5..5726107963b2 100644
--- a/include/linux/sync_file.h
+++ b/include/linux/sync_file.h
@@ -23,7 +23,6 @@
23/** 23/**
24 * struct sync_file - sync file to export to the userspace 24 * struct sync_file - sync file to export to the userspace
25 * @file: file representing this fence 25 * @file: file representing this fence
26 * @name: name of sync_file. Useful for debugging
27 * @sync_file_list: membership in global file list 26 * @sync_file_list: membership in global file list
28 * @wq: wait queue for fence signaling 27 * @wq: wait queue for fence signaling
29 * @fence: fence with the fences in the sync_file 28 * @fence: fence with the fences in the sync_file
@@ -31,7 +30,14 @@
31 */ 30 */
32struct sync_file { 31struct sync_file {
33 struct file *file; 32 struct file *file;
34 char name[32]; 33 /**
34 * @user_name:
35 *
36 * Name of the sync file provided by userspace, for merged fences.
37 * Otherwise generated through driver callbacks (in which case the
38 * entire array is 0).
39 */
40 char user_name[32];
35#ifdef CONFIG_DEBUG_FS 41#ifdef CONFIG_DEBUG_FS
36 struct list_head sync_file_list; 42 struct list_head sync_file_list;
37#endif 43#endif
@@ -46,5 +52,6 @@ struct sync_file {
46 52
47struct sync_file *sync_file_create(struct dma_fence *fence); 53struct sync_file *sync_file_create(struct dma_fence *fence);
48struct dma_fence *sync_file_get_fence(int fd); 54struct dma_fence *sync_file_get_fence(int fd);
55char *sync_file_get_name(struct sync_file *sync_file, char *buf, int len);
49 56
50#endif /* _LINUX_SYNC_H */ 57#endif /* _LINUX_SYNC_H */