• Todd Kjos's avatar
    binder: introduce locking helper functions · 9630fe88
    Todd Kjos authored
    There are 3 main spinlocks which must be acquired in this
    order:
    1) proc->outer_lock : protects most fields of binder_proc,
    	binder_thread, and binder_ref structures. binder_proc_lock()
    	and binder_proc_unlock() are used to acq/rel.
    2) node->lock : protects most fields of binder_node.
    	binder_node_lock() and binder_node_unlock() are
    	used to acq/rel
    3) proc->inner_lock : protects the thread and node lists
    	(proc->threads, proc->nodes) and all todo lists associated
    	with the binder_proc (proc->todo, thread->todo,
    	proc->delivered_death and node->async_todo).
    	binder_inner_proc_lock() and binder_inner_proc_unlock()
    	are used to acq/rel
    
    Any lock under procA must never be nested under any lock at the same
    level or below on procB.
    
    Functions that require a lock held on entry indicate which lock
    in the suffix of the function name:
    
    foo_olocked() : requires node->outer_lock
    foo_nlocked() : requires node->lock
    foo_ilocked() : requires proc->inner_lock
    foo_iolocked(): requires proc->outer_lock and proc->inner_lock
    foo_nilocked(): requires node->lock and proc->inner_lock
    Signed-off-by: default avatarTodd Kjos <tkjos@google.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    9630fe88
binder.c 132 KB