svn commit: r285636 - head/sys/kern
Mateusz Guzik
mjg at FreeBSD.org
Thu Jul 16 15:26:39 UTC 2015
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);
}
/*
More information about the svn-src-head
mailing list