| .. | .. | 
|---|
| 12 | 12 | #include <linux/stddef.h> | 
|---|
| 13 | 13 | #include <linux/types.h> | 
|---|
| 14 | 14 | #include <linux/uidgid.h> | 
|---|
|  | 15 | +#include <uapi/linux/android/binderfs.h> | 
|---|
|  | 16 | +#include "binder_alloc.h" | 
|---|
| 15 | 17 |  | 
|---|
| 16 | 18 | struct binder_context { | 
|---|
| 17 | 19 | struct binder_node *binder_context_mgr_node; | 
|---|
| .. | .. | 
|---|
| 105 | 107 | } | 
|---|
| 106 | 108 | #endif | 
|---|
| 107 | 109 |  | 
|---|
| 108 |  | -int binder_stats_show(struct seq_file *m, void *unused); | 
|---|
| 109 |  | -DEFINE_SHOW_ATTRIBUTE(binder_stats); | 
|---|
|  | 110 | +struct binder_debugfs_entry { | 
|---|
|  | 111 | +	const char *name; | 
|---|
|  | 112 | +	umode_t mode; | 
|---|
|  | 113 | +	const struct file_operations *fops; | 
|---|
|  | 114 | +	void *data; | 
|---|
|  | 115 | +}; | 
|---|
| 110 | 116 |  | 
|---|
| 111 |  | -int binder_state_show(struct seq_file *m, void *unused); | 
|---|
| 112 |  | -DEFINE_SHOW_ATTRIBUTE(binder_state); | 
|---|
|  | 117 | +extern const struct binder_debugfs_entry binder_debugfs_entries[]; | 
|---|
| 113 | 118 |  | 
|---|
| 114 |  | -int binder_transactions_show(struct seq_file *m, void *unused); | 
|---|
| 115 |  | -DEFINE_SHOW_ATTRIBUTE(binder_transactions); | 
|---|
|  | 119 | +#define binder_for_each_debugfs_entry(entry)	\ | 
|---|
|  | 120 | +	for ((entry) = binder_debugfs_entries;	\ | 
|---|
|  | 121 | +	     (entry)->name;			\ | 
|---|
|  | 122 | +	     (entry)++) | 
|---|
| 116 | 123 |  | 
|---|
| 117 |  | -int binder_transaction_log_show(struct seq_file *m, void *unused); | 
|---|
| 118 |  | -DEFINE_SHOW_ATTRIBUTE(binder_transaction_log); | 
|---|
|  | 124 | +enum binder_stat_types { | 
|---|
|  | 125 | +	BINDER_STAT_PROC, | 
|---|
|  | 126 | +	BINDER_STAT_THREAD, | 
|---|
|  | 127 | +	BINDER_STAT_NODE, | 
|---|
|  | 128 | +	BINDER_STAT_REF, | 
|---|
|  | 129 | +	BINDER_STAT_DEATH, | 
|---|
|  | 130 | +	BINDER_STAT_TRANSACTION, | 
|---|
|  | 131 | +	BINDER_STAT_TRANSACTION_COMPLETE, | 
|---|
|  | 132 | +	BINDER_STAT_COUNT | 
|---|
|  | 133 | +}; | 
|---|
| 119 | 134 |  | 
|---|
| 120 |  | -struct binder_transaction_log_entry { | 
|---|
|  | 135 | +struct binder_stats { | 
|---|
|  | 136 | +	atomic_t br[_IOC_NR(BR_ONEWAY_SPAM_SUSPECT) + 1]; | 
|---|
|  | 137 | +	atomic_t bc[_IOC_NR(BC_REPLY_SG) + 1]; | 
|---|
|  | 138 | +	atomic_t obj_created[BINDER_STAT_COUNT]; | 
|---|
|  | 139 | +	atomic_t obj_deleted[BINDER_STAT_COUNT]; | 
|---|
|  | 140 | +}; | 
|---|
|  | 141 | + | 
|---|
|  | 142 | +/** | 
|---|
|  | 143 | + * struct binder_work - work enqueued on a worklist | 
|---|
|  | 144 | + * @entry:             node enqueued on list | 
|---|
|  | 145 | + * @type:              type of work to be performed | 
|---|
|  | 146 | + * | 
|---|
|  | 147 | + * There are separate work lists for proc, thread, and node (async). | 
|---|
|  | 148 | + */ | 
|---|
|  | 149 | +struct binder_work { | 
|---|
|  | 150 | +	struct list_head entry; | 
|---|
|  | 151 | + | 
|---|
|  | 152 | +	enum binder_work_type { | 
|---|
|  | 153 | +		BINDER_WORK_TRANSACTION = 1, | 
|---|
|  | 154 | +		BINDER_WORK_TRANSACTION_COMPLETE, | 
|---|
|  | 155 | +		BINDER_WORK_TRANSACTION_ONEWAY_SPAM_SUSPECT, | 
|---|
|  | 156 | +		BINDER_WORK_RETURN_ERROR, | 
|---|
|  | 157 | +		BINDER_WORK_NODE, | 
|---|
|  | 158 | +		BINDER_WORK_DEAD_BINDER, | 
|---|
|  | 159 | +		BINDER_WORK_DEAD_BINDER_AND_CLEAR, | 
|---|
|  | 160 | +		BINDER_WORK_CLEAR_DEATH_NOTIFICATION, | 
|---|
|  | 161 | +	} type; | 
|---|
|  | 162 | +}; | 
|---|
|  | 163 | + | 
|---|
|  | 164 | +struct binder_error { | 
|---|
|  | 165 | +	struct binder_work work; | 
|---|
|  | 166 | +	uint32_t cmd; | 
|---|
|  | 167 | +}; | 
|---|
|  | 168 | + | 
|---|
|  | 169 | +/** | 
|---|
|  | 170 | + * struct binder_node - binder node bookkeeping | 
|---|
|  | 171 | + * @debug_id:             unique ID for debugging | 
|---|
|  | 172 | + *                        (invariant after initialized) | 
|---|
|  | 173 | + * @lock:                 lock for node fields | 
|---|
|  | 174 | + * @work:                 worklist element for node work | 
|---|
|  | 175 | + *                        (protected by @proc->inner_lock) | 
|---|
|  | 176 | + * @rb_node:              element for proc->nodes tree | 
|---|
|  | 177 | + *                        (protected by @proc->inner_lock) | 
|---|
|  | 178 | + * @dead_node:            element for binder_dead_nodes list | 
|---|
|  | 179 | + *                        (protected by binder_dead_nodes_lock) | 
|---|
|  | 180 | + * @proc:                 binder_proc that owns this node | 
|---|
|  | 181 | + *                        (invariant after initialized) | 
|---|
|  | 182 | + * @refs:                 list of references on this node | 
|---|
|  | 183 | + *                        (protected by @lock) | 
|---|
|  | 184 | + * @internal_strong_refs: used to take strong references when | 
|---|
|  | 185 | + *                        initiating a transaction | 
|---|
|  | 186 | + *                        (protected by @proc->inner_lock if @proc | 
|---|
|  | 187 | + *                        and by @lock) | 
|---|
|  | 188 | + * @local_weak_refs:      weak user refs from local process | 
|---|
|  | 189 | + *                        (protected by @proc->inner_lock if @proc | 
|---|
|  | 190 | + *                        and by @lock) | 
|---|
|  | 191 | + * @local_strong_refs:    strong user refs from local process | 
|---|
|  | 192 | + *                        (protected by @proc->inner_lock if @proc | 
|---|
|  | 193 | + *                        and by @lock) | 
|---|
|  | 194 | + * @tmp_refs:             temporary kernel refs | 
|---|
|  | 195 | + *                        (protected by @proc->inner_lock while @proc | 
|---|
|  | 196 | + *                        is valid, and by binder_dead_nodes_lock | 
|---|
|  | 197 | + *                        if @proc is NULL. During inc/dec and node release | 
|---|
|  | 198 | + *                        it is also protected by @lock to provide safety | 
|---|
|  | 199 | + *                        as the node dies and @proc becomes NULL) | 
|---|
|  | 200 | + * @ptr:                  userspace pointer for node | 
|---|
|  | 201 | + *                        (invariant, no lock needed) | 
|---|
|  | 202 | + * @cookie:               userspace cookie for node | 
|---|
|  | 203 | + *                        (invariant, no lock needed) | 
|---|
|  | 204 | + * @has_strong_ref:       userspace notified of strong ref | 
|---|
|  | 205 | + *                        (protected by @proc->inner_lock if @proc | 
|---|
|  | 206 | + *                        and by @lock) | 
|---|
|  | 207 | + * @pending_strong_ref:   userspace has acked notification of strong ref | 
|---|
|  | 208 | + *                        (protected by @proc->inner_lock if @proc | 
|---|
|  | 209 | + *                        and by @lock) | 
|---|
|  | 210 | + * @has_weak_ref:         userspace notified of weak ref | 
|---|
|  | 211 | + *                        (protected by @proc->inner_lock if @proc | 
|---|
|  | 212 | + *                        and by @lock) | 
|---|
|  | 213 | + * @pending_weak_ref:     userspace has acked notification of weak ref | 
|---|
|  | 214 | + *                        (protected by @proc->inner_lock if @proc | 
|---|
|  | 215 | + *                        and by @lock) | 
|---|
|  | 216 | + * @has_async_transaction: async transaction to node in progress | 
|---|
|  | 217 | + *                        (protected by @lock) | 
|---|
|  | 218 | + * @sched_policy:         minimum scheduling policy for node | 
|---|
|  | 219 | + *                        (invariant after initialized) | 
|---|
|  | 220 | + * @accept_fds:           file descriptor operations supported for node | 
|---|
|  | 221 | + *                        (invariant after initialized) | 
|---|
|  | 222 | + * @min_priority:         minimum scheduling priority | 
|---|
|  | 223 | + *                        (invariant after initialized) | 
|---|
|  | 224 | + * @inherit_rt:           inherit RT scheduling policy from caller | 
|---|
|  | 225 | + * @txn_security_ctx:     require sender's security context | 
|---|
|  | 226 | + *                        (invariant after initialized) | 
|---|
|  | 227 | + * @async_todo:           list of async work items | 
|---|
|  | 228 | + *                        (protected by @proc->inner_lock) | 
|---|
|  | 229 | + * | 
|---|
|  | 230 | + * Bookkeeping structure for binder nodes. | 
|---|
|  | 231 | + */ | 
|---|
|  | 232 | +struct binder_node { | 
|---|
| 121 | 233 | int debug_id; | 
|---|
| 122 |  | -	int debug_id_done; | 
|---|
| 123 |  | -	int call_type; | 
|---|
| 124 |  | -	int from_proc; | 
|---|
| 125 |  | -	int from_thread; | 
|---|
| 126 |  | -	int target_handle; | 
|---|
| 127 |  | -	int to_proc; | 
|---|
| 128 |  | -	int to_thread; | 
|---|
| 129 |  | -	int to_node; | 
|---|
| 130 |  | -	int data_size; | 
|---|
| 131 |  | -	int offsets_size; | 
|---|
| 132 |  | -	int return_error_line; | 
|---|
| 133 |  | -	uint32_t return_error; | 
|---|
| 134 |  | -	uint32_t return_error_param; | 
|---|
| 135 |  | -	const char *context_name; | 
|---|
|  | 234 | +	spinlock_t lock; | 
|---|
|  | 235 | +	struct binder_work work; | 
|---|
|  | 236 | +	union { | 
|---|
|  | 237 | +		struct rb_node rb_node; | 
|---|
|  | 238 | +		struct hlist_node dead_node; | 
|---|
|  | 239 | +	}; | 
|---|
|  | 240 | +	struct binder_proc *proc; | 
|---|
|  | 241 | +	struct hlist_head refs; | 
|---|
|  | 242 | +	int internal_strong_refs; | 
|---|
|  | 243 | +	int local_weak_refs; | 
|---|
|  | 244 | +	int local_strong_refs; | 
|---|
|  | 245 | +	int tmp_refs; | 
|---|
|  | 246 | +	binder_uintptr_t ptr; | 
|---|
|  | 247 | +	binder_uintptr_t cookie; | 
|---|
|  | 248 | +	struct { | 
|---|
|  | 249 | +		/* | 
|---|
|  | 250 | +		 * bitfield elements protected by | 
|---|
|  | 251 | +		 * proc inner_lock | 
|---|
|  | 252 | +		 */ | 
|---|
|  | 253 | +		u8 has_strong_ref:1; | 
|---|
|  | 254 | +		u8 pending_strong_ref:1; | 
|---|
|  | 255 | +		u8 has_weak_ref:1; | 
|---|
|  | 256 | +		u8 pending_weak_ref:1; | 
|---|
|  | 257 | +	}; | 
|---|
|  | 258 | +	struct { | 
|---|
|  | 259 | +		/* | 
|---|
|  | 260 | +		 * invariant after initialization | 
|---|
|  | 261 | +		 */ | 
|---|
|  | 262 | +		u8 sched_policy:2; | 
|---|
|  | 263 | +		u8 inherit_rt:1; | 
|---|
|  | 264 | +		u8 accept_fds:1; | 
|---|
|  | 265 | +		u8 txn_security_ctx:1; | 
|---|
|  | 266 | +		u8 min_priority; | 
|---|
|  | 267 | +	}; | 
|---|
|  | 268 | +	bool has_async_transaction; | 
|---|
|  | 269 | +	struct list_head async_todo; | 
|---|
| 136 | 270 | }; | 
|---|
| 137 | 271 |  | 
|---|
| 138 |  | -struct binder_transaction_log { | 
|---|
| 139 |  | -	atomic_t cur; | 
|---|
| 140 |  | -	bool full; | 
|---|
| 141 |  | -	struct binder_transaction_log_entry entry[32]; | 
|---|
|  | 272 | +struct binder_ref_death { | 
|---|
|  | 273 | +	/** | 
|---|
|  | 274 | +	 * @work: worklist element for death notifications | 
|---|
|  | 275 | +	 *        (protected by inner_lock of the proc that | 
|---|
|  | 276 | +	 *        this ref belongs to) | 
|---|
|  | 277 | +	 */ | 
|---|
|  | 278 | +	struct binder_work work; | 
|---|
|  | 279 | +	binder_uintptr_t cookie; | 
|---|
| 142 | 280 | }; | 
|---|
| 143 | 281 |  | 
|---|
| 144 |  | -extern struct binder_transaction_log binder_transaction_log; | 
|---|
| 145 |  | -extern struct binder_transaction_log binder_transaction_log_failed; | 
|---|
|  | 282 | +/** | 
|---|
|  | 283 | + * struct binder_ref_data - binder_ref counts and id | 
|---|
|  | 284 | + * @debug_id:        unique ID for the ref | 
|---|
|  | 285 | + * @desc:            unique userspace handle for ref | 
|---|
|  | 286 | + * @strong:          strong ref count (debugging only if not locked) | 
|---|
|  | 287 | + * @weak:            weak ref count (debugging only if not locked) | 
|---|
|  | 288 | + * | 
|---|
|  | 289 | + * Structure to hold ref count and ref id information. Since | 
|---|
|  | 290 | + * the actual ref can only be accessed with a lock, this structure | 
|---|
|  | 291 | + * is used to return information about the ref to callers of | 
|---|
|  | 292 | + * ref inc/dec functions. | 
|---|
|  | 293 | + */ | 
|---|
|  | 294 | +struct binder_ref_data { | 
|---|
|  | 295 | +	int debug_id; | 
|---|
|  | 296 | +	uint32_t desc; | 
|---|
|  | 297 | +	int strong; | 
|---|
|  | 298 | +	int weak; | 
|---|
|  | 299 | +}; | 
|---|
|  | 300 | + | 
|---|
|  | 301 | +/** | 
|---|
|  | 302 | + * struct binder_ref - struct to track references on nodes | 
|---|
|  | 303 | + * @data:        binder_ref_data containing id, handle, and current refcounts | 
|---|
|  | 304 | + * @rb_node_desc: node for lookup by @data.desc in proc's rb_tree | 
|---|
|  | 305 | + * @rb_node_node: node for lookup by @node in proc's rb_tree | 
|---|
|  | 306 | + * @node_entry:  list entry for node->refs list in target node | 
|---|
|  | 307 | + *               (protected by @node->lock) | 
|---|
|  | 308 | + * @proc:        binder_proc containing ref | 
|---|
|  | 309 | + * @node:        binder_node of target node. When cleaning up a | 
|---|
|  | 310 | + *               ref for deletion in binder_cleanup_ref, a non-NULL | 
|---|
|  | 311 | + *               @node indicates the node must be freed | 
|---|
|  | 312 | + * @death:       pointer to death notification (ref_death) if requested | 
|---|
|  | 313 | + *               (protected by @node->lock) | 
|---|
|  | 314 | + * | 
|---|
|  | 315 | + * Structure to track references from procA to target node (on procB). This | 
|---|
|  | 316 | + * structure is unsafe to access without holding @proc->outer_lock. | 
|---|
|  | 317 | + */ | 
|---|
|  | 318 | +struct binder_ref { | 
|---|
|  | 319 | +	/* Lookups needed: */ | 
|---|
|  | 320 | +	/*   node + proc => ref (transaction) */ | 
|---|
|  | 321 | +	/*   desc + proc => ref (transaction, inc/dec ref) */ | 
|---|
|  | 322 | +	/*   node => refs + procs (proc exit) */ | 
|---|
|  | 323 | +	struct binder_ref_data data; | 
|---|
|  | 324 | +	struct rb_node rb_node_desc; | 
|---|
|  | 325 | +	struct rb_node rb_node_node; | 
|---|
|  | 326 | +	struct hlist_node node_entry; | 
|---|
|  | 327 | +	struct binder_proc *proc; | 
|---|
|  | 328 | +	struct binder_node *node; | 
|---|
|  | 329 | +	struct binder_ref_death *death; | 
|---|
|  | 330 | +}; | 
|---|
|  | 331 | + | 
|---|
|  | 332 | +/** | 
|---|
|  | 333 | + * struct binder_priority - scheduler policy and priority | 
|---|
|  | 334 | + * @sched_policy            scheduler policy | 
|---|
|  | 335 | + * @prio                    [100..139] for SCHED_NORMAL, [0..99] for FIFO/RT | 
|---|
|  | 336 | + * | 
|---|
|  | 337 | + * The binder driver supports inheriting the following scheduler policies: | 
|---|
|  | 338 | + * SCHED_NORMAL | 
|---|
|  | 339 | + * SCHED_BATCH | 
|---|
|  | 340 | + * SCHED_FIFO | 
|---|
|  | 341 | + * SCHED_RR | 
|---|
|  | 342 | + */ | 
|---|
|  | 343 | +struct binder_priority { | 
|---|
|  | 344 | +	unsigned int sched_policy; | 
|---|
|  | 345 | +	int prio; | 
|---|
|  | 346 | +}; | 
|---|
|  | 347 | + | 
|---|
|  | 348 | +/** | 
|---|
|  | 349 | + * struct binder_proc - binder process bookkeeping | 
|---|
|  | 350 | + * @proc_node:            element for binder_procs list | 
|---|
|  | 351 | + * @threads:              rbtree of binder_threads in this proc | 
|---|
|  | 352 | + *                        (protected by @inner_lock) | 
|---|
|  | 353 | + * @nodes:                rbtree of binder nodes associated with | 
|---|
|  | 354 | + *                        this proc ordered by node->ptr | 
|---|
|  | 355 | + *                        (protected by @inner_lock) | 
|---|
|  | 356 | + * @refs_by_desc:         rbtree of refs ordered by ref->desc | 
|---|
|  | 357 | + *                        (protected by @outer_lock) | 
|---|
|  | 358 | + * @refs_by_node:         rbtree of refs ordered by ref->node | 
|---|
|  | 359 | + *                        (protected by @outer_lock) | 
|---|
|  | 360 | + * @waiting_threads:      threads currently waiting for proc work | 
|---|
|  | 361 | + *                        (protected by @inner_lock) | 
|---|
|  | 362 | + * @pid                   PID of group_leader of process | 
|---|
|  | 363 | + *                        (invariant after initialized) | 
|---|
|  | 364 | + * @tsk                   task_struct for group_leader of process | 
|---|
|  | 365 | + *                        (invariant after initialized) | 
|---|
|  | 366 | + * @deferred_work_node:   element for binder_deferred_list | 
|---|
|  | 367 | + *                        (protected by binder_deferred_lock) | 
|---|
|  | 368 | + * @deferred_work:        bitmap of deferred work to perform | 
|---|
|  | 369 | + *                        (protected by binder_deferred_lock) | 
|---|
|  | 370 | + * @outstanding_txns:     number of transactions to be transmitted before | 
|---|
|  | 371 | + *                        processes in freeze_wait are woken up | 
|---|
|  | 372 | + *                        (protected by @inner_lock) | 
|---|
|  | 373 | + * @is_dead:              process is dead and awaiting free | 
|---|
|  | 374 | + *                        when outstanding transactions are cleaned up | 
|---|
|  | 375 | + *                        (protected by @inner_lock) | 
|---|
|  | 376 | + * @is_frozen:            process is frozen and unable to service | 
|---|
|  | 377 | + *                        binder transactions | 
|---|
|  | 378 | + *                        (protected by @inner_lock) | 
|---|
|  | 379 | + * @sync_recv:            process received sync transactions since last frozen | 
|---|
|  | 380 | + *                        bit 0: received sync transaction after being frozen | 
|---|
|  | 381 | + *                        bit 1: new pending sync transaction during freezing | 
|---|
|  | 382 | + *                        (protected by @inner_lock) | 
|---|
|  | 383 | + * @async_recv:           process received async transactions since last frozen | 
|---|
|  | 384 | + *                        (protected by @inner_lock) | 
|---|
|  | 385 | + * @freeze_wait:          waitqueue of processes waiting for all outstanding | 
|---|
|  | 386 | + *                        transactions to be processed | 
|---|
|  | 387 | + *                        (protected by @inner_lock) | 
|---|
|  | 388 | + * @todo:                 list of work for this process | 
|---|
|  | 389 | + *                        (protected by @inner_lock) | 
|---|
|  | 390 | + * @stats:                per-process binder statistics | 
|---|
|  | 391 | + *                        (atomics, no lock needed) | 
|---|
|  | 392 | + * @delivered_death:      list of delivered death notification | 
|---|
|  | 393 | + *                        (protected by @inner_lock) | 
|---|
|  | 394 | + * @max_threads:          cap on number of binder threads | 
|---|
|  | 395 | + *                        (protected by @inner_lock) | 
|---|
|  | 396 | + * @requested_threads:    number of binder threads requested but not | 
|---|
|  | 397 | + *                        yet started. In current implementation, can | 
|---|
|  | 398 | + *                        only be 0 or 1. | 
|---|
|  | 399 | + *                        (protected by @inner_lock) | 
|---|
|  | 400 | + * @requested_threads_started: number binder threads started | 
|---|
|  | 401 | + *                        (protected by @inner_lock) | 
|---|
|  | 402 | + * @tmp_ref:              temporary reference to indicate proc is in use | 
|---|
|  | 403 | + *                        (protected by @inner_lock) | 
|---|
|  | 404 | + * @default_priority:     default scheduler priority | 
|---|
|  | 405 | + *                        (invariant after initialized) | 
|---|
|  | 406 | + * @debugfs_entry:        debugfs node | 
|---|
|  | 407 | + * @alloc:                binder allocator bookkeeping | 
|---|
|  | 408 | + * @context:              binder_context for this proc | 
|---|
|  | 409 | + *                        (invariant after initialized) | 
|---|
|  | 410 | + * @inner_lock:           can nest under outer_lock and/or node lock | 
|---|
|  | 411 | + * @outer_lock:           no nesting under innor or node lock | 
|---|
|  | 412 | + *                        Lock order: 1) outer, 2) node, 3) inner | 
|---|
|  | 413 | + * @binderfs_entry:       process-specific binderfs log file | 
|---|
|  | 414 | + * @oneway_spam_detection_enabled: process enabled oneway spam detection | 
|---|
|  | 415 | + *                        or not | 
|---|
|  | 416 | + * | 
|---|
|  | 417 | + * Bookkeeping structure for binder processes | 
|---|
|  | 418 | + */ | 
|---|
|  | 419 | +struct binder_proc { | 
|---|
|  | 420 | +	struct hlist_node proc_node; | 
|---|
|  | 421 | +	struct rb_root threads; | 
|---|
|  | 422 | +	struct rb_root nodes; | 
|---|
|  | 423 | +	struct rb_root refs_by_desc; | 
|---|
|  | 424 | +	struct rb_root refs_by_node; | 
|---|
|  | 425 | +	struct list_head waiting_threads; | 
|---|
|  | 426 | +	int pid; | 
|---|
|  | 427 | +	struct task_struct *tsk; | 
|---|
|  | 428 | +	struct hlist_node deferred_work_node; | 
|---|
|  | 429 | +	int deferred_work; | 
|---|
|  | 430 | +	int outstanding_txns; | 
|---|
|  | 431 | +	bool is_dead; | 
|---|
|  | 432 | +	bool is_frozen; | 
|---|
|  | 433 | +	bool sync_recv; | 
|---|
|  | 434 | +	bool async_recv; | 
|---|
|  | 435 | +	wait_queue_head_t freeze_wait; | 
|---|
|  | 436 | + | 
|---|
|  | 437 | +	struct list_head todo; | 
|---|
|  | 438 | +	struct binder_stats stats; | 
|---|
|  | 439 | +	struct list_head delivered_death; | 
|---|
|  | 440 | +	int max_threads; | 
|---|
|  | 441 | +	int requested_threads; | 
|---|
|  | 442 | +	int requested_threads_started; | 
|---|
|  | 443 | +	int tmp_ref; | 
|---|
|  | 444 | +	struct binder_priority default_priority; | 
|---|
|  | 445 | +	struct dentry *debugfs_entry; | 
|---|
|  | 446 | +	struct binder_alloc alloc; | 
|---|
|  | 447 | +	struct binder_context *context; | 
|---|
|  | 448 | +	spinlock_t inner_lock; | 
|---|
|  | 449 | +	spinlock_t outer_lock; | 
|---|
|  | 450 | +	struct dentry *binderfs_entry; | 
|---|
|  | 451 | +	bool oneway_spam_detection_enabled; | 
|---|
|  | 452 | +}; | 
|---|
|  | 453 | + | 
|---|
|  | 454 | +/** | 
|---|
|  | 455 | + * struct binder_proc_ext - binder process bookkeeping | 
|---|
|  | 456 | + * @proc:            element for binder_procs list | 
|---|
|  | 457 | + * @cred                  struct cred associated with the `struct file` | 
|---|
|  | 458 | + *                        in binder_open() | 
|---|
|  | 459 | + *                        (invariant after initialized) | 
|---|
|  | 460 | + * | 
|---|
|  | 461 | + * Extended binder_proc -- needed to add the "cred" field without | 
|---|
|  | 462 | + * changing the KMI for binder_proc. | 
|---|
|  | 463 | + */ | 
|---|
|  | 464 | +struct binder_proc_ext { | 
|---|
|  | 465 | +	struct binder_proc proc; | 
|---|
|  | 466 | +	const struct cred *cred; | 
|---|
|  | 467 | +}; | 
|---|
|  | 468 | + | 
|---|
|  | 469 | +static inline const struct cred *binder_get_cred(struct binder_proc *proc) | 
|---|
|  | 470 | +{ | 
|---|
|  | 471 | +	struct binder_proc_ext *eproc; | 
|---|
|  | 472 | + | 
|---|
|  | 473 | +	eproc = container_of(proc, struct binder_proc_ext, proc); | 
|---|
|  | 474 | +	return eproc->cred; | 
|---|
|  | 475 | +} | 
|---|
|  | 476 | + | 
|---|
|  | 477 | +/** | 
|---|
|  | 478 | + * struct binder_thread - binder thread bookkeeping | 
|---|
|  | 479 | + * @proc:                 binder process for this thread | 
|---|
|  | 480 | + *                        (invariant after initialization) | 
|---|
|  | 481 | + * @rb_node:              element for proc->threads rbtree | 
|---|
|  | 482 | + *                        (protected by @proc->inner_lock) | 
|---|
|  | 483 | + * @waiting_thread_node:  element for @proc->waiting_threads list | 
|---|
|  | 484 | + *                        (protected by @proc->inner_lock) | 
|---|
|  | 485 | + * @pid:                  PID for this thread | 
|---|
|  | 486 | + *                        (invariant after initialization) | 
|---|
|  | 487 | + * @looper:               bitmap of looping state | 
|---|
|  | 488 | + *                        (only accessed by this thread) | 
|---|
|  | 489 | + * @looper_needs_return:  looping thread needs to exit driver | 
|---|
|  | 490 | + *                        (no lock needed) | 
|---|
|  | 491 | + * @transaction_stack:    stack of in-progress transactions for this thread | 
|---|
|  | 492 | + *                        (protected by @proc->inner_lock) | 
|---|
|  | 493 | + * @todo:                 list of work to do for this thread | 
|---|
|  | 494 | + *                        (protected by @proc->inner_lock) | 
|---|
|  | 495 | + * @process_todo:         whether work in @todo should be processed | 
|---|
|  | 496 | + *                        (protected by @proc->inner_lock) | 
|---|
|  | 497 | + * @return_error:         transaction errors reported by this thread | 
|---|
|  | 498 | + *                        (only accessed by this thread) | 
|---|
|  | 499 | + * @reply_error:          transaction errors reported by target thread | 
|---|
|  | 500 | + *                        (protected by @proc->inner_lock) | 
|---|
|  | 501 | + * @wait:                 wait queue for thread work | 
|---|
|  | 502 | + * @stats:                per-thread statistics | 
|---|
|  | 503 | + *                        (atomics, no lock needed) | 
|---|
|  | 504 | + * @tmp_ref:              temporary reference to indicate thread is in use | 
|---|
|  | 505 | + *                        (atomic since @proc->inner_lock cannot | 
|---|
|  | 506 | + *                        always be acquired) | 
|---|
|  | 507 | + * @is_dead:              thread is dead and awaiting free | 
|---|
|  | 508 | + *                        when outstanding transactions are cleaned up | 
|---|
|  | 509 | + *                        (protected by @proc->inner_lock) | 
|---|
|  | 510 | + * @task:                 struct task_struct for this thread | 
|---|
|  | 511 | + * | 
|---|
|  | 512 | + * Bookkeeping structure for binder threads. | 
|---|
|  | 513 | + */ | 
|---|
|  | 514 | +struct binder_thread { | 
|---|
|  | 515 | +	struct binder_proc *proc; | 
|---|
|  | 516 | +	struct rb_node rb_node; | 
|---|
|  | 517 | +	struct list_head waiting_thread_node; | 
|---|
|  | 518 | +	int pid; | 
|---|
|  | 519 | +	int looper;              /* only modified by this thread */ | 
|---|
|  | 520 | +	bool looper_need_return; /* can be written by other thread */ | 
|---|
|  | 521 | +	struct binder_transaction *transaction_stack; | 
|---|
|  | 522 | +	struct list_head todo; | 
|---|
|  | 523 | +	bool process_todo; | 
|---|
|  | 524 | +	struct binder_error return_error; | 
|---|
|  | 525 | +	struct binder_error reply_error; | 
|---|
|  | 526 | +	wait_queue_head_t wait; | 
|---|
|  | 527 | +	struct binder_stats stats; | 
|---|
|  | 528 | +	atomic_t tmp_ref; | 
|---|
|  | 529 | +	bool is_dead; | 
|---|
|  | 530 | +	struct task_struct *task; | 
|---|
|  | 531 | +}; | 
|---|
|  | 532 | + | 
|---|
|  | 533 | +/** | 
|---|
|  | 534 | + * struct binder_txn_fd_fixup - transaction fd fixup list element | 
|---|
|  | 535 | + * @fixup_entry:          list entry | 
|---|
|  | 536 | + * @file:                 struct file to be associated with new fd | 
|---|
|  | 537 | + * @offset:               offset in buffer data to this fixup | 
|---|
|  | 538 | + * | 
|---|
|  | 539 | + * List element for fd fixups in a transaction. Since file | 
|---|
|  | 540 | + * descriptors need to be allocated in the context of the | 
|---|
|  | 541 | + * target process, we pass each fd to be processed in this | 
|---|
|  | 542 | + * struct. | 
|---|
|  | 543 | + */ | 
|---|
|  | 544 | +struct binder_txn_fd_fixup { | 
|---|
|  | 545 | +	struct list_head fixup_entry; | 
|---|
|  | 546 | +	struct file *file; | 
|---|
|  | 547 | +	size_t offset; | 
|---|
|  | 548 | +}; | 
|---|
|  | 549 | + | 
|---|
|  | 550 | +struct binder_transaction { | 
|---|
|  | 551 | +	int debug_id; | 
|---|
|  | 552 | +	struct binder_work work; | 
|---|
|  | 553 | +	struct binder_thread *from; | 
|---|
|  | 554 | +	struct binder_transaction *from_parent; | 
|---|
|  | 555 | +	struct binder_proc *to_proc; | 
|---|
|  | 556 | +	struct binder_thread *to_thread; | 
|---|
|  | 557 | +	struct binder_transaction *to_parent; | 
|---|
|  | 558 | +	unsigned need_reply:1; | 
|---|
|  | 559 | +	/* unsigned is_dead:1; */	/* not used at the moment */ | 
|---|
|  | 560 | + | 
|---|
|  | 561 | +	struct binder_buffer *buffer; | 
|---|
|  | 562 | +	unsigned int	code; | 
|---|
|  | 563 | +	unsigned int	flags; | 
|---|
|  | 564 | +	struct binder_priority	priority; | 
|---|
|  | 565 | +	struct binder_priority	saved_priority; | 
|---|
|  | 566 | +	bool    set_priority_called; | 
|---|
|  | 567 | +	kuid_t	sender_euid; | 
|---|
|  | 568 | +	struct list_head fd_fixups; | 
|---|
|  | 569 | +	binder_uintptr_t security_ctx; | 
|---|
|  | 570 | +	/** | 
|---|
|  | 571 | +	 * @lock:  protects @from, @to_proc, and @to_thread | 
|---|
|  | 572 | +	 * | 
|---|
|  | 573 | +	 * @from, @to_proc, and @to_thread can be set to NULL | 
|---|
|  | 574 | +	 * during thread teardown | 
|---|
|  | 575 | +	 */ | 
|---|
|  | 576 | +	spinlock_t lock; | 
|---|
|  | 577 | +	ANDROID_VENDOR_DATA(1); | 
|---|
|  | 578 | +	ANDROID_OEM_DATA_ARRAY(1, 2); | 
|---|
|  | 579 | +}; | 
|---|
|  | 580 | + | 
|---|
|  | 581 | +/** | 
|---|
|  | 582 | + * struct binder_object - union of flat binder object types | 
|---|
|  | 583 | + * @hdr:   generic object header | 
|---|
|  | 584 | + * @fbo:   binder object (nodes and refs) | 
|---|
|  | 585 | + * @fdo:   file descriptor object | 
|---|
|  | 586 | + * @bbo:   binder buffer pointer | 
|---|
|  | 587 | + * @fdao:  file descriptor array | 
|---|
|  | 588 | + * | 
|---|
|  | 589 | + * Used for type-independent object copies | 
|---|
|  | 590 | + */ | 
|---|
|  | 591 | +struct binder_object { | 
|---|
|  | 592 | +	union { | 
|---|
|  | 593 | +		struct binder_object_header hdr; | 
|---|
|  | 594 | +		struct flat_binder_object fbo; | 
|---|
|  | 595 | +		struct binder_fd_object fdo; | 
|---|
|  | 596 | +		struct binder_buffer_object bbo; | 
|---|
|  | 597 | +		struct binder_fd_array_object fdao; | 
|---|
|  | 598 | +	}; | 
|---|
|  | 599 | +}; | 
|---|
|  | 600 | + | 
|---|
| 146 | 601 | #endif /* _LINUX_BINDER_INTERNAL_H */ | 
|---|