diff options
Diffstat (limited to 'include/linux')
| -rw-r--r-- | include/linux/dma-buf.h | 13 | ||||
| -rw-r--r-- | include/linux/fence.h | 2 | ||||
| -rw-r--r-- | include/linux/reservation.h | 53 |
3 files changed, 65 insertions, 3 deletions
diff --git a/include/linux/dma-buf.h b/include/linux/dma-buf.h index 3fe90d494edb..4551c6f2a6c4 100644 --- a/include/linux/dma-buf.h +++ b/include/linux/dma-buf.h | |||
| @@ -112,19 +112,24 @@ struct dma_buf_ops { | |||
| 112 | * @file: file pointer used for sharing buffers across, and for refcounting. | 112 | * @file: file pointer used for sharing buffers across, and for refcounting. |
| 113 | * @attachments: list of dma_buf_attachment that denotes all devices attached. | 113 | * @attachments: list of dma_buf_attachment that denotes all devices attached. |
| 114 | * @ops: dma_buf_ops associated with this buffer object. | 114 | * @ops: dma_buf_ops associated with this buffer object. |
| 115 | * @lock: used internally to serialize list manipulation, attach/detach and vmap/unmap | ||
| 116 | * @vmapping_counter: used internally to refcnt the vmaps | ||
| 117 | * @vmap_ptr: the current vmap ptr if vmapping_counter > 0 | ||
| 115 | * @exp_name: name of the exporter; useful for debugging. | 118 | * @exp_name: name of the exporter; useful for debugging. |
| 116 | * @owner: pointer to exporter module; used for refcounting when exporter is a | 119 | * @owner: pointer to exporter module; used for refcounting when exporter is a |
| 117 | * kernel module. | 120 | * kernel module. |
| 118 | * @list_node: node for dma_buf accounting and debugging. | 121 | * @list_node: node for dma_buf accounting and debugging. |
| 119 | * @priv: exporter specific private data for this buffer object. | 122 | * @priv: exporter specific private data for this buffer object. |
| 120 | * @resv: reservation object linked to this dma-buf | 123 | * @resv: reservation object linked to this dma-buf |
| 124 | * @poll: for userspace poll support | ||
| 125 | * @cb_excl: for userspace poll support | ||
| 126 | * @cb_shared: for userspace poll support | ||
| 121 | */ | 127 | */ |
| 122 | struct dma_buf { | 128 | struct dma_buf { |
| 123 | size_t size; | 129 | size_t size; |
| 124 | struct file *file; | 130 | struct file *file; |
| 125 | struct list_head attachments; | 131 | struct list_head attachments; |
| 126 | const struct dma_buf_ops *ops; | 132 | const struct dma_buf_ops *ops; |
| 127 | /* mutex to serialize list manipulation, attach/detach and vmap/unmap */ | ||
| 128 | struct mutex lock; | 133 | struct mutex lock; |
| 129 | unsigned vmapping_counter; | 134 | unsigned vmapping_counter; |
| 130 | void *vmap_ptr; | 135 | void *vmap_ptr; |
| @@ -188,9 +193,11 @@ struct dma_buf_export_info { | |||
| 188 | 193 | ||
| 189 | /** | 194 | /** |
| 190 | * helper macro for exporters; zeros and fills in most common values | 195 | * helper macro for exporters; zeros and fills in most common values |
| 196 | * | ||
| 197 | * @name: export-info name | ||
| 191 | */ | 198 | */ |
| 192 | #define DEFINE_DMA_BUF_EXPORT_INFO(a) \ | 199 | #define DEFINE_DMA_BUF_EXPORT_INFO(name) \ |
| 193 | struct dma_buf_export_info a = { .exp_name = KBUILD_MODNAME, \ | 200 | struct dma_buf_export_info name = { .exp_name = KBUILD_MODNAME, \ |
| 194 | .owner = THIS_MODULE } | 201 | .owner = THIS_MODULE } |
| 195 | 202 | ||
| 196 | /** | 203 | /** |
diff --git a/include/linux/fence.h b/include/linux/fence.h index 2b17698b60b8..2056e9fd0138 100644 --- a/include/linux/fence.h +++ b/include/linux/fence.h | |||
| @@ -49,6 +49,8 @@ struct fence_cb; | |||
| 49 | * @timestamp: Timestamp when the fence was signaled. | 49 | * @timestamp: Timestamp when the fence was signaled. |
| 50 | * @status: Optional, only valid if < 0, must be set before calling | 50 | * @status: Optional, only valid if < 0, must be set before calling |
| 51 | * fence_signal, indicates that the fence has completed with an error. | 51 | * fence_signal, indicates that the fence has completed with an error. |
| 52 | * @child_list: list of children fences | ||
| 53 | * @active_list: list of active fences | ||
| 52 | * | 54 | * |
| 53 | * the flags member must be manipulated and read using the appropriate | 55 | * the flags member must be manipulated and read using the appropriate |
| 54 | * atomic ops (bit_*), so taking the spinlock will not be needed most | 56 | * atomic ops (bit_*), so taking the spinlock will not be needed most |
diff --git a/include/linux/reservation.h b/include/linux/reservation.h index 49d057655d62..b0f305e77b7f 100644 --- a/include/linux/reservation.h +++ b/include/linux/reservation.h | |||
| @@ -49,12 +49,27 @@ extern struct ww_class reservation_ww_class; | |||
| 49 | extern struct lock_class_key reservation_seqcount_class; | 49 | extern struct lock_class_key reservation_seqcount_class; |
| 50 | extern const char reservation_seqcount_string[]; | 50 | extern const char reservation_seqcount_string[]; |
| 51 | 51 | ||
| 52 | /** | ||
| 53 | * struct reservation_object_list - a list of shared fences | ||
| 54 | * @rcu: for internal use | ||
| 55 | * @shared_count: table of shared fences | ||
| 56 | * @shared_max: for growing shared fence table | ||
| 57 | * @shared: shared fence table | ||
| 58 | */ | ||
| 52 | struct reservation_object_list { | 59 | struct reservation_object_list { |
| 53 | struct rcu_head rcu; | 60 | struct rcu_head rcu; |
| 54 | u32 shared_count, shared_max; | 61 | u32 shared_count, shared_max; |
| 55 | struct fence __rcu *shared[]; | 62 | struct fence __rcu *shared[]; |
| 56 | }; | 63 | }; |
| 57 | 64 | ||
| 65 | /** | ||
| 66 | * struct reservation_object - a reservation object manages fences for a buffer | ||
| 67 | * @lock: update side lock | ||
| 68 | * @seq: sequence count for managing RCU read-side synchronization | ||
| 69 | * @fence_excl: the exclusive fence, if there is one currently | ||
| 70 | * @fence: list of current shared fences | ||
| 71 | * @staged: staged copy of shared fences for RCU updates | ||
| 72 | */ | ||
| 58 | struct reservation_object { | 73 | struct reservation_object { |
| 59 | struct ww_mutex lock; | 74 | struct ww_mutex lock; |
| 60 | seqcount_t seq; | 75 | seqcount_t seq; |
| @@ -68,6 +83,10 @@ struct reservation_object { | |||
| 68 | #define reservation_object_assert_held(obj) \ | 83 | #define reservation_object_assert_held(obj) \ |
| 69 | lockdep_assert_held(&(obj)->lock.base) | 84 | lockdep_assert_held(&(obj)->lock.base) |
| 70 | 85 | ||
| 86 | /** | ||
| 87 | * reservation_object_init - initialize a reservation object | ||
| 88 | * @obj: the reservation object | ||
| 89 | */ | ||
| 71 | static inline void | 90 | static inline void |
| 72 | reservation_object_init(struct reservation_object *obj) | 91 | reservation_object_init(struct reservation_object *obj) |
| 73 | { | 92 | { |
| @@ -79,6 +98,10 @@ reservation_object_init(struct reservation_object *obj) | |||
| 79 | obj->staged = NULL; | 98 | obj->staged = NULL; |
| 80 | } | 99 | } |
| 81 | 100 | ||
| 101 | /** | ||
| 102 | * reservation_object_fini - destroys a reservation object | ||
| 103 | * @obj: the reservation object | ||
| 104 | */ | ||
| 82 | static inline void | 105 | static inline void |
| 83 | reservation_object_fini(struct reservation_object *obj) | 106 | reservation_object_fini(struct reservation_object *obj) |
| 84 | { | 107 | { |
| @@ -106,6 +129,14 @@ reservation_object_fini(struct reservation_object *obj) | |||
| 106 | ww_mutex_destroy(&obj->lock); | 129 | ww_mutex_destroy(&obj->lock); |
| 107 | } | 130 | } |
| 108 | 131 | ||
| 132 | /** | ||
| 133 | * reservation_object_get_list - get the reservation object's | ||
| 134 | * shared fence list, with update-side lock held | ||
| 135 | * @obj: the reservation object | ||
| 136 | * | ||
| 137 | * Returns the shared fence list. Does NOT take references to | ||
| 138 | * the fence. The obj->lock must be held. | ||
| 139 | */ | ||
| 109 | static inline struct reservation_object_list * | 140 | static inline struct reservation_object_list * |
| 110 | reservation_object_get_list(struct reservation_object *obj) | 141 | reservation_object_get_list(struct reservation_object *obj) |
| 111 | { | 142 | { |
| @@ -113,6 +144,17 @@ reservation_object_get_list(struct reservation_object *obj) | |||
| 113 | reservation_object_held(obj)); | 144 | reservation_object_held(obj)); |
| 114 | } | 145 | } |
| 115 | 146 | ||
| 147 | /** | ||
| 148 | * reservation_object_get_excl - get the reservation object's | ||
| 149 | * exclusive fence, with update-side lock held | ||
| 150 | * @obj: the reservation object | ||
| 151 | * | ||
| 152 | * Returns the exclusive fence (if any). Does NOT take a | ||
| 153 | * reference. The obj->lock must be held. | ||
| 154 | * | ||
| 155 | * RETURNS | ||
| 156 | * The exclusive fence or NULL | ||
| 157 | */ | ||
| 116 | static inline struct fence * | 158 | static inline struct fence * |
| 117 | reservation_object_get_excl(struct reservation_object *obj) | 159 | reservation_object_get_excl(struct reservation_object *obj) |
| 118 | { | 160 | { |
| @@ -120,6 +162,17 @@ reservation_object_get_excl(struct reservation_object *obj) | |||
| 120 | reservation_object_held(obj)); | 162 | reservation_object_held(obj)); |
| 121 | } | 163 | } |
| 122 | 164 | ||
| 165 | /** | ||
| 166 | * reservation_object_get_excl_rcu - get the reservation object's | ||
| 167 | * exclusive fence, without lock held. | ||
| 168 | * @obj: the reservation object | ||
| 169 | * | ||
| 170 | * If there is an exclusive fence, this atomically increments it's | ||
| 171 | * reference count and returns it. | ||
| 172 | * | ||
| 173 | * RETURNS | ||
| 174 | * The exclusive fence or NULL if none | ||
| 175 | */ | ||
| 123 | static inline struct fence * | 176 | static inline struct fence * |
| 124 | reservation_object_get_excl_rcu(struct reservation_object *obj) | 177 | reservation_object_get_excl_rcu(struct reservation_object *obj) |
| 125 | { | 178 | { |
