mirror of
https://github.com/opnsense/src.git
synced 2026-05-28 04:12:45 -04:00
- Use lock_init/lock_destroy() to setup the lock_object inside of lockmgr.
We can now use LOCK_CLASS() as a stronger check in lockmgr_chain() as a result. This required putting back lk_flags as lockmgr's use of flags conflicted with other flags in lo_flags otherwise. - Tweak 'show lock' output for lockmgr to match sx, rw, and mtx.
This commit is contained in:
parent
9a78e8bc19
commit
ab2dab1680
2 changed files with 13 additions and 9 deletions
|
|
@ -180,7 +180,7 @@ acquire(struct lock **lkpp, int extflags, int wanted, int *contested, uint64_t *
|
|||
* accepted shared locks and shared-to-exclusive upgrades to go away.
|
||||
*/
|
||||
int
|
||||
_lockmgr(struct lock *lkp, int flags, struct mtx *interlkp,
|
||||
_lockmgr(struct lock *lkp, u_int flags, struct mtx *interlkp,
|
||||
struct thread *td, char *file, int line)
|
||||
|
||||
{
|
||||
|
|
@ -544,7 +544,6 @@ lockinit(lkp, prio, wmesg, timo, flags)
|
|||
lkp->lk_waitcount = 0;
|
||||
lkp->lk_exclusivecount = 0;
|
||||
lkp->lk_prio = prio;
|
||||
lkp->lk_wmesg = wmesg;
|
||||
lkp->lk_timo = timo;
|
||||
lkp->lk_lockholder = LK_NOPROC;
|
||||
lkp->lk_newlock = NULL;
|
||||
|
|
@ -552,6 +551,8 @@ lockinit(lkp, prio, wmesg, timo, flags)
|
|||
stack_zero(&lkp->lk_stack);
|
||||
#endif
|
||||
lock_profile_object_init(&lkp->lk_object, &lock_class_lockmgr, wmesg);
|
||||
lock_init(&lkp->lk_object, &lock_class_lockmgr, wmesg, NULL,
|
||||
LO_RECURSABLE | LO_SLEEPABLE | LO_UPGRADABLE);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -564,6 +565,7 @@ lockdestroy(lkp)
|
|||
CTR2(KTR_LOCK, "lockdestroy(): lkp == %p (lk_wmesg == \"%s\")",
|
||||
lkp, lkp->lk_wmesg);
|
||||
lock_profile_object_destroy(&lkp->lk_object);
|
||||
lock_destroy(&lkp->lk_object);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -661,7 +663,8 @@ lockmgr_chain(struct thread *td, struct thread **ownerp)
|
|||
lkp = td->td_wchan;
|
||||
|
||||
/* Simple test to see if wchan points to a lockmgr lock. */
|
||||
if (lkp->lk_wmesg == td->td_wmesg)
|
||||
if (LOCK_CLASS(&lkp->lk_object) == &lock_class_lockmgr &&
|
||||
lkp->lk_wmesg == td->td_wmesg)
|
||||
goto ok;
|
||||
|
||||
/*
|
||||
|
|
@ -670,7 +673,8 @@ lockmgr_chain(struct thread *td, struct thread **ownerp)
|
|||
*/
|
||||
lkp = (struct lock *)((char *)td->td_wchan -
|
||||
offsetof(struct lock, lk_flags));
|
||||
if (lkp->lk_wmesg == td->td_wmesg && (lkp->lk_flags & LK_WAITDRAIN))
|
||||
if (LOCK_CLASS(&lkp->lk_object) == &lock_class_lockmgr &&
|
||||
lkp->lk_wmesg == td->td_wmesg && (lkp->lk_flags & LK_WAITDRAIN))
|
||||
goto ok;
|
||||
|
||||
/* Doen't seem to be a lockmgr lock. */
|
||||
|
|
@ -697,8 +701,8 @@ db_show_lockmgr(struct lock_object *lock)
|
|||
|
||||
lkp = (struct lock *)lock;
|
||||
|
||||
db_printf("lock type: %s\n", lkp->lk_wmesg);
|
||||
db_printf("state: ");
|
||||
db_printf(" lock type: %s\n", lkp->lk_wmesg);
|
||||
db_printf(" state: ");
|
||||
if (lkp->lk_sharecount)
|
||||
db_printf("SHARED (count %d)\n", lkp->lk_sharecount);
|
||||
else if (lkp->lk_flags & LK_HAVE_EXCL) {
|
||||
|
|
@ -709,6 +713,6 @@ db_show_lockmgr(struct lock_object *lock)
|
|||
} else
|
||||
db_printf("UNLOCKED\n");
|
||||
if (lkp->lk_waitcount > 0)
|
||||
db_printf("waiters: %d\n", lkp->lk_waitcount);
|
||||
db_printf(" waiters: %d\n", lkp->lk_waitcount);
|
||||
}
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -53,6 +53,7 @@ struct mtx;
|
|||
struct lock {
|
||||
struct lock_object lk_object; /* common lock properties */
|
||||
struct mtx *lk_interlock; /* lock on remaining fields */
|
||||
u_int lk_flags; /* see below */
|
||||
int lk_sharecount; /* # of accepted shared locks */
|
||||
int lk_waitcount; /* # of processes sleeping for lock */
|
||||
short lk_exclusivecount; /* # of recursive exclusive locks */
|
||||
|
|
@ -66,7 +67,6 @@ struct lock {
|
|||
#endif
|
||||
};
|
||||
|
||||
#define lk_flags lk_object.lo_flags
|
||||
#define lk_wmesg lk_object.lo_name
|
||||
/*
|
||||
* Lock request types:
|
||||
|
|
@ -202,7 +202,7 @@ void lockinit(struct lock *, int prio, const char *wmesg,
|
|||
int timo, int flags);
|
||||
void lockdestroy(struct lock *);
|
||||
|
||||
int _lockmgr(struct lock *, int flags,
|
||||
int _lockmgr(struct lock *, u_int flags,
|
||||
struct mtx *, struct thread *p, char *file, int line);
|
||||
void transferlockers(struct lock *, struct lock *);
|
||||
void lockmgr_printinfo(struct lock *);
|
||||
|
|
|
|||
Loading…
Reference in a new issue