MCPcopy Create free account
hub / github.com/F-Stack/f-stack / lockmgr_lock_flags

Function lockmgr_lock_flags

freebsd/kern/kern_lock.c:1029–1092  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1027}
1028
1029int
1030lockmgr_lock_flags(struct lock *lk, u_int flags, struct lock_object *ilk,
1031 const char *file, int line)
1032{
1033 struct lock_class *class;
1034 uintptr_t x, tid;
1035 u_int op;
1036 bool locked;
1037
1038 if (KERNEL_PANICKED())
1039 return (0);
1040
1041 op = flags & LK_TYPE_MASK;
1042 locked = false;
1043 switch (op) {
1044 case LK_SHARED:
1045 if (LK_CAN_WITNESS(flags))
1046 WITNESS_CHECKORDER(&lk->lock_object, LOP_NEWORDER,
1047 file, line, flags & LK_INTERLOCK ? ilk : NULL);
1048 if (__predict_false(lk->lock_object.lo_flags & LK_NOSHARE))
1049 break;
1050 x = lockmgr_read_value(lk);
1051 if (lockmgr_slock_try(lk, &x, flags, true)) {
1052 lockmgr_note_shared_acquire(lk, 0, 0,
1053 file, line, flags);
1054 locked = true;
1055 } else {
1056 return (lockmgr_slock_hard(lk, flags, ilk, file, line,
1057 NULL));
1058 }
1059 break;
1060 case LK_EXCLUSIVE:
1061 if (LK_CAN_WITNESS(flags))
1062 WITNESS_CHECKORDER(&lk->lock_object, LOP_NEWORDER |
1063 LOP_EXCLUSIVE, file, line, flags & LK_INTERLOCK ?
1064 ilk : NULL);
1065 tid = (uintptr_t)curthread;
1066 if (lockmgr_read_value(lk) == LK_UNLOCKED &&
1067 atomic_cmpset_acq_ptr(&lk->lk_lock, LK_UNLOCKED, tid)) {
1068 lockmgr_note_exclusive_acquire(lk, 0, 0, file, line,
1069 flags);
1070 locked = true;
1071 } else {
1072 return (lockmgr_xlock_hard(lk, flags, ilk, file, line,
1073 NULL));
1074 }
1075 break;
1076 case LK_UPGRADE:
1077 case LK_TRYUPGRADE:
1078 return (lockmgr_upgrade(lk, flags, ilk, file, line, NULL));
1079 default:
1080 break;
1081 }
1082 if (__predict_true(locked)) {
1083 if (__predict_false(flags & LK_INTERLOCK)) {
1084 class = LOCK_CLASS(ilk);
1085 class->lc_unlock(ilk);
1086 }

Callers 2

vop_stdlockFunction · 0.85
vop_lockFunction · 0.85

Calls 7

lockmgr_slock_tryFunction · 0.85
lockmgr_slock_hardFunction · 0.85
lockmgr_xlock_hardFunction · 0.85
lockmgr_upgradeFunction · 0.85
__lockmgr_argsFunction · 0.85

Tested by

no test coverage detected