Function report |
Source Code:kernel\locking\mutex.c |
Create Date:2022-07-28 09:47:30 |
Last Modify:2020-03-12 14:18:49 | Copyright©Brick |
home page | Tree |
Annotation kernel can get tool activity | Download SCCT | Chinese |
Name:Lock a mutex (possibly interruptible), slowpath:
Proto:static __always_inline int __sched __mutex_lock_common(struct mutex *lock, long state, unsigned int subclass, struct lockdep_map *nest_lock, unsigned long ip, struct ww_acquire_ctx *ww_ctx, const bool use_ww_ctx)
Type:int
Parameter:
Type | Parameter | Name |
---|---|---|
struct mutex * | lock | |
long | state | |
unsigned int | subclass | |
struct lockdep_map * | nest_lock | |
unsigned long | ip | |
struct ww_acquire_ctx * | ww_ctx | |
const bool | use_ww_ctx |
931 | bool first = false |
935 | might_sleep() |
942 | If use_ww_ctx && ww_ctx Then |
943 | If Value for the false possibility is greater at compile time(ww_ctx == READ_ONCE(ctx)) Then Return -EALREADY |
956 | mutex_acquire_nest( & dep_map, subclass, 0, nest_lock, ip) |
958 | If Actual trylock that will work on any unlocked state. || mutex_optimistic_spin(lock, ww_ctx, use_ww_ctx, NULL) Then |
961 | lock_acquired( & dep_map, ip) |
962 | If use_ww_ctx && ww_ctx Then After acquiring lock with fastpath, where we do not hold wait_lock, set ctx* and wake up any waiters so they can recheck. |
964 | preempt_enable() |
965 | Return 0 |
976 | Go to skip_wait |
979 | debug_mutex_lock_common(lock, & waiter) |
981 | lock_contended( & dep_map, ip) |
983 | If Not use_ww_ctx Then |
991 | Else |
997 | If ret Then Go to err_early_kill |
1003 | task = current process |
1005 | set_current_state(state) |
1006 | cycle |
1013 | If Actual trylock that will work on any unlocked state. Then Go to acquired |
1021 | If signal_pending_state(state, current process) Then |
1026 | If use_ww_ctx && ww_ctx Then |
1032 | spin_unlock( & wait_lock) |
1039 | If use_ww_ctx && ww_ctx || Not first Then |
1040 | first = __mutex_waiter_is_first(lock, & waiter) |
1041 | If first Then __mutex_set_flag(lock, MUTEX_FLAG_HANDOFF) |
1045 | set_current_state(state) |
1051 | If Actual trylock that will work on any unlocked state. || first && mutex_optimistic_spin(lock, ww_ctx, use_ww_ctx, & waiter) Then Break |
1058 | acquired : |
1061 | If use_ww_ctx && ww_ctx Then |
1072 | If Value is more likely to compile time(list_empty - tests whether a list is empty*@head: the list to test.) Then __mutex_clear_flag(lock, MUTEX_FLAGS) |
1075 | debug_mutex_free_waiter( & waiter) |
1077 | skip_wait : |
1079 | lock_acquired( & dep_map, ip) |
1081 | If use_ww_ctx && ww_ctx Then Associate the ww_mutex @ww with the context @ww_ctx under which we acquired* it. |
1084 | spin_unlock( & wait_lock) |
1085 | preempt_enable() |
1086 | Return 0 |
1088 | err : |
1091 | err_early_kill : |
1092 | spin_unlock( & wait_lock) |
1093 | debug_mutex_free_waiter( & waiter) |
1094 | mutex_release( & dep_map, ip) |
1095 | preempt_enable() |
1096 | Return ret |
Name | Describe |
---|---|
__mutex_lock | |
__ww_mutex_lock | |
mutex_lock_io_nested |
Source code conversion tool public plug-in interface | X |
---|---|
Support c/c++/esqlc/java Oracle/Informix/Mysql Plug-in can realize: logical Report Code generation and batch code conversion |