blob: 9615dc0385b5830e1afcea441b658a6dfc26dc11 [file] [log] [blame]
Erik Gilling7ad530b2013-02-28 16:42:57 -08001/*
Gustavo Padovane912c882016-08-11 12:26:42 -03002 * Sync File validation framework and debug infomation
Erik Gilling7ad530b2013-02-28 16:42:57 -08003 *
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
Erik Gilling7ad530b2013-02-28 16:42:57 -080016#include <linux/list.h>
Chris Wilsondb767402017-06-29 22:12:53 +010017#include <linux/rbtree.h>
Erik Gilling7ad530b2013-02-28 16:42:57 -080018#include <linux/spinlock.h>
Maarten Lankhorst0f0d8402014-07-01 12:57:31 +020019#include <linux/fence.h>
Erik Gilling7ad530b2013-02-28 16:42:57 -080020
Gustavo Padovan460bfc42016-04-28 10:46:57 -030021#include <linux/sync_file.h>
22#include <uapi/linux/sync_file.h>
Colin Cross64907b92014-02-17 13:58:32 -080023
Erik Gilling7ad530b2013-02-28 16:42:57 -080024/**
25 * struct sync_timeline - sync object
Erik Gillingc5b86b72013-02-28 16:43:11 -080026 * @kref: reference count on fence.
Erik Gilling7ad530b2013-02-28 16:42:57 -080027 * @name: name of the sync_timeline. Useful for debugging
Chris Wilsone82ecb22017-06-29 22:05:32 +010028 * @lock: lock protecting @pt_list and @value
Chris Wilsondb767402017-06-29 22:12:53 +010029 * @pt_tree: rbtree of active (unsignaled/errored) sync_pts
Chris Wilsone82ecb22017-06-29 22:05:32 +010030 * @pt_list: list of active (unsignaled/errored) sync_pts
Erik Gillingaf7582f2013-02-28 16:43:00 -080031 * @sync_timeline_list: membership in global sync_timeline_list
Erik Gilling7ad530b2013-02-28 16:42:57 -080032 */
33struct sync_timeline {
Erik Gillingc5b86b72013-02-28 16:43:11 -080034 struct kref kref;
Erik Gilling7ad530b2013-02-28 16:42:57 -080035 char name[32];
36
Chris Wilsone82ecb22017-06-29 22:05:32 +010037 /* protected by lock */
Linus Torvalds731c7d32016-08-01 21:44:08 -040038 u64 context;
39 int value;
Erik Gilling7ad530b2013-02-28 16:42:57 -080040
Chris Wilsondb767402017-06-29 22:12:53 +010041 struct rb_root pt_tree;
Chris Wilsone82ecb22017-06-29 22:05:32 +010042 struct list_head pt_list;
43 spinlock_t lock;
Erik Gillingaf7582f2013-02-28 16:43:00 -080044
45 struct list_head sync_timeline_list;
Erik Gilling7ad530b2013-02-28 16:42:57 -080046};
47
Gustavo Padovanb55b54b2016-01-21 10:49:21 -020048static inline struct sync_timeline *fence_parent(struct fence *fence)
Maarten Lankhorst0f0d8402014-07-01 12:57:31 +020049{
Chris Wilsone82ecb22017-06-29 22:05:32 +010050 return container_of(fence->lock, struct sync_timeline, lock);
Maarten Lankhorst0f0d8402014-07-01 12:57:31 +020051}
Erik Gilling7ad530b2013-02-28 16:42:57 -080052
Gustavo Padovan0431b902016-05-31 16:59:04 -030053/**
54 * struct sync_pt - sync_pt object
55 * @base: base fence object
Chris Wilsone82ecb22017-06-29 22:05:32 +010056 * @link: link on the sync timeline's list
Chris Wilsondb767402017-06-29 22:12:53 +010057 * @node: node in the sync timeline's tree
Gustavo Padovan0431b902016-05-31 16:59:04 -030058 */
59struct sync_pt {
60 struct fence base;
Chris Wilsone82ecb22017-06-29 22:05:32 +010061 struct list_head link;
Chris Wilsondb767402017-06-29 22:12:53 +010062 struct rb_node node;
Gustavo Padovan0431b902016-05-31 16:59:04 -030063};
64
Gustavo Padovanb1f65602016-05-31 16:59:13 -030065#ifdef CONFIG_SW_SYNC
Maarten Lankhorst0f0d8402014-07-01 12:57:31 +020066
Gustavo Padovan1867a232016-05-31 16:59:05 -030067extern const struct file_operations sw_sync_debugfs_fops;
68
Joe Perchesd30649a2015-08-10 14:51:16 -070069void sync_timeline_debug_add(struct sync_timeline *obj);
70void sync_timeline_debug_remove(struct sync_timeline *obj);
Gustavo Padovand7fdb0a2016-01-21 10:49:19 -020071void sync_file_debug_add(struct sync_file *fence);
72void sync_file_debug_remove(struct sync_file *fence);
Joe Perchesd30649a2015-08-10 14:51:16 -070073void sync_dump(void);
Maarten Lankhorst0f0d8402014-07-01 12:57:31 +020074
75#else
76# define sync_timeline_debug_add(obj)
77# define sync_timeline_debug_remove(obj)
Gustavo Padovand7fdb0a2016-01-21 10:49:19 -020078# define sync_file_debug_add(fence)
79# define sync_file_debug_remove(fence)
Maarten Lankhorst0f0d8402014-07-01 12:57:31 +020080# define sync_dump()
81#endif
Maarten Lankhorst0f0d8402014-07-01 12:57:31 +020082
Erik Gilling7ad530b2013-02-28 16:42:57 -080083#endif /* _LINUX_SYNC_H */