sync.h revision 64907b94dab947f3f3fc96fe1ab810cbc12ca902
1/* 2 * include/linux/sync.h 3 * 4 * Copyright (C) 2012 Google, Inc. 5 * 6 * This program is distributed in the hope that it will be useful, 7 * but WITHOUT ANY WARRANTY; without even the implied warranty of 8 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 9 * GNU General Public License for more details. 10 * 11 */ 12 13#ifndef _LINUX_SYNC_H 14#define _LINUX_SYNC_H 15 16#include <linux/types.h> 17#include <linux/kref.h> 18#include <linux/ktime.h> 19#include <linux/list.h> 20#include <linux/spinlock.h> 21#include <linux/wait.h> 22 23#include "uapi/sync.h" 24 25struct sync_timeline; 26struct sync_pt; 27struct sync_fence; 28 29/** 30 * struct sync_timeline_ops - sync object implementation ops 31 * @driver_name: name of the implementation 32 * @dup: duplicate a sync_pt 33 * @has_signaled: returns: 34 * 1 if pt has signaled 35 * 0 if pt has not signaled 36 * <0 on error 37 * @compare: returns: 38 * 1 if b will signal before a 39 * 0 if a and b will signal at the same time 40 * -1 if a will signal before b 41 * @free_pt: called before sync_pt is freed 42 * @release_obj: called before sync_timeline is freed 43 * @print_obj: deprecated 44 * @print_pt: deprecated 45 * @fill_driver_data: write implementation specific driver data to data. 46 * should return an error if there is not enough room 47 * as specified by size. This information is returned 48 * to userspace by SYNC_IOC_FENCE_INFO. 49 * @timeline_value_str: fill str with the value of the sync_timeline's counter 50 * @pt_value_str: fill str with the value of the sync_pt 51 */ 52struct sync_timeline_ops { 53 const char *driver_name; 54 55 /* required */ 56 struct sync_pt * (*dup)(struct sync_pt *pt); 57 58 /* required */ 59 int (*has_signaled)(struct sync_pt *pt); 60 61 /* required */ 62 int (*compare)(struct sync_pt *a, struct sync_pt *b); 63 64 /* optional */ 65 void (*free_pt)(struct sync_pt *sync_pt); 66 67 /* optional */ 68 void (*release_obj)(struct sync_timeline *sync_timeline); 69 70 /* deprecated */ 71 void (*print_obj)(struct seq_file *s, 72 struct sync_timeline *sync_timeline); 73 74 /* deprecated */ 75 void (*print_pt)(struct seq_file *s, struct sync_pt *sync_pt); 76 77 /* optional */ 78 int (*fill_driver_data)(struct sync_pt *syncpt, void *data, int size); 79 80 /* optional */ 81 void (*timeline_value_str)(struct sync_timeline *timeline, char *str, 82 int size); 83 84 /* optional */ 85 void (*pt_value_str)(struct sync_pt *pt, char *str, int size); 86}; 87 88/** 89 * struct sync_timeline - sync object 90 * @kref: reference count on fence. 91 * @ops: ops that define the implementation of the sync_timeline 92 * @name: name of the sync_timeline. Useful for debugging 93 * @destroyed: set when sync_timeline is destroyed 94 * @child_list_head: list of children sync_pts for this sync_timeline 95 * @child_list_lock: lock protecting @child_list_head, destroyed, and 96 * sync_pt.status 97 * @active_list_head: list of active (unsignaled/errored) sync_pts 98 * @sync_timeline_list: membership in global sync_timeline_list 99 */ 100struct sync_timeline { 101 struct kref kref; 102 const struct sync_timeline_ops *ops; 103 char name[32]; 104 105 /* protected by child_list_lock */ 106 bool destroyed; 107 108 struct list_head child_list_head; 109 spinlock_t child_list_lock; 110 111 struct list_head active_list_head; 112 spinlock_t active_list_lock; 113 114 struct list_head sync_timeline_list; 115}; 116 117/** 118 * struct sync_pt - sync point 119 * @parent: sync_timeline to which this sync_pt belongs 120 * @child_list: membership in sync_timeline.child_list_head 121 * @active_list: membership in sync_timeline.active_list_head 122 * @signaled_list: membership in temporary signaled_list on stack 123 * @fence: sync_fence to which the sync_pt belongs 124 * @pt_list: membership in sync_fence.pt_list_head 125 * @status: 1: signaled, 0:active, <0: error 126 * @timestamp: time which sync_pt status transitioned from active to 127 * signaled or error. 128 */ 129struct sync_pt { 130 struct sync_timeline *parent; 131 struct list_head child_list; 132 133 struct list_head active_list; 134 struct list_head signaled_list; 135 136 struct sync_fence *fence; 137 struct list_head pt_list; 138 139 /* protected by parent->active_list_lock */ 140 int status; 141 142 ktime_t timestamp; 143}; 144 145/** 146 * struct sync_fence - sync fence 147 * @file: file representing this fence 148 * @kref: reference count on fence. 149 * @name: name of sync_fence. Useful for debugging 150 * @pt_list_head: list of sync_pts in the fence. immutable once fence 151 * is created 152 * @waiter_list_head: list of asynchronous waiters on this fence 153 * @waiter_list_lock: lock protecting @waiter_list_head and @status 154 * @status: 1: signaled, 0:active, <0: error 155 * 156 * @wq: wait queue for fence signaling 157 * @sync_fence_list: membership in global fence list 158 */ 159struct sync_fence { 160 struct file *file; 161 struct kref kref; 162 char name[32]; 163 164 /* this list is immutable once the fence is created */ 165 struct list_head pt_list_head; 166 167 struct list_head waiter_list_head; 168 spinlock_t waiter_list_lock; /* also protects status */ 169 int status; 170 171 wait_queue_head_t wq; 172 173 struct list_head sync_fence_list; 174}; 175 176struct sync_fence_waiter; 177typedef void (*sync_callback_t)(struct sync_fence *fence, 178 struct sync_fence_waiter *waiter); 179 180/** 181 * struct sync_fence_waiter - metadata for asynchronous waiter on a fence 182 * @waiter_list: membership in sync_fence.waiter_list_head 183 * @callback: function pointer to call when fence signals 184 * @callback_data: pointer to pass to @callback 185 */ 186struct sync_fence_waiter { 187 struct list_head waiter_list; 188 189 sync_callback_t callback; 190}; 191 192static inline void sync_fence_waiter_init(struct sync_fence_waiter *waiter, 193 sync_callback_t callback) 194{ 195 waiter->callback = callback; 196} 197 198/* 199 * API for sync_timeline implementers 200 */ 201 202/** 203 * sync_timeline_create() - creates a sync object 204 * @ops: specifies the implementation ops for the object 205 * @size: size to allocate for this obj 206 * @name: sync_timeline name 207 * 208 * Creates a new sync_timeline which will use the implementation specified by 209 * @ops. @size bytes will be allocated allowing for implementation specific 210 * data to be kept after the generic sync_timeline struct. 211 */ 212struct sync_timeline *sync_timeline_create(const struct sync_timeline_ops *ops, 213 int size, const char *name); 214 215/** 216 * sync_timeline_destroy() - destroys a sync object 217 * @obj: sync_timeline to destroy 218 * 219 * A sync implementation should call this when the @obj is going away 220 * (i.e. module unload.) @obj won't actually be freed until all its children 221 * sync_pts are freed. 222 */ 223void sync_timeline_destroy(struct sync_timeline *obj); 224 225/** 226 * sync_timeline_signal() - signal a status change on a sync_timeline 227 * @obj: sync_timeline to signal 228 * 229 * A sync implementation should call this any time one of it's sync_pts 230 * has signaled or has an error condition. 231 */ 232void sync_timeline_signal(struct sync_timeline *obj); 233 234/** 235 * sync_pt_create() - creates a sync pt 236 * @parent: sync_pt's parent sync_timeline 237 * @size: size to allocate for this pt 238 * 239 * Creates a new sync_pt as a child of @parent. @size bytes will be 240 * allocated allowing for implementation specific data to be kept after 241 * the generic sync_timeline struct. 242 */ 243struct sync_pt *sync_pt_create(struct sync_timeline *parent, int size); 244 245/** 246 * sync_pt_free() - frees a sync pt 247 * @pt: sync_pt to free 248 * 249 * This should only be called on sync_pts which have been created but 250 * not added to a fence. 251 */ 252void sync_pt_free(struct sync_pt *pt); 253 254/** 255 * sync_fence_create() - creates a sync fence 256 * @name: name of fence to create 257 * @pt: sync_pt to add to the fence 258 * 259 * Creates a fence containg @pt. Once this is called, the fence takes 260 * ownership of @pt. 261 */ 262struct sync_fence *sync_fence_create(const char *name, struct sync_pt *pt); 263 264/* 265 * API for sync_fence consumers 266 */ 267 268/** 269 * sync_fence_merge() - merge two fences 270 * @name: name of new fence 271 * @a: fence a 272 * @b: fence b 273 * 274 * Creates a new fence which contains copies of all the sync_pts in both 275 * @a and @b. @a and @b remain valid, independent fences. 276 */ 277struct sync_fence *sync_fence_merge(const char *name, 278 struct sync_fence *a, struct sync_fence *b); 279 280/** 281 * sync_fence_fdget() - get a fence from an fd 282 * @fd: fd referencing a fence 283 * 284 * Ensures @fd references a valid fence, increments the refcount of the backing 285 * file, and returns the fence. 286 */ 287struct sync_fence *sync_fence_fdget(int fd); 288 289/** 290 * sync_fence_put() - puts a reference of a sync fence 291 * @fence: fence to put 292 * 293 * Puts a reference on @fence. If this is the last reference, the fence and 294 * all it's sync_pts will be freed 295 */ 296void sync_fence_put(struct sync_fence *fence); 297 298/** 299 * sync_fence_install() - installs a fence into a file descriptor 300 * @fence: fence to install 301 * @fd: file descriptor in which to install the fence 302 * 303 * Installs @fence into @fd. @fd's should be acquired through get_unused_fd(). 304 */ 305void sync_fence_install(struct sync_fence *fence, int fd); 306 307/** 308 * sync_fence_wait_async() - registers and async wait on the fence 309 * @fence: fence to wait on 310 * @waiter: waiter callback struck 311 * 312 * Returns 1 if @fence has already signaled. 313 * 314 * Registers a callback to be called when @fence signals or has an error. 315 * @waiter should be initialized with sync_fence_waiter_init(). 316 */ 317int sync_fence_wait_async(struct sync_fence *fence, 318 struct sync_fence_waiter *waiter); 319 320/** 321 * sync_fence_cancel_async() - cancels an async wait 322 * @fence: fence to wait on 323 * @waiter: waiter callback struck 324 * 325 * returns 0 if waiter was removed from fence's async waiter list. 326 * returns -ENOENT if waiter was not found on fence's async waiter list. 327 * 328 * Cancels a previously registered async wait. Will fail gracefully if 329 * @waiter was never registered or if @fence has already signaled @waiter. 330 */ 331int sync_fence_cancel_async(struct sync_fence *fence, 332 struct sync_fence_waiter *waiter); 333 334/** 335 * sync_fence_wait() - wait on fence 336 * @fence: fence to wait on 337 * @tiemout: timeout in ms 338 * 339 * Wait for @fence to be signaled or have an error. Waits indefinitely 340 * if @timeout < 0 341 */ 342int sync_fence_wait(struct sync_fence *fence, long timeout); 343 344#endif /* _LINUX_SYNC_H */ 345