From owner-svn-src-projects@FreeBSD.ORG Sat Aug 1 07:42:40 2009 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 08CE9106564A; Sat, 1 Aug 2009 07:42:40 +0000 (UTC) (envelope-from jb@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id EBF898FC08; Sat, 1 Aug 2009 07:42:39 +0000 (UTC) (envelope-from jb@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n717gdhW095284; Sat, 1 Aug 2009 07:42:39 GMT (envelope-from jb@svn.freebsd.org) Received: (from jb@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n717gdpb095282; Sat, 1 Aug 2009 07:42:39 GMT (envelope-from jb@svn.freebsd.org) Message-Id: <200908010742.n717gdpb095282@svn.freebsd.org> From: John Birrell Date: Sat, 1 Aug 2009 07:42:39 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r196011 - projects/jbuild/usr.bin/jbuild/filemon X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 01 Aug 2009 07:42:40 -0000 Author: jb Date: Sat Aug 1 07:42:39 2009 New Revision: 196011 URL: http://svn.freebsd.org/changeset/base/196011 Log: Keep filemon structs in a free list and reuse them. There is currently a race condition that allows a filemon struct to be freed when the filemon fd is closed, but while there is still a syscall active via the fd. Modified: projects/jbuild/usr.bin/jbuild/filemon/filemon.c Modified: projects/jbuild/usr.bin/jbuild/filemon/filemon.c ============================================================================== --- projects/jbuild/usr.bin/jbuild/filemon/filemon.c Sat Aug 1 07:09:50 2009 (r196010) +++ projects/jbuild/usr.bin/jbuild/filemon/filemon.c Sat Aug 1 07:42:39 2009 (r196011) @@ -69,6 +69,7 @@ struct filemon { }; static TAILQ_HEAD(, filemon) filemons_inuse = TAILQ_HEAD_INITIALIZER(filemons_inuse); +static TAILQ_HEAD(, filemon) filemons_free = TAILQ_HEAD_INITIALIZER(filemons_free); static int n_readers = 0; static struct mtx access_mtx; static struct cv access_cv; @@ -122,22 +123,32 @@ filemon_dtr(void *data) struct filemon *filemon = data; if (filemon != NULL) { + struct file *fp = filemon->fp; + /* Get exclusive write access. */ filemon_lock_write(); /* Remove from the in-use list. */ TAILQ_REMOVE(&filemons_inuse, filemon, link); + filemon->fp = NULL; + filemon->pid = -1; + + /* Add to the free list. */ + TAILQ_INSERT_TAIL(&filemons_free, filemon, link); + /* Give up write access. */ filemon_unlock_write(); - if (filemon->fp != NULL) - fdrop(filemon->fp, curthread); + if (fp != NULL) + fdrop(fp, curthread); +#ifdef DOODAD mtx_destroy(&filemon->mtx); cv_destroy(&filemon->cv); free(filemon, M_FILEMON); +#endif } } @@ -181,13 +192,25 @@ filemon_open(struct cdev *dev, int oflag { struct filemon *filemon; - filemon = malloc(sizeof(struct filemon), M_FILEMON, M_WAITOK | M_ZERO); + /* Get exclusive write access. */ + filemon_lock_write(); - filemon->pid = curproc->p_pid; - filemon->fp = NULL; + if ((filemon = TAILQ_FIRST(&filemons_free)) != NULL) + TAILQ_REMOVE(&filemons_free, filemon, link); - mtx_init(&filemon->mtx, "filemon", "filemon", MTX_DEF); - cv_init(&filemon->cv, "filemon"); + /* Give up write access. */ + filemon_unlock_write(); + + if (filemon == NULL) { + filemon = malloc(sizeof(struct filemon), M_FILEMON, M_WAITOK | M_ZERO); + + filemon->fp = NULL; + + mtx_init(&filemon->mtx, "filemon", "filemon", MTX_DEF); + cv_init(&filemon->cv, "filemon"); + } + + filemon->pid = curproc->p_pid; #if __FreeBSD_version < 701000 dev->si_drv1 = filemon;