- simplify ASSERT_SLEEPABLE.

- move it from proc.h to systm.h.
- add some more checks.
- make it a little more lkm friendly.
This commit is contained in:
yamt 2008-03-17 08:27:50 +00:00
parent 1ffbab1764
commit a67bae0b7b
11 changed files with 72 additions and 56 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: kern_lock.c,v 1.134 2008/01/30 14:54:26 ad Exp $ */
/* $NetBSD: kern_lock.c,v 1.135 2008/03/17 08:27:50 yamt Exp $ */
/*-
* Copyright (c) 2002, 2006, 2007, 2008 The NetBSD Foundation, Inc.
@ -38,7 +38,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: kern_lock.c,v 1.134 2008/01/30 14:54:26 ad Exp $");
__KERNEL_RCSID(0, "$NetBSD: kern_lock.c,v 1.135 2008/03/17 08:27:50 yamt Exp $");
#include "opt_multiprocessor.h"
@ -64,19 +64,37 @@ bool kernel_lock_dodebug;
__cpu_simple_lock_t kernel_lock[CACHE_LINE_SIZE / sizeof(__cpu_simple_lock_t)]
__aligned(CACHE_LINE_SIZE);
#if defined(LOCKDEBUG)
#if defined(DEBUG) || defined(LKM)
void
assert_sleepable(struct simplelock *interlock, const char *msg)
assert_sleepable(void)
{
#if !defined(_RUMPKERNEL)
const char *reason;
if (panicstr != NULL)
if (panicstr != NULL) {
return;
LOCKDEBUG_BARRIER(kernel_lock, 1);
if (CURCPU_IDLE_P() && !cold) {
panic("assert_sleepable: idle");
}
LOCKDEBUG_BARRIER(kernel_lock, 1);
reason = NULL;
if (CURCPU_IDLE_P() && !cold) {
reason = "idle";
}
if (cpu_intr_p()) {
reason = "interrupt";
}
if ((curlwp->l_pflag & LP_INTR) != 0) {
reason = "softint";
}
if (reason) {
panic("%s: %s caller=%p", __func__, reason,
(void *)RETURN_ADDRESS);
}
#endif /* !defined(_RUMPKERNEL) */
}
#endif
#endif /* defined(DEBUG) || defined(LKM) */
/*
* rump doesn't need the kernel lock so force it out. We cannot

View File

@ -1,4 +1,4 @@
/* $NetBSD: kern_malloc.c,v 1.117 2008/01/03 01:21:08 yamt Exp $ */
/* $NetBSD: kern_malloc.c,v 1.118 2008/03/17 08:27:50 yamt Exp $ */
/*
* Copyright (c) 1987, 1991, 1993
@ -66,7 +66,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: kern_malloc.c,v 1.117 2008/01/03 01:21:08 yamt Exp $");
__KERNEL_RCSID(0, "$NetBSD: kern_malloc.c,v 1.118 2008/03/17 08:27:50 yamt Exp $");
#include <sys/param.h>
#include <sys/proc.h>
@ -328,7 +328,7 @@ malloc(unsigned long size, struct malloc_type *ksp, int flags)
#ifdef LOCKDEBUG
if ((flags & M_NOWAIT) == 0)
ASSERT_SLEEPABLE(NULL, "malloc");
ASSERT_SLEEPABLE();
#endif
#ifdef MALLOC_DEBUG
if (debug_malloc(size, ksp, flags, (void *) &va)) {
@ -689,7 +689,7 @@ realloc(void *curaddr, unsigned long newsize, struct malloc_type *ksp,
#ifdef LOCKDEBUG
if ((flags & M_NOWAIT) == 0)
ASSERT_SLEEPABLE(NULL, "realloc");
ASSERT_SLEEPABLE();
#endif
/*

View File

@ -1,4 +1,4 @@
/* $NetBSD: kern_subr.c,v 1.182 2008/02/28 14:25:12 drochner Exp $ */
/* $NetBSD: kern_subr.c,v 1.183 2008/03/17 08:27:50 yamt Exp $ */
/*-
* Copyright (c) 1997, 1998, 1999, 2002, 2007, 2006 The NetBSD Foundation, Inc.
@ -86,7 +86,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: kern_subr.c,v 1.182 2008/02/28 14:25:12 drochner Exp $");
__KERNEL_RCSID(0, "$NetBSD: kern_subr.c,v 1.183 2008/03/17 08:27:50 yamt Exp $");
#include "opt_ddb.h"
#include "opt_md.h"
@ -160,7 +160,7 @@ uiomove(void *buf, size_t n, struct uio *uio)
int error = 0;
char *cp = buf;
ASSERT_SLEEPABLE(NULL, "uiomove");
ASSERT_SLEEPABLE();
#ifdef DIAGNOSTIC
if (uio->uio_rw != UIO_READ && uio->uio_rw != UIO_WRITE)

View File

@ -1,4 +1,4 @@
/* $NetBSD: subr_extent.c,v 1.69 2007/12/05 07:06:54 ad Exp $ */
/* $NetBSD: subr_extent.c,v 1.70 2008/03/17 08:27:50 yamt Exp $ */
/*-
* Copyright (c) 1996, 1998, 2007 The NetBSD Foundation, Inc.
@ -41,7 +41,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: subr_extent.c,v 1.69 2007/12/05 07:06:54 ad Exp $");
__KERNEL_RCSID(0, "$NetBSD: subr_extent.c,v 1.70 2008/03/17 08:27:50 yamt Exp $");
#ifdef _KERNEL
#include "opt_lockdebug.h"
@ -489,7 +489,7 @@ extent_alloc_region(struct extent *ex, u_long start, u_long size, int flags)
#endif
#ifdef LOCKDEBUG
if (flags & EX_WAITSPACE)
ASSERT_SLEEPABLE(NULL, "extent_alloc_region(EX_WAITSPACE)");
ASSERT_SLEEPABLE();
#endif
/*
@ -661,7 +661,7 @@ extent_alloc_subregion1(struct extent *ex, u_long substart, u_long subend,
#endif
#ifdef LOCKDEBUG
if (flags & EX_WAITSPACE)
ASSERT_SLEEPABLE(NULL, "extent_alloc_subregion1(EX_WAITSPACE)");
ASSERT_SLEEPABLE();
#endif
/*

View File

@ -1,4 +1,4 @@
/* $NetBSD: subr_percpu.c,v 1.2 2008/01/17 09:01:57 yamt Exp $ */
/* $NetBSD: subr_percpu.c,v 1.3 2008/03/17 08:27:50 yamt Exp $ */
/*-
* Copyright (c)2007,2008 YAMAMOTO Takashi,
@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: subr_percpu.c,v 1.2 2008/01/17 09:01:57 yamt Exp $");
__KERNEL_RCSID(0, "$NetBSD: subr_percpu.c,v 1.3 2008/03/17 08:27:50 yamt Exp $");
#include <sys/param.h>
#include <sys/cpu.h>
@ -159,7 +159,7 @@ percpu_backend_alloc(vmem_t *dummy, vmem_size_t size, vmem_size_t *resultsize,
unsigned int offset;
unsigned int nextoff;
ASSERT_SLEEPABLE(NULL, __func__);
ASSERT_SLEEPABLE();
KASSERT(dummy == NULL);
if ((vmflags & VM_NOSLEEP) != 0)
@ -204,7 +204,7 @@ void
percpu_init(void)
{
ASSERT_SLEEPABLE(NULL, __func__);
ASSERT_SLEEPABLE();
rw_init(&percpu_swap_lock);
mutex_init(&percpu_allocation_lock, MUTEX_DEFAULT, IPL_NONE);
@ -225,7 +225,7 @@ percpu_init_cpu(struct cpu_info *ci)
percpu_cpu_t * const pcc = cpu_percpu(ci);
size_t size = percpu_nextoff; /* XXX racy */
ASSERT_SLEEPABLE(NULL, __func__);
ASSERT_SLEEPABLE();
pcc->pcc_size = size;
if (size) {
pcc->pcc_data = kmem_zalloc(pcc->pcc_size, KM_SLEEP);
@ -246,7 +246,7 @@ percpu_alloc(size_t size)
unsigned int offset;
percpu_t *pc;
ASSERT_SLEEPABLE(NULL, __func__);
ASSERT_SLEEPABLE();
offset = vmem_alloc(percpu_offset_arena, size, VM_SLEEP | VM_BESTFIT);
pc = (percpu_t *)(uintptr_t)offset;
percpu_zero(pc, size);
@ -264,7 +264,7 @@ void
percpu_free(percpu_t *pc, size_t size)
{
ASSERT_SLEEPABLE(NULL, __func__);
ASSERT_SLEEPABLE();
vmem_free(percpu_offset_arena, (vmem_addr_t)percpu_offset(pc), size);
}
@ -303,7 +303,7 @@ void
percpu_traverse_enter(void)
{
ASSERT_SLEEPABLE(NULL, __func__);
ASSERT_SLEEPABLE();
rw_enter(&percpu_swap_lock, RW_READER);
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: subr_pool.c,v 1.153 2008/03/10 22:20:14 martin Exp $ */
/* $NetBSD: subr_pool.c,v 1.154 2008/03/17 08:27:50 yamt Exp $ */
/*-
* Copyright (c) 1997, 1999, 2000, 2002, 2007 The NetBSD Foundation, Inc.
@ -38,7 +38,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: subr_pool.c,v 1.153 2008/03/10 22:20:14 martin Exp $");
__KERNEL_RCSID(0, "$NetBSD: subr_pool.c,v 1.154 2008/03/17 08:27:50 yamt Exp $");
#include "opt_ddb.h"
#include "opt_pool.h"
@ -996,7 +996,7 @@ pool_get(struct pool *pp, int flags)
#endif /* DIAGNOSTIC */
#ifdef LOCKDEBUG
if (flags & PR_WAITOK)
ASSERT_SLEEPABLE(NULL, "pool_get(PR_WAITOK)");
ASSERT_SLEEPABLE();
#endif
mutex_enter(&pp->pr_lock);
@ -2522,7 +2522,7 @@ pool_cache_get_paddr(pool_cache_t pc, int flags, paddr_t *pap)
#ifdef LOCKDEBUG
if (flags & PR_WAITOK)
ASSERT_SLEEPABLE(NULL, "pool_cache_get(PR_WAITOK)");
ASSERT_SLEEPABLE();
#endif
cc = pool_cache_cpu_enter(pc, &s);

View File

@ -1,4 +1,4 @@
/* $NetBSD: subr_specificdata.c,v 1.11 2007/11/07 00:23:23 ad Exp $ */
/* $NetBSD: subr_specificdata.c,v 1.12 2008/03/17 08:27:50 yamt Exp $ */
/*-
* Copyright (c) 2006, 2007 The NetBSD Foundation, Inc.
@ -63,11 +63,10 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: subr_specificdata.c,v 1.11 2007/11/07 00:23:23 ad Exp $");
__KERNEL_RCSID(0, "$NetBSD: subr_specificdata.c,v 1.12 2008/03/17 08:27:50 yamt Exp $");
#include <sys/param.h>
#include <sys/kmem.h>
#include <sys/proc.h>
#include <sys/specificdata.h>
#include <sys/queue.h>
#include <sys/mutex.h>
@ -193,7 +192,7 @@ specificdata_key_create(specificdata_domain_t sd, specificdata_key_t *keyp,
specificdata_key_t key = 0;
size_t nsz;
ASSERT_SLEEPABLE(NULL, __func__);
ASSERT_SLEEPABLE();
if (dtor == NULL)
dtor = specificdata_noop_dtor;
@ -289,7 +288,7 @@ specificdata_fini(specificdata_domain_t sd, specificdata_reference *ref)
specificdata_container_t sc;
specificdata_key_t key;
ASSERT_SLEEPABLE(NULL, __func__);
ASSERT_SLEEPABLE();
mutex_destroy(&ref->specdataref_lock);
@ -367,7 +366,7 @@ specificdata_setspecific(specificdata_domain_t sd,
specificdata_container_t sc, newsc;
size_t newnkey, sz;
ASSERT_SLEEPABLE(NULL, __func__);
ASSERT_SLEEPABLE();
mutex_enter(&ref->specdataref_lock);

View File

@ -1,4 +1,4 @@
/* $NetBSD: subr_vmem.c,v 1.41 2008/01/24 13:57:52 ad Exp $ */
/* $NetBSD: subr_vmem.c,v 1.42 2008/03/17 08:27:50 yamt Exp $ */
/*-
* Copyright (c)2006 YAMAMOTO Takashi,
@ -38,7 +38,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: subr_vmem.c,v 1.41 2008/01/24 13:57:52 ad Exp $");
__KERNEL_RCSID(0, "$NetBSD: subr_vmem.c,v 1.42 2008/03/17 08:27:50 yamt Exp $");
#define VMEM_DEBUG
#if defined(_KERNEL)
@ -57,7 +57,6 @@ __KERNEL_RCSID(0, "$NetBSD: subr_vmem.c,v 1.41 2008/01/24 13:57:52 ad Exp $");
#include <sys/malloc.h>
#include <sys/once.h>
#include <sys/pool.h>
#include <sys/proc.h>
#include <sys/vmem.h>
#include <sys/workqueue.h>
#else /* defined(_KERNEL) */
@ -78,7 +77,7 @@ __KERNEL_RCSID(0, "$NetBSD: subr_vmem.c,v 1.41 2008/01/24 13:57:52 ad Exp $");
#define mutex_enter(a) /* nothing */
#define mutex_exit(a) /* nothing */
#define mutex_owned(a) /* nothing */
#define ASSERT_SLEEPABLE(lk, msg) /* nothing */
#define ASSERT_SLEEPABLE() /* nothing */
#define IPL_VM 0
#endif /* defined(_KERNEL) */
@ -857,7 +856,7 @@ vmem_alloc(vmem_t *vm, vmem_size_t size, vm_flag_t flags)
KASSERT(size > 0);
KASSERT(strat == VM_BESTFIT || strat == VM_INSTANTFIT);
if ((flags & VM_SLEEP) != 0) {
ASSERT_SLEEPABLE(NULL, __func__);
ASSERT_SLEEPABLE();
}
#if defined(QCACHE)
@ -892,7 +891,7 @@ vmem_xalloc(vmem_t *vm, vmem_size_t size0, vmem_size_t align, vmem_size_t phase,
KASSERT(size > 0);
KASSERT(strat == VM_BESTFIT || strat == VM_INSTANTFIT);
if ((flags & VM_SLEEP) != 0) {
ASSERT_SLEEPABLE(NULL, __func__);
ASSERT_SLEEPABLE();
}
KASSERT((align & vm->vm_quantum_mask) == 0);
KASSERT((align & (align - 1)) == 0);

View File

@ -1,4 +1,4 @@
/* $NetBSD: vfs_trans.c,v 1.17 2008/02/02 16:51:34 hannken Exp $ */
/* $NetBSD: vfs_trans.c,v 1.18 2008/03/17 08:27:50 yamt Exp $ */
/*-
* Copyright (c) 2007 The NetBSD Foundation, Inc.
@ -37,7 +37,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: vfs_trans.c,v 1.17 2008/02/02 16:51:34 hannken Exp $");
__KERNEL_RCSID(0, "$NetBSD: vfs_trans.c,v 1.18 2008/03/17 08:27:50 yamt Exp $");
/*
* File system transaction operations.
@ -177,7 +177,7 @@ _fstrans_start(struct mount *mp, enum fstrans_lock_type lock_type, int wait)
struct fstrans_lwp_info *fli, *new_fli;
struct fstrans_mount_info *fmi;
ASSERT_SLEEPABLE(NULL, __func__);
ASSERT_SLEEPABLE();
if (mp == NULL || (mp->mnt_iflag & IMNT_HAS_TRANS) == 0)
return 0;

View File

@ -1,4 +1,4 @@
/* $NetBSD: proc.h,v 1.270 2008/02/19 20:27:27 ad Exp $ */
/* $NetBSD: proc.h,v 1.271 2008/03/17 08:27:50 yamt Exp $ */
/*-
* Copyright (c) 2006, 2007, 2008 The NetBSD Foundation, Inc.
@ -579,13 +579,6 @@ _proclist_skipmarker(struct proc *p0)
((var) = _proclist_skipmarker(var)) != NULL; \
(var) = LIST_NEXT(var, p_list))
#if defined(LOCKDEBUG)
void assert_sleepable(struct simplelock *, const char *);
#define ASSERT_SLEEPABLE(lk, msg) assert_sleepable((lk), (msg))
#else /* defined(LOCKDEBUG) */
#define ASSERT_SLEEPABLE(lk, msg) /* nothing */
#endif /* defined(LOCKDEBUG) */
/* Compatibility with old, non-interlocked tsleep call */
#define tsleep(chan, pri, wmesg, timo) \
ltsleep(chan, pri, wmesg, timo, NULL)

View File

@ -1,4 +1,4 @@
/* $NetBSD: systm.h,v 1.214 2008/02/06 22:12:42 dsl Exp $ */
/* $NetBSD: systm.h,v 1.215 2008/03/17 08:27:50 yamt Exp $ */
/*-
* Copyright (c) 1982, 1988, 1991, 1993
@ -484,4 +484,11 @@ do { \
void crit_enter(void);
void crit_exit(void);
void assert_sleepable(void);
#if defined(DEBUG)
#define ASSERT_SLEEPABLE() assert_sleepable()
#else /* defined(DEBUG) */
#define ASSERT_SLEEPABLE() /* nothing */
#endif /* defined(DEBUG) */
#endif /* !_SYS_SYSTM_H_ */