1
0
mirror of https://git.FreeBSD.org/src.git synced 2025-01-11 14:10:34 +00:00

- Replace the series of DEBUG_LOCKS hacks which tried to save the vn_lock

caller by saving the stack of the last locker/unlocker in lockmgr.  We
   also put the stack in KTR at the moment.

Contributed by:		Antoine Brodin <antoine.brodin@laposte.net>
This commit is contained in:
Jeff Roberson 2005-08-03 04:48:22 +00:00
parent d0f5f62d8b
commit e8ddb61d38
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=148668
5 changed files with 20 additions and 79 deletions

View File

@ -51,6 +51,10 @@ __FBSDID("$FreeBSD$");
#include <sys/mutex.h>
#include <sys/proc.h>
#include <sys/systm.h>
#ifdef DEBUG_LOCKS
#include <sys/stack.h>
#include <sys/sysctl.h>
#endif
/*
* Locking primitives implementation.
@ -138,20 +142,11 @@ acquire(struct lock **lkpp, int extflags, int wanted)
* accepted shared locks and shared-to-exclusive upgrades to go away.
*/
int
#ifndef DEBUG_LOCKS
lockmgr(lkp, flags, interlkp, td)
#else
debuglockmgr(lkp, flags, interlkp, td, name, file, line)
#endif
struct lock *lkp;
u_int flags;
struct mtx *interlkp;
struct thread *td;
#ifdef DEBUG_LOCKS
const char *name; /* Name of lock function */
const char *file; /* Name of file call is from */
int line; /* Line number in file */
#endif
{
int error;
struct thread *thr;
@ -165,15 +160,16 @@ debuglockmgr(lkp, flags, interlkp, td, name, file, line)
if ((flags & LK_INTERNAL) == 0)
mtx_lock(lkp->lk_interlock);
#ifdef DEBUG_LOCKS
CTR6(KTR_LOCK,
"lockmgr(): lkp == %p (lk_wmesg == \"%s\"), flags == 0x%x, "
"td == %p %s:%d", lkp, lkp->lk_wmesg, flags, td, file, line);
#else
CTR6(KTR_LOCK,
"lockmgr(): lkp == %p (lk_wmesg == \"%s\"), owner == %p, exclusivecount == %d, flags == 0x%x, "
"td == %p", lkp, lkp->lk_wmesg, lkp->lk_lockholder,
lkp->lk_exclusivecount, flags, td);
#ifdef DEBUG_LOCKS
{
struct stack stack; /* XXX */
stack_save(&stack);
CTRSTACK(KTR_LOCK, &stack, 1);
}
#endif
if (flags & LK_INTERLOCK) {
@ -218,10 +214,7 @@ debuglockmgr(lkp, flags, interlkp, td, name, file, line)
break;
sharelock(td, lkp, 1);
#if defined(DEBUG_LOCKS)
lkp->lk_slockholder = thr;
lkp->lk_sfilename = file;
lkp->lk_slineno = line;
lkp->lk_slockername = name;
stack_save(&lkp->stack);
#endif
break;
}
@ -304,9 +297,7 @@ debuglockmgr(lkp, flags, interlkp, td, name, file, line)
lkp->lk_exclusivecount = 1;
COUNT(td, 1);
#if defined(DEBUG_LOCKS)
lkp->lk_filename = file;
lkp->lk_lineno = line;
lkp->lk_lockername = name;
stack_save(&lkp->stack);
#endif
break;
}
@ -365,9 +356,7 @@ debuglockmgr(lkp, flags, interlkp, td, name, file, line)
lkp->lk_exclusivecount = 1;
COUNT(td, 1);
#if defined(DEBUG_LOCKS)
lkp->lk_filename = file;
lkp->lk_lineno = line;
lkp->lk_lockername = name;
stack_save(&lkp->stack);
#endif
break;
@ -412,9 +401,7 @@ debuglockmgr(lkp, flags, interlkp, td, name, file, line)
lkp->lk_exclusivecount = 1;
COUNT(td, 1);
#if defined(DEBUG_LOCKS)
lkp->lk_filename = file;
lkp->lk_lineno = line;
lkp->lk_lockername = name;
stack_save(&lkp->stack);
#endif
break;
@ -508,13 +495,7 @@ lockinit(lkp, prio, wmesg, timo, flags)
lkp->lk_lockholder = LK_NOPROC;
lkp->lk_newlock = NULL;
#ifdef DEBUG_LOCKS
lkp->lk_filename = "none";
lkp->lk_lockername = "never exclusive locked";
lkp->lk_lineno = 0;
lkp->lk_slockholder = LK_NOPROC;
lkp->lk_sfilename = "none";
lkp->lk_slockername = "never share locked";
lkp->lk_slineno = 0;
stack_zero(&lkp->stack);
#endif
}

View File

@ -254,12 +254,7 @@ vop_stdlock(ap)
{
struct vnode *vp = ap->a_vp;
#ifndef DEBUG_LOCKS
return (lockmgr(vp->v_vnlock, ap->a_flags, VI_MTX(vp), ap->a_td));
#else
return (debuglockmgr(vp->v_vnlock, ap->a_flags, VI_MTX(vp),
ap->a_td, "vop_stdlock", vp->filename, vp->line));
#endif
}
/* See above. */

View File

@ -779,18 +779,10 @@ vn_poll(fp, events, active_cred, td)
* acquire requested lock.
*/
int
#ifndef DEBUG_LOCKS
vn_lock(vp, flags, td)
#else
debug_vn_lock(vp, flags, td, filename, line)
#endif
struct vnode *vp;
int flags;
struct thread *td;
#ifdef DEBUG_LOCKS
const char *filename;
int line;
#endif
{
int error;
@ -809,10 +801,6 @@ debug_vn_lock(vp, flags, td, filename, line)
VI_UNLOCK(vp);
return (0);
}
#ifdef DEBUG_LOCKS
vp->filename = filename;
vp->line = line;
#endif
/*
* lockmgr drops interlock before it will return for
* any reason. So force the code above to relock it.

View File

@ -37,6 +37,10 @@
#ifndef _SYS_LOCKMGR_H_
#define _SYS_LOCKMGR_H_
#ifdef DEBUG_LOCKS
#include <sys/stack.h> /* XXX */
#endif
struct mtx;
/*
@ -56,14 +60,7 @@ struct lock {
struct thread *lk_lockholder; /* thread of exclusive lock holder */
struct lock *lk_newlock; /* lock taking over this lock */
#ifdef DEBUG_LOCKS
const char *lk_filename;
const char *lk_lockername;
int lk_lineno;
struct thread *lk_slockholder;
const char *lk_sfilename;
const char *lk_slockername;
int lk_slineno;
struct stack stack;
#endif
};
/*
@ -200,19 +197,8 @@ void lockinit(struct lock *, int prio, const char *wmesg,
int timo, int flags);
void lockdestroy(struct lock *);
#ifdef DEBUG_LOCKS
int debuglockmgr(struct lock *, u_int flags,
struct mtx *, struct thread *p,
const char *,
const char *,
int);
#define lockmgr(lockp, flags, slockp, proc) \
debuglockmgr((lockp), (flags), (slockp), (proc), \
"lockmgr", __FILE__, __LINE__)
#else
int lockmgr(struct lock *, u_int flags,
struct mtx *, struct thread *p);
#endif
void transferlockers(struct lock *, struct lock *);
void lockmgr_printinfo(struct lock *);
int lockstatus(struct lock *, struct thread *);

View File

@ -159,10 +159,6 @@ struct vnode {
struct lock v_lock; /* u (if fs don't have one) */
struct mtx v_interlock; /* lock for "i" things */
struct lock *v_vnlock; /* u pointer to vnode lock */
#ifdef DEBUG_LOCKS
const char *filename; /* Source file doing locking */
int line; /* Line number doing locking */
#endif
int v_holdcnt; /* i prevents recycling. */
int v_usecount; /* i ref count of users */
u_long v_iflag; /* i vnode flags (see below) */
@ -613,11 +609,6 @@ int vn_close(struct vnode *vp,
void vn_finished_write(struct mount *mp);
int vn_isdisk(struct vnode *vp, int *errp);
int vn_lock(struct vnode *vp, int flags, struct thread *td);
#ifdef DEBUG_LOCKS
int debug_vn_lock(struct vnode *vp, int flags, struct thread *p,
const char *filename, int line);
#define vn_lock(vp,flags,p) debug_vn_lock(vp,flags,p,__FILE__,__LINE__)
#endif
int vn_open(struct nameidata *ndp, int *flagp, int cmode, int fdidx);
int vn_open_cred(struct nameidata *ndp, int *flagp, int cmode,
struct ucred *cred, int fdidx);