From owner-freebsd-smp Sat Jan 19 8: 1:36 2002 Delivered-To: freebsd-smp@freebsd.org Received: from elvis.mu.org (elvis.mu.org [192.203.228.196]) by hub.freebsd.org (Postfix) with ESMTP id 20C5F37B402; Sat, 19 Jan 2002 08:01:26 -0800 (PST) Received: by elvis.mu.org (Postfix, from userid 1192) id DBFA110DDF8; Sat, 19 Jan 2002 08:01:25 -0800 (PST) Date: Sat, 19 Jan 2002 08:01:25 -0800 From: Alfred Perlstein To: smp@freebsd.org Cc: dillon@freebsd.org Subject: help with mutex_pool please? Message-ID: <20020119080125.X13686@elvis.mu.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5i Sender: owner-freebsd-smp@FreeBSD.ORG Precedence: bulk List-ID: List-Archive: (Web Archive) List-Help: (List Instructions) List-Subscribe: List-Unsubscribe: X-Loop: FreeBSD.org I was going to convert some subsystems to use mutex pools... However if I apply this delta, a couple of seconds after boot I get a lockup, sometimes the panic message is printed "sleeping with mutex held" Any clues? Index: kern/kern_descrip.c =================================================================== RCS file: /home/ncvs/src/sys/kern/kern_descrip.c,v retrieving revision 1.118 diff -u -r1.118 kern_descrip.c --- kern/kern_descrip.c 15 Jan 2002 00:58:40 -0000 1.118 +++ kern/kern_descrip.c 19 Jan 2002 05:55:09 -0000 @@ -1037,7 +1037,7 @@ FREE(fp, M_FILE); return (error); } - mtx_init(&fp->f_mtx, "file structure", MTX_DEF); + fp->f_mtxp = mtx_pool_alloc(); fp->f_gcflag = 0; fp->f_count = 1; fp->f_cred = crhold(p->p_ucred); @@ -1075,7 +1075,6 @@ nfiles--; sx_xunlock(&filelist_lock); crfree(fp->f_cred); - mtx_destroy(&fp->f_mtx); FREE(fp, M_FILE); } Index: kern/kern_resource.c =================================================================== RCS file: /home/ncvs/src/sys/kern/kern_resource.c,v retrieving revision 1.94 diff -u -r1.94 kern_resource.c --- kern/kern_resource.c 4 Nov 2001 18:28:45 -0000 1.94 +++ kern/kern_resource.c 19 Jan 2002 05:55:09 -0000 @@ -859,7 +859,7 @@ free(uip, M_UIDINFO); uip = old_uip; } else { - mtx_init(&uip->ui_mtx, "uidinfo struct", MTX_DEF); + uip->ui_mtxp = mtx_pool_alloc(); uip->ui_uid = uid; LIST_INSERT_HEAD(UIHASH(uid), uip, ui_hash); } @@ -877,9 +877,9 @@ struct uidinfo *uip; { - mtx_lock(&uip->ui_mtx); + UIDINFO_LOCK(uip); uip->ui_ref++; - mtx_unlock(&uip->ui_mtx); + UIDINFO_UNLOCK(uip); } /*- @@ -903,18 +903,18 @@ { /* Prepare for optimal case. */ - mtx_lock(&uip->ui_mtx); + UIDINFO_LOCK(uip); if (--uip->ui_ref != 0) { - mtx_unlock(&uip->ui_mtx); + UIDINFO_UNLOCK(uip); return; } /* Prepare for suboptimal case. */ uip->ui_ref++; - mtx_unlock(&uip->ui_mtx); + UIDINFO_UNLOCK(uip); mtx_lock(&uihashtbl_mtx); - mtx_lock(&uip->ui_mtx); + UIDINFO_LOCK(uip); /* * We must subtract one from the count again because we backed out @@ -932,13 +932,12 @@ if (uip->ui_proccnt != 0) printf("freeing uidinfo: uid = %d, proccnt = %ld\n", uip->ui_uid, uip->ui_proccnt); - mtx_destroy(&uip->ui_mtx); FREE(uip, M_UIDINFO); return; } mtx_unlock(&uihashtbl_mtx); - mtx_unlock(&uip->ui_mtx); + UIDINFO_UNLOCK(uip); } /* @@ -952,16 +951,16 @@ int max; { - mtx_lock(&uip->ui_mtx); + UIDINFO_LOCK(uip); /* don't allow them to exceed max, but allow subtraction */ if (diff > 0 && uip->ui_proccnt + diff > max && max != 0) { - mtx_unlock(&uip->ui_mtx); + UIDINFO_UNLOCK(uip); return (0); } uip->ui_proccnt += diff; if (uip->ui_proccnt < 0) printf("negative proccnt for uid = %d\n", uip->ui_uid); - mtx_unlock(&uip->ui_mtx); + UIDINFO_UNLOCK(uip); return (1); } @@ -979,12 +978,12 @@ int s; s = splnet(); - mtx_lock(&uip->ui_mtx); + UIDINFO_LOCK(uip); new = uip->ui_sbsize + to - *hiwat; /* don't allow them to exceed max, but allow subtraction */ if (to > *hiwat && new > max) { splx(s); - mtx_unlock(&uip->ui_mtx); + UIDINFO_UNLOCK(uip); return (0); } uip->ui_sbsize = new; @@ -992,6 +991,6 @@ if (uip->ui_sbsize < 0) printf("negative sbsize for uid = %d\n", uip->ui_uid); splx(s); - mtx_unlock(&uip->ui_mtx); + UIDINFO_UNLOCK(uip); return (1); } Index: sys/file.h =================================================================== RCS file: /home/ncvs/src/sys/sys/file.h,v retrieving revision 1.38 diff -u -r1.38 file.h --- sys/file.h 14 Jan 2002 09:02:33 -0000 1.38 +++ sys/file.h 19 Jan 2002 00:57:03 -0000 @@ -105,7 +105,7 @@ off_t f_offset; caddr_t f_data; /* vnode or socket */ u_int f_flag; /* see fcntl.h */ - struct mtx f_mtx; /* mutex to protect data */ + struct mtx *f_mtxp; /* mutex to protect data */ }; #ifdef MALLOC_DECLARE @@ -128,10 +128,10 @@ int fdrop_locked __P((struct file *fp, struct thread *td)); /* Lock a file. */ -#define FILE_LOCK(f) mtx_lock(&(f)->f_mtx) -#define FILE_UNLOCK(f) mtx_unlock(&(f)->f_mtx) -#define FILE_LOCKED(f) mtx_owned(&(f)->f_mtx) -#define FILE_LOCK_ASSERT(f, type) mtx_assert(&(f)->f_mtx, (type)) +#define FILE_LOCK(f) mtx_lock((f)->f_mtxp) +#define FILE_UNLOCK(f) mtx_unlock((f)->f_mtxp) +#define FILE_LOCKED(f) mtx_owned((f)->f_mtxp) +#define FILE_LOCK_ASSERT(f, type) mtx_assert((f)->f_mtxp, (type)) int fgetvp __P((struct thread *td, int fd, struct vnode **vpp)); int fgetvp_read __P((struct thread *td, int fd, struct vnode **vpp)); Index: sys/resourcevar.h =================================================================== RCS file: /home/ncvs/src/sys/sys/resourcevar.h,v retrieving revision 1.24 diff -u -r1.24 resourcevar.h --- sys/resourcevar.h 12 Sep 2001 08:38:05 -0000 1.24 +++ sys/resourcevar.h 18 Jan 2002 23:41:51 -0000 @@ -96,8 +96,11 @@ long ui_proccnt; /* number of processes */ uid_t ui_uid; /* uid */ u_short ui_ref; /* reference count */ - struct mtx ui_mtx; /* protect all counts/limits */ + struct mtx *ui_mtxp; /* protect all counts/limits */ }; + +#define UIDINFO_LOCK(ui) mtx_lock((ui)->ui_mtxp); +#define UIDINFO_UNLOCK(ui) mtx_unlock((ui)->ui_mtxp); struct thread; struct kse; -- -Alfred Perlstein [alfred@freebsd.org] 'Instead of asking why a piece of software is using "1970s technology," start asking why software is ignoring 30 years of accumulated wisdom.' Tax deductable donations for FreeBSD: http://www.freebsdfoundation.org/ To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-smp" in the body of the message