Module Name: src
Committed By: christos
Date: Thu Jan 26 04:11:56 UTC 2017
Modified Files:
src/sys/kern: kern_lock.c kern_mutex.c kern_rwlock.c subr_lockdebug.c
src/sys/sys: lockdebug.h
Log Message:
For LOCKDEBUG:
Always provide the location of the caller of the lock as __func__, __LINE__.
To generate a diff of this commit:
cvs rdiff -u -r1.157 -r1.158 src/sys/kern/kern_lock.c
cvs rdiff -u -r1.63 -r1.64 src/sys/kern/kern_mutex.c
cvs rdiff -u -r1.45 -r1.46 src/sys/kern/kern_rwlock.c
cvs rdiff -u -r1.54 -r1.55 src/sys/kern/subr_lockdebug.c
cvs rdiff -u -r1.14 -r1.15 src/sys/sys/lockdebug.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/kern/kern_lock.c
diff -u src/sys/kern/kern_lock.c:1.157 src/sys/kern/kern_lock.c:1.158
--- src/sys/kern/kern_lock.c:1.157 Sat Apr 11 11:24:25 2015
+++ src/sys/kern/kern_lock.c Wed Jan 25 23:11:56 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: kern_lock.c,v 1.157 2015/04/11 15:24:25 skrll Exp $ */
+/* $NetBSD: kern_lock.c,v 1.158 2017/01/26 04:11:56 christos Exp $ */
/*-
* Copyright (c) 2002, 2006, 2007, 2008, 2009 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_lock.c,v 1.157 2015/04/11 15:24:25 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_lock.c,v 1.158 2017/01/26 04:11:56 christos Exp $");
#include <sys/param.h>
#include <sys/proc.h>
@@ -101,7 +101,7 @@ assert_sleepable(void)
*/
#define _KERNEL_LOCK_ABORT(msg) \
- LOCKDEBUG_ABORT(kernel_lock, &_kernel_lock_ops, __func__, msg)
+ LOCKDEBUG_ABORT(__func__, __LINE__, kernel_lock, &_kernel_lock_ops, msg)
#ifdef LOCKDEBUG
#define _KERNEL_LOCK_ASSERT(cond) \
Index: src/sys/kern/kern_mutex.c
diff -u src/sys/kern/kern_mutex.c:1.63 src/sys/kern/kern_mutex.c:1.64
--- src/sys/kern/kern_mutex.c:1.63 Thu Jul 7 02:55:43 2016
+++ src/sys/kern/kern_mutex.c Wed Jan 25 23:11:56 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: kern_mutex.c,v 1.63 2016/07/07 06:55:43 msaitoh Exp $ */
+/* $NetBSD: kern_mutex.c,v 1.64 2017/01/26 04:11:56 christos Exp $ */
/*-
* Copyright (c) 2002, 2006, 2007, 2008 The NetBSD Foundation, Inc.
@@ -40,7 +40,7 @@
#define __MUTEX_PRIVATE
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_mutex.c,v 1.63 2016/07/07 06:55:43 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_mutex.c,v 1.64 2017/01/26 04:11:56 christos Exp $");
#include <sys/param.h>
#include <sys/atomic.h>
@@ -82,7 +82,7 @@ __KERNEL_RCSID(0, "$NetBSD: kern_mutex.c
LOCKDEBUG_UNLOCKED(MUTEX_DEBUG_P(mtx), (mtx), \
(uintptr_t)__builtin_return_address(0), 0)
#define MUTEX_ABORT(mtx, msg) \
- mutex_abort(mtx, __func__, msg)
+ mutex_abort(__func__, __LINE__, mtx, msg)
#if defined(LOCKDEBUG)
@@ -261,8 +261,8 @@ __strong_alias(mutex_spin_enter,mutex_ve
__strong_alias(mutex_spin_exit,mutex_vector_exit);
#endif
-static void mutex_abort(kmutex_t *, const char *, const char *);
-static void mutex_dump(volatile void *);
+static void mutex_abort(const char *, size_t, kmutex_t *, const char *);
+static void mutex_dump(volatile void *);
lockops_t mutex_spin_lockops = {
"Mutex",
@@ -307,11 +307,11 @@ mutex_dump(volatile void *cookie)
* we ask the compiler to not inline it.
*/
void __noinline
-mutex_abort(kmutex_t *mtx, const char *func, const char *msg)
+mutex_abort(const char *func, size_t line, kmutex_t *mtx, const char *msg)
{
- LOCKDEBUG_ABORT(mtx, (MUTEX_SPIN_P(mtx) ?
- &mutex_spin_lockops : &mutex_adaptive_lockops), func, msg);
+ LOCKDEBUG_ABORT(func, line, mtx, (MUTEX_SPIN_P(mtx) ?
+ &mutex_spin_lockops : &mutex_adaptive_lockops), msg);
}
/*
Index: src/sys/kern/kern_rwlock.c
diff -u src/sys/kern/kern_rwlock.c:1.45 src/sys/kern/kern_rwlock.c:1.46
--- src/sys/kern/kern_rwlock.c:1.45 Fri Nov 28 03:28:17 2014
+++ src/sys/kern/kern_rwlock.c Wed Jan 25 23:11:56 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: kern_rwlock.c,v 1.45 2014/11/28 08:28:17 uebayasi Exp $ */
+/* $NetBSD: kern_rwlock.c,v 1.46 2017/01/26 04:11:56 christos Exp $ */
/*-
* Copyright (c) 2002, 2006, 2007, 2008, 2009 The NetBSD Foundation, Inc.
@@ -38,7 +38,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_rwlock.c,v 1.45 2014/11/28 08:28:17 uebayasi Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_rwlock.c,v 1.46 2017/01/26 04:11:56 christos Exp $");
#define __RWLOCK_PRIVATE
@@ -73,7 +73,7 @@ __KERNEL_RCSID(0, "$NetBSD: kern_rwlock.
#define RW_DASSERT(rw, cond) \
do { \
if (!(cond)) \
- rw_abort(rw, __func__, "assertion failed: " #cond); \
+ rw_abort(__func__, __LINE__, rw, "assertion failed: " #cond);\
} while (/* CONSTCOND */ 0);
#else /* LOCKDEBUG */
@@ -94,7 +94,7 @@ do { \
#define RW_ASSERT(rw, cond) \
do { \
if (!(cond)) \
- rw_abort(rw, __func__, "assertion failed: " #cond); \
+ rw_abort(__func__, __LINE__, rw, "assertion failed: " #cond);\
} while (/* CONSTCOND */ 0)
#else
@@ -111,7 +111,7 @@ do { \
#define RW_INHERITDEBUG(n, o) /* nothing */
#endif /* defined(LOCKDEBUG) */
-static void rw_abort(krwlock_t *, const char *, const char *);
+static void rw_abort(const char *, size_t, krwlock_t *, const char *);
static void rw_dump(volatile void *);
static lwp_t *rw_owner(wchan_t);
@@ -183,13 +183,13 @@ rw_dump(volatile void *cookie)
* we ask the compiler to not inline it.
*/
static void __noinline
-rw_abort(krwlock_t *rw, const char *func, const char *msg)
+rw_abort(const char *func, size_t line, krwlock_t *rw, const char *msg)
{
if (panicstr != NULL)
return;
- LOCKDEBUG_ABORT(rw, &rwlock_lockops, func, msg);
+ LOCKDEBUG_ABORT(func, line, rw, &rwlock_lockops, msg);
}
/*
@@ -338,7 +338,8 @@ rw_vector_enter(krwlock_t *rw, const krw
return;
}
if (__predict_false(RW_OWNER(rw) == curthread)) {
- rw_abort(rw, __func__, "locking against myself");
+ rw_abort(__func__, __LINE__, rw,
+ "locking against myself");
}
/*
* If the lock owner is running on another CPU, and
Index: src/sys/kern/subr_lockdebug.c
diff -u src/sys/kern/subr_lockdebug.c:1.54 src/sys/kern/subr_lockdebug.c:1.55
--- src/sys/kern/subr_lockdebug.c:1.54 Mon Sep 28 21:44:57 2015
+++ src/sys/kern/subr_lockdebug.c Wed Jan 25 23:11:56 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: subr_lockdebug.c,v 1.54 2015/09/29 01:44:57 ozaki-r Exp $ */
+/* $NetBSD: subr_lockdebug.c,v 1.55 2017/01/26 04:11:56 christos Exp $ */
/*-
* Copyright (c) 2006, 2007, 2008 The NetBSD Foundation, Inc.
@@ -34,7 +34,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: subr_lockdebug.c,v 1.54 2015/09/29 01:44:57 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: subr_lockdebug.c,v 1.55 2017/01/26 04:11:56 christos Exp $");
#ifdef _KERNEL_OPT
#include "opt_ddb.h"
@@ -99,8 +99,8 @@ int ld_recurse;
bool ld_nomore;
lockdebug_t ld_prime[LD_BATCH];
-static void lockdebug_abort1(lockdebug_t *, int, const char *,
- const char *, bool);
+static void lockdebug_abort1(const char *, size_t, lockdebug_t *, int,
+ const char *, bool);
static int lockdebug_more(int);
static void lockdebug_init(void);
static void lockdebug_dump(lockdebug_t *, void (*)(const char *, ...)
@@ -190,14 +190,15 @@ lockdebug_unlock_cpus(void)
* Find a lockdebug structure by a pointer to a lock and return it locked.
*/
static inline lockdebug_t *
-lockdebug_lookup(volatile void *lock, uintptr_t where)
+lockdebug_lookup(const char *func, size_t line, volatile void *lock,
+ uintptr_t where)
{
lockdebug_t *ld;
ld = lockdebug_lookup1(lock);
if (ld == NULL) {
- panic("lockdebug_lookup: uninitialized lock "
- "(lock=%p, from=%08"PRIxPTR")", lock, where);
+ panic("%s,%zu: uninitialized lock (lock=%p, from=%08"
+ PRIxPTR ")", func, line, lock, where);
}
return ld;
}
@@ -238,7 +239,8 @@ lockdebug_init(void)
* structure.
*/
bool
-lockdebug_alloc(volatile void *lock, lockops_t *lo, uintptr_t initaddr)
+lockdebug_alloc(const char *func, size_t line, volatile void *lock,
+ lockops_t *lo, uintptr_t initaddr)
{
struct cpu_info *ci;
lockdebug_t *ld;
@@ -253,7 +255,8 @@ lockdebug_alloc(volatile void *lock, loc
__cpu_simple_lock(&ld_mod_lk);
if ((ld = lockdebug_lookup1(lock)) != NULL) {
__cpu_simple_unlock(&ld_mod_lk);
- lockdebug_abort1(ld, s, __func__, "already initialized", true);
+ lockdebug_abort1(func, line, ld, s, "already initialized",
+ true);
return false;
}
@@ -288,7 +291,7 @@ lockdebug_alloc(volatile void *lock, loc
ci->ci_lkdebug_recurse--;
if (ld->ld_lock != NULL) {
- panic("lockdebug_alloc: corrupt table ld %p", ld);
+ panic("%s,%zu: corrupt table ld %p", func, line, ld);
}
/* Initialise the structure. */
@@ -314,7 +317,7 @@ lockdebug_alloc(volatile void *lock, loc
* A lock is being destroyed, so release debugging resources.
*/
void
-lockdebug_free(volatile void *lock)
+lockdebug_free(const char *func, size_t line, volatile void *lock)
{
lockdebug_t *ld;
int s;
@@ -324,16 +327,18 @@ lockdebug_free(volatile void *lock)
s = splhigh();
__cpu_simple_lock(&ld_mod_lk);
- ld = lockdebug_lookup(lock, (uintptr_t) __builtin_return_address(0));
+ ld = lockdebug_lookup(func, line, lock,
+ (uintptr_t) __builtin_return_address(0));
if (ld == NULL) {
__cpu_simple_unlock(&ld_mod_lk);
- panic("lockdebug_free: destroying uninitialized object %p"
- "(ld_lock=%p)", lock, ld->ld_lock);
+ panic("%s,%zu: destroying uninitialized object %p"
+ "(ld_lock=%p)", func, line, lock, ld->ld_lock);
return;
}
if ((ld->ld_flags & LD_LOCKED) != 0 || ld->ld_shares != 0) {
__cpu_simple_unlock(&ld_mod_lk);
- lockdebug_abort1(ld, s, __func__, "is locked or in use", true);
+ lockdebug_abort1(func, line, ld, s, "is locked or in use",
+ true);
return;
}
lockdebug_lock_cpus();
@@ -415,7 +420,8 @@ lockdebug_more(int s)
* Process the preamble to a lock acquire.
*/
void
-lockdebug_wantlock(volatile void *lock, uintptr_t where, int shared)
+lockdebug_wantlock(const char *func, size_t line,
+ volatile void *lock, uintptr_t where, int shared)
{
struct lwp *l = curlwp;
lockdebug_t *ld;
@@ -429,7 +435,7 @@ lockdebug_wantlock(volatile void *lock,
return;
s = splhigh();
- if ((ld = lockdebug_lookup(lock, where)) == NULL) {
+ if ((ld = lockdebug_lookup(func, line, lock, where)) == NULL) {
splx(s);
return;
}
@@ -442,7 +448,7 @@ lockdebug_wantlock(volatile void *lock,
}
if (cpu_intr_p()) {
if ((ld->ld_flags & LD_SLEEPER) != 0) {
- lockdebug_abort1(ld, s, __func__,
+ lockdebug_abort1(func, line, ld, s,
"acquiring sleep lock from interrupt context",
true);
return;
@@ -453,7 +459,7 @@ lockdebug_wantlock(volatile void *lock,
else
ld->ld_exwant++;
if (recurse) {
- lockdebug_abort1(ld, s, __func__, "locking against myself",
+ lockdebug_abort1(func, line, ld, s, "locking against myself",
true);
return;
}
@@ -467,8 +473,8 @@ lockdebug_wantlock(volatile void *lock,
* Process a lock acquire operation.
*/
void
-lockdebug_locked(volatile void *lock, void *cvlock, uintptr_t where,
- int shared)
+lockdebug_locked(const char *func, size_t line,
+ volatile void *lock, void *cvlock, uintptr_t where, int shared)
{
struct lwp *l = curlwp;
lockdebug_t *ld;
@@ -478,7 +484,7 @@ lockdebug_locked(volatile void *lock, vo
return;
s = splhigh();
- if ((ld = lockdebug_lookup(lock, where)) == NULL) {
+ if ((ld = lockdebug_lookup(func, line, lock, where)) == NULL) {
splx(s);
return;
}
@@ -489,8 +495,9 @@ lockdebug_locked(volatile void *lock, vo
} else if (ld->ld_shares++ == 0) {
ld->ld_locked = (uintptr_t)cvlock;
} else if (cvlock != (void *)ld->ld_locked) {
- lockdebug_abort1(ld, s, __func__, "multiple locks used"
- " with condition variable", true);
+ lockdebug_abort1(func, line, ld, s,
+ "multiple locks used with condition variable",
+ true);
return;
}
} else if (shared) {
@@ -500,7 +507,7 @@ lockdebug_locked(volatile void *lock, vo
ld->ld_shwant--;
} else {
if ((ld->ld_flags & LD_LOCKED) != 0) {
- lockdebug_abort1(ld, s, __func__, "already locked",
+ lockdebug_abort1(func, line, ld, s, "already locked",
true);
return;
}
@@ -526,7 +533,8 @@ lockdebug_locked(volatile void *lock, vo
* Process a lock release operation.
*/
void
-lockdebug_unlocked(volatile void *lock, uintptr_t where, int shared)
+lockdebug_unlocked(const char *func, size_t line,
+ volatile void *lock, uintptr_t where, int shared)
{
struct lwp *l = curlwp;
lockdebug_t *ld;
@@ -536,7 +544,7 @@ lockdebug_unlocked(volatile void *lock,
return;
s = splhigh();
- if ((ld = lockdebug_lookup(lock, where)) == NULL) {
+ if ((ld = lockdebug_lookup(func, line, lock, where)) == NULL) {
splx(s);
return;
}
@@ -548,12 +556,12 @@ lockdebug_unlocked(volatile void *lock,
}
} else if (shared) {
if (l->l_shlocks == 0) {
- lockdebug_abort1(ld, s, __func__,
+ lockdebug_abort1(func, line, ld, s,
"no shared locks held by LWP", true);
return;
}
if (ld->ld_shares == 0) {
- lockdebug_abort1(ld, s, __func__,
+ lockdebug_abort1(func, line, ld, s,
"no shared holds on this lock", true);
return;
}
@@ -567,20 +575,20 @@ lockdebug_unlocked(volatile void *lock,
ld->ld_cpu = (uint16_t)-1;
} else {
if ((ld->ld_flags & LD_LOCKED) == 0) {
- lockdebug_abort1(ld, s, __func__, "not locked", true);
+ lockdebug_abort1(func, line, ld, s, "not locked", true);
return;
}
if ((ld->ld_flags & LD_SLEEPER) != 0) {
if (ld->ld_lwp != curlwp) {
- lockdebug_abort1(ld, s, __func__,
+ lockdebug_abort1(func, line, ld, s,
"not held by current LWP", true);
return;
}
TAILQ_REMOVE(&l->l_ld_locks, ld, ld_chain);
} else {
if (ld->ld_cpu != (uint16_t)cpu_index(curcpu())) {
- lockdebug_abort1(ld, s, __func__,
+ lockdebug_abort1(func, line, ld, s,
"not held by current CPU", true);
return;
}
@@ -601,7 +609,8 @@ lockdebug_unlocked(volatile void *lock,
* Process a wakeup on a condition variable.
*/
void
-lockdebug_wakeup(volatile void *lock, uintptr_t where)
+lockdebug_wakeup(const char *func, size_t line, volatile void *lock,
+ uintptr_t where)
{
lockdebug_t *ld;
int s;
@@ -611,7 +620,7 @@ lockdebug_wakeup(volatile void *lock, ui
s = splhigh();
/* Find the CV... */
- if ((ld = lockdebug_lookup(lock, where)) == NULL) {
+ if ((ld = lockdebug_lookup(func, line, lock, where)) == NULL) {
splx(s);
return;
}
@@ -620,7 +629,7 @@ lockdebug_wakeup(volatile void *lock, ui
* same interlock.
*/
if (ld->ld_shares != 0 && !mutex_owned((kmutex_t *)ld->ld_locked)) {
- lockdebug_abort1(ld, s, __func__, "interlocking mutex not "
+ lockdebug_abort1(func, line, ld, s, "interlocking mutex not "
"held during wakeup", true);
return;
}
@@ -635,7 +644,8 @@ lockdebug_wakeup(volatile void *lock, ui
* if we hold sleep locks.
*/
void
-lockdebug_barrier(volatile void *spinlock, int slplocks)
+lockdebug_barrier(const char *func, size_t line, volatile void *spinlock,
+ int slplocks)
{
struct lwp *l = curlwp;
lockdebug_t *ld;
@@ -651,7 +661,7 @@ lockdebug_barrier(volatile void *spinloc
continue;
}
__cpu_simple_lock(&ld->ld_spinlock);
- lockdebug_abort1(ld, s, __func__,
+ lockdebug_abort1(func, line, ld, s,
"spin lock held", true);
return;
}
@@ -662,7 +672,7 @@ lockdebug_barrier(volatile void *spinloc
}
if ((ld = TAILQ_FIRST(&l->l_ld_locks)) != NULL) {
__cpu_simple_lock(&ld->ld_spinlock);
- lockdebug_abort1(ld, s, __func__, "sleep lock held", true);
+ lockdebug_abort1(func, line, ld, s, "sleep lock held", true);
return;
}
splx(s);
@@ -673,7 +683,8 @@ lockdebug_barrier(volatile void *spinloc
if (ld->ld_lwp == l)
lockdebug_dump(ld, printf);
}
- panic("%s: holding %d shared locks", __func__, l->l_shlocks);
+ panic("%s,%zu: holding %d shared locks", func, line,
+ l->l_shlocks);
}
}
@@ -684,7 +695,7 @@ lockdebug_barrier(volatile void *spinloc
* being freed.
*/
void
-lockdebug_mem_check(const char *func, void *base, size_t sz)
+lockdebug_mem_check(const char *func, size_t line, void *base, size_t sz)
{
lockdebug_t *ld;
struct cpu_info *ci;
@@ -701,15 +712,15 @@ lockdebug_mem_check(const char *func, vo
const uintptr_t lock = (uintptr_t)ld->ld_lock;
if ((uintptr_t)base > lock)
- panic("%s: corrupt tree ld=%p, base=%p, sz=%zu",
- __func__, ld, base, sz);
+ panic("%s,%zu: corrupt tree ld=%p, base=%p, sz=%zu",
+ func, line, ld, base, sz);
if (lock >= (uintptr_t)base + sz)
ld = NULL;
}
__cpu_simple_unlock(&ci->ci_data.cpu_ld_lock);
if (ld != NULL) {
__cpu_simple_lock(&ld->ld_spinlock);
- lockdebug_abort1(ld, s, func,
+ lockdebug_abort1(func, line, ld, s,
"allocation contains active lock", !cold);
return;
}
@@ -767,7 +778,7 @@ lockdebug_dump(lockdebug_t *ld, void (*p
* An error has been trapped - dump lock info and panic.
*/
static void
-lockdebug_abort1(lockdebug_t *ld, int s, const char *func,
+lockdebug_abort1(const char *func, size_t line, lockdebug_t *ld, int s,
const char *msg, bool dopanic)
{
@@ -782,15 +793,15 @@ lockdebug_abort1(lockdebug_t *ld, int s,
return;
}
- printf_nolog("%s error: %s: %s\n\n", ld->ld_lockops->lo_name,
- func, msg);
+ printf_nolog("%s error: %s,%zu: %s\n\n", ld->ld_lockops->lo_name,
+ func, line, msg);
lockdebug_dump(ld, printf_nolog);
__cpu_simple_unlock(&ld->ld_spinlock);
splx(s);
printf_nolog("\n");
if (dopanic)
- panic("LOCKDEBUG: %s error: %s: %s", ld->ld_lockops->lo_name,
- func, msg);
+ panic("LOCKDEBUG: %s error: %s,%zu: %s",
+ ld->ld_lockops->lo_name, func, line, msg);
}
#endif /* LOCKDEBUG */
@@ -832,17 +843,17 @@ lockdebug_lock_print(void *addr, void (*
* An error has been trapped - dump lock info and call panic().
*/
void
-lockdebug_abort(volatile void *lock, lockops_t *ops, const char *func,
- const char *msg)
+lockdebug_abort(const char *func, size_t line, volatile void *lock,
+ lockops_t *ops, const char *msg)
{
#ifdef LOCKDEBUG
lockdebug_t *ld;
int s;
s = splhigh();
- if ((ld = lockdebug_lookup(lock,
+ if ((ld = lockdebug_lookup(func, line, lock,
(uintptr_t) __builtin_return_address(0))) != NULL) {
- lockdebug_abort1(ld, s, func, msg, true);
+ lockdebug_abort1(func, line, ld, s, msg, true);
return;
}
splx(s);
@@ -854,16 +865,16 @@ lockdebug_abort(volatile void *lock, loc
* is going down in flames.
*/
if (atomic_inc_uint_nv(&ld_panic) == 1) {
- printf_nolog("%s error: %s: %s\n\n"
+ printf_nolog("%s error: %s,%zu: %s\n\n"
"lock address : %#018lx\n"
"current cpu : %18d\n"
"current lwp : %#018lx\n",
- ops->lo_name, func, msg, (long)lock,
+ ops->lo_name, func, line, msg, (long)lock,
(int)cpu_index(curcpu()), (long)curlwp);
(*ops->lo_dump)(lock);
printf_nolog("\n");
}
- panic("lock error: %s: %s: %s: lock %p cpu %d lwp %p",
- ops->lo_name, func, msg, lock, cpu_index(curcpu()), curlwp);
+ panic("lock error: %s: %s,%zu: %s: lock %p cpu %d lwp %p",
+ ops->lo_name, func, line, msg, lock, cpu_index(curcpu()), curlwp);
}
Index: src/sys/sys/lockdebug.h
diff -u src/sys/sys/lockdebug.h:1.14 src/sys/sys/lockdebug.h:1.15
--- src/sys/sys/lockdebug.h:1.14 Sat Apr 27 04:12:34 2013
+++ src/sys/sys/lockdebug.h Wed Jan 25 23:11:56 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: lockdebug.h,v 1.14 2013/04/27 08:12:34 mlelstv Exp $ */
+/* $NetBSD: lockdebug.h,v 1.15 2017/01/26 04:11:56 christos Exp $ */
/*-
* Copyright (c) 2006, 2007, 2008 The NetBSD Foundation, Inc.
@@ -50,39 +50,46 @@ typedef struct lockops {
void (*lo_dump)(volatile void *);
} lockops_t;
-#define LOCKDEBUG_ABORT(l, o, f, m) lockdebug_abort(l, o, f, m)
+#define LOCKDEBUG_ABORT(f, ln, l, o, m) \
+ lockdebug_abort(f, ln, l, o, m)
-void lockdebug_abort(volatile void *, lockops_t *,
- const char *, const char *);
+void lockdebug_abort(const char *, size_t, volatile void *, lockops_t *,
+ const char *);
void lockdebug_lock_print(void *, void (*)(const char *, ...)
__printflike(1, 2));
#ifdef LOCKDEBUG
-bool lockdebug_alloc(volatile void *, lockops_t *, uintptr_t);
-void lockdebug_free(volatile void *);
-void lockdebug_wantlock(volatile void *, uintptr_t, int);
-void lockdebug_locked(volatile void *, void *, uintptr_t, int);
-void lockdebug_unlocked(volatile void *, uintptr_t, int);
-void lockdebug_barrier(volatile void *, int);
-void lockdebug_mem_check(const char *, void *, size_t);
-void lockdebug_wakeup(volatile void *, uintptr_t);
+bool lockdebug_alloc(const char *, size_t, volatile void *, lockops_t *,
+ uintptr_t);
+void lockdebug_free(const char *, size_t, volatile void *);
+void lockdebug_wantlock(const char *, size_t, volatile void *, uintptr_t,
+ int);
+void lockdebug_locked(const char *, size_t, volatile void *, void *,
+ uintptr_t, int);
+void lockdebug_unlocked(const char *, size_t, volatile void *,
+ uintptr_t, int);
+void lockdebug_barrier(const char *, size_t, volatile void *, int);
+void lockdebug_mem_check(const char *, size_t, void *, size_t);
+void lockdebug_wakeup(const char *, size_t, volatile void *, uintptr_t);
-#define LOCKDEBUG_ALLOC(lock, ops, addr) lockdebug_alloc(lock, ops, addr)
+#define LOCKDEBUG_ALLOC(lock, ops, addr) \
+ lockdebug_alloc(__func__, __LINE__, lock, ops, addr)
#define LOCKDEBUG_FREE(dodebug, lock) \
- if (dodebug) lockdebug_free(lock)
+ if (dodebug) lockdebug_free(__func__, __LINE__, lock)
#define LOCKDEBUG_WANTLOCK(dodebug, lock, where, s) \
- if (dodebug) lockdebug_wantlock(lock, where, s)
+ if (dodebug) lockdebug_wantlock(__func__, __LINE__, lock, where, s)
#define LOCKDEBUG_LOCKED(dodebug, lock, al, where, s) \
- if (dodebug) lockdebug_locked(lock, al, where, s)
+ if (dodebug) lockdebug_locked(__func__, __LINE__, lock, al, where, s)
#define LOCKDEBUG_UNLOCKED(dodebug, lock, where, s) \
- if (dodebug) lockdebug_unlocked(lock, where, s)
-#define LOCKDEBUG_BARRIER(lock, slp) lockdebug_barrier(lock, slp)
+ if (dodebug) lockdebug_unlocked(__func__, __LINE__, lock, where, s)
+#define LOCKDEBUG_BARRIER(lock, slp) \
+ lockdebug_barrier(__func__, __LINE__, lock, slp)
#define LOCKDEBUG_MEM_CHECK(base, sz) \
- lockdebug_mem_check(__func__, base, sz)
+ lockdebug_mem_check(__func__, __LINE__, base, sz)
#define LOCKDEBUG_WAKEUP(dodebug, lock, where) \
- if (dodebug) lockdebug_wakeup(lock, where)
+ if (dodebug) lockdebug_wakeup(__func__, __LINE__, lock, where)
#else /* LOCKDEBUG */