diff --git a/sys/kern/kern_ktrace.c b/sys/kern/kern_ktrace.c index 30ba715dbed7..346251fcb20b 100644 --- a/sys/kern/kern_ktrace.c +++ b/sys/kern/kern_ktrace.c @@ -807,6 +807,36 @@ ktr_psig(int sig, sig_t action, const sigset_t *mask, ktraddentry(l, kte, KTA_WAITOK); } +#include +#include + +static void +formatsymbol(char *buf, size_t len, vaddr_t addr) +{ + unsigned long start; + char offset[32]; + const char *mod, *sym; + int s; + + s = pserialize_read_enter(); + if (ksyms_getname(&mod, &sym, addr, KSYMS_PROC|KSYMS_CLOSEST) != 0 || + ksyms_getval(mod, sym, &start, KSYMS_ANY) != 0) { + snprintf(buf, len, "0x%"PRIxVADDR, addr); + } else { + if (addr < start) { /* XXX ??? */ + snprintf(offset, sizeof(offset), "-%zx", + (size_t)(start - addr)); + } else if (addr == start) { + offset[0] = '\0'; + } else { + snprintf(offset, sizeof(offset), "-%zx", + (size_t)(addr - start)); + } + snprintf(buf, len, "%s:%s%s", mod, sym, offset); + } + pserialize_read_exit(s); +} + void ktr_csw(int out, int user, const struct syncobj *syncobj) { @@ -826,10 +856,16 @@ ktr_csw(int out, int user, const struct syncobj *syncobj) */ if (syncobj == &mutex_syncobj || syncobj == &rw_syncobj) return; - KASSERTMSG(!cpu_intr_p() && !cpu_softintr_p(), - "[%s] syncobj=%p mutex_syncobj=%p rw_syncobj=%p", - l->l_name ? l->l_name : p->p_comm, - syncobj, &mutex_syncobj, &rw_syncobj); + if (__predict_false(cpu_intr_p() || cpu_softintr_p())) { + char syncobj_sym[128]; + + formatsymbol(syncobj_sym, sizeof(syncobj_sym), + (vaddr_t)syncobj); + KASSERTMSG(!cpu_intr_p() && !cpu_softintr_p(), + "[%s] syncobj=%s mutex_syncobj=%p rw_syncobj=%p", + l->l_name ? l->l_name : p->p_comm, + syncobj_sym, &mutex_syncobj, &rw_syncobj); + } /* * We can't sleep if we're already going to sleep (if original diff --git a/sys/kern/kern_turnstile.c b/sys/kern/kern_turnstile.c index dc8e666aa896..5978f3afe964 100644 --- a/sys/kern/kern_turnstile.c +++ b/sys/kern/kern_turnstile.c @@ -384,6 +384,10 @@ turnstile_block(turnstile_t *ts, int q, wchan_t obj, syncobj_t *sobj) tc = &turnstile_chains[hash]; lock = &turnstile_locks[hash].lock; + KASSERTMSG(sobj == &mutex_syncobj || sobj == &rw_syncobj, + "sobj=%p mutex_syncobj=%p rw_syncobj=%p", + sobj, &mutex_syncobj, &rw_syncobj); + KASSERT(q == TS_READER_Q || q == TS_WRITER_Q); KASSERT(mutex_owned(lock)); KASSERT(l != NULL && l->l_ts != NULL); diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c index 695010d1da0a..650bbc1bebaa 100644 --- a/sys/kern/vfs_syscalls.c +++ b/sys/kern/vfs_syscalls.c @@ -543,6 +543,7 @@ do_sys_mount(struct lwp *l, const char *type, enum uio_seg type_seg, { struct vfsops *vfsops = NULL; /* XXX gcc4.8 */ struct vnode *vp; + bool in_fstrans = false; void *data_buf = data; bool vfsopsrele = false; size_t alloc_sz = 0; @@ -556,6 +557,8 @@ do_sys_mount(struct lwp *l, const char *type, enum uio_seg type_seg, vp = NULL; goto done; } + fstrans_start(vp->v_mount); + in_fstrans = true; if (flags & (MNT_GETARGS | MNT_UPDATE)) { vfsops = vp->v_mount->mnt_op; @@ -626,6 +629,8 @@ do_sys_mount(struct lwp *l, const char *type, enum uio_seg type_seg, done: if (vfsopsrele) vfs_delref(vfsops); + if (in_fstrans) + fstrans_done(vp->v_mount); if (vp != NULL) { vrele(vp); }