The next important step towards removing the KERNEL_LOCK() from the kernel is to be able to execute ioctl(2)s without it.
The first area that can benefit from this is obviously the Network Stack. tb@ and kn@ are working on this area so they'll soon need a way to test really test their diffs. But some pseudo-devices could also benefit from this. I'm thinking at vmm(4), bpf(4) and pf(4) in a first place... So here's a diff that remove some duplicate logic from the generics sys_ioctl() and sys_fcntl(). Once this is in we can start pushing the KERNEL_LOCK() down, inside every `fo_ioctl'. While here I'm also getting rid of M_IOCTLOPS, all other places where an allocation is needed for a syscall are using M_TEMP. So less is more. Ok? Index: kern/kern_descrip.c =================================================================== RCS file: /cvs/src/sys/kern/kern_descrip.c,v retrieving revision 1.175 diff -u -p -r1.175 kern_descrip.c --- kern/kern_descrip.c 2 Jul 2018 14:36:33 -0000 1.175 +++ kern/kern_descrip.c 3 Jul 2018 10:26:47 -0000 @@ -484,14 +484,6 @@ restart: break; case F_GETOWN: - if (fp->f_type == DTYPE_SOCKET) { - *retval = ((struct socket *)fp->f_data)->so_pgid; - break; - } - if (fp->f_type == DTYPE_PIPE) { - *retval = ((struct pipe *)fp->f_data)->pipe_pgid; - break; - } tmp = 0; error = (*fp->f_ops->fo_ioctl) (fp, TIOCGPGRP, (caddr_t)&tmp, p); @@ -499,20 +491,6 @@ restart: break; case F_SETOWN: - if (fp->f_type == DTYPE_SOCKET) { - struct socket *so = fp->f_data; - - so->so_pgid = (long)SCARG(uap, arg); - so->so_siguid = p->p_ucred->cr_ruid; - so->so_sigeuid = p->p_ucred->cr_uid; - break; - } - if (fp->f_type == DTYPE_PIPE) { - struct pipe *mpipe = fp->f_data; - - mpipe->pipe_pgid = (long)SCARG(uap, arg); - break; - } if ((long)SCARG(uap, arg) <= 0) { SCARG(uap, arg) = (void *)(-(long)SCARG(uap, arg)); } else { Index: kern/sys_generic.c =================================================================== RCS file: /cvs/src/sys/kern/sys_generic.c,v retrieving revision 1.119 diff -u -p -r1.119 sys_generic.c --- kern/sys_generic.c 8 May 2018 08:53:41 -0000 1.119 +++ kern/sys_generic.c 3 Jul 2018 10:20:38 -0000 @@ -389,7 +389,7 @@ sys_ioctl(struct proc *p, void *v, regis syscallarg(void *) data; } */ *uap = v; struct file *fp; - struct filedesc *fdp; + struct filedesc *fdp = p->p_fd; u_long com = SCARG(uap, com); int error = 0; u_int size; @@ -398,7 +398,6 @@ sys_ioctl(struct proc *p, void *v, regis #define STK_PARAMS 128 long long stkbuf[STK_PARAMS / sizeof(long long)]; - fdp = p->p_fd; if ((fp = fd_getfile_mode(fdp, SCARG(uap, fd), FREAD|FWRITE)) == NULL) return (EBADF); @@ -437,7 +436,7 @@ sys_ioctl(struct proc *p, void *v, regis goto out; } if (size > sizeof (stkbuf)) { - memp = malloc(size, M_IOCTLOPS, M_WAITOK); + memp = malloc(size, M_TEMP, M_WAITOK); data = memp; } else data = (caddr_t)stkbuf; @@ -478,15 +477,7 @@ sys_ioctl(struct proc *p, void *v, regis case FIOSETOWN: tmp = *(int *)data; - if (fp->f_type == DTYPE_SOCKET) { - struct socket *so = fp->f_data; - so->so_pgid = tmp; - so->so_siguid = p->p_ucred->cr_ruid; - so->so_sigeuid = p->p_ucred->cr_uid; - error = 0; - break; - } if (tmp <= 0) { tmp = -tmp; } else { @@ -502,11 +493,6 @@ sys_ioctl(struct proc *p, void *v, regis break; case FIOGETOWN: - if (fp->f_type == DTYPE_SOCKET) { - error = 0; - *(int *)data = ((struct socket *)fp->f_data)->so_pgid; - break; - } error = (*fp->f_ops->fo_ioctl)(fp, TIOCGPGRP, data, p); *(int *)data = -*(int *)data; break; @@ -523,7 +509,7 @@ sys_ioctl(struct proc *p, void *v, regis error = copyout(data, SCARG(uap, data), size); out: FRELE(fp, p); - free(memp, M_IOCTLOPS, size); + free(memp, M_TEMP, size); return (error); } Index: kern/sys_pipe.c =================================================================== RCS file: /cvs/src/sys/kern/sys_pipe.c,v retrieving revision 1.81 diff -u -p -r1.81 sys_pipe.c --- kern/sys_pipe.c 18 Jun 2018 09:15:05 -0000 1.81 +++ kern/sys_pipe.c 3 Jul 2018 10:26:34 -0000 @@ -665,6 +665,8 @@ pipe_ioctl(struct file *fp, u_long cmd, *(int *)data = mpipe->pipe_buffer.cnt; return (0); + case TIOCSPGRP: + /* FALLTHROUGH */ case SIOCSPGRP: mpipe->pipe_pgid = *(int *)data; return (0); @@ -672,6 +674,10 @@ pipe_ioctl(struct file *fp, u_long cmd, case SIOCGPGRP: *(int *)data = mpipe->pipe_pgid; return (0); + + case TIOCGPGRP: + *(int *)data = -mpipe->pipe_pgid; + break; } return (ENOTTY); Index: kern/sys_socket.c =================================================================== RCS file: /cvs/src/sys/kern/sys_socket.c,v retrieving revision 1.38 diff -u -p -r1.38 sys_socket.c --- kern/sys_socket.c 6 Jun 2018 06:55:22 -0000 1.38 +++ kern/sys_socket.c 3 Jul 2018 10:24:57 -0000 @@ -109,10 +109,16 @@ soo_ioctl(struct file *fp, u_long cmd, c *(int *)data = so->so_rcv.sb_datacc; break; + case TIOCSPGRP: + /* FALLTHROUGH */ case SIOCSPGRP: so->so_pgid = *(int *)data; so->so_siguid = p->p_ucred->cr_ruid; so->so_sigeuid = p->p_ucred->cr_uid; + break; + + case TIOCGPGRP: + *(int *)data = -so->so_pgid; break; case SIOCGPGRP: