tech-kern archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

sys_semop() retries redo the semop copyin() - why?



I am looking at PR 59352, trying to add compat_netbsd32 support for
semtimedop().

I noticed a very strange retry loop in do_semop() where it waits for
other processes and then redoes the whole copyin() of the semops passed
to the system call - which sounds bogus to me, but I might be missing
something.

Making the restart loop happen only after the initial copyin() will make
code sharing with the netbsd32 emulation a lot easier - so is the following
patch OK or is there some reason the userland records need to be copied in
again?

Martin
P.S.: this is a bit hard to read in a context diff - it just moves the
restart label down after the copyin().


Index: sysv_sem.c
===================================================================
RCS file: /cvsroot/src/sys/kern/sysv_sem.c,v
retrieving revision 1.101
diff -c -u -p -r1.101 sysv_sem.c
--- sysv_sem.c	6 Oct 2024 22:15:33 -0000	1.101
+++ sysv_sem.c	29 Apr 2025 16:29:57 -0000
@@ -828,7 +828,6 @@ do_semop(struct lwp *l, int usemid, stru
 		mutex_exit(p->p_lock);
 	}
 
-restart:
 	if (nsops <= SMALL_SOPS) {
 		sops = small_sops;
 	} else if (nsops <= seminfo.semopm) {
@@ -848,6 +847,7 @@ restart:
 		return error;
 	}
 
+restart:
 	mutex_enter(&semlock);
 	/* In case of reallocation, we will wait for completion */
 	while (__predict_false(sem_realloc_state))



Home | Main Index | Thread Index | Old Index