When these two syscalls have been marked NOLOCK, falloc(), fdinsert() &
friends weren't ready to be executed without KERNEL_LOCK().  This is no
longer true.  kqueue(2), for example, do the same dances without this
lock.

ok?

Index: kern/uipc_syscalls.c
===================================================================
RCS file: /cvs/src/sys/kern/uipc_syscalls.c,v
retrieving revision 1.184
diff -u -p -r1.184 uipc_syscalls.c
--- kern/uipc_syscalls.c        15 Jan 2020 13:17:35 -0000      1.184
+++ kern/uipc_syscalls.c        27 May 2020 10:13:37 -0000
@@ -97,7 +97,6 @@ sys_socket(struct proc *p, void *v, regi
        if (error)
                return (error);
 
-       KERNEL_LOCK();
        fdplock(fdp);
        error = falloc(p, &fp, &fd);
        if (error) {
@@ -114,7 +113,6 @@ sys_socket(struct proc *p, void *v, regi
                FRELE(fp, p);
                *retval = fd;
        }
-       KERNEL_UNLOCK();
        return (error);
 }
 
@@ -450,7 +448,6 @@ sys_socketpair(struct proc *p, void *v, 
                if (error != 0)
                        goto free2;
        }
-       KERNEL_LOCK();
        fdplock(fdp);
        if ((error = falloc(p, &fp1, &sv[0])) != 0)
                goto free3;
@@ -475,7 +472,6 @@ sys_socketpair(struct proc *p, void *v, 
                fdpunlock(fdp);
                FRELE(fp1, p);
                FRELE(fp2, p);
-               KERNEL_UNLOCK();
                return (0);
        }
        fdremove(fdp, sv[1]);
@@ -487,7 +483,6 @@ free4:
        so1 = NULL;
 free3:
        fdpunlock(fdp);
-       KERNEL_UNLOCK();
 free2:
        if (so2 != NULL)
                (void)soclose(so2, 0);

Reply via email to