git: e68a5225e818 - main - fd: add fde_copy

From: Mateusz Guzik <mjg_at_FreeBSD.org>
Date: Tue, 15 Feb 2022 17:51:33 UTC
The branch main has been updated by mjg:

URL: https://cgit.FreeBSD.org/src/commit/?id=e68a5225e818380a0038bc9ab346fdb7913c0af9

commit e68a5225e818380a0038bc9ab346fdb7913c0af9
Author:     Mateusz Guzik <mjg@FreeBSD.org>
AuthorDate: 2022-02-14 15:43:19 +0000
Commit:     Mateusz Guzik <mjg@FreeBSD.org>
CommitDate: 2022-02-15 17:51:08 +0000

    fd: add fde_copy
    
    To dedup handrolled memcpy. This will be used later to make fd code
    atomic-clean.
---
 sys/kern/kern_descrip.c |  6 +++---
 sys/sys/filedesc.h      | 12 +++++++++++-
 2 files changed, 14 insertions(+), 4 deletions(-)

diff --git a/sys/kern/kern_descrip.c b/sys/kern/kern_descrip.c
index 57e0d9dee671..259be785f88d 100644
--- a/sys/kern/kern_descrip.c
+++ b/sys/kern/kern_descrip.c
@@ -1022,7 +1022,7 @@ kern_dup(struct thread *td, u_int mode, int flags, int old, int new)
 	seqc_write_begin(&newfde->fde_seqc);
 #endif
 	oioctls = filecaps_free_prep(&newfde->fde_caps);
-	memcpy(newfde, oldfde, fde_change_size);
+	fde_copy(oldfde, newfde);
 	filecaps_copy_finish(&oldfde->fde_caps, &newfde->fde_caps,
 	    nioctls);
 	if ((flags & FDDUP_FLAG_CLOEXEC) != 0)
@@ -3628,7 +3628,7 @@ dupfdopen(struct thread *td, struct filedesc *fdp, int dfd, int mode,
 #ifdef CAPABILITIES
 		seqc_write_begin(&newfde->fde_seqc);
 #endif
-		memcpy(newfde, oldfde, fde_change_size);
+		fde_copy(oldfde, newfde);
 		filecaps_copy_finish(&oldfde->fde_caps, &newfde->fde_caps,
 		    ioctls);
 #ifdef CAPABILITIES
@@ -3645,7 +3645,7 @@ dupfdopen(struct thread *td, struct filedesc *fdp, int dfd, int mode,
 		seqc_write_begin(&oldfde->fde_seqc);
 		seqc_write_begin(&newfde->fde_seqc);
 #endif
-		memcpy(newfde, oldfde, fde_change_size);
+		fde_copy(oldfde, newfde);
 		oldfde->fde_file = NULL;
 		fdunused(fdp, dfd);
 #ifdef CAPABILITIES
diff --git a/sys/sys/filedesc.h b/sys/sys/filedesc.h
index ed1f8989358e..24eb6eb2c061 100644
--- a/sys/sys/filedesc.h
+++ b/sys/sys/filedesc.h
@@ -66,7 +66,17 @@ struct filedescent {
 #define	fde_fcntls	fde_caps.fc_fcntls
 #define	fde_ioctls	fde_caps.fc_ioctls
 #define	fde_nioctls	fde_caps.fc_nioctls
-#define	fde_change_size	(offsetof(struct filedescent, fde_seqc))
+
+#ifdef _KERNEL
+static inline void
+fde_copy(struct filedescent *from, struct filedescent *to)
+{
+
+	to->fde_file = from->fde_file;
+	to->fde_caps = from->fde_caps;
+	to->fde_flags = from->fde_flags;
+}
+#endif
 
 struct fdescenttbl {
 	int	fdt_nfiles;		/* number of open files allocated */