git: 893d20c95ade - main - fd: move fd table sizing out of fdinit
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Sun, 13 Feb 2022 13:07:17 UTC
The branch main has been updated by mjg:
URL: https://cgit.FreeBSD.org/src/commit/?id=893d20c95ade6ae4b6a514bb003457ce8f2959fd
commit 893d20c95ade6ae4b6a514bb003457ce8f2959fd
Author: Mateusz Guzik <mjg@FreeBSD.org>
AuthorDate: 2022-01-29 22:07:06 +0000
Commit: Mateusz Guzik <mjg@FreeBSD.org>
CommitDate: 2022-02-13 13:07:08 +0000
fd: move fd table sizing out of fdinit
now it is placed with the rest of actual initialisation
---
sys/kern/init_main.c | 2 +-
sys/kern/kern_descrip.c | 36 +++++++++++-------------------------
sys/kern/kern_fork.c | 4 ++--
sys/sys/filedesc.h | 2 +-
4 files changed, 15 insertions(+), 29 deletions(-)
diff --git a/sys/kern/init_main.c b/sys/kern/init_main.c
index 5ab9eed6a114..2225c5ed95d5 100644
--- a/sys/kern/init_main.c
+++ b/sys/kern/init_main.c
@@ -568,7 +568,7 @@ proc0_init(void *dummy __unused)
/* Create the file descriptor table. */
p->p_pd = pdinit(NULL, false);
- p->p_fd = fdinit(NULL, false, NULL);
+ p->p_fd = fdinit();
p->p_fdtol = NULL;
/* Create the limits structures. */
diff --git a/sys/kern/kern_descrip.c b/sys/kern/kern_descrip.c
index bf4a3a3f20e5..1dc0f1e647d6 100644
--- a/sys/kern/kern_descrip.c
+++ b/sys/kern/kern_descrip.c
@@ -2150,16 +2150,11 @@ finstall(struct thread *td, struct file *fp, int *fd, int flags,
* If fdp is not NULL, return with it shared locked.
*/
struct filedesc *
-fdinit(struct filedesc *fdp, bool prepfiles, int *lastfile)
+fdinit(void)
{
struct filedesc0 *newfdp0;
struct filedesc *newfdp;
- if (prepfiles)
- MPASS(lastfile != NULL);
- else
- MPASS(lastfile == NULL);
-
newfdp0 = uma_zalloc(filedesc0_zone, M_WAITOK | M_ZERO);
newfdp = &newfdp0->fd_fd;
@@ -2171,24 +2166,6 @@ fdinit(struct filedesc *fdp, bool prepfiles, int *lastfile)
newfdp->fd_files = (struct fdescenttbl *)&newfdp0->fd_dfiles;
newfdp->fd_files->fdt_nfiles = NDFILE;
- if (fdp == NULL)
- return (newfdp);
-
- FILEDESC_SLOCK(fdp);
- if (!prepfiles) {
- FILEDESC_SUNLOCK(fdp);
- return (newfdp);
- }
-
- for (;;) {
- *lastfile = fdlastfile(fdp);
- if (*lastfile < newfdp->fd_nfiles)
- break;
- FILEDESC_SUNLOCK(fdp);
- fdgrowtable(newfdp, *lastfile + 1);
- FILEDESC_SLOCK(fdp);
- }
-
return (newfdp);
}
@@ -2368,7 +2345,16 @@ fdcopy(struct filedesc *fdp)
MPASS(fdp != NULL);
- newfdp = fdinit(fdp, true, &lastfile);
+ newfdp = fdinit();
+ FILEDESC_SLOCK(fdp);
+ for (;;) {
+ lastfile = fdlastfile(fdp);
+ if (lastfile < newfdp->fd_nfiles)
+ break;
+ FILEDESC_SUNLOCK(fdp);
+ fdgrowtable(newfdp, lastfile + 1);
+ FILEDESC_SLOCK(fdp);
+ }
/* copy all passable descriptors (i.e. not kqueue) */
newfdp->fd_freefile = -1;
for (i = 0; i <= lastfile; ++i) {
diff --git a/sys/kern/kern_fork.c b/sys/kern/kern_fork.c
index a6d83fc8049d..0062f7419ac0 100644
--- a/sys/kern/kern_fork.c
+++ b/sys/kern/kern_fork.c
@@ -340,7 +340,7 @@ fork_norfproc(struct thread *td, int flags)
struct filedesc *fdtmp;
struct pwddesc *pdtmp;
pdtmp = pdinit(td->td_proc->p_pd, false);
- fdtmp = fdinit(td->td_proc->p_fd, false, NULL);
+ fdtmp = fdinit();
pdescfree(td);
fdescfree(td);
p1->p_fd = fdtmp;
@@ -418,7 +418,7 @@ do_fork(struct thread *td, struct fork_req *fr, struct proc *p2, struct thread *
*/
if (fr->fr_flags & RFCFDG) {
pd = pdinit(p1->p_pd, false);
- fd = fdinit(p1->p_fd, false, NULL);
+ fd = fdinit();
fdtol = NULL;
} else if (fr->fr_flags & RFFDG) {
if (fr->fr_flags2 & FR2_SHARE_PATHS)
diff --git a/sys/sys/filedesc.h b/sys/sys/filedesc.h
index 7d106adb756f..0560a517c160 100644
--- a/sys/sys/filedesc.h
+++ b/sys/sys/filedesc.h
@@ -254,7 +254,7 @@ void fdunshare(struct thread *td);
void fdescfree(struct thread *td);
int fdlastfile(struct filedesc *fdp);
int fdlastfile_single(struct filedesc *fdp);
-struct filedesc *fdinit(struct filedesc *fdp, bool prepfiles, int *lastfile);
+struct filedesc *fdinit(void);
struct filedesc *fdshare(struct filedesc *fdp);
struct filedesc_to_leader *
filedesc_to_leader_alloc(struct filedesc_to_leader *old,