On Tue, 2 Dec 2014, Carlin Bingham wrote: > On -current, running apachebench with a large number of concurrent > requests is causing a protection fault. > > eg. the command: ab -n 1000 -c 1000 http://my.host/ > > Reproduced on two different machines. > CNR on 5.6-release. > > > kernel: protection fault trap, code=0 > Stopped at sys_socket+0x6a: orb $0x1,0(%rax) > ddb{1}> trace > sys_socket() at sys_socket+0x6a > syscall() at syscall+0x297 > --- syscall (number 97) --- > end of kernel > end trace frames: 0x182f8a7adde8, count: -2 > 0x182fbc0e1cba: > ddb{1}>
Gah, this is almost certainly my fault, trying to set the close-on-exec flag even when the fd allocation failed. Can you reproduce it with this diff applied? Philip Guenther Index: uipc_syscalls.c =================================================================== RCS file: /cvs/src/sys/kern/uipc_syscalls.c,v retrieving revision 1.93 diff -u -p -r1.93 uipc_syscalls.c --- uipc_syscalls.c 9 Sep 2014 02:07:17 -0000 1.93 +++ uipc_syscalls.c 1 Dec 2014 18:44:13 -0000 @@ -83,7 +83,7 @@ sys_socket(struct proc *p, void *v, regi fdplock(fdp); error = falloc(p, &fp, &fd); - if (type & SOCK_CLOEXEC) + if (error == 0 && (type & SOCK_CLOEXEC)) fdp->fd_ofileflags[fd] |= UF_EXCLOSE; fdpunlock(fdp); if (error != 0) @@ -240,7 +240,7 @@ redo: fdplock(fdp); error = falloc(p, &fp, &tmpfd); - if (flags & SOCK_CLOEXEC) + if (error == 0 && (flags & SOCK_CLOEXEC)) fdp->fd_ofileflags[tmpfd] |= UF_EXCLOSE; fdpunlock(fdp); if (error != 0) {