From f2770c70dd9946fbd886a25a9b4c75141137bc80 Mon Sep 17 00:00:00 2001 From: Matthew Dillon Date: Thu, 2 Mar 2006 19:08:00 +0000 Subject: [PATCH] Pass LK_PCATCH instead of trying to store tsleep flags in the lock structure, so multiple entities competing for the same lock do not use unexpected flags when sleeping. Only NFS really uses PCATCH with lockmgr locks. --- sys/bus/usb/ehci.c | 4 ++-- sys/dev/agp/agp.c | 16 ++++++++-------- sys/dev/drm/drm_drv.h | 4 ++-- sys/dev/pccard/pccbb/pccbb.c | 4 ++-- sys/kern/imgact_resident.c | 4 ++-- sys/kern/kern_linker.c | 4 ++-- sys/kern/kern_lock.c | 21 +++++++++++---------- sys/kern/kern_sysctl.c | 6 +++--- sys/kern/vfs_bio.c | 12 ++++++++---- sys/kern/vfs_lock.c | 6 +++--- sys/kern/vfs_mount.c | 4 ++-- sys/kern/vfs_subr.c | 13 +++++++------ sys/kern/vfs_syscalls.c | 4 ++-- sys/netproto/ncp/ncp_conn.c | 8 ++++---- sys/netproto/smb/smb_conn.c | 4 ++-- sys/sys/buf2.h | 13 +++++++------ sys/sys/lock.h | 11 ++++++----- sys/vfs/hpfs/hpfs_hash.c | 4 ++-- sys/vfs/nfs/nfs_node.c | 10 +++++----- sys/vfs/nfs/nfs_vnops.c | 11 ++++++----- sys/vfs/ntfs/ntfs_ihash.c | 4 ++-- sys/vfs/ntfs/ntfs_subr.c | 6 +++--- sys/vfs/nwfs/nwfs_node.c | 6 +++--- sys/vfs/smbfs/smbfs_vfsops.c | 4 ++-- sys/vm/vm_map.c | 4 ++-- 25 files changed, 98 insertions(+), 89 deletions(-) diff --git a/sys/bus/usb/ehci.c b/sys/bus/usb/ehci.c index 73bb124d7b..5877ee43b7 100644 --- a/sys/bus/usb/ehci.c +++ b/sys/bus/usb/ehci.c @@ -1,7 +1,7 @@ /* * $NetBSD: ehci.c,v 1.67 2004/07/06 04:18:05 mycroft Exp $ * $FreeBSD: src/sys/dev/usb/ehci.c,v 1.5 2003/11/10 00:20:52 joe Exp $ - * $DragonFly: src/sys/bus/usb/ehci.c,v 1.16 2006/01/22 14:03:51 swildner Exp $ + * $DragonFly: src/sys/bus/usb/ehci.c,v 1.17 2006/03/02 19:07:54 dillon Exp $ */ /* @@ -449,7 +449,7 @@ ehci_init(ehci_softc_t *sc) usb_callout_init(sc->sc_tmo_pcd); - lockinit(&sc->sc_doorbell_lock, 0, "ehcidb", 0, 0); + lockinit(&sc->sc_doorbell_lock, "ehcidb", 0, 0); /* Turn on controller */ EOWRITE4(sc, EHCI_USBCMD, diff --git a/sys/dev/agp/agp.c b/sys/dev/agp/agp.c index 8c990674a1..79ce11cacc 100644 --- a/sys/dev/agp/agp.c +++ b/sys/dev/agp/agp.c @@ -24,7 +24,7 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/pci/agp.c,v 1.3.2.4 2002/08/11 19:58:12 alc Exp $ - * $DragonFly: src/sys/dev/agp/agp.c,v 1.16 2005/12/11 01:54:07 swildner Exp $ + * $DragonFly: src/sys/dev/agp/agp.c,v 1.17 2006/03/02 19:07:56 dillon Exp $ */ #include "opt_bus.h" @@ -251,7 +251,7 @@ agp_generic_attach(device_t dev) * The lock is used to prevent re-entry to * agp_generic_bind_memory() since that function can sleep. */ - lockinit(&sc->as_lock, PCATCH, "agplk", 0, 0); + lockinit(&sc->as_lock, "agplk", 0, 0); /* * Initialise stuff for the userland device. @@ -272,7 +272,7 @@ agp_generic_detach(device_t dev) { struct agp_softc *sc = device_get_softc(dev); bus_release_resource(dev, SYS_RES_MEMORY, AGP_APBASE, sc->as_aperture); - lockmgr(&sc->as_lock, LK_DRAIN, NULL, curthread); /* XXX */ + lockmgr(&sc->as_lock, LK_DRAIN | LK_PCATCH, NULL, curthread); /* XXX */ agp_flush_cache(); cdevsw_remove(&agp_cdevsw, -1, device_get_unit(dev)); return 0; @@ -485,7 +485,7 @@ agp_generic_bind_memory(device_t dev, struct agp_memory *mem, vm_page_t m; int error; - lockmgr(&sc->as_lock, LK_EXCLUSIVE, NULL, curthread); /* XXX */ + lockmgr(&sc->as_lock, LK_EXCLUSIVE | LK_PCATCH, NULL, curthread); /* XXX */ if (mem->am_is_bound) { device_printf(dev, "memory already bound\n"); @@ -546,7 +546,7 @@ agp_generic_bind_memory(device_t dev, struct agp_memory *mem, OFF_TO_IDX(k)); vm_page_unwire(m, 0); } - lockmgr(&sc->as_lock, LK_RELEASE, NULL, curthread); /* XXX */ + lockmgr(&sc->as_lock, LK_RELEASE | LK_PCATCH, NULL, curthread); /* XXX */ return error; } } @@ -567,7 +567,7 @@ agp_generic_bind_memory(device_t dev, struct agp_memory *mem, mem->am_offset = offset; mem->am_is_bound = 1; - lockmgr(&sc->as_lock, LK_RELEASE, NULL, curthread); /* XXX */ + lockmgr(&sc->as_lock, LK_RELEASE | LK_PCATCH, NULL, curthread); /* XXX */ return 0; } @@ -579,7 +579,7 @@ agp_generic_unbind_memory(device_t dev, struct agp_memory *mem) vm_page_t m; int i; - lockmgr(&sc->as_lock, LK_EXCLUSIVE, NULL, curthread); /* XXX */ + lockmgr(&sc->as_lock, LK_EXCLUSIVE | LK_PCATCH, NULL, curthread); /* XXX */ if (!mem->am_is_bound) { device_printf(dev, "memory is not bound\n"); @@ -604,7 +604,7 @@ agp_generic_unbind_memory(device_t dev, struct agp_memory *mem) mem->am_offset = 0; mem->am_is_bound = 0; - lockmgr(&sc->as_lock, LK_RELEASE, NULL, curthread); /* XXX */ + lockmgr(&sc->as_lock, LK_RELEASE | LK_PCATCH, NULL, curthread); /* XXX */ return 0; } diff --git a/sys/dev/drm/drm_drv.h b/sys/dev/drm/drm_drv.h index e88044d433..0139d63a57 100644 --- a/sys/dev/drm/drm_drv.h +++ b/sys/dev/drm/drm_drv.h @@ -29,7 +29,7 @@ * Gareth Hughes * * $FreeBSD: src/sys/dev/drm/drm_drv.h,v 1.13.2.1 2003/04/26 07:05:28 anholt Exp $ - * $DragonFly: src/sys/dev/drm/Attic/drm_drv.h,v 1.11 2005/03/01 00:43:02 corecode Exp $ + * $DragonFly: src/sys/dev/drm/Attic/drm_drv.h,v 1.12 2006/03/02 19:07:57 dillon Exp $ */ /* @@ -666,7 +666,7 @@ static int DRM(init)( device_t nbdev ) unit = minor(dev->device.dv_unit); #endif DRM_SPININIT(dev->count_lock, "drm device"); - lockinit(&dev->dev_lock, 0, "drmlk", 0, 0); + lockinit(&dev->dev_lock, "drmlk", 0, 0); dev->name = DRIVER_NAME; DRM(mem_init)(); DRM(sysctl_init)(dev); diff --git a/sys/dev/pccard/pccbb/pccbb.c b/sys/dev/pccard/pccbb/pccbb.c index 67ace82ac1..e9f576bf62 100644 --- a/sys/dev/pccard/pccbb/pccbb.c +++ b/sys/dev/pccard/pccbb/pccbb.c @@ -27,7 +27,7 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/dev/pccbb/pccbb.c,v 1.64 2002/11/23 23:09:45 imp Exp $ - * $DragonFly: src/sys/dev/pccard/pccbb/pccbb.c,v 1.12 2005/12/19 01:18:58 dillon Exp $ + * $DragonFly: src/sys/dev/pccard/pccbb/pccbb.c,v 1.13 2006/03/02 19:07:59 dillon Exp $ */ /* @@ -563,7 +563,7 @@ cbb_attach(device_t brdev) struct cbb_softc *sc = (struct cbb_softc *)device_get_softc(brdev); int rid; - lockinit(&sc->lock, 0, "cbb", 0, 0); + lockinit(&sc->lock, "cbb", 0, 0); sc->chipset = cbb_chipset(pci_get_devid(brdev), NULL); sc->dev = brdev; sc->cbdev = NULL; diff --git a/sys/kern/imgact_resident.c b/sys/kern/imgact_resident.c index 1aae6a60af..b56b6c562c 100644 --- a/sys/kern/imgact_resident.c +++ b/sys/kern/imgact_resident.c @@ -31,7 +31,7 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $DragonFly: src/sys/kern/imgact_resident.c,v 1.7 2005/01/31 17:53:57 joerg Exp $ + * $DragonFly: src/sys/kern/imgact_resident.c,v 1.8 2006/03/02 19:07:59 dillon Exp $ */ #include @@ -72,7 +72,7 @@ static struct lock exec_list_lock; static void vm_resident_init(void *__dummy) { - lockinit(&exec_list_lock, 0, "vmres", 0, 0); + lockinit(&exec_list_lock, "vmres", 0, 0); TAILQ_INIT(&exec_res_list); } SYSINIT(vmres, SI_SUB_VM, SI_ORDER_ANY, vm_resident_init, 0); diff --git a/sys/kern/kern_linker.c b/sys/kern/kern_linker.c index 1c48a08714..2e82112a36 100644 --- a/sys/kern/kern_linker.c +++ b/sys/kern/kern_linker.c @@ -24,7 +24,7 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/kern/kern_linker.c,v 1.41.2.3 2001/11/21 17:50:35 luigi Exp $ - * $DragonFly: src/sys/kern/kern_linker.c,v 1.24 2006/01/19 04:49:45 corecode Exp $ + * $DragonFly: src/sys/kern/kern_linker.c,v 1.25 2006/03/02 19:07:59 dillon Exp $ */ #include "opt_ddb.h" @@ -66,7 +66,7 @@ static int next_file_id = 1; static void linker_init(void* arg) { - lockinit(&lock, 0, "klink", 0, 0); + lockinit(&lock, "klink", 0, 0); TAILQ_INIT(&classes); TAILQ_INIT(&linker_files); } diff --git a/sys/kern/kern_lock.c b/sys/kern/kern_lock.c index 9cdad6c8ce..148fd23c30 100644 --- a/sys/kern/kern_lock.c +++ b/sys/kern/kern_lock.c @@ -39,7 +39,7 @@ * * @(#)kern_lock.c 8.18 (Berkeley) 5/21/95 * $FreeBSD: src/sys/kern/kern_lock.c,v 1.31.2.3 2001/12/25 01:44:44 dillon Exp $ - * $DragonFly: src/sys/kern/kern_lock.c,v 1.15 2005/11/19 17:19:47 dillon Exp $ + * $DragonFly: src/sys/kern/kern_lock.c,v 1.16 2006/03/02 19:07:59 dillon Exp $ */ #include "opt_lint.h" @@ -137,8 +137,10 @@ acquire(struct lock *lkp, int extflags, int wanted) */ tsleep_interlock(lkp); spin_unlock_quick(&lkp->lk_spinlock); - error = tsleep(lkp, lkp->lk_prio, lkp->lk_wmesg, - ((extflags & LK_TIMELOCK) ? lkp->lk_timo : 0)); + error = tsleep(lkp, + ((extflags & LK_PCATCH) ? PCATCH : 0), + lkp->lk_wmesg, + ((extflags & LK_TIMELOCK) ? lkp->lk_timo : 0)); spin_lock_quick(&lkp->lk_spinlock); if (lkp->lk_waitcount == 1) { lkp->lk_flags &= ~LK_WAIT_NONZERO; @@ -494,9 +496,10 @@ acquiredrain(struct lock *lkp, int extflags) */ tsleep_interlock(&lkp->lk_flags); spin_unlock_quick(&lkp->lk_spinlock); - error = tsleep(&lkp->lk_flags, lkp->lk_prio, - lkp->lk_wmesg, - ((extflags & LK_TIMELOCK) ? lkp->lk_timo : 0)); + error = tsleep(&lkp->lk_flags, + ((extflags & LK_PCATCH) ? PCATCH : 0), + lkp->lk_wmesg, + ((extflags & LK_TIMELOCK) ? lkp->lk_timo : 0)); spin_lock_quick(&lkp->lk_spinlock); if (error) return error; @@ -511,14 +514,13 @@ acquiredrain(struct lock *lkp, int extflags) * Initialize a lock; required before use. */ void -lockinit(struct lock *lkp, int prio, char *wmesg, int timo, int flags) +lockinit(struct lock *lkp, char *wmesg, int timo, int flags) { spin_init(&lkp->lk_spinlock); lkp->lk_flags = (flags & LK_EXTFLG_MASK); lkp->lk_sharecount = 0; lkp->lk_waitcount = 0; lkp->lk_exclusivecount = 0; - lkp->lk_prio = prio; lkp->lk_wmesg = wmesg; lkp->lk_timo = timo; lkp->lk_lockholder = LK_NOTHREAD; @@ -530,11 +532,10 @@ lockinit(struct lock *lkp, int prio, char *wmesg, int timo, int flags) * must already hold the interlock. */ void -lockreinit(struct lock *lkp, int prio, char *wmesg, int timo, int flags) +lockreinit(struct lock *lkp, char *wmesg, int timo, int flags) { lkp->lk_flags = (lkp->lk_flags & ~(LK_EXTFLG_MASK|LK_DRAINING)) | (flags & LK_EXTFLG_MASK); - lkp->lk_prio = prio; lkp->lk_wmesg = wmesg; lkp->lk_timo = timo; } diff --git a/sys/kern/kern_sysctl.c b/sys/kern/kern_sysctl.c index a1e491cd85..1afd351ae1 100644 --- a/sys/kern/kern_sysctl.c +++ b/sys/kern/kern_sysctl.c @@ -38,7 +38,7 @@ * * @(#)kern_sysctl.c 8.4 (Berkeley) 4/14/94 * $FreeBSD: src/sys/kern/kern_sysctl.c,v 1.92.2.9 2003/05/01 22:48:09 trhodes Exp $ - * $DragonFly: src/sys/kern/kern_sysctl.c,v 1.18 2005/02/05 23:04:28 joerg Exp $ + * $DragonFly: src/sys/kern/kern_sysctl.c,v 1.19 2006/03/02 19:07:59 dillon Exp $ */ #include @@ -464,8 +464,8 @@ static void sysctl_register_all(void *arg) { struct sysctl_oid **oidp; - lockinit(&sysctl_lkp, 0, "sysctl", 0, 0); - lockinit(&sysctl_ctx_lkp, 0, "sysctl ctx", 0, 0); + lockinit(&sysctl_lkp, "sysctl", 0, 0); + lockinit(&sysctl_ctx_lkp, "sysctl ctx", 0, 0); SET_FOREACH(oidp, sysctl_set) sysctl_register_oid_int(*oidp); } diff --git a/sys/kern/vfs_bio.c b/sys/kern/vfs_bio.c index 0d7a86c12d..fe9e49ef9c 100644 --- a/sys/kern/vfs_bio.c +++ b/sys/kern/vfs_bio.c @@ -12,7 +12,7 @@ * John S. Dyson. * * $FreeBSD: src/sys/kern/vfs_bio.c,v 1.242.2.20 2003/05/28 18:38:10 alc Exp $ - * $DragonFly: src/sys/kern/vfs_bio.c,v 1.54 2006/02/17 19:18:06 dillon Exp $ + * $DragonFly: src/sys/kern/vfs_bio.c,v 1.55 2006/03/02 19:07:59 dillon Exp $ */ /* @@ -2280,11 +2280,15 @@ loop: * once the lock has been obtained. */ if (BUF_LOCK(bp, LK_EXCLUSIVE | LK_NOWAIT)) { - if (BUF_TIMELOCK(bp, LK_EXCLUSIVE | LK_SLEEPFAIL, - "getblk", slpflag, slptimeo) == ENOLCK) + int lkflags = LK_EXCLUSIVE | LK_SLEEPFAIL; + if (slpflag & PCATCH) + lkflags |= LK_PCATCH; + if (BUF_TIMELOCK(bp, lkflags, "getblk", slptimeo) == + ENOLCK) { goto loop; + } crit_exit(); - return (struct buf *) NULL; + return (NULL); } /* diff --git a/sys/kern/vfs_lock.c b/sys/kern/vfs_lock.c index dac1263e71..05870f8d4c 100644 --- a/sys/kern/vfs_lock.c +++ b/sys/kern/vfs_lock.c @@ -31,7 +31,7 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $DragonFly: src/sys/kern/vfs_lock.c,v 1.8 2006/02/17 19:18:06 dillon Exp $ + * $DragonFly: src/sys/kern/vfs_lock.c,v 1.9 2006/03/02 19:07:59 dillon Exp $ */ /* @@ -470,7 +470,7 @@ allocvnode(int lktimeout, int lkflags) vp->v_clen = 0; vp->v_socket = 0; vp->v_writecount = 0; /* XXX */ - lockreinit(&vp->v_lock, 0, "vnode", lktimeout, lkflags); + lockreinit(&vp->v_lock, "vnode", lktimeout, lkflags); KKASSERT(TAILQ_FIRST(&vp->v_namecache) == NULL); } else { /* @@ -478,7 +478,7 @@ allocvnode(int lktimeout, int lkflags) */ vp = malloc(sizeof(struct vnode), M_VNODE, M_WAITOK|M_ZERO); lwkt_token_init(&vp->v_pollinfo.vpi_token); - lockinit(&vp->v_lock, 0, "vnode", lktimeout, lkflags); + lockinit(&vp->v_lock, "vnode", lktimeout, lkflags); TAILQ_INIT(&vp->v_namecache); /* diff --git a/sys/kern/vfs_mount.c b/sys/kern/vfs_mount.c index c766657130..a3a92d041e 100644 --- a/sys/kern/vfs_mount.c +++ b/sys/kern/vfs_mount.c @@ -67,7 +67,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $DragonFly: src/sys/kern/vfs_mount.c,v 1.11 2005/06/06 15:02:28 dillon Exp $ + * $DragonFly: src/sys/kern/vfs_mount.c,v 1.12 2006/03/02 19:07:59 dillon Exp $ */ /* @@ -300,7 +300,7 @@ vfs_rootmountalloc(char *fstypename, char *devname, struct mount **mpp) return (ENODEV); mp = malloc(sizeof(struct mount), M_MOUNT, M_WAITOK); bzero((char *)mp, (u_long)sizeof(struct mount)); - lockinit(&mp->mnt_lock, 0, "vfslock", VLKTIMEOUT, LK_NOPAUSE); + lockinit(&mp->mnt_lock, "vfslock", VLKTIMEOUT, LK_NOPAUSE); vfs_busy(mp, LK_NOWAIT, td); TAILQ_INIT(&mp->mnt_nvnodelist); TAILQ_INIT(&mp->mnt_reservedvnlist); diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c index 7941451e34..dd99046f96 100644 --- a/sys/kern/vfs_subr.c +++ b/sys/kern/vfs_subr.c @@ -37,7 +37,7 @@ * * @(#)vfs_subr.c 8.31 (Berkeley) 5/26/95 * $FreeBSD: src/sys/kern/vfs_subr.c,v 1.249.2.30 2003/04/04 20:35:57 tegge Exp $ - * $DragonFly: src/sys/kern/vfs_subr.c,v 1.66 2006/02/17 19:18:06 dillon Exp $ + * $DragonFly: src/sys/kern/vfs_subr.c,v 1.67 2006/03/02 19:07:59 dillon Exp $ */ /* @@ -269,7 +269,7 @@ static int vinvalbuf_bp(struct buf *bp, void *data); struct vinvalbuf_bp_info { struct vnode *vp; int slptimeo; - int slpflag; + int lkflags; int flags; }; @@ -309,7 +309,9 @@ vinvalbuf(struct vnode *vp, int flags, struct thread *td, } crit_enter(); info.slptimeo = slptimeo; - info.slpflag = slpflag; + info.lkflags = LK_EXCLUSIVE | LK_SLEEPFAIL; + if (slpflag & PCATCH) + info.lkflags |= LK_PCATCH; info.flags = flags; info.vp = vp; @@ -364,9 +366,8 @@ vinvalbuf_bp(struct buf *bp, void *data) int error; if (BUF_LOCK(bp, LK_EXCLUSIVE | LK_NOWAIT)) { - error = BUF_TIMELOCK(bp, - LK_EXCLUSIVE | LK_SLEEPFAIL, - "vinvalbuf", info->slpflag, info->slptimeo); + error = BUF_TIMELOCK(bp, info->lkflags, + "vinvalbuf", info->slptimeo); if (error == 0) { BUF_UNLOCK(bp); error = ENOLCK; diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c index c82c609406..ec199caadb 100644 --- a/sys/kern/vfs_syscalls.c +++ b/sys/kern/vfs_syscalls.c @@ -37,7 +37,7 @@ * * @(#)vfs_syscalls.c 8.13 (Berkeley) 4/15/94 * $FreeBSD: src/sys/kern/vfs_syscalls.c,v 1.151.2.18 2003/04/04 20:35:58 tegge Exp $ - * $DragonFly: src/sys/kern/vfs_syscalls.c,v 1.76 2006/01/04 18:11:26 dillon Exp $ + * $DragonFly: src/sys/kern/vfs_syscalls.c,v 1.77 2006/03/02 19:07:59 dillon Exp $ */ #include @@ -293,7 +293,7 @@ mount(struct mount_args *uap) TAILQ_INIT(&mp->mnt_reservedvnlist); TAILQ_INIT(&mp->mnt_jlist); mp->mnt_nvnodelistsize = 0; - lockinit(&mp->mnt_lock, 0, "vfslock", 0, LK_NOPAUSE); + lockinit(&mp->mnt_lock, "vfslock", 0, LK_NOPAUSE); vfs_busy(mp, LK_NOWAIT, td); mp->mnt_op = vfsp->vfc_vfsops; mp->mnt_vfc = vfsp; diff --git a/sys/netproto/ncp/ncp_conn.c b/sys/netproto/ncp/ncp_conn.c index 78c7e38e3f..e5b3fa4c48 100644 --- a/sys/netproto/ncp/ncp_conn.c +++ b/sys/netproto/ncp/ncp_conn.c @@ -29,7 +29,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * $FreeBSD: src/sys/netncp/ncp_conn.c,v 1.3.2.5 2001/02/22 08:54:11 bp Exp $ - * $DragonFly: src/sys/netproto/ncp/ncp_conn.c,v 1.8 2005/02/15 18:20:50 joerg Exp $ + * $DragonFly: src/sys/netproto/ncp/ncp_conn.c,v 1.9 2006/03/02 19:07:59 dillon Exp $ * * Connection tables */ @@ -72,8 +72,8 @@ MALLOC_DEFINE(M_NCPDATA, "NCP data", "NCP private data"); int ncp_conn_init(void) { - lockinit(&listlock, 0, "ncpll", 0, 0); - lockinit(&lhlock, 0, "ncplh", 0, 0); + lockinit(&listlock, "ncpll", 0, 0); + lockinit(&lhlock, "ncplh", 0, 0); return 0; } @@ -195,7 +195,7 @@ ncp_conn_alloc(struct thread *td, struct ucred *cred, struct ncp_conn **conn) MALLOC(ncp, struct ncp_conn *, sizeof(struct ncp_conn), M_NCPDATA, M_WAITOK | M_ZERO); error = 0; - lockinit(&ncp->nc_lock, 0, "ncplck", 0, 0); + lockinit(&ncp->nc_lock, "ncplck", 0, 0); ncp_conn_cnt++; ncp->nc_id = ncp_next_ref++; ncp->nc_owner = cred; diff --git a/sys/netproto/smb/smb_conn.c b/sys/netproto/smb/smb_conn.c index 2997e79473..abfe78e685 100644 --- a/sys/netproto/smb/smb_conn.c +++ b/sys/netproto/smb/smb_conn.c @@ -30,7 +30,7 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/netsmb/smb_conn.c,v 1.1.2.1 2001/05/22 08:32:33 bp Exp $ - * $DragonFly: src/sys/netproto/smb/smb_conn.c,v 1.9 2005/12/06 04:03:56 dillon Exp $ + * $DragonFly: src/sys/netproto/smb/smb_conn.c,v 1.10 2006/03/02 19:07:59 dillon Exp $ */ /* @@ -223,7 +223,7 @@ smb_co_init(struct smb_connobj *cp, int level, char *objname, struct thread *td) { SLIST_INIT(&cp->co_children); smb_sl_init(&cp->co_interlock, objname); - lockinit(&cp->co_lock, 0, objname, 0, 0); + lockinit(&cp->co_lock, objname, 0, 0); cp->co_level = level; cp->co_usecount = 1; KASSERT(smb_co_lock(cp, NULL, LK_EXCLUSIVE, td) == 0, diff --git a/sys/sys/buf2.h b/sys/sys/buf2.h index 1c61be2e6a..c42a68554b 100644 --- a/sys/sys/buf2.h +++ b/sys/sys/buf2.h @@ -37,7 +37,7 @@ * * @(#)buf.h 8.9 (Berkeley) 3/30/95 * $FreeBSD: src/sys/sys/buf.h,v 1.88.2.10 2003/01/25 19:02:23 dillon Exp $ - * $DragonFly: src/sys/sys/buf2.h,v 1.12 2006/02/17 19:18:07 dillon Exp $ + * $DragonFly: src/sys/sys/buf2.h,v 1.13 2006/03/02 19:08:00 dillon Exp $ */ #ifndef _SYS_BUF2_H_ @@ -59,7 +59,7 @@ * Initialize a lock. */ #define BUF_LOCKINIT(bp) \ - lockinit(&(bp)->b_lock, 0, buf_wmesg, 0, 0) + lockinit(&(bp)->b_lock, buf_wmesg, 0, 0) /* * @@ -72,23 +72,24 @@ BUF_LOCK(struct buf *bp, int locktype) spin_lock(&buftimespinlock); bp->b_lock.lk_wmesg = buf_wmesg; - bp->b_lock.lk_prio = 0; /* tsleep flags */ - /* bp->b_lock.lk_timo = 0; not necessary */ ret = lockmgr(&(bp)->b_lock, locktype | LK_INTERLOCK, &buftimespinlock, curthread); return ret; } /* * Get a lock sleeping with specified interruptably and timeout. + * + * XXX different entities calling BUF_TIMELOCK with different timeouts + * will conflict, only one of the multiply specified timeouts may wind + * up being used. */ static __inline int -BUF_TIMELOCK(struct buf *bp, int locktype, char *wmesg, int catch, int timo) +BUF_TIMELOCK(struct buf *bp, int locktype, char *wmesg, int timo) { int ret; spin_lock(&buftimespinlock); bp->b_lock.lk_wmesg = wmesg; - bp->b_lock.lk_prio = catch; /* tsleep flags */ bp->b_lock.lk_timo = timo; ret = lockmgr(&(bp)->b_lock, locktype | LK_INTERLOCK | LK_TIMELOCK, &buftimespinlock, curthread); diff --git a/sys/sys/lock.h b/sys/sys/lock.h index fbbd1d6eac..2b62547baa 100644 --- a/sys/sys/lock.h +++ b/sys/sys/lock.h @@ -36,7 +36,7 @@ * * @(#)lock.h 8.12 (Berkeley) 5/19/95 * $FreeBSD: src/sys/sys/lock.h,v 1.17.2.3 2001/12/25 01:44:44 dillon Exp $ - * $DragonFly: src/sys/sys/lock.h,v 1.11 2005/11/19 17:19:48 dillon Exp $ + * $DragonFly: src/sys/sys/lock.h,v 1.12 2006/03/02 19:08:00 dillon Exp $ */ #ifndef _SYS_LOCK_H_ @@ -69,7 +69,7 @@ struct lock { int lk_sharecount; /* # of accepted shared locks */ int lk_waitcount; /* # of processes sleeping for lock */ short lk_exclusivecount; /* # of recursive exclusive locks */ - short lk_prio; /* tsleep flags */ + short lk_unused1; char *lk_wmesg; /* resource sleeping (for tsleep) */ int lk_timo; /* maximum sleep time (for tsleep) */ struct thread *lk_lockholder; /* thread of excl lock holder */ @@ -130,13 +130,14 @@ struct lock { * or passed in as arguments to the lock manager. The LK_REENABLE flag may be * set only at the release of a lock obtained by drain. */ -#define LK_EXTFLG_MASK 0x03000070 /* mask of external flags */ +#define LK_EXTFLG_MASK 0x07000070 /* mask of external flags */ #define LK_NOWAIT 0x00000010 /* do not sleep to await lock */ #define LK_SLEEPFAIL 0x00000020 /* sleep, then return failure */ #define LK_CANRECURSE 0x00000040 /* allow recursive exclusive lock */ #define LK_REENABLE 0x00000080 /* lock is be reenabled after drain */ #define LK_NOPAUSE 0x01000000 /* no spinloop */ #define LK_TIMELOCK 0x02000000 +#define LK_PCATCH 0x04000000 /* timelocked with signal catching */ /* * Internal lock flags. * @@ -192,8 +193,8 @@ struct lock { void dumplockinfo(struct lock *lkp); struct proc; -void lockinit (struct lock *, int prio, char *wmesg, int timo, int flags); -void lockreinit (struct lock *, int prio, char *wmesg, int timo, int flags); +void lockinit (struct lock *, char *wmesg, int timo, int flags); +void lockreinit (struct lock *, char *wmesg, int timo, int flags); #ifdef DEBUG_LOCKS int debuglockmgr (struct lock *, u_int flags, struct spinlock *, struct thread *p, diff --git a/sys/vfs/hpfs/hpfs_hash.c b/sys/vfs/hpfs/hpfs_hash.c index c67296eb8c..8b2ec5d26e 100644 --- a/sys/vfs/hpfs/hpfs_hash.c +++ b/sys/vfs/hpfs/hpfs_hash.c @@ -32,7 +32,7 @@ * * @(#)ufs_ihash.c 8.7 (Berkeley) 5/17/95 * $FreeBSD: src/sys/fs/hpfs/hpfs_hash.c,v 1.1 1999/12/09 19:09:58 semenu Exp $ - * $DragonFly: src/sys/vfs/hpfs/hpfs_hash.c,v 1.12 2004/10/12 19:20:56 dillon Exp $ + * $DragonFly: src/sys/vfs/hpfs/hpfs_hash.c,v 1.13 2006/03/02 19:08:00 dillon Exp $ */ #include @@ -66,7 +66,7 @@ void hpfs_hphashinit(void) { - lockinit (&hpfs_hphash_lock, 0, "hpfs_hphashlock", 0, 0); + lockinit (&hpfs_hphash_lock, "hpfs_hphashlock", 0, 0); hpfs_hphashtbl = HASHINIT(desiredvnodes, M_HPFSHASH, M_WAITOK, &hpfs_hphash); lwkt_token_init(&hpfs_hphash_token); diff --git a/sys/vfs/nfs/nfs_node.c b/sys/vfs/nfs/nfs_node.c index 8720f0861a..7ab29eddb7 100644 --- a/sys/vfs/nfs/nfs_node.c +++ b/sys/vfs/nfs/nfs_node.c @@ -35,7 +35,7 @@ * * @(#)nfs_node.c 8.6 (Berkeley) 5/22/95 * $FreeBSD: src/sys/nfs/nfs_node.c,v 1.36.2.3 2002/01/05 22:25:04 dillon Exp $ - * $DragonFly: src/sys/vfs/nfs/nfs_node.c,v 1.19 2005/03/17 17:28:46 dillon Exp $ + * $DragonFly: src/sys/vfs/nfs/nfs_node.c,v 1.20 2006/03/02 19:08:00 dillon Exp $ */ @@ -91,7 +91,7 @@ nfs_nget(struct mount *mntp, nfsfh_t *fhp, int fhsize, struct nfsnode **npp) struct vnode *vp; struct vnode *nvp; int error; - int rsflags; + int lkflags; struct nfsmount *nmp; /* @@ -100,9 +100,9 @@ nfs_nget(struct mount *mntp, nfsfh_t *fhp, int fhsize, struct nfsnode **npp) */ nmp = VFSTONFS(mntp); if (nmp->nm_flag & NFSMNT_INT) - rsflags = PCATCH; + lkflags = LK_PCATCH; else - rsflags = 0; + lkflags = 0; retry: nhpp = NFSNOHASH(fnv_32_buf(fhp->fh_bytes, fhsize, FNV1_32_INIT)); @@ -184,7 +184,7 @@ loop: np->n_fhp = &np->n_fh; bcopy((caddr_t)fhp, (caddr_t)np->n_fhp, fhsize); np->n_fhsize = fhsize; - lockinit(&np->n_rslock, rsflags, "nfrslk", 0, LK_NOPAUSE); + lockinit(&np->n_rslock, "nfrslk", 0, LK_NOPAUSE | lkflags); /* * nvp is locked & refd so effectively so is np. diff --git a/sys/vfs/nfs/nfs_vnops.c b/sys/vfs/nfs/nfs_vnops.c index e9b7e4a144..0612770483 100644 --- a/sys/vfs/nfs/nfs_vnops.c +++ b/sys/vfs/nfs/nfs_vnops.c @@ -35,7 +35,7 @@ * * @(#)nfs_vnops.c 8.16 (Berkeley) 5/27/95 * $FreeBSD: src/sys/nfs/nfs_vnops.c,v 1.150.2.5 2001/12/20 19:56:28 dillon Exp $ - * $DragonFly: src/sys/vfs/nfs/nfs_vnops.c,v 1.46 2006/02/21 17:52:52 dillon Exp $ + * $DragonFly: src/sys/vfs/nfs/nfs_vnops.c,v 1.47 2006/03/02 19:08:00 dillon Exp $ */ @@ -3093,10 +3093,11 @@ nfs_flush_bp(struct buf *bp, void *data) if (info->loops && info->waitfor == MNT_WAIT) { error = BUF_LOCK(bp, LK_EXCLUSIVE | LK_NOWAIT); if (error) { - error = BUF_TIMELOCK(bp, - LK_EXCLUSIVE | LK_SLEEPFAIL, - "nfsfsync", - info->slpflag, info->slptimeo); + int lkflags = LK_EXCLUSIVE | LK_SLEEPFAIL; + if (info->slpflag & PCATCH) + lkflags |= LK_PCATCH; + error = BUF_TIMELOCK(bp, lkflags, "nfsfsync", + info->slptimeo); } } else { error = BUF_LOCK(bp, LK_EXCLUSIVE | LK_NOWAIT); diff --git a/sys/vfs/ntfs/ntfs_ihash.c b/sys/vfs/ntfs/ntfs_ihash.c index 0e1c89aa56..7d43c8f2dd 100644 --- a/sys/vfs/ntfs/ntfs_ihash.c +++ b/sys/vfs/ntfs/ntfs_ihash.c @@ -34,7 +34,7 @@ * * @(#)ufs_ihash.c 8.7 (Berkeley) 5/17/95 * $FreeBSD: src/sys/ntfs/ntfs_ihash.c,v 1.7 1999/12/03 20:37:39 semenu Exp $ - * $DragonFly: src/sys/vfs/ntfs/ntfs_ihash.c,v 1.9 2004/04/20 19:59:30 cpressey Exp $ + * $DragonFly: src/sys/vfs/ntfs/ntfs_ihash.c,v 1.10 2006/03/02 19:08:00 dillon Exp $ */ #include @@ -67,7 +67,7 @@ struct lock ntfs_hashlock; void ntfs_nthashinit(void) { - lockinit(&ntfs_hashlock, 0, "ntfs_nthashlock", 0, 0); + lockinit(&ntfs_hashlock, "ntfs_nthashlock", 0, 0); ntfs_nthashtbl = HASHINIT(desiredvnodes, M_NTFSNTHASH, M_WAITOK, &ntfs_nthash); lwkt_token_init(&ntfs_nthash_slock); diff --git a/sys/vfs/ntfs/ntfs_subr.c b/sys/vfs/ntfs/ntfs_subr.c index 8507ce41f3..56482b3381 100644 --- a/sys/vfs/ntfs/ntfs_subr.c +++ b/sys/vfs/ntfs/ntfs_subr.c @@ -26,7 +26,7 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/ntfs/ntfs_subr.c,v 1.7.2.4 2001/10/12 22:08:49 semenu Exp $ - * $DragonFly: src/sys/vfs/ntfs/ntfs_subr.c,v 1.18 2006/01/22 04:31:22 swildner Exp $ + * $DragonFly: src/sys/vfs/ntfs/ntfs_subr.c,v 1.19 2006/03/02 19:08:00 dillon Exp $ */ #include @@ -394,7 +394,7 @@ ntfs_ntlookup(struct ntfsmount *ntmp, ino_t ino, struct ntnode **ipp) vref(ip->i_devvp); /* init lock and lock the newborn ntnode */ - lockinit(&ip->i_lock, 0, "ntnode", 0, LK_EXCLUSIVE); + lockinit(&ip->i_lock, "ntnode", 0, LK_EXCLUSIVE); spin_init(&ip->i_interlock); ntfs_ntget(ip); @@ -1831,7 +1831,7 @@ void ntfs_toupper_init(void) { ntfs_toupper_tab = (wchar *) NULL; - lockinit(&ntfs_toupper_lock, 0, "ntfs_toupper", 0, 0); + lockinit(&ntfs_toupper_lock, "ntfs_toupper", 0, 0); ntfs_toupper_usecount = 0; } diff --git a/sys/vfs/nwfs/nwfs_node.c b/sys/vfs/nwfs/nwfs_node.c index 5e5c716bb6..f9f4da2039 100644 --- a/sys/vfs/nwfs/nwfs_node.c +++ b/sys/vfs/nwfs/nwfs_node.c @@ -30,7 +30,7 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/nwfs/nwfs_node.c,v 1.3.2.8 2001/12/25 01:44:45 dillon Exp $ - * $DragonFly: src/sys/vfs/nwfs/nwfs_node.c,v 1.18 2005/08/16 16:27:41 joerg Exp $ + * $DragonFly: src/sys/vfs/nwfs/nwfs_node.c,v 1.19 2006/03/02 19:08:00 dillon Exp $ */ #include #include @@ -76,7 +76,7 @@ void nwfs_hash_init(void) { nwhashtbl = hashinit(desiredvnodes, M_NWFSHASH, &nwnodehash); - lockinit(&nwhashlock, 0, "nwfshl", 0, 0); + lockinit(&nwhashlock, "nwfshl", 0, 0); } void @@ -190,7 +190,7 @@ rescan: vp->v_data = np; np->n_fid = fid; np->n_flag |= NNEW; - lockinit(&np->n_lock, 0, "nwnode", VLKTIMEOUT, LK_CANRECURSE); + lockinit(&np->n_lock, "nwnode", VLKTIMEOUT, LK_CANRECURSE); nhpp = NWNOHASH(fid); LIST_INSERT_HEAD(nhpp, np, n_hash); lockmgr(&nwhashlock, LK_RELEASE, NULL, td); diff --git a/sys/vfs/smbfs/smbfs_vfsops.c b/sys/vfs/smbfs/smbfs_vfsops.c index c62e7a413e..c65ea85a37 100644 --- a/sys/vfs/smbfs/smbfs_vfsops.c +++ b/sys/vfs/smbfs/smbfs_vfsops.c @@ -30,7 +30,7 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/fs/smbfs/smbfs_vfsops.c,v 1.2.2.5 2003/01/17 08:20:26 tjr Exp $ - * $DragonFly: src/sys/vfs/smbfs/smbfs_vfsops.c,v 1.23 2005/09/17 07:43:12 dillon Exp $ + * $DragonFly: src/sys/vfs/smbfs/smbfs_vfsops.c,v 1.24 2006/03/02 19:08:00 dillon Exp $ */ #include "opt_netsmb.h" #ifndef NETSMB @@ -175,7 +175,7 @@ smbfs_mount(struct mount *mp, char *path, caddr_t data, struct thread *td) smp->sm_hash = hashinit(desiredvnodes, M_SMBFSHASH, &smp->sm_hashlen); if (smp->sm_hash == NULL) goto bad; - lockinit(&smp->sm_hashlock, 0, "smbfsh", 0, 0); + lockinit(&smp->sm_hashlock, "smbfsh", 0, 0); smp->sm_share = ssp; smp->sm_root = NULL; smp->sm_args = args; diff --git a/sys/vm/vm_map.c b/sys/vm/vm_map.c index c636332ae6..df698ee488 100644 --- a/sys/vm/vm_map.c +++ b/sys/vm/vm_map.c @@ -62,7 +62,7 @@ * rights to redistribute these changes. * * $FreeBSD: src/sys/vm/vm_map.c,v 1.187.2.19 2003/05/27 00:47:02 alc Exp $ - * $DragonFly: src/sys/vm/vm_map.c,v 1.40 2006/01/13 20:45:30 swildner Exp $ + * $DragonFly: src/sys/vm/vm_map.c,v 1.41 2006/03/02 19:08:00 dillon Exp $ */ /* @@ -348,7 +348,7 @@ vm_map_init(struct vm_map *map, vm_offset_t min, vm_offset_t max) map->first_free = &map->header; map->hint = &map->header; map->timestamp = 0; - lockinit(&map->lock, 0, "thrd_sleep", 0, LK_NOPAUSE); + lockinit(&map->lock, "thrd_sleep", 0, LK_NOPAUSE); } /* -- 2.41.0