From owner-svn-src-all@freebsd.org Thu Jul 16 15:26:38 2015 Return-Path: Delivered-To: svn-src-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id C82139A34A2; Thu, 16 Jul 2015 15:26:38 +0000 (UTC) (envelope-from mjg@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id B48831FDF; Thu, 16 Jul 2015 15:26:38 +0000 (UTC) (envelope-from mjg@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.70]) by repo.freebsd.org (8.14.9/8.14.9) with ESMTP id t6GFQceh044150; Thu, 16 Jul 2015 15:26:38 GMT (envelope-from mjg@FreeBSD.org) Received: (from mjg@localhost) by repo.freebsd.org (8.14.9/8.14.9/Submit) id t6GFQceM044149; Thu, 16 Jul 2015 15:26:38 GMT (envelope-from mjg@FreeBSD.org) Message-Id: <201507161526.t6GFQceM044149@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: mjg set sender to mjg@FreeBSD.org using -f From: Mateusz Guzik Date: Thu, 16 Jul 2015 15:26:38 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r285636 - head/sys/kern X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 16 Jul 2015 15:26:39 -0000 Author: mjg Date: Thu Jul 16 15:26:37 2015 New Revision: 285636 URL: https://svnweb.freebsd.org/changeset/base/285636 Log: fd: partially deduplicate fdescfree and fdescfree_remapped This also moves vrele of cdir/rdir/jdir vnodes earlier, which should not matter. Modified: head/sys/kern/kern_descrip.c Modified: head/sys/kern/kern_descrip.c ============================================================================== --- head/sys/kern/kern_descrip.c Thu Jul 16 15:13:17 2015 (r285635) +++ head/sys/kern/kern_descrip.c Thu Jul 16 15:26:37 2015 (r285636) @@ -2110,18 +2110,46 @@ retry: /* * Release a filedesc structure. */ -void -fdescfree(struct thread *td) +static void +fdescfree_fds(struct thread *td, struct filedesc *fdp, bool needclose) { - struct proc *p; struct filedesc0 *fdp0; - struct filedesc *fdp; struct freetable *ft, *tft; struct filedescent *fde; struct file *fp; - struct vnode *cdir, *jdir, *rdir; int i; + for (i = 0; i <= fdp->fd_lastfile; i++) { + fde = &fdp->fd_ofiles[i]; + fp = fde->fde_file; + if (fp != NULL) { + fdefree_last(fde); + if (needclose) + (void) closef(fp, td); + else + fdrop(fp, td); + } + } + + if (NDSLOTS(fdp->fd_nfiles) > NDSLOTS(NDFILE)) + free(fdp->fd_map, M_FILEDESC); + if (fdp->fd_nfiles > NDFILE) + free(fdp->fd_files, M_FILEDESC); + + fdp0 = (struct filedesc0 *)fdp; + SLIST_FOREACH_SAFE(ft, &fdp0->fd_free, ft_next, tft) + free(ft->ft_table, M_FILEDESC); + + fddrop(fdp); +} + +void +fdescfree(struct thread *td) +{ + struct proc *p; + struct filedesc *fdp; + struct vnode *cdir, *jdir, *rdir; + p = td->td_proc; fdp = p->p_fd; MPASS(fdp != NULL); @@ -2134,7 +2162,7 @@ fdescfree(struct thread *td) } #endif - if (td->td_proc->p_fdtol != NULL) + if (p->p_fdtol != NULL) fdclearlocks(td); PROC_LOCK(p); @@ -2153,24 +2181,6 @@ fdescfree(struct thread *td) fdp->fd_jdir = NULL; FILEDESC_XUNLOCK(fdp); - for (i = 0; i <= fdp->fd_lastfile; i++) { - fde = &fdp->fd_ofiles[i]; - fp = fde->fde_file; - if (fp != NULL) { - fdefree_last(fde); - (void) closef(fp, td); - } - } - - if (NDSLOTS(fdp->fd_nfiles) > NDSLOTS(NDFILE)) - free(fdp->fd_map, M_FILEDESC); - if (fdp->fd_nfiles > NDFILE) - free(fdp->fd_files, M_FILEDESC); - - fdp0 = (struct filedesc0 *)fdp; - SLIST_FOREACH_SAFE(ft, &fdp0->fd_free, ft_next, tft) - free(ft->ft_table, M_FILEDESC); - if (cdir != NULL) vrele(cdir); if (rdir != NULL) @@ -2178,35 +2188,12 @@ fdescfree(struct thread *td) if (jdir != NULL) vrele(jdir); - fddrop(fdp); + fdescfree_fds(td, fdp, 1); } void fdescfree_remapped(struct filedesc *fdp) { - struct filedesc0 *fdp0; - struct filedescent *fde; - struct file *fp; - struct freetable *ft, *tft; - int i; - - for (i = 0; i <= fdp->fd_lastfile; i++) { - fde = &fdp->fd_ofiles[i]; - fp = fde->fde_file; - if (fp != NULL) { - fdefree_last(fde); - (void) closef(fp, NULL); - } - } - - if (NDSLOTS(fdp->fd_nfiles) > NDSLOTS(NDFILE)) - free(fdp->fd_map, M_FILEDESC); - if (fdp->fd_nfiles > NDFILE) - free(fdp->fd_files, M_FILEDESC); - - fdp0 = (struct filedesc0 *)fdp; - SLIST_FOREACH_SAFE(ft, &fdp0->fd_free, ft_next, tft) - free(ft->ft_table, M_FILEDESC); if (fdp->fd_cdir != NULL) vrele(fdp->fd_cdir); @@ -2214,7 +2201,8 @@ fdescfree_remapped(struct filedesc *fdp) vrele(fdp->fd_rdir); if (fdp->fd_jdir != NULL) vrele(fdp->fd_jdir); - fddrop(fdp); + + fdescfree_fds(curthread, fdp, 0); } /*